diff --git a/stream-servers/vulkan/VkDecoder.cpp b/stream-servers/vulkan/VkDecoder.cpp
index fc3de27..bb5b62c 100644
--- a/stream-servers/vulkan/VkDecoder.cpp
+++ b/stream-servers/vulkan/VkDecoder.cpp
@@ -14,74 +14,72 @@
 // limitations under the License.
 
 // Autogenerated module VkDecoder
-// (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
+// (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal
+// -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
 // VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
 // VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+//
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o
+// $CEREAL_OUTPUT_DIR
+//
 
 #include "VkDecoder.h"
 
-
-#include "common/goldfish_vk_marshaling.h"
-#include "common/goldfish_vk_reserved_marshaling.h"
-#include "common/goldfish_vk_private_defs.h"
-#include "common/goldfish_vk_transform.h"
-
-#include "base/BumpPool.h"
-#include "base/System.h"
-#include "base/Tracing.h"
-#include "stream-servers/IOStream.h"
-#include "host-common/feature_control.h"
-#include "host-common/GfxstreamFatalError.h"
-#include "host-common/logging.h"
+#include <unordered_map>
 
 #include "VkDecoderGlobalState.h"
 #include "VkDecoderSnapshot.h"
-
 #include "VulkanDispatch.h"
 #include "VulkanStream.h"
+#include "base/BumpPool.h"
+#include "base/System.h"
+#include "base/Tracing.h"
+#include "common/goldfish_vk_marshaling.h"
+#include "common/goldfish_vk_private_defs.h"
+#include "common/goldfish_vk_reserved_marshaling.h"
+#include "common/goldfish_vk_transform.h"
+#include "host-common/GfxstreamFatalError.h"
+#include "host-common/feature_control.h"
+#include "host-common/logging.h"
+#include "stream-servers/IOStream.h"
 
-#include <unordered_map>
-
-
-
-
-
-using emugl::vkDispatch;
 using emugl::GfxApiLogger;
+using emugl::vkDispatch;
 
 using namespace goldfish_vk;
 
 class VkDecoder::Impl {
-public:
-    Impl() : m_logCalls(android::base::getEnvironmentVariable("ANDROID_EMU_VK_LOG_CALLS") == "1"),
-             m_vk(vkDispatch()),
-             m_state(VkDecoderGlobalState::get()),
-             m_boxedHandleUnwrapMapping(m_state),
-             m_boxedHandleCreateMapping(m_state),
-             m_boxedHandleDestroyMapping(m_state),
-             m_boxedHandleUnwrapAndDeleteMapping(m_state),
-             m_boxedHandleUnwrapAndDeletePreserveBoxedMapping(m_state) { }
+   public:
+    Impl()
+        : m_logCalls(android::base::getEnvironmentVariable("ANDROID_EMU_VK_LOG_CALLS") == "1"),
+          m_vk(vkDispatch()),
+          m_state(VkDecoderGlobalState::get()),
+          m_boxedHandleUnwrapMapping(m_state),
+          m_boxedHandleCreateMapping(m_state),
+          m_boxedHandleDestroyMapping(m_state),
+          m_boxedHandleUnwrapAndDeleteMapping(m_state),
+          m_boxedHandleUnwrapAndDeletePreserveBoxedMapping(m_state) {}
     VulkanStream* stream() { return &m_vkStream; }
     VulkanMemReadingStream* readStream() { return &m_vkMemReadingStream; }
 
-    void setForSnapshotLoad(bool forSnapshotLoad) {
-        m_forSnapshotLoad = forSnapshotLoad;
-    }
+    void setForSnapshotLoad(bool forSnapshotLoad) { m_forSnapshotLoad = forSnapshotLoad; }
 
-    size_t decode(void* buf, size_t bufsize, IOStream* stream, uint32_t* seqnoPtr, GfxApiLogger& gfx_logger);
+    size_t decode(void* buf, size_t bufsize, IOStream* stream, uint32_t* seqnoPtr,
+                  GfxApiLogger& gfx_logger);
 
-private:
+   private:
     bool m_logCalls;
     bool m_forSnapshotLoad = false;
     VulkanDispatch* m_vk;
     VkDecoderGlobalState* m_state;
-    VulkanStream m_vkStream { nullptr };
-    VulkanMemReadingStream m_vkMemReadingStream { nullptr };
+    VulkanStream m_vkStream{nullptr};
+    VulkanMemReadingStream m_vkMemReadingStream{nullptr};
     BoxedHandleUnwrapMapping m_boxedHandleUnwrapMapping;
     BoxedHandleCreateMapping m_boxedHandleCreateMapping;
     BoxedHandleDestroyMapping m_boxedHandleDestroyMapping;
@@ -90,8 +88,7 @@
     BoxedHandleUnwrapAndDeletePreserveBoxedMapping m_boxedHandleUnwrapAndDeletePreserveBoxedMapping;
 };
 
-VkDecoder::VkDecoder() :
-    mImpl(new VkDecoder::Impl()) { }
+VkDecoder::VkDecoder() : mImpl(new VkDecoder::Impl()) {}
 
 VkDecoder::~VkDecoder() = default;
 
@@ -99,68 +96,75 @@
     mImpl->setForSnapshotLoad(forSnapshotLoad);
 }
 
-size_t VkDecoder::decode(void* buf, size_t bufsize, IOStream* stream, uint32_t* seqnoPtr, GfxApiLogger& gfx_logger) {
+size_t VkDecoder::decode(void* buf, size_t bufsize, IOStream* stream, uint32_t* seqnoPtr,
+                         GfxApiLogger& gfx_logger) {
     return mImpl->decode(buf, bufsize, stream, seqnoPtr, gfx_logger);
 }
 
 // VkDecoder::Impl::decode to follow
-size_t VkDecoder::Impl::decode(void* buf, size_t len, IOStream* ioStream, uint32_t* seqnoPtr, GfxApiLogger& gfx_logger)
-{
-    if (len < 8) return 0;;
-    bool queueSubmitWithCommandsEnabled = feature_is_enabled(kFeature_VulkanQueueSubmitWithCommands);
-    unsigned char *ptr = (unsigned char *)buf;
+size_t VkDecoder::Impl::decode(void* buf, size_t len, IOStream* ioStream, uint32_t* seqnoPtr,
+                               GfxApiLogger& gfx_logger) {
+    if (len < 8) return 0;
+    ;
+    bool queueSubmitWithCommandsEnabled =
+        feature_is_enabled(kFeature_VulkanQueueSubmitWithCommands);
+    unsigned char* ptr = (unsigned char*)buf;
     const unsigned char* const end = (const unsigned char*)buf + len;
-    if (m_forSnapshotLoad)
-    {
+    if (m_forSnapshotLoad) {
         ptr += m_state->setCreatedHandlesForSnapshotLoad(ptr);
     }
-    while (end - ptr >= 8)
-    {
-        uint32_t opcode = *(uint32_t *)ptr;
-        uint32_t packetLen = *(uint32_t *)(ptr + 4);
+    while (end - ptr >= 8) {
+        uint32_t opcode = *(uint32_t*)ptr;
+        uint32_t packetLen = *(uint32_t*)(ptr + 4);
         if (end - ptr < packetLen) return ptr - (unsigned char*)buf;
         gfx_logger.record(ptr, std::min(size_t(packetLen + 8), size_t(end - ptr)));
         stream()->setStream(ioStream);
         VulkanStream* vkStream = stream();
         VulkanMemReadingStream* vkReadStream = readStream();
         vkReadStream->setBuf((uint8_t*)(ptr + 8));
-        uint8_t* readStreamPtr = vkReadStream->getBuf(); uint8_t** readStreamPtrPtr = &readStreamPtr;
+        uint8_t* readStreamPtr = vkReadStream->getBuf();
+        uint8_t** readStreamPtrPtr = &readStreamPtr;
         uint8_t* snapshotTraceBegin = vkReadStream->beginTrace();
         vkReadStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
-        
-        if (queueSubmitWithCommandsEnabled && ((opcode >= OP_vkFirst && opcode < OP_vkLast) || (opcode >= OP_vkFirst_old && opcode < OP_vkLast_old))) {
-            uint32_t seqno; memcpy(&seqno, *readStreamPtrPtr, sizeof(uint32_t)); *readStreamPtrPtr += sizeof(uint32_t);
+
+        if (queueSubmitWithCommandsEnabled &&
+            ((opcode >= OP_vkFirst && opcode < OP_vkLast) ||
+             (opcode >= OP_vkFirst_old && opcode < OP_vkLast_old))) {
+            uint32_t seqno;
+            memcpy(&seqno, *readStreamPtrPtr, sizeof(uint32_t));
+            *readStreamPtrPtr += sizeof(uint32_t);
             if (seqnoPtr && !m_forSnapshotLoad) {
                 while ((seqno - __atomic_load_n(seqnoPtr, __ATOMIC_SEQ_CST) != 1)) {
-                #if (defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)))
-                _mm_pause();
-                #elif (defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)))
-                __asm__ __volatile__("pause;");
-                #endif
+#if (defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)))
+                    _mm_pause();
+#elif (defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)))
+                    __asm__ __volatile__("pause;");
+#endif
                 }
             }
         }
-        
+
         auto vk = m_vk;
-        switch (opcode)
-        {
+        switch (opcode) {
 #ifdef VK_VERSION_1_0
-            case OP_vkCreateInstance:
-            {
+            case OP_vkCreateInstance: {
                 android::base::beginTrace("vkCreateInstance decode");
                 const VkInstanceCreateInfo* pCreateInfo;
                 const VkAllocationCallbacks* pAllocator;
                 VkInstance* pInstance;
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkInstanceCreateInfo));
-                reservedunmarshal_VkInstanceCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkInstanceCreateInfo*)(pCreateInfo), readStreamPtrPtr);
+                reservedunmarshal_VkInstanceCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                       (VkInstanceCreateInfo*)(pCreateInfo),
+                                                       readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pInstance;
                 vkReadStream->unsetHandleMapping();
@@ -169,41 +173,47 @@
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
                 *(VkInstance*)pInstance = (VkInstance)(VkInstance)((VkInstance)(*&cgen_var_1));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkInstanceCreateInfo(m_state, (VkInstanceCreateInfo*)(pCreateInfo));
+                if (pCreateInfo) {
+                    transform_tohost_VkInstanceCreateInfo(m_state,
+                                                          (VkInstanceCreateInfo*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateInstance 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pInstance);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCreateInstance 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pInstance);
                 }
                 VkResult vkCreateInstance_VkResult_return = (VkResult)0;
-                vkCreateInstance_VkResult_return = m_state->on_vkCreateInstance(&m_pool, pCreateInfo, pAllocator, pInstance);
-                if ((vkCreateInstance_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateInstance_VkResult_return =
+                    m_state->on_vkCreateInstance(&m_pool, pCreateInfo, pAllocator, pInstance);
+                if ((vkCreateInstance_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_2;
-                static_assert(8 == sizeof(VkInstance), "handle map overwrite requires VkInstance to be 8 bytes long");
+                static_assert(8 == sizeof(VkInstance),
+                              "handle map overwrite requires VkInstance to be 8 bytes long");
                 vkStream->handleMapping()->mapHandles_VkInstance((VkInstance*)pInstance, 1);
                 vkStream->write((VkInstance*)pInstance, 8 * 1);
                 vkStream->write(&vkCreateInstance_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateInstance(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateInstance_VkResult_return, pCreateInfo, pAllocator, pInstance);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateInstance(snapshotTraceBegin, snapshotTraceBytes,
+                                                          &m_pool, vkCreateInstance_VkResult_return,
+                                                          pCreateInfo, pAllocator, pInstance);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroyInstance:
-            {
+            case OP_vkDestroyInstance: {
                 android::base::beginTrace("vkDestroyInstance decode");
                 VkInstance instance;
                 const VkAllocationCallbacks* pAllocator;
@@ -216,34 +226,36 @@
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroyInstance 0x%llx 0x%llx \n", ioStream, (unsigned long long)instance, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkDestroyInstance 0x%llx 0x%llx \n", ioStream,
+                            (unsigned long long)instance, (unsigned long long)pAllocator);
                 }
                 m_state->on_vkDestroyInstance(&m_pool, instance, pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroyInstance(snapshotTraceBegin, snapshotTraceBytes, &m_pool, instance, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroyInstance(snapshotTraceBegin, snapshotTraceBytes,
+                                                           &m_pool, instance, pAllocator);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkEnumeratePhysicalDevices:
-            {
+            case OP_vkEnumeratePhysicalDevices: {
                 android::base::beginTrace("vkEnumeratePhysicalDevices decode");
                 VkInstance instance;
                 uint32_t* pPhysicalDeviceCount;
@@ -259,8 +271,7 @@
                 memcpy((uint32_t**)&pPhysicalDeviceCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pPhysicalDeviceCount);
                 *readStreamPtrPtr += 8;
-                if (pPhysicalDeviceCount)
-                {
+                if (pPhysicalDeviceCount) {
                     vkReadStream->alloc((void**)&pPhysicalDeviceCount, sizeof(uint32_t));
                     memcpy((uint32_t*)pPhysicalDeviceCount, *readStreamPtrPtr, sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
@@ -271,67 +282,75 @@
                 memcpy((VkPhysicalDevice**)&pPhysicalDevices, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pPhysicalDevices);
                 *readStreamPtrPtr += 8;
-                if (pPhysicalDevices)
-                {
-                    vkReadStream->alloc((void**)&pPhysicalDevices, (*(pPhysicalDeviceCount)) * sizeof(VkPhysicalDevice));
-                    if ((*(pPhysicalDeviceCount)))
-                    {
+                if (pPhysicalDevices) {
+                    vkReadStream->alloc((void**)&pPhysicalDevices,
+                                        (*(pPhysicalDeviceCount)) * sizeof(VkPhysicalDevice));
+                    if ((*(pPhysicalDeviceCount))) {
                         uint8_t* cgen_var_2_0_ptr = (uint8_t*)(*readStreamPtrPtr);
                         *readStreamPtrPtr += 8 * (*(pPhysicalDeviceCount));
-                        if (pPhysicalDeviceCount)
-                        {
-                            for (uint32_t k = 0; k < (*(pPhysicalDeviceCount)); ++k)
-                            {
-                                uint64_t tmpval; memcpy(&tmpval, cgen_var_2_0_ptr + k * 8, sizeof(uint64_t));
-                                *(((VkPhysicalDevice*)pPhysicalDevices) + k) = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)tmpval);
+                        if (pPhysicalDeviceCount) {
+                            for (uint32_t k = 0; k < (*(pPhysicalDeviceCount)); ++k) {
+                                uint64_t tmpval;
+                                memcpy(&tmpval, cgen_var_2_0_ptr + k * 8, sizeof(uint64_t));
+                                *(((VkPhysicalDevice*)pPhysicalDevices) + k) =
+                                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)tmpval);
                             }
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkEnumeratePhysicalDevices 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)instance, (unsigned long long)pPhysicalDeviceCount, (unsigned long long)pPhysicalDevices);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkEnumeratePhysicalDevices 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)instance,
+                            (unsigned long long)pPhysicalDeviceCount,
+                            (unsigned long long)pPhysicalDevices);
                 }
                 VkResult vkEnumeratePhysicalDevices_VkResult_return = (VkResult)0;
-                vkEnumeratePhysicalDevices_VkResult_return = m_state->on_vkEnumeratePhysicalDevices(&m_pool, instance, pPhysicalDeviceCount, pPhysicalDevices);
-                if ((vkEnumeratePhysicalDevices_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkEnumeratePhysicalDevices_VkResult_return = m_state->on_vkEnumeratePhysicalDevices(
+                    &m_pool, instance, pPhysicalDeviceCount, pPhysicalDevices);
+                if ((vkEnumeratePhysicalDevices_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pPhysicalDeviceCount;
                 vkStream->putBe64(cgen_var_3);
-                if (pPhysicalDeviceCount)
-                {
+                if (pPhysicalDeviceCount) {
                     vkStream->write((uint32_t*)pPhysicalDeviceCount, sizeof(uint32_t));
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pPhysicalDevices;
                 vkStream->putBe64(cgen_var_4);
-                if (pPhysicalDevices)
-                {
-                    if ((*(pPhysicalDeviceCount)))
-                    {
+                if (pPhysicalDevices) {
+                    if ((*(pPhysicalDeviceCount))) {
                         uint64_t* cgen_var_4_0;
                         vkStream->alloc((void**)&cgen_var_4_0, (*(pPhysicalDeviceCount)) * 8);
-                        static_assert(8 == sizeof(VkPhysicalDevice), "handle map overwrite requires VkPhysicalDevice to be 8 bytes long");
-                        vkStream->handleMapping()->mapHandles_VkPhysicalDevice((VkPhysicalDevice*)pPhysicalDevices, (*(pPhysicalDeviceCount)));
-                        vkStream->write((VkPhysicalDevice*)pPhysicalDevices, 8 * (*(pPhysicalDeviceCount)));
+                        static_assert(
+                            8 == sizeof(VkPhysicalDevice),
+                            "handle map overwrite requires VkPhysicalDevice to be 8 bytes long");
+                        vkStream->handleMapping()->mapHandles_VkPhysicalDevice(
+                            (VkPhysicalDevice*)pPhysicalDevices, (*(pPhysicalDeviceCount)));
+                        vkStream->write((VkPhysicalDevice*)pPhysicalDevices,
+                                        8 * (*(pPhysicalDeviceCount)));
                     }
                 }
                 vkStream->write(&vkEnumeratePhysicalDevices_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkEnumeratePhysicalDevices(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkEnumeratePhysicalDevices_VkResult_return, instance, pPhysicalDeviceCount, pPhysicalDevices);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkEnumeratePhysicalDevices(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkEnumeratePhysicalDevices_VkResult_return, instance, pPhysicalDeviceCount,
+                        pPhysicalDevices);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceFeatures:
-            {
+            case OP_vkGetPhysicalDeviceFeatures: {
                 android::base::beginTrace("vkGetPhysicalDeviceFeatures decode");
                 VkPhysicalDevice physicalDevice;
                 VkPhysicalDeviceFeatures* pFeatures;
@@ -339,40 +358,46 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 // Begin manual dispatchable handle unboxing for pFeatures;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pFeatures, sizeof(VkPhysicalDeviceFeatures));
-                reservedunmarshal_VkPhysicalDeviceFeatures(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceFeatures*)(pFeatures), readStreamPtrPtr);
-                if (pFeatures)
-                {
-                    transform_tohost_VkPhysicalDeviceFeatures(m_state, (VkPhysicalDeviceFeatures*)(pFeatures));
+                reservedunmarshal_VkPhysicalDeviceFeatures(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                           (VkPhysicalDeviceFeatures*)(pFeatures),
+                                                           readStreamPtrPtr);
+                if (pFeatures) {
+                    transform_tohost_VkPhysicalDeviceFeatures(
+                        m_state, (VkPhysicalDeviceFeatures*)(pFeatures));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceFeatures 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pFeatures);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceFeatures 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)pFeatures);
                 }
                 m_state->on_vkGetPhysicalDeviceFeatures(&m_pool, physicalDevice, pFeatures);
                 vkStream->unsetHandleMapping();
-                if (pFeatures)
-                {
-                    transform_fromhost_VkPhysicalDeviceFeatures(m_state, (VkPhysicalDeviceFeatures*)(pFeatures));
+                if (pFeatures) {
+                    transform_fromhost_VkPhysicalDeviceFeatures(
+                        m_state, (VkPhysicalDeviceFeatures*)(pFeatures));
                 }
-                marshal_VkPhysicalDeviceFeatures(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceFeatures*)(pFeatures));
+                marshal_VkPhysicalDeviceFeatures(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                 (VkPhysicalDeviceFeatures*)(pFeatures));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceFeatures(snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice, pFeatures);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceFeatures(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice, pFeatures);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceFormatProperties:
-            {
+            case OP_vkGetPhysicalDeviceFormatProperties: {
                 android::base::beginTrace("vkGetPhysicalDeviceFormatProperties decode");
                 VkPhysicalDevice physicalDevice;
                 VkFormat format;
@@ -381,42 +406,52 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 memcpy((VkFormat*)&format, *readStreamPtrPtr, sizeof(VkFormat));
                 *readStreamPtrPtr += sizeof(VkFormat);
                 // Begin manual dispatchable handle unboxing for pFormatProperties;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pFormatProperties, sizeof(VkFormatProperties));
-                reservedunmarshal_VkFormatProperties(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkFormatProperties*)(pFormatProperties), readStreamPtrPtr);
-                if (pFormatProperties)
-                {
-                    transform_tohost_VkFormatProperties(m_state, (VkFormatProperties*)(pFormatProperties));
+                reservedunmarshal_VkFormatProperties(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                     (VkFormatProperties*)(pFormatProperties),
+                                                     readStreamPtrPtr);
+                if (pFormatProperties) {
+                    transform_tohost_VkFormatProperties(m_state,
+                                                        (VkFormatProperties*)(pFormatProperties));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceFormatProperties 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)format, (unsigned long long)pFormatProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceFormatProperties 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)format, (unsigned long long)pFormatProperties);
                 }
-                m_state->on_vkGetPhysicalDeviceFormatProperties(&m_pool, physicalDevice, format, pFormatProperties);
+                m_state->on_vkGetPhysicalDeviceFormatProperties(&m_pool, physicalDevice, format,
+                                                                pFormatProperties);
                 vkStream->unsetHandleMapping();
-                if (pFormatProperties)
-                {
-                    transform_fromhost_VkFormatProperties(m_state, (VkFormatProperties*)(pFormatProperties));
+                if (pFormatProperties) {
+                    transform_fromhost_VkFormatProperties(m_state,
+                                                          (VkFormatProperties*)(pFormatProperties));
                 }
-                marshal_VkFormatProperties(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkFormatProperties*)(pFormatProperties));
+                marshal_VkFormatProperties(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                           (VkFormatProperties*)(pFormatProperties));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceFormatProperties(snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice, format, pFormatProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceFormatProperties(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice, format,
+                        pFormatProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceImageFormatProperties:
-            {
+            case OP_vkGetPhysicalDeviceImageFormatProperties: {
                 android::base::beginTrace("vkGetPhysicalDeviceImageFormatProperties decode");
                 VkPhysicalDevice physicalDevice;
                 VkFormat format;
@@ -429,7 +464,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 memcpy((VkFormat*)&format, *readStreamPtrPtr, sizeof(VkFormat));
                 *readStreamPtrPtr += sizeof(VkFormat);
                 memcpy((VkImageType*)&type, *readStreamPtrPtr, sizeof(VkImageType));
@@ -442,40 +478,58 @@
                 *readStreamPtrPtr += sizeof(VkImageCreateFlags);
                 // Begin manual dispatchable handle unboxing for pImageFormatProperties;
                 vkReadStream->unsetHandleMapping();
-                vkReadStream->alloc((void**)&pImageFormatProperties, sizeof(VkImageFormatProperties));
-                reservedunmarshal_VkImageFormatProperties(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageFormatProperties*)(pImageFormatProperties), readStreamPtrPtr);
-                if (pImageFormatProperties)
-                {
-                    transform_tohost_VkImageFormatProperties(m_state, (VkImageFormatProperties*)(pImageFormatProperties));
+                vkReadStream->alloc((void**)&pImageFormatProperties,
+                                    sizeof(VkImageFormatProperties));
+                reservedunmarshal_VkImageFormatProperties(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkImageFormatProperties*)(pImageFormatProperties), readStreamPtrPtr);
+                if (pImageFormatProperties) {
+                    transform_tohost_VkImageFormatProperties(
+                        m_state, (VkImageFormatProperties*)(pImageFormatProperties));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceImageFormatProperties 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)format, (unsigned long long)type, (unsigned long long)tiling, (unsigned long long)usage, (unsigned long long)flags, (unsigned long long)pImageFormatProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceImageFormatProperties 0x%llx "
+                            "0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)format, (unsigned long long)type,
+                            (unsigned long long)tiling, (unsigned long long)usage,
+                            (unsigned long long)flags, (unsigned long long)pImageFormatProperties);
                 }
                 VkResult vkGetPhysicalDeviceImageFormatProperties_VkResult_return = (VkResult)0;
-                vkGetPhysicalDeviceImageFormatProperties_VkResult_return = m_state->on_vkGetPhysicalDeviceImageFormatProperties(&m_pool, physicalDevice, format, type, tiling, usage, flags, pImageFormatProperties);
-                if ((vkGetPhysicalDeviceImageFormatProperties_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetPhysicalDeviceImageFormatProperties_VkResult_return =
+                    m_state->on_vkGetPhysicalDeviceImageFormatProperties(
+                        &m_pool, physicalDevice, format, type, tiling, usage, flags,
+                        pImageFormatProperties);
+                if ((vkGetPhysicalDeviceImageFormatProperties_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                if (pImageFormatProperties)
-                {
-                    transform_fromhost_VkImageFormatProperties(m_state, (VkImageFormatProperties*)(pImageFormatProperties));
+                if (pImageFormatProperties) {
+                    transform_fromhost_VkImageFormatProperties(
+                        m_state, (VkImageFormatProperties*)(pImageFormatProperties));
                 }
-                marshal_VkImageFormatProperties(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageFormatProperties*)(pImageFormatProperties));
-                vkStream->write(&vkGetPhysicalDeviceImageFormatProperties_VkResult_return, sizeof(VkResult));
+                marshal_VkImageFormatProperties(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                (VkImageFormatProperties*)(pImageFormatProperties));
+                vkStream->write(&vkGetPhysicalDeviceImageFormatProperties_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceImageFormatProperties(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetPhysicalDeviceImageFormatProperties_VkResult_return, physicalDevice, format, type, tiling, usage, flags, pImageFormatProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceImageFormatProperties(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetPhysicalDeviceImageFormatProperties_VkResult_return, physicalDevice,
+                        format, type, tiling, usage, flags, pImageFormatProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceProperties:
-            {
+            case OP_vkGetPhysicalDeviceProperties: {
                 android::base::beginTrace("vkGetPhysicalDeviceProperties decode");
                 VkPhysicalDevice physicalDevice;
                 VkPhysicalDeviceProperties* pProperties;
@@ -483,40 +537,48 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 // Begin manual dispatchable handle unboxing for pProperties;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pProperties, sizeof(VkPhysicalDeviceProperties));
-                reservedunmarshal_VkPhysicalDeviceProperties(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceProperties*)(pProperties), readStreamPtrPtr);
-                if (pProperties)
-                {
-                    transform_tohost_VkPhysicalDeviceProperties(m_state, (VkPhysicalDeviceProperties*)(pProperties));
+                reservedunmarshal_VkPhysicalDeviceProperties(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPhysicalDeviceProperties*)(pProperties), readStreamPtrPtr);
+                if (pProperties) {
+                    transform_tohost_VkPhysicalDeviceProperties(
+                        m_state, (VkPhysicalDeviceProperties*)(pProperties));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceProperties 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceProperties 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)pProperties);
                 }
                 m_state->on_vkGetPhysicalDeviceProperties(&m_pool, physicalDevice, pProperties);
                 vkStream->unsetHandleMapping();
-                if (pProperties)
-                {
-                    transform_fromhost_VkPhysicalDeviceProperties(m_state, (VkPhysicalDeviceProperties*)(pProperties));
+                if (pProperties) {
+                    transform_fromhost_VkPhysicalDeviceProperties(
+                        m_state, (VkPhysicalDeviceProperties*)(pProperties));
                 }
-                marshal_VkPhysicalDeviceProperties(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceProperties*)(pProperties));
+                marshal_VkPhysicalDeviceProperties(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                   (VkPhysicalDeviceProperties*)(pProperties));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceProperties(snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice, pProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceProperties(snapshotTraceBegin,
+                                                                       snapshotTraceBytes, &m_pool,
+                                                                       physicalDevice, pProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceQueueFamilyProperties:
-            {
+            case OP_vkGetPhysicalDeviceQueueFamilyProperties: {
                 android::base::beginTrace("vkGetPhysicalDeviceQueueFamilyProperties decode");
                 VkPhysicalDevice physicalDevice;
                 uint32_t* pQueueFamilyPropertyCount;
@@ -525,7 +587,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
@@ -535,10 +598,10 @@
                 memcpy((uint32_t**)&pQueueFamilyPropertyCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pQueueFamilyPropertyCount);
                 *readStreamPtrPtr += 8;
-                if (pQueueFamilyPropertyCount)
-                {
+                if (pQueueFamilyPropertyCount) {
                     vkReadStream->alloc((void**)&pQueueFamilyPropertyCount, sizeof(uint32_t));
-                    memcpy((uint32_t*)pQueueFamilyPropertyCount, *readStreamPtrPtr, sizeof(uint32_t));
+                    memcpy((uint32_t*)pQueueFamilyPropertyCount, *readStreamPtrPtr,
+                           sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
                 }
                 // Begin manual dispatchable handle unboxing for pQueueFamilyProperties;
@@ -547,74 +610,78 @@
                 memcpy((VkQueueFamilyProperties**)&pQueueFamilyProperties, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pQueueFamilyProperties);
                 *readStreamPtrPtr += 8;
-                if (pQueueFamilyProperties)
-                {
-                    vkReadStream->alloc((void**)&pQueueFamilyProperties, (*(pQueueFamilyPropertyCount)) * sizeof(VkQueueFamilyProperties));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i)
-                    {
-                        reservedunmarshal_VkQueueFamilyProperties(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkQueueFamilyProperties*)(pQueueFamilyProperties + i), readStreamPtrPtr);
+                if (pQueueFamilyProperties) {
+                    vkReadStream->alloc(
+                        (void**)&pQueueFamilyProperties,
+                        (*(pQueueFamilyPropertyCount)) * sizeof(VkQueueFamilyProperties));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i) {
+                        reservedunmarshal_VkQueueFamilyProperties(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkQueueFamilyProperties*)(pQueueFamilyProperties + i),
+                            readStreamPtrPtr);
                     }
                 }
-                if (pQueueFamilyPropertyCount)
-                {
-                    if (pQueueFamilyProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i)
-                        {
-                            transform_tohost_VkQueueFamilyProperties(m_state, (VkQueueFamilyProperties*)(pQueueFamilyProperties + i));
+                if (pQueueFamilyPropertyCount) {
+                    if (pQueueFamilyProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i) {
+                            transform_tohost_VkQueueFamilyProperties(
+                                m_state, (VkQueueFamilyProperties*)(pQueueFamilyProperties + i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceQueueFamilyProperties 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pQueueFamilyPropertyCount, (unsigned long long)pQueueFamilyProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceQueueFamilyProperties 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)pQueueFamilyPropertyCount,
+                            (unsigned long long)pQueueFamilyProperties);
                 }
-                vk->vkGetPhysicalDeviceQueueFamilyProperties(unboxed_physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
+                vk->vkGetPhysicalDeviceQueueFamilyProperties(
+                    unboxed_physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pQueueFamilyPropertyCount;
                 vkStream->putBe64(cgen_var_3);
-                if (pQueueFamilyPropertyCount)
-                {
+                if (pQueueFamilyPropertyCount) {
                     vkStream->write((uint32_t*)pQueueFamilyPropertyCount, sizeof(uint32_t));
                 }
-                if (pQueueFamilyPropertyCount)
-                {
-                    if (pQueueFamilyProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i)
-                        {
-                            transform_fromhost_VkQueueFamilyProperties(m_state, (VkQueueFamilyProperties*)(pQueueFamilyProperties + i));
+                if (pQueueFamilyPropertyCount) {
+                    if (pQueueFamilyProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i) {
+                            transform_fromhost_VkQueueFamilyProperties(
+                                m_state, (VkQueueFamilyProperties*)(pQueueFamilyProperties + i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pQueueFamilyProperties;
                 vkStream->putBe64(cgen_var_4);
-                if (pQueueFamilyProperties)
-                {
-                    if (pQueueFamilyPropertyCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i)
-                        {
-                            marshal_VkQueueFamilyProperties(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkQueueFamilyProperties*)(pQueueFamilyProperties + i));
+                if (pQueueFamilyProperties) {
+                    if (pQueueFamilyPropertyCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i) {
+                            marshal_VkQueueFamilyProperties(
+                                vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                (VkQueueFamilyProperties*)(pQueueFamilyProperties + i));
                         }
                     }
                 }
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceQueueFamilyProperties(snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceQueueFamilyProperties(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice,
+                        pQueueFamilyPropertyCount, pQueueFamilyProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceMemoryProperties:
-            {
+            case OP_vkGetPhysicalDeviceMemoryProperties: {
                 android::base::beginTrace("vkGetPhysicalDeviceMemoryProperties decode");
                 VkPhysicalDevice physicalDevice;
                 VkPhysicalDeviceMemoryProperties* pMemoryProperties;
@@ -622,40 +689,51 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 // Begin manual dispatchable handle unboxing for pMemoryProperties;
                 vkReadStream->unsetHandleMapping();
-                vkReadStream->alloc((void**)&pMemoryProperties, sizeof(VkPhysicalDeviceMemoryProperties));
-                reservedunmarshal_VkPhysicalDeviceMemoryProperties(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceMemoryProperties*)(pMemoryProperties), readStreamPtrPtr);
-                if (pMemoryProperties)
-                {
-                    transform_tohost_VkPhysicalDeviceMemoryProperties(m_state, (VkPhysicalDeviceMemoryProperties*)(pMemoryProperties));
+                vkReadStream->alloc((void**)&pMemoryProperties,
+                                    sizeof(VkPhysicalDeviceMemoryProperties));
+                reservedunmarshal_VkPhysicalDeviceMemoryProperties(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPhysicalDeviceMemoryProperties*)(pMemoryProperties), readStreamPtrPtr);
+                if (pMemoryProperties) {
+                    transform_tohost_VkPhysicalDeviceMemoryProperties(
+                        m_state, (VkPhysicalDeviceMemoryProperties*)(pMemoryProperties));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceMemoryProperties 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pMemoryProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceMemoryProperties 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)pMemoryProperties);
                 }
-                m_state->on_vkGetPhysicalDeviceMemoryProperties(&m_pool, physicalDevice, pMemoryProperties);
+                m_state->on_vkGetPhysicalDeviceMemoryProperties(&m_pool, physicalDevice,
+                                                                pMemoryProperties);
                 vkStream->unsetHandleMapping();
-                if (pMemoryProperties)
-                {
-                    transform_fromhost_VkPhysicalDeviceMemoryProperties(m_state, (VkPhysicalDeviceMemoryProperties*)(pMemoryProperties));
+                if (pMemoryProperties) {
+                    transform_fromhost_VkPhysicalDeviceMemoryProperties(
+                        m_state, (VkPhysicalDeviceMemoryProperties*)(pMemoryProperties));
                 }
-                marshal_VkPhysicalDeviceMemoryProperties(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceMemoryProperties*)(pMemoryProperties));
+                marshal_VkPhysicalDeviceMemoryProperties(
+                    vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPhysicalDeviceMemoryProperties*)(pMemoryProperties));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceMemoryProperties(snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice, pMemoryProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceMemoryProperties(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice,
+                        pMemoryProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetInstanceProcAddr:
-            {
+            case OP_vkGetInstanceProcAddr: {
                 android::base::beginTrace("vkGetInstanceProcAddr decode");
                 VkInstance instance;
                 const char* pName;
@@ -668,28 +746,33 @@
                 auto vk = dispatch_VkInstance(instance);
                 // End manual dispatchable handle unboxing for instance;
                 vkReadStream->loadStringInPlaceWithStreamPtr((char**)&pName, readStreamPtrPtr);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetInstanceProcAddr 0x%llx 0x%llx \n", ioStream, (unsigned long long)instance, (unsigned long long)pName);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkGetInstanceProcAddr 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)instance, (unsigned long long)pName);
                 }
-                PFN_vkVoidFunction vkGetInstanceProcAddr_PFN_vkVoidFunction_return = (PFN_vkVoidFunction)0;
-                vkGetInstanceProcAddr_PFN_vkVoidFunction_return = vk->vkGetInstanceProcAddr(unboxed_instance, pName);
+                PFN_vkVoidFunction vkGetInstanceProcAddr_PFN_vkVoidFunction_return =
+                    (PFN_vkVoidFunction)0;
+                vkGetInstanceProcAddr_PFN_vkVoidFunction_return =
+                    vk->vkGetInstanceProcAddr(unboxed_instance, pName);
                 vkStream->unsetHandleMapping();
-                vkStream->write(&vkGetInstanceProcAddr_PFN_vkVoidFunction_return, sizeof(PFN_vkVoidFunction));
+                vkStream->write(&vkGetInstanceProcAddr_PFN_vkVoidFunction_return,
+                                sizeof(PFN_vkVoidFunction));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetInstanceProcAddr(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetInstanceProcAddr_PFN_vkVoidFunction_return, instance, pName);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetInstanceProcAddr(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetInstanceProcAddr_PFN_vkVoidFunction_return, instance, pName);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetDeviceProcAddr:
-            {
+            case OP_vkGetDeviceProcAddr: {
                 android::base::beginTrace("vkGetDeviceProcAddr decode");
                 VkDevice device;
                 const char* pName;
@@ -702,28 +785,33 @@
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
                 vkReadStream->loadStringInPlaceWithStreamPtr((char**)&pName, readStreamPtrPtr);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetDeviceProcAddr 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pName);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkGetDeviceProcAddr 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pName);
                 }
-                PFN_vkVoidFunction vkGetDeviceProcAddr_PFN_vkVoidFunction_return = (PFN_vkVoidFunction)0;
-                vkGetDeviceProcAddr_PFN_vkVoidFunction_return = vk->vkGetDeviceProcAddr(unboxed_device, pName);
+                PFN_vkVoidFunction vkGetDeviceProcAddr_PFN_vkVoidFunction_return =
+                    (PFN_vkVoidFunction)0;
+                vkGetDeviceProcAddr_PFN_vkVoidFunction_return =
+                    vk->vkGetDeviceProcAddr(unboxed_device, pName);
                 vkStream->unsetHandleMapping();
-                vkStream->write(&vkGetDeviceProcAddr_PFN_vkVoidFunction_return, sizeof(PFN_vkVoidFunction));
+                vkStream->write(&vkGetDeviceProcAddr_PFN_vkVoidFunction_return,
+                                sizeof(PFN_vkVoidFunction));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetDeviceProcAddr(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetDeviceProcAddr_PFN_vkVoidFunction_return, device, pName);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetDeviceProcAddr(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetDeviceProcAddr_PFN_vkVoidFunction_return, device, pName);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCreateDevice:
-            {
+            case OP_vkCreateDevice: {
                 android::base::beginTrace("vkCreateDevice decode");
                 VkPhysicalDevice physicalDevice;
                 const VkDeviceCreateInfo* pCreateInfo;
@@ -733,17 +821,21 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkDeviceCreateInfo));
-                reservedunmarshal_VkDeviceCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDeviceCreateInfo*)(pCreateInfo), readStreamPtrPtr);
+                reservedunmarshal_VkDeviceCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                     (VkDeviceCreateInfo*)(pCreateInfo),
+                                                     readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pDevice;
                 vkReadStream->unsetHandleMapping();
@@ -752,41 +844,49 @@
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
                 *(VkDevice*)pDevice = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkDeviceCreateInfo(m_state, (VkDeviceCreateInfo*)(pCreateInfo));
+                if (pCreateInfo) {
+                    transform_tohost_VkDeviceCreateInfo(m_state,
+                                                        (VkDeviceCreateInfo*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateDevice 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pDevice);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCreateDevice 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)pCreateInfo, (unsigned long long)pAllocator,
+                            (unsigned long long)pDevice);
                 }
                 VkResult vkCreateDevice_VkResult_return = (VkResult)0;
-                vkCreateDevice_VkResult_return = m_state->on_vkCreateDevice(&m_pool, physicalDevice, pCreateInfo, pAllocator, pDevice);
-                if ((vkCreateDevice_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateDevice_VkResult_return = m_state->on_vkCreateDevice(
+                    &m_pool, physicalDevice, pCreateInfo, pAllocator, pDevice);
+                if ((vkCreateDevice_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3;
-                static_assert(8 == sizeof(VkDevice), "handle map overwrite requires VkDevice to be 8 bytes long");
+                static_assert(8 == sizeof(VkDevice),
+                              "handle map overwrite requires VkDevice to be 8 bytes long");
                 vkStream->handleMapping()->mapHandles_VkDevice((VkDevice*)pDevice, 1);
                 vkStream->write((VkDevice*)pDevice, 8 * 1);
                 vkStream->write(&vkCreateDevice_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateDevice(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateDevice_VkResult_return, physicalDevice, pCreateInfo, pAllocator, pDevice);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateDevice(snapshotTraceBegin, snapshotTraceBytes,
+                                                        &m_pool, vkCreateDevice_VkResult_return,
+                                                        physicalDevice, pCreateInfo, pAllocator,
+                                                        pDevice);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroyDevice:
-            {
+            case OP_vkDestroyDevice: {
                 android::base::beginTrace("vkDestroyDevice decode");
                 VkDevice device;
                 const VkAllocationCallbacks* pAllocator;
@@ -799,52 +899,53 @@
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroyDevice 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkDestroyDevice 0x%llx 0x%llx \n", ioStream,
+                            (unsigned long long)device, (unsigned long long)pAllocator);
                 }
                 m_state->on_vkDestroyDevice(&m_pool, device, pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroyDevice(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroyDevice(snapshotTraceBegin, snapshotTraceBytes,
+                                                         &m_pool, device, pAllocator);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkEnumerateInstanceExtensionProperties:
-            {
+            case OP_vkEnumerateInstanceExtensionProperties: {
                 android::base::beginTrace("vkEnumerateInstanceExtensionProperties decode");
                 const char* pLayerName;
                 uint32_t* pPropertyCount;
                 VkExtensionProperties* pProperties;
-                if (vkReadStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
-                {
+                if (vkReadStream->getFeatureBits() &
+                    VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT) {
                     // WARNING PTR CHECK
                     memcpy((char**)&pLayerName, (*readStreamPtrPtr), 8);
                     android::base::Stream::fromBe64((uint8_t*)&pLayerName);
                     *readStreamPtrPtr += 8;
-                    if (pLayerName)
-                    {
-                        vkReadStream->loadStringInPlaceWithStreamPtr((char**)&pLayerName, readStreamPtrPtr);
+                    if (pLayerName) {
+                        vkReadStream->loadStringInPlaceWithStreamPtr((char**)&pLayerName,
+                                                                     readStreamPtrPtr);
                     }
-                }
-                else
-                {
-                    vkReadStream->loadStringInPlaceWithStreamPtr((char**)&pLayerName, readStreamPtrPtr);
+                } else {
+                    vkReadStream->loadStringInPlaceWithStreamPtr((char**)&pLayerName,
+                                                                 readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pPropertyCount;
                 vkReadStream->unsetHandleMapping();
@@ -852,8 +953,7 @@
                 memcpy((uint32_t**)&pPropertyCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pPropertyCount);
                 *readStreamPtrPtr += 8;
-                if (pPropertyCount)
-                {
+                if (pPropertyCount) {
                     vkReadStream->alloc((void**)&pPropertyCount, sizeof(uint32_t));
                     memcpy((uint32_t*)pPropertyCount, *readStreamPtrPtr, sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
@@ -864,77 +964,83 @@
                 memcpy((VkExtensionProperties**)&pProperties, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pProperties);
                 *readStreamPtrPtr += 8;
-                if (pProperties)
-                {
-                    vkReadStream->alloc((void**)&pProperties, (*(pPropertyCount)) * sizeof(VkExtensionProperties));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                    {
-                        reservedunmarshal_VkExtensionProperties(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExtensionProperties*)(pProperties + i), readStreamPtrPtr);
+                if (pProperties) {
+                    vkReadStream->alloc((void**)&pProperties,
+                                        (*(pPropertyCount)) * sizeof(VkExtensionProperties));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                        reservedunmarshal_VkExtensionProperties(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkExtensionProperties*)(pProperties + i), readStreamPtrPtr);
                     }
                 }
-                if (pPropertyCount)
-                {
-                    if (pProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            transform_tohost_VkExtensionProperties(m_state, (VkExtensionProperties*)(pProperties + i));
+                if (pPropertyCount) {
+                    if (pProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            transform_tohost_VkExtensionProperties(
+                                m_state, (VkExtensionProperties*)(pProperties + i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkEnumerateInstanceExtensionProperties 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)pLayerName, (unsigned long long)pPropertyCount, (unsigned long long)pProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkEnumerateInstanceExtensionProperties 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)pLayerName,
+                            (unsigned long long)pPropertyCount, (unsigned long long)pProperties);
                 }
                 VkResult vkEnumerateInstanceExtensionProperties_VkResult_return = (VkResult)0;
-                vkEnumerateInstanceExtensionProperties_VkResult_return = vk->vkEnumerateInstanceExtensionProperties(pLayerName, pPropertyCount, pProperties);
-                if ((vkEnumerateInstanceExtensionProperties_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkEnumerateInstanceExtensionProperties_VkResult_return =
+                    vk->vkEnumerateInstanceExtensionProperties(pLayerName, pPropertyCount,
+                                                               pProperties);
+                if ((vkEnumerateInstanceExtensionProperties_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_2 = (uint64_t)(uintptr_t)pPropertyCount;
                 vkStream->putBe64(cgen_var_2);
-                if (pPropertyCount)
-                {
+                if (pPropertyCount) {
                     vkStream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
                 }
-                if (pPropertyCount)
-                {
-                    if (pProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            transform_fromhost_VkExtensionProperties(m_state, (VkExtensionProperties*)(pProperties + i));
+                if (pPropertyCount) {
+                    if (pProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            transform_fromhost_VkExtensionProperties(
+                                m_state, (VkExtensionProperties*)(pProperties + i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pProperties;
                 vkStream->putBe64(cgen_var_3);
-                if (pProperties)
-                {
-                    if (pPropertyCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            marshal_VkExtensionProperties(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExtensionProperties*)(pProperties + i));
+                if (pProperties) {
+                    if (pPropertyCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            marshal_VkExtensionProperties(
+                                vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                (VkExtensionProperties*)(pProperties + i));
                         }
                     }
                 }
-                vkStream->write(&vkEnumerateInstanceExtensionProperties_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkEnumerateInstanceExtensionProperties_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkEnumerateInstanceExtensionProperties(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkEnumerateInstanceExtensionProperties_VkResult_return, pLayerName, pPropertyCount, pProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkEnumerateInstanceExtensionProperties(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkEnumerateInstanceExtensionProperties_VkResult_return, pLayerName,
+                        pPropertyCount, pProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkEnumerateDeviceExtensionProperties:
-            {
+            case OP_vkEnumerateDeviceExtensionProperties: {
                 android::base::beginTrace("vkEnumerateDeviceExtensionProperties decode");
                 VkPhysicalDevice physicalDevice;
                 const char* pLayerName;
@@ -944,21 +1050,21 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
-                if (vkReadStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
-                {
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                if (vkReadStream->getFeatureBits() &
+                    VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT) {
                     // WARNING PTR CHECK
                     memcpy((char**)&pLayerName, (*readStreamPtrPtr), 8);
                     android::base::Stream::fromBe64((uint8_t*)&pLayerName);
                     *readStreamPtrPtr += 8;
-                    if (pLayerName)
-                    {
-                        vkReadStream->loadStringInPlaceWithStreamPtr((char**)&pLayerName, readStreamPtrPtr);
+                    if (pLayerName) {
+                        vkReadStream->loadStringInPlaceWithStreamPtr((char**)&pLayerName,
+                                                                     readStreamPtrPtr);
                     }
-                }
-                else
-                {
-                    vkReadStream->loadStringInPlaceWithStreamPtr((char**)&pLayerName, readStreamPtrPtr);
+                } else {
+                    vkReadStream->loadStringInPlaceWithStreamPtr((char**)&pLayerName,
+                                                                 readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pPropertyCount;
                 vkReadStream->unsetHandleMapping();
@@ -966,8 +1072,7 @@
                 memcpy((uint32_t**)&pPropertyCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pPropertyCount);
                 *readStreamPtrPtr += 8;
-                if (pPropertyCount)
-                {
+                if (pPropertyCount) {
                     vkReadStream->alloc((void**)&pPropertyCount, sizeof(uint32_t));
                     memcpy((uint32_t*)pPropertyCount, *readStreamPtrPtr, sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
@@ -978,77 +1083,83 @@
                 memcpy((VkExtensionProperties**)&pProperties, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pProperties);
                 *readStreamPtrPtr += 8;
-                if (pProperties)
-                {
-                    vkReadStream->alloc((void**)&pProperties, (*(pPropertyCount)) * sizeof(VkExtensionProperties));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                    {
-                        reservedunmarshal_VkExtensionProperties(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExtensionProperties*)(pProperties + i), readStreamPtrPtr);
+                if (pProperties) {
+                    vkReadStream->alloc((void**)&pProperties,
+                                        (*(pPropertyCount)) * sizeof(VkExtensionProperties));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                        reservedunmarshal_VkExtensionProperties(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkExtensionProperties*)(pProperties + i), readStreamPtrPtr);
                     }
                 }
-                if (pPropertyCount)
-                {
-                    if (pProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            transform_tohost_VkExtensionProperties(m_state, (VkExtensionProperties*)(pProperties + i));
+                if (pPropertyCount) {
+                    if (pProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            transform_tohost_VkExtensionProperties(
+                                m_state, (VkExtensionProperties*)(pProperties + i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkEnumerateDeviceExtensionProperties 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pLayerName, (unsigned long long)pPropertyCount, (unsigned long long)pProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkEnumerateDeviceExtensionProperties 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)pLayerName, (unsigned long long)pPropertyCount,
+                            (unsigned long long)pProperties);
                 }
                 VkResult vkEnumerateDeviceExtensionProperties_VkResult_return = (VkResult)0;
-                vkEnumerateDeviceExtensionProperties_VkResult_return = m_state->on_vkEnumerateDeviceExtensionProperties(&m_pool, physicalDevice, pLayerName, pPropertyCount, pProperties);
-                if ((vkEnumerateDeviceExtensionProperties_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkEnumerateDeviceExtensionProperties_VkResult_return =
+                    m_state->on_vkEnumerateDeviceExtensionProperties(
+                        &m_pool, physicalDevice, pLayerName, pPropertyCount, pProperties);
+                if ((vkEnumerateDeviceExtensionProperties_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pPropertyCount;
                 vkStream->putBe64(cgen_var_3);
-                if (pPropertyCount)
-                {
+                if (pPropertyCount) {
                     vkStream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
                 }
-                if (pPropertyCount)
-                {
-                    if (pProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            transform_fromhost_VkExtensionProperties(m_state, (VkExtensionProperties*)(pProperties + i));
+                if (pPropertyCount) {
+                    if (pProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            transform_fromhost_VkExtensionProperties(
+                                m_state, (VkExtensionProperties*)(pProperties + i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pProperties;
                 vkStream->putBe64(cgen_var_4);
-                if (pProperties)
-                {
-                    if (pPropertyCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            marshal_VkExtensionProperties(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExtensionProperties*)(pProperties + i));
+                if (pProperties) {
+                    if (pPropertyCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            marshal_VkExtensionProperties(
+                                vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                (VkExtensionProperties*)(pProperties + i));
                         }
                     }
                 }
-                vkStream->write(&vkEnumerateDeviceExtensionProperties_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkEnumerateDeviceExtensionProperties_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkEnumerateDeviceExtensionProperties(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkEnumerateDeviceExtensionProperties_VkResult_return, physicalDevice, pLayerName, pPropertyCount, pProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkEnumerateDeviceExtensionProperties(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkEnumerateDeviceExtensionProperties_VkResult_return, physicalDevice,
+                        pLayerName, pPropertyCount, pProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkEnumerateInstanceLayerProperties:
-            {
+            case OP_vkEnumerateInstanceLayerProperties: {
                 android::base::beginTrace("vkEnumerateInstanceLayerProperties decode");
                 uint32_t* pPropertyCount;
                 VkLayerProperties* pProperties;
@@ -1058,8 +1169,7 @@
                 memcpy((uint32_t**)&pPropertyCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pPropertyCount);
                 *readStreamPtrPtr += 8;
-                if (pPropertyCount)
-                {
+                if (pPropertyCount) {
                     vkReadStream->alloc((void**)&pPropertyCount, sizeof(uint32_t));
                     memcpy((uint32_t*)pPropertyCount, *readStreamPtrPtr, sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
@@ -1070,77 +1180,79 @@
                 memcpy((VkLayerProperties**)&pProperties, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pProperties);
                 *readStreamPtrPtr += 8;
-                if (pProperties)
-                {
-                    vkReadStream->alloc((void**)&pProperties, (*(pPropertyCount)) * sizeof(VkLayerProperties));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                    {
-                        reservedunmarshal_VkLayerProperties(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkLayerProperties*)(pProperties + i), readStreamPtrPtr);
+                if (pProperties) {
+                    vkReadStream->alloc((void**)&pProperties,
+                                        (*(pPropertyCount)) * sizeof(VkLayerProperties));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                        reservedunmarshal_VkLayerProperties(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkLayerProperties*)(pProperties + i), readStreamPtrPtr);
                     }
                 }
-                if (pPropertyCount)
-                {
-                    if (pProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            transform_tohost_VkLayerProperties(m_state, (VkLayerProperties*)(pProperties + i));
+                if (pPropertyCount) {
+                    if (pProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            transform_tohost_VkLayerProperties(
+                                m_state, (VkLayerProperties*)(pProperties + i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkEnumerateInstanceLayerProperties 0x%llx 0x%llx \n", ioStream, (unsigned long long)pPropertyCount, (unsigned long long)pProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkEnumerateInstanceLayerProperties 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)pPropertyCount,
+                            (unsigned long long)pProperties);
                 }
                 VkResult vkEnumerateInstanceLayerProperties_VkResult_return = (VkResult)0;
-                vkEnumerateInstanceLayerProperties_VkResult_return = vk->vkEnumerateInstanceLayerProperties(pPropertyCount, pProperties);
-                if ((vkEnumerateInstanceLayerProperties_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkEnumerateInstanceLayerProperties_VkResult_return =
+                    vk->vkEnumerateInstanceLayerProperties(pPropertyCount, pProperties);
+                if ((vkEnumerateInstanceLayerProperties_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_2 = (uint64_t)(uintptr_t)pPropertyCount;
                 vkStream->putBe64(cgen_var_2);
-                if (pPropertyCount)
-                {
+                if (pPropertyCount) {
                     vkStream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
                 }
-                if (pPropertyCount)
-                {
-                    if (pProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            transform_fromhost_VkLayerProperties(m_state, (VkLayerProperties*)(pProperties + i));
+                if (pPropertyCount) {
+                    if (pProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            transform_fromhost_VkLayerProperties(
+                                m_state, (VkLayerProperties*)(pProperties + i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pProperties;
                 vkStream->putBe64(cgen_var_3);
-                if (pProperties)
-                {
-                    if (pPropertyCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            marshal_VkLayerProperties(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkLayerProperties*)(pProperties + i));
+                if (pProperties) {
+                    if (pPropertyCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            marshal_VkLayerProperties(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                      (VkLayerProperties*)(pProperties + i));
                         }
                     }
                 }
-                vkStream->write(&vkEnumerateInstanceLayerProperties_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkEnumerateInstanceLayerProperties_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkEnumerateInstanceLayerProperties(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkEnumerateInstanceLayerProperties_VkResult_return, pPropertyCount, pProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkEnumerateInstanceLayerProperties(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkEnumerateInstanceLayerProperties_VkResult_return, pPropertyCount,
+                        pProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkEnumerateDeviceLayerProperties:
-            {
+            case OP_vkEnumerateDeviceLayerProperties: {
                 android::base::beginTrace("vkEnumerateDeviceLayerProperties decode");
                 VkPhysicalDevice physicalDevice;
                 uint32_t* pPropertyCount;
@@ -1149,7 +1261,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
@@ -1159,8 +1272,7 @@
                 memcpy((uint32_t**)&pPropertyCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pPropertyCount);
                 *readStreamPtrPtr += 8;
-                if (pPropertyCount)
-                {
+                if (pPropertyCount) {
                     vkReadStream->alloc((void**)&pPropertyCount, sizeof(uint32_t));
                     memcpy((uint32_t*)pPropertyCount, *readStreamPtrPtr, sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
@@ -1171,77 +1283,81 @@
                 memcpy((VkLayerProperties**)&pProperties, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pProperties);
                 *readStreamPtrPtr += 8;
-                if (pProperties)
-                {
-                    vkReadStream->alloc((void**)&pProperties, (*(pPropertyCount)) * sizeof(VkLayerProperties));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                    {
-                        reservedunmarshal_VkLayerProperties(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkLayerProperties*)(pProperties + i), readStreamPtrPtr);
+                if (pProperties) {
+                    vkReadStream->alloc((void**)&pProperties,
+                                        (*(pPropertyCount)) * sizeof(VkLayerProperties));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                        reservedunmarshal_VkLayerProperties(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkLayerProperties*)(pProperties + i), readStreamPtrPtr);
                     }
                 }
-                if (pPropertyCount)
-                {
-                    if (pProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            transform_tohost_VkLayerProperties(m_state, (VkLayerProperties*)(pProperties + i));
+                if (pPropertyCount) {
+                    if (pProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            transform_tohost_VkLayerProperties(
+                                m_state, (VkLayerProperties*)(pProperties + i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkEnumerateDeviceLayerProperties 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pPropertyCount, (unsigned long long)pProperties);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkEnumerateDeviceLayerProperties 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)physicalDevice,
+                        (unsigned long long)pPropertyCount, (unsigned long long)pProperties);
                 }
                 VkResult vkEnumerateDeviceLayerProperties_VkResult_return = (VkResult)0;
-                vkEnumerateDeviceLayerProperties_VkResult_return = vk->vkEnumerateDeviceLayerProperties(unboxed_physicalDevice, pPropertyCount, pProperties);
-                if ((vkEnumerateDeviceLayerProperties_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkEnumerateDeviceLayerProperties_VkResult_return =
+                    vk->vkEnumerateDeviceLayerProperties(unboxed_physicalDevice, pPropertyCount,
+                                                         pProperties);
+                if ((vkEnumerateDeviceLayerProperties_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pPropertyCount;
                 vkStream->putBe64(cgen_var_3);
-                if (pPropertyCount)
-                {
+                if (pPropertyCount) {
                     vkStream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
                 }
-                if (pPropertyCount)
-                {
-                    if (pProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            transform_fromhost_VkLayerProperties(m_state, (VkLayerProperties*)(pProperties + i));
+                if (pPropertyCount) {
+                    if (pProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            transform_fromhost_VkLayerProperties(
+                                m_state, (VkLayerProperties*)(pProperties + i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pProperties;
                 vkStream->putBe64(cgen_var_4);
-                if (pProperties)
-                {
-                    if (pPropertyCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            marshal_VkLayerProperties(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkLayerProperties*)(pProperties + i));
+                if (pProperties) {
+                    if (pPropertyCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            marshal_VkLayerProperties(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                      (VkLayerProperties*)(pProperties + i));
                         }
                     }
                 }
-                vkStream->write(&vkEnumerateDeviceLayerProperties_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkEnumerateDeviceLayerProperties_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkEnumerateDeviceLayerProperties(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkEnumerateDeviceLayerProperties_VkResult_return, physicalDevice, pPropertyCount, pProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkEnumerateDeviceLayerProperties(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkEnumerateDeviceLayerProperties_VkResult_return, physicalDevice,
+                        pPropertyCount, pProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetDeviceQueue:
-            {
+            case OP_vkGetDeviceQueue: {
                 android::base::beginTrace("vkGetDeviceQueue decode");
                 VkDevice device;
                 uint32_t queueFamilyIndex;
@@ -1263,30 +1379,35 @@
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
                 *(VkQueue*)pQueue = (VkQueue)(VkQueue)((VkQueue)(*&cgen_var_1));
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetDeviceQueue 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)queueFamilyIndex, (unsigned long long)queueIndex, (unsigned long long)pQueue);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr, "stream %p: call vkGetDeviceQueue 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device, (unsigned long long)queueFamilyIndex,
+                        (unsigned long long)queueIndex, (unsigned long long)pQueue);
                 }
                 m_state->on_vkGetDeviceQueue(&m_pool, device, queueFamilyIndex, queueIndex, pQueue);
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_2;
-                static_assert(8 == sizeof(VkQueue), "handle map overwrite requires VkQueue to be 8 bytes long");
+                static_assert(8 == sizeof(VkQueue),
+                              "handle map overwrite requires VkQueue to be 8 bytes long");
                 vkStream->handleMapping()->mapHandles_VkQueue((VkQueue*)pQueue, 1);
                 vkStream->write((VkQueue*)pQueue, 8 * 1);
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetDeviceQueue(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, queueFamilyIndex, queueIndex, pQueue);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetDeviceQueue(snapshotTraceBegin, snapshotTraceBytes,
+                                                          &m_pool, device, queueFamilyIndex,
+                                                          queueIndex, pQueue);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkQueueSubmit:
-            {
+            case OP_vkQueueSubmit: {
                 android::base::beginTrace("vkQueueSubmit decode");
                 VkQueue queue;
                 uint32_t submitCount;
@@ -1299,45 +1420,49 @@
                 *(VkQueue*)&queue = (VkQueue)(VkQueue)((VkQueue)(*&cgen_var_0));
                 memcpy((uint32_t*)&submitCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pSubmits, ((submitCount)) * sizeof(const VkSubmitInfo));
-                for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i)
-                {
-                    reservedunmarshal_VkSubmitInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubmitInfo*)(pSubmits + i), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pSubmits,
+                                    ((submitCount)) * sizeof(const VkSubmitInfo));
+                for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i) {
+                    reservedunmarshal_VkSubmitInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                   (VkSubmitInfo*)(pSubmits + i), readStreamPtrPtr);
                 }
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkFence*)&fence = (VkFence)unbox_VkFence((VkFence)(*&cgen_var_1));
-                if (pSubmits)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i)
-                    {
+                if (pSubmits) {
+                    for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i) {
                         transform_tohost_VkSubmitInfo(m_state, (VkSubmitInfo*)(pSubmits + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkQueueSubmit 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)queue, (unsigned long long)submitCount, (unsigned long long)pSubmits, (unsigned long long)fence);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkQueueSubmit 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)queue, (unsigned long long)submitCount,
+                            (unsigned long long)pSubmits, (unsigned long long)fence);
                 }
                 VkResult vkQueueSubmit_VkResult_return = (VkResult)0;
-                vkQueueSubmit_VkResult_return = m_state->on_vkQueueSubmit(&m_pool, queue, submitCount, pSubmits, fence);
-                if ((vkQueueSubmit_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkQueueSubmit_VkResult_return =
+                    m_state->on_vkQueueSubmit(&m_pool, queue, submitCount, pSubmits, fence);
+                if ((vkQueueSubmit_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkQueueSubmit_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkQueueSubmit(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkQueueSubmit_VkResult_return, queue, submitCount, pSubmits, fence);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkQueueSubmit(snapshotTraceBegin, snapshotTraceBytes,
+                                                       &m_pool, vkQueueSubmit_VkResult_return,
+                                                       queue, submitCount, pSubmits, fence);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkQueueWaitIdle:
-            {
+            case OP_vkQueueWaitIdle: {
                 android::base::beginTrace("vkQueueWaitIdle decode");
                 VkQueue queue;
                 // Begin global wrapped dispatchable handle unboxing for queue;
@@ -1345,29 +1470,32 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkQueue*)&queue = (VkQueue)(VkQueue)((VkQueue)(*&cgen_var_0));
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkQueueWaitIdle 0x%llx \n", ioStream, (unsigned long long)queue);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkQueueWaitIdle 0x%llx \n", ioStream,
+                            (unsigned long long)queue);
                 }
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 VkResult vkQueueWaitIdle_VkResult_return = (VkResult)0;
                 vkQueueWaitIdle_VkResult_return = m_state->on_vkQueueWaitIdle(&m_pool, queue);
-                if ((vkQueueWaitIdle_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                if ((vkQueueWaitIdle_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkQueueWaitIdle_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkQueueWaitIdle(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkQueueWaitIdle_VkResult_return, queue);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkQueueWaitIdle(snapshotTraceBegin, snapshotTraceBytes,
+                                                         &m_pool, vkQueueWaitIdle_VkResult_return,
+                                                         queue);
                 }
                 vkReadStream->clearPool();
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDeviceWaitIdle:
-            {
+            case OP_vkDeviceWaitIdle: {
                 android::base::beginTrace("vkDeviceWaitIdle decode");
                 VkDevice device;
                 // Begin non wrapped dispatchable handle unboxing for device;
@@ -1378,29 +1506,32 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDeviceWaitIdle 0x%llx \n", ioStream, (unsigned long long)device);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkDeviceWaitIdle 0x%llx \n", ioStream,
+                            (unsigned long long)device);
                 }
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 VkResult vkDeviceWaitIdle_VkResult_return = (VkResult)0;
                 vkDeviceWaitIdle_VkResult_return = vk->vkDeviceWaitIdle(unboxed_device);
-                if ((vkDeviceWaitIdle_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                if ((vkDeviceWaitIdle_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkDeviceWaitIdle_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDeviceWaitIdle(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkDeviceWaitIdle_VkResult_return, device);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDeviceWaitIdle(snapshotTraceBegin, snapshotTraceBytes,
+                                                          &m_pool, vkDeviceWaitIdle_VkResult_return,
+                                                          device);
                 }
                 vkReadStream->clearPool();
                 android::base::endTrace();
                 break;
             }
-            case OP_vkAllocateMemory:
-            {
+            case OP_vkAllocateMemory: {
                 android::base::beginTrace("vkAllocateMemory decode");
                 VkDevice device;
                 const VkMemoryAllocateInfo* pAllocateInfo;
@@ -1412,15 +1543,18 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
                 vkReadStream->alloc((void**)&pAllocateInfo, sizeof(const VkMemoryAllocateInfo));
-                reservedunmarshal_VkMemoryAllocateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryAllocateInfo*)(pAllocateInfo), readStreamPtrPtr);
+                reservedunmarshal_VkMemoryAllocateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                       (VkMemoryAllocateInfo*)(pAllocateInfo),
+                                                       readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pMemory;
                 vkReadStream->unsetHandleMapping();
@@ -1428,46 +1562,55 @@
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkDeviceMemory*)pMemory = (VkDeviceMemory)(VkDeviceMemory)((VkDeviceMemory)(*&cgen_var_2));
-                if (pAllocateInfo)
-                {
-                    transform_tohost_VkMemoryAllocateInfo(m_state, (VkMemoryAllocateInfo*)(pAllocateInfo));
+                *(VkDeviceMemory*)pMemory =
+                    (VkDeviceMemory)(VkDeviceMemory)((VkDeviceMemory)(*&cgen_var_2));
+                if (pAllocateInfo) {
+                    transform_tohost_VkMemoryAllocateInfo(m_state,
+                                                          (VkMemoryAllocateInfo*)(pAllocateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkAllocateMemory 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pAllocateInfo, (unsigned long long)pAllocator, (unsigned long long)pMemory);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkAllocateMemory 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pAllocateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pMemory);
                 }
                 VkResult vkAllocateMemory_VkResult_return = (VkResult)0;
-                vkAllocateMemory_VkResult_return = m_state->on_vkAllocateMemory(&m_pool, device, pAllocateInfo, pAllocator, pMemory);
-                if ((vkAllocateMemory_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkAllocateMemory_VkResult_return = m_state->on_vkAllocateMemory(
+                    &m_pool, device, pAllocateInfo, pAllocator, pMemory);
+                if ((vkAllocateMemory_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // Begin manual non dispatchable handle create for pMemory;
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3;
-                static_assert(8 == sizeof(VkDeviceMemory), "handle map overwrite requires VkDeviceMemory to be 8 bytes long");
+                static_assert(8 == sizeof(VkDeviceMemory),
+                              "handle map overwrite requires VkDeviceMemory to be 8 bytes long");
                 vkStream->handleMapping()->mapHandles_VkDeviceMemory((VkDeviceMemory*)pMemory, 1);
                 vkStream->write((VkDeviceMemory*)pMemory, 8 * 1);
                 // Begin manual non dispatchable handle create for pMemory;
                 vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
                 vkStream->write(&vkAllocateMemory_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkAllocateMemory(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkAllocateMemory_VkResult_return, device, pAllocateInfo, pAllocator, pMemory);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkAllocateMemory(snapshotTraceBegin, snapshotTraceBytes,
+                                                          &m_pool, vkAllocateMemory_VkResult_return,
+                                                          device, pAllocateInfo, pAllocator,
+                                                          pMemory);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkFreeMemory:
-            {
+            case OP_vkFreeMemory: {
                 android::base::beginTrace("vkFreeMemory decode");
                 VkDevice device;
                 VkDeviceMemory memory;
@@ -1482,42 +1625,47 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDeviceMemory*)&memory = (VkDeviceMemory)(VkDeviceMemory)((VkDeviceMemory)(*&cgen_var_1));
+                *(VkDeviceMemory*)&memory =
+                    (VkDeviceMemory)(VkDeviceMemory)((VkDeviceMemory)(*&cgen_var_1));
                 boxed_memory_preserve = memory;
                 memory = unbox_VkDeviceMemory(memory);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkFreeMemory 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)memory, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkFreeMemory 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)memory,
+                            (unsigned long long)pAllocator);
                 }
                 m_state->on_vkFreeMemory(&m_pool, device, memory, pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkFreeMemory(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, boxed_memory_preserve, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkFreeMemory(snapshotTraceBegin, snapshotTraceBytes,
+                                                      &m_pool, device, boxed_memory_preserve,
+                                                      pAllocator);
                 }
                 delete_VkDeviceMemory(boxed_memory_preserve);
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkMapMemory:
-            {
+            case OP_vkMapMemory: {
                 android::base::beginTrace("vkMapMemory decode");
                 VkDevice device;
                 VkDeviceMemory memory;
@@ -1533,7 +1681,8 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDeviceMemory*)&memory = (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_1));
+                *(VkDeviceMemory*)&memory =
+                    (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_1));
                 memcpy((VkDeviceSize*)&offset, *readStreamPtrPtr, sizeof(VkDeviceSize));
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
                 memcpy((VkDeviceSize*)&size, *readStreamPtrPtr, sizeof(VkDeviceSize));
@@ -1546,42 +1695,47 @@
                 memcpy((void***)&ppData, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&ppData);
                 *readStreamPtrPtr += 8;
-                if (ppData)
-                {
+                if (ppData) {
                     vkReadStream->alloc((void**)&ppData, sizeof(void*));
                     memcpy((void**)ppData, *readStreamPtrPtr, sizeof(void*));
                     *readStreamPtrPtr += sizeof(void*);
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkMapMemory 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)memory, (unsigned long long)offset, (unsigned long long)size, (unsigned long long)flags, (unsigned long long)ppData);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkMapMemory 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device, (unsigned long long)memory,
+                        (unsigned long long)offset, (unsigned long long)size,
+                        (unsigned long long)flags, (unsigned long long)ppData);
                 }
                 VkResult vkMapMemory_VkResult_return = (VkResult)0;
-                vkMapMemory_VkResult_return = m_state->on_vkMapMemory(&m_pool, device, memory, offset, size, flags, ppData);
+                vkMapMemory_VkResult_return =
+                    m_state->on_vkMapMemory(&m_pool, device, memory, offset, size, flags, ppData);
                 if ((vkMapMemory_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)ppData;
                 vkStream->putBe64(cgen_var_3);
-                if (ppData)
-                {
+                if (ppData) {
                     vkStream->write((void**)ppData, sizeof(void*));
                 }
                 vkStream->write(&vkMapMemory_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkMapMemory(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkMapMemory_VkResult_return, device, memory, offset, size, flags, ppData);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkMapMemory(snapshotTraceBegin, snapshotTraceBytes,
+                                                     &m_pool, vkMapMemory_VkResult_return, device,
+                                                     memory, offset, size, flags, ppData);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkUnmapMemory:
-            {
+            case OP_vkUnmapMemory: {
                 android::base::beginTrace("vkUnmapMemory decode");
                 VkDevice device;
                 VkDeviceMemory memory;
@@ -1593,26 +1747,28 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDeviceMemory*)&memory = (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_1));
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkUnmapMemory 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)memory);
+                *(VkDeviceMemory*)&memory =
+                    (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_1));
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkUnmapMemory 0x%llx 0x%llx \n", ioStream,
+                            (unsigned long long)device, (unsigned long long)memory);
                 }
                 m_state->on_vkUnmapMemory(&m_pool, device, memory);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkUnmapMemory(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, memory);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkUnmapMemory(snapshotTraceBegin, snapshotTraceBytes,
+                                                       &m_pool, device, memory);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkFlushMappedMemoryRanges:
-            {
+            case OP_vkFlushMappedMemoryRanges: {
                 android::base::beginTrace("vkFlushMappedMemoryRanges decode");
                 VkDevice device;
                 uint32_t memoryRangeCount;
@@ -1627,58 +1783,67 @@
                 // End manual dispatchable handle unboxing for device;
                 memcpy((uint32_t*)&memoryRangeCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pMemoryRanges, ((memoryRangeCount)) * sizeof(const VkMappedMemoryRange));
-                for (uint32_t i = 0; i < (uint32_t)((memoryRangeCount)); ++i)
-                {
-                    reservedunmarshal_VkMappedMemoryRange(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMappedMemoryRange*)(pMemoryRanges + i), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pMemoryRanges,
+                                    ((memoryRangeCount)) * sizeof(const VkMappedMemoryRange));
+                for (uint32_t i = 0; i < (uint32_t)((memoryRangeCount)); ++i) {
+                    reservedunmarshal_VkMappedMemoryRange(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                          (VkMappedMemoryRange*)(pMemoryRanges + i),
+                                                          readStreamPtrPtr);
                 }
-                if (pMemoryRanges)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((memoryRangeCount)); ++i)
-                    {
-                        transform_tohost_VkMappedMemoryRange(m_state, (VkMappedMemoryRange*)(pMemoryRanges + i));
+                if (pMemoryRanges) {
+                    for (uint32_t i = 0; i < (uint32_t)((memoryRangeCount)); ++i) {
+                        transform_tohost_VkMappedMemoryRange(
+                            m_state, (VkMappedMemoryRange*)(pMemoryRanges + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkFlushMappedMemoryRanges 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)memoryRangeCount, (unsigned long long)pMemoryRanges);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr, "stream %p: call vkFlushMappedMemoryRanges 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device, (unsigned long long)memoryRangeCount,
+                        (unsigned long long)pMemoryRanges);
                 }
-                if (!m_state->usingDirectMapping())
-                {
-                    for (uint32_t i = 0; i < memoryRangeCount; ++i)
-                    {
+                if (!m_state->usingDirectMapping()) {
+                    for (uint32_t i = 0; i < memoryRangeCount; ++i) {
                         auto range = pMemoryRanges[i];
                         auto memory = pMemoryRanges[i].memory;
                         auto size = pMemoryRanges[i].size;
                         auto offset = pMemoryRanges[i].offset;
                         uint64_t readStream = 0;
-                        memcpy(&readStream, *readStreamPtrPtr, sizeof(uint64_t)); *readStreamPtrPtr += sizeof(uint64_t);
+                        memcpy(&readStream, *readStreamPtrPtr, sizeof(uint64_t));
+                        *readStreamPtrPtr += sizeof(uint64_t);
                         auto hostPtr = m_state->getMappedHostPointer(memory);
-                        if (!hostPtr && readStream > 0) GFXSTREAM_ABORT(::emugl::FatalError(::emugl::ABORT_REASON_OTHER));
+                        if (!hostPtr && readStream > 0)
+                            GFXSTREAM_ABORT(::emugl::FatalError(::emugl::ABORT_REASON_OTHER));
                         if (!hostPtr) continue;
                         uint8_t* targetRange = hostPtr + offset;
-                        memcpy(targetRange, *readStreamPtrPtr, readStream); *readStreamPtrPtr += readStream;
+                        memcpy(targetRange, *readStreamPtrPtr, readStream);
+                        *readStreamPtrPtr += readStream;
                     }
                 }
                 VkResult vkFlushMappedMemoryRanges_VkResult_return = (VkResult)0;
-                vkFlushMappedMemoryRanges_VkResult_return = vk->vkFlushMappedMemoryRanges(unboxed_device, memoryRangeCount, pMemoryRanges);
-                if ((vkFlushMappedMemoryRanges_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkFlushMappedMemoryRanges_VkResult_return =
+                    vk->vkFlushMappedMemoryRanges(unboxed_device, memoryRangeCount, pMemoryRanges);
+                if ((vkFlushMappedMemoryRanges_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkFlushMappedMemoryRanges_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkFlushMappedMemoryRanges(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkFlushMappedMemoryRanges_VkResult_return, device, memoryRangeCount, pMemoryRanges);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkFlushMappedMemoryRanges(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkFlushMappedMemoryRanges_VkResult_return, device, memoryRangeCount,
+                        pMemoryRanges);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkInvalidateMappedMemoryRanges:
-            {
+            case OP_vkInvalidateMappedMemoryRanges: {
                 android::base::beginTrace("vkInvalidateMappedMemoryRanges decode");
                 VkDevice device;
                 uint32_t memoryRangeCount;
@@ -1693,39 +1858,47 @@
                 // End manual dispatchable handle unboxing for device;
                 memcpy((uint32_t*)&memoryRangeCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pMemoryRanges, ((memoryRangeCount)) * sizeof(const VkMappedMemoryRange));
-                for (uint32_t i = 0; i < (uint32_t)((memoryRangeCount)); ++i)
-                {
-                    reservedunmarshal_VkMappedMemoryRange(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMappedMemoryRange*)(pMemoryRanges + i), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pMemoryRanges,
+                                    ((memoryRangeCount)) * sizeof(const VkMappedMemoryRange));
+                for (uint32_t i = 0; i < (uint32_t)((memoryRangeCount)); ++i) {
+                    reservedunmarshal_VkMappedMemoryRange(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                          (VkMappedMemoryRange*)(pMemoryRanges + i),
+                                                          readStreamPtrPtr);
                 }
-                if (pMemoryRanges)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((memoryRangeCount)); ++i)
-                    {
-                        transform_tohost_VkMappedMemoryRange(m_state, (VkMappedMemoryRange*)(pMemoryRanges + i));
+                if (pMemoryRanges) {
+                    for (uint32_t i = 0; i < (uint32_t)((memoryRangeCount)); ++i) {
+                        transform_tohost_VkMappedMemoryRange(
+                            m_state, (VkMappedMemoryRange*)(pMemoryRanges + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkInvalidateMappedMemoryRanges 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)memoryRangeCount, (unsigned long long)pMemoryRanges);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkInvalidateMappedMemoryRanges 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device, (unsigned long long)memoryRangeCount,
+                        (unsigned long long)pMemoryRanges);
                 }
                 VkResult vkInvalidateMappedMemoryRanges_VkResult_return = (VkResult)0;
-                vkInvalidateMappedMemoryRanges_VkResult_return = vk->vkInvalidateMappedMemoryRanges(unboxed_device, memoryRangeCount, pMemoryRanges);
-                if ((vkInvalidateMappedMemoryRanges_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkInvalidateMappedMemoryRanges_VkResult_return = vk->vkInvalidateMappedMemoryRanges(
+                    unboxed_device, memoryRangeCount, pMemoryRanges);
+                if ((vkInvalidateMappedMemoryRanges_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkInvalidateMappedMemoryRanges_VkResult_return, sizeof(VkResult));
-                if (!m_state->usingDirectMapping())
-                {
-                    for (uint32_t i = 0; i < memoryRangeCount; ++i)
-                    {
+                if (!m_state->usingDirectMapping()) {
+                    for (uint32_t i = 0; i < memoryRangeCount; ++i) {
                         auto range = pMemoryRanges[i];
                         auto memory = range.memory;
                         auto size = range.size;
                         auto offset = range.offset;
                         auto hostPtr = m_state->getMappedHostPointer(memory);
-                        auto actualSize = size == VK_WHOLE_SIZE ? m_state->getDeviceMemorySize(memory) : size;
+                        auto actualSize =
+                            size == VK_WHOLE_SIZE ? m_state->getDeviceMemorySize(memory) : size;
                         uint64_t writeStream = 0;
-                        if (!hostPtr) { vkStream->write(&writeStream, sizeof(uint64_t)); continue; };
+                        if (!hostPtr) {
+                            vkStream->write(&writeStream, sizeof(uint64_t));
+                            continue;
+                        };
                         uint8_t* targetRange = hostPtr + offset;
                         writeStream = actualSize;
                         vkStream->write(&writeStream, sizeof(uint64_t));
@@ -1733,19 +1906,22 @@
                     }
                 }
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkInvalidateMappedMemoryRanges(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkInvalidateMappedMemoryRanges_VkResult_return, device, memoryRangeCount, pMemoryRanges);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkInvalidateMappedMemoryRanges(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkInvalidateMappedMemoryRanges_VkResult_return, device, memoryRangeCount,
+                        pMemoryRanges);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetDeviceMemoryCommitment:
-            {
+            case OP_vkGetDeviceMemoryCommitment: {
                 android::base::beginTrace("vkGetDeviceMemoryCommitment decode");
                 VkDevice device;
                 VkDeviceMemory memory;
@@ -1761,33 +1937,39 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDeviceMemory*)&memory = (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_1));
+                *(VkDeviceMemory*)&memory =
+                    (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_1));
                 // Begin manual dispatchable handle unboxing for pCommittedMemoryInBytes;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pCommittedMemoryInBytes, sizeof(VkDeviceSize));
-                memcpy((VkDeviceSize*)pCommittedMemoryInBytes, *readStreamPtrPtr, sizeof(VkDeviceSize));
+                memcpy((VkDeviceSize*)pCommittedMemoryInBytes, *readStreamPtrPtr,
+                       sizeof(VkDeviceSize));
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetDeviceMemoryCommitment 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)memory, (unsigned long long)pCommittedMemoryInBytes);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetDeviceMemoryCommitment 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)memory,
+                            (unsigned long long)pCommittedMemoryInBytes);
                 }
                 vk->vkGetDeviceMemoryCommitment(unboxed_device, memory, pCommittedMemoryInBytes);
                 vkStream->unsetHandleMapping();
                 vkStream->write((VkDeviceSize*)pCommittedMemoryInBytes, sizeof(VkDeviceSize));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetDeviceMemoryCommitment(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, memory, pCommittedMemoryInBytes);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetDeviceMemoryCommitment(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, memory,
+                        pCommittedMemoryInBytes);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkBindBufferMemory:
-            {
+            case OP_vkBindBufferMemory: {
                 android::base::beginTrace("vkBindBufferMemory decode");
                 VkDevice device;
                 VkBuffer buffer;
@@ -1805,32 +1987,39 @@
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDeviceMemory*)&memory = (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_2));
+                *(VkDeviceMemory*)&memory =
+                    (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_2));
                 memcpy((VkDeviceSize*)&memoryOffset, *readStreamPtrPtr, sizeof(VkDeviceSize));
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkBindBufferMemory 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)buffer, (unsigned long long)memory, (unsigned long long)memoryOffset);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkBindBufferMemory 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)buffer,
+                            (unsigned long long)memory, (unsigned long long)memoryOffset);
                 }
                 VkResult vkBindBufferMemory_VkResult_return = (VkResult)0;
-                vkBindBufferMemory_VkResult_return = m_state->on_vkBindBufferMemory(&m_pool, device, buffer, memory, memoryOffset);
-                if ((vkBindBufferMemory_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkBindBufferMemory_VkResult_return =
+                    m_state->on_vkBindBufferMemory(&m_pool, device, buffer, memory, memoryOffset);
+                if ((vkBindBufferMemory_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkBindBufferMemory_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkBindBufferMemory(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkBindBufferMemory_VkResult_return, device, buffer, memory, memoryOffset);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkBindBufferMemory(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkBindBufferMemory_VkResult_return, device, buffer, memory, memoryOffset);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkBindImageMemory:
-            {
+            case OP_vkBindImageMemory: {
                 android::base::beginTrace("vkBindImageMemory decode");
                 VkDevice device;
                 VkImage image;
@@ -1848,32 +2037,39 @@
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDeviceMemory*)&memory = (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_2));
+                *(VkDeviceMemory*)&memory =
+                    (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_2));
                 memcpy((VkDeviceSize*)&memoryOffset, *readStreamPtrPtr, sizeof(VkDeviceSize));
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkBindImageMemory 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)image, (unsigned long long)memory, (unsigned long long)memoryOffset);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkBindImageMemory 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)image,
+                            (unsigned long long)memory, (unsigned long long)memoryOffset);
                 }
                 VkResult vkBindImageMemory_VkResult_return = (VkResult)0;
-                vkBindImageMemory_VkResult_return = m_state->on_vkBindImageMemory(&m_pool, device, image, memory, memoryOffset);
-                if ((vkBindImageMemory_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkBindImageMemory_VkResult_return =
+                    m_state->on_vkBindImageMemory(&m_pool, device, image, memory, memoryOffset);
+                if ((vkBindImageMemory_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkBindImageMemory_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkBindImageMemory(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkBindImageMemory_VkResult_return, device, image, memory, memoryOffset);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkBindImageMemory(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkBindImageMemory_VkResult_return, device, image, memory, memoryOffset);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetBufferMemoryRequirements:
-            {
+            case OP_vkGetBufferMemoryRequirements: {
                 android::base::beginTrace("vkGetBufferMemoryRequirements decode");
                 VkDevice device;
                 VkBuffer buffer;
@@ -1893,36 +2089,43 @@
                 // Begin manual dispatchable handle unboxing for pMemoryRequirements;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pMemoryRequirements, sizeof(VkMemoryRequirements));
-                reservedunmarshal_VkMemoryRequirements(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements*)(pMemoryRequirements), readStreamPtrPtr);
-                if (pMemoryRequirements)
-                {
-                    transform_tohost_VkMemoryRequirements(m_state, (VkMemoryRequirements*)(pMemoryRequirements));
+                reservedunmarshal_VkMemoryRequirements(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                       (VkMemoryRequirements*)(pMemoryRequirements),
+                                                       readStreamPtrPtr);
+                if (pMemoryRequirements) {
+                    transform_tohost_VkMemoryRequirements(
+                        m_state, (VkMemoryRequirements*)(pMemoryRequirements));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetBufferMemoryRequirements 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)buffer, (unsigned long long)pMemoryRequirements);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetBufferMemoryRequirements 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)buffer,
+                            (unsigned long long)pMemoryRequirements);
                 }
                 vk->vkGetBufferMemoryRequirements(unboxed_device, buffer, pMemoryRequirements);
                 vkStream->unsetHandleMapping();
-                if (pMemoryRequirements)
-                {
-                    transform_fromhost_VkMemoryRequirements(m_state, (VkMemoryRequirements*)(pMemoryRequirements));
+                if (pMemoryRequirements) {
+                    transform_fromhost_VkMemoryRequirements(
+                        m_state, (VkMemoryRequirements*)(pMemoryRequirements));
                 }
-                marshal_VkMemoryRequirements(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements*)(pMemoryRequirements));
+                marshal_VkMemoryRequirements(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                             (VkMemoryRequirements*)(pMemoryRequirements));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetBufferMemoryRequirements(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, buffer, pMemoryRequirements);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetBufferMemoryRequirements(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, buffer,
+                        pMemoryRequirements);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetImageMemoryRequirements:
-            {
+            case OP_vkGetImageMemoryRequirements: {
                 android::base::beginTrace("vkGetImageMemoryRequirements decode");
                 VkDevice device;
                 VkImage image;
@@ -1939,36 +2142,44 @@
                 // Begin manual dispatchable handle unboxing for pMemoryRequirements;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pMemoryRequirements, sizeof(VkMemoryRequirements));
-                reservedunmarshal_VkMemoryRequirements(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements*)(pMemoryRequirements), readStreamPtrPtr);
-                if (pMemoryRequirements)
-                {
-                    transform_tohost_VkMemoryRequirements(m_state, (VkMemoryRequirements*)(pMemoryRequirements));
+                reservedunmarshal_VkMemoryRequirements(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                       (VkMemoryRequirements*)(pMemoryRequirements),
+                                                       readStreamPtrPtr);
+                if (pMemoryRequirements) {
+                    transform_tohost_VkMemoryRequirements(
+                        m_state, (VkMemoryRequirements*)(pMemoryRequirements));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetImageMemoryRequirements 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)image, (unsigned long long)pMemoryRequirements);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetImageMemoryRequirements 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)image,
+                            (unsigned long long)pMemoryRequirements);
                 }
-                m_state->on_vkGetImageMemoryRequirements(&m_pool, device, image, pMemoryRequirements);
+                m_state->on_vkGetImageMemoryRequirements(&m_pool, device, image,
+                                                         pMemoryRequirements);
                 vkStream->unsetHandleMapping();
-                if (pMemoryRequirements)
-                {
-                    transform_fromhost_VkMemoryRequirements(m_state, (VkMemoryRequirements*)(pMemoryRequirements));
+                if (pMemoryRequirements) {
+                    transform_fromhost_VkMemoryRequirements(
+                        m_state, (VkMemoryRequirements*)(pMemoryRequirements));
                 }
-                marshal_VkMemoryRequirements(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements*)(pMemoryRequirements));
+                marshal_VkMemoryRequirements(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                             (VkMemoryRequirements*)(pMemoryRequirements));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetImageMemoryRequirements(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, image, pMemoryRequirements);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetImageMemoryRequirements(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, image,
+                        pMemoryRequirements);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetImageSparseMemoryRequirements:
-            {
+            case OP_vkGetImageSparseMemoryRequirements: {
                 android::base::beginTrace("vkGetImageSparseMemoryRequirements decode");
                 VkDevice device;
                 VkImage image;
@@ -1992,86 +2203,97 @@
                 memcpy((uint32_t**)&pSparseMemoryRequirementCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pSparseMemoryRequirementCount);
                 *readStreamPtrPtr += 8;
-                if (pSparseMemoryRequirementCount)
-                {
+                if (pSparseMemoryRequirementCount) {
                     vkReadStream->alloc((void**)&pSparseMemoryRequirementCount, sizeof(uint32_t));
-                    memcpy((uint32_t*)pSparseMemoryRequirementCount, *readStreamPtrPtr, sizeof(uint32_t));
+                    memcpy((uint32_t*)pSparseMemoryRequirementCount, *readStreamPtrPtr,
+                           sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
                 }
                 // Begin manual dispatchable handle unboxing for pSparseMemoryRequirements;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
-                memcpy((VkSparseImageMemoryRequirements**)&pSparseMemoryRequirements, (*readStreamPtrPtr), 8);
+                memcpy((VkSparseImageMemoryRequirements**)&pSparseMemoryRequirements,
+                       (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pSparseMemoryRequirements);
                 *readStreamPtrPtr += 8;
-                if (pSparseMemoryRequirements)
-                {
-                    vkReadStream->alloc((void**)&pSparseMemoryRequirements, (*(pSparseMemoryRequirementCount)) * sizeof(VkSparseImageMemoryRequirements));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i)
-                    {
-                        reservedunmarshal_VkSparseImageMemoryRequirements(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSparseImageMemoryRequirements*)(pSparseMemoryRequirements + i), readStreamPtrPtr);
+                if (pSparseMemoryRequirements) {
+                    vkReadStream->alloc((void**)&pSparseMemoryRequirements,
+                                        (*(pSparseMemoryRequirementCount)) *
+                                            sizeof(VkSparseImageMemoryRequirements));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i) {
+                        reservedunmarshal_VkSparseImageMemoryRequirements(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkSparseImageMemoryRequirements*)(pSparseMemoryRequirements + i),
+                            readStreamPtrPtr);
                     }
                 }
-                if (pSparseMemoryRequirementCount)
-                {
-                    if (pSparseMemoryRequirements)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i)
-                        {
-                            transform_tohost_VkSparseImageMemoryRequirements(m_state, (VkSparseImageMemoryRequirements*)(pSparseMemoryRequirements + i));
+                if (pSparseMemoryRequirementCount) {
+                    if (pSparseMemoryRequirements) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount));
+                             ++i) {
+                            transform_tohost_VkSparseImageMemoryRequirements(
+                                m_state,
+                                (VkSparseImageMemoryRequirements*)(pSparseMemoryRequirements + i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetImageSparseMemoryRequirements 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)image, (unsigned long long)pSparseMemoryRequirementCount, (unsigned long long)pSparseMemoryRequirements);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetImageSparseMemoryRequirements 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)image,
+                            (unsigned long long)pSparseMemoryRequirementCount,
+                            (unsigned long long)pSparseMemoryRequirements);
                 }
-                vk->vkGetImageSparseMemoryRequirements(unboxed_device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
+                vk->vkGetImageSparseMemoryRequirements(unboxed_device, image,
+                                                       pSparseMemoryRequirementCount,
+                                                       pSparseMemoryRequirements);
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pSparseMemoryRequirementCount;
                 vkStream->putBe64(cgen_var_4);
-                if (pSparseMemoryRequirementCount)
-                {
+                if (pSparseMemoryRequirementCount) {
                     vkStream->write((uint32_t*)pSparseMemoryRequirementCount, sizeof(uint32_t));
                 }
-                if (pSparseMemoryRequirementCount)
-                {
-                    if (pSparseMemoryRequirements)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i)
-                        {
-                            transform_fromhost_VkSparseImageMemoryRequirements(m_state, (VkSparseImageMemoryRequirements*)(pSparseMemoryRequirements + i));
+                if (pSparseMemoryRequirementCount) {
+                    if (pSparseMemoryRequirements) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount));
+                             ++i) {
+                            transform_fromhost_VkSparseImageMemoryRequirements(
+                                m_state,
+                                (VkSparseImageMemoryRequirements*)(pSparseMemoryRequirements + i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_5 = (uint64_t)(uintptr_t)pSparseMemoryRequirements;
                 vkStream->putBe64(cgen_var_5);
-                if (pSparseMemoryRequirements)
-                {
-                    if (pSparseMemoryRequirementCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i)
-                        {
-                            marshal_VkSparseImageMemoryRequirements(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSparseImageMemoryRequirements*)(pSparseMemoryRequirements + i));
+                if (pSparseMemoryRequirements) {
+                    if (pSparseMemoryRequirementCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount));
+                             ++i) {
+                            marshal_VkSparseImageMemoryRequirements(
+                                vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                (VkSparseImageMemoryRequirements*)(pSparseMemoryRequirements + i));
                         }
                     }
                 }
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetImageSparseMemoryRequirements(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetImageSparseMemoryRequirements(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, image,
+                        pSparseMemoryRequirementCount, pSparseMemoryRequirements);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceSparseImageFormatProperties:
-            {
+            case OP_vkGetPhysicalDeviceSparseImageFormatProperties: {
                 android::base::beginTrace("vkGetPhysicalDeviceSparseImageFormatProperties decode");
                 VkPhysicalDevice physicalDevice;
                 VkFormat format;
@@ -2085,7 +2307,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
@@ -2093,7 +2316,8 @@
                 *readStreamPtrPtr += sizeof(VkFormat);
                 memcpy((VkImageType*)&type, *readStreamPtrPtr, sizeof(VkImageType));
                 *readStreamPtrPtr += sizeof(VkImageType);
-                memcpy((VkSampleCountFlagBits*)&samples, *readStreamPtrPtr, sizeof(VkSampleCountFlagBits));
+                memcpy((VkSampleCountFlagBits*)&samples, *readStreamPtrPtr,
+                       sizeof(VkSampleCountFlagBits));
                 *readStreamPtrPtr += sizeof(VkSampleCountFlagBits);
                 memcpy((VkImageUsageFlags*)&usage, *readStreamPtrPtr, sizeof(VkImageUsageFlags));
                 *readStreamPtrPtr += sizeof(VkImageUsageFlags);
@@ -2105,8 +2329,7 @@
                 memcpy((uint32_t**)&pPropertyCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pPropertyCount);
                 *readStreamPtrPtr += 8;
-                if (pPropertyCount)
-                {
+                if (pPropertyCount) {
                     vkReadStream->alloc((void**)&pPropertyCount, sizeof(uint32_t));
                     memcpy((uint32_t*)pPropertyCount, *readStreamPtrPtr, sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
@@ -2117,74 +2340,80 @@
                 memcpy((VkSparseImageFormatProperties**)&pProperties, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pProperties);
                 *readStreamPtrPtr += 8;
-                if (pProperties)
-                {
-                    vkReadStream->alloc((void**)&pProperties, (*(pPropertyCount)) * sizeof(VkSparseImageFormatProperties));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                    {
-                        reservedunmarshal_VkSparseImageFormatProperties(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSparseImageFormatProperties*)(pProperties + i), readStreamPtrPtr);
+                if (pProperties) {
+                    vkReadStream->alloc(
+                        (void**)&pProperties,
+                        (*(pPropertyCount)) * sizeof(VkSparseImageFormatProperties));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                        reservedunmarshal_VkSparseImageFormatProperties(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkSparseImageFormatProperties*)(pProperties + i), readStreamPtrPtr);
                     }
                 }
-                if (pPropertyCount)
-                {
-                    if (pProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            transform_tohost_VkSparseImageFormatProperties(m_state, (VkSparseImageFormatProperties*)(pProperties + i));
+                if (pPropertyCount) {
+                    if (pProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            transform_tohost_VkSparseImageFormatProperties(
+                                m_state, (VkSparseImageFormatProperties*)(pProperties + i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceSparseImageFormatProperties 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)format, (unsigned long long)type, (unsigned long long)samples, (unsigned long long)usage, (unsigned long long)tiling, (unsigned long long)pPropertyCount, (unsigned long long)pProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceSparseImageFormatProperties 0x%llx "
+                            "0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)format, (unsigned long long)type,
+                            (unsigned long long)samples, (unsigned long long)usage,
+                            (unsigned long long)tiling, (unsigned long long)pPropertyCount,
+                            (unsigned long long)pProperties);
                 }
-                vk->vkGetPhysicalDeviceSparseImageFormatProperties(unboxed_physicalDevice, format, type, samples, usage, tiling, pPropertyCount, pProperties);
+                vk->vkGetPhysicalDeviceSparseImageFormatProperties(unboxed_physicalDevice, format,
+                                                                   type, samples, usage, tiling,
+                                                                   pPropertyCount, pProperties);
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pPropertyCount;
                 vkStream->putBe64(cgen_var_3);
-                if (pPropertyCount)
-                {
+                if (pPropertyCount) {
                     vkStream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
                 }
-                if (pPropertyCount)
-                {
-                    if (pProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            transform_fromhost_VkSparseImageFormatProperties(m_state, (VkSparseImageFormatProperties*)(pProperties + i));
+                if (pPropertyCount) {
+                    if (pProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            transform_fromhost_VkSparseImageFormatProperties(
+                                m_state, (VkSparseImageFormatProperties*)(pProperties + i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pProperties;
                 vkStream->putBe64(cgen_var_4);
-                if (pProperties)
-                {
-                    if (pPropertyCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            marshal_VkSparseImageFormatProperties(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSparseImageFormatProperties*)(pProperties + i));
+                if (pProperties) {
+                    if (pPropertyCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            marshal_VkSparseImageFormatProperties(
+                                vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                (VkSparseImageFormatProperties*)(pProperties + i));
                         }
                     }
                 }
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceSparseImageFormatProperties(snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice, format, type, samples, usage, tiling, pPropertyCount, pProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceSparseImageFormatProperties(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice, format,
+                        type, samples, usage, tiling, pPropertyCount, pProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkQueueBindSparse:
-            {
+            case OP_vkQueueBindSparse: {
                 android::base::beginTrace("vkQueueBindSparse decode");
                 VkQueue queue;
                 uint32_t bindInfoCount;
@@ -2197,45 +2426,52 @@
                 *(VkQueue*)&queue = (VkQueue)(VkQueue)((VkQueue)(*&cgen_var_0));
                 memcpy((uint32_t*)&bindInfoCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pBindInfo, ((bindInfoCount)) * sizeof(const VkBindSparseInfo));
-                for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
-                {
-                    reservedunmarshal_VkBindSparseInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBindSparseInfo*)(pBindInfo + i), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pBindInfo,
+                                    ((bindInfoCount)) * sizeof(const VkBindSparseInfo));
+                for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
+                    reservedunmarshal_VkBindSparseInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                       (VkBindSparseInfo*)(pBindInfo + i),
+                                                       readStreamPtrPtr);
                 }
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkFence*)&fence = (VkFence)unbox_VkFence((VkFence)(*&cgen_var_1));
-                if (pBindInfo)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
-                    {
-                        transform_tohost_VkBindSparseInfo(m_state, (VkBindSparseInfo*)(pBindInfo + i));
+                if (pBindInfo) {
+                    for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
+                        transform_tohost_VkBindSparseInfo(m_state,
+                                                          (VkBindSparseInfo*)(pBindInfo + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkQueueBindSparse 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)queue, (unsigned long long)bindInfoCount, (unsigned long long)pBindInfo, (unsigned long long)fence);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkQueueBindSparse 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)queue, (unsigned long long)bindInfoCount,
+                            (unsigned long long)pBindInfo, (unsigned long long)fence);
                 }
                 VkResult vkQueueBindSparse_VkResult_return = (VkResult)0;
-                vkQueueBindSparse_VkResult_return = m_state->on_vkQueueBindSparse(&m_pool, queue, bindInfoCount, pBindInfo, fence);
-                if ((vkQueueBindSparse_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkQueueBindSparse_VkResult_return =
+                    m_state->on_vkQueueBindSparse(&m_pool, queue, bindInfoCount, pBindInfo, fence);
+                if ((vkQueueBindSparse_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkQueueBindSparse_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkQueueBindSparse(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkQueueBindSparse_VkResult_return, queue, bindInfoCount, pBindInfo, fence);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkQueueBindSparse(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkQueueBindSparse_VkResult_return, queue, bindInfoCount, pBindInfo, fence);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCreateFence:
-            {
+            case OP_vkCreateFence: {
                 android::base::beginTrace("vkCreateFence decode");
                 VkDevice device;
                 const VkFenceCreateInfo* pCreateInfo;
@@ -2247,15 +2483,18 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkFenceCreateInfo));
-                reservedunmarshal_VkFenceCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkFenceCreateInfo*)(pCreateInfo), readStreamPtrPtr);
+                reservedunmarshal_VkFenceCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                    (VkFenceCreateInfo*)(pCreateInfo),
+                                                    readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pFence;
                 vkReadStream->unsetHandleMapping();
@@ -2264,45 +2503,50 @@
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
                 *(VkFence*)pFence = (VkFence)(VkFence)((VkFence)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
+                if (pCreateInfo) {
                     transform_tohost_VkFenceCreateInfo(m_state, (VkFenceCreateInfo*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateFence 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pFence);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCreateFence 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pFence);
                 }
                 VkResult vkCreateFence_VkResult_return = (VkResult)0;
-                vkCreateFence_VkResult_return = m_state->on_vkCreateFence(&m_pool, device, pCreateInfo, pAllocator, pFence);
-                if ((vkCreateFence_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateFence_VkResult_return =
+                    m_state->on_vkCreateFence(&m_pool, device, pCreateInfo, pAllocator, pFence);
+                if ((vkCreateFence_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // Begin manual non dispatchable handle create for pFence;
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3;
-                static_assert(8 == sizeof(VkFence), "handle map overwrite requires VkFence to be 8 bytes long");
+                static_assert(8 == sizeof(VkFence),
+                              "handle map overwrite requires VkFence to be 8 bytes long");
                 vkStream->handleMapping()->mapHandles_VkFence((VkFence*)pFence, 1);
                 vkStream->write((VkFence*)pFence, 8 * 1);
                 // Begin manual non dispatchable handle create for pFence;
                 vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
                 vkStream->write(&vkCreateFence_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateFence(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateFence_VkResult_return, device, pCreateInfo, pAllocator, pFence);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateFence(snapshotTraceBegin, snapshotTraceBytes,
+                                                       &m_pool, vkCreateFence_VkResult_return,
+                                                       device, pCreateInfo, pAllocator, pFence);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroyFence:
-            {
+            case OP_vkDestroyFence: {
                 android::base::beginTrace("vkDestroyFence decode");
                 VkDevice device;
                 VkFence fence;
@@ -2324,35 +2568,39 @@
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroyFence 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)fence, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkDestroyFence 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)fence,
+                            (unsigned long long)pAllocator);
                 }
                 m_state->on_vkDestroyFence(&m_pool, device, fence, pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroyFence(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, boxed_fence_preserve, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroyFence(snapshotTraceBegin, snapshotTraceBytes,
+                                                        &m_pool, device, boxed_fence_preserve,
+                                                        pAllocator);
                 }
                 delete_VkFence(boxed_fence_preserve);
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkResetFences:
-            {
+            case OP_vkResetFences: {
                 android::base::beginTrace("vkResetFences decode");
                 VkDevice device;
                 uint32_t fenceCount;
@@ -2365,39 +2613,43 @@
                 memcpy((uint32_t*)&fenceCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 vkReadStream->alloc((void**)&pFences, ((fenceCount)) * sizeof(const VkFence));
-                if (((fenceCount)))
-                {
+                if (((fenceCount))) {
                     uint8_t* cgen_var_1_ptr = (uint8_t*)(*readStreamPtrPtr);
                     *readStreamPtrPtr += 8 * ((fenceCount));
-                    for (uint32_t k = 0; k < ((fenceCount)); ++k)
-                    {
-                        uint64_t tmpval; memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
+                    for (uint32_t k = 0; k < ((fenceCount)); ++k) {
+                        uint64_t tmpval;
+                        memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
                         *(((VkFence*)pFences) + k) = (VkFence)unbox_VkFence((VkFence)tmpval);
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkResetFences 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)fenceCount, (unsigned long long)pFences);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkResetFences 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)fenceCount,
+                            (unsigned long long)pFences);
                 }
                 VkResult vkResetFences_VkResult_return = (VkResult)0;
-                vkResetFences_VkResult_return = m_state->on_vkResetFences(&m_pool, device, fenceCount, pFences);
-                if ((vkResetFences_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkResetFences_VkResult_return =
+                    m_state->on_vkResetFences(&m_pool, device, fenceCount, pFences);
+                if ((vkResetFences_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkResetFences_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkResetFences(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkResetFences_VkResult_return, device, fenceCount, pFences);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkResetFences(snapshotTraceBegin, snapshotTraceBytes,
+                                                       &m_pool, vkResetFences_VkResult_return,
+                                                       device, fenceCount, pFences);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetFenceStatus:
-            {
+            case OP_vkGetFenceStatus: {
                 android::base::beginTrace("vkGetFenceStatus decode");
                 VkDevice device;
                 VkFence fence;
@@ -2413,29 +2665,32 @@
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkFence*)&fence = (VkFence)unbox_VkFence((VkFence)(*&cgen_var_1));
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetFenceStatus 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)fence);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkGetFenceStatus 0x%llx 0x%llx \n", ioStream,
+                            (unsigned long long)device, (unsigned long long)fence);
                 }
                 VkResult vkGetFenceStatus_VkResult_return = (VkResult)0;
                 vkGetFenceStatus_VkResult_return = vk->vkGetFenceStatus(unboxed_device, fence);
-                if ((vkGetFenceStatus_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                if ((vkGetFenceStatus_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkGetFenceStatus_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetFenceStatus(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetFenceStatus_VkResult_return, device, fence);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetFenceStatus(snapshotTraceBegin, snapshotTraceBytes,
+                                                          &m_pool, vkGetFenceStatus_VkResult_return,
+                                                          device, fence);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkWaitForFences:
-            {
+            case OP_vkWaitForFences: {
                 android::base::beginTrace("vkWaitForFences decode");
                 VkDevice device;
                 uint32_t fenceCount;
@@ -2453,13 +2708,12 @@
                 memcpy((uint32_t*)&fenceCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 vkReadStream->alloc((void**)&pFences, ((fenceCount)) * sizeof(const VkFence));
-                if (((fenceCount)))
-                {
+                if (((fenceCount))) {
                     uint8_t* cgen_var_1_ptr = (uint8_t*)(*readStreamPtrPtr);
                     *readStreamPtrPtr += 8 * ((fenceCount));
-                    for (uint32_t k = 0; k < ((fenceCount)); ++k)
-                    {
-                        uint64_t tmpval; memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
+                    for (uint32_t k = 0; k < ((fenceCount)); ++k) {
+                        uint64_t tmpval;
+                        memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
                         *(((VkFence*)pFences) + k) = (VkFence)unbox_VkFence((VkFence)tmpval);
                     }
                 }
@@ -2467,29 +2721,37 @@
                 *readStreamPtrPtr += sizeof(VkBool32);
                 memcpy((uint64_t*)&timeout, *readStreamPtrPtr, sizeof(uint64_t));
                 *readStreamPtrPtr += sizeof(uint64_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkWaitForFences 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)fenceCount, (unsigned long long)pFences, (unsigned long long)waitAll, (unsigned long long)timeout);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkWaitForFences 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)fenceCount,
+                            (unsigned long long)pFences, (unsigned long long)waitAll,
+                            (unsigned long long)timeout);
                 }
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 VkResult vkWaitForFences_VkResult_return = (VkResult)0;
-                vkWaitForFences_VkResult_return = vk->vkWaitForFences(unboxed_device, fenceCount, pFences, waitAll, timeout);
-                if ((vkWaitForFences_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkWaitForFences_VkResult_return =
+                    vk->vkWaitForFences(unboxed_device, fenceCount, pFences, waitAll, timeout);
+                if ((vkWaitForFences_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkWaitForFences_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkWaitForFences(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkWaitForFences_VkResult_return, device, fenceCount, pFences, waitAll, timeout);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkWaitForFences(snapshotTraceBegin, snapshotTraceBytes,
+                                                         &m_pool, vkWaitForFences_VkResult_return,
+                                                         device, fenceCount, pFences, waitAll,
+                                                         timeout);
                 }
                 vkReadStream->clearPool();
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCreateSemaphore:
-            {
+            case OP_vkCreateSemaphore: {
                 android::base::beginTrace("vkCreateSemaphore decode");
                 VkDevice device;
                 const VkSemaphoreCreateInfo* pCreateInfo;
@@ -2501,15 +2763,18 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkSemaphoreCreateInfo));
-                reservedunmarshal_VkSemaphoreCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSemaphoreCreateInfo*)(pCreateInfo), readStreamPtrPtr);
+                reservedunmarshal_VkSemaphoreCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                        (VkSemaphoreCreateInfo*)(pCreateInfo),
+                                                        readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pSemaphore;
                 vkReadStream->unsetHandleMapping();
@@ -2518,45 +2783,53 @@
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
                 *(VkSemaphore*)pSemaphore = (VkSemaphore)(VkSemaphore)((VkSemaphore)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkSemaphoreCreateInfo(m_state, (VkSemaphoreCreateInfo*)(pCreateInfo));
+                if (pCreateInfo) {
+                    transform_tohost_VkSemaphoreCreateInfo(m_state,
+                                                           (VkSemaphoreCreateInfo*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateSemaphore 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pSemaphore);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateSemaphore 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pSemaphore);
                 }
                 VkResult vkCreateSemaphore_VkResult_return = (VkResult)0;
-                vkCreateSemaphore_VkResult_return = m_state->on_vkCreateSemaphore(&m_pool, device, pCreateInfo, pAllocator, pSemaphore);
-                if ((vkCreateSemaphore_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateSemaphore_VkResult_return = m_state->on_vkCreateSemaphore(
+                    &m_pool, device, pCreateInfo, pAllocator, pSemaphore);
+                if ((vkCreateSemaphore_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // Begin manual non dispatchable handle create for pSemaphore;
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3;
-                static_assert(8 == sizeof(VkSemaphore), "handle map overwrite requires VkSemaphore to be 8 bytes long");
+                static_assert(8 == sizeof(VkSemaphore),
+                              "handle map overwrite requires VkSemaphore to be 8 bytes long");
                 vkStream->handleMapping()->mapHandles_VkSemaphore((VkSemaphore*)pSemaphore, 1);
                 vkStream->write((VkSemaphore*)pSemaphore, 8 * 1);
                 // Begin manual non dispatchable handle create for pSemaphore;
                 vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
                 vkStream->write(&vkCreateSemaphore_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateSemaphore(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateSemaphore_VkResult_return, device, pCreateInfo, pAllocator, pSemaphore);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateSemaphore(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateSemaphore_VkResult_return, device, pCreateInfo, pAllocator,
+                        pSemaphore);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroySemaphore:
-            {
+            case OP_vkDestroySemaphore: {
                 android::base::beginTrace("vkDestroySemaphore decode");
                 VkDevice device;
                 VkSemaphore semaphore;
@@ -2578,35 +2851,39 @@
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroySemaphore 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)semaphore, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkDestroySemaphore 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)semaphore,
+                            (unsigned long long)pAllocator);
                 }
                 m_state->on_vkDestroySemaphore(&m_pool, device, semaphore, pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroySemaphore(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, boxed_semaphore_preserve, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroySemaphore(snapshotTraceBegin, snapshotTraceBytes,
+                                                            &m_pool, device,
+                                                            boxed_semaphore_preserve, pAllocator);
                 }
                 delete_VkSemaphore(boxed_semaphore_preserve);
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCreateEvent:
-            {
+            case OP_vkCreateEvent: {
                 android::base::beginTrace("vkCreateEvent decode");
                 VkDevice device;
                 const VkEventCreateInfo* pCreateInfo;
@@ -2621,15 +2898,18 @@
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkEventCreateInfo));
-                reservedunmarshal_VkEventCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkEventCreateInfo*)(pCreateInfo), readStreamPtrPtr);
+                reservedunmarshal_VkEventCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                    (VkEventCreateInfo*)(pCreateInfo),
+                                                    readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pEvent;
                 vkReadStream->unsetHandleMapping();
@@ -2638,45 +2918,51 @@
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
                 *(VkEvent*)pEvent = (VkEvent)(VkEvent)((VkEvent)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
+                if (pCreateInfo) {
                     transform_tohost_VkEventCreateInfo(m_state, (VkEventCreateInfo*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateEvent 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pEvent);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCreateEvent 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pEvent);
                 }
                 VkResult vkCreateEvent_VkResult_return = (VkResult)0;
-                vkCreateEvent_VkResult_return = vk->vkCreateEvent(unboxed_device, pCreateInfo, pAllocator, pEvent);
-                if ((vkCreateEvent_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateEvent_VkResult_return =
+                    vk->vkCreateEvent(unboxed_device, pCreateInfo, pAllocator, pEvent);
+                if ((vkCreateEvent_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // Begin auto non dispatchable handle create for pEvent;
-                if (vkCreateEvent_VkResult_return == VK_SUCCESS) vkStream->setHandleMapping(&m_boxedHandleCreateMapping);
+                if (vkCreateEvent_VkResult_return == VK_SUCCESS)
+                    vkStream->setHandleMapping(&m_boxedHandleCreateMapping);
                 uint64_t cgen_var_3;
-                static_assert(8 == sizeof(VkEvent), "handle map overwrite requires VkEvent to be 8 bytes long");
+                static_assert(8 == sizeof(VkEvent),
+                              "handle map overwrite requires VkEvent to be 8 bytes long");
                 vkStream->handleMapping()->mapHandles_VkEvent((VkEvent*)pEvent, 1);
                 vkStream->write((VkEvent*)pEvent, 8 * 1);
                 // Begin auto non dispatchable handle create for pEvent;
                 vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
                 vkStream->write(&vkCreateEvent_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateEvent(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateEvent_VkResult_return, device, pCreateInfo, pAllocator, pEvent);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateEvent(snapshotTraceBegin, snapshotTraceBytes,
+                                                       &m_pool, vkCreateEvent_VkResult_return,
+                                                       device, pCreateInfo, pAllocator, pEvent);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroyEvent:
-            {
+            case OP_vkDestroyEvent: {
                 android::base::beginTrace("vkDestroyEvent decode");
                 VkDevice device;
                 VkEvent event;
@@ -2701,35 +2987,39 @@
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroyEvent 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)event, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkDestroyEvent 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)event,
+                            (unsigned long long)pAllocator);
                 }
                 vk->vkDestroyEvent(unboxed_device, event, pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroyEvent(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, boxed_event_preserve, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroyEvent(snapshotTraceBegin, snapshotTraceBytes,
+                                                        &m_pool, device, boxed_event_preserve,
+                                                        pAllocator);
                 }
                 delete_VkEvent(boxed_event_preserve);
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetEventStatus:
-            {
+            case OP_vkGetEventStatus: {
                 android::base::beginTrace("vkGetEventStatus decode");
                 VkDevice device;
                 VkEvent event;
@@ -2745,29 +3035,32 @@
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkEvent*)&event = (VkEvent)unbox_VkEvent((VkEvent)(*&cgen_var_1));
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetEventStatus 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)event);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkGetEventStatus 0x%llx 0x%llx \n", ioStream,
+                            (unsigned long long)device, (unsigned long long)event);
                 }
                 VkResult vkGetEventStatus_VkResult_return = (VkResult)0;
                 vkGetEventStatus_VkResult_return = vk->vkGetEventStatus(unboxed_device, event);
-                if ((vkGetEventStatus_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                if ((vkGetEventStatus_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkGetEventStatus_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetEventStatus(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetEventStatus_VkResult_return, device, event);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetEventStatus(snapshotTraceBegin, snapshotTraceBytes,
+                                                          &m_pool, vkGetEventStatus_VkResult_return,
+                                                          device, event);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkSetEvent:
-            {
+            case OP_vkSetEvent: {
                 android::base::beginTrace("vkSetEvent decode");
                 VkDevice device;
                 VkEvent event;
@@ -2783,9 +3076,9 @@
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkEvent*)&event = (VkEvent)unbox_VkEvent((VkEvent)(*&cgen_var_1));
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkSetEvent 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)event);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkSetEvent 0x%llx 0x%llx \n", ioStream,
+                            (unsigned long long)device, (unsigned long long)event);
                 }
                 VkResult vkSetEvent_VkResult_return = (VkResult)0;
                 vkSetEvent_VkResult_return = vk->vkSetEvent(unboxed_device, event);
@@ -2793,19 +3086,20 @@
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkSetEvent_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkSetEvent(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkSetEvent_VkResult_return, device, event);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkSetEvent(snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                                                    vkSetEvent_VkResult_return, device, event);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkResetEvent:
-            {
+            case OP_vkResetEvent: {
                 android::base::beginTrace("vkResetEvent decode");
                 VkDevice device;
                 VkEvent event;
@@ -2821,29 +3115,32 @@
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkEvent*)&event = (VkEvent)unbox_VkEvent((VkEvent)(*&cgen_var_1));
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkResetEvent 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)event);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkResetEvent 0x%llx 0x%llx \n", ioStream,
+                            (unsigned long long)device, (unsigned long long)event);
                 }
                 VkResult vkResetEvent_VkResult_return = (VkResult)0;
                 vkResetEvent_VkResult_return = vk->vkResetEvent(unboxed_device, event);
-                if ((vkResetEvent_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                if ((vkResetEvent_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkResetEvent_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkResetEvent(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkResetEvent_VkResult_return, device, event);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkResetEvent(snapshotTraceBegin, snapshotTraceBytes,
+                                                      &m_pool, vkResetEvent_VkResult_return, device,
+                                                      event);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCreateQueryPool:
-            {
+            case OP_vkCreateQueryPool: {
                 android::base::beginTrace("vkCreateQueryPool decode");
                 VkDevice device;
                 const VkQueryPoolCreateInfo* pCreateInfo;
@@ -2858,15 +3155,18 @@
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkQueryPoolCreateInfo));
-                reservedunmarshal_VkQueryPoolCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkQueryPoolCreateInfo*)(pCreateInfo), readStreamPtrPtr);
+                reservedunmarshal_VkQueryPoolCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                        (VkQueryPoolCreateInfo*)(pCreateInfo),
+                                                        readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pQueryPool;
                 vkReadStream->unsetHandleMapping();
@@ -2875,45 +3175,54 @@
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
                 *(VkQueryPool*)pQueryPool = (VkQueryPool)(VkQueryPool)((VkQueryPool)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkQueryPoolCreateInfo(m_state, (VkQueryPoolCreateInfo*)(pCreateInfo));
+                if (pCreateInfo) {
+                    transform_tohost_VkQueryPoolCreateInfo(m_state,
+                                                           (VkQueryPoolCreateInfo*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateQueryPool 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pQueryPool);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateQueryPool 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pQueryPool);
                 }
                 VkResult vkCreateQueryPool_VkResult_return = (VkResult)0;
-                vkCreateQueryPool_VkResult_return = vk->vkCreateQueryPool(unboxed_device, pCreateInfo, pAllocator, pQueryPool);
-                if ((vkCreateQueryPool_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateQueryPool_VkResult_return =
+                    vk->vkCreateQueryPool(unboxed_device, pCreateInfo, pAllocator, pQueryPool);
+                if ((vkCreateQueryPool_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // Begin auto non dispatchable handle create for pQueryPool;
-                if (vkCreateQueryPool_VkResult_return == VK_SUCCESS) vkStream->setHandleMapping(&m_boxedHandleCreateMapping);
+                if (vkCreateQueryPool_VkResult_return == VK_SUCCESS)
+                    vkStream->setHandleMapping(&m_boxedHandleCreateMapping);
                 uint64_t cgen_var_3;
-                static_assert(8 == sizeof(VkQueryPool), "handle map overwrite requires VkQueryPool to be 8 bytes long");
+                static_assert(8 == sizeof(VkQueryPool),
+                              "handle map overwrite requires VkQueryPool to be 8 bytes long");
                 vkStream->handleMapping()->mapHandles_VkQueryPool((VkQueryPool*)pQueryPool, 1);
                 vkStream->write((VkQueryPool*)pQueryPool, 8 * 1);
                 // Begin auto non dispatchable handle create for pQueryPool;
                 vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
                 vkStream->write(&vkCreateQueryPool_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateQueryPool(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateQueryPool_VkResult_return, device, pCreateInfo, pAllocator, pQueryPool);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateQueryPool(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateQueryPool_VkResult_return, device, pCreateInfo, pAllocator,
+                        pQueryPool);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroyQueryPool:
-            {
+            case OP_vkDestroyQueryPool: {
                 android::base::beginTrace("vkDestroyQueryPool decode");
                 VkDevice device;
                 VkQueryPool queryPool;
@@ -2938,35 +3247,39 @@
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroyQueryPool 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)queryPool, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkDestroyQueryPool 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)queryPool,
+                            (unsigned long long)pAllocator);
                 }
                 vk->vkDestroyQueryPool(unboxed_device, queryPool, pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroyQueryPool(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, boxed_queryPool_preserve, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroyQueryPool(snapshotTraceBegin, snapshotTraceBytes,
+                                                            &m_pool, device,
+                                                            boxed_queryPool_preserve, pAllocator);
                 }
                 delete_VkQueryPool(boxed_queryPool_preserve);
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetQueryPoolResults:
-            {
+            case OP_vkGetQueryPoolResults: {
                 android::base::beginTrace("vkGetQueryPoolResults decode");
                 VkDevice device;
                 VkQueryPool queryPool;
@@ -2987,7 +3300,8 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkQueryPool*)&queryPool = (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_1));
+                *(VkQueryPool*)&queryPool =
+                    (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_1));
                 memcpy((uint32_t*)&firstQuery, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&queryCount, *readStreamPtrPtr, sizeof(uint32_t));
@@ -3004,30 +3318,41 @@
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
                 memcpy((VkQueryResultFlags*)&flags, *readStreamPtrPtr, sizeof(VkQueryResultFlags));
                 *readStreamPtrPtr += sizeof(VkQueryResultFlags);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetQueryPoolResults 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)queryPool, (unsigned long long)firstQuery, (unsigned long long)queryCount, (unsigned long long)dataSize, (unsigned long long)pData, (unsigned long long)stride, (unsigned long long)flags);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetQueryPoolResults 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)queryPool,
+                            (unsigned long long)firstQuery, (unsigned long long)queryCount,
+                            (unsigned long long)dataSize, (unsigned long long)pData,
+                            (unsigned long long)stride, (unsigned long long)flags);
                 }
                 VkResult vkGetQueryPoolResults_VkResult_return = (VkResult)0;
-                vkGetQueryPoolResults_VkResult_return = vk->vkGetQueryPoolResults(unboxed_device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
-                if ((vkGetQueryPoolResults_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetQueryPoolResults_VkResult_return =
+                    vk->vkGetQueryPoolResults(unboxed_device, queryPool, firstQuery, queryCount,
+                                              dataSize, pData, stride, flags);
+                if ((vkGetQueryPoolResults_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write((void*)pData, ((dataSize)) * sizeof(uint8_t));
                 vkStream->write(&vkGetQueryPoolResults_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetQueryPoolResults(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetQueryPoolResults_VkResult_return, device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetQueryPoolResults(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetQueryPoolResults_VkResult_return, device, queryPool, firstQuery,
+                        queryCount, dataSize, pData, stride, flags);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCreateBuffer:
-            {
+            case OP_vkCreateBuffer: {
                 android::base::beginTrace("vkCreateBuffer decode");
                 VkDevice device;
                 const VkBufferCreateInfo* pCreateInfo;
@@ -3039,15 +3364,18 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkBufferCreateInfo));
-                reservedunmarshal_VkBufferCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferCreateInfo*)(pCreateInfo), readStreamPtrPtr);
+                reservedunmarshal_VkBufferCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                     (VkBufferCreateInfo*)(pCreateInfo),
+                                                     readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pBuffer;
                 vkReadStream->unsetHandleMapping();
@@ -3056,45 +3384,51 @@
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
                 *(VkBuffer*)pBuffer = (VkBuffer)(VkBuffer)((VkBuffer)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkBufferCreateInfo(m_state, (VkBufferCreateInfo*)(pCreateInfo));
+                if (pCreateInfo) {
+                    transform_tohost_VkBufferCreateInfo(m_state,
+                                                        (VkBufferCreateInfo*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateBuffer 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pBuffer);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCreateBuffer 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pBuffer);
                 }
                 VkResult vkCreateBuffer_VkResult_return = (VkResult)0;
-                vkCreateBuffer_VkResult_return = m_state->on_vkCreateBuffer(&m_pool, device, pCreateInfo, pAllocator, pBuffer);
-                if ((vkCreateBuffer_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateBuffer_VkResult_return =
+                    m_state->on_vkCreateBuffer(&m_pool, device, pCreateInfo, pAllocator, pBuffer);
+                if ((vkCreateBuffer_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // Begin manual non dispatchable handle create for pBuffer;
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3;
-                static_assert(8 == sizeof(VkBuffer), "handle map overwrite requires VkBuffer to be 8 bytes long");
+                static_assert(8 == sizeof(VkBuffer),
+                              "handle map overwrite requires VkBuffer to be 8 bytes long");
                 vkStream->handleMapping()->mapHandles_VkBuffer((VkBuffer*)pBuffer, 1);
                 vkStream->write((VkBuffer*)pBuffer, 8 * 1);
                 // Begin manual non dispatchable handle create for pBuffer;
                 vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
                 vkStream->write(&vkCreateBuffer_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateBuffer(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateBuffer_VkResult_return, device, pCreateInfo, pAllocator, pBuffer);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateBuffer(snapshotTraceBegin, snapshotTraceBytes,
+                                                        &m_pool, vkCreateBuffer_VkResult_return,
+                                                        device, pCreateInfo, pAllocator, pBuffer);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroyBuffer:
-            {
+            case OP_vkDestroyBuffer: {
                 android::base::beginTrace("vkDestroyBuffer decode");
                 VkDevice device;
                 VkBuffer buffer;
@@ -3116,35 +3450,39 @@
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroyBuffer 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)buffer, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkDestroyBuffer 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)buffer,
+                            (unsigned long long)pAllocator);
                 }
                 m_state->on_vkDestroyBuffer(&m_pool, device, buffer, pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroyBuffer(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, boxed_buffer_preserve, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroyBuffer(snapshotTraceBegin, snapshotTraceBytes,
+                                                         &m_pool, device, boxed_buffer_preserve,
+                                                         pAllocator);
                 }
                 delete_VkBuffer(boxed_buffer_preserve);
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCreateBufferView:
-            {
+            case OP_vkCreateBufferView: {
                 android::base::beginTrace("vkCreateBufferView decode");
                 VkDevice device;
                 const VkBufferViewCreateInfo* pCreateInfo;
@@ -3159,15 +3497,18 @@
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkBufferViewCreateInfo));
-                reservedunmarshal_VkBufferViewCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferViewCreateInfo*)(pCreateInfo), readStreamPtrPtr);
+                reservedunmarshal_VkBufferViewCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                         (VkBufferViewCreateInfo*)(pCreateInfo),
+                                                         readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pView;
                 vkReadStream->unsetHandleMapping();
@@ -3176,45 +3517,53 @@
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
                 *(VkBufferView*)pView = (VkBufferView)(VkBufferView)((VkBufferView)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkBufferViewCreateInfo(m_state, (VkBufferViewCreateInfo*)(pCreateInfo));
+                if (pCreateInfo) {
+                    transform_tohost_VkBufferViewCreateInfo(m_state,
+                                                            (VkBufferViewCreateInfo*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateBufferView 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pView);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateBufferView 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pView);
                 }
                 VkResult vkCreateBufferView_VkResult_return = (VkResult)0;
-                vkCreateBufferView_VkResult_return = vk->vkCreateBufferView(unboxed_device, pCreateInfo, pAllocator, pView);
-                if ((vkCreateBufferView_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateBufferView_VkResult_return =
+                    vk->vkCreateBufferView(unboxed_device, pCreateInfo, pAllocator, pView);
+                if ((vkCreateBufferView_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // Begin auto non dispatchable handle create for pView;
-                if (vkCreateBufferView_VkResult_return == VK_SUCCESS) vkStream->setHandleMapping(&m_boxedHandleCreateMapping);
+                if (vkCreateBufferView_VkResult_return == VK_SUCCESS)
+                    vkStream->setHandleMapping(&m_boxedHandleCreateMapping);
                 uint64_t cgen_var_3;
-                static_assert(8 == sizeof(VkBufferView), "handle map overwrite requires VkBufferView to be 8 bytes long");
+                static_assert(8 == sizeof(VkBufferView),
+                              "handle map overwrite requires VkBufferView to be 8 bytes long");
                 vkStream->handleMapping()->mapHandles_VkBufferView((VkBufferView*)pView, 1);
                 vkStream->write((VkBufferView*)pView, 8 * 1);
                 // Begin auto non dispatchable handle create for pView;
                 vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
                 vkStream->write(&vkCreateBufferView_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateBufferView(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateBufferView_VkResult_return, device, pCreateInfo, pAllocator, pView);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateBufferView(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateBufferView_VkResult_return, device, pCreateInfo, pAllocator, pView);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroyBufferView:
-            {
+            case OP_vkDestroyBufferView: {
                 android::base::beginTrace("vkDestroyBufferView decode");
                 VkDevice device;
                 VkBufferView bufferView;
@@ -3232,42 +3581,47 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkBufferView*)&bufferView = (VkBufferView)(VkBufferView)((VkBufferView)(*&cgen_var_1));
+                *(VkBufferView*)&bufferView =
+                    (VkBufferView)(VkBufferView)((VkBufferView)(*&cgen_var_1));
                 boxed_bufferView_preserve = bufferView;
                 bufferView = unbox_VkBufferView(bufferView);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroyBufferView 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)bufferView, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkDestroyBufferView 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)bufferView,
+                            (unsigned long long)pAllocator);
                 }
                 vk->vkDestroyBufferView(unboxed_device, bufferView, pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroyBufferView(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, boxed_bufferView_preserve, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroyBufferView(snapshotTraceBegin, snapshotTraceBytes,
+                                                             &m_pool, device,
+                                                             boxed_bufferView_preserve, pAllocator);
                 }
                 delete_VkBufferView(boxed_bufferView_preserve);
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCreateImage:
-            {
+            case OP_vkCreateImage: {
                 android::base::beginTrace("vkCreateImage decode");
                 VkDevice device;
                 const VkImageCreateInfo* pCreateInfo;
@@ -3279,15 +3633,18 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkImageCreateInfo));
-                reservedunmarshal_VkImageCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageCreateInfo*)(pCreateInfo), readStreamPtrPtr);
+                reservedunmarshal_VkImageCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                    (VkImageCreateInfo*)(pCreateInfo),
+                                                    readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pImage;
                 vkReadStream->unsetHandleMapping();
@@ -3296,46 +3653,51 @@
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
                 *(VkImage*)pImage = (VkImage)(VkImage)((VkImage)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
+                if (pCreateInfo) {
                     m_state->transformImpl_VkImageCreateInfo_tohost(pCreateInfo, 1);
                     transform_tohost_VkImageCreateInfo(m_state, (VkImageCreateInfo*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateImage 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pImage);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCreateImage 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pImage);
                 }
                 VkResult vkCreateImage_VkResult_return = (VkResult)0;
-                vkCreateImage_VkResult_return = m_state->on_vkCreateImage(&m_pool, device, pCreateInfo, pAllocator, pImage);
-                if ((vkCreateImage_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateImage_VkResult_return =
+                    m_state->on_vkCreateImage(&m_pool, device, pCreateInfo, pAllocator, pImage);
+                if ((vkCreateImage_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // Begin manual non dispatchable handle create for pImage;
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3;
-                static_assert(8 == sizeof(VkImage), "handle map overwrite requires VkImage to be 8 bytes long");
+                static_assert(8 == sizeof(VkImage),
+                              "handle map overwrite requires VkImage to be 8 bytes long");
                 vkStream->handleMapping()->mapHandles_VkImage((VkImage*)pImage, 1);
                 vkStream->write((VkImage*)pImage, 8 * 1);
                 // Begin manual non dispatchable handle create for pImage;
                 vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
                 vkStream->write(&vkCreateImage_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateImage(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateImage_VkResult_return, device, pCreateInfo, pAllocator, pImage);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateImage(snapshotTraceBegin, snapshotTraceBytes,
+                                                       &m_pool, vkCreateImage_VkResult_return,
+                                                       device, pCreateInfo, pAllocator, pImage);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroyImage:
-            {
+            case OP_vkDestroyImage: {
                 android::base::beginTrace("vkDestroyImage decode");
                 VkDevice device;
                 VkImage image;
@@ -3357,35 +3719,39 @@
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroyImage 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)image, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkDestroyImage 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)image,
+                            (unsigned long long)pAllocator);
                 }
                 m_state->on_vkDestroyImage(&m_pool, device, image, pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroyImage(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, boxed_image_preserve, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroyImage(snapshotTraceBegin, snapshotTraceBytes,
+                                                        &m_pool, device, boxed_image_preserve,
+                                                        pAllocator);
                 }
                 delete_VkImage(boxed_image_preserve);
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetImageSubresourceLayout:
-            {
+            case OP_vkGetImageSubresourceLayout: {
                 android::base::beginTrace("vkGetImageSubresourceLayout decode");
                 VkDevice device;
                 VkImage image;
@@ -3404,44 +3770,53 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkImage*)&image = (VkImage)unbox_VkImage((VkImage)(*&cgen_var_1));
                 vkReadStream->alloc((void**)&pSubresource, sizeof(const VkImageSubresource));
-                reservedunmarshal_VkImageSubresource(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageSubresource*)(pSubresource), readStreamPtrPtr);
+                reservedunmarshal_VkImageSubresource(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                     (VkImageSubresource*)(pSubresource),
+                                                     readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pLayout;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pLayout, sizeof(VkSubresourceLayout));
-                reservedunmarshal_VkSubresourceLayout(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubresourceLayout*)(pLayout), readStreamPtrPtr);
-                if (pSubresource)
-                {
-                    transform_tohost_VkImageSubresource(m_state, (VkImageSubresource*)(pSubresource));
+                reservedunmarshal_VkSubresourceLayout(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                      (VkSubresourceLayout*)(pLayout),
+                                                      readStreamPtrPtr);
+                if (pSubresource) {
+                    transform_tohost_VkImageSubresource(m_state,
+                                                        (VkImageSubresource*)(pSubresource));
                 }
-                if (pLayout)
-                {
+                if (pLayout) {
                     transform_tohost_VkSubresourceLayout(m_state, (VkSubresourceLayout*)(pLayout));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetImageSubresourceLayout 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)image, (unsigned long long)pSubresource, (unsigned long long)pLayout);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetImageSubresourceLayout 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)image,
+                            (unsigned long long)pSubresource, (unsigned long long)pLayout);
                 }
                 vk->vkGetImageSubresourceLayout(unboxed_device, image, pSubresource, pLayout);
                 vkStream->unsetHandleMapping();
-                if (pLayout)
-                {
-                    transform_fromhost_VkSubresourceLayout(m_state, (VkSubresourceLayout*)(pLayout));
+                if (pLayout) {
+                    transform_fromhost_VkSubresourceLayout(m_state,
+                                                           (VkSubresourceLayout*)(pLayout));
                 }
-                marshal_VkSubresourceLayout(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubresourceLayout*)(pLayout));
+                marshal_VkSubresourceLayout(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                            (VkSubresourceLayout*)(pLayout));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetImageSubresourceLayout(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, image, pSubresource, pLayout);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetImageSubresourceLayout(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, image,
+                        pSubresource, pLayout);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCreateImageView:
-            {
+            case OP_vkCreateImageView: {
                 android::base::beginTrace("vkCreateImageView decode");
                 VkDevice device;
                 const VkImageViewCreateInfo* pCreateInfo;
@@ -3453,15 +3828,18 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkImageViewCreateInfo));
-                reservedunmarshal_VkImageViewCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageViewCreateInfo*)(pCreateInfo), readStreamPtrPtr);
+                reservedunmarshal_VkImageViewCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                        (VkImageViewCreateInfo*)(pCreateInfo),
+                                                        readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pView;
                 vkReadStream->unsetHandleMapping();
@@ -3470,45 +3848,52 @@
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
                 *(VkImageView*)pView = (VkImageView)(VkImageView)((VkImageView)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkImageViewCreateInfo(m_state, (VkImageViewCreateInfo*)(pCreateInfo));
+                if (pCreateInfo) {
+                    transform_tohost_VkImageViewCreateInfo(m_state,
+                                                           (VkImageViewCreateInfo*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateImageView 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pView);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateImageView 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pView);
                 }
                 VkResult vkCreateImageView_VkResult_return = (VkResult)0;
-                vkCreateImageView_VkResult_return = m_state->on_vkCreateImageView(&m_pool, device, pCreateInfo, pAllocator, pView);
-                if ((vkCreateImageView_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateImageView_VkResult_return =
+                    m_state->on_vkCreateImageView(&m_pool, device, pCreateInfo, pAllocator, pView);
+                if ((vkCreateImageView_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // Begin manual non dispatchable handle create for pView;
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3;
-                static_assert(8 == sizeof(VkImageView), "handle map overwrite requires VkImageView to be 8 bytes long");
+                static_assert(8 == sizeof(VkImageView),
+                              "handle map overwrite requires VkImageView to be 8 bytes long");
                 vkStream->handleMapping()->mapHandles_VkImageView((VkImageView*)pView, 1);
                 vkStream->write((VkImageView*)pView, 8 * 1);
                 // Begin manual non dispatchable handle create for pView;
                 vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
                 vkStream->write(&vkCreateImageView_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateImageView(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateImageView_VkResult_return, device, pCreateInfo, pAllocator, pView);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateImageView(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateImageView_VkResult_return, device, pCreateInfo, pAllocator, pView);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroyImageView:
-            {
+            case OP_vkDestroyImageView: {
                 android::base::beginTrace("vkDestroyImageView decode");
                 VkDevice device;
                 VkImageView imageView;
@@ -3530,35 +3915,39 @@
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroyImageView 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)imageView, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkDestroyImageView 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)imageView,
+                            (unsigned long long)pAllocator);
                 }
                 m_state->on_vkDestroyImageView(&m_pool, device, imageView, pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroyImageView(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, boxed_imageView_preserve, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroyImageView(snapshotTraceBegin, snapshotTraceBytes,
+                                                            &m_pool, device,
+                                                            boxed_imageView_preserve, pAllocator);
                 }
                 delete_VkImageView(boxed_imageView_preserve);
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCreateShaderModule:
-            {
+            case OP_vkCreateShaderModule: {
                 android::base::beginTrace("vkCreateShaderModule decode");
                 VkDevice device;
                 const VkShaderModuleCreateInfo* pCreateInfo;
@@ -3570,15 +3959,18 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkShaderModuleCreateInfo));
-                reservedunmarshal_VkShaderModuleCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkShaderModuleCreateInfo*)(pCreateInfo), readStreamPtrPtr);
+                reservedunmarshal_VkShaderModuleCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                           (VkShaderModuleCreateInfo*)(pCreateInfo),
+                                                           readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pShaderModule;
                 vkReadStream->unsetHandleMapping();
@@ -3586,46 +3978,56 @@
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkShaderModule*)pShaderModule = (VkShaderModule)(VkShaderModule)((VkShaderModule)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkShaderModuleCreateInfo(m_state, (VkShaderModuleCreateInfo*)(pCreateInfo));
+                *(VkShaderModule*)pShaderModule =
+                    (VkShaderModule)(VkShaderModule)((VkShaderModule)(*&cgen_var_2));
+                if (pCreateInfo) {
+                    transform_tohost_VkShaderModuleCreateInfo(
+                        m_state, (VkShaderModuleCreateInfo*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateShaderModule 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pShaderModule);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateShaderModule 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pShaderModule);
                 }
                 VkResult vkCreateShaderModule_VkResult_return = (VkResult)0;
-                vkCreateShaderModule_VkResult_return = m_state->on_vkCreateShaderModule(&m_pool, device, pCreateInfo, pAllocator, pShaderModule);
-                if ((vkCreateShaderModule_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateShaderModule_VkResult_return = m_state->on_vkCreateShaderModule(
+                    &m_pool, device, pCreateInfo, pAllocator, pShaderModule);
+                if ((vkCreateShaderModule_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // Begin manual non dispatchable handle create for pShaderModule;
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3;
-                static_assert(8 == sizeof(VkShaderModule), "handle map overwrite requires VkShaderModule to be 8 bytes long");
-                vkStream->handleMapping()->mapHandles_VkShaderModule((VkShaderModule*)pShaderModule, 1);
+                static_assert(8 == sizeof(VkShaderModule),
+                              "handle map overwrite requires VkShaderModule to be 8 bytes long");
+                vkStream->handleMapping()->mapHandles_VkShaderModule((VkShaderModule*)pShaderModule,
+                                                                     1);
                 vkStream->write((VkShaderModule*)pShaderModule, 8 * 1);
                 // Begin manual non dispatchable handle create for pShaderModule;
                 vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
                 vkStream->write(&vkCreateShaderModule_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateShaderModule(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateShaderModule_VkResult_return, device, pCreateInfo, pAllocator, pShaderModule);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateShaderModule(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateShaderModule_VkResult_return, device, pCreateInfo, pAllocator,
+                        pShaderModule);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroyShaderModule:
-            {
+            case OP_vkDestroyShaderModule: {
                 android::base::beginTrace("vkDestroyShaderModule decode");
                 VkDevice device;
                 VkShaderModule shaderModule;
@@ -3640,42 +4042,47 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkShaderModule*)&shaderModule = (VkShaderModule)(VkShaderModule)((VkShaderModule)(*&cgen_var_1));
+                *(VkShaderModule*)&shaderModule =
+                    (VkShaderModule)(VkShaderModule)((VkShaderModule)(*&cgen_var_1));
                 boxed_shaderModule_preserve = shaderModule;
                 shaderModule = unbox_VkShaderModule(shaderModule);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroyShaderModule 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)shaderModule, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkDestroyShaderModule 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)shaderModule,
+                            (unsigned long long)pAllocator);
                 }
                 m_state->on_vkDestroyShaderModule(&m_pool, device, shaderModule, pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroyShaderModule(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, boxed_shaderModule_preserve, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroyShaderModule(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device,
+                        boxed_shaderModule_preserve, pAllocator);
                 }
                 delete_VkShaderModule(boxed_shaderModule_preserve);
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCreatePipelineCache:
-            {
+            case OP_vkCreatePipelineCache: {
                 android::base::beginTrace("vkCreatePipelineCache decode");
                 VkDevice device;
                 const VkPipelineCacheCreateInfo* pCreateInfo;
@@ -3687,15 +4094,18 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkPipelineCacheCreateInfo));
-                reservedunmarshal_VkPipelineCacheCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPipelineCacheCreateInfo*)(pCreateInfo), readStreamPtrPtr);
+                reservedunmarshal_VkPipelineCacheCreateInfo(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPipelineCacheCreateInfo*)(pCreateInfo), readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pPipelineCache;
                 vkReadStream->unsetHandleMapping();
@@ -3703,46 +4113,56 @@
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkPipelineCache*)pPipelineCache = (VkPipelineCache)(VkPipelineCache)((VkPipelineCache)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkPipelineCacheCreateInfo(m_state, (VkPipelineCacheCreateInfo*)(pCreateInfo));
+                *(VkPipelineCache*)pPipelineCache =
+                    (VkPipelineCache)(VkPipelineCache)((VkPipelineCache)(*&cgen_var_2));
+                if (pCreateInfo) {
+                    transform_tohost_VkPipelineCacheCreateInfo(
+                        m_state, (VkPipelineCacheCreateInfo*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreatePipelineCache 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pPipelineCache);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreatePipelineCache 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pPipelineCache);
                 }
                 VkResult vkCreatePipelineCache_VkResult_return = (VkResult)0;
-                vkCreatePipelineCache_VkResult_return = m_state->on_vkCreatePipelineCache(&m_pool, device, pCreateInfo, pAllocator, pPipelineCache);
-                if ((vkCreatePipelineCache_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreatePipelineCache_VkResult_return = m_state->on_vkCreatePipelineCache(
+                    &m_pool, device, pCreateInfo, pAllocator, pPipelineCache);
+                if ((vkCreatePipelineCache_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // Begin manual non dispatchable handle create for pPipelineCache;
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3;
-                static_assert(8 == sizeof(VkPipelineCache), "handle map overwrite requires VkPipelineCache to be 8 bytes long");
-                vkStream->handleMapping()->mapHandles_VkPipelineCache((VkPipelineCache*)pPipelineCache, 1);
+                static_assert(8 == sizeof(VkPipelineCache),
+                              "handle map overwrite requires VkPipelineCache to be 8 bytes long");
+                vkStream->handleMapping()->mapHandles_VkPipelineCache(
+                    (VkPipelineCache*)pPipelineCache, 1);
                 vkStream->write((VkPipelineCache*)pPipelineCache, 8 * 1);
                 // Begin manual non dispatchable handle create for pPipelineCache;
                 vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
                 vkStream->write(&vkCreatePipelineCache_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreatePipelineCache(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreatePipelineCache_VkResult_return, device, pCreateInfo, pAllocator, pPipelineCache);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreatePipelineCache(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreatePipelineCache_VkResult_return, device, pCreateInfo, pAllocator,
+                        pPipelineCache);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroyPipelineCache:
-            {
+            case OP_vkDestroyPipelineCache: {
                 android::base::beginTrace("vkDestroyPipelineCache decode");
                 VkDevice device;
                 VkPipelineCache pipelineCache;
@@ -3757,42 +4177,48 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPipelineCache*)&pipelineCache = (VkPipelineCache)(VkPipelineCache)((VkPipelineCache)(*&cgen_var_1));
+                *(VkPipelineCache*)&pipelineCache =
+                    (VkPipelineCache)(VkPipelineCache)((VkPipelineCache)(*&cgen_var_1));
                 boxed_pipelineCache_preserve = pipelineCache;
                 pipelineCache = unbox_VkPipelineCache(pipelineCache);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroyPipelineCache 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pipelineCache, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkDestroyPipelineCache 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pipelineCache,
+                            (unsigned long long)pAllocator);
                 }
                 m_state->on_vkDestroyPipelineCache(&m_pool, device, pipelineCache, pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroyPipelineCache(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, boxed_pipelineCache_preserve, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroyPipelineCache(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device,
+                        boxed_pipelineCache_preserve, pAllocator);
                 }
                 delete_VkPipelineCache(boxed_pipelineCache_preserve);
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPipelineCacheData:
-            {
+            case OP_vkGetPipelineCacheData: {
                 android::base::beginTrace("vkGetPipelineCacheData decode");
                 VkDevice device;
                 VkPipelineCache pipelineCache;
@@ -3809,15 +4235,15 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPipelineCache*)&pipelineCache = (VkPipelineCache)unbox_VkPipelineCache((VkPipelineCache)(*&cgen_var_1));
+                *(VkPipelineCache*)&pipelineCache =
+                    (VkPipelineCache)unbox_VkPipelineCache((VkPipelineCache)(*&cgen_var_1));
                 // Begin manual dispatchable handle unboxing for pDataSize;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 memcpy((size_t**)&pDataSize, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pDataSize);
                 *readStreamPtrPtr += 8;
-                if (pDataSize)
-                {
+                if (pDataSize) {
                     vkReadStream->alloc((void**)&pDataSize, sizeof(size_t));
                     memcpy((size_t*)&(*pDataSize), (*readStreamPtrPtr), 8);
                     android::base::Stream::fromBe64((uint8_t*)&(*pDataSize));
@@ -3829,50 +4255,54 @@
                 memcpy((void**)&pData, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pData);
                 *readStreamPtrPtr += 8;
-                if (pData)
-                {
+                if (pData) {
                     vkReadStream->alloc((void**)&pData, (*(pDataSize)) * sizeof(uint8_t));
                     memcpy((void*)pData, *readStreamPtrPtr, (*(pDataSize)) * sizeof(uint8_t));
                     *readStreamPtrPtr += (*(pDataSize)) * sizeof(uint8_t);
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPipelineCacheData 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pipelineCache, (unsigned long long)pDataSize, (unsigned long long)pData);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPipelineCacheData 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pipelineCache,
+                            (unsigned long long)pDataSize, (unsigned long long)pData);
                 }
                 VkResult vkGetPipelineCacheData_VkResult_return = (VkResult)0;
-                vkGetPipelineCacheData_VkResult_return = vk->vkGetPipelineCacheData(unboxed_device, pipelineCache, pDataSize, pData);
-                if ((vkGetPipelineCacheData_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetPipelineCacheData_VkResult_return =
+                    vk->vkGetPipelineCacheData(unboxed_device, pipelineCache, pDataSize, pData);
+                if ((vkGetPipelineCacheData_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pDataSize;
                 vkStream->putBe64(cgen_var_4);
-                if (pDataSize)
-                {
+                if (pDataSize) {
                     uint64_t cgen_var_4_0 = (uint64_t)(*pDataSize);
                     vkStream->putBe64(cgen_var_4_0);
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_5 = (uint64_t)(uintptr_t)pData;
                 vkStream->putBe64(cgen_var_5);
-                if (pData)
-                {
+                if (pData) {
                     vkStream->write((void*)pData, (*(pDataSize)) * sizeof(uint8_t));
                 }
                 vkStream->write(&vkGetPipelineCacheData_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPipelineCacheData(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetPipelineCacheData_VkResult_return, device, pipelineCache, pDataSize, pData);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPipelineCacheData(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetPipelineCacheData_VkResult_return, device, pipelineCache, pDataSize,
+                        pData);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkMergePipelineCaches:
-            {
+            case OP_vkMergePipelineCaches: {
                 android::base::beginTrace("vkMergePipelineCaches decode");
                 VkDevice device;
                 VkPipelineCache dstCache;
@@ -3889,43 +4319,52 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPipelineCache*)&dstCache = (VkPipelineCache)unbox_VkPipelineCache((VkPipelineCache)(*&cgen_var_1));
+                *(VkPipelineCache*)&dstCache =
+                    (VkPipelineCache)unbox_VkPipelineCache((VkPipelineCache)(*&cgen_var_1));
                 memcpy((uint32_t*)&srcCacheCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pSrcCaches, ((srcCacheCount)) * sizeof(const VkPipelineCache));
-                if (((srcCacheCount)))
-                {
+                vkReadStream->alloc((void**)&pSrcCaches,
+                                    ((srcCacheCount)) * sizeof(const VkPipelineCache));
+                if (((srcCacheCount))) {
                     uint8_t* cgen_var_2_ptr = (uint8_t*)(*readStreamPtrPtr);
                     *readStreamPtrPtr += 8 * ((srcCacheCount));
-                    for (uint32_t k = 0; k < ((srcCacheCount)); ++k)
-                    {
-                        uint64_t tmpval; memcpy(&tmpval, cgen_var_2_ptr + k * 8, sizeof(uint64_t));
-                        *(((VkPipelineCache*)pSrcCaches) + k) = (VkPipelineCache)unbox_VkPipelineCache((VkPipelineCache)tmpval);
+                    for (uint32_t k = 0; k < ((srcCacheCount)); ++k) {
+                        uint64_t tmpval;
+                        memcpy(&tmpval, cgen_var_2_ptr + k * 8, sizeof(uint64_t));
+                        *(((VkPipelineCache*)pSrcCaches) + k) =
+                            (VkPipelineCache)unbox_VkPipelineCache((VkPipelineCache)tmpval);
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkMergePipelineCaches 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)dstCache, (unsigned long long)srcCacheCount, (unsigned long long)pSrcCaches);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkMergePipelineCaches 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)dstCache,
+                            (unsigned long long)srcCacheCount, (unsigned long long)pSrcCaches);
                 }
                 VkResult vkMergePipelineCaches_VkResult_return = (VkResult)0;
-                vkMergePipelineCaches_VkResult_return = vk->vkMergePipelineCaches(unboxed_device, dstCache, srcCacheCount, pSrcCaches);
-                if ((vkMergePipelineCaches_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkMergePipelineCaches_VkResult_return =
+                    vk->vkMergePipelineCaches(unboxed_device, dstCache, srcCacheCount, pSrcCaches);
+                if ((vkMergePipelineCaches_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkMergePipelineCaches_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkMergePipelineCaches(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkMergePipelineCaches_VkResult_return, device, dstCache, srcCacheCount, pSrcCaches);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkMergePipelineCaches(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkMergePipelineCaches_VkResult_return, device, dstCache, srcCacheCount,
+                        pSrcCaches);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCreateGraphicsPipelines:
-            {
+            case OP_vkCreateGraphicsPipelines: {
                 android::base::beginTrace("vkCreateGraphicsPipelines decode");
                 VkDevice device;
                 VkPipelineCache pipelineCache;
@@ -3941,82 +4380,97 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPipelineCache*)&pipelineCache = (VkPipelineCache)unbox_VkPipelineCache((VkPipelineCache)(*&cgen_var_1));
+                *(VkPipelineCache*)&pipelineCache =
+                    (VkPipelineCache)unbox_VkPipelineCache((VkPipelineCache)(*&cgen_var_1));
                 memcpy((uint32_t*)&createInfoCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pCreateInfos, ((createInfoCount)) * sizeof(const VkGraphicsPipelineCreateInfo));
-                for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i)
-                {
-                    reservedunmarshal_VkGraphicsPipelineCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkGraphicsPipelineCreateInfo*)(pCreateInfos + i), readStreamPtrPtr);
+                vkReadStream->alloc(
+                    (void**)&pCreateInfos,
+                    ((createInfoCount)) * sizeof(const VkGraphicsPipelineCreateInfo));
+                for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i) {
+                    reservedunmarshal_VkGraphicsPipelineCreateInfo(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkGraphicsPipelineCreateInfo*)(pCreateInfos + i), readStreamPtrPtr);
                 }
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pPipelines;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pPipelines, ((createInfoCount)) * sizeof(VkPipeline));
-                if (((createInfoCount)))
-                {
+                if (((createInfoCount))) {
                     uint8_t* cgen_var_3_ptr = (uint8_t*)(*readStreamPtrPtr);
                     *readStreamPtrPtr += 8 * ((createInfoCount));
-                    for (uint32_t k = 0; k < ((createInfoCount)); ++k)
-                    {
-                        uint64_t tmpval; memcpy(&tmpval, cgen_var_3_ptr + k * 8, sizeof(uint64_t));
-                        *(((VkPipeline*)pPipelines) + k) = (VkPipeline)(VkPipeline)((VkPipeline)tmpval);
+                    for (uint32_t k = 0; k < ((createInfoCount)); ++k) {
+                        uint64_t tmpval;
+                        memcpy(&tmpval, cgen_var_3_ptr + k * 8, sizeof(uint64_t));
+                        *(((VkPipeline*)pPipelines) + k) =
+                            (VkPipeline)(VkPipeline)((VkPipeline)tmpval);
                     }
                 }
-                if (pCreateInfos)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i)
-                    {
-                        transform_tohost_VkGraphicsPipelineCreateInfo(m_state, (VkGraphicsPipelineCreateInfo*)(pCreateInfos + i));
+                if (pCreateInfos) {
+                    for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i) {
+                        transform_tohost_VkGraphicsPipelineCreateInfo(
+                            m_state, (VkGraphicsPipelineCreateInfo*)(pCreateInfos + i));
                     }
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateGraphicsPipelines 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pipelineCache, (unsigned long long)createInfoCount, (unsigned long long)pCreateInfos, (unsigned long long)pAllocator, (unsigned long long)pPipelines);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateGraphicsPipelines 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pipelineCache,
+                            (unsigned long long)createInfoCount, (unsigned long long)pCreateInfos,
+                            (unsigned long long)pAllocator, (unsigned long long)pPipelines);
                 }
                 VkResult vkCreateGraphicsPipelines_VkResult_return = (VkResult)0;
-                vkCreateGraphicsPipelines_VkResult_return = m_state->on_vkCreateGraphicsPipelines(&m_pool, device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
-                if ((vkCreateGraphicsPipelines_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateGraphicsPipelines_VkResult_return = m_state->on_vkCreateGraphicsPipelines(
+                    &m_pool, device, pipelineCache, createInfoCount, pCreateInfos, pAllocator,
+                    pPipelines);
+                if ((vkCreateGraphicsPipelines_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // Begin manual non dispatchable handle create for pPipelines;
                 vkStream->unsetHandleMapping();
-                if (((createInfoCount)))
-                {
+                if (((createInfoCount))) {
                     uint64_t* cgen_var_4;
                     vkStream->alloc((void**)&cgen_var_4, ((createInfoCount)) * 8);
-                    static_assert(8 == sizeof(VkPipeline), "handle map overwrite requires VkPipeline to be 8 bytes long");
-                    vkStream->handleMapping()->mapHandles_VkPipeline((VkPipeline*)pPipelines, ((createInfoCount)));
+                    static_assert(8 == sizeof(VkPipeline),
+                                  "handle map overwrite requires VkPipeline to be 8 bytes long");
+                    vkStream->handleMapping()->mapHandles_VkPipeline((VkPipeline*)pPipelines,
+                                                                     ((createInfoCount)));
                     vkStream->write((VkPipeline*)pPipelines, 8 * ((createInfoCount)));
                 }
                 // Begin manual non dispatchable handle create for pPipelines;
                 vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
                 vkStream->write(&vkCreateGraphicsPipelines_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateGraphicsPipelines(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateGraphicsPipelines_VkResult_return, device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateGraphicsPipelines(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateGraphicsPipelines_VkResult_return, device, pipelineCache,
+                        createInfoCount, pCreateInfos, pAllocator, pPipelines);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCreateComputePipelines:
-            {
+            case OP_vkCreateComputePipelines: {
                 android::base::beginTrace("vkCreateComputePipelines decode");
                 VkDevice device;
                 VkPipelineCache pipelineCache;
@@ -4035,82 +4489,98 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPipelineCache*)&pipelineCache = (VkPipelineCache)unbox_VkPipelineCache((VkPipelineCache)(*&cgen_var_1));
+                *(VkPipelineCache*)&pipelineCache =
+                    (VkPipelineCache)unbox_VkPipelineCache((VkPipelineCache)(*&cgen_var_1));
                 memcpy((uint32_t*)&createInfoCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pCreateInfos, ((createInfoCount)) * sizeof(const VkComputePipelineCreateInfo));
-                for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i)
-                {
-                    reservedunmarshal_VkComputePipelineCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkComputePipelineCreateInfo*)(pCreateInfos + i), readStreamPtrPtr);
+                vkReadStream->alloc(
+                    (void**)&pCreateInfos,
+                    ((createInfoCount)) * sizeof(const VkComputePipelineCreateInfo));
+                for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i) {
+                    reservedunmarshal_VkComputePipelineCreateInfo(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkComputePipelineCreateInfo*)(pCreateInfos + i), readStreamPtrPtr);
                 }
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pPipelines;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pPipelines, ((createInfoCount)) * sizeof(VkPipeline));
-                if (((createInfoCount)))
-                {
+                if (((createInfoCount))) {
                     uint8_t* cgen_var_3_ptr = (uint8_t*)(*readStreamPtrPtr);
                     *readStreamPtrPtr += 8 * ((createInfoCount));
-                    for (uint32_t k = 0; k < ((createInfoCount)); ++k)
-                    {
-                        uint64_t tmpval; memcpy(&tmpval, cgen_var_3_ptr + k * 8, sizeof(uint64_t));
-                        *(((VkPipeline*)pPipelines) + k) = (VkPipeline)(VkPipeline)((VkPipeline)tmpval);
+                    for (uint32_t k = 0; k < ((createInfoCount)); ++k) {
+                        uint64_t tmpval;
+                        memcpy(&tmpval, cgen_var_3_ptr + k * 8, sizeof(uint64_t));
+                        *(((VkPipeline*)pPipelines) + k) =
+                            (VkPipeline)(VkPipeline)((VkPipeline)tmpval);
                     }
                 }
-                if (pCreateInfos)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i)
-                    {
-                        transform_tohost_VkComputePipelineCreateInfo(m_state, (VkComputePipelineCreateInfo*)(pCreateInfos + i));
+                if (pCreateInfos) {
+                    for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i) {
+                        transform_tohost_VkComputePipelineCreateInfo(
+                            m_state, (VkComputePipelineCreateInfo*)(pCreateInfos + i));
                     }
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateComputePipelines 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pipelineCache, (unsigned long long)createInfoCount, (unsigned long long)pCreateInfos, (unsigned long long)pAllocator, (unsigned long long)pPipelines);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateComputePipelines 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pipelineCache,
+                            (unsigned long long)createInfoCount, (unsigned long long)pCreateInfos,
+                            (unsigned long long)pAllocator, (unsigned long long)pPipelines);
                 }
                 VkResult vkCreateComputePipelines_VkResult_return = (VkResult)0;
-                vkCreateComputePipelines_VkResult_return = vk->vkCreateComputePipelines(unboxed_device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
-                if ((vkCreateComputePipelines_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateComputePipelines_VkResult_return =
+                    vk->vkCreateComputePipelines(unboxed_device, pipelineCache, createInfoCount,
+                                                 pCreateInfos, pAllocator, pPipelines);
+                if ((vkCreateComputePipelines_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // Begin auto non dispatchable handle create for pPipelines;
-                if (vkCreateComputePipelines_VkResult_return == VK_SUCCESS) vkStream->setHandleMapping(&m_boxedHandleCreateMapping);
-                if (((createInfoCount)))
-                {
+                if (vkCreateComputePipelines_VkResult_return == VK_SUCCESS)
+                    vkStream->setHandleMapping(&m_boxedHandleCreateMapping);
+                if (((createInfoCount))) {
                     uint64_t* cgen_var_4;
                     vkStream->alloc((void**)&cgen_var_4, ((createInfoCount)) * 8);
-                    static_assert(8 == sizeof(VkPipeline), "handle map overwrite requires VkPipeline to be 8 bytes long");
-                    vkStream->handleMapping()->mapHandles_VkPipeline((VkPipeline*)pPipelines, ((createInfoCount)));
+                    static_assert(8 == sizeof(VkPipeline),
+                                  "handle map overwrite requires VkPipeline to be 8 bytes long");
+                    vkStream->handleMapping()->mapHandles_VkPipeline((VkPipeline*)pPipelines,
+                                                                     ((createInfoCount)));
                     vkStream->write((VkPipeline*)pPipelines, 8 * ((createInfoCount)));
                 }
                 // Begin auto non dispatchable handle create for pPipelines;
                 vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
                 vkStream->write(&vkCreateComputePipelines_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateComputePipelines(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateComputePipelines_VkResult_return, device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateComputePipelines(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateComputePipelines_VkResult_return, device, pipelineCache,
+                        createInfoCount, pCreateInfos, pAllocator, pPipelines);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroyPipeline:
-            {
+            case OP_vkDestroyPipeline: {
                 android::base::beginTrace("vkDestroyPipeline decode");
                 VkDevice device;
                 VkPipeline pipeline;
@@ -4132,35 +4602,39 @@
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroyPipeline 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pipeline, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkDestroyPipeline 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pipeline,
+                            (unsigned long long)pAllocator);
                 }
                 m_state->on_vkDestroyPipeline(&m_pool, device, pipeline, pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroyPipeline(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, boxed_pipeline_preserve, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroyPipeline(snapshotTraceBegin, snapshotTraceBytes,
+                                                           &m_pool, device, boxed_pipeline_preserve,
+                                                           pAllocator);
                 }
                 delete_VkPipeline(boxed_pipeline_preserve);
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCreatePipelineLayout:
-            {
+            case OP_vkCreatePipelineLayout: {
                 android::base::beginTrace("vkCreatePipelineLayout decode");
                 VkDevice device;
                 const VkPipelineLayoutCreateInfo* pCreateInfo;
@@ -4175,15 +4649,18 @@
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkPipelineLayoutCreateInfo));
-                reservedunmarshal_VkPipelineLayoutCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPipelineLayoutCreateInfo*)(pCreateInfo), readStreamPtrPtr);
+                reservedunmarshal_VkPipelineLayoutCreateInfo(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPipelineLayoutCreateInfo*)(pCreateInfo), readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pPipelineLayout;
                 vkReadStream->unsetHandleMapping();
@@ -4191,48 +4668,59 @@
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkPipelineLayout*)pPipelineLayout = (VkPipelineLayout)(VkPipelineLayout)((VkPipelineLayout)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkPipelineLayoutCreateInfo(m_state, (VkPipelineLayoutCreateInfo*)(pCreateInfo));
+                *(VkPipelineLayout*)pPipelineLayout =
+                    (VkPipelineLayout)(VkPipelineLayout)((VkPipelineLayout)(*&cgen_var_2));
+                if (pCreateInfo) {
+                    transform_tohost_VkPipelineLayoutCreateInfo(
+                        m_state, (VkPipelineLayoutCreateInfo*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreatePipelineLayout 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pPipelineLayout);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreatePipelineLayout 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pPipelineLayout);
                 }
                 m_state->lock();
                 VkResult vkCreatePipelineLayout_VkResult_return = (VkResult)0;
-                vkCreatePipelineLayout_VkResult_return = vk->vkCreatePipelineLayout(unboxed_device, pCreateInfo, pAllocator, pPipelineLayout);
-                if ((vkCreatePipelineLayout_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreatePipelineLayout_VkResult_return = vk->vkCreatePipelineLayout(
+                    unboxed_device, pCreateInfo, pAllocator, pPipelineLayout);
+                if ((vkCreatePipelineLayout_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 m_state->unlock();
                 vkStream->unsetHandleMapping();
                 // Begin auto non dispatchable handle create for pPipelineLayout;
-                if (vkCreatePipelineLayout_VkResult_return == VK_SUCCESS) vkStream->setHandleMapping(&m_boxedHandleCreateMapping);
+                if (vkCreatePipelineLayout_VkResult_return == VK_SUCCESS)
+                    vkStream->setHandleMapping(&m_boxedHandleCreateMapping);
                 uint64_t cgen_var_3;
-                static_assert(8 == sizeof(VkPipelineLayout), "handle map overwrite requires VkPipelineLayout to be 8 bytes long");
-                vkStream->handleMapping()->mapHandles_VkPipelineLayout((VkPipelineLayout*)pPipelineLayout, 1);
+                static_assert(8 == sizeof(VkPipelineLayout),
+                              "handle map overwrite requires VkPipelineLayout to be 8 bytes long");
+                vkStream->handleMapping()->mapHandles_VkPipelineLayout(
+                    (VkPipelineLayout*)pPipelineLayout, 1);
                 vkStream->write((VkPipelineLayout*)pPipelineLayout, 8 * 1);
                 // Begin auto non dispatchable handle create for pPipelineLayout;
                 vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
                 vkStream->write(&vkCreatePipelineLayout_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreatePipelineLayout(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreatePipelineLayout_VkResult_return, device, pCreateInfo, pAllocator, pPipelineLayout);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreatePipelineLayout(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreatePipelineLayout_VkResult_return, device, pCreateInfo, pAllocator,
+                        pPipelineLayout);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroyPipelineLayout:
-            {
+            case OP_vkDestroyPipelineLayout: {
                 android::base::beginTrace("vkDestroyPipelineLayout decode");
                 VkDevice device;
                 VkPipelineLayout pipelineLayout;
@@ -4250,46 +4738,54 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPipelineLayout*)&pipelineLayout = (VkPipelineLayout)(VkPipelineLayout)((VkPipelineLayout)(*&cgen_var_1));
+                *(VkPipelineLayout*)&pipelineLayout =
+                    (VkPipelineLayout)(VkPipelineLayout)((VkPipelineLayout)(*&cgen_var_1));
                 boxed_pipelineLayout_preserve = pipelineLayout;
                 pipelineLayout = unbox_VkPipelineLayout(pipelineLayout);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroyPipelineLayout 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pipelineLayout, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkDestroyPipelineLayout 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device,
+                            (unsigned long long)pipelineLayout, (unsigned long long)pAllocator);
                 }
-                std::function<void()> delayed_remove_callback = [vk, unboxed_device, pipelineLayout, pAllocator]() {
-                auto state = VkDecoderGlobalState::get();
-                // state already locked;
-                vk->vkDestroyPipelineLayout(unboxed_device, pipelineLayout, pAllocator);
+                std::function<void()> delayed_remove_callback = [vk, unboxed_device, pipelineLayout,
+                                                                 pAllocator]() {
+                    auto state = VkDecoderGlobalState::get();
+                    // state already locked;
+                    vk->vkDestroyPipelineLayout(unboxed_device, pipelineLayout, pAllocator);
                 };
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroyPipelineLayout(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, boxed_pipelineLayout_preserve, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroyPipelineLayout(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device,
+                        boxed_pipelineLayout_preserve, pAllocator);
                 }
-                delayed_delete_VkPipelineLayout(boxed_pipelineLayout_preserve, unboxed_device, delayed_remove_callback);
+                delayed_delete_VkPipelineLayout(boxed_pipelineLayout_preserve, unboxed_device,
+                                                delayed_remove_callback);
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCreateSampler:
-            {
+            case OP_vkCreateSampler: {
                 android::base::beginTrace("vkCreateSampler decode");
                 VkDevice device;
                 const VkSamplerCreateInfo* pCreateInfo;
@@ -4301,15 +4797,18 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkSamplerCreateInfo));
-                reservedunmarshal_VkSamplerCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSamplerCreateInfo*)(pCreateInfo), readStreamPtrPtr);
+                reservedunmarshal_VkSamplerCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                      (VkSamplerCreateInfo*)(pCreateInfo),
+                                                      readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pSampler;
                 vkReadStream->unsetHandleMapping();
@@ -4318,45 +4817,52 @@
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
                 *(VkSampler*)pSampler = (VkSampler)(VkSampler)((VkSampler)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkSamplerCreateInfo(m_state, (VkSamplerCreateInfo*)(pCreateInfo));
+                if (pCreateInfo) {
+                    transform_tohost_VkSamplerCreateInfo(m_state,
+                                                         (VkSamplerCreateInfo*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateSampler 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pSampler);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateSampler 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pSampler);
                 }
                 VkResult vkCreateSampler_VkResult_return = (VkResult)0;
-                vkCreateSampler_VkResult_return = m_state->on_vkCreateSampler(&m_pool, device, pCreateInfo, pAllocator, pSampler);
-                if ((vkCreateSampler_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateSampler_VkResult_return =
+                    m_state->on_vkCreateSampler(&m_pool, device, pCreateInfo, pAllocator, pSampler);
+                if ((vkCreateSampler_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // Begin manual non dispatchable handle create for pSampler;
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3;
-                static_assert(8 == sizeof(VkSampler), "handle map overwrite requires VkSampler to be 8 bytes long");
+                static_assert(8 == sizeof(VkSampler),
+                              "handle map overwrite requires VkSampler to be 8 bytes long");
                 vkStream->handleMapping()->mapHandles_VkSampler((VkSampler*)pSampler, 1);
                 vkStream->write((VkSampler*)pSampler, 8 * 1);
                 // Begin manual non dispatchable handle create for pSampler;
                 vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
                 vkStream->write(&vkCreateSampler_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateSampler(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateSampler_VkResult_return, device, pCreateInfo, pAllocator, pSampler);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateSampler(snapshotTraceBegin, snapshotTraceBytes,
+                                                         &m_pool, vkCreateSampler_VkResult_return,
+                                                         device, pCreateInfo, pAllocator, pSampler);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroySampler:
-            {
+            case OP_vkDestroySampler: {
                 android::base::beginTrace("vkDestroySampler decode");
                 VkDevice device;
                 VkSampler sampler;
@@ -4378,35 +4884,39 @@
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroySampler 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)sampler, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkDestroySampler 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)sampler,
+                            (unsigned long long)pAllocator);
                 }
                 m_state->on_vkDestroySampler(&m_pool, device, sampler, pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroySampler(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, boxed_sampler_preserve, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroySampler(snapshotTraceBegin, snapshotTraceBytes,
+                                                          &m_pool, device, boxed_sampler_preserve,
+                                                          pAllocator);
                 }
                 delete_VkSampler(boxed_sampler_preserve);
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCreateDescriptorSetLayout:
-            {
+            case OP_vkCreateDescriptorSetLayout: {
                 android::base::beginTrace("vkCreateDescriptorSetLayout decode");
                 VkDevice device;
                 const VkDescriptorSetLayoutCreateInfo* pCreateInfo;
@@ -4417,16 +4927,20 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
-                vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkDescriptorSetLayoutCreateInfo));
-                reservedunmarshal_VkDescriptorSetLayoutCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorSetLayoutCreateInfo*)(pCreateInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pCreateInfo,
+                                    sizeof(const VkDescriptorSetLayoutCreateInfo));
+                reservedunmarshal_VkDescriptorSetLayoutCreateInfo(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkDescriptorSetLayoutCreateInfo*)(pCreateInfo), readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pSetLayout;
                 vkReadStream->unsetHandleMapping();
@@ -4434,46 +4948,60 @@
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkDescriptorSetLayout*)pSetLayout = (VkDescriptorSetLayout)(VkDescriptorSetLayout)((VkDescriptorSetLayout)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkDescriptorSetLayoutCreateInfo(m_state, (VkDescriptorSetLayoutCreateInfo*)(pCreateInfo));
+                *(VkDescriptorSetLayout*)pSetLayout =
+                    (VkDescriptorSetLayout)(VkDescriptorSetLayout)((
+                        VkDescriptorSetLayout)(*&cgen_var_2));
+                if (pCreateInfo) {
+                    transform_tohost_VkDescriptorSetLayoutCreateInfo(
+                        m_state, (VkDescriptorSetLayoutCreateInfo*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateDescriptorSetLayout 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pSetLayout);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateDescriptorSetLayout 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pSetLayout);
                 }
                 VkResult vkCreateDescriptorSetLayout_VkResult_return = (VkResult)0;
-                vkCreateDescriptorSetLayout_VkResult_return = m_state->on_vkCreateDescriptorSetLayout(&m_pool, device, pCreateInfo, pAllocator, pSetLayout);
-                if ((vkCreateDescriptorSetLayout_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateDescriptorSetLayout_VkResult_return =
+                    m_state->on_vkCreateDescriptorSetLayout(&m_pool, device, pCreateInfo,
+                                                            pAllocator, pSetLayout);
+                if ((vkCreateDescriptorSetLayout_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // Begin manual non dispatchable handle create for pSetLayout;
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3;
-                static_assert(8 == sizeof(VkDescriptorSetLayout), "handle map overwrite requires VkDescriptorSetLayout to be 8 bytes long");
-                vkStream->handleMapping()->mapHandles_VkDescriptorSetLayout((VkDescriptorSetLayout*)pSetLayout, 1);
+                static_assert(
+                    8 == sizeof(VkDescriptorSetLayout),
+                    "handle map overwrite requires VkDescriptorSetLayout to be 8 bytes long");
+                vkStream->handleMapping()->mapHandles_VkDescriptorSetLayout(
+                    (VkDescriptorSetLayout*)pSetLayout, 1);
                 vkStream->write((VkDescriptorSetLayout*)pSetLayout, 8 * 1);
                 // Begin manual non dispatchable handle create for pSetLayout;
                 vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
                 vkStream->write(&vkCreateDescriptorSetLayout_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateDescriptorSetLayout(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateDescriptorSetLayout_VkResult_return, device, pCreateInfo, pAllocator, pSetLayout);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateDescriptorSetLayout(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateDescriptorSetLayout_VkResult_return, device, pCreateInfo,
+                        pAllocator, pSetLayout);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroyDescriptorSetLayout:
-            {
+            case OP_vkDestroyDescriptorSetLayout: {
                 android::base::beginTrace("vkDestroyDescriptorSetLayout decode");
                 VkDevice device;
                 VkDescriptorSetLayout descriptorSetLayout;
@@ -4488,42 +5016,51 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDescriptorSetLayout*)&descriptorSetLayout = (VkDescriptorSetLayout)(VkDescriptorSetLayout)((VkDescriptorSetLayout)(*&cgen_var_1));
+                *(VkDescriptorSetLayout*)&descriptorSetLayout =
+                    (VkDescriptorSetLayout)(VkDescriptorSetLayout)((
+                        VkDescriptorSetLayout)(*&cgen_var_1));
                 boxed_descriptorSetLayout_preserve = descriptorSetLayout;
                 descriptorSetLayout = unbox_VkDescriptorSetLayout(descriptorSetLayout);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroyDescriptorSetLayout 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)descriptorSetLayout, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkDestroyDescriptorSetLayout 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device,
+                            (unsigned long long)descriptorSetLayout,
+                            (unsigned long long)pAllocator);
                 }
-                m_state->on_vkDestroyDescriptorSetLayout(&m_pool, device, descriptorSetLayout, pAllocator);
+                m_state->on_vkDestroyDescriptorSetLayout(&m_pool, device, descriptorSetLayout,
+                                                         pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroyDescriptorSetLayout(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, boxed_descriptorSetLayout_preserve, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroyDescriptorSetLayout(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device,
+                        boxed_descriptorSetLayout_preserve, pAllocator);
                 }
                 delete_VkDescriptorSetLayout(boxed_descriptorSetLayout_preserve);
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCreateDescriptorPool:
-            {
+            case OP_vkCreateDescriptorPool: {
                 android::base::beginTrace("vkCreateDescriptorPool decode");
                 VkDevice device;
                 const VkDescriptorPoolCreateInfo* pCreateInfo;
@@ -4535,15 +5072,18 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkDescriptorPoolCreateInfo));
-                reservedunmarshal_VkDescriptorPoolCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorPoolCreateInfo*)(pCreateInfo), readStreamPtrPtr);
+                reservedunmarshal_VkDescriptorPoolCreateInfo(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkDescriptorPoolCreateInfo*)(pCreateInfo), readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pDescriptorPool;
                 vkReadStream->unsetHandleMapping();
@@ -4551,46 +5091,56 @@
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkDescriptorPool*)pDescriptorPool = (VkDescriptorPool)(VkDescriptorPool)((VkDescriptorPool)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkDescriptorPoolCreateInfo(m_state, (VkDescriptorPoolCreateInfo*)(pCreateInfo));
+                *(VkDescriptorPool*)pDescriptorPool =
+                    (VkDescriptorPool)(VkDescriptorPool)((VkDescriptorPool)(*&cgen_var_2));
+                if (pCreateInfo) {
+                    transform_tohost_VkDescriptorPoolCreateInfo(
+                        m_state, (VkDescriptorPoolCreateInfo*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateDescriptorPool 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pDescriptorPool);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateDescriptorPool 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pDescriptorPool);
                 }
                 VkResult vkCreateDescriptorPool_VkResult_return = (VkResult)0;
-                vkCreateDescriptorPool_VkResult_return = m_state->on_vkCreateDescriptorPool(&m_pool, device, pCreateInfo, pAllocator, pDescriptorPool);
-                if ((vkCreateDescriptorPool_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateDescriptorPool_VkResult_return = m_state->on_vkCreateDescriptorPool(
+                    &m_pool, device, pCreateInfo, pAllocator, pDescriptorPool);
+                if ((vkCreateDescriptorPool_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // Begin manual non dispatchable handle create for pDescriptorPool;
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3;
-                static_assert(8 == sizeof(VkDescriptorPool), "handle map overwrite requires VkDescriptorPool to be 8 bytes long");
-                vkStream->handleMapping()->mapHandles_VkDescriptorPool((VkDescriptorPool*)pDescriptorPool, 1);
+                static_assert(8 == sizeof(VkDescriptorPool),
+                              "handle map overwrite requires VkDescriptorPool to be 8 bytes long");
+                vkStream->handleMapping()->mapHandles_VkDescriptorPool(
+                    (VkDescriptorPool*)pDescriptorPool, 1);
                 vkStream->write((VkDescriptorPool*)pDescriptorPool, 8 * 1);
                 // Begin manual non dispatchable handle create for pDescriptorPool;
                 vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
                 vkStream->write(&vkCreateDescriptorPool_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateDescriptorPool(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateDescriptorPool_VkResult_return, device, pCreateInfo, pAllocator, pDescriptorPool);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateDescriptorPool(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateDescriptorPool_VkResult_return, device, pCreateInfo, pAllocator,
+                        pDescriptorPool);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroyDescriptorPool:
-            {
+            case OP_vkDestroyDescriptorPool: {
                 android::base::beginTrace("vkDestroyDescriptorPool decode");
                 VkDevice device;
                 VkDescriptorPool descriptorPool;
@@ -4605,42 +5155,48 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDescriptorPool*)&descriptorPool = (VkDescriptorPool)(VkDescriptorPool)((VkDescriptorPool)(*&cgen_var_1));
+                *(VkDescriptorPool*)&descriptorPool =
+                    (VkDescriptorPool)(VkDescriptorPool)((VkDescriptorPool)(*&cgen_var_1));
                 boxed_descriptorPool_preserve = descriptorPool;
                 descriptorPool = unbox_VkDescriptorPool(descriptorPool);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroyDescriptorPool 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)descriptorPool, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkDestroyDescriptorPool 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device,
+                            (unsigned long long)descriptorPool, (unsigned long long)pAllocator);
                 }
                 m_state->on_vkDestroyDescriptorPool(&m_pool, device, descriptorPool, pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroyDescriptorPool(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, boxed_descriptorPool_preserve, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroyDescriptorPool(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device,
+                        boxed_descriptorPool_preserve, pAllocator);
                 }
                 delete_VkDescriptorPool(boxed_descriptorPool_preserve);
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkResetDescriptorPool:
-            {
+            case OP_vkResetDescriptorPool: {
                 android::base::beginTrace("vkResetDescriptorPool decode");
                 VkDevice device;
                 VkDescriptorPool descriptorPool;
@@ -4653,32 +5209,39 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDescriptorPool*)&descriptorPool = (VkDescriptorPool)unbox_VkDescriptorPool((VkDescriptorPool)(*&cgen_var_1));
-                memcpy((VkDescriptorPoolResetFlags*)&flags, *readStreamPtrPtr, sizeof(VkDescriptorPoolResetFlags));
+                *(VkDescriptorPool*)&descriptorPool =
+                    (VkDescriptorPool)unbox_VkDescriptorPool((VkDescriptorPool)(*&cgen_var_1));
+                memcpy((VkDescriptorPoolResetFlags*)&flags, *readStreamPtrPtr,
+                       sizeof(VkDescriptorPoolResetFlags));
                 *readStreamPtrPtr += sizeof(VkDescriptorPoolResetFlags);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkResetDescriptorPool 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)descriptorPool, (unsigned long long)flags);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkResetDescriptorPool 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device,
+                            (unsigned long long)descriptorPool, (unsigned long long)flags);
                 }
                 VkResult vkResetDescriptorPool_VkResult_return = (VkResult)0;
-                vkResetDescriptorPool_VkResult_return = m_state->on_vkResetDescriptorPool(&m_pool, device, descriptorPool, flags);
-                if ((vkResetDescriptorPool_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkResetDescriptorPool_VkResult_return =
+                    m_state->on_vkResetDescriptorPool(&m_pool, device, descriptorPool, flags);
+                if ((vkResetDescriptorPool_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkResetDescriptorPool_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkResetDescriptorPool(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkResetDescriptorPool_VkResult_return, device, descriptorPool, flags);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkResetDescriptorPool(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkResetDescriptorPool_VkResult_return, device, descriptorPool, flags);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkAllocateDescriptorSets:
-            {
+            case OP_vkAllocateDescriptorSets: {
                 android::base::beginTrace("vkAllocateDescriptorSets decode");
                 VkDevice device;
                 const VkDescriptorSetAllocateInfo* pAllocateInfo;
@@ -4688,60 +5251,74 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
-                vkReadStream->alloc((void**)&pAllocateInfo, sizeof(const VkDescriptorSetAllocateInfo));
-                reservedunmarshal_VkDescriptorSetAllocateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorSetAllocateInfo*)(pAllocateInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pAllocateInfo,
+                                    sizeof(const VkDescriptorSetAllocateInfo));
+                reservedunmarshal_VkDescriptorSetAllocateInfo(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkDescriptorSetAllocateInfo*)(pAllocateInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pDescriptorSets;
                 vkReadStream->unsetHandleMapping();
-                vkReadStream->alloc((void**)&pDescriptorSets, pAllocateInfo->descriptorSetCount * sizeof(VkDescriptorSet));
-                if (pAllocateInfo->descriptorSetCount)
-                {
+                vkReadStream->alloc((void**)&pDescriptorSets,
+                                    pAllocateInfo->descriptorSetCount * sizeof(VkDescriptorSet));
+                if (pAllocateInfo->descriptorSetCount) {
                     uint8_t* cgen_var_1_ptr = (uint8_t*)(*readStreamPtrPtr);
                     *readStreamPtrPtr += 8 * pAllocateInfo->descriptorSetCount;
-                    for (uint32_t k = 0; k < pAllocateInfo->descriptorSetCount; ++k)
-                    {
-                        uint64_t tmpval; memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
-                        *(((VkDescriptorSet*)pDescriptorSets) + k) = (VkDescriptorSet)(VkDescriptorSet)((VkDescriptorSet)tmpval);
+                    for (uint32_t k = 0; k < pAllocateInfo->descriptorSetCount; ++k) {
+                        uint64_t tmpval;
+                        memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
+                        *(((VkDescriptorSet*)pDescriptorSets) + k) =
+                            (VkDescriptorSet)(VkDescriptorSet)((VkDescriptorSet)tmpval);
                     }
                 }
-                if (pAllocateInfo)
-                {
-                    transform_tohost_VkDescriptorSetAllocateInfo(m_state, (VkDescriptorSetAllocateInfo*)(pAllocateInfo));
+                if (pAllocateInfo) {
+                    transform_tohost_VkDescriptorSetAllocateInfo(
+                        m_state, (VkDescriptorSetAllocateInfo*)(pAllocateInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkAllocateDescriptorSets 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pAllocateInfo, (unsigned long long)pDescriptorSets);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkAllocateDescriptorSets 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pAllocateInfo,
+                            (unsigned long long)pDescriptorSets);
                 }
                 VkResult vkAllocateDescriptorSets_VkResult_return = (VkResult)0;
-                vkAllocateDescriptorSets_VkResult_return = m_state->on_vkAllocateDescriptorSets(&m_pool, device, pAllocateInfo, pDescriptorSets);
-                if ((vkAllocateDescriptorSets_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkAllocateDescriptorSets_VkResult_return = m_state->on_vkAllocateDescriptorSets(
+                    &m_pool, device, pAllocateInfo, pDescriptorSets);
+                if ((vkAllocateDescriptorSets_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // Begin manual non dispatchable handle create for pDescriptorSets;
                 vkStream->unsetHandleMapping();
-                if (pAllocateInfo->descriptorSetCount)
-                {
+                if (pAllocateInfo->descriptorSetCount) {
                     uint64_t* cgen_var_2;
                     vkStream->alloc((void**)&cgen_var_2, pAllocateInfo->descriptorSetCount * 8);
-                    static_assert(8 == sizeof(VkDescriptorSet), "handle map overwrite requires VkDescriptorSet to be 8 bytes long");
-                    vkStream->handleMapping()->mapHandles_VkDescriptorSet((VkDescriptorSet*)pDescriptorSets, pAllocateInfo->descriptorSetCount);
-                    vkStream->write((VkDescriptorSet*)pDescriptorSets, 8 * pAllocateInfo->descriptorSetCount);
+                    static_assert(
+                        8 == sizeof(VkDescriptorSet),
+                        "handle map overwrite requires VkDescriptorSet to be 8 bytes long");
+                    vkStream->handleMapping()->mapHandles_VkDescriptorSet(
+                        (VkDescriptorSet*)pDescriptorSets, pAllocateInfo->descriptorSetCount);
+                    vkStream->write((VkDescriptorSet*)pDescriptorSets,
+                                    8 * pAllocateInfo->descriptorSetCount);
                 }
                 // Begin manual non dispatchable handle create for pDescriptorSets;
                 vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
                 vkStream->write(&vkAllocateDescriptorSets_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkAllocateDescriptorSets(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkAllocateDescriptorSets_VkResult_return, device, pAllocateInfo, pDescriptorSets);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkAllocateDescriptorSets(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkAllocateDescriptorSets_VkResult_return, device, pAllocateInfo,
+                        pDescriptorSets);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkFreeDescriptorSets:
-            {
+            case OP_vkFreeDescriptorSets: {
                 android::base::beginTrace("vkFreeDescriptorSets decode");
                 VkDevice device;
                 VkDescriptorPool descriptorPool;
@@ -4755,58 +5332,70 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDescriptorPool*)&descriptorPool = (VkDescriptorPool)unbox_VkDescriptorPool((VkDescriptorPool)(*&cgen_var_1));
+                *(VkDescriptorPool*)&descriptorPool =
+                    (VkDescriptorPool)unbox_VkDescriptorPool((VkDescriptorPool)(*&cgen_var_1));
                 memcpy((uint32_t*)&descriptorSetCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 // Begin manual non dispatchable handle destroy unboxing for pDescriptorSets;
-                VkDescriptorSet* boxed_pDescriptorSets_preserve; vkReadStream->alloc((void**)&boxed_pDescriptorSets_preserve, ((descriptorSetCount)) * sizeof(VkDescriptorSet));
+                VkDescriptorSet* boxed_pDescriptorSets_preserve;
+                vkReadStream->alloc((void**)&boxed_pDescriptorSets_preserve,
+                                    ((descriptorSetCount)) * sizeof(VkDescriptorSet));
                 // WARNING PTR CHECK
                 memcpy((VkDescriptorSet**)&pDescriptorSets, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pDescriptorSets);
                 *readStreamPtrPtr += 8;
-                if (pDescriptorSets)
-                {
-                    vkReadStream->alloc((void**)&pDescriptorSets, ((descriptorSetCount)) * sizeof(const VkDescriptorSet));
-                    if (((descriptorSetCount)))
-                    {
+                if (pDescriptorSets) {
+                    vkReadStream->alloc((void**)&pDescriptorSets,
+                                        ((descriptorSetCount)) * sizeof(const VkDescriptorSet));
+                    if (((descriptorSetCount))) {
                         uint8_t* cgen_var_2_0_ptr = (uint8_t*)(*readStreamPtrPtr);
                         *readStreamPtrPtr += 8 * ((descriptorSetCount));
-                        for (uint32_t k = 0; k < ((descriptorSetCount)); ++k)
-                        {
-                            uint64_t tmpval; memcpy(&tmpval, cgen_var_2_0_ptr + k * 8, sizeof(uint64_t));
-                            *(((VkDescriptorSet*)pDescriptorSets) + k) = (VkDescriptorSet)(VkDescriptorSet)((VkDescriptorSet)tmpval);
+                        for (uint32_t k = 0; k < ((descriptorSetCount)); ++k) {
+                            uint64_t tmpval;
+                            memcpy(&tmpval, cgen_var_2_0_ptr + k * 8, sizeof(uint64_t));
+                            *(((VkDescriptorSet*)pDescriptorSets) + k) =
+                                (VkDescriptorSet)(VkDescriptorSet)((VkDescriptorSet)tmpval);
                         }
                     }
                 }
-                for (uint32_t i = 0; i < ((descriptorSetCount)); ++i)
-                {
+                for (uint32_t i = 0; i < ((descriptorSetCount)); ++i) {
                     boxed_pDescriptorSets_preserve[i] = pDescriptorSets[i];
-                    ((VkDescriptorSet*)(pDescriptorSets))[i] = unbox_VkDescriptorSet(pDescriptorSets[i]);
+                    ((VkDescriptorSet*)(pDescriptorSets))[i] =
+                        unbox_VkDescriptorSet(pDescriptorSets[i]);
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkFreeDescriptorSets 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)descriptorPool, (unsigned long long)descriptorSetCount, (unsigned long long)pDescriptorSets);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkFreeDescriptorSets 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device,
+                            (unsigned long long)descriptorPool,
+                            (unsigned long long)descriptorSetCount,
+                            (unsigned long long)pDescriptorSets);
                 }
                 VkResult vkFreeDescriptorSets_VkResult_return = (VkResult)0;
-                vkFreeDescriptorSets_VkResult_return = m_state->on_vkFreeDescriptorSets(&m_pool, device, descriptorPool, descriptorSetCount, pDescriptorSets);
-                if ((vkFreeDescriptorSets_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkFreeDescriptorSets_VkResult_return = m_state->on_vkFreeDescriptorSets(
+                    &m_pool, device, descriptorPool, descriptorSetCount, pDescriptorSets);
+                if ((vkFreeDescriptorSets_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkFreeDescriptorSets_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkFreeDescriptorSets(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkFreeDescriptorSets_VkResult_return, device, descriptorPool, descriptorSetCount, boxed_pDescriptorSets_preserve);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkFreeDescriptorSets(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkFreeDescriptorSets_VkResult_return, device, descriptorPool,
+                        descriptorSetCount, boxed_pDescriptorSets_preserve);
                 }
                 // Skipping handle cleanup for vkFreeDescriptorSets
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkUpdateDescriptorSets:
-            {
+            case OP_vkUpdateDescriptorSets: {
                 android::base::beginTrace("vkUpdateDescriptorSets decode");
                 VkDevice device;
                 uint32_t descriptorWriteCount;
@@ -4820,51 +5409,64 @@
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
                 memcpy((uint32_t*)&descriptorWriteCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pDescriptorWrites, ((descriptorWriteCount)) * sizeof(const VkWriteDescriptorSet));
-                for (uint32_t i = 0; i < (uint32_t)((descriptorWriteCount)); ++i)
-                {
-                    reservedunmarshal_VkWriteDescriptorSet(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkWriteDescriptorSet*)(pDescriptorWrites + i), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pDescriptorWrites,
+                                    ((descriptorWriteCount)) * sizeof(const VkWriteDescriptorSet));
+                for (uint32_t i = 0; i < (uint32_t)((descriptorWriteCount)); ++i) {
+                    reservedunmarshal_VkWriteDescriptorSet(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkWriteDescriptorSet*)(pDescriptorWrites + i), readStreamPtrPtr);
                 }
                 memcpy((uint32_t*)&descriptorCopyCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pDescriptorCopies, ((descriptorCopyCount)) * sizeof(const VkCopyDescriptorSet));
-                for (uint32_t i = 0; i < (uint32_t)((descriptorCopyCount)); ++i)
-                {
-                    reservedunmarshal_VkCopyDescriptorSet(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyDescriptorSet*)(pDescriptorCopies + i), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pDescriptorCopies,
+                                    ((descriptorCopyCount)) * sizeof(const VkCopyDescriptorSet));
+                for (uint32_t i = 0; i < (uint32_t)((descriptorCopyCount)); ++i) {
+                    reservedunmarshal_VkCopyDescriptorSet(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkCopyDescriptorSet*)(pDescriptorCopies + i), readStreamPtrPtr);
                 }
-                if (pDescriptorWrites)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((descriptorWriteCount)); ++i)
-                    {
-                        transform_tohost_VkWriteDescriptorSet(m_state, (VkWriteDescriptorSet*)(pDescriptorWrites + i));
+                if (pDescriptorWrites) {
+                    for (uint32_t i = 0; i < (uint32_t)((descriptorWriteCount)); ++i) {
+                        transform_tohost_VkWriteDescriptorSet(
+                            m_state, (VkWriteDescriptorSet*)(pDescriptorWrites + i));
                     }
                 }
-                if (pDescriptorCopies)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((descriptorCopyCount)); ++i)
-                    {
-                        transform_tohost_VkCopyDescriptorSet(m_state, (VkCopyDescriptorSet*)(pDescriptorCopies + i));
+                if (pDescriptorCopies) {
+                    for (uint32_t i = 0; i < (uint32_t)((descriptorCopyCount)); ++i) {
+                        transform_tohost_VkCopyDescriptorSet(
+                            m_state, (VkCopyDescriptorSet*)(pDescriptorCopies + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkUpdateDescriptorSets 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)descriptorWriteCount, (unsigned long long)pDescriptorWrites, (unsigned long long)descriptorCopyCount, (unsigned long long)pDescriptorCopies);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkUpdateDescriptorSets 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)device,
+                            (unsigned long long)descriptorWriteCount,
+                            (unsigned long long)pDescriptorWrites,
+                            (unsigned long long)descriptorCopyCount,
+                            (unsigned long long)pDescriptorCopies);
                 }
-                m_state->on_vkUpdateDescriptorSets(&m_pool, device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
+                m_state->on_vkUpdateDescriptorSets(&m_pool, device, descriptorWriteCount,
+                                                   pDescriptorWrites, descriptorCopyCount,
+                                                   pDescriptorCopies);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkUpdateDescriptorSets(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkUpdateDescriptorSets(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device,
+                        descriptorWriteCount, pDescriptorWrites, descriptorCopyCount,
+                        pDescriptorCopies);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCreateFramebuffer:
-            {
+            case OP_vkCreateFramebuffer: {
                 android::base::beginTrace("vkCreateFramebuffer decode");
                 VkDevice device;
                 const VkFramebufferCreateInfo* pCreateInfo;
@@ -4876,15 +5478,18 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkFramebufferCreateInfo));
-                reservedunmarshal_VkFramebufferCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkFramebufferCreateInfo*)(pCreateInfo), readStreamPtrPtr);
+                reservedunmarshal_VkFramebufferCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                          (VkFramebufferCreateInfo*)(pCreateInfo),
+                                                          readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pFramebuffer;
                 vkReadStream->unsetHandleMapping();
@@ -4892,46 +5497,56 @@
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkFramebuffer*)pFramebuffer = (VkFramebuffer)(VkFramebuffer)((VkFramebuffer)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkFramebufferCreateInfo(m_state, (VkFramebufferCreateInfo*)(pCreateInfo));
+                *(VkFramebuffer*)pFramebuffer =
+                    (VkFramebuffer)(VkFramebuffer)((VkFramebuffer)(*&cgen_var_2));
+                if (pCreateInfo) {
+                    transform_tohost_VkFramebufferCreateInfo(
+                        m_state, (VkFramebufferCreateInfo*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateFramebuffer 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pFramebuffer);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateFramebuffer 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pFramebuffer);
                 }
                 VkResult vkCreateFramebuffer_VkResult_return = (VkResult)0;
-                vkCreateFramebuffer_VkResult_return = m_state->on_vkCreateFramebuffer(&m_pool, device, pCreateInfo, pAllocator, pFramebuffer);
-                if ((vkCreateFramebuffer_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateFramebuffer_VkResult_return = m_state->on_vkCreateFramebuffer(
+                    &m_pool, device, pCreateInfo, pAllocator, pFramebuffer);
+                if ((vkCreateFramebuffer_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // Begin manual non dispatchable handle create for pFramebuffer;
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3;
-                static_assert(8 == sizeof(VkFramebuffer), "handle map overwrite requires VkFramebuffer to be 8 bytes long");
-                vkStream->handleMapping()->mapHandles_VkFramebuffer((VkFramebuffer*)pFramebuffer, 1);
+                static_assert(8 == sizeof(VkFramebuffer),
+                              "handle map overwrite requires VkFramebuffer to be 8 bytes long");
+                vkStream->handleMapping()->mapHandles_VkFramebuffer((VkFramebuffer*)pFramebuffer,
+                                                                    1);
                 vkStream->write((VkFramebuffer*)pFramebuffer, 8 * 1);
                 // Begin manual non dispatchable handle create for pFramebuffer;
                 vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
                 vkStream->write(&vkCreateFramebuffer_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateFramebuffer(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateFramebuffer_VkResult_return, device, pCreateInfo, pAllocator, pFramebuffer);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateFramebuffer(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateFramebuffer_VkResult_return, device, pCreateInfo, pAllocator,
+                        pFramebuffer);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroyFramebuffer:
-            {
+            case OP_vkDestroyFramebuffer: {
                 android::base::beginTrace("vkDestroyFramebuffer decode");
                 VkDevice device;
                 VkFramebuffer framebuffer;
@@ -4946,42 +5561,47 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkFramebuffer*)&framebuffer = (VkFramebuffer)(VkFramebuffer)((VkFramebuffer)(*&cgen_var_1));
+                *(VkFramebuffer*)&framebuffer =
+                    (VkFramebuffer)(VkFramebuffer)((VkFramebuffer)(*&cgen_var_1));
                 boxed_framebuffer_preserve = framebuffer;
                 framebuffer = unbox_VkFramebuffer(framebuffer);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroyFramebuffer 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)framebuffer, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkDestroyFramebuffer 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)framebuffer,
+                            (unsigned long long)pAllocator);
                 }
                 m_state->on_vkDestroyFramebuffer(&m_pool, device, framebuffer, pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroyFramebuffer(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, boxed_framebuffer_preserve, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroyFramebuffer(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device,
+                        boxed_framebuffer_preserve, pAllocator);
                 }
                 delete_VkFramebuffer(boxed_framebuffer_preserve);
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCreateRenderPass:
-            {
+            case OP_vkCreateRenderPass: {
                 android::base::beginTrace("vkCreateRenderPass decode");
                 VkDevice device;
                 const VkRenderPassCreateInfo* pCreateInfo;
@@ -4993,15 +5613,18 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkRenderPassCreateInfo));
-                reservedunmarshal_VkRenderPassCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRenderPassCreateInfo*)(pCreateInfo), readStreamPtrPtr);
+                reservedunmarshal_VkRenderPassCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                         (VkRenderPassCreateInfo*)(pCreateInfo),
+                                                         readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pRenderPass;
                 vkReadStream->unsetHandleMapping();
@@ -5009,46 +5632,55 @@
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkRenderPass*)pRenderPass = (VkRenderPass)(VkRenderPass)((VkRenderPass)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkRenderPassCreateInfo(m_state, (VkRenderPassCreateInfo*)(pCreateInfo));
+                *(VkRenderPass*)pRenderPass =
+                    (VkRenderPass)(VkRenderPass)((VkRenderPass)(*&cgen_var_2));
+                if (pCreateInfo) {
+                    transform_tohost_VkRenderPassCreateInfo(m_state,
+                                                            (VkRenderPassCreateInfo*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateRenderPass 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pRenderPass);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateRenderPass 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pRenderPass);
                 }
                 VkResult vkCreateRenderPass_VkResult_return = (VkResult)0;
-                vkCreateRenderPass_VkResult_return = m_state->on_vkCreateRenderPass(&m_pool, device, pCreateInfo, pAllocator, pRenderPass);
-                if ((vkCreateRenderPass_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateRenderPass_VkResult_return = m_state->on_vkCreateRenderPass(
+                    &m_pool, device, pCreateInfo, pAllocator, pRenderPass);
+                if ((vkCreateRenderPass_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // Begin manual non dispatchable handle create for pRenderPass;
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3;
-                static_assert(8 == sizeof(VkRenderPass), "handle map overwrite requires VkRenderPass to be 8 bytes long");
+                static_assert(8 == sizeof(VkRenderPass),
+                              "handle map overwrite requires VkRenderPass to be 8 bytes long");
                 vkStream->handleMapping()->mapHandles_VkRenderPass((VkRenderPass*)pRenderPass, 1);
                 vkStream->write((VkRenderPass*)pRenderPass, 8 * 1);
                 // Begin manual non dispatchable handle create for pRenderPass;
                 vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
                 vkStream->write(&vkCreateRenderPass_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateRenderPass(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateRenderPass_VkResult_return, device, pCreateInfo, pAllocator, pRenderPass);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateRenderPass(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateRenderPass_VkResult_return, device, pCreateInfo, pAllocator,
+                        pRenderPass);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroyRenderPass:
-            {
+            case OP_vkDestroyRenderPass: {
                 android::base::beginTrace("vkDestroyRenderPass decode");
                 VkDevice device;
                 VkRenderPass renderPass;
@@ -5063,42 +5695,47 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkRenderPass*)&renderPass = (VkRenderPass)(VkRenderPass)((VkRenderPass)(*&cgen_var_1));
+                *(VkRenderPass*)&renderPass =
+                    (VkRenderPass)(VkRenderPass)((VkRenderPass)(*&cgen_var_1));
                 boxed_renderPass_preserve = renderPass;
                 renderPass = unbox_VkRenderPass(renderPass);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroyRenderPass 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)renderPass, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkDestroyRenderPass 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)renderPass,
+                            (unsigned long long)pAllocator);
                 }
                 m_state->on_vkDestroyRenderPass(&m_pool, device, renderPass, pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroyRenderPass(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, boxed_renderPass_preserve, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroyRenderPass(snapshotTraceBegin, snapshotTraceBytes,
+                                                             &m_pool, device,
+                                                             boxed_renderPass_preserve, pAllocator);
                 }
                 delete_VkRenderPass(boxed_renderPass_preserve);
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetRenderAreaGranularity:
-            {
+            case OP_vkGetRenderAreaGranularity: {
                 android::base::beginTrace("vkGetRenderAreaGranularity decode");
                 VkDevice device;
                 VkRenderPass renderPass;
@@ -5114,40 +5751,45 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkRenderPass*)&renderPass = (VkRenderPass)unbox_VkRenderPass((VkRenderPass)(*&cgen_var_1));
+                *(VkRenderPass*)&renderPass =
+                    (VkRenderPass)unbox_VkRenderPass((VkRenderPass)(*&cgen_var_1));
                 // Begin manual dispatchable handle unboxing for pGranularity;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pGranularity, sizeof(VkExtent2D));
-                reservedunmarshal_VkExtent2D(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExtent2D*)(pGranularity), readStreamPtrPtr);
-                if (pGranularity)
-                {
+                reservedunmarshal_VkExtent2D(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                             (VkExtent2D*)(pGranularity), readStreamPtrPtr);
+                if (pGranularity) {
                     transform_tohost_VkExtent2D(m_state, (VkExtent2D*)(pGranularity));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetRenderAreaGranularity 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)renderPass, (unsigned long long)pGranularity);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetRenderAreaGranularity 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)renderPass,
+                            (unsigned long long)pGranularity);
                 }
                 vk->vkGetRenderAreaGranularity(unboxed_device, renderPass, pGranularity);
                 vkStream->unsetHandleMapping();
-                if (pGranularity)
-                {
+                if (pGranularity) {
                     transform_fromhost_VkExtent2D(m_state, (VkExtent2D*)(pGranularity));
                 }
-                marshal_VkExtent2D(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExtent2D*)(pGranularity));
+                marshal_VkExtent2D(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                   (VkExtent2D*)(pGranularity));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetRenderAreaGranularity(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, renderPass, pGranularity);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetRenderAreaGranularity(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, renderPass,
+                        pGranularity);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCreateCommandPool:
-            {
+            case OP_vkCreateCommandPool: {
                 android::base::beginTrace("vkCreateCommandPool decode");
                 VkDevice device;
                 const VkCommandPoolCreateInfo* pCreateInfo;
@@ -5159,15 +5801,18 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkCommandPoolCreateInfo));
-                reservedunmarshal_VkCommandPoolCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCommandPoolCreateInfo*)(pCreateInfo), readStreamPtrPtr);
+                reservedunmarshal_VkCommandPoolCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                          (VkCommandPoolCreateInfo*)(pCreateInfo),
+                                                          readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pCommandPool;
                 vkReadStream->unsetHandleMapping();
@@ -5175,46 +5820,56 @@
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkCommandPool*)pCommandPool = (VkCommandPool)(VkCommandPool)((VkCommandPool)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkCommandPoolCreateInfo(m_state, (VkCommandPoolCreateInfo*)(pCreateInfo));
+                *(VkCommandPool*)pCommandPool =
+                    (VkCommandPool)(VkCommandPool)((VkCommandPool)(*&cgen_var_2));
+                if (pCreateInfo) {
+                    transform_tohost_VkCommandPoolCreateInfo(
+                        m_state, (VkCommandPoolCreateInfo*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateCommandPool 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pCommandPool);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateCommandPool 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pCommandPool);
                 }
                 VkResult vkCreateCommandPool_VkResult_return = (VkResult)0;
-                vkCreateCommandPool_VkResult_return = m_state->on_vkCreateCommandPool(&m_pool, device, pCreateInfo, pAllocator, pCommandPool);
-                if ((vkCreateCommandPool_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateCommandPool_VkResult_return = m_state->on_vkCreateCommandPool(
+                    &m_pool, device, pCreateInfo, pAllocator, pCommandPool);
+                if ((vkCreateCommandPool_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // Begin manual non dispatchable handle create for pCommandPool;
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3;
-                static_assert(8 == sizeof(VkCommandPool), "handle map overwrite requires VkCommandPool to be 8 bytes long");
-                vkStream->handleMapping()->mapHandles_VkCommandPool((VkCommandPool*)pCommandPool, 1);
+                static_assert(8 == sizeof(VkCommandPool),
+                              "handle map overwrite requires VkCommandPool to be 8 bytes long");
+                vkStream->handleMapping()->mapHandles_VkCommandPool((VkCommandPool*)pCommandPool,
+                                                                    1);
                 vkStream->write((VkCommandPool*)pCommandPool, 8 * 1);
                 // Begin manual non dispatchable handle create for pCommandPool;
                 vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
                 vkStream->write(&vkCreateCommandPool_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateCommandPool(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateCommandPool_VkResult_return, device, pCreateInfo, pAllocator, pCommandPool);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateCommandPool(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateCommandPool_VkResult_return, device, pCreateInfo, pAllocator,
+                        pCommandPool);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroyCommandPool:
-            {
+            case OP_vkDestroyCommandPool: {
                 android::base::beginTrace("vkDestroyCommandPool decode");
                 VkDevice device;
                 VkCommandPool commandPool;
@@ -5229,42 +5884,47 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandPool*)&commandPool = (VkCommandPool)(VkCommandPool)((VkCommandPool)(*&cgen_var_1));
+                *(VkCommandPool*)&commandPool =
+                    (VkCommandPool)(VkCommandPool)((VkCommandPool)(*&cgen_var_1));
                 boxed_commandPool_preserve = commandPool;
                 commandPool = unbox_VkCommandPool(commandPool);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroyCommandPool 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)commandPool, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkDestroyCommandPool 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)commandPool,
+                            (unsigned long long)pAllocator);
                 }
                 m_state->on_vkDestroyCommandPool(&m_pool, device, commandPool, pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroyCommandPool(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, boxed_commandPool_preserve, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroyCommandPool(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device,
+                        boxed_commandPool_preserve, pAllocator);
                 }
                 delete_VkCommandPool(boxed_commandPool_preserve);
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkResetCommandPool:
-            {
+            case OP_vkResetCommandPool: {
                 android::base::beginTrace("vkResetCommandPool decode");
                 VkDevice device;
                 VkCommandPool commandPool;
@@ -5277,32 +5937,39 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandPool*)&commandPool = (VkCommandPool)unbox_VkCommandPool((VkCommandPool)(*&cgen_var_1));
-                memcpy((VkCommandPoolResetFlags*)&flags, *readStreamPtrPtr, sizeof(VkCommandPoolResetFlags));
+                *(VkCommandPool*)&commandPool =
+                    (VkCommandPool)unbox_VkCommandPool((VkCommandPool)(*&cgen_var_1));
+                memcpy((VkCommandPoolResetFlags*)&flags, *readStreamPtrPtr,
+                       sizeof(VkCommandPoolResetFlags));
                 *readStreamPtrPtr += sizeof(VkCommandPoolResetFlags);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkResetCommandPool 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)commandPool, (unsigned long long)flags);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkResetCommandPool 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)commandPool,
+                            (unsigned long long)flags);
                 }
                 VkResult vkResetCommandPool_VkResult_return = (VkResult)0;
-                vkResetCommandPool_VkResult_return = m_state->on_vkResetCommandPool(&m_pool, device, commandPool, flags);
-                if ((vkResetCommandPool_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkResetCommandPool_VkResult_return =
+                    m_state->on_vkResetCommandPool(&m_pool, device, commandPool, flags);
+                if ((vkResetCommandPool_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkResetCommandPool_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkResetCommandPool(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkResetCommandPool_VkResult_return, device, commandPool, flags);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkResetCommandPool(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkResetCommandPool_VkResult_return, device, commandPool, flags);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkAllocateCommandBuffers:
-            {
+            case OP_vkAllocateCommandBuffers: {
                 android::base::beginTrace("vkAllocateCommandBuffers decode");
                 VkDevice device;
                 const VkCommandBufferAllocateInfo* pAllocateInfo;
@@ -5312,56 +5979,70 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
-                vkReadStream->alloc((void**)&pAllocateInfo, sizeof(const VkCommandBufferAllocateInfo));
-                reservedunmarshal_VkCommandBufferAllocateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCommandBufferAllocateInfo*)(pAllocateInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pAllocateInfo,
+                                    sizeof(const VkCommandBufferAllocateInfo));
+                reservedunmarshal_VkCommandBufferAllocateInfo(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkCommandBufferAllocateInfo*)(pAllocateInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pCommandBuffers;
                 vkReadStream->unsetHandleMapping();
-                vkReadStream->alloc((void**)&pCommandBuffers, pAllocateInfo->commandBufferCount * sizeof(VkCommandBuffer));
-                if (pAllocateInfo->commandBufferCount)
-                {
+                vkReadStream->alloc((void**)&pCommandBuffers,
+                                    pAllocateInfo->commandBufferCount * sizeof(VkCommandBuffer));
+                if (pAllocateInfo->commandBufferCount) {
                     uint8_t* cgen_var_1_ptr = (uint8_t*)(*readStreamPtrPtr);
                     *readStreamPtrPtr += 8 * pAllocateInfo->commandBufferCount;
-                    for (uint32_t k = 0; k < pAllocateInfo->commandBufferCount; ++k)
-                    {
-                        uint64_t tmpval; memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
-                        *(((VkCommandBuffer*)pCommandBuffers) + k) = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)tmpval);
+                    for (uint32_t k = 0; k < pAllocateInfo->commandBufferCount; ++k) {
+                        uint64_t tmpval;
+                        memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
+                        *(((VkCommandBuffer*)pCommandBuffers) + k) =
+                            (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)tmpval);
                     }
                 }
-                if (pAllocateInfo)
-                {
-                    transform_tohost_VkCommandBufferAllocateInfo(m_state, (VkCommandBufferAllocateInfo*)(pAllocateInfo));
+                if (pAllocateInfo) {
+                    transform_tohost_VkCommandBufferAllocateInfo(
+                        m_state, (VkCommandBufferAllocateInfo*)(pAllocateInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkAllocateCommandBuffers 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pAllocateInfo, (unsigned long long)pCommandBuffers);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkAllocateCommandBuffers 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pAllocateInfo,
+                            (unsigned long long)pCommandBuffers);
                 }
                 VkResult vkAllocateCommandBuffers_VkResult_return = (VkResult)0;
-                vkAllocateCommandBuffers_VkResult_return = m_state->on_vkAllocateCommandBuffers(&m_pool, device, pAllocateInfo, pCommandBuffers);
-                if ((vkAllocateCommandBuffers_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkAllocateCommandBuffers_VkResult_return = m_state->on_vkAllocateCommandBuffers(
+                    &m_pool, device, pAllocateInfo, pCommandBuffers);
+                if ((vkAllocateCommandBuffers_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                if (pAllocateInfo->commandBufferCount)
-                {
+                if (pAllocateInfo->commandBufferCount) {
                     uint64_t* cgen_var_2;
                     vkStream->alloc((void**)&cgen_var_2, pAllocateInfo->commandBufferCount * 8);
-                    static_assert(8 == sizeof(VkCommandBuffer), "handle map overwrite requires VkCommandBuffer to be 8 bytes long");
-                    vkStream->handleMapping()->mapHandles_VkCommandBuffer((VkCommandBuffer*)pCommandBuffers, pAllocateInfo->commandBufferCount);
-                    vkStream->write((VkCommandBuffer*)pCommandBuffers, 8 * pAllocateInfo->commandBufferCount);
+                    static_assert(
+                        8 == sizeof(VkCommandBuffer),
+                        "handle map overwrite requires VkCommandBuffer to be 8 bytes long");
+                    vkStream->handleMapping()->mapHandles_VkCommandBuffer(
+                        (VkCommandBuffer*)pCommandBuffers, pAllocateInfo->commandBufferCount);
+                    vkStream->write((VkCommandBuffer*)pCommandBuffers,
+                                    8 * pAllocateInfo->commandBufferCount);
                 }
                 vkStream->write(&vkAllocateCommandBuffers_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkAllocateCommandBuffers(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkAllocateCommandBuffers_VkResult_return, device, pAllocateInfo, pCommandBuffers);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkAllocateCommandBuffers(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkAllocateCommandBuffers_VkResult_return, device, pAllocateInfo,
+                        pCommandBuffers);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkFreeCommandBuffers:
-            {
+            case OP_vkFreeCommandBuffers: {
                 android::base::beginTrace("vkFreeCommandBuffers decode");
                 VkDevice device;
                 VkCommandPool commandPool;
@@ -5375,60 +6056,67 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandPool*)&commandPool = (VkCommandPool)unbox_VkCommandPool((VkCommandPool)(*&cgen_var_1));
+                *(VkCommandPool*)&commandPool =
+                    (VkCommandPool)unbox_VkCommandPool((VkCommandPool)(*&cgen_var_1));
                 memcpy((uint32_t*)&commandBufferCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 // Begin manual non dispatchable handle destroy unboxing for pCommandBuffers;
-                VkCommandBuffer* boxed_pCommandBuffers_preserve; vkReadStream->alloc((void**)&boxed_pCommandBuffers_preserve, ((commandBufferCount)) * sizeof(VkCommandBuffer));
+                VkCommandBuffer* boxed_pCommandBuffers_preserve;
+                vkReadStream->alloc((void**)&boxed_pCommandBuffers_preserve,
+                                    ((commandBufferCount)) * sizeof(VkCommandBuffer));
                 // WARNING PTR CHECK
                 memcpy((VkCommandBuffer**)&pCommandBuffers, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pCommandBuffers);
                 *readStreamPtrPtr += 8;
-                if (pCommandBuffers)
-                {
-                    vkReadStream->alloc((void**)&pCommandBuffers, ((commandBufferCount)) * sizeof(const VkCommandBuffer));
-                    if (((commandBufferCount)))
-                    {
+                if (pCommandBuffers) {
+                    vkReadStream->alloc((void**)&pCommandBuffers,
+                                        ((commandBufferCount)) * sizeof(const VkCommandBuffer));
+                    if (((commandBufferCount))) {
                         uint8_t* cgen_var_2_0_ptr = (uint8_t*)(*readStreamPtrPtr);
                         *readStreamPtrPtr += 8 * ((commandBufferCount));
-                        for (uint32_t k = 0; k < ((commandBufferCount)); ++k)
-                        {
-                            uint64_t tmpval; memcpy(&tmpval, cgen_var_2_0_ptr + k * 8, sizeof(uint64_t));
-                            *(((VkCommandBuffer*)pCommandBuffers) + k) = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)tmpval);
+                        for (uint32_t k = 0; k < ((commandBufferCount)); ++k) {
+                            uint64_t tmpval;
+                            memcpy(&tmpval, cgen_var_2_0_ptr + k * 8, sizeof(uint64_t));
+                            *(((VkCommandBuffer*)pCommandBuffers) + k) =
+                                (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)tmpval);
                         }
                     }
                 }
-                for (uint32_t i = 0; i < ((commandBufferCount)); ++i)
-                {
+                for (uint32_t i = 0; i < ((commandBufferCount)); ++i) {
                     boxed_pCommandBuffers_preserve[i] = pCommandBuffers[i];
-                    ((VkCommandBuffer*)(pCommandBuffers))[i] = unbox_VkCommandBuffer(pCommandBuffers[i]);
+                    ((VkCommandBuffer*)(pCommandBuffers))[i] =
+                        unbox_VkCommandBuffer(pCommandBuffers[i]);
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkFreeCommandBuffers 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)commandPool, (unsigned long long)commandBufferCount, (unsigned long long)pCommandBuffers);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkFreeCommandBuffers 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)commandPool,
+                            (unsigned long long)commandBufferCount,
+                            (unsigned long long)pCommandBuffers);
                 }
-                m_state->on_vkFreeCommandBuffers(&m_pool, device, commandPool, commandBufferCount, pCommandBuffers);
+                m_state->on_vkFreeCommandBuffers(&m_pool, device, commandPool, commandBufferCount,
+                                                 pCommandBuffers);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkFreeCommandBuffers(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, commandPool, commandBufferCount, boxed_pCommandBuffers_preserve);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkFreeCommandBuffers(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, commandPool,
+                        commandBufferCount, boxed_pCommandBuffers_preserve);
                 }
-                if (((commandBufferCount)))
-                {
-                    for (uint32_t i = 0; i < ((commandBufferCount)); ++i)
-                    {
+                if (((commandBufferCount))) {
+                    for (uint32_t i = 0; i < ((commandBufferCount)); ++i) {
                         delete_VkCommandBuffer(boxed_pCommandBuffers_preserve[i]);
                     }
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkBeginCommandBuffer:
-            {
+            case OP_vkBeginCommandBuffer: {
                 android::base::beginTrace("vkBeginCommandBuffer decode");
                 VkCommandBuffer commandBuffer;
                 const VkCommandBufferBeginInfo* pBeginInfo;
@@ -5436,66 +6124,79 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 vkReadStream->alloc((void**)&pBeginInfo, sizeof(const VkCommandBufferBeginInfo));
-                reservedunmarshal_VkCommandBufferBeginInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCommandBufferBeginInfo*)(pBeginInfo), readStreamPtrPtr);
-                if (pBeginInfo)
-                {
-                    transform_tohost_VkCommandBufferBeginInfo(m_state, (VkCommandBufferBeginInfo*)(pBeginInfo));
+                reservedunmarshal_VkCommandBufferBeginInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                           (VkCommandBufferBeginInfo*)(pBeginInfo),
+                                                           readStreamPtrPtr);
+                if (pBeginInfo) {
+                    transform_tohost_VkCommandBufferBeginInfo(
+                        m_state, (VkCommandBufferBeginInfo*)(pBeginInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkBeginCommandBuffer 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pBeginInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkBeginCommandBuffer 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pBeginInfo);
                 }
                 VkResult vkBeginCommandBuffer_VkResult_return = (VkResult)0;
-                vkBeginCommandBuffer_VkResult_return = m_state->on_vkBeginCommandBuffer(&m_pool, commandBuffer, pBeginInfo, gfx_logger);
-                if ((vkBeginCommandBuffer_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkBeginCommandBuffer_VkResult_return = m_state->on_vkBeginCommandBuffer(
+                    &m_pool, commandBuffer, pBeginInfo, gfx_logger);
+                if ((vkBeginCommandBuffer_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkBeginCommandBuffer_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkBeginCommandBuffer(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkBeginCommandBuffer_VkResult_return, commandBuffer, pBeginInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkBeginCommandBuffer(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkBeginCommandBuffer_VkResult_return, commandBuffer, pBeginInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkEndCommandBuffer:
-            {
+            case OP_vkEndCommandBuffer: {
                 android::base::beginTrace("vkEndCommandBuffer decode");
                 VkCommandBuffer commandBuffer;
                 // Begin global wrapped dispatchable handle unboxing for commandBuffer;
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkEndCommandBuffer 0x%llx \n", ioStream, (unsigned long long)commandBuffer);
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkEndCommandBuffer 0x%llx \n", ioStream,
+                            (unsigned long long)commandBuffer);
                 }
                 VkResult vkEndCommandBuffer_VkResult_return = (VkResult)0;
-                vkEndCommandBuffer_VkResult_return = m_state->on_vkEndCommandBuffer(&m_pool, commandBuffer, gfx_logger);
-                if ((vkEndCommandBuffer_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkEndCommandBuffer_VkResult_return =
+                    m_state->on_vkEndCommandBuffer(&m_pool, commandBuffer, gfx_logger);
+                if ((vkEndCommandBuffer_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkEndCommandBuffer_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkEndCommandBuffer(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkEndCommandBuffer_VkResult_return, commandBuffer);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkEndCommandBuffer(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkEndCommandBuffer_VkResult_return, commandBuffer);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkResetCommandBuffer:
-            {
+            case OP_vkResetCommandBuffer: {
                 android::base::beginTrace("vkResetCommandBuffer decode");
                 VkCommandBuffer commandBuffer;
                 VkCommandBufferResetFlags flags;
@@ -5503,32 +6204,38 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
-                memcpy((VkCommandBufferResetFlags*)&flags, *readStreamPtrPtr, sizeof(VkCommandBufferResetFlags));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                memcpy((VkCommandBufferResetFlags*)&flags, *readStreamPtrPtr,
+                       sizeof(VkCommandBufferResetFlags));
                 *readStreamPtrPtr += sizeof(VkCommandBufferResetFlags);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkResetCommandBuffer 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)flags);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkResetCommandBuffer 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer, (unsigned long long)flags);
                 }
                 VkResult vkResetCommandBuffer_VkResult_return = (VkResult)0;
-                vkResetCommandBuffer_VkResult_return = m_state->on_vkResetCommandBuffer(&m_pool, commandBuffer, flags);
-                if ((vkResetCommandBuffer_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkResetCommandBuffer_VkResult_return =
+                    m_state->on_vkResetCommandBuffer(&m_pool, commandBuffer, flags);
+                if ((vkResetCommandBuffer_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkResetCommandBuffer_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkResetCommandBuffer(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkResetCommandBuffer_VkResult_return, commandBuffer, flags);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkResetCommandBuffer(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkResetCommandBuffer_VkResult_return, commandBuffer, flags);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdBindPipeline:
-            {
+            case OP_vkCmdBindPipeline: {
                 android::base::beginTrace("vkCmdBindPipeline decode");
                 VkCommandBuffer commandBuffer;
                 VkPipelineBindPoint pipelineBindPoint;
@@ -5537,32 +6244,37 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
-                memcpy((VkPipelineBindPoint*)&pipelineBindPoint, *readStreamPtrPtr, sizeof(VkPipelineBindPoint));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                memcpy((VkPipelineBindPoint*)&pipelineBindPoint, *readStreamPtrPtr,
+                       sizeof(VkPipelineBindPoint));
                 *readStreamPtrPtr += sizeof(VkPipelineBindPoint);
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkPipeline*)&pipeline = (VkPipeline)unbox_VkPipeline((VkPipeline)(*&cgen_var_1));
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdBindPipeline 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pipelineBindPoint, (unsigned long long)pipeline);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdBindPipeline 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pipelineBindPoint, (unsigned long long)pipeline);
                 }
                 m_state->on_vkCmdBindPipeline(&m_pool, commandBuffer, pipelineBindPoint, pipeline);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdBindPipeline(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pipelineBindPoint, pipeline);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdBindPipeline(snapshotTraceBegin, snapshotTraceBytes,
+                                                           &m_pool, commandBuffer,
+                                                           pipelineBindPoint, pipeline);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetViewport:
-            {
+            case OP_vkCmdSetViewport: {
                 android::base::beginTrace("vkCmdSetViewport decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t firstViewport;
@@ -5572,7 +6284,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -5580,37 +6293,42 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&viewportCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pViewports, ((viewportCount)) * sizeof(const VkViewport));
-                for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i)
-                {
-                    reservedunmarshal_VkViewport(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkViewport*)(pViewports + i), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pViewports,
+                                    ((viewportCount)) * sizeof(const VkViewport));
+                for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i) {
+                    reservedunmarshal_VkViewport(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                 (VkViewport*)(pViewports + i), readStreamPtrPtr);
                 }
-                if (pViewports)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i)
-                    {
+                if (pViewports) {
+                    for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i) {
                         transform_tohost_VkViewport(m_state, (VkViewport*)(pViewports + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetViewport 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)firstViewport, (unsigned long long)viewportCount, (unsigned long long)pViewports);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdSetViewport 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)firstViewport, (unsigned long long)viewportCount,
+                            (unsigned long long)pViewports);
                 }
-                vk->vkCmdSetViewport(unboxed_commandBuffer, firstViewport, viewportCount, pViewports);
+                vk->vkCmdSetViewport(unboxed_commandBuffer, firstViewport, viewportCount,
+                                     pViewports);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetViewport(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, firstViewport, viewportCount, pViewports);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetViewport(snapshotTraceBegin, snapshotTraceBytes,
+                                                          &m_pool, commandBuffer, firstViewport,
+                                                          viewportCount, pViewports);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetScissor:
-            {
+            case OP_vkCmdSetScissor: {
                 android::base::beginTrace("vkCmdSetScissor decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t firstScissor;
@@ -5620,7 +6338,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -5629,36 +6348,39 @@
                 memcpy((uint32_t*)&scissorCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 vkReadStream->alloc((void**)&pScissors, ((scissorCount)) * sizeof(const VkRect2D));
-                for (uint32_t i = 0; i < (uint32_t)((scissorCount)); ++i)
-                {
-                    reservedunmarshal_VkRect2D(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRect2D*)(pScissors + i), readStreamPtrPtr);
+                for (uint32_t i = 0; i < (uint32_t)((scissorCount)); ++i) {
+                    reservedunmarshal_VkRect2D(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                               (VkRect2D*)(pScissors + i), readStreamPtrPtr);
                 }
-                if (pScissors)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((scissorCount)); ++i)
-                    {
+                if (pScissors) {
+                    for (uint32_t i = 0; i < (uint32_t)((scissorCount)); ++i) {
                         transform_tohost_VkRect2D(m_state, (VkRect2D*)(pScissors + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetScissor 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)firstScissor, (unsigned long long)scissorCount, (unsigned long long)pScissors);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdSetScissor 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)firstScissor, (unsigned long long)scissorCount,
+                            (unsigned long long)pScissors);
                 }
                 vk->vkCmdSetScissor(unboxed_commandBuffer, firstScissor, scissorCount, pScissors);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetScissor(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, firstScissor, scissorCount, pScissors);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetScissor(snapshotTraceBegin, snapshotTraceBytes,
+                                                         &m_pool, commandBuffer, firstScissor,
+                                                         scissorCount, pScissors);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetLineWidth:
-            {
+            case OP_vkCmdSetLineWidth: {
                 android::base::beginTrace("vkCmdSetLineWidth decode");
                 VkCommandBuffer commandBuffer;
                 float lineWidth;
@@ -5666,31 +6388,33 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 memcpy((float*)&lineWidth, *readStreamPtrPtr, sizeof(float));
                 *readStreamPtrPtr += sizeof(float);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetLineWidth 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)lineWidth);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdSetLineWidth 0x%llx 0x%llx \n", ioStream,
+                            (unsigned long long)commandBuffer, (unsigned long long)lineWidth);
                 }
                 vk->vkCmdSetLineWidth(unboxed_commandBuffer, lineWidth);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetLineWidth(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, lineWidth);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetLineWidth(snapshotTraceBegin, snapshotTraceBytes,
+                                                           &m_pool, commandBuffer, lineWidth);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetDepthBias:
-            {
+            case OP_vkCmdSetDepthBias: {
                 android::base::beginTrace("vkCmdSetDepthBias decode");
                 VkCommandBuffer commandBuffer;
                 float depthBiasConstantFactor;
@@ -5700,7 +6424,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -5710,25 +6435,32 @@
                 *readStreamPtrPtr += sizeof(float);
                 memcpy((float*)&depthBiasSlopeFactor, *readStreamPtrPtr, sizeof(float));
                 *readStreamPtrPtr += sizeof(float);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetDepthBias 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)depthBiasConstantFactor, (unsigned long long)depthBiasClamp, (unsigned long long)depthBiasSlopeFactor);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdSetDepthBias 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)depthBiasConstantFactor,
+                            (unsigned long long)depthBiasClamp,
+                            (unsigned long long)depthBiasSlopeFactor);
                 }
-                vk->vkCmdSetDepthBias(unboxed_commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
+                vk->vkCmdSetDepthBias(unboxed_commandBuffer, depthBiasConstantFactor,
+                                      depthBiasClamp, depthBiasSlopeFactor);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetDepthBias(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetDepthBias(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetBlendConstants:
-            {
+            case OP_vkCmdSetBlendConstants: {
                 android::base::beginTrace("vkCmdSetBlendConstants decode");
                 VkCommandBuffer commandBuffer;
                 float blendConstants[4];
@@ -5736,31 +6468,35 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 memcpy((float*)blendConstants, *readStreamPtrPtr, 4 * sizeof(const float));
                 *readStreamPtrPtr += 4 * sizeof(const float);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetBlendConstants 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)blendConstants);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdSetBlendConstants 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)blendConstants);
                 }
                 vk->vkCmdSetBlendConstants(unboxed_commandBuffer, blendConstants);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetBlendConstants(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, blendConstants);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetBlendConstants(snapshotTraceBegin,
+                                                                snapshotTraceBytes, &m_pool,
+                                                                commandBuffer, blendConstants);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetDepthBounds:
-            {
+            case OP_vkCmdSetDepthBounds: {
                 android::base::beginTrace("vkCmdSetDepthBounds decode");
                 VkCommandBuffer commandBuffer;
                 float minDepthBounds;
@@ -5769,7 +6505,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -5777,25 +6514,28 @@
                 *readStreamPtrPtr += sizeof(float);
                 memcpy((float*)&maxDepthBounds, *readStreamPtrPtr, sizeof(float));
                 *readStreamPtrPtr += sizeof(float);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetDepthBounds 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)minDepthBounds, (unsigned long long)maxDepthBounds);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdSetDepthBounds 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)minDepthBounds, (unsigned long long)maxDepthBounds);
                 }
                 vk->vkCmdSetDepthBounds(unboxed_commandBuffer, minDepthBounds, maxDepthBounds);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetDepthBounds(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, minDepthBounds, maxDepthBounds);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetDepthBounds(snapshotTraceBegin, snapshotTraceBytes,
+                                                             &m_pool, commandBuffer, minDepthBounds,
+                                                             maxDepthBounds);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetStencilCompareMask:
-            {
+            case OP_vkCmdSetStencilCompareMask: {
                 android::base::beginTrace("vkCmdSetStencilCompareMask decode");
                 VkCommandBuffer commandBuffer;
                 VkStencilFaceFlags faceMask;
@@ -5804,33 +6544,39 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
-                memcpy((VkStencilFaceFlags*)&faceMask, *readStreamPtrPtr, sizeof(VkStencilFaceFlags));
+                memcpy((VkStencilFaceFlags*)&faceMask, *readStreamPtrPtr,
+                       sizeof(VkStencilFaceFlags));
                 *readStreamPtrPtr += sizeof(VkStencilFaceFlags);
                 memcpy((uint32_t*)&compareMask, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetStencilCompareMask 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)faceMask, (unsigned long long)compareMask);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdSetStencilCompareMask 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)faceMask, (unsigned long long)compareMask);
                 }
                 vk->vkCmdSetStencilCompareMask(unboxed_commandBuffer, faceMask, compareMask);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetStencilCompareMask(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, faceMask, compareMask);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetStencilCompareMask(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, faceMask,
+                        compareMask);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetStencilWriteMask:
-            {
+            case OP_vkCmdSetStencilWriteMask: {
                 android::base::beginTrace("vkCmdSetStencilWriteMask decode");
                 VkCommandBuffer commandBuffer;
                 VkStencilFaceFlags faceMask;
@@ -5839,33 +6585,39 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
-                memcpy((VkStencilFaceFlags*)&faceMask, *readStreamPtrPtr, sizeof(VkStencilFaceFlags));
+                memcpy((VkStencilFaceFlags*)&faceMask, *readStreamPtrPtr,
+                       sizeof(VkStencilFaceFlags));
                 *readStreamPtrPtr += sizeof(VkStencilFaceFlags);
                 memcpy((uint32_t*)&writeMask, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetStencilWriteMask 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)faceMask, (unsigned long long)writeMask);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdSetStencilWriteMask 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)faceMask, (unsigned long long)writeMask);
                 }
                 vk->vkCmdSetStencilWriteMask(unboxed_commandBuffer, faceMask, writeMask);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetStencilWriteMask(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, faceMask, writeMask);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetStencilWriteMask(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, faceMask,
+                        writeMask);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetStencilReference:
-            {
+            case OP_vkCmdSetStencilReference: {
                 android::base::beginTrace("vkCmdSetStencilReference decode");
                 VkCommandBuffer commandBuffer;
                 VkStencilFaceFlags faceMask;
@@ -5874,33 +6626,39 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
-                memcpy((VkStencilFaceFlags*)&faceMask, *readStreamPtrPtr, sizeof(VkStencilFaceFlags));
+                memcpy((VkStencilFaceFlags*)&faceMask, *readStreamPtrPtr,
+                       sizeof(VkStencilFaceFlags));
                 *readStreamPtrPtr += sizeof(VkStencilFaceFlags);
                 memcpy((uint32_t*)&reference, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetStencilReference 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)faceMask, (unsigned long long)reference);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdSetStencilReference 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)faceMask, (unsigned long long)reference);
                 }
                 vk->vkCmdSetStencilReference(unboxed_commandBuffer, faceMask, reference);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetStencilReference(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, faceMask, reference);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetStencilReference(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, faceMask,
+                        reference);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdBindDescriptorSets:
-            {
+            case OP_vkCmdBindDescriptorSets: {
                 android::base::beginTrace("vkCmdBindDescriptorSets decode");
                 VkCommandBuffer commandBuffer;
                 VkPipelineBindPoint pipelineBindPoint;
@@ -5914,52 +6672,70 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
-                memcpy((VkPipelineBindPoint*)&pipelineBindPoint, *readStreamPtrPtr, sizeof(VkPipelineBindPoint));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                memcpy((VkPipelineBindPoint*)&pipelineBindPoint, *readStreamPtrPtr,
+                       sizeof(VkPipelineBindPoint));
                 *readStreamPtrPtr += sizeof(VkPipelineBindPoint);
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPipelineLayout*)&layout = (VkPipelineLayout)unbox_VkPipelineLayout((VkPipelineLayout)(*&cgen_var_1));
+                *(VkPipelineLayout*)&layout =
+                    (VkPipelineLayout)unbox_VkPipelineLayout((VkPipelineLayout)(*&cgen_var_1));
                 memcpy((uint32_t*)&firstSet, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&descriptorSetCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pDescriptorSets, ((descriptorSetCount)) * sizeof(const VkDescriptorSet));
-                if (((descriptorSetCount)))
-                {
+                vkReadStream->alloc((void**)&pDescriptorSets,
+                                    ((descriptorSetCount)) * sizeof(const VkDescriptorSet));
+                if (((descriptorSetCount))) {
                     uint8_t* cgen_var_2_ptr = (uint8_t*)(*readStreamPtrPtr);
                     *readStreamPtrPtr += 8 * ((descriptorSetCount));
-                    for (uint32_t k = 0; k < ((descriptorSetCount)); ++k)
-                    {
-                        uint64_t tmpval; memcpy(&tmpval, cgen_var_2_ptr + k * 8, sizeof(uint64_t));
-                        *(((VkDescriptorSet*)pDescriptorSets) + k) = (VkDescriptorSet)unbox_VkDescriptorSet((VkDescriptorSet)tmpval);
+                    for (uint32_t k = 0; k < ((descriptorSetCount)); ++k) {
+                        uint64_t tmpval;
+                        memcpy(&tmpval, cgen_var_2_ptr + k * 8, sizeof(uint64_t));
+                        *(((VkDescriptorSet*)pDescriptorSets) + k) =
+                            (VkDescriptorSet)unbox_VkDescriptorSet((VkDescriptorSet)tmpval);
                     }
                 }
                 memcpy((uint32_t*)&dynamicOffsetCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pDynamicOffsets, ((dynamicOffsetCount)) * sizeof(const uint32_t));
-                memcpy((uint32_t*)pDynamicOffsets, *readStreamPtrPtr, ((dynamicOffsetCount)) * sizeof(const uint32_t));
+                vkReadStream->alloc((void**)&pDynamicOffsets,
+                                    ((dynamicOffsetCount)) * sizeof(const uint32_t));
+                memcpy((uint32_t*)pDynamicOffsets, *readStreamPtrPtr,
+                       ((dynamicOffsetCount)) * sizeof(const uint32_t));
                 *readStreamPtrPtr += ((dynamicOffsetCount)) * sizeof(const uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdBindDescriptorSets 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pipelineBindPoint, (unsigned long long)layout, (unsigned long long)firstSet, (unsigned long long)descriptorSetCount, (unsigned long long)pDescriptorSets, (unsigned long long)dynamicOffsetCount, (unsigned long long)pDynamicOffsets);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdBindDescriptorSets 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pipelineBindPoint, (unsigned long long)layout,
+                            (unsigned long long)firstSet, (unsigned long long)descriptorSetCount,
+                            (unsigned long long)pDescriptorSets,
+                            (unsigned long long)dynamicOffsetCount,
+                            (unsigned long long)pDynamicOffsets);
                 }
-                m_state->on_vkCmdBindDescriptorSets(&m_pool, commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
+                m_state->on_vkCmdBindDescriptorSets(
+                    &m_pool, commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount,
+                    pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdBindDescriptorSets(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdBindDescriptorSets(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
+                        dynamicOffsetCount, pDynamicOffsets);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdBindIndexBuffer:
-            {
+            case OP_vkCmdBindIndexBuffer: {
                 android::base::beginTrace("vkCmdBindIndexBuffer decode");
                 VkCommandBuffer commandBuffer;
                 VkBuffer buffer;
@@ -5969,7 +6745,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -5981,25 +6758,29 @@
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
                 memcpy((VkIndexType*)&indexType, *readStreamPtrPtr, sizeof(VkIndexType));
                 *readStreamPtrPtr += sizeof(VkIndexType);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdBindIndexBuffer 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)buffer, (unsigned long long)offset, (unsigned long long)indexType);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdBindIndexBuffer 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer, (unsigned long long)buffer,
+                            (unsigned long long)offset, (unsigned long long)indexType);
                 }
                 vk->vkCmdBindIndexBuffer(unboxed_commandBuffer, buffer, offset, indexType);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdBindIndexBuffer(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, buffer, offset, indexType);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdBindIndexBuffer(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, buffer,
+                        offset, indexType);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdBindVertexBuffers:
-            {
+            case OP_vkCmdBindVertexBuffers: {
                 android::base::beginTrace("vkCmdBindVertexBuffers decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t firstBinding;
@@ -6010,7 +6791,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -6019,38 +6801,46 @@
                 memcpy((uint32_t*)&bindingCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 vkReadStream->alloc((void**)&pBuffers, ((bindingCount)) * sizeof(const VkBuffer));
-                if (((bindingCount)))
-                {
+                if (((bindingCount))) {
                     uint8_t* cgen_var_1_ptr = (uint8_t*)(*readStreamPtrPtr);
                     *readStreamPtrPtr += 8 * ((bindingCount));
-                    for (uint32_t k = 0; k < ((bindingCount)); ++k)
-                    {
-                        uint64_t tmpval; memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
+                    for (uint32_t k = 0; k < ((bindingCount)); ++k) {
+                        uint64_t tmpval;
+                        memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
                         *(((VkBuffer*)pBuffers) + k) = (VkBuffer)unbox_VkBuffer((VkBuffer)tmpval);
                     }
                 }
-                vkReadStream->alloc((void**)&pOffsets, ((bindingCount)) * sizeof(const VkDeviceSize));
-                memcpy((VkDeviceSize*)pOffsets, *readStreamPtrPtr, ((bindingCount)) * sizeof(const VkDeviceSize));
+                vkReadStream->alloc((void**)&pOffsets,
+                                    ((bindingCount)) * sizeof(const VkDeviceSize));
+                memcpy((VkDeviceSize*)pOffsets, *readStreamPtrPtr,
+                       ((bindingCount)) * sizeof(const VkDeviceSize));
                 *readStreamPtrPtr += ((bindingCount)) * sizeof(const VkDeviceSize);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdBindVertexBuffers 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)firstBinding, (unsigned long long)bindingCount, (unsigned long long)pBuffers, (unsigned long long)pOffsets);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdBindVertexBuffers 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)firstBinding, (unsigned long long)bindingCount,
+                            (unsigned long long)pBuffers, (unsigned long long)pOffsets);
                 }
-                vk->vkCmdBindVertexBuffers(unboxed_commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
+                vk->vkCmdBindVertexBuffers(unboxed_commandBuffer, firstBinding, bindingCount,
+                                           pBuffers, pOffsets);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdBindVertexBuffers(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdBindVertexBuffers(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        firstBinding, bindingCount, pBuffers, pOffsets);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdDraw:
-            {
+            case OP_vkCmdDraw: {
                 android::base::beginTrace("vkCmdDraw decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t vertexCount;
@@ -6061,7 +6851,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -6073,25 +6864,31 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&firstInstance, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdDraw 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)vertexCount, (unsigned long long)instanceCount, (unsigned long long)firstVertex, (unsigned long long)firstInstance);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdDraw 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)vertexCount, (unsigned long long)instanceCount,
+                            (unsigned long long)firstVertex, (unsigned long long)firstInstance);
                 }
-                vk->vkCmdDraw(unboxed_commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
+                vk->vkCmdDraw(unboxed_commandBuffer, vertexCount, instanceCount, firstVertex,
+                              firstInstance);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdDraw(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdDraw(snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                                                   commandBuffer, vertexCount, instanceCount,
+                                                   firstVertex, firstInstance);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdDrawIndexed:
-            {
+            case OP_vkCmdDrawIndexed: {
                 android::base::beginTrace("vkCmdDrawIndexed decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t indexCount;
@@ -6103,7 +6900,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -6117,25 +6915,33 @@
                 *readStreamPtrPtr += sizeof(int32_t);
                 memcpy((uint32_t*)&firstInstance, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdDrawIndexed 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)indexCount, (unsigned long long)instanceCount, (unsigned long long)firstIndex, (unsigned long long)vertexOffset, (unsigned long long)firstInstance);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdDrawIndexed 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)indexCount, (unsigned long long)instanceCount,
+                            (unsigned long long)firstIndex, (unsigned long long)vertexOffset,
+                            (unsigned long long)firstInstance);
                 }
-                vk->vkCmdDrawIndexed(unboxed_commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
+                vk->vkCmdDrawIndexed(unboxed_commandBuffer, indexCount, instanceCount, firstIndex,
+                                     vertexOffset, firstInstance);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdDrawIndexed(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdDrawIndexed(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, indexCount,
+                        instanceCount, firstIndex, vertexOffset, firstInstance);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdDrawIndirect:
-            {
+            case OP_vkCmdDrawIndirect: {
                 android::base::beginTrace("vkCmdDrawIndirect decode");
                 VkCommandBuffer commandBuffer;
                 VkBuffer buffer;
@@ -6146,7 +6952,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -6160,25 +6967,31 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&stride, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdDrawIndirect 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)buffer, (unsigned long long)offset, (unsigned long long)drawCount, (unsigned long long)stride);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkCmdDrawIndirect 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)commandBuffer, (unsigned long long)buffer,
+                        (unsigned long long)offset, (unsigned long long)drawCount,
+                        (unsigned long long)stride);
                 }
                 vk->vkCmdDrawIndirect(unboxed_commandBuffer, buffer, offset, drawCount, stride);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdDrawIndirect(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, buffer, offset, drawCount, stride);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdDrawIndirect(snapshotTraceBegin, snapshotTraceBytes,
+                                                           &m_pool, commandBuffer, buffer, offset,
+                                                           drawCount, stride);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdDrawIndexedIndirect:
-            {
+            case OP_vkCmdDrawIndexedIndirect: {
                 android::base::beginTrace("vkCmdDrawIndexedIndirect decode");
                 VkCommandBuffer commandBuffer;
                 VkBuffer buffer;
@@ -6189,7 +7002,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -6203,25 +7017,32 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&stride, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdDrawIndexedIndirect 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)buffer, (unsigned long long)offset, (unsigned long long)drawCount, (unsigned long long)stride);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdDrawIndexedIndirect 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer, (unsigned long long)buffer,
+                            (unsigned long long)offset, (unsigned long long)drawCount,
+                            (unsigned long long)stride);
                 }
-                vk->vkCmdDrawIndexedIndirect(unboxed_commandBuffer, buffer, offset, drawCount, stride);
+                vk->vkCmdDrawIndexedIndirect(unboxed_commandBuffer, buffer, offset, drawCount,
+                                             stride);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdDrawIndexedIndirect(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, buffer, offset, drawCount, stride);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdDrawIndexedIndirect(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, buffer,
+                        offset, drawCount, stride);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdDispatch:
-            {
+            case OP_vkCmdDispatch: {
                 android::base::beginTrace("vkCmdDispatch decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t groupCountX;
@@ -6231,7 +7052,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -6241,25 +7063,29 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&groupCountZ, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdDispatch 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)groupCountX, (unsigned long long)groupCountY, (unsigned long long)groupCountZ);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdDispatch 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)groupCountX, (unsigned long long)groupCountY,
+                            (unsigned long long)groupCountZ);
                 }
                 vk->vkCmdDispatch(unboxed_commandBuffer, groupCountX, groupCountY, groupCountZ);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdDispatch(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, groupCountX, groupCountY, groupCountZ);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdDispatch(snapshotTraceBegin, snapshotTraceBytes,
+                                                       &m_pool, commandBuffer, groupCountX,
+                                                       groupCountY, groupCountZ);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdDispatchIndirect:
-            {
+            case OP_vkCmdDispatchIndirect: {
                 android::base::beginTrace("vkCmdDispatchIndirect decode");
                 VkCommandBuffer commandBuffer;
                 VkBuffer buffer;
@@ -6268,7 +7094,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -6278,25 +7105,28 @@
                 *(VkBuffer*)&buffer = (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_1));
                 memcpy((VkDeviceSize*)&offset, *readStreamPtrPtr, sizeof(VkDeviceSize));
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdDispatchIndirect 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)buffer, (unsigned long long)offset);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdDispatchIndirect 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer, (unsigned long long)buffer,
+                            (unsigned long long)offset);
                 }
                 vk->vkCmdDispatchIndirect(unboxed_commandBuffer, buffer, offset);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdDispatchIndirect(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, buffer, offset);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdDispatchIndirect(snapshotTraceBegin,
+                                                               snapshotTraceBytes, &m_pool,
+                                                               commandBuffer, buffer, offset);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdCopyBuffer:
-            {
+            case OP_vkCmdCopyBuffer: {
                 android::base::beginTrace("vkCmdCopyBuffer decode");
                 VkCommandBuffer commandBuffer;
                 VkBuffer srcBuffer;
@@ -6307,7 +7137,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -6321,37 +7152,42 @@
                 *(VkBuffer*)&dstBuffer = (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_2));
                 memcpy((uint32_t*)&regionCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pRegions, ((regionCount)) * sizeof(const VkBufferCopy));
-                for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
-                {
-                    reservedunmarshal_VkBufferCopy(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferCopy*)(pRegions + i), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pRegions,
+                                    ((regionCount)) * sizeof(const VkBufferCopy));
+                for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
+                    reservedunmarshal_VkBufferCopy(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                   (VkBufferCopy*)(pRegions + i), readStreamPtrPtr);
                 }
-                if (pRegions)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
-                    {
+                if (pRegions) {
+                    for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
                         transform_tohost_VkBufferCopy(m_state, (VkBufferCopy*)(pRegions + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdCopyBuffer 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)srcBuffer, (unsigned long long)dstBuffer, (unsigned long long)regionCount, (unsigned long long)pRegions);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdCopyBuffer 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)srcBuffer, (unsigned long long)dstBuffer,
+                            (unsigned long long)regionCount, (unsigned long long)pRegions);
                 }
-                vk->vkCmdCopyBuffer(unboxed_commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
+                vk->vkCmdCopyBuffer(unboxed_commandBuffer, srcBuffer, dstBuffer, regionCount,
+                                    pRegions);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdCopyBuffer(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdCopyBuffer(snapshotTraceBegin, snapshotTraceBytes,
+                                                         &m_pool, commandBuffer, srcBuffer,
+                                                         dstBuffer, regionCount, pRegions);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdCopyImage:
-            {
+            case OP_vkCmdCopyImage: {
                 android::base::beginTrace("vkCmdCopyImage decode");
                 VkCommandBuffer commandBuffer;
                 VkImage srcImage;
@@ -6364,7 +7200,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
@@ -6380,36 +7217,42 @@
                 memcpy((uint32_t*)&regionCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 vkReadStream->alloc((void**)&pRegions, ((regionCount)) * sizeof(const VkImageCopy));
-                for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
-                {
-                    reservedunmarshal_VkImageCopy(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageCopy*)(pRegions + i), readStreamPtrPtr);
+                for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
+                    reservedunmarshal_VkImageCopy(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                  (VkImageCopy*)(pRegions + i), readStreamPtrPtr);
                 }
-                if (pRegions)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
-                    {
+                if (pRegions) {
+                    for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
                         transform_tohost_VkImageCopy(m_state, (VkImageCopy*)(pRegions + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdCopyImage 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)srcImage, (unsigned long long)srcImageLayout, (unsigned long long)dstImage, (unsigned long long)dstImageLayout, (unsigned long long)regionCount, (unsigned long long)pRegions);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdCopyImage 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)srcImage, (unsigned long long)srcImageLayout,
+                            (unsigned long long)dstImage, (unsigned long long)dstImageLayout,
+                            (unsigned long long)regionCount, (unsigned long long)pRegions);
                 }
-                m_state->on_vkCmdCopyImage(&m_pool, commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
+                m_state->on_vkCmdCopyImage(&m_pool, commandBuffer, srcImage, srcImageLayout,
+                                           dstImage, dstImageLayout, regionCount, pRegions);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdCopyImage(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdCopyImage(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, srcImage,
+                        srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdBlitImage:
-            {
+            case OP_vkCmdBlitImage: {
                 android::base::beginTrace("vkCmdBlitImage decode");
                 VkCommandBuffer commandBuffer;
                 VkImage srcImage;
@@ -6423,7 +7266,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -6442,38 +7286,45 @@
                 memcpy((uint32_t*)&regionCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 vkReadStream->alloc((void**)&pRegions, ((regionCount)) * sizeof(const VkImageBlit));
-                for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
-                {
-                    reservedunmarshal_VkImageBlit(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageBlit*)(pRegions + i), readStreamPtrPtr);
+                for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
+                    reservedunmarshal_VkImageBlit(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                  (VkImageBlit*)(pRegions + i), readStreamPtrPtr);
                 }
                 memcpy((VkFilter*)&filter, *readStreamPtrPtr, sizeof(VkFilter));
                 *readStreamPtrPtr += sizeof(VkFilter);
-                if (pRegions)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
-                    {
+                if (pRegions) {
+                    for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
                         transform_tohost_VkImageBlit(m_state, (VkImageBlit*)(pRegions + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdBlitImage 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)srcImage, (unsigned long long)srcImageLayout, (unsigned long long)dstImage, (unsigned long long)dstImageLayout, (unsigned long long)regionCount, (unsigned long long)pRegions, (unsigned long long)filter);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdBlitImage 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)srcImage, (unsigned long long)srcImageLayout,
+                            (unsigned long long)dstImage, (unsigned long long)dstImageLayout,
+                            (unsigned long long)regionCount, (unsigned long long)pRegions,
+                            (unsigned long long)filter);
                 }
-                vk->vkCmdBlitImage(unboxed_commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
+                vk->vkCmdBlitImage(unboxed_commandBuffer, srcImage, srcImageLayout, dstImage,
+                                   dstImageLayout, regionCount, pRegions, filter);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdBlitImage(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdBlitImage(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, srcImage,
+                        srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdCopyBufferToImage:
-            {
+            case OP_vkCmdCopyBufferToImage: {
                 android::base::beginTrace("vkCmdCopyBufferToImage decode");
                 VkCommandBuffer commandBuffer;
                 VkBuffer srcBuffer;
@@ -6485,7 +7336,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
@@ -6498,37 +7350,46 @@
                 *readStreamPtrPtr += sizeof(VkImageLayout);
                 memcpy((uint32_t*)&regionCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pRegions, ((regionCount)) * sizeof(const VkBufferImageCopy));
-                for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
-                {
-                    reservedunmarshal_VkBufferImageCopy(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferImageCopy*)(pRegions + i), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pRegions,
+                                    ((regionCount)) * sizeof(const VkBufferImageCopy));
+                for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
+                    reservedunmarshal_VkBufferImageCopy(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                        (VkBufferImageCopy*)(pRegions + i),
+                                                        readStreamPtrPtr);
                 }
-                if (pRegions)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
-                    {
-                        transform_tohost_VkBufferImageCopy(m_state, (VkBufferImageCopy*)(pRegions + i));
+                if (pRegions) {
+                    for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
+                        transform_tohost_VkBufferImageCopy(m_state,
+                                                           (VkBufferImageCopy*)(pRegions + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdCopyBufferToImage 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)srcBuffer, (unsigned long long)dstImage, (unsigned long long)dstImageLayout, (unsigned long long)regionCount, (unsigned long long)pRegions);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdCopyBufferToImage 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)srcBuffer, (unsigned long long)dstImage,
+                            (unsigned long long)dstImageLayout, (unsigned long long)regionCount,
+                            (unsigned long long)pRegions);
                 }
-                m_state->on_vkCmdCopyBufferToImage(&m_pool, commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
+                m_state->on_vkCmdCopyBufferToImage(&m_pool, commandBuffer, srcBuffer, dstImage,
+                                                   dstImageLayout, regionCount, pRegions);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdCopyBufferToImage(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdCopyBufferToImage(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, srcBuffer,
+                        dstImage, dstImageLayout, regionCount, pRegions);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdCopyImageToBuffer:
-            {
+            case OP_vkCmdCopyImageToBuffer: {
                 android::base::beginTrace("vkCmdCopyImageToBuffer decode");
                 VkCommandBuffer commandBuffer;
                 VkImage srcImage;
@@ -6540,7 +7401,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
@@ -6553,37 +7415,46 @@
                 *(VkBuffer*)&dstBuffer = (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_2));
                 memcpy((uint32_t*)&regionCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pRegions, ((regionCount)) * sizeof(const VkBufferImageCopy));
-                for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
-                {
-                    reservedunmarshal_VkBufferImageCopy(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferImageCopy*)(pRegions + i), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pRegions,
+                                    ((regionCount)) * sizeof(const VkBufferImageCopy));
+                for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
+                    reservedunmarshal_VkBufferImageCopy(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                        (VkBufferImageCopy*)(pRegions + i),
+                                                        readStreamPtrPtr);
                 }
-                if (pRegions)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
-                    {
-                        transform_tohost_VkBufferImageCopy(m_state, (VkBufferImageCopy*)(pRegions + i));
+                if (pRegions) {
+                    for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
+                        transform_tohost_VkBufferImageCopy(m_state,
+                                                           (VkBufferImageCopy*)(pRegions + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdCopyImageToBuffer 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)srcImage, (unsigned long long)srcImageLayout, (unsigned long long)dstBuffer, (unsigned long long)regionCount, (unsigned long long)pRegions);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdCopyImageToBuffer 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)srcImage, (unsigned long long)srcImageLayout,
+                            (unsigned long long)dstBuffer, (unsigned long long)regionCount,
+                            (unsigned long long)pRegions);
                 }
-                m_state->on_vkCmdCopyImageToBuffer(&m_pool, commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
+                m_state->on_vkCmdCopyImageToBuffer(&m_pool, commandBuffer, srcImage, srcImageLayout,
+                                                   dstBuffer, regionCount, pRegions);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdCopyImageToBuffer(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdCopyImageToBuffer(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, srcImage,
+                        srcImageLayout, dstBuffer, regionCount, pRegions);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdUpdateBuffer:
-            {
+            case OP_vkCmdUpdateBuffer: {
                 android::base::beginTrace("vkCmdUpdateBuffer decode");
                 VkCommandBuffer commandBuffer;
                 VkBuffer dstBuffer;
@@ -6594,7 +7465,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -6609,25 +7481,31 @@
                 vkReadStream->alloc((void**)&pData, ((dataSize)) * sizeof(const uint8_t));
                 memcpy((void*)pData, *readStreamPtrPtr, ((dataSize)) * sizeof(const uint8_t));
                 *readStreamPtrPtr += ((dataSize)) * sizeof(const uint8_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdUpdateBuffer 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)dstBuffer, (unsigned long long)dstOffset, (unsigned long long)dataSize, (unsigned long long)pData);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkCmdUpdateBuffer 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)commandBuffer, (unsigned long long)dstBuffer,
+                        (unsigned long long)dstOffset, (unsigned long long)dataSize,
+                        (unsigned long long)pData);
                 }
                 vk->vkCmdUpdateBuffer(unboxed_commandBuffer, dstBuffer, dstOffset, dataSize, pData);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdUpdateBuffer(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, dstBuffer, dstOffset, dataSize, pData);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdUpdateBuffer(snapshotTraceBegin, snapshotTraceBytes,
+                                                           &m_pool, commandBuffer, dstBuffer,
+                                                           dstOffset, dataSize, pData);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdFillBuffer:
-            {
+            case OP_vkCmdFillBuffer: {
                 android::base::beginTrace("vkCmdFillBuffer decode");
                 VkCommandBuffer commandBuffer;
                 VkBuffer dstBuffer;
@@ -6638,7 +7516,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -6652,25 +7531,30 @@
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
                 memcpy((uint32_t*)&data, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdFillBuffer 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)dstBuffer, (unsigned long long)dstOffset, (unsigned long long)size, (unsigned long long)data);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdFillBuffer 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)dstBuffer, (unsigned long long)dstOffset,
+                            (unsigned long long)size, (unsigned long long)data);
                 }
                 vk->vkCmdFillBuffer(unboxed_commandBuffer, dstBuffer, dstOffset, size, data);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdFillBuffer(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, dstBuffer, dstOffset, size, data);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdFillBuffer(snapshotTraceBegin, snapshotTraceBytes,
+                                                         &m_pool, commandBuffer, dstBuffer,
+                                                         dstOffset, size, data);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdClearColorImage:
-            {
+            case OP_vkCmdClearColorImage: {
                 android::base::beginTrace("vkCmdClearColorImage decode");
                 VkCommandBuffer commandBuffer;
                 VkImage image;
@@ -6682,7 +7566,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -6693,44 +7578,52 @@
                 memcpy((VkImageLayout*)&imageLayout, *readStreamPtrPtr, sizeof(VkImageLayout));
                 *readStreamPtrPtr += sizeof(VkImageLayout);
                 vkReadStream->alloc((void**)&pColor, sizeof(const VkClearColorValue));
-                reservedunmarshal_VkClearColorValue(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkClearColorValue*)(pColor), readStreamPtrPtr);
+                reservedunmarshal_VkClearColorValue(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                    (VkClearColorValue*)(pColor), readStreamPtrPtr);
                 memcpy((uint32_t*)&rangeCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pRanges, ((rangeCount)) * sizeof(const VkImageSubresourceRange));
-                for (uint32_t i = 0; i < (uint32_t)((rangeCount)); ++i)
-                {
-                    reservedunmarshal_VkImageSubresourceRange(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageSubresourceRange*)(pRanges + i), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pRanges,
+                                    ((rangeCount)) * sizeof(const VkImageSubresourceRange));
+                for (uint32_t i = 0; i < (uint32_t)((rangeCount)); ++i) {
+                    reservedunmarshal_VkImageSubresourceRange(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkImageSubresourceRange*)(pRanges + i), readStreamPtrPtr);
                 }
-                if (pColor)
-                {
+                if (pColor) {
                     transform_tohost_VkClearColorValue(m_state, (VkClearColorValue*)(pColor));
                 }
-                if (pRanges)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((rangeCount)); ++i)
-                    {
-                        transform_tohost_VkImageSubresourceRange(m_state, (VkImageSubresourceRange*)(pRanges + i));
+                if (pRanges) {
+                    for (uint32_t i = 0; i < (uint32_t)((rangeCount)); ++i) {
+                        transform_tohost_VkImageSubresourceRange(
+                            m_state, (VkImageSubresourceRange*)(pRanges + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdClearColorImage 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)image, (unsigned long long)imageLayout, (unsigned long long)pColor, (unsigned long long)rangeCount, (unsigned long long)pRanges);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdClearColorImage 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer, (unsigned long long)image,
+                            (unsigned long long)imageLayout, (unsigned long long)pColor,
+                            (unsigned long long)rangeCount, (unsigned long long)pRanges);
                 }
-                vk->vkCmdClearColorImage(unboxed_commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
+                vk->vkCmdClearColorImage(unboxed_commandBuffer, image, imageLayout, pColor,
+                                         rangeCount, pRanges);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdClearColorImage(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdClearColorImage(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, image,
+                        imageLayout, pColor, rangeCount, pRanges);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdClearDepthStencilImage:
-            {
+            case OP_vkCmdClearDepthStencilImage: {
                 android::base::beginTrace("vkCmdClearDepthStencilImage decode");
                 VkCommandBuffer commandBuffer;
                 VkImage image;
@@ -6742,7 +7635,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -6753,44 +7647,54 @@
                 memcpy((VkImageLayout*)&imageLayout, *readStreamPtrPtr, sizeof(VkImageLayout));
                 *readStreamPtrPtr += sizeof(VkImageLayout);
                 vkReadStream->alloc((void**)&pDepthStencil, sizeof(const VkClearDepthStencilValue));
-                reservedunmarshal_VkClearDepthStencilValue(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkClearDepthStencilValue*)(pDepthStencil), readStreamPtrPtr);
+                reservedunmarshal_VkClearDepthStencilValue(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkClearDepthStencilValue*)(pDepthStencil), readStreamPtrPtr);
                 memcpy((uint32_t*)&rangeCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pRanges, ((rangeCount)) * sizeof(const VkImageSubresourceRange));
-                for (uint32_t i = 0; i < (uint32_t)((rangeCount)); ++i)
-                {
-                    reservedunmarshal_VkImageSubresourceRange(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageSubresourceRange*)(pRanges + i), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pRanges,
+                                    ((rangeCount)) * sizeof(const VkImageSubresourceRange));
+                for (uint32_t i = 0; i < (uint32_t)((rangeCount)); ++i) {
+                    reservedunmarshal_VkImageSubresourceRange(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkImageSubresourceRange*)(pRanges + i), readStreamPtrPtr);
                 }
-                if (pDepthStencil)
-                {
-                    transform_tohost_VkClearDepthStencilValue(m_state, (VkClearDepthStencilValue*)(pDepthStencil));
+                if (pDepthStencil) {
+                    transform_tohost_VkClearDepthStencilValue(
+                        m_state, (VkClearDepthStencilValue*)(pDepthStencil));
                 }
-                if (pRanges)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((rangeCount)); ++i)
-                    {
-                        transform_tohost_VkImageSubresourceRange(m_state, (VkImageSubresourceRange*)(pRanges + i));
+                if (pRanges) {
+                    for (uint32_t i = 0; i < (uint32_t)((rangeCount)); ++i) {
+                        transform_tohost_VkImageSubresourceRange(
+                            m_state, (VkImageSubresourceRange*)(pRanges + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdClearDepthStencilImage 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)image, (unsigned long long)imageLayout, (unsigned long long)pDepthStencil, (unsigned long long)rangeCount, (unsigned long long)pRanges);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdClearDepthStencilImage 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer, (unsigned long long)image,
+                            (unsigned long long)imageLayout, (unsigned long long)pDepthStencil,
+                            (unsigned long long)rangeCount, (unsigned long long)pRanges);
                 }
-                vk->vkCmdClearDepthStencilImage(unboxed_commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
+                vk->vkCmdClearDepthStencilImage(unboxed_commandBuffer, image, imageLayout,
+                                                pDepthStencil, rangeCount, pRanges);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdClearDepthStencilImage(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdClearDepthStencilImage(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, image,
+                        imageLayout, pDepthStencil, rangeCount, pRanges);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdClearAttachments:
-            {
+            case OP_vkCmdClearAttachments: {
                 android::base::beginTrace("vkCmdClearAttachments decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t attachmentCount;
@@ -6801,57 +7705,64 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 memcpy((uint32_t*)&attachmentCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pAttachments, ((attachmentCount)) * sizeof(const VkClearAttachment));
-                for (uint32_t i = 0; i < (uint32_t)((attachmentCount)); ++i)
-                {
-                    reservedunmarshal_VkClearAttachment(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkClearAttachment*)(pAttachments + i), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pAttachments,
+                                    ((attachmentCount)) * sizeof(const VkClearAttachment));
+                for (uint32_t i = 0; i < (uint32_t)((attachmentCount)); ++i) {
+                    reservedunmarshal_VkClearAttachment(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                        (VkClearAttachment*)(pAttachments + i),
+                                                        readStreamPtrPtr);
                 }
                 memcpy((uint32_t*)&rectCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 vkReadStream->alloc((void**)&pRects, ((rectCount)) * sizeof(const VkClearRect));
-                for (uint32_t i = 0; i < (uint32_t)((rectCount)); ++i)
-                {
-                    reservedunmarshal_VkClearRect(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkClearRect*)(pRects + i), readStreamPtrPtr);
+                for (uint32_t i = 0; i < (uint32_t)((rectCount)); ++i) {
+                    reservedunmarshal_VkClearRect(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                  (VkClearRect*)(pRects + i), readStreamPtrPtr);
                 }
-                if (pAttachments)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((attachmentCount)); ++i)
-                    {
-                        transform_tohost_VkClearAttachment(m_state, (VkClearAttachment*)(pAttachments + i));
+                if (pAttachments) {
+                    for (uint32_t i = 0; i < (uint32_t)((attachmentCount)); ++i) {
+                        transform_tohost_VkClearAttachment(m_state,
+                                                           (VkClearAttachment*)(pAttachments + i));
                     }
                 }
-                if (pRects)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((rectCount)); ++i)
-                    {
+                if (pRects) {
+                    for (uint32_t i = 0; i < (uint32_t)((rectCount)); ++i) {
                         transform_tohost_VkClearRect(m_state, (VkClearRect*)(pRects + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdClearAttachments 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)attachmentCount, (unsigned long long)pAttachments, (unsigned long long)rectCount, (unsigned long long)pRects);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdClearAttachments 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)attachmentCount, (unsigned long long)pAttachments,
+                            (unsigned long long)rectCount, (unsigned long long)pRects);
                 }
-                vk->vkCmdClearAttachments(unboxed_commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
+                vk->vkCmdClearAttachments(unboxed_commandBuffer, attachmentCount, pAttachments,
+                                          rectCount, pRects);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdClearAttachments(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdClearAttachments(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        attachmentCount, pAttachments, rectCount, pRects);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdResolveImage:
-            {
+            case OP_vkCmdResolveImage: {
                 android::base::beginTrace("vkCmdResolveImage decode");
                 VkCommandBuffer commandBuffer;
                 VkImage srcImage;
@@ -6864,7 +7775,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -6882,37 +7794,45 @@
                 *readStreamPtrPtr += sizeof(VkImageLayout);
                 memcpy((uint32_t*)&regionCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pRegions, ((regionCount)) * sizeof(const VkImageResolve));
-                for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
-                {
-                    reservedunmarshal_VkImageResolve(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageResolve*)(pRegions + i), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pRegions,
+                                    ((regionCount)) * sizeof(const VkImageResolve));
+                for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
+                    reservedunmarshal_VkImageResolve(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                     (VkImageResolve*)(pRegions + i),
+                                                     readStreamPtrPtr);
                 }
-                if (pRegions)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
-                    {
+                if (pRegions) {
+                    for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
                         transform_tohost_VkImageResolve(m_state, (VkImageResolve*)(pRegions + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdResolveImage 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)srcImage, (unsigned long long)srcImageLayout, (unsigned long long)dstImage, (unsigned long long)dstImageLayout, (unsigned long long)regionCount, (unsigned long long)pRegions);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdResolveImage 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)srcImage, (unsigned long long)srcImageLayout,
+                            (unsigned long long)dstImage, (unsigned long long)dstImageLayout,
+                            (unsigned long long)regionCount, (unsigned long long)pRegions);
                 }
-                vk->vkCmdResolveImage(unboxed_commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
+                vk->vkCmdResolveImage(unboxed_commandBuffer, srcImage, srcImageLayout, dstImage,
+                                      dstImageLayout, regionCount, pRegions);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdResolveImage(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdResolveImage(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, srcImage,
+                        srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetEvent:
-            {
+            case OP_vkCmdSetEvent: {
                 android::base::beginTrace("vkCmdSetEvent decode");
                 VkCommandBuffer commandBuffer;
                 VkEvent event;
@@ -6921,7 +7841,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -6929,27 +7850,30 @@
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkEvent*)&event = (VkEvent)unbox_VkEvent((VkEvent)(*&cgen_var_1));
-                memcpy((VkPipelineStageFlags*)&stageMask, *readStreamPtrPtr, sizeof(VkPipelineStageFlags));
+                memcpy((VkPipelineStageFlags*)&stageMask, *readStreamPtrPtr,
+                       sizeof(VkPipelineStageFlags));
                 *readStreamPtrPtr += sizeof(VkPipelineStageFlags);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetEvent 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)event, (unsigned long long)stageMask);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdSetEvent 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer, (unsigned long long)event,
+                            (unsigned long long)stageMask);
                 }
                 vk->vkCmdSetEvent(unboxed_commandBuffer, event, stageMask);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetEvent(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, event, stageMask);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetEvent(snapshotTraceBegin, snapshotTraceBytes,
+                                                       &m_pool, commandBuffer, event, stageMask);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdResetEvent:
-            {
+            case OP_vkCmdResetEvent: {
                 android::base::beginTrace("vkCmdResetEvent decode");
                 VkCommandBuffer commandBuffer;
                 VkEvent event;
@@ -6958,7 +7882,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -6966,27 +7891,30 @@
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkEvent*)&event = (VkEvent)unbox_VkEvent((VkEvent)(*&cgen_var_1));
-                memcpy((VkPipelineStageFlags*)&stageMask, *readStreamPtrPtr, sizeof(VkPipelineStageFlags));
+                memcpy((VkPipelineStageFlags*)&stageMask, *readStreamPtrPtr,
+                       sizeof(VkPipelineStageFlags));
                 *readStreamPtrPtr += sizeof(VkPipelineStageFlags);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdResetEvent 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)event, (unsigned long long)stageMask);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdResetEvent 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer, (unsigned long long)event,
+                            (unsigned long long)stageMask);
                 }
                 vk->vkCmdResetEvent(unboxed_commandBuffer, event, stageMask);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdResetEvent(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, event, stageMask);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdResetEvent(snapshotTraceBegin, snapshotTraceBytes,
+                                                         &m_pool, commandBuffer, event, stageMask);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdWaitEvents:
-            {
+            case OP_vkCmdWaitEvents: {
                 android::base::beginTrace("vkCmdWaitEvents decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t eventCount;
@@ -7003,88 +7931,112 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 memcpy((uint32_t*)&eventCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 vkReadStream->alloc((void**)&pEvents, ((eventCount)) * sizeof(const VkEvent));
-                if (((eventCount)))
-                {
+                if (((eventCount))) {
                     uint8_t* cgen_var_1_ptr = (uint8_t*)(*readStreamPtrPtr);
                     *readStreamPtrPtr += 8 * ((eventCount));
-                    for (uint32_t k = 0; k < ((eventCount)); ++k)
-                    {
-                        uint64_t tmpval; memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
+                    for (uint32_t k = 0; k < ((eventCount)); ++k) {
+                        uint64_t tmpval;
+                        memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
                         *(((VkEvent*)pEvents) + k) = (VkEvent)unbox_VkEvent((VkEvent)tmpval);
                     }
                 }
-                memcpy((VkPipelineStageFlags*)&srcStageMask, *readStreamPtrPtr, sizeof(VkPipelineStageFlags));
+                memcpy((VkPipelineStageFlags*)&srcStageMask, *readStreamPtrPtr,
+                       sizeof(VkPipelineStageFlags));
                 *readStreamPtrPtr += sizeof(VkPipelineStageFlags);
-                memcpy((VkPipelineStageFlags*)&dstStageMask, *readStreamPtrPtr, sizeof(VkPipelineStageFlags));
+                memcpy((VkPipelineStageFlags*)&dstStageMask, *readStreamPtrPtr,
+                       sizeof(VkPipelineStageFlags));
                 *readStreamPtrPtr += sizeof(VkPipelineStageFlags);
                 memcpy((uint32_t*)&memoryBarrierCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pMemoryBarriers, ((memoryBarrierCount)) * sizeof(const VkMemoryBarrier));
-                for (uint32_t i = 0; i < (uint32_t)((memoryBarrierCount)); ++i)
-                {
-                    reservedunmarshal_VkMemoryBarrier(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryBarrier*)(pMemoryBarriers + i), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pMemoryBarriers,
+                                    ((memoryBarrierCount)) * sizeof(const VkMemoryBarrier));
+                for (uint32_t i = 0; i < (uint32_t)((memoryBarrierCount)); ++i) {
+                    reservedunmarshal_VkMemoryBarrier(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                      (VkMemoryBarrier*)(pMemoryBarriers + i),
+                                                      readStreamPtrPtr);
                 }
                 memcpy((uint32_t*)&bufferMemoryBarrierCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pBufferMemoryBarriers, ((bufferMemoryBarrierCount)) * sizeof(const VkBufferMemoryBarrier));
-                for (uint32_t i = 0; i < (uint32_t)((bufferMemoryBarrierCount)); ++i)
-                {
-                    reservedunmarshal_VkBufferMemoryBarrier(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferMemoryBarrier*)(pBufferMemoryBarriers + i), readStreamPtrPtr);
+                vkReadStream->alloc(
+                    (void**)&pBufferMemoryBarriers,
+                    ((bufferMemoryBarrierCount)) * sizeof(const VkBufferMemoryBarrier));
+                for (uint32_t i = 0; i < (uint32_t)((bufferMemoryBarrierCount)); ++i) {
+                    reservedunmarshal_VkBufferMemoryBarrier(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkBufferMemoryBarrier*)(pBufferMemoryBarriers + i), readStreamPtrPtr);
                 }
                 memcpy((uint32_t*)&imageMemoryBarrierCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pImageMemoryBarriers, ((imageMemoryBarrierCount)) * sizeof(const VkImageMemoryBarrier));
-                for (uint32_t i = 0; i < (uint32_t)((imageMemoryBarrierCount)); ++i)
-                {
-                    reservedunmarshal_VkImageMemoryBarrier(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageMemoryBarrier*)(pImageMemoryBarriers + i), readStreamPtrPtr);
+                vkReadStream->alloc(
+                    (void**)&pImageMemoryBarriers,
+                    ((imageMemoryBarrierCount)) * sizeof(const VkImageMemoryBarrier));
+                for (uint32_t i = 0; i < (uint32_t)((imageMemoryBarrierCount)); ++i) {
+                    reservedunmarshal_VkImageMemoryBarrier(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkImageMemoryBarrier*)(pImageMemoryBarriers + i), readStreamPtrPtr);
                 }
-                if (pMemoryBarriers)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((memoryBarrierCount)); ++i)
-                    {
-                        transform_tohost_VkMemoryBarrier(m_state, (VkMemoryBarrier*)(pMemoryBarriers + i));
+                if (pMemoryBarriers) {
+                    for (uint32_t i = 0; i < (uint32_t)((memoryBarrierCount)); ++i) {
+                        transform_tohost_VkMemoryBarrier(m_state,
+                                                         (VkMemoryBarrier*)(pMemoryBarriers + i));
                     }
                 }
-                if (pBufferMemoryBarriers)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((bufferMemoryBarrierCount)); ++i)
-                    {
-                        transform_tohost_VkBufferMemoryBarrier(m_state, (VkBufferMemoryBarrier*)(pBufferMemoryBarriers + i));
+                if (pBufferMemoryBarriers) {
+                    for (uint32_t i = 0; i < (uint32_t)((bufferMemoryBarrierCount)); ++i) {
+                        transform_tohost_VkBufferMemoryBarrier(
+                            m_state, (VkBufferMemoryBarrier*)(pBufferMemoryBarriers + i));
                     }
                 }
-                if (pImageMemoryBarriers)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((imageMemoryBarrierCount)); ++i)
-                    {
-                        transform_tohost_VkImageMemoryBarrier(m_state, (VkImageMemoryBarrier*)(pImageMemoryBarriers + i));
+                if (pImageMemoryBarriers) {
+                    for (uint32_t i = 0; i < (uint32_t)((imageMemoryBarrierCount)); ++i) {
+                        transform_tohost_VkImageMemoryBarrier(
+                            m_state, (VkImageMemoryBarrier*)(pImageMemoryBarriers + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdWaitEvents 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)eventCount, (unsigned long long)pEvents, (unsigned long long)srcStageMask, (unsigned long long)dstStageMask, (unsigned long long)memoryBarrierCount, (unsigned long long)pMemoryBarriers, (unsigned long long)bufferMemoryBarrierCount, (unsigned long long)pBufferMemoryBarriers, (unsigned long long)imageMemoryBarrierCount, (unsigned long long)pImageMemoryBarriers);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdWaitEvents 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)eventCount, (unsigned long long)pEvents,
+                            (unsigned long long)srcStageMask, (unsigned long long)dstStageMask,
+                            (unsigned long long)memoryBarrierCount,
+                            (unsigned long long)pMemoryBarriers,
+                            (unsigned long long)bufferMemoryBarrierCount,
+                            (unsigned long long)pBufferMemoryBarriers,
+                            (unsigned long long)imageMemoryBarrierCount,
+                            (unsigned long long)pImageMemoryBarriers);
                 }
-                vk->vkCmdWaitEvents(unboxed_commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
+                vk->vkCmdWaitEvents(unboxed_commandBuffer, eventCount, pEvents, srcStageMask,
+                                    dstStageMask, memoryBarrierCount, pMemoryBarriers,
+                                    bufferMemoryBarrierCount, pBufferMemoryBarriers,
+                                    imageMemoryBarrierCount, pImageMemoryBarriers);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdWaitEvents(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdWaitEvents(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, eventCount,
+                        pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
+                        bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount,
+                        pImageMemoryBarriers);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdPipelineBarrier:
-            {
+            case OP_vkCmdPipelineBarrier: {
                 android::base::beginTrace("vkCmdPipelineBarrier decode");
                 VkCommandBuffer commandBuffer;
                 VkPipelineStageFlags srcStageMask;
@@ -7100,74 +8052,100 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
-                memcpy((VkPipelineStageFlags*)&srcStageMask, *readStreamPtrPtr, sizeof(VkPipelineStageFlags));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                memcpy((VkPipelineStageFlags*)&srcStageMask, *readStreamPtrPtr,
+                       sizeof(VkPipelineStageFlags));
                 *readStreamPtrPtr += sizeof(VkPipelineStageFlags);
-                memcpy((VkPipelineStageFlags*)&dstStageMask, *readStreamPtrPtr, sizeof(VkPipelineStageFlags));
+                memcpy((VkPipelineStageFlags*)&dstStageMask, *readStreamPtrPtr,
+                       sizeof(VkPipelineStageFlags));
                 *readStreamPtrPtr += sizeof(VkPipelineStageFlags);
-                memcpy((VkDependencyFlags*)&dependencyFlags, *readStreamPtrPtr, sizeof(VkDependencyFlags));
+                memcpy((VkDependencyFlags*)&dependencyFlags, *readStreamPtrPtr,
+                       sizeof(VkDependencyFlags));
                 *readStreamPtrPtr += sizeof(VkDependencyFlags);
                 memcpy((uint32_t*)&memoryBarrierCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pMemoryBarriers, ((memoryBarrierCount)) * sizeof(const VkMemoryBarrier));
-                for (uint32_t i = 0; i < (uint32_t)((memoryBarrierCount)); ++i)
-                {
-                    reservedunmarshal_VkMemoryBarrier(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryBarrier*)(pMemoryBarriers + i), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pMemoryBarriers,
+                                    ((memoryBarrierCount)) * sizeof(const VkMemoryBarrier));
+                for (uint32_t i = 0; i < (uint32_t)((memoryBarrierCount)); ++i) {
+                    reservedunmarshal_VkMemoryBarrier(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                      (VkMemoryBarrier*)(pMemoryBarriers + i),
+                                                      readStreamPtrPtr);
                 }
                 memcpy((uint32_t*)&bufferMemoryBarrierCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pBufferMemoryBarriers, ((bufferMemoryBarrierCount)) * sizeof(const VkBufferMemoryBarrier));
-                for (uint32_t i = 0; i < (uint32_t)((bufferMemoryBarrierCount)); ++i)
-                {
-                    reservedunmarshal_VkBufferMemoryBarrier(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferMemoryBarrier*)(pBufferMemoryBarriers + i), readStreamPtrPtr);
+                vkReadStream->alloc(
+                    (void**)&pBufferMemoryBarriers,
+                    ((bufferMemoryBarrierCount)) * sizeof(const VkBufferMemoryBarrier));
+                for (uint32_t i = 0; i < (uint32_t)((bufferMemoryBarrierCount)); ++i) {
+                    reservedunmarshal_VkBufferMemoryBarrier(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkBufferMemoryBarrier*)(pBufferMemoryBarriers + i), readStreamPtrPtr);
                 }
                 memcpy((uint32_t*)&imageMemoryBarrierCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pImageMemoryBarriers, ((imageMemoryBarrierCount)) * sizeof(const VkImageMemoryBarrier));
-                for (uint32_t i = 0; i < (uint32_t)((imageMemoryBarrierCount)); ++i)
-                {
-                    reservedunmarshal_VkImageMemoryBarrier(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageMemoryBarrier*)(pImageMemoryBarriers + i), readStreamPtrPtr);
+                vkReadStream->alloc(
+                    (void**)&pImageMemoryBarriers,
+                    ((imageMemoryBarrierCount)) * sizeof(const VkImageMemoryBarrier));
+                for (uint32_t i = 0; i < (uint32_t)((imageMemoryBarrierCount)); ++i) {
+                    reservedunmarshal_VkImageMemoryBarrier(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkImageMemoryBarrier*)(pImageMemoryBarriers + i), readStreamPtrPtr);
                 }
-                if (pMemoryBarriers)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((memoryBarrierCount)); ++i)
-                    {
-                        transform_tohost_VkMemoryBarrier(m_state, (VkMemoryBarrier*)(pMemoryBarriers + i));
+                if (pMemoryBarriers) {
+                    for (uint32_t i = 0; i < (uint32_t)((memoryBarrierCount)); ++i) {
+                        transform_tohost_VkMemoryBarrier(m_state,
+                                                         (VkMemoryBarrier*)(pMemoryBarriers + i));
                     }
                 }
-                if (pBufferMemoryBarriers)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((bufferMemoryBarrierCount)); ++i)
-                    {
-                        transform_tohost_VkBufferMemoryBarrier(m_state, (VkBufferMemoryBarrier*)(pBufferMemoryBarriers + i));
+                if (pBufferMemoryBarriers) {
+                    for (uint32_t i = 0; i < (uint32_t)((bufferMemoryBarrierCount)); ++i) {
+                        transform_tohost_VkBufferMemoryBarrier(
+                            m_state, (VkBufferMemoryBarrier*)(pBufferMemoryBarriers + i));
                     }
                 }
-                if (pImageMemoryBarriers)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((imageMemoryBarrierCount)); ++i)
-                    {
-                        transform_tohost_VkImageMemoryBarrier(m_state, (VkImageMemoryBarrier*)(pImageMemoryBarriers + i));
+                if (pImageMemoryBarriers) {
+                    for (uint32_t i = 0; i < (uint32_t)((imageMemoryBarrierCount)); ++i) {
+                        transform_tohost_VkImageMemoryBarrier(
+                            m_state, (VkImageMemoryBarrier*)(pImageMemoryBarriers + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdPipelineBarrier 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)srcStageMask, (unsigned long long)dstStageMask, (unsigned long long)dependencyFlags, (unsigned long long)memoryBarrierCount, (unsigned long long)pMemoryBarriers, (unsigned long long)bufferMemoryBarrierCount, (unsigned long long)pBufferMemoryBarriers, (unsigned long long)imageMemoryBarrierCount, (unsigned long long)pImageMemoryBarriers);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdPipelineBarrier 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)srcStageMask, (unsigned long long)dstStageMask,
+                            (unsigned long long)dependencyFlags,
+                            (unsigned long long)memoryBarrierCount,
+                            (unsigned long long)pMemoryBarriers,
+                            (unsigned long long)bufferMemoryBarrierCount,
+                            (unsigned long long)pBufferMemoryBarriers,
+                            (unsigned long long)imageMemoryBarrierCount,
+                            (unsigned long long)pImageMemoryBarriers);
                 }
-                m_state->on_vkCmdPipelineBarrier(&m_pool, commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
+                m_state->on_vkCmdPipelineBarrier(
+                    &m_pool, commandBuffer, srcStageMask, dstStageMask, dependencyFlags,
+                    memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
+                    pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdPipelineBarrier(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdPipelineBarrier(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount,
+                        pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
+                        imageMemoryBarrierCount, pImageMemoryBarriers);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdBeginQuery:
-            {
+            case OP_vkCmdBeginQuery: {
                 android::base::beginTrace("vkCmdBeginQuery decode");
                 VkCommandBuffer commandBuffer;
                 VkQueryPool queryPool;
@@ -7177,37 +8155,44 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkQueryPool*)&queryPool = (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_1));
+                *(VkQueryPool*)&queryPool =
+                    (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_1));
                 memcpy((uint32_t*)&query, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                memcpy((VkQueryControlFlags*)&flags, *readStreamPtrPtr, sizeof(VkQueryControlFlags));
+                memcpy((VkQueryControlFlags*)&flags, *readStreamPtrPtr,
+                       sizeof(VkQueryControlFlags));
                 *readStreamPtrPtr += sizeof(VkQueryControlFlags);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdBeginQuery 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)queryPool, (unsigned long long)query, (unsigned long long)flags);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr, "stream %p: call vkCmdBeginQuery 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)commandBuffer, (unsigned long long)queryPool,
+                        (unsigned long long)query, (unsigned long long)flags);
                 }
                 vk->vkCmdBeginQuery(unboxed_commandBuffer, queryPool, query, flags);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdBeginQuery(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, queryPool, query, flags);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdBeginQuery(snapshotTraceBegin, snapshotTraceBytes,
+                                                         &m_pool, commandBuffer, queryPool, query,
+                                                         flags);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdEndQuery:
-            {
+            case OP_vkCmdEndQuery: {
                 android::base::beginTrace("vkCmdEndQuery decode");
                 VkCommandBuffer commandBuffer;
                 VkQueryPool queryPool;
@@ -7216,35 +8201,39 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkQueryPool*)&queryPool = (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_1));
+                *(VkQueryPool*)&queryPool =
+                    (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_1));
                 memcpy((uint32_t*)&query, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdEndQuery 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)queryPool, (unsigned long long)query);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdEndQuery 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)queryPool, (unsigned long long)query);
                 }
                 vk->vkCmdEndQuery(unboxed_commandBuffer, queryPool, query);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdEndQuery(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, queryPool, query);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdEndQuery(snapshotTraceBegin, snapshotTraceBytes,
+                                                       &m_pool, commandBuffer, queryPool, query);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdResetQueryPool:
-            {
+            case OP_vkCmdResetQueryPool: {
                 android::base::beginTrace("vkCmdResetQueryPool decode");
                 VkCommandBuffer commandBuffer;
                 VkQueryPool queryPool;
@@ -7254,37 +8243,44 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkQueryPool*)&queryPool = (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_1));
+                *(VkQueryPool*)&queryPool =
+                    (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_1));
                 memcpy((uint32_t*)&firstQuery, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&queryCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdResetQueryPool 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)queryPool, (unsigned long long)firstQuery, (unsigned long long)queryCount);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdResetQueryPool 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)queryPool, (unsigned long long)firstQuery,
+                            (unsigned long long)queryCount);
                 }
                 vk->vkCmdResetQueryPool(unboxed_commandBuffer, queryPool, firstQuery, queryCount);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdResetQueryPool(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, queryPool, firstQuery, queryCount);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdResetQueryPool(snapshotTraceBegin, snapshotTraceBytes,
+                                                             &m_pool, commandBuffer, queryPool,
+                                                             firstQuery, queryCount);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdWriteTimestamp:
-            {
+            case OP_vkCmdWriteTimestamp: {
                 android::base::beginTrace("vkCmdWriteTimestamp decode");
                 VkCommandBuffer commandBuffer;
                 VkPipelineStageFlagBits pipelineStage;
@@ -7294,37 +8290,45 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
-                memcpy((VkPipelineStageFlagBits*)&pipelineStage, *readStreamPtrPtr, sizeof(VkPipelineStageFlagBits));
+                memcpy((VkPipelineStageFlagBits*)&pipelineStage, *readStreamPtrPtr,
+                       sizeof(VkPipelineStageFlagBits));
                 *readStreamPtrPtr += sizeof(VkPipelineStageFlagBits);
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkQueryPool*)&queryPool = (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_1));
+                *(VkQueryPool*)&queryPool =
+                    (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_1));
                 memcpy((uint32_t*)&query, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdWriteTimestamp 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pipelineStage, (unsigned long long)queryPool, (unsigned long long)query);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdWriteTimestamp 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pipelineStage, (unsigned long long)queryPool,
+                            (unsigned long long)query);
                 }
                 vk->vkCmdWriteTimestamp(unboxed_commandBuffer, pipelineStage, queryPool, query);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdWriteTimestamp(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pipelineStage, queryPool, query);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdWriteTimestamp(snapshotTraceBegin, snapshotTraceBytes,
+                                                             &m_pool, commandBuffer, pipelineStage,
+                                                             queryPool, query);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdCopyQueryPoolResults:
-            {
+            case OP_vkCmdCopyQueryPoolResults: {
                 android::base::beginTrace("vkCmdCopyQueryPoolResults decode");
                 VkCommandBuffer commandBuffer;
                 VkQueryPool queryPool;
@@ -7338,14 +8342,16 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkQueryPool*)&queryPool = (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_1));
+                *(VkQueryPool*)&queryPool =
+                    (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_1));
                 memcpy((uint32_t*)&firstQuery, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&queryCount, *readStreamPtrPtr, sizeof(uint32_t));
@@ -7360,25 +8366,34 @@
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
                 memcpy((VkQueryResultFlags*)&flags, *readStreamPtrPtr, sizeof(VkQueryResultFlags));
                 *readStreamPtrPtr += sizeof(VkQueryResultFlags);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdCopyQueryPoolResults 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)queryPool, (unsigned long long)firstQuery, (unsigned long long)queryCount, (unsigned long long)dstBuffer, (unsigned long long)dstOffset, (unsigned long long)stride, (unsigned long long)flags);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdCopyQueryPoolResults 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)queryPool, (unsigned long long)firstQuery,
+                            (unsigned long long)queryCount, (unsigned long long)dstBuffer,
+                            (unsigned long long)dstOffset, (unsigned long long)stride,
+                            (unsigned long long)flags);
                 }
-                vk->vkCmdCopyQueryPoolResults(unboxed_commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
+                vk->vkCmdCopyQueryPoolResults(unboxed_commandBuffer, queryPool, firstQuery,
+                                              queryCount, dstBuffer, dstOffset, stride, flags);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdCopyQueryPoolResults(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdCopyQueryPoolResults(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, queryPool,
+                        firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdPushConstants:
-            {
+            case OP_vkCmdPushConstants: {
                 android::base::beginTrace("vkCmdPushConstants decode");
                 VkCommandBuffer commandBuffer;
                 VkPipelineLayout layout;
@@ -7390,15 +8405,18 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPipelineLayout*)&layout = (VkPipelineLayout)unbox_VkPipelineLayout((VkPipelineLayout)(*&cgen_var_1));
-                memcpy((VkShaderStageFlags*)&stageFlags, *readStreamPtrPtr, sizeof(VkShaderStageFlags));
+                *(VkPipelineLayout*)&layout =
+                    (VkPipelineLayout)unbox_VkPipelineLayout((VkPipelineLayout)(*&cgen_var_1));
+                memcpy((VkShaderStageFlags*)&stageFlags, *readStreamPtrPtr,
+                       sizeof(VkShaderStageFlags));
                 *readStreamPtrPtr += sizeof(VkShaderStageFlags);
                 memcpy((uint32_t*)&offset, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
@@ -7407,25 +8425,32 @@
                 vkReadStream->alloc((void**)&pValues, ((size)) * sizeof(const uint8_t));
                 memcpy((void*)pValues, *readStreamPtrPtr, ((size)) * sizeof(const uint8_t));
                 *readStreamPtrPtr += ((size)) * sizeof(const uint8_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdPushConstants 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)layout, (unsigned long long)stageFlags, (unsigned long long)offset, (unsigned long long)size, (unsigned long long)pValues);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdPushConstants 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer, (unsigned long long)layout,
+                            (unsigned long long)stageFlags, (unsigned long long)offset,
+                            (unsigned long long)size, (unsigned long long)pValues);
                 }
-                vk->vkCmdPushConstants(unboxed_commandBuffer, layout, stageFlags, offset, size, pValues);
+                vk->vkCmdPushConstants(unboxed_commandBuffer, layout, stageFlags, offset, size,
+                                       pValues);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdPushConstants(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, layout, stageFlags, offset, size, pValues);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdPushConstants(snapshotTraceBegin, snapshotTraceBytes,
+                                                            &m_pool, commandBuffer, layout,
+                                                            stageFlags, offset, size, pValues);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdBeginRenderPass:
-            {
+            case OP_vkCmdBeginRenderPass: {
                 android::base::beginTrace("vkCmdBeginRenderPass decode");
                 VkCommandBuffer commandBuffer;
                 const VkRenderPassBeginInfo* pRenderPassBegin;
@@ -7434,37 +8459,43 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 vkReadStream->alloc((void**)&pRenderPassBegin, sizeof(const VkRenderPassBeginInfo));
-                reservedunmarshal_VkRenderPassBeginInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRenderPassBeginInfo*)(pRenderPassBegin), readStreamPtrPtr);
+                reservedunmarshal_VkRenderPassBeginInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                        (VkRenderPassBeginInfo*)(pRenderPassBegin),
+                                                        readStreamPtrPtr);
                 memcpy((VkSubpassContents*)&contents, *readStreamPtrPtr, sizeof(VkSubpassContents));
                 *readStreamPtrPtr += sizeof(VkSubpassContents);
-                if (pRenderPassBegin)
-                {
-                    transform_tohost_VkRenderPassBeginInfo(m_state, (VkRenderPassBeginInfo*)(pRenderPassBegin));
+                if (pRenderPassBegin) {
+                    transform_tohost_VkRenderPassBeginInfo(
+                        m_state, (VkRenderPassBeginInfo*)(pRenderPassBegin));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdBeginRenderPass 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pRenderPassBegin, (unsigned long long)contents);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdBeginRenderPass 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pRenderPassBegin, (unsigned long long)contents);
                 }
                 vk->vkCmdBeginRenderPass(unboxed_commandBuffer, pRenderPassBegin, contents);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdBeginRenderPass(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pRenderPassBegin, contents);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdBeginRenderPass(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        pRenderPassBegin, contents);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdNextSubpass:
-            {
+            case OP_vkCmdNextSubpass: {
                 android::base::beginTrace("vkCmdNextSubpass decode");
                 VkCommandBuffer commandBuffer;
                 VkSubpassContents contents;
@@ -7472,60 +8503,64 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 memcpy((VkSubpassContents*)&contents, *readStreamPtrPtr, sizeof(VkSubpassContents));
                 *readStreamPtrPtr += sizeof(VkSubpassContents);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdNextSubpass 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)contents);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdNextSubpass 0x%llx 0x%llx \n", ioStream,
+                            (unsigned long long)commandBuffer, (unsigned long long)contents);
                 }
                 vk->vkCmdNextSubpass(unboxed_commandBuffer, contents);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdNextSubpass(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, contents);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdNextSubpass(snapshotTraceBegin, snapshotTraceBytes,
+                                                          &m_pool, commandBuffer, contents);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdEndRenderPass:
-            {
+            case OP_vkCmdEndRenderPass: {
                 android::base::beginTrace("vkCmdEndRenderPass decode");
                 VkCommandBuffer commandBuffer;
                 // Begin non wrapped dispatchable handle unboxing for commandBuffer;
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdEndRenderPass 0x%llx \n", ioStream, (unsigned long long)commandBuffer);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdEndRenderPass 0x%llx \n", ioStream,
+                            (unsigned long long)commandBuffer);
                 }
                 vk->vkCmdEndRenderPass(unboxed_commandBuffer);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdEndRenderPass(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdEndRenderPass(snapshotTraceBegin, snapshotTraceBytes,
+                                                            &m_pool, commandBuffer);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdExecuteCommands:
-            {
+            case OP_vkCmdExecuteCommands: {
                 android::base::beginTrace("vkCmdExecuteCommands decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t commandBufferCount;
@@ -7534,41 +8569,48 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 memcpy((uint32_t*)&commandBufferCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pCommandBuffers, ((commandBufferCount)) * sizeof(const VkCommandBuffer));
-                if (((commandBufferCount)))
-                {
+                vkReadStream->alloc((void**)&pCommandBuffers,
+                                    ((commandBufferCount)) * sizeof(const VkCommandBuffer));
+                if (((commandBufferCount))) {
                     uint8_t* cgen_var_1_ptr = (uint8_t*)(*readStreamPtrPtr);
                     *readStreamPtrPtr += 8 * ((commandBufferCount));
-                    for (uint32_t k = 0; k < ((commandBufferCount)); ++k)
-                    {
-                        uint64_t tmpval; memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
-                        *(((VkCommandBuffer*)pCommandBuffers) + k) = (VkCommandBuffer)unbox_VkCommandBuffer((VkCommandBuffer)tmpval);
+                    for (uint32_t k = 0; k < ((commandBufferCount)); ++k) {
+                        uint64_t tmpval;
+                        memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
+                        *(((VkCommandBuffer*)pCommandBuffers) + k) =
+                            (VkCommandBuffer)unbox_VkCommandBuffer((VkCommandBuffer)tmpval);
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdExecuteCommands 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)commandBufferCount, (unsigned long long)pCommandBuffers);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdExecuteCommands 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)commandBufferCount,
+                            (unsigned long long)pCommandBuffers);
                 }
-                m_state->on_vkCmdExecuteCommands(&m_pool, commandBuffer, commandBufferCount, pCommandBuffers);
+                m_state->on_vkCmdExecuteCommands(&m_pool, commandBuffer, commandBufferCount,
+                                                 pCommandBuffers);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdExecuteCommands(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, commandBufferCount, pCommandBuffers);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdExecuteCommands(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        commandBufferCount, pCommandBuffers);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_VERSION_1_1
-            case OP_vkEnumerateInstanceVersion:
-            {
+            case OP_vkEnumerateInstanceVersion: {
                 android::base::beginTrace("vkEnumerateInstanceVersion decode");
                 uint32_t* pApiVersion;
                 // Begin manual dispatchable handle unboxing for pApiVersion;
@@ -7576,30 +8618,34 @@
                 vkReadStream->alloc((void**)&pApiVersion, sizeof(uint32_t));
                 memcpy((uint32_t*)pApiVersion, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkEnumerateInstanceVersion 0x%llx \n", ioStream, (unsigned long long)pApiVersion);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkEnumerateInstanceVersion 0x%llx \n",
+                            ioStream, (unsigned long long)pApiVersion);
                 }
                 VkResult vkEnumerateInstanceVersion_VkResult_return = (VkResult)0;
-                vkEnumerateInstanceVersion_VkResult_return = m_state->on_vkEnumerateInstanceVersion(&m_pool, pApiVersion);
-                if ((vkEnumerateInstanceVersion_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkEnumerateInstanceVersion_VkResult_return =
+                    m_state->on_vkEnumerateInstanceVersion(&m_pool, pApiVersion);
+                if ((vkEnumerateInstanceVersion_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write((uint32_t*)pApiVersion, sizeof(uint32_t));
                 vkStream->write(&vkEnumerateInstanceVersion_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkEnumerateInstanceVersion(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkEnumerateInstanceVersion_VkResult_return, pApiVersion);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkEnumerateInstanceVersion(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkEnumerateInstanceVersion_VkResult_return, pApiVersion);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkBindBufferMemory2:
-            {
+            case OP_vkBindBufferMemory2: {
                 android::base::beginTrace("vkBindBufferMemory2 decode");
                 VkDevice device;
                 uint32_t bindInfoCount;
@@ -7611,41 +8657,47 @@
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
                 memcpy((uint32_t*)&bindInfoCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pBindInfos, ((bindInfoCount)) * sizeof(const VkBindBufferMemoryInfo));
-                for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
-                {
-                    reservedunmarshal_VkBindBufferMemoryInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBindBufferMemoryInfo*)(pBindInfos + i), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pBindInfos,
+                                    ((bindInfoCount)) * sizeof(const VkBindBufferMemoryInfo));
+                for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
+                    reservedunmarshal_VkBindBufferMemoryInfo(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkBindBufferMemoryInfo*)(pBindInfos + i), readStreamPtrPtr);
                 }
-                if (pBindInfos)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
-                    {
-                        transform_tohost_VkBindBufferMemoryInfo(m_state, (VkBindBufferMemoryInfo*)(pBindInfos + i));
+                if (pBindInfos) {
+                    for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
+                        transform_tohost_VkBindBufferMemoryInfo(
+                            m_state, (VkBindBufferMemoryInfo*)(pBindInfos + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkBindBufferMemory2 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)bindInfoCount, (unsigned long long)pBindInfos);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkBindBufferMemory2 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)bindInfoCount,
+                            (unsigned long long)pBindInfos);
                 }
                 VkResult vkBindBufferMemory2_VkResult_return = (VkResult)0;
-                vkBindBufferMemory2_VkResult_return = m_state->on_vkBindBufferMemory2(&m_pool, device, bindInfoCount, pBindInfos);
-                if ((vkBindBufferMemory2_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkBindBufferMemory2_VkResult_return =
+                    m_state->on_vkBindBufferMemory2(&m_pool, device, bindInfoCount, pBindInfos);
+                if ((vkBindBufferMemory2_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkBindBufferMemory2_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkBindBufferMemory2(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkBindBufferMemory2_VkResult_return, device, bindInfoCount, pBindInfos);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkBindBufferMemory2(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkBindBufferMemory2_VkResult_return, device, bindInfoCount, pBindInfos);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkBindImageMemory2:
-            {
+            case OP_vkBindImageMemory2: {
                 android::base::beginTrace("vkBindImageMemory2 decode");
                 VkDevice device;
                 uint32_t bindInfoCount;
@@ -7660,41 +8712,47 @@
                 // End manual dispatchable handle unboxing for device;
                 memcpy((uint32_t*)&bindInfoCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pBindInfos, ((bindInfoCount)) * sizeof(const VkBindImageMemoryInfo));
-                for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
-                {
-                    reservedunmarshal_VkBindImageMemoryInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBindImageMemoryInfo*)(pBindInfos + i), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pBindInfos,
+                                    ((bindInfoCount)) * sizeof(const VkBindImageMemoryInfo));
+                for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
+                    reservedunmarshal_VkBindImageMemoryInfo(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkBindImageMemoryInfo*)(pBindInfos + i), readStreamPtrPtr);
                 }
-                if (pBindInfos)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
-                    {
-                        transform_tohost_VkBindImageMemoryInfo(m_state, (VkBindImageMemoryInfo*)(pBindInfos + i));
+                if (pBindInfos) {
+                    for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
+                        transform_tohost_VkBindImageMemoryInfo(
+                            m_state, (VkBindImageMemoryInfo*)(pBindInfos + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkBindImageMemory2 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)bindInfoCount, (unsigned long long)pBindInfos);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkBindImageMemory2 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)bindInfoCount,
+                            (unsigned long long)pBindInfos);
                 }
                 VkResult vkBindImageMemory2_VkResult_return = (VkResult)0;
-                vkBindImageMemory2_VkResult_return = vk->vkBindImageMemory2(unboxed_device, bindInfoCount, pBindInfos);
-                if ((vkBindImageMemory2_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkBindImageMemory2_VkResult_return =
+                    vk->vkBindImageMemory2(unboxed_device, bindInfoCount, pBindInfos);
+                if ((vkBindImageMemory2_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkBindImageMemory2_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkBindImageMemory2(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkBindImageMemory2_VkResult_return, device, bindInfoCount, pBindInfos);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkBindImageMemory2(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkBindImageMemory2_VkResult_return, device, bindInfoCount, pBindInfos);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetDeviceGroupPeerMemoryFeatures:
-            {
+            case OP_vkGetDeviceGroupPeerMemoryFeatures: {
                 android::base::beginTrace("vkGetDeviceGroupPeerMemoryFeatures decode");
                 VkDevice device;
                 uint32_t heapIndex;
@@ -7718,29 +8776,39 @@
                 // Begin manual dispatchable handle unboxing for pPeerMemoryFeatures;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pPeerMemoryFeatures, sizeof(VkPeerMemoryFeatureFlags));
-                memcpy((VkPeerMemoryFeatureFlags*)pPeerMemoryFeatures, *readStreamPtrPtr, sizeof(VkPeerMemoryFeatureFlags));
+                memcpy((VkPeerMemoryFeatureFlags*)pPeerMemoryFeatures, *readStreamPtrPtr,
+                       sizeof(VkPeerMemoryFeatureFlags));
                 *readStreamPtrPtr += sizeof(VkPeerMemoryFeatureFlags);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetDeviceGroupPeerMemoryFeatures 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)heapIndex, (unsigned long long)localDeviceIndex, (unsigned long long)remoteDeviceIndex, (unsigned long long)pPeerMemoryFeatures);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetDeviceGroupPeerMemoryFeatures 0x%llx 0x%llx "
+                            "0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)heapIndex,
+                            (unsigned long long)localDeviceIndex,
+                            (unsigned long long)remoteDeviceIndex,
+                            (unsigned long long)pPeerMemoryFeatures);
                 }
-                vk->vkGetDeviceGroupPeerMemoryFeatures(unboxed_device, heapIndex, localDeviceIndex, remoteDeviceIndex, pPeerMemoryFeatures);
+                vk->vkGetDeviceGroupPeerMemoryFeatures(unboxed_device, heapIndex, localDeviceIndex,
+                                                       remoteDeviceIndex, pPeerMemoryFeatures);
                 vkStream->unsetHandleMapping();
-                vkStream->write((VkPeerMemoryFeatureFlags*)pPeerMemoryFeatures, sizeof(VkPeerMemoryFeatureFlags));
+                vkStream->write((VkPeerMemoryFeatureFlags*)pPeerMemoryFeatures,
+                                sizeof(VkPeerMemoryFeatureFlags));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetDeviceGroupPeerMemoryFeatures(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, heapIndex, localDeviceIndex, remoteDeviceIndex, pPeerMemoryFeatures);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetDeviceGroupPeerMemoryFeatures(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, heapIndex,
+                        localDeviceIndex, remoteDeviceIndex, pPeerMemoryFeatures);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetDeviceMask:
-            {
+            case OP_vkCmdSetDeviceMask: {
                 android::base::beginTrace("vkCmdSetDeviceMask decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t deviceMask;
@@ -7748,31 +8816,33 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 memcpy((uint32_t*)&deviceMask, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetDeviceMask 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)deviceMask);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdSetDeviceMask 0x%llx 0x%llx \n", ioStream,
+                            (unsigned long long)commandBuffer, (unsigned long long)deviceMask);
                 }
                 vk->vkCmdSetDeviceMask(unboxed_commandBuffer, deviceMask);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetDeviceMask(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, deviceMask);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetDeviceMask(snapshotTraceBegin, snapshotTraceBytes,
+                                                            &m_pool, commandBuffer, deviceMask);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdDispatchBase:
-            {
+            case OP_vkCmdDispatchBase: {
                 android::base::beginTrace("vkCmdDispatchBase decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t baseGroupX;
@@ -7785,7 +8855,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -7801,25 +8872,33 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&groupCountZ, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdDispatchBase 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)baseGroupX, (unsigned long long)baseGroupY, (unsigned long long)baseGroupZ, (unsigned long long)groupCountX, (unsigned long long)groupCountY, (unsigned long long)groupCountZ);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdDispatchBase 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)baseGroupX, (unsigned long long)baseGroupY,
+                            (unsigned long long)baseGroupZ, (unsigned long long)groupCountX,
+                            (unsigned long long)groupCountY, (unsigned long long)groupCountZ);
                 }
-                vk->vkCmdDispatchBase(unboxed_commandBuffer, baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ);
+                vk->vkCmdDispatchBase(unboxed_commandBuffer, baseGroupX, baseGroupY, baseGroupZ,
+                                      groupCountX, groupCountY, groupCountZ);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdDispatchBase(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdDispatchBase(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, baseGroupX,
+                        baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkEnumeratePhysicalDeviceGroups:
-            {
+            case OP_vkEnumeratePhysicalDeviceGroups: {
                 android::base::beginTrace("vkEnumeratePhysicalDeviceGroups decode");
                 VkInstance instance;
                 uint32_t* pPhysicalDeviceGroupCount;
@@ -7838,89 +8917,102 @@
                 memcpy((uint32_t**)&pPhysicalDeviceGroupCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pPhysicalDeviceGroupCount);
                 *readStreamPtrPtr += 8;
-                if (pPhysicalDeviceGroupCount)
-                {
+                if (pPhysicalDeviceGroupCount) {
                     vkReadStream->alloc((void**)&pPhysicalDeviceGroupCount, sizeof(uint32_t));
-                    memcpy((uint32_t*)pPhysicalDeviceGroupCount, *readStreamPtrPtr, sizeof(uint32_t));
+                    memcpy((uint32_t*)pPhysicalDeviceGroupCount, *readStreamPtrPtr,
+                           sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
                 }
                 // Begin manual dispatchable handle unboxing for pPhysicalDeviceGroupProperties;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
-                memcpy((VkPhysicalDeviceGroupProperties**)&pPhysicalDeviceGroupProperties, (*readStreamPtrPtr), 8);
+                memcpy((VkPhysicalDeviceGroupProperties**)&pPhysicalDeviceGroupProperties,
+                       (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pPhysicalDeviceGroupProperties);
                 *readStreamPtrPtr += 8;
-                if (pPhysicalDeviceGroupProperties)
-                {
-                    vkReadStream->alloc((void**)&pPhysicalDeviceGroupProperties, (*(pPhysicalDeviceGroupCount)) * sizeof(VkPhysicalDeviceGroupProperties));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pPhysicalDeviceGroupCount)); ++i)
-                    {
-                        reservedunmarshal_VkPhysicalDeviceGroupProperties(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties + i), readStreamPtrPtr);
+                if (pPhysicalDeviceGroupProperties) {
+                    vkReadStream->alloc(
+                        (void**)&pPhysicalDeviceGroupProperties,
+                        (*(pPhysicalDeviceGroupCount)) * sizeof(VkPhysicalDeviceGroupProperties));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pPhysicalDeviceGroupCount)); ++i) {
+                        reservedunmarshal_VkPhysicalDeviceGroupProperties(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties + i),
+                            readStreamPtrPtr);
                     }
                 }
-                if (pPhysicalDeviceGroupCount)
-                {
-                    if (pPhysicalDeviceGroupProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPhysicalDeviceGroupCount)); ++i)
-                        {
-                            transform_tohost_VkPhysicalDeviceGroupProperties(m_state, (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties + i));
+                if (pPhysicalDeviceGroupCount) {
+                    if (pPhysicalDeviceGroupProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPhysicalDeviceGroupCount)); ++i) {
+                            transform_tohost_VkPhysicalDeviceGroupProperties(
+                                m_state,
+                                (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties +
+                                                                   i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkEnumeratePhysicalDeviceGroups 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)instance, (unsigned long long)pPhysicalDeviceGroupCount, (unsigned long long)pPhysicalDeviceGroupProperties);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkEnumeratePhysicalDeviceGroups 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)instance,
+                        (unsigned long long)pPhysicalDeviceGroupCount,
+                        (unsigned long long)pPhysicalDeviceGroupProperties);
                 }
                 VkResult vkEnumeratePhysicalDeviceGroups_VkResult_return = (VkResult)0;
-                vkEnumeratePhysicalDeviceGroups_VkResult_return = vk->vkEnumeratePhysicalDeviceGroups(unboxed_instance, pPhysicalDeviceGroupCount, pPhysicalDeviceGroupProperties);
-                if ((vkEnumeratePhysicalDeviceGroups_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkEnumeratePhysicalDeviceGroups_VkResult_return =
+                    vk->vkEnumeratePhysicalDeviceGroups(unboxed_instance, pPhysicalDeviceGroupCount,
+                                                        pPhysicalDeviceGroupProperties);
+                if ((vkEnumeratePhysicalDeviceGroups_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pPhysicalDeviceGroupCount;
                 vkStream->putBe64(cgen_var_3);
-                if (pPhysicalDeviceGroupCount)
-                {
+                if (pPhysicalDeviceGroupCount) {
                     vkStream->write((uint32_t*)pPhysicalDeviceGroupCount, sizeof(uint32_t));
                 }
-                if (pPhysicalDeviceGroupCount)
-                {
-                    if (pPhysicalDeviceGroupProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPhysicalDeviceGroupCount)); ++i)
-                        {
-                            transform_fromhost_VkPhysicalDeviceGroupProperties(m_state, (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties + i));
+                if (pPhysicalDeviceGroupCount) {
+                    if (pPhysicalDeviceGroupProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPhysicalDeviceGroupCount)); ++i) {
+                            transform_fromhost_VkPhysicalDeviceGroupProperties(
+                                m_state,
+                                (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties +
+                                                                   i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pPhysicalDeviceGroupProperties;
                 vkStream->putBe64(cgen_var_4);
-                if (pPhysicalDeviceGroupProperties)
-                {
-                    if (pPhysicalDeviceGroupCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPhysicalDeviceGroupCount)); ++i)
-                        {
-                            marshal_VkPhysicalDeviceGroupProperties(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties + i));
+                if (pPhysicalDeviceGroupProperties) {
+                    if (pPhysicalDeviceGroupCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPhysicalDeviceGroupCount)); ++i) {
+                            marshal_VkPhysicalDeviceGroupProperties(
+                                vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties +
+                                                                   i));
                         }
                     }
                 }
                 vkStream->write(&vkEnumeratePhysicalDeviceGroups_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkEnumeratePhysicalDeviceGroups(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkEnumeratePhysicalDeviceGroups_VkResult_return, instance, pPhysicalDeviceGroupCount, pPhysicalDeviceGroupProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkEnumeratePhysicalDeviceGroups(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkEnumeratePhysicalDeviceGroups_VkResult_return, instance,
+                        pPhysicalDeviceGroupCount, pPhysicalDeviceGroupProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetImageMemoryRequirements2:
-            {
+            case OP_vkGetImageMemoryRequirements2: {
                 android::base::beginTrace("vkGetImageMemoryRequirements2 decode");
                 VkDevice device;
                 const VkImageMemoryRequirementsInfo2* pInfo;
@@ -7931,44 +9023,54 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
                 vkReadStream->alloc((void**)&pInfo, sizeof(const VkImageMemoryRequirementsInfo2));
-                reservedunmarshal_VkImageMemoryRequirementsInfo2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageMemoryRequirementsInfo2*)(pInfo), readStreamPtrPtr);
+                reservedunmarshal_VkImageMemoryRequirementsInfo2(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkImageMemoryRequirementsInfo2*)(pInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pMemoryRequirements;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pMemoryRequirements, sizeof(VkMemoryRequirements2));
-                reservedunmarshal_VkMemoryRequirements2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements2*)(pMemoryRequirements), readStreamPtrPtr);
-                if (pInfo)
-                {
-                    transform_tohost_VkImageMemoryRequirementsInfo2(m_state, (VkImageMemoryRequirementsInfo2*)(pInfo));
+                reservedunmarshal_VkMemoryRequirements2(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkMemoryRequirements2*)(pMemoryRequirements), readStreamPtrPtr);
+                if (pInfo) {
+                    transform_tohost_VkImageMemoryRequirementsInfo2(
+                        m_state, (VkImageMemoryRequirementsInfo2*)(pInfo));
                 }
-                if (pMemoryRequirements)
-                {
-                    transform_tohost_VkMemoryRequirements2(m_state, (VkMemoryRequirements2*)(pMemoryRequirements));
+                if (pMemoryRequirements) {
+                    transform_tohost_VkMemoryRequirements2(
+                        m_state, (VkMemoryRequirements2*)(pMemoryRequirements));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetImageMemoryRequirements2 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pInfo, (unsigned long long)pMemoryRequirements);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetImageMemoryRequirements2 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pInfo,
+                            (unsigned long long)pMemoryRequirements);
                 }
-                m_state->on_vkGetImageMemoryRequirements2(&m_pool, device, pInfo, pMemoryRequirements);
+                m_state->on_vkGetImageMemoryRequirements2(&m_pool, device, pInfo,
+                                                          pMemoryRequirements);
                 vkStream->unsetHandleMapping();
-                if (pMemoryRequirements)
-                {
-                    transform_fromhost_VkMemoryRequirements2(m_state, (VkMemoryRequirements2*)(pMemoryRequirements));
+                if (pMemoryRequirements) {
+                    transform_fromhost_VkMemoryRequirements2(
+                        m_state, (VkMemoryRequirements2*)(pMemoryRequirements));
                 }
-                marshal_VkMemoryRequirements2(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements2*)(pMemoryRequirements));
+                marshal_VkMemoryRequirements2(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                              (VkMemoryRequirements2*)(pMemoryRequirements));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetImageMemoryRequirements2(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, pInfo, pMemoryRequirements);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetImageMemoryRequirements2(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, pInfo,
+                        pMemoryRequirements);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetBufferMemoryRequirements2:
-            {
+            case OP_vkGetBufferMemoryRequirements2: {
                 android::base::beginTrace("vkGetBufferMemoryRequirements2 decode");
                 VkDevice device;
                 const VkBufferMemoryRequirementsInfo2* pInfo;
@@ -7982,44 +9084,54 @@
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
                 vkReadStream->alloc((void**)&pInfo, sizeof(const VkBufferMemoryRequirementsInfo2));
-                reservedunmarshal_VkBufferMemoryRequirementsInfo2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferMemoryRequirementsInfo2*)(pInfo), readStreamPtrPtr);
+                reservedunmarshal_VkBufferMemoryRequirementsInfo2(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkBufferMemoryRequirementsInfo2*)(pInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pMemoryRequirements;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pMemoryRequirements, sizeof(VkMemoryRequirements2));
-                reservedunmarshal_VkMemoryRequirements2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements2*)(pMemoryRequirements), readStreamPtrPtr);
-                if (pInfo)
-                {
-                    transform_tohost_VkBufferMemoryRequirementsInfo2(m_state, (VkBufferMemoryRequirementsInfo2*)(pInfo));
+                reservedunmarshal_VkMemoryRequirements2(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkMemoryRequirements2*)(pMemoryRequirements), readStreamPtrPtr);
+                if (pInfo) {
+                    transform_tohost_VkBufferMemoryRequirementsInfo2(
+                        m_state, (VkBufferMemoryRequirementsInfo2*)(pInfo));
                 }
-                if (pMemoryRequirements)
-                {
-                    transform_tohost_VkMemoryRequirements2(m_state, (VkMemoryRequirements2*)(pMemoryRequirements));
+                if (pMemoryRequirements) {
+                    transform_tohost_VkMemoryRequirements2(
+                        m_state, (VkMemoryRequirements2*)(pMemoryRequirements));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetBufferMemoryRequirements2 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pInfo, (unsigned long long)pMemoryRequirements);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkGetBufferMemoryRequirements2 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device, (unsigned long long)pInfo,
+                        (unsigned long long)pMemoryRequirements);
                 }
                 vk->vkGetBufferMemoryRequirements2(unboxed_device, pInfo, pMemoryRequirements);
                 vkStream->unsetHandleMapping();
-                if (pMemoryRequirements)
-                {
-                    transform_fromhost_VkMemoryRequirements2(m_state, (VkMemoryRequirements2*)(pMemoryRequirements));
+                if (pMemoryRequirements) {
+                    transform_fromhost_VkMemoryRequirements2(
+                        m_state, (VkMemoryRequirements2*)(pMemoryRequirements));
                 }
-                marshal_VkMemoryRequirements2(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements2*)(pMemoryRequirements));
+                marshal_VkMemoryRequirements2(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                              (VkMemoryRequirements2*)(pMemoryRequirements));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetBufferMemoryRequirements2(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, pInfo, pMemoryRequirements);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetBufferMemoryRequirements2(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, pInfo,
+                        pMemoryRequirements);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetImageSparseMemoryRequirements2:
-            {
+            case OP_vkGetImageSparseMemoryRequirements2: {
                 android::base::beginTrace("vkGetImageSparseMemoryRequirements2 decode");
                 VkDevice device;
                 const VkImageSparseMemoryRequirementsInfo2* pInfo;
@@ -8033,98 +9145,112 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pInfo, sizeof(const VkImageSparseMemoryRequirementsInfo2));
-                reservedunmarshal_VkImageSparseMemoryRequirementsInfo2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageSparseMemoryRequirementsInfo2*)(pInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pInfo,
+                                    sizeof(const VkImageSparseMemoryRequirementsInfo2));
+                reservedunmarshal_VkImageSparseMemoryRequirementsInfo2(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkImageSparseMemoryRequirementsInfo2*)(pInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pSparseMemoryRequirementCount;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 memcpy((uint32_t**)&pSparseMemoryRequirementCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pSparseMemoryRequirementCount);
                 *readStreamPtrPtr += 8;
-                if (pSparseMemoryRequirementCount)
-                {
+                if (pSparseMemoryRequirementCount) {
                     vkReadStream->alloc((void**)&pSparseMemoryRequirementCount, sizeof(uint32_t));
-                    memcpy((uint32_t*)pSparseMemoryRequirementCount, *readStreamPtrPtr, sizeof(uint32_t));
+                    memcpy((uint32_t*)pSparseMemoryRequirementCount, *readStreamPtrPtr,
+                           sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
                 }
                 // Begin manual dispatchable handle unboxing for pSparseMemoryRequirements;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
-                memcpy((VkSparseImageMemoryRequirements2**)&pSparseMemoryRequirements, (*readStreamPtrPtr), 8);
+                memcpy((VkSparseImageMemoryRequirements2**)&pSparseMemoryRequirements,
+                       (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pSparseMemoryRequirements);
                 *readStreamPtrPtr += 8;
-                if (pSparseMemoryRequirements)
-                {
-                    vkReadStream->alloc((void**)&pSparseMemoryRequirements, (*(pSparseMemoryRequirementCount)) * sizeof(VkSparseImageMemoryRequirements2));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i)
-                    {
-                        reservedunmarshal_VkSparseImageMemoryRequirements2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i), readStreamPtrPtr);
+                if (pSparseMemoryRequirements) {
+                    vkReadStream->alloc((void**)&pSparseMemoryRequirements,
+                                        (*(pSparseMemoryRequirementCount)) *
+                                            sizeof(VkSparseImageMemoryRequirements2));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i) {
+                        reservedunmarshal_VkSparseImageMemoryRequirements2(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i),
+                            readStreamPtrPtr);
                     }
                 }
-                if (pInfo)
-                {
-                    transform_tohost_VkImageSparseMemoryRequirementsInfo2(m_state, (VkImageSparseMemoryRequirementsInfo2*)(pInfo));
+                if (pInfo) {
+                    transform_tohost_VkImageSparseMemoryRequirementsInfo2(
+                        m_state, (VkImageSparseMemoryRequirementsInfo2*)(pInfo));
                 }
-                if (pSparseMemoryRequirementCount)
-                {
-                    if (pSparseMemoryRequirements)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i)
-                        {
-                            transform_tohost_VkSparseImageMemoryRequirements2(m_state, (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i));
+                if (pSparseMemoryRequirementCount) {
+                    if (pSparseMemoryRequirements) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount));
+                             ++i) {
+                            transform_tohost_VkSparseImageMemoryRequirements2(
+                                m_state,
+                                (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetImageSparseMemoryRequirements2 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pInfo, (unsigned long long)pSparseMemoryRequirementCount, (unsigned long long)pSparseMemoryRequirements);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetImageSparseMemoryRequirements2 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pInfo,
+                            (unsigned long long)pSparseMemoryRequirementCount,
+                            (unsigned long long)pSparseMemoryRequirements);
                 }
-                vk->vkGetImageSparseMemoryRequirements2(unboxed_device, pInfo, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
+                vk->vkGetImageSparseMemoryRequirements2(unboxed_device, pInfo,
+                                                        pSparseMemoryRequirementCount,
+                                                        pSparseMemoryRequirements);
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pSparseMemoryRequirementCount;
                 vkStream->putBe64(cgen_var_3);
-                if (pSparseMemoryRequirementCount)
-                {
+                if (pSparseMemoryRequirementCount) {
                     vkStream->write((uint32_t*)pSparseMemoryRequirementCount, sizeof(uint32_t));
                 }
-                if (pSparseMemoryRequirementCount)
-                {
-                    if (pSparseMemoryRequirements)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i)
-                        {
-                            transform_fromhost_VkSparseImageMemoryRequirements2(m_state, (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i));
+                if (pSparseMemoryRequirementCount) {
+                    if (pSparseMemoryRequirements) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount));
+                             ++i) {
+                            transform_fromhost_VkSparseImageMemoryRequirements2(
+                                m_state,
+                                (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pSparseMemoryRequirements;
                 vkStream->putBe64(cgen_var_4);
-                if (pSparseMemoryRequirements)
-                {
-                    if (pSparseMemoryRequirementCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i)
-                        {
-                            marshal_VkSparseImageMemoryRequirements2(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i));
+                if (pSparseMemoryRequirements) {
+                    if (pSparseMemoryRequirementCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount));
+                             ++i) {
+                            marshal_VkSparseImageMemoryRequirements2(
+                                vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i));
                         }
                     }
                 }
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetImageSparseMemoryRequirements2(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, pInfo, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetImageSparseMemoryRequirements2(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, pInfo,
+                        pSparseMemoryRequirementCount, pSparseMemoryRequirements);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceFeatures2:
-            {
+            case OP_vkGetPhysicalDeviceFeatures2: {
                 android::base::beginTrace("vkGetPhysicalDeviceFeatures2 decode");
                 VkPhysicalDevice physicalDevice;
                 VkPhysicalDeviceFeatures2* pFeatures;
@@ -8132,40 +9258,46 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 // Begin manual dispatchable handle unboxing for pFeatures;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pFeatures, sizeof(VkPhysicalDeviceFeatures2));
-                reservedunmarshal_VkPhysicalDeviceFeatures2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceFeatures2*)(pFeatures), readStreamPtrPtr);
-                if (pFeatures)
-                {
-                    transform_tohost_VkPhysicalDeviceFeatures2(m_state, (VkPhysicalDeviceFeatures2*)(pFeatures));
+                reservedunmarshal_VkPhysicalDeviceFeatures2(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPhysicalDeviceFeatures2*)(pFeatures), readStreamPtrPtr);
+                if (pFeatures) {
+                    transform_tohost_VkPhysicalDeviceFeatures2(
+                        m_state, (VkPhysicalDeviceFeatures2*)(pFeatures));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceFeatures2 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pFeatures);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceFeatures2 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)pFeatures);
                 }
                 m_state->on_vkGetPhysicalDeviceFeatures2(&m_pool, physicalDevice, pFeatures);
                 vkStream->unsetHandleMapping();
-                if (pFeatures)
-                {
-                    transform_fromhost_VkPhysicalDeviceFeatures2(m_state, (VkPhysicalDeviceFeatures2*)(pFeatures));
+                if (pFeatures) {
+                    transform_fromhost_VkPhysicalDeviceFeatures2(
+                        m_state, (VkPhysicalDeviceFeatures2*)(pFeatures));
                 }
-                marshal_VkPhysicalDeviceFeatures2(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceFeatures2*)(pFeatures));
+                marshal_VkPhysicalDeviceFeatures2(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                  (VkPhysicalDeviceFeatures2*)(pFeatures));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceFeatures2(snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice, pFeatures);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceFeatures2(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice, pFeatures);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceProperties2:
-            {
+            case OP_vkGetPhysicalDeviceProperties2: {
                 android::base::beginTrace("vkGetPhysicalDeviceProperties2 decode");
                 VkPhysicalDevice physicalDevice;
                 VkPhysicalDeviceProperties2* pProperties;
@@ -8173,40 +9305,48 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 // Begin manual dispatchable handle unboxing for pProperties;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pProperties, sizeof(VkPhysicalDeviceProperties2));
-                reservedunmarshal_VkPhysicalDeviceProperties2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceProperties2*)(pProperties), readStreamPtrPtr);
-                if (pProperties)
-                {
-                    transform_tohost_VkPhysicalDeviceProperties2(m_state, (VkPhysicalDeviceProperties2*)(pProperties));
+                reservedunmarshal_VkPhysicalDeviceProperties2(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPhysicalDeviceProperties2*)(pProperties), readStreamPtrPtr);
+                if (pProperties) {
+                    transform_tohost_VkPhysicalDeviceProperties2(
+                        m_state, (VkPhysicalDeviceProperties2*)(pProperties));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceProperties2 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceProperties2 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)pProperties);
                 }
                 m_state->on_vkGetPhysicalDeviceProperties2(&m_pool, physicalDevice, pProperties);
                 vkStream->unsetHandleMapping();
-                if (pProperties)
-                {
-                    transform_fromhost_VkPhysicalDeviceProperties2(m_state, (VkPhysicalDeviceProperties2*)(pProperties));
+                if (pProperties) {
+                    transform_fromhost_VkPhysicalDeviceProperties2(
+                        m_state, (VkPhysicalDeviceProperties2*)(pProperties));
                 }
-                marshal_VkPhysicalDeviceProperties2(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceProperties2*)(pProperties));
+                marshal_VkPhysicalDeviceProperties2(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                    (VkPhysicalDeviceProperties2*)(pProperties));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceProperties2(snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice, pProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceProperties2(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice,
+                        pProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceFormatProperties2:
-            {
+            case OP_vkGetPhysicalDeviceFormatProperties2: {
                 android::base::beginTrace("vkGetPhysicalDeviceFormatProperties2 decode");
                 VkPhysicalDevice physicalDevice;
                 VkFormat format;
@@ -8215,42 +9355,52 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 memcpy((VkFormat*)&format, *readStreamPtrPtr, sizeof(VkFormat));
                 *readStreamPtrPtr += sizeof(VkFormat);
                 // Begin manual dispatchable handle unboxing for pFormatProperties;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pFormatProperties, sizeof(VkFormatProperties2));
-                reservedunmarshal_VkFormatProperties2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkFormatProperties2*)(pFormatProperties), readStreamPtrPtr);
-                if (pFormatProperties)
-                {
-                    transform_tohost_VkFormatProperties2(m_state, (VkFormatProperties2*)(pFormatProperties));
+                reservedunmarshal_VkFormatProperties2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                      (VkFormatProperties2*)(pFormatProperties),
+                                                      readStreamPtrPtr);
+                if (pFormatProperties) {
+                    transform_tohost_VkFormatProperties2(m_state,
+                                                         (VkFormatProperties2*)(pFormatProperties));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceFormatProperties2 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)format, (unsigned long long)pFormatProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceFormatProperties2 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)format, (unsigned long long)pFormatProperties);
                 }
-                m_state->on_vkGetPhysicalDeviceFormatProperties2(&m_pool, physicalDevice, format, pFormatProperties);
+                m_state->on_vkGetPhysicalDeviceFormatProperties2(&m_pool, physicalDevice, format,
+                                                                 pFormatProperties);
                 vkStream->unsetHandleMapping();
-                if (pFormatProperties)
-                {
-                    transform_fromhost_VkFormatProperties2(m_state, (VkFormatProperties2*)(pFormatProperties));
+                if (pFormatProperties) {
+                    transform_fromhost_VkFormatProperties2(
+                        m_state, (VkFormatProperties2*)(pFormatProperties));
                 }
-                marshal_VkFormatProperties2(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkFormatProperties2*)(pFormatProperties));
+                marshal_VkFormatProperties2(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                            (VkFormatProperties2*)(pFormatProperties));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceFormatProperties2(snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice, format, pFormatProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceFormatProperties2(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice, format,
+                        pFormatProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceImageFormatProperties2:
-            {
+            case OP_vkGetPhysicalDeviceImageFormatProperties2: {
                 android::base::beginTrace("vkGetPhysicalDeviceImageFormatProperties2 decode");
                 VkPhysicalDevice physicalDevice;
                 const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo;
@@ -8259,49 +9409,70 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
-                vkReadStream->alloc((void**)&pImageFormatInfo, sizeof(const VkPhysicalDeviceImageFormatInfo2));
-                reservedunmarshal_VkPhysicalDeviceImageFormatInfo2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceImageFormatInfo2*)(pImageFormatInfo), readStreamPtrPtr);
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                vkReadStream->alloc((void**)&pImageFormatInfo,
+                                    sizeof(const VkPhysicalDeviceImageFormatInfo2));
+                reservedunmarshal_VkPhysicalDeviceImageFormatInfo2(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPhysicalDeviceImageFormatInfo2*)(pImageFormatInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pImageFormatProperties;
                 vkReadStream->unsetHandleMapping();
-                vkReadStream->alloc((void**)&pImageFormatProperties, sizeof(VkImageFormatProperties2));
-                reservedunmarshal_VkImageFormatProperties2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageFormatProperties2*)(pImageFormatProperties), readStreamPtrPtr);
-                if (pImageFormatInfo)
-                {
-                    transform_tohost_VkPhysicalDeviceImageFormatInfo2(m_state, (VkPhysicalDeviceImageFormatInfo2*)(pImageFormatInfo));
+                vkReadStream->alloc((void**)&pImageFormatProperties,
+                                    sizeof(VkImageFormatProperties2));
+                reservedunmarshal_VkImageFormatProperties2(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkImageFormatProperties2*)(pImageFormatProperties), readStreamPtrPtr);
+                if (pImageFormatInfo) {
+                    transform_tohost_VkPhysicalDeviceImageFormatInfo2(
+                        m_state, (VkPhysicalDeviceImageFormatInfo2*)(pImageFormatInfo));
                 }
-                if (pImageFormatProperties)
-                {
-                    transform_tohost_VkImageFormatProperties2(m_state, (VkImageFormatProperties2*)(pImageFormatProperties));
+                if (pImageFormatProperties) {
+                    transform_tohost_VkImageFormatProperties2(
+                        m_state, (VkImageFormatProperties2*)(pImageFormatProperties));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceImageFormatProperties2 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pImageFormatInfo, (unsigned long long)pImageFormatProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceImageFormatProperties2 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)pImageFormatInfo,
+                            (unsigned long long)pImageFormatProperties);
                 }
                 VkResult vkGetPhysicalDeviceImageFormatProperties2_VkResult_return = (VkResult)0;
-                vkGetPhysicalDeviceImageFormatProperties2_VkResult_return = m_state->on_vkGetPhysicalDeviceImageFormatProperties2(&m_pool, physicalDevice, pImageFormatInfo, pImageFormatProperties);
-                if ((vkGetPhysicalDeviceImageFormatProperties2_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetPhysicalDeviceImageFormatProperties2_VkResult_return =
+                    m_state->on_vkGetPhysicalDeviceImageFormatProperties2(
+                        &m_pool, physicalDevice, pImageFormatInfo, pImageFormatProperties);
+                if ((vkGetPhysicalDeviceImageFormatProperties2_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                if (pImageFormatProperties)
-                {
-                    transform_fromhost_VkImageFormatProperties2(m_state, (VkImageFormatProperties2*)(pImageFormatProperties));
+                if (pImageFormatProperties) {
+                    transform_fromhost_VkImageFormatProperties2(
+                        m_state, (VkImageFormatProperties2*)(pImageFormatProperties));
                 }
-                marshal_VkImageFormatProperties2(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageFormatProperties2*)(pImageFormatProperties));
-                vkStream->write(&vkGetPhysicalDeviceImageFormatProperties2_VkResult_return, sizeof(VkResult));
+                marshal_VkImageFormatProperties2(
+                    vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkImageFormatProperties2*)(pImageFormatProperties));
+                vkStream->write(&vkGetPhysicalDeviceImageFormatProperties2_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceImageFormatProperties2(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetPhysicalDeviceImageFormatProperties2_VkResult_return, physicalDevice, pImageFormatInfo, pImageFormatProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceImageFormatProperties2(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetPhysicalDeviceImageFormatProperties2_VkResult_return, physicalDevice,
+                        pImageFormatInfo, pImageFormatProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceQueueFamilyProperties2:
-            {
+            case OP_vkGetPhysicalDeviceQueueFamilyProperties2: {
                 android::base::beginTrace("vkGetPhysicalDeviceQueueFamilyProperties2 decode");
                 VkPhysicalDevice physicalDevice;
                 uint32_t* pQueueFamilyPropertyCount;
@@ -8310,7 +9481,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
@@ -8320,10 +9492,10 @@
                 memcpy((uint32_t**)&pQueueFamilyPropertyCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pQueueFamilyPropertyCount);
                 *readStreamPtrPtr += 8;
-                if (pQueueFamilyPropertyCount)
-                {
+                if (pQueueFamilyPropertyCount) {
                     vkReadStream->alloc((void**)&pQueueFamilyPropertyCount, sizeof(uint32_t));
-                    memcpy((uint32_t*)pQueueFamilyPropertyCount, *readStreamPtrPtr, sizeof(uint32_t));
+                    memcpy((uint32_t*)pQueueFamilyPropertyCount, *readStreamPtrPtr,
+                           sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
                 }
                 // Begin manual dispatchable handle unboxing for pQueueFamilyProperties;
@@ -8332,74 +9504,78 @@
                 memcpy((VkQueueFamilyProperties2**)&pQueueFamilyProperties, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pQueueFamilyProperties);
                 *readStreamPtrPtr += 8;
-                if (pQueueFamilyProperties)
-                {
-                    vkReadStream->alloc((void**)&pQueueFamilyProperties, (*(pQueueFamilyPropertyCount)) * sizeof(VkQueueFamilyProperties2));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i)
-                    {
-                        reservedunmarshal_VkQueueFamilyProperties2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i), readStreamPtrPtr);
+                if (pQueueFamilyProperties) {
+                    vkReadStream->alloc(
+                        (void**)&pQueueFamilyProperties,
+                        (*(pQueueFamilyPropertyCount)) * sizeof(VkQueueFamilyProperties2));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i) {
+                        reservedunmarshal_VkQueueFamilyProperties2(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i),
+                            readStreamPtrPtr);
                     }
                 }
-                if (pQueueFamilyPropertyCount)
-                {
-                    if (pQueueFamilyProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i)
-                        {
-                            transform_tohost_VkQueueFamilyProperties2(m_state, (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i));
+                if (pQueueFamilyPropertyCount) {
+                    if (pQueueFamilyProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i) {
+                            transform_tohost_VkQueueFamilyProperties2(
+                                m_state, (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceQueueFamilyProperties2 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pQueueFamilyPropertyCount, (unsigned long long)pQueueFamilyProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceQueueFamilyProperties2 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)pQueueFamilyPropertyCount,
+                            (unsigned long long)pQueueFamilyProperties);
                 }
-                vk->vkGetPhysicalDeviceQueueFamilyProperties2(unboxed_physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
+                vk->vkGetPhysicalDeviceQueueFamilyProperties2(
+                    unboxed_physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pQueueFamilyPropertyCount;
                 vkStream->putBe64(cgen_var_3);
-                if (pQueueFamilyPropertyCount)
-                {
+                if (pQueueFamilyPropertyCount) {
                     vkStream->write((uint32_t*)pQueueFamilyPropertyCount, sizeof(uint32_t));
                 }
-                if (pQueueFamilyPropertyCount)
-                {
-                    if (pQueueFamilyProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i)
-                        {
-                            transform_fromhost_VkQueueFamilyProperties2(m_state, (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i));
+                if (pQueueFamilyPropertyCount) {
+                    if (pQueueFamilyProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i) {
+                            transform_fromhost_VkQueueFamilyProperties2(
+                                m_state, (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pQueueFamilyProperties;
                 vkStream->putBe64(cgen_var_4);
-                if (pQueueFamilyProperties)
-                {
-                    if (pQueueFamilyPropertyCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i)
-                        {
-                            marshal_VkQueueFamilyProperties2(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i));
+                if (pQueueFamilyProperties) {
+                    if (pQueueFamilyPropertyCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i) {
+                            marshal_VkQueueFamilyProperties2(
+                                vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i));
                         }
                     }
                 }
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceQueueFamilyProperties2(snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceQueueFamilyProperties2(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice,
+                        pQueueFamilyPropertyCount, pQueueFamilyProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceMemoryProperties2:
-            {
+            case OP_vkGetPhysicalDeviceMemoryProperties2: {
                 android::base::beginTrace("vkGetPhysicalDeviceMemoryProperties2 decode");
                 VkPhysicalDevice physicalDevice;
                 VkPhysicalDeviceMemoryProperties2* pMemoryProperties;
@@ -8407,40 +9583,51 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 // Begin manual dispatchable handle unboxing for pMemoryProperties;
                 vkReadStream->unsetHandleMapping();
-                vkReadStream->alloc((void**)&pMemoryProperties, sizeof(VkPhysicalDeviceMemoryProperties2));
-                reservedunmarshal_VkPhysicalDeviceMemoryProperties2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties), readStreamPtrPtr);
-                if (pMemoryProperties)
-                {
-                    transform_tohost_VkPhysicalDeviceMemoryProperties2(m_state, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties));
+                vkReadStream->alloc((void**)&pMemoryProperties,
+                                    sizeof(VkPhysicalDeviceMemoryProperties2));
+                reservedunmarshal_VkPhysicalDeviceMemoryProperties2(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties), readStreamPtrPtr);
+                if (pMemoryProperties) {
+                    transform_tohost_VkPhysicalDeviceMemoryProperties2(
+                        m_state, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceMemoryProperties2 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pMemoryProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceMemoryProperties2 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)pMemoryProperties);
                 }
-                m_state->on_vkGetPhysicalDeviceMemoryProperties2(&m_pool, physicalDevice, pMemoryProperties);
+                m_state->on_vkGetPhysicalDeviceMemoryProperties2(&m_pool, physicalDevice,
+                                                                 pMemoryProperties);
                 vkStream->unsetHandleMapping();
-                if (pMemoryProperties)
-                {
-                    transform_fromhost_VkPhysicalDeviceMemoryProperties2(m_state, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties));
+                if (pMemoryProperties) {
+                    transform_fromhost_VkPhysicalDeviceMemoryProperties2(
+                        m_state, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties));
                 }
-                marshal_VkPhysicalDeviceMemoryProperties2(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties));
+                marshal_VkPhysicalDeviceMemoryProperties2(
+                    vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceMemoryProperties2(snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice, pMemoryProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceMemoryProperties2(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice,
+                        pMemoryProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceSparseImageFormatProperties2:
-            {
+            case OP_vkGetPhysicalDeviceSparseImageFormatProperties2: {
                 android::base::beginTrace("vkGetPhysicalDeviceSparseImageFormatProperties2 decode");
                 VkPhysicalDevice physicalDevice;
                 const VkPhysicalDeviceSparseImageFormatInfo2* pFormatInfo;
@@ -8450,20 +9637,23 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
-                vkReadStream->alloc((void**)&pFormatInfo, sizeof(const VkPhysicalDeviceSparseImageFormatInfo2));
-                reservedunmarshal_VkPhysicalDeviceSparseImageFormatInfo2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceSparseImageFormatInfo2*)(pFormatInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pFormatInfo,
+                                    sizeof(const VkPhysicalDeviceSparseImageFormatInfo2));
+                reservedunmarshal_VkPhysicalDeviceSparseImageFormatInfo2(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPhysicalDeviceSparseImageFormatInfo2*)(pFormatInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pPropertyCount;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 memcpy((uint32_t**)&pPropertyCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pPropertyCount);
                 *readStreamPtrPtr += 8;
-                if (pPropertyCount)
-                {
+                if (pPropertyCount) {
                     vkReadStream->alloc((void**)&pPropertyCount, sizeof(uint32_t));
                     memcpy((uint32_t*)pPropertyCount, *readStreamPtrPtr, sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
@@ -8474,78 +9664,81 @@
                 memcpy((VkSparseImageFormatProperties2**)&pProperties, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pProperties);
                 *readStreamPtrPtr += 8;
-                if (pProperties)
-                {
-                    vkReadStream->alloc((void**)&pProperties, (*(pPropertyCount)) * sizeof(VkSparseImageFormatProperties2));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                    {
-                        reservedunmarshal_VkSparseImageFormatProperties2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSparseImageFormatProperties2*)(pProperties + i), readStreamPtrPtr);
+                if (pProperties) {
+                    vkReadStream->alloc(
+                        (void**)&pProperties,
+                        (*(pPropertyCount)) * sizeof(VkSparseImageFormatProperties2));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                        reservedunmarshal_VkSparseImageFormatProperties2(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkSparseImageFormatProperties2*)(pProperties + i), readStreamPtrPtr);
                     }
                 }
-                if (pFormatInfo)
-                {
-                    transform_tohost_VkPhysicalDeviceSparseImageFormatInfo2(m_state, (VkPhysicalDeviceSparseImageFormatInfo2*)(pFormatInfo));
+                if (pFormatInfo) {
+                    transform_tohost_VkPhysicalDeviceSparseImageFormatInfo2(
+                        m_state, (VkPhysicalDeviceSparseImageFormatInfo2*)(pFormatInfo));
                 }
-                if (pPropertyCount)
-                {
-                    if (pProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            transform_tohost_VkSparseImageFormatProperties2(m_state, (VkSparseImageFormatProperties2*)(pProperties + i));
+                if (pPropertyCount) {
+                    if (pProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            transform_tohost_VkSparseImageFormatProperties2(
+                                m_state, (VkSparseImageFormatProperties2*)(pProperties + i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceSparseImageFormatProperties2 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pFormatInfo, (unsigned long long)pPropertyCount, (unsigned long long)pProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceSparseImageFormatProperties2 "
+                            "0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)pFormatInfo, (unsigned long long)pPropertyCount,
+                            (unsigned long long)pProperties);
                 }
-                vk->vkGetPhysicalDeviceSparseImageFormatProperties2(unboxed_physicalDevice, pFormatInfo, pPropertyCount, pProperties);
+                vk->vkGetPhysicalDeviceSparseImageFormatProperties2(
+                    unboxed_physicalDevice, pFormatInfo, pPropertyCount, pProperties);
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pPropertyCount;
                 vkStream->putBe64(cgen_var_3);
-                if (pPropertyCount)
-                {
+                if (pPropertyCount) {
                     vkStream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
                 }
-                if (pPropertyCount)
-                {
-                    if (pProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            transform_fromhost_VkSparseImageFormatProperties2(m_state, (VkSparseImageFormatProperties2*)(pProperties + i));
+                if (pPropertyCount) {
+                    if (pProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            transform_fromhost_VkSparseImageFormatProperties2(
+                                m_state, (VkSparseImageFormatProperties2*)(pProperties + i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pProperties;
                 vkStream->putBe64(cgen_var_4);
-                if (pProperties)
-                {
-                    if (pPropertyCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            marshal_VkSparseImageFormatProperties2(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSparseImageFormatProperties2*)(pProperties + i));
+                if (pProperties) {
+                    if (pPropertyCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            marshal_VkSparseImageFormatProperties2(
+                                vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                (VkSparseImageFormatProperties2*)(pProperties + i));
                         }
                     }
                 }
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceSparseImageFormatProperties2(snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice, pFormatInfo, pPropertyCount, pProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceSparseImageFormatProperties2(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice,
+                        pFormatInfo, pPropertyCount, pProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkTrimCommandPool:
-            {
+            case OP_vkTrimCommandPool: {
                 android::base::beginTrace("vkTrimCommandPool decode");
                 VkDevice device;
                 VkCommandPool commandPool;
@@ -8561,28 +9754,32 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandPool*)&commandPool = (VkCommandPool)unbox_VkCommandPool((VkCommandPool)(*&cgen_var_1));
-                memcpy((VkCommandPoolTrimFlags*)&flags, *readStreamPtrPtr, sizeof(VkCommandPoolTrimFlags));
+                *(VkCommandPool*)&commandPool =
+                    (VkCommandPool)unbox_VkCommandPool((VkCommandPool)(*&cgen_var_1));
+                memcpy((VkCommandPoolTrimFlags*)&flags, *readStreamPtrPtr,
+                       sizeof(VkCommandPoolTrimFlags));
                 *readStreamPtrPtr += sizeof(VkCommandPoolTrimFlags);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkTrimCommandPool 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)commandPool, (unsigned long long)flags);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkTrimCommandPool 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)commandPool,
+                            (unsigned long long)flags);
                 }
                 vk->vkTrimCommandPool(unboxed_device, commandPool, flags);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkTrimCommandPool(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, commandPool, flags);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkTrimCommandPool(snapshotTraceBegin, snapshotTraceBytes,
+                                                           &m_pool, device, commandPool, flags);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetDeviceQueue2:
-            {
+            case OP_vkGetDeviceQueue2: {
                 android::base::beginTrace("vkGetDeviceQueue2 decode");
                 VkDevice device;
                 const VkDeviceQueueInfo2* pQueueInfo;
@@ -8596,7 +9793,9 @@
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
                 vkReadStream->alloc((void**)&pQueueInfo, sizeof(const VkDeviceQueueInfo2));
-                reservedunmarshal_VkDeviceQueueInfo2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDeviceQueueInfo2*)(pQueueInfo), readStreamPtrPtr);
+                reservedunmarshal_VkDeviceQueueInfo2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                     (VkDeviceQueueInfo2*)(pQueueInfo),
+                                                     readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pQueue;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pQueue, sizeof(VkQueue));
@@ -8604,13 +9803,13 @@
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
                 *(VkQueue*)pQueue = (VkQueue)(VkQueue)((VkQueue)(*&cgen_var_1));
-                if (pQueueInfo)
-                {
+                if (pQueueInfo) {
                     transform_tohost_VkDeviceQueueInfo2(m_state, (VkDeviceQueueInfo2*)(pQueueInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetDeviceQueue2 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pQueueInfo, (unsigned long long)pQueue);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkGetDeviceQueue2 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pQueueInfo,
+                            (unsigned long long)pQueue);
                 }
                 vk->vkGetDeviceQueue2(unboxed_device, pQueueInfo, pQueue);
                 vkStream->unsetHandleMapping();
@@ -8618,19 +9817,20 @@
                 vkStream->handleMapping()->mapHandles_VkQueue_u64(pQueue, &cgen_var_2, 1);
                 vkStream->write((uint64_t*)&cgen_var_2, 8);
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetDeviceQueue2(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, pQueueInfo, pQueue);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetDeviceQueue2(snapshotTraceBegin, snapshotTraceBytes,
+                                                           &m_pool, device, pQueueInfo, pQueue);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCreateSamplerYcbcrConversion:
-            {
+            case OP_vkCreateSamplerYcbcrConversion: {
                 android::base::beginTrace("vkCreateSamplerYcbcrConversion decode");
                 VkDevice device;
                 const VkSamplerYcbcrConversionCreateInfo* pCreateInfo;
@@ -8641,16 +9841,20 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
-                vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkSamplerYcbcrConversionCreateInfo));
-                reservedunmarshal_VkSamplerYcbcrConversionCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSamplerYcbcrConversionCreateInfo*)(pCreateInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pCreateInfo,
+                                    sizeof(const VkSamplerYcbcrConversionCreateInfo));
+                reservedunmarshal_VkSamplerYcbcrConversionCreateInfo(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkSamplerYcbcrConversionCreateInfo*)(pCreateInfo), readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pYcbcrConversion;
                 vkReadStream->unsetHandleMapping();
@@ -8658,46 +9862,60 @@
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkSamplerYcbcrConversion*)pYcbcrConversion = (VkSamplerYcbcrConversion)(VkSamplerYcbcrConversion)((VkSamplerYcbcrConversion)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkSamplerYcbcrConversionCreateInfo(m_state, (VkSamplerYcbcrConversionCreateInfo*)(pCreateInfo));
+                *(VkSamplerYcbcrConversion*)pYcbcrConversion =
+                    (VkSamplerYcbcrConversion)(VkSamplerYcbcrConversion)((
+                        VkSamplerYcbcrConversion)(*&cgen_var_2));
+                if (pCreateInfo) {
+                    transform_tohost_VkSamplerYcbcrConversionCreateInfo(
+                        m_state, (VkSamplerYcbcrConversionCreateInfo*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateSamplerYcbcrConversion 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pYcbcrConversion);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateSamplerYcbcrConversion 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pYcbcrConversion);
                 }
                 VkResult vkCreateSamplerYcbcrConversion_VkResult_return = (VkResult)0;
-                vkCreateSamplerYcbcrConversion_VkResult_return = m_state->on_vkCreateSamplerYcbcrConversion(&m_pool, device, pCreateInfo, pAllocator, pYcbcrConversion);
-                if ((vkCreateSamplerYcbcrConversion_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateSamplerYcbcrConversion_VkResult_return =
+                    m_state->on_vkCreateSamplerYcbcrConversion(&m_pool, device, pCreateInfo,
+                                                               pAllocator, pYcbcrConversion);
+                if ((vkCreateSamplerYcbcrConversion_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // Begin manual non dispatchable handle create for pYcbcrConversion;
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3;
-                static_assert(8 == sizeof(VkSamplerYcbcrConversion), "handle map overwrite requires VkSamplerYcbcrConversion to be 8 bytes long");
-                vkStream->handleMapping()->mapHandles_VkSamplerYcbcrConversion((VkSamplerYcbcrConversion*)pYcbcrConversion, 1);
+                static_assert(
+                    8 == sizeof(VkSamplerYcbcrConversion),
+                    "handle map overwrite requires VkSamplerYcbcrConversion to be 8 bytes long");
+                vkStream->handleMapping()->mapHandles_VkSamplerYcbcrConversion(
+                    (VkSamplerYcbcrConversion*)pYcbcrConversion, 1);
                 vkStream->write((VkSamplerYcbcrConversion*)pYcbcrConversion, 8 * 1);
                 // Begin manual non dispatchable handle create for pYcbcrConversion;
                 vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
                 vkStream->write(&vkCreateSamplerYcbcrConversion_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateSamplerYcbcrConversion(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateSamplerYcbcrConversion_VkResult_return, device, pCreateInfo, pAllocator, pYcbcrConversion);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateSamplerYcbcrConversion(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateSamplerYcbcrConversion_VkResult_return, device, pCreateInfo,
+                        pAllocator, pYcbcrConversion);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroySamplerYcbcrConversion:
-            {
+            case OP_vkDestroySamplerYcbcrConversion: {
                 android::base::beginTrace("vkDestroySamplerYcbcrConversion decode");
                 VkDevice device;
                 VkSamplerYcbcrConversion ycbcrConversion;
@@ -8712,42 +9930,51 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkSamplerYcbcrConversion*)&ycbcrConversion = (VkSamplerYcbcrConversion)(VkSamplerYcbcrConversion)((VkSamplerYcbcrConversion)(*&cgen_var_1));
+                *(VkSamplerYcbcrConversion*)&ycbcrConversion =
+                    (VkSamplerYcbcrConversion)(VkSamplerYcbcrConversion)((
+                        VkSamplerYcbcrConversion)(*&cgen_var_1));
                 boxed_ycbcrConversion_preserve = ycbcrConversion;
                 ycbcrConversion = unbox_VkSamplerYcbcrConversion(ycbcrConversion);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroySamplerYcbcrConversion 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)ycbcrConversion, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkDestroySamplerYcbcrConversion 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device, (unsigned long long)ycbcrConversion,
+                        (unsigned long long)pAllocator);
                 }
-                m_state->on_vkDestroySamplerYcbcrConversion(&m_pool, device, ycbcrConversion, pAllocator);
+                m_state->on_vkDestroySamplerYcbcrConversion(&m_pool, device, ycbcrConversion,
+                                                            pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroySamplerYcbcrConversion(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, boxed_ycbcrConversion_preserve, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroySamplerYcbcrConversion(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device,
+                        boxed_ycbcrConversion_preserve, pAllocator);
                 }
                 delete_VkSamplerYcbcrConversion(boxed_ycbcrConversion_preserve);
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCreateDescriptorUpdateTemplate:
-            {
+            case OP_vkCreateDescriptorUpdateTemplate: {
                 android::base::beginTrace("vkCreateDescriptorUpdateTemplate decode");
                 VkDevice device;
                 const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo;
@@ -8758,63 +9985,84 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
-                vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkDescriptorUpdateTemplateCreateInfo));
-                reservedunmarshal_VkDescriptorUpdateTemplateCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorUpdateTemplateCreateInfo*)(pCreateInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pCreateInfo,
+                                    sizeof(const VkDescriptorUpdateTemplateCreateInfo));
+                reservedunmarshal_VkDescriptorUpdateTemplateCreateInfo(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkDescriptorUpdateTemplateCreateInfo*)(pCreateInfo), readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pDescriptorUpdateTemplate;
                 vkReadStream->unsetHandleMapping();
-                vkReadStream->alloc((void**)&pDescriptorUpdateTemplate, sizeof(VkDescriptorUpdateTemplate));
+                vkReadStream->alloc((void**)&pDescriptorUpdateTemplate,
+                                    sizeof(VkDescriptorUpdateTemplate));
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkDescriptorUpdateTemplate*)pDescriptorUpdateTemplate = (VkDescriptorUpdateTemplate)(VkDescriptorUpdateTemplate)((VkDescriptorUpdateTemplate)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkDescriptorUpdateTemplateCreateInfo(m_state, (VkDescriptorUpdateTemplateCreateInfo*)(pCreateInfo));
+                *(VkDescriptorUpdateTemplate*)pDescriptorUpdateTemplate =
+                    (VkDescriptorUpdateTemplate)(VkDescriptorUpdateTemplate)((
+                        VkDescriptorUpdateTemplate)(*&cgen_var_2));
+                if (pCreateInfo) {
+                    transform_tohost_VkDescriptorUpdateTemplateCreateInfo(
+                        m_state, (VkDescriptorUpdateTemplateCreateInfo*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateDescriptorUpdateTemplate 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pDescriptorUpdateTemplate);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateDescriptorUpdateTemplate 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator,
+                            (unsigned long long)pDescriptorUpdateTemplate);
                 }
                 VkResult vkCreateDescriptorUpdateTemplate_VkResult_return = (VkResult)0;
-                vkCreateDescriptorUpdateTemplate_VkResult_return = m_state->on_vkCreateDescriptorUpdateTemplate(&m_pool, device, pCreateInfo, pAllocator, pDescriptorUpdateTemplate);
-                if ((vkCreateDescriptorUpdateTemplate_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateDescriptorUpdateTemplate_VkResult_return =
+                    m_state->on_vkCreateDescriptorUpdateTemplate(
+                        &m_pool, device, pCreateInfo, pAllocator, pDescriptorUpdateTemplate);
+                if ((vkCreateDescriptorUpdateTemplate_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // Begin manual non dispatchable handle create for pDescriptorUpdateTemplate;
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3;
-                static_assert(8 == sizeof(VkDescriptorUpdateTemplate), "handle map overwrite requires VkDescriptorUpdateTemplate to be 8 bytes long");
-                vkStream->handleMapping()->mapHandles_VkDescriptorUpdateTemplate((VkDescriptorUpdateTemplate*)pDescriptorUpdateTemplate, 1);
+                static_assert(
+                    8 == sizeof(VkDescriptorUpdateTemplate),
+                    "handle map overwrite requires VkDescriptorUpdateTemplate to be 8 bytes long");
+                vkStream->handleMapping()->mapHandles_VkDescriptorUpdateTemplate(
+                    (VkDescriptorUpdateTemplate*)pDescriptorUpdateTemplate, 1);
                 vkStream->write((VkDescriptorUpdateTemplate*)pDescriptorUpdateTemplate, 8 * 1);
                 // Begin manual non dispatchable handle create for pDescriptorUpdateTemplate;
                 vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
-                vkStream->write(&vkCreateDescriptorUpdateTemplate_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkCreateDescriptorUpdateTemplate_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateDescriptorUpdateTemplate(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateDescriptorUpdateTemplate_VkResult_return, device, pCreateInfo, pAllocator, pDescriptorUpdateTemplate);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateDescriptorUpdateTemplate(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateDescriptorUpdateTemplate_VkResult_return, device, pCreateInfo,
+                        pAllocator, pDescriptorUpdateTemplate);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroyDescriptorUpdateTemplate:
-            {
+            case OP_vkDestroyDescriptorUpdateTemplate: {
                 android::base::beginTrace("vkDestroyDescriptorUpdateTemplate decode");
                 VkDevice device;
                 VkDescriptorUpdateTemplate descriptorUpdateTemplate;
@@ -8824,47 +10072,59 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
-                // Begin manual non dispatchable handle destroy unboxing for descriptorUpdateTemplate;
+                // Begin manual non dispatchable handle destroy unboxing for
+                // descriptorUpdateTemplate;
                 VkDescriptorUpdateTemplate boxed_descriptorUpdateTemplate_preserve;
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDescriptorUpdateTemplate*)&descriptorUpdateTemplate = (VkDescriptorUpdateTemplate)(VkDescriptorUpdateTemplate)((VkDescriptorUpdateTemplate)(*&cgen_var_1));
+                *(VkDescriptorUpdateTemplate*)&descriptorUpdateTemplate =
+                    (VkDescriptorUpdateTemplate)(VkDescriptorUpdateTemplate)((
+                        VkDescriptorUpdateTemplate)(*&cgen_var_1));
                 boxed_descriptorUpdateTemplate_preserve = descriptorUpdateTemplate;
-                descriptorUpdateTemplate = unbox_VkDescriptorUpdateTemplate(descriptorUpdateTemplate);
+                descriptorUpdateTemplate =
+                    unbox_VkDescriptorUpdateTemplate(descriptorUpdateTemplate);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroyDescriptorUpdateTemplate 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)descriptorUpdateTemplate, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkDestroyDescriptorUpdateTemplate 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device,
+                        (unsigned long long)descriptorUpdateTemplate,
+                        (unsigned long long)pAllocator);
                 }
-                m_state->on_vkDestroyDescriptorUpdateTemplate(&m_pool, device, descriptorUpdateTemplate, pAllocator);
+                m_state->on_vkDestroyDescriptorUpdateTemplate(&m_pool, device,
+                                                              descriptorUpdateTemplate, pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroyDescriptorUpdateTemplate(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, boxed_descriptorUpdateTemplate_preserve, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroyDescriptorUpdateTemplate(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device,
+                        boxed_descriptorUpdateTemplate_preserve, pAllocator);
                 }
                 delete_VkDescriptorUpdateTemplate(boxed_descriptorUpdateTemplate_preserve);
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkUpdateDescriptorSetWithTemplate:
-            {
+            case OP_vkUpdateDescriptorSetWithTemplate: {
                 android::base::beginTrace("vkUpdateDescriptorSetWithTemplate decode");
                 VkDevice device;
                 VkDescriptorSet descriptorSet;
@@ -8881,40 +10141,49 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDescriptorSet*)&descriptorSet = (VkDescriptorSet)unbox_VkDescriptorSet((VkDescriptorSet)(*&cgen_var_1));
+                *(VkDescriptorSet*)&descriptorSet =
+                    (VkDescriptorSet)unbox_VkDescriptorSet((VkDescriptorSet)(*&cgen_var_1));
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDescriptorUpdateTemplate*)&descriptorUpdateTemplate = (VkDescriptorUpdateTemplate)unbox_VkDescriptorUpdateTemplate((VkDescriptorUpdateTemplate)(*&cgen_var_2));
+                *(VkDescriptorUpdateTemplate*)&descriptorUpdateTemplate =
+                    (VkDescriptorUpdateTemplate)unbox_VkDescriptorUpdateTemplate(
+                        (VkDescriptorUpdateTemplate)(*&cgen_var_2));
                 // WARNING PTR CHECK
                 memcpy((void**)&pData, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pData);
                 *readStreamPtrPtr += 8;
-                if (pData)
-                {
+                if (pData) {
                     vkReadStream->alloc((void**)&pData, sizeof(const uint8_t));
                     memcpy((void*)pData, *readStreamPtrPtr, sizeof(const uint8_t));
                     *readStreamPtrPtr += sizeof(const uint8_t);
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkUpdateDescriptorSetWithTemplate 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)descriptorSet, (unsigned long long)descriptorUpdateTemplate, (unsigned long long)pData);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkUpdateDescriptorSetWithTemplate 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)descriptorSet,
+                            (unsigned long long)descriptorUpdateTemplate,
+                            (unsigned long long)pData);
                 }
-                vk->vkUpdateDescriptorSetWithTemplate(unboxed_device, descriptorSet, descriptorUpdateTemplate, pData);
+                vk->vkUpdateDescriptorSetWithTemplate(unboxed_device, descriptorSet,
+                                                      descriptorUpdateTemplate, pData);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkUpdateDescriptorSetWithTemplate(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, descriptorSet, descriptorUpdateTemplate, pData);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkUpdateDescriptorSetWithTemplate(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, descriptorSet,
+                        descriptorUpdateTemplate, pData);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceExternalBufferProperties:
-            {
+            case OP_vkGetPhysicalDeviceExternalBufferProperties: {
                 android::base::beginTrace("vkGetPhysicalDeviceExternalBufferProperties decode");
                 VkPhysicalDevice physicalDevice;
                 const VkPhysicalDeviceExternalBufferInfo* pExternalBufferInfo;
@@ -8923,52 +10192,71 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
-                vkReadStream->alloc((void**)&pExternalBufferInfo, sizeof(const VkPhysicalDeviceExternalBufferInfo));
-                reservedunmarshal_VkPhysicalDeviceExternalBufferInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceExternalBufferInfo*)(pExternalBufferInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pExternalBufferInfo,
+                                    sizeof(const VkPhysicalDeviceExternalBufferInfo));
+                reservedunmarshal_VkPhysicalDeviceExternalBufferInfo(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPhysicalDeviceExternalBufferInfo*)(pExternalBufferInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pExternalBufferProperties;
                 vkReadStream->unsetHandleMapping();
-                vkReadStream->alloc((void**)&pExternalBufferProperties, sizeof(VkExternalBufferProperties));
-                reservedunmarshal_VkExternalBufferProperties(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExternalBufferProperties*)(pExternalBufferProperties), readStreamPtrPtr);
-                if (pExternalBufferInfo)
-                {
-                    m_state->transformImpl_VkPhysicalDeviceExternalBufferInfo_tohost(pExternalBufferInfo, 1);
-                    transform_tohost_VkPhysicalDeviceExternalBufferInfo(m_state, (VkPhysicalDeviceExternalBufferInfo*)(pExternalBufferInfo));
+                vkReadStream->alloc((void**)&pExternalBufferProperties,
+                                    sizeof(VkExternalBufferProperties));
+                reservedunmarshal_VkExternalBufferProperties(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkExternalBufferProperties*)(pExternalBufferProperties), readStreamPtrPtr);
+                if (pExternalBufferInfo) {
+                    m_state->transformImpl_VkPhysicalDeviceExternalBufferInfo_tohost(
+                        pExternalBufferInfo, 1);
+                    transform_tohost_VkPhysicalDeviceExternalBufferInfo(
+                        m_state, (VkPhysicalDeviceExternalBufferInfo*)(pExternalBufferInfo));
                 }
-                if (pExternalBufferProperties)
-                {
-                    m_state->transformImpl_VkExternalBufferProperties_tohost(pExternalBufferProperties, 1);
-                    transform_tohost_VkExternalBufferProperties(m_state, (VkExternalBufferProperties*)(pExternalBufferProperties));
+                if (pExternalBufferProperties) {
+                    m_state->transformImpl_VkExternalBufferProperties_tohost(
+                        pExternalBufferProperties, 1);
+                    transform_tohost_VkExternalBufferProperties(
+                        m_state, (VkExternalBufferProperties*)(pExternalBufferProperties));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceExternalBufferProperties 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pExternalBufferInfo, (unsigned long long)pExternalBufferProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceExternalBufferProperties 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)pExternalBufferInfo,
+                            (unsigned long long)pExternalBufferProperties);
                 }
-                vk->vkGetPhysicalDeviceExternalBufferProperties(unboxed_physicalDevice, pExternalBufferInfo, pExternalBufferProperties);
+                vk->vkGetPhysicalDeviceExternalBufferProperties(
+                    unboxed_physicalDevice, pExternalBufferInfo, pExternalBufferProperties);
                 vkStream->unsetHandleMapping();
-                if (pExternalBufferProperties)
-                {
-                    m_state->transformImpl_VkExternalBufferProperties_fromhost(pExternalBufferProperties, 1);
-                    transform_fromhost_VkExternalBufferProperties(m_state, (VkExternalBufferProperties*)(pExternalBufferProperties));
+                if (pExternalBufferProperties) {
+                    m_state->transformImpl_VkExternalBufferProperties_fromhost(
+                        pExternalBufferProperties, 1);
+                    transform_fromhost_VkExternalBufferProperties(
+                        m_state, (VkExternalBufferProperties*)(pExternalBufferProperties));
                 }
-                marshal_VkExternalBufferProperties(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExternalBufferProperties*)(pExternalBufferProperties));
+                marshal_VkExternalBufferProperties(
+                    vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkExternalBufferProperties*)(pExternalBufferProperties));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceExternalBufferProperties(snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice, pExternalBufferInfo, pExternalBufferProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceExternalBufferProperties(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice,
+                        pExternalBufferInfo, pExternalBufferProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceExternalFenceProperties:
-            {
+            case OP_vkGetPhysicalDeviceExternalFenceProperties: {
                 android::base::beginTrace("vkGetPhysicalDeviceExternalFenceProperties decode");
                 VkPhysicalDevice physicalDevice;
                 const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo;
@@ -8977,49 +10265,65 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
-                vkReadStream->alloc((void**)&pExternalFenceInfo, sizeof(const VkPhysicalDeviceExternalFenceInfo));
-                reservedunmarshal_VkPhysicalDeviceExternalFenceInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceExternalFenceInfo*)(pExternalFenceInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pExternalFenceInfo,
+                                    sizeof(const VkPhysicalDeviceExternalFenceInfo));
+                reservedunmarshal_VkPhysicalDeviceExternalFenceInfo(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPhysicalDeviceExternalFenceInfo*)(pExternalFenceInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pExternalFenceProperties;
                 vkReadStream->unsetHandleMapping();
-                vkReadStream->alloc((void**)&pExternalFenceProperties, sizeof(VkExternalFenceProperties));
-                reservedunmarshal_VkExternalFenceProperties(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExternalFenceProperties*)(pExternalFenceProperties), readStreamPtrPtr);
-                if (pExternalFenceInfo)
-                {
-                    transform_tohost_VkPhysicalDeviceExternalFenceInfo(m_state, (VkPhysicalDeviceExternalFenceInfo*)(pExternalFenceInfo));
+                vkReadStream->alloc((void**)&pExternalFenceProperties,
+                                    sizeof(VkExternalFenceProperties));
+                reservedunmarshal_VkExternalFenceProperties(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkExternalFenceProperties*)(pExternalFenceProperties), readStreamPtrPtr);
+                if (pExternalFenceInfo) {
+                    transform_tohost_VkPhysicalDeviceExternalFenceInfo(
+                        m_state, (VkPhysicalDeviceExternalFenceInfo*)(pExternalFenceInfo));
                 }
-                if (pExternalFenceProperties)
-                {
-                    transform_tohost_VkExternalFenceProperties(m_state, (VkExternalFenceProperties*)(pExternalFenceProperties));
+                if (pExternalFenceProperties) {
+                    transform_tohost_VkExternalFenceProperties(
+                        m_state, (VkExternalFenceProperties*)(pExternalFenceProperties));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceExternalFenceProperties 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pExternalFenceInfo, (unsigned long long)pExternalFenceProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceExternalFenceProperties 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)pExternalFenceInfo,
+                            (unsigned long long)pExternalFenceProperties);
                 }
-                vk->vkGetPhysicalDeviceExternalFenceProperties(unboxed_physicalDevice, pExternalFenceInfo, pExternalFenceProperties);
+                vk->vkGetPhysicalDeviceExternalFenceProperties(
+                    unboxed_physicalDevice, pExternalFenceInfo, pExternalFenceProperties);
                 vkStream->unsetHandleMapping();
-                if (pExternalFenceProperties)
-                {
-                    transform_fromhost_VkExternalFenceProperties(m_state, (VkExternalFenceProperties*)(pExternalFenceProperties));
+                if (pExternalFenceProperties) {
+                    transform_fromhost_VkExternalFenceProperties(
+                        m_state, (VkExternalFenceProperties*)(pExternalFenceProperties));
                 }
-                marshal_VkExternalFenceProperties(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExternalFenceProperties*)(pExternalFenceProperties));
+                marshal_VkExternalFenceProperties(
+                    vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkExternalFenceProperties*)(pExternalFenceProperties));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceExternalFenceProperties(snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice, pExternalFenceInfo, pExternalFenceProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceExternalFenceProperties(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice,
+                        pExternalFenceInfo, pExternalFenceProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceExternalSemaphoreProperties:
-            {
+            case OP_vkGetPhysicalDeviceExternalSemaphoreProperties: {
                 android::base::beginTrace("vkGetPhysicalDeviceExternalSemaphoreProperties decode");
                 VkPhysicalDevice physicalDevice;
                 const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo;
@@ -9028,46 +10332,64 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
-                vkReadStream->alloc((void**)&pExternalSemaphoreInfo, sizeof(const VkPhysicalDeviceExternalSemaphoreInfo));
-                reservedunmarshal_VkPhysicalDeviceExternalSemaphoreInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceExternalSemaphoreInfo*)(pExternalSemaphoreInfo), readStreamPtrPtr);
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                vkReadStream->alloc((void**)&pExternalSemaphoreInfo,
+                                    sizeof(const VkPhysicalDeviceExternalSemaphoreInfo));
+                reservedunmarshal_VkPhysicalDeviceExternalSemaphoreInfo(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPhysicalDeviceExternalSemaphoreInfo*)(pExternalSemaphoreInfo),
+                    readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pExternalSemaphoreProperties;
                 vkReadStream->unsetHandleMapping();
-                vkReadStream->alloc((void**)&pExternalSemaphoreProperties, sizeof(VkExternalSemaphoreProperties));
-                reservedunmarshal_VkExternalSemaphoreProperties(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties), readStreamPtrPtr);
-                if (pExternalSemaphoreInfo)
-                {
-                    transform_tohost_VkPhysicalDeviceExternalSemaphoreInfo(m_state, (VkPhysicalDeviceExternalSemaphoreInfo*)(pExternalSemaphoreInfo));
+                vkReadStream->alloc((void**)&pExternalSemaphoreProperties,
+                                    sizeof(VkExternalSemaphoreProperties));
+                reservedunmarshal_VkExternalSemaphoreProperties(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties),
+                    readStreamPtrPtr);
+                if (pExternalSemaphoreInfo) {
+                    transform_tohost_VkPhysicalDeviceExternalSemaphoreInfo(
+                        m_state, (VkPhysicalDeviceExternalSemaphoreInfo*)(pExternalSemaphoreInfo));
                 }
-                if (pExternalSemaphoreProperties)
-                {
-                    transform_tohost_VkExternalSemaphoreProperties(m_state, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties));
+                if (pExternalSemaphoreProperties) {
+                    transform_tohost_VkExternalSemaphoreProperties(
+                        m_state, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceExternalSemaphoreProperties 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pExternalSemaphoreInfo, (unsigned long long)pExternalSemaphoreProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceExternalSemaphoreProperties 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)pExternalSemaphoreInfo,
+                            (unsigned long long)pExternalSemaphoreProperties);
                 }
-                m_state->on_vkGetPhysicalDeviceExternalSemaphoreProperties(&m_pool, physicalDevice, pExternalSemaphoreInfo, pExternalSemaphoreProperties);
+                m_state->on_vkGetPhysicalDeviceExternalSemaphoreProperties(
+                    &m_pool, physicalDevice, pExternalSemaphoreInfo, pExternalSemaphoreProperties);
                 vkStream->unsetHandleMapping();
-                if (pExternalSemaphoreProperties)
-                {
-                    transform_fromhost_VkExternalSemaphoreProperties(m_state, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties));
+                if (pExternalSemaphoreProperties) {
+                    transform_fromhost_VkExternalSemaphoreProperties(
+                        m_state, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties));
                 }
-                marshal_VkExternalSemaphoreProperties(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties));
+                marshal_VkExternalSemaphoreProperties(
+                    vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceExternalSemaphoreProperties(snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice, pExternalSemaphoreInfo, pExternalSemaphoreProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceExternalSemaphoreProperties(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice,
+                        pExternalSemaphoreInfo, pExternalSemaphoreProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetDescriptorSetLayoutSupport:
-            {
+            case OP_vkGetDescriptorSetLayoutSupport: {
                 android::base::beginTrace("vkGetDescriptorSetLayoutSupport decode");
                 VkDevice device;
                 const VkDescriptorSetLayoutCreateInfo* pCreateInfo;
@@ -9080,47 +10402,58 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkDescriptorSetLayoutCreateInfo));
-                reservedunmarshal_VkDescriptorSetLayoutCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorSetLayoutCreateInfo*)(pCreateInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pCreateInfo,
+                                    sizeof(const VkDescriptorSetLayoutCreateInfo));
+                reservedunmarshal_VkDescriptorSetLayoutCreateInfo(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkDescriptorSetLayoutCreateInfo*)(pCreateInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pSupport;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pSupport, sizeof(VkDescriptorSetLayoutSupport));
-                reservedunmarshal_VkDescriptorSetLayoutSupport(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorSetLayoutSupport*)(pSupport), readStreamPtrPtr);
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkDescriptorSetLayoutCreateInfo(m_state, (VkDescriptorSetLayoutCreateInfo*)(pCreateInfo));
+                reservedunmarshal_VkDescriptorSetLayoutSupport(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkDescriptorSetLayoutSupport*)(pSupport), readStreamPtrPtr);
+                if (pCreateInfo) {
+                    transform_tohost_VkDescriptorSetLayoutCreateInfo(
+                        m_state, (VkDescriptorSetLayoutCreateInfo*)(pCreateInfo));
                 }
-                if (pSupport)
-                {
-                    transform_tohost_VkDescriptorSetLayoutSupport(m_state, (VkDescriptorSetLayoutSupport*)(pSupport));
+                if (pSupport) {
+                    transform_tohost_VkDescriptorSetLayoutSupport(
+                        m_state, (VkDescriptorSetLayoutSupport*)(pSupport));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetDescriptorSetLayoutSupport 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pSupport);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkGetDescriptorSetLayoutSupport 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                        (unsigned long long)pSupport);
                 }
                 vk->vkGetDescriptorSetLayoutSupport(unboxed_device, pCreateInfo, pSupport);
                 vkStream->unsetHandleMapping();
-                if (pSupport)
-                {
-                    transform_fromhost_VkDescriptorSetLayoutSupport(m_state, (VkDescriptorSetLayoutSupport*)(pSupport));
+                if (pSupport) {
+                    transform_fromhost_VkDescriptorSetLayoutSupport(
+                        m_state, (VkDescriptorSetLayoutSupport*)(pSupport));
                 }
-                marshal_VkDescriptorSetLayoutSupport(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorSetLayoutSupport*)(pSupport));
+                marshal_VkDescriptorSetLayoutSupport(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                     (VkDescriptorSetLayoutSupport*)(pSupport));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetDescriptorSetLayoutSupport(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, pCreateInfo, pSupport);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetDescriptorSetLayoutSupport(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, pCreateInfo,
+                        pSupport);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_VERSION_1_2
-            case OP_vkCmdDrawIndirectCount:
-            {
+            case OP_vkCmdDrawIndirectCount: {
                 android::base::beginTrace("vkCmdDrawIndirectCount decode");
                 VkCommandBuffer commandBuffer;
                 VkBuffer buffer;
@@ -9133,7 +10466,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -9153,25 +10487,33 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&stride, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdDrawIndirectCount 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)buffer, (unsigned long long)offset, (unsigned long long)countBuffer, (unsigned long long)countBufferOffset, (unsigned long long)maxDrawCount, (unsigned long long)stride);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdDrawIndirectCount 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer, (unsigned long long)buffer,
+                            (unsigned long long)offset, (unsigned long long)countBuffer,
+                            (unsigned long long)countBufferOffset, (unsigned long long)maxDrawCount,
+                            (unsigned long long)stride);
                 }
-                vk->vkCmdDrawIndirectCount(unboxed_commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+                vk->vkCmdDrawIndirectCount(unboxed_commandBuffer, buffer, offset, countBuffer,
+                                           countBufferOffset, maxDrawCount, stride);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdDrawIndirectCount(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdDrawIndirectCount(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, buffer,
+                        offset, countBuffer, countBufferOffset, maxDrawCount, stride);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdDrawIndexedIndirectCount:
-            {
+            case OP_vkCmdDrawIndexedIndirectCount: {
                 android::base::beginTrace("vkCmdDrawIndexedIndirectCount decode");
                 VkCommandBuffer commandBuffer;
                 VkBuffer buffer;
@@ -9184,7 +10526,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -9204,25 +10547,34 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&stride, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdDrawIndexedIndirectCount 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)buffer, (unsigned long long)offset, (unsigned long long)countBuffer, (unsigned long long)countBufferOffset, (unsigned long long)maxDrawCount, (unsigned long long)stride);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdDrawIndexedIndirectCount 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer, (unsigned long long)buffer,
+                            (unsigned long long)offset, (unsigned long long)countBuffer,
+                            (unsigned long long)countBufferOffset, (unsigned long long)maxDrawCount,
+                            (unsigned long long)stride);
                 }
-                vk->vkCmdDrawIndexedIndirectCount(unboxed_commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+                vk->vkCmdDrawIndexedIndirectCount(unboxed_commandBuffer, buffer, offset,
+                                                  countBuffer, countBufferOffset, maxDrawCount,
+                                                  stride);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdDrawIndexedIndirectCount(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdDrawIndexedIndirectCount(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, buffer,
+                        offset, countBuffer, countBufferOffset, maxDrawCount, stride);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCreateRenderPass2:
-            {
+            case OP_vkCreateRenderPass2: {
                 android::base::beginTrace("vkCreateRenderPass2 decode");
                 VkDevice device;
                 const VkRenderPassCreateInfo2* pCreateInfo;
@@ -9234,15 +10586,18 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkRenderPassCreateInfo2));
-                reservedunmarshal_VkRenderPassCreateInfo2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRenderPassCreateInfo2*)(pCreateInfo), readStreamPtrPtr);
+                reservedunmarshal_VkRenderPassCreateInfo2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                          (VkRenderPassCreateInfo2*)(pCreateInfo),
+                                                          readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pRenderPass;
                 vkReadStream->unsetHandleMapping();
@@ -9250,46 +10605,55 @@
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkRenderPass*)pRenderPass = (VkRenderPass)(VkRenderPass)((VkRenderPass)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkRenderPassCreateInfo2(m_state, (VkRenderPassCreateInfo2*)(pCreateInfo));
+                *(VkRenderPass*)pRenderPass =
+                    (VkRenderPass)(VkRenderPass)((VkRenderPass)(*&cgen_var_2));
+                if (pCreateInfo) {
+                    transform_tohost_VkRenderPassCreateInfo2(
+                        m_state, (VkRenderPassCreateInfo2*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateRenderPass2 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pRenderPass);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateRenderPass2 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pRenderPass);
                 }
                 VkResult vkCreateRenderPass2_VkResult_return = (VkResult)0;
-                vkCreateRenderPass2_VkResult_return = m_state->on_vkCreateRenderPass2(&m_pool, device, pCreateInfo, pAllocator, pRenderPass);
-                if ((vkCreateRenderPass2_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateRenderPass2_VkResult_return = m_state->on_vkCreateRenderPass2(
+                    &m_pool, device, pCreateInfo, pAllocator, pRenderPass);
+                if ((vkCreateRenderPass2_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // Begin manual non dispatchable handle create for pRenderPass;
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3;
-                static_assert(8 == sizeof(VkRenderPass), "handle map overwrite requires VkRenderPass to be 8 bytes long");
+                static_assert(8 == sizeof(VkRenderPass),
+                              "handle map overwrite requires VkRenderPass to be 8 bytes long");
                 vkStream->handleMapping()->mapHandles_VkRenderPass((VkRenderPass*)pRenderPass, 1);
                 vkStream->write((VkRenderPass*)pRenderPass, 8 * 1);
                 // Begin manual non dispatchable handle create for pRenderPass;
                 vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
                 vkStream->write(&vkCreateRenderPass2_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateRenderPass2(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateRenderPass2_VkResult_return, device, pCreateInfo, pAllocator, pRenderPass);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateRenderPass2(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateRenderPass2_VkResult_return, device, pCreateInfo, pAllocator,
+                        pRenderPass);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdBeginRenderPass2:
-            {
+            case OP_vkCmdBeginRenderPass2: {
                 android::base::beginTrace("vkCmdBeginRenderPass2 decode");
                 VkCommandBuffer commandBuffer;
                 const VkRenderPassBeginInfo* pRenderPassBegin;
@@ -9298,41 +10662,51 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 vkReadStream->alloc((void**)&pRenderPassBegin, sizeof(const VkRenderPassBeginInfo));
-                reservedunmarshal_VkRenderPassBeginInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRenderPassBeginInfo*)(pRenderPassBegin), readStreamPtrPtr);
+                reservedunmarshal_VkRenderPassBeginInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                        (VkRenderPassBeginInfo*)(pRenderPassBegin),
+                                                        readStreamPtrPtr);
                 vkReadStream->alloc((void**)&pSubpassBeginInfo, sizeof(const VkSubpassBeginInfo));
-                reservedunmarshal_VkSubpassBeginInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubpassBeginInfo*)(pSubpassBeginInfo), readStreamPtrPtr);
-                if (pRenderPassBegin)
-                {
-                    transform_tohost_VkRenderPassBeginInfo(m_state, (VkRenderPassBeginInfo*)(pRenderPassBegin));
+                reservedunmarshal_VkSubpassBeginInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                     (VkSubpassBeginInfo*)(pSubpassBeginInfo),
+                                                     readStreamPtrPtr);
+                if (pRenderPassBegin) {
+                    transform_tohost_VkRenderPassBeginInfo(
+                        m_state, (VkRenderPassBeginInfo*)(pRenderPassBegin));
                 }
-                if (pSubpassBeginInfo)
-                {
-                    transform_tohost_VkSubpassBeginInfo(m_state, (VkSubpassBeginInfo*)(pSubpassBeginInfo));
+                if (pSubpassBeginInfo) {
+                    transform_tohost_VkSubpassBeginInfo(m_state,
+                                                        (VkSubpassBeginInfo*)(pSubpassBeginInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdBeginRenderPass2 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pRenderPassBegin, (unsigned long long)pSubpassBeginInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdBeginRenderPass2 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pRenderPassBegin,
+                            (unsigned long long)pSubpassBeginInfo);
                 }
-                vk->vkCmdBeginRenderPass2(unboxed_commandBuffer, pRenderPassBegin, pSubpassBeginInfo);
+                vk->vkCmdBeginRenderPass2(unboxed_commandBuffer, pRenderPassBegin,
+                                          pSubpassBeginInfo);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdBeginRenderPass2(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pRenderPassBegin, pSubpassBeginInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdBeginRenderPass2(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        pRenderPassBegin, pSubpassBeginInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdNextSubpass2:
-            {
+            case OP_vkCmdNextSubpass2: {
                 android::base::beginTrace("vkCmdNextSubpass2 decode");
                 VkCommandBuffer commandBuffer;
                 const VkSubpassBeginInfo* pSubpassBeginInfo;
@@ -9341,41 +10715,50 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 vkReadStream->alloc((void**)&pSubpassBeginInfo, sizeof(const VkSubpassBeginInfo));
-                reservedunmarshal_VkSubpassBeginInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubpassBeginInfo*)(pSubpassBeginInfo), readStreamPtrPtr);
+                reservedunmarshal_VkSubpassBeginInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                     (VkSubpassBeginInfo*)(pSubpassBeginInfo),
+                                                     readStreamPtrPtr);
                 vkReadStream->alloc((void**)&pSubpassEndInfo, sizeof(const VkSubpassEndInfo));
-                reservedunmarshal_VkSubpassEndInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubpassEndInfo*)(pSubpassEndInfo), readStreamPtrPtr);
-                if (pSubpassBeginInfo)
-                {
-                    transform_tohost_VkSubpassBeginInfo(m_state, (VkSubpassBeginInfo*)(pSubpassBeginInfo));
+                reservedunmarshal_VkSubpassEndInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                   (VkSubpassEndInfo*)(pSubpassEndInfo),
+                                                   readStreamPtrPtr);
+                if (pSubpassBeginInfo) {
+                    transform_tohost_VkSubpassBeginInfo(m_state,
+                                                        (VkSubpassBeginInfo*)(pSubpassBeginInfo));
                 }
-                if (pSubpassEndInfo)
-                {
-                    transform_tohost_VkSubpassEndInfo(m_state, (VkSubpassEndInfo*)(pSubpassEndInfo));
+                if (pSubpassEndInfo) {
+                    transform_tohost_VkSubpassEndInfo(m_state,
+                                                      (VkSubpassEndInfo*)(pSubpassEndInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdNextSubpass2 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pSubpassBeginInfo, (unsigned long long)pSubpassEndInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdNextSubpass2 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pSubpassBeginInfo,
+                            (unsigned long long)pSubpassEndInfo);
                 }
                 vk->vkCmdNextSubpass2(unboxed_commandBuffer, pSubpassBeginInfo, pSubpassEndInfo);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdNextSubpass2(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pSubpassBeginInfo, pSubpassEndInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdNextSubpass2(snapshotTraceBegin, snapshotTraceBytes,
+                                                           &m_pool, commandBuffer,
+                                                           pSubpassBeginInfo, pSubpassEndInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdEndRenderPass2:
-            {
+            case OP_vkCmdEndRenderPass2: {
                 android::base::beginTrace("vkCmdEndRenderPass2 decode");
                 VkCommandBuffer commandBuffer;
                 const VkSubpassEndInfo* pSubpassEndInfo;
@@ -9383,35 +10766,41 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 vkReadStream->alloc((void**)&pSubpassEndInfo, sizeof(const VkSubpassEndInfo));
-                reservedunmarshal_VkSubpassEndInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubpassEndInfo*)(pSubpassEndInfo), readStreamPtrPtr);
-                if (pSubpassEndInfo)
-                {
-                    transform_tohost_VkSubpassEndInfo(m_state, (VkSubpassEndInfo*)(pSubpassEndInfo));
+                reservedunmarshal_VkSubpassEndInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                   (VkSubpassEndInfo*)(pSubpassEndInfo),
+                                                   readStreamPtrPtr);
+                if (pSubpassEndInfo) {
+                    transform_tohost_VkSubpassEndInfo(m_state,
+                                                      (VkSubpassEndInfo*)(pSubpassEndInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdEndRenderPass2 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pSubpassEndInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdEndRenderPass2 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pSubpassEndInfo);
                 }
                 vk->vkCmdEndRenderPass2(unboxed_commandBuffer, pSubpassEndInfo);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdEndRenderPass2(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pSubpassEndInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdEndRenderPass2(snapshotTraceBegin, snapshotTraceBytes,
+                                                             &m_pool, commandBuffer,
+                                                             pSubpassEndInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkResetQueryPool:
-            {
+            case OP_vkResetQueryPool: {
                 android::base::beginTrace("vkResetQueryPool decode");
                 VkDevice device;
                 VkQueryPool queryPool;
@@ -9428,30 +10817,35 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkQueryPool*)&queryPool = (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_1));
+                *(VkQueryPool*)&queryPool =
+                    (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_1));
                 memcpy((uint32_t*)&firstQuery, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&queryCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkResetQueryPool 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)queryPool, (unsigned long long)firstQuery, (unsigned long long)queryCount);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkResetQueryPool 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)queryPool,
+                            (unsigned long long)firstQuery, (unsigned long long)queryCount);
                 }
                 vk->vkResetQueryPool(unboxed_device, queryPool, firstQuery, queryCount);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkResetQueryPool(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, queryPool, firstQuery, queryCount);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkResetQueryPool(snapshotTraceBegin, snapshotTraceBytes,
+                                                          &m_pool, device, queryPool, firstQuery,
+                                                          queryCount);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetSemaphoreCounterValue:
-            {
+            case OP_vkGetSemaphoreCounterValue: {
                 android::base::beginTrace("vkGetSemaphoreCounterValue decode");
                 VkDevice device;
                 VkSemaphore semaphore;
@@ -9467,36 +10861,43 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkSemaphore*)&semaphore = (VkSemaphore)unbox_VkSemaphore((VkSemaphore)(*&cgen_var_1));
+                *(VkSemaphore*)&semaphore =
+                    (VkSemaphore)unbox_VkSemaphore((VkSemaphore)(*&cgen_var_1));
                 // Begin manual dispatchable handle unboxing for pValue;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pValue, sizeof(uint64_t));
                 memcpy((uint64_t*)pValue, *readStreamPtrPtr, sizeof(uint64_t));
                 *readStreamPtrPtr += sizeof(uint64_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetSemaphoreCounterValue 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)semaphore, (unsigned long long)pValue);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetSemaphoreCounterValue 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)semaphore,
+                            (unsigned long long)pValue);
                 }
                 VkResult vkGetSemaphoreCounterValue_VkResult_return = (VkResult)0;
-                vkGetSemaphoreCounterValue_VkResult_return = vk->vkGetSemaphoreCounterValue(unboxed_device, semaphore, pValue);
-                if ((vkGetSemaphoreCounterValue_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetSemaphoreCounterValue_VkResult_return =
+                    vk->vkGetSemaphoreCounterValue(unboxed_device, semaphore, pValue);
+                if ((vkGetSemaphoreCounterValue_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write((uint64_t*)pValue, sizeof(uint64_t));
                 vkStream->write(&vkGetSemaphoreCounterValue_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetSemaphoreCounterValue(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetSemaphoreCounterValue_VkResult_return, device, semaphore, pValue);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetSemaphoreCounterValue(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetSemaphoreCounterValue_VkResult_return, device, semaphore, pValue);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkWaitSemaphores:
-            {
+            case OP_vkWaitSemaphores: {
                 android::base::beginTrace("vkWaitSemaphores decode");
                 VkDevice device;
                 const VkSemaphoreWaitInfo* pWaitInfo;
@@ -9510,36 +10911,43 @@
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
                 vkReadStream->alloc((void**)&pWaitInfo, sizeof(const VkSemaphoreWaitInfo));
-                reservedunmarshal_VkSemaphoreWaitInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSemaphoreWaitInfo*)(pWaitInfo), readStreamPtrPtr);
+                reservedunmarshal_VkSemaphoreWaitInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                      (VkSemaphoreWaitInfo*)(pWaitInfo),
+                                                      readStreamPtrPtr);
                 memcpy((uint64_t*)&timeout, *readStreamPtrPtr, sizeof(uint64_t));
                 *readStreamPtrPtr += sizeof(uint64_t);
-                if (pWaitInfo)
-                {
-                    transform_tohost_VkSemaphoreWaitInfo(m_state, (VkSemaphoreWaitInfo*)(pWaitInfo));
+                if (pWaitInfo) {
+                    transform_tohost_VkSemaphoreWaitInfo(m_state,
+                                                         (VkSemaphoreWaitInfo*)(pWaitInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkWaitSemaphores 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pWaitInfo, (unsigned long long)timeout);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkWaitSemaphores 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pWaitInfo,
+                            (unsigned long long)timeout);
                 }
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 VkResult vkWaitSemaphores_VkResult_return = (VkResult)0;
-                vkWaitSemaphores_VkResult_return = vk->vkWaitSemaphores(unboxed_device, pWaitInfo, timeout);
-                if ((vkWaitSemaphores_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkWaitSemaphores_VkResult_return =
+                    vk->vkWaitSemaphores(unboxed_device, pWaitInfo, timeout);
+                if ((vkWaitSemaphores_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkWaitSemaphores_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkWaitSemaphores(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkWaitSemaphores_VkResult_return, device, pWaitInfo, timeout);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkWaitSemaphores(snapshotTraceBegin, snapshotTraceBytes,
+                                                          &m_pool, vkWaitSemaphores_VkResult_return,
+                                                          device, pWaitInfo, timeout);
                 }
                 vkReadStream->clearPool();
                 android::base::endTrace();
                 break;
             }
-            case OP_vkSignalSemaphore:
-            {
+            case OP_vkSignalSemaphore: {
                 android::base::beginTrace("vkSignalSemaphore decode");
                 VkDevice device;
                 const VkSemaphoreSignalInfo* pSignalInfo;
@@ -9552,34 +10960,40 @@
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
                 vkReadStream->alloc((void**)&pSignalInfo, sizeof(const VkSemaphoreSignalInfo));
-                reservedunmarshal_VkSemaphoreSignalInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSemaphoreSignalInfo*)(pSignalInfo), readStreamPtrPtr);
-                if (pSignalInfo)
-                {
-                    transform_tohost_VkSemaphoreSignalInfo(m_state, (VkSemaphoreSignalInfo*)(pSignalInfo));
+                reservedunmarshal_VkSemaphoreSignalInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                        (VkSemaphoreSignalInfo*)(pSignalInfo),
+                                                        readStreamPtrPtr);
+                if (pSignalInfo) {
+                    transform_tohost_VkSemaphoreSignalInfo(m_state,
+                                                           (VkSemaphoreSignalInfo*)(pSignalInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkSignalSemaphore 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pSignalInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkSignalSemaphore 0x%llx 0x%llx \n", ioStream,
+                            (unsigned long long)device, (unsigned long long)pSignalInfo);
                 }
                 VkResult vkSignalSemaphore_VkResult_return = (VkResult)0;
-                vkSignalSemaphore_VkResult_return = vk->vkSignalSemaphore(unboxed_device, pSignalInfo);
-                if ((vkSignalSemaphore_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkSignalSemaphore_VkResult_return =
+                    vk->vkSignalSemaphore(unboxed_device, pSignalInfo);
+                if ((vkSignalSemaphore_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkSignalSemaphore_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkSignalSemaphore(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkSignalSemaphore_VkResult_return, device, pSignalInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkSignalSemaphore(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkSignalSemaphore_VkResult_return, device, pSignalInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetBufferDeviceAddress:
-            {
+            case OP_vkGetBufferDeviceAddress: {
                 android::base::beginTrace("vkGetBufferDeviceAddress decode");
                 VkDevice device;
                 const VkBufferDeviceAddressInfo* pInfo;
@@ -9592,33 +11006,40 @@
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
                 vkReadStream->alloc((void**)&pInfo, sizeof(const VkBufferDeviceAddressInfo));
-                reservedunmarshal_VkBufferDeviceAddressInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferDeviceAddressInfo*)(pInfo), readStreamPtrPtr);
-                if (pInfo)
-                {
-                    transform_tohost_VkBufferDeviceAddressInfo(m_state, (VkBufferDeviceAddressInfo*)(pInfo));
+                reservedunmarshal_VkBufferDeviceAddressInfo(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferDeviceAddressInfo*)(pInfo),
+                    readStreamPtrPtr);
+                if (pInfo) {
+                    transform_tohost_VkBufferDeviceAddressInfo(m_state,
+                                                               (VkBufferDeviceAddressInfo*)(pInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetBufferDeviceAddress 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkGetBufferDeviceAddress 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pInfo);
                 }
-                VkDeviceAddress vkGetBufferDeviceAddress_VkDeviceAddress_return = (VkDeviceAddress)0;
-                vkGetBufferDeviceAddress_VkDeviceAddress_return = vk->vkGetBufferDeviceAddress(unboxed_device, pInfo);
+                VkDeviceAddress vkGetBufferDeviceAddress_VkDeviceAddress_return =
+                    (VkDeviceAddress)0;
+                vkGetBufferDeviceAddress_VkDeviceAddress_return =
+                    vk->vkGetBufferDeviceAddress(unboxed_device, pInfo);
                 vkStream->unsetHandleMapping();
-                vkStream->write(&vkGetBufferDeviceAddress_VkDeviceAddress_return, sizeof(VkDeviceAddress));
+                vkStream->write(&vkGetBufferDeviceAddress_VkDeviceAddress_return,
+                                sizeof(VkDeviceAddress));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetBufferDeviceAddress(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetBufferDeviceAddress_VkDeviceAddress_return, device, pInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetBufferDeviceAddress(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetBufferDeviceAddress_VkDeviceAddress_return, device, pInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetBufferOpaqueCaptureAddress:
-            {
+            case OP_vkGetBufferOpaqueCaptureAddress: {
                 android::base::beginTrace("vkGetBufferOpaqueCaptureAddress decode");
                 VkDevice device;
                 const VkBufferDeviceAddressInfo* pInfo;
@@ -9631,33 +11052,39 @@
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
                 vkReadStream->alloc((void**)&pInfo, sizeof(const VkBufferDeviceAddressInfo));
-                reservedunmarshal_VkBufferDeviceAddressInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferDeviceAddressInfo*)(pInfo), readStreamPtrPtr);
-                if (pInfo)
-                {
-                    transform_tohost_VkBufferDeviceAddressInfo(m_state, (VkBufferDeviceAddressInfo*)(pInfo));
+                reservedunmarshal_VkBufferDeviceAddressInfo(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferDeviceAddressInfo*)(pInfo),
+                    readStreamPtrPtr);
+                if (pInfo) {
+                    transform_tohost_VkBufferDeviceAddressInfo(m_state,
+                                                               (VkBufferDeviceAddressInfo*)(pInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetBufferOpaqueCaptureAddress 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pInfo);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetBufferOpaqueCaptureAddress 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pInfo);
                 }
                 uint64_t vkGetBufferOpaqueCaptureAddress_uint64_t_return = (uint64_t)0;
-                vkGetBufferOpaqueCaptureAddress_uint64_t_return = vk->vkGetBufferOpaqueCaptureAddress(unboxed_device, pInfo);
+                vkGetBufferOpaqueCaptureAddress_uint64_t_return =
+                    vk->vkGetBufferOpaqueCaptureAddress(unboxed_device, pInfo);
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkGetBufferOpaqueCaptureAddress_uint64_t_return, sizeof(uint64_t));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetBufferOpaqueCaptureAddress(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetBufferOpaqueCaptureAddress_uint64_t_return, device, pInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetBufferOpaqueCaptureAddress(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetBufferOpaqueCaptureAddress_uint64_t_return, device, pInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetDeviceMemoryOpaqueCaptureAddress:
-            {
+            case OP_vkGetDeviceMemoryOpaqueCaptureAddress: {
                 android::base::beginTrace("vkGetDeviceMemoryOpaqueCaptureAddress decode");
                 VkDevice device;
                 const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo;
@@ -9669,36 +11096,45 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pInfo, sizeof(const VkDeviceMemoryOpaqueCaptureAddressInfo));
-                reservedunmarshal_VkDeviceMemoryOpaqueCaptureAddressInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDeviceMemoryOpaqueCaptureAddressInfo*)(pInfo), readStreamPtrPtr);
-                if (pInfo)
-                {
-                    transform_tohost_VkDeviceMemoryOpaqueCaptureAddressInfo(m_state, (VkDeviceMemoryOpaqueCaptureAddressInfo*)(pInfo));
+                vkReadStream->alloc((void**)&pInfo,
+                                    sizeof(const VkDeviceMemoryOpaqueCaptureAddressInfo));
+                reservedunmarshal_VkDeviceMemoryOpaqueCaptureAddressInfo(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkDeviceMemoryOpaqueCaptureAddressInfo*)(pInfo), readStreamPtrPtr);
+                if (pInfo) {
+                    transform_tohost_VkDeviceMemoryOpaqueCaptureAddressInfo(
+                        m_state, (VkDeviceMemoryOpaqueCaptureAddressInfo*)(pInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetDeviceMemoryOpaqueCaptureAddress 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pInfo);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkGetDeviceMemoryOpaqueCaptureAddress 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device, (unsigned long long)pInfo);
                 }
                 uint64_t vkGetDeviceMemoryOpaqueCaptureAddress_uint64_t_return = (uint64_t)0;
-                vkGetDeviceMemoryOpaqueCaptureAddress_uint64_t_return = vk->vkGetDeviceMemoryOpaqueCaptureAddress(unboxed_device, pInfo);
+                vkGetDeviceMemoryOpaqueCaptureAddress_uint64_t_return =
+                    vk->vkGetDeviceMemoryOpaqueCaptureAddress(unboxed_device, pInfo);
                 vkStream->unsetHandleMapping();
-                vkStream->write(&vkGetDeviceMemoryOpaqueCaptureAddress_uint64_t_return, sizeof(uint64_t));
+                vkStream->write(&vkGetDeviceMemoryOpaqueCaptureAddress_uint64_t_return,
+                                sizeof(uint64_t));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetDeviceMemoryOpaqueCaptureAddress(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetDeviceMemoryOpaqueCaptureAddress_uint64_t_return, device, pInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetDeviceMemoryOpaqueCaptureAddress(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetDeviceMemoryOpaqueCaptureAddress_uint64_t_return, device, pInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_KHR_surface
-            case OP_vkDestroySurfaceKHR:
-            {
+            case OP_vkDestroySurfaceKHR: {
                 android::base::beginTrace("vkDestroySurfaceKHR decode");
                 VkInstance instance;
                 VkSurfaceKHR surface;
@@ -9716,42 +11152,47 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkSurfaceKHR*)&surface = (VkSurfaceKHR)(VkSurfaceKHR)((VkSurfaceKHR)(*&cgen_var_1));
+                *(VkSurfaceKHR*)&surface =
+                    (VkSurfaceKHR)(VkSurfaceKHR)((VkSurfaceKHR)(*&cgen_var_1));
                 boxed_surface_preserve = surface;
                 surface = unbox_VkSurfaceKHR(surface);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroySurfaceKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)instance, (unsigned long long)surface, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkDestroySurfaceKHR 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)instance, (unsigned long long)surface,
+                            (unsigned long long)pAllocator);
                 }
                 vk->vkDestroySurfaceKHR(unboxed_instance, surface, pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroySurfaceKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, instance, boxed_surface_preserve, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroySurfaceKHR(snapshotTraceBegin, snapshotTraceBytes,
+                                                             &m_pool, instance,
+                                                             boxed_surface_preserve, pAllocator);
                 }
                 delete_VkSurfaceKHR(boxed_surface_preserve);
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceSurfaceSupportKHR:
-            {
+            case OP_vkGetPhysicalDeviceSurfaceSupportKHR: {
                 android::base::beginTrace("vkGetPhysicalDeviceSurfaceSupportKHR decode");
                 VkPhysicalDevice physicalDevice;
                 uint32_t queueFamilyIndex;
@@ -9761,7 +11202,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
@@ -9770,36 +11212,48 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkSurfaceKHR*)&surface = (VkSurfaceKHR)unbox_VkSurfaceKHR((VkSurfaceKHR)(*&cgen_var_1));
+                *(VkSurfaceKHR*)&surface =
+                    (VkSurfaceKHR)unbox_VkSurfaceKHR((VkSurfaceKHR)(*&cgen_var_1));
                 // Begin manual dispatchable handle unboxing for pSupported;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pSupported, sizeof(VkBool32));
                 memcpy((VkBool32*)pSupported, *readStreamPtrPtr, sizeof(VkBool32));
                 *readStreamPtrPtr += sizeof(VkBool32);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceSurfaceSupportKHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)queueFamilyIndex, (unsigned long long)surface, (unsigned long long)pSupported);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceSurfaceSupportKHR 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)queueFamilyIndex, (unsigned long long)surface,
+                            (unsigned long long)pSupported);
                 }
                 VkResult vkGetPhysicalDeviceSurfaceSupportKHR_VkResult_return = (VkResult)0;
-                vkGetPhysicalDeviceSurfaceSupportKHR_VkResult_return = vk->vkGetPhysicalDeviceSurfaceSupportKHR(unboxed_physicalDevice, queueFamilyIndex, surface, pSupported);
-                if ((vkGetPhysicalDeviceSurfaceSupportKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetPhysicalDeviceSurfaceSupportKHR_VkResult_return =
+                    vk->vkGetPhysicalDeviceSurfaceSupportKHR(unboxed_physicalDevice,
+                                                             queueFamilyIndex, surface, pSupported);
+                if ((vkGetPhysicalDeviceSurfaceSupportKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write((VkBool32*)pSupported, sizeof(VkBool32));
-                vkStream->write(&vkGetPhysicalDeviceSurfaceSupportKHR_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkGetPhysicalDeviceSurfaceSupportKHR_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceSurfaceSupportKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetPhysicalDeviceSurfaceSupportKHR_VkResult_return, physicalDevice, queueFamilyIndex, surface, pSupported);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceSurfaceSupportKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetPhysicalDeviceSurfaceSupportKHR_VkResult_return, physicalDevice,
+                        queueFamilyIndex, surface, pSupported);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceSurfaceCapabilitiesKHR:
-            {
+            case OP_vkGetPhysicalDeviceSurfaceCapabilitiesKHR: {
                 android::base::beginTrace("vkGetPhysicalDeviceSurfaceCapabilitiesKHR decode");
                 VkPhysicalDevice physicalDevice;
                 VkSurfaceKHR surface;
@@ -9808,50 +11262,67 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkSurfaceKHR*)&surface = (VkSurfaceKHR)unbox_VkSurfaceKHR((VkSurfaceKHR)(*&cgen_var_1));
+                *(VkSurfaceKHR*)&surface =
+                    (VkSurfaceKHR)unbox_VkSurfaceKHR((VkSurfaceKHR)(*&cgen_var_1));
                 // Begin manual dispatchable handle unboxing for pSurfaceCapabilities;
                 vkReadStream->unsetHandleMapping();
-                vkReadStream->alloc((void**)&pSurfaceCapabilities, sizeof(VkSurfaceCapabilitiesKHR));
-                reservedunmarshal_VkSurfaceCapabilitiesKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSurfaceCapabilitiesKHR*)(pSurfaceCapabilities), readStreamPtrPtr);
-                if (pSurfaceCapabilities)
-                {
-                    transform_tohost_VkSurfaceCapabilitiesKHR(m_state, (VkSurfaceCapabilitiesKHR*)(pSurfaceCapabilities));
+                vkReadStream->alloc((void**)&pSurfaceCapabilities,
+                                    sizeof(VkSurfaceCapabilitiesKHR));
+                reservedunmarshal_VkSurfaceCapabilitiesKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkSurfaceCapabilitiesKHR*)(pSurfaceCapabilities), readStreamPtrPtr);
+                if (pSurfaceCapabilities) {
+                    transform_tohost_VkSurfaceCapabilitiesKHR(
+                        m_state, (VkSurfaceCapabilitiesKHR*)(pSurfaceCapabilities));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceSurfaceCapabilitiesKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)surface, (unsigned long long)pSurfaceCapabilities);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceSurfaceCapabilitiesKHR 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)surface, (unsigned long long)pSurfaceCapabilities);
                 }
                 VkResult vkGetPhysicalDeviceSurfaceCapabilitiesKHR_VkResult_return = (VkResult)0;
-                vkGetPhysicalDeviceSurfaceCapabilitiesKHR_VkResult_return = vk->vkGetPhysicalDeviceSurfaceCapabilitiesKHR(unboxed_physicalDevice, surface, pSurfaceCapabilities);
-                if ((vkGetPhysicalDeviceSurfaceCapabilitiesKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetPhysicalDeviceSurfaceCapabilitiesKHR_VkResult_return =
+                    vk->vkGetPhysicalDeviceSurfaceCapabilitiesKHR(unboxed_physicalDevice, surface,
+                                                                  pSurfaceCapabilities);
+                if ((vkGetPhysicalDeviceSurfaceCapabilitiesKHR_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                if (pSurfaceCapabilities)
-                {
-                    transform_fromhost_VkSurfaceCapabilitiesKHR(m_state, (VkSurfaceCapabilitiesKHR*)(pSurfaceCapabilities));
+                if (pSurfaceCapabilities) {
+                    transform_fromhost_VkSurfaceCapabilitiesKHR(
+                        m_state, (VkSurfaceCapabilitiesKHR*)(pSurfaceCapabilities));
                 }
-                marshal_VkSurfaceCapabilitiesKHR(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSurfaceCapabilitiesKHR*)(pSurfaceCapabilities));
-                vkStream->write(&vkGetPhysicalDeviceSurfaceCapabilitiesKHR_VkResult_return, sizeof(VkResult));
+                marshal_VkSurfaceCapabilitiesKHR(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                 (VkSurfaceCapabilitiesKHR*)(pSurfaceCapabilities));
+                vkStream->write(&vkGetPhysicalDeviceSurfaceCapabilitiesKHR_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceSurfaceCapabilitiesKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetPhysicalDeviceSurfaceCapabilitiesKHR_VkResult_return, physicalDevice, surface, pSurfaceCapabilities);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceSurfaceCapabilitiesKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetPhysicalDeviceSurfaceCapabilitiesKHR_VkResult_return, physicalDevice,
+                        surface, pSurfaceCapabilities);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceSurfaceFormatsKHR:
-            {
+            case OP_vkGetPhysicalDeviceSurfaceFormatsKHR: {
                 android::base::beginTrace("vkGetPhysicalDeviceSurfaceFormatsKHR decode");
                 VkPhysicalDevice physicalDevice;
                 VkSurfaceKHR surface;
@@ -9861,22 +11332,23 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkSurfaceKHR*)&surface = (VkSurfaceKHR)unbox_VkSurfaceKHR((VkSurfaceKHR)(*&cgen_var_1));
+                *(VkSurfaceKHR*)&surface =
+                    (VkSurfaceKHR)unbox_VkSurfaceKHR((VkSurfaceKHR)(*&cgen_var_1));
                 // Begin manual dispatchable handle unboxing for pSurfaceFormatCount;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 memcpy((uint32_t**)&pSurfaceFormatCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pSurfaceFormatCount);
                 *readStreamPtrPtr += 8;
-                if (pSurfaceFormatCount)
-                {
+                if (pSurfaceFormatCount) {
                     vkReadStream->alloc((void**)&pSurfaceFormatCount, sizeof(uint32_t));
                     memcpy((uint32_t*)pSurfaceFormatCount, *readStreamPtrPtr, sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
@@ -9887,77 +11359,82 @@
                 memcpy((VkSurfaceFormatKHR**)&pSurfaceFormats, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pSurfaceFormats);
                 *readStreamPtrPtr += 8;
-                if (pSurfaceFormats)
-                {
-                    vkReadStream->alloc((void**)&pSurfaceFormats, (*(pSurfaceFormatCount)) * sizeof(VkSurfaceFormatKHR));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pSurfaceFormatCount)); ++i)
-                    {
-                        reservedunmarshal_VkSurfaceFormatKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSurfaceFormatKHR*)(pSurfaceFormats + i), readStreamPtrPtr);
+                if (pSurfaceFormats) {
+                    vkReadStream->alloc((void**)&pSurfaceFormats,
+                                        (*(pSurfaceFormatCount)) * sizeof(VkSurfaceFormatKHR));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pSurfaceFormatCount)); ++i) {
+                        reservedunmarshal_VkSurfaceFormatKHR(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkSurfaceFormatKHR*)(pSurfaceFormats + i), readStreamPtrPtr);
                     }
                 }
-                if (pSurfaceFormatCount)
-                {
-                    if (pSurfaceFormats)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pSurfaceFormatCount)); ++i)
-                        {
-                            transform_tohost_VkSurfaceFormatKHR(m_state, (VkSurfaceFormatKHR*)(pSurfaceFormats + i));
+                if (pSurfaceFormatCount) {
+                    if (pSurfaceFormats) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pSurfaceFormatCount)); ++i) {
+                            transform_tohost_VkSurfaceFormatKHR(
+                                m_state, (VkSurfaceFormatKHR*)(pSurfaceFormats + i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceSurfaceFormatsKHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)surface, (unsigned long long)pSurfaceFormatCount, (unsigned long long)pSurfaceFormats);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceSurfaceFormatsKHR 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)surface, (unsigned long long)pSurfaceFormatCount,
+                            (unsigned long long)pSurfaceFormats);
                 }
                 VkResult vkGetPhysicalDeviceSurfaceFormatsKHR_VkResult_return = (VkResult)0;
-                vkGetPhysicalDeviceSurfaceFormatsKHR_VkResult_return = vk->vkGetPhysicalDeviceSurfaceFormatsKHR(unboxed_physicalDevice, surface, pSurfaceFormatCount, pSurfaceFormats);
-                if ((vkGetPhysicalDeviceSurfaceFormatsKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetPhysicalDeviceSurfaceFormatsKHR_VkResult_return =
+                    vk->vkGetPhysicalDeviceSurfaceFormatsKHR(unboxed_physicalDevice, surface,
+                                                             pSurfaceFormatCount, pSurfaceFormats);
+                if ((vkGetPhysicalDeviceSurfaceFormatsKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pSurfaceFormatCount;
                 vkStream->putBe64(cgen_var_4);
-                if (pSurfaceFormatCount)
-                {
+                if (pSurfaceFormatCount) {
                     vkStream->write((uint32_t*)pSurfaceFormatCount, sizeof(uint32_t));
                 }
-                if (pSurfaceFormatCount)
-                {
-                    if (pSurfaceFormats)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pSurfaceFormatCount)); ++i)
-                        {
-                            transform_fromhost_VkSurfaceFormatKHR(m_state, (VkSurfaceFormatKHR*)(pSurfaceFormats + i));
+                if (pSurfaceFormatCount) {
+                    if (pSurfaceFormats) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pSurfaceFormatCount)); ++i) {
+                            transform_fromhost_VkSurfaceFormatKHR(
+                                m_state, (VkSurfaceFormatKHR*)(pSurfaceFormats + i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_5 = (uint64_t)(uintptr_t)pSurfaceFormats;
                 vkStream->putBe64(cgen_var_5);
-                if (pSurfaceFormats)
-                {
-                    if (pSurfaceFormatCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pSurfaceFormatCount)); ++i)
-                        {
-                            marshal_VkSurfaceFormatKHR(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSurfaceFormatKHR*)(pSurfaceFormats + i));
+                if (pSurfaceFormats) {
+                    if (pSurfaceFormatCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pSurfaceFormatCount)); ++i) {
+                            marshal_VkSurfaceFormatKHR(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                       (VkSurfaceFormatKHR*)(pSurfaceFormats + i));
                         }
                     }
                 }
-                vkStream->write(&vkGetPhysicalDeviceSurfaceFormatsKHR_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkGetPhysicalDeviceSurfaceFormatsKHR_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceSurfaceFormatsKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetPhysicalDeviceSurfaceFormatsKHR_VkResult_return, physicalDevice, surface, pSurfaceFormatCount, pSurfaceFormats);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceSurfaceFormatsKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetPhysicalDeviceSurfaceFormatsKHR_VkResult_return, physicalDevice,
+                        surface, pSurfaceFormatCount, pSurfaceFormats);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceSurfacePresentModesKHR:
-            {
+            case OP_vkGetPhysicalDeviceSurfacePresentModesKHR: {
                 android::base::beginTrace("vkGetPhysicalDeviceSurfacePresentModesKHR decode");
                 VkPhysicalDevice physicalDevice;
                 VkSurfaceKHR surface;
@@ -9967,22 +11444,23 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkSurfaceKHR*)&surface = (VkSurfaceKHR)unbox_VkSurfaceKHR((VkSurfaceKHR)(*&cgen_var_1));
+                *(VkSurfaceKHR*)&surface =
+                    (VkSurfaceKHR)unbox_VkSurfaceKHR((VkSurfaceKHR)(*&cgen_var_1));
                 // Begin manual dispatchable handle unboxing for pPresentModeCount;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 memcpy((uint32_t**)&pPresentModeCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pPresentModeCount);
                 *readStreamPtrPtr += 8;
-                if (pPresentModeCount)
-                {
+                if (pPresentModeCount) {
                     vkReadStream->alloc((void**)&pPresentModeCount, sizeof(uint32_t));
                     memcpy((uint32_t*)pPresentModeCount, *readStreamPtrPtr, sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
@@ -9993,51 +11471,63 @@
                 memcpy((VkPresentModeKHR**)&pPresentModes, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pPresentModes);
                 *readStreamPtrPtr += 8;
-                if (pPresentModes)
-                {
-                    vkReadStream->alloc((void**)&pPresentModes, (*(pPresentModeCount)) * sizeof(VkPresentModeKHR));
-                    memcpy((VkPresentModeKHR*)pPresentModes, *readStreamPtrPtr, (*(pPresentModeCount)) * sizeof(VkPresentModeKHR));
+                if (pPresentModes) {
+                    vkReadStream->alloc((void**)&pPresentModes,
+                                        (*(pPresentModeCount)) * sizeof(VkPresentModeKHR));
+                    memcpy((VkPresentModeKHR*)pPresentModes, *readStreamPtrPtr,
+                           (*(pPresentModeCount)) * sizeof(VkPresentModeKHR));
                     *readStreamPtrPtr += (*(pPresentModeCount)) * sizeof(VkPresentModeKHR);
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceSurfacePresentModesKHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)surface, (unsigned long long)pPresentModeCount, (unsigned long long)pPresentModes);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceSurfacePresentModesKHR 0x%llx "
+                            "0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)surface, (unsigned long long)pPresentModeCount,
+                            (unsigned long long)pPresentModes);
                 }
                 VkResult vkGetPhysicalDeviceSurfacePresentModesKHR_VkResult_return = (VkResult)0;
-                vkGetPhysicalDeviceSurfacePresentModesKHR_VkResult_return = vk->vkGetPhysicalDeviceSurfacePresentModesKHR(unboxed_physicalDevice, surface, pPresentModeCount, pPresentModes);
-                if ((vkGetPhysicalDeviceSurfacePresentModesKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetPhysicalDeviceSurfacePresentModesKHR_VkResult_return =
+                    vk->vkGetPhysicalDeviceSurfacePresentModesKHR(unboxed_physicalDevice, surface,
+                                                                  pPresentModeCount, pPresentModes);
+                if ((vkGetPhysicalDeviceSurfacePresentModesKHR_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pPresentModeCount;
                 vkStream->putBe64(cgen_var_4);
-                if (pPresentModeCount)
-                {
+                if (pPresentModeCount) {
                     vkStream->write((uint32_t*)pPresentModeCount, sizeof(uint32_t));
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_5 = (uint64_t)(uintptr_t)pPresentModes;
                 vkStream->putBe64(cgen_var_5);
-                if (pPresentModes)
-                {
-                    vkStream->write((VkPresentModeKHR*)pPresentModes, (*(pPresentModeCount)) * sizeof(VkPresentModeKHR));
+                if (pPresentModes) {
+                    vkStream->write((VkPresentModeKHR*)pPresentModes,
+                                    (*(pPresentModeCount)) * sizeof(VkPresentModeKHR));
                 }
-                vkStream->write(&vkGetPhysicalDeviceSurfacePresentModesKHR_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkGetPhysicalDeviceSurfacePresentModesKHR_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceSurfacePresentModesKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetPhysicalDeviceSurfacePresentModesKHR_VkResult_return, physicalDevice, surface, pPresentModeCount, pPresentModes);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceSurfacePresentModesKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetPhysicalDeviceSurfacePresentModesKHR_VkResult_return, physicalDevice,
+                        surface, pPresentModeCount, pPresentModes);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_KHR_swapchain
-            case OP_vkCreateSwapchainKHR:
-            {
+            case OP_vkCreateSwapchainKHR: {
                 android::base::beginTrace("vkCreateSwapchainKHR decode");
                 VkDevice device;
                 const VkSwapchainCreateInfoKHR* pCreateInfo;
@@ -10052,15 +11542,18 @@
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkSwapchainCreateInfoKHR));
-                reservedunmarshal_VkSwapchainCreateInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSwapchainCreateInfoKHR*)(pCreateInfo), readStreamPtrPtr);
+                reservedunmarshal_VkSwapchainCreateInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                           (VkSwapchainCreateInfoKHR*)(pCreateInfo),
+                                                           readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pSwapchain;
                 vkReadStream->unsetHandleMapping();
@@ -10068,46 +11561,57 @@
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkSwapchainKHR*)pSwapchain = (VkSwapchainKHR)(VkSwapchainKHR)((VkSwapchainKHR)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkSwapchainCreateInfoKHR(m_state, (VkSwapchainCreateInfoKHR*)(pCreateInfo));
+                *(VkSwapchainKHR*)pSwapchain =
+                    (VkSwapchainKHR)(VkSwapchainKHR)((VkSwapchainKHR)(*&cgen_var_2));
+                if (pCreateInfo) {
+                    transform_tohost_VkSwapchainCreateInfoKHR(
+                        m_state, (VkSwapchainCreateInfoKHR*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateSwapchainKHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pSwapchain);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateSwapchainKHR 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pSwapchain);
                 }
                 VkResult vkCreateSwapchainKHR_VkResult_return = (VkResult)0;
-                vkCreateSwapchainKHR_VkResult_return = vk->vkCreateSwapchainKHR(unboxed_device, pCreateInfo, pAllocator, pSwapchain);
-                if ((vkCreateSwapchainKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateSwapchainKHR_VkResult_return =
+                    vk->vkCreateSwapchainKHR(unboxed_device, pCreateInfo, pAllocator, pSwapchain);
+                if ((vkCreateSwapchainKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // Begin auto non dispatchable handle create for pSwapchain;
-                if (vkCreateSwapchainKHR_VkResult_return == VK_SUCCESS) vkStream->setHandleMapping(&m_boxedHandleCreateMapping);
+                if (vkCreateSwapchainKHR_VkResult_return == VK_SUCCESS)
+                    vkStream->setHandleMapping(&m_boxedHandleCreateMapping);
                 uint64_t cgen_var_3;
-                static_assert(8 == sizeof(VkSwapchainKHR), "handle map overwrite requires VkSwapchainKHR to be 8 bytes long");
-                vkStream->handleMapping()->mapHandles_VkSwapchainKHR((VkSwapchainKHR*)pSwapchain, 1);
+                static_assert(8 == sizeof(VkSwapchainKHR),
+                              "handle map overwrite requires VkSwapchainKHR to be 8 bytes long");
+                vkStream->handleMapping()->mapHandles_VkSwapchainKHR((VkSwapchainKHR*)pSwapchain,
+                                                                     1);
                 vkStream->write((VkSwapchainKHR*)pSwapchain, 8 * 1);
                 // Begin auto non dispatchable handle create for pSwapchain;
                 vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
                 vkStream->write(&vkCreateSwapchainKHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateSwapchainKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateSwapchainKHR_VkResult_return, device, pCreateInfo, pAllocator, pSwapchain);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateSwapchainKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateSwapchainKHR_VkResult_return, device, pCreateInfo, pAllocator,
+                        pSwapchain);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroySwapchainKHR:
-            {
+            case OP_vkDestroySwapchainKHR: {
                 android::base::beginTrace("vkDestroySwapchainKHR decode");
                 VkDevice device;
                 VkSwapchainKHR swapchain;
@@ -10125,42 +11629,47 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkSwapchainKHR*)&swapchain = (VkSwapchainKHR)(VkSwapchainKHR)((VkSwapchainKHR)(*&cgen_var_1));
+                *(VkSwapchainKHR*)&swapchain =
+                    (VkSwapchainKHR)(VkSwapchainKHR)((VkSwapchainKHR)(*&cgen_var_1));
                 boxed_swapchain_preserve = swapchain;
                 swapchain = unbox_VkSwapchainKHR(swapchain);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroySwapchainKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)swapchain, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkDestroySwapchainKHR 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)swapchain,
+                            (unsigned long long)pAllocator);
                 }
                 vk->vkDestroySwapchainKHR(unboxed_device, swapchain, pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroySwapchainKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, boxed_swapchain_preserve, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroySwapchainKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device,
+                        boxed_swapchain_preserve, pAllocator);
                 }
                 delete_VkSwapchainKHR(boxed_swapchain_preserve);
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetSwapchainImagesKHR:
-            {
+            case OP_vkGetSwapchainImagesKHR: {
                 android::base::beginTrace("vkGetSwapchainImagesKHR decode");
                 VkDevice device;
                 VkSwapchainKHR swapchain;
@@ -10177,15 +11686,15 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkSwapchainKHR*)&swapchain = (VkSwapchainKHR)unbox_VkSwapchainKHR((VkSwapchainKHR)(*&cgen_var_1));
+                *(VkSwapchainKHR*)&swapchain =
+                    (VkSwapchainKHR)unbox_VkSwapchainKHR((VkSwapchainKHR)(*&cgen_var_1));
                 // Begin manual dispatchable handle unboxing for pSwapchainImageCount;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 memcpy((uint32_t**)&pSwapchainImageCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pSwapchainImageCount);
                 *readStreamPtrPtr += 8;
-                if (pSwapchainImageCount)
-                {
+                if (pSwapchainImageCount) {
                     vkReadStream->alloc((void**)&pSwapchainImageCount, sizeof(uint32_t));
                     memcpy((uint32_t*)pSwapchainImageCount, *readStreamPtrPtr, sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
@@ -10196,66 +11705,72 @@
                 memcpy((VkImage**)&pSwapchainImages, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pSwapchainImages);
                 *readStreamPtrPtr += 8;
-                if (pSwapchainImages)
-                {
-                    vkReadStream->alloc((void**)&pSwapchainImages, (*(pSwapchainImageCount)) * sizeof(VkImage));
-                    if ((*(pSwapchainImageCount)))
-                    {
+                if (pSwapchainImages) {
+                    vkReadStream->alloc((void**)&pSwapchainImages,
+                                        (*(pSwapchainImageCount)) * sizeof(VkImage));
+                    if ((*(pSwapchainImageCount))) {
                         uint8_t* cgen_var_3_0_ptr = (uint8_t*)(*readStreamPtrPtr);
                         *readStreamPtrPtr += 8 * (*(pSwapchainImageCount));
-                        if (pSwapchainImageCount)
-                        {
-                            for (uint32_t k = 0; k < (*(pSwapchainImageCount)); ++k)
-                            {
-                                uint64_t tmpval; memcpy(&tmpval, cgen_var_3_0_ptr + k * 8, sizeof(uint64_t));
-                                *(((VkImage*)pSwapchainImages) + k) = (VkImage)(VkImage)((VkImage)tmpval);
+                        if (pSwapchainImageCount) {
+                            for (uint32_t k = 0; k < (*(pSwapchainImageCount)); ++k) {
+                                uint64_t tmpval;
+                                memcpy(&tmpval, cgen_var_3_0_ptr + k * 8, sizeof(uint64_t));
+                                *(((VkImage*)pSwapchainImages) + k) =
+                                    (VkImage)(VkImage)((VkImage)tmpval);
                             }
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetSwapchainImagesKHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)swapchain, (unsigned long long)pSwapchainImageCount, (unsigned long long)pSwapchainImages);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkGetSwapchainImagesKHR 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device, (unsigned long long)swapchain,
+                        (unsigned long long)pSwapchainImageCount,
+                        (unsigned long long)pSwapchainImages);
                 }
                 VkResult vkGetSwapchainImagesKHR_VkResult_return = (VkResult)0;
-                vkGetSwapchainImagesKHR_VkResult_return = vk->vkGetSwapchainImagesKHR(unboxed_device, swapchain, pSwapchainImageCount, pSwapchainImages);
-                if ((vkGetSwapchainImagesKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetSwapchainImagesKHR_VkResult_return = vk->vkGetSwapchainImagesKHR(
+                    unboxed_device, swapchain, pSwapchainImageCount, pSwapchainImages);
+                if ((vkGetSwapchainImagesKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pSwapchainImageCount;
                 vkStream->putBe64(cgen_var_4);
-                if (pSwapchainImageCount)
-                {
+                if (pSwapchainImageCount) {
                     vkStream->write((uint32_t*)pSwapchainImageCount, sizeof(uint32_t));
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_5 = (uint64_t)(uintptr_t)pSwapchainImages;
                 vkStream->putBe64(cgen_var_5);
-                if (pSwapchainImages)
-                {
-                    if ((*(pSwapchainImageCount)))
-                    {
+                if (pSwapchainImages) {
+                    if ((*(pSwapchainImageCount))) {
                         uint64_t* cgen_var_5_0;
                         vkStream->alloc((void**)&cgen_var_5_0, (*(pSwapchainImageCount)) * 8);
-                        vkStream->handleMapping()->mapHandles_VkImage_u64(pSwapchainImages, cgen_var_5_0, (*(pSwapchainImageCount)));
+                        vkStream->handleMapping()->mapHandles_VkImage_u64(
+                            pSwapchainImages, cgen_var_5_0, (*(pSwapchainImageCount)));
                         vkStream->write((uint64_t*)cgen_var_5_0, (*(pSwapchainImageCount)) * 8);
                     }
                 }
                 vkStream->write(&vkGetSwapchainImagesKHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetSwapchainImagesKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetSwapchainImagesKHR_VkResult_return, device, swapchain, pSwapchainImageCount, pSwapchainImages);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetSwapchainImagesKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetSwapchainImagesKHR_VkResult_return, device, swapchain,
+                        pSwapchainImageCount, pSwapchainImages);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkAcquireNextImageKHR:
-            {
+            case OP_vkAcquireNextImageKHR: {
                 android::base::beginTrace("vkAcquireNextImageKHR decode");
                 VkDevice device;
                 VkSwapchainKHR swapchain;
@@ -10274,13 +11789,15 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkSwapchainKHR*)&swapchain = (VkSwapchainKHR)unbox_VkSwapchainKHR((VkSwapchainKHR)(*&cgen_var_1));
+                *(VkSwapchainKHR*)&swapchain =
+                    (VkSwapchainKHR)unbox_VkSwapchainKHR((VkSwapchainKHR)(*&cgen_var_1));
                 memcpy((uint64_t*)&timeout, *readStreamPtrPtr, sizeof(uint64_t));
                 *readStreamPtrPtr += sizeof(uint64_t);
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkSemaphore*)&semaphore = (VkSemaphore)unbox_VkSemaphore((VkSemaphore)(*&cgen_var_2));
+                *(VkSemaphore*)&semaphore =
+                    (VkSemaphore)unbox_VkSemaphore((VkSemaphore)(*&cgen_var_2));
                 uint64_t cgen_var_3;
                 memcpy((uint64_t*)&cgen_var_3, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
@@ -10290,30 +11807,39 @@
                 vkReadStream->alloc((void**)&pImageIndex, sizeof(uint32_t));
                 memcpy((uint32_t*)pImageIndex, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkAcquireNextImageKHR 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)swapchain, (unsigned long long)timeout, (unsigned long long)semaphore, (unsigned long long)fence, (unsigned long long)pImageIndex);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkAcquireNextImageKHR 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)swapchain,
+                            (unsigned long long)timeout, (unsigned long long)semaphore,
+                            (unsigned long long)fence, (unsigned long long)pImageIndex);
                 }
                 VkResult vkAcquireNextImageKHR_VkResult_return = (VkResult)0;
-                vkAcquireNextImageKHR_VkResult_return = vk->vkAcquireNextImageKHR(unboxed_device, swapchain, timeout, semaphore, fence, pImageIndex);
-                if ((vkAcquireNextImageKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkAcquireNextImageKHR_VkResult_return = vk->vkAcquireNextImageKHR(
+                    unboxed_device, swapchain, timeout, semaphore, fence, pImageIndex);
+                if ((vkAcquireNextImageKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write((uint32_t*)pImageIndex, sizeof(uint32_t));
                 vkStream->write(&vkAcquireNextImageKHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkAcquireNextImageKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkAcquireNextImageKHR_VkResult_return, device, swapchain, timeout, semaphore, fence, pImageIndex);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkAcquireNextImageKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkAcquireNextImageKHR_VkResult_return, device, swapchain, timeout,
+                        semaphore, fence, pImageIndex);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkQueuePresentKHR:
-            {
+            case OP_vkQueuePresentKHR: {
                 android::base::beginTrace("vkQueuePresentKHR decode");
                 VkQueue queue;
                 const VkPresentInfoKHR* pPresentInfo;
@@ -10326,34 +11852,39 @@
                 auto vk = dispatch_VkQueue(queue);
                 // End manual dispatchable handle unboxing for queue;
                 vkReadStream->alloc((void**)&pPresentInfo, sizeof(const VkPresentInfoKHR));
-                reservedunmarshal_VkPresentInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPresentInfoKHR*)(pPresentInfo), readStreamPtrPtr);
-                if (pPresentInfo)
-                {
+                reservedunmarshal_VkPresentInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                   (VkPresentInfoKHR*)(pPresentInfo),
+                                                   readStreamPtrPtr);
+                if (pPresentInfo) {
                     transform_tohost_VkPresentInfoKHR(m_state, (VkPresentInfoKHR*)(pPresentInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkQueuePresentKHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)queue, (unsigned long long)pPresentInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkQueuePresentKHR 0x%llx 0x%llx \n", ioStream,
+                            (unsigned long long)queue, (unsigned long long)pPresentInfo);
                 }
                 VkResult vkQueuePresentKHR_VkResult_return = (VkResult)0;
-                vkQueuePresentKHR_VkResult_return = vk->vkQueuePresentKHR(unboxed_queue, pPresentInfo);
-                if ((vkQueuePresentKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkQueuePresentKHR_VkResult_return =
+                    vk->vkQueuePresentKHR(unboxed_queue, pPresentInfo);
+                if ((vkQueuePresentKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkQueuePresentKHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkQueuePresentKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkQueuePresentKHR_VkResult_return, queue, pPresentInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkQueuePresentKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkQueuePresentKHR_VkResult_return, queue, pPresentInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetDeviceGroupPresentCapabilitiesKHR:
-            {
+            case OP_vkGetDeviceGroupPresentCapabilitiesKHR: {
                 android::base::beginTrace("vkGetDeviceGroupPresentCapabilitiesKHR decode");
                 VkDevice device;
                 VkDeviceGroupPresentCapabilitiesKHR* pDeviceGroupPresentCapabilities;
@@ -10367,40 +11898,59 @@
                 // End manual dispatchable handle unboxing for device;
                 // Begin manual dispatchable handle unboxing for pDeviceGroupPresentCapabilities;
                 vkReadStream->unsetHandleMapping();
-                vkReadStream->alloc((void**)&pDeviceGroupPresentCapabilities, sizeof(VkDeviceGroupPresentCapabilitiesKHR));
-                reservedunmarshal_VkDeviceGroupPresentCapabilitiesKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDeviceGroupPresentCapabilitiesKHR*)(pDeviceGroupPresentCapabilities), readStreamPtrPtr);
-                if (pDeviceGroupPresentCapabilities)
-                {
-                    transform_tohost_VkDeviceGroupPresentCapabilitiesKHR(m_state, (VkDeviceGroupPresentCapabilitiesKHR*)(pDeviceGroupPresentCapabilities));
+                vkReadStream->alloc((void**)&pDeviceGroupPresentCapabilities,
+                                    sizeof(VkDeviceGroupPresentCapabilitiesKHR));
+                reservedunmarshal_VkDeviceGroupPresentCapabilitiesKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkDeviceGroupPresentCapabilitiesKHR*)(pDeviceGroupPresentCapabilities),
+                    readStreamPtrPtr);
+                if (pDeviceGroupPresentCapabilities) {
+                    transform_tohost_VkDeviceGroupPresentCapabilitiesKHR(
+                        m_state,
+                        (VkDeviceGroupPresentCapabilitiesKHR*)(pDeviceGroupPresentCapabilities));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetDeviceGroupPresentCapabilitiesKHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pDeviceGroupPresentCapabilities);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkGetDeviceGroupPresentCapabilitiesKHR 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device,
+                        (unsigned long long)pDeviceGroupPresentCapabilities);
                 }
                 VkResult vkGetDeviceGroupPresentCapabilitiesKHR_VkResult_return = (VkResult)0;
-                vkGetDeviceGroupPresentCapabilitiesKHR_VkResult_return = vk->vkGetDeviceGroupPresentCapabilitiesKHR(unboxed_device, pDeviceGroupPresentCapabilities);
-                if ((vkGetDeviceGroupPresentCapabilitiesKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetDeviceGroupPresentCapabilitiesKHR_VkResult_return =
+                    vk->vkGetDeviceGroupPresentCapabilitiesKHR(unboxed_device,
+                                                               pDeviceGroupPresentCapabilities);
+                if ((vkGetDeviceGroupPresentCapabilitiesKHR_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                if (pDeviceGroupPresentCapabilities)
-                {
-                    transform_fromhost_VkDeviceGroupPresentCapabilitiesKHR(m_state, (VkDeviceGroupPresentCapabilitiesKHR*)(pDeviceGroupPresentCapabilities));
+                if (pDeviceGroupPresentCapabilities) {
+                    transform_fromhost_VkDeviceGroupPresentCapabilitiesKHR(
+                        m_state,
+                        (VkDeviceGroupPresentCapabilitiesKHR*)(pDeviceGroupPresentCapabilities));
                 }
-                marshal_VkDeviceGroupPresentCapabilitiesKHR(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDeviceGroupPresentCapabilitiesKHR*)(pDeviceGroupPresentCapabilities));
-                vkStream->write(&vkGetDeviceGroupPresentCapabilitiesKHR_VkResult_return, sizeof(VkResult));
+                marshal_VkDeviceGroupPresentCapabilitiesKHR(
+                    vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkDeviceGroupPresentCapabilitiesKHR*)(pDeviceGroupPresentCapabilities));
+                vkStream->write(&vkGetDeviceGroupPresentCapabilitiesKHR_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetDeviceGroupPresentCapabilitiesKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetDeviceGroupPresentCapabilitiesKHR_VkResult_return, device, pDeviceGroupPresentCapabilities);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetDeviceGroupPresentCapabilitiesKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetDeviceGroupPresentCapabilitiesKHR_VkResult_return, device,
+                        pDeviceGroupPresentCapabilities);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetDeviceGroupSurfacePresentModesKHR:
-            {
+            case OP_vkGetDeviceGroupSurfacePresentModesKHR: {
                 android::base::beginTrace("vkGetDeviceGroupSurfacePresentModesKHR decode");
                 VkDevice device;
                 VkSurfaceKHR surface;
@@ -10416,49 +11966,60 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkSurfaceKHR*)&surface = (VkSurfaceKHR)unbox_VkSurfaceKHR((VkSurfaceKHR)(*&cgen_var_1));
+                *(VkSurfaceKHR*)&surface =
+                    (VkSurfaceKHR)unbox_VkSurfaceKHR((VkSurfaceKHR)(*&cgen_var_1));
                 // Begin manual dispatchable handle unboxing for pModes;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 memcpy((VkDeviceGroupPresentModeFlagsKHR**)&pModes, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pModes);
                 *readStreamPtrPtr += 8;
-                if (pModes)
-                {
+                if (pModes) {
                     vkReadStream->alloc((void**)&pModes, sizeof(VkDeviceGroupPresentModeFlagsKHR));
-                    memcpy((VkDeviceGroupPresentModeFlagsKHR*)pModes, *readStreamPtrPtr, sizeof(VkDeviceGroupPresentModeFlagsKHR));
+                    memcpy((VkDeviceGroupPresentModeFlagsKHR*)pModes, *readStreamPtrPtr,
+                           sizeof(VkDeviceGroupPresentModeFlagsKHR));
                     *readStreamPtrPtr += sizeof(VkDeviceGroupPresentModeFlagsKHR);
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetDeviceGroupSurfacePresentModesKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)surface, (unsigned long long)pModes);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetDeviceGroupSurfacePresentModesKHR 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)surface,
+                            (unsigned long long)pModes);
                 }
                 VkResult vkGetDeviceGroupSurfacePresentModesKHR_VkResult_return = (VkResult)0;
-                vkGetDeviceGroupSurfacePresentModesKHR_VkResult_return = vk->vkGetDeviceGroupSurfacePresentModesKHR(unboxed_device, surface, pModes);
-                if ((vkGetDeviceGroupSurfacePresentModesKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetDeviceGroupSurfacePresentModesKHR_VkResult_return =
+                    vk->vkGetDeviceGroupSurfacePresentModesKHR(unboxed_device, surface, pModes);
+                if ((vkGetDeviceGroupSurfacePresentModesKHR_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pModes;
                 vkStream->putBe64(cgen_var_3);
-                if (pModes)
-                {
-                    vkStream->write((VkDeviceGroupPresentModeFlagsKHR*)pModes, sizeof(VkDeviceGroupPresentModeFlagsKHR));
+                if (pModes) {
+                    vkStream->write((VkDeviceGroupPresentModeFlagsKHR*)pModes,
+                                    sizeof(VkDeviceGroupPresentModeFlagsKHR));
                 }
-                vkStream->write(&vkGetDeviceGroupSurfacePresentModesKHR_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkGetDeviceGroupSurfacePresentModesKHR_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetDeviceGroupSurfacePresentModesKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetDeviceGroupSurfacePresentModesKHR_VkResult_return, device, surface, pModes);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetDeviceGroupSurfacePresentModesKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetDeviceGroupSurfacePresentModesKHR_VkResult_return, device, surface,
+                        pModes);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDevicePresentRectanglesKHR:
-            {
+            case OP_vkGetPhysicalDevicePresentRectanglesKHR: {
                 android::base::beginTrace("vkGetPhysicalDevicePresentRectanglesKHR decode");
                 VkPhysicalDevice physicalDevice;
                 VkSurfaceKHR surface;
@@ -10468,22 +12029,23 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkSurfaceKHR*)&surface = (VkSurfaceKHR)unbox_VkSurfaceKHR((VkSurfaceKHR)(*&cgen_var_1));
+                *(VkSurfaceKHR*)&surface =
+                    (VkSurfaceKHR)unbox_VkSurfaceKHR((VkSurfaceKHR)(*&cgen_var_1));
                 // Begin manual dispatchable handle unboxing for pRectCount;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 memcpy((uint32_t**)&pRectCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pRectCount);
                 *readStreamPtrPtr += 8;
-                if (pRectCount)
-                {
+                if (pRectCount) {
                     vkReadStream->alloc((void**)&pRectCount, sizeof(uint32_t));
                     memcpy((uint32_t*)pRectCount, *readStreamPtrPtr, sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
@@ -10494,45 +12056,45 @@
                 memcpy((VkRect2D**)&pRects, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pRects);
                 *readStreamPtrPtr += 8;
-                if (pRects)
-                {
+                if (pRects) {
                     vkReadStream->alloc((void**)&pRects, (*(pRectCount)) * sizeof(VkRect2D));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pRectCount)); ++i)
-                    {
-                        reservedunmarshal_VkRect2D(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRect2D*)(pRects + i), readStreamPtrPtr);
+                    for (uint32_t i = 0; i < (uint32_t)(*(pRectCount)); ++i) {
+                        reservedunmarshal_VkRect2D(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                   (VkRect2D*)(pRects + i), readStreamPtrPtr);
                     }
                 }
-                if (pRectCount)
-                {
-                    if (pRects)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pRectCount)); ++i)
-                        {
+                if (pRectCount) {
+                    if (pRects) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pRectCount)); ++i) {
                             transform_tohost_VkRect2D(m_state, (VkRect2D*)(pRects + i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDevicePresentRectanglesKHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)surface, (unsigned long long)pRectCount, (unsigned long long)pRects);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDevicePresentRectanglesKHR 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)surface, (unsigned long long)pRectCount,
+                            (unsigned long long)pRects);
                 }
                 VkResult vkGetPhysicalDevicePresentRectanglesKHR_VkResult_return = (VkResult)0;
-                vkGetPhysicalDevicePresentRectanglesKHR_VkResult_return = vk->vkGetPhysicalDevicePresentRectanglesKHR(unboxed_physicalDevice, surface, pRectCount, pRects);
-                if ((vkGetPhysicalDevicePresentRectanglesKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetPhysicalDevicePresentRectanglesKHR_VkResult_return =
+                    vk->vkGetPhysicalDevicePresentRectanglesKHR(unboxed_physicalDevice, surface,
+                                                                pRectCount, pRects);
+                if ((vkGetPhysicalDevicePresentRectanglesKHR_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pRectCount;
                 vkStream->putBe64(cgen_var_4);
-                if (pRectCount)
-                {
+                if (pRectCount) {
                     vkStream->write((uint32_t*)pRectCount, sizeof(uint32_t));
                 }
-                if (pRectCount)
-                {
-                    if (pRects)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pRectCount)); ++i)
-                        {
+                if (pRectCount) {
+                    if (pRects) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pRectCount)); ++i) {
                             transform_fromhost_VkRect2D(m_state, (VkRect2D*)(pRects + i));
                         }
                     }
@@ -10540,31 +12102,33 @@
                 // WARNING PTR CHECK
                 uint64_t cgen_var_5 = (uint64_t)(uintptr_t)pRects;
                 vkStream->putBe64(cgen_var_5);
-                if (pRects)
-                {
-                    if (pRectCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pRectCount)); ++i)
-                        {
-                            marshal_VkRect2D(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRect2D*)(pRects + i));
+                if (pRects) {
+                    if (pRectCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pRectCount)); ++i) {
+                            marshal_VkRect2D(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                             (VkRect2D*)(pRects + i));
                         }
                     }
                 }
-                vkStream->write(&vkGetPhysicalDevicePresentRectanglesKHR_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkGetPhysicalDevicePresentRectanglesKHR_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDevicePresentRectanglesKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetPhysicalDevicePresentRectanglesKHR_VkResult_return, physicalDevice, surface, pRectCount, pRects);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDevicePresentRectanglesKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetPhysicalDevicePresentRectanglesKHR_VkResult_return, physicalDevice,
+                        surface, pRectCount, pRects);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkAcquireNextImage2KHR:
-            {
+            case OP_vkAcquireNextImage2KHR: {
                 android::base::beginTrace("vkAcquireNextImage2KHR decode");
                 VkDevice device;
                 const VkAcquireNextImageInfoKHR* pAcquireInfo;
@@ -10578,42 +12142,50 @@
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
                 vkReadStream->alloc((void**)&pAcquireInfo, sizeof(const VkAcquireNextImageInfoKHR));
-                reservedunmarshal_VkAcquireNextImageInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAcquireNextImageInfoKHR*)(pAcquireInfo), readStreamPtrPtr);
+                reservedunmarshal_VkAcquireNextImageInfoKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkAcquireNextImageInfoKHR*)(pAcquireInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pImageIndex;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pImageIndex, sizeof(uint32_t));
                 memcpy((uint32_t*)pImageIndex, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (pAcquireInfo)
-                {
-                    transform_tohost_VkAcquireNextImageInfoKHR(m_state, (VkAcquireNextImageInfoKHR*)(pAcquireInfo));
+                if (pAcquireInfo) {
+                    transform_tohost_VkAcquireNextImageInfoKHR(
+                        m_state, (VkAcquireNextImageInfoKHR*)(pAcquireInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkAcquireNextImage2KHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pAcquireInfo, (unsigned long long)pImageIndex);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkAcquireNextImage2KHR 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pAcquireInfo,
+                            (unsigned long long)pImageIndex);
                 }
                 VkResult vkAcquireNextImage2KHR_VkResult_return = (VkResult)0;
-                vkAcquireNextImage2KHR_VkResult_return = vk->vkAcquireNextImage2KHR(unboxed_device, pAcquireInfo, pImageIndex);
-                if ((vkAcquireNextImage2KHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkAcquireNextImage2KHR_VkResult_return =
+                    vk->vkAcquireNextImage2KHR(unboxed_device, pAcquireInfo, pImageIndex);
+                if ((vkAcquireNextImage2KHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write((uint32_t*)pImageIndex, sizeof(uint32_t));
                 vkStream->write(&vkAcquireNextImage2KHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkAcquireNextImage2KHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkAcquireNextImage2KHR_VkResult_return, device, pAcquireInfo, pImageIndex);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkAcquireNextImage2KHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkAcquireNextImage2KHR_VkResult_return, device, pAcquireInfo, pImageIndex);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_KHR_display
-            case OP_vkGetPhysicalDeviceDisplayPropertiesKHR:
-            {
+            case OP_vkGetPhysicalDeviceDisplayPropertiesKHR: {
                 android::base::beginTrace("vkGetPhysicalDeviceDisplayPropertiesKHR decode");
                 VkPhysicalDevice physicalDevice;
                 uint32_t* pPropertyCount;
@@ -10622,7 +12194,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
@@ -10632,8 +12205,7 @@
                 memcpy((uint32_t**)&pPropertyCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pPropertyCount);
                 *readStreamPtrPtr += 8;
-                if (pPropertyCount)
-                {
+                if (pPropertyCount) {
                     vkReadStream->alloc((void**)&pPropertyCount, sizeof(uint32_t));
                     memcpy((uint32_t*)pPropertyCount, *readStreamPtrPtr, sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
@@ -10644,77 +12216,83 @@
                 memcpy((VkDisplayPropertiesKHR**)&pProperties, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pProperties);
                 *readStreamPtrPtr += 8;
-                if (pProperties)
-                {
-                    vkReadStream->alloc((void**)&pProperties, (*(pPropertyCount)) * sizeof(VkDisplayPropertiesKHR));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                    {
-                        reservedunmarshal_VkDisplayPropertiesKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayPropertiesKHR*)(pProperties + i), readStreamPtrPtr);
+                if (pProperties) {
+                    vkReadStream->alloc((void**)&pProperties,
+                                        (*(pPropertyCount)) * sizeof(VkDisplayPropertiesKHR));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                        reservedunmarshal_VkDisplayPropertiesKHR(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkDisplayPropertiesKHR*)(pProperties + i), readStreamPtrPtr);
                     }
                 }
-                if (pPropertyCount)
-                {
-                    if (pProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            transform_tohost_VkDisplayPropertiesKHR(m_state, (VkDisplayPropertiesKHR*)(pProperties + i));
+                if (pPropertyCount) {
+                    if (pProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            transform_tohost_VkDisplayPropertiesKHR(
+                                m_state, (VkDisplayPropertiesKHR*)(pProperties + i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceDisplayPropertiesKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pPropertyCount, (unsigned long long)pProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceDisplayPropertiesKHR 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)pPropertyCount, (unsigned long long)pProperties);
                 }
                 VkResult vkGetPhysicalDeviceDisplayPropertiesKHR_VkResult_return = (VkResult)0;
-                vkGetPhysicalDeviceDisplayPropertiesKHR_VkResult_return = vk->vkGetPhysicalDeviceDisplayPropertiesKHR(unboxed_physicalDevice, pPropertyCount, pProperties);
-                if ((vkGetPhysicalDeviceDisplayPropertiesKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetPhysicalDeviceDisplayPropertiesKHR_VkResult_return =
+                    vk->vkGetPhysicalDeviceDisplayPropertiesKHR(unboxed_physicalDevice,
+                                                                pPropertyCount, pProperties);
+                if ((vkGetPhysicalDeviceDisplayPropertiesKHR_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pPropertyCount;
                 vkStream->putBe64(cgen_var_3);
-                if (pPropertyCount)
-                {
+                if (pPropertyCount) {
                     vkStream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
                 }
-                if (pPropertyCount)
-                {
-                    if (pProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            transform_fromhost_VkDisplayPropertiesKHR(m_state, (VkDisplayPropertiesKHR*)(pProperties + i));
+                if (pPropertyCount) {
+                    if (pProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            transform_fromhost_VkDisplayPropertiesKHR(
+                                m_state, (VkDisplayPropertiesKHR*)(pProperties + i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pProperties;
                 vkStream->putBe64(cgen_var_4);
-                if (pProperties)
-                {
-                    if (pPropertyCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            marshal_VkDisplayPropertiesKHR(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayPropertiesKHR*)(pProperties + i));
+                if (pProperties) {
+                    if (pPropertyCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            marshal_VkDisplayPropertiesKHR(
+                                vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                (VkDisplayPropertiesKHR*)(pProperties + i));
                         }
                     }
                 }
-                vkStream->write(&vkGetPhysicalDeviceDisplayPropertiesKHR_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkGetPhysicalDeviceDisplayPropertiesKHR_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceDisplayPropertiesKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetPhysicalDeviceDisplayPropertiesKHR_VkResult_return, physicalDevice, pPropertyCount, pProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceDisplayPropertiesKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetPhysicalDeviceDisplayPropertiesKHR_VkResult_return, physicalDevice,
+                        pPropertyCount, pProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceDisplayPlanePropertiesKHR:
-            {
+            case OP_vkGetPhysicalDeviceDisplayPlanePropertiesKHR: {
                 android::base::beginTrace("vkGetPhysicalDeviceDisplayPlanePropertiesKHR decode");
                 VkPhysicalDevice physicalDevice;
                 uint32_t* pPropertyCount;
@@ -10723,7 +12301,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
@@ -10733,8 +12312,7 @@
                 memcpy((uint32_t**)&pPropertyCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pPropertyCount);
                 *readStreamPtrPtr += 8;
-                if (pPropertyCount)
-                {
+                if (pPropertyCount) {
                     vkReadStream->alloc((void**)&pPropertyCount, sizeof(uint32_t));
                     memcpy((uint32_t*)pPropertyCount, *readStreamPtrPtr, sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
@@ -10745,77 +12323,83 @@
                 memcpy((VkDisplayPlanePropertiesKHR**)&pProperties, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pProperties);
                 *readStreamPtrPtr += 8;
-                if (pProperties)
-                {
-                    vkReadStream->alloc((void**)&pProperties, (*(pPropertyCount)) * sizeof(VkDisplayPlanePropertiesKHR));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                    {
-                        reservedunmarshal_VkDisplayPlanePropertiesKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayPlanePropertiesKHR*)(pProperties + i), readStreamPtrPtr);
+                if (pProperties) {
+                    vkReadStream->alloc((void**)&pProperties,
+                                        (*(pPropertyCount)) * sizeof(VkDisplayPlanePropertiesKHR));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                        reservedunmarshal_VkDisplayPlanePropertiesKHR(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkDisplayPlanePropertiesKHR*)(pProperties + i), readStreamPtrPtr);
                     }
                 }
-                if (pPropertyCount)
-                {
-                    if (pProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            transform_tohost_VkDisplayPlanePropertiesKHR(m_state, (VkDisplayPlanePropertiesKHR*)(pProperties + i));
+                if (pPropertyCount) {
+                    if (pProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            transform_tohost_VkDisplayPlanePropertiesKHR(
+                                m_state, (VkDisplayPlanePropertiesKHR*)(pProperties + i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceDisplayPlanePropertiesKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pPropertyCount, (unsigned long long)pProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceDisplayPlanePropertiesKHR 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)pPropertyCount, (unsigned long long)pProperties);
                 }
                 VkResult vkGetPhysicalDeviceDisplayPlanePropertiesKHR_VkResult_return = (VkResult)0;
-                vkGetPhysicalDeviceDisplayPlanePropertiesKHR_VkResult_return = vk->vkGetPhysicalDeviceDisplayPlanePropertiesKHR(unboxed_physicalDevice, pPropertyCount, pProperties);
-                if ((vkGetPhysicalDeviceDisplayPlanePropertiesKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetPhysicalDeviceDisplayPlanePropertiesKHR_VkResult_return =
+                    vk->vkGetPhysicalDeviceDisplayPlanePropertiesKHR(unboxed_physicalDevice,
+                                                                     pPropertyCount, pProperties);
+                if ((vkGetPhysicalDeviceDisplayPlanePropertiesKHR_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pPropertyCount;
                 vkStream->putBe64(cgen_var_3);
-                if (pPropertyCount)
-                {
+                if (pPropertyCount) {
                     vkStream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
                 }
-                if (pPropertyCount)
-                {
-                    if (pProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            transform_fromhost_VkDisplayPlanePropertiesKHR(m_state, (VkDisplayPlanePropertiesKHR*)(pProperties + i));
+                if (pPropertyCount) {
+                    if (pProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            transform_fromhost_VkDisplayPlanePropertiesKHR(
+                                m_state, (VkDisplayPlanePropertiesKHR*)(pProperties + i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pProperties;
                 vkStream->putBe64(cgen_var_4);
-                if (pProperties)
-                {
-                    if (pPropertyCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            marshal_VkDisplayPlanePropertiesKHR(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayPlanePropertiesKHR*)(pProperties + i));
+                if (pProperties) {
+                    if (pPropertyCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            marshal_VkDisplayPlanePropertiesKHR(
+                                vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                (VkDisplayPlanePropertiesKHR*)(pProperties + i));
                         }
                     }
                 }
-                vkStream->write(&vkGetPhysicalDeviceDisplayPlanePropertiesKHR_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkGetPhysicalDeviceDisplayPlanePropertiesKHR_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceDisplayPlanePropertiesKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetPhysicalDeviceDisplayPlanePropertiesKHR_VkResult_return, physicalDevice, pPropertyCount, pProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceDisplayPlanePropertiesKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetPhysicalDeviceDisplayPlanePropertiesKHR_VkResult_return,
+                        physicalDevice, pPropertyCount, pProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetDisplayPlaneSupportedDisplaysKHR:
-            {
+            case OP_vkGetDisplayPlaneSupportedDisplaysKHR: {
                 android::base::beginTrace("vkGetDisplayPlaneSupportedDisplaysKHR decode");
                 VkPhysicalDevice physicalDevice;
                 uint32_t planeIndex;
@@ -10825,7 +12409,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
@@ -10837,8 +12422,7 @@
                 memcpy((uint32_t**)&pDisplayCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pDisplayCount);
                 *readStreamPtrPtr += 8;
-                if (pDisplayCount)
-                {
+                if (pDisplayCount) {
                     vkReadStream->alloc((void**)&pDisplayCount, sizeof(uint32_t));
                     memcpy((uint32_t*)pDisplayCount, *readStreamPtrPtr, sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
@@ -10849,66 +12433,74 @@
                 memcpy((VkDisplayKHR**)&pDisplays, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pDisplays);
                 *readStreamPtrPtr += 8;
-                if (pDisplays)
-                {
-                    vkReadStream->alloc((void**)&pDisplays, (*(pDisplayCount)) * sizeof(VkDisplayKHR));
-                    if ((*(pDisplayCount)))
-                    {
+                if (pDisplays) {
+                    vkReadStream->alloc((void**)&pDisplays,
+                                        (*(pDisplayCount)) * sizeof(VkDisplayKHR));
+                    if ((*(pDisplayCount))) {
                         uint8_t* cgen_var_2_0_ptr = (uint8_t*)(*readStreamPtrPtr);
                         *readStreamPtrPtr += 8 * (*(pDisplayCount));
-                        if (pDisplayCount)
-                        {
-                            for (uint32_t k = 0; k < (*(pDisplayCount)); ++k)
-                            {
-                                uint64_t tmpval; memcpy(&tmpval, cgen_var_2_0_ptr + k * 8, sizeof(uint64_t));
-                                *(((VkDisplayKHR*)pDisplays) + k) = (VkDisplayKHR)(VkDisplayKHR)((VkDisplayKHR)tmpval);
+                        if (pDisplayCount) {
+                            for (uint32_t k = 0; k < (*(pDisplayCount)); ++k) {
+                                uint64_t tmpval;
+                                memcpy(&tmpval, cgen_var_2_0_ptr + k * 8, sizeof(uint64_t));
+                                *(((VkDisplayKHR*)pDisplays) + k) =
+                                    (VkDisplayKHR)(VkDisplayKHR)((VkDisplayKHR)tmpval);
                             }
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetDisplayPlaneSupportedDisplaysKHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)planeIndex, (unsigned long long)pDisplayCount, (unsigned long long)pDisplays);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetDisplayPlaneSupportedDisplaysKHR 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)planeIndex, (unsigned long long)pDisplayCount,
+                            (unsigned long long)pDisplays);
                 }
                 VkResult vkGetDisplayPlaneSupportedDisplaysKHR_VkResult_return = (VkResult)0;
-                vkGetDisplayPlaneSupportedDisplaysKHR_VkResult_return = vk->vkGetDisplayPlaneSupportedDisplaysKHR(unboxed_physicalDevice, planeIndex, pDisplayCount, pDisplays);
-                if ((vkGetDisplayPlaneSupportedDisplaysKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetDisplayPlaneSupportedDisplaysKHR_VkResult_return =
+                    vk->vkGetDisplayPlaneSupportedDisplaysKHR(unboxed_physicalDevice, planeIndex,
+                                                              pDisplayCount, pDisplays);
+                if ((vkGetDisplayPlaneSupportedDisplaysKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pDisplayCount;
                 vkStream->putBe64(cgen_var_3);
-                if (pDisplayCount)
-                {
+                if (pDisplayCount) {
                     vkStream->write((uint32_t*)pDisplayCount, sizeof(uint32_t));
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pDisplays;
                 vkStream->putBe64(cgen_var_4);
-                if (pDisplays)
-                {
-                    if ((*(pDisplayCount)))
-                    {
+                if (pDisplays) {
+                    if ((*(pDisplayCount))) {
                         uint64_t* cgen_var_4_0;
                         vkStream->alloc((void**)&cgen_var_4_0, (*(pDisplayCount)) * 8);
-                        vkStream->handleMapping()->mapHandles_VkDisplayKHR_u64(pDisplays, cgen_var_4_0, (*(pDisplayCount)));
+                        vkStream->handleMapping()->mapHandles_VkDisplayKHR_u64(
+                            pDisplays, cgen_var_4_0, (*(pDisplayCount)));
                         vkStream->write((uint64_t*)cgen_var_4_0, (*(pDisplayCount)) * 8);
                     }
                 }
-                vkStream->write(&vkGetDisplayPlaneSupportedDisplaysKHR_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkGetDisplayPlaneSupportedDisplaysKHR_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetDisplayPlaneSupportedDisplaysKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetDisplayPlaneSupportedDisplaysKHR_VkResult_return, physicalDevice, planeIndex, pDisplayCount, pDisplays);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetDisplayPlaneSupportedDisplaysKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetDisplayPlaneSupportedDisplaysKHR_VkResult_return, physicalDevice,
+                        planeIndex, pDisplayCount, pDisplays);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetDisplayModePropertiesKHR:
-            {
+            case OP_vkGetDisplayModePropertiesKHR: {
                 android::base::beginTrace("vkGetDisplayModePropertiesKHR decode");
                 VkPhysicalDevice physicalDevice;
                 VkDisplayKHR display;
@@ -10918,22 +12510,23 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDisplayKHR*)&display = (VkDisplayKHR)unbox_VkDisplayKHR((VkDisplayKHR)(*&cgen_var_1));
+                *(VkDisplayKHR*)&display =
+                    (VkDisplayKHR)unbox_VkDisplayKHR((VkDisplayKHR)(*&cgen_var_1));
                 // Begin manual dispatchable handle unboxing for pPropertyCount;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 memcpy((uint32_t**)&pPropertyCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pPropertyCount);
                 *readStreamPtrPtr += 8;
-                if (pPropertyCount)
-                {
+                if (pPropertyCount) {
                     vkReadStream->alloc((void**)&pPropertyCount, sizeof(uint32_t));
                     memcpy((uint32_t*)pPropertyCount, *readStreamPtrPtr, sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
@@ -10944,77 +12537,81 @@
                 memcpy((VkDisplayModePropertiesKHR**)&pProperties, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pProperties);
                 *readStreamPtrPtr += 8;
-                if (pProperties)
-                {
-                    vkReadStream->alloc((void**)&pProperties, (*(pPropertyCount)) * sizeof(VkDisplayModePropertiesKHR));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                    {
-                        reservedunmarshal_VkDisplayModePropertiesKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayModePropertiesKHR*)(pProperties + i), readStreamPtrPtr);
+                if (pProperties) {
+                    vkReadStream->alloc((void**)&pProperties,
+                                        (*(pPropertyCount)) * sizeof(VkDisplayModePropertiesKHR));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                        reservedunmarshal_VkDisplayModePropertiesKHR(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkDisplayModePropertiesKHR*)(pProperties + i), readStreamPtrPtr);
                     }
                 }
-                if (pPropertyCount)
-                {
-                    if (pProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            transform_tohost_VkDisplayModePropertiesKHR(m_state, (VkDisplayModePropertiesKHR*)(pProperties + i));
+                if (pPropertyCount) {
+                    if (pProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            transform_tohost_VkDisplayModePropertiesKHR(
+                                m_state, (VkDisplayModePropertiesKHR*)(pProperties + i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetDisplayModePropertiesKHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)display, (unsigned long long)pPropertyCount, (unsigned long long)pProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetDisplayModePropertiesKHR 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)display, (unsigned long long)pPropertyCount,
+                            (unsigned long long)pProperties);
                 }
                 VkResult vkGetDisplayModePropertiesKHR_VkResult_return = (VkResult)0;
-                vkGetDisplayModePropertiesKHR_VkResult_return = vk->vkGetDisplayModePropertiesKHR(unboxed_physicalDevice, display, pPropertyCount, pProperties);
-                if ((vkGetDisplayModePropertiesKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetDisplayModePropertiesKHR_VkResult_return = vk->vkGetDisplayModePropertiesKHR(
+                    unboxed_physicalDevice, display, pPropertyCount, pProperties);
+                if ((vkGetDisplayModePropertiesKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pPropertyCount;
                 vkStream->putBe64(cgen_var_4);
-                if (pPropertyCount)
-                {
+                if (pPropertyCount) {
                     vkStream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
                 }
-                if (pPropertyCount)
-                {
-                    if (pProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            transform_fromhost_VkDisplayModePropertiesKHR(m_state, (VkDisplayModePropertiesKHR*)(pProperties + i));
+                if (pPropertyCount) {
+                    if (pProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            transform_fromhost_VkDisplayModePropertiesKHR(
+                                m_state, (VkDisplayModePropertiesKHR*)(pProperties + i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_5 = (uint64_t)(uintptr_t)pProperties;
                 vkStream->putBe64(cgen_var_5);
-                if (pProperties)
-                {
-                    if (pPropertyCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            marshal_VkDisplayModePropertiesKHR(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayModePropertiesKHR*)(pProperties + i));
+                if (pProperties) {
+                    if (pPropertyCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            marshal_VkDisplayModePropertiesKHR(
+                                vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                (VkDisplayModePropertiesKHR*)(pProperties + i));
                         }
                     }
                 }
                 vkStream->write(&vkGetDisplayModePropertiesKHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetDisplayModePropertiesKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetDisplayModePropertiesKHR_VkResult_return, physicalDevice, display, pPropertyCount, pProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetDisplayModePropertiesKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetDisplayModePropertiesKHR_VkResult_return, physicalDevice, display,
+                        pPropertyCount, pProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCreateDisplayModeKHR:
-            {
+            case OP_vkCreateDisplayModeKHR: {
                 android::base::beginTrace("vkCreateDisplayModeKHR decode");
                 VkPhysicalDevice physicalDevice;
                 VkDisplayKHR display;
@@ -11025,24 +12622,29 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDisplayKHR*)&display = (VkDisplayKHR)unbox_VkDisplayKHR((VkDisplayKHR)(*&cgen_var_1));
+                *(VkDisplayKHR*)&display =
+                    (VkDisplayKHR)unbox_VkDisplayKHR((VkDisplayKHR)(*&cgen_var_1));
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkDisplayModeCreateInfoKHR));
-                reservedunmarshal_VkDisplayModeCreateInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayModeCreateInfoKHR*)(pCreateInfo), readStreamPtrPtr);
+                reservedunmarshal_VkDisplayModeCreateInfoKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkDisplayModeCreateInfoKHR*)(pCreateInfo), readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pMode;
                 vkReadStream->unsetHandleMapping();
@@ -11050,46 +12652,58 @@
                 uint64_t cgen_var_3;
                 memcpy((uint64_t*)&cgen_var_3, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkDisplayModeKHR*)pMode = (VkDisplayModeKHR)(VkDisplayModeKHR)((VkDisplayModeKHR)(*&cgen_var_3));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkDisplayModeCreateInfoKHR(m_state, (VkDisplayModeCreateInfoKHR*)(pCreateInfo));
+                *(VkDisplayModeKHR*)pMode =
+                    (VkDisplayModeKHR)(VkDisplayModeKHR)((VkDisplayModeKHR)(*&cgen_var_3));
+                if (pCreateInfo) {
+                    transform_tohost_VkDisplayModeCreateInfoKHR(
+                        m_state, (VkDisplayModeCreateInfoKHR*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateDisplayModeKHR 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)display, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pMode);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateDisplayModeKHR 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)display, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pMode);
                 }
                 VkResult vkCreateDisplayModeKHR_VkResult_return = (VkResult)0;
-                vkCreateDisplayModeKHR_VkResult_return = vk->vkCreateDisplayModeKHR(unboxed_physicalDevice, display, pCreateInfo, pAllocator, pMode);
-                if ((vkCreateDisplayModeKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateDisplayModeKHR_VkResult_return = vk->vkCreateDisplayModeKHR(
+                    unboxed_physicalDevice, display, pCreateInfo, pAllocator, pMode);
+                if ((vkCreateDisplayModeKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // Begin auto non dispatchable handle create for pMode;
-                if (vkCreateDisplayModeKHR_VkResult_return == VK_SUCCESS) vkStream->setHandleMapping(&m_boxedHandleCreateMapping);
+                if (vkCreateDisplayModeKHR_VkResult_return == VK_SUCCESS)
+                    vkStream->setHandleMapping(&m_boxedHandleCreateMapping);
                 uint64_t cgen_var_4;
-                static_assert(8 == sizeof(VkDisplayModeKHR), "handle map overwrite requires VkDisplayModeKHR to be 8 bytes long");
+                static_assert(8 == sizeof(VkDisplayModeKHR),
+                              "handle map overwrite requires VkDisplayModeKHR to be 8 bytes long");
                 vkStream->handleMapping()->mapHandles_VkDisplayModeKHR((VkDisplayModeKHR*)pMode, 1);
                 vkStream->write((VkDisplayModeKHR*)pMode, 8 * 1);
                 // Begin auto non dispatchable handle create for pMode;
                 vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
                 vkStream->write(&vkCreateDisplayModeKHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateDisplayModeKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateDisplayModeKHR_VkResult_return, physicalDevice, display, pCreateInfo, pAllocator, pMode);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateDisplayModeKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateDisplayModeKHR_VkResult_return, physicalDevice, display,
+                        pCreateInfo, pAllocator, pMode);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetDisplayPlaneCapabilitiesKHR:
-            {
+            case OP_vkGetDisplayPlaneCapabilitiesKHR: {
                 android::base::beginTrace("vkGetDisplayPlaneCapabilitiesKHR decode");
                 VkPhysicalDevice physicalDevice;
                 VkDisplayModeKHR mode;
@@ -11099,52 +12713,68 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDisplayModeKHR*)&mode = (VkDisplayModeKHR)unbox_VkDisplayModeKHR((VkDisplayModeKHR)(*&cgen_var_1));
+                *(VkDisplayModeKHR*)&mode =
+                    (VkDisplayModeKHR)unbox_VkDisplayModeKHR((VkDisplayModeKHR)(*&cgen_var_1));
                 memcpy((uint32_t*)&planeIndex, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 // Begin manual dispatchable handle unboxing for pCapabilities;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pCapabilities, sizeof(VkDisplayPlaneCapabilitiesKHR));
-                reservedunmarshal_VkDisplayPlaneCapabilitiesKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayPlaneCapabilitiesKHR*)(pCapabilities), readStreamPtrPtr);
-                if (pCapabilities)
-                {
-                    transform_tohost_VkDisplayPlaneCapabilitiesKHR(m_state, (VkDisplayPlaneCapabilitiesKHR*)(pCapabilities));
+                reservedunmarshal_VkDisplayPlaneCapabilitiesKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkDisplayPlaneCapabilitiesKHR*)(pCapabilities), readStreamPtrPtr);
+                if (pCapabilities) {
+                    transform_tohost_VkDisplayPlaneCapabilitiesKHR(
+                        m_state, (VkDisplayPlaneCapabilitiesKHR*)(pCapabilities));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetDisplayPlaneCapabilitiesKHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)mode, (unsigned long long)planeIndex, (unsigned long long)pCapabilities);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetDisplayPlaneCapabilitiesKHR 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice, (unsigned long long)mode,
+                            (unsigned long long)planeIndex, (unsigned long long)pCapabilities);
                 }
                 VkResult vkGetDisplayPlaneCapabilitiesKHR_VkResult_return = (VkResult)0;
-                vkGetDisplayPlaneCapabilitiesKHR_VkResult_return = vk->vkGetDisplayPlaneCapabilitiesKHR(unboxed_physicalDevice, mode, planeIndex, pCapabilities);
-                if ((vkGetDisplayPlaneCapabilitiesKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetDisplayPlaneCapabilitiesKHR_VkResult_return =
+                    vk->vkGetDisplayPlaneCapabilitiesKHR(unboxed_physicalDevice, mode, planeIndex,
+                                                         pCapabilities);
+                if ((vkGetDisplayPlaneCapabilitiesKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                if (pCapabilities)
-                {
-                    transform_fromhost_VkDisplayPlaneCapabilitiesKHR(m_state, (VkDisplayPlaneCapabilitiesKHR*)(pCapabilities));
+                if (pCapabilities) {
+                    transform_fromhost_VkDisplayPlaneCapabilitiesKHR(
+                        m_state, (VkDisplayPlaneCapabilitiesKHR*)(pCapabilities));
                 }
-                marshal_VkDisplayPlaneCapabilitiesKHR(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayPlaneCapabilitiesKHR*)(pCapabilities));
-                vkStream->write(&vkGetDisplayPlaneCapabilitiesKHR_VkResult_return, sizeof(VkResult));
+                marshal_VkDisplayPlaneCapabilitiesKHR(
+                    vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkDisplayPlaneCapabilitiesKHR*)(pCapabilities));
+                vkStream->write(&vkGetDisplayPlaneCapabilitiesKHR_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetDisplayPlaneCapabilitiesKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetDisplayPlaneCapabilitiesKHR_VkResult_return, physicalDevice, mode, planeIndex, pCapabilities);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetDisplayPlaneCapabilitiesKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetDisplayPlaneCapabilitiesKHR_VkResult_return, physicalDevice, mode,
+                        planeIndex, pCapabilities);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCreateDisplayPlaneSurfaceKHR:
-            {
+            case OP_vkCreateDisplayPlaneSurfaceKHR: {
                 android::base::beginTrace("vkCreateDisplayPlaneSurfaceKHR decode");
                 VkInstance instance;
                 const VkDisplaySurfaceCreateInfoKHR* pCreateInfo;
@@ -11158,16 +12788,20 @@
                 auto unboxed_instance = unbox_VkInstance(instance);
                 auto vk = dispatch_VkInstance(instance);
                 // End manual dispatchable handle unboxing for instance;
-                vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkDisplaySurfaceCreateInfoKHR));
-                reservedunmarshal_VkDisplaySurfaceCreateInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplaySurfaceCreateInfoKHR*)(pCreateInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pCreateInfo,
+                                    sizeof(const VkDisplaySurfaceCreateInfoKHR));
+                reservedunmarshal_VkDisplaySurfaceCreateInfoKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkDisplaySurfaceCreateInfoKHR*)(pCreateInfo), readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pSurface;
                 vkReadStream->unsetHandleMapping();
@@ -11175,43 +12809,52 @@
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkSurfaceKHR*)pSurface = (VkSurfaceKHR)(VkSurfaceKHR)((VkSurfaceKHR)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkDisplaySurfaceCreateInfoKHR(m_state, (VkDisplaySurfaceCreateInfoKHR*)(pCreateInfo));
+                *(VkSurfaceKHR*)pSurface =
+                    (VkSurfaceKHR)(VkSurfaceKHR)((VkSurfaceKHR)(*&cgen_var_2));
+                if (pCreateInfo) {
+                    transform_tohost_VkDisplaySurfaceCreateInfoKHR(
+                        m_state, (VkDisplaySurfaceCreateInfoKHR*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateDisplayPlaneSurfaceKHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)instance, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pSurface);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateDisplayPlaneSurfaceKHR 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)instance, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pSurface);
                 }
                 VkResult vkCreateDisplayPlaneSurfaceKHR_VkResult_return = (VkResult)0;
-                vkCreateDisplayPlaneSurfaceKHR_VkResult_return = vk->vkCreateDisplayPlaneSurfaceKHR(unboxed_instance, pCreateInfo, pAllocator, pSurface);
-                if ((vkCreateDisplayPlaneSurfaceKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateDisplayPlaneSurfaceKHR_VkResult_return = vk->vkCreateDisplayPlaneSurfaceKHR(
+                    unboxed_instance, pCreateInfo, pAllocator, pSurface);
+                if ((vkCreateDisplayPlaneSurfaceKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3;
                 vkStream->handleMapping()->mapHandles_VkSurfaceKHR_u64(pSurface, &cgen_var_3, 1);
                 vkStream->write((uint64_t*)&cgen_var_3, 8);
                 vkStream->write(&vkCreateDisplayPlaneSurfaceKHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateDisplayPlaneSurfaceKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateDisplayPlaneSurfaceKHR_VkResult_return, instance, pCreateInfo, pAllocator, pSurface);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateDisplayPlaneSurfaceKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateDisplayPlaneSurfaceKHR_VkResult_return, instance, pCreateInfo,
+                        pAllocator, pSurface);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_KHR_display_swapchain
-            case OP_vkCreateSharedSwapchainsKHR:
-            {
+            case OP_vkCreateSharedSwapchainsKHR: {
                 android::base::beginTrace("vkCreateSharedSwapchainsKHR decode");
                 VkDevice device;
                 uint32_t swapchainCount;
@@ -11228,76 +12871,88 @@
                 // End manual dispatchable handle unboxing for device;
                 memcpy((uint32_t*)&swapchainCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pCreateInfos, ((swapchainCount)) * sizeof(const VkSwapchainCreateInfoKHR));
-                for (uint32_t i = 0; i < (uint32_t)((swapchainCount)); ++i)
-                {
-                    reservedunmarshal_VkSwapchainCreateInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSwapchainCreateInfoKHR*)(pCreateInfos + i), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pCreateInfos,
+                                    ((swapchainCount)) * sizeof(const VkSwapchainCreateInfoKHR));
+                for (uint32_t i = 0; i < (uint32_t)((swapchainCount)); ++i) {
+                    reservedunmarshal_VkSwapchainCreateInfoKHR(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkSwapchainCreateInfoKHR*)(pCreateInfos + i), readStreamPtrPtr);
                 }
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pSwapchains;
                 vkReadStream->unsetHandleMapping();
-                vkReadStream->alloc((void**)&pSwapchains, ((swapchainCount)) * sizeof(VkSwapchainKHR));
-                if (((swapchainCount)))
-                {
+                vkReadStream->alloc((void**)&pSwapchains,
+                                    ((swapchainCount)) * sizeof(VkSwapchainKHR));
+                if (((swapchainCount))) {
                     uint8_t* cgen_var_2_ptr = (uint8_t*)(*readStreamPtrPtr);
                     *readStreamPtrPtr += 8 * ((swapchainCount));
-                    for (uint32_t k = 0; k < ((swapchainCount)); ++k)
-                    {
-                        uint64_t tmpval; memcpy(&tmpval, cgen_var_2_ptr + k * 8, sizeof(uint64_t));
-                        *(((VkSwapchainKHR*)pSwapchains) + k) = (VkSwapchainKHR)(VkSwapchainKHR)((VkSwapchainKHR)tmpval);
+                    for (uint32_t k = 0; k < ((swapchainCount)); ++k) {
+                        uint64_t tmpval;
+                        memcpy(&tmpval, cgen_var_2_ptr + k * 8, sizeof(uint64_t));
+                        *(((VkSwapchainKHR*)pSwapchains) + k) =
+                            (VkSwapchainKHR)(VkSwapchainKHR)((VkSwapchainKHR)tmpval);
                     }
                 }
-                if (pCreateInfos)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((swapchainCount)); ++i)
-                    {
-                        transform_tohost_VkSwapchainCreateInfoKHR(m_state, (VkSwapchainCreateInfoKHR*)(pCreateInfos + i));
+                if (pCreateInfos) {
+                    for (uint32_t i = 0; i < (uint32_t)((swapchainCount)); ++i) {
+                        transform_tohost_VkSwapchainCreateInfoKHR(
+                            m_state, (VkSwapchainCreateInfoKHR*)(pCreateInfos + i));
                     }
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateSharedSwapchainsKHR 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)swapchainCount, (unsigned long long)pCreateInfos, (unsigned long long)pAllocator, (unsigned long long)pSwapchains);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateSharedSwapchainsKHR 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device,
+                            (unsigned long long)swapchainCount, (unsigned long long)pCreateInfos,
+                            (unsigned long long)pAllocator, (unsigned long long)pSwapchains);
                 }
                 VkResult vkCreateSharedSwapchainsKHR_VkResult_return = (VkResult)0;
-                vkCreateSharedSwapchainsKHR_VkResult_return = vk->vkCreateSharedSwapchainsKHR(unboxed_device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
-                if ((vkCreateSharedSwapchainsKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateSharedSwapchainsKHR_VkResult_return = vk->vkCreateSharedSwapchainsKHR(
+                    unboxed_device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
+                if ((vkCreateSharedSwapchainsKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                if (((swapchainCount)))
-                {
+                if (((swapchainCount))) {
                     uint64_t* cgen_var_3;
                     vkStream->alloc((void**)&cgen_var_3, ((swapchainCount)) * 8);
-                    vkStream->handleMapping()->mapHandles_VkSwapchainKHR_u64(pSwapchains, cgen_var_3, ((swapchainCount)));
+                    vkStream->handleMapping()->mapHandles_VkSwapchainKHR_u64(
+                        pSwapchains, cgen_var_3, ((swapchainCount)));
                     vkStream->write((uint64_t*)cgen_var_3, ((swapchainCount)) * 8);
                 }
                 vkStream->write(&vkCreateSharedSwapchainsKHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateSharedSwapchainsKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateSharedSwapchainsKHR_VkResult_return, device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateSharedSwapchainsKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateSharedSwapchainsKHR_VkResult_return, device, swapchainCount,
+                        pCreateInfos, pAllocator, pSwapchains);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_KHR_xlib_surface
-            case OP_vkCreateXlibSurfaceKHR:
-            {
+            case OP_vkCreateXlibSurfaceKHR: {
                 android::base::beginTrace("vkCreateXlibSurfaceKHR decode");
                 VkInstance instance;
                 const VkXlibSurfaceCreateInfoKHR* pCreateInfo;
@@ -11312,15 +12967,18 @@
                 auto vk = dispatch_VkInstance(instance);
                 // End manual dispatchable handle unboxing for instance;
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkXlibSurfaceCreateInfoKHR));
-                reservedunmarshal_VkXlibSurfaceCreateInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkXlibSurfaceCreateInfoKHR*)(pCreateInfo), readStreamPtrPtr);
+                reservedunmarshal_VkXlibSurfaceCreateInfoKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkXlibSurfaceCreateInfoKHR*)(pCreateInfo), readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pSurface;
                 vkReadStream->unsetHandleMapping();
@@ -11328,41 +12986,49 @@
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkSurfaceKHR*)pSurface = (VkSurfaceKHR)(VkSurfaceKHR)((VkSurfaceKHR)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkXlibSurfaceCreateInfoKHR(m_state, (VkXlibSurfaceCreateInfoKHR*)(pCreateInfo));
+                *(VkSurfaceKHR*)pSurface =
+                    (VkSurfaceKHR)(VkSurfaceKHR)((VkSurfaceKHR)(*&cgen_var_2));
+                if (pCreateInfo) {
+                    transform_tohost_VkXlibSurfaceCreateInfoKHR(
+                        m_state, (VkXlibSurfaceCreateInfoKHR*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateXlibSurfaceKHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)instance, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pSurface);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateXlibSurfaceKHR 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)instance, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pSurface);
                 }
                 VkResult vkCreateXlibSurfaceKHR_VkResult_return = (VkResult)0;
-                vkCreateXlibSurfaceKHR_VkResult_return = vk->vkCreateXlibSurfaceKHR(unboxed_instance, pCreateInfo, pAllocator, pSurface);
-                if ((vkCreateXlibSurfaceKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateXlibSurfaceKHR_VkResult_return =
+                    vk->vkCreateXlibSurfaceKHR(unboxed_instance, pCreateInfo, pAllocator, pSurface);
+                if ((vkCreateXlibSurfaceKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3;
                 vkStream->handleMapping()->mapHandles_VkSurfaceKHR_u64(pSurface, &cgen_var_3, 1);
                 vkStream->write((uint64_t*)&cgen_var_3, 8);
                 vkStream->write(&vkCreateXlibSurfaceKHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateXlibSurfaceKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateXlibSurfaceKHR_VkResult_return, instance, pCreateInfo, pAllocator, pSurface);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateXlibSurfaceKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateXlibSurfaceKHR_VkResult_return, instance, pCreateInfo, pAllocator,
+                        pSurface);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceXlibPresentationSupportKHR:
-            {
+            case OP_vkGetPhysicalDeviceXlibPresentationSupportKHR: {
                 android::base::beginTrace("vkGetPhysicalDeviceXlibPresentationSupportKHR decode");
                 VkPhysicalDevice physicalDevice;
                 uint32_t queueFamilyIndex;
@@ -11372,7 +13038,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
@@ -11385,51 +13052,66 @@
                 *readStreamPtrPtr += sizeof(Display);
                 memcpy((VisualID*)&visualID, *readStreamPtrPtr, sizeof(VisualID));
                 *readStreamPtrPtr += sizeof(VisualID);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceXlibPresentationSupportKHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)queueFamilyIndex, (unsigned long long)dpy, (unsigned long long)visualID);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceXlibPresentationSupportKHR 0x%llx "
+                            "0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)queueFamilyIndex, (unsigned long long)dpy,
+                            (unsigned long long)visualID);
                 }
-                VkBool32 vkGetPhysicalDeviceXlibPresentationSupportKHR_VkBool32_return = (VkBool32)0;
-                vkGetPhysicalDeviceXlibPresentationSupportKHR_VkBool32_return = vk->vkGetPhysicalDeviceXlibPresentationSupportKHR(unboxed_physicalDevice, queueFamilyIndex, dpy, visualID);
+                VkBool32 vkGetPhysicalDeviceXlibPresentationSupportKHR_VkBool32_return =
+                    (VkBool32)0;
+                vkGetPhysicalDeviceXlibPresentationSupportKHR_VkBool32_return =
+                    vk->vkGetPhysicalDeviceXlibPresentationSupportKHR(
+                        unboxed_physicalDevice, queueFamilyIndex, dpy, visualID);
                 vkStream->unsetHandleMapping();
                 vkStream->write((Display*)dpy, sizeof(Display));
-                vkStream->write(&vkGetPhysicalDeviceXlibPresentationSupportKHR_VkBool32_return, sizeof(VkBool32));
+                vkStream->write(&vkGetPhysicalDeviceXlibPresentationSupportKHR_VkBool32_return,
+                                sizeof(VkBool32));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceXlibPresentationSupportKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetPhysicalDeviceXlibPresentationSupportKHR_VkBool32_return, physicalDevice, queueFamilyIndex, dpy, visualID);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceXlibPresentationSupportKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetPhysicalDeviceXlibPresentationSupportKHR_VkBool32_return,
+                        physicalDevice, queueFamilyIndex, dpy, visualID);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_KHR_xcb_surface
-            case OP_vkCreateXcbSurfaceKHR:
-            {
+            case OP_vkCreateXcbSurfaceKHR: {
                 android::base::beginTrace("vkCreateXcbSurfaceKHR decode");
                 // Decoding vkCreateXcbSurfaceKHR is not supported. This should not run.
-                fprintf(stderr, "stream %p: fatal: decoding unsupported API vkCreateXcbSurfaceKHR\n", ioStream);
+                fprintf(stderr,
+                        "stream %p: fatal: decoding unsupported API vkCreateXcbSurfaceKHR\n",
+                        ioStream);
                 __builtin_trap();
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceXcbPresentationSupportKHR:
-            {
+            case OP_vkGetPhysicalDeviceXcbPresentationSupportKHR: {
                 android::base::beginTrace("vkGetPhysicalDeviceXcbPresentationSupportKHR decode");
-                // Decoding vkGetPhysicalDeviceXcbPresentationSupportKHR is not supported. This should not run.
-                fprintf(stderr, "stream %p: fatal: decoding unsupported API vkGetPhysicalDeviceXcbPresentationSupportKHR\n", ioStream);
+                // Decoding vkGetPhysicalDeviceXcbPresentationSupportKHR is not supported. This
+                // should not run.
+                fprintf(stderr,
+                        "stream %p: fatal: decoding unsupported API "
+                        "vkGetPhysicalDeviceXcbPresentationSupportKHR\n",
+                        ioStream);
                 __builtin_trap();
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_KHR_wayland_surface
-            case OP_vkCreateWaylandSurfaceKHR:
-            {
+            case OP_vkCreateWaylandSurfaceKHR: {
                 android::base::beginTrace("vkCreateWaylandSurfaceKHR decode");
                 VkInstance instance;
                 const VkWaylandSurfaceCreateInfoKHR* pCreateInfo;
@@ -11443,16 +13125,20 @@
                 auto unboxed_instance = unbox_VkInstance(instance);
                 auto vk = dispatch_VkInstance(instance);
                 // End manual dispatchable handle unboxing for instance;
-                vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkWaylandSurfaceCreateInfoKHR));
-                reservedunmarshal_VkWaylandSurfaceCreateInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkWaylandSurfaceCreateInfoKHR*)(pCreateInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pCreateInfo,
+                                    sizeof(const VkWaylandSurfaceCreateInfoKHR));
+                reservedunmarshal_VkWaylandSurfaceCreateInfoKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkWaylandSurfaceCreateInfoKHR*)(pCreateInfo), readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pSurface;
                 vkReadStream->unsetHandleMapping();
@@ -11460,42 +13146,52 @@
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkSurfaceKHR*)pSurface = (VkSurfaceKHR)(VkSurfaceKHR)((VkSurfaceKHR)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkWaylandSurfaceCreateInfoKHR(m_state, (VkWaylandSurfaceCreateInfoKHR*)(pCreateInfo));
+                *(VkSurfaceKHR*)pSurface =
+                    (VkSurfaceKHR)(VkSurfaceKHR)((VkSurfaceKHR)(*&cgen_var_2));
+                if (pCreateInfo) {
+                    transform_tohost_VkWaylandSurfaceCreateInfoKHR(
+                        m_state, (VkWaylandSurfaceCreateInfoKHR*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateWaylandSurfaceKHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)instance, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pSurface);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkCreateWaylandSurfaceKHR 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)instance, (unsigned long long)pCreateInfo,
+                        (unsigned long long)pAllocator, (unsigned long long)pSurface);
                 }
                 VkResult vkCreateWaylandSurfaceKHR_VkResult_return = (VkResult)0;
-                vkCreateWaylandSurfaceKHR_VkResult_return = vk->vkCreateWaylandSurfaceKHR(unboxed_instance, pCreateInfo, pAllocator, pSurface);
-                if ((vkCreateWaylandSurfaceKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateWaylandSurfaceKHR_VkResult_return = vk->vkCreateWaylandSurfaceKHR(
+                    unboxed_instance, pCreateInfo, pAllocator, pSurface);
+                if ((vkCreateWaylandSurfaceKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3;
                 vkStream->handleMapping()->mapHandles_VkSurfaceKHR_u64(pSurface, &cgen_var_3, 1);
                 vkStream->write((uint64_t*)&cgen_var_3, 8);
                 vkStream->write(&vkCreateWaylandSurfaceKHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateWaylandSurfaceKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateWaylandSurfaceKHR_VkResult_return, instance, pCreateInfo, pAllocator, pSurface);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateWaylandSurfaceKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateWaylandSurfaceKHR_VkResult_return, instance, pCreateInfo,
+                        pAllocator, pSurface);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceWaylandPresentationSupportKHR:
-            {
-                android::base::beginTrace("vkGetPhysicalDeviceWaylandPresentationSupportKHR decode");
+            case OP_vkGetPhysicalDeviceWaylandPresentationSupportKHR: {
+                android::base::beginTrace(
+                    "vkGetPhysicalDeviceWaylandPresentationSupportKHR decode");
                 VkPhysicalDevice physicalDevice;
                 uint32_t queueFamilyIndex;
                 wl_display* display;
@@ -11503,7 +13199,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
@@ -11514,31 +13211,41 @@
                 vkReadStream->alloc((void**)&display, sizeof(wl_display));
                 memcpy((wl_display*)display, *readStreamPtrPtr, sizeof(wl_display));
                 *readStreamPtrPtr += sizeof(wl_display);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceWaylandPresentationSupportKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)queueFamilyIndex, (unsigned long long)display);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceWaylandPresentationSupportKHR "
+                            "0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)queueFamilyIndex, (unsigned long long)display);
                 }
-                VkBool32 vkGetPhysicalDeviceWaylandPresentationSupportKHR_VkBool32_return = (VkBool32)0;
-                vkGetPhysicalDeviceWaylandPresentationSupportKHR_VkBool32_return = vk->vkGetPhysicalDeviceWaylandPresentationSupportKHR(unboxed_physicalDevice, queueFamilyIndex, display);
+                VkBool32 vkGetPhysicalDeviceWaylandPresentationSupportKHR_VkBool32_return =
+                    (VkBool32)0;
+                vkGetPhysicalDeviceWaylandPresentationSupportKHR_VkBool32_return =
+                    vk->vkGetPhysicalDeviceWaylandPresentationSupportKHR(unboxed_physicalDevice,
+                                                                         queueFamilyIndex, display);
                 vkStream->unsetHandleMapping();
                 vkStream->write((wl_display*)display, sizeof(wl_display));
-                vkStream->write(&vkGetPhysicalDeviceWaylandPresentationSupportKHR_VkBool32_return, sizeof(VkBool32));
+                vkStream->write(&vkGetPhysicalDeviceWaylandPresentationSupportKHR_VkBool32_return,
+                                sizeof(VkBool32));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceWaylandPresentationSupportKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetPhysicalDeviceWaylandPresentationSupportKHR_VkBool32_return, physicalDevice, queueFamilyIndex, display);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceWaylandPresentationSupportKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetPhysicalDeviceWaylandPresentationSupportKHR_VkBool32_return,
+                        physicalDevice, queueFamilyIndex, display);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_KHR_android_surface
-            case OP_vkCreateAndroidSurfaceKHR:
-            {
+            case OP_vkCreateAndroidSurfaceKHR: {
                 android::base::beginTrace("vkCreateAndroidSurfaceKHR decode");
                 VkInstance instance;
                 const VkAndroidSurfaceCreateInfoKHR* pCreateInfo;
@@ -11552,16 +13259,20 @@
                 auto unboxed_instance = unbox_VkInstance(instance);
                 auto vk = dispatch_VkInstance(instance);
                 // End manual dispatchable handle unboxing for instance;
-                vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkAndroidSurfaceCreateInfoKHR));
-                reservedunmarshal_VkAndroidSurfaceCreateInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAndroidSurfaceCreateInfoKHR*)(pCreateInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pCreateInfo,
+                                    sizeof(const VkAndroidSurfaceCreateInfoKHR));
+                reservedunmarshal_VkAndroidSurfaceCreateInfoKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkAndroidSurfaceCreateInfoKHR*)(pCreateInfo), readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pSurface;
                 vkReadStream->unsetHandleMapping();
@@ -11569,43 +13280,52 @@
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkSurfaceKHR*)pSurface = (VkSurfaceKHR)(VkSurfaceKHR)((VkSurfaceKHR)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkAndroidSurfaceCreateInfoKHR(m_state, (VkAndroidSurfaceCreateInfoKHR*)(pCreateInfo));
+                *(VkSurfaceKHR*)pSurface =
+                    (VkSurfaceKHR)(VkSurfaceKHR)((VkSurfaceKHR)(*&cgen_var_2));
+                if (pCreateInfo) {
+                    transform_tohost_VkAndroidSurfaceCreateInfoKHR(
+                        m_state, (VkAndroidSurfaceCreateInfoKHR*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateAndroidSurfaceKHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)instance, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pSurface);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkCreateAndroidSurfaceKHR 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)instance, (unsigned long long)pCreateInfo,
+                        (unsigned long long)pAllocator, (unsigned long long)pSurface);
                 }
                 VkResult vkCreateAndroidSurfaceKHR_VkResult_return = (VkResult)0;
-                vkCreateAndroidSurfaceKHR_VkResult_return = vk->vkCreateAndroidSurfaceKHR(unboxed_instance, pCreateInfo, pAllocator, pSurface);
-                if ((vkCreateAndroidSurfaceKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateAndroidSurfaceKHR_VkResult_return = vk->vkCreateAndroidSurfaceKHR(
+                    unboxed_instance, pCreateInfo, pAllocator, pSurface);
+                if ((vkCreateAndroidSurfaceKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3;
                 vkStream->handleMapping()->mapHandles_VkSurfaceKHR_u64(pSurface, &cgen_var_3, 1);
                 vkStream->write((uint64_t*)&cgen_var_3, 8);
                 vkStream->write(&vkCreateAndroidSurfaceKHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateAndroidSurfaceKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateAndroidSurfaceKHR_VkResult_return, instance, pCreateInfo, pAllocator, pSurface);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateAndroidSurfaceKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateAndroidSurfaceKHR_VkResult_return, instance, pCreateInfo,
+                        pAllocator, pSurface);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_KHR_win32_surface
-            case OP_vkCreateWin32SurfaceKHR:
-            {
+            case OP_vkCreateWin32SurfaceKHR: {
                 android::base::beginTrace("vkCreateWin32SurfaceKHR decode");
                 VkInstance instance;
                 const VkWin32SurfaceCreateInfoKHR* pCreateInfo;
@@ -11619,16 +13339,20 @@
                 auto unboxed_instance = unbox_VkInstance(instance);
                 auto vk = dispatch_VkInstance(instance);
                 // End manual dispatchable handle unboxing for instance;
-                vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkWin32SurfaceCreateInfoKHR));
-                reservedunmarshal_VkWin32SurfaceCreateInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkWin32SurfaceCreateInfoKHR*)(pCreateInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pCreateInfo,
+                                    sizeof(const VkWin32SurfaceCreateInfoKHR));
+                reservedunmarshal_VkWin32SurfaceCreateInfoKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkWin32SurfaceCreateInfoKHR*)(pCreateInfo), readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pSurface;
                 vkReadStream->unsetHandleMapping();
@@ -11636,41 +13360,50 @@
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkSurfaceKHR*)pSurface = (VkSurfaceKHR)(VkSurfaceKHR)((VkSurfaceKHR)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkWin32SurfaceCreateInfoKHR(m_state, (VkWin32SurfaceCreateInfoKHR*)(pCreateInfo));
+                *(VkSurfaceKHR*)pSurface =
+                    (VkSurfaceKHR)(VkSurfaceKHR)((VkSurfaceKHR)(*&cgen_var_2));
+                if (pCreateInfo) {
+                    transform_tohost_VkWin32SurfaceCreateInfoKHR(
+                        m_state, (VkWin32SurfaceCreateInfoKHR*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateWin32SurfaceKHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)instance, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pSurface);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkCreateWin32SurfaceKHR 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)instance, (unsigned long long)pCreateInfo,
+                        (unsigned long long)pAllocator, (unsigned long long)pSurface);
                 }
                 VkResult vkCreateWin32SurfaceKHR_VkResult_return = (VkResult)0;
-                vkCreateWin32SurfaceKHR_VkResult_return = vk->vkCreateWin32SurfaceKHR(unboxed_instance, pCreateInfo, pAllocator, pSurface);
-                if ((vkCreateWin32SurfaceKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateWin32SurfaceKHR_VkResult_return = vk->vkCreateWin32SurfaceKHR(
+                    unboxed_instance, pCreateInfo, pAllocator, pSurface);
+                if ((vkCreateWin32SurfaceKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3;
                 vkStream->handleMapping()->mapHandles_VkSurfaceKHR_u64(pSurface, &cgen_var_3, 1);
                 vkStream->write((uint64_t*)&cgen_var_3, 8);
                 vkStream->write(&vkCreateWin32SurfaceKHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateWin32SurfaceKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateWin32SurfaceKHR_VkResult_return, instance, pCreateInfo, pAllocator, pSurface);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateWin32SurfaceKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateWin32SurfaceKHR_VkResult_return, instance, pCreateInfo, pAllocator,
+                        pSurface);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceWin32PresentationSupportKHR:
-            {
+            case OP_vkGetPhysicalDeviceWin32PresentationSupportKHR: {
                 android::base::beginTrace("vkGetPhysicalDeviceWin32PresentationSupportKHR decode");
                 VkPhysicalDevice physicalDevice;
                 uint32_t queueFamilyIndex;
@@ -11678,29 +13411,41 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
                 memcpy((uint32_t*)&queueFamilyIndex, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceWin32PresentationSupportKHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)queueFamilyIndex);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceWin32PresentationSupportKHR 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)queueFamilyIndex);
                 }
-                VkBool32 vkGetPhysicalDeviceWin32PresentationSupportKHR_VkBool32_return = (VkBool32)0;
-                vkGetPhysicalDeviceWin32PresentationSupportKHR_VkBool32_return = vk->vkGetPhysicalDeviceWin32PresentationSupportKHR(unboxed_physicalDevice, queueFamilyIndex);
+                VkBool32 vkGetPhysicalDeviceWin32PresentationSupportKHR_VkBool32_return =
+                    (VkBool32)0;
+                vkGetPhysicalDeviceWin32PresentationSupportKHR_VkBool32_return =
+                    vk->vkGetPhysicalDeviceWin32PresentationSupportKHR(unboxed_physicalDevice,
+                                                                       queueFamilyIndex);
                 vkStream->unsetHandleMapping();
-                vkStream->write(&vkGetPhysicalDeviceWin32PresentationSupportKHR_VkBool32_return, sizeof(VkBool32));
+                vkStream->write(&vkGetPhysicalDeviceWin32PresentationSupportKHR_VkBool32_return,
+                                sizeof(VkBool32));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceWin32PresentationSupportKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetPhysicalDeviceWin32PresentationSupportKHR_VkBool32_return, physicalDevice, queueFamilyIndex);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceWin32PresentationSupportKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetPhysicalDeviceWin32PresentationSupportKHR_VkBool32_return,
+                        physicalDevice, queueFamilyIndex);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -11708,8 +13453,7 @@
 #ifdef VK_KHR_sampler_mirror_clamp_to_edge
 #endif
 #ifdef VK_KHR_video_queue
-            case OP_vkGetPhysicalDeviceVideoCapabilitiesKHR:
-            {
+            case OP_vkGetPhysicalDeviceVideoCapabilitiesKHR: {
                 android::base::beginTrace("vkGetPhysicalDeviceVideoCapabilitiesKHR decode");
                 VkPhysicalDevice physicalDevice;
                 const VkVideoProfileKHR* pVideoProfile;
@@ -11718,52 +13462,69 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
                 vkReadStream->alloc((void**)&pVideoProfile, sizeof(const VkVideoProfileKHR));
-                reservedunmarshal_VkVideoProfileKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkVideoProfileKHR*)(pVideoProfile), readStreamPtrPtr);
+                reservedunmarshal_VkVideoProfileKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                    (VkVideoProfileKHR*)(pVideoProfile),
+                                                    readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pCapabilities;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pCapabilities, sizeof(VkVideoCapabilitiesKHR));
-                reservedunmarshal_VkVideoCapabilitiesKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkVideoCapabilitiesKHR*)(pCapabilities), readStreamPtrPtr);
-                if (pVideoProfile)
-                {
-                    transform_tohost_VkVideoProfileKHR(m_state, (VkVideoProfileKHR*)(pVideoProfile));
+                reservedunmarshal_VkVideoCapabilitiesKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                         (VkVideoCapabilitiesKHR*)(pCapabilities),
+                                                         readStreamPtrPtr);
+                if (pVideoProfile) {
+                    transform_tohost_VkVideoProfileKHR(m_state,
+                                                       (VkVideoProfileKHR*)(pVideoProfile));
                 }
-                if (pCapabilities)
-                {
-                    transform_tohost_VkVideoCapabilitiesKHR(m_state, (VkVideoCapabilitiesKHR*)(pCapabilities));
+                if (pCapabilities) {
+                    transform_tohost_VkVideoCapabilitiesKHR(
+                        m_state, (VkVideoCapabilitiesKHR*)(pCapabilities));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceVideoCapabilitiesKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pVideoProfile, (unsigned long long)pCapabilities);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceVideoCapabilitiesKHR 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)pVideoProfile, (unsigned long long)pCapabilities);
                 }
                 VkResult vkGetPhysicalDeviceVideoCapabilitiesKHR_VkResult_return = (VkResult)0;
-                vkGetPhysicalDeviceVideoCapabilitiesKHR_VkResult_return = vk->vkGetPhysicalDeviceVideoCapabilitiesKHR(unboxed_physicalDevice, pVideoProfile, pCapabilities);
-                if ((vkGetPhysicalDeviceVideoCapabilitiesKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetPhysicalDeviceVideoCapabilitiesKHR_VkResult_return =
+                    vk->vkGetPhysicalDeviceVideoCapabilitiesKHR(unboxed_physicalDevice,
+                                                                pVideoProfile, pCapabilities);
+                if ((vkGetPhysicalDeviceVideoCapabilitiesKHR_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                if (pCapabilities)
-                {
-                    transform_fromhost_VkVideoCapabilitiesKHR(m_state, (VkVideoCapabilitiesKHR*)(pCapabilities));
+                if (pCapabilities) {
+                    transform_fromhost_VkVideoCapabilitiesKHR(
+                        m_state, (VkVideoCapabilitiesKHR*)(pCapabilities));
                 }
-                marshal_VkVideoCapabilitiesKHR(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkVideoCapabilitiesKHR*)(pCapabilities));
-                vkStream->write(&vkGetPhysicalDeviceVideoCapabilitiesKHR_VkResult_return, sizeof(VkResult));
+                marshal_VkVideoCapabilitiesKHR(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                               (VkVideoCapabilitiesKHR*)(pCapabilities));
+                vkStream->write(&vkGetPhysicalDeviceVideoCapabilitiesKHR_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceVideoCapabilitiesKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetPhysicalDeviceVideoCapabilitiesKHR_VkResult_return, physicalDevice, pVideoProfile, pCapabilities);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceVideoCapabilitiesKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetPhysicalDeviceVideoCapabilitiesKHR_VkResult_return, physicalDevice,
+                        pVideoProfile, pCapabilities);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceVideoFormatPropertiesKHR:
-            {
+            case OP_vkGetPhysicalDeviceVideoFormatPropertiesKHR: {
                 android::base::beginTrace("vkGetPhysicalDeviceVideoFormatPropertiesKHR decode");
                 VkPhysicalDevice physicalDevice;
                 const VkPhysicalDeviceVideoFormatInfoKHR* pVideoFormatInfo;
@@ -11773,105 +13534,121 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
-                vkReadStream->alloc((void**)&pVideoFormatInfo, sizeof(const VkPhysicalDeviceVideoFormatInfoKHR));
-                reservedunmarshal_VkPhysicalDeviceVideoFormatInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceVideoFormatInfoKHR*)(pVideoFormatInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pVideoFormatInfo,
+                                    sizeof(const VkPhysicalDeviceVideoFormatInfoKHR));
+                reservedunmarshal_VkPhysicalDeviceVideoFormatInfoKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPhysicalDeviceVideoFormatInfoKHR*)(pVideoFormatInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pVideoFormatPropertyCount;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 memcpy((uint32_t**)&pVideoFormatPropertyCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pVideoFormatPropertyCount);
                 *readStreamPtrPtr += 8;
-                if (pVideoFormatPropertyCount)
-                {
+                if (pVideoFormatPropertyCount) {
                     vkReadStream->alloc((void**)&pVideoFormatPropertyCount, sizeof(uint32_t));
-                    memcpy((uint32_t*)pVideoFormatPropertyCount, *readStreamPtrPtr, sizeof(uint32_t));
+                    memcpy((uint32_t*)pVideoFormatPropertyCount, *readStreamPtrPtr,
+                           sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
                 }
                 // Begin manual dispatchable handle unboxing for pVideoFormatProperties;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
-                memcpy((VkVideoFormatPropertiesKHR**)&pVideoFormatProperties, (*readStreamPtrPtr), 8);
+                memcpy((VkVideoFormatPropertiesKHR**)&pVideoFormatProperties, (*readStreamPtrPtr),
+                       8);
                 android::base::Stream::fromBe64((uint8_t*)&pVideoFormatProperties);
                 *readStreamPtrPtr += 8;
-                if (pVideoFormatProperties)
-                {
-                    vkReadStream->alloc((void**)&pVideoFormatProperties, (*(pVideoFormatPropertyCount)) * sizeof(VkVideoFormatPropertiesKHR));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pVideoFormatPropertyCount)); ++i)
-                    {
-                        reservedunmarshal_VkVideoFormatPropertiesKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkVideoFormatPropertiesKHR*)(pVideoFormatProperties + i), readStreamPtrPtr);
+                if (pVideoFormatProperties) {
+                    vkReadStream->alloc(
+                        (void**)&pVideoFormatProperties,
+                        (*(pVideoFormatPropertyCount)) * sizeof(VkVideoFormatPropertiesKHR));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pVideoFormatPropertyCount)); ++i) {
+                        reservedunmarshal_VkVideoFormatPropertiesKHR(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkVideoFormatPropertiesKHR*)(pVideoFormatProperties + i),
+                            readStreamPtrPtr);
                     }
                 }
-                if (pVideoFormatInfo)
-                {
-                    transform_tohost_VkPhysicalDeviceVideoFormatInfoKHR(m_state, (VkPhysicalDeviceVideoFormatInfoKHR*)(pVideoFormatInfo));
+                if (pVideoFormatInfo) {
+                    transform_tohost_VkPhysicalDeviceVideoFormatInfoKHR(
+                        m_state, (VkPhysicalDeviceVideoFormatInfoKHR*)(pVideoFormatInfo));
                 }
-                if (pVideoFormatPropertyCount)
-                {
-                    if (pVideoFormatProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pVideoFormatPropertyCount)); ++i)
-                        {
-                            transform_tohost_VkVideoFormatPropertiesKHR(m_state, (VkVideoFormatPropertiesKHR*)(pVideoFormatProperties + i));
+                if (pVideoFormatPropertyCount) {
+                    if (pVideoFormatProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pVideoFormatPropertyCount)); ++i) {
+                            transform_tohost_VkVideoFormatPropertiesKHR(
+                                m_state, (VkVideoFormatPropertiesKHR*)(pVideoFormatProperties + i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceVideoFormatPropertiesKHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pVideoFormatInfo, (unsigned long long)pVideoFormatPropertyCount, (unsigned long long)pVideoFormatProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceVideoFormatPropertiesKHR 0x%llx "
+                            "0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)pVideoFormatInfo,
+                            (unsigned long long)pVideoFormatPropertyCount,
+                            (unsigned long long)pVideoFormatProperties);
                 }
                 VkResult vkGetPhysicalDeviceVideoFormatPropertiesKHR_VkResult_return = (VkResult)0;
-                vkGetPhysicalDeviceVideoFormatPropertiesKHR_VkResult_return = vk->vkGetPhysicalDeviceVideoFormatPropertiesKHR(unboxed_physicalDevice, pVideoFormatInfo, pVideoFormatPropertyCount, pVideoFormatProperties);
-                if ((vkGetPhysicalDeviceVideoFormatPropertiesKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetPhysicalDeviceVideoFormatPropertiesKHR_VkResult_return =
+                    vk->vkGetPhysicalDeviceVideoFormatPropertiesKHR(
+                        unboxed_physicalDevice, pVideoFormatInfo, pVideoFormatPropertyCount,
+                        pVideoFormatProperties);
+                if ((vkGetPhysicalDeviceVideoFormatPropertiesKHR_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pVideoFormatPropertyCount;
                 vkStream->putBe64(cgen_var_3);
-                if (pVideoFormatPropertyCount)
-                {
+                if (pVideoFormatPropertyCount) {
                     vkStream->write((uint32_t*)pVideoFormatPropertyCount, sizeof(uint32_t));
                 }
-                if (pVideoFormatPropertyCount)
-                {
-                    if (pVideoFormatProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pVideoFormatPropertyCount)); ++i)
-                        {
-                            transform_fromhost_VkVideoFormatPropertiesKHR(m_state, (VkVideoFormatPropertiesKHR*)(pVideoFormatProperties + i));
+                if (pVideoFormatPropertyCount) {
+                    if (pVideoFormatProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pVideoFormatPropertyCount)); ++i) {
+                            transform_fromhost_VkVideoFormatPropertiesKHR(
+                                m_state, (VkVideoFormatPropertiesKHR*)(pVideoFormatProperties + i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pVideoFormatProperties;
                 vkStream->putBe64(cgen_var_4);
-                if (pVideoFormatProperties)
-                {
-                    if (pVideoFormatPropertyCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pVideoFormatPropertyCount)); ++i)
-                        {
-                            marshal_VkVideoFormatPropertiesKHR(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkVideoFormatPropertiesKHR*)(pVideoFormatProperties + i));
+                if (pVideoFormatProperties) {
+                    if (pVideoFormatPropertyCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pVideoFormatPropertyCount)); ++i) {
+                            marshal_VkVideoFormatPropertiesKHR(
+                                vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                (VkVideoFormatPropertiesKHR*)(pVideoFormatProperties + i));
                         }
                     }
                 }
-                vkStream->write(&vkGetPhysicalDeviceVideoFormatPropertiesKHR_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkGetPhysicalDeviceVideoFormatPropertiesKHR_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceVideoFormatPropertiesKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetPhysicalDeviceVideoFormatPropertiesKHR_VkResult_return, physicalDevice, pVideoFormatInfo, pVideoFormatPropertyCount, pVideoFormatProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceVideoFormatPropertiesKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetPhysicalDeviceVideoFormatPropertiesKHR_VkResult_return, physicalDevice,
+                        pVideoFormatInfo, pVideoFormatPropertyCount, pVideoFormatProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCreateVideoSessionKHR:
-            {
+            case OP_vkCreateVideoSessionKHR: {
                 android::base::beginTrace("vkCreateVideoSessionKHR decode");
                 VkDevice device;
                 const VkVideoSessionCreateInfoKHR* pCreateInfo;
@@ -11885,16 +13662,20 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkVideoSessionCreateInfoKHR));
-                reservedunmarshal_VkVideoSessionCreateInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkVideoSessionCreateInfoKHR*)(pCreateInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pCreateInfo,
+                                    sizeof(const VkVideoSessionCreateInfoKHR));
+                reservedunmarshal_VkVideoSessionCreateInfoKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkVideoSessionCreateInfoKHR*)(pCreateInfo), readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pVideoSession;
                 vkReadStream->unsetHandleMapping();
@@ -11902,39 +13683,47 @@
                 memcpy((VkVideoSessionKHR*)&(*pVideoSession), (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&(*pVideoSession));
                 *readStreamPtrPtr += 8;
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkVideoSessionCreateInfoKHR(m_state, (VkVideoSessionCreateInfoKHR*)(pCreateInfo));
+                if (pCreateInfo) {
+                    transform_tohost_VkVideoSessionCreateInfoKHR(
+                        m_state, (VkVideoSessionCreateInfoKHR*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateVideoSessionKHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pVideoSession);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkCreateVideoSessionKHR 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                        (unsigned long long)pAllocator, (unsigned long long)pVideoSession);
                 }
                 VkResult vkCreateVideoSessionKHR_VkResult_return = (VkResult)0;
-                vkCreateVideoSessionKHR_VkResult_return = vk->vkCreateVideoSessionKHR(unboxed_device, pCreateInfo, pAllocator, pVideoSession);
-                if ((vkCreateVideoSessionKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateVideoSessionKHR_VkResult_return = vk->vkCreateVideoSessionKHR(
+                    unboxed_device, pCreateInfo, pAllocator, pVideoSession);
+                if ((vkCreateVideoSessionKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3 = (uint64_t)(*pVideoSession);
                 vkStream->putBe64(cgen_var_3);
                 vkStream->write(&vkCreateVideoSessionKHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateVideoSessionKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateVideoSessionKHR_VkResult_return, device, pCreateInfo, pAllocator, pVideoSession);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateVideoSessionKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateVideoSessionKHR_VkResult_return, device, pCreateInfo, pAllocator,
+                        pVideoSession);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroyVideoSessionKHR:
-            {
+            case OP_vkDestroyVideoSessionKHR: {
                 android::base::beginTrace("vkDestroyVideoSessionKHR decode");
                 VkDevice device;
                 VkVideoSessionKHR videoSession;
@@ -11954,34 +13743,39 @@
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroyVideoSessionKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)videoSession, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkDestroyVideoSessionKHR 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)videoSession,
+                            (unsigned long long)pAllocator);
                 }
                 vk->vkDestroyVideoSessionKHR(unboxed_device, videoSession, pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroyVideoSessionKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, videoSession, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroyVideoSessionKHR(snapshotTraceBegin,
+                                                                  snapshotTraceBytes, &m_pool,
+                                                                  device, videoSession, pAllocator);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetVideoSessionMemoryRequirementsKHR:
-            {
+            case OP_vkGetVideoSessionMemoryRequirementsKHR: {
                 android::base::beginTrace("vkGetVideoSessionMemoryRequirementsKHR decode");
                 VkDevice device;
                 VkVideoSessionKHR videoSession;
@@ -11998,95 +13792,119 @@
                 memcpy((VkVideoSessionKHR*)&videoSession, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&videoSession);
                 *readStreamPtrPtr += 8;
-                // Begin manual dispatchable handle unboxing for pVideoSessionMemoryRequirementsCount;
+                // Begin manual dispatchable handle unboxing for
+                // pVideoSessionMemoryRequirementsCount;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 memcpy((uint32_t**)&pVideoSessionMemoryRequirementsCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pVideoSessionMemoryRequirementsCount);
                 *readStreamPtrPtr += 8;
-                if (pVideoSessionMemoryRequirementsCount)
-                {
-                    vkReadStream->alloc((void**)&pVideoSessionMemoryRequirementsCount, sizeof(uint32_t));
-                    memcpy((uint32_t*)pVideoSessionMemoryRequirementsCount, *readStreamPtrPtr, sizeof(uint32_t));
+                if (pVideoSessionMemoryRequirementsCount) {
+                    vkReadStream->alloc((void**)&pVideoSessionMemoryRequirementsCount,
+                                        sizeof(uint32_t));
+                    memcpy((uint32_t*)pVideoSessionMemoryRequirementsCount, *readStreamPtrPtr,
+                           sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
                 }
                 // Begin manual dispatchable handle unboxing for pVideoSessionMemoryRequirements;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
-                memcpy((VkVideoGetMemoryPropertiesKHR**)&pVideoSessionMemoryRequirements, (*readStreamPtrPtr), 8);
+                memcpy((VkVideoGetMemoryPropertiesKHR**)&pVideoSessionMemoryRequirements,
+                       (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pVideoSessionMemoryRequirements);
                 *readStreamPtrPtr += 8;
-                if (pVideoSessionMemoryRequirements)
-                {
-                    vkReadStream->alloc((void**)&pVideoSessionMemoryRequirements, (*(pVideoSessionMemoryRequirementsCount)) * sizeof(VkVideoGetMemoryPropertiesKHR));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pVideoSessionMemoryRequirementsCount)); ++i)
-                    {
-                        reservedunmarshal_VkVideoGetMemoryPropertiesKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkVideoGetMemoryPropertiesKHR*)(pVideoSessionMemoryRequirements + i), readStreamPtrPtr);
+                if (pVideoSessionMemoryRequirements) {
+                    vkReadStream->alloc((void**)&pVideoSessionMemoryRequirements,
+                                        (*(pVideoSessionMemoryRequirementsCount)) *
+                                            sizeof(VkVideoGetMemoryPropertiesKHR));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pVideoSessionMemoryRequirementsCount));
+                         ++i) {
+                        reservedunmarshal_VkVideoGetMemoryPropertiesKHR(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkVideoGetMemoryPropertiesKHR*)(pVideoSessionMemoryRequirements + i),
+                            readStreamPtrPtr);
                     }
                 }
-                if (pVideoSessionMemoryRequirementsCount)
-                {
-                    if (pVideoSessionMemoryRequirements)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pVideoSessionMemoryRequirementsCount)); ++i)
-                        {
-                            transform_tohost_VkVideoGetMemoryPropertiesKHR(m_state, (VkVideoGetMemoryPropertiesKHR*)(pVideoSessionMemoryRequirements + i));
+                if (pVideoSessionMemoryRequirementsCount) {
+                    if (pVideoSessionMemoryRequirements) {
+                        for (uint32_t i = 0;
+                             i < (uint32_t)(*(pVideoSessionMemoryRequirementsCount)); ++i) {
+                            transform_tohost_VkVideoGetMemoryPropertiesKHR(
+                                m_state,
+                                (VkVideoGetMemoryPropertiesKHR*)(pVideoSessionMemoryRequirements +
+                                                                 i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetVideoSessionMemoryRequirementsKHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)videoSession, (unsigned long long)pVideoSessionMemoryRequirementsCount, (unsigned long long)pVideoSessionMemoryRequirements);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetVideoSessionMemoryRequirementsKHR 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)videoSession,
+                            (unsigned long long)pVideoSessionMemoryRequirementsCount,
+                            (unsigned long long)pVideoSessionMemoryRequirements);
                 }
                 VkResult vkGetVideoSessionMemoryRequirementsKHR_VkResult_return = (VkResult)0;
-                vkGetVideoSessionMemoryRequirementsKHR_VkResult_return = vk->vkGetVideoSessionMemoryRequirementsKHR(unboxed_device, videoSession, pVideoSessionMemoryRequirementsCount, pVideoSessionMemoryRequirements);
-                if ((vkGetVideoSessionMemoryRequirementsKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetVideoSessionMemoryRequirementsKHR_VkResult_return =
+                    vk->vkGetVideoSessionMemoryRequirementsKHR(unboxed_device, videoSession,
+                                                               pVideoSessionMemoryRequirementsCount,
+                                                               pVideoSessionMemoryRequirements);
+                if ((vkGetVideoSessionMemoryRequirementsKHR_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pVideoSessionMemoryRequirementsCount;
                 vkStream->putBe64(cgen_var_4);
-                if (pVideoSessionMemoryRequirementsCount)
-                {
-                    vkStream->write((uint32_t*)pVideoSessionMemoryRequirementsCount, sizeof(uint32_t));
+                if (pVideoSessionMemoryRequirementsCount) {
+                    vkStream->write((uint32_t*)pVideoSessionMemoryRequirementsCount,
+                                    sizeof(uint32_t));
                 }
-                if (pVideoSessionMemoryRequirementsCount)
-                {
-                    if (pVideoSessionMemoryRequirements)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pVideoSessionMemoryRequirementsCount)); ++i)
-                        {
-                            transform_fromhost_VkVideoGetMemoryPropertiesKHR(m_state, (VkVideoGetMemoryPropertiesKHR*)(pVideoSessionMemoryRequirements + i));
+                if (pVideoSessionMemoryRequirementsCount) {
+                    if (pVideoSessionMemoryRequirements) {
+                        for (uint32_t i = 0;
+                             i < (uint32_t)(*(pVideoSessionMemoryRequirementsCount)); ++i) {
+                            transform_fromhost_VkVideoGetMemoryPropertiesKHR(
+                                m_state,
+                                (VkVideoGetMemoryPropertiesKHR*)(pVideoSessionMemoryRequirements +
+                                                                 i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_5 = (uint64_t)(uintptr_t)pVideoSessionMemoryRequirements;
                 vkStream->putBe64(cgen_var_5);
-                if (pVideoSessionMemoryRequirements)
-                {
-                    if (pVideoSessionMemoryRequirementsCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pVideoSessionMemoryRequirementsCount)); ++i)
-                        {
-                            marshal_VkVideoGetMemoryPropertiesKHR(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkVideoGetMemoryPropertiesKHR*)(pVideoSessionMemoryRequirements + i));
+                if (pVideoSessionMemoryRequirements) {
+                    if (pVideoSessionMemoryRequirementsCount) {
+                        for (uint32_t i = 0;
+                             i < (uint32_t)(*(pVideoSessionMemoryRequirementsCount)); ++i) {
+                            marshal_VkVideoGetMemoryPropertiesKHR(
+                                vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                (VkVideoGetMemoryPropertiesKHR*)(pVideoSessionMemoryRequirements +
+                                                                 i));
                         }
                     }
                 }
-                vkStream->write(&vkGetVideoSessionMemoryRequirementsKHR_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkGetVideoSessionMemoryRequirementsKHR_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetVideoSessionMemoryRequirementsKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetVideoSessionMemoryRequirementsKHR_VkResult_return, device, videoSession, pVideoSessionMemoryRequirementsCount, pVideoSessionMemoryRequirements);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetVideoSessionMemoryRequirementsKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetVideoSessionMemoryRequirementsKHR_VkResult_return, device,
+                        videoSession, pVideoSessionMemoryRequirementsCount,
+                        pVideoSessionMemoryRequirements);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkBindVideoSessionMemoryKHR:
-            {
+            case OP_vkBindVideoSessionMemoryKHR: {
                 android::base::beginTrace("vkBindVideoSessionMemoryKHR decode");
                 VkDevice device;
                 VkVideoSessionKHR videoSession;
@@ -12103,43 +13921,56 @@
                 memcpy((VkVideoSessionKHR*)&videoSession, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&videoSession);
                 *readStreamPtrPtr += 8;
-                memcpy((uint32_t*)&videoSessionBindMemoryCount, *readStreamPtrPtr, sizeof(uint32_t));
+                memcpy((uint32_t*)&videoSessionBindMemoryCount, *readStreamPtrPtr,
+                       sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pVideoSessionBindMemories, ((videoSessionBindMemoryCount)) * sizeof(const VkVideoBindMemoryKHR));
-                for (uint32_t i = 0; i < (uint32_t)((videoSessionBindMemoryCount)); ++i)
-                {
-                    reservedunmarshal_VkVideoBindMemoryKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkVideoBindMemoryKHR*)(pVideoSessionBindMemories + i), readStreamPtrPtr);
+                vkReadStream->alloc(
+                    (void**)&pVideoSessionBindMemories,
+                    ((videoSessionBindMemoryCount)) * sizeof(const VkVideoBindMemoryKHR));
+                for (uint32_t i = 0; i < (uint32_t)((videoSessionBindMemoryCount)); ++i) {
+                    reservedunmarshal_VkVideoBindMemoryKHR(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkVideoBindMemoryKHR*)(pVideoSessionBindMemories + i), readStreamPtrPtr);
                 }
-                if (pVideoSessionBindMemories)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((videoSessionBindMemoryCount)); ++i)
-                    {
-                        transform_tohost_VkVideoBindMemoryKHR(m_state, (VkVideoBindMemoryKHR*)(pVideoSessionBindMemories + i));
+                if (pVideoSessionBindMemories) {
+                    for (uint32_t i = 0; i < (uint32_t)((videoSessionBindMemoryCount)); ++i) {
+                        transform_tohost_VkVideoBindMemoryKHR(
+                            m_state, (VkVideoBindMemoryKHR*)(pVideoSessionBindMemories + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkBindVideoSessionMemoryKHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)videoSession, (unsigned long long)videoSessionBindMemoryCount, (unsigned long long)pVideoSessionBindMemories);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkBindVideoSessionMemoryKHR 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)videoSession,
+                            (unsigned long long)videoSessionBindMemoryCount,
+                            (unsigned long long)pVideoSessionBindMemories);
                 }
                 VkResult vkBindVideoSessionMemoryKHR_VkResult_return = (VkResult)0;
-                vkBindVideoSessionMemoryKHR_VkResult_return = vk->vkBindVideoSessionMemoryKHR(unboxed_device, videoSession, videoSessionBindMemoryCount, pVideoSessionBindMemories);
-                if ((vkBindVideoSessionMemoryKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkBindVideoSessionMemoryKHR_VkResult_return = vk->vkBindVideoSessionMemoryKHR(
+                    unboxed_device, videoSession, videoSessionBindMemoryCount,
+                    pVideoSessionBindMemories);
+                if ((vkBindVideoSessionMemoryKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkBindVideoSessionMemoryKHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkBindVideoSessionMemoryKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkBindVideoSessionMemoryKHR_VkResult_return, device, videoSession, videoSessionBindMemoryCount, pVideoSessionBindMemories);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkBindVideoSessionMemoryKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkBindVideoSessionMemoryKHR_VkResult_return, device, videoSession,
+                        videoSessionBindMemoryCount, pVideoSessionBindMemories);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCreateVideoSessionParametersKHR:
-            {
+            case OP_vkCreateVideoSessionParametersKHR: {
                 android::base::beginTrace("vkCreateVideoSessionParametersKHR decode");
                 VkDevice device;
                 const VkVideoSessionParametersCreateInfoKHR* pCreateInfo;
@@ -12153,56 +13984,73 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkVideoSessionParametersCreateInfoKHR));
-                reservedunmarshal_VkVideoSessionParametersCreateInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkVideoSessionParametersCreateInfoKHR*)(pCreateInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pCreateInfo,
+                                    sizeof(const VkVideoSessionParametersCreateInfoKHR));
+                reservedunmarshal_VkVideoSessionParametersCreateInfoKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkVideoSessionParametersCreateInfoKHR*)(pCreateInfo), readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pVideoSessionParameters;
                 vkReadStream->unsetHandleMapping();
-                vkReadStream->alloc((void**)&pVideoSessionParameters, sizeof(VkVideoSessionParametersKHR));
-                memcpy((VkVideoSessionParametersKHR*)&(*pVideoSessionParameters), (*readStreamPtrPtr), 8);
+                vkReadStream->alloc((void**)&pVideoSessionParameters,
+                                    sizeof(VkVideoSessionParametersKHR));
+                memcpy((VkVideoSessionParametersKHR*)&(*pVideoSessionParameters),
+                       (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&(*pVideoSessionParameters));
                 *readStreamPtrPtr += 8;
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkVideoSessionParametersCreateInfoKHR(m_state, (VkVideoSessionParametersCreateInfoKHR*)(pCreateInfo));
+                if (pCreateInfo) {
+                    transform_tohost_VkVideoSessionParametersCreateInfoKHR(
+                        m_state, (VkVideoSessionParametersCreateInfoKHR*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateVideoSessionParametersKHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pVideoSessionParameters);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateVideoSessionParametersKHR 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator,
+                            (unsigned long long)pVideoSessionParameters);
                 }
                 VkResult vkCreateVideoSessionParametersKHR_VkResult_return = (VkResult)0;
-                vkCreateVideoSessionParametersKHR_VkResult_return = vk->vkCreateVideoSessionParametersKHR(unboxed_device, pCreateInfo, pAllocator, pVideoSessionParameters);
-                if ((vkCreateVideoSessionParametersKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateVideoSessionParametersKHR_VkResult_return =
+                    vk->vkCreateVideoSessionParametersKHR(unboxed_device, pCreateInfo, pAllocator,
+                                                          pVideoSessionParameters);
+                if ((vkCreateVideoSessionParametersKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3 = (uint64_t)(*pVideoSessionParameters);
                 vkStream->putBe64(cgen_var_3);
-                vkStream->write(&vkCreateVideoSessionParametersKHR_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkCreateVideoSessionParametersKHR_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateVideoSessionParametersKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateVideoSessionParametersKHR_VkResult_return, device, pCreateInfo, pAllocator, pVideoSessionParameters);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateVideoSessionParametersKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateVideoSessionParametersKHR_VkResult_return, device, pCreateInfo,
+                        pAllocator, pVideoSessionParameters);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkUpdateVideoSessionParametersKHR:
-            {
+            case OP_vkUpdateVideoSessionParametersKHR: {
                 android::base::beginTrace("vkUpdateVideoSessionParametersKHR decode");
                 VkDevice device;
                 VkVideoSessionParametersKHR videoSessionParameters;
@@ -12215,38 +14063,53 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                memcpy((VkVideoSessionParametersKHR*)&videoSessionParameters, (*readStreamPtrPtr), 8);
+                memcpy((VkVideoSessionParametersKHR*)&videoSessionParameters, (*readStreamPtrPtr),
+                       8);
                 android::base::Stream::fromBe64((uint8_t*)&videoSessionParameters);
                 *readStreamPtrPtr += 8;
-                vkReadStream->alloc((void**)&pUpdateInfo, sizeof(const VkVideoSessionParametersUpdateInfoKHR));
-                reservedunmarshal_VkVideoSessionParametersUpdateInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkVideoSessionParametersUpdateInfoKHR*)(pUpdateInfo), readStreamPtrPtr);
-                if (pUpdateInfo)
-                {
-                    transform_tohost_VkVideoSessionParametersUpdateInfoKHR(m_state, (VkVideoSessionParametersUpdateInfoKHR*)(pUpdateInfo));
+                vkReadStream->alloc((void**)&pUpdateInfo,
+                                    sizeof(const VkVideoSessionParametersUpdateInfoKHR));
+                reservedunmarshal_VkVideoSessionParametersUpdateInfoKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkVideoSessionParametersUpdateInfoKHR*)(pUpdateInfo), readStreamPtrPtr);
+                if (pUpdateInfo) {
+                    transform_tohost_VkVideoSessionParametersUpdateInfoKHR(
+                        m_state, (VkVideoSessionParametersUpdateInfoKHR*)(pUpdateInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkUpdateVideoSessionParametersKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)videoSessionParameters, (unsigned long long)pUpdateInfo);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkUpdateVideoSessionParametersKHR 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device,
+                        (unsigned long long)videoSessionParameters,
+                        (unsigned long long)pUpdateInfo);
                 }
                 VkResult vkUpdateVideoSessionParametersKHR_VkResult_return = (VkResult)0;
-                vkUpdateVideoSessionParametersKHR_VkResult_return = vk->vkUpdateVideoSessionParametersKHR(unboxed_device, videoSessionParameters, pUpdateInfo);
-                if ((vkUpdateVideoSessionParametersKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkUpdateVideoSessionParametersKHR_VkResult_return =
+                    vk->vkUpdateVideoSessionParametersKHR(unboxed_device, videoSessionParameters,
+                                                          pUpdateInfo);
+                if ((vkUpdateVideoSessionParametersKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                vkStream->write(&vkUpdateVideoSessionParametersKHR_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkUpdateVideoSessionParametersKHR_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkUpdateVideoSessionParametersKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkUpdateVideoSessionParametersKHR_VkResult_return, device, videoSessionParameters, pUpdateInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkUpdateVideoSessionParametersKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkUpdateVideoSessionParametersKHR_VkResult_return, device,
+                        videoSessionParameters, pUpdateInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroyVideoSessionParametersKHR:
-            {
+            case OP_vkDestroyVideoSessionParametersKHR: {
                 android::base::beginTrace("vkDestroyVideoSessionParametersKHR decode");
                 VkDevice device;
                 VkVideoSessionParametersKHR videoSessionParameters;
@@ -12259,41 +14122,50 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                memcpy((VkVideoSessionParametersKHR*)&videoSessionParameters, (*readStreamPtrPtr), 8);
+                memcpy((VkVideoSessionParametersKHR*)&videoSessionParameters, (*readStreamPtrPtr),
+                       8);
                 android::base::Stream::fromBe64((uint8_t*)&videoSessionParameters);
                 *readStreamPtrPtr += 8;
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroyVideoSessionParametersKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)videoSessionParameters, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkDestroyVideoSessionParametersKHR 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)device,
+                            (unsigned long long)videoSessionParameters,
+                            (unsigned long long)pAllocator);
                 }
-                vk->vkDestroyVideoSessionParametersKHR(unboxed_device, videoSessionParameters, pAllocator);
+                vk->vkDestroyVideoSessionParametersKHR(unboxed_device, videoSessionParameters,
+                                                       pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroyVideoSessionParametersKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, videoSessionParameters, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroyVideoSessionParametersKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device,
+                        videoSessionParameters, pAllocator);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdBeginVideoCodingKHR:
-            {
+            case OP_vkCmdBeginVideoCodingKHR: {
                 android::base::beginTrace("vkCmdBeginVideoCodingKHR decode");
                 VkCommandBuffer commandBuffer;
                 const VkVideoBeginCodingInfoKHR* pBeginInfo;
@@ -12301,35 +14173,40 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 vkReadStream->alloc((void**)&pBeginInfo, sizeof(const VkVideoBeginCodingInfoKHR));
-                reservedunmarshal_VkVideoBeginCodingInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkVideoBeginCodingInfoKHR*)(pBeginInfo), readStreamPtrPtr);
-                if (pBeginInfo)
-                {
-                    transform_tohost_VkVideoBeginCodingInfoKHR(m_state, (VkVideoBeginCodingInfoKHR*)(pBeginInfo));
+                reservedunmarshal_VkVideoBeginCodingInfoKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkVideoBeginCodingInfoKHR*)(pBeginInfo), readStreamPtrPtr);
+                if (pBeginInfo) {
+                    transform_tohost_VkVideoBeginCodingInfoKHR(
+                        m_state, (VkVideoBeginCodingInfoKHR*)(pBeginInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdBeginVideoCodingKHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pBeginInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdBeginVideoCodingKHR 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pBeginInfo);
                 }
                 vk->vkCmdBeginVideoCodingKHR(unboxed_commandBuffer, pBeginInfo);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdBeginVideoCodingKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pBeginInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdBeginVideoCodingKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pBeginInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdEndVideoCodingKHR:
-            {
+            case OP_vkCmdEndVideoCodingKHR: {
                 android::base::beginTrace("vkCmdEndVideoCodingKHR decode");
                 VkCommandBuffer commandBuffer;
                 const VkVideoEndCodingInfoKHR* pEndCodingInfo;
@@ -12337,35 +14214,41 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 vkReadStream->alloc((void**)&pEndCodingInfo, sizeof(const VkVideoEndCodingInfoKHR));
-                reservedunmarshal_VkVideoEndCodingInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkVideoEndCodingInfoKHR*)(pEndCodingInfo), readStreamPtrPtr);
-                if (pEndCodingInfo)
-                {
-                    transform_tohost_VkVideoEndCodingInfoKHR(m_state, (VkVideoEndCodingInfoKHR*)(pEndCodingInfo));
+                reservedunmarshal_VkVideoEndCodingInfoKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkVideoEndCodingInfoKHR*)(pEndCodingInfo), readStreamPtrPtr);
+                if (pEndCodingInfo) {
+                    transform_tohost_VkVideoEndCodingInfoKHR(
+                        m_state, (VkVideoEndCodingInfoKHR*)(pEndCodingInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdEndVideoCodingKHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pEndCodingInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdEndVideoCodingKHR 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pEndCodingInfo);
                 }
                 vk->vkCmdEndVideoCodingKHR(unboxed_commandBuffer, pEndCodingInfo);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdEndVideoCodingKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pEndCodingInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdEndVideoCodingKHR(snapshotTraceBegin,
+                                                                snapshotTraceBytes, &m_pool,
+                                                                commandBuffer, pEndCodingInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdControlVideoCodingKHR:
-            {
+            case OP_vkCmdControlVideoCodingKHR: {
                 android::base::beginTrace("vkCmdControlVideoCodingKHR decode");
                 VkCommandBuffer commandBuffer;
                 const VkVideoCodingControlInfoKHR* pCodingControlInfo;
@@ -12373,37 +14256,44 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
-                vkReadStream->alloc((void**)&pCodingControlInfo, sizeof(const VkVideoCodingControlInfoKHR));
-                reservedunmarshal_VkVideoCodingControlInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkVideoCodingControlInfoKHR*)(pCodingControlInfo), readStreamPtrPtr);
-                if (pCodingControlInfo)
-                {
-                    transform_tohost_VkVideoCodingControlInfoKHR(m_state, (VkVideoCodingControlInfoKHR*)(pCodingControlInfo));
+                vkReadStream->alloc((void**)&pCodingControlInfo,
+                                    sizeof(const VkVideoCodingControlInfoKHR));
+                reservedunmarshal_VkVideoCodingControlInfoKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkVideoCodingControlInfoKHR*)(pCodingControlInfo), readStreamPtrPtr);
+                if (pCodingControlInfo) {
+                    transform_tohost_VkVideoCodingControlInfoKHR(
+                        m_state, (VkVideoCodingControlInfoKHR*)(pCodingControlInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdControlVideoCodingKHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pCodingControlInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdControlVideoCodingKHR 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pCodingControlInfo);
                 }
                 vk->vkCmdControlVideoCodingKHR(unboxed_commandBuffer, pCodingControlInfo);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdControlVideoCodingKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pCodingControlInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdControlVideoCodingKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        pCodingControlInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_KHR_video_decode_queue
-            case OP_vkCmdDecodeVideoKHR:
-            {
+            case OP_vkCmdDecodeVideoKHR: {
                 android::base::beginTrace("vkCmdDecodeVideoKHR decode");
                 VkCommandBuffer commandBuffer;
                 const VkVideoDecodeInfoKHR* pFrameInfo;
@@ -12411,37 +14301,42 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 vkReadStream->alloc((void**)&pFrameInfo, sizeof(const VkVideoDecodeInfoKHR));
-                reservedunmarshal_VkVideoDecodeInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkVideoDecodeInfoKHR*)(pFrameInfo), readStreamPtrPtr);
-                if (pFrameInfo)
-                {
-                    transform_tohost_VkVideoDecodeInfoKHR(m_state, (VkVideoDecodeInfoKHR*)(pFrameInfo));
+                reservedunmarshal_VkVideoDecodeInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                       (VkVideoDecodeInfoKHR*)(pFrameInfo),
+                                                       readStreamPtrPtr);
+                if (pFrameInfo) {
+                    transform_tohost_VkVideoDecodeInfoKHR(m_state,
+                                                          (VkVideoDecodeInfoKHR*)(pFrameInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdDecodeVideoKHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pFrameInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdDecodeVideoKHR 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pFrameInfo);
                 }
                 vk->vkCmdDecodeVideoKHR(unboxed_commandBuffer, pFrameInfo);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdDecodeVideoKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pFrameInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdDecodeVideoKHR(snapshotTraceBegin, snapshotTraceBytes,
+                                                             &m_pool, commandBuffer, pFrameInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_KHR_dynamic_rendering
-            case OP_vkCmdBeginRenderingKHR:
-            {
+            case OP_vkCmdBeginRenderingKHR: {
                 android::base::beginTrace("vkCmdBeginRenderingKHR decode");
                 VkCommandBuffer commandBuffer;
                 const VkRenderingInfoKHR* pRenderingInfo;
@@ -12449,59 +14344,68 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 vkReadStream->alloc((void**)&pRenderingInfo, sizeof(const VkRenderingInfoKHR));
-                reservedunmarshal_VkRenderingInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRenderingInfoKHR*)(pRenderingInfo), readStreamPtrPtr);
-                if (pRenderingInfo)
-                {
-                    transform_tohost_VkRenderingInfoKHR(m_state, (VkRenderingInfoKHR*)(pRenderingInfo));
+                reservedunmarshal_VkRenderingInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                     (VkRenderingInfoKHR*)(pRenderingInfo),
+                                                     readStreamPtrPtr);
+                if (pRenderingInfo) {
+                    transform_tohost_VkRenderingInfoKHR(m_state,
+                                                        (VkRenderingInfoKHR*)(pRenderingInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdBeginRenderingKHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pRenderingInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdBeginRenderingKHR 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pRenderingInfo);
                 }
                 vk->vkCmdBeginRenderingKHR(unboxed_commandBuffer, pRenderingInfo);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdBeginRenderingKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pRenderingInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdBeginRenderingKHR(snapshotTraceBegin,
+                                                                snapshotTraceBytes, &m_pool,
+                                                                commandBuffer, pRenderingInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdEndRenderingKHR:
-            {
+            case OP_vkCmdEndRenderingKHR: {
                 android::base::beginTrace("vkCmdEndRenderingKHR decode");
                 VkCommandBuffer commandBuffer;
                 // Begin non wrapped dispatchable handle unboxing for commandBuffer;
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdEndRenderingKHR 0x%llx \n", ioStream, (unsigned long long)commandBuffer);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdEndRenderingKHR 0x%llx \n", ioStream,
+                            (unsigned long long)commandBuffer);
                 }
                 vk->vkCmdEndRenderingKHR(unboxed_commandBuffer);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdEndRenderingKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdEndRenderingKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -12509,8 +14413,7 @@
 #ifdef VK_KHR_multiview
 #endif
 #ifdef VK_KHR_get_physical_device_properties2
-            case OP_vkGetPhysicalDeviceFeatures2KHR:
-            {
+            case OP_vkGetPhysicalDeviceFeatures2KHR: {
                 android::base::beginTrace("vkGetPhysicalDeviceFeatures2KHR decode");
                 VkPhysicalDevice physicalDevice;
                 VkPhysicalDeviceFeatures2* pFeatures;
@@ -12518,40 +14421,47 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 // Begin manual dispatchable handle unboxing for pFeatures;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pFeatures, sizeof(VkPhysicalDeviceFeatures2));
-                reservedunmarshal_VkPhysicalDeviceFeatures2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceFeatures2*)(pFeatures), readStreamPtrPtr);
-                if (pFeatures)
-                {
-                    transform_tohost_VkPhysicalDeviceFeatures2(m_state, (VkPhysicalDeviceFeatures2*)(pFeatures));
+                reservedunmarshal_VkPhysicalDeviceFeatures2(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPhysicalDeviceFeatures2*)(pFeatures), readStreamPtrPtr);
+                if (pFeatures) {
+                    transform_tohost_VkPhysicalDeviceFeatures2(
+                        m_state, (VkPhysicalDeviceFeatures2*)(pFeatures));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceFeatures2KHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pFeatures);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceFeatures2KHR 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)pFeatures);
                 }
                 m_state->on_vkGetPhysicalDeviceFeatures2KHR(&m_pool, physicalDevice, pFeatures);
                 vkStream->unsetHandleMapping();
-                if (pFeatures)
-                {
-                    transform_fromhost_VkPhysicalDeviceFeatures2(m_state, (VkPhysicalDeviceFeatures2*)(pFeatures));
+                if (pFeatures) {
+                    transform_fromhost_VkPhysicalDeviceFeatures2(
+                        m_state, (VkPhysicalDeviceFeatures2*)(pFeatures));
                 }
-                marshal_VkPhysicalDeviceFeatures2(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceFeatures2*)(pFeatures));
+                marshal_VkPhysicalDeviceFeatures2(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                  (VkPhysicalDeviceFeatures2*)(pFeatures));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceFeatures2KHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice, pFeatures);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceFeatures2KHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice, pFeatures);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceProperties2KHR:
-            {
+            case OP_vkGetPhysicalDeviceProperties2KHR: {
                 android::base::beginTrace("vkGetPhysicalDeviceProperties2KHR decode");
                 VkPhysicalDevice physicalDevice;
                 VkPhysicalDeviceProperties2* pProperties;
@@ -12559,40 +14469,48 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 // Begin manual dispatchable handle unboxing for pProperties;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pProperties, sizeof(VkPhysicalDeviceProperties2));
-                reservedunmarshal_VkPhysicalDeviceProperties2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceProperties2*)(pProperties), readStreamPtrPtr);
-                if (pProperties)
-                {
-                    transform_tohost_VkPhysicalDeviceProperties2(m_state, (VkPhysicalDeviceProperties2*)(pProperties));
+                reservedunmarshal_VkPhysicalDeviceProperties2(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPhysicalDeviceProperties2*)(pProperties), readStreamPtrPtr);
+                if (pProperties) {
+                    transform_tohost_VkPhysicalDeviceProperties2(
+                        m_state, (VkPhysicalDeviceProperties2*)(pProperties));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceProperties2KHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceProperties2KHR 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)pProperties);
                 }
                 m_state->on_vkGetPhysicalDeviceProperties2KHR(&m_pool, physicalDevice, pProperties);
                 vkStream->unsetHandleMapping();
-                if (pProperties)
-                {
-                    transform_fromhost_VkPhysicalDeviceProperties2(m_state, (VkPhysicalDeviceProperties2*)(pProperties));
+                if (pProperties) {
+                    transform_fromhost_VkPhysicalDeviceProperties2(
+                        m_state, (VkPhysicalDeviceProperties2*)(pProperties));
                 }
-                marshal_VkPhysicalDeviceProperties2(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceProperties2*)(pProperties));
+                marshal_VkPhysicalDeviceProperties2(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                    (VkPhysicalDeviceProperties2*)(pProperties));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceProperties2KHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice, pProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceProperties2KHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice,
+                        pProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceFormatProperties2KHR:
-            {
+            case OP_vkGetPhysicalDeviceFormatProperties2KHR: {
                 android::base::beginTrace("vkGetPhysicalDeviceFormatProperties2KHR decode");
                 VkPhysicalDevice physicalDevice;
                 VkFormat format;
@@ -12601,42 +14519,52 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 memcpy((VkFormat*)&format, *readStreamPtrPtr, sizeof(VkFormat));
                 *readStreamPtrPtr += sizeof(VkFormat);
                 // Begin manual dispatchable handle unboxing for pFormatProperties;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pFormatProperties, sizeof(VkFormatProperties2));
-                reservedunmarshal_VkFormatProperties2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkFormatProperties2*)(pFormatProperties), readStreamPtrPtr);
-                if (pFormatProperties)
-                {
-                    transform_tohost_VkFormatProperties2(m_state, (VkFormatProperties2*)(pFormatProperties));
+                reservedunmarshal_VkFormatProperties2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                      (VkFormatProperties2*)(pFormatProperties),
+                                                      readStreamPtrPtr);
+                if (pFormatProperties) {
+                    transform_tohost_VkFormatProperties2(m_state,
+                                                         (VkFormatProperties2*)(pFormatProperties));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceFormatProperties2KHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)format, (unsigned long long)pFormatProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceFormatProperties2KHR 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)format, (unsigned long long)pFormatProperties);
                 }
-                m_state->on_vkGetPhysicalDeviceFormatProperties2KHR(&m_pool, physicalDevice, format, pFormatProperties);
+                m_state->on_vkGetPhysicalDeviceFormatProperties2KHR(&m_pool, physicalDevice, format,
+                                                                    pFormatProperties);
                 vkStream->unsetHandleMapping();
-                if (pFormatProperties)
-                {
-                    transform_fromhost_VkFormatProperties2(m_state, (VkFormatProperties2*)(pFormatProperties));
+                if (pFormatProperties) {
+                    transform_fromhost_VkFormatProperties2(
+                        m_state, (VkFormatProperties2*)(pFormatProperties));
                 }
-                marshal_VkFormatProperties2(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkFormatProperties2*)(pFormatProperties));
+                marshal_VkFormatProperties2(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                            (VkFormatProperties2*)(pFormatProperties));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceFormatProperties2KHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice, format, pFormatProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceFormatProperties2KHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice, format,
+                        pFormatProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceImageFormatProperties2KHR:
-            {
+            case OP_vkGetPhysicalDeviceImageFormatProperties2KHR: {
                 android::base::beginTrace("vkGetPhysicalDeviceImageFormatProperties2KHR decode");
                 VkPhysicalDevice physicalDevice;
                 const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo;
@@ -12645,49 +14573,70 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
-                vkReadStream->alloc((void**)&pImageFormatInfo, sizeof(const VkPhysicalDeviceImageFormatInfo2));
-                reservedunmarshal_VkPhysicalDeviceImageFormatInfo2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceImageFormatInfo2*)(pImageFormatInfo), readStreamPtrPtr);
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                vkReadStream->alloc((void**)&pImageFormatInfo,
+                                    sizeof(const VkPhysicalDeviceImageFormatInfo2));
+                reservedunmarshal_VkPhysicalDeviceImageFormatInfo2(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPhysicalDeviceImageFormatInfo2*)(pImageFormatInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pImageFormatProperties;
                 vkReadStream->unsetHandleMapping();
-                vkReadStream->alloc((void**)&pImageFormatProperties, sizeof(VkImageFormatProperties2));
-                reservedunmarshal_VkImageFormatProperties2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageFormatProperties2*)(pImageFormatProperties), readStreamPtrPtr);
-                if (pImageFormatInfo)
-                {
-                    transform_tohost_VkPhysicalDeviceImageFormatInfo2(m_state, (VkPhysicalDeviceImageFormatInfo2*)(pImageFormatInfo));
+                vkReadStream->alloc((void**)&pImageFormatProperties,
+                                    sizeof(VkImageFormatProperties2));
+                reservedunmarshal_VkImageFormatProperties2(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkImageFormatProperties2*)(pImageFormatProperties), readStreamPtrPtr);
+                if (pImageFormatInfo) {
+                    transform_tohost_VkPhysicalDeviceImageFormatInfo2(
+                        m_state, (VkPhysicalDeviceImageFormatInfo2*)(pImageFormatInfo));
                 }
-                if (pImageFormatProperties)
-                {
-                    transform_tohost_VkImageFormatProperties2(m_state, (VkImageFormatProperties2*)(pImageFormatProperties));
+                if (pImageFormatProperties) {
+                    transform_tohost_VkImageFormatProperties2(
+                        m_state, (VkImageFormatProperties2*)(pImageFormatProperties));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceImageFormatProperties2KHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pImageFormatInfo, (unsigned long long)pImageFormatProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceImageFormatProperties2KHR 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)pImageFormatInfo,
+                            (unsigned long long)pImageFormatProperties);
                 }
                 VkResult vkGetPhysicalDeviceImageFormatProperties2KHR_VkResult_return = (VkResult)0;
-                vkGetPhysicalDeviceImageFormatProperties2KHR_VkResult_return = m_state->on_vkGetPhysicalDeviceImageFormatProperties2KHR(&m_pool, physicalDevice, pImageFormatInfo, pImageFormatProperties);
-                if ((vkGetPhysicalDeviceImageFormatProperties2KHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetPhysicalDeviceImageFormatProperties2KHR_VkResult_return =
+                    m_state->on_vkGetPhysicalDeviceImageFormatProperties2KHR(
+                        &m_pool, physicalDevice, pImageFormatInfo, pImageFormatProperties);
+                if ((vkGetPhysicalDeviceImageFormatProperties2KHR_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                if (pImageFormatProperties)
-                {
-                    transform_fromhost_VkImageFormatProperties2(m_state, (VkImageFormatProperties2*)(pImageFormatProperties));
+                if (pImageFormatProperties) {
+                    transform_fromhost_VkImageFormatProperties2(
+                        m_state, (VkImageFormatProperties2*)(pImageFormatProperties));
                 }
-                marshal_VkImageFormatProperties2(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageFormatProperties2*)(pImageFormatProperties));
-                vkStream->write(&vkGetPhysicalDeviceImageFormatProperties2KHR_VkResult_return, sizeof(VkResult));
+                marshal_VkImageFormatProperties2(
+                    vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkImageFormatProperties2*)(pImageFormatProperties));
+                vkStream->write(&vkGetPhysicalDeviceImageFormatProperties2KHR_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceImageFormatProperties2KHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetPhysicalDeviceImageFormatProperties2KHR_VkResult_return, physicalDevice, pImageFormatInfo, pImageFormatProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceImageFormatProperties2KHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetPhysicalDeviceImageFormatProperties2KHR_VkResult_return,
+                        physicalDevice, pImageFormatInfo, pImageFormatProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceQueueFamilyProperties2KHR:
-            {
+            case OP_vkGetPhysicalDeviceQueueFamilyProperties2KHR: {
                 android::base::beginTrace("vkGetPhysicalDeviceQueueFamilyProperties2KHR decode");
                 VkPhysicalDevice physicalDevice;
                 uint32_t* pQueueFamilyPropertyCount;
@@ -12696,7 +14645,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
@@ -12706,10 +14656,10 @@
                 memcpy((uint32_t**)&pQueueFamilyPropertyCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pQueueFamilyPropertyCount);
                 *readStreamPtrPtr += 8;
-                if (pQueueFamilyPropertyCount)
-                {
+                if (pQueueFamilyPropertyCount) {
                     vkReadStream->alloc((void**)&pQueueFamilyPropertyCount, sizeof(uint32_t));
-                    memcpy((uint32_t*)pQueueFamilyPropertyCount, *readStreamPtrPtr, sizeof(uint32_t));
+                    memcpy((uint32_t*)pQueueFamilyPropertyCount, *readStreamPtrPtr,
+                           sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
                 }
                 // Begin manual dispatchable handle unboxing for pQueueFamilyProperties;
@@ -12718,74 +14668,78 @@
                 memcpy((VkQueueFamilyProperties2**)&pQueueFamilyProperties, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pQueueFamilyProperties);
                 *readStreamPtrPtr += 8;
-                if (pQueueFamilyProperties)
-                {
-                    vkReadStream->alloc((void**)&pQueueFamilyProperties, (*(pQueueFamilyPropertyCount)) * sizeof(VkQueueFamilyProperties2));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i)
-                    {
-                        reservedunmarshal_VkQueueFamilyProperties2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i), readStreamPtrPtr);
+                if (pQueueFamilyProperties) {
+                    vkReadStream->alloc(
+                        (void**)&pQueueFamilyProperties,
+                        (*(pQueueFamilyPropertyCount)) * sizeof(VkQueueFamilyProperties2));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i) {
+                        reservedunmarshal_VkQueueFamilyProperties2(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i),
+                            readStreamPtrPtr);
                     }
                 }
-                if (pQueueFamilyPropertyCount)
-                {
-                    if (pQueueFamilyProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i)
-                        {
-                            transform_tohost_VkQueueFamilyProperties2(m_state, (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i));
+                if (pQueueFamilyPropertyCount) {
+                    if (pQueueFamilyProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i) {
+                            transform_tohost_VkQueueFamilyProperties2(
+                                m_state, (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceQueueFamilyProperties2KHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pQueueFamilyPropertyCount, (unsigned long long)pQueueFamilyProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceQueueFamilyProperties2KHR 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)pQueueFamilyPropertyCount,
+                            (unsigned long long)pQueueFamilyProperties);
                 }
-                vk->vkGetPhysicalDeviceQueueFamilyProperties2KHR(unboxed_physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
+                vk->vkGetPhysicalDeviceQueueFamilyProperties2KHR(
+                    unboxed_physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pQueueFamilyPropertyCount;
                 vkStream->putBe64(cgen_var_3);
-                if (pQueueFamilyPropertyCount)
-                {
+                if (pQueueFamilyPropertyCount) {
                     vkStream->write((uint32_t*)pQueueFamilyPropertyCount, sizeof(uint32_t));
                 }
-                if (pQueueFamilyPropertyCount)
-                {
-                    if (pQueueFamilyProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i)
-                        {
-                            transform_fromhost_VkQueueFamilyProperties2(m_state, (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i));
+                if (pQueueFamilyPropertyCount) {
+                    if (pQueueFamilyProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i) {
+                            transform_fromhost_VkQueueFamilyProperties2(
+                                m_state, (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pQueueFamilyProperties;
                 vkStream->putBe64(cgen_var_4);
-                if (pQueueFamilyProperties)
-                {
-                    if (pQueueFamilyPropertyCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i)
-                        {
-                            marshal_VkQueueFamilyProperties2(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i));
+                if (pQueueFamilyProperties) {
+                    if (pQueueFamilyPropertyCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i) {
+                            marshal_VkQueueFamilyProperties2(
+                                vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i));
                         }
                     }
                 }
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceQueueFamilyProperties2KHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceQueueFamilyProperties2KHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice,
+                        pQueueFamilyPropertyCount, pQueueFamilyProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceMemoryProperties2KHR:
-            {
+            case OP_vkGetPhysicalDeviceMemoryProperties2KHR: {
                 android::base::beginTrace("vkGetPhysicalDeviceMemoryProperties2KHR decode");
                 VkPhysicalDevice physicalDevice;
                 VkPhysicalDeviceMemoryProperties2* pMemoryProperties;
@@ -12793,41 +14747,54 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 // Begin manual dispatchable handle unboxing for pMemoryProperties;
                 vkReadStream->unsetHandleMapping();
-                vkReadStream->alloc((void**)&pMemoryProperties, sizeof(VkPhysicalDeviceMemoryProperties2));
-                reservedunmarshal_VkPhysicalDeviceMemoryProperties2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties), readStreamPtrPtr);
-                if (pMemoryProperties)
-                {
-                    transform_tohost_VkPhysicalDeviceMemoryProperties2(m_state, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties));
+                vkReadStream->alloc((void**)&pMemoryProperties,
+                                    sizeof(VkPhysicalDeviceMemoryProperties2));
+                reservedunmarshal_VkPhysicalDeviceMemoryProperties2(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties), readStreamPtrPtr);
+                if (pMemoryProperties) {
+                    transform_tohost_VkPhysicalDeviceMemoryProperties2(
+                        m_state, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceMemoryProperties2KHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pMemoryProperties);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkGetPhysicalDeviceMemoryProperties2KHR 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)physicalDevice,
+                        (unsigned long long)pMemoryProperties);
                 }
-                m_state->on_vkGetPhysicalDeviceMemoryProperties2KHR(&m_pool, physicalDevice, pMemoryProperties);
+                m_state->on_vkGetPhysicalDeviceMemoryProperties2KHR(&m_pool, physicalDevice,
+                                                                    pMemoryProperties);
                 vkStream->unsetHandleMapping();
-                if (pMemoryProperties)
-                {
-                    transform_fromhost_VkPhysicalDeviceMemoryProperties2(m_state, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties));
+                if (pMemoryProperties) {
+                    transform_fromhost_VkPhysicalDeviceMemoryProperties2(
+                        m_state, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties));
                 }
-                marshal_VkPhysicalDeviceMemoryProperties2(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties));
+                marshal_VkPhysicalDeviceMemoryProperties2(
+                    vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceMemoryProperties2KHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice, pMemoryProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceMemoryProperties2KHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice,
+                        pMemoryProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceSparseImageFormatProperties2KHR:
-            {
-                android::base::beginTrace("vkGetPhysicalDeviceSparseImageFormatProperties2KHR decode");
+            case OP_vkGetPhysicalDeviceSparseImageFormatProperties2KHR: {
+                android::base::beginTrace(
+                    "vkGetPhysicalDeviceSparseImageFormatProperties2KHR decode");
                 VkPhysicalDevice physicalDevice;
                 const VkPhysicalDeviceSparseImageFormatInfo2* pFormatInfo;
                 uint32_t* pPropertyCount;
@@ -12836,20 +14803,23 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
-                vkReadStream->alloc((void**)&pFormatInfo, sizeof(const VkPhysicalDeviceSparseImageFormatInfo2));
-                reservedunmarshal_VkPhysicalDeviceSparseImageFormatInfo2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceSparseImageFormatInfo2*)(pFormatInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pFormatInfo,
+                                    sizeof(const VkPhysicalDeviceSparseImageFormatInfo2));
+                reservedunmarshal_VkPhysicalDeviceSparseImageFormatInfo2(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPhysicalDeviceSparseImageFormatInfo2*)(pFormatInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pPropertyCount;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 memcpy((uint32_t**)&pPropertyCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pPropertyCount);
                 *readStreamPtrPtr += 8;
-                if (pPropertyCount)
-                {
+                if (pPropertyCount) {
                     vkReadStream->alloc((void**)&pPropertyCount, sizeof(uint32_t));
                     memcpy((uint32_t*)pPropertyCount, *readStreamPtrPtr, sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
@@ -12860,80 +14830,83 @@
                 memcpy((VkSparseImageFormatProperties2**)&pProperties, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pProperties);
                 *readStreamPtrPtr += 8;
-                if (pProperties)
-                {
-                    vkReadStream->alloc((void**)&pProperties, (*(pPropertyCount)) * sizeof(VkSparseImageFormatProperties2));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                    {
-                        reservedunmarshal_VkSparseImageFormatProperties2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSparseImageFormatProperties2*)(pProperties + i), readStreamPtrPtr);
+                if (pProperties) {
+                    vkReadStream->alloc(
+                        (void**)&pProperties,
+                        (*(pPropertyCount)) * sizeof(VkSparseImageFormatProperties2));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                        reservedunmarshal_VkSparseImageFormatProperties2(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkSparseImageFormatProperties2*)(pProperties + i), readStreamPtrPtr);
                     }
                 }
-                if (pFormatInfo)
-                {
-                    transform_tohost_VkPhysicalDeviceSparseImageFormatInfo2(m_state, (VkPhysicalDeviceSparseImageFormatInfo2*)(pFormatInfo));
+                if (pFormatInfo) {
+                    transform_tohost_VkPhysicalDeviceSparseImageFormatInfo2(
+                        m_state, (VkPhysicalDeviceSparseImageFormatInfo2*)(pFormatInfo));
                 }
-                if (pPropertyCount)
-                {
-                    if (pProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            transform_tohost_VkSparseImageFormatProperties2(m_state, (VkSparseImageFormatProperties2*)(pProperties + i));
+                if (pPropertyCount) {
+                    if (pProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            transform_tohost_VkSparseImageFormatProperties2(
+                                m_state, (VkSparseImageFormatProperties2*)(pProperties + i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceSparseImageFormatProperties2KHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pFormatInfo, (unsigned long long)pPropertyCount, (unsigned long long)pProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceSparseImageFormatProperties2KHR "
+                            "0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)pFormatInfo, (unsigned long long)pPropertyCount,
+                            (unsigned long long)pProperties);
                 }
-                vk->vkGetPhysicalDeviceSparseImageFormatProperties2KHR(unboxed_physicalDevice, pFormatInfo, pPropertyCount, pProperties);
+                vk->vkGetPhysicalDeviceSparseImageFormatProperties2KHR(
+                    unboxed_physicalDevice, pFormatInfo, pPropertyCount, pProperties);
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pPropertyCount;
                 vkStream->putBe64(cgen_var_3);
-                if (pPropertyCount)
-                {
+                if (pPropertyCount) {
                     vkStream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
                 }
-                if (pPropertyCount)
-                {
-                    if (pProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            transform_fromhost_VkSparseImageFormatProperties2(m_state, (VkSparseImageFormatProperties2*)(pProperties + i));
+                if (pPropertyCount) {
+                    if (pProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            transform_fromhost_VkSparseImageFormatProperties2(
+                                m_state, (VkSparseImageFormatProperties2*)(pProperties + i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pProperties;
                 vkStream->putBe64(cgen_var_4);
-                if (pProperties)
-                {
-                    if (pPropertyCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            marshal_VkSparseImageFormatProperties2(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSparseImageFormatProperties2*)(pProperties + i));
+                if (pProperties) {
+                    if (pPropertyCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            marshal_VkSparseImageFormatProperties2(
+                                vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                (VkSparseImageFormatProperties2*)(pProperties + i));
                         }
                     }
                 }
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceSparseImageFormatProperties2KHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice, pFormatInfo, pPropertyCount, pProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceSparseImageFormatProperties2KHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice,
+                        pFormatInfo, pPropertyCount, pProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_KHR_device_group
-            case OP_vkGetDeviceGroupPeerMemoryFeaturesKHR:
-            {
+            case OP_vkGetDeviceGroupPeerMemoryFeaturesKHR: {
                 android::base::beginTrace("vkGetDeviceGroupPeerMemoryFeaturesKHR decode");
                 VkDevice device;
                 uint32_t heapIndex;
@@ -12957,29 +14930,40 @@
                 // Begin manual dispatchable handle unboxing for pPeerMemoryFeatures;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pPeerMemoryFeatures, sizeof(VkPeerMemoryFeatureFlags));
-                memcpy((VkPeerMemoryFeatureFlags*)pPeerMemoryFeatures, *readStreamPtrPtr, sizeof(VkPeerMemoryFeatureFlags));
+                memcpy((VkPeerMemoryFeatureFlags*)pPeerMemoryFeatures, *readStreamPtrPtr,
+                       sizeof(VkPeerMemoryFeatureFlags));
                 *readStreamPtrPtr += sizeof(VkPeerMemoryFeatureFlags);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetDeviceGroupPeerMemoryFeaturesKHR 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)heapIndex, (unsigned long long)localDeviceIndex, (unsigned long long)remoteDeviceIndex, (unsigned long long)pPeerMemoryFeatures);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetDeviceGroupPeerMemoryFeaturesKHR 0x%llx 0x%llx "
+                            "0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)heapIndex,
+                            (unsigned long long)localDeviceIndex,
+                            (unsigned long long)remoteDeviceIndex,
+                            (unsigned long long)pPeerMemoryFeatures);
                 }
-                vk->vkGetDeviceGroupPeerMemoryFeaturesKHR(unboxed_device, heapIndex, localDeviceIndex, remoteDeviceIndex, pPeerMemoryFeatures);
+                vk->vkGetDeviceGroupPeerMemoryFeaturesKHR(unboxed_device, heapIndex,
+                                                          localDeviceIndex, remoteDeviceIndex,
+                                                          pPeerMemoryFeatures);
                 vkStream->unsetHandleMapping();
-                vkStream->write((VkPeerMemoryFeatureFlags*)pPeerMemoryFeatures, sizeof(VkPeerMemoryFeatureFlags));
+                vkStream->write((VkPeerMemoryFeatureFlags*)pPeerMemoryFeatures,
+                                sizeof(VkPeerMemoryFeatureFlags));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetDeviceGroupPeerMemoryFeaturesKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, heapIndex, localDeviceIndex, remoteDeviceIndex, pPeerMemoryFeatures);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetDeviceGroupPeerMemoryFeaturesKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, heapIndex,
+                        localDeviceIndex, remoteDeviceIndex, pPeerMemoryFeatures);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetDeviceMaskKHR:
-            {
+            case OP_vkCmdSetDeviceMaskKHR: {
                 android::base::beginTrace("vkCmdSetDeviceMaskKHR decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t deviceMask;
@@ -12987,31 +14971,34 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 memcpy((uint32_t*)&deviceMask, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetDeviceMaskKHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)deviceMask);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdSetDeviceMaskKHR 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)deviceMask);
                 }
                 vk->vkCmdSetDeviceMaskKHR(unboxed_commandBuffer, deviceMask);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetDeviceMaskKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, deviceMask);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetDeviceMaskKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, deviceMask);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdDispatchBaseKHR:
-            {
+            case OP_vkCmdDispatchBaseKHR: {
                 android::base::beginTrace("vkCmdDispatchBaseKHR decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t baseGroupX;
@@ -13024,7 +15011,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -13040,20 +15028,29 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&groupCountZ, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdDispatchBaseKHR 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)baseGroupX, (unsigned long long)baseGroupY, (unsigned long long)baseGroupZ, (unsigned long long)groupCountX, (unsigned long long)groupCountY, (unsigned long long)groupCountZ);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdDispatchBaseKHR 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)baseGroupX, (unsigned long long)baseGroupY,
+                            (unsigned long long)baseGroupZ, (unsigned long long)groupCountX,
+                            (unsigned long long)groupCountY, (unsigned long long)groupCountZ);
                 }
-                vk->vkCmdDispatchBaseKHR(unboxed_commandBuffer, baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ);
+                vk->vkCmdDispatchBaseKHR(unboxed_commandBuffer, baseGroupX, baseGroupY, baseGroupZ,
+                                         groupCountX, groupCountY, groupCountZ);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdDispatchBaseKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdDispatchBaseKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, baseGroupX,
+                        baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -13061,8 +15058,7 @@
 #ifdef VK_KHR_shader_draw_parameters
 #endif
 #ifdef VK_KHR_maintenance1
-            case OP_vkTrimCommandPoolKHR:
-            {
+            case OP_vkTrimCommandPoolKHR: {
                 android::base::beginTrace("vkTrimCommandPoolKHR decode");
                 VkDevice device;
                 VkCommandPool commandPool;
@@ -13078,30 +15074,35 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandPool*)&commandPool = (VkCommandPool)unbox_VkCommandPool((VkCommandPool)(*&cgen_var_1));
-                memcpy((VkCommandPoolTrimFlags*)&flags, *readStreamPtrPtr, sizeof(VkCommandPoolTrimFlags));
+                *(VkCommandPool*)&commandPool =
+                    (VkCommandPool)unbox_VkCommandPool((VkCommandPool)(*&cgen_var_1));
+                memcpy((VkCommandPoolTrimFlags*)&flags, *readStreamPtrPtr,
+                       sizeof(VkCommandPoolTrimFlags));
                 *readStreamPtrPtr += sizeof(VkCommandPoolTrimFlags);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkTrimCommandPoolKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)commandPool, (unsigned long long)flags);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkTrimCommandPoolKHR 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)commandPool,
+                            (unsigned long long)flags);
                 }
                 vk->vkTrimCommandPoolKHR(unboxed_device, commandPool, flags);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkTrimCommandPoolKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, commandPool, flags);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkTrimCommandPoolKHR(snapshotTraceBegin,
+                                                              snapshotTraceBytes, &m_pool, device,
+                                                              commandPool, flags);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_KHR_device_group_creation
-            case OP_vkEnumeratePhysicalDeviceGroupsKHR:
-            {
+            case OP_vkEnumeratePhysicalDeviceGroupsKHR: {
                 android::base::beginTrace("vkEnumeratePhysicalDeviceGroupsKHR decode");
                 VkInstance instance;
                 uint32_t* pPhysicalDeviceGroupCount;
@@ -13120,91 +15121,106 @@
                 memcpy((uint32_t**)&pPhysicalDeviceGroupCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pPhysicalDeviceGroupCount);
                 *readStreamPtrPtr += 8;
-                if (pPhysicalDeviceGroupCount)
-                {
+                if (pPhysicalDeviceGroupCount) {
                     vkReadStream->alloc((void**)&pPhysicalDeviceGroupCount, sizeof(uint32_t));
-                    memcpy((uint32_t*)pPhysicalDeviceGroupCount, *readStreamPtrPtr, sizeof(uint32_t));
+                    memcpy((uint32_t*)pPhysicalDeviceGroupCount, *readStreamPtrPtr,
+                           sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
                 }
                 // Begin manual dispatchable handle unboxing for pPhysicalDeviceGroupProperties;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
-                memcpy((VkPhysicalDeviceGroupProperties**)&pPhysicalDeviceGroupProperties, (*readStreamPtrPtr), 8);
+                memcpy((VkPhysicalDeviceGroupProperties**)&pPhysicalDeviceGroupProperties,
+                       (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pPhysicalDeviceGroupProperties);
                 *readStreamPtrPtr += 8;
-                if (pPhysicalDeviceGroupProperties)
-                {
-                    vkReadStream->alloc((void**)&pPhysicalDeviceGroupProperties, (*(pPhysicalDeviceGroupCount)) * sizeof(VkPhysicalDeviceGroupProperties));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pPhysicalDeviceGroupCount)); ++i)
-                    {
-                        reservedunmarshal_VkPhysicalDeviceGroupProperties(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties + i), readStreamPtrPtr);
+                if (pPhysicalDeviceGroupProperties) {
+                    vkReadStream->alloc(
+                        (void**)&pPhysicalDeviceGroupProperties,
+                        (*(pPhysicalDeviceGroupCount)) * sizeof(VkPhysicalDeviceGroupProperties));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pPhysicalDeviceGroupCount)); ++i) {
+                        reservedunmarshal_VkPhysicalDeviceGroupProperties(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties + i),
+                            readStreamPtrPtr);
                     }
                 }
-                if (pPhysicalDeviceGroupCount)
-                {
-                    if (pPhysicalDeviceGroupProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPhysicalDeviceGroupCount)); ++i)
-                        {
-                            transform_tohost_VkPhysicalDeviceGroupProperties(m_state, (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties + i));
+                if (pPhysicalDeviceGroupCount) {
+                    if (pPhysicalDeviceGroupProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPhysicalDeviceGroupCount)); ++i) {
+                            transform_tohost_VkPhysicalDeviceGroupProperties(
+                                m_state,
+                                (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties +
+                                                                   i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkEnumeratePhysicalDeviceGroupsKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)instance, (unsigned long long)pPhysicalDeviceGroupCount, (unsigned long long)pPhysicalDeviceGroupProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkEnumeratePhysicalDeviceGroupsKHR 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)instance,
+                            (unsigned long long)pPhysicalDeviceGroupCount,
+                            (unsigned long long)pPhysicalDeviceGroupProperties);
                 }
                 VkResult vkEnumeratePhysicalDeviceGroupsKHR_VkResult_return = (VkResult)0;
-                vkEnumeratePhysicalDeviceGroupsKHR_VkResult_return = vk->vkEnumeratePhysicalDeviceGroupsKHR(unboxed_instance, pPhysicalDeviceGroupCount, pPhysicalDeviceGroupProperties);
-                if ((vkEnumeratePhysicalDeviceGroupsKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkEnumeratePhysicalDeviceGroupsKHR_VkResult_return =
+                    vk->vkEnumeratePhysicalDeviceGroupsKHR(unboxed_instance,
+                                                           pPhysicalDeviceGroupCount,
+                                                           pPhysicalDeviceGroupProperties);
+                if ((vkEnumeratePhysicalDeviceGroupsKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pPhysicalDeviceGroupCount;
                 vkStream->putBe64(cgen_var_3);
-                if (pPhysicalDeviceGroupCount)
-                {
+                if (pPhysicalDeviceGroupCount) {
                     vkStream->write((uint32_t*)pPhysicalDeviceGroupCount, sizeof(uint32_t));
                 }
-                if (pPhysicalDeviceGroupCount)
-                {
-                    if (pPhysicalDeviceGroupProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPhysicalDeviceGroupCount)); ++i)
-                        {
-                            transform_fromhost_VkPhysicalDeviceGroupProperties(m_state, (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties + i));
+                if (pPhysicalDeviceGroupCount) {
+                    if (pPhysicalDeviceGroupProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPhysicalDeviceGroupCount)); ++i) {
+                            transform_fromhost_VkPhysicalDeviceGroupProperties(
+                                m_state,
+                                (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties +
+                                                                   i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pPhysicalDeviceGroupProperties;
                 vkStream->putBe64(cgen_var_4);
-                if (pPhysicalDeviceGroupProperties)
-                {
-                    if (pPhysicalDeviceGroupCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPhysicalDeviceGroupCount)); ++i)
-                        {
-                            marshal_VkPhysicalDeviceGroupProperties(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties + i));
+                if (pPhysicalDeviceGroupProperties) {
+                    if (pPhysicalDeviceGroupCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPhysicalDeviceGroupCount)); ++i) {
+                            marshal_VkPhysicalDeviceGroupProperties(
+                                vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties +
+                                                                   i));
                         }
                     }
                 }
-                vkStream->write(&vkEnumeratePhysicalDeviceGroupsKHR_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkEnumeratePhysicalDeviceGroupsKHR_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkEnumeratePhysicalDeviceGroupsKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkEnumeratePhysicalDeviceGroupsKHR_VkResult_return, instance, pPhysicalDeviceGroupCount, pPhysicalDeviceGroupProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkEnumeratePhysicalDeviceGroupsKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkEnumeratePhysicalDeviceGroupsKHR_VkResult_return, instance,
+                        pPhysicalDeviceGroupCount, pPhysicalDeviceGroupProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_KHR_external_memory_capabilities
-            case OP_vkGetPhysicalDeviceExternalBufferPropertiesKHR:
-            {
+            case OP_vkGetPhysicalDeviceExternalBufferPropertiesKHR: {
                 android::base::beginTrace("vkGetPhysicalDeviceExternalBufferPropertiesKHR decode");
                 VkPhysicalDevice physicalDevice;
                 const VkPhysicalDeviceExternalBufferInfo* pExternalBufferInfo;
@@ -13213,47 +15229,67 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
-                vkReadStream->alloc((void**)&pExternalBufferInfo, sizeof(const VkPhysicalDeviceExternalBufferInfo));
-                reservedunmarshal_VkPhysicalDeviceExternalBufferInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceExternalBufferInfo*)(pExternalBufferInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pExternalBufferInfo,
+                                    sizeof(const VkPhysicalDeviceExternalBufferInfo));
+                reservedunmarshal_VkPhysicalDeviceExternalBufferInfo(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPhysicalDeviceExternalBufferInfo*)(pExternalBufferInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pExternalBufferProperties;
                 vkReadStream->unsetHandleMapping();
-                vkReadStream->alloc((void**)&pExternalBufferProperties, sizeof(VkExternalBufferProperties));
-                reservedunmarshal_VkExternalBufferProperties(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExternalBufferProperties*)(pExternalBufferProperties), readStreamPtrPtr);
-                if (pExternalBufferInfo)
-                {
-                    m_state->transformImpl_VkPhysicalDeviceExternalBufferInfo_tohost(pExternalBufferInfo, 1);
-                    transform_tohost_VkPhysicalDeviceExternalBufferInfo(m_state, (VkPhysicalDeviceExternalBufferInfo*)(pExternalBufferInfo));
+                vkReadStream->alloc((void**)&pExternalBufferProperties,
+                                    sizeof(VkExternalBufferProperties));
+                reservedunmarshal_VkExternalBufferProperties(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkExternalBufferProperties*)(pExternalBufferProperties), readStreamPtrPtr);
+                if (pExternalBufferInfo) {
+                    m_state->transformImpl_VkPhysicalDeviceExternalBufferInfo_tohost(
+                        pExternalBufferInfo, 1);
+                    transform_tohost_VkPhysicalDeviceExternalBufferInfo(
+                        m_state, (VkPhysicalDeviceExternalBufferInfo*)(pExternalBufferInfo));
                 }
-                if (pExternalBufferProperties)
-                {
-                    m_state->transformImpl_VkExternalBufferProperties_tohost(pExternalBufferProperties, 1);
-                    transform_tohost_VkExternalBufferProperties(m_state, (VkExternalBufferProperties*)(pExternalBufferProperties));
+                if (pExternalBufferProperties) {
+                    m_state->transformImpl_VkExternalBufferProperties_tohost(
+                        pExternalBufferProperties, 1);
+                    transform_tohost_VkExternalBufferProperties(
+                        m_state, (VkExternalBufferProperties*)(pExternalBufferProperties));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceExternalBufferPropertiesKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pExternalBufferInfo, (unsigned long long)pExternalBufferProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceExternalBufferPropertiesKHR 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)pExternalBufferInfo,
+                            (unsigned long long)pExternalBufferProperties);
                 }
-                vk->vkGetPhysicalDeviceExternalBufferPropertiesKHR(unboxed_physicalDevice, pExternalBufferInfo, pExternalBufferProperties);
+                vk->vkGetPhysicalDeviceExternalBufferPropertiesKHR(
+                    unboxed_physicalDevice, pExternalBufferInfo, pExternalBufferProperties);
                 vkStream->unsetHandleMapping();
-                if (pExternalBufferProperties)
-                {
-                    m_state->transformImpl_VkExternalBufferProperties_fromhost(pExternalBufferProperties, 1);
-                    transform_fromhost_VkExternalBufferProperties(m_state, (VkExternalBufferProperties*)(pExternalBufferProperties));
+                if (pExternalBufferProperties) {
+                    m_state->transformImpl_VkExternalBufferProperties_fromhost(
+                        pExternalBufferProperties, 1);
+                    transform_fromhost_VkExternalBufferProperties(
+                        m_state, (VkExternalBufferProperties*)(pExternalBufferProperties));
                 }
-                marshal_VkExternalBufferProperties(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExternalBufferProperties*)(pExternalBufferProperties));
+                marshal_VkExternalBufferProperties(
+                    vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkExternalBufferProperties*)(pExternalBufferProperties));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceExternalBufferPropertiesKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice, pExternalBufferInfo, pExternalBufferProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceExternalBufferPropertiesKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice,
+                        pExternalBufferInfo, pExternalBufferProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -13261,8 +15297,7 @@
 #ifdef VK_KHR_external_memory
 #endif
 #ifdef VK_KHR_external_memory_win32
-            case OP_vkGetMemoryWin32HandleKHR:
-            {
+            case OP_vkGetMemoryWin32HandleKHR: {
                 android::base::beginTrace("vkGetMemoryWin32HandleKHR decode");
                 VkDevice device;
                 const VkMemoryGetWin32HandleInfoKHR* pGetWin32HandleInfo;
@@ -13275,41 +15310,51 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pGetWin32HandleInfo, sizeof(const VkMemoryGetWin32HandleInfoKHR));
-                reservedunmarshal_VkMemoryGetWin32HandleInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryGetWin32HandleInfoKHR*)(pGetWin32HandleInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pGetWin32HandleInfo,
+                                    sizeof(const VkMemoryGetWin32HandleInfoKHR));
+                reservedunmarshal_VkMemoryGetWin32HandleInfoKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkMemoryGetWin32HandleInfoKHR*)(pGetWin32HandleInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pHandle;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pHandle, sizeof(HANDLE));
                 memcpy((HANDLE*)pHandle, *readStreamPtrPtr, sizeof(HANDLE));
                 *readStreamPtrPtr += sizeof(HANDLE);
-                if (pGetWin32HandleInfo)
-                {
-                    transform_tohost_VkMemoryGetWin32HandleInfoKHR(m_state, (VkMemoryGetWin32HandleInfoKHR*)(pGetWin32HandleInfo));
+                if (pGetWin32HandleInfo) {
+                    transform_tohost_VkMemoryGetWin32HandleInfoKHR(
+                        m_state, (VkMemoryGetWin32HandleInfoKHR*)(pGetWin32HandleInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetMemoryWin32HandleKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pGetWin32HandleInfo, (unsigned long long)pHandle);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetMemoryWin32HandleKHR 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device,
+                            (unsigned long long)pGetWin32HandleInfo, (unsigned long long)pHandle);
                 }
                 VkResult vkGetMemoryWin32HandleKHR_VkResult_return = (VkResult)0;
-                vkGetMemoryWin32HandleKHR_VkResult_return = vk->vkGetMemoryWin32HandleKHR(unboxed_device, pGetWin32HandleInfo, pHandle);
-                if ((vkGetMemoryWin32HandleKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetMemoryWin32HandleKHR_VkResult_return =
+                    vk->vkGetMemoryWin32HandleKHR(unboxed_device, pGetWin32HandleInfo, pHandle);
+                if ((vkGetMemoryWin32HandleKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write((HANDLE*)pHandle, sizeof(HANDLE));
                 vkStream->write(&vkGetMemoryWin32HandleKHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetMemoryWin32HandleKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetMemoryWin32HandleKHR_VkResult_return, device, pGetWin32HandleInfo, pHandle);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetMemoryWin32HandleKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetMemoryWin32HandleKHR_VkResult_return, device, pGetWin32HandleInfo,
+                        pHandle);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetMemoryWin32HandlePropertiesKHR:
-            {
+            case OP_vkGetMemoryWin32HandlePropertiesKHR: {
                 android::base::beginTrace("vkGetMemoryWin32HandlePropertiesKHR decode");
                 VkDevice device;
                 VkExternalMemoryHandleTypeFlagBits handleType;
@@ -13323,48 +15368,66 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                memcpy((VkExternalMemoryHandleTypeFlagBits*)&handleType, *readStreamPtrPtr, sizeof(VkExternalMemoryHandleTypeFlagBits));
+                memcpy((VkExternalMemoryHandleTypeFlagBits*)&handleType, *readStreamPtrPtr,
+                       sizeof(VkExternalMemoryHandleTypeFlagBits));
                 *readStreamPtrPtr += sizeof(VkExternalMemoryHandleTypeFlagBits);
                 memcpy((HANDLE*)&handle, *readStreamPtrPtr, sizeof(HANDLE));
                 *readStreamPtrPtr += sizeof(HANDLE);
                 // Begin manual dispatchable handle unboxing for pMemoryWin32HandleProperties;
                 vkReadStream->unsetHandleMapping();
-                vkReadStream->alloc((void**)&pMemoryWin32HandleProperties, sizeof(VkMemoryWin32HandlePropertiesKHR));
-                reservedunmarshal_VkMemoryWin32HandlePropertiesKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryWin32HandlePropertiesKHR*)(pMemoryWin32HandleProperties), readStreamPtrPtr);
-                if (pMemoryWin32HandleProperties)
-                {
-                    transform_tohost_VkMemoryWin32HandlePropertiesKHR(m_state, (VkMemoryWin32HandlePropertiesKHR*)(pMemoryWin32HandleProperties));
+                vkReadStream->alloc((void**)&pMemoryWin32HandleProperties,
+                                    sizeof(VkMemoryWin32HandlePropertiesKHR));
+                reservedunmarshal_VkMemoryWin32HandlePropertiesKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkMemoryWin32HandlePropertiesKHR*)(pMemoryWin32HandleProperties),
+                    readStreamPtrPtr);
+                if (pMemoryWin32HandleProperties) {
+                    transform_tohost_VkMemoryWin32HandlePropertiesKHR(
+                        m_state, (VkMemoryWin32HandlePropertiesKHR*)(pMemoryWin32HandleProperties));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetMemoryWin32HandlePropertiesKHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)handleType, (unsigned long long)handle, (unsigned long long)pMemoryWin32HandleProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetMemoryWin32HandlePropertiesKHR 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)handleType,
+                            (unsigned long long)handle,
+                            (unsigned long long)pMemoryWin32HandleProperties);
                 }
                 VkResult vkGetMemoryWin32HandlePropertiesKHR_VkResult_return = (VkResult)0;
-                vkGetMemoryWin32HandlePropertiesKHR_VkResult_return = vk->vkGetMemoryWin32HandlePropertiesKHR(unboxed_device, handleType, handle, pMemoryWin32HandleProperties);
-                if ((vkGetMemoryWin32HandlePropertiesKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetMemoryWin32HandlePropertiesKHR_VkResult_return =
+                    vk->vkGetMemoryWin32HandlePropertiesKHR(unboxed_device, handleType, handle,
+                                                            pMemoryWin32HandleProperties);
+                if ((vkGetMemoryWin32HandlePropertiesKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                if (pMemoryWin32HandleProperties)
-                {
-                    transform_fromhost_VkMemoryWin32HandlePropertiesKHR(m_state, (VkMemoryWin32HandlePropertiesKHR*)(pMemoryWin32HandleProperties));
+                if (pMemoryWin32HandleProperties) {
+                    transform_fromhost_VkMemoryWin32HandlePropertiesKHR(
+                        m_state, (VkMemoryWin32HandlePropertiesKHR*)(pMemoryWin32HandleProperties));
                 }
-                marshal_VkMemoryWin32HandlePropertiesKHR(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryWin32HandlePropertiesKHR*)(pMemoryWin32HandleProperties));
-                vkStream->write(&vkGetMemoryWin32HandlePropertiesKHR_VkResult_return, sizeof(VkResult));
+                marshal_VkMemoryWin32HandlePropertiesKHR(
+                    vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkMemoryWin32HandlePropertiesKHR*)(pMemoryWin32HandleProperties));
+                vkStream->write(&vkGetMemoryWin32HandlePropertiesKHR_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetMemoryWin32HandlePropertiesKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetMemoryWin32HandlePropertiesKHR_VkResult_return, device, handleType, handle, pMemoryWin32HandleProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetMemoryWin32HandlePropertiesKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetMemoryWin32HandlePropertiesKHR_VkResult_return, device, handleType,
+                        handle, pMemoryWin32HandleProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_KHR_external_memory_fd
-            case OP_vkGetMemoryFdKHR:
-            {
+            case OP_vkGetMemoryFdKHR: {
                 android::base::beginTrace("vkGetMemoryFdKHR decode");
                 VkDevice device;
                 const VkMemoryGetFdInfoKHR* pGetFdInfo;
@@ -13378,40 +15441,47 @@
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
                 vkReadStream->alloc((void**)&pGetFdInfo, sizeof(const VkMemoryGetFdInfoKHR));
-                reservedunmarshal_VkMemoryGetFdInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryGetFdInfoKHR*)(pGetFdInfo), readStreamPtrPtr);
+                reservedunmarshal_VkMemoryGetFdInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                       (VkMemoryGetFdInfoKHR*)(pGetFdInfo),
+                                                       readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pFd;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pFd, sizeof(int));
                 memcpy((int*)pFd, *readStreamPtrPtr, sizeof(int));
                 *readStreamPtrPtr += sizeof(int);
-                if (pGetFdInfo)
-                {
-                    transform_tohost_VkMemoryGetFdInfoKHR(m_state, (VkMemoryGetFdInfoKHR*)(pGetFdInfo));
+                if (pGetFdInfo) {
+                    transform_tohost_VkMemoryGetFdInfoKHR(m_state,
+                                                          (VkMemoryGetFdInfoKHR*)(pGetFdInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetMemoryFdKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pGetFdInfo, (unsigned long long)pFd);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkGetMemoryFdKHR 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pGetFdInfo,
+                            (unsigned long long)pFd);
                 }
                 VkResult vkGetMemoryFdKHR_VkResult_return = (VkResult)0;
-                vkGetMemoryFdKHR_VkResult_return = vk->vkGetMemoryFdKHR(unboxed_device, pGetFdInfo, pFd);
-                if ((vkGetMemoryFdKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetMemoryFdKHR_VkResult_return =
+                    vk->vkGetMemoryFdKHR(unboxed_device, pGetFdInfo, pFd);
+                if ((vkGetMemoryFdKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write((int*)pFd, sizeof(int));
                 vkStream->write(&vkGetMemoryFdKHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetMemoryFdKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetMemoryFdKHR_VkResult_return, device, pGetFdInfo, pFd);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetMemoryFdKHR(snapshotTraceBegin, snapshotTraceBytes,
+                                                          &m_pool, vkGetMemoryFdKHR_VkResult_return,
+                                                          device, pGetFdInfo, pFd);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetMemoryFdPropertiesKHR:
-            {
+            case OP_vkGetMemoryFdPropertiesKHR: {
                 android::base::beginTrace("vkGetMemoryFdPropertiesKHR decode");
                 VkDevice device;
                 VkExternalMemoryHandleTypeFlagBits handleType;
@@ -13425,41 +15495,54 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                memcpy((VkExternalMemoryHandleTypeFlagBits*)&handleType, *readStreamPtrPtr, sizeof(VkExternalMemoryHandleTypeFlagBits));
+                memcpy((VkExternalMemoryHandleTypeFlagBits*)&handleType, *readStreamPtrPtr,
+                       sizeof(VkExternalMemoryHandleTypeFlagBits));
                 *readStreamPtrPtr += sizeof(VkExternalMemoryHandleTypeFlagBits);
                 memcpy((int*)&fd, *readStreamPtrPtr, sizeof(int));
                 *readStreamPtrPtr += sizeof(int);
                 // Begin manual dispatchable handle unboxing for pMemoryFdProperties;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pMemoryFdProperties, sizeof(VkMemoryFdPropertiesKHR));
-                reservedunmarshal_VkMemoryFdPropertiesKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryFdPropertiesKHR*)(pMemoryFdProperties), readStreamPtrPtr);
-                if (pMemoryFdProperties)
-                {
-                    transform_tohost_VkMemoryFdPropertiesKHR(m_state, (VkMemoryFdPropertiesKHR*)(pMemoryFdProperties));
+                reservedunmarshal_VkMemoryFdPropertiesKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkMemoryFdPropertiesKHR*)(pMemoryFdProperties), readStreamPtrPtr);
+                if (pMemoryFdProperties) {
+                    transform_tohost_VkMemoryFdPropertiesKHR(
+                        m_state, (VkMemoryFdPropertiesKHR*)(pMemoryFdProperties));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetMemoryFdPropertiesKHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)handleType, (unsigned long long)fd, (unsigned long long)pMemoryFdProperties);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkGetMemoryFdPropertiesKHR 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device, (unsigned long long)handleType,
+                        (unsigned long long)fd, (unsigned long long)pMemoryFdProperties);
                 }
                 VkResult vkGetMemoryFdPropertiesKHR_VkResult_return = (VkResult)0;
-                vkGetMemoryFdPropertiesKHR_VkResult_return = vk->vkGetMemoryFdPropertiesKHR(unboxed_device, handleType, fd, pMemoryFdProperties);
-                if ((vkGetMemoryFdPropertiesKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetMemoryFdPropertiesKHR_VkResult_return = vk->vkGetMemoryFdPropertiesKHR(
+                    unboxed_device, handleType, fd, pMemoryFdProperties);
+                if ((vkGetMemoryFdPropertiesKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                if (pMemoryFdProperties)
-                {
-                    transform_fromhost_VkMemoryFdPropertiesKHR(m_state, (VkMemoryFdPropertiesKHR*)(pMemoryFdProperties));
+                if (pMemoryFdProperties) {
+                    transform_fromhost_VkMemoryFdPropertiesKHR(
+                        m_state, (VkMemoryFdPropertiesKHR*)(pMemoryFdProperties));
                 }
-                marshal_VkMemoryFdPropertiesKHR(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryFdPropertiesKHR*)(pMemoryFdProperties));
+                marshal_VkMemoryFdPropertiesKHR(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                (VkMemoryFdPropertiesKHR*)(pMemoryFdProperties));
                 vkStream->write(&vkGetMemoryFdPropertiesKHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetMemoryFdPropertiesKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetMemoryFdPropertiesKHR_VkResult_return, device, handleType, fd, pMemoryFdProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetMemoryFdPropertiesKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetMemoryFdPropertiesKHR_VkResult_return, device, handleType, fd,
+                        pMemoryFdProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -13467,9 +15550,9 @@
 #ifdef VK_KHR_win32_keyed_mutex
 #endif
 #ifdef VK_KHR_external_semaphore_capabilities
-            case OP_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR:
-            {
-                android::base::beginTrace("vkGetPhysicalDeviceExternalSemaphorePropertiesKHR decode");
+            case OP_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR: {
+                android::base::beginTrace(
+                    "vkGetPhysicalDeviceExternalSemaphorePropertiesKHR decode");
                 VkPhysicalDevice physicalDevice;
                 const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo;
                 VkExternalSemaphoreProperties* pExternalSemaphoreProperties;
@@ -13477,41 +15560,60 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
-                vkReadStream->alloc((void**)&pExternalSemaphoreInfo, sizeof(const VkPhysicalDeviceExternalSemaphoreInfo));
-                reservedunmarshal_VkPhysicalDeviceExternalSemaphoreInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceExternalSemaphoreInfo*)(pExternalSemaphoreInfo), readStreamPtrPtr);
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                vkReadStream->alloc((void**)&pExternalSemaphoreInfo,
+                                    sizeof(const VkPhysicalDeviceExternalSemaphoreInfo));
+                reservedunmarshal_VkPhysicalDeviceExternalSemaphoreInfo(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPhysicalDeviceExternalSemaphoreInfo*)(pExternalSemaphoreInfo),
+                    readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pExternalSemaphoreProperties;
                 vkReadStream->unsetHandleMapping();
-                vkReadStream->alloc((void**)&pExternalSemaphoreProperties, sizeof(VkExternalSemaphoreProperties));
-                reservedunmarshal_VkExternalSemaphoreProperties(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties), readStreamPtrPtr);
-                if (pExternalSemaphoreInfo)
-                {
-                    transform_tohost_VkPhysicalDeviceExternalSemaphoreInfo(m_state, (VkPhysicalDeviceExternalSemaphoreInfo*)(pExternalSemaphoreInfo));
+                vkReadStream->alloc((void**)&pExternalSemaphoreProperties,
+                                    sizeof(VkExternalSemaphoreProperties));
+                reservedunmarshal_VkExternalSemaphoreProperties(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties),
+                    readStreamPtrPtr);
+                if (pExternalSemaphoreInfo) {
+                    transform_tohost_VkPhysicalDeviceExternalSemaphoreInfo(
+                        m_state, (VkPhysicalDeviceExternalSemaphoreInfo*)(pExternalSemaphoreInfo));
                 }
-                if (pExternalSemaphoreProperties)
-                {
-                    transform_tohost_VkExternalSemaphoreProperties(m_state, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties));
+                if (pExternalSemaphoreProperties) {
+                    transform_tohost_VkExternalSemaphoreProperties(
+                        m_state, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceExternalSemaphorePropertiesKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pExternalSemaphoreInfo, (unsigned long long)pExternalSemaphoreProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceExternalSemaphorePropertiesKHR "
+                            "0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)pExternalSemaphoreInfo,
+                            (unsigned long long)pExternalSemaphoreProperties);
                 }
-                m_state->on_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR(&m_pool, physicalDevice, pExternalSemaphoreInfo, pExternalSemaphoreProperties);
+                m_state->on_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR(
+                    &m_pool, physicalDevice, pExternalSemaphoreInfo, pExternalSemaphoreProperties);
                 vkStream->unsetHandleMapping();
-                if (pExternalSemaphoreProperties)
-                {
-                    transform_fromhost_VkExternalSemaphoreProperties(m_state, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties));
+                if (pExternalSemaphoreProperties) {
+                    transform_fromhost_VkExternalSemaphoreProperties(
+                        m_state, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties));
                 }
-                marshal_VkExternalSemaphoreProperties(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties));
+                marshal_VkExternalSemaphoreProperties(
+                    vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceExternalSemaphorePropertiesKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice, pExternalSemaphoreInfo, pExternalSemaphoreProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceExternalSemaphorePropertiesKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice,
+                        pExternalSemaphoreInfo, pExternalSemaphoreProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -13519,8 +15621,7 @@
 #ifdef VK_KHR_external_semaphore
 #endif
 #ifdef VK_KHR_external_semaphore_win32
-            case OP_vkImportSemaphoreWin32HandleKHR:
-            {
+            case OP_vkImportSemaphoreWin32HandleKHR: {
                 android::base::beginTrace("vkImportSemaphoreWin32HandleKHR decode");
                 VkDevice device;
                 const VkImportSemaphoreWin32HandleInfoKHR* pImportSemaphoreWin32HandleInfo;
@@ -13532,35 +15633,48 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pImportSemaphoreWin32HandleInfo, sizeof(const VkImportSemaphoreWin32HandleInfoKHR));
-                reservedunmarshal_VkImportSemaphoreWin32HandleInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImportSemaphoreWin32HandleInfoKHR*)(pImportSemaphoreWin32HandleInfo), readStreamPtrPtr);
-                if (pImportSemaphoreWin32HandleInfo)
-                {
-                    transform_tohost_VkImportSemaphoreWin32HandleInfoKHR(m_state, (VkImportSemaphoreWin32HandleInfoKHR*)(pImportSemaphoreWin32HandleInfo));
+                vkReadStream->alloc((void**)&pImportSemaphoreWin32HandleInfo,
+                                    sizeof(const VkImportSemaphoreWin32HandleInfoKHR));
+                reservedunmarshal_VkImportSemaphoreWin32HandleInfoKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkImportSemaphoreWin32HandleInfoKHR*)(pImportSemaphoreWin32HandleInfo),
+                    readStreamPtrPtr);
+                if (pImportSemaphoreWin32HandleInfo) {
+                    transform_tohost_VkImportSemaphoreWin32HandleInfoKHR(
+                        m_state,
+                        (VkImportSemaphoreWin32HandleInfoKHR*)(pImportSemaphoreWin32HandleInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkImportSemaphoreWin32HandleKHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pImportSemaphoreWin32HandleInfo);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkImportSemaphoreWin32HandleKHR 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device,
+                            (unsigned long long)pImportSemaphoreWin32HandleInfo);
                 }
                 VkResult vkImportSemaphoreWin32HandleKHR_VkResult_return = (VkResult)0;
-                vkImportSemaphoreWin32HandleKHR_VkResult_return = vk->vkImportSemaphoreWin32HandleKHR(unboxed_device, pImportSemaphoreWin32HandleInfo);
-                if ((vkImportSemaphoreWin32HandleKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkImportSemaphoreWin32HandleKHR_VkResult_return =
+                    vk->vkImportSemaphoreWin32HandleKHR(unboxed_device,
+                                                        pImportSemaphoreWin32HandleInfo);
+                if ((vkImportSemaphoreWin32HandleKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkImportSemaphoreWin32HandleKHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkImportSemaphoreWin32HandleKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkImportSemaphoreWin32HandleKHR_VkResult_return, device, pImportSemaphoreWin32HandleInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkImportSemaphoreWin32HandleKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkImportSemaphoreWin32HandleKHR_VkResult_return, device,
+                        pImportSemaphoreWin32HandleInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetSemaphoreWin32HandleKHR:
-            {
+            case OP_vkGetSemaphoreWin32HandleKHR: {
                 android::base::beginTrace("vkGetSemaphoreWin32HandleKHR decode");
                 VkDevice device;
                 const VkSemaphoreGetWin32HandleInfoKHR* pGetWin32HandleInfo;
@@ -13573,43 +15687,53 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pGetWin32HandleInfo, sizeof(const VkSemaphoreGetWin32HandleInfoKHR));
-                reservedunmarshal_VkSemaphoreGetWin32HandleInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSemaphoreGetWin32HandleInfoKHR*)(pGetWin32HandleInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pGetWin32HandleInfo,
+                                    sizeof(const VkSemaphoreGetWin32HandleInfoKHR));
+                reservedunmarshal_VkSemaphoreGetWin32HandleInfoKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkSemaphoreGetWin32HandleInfoKHR*)(pGetWin32HandleInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pHandle;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pHandle, sizeof(HANDLE));
                 memcpy((HANDLE*)pHandle, *readStreamPtrPtr, sizeof(HANDLE));
                 *readStreamPtrPtr += sizeof(HANDLE);
-                if (pGetWin32HandleInfo)
-                {
-                    transform_tohost_VkSemaphoreGetWin32HandleInfoKHR(m_state, (VkSemaphoreGetWin32HandleInfoKHR*)(pGetWin32HandleInfo));
+                if (pGetWin32HandleInfo) {
+                    transform_tohost_VkSemaphoreGetWin32HandleInfoKHR(
+                        m_state, (VkSemaphoreGetWin32HandleInfoKHR*)(pGetWin32HandleInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetSemaphoreWin32HandleKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pGetWin32HandleInfo, (unsigned long long)pHandle);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetSemaphoreWin32HandleKHR 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device,
+                            (unsigned long long)pGetWin32HandleInfo, (unsigned long long)pHandle);
                 }
                 VkResult vkGetSemaphoreWin32HandleKHR_VkResult_return = (VkResult)0;
-                vkGetSemaphoreWin32HandleKHR_VkResult_return = vk->vkGetSemaphoreWin32HandleKHR(unboxed_device, pGetWin32HandleInfo, pHandle);
-                if ((vkGetSemaphoreWin32HandleKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetSemaphoreWin32HandleKHR_VkResult_return =
+                    vk->vkGetSemaphoreWin32HandleKHR(unboxed_device, pGetWin32HandleInfo, pHandle);
+                if ((vkGetSemaphoreWin32HandleKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write((HANDLE*)pHandle, sizeof(HANDLE));
                 vkStream->write(&vkGetSemaphoreWin32HandleKHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetSemaphoreWin32HandleKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetSemaphoreWin32HandleKHR_VkResult_return, device, pGetWin32HandleInfo, pHandle);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetSemaphoreWin32HandleKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetSemaphoreWin32HandleKHR_VkResult_return, device, pGetWin32HandleInfo,
+                        pHandle);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_KHR_external_semaphore_fd
-            case OP_vkImportSemaphoreFdKHR:
-            {
+            case OP_vkImportSemaphoreFdKHR: {
                 android::base::beginTrace("vkImportSemaphoreFdKHR decode");
                 VkDevice device;
                 const VkImportSemaphoreFdInfoKHR* pImportSemaphoreFdInfo;
@@ -13618,35 +15742,43 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
-                vkReadStream->alloc((void**)&pImportSemaphoreFdInfo, sizeof(const VkImportSemaphoreFdInfoKHR));
-                reservedunmarshal_VkImportSemaphoreFdInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImportSemaphoreFdInfoKHR*)(pImportSemaphoreFdInfo), readStreamPtrPtr);
-                if (pImportSemaphoreFdInfo)
-                {
-                    transform_tohost_VkImportSemaphoreFdInfoKHR(m_state, (VkImportSemaphoreFdInfoKHR*)(pImportSemaphoreFdInfo));
+                vkReadStream->alloc((void**)&pImportSemaphoreFdInfo,
+                                    sizeof(const VkImportSemaphoreFdInfoKHR));
+                reservedunmarshal_VkImportSemaphoreFdInfoKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkImportSemaphoreFdInfoKHR*)(pImportSemaphoreFdInfo), readStreamPtrPtr);
+                if (pImportSemaphoreFdInfo) {
+                    transform_tohost_VkImportSemaphoreFdInfoKHR(
+                        m_state, (VkImportSemaphoreFdInfoKHR*)(pImportSemaphoreFdInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkImportSemaphoreFdKHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pImportSemaphoreFdInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkImportSemaphoreFdKHR 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device,
+                            (unsigned long long)pImportSemaphoreFdInfo);
                 }
                 VkResult vkImportSemaphoreFdKHR_VkResult_return = (VkResult)0;
-                vkImportSemaphoreFdKHR_VkResult_return = m_state->on_vkImportSemaphoreFdKHR(&m_pool, device, pImportSemaphoreFdInfo);
-                if ((vkImportSemaphoreFdKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkImportSemaphoreFdKHR_VkResult_return =
+                    m_state->on_vkImportSemaphoreFdKHR(&m_pool, device, pImportSemaphoreFdInfo);
+                if ((vkImportSemaphoreFdKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkImportSemaphoreFdKHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkImportSemaphoreFdKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkImportSemaphoreFdKHR_VkResult_return, device, pImportSemaphoreFdInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkImportSemaphoreFdKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkImportSemaphoreFdKHR_VkResult_return, device, pImportSemaphoreFdInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetSemaphoreFdKHR:
-            {
+            case OP_vkGetSemaphoreFdKHR: {
                 android::base::beginTrace("vkGetSemaphoreFdKHR decode");
                 VkDevice device;
                 const VkSemaphoreGetFdInfoKHR* pGetFdInfo;
@@ -13657,42 +15789,49 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
                 vkReadStream->alloc((void**)&pGetFdInfo, sizeof(const VkSemaphoreGetFdInfoKHR));
-                reservedunmarshal_VkSemaphoreGetFdInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSemaphoreGetFdInfoKHR*)(pGetFdInfo), readStreamPtrPtr);
+                reservedunmarshal_VkSemaphoreGetFdInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                          (VkSemaphoreGetFdInfoKHR*)(pGetFdInfo),
+                                                          readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pFd;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pFd, sizeof(int));
                 memcpy((int*)pFd, *readStreamPtrPtr, sizeof(int));
                 *readStreamPtrPtr += sizeof(int);
-                if (pGetFdInfo)
-                {
-                    transform_tohost_VkSemaphoreGetFdInfoKHR(m_state, (VkSemaphoreGetFdInfoKHR*)(pGetFdInfo));
+                if (pGetFdInfo) {
+                    transform_tohost_VkSemaphoreGetFdInfoKHR(
+                        m_state, (VkSemaphoreGetFdInfoKHR*)(pGetFdInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetSemaphoreFdKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pGetFdInfo, (unsigned long long)pFd);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkGetSemaphoreFdKHR 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pGetFdInfo,
+                            (unsigned long long)pFd);
                 }
                 VkResult vkGetSemaphoreFdKHR_VkResult_return = (VkResult)0;
-                vkGetSemaphoreFdKHR_VkResult_return = m_state->on_vkGetSemaphoreFdKHR(&m_pool, device, pGetFdInfo, pFd);
-                if ((vkGetSemaphoreFdKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetSemaphoreFdKHR_VkResult_return =
+                    m_state->on_vkGetSemaphoreFdKHR(&m_pool, device, pGetFdInfo, pFd);
+                if ((vkGetSemaphoreFdKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write((int*)pFd, sizeof(int));
                 vkStream->write(&vkGetSemaphoreFdKHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetSemaphoreFdKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetSemaphoreFdKHR_VkResult_return, device, pGetFdInfo, pFd);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetSemaphoreFdKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetSemaphoreFdKHR_VkResult_return, device, pGetFdInfo, pFd);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_KHR_push_descriptor
-            case OP_vkCmdPushDescriptorSetKHR:
-            {
+            case OP_vkCmdPushDescriptorSetKHR: {
                 android::base::beginTrace("vkCmdPushDescriptorSetKHR decode");
                 VkCommandBuffer commandBuffer;
                 VkPipelineBindPoint pipelineBindPoint;
@@ -13704,51 +15843,63 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
-                memcpy((VkPipelineBindPoint*)&pipelineBindPoint, *readStreamPtrPtr, sizeof(VkPipelineBindPoint));
+                memcpy((VkPipelineBindPoint*)&pipelineBindPoint, *readStreamPtrPtr,
+                       sizeof(VkPipelineBindPoint));
                 *readStreamPtrPtr += sizeof(VkPipelineBindPoint);
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPipelineLayout*)&layout = (VkPipelineLayout)unbox_VkPipelineLayout((VkPipelineLayout)(*&cgen_var_1));
+                *(VkPipelineLayout*)&layout =
+                    (VkPipelineLayout)unbox_VkPipelineLayout((VkPipelineLayout)(*&cgen_var_1));
                 memcpy((uint32_t*)&set, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&descriptorWriteCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pDescriptorWrites, ((descriptorWriteCount)) * sizeof(const VkWriteDescriptorSet));
-                for (uint32_t i = 0; i < (uint32_t)((descriptorWriteCount)); ++i)
-                {
-                    reservedunmarshal_VkWriteDescriptorSet(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkWriteDescriptorSet*)(pDescriptorWrites + i), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pDescriptorWrites,
+                                    ((descriptorWriteCount)) * sizeof(const VkWriteDescriptorSet));
+                for (uint32_t i = 0; i < (uint32_t)((descriptorWriteCount)); ++i) {
+                    reservedunmarshal_VkWriteDescriptorSet(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkWriteDescriptorSet*)(pDescriptorWrites + i), readStreamPtrPtr);
                 }
-                if (pDescriptorWrites)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((descriptorWriteCount)); ++i)
-                    {
-                        transform_tohost_VkWriteDescriptorSet(m_state, (VkWriteDescriptorSet*)(pDescriptorWrites + i));
+                if (pDescriptorWrites) {
+                    for (uint32_t i = 0; i < (uint32_t)((descriptorWriteCount)); ++i) {
+                        transform_tohost_VkWriteDescriptorSet(
+                            m_state, (VkWriteDescriptorSet*)(pDescriptorWrites + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdPushDescriptorSetKHR 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pipelineBindPoint, (unsigned long long)layout, (unsigned long long)set, (unsigned long long)descriptorWriteCount, (unsigned long long)pDescriptorWrites);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdPushDescriptorSetKHR 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pipelineBindPoint, (unsigned long long)layout,
+                            (unsigned long long)set, (unsigned long long)descriptorWriteCount,
+                            (unsigned long long)pDescriptorWrites);
                 }
-                vk->vkCmdPushDescriptorSetKHR(unboxed_commandBuffer, pipelineBindPoint, layout, set, descriptorWriteCount, pDescriptorWrites);
+                vk->vkCmdPushDescriptorSetKHR(unboxed_commandBuffer, pipelineBindPoint, layout, set,
+                                              descriptorWriteCount, pDescriptorWrites);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdPushDescriptorSetKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pipelineBindPoint, layout, set, descriptorWriteCount, pDescriptorWrites);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdPushDescriptorSetKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        pipelineBindPoint, layout, set, descriptorWriteCount, pDescriptorWrites);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdPushDescriptorSetWithTemplateKHR:
-            {
+            case OP_vkCmdPushDescriptorSetWithTemplateKHR: {
                 android::base::beginTrace("vkCmdPushDescriptorSetWithTemplateKHR decode");
                 VkCommandBuffer commandBuffer;
                 VkDescriptorUpdateTemplate descriptorUpdateTemplate;
@@ -13759,44 +15910,56 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDescriptorUpdateTemplate*)&descriptorUpdateTemplate = (VkDescriptorUpdateTemplate)unbox_VkDescriptorUpdateTemplate((VkDescriptorUpdateTemplate)(*&cgen_var_1));
+                *(VkDescriptorUpdateTemplate*)&descriptorUpdateTemplate =
+                    (VkDescriptorUpdateTemplate)unbox_VkDescriptorUpdateTemplate(
+                        (VkDescriptorUpdateTemplate)(*&cgen_var_1));
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPipelineLayout*)&layout = (VkPipelineLayout)unbox_VkPipelineLayout((VkPipelineLayout)(*&cgen_var_2));
+                *(VkPipelineLayout*)&layout =
+                    (VkPipelineLayout)unbox_VkPipelineLayout((VkPipelineLayout)(*&cgen_var_2));
                 memcpy((uint32_t*)&set, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 // WARNING PTR CHECK
                 memcpy((void**)&pData, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pData);
                 *readStreamPtrPtr += 8;
-                if (pData)
-                {
+                if (pData) {
                     vkReadStream->alloc((void**)&pData, sizeof(const uint8_t));
                     memcpy((void*)pData, *readStreamPtrPtr, sizeof(const uint8_t));
                     *readStreamPtrPtr += sizeof(const uint8_t);
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdPushDescriptorSetWithTemplateKHR 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)descriptorUpdateTemplate, (unsigned long long)layout, (unsigned long long)set, (unsigned long long)pData);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdPushDescriptorSetWithTemplateKHR 0x%llx 0x%llx "
+                            "0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)descriptorUpdateTemplate,
+                            (unsigned long long)layout, (unsigned long long)set,
+                            (unsigned long long)pData);
                 }
-                vk->vkCmdPushDescriptorSetWithTemplateKHR(unboxed_commandBuffer, descriptorUpdateTemplate, layout, set, pData);
+                vk->vkCmdPushDescriptorSetWithTemplateKHR(
+                    unboxed_commandBuffer, descriptorUpdateTemplate, layout, set, pData);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdPushDescriptorSetWithTemplateKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, descriptorUpdateTemplate, layout, set, pData);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdPushDescriptorSetWithTemplateKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        descriptorUpdateTemplate, layout, set, pData);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -13808,8 +15971,7 @@
 #ifdef VK_KHR_incremental_present
 #endif
 #ifdef VK_KHR_descriptor_update_template
-            case OP_vkCreateDescriptorUpdateTemplateKHR:
-            {
+            case OP_vkCreateDescriptorUpdateTemplateKHR: {
                 android::base::beginTrace("vkCreateDescriptorUpdateTemplateKHR decode");
                 VkDevice device;
                 const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo;
@@ -13820,63 +15982,84 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
-                vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkDescriptorUpdateTemplateCreateInfo));
-                reservedunmarshal_VkDescriptorUpdateTemplateCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorUpdateTemplateCreateInfo*)(pCreateInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pCreateInfo,
+                                    sizeof(const VkDescriptorUpdateTemplateCreateInfo));
+                reservedunmarshal_VkDescriptorUpdateTemplateCreateInfo(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkDescriptorUpdateTemplateCreateInfo*)(pCreateInfo), readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pDescriptorUpdateTemplate;
                 vkReadStream->unsetHandleMapping();
-                vkReadStream->alloc((void**)&pDescriptorUpdateTemplate, sizeof(VkDescriptorUpdateTemplate));
+                vkReadStream->alloc((void**)&pDescriptorUpdateTemplate,
+                                    sizeof(VkDescriptorUpdateTemplate));
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkDescriptorUpdateTemplate*)pDescriptorUpdateTemplate = (VkDescriptorUpdateTemplate)(VkDescriptorUpdateTemplate)((VkDescriptorUpdateTemplate)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkDescriptorUpdateTemplateCreateInfo(m_state, (VkDescriptorUpdateTemplateCreateInfo*)(pCreateInfo));
+                *(VkDescriptorUpdateTemplate*)pDescriptorUpdateTemplate =
+                    (VkDescriptorUpdateTemplate)(VkDescriptorUpdateTemplate)((
+                        VkDescriptorUpdateTemplate)(*&cgen_var_2));
+                if (pCreateInfo) {
+                    transform_tohost_VkDescriptorUpdateTemplateCreateInfo(
+                        m_state, (VkDescriptorUpdateTemplateCreateInfo*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateDescriptorUpdateTemplateKHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pDescriptorUpdateTemplate);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateDescriptorUpdateTemplateKHR 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator,
+                            (unsigned long long)pDescriptorUpdateTemplate);
                 }
                 VkResult vkCreateDescriptorUpdateTemplateKHR_VkResult_return = (VkResult)0;
-                vkCreateDescriptorUpdateTemplateKHR_VkResult_return = m_state->on_vkCreateDescriptorUpdateTemplateKHR(&m_pool, device, pCreateInfo, pAllocator, pDescriptorUpdateTemplate);
-                if ((vkCreateDescriptorUpdateTemplateKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateDescriptorUpdateTemplateKHR_VkResult_return =
+                    m_state->on_vkCreateDescriptorUpdateTemplateKHR(
+                        &m_pool, device, pCreateInfo, pAllocator, pDescriptorUpdateTemplate);
+                if ((vkCreateDescriptorUpdateTemplateKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // Begin manual non dispatchable handle create for pDescriptorUpdateTemplate;
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3;
-                static_assert(8 == sizeof(VkDescriptorUpdateTemplate), "handle map overwrite requires VkDescriptorUpdateTemplate to be 8 bytes long");
-                vkStream->handleMapping()->mapHandles_VkDescriptorUpdateTemplate((VkDescriptorUpdateTemplate*)pDescriptorUpdateTemplate, 1);
+                static_assert(
+                    8 == sizeof(VkDescriptorUpdateTemplate),
+                    "handle map overwrite requires VkDescriptorUpdateTemplate to be 8 bytes long");
+                vkStream->handleMapping()->mapHandles_VkDescriptorUpdateTemplate(
+                    (VkDescriptorUpdateTemplate*)pDescriptorUpdateTemplate, 1);
                 vkStream->write((VkDescriptorUpdateTemplate*)pDescriptorUpdateTemplate, 8 * 1);
                 // Begin manual non dispatchable handle create for pDescriptorUpdateTemplate;
                 vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
-                vkStream->write(&vkCreateDescriptorUpdateTemplateKHR_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkCreateDescriptorUpdateTemplateKHR_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateDescriptorUpdateTemplateKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateDescriptorUpdateTemplateKHR_VkResult_return, device, pCreateInfo, pAllocator, pDescriptorUpdateTemplate);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateDescriptorUpdateTemplateKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateDescriptorUpdateTemplateKHR_VkResult_return, device, pCreateInfo,
+                        pAllocator, pDescriptorUpdateTemplate);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroyDescriptorUpdateTemplateKHR:
-            {
+            case OP_vkDestroyDescriptorUpdateTemplateKHR: {
                 android::base::beginTrace("vkDestroyDescriptorUpdateTemplateKHR decode");
                 VkDevice device;
                 VkDescriptorUpdateTemplate descriptorUpdateTemplate;
@@ -13886,47 +16069,59 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
-                // Begin manual non dispatchable handle destroy unboxing for descriptorUpdateTemplate;
+                // Begin manual non dispatchable handle destroy unboxing for
+                // descriptorUpdateTemplate;
                 VkDescriptorUpdateTemplate boxed_descriptorUpdateTemplate_preserve;
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDescriptorUpdateTemplate*)&descriptorUpdateTemplate = (VkDescriptorUpdateTemplate)(VkDescriptorUpdateTemplate)((VkDescriptorUpdateTemplate)(*&cgen_var_1));
+                *(VkDescriptorUpdateTemplate*)&descriptorUpdateTemplate =
+                    (VkDescriptorUpdateTemplate)(VkDescriptorUpdateTemplate)((
+                        VkDescriptorUpdateTemplate)(*&cgen_var_1));
                 boxed_descriptorUpdateTemplate_preserve = descriptorUpdateTemplate;
-                descriptorUpdateTemplate = unbox_VkDescriptorUpdateTemplate(descriptorUpdateTemplate);
+                descriptorUpdateTemplate =
+                    unbox_VkDescriptorUpdateTemplate(descriptorUpdateTemplate);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroyDescriptorUpdateTemplateKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)descriptorUpdateTemplate, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkDestroyDescriptorUpdateTemplateKHR 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)device,
+                            (unsigned long long)descriptorUpdateTemplate,
+                            (unsigned long long)pAllocator);
                 }
-                m_state->on_vkDestroyDescriptorUpdateTemplateKHR(&m_pool, device, descriptorUpdateTemplate, pAllocator);
+                m_state->on_vkDestroyDescriptorUpdateTemplateKHR(
+                    &m_pool, device, descriptorUpdateTemplate, pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroyDescriptorUpdateTemplateKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, boxed_descriptorUpdateTemplate_preserve, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroyDescriptorUpdateTemplateKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device,
+                        boxed_descriptorUpdateTemplate_preserve, pAllocator);
                 }
                 delete_VkDescriptorUpdateTemplate(boxed_descriptorUpdateTemplate_preserve);
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkUpdateDescriptorSetWithTemplateKHR:
-            {
+            case OP_vkUpdateDescriptorSetWithTemplateKHR: {
                 android::base::beginTrace("vkUpdateDescriptorSetWithTemplateKHR decode");
                 VkDevice device;
                 VkDescriptorSet descriptorSet;
@@ -13943,35 +16138,45 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDescriptorSet*)&descriptorSet = (VkDescriptorSet)unbox_VkDescriptorSet((VkDescriptorSet)(*&cgen_var_1));
+                *(VkDescriptorSet*)&descriptorSet =
+                    (VkDescriptorSet)unbox_VkDescriptorSet((VkDescriptorSet)(*&cgen_var_1));
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDescriptorUpdateTemplate*)&descriptorUpdateTemplate = (VkDescriptorUpdateTemplate)unbox_VkDescriptorUpdateTemplate((VkDescriptorUpdateTemplate)(*&cgen_var_2));
+                *(VkDescriptorUpdateTemplate*)&descriptorUpdateTemplate =
+                    (VkDescriptorUpdateTemplate)unbox_VkDescriptorUpdateTemplate(
+                        (VkDescriptorUpdateTemplate)(*&cgen_var_2));
                 // WARNING PTR CHECK
                 memcpy((void**)&pData, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pData);
                 *readStreamPtrPtr += 8;
-                if (pData)
-                {
+                if (pData) {
                     vkReadStream->alloc((void**)&pData, sizeof(const uint8_t));
                     memcpy((void*)pData, *readStreamPtrPtr, sizeof(const uint8_t));
                     *readStreamPtrPtr += sizeof(const uint8_t);
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkUpdateDescriptorSetWithTemplateKHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)descriptorSet, (unsigned long long)descriptorUpdateTemplate, (unsigned long long)pData);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkUpdateDescriptorSetWithTemplateKHR 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)descriptorSet,
+                            (unsigned long long)descriptorUpdateTemplate,
+                            (unsigned long long)pData);
                 }
-                vk->vkUpdateDescriptorSetWithTemplateKHR(unboxed_device, descriptorSet, descriptorUpdateTemplate, pData);
+                vk->vkUpdateDescriptorSetWithTemplateKHR(unboxed_device, descriptorSet,
+                                                         descriptorUpdateTemplate, pData);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkUpdateDescriptorSetWithTemplateKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, descriptorSet, descriptorUpdateTemplate, pData);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkUpdateDescriptorSetWithTemplateKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, descriptorSet,
+                        descriptorUpdateTemplate, pData);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -13979,8 +16184,7 @@
 #ifdef VK_KHR_imageless_framebuffer
 #endif
 #ifdef VK_KHR_create_renderpass2
-            case OP_vkCreateRenderPass2KHR:
-            {
+            case OP_vkCreateRenderPass2KHR: {
                 android::base::beginTrace("vkCreateRenderPass2KHR decode");
                 VkDevice device;
                 const VkRenderPassCreateInfo2* pCreateInfo;
@@ -13992,15 +16196,18 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkRenderPassCreateInfo2));
-                reservedunmarshal_VkRenderPassCreateInfo2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRenderPassCreateInfo2*)(pCreateInfo), readStreamPtrPtr);
+                reservedunmarshal_VkRenderPassCreateInfo2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                          (VkRenderPassCreateInfo2*)(pCreateInfo),
+                                                          readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pRenderPass;
                 vkReadStream->unsetHandleMapping();
@@ -14008,46 +16215,55 @@
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkRenderPass*)pRenderPass = (VkRenderPass)(VkRenderPass)((VkRenderPass)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkRenderPassCreateInfo2(m_state, (VkRenderPassCreateInfo2*)(pCreateInfo));
+                *(VkRenderPass*)pRenderPass =
+                    (VkRenderPass)(VkRenderPass)((VkRenderPass)(*&cgen_var_2));
+                if (pCreateInfo) {
+                    transform_tohost_VkRenderPassCreateInfo2(
+                        m_state, (VkRenderPassCreateInfo2*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateRenderPass2KHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pRenderPass);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateRenderPass2KHR 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pRenderPass);
                 }
                 VkResult vkCreateRenderPass2KHR_VkResult_return = (VkResult)0;
-                vkCreateRenderPass2KHR_VkResult_return = m_state->on_vkCreateRenderPass2KHR(&m_pool, device, pCreateInfo, pAllocator, pRenderPass);
-                if ((vkCreateRenderPass2KHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateRenderPass2KHR_VkResult_return = m_state->on_vkCreateRenderPass2KHR(
+                    &m_pool, device, pCreateInfo, pAllocator, pRenderPass);
+                if ((vkCreateRenderPass2KHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // Begin manual non dispatchable handle create for pRenderPass;
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3;
-                static_assert(8 == sizeof(VkRenderPass), "handle map overwrite requires VkRenderPass to be 8 bytes long");
+                static_assert(8 == sizeof(VkRenderPass),
+                              "handle map overwrite requires VkRenderPass to be 8 bytes long");
                 vkStream->handleMapping()->mapHandles_VkRenderPass((VkRenderPass*)pRenderPass, 1);
                 vkStream->write((VkRenderPass*)pRenderPass, 8 * 1);
                 // Begin manual non dispatchable handle create for pRenderPass;
                 vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
                 vkStream->write(&vkCreateRenderPass2KHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateRenderPass2KHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateRenderPass2KHR_VkResult_return, device, pCreateInfo, pAllocator, pRenderPass);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateRenderPass2KHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateRenderPass2KHR_VkResult_return, device, pCreateInfo, pAllocator,
+                        pRenderPass);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdBeginRenderPass2KHR:
-            {
+            case OP_vkCmdBeginRenderPass2KHR: {
                 android::base::beginTrace("vkCmdBeginRenderPass2KHR decode");
                 VkCommandBuffer commandBuffer;
                 const VkRenderPassBeginInfo* pRenderPassBegin;
@@ -14056,41 +16272,52 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 vkReadStream->alloc((void**)&pRenderPassBegin, sizeof(const VkRenderPassBeginInfo));
-                reservedunmarshal_VkRenderPassBeginInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRenderPassBeginInfo*)(pRenderPassBegin), readStreamPtrPtr);
+                reservedunmarshal_VkRenderPassBeginInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                        (VkRenderPassBeginInfo*)(pRenderPassBegin),
+                                                        readStreamPtrPtr);
                 vkReadStream->alloc((void**)&pSubpassBeginInfo, sizeof(const VkSubpassBeginInfo));
-                reservedunmarshal_VkSubpassBeginInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubpassBeginInfo*)(pSubpassBeginInfo), readStreamPtrPtr);
-                if (pRenderPassBegin)
-                {
-                    transform_tohost_VkRenderPassBeginInfo(m_state, (VkRenderPassBeginInfo*)(pRenderPassBegin));
+                reservedunmarshal_VkSubpassBeginInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                     (VkSubpassBeginInfo*)(pSubpassBeginInfo),
+                                                     readStreamPtrPtr);
+                if (pRenderPassBegin) {
+                    transform_tohost_VkRenderPassBeginInfo(
+                        m_state, (VkRenderPassBeginInfo*)(pRenderPassBegin));
                 }
-                if (pSubpassBeginInfo)
-                {
-                    transform_tohost_VkSubpassBeginInfo(m_state, (VkSubpassBeginInfo*)(pSubpassBeginInfo));
+                if (pSubpassBeginInfo) {
+                    transform_tohost_VkSubpassBeginInfo(m_state,
+                                                        (VkSubpassBeginInfo*)(pSubpassBeginInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdBeginRenderPass2KHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pRenderPassBegin, (unsigned long long)pSubpassBeginInfo);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdBeginRenderPass2KHR 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pRenderPassBegin,
+                            (unsigned long long)pSubpassBeginInfo);
                 }
-                vk->vkCmdBeginRenderPass2KHR(unboxed_commandBuffer, pRenderPassBegin, pSubpassBeginInfo);
+                vk->vkCmdBeginRenderPass2KHR(unboxed_commandBuffer, pRenderPassBegin,
+                                             pSubpassBeginInfo);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdBeginRenderPass2KHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pRenderPassBegin, pSubpassBeginInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdBeginRenderPass2KHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        pRenderPassBegin, pSubpassBeginInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdNextSubpass2KHR:
-            {
+            case OP_vkCmdNextSubpass2KHR: {
                 android::base::beginTrace("vkCmdNextSubpass2KHR decode");
                 VkCommandBuffer commandBuffer;
                 const VkSubpassBeginInfo* pSubpassBeginInfo;
@@ -14099,41 +16326,50 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 vkReadStream->alloc((void**)&pSubpassBeginInfo, sizeof(const VkSubpassBeginInfo));
-                reservedunmarshal_VkSubpassBeginInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubpassBeginInfo*)(pSubpassBeginInfo), readStreamPtrPtr);
+                reservedunmarshal_VkSubpassBeginInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                     (VkSubpassBeginInfo*)(pSubpassBeginInfo),
+                                                     readStreamPtrPtr);
                 vkReadStream->alloc((void**)&pSubpassEndInfo, sizeof(const VkSubpassEndInfo));
-                reservedunmarshal_VkSubpassEndInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubpassEndInfo*)(pSubpassEndInfo), readStreamPtrPtr);
-                if (pSubpassBeginInfo)
-                {
-                    transform_tohost_VkSubpassBeginInfo(m_state, (VkSubpassBeginInfo*)(pSubpassBeginInfo));
+                reservedunmarshal_VkSubpassEndInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                   (VkSubpassEndInfo*)(pSubpassEndInfo),
+                                                   readStreamPtrPtr);
+                if (pSubpassBeginInfo) {
+                    transform_tohost_VkSubpassBeginInfo(m_state,
+                                                        (VkSubpassBeginInfo*)(pSubpassBeginInfo));
                 }
-                if (pSubpassEndInfo)
-                {
-                    transform_tohost_VkSubpassEndInfo(m_state, (VkSubpassEndInfo*)(pSubpassEndInfo));
+                if (pSubpassEndInfo) {
+                    transform_tohost_VkSubpassEndInfo(m_state,
+                                                      (VkSubpassEndInfo*)(pSubpassEndInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdNextSubpass2KHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pSubpassBeginInfo, (unsigned long long)pSubpassEndInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdNextSubpass2KHR 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pSubpassBeginInfo,
+                            (unsigned long long)pSubpassEndInfo);
                 }
                 vk->vkCmdNextSubpass2KHR(unboxed_commandBuffer, pSubpassBeginInfo, pSubpassEndInfo);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdNextSubpass2KHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pSubpassBeginInfo, pSubpassEndInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdNextSubpass2KHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        pSubpassBeginInfo, pSubpassEndInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdEndRenderPass2KHR:
-            {
+            case OP_vkCmdEndRenderPass2KHR: {
                 android::base::beginTrace("vkCmdEndRenderPass2KHR decode");
                 VkCommandBuffer commandBuffer;
                 const VkSubpassEndInfo* pSubpassEndInfo;
@@ -14141,37 +16377,43 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 vkReadStream->alloc((void**)&pSubpassEndInfo, sizeof(const VkSubpassEndInfo));
-                reservedunmarshal_VkSubpassEndInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubpassEndInfo*)(pSubpassEndInfo), readStreamPtrPtr);
-                if (pSubpassEndInfo)
-                {
-                    transform_tohost_VkSubpassEndInfo(m_state, (VkSubpassEndInfo*)(pSubpassEndInfo));
+                reservedunmarshal_VkSubpassEndInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                   (VkSubpassEndInfo*)(pSubpassEndInfo),
+                                                   readStreamPtrPtr);
+                if (pSubpassEndInfo) {
+                    transform_tohost_VkSubpassEndInfo(m_state,
+                                                      (VkSubpassEndInfo*)(pSubpassEndInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdEndRenderPass2KHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pSubpassEndInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdEndRenderPass2KHR 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pSubpassEndInfo);
                 }
                 vk->vkCmdEndRenderPass2KHR(unboxed_commandBuffer, pSubpassEndInfo);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdEndRenderPass2KHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pSubpassEndInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdEndRenderPass2KHR(snapshotTraceBegin,
+                                                                snapshotTraceBytes, &m_pool,
+                                                                commandBuffer, pSubpassEndInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_KHR_shared_presentable_image
-            case OP_vkGetSwapchainStatusKHR:
-            {
+            case OP_vkGetSwapchainStatusKHR: {
                 android::base::beginTrace("vkGetSwapchainStatusKHR decode");
                 VkDevice device;
                 VkSwapchainKHR swapchain;
@@ -14186,32 +16428,37 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkSwapchainKHR*)&swapchain = (VkSwapchainKHR)unbox_VkSwapchainKHR((VkSwapchainKHR)(*&cgen_var_1));
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetSwapchainStatusKHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)swapchain);
+                *(VkSwapchainKHR*)&swapchain =
+                    (VkSwapchainKHR)unbox_VkSwapchainKHR((VkSwapchainKHR)(*&cgen_var_1));
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkGetSwapchainStatusKHR 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)swapchain);
                 }
                 VkResult vkGetSwapchainStatusKHR_VkResult_return = (VkResult)0;
-                vkGetSwapchainStatusKHR_VkResult_return = vk->vkGetSwapchainStatusKHR(unboxed_device, swapchain);
-                if ((vkGetSwapchainStatusKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetSwapchainStatusKHR_VkResult_return =
+                    vk->vkGetSwapchainStatusKHR(unboxed_device, swapchain);
+                if ((vkGetSwapchainStatusKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkGetSwapchainStatusKHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetSwapchainStatusKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetSwapchainStatusKHR_VkResult_return, device, swapchain);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetSwapchainStatusKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetSwapchainStatusKHR_VkResult_return, device, swapchain);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_KHR_external_fence_capabilities
-            case OP_vkGetPhysicalDeviceExternalFencePropertiesKHR:
-            {
+            case OP_vkGetPhysicalDeviceExternalFencePropertiesKHR: {
                 android::base::beginTrace("vkGetPhysicalDeviceExternalFencePropertiesKHR decode");
                 VkPhysicalDevice physicalDevice;
                 const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo;
@@ -14220,44 +16467,61 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
-                vkReadStream->alloc((void**)&pExternalFenceInfo, sizeof(const VkPhysicalDeviceExternalFenceInfo));
-                reservedunmarshal_VkPhysicalDeviceExternalFenceInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceExternalFenceInfo*)(pExternalFenceInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pExternalFenceInfo,
+                                    sizeof(const VkPhysicalDeviceExternalFenceInfo));
+                reservedunmarshal_VkPhysicalDeviceExternalFenceInfo(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPhysicalDeviceExternalFenceInfo*)(pExternalFenceInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pExternalFenceProperties;
                 vkReadStream->unsetHandleMapping();
-                vkReadStream->alloc((void**)&pExternalFenceProperties, sizeof(VkExternalFenceProperties));
-                reservedunmarshal_VkExternalFenceProperties(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExternalFenceProperties*)(pExternalFenceProperties), readStreamPtrPtr);
-                if (pExternalFenceInfo)
-                {
-                    transform_tohost_VkPhysicalDeviceExternalFenceInfo(m_state, (VkPhysicalDeviceExternalFenceInfo*)(pExternalFenceInfo));
+                vkReadStream->alloc((void**)&pExternalFenceProperties,
+                                    sizeof(VkExternalFenceProperties));
+                reservedunmarshal_VkExternalFenceProperties(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkExternalFenceProperties*)(pExternalFenceProperties), readStreamPtrPtr);
+                if (pExternalFenceInfo) {
+                    transform_tohost_VkPhysicalDeviceExternalFenceInfo(
+                        m_state, (VkPhysicalDeviceExternalFenceInfo*)(pExternalFenceInfo));
                 }
-                if (pExternalFenceProperties)
-                {
-                    transform_tohost_VkExternalFenceProperties(m_state, (VkExternalFenceProperties*)(pExternalFenceProperties));
+                if (pExternalFenceProperties) {
+                    transform_tohost_VkExternalFenceProperties(
+                        m_state, (VkExternalFenceProperties*)(pExternalFenceProperties));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceExternalFencePropertiesKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pExternalFenceInfo, (unsigned long long)pExternalFenceProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceExternalFencePropertiesKHR 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)pExternalFenceInfo,
+                            (unsigned long long)pExternalFenceProperties);
                 }
-                vk->vkGetPhysicalDeviceExternalFencePropertiesKHR(unboxed_physicalDevice, pExternalFenceInfo, pExternalFenceProperties);
+                vk->vkGetPhysicalDeviceExternalFencePropertiesKHR(
+                    unboxed_physicalDevice, pExternalFenceInfo, pExternalFenceProperties);
                 vkStream->unsetHandleMapping();
-                if (pExternalFenceProperties)
-                {
-                    transform_fromhost_VkExternalFenceProperties(m_state, (VkExternalFenceProperties*)(pExternalFenceProperties));
+                if (pExternalFenceProperties) {
+                    transform_fromhost_VkExternalFenceProperties(
+                        m_state, (VkExternalFenceProperties*)(pExternalFenceProperties));
                 }
-                marshal_VkExternalFenceProperties(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExternalFenceProperties*)(pExternalFenceProperties));
+                marshal_VkExternalFenceProperties(
+                    vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkExternalFenceProperties*)(pExternalFenceProperties));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceExternalFencePropertiesKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice, pExternalFenceInfo, pExternalFenceProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceExternalFencePropertiesKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice,
+                        pExternalFenceInfo, pExternalFenceProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -14265,8 +16529,7 @@
 #ifdef VK_KHR_external_fence
 #endif
 #ifdef VK_KHR_external_fence_win32
-            case OP_vkImportFenceWin32HandleKHR:
-            {
+            case OP_vkImportFenceWin32HandleKHR: {
                 android::base::beginTrace("vkImportFenceWin32HandleKHR decode");
                 VkDevice device;
                 const VkImportFenceWin32HandleInfoKHR* pImportFenceWin32HandleInfo;
@@ -14278,35 +16541,45 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pImportFenceWin32HandleInfo, sizeof(const VkImportFenceWin32HandleInfoKHR));
-                reservedunmarshal_VkImportFenceWin32HandleInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImportFenceWin32HandleInfoKHR*)(pImportFenceWin32HandleInfo), readStreamPtrPtr);
-                if (pImportFenceWin32HandleInfo)
-                {
-                    transform_tohost_VkImportFenceWin32HandleInfoKHR(m_state, (VkImportFenceWin32HandleInfoKHR*)(pImportFenceWin32HandleInfo));
+                vkReadStream->alloc((void**)&pImportFenceWin32HandleInfo,
+                                    sizeof(const VkImportFenceWin32HandleInfoKHR));
+                reservedunmarshal_VkImportFenceWin32HandleInfoKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkImportFenceWin32HandleInfoKHR*)(pImportFenceWin32HandleInfo),
+                    readStreamPtrPtr);
+                if (pImportFenceWin32HandleInfo) {
+                    transform_tohost_VkImportFenceWin32HandleInfoKHR(
+                        m_state, (VkImportFenceWin32HandleInfoKHR*)(pImportFenceWin32HandleInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkImportFenceWin32HandleKHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pImportFenceWin32HandleInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkImportFenceWin32HandleKHR 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device,
+                            (unsigned long long)pImportFenceWin32HandleInfo);
                 }
                 VkResult vkImportFenceWin32HandleKHR_VkResult_return = (VkResult)0;
-                vkImportFenceWin32HandleKHR_VkResult_return = vk->vkImportFenceWin32HandleKHR(unboxed_device, pImportFenceWin32HandleInfo);
-                if ((vkImportFenceWin32HandleKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkImportFenceWin32HandleKHR_VkResult_return =
+                    vk->vkImportFenceWin32HandleKHR(unboxed_device, pImportFenceWin32HandleInfo);
+                if ((vkImportFenceWin32HandleKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkImportFenceWin32HandleKHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkImportFenceWin32HandleKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkImportFenceWin32HandleKHR_VkResult_return, device, pImportFenceWin32HandleInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkImportFenceWin32HandleKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkImportFenceWin32HandleKHR_VkResult_return, device,
+                        pImportFenceWin32HandleInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetFenceWin32HandleKHR:
-            {
+            case OP_vkGetFenceWin32HandleKHR: {
                 android::base::beginTrace("vkGetFenceWin32HandleKHR decode");
                 VkDevice device;
                 const VkFenceGetWin32HandleInfoKHR* pGetWin32HandleInfo;
@@ -14319,43 +16592,53 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pGetWin32HandleInfo, sizeof(const VkFenceGetWin32HandleInfoKHR));
-                reservedunmarshal_VkFenceGetWin32HandleInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkFenceGetWin32HandleInfoKHR*)(pGetWin32HandleInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pGetWin32HandleInfo,
+                                    sizeof(const VkFenceGetWin32HandleInfoKHR));
+                reservedunmarshal_VkFenceGetWin32HandleInfoKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkFenceGetWin32HandleInfoKHR*)(pGetWin32HandleInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pHandle;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pHandle, sizeof(HANDLE));
                 memcpy((HANDLE*)pHandle, *readStreamPtrPtr, sizeof(HANDLE));
                 *readStreamPtrPtr += sizeof(HANDLE);
-                if (pGetWin32HandleInfo)
-                {
-                    transform_tohost_VkFenceGetWin32HandleInfoKHR(m_state, (VkFenceGetWin32HandleInfoKHR*)(pGetWin32HandleInfo));
+                if (pGetWin32HandleInfo) {
+                    transform_tohost_VkFenceGetWin32HandleInfoKHR(
+                        m_state, (VkFenceGetWin32HandleInfoKHR*)(pGetWin32HandleInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetFenceWin32HandleKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pGetWin32HandleInfo, (unsigned long long)pHandle);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetFenceWin32HandleKHR 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device,
+                            (unsigned long long)pGetWin32HandleInfo, (unsigned long long)pHandle);
                 }
                 VkResult vkGetFenceWin32HandleKHR_VkResult_return = (VkResult)0;
-                vkGetFenceWin32HandleKHR_VkResult_return = vk->vkGetFenceWin32HandleKHR(unboxed_device, pGetWin32HandleInfo, pHandle);
-                if ((vkGetFenceWin32HandleKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetFenceWin32HandleKHR_VkResult_return =
+                    vk->vkGetFenceWin32HandleKHR(unboxed_device, pGetWin32HandleInfo, pHandle);
+                if ((vkGetFenceWin32HandleKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write((HANDLE*)pHandle, sizeof(HANDLE));
                 vkStream->write(&vkGetFenceWin32HandleKHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetFenceWin32HandleKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetFenceWin32HandleKHR_VkResult_return, device, pGetWin32HandleInfo, pHandle);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetFenceWin32HandleKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetFenceWin32HandleKHR_VkResult_return, device, pGetWin32HandleInfo,
+                        pHandle);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_KHR_external_fence_fd
-            case OP_vkImportFenceFdKHR:
-            {
+            case OP_vkImportFenceFdKHR: {
                 android::base::beginTrace("vkImportFenceFdKHR decode");
                 VkDevice device;
                 const VkImportFenceFdInfoKHR* pImportFenceFdInfo;
@@ -14367,35 +16650,42 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pImportFenceFdInfo, sizeof(const VkImportFenceFdInfoKHR));
-                reservedunmarshal_VkImportFenceFdInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImportFenceFdInfoKHR*)(pImportFenceFdInfo), readStreamPtrPtr);
-                if (pImportFenceFdInfo)
-                {
-                    transform_tohost_VkImportFenceFdInfoKHR(m_state, (VkImportFenceFdInfoKHR*)(pImportFenceFdInfo));
+                vkReadStream->alloc((void**)&pImportFenceFdInfo,
+                                    sizeof(const VkImportFenceFdInfoKHR));
+                reservedunmarshal_VkImportFenceFdInfoKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkImportFenceFdInfoKHR*)(pImportFenceFdInfo), readStreamPtrPtr);
+                if (pImportFenceFdInfo) {
+                    transform_tohost_VkImportFenceFdInfoKHR(
+                        m_state, (VkImportFenceFdInfoKHR*)(pImportFenceFdInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkImportFenceFdKHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pImportFenceFdInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkImportFenceFdKHR 0x%llx 0x%llx \n", ioStream,
+                            (unsigned long long)device, (unsigned long long)pImportFenceFdInfo);
                 }
                 VkResult vkImportFenceFdKHR_VkResult_return = (VkResult)0;
-                vkImportFenceFdKHR_VkResult_return = vk->vkImportFenceFdKHR(unboxed_device, pImportFenceFdInfo);
-                if ((vkImportFenceFdKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkImportFenceFdKHR_VkResult_return =
+                    vk->vkImportFenceFdKHR(unboxed_device, pImportFenceFdInfo);
+                if ((vkImportFenceFdKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkImportFenceFdKHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkImportFenceFdKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkImportFenceFdKHR_VkResult_return, device, pImportFenceFdInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkImportFenceFdKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkImportFenceFdKHR_VkResult_return, device, pImportFenceFdInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetFenceFdKHR:
-            {
+            case OP_vkGetFenceFdKHR: {
                 android::base::beginTrace("vkGetFenceFdKHR decode");
                 VkDevice device;
                 const VkFenceGetFdInfoKHR* pGetFdInfo;
@@ -14409,43 +16699,51 @@
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
                 vkReadStream->alloc((void**)&pGetFdInfo, sizeof(const VkFenceGetFdInfoKHR));
-                reservedunmarshal_VkFenceGetFdInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkFenceGetFdInfoKHR*)(pGetFdInfo), readStreamPtrPtr);
+                reservedunmarshal_VkFenceGetFdInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                      (VkFenceGetFdInfoKHR*)(pGetFdInfo),
+                                                      readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pFd;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pFd, sizeof(int));
                 memcpy((int*)pFd, *readStreamPtrPtr, sizeof(int));
                 *readStreamPtrPtr += sizeof(int);
-                if (pGetFdInfo)
-                {
-                    transform_tohost_VkFenceGetFdInfoKHR(m_state, (VkFenceGetFdInfoKHR*)(pGetFdInfo));
+                if (pGetFdInfo) {
+                    transform_tohost_VkFenceGetFdInfoKHR(m_state,
+                                                         (VkFenceGetFdInfoKHR*)(pGetFdInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetFenceFdKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pGetFdInfo, (unsigned long long)pFd);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkGetFenceFdKHR 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pGetFdInfo,
+                            (unsigned long long)pFd);
                 }
                 VkResult vkGetFenceFdKHR_VkResult_return = (VkResult)0;
-                vkGetFenceFdKHR_VkResult_return = vk->vkGetFenceFdKHR(unboxed_device, pGetFdInfo, pFd);
-                if ((vkGetFenceFdKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetFenceFdKHR_VkResult_return =
+                    vk->vkGetFenceFdKHR(unboxed_device, pGetFdInfo, pFd);
+                if ((vkGetFenceFdKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write((int*)pFd, sizeof(int));
                 vkStream->write(&vkGetFenceFdKHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetFenceFdKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetFenceFdKHR_VkResult_return, device, pGetFdInfo, pFd);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetFenceFdKHR(snapshotTraceBegin, snapshotTraceBytes,
+                                                         &m_pool, vkGetFenceFdKHR_VkResult_return,
+                                                         device, pGetFdInfo, pFd);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_KHR_performance_query
-            case OP_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR:
-            {
-                android::base::beginTrace("vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR decode");
+            case OP_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR: {
+                android::base::beginTrace(
+                    "vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR decode");
                 VkPhysicalDevice physicalDevice;
                 uint32_t queueFamilyIndex;
                 uint32_t* pCounterCount;
@@ -14455,7 +16753,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
@@ -14467,8 +16766,7 @@
                 memcpy((uint32_t**)&pCounterCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pCounterCount);
                 *readStreamPtrPtr += 8;
-                if (pCounterCount)
-                {
+                if (pCounterCount) {
                     vkReadStream->alloc((void**)&pCounterCount, sizeof(uint32_t));
                     memcpy((uint32_t*)pCounterCount, *readStreamPtrPtr, sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
@@ -14479,125 +16777,142 @@
                 memcpy((VkPerformanceCounterKHR**)&pCounters, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pCounters);
                 *readStreamPtrPtr += 8;
-                if (pCounters)
-                {
-                    vkReadStream->alloc((void**)&pCounters, (*(pCounterCount)) * sizeof(VkPerformanceCounterKHR));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pCounterCount)); ++i)
-                    {
-                        reservedunmarshal_VkPerformanceCounterKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPerformanceCounterKHR*)(pCounters + i), readStreamPtrPtr);
+                if (pCounters) {
+                    vkReadStream->alloc((void**)&pCounters,
+                                        (*(pCounterCount)) * sizeof(VkPerformanceCounterKHR));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pCounterCount)); ++i) {
+                        reservedunmarshal_VkPerformanceCounterKHR(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkPerformanceCounterKHR*)(pCounters + i), readStreamPtrPtr);
                     }
                 }
                 // Begin manual dispatchable handle unboxing for pCounterDescriptions;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
-                memcpy((VkPerformanceCounterDescriptionKHR**)&pCounterDescriptions, (*readStreamPtrPtr), 8);
+                memcpy((VkPerformanceCounterDescriptionKHR**)&pCounterDescriptions,
+                       (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pCounterDescriptions);
                 *readStreamPtrPtr += 8;
-                if (pCounterDescriptions)
-                {
-                    vkReadStream->alloc((void**)&pCounterDescriptions, (*(pCounterCount)) * sizeof(VkPerformanceCounterDescriptionKHR));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pCounterCount)); ++i)
-                    {
-                        reservedunmarshal_VkPerformanceCounterDescriptionKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPerformanceCounterDescriptionKHR*)(pCounterDescriptions + i), readStreamPtrPtr);
+                if (pCounterDescriptions) {
+                    vkReadStream->alloc(
+                        (void**)&pCounterDescriptions,
+                        (*(pCounterCount)) * sizeof(VkPerformanceCounterDescriptionKHR));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pCounterCount)); ++i) {
+                        reservedunmarshal_VkPerformanceCounterDescriptionKHR(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkPerformanceCounterDescriptionKHR*)(pCounterDescriptions + i),
+                            readStreamPtrPtr);
                     }
                 }
-                if (pCounterCount)
-                {
-                    if (pCounters)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pCounterCount)); ++i)
-                        {
-                            transform_tohost_VkPerformanceCounterKHR(m_state, (VkPerformanceCounterKHR*)(pCounters + i));
+                if (pCounterCount) {
+                    if (pCounters) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pCounterCount)); ++i) {
+                            transform_tohost_VkPerformanceCounterKHR(
+                                m_state, (VkPerformanceCounterKHR*)(pCounters + i));
                         }
                     }
                 }
-                if (pCounterCount)
-                {
-                    if (pCounterDescriptions)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pCounterCount)); ++i)
-                        {
-                            transform_tohost_VkPerformanceCounterDescriptionKHR(m_state, (VkPerformanceCounterDescriptionKHR*)(pCounterDescriptions + i));
+                if (pCounterCount) {
+                    if (pCounterDescriptions) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pCounterCount)); ++i) {
+                            transform_tohost_VkPerformanceCounterDescriptionKHR(
+                                m_state,
+                                (VkPerformanceCounterDescriptionKHR*)(pCounterDescriptions + i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)queueFamilyIndex, (unsigned long long)pCounterCount, (unsigned long long)pCounters, (unsigned long long)pCounterDescriptions);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call "
+                            "vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR "
+                            "0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)queueFamilyIndex, (unsigned long long)pCounterCount,
+                            (unsigned long long)pCounters,
+                            (unsigned long long)pCounterDescriptions);
                 }
-                VkResult vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR_VkResult_return = (VkResult)0;
-                vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR_VkResult_return = vk->vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(unboxed_physicalDevice, queueFamilyIndex, pCounterCount, pCounters, pCounterDescriptions);
-                if ((vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                VkResult
+                    vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR_VkResult_return =
+                        (VkResult)0;
+                vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR_VkResult_return =
+                    vk->vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
+                        unboxed_physicalDevice, queueFamilyIndex, pCounterCount, pCounters,
+                        pCounterDescriptions);
+                if ((vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pCounterCount;
                 vkStream->putBe64(cgen_var_4);
-                if (pCounterCount)
-                {
+                if (pCounterCount) {
                     vkStream->write((uint32_t*)pCounterCount, sizeof(uint32_t));
                 }
-                if (pCounterCount)
-                {
-                    if (pCounters)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pCounterCount)); ++i)
-                        {
-                            transform_fromhost_VkPerformanceCounterKHR(m_state, (VkPerformanceCounterKHR*)(pCounters + i));
+                if (pCounterCount) {
+                    if (pCounters) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pCounterCount)); ++i) {
+                            transform_fromhost_VkPerformanceCounterKHR(
+                                m_state, (VkPerformanceCounterKHR*)(pCounters + i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_5 = (uint64_t)(uintptr_t)pCounters;
                 vkStream->putBe64(cgen_var_5);
-                if (pCounters)
-                {
-                    if (pCounterCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pCounterCount)); ++i)
-                        {
-                            marshal_VkPerformanceCounterKHR(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPerformanceCounterKHR*)(pCounters + i));
+                if (pCounters) {
+                    if (pCounterCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pCounterCount)); ++i) {
+                            marshal_VkPerformanceCounterKHR(
+                                vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                (VkPerformanceCounterKHR*)(pCounters + i));
                         }
                     }
                 }
-                if (pCounterCount)
-                {
-                    if (pCounterDescriptions)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pCounterCount)); ++i)
-                        {
-                            transform_fromhost_VkPerformanceCounterDescriptionKHR(m_state, (VkPerformanceCounterDescriptionKHR*)(pCounterDescriptions + i));
+                if (pCounterCount) {
+                    if (pCounterDescriptions) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pCounterCount)); ++i) {
+                            transform_fromhost_VkPerformanceCounterDescriptionKHR(
+                                m_state,
+                                (VkPerformanceCounterDescriptionKHR*)(pCounterDescriptions + i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_6 = (uint64_t)(uintptr_t)pCounterDescriptions;
                 vkStream->putBe64(cgen_var_6);
-                if (pCounterDescriptions)
-                {
-                    if (pCounterCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pCounterCount)); ++i)
-                        {
-                            marshal_VkPerformanceCounterDescriptionKHR(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPerformanceCounterDescriptionKHR*)(pCounterDescriptions + i));
+                if (pCounterDescriptions) {
+                    if (pCounterCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pCounterCount)); ++i) {
+                            marshal_VkPerformanceCounterDescriptionKHR(
+                                vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                (VkPerformanceCounterDescriptionKHR*)(pCounterDescriptions + i));
                         }
                     }
                 }
-                vkStream->write(&vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR_VkResult_return, sizeof(VkResult));
+                vkStream->write(
+                    &vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR_VkResult_return,
+                    sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR_VkResult_return, physicalDevice, queueFamilyIndex, pCounterCount, pCounters, pCounterDescriptions);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()
+                        ->vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
+                            snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                            vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR_VkResult_return,
+                            physicalDevice, queueFamilyIndex, pCounterCount, pCounters,
+                            pCounterDescriptions);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR:
-            {
-                android::base::beginTrace("vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR decode");
+            case OP_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR: {
+                android::base::beginTrace(
+                    "vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR decode");
                 VkPhysicalDevice physicalDevice;
                 const VkQueryPoolPerformanceCreateInfoKHR* pPerformanceQueryCreateInfo;
                 uint32_t* pNumPasses;
@@ -14605,42 +16920,56 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
-                vkReadStream->alloc((void**)&pPerformanceQueryCreateInfo, sizeof(const VkQueryPoolPerformanceCreateInfoKHR));
-                reservedunmarshal_VkQueryPoolPerformanceCreateInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkQueryPoolPerformanceCreateInfoKHR*)(pPerformanceQueryCreateInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pPerformanceQueryCreateInfo,
+                                    sizeof(const VkQueryPoolPerformanceCreateInfoKHR));
+                reservedunmarshal_VkQueryPoolPerformanceCreateInfoKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkQueryPoolPerformanceCreateInfoKHR*)(pPerformanceQueryCreateInfo),
+                    readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pNumPasses;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pNumPasses, sizeof(uint32_t));
                 memcpy((uint32_t*)pNumPasses, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (pPerformanceQueryCreateInfo)
-                {
-                    transform_tohost_VkQueryPoolPerformanceCreateInfoKHR(m_state, (VkQueryPoolPerformanceCreateInfoKHR*)(pPerformanceQueryCreateInfo));
+                if (pPerformanceQueryCreateInfo) {
+                    transform_tohost_VkQueryPoolPerformanceCreateInfoKHR(
+                        m_state,
+                        (VkQueryPoolPerformanceCreateInfoKHR*)(pPerformanceQueryCreateInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pPerformanceQueryCreateInfo, (unsigned long long)pNumPasses);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR "
+                        "0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)physicalDevice,
+                        (unsigned long long)pPerformanceQueryCreateInfo,
+                        (unsigned long long)pNumPasses);
                 }
-                vk->vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(unboxed_physicalDevice, pPerformanceQueryCreateInfo, pNumPasses);
+                vk->vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(
+                    unboxed_physicalDevice, pPerformanceQueryCreateInfo, pNumPasses);
                 vkStream->unsetHandleMapping();
                 vkStream->write((uint32_t*)pNumPasses, sizeof(uint32_t));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice, pPerformanceQueryCreateInfo, pNumPasses);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice,
+                        pPerformanceQueryCreateInfo, pNumPasses);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkAcquireProfilingLockKHR:
-            {
+            case OP_vkAcquireProfilingLockKHR: {
                 android::base::beginTrace("vkAcquireProfilingLockKHR decode");
                 VkDevice device;
                 const VkAcquireProfilingLockInfoKHR* pInfo;
@@ -14653,34 +16982,40 @@
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
                 vkReadStream->alloc((void**)&pInfo, sizeof(const VkAcquireProfilingLockInfoKHR));
-                reservedunmarshal_VkAcquireProfilingLockInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAcquireProfilingLockInfoKHR*)(pInfo), readStreamPtrPtr);
-                if (pInfo)
-                {
-                    transform_tohost_VkAcquireProfilingLockInfoKHR(m_state, (VkAcquireProfilingLockInfoKHR*)(pInfo));
+                reservedunmarshal_VkAcquireProfilingLockInfoKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkAcquireProfilingLockInfoKHR*)(pInfo), readStreamPtrPtr);
+                if (pInfo) {
+                    transform_tohost_VkAcquireProfilingLockInfoKHR(
+                        m_state, (VkAcquireProfilingLockInfoKHR*)(pInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkAcquireProfilingLockKHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkAcquireProfilingLockKHR 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pInfo);
                 }
                 VkResult vkAcquireProfilingLockKHR_VkResult_return = (VkResult)0;
-                vkAcquireProfilingLockKHR_VkResult_return = vk->vkAcquireProfilingLockKHR(unboxed_device, pInfo);
-                if ((vkAcquireProfilingLockKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkAcquireProfilingLockKHR_VkResult_return =
+                    vk->vkAcquireProfilingLockKHR(unboxed_device, pInfo);
+                if ((vkAcquireProfilingLockKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkAcquireProfilingLockKHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkAcquireProfilingLockKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkAcquireProfilingLockKHR_VkResult_return, device, pInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkAcquireProfilingLockKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkAcquireProfilingLockKHR_VkResult_return, device, pInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkReleaseProfilingLockKHR:
-            {
+            case OP_vkReleaseProfilingLockKHR: {
                 android::base::beginTrace("vkReleaseProfilingLockKHR decode");
                 VkDevice device;
                 // Begin non wrapped dispatchable handle unboxing for device;
@@ -14691,20 +17026,22 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkReleaseProfilingLockKHR 0x%llx \n", ioStream, (unsigned long long)device);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkReleaseProfilingLockKHR 0x%llx \n", ioStream,
+                            (unsigned long long)device);
                 }
                 vk->vkReleaseProfilingLockKHR(unboxed_device);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkReleaseProfilingLockKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkReleaseProfilingLockKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -14712,8 +17049,7 @@
 #ifdef VK_KHR_maintenance2
 #endif
 #ifdef VK_KHR_get_surface_capabilities2
-            case OP_vkGetPhysicalDeviceSurfaceCapabilities2KHR:
-            {
+            case OP_vkGetPhysicalDeviceSurfaceCapabilities2KHR: {
                 android::base::beginTrace("vkGetPhysicalDeviceSurfaceCapabilities2KHR decode");
                 VkPhysicalDevice physicalDevice;
                 const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo;
@@ -14722,52 +17058,73 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
-                vkReadStream->alloc((void**)&pSurfaceInfo, sizeof(const VkPhysicalDeviceSurfaceInfo2KHR));
-                reservedunmarshal_VkPhysicalDeviceSurfaceInfo2KHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceSurfaceInfo2KHR*)(pSurfaceInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pSurfaceInfo,
+                                    sizeof(const VkPhysicalDeviceSurfaceInfo2KHR));
+                reservedunmarshal_VkPhysicalDeviceSurfaceInfo2KHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPhysicalDeviceSurfaceInfo2KHR*)(pSurfaceInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pSurfaceCapabilities;
                 vkReadStream->unsetHandleMapping();
-                vkReadStream->alloc((void**)&pSurfaceCapabilities, sizeof(VkSurfaceCapabilities2KHR));
-                reservedunmarshal_VkSurfaceCapabilities2KHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSurfaceCapabilities2KHR*)(pSurfaceCapabilities), readStreamPtrPtr);
-                if (pSurfaceInfo)
-                {
-                    transform_tohost_VkPhysicalDeviceSurfaceInfo2KHR(m_state, (VkPhysicalDeviceSurfaceInfo2KHR*)(pSurfaceInfo));
+                vkReadStream->alloc((void**)&pSurfaceCapabilities,
+                                    sizeof(VkSurfaceCapabilities2KHR));
+                reservedunmarshal_VkSurfaceCapabilities2KHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkSurfaceCapabilities2KHR*)(pSurfaceCapabilities), readStreamPtrPtr);
+                if (pSurfaceInfo) {
+                    transform_tohost_VkPhysicalDeviceSurfaceInfo2KHR(
+                        m_state, (VkPhysicalDeviceSurfaceInfo2KHR*)(pSurfaceInfo));
                 }
-                if (pSurfaceCapabilities)
-                {
-                    transform_tohost_VkSurfaceCapabilities2KHR(m_state, (VkSurfaceCapabilities2KHR*)(pSurfaceCapabilities));
+                if (pSurfaceCapabilities) {
+                    transform_tohost_VkSurfaceCapabilities2KHR(
+                        m_state, (VkSurfaceCapabilities2KHR*)(pSurfaceCapabilities));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceSurfaceCapabilities2KHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pSurfaceInfo, (unsigned long long)pSurfaceCapabilities);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceSurfaceCapabilities2KHR 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)pSurfaceInfo,
+                            (unsigned long long)pSurfaceCapabilities);
                 }
                 VkResult vkGetPhysicalDeviceSurfaceCapabilities2KHR_VkResult_return = (VkResult)0;
-                vkGetPhysicalDeviceSurfaceCapabilities2KHR_VkResult_return = vk->vkGetPhysicalDeviceSurfaceCapabilities2KHR(unboxed_physicalDevice, pSurfaceInfo, pSurfaceCapabilities);
-                if ((vkGetPhysicalDeviceSurfaceCapabilities2KHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetPhysicalDeviceSurfaceCapabilities2KHR_VkResult_return =
+                    vk->vkGetPhysicalDeviceSurfaceCapabilities2KHR(
+                        unboxed_physicalDevice, pSurfaceInfo, pSurfaceCapabilities);
+                if ((vkGetPhysicalDeviceSurfaceCapabilities2KHR_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                if (pSurfaceCapabilities)
-                {
-                    transform_fromhost_VkSurfaceCapabilities2KHR(m_state, (VkSurfaceCapabilities2KHR*)(pSurfaceCapabilities));
+                if (pSurfaceCapabilities) {
+                    transform_fromhost_VkSurfaceCapabilities2KHR(
+                        m_state, (VkSurfaceCapabilities2KHR*)(pSurfaceCapabilities));
                 }
-                marshal_VkSurfaceCapabilities2KHR(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSurfaceCapabilities2KHR*)(pSurfaceCapabilities));
-                vkStream->write(&vkGetPhysicalDeviceSurfaceCapabilities2KHR_VkResult_return, sizeof(VkResult));
+                marshal_VkSurfaceCapabilities2KHR(
+                    vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkSurfaceCapabilities2KHR*)(pSurfaceCapabilities));
+                vkStream->write(&vkGetPhysicalDeviceSurfaceCapabilities2KHR_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceSurfaceCapabilities2KHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetPhysicalDeviceSurfaceCapabilities2KHR_VkResult_return, physicalDevice, pSurfaceInfo, pSurfaceCapabilities);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceSurfaceCapabilities2KHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetPhysicalDeviceSurfaceCapabilities2KHR_VkResult_return, physicalDevice,
+                        pSurfaceInfo, pSurfaceCapabilities);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceSurfaceFormats2KHR:
-            {
+            case OP_vkGetPhysicalDeviceSurfaceFormats2KHR: {
                 android::base::beginTrace("vkGetPhysicalDeviceSurfaceFormats2KHR decode");
                 VkPhysicalDevice physicalDevice;
                 const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo;
@@ -14777,20 +17134,23 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
-                vkReadStream->alloc((void**)&pSurfaceInfo, sizeof(const VkPhysicalDeviceSurfaceInfo2KHR));
-                reservedunmarshal_VkPhysicalDeviceSurfaceInfo2KHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceSurfaceInfo2KHR*)(pSurfaceInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pSurfaceInfo,
+                                    sizeof(const VkPhysicalDeviceSurfaceInfo2KHR));
+                reservedunmarshal_VkPhysicalDeviceSurfaceInfo2KHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPhysicalDeviceSurfaceInfo2KHR*)(pSurfaceInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pSurfaceFormatCount;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 memcpy((uint32_t**)&pSurfaceFormatCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pSurfaceFormatCount);
                 *readStreamPtrPtr += 8;
-                if (pSurfaceFormatCount)
-                {
+                if (pSurfaceFormatCount) {
                     vkReadStream->alloc((void**)&pSurfaceFormatCount, sizeof(uint32_t));
                     memcpy((uint32_t*)pSurfaceFormatCount, *readStreamPtrPtr, sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
@@ -14801,76 +17161,84 @@
                 memcpy((VkSurfaceFormat2KHR**)&pSurfaceFormats, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pSurfaceFormats);
                 *readStreamPtrPtr += 8;
-                if (pSurfaceFormats)
-                {
-                    vkReadStream->alloc((void**)&pSurfaceFormats, (*(pSurfaceFormatCount)) * sizeof(VkSurfaceFormat2KHR));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pSurfaceFormatCount)); ++i)
-                    {
-                        reservedunmarshal_VkSurfaceFormat2KHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSurfaceFormat2KHR*)(pSurfaceFormats + i), readStreamPtrPtr);
+                if (pSurfaceFormats) {
+                    vkReadStream->alloc((void**)&pSurfaceFormats,
+                                        (*(pSurfaceFormatCount)) * sizeof(VkSurfaceFormat2KHR));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pSurfaceFormatCount)); ++i) {
+                        reservedunmarshal_VkSurfaceFormat2KHR(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkSurfaceFormat2KHR*)(pSurfaceFormats + i), readStreamPtrPtr);
                     }
                 }
-                if (pSurfaceInfo)
-                {
-                    transform_tohost_VkPhysicalDeviceSurfaceInfo2KHR(m_state, (VkPhysicalDeviceSurfaceInfo2KHR*)(pSurfaceInfo));
+                if (pSurfaceInfo) {
+                    transform_tohost_VkPhysicalDeviceSurfaceInfo2KHR(
+                        m_state, (VkPhysicalDeviceSurfaceInfo2KHR*)(pSurfaceInfo));
                 }
-                if (pSurfaceFormatCount)
-                {
-                    if (pSurfaceFormats)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pSurfaceFormatCount)); ++i)
-                        {
-                            transform_tohost_VkSurfaceFormat2KHR(m_state, (VkSurfaceFormat2KHR*)(pSurfaceFormats + i));
+                if (pSurfaceFormatCount) {
+                    if (pSurfaceFormats) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pSurfaceFormatCount)); ++i) {
+                            transform_tohost_VkSurfaceFormat2KHR(
+                                m_state, (VkSurfaceFormat2KHR*)(pSurfaceFormats + i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceSurfaceFormats2KHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pSurfaceInfo, (unsigned long long)pSurfaceFormatCount, (unsigned long long)pSurfaceFormats);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceSurfaceFormats2KHR 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)pSurfaceInfo,
+                            (unsigned long long)pSurfaceFormatCount,
+                            (unsigned long long)pSurfaceFormats);
                 }
                 VkResult vkGetPhysicalDeviceSurfaceFormats2KHR_VkResult_return = (VkResult)0;
-                vkGetPhysicalDeviceSurfaceFormats2KHR_VkResult_return = vk->vkGetPhysicalDeviceSurfaceFormats2KHR(unboxed_physicalDevice, pSurfaceInfo, pSurfaceFormatCount, pSurfaceFormats);
-                if ((vkGetPhysicalDeviceSurfaceFormats2KHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetPhysicalDeviceSurfaceFormats2KHR_VkResult_return =
+                    vk->vkGetPhysicalDeviceSurfaceFormats2KHR(unboxed_physicalDevice, pSurfaceInfo,
+                                                              pSurfaceFormatCount, pSurfaceFormats);
+                if ((vkGetPhysicalDeviceSurfaceFormats2KHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pSurfaceFormatCount;
                 vkStream->putBe64(cgen_var_3);
-                if (pSurfaceFormatCount)
-                {
+                if (pSurfaceFormatCount) {
                     vkStream->write((uint32_t*)pSurfaceFormatCount, sizeof(uint32_t));
                 }
-                if (pSurfaceFormatCount)
-                {
-                    if (pSurfaceFormats)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pSurfaceFormatCount)); ++i)
-                        {
-                            transform_fromhost_VkSurfaceFormat2KHR(m_state, (VkSurfaceFormat2KHR*)(pSurfaceFormats + i));
+                if (pSurfaceFormatCount) {
+                    if (pSurfaceFormats) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pSurfaceFormatCount)); ++i) {
+                            transform_fromhost_VkSurfaceFormat2KHR(
+                                m_state, (VkSurfaceFormat2KHR*)(pSurfaceFormats + i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pSurfaceFormats;
                 vkStream->putBe64(cgen_var_4);
-                if (pSurfaceFormats)
-                {
-                    if (pSurfaceFormatCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pSurfaceFormatCount)); ++i)
-                        {
-                            marshal_VkSurfaceFormat2KHR(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSurfaceFormat2KHR*)(pSurfaceFormats + i));
+                if (pSurfaceFormats) {
+                    if (pSurfaceFormatCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pSurfaceFormatCount)); ++i) {
+                            marshal_VkSurfaceFormat2KHR(
+                                vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                (VkSurfaceFormat2KHR*)(pSurfaceFormats + i));
                         }
                     }
                 }
-                vkStream->write(&vkGetPhysicalDeviceSurfaceFormats2KHR_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkGetPhysicalDeviceSurfaceFormats2KHR_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceSurfaceFormats2KHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetPhysicalDeviceSurfaceFormats2KHR_VkResult_return, physicalDevice, pSurfaceInfo, pSurfaceFormatCount, pSurfaceFormats);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceSurfaceFormats2KHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetPhysicalDeviceSurfaceFormats2KHR_VkResult_return, physicalDevice,
+                        pSurfaceInfo, pSurfaceFormatCount, pSurfaceFormats);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -14878,8 +17246,7 @@
 #ifdef VK_KHR_variable_pointers
 #endif
 #ifdef VK_KHR_get_display_properties2
-            case OP_vkGetPhysicalDeviceDisplayProperties2KHR:
-            {
+            case OP_vkGetPhysicalDeviceDisplayProperties2KHR: {
                 android::base::beginTrace("vkGetPhysicalDeviceDisplayProperties2KHR decode");
                 VkPhysicalDevice physicalDevice;
                 uint32_t* pPropertyCount;
@@ -14888,7 +17255,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
@@ -14898,8 +17266,7 @@
                 memcpy((uint32_t**)&pPropertyCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pPropertyCount);
                 *readStreamPtrPtr += 8;
-                if (pPropertyCount)
-                {
+                if (pPropertyCount) {
                     vkReadStream->alloc((void**)&pPropertyCount, sizeof(uint32_t));
                     memcpy((uint32_t*)pPropertyCount, *readStreamPtrPtr, sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
@@ -14910,77 +17277,83 @@
                 memcpy((VkDisplayProperties2KHR**)&pProperties, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pProperties);
                 *readStreamPtrPtr += 8;
-                if (pProperties)
-                {
-                    vkReadStream->alloc((void**)&pProperties, (*(pPropertyCount)) * sizeof(VkDisplayProperties2KHR));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                    {
-                        reservedunmarshal_VkDisplayProperties2KHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayProperties2KHR*)(pProperties + i), readStreamPtrPtr);
+                if (pProperties) {
+                    vkReadStream->alloc((void**)&pProperties,
+                                        (*(pPropertyCount)) * sizeof(VkDisplayProperties2KHR));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                        reservedunmarshal_VkDisplayProperties2KHR(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkDisplayProperties2KHR*)(pProperties + i), readStreamPtrPtr);
                     }
                 }
-                if (pPropertyCount)
-                {
-                    if (pProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            transform_tohost_VkDisplayProperties2KHR(m_state, (VkDisplayProperties2KHR*)(pProperties + i));
+                if (pPropertyCount) {
+                    if (pProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            transform_tohost_VkDisplayProperties2KHR(
+                                m_state, (VkDisplayProperties2KHR*)(pProperties + i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceDisplayProperties2KHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pPropertyCount, (unsigned long long)pProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceDisplayProperties2KHR 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)pPropertyCount, (unsigned long long)pProperties);
                 }
                 VkResult vkGetPhysicalDeviceDisplayProperties2KHR_VkResult_return = (VkResult)0;
-                vkGetPhysicalDeviceDisplayProperties2KHR_VkResult_return = vk->vkGetPhysicalDeviceDisplayProperties2KHR(unboxed_physicalDevice, pPropertyCount, pProperties);
-                if ((vkGetPhysicalDeviceDisplayProperties2KHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetPhysicalDeviceDisplayProperties2KHR_VkResult_return =
+                    vk->vkGetPhysicalDeviceDisplayProperties2KHR(unboxed_physicalDevice,
+                                                                 pPropertyCount, pProperties);
+                if ((vkGetPhysicalDeviceDisplayProperties2KHR_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pPropertyCount;
                 vkStream->putBe64(cgen_var_3);
-                if (pPropertyCount)
-                {
+                if (pPropertyCount) {
                     vkStream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
                 }
-                if (pPropertyCount)
-                {
-                    if (pProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            transform_fromhost_VkDisplayProperties2KHR(m_state, (VkDisplayProperties2KHR*)(pProperties + i));
+                if (pPropertyCount) {
+                    if (pProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            transform_fromhost_VkDisplayProperties2KHR(
+                                m_state, (VkDisplayProperties2KHR*)(pProperties + i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pProperties;
                 vkStream->putBe64(cgen_var_4);
-                if (pProperties)
-                {
-                    if (pPropertyCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            marshal_VkDisplayProperties2KHR(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayProperties2KHR*)(pProperties + i));
+                if (pProperties) {
+                    if (pPropertyCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            marshal_VkDisplayProperties2KHR(
+                                vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                (VkDisplayProperties2KHR*)(pProperties + i));
                         }
                     }
                 }
-                vkStream->write(&vkGetPhysicalDeviceDisplayProperties2KHR_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkGetPhysicalDeviceDisplayProperties2KHR_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceDisplayProperties2KHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetPhysicalDeviceDisplayProperties2KHR_VkResult_return, physicalDevice, pPropertyCount, pProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceDisplayProperties2KHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetPhysicalDeviceDisplayProperties2KHR_VkResult_return, physicalDevice,
+                        pPropertyCount, pProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceDisplayPlaneProperties2KHR:
-            {
+            case OP_vkGetPhysicalDeviceDisplayPlaneProperties2KHR: {
                 android::base::beginTrace("vkGetPhysicalDeviceDisplayPlaneProperties2KHR decode");
                 VkPhysicalDevice physicalDevice;
                 uint32_t* pPropertyCount;
@@ -14989,7 +17362,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
@@ -14999,8 +17373,7 @@
                 memcpy((uint32_t**)&pPropertyCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pPropertyCount);
                 *readStreamPtrPtr += 8;
-                if (pPropertyCount)
-                {
+                if (pPropertyCount) {
                     vkReadStream->alloc((void**)&pPropertyCount, sizeof(uint32_t));
                     memcpy((uint32_t*)pPropertyCount, *readStreamPtrPtr, sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
@@ -15011,77 +17384,84 @@
                 memcpy((VkDisplayPlaneProperties2KHR**)&pProperties, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pProperties);
                 *readStreamPtrPtr += 8;
-                if (pProperties)
-                {
-                    vkReadStream->alloc((void**)&pProperties, (*(pPropertyCount)) * sizeof(VkDisplayPlaneProperties2KHR));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                    {
-                        reservedunmarshal_VkDisplayPlaneProperties2KHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayPlaneProperties2KHR*)(pProperties + i), readStreamPtrPtr);
+                if (pProperties) {
+                    vkReadStream->alloc((void**)&pProperties,
+                                        (*(pPropertyCount)) * sizeof(VkDisplayPlaneProperties2KHR));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                        reservedunmarshal_VkDisplayPlaneProperties2KHR(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkDisplayPlaneProperties2KHR*)(pProperties + i), readStreamPtrPtr);
                     }
                 }
-                if (pPropertyCount)
-                {
-                    if (pProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            transform_tohost_VkDisplayPlaneProperties2KHR(m_state, (VkDisplayPlaneProperties2KHR*)(pProperties + i));
+                if (pPropertyCount) {
+                    if (pProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            transform_tohost_VkDisplayPlaneProperties2KHR(
+                                m_state, (VkDisplayPlaneProperties2KHR*)(pProperties + i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceDisplayPlaneProperties2KHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pPropertyCount, (unsigned long long)pProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceDisplayPlaneProperties2KHR 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)pPropertyCount, (unsigned long long)pProperties);
                 }
-                VkResult vkGetPhysicalDeviceDisplayPlaneProperties2KHR_VkResult_return = (VkResult)0;
-                vkGetPhysicalDeviceDisplayPlaneProperties2KHR_VkResult_return = vk->vkGetPhysicalDeviceDisplayPlaneProperties2KHR(unboxed_physicalDevice, pPropertyCount, pProperties);
-                if ((vkGetPhysicalDeviceDisplayPlaneProperties2KHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                VkResult vkGetPhysicalDeviceDisplayPlaneProperties2KHR_VkResult_return =
+                    (VkResult)0;
+                vkGetPhysicalDeviceDisplayPlaneProperties2KHR_VkResult_return =
+                    vk->vkGetPhysicalDeviceDisplayPlaneProperties2KHR(unboxed_physicalDevice,
+                                                                      pPropertyCount, pProperties);
+                if ((vkGetPhysicalDeviceDisplayPlaneProperties2KHR_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pPropertyCount;
                 vkStream->putBe64(cgen_var_3);
-                if (pPropertyCount)
-                {
+                if (pPropertyCount) {
                     vkStream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
                 }
-                if (pPropertyCount)
-                {
-                    if (pProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            transform_fromhost_VkDisplayPlaneProperties2KHR(m_state, (VkDisplayPlaneProperties2KHR*)(pProperties + i));
+                if (pPropertyCount) {
+                    if (pProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            transform_fromhost_VkDisplayPlaneProperties2KHR(
+                                m_state, (VkDisplayPlaneProperties2KHR*)(pProperties + i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pProperties;
                 vkStream->putBe64(cgen_var_4);
-                if (pProperties)
-                {
-                    if (pPropertyCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            marshal_VkDisplayPlaneProperties2KHR(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayPlaneProperties2KHR*)(pProperties + i));
+                if (pProperties) {
+                    if (pPropertyCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            marshal_VkDisplayPlaneProperties2KHR(
+                                vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                (VkDisplayPlaneProperties2KHR*)(pProperties + i));
                         }
                     }
                 }
-                vkStream->write(&vkGetPhysicalDeviceDisplayPlaneProperties2KHR_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkGetPhysicalDeviceDisplayPlaneProperties2KHR_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceDisplayPlaneProperties2KHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetPhysicalDeviceDisplayPlaneProperties2KHR_VkResult_return, physicalDevice, pPropertyCount, pProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceDisplayPlaneProperties2KHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetPhysicalDeviceDisplayPlaneProperties2KHR_VkResult_return,
+                        physicalDevice, pPropertyCount, pProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetDisplayModeProperties2KHR:
-            {
+            case OP_vkGetDisplayModeProperties2KHR: {
                 android::base::beginTrace("vkGetDisplayModeProperties2KHR decode");
                 VkPhysicalDevice physicalDevice;
                 VkDisplayKHR display;
@@ -15091,22 +17471,23 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDisplayKHR*)&display = (VkDisplayKHR)unbox_VkDisplayKHR((VkDisplayKHR)(*&cgen_var_1));
+                *(VkDisplayKHR*)&display =
+                    (VkDisplayKHR)unbox_VkDisplayKHR((VkDisplayKHR)(*&cgen_var_1));
                 // Begin manual dispatchable handle unboxing for pPropertyCount;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 memcpy((uint32_t**)&pPropertyCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pPropertyCount);
                 *readStreamPtrPtr += 8;
-                if (pPropertyCount)
-                {
+                if (pPropertyCount) {
                     vkReadStream->alloc((void**)&pPropertyCount, sizeof(uint32_t));
                     memcpy((uint32_t*)pPropertyCount, *readStreamPtrPtr, sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
@@ -15117,77 +17498,81 @@
                 memcpy((VkDisplayModeProperties2KHR**)&pProperties, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pProperties);
                 *readStreamPtrPtr += 8;
-                if (pProperties)
-                {
-                    vkReadStream->alloc((void**)&pProperties, (*(pPropertyCount)) * sizeof(VkDisplayModeProperties2KHR));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                    {
-                        reservedunmarshal_VkDisplayModeProperties2KHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayModeProperties2KHR*)(pProperties + i), readStreamPtrPtr);
+                if (pProperties) {
+                    vkReadStream->alloc((void**)&pProperties,
+                                        (*(pPropertyCount)) * sizeof(VkDisplayModeProperties2KHR));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                        reservedunmarshal_VkDisplayModeProperties2KHR(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkDisplayModeProperties2KHR*)(pProperties + i), readStreamPtrPtr);
                     }
                 }
-                if (pPropertyCount)
-                {
-                    if (pProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            transform_tohost_VkDisplayModeProperties2KHR(m_state, (VkDisplayModeProperties2KHR*)(pProperties + i));
+                if (pPropertyCount) {
+                    if (pProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            transform_tohost_VkDisplayModeProperties2KHR(
+                                m_state, (VkDisplayModeProperties2KHR*)(pProperties + i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetDisplayModeProperties2KHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)display, (unsigned long long)pPropertyCount, (unsigned long long)pProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetDisplayModeProperties2KHR 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)display, (unsigned long long)pPropertyCount,
+                            (unsigned long long)pProperties);
                 }
                 VkResult vkGetDisplayModeProperties2KHR_VkResult_return = (VkResult)0;
-                vkGetDisplayModeProperties2KHR_VkResult_return = vk->vkGetDisplayModeProperties2KHR(unboxed_physicalDevice, display, pPropertyCount, pProperties);
-                if ((vkGetDisplayModeProperties2KHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetDisplayModeProperties2KHR_VkResult_return = vk->vkGetDisplayModeProperties2KHR(
+                    unboxed_physicalDevice, display, pPropertyCount, pProperties);
+                if ((vkGetDisplayModeProperties2KHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pPropertyCount;
                 vkStream->putBe64(cgen_var_4);
-                if (pPropertyCount)
-                {
+                if (pPropertyCount) {
                     vkStream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
                 }
-                if (pPropertyCount)
-                {
-                    if (pProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            transform_fromhost_VkDisplayModeProperties2KHR(m_state, (VkDisplayModeProperties2KHR*)(pProperties + i));
+                if (pPropertyCount) {
+                    if (pProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            transform_fromhost_VkDisplayModeProperties2KHR(
+                                m_state, (VkDisplayModeProperties2KHR*)(pProperties + i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_5 = (uint64_t)(uintptr_t)pProperties;
                 vkStream->putBe64(cgen_var_5);
-                if (pProperties)
-                {
-                    if (pPropertyCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            marshal_VkDisplayModeProperties2KHR(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayModeProperties2KHR*)(pProperties + i));
+                if (pProperties) {
+                    if (pPropertyCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            marshal_VkDisplayModeProperties2KHR(
+                                vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                (VkDisplayModeProperties2KHR*)(pProperties + i));
                         }
                     }
                 }
                 vkStream->write(&vkGetDisplayModeProperties2KHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetDisplayModeProperties2KHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetDisplayModeProperties2KHR_VkResult_return, physicalDevice, display, pPropertyCount, pProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetDisplayModeProperties2KHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetDisplayModeProperties2KHR_VkResult_return, physicalDevice, display,
+                        pPropertyCount, pProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetDisplayPlaneCapabilities2KHR:
-            {
+            case OP_vkGetDisplayPlaneCapabilities2KHR: {
                 android::base::beginTrace("vkGetDisplayPlaneCapabilities2KHR decode");
                 VkPhysicalDevice physicalDevice;
                 const VkDisplayPlaneInfo2KHR* pDisplayPlaneInfo;
@@ -15196,47 +17581,66 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
-                vkReadStream->alloc((void**)&pDisplayPlaneInfo, sizeof(const VkDisplayPlaneInfo2KHR));
-                reservedunmarshal_VkDisplayPlaneInfo2KHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayPlaneInfo2KHR*)(pDisplayPlaneInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pDisplayPlaneInfo,
+                                    sizeof(const VkDisplayPlaneInfo2KHR));
+                reservedunmarshal_VkDisplayPlaneInfo2KHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkDisplayPlaneInfo2KHR*)(pDisplayPlaneInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pCapabilities;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pCapabilities, sizeof(VkDisplayPlaneCapabilities2KHR));
-                reservedunmarshal_VkDisplayPlaneCapabilities2KHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayPlaneCapabilities2KHR*)(pCapabilities), readStreamPtrPtr);
-                if (pDisplayPlaneInfo)
-                {
-                    transform_tohost_VkDisplayPlaneInfo2KHR(m_state, (VkDisplayPlaneInfo2KHR*)(pDisplayPlaneInfo));
+                reservedunmarshal_VkDisplayPlaneCapabilities2KHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkDisplayPlaneCapabilities2KHR*)(pCapabilities), readStreamPtrPtr);
+                if (pDisplayPlaneInfo) {
+                    transform_tohost_VkDisplayPlaneInfo2KHR(
+                        m_state, (VkDisplayPlaneInfo2KHR*)(pDisplayPlaneInfo));
                 }
-                if (pCapabilities)
-                {
-                    transform_tohost_VkDisplayPlaneCapabilities2KHR(m_state, (VkDisplayPlaneCapabilities2KHR*)(pCapabilities));
+                if (pCapabilities) {
+                    transform_tohost_VkDisplayPlaneCapabilities2KHR(
+                        m_state, (VkDisplayPlaneCapabilities2KHR*)(pCapabilities));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetDisplayPlaneCapabilities2KHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pDisplayPlaneInfo, (unsigned long long)pCapabilities);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkGetDisplayPlaneCapabilities2KHR 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)physicalDevice,
+                        (unsigned long long)pDisplayPlaneInfo, (unsigned long long)pCapabilities);
                 }
                 VkResult vkGetDisplayPlaneCapabilities2KHR_VkResult_return = (VkResult)0;
-                vkGetDisplayPlaneCapabilities2KHR_VkResult_return = vk->vkGetDisplayPlaneCapabilities2KHR(unboxed_physicalDevice, pDisplayPlaneInfo, pCapabilities);
-                if ((vkGetDisplayPlaneCapabilities2KHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetDisplayPlaneCapabilities2KHR_VkResult_return =
+                    vk->vkGetDisplayPlaneCapabilities2KHR(unboxed_physicalDevice, pDisplayPlaneInfo,
+                                                          pCapabilities);
+                if ((vkGetDisplayPlaneCapabilities2KHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                if (pCapabilities)
-                {
-                    transform_fromhost_VkDisplayPlaneCapabilities2KHR(m_state, (VkDisplayPlaneCapabilities2KHR*)(pCapabilities));
+                if (pCapabilities) {
+                    transform_fromhost_VkDisplayPlaneCapabilities2KHR(
+                        m_state, (VkDisplayPlaneCapabilities2KHR*)(pCapabilities));
                 }
-                marshal_VkDisplayPlaneCapabilities2KHR(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayPlaneCapabilities2KHR*)(pCapabilities));
-                vkStream->write(&vkGetDisplayPlaneCapabilities2KHR_VkResult_return, sizeof(VkResult));
+                marshal_VkDisplayPlaneCapabilities2KHR(
+                    vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkDisplayPlaneCapabilities2KHR*)(pCapabilities));
+                vkStream->write(&vkGetDisplayPlaneCapabilities2KHR_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetDisplayPlaneCapabilities2KHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetDisplayPlaneCapabilities2KHR_VkResult_return, physicalDevice, pDisplayPlaneInfo, pCapabilities);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetDisplayPlaneCapabilities2KHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetDisplayPlaneCapabilities2KHR_VkResult_return, physicalDevice,
+                        pDisplayPlaneInfo, pCapabilities);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -15248,8 +17652,7 @@
 #ifdef VK_KHR_relaxed_block_layout
 #endif
 #ifdef VK_KHR_get_memory_requirements2
-            case OP_vkGetImageMemoryRequirements2KHR:
-            {
+            case OP_vkGetImageMemoryRequirements2KHR: {
                 android::base::beginTrace("vkGetImageMemoryRequirements2KHR decode");
                 VkDevice device;
                 const VkImageMemoryRequirementsInfo2* pInfo;
@@ -15260,44 +17663,55 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
                 vkReadStream->alloc((void**)&pInfo, sizeof(const VkImageMemoryRequirementsInfo2));
-                reservedunmarshal_VkImageMemoryRequirementsInfo2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageMemoryRequirementsInfo2*)(pInfo), readStreamPtrPtr);
+                reservedunmarshal_VkImageMemoryRequirementsInfo2(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkImageMemoryRequirementsInfo2*)(pInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pMemoryRequirements;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pMemoryRequirements, sizeof(VkMemoryRequirements2));
-                reservedunmarshal_VkMemoryRequirements2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements2*)(pMemoryRequirements), readStreamPtrPtr);
-                if (pInfo)
-                {
-                    transform_tohost_VkImageMemoryRequirementsInfo2(m_state, (VkImageMemoryRequirementsInfo2*)(pInfo));
+                reservedunmarshal_VkMemoryRequirements2(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkMemoryRequirements2*)(pMemoryRequirements), readStreamPtrPtr);
+                if (pInfo) {
+                    transform_tohost_VkImageMemoryRequirementsInfo2(
+                        m_state, (VkImageMemoryRequirementsInfo2*)(pInfo));
                 }
-                if (pMemoryRequirements)
-                {
-                    transform_tohost_VkMemoryRequirements2(m_state, (VkMemoryRequirements2*)(pMemoryRequirements));
+                if (pMemoryRequirements) {
+                    transform_tohost_VkMemoryRequirements2(
+                        m_state, (VkMemoryRequirements2*)(pMemoryRequirements));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetImageMemoryRequirements2KHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pInfo, (unsigned long long)pMemoryRequirements);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkGetImageMemoryRequirements2KHR 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device, (unsigned long long)pInfo,
+                        (unsigned long long)pMemoryRequirements);
                 }
-                m_state->on_vkGetImageMemoryRequirements2KHR(&m_pool, device, pInfo, pMemoryRequirements);
+                m_state->on_vkGetImageMemoryRequirements2KHR(&m_pool, device, pInfo,
+                                                             pMemoryRequirements);
                 vkStream->unsetHandleMapping();
-                if (pMemoryRequirements)
-                {
-                    transform_fromhost_VkMemoryRequirements2(m_state, (VkMemoryRequirements2*)(pMemoryRequirements));
+                if (pMemoryRequirements) {
+                    transform_fromhost_VkMemoryRequirements2(
+                        m_state, (VkMemoryRequirements2*)(pMemoryRequirements));
                 }
-                marshal_VkMemoryRequirements2(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements2*)(pMemoryRequirements));
+                marshal_VkMemoryRequirements2(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                              (VkMemoryRequirements2*)(pMemoryRequirements));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetImageMemoryRequirements2KHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, pInfo, pMemoryRequirements);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetImageMemoryRequirements2KHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, pInfo,
+                        pMemoryRequirements);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetBufferMemoryRequirements2KHR:
-            {
+            case OP_vkGetBufferMemoryRequirements2KHR: {
                 android::base::beginTrace("vkGetBufferMemoryRequirements2KHR decode");
                 VkDevice device;
                 const VkBufferMemoryRequirementsInfo2* pInfo;
@@ -15311,44 +17725,54 @@
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
                 vkReadStream->alloc((void**)&pInfo, sizeof(const VkBufferMemoryRequirementsInfo2));
-                reservedunmarshal_VkBufferMemoryRequirementsInfo2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferMemoryRequirementsInfo2*)(pInfo), readStreamPtrPtr);
+                reservedunmarshal_VkBufferMemoryRequirementsInfo2(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkBufferMemoryRequirementsInfo2*)(pInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pMemoryRequirements;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pMemoryRequirements, sizeof(VkMemoryRequirements2));
-                reservedunmarshal_VkMemoryRequirements2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements2*)(pMemoryRequirements), readStreamPtrPtr);
-                if (pInfo)
-                {
-                    transform_tohost_VkBufferMemoryRequirementsInfo2(m_state, (VkBufferMemoryRequirementsInfo2*)(pInfo));
+                reservedunmarshal_VkMemoryRequirements2(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkMemoryRequirements2*)(pMemoryRequirements), readStreamPtrPtr);
+                if (pInfo) {
+                    transform_tohost_VkBufferMemoryRequirementsInfo2(
+                        m_state, (VkBufferMemoryRequirementsInfo2*)(pInfo));
                 }
-                if (pMemoryRequirements)
-                {
-                    transform_tohost_VkMemoryRequirements2(m_state, (VkMemoryRequirements2*)(pMemoryRequirements));
+                if (pMemoryRequirements) {
+                    transform_tohost_VkMemoryRequirements2(
+                        m_state, (VkMemoryRequirements2*)(pMemoryRequirements));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetBufferMemoryRequirements2KHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pInfo, (unsigned long long)pMemoryRequirements);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkGetBufferMemoryRequirements2KHR 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device, (unsigned long long)pInfo,
+                        (unsigned long long)pMemoryRequirements);
                 }
                 vk->vkGetBufferMemoryRequirements2KHR(unboxed_device, pInfo, pMemoryRequirements);
                 vkStream->unsetHandleMapping();
-                if (pMemoryRequirements)
-                {
-                    transform_fromhost_VkMemoryRequirements2(m_state, (VkMemoryRequirements2*)(pMemoryRequirements));
+                if (pMemoryRequirements) {
+                    transform_fromhost_VkMemoryRequirements2(
+                        m_state, (VkMemoryRequirements2*)(pMemoryRequirements));
                 }
-                marshal_VkMemoryRequirements2(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements2*)(pMemoryRequirements));
+                marshal_VkMemoryRequirements2(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                              (VkMemoryRequirements2*)(pMemoryRequirements));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetBufferMemoryRequirements2KHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, pInfo, pMemoryRequirements);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetBufferMemoryRequirements2KHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, pInfo,
+                        pMemoryRequirements);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetImageSparseMemoryRequirements2KHR:
-            {
+            case OP_vkGetImageSparseMemoryRequirements2KHR: {
                 android::base::beginTrace("vkGetImageSparseMemoryRequirements2KHR decode");
                 VkDevice device;
                 const VkImageSparseMemoryRequirementsInfo2* pInfo;
@@ -15362,93 +17786,108 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pInfo, sizeof(const VkImageSparseMemoryRequirementsInfo2));
-                reservedunmarshal_VkImageSparseMemoryRequirementsInfo2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageSparseMemoryRequirementsInfo2*)(pInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pInfo,
+                                    sizeof(const VkImageSparseMemoryRequirementsInfo2));
+                reservedunmarshal_VkImageSparseMemoryRequirementsInfo2(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkImageSparseMemoryRequirementsInfo2*)(pInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pSparseMemoryRequirementCount;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 memcpy((uint32_t**)&pSparseMemoryRequirementCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pSparseMemoryRequirementCount);
                 *readStreamPtrPtr += 8;
-                if (pSparseMemoryRequirementCount)
-                {
+                if (pSparseMemoryRequirementCount) {
                     vkReadStream->alloc((void**)&pSparseMemoryRequirementCount, sizeof(uint32_t));
-                    memcpy((uint32_t*)pSparseMemoryRequirementCount, *readStreamPtrPtr, sizeof(uint32_t));
+                    memcpy((uint32_t*)pSparseMemoryRequirementCount, *readStreamPtrPtr,
+                           sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
                 }
                 // Begin manual dispatchable handle unboxing for pSparseMemoryRequirements;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
-                memcpy((VkSparseImageMemoryRequirements2**)&pSparseMemoryRequirements, (*readStreamPtrPtr), 8);
+                memcpy((VkSparseImageMemoryRequirements2**)&pSparseMemoryRequirements,
+                       (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pSparseMemoryRequirements);
                 *readStreamPtrPtr += 8;
-                if (pSparseMemoryRequirements)
-                {
-                    vkReadStream->alloc((void**)&pSparseMemoryRequirements, (*(pSparseMemoryRequirementCount)) * sizeof(VkSparseImageMemoryRequirements2));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i)
-                    {
-                        reservedunmarshal_VkSparseImageMemoryRequirements2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i), readStreamPtrPtr);
+                if (pSparseMemoryRequirements) {
+                    vkReadStream->alloc((void**)&pSparseMemoryRequirements,
+                                        (*(pSparseMemoryRequirementCount)) *
+                                            sizeof(VkSparseImageMemoryRequirements2));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i) {
+                        reservedunmarshal_VkSparseImageMemoryRequirements2(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i),
+                            readStreamPtrPtr);
                     }
                 }
-                if (pInfo)
-                {
-                    transform_tohost_VkImageSparseMemoryRequirementsInfo2(m_state, (VkImageSparseMemoryRequirementsInfo2*)(pInfo));
+                if (pInfo) {
+                    transform_tohost_VkImageSparseMemoryRequirementsInfo2(
+                        m_state, (VkImageSparseMemoryRequirementsInfo2*)(pInfo));
                 }
-                if (pSparseMemoryRequirementCount)
-                {
-                    if (pSparseMemoryRequirements)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i)
-                        {
-                            transform_tohost_VkSparseImageMemoryRequirements2(m_state, (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i));
+                if (pSparseMemoryRequirementCount) {
+                    if (pSparseMemoryRequirements) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount));
+                             ++i) {
+                            transform_tohost_VkSparseImageMemoryRequirements2(
+                                m_state,
+                                (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetImageSparseMemoryRequirements2KHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pInfo, (unsigned long long)pSparseMemoryRequirementCount, (unsigned long long)pSparseMemoryRequirements);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetImageSparseMemoryRequirements2KHR 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pInfo,
+                            (unsigned long long)pSparseMemoryRequirementCount,
+                            (unsigned long long)pSparseMemoryRequirements);
                 }
-                vk->vkGetImageSparseMemoryRequirements2KHR(unboxed_device, pInfo, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
+                vk->vkGetImageSparseMemoryRequirements2KHR(unboxed_device, pInfo,
+                                                           pSparseMemoryRequirementCount,
+                                                           pSparseMemoryRequirements);
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pSparseMemoryRequirementCount;
                 vkStream->putBe64(cgen_var_3);
-                if (pSparseMemoryRequirementCount)
-                {
+                if (pSparseMemoryRequirementCount) {
                     vkStream->write((uint32_t*)pSparseMemoryRequirementCount, sizeof(uint32_t));
                 }
-                if (pSparseMemoryRequirementCount)
-                {
-                    if (pSparseMemoryRequirements)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i)
-                        {
-                            transform_fromhost_VkSparseImageMemoryRequirements2(m_state, (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i));
+                if (pSparseMemoryRequirementCount) {
+                    if (pSparseMemoryRequirements) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount));
+                             ++i) {
+                            transform_fromhost_VkSparseImageMemoryRequirements2(
+                                m_state,
+                                (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pSparseMemoryRequirements;
                 vkStream->putBe64(cgen_var_4);
-                if (pSparseMemoryRequirements)
-                {
-                    if (pSparseMemoryRequirementCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i)
-                        {
-                            marshal_VkSparseImageMemoryRequirements2(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i));
+                if (pSparseMemoryRequirements) {
+                    if (pSparseMemoryRequirementCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount));
+                             ++i) {
+                            marshal_VkSparseImageMemoryRequirements2(
+                                vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i));
                         }
                     }
                 }
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetImageSparseMemoryRequirements2KHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, pInfo, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetImageSparseMemoryRequirements2KHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, pInfo,
+                        pSparseMemoryRequirementCount, pSparseMemoryRequirements);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -15456,8 +17895,7 @@
 #ifdef VK_KHR_image_format_list
 #endif
 #ifdef VK_KHR_sampler_ycbcr_conversion
-            case OP_vkCreateSamplerYcbcrConversionKHR:
-            {
+            case OP_vkCreateSamplerYcbcrConversionKHR: {
                 android::base::beginTrace("vkCreateSamplerYcbcrConversionKHR decode");
                 VkDevice device;
                 const VkSamplerYcbcrConversionCreateInfo* pCreateInfo;
@@ -15468,16 +17906,20 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
-                vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkSamplerYcbcrConversionCreateInfo));
-                reservedunmarshal_VkSamplerYcbcrConversionCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSamplerYcbcrConversionCreateInfo*)(pCreateInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pCreateInfo,
+                                    sizeof(const VkSamplerYcbcrConversionCreateInfo));
+                reservedunmarshal_VkSamplerYcbcrConversionCreateInfo(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkSamplerYcbcrConversionCreateInfo*)(pCreateInfo), readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pYcbcrConversion;
                 vkReadStream->unsetHandleMapping();
@@ -15485,46 +17927,61 @@
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkSamplerYcbcrConversion*)pYcbcrConversion = (VkSamplerYcbcrConversion)(VkSamplerYcbcrConversion)((VkSamplerYcbcrConversion)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkSamplerYcbcrConversionCreateInfo(m_state, (VkSamplerYcbcrConversionCreateInfo*)(pCreateInfo));
+                *(VkSamplerYcbcrConversion*)pYcbcrConversion =
+                    (VkSamplerYcbcrConversion)(VkSamplerYcbcrConversion)((
+                        VkSamplerYcbcrConversion)(*&cgen_var_2));
+                if (pCreateInfo) {
+                    transform_tohost_VkSamplerYcbcrConversionCreateInfo(
+                        m_state, (VkSamplerYcbcrConversionCreateInfo*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateSamplerYcbcrConversionKHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pYcbcrConversion);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateSamplerYcbcrConversionKHR 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pYcbcrConversion);
                 }
                 VkResult vkCreateSamplerYcbcrConversionKHR_VkResult_return = (VkResult)0;
-                vkCreateSamplerYcbcrConversionKHR_VkResult_return = m_state->on_vkCreateSamplerYcbcrConversionKHR(&m_pool, device, pCreateInfo, pAllocator, pYcbcrConversion);
-                if ((vkCreateSamplerYcbcrConversionKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateSamplerYcbcrConversionKHR_VkResult_return =
+                    m_state->on_vkCreateSamplerYcbcrConversionKHR(&m_pool, device, pCreateInfo,
+                                                                  pAllocator, pYcbcrConversion);
+                if ((vkCreateSamplerYcbcrConversionKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // Begin manual non dispatchable handle create for pYcbcrConversion;
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3;
-                static_assert(8 == sizeof(VkSamplerYcbcrConversion), "handle map overwrite requires VkSamplerYcbcrConversion to be 8 bytes long");
-                vkStream->handleMapping()->mapHandles_VkSamplerYcbcrConversion((VkSamplerYcbcrConversion*)pYcbcrConversion, 1);
+                static_assert(
+                    8 == sizeof(VkSamplerYcbcrConversion),
+                    "handle map overwrite requires VkSamplerYcbcrConversion to be 8 bytes long");
+                vkStream->handleMapping()->mapHandles_VkSamplerYcbcrConversion(
+                    (VkSamplerYcbcrConversion*)pYcbcrConversion, 1);
                 vkStream->write((VkSamplerYcbcrConversion*)pYcbcrConversion, 8 * 1);
                 // Begin manual non dispatchable handle create for pYcbcrConversion;
                 vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
-                vkStream->write(&vkCreateSamplerYcbcrConversionKHR_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkCreateSamplerYcbcrConversionKHR_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateSamplerYcbcrConversionKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateSamplerYcbcrConversionKHR_VkResult_return, device, pCreateInfo, pAllocator, pYcbcrConversion);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateSamplerYcbcrConversionKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateSamplerYcbcrConversionKHR_VkResult_return, device, pCreateInfo,
+                        pAllocator, pYcbcrConversion);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroySamplerYcbcrConversionKHR:
-            {
+            case OP_vkDestroySamplerYcbcrConversionKHR: {
                 android::base::beginTrace("vkDestroySamplerYcbcrConversionKHR decode");
                 VkDevice device;
                 VkSamplerYcbcrConversion ycbcrConversion;
@@ -15539,44 +17996,53 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkSamplerYcbcrConversion*)&ycbcrConversion = (VkSamplerYcbcrConversion)(VkSamplerYcbcrConversion)((VkSamplerYcbcrConversion)(*&cgen_var_1));
+                *(VkSamplerYcbcrConversion*)&ycbcrConversion =
+                    (VkSamplerYcbcrConversion)(VkSamplerYcbcrConversion)((
+                        VkSamplerYcbcrConversion)(*&cgen_var_1));
                 boxed_ycbcrConversion_preserve = ycbcrConversion;
                 ycbcrConversion = unbox_VkSamplerYcbcrConversion(ycbcrConversion);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroySamplerYcbcrConversionKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)ycbcrConversion, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkDestroySamplerYcbcrConversionKHR 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)device,
+                            (unsigned long long)ycbcrConversion, (unsigned long long)pAllocator);
                 }
-                m_state->on_vkDestroySamplerYcbcrConversionKHR(&m_pool, device, ycbcrConversion, pAllocator);
+                m_state->on_vkDestroySamplerYcbcrConversionKHR(&m_pool, device, ycbcrConversion,
+                                                               pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroySamplerYcbcrConversionKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, boxed_ycbcrConversion_preserve, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroySamplerYcbcrConversionKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device,
+                        boxed_ycbcrConversion_preserve, pAllocator);
                 }
                 delete_VkSamplerYcbcrConversion(boxed_ycbcrConversion_preserve);
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_KHR_bind_memory2
-            case OP_vkBindBufferMemory2KHR:
-            {
+            case OP_vkBindBufferMemory2KHR: {
                 android::base::beginTrace("vkBindBufferMemory2KHR decode");
                 VkDevice device;
                 uint32_t bindInfoCount;
@@ -15588,41 +18054,48 @@
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
                 memcpy((uint32_t*)&bindInfoCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pBindInfos, ((bindInfoCount)) * sizeof(const VkBindBufferMemoryInfo));
-                for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
-                {
-                    reservedunmarshal_VkBindBufferMemoryInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBindBufferMemoryInfo*)(pBindInfos + i), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pBindInfos,
+                                    ((bindInfoCount)) * sizeof(const VkBindBufferMemoryInfo));
+                for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
+                    reservedunmarshal_VkBindBufferMemoryInfo(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkBindBufferMemoryInfo*)(pBindInfos + i), readStreamPtrPtr);
                 }
-                if (pBindInfos)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
-                    {
-                        transform_tohost_VkBindBufferMemoryInfo(m_state, (VkBindBufferMemoryInfo*)(pBindInfos + i));
+                if (pBindInfos) {
+                    for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
+                        transform_tohost_VkBindBufferMemoryInfo(
+                            m_state, (VkBindBufferMemoryInfo*)(pBindInfos + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkBindBufferMemory2KHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)bindInfoCount, (unsigned long long)pBindInfos);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkBindBufferMemory2KHR 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)bindInfoCount,
+                            (unsigned long long)pBindInfos);
                 }
                 VkResult vkBindBufferMemory2KHR_VkResult_return = (VkResult)0;
-                vkBindBufferMemory2KHR_VkResult_return = m_state->on_vkBindBufferMemory2KHR(&m_pool, device, bindInfoCount, pBindInfos);
-                if ((vkBindBufferMemory2KHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkBindBufferMemory2KHR_VkResult_return =
+                    m_state->on_vkBindBufferMemory2KHR(&m_pool, device, bindInfoCount, pBindInfos);
+                if ((vkBindBufferMemory2KHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkBindBufferMemory2KHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkBindBufferMemory2KHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkBindBufferMemory2KHR_VkResult_return, device, bindInfoCount, pBindInfos);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkBindBufferMemory2KHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkBindBufferMemory2KHR_VkResult_return, device, bindInfoCount, pBindInfos);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkBindImageMemory2KHR:
-            {
+            case OP_vkBindImageMemory2KHR: {
                 android::base::beginTrace("vkBindImageMemory2KHR decode");
                 VkDevice device;
                 uint32_t bindInfoCount;
@@ -15637,36 +18110,43 @@
                 // End manual dispatchable handle unboxing for device;
                 memcpy((uint32_t*)&bindInfoCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pBindInfos, ((bindInfoCount)) * sizeof(const VkBindImageMemoryInfo));
-                for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
-                {
-                    reservedunmarshal_VkBindImageMemoryInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBindImageMemoryInfo*)(pBindInfos + i), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pBindInfos,
+                                    ((bindInfoCount)) * sizeof(const VkBindImageMemoryInfo));
+                for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
+                    reservedunmarshal_VkBindImageMemoryInfo(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkBindImageMemoryInfo*)(pBindInfos + i), readStreamPtrPtr);
                 }
-                if (pBindInfos)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
-                    {
-                        transform_tohost_VkBindImageMemoryInfo(m_state, (VkBindImageMemoryInfo*)(pBindInfos + i));
+                if (pBindInfos) {
+                    for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
+                        transform_tohost_VkBindImageMemoryInfo(
+                            m_state, (VkBindImageMemoryInfo*)(pBindInfos + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkBindImageMemory2KHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)bindInfoCount, (unsigned long long)pBindInfos);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkBindImageMemory2KHR 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)bindInfoCount,
+                            (unsigned long long)pBindInfos);
                 }
                 VkResult vkBindImageMemory2KHR_VkResult_return = (VkResult)0;
-                vkBindImageMemory2KHR_VkResult_return = vk->vkBindImageMemory2KHR(unboxed_device, bindInfoCount, pBindInfos);
-                if ((vkBindImageMemory2KHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkBindImageMemory2KHR_VkResult_return =
+                    vk->vkBindImageMemory2KHR(unboxed_device, bindInfoCount, pBindInfos);
+                if ((vkBindImageMemory2KHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkBindImageMemory2KHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkBindImageMemory2KHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkBindImageMemory2KHR_VkResult_return, device, bindInfoCount, pBindInfos);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkBindImageMemory2KHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkBindImageMemory2KHR_VkResult_return, device, bindInfoCount, pBindInfos);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -15674,8 +18154,7 @@
 #ifdef VK_KHR_portability_subset
 #endif
 #ifdef VK_KHR_maintenance3
-            case OP_vkGetDescriptorSetLayoutSupportKHR:
-            {
+            case OP_vkGetDescriptorSetLayoutSupportKHR: {
                 android::base::beginTrace("vkGetDescriptorSetLayoutSupportKHR decode");
                 VkDevice device;
                 const VkDescriptorSetLayoutCreateInfo* pCreateInfo;
@@ -15688,47 +18167,58 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkDescriptorSetLayoutCreateInfo));
-                reservedunmarshal_VkDescriptorSetLayoutCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorSetLayoutCreateInfo*)(pCreateInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pCreateInfo,
+                                    sizeof(const VkDescriptorSetLayoutCreateInfo));
+                reservedunmarshal_VkDescriptorSetLayoutCreateInfo(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkDescriptorSetLayoutCreateInfo*)(pCreateInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pSupport;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pSupport, sizeof(VkDescriptorSetLayoutSupport));
-                reservedunmarshal_VkDescriptorSetLayoutSupport(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorSetLayoutSupport*)(pSupport), readStreamPtrPtr);
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkDescriptorSetLayoutCreateInfo(m_state, (VkDescriptorSetLayoutCreateInfo*)(pCreateInfo));
+                reservedunmarshal_VkDescriptorSetLayoutSupport(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkDescriptorSetLayoutSupport*)(pSupport), readStreamPtrPtr);
+                if (pCreateInfo) {
+                    transform_tohost_VkDescriptorSetLayoutCreateInfo(
+                        m_state, (VkDescriptorSetLayoutCreateInfo*)(pCreateInfo));
                 }
-                if (pSupport)
-                {
-                    transform_tohost_VkDescriptorSetLayoutSupport(m_state, (VkDescriptorSetLayoutSupport*)(pSupport));
+                if (pSupport) {
+                    transform_tohost_VkDescriptorSetLayoutSupport(
+                        m_state, (VkDescriptorSetLayoutSupport*)(pSupport));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetDescriptorSetLayoutSupportKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pSupport);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetDescriptorSetLayoutSupportKHR 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pSupport);
                 }
                 vk->vkGetDescriptorSetLayoutSupportKHR(unboxed_device, pCreateInfo, pSupport);
                 vkStream->unsetHandleMapping();
-                if (pSupport)
-                {
-                    transform_fromhost_VkDescriptorSetLayoutSupport(m_state, (VkDescriptorSetLayoutSupport*)(pSupport));
+                if (pSupport) {
+                    transform_fromhost_VkDescriptorSetLayoutSupport(
+                        m_state, (VkDescriptorSetLayoutSupport*)(pSupport));
                 }
-                marshal_VkDescriptorSetLayoutSupport(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorSetLayoutSupport*)(pSupport));
+                marshal_VkDescriptorSetLayoutSupport(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                     (VkDescriptorSetLayoutSupport*)(pSupport));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetDescriptorSetLayoutSupportKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, pCreateInfo, pSupport);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetDescriptorSetLayoutSupportKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, pCreateInfo,
+                        pSupport);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_KHR_draw_indirect_count
-            case OP_vkCmdDrawIndirectCountKHR:
-            {
+            case OP_vkCmdDrawIndirectCountKHR: {
                 android::base::beginTrace("vkCmdDrawIndirectCountKHR decode");
                 VkCommandBuffer commandBuffer;
                 VkBuffer buffer;
@@ -15741,7 +18231,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -15761,25 +18252,33 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&stride, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdDrawIndirectCountKHR 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)buffer, (unsigned long long)offset, (unsigned long long)countBuffer, (unsigned long long)countBufferOffset, (unsigned long long)maxDrawCount, (unsigned long long)stride);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdDrawIndirectCountKHR 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer, (unsigned long long)buffer,
+                            (unsigned long long)offset, (unsigned long long)countBuffer,
+                            (unsigned long long)countBufferOffset, (unsigned long long)maxDrawCount,
+                            (unsigned long long)stride);
                 }
-                vk->vkCmdDrawIndirectCountKHR(unboxed_commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+                vk->vkCmdDrawIndirectCountKHR(unboxed_commandBuffer, buffer, offset, countBuffer,
+                                              countBufferOffset, maxDrawCount, stride);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdDrawIndirectCountKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdDrawIndirectCountKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, buffer,
+                        offset, countBuffer, countBufferOffset, maxDrawCount, stride);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdDrawIndexedIndirectCountKHR:
-            {
+            case OP_vkCmdDrawIndexedIndirectCountKHR: {
                 android::base::beginTrace("vkCmdDrawIndexedIndirectCountKHR decode");
                 VkCommandBuffer commandBuffer;
                 VkBuffer buffer;
@@ -15792,7 +18291,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -15812,20 +18312,30 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&stride, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdDrawIndexedIndirectCountKHR 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)buffer, (unsigned long long)offset, (unsigned long long)countBuffer, (unsigned long long)countBufferOffset, (unsigned long long)maxDrawCount, (unsigned long long)stride);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdDrawIndexedIndirectCountKHR 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer, (unsigned long long)buffer,
+                            (unsigned long long)offset, (unsigned long long)countBuffer,
+                            (unsigned long long)countBufferOffset, (unsigned long long)maxDrawCount,
+                            (unsigned long long)stride);
                 }
-                vk->vkCmdDrawIndexedIndirectCountKHR(unboxed_commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+                vk->vkCmdDrawIndexedIndirectCountKHR(unboxed_commandBuffer, buffer, offset,
+                                                     countBuffer, countBufferOffset, maxDrawCount,
+                                                     stride);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdDrawIndexedIndirectCountKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdDrawIndexedIndirectCountKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, buffer,
+                        offset, countBuffer, countBufferOffset, maxDrawCount, stride);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -15847,8 +18357,7 @@
 #ifdef VK_KHR_swapchain_mutable_format
 #endif
 #ifdef VK_KHR_timeline_semaphore
-            case OP_vkGetSemaphoreCounterValueKHR:
-            {
+            case OP_vkGetSemaphoreCounterValueKHR: {
                 android::base::beginTrace("vkGetSemaphoreCounterValueKHR decode");
                 VkDevice device;
                 VkSemaphore semaphore;
@@ -15864,36 +18373,43 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkSemaphore*)&semaphore = (VkSemaphore)unbox_VkSemaphore((VkSemaphore)(*&cgen_var_1));
+                *(VkSemaphore*)&semaphore =
+                    (VkSemaphore)unbox_VkSemaphore((VkSemaphore)(*&cgen_var_1));
                 // Begin manual dispatchable handle unboxing for pValue;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pValue, sizeof(uint64_t));
                 memcpy((uint64_t*)pValue, *readStreamPtrPtr, sizeof(uint64_t));
                 *readStreamPtrPtr += sizeof(uint64_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetSemaphoreCounterValueKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)semaphore, (unsigned long long)pValue);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetSemaphoreCounterValueKHR 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)semaphore,
+                            (unsigned long long)pValue);
                 }
                 VkResult vkGetSemaphoreCounterValueKHR_VkResult_return = (VkResult)0;
-                vkGetSemaphoreCounterValueKHR_VkResult_return = vk->vkGetSemaphoreCounterValueKHR(unboxed_device, semaphore, pValue);
-                if ((vkGetSemaphoreCounterValueKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetSemaphoreCounterValueKHR_VkResult_return =
+                    vk->vkGetSemaphoreCounterValueKHR(unboxed_device, semaphore, pValue);
+                if ((vkGetSemaphoreCounterValueKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write((uint64_t*)pValue, sizeof(uint64_t));
                 vkStream->write(&vkGetSemaphoreCounterValueKHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetSemaphoreCounterValueKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetSemaphoreCounterValueKHR_VkResult_return, device, semaphore, pValue);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetSemaphoreCounterValueKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetSemaphoreCounterValueKHR_VkResult_return, device, semaphore, pValue);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkWaitSemaphoresKHR:
-            {
+            case OP_vkWaitSemaphoresKHR: {
                 android::base::beginTrace("vkWaitSemaphoresKHR decode");
                 VkDevice device;
                 const VkSemaphoreWaitInfo* pWaitInfo;
@@ -15907,36 +18423,43 @@
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
                 vkReadStream->alloc((void**)&pWaitInfo, sizeof(const VkSemaphoreWaitInfo));
-                reservedunmarshal_VkSemaphoreWaitInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSemaphoreWaitInfo*)(pWaitInfo), readStreamPtrPtr);
+                reservedunmarshal_VkSemaphoreWaitInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                      (VkSemaphoreWaitInfo*)(pWaitInfo),
+                                                      readStreamPtrPtr);
                 memcpy((uint64_t*)&timeout, *readStreamPtrPtr, sizeof(uint64_t));
                 *readStreamPtrPtr += sizeof(uint64_t);
-                if (pWaitInfo)
-                {
-                    transform_tohost_VkSemaphoreWaitInfo(m_state, (VkSemaphoreWaitInfo*)(pWaitInfo));
+                if (pWaitInfo) {
+                    transform_tohost_VkSemaphoreWaitInfo(m_state,
+                                                         (VkSemaphoreWaitInfo*)(pWaitInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkWaitSemaphoresKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pWaitInfo, (unsigned long long)timeout);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkWaitSemaphoresKHR 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pWaitInfo,
+                            (unsigned long long)timeout);
                 }
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 VkResult vkWaitSemaphoresKHR_VkResult_return = (VkResult)0;
-                vkWaitSemaphoresKHR_VkResult_return = vk->vkWaitSemaphoresKHR(unboxed_device, pWaitInfo, timeout);
-                if ((vkWaitSemaphoresKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkWaitSemaphoresKHR_VkResult_return =
+                    vk->vkWaitSemaphoresKHR(unboxed_device, pWaitInfo, timeout);
+                if ((vkWaitSemaphoresKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkWaitSemaphoresKHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkWaitSemaphoresKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkWaitSemaphoresKHR_VkResult_return, device, pWaitInfo, timeout);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkWaitSemaphoresKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkWaitSemaphoresKHR_VkResult_return, device, pWaitInfo, timeout);
                 }
                 vkReadStream->clearPool();
                 android::base::endTrace();
                 break;
             }
-            case OP_vkSignalSemaphoreKHR:
-            {
+            case OP_vkSignalSemaphoreKHR: {
                 android::base::beginTrace("vkSignalSemaphoreKHR decode");
                 VkDevice device;
                 const VkSemaphoreSignalInfo* pSignalInfo;
@@ -15949,29 +18472,36 @@
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
                 vkReadStream->alloc((void**)&pSignalInfo, sizeof(const VkSemaphoreSignalInfo));
-                reservedunmarshal_VkSemaphoreSignalInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSemaphoreSignalInfo*)(pSignalInfo), readStreamPtrPtr);
-                if (pSignalInfo)
-                {
-                    transform_tohost_VkSemaphoreSignalInfo(m_state, (VkSemaphoreSignalInfo*)(pSignalInfo));
+                reservedunmarshal_VkSemaphoreSignalInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                        (VkSemaphoreSignalInfo*)(pSignalInfo),
+                                                        readStreamPtrPtr);
+                if (pSignalInfo) {
+                    transform_tohost_VkSemaphoreSignalInfo(m_state,
+                                                           (VkSemaphoreSignalInfo*)(pSignalInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkSignalSemaphoreKHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pSignalInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkSignalSemaphoreKHR 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pSignalInfo);
                 }
                 VkResult vkSignalSemaphoreKHR_VkResult_return = (VkResult)0;
-                vkSignalSemaphoreKHR_VkResult_return = vk->vkSignalSemaphoreKHR(unboxed_device, pSignalInfo);
-                if ((vkSignalSemaphoreKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkSignalSemaphoreKHR_VkResult_return =
+                    vk->vkSignalSemaphoreKHR(unboxed_device, pSignalInfo);
+                if ((vkSignalSemaphoreKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkSignalSemaphoreKHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkSignalSemaphoreKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkSignalSemaphoreKHR_VkResult_return, device, pSignalInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkSignalSemaphoreKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkSignalSemaphoreKHR_VkResult_return, device, pSignalInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -15981,8 +18511,7 @@
 #ifdef VK_KHR_shader_terminate_invocation
 #endif
 #ifdef VK_KHR_fragment_shading_rate
-            case OP_vkGetPhysicalDeviceFragmentShadingRatesKHR:
-            {
+            case OP_vkGetPhysicalDeviceFragmentShadingRatesKHR: {
                 android::base::beginTrace("vkGetPhysicalDeviceFragmentShadingRatesKHR decode");
                 VkPhysicalDevice physicalDevice;
                 uint32_t* pFragmentShadingRateCount;
@@ -15991,7 +18520,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
@@ -16001,89 +18531,104 @@
                 memcpy((uint32_t**)&pFragmentShadingRateCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pFragmentShadingRateCount);
                 *readStreamPtrPtr += 8;
-                if (pFragmentShadingRateCount)
-                {
+                if (pFragmentShadingRateCount) {
                     vkReadStream->alloc((void**)&pFragmentShadingRateCount, sizeof(uint32_t));
-                    memcpy((uint32_t*)pFragmentShadingRateCount, *readStreamPtrPtr, sizeof(uint32_t));
+                    memcpy((uint32_t*)pFragmentShadingRateCount, *readStreamPtrPtr,
+                           sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
                 }
                 // Begin manual dispatchable handle unboxing for pFragmentShadingRates;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
-                memcpy((VkPhysicalDeviceFragmentShadingRateKHR**)&pFragmentShadingRates, (*readStreamPtrPtr), 8);
+                memcpy((VkPhysicalDeviceFragmentShadingRateKHR**)&pFragmentShadingRates,
+                       (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pFragmentShadingRates);
                 *readStreamPtrPtr += 8;
-                if (pFragmentShadingRates)
-                {
-                    vkReadStream->alloc((void**)&pFragmentShadingRates, (*(pFragmentShadingRateCount)) * sizeof(VkPhysicalDeviceFragmentShadingRateKHR));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pFragmentShadingRateCount)); ++i)
-                    {
-                        reservedunmarshal_VkPhysicalDeviceFragmentShadingRateKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceFragmentShadingRateKHR*)(pFragmentShadingRates + i), readStreamPtrPtr);
+                if (pFragmentShadingRates) {
+                    vkReadStream->alloc((void**)&pFragmentShadingRates,
+                                        (*(pFragmentShadingRateCount)) *
+                                            sizeof(VkPhysicalDeviceFragmentShadingRateKHR));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pFragmentShadingRateCount)); ++i) {
+                        reservedunmarshal_VkPhysicalDeviceFragmentShadingRateKHR(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkPhysicalDeviceFragmentShadingRateKHR*)(pFragmentShadingRates + i),
+                            readStreamPtrPtr);
                     }
                 }
-                if (pFragmentShadingRateCount)
-                {
-                    if (pFragmentShadingRates)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pFragmentShadingRateCount)); ++i)
-                        {
-                            transform_tohost_VkPhysicalDeviceFragmentShadingRateKHR(m_state, (VkPhysicalDeviceFragmentShadingRateKHR*)(pFragmentShadingRates + i));
+                if (pFragmentShadingRateCount) {
+                    if (pFragmentShadingRates) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pFragmentShadingRateCount)); ++i) {
+                            transform_tohost_VkPhysicalDeviceFragmentShadingRateKHR(
+                                m_state,
+                                (VkPhysicalDeviceFragmentShadingRateKHR*)(pFragmentShadingRates +
+                                                                          i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceFragmentShadingRatesKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pFragmentShadingRateCount, (unsigned long long)pFragmentShadingRates);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceFragmentShadingRatesKHR 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)pFragmentShadingRateCount,
+                            (unsigned long long)pFragmentShadingRates);
                 }
                 VkResult vkGetPhysicalDeviceFragmentShadingRatesKHR_VkResult_return = (VkResult)0;
-                vkGetPhysicalDeviceFragmentShadingRatesKHR_VkResult_return = vk->vkGetPhysicalDeviceFragmentShadingRatesKHR(unboxed_physicalDevice, pFragmentShadingRateCount, pFragmentShadingRates);
-                if ((vkGetPhysicalDeviceFragmentShadingRatesKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetPhysicalDeviceFragmentShadingRatesKHR_VkResult_return =
+                    vk->vkGetPhysicalDeviceFragmentShadingRatesKHR(
+                        unboxed_physicalDevice, pFragmentShadingRateCount, pFragmentShadingRates);
+                if ((vkGetPhysicalDeviceFragmentShadingRatesKHR_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pFragmentShadingRateCount;
                 vkStream->putBe64(cgen_var_3);
-                if (pFragmentShadingRateCount)
-                {
+                if (pFragmentShadingRateCount) {
                     vkStream->write((uint32_t*)pFragmentShadingRateCount, sizeof(uint32_t));
                 }
-                if (pFragmentShadingRateCount)
-                {
-                    if (pFragmentShadingRates)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pFragmentShadingRateCount)); ++i)
-                        {
-                            transform_fromhost_VkPhysicalDeviceFragmentShadingRateKHR(m_state, (VkPhysicalDeviceFragmentShadingRateKHR*)(pFragmentShadingRates + i));
+                if (pFragmentShadingRateCount) {
+                    if (pFragmentShadingRates) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pFragmentShadingRateCount)); ++i) {
+                            transform_fromhost_VkPhysicalDeviceFragmentShadingRateKHR(
+                                m_state,
+                                (VkPhysicalDeviceFragmentShadingRateKHR*)(pFragmentShadingRates +
+                                                                          i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pFragmentShadingRates;
                 vkStream->putBe64(cgen_var_4);
-                if (pFragmentShadingRates)
-                {
-                    if (pFragmentShadingRateCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pFragmentShadingRateCount)); ++i)
-                        {
-                            marshal_VkPhysicalDeviceFragmentShadingRateKHR(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceFragmentShadingRateKHR*)(pFragmentShadingRates + i));
+                if (pFragmentShadingRates) {
+                    if (pFragmentShadingRateCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pFragmentShadingRateCount)); ++i) {
+                            marshal_VkPhysicalDeviceFragmentShadingRateKHR(
+                                vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                (VkPhysicalDeviceFragmentShadingRateKHR*)(pFragmentShadingRates +
+                                                                          i));
                         }
                     }
                 }
-                vkStream->write(&vkGetPhysicalDeviceFragmentShadingRatesKHR_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkGetPhysicalDeviceFragmentShadingRatesKHR_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceFragmentShadingRatesKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetPhysicalDeviceFragmentShadingRatesKHR_VkResult_return, physicalDevice, pFragmentShadingRateCount, pFragmentShadingRates);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceFragmentShadingRatesKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetPhysicalDeviceFragmentShadingRatesKHR_VkResult_return, physicalDevice,
+                        pFragmentShadingRateCount, pFragmentShadingRates);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetFragmentShadingRateKHR:
-            {
+            case OP_vkCmdSetFragmentShadingRateKHR: {
                 android::base::beginTrace("vkCmdSetFragmentShadingRateKHR decode");
                 VkCommandBuffer commandBuffer;
                 const VkExtent2D* pFragmentSize;
@@ -16092,32 +18637,41 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 vkReadStream->alloc((void**)&pFragmentSize, sizeof(const VkExtent2D));
-                reservedunmarshal_VkExtent2D(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExtent2D*)(pFragmentSize), readStreamPtrPtr);
-                memcpy((VkFragmentShadingRateCombinerOpKHR*)combinerOps, *readStreamPtrPtr, 2 * sizeof(const VkFragmentShadingRateCombinerOpKHR));
+                reservedunmarshal_VkExtent2D(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                             (VkExtent2D*)(pFragmentSize), readStreamPtrPtr);
+                memcpy((VkFragmentShadingRateCombinerOpKHR*)combinerOps, *readStreamPtrPtr,
+                       2 * sizeof(const VkFragmentShadingRateCombinerOpKHR));
                 *readStreamPtrPtr += 2 * sizeof(const VkFragmentShadingRateCombinerOpKHR);
-                if (pFragmentSize)
-                {
+                if (pFragmentSize) {
                     transform_tohost_VkExtent2D(m_state, (VkExtent2D*)(pFragmentSize));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetFragmentShadingRateKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pFragmentSize, (unsigned long long)combinerOps);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkCmdSetFragmentShadingRateKHR 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)commandBuffer,
+                        (unsigned long long)pFragmentSize, (unsigned long long)combinerOps);
                 }
-                vk->vkCmdSetFragmentShadingRateKHR(unboxed_commandBuffer, pFragmentSize, combinerOps);
+                vk->vkCmdSetFragmentShadingRateKHR(unboxed_commandBuffer, pFragmentSize,
+                                                   combinerOps);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetFragmentShadingRateKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pFragmentSize, combinerOps);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetFragmentShadingRateKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        pFragmentSize, combinerOps);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -16129,8 +18683,7 @@
 #ifdef VK_KHR_separate_depth_stencil_layouts
 #endif
 #ifdef VK_KHR_present_wait
-            case OP_vkWaitForPresentKHR:
-            {
+            case OP_vkWaitForPresentKHR: {
                 android::base::beginTrace("vkWaitForPresentKHR decode");
                 VkDevice device;
                 VkSwapchainKHR swapchain;
@@ -16147,29 +18700,37 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkSwapchainKHR*)&swapchain = (VkSwapchainKHR)unbox_VkSwapchainKHR((VkSwapchainKHR)(*&cgen_var_1));
+                *(VkSwapchainKHR*)&swapchain =
+                    (VkSwapchainKHR)unbox_VkSwapchainKHR((VkSwapchainKHR)(*&cgen_var_1));
                 memcpy((uint64_t*)&presentId, *readStreamPtrPtr, sizeof(uint64_t));
                 *readStreamPtrPtr += sizeof(uint64_t);
                 memcpy((uint64_t*)&timeout, *readStreamPtrPtr, sizeof(uint64_t));
                 *readStreamPtrPtr += sizeof(uint64_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkWaitForPresentKHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)swapchain, (unsigned long long)presentId, (unsigned long long)timeout);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkWaitForPresentKHR 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)swapchain,
+                            (unsigned long long)presentId, (unsigned long long)timeout);
                 }
                 VkResult vkWaitForPresentKHR_VkResult_return = (VkResult)0;
-                vkWaitForPresentKHR_VkResult_return = vk->vkWaitForPresentKHR(unboxed_device, swapchain, presentId, timeout);
-                if ((vkWaitForPresentKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkWaitForPresentKHR_VkResult_return =
+                    vk->vkWaitForPresentKHR(unboxed_device, swapchain, presentId, timeout);
+                if ((vkWaitForPresentKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkWaitForPresentKHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkWaitForPresentKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkWaitForPresentKHR_VkResult_return, device, swapchain, presentId, timeout);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkWaitForPresentKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkWaitForPresentKHR_VkResult_return, device, swapchain, presentId, timeout);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -16177,8 +18738,7 @@
 #ifdef VK_KHR_uniform_buffer_standard_layout
 #endif
 #ifdef VK_KHR_buffer_device_address
-            case OP_vkGetBufferDeviceAddressKHR:
-            {
+            case OP_vkGetBufferDeviceAddressKHR: {
                 android::base::beginTrace("vkGetBufferDeviceAddressKHR decode");
                 VkDevice device;
                 const VkBufferDeviceAddressInfo* pInfo;
@@ -16191,33 +18751,40 @@
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
                 vkReadStream->alloc((void**)&pInfo, sizeof(const VkBufferDeviceAddressInfo));
-                reservedunmarshal_VkBufferDeviceAddressInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferDeviceAddressInfo*)(pInfo), readStreamPtrPtr);
-                if (pInfo)
-                {
-                    transform_tohost_VkBufferDeviceAddressInfo(m_state, (VkBufferDeviceAddressInfo*)(pInfo));
+                reservedunmarshal_VkBufferDeviceAddressInfo(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferDeviceAddressInfo*)(pInfo),
+                    readStreamPtrPtr);
+                if (pInfo) {
+                    transform_tohost_VkBufferDeviceAddressInfo(m_state,
+                                                               (VkBufferDeviceAddressInfo*)(pInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetBufferDeviceAddressKHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkGetBufferDeviceAddressKHR 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pInfo);
                 }
-                VkDeviceAddress vkGetBufferDeviceAddressKHR_VkDeviceAddress_return = (VkDeviceAddress)0;
-                vkGetBufferDeviceAddressKHR_VkDeviceAddress_return = vk->vkGetBufferDeviceAddressKHR(unboxed_device, pInfo);
+                VkDeviceAddress vkGetBufferDeviceAddressKHR_VkDeviceAddress_return =
+                    (VkDeviceAddress)0;
+                vkGetBufferDeviceAddressKHR_VkDeviceAddress_return =
+                    vk->vkGetBufferDeviceAddressKHR(unboxed_device, pInfo);
                 vkStream->unsetHandleMapping();
-                vkStream->write(&vkGetBufferDeviceAddressKHR_VkDeviceAddress_return, sizeof(VkDeviceAddress));
+                vkStream->write(&vkGetBufferDeviceAddressKHR_VkDeviceAddress_return,
+                                sizeof(VkDeviceAddress));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetBufferDeviceAddressKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetBufferDeviceAddressKHR_VkDeviceAddress_return, device, pInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetBufferDeviceAddressKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetBufferDeviceAddressKHR_VkDeviceAddress_return, device, pInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetBufferOpaqueCaptureAddressKHR:
-            {
+            case OP_vkGetBufferOpaqueCaptureAddressKHR: {
                 android::base::beginTrace("vkGetBufferOpaqueCaptureAddressKHR decode");
                 VkDevice device;
                 const VkBufferDeviceAddressInfo* pInfo;
@@ -16230,33 +18797,40 @@
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
                 vkReadStream->alloc((void**)&pInfo, sizeof(const VkBufferDeviceAddressInfo));
-                reservedunmarshal_VkBufferDeviceAddressInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferDeviceAddressInfo*)(pInfo), readStreamPtrPtr);
-                if (pInfo)
-                {
-                    transform_tohost_VkBufferDeviceAddressInfo(m_state, (VkBufferDeviceAddressInfo*)(pInfo));
+                reservedunmarshal_VkBufferDeviceAddressInfo(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferDeviceAddressInfo*)(pInfo),
+                    readStreamPtrPtr);
+                if (pInfo) {
+                    transform_tohost_VkBufferDeviceAddressInfo(m_state,
+                                                               (VkBufferDeviceAddressInfo*)(pInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetBufferOpaqueCaptureAddressKHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pInfo);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetBufferOpaqueCaptureAddressKHR 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pInfo);
                 }
                 uint64_t vkGetBufferOpaqueCaptureAddressKHR_uint64_t_return = (uint64_t)0;
-                vkGetBufferOpaqueCaptureAddressKHR_uint64_t_return = vk->vkGetBufferOpaqueCaptureAddressKHR(unboxed_device, pInfo);
+                vkGetBufferOpaqueCaptureAddressKHR_uint64_t_return =
+                    vk->vkGetBufferOpaqueCaptureAddressKHR(unboxed_device, pInfo);
                 vkStream->unsetHandleMapping();
-                vkStream->write(&vkGetBufferOpaqueCaptureAddressKHR_uint64_t_return, sizeof(uint64_t));
+                vkStream->write(&vkGetBufferOpaqueCaptureAddressKHR_uint64_t_return,
+                                sizeof(uint64_t));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetBufferOpaqueCaptureAddressKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetBufferOpaqueCaptureAddressKHR_uint64_t_return, device, pInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetBufferOpaqueCaptureAddressKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetBufferOpaqueCaptureAddressKHR_uint64_t_return, device, pInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetDeviceMemoryOpaqueCaptureAddressKHR:
-            {
+            case OP_vkGetDeviceMemoryOpaqueCaptureAddressKHR: {
                 android::base::beginTrace("vkGetDeviceMemoryOpaqueCaptureAddressKHR decode");
                 VkDevice device;
                 const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo;
@@ -16268,36 +18842,45 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pInfo, sizeof(const VkDeviceMemoryOpaqueCaptureAddressInfo));
-                reservedunmarshal_VkDeviceMemoryOpaqueCaptureAddressInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDeviceMemoryOpaqueCaptureAddressInfo*)(pInfo), readStreamPtrPtr);
-                if (pInfo)
-                {
-                    transform_tohost_VkDeviceMemoryOpaqueCaptureAddressInfo(m_state, (VkDeviceMemoryOpaqueCaptureAddressInfo*)(pInfo));
+                vkReadStream->alloc((void**)&pInfo,
+                                    sizeof(const VkDeviceMemoryOpaqueCaptureAddressInfo));
+                reservedunmarshal_VkDeviceMemoryOpaqueCaptureAddressInfo(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkDeviceMemoryOpaqueCaptureAddressInfo*)(pInfo), readStreamPtrPtr);
+                if (pInfo) {
+                    transform_tohost_VkDeviceMemoryOpaqueCaptureAddressInfo(
+                        m_state, (VkDeviceMemoryOpaqueCaptureAddressInfo*)(pInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetDeviceMemoryOpaqueCaptureAddressKHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pInfo);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkGetDeviceMemoryOpaqueCaptureAddressKHR 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device, (unsigned long long)pInfo);
                 }
                 uint64_t vkGetDeviceMemoryOpaqueCaptureAddressKHR_uint64_t_return = (uint64_t)0;
-                vkGetDeviceMemoryOpaqueCaptureAddressKHR_uint64_t_return = vk->vkGetDeviceMemoryOpaqueCaptureAddressKHR(unboxed_device, pInfo);
+                vkGetDeviceMemoryOpaqueCaptureAddressKHR_uint64_t_return =
+                    vk->vkGetDeviceMemoryOpaqueCaptureAddressKHR(unboxed_device, pInfo);
                 vkStream->unsetHandleMapping();
-                vkStream->write(&vkGetDeviceMemoryOpaqueCaptureAddressKHR_uint64_t_return, sizeof(uint64_t));
+                vkStream->write(&vkGetDeviceMemoryOpaqueCaptureAddressKHR_uint64_t_return,
+                                sizeof(uint64_t));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetDeviceMemoryOpaqueCaptureAddressKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetDeviceMemoryOpaqueCaptureAddressKHR_uint64_t_return, device, pInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetDeviceMemoryOpaqueCaptureAddressKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetDeviceMemoryOpaqueCaptureAddressKHR_uint64_t_return, device, pInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_KHR_deferred_host_operations
-            case OP_vkCreateDeferredOperationKHR:
-            {
+            case OP_vkCreateDeferredOperationKHR: {
                 android::base::beginTrace("vkCreateDeferredOperationKHR decode");
                 VkDevice device;
                 const VkAllocationCallbacks* pAllocator;
@@ -16314,10 +18897,11 @@
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pDeferredOperation;
                 vkReadStream->unsetHandleMapping();
@@ -16325,35 +18909,42 @@
                 memcpy((VkDeferredOperationKHR*)&(*pDeferredOperation), (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&(*pDeferredOperation));
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateDeferredOperationKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pAllocator, (unsigned long long)pDeferredOperation);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateDeferredOperationKHR 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pAllocator,
+                            (unsigned long long)pDeferredOperation);
                 }
                 VkResult vkCreateDeferredOperationKHR_VkResult_return = (VkResult)0;
-                vkCreateDeferredOperationKHR_VkResult_return = vk->vkCreateDeferredOperationKHR(unboxed_device, pAllocator, pDeferredOperation);
-                if ((vkCreateDeferredOperationKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateDeferredOperationKHR_VkResult_return = vk->vkCreateDeferredOperationKHR(
+                    unboxed_device, pAllocator, pDeferredOperation);
+                if ((vkCreateDeferredOperationKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3 = (uint64_t)(*pDeferredOperation);
                 vkStream->putBe64(cgen_var_3);
                 vkStream->write(&vkCreateDeferredOperationKHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateDeferredOperationKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateDeferredOperationKHR_VkResult_return, device, pAllocator, pDeferredOperation);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateDeferredOperationKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateDeferredOperationKHR_VkResult_return, device, pAllocator,
+                        pDeferredOperation);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroyDeferredOperationKHR:
-            {
+            case OP_vkDestroyDeferredOperationKHR: {
                 android::base::beginTrace("vkDestroyDeferredOperationKHR decode");
                 VkDevice device;
                 VkDeferredOperationKHR operation;
@@ -16373,34 +18964,39 @@
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroyDeferredOperationKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)operation, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkDestroyDeferredOperationKHR 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)operation,
+                            (unsigned long long)pAllocator);
                 }
                 vk->vkDestroyDeferredOperationKHR(unboxed_device, operation, pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroyDeferredOperationKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, operation, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroyDeferredOperationKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, operation,
+                        pAllocator);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetDeferredOperationMaxConcurrencyKHR:
-            {
+            case OP_vkGetDeferredOperationMaxConcurrencyKHR: {
                 android::base::beginTrace("vkGetDeferredOperationMaxConcurrencyKHR decode");
                 VkDevice device;
                 VkDeferredOperationKHR operation;
@@ -16415,28 +19011,34 @@
                 memcpy((VkDeferredOperationKHR*)&operation, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&operation);
                 *readStreamPtrPtr += 8;
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetDeferredOperationMaxConcurrencyKHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)operation);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkGetDeferredOperationMaxConcurrencyKHR 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device, (unsigned long long)operation);
                 }
                 uint32_t vkGetDeferredOperationMaxConcurrencyKHR_uint32_t_return = (uint32_t)0;
-                vkGetDeferredOperationMaxConcurrencyKHR_uint32_t_return = vk->vkGetDeferredOperationMaxConcurrencyKHR(unboxed_device, operation);
+                vkGetDeferredOperationMaxConcurrencyKHR_uint32_t_return =
+                    vk->vkGetDeferredOperationMaxConcurrencyKHR(unboxed_device, operation);
                 vkStream->unsetHandleMapping();
-                vkStream->write(&vkGetDeferredOperationMaxConcurrencyKHR_uint32_t_return, sizeof(uint32_t));
+                vkStream->write(&vkGetDeferredOperationMaxConcurrencyKHR_uint32_t_return,
+                                sizeof(uint32_t));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetDeferredOperationMaxConcurrencyKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetDeferredOperationMaxConcurrencyKHR_uint32_t_return, device, operation);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetDeferredOperationMaxConcurrencyKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetDeferredOperationMaxConcurrencyKHR_uint32_t_return, device, operation);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetDeferredOperationResultKHR:
-            {
+            case OP_vkGetDeferredOperationResultKHR: {
                 android::base::beginTrace("vkGetDeferredOperationResultKHR decode");
                 VkDevice device;
                 VkDeferredOperationKHR operation;
@@ -16451,29 +19053,34 @@
                 memcpy((VkDeferredOperationKHR*)&operation, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&operation);
                 *readStreamPtrPtr += 8;
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetDeferredOperationResultKHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)operation);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetDeferredOperationResultKHR 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)operation);
                 }
                 VkResult vkGetDeferredOperationResultKHR_VkResult_return = (VkResult)0;
-                vkGetDeferredOperationResultKHR_VkResult_return = vk->vkGetDeferredOperationResultKHR(unboxed_device, operation);
-                if ((vkGetDeferredOperationResultKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetDeferredOperationResultKHR_VkResult_return =
+                    vk->vkGetDeferredOperationResultKHR(unboxed_device, operation);
+                if ((vkGetDeferredOperationResultKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkGetDeferredOperationResultKHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetDeferredOperationResultKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetDeferredOperationResultKHR_VkResult_return, device, operation);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetDeferredOperationResultKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetDeferredOperationResultKHR_VkResult_return, device, operation);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDeferredOperationJoinKHR:
-            {
+            case OP_vkDeferredOperationJoinKHR: {
                 android::base::beginTrace("vkDeferredOperationJoinKHR decode");
                 VkDevice device;
                 VkDeferredOperationKHR operation;
@@ -16488,31 +19095,35 @@
                 memcpy((VkDeferredOperationKHR*)&operation, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&operation);
                 *readStreamPtrPtr += 8;
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDeferredOperationJoinKHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)operation);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkDeferredOperationJoinKHR 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)operation);
                 }
                 VkResult vkDeferredOperationJoinKHR_VkResult_return = (VkResult)0;
-                vkDeferredOperationJoinKHR_VkResult_return = vk->vkDeferredOperationJoinKHR(unboxed_device, operation);
-                if ((vkDeferredOperationJoinKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkDeferredOperationJoinKHR_VkResult_return =
+                    vk->vkDeferredOperationJoinKHR(unboxed_device, operation);
+                if ((vkDeferredOperationJoinKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkDeferredOperationJoinKHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDeferredOperationJoinKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkDeferredOperationJoinKHR_VkResult_return, device, operation);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDeferredOperationJoinKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkDeferredOperationJoinKHR_VkResult_return, device, operation);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_KHR_pipeline_executable_properties
-            case OP_vkGetPipelineExecutablePropertiesKHR:
-            {
+            case OP_vkGetPipelineExecutablePropertiesKHR: {
                 android::base::beginTrace("vkGetPipelineExecutablePropertiesKHR decode");
                 VkDevice device;
                 const VkPipelineInfoKHR* pPipelineInfo;
@@ -16527,15 +19138,16 @@
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
                 vkReadStream->alloc((void**)&pPipelineInfo, sizeof(const VkPipelineInfoKHR));
-                reservedunmarshal_VkPipelineInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPipelineInfoKHR*)(pPipelineInfo), readStreamPtrPtr);
+                reservedunmarshal_VkPipelineInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                    (VkPipelineInfoKHR*)(pPipelineInfo),
+                                                    readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pExecutableCount;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 memcpy((uint32_t**)&pExecutableCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pExecutableCount);
                 *readStreamPtrPtr += 8;
-                if (pExecutableCount)
-                {
+                if (pExecutableCount) {
                     vkReadStream->alloc((void**)&pExecutableCount, sizeof(uint32_t));
                     memcpy((uint32_t*)pExecutableCount, *readStreamPtrPtr, sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
@@ -16546,81 +19158,88 @@
                 memcpy((VkPipelineExecutablePropertiesKHR**)&pProperties, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pProperties);
                 *readStreamPtrPtr += 8;
-                if (pProperties)
-                {
-                    vkReadStream->alloc((void**)&pProperties, (*(pExecutableCount)) * sizeof(VkPipelineExecutablePropertiesKHR));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pExecutableCount)); ++i)
-                    {
-                        reservedunmarshal_VkPipelineExecutablePropertiesKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPipelineExecutablePropertiesKHR*)(pProperties + i), readStreamPtrPtr);
+                if (pProperties) {
+                    vkReadStream->alloc(
+                        (void**)&pProperties,
+                        (*(pExecutableCount)) * sizeof(VkPipelineExecutablePropertiesKHR));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pExecutableCount)); ++i) {
+                        reservedunmarshal_VkPipelineExecutablePropertiesKHR(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkPipelineExecutablePropertiesKHR*)(pProperties + i),
+                            readStreamPtrPtr);
                     }
                 }
-                if (pPipelineInfo)
-                {
-                    transform_tohost_VkPipelineInfoKHR(m_state, (VkPipelineInfoKHR*)(pPipelineInfo));
+                if (pPipelineInfo) {
+                    transform_tohost_VkPipelineInfoKHR(m_state,
+                                                       (VkPipelineInfoKHR*)(pPipelineInfo));
                 }
-                if (pExecutableCount)
-                {
-                    if (pProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pExecutableCount)); ++i)
-                        {
-                            transform_tohost_VkPipelineExecutablePropertiesKHR(m_state, (VkPipelineExecutablePropertiesKHR*)(pProperties + i));
+                if (pExecutableCount) {
+                    if (pProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pExecutableCount)); ++i) {
+                            transform_tohost_VkPipelineExecutablePropertiesKHR(
+                                m_state, (VkPipelineExecutablePropertiesKHR*)(pProperties + i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPipelineExecutablePropertiesKHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pPipelineInfo, (unsigned long long)pExecutableCount, (unsigned long long)pProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPipelineExecutablePropertiesKHR 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pPipelineInfo,
+                            (unsigned long long)pExecutableCount, (unsigned long long)pProperties);
                 }
                 VkResult vkGetPipelineExecutablePropertiesKHR_VkResult_return = (VkResult)0;
-                vkGetPipelineExecutablePropertiesKHR_VkResult_return = vk->vkGetPipelineExecutablePropertiesKHR(unboxed_device, pPipelineInfo, pExecutableCount, pProperties);
-                if ((vkGetPipelineExecutablePropertiesKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetPipelineExecutablePropertiesKHR_VkResult_return =
+                    vk->vkGetPipelineExecutablePropertiesKHR(unboxed_device, pPipelineInfo,
+                                                             pExecutableCount, pProperties);
+                if ((vkGetPipelineExecutablePropertiesKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pExecutableCount;
                 vkStream->putBe64(cgen_var_3);
-                if (pExecutableCount)
-                {
+                if (pExecutableCount) {
                     vkStream->write((uint32_t*)pExecutableCount, sizeof(uint32_t));
                 }
-                if (pExecutableCount)
-                {
-                    if (pProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pExecutableCount)); ++i)
-                        {
-                            transform_fromhost_VkPipelineExecutablePropertiesKHR(m_state, (VkPipelineExecutablePropertiesKHR*)(pProperties + i));
+                if (pExecutableCount) {
+                    if (pProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pExecutableCount)); ++i) {
+                            transform_fromhost_VkPipelineExecutablePropertiesKHR(
+                                m_state, (VkPipelineExecutablePropertiesKHR*)(pProperties + i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pProperties;
                 vkStream->putBe64(cgen_var_4);
-                if (pProperties)
-                {
-                    if (pExecutableCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pExecutableCount)); ++i)
-                        {
-                            marshal_VkPipelineExecutablePropertiesKHR(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPipelineExecutablePropertiesKHR*)(pProperties + i));
+                if (pProperties) {
+                    if (pExecutableCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pExecutableCount)); ++i) {
+                            marshal_VkPipelineExecutablePropertiesKHR(
+                                vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                (VkPipelineExecutablePropertiesKHR*)(pProperties + i));
                         }
                     }
                 }
-                vkStream->write(&vkGetPipelineExecutablePropertiesKHR_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkGetPipelineExecutablePropertiesKHR_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPipelineExecutablePropertiesKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetPipelineExecutablePropertiesKHR_VkResult_return, device, pPipelineInfo, pExecutableCount, pProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPipelineExecutablePropertiesKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetPipelineExecutablePropertiesKHR_VkResult_return, device, pPipelineInfo,
+                        pExecutableCount, pProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPipelineExecutableStatisticsKHR:
-            {
+            case OP_vkGetPipelineExecutableStatisticsKHR: {
                 android::base::beginTrace("vkGetPipelineExecutableStatisticsKHR decode");
                 VkDevice device;
                 const VkPipelineExecutableInfoKHR* pExecutableInfo;
@@ -16634,16 +19253,18 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pExecutableInfo, sizeof(const VkPipelineExecutableInfoKHR));
-                reservedunmarshal_VkPipelineExecutableInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPipelineExecutableInfoKHR*)(pExecutableInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pExecutableInfo,
+                                    sizeof(const VkPipelineExecutableInfoKHR));
+                reservedunmarshal_VkPipelineExecutableInfoKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPipelineExecutableInfoKHR*)(pExecutableInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pStatisticCount;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 memcpy((uint32_t**)&pStatisticCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pStatisticCount);
                 *readStreamPtrPtr += 8;
-                if (pStatisticCount)
-                {
+                if (pStatisticCount) {
                     vkReadStream->alloc((void**)&pStatisticCount, sizeof(uint32_t));
                     memcpy((uint32_t*)pStatisticCount, *readStreamPtrPtr, sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
@@ -16654,82 +19275,90 @@
                 memcpy((VkPipelineExecutableStatisticKHR**)&pStatistics, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pStatistics);
                 *readStreamPtrPtr += 8;
-                if (pStatistics)
-                {
-                    vkReadStream->alloc((void**)&pStatistics, (*(pStatisticCount)) * sizeof(VkPipelineExecutableStatisticKHR));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pStatisticCount)); ++i)
-                    {
-                        reservedunmarshal_VkPipelineExecutableStatisticKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPipelineExecutableStatisticKHR*)(pStatistics + i), readStreamPtrPtr);
+                if (pStatistics) {
+                    vkReadStream->alloc(
+                        (void**)&pStatistics,
+                        (*(pStatisticCount)) * sizeof(VkPipelineExecutableStatisticKHR));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pStatisticCount)); ++i) {
+                        reservedunmarshal_VkPipelineExecutableStatisticKHR(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkPipelineExecutableStatisticKHR*)(pStatistics + i), readStreamPtrPtr);
                     }
                 }
-                if (pExecutableInfo)
-                {
-                    transform_tohost_VkPipelineExecutableInfoKHR(m_state, (VkPipelineExecutableInfoKHR*)(pExecutableInfo));
+                if (pExecutableInfo) {
+                    transform_tohost_VkPipelineExecutableInfoKHR(
+                        m_state, (VkPipelineExecutableInfoKHR*)(pExecutableInfo));
                 }
-                if (pStatisticCount)
-                {
-                    if (pStatistics)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pStatisticCount)); ++i)
-                        {
-                            transform_tohost_VkPipelineExecutableStatisticKHR(m_state, (VkPipelineExecutableStatisticKHR*)(pStatistics + i));
+                if (pStatisticCount) {
+                    if (pStatistics) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pStatisticCount)); ++i) {
+                            transform_tohost_VkPipelineExecutableStatisticKHR(
+                                m_state, (VkPipelineExecutableStatisticKHR*)(pStatistics + i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPipelineExecutableStatisticsKHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pExecutableInfo, (unsigned long long)pStatisticCount, (unsigned long long)pStatistics);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPipelineExecutableStatisticsKHR 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device,
+                            (unsigned long long)pExecutableInfo,
+                            (unsigned long long)pStatisticCount, (unsigned long long)pStatistics);
                 }
                 VkResult vkGetPipelineExecutableStatisticsKHR_VkResult_return = (VkResult)0;
-                vkGetPipelineExecutableStatisticsKHR_VkResult_return = vk->vkGetPipelineExecutableStatisticsKHR(unboxed_device, pExecutableInfo, pStatisticCount, pStatistics);
-                if ((vkGetPipelineExecutableStatisticsKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetPipelineExecutableStatisticsKHR_VkResult_return =
+                    vk->vkGetPipelineExecutableStatisticsKHR(unboxed_device, pExecutableInfo,
+                                                             pStatisticCount, pStatistics);
+                if ((vkGetPipelineExecutableStatisticsKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pStatisticCount;
                 vkStream->putBe64(cgen_var_3);
-                if (pStatisticCount)
-                {
+                if (pStatisticCount) {
                     vkStream->write((uint32_t*)pStatisticCount, sizeof(uint32_t));
                 }
-                if (pStatisticCount)
-                {
-                    if (pStatistics)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pStatisticCount)); ++i)
-                        {
-                            transform_fromhost_VkPipelineExecutableStatisticKHR(m_state, (VkPipelineExecutableStatisticKHR*)(pStatistics + i));
+                if (pStatisticCount) {
+                    if (pStatistics) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pStatisticCount)); ++i) {
+                            transform_fromhost_VkPipelineExecutableStatisticKHR(
+                                m_state, (VkPipelineExecutableStatisticKHR*)(pStatistics + i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pStatistics;
                 vkStream->putBe64(cgen_var_4);
-                if (pStatistics)
-                {
-                    if (pStatisticCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pStatisticCount)); ++i)
-                        {
-                            marshal_VkPipelineExecutableStatisticKHR(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPipelineExecutableStatisticKHR*)(pStatistics + i));
+                if (pStatistics) {
+                    if (pStatisticCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pStatisticCount)); ++i) {
+                            marshal_VkPipelineExecutableStatisticKHR(
+                                vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                (VkPipelineExecutableStatisticKHR*)(pStatistics + i));
                         }
                     }
                 }
-                vkStream->write(&vkGetPipelineExecutableStatisticsKHR_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkGetPipelineExecutableStatisticsKHR_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPipelineExecutableStatisticsKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetPipelineExecutableStatisticsKHR_VkResult_return, device, pExecutableInfo, pStatisticCount, pStatistics);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPipelineExecutableStatisticsKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetPipelineExecutableStatisticsKHR_VkResult_return, device,
+                        pExecutableInfo, pStatisticCount, pStatistics);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPipelineExecutableInternalRepresentationsKHR:
-            {
-                android::base::beginTrace("vkGetPipelineExecutableInternalRepresentationsKHR decode");
+            case OP_vkGetPipelineExecutableInternalRepresentationsKHR: {
+                android::base::beginTrace(
+                    "vkGetPipelineExecutableInternalRepresentationsKHR decode");
                 VkDevice device;
                 const VkPipelineExecutableInfoKHR* pExecutableInfo;
                 uint32_t* pInternalRepresentationCount;
@@ -16742,96 +19371,119 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pExecutableInfo, sizeof(const VkPipelineExecutableInfoKHR));
-                reservedunmarshal_VkPipelineExecutableInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPipelineExecutableInfoKHR*)(pExecutableInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pExecutableInfo,
+                                    sizeof(const VkPipelineExecutableInfoKHR));
+                reservedunmarshal_VkPipelineExecutableInfoKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPipelineExecutableInfoKHR*)(pExecutableInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pInternalRepresentationCount;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 memcpy((uint32_t**)&pInternalRepresentationCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pInternalRepresentationCount);
                 *readStreamPtrPtr += 8;
-                if (pInternalRepresentationCount)
-                {
+                if (pInternalRepresentationCount) {
                     vkReadStream->alloc((void**)&pInternalRepresentationCount, sizeof(uint32_t));
-                    memcpy((uint32_t*)pInternalRepresentationCount, *readStreamPtrPtr, sizeof(uint32_t));
+                    memcpy((uint32_t*)pInternalRepresentationCount, *readStreamPtrPtr,
+                           sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
                 }
                 // Begin manual dispatchable handle unboxing for pInternalRepresentations;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
-                memcpy((VkPipelineExecutableInternalRepresentationKHR**)&pInternalRepresentations, (*readStreamPtrPtr), 8);
+                memcpy((VkPipelineExecutableInternalRepresentationKHR**)&pInternalRepresentations,
+                       (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pInternalRepresentations);
                 *readStreamPtrPtr += 8;
-                if (pInternalRepresentations)
-                {
-                    vkReadStream->alloc((void**)&pInternalRepresentations, (*(pInternalRepresentationCount)) * sizeof(VkPipelineExecutableInternalRepresentationKHR));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pInternalRepresentationCount)); ++i)
-                    {
-                        reservedunmarshal_VkPipelineExecutableInternalRepresentationKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPipelineExecutableInternalRepresentationKHR*)(pInternalRepresentations + i), readStreamPtrPtr);
+                if (pInternalRepresentations) {
+                    vkReadStream->alloc((void**)&pInternalRepresentations,
+                                        (*(pInternalRepresentationCount)) *
+                                            sizeof(VkPipelineExecutableInternalRepresentationKHR));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pInternalRepresentationCount)); ++i) {
+                        reservedunmarshal_VkPipelineExecutableInternalRepresentationKHR(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkPipelineExecutableInternalRepresentationKHR*)(pInternalRepresentations +
+                                                                             i),
+                            readStreamPtrPtr);
                     }
                 }
-                if (pExecutableInfo)
-                {
-                    transform_tohost_VkPipelineExecutableInfoKHR(m_state, (VkPipelineExecutableInfoKHR*)(pExecutableInfo));
+                if (pExecutableInfo) {
+                    transform_tohost_VkPipelineExecutableInfoKHR(
+                        m_state, (VkPipelineExecutableInfoKHR*)(pExecutableInfo));
                 }
-                if (pInternalRepresentationCount)
-                {
-                    if (pInternalRepresentations)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pInternalRepresentationCount)); ++i)
-                        {
-                            transform_tohost_VkPipelineExecutableInternalRepresentationKHR(m_state, (VkPipelineExecutableInternalRepresentationKHR*)(pInternalRepresentations + i));
+                if (pInternalRepresentationCount) {
+                    if (pInternalRepresentations) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pInternalRepresentationCount)); ++i) {
+                            transform_tohost_VkPipelineExecutableInternalRepresentationKHR(
+                                m_state,
+                                (VkPipelineExecutableInternalRepresentationKHR*)(pInternalRepresentations +
+                                                                                 i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPipelineExecutableInternalRepresentationsKHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pExecutableInfo, (unsigned long long)pInternalRepresentationCount, (unsigned long long)pInternalRepresentations);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPipelineExecutableInternalRepresentationsKHR "
+                            "0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device,
+                            (unsigned long long)pExecutableInfo,
+                            (unsigned long long)pInternalRepresentationCount,
+                            (unsigned long long)pInternalRepresentations);
                 }
-                VkResult vkGetPipelineExecutableInternalRepresentationsKHR_VkResult_return = (VkResult)0;
-                vkGetPipelineExecutableInternalRepresentationsKHR_VkResult_return = vk->vkGetPipelineExecutableInternalRepresentationsKHR(unboxed_device, pExecutableInfo, pInternalRepresentationCount, pInternalRepresentations);
-                if ((vkGetPipelineExecutableInternalRepresentationsKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                VkResult vkGetPipelineExecutableInternalRepresentationsKHR_VkResult_return =
+                    (VkResult)0;
+                vkGetPipelineExecutableInternalRepresentationsKHR_VkResult_return =
+                    vk->vkGetPipelineExecutableInternalRepresentationsKHR(
+                        unboxed_device, pExecutableInfo, pInternalRepresentationCount,
+                        pInternalRepresentations);
+                if ((vkGetPipelineExecutableInternalRepresentationsKHR_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pInternalRepresentationCount;
                 vkStream->putBe64(cgen_var_3);
-                if (pInternalRepresentationCount)
-                {
+                if (pInternalRepresentationCount) {
                     vkStream->write((uint32_t*)pInternalRepresentationCount, sizeof(uint32_t));
                 }
-                if (pInternalRepresentationCount)
-                {
-                    if (pInternalRepresentations)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pInternalRepresentationCount)); ++i)
-                        {
-                            transform_fromhost_VkPipelineExecutableInternalRepresentationKHR(m_state, (VkPipelineExecutableInternalRepresentationKHR*)(pInternalRepresentations + i));
+                if (pInternalRepresentationCount) {
+                    if (pInternalRepresentations) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pInternalRepresentationCount)); ++i) {
+                            transform_fromhost_VkPipelineExecutableInternalRepresentationKHR(
+                                m_state,
+                                (VkPipelineExecutableInternalRepresentationKHR*)(pInternalRepresentations +
+                                                                                 i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pInternalRepresentations;
                 vkStream->putBe64(cgen_var_4);
-                if (pInternalRepresentations)
-                {
-                    if (pInternalRepresentationCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pInternalRepresentationCount)); ++i)
-                        {
-                            marshal_VkPipelineExecutableInternalRepresentationKHR(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPipelineExecutableInternalRepresentationKHR*)(pInternalRepresentations + i));
+                if (pInternalRepresentations) {
+                    if (pInternalRepresentationCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pInternalRepresentationCount)); ++i) {
+                            marshal_VkPipelineExecutableInternalRepresentationKHR(
+                                vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                (VkPipelineExecutableInternalRepresentationKHR*)(pInternalRepresentations +
+                                                                                 i));
                         }
                     }
                 }
-                vkStream->write(&vkGetPipelineExecutableInternalRepresentationsKHR_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkGetPipelineExecutableInternalRepresentationsKHR_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPipelineExecutableInternalRepresentationsKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetPipelineExecutableInternalRepresentationsKHR_VkResult_return, device, pExecutableInfo, pInternalRepresentationCount, pInternalRepresentations);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPipelineExecutableInternalRepresentationsKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetPipelineExecutableInternalRepresentationsKHR_VkResult_return, device,
+                        pExecutableInfo, pInternalRepresentationCount, pInternalRepresentations);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -16845,8 +19497,7 @@
 #ifdef VK_KHR_present_id
 #endif
 #ifdef VK_KHR_video_encode_queue
-            case OP_vkCmdEncodeVideoKHR:
-            {
+            case OP_vkCmdEncodeVideoKHR: {
                 android::base::beginTrace("vkCmdEncodeVideoKHR decode");
                 VkCommandBuffer commandBuffer;
                 const VkVideoEncodeInfoKHR* pEncodeInfo;
@@ -16854,37 +19505,42 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 vkReadStream->alloc((void**)&pEncodeInfo, sizeof(const VkVideoEncodeInfoKHR));
-                reservedunmarshal_VkVideoEncodeInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkVideoEncodeInfoKHR*)(pEncodeInfo), readStreamPtrPtr);
-                if (pEncodeInfo)
-                {
-                    transform_tohost_VkVideoEncodeInfoKHR(m_state, (VkVideoEncodeInfoKHR*)(pEncodeInfo));
+                reservedunmarshal_VkVideoEncodeInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                       (VkVideoEncodeInfoKHR*)(pEncodeInfo),
+                                                       readStreamPtrPtr);
+                if (pEncodeInfo) {
+                    transform_tohost_VkVideoEncodeInfoKHR(m_state,
+                                                          (VkVideoEncodeInfoKHR*)(pEncodeInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdEncodeVideoKHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pEncodeInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdEncodeVideoKHR 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pEncodeInfo);
                 }
                 vk->vkCmdEncodeVideoKHR(unboxed_commandBuffer, pEncodeInfo);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdEncodeVideoKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pEncodeInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdEncodeVideoKHR(snapshotTraceBegin, snapshotTraceBytes,
+                                                             &m_pool, commandBuffer, pEncodeInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_KHR_synchronization2
-            case OP_vkCmdSetEvent2KHR:
-            {
+            case OP_vkCmdSetEvent2KHR: {
                 android::base::beginTrace("vkCmdSetEvent2KHR decode");
                 VkCommandBuffer commandBuffer;
                 VkEvent event;
@@ -16893,7 +19549,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -16902,30 +19559,35 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkEvent*)&event = (VkEvent)unbox_VkEvent((VkEvent)(*&cgen_var_1));
                 vkReadStream->alloc((void**)&pDependencyInfo, sizeof(const VkDependencyInfoKHR));
-                reservedunmarshal_VkDependencyInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDependencyInfoKHR*)(pDependencyInfo), readStreamPtrPtr);
-                if (pDependencyInfo)
-                {
-                    transform_tohost_VkDependencyInfoKHR(m_state, (VkDependencyInfoKHR*)(pDependencyInfo));
+                reservedunmarshal_VkDependencyInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                      (VkDependencyInfoKHR*)(pDependencyInfo),
+                                                      readStreamPtrPtr);
+                if (pDependencyInfo) {
+                    transform_tohost_VkDependencyInfoKHR(m_state,
+                                                         (VkDependencyInfoKHR*)(pDependencyInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetEvent2KHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)event, (unsigned long long)pDependencyInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdSetEvent2KHR 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer, (unsigned long long)event,
+                            (unsigned long long)pDependencyInfo);
                 }
                 vk->vkCmdSetEvent2KHR(unboxed_commandBuffer, event, pDependencyInfo);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetEvent2KHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, event, pDependencyInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetEvent2KHR(snapshotTraceBegin, snapshotTraceBytes,
+                                                           &m_pool, commandBuffer, event,
+                                                           pDependencyInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdResetEvent2KHR:
-            {
+            case OP_vkCmdResetEvent2KHR: {
                 android::base::beginTrace("vkCmdResetEvent2KHR decode");
                 VkCommandBuffer commandBuffer;
                 VkEvent event;
@@ -16934,7 +19596,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -16942,27 +19605,31 @@
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkEvent*)&event = (VkEvent)unbox_VkEvent((VkEvent)(*&cgen_var_1));
-                memcpy((VkPipelineStageFlags2KHR*)&stageMask, *readStreamPtrPtr, sizeof(VkPipelineStageFlags2KHR));
+                memcpy((VkPipelineStageFlags2KHR*)&stageMask, *readStreamPtrPtr,
+                       sizeof(VkPipelineStageFlags2KHR));
                 *readStreamPtrPtr += sizeof(VkPipelineStageFlags2KHR);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdResetEvent2KHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)event, (unsigned long long)stageMask);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdResetEvent2KHR 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer, (unsigned long long)event,
+                            (unsigned long long)stageMask);
                 }
                 vk->vkCmdResetEvent2KHR(unboxed_commandBuffer, event, stageMask);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdResetEvent2KHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, event, stageMask);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdResetEvent2KHR(snapshotTraceBegin, snapshotTraceBytes,
+                                                             &m_pool, commandBuffer, event,
+                                                             stageMask);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdWaitEvents2KHR:
-            {
+            case OP_vkCmdWaitEvents2KHR: {
                 android::base::beginTrace("vkCmdWaitEvents2KHR decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t eventCount;
@@ -16972,54 +19639,61 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 memcpy((uint32_t*)&eventCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 vkReadStream->alloc((void**)&pEvents, ((eventCount)) * sizeof(const VkEvent));
-                if (((eventCount)))
-                {
+                if (((eventCount))) {
                     uint8_t* cgen_var_1_ptr = (uint8_t*)(*readStreamPtrPtr);
                     *readStreamPtrPtr += 8 * ((eventCount));
-                    for (uint32_t k = 0; k < ((eventCount)); ++k)
-                    {
-                        uint64_t tmpval; memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
+                    for (uint32_t k = 0; k < ((eventCount)); ++k) {
+                        uint64_t tmpval;
+                        memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
                         *(((VkEvent*)pEvents) + k) = (VkEvent)unbox_VkEvent((VkEvent)tmpval);
                     }
                 }
-                vkReadStream->alloc((void**)&pDependencyInfos, ((eventCount)) * sizeof(const VkDependencyInfoKHR));
-                for (uint32_t i = 0; i < (uint32_t)((eventCount)); ++i)
-                {
-                    reservedunmarshal_VkDependencyInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDependencyInfoKHR*)(pDependencyInfos + i), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pDependencyInfos,
+                                    ((eventCount)) * sizeof(const VkDependencyInfoKHR));
+                for (uint32_t i = 0; i < (uint32_t)((eventCount)); ++i) {
+                    reservedunmarshal_VkDependencyInfoKHR(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkDependencyInfoKHR*)(pDependencyInfos + i), readStreamPtrPtr);
                 }
-                if (pDependencyInfos)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((eventCount)); ++i)
-                    {
-                        transform_tohost_VkDependencyInfoKHR(m_state, (VkDependencyInfoKHR*)(pDependencyInfos + i));
+                if (pDependencyInfos) {
+                    for (uint32_t i = 0; i < (uint32_t)((eventCount)); ++i) {
+                        transform_tohost_VkDependencyInfoKHR(
+                            m_state, (VkDependencyInfoKHR*)(pDependencyInfos + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdWaitEvents2KHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)eventCount, (unsigned long long)pEvents, (unsigned long long)pDependencyInfos);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdWaitEvents2KHR 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)eventCount, (unsigned long long)pEvents,
+                            (unsigned long long)pDependencyInfos);
                 }
-                vk->vkCmdWaitEvents2KHR(unboxed_commandBuffer, eventCount, pEvents, pDependencyInfos);
+                vk->vkCmdWaitEvents2KHR(unboxed_commandBuffer, eventCount, pEvents,
+                                        pDependencyInfos);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdWaitEvents2KHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, eventCount, pEvents, pDependencyInfos);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdWaitEvents2KHR(snapshotTraceBegin, snapshotTraceBytes,
+                                                             &m_pool, commandBuffer, eventCount,
+                                                             pEvents, pDependencyInfos);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdPipelineBarrier2KHR:
-            {
+            case OP_vkCmdPipelineBarrier2KHR: {
                 android::base::beginTrace("vkCmdPipelineBarrier2KHR decode");
                 VkCommandBuffer commandBuffer;
                 const VkDependencyInfoKHR* pDependencyInfo;
@@ -17027,35 +19701,41 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 vkReadStream->alloc((void**)&pDependencyInfo, sizeof(const VkDependencyInfoKHR));
-                reservedunmarshal_VkDependencyInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDependencyInfoKHR*)(pDependencyInfo), readStreamPtrPtr);
-                if (pDependencyInfo)
-                {
-                    transform_tohost_VkDependencyInfoKHR(m_state, (VkDependencyInfoKHR*)(pDependencyInfo));
+                reservedunmarshal_VkDependencyInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                      (VkDependencyInfoKHR*)(pDependencyInfo),
+                                                      readStreamPtrPtr);
+                if (pDependencyInfo) {
+                    transform_tohost_VkDependencyInfoKHR(m_state,
+                                                         (VkDependencyInfoKHR*)(pDependencyInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdPipelineBarrier2KHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pDependencyInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdPipelineBarrier2KHR 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pDependencyInfo);
                 }
                 vk->vkCmdPipelineBarrier2KHR(unboxed_commandBuffer, pDependencyInfo);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdPipelineBarrier2KHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pDependencyInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdPipelineBarrier2KHR(snapshotTraceBegin,
+                                                                  snapshotTraceBytes, &m_pool,
+                                                                  commandBuffer, pDependencyInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdWriteTimestamp2KHR:
-            {
+            case OP_vkCmdWriteTimestamp2KHR: {
                 android::base::beginTrace("vkCmdWriteTimestamp2KHR decode");
                 VkCommandBuffer commandBuffer;
                 VkPipelineStageFlags2KHR stage;
@@ -17065,37 +19745,45 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
-                memcpy((VkPipelineStageFlags2KHR*)&stage, *readStreamPtrPtr, sizeof(VkPipelineStageFlags2KHR));
+                memcpy((VkPipelineStageFlags2KHR*)&stage, *readStreamPtrPtr,
+                       sizeof(VkPipelineStageFlags2KHR));
                 *readStreamPtrPtr += sizeof(VkPipelineStageFlags2KHR);
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkQueryPool*)&queryPool = (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_1));
+                *(VkQueryPool*)&queryPool =
+                    (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_1));
                 memcpy((uint32_t*)&query, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdWriteTimestamp2KHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)stage, (unsigned long long)queryPool, (unsigned long long)query);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkCmdWriteTimestamp2KHR 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)commandBuffer, (unsigned long long)stage,
+                        (unsigned long long)queryPool, (unsigned long long)query);
                 }
                 vk->vkCmdWriteTimestamp2KHR(unboxed_commandBuffer, stage, queryPool, query);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdWriteTimestamp2KHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, stage, queryPool, query);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdWriteTimestamp2KHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, stage,
+                        queryPool, query);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkQueueSubmit2KHR:
-            {
+            case OP_vkQueueSubmit2KHR: {
                 android::base::beginTrace("vkQueueSubmit2KHR decode");
                 VkQueue queue;
                 uint32_t submitCount;
@@ -17111,45 +19799,52 @@
                 // End manual dispatchable handle unboxing for queue;
                 memcpy((uint32_t*)&submitCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pSubmits, ((submitCount)) * sizeof(const VkSubmitInfo2KHR));
-                for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i)
-                {
-                    reservedunmarshal_VkSubmitInfo2KHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubmitInfo2KHR*)(pSubmits + i), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pSubmits,
+                                    ((submitCount)) * sizeof(const VkSubmitInfo2KHR));
+                for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i) {
+                    reservedunmarshal_VkSubmitInfo2KHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                       (VkSubmitInfo2KHR*)(pSubmits + i),
+                                                       readStreamPtrPtr);
                 }
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkFence*)&fence = (VkFence)unbox_VkFence((VkFence)(*&cgen_var_1));
-                if (pSubmits)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i)
-                    {
-                        transform_tohost_VkSubmitInfo2KHR(m_state, (VkSubmitInfo2KHR*)(pSubmits + i));
+                if (pSubmits) {
+                    for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i) {
+                        transform_tohost_VkSubmitInfo2KHR(m_state,
+                                                          (VkSubmitInfo2KHR*)(pSubmits + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkQueueSubmit2KHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)queue, (unsigned long long)submitCount, (unsigned long long)pSubmits, (unsigned long long)fence);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkQueueSubmit2KHR 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)queue, (unsigned long long)submitCount,
+                            (unsigned long long)pSubmits, (unsigned long long)fence);
                 }
                 VkResult vkQueueSubmit2KHR_VkResult_return = (VkResult)0;
-                vkQueueSubmit2KHR_VkResult_return = vk->vkQueueSubmit2KHR(unboxed_queue, submitCount, pSubmits, fence);
-                if ((vkQueueSubmit2KHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkQueueSubmit2KHR_VkResult_return =
+                    vk->vkQueueSubmit2KHR(unboxed_queue, submitCount, pSubmits, fence);
+                if ((vkQueueSubmit2KHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkQueueSubmit2KHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkQueueSubmit2KHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkQueueSubmit2KHR_VkResult_return, queue, submitCount, pSubmits, fence);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkQueueSubmit2KHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkQueueSubmit2KHR_VkResult_return, queue, submitCount, pSubmits, fence);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdWriteBufferMarker2AMD:
-            {
+            case OP_vkCmdWriteBufferMarker2AMD: {
                 android::base::beginTrace("vkCmdWriteBufferMarker2AMD decode");
                 VkCommandBuffer commandBuffer;
                 VkPipelineStageFlags2KHR stage;
@@ -17160,11 +19855,13 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
-                memcpy((VkPipelineStageFlags2KHR*)&stage, *readStreamPtrPtr, sizeof(VkPipelineStageFlags2KHR));
+                memcpy((VkPipelineStageFlags2KHR*)&stage, *readStreamPtrPtr,
+                       sizeof(VkPipelineStageFlags2KHR));
                 *readStreamPtrPtr += sizeof(VkPipelineStageFlags2KHR);
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
@@ -17174,25 +19871,32 @@
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
                 memcpy((uint32_t*)&marker, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdWriteBufferMarker2AMD 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)stage, (unsigned long long)dstBuffer, (unsigned long long)dstOffset, (unsigned long long)marker);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdWriteBufferMarker2AMD 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer, (unsigned long long)stage,
+                            (unsigned long long)dstBuffer, (unsigned long long)dstOffset,
+                            (unsigned long long)marker);
                 }
-                vk->vkCmdWriteBufferMarker2AMD(unboxed_commandBuffer, stage, dstBuffer, dstOffset, marker);
+                vk->vkCmdWriteBufferMarker2AMD(unboxed_commandBuffer, stage, dstBuffer, dstOffset,
+                                               marker);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdWriteBufferMarker2AMD(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, stage, dstBuffer, dstOffset, marker);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdWriteBufferMarker2AMD(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, stage,
+                        dstBuffer, dstOffset, marker);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetQueueCheckpointData2NV:
-            {
+            case OP_vkGetQueueCheckpointData2NV: {
                 android::base::beginTrace("vkGetQueueCheckpointData2NV decode");
                 VkQueue queue;
                 uint32_t* pCheckpointDataCount;
@@ -17211,8 +19915,7 @@
                 memcpy((uint32_t**)&pCheckpointDataCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pCheckpointDataCount);
                 *readStreamPtrPtr += 8;
-                if (pCheckpointDataCount)
-                {
+                if (pCheckpointDataCount) {
                     vkReadStream->alloc((void**)&pCheckpointDataCount, sizeof(uint32_t));
                     memcpy((uint32_t*)pCheckpointDataCount, *readStreamPtrPtr, sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
@@ -17223,69 +19926,71 @@
                 memcpy((VkCheckpointData2NV**)&pCheckpointData, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pCheckpointData);
                 *readStreamPtrPtr += 8;
-                if (pCheckpointData)
-                {
-                    vkReadStream->alloc((void**)&pCheckpointData, (*(pCheckpointDataCount)) * sizeof(VkCheckpointData2NV));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pCheckpointDataCount)); ++i)
-                    {
-                        reservedunmarshal_VkCheckpointData2NV(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCheckpointData2NV*)(pCheckpointData + i), readStreamPtrPtr);
+                if (pCheckpointData) {
+                    vkReadStream->alloc((void**)&pCheckpointData,
+                                        (*(pCheckpointDataCount)) * sizeof(VkCheckpointData2NV));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pCheckpointDataCount)); ++i) {
+                        reservedunmarshal_VkCheckpointData2NV(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkCheckpointData2NV*)(pCheckpointData + i), readStreamPtrPtr);
                     }
                 }
-                if (pCheckpointDataCount)
-                {
-                    if (pCheckpointData)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pCheckpointDataCount)); ++i)
-                        {
-                            transform_tohost_VkCheckpointData2NV(m_state, (VkCheckpointData2NV*)(pCheckpointData + i));
+                if (pCheckpointDataCount) {
+                    if (pCheckpointData) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pCheckpointDataCount)); ++i) {
+                            transform_tohost_VkCheckpointData2NV(
+                                m_state, (VkCheckpointData2NV*)(pCheckpointData + i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetQueueCheckpointData2NV 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)queue, (unsigned long long)pCheckpointDataCount, (unsigned long long)pCheckpointData);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetQueueCheckpointData2NV 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)queue,
+                            (unsigned long long)pCheckpointDataCount,
+                            (unsigned long long)pCheckpointData);
                 }
-                vk->vkGetQueueCheckpointData2NV(unboxed_queue, pCheckpointDataCount, pCheckpointData);
+                vk->vkGetQueueCheckpointData2NV(unboxed_queue, pCheckpointDataCount,
+                                                pCheckpointData);
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pCheckpointDataCount;
                 vkStream->putBe64(cgen_var_3);
-                if (pCheckpointDataCount)
-                {
+                if (pCheckpointDataCount) {
                     vkStream->write((uint32_t*)pCheckpointDataCount, sizeof(uint32_t));
                 }
-                if (pCheckpointDataCount)
-                {
-                    if (pCheckpointData)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pCheckpointDataCount)); ++i)
-                        {
-                            transform_fromhost_VkCheckpointData2NV(m_state, (VkCheckpointData2NV*)(pCheckpointData + i));
+                if (pCheckpointDataCount) {
+                    if (pCheckpointData) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pCheckpointDataCount)); ++i) {
+                            transform_fromhost_VkCheckpointData2NV(
+                                m_state, (VkCheckpointData2NV*)(pCheckpointData + i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pCheckpointData;
                 vkStream->putBe64(cgen_var_4);
-                if (pCheckpointData)
-                {
-                    if (pCheckpointDataCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pCheckpointDataCount)); ++i)
-                        {
-                            marshal_VkCheckpointData2NV(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCheckpointData2NV*)(pCheckpointData + i));
+                if (pCheckpointData) {
+                    if (pCheckpointDataCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pCheckpointDataCount)); ++i) {
+                            marshal_VkCheckpointData2NV(
+                                vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                (VkCheckpointData2NV*)(pCheckpointData + i));
                         }
                     }
                 }
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetQueueCheckpointData2NV(snapshotTraceBegin, snapshotTraceBytes, &m_pool, queue, pCheckpointDataCount, pCheckpointData);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetQueueCheckpointData2NV(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, queue,
+                        pCheckpointDataCount, pCheckpointData);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -17297,8 +20002,7 @@
 #ifdef VK_KHR_workgroup_memory_explicit_layout
 #endif
 #ifdef VK_KHR_copy_commands2
-            case OP_vkCmdCopyBuffer2KHR:
-            {
+            case OP_vkCmdCopyBuffer2KHR: {
                 android::base::beginTrace("vkCmdCopyBuffer2KHR decode");
                 VkCommandBuffer commandBuffer;
                 const VkCopyBufferInfo2KHR* pCopyBufferInfo;
@@ -17306,35 +20010,41 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 vkReadStream->alloc((void**)&pCopyBufferInfo, sizeof(const VkCopyBufferInfo2KHR));
-                reservedunmarshal_VkCopyBufferInfo2KHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyBufferInfo2KHR*)(pCopyBufferInfo), readStreamPtrPtr);
-                if (pCopyBufferInfo)
-                {
-                    transform_tohost_VkCopyBufferInfo2KHR(m_state, (VkCopyBufferInfo2KHR*)(pCopyBufferInfo));
+                reservedunmarshal_VkCopyBufferInfo2KHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                       (VkCopyBufferInfo2KHR*)(pCopyBufferInfo),
+                                                       readStreamPtrPtr);
+                if (pCopyBufferInfo) {
+                    transform_tohost_VkCopyBufferInfo2KHR(m_state,
+                                                          (VkCopyBufferInfo2KHR*)(pCopyBufferInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdCopyBuffer2KHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pCopyBufferInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdCopyBuffer2KHR 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pCopyBufferInfo);
                 }
                 vk->vkCmdCopyBuffer2KHR(unboxed_commandBuffer, pCopyBufferInfo);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdCopyBuffer2KHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pCopyBufferInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdCopyBuffer2KHR(snapshotTraceBegin, snapshotTraceBytes,
+                                                             &m_pool, commandBuffer,
+                                                             pCopyBufferInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdCopyImage2KHR:
-            {
+            case OP_vkCmdCopyImage2KHR: {
                 android::base::beginTrace("vkCmdCopyImage2KHR decode");
                 VkCommandBuffer commandBuffer;
                 const VkCopyImageInfo2KHR* pCopyImageInfo;
@@ -17342,35 +20052,39 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 vkReadStream->alloc((void**)&pCopyImageInfo, sizeof(const VkCopyImageInfo2KHR));
-                reservedunmarshal_VkCopyImageInfo2KHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyImageInfo2KHR*)(pCopyImageInfo), readStreamPtrPtr);
-                if (pCopyImageInfo)
-                {
-                    transform_tohost_VkCopyImageInfo2KHR(m_state, (VkCopyImageInfo2KHR*)(pCopyImageInfo));
+                reservedunmarshal_VkCopyImageInfo2KHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                      (VkCopyImageInfo2KHR*)(pCopyImageInfo),
+                                                      readStreamPtrPtr);
+                if (pCopyImageInfo) {
+                    transform_tohost_VkCopyImageInfo2KHR(m_state,
+                                                         (VkCopyImageInfo2KHR*)(pCopyImageInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdCopyImage2KHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pCopyImageInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdCopyImage2KHR 0x%llx 0x%llx \n", ioStream,
+                            (unsigned long long)commandBuffer, (unsigned long long)pCopyImageInfo);
                 }
                 vk->vkCmdCopyImage2KHR(unboxed_commandBuffer, pCopyImageInfo);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdCopyImage2KHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pCopyImageInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdCopyImage2KHR(snapshotTraceBegin, snapshotTraceBytes,
+                                                            &m_pool, commandBuffer, pCopyImageInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdCopyBufferToImage2KHR:
-            {
+            case OP_vkCmdCopyBufferToImage2KHR: {
                 android::base::beginTrace("vkCmdCopyBufferToImage2KHR decode");
                 VkCommandBuffer commandBuffer;
                 const VkCopyBufferToImageInfo2KHR* pCopyBufferToImageInfo;
@@ -17378,35 +20092,42 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
-                vkReadStream->alloc((void**)&pCopyBufferToImageInfo, sizeof(const VkCopyBufferToImageInfo2KHR));
-                reservedunmarshal_VkCopyBufferToImageInfo2KHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyBufferToImageInfo2KHR*)(pCopyBufferToImageInfo), readStreamPtrPtr);
-                if (pCopyBufferToImageInfo)
-                {
-                    transform_tohost_VkCopyBufferToImageInfo2KHR(m_state, (VkCopyBufferToImageInfo2KHR*)(pCopyBufferToImageInfo));
+                vkReadStream->alloc((void**)&pCopyBufferToImageInfo,
+                                    sizeof(const VkCopyBufferToImageInfo2KHR));
+                reservedunmarshal_VkCopyBufferToImageInfo2KHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkCopyBufferToImageInfo2KHR*)(pCopyBufferToImageInfo), readStreamPtrPtr);
+                if (pCopyBufferToImageInfo) {
+                    transform_tohost_VkCopyBufferToImageInfo2KHR(
+                        m_state, (VkCopyBufferToImageInfo2KHR*)(pCopyBufferToImageInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdCopyBufferToImage2KHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pCopyBufferToImageInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdCopyBufferToImage2KHR 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pCopyBufferToImageInfo);
                 }
                 vk->vkCmdCopyBufferToImage2KHR(unboxed_commandBuffer, pCopyBufferToImageInfo);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdCopyBufferToImage2KHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pCopyBufferToImageInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdCopyBufferToImage2KHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        pCopyBufferToImageInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdCopyImageToBuffer2KHR:
-            {
+            case OP_vkCmdCopyImageToBuffer2KHR: {
                 android::base::beginTrace("vkCmdCopyImageToBuffer2KHR decode");
                 VkCommandBuffer commandBuffer;
                 const VkCopyImageToBufferInfo2KHR* pCopyImageToBufferInfo;
@@ -17414,35 +20135,42 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
-                vkReadStream->alloc((void**)&pCopyImageToBufferInfo, sizeof(const VkCopyImageToBufferInfo2KHR));
-                reservedunmarshal_VkCopyImageToBufferInfo2KHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyImageToBufferInfo2KHR*)(pCopyImageToBufferInfo), readStreamPtrPtr);
-                if (pCopyImageToBufferInfo)
-                {
-                    transform_tohost_VkCopyImageToBufferInfo2KHR(m_state, (VkCopyImageToBufferInfo2KHR*)(pCopyImageToBufferInfo));
+                vkReadStream->alloc((void**)&pCopyImageToBufferInfo,
+                                    sizeof(const VkCopyImageToBufferInfo2KHR));
+                reservedunmarshal_VkCopyImageToBufferInfo2KHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkCopyImageToBufferInfo2KHR*)(pCopyImageToBufferInfo), readStreamPtrPtr);
+                if (pCopyImageToBufferInfo) {
+                    transform_tohost_VkCopyImageToBufferInfo2KHR(
+                        m_state, (VkCopyImageToBufferInfo2KHR*)(pCopyImageToBufferInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdCopyImageToBuffer2KHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pCopyImageToBufferInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdCopyImageToBuffer2KHR 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pCopyImageToBufferInfo);
                 }
                 vk->vkCmdCopyImageToBuffer2KHR(unboxed_commandBuffer, pCopyImageToBufferInfo);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdCopyImageToBuffer2KHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pCopyImageToBufferInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdCopyImageToBuffer2KHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        pCopyImageToBufferInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdBlitImage2KHR:
-            {
+            case OP_vkCmdBlitImage2KHR: {
                 android::base::beginTrace("vkCmdBlitImage2KHR decode");
                 VkCommandBuffer commandBuffer;
                 const VkBlitImageInfo2KHR* pBlitImageInfo;
@@ -17450,35 +20178,39 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 vkReadStream->alloc((void**)&pBlitImageInfo, sizeof(const VkBlitImageInfo2KHR));
-                reservedunmarshal_VkBlitImageInfo2KHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBlitImageInfo2KHR*)(pBlitImageInfo), readStreamPtrPtr);
-                if (pBlitImageInfo)
-                {
-                    transform_tohost_VkBlitImageInfo2KHR(m_state, (VkBlitImageInfo2KHR*)(pBlitImageInfo));
+                reservedunmarshal_VkBlitImageInfo2KHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                      (VkBlitImageInfo2KHR*)(pBlitImageInfo),
+                                                      readStreamPtrPtr);
+                if (pBlitImageInfo) {
+                    transform_tohost_VkBlitImageInfo2KHR(m_state,
+                                                         (VkBlitImageInfo2KHR*)(pBlitImageInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdBlitImage2KHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pBlitImageInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdBlitImage2KHR 0x%llx 0x%llx \n", ioStream,
+                            (unsigned long long)commandBuffer, (unsigned long long)pBlitImageInfo);
                 }
                 vk->vkCmdBlitImage2KHR(unboxed_commandBuffer, pBlitImageInfo);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdBlitImage2KHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pBlitImageInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdBlitImage2KHR(snapshotTraceBegin, snapshotTraceBytes,
+                                                            &m_pool, commandBuffer, pBlitImageInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdResolveImage2KHR:
-            {
+            case OP_vkCmdResolveImage2KHR: {
                 android::base::beginTrace("vkCmdResolveImage2KHR decode");
                 VkCommandBuffer commandBuffer;
                 const VkResolveImageInfo2KHR* pResolveImageInfo;
@@ -17486,30 +20218,38 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
-                vkReadStream->alloc((void**)&pResolveImageInfo, sizeof(const VkResolveImageInfo2KHR));
-                reservedunmarshal_VkResolveImageInfo2KHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkResolveImageInfo2KHR*)(pResolveImageInfo), readStreamPtrPtr);
-                if (pResolveImageInfo)
-                {
-                    transform_tohost_VkResolveImageInfo2KHR(m_state, (VkResolveImageInfo2KHR*)(pResolveImageInfo));
+                vkReadStream->alloc((void**)&pResolveImageInfo,
+                                    sizeof(const VkResolveImageInfo2KHR));
+                reservedunmarshal_VkResolveImageInfo2KHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkResolveImageInfo2KHR*)(pResolveImageInfo), readStreamPtrPtr);
+                if (pResolveImageInfo) {
+                    transform_tohost_VkResolveImageInfo2KHR(
+                        m_state, (VkResolveImageInfo2KHR*)(pResolveImageInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdResolveImage2KHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pResolveImageInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdResolveImage2KHR 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pResolveImageInfo);
                 }
                 vk->vkCmdResolveImage2KHR(unboxed_commandBuffer, pResolveImageInfo);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdResolveImage2KHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pResolveImageInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdResolveImage2KHR(snapshotTraceBegin,
+                                                               snapshotTraceBytes, &m_pool,
+                                                               commandBuffer, pResolveImageInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -17517,8 +20257,7 @@
 #ifdef VK_KHR_format_feature_flags2
 #endif
 #ifdef VK_KHR_maintenance4
-            case OP_vkGetDeviceBufferMemoryRequirementsKHR:
-            {
+            case OP_vkGetDeviceBufferMemoryRequirementsKHR: {
                 android::base::beginTrace("vkGetDeviceBufferMemoryRequirementsKHR decode");
                 VkDevice device;
                 const VkDeviceBufferMemoryRequirementsKHR* pInfo;
@@ -17531,45 +20270,57 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pInfo, sizeof(const VkDeviceBufferMemoryRequirementsKHR));
-                reservedunmarshal_VkDeviceBufferMemoryRequirementsKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDeviceBufferMemoryRequirementsKHR*)(pInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pInfo,
+                                    sizeof(const VkDeviceBufferMemoryRequirementsKHR));
+                reservedunmarshal_VkDeviceBufferMemoryRequirementsKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkDeviceBufferMemoryRequirementsKHR*)(pInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pMemoryRequirements;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pMemoryRequirements, sizeof(VkMemoryRequirements2));
-                reservedunmarshal_VkMemoryRequirements2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements2*)(pMemoryRequirements), readStreamPtrPtr);
-                if (pInfo)
-                {
-                    transform_tohost_VkDeviceBufferMemoryRequirementsKHR(m_state, (VkDeviceBufferMemoryRequirementsKHR*)(pInfo));
+                reservedunmarshal_VkMemoryRequirements2(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkMemoryRequirements2*)(pMemoryRequirements), readStreamPtrPtr);
+                if (pInfo) {
+                    transform_tohost_VkDeviceBufferMemoryRequirementsKHR(
+                        m_state, (VkDeviceBufferMemoryRequirementsKHR*)(pInfo));
                 }
-                if (pMemoryRequirements)
-                {
-                    transform_tohost_VkMemoryRequirements2(m_state, (VkMemoryRequirements2*)(pMemoryRequirements));
+                if (pMemoryRequirements) {
+                    transform_tohost_VkMemoryRequirements2(
+                        m_state, (VkMemoryRequirements2*)(pMemoryRequirements));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetDeviceBufferMemoryRequirementsKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pInfo, (unsigned long long)pMemoryRequirements);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetDeviceBufferMemoryRequirementsKHR 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pInfo,
+                            (unsigned long long)pMemoryRequirements);
                 }
-                vk->vkGetDeviceBufferMemoryRequirementsKHR(unboxed_device, pInfo, pMemoryRequirements);
+                vk->vkGetDeviceBufferMemoryRequirementsKHR(unboxed_device, pInfo,
+                                                           pMemoryRequirements);
                 vkStream->unsetHandleMapping();
-                if (pMemoryRequirements)
-                {
-                    transform_fromhost_VkMemoryRequirements2(m_state, (VkMemoryRequirements2*)(pMemoryRequirements));
+                if (pMemoryRequirements) {
+                    transform_fromhost_VkMemoryRequirements2(
+                        m_state, (VkMemoryRequirements2*)(pMemoryRequirements));
                 }
-                marshal_VkMemoryRequirements2(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements2*)(pMemoryRequirements));
+                marshal_VkMemoryRequirements2(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                              (VkMemoryRequirements2*)(pMemoryRequirements));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetDeviceBufferMemoryRequirementsKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, pInfo, pMemoryRequirements);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetDeviceBufferMemoryRequirementsKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, pInfo,
+                        pMemoryRequirements);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetDeviceImageMemoryRequirementsKHR:
-            {
+            case OP_vkGetDeviceImageMemoryRequirementsKHR: {
                 android::base::beginTrace("vkGetDeviceImageMemoryRequirementsKHR decode");
                 VkDevice device;
                 const VkDeviceImageMemoryRequirementsKHR* pInfo;
@@ -17582,45 +20333,57 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pInfo, sizeof(const VkDeviceImageMemoryRequirementsKHR));
-                reservedunmarshal_VkDeviceImageMemoryRequirementsKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDeviceImageMemoryRequirementsKHR*)(pInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pInfo,
+                                    sizeof(const VkDeviceImageMemoryRequirementsKHR));
+                reservedunmarshal_VkDeviceImageMemoryRequirementsKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkDeviceImageMemoryRequirementsKHR*)(pInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pMemoryRequirements;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pMemoryRequirements, sizeof(VkMemoryRequirements2));
-                reservedunmarshal_VkMemoryRequirements2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements2*)(pMemoryRequirements), readStreamPtrPtr);
-                if (pInfo)
-                {
-                    transform_tohost_VkDeviceImageMemoryRequirementsKHR(m_state, (VkDeviceImageMemoryRequirementsKHR*)(pInfo));
+                reservedunmarshal_VkMemoryRequirements2(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkMemoryRequirements2*)(pMemoryRequirements), readStreamPtrPtr);
+                if (pInfo) {
+                    transform_tohost_VkDeviceImageMemoryRequirementsKHR(
+                        m_state, (VkDeviceImageMemoryRequirementsKHR*)(pInfo));
                 }
-                if (pMemoryRequirements)
-                {
-                    transform_tohost_VkMemoryRequirements2(m_state, (VkMemoryRequirements2*)(pMemoryRequirements));
+                if (pMemoryRequirements) {
+                    transform_tohost_VkMemoryRequirements2(
+                        m_state, (VkMemoryRequirements2*)(pMemoryRequirements));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetDeviceImageMemoryRequirementsKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pInfo, (unsigned long long)pMemoryRequirements);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetDeviceImageMemoryRequirementsKHR 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pInfo,
+                            (unsigned long long)pMemoryRequirements);
                 }
-                vk->vkGetDeviceImageMemoryRequirementsKHR(unboxed_device, pInfo, pMemoryRequirements);
+                vk->vkGetDeviceImageMemoryRequirementsKHR(unboxed_device, pInfo,
+                                                          pMemoryRequirements);
                 vkStream->unsetHandleMapping();
-                if (pMemoryRequirements)
-                {
-                    transform_fromhost_VkMemoryRequirements2(m_state, (VkMemoryRequirements2*)(pMemoryRequirements));
+                if (pMemoryRequirements) {
+                    transform_fromhost_VkMemoryRequirements2(
+                        m_state, (VkMemoryRequirements2*)(pMemoryRequirements));
                 }
-                marshal_VkMemoryRequirements2(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements2*)(pMemoryRequirements));
+                marshal_VkMemoryRequirements2(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                              (VkMemoryRequirements2*)(pMemoryRequirements));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetDeviceImageMemoryRequirementsKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, pInfo, pMemoryRequirements);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetDeviceImageMemoryRequirementsKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, pInfo,
+                        pMemoryRequirements);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetDeviceImageSparseMemoryRequirementsKHR:
-            {
+            case OP_vkGetDeviceImageSparseMemoryRequirementsKHR: {
                 android::base::beginTrace("vkGetDeviceImageSparseMemoryRequirementsKHR decode");
                 VkDevice device;
                 const VkDeviceImageMemoryRequirementsKHR* pInfo;
@@ -17634,100 +20397,114 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pInfo, sizeof(const VkDeviceImageMemoryRequirementsKHR));
-                reservedunmarshal_VkDeviceImageMemoryRequirementsKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDeviceImageMemoryRequirementsKHR*)(pInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pInfo,
+                                    sizeof(const VkDeviceImageMemoryRequirementsKHR));
+                reservedunmarshal_VkDeviceImageMemoryRequirementsKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkDeviceImageMemoryRequirementsKHR*)(pInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pSparseMemoryRequirementCount;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 memcpy((uint32_t**)&pSparseMemoryRequirementCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pSparseMemoryRequirementCount);
                 *readStreamPtrPtr += 8;
-                if (pSparseMemoryRequirementCount)
-                {
+                if (pSparseMemoryRequirementCount) {
                     vkReadStream->alloc((void**)&pSparseMemoryRequirementCount, sizeof(uint32_t));
-                    memcpy((uint32_t*)pSparseMemoryRequirementCount, *readStreamPtrPtr, sizeof(uint32_t));
+                    memcpy((uint32_t*)pSparseMemoryRequirementCount, *readStreamPtrPtr,
+                           sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
                 }
                 // Begin manual dispatchable handle unboxing for pSparseMemoryRequirements;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
-                memcpy((VkSparseImageMemoryRequirements2**)&pSparseMemoryRequirements, (*readStreamPtrPtr), 8);
+                memcpy((VkSparseImageMemoryRequirements2**)&pSparseMemoryRequirements,
+                       (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pSparseMemoryRequirements);
                 *readStreamPtrPtr += 8;
-                if (pSparseMemoryRequirements)
-                {
-                    vkReadStream->alloc((void**)&pSparseMemoryRequirements, (*(pSparseMemoryRequirementCount)) * sizeof(VkSparseImageMemoryRequirements2));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i)
-                    {
-                        reservedunmarshal_VkSparseImageMemoryRequirements2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i), readStreamPtrPtr);
+                if (pSparseMemoryRequirements) {
+                    vkReadStream->alloc((void**)&pSparseMemoryRequirements,
+                                        (*(pSparseMemoryRequirementCount)) *
+                                            sizeof(VkSparseImageMemoryRequirements2));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i) {
+                        reservedunmarshal_VkSparseImageMemoryRequirements2(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i),
+                            readStreamPtrPtr);
                     }
                 }
-                if (pInfo)
-                {
-                    transform_tohost_VkDeviceImageMemoryRequirementsKHR(m_state, (VkDeviceImageMemoryRequirementsKHR*)(pInfo));
+                if (pInfo) {
+                    transform_tohost_VkDeviceImageMemoryRequirementsKHR(
+                        m_state, (VkDeviceImageMemoryRequirementsKHR*)(pInfo));
                 }
-                if (pSparseMemoryRequirementCount)
-                {
-                    if (pSparseMemoryRequirements)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i)
-                        {
-                            transform_tohost_VkSparseImageMemoryRequirements2(m_state, (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i));
+                if (pSparseMemoryRequirementCount) {
+                    if (pSparseMemoryRequirements) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount));
+                             ++i) {
+                            transform_tohost_VkSparseImageMemoryRequirements2(
+                                m_state,
+                                (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetDeviceImageSparseMemoryRequirementsKHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pInfo, (unsigned long long)pSparseMemoryRequirementCount, (unsigned long long)pSparseMemoryRequirements);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetDeviceImageSparseMemoryRequirementsKHR 0x%llx "
+                            "0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pInfo,
+                            (unsigned long long)pSparseMemoryRequirementCount,
+                            (unsigned long long)pSparseMemoryRequirements);
                 }
-                vk->vkGetDeviceImageSparseMemoryRequirementsKHR(unboxed_device, pInfo, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
+                vk->vkGetDeviceImageSparseMemoryRequirementsKHR(unboxed_device, pInfo,
+                                                                pSparseMemoryRequirementCount,
+                                                                pSparseMemoryRequirements);
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pSparseMemoryRequirementCount;
                 vkStream->putBe64(cgen_var_3);
-                if (pSparseMemoryRequirementCount)
-                {
+                if (pSparseMemoryRequirementCount) {
                     vkStream->write((uint32_t*)pSparseMemoryRequirementCount, sizeof(uint32_t));
                 }
-                if (pSparseMemoryRequirementCount)
-                {
-                    if (pSparseMemoryRequirements)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i)
-                        {
-                            transform_fromhost_VkSparseImageMemoryRequirements2(m_state, (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i));
+                if (pSparseMemoryRequirementCount) {
+                    if (pSparseMemoryRequirements) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount));
+                             ++i) {
+                            transform_fromhost_VkSparseImageMemoryRequirements2(
+                                m_state,
+                                (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pSparseMemoryRequirements;
                 vkStream->putBe64(cgen_var_4);
-                if (pSparseMemoryRequirements)
-                {
-                    if (pSparseMemoryRequirementCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i)
-                        {
-                            marshal_VkSparseImageMemoryRequirements2(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i));
+                if (pSparseMemoryRequirements) {
+                    if (pSparseMemoryRequirementCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount));
+                             ++i) {
+                            marshal_VkSparseImageMemoryRequirements2(
+                                vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i));
                         }
                     }
                 }
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetDeviceImageSparseMemoryRequirementsKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, pInfo, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetDeviceImageSparseMemoryRequirementsKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, pInfo,
+                        pSparseMemoryRequirementCount, pSparseMemoryRequirements);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_ANDROID_native_buffer
-            case OP_vkGetSwapchainGrallocUsageANDROID:
-            {
+            case OP_vkGetSwapchainGrallocUsageANDROID: {
                 android::base::beginTrace("vkGetSwapchainGrallocUsageANDROID decode");
                 VkDevice device;
                 VkFormat format;
@@ -17740,37 +20517,48 @@
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
                 memcpy((VkFormat*)&format, *readStreamPtrPtr, sizeof(VkFormat));
                 *readStreamPtrPtr += sizeof(VkFormat);
-                memcpy((VkImageUsageFlags*)&imageUsage, *readStreamPtrPtr, sizeof(VkImageUsageFlags));
+                memcpy((VkImageUsageFlags*)&imageUsage, *readStreamPtrPtr,
+                       sizeof(VkImageUsageFlags));
                 *readStreamPtrPtr += sizeof(VkImageUsageFlags);
                 // Begin manual dispatchable handle unboxing for grallocUsage;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&grallocUsage, sizeof(int));
                 memcpy((int*)grallocUsage, *readStreamPtrPtr, sizeof(int));
                 *readStreamPtrPtr += sizeof(int);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetSwapchainGrallocUsageANDROID 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)format, (unsigned long long)imageUsage, (unsigned long long)grallocUsage);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetSwapchainGrallocUsageANDROID 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)format,
+                            (unsigned long long)imageUsage, (unsigned long long)grallocUsage);
                 }
                 VkResult vkGetSwapchainGrallocUsageANDROID_VkResult_return = (VkResult)0;
-                vkGetSwapchainGrallocUsageANDROID_VkResult_return = m_state->on_vkGetSwapchainGrallocUsageANDROID(&m_pool, device, format, imageUsage, grallocUsage);
-                if ((vkGetSwapchainGrallocUsageANDROID_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetSwapchainGrallocUsageANDROID_VkResult_return =
+                    m_state->on_vkGetSwapchainGrallocUsageANDROID(&m_pool, device, format,
+                                                                  imageUsage, grallocUsage);
+                if ((vkGetSwapchainGrallocUsageANDROID_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write((int*)grallocUsage, sizeof(int));
-                vkStream->write(&vkGetSwapchainGrallocUsageANDROID_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkGetSwapchainGrallocUsageANDROID_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetSwapchainGrallocUsageANDROID(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetSwapchainGrallocUsageANDROID_VkResult_return, device, format, imageUsage, grallocUsage);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetSwapchainGrallocUsageANDROID(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetSwapchainGrallocUsageANDROID_VkResult_return, device, format,
+                        imageUsage, grallocUsage);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkAcquireImageANDROID:
-            {
+            case OP_vkAcquireImageANDROID: {
                 android::base::beginTrace("vkAcquireImageANDROID decode");
                 VkDevice device;
                 VkImage image;
@@ -17791,34 +20579,44 @@
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkSemaphore*)&semaphore = (VkSemaphore)unbox_VkSemaphore((VkSemaphore)(*&cgen_var_2));
+                *(VkSemaphore*)&semaphore =
+                    (VkSemaphore)unbox_VkSemaphore((VkSemaphore)(*&cgen_var_2));
                 uint64_t cgen_var_3;
                 memcpy((uint64_t*)&cgen_var_3, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkFence*)&fence = (VkFence)unbox_VkFence((VkFence)(*&cgen_var_3));
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkAcquireImageANDROID 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)image, (unsigned long long)nativeFenceFd, (unsigned long long)semaphore, (unsigned long long)fence);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkAcquireImageANDROID 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)image,
+                            (unsigned long long)nativeFenceFd, (unsigned long long)semaphore,
+                            (unsigned long long)fence);
                 }
                 VkResult vkAcquireImageANDROID_VkResult_return = (VkResult)0;
-                vkAcquireImageANDROID_VkResult_return = m_state->on_vkAcquireImageANDROID(&m_pool, device, image, nativeFenceFd, semaphore, fence);
-                if ((vkAcquireImageANDROID_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkAcquireImageANDROID_VkResult_return = m_state->on_vkAcquireImageANDROID(
+                    &m_pool, device, image, nativeFenceFd, semaphore, fence);
+                if ((vkAcquireImageANDROID_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkAcquireImageANDROID_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkAcquireImageANDROID(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkAcquireImageANDROID_VkResult_return, device, image, nativeFenceFd, semaphore, fence);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkAcquireImageANDROID(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkAcquireImageANDROID_VkResult_return, device, image, nativeFenceFd,
+                        semaphore, fence);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkQueueSignalReleaseImageANDROID:
-            {
+            case OP_vkQueueSignalReleaseImageANDROID: {
                 android::base::beginTrace("vkQueueSignalReleaseImageANDROID decode");
                 VkQueue queue;
                 uint32_t waitSemaphoreCount;
@@ -17836,17 +20634,17 @@
                 memcpy((VkSemaphore**)&pWaitSemaphores, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pWaitSemaphores);
                 *readStreamPtrPtr += 8;
-                if (pWaitSemaphores)
-                {
-                    vkReadStream->alloc((void**)&pWaitSemaphores, ((waitSemaphoreCount)) * sizeof(const VkSemaphore));
-                    if (((waitSemaphoreCount)))
-                    {
+                if (pWaitSemaphores) {
+                    vkReadStream->alloc((void**)&pWaitSemaphores,
+                                        ((waitSemaphoreCount)) * sizeof(const VkSemaphore));
+                    if (((waitSemaphoreCount))) {
                         uint8_t* cgen_var_1_0_ptr = (uint8_t*)(*readStreamPtrPtr);
                         *readStreamPtrPtr += 8 * ((waitSemaphoreCount));
-                        for (uint32_t k = 0; k < ((waitSemaphoreCount)); ++k)
-                        {
-                            uint64_t tmpval; memcpy(&tmpval, cgen_var_1_0_ptr + k * 8, sizeof(uint64_t));
-                            *(((VkSemaphore*)pWaitSemaphores) + k) = (VkSemaphore)unbox_VkSemaphore((VkSemaphore)tmpval);
+                        for (uint32_t k = 0; k < ((waitSemaphoreCount)); ++k) {
+                            uint64_t tmpval;
+                            memcpy(&tmpval, cgen_var_1_0_ptr + k * 8, sizeof(uint64_t));
+                            *(((VkSemaphore*)pWaitSemaphores) + k) =
+                                (VkSemaphore)unbox_VkSemaphore((VkSemaphore)tmpval);
                         }
                     }
                 }
@@ -17859,32 +20657,44 @@
                 vkReadStream->alloc((void**)&pNativeFenceFd, sizeof(int));
                 memcpy((int*)pNativeFenceFd, *readStreamPtrPtr, sizeof(int));
                 *readStreamPtrPtr += sizeof(int);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkQueueSignalReleaseImageANDROID 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)queue, (unsigned long long)waitSemaphoreCount, (unsigned long long)pWaitSemaphores, (unsigned long long)image, (unsigned long long)pNativeFenceFd);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkQueueSignalReleaseImageANDROID 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)queue,
+                            (unsigned long long)waitSemaphoreCount,
+                            (unsigned long long)pWaitSemaphores, (unsigned long long)image,
+                            (unsigned long long)pNativeFenceFd);
                 }
                 VkResult vkQueueSignalReleaseImageANDROID_VkResult_return = (VkResult)0;
-                vkQueueSignalReleaseImageANDROID_VkResult_return = m_state->on_vkQueueSignalReleaseImageANDROID(&m_pool, queue, waitSemaphoreCount, pWaitSemaphores, image, pNativeFenceFd);
-                if ((vkQueueSignalReleaseImageANDROID_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkQueueSignalReleaseImageANDROID_VkResult_return =
+                    m_state->on_vkQueueSignalReleaseImageANDROID(
+                        &m_pool, queue, waitSemaphoreCount, pWaitSemaphores, image, pNativeFenceFd);
+                if ((vkQueueSignalReleaseImageANDROID_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write((int*)pNativeFenceFd, sizeof(int));
-                vkStream->write(&vkQueueSignalReleaseImageANDROID_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkQueueSignalReleaseImageANDROID_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkQueueSignalReleaseImageANDROID(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkQueueSignalReleaseImageANDROID_VkResult_return, queue, waitSemaphoreCount, pWaitSemaphores, image, pNativeFenceFd);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkQueueSignalReleaseImageANDROID(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkQueueSignalReleaseImageANDROID_VkResult_return, queue, waitSemaphoreCount,
+                        pWaitSemaphores, image, pNativeFenceFd);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_EXT_debug_report
-            case OP_vkCreateDebugReportCallbackEXT:
-            {
+            case OP_vkCreateDebugReportCallbackEXT: {
                 android::base::beginTrace("vkCreateDebugReportCallbackEXT decode");
                 VkInstance instance;
                 const VkDebugReportCallbackCreateInfoEXT* pCreateInfo;
@@ -17898,16 +20708,20 @@
                 auto unboxed_instance = unbox_VkInstance(instance);
                 auto vk = dispatch_VkInstance(instance);
                 // End manual dispatchable handle unboxing for instance;
-                vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkDebugReportCallbackCreateInfoEXT));
-                reservedunmarshal_VkDebugReportCallbackCreateInfoEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugReportCallbackCreateInfoEXT*)(pCreateInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pCreateInfo,
+                                    sizeof(const VkDebugReportCallbackCreateInfoEXT));
+                reservedunmarshal_VkDebugReportCallbackCreateInfoEXT(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkDebugReportCallbackCreateInfoEXT*)(pCreateInfo), readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pCallback;
                 vkReadStream->unsetHandleMapping();
@@ -17915,46 +20729,60 @@
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkDebugReportCallbackEXT*)pCallback = (VkDebugReportCallbackEXT)(VkDebugReportCallbackEXT)((VkDebugReportCallbackEXT)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkDebugReportCallbackCreateInfoEXT(m_state, (VkDebugReportCallbackCreateInfoEXT*)(pCreateInfo));
+                *(VkDebugReportCallbackEXT*)pCallback =
+                    (VkDebugReportCallbackEXT)(VkDebugReportCallbackEXT)((
+                        VkDebugReportCallbackEXT)(*&cgen_var_2));
+                if (pCreateInfo) {
+                    transform_tohost_VkDebugReportCallbackCreateInfoEXT(
+                        m_state, (VkDebugReportCallbackCreateInfoEXT*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateDebugReportCallbackEXT 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)instance, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pCallback);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateDebugReportCallbackEXT 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)instance, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pCallback);
                 }
                 VkResult vkCreateDebugReportCallbackEXT_VkResult_return = (VkResult)0;
-                vkCreateDebugReportCallbackEXT_VkResult_return = vk->vkCreateDebugReportCallbackEXT(unboxed_instance, pCreateInfo, pAllocator, pCallback);
-                if ((vkCreateDebugReportCallbackEXT_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateDebugReportCallbackEXT_VkResult_return = vk->vkCreateDebugReportCallbackEXT(
+                    unboxed_instance, pCreateInfo, pAllocator, pCallback);
+                if ((vkCreateDebugReportCallbackEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // Begin auto non dispatchable handle create for pCallback;
-                if (vkCreateDebugReportCallbackEXT_VkResult_return == VK_SUCCESS) vkStream->setHandleMapping(&m_boxedHandleCreateMapping);
+                if (vkCreateDebugReportCallbackEXT_VkResult_return == VK_SUCCESS)
+                    vkStream->setHandleMapping(&m_boxedHandleCreateMapping);
                 uint64_t cgen_var_3;
-                static_assert(8 == sizeof(VkDebugReportCallbackEXT), "handle map overwrite requires VkDebugReportCallbackEXT to be 8 bytes long");
-                vkStream->handleMapping()->mapHandles_VkDebugReportCallbackEXT((VkDebugReportCallbackEXT*)pCallback, 1);
+                static_assert(
+                    8 == sizeof(VkDebugReportCallbackEXT),
+                    "handle map overwrite requires VkDebugReportCallbackEXT to be 8 bytes long");
+                vkStream->handleMapping()->mapHandles_VkDebugReportCallbackEXT(
+                    (VkDebugReportCallbackEXT*)pCallback, 1);
                 vkStream->write((VkDebugReportCallbackEXT*)pCallback, 8 * 1);
                 // Begin auto non dispatchable handle create for pCallback;
                 vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
                 vkStream->write(&vkCreateDebugReportCallbackEXT_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateDebugReportCallbackEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateDebugReportCallbackEXT_VkResult_return, instance, pCreateInfo, pAllocator, pCallback);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateDebugReportCallbackEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateDebugReportCallbackEXT_VkResult_return, instance, pCreateInfo,
+                        pAllocator, pCallback);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroyDebugReportCallbackEXT:
-            {
+            case OP_vkDestroyDebugReportCallbackEXT: {
                 android::base::beginTrace("vkDestroyDebugReportCallbackEXT decode");
                 VkInstance instance;
                 VkDebugReportCallbackEXT callback;
@@ -17972,42 +20800,50 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDebugReportCallbackEXT*)&callback = (VkDebugReportCallbackEXT)(VkDebugReportCallbackEXT)((VkDebugReportCallbackEXT)(*&cgen_var_1));
+                *(VkDebugReportCallbackEXT*)&callback =
+                    (VkDebugReportCallbackEXT)(VkDebugReportCallbackEXT)((
+                        VkDebugReportCallbackEXT)(*&cgen_var_1));
                 boxed_callback_preserve = callback;
                 callback = unbox_VkDebugReportCallbackEXT(callback);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroyDebugReportCallbackEXT 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)instance, (unsigned long long)callback, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkDestroyDebugReportCallbackEXT 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)instance, (unsigned long long)callback,
+                        (unsigned long long)pAllocator);
                 }
                 vk->vkDestroyDebugReportCallbackEXT(unboxed_instance, callback, pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroyDebugReportCallbackEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, instance, boxed_callback_preserve, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroyDebugReportCallbackEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, instance,
+                        boxed_callback_preserve, pAllocator);
                 }
                 delete_VkDebugReportCallbackEXT(boxed_callback_preserve);
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDebugReportMessageEXT:
-            {
+            case OP_vkDebugReportMessageEXT: {
                 android::base::beginTrace("vkDebugReportMessageEXT decode");
                 VkInstance instance;
                 VkDebugReportFlagsEXT flags;
@@ -18025,9 +20861,11 @@
                 auto unboxed_instance = unbox_VkInstance(instance);
                 auto vk = dispatch_VkInstance(instance);
                 // End manual dispatchable handle unboxing for instance;
-                memcpy((VkDebugReportFlagsEXT*)&flags, *readStreamPtrPtr, sizeof(VkDebugReportFlagsEXT));
+                memcpy((VkDebugReportFlagsEXT*)&flags, *readStreamPtrPtr,
+                       sizeof(VkDebugReportFlagsEXT));
                 *readStreamPtrPtr += sizeof(VkDebugReportFlagsEXT);
-                memcpy((VkDebugReportObjectTypeEXT*)&objectType, *readStreamPtrPtr, sizeof(VkDebugReportObjectTypeEXT));
+                memcpy((VkDebugReportObjectTypeEXT*)&objectType, *readStreamPtrPtr,
+                       sizeof(VkDebugReportObjectTypeEXT));
                 *readStreamPtrPtr += sizeof(VkDebugReportObjectTypeEXT);
                 memcpy((uint64_t*)&object, *readStreamPtrPtr, sizeof(uint64_t));
                 *readStreamPtrPtr += sizeof(uint64_t);
@@ -18036,22 +20874,32 @@
                 *readStreamPtrPtr += 8;
                 memcpy((int32_t*)&messageCode, *readStreamPtrPtr, sizeof(int32_t));
                 *readStreamPtrPtr += sizeof(int32_t);
-                vkReadStream->loadStringInPlaceWithStreamPtr((char**)&pLayerPrefix, readStreamPtrPtr);
+                vkReadStream->loadStringInPlaceWithStreamPtr((char**)&pLayerPrefix,
+                                                             readStreamPtrPtr);
                 vkReadStream->loadStringInPlaceWithStreamPtr((char**)&pMessage, readStreamPtrPtr);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDebugReportMessageEXT 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)instance, (unsigned long long)flags, (unsigned long long)objectType, (unsigned long long)object, (unsigned long long)location, (unsigned long long)messageCode, (unsigned long long)pLayerPrefix, (unsigned long long)pMessage);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkDebugReportMessageEXT 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)instance, (unsigned long long)flags,
+                            (unsigned long long)objectType, (unsigned long long)object,
+                            (unsigned long long)location, (unsigned long long)messageCode,
+                            (unsigned long long)pLayerPrefix, (unsigned long long)pMessage);
                 }
-                vk->vkDebugReportMessageEXT(unboxed_instance, flags, objectType, object, location, messageCode, pLayerPrefix, pMessage);
+                vk->vkDebugReportMessageEXT(unboxed_instance, flags, objectType, object, location,
+                                            messageCode, pLayerPrefix, pMessage);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDebugReportMessageEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, instance, flags, objectType, object, location, messageCode, pLayerPrefix, pMessage);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDebugReportMessageEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, instance, flags,
+                        objectType, object, location, messageCode, pLayerPrefix, pMessage);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -18069,8 +20917,7 @@
 #ifdef VK_AMD_shader_explicit_vertex_parameter
 #endif
 #ifdef VK_EXT_debug_marker
-            case OP_vkDebugMarkerSetObjectTagEXT:
-            {
+            case OP_vkDebugMarkerSetObjectTagEXT: {
                 android::base::beginTrace("vkDebugMarkerSetObjectTagEXT decode");
                 VkDevice device;
                 const VkDebugMarkerObjectTagInfoEXT* pTagInfo;
@@ -18083,34 +20930,40 @@
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
                 vkReadStream->alloc((void**)&pTagInfo, sizeof(const VkDebugMarkerObjectTagInfoEXT));
-                reservedunmarshal_VkDebugMarkerObjectTagInfoEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugMarkerObjectTagInfoEXT*)(pTagInfo), readStreamPtrPtr);
-                if (pTagInfo)
-                {
-                    transform_tohost_VkDebugMarkerObjectTagInfoEXT(m_state, (VkDebugMarkerObjectTagInfoEXT*)(pTagInfo));
+                reservedunmarshal_VkDebugMarkerObjectTagInfoEXT(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkDebugMarkerObjectTagInfoEXT*)(pTagInfo), readStreamPtrPtr);
+                if (pTagInfo) {
+                    transform_tohost_VkDebugMarkerObjectTagInfoEXT(
+                        m_state, (VkDebugMarkerObjectTagInfoEXT*)(pTagInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDebugMarkerSetObjectTagEXT 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pTagInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkDebugMarkerSetObjectTagEXT 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pTagInfo);
                 }
                 VkResult vkDebugMarkerSetObjectTagEXT_VkResult_return = (VkResult)0;
-                vkDebugMarkerSetObjectTagEXT_VkResult_return = vk->vkDebugMarkerSetObjectTagEXT(unboxed_device, pTagInfo);
-                if ((vkDebugMarkerSetObjectTagEXT_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkDebugMarkerSetObjectTagEXT_VkResult_return =
+                    vk->vkDebugMarkerSetObjectTagEXT(unboxed_device, pTagInfo);
+                if ((vkDebugMarkerSetObjectTagEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkDebugMarkerSetObjectTagEXT_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDebugMarkerSetObjectTagEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkDebugMarkerSetObjectTagEXT_VkResult_return, device, pTagInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDebugMarkerSetObjectTagEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkDebugMarkerSetObjectTagEXT_VkResult_return, device, pTagInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDebugMarkerSetObjectNameEXT:
-            {
+            case OP_vkDebugMarkerSetObjectNameEXT: {
                 android::base::beginTrace("vkDebugMarkerSetObjectNameEXT decode");
                 VkDevice device;
                 const VkDebugMarkerObjectNameInfoEXT* pNameInfo;
@@ -18122,35 +20975,43 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pNameInfo, sizeof(const VkDebugMarkerObjectNameInfoEXT));
-                reservedunmarshal_VkDebugMarkerObjectNameInfoEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugMarkerObjectNameInfoEXT*)(pNameInfo), readStreamPtrPtr);
-                if (pNameInfo)
-                {
-                    transform_tohost_VkDebugMarkerObjectNameInfoEXT(m_state, (VkDebugMarkerObjectNameInfoEXT*)(pNameInfo));
+                vkReadStream->alloc((void**)&pNameInfo,
+                                    sizeof(const VkDebugMarkerObjectNameInfoEXT));
+                reservedunmarshal_VkDebugMarkerObjectNameInfoEXT(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkDebugMarkerObjectNameInfoEXT*)(pNameInfo), readStreamPtrPtr);
+                if (pNameInfo) {
+                    transform_tohost_VkDebugMarkerObjectNameInfoEXT(
+                        m_state, (VkDebugMarkerObjectNameInfoEXT*)(pNameInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDebugMarkerSetObjectNameEXT 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pNameInfo);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkDebugMarkerSetObjectNameEXT 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pNameInfo);
                 }
                 VkResult vkDebugMarkerSetObjectNameEXT_VkResult_return = (VkResult)0;
-                vkDebugMarkerSetObjectNameEXT_VkResult_return = vk->vkDebugMarkerSetObjectNameEXT(unboxed_device, pNameInfo);
-                if ((vkDebugMarkerSetObjectNameEXT_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkDebugMarkerSetObjectNameEXT_VkResult_return =
+                    vk->vkDebugMarkerSetObjectNameEXT(unboxed_device, pNameInfo);
+                if ((vkDebugMarkerSetObjectNameEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkDebugMarkerSetObjectNameEXT_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDebugMarkerSetObjectNameEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkDebugMarkerSetObjectNameEXT_VkResult_return, device, pNameInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDebugMarkerSetObjectNameEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkDebugMarkerSetObjectNameEXT_VkResult_return, device, pNameInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdDebugMarkerBeginEXT:
-            {
+            case OP_vkCmdDebugMarkerBeginEXT: {
                 android::base::beginTrace("vkCmdDebugMarkerBeginEXT decode");
                 VkCommandBuffer commandBuffer;
                 const VkDebugMarkerMarkerInfoEXT* pMarkerInfo;
@@ -18158,64 +21019,72 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 vkReadStream->alloc((void**)&pMarkerInfo, sizeof(const VkDebugMarkerMarkerInfoEXT));
-                reservedunmarshal_VkDebugMarkerMarkerInfoEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugMarkerMarkerInfoEXT*)(pMarkerInfo), readStreamPtrPtr);
-                if (pMarkerInfo)
-                {
-                    transform_tohost_VkDebugMarkerMarkerInfoEXT(m_state, (VkDebugMarkerMarkerInfoEXT*)(pMarkerInfo));
+                reservedunmarshal_VkDebugMarkerMarkerInfoEXT(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkDebugMarkerMarkerInfoEXT*)(pMarkerInfo), readStreamPtrPtr);
+                if (pMarkerInfo) {
+                    transform_tohost_VkDebugMarkerMarkerInfoEXT(
+                        m_state, (VkDebugMarkerMarkerInfoEXT*)(pMarkerInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdDebugMarkerBeginEXT 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pMarkerInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdDebugMarkerBeginEXT 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pMarkerInfo);
                 }
                 vk->vkCmdDebugMarkerBeginEXT(unboxed_commandBuffer, pMarkerInfo);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdDebugMarkerBeginEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pMarkerInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdDebugMarkerBeginEXT(snapshotTraceBegin,
+                                                                  snapshotTraceBytes, &m_pool,
+                                                                  commandBuffer, pMarkerInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdDebugMarkerEndEXT:
-            {
+            case OP_vkCmdDebugMarkerEndEXT: {
                 android::base::beginTrace("vkCmdDebugMarkerEndEXT decode");
                 VkCommandBuffer commandBuffer;
                 // Begin non wrapped dispatchable handle unboxing for commandBuffer;
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdDebugMarkerEndEXT 0x%llx \n", ioStream, (unsigned long long)commandBuffer);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdDebugMarkerEndEXT 0x%llx \n", ioStream,
+                            (unsigned long long)commandBuffer);
                 }
                 vk->vkCmdDebugMarkerEndEXT(unboxed_commandBuffer);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdDebugMarkerEndEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdDebugMarkerEndEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdDebugMarkerInsertEXT:
-            {
+            case OP_vkCmdDebugMarkerInsertEXT: {
                 android::base::beginTrace("vkCmdDebugMarkerInsertEXT decode");
                 VkCommandBuffer commandBuffer;
                 const VkDebugMarkerMarkerInfoEXT* pMarkerInfo;
@@ -18223,30 +21092,37 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 vkReadStream->alloc((void**)&pMarkerInfo, sizeof(const VkDebugMarkerMarkerInfoEXT));
-                reservedunmarshal_VkDebugMarkerMarkerInfoEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugMarkerMarkerInfoEXT*)(pMarkerInfo), readStreamPtrPtr);
-                if (pMarkerInfo)
-                {
-                    transform_tohost_VkDebugMarkerMarkerInfoEXT(m_state, (VkDebugMarkerMarkerInfoEXT*)(pMarkerInfo));
+                reservedunmarshal_VkDebugMarkerMarkerInfoEXT(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkDebugMarkerMarkerInfoEXT*)(pMarkerInfo), readStreamPtrPtr);
+                if (pMarkerInfo) {
+                    transform_tohost_VkDebugMarkerMarkerInfoEXT(
+                        m_state, (VkDebugMarkerMarkerInfoEXT*)(pMarkerInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdDebugMarkerInsertEXT 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pMarkerInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdDebugMarkerInsertEXT 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pMarkerInfo);
                 }
                 vk->vkCmdDebugMarkerInsertEXT(unboxed_commandBuffer, pMarkerInfo);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdDebugMarkerInsertEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pMarkerInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdDebugMarkerInsertEXT(snapshotTraceBegin,
+                                                                   snapshotTraceBytes, &m_pool,
+                                                                   commandBuffer, pMarkerInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -18256,8 +21132,7 @@
 #ifdef VK_NV_dedicated_allocation
 #endif
 #ifdef VK_EXT_transform_feedback
-            case OP_vkCmdBindTransformFeedbackBuffersEXT:
-            {
+            case OP_vkCmdBindTransformFeedbackBuffersEXT: {
                 android::base::beginTrace("vkCmdBindTransformFeedbackBuffersEXT decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t firstBinding;
@@ -18269,7 +21144,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -18278,48 +21154,58 @@
                 memcpy((uint32_t*)&bindingCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 vkReadStream->alloc((void**)&pBuffers, ((bindingCount)) * sizeof(const VkBuffer));
-                if (((bindingCount)))
-                {
+                if (((bindingCount))) {
                     uint8_t* cgen_var_1_ptr = (uint8_t*)(*readStreamPtrPtr);
                     *readStreamPtrPtr += 8 * ((bindingCount));
-                    for (uint32_t k = 0; k < ((bindingCount)); ++k)
-                    {
-                        uint64_t tmpval; memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
+                    for (uint32_t k = 0; k < ((bindingCount)); ++k) {
+                        uint64_t tmpval;
+                        memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
                         *(((VkBuffer*)pBuffers) + k) = (VkBuffer)unbox_VkBuffer((VkBuffer)tmpval);
                     }
                 }
-                vkReadStream->alloc((void**)&pOffsets, ((bindingCount)) * sizeof(const VkDeviceSize));
-                memcpy((VkDeviceSize*)pOffsets, *readStreamPtrPtr, ((bindingCount)) * sizeof(const VkDeviceSize));
+                vkReadStream->alloc((void**)&pOffsets,
+                                    ((bindingCount)) * sizeof(const VkDeviceSize));
+                memcpy((VkDeviceSize*)pOffsets, *readStreamPtrPtr,
+                       ((bindingCount)) * sizeof(const VkDeviceSize));
                 *readStreamPtrPtr += ((bindingCount)) * sizeof(const VkDeviceSize);
                 // WARNING PTR CHECK
                 memcpy((VkDeviceSize**)&pSizes, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pSizes);
                 *readStreamPtrPtr += 8;
-                if (pSizes)
-                {
-                    vkReadStream->alloc((void**)&pSizes, ((bindingCount)) * sizeof(const VkDeviceSize));
-                    memcpy((VkDeviceSize*)pSizes, *readStreamPtrPtr, ((bindingCount)) * sizeof(const VkDeviceSize));
+                if (pSizes) {
+                    vkReadStream->alloc((void**)&pSizes,
+                                        ((bindingCount)) * sizeof(const VkDeviceSize));
+                    memcpy((VkDeviceSize*)pSizes, *readStreamPtrPtr,
+                           ((bindingCount)) * sizeof(const VkDeviceSize));
                     *readStreamPtrPtr += ((bindingCount)) * sizeof(const VkDeviceSize);
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdBindTransformFeedbackBuffersEXT 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)firstBinding, (unsigned long long)bindingCount, (unsigned long long)pBuffers, (unsigned long long)pOffsets, (unsigned long long)pSizes);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdBindTransformFeedbackBuffersEXT 0x%llx 0x%llx "
+                            "0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)firstBinding, (unsigned long long)bindingCount,
+                            (unsigned long long)pBuffers, (unsigned long long)pOffsets,
+                            (unsigned long long)pSizes);
                 }
-                vk->vkCmdBindTransformFeedbackBuffersEXT(unboxed_commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets, pSizes);
+                vk->vkCmdBindTransformFeedbackBuffersEXT(unboxed_commandBuffer, firstBinding,
+                                                         bindingCount, pBuffers, pOffsets, pSizes);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdBindTransformFeedbackBuffersEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets, pSizes);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdBindTransformFeedbackBuffersEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        firstBinding, bindingCount, pBuffers, pOffsets, pSizes);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdBeginTransformFeedbackEXT:
-            {
+            case OP_vkCmdBeginTransformFeedbackEXT: {
                 android::base::beginTrace("vkCmdBeginTransformFeedbackEXT decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t firstCounterBuffer;
@@ -18330,7 +21216,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -18342,17 +21229,17 @@
                 memcpy((VkBuffer**)&pCounterBuffers, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pCounterBuffers);
                 *readStreamPtrPtr += 8;
-                if (pCounterBuffers)
-                {
-                    vkReadStream->alloc((void**)&pCounterBuffers, ((counterBufferCount)) * sizeof(const VkBuffer));
-                    if (((counterBufferCount)))
-                    {
+                if (pCounterBuffers) {
+                    vkReadStream->alloc((void**)&pCounterBuffers,
+                                        ((counterBufferCount)) * sizeof(const VkBuffer));
+                    if (((counterBufferCount))) {
                         uint8_t* cgen_var_1_0_ptr = (uint8_t*)(*readStreamPtrPtr);
                         *readStreamPtrPtr += 8 * ((counterBufferCount));
-                        for (uint32_t k = 0; k < ((counterBufferCount)); ++k)
-                        {
-                            uint64_t tmpval; memcpy(&tmpval, cgen_var_1_0_ptr + k * 8, sizeof(uint64_t));
-                            *(((VkBuffer*)pCounterBuffers) + k) = (VkBuffer)unbox_VkBuffer((VkBuffer)tmpval);
+                        for (uint32_t k = 0; k < ((counterBufferCount)); ++k) {
+                            uint64_t tmpval;
+                            memcpy(&tmpval, cgen_var_1_0_ptr + k * 8, sizeof(uint64_t));
+                            *(((VkBuffer*)pCounterBuffers) + k) =
+                                (VkBuffer)unbox_VkBuffer((VkBuffer)tmpval);
                         }
                     }
                 }
@@ -18360,31 +21247,43 @@
                 memcpy((VkDeviceSize**)&pCounterBufferOffsets, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pCounterBufferOffsets);
                 *readStreamPtrPtr += 8;
-                if (pCounterBufferOffsets)
-                {
-                    vkReadStream->alloc((void**)&pCounterBufferOffsets, ((counterBufferCount)) * sizeof(const VkDeviceSize));
-                    memcpy((VkDeviceSize*)pCounterBufferOffsets, *readStreamPtrPtr, ((counterBufferCount)) * sizeof(const VkDeviceSize));
+                if (pCounterBufferOffsets) {
+                    vkReadStream->alloc((void**)&pCounterBufferOffsets,
+                                        ((counterBufferCount)) * sizeof(const VkDeviceSize));
+                    memcpy((VkDeviceSize*)pCounterBufferOffsets, *readStreamPtrPtr,
+                           ((counterBufferCount)) * sizeof(const VkDeviceSize));
                     *readStreamPtrPtr += ((counterBufferCount)) * sizeof(const VkDeviceSize);
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdBeginTransformFeedbackEXT 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)firstCounterBuffer, (unsigned long long)counterBufferCount, (unsigned long long)pCounterBuffers, (unsigned long long)pCounterBufferOffsets);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdBeginTransformFeedbackEXT 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)firstCounterBuffer,
+                            (unsigned long long)counterBufferCount,
+                            (unsigned long long)pCounterBuffers,
+                            (unsigned long long)pCounterBufferOffsets);
                 }
-                vk->vkCmdBeginTransformFeedbackEXT(unboxed_commandBuffer, firstCounterBuffer, counterBufferCount, pCounterBuffers, pCounterBufferOffsets);
+                vk->vkCmdBeginTransformFeedbackEXT(unboxed_commandBuffer, firstCounterBuffer,
+                                                   counterBufferCount, pCounterBuffers,
+                                                   pCounterBufferOffsets);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdBeginTransformFeedbackEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, firstCounterBuffer, counterBufferCount, pCounterBuffers, pCounterBufferOffsets);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdBeginTransformFeedbackEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        firstCounterBuffer, counterBufferCount, pCounterBuffers,
+                        pCounterBufferOffsets);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdEndTransformFeedbackEXT:
-            {
+            case OP_vkCmdEndTransformFeedbackEXT: {
                 android::base::beginTrace("vkCmdEndTransformFeedbackEXT decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t firstCounterBuffer;
@@ -18395,7 +21294,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -18407,17 +21307,17 @@
                 memcpy((VkBuffer**)&pCounterBuffers, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pCounterBuffers);
                 *readStreamPtrPtr += 8;
-                if (pCounterBuffers)
-                {
-                    vkReadStream->alloc((void**)&pCounterBuffers, ((counterBufferCount)) * sizeof(const VkBuffer));
-                    if (((counterBufferCount)))
-                    {
+                if (pCounterBuffers) {
+                    vkReadStream->alloc((void**)&pCounterBuffers,
+                                        ((counterBufferCount)) * sizeof(const VkBuffer));
+                    if (((counterBufferCount))) {
                         uint8_t* cgen_var_1_0_ptr = (uint8_t*)(*readStreamPtrPtr);
                         *readStreamPtrPtr += 8 * ((counterBufferCount));
-                        for (uint32_t k = 0; k < ((counterBufferCount)); ++k)
-                        {
-                            uint64_t tmpval; memcpy(&tmpval, cgen_var_1_0_ptr + k * 8, sizeof(uint64_t));
-                            *(((VkBuffer*)pCounterBuffers) + k) = (VkBuffer)unbox_VkBuffer((VkBuffer)tmpval);
+                        for (uint32_t k = 0; k < ((counterBufferCount)); ++k) {
+                            uint64_t tmpval;
+                            memcpy(&tmpval, cgen_var_1_0_ptr + k * 8, sizeof(uint64_t));
+                            *(((VkBuffer*)pCounterBuffers) + k) =
+                                (VkBuffer)unbox_VkBuffer((VkBuffer)tmpval);
                         }
                     }
                 }
@@ -18425,31 +21325,43 @@
                 memcpy((VkDeviceSize**)&pCounterBufferOffsets, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pCounterBufferOffsets);
                 *readStreamPtrPtr += 8;
-                if (pCounterBufferOffsets)
-                {
-                    vkReadStream->alloc((void**)&pCounterBufferOffsets, ((counterBufferCount)) * sizeof(const VkDeviceSize));
-                    memcpy((VkDeviceSize*)pCounterBufferOffsets, *readStreamPtrPtr, ((counterBufferCount)) * sizeof(const VkDeviceSize));
+                if (pCounterBufferOffsets) {
+                    vkReadStream->alloc((void**)&pCounterBufferOffsets,
+                                        ((counterBufferCount)) * sizeof(const VkDeviceSize));
+                    memcpy((VkDeviceSize*)pCounterBufferOffsets, *readStreamPtrPtr,
+                           ((counterBufferCount)) * sizeof(const VkDeviceSize));
                     *readStreamPtrPtr += ((counterBufferCount)) * sizeof(const VkDeviceSize);
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdEndTransformFeedbackEXT 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)firstCounterBuffer, (unsigned long long)counterBufferCount, (unsigned long long)pCounterBuffers, (unsigned long long)pCounterBufferOffsets);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdEndTransformFeedbackEXT 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)firstCounterBuffer,
+                            (unsigned long long)counterBufferCount,
+                            (unsigned long long)pCounterBuffers,
+                            (unsigned long long)pCounterBufferOffsets);
                 }
-                vk->vkCmdEndTransformFeedbackEXT(unboxed_commandBuffer, firstCounterBuffer, counterBufferCount, pCounterBuffers, pCounterBufferOffsets);
+                vk->vkCmdEndTransformFeedbackEXT(unboxed_commandBuffer, firstCounterBuffer,
+                                                 counterBufferCount, pCounterBuffers,
+                                                 pCounterBufferOffsets);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdEndTransformFeedbackEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, firstCounterBuffer, counterBufferCount, pCounterBuffers, pCounterBufferOffsets);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdEndTransformFeedbackEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        firstCounterBuffer, counterBufferCount, pCounterBuffers,
+                        pCounterBufferOffsets);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdBeginQueryIndexedEXT:
-            {
+            case OP_vkCmdBeginQueryIndexedEXT: {
                 android::base::beginTrace("vkCmdBeginQueryIndexedEXT decode");
                 VkCommandBuffer commandBuffer;
                 VkQueryPool queryPool;
@@ -18460,39 +21372,49 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkQueryPool*)&queryPool = (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_1));
+                *(VkQueryPool*)&queryPool =
+                    (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_1));
                 memcpy((uint32_t*)&query, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                memcpy((VkQueryControlFlags*)&flags, *readStreamPtrPtr, sizeof(VkQueryControlFlags));
+                memcpy((VkQueryControlFlags*)&flags, *readStreamPtrPtr,
+                       sizeof(VkQueryControlFlags));
                 *readStreamPtrPtr += sizeof(VkQueryControlFlags);
                 memcpy((uint32_t*)&index, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdBeginQueryIndexedEXT 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)queryPool, (unsigned long long)query, (unsigned long long)flags, (unsigned long long)index);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdBeginQueryIndexedEXT 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)queryPool, (unsigned long long)query,
+                            (unsigned long long)flags, (unsigned long long)index);
                 }
-                vk->vkCmdBeginQueryIndexedEXT(unboxed_commandBuffer, queryPool, query, flags, index);
+                vk->vkCmdBeginQueryIndexedEXT(unboxed_commandBuffer, queryPool, query, flags,
+                                              index);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdBeginQueryIndexedEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, queryPool, query, flags, index);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdBeginQueryIndexedEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, queryPool,
+                        query, flags, index);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdEndQueryIndexedEXT:
-            {
+            case OP_vkCmdEndQueryIndexedEXT: {
                 android::base::beginTrace("vkCmdEndQueryIndexedEXT decode");
                 VkCommandBuffer commandBuffer;
                 VkQueryPool queryPool;
@@ -18502,37 +21424,44 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkQueryPool*)&queryPool = (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_1));
+                *(VkQueryPool*)&queryPool =
+                    (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_1));
                 memcpy((uint32_t*)&query, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&index, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdEndQueryIndexedEXT 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)queryPool, (unsigned long long)query, (unsigned long long)index);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkCmdEndQueryIndexedEXT 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)commandBuffer, (unsigned long long)queryPool,
+                        (unsigned long long)query, (unsigned long long)index);
                 }
                 vk->vkCmdEndQueryIndexedEXT(unboxed_commandBuffer, queryPool, query, index);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdEndQueryIndexedEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, queryPool, query, index);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdEndQueryIndexedEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, queryPool,
+                        query, index);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdDrawIndirectByteCountEXT:
-            {
+            case OP_vkCmdDrawIndirectByteCountEXT: {
                 android::base::beginTrace("vkCmdDrawIndirectByteCountEXT decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t instanceCount;
@@ -18545,7 +21474,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -18557,33 +21487,45 @@
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkBuffer*)&counterBuffer = (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_1));
-                memcpy((VkDeviceSize*)&counterBufferOffset, *readStreamPtrPtr, sizeof(VkDeviceSize));
+                memcpy((VkDeviceSize*)&counterBufferOffset, *readStreamPtrPtr,
+                       sizeof(VkDeviceSize));
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
                 memcpy((uint32_t*)&counterOffset, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&vertexStride, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdDrawIndirectByteCountEXT 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)instanceCount, (unsigned long long)firstInstance, (unsigned long long)counterBuffer, (unsigned long long)counterBufferOffset, (unsigned long long)counterOffset, (unsigned long long)vertexStride);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdDrawIndirectByteCountEXT 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)instanceCount, (unsigned long long)firstInstance,
+                            (unsigned long long)counterBuffer,
+                            (unsigned long long)counterBufferOffset,
+                            (unsigned long long)counterOffset, (unsigned long long)vertexStride);
                 }
-                vk->vkCmdDrawIndirectByteCountEXT(unboxed_commandBuffer, instanceCount, firstInstance, counterBuffer, counterBufferOffset, counterOffset, vertexStride);
+                vk->vkCmdDrawIndirectByteCountEXT(unboxed_commandBuffer, instanceCount,
+                                                  firstInstance, counterBuffer, counterBufferOffset,
+                                                  counterOffset, vertexStride);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdDrawIndirectByteCountEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, instanceCount, firstInstance, counterBuffer, counterBufferOffset, counterOffset, vertexStride);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdDrawIndirectByteCountEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        instanceCount, firstInstance, counterBuffer, counterBufferOffset,
+                        counterOffset, vertexStride);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_NVX_binary_import
-            case OP_vkCreateCuModuleNVX:
-            {
+            case OP_vkCreateCuModuleNVX: {
                 android::base::beginTrace("vkCreateCuModuleNVX decode");
                 VkDevice device;
                 const VkCuModuleCreateInfoNVX* pCreateInfo;
@@ -18598,15 +21540,18 @@
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkCuModuleCreateInfoNVX));
-                reservedunmarshal_VkCuModuleCreateInfoNVX(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCuModuleCreateInfoNVX*)(pCreateInfo), readStreamPtrPtr);
+                reservedunmarshal_VkCuModuleCreateInfoNVX(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                          (VkCuModuleCreateInfoNVX*)(pCreateInfo),
+                                                          readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pModule;
                 vkReadStream->unsetHandleMapping();
@@ -18614,39 +21559,46 @@
                 memcpy((VkCuModuleNVX*)&(*pModule), (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&(*pModule));
                 *readStreamPtrPtr += 8;
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkCuModuleCreateInfoNVX(m_state, (VkCuModuleCreateInfoNVX*)(pCreateInfo));
+                if (pCreateInfo) {
+                    transform_tohost_VkCuModuleCreateInfoNVX(
+                        m_state, (VkCuModuleCreateInfoNVX*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateCuModuleNVX 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pModule);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateCuModuleNVX 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pModule);
                 }
                 VkResult vkCreateCuModuleNVX_VkResult_return = (VkResult)0;
-                vkCreateCuModuleNVX_VkResult_return = vk->vkCreateCuModuleNVX(unboxed_device, pCreateInfo, pAllocator, pModule);
-                if ((vkCreateCuModuleNVX_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateCuModuleNVX_VkResult_return =
+                    vk->vkCreateCuModuleNVX(unboxed_device, pCreateInfo, pAllocator, pModule);
+                if ((vkCreateCuModuleNVX_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3 = (uint64_t)(*pModule);
                 vkStream->putBe64(cgen_var_3);
                 vkStream->write(&vkCreateCuModuleNVX_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateCuModuleNVX(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateCuModuleNVX_VkResult_return, device, pCreateInfo, pAllocator, pModule);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateCuModuleNVX(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateCuModuleNVX_VkResult_return, device, pCreateInfo, pAllocator,
+                        pModule);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCreateCuFunctionNVX:
-            {
+            case OP_vkCreateCuFunctionNVX: {
                 android::base::beginTrace("vkCreateCuFunctionNVX decode");
                 VkDevice device;
                 const VkCuFunctionCreateInfoNVX* pCreateInfo;
@@ -18661,15 +21613,18 @@
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkCuFunctionCreateInfoNVX));
-                reservedunmarshal_VkCuFunctionCreateInfoNVX(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCuFunctionCreateInfoNVX*)(pCreateInfo), readStreamPtrPtr);
+                reservedunmarshal_VkCuFunctionCreateInfoNVX(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkCuFunctionCreateInfoNVX*)(pCreateInfo), readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pFunction;
                 vkReadStream->unsetHandleMapping();
@@ -18677,39 +21632,46 @@
                 memcpy((VkCuFunctionNVX*)&(*pFunction), (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&(*pFunction));
                 *readStreamPtrPtr += 8;
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkCuFunctionCreateInfoNVX(m_state, (VkCuFunctionCreateInfoNVX*)(pCreateInfo));
+                if (pCreateInfo) {
+                    transform_tohost_VkCuFunctionCreateInfoNVX(
+                        m_state, (VkCuFunctionCreateInfoNVX*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateCuFunctionNVX 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pFunction);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateCuFunctionNVX 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pFunction);
                 }
                 VkResult vkCreateCuFunctionNVX_VkResult_return = (VkResult)0;
-                vkCreateCuFunctionNVX_VkResult_return = vk->vkCreateCuFunctionNVX(unboxed_device, pCreateInfo, pAllocator, pFunction);
-                if ((vkCreateCuFunctionNVX_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateCuFunctionNVX_VkResult_return =
+                    vk->vkCreateCuFunctionNVX(unboxed_device, pCreateInfo, pAllocator, pFunction);
+                if ((vkCreateCuFunctionNVX_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3 = (uint64_t)(*pFunction);
                 vkStream->putBe64(cgen_var_3);
                 vkStream->write(&vkCreateCuFunctionNVX_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateCuFunctionNVX(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateCuFunctionNVX_VkResult_return, device, pCreateInfo, pAllocator, pFunction);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateCuFunctionNVX(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateCuFunctionNVX_VkResult_return, device, pCreateInfo, pAllocator,
+                        pFunction);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroyCuModuleNVX:
-            {
+            case OP_vkDestroyCuModuleNVX: {
                 android::base::beginTrace("vkDestroyCuModuleNVX decode");
                 VkDevice device;
                 VkCuModuleNVX module;
@@ -18729,34 +21691,38 @@
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroyCuModuleNVX 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)module, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkDestroyCuModuleNVX 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)module,
+                            (unsigned long long)pAllocator);
                 }
                 vk->vkDestroyCuModuleNVX(unboxed_device, module, pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroyCuModuleNVX(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, module, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroyCuModuleNVX(snapshotTraceBegin,
+                                                              snapshotTraceBytes, &m_pool, device,
+                                                              module, pAllocator);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroyCuFunctionNVX:
-            {
+            case OP_vkDestroyCuFunctionNVX: {
                 android::base::beginTrace("vkDestroyCuFunctionNVX decode");
                 VkDevice device;
                 VkCuFunctionNVX function;
@@ -18776,34 +21742,39 @@
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroyCuFunctionNVX 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)function, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkDestroyCuFunctionNVX 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)function,
+                            (unsigned long long)pAllocator);
                 }
                 vk->vkDestroyCuFunctionNVX(unboxed_device, function, pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroyCuFunctionNVX(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, function, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroyCuFunctionNVX(snapshotTraceBegin,
+                                                                snapshotTraceBytes, &m_pool, device,
+                                                                function, pAllocator);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdCuLaunchKernelNVX:
-            {
+            case OP_vkCmdCuLaunchKernelNVX: {
                 android::base::beginTrace("vkCmdCuLaunchKernelNVX decode");
                 VkCommandBuffer commandBuffer;
                 const VkCuLaunchInfoNVX* pLaunchInfo;
@@ -18811,37 +21782,42 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 vkReadStream->alloc((void**)&pLaunchInfo, sizeof(const VkCuLaunchInfoNVX));
-                reservedunmarshal_VkCuLaunchInfoNVX(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCuLaunchInfoNVX*)(pLaunchInfo), readStreamPtrPtr);
-                if (pLaunchInfo)
-                {
+                reservedunmarshal_VkCuLaunchInfoNVX(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                    (VkCuLaunchInfoNVX*)(pLaunchInfo),
+                                                    readStreamPtrPtr);
+                if (pLaunchInfo) {
                     transform_tohost_VkCuLaunchInfoNVX(m_state, (VkCuLaunchInfoNVX*)(pLaunchInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdCuLaunchKernelNVX 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pLaunchInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdCuLaunchKernelNVX 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pLaunchInfo);
                 }
                 vk->vkCmdCuLaunchKernelNVX(unboxed_commandBuffer, pLaunchInfo);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdCuLaunchKernelNVX(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pLaunchInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdCuLaunchKernelNVX(snapshotTraceBegin,
+                                                                snapshotTraceBytes, &m_pool,
+                                                                commandBuffer, pLaunchInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_NVX_image_view_handle
-            case OP_vkGetImageViewHandleNVX:
-            {
+            case OP_vkGetImageViewHandleNVX: {
                 android::base::beginTrace("vkGetImageViewHandleNVX decode");
                 VkDevice device;
                 const VkImageViewHandleInfoNVX* pInfo;
@@ -18854,33 +21830,38 @@
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
                 vkReadStream->alloc((void**)&pInfo, sizeof(const VkImageViewHandleInfoNVX));
-                reservedunmarshal_VkImageViewHandleInfoNVX(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageViewHandleInfoNVX*)(pInfo), readStreamPtrPtr);
-                if (pInfo)
-                {
-                    transform_tohost_VkImageViewHandleInfoNVX(m_state, (VkImageViewHandleInfoNVX*)(pInfo));
+                reservedunmarshal_VkImageViewHandleInfoNVX(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                           (VkImageViewHandleInfoNVX*)(pInfo),
+                                                           readStreamPtrPtr);
+                if (pInfo) {
+                    transform_tohost_VkImageViewHandleInfoNVX(m_state,
+                                                              (VkImageViewHandleInfoNVX*)(pInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetImageViewHandleNVX 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkGetImageViewHandleNVX 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pInfo);
                 }
                 uint32_t vkGetImageViewHandleNVX_uint32_t_return = (uint32_t)0;
-                vkGetImageViewHandleNVX_uint32_t_return = vk->vkGetImageViewHandleNVX(unboxed_device, pInfo);
+                vkGetImageViewHandleNVX_uint32_t_return =
+                    vk->vkGetImageViewHandleNVX(unboxed_device, pInfo);
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkGetImageViewHandleNVX_uint32_t_return, sizeof(uint32_t));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetImageViewHandleNVX(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetImageViewHandleNVX_uint32_t_return, device, pInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetImageViewHandleNVX(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetImageViewHandleNVX_uint32_t_return, device, pInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetImageViewAddressNVX:
-            {
+            case OP_vkGetImageViewAddressNVX: {
                 android::base::beginTrace("vkGetImageViewAddressNVX decode");
                 VkDevice device;
                 VkImageView imageView;
@@ -18896,45 +21877,56 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkImageView*)&imageView = (VkImageView)unbox_VkImageView((VkImageView)(*&cgen_var_1));
+                *(VkImageView*)&imageView =
+                    (VkImageView)unbox_VkImageView((VkImageView)(*&cgen_var_1));
                 // Begin manual dispatchable handle unboxing for pProperties;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pProperties, sizeof(VkImageViewAddressPropertiesNVX));
-                reservedunmarshal_VkImageViewAddressPropertiesNVX(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageViewAddressPropertiesNVX*)(pProperties), readStreamPtrPtr);
-                if (pProperties)
-                {
-                    transform_tohost_VkImageViewAddressPropertiesNVX(m_state, (VkImageViewAddressPropertiesNVX*)(pProperties));
+                reservedunmarshal_VkImageViewAddressPropertiesNVX(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkImageViewAddressPropertiesNVX*)(pProperties), readStreamPtrPtr);
+                if (pProperties) {
+                    transform_tohost_VkImageViewAddressPropertiesNVX(
+                        m_state, (VkImageViewAddressPropertiesNVX*)(pProperties));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetImageViewAddressNVX 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)imageView, (unsigned long long)pProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetImageViewAddressNVX 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)imageView,
+                            (unsigned long long)pProperties);
                 }
                 VkResult vkGetImageViewAddressNVX_VkResult_return = (VkResult)0;
-                vkGetImageViewAddressNVX_VkResult_return = vk->vkGetImageViewAddressNVX(unboxed_device, imageView, pProperties);
-                if ((vkGetImageViewAddressNVX_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetImageViewAddressNVX_VkResult_return =
+                    vk->vkGetImageViewAddressNVX(unboxed_device, imageView, pProperties);
+                if ((vkGetImageViewAddressNVX_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                if (pProperties)
-                {
-                    transform_fromhost_VkImageViewAddressPropertiesNVX(m_state, (VkImageViewAddressPropertiesNVX*)(pProperties));
+                if (pProperties) {
+                    transform_fromhost_VkImageViewAddressPropertiesNVX(
+                        m_state, (VkImageViewAddressPropertiesNVX*)(pProperties));
                 }
-                marshal_VkImageViewAddressPropertiesNVX(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageViewAddressPropertiesNVX*)(pProperties));
+                marshal_VkImageViewAddressPropertiesNVX(
+                    vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkImageViewAddressPropertiesNVX*)(pProperties));
                 vkStream->write(&vkGetImageViewAddressNVX_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetImageViewAddressNVX(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetImageViewAddressNVX_VkResult_return, device, imageView, pProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetImageViewAddressNVX(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetImageViewAddressNVX_VkResult_return, device, imageView, pProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_AMD_draw_indirect_count
-            case OP_vkCmdDrawIndirectCountAMD:
-            {
+            case OP_vkCmdDrawIndirectCountAMD: {
                 android::base::beginTrace("vkCmdDrawIndirectCountAMD decode");
                 VkCommandBuffer commandBuffer;
                 VkBuffer buffer;
@@ -18947,7 +21939,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -18967,25 +21960,33 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&stride, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdDrawIndirectCountAMD 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)buffer, (unsigned long long)offset, (unsigned long long)countBuffer, (unsigned long long)countBufferOffset, (unsigned long long)maxDrawCount, (unsigned long long)stride);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdDrawIndirectCountAMD 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer, (unsigned long long)buffer,
+                            (unsigned long long)offset, (unsigned long long)countBuffer,
+                            (unsigned long long)countBufferOffset, (unsigned long long)maxDrawCount,
+                            (unsigned long long)stride);
                 }
-                vk->vkCmdDrawIndirectCountAMD(unboxed_commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+                vk->vkCmdDrawIndirectCountAMD(unboxed_commandBuffer, buffer, offset, countBuffer,
+                                              countBufferOffset, maxDrawCount, stride);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdDrawIndirectCountAMD(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdDrawIndirectCountAMD(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, buffer,
+                        offset, countBuffer, countBufferOffset, maxDrawCount, stride);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdDrawIndexedIndirectCountAMD:
-            {
+            case OP_vkCmdDrawIndexedIndirectCountAMD: {
                 android::base::beginTrace("vkCmdDrawIndexedIndirectCountAMD decode");
                 VkCommandBuffer commandBuffer;
                 VkBuffer buffer;
@@ -18998,7 +21999,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -19018,20 +22020,30 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&stride, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdDrawIndexedIndirectCountAMD 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)buffer, (unsigned long long)offset, (unsigned long long)countBuffer, (unsigned long long)countBufferOffset, (unsigned long long)maxDrawCount, (unsigned long long)stride);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdDrawIndexedIndirectCountAMD 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer, (unsigned long long)buffer,
+                            (unsigned long long)offset, (unsigned long long)countBuffer,
+                            (unsigned long long)countBufferOffset, (unsigned long long)maxDrawCount,
+                            (unsigned long long)stride);
                 }
-                vk->vkCmdDrawIndexedIndirectCountAMD(unboxed_commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+                vk->vkCmdDrawIndexedIndirectCountAMD(unboxed_commandBuffer, buffer, offset,
+                                                     countBuffer, countBufferOffset, maxDrawCount,
+                                                     stride);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdDrawIndexedIndirectCountAMD(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdDrawIndexedIndirectCountAMD(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, buffer,
+                        offset, countBuffer, countBufferOffset, maxDrawCount, stride);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -19051,8 +22063,7 @@
 #ifdef VK_AMD_texture_gather_bias_lod
 #endif
 #ifdef VK_AMD_shader_info
-            case OP_vkGetShaderInfoAMD:
-            {
+            case OP_vkGetShaderInfoAMD: {
                 android::base::beginTrace("vkGetShaderInfoAMD decode");
                 VkDevice device;
                 VkPipeline pipeline;
@@ -19072,9 +22083,11 @@
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkPipeline*)&pipeline = (VkPipeline)unbox_VkPipeline((VkPipeline)(*&cgen_var_1));
-                memcpy((VkShaderStageFlagBits*)&shaderStage, *readStreamPtrPtr, sizeof(VkShaderStageFlagBits));
+                memcpy((VkShaderStageFlagBits*)&shaderStage, *readStreamPtrPtr,
+                       sizeof(VkShaderStageFlagBits));
                 *readStreamPtrPtr += sizeof(VkShaderStageFlagBits);
-                memcpy((VkShaderInfoTypeAMD*)&infoType, *readStreamPtrPtr, sizeof(VkShaderInfoTypeAMD));
+                memcpy((VkShaderInfoTypeAMD*)&infoType, *readStreamPtrPtr,
+                       sizeof(VkShaderInfoTypeAMD));
                 *readStreamPtrPtr += sizeof(VkShaderInfoTypeAMD);
                 // Begin manual dispatchable handle unboxing for pInfoSize;
                 vkReadStream->unsetHandleMapping();
@@ -19082,8 +22095,7 @@
                 memcpy((size_t**)&pInfoSize, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pInfoSize);
                 *readStreamPtrPtr += 8;
-                if (pInfoSize)
-                {
+                if (pInfoSize) {
                     vkReadStream->alloc((void**)&pInfoSize, sizeof(size_t));
                     memcpy((size_t*)&(*pInfoSize), (*readStreamPtrPtr), 8);
                     android::base::Stream::fromBe64((uint8_t*)&(*pInfoSize));
@@ -19095,45 +22107,52 @@
                 memcpy((void**)&pInfo, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pInfo);
                 *readStreamPtrPtr += 8;
-                if (pInfo)
-                {
+                if (pInfo) {
                     vkReadStream->alloc((void**)&pInfo, (*(pInfoSize)) * sizeof(uint8_t));
                     memcpy((void*)pInfo, *readStreamPtrPtr, (*(pInfoSize)) * sizeof(uint8_t));
                     *readStreamPtrPtr += (*(pInfoSize)) * sizeof(uint8_t);
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetShaderInfoAMD 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pipeline, (unsigned long long)shaderStage, (unsigned long long)infoType, (unsigned long long)pInfoSize, (unsigned long long)pInfo);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetShaderInfoAMD 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pipeline,
+                            (unsigned long long)shaderStage, (unsigned long long)infoType,
+                            (unsigned long long)pInfoSize, (unsigned long long)pInfo);
                 }
                 VkResult vkGetShaderInfoAMD_VkResult_return = (VkResult)0;
-                vkGetShaderInfoAMD_VkResult_return = vk->vkGetShaderInfoAMD(unboxed_device, pipeline, shaderStage, infoType, pInfoSize, pInfo);
-                if ((vkGetShaderInfoAMD_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetShaderInfoAMD_VkResult_return = vk->vkGetShaderInfoAMD(
+                    unboxed_device, pipeline, shaderStage, infoType, pInfoSize, pInfo);
+                if ((vkGetShaderInfoAMD_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pInfoSize;
                 vkStream->putBe64(cgen_var_4);
-                if (pInfoSize)
-                {
+                if (pInfoSize) {
                     uint64_t cgen_var_4_0 = (uint64_t)(*pInfoSize);
                     vkStream->putBe64(cgen_var_4_0);
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_5 = (uint64_t)(uintptr_t)pInfo;
                 vkStream->putBe64(cgen_var_5);
-                if (pInfo)
-                {
+                if (pInfo) {
                     vkStream->write((void*)pInfo, (*(pInfoSize)) * sizeof(uint8_t));
                 }
                 vkStream->write(&vkGetShaderInfoAMD_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetShaderInfoAMD(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetShaderInfoAMD_VkResult_return, device, pipeline, shaderStage, infoType, pInfoSize, pInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetShaderInfoAMD(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetShaderInfoAMD_VkResult_return, device, pipeline, shaderStage, infoType,
+                        pInfoSize, pInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -19141,8 +22160,7 @@
 #ifdef VK_AMD_shader_image_load_store_lod
 #endif
 #ifdef VK_GGP_stream_descriptor_surface
-            case OP_vkCreateStreamDescriptorSurfaceGGP:
-            {
+            case OP_vkCreateStreamDescriptorSurfaceGGP: {
                 android::base::beginTrace("vkCreateStreamDescriptorSurfaceGGP decode");
                 VkInstance instance;
                 const VkStreamDescriptorSurfaceCreateInfoGGP* pCreateInfo;
@@ -19156,16 +22174,20 @@
                 auto unboxed_instance = unbox_VkInstance(instance);
                 auto vk = dispatch_VkInstance(instance);
                 // End manual dispatchable handle unboxing for instance;
-                vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkStreamDescriptorSurfaceCreateInfoGGP));
-                reservedunmarshal_VkStreamDescriptorSurfaceCreateInfoGGP(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkStreamDescriptorSurfaceCreateInfoGGP*)(pCreateInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pCreateInfo,
+                                    sizeof(const VkStreamDescriptorSurfaceCreateInfoGGP));
+                reservedunmarshal_VkStreamDescriptorSurfaceCreateInfoGGP(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkStreamDescriptorSurfaceCreateInfoGGP*)(pCreateInfo), readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pSurface;
                 vkReadStream->unsetHandleMapping();
@@ -19173,36 +22195,48 @@
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkSurfaceKHR*)pSurface = (VkSurfaceKHR)(VkSurfaceKHR)((VkSurfaceKHR)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkStreamDescriptorSurfaceCreateInfoGGP(m_state, (VkStreamDescriptorSurfaceCreateInfoGGP*)(pCreateInfo));
+                *(VkSurfaceKHR*)pSurface =
+                    (VkSurfaceKHR)(VkSurfaceKHR)((VkSurfaceKHR)(*&cgen_var_2));
+                if (pCreateInfo) {
+                    transform_tohost_VkStreamDescriptorSurfaceCreateInfoGGP(
+                        m_state, (VkStreamDescriptorSurfaceCreateInfoGGP*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateStreamDescriptorSurfaceGGP 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)instance, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pSurface);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateStreamDescriptorSurfaceGGP 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)instance, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pSurface);
                 }
                 VkResult vkCreateStreamDescriptorSurfaceGGP_VkResult_return = (VkResult)0;
-                vkCreateStreamDescriptorSurfaceGGP_VkResult_return = vk->vkCreateStreamDescriptorSurfaceGGP(unboxed_instance, pCreateInfo, pAllocator, pSurface);
-                if ((vkCreateStreamDescriptorSurfaceGGP_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateStreamDescriptorSurfaceGGP_VkResult_return =
+                    vk->vkCreateStreamDescriptorSurfaceGGP(unboxed_instance, pCreateInfo,
+                                                           pAllocator, pSurface);
+                if ((vkCreateStreamDescriptorSurfaceGGP_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3;
                 vkStream->handleMapping()->mapHandles_VkSurfaceKHR_u64(pSurface, &cgen_var_3, 1);
                 vkStream->write((uint64_t*)&cgen_var_3, 8);
-                vkStream->write(&vkCreateStreamDescriptorSurfaceGGP_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkCreateStreamDescriptorSurfaceGGP_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateStreamDescriptorSurfaceGGP(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateStreamDescriptorSurfaceGGP_VkResult_return, instance, pCreateInfo, pAllocator, pSurface);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateStreamDescriptorSurfaceGGP(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateStreamDescriptorSurfaceGGP_VkResult_return, instance, pCreateInfo,
+                        pAllocator, pSurface);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -19212,9 +22246,9 @@
 #ifdef VK_IMG_format_pvrtc
 #endif
 #ifdef VK_NV_external_memory_capabilities
-            case OP_vkGetPhysicalDeviceExternalImageFormatPropertiesNV:
-            {
-                android::base::beginTrace("vkGetPhysicalDeviceExternalImageFormatPropertiesNV decode");
+            case OP_vkGetPhysicalDeviceExternalImageFormatPropertiesNV: {
+                android::base::beginTrace(
+                    "vkGetPhysicalDeviceExternalImageFormatPropertiesNV decode");
                 VkPhysicalDevice physicalDevice;
                 VkFormat format;
                 VkImageType type;
@@ -19227,7 +22261,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
@@ -19241,39 +22276,66 @@
                 *readStreamPtrPtr += sizeof(VkImageUsageFlags);
                 memcpy((VkImageCreateFlags*)&flags, *readStreamPtrPtr, sizeof(VkImageCreateFlags));
                 *readStreamPtrPtr += sizeof(VkImageCreateFlags);
-                memcpy((VkExternalMemoryHandleTypeFlagsNV*)&externalHandleType, *readStreamPtrPtr, sizeof(VkExternalMemoryHandleTypeFlagsNV));
+                memcpy((VkExternalMemoryHandleTypeFlagsNV*)&externalHandleType, *readStreamPtrPtr,
+                       sizeof(VkExternalMemoryHandleTypeFlagsNV));
                 *readStreamPtrPtr += sizeof(VkExternalMemoryHandleTypeFlagsNV);
                 // Begin manual dispatchable handle unboxing for pExternalImageFormatProperties;
                 vkReadStream->unsetHandleMapping();
-                vkReadStream->alloc((void**)&pExternalImageFormatProperties, sizeof(VkExternalImageFormatPropertiesNV));
-                reservedunmarshal_VkExternalImageFormatPropertiesNV(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExternalImageFormatPropertiesNV*)(pExternalImageFormatProperties), readStreamPtrPtr);
-                if (pExternalImageFormatProperties)
-                {
-                    transform_tohost_VkExternalImageFormatPropertiesNV(m_state, (VkExternalImageFormatPropertiesNV*)(pExternalImageFormatProperties));
+                vkReadStream->alloc((void**)&pExternalImageFormatProperties,
+                                    sizeof(VkExternalImageFormatPropertiesNV));
+                reservedunmarshal_VkExternalImageFormatPropertiesNV(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkExternalImageFormatPropertiesNV*)(pExternalImageFormatProperties),
+                    readStreamPtrPtr);
+                if (pExternalImageFormatProperties) {
+                    transform_tohost_VkExternalImageFormatPropertiesNV(
+                        m_state,
+                        (VkExternalImageFormatPropertiesNV*)(pExternalImageFormatProperties));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceExternalImageFormatPropertiesNV 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)format, (unsigned long long)type, (unsigned long long)tiling, (unsigned long long)usage, (unsigned long long)flags, (unsigned long long)externalHandleType, (unsigned long long)pExternalImageFormatProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceExternalImageFormatPropertiesNV "
+                            "0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)format, (unsigned long long)type,
+                            (unsigned long long)tiling, (unsigned long long)usage,
+                            (unsigned long long)flags, (unsigned long long)externalHandleType,
+                            (unsigned long long)pExternalImageFormatProperties);
                 }
-                VkResult vkGetPhysicalDeviceExternalImageFormatPropertiesNV_VkResult_return = (VkResult)0;
-                vkGetPhysicalDeviceExternalImageFormatPropertiesNV_VkResult_return = vk->vkGetPhysicalDeviceExternalImageFormatPropertiesNV(unboxed_physicalDevice, format, type, tiling, usage, flags, externalHandleType, pExternalImageFormatProperties);
-                if ((vkGetPhysicalDeviceExternalImageFormatPropertiesNV_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                VkResult vkGetPhysicalDeviceExternalImageFormatPropertiesNV_VkResult_return =
+                    (VkResult)0;
+                vkGetPhysicalDeviceExternalImageFormatPropertiesNV_VkResult_return =
+                    vk->vkGetPhysicalDeviceExternalImageFormatPropertiesNV(
+                        unboxed_physicalDevice, format, type, tiling, usage, flags,
+                        externalHandleType, pExternalImageFormatProperties);
+                if ((vkGetPhysicalDeviceExternalImageFormatPropertiesNV_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                if (pExternalImageFormatProperties)
-                {
-                    transform_fromhost_VkExternalImageFormatPropertiesNV(m_state, (VkExternalImageFormatPropertiesNV*)(pExternalImageFormatProperties));
+                if (pExternalImageFormatProperties) {
+                    transform_fromhost_VkExternalImageFormatPropertiesNV(
+                        m_state,
+                        (VkExternalImageFormatPropertiesNV*)(pExternalImageFormatProperties));
                 }
-                marshal_VkExternalImageFormatPropertiesNV(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExternalImageFormatPropertiesNV*)(pExternalImageFormatProperties));
-                vkStream->write(&vkGetPhysicalDeviceExternalImageFormatPropertiesNV_VkResult_return, sizeof(VkResult));
+                marshal_VkExternalImageFormatPropertiesNV(
+                    vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkExternalImageFormatPropertiesNV*)(pExternalImageFormatProperties));
+                vkStream->write(&vkGetPhysicalDeviceExternalImageFormatPropertiesNV_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceExternalImageFormatPropertiesNV(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetPhysicalDeviceExternalImageFormatPropertiesNV_VkResult_return, physicalDevice, format, type, tiling, usage, flags, externalHandleType, pExternalImageFormatProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceExternalImageFormatPropertiesNV(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetPhysicalDeviceExternalImageFormatPropertiesNV_VkResult_return,
+                        physicalDevice, format, type, tiling, usage, flags, externalHandleType,
+                        pExternalImageFormatProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -19281,8 +22343,7 @@
 #ifdef VK_NV_external_memory
 #endif
 #ifdef VK_NV_external_memory_win32
-            case OP_vkGetMemoryWin32HandleNV:
-            {
+            case OP_vkGetMemoryWin32HandleNV: {
                 android::base::beginTrace("vkGetMemoryWin32HandleNV decode");
                 VkDevice device;
                 VkDeviceMemory memory;
@@ -19299,33 +22360,44 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDeviceMemory*)&memory = (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_1));
-                memcpy((VkExternalMemoryHandleTypeFlagsNV*)&handleType, *readStreamPtrPtr, sizeof(VkExternalMemoryHandleTypeFlagsNV));
+                *(VkDeviceMemory*)&memory =
+                    (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_1));
+                memcpy((VkExternalMemoryHandleTypeFlagsNV*)&handleType, *readStreamPtrPtr,
+                       sizeof(VkExternalMemoryHandleTypeFlagsNV));
                 *readStreamPtrPtr += sizeof(VkExternalMemoryHandleTypeFlagsNV);
                 // Begin manual dispatchable handle unboxing for pHandle;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pHandle, sizeof(HANDLE));
                 memcpy((HANDLE*)pHandle, *readStreamPtrPtr, sizeof(HANDLE));
                 *readStreamPtrPtr += sizeof(HANDLE);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetMemoryWin32HandleNV 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)memory, (unsigned long long)handleType, (unsigned long long)pHandle);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkGetMemoryWin32HandleNV 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device, (unsigned long long)memory,
+                        (unsigned long long)handleType, (unsigned long long)pHandle);
                 }
                 VkResult vkGetMemoryWin32HandleNV_VkResult_return = (VkResult)0;
-                vkGetMemoryWin32HandleNV_VkResult_return = vk->vkGetMemoryWin32HandleNV(unboxed_device, memory, handleType, pHandle);
-                if ((vkGetMemoryWin32HandleNV_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetMemoryWin32HandleNV_VkResult_return =
+                    vk->vkGetMemoryWin32HandleNV(unboxed_device, memory, handleType, pHandle);
+                if ((vkGetMemoryWin32HandleNV_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write((HANDLE*)pHandle, sizeof(HANDLE));
                 vkStream->write(&vkGetMemoryWin32HandleNV_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetMemoryWin32HandleNV(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetMemoryWin32HandleNV_VkResult_return, device, memory, handleType, pHandle);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetMemoryWin32HandleNV(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetMemoryWin32HandleNV_VkResult_return, device, memory, handleType,
+                        pHandle);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -19335,8 +22407,7 @@
 #ifdef VK_EXT_validation_flags
 #endif
 #ifdef VK_NN_vi_surface
-            case OP_vkCreateViSurfaceNN:
-            {
+            case OP_vkCreateViSurfaceNN: {
                 android::base::beginTrace("vkCreateViSurfaceNN decode");
                 VkInstance instance;
                 const VkViSurfaceCreateInfoNN* pCreateInfo;
@@ -19351,15 +22422,18 @@
                 auto vk = dispatch_VkInstance(instance);
                 // End manual dispatchable handle unboxing for instance;
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkViSurfaceCreateInfoNN));
-                reservedunmarshal_VkViSurfaceCreateInfoNN(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkViSurfaceCreateInfoNN*)(pCreateInfo), readStreamPtrPtr);
+                reservedunmarshal_VkViSurfaceCreateInfoNN(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                          (VkViSurfaceCreateInfoNN*)(pCreateInfo),
+                                                          readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pSurface;
                 vkReadStream->unsetHandleMapping();
@@ -19367,36 +22441,45 @@
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkSurfaceKHR*)pSurface = (VkSurfaceKHR)(VkSurfaceKHR)((VkSurfaceKHR)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkViSurfaceCreateInfoNN(m_state, (VkViSurfaceCreateInfoNN*)(pCreateInfo));
+                *(VkSurfaceKHR*)pSurface =
+                    (VkSurfaceKHR)(VkSurfaceKHR)((VkSurfaceKHR)(*&cgen_var_2));
+                if (pCreateInfo) {
+                    transform_tohost_VkViSurfaceCreateInfoNN(
+                        m_state, (VkViSurfaceCreateInfoNN*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateViSurfaceNN 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)instance, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pSurface);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateViSurfaceNN 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)instance, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pSurface);
                 }
                 VkResult vkCreateViSurfaceNN_VkResult_return = (VkResult)0;
-                vkCreateViSurfaceNN_VkResult_return = vk->vkCreateViSurfaceNN(unboxed_instance, pCreateInfo, pAllocator, pSurface);
-                if ((vkCreateViSurfaceNN_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateViSurfaceNN_VkResult_return =
+                    vk->vkCreateViSurfaceNN(unboxed_instance, pCreateInfo, pAllocator, pSurface);
+                if ((vkCreateViSurfaceNN_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3;
                 vkStream->handleMapping()->mapHandles_VkSurfaceKHR_u64(pSurface, &cgen_var_3, 1);
                 vkStream->write((uint64_t*)&cgen_var_3, 8);
                 vkStream->write(&vkCreateViSurfaceNN_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateViSurfaceNN(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateViSurfaceNN_VkResult_return, instance, pCreateInfo, pAllocator, pSurface);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateViSurfaceNN(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateViSurfaceNN_VkResult_return, instance, pCreateInfo, pAllocator,
+                        pSurface);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -19410,8 +22493,7 @@
 #ifdef VK_EXT_astc_decode_mode
 #endif
 #ifdef VK_EXT_conditional_rendering
-            case OP_vkCmdBeginConditionalRenderingEXT:
-            {
+            case OP_vkCmdBeginConditionalRenderingEXT: {
                 android::base::beginTrace("vkCmdBeginConditionalRenderingEXT decode");
                 VkCommandBuffer commandBuffer;
                 const VkConditionalRenderingBeginInfoEXT* pConditionalRenderingBegin;
@@ -19419,66 +22501,78 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
-                vkReadStream->alloc((void**)&pConditionalRenderingBegin, sizeof(const VkConditionalRenderingBeginInfoEXT));
-                reservedunmarshal_VkConditionalRenderingBeginInfoEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkConditionalRenderingBeginInfoEXT*)(pConditionalRenderingBegin), readStreamPtrPtr);
-                if (pConditionalRenderingBegin)
-                {
-                    transform_tohost_VkConditionalRenderingBeginInfoEXT(m_state, (VkConditionalRenderingBeginInfoEXT*)(pConditionalRenderingBegin));
+                vkReadStream->alloc((void**)&pConditionalRenderingBegin,
+                                    sizeof(const VkConditionalRenderingBeginInfoEXT));
+                reservedunmarshal_VkConditionalRenderingBeginInfoEXT(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkConditionalRenderingBeginInfoEXT*)(pConditionalRenderingBegin),
+                    readStreamPtrPtr);
+                if (pConditionalRenderingBegin) {
+                    transform_tohost_VkConditionalRenderingBeginInfoEXT(
+                        m_state, (VkConditionalRenderingBeginInfoEXT*)(pConditionalRenderingBegin));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdBeginConditionalRenderingEXT 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pConditionalRenderingBegin);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdBeginConditionalRenderingEXT 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pConditionalRenderingBegin);
                 }
-                vk->vkCmdBeginConditionalRenderingEXT(unboxed_commandBuffer, pConditionalRenderingBegin);
+                vk->vkCmdBeginConditionalRenderingEXT(unboxed_commandBuffer,
+                                                      pConditionalRenderingBegin);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdBeginConditionalRenderingEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pConditionalRenderingBegin);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdBeginConditionalRenderingEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        pConditionalRenderingBegin);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdEndConditionalRenderingEXT:
-            {
+            case OP_vkCmdEndConditionalRenderingEXT: {
                 android::base::beginTrace("vkCmdEndConditionalRenderingEXT decode");
                 VkCommandBuffer commandBuffer;
                 // Begin non wrapped dispatchable handle unboxing for commandBuffer;
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdEndConditionalRenderingEXT 0x%llx \n", ioStream, (unsigned long long)commandBuffer);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdEndConditionalRenderingEXT 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer);
                 }
                 vk->vkCmdEndConditionalRenderingEXT(unboxed_commandBuffer);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdEndConditionalRenderingEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdEndConditionalRenderingEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_NV_clip_space_w_scaling
-            case OP_vkCmdSetViewportWScalingNV:
-            {
+            case OP_vkCmdSetViewportWScalingNV: {
                 android::base::beginTrace("vkCmdSetViewportWScalingNV decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t firstViewport;
@@ -19488,7 +22582,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -19496,39 +22591,47 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&viewportCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pViewportWScalings, ((viewportCount)) * sizeof(const VkViewportWScalingNV));
-                for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i)
-                {
-                    reservedunmarshal_VkViewportWScalingNV(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkViewportWScalingNV*)(pViewportWScalings + i), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pViewportWScalings,
+                                    ((viewportCount)) * sizeof(const VkViewportWScalingNV));
+                for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i) {
+                    reservedunmarshal_VkViewportWScalingNV(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkViewportWScalingNV*)(pViewportWScalings + i), readStreamPtrPtr);
                 }
-                if (pViewportWScalings)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i)
-                    {
-                        transform_tohost_VkViewportWScalingNV(m_state, (VkViewportWScalingNV*)(pViewportWScalings + i));
+                if (pViewportWScalings) {
+                    for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i) {
+                        transform_tohost_VkViewportWScalingNV(
+                            m_state, (VkViewportWScalingNV*)(pViewportWScalings + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetViewportWScalingNV 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)firstViewport, (unsigned long long)viewportCount, (unsigned long long)pViewportWScalings);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkCmdSetViewportWScalingNV 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)commandBuffer,
+                        (unsigned long long)firstViewport, (unsigned long long)viewportCount,
+                        (unsigned long long)pViewportWScalings);
                 }
-                vk->vkCmdSetViewportWScalingNV(unboxed_commandBuffer, firstViewport, viewportCount, pViewportWScalings);
+                vk->vkCmdSetViewportWScalingNV(unboxed_commandBuffer, firstViewport, viewportCount,
+                                               pViewportWScalings);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetViewportWScalingNV(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, firstViewport, viewportCount, pViewportWScalings);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetViewportWScalingNV(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        firstViewport, viewportCount, pViewportWScalings);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_EXT_direct_mode_display
-            case OP_vkReleaseDisplayEXT:
-            {
+            case OP_vkReleaseDisplayEXT: {
                 android::base::beginTrace("vkReleaseDisplayEXT decode");
                 VkPhysicalDevice physicalDevice;
                 VkDisplayKHR display;
@@ -19536,39 +22639,46 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDisplayKHR*)&display = (VkDisplayKHR)unbox_VkDisplayKHR((VkDisplayKHR)(*&cgen_var_1));
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkReleaseDisplayEXT 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)display);
+                *(VkDisplayKHR*)&display =
+                    (VkDisplayKHR)unbox_VkDisplayKHR((VkDisplayKHR)(*&cgen_var_1));
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkReleaseDisplayEXT 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)display);
                 }
                 VkResult vkReleaseDisplayEXT_VkResult_return = (VkResult)0;
-                vkReleaseDisplayEXT_VkResult_return = vk->vkReleaseDisplayEXT(unboxed_physicalDevice, display);
-                if ((vkReleaseDisplayEXT_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkReleaseDisplayEXT_VkResult_return =
+                    vk->vkReleaseDisplayEXT(unboxed_physicalDevice, display);
+                if ((vkReleaseDisplayEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkReleaseDisplayEXT_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkReleaseDisplayEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkReleaseDisplayEXT_VkResult_return, physicalDevice, display);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkReleaseDisplayEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkReleaseDisplayEXT_VkResult_return, physicalDevice, display);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_EXT_acquire_xlib_display
-            case OP_vkAcquireXlibDisplayEXT:
-            {
+            case OP_vkAcquireXlibDisplayEXT: {
                 android::base::beginTrace("vkAcquireXlibDisplayEXT decode");
                 VkPhysicalDevice physicalDevice;
                 Display* dpy;
@@ -19577,7 +22687,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
@@ -19589,31 +22700,38 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDisplayKHR*)&display = (VkDisplayKHR)unbox_VkDisplayKHR((VkDisplayKHR)(*&cgen_var_1));
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkAcquireXlibDisplayEXT 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)dpy, (unsigned long long)display);
+                *(VkDisplayKHR*)&display =
+                    (VkDisplayKHR)unbox_VkDisplayKHR((VkDisplayKHR)(*&cgen_var_1));
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkAcquireXlibDisplayEXT 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice, (unsigned long long)dpy,
+                            (unsigned long long)display);
                 }
                 VkResult vkAcquireXlibDisplayEXT_VkResult_return = (VkResult)0;
-                vkAcquireXlibDisplayEXT_VkResult_return = vk->vkAcquireXlibDisplayEXT(unboxed_physicalDevice, dpy, display);
-                if ((vkAcquireXlibDisplayEXT_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkAcquireXlibDisplayEXT_VkResult_return =
+                    vk->vkAcquireXlibDisplayEXT(unboxed_physicalDevice, dpy, display);
+                if ((vkAcquireXlibDisplayEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write((Display*)dpy, sizeof(Display));
                 vkStream->write(&vkAcquireXlibDisplayEXT_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkAcquireXlibDisplayEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkAcquireXlibDisplayEXT_VkResult_return, physicalDevice, dpy, display);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkAcquireXlibDisplayEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkAcquireXlibDisplayEXT_VkResult_return, physicalDevice, dpy, display);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetRandROutputDisplayEXT:
-            {
+            case OP_vkGetRandROutputDisplayEXT: {
                 android::base::beginTrace("vkGetRandROutputDisplayEXT decode");
                 VkPhysicalDevice physicalDevice;
                 Display* dpy;
@@ -19623,7 +22741,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
@@ -19640,14 +22759,20 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkDisplayKHR*)pDisplay = (VkDisplayKHR)(VkDisplayKHR)((VkDisplayKHR)(*&cgen_var_1));
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetRandROutputDisplayEXT 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)dpy, (unsigned long long)rrOutput, (unsigned long long)pDisplay);
+                *(VkDisplayKHR*)pDisplay =
+                    (VkDisplayKHR)(VkDisplayKHR)((VkDisplayKHR)(*&cgen_var_1));
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkGetRandROutputDisplayEXT 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)physicalDevice, (unsigned long long)dpy,
+                        (unsigned long long)rrOutput, (unsigned long long)pDisplay);
                 }
                 VkResult vkGetRandROutputDisplayEXT_VkResult_return = (VkResult)0;
-                vkGetRandROutputDisplayEXT_VkResult_return = vk->vkGetRandROutputDisplayEXT(unboxed_physicalDevice, dpy, rrOutput, pDisplay);
-                if ((vkGetRandROutputDisplayEXT_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetRandROutputDisplayEXT_VkResult_return =
+                    vk->vkGetRandROutputDisplayEXT(unboxed_physicalDevice, dpy, rrOutput, pDisplay);
+                if ((vkGetRandROutputDisplayEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write((Display*)dpy, sizeof(Display));
                 uint64_t cgen_var_2;
@@ -19655,21 +22780,24 @@
                 vkStream->write((uint64_t*)&cgen_var_2, 8);
                 vkStream->write(&vkGetRandROutputDisplayEXT_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetRandROutputDisplayEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetRandROutputDisplayEXT_VkResult_return, physicalDevice, dpy, rrOutput, pDisplay);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetRandROutputDisplayEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetRandROutputDisplayEXT_VkResult_return, physicalDevice, dpy, rrOutput,
+                        pDisplay);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_EXT_display_surface_counter
-            case OP_vkGetPhysicalDeviceSurfaceCapabilities2EXT:
-            {
+            case OP_vkGetPhysicalDeviceSurfaceCapabilities2EXT: {
                 android::base::beginTrace("vkGetPhysicalDeviceSurfaceCapabilities2EXT decode");
                 VkPhysicalDevice physicalDevice;
                 VkSurfaceKHR surface;
@@ -19678,52 +22806,70 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkSurfaceKHR*)&surface = (VkSurfaceKHR)unbox_VkSurfaceKHR((VkSurfaceKHR)(*&cgen_var_1));
+                *(VkSurfaceKHR*)&surface =
+                    (VkSurfaceKHR)unbox_VkSurfaceKHR((VkSurfaceKHR)(*&cgen_var_1));
                 // Begin manual dispatchable handle unboxing for pSurfaceCapabilities;
                 vkReadStream->unsetHandleMapping();
-                vkReadStream->alloc((void**)&pSurfaceCapabilities, sizeof(VkSurfaceCapabilities2EXT));
-                reservedunmarshal_VkSurfaceCapabilities2EXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSurfaceCapabilities2EXT*)(pSurfaceCapabilities), readStreamPtrPtr);
-                if (pSurfaceCapabilities)
-                {
-                    transform_tohost_VkSurfaceCapabilities2EXT(m_state, (VkSurfaceCapabilities2EXT*)(pSurfaceCapabilities));
+                vkReadStream->alloc((void**)&pSurfaceCapabilities,
+                                    sizeof(VkSurfaceCapabilities2EXT));
+                reservedunmarshal_VkSurfaceCapabilities2EXT(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkSurfaceCapabilities2EXT*)(pSurfaceCapabilities), readStreamPtrPtr);
+                if (pSurfaceCapabilities) {
+                    transform_tohost_VkSurfaceCapabilities2EXT(
+                        m_state, (VkSurfaceCapabilities2EXT*)(pSurfaceCapabilities));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceSurfaceCapabilities2EXT 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)surface, (unsigned long long)pSurfaceCapabilities);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceSurfaceCapabilities2EXT 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)surface, (unsigned long long)pSurfaceCapabilities);
                 }
                 VkResult vkGetPhysicalDeviceSurfaceCapabilities2EXT_VkResult_return = (VkResult)0;
-                vkGetPhysicalDeviceSurfaceCapabilities2EXT_VkResult_return = vk->vkGetPhysicalDeviceSurfaceCapabilities2EXT(unboxed_physicalDevice, surface, pSurfaceCapabilities);
-                if ((vkGetPhysicalDeviceSurfaceCapabilities2EXT_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetPhysicalDeviceSurfaceCapabilities2EXT_VkResult_return =
+                    vk->vkGetPhysicalDeviceSurfaceCapabilities2EXT(unboxed_physicalDevice, surface,
+                                                                   pSurfaceCapabilities);
+                if ((vkGetPhysicalDeviceSurfaceCapabilities2EXT_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                if (pSurfaceCapabilities)
-                {
-                    transform_fromhost_VkSurfaceCapabilities2EXT(m_state, (VkSurfaceCapabilities2EXT*)(pSurfaceCapabilities));
+                if (pSurfaceCapabilities) {
+                    transform_fromhost_VkSurfaceCapabilities2EXT(
+                        m_state, (VkSurfaceCapabilities2EXT*)(pSurfaceCapabilities));
                 }
-                marshal_VkSurfaceCapabilities2EXT(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSurfaceCapabilities2EXT*)(pSurfaceCapabilities));
-                vkStream->write(&vkGetPhysicalDeviceSurfaceCapabilities2EXT_VkResult_return, sizeof(VkResult));
+                marshal_VkSurfaceCapabilities2EXT(
+                    vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkSurfaceCapabilities2EXT*)(pSurfaceCapabilities));
+                vkStream->write(&vkGetPhysicalDeviceSurfaceCapabilities2EXT_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceSurfaceCapabilities2EXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetPhysicalDeviceSurfaceCapabilities2EXT_VkResult_return, physicalDevice, surface, pSurfaceCapabilities);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceSurfaceCapabilities2EXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetPhysicalDeviceSurfaceCapabilities2EXT_VkResult_return, physicalDevice,
+                        surface, pSurfaceCapabilities);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_EXT_display_control
-            case OP_vkDisplayPowerControlEXT:
-            {
+            case OP_vkDisplayPowerControlEXT: {
                 android::base::beginTrace("vkDisplayPowerControlEXT decode");
                 VkDevice device;
                 VkDisplayKHR display;
@@ -19739,36 +22885,47 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDisplayKHR*)&display = (VkDisplayKHR)unbox_VkDisplayKHR((VkDisplayKHR)(*&cgen_var_1));
-                vkReadStream->alloc((void**)&pDisplayPowerInfo, sizeof(const VkDisplayPowerInfoEXT));
-                reservedunmarshal_VkDisplayPowerInfoEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayPowerInfoEXT*)(pDisplayPowerInfo), readStreamPtrPtr);
-                if (pDisplayPowerInfo)
-                {
-                    transform_tohost_VkDisplayPowerInfoEXT(m_state, (VkDisplayPowerInfoEXT*)(pDisplayPowerInfo));
+                *(VkDisplayKHR*)&display =
+                    (VkDisplayKHR)unbox_VkDisplayKHR((VkDisplayKHR)(*&cgen_var_1));
+                vkReadStream->alloc((void**)&pDisplayPowerInfo,
+                                    sizeof(const VkDisplayPowerInfoEXT));
+                reservedunmarshal_VkDisplayPowerInfoEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                        (VkDisplayPowerInfoEXT*)(pDisplayPowerInfo),
+                                                        readStreamPtrPtr);
+                if (pDisplayPowerInfo) {
+                    transform_tohost_VkDisplayPowerInfoEXT(
+                        m_state, (VkDisplayPowerInfoEXT*)(pDisplayPowerInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDisplayPowerControlEXT 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)display, (unsigned long long)pDisplayPowerInfo);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkDisplayPowerControlEXT 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)display,
+                            (unsigned long long)pDisplayPowerInfo);
                 }
                 VkResult vkDisplayPowerControlEXT_VkResult_return = (VkResult)0;
-                vkDisplayPowerControlEXT_VkResult_return = vk->vkDisplayPowerControlEXT(unboxed_device, display, pDisplayPowerInfo);
-                if ((vkDisplayPowerControlEXT_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkDisplayPowerControlEXT_VkResult_return =
+                    vk->vkDisplayPowerControlEXT(unboxed_device, display, pDisplayPowerInfo);
+                if ((vkDisplayPowerControlEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkDisplayPowerControlEXT_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDisplayPowerControlEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkDisplayPowerControlEXT_VkResult_return, device, display, pDisplayPowerInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDisplayPowerControlEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkDisplayPowerControlEXT_VkResult_return, device, display,
+                        pDisplayPowerInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkRegisterDeviceEventEXT:
-            {
+            case OP_vkRegisterDeviceEventEXT: {
                 android::base::beginTrace("vkRegisterDeviceEventEXT decode");
                 VkDevice device;
                 const VkDeviceEventInfoEXT* pDeviceEventInfo;
@@ -19783,15 +22940,18 @@
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
                 vkReadStream->alloc((void**)&pDeviceEventInfo, sizeof(const VkDeviceEventInfoEXT));
-                reservedunmarshal_VkDeviceEventInfoEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDeviceEventInfoEXT*)(pDeviceEventInfo), readStreamPtrPtr);
+                reservedunmarshal_VkDeviceEventInfoEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                       (VkDeviceEventInfoEXT*)(pDeviceEventInfo),
+                                                       readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pFence;
                 vkReadStream->unsetHandleMapping();
@@ -19800,40 +22960,48 @@
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
                 *(VkFence*)pFence = (VkFence)(VkFence)((VkFence)(*&cgen_var_2));
-                if (pDeviceEventInfo)
-                {
-                    transform_tohost_VkDeviceEventInfoEXT(m_state, (VkDeviceEventInfoEXT*)(pDeviceEventInfo));
+                if (pDeviceEventInfo) {
+                    transform_tohost_VkDeviceEventInfoEXT(
+                        m_state, (VkDeviceEventInfoEXT*)(pDeviceEventInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkRegisterDeviceEventEXT 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pDeviceEventInfo, (unsigned long long)pAllocator, (unsigned long long)pFence);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkRegisterDeviceEventEXT 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device, (unsigned long long)pDeviceEventInfo,
+                        (unsigned long long)pAllocator, (unsigned long long)pFence);
                 }
                 VkResult vkRegisterDeviceEventEXT_VkResult_return = (VkResult)0;
-                vkRegisterDeviceEventEXT_VkResult_return = vk->vkRegisterDeviceEventEXT(unboxed_device, pDeviceEventInfo, pAllocator, pFence);
-                if ((vkRegisterDeviceEventEXT_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkRegisterDeviceEventEXT_VkResult_return = vk->vkRegisterDeviceEventEXT(
+                    unboxed_device, pDeviceEventInfo, pAllocator, pFence);
+                if ((vkRegisterDeviceEventEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3;
                 vkStream->handleMapping()->mapHandles_VkFence_u64(pFence, &cgen_var_3, 1);
                 vkStream->write((uint64_t*)&cgen_var_3, 8);
                 vkStream->write(&vkRegisterDeviceEventEXT_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkRegisterDeviceEventEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkRegisterDeviceEventEXT_VkResult_return, device, pDeviceEventInfo, pAllocator, pFence);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkRegisterDeviceEventEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkRegisterDeviceEventEXT_VkResult_return, device, pDeviceEventInfo,
+                        pAllocator, pFence);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkRegisterDisplayEventEXT:
-            {
+            case OP_vkRegisterDisplayEventEXT: {
                 android::base::beginTrace("vkRegisterDisplayEventEXT decode");
                 VkDevice device;
                 VkDisplayKHR display;
@@ -19851,17 +23019,22 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDisplayKHR*)&display = (VkDisplayKHR)unbox_VkDisplayKHR((VkDisplayKHR)(*&cgen_var_1));
-                vkReadStream->alloc((void**)&pDisplayEventInfo, sizeof(const VkDisplayEventInfoEXT));
-                reservedunmarshal_VkDisplayEventInfoEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDisplayEventInfoEXT*)(pDisplayEventInfo), readStreamPtrPtr);
+                *(VkDisplayKHR*)&display =
+                    (VkDisplayKHR)unbox_VkDisplayKHR((VkDisplayKHR)(*&cgen_var_1));
+                vkReadStream->alloc((void**)&pDisplayEventInfo,
+                                    sizeof(const VkDisplayEventInfoEXT));
+                reservedunmarshal_VkDisplayEventInfoEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                        (VkDisplayEventInfoEXT*)(pDisplayEventInfo),
+                                                        readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pFence;
                 vkReadStream->unsetHandleMapping();
@@ -19870,40 +23043,49 @@
                 memcpy((uint64_t*)&cgen_var_3, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
                 *(VkFence*)pFence = (VkFence)(VkFence)((VkFence)(*&cgen_var_3));
-                if (pDisplayEventInfo)
-                {
-                    transform_tohost_VkDisplayEventInfoEXT(m_state, (VkDisplayEventInfoEXT*)(pDisplayEventInfo));
+                if (pDisplayEventInfo) {
+                    transform_tohost_VkDisplayEventInfoEXT(
+                        m_state, (VkDisplayEventInfoEXT*)(pDisplayEventInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkRegisterDisplayEventEXT 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)display, (unsigned long long)pDisplayEventInfo, (unsigned long long)pAllocator, (unsigned long long)pFence);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkRegisterDisplayEventEXT 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)display,
+                            (unsigned long long)pDisplayEventInfo, (unsigned long long)pAllocator,
+                            (unsigned long long)pFence);
                 }
                 VkResult vkRegisterDisplayEventEXT_VkResult_return = (VkResult)0;
-                vkRegisterDisplayEventEXT_VkResult_return = vk->vkRegisterDisplayEventEXT(unboxed_device, display, pDisplayEventInfo, pAllocator, pFence);
-                if ((vkRegisterDisplayEventEXT_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkRegisterDisplayEventEXT_VkResult_return = vk->vkRegisterDisplayEventEXT(
+                    unboxed_device, display, pDisplayEventInfo, pAllocator, pFence);
+                if ((vkRegisterDisplayEventEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_4;
                 vkStream->handleMapping()->mapHandles_VkFence_u64(pFence, &cgen_var_4, 1);
                 vkStream->write((uint64_t*)&cgen_var_4, 8);
                 vkStream->write(&vkRegisterDisplayEventEXT_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkRegisterDisplayEventEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkRegisterDisplayEventEXT_VkResult_return, device, display, pDisplayEventInfo, pAllocator, pFence);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkRegisterDisplayEventEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkRegisterDisplayEventEXT_VkResult_return, device, display,
+                        pDisplayEventInfo, pAllocator, pFence);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetSwapchainCounterEXT:
-            {
+            case OP_vkGetSwapchainCounterEXT: {
                 android::base::beginTrace("vkGetSwapchainCounterEXT decode");
                 VkDevice device;
                 VkSwapchainKHR swapchain;
@@ -19920,40 +23102,50 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkSwapchainKHR*)&swapchain = (VkSwapchainKHR)unbox_VkSwapchainKHR((VkSwapchainKHR)(*&cgen_var_1));
-                memcpy((VkSurfaceCounterFlagBitsEXT*)&counter, *readStreamPtrPtr, sizeof(VkSurfaceCounterFlagBitsEXT));
+                *(VkSwapchainKHR*)&swapchain =
+                    (VkSwapchainKHR)unbox_VkSwapchainKHR((VkSwapchainKHR)(*&cgen_var_1));
+                memcpy((VkSurfaceCounterFlagBitsEXT*)&counter, *readStreamPtrPtr,
+                       sizeof(VkSurfaceCounterFlagBitsEXT));
                 *readStreamPtrPtr += sizeof(VkSurfaceCounterFlagBitsEXT);
                 // Begin manual dispatchable handle unboxing for pCounterValue;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pCounterValue, sizeof(uint64_t));
                 memcpy((uint64_t*)pCounterValue, *readStreamPtrPtr, sizeof(uint64_t));
                 *readStreamPtrPtr += sizeof(uint64_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetSwapchainCounterEXT 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)swapchain, (unsigned long long)counter, (unsigned long long)pCounterValue);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkGetSwapchainCounterEXT 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device, (unsigned long long)swapchain,
+                        (unsigned long long)counter, (unsigned long long)pCounterValue);
                 }
                 VkResult vkGetSwapchainCounterEXT_VkResult_return = (VkResult)0;
-                vkGetSwapchainCounterEXT_VkResult_return = vk->vkGetSwapchainCounterEXT(unboxed_device, swapchain, counter, pCounterValue);
-                if ((vkGetSwapchainCounterEXT_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetSwapchainCounterEXT_VkResult_return =
+                    vk->vkGetSwapchainCounterEXT(unboxed_device, swapchain, counter, pCounterValue);
+                if ((vkGetSwapchainCounterEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write((uint64_t*)pCounterValue, sizeof(uint64_t));
                 vkStream->write(&vkGetSwapchainCounterEXT_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetSwapchainCounterEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetSwapchainCounterEXT_VkResult_return, device, swapchain, counter, pCounterValue);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetSwapchainCounterEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetSwapchainCounterEXT_VkResult_return, device, swapchain, counter,
+                        pCounterValue);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_GOOGLE_display_timing
-            case OP_vkGetRefreshCycleDurationGOOGLE:
-            {
+            case OP_vkGetRefreshCycleDurationGOOGLE: {
                 android::base::beginTrace("vkGetRefreshCycleDurationGOOGLE decode");
                 VkDevice device;
                 VkSwapchainKHR swapchain;
@@ -19969,43 +23161,58 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkSwapchainKHR*)&swapchain = (VkSwapchainKHR)unbox_VkSwapchainKHR((VkSwapchainKHR)(*&cgen_var_1));
+                *(VkSwapchainKHR*)&swapchain =
+                    (VkSwapchainKHR)unbox_VkSwapchainKHR((VkSwapchainKHR)(*&cgen_var_1));
                 // Begin manual dispatchable handle unboxing for pDisplayTimingProperties;
                 vkReadStream->unsetHandleMapping();
-                vkReadStream->alloc((void**)&pDisplayTimingProperties, sizeof(VkRefreshCycleDurationGOOGLE));
-                reservedunmarshal_VkRefreshCycleDurationGOOGLE(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRefreshCycleDurationGOOGLE*)(pDisplayTimingProperties), readStreamPtrPtr);
-                if (pDisplayTimingProperties)
-                {
-                    transform_tohost_VkRefreshCycleDurationGOOGLE(m_state, (VkRefreshCycleDurationGOOGLE*)(pDisplayTimingProperties));
+                vkReadStream->alloc((void**)&pDisplayTimingProperties,
+                                    sizeof(VkRefreshCycleDurationGOOGLE));
+                reservedunmarshal_VkRefreshCycleDurationGOOGLE(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkRefreshCycleDurationGOOGLE*)(pDisplayTimingProperties), readStreamPtrPtr);
+                if (pDisplayTimingProperties) {
+                    transform_tohost_VkRefreshCycleDurationGOOGLE(
+                        m_state, (VkRefreshCycleDurationGOOGLE*)(pDisplayTimingProperties));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetRefreshCycleDurationGOOGLE 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)swapchain, (unsigned long long)pDisplayTimingProperties);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkGetRefreshCycleDurationGOOGLE 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device, (unsigned long long)swapchain,
+                        (unsigned long long)pDisplayTimingProperties);
                 }
                 VkResult vkGetRefreshCycleDurationGOOGLE_VkResult_return = (VkResult)0;
-                vkGetRefreshCycleDurationGOOGLE_VkResult_return = vk->vkGetRefreshCycleDurationGOOGLE(unboxed_device, swapchain, pDisplayTimingProperties);
-                if ((vkGetRefreshCycleDurationGOOGLE_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetRefreshCycleDurationGOOGLE_VkResult_return =
+                    vk->vkGetRefreshCycleDurationGOOGLE(unboxed_device, swapchain,
+                                                        pDisplayTimingProperties);
+                if ((vkGetRefreshCycleDurationGOOGLE_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                if (pDisplayTimingProperties)
-                {
-                    transform_fromhost_VkRefreshCycleDurationGOOGLE(m_state, (VkRefreshCycleDurationGOOGLE*)(pDisplayTimingProperties));
+                if (pDisplayTimingProperties) {
+                    transform_fromhost_VkRefreshCycleDurationGOOGLE(
+                        m_state, (VkRefreshCycleDurationGOOGLE*)(pDisplayTimingProperties));
                 }
-                marshal_VkRefreshCycleDurationGOOGLE(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRefreshCycleDurationGOOGLE*)(pDisplayTimingProperties));
+                marshal_VkRefreshCycleDurationGOOGLE(
+                    vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkRefreshCycleDurationGOOGLE*)(pDisplayTimingProperties));
                 vkStream->write(&vkGetRefreshCycleDurationGOOGLE_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetRefreshCycleDurationGOOGLE(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetRefreshCycleDurationGOOGLE_VkResult_return, device, swapchain, pDisplayTimingProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetRefreshCycleDurationGOOGLE(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetRefreshCycleDurationGOOGLE_VkResult_return, device, swapchain,
+                        pDisplayTimingProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPastPresentationTimingGOOGLE:
-            {
+            case OP_vkGetPastPresentationTimingGOOGLE: {
                 android::base::beginTrace("vkGetPastPresentationTimingGOOGLE decode");
                 VkDevice device;
                 VkSwapchainKHR swapchain;
@@ -20022,91 +23229,104 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkSwapchainKHR*)&swapchain = (VkSwapchainKHR)unbox_VkSwapchainKHR((VkSwapchainKHR)(*&cgen_var_1));
+                *(VkSwapchainKHR*)&swapchain =
+                    (VkSwapchainKHR)unbox_VkSwapchainKHR((VkSwapchainKHR)(*&cgen_var_1));
                 // Begin manual dispatchable handle unboxing for pPresentationTimingCount;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 memcpy((uint32_t**)&pPresentationTimingCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pPresentationTimingCount);
                 *readStreamPtrPtr += 8;
-                if (pPresentationTimingCount)
-                {
+                if (pPresentationTimingCount) {
                     vkReadStream->alloc((void**)&pPresentationTimingCount, sizeof(uint32_t));
-                    memcpy((uint32_t*)pPresentationTimingCount, *readStreamPtrPtr, sizeof(uint32_t));
+                    memcpy((uint32_t*)pPresentationTimingCount, *readStreamPtrPtr,
+                           sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
                 }
                 // Begin manual dispatchable handle unboxing for pPresentationTimings;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
-                memcpy((VkPastPresentationTimingGOOGLE**)&pPresentationTimings, (*readStreamPtrPtr), 8);
+                memcpy((VkPastPresentationTimingGOOGLE**)&pPresentationTimings, (*readStreamPtrPtr),
+                       8);
                 android::base::Stream::fromBe64((uint8_t*)&pPresentationTimings);
                 *readStreamPtrPtr += 8;
-                if (pPresentationTimings)
-                {
-                    vkReadStream->alloc((void**)&pPresentationTimings, (*(pPresentationTimingCount)) * sizeof(VkPastPresentationTimingGOOGLE));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pPresentationTimingCount)); ++i)
-                    {
-                        reservedunmarshal_VkPastPresentationTimingGOOGLE(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPastPresentationTimingGOOGLE*)(pPresentationTimings + i), readStreamPtrPtr);
+                if (pPresentationTimings) {
+                    vkReadStream->alloc(
+                        (void**)&pPresentationTimings,
+                        (*(pPresentationTimingCount)) * sizeof(VkPastPresentationTimingGOOGLE));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pPresentationTimingCount)); ++i) {
+                        reservedunmarshal_VkPastPresentationTimingGOOGLE(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkPastPresentationTimingGOOGLE*)(pPresentationTimings + i),
+                            readStreamPtrPtr);
                     }
                 }
-                if (pPresentationTimingCount)
-                {
-                    if (pPresentationTimings)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPresentationTimingCount)); ++i)
-                        {
-                            transform_tohost_VkPastPresentationTimingGOOGLE(m_state, (VkPastPresentationTimingGOOGLE*)(pPresentationTimings + i));
+                if (pPresentationTimingCount) {
+                    if (pPresentationTimings) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPresentationTimingCount)); ++i) {
+                            transform_tohost_VkPastPresentationTimingGOOGLE(
+                                m_state,
+                                (VkPastPresentationTimingGOOGLE*)(pPresentationTimings + i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPastPresentationTimingGOOGLE 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)swapchain, (unsigned long long)pPresentationTimingCount, (unsigned long long)pPresentationTimings);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPastPresentationTimingGOOGLE 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)swapchain,
+                            (unsigned long long)pPresentationTimingCount,
+                            (unsigned long long)pPresentationTimings);
                 }
                 VkResult vkGetPastPresentationTimingGOOGLE_VkResult_return = (VkResult)0;
-                vkGetPastPresentationTimingGOOGLE_VkResult_return = vk->vkGetPastPresentationTimingGOOGLE(unboxed_device, swapchain, pPresentationTimingCount, pPresentationTimings);
-                if ((vkGetPastPresentationTimingGOOGLE_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetPastPresentationTimingGOOGLE_VkResult_return =
+                    vk->vkGetPastPresentationTimingGOOGLE(
+                        unboxed_device, swapchain, pPresentationTimingCount, pPresentationTimings);
+                if ((vkGetPastPresentationTimingGOOGLE_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pPresentationTimingCount;
                 vkStream->putBe64(cgen_var_4);
-                if (pPresentationTimingCount)
-                {
+                if (pPresentationTimingCount) {
                     vkStream->write((uint32_t*)pPresentationTimingCount, sizeof(uint32_t));
                 }
-                if (pPresentationTimingCount)
-                {
-                    if (pPresentationTimings)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPresentationTimingCount)); ++i)
-                        {
-                            transform_fromhost_VkPastPresentationTimingGOOGLE(m_state, (VkPastPresentationTimingGOOGLE*)(pPresentationTimings + i));
+                if (pPresentationTimingCount) {
+                    if (pPresentationTimings) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPresentationTimingCount)); ++i) {
+                            transform_fromhost_VkPastPresentationTimingGOOGLE(
+                                m_state,
+                                (VkPastPresentationTimingGOOGLE*)(pPresentationTimings + i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_5 = (uint64_t)(uintptr_t)pPresentationTimings;
                 vkStream->putBe64(cgen_var_5);
-                if (pPresentationTimings)
-                {
-                    if (pPresentationTimingCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPresentationTimingCount)); ++i)
-                        {
-                            marshal_VkPastPresentationTimingGOOGLE(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPastPresentationTimingGOOGLE*)(pPresentationTimings + i));
+                if (pPresentationTimings) {
+                    if (pPresentationTimingCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPresentationTimingCount)); ++i) {
+                            marshal_VkPastPresentationTimingGOOGLE(
+                                vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                (VkPastPresentationTimingGOOGLE*)(pPresentationTimings + i));
                         }
                     }
                 }
-                vkStream->write(&vkGetPastPresentationTimingGOOGLE_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkGetPastPresentationTimingGOOGLE_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPastPresentationTimingGOOGLE(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetPastPresentationTimingGOOGLE_VkResult_return, device, swapchain, pPresentationTimingCount, pPresentationTimings);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPastPresentationTimingGOOGLE(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetPastPresentationTimingGOOGLE_VkResult_return, device, swapchain,
+                        pPresentationTimingCount, pPresentationTimings);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -20122,8 +23342,7 @@
 #ifdef VK_NV_viewport_swizzle
 #endif
 #ifdef VK_EXT_discard_rectangles
-            case OP_vkCmdSetDiscardRectangleEXT:
-            {
+            case OP_vkCmdSetDiscardRectangleEXT: {
                 android::base::beginTrace("vkCmdSetDiscardRectangleEXT decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t firstDiscardRectangle;
@@ -20133,7 +23352,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -20141,32 +23361,41 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&discardRectangleCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pDiscardRectangles, ((discardRectangleCount)) * sizeof(const VkRect2D));
-                for (uint32_t i = 0; i < (uint32_t)((discardRectangleCount)); ++i)
-                {
-                    reservedunmarshal_VkRect2D(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRect2D*)(pDiscardRectangles + i), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pDiscardRectangles,
+                                    ((discardRectangleCount)) * sizeof(const VkRect2D));
+                for (uint32_t i = 0; i < (uint32_t)((discardRectangleCount)); ++i) {
+                    reservedunmarshal_VkRect2D(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                               (VkRect2D*)(pDiscardRectangles + i),
+                                               readStreamPtrPtr);
                 }
-                if (pDiscardRectangles)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((discardRectangleCount)); ++i)
-                    {
+                if (pDiscardRectangles) {
+                    for (uint32_t i = 0; i < (uint32_t)((discardRectangleCount)); ++i) {
                         transform_tohost_VkRect2D(m_state, (VkRect2D*)(pDiscardRectangles + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetDiscardRectangleEXT 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)firstDiscardRectangle, (unsigned long long)discardRectangleCount, (unsigned long long)pDiscardRectangles);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdSetDiscardRectangleEXT 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)firstDiscardRectangle,
+                            (unsigned long long)discardRectangleCount,
+                            (unsigned long long)pDiscardRectangles);
                 }
-                vk->vkCmdSetDiscardRectangleEXT(unboxed_commandBuffer, firstDiscardRectangle, discardRectangleCount, pDiscardRectangles);
+                vk->vkCmdSetDiscardRectangleEXT(unboxed_commandBuffer, firstDiscardRectangle,
+                                                discardRectangleCount, pDiscardRectangles);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetDiscardRectangleEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, firstDiscardRectangle, discardRectangleCount, pDiscardRectangles);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetDiscardRectangleEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        firstDiscardRectangle, discardRectangleCount, pDiscardRectangles);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -20178,8 +23407,7 @@
 #ifdef VK_EXT_swapchain_colorspace
 #endif
 #ifdef VK_EXT_hdr_metadata
-            case OP_vkSetHdrMetadataEXT:
-            {
+            case OP_vkSetHdrMetadataEXT: {
                 android::base::beginTrace("vkSetHdrMetadataEXT decode");
                 VkDevice device;
                 uint32_t swapchainCount;
@@ -20195,50 +23423,57 @@
                 // End manual dispatchable handle unboxing for device;
                 memcpy((uint32_t*)&swapchainCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pSwapchains, ((swapchainCount)) * sizeof(const VkSwapchainKHR));
-                if (((swapchainCount)))
-                {
+                vkReadStream->alloc((void**)&pSwapchains,
+                                    ((swapchainCount)) * sizeof(const VkSwapchainKHR));
+                if (((swapchainCount))) {
                     uint8_t* cgen_var_1_ptr = (uint8_t*)(*readStreamPtrPtr);
                     *readStreamPtrPtr += 8 * ((swapchainCount));
-                    for (uint32_t k = 0; k < ((swapchainCount)); ++k)
-                    {
-                        uint64_t tmpval; memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
-                        *(((VkSwapchainKHR*)pSwapchains) + k) = (VkSwapchainKHR)unbox_VkSwapchainKHR((VkSwapchainKHR)tmpval);
+                    for (uint32_t k = 0; k < ((swapchainCount)); ++k) {
+                        uint64_t tmpval;
+                        memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
+                        *(((VkSwapchainKHR*)pSwapchains) + k) =
+                            (VkSwapchainKHR)unbox_VkSwapchainKHR((VkSwapchainKHR)tmpval);
                     }
                 }
-                vkReadStream->alloc((void**)&pMetadata, ((swapchainCount)) * sizeof(const VkHdrMetadataEXT));
-                for (uint32_t i = 0; i < (uint32_t)((swapchainCount)); ++i)
-                {
-                    reservedunmarshal_VkHdrMetadataEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkHdrMetadataEXT*)(pMetadata + i), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pMetadata,
+                                    ((swapchainCount)) * sizeof(const VkHdrMetadataEXT));
+                for (uint32_t i = 0; i < (uint32_t)((swapchainCount)); ++i) {
+                    reservedunmarshal_VkHdrMetadataEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                       (VkHdrMetadataEXT*)(pMetadata + i),
+                                                       readStreamPtrPtr);
                 }
-                if (pMetadata)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((swapchainCount)); ++i)
-                    {
-                        transform_tohost_VkHdrMetadataEXT(m_state, (VkHdrMetadataEXT*)(pMetadata + i));
+                if (pMetadata) {
+                    for (uint32_t i = 0; i < (uint32_t)((swapchainCount)); ++i) {
+                        transform_tohost_VkHdrMetadataEXT(m_state,
+                                                          (VkHdrMetadataEXT*)(pMetadata + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkSetHdrMetadataEXT 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)swapchainCount, (unsigned long long)pSwapchains, (unsigned long long)pMetadata);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkSetHdrMetadataEXT 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device,
+                            (unsigned long long)swapchainCount, (unsigned long long)pSwapchains,
+                            (unsigned long long)pMetadata);
                 }
                 vk->vkSetHdrMetadataEXT(unboxed_device, swapchainCount, pSwapchains, pMetadata);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkSetHdrMetadataEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, swapchainCount, pSwapchains, pMetadata);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkSetHdrMetadataEXT(snapshotTraceBegin, snapshotTraceBytes,
+                                                             &m_pool, device, swapchainCount,
+                                                             pSwapchains, pMetadata);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_MVK_ios_surface
-            case OP_vkCreateIOSSurfaceMVK:
-            {
+            case OP_vkCreateIOSSurfaceMVK: {
                 android::base::beginTrace("vkCreateIOSSurfaceMVK decode");
                 VkInstance instance;
                 const VkIOSSurfaceCreateInfoMVK* pCreateInfo;
@@ -20253,15 +23488,18 @@
                 auto vk = dispatch_VkInstance(instance);
                 // End manual dispatchable handle unboxing for instance;
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkIOSSurfaceCreateInfoMVK));
-                reservedunmarshal_VkIOSSurfaceCreateInfoMVK(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkIOSSurfaceCreateInfoMVK*)(pCreateInfo), readStreamPtrPtr);
+                reservedunmarshal_VkIOSSurfaceCreateInfoMVK(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkIOSSurfaceCreateInfoMVK*)(pCreateInfo), readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pSurface;
                 vkReadStream->unsetHandleMapping();
@@ -20269,43 +23507,51 @@
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkSurfaceKHR*)pSurface = (VkSurfaceKHR)(VkSurfaceKHR)((VkSurfaceKHR)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkIOSSurfaceCreateInfoMVK(m_state, (VkIOSSurfaceCreateInfoMVK*)(pCreateInfo));
+                *(VkSurfaceKHR*)pSurface =
+                    (VkSurfaceKHR)(VkSurfaceKHR)((VkSurfaceKHR)(*&cgen_var_2));
+                if (pCreateInfo) {
+                    transform_tohost_VkIOSSurfaceCreateInfoMVK(
+                        m_state, (VkIOSSurfaceCreateInfoMVK*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateIOSSurfaceMVK 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)instance, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pSurface);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateIOSSurfaceMVK 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)instance, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pSurface);
                 }
                 VkResult vkCreateIOSSurfaceMVK_VkResult_return = (VkResult)0;
-                vkCreateIOSSurfaceMVK_VkResult_return = vk->vkCreateIOSSurfaceMVK(unboxed_instance, pCreateInfo, pAllocator, pSurface);
-                if ((vkCreateIOSSurfaceMVK_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateIOSSurfaceMVK_VkResult_return =
+                    vk->vkCreateIOSSurfaceMVK(unboxed_instance, pCreateInfo, pAllocator, pSurface);
+                if ((vkCreateIOSSurfaceMVK_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3;
                 vkStream->handleMapping()->mapHandles_VkSurfaceKHR_u64(pSurface, &cgen_var_3, 1);
                 vkStream->write((uint64_t*)&cgen_var_3, 8);
                 vkStream->write(&vkCreateIOSSurfaceMVK_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateIOSSurfaceMVK(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateIOSSurfaceMVK_VkResult_return, instance, pCreateInfo, pAllocator, pSurface);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateIOSSurfaceMVK(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateIOSSurfaceMVK_VkResult_return, instance, pCreateInfo, pAllocator,
+                        pSurface);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_MVK_macos_surface
-            case OP_vkCreateMacOSSurfaceMVK:
-            {
+            case OP_vkCreateMacOSSurfaceMVK: {
                 android::base::beginTrace("vkCreateMacOSSurfaceMVK decode");
                 VkInstance instance;
                 const VkMacOSSurfaceCreateInfoMVK* pCreateInfo;
@@ -20319,16 +23565,20 @@
                 auto unboxed_instance = unbox_VkInstance(instance);
                 auto vk = dispatch_VkInstance(instance);
                 // End manual dispatchable handle unboxing for instance;
-                vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkMacOSSurfaceCreateInfoMVK));
-                reservedunmarshal_VkMacOSSurfaceCreateInfoMVK(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMacOSSurfaceCreateInfoMVK*)(pCreateInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pCreateInfo,
+                                    sizeof(const VkMacOSSurfaceCreateInfoMVK));
+                reservedunmarshal_VkMacOSSurfaceCreateInfoMVK(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkMacOSSurfaceCreateInfoMVK*)(pCreateInfo), readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pSurface;
                 vkReadStream->unsetHandleMapping();
@@ -20336,43 +23586,52 @@
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkSurfaceKHR*)pSurface = (VkSurfaceKHR)(VkSurfaceKHR)((VkSurfaceKHR)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkMacOSSurfaceCreateInfoMVK(m_state, (VkMacOSSurfaceCreateInfoMVK*)(pCreateInfo));
+                *(VkSurfaceKHR*)pSurface =
+                    (VkSurfaceKHR)(VkSurfaceKHR)((VkSurfaceKHR)(*&cgen_var_2));
+                if (pCreateInfo) {
+                    transform_tohost_VkMacOSSurfaceCreateInfoMVK(
+                        m_state, (VkMacOSSurfaceCreateInfoMVK*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateMacOSSurfaceMVK 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)instance, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pSurface);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkCreateMacOSSurfaceMVK 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)instance, (unsigned long long)pCreateInfo,
+                        (unsigned long long)pAllocator, (unsigned long long)pSurface);
                 }
                 VkResult vkCreateMacOSSurfaceMVK_VkResult_return = (VkResult)0;
-                vkCreateMacOSSurfaceMVK_VkResult_return = vk->vkCreateMacOSSurfaceMVK(unboxed_instance, pCreateInfo, pAllocator, pSurface);
-                if ((vkCreateMacOSSurfaceMVK_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateMacOSSurfaceMVK_VkResult_return = vk->vkCreateMacOSSurfaceMVK(
+                    unboxed_instance, pCreateInfo, pAllocator, pSurface);
+                if ((vkCreateMacOSSurfaceMVK_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3;
                 vkStream->handleMapping()->mapHandles_VkSurfaceKHR_u64(pSurface, &cgen_var_3, 1);
                 vkStream->write((uint64_t*)&cgen_var_3, 8);
                 vkStream->write(&vkCreateMacOSSurfaceMVK_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateMacOSSurfaceMVK(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateMacOSSurfaceMVK_VkResult_return, instance, pCreateInfo, pAllocator, pSurface);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateMacOSSurfaceMVK(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateMacOSSurfaceMVK_VkResult_return, instance, pCreateInfo, pAllocator,
+                        pSurface);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_MVK_moltenvk
-            case OP_vkGetMTLDeviceMVK:
-            {
+            case OP_vkGetMTLDeviceMVK: {
                 android::base::beginTrace("vkGetMTLDeviceMVK decode");
                 VkPhysicalDevice physicalDevice;
                 void** pMTLDevice;
@@ -20380,7 +23639,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
@@ -20389,27 +23649,28 @@
                 vkReadStream->alloc((void**)&pMTLDevice, sizeof(void*));
                 memcpy((void**)pMTLDevice, *readStreamPtrPtr, sizeof(void*));
                 *readStreamPtrPtr += sizeof(void*);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetMTLDeviceMVK 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pMTLDevice);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkGetMTLDeviceMVK 0x%llx 0x%llx \n", ioStream,
+                            (unsigned long long)physicalDevice, (unsigned long long)pMTLDevice);
                 }
                 vk->vkGetMTLDeviceMVK(unboxed_physicalDevice, pMTLDevice);
                 vkStream->unsetHandleMapping();
                 vkStream->write((void**)pMTLDevice, sizeof(void*));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetMTLDeviceMVK(snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice, pMTLDevice);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetMTLDeviceMVK(snapshotTraceBegin, snapshotTraceBytes,
+                                                           &m_pool, physicalDevice, pMTLDevice);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkSetMTLTextureMVK:
-            {
+            case OP_vkSetMTLTextureMVK: {
                 android::base::beginTrace("vkSetMTLTextureMVK decode");
                 VkImage image;
                 void* mtlTexture;
@@ -20422,30 +23683,33 @@
                 vkReadStream->alloc((void**)&mtlTexture, sizeof(uint8_t));
                 memcpy((void*)mtlTexture, *readStreamPtrPtr, sizeof(uint8_t));
                 *readStreamPtrPtr += sizeof(uint8_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkSetMTLTextureMVK 0x%llx 0x%llx \n", ioStream, (unsigned long long)image, (unsigned long long)mtlTexture);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkSetMTLTextureMVK 0x%llx 0x%llx \n", ioStream,
+                            (unsigned long long)image, (unsigned long long)mtlTexture);
                 }
                 VkResult vkSetMTLTextureMVK_VkResult_return = (VkResult)0;
                 vkSetMTLTextureMVK_VkResult_return = vk->vkSetMTLTextureMVK(image, mtlTexture);
-                if ((vkSetMTLTextureMVK_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                if ((vkSetMTLTextureMVK_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write((void*)mtlTexture, sizeof(uint8_t));
                 vkStream->write(&vkSetMTLTextureMVK_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkSetMTLTextureMVK(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkSetMTLTextureMVK_VkResult_return, image, mtlTexture);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkSetMTLTextureMVK(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkSetMTLTextureMVK_VkResult_return, image, mtlTexture);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetMTLTextureMVK:
-            {
+            case OP_vkGetMTLTextureMVK: {
                 android::base::beginTrace("vkGetMTLTextureMVK decode");
                 VkImage image;
                 void** pMTLTexture;
@@ -20458,27 +23722,28 @@
                 vkReadStream->alloc((void**)&pMTLTexture, sizeof(void*));
                 memcpy((void**)pMTLTexture, *readStreamPtrPtr, sizeof(void*));
                 *readStreamPtrPtr += sizeof(void*);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetMTLTextureMVK 0x%llx 0x%llx \n", ioStream, (unsigned long long)image, (unsigned long long)pMTLTexture);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkGetMTLTextureMVK 0x%llx 0x%llx \n", ioStream,
+                            (unsigned long long)image, (unsigned long long)pMTLTexture);
                 }
                 vk->vkGetMTLTextureMVK(image, pMTLTexture);
                 vkStream->unsetHandleMapping();
                 vkStream->write((void**)pMTLTexture, sizeof(void*));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetMTLTextureMVK(snapshotTraceBegin, snapshotTraceBytes, &m_pool, image, pMTLTexture);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetMTLTextureMVK(snapshotTraceBegin, snapshotTraceBytes,
+                                                            &m_pool, image, pMTLTexture);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetMTLBufferMVK:
-            {
+            case OP_vkGetMTLBufferMVK: {
                 android::base::beginTrace("vkGetMTLBufferMVK decode");
                 VkBuffer buffer;
                 void** pMTLBuffer;
@@ -20491,27 +23756,28 @@
                 vkReadStream->alloc((void**)&pMTLBuffer, sizeof(void*));
                 memcpy((void**)pMTLBuffer, *readStreamPtrPtr, sizeof(void*));
                 *readStreamPtrPtr += sizeof(void*);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetMTLBufferMVK 0x%llx 0x%llx \n", ioStream, (unsigned long long)buffer, (unsigned long long)pMTLBuffer);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkGetMTLBufferMVK 0x%llx 0x%llx \n", ioStream,
+                            (unsigned long long)buffer, (unsigned long long)pMTLBuffer);
                 }
                 vk->vkGetMTLBufferMVK(buffer, pMTLBuffer);
                 vkStream->unsetHandleMapping();
                 vkStream->write((void**)pMTLBuffer, sizeof(void*));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetMTLBufferMVK(snapshotTraceBegin, snapshotTraceBytes, &m_pool, buffer, pMTLBuffer);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetMTLBufferMVK(snapshotTraceBegin, snapshotTraceBytes,
+                                                           &m_pool, buffer, pMTLBuffer);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkUseIOSurfaceMVK:
-            {
+            case OP_vkUseIOSurfaceMVK: {
                 android::base::beginTrace("vkUseIOSurfaceMVK decode");
                 VkImage image;
                 void* ioSurface;
@@ -20524,30 +23790,33 @@
                 vkReadStream->alloc((void**)&ioSurface, sizeof(uint8_t));
                 memcpy((void*)ioSurface, *readStreamPtrPtr, sizeof(uint8_t));
                 *readStreamPtrPtr += sizeof(uint8_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkUseIOSurfaceMVK 0x%llx 0x%llx \n", ioStream, (unsigned long long)image, (unsigned long long)ioSurface);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkUseIOSurfaceMVK 0x%llx 0x%llx \n", ioStream,
+                            (unsigned long long)image, (unsigned long long)ioSurface);
                 }
                 VkResult vkUseIOSurfaceMVK_VkResult_return = (VkResult)0;
                 vkUseIOSurfaceMVK_VkResult_return = vk->vkUseIOSurfaceMVK(image, ioSurface);
-                if ((vkUseIOSurfaceMVK_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                if ((vkUseIOSurfaceMVK_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write((void*)ioSurface, sizeof(uint8_t));
                 vkStream->write(&vkUseIOSurfaceMVK_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkUseIOSurfaceMVK(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkUseIOSurfaceMVK_VkResult_return, image, ioSurface);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkUseIOSurfaceMVK(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkUseIOSurfaceMVK_VkResult_return, image, ioSurface);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetIOSurfaceMVK:
-            {
+            case OP_vkGetIOSurfaceMVK: {
                 android::base::beginTrace("vkGetIOSurfaceMVK decode");
                 VkImage image;
                 void** pIOSurface;
@@ -20560,22 +23829,24 @@
                 vkReadStream->alloc((void**)&pIOSurface, sizeof(void*));
                 memcpy((void**)pIOSurface, *readStreamPtrPtr, sizeof(void*));
                 *readStreamPtrPtr += sizeof(void*);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetIOSurfaceMVK 0x%llx 0x%llx \n", ioStream, (unsigned long long)image, (unsigned long long)pIOSurface);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkGetIOSurfaceMVK 0x%llx 0x%llx \n", ioStream,
+                            (unsigned long long)image, (unsigned long long)pIOSurface);
                 }
                 vk->vkGetIOSurfaceMVK(image, pIOSurface);
                 vkStream->unsetHandleMapping();
                 vkStream->write((void**)pIOSurface, sizeof(void*));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetIOSurfaceMVK(snapshotTraceBegin, snapshotTraceBytes, &m_pool, image, pIOSurface);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetIOSurfaceMVK(snapshotTraceBegin, snapshotTraceBytes,
+                                                           &m_pool, image, pIOSurface);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -20585,8 +23856,7 @@
 #ifdef VK_EXT_queue_family_foreign
 #endif
 #ifdef VK_EXT_debug_utils
-            case OP_vkSetDebugUtilsObjectNameEXT:
-            {
+            case OP_vkSetDebugUtilsObjectNameEXT: {
                 android::base::beginTrace("vkSetDebugUtilsObjectNameEXT decode");
                 VkDevice device;
                 const VkDebugUtilsObjectNameInfoEXT* pNameInfo;
@@ -20598,35 +23868,42 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pNameInfo, sizeof(const VkDebugUtilsObjectNameInfoEXT));
-                reservedunmarshal_VkDebugUtilsObjectNameInfoEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugUtilsObjectNameInfoEXT*)(pNameInfo), readStreamPtrPtr);
-                if (pNameInfo)
-                {
-                    transform_tohost_VkDebugUtilsObjectNameInfoEXT(m_state, (VkDebugUtilsObjectNameInfoEXT*)(pNameInfo));
+                vkReadStream->alloc((void**)&pNameInfo,
+                                    sizeof(const VkDebugUtilsObjectNameInfoEXT));
+                reservedunmarshal_VkDebugUtilsObjectNameInfoEXT(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkDebugUtilsObjectNameInfoEXT*)(pNameInfo), readStreamPtrPtr);
+                if (pNameInfo) {
+                    transform_tohost_VkDebugUtilsObjectNameInfoEXT(
+                        m_state, (VkDebugUtilsObjectNameInfoEXT*)(pNameInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkSetDebugUtilsObjectNameEXT 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pNameInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkSetDebugUtilsObjectNameEXT 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pNameInfo);
                 }
                 VkResult vkSetDebugUtilsObjectNameEXT_VkResult_return = (VkResult)0;
-                vkSetDebugUtilsObjectNameEXT_VkResult_return = vk->vkSetDebugUtilsObjectNameEXT(unboxed_device, pNameInfo);
-                if ((vkSetDebugUtilsObjectNameEXT_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkSetDebugUtilsObjectNameEXT_VkResult_return =
+                    vk->vkSetDebugUtilsObjectNameEXT(unboxed_device, pNameInfo);
+                if ((vkSetDebugUtilsObjectNameEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkSetDebugUtilsObjectNameEXT_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkSetDebugUtilsObjectNameEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkSetDebugUtilsObjectNameEXT_VkResult_return, device, pNameInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkSetDebugUtilsObjectNameEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkSetDebugUtilsObjectNameEXT_VkResult_return, device, pNameInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkSetDebugUtilsObjectTagEXT:
-            {
+            case OP_vkSetDebugUtilsObjectTagEXT: {
                 android::base::beginTrace("vkSetDebugUtilsObjectTagEXT decode");
                 VkDevice device;
                 const VkDebugUtilsObjectTagInfoEXT* pTagInfo;
@@ -20639,34 +23916,40 @@
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
                 vkReadStream->alloc((void**)&pTagInfo, sizeof(const VkDebugUtilsObjectTagInfoEXT));
-                reservedunmarshal_VkDebugUtilsObjectTagInfoEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugUtilsObjectTagInfoEXT*)(pTagInfo), readStreamPtrPtr);
-                if (pTagInfo)
-                {
-                    transform_tohost_VkDebugUtilsObjectTagInfoEXT(m_state, (VkDebugUtilsObjectTagInfoEXT*)(pTagInfo));
+                reservedunmarshal_VkDebugUtilsObjectTagInfoEXT(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkDebugUtilsObjectTagInfoEXT*)(pTagInfo), readStreamPtrPtr);
+                if (pTagInfo) {
+                    transform_tohost_VkDebugUtilsObjectTagInfoEXT(
+                        m_state, (VkDebugUtilsObjectTagInfoEXT*)(pTagInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkSetDebugUtilsObjectTagEXT 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pTagInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkSetDebugUtilsObjectTagEXT 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pTagInfo);
                 }
                 VkResult vkSetDebugUtilsObjectTagEXT_VkResult_return = (VkResult)0;
-                vkSetDebugUtilsObjectTagEXT_VkResult_return = vk->vkSetDebugUtilsObjectTagEXT(unboxed_device, pTagInfo);
-                if ((vkSetDebugUtilsObjectTagEXT_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkSetDebugUtilsObjectTagEXT_VkResult_return =
+                    vk->vkSetDebugUtilsObjectTagEXT(unboxed_device, pTagInfo);
+                if ((vkSetDebugUtilsObjectTagEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkSetDebugUtilsObjectTagEXT_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkSetDebugUtilsObjectTagEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkSetDebugUtilsObjectTagEXT_VkResult_return, device, pTagInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkSetDebugUtilsObjectTagEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkSetDebugUtilsObjectTagEXT_VkResult_return, device, pTagInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkQueueBeginDebugUtilsLabelEXT:
-            {
+            case OP_vkQueueBeginDebugUtilsLabelEXT: {
                 android::base::beginTrace("vkQueueBeginDebugUtilsLabelEXT decode");
                 VkQueue queue;
                 const VkDebugUtilsLabelEXT* pLabelInfo;
@@ -20679,30 +23962,34 @@
                 auto vk = dispatch_VkQueue(queue);
                 // End manual dispatchable handle unboxing for queue;
                 vkReadStream->alloc((void**)&pLabelInfo, sizeof(const VkDebugUtilsLabelEXT));
-                reservedunmarshal_VkDebugUtilsLabelEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugUtilsLabelEXT*)(pLabelInfo), readStreamPtrPtr);
-                if (pLabelInfo)
-                {
-                    transform_tohost_VkDebugUtilsLabelEXT(m_state, (VkDebugUtilsLabelEXT*)(pLabelInfo));
+                reservedunmarshal_VkDebugUtilsLabelEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                       (VkDebugUtilsLabelEXT*)(pLabelInfo),
+                                                       readStreamPtrPtr);
+                if (pLabelInfo) {
+                    transform_tohost_VkDebugUtilsLabelEXT(m_state,
+                                                          (VkDebugUtilsLabelEXT*)(pLabelInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkQueueBeginDebugUtilsLabelEXT 0x%llx 0x%llx \n", ioStream, (unsigned long long)queue, (unsigned long long)pLabelInfo);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkQueueBeginDebugUtilsLabelEXT 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)queue, (unsigned long long)pLabelInfo);
                 }
                 vk->vkQueueBeginDebugUtilsLabelEXT(unboxed_queue, pLabelInfo);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkQueueBeginDebugUtilsLabelEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, queue, pLabelInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkQueueBeginDebugUtilsLabelEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, queue, pLabelInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkQueueEndDebugUtilsLabelEXT:
-            {
+            case OP_vkQueueEndDebugUtilsLabelEXT: {
                 android::base::beginTrace("vkQueueEndDebugUtilsLabelEXT decode");
                 VkQueue queue;
                 // Begin non wrapped dispatchable handle unboxing for queue;
@@ -20713,25 +24000,26 @@
                 auto unboxed_queue = unbox_VkQueue(queue);
                 auto vk = dispatch_VkQueue(queue);
                 // End manual dispatchable handle unboxing for queue;
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkQueueEndDebugUtilsLabelEXT 0x%llx \n", ioStream, (unsigned long long)queue);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkQueueEndDebugUtilsLabelEXT 0x%llx \n",
+                            ioStream, (unsigned long long)queue);
                 }
                 vk->vkQueueEndDebugUtilsLabelEXT(unboxed_queue);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkQueueEndDebugUtilsLabelEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, queue);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkQueueEndDebugUtilsLabelEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, queue);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkQueueInsertDebugUtilsLabelEXT:
-            {
+            case OP_vkQueueInsertDebugUtilsLabelEXT: {
                 android::base::beginTrace("vkQueueInsertDebugUtilsLabelEXT decode");
                 VkQueue queue;
                 const VkDebugUtilsLabelEXT* pLabelInfo;
@@ -20744,30 +24032,34 @@
                 auto vk = dispatch_VkQueue(queue);
                 // End manual dispatchable handle unboxing for queue;
                 vkReadStream->alloc((void**)&pLabelInfo, sizeof(const VkDebugUtilsLabelEXT));
-                reservedunmarshal_VkDebugUtilsLabelEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugUtilsLabelEXT*)(pLabelInfo), readStreamPtrPtr);
-                if (pLabelInfo)
-                {
-                    transform_tohost_VkDebugUtilsLabelEXT(m_state, (VkDebugUtilsLabelEXT*)(pLabelInfo));
+                reservedunmarshal_VkDebugUtilsLabelEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                       (VkDebugUtilsLabelEXT*)(pLabelInfo),
+                                                       readStreamPtrPtr);
+                if (pLabelInfo) {
+                    transform_tohost_VkDebugUtilsLabelEXT(m_state,
+                                                          (VkDebugUtilsLabelEXT*)(pLabelInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkQueueInsertDebugUtilsLabelEXT 0x%llx 0x%llx \n", ioStream, (unsigned long long)queue, (unsigned long long)pLabelInfo);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkQueueInsertDebugUtilsLabelEXT 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)queue, (unsigned long long)pLabelInfo);
                 }
                 vk->vkQueueInsertDebugUtilsLabelEXT(unboxed_queue, pLabelInfo);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkQueueInsertDebugUtilsLabelEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, queue, pLabelInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkQueueInsertDebugUtilsLabelEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, queue, pLabelInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdBeginDebugUtilsLabelEXT:
-            {
+            case OP_vkCmdBeginDebugUtilsLabelEXT: {
                 android::base::beginTrace("vkCmdBeginDebugUtilsLabelEXT decode");
                 VkCommandBuffer commandBuffer;
                 const VkDebugUtilsLabelEXT* pLabelInfo;
@@ -20775,64 +24067,71 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 vkReadStream->alloc((void**)&pLabelInfo, sizeof(const VkDebugUtilsLabelEXT));
-                reservedunmarshal_VkDebugUtilsLabelEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugUtilsLabelEXT*)(pLabelInfo), readStreamPtrPtr);
-                if (pLabelInfo)
-                {
-                    transform_tohost_VkDebugUtilsLabelEXT(m_state, (VkDebugUtilsLabelEXT*)(pLabelInfo));
+                reservedunmarshal_VkDebugUtilsLabelEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                       (VkDebugUtilsLabelEXT*)(pLabelInfo),
+                                                       readStreamPtrPtr);
+                if (pLabelInfo) {
+                    transform_tohost_VkDebugUtilsLabelEXT(m_state,
+                                                          (VkDebugUtilsLabelEXT*)(pLabelInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdBeginDebugUtilsLabelEXT 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pLabelInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdBeginDebugUtilsLabelEXT 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pLabelInfo);
                 }
                 vk->vkCmdBeginDebugUtilsLabelEXT(unboxed_commandBuffer, pLabelInfo);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdBeginDebugUtilsLabelEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pLabelInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdBeginDebugUtilsLabelEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pLabelInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdEndDebugUtilsLabelEXT:
-            {
+            case OP_vkCmdEndDebugUtilsLabelEXT: {
                 android::base::beginTrace("vkCmdEndDebugUtilsLabelEXT decode");
                 VkCommandBuffer commandBuffer;
                 // Begin non wrapped dispatchable handle unboxing for commandBuffer;
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdEndDebugUtilsLabelEXT 0x%llx \n", ioStream, (unsigned long long)commandBuffer);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdEndDebugUtilsLabelEXT 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer);
                 }
                 vk->vkCmdEndDebugUtilsLabelEXT(unboxed_commandBuffer);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdEndDebugUtilsLabelEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdEndDebugUtilsLabelEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdInsertDebugUtilsLabelEXT:
-            {
+            case OP_vkCmdInsertDebugUtilsLabelEXT: {
                 android::base::beginTrace("vkCmdInsertDebugUtilsLabelEXT decode");
                 VkCommandBuffer commandBuffer;
                 const VkDebugUtilsLabelEXT* pLabelInfo;
@@ -20840,35 +24139,41 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 vkReadStream->alloc((void**)&pLabelInfo, sizeof(const VkDebugUtilsLabelEXT));
-                reservedunmarshal_VkDebugUtilsLabelEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugUtilsLabelEXT*)(pLabelInfo), readStreamPtrPtr);
-                if (pLabelInfo)
-                {
-                    transform_tohost_VkDebugUtilsLabelEXT(m_state, (VkDebugUtilsLabelEXT*)(pLabelInfo));
+                reservedunmarshal_VkDebugUtilsLabelEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                       (VkDebugUtilsLabelEXT*)(pLabelInfo),
+                                                       readStreamPtrPtr);
+                if (pLabelInfo) {
+                    transform_tohost_VkDebugUtilsLabelEXT(m_state,
+                                                          (VkDebugUtilsLabelEXT*)(pLabelInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdInsertDebugUtilsLabelEXT 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pLabelInfo);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdInsertDebugUtilsLabelEXT 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pLabelInfo);
                 }
                 vk->vkCmdInsertDebugUtilsLabelEXT(unboxed_commandBuffer, pLabelInfo);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdInsertDebugUtilsLabelEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pLabelInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdInsertDebugUtilsLabelEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pLabelInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCreateDebugUtilsMessengerEXT:
-            {
+            case OP_vkCreateDebugUtilsMessengerEXT: {
                 android::base::beginTrace("vkCreateDebugUtilsMessengerEXT decode");
                 VkInstance instance;
                 const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo;
@@ -20882,16 +24187,20 @@
                 auto unboxed_instance = unbox_VkInstance(instance);
                 auto vk = dispatch_VkInstance(instance);
                 // End manual dispatchable handle unboxing for instance;
-                vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkDebugUtilsMessengerCreateInfoEXT));
-                reservedunmarshal_VkDebugUtilsMessengerCreateInfoEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugUtilsMessengerCreateInfoEXT*)(pCreateInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pCreateInfo,
+                                    sizeof(const VkDebugUtilsMessengerCreateInfoEXT));
+                reservedunmarshal_VkDebugUtilsMessengerCreateInfoEXT(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkDebugUtilsMessengerCreateInfoEXT*)(pCreateInfo), readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pMessenger;
                 vkReadStream->unsetHandleMapping();
@@ -20899,46 +24208,60 @@
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkDebugUtilsMessengerEXT*)pMessenger = (VkDebugUtilsMessengerEXT)(VkDebugUtilsMessengerEXT)((VkDebugUtilsMessengerEXT)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkDebugUtilsMessengerCreateInfoEXT(m_state, (VkDebugUtilsMessengerCreateInfoEXT*)(pCreateInfo));
+                *(VkDebugUtilsMessengerEXT*)pMessenger =
+                    (VkDebugUtilsMessengerEXT)(VkDebugUtilsMessengerEXT)((
+                        VkDebugUtilsMessengerEXT)(*&cgen_var_2));
+                if (pCreateInfo) {
+                    transform_tohost_VkDebugUtilsMessengerCreateInfoEXT(
+                        m_state, (VkDebugUtilsMessengerCreateInfoEXT*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateDebugUtilsMessengerEXT 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)instance, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pMessenger);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateDebugUtilsMessengerEXT 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)instance, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pMessenger);
                 }
                 VkResult vkCreateDebugUtilsMessengerEXT_VkResult_return = (VkResult)0;
-                vkCreateDebugUtilsMessengerEXT_VkResult_return = vk->vkCreateDebugUtilsMessengerEXT(unboxed_instance, pCreateInfo, pAllocator, pMessenger);
-                if ((vkCreateDebugUtilsMessengerEXT_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateDebugUtilsMessengerEXT_VkResult_return = vk->vkCreateDebugUtilsMessengerEXT(
+                    unboxed_instance, pCreateInfo, pAllocator, pMessenger);
+                if ((vkCreateDebugUtilsMessengerEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // Begin auto non dispatchable handle create for pMessenger;
-                if (vkCreateDebugUtilsMessengerEXT_VkResult_return == VK_SUCCESS) vkStream->setHandleMapping(&m_boxedHandleCreateMapping);
+                if (vkCreateDebugUtilsMessengerEXT_VkResult_return == VK_SUCCESS)
+                    vkStream->setHandleMapping(&m_boxedHandleCreateMapping);
                 uint64_t cgen_var_3;
-                static_assert(8 == sizeof(VkDebugUtilsMessengerEXT), "handle map overwrite requires VkDebugUtilsMessengerEXT to be 8 bytes long");
-                vkStream->handleMapping()->mapHandles_VkDebugUtilsMessengerEXT((VkDebugUtilsMessengerEXT*)pMessenger, 1);
+                static_assert(
+                    8 == sizeof(VkDebugUtilsMessengerEXT),
+                    "handle map overwrite requires VkDebugUtilsMessengerEXT to be 8 bytes long");
+                vkStream->handleMapping()->mapHandles_VkDebugUtilsMessengerEXT(
+                    (VkDebugUtilsMessengerEXT*)pMessenger, 1);
                 vkStream->write((VkDebugUtilsMessengerEXT*)pMessenger, 8 * 1);
                 // Begin auto non dispatchable handle create for pMessenger;
                 vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
                 vkStream->write(&vkCreateDebugUtilsMessengerEXT_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateDebugUtilsMessengerEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateDebugUtilsMessengerEXT_VkResult_return, instance, pCreateInfo, pAllocator, pMessenger);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateDebugUtilsMessengerEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateDebugUtilsMessengerEXT_VkResult_return, instance, pCreateInfo,
+                        pAllocator, pMessenger);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroyDebugUtilsMessengerEXT:
-            {
+            case OP_vkDestroyDebugUtilsMessengerEXT: {
                 android::base::beginTrace("vkDestroyDebugUtilsMessengerEXT decode");
                 VkInstance instance;
                 VkDebugUtilsMessengerEXT messenger;
@@ -20956,42 +24279,50 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDebugUtilsMessengerEXT*)&messenger = (VkDebugUtilsMessengerEXT)(VkDebugUtilsMessengerEXT)((VkDebugUtilsMessengerEXT)(*&cgen_var_1));
+                *(VkDebugUtilsMessengerEXT*)&messenger =
+                    (VkDebugUtilsMessengerEXT)(VkDebugUtilsMessengerEXT)((
+                        VkDebugUtilsMessengerEXT)(*&cgen_var_1));
                 boxed_messenger_preserve = messenger;
                 messenger = unbox_VkDebugUtilsMessengerEXT(messenger);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroyDebugUtilsMessengerEXT 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)instance, (unsigned long long)messenger, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkDestroyDebugUtilsMessengerEXT 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)instance, (unsigned long long)messenger,
+                        (unsigned long long)pAllocator);
                 }
                 vk->vkDestroyDebugUtilsMessengerEXT(unboxed_instance, messenger, pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroyDebugUtilsMessengerEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, instance, boxed_messenger_preserve, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroyDebugUtilsMessengerEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, instance,
+                        boxed_messenger_preserve, pAllocator);
                 }
                 delete_VkDebugUtilsMessengerEXT(boxed_messenger_preserve);
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkSubmitDebugUtilsMessageEXT:
-            {
+            case OP_vkSubmitDebugUtilsMessageEXT: {
                 android::base::beginTrace("vkSubmitDebugUtilsMessageEXT decode");
                 VkInstance instance;
                 VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity;
@@ -21005,37 +24336,49 @@
                 auto unboxed_instance = unbox_VkInstance(instance);
                 auto vk = dispatch_VkInstance(instance);
                 // End manual dispatchable handle unboxing for instance;
-                memcpy((VkDebugUtilsMessageSeverityFlagBitsEXT*)&messageSeverity, *readStreamPtrPtr, sizeof(VkDebugUtilsMessageSeverityFlagBitsEXT));
+                memcpy((VkDebugUtilsMessageSeverityFlagBitsEXT*)&messageSeverity, *readStreamPtrPtr,
+                       sizeof(VkDebugUtilsMessageSeverityFlagBitsEXT));
                 *readStreamPtrPtr += sizeof(VkDebugUtilsMessageSeverityFlagBitsEXT);
-                memcpy((VkDebugUtilsMessageTypeFlagsEXT*)&messageTypes, *readStreamPtrPtr, sizeof(VkDebugUtilsMessageTypeFlagsEXT));
+                memcpy((VkDebugUtilsMessageTypeFlagsEXT*)&messageTypes, *readStreamPtrPtr,
+                       sizeof(VkDebugUtilsMessageTypeFlagsEXT));
                 *readStreamPtrPtr += sizeof(VkDebugUtilsMessageTypeFlagsEXT);
-                vkReadStream->alloc((void**)&pCallbackData, sizeof(const VkDebugUtilsMessengerCallbackDataEXT));
-                reservedunmarshal_VkDebugUtilsMessengerCallbackDataEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugUtilsMessengerCallbackDataEXT*)(pCallbackData), readStreamPtrPtr);
-                if (pCallbackData)
-                {
-                    transform_tohost_VkDebugUtilsMessengerCallbackDataEXT(m_state, (VkDebugUtilsMessengerCallbackDataEXT*)(pCallbackData));
+                vkReadStream->alloc((void**)&pCallbackData,
+                                    sizeof(const VkDebugUtilsMessengerCallbackDataEXT));
+                reservedunmarshal_VkDebugUtilsMessengerCallbackDataEXT(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkDebugUtilsMessengerCallbackDataEXT*)(pCallbackData), readStreamPtrPtr);
+                if (pCallbackData) {
+                    transform_tohost_VkDebugUtilsMessengerCallbackDataEXT(
+                        m_state, (VkDebugUtilsMessengerCallbackDataEXT*)(pCallbackData));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkSubmitDebugUtilsMessageEXT 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)instance, (unsigned long long)messageSeverity, (unsigned long long)messageTypes, (unsigned long long)pCallbackData);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkSubmitDebugUtilsMessageEXT 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)instance,
+                            (unsigned long long)messageSeverity, (unsigned long long)messageTypes,
+                            (unsigned long long)pCallbackData);
                 }
-                vk->vkSubmitDebugUtilsMessageEXT(unboxed_instance, messageSeverity, messageTypes, pCallbackData);
+                vk->vkSubmitDebugUtilsMessageEXT(unboxed_instance, messageSeverity, messageTypes,
+                                                 pCallbackData);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkSubmitDebugUtilsMessageEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, instance, messageSeverity, messageTypes, pCallbackData);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkSubmitDebugUtilsMessageEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, instance, messageSeverity,
+                        messageTypes, pCallbackData);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
-            case OP_vkGetAndroidHardwareBufferPropertiesANDROID:
-            {
+            case OP_vkGetAndroidHardwareBufferPropertiesANDROID: {
                 android::base::beginTrace("vkGetAndroidHardwareBufferPropertiesANDROID decode");
                 VkDevice device;
                 const AHardwareBuffer* buffer;
@@ -21053,40 +24396,56 @@
                 *readStreamPtrPtr += sizeof(const AHardwareBuffer);
                 // Begin manual dispatchable handle unboxing for pProperties;
                 vkReadStream->unsetHandleMapping();
-                vkReadStream->alloc((void**)&pProperties, sizeof(VkAndroidHardwareBufferPropertiesANDROID));
-                reservedunmarshal_VkAndroidHardwareBufferPropertiesANDROID(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAndroidHardwareBufferPropertiesANDROID*)(pProperties), readStreamPtrPtr);
-                if (pProperties)
-                {
-                    transform_tohost_VkAndroidHardwareBufferPropertiesANDROID(m_state, (VkAndroidHardwareBufferPropertiesANDROID*)(pProperties));
+                vkReadStream->alloc((void**)&pProperties,
+                                    sizeof(VkAndroidHardwareBufferPropertiesANDROID));
+                reservedunmarshal_VkAndroidHardwareBufferPropertiesANDROID(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkAndroidHardwareBufferPropertiesANDROID*)(pProperties), readStreamPtrPtr);
+                if (pProperties) {
+                    transform_tohost_VkAndroidHardwareBufferPropertiesANDROID(
+                        m_state, (VkAndroidHardwareBufferPropertiesANDROID*)(pProperties));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetAndroidHardwareBufferPropertiesANDROID 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)buffer, (unsigned long long)pProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetAndroidHardwareBufferPropertiesANDROID 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)buffer,
+                            (unsigned long long)pProperties);
                 }
                 VkResult vkGetAndroidHardwareBufferPropertiesANDROID_VkResult_return = (VkResult)0;
-                vkGetAndroidHardwareBufferPropertiesANDROID_VkResult_return = vk->vkGetAndroidHardwareBufferPropertiesANDROID(unboxed_device, buffer, pProperties);
-                if ((vkGetAndroidHardwareBufferPropertiesANDROID_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetAndroidHardwareBufferPropertiesANDROID_VkResult_return =
+                    vk->vkGetAndroidHardwareBufferPropertiesANDROID(unboxed_device, buffer,
+                                                                    pProperties);
+                if ((vkGetAndroidHardwareBufferPropertiesANDROID_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                if (pProperties)
-                {
-                    transform_fromhost_VkAndroidHardwareBufferPropertiesANDROID(m_state, (VkAndroidHardwareBufferPropertiesANDROID*)(pProperties));
+                if (pProperties) {
+                    transform_fromhost_VkAndroidHardwareBufferPropertiesANDROID(
+                        m_state, (VkAndroidHardwareBufferPropertiesANDROID*)(pProperties));
                 }
-                marshal_VkAndroidHardwareBufferPropertiesANDROID(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAndroidHardwareBufferPropertiesANDROID*)(pProperties));
-                vkStream->write(&vkGetAndroidHardwareBufferPropertiesANDROID_VkResult_return, sizeof(VkResult));
+                marshal_VkAndroidHardwareBufferPropertiesANDROID(
+                    vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkAndroidHardwareBufferPropertiesANDROID*)(pProperties));
+                vkStream->write(&vkGetAndroidHardwareBufferPropertiesANDROID_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetAndroidHardwareBufferPropertiesANDROID(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetAndroidHardwareBufferPropertiesANDROID_VkResult_return, device, buffer, pProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetAndroidHardwareBufferPropertiesANDROID(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetAndroidHardwareBufferPropertiesANDROID_VkResult_return, device, buffer,
+                        pProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetMemoryAndroidHardwareBufferANDROID:
-            {
+            case OP_vkGetMemoryAndroidHardwareBufferANDROID: {
                 android::base::beginTrace("vkGetMemoryAndroidHardwareBufferANDROID decode");
                 VkDevice device;
                 const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo;
@@ -21099,36 +24458,50 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pInfo, sizeof(const VkMemoryGetAndroidHardwareBufferInfoANDROID));
-                reservedunmarshal_VkMemoryGetAndroidHardwareBufferInfoANDROID(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryGetAndroidHardwareBufferInfoANDROID*)(pInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pInfo,
+                                    sizeof(const VkMemoryGetAndroidHardwareBufferInfoANDROID));
+                reservedunmarshal_VkMemoryGetAndroidHardwareBufferInfoANDROID(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkMemoryGetAndroidHardwareBufferInfoANDROID*)(pInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pBuffer;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pBuffer, sizeof(AHardwareBuffer*));
                 memcpy((AHardwareBuffer**)pBuffer, *readStreamPtrPtr, sizeof(AHardwareBuffer*));
                 *readStreamPtrPtr += sizeof(AHardwareBuffer*);
-                if (pInfo)
-                {
-                    transform_tohost_VkMemoryGetAndroidHardwareBufferInfoANDROID(m_state, (VkMemoryGetAndroidHardwareBufferInfoANDROID*)(pInfo));
+                if (pInfo) {
+                    transform_tohost_VkMemoryGetAndroidHardwareBufferInfoANDROID(
+                        m_state, (VkMemoryGetAndroidHardwareBufferInfoANDROID*)(pInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetMemoryAndroidHardwareBufferANDROID 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pInfo, (unsigned long long)pBuffer);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetMemoryAndroidHardwareBufferANDROID 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pInfo,
+                            (unsigned long long)pBuffer);
                 }
                 VkResult vkGetMemoryAndroidHardwareBufferANDROID_VkResult_return = (VkResult)0;
-                vkGetMemoryAndroidHardwareBufferANDROID_VkResult_return = vk->vkGetMemoryAndroidHardwareBufferANDROID(unboxed_device, pInfo, pBuffer);
-                if ((vkGetMemoryAndroidHardwareBufferANDROID_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetMemoryAndroidHardwareBufferANDROID_VkResult_return =
+                    vk->vkGetMemoryAndroidHardwareBufferANDROID(unboxed_device, pInfo, pBuffer);
+                if ((vkGetMemoryAndroidHardwareBufferANDROID_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write((AHardwareBuffer**)pBuffer, sizeof(AHardwareBuffer*));
-                vkStream->write(&vkGetMemoryAndroidHardwareBufferANDROID_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkGetMemoryAndroidHardwareBufferANDROID_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetMemoryAndroidHardwareBufferANDROID(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetMemoryAndroidHardwareBufferANDROID_VkResult_return, device, pInfo, pBuffer);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetMemoryAndroidHardwareBufferANDROID(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetMemoryAndroidHardwareBufferANDROID_VkResult_return, device, pInfo,
+                        pBuffer);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -21146,8 +24519,7 @@
 #ifdef VK_EXT_shader_stencil_export
 #endif
 #ifdef VK_EXT_sample_locations
-            case OP_vkCmdSetSampleLocationsEXT:
-            {
+            case OP_vkCmdSetSampleLocationsEXT: {
                 android::base::beginTrace("vkCmdSetSampleLocationsEXT decode");
                 VkCommandBuffer commandBuffer;
                 const VkSampleLocationsInfoEXT* pSampleLocationsInfo;
@@ -21155,35 +24527,42 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
-                vkReadStream->alloc((void**)&pSampleLocationsInfo, sizeof(const VkSampleLocationsInfoEXT));
-                reservedunmarshal_VkSampleLocationsInfoEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSampleLocationsInfoEXT*)(pSampleLocationsInfo), readStreamPtrPtr);
-                if (pSampleLocationsInfo)
-                {
-                    transform_tohost_VkSampleLocationsInfoEXT(m_state, (VkSampleLocationsInfoEXT*)(pSampleLocationsInfo));
+                vkReadStream->alloc((void**)&pSampleLocationsInfo,
+                                    sizeof(const VkSampleLocationsInfoEXT));
+                reservedunmarshal_VkSampleLocationsInfoEXT(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkSampleLocationsInfoEXT*)(pSampleLocationsInfo), readStreamPtrPtr);
+                if (pSampleLocationsInfo) {
+                    transform_tohost_VkSampleLocationsInfoEXT(
+                        m_state, (VkSampleLocationsInfoEXT*)(pSampleLocationsInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetSampleLocationsEXT 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pSampleLocationsInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdSetSampleLocationsEXT 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pSampleLocationsInfo);
                 }
                 vk->vkCmdSetSampleLocationsEXT(unboxed_commandBuffer, pSampleLocationsInfo);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetSampleLocationsEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pSampleLocationsInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetSampleLocationsEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        pSampleLocationsInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceMultisamplePropertiesEXT:
-            {
+            case OP_vkGetPhysicalDeviceMultisamplePropertiesEXT: {
                 android::base::beginTrace("vkGetPhysicalDeviceMultisamplePropertiesEXT decode");
                 VkPhysicalDevice physicalDevice;
                 VkSampleCountFlagBits samples;
@@ -21192,40 +24571,55 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
-                memcpy((VkSampleCountFlagBits*)&samples, *readStreamPtrPtr, sizeof(VkSampleCountFlagBits));
+                memcpy((VkSampleCountFlagBits*)&samples, *readStreamPtrPtr,
+                       sizeof(VkSampleCountFlagBits));
                 *readStreamPtrPtr += sizeof(VkSampleCountFlagBits);
                 // Begin manual dispatchable handle unboxing for pMultisampleProperties;
                 vkReadStream->unsetHandleMapping();
-                vkReadStream->alloc((void**)&pMultisampleProperties, sizeof(VkMultisamplePropertiesEXT));
-                reservedunmarshal_VkMultisamplePropertiesEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMultisamplePropertiesEXT*)(pMultisampleProperties), readStreamPtrPtr);
-                if (pMultisampleProperties)
-                {
-                    transform_tohost_VkMultisamplePropertiesEXT(m_state, (VkMultisamplePropertiesEXT*)(pMultisampleProperties));
+                vkReadStream->alloc((void**)&pMultisampleProperties,
+                                    sizeof(VkMultisamplePropertiesEXT));
+                reservedunmarshal_VkMultisamplePropertiesEXT(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkMultisamplePropertiesEXT*)(pMultisampleProperties), readStreamPtrPtr);
+                if (pMultisampleProperties) {
+                    transform_tohost_VkMultisamplePropertiesEXT(
+                        m_state, (VkMultisamplePropertiesEXT*)(pMultisampleProperties));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceMultisamplePropertiesEXT 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)samples, (unsigned long long)pMultisampleProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceMultisamplePropertiesEXT 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)samples,
+                            (unsigned long long)pMultisampleProperties);
                 }
-                vk->vkGetPhysicalDeviceMultisamplePropertiesEXT(unboxed_physicalDevice, samples, pMultisampleProperties);
+                vk->vkGetPhysicalDeviceMultisamplePropertiesEXT(unboxed_physicalDevice, samples,
+                                                                pMultisampleProperties);
                 vkStream->unsetHandleMapping();
-                if (pMultisampleProperties)
-                {
-                    transform_fromhost_VkMultisamplePropertiesEXT(m_state, (VkMultisamplePropertiesEXT*)(pMultisampleProperties));
+                if (pMultisampleProperties) {
+                    transform_fromhost_VkMultisamplePropertiesEXT(
+                        m_state, (VkMultisamplePropertiesEXT*)(pMultisampleProperties));
                 }
-                marshal_VkMultisamplePropertiesEXT(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMultisamplePropertiesEXT*)(pMultisampleProperties));
+                marshal_VkMultisamplePropertiesEXT(
+                    vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkMultisamplePropertiesEXT*)(pMultisampleProperties));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceMultisamplePropertiesEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice, samples, pMultisampleProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceMultisamplePropertiesEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, physicalDevice, samples,
+                        pMultisampleProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -21243,8 +24637,7 @@
 #ifdef VK_EXT_post_depth_coverage
 #endif
 #ifdef VK_EXT_image_drm_format_modifier
-            case OP_vkGetImageDrmFormatModifierPropertiesEXT:
-            {
+            case OP_vkGetImageDrmFormatModifierPropertiesEXT: {
                 android::base::beginTrace("vkGetImageDrmFormatModifierPropertiesEXT decode");
                 VkDevice device;
                 VkImage image;
@@ -21263,42 +24656,58 @@
                 *(VkImage*)&image = (VkImage)unbox_VkImage((VkImage)(*&cgen_var_1));
                 // Begin manual dispatchable handle unboxing for pProperties;
                 vkReadStream->unsetHandleMapping();
-                vkReadStream->alloc((void**)&pProperties, sizeof(VkImageDrmFormatModifierPropertiesEXT));
-                reservedunmarshal_VkImageDrmFormatModifierPropertiesEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageDrmFormatModifierPropertiesEXT*)(pProperties), readStreamPtrPtr);
-                if (pProperties)
-                {
-                    transform_tohost_VkImageDrmFormatModifierPropertiesEXT(m_state, (VkImageDrmFormatModifierPropertiesEXT*)(pProperties));
+                vkReadStream->alloc((void**)&pProperties,
+                                    sizeof(VkImageDrmFormatModifierPropertiesEXT));
+                reservedunmarshal_VkImageDrmFormatModifierPropertiesEXT(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkImageDrmFormatModifierPropertiesEXT*)(pProperties), readStreamPtrPtr);
+                if (pProperties) {
+                    transform_tohost_VkImageDrmFormatModifierPropertiesEXT(
+                        m_state, (VkImageDrmFormatModifierPropertiesEXT*)(pProperties));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetImageDrmFormatModifierPropertiesEXT 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)image, (unsigned long long)pProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetImageDrmFormatModifierPropertiesEXT 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)image,
+                            (unsigned long long)pProperties);
                 }
                 VkResult vkGetImageDrmFormatModifierPropertiesEXT_VkResult_return = (VkResult)0;
-                vkGetImageDrmFormatModifierPropertiesEXT_VkResult_return = vk->vkGetImageDrmFormatModifierPropertiesEXT(unboxed_device, image, pProperties);
-                if ((vkGetImageDrmFormatModifierPropertiesEXT_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetImageDrmFormatModifierPropertiesEXT_VkResult_return =
+                    vk->vkGetImageDrmFormatModifierPropertiesEXT(unboxed_device, image,
+                                                                 pProperties);
+                if ((vkGetImageDrmFormatModifierPropertiesEXT_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                if (pProperties)
-                {
-                    transform_fromhost_VkImageDrmFormatModifierPropertiesEXT(m_state, (VkImageDrmFormatModifierPropertiesEXT*)(pProperties));
+                if (pProperties) {
+                    transform_fromhost_VkImageDrmFormatModifierPropertiesEXT(
+                        m_state, (VkImageDrmFormatModifierPropertiesEXT*)(pProperties));
                 }
-                marshal_VkImageDrmFormatModifierPropertiesEXT(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageDrmFormatModifierPropertiesEXT*)(pProperties));
-                vkStream->write(&vkGetImageDrmFormatModifierPropertiesEXT_VkResult_return, sizeof(VkResult));
+                marshal_VkImageDrmFormatModifierPropertiesEXT(
+                    vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkImageDrmFormatModifierPropertiesEXT*)(pProperties));
+                vkStream->write(&vkGetImageDrmFormatModifierPropertiesEXT_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetImageDrmFormatModifierPropertiesEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetImageDrmFormatModifierPropertiesEXT_VkResult_return, device, image, pProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetImageDrmFormatModifierPropertiesEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetImageDrmFormatModifierPropertiesEXT_VkResult_return, device, image,
+                        pProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_EXT_validation_cache
-            case OP_vkCreateValidationCacheEXT:
-            {
+            case OP_vkCreateValidationCacheEXT: {
                 android::base::beginTrace("vkCreateValidationCacheEXT decode");
                 VkDevice device;
                 const VkValidationCacheCreateInfoEXT* pCreateInfo;
@@ -21312,16 +24721,20 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkValidationCacheCreateInfoEXT));
-                reservedunmarshal_VkValidationCacheCreateInfoEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkValidationCacheCreateInfoEXT*)(pCreateInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pCreateInfo,
+                                    sizeof(const VkValidationCacheCreateInfoEXT));
+                reservedunmarshal_VkValidationCacheCreateInfoEXT(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkValidationCacheCreateInfoEXT*)(pCreateInfo), readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pValidationCache;
                 vkReadStream->unsetHandleMapping();
@@ -21329,46 +24742,60 @@
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkValidationCacheEXT*)pValidationCache = (VkValidationCacheEXT)(VkValidationCacheEXT)((VkValidationCacheEXT)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkValidationCacheCreateInfoEXT(m_state, (VkValidationCacheCreateInfoEXT*)(pCreateInfo));
+                *(VkValidationCacheEXT*)pValidationCache =
+                    (VkValidationCacheEXT)(VkValidationCacheEXT)((
+                        VkValidationCacheEXT)(*&cgen_var_2));
+                if (pCreateInfo) {
+                    transform_tohost_VkValidationCacheCreateInfoEXT(
+                        m_state, (VkValidationCacheCreateInfoEXT*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateValidationCacheEXT 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pValidationCache);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkCreateValidationCacheEXT 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                        (unsigned long long)pAllocator, (unsigned long long)pValidationCache);
                 }
                 VkResult vkCreateValidationCacheEXT_VkResult_return = (VkResult)0;
-                vkCreateValidationCacheEXT_VkResult_return = vk->vkCreateValidationCacheEXT(unboxed_device, pCreateInfo, pAllocator, pValidationCache);
-                if ((vkCreateValidationCacheEXT_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateValidationCacheEXT_VkResult_return = vk->vkCreateValidationCacheEXT(
+                    unboxed_device, pCreateInfo, pAllocator, pValidationCache);
+                if ((vkCreateValidationCacheEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // Begin auto non dispatchable handle create for pValidationCache;
-                if (vkCreateValidationCacheEXT_VkResult_return == VK_SUCCESS) vkStream->setHandleMapping(&m_boxedHandleCreateMapping);
+                if (vkCreateValidationCacheEXT_VkResult_return == VK_SUCCESS)
+                    vkStream->setHandleMapping(&m_boxedHandleCreateMapping);
                 uint64_t cgen_var_3;
-                static_assert(8 == sizeof(VkValidationCacheEXT), "handle map overwrite requires VkValidationCacheEXT to be 8 bytes long");
-                vkStream->handleMapping()->mapHandles_VkValidationCacheEXT((VkValidationCacheEXT*)pValidationCache, 1);
+                static_assert(
+                    8 == sizeof(VkValidationCacheEXT),
+                    "handle map overwrite requires VkValidationCacheEXT to be 8 bytes long");
+                vkStream->handleMapping()->mapHandles_VkValidationCacheEXT(
+                    (VkValidationCacheEXT*)pValidationCache, 1);
                 vkStream->write((VkValidationCacheEXT*)pValidationCache, 8 * 1);
                 // Begin auto non dispatchable handle create for pValidationCache;
                 vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
                 vkStream->write(&vkCreateValidationCacheEXT_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateValidationCacheEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateValidationCacheEXT_VkResult_return, device, pCreateInfo, pAllocator, pValidationCache);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateValidationCacheEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateValidationCacheEXT_VkResult_return, device, pCreateInfo, pAllocator,
+                        pValidationCache);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroyValidationCacheEXT:
-            {
+            case OP_vkDestroyValidationCacheEXT: {
                 android::base::beginTrace("vkDestroyValidationCacheEXT decode");
                 VkDevice device;
                 VkValidationCacheEXT validationCache;
@@ -21386,42 +24813,49 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkValidationCacheEXT*)&validationCache = (VkValidationCacheEXT)(VkValidationCacheEXT)((VkValidationCacheEXT)(*&cgen_var_1));
+                *(VkValidationCacheEXT*)&validationCache =
+                    (VkValidationCacheEXT)(VkValidationCacheEXT)((
+                        VkValidationCacheEXT)(*&cgen_var_1));
                 boxed_validationCache_preserve = validationCache;
                 validationCache = unbox_VkValidationCacheEXT(validationCache);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroyValidationCacheEXT 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)validationCache, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkDestroyValidationCacheEXT 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device,
+                            (unsigned long long)validationCache, (unsigned long long)pAllocator);
                 }
                 vk->vkDestroyValidationCacheEXT(unboxed_device, validationCache, pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroyValidationCacheEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, boxed_validationCache_preserve, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroyValidationCacheEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device,
+                        boxed_validationCache_preserve, pAllocator);
                 }
                 delete_VkValidationCacheEXT(boxed_validationCache_preserve);
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkMergeValidationCachesEXT:
-            {
+            case OP_vkMergeValidationCachesEXT: {
                 android::base::beginTrace("vkMergeValidationCachesEXT decode");
                 VkDevice device;
                 VkValidationCacheEXT dstCache;
@@ -21438,43 +24872,55 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkValidationCacheEXT*)&dstCache = (VkValidationCacheEXT)unbox_VkValidationCacheEXT((VkValidationCacheEXT)(*&cgen_var_1));
+                *(VkValidationCacheEXT*)&dstCache =
+                    (VkValidationCacheEXT)unbox_VkValidationCacheEXT(
+                        (VkValidationCacheEXT)(*&cgen_var_1));
                 memcpy((uint32_t*)&srcCacheCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pSrcCaches, ((srcCacheCount)) * sizeof(const VkValidationCacheEXT));
-                if (((srcCacheCount)))
-                {
+                vkReadStream->alloc((void**)&pSrcCaches,
+                                    ((srcCacheCount)) * sizeof(const VkValidationCacheEXT));
+                if (((srcCacheCount))) {
                     uint8_t* cgen_var_2_ptr = (uint8_t*)(*readStreamPtrPtr);
                     *readStreamPtrPtr += 8 * ((srcCacheCount));
-                    for (uint32_t k = 0; k < ((srcCacheCount)); ++k)
-                    {
-                        uint64_t tmpval; memcpy(&tmpval, cgen_var_2_ptr + k * 8, sizeof(uint64_t));
-                        *(((VkValidationCacheEXT*)pSrcCaches) + k) = (VkValidationCacheEXT)unbox_VkValidationCacheEXT((VkValidationCacheEXT)tmpval);
+                    for (uint32_t k = 0; k < ((srcCacheCount)); ++k) {
+                        uint64_t tmpval;
+                        memcpy(&tmpval, cgen_var_2_ptr + k * 8, sizeof(uint64_t));
+                        *(((VkValidationCacheEXT*)pSrcCaches) + k) =
+                            (VkValidationCacheEXT)unbox_VkValidationCacheEXT(
+                                (VkValidationCacheEXT)tmpval);
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkMergeValidationCachesEXT 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)dstCache, (unsigned long long)srcCacheCount, (unsigned long long)pSrcCaches);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkMergeValidationCachesEXT 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device, (unsigned long long)dstCache,
+                        (unsigned long long)srcCacheCount, (unsigned long long)pSrcCaches);
                 }
                 VkResult vkMergeValidationCachesEXT_VkResult_return = (VkResult)0;
-                vkMergeValidationCachesEXT_VkResult_return = vk->vkMergeValidationCachesEXT(unboxed_device, dstCache, srcCacheCount, pSrcCaches);
-                if ((vkMergeValidationCachesEXT_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkMergeValidationCachesEXT_VkResult_return = vk->vkMergeValidationCachesEXT(
+                    unboxed_device, dstCache, srcCacheCount, pSrcCaches);
+                if ((vkMergeValidationCachesEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkMergeValidationCachesEXT_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkMergeValidationCachesEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkMergeValidationCachesEXT_VkResult_return, device, dstCache, srcCacheCount, pSrcCaches);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkMergeValidationCachesEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkMergeValidationCachesEXT_VkResult_return, device, dstCache, srcCacheCount,
+                        pSrcCaches);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetValidationCacheDataEXT:
-            {
+            case OP_vkGetValidationCacheDataEXT: {
                 android::base::beginTrace("vkGetValidationCacheDataEXT decode");
                 VkDevice device;
                 VkValidationCacheEXT validationCache;
@@ -21491,15 +24937,16 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkValidationCacheEXT*)&validationCache = (VkValidationCacheEXT)unbox_VkValidationCacheEXT((VkValidationCacheEXT)(*&cgen_var_1));
+                *(VkValidationCacheEXT*)&validationCache =
+                    (VkValidationCacheEXT)unbox_VkValidationCacheEXT(
+                        (VkValidationCacheEXT)(*&cgen_var_1));
                 // Begin manual dispatchable handle unboxing for pDataSize;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 memcpy((size_t**)&pDataSize, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pDataSize);
                 *readStreamPtrPtr += 8;
-                if (pDataSize)
-                {
+                if (pDataSize) {
                     vkReadStream->alloc((void**)&pDataSize, sizeof(size_t));
                     memcpy((size_t*)&(*pDataSize), (*readStreamPtrPtr), 8);
                     android::base::Stream::fromBe64((uint8_t*)&(*pDataSize));
@@ -21511,45 +24958,52 @@
                 memcpy((void**)&pData, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pData);
                 *readStreamPtrPtr += 8;
-                if (pData)
-                {
+                if (pData) {
                     vkReadStream->alloc((void**)&pData, (*(pDataSize)) * sizeof(uint8_t));
                     memcpy((void*)pData, *readStreamPtrPtr, (*(pDataSize)) * sizeof(uint8_t));
                     *readStreamPtrPtr += (*(pDataSize)) * sizeof(uint8_t);
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetValidationCacheDataEXT 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)validationCache, (unsigned long long)pDataSize, (unsigned long long)pData);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetValidationCacheDataEXT 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)device,
+                            (unsigned long long)validationCache, (unsigned long long)pDataSize,
+                            (unsigned long long)pData);
                 }
                 VkResult vkGetValidationCacheDataEXT_VkResult_return = (VkResult)0;
-                vkGetValidationCacheDataEXT_VkResult_return = vk->vkGetValidationCacheDataEXT(unboxed_device, validationCache, pDataSize, pData);
-                if ((vkGetValidationCacheDataEXT_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetValidationCacheDataEXT_VkResult_return = vk->vkGetValidationCacheDataEXT(
+                    unboxed_device, validationCache, pDataSize, pData);
+                if ((vkGetValidationCacheDataEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pDataSize;
                 vkStream->putBe64(cgen_var_4);
-                if (pDataSize)
-                {
+                if (pDataSize) {
                     uint64_t cgen_var_4_0 = (uint64_t)(*pDataSize);
                     vkStream->putBe64(cgen_var_4_0);
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_5 = (uint64_t)(uintptr_t)pData;
                 vkStream->putBe64(cgen_var_5);
-                if (pData)
-                {
+                if (pData) {
                     vkStream->write((void*)pData, (*(pDataSize)) * sizeof(uint8_t));
                 }
                 vkStream->write(&vkGetValidationCacheDataEXT_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetValidationCacheDataEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetValidationCacheDataEXT_VkResult_return, device, validationCache, pDataSize, pData);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetValidationCacheDataEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetValidationCacheDataEXT_VkResult_return, device, validationCache,
+                        pDataSize, pData);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -21559,8 +25013,7 @@
 #ifdef VK_EXT_shader_viewport_index_layer
 #endif
 #ifdef VK_NV_shading_rate_image
-            case OP_vkCmdBindShadingRateImageNV:
-            {
+            case OP_vkCmdBindShadingRateImageNV: {
                 android::base::beginTrace("vkCmdBindShadingRateImageNV decode");
                 VkCommandBuffer commandBuffer;
                 VkImageView imageView;
@@ -21569,35 +25022,41 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkImageView*)&imageView = (VkImageView)unbox_VkImageView((VkImageView)(*&cgen_var_1));
+                *(VkImageView*)&imageView =
+                    (VkImageView)unbox_VkImageView((VkImageView)(*&cgen_var_1));
                 memcpy((VkImageLayout*)&imageLayout, *readStreamPtrPtr, sizeof(VkImageLayout));
                 *readStreamPtrPtr += sizeof(VkImageLayout);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdBindShadingRateImageNV 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)imageView, (unsigned long long)imageLayout);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdBindShadingRateImageNV 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)imageView, (unsigned long long)imageLayout);
                 }
                 vk->vkCmdBindShadingRateImageNV(unboxed_commandBuffer, imageView, imageLayout);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdBindShadingRateImageNV(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, imageView, imageLayout);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdBindShadingRateImageNV(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, imageView,
+                        imageLayout);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetViewportShadingRatePaletteNV:
-            {
+            case OP_vkCmdSetViewportShadingRatePaletteNV: {
                 android::base::beginTrace("vkCmdSetViewportShadingRatePaletteNV decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t firstViewport;
@@ -21607,7 +25066,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -21615,37 +25075,45 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&viewportCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pShadingRatePalettes, ((viewportCount)) * sizeof(const VkShadingRatePaletteNV));
-                for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i)
-                {
-                    reservedunmarshal_VkShadingRatePaletteNV(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkShadingRatePaletteNV*)(pShadingRatePalettes + i), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pShadingRatePalettes,
+                                    ((viewportCount)) * sizeof(const VkShadingRatePaletteNV));
+                for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i) {
+                    reservedunmarshal_VkShadingRatePaletteNV(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkShadingRatePaletteNV*)(pShadingRatePalettes + i), readStreamPtrPtr);
                 }
-                if (pShadingRatePalettes)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i)
-                    {
-                        transform_tohost_VkShadingRatePaletteNV(m_state, (VkShadingRatePaletteNV*)(pShadingRatePalettes + i));
+                if (pShadingRatePalettes) {
+                    for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i) {
+                        transform_tohost_VkShadingRatePaletteNV(
+                            m_state, (VkShadingRatePaletteNV*)(pShadingRatePalettes + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetViewportShadingRatePaletteNV 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)firstViewport, (unsigned long long)viewportCount, (unsigned long long)pShadingRatePalettes);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdSetViewportShadingRatePaletteNV 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)firstViewport, (unsigned long long)viewportCount,
+                            (unsigned long long)pShadingRatePalettes);
                 }
-                vk->vkCmdSetViewportShadingRatePaletteNV(unboxed_commandBuffer, firstViewport, viewportCount, pShadingRatePalettes);
+                vk->vkCmdSetViewportShadingRatePaletteNV(unboxed_commandBuffer, firstViewport,
+                                                         viewportCount, pShadingRatePalettes);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetViewportShadingRatePaletteNV(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, firstViewport, viewportCount, pShadingRatePalettes);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetViewportShadingRatePaletteNV(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        firstViewport, viewportCount, pShadingRatePalettes);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetCoarseSampleOrderNV:
-            {
+            case OP_vkCmdSetCoarseSampleOrderNV: {
                 android::base::beginTrace("vkCmdSetCoarseSampleOrderNV decode");
                 VkCommandBuffer commandBuffer;
                 VkCoarseSampleOrderTypeNV sampleOrderType;
@@ -21655,47 +25123,59 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
-                memcpy((VkCoarseSampleOrderTypeNV*)&sampleOrderType, *readStreamPtrPtr, sizeof(VkCoarseSampleOrderTypeNV));
+                memcpy((VkCoarseSampleOrderTypeNV*)&sampleOrderType, *readStreamPtrPtr,
+                       sizeof(VkCoarseSampleOrderTypeNV));
                 *readStreamPtrPtr += sizeof(VkCoarseSampleOrderTypeNV);
                 memcpy((uint32_t*)&customSampleOrderCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pCustomSampleOrders, ((customSampleOrderCount)) * sizeof(const VkCoarseSampleOrderCustomNV));
-                for (uint32_t i = 0; i < (uint32_t)((customSampleOrderCount)); ++i)
-                {
-                    reservedunmarshal_VkCoarseSampleOrderCustomNV(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCoarseSampleOrderCustomNV*)(pCustomSampleOrders + i), readStreamPtrPtr);
+                vkReadStream->alloc(
+                    (void**)&pCustomSampleOrders,
+                    ((customSampleOrderCount)) * sizeof(const VkCoarseSampleOrderCustomNV));
+                for (uint32_t i = 0; i < (uint32_t)((customSampleOrderCount)); ++i) {
+                    reservedunmarshal_VkCoarseSampleOrderCustomNV(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkCoarseSampleOrderCustomNV*)(pCustomSampleOrders + i), readStreamPtrPtr);
                 }
-                if (pCustomSampleOrders)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((customSampleOrderCount)); ++i)
-                    {
-                        transform_tohost_VkCoarseSampleOrderCustomNV(m_state, (VkCoarseSampleOrderCustomNV*)(pCustomSampleOrders + i));
+                if (pCustomSampleOrders) {
+                    for (uint32_t i = 0; i < (uint32_t)((customSampleOrderCount)); ++i) {
+                        transform_tohost_VkCoarseSampleOrderCustomNV(
+                            m_state, (VkCoarseSampleOrderCustomNV*)(pCustomSampleOrders + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetCoarseSampleOrderNV 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)sampleOrderType, (unsigned long long)customSampleOrderCount, (unsigned long long)pCustomSampleOrders);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdSetCoarseSampleOrderNV 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)sampleOrderType,
+                            (unsigned long long)customSampleOrderCount,
+                            (unsigned long long)pCustomSampleOrders);
                 }
-                vk->vkCmdSetCoarseSampleOrderNV(unboxed_commandBuffer, sampleOrderType, customSampleOrderCount, pCustomSampleOrders);
+                vk->vkCmdSetCoarseSampleOrderNV(unboxed_commandBuffer, sampleOrderType,
+                                                customSampleOrderCount, pCustomSampleOrders);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetCoarseSampleOrderNV(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, sampleOrderType, customSampleOrderCount, pCustomSampleOrders);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetCoarseSampleOrderNV(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        sampleOrderType, customSampleOrderCount, pCustomSampleOrders);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_NV_ray_tracing
-            case OP_vkCreateAccelerationStructureNV:
-            {
+            case OP_vkCreateAccelerationStructureNV: {
                 android::base::beginTrace("vkCreateAccelerationStructureNV decode");
                 VkDevice device;
                 const VkAccelerationStructureCreateInfoNV* pCreateInfo;
@@ -21709,63 +25189,84 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkAccelerationStructureCreateInfoNV));
-                reservedunmarshal_VkAccelerationStructureCreateInfoNV(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureCreateInfoNV*)(pCreateInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pCreateInfo,
+                                    sizeof(const VkAccelerationStructureCreateInfoNV));
+                reservedunmarshal_VkAccelerationStructureCreateInfoNV(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkAccelerationStructureCreateInfoNV*)(pCreateInfo), readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pAccelerationStructure;
                 vkReadStream->unsetHandleMapping();
-                vkReadStream->alloc((void**)&pAccelerationStructure, sizeof(VkAccelerationStructureNV));
+                vkReadStream->alloc((void**)&pAccelerationStructure,
+                                    sizeof(VkAccelerationStructureNV));
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkAccelerationStructureNV*)pAccelerationStructure = (VkAccelerationStructureNV)(VkAccelerationStructureNV)((VkAccelerationStructureNV)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkAccelerationStructureCreateInfoNV(m_state, (VkAccelerationStructureCreateInfoNV*)(pCreateInfo));
+                *(VkAccelerationStructureNV*)pAccelerationStructure =
+                    (VkAccelerationStructureNV)(VkAccelerationStructureNV)((
+                        VkAccelerationStructureNV)(*&cgen_var_2));
+                if (pCreateInfo) {
+                    transform_tohost_VkAccelerationStructureCreateInfoNV(
+                        m_state, (VkAccelerationStructureCreateInfoNV*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateAccelerationStructureNV 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pAccelerationStructure);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateAccelerationStructureNV 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator,
+                            (unsigned long long)pAccelerationStructure);
                 }
                 VkResult vkCreateAccelerationStructureNV_VkResult_return = (VkResult)0;
-                vkCreateAccelerationStructureNV_VkResult_return = vk->vkCreateAccelerationStructureNV(unboxed_device, pCreateInfo, pAllocator, pAccelerationStructure);
-                if ((vkCreateAccelerationStructureNV_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateAccelerationStructureNV_VkResult_return =
+                    vk->vkCreateAccelerationStructureNV(unboxed_device, pCreateInfo, pAllocator,
+                                                        pAccelerationStructure);
+                if ((vkCreateAccelerationStructureNV_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // Begin auto non dispatchable handle create for pAccelerationStructure;
-                if (vkCreateAccelerationStructureNV_VkResult_return == VK_SUCCESS) vkStream->setHandleMapping(&m_boxedHandleCreateMapping);
+                if (vkCreateAccelerationStructureNV_VkResult_return == VK_SUCCESS)
+                    vkStream->setHandleMapping(&m_boxedHandleCreateMapping);
                 uint64_t cgen_var_3;
-                static_assert(8 == sizeof(VkAccelerationStructureNV), "handle map overwrite requires VkAccelerationStructureNV to be 8 bytes long");
-                vkStream->handleMapping()->mapHandles_VkAccelerationStructureNV((VkAccelerationStructureNV*)pAccelerationStructure, 1);
+                static_assert(
+                    8 == sizeof(VkAccelerationStructureNV),
+                    "handle map overwrite requires VkAccelerationStructureNV to be 8 bytes long");
+                vkStream->handleMapping()->mapHandles_VkAccelerationStructureNV(
+                    (VkAccelerationStructureNV*)pAccelerationStructure, 1);
                 vkStream->write((VkAccelerationStructureNV*)pAccelerationStructure, 8 * 1);
                 // Begin auto non dispatchable handle create for pAccelerationStructure;
                 vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
                 vkStream->write(&vkCreateAccelerationStructureNV_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateAccelerationStructureNV(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateAccelerationStructureNV_VkResult_return, device, pCreateInfo, pAllocator, pAccelerationStructure);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateAccelerationStructureNV(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateAccelerationStructureNV_VkResult_return, device, pCreateInfo,
+                        pAllocator, pAccelerationStructure);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroyAccelerationStructureNV:
-            {
+            case OP_vkDestroyAccelerationStructureNV: {
                 android::base::beginTrace("vkDestroyAccelerationStructureNV decode");
                 VkDevice device;
                 VkAccelerationStructureNV accelerationStructure;
@@ -21783,42 +25284,51 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkAccelerationStructureNV*)&accelerationStructure = (VkAccelerationStructureNV)(VkAccelerationStructureNV)((VkAccelerationStructureNV)(*&cgen_var_1));
+                *(VkAccelerationStructureNV*)&accelerationStructure =
+                    (VkAccelerationStructureNV)(VkAccelerationStructureNV)((
+                        VkAccelerationStructureNV)(*&cgen_var_1));
                 boxed_accelerationStructure_preserve = accelerationStructure;
                 accelerationStructure = unbox_VkAccelerationStructureNV(accelerationStructure);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroyAccelerationStructureNV 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)accelerationStructure, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkDestroyAccelerationStructureNV 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device,
+                        (unsigned long long)accelerationStructure, (unsigned long long)pAllocator);
                 }
-                vk->vkDestroyAccelerationStructureNV(unboxed_device, accelerationStructure, pAllocator);
+                vk->vkDestroyAccelerationStructureNV(unboxed_device, accelerationStructure,
+                                                     pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroyAccelerationStructureNV(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, boxed_accelerationStructure_preserve, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroyAccelerationStructureNV(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device,
+                        boxed_accelerationStructure_preserve, pAllocator);
                 }
                 delete_VkAccelerationStructureNV(boxed_accelerationStructure_preserve);
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetAccelerationStructureMemoryRequirementsNV:
-            {
+            case OP_vkGetAccelerationStructureMemoryRequirementsNV: {
                 android::base::beginTrace("vkGetAccelerationStructureMemoryRequirementsNV decode");
                 VkDevice device;
                 const VkAccelerationStructureMemoryRequirementsInfoNV* pInfo;
@@ -21831,45 +25341,57 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pInfo, sizeof(const VkAccelerationStructureMemoryRequirementsInfoNV));
-                reservedunmarshal_VkAccelerationStructureMemoryRequirementsInfoNV(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureMemoryRequirementsInfoNV*)(pInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pInfo,
+                                    sizeof(const VkAccelerationStructureMemoryRequirementsInfoNV));
+                reservedunmarshal_VkAccelerationStructureMemoryRequirementsInfoNV(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkAccelerationStructureMemoryRequirementsInfoNV*)(pInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pMemoryRequirements;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pMemoryRequirements, sizeof(VkMemoryRequirements2KHR));
-                reservedunmarshal_VkMemoryRequirements2KHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements2KHR*)(pMemoryRequirements), readStreamPtrPtr);
-                if (pInfo)
-                {
-                    transform_tohost_VkAccelerationStructureMemoryRequirementsInfoNV(m_state, (VkAccelerationStructureMemoryRequirementsInfoNV*)(pInfo));
+                reservedunmarshal_VkMemoryRequirements2KHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkMemoryRequirements2KHR*)(pMemoryRequirements), readStreamPtrPtr);
+                if (pInfo) {
+                    transform_tohost_VkAccelerationStructureMemoryRequirementsInfoNV(
+                        m_state, (VkAccelerationStructureMemoryRequirementsInfoNV*)(pInfo));
                 }
-                if (pMemoryRequirements)
-                {
-                    transform_tohost_VkMemoryRequirements2KHR(m_state, (VkMemoryRequirements2KHR*)(pMemoryRequirements));
+                if (pMemoryRequirements) {
+                    transform_tohost_VkMemoryRequirements2KHR(
+                        m_state, (VkMemoryRequirements2KHR*)(pMemoryRequirements));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetAccelerationStructureMemoryRequirementsNV 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pInfo, (unsigned long long)pMemoryRequirements);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetAccelerationStructureMemoryRequirementsNV 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pInfo,
+                            (unsigned long long)pMemoryRequirements);
                 }
-                vk->vkGetAccelerationStructureMemoryRequirementsNV(unboxed_device, pInfo, pMemoryRequirements);
+                vk->vkGetAccelerationStructureMemoryRequirementsNV(unboxed_device, pInfo,
+                                                                   pMemoryRequirements);
                 vkStream->unsetHandleMapping();
-                if (pMemoryRequirements)
-                {
-                    transform_fromhost_VkMemoryRequirements2KHR(m_state, (VkMemoryRequirements2KHR*)(pMemoryRequirements));
+                if (pMemoryRequirements) {
+                    transform_fromhost_VkMemoryRequirements2KHR(
+                        m_state, (VkMemoryRequirements2KHR*)(pMemoryRequirements));
                 }
-                marshal_VkMemoryRequirements2KHR(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements2KHR*)(pMemoryRequirements));
+                marshal_VkMemoryRequirements2KHR(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                 (VkMemoryRequirements2KHR*)(pMemoryRequirements));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetAccelerationStructureMemoryRequirementsNV(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, pInfo, pMemoryRequirements);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetAccelerationStructureMemoryRequirementsNV(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, pInfo,
+                        pMemoryRequirements);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkBindAccelerationStructureMemoryNV:
-            {
+            case OP_vkBindAccelerationStructureMemoryNV: {
                 android::base::beginTrace("vkBindAccelerationStructureMemoryNV decode");
                 VkDevice device;
                 uint32_t bindInfoCount;
@@ -21884,41 +25406,54 @@
                 // End manual dispatchable handle unboxing for device;
                 memcpy((uint32_t*)&bindInfoCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pBindInfos, ((bindInfoCount)) * sizeof(const VkBindAccelerationStructureMemoryInfoNV));
-                for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
-                {
-                    reservedunmarshal_VkBindAccelerationStructureMemoryInfoNV(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBindAccelerationStructureMemoryInfoNV*)(pBindInfos + i), readStreamPtrPtr);
+                vkReadStream->alloc(
+                    (void**)&pBindInfos,
+                    ((bindInfoCount)) * sizeof(const VkBindAccelerationStructureMemoryInfoNV));
+                for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
+                    reservedunmarshal_VkBindAccelerationStructureMemoryInfoNV(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkBindAccelerationStructureMemoryInfoNV*)(pBindInfos + i),
+                        readStreamPtrPtr);
                 }
-                if (pBindInfos)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
-                    {
-                        transform_tohost_VkBindAccelerationStructureMemoryInfoNV(m_state, (VkBindAccelerationStructureMemoryInfoNV*)(pBindInfos + i));
+                if (pBindInfos) {
+                    for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
+                        transform_tohost_VkBindAccelerationStructureMemoryInfoNV(
+                            m_state, (VkBindAccelerationStructureMemoryInfoNV*)(pBindInfos + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkBindAccelerationStructureMemoryNV 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)bindInfoCount, (unsigned long long)pBindInfos);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkBindAccelerationStructureMemoryNV 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)bindInfoCount,
+                            (unsigned long long)pBindInfos);
                 }
                 VkResult vkBindAccelerationStructureMemoryNV_VkResult_return = (VkResult)0;
-                vkBindAccelerationStructureMemoryNV_VkResult_return = vk->vkBindAccelerationStructureMemoryNV(unboxed_device, bindInfoCount, pBindInfos);
-                if ((vkBindAccelerationStructureMemoryNV_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkBindAccelerationStructureMemoryNV_VkResult_return =
+                    vk->vkBindAccelerationStructureMemoryNV(unboxed_device, bindInfoCount,
+                                                            pBindInfos);
+                if ((vkBindAccelerationStructureMemoryNV_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                vkStream->write(&vkBindAccelerationStructureMemoryNV_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkBindAccelerationStructureMemoryNV_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkBindAccelerationStructureMemoryNV(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkBindAccelerationStructureMemoryNV_VkResult_return, device, bindInfoCount, pBindInfos);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkBindAccelerationStructureMemoryNV(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkBindAccelerationStructureMemoryNV_VkResult_return, device, bindInfoCount,
+                        pBindInfos);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdBuildAccelerationStructureNV:
-            {
+            case OP_vkCmdBuildAccelerationStructureNV: {
                 android::base::beginTrace("vkCmdBuildAccelerationStructureNV decode");
                 VkCommandBuffer commandBuffer;
                 const VkAccelerationStructureInfoNV* pInfo;
@@ -21933,12 +25468,15 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 vkReadStream->alloc((void**)&pInfo, sizeof(const VkAccelerationStructureInfoNV));
-                reservedunmarshal_VkAccelerationStructureInfoNV(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureInfoNV*)(pInfo), readStreamPtrPtr);
+                reservedunmarshal_VkAccelerationStructureInfoNV(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkAccelerationStructureInfoNV*)(pInfo), readStreamPtrPtr);
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
@@ -21950,40 +25488,54 @@
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkAccelerationStructureNV*)&dst = (VkAccelerationStructureNV)unbox_VkAccelerationStructureNV((VkAccelerationStructureNV)(*&cgen_var_2));
+                *(VkAccelerationStructureNV*)&dst =
+                    (VkAccelerationStructureNV)unbox_VkAccelerationStructureNV(
+                        (VkAccelerationStructureNV)(*&cgen_var_2));
                 uint64_t cgen_var_3;
                 memcpy((uint64_t*)&cgen_var_3, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkAccelerationStructureNV*)&src = (VkAccelerationStructureNV)unbox_VkAccelerationStructureNV((VkAccelerationStructureNV)(*&cgen_var_3));
+                *(VkAccelerationStructureNV*)&src =
+                    (VkAccelerationStructureNV)unbox_VkAccelerationStructureNV(
+                        (VkAccelerationStructureNV)(*&cgen_var_3));
                 uint64_t cgen_var_4;
                 memcpy((uint64_t*)&cgen_var_4, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkBuffer*)&scratch = (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_4));
                 memcpy((VkDeviceSize*)&scratchOffset, *readStreamPtrPtr, sizeof(VkDeviceSize));
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
-                if (pInfo)
-                {
-                    transform_tohost_VkAccelerationStructureInfoNV(m_state, (VkAccelerationStructureInfoNV*)(pInfo));
+                if (pInfo) {
+                    transform_tohost_VkAccelerationStructureInfoNV(
+                        m_state, (VkAccelerationStructureInfoNV*)(pInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdBuildAccelerationStructureNV 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pInfo, (unsigned long long)instanceData, (unsigned long long)instanceOffset, (unsigned long long)update, (unsigned long long)dst, (unsigned long long)src, (unsigned long long)scratch, (unsigned long long)scratchOffset);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdBuildAccelerationStructureNV 0x%llx 0x%llx "
+                            "0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer, (unsigned long long)pInfo,
+                            (unsigned long long)instanceData, (unsigned long long)instanceOffset,
+                            (unsigned long long)update, (unsigned long long)dst,
+                            (unsigned long long)src, (unsigned long long)scratch,
+                            (unsigned long long)scratchOffset);
                 }
-                vk->vkCmdBuildAccelerationStructureNV(unboxed_commandBuffer, pInfo, instanceData, instanceOffset, update, dst, src, scratch, scratchOffset);
+                vk->vkCmdBuildAccelerationStructureNV(unboxed_commandBuffer, pInfo, instanceData,
+                                                      instanceOffset, update, dst, src, scratch,
+                                                      scratchOffset);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdBuildAccelerationStructureNV(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pInfo, instanceData, instanceOffset, update, dst, src, scratch, scratchOffset);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdBuildAccelerationStructureNV(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pInfo,
+                        instanceData, instanceOffset, update, dst, src, scratch, scratchOffset);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdCopyAccelerationStructureNV:
-            {
+            case OP_vkCmdCopyAccelerationStructureNV: {
                 android::base::beginTrace("vkCmdCopyAccelerationStructureNV decode");
                 VkCommandBuffer commandBuffer;
                 VkAccelerationStructureNV dst;
@@ -21993,39 +25545,50 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkAccelerationStructureNV*)&dst = (VkAccelerationStructureNV)unbox_VkAccelerationStructureNV((VkAccelerationStructureNV)(*&cgen_var_1));
+                *(VkAccelerationStructureNV*)&dst =
+                    (VkAccelerationStructureNV)unbox_VkAccelerationStructureNV(
+                        (VkAccelerationStructureNV)(*&cgen_var_1));
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkAccelerationStructureNV*)&src = (VkAccelerationStructureNV)unbox_VkAccelerationStructureNV((VkAccelerationStructureNV)(*&cgen_var_2));
-                memcpy((VkCopyAccelerationStructureModeKHR*)&mode, *readStreamPtrPtr, sizeof(VkCopyAccelerationStructureModeKHR));
+                *(VkAccelerationStructureNV*)&src =
+                    (VkAccelerationStructureNV)unbox_VkAccelerationStructureNV(
+                        (VkAccelerationStructureNV)(*&cgen_var_2));
+                memcpy((VkCopyAccelerationStructureModeKHR*)&mode, *readStreamPtrPtr,
+                       sizeof(VkCopyAccelerationStructureModeKHR));
                 *readStreamPtrPtr += sizeof(VkCopyAccelerationStructureModeKHR);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdCopyAccelerationStructureNV 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)dst, (unsigned long long)src, (unsigned long long)mode);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdCopyAccelerationStructureNV 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer, (unsigned long long)dst,
+                            (unsigned long long)src, (unsigned long long)mode);
                 }
                 vk->vkCmdCopyAccelerationStructureNV(unboxed_commandBuffer, dst, src, mode);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdCopyAccelerationStructureNV(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, dst, src, mode);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdCopyAccelerationStructureNV(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, dst, src,
+                        mode);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdTraceRaysNV:
-            {
+            case OP_vkCmdTraceRaysNV: {
                 android::base::beginTrace("vkCmdTraceRaysNV decode");
                 VkCommandBuffer commandBuffer;
                 VkBuffer raygenShaderBindingTableBuffer;
@@ -22046,39 +25609,51 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkBuffer*)&raygenShaderBindingTableBuffer = (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_1));
-                memcpy((VkDeviceSize*)&raygenShaderBindingOffset, *readStreamPtrPtr, sizeof(VkDeviceSize));
+                *(VkBuffer*)&raygenShaderBindingTableBuffer =
+                    (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_1));
+                memcpy((VkDeviceSize*)&raygenShaderBindingOffset, *readStreamPtrPtr,
+                       sizeof(VkDeviceSize));
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkBuffer*)&missShaderBindingTableBuffer = (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_2));
-                memcpy((VkDeviceSize*)&missShaderBindingOffset, *readStreamPtrPtr, sizeof(VkDeviceSize));
+                *(VkBuffer*)&missShaderBindingTableBuffer =
+                    (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_2));
+                memcpy((VkDeviceSize*)&missShaderBindingOffset, *readStreamPtrPtr,
+                       sizeof(VkDeviceSize));
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
-                memcpy((VkDeviceSize*)&missShaderBindingStride, *readStreamPtrPtr, sizeof(VkDeviceSize));
+                memcpy((VkDeviceSize*)&missShaderBindingStride, *readStreamPtrPtr,
+                       sizeof(VkDeviceSize));
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
                 uint64_t cgen_var_3;
                 memcpy((uint64_t*)&cgen_var_3, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkBuffer*)&hitShaderBindingTableBuffer = (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_3));
-                memcpy((VkDeviceSize*)&hitShaderBindingOffset, *readStreamPtrPtr, sizeof(VkDeviceSize));
+                *(VkBuffer*)&hitShaderBindingTableBuffer =
+                    (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_3));
+                memcpy((VkDeviceSize*)&hitShaderBindingOffset, *readStreamPtrPtr,
+                       sizeof(VkDeviceSize));
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
-                memcpy((VkDeviceSize*)&hitShaderBindingStride, *readStreamPtrPtr, sizeof(VkDeviceSize));
+                memcpy((VkDeviceSize*)&hitShaderBindingStride, *readStreamPtrPtr,
+                       sizeof(VkDeviceSize));
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
                 uint64_t cgen_var_4;
                 memcpy((uint64_t*)&cgen_var_4, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkBuffer*)&callableShaderBindingTableBuffer = (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_4));
-                memcpy((VkDeviceSize*)&callableShaderBindingOffset, *readStreamPtrPtr, sizeof(VkDeviceSize));
+                *(VkBuffer*)&callableShaderBindingTableBuffer =
+                    (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_4));
+                memcpy((VkDeviceSize*)&callableShaderBindingOffset, *readStreamPtrPtr,
+                       sizeof(VkDeviceSize));
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
-                memcpy((VkDeviceSize*)&callableShaderBindingStride, *readStreamPtrPtr, sizeof(VkDeviceSize));
+                memcpy((VkDeviceSize*)&callableShaderBindingStride, *readStreamPtrPtr,
+                       sizeof(VkDeviceSize));
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
                 memcpy((uint32_t*)&width, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
@@ -22086,25 +25661,53 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&depth, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdTraceRaysNV 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)raygenShaderBindingTableBuffer, (unsigned long long)raygenShaderBindingOffset, (unsigned long long)missShaderBindingTableBuffer, (unsigned long long)missShaderBindingOffset, (unsigned long long)missShaderBindingStride, (unsigned long long)hitShaderBindingTableBuffer, (unsigned long long)hitShaderBindingOffset, (unsigned long long)hitShaderBindingStride, (unsigned long long)callableShaderBindingTableBuffer, (unsigned long long)callableShaderBindingOffset, (unsigned long long)callableShaderBindingStride, (unsigned long long)width, (unsigned long long)height, (unsigned long long)depth);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkCmdTraceRaysNV 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx "
+                        "0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)commandBuffer,
+                        (unsigned long long)raygenShaderBindingTableBuffer,
+                        (unsigned long long)raygenShaderBindingOffset,
+                        (unsigned long long)missShaderBindingTableBuffer,
+                        (unsigned long long)missShaderBindingOffset,
+                        (unsigned long long)missShaderBindingStride,
+                        (unsigned long long)hitShaderBindingTableBuffer,
+                        (unsigned long long)hitShaderBindingOffset,
+                        (unsigned long long)hitShaderBindingStride,
+                        (unsigned long long)callableShaderBindingTableBuffer,
+                        (unsigned long long)callableShaderBindingOffset,
+                        (unsigned long long)callableShaderBindingStride, (unsigned long long)width,
+                        (unsigned long long)height, (unsigned long long)depth);
                 }
-                vk->vkCmdTraceRaysNV(unboxed_commandBuffer, raygenShaderBindingTableBuffer, raygenShaderBindingOffset, missShaderBindingTableBuffer, missShaderBindingOffset, missShaderBindingStride, hitShaderBindingTableBuffer, hitShaderBindingOffset, hitShaderBindingStride, callableShaderBindingTableBuffer, callableShaderBindingOffset, callableShaderBindingStride, width, height, depth);
+                vk->vkCmdTraceRaysNV(unboxed_commandBuffer, raygenShaderBindingTableBuffer,
+                                     raygenShaderBindingOffset, missShaderBindingTableBuffer,
+                                     missShaderBindingOffset, missShaderBindingStride,
+                                     hitShaderBindingTableBuffer, hitShaderBindingOffset,
+                                     hitShaderBindingStride, callableShaderBindingTableBuffer,
+                                     callableShaderBindingOffset, callableShaderBindingStride,
+                                     width, height, depth);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdTraceRaysNV(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, raygenShaderBindingTableBuffer, raygenShaderBindingOffset, missShaderBindingTableBuffer, missShaderBindingOffset, missShaderBindingStride, hitShaderBindingTableBuffer, hitShaderBindingOffset, hitShaderBindingStride, callableShaderBindingTableBuffer, callableShaderBindingOffset, callableShaderBindingStride, width, height, depth);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdTraceRaysNV(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        raygenShaderBindingTableBuffer, raygenShaderBindingOffset,
+                        missShaderBindingTableBuffer, missShaderBindingOffset,
+                        missShaderBindingStride, hitShaderBindingTableBuffer,
+                        hitShaderBindingOffset, hitShaderBindingStride,
+                        callableShaderBindingTableBuffer, callableShaderBindingOffset,
+                        callableShaderBindingStride, width, height, depth);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCreateRayTracingPipelinesNV:
-            {
+            case OP_vkCreateRayTracingPipelinesNV: {
                 android::base::beginTrace("vkCreateRayTracingPipelinesNV decode");
                 VkDevice device;
                 VkPipelineCache pipelineCache;
@@ -22123,77 +25726,91 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPipelineCache*)&pipelineCache = (VkPipelineCache)unbox_VkPipelineCache((VkPipelineCache)(*&cgen_var_1));
+                *(VkPipelineCache*)&pipelineCache =
+                    (VkPipelineCache)unbox_VkPipelineCache((VkPipelineCache)(*&cgen_var_1));
                 memcpy((uint32_t*)&createInfoCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pCreateInfos, ((createInfoCount)) * sizeof(const VkRayTracingPipelineCreateInfoNV));
-                for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i)
-                {
-                    reservedunmarshal_VkRayTracingPipelineCreateInfoNV(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRayTracingPipelineCreateInfoNV*)(pCreateInfos + i), readStreamPtrPtr);
+                vkReadStream->alloc(
+                    (void**)&pCreateInfos,
+                    ((createInfoCount)) * sizeof(const VkRayTracingPipelineCreateInfoNV));
+                for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i) {
+                    reservedunmarshal_VkRayTracingPipelineCreateInfoNV(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkRayTracingPipelineCreateInfoNV*)(pCreateInfos + i), readStreamPtrPtr);
                 }
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pPipelines;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pPipelines, ((createInfoCount)) * sizeof(VkPipeline));
-                if (((createInfoCount)))
-                {
+                if (((createInfoCount))) {
                     uint8_t* cgen_var_3_ptr = (uint8_t*)(*readStreamPtrPtr);
                     *readStreamPtrPtr += 8 * ((createInfoCount));
-                    for (uint32_t k = 0; k < ((createInfoCount)); ++k)
-                    {
-                        uint64_t tmpval; memcpy(&tmpval, cgen_var_3_ptr + k * 8, sizeof(uint64_t));
-                        *(((VkPipeline*)pPipelines) + k) = (VkPipeline)(VkPipeline)((VkPipeline)tmpval);
+                    for (uint32_t k = 0; k < ((createInfoCount)); ++k) {
+                        uint64_t tmpval;
+                        memcpy(&tmpval, cgen_var_3_ptr + k * 8, sizeof(uint64_t));
+                        *(((VkPipeline*)pPipelines) + k) =
+                            (VkPipeline)(VkPipeline)((VkPipeline)tmpval);
                     }
                 }
-                if (pCreateInfos)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i)
-                    {
-                        transform_tohost_VkRayTracingPipelineCreateInfoNV(m_state, (VkRayTracingPipelineCreateInfoNV*)(pCreateInfos + i));
+                if (pCreateInfos) {
+                    for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i) {
+                        transform_tohost_VkRayTracingPipelineCreateInfoNV(
+                            m_state, (VkRayTracingPipelineCreateInfoNV*)(pCreateInfos + i));
                     }
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateRayTracingPipelinesNV 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pipelineCache, (unsigned long long)createInfoCount, (unsigned long long)pCreateInfos, (unsigned long long)pAllocator, (unsigned long long)pPipelines);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateRayTracingPipelinesNV 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pipelineCache,
+                            (unsigned long long)createInfoCount, (unsigned long long)pCreateInfos,
+                            (unsigned long long)pAllocator, (unsigned long long)pPipelines);
                 }
                 VkResult vkCreateRayTracingPipelinesNV_VkResult_return = (VkResult)0;
-                vkCreateRayTracingPipelinesNV_VkResult_return = vk->vkCreateRayTracingPipelinesNV(unboxed_device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
-                if ((vkCreateRayTracingPipelinesNV_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateRayTracingPipelinesNV_VkResult_return = vk->vkCreateRayTracingPipelinesNV(
+                    unboxed_device, pipelineCache, createInfoCount, pCreateInfos, pAllocator,
+                    pPipelines);
+                if ((vkCreateRayTracingPipelinesNV_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                if (((createInfoCount)))
-                {
+                if (((createInfoCount))) {
                     uint64_t* cgen_var_4;
                     vkStream->alloc((void**)&cgen_var_4, ((createInfoCount)) * 8);
-                    vkStream->handleMapping()->mapHandles_VkPipeline_u64(pPipelines, cgen_var_4, ((createInfoCount)));
+                    vkStream->handleMapping()->mapHandles_VkPipeline_u64(pPipelines, cgen_var_4,
+                                                                         ((createInfoCount)));
                     vkStream->write((uint64_t*)cgen_var_4, ((createInfoCount)) * 8);
                 }
                 vkStream->write(&vkCreateRayTracingPipelinesNV_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateRayTracingPipelinesNV(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateRayTracingPipelinesNV_VkResult_return, device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateRayTracingPipelinesNV(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateRayTracingPipelinesNV_VkResult_return, device, pipelineCache,
+                        createInfoCount, pCreateInfos, pAllocator, pPipelines);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetRayTracingShaderGroupHandlesKHR:
-            {
+            case OP_vkGetRayTracingShaderGroupHandlesKHR: {
                 android::base::beginTrace("vkGetRayTracingShaderGroupHandlesKHR decode");
                 VkDevice device;
                 VkPipeline pipeline;
@@ -22225,30 +25842,41 @@
                 vkReadStream->alloc((void**)&pData, ((dataSize)) * sizeof(uint8_t));
                 memcpy((void*)pData, *readStreamPtrPtr, ((dataSize)) * sizeof(uint8_t));
                 *readStreamPtrPtr += ((dataSize)) * sizeof(uint8_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetRayTracingShaderGroupHandlesKHR 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pipeline, (unsigned long long)firstGroup, (unsigned long long)groupCount, (unsigned long long)dataSize, (unsigned long long)pData);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetRayTracingShaderGroupHandlesKHR 0x%llx 0x%llx "
+                            "0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pipeline,
+                            (unsigned long long)firstGroup, (unsigned long long)groupCount,
+                            (unsigned long long)dataSize, (unsigned long long)pData);
                 }
                 VkResult vkGetRayTracingShaderGroupHandlesKHR_VkResult_return = (VkResult)0;
-                vkGetRayTracingShaderGroupHandlesKHR_VkResult_return = vk->vkGetRayTracingShaderGroupHandlesKHR(unboxed_device, pipeline, firstGroup, groupCount, dataSize, pData);
-                if ((vkGetRayTracingShaderGroupHandlesKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetRayTracingShaderGroupHandlesKHR_VkResult_return =
+                    vk->vkGetRayTracingShaderGroupHandlesKHR(unboxed_device, pipeline, firstGroup,
+                                                             groupCount, dataSize, pData);
+                if ((vkGetRayTracingShaderGroupHandlesKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write((void*)pData, ((dataSize)) * sizeof(uint8_t));
-                vkStream->write(&vkGetRayTracingShaderGroupHandlesKHR_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkGetRayTracingShaderGroupHandlesKHR_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetRayTracingShaderGroupHandlesKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetRayTracingShaderGroupHandlesKHR_VkResult_return, device, pipeline, firstGroup, groupCount, dataSize, pData);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetRayTracingShaderGroupHandlesKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetRayTracingShaderGroupHandlesKHR_VkResult_return, device, pipeline,
+                        firstGroup, groupCount, dataSize, pData);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetRayTracingShaderGroupHandlesNV:
-            {
+            case OP_vkGetRayTracingShaderGroupHandlesNV: {
                 android::base::beginTrace("vkGetRayTracingShaderGroupHandlesNV decode");
                 VkDevice device;
                 VkPipeline pipeline;
@@ -22280,30 +25908,41 @@
                 vkReadStream->alloc((void**)&pData, ((dataSize)) * sizeof(uint8_t));
                 memcpy((void*)pData, *readStreamPtrPtr, ((dataSize)) * sizeof(uint8_t));
                 *readStreamPtrPtr += ((dataSize)) * sizeof(uint8_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetRayTracingShaderGroupHandlesNV 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pipeline, (unsigned long long)firstGroup, (unsigned long long)groupCount, (unsigned long long)dataSize, (unsigned long long)pData);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetRayTracingShaderGroupHandlesNV 0x%llx 0x%llx "
+                            "0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pipeline,
+                            (unsigned long long)firstGroup, (unsigned long long)groupCount,
+                            (unsigned long long)dataSize, (unsigned long long)pData);
                 }
                 VkResult vkGetRayTracingShaderGroupHandlesNV_VkResult_return = (VkResult)0;
-                vkGetRayTracingShaderGroupHandlesNV_VkResult_return = vk->vkGetRayTracingShaderGroupHandlesNV(unboxed_device, pipeline, firstGroup, groupCount, dataSize, pData);
-                if ((vkGetRayTracingShaderGroupHandlesNV_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetRayTracingShaderGroupHandlesNV_VkResult_return =
+                    vk->vkGetRayTracingShaderGroupHandlesNV(unboxed_device, pipeline, firstGroup,
+                                                            groupCount, dataSize, pData);
+                if ((vkGetRayTracingShaderGroupHandlesNV_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write((void*)pData, ((dataSize)) * sizeof(uint8_t));
-                vkStream->write(&vkGetRayTracingShaderGroupHandlesNV_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkGetRayTracingShaderGroupHandlesNV_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetRayTracingShaderGroupHandlesNV(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetRayTracingShaderGroupHandlesNV_VkResult_return, device, pipeline, firstGroup, groupCount, dataSize, pData);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetRayTracingShaderGroupHandlesNV(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetRayTracingShaderGroupHandlesNV_VkResult_return, device, pipeline,
+                        firstGroup, groupCount, dataSize, pData);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetAccelerationStructureHandleNV:
-            {
+            case OP_vkGetAccelerationStructureHandleNV: {
                 android::base::beginTrace("vkGetAccelerationStructureHandleNV decode");
                 VkDevice device;
                 VkAccelerationStructureNV accelerationStructure;
@@ -22320,7 +25959,9 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkAccelerationStructureNV*)&accelerationStructure = (VkAccelerationStructureNV)unbox_VkAccelerationStructureNV((VkAccelerationStructureNV)(*&cgen_var_1));
+                *(VkAccelerationStructureNV*)&accelerationStructure =
+                    (VkAccelerationStructureNV)unbox_VkAccelerationStructureNV(
+                        (VkAccelerationStructureNV)(*&cgen_var_1));
                 memcpy((size_t*)&dataSize, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&dataSize);
                 *readStreamPtrPtr += 8;
@@ -22329,30 +25970,41 @@
                 vkReadStream->alloc((void**)&pData, ((dataSize)) * sizeof(uint8_t));
                 memcpy((void*)pData, *readStreamPtrPtr, ((dataSize)) * sizeof(uint8_t));
                 *readStreamPtrPtr += ((dataSize)) * sizeof(uint8_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetAccelerationStructureHandleNV 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)accelerationStructure, (unsigned long long)dataSize, (unsigned long long)pData);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetAccelerationStructureHandleNV 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device,
+                            (unsigned long long)accelerationStructure, (unsigned long long)dataSize,
+                            (unsigned long long)pData);
                 }
                 VkResult vkGetAccelerationStructureHandleNV_VkResult_return = (VkResult)0;
-                vkGetAccelerationStructureHandleNV_VkResult_return = vk->vkGetAccelerationStructureHandleNV(unboxed_device, accelerationStructure, dataSize, pData);
-                if ((vkGetAccelerationStructureHandleNV_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetAccelerationStructureHandleNV_VkResult_return =
+                    vk->vkGetAccelerationStructureHandleNV(unboxed_device, accelerationStructure,
+                                                           dataSize, pData);
+                if ((vkGetAccelerationStructureHandleNV_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write((void*)pData, ((dataSize)) * sizeof(uint8_t));
-                vkStream->write(&vkGetAccelerationStructureHandleNV_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkGetAccelerationStructureHandleNV_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetAccelerationStructureHandleNV(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetAccelerationStructureHandleNV_VkResult_return, device, accelerationStructure, dataSize, pData);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetAccelerationStructureHandleNV(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetAccelerationStructureHandleNV_VkResult_return, device,
+                        accelerationStructure, dataSize, pData);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdWriteAccelerationStructuresPropertiesNV:
-            {
+            case OP_vkCmdWriteAccelerationStructuresPropertiesNV: {
                 android::base::beginTrace("vkCmdWriteAccelerationStructuresPropertiesNV decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t accelerationStructureCount;
@@ -22364,21 +26016,25 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 memcpy((uint32_t*)&accelerationStructureCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pAccelerationStructures, ((accelerationStructureCount)) * sizeof(const VkAccelerationStructureNV));
-                if (((accelerationStructureCount)))
-                {
+                vkReadStream->alloc(
+                    (void**)&pAccelerationStructures,
+                    ((accelerationStructureCount)) * sizeof(const VkAccelerationStructureNV));
+                if (((accelerationStructureCount))) {
                     uint8_t* cgen_var_1_ptr = (uint8_t*)(*readStreamPtrPtr);
                     *readStreamPtrPtr += 8 * ((accelerationStructureCount));
-                    for (uint32_t k = 0; k < ((accelerationStructureCount)); ++k)
-                    {
-                        uint64_t tmpval; memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
-                        *(((VkAccelerationStructureNV*)pAccelerationStructures) + k) = (VkAccelerationStructureNV)unbox_VkAccelerationStructureNV((VkAccelerationStructureNV)tmpval);
+                    for (uint32_t k = 0; k < ((accelerationStructureCount)); ++k) {
+                        uint64_t tmpval;
+                        memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
+                        *(((VkAccelerationStructureNV*)pAccelerationStructures) + k) =
+                            (VkAccelerationStructureNV)unbox_VkAccelerationStructureNV(
+                                (VkAccelerationStructureNV)tmpval);
                     }
                 }
                 memcpy((VkQueryType*)&queryType, *readStreamPtrPtr, sizeof(VkQueryType));
@@ -22386,28 +26042,40 @@
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkQueryPool*)&queryPool = (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_2));
+                *(VkQueryPool*)&queryPool =
+                    (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_2));
                 memcpy((uint32_t*)&firstQuery, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdWriteAccelerationStructuresPropertiesNV 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)accelerationStructureCount, (unsigned long long)pAccelerationStructures, (unsigned long long)queryType, (unsigned long long)queryPool, (unsigned long long)firstQuery);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdWriteAccelerationStructuresPropertiesNV 0x%llx "
+                            "0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)accelerationStructureCount,
+                            (unsigned long long)pAccelerationStructures,
+                            (unsigned long long)queryType, (unsigned long long)queryPool,
+                            (unsigned long long)firstQuery);
                 }
-                vk->vkCmdWriteAccelerationStructuresPropertiesNV(unboxed_commandBuffer, accelerationStructureCount, pAccelerationStructures, queryType, queryPool, firstQuery);
+                vk->vkCmdWriteAccelerationStructuresPropertiesNV(
+                    unboxed_commandBuffer, accelerationStructureCount, pAccelerationStructures,
+                    queryType, queryPool, firstQuery);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdWriteAccelerationStructuresPropertiesNV(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, accelerationStructureCount, pAccelerationStructures, queryType, queryPool, firstQuery);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdWriteAccelerationStructuresPropertiesNV(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        accelerationStructureCount, pAccelerationStructures, queryType, queryPool,
+                        firstQuery);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCompileDeferredNV:
-            {
+            case OP_vkCompileDeferredNV: {
                 android::base::beginTrace("vkCompileDeferredNV decode");
                 VkDevice device;
                 VkPipeline pipeline;
@@ -22426,24 +26094,30 @@
                 *(VkPipeline*)&pipeline = (VkPipeline)unbox_VkPipeline((VkPipeline)(*&cgen_var_1));
                 memcpy((uint32_t*)&shader, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCompileDeferredNV 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pipeline, (unsigned long long)shader);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCompileDeferredNV 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pipeline,
+                            (unsigned long long)shader);
                 }
                 VkResult vkCompileDeferredNV_VkResult_return = (VkResult)0;
-                vkCompileDeferredNV_VkResult_return = vk->vkCompileDeferredNV(unboxed_device, pipeline, shader);
-                if ((vkCompileDeferredNV_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCompileDeferredNV_VkResult_return =
+                    vk->vkCompileDeferredNV(unboxed_device, pipeline, shader);
+                if ((vkCompileDeferredNV_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkCompileDeferredNV_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCompileDeferredNV(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCompileDeferredNV_VkResult_return, device, pipeline, shader);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCompileDeferredNV(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCompileDeferredNV_VkResult_return, device, pipeline, shader);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -22457,8 +26131,7 @@
 #ifdef VK_EXT_global_priority
 #endif
 #ifdef VK_EXT_external_memory_host
-            case OP_vkGetMemoryHostPointerPropertiesEXT:
-            {
+            case OP_vkGetMemoryHostPointerPropertiesEXT: {
                 android::base::beginTrace("vkGetMemoryHostPointerPropertiesEXT decode");
                 VkDevice device;
                 VkExternalMemoryHandleTypeFlagBits handleType;
@@ -22472,56 +26145,73 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                memcpy((VkExternalMemoryHandleTypeFlagBits*)&handleType, *readStreamPtrPtr, sizeof(VkExternalMemoryHandleTypeFlagBits));
+                memcpy((VkExternalMemoryHandleTypeFlagBits*)&handleType, *readStreamPtrPtr,
+                       sizeof(VkExternalMemoryHandleTypeFlagBits));
                 *readStreamPtrPtr += sizeof(VkExternalMemoryHandleTypeFlagBits);
                 // WARNING PTR CHECK
                 memcpy((void**)&pHostPointer, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pHostPointer);
                 *readStreamPtrPtr += 8;
-                if (pHostPointer)
-                {
+                if (pHostPointer) {
                     vkReadStream->alloc((void**)&pHostPointer, sizeof(const uint8_t));
                     memcpy((void*)pHostPointer, *readStreamPtrPtr, sizeof(const uint8_t));
                     *readStreamPtrPtr += sizeof(const uint8_t);
                 }
                 // Begin manual dispatchable handle unboxing for pMemoryHostPointerProperties;
                 vkReadStream->unsetHandleMapping();
-                vkReadStream->alloc((void**)&pMemoryHostPointerProperties, sizeof(VkMemoryHostPointerPropertiesEXT));
-                reservedunmarshal_VkMemoryHostPointerPropertiesEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryHostPointerPropertiesEXT*)(pMemoryHostPointerProperties), readStreamPtrPtr);
-                if (pMemoryHostPointerProperties)
-                {
-                    transform_tohost_VkMemoryHostPointerPropertiesEXT(m_state, (VkMemoryHostPointerPropertiesEXT*)(pMemoryHostPointerProperties));
+                vkReadStream->alloc((void**)&pMemoryHostPointerProperties,
+                                    sizeof(VkMemoryHostPointerPropertiesEXT));
+                reservedunmarshal_VkMemoryHostPointerPropertiesEXT(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkMemoryHostPointerPropertiesEXT*)(pMemoryHostPointerProperties),
+                    readStreamPtrPtr);
+                if (pMemoryHostPointerProperties) {
+                    transform_tohost_VkMemoryHostPointerPropertiesEXT(
+                        m_state, (VkMemoryHostPointerPropertiesEXT*)(pMemoryHostPointerProperties));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetMemoryHostPointerPropertiesEXT 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)handleType, (unsigned long long)pHostPointer, (unsigned long long)pMemoryHostPointerProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetMemoryHostPointerPropertiesEXT 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)handleType,
+                            (unsigned long long)pHostPointer,
+                            (unsigned long long)pMemoryHostPointerProperties);
                 }
                 VkResult vkGetMemoryHostPointerPropertiesEXT_VkResult_return = (VkResult)0;
-                vkGetMemoryHostPointerPropertiesEXT_VkResult_return = vk->vkGetMemoryHostPointerPropertiesEXT(unboxed_device, handleType, pHostPointer, pMemoryHostPointerProperties);
-                if ((vkGetMemoryHostPointerPropertiesEXT_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetMemoryHostPointerPropertiesEXT_VkResult_return =
+                    vk->vkGetMemoryHostPointerPropertiesEXT(
+                        unboxed_device, handleType, pHostPointer, pMemoryHostPointerProperties);
+                if ((vkGetMemoryHostPointerPropertiesEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                if (pMemoryHostPointerProperties)
-                {
-                    transform_fromhost_VkMemoryHostPointerPropertiesEXT(m_state, (VkMemoryHostPointerPropertiesEXT*)(pMemoryHostPointerProperties));
+                if (pMemoryHostPointerProperties) {
+                    transform_fromhost_VkMemoryHostPointerPropertiesEXT(
+                        m_state, (VkMemoryHostPointerPropertiesEXT*)(pMemoryHostPointerProperties));
                 }
-                marshal_VkMemoryHostPointerPropertiesEXT(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryHostPointerPropertiesEXT*)(pMemoryHostPointerProperties));
-                vkStream->write(&vkGetMemoryHostPointerPropertiesEXT_VkResult_return, sizeof(VkResult));
+                marshal_VkMemoryHostPointerPropertiesEXT(
+                    vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkMemoryHostPointerPropertiesEXT*)(pMemoryHostPointerProperties));
+                vkStream->write(&vkGetMemoryHostPointerPropertiesEXT_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetMemoryHostPointerPropertiesEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetMemoryHostPointerPropertiesEXT_VkResult_return, device, handleType, pHostPointer, pMemoryHostPointerProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetMemoryHostPointerPropertiesEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetMemoryHostPointerPropertiesEXT_VkResult_return, device, handleType,
+                        pHostPointer, pMemoryHostPointerProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_AMD_buffer_marker
-            case OP_vkCmdWriteBufferMarkerAMD:
-            {
+            case OP_vkCmdWriteBufferMarkerAMD: {
                 android::base::beginTrace("vkCmdWriteBufferMarkerAMD decode");
                 VkCommandBuffer commandBuffer;
                 VkPipelineStageFlagBits pipelineStage;
@@ -22532,11 +26222,13 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
-                memcpy((VkPipelineStageFlagBits*)&pipelineStage, *readStreamPtrPtr, sizeof(VkPipelineStageFlagBits));
+                memcpy((VkPipelineStageFlagBits*)&pipelineStage, *readStreamPtrPtr,
+                       sizeof(VkPipelineStageFlagBits));
                 *readStreamPtrPtr += sizeof(VkPipelineStageFlagBits);
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
@@ -22546,20 +26238,28 @@
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
                 memcpy((uint32_t*)&marker, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdWriteBufferMarkerAMD 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pipelineStage, (unsigned long long)dstBuffer, (unsigned long long)dstOffset, (unsigned long long)marker);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdWriteBufferMarkerAMD 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pipelineStage, (unsigned long long)dstBuffer,
+                            (unsigned long long)dstOffset, (unsigned long long)marker);
                 }
-                vk->vkCmdWriteBufferMarkerAMD(unboxed_commandBuffer, pipelineStage, dstBuffer, dstOffset, marker);
+                vk->vkCmdWriteBufferMarkerAMD(unboxed_commandBuffer, pipelineStage, dstBuffer,
+                                              dstOffset, marker);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdWriteBufferMarkerAMD(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pipelineStage, dstBuffer, dstOffset, marker);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdWriteBufferMarkerAMD(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        pipelineStage, dstBuffer, dstOffset, marker);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -22567,8 +26267,7 @@
 #ifdef VK_AMD_pipeline_compiler_control
 #endif
 #ifdef VK_EXT_calibrated_timestamps
-            case OP_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT:
-            {
+            case OP_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT: {
                 android::base::beginTrace("vkGetPhysicalDeviceCalibrateableTimeDomainsEXT decode");
                 VkPhysicalDevice physicalDevice;
                 uint32_t* pTimeDomainCount;
@@ -22577,7 +26276,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
@@ -22587,8 +26287,7 @@
                 memcpy((uint32_t**)&pTimeDomainCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pTimeDomainCount);
                 *readStreamPtrPtr += 8;
-                if (pTimeDomainCount)
-                {
+                if (pTimeDomainCount) {
                     vkReadStream->alloc((void**)&pTimeDomainCount, sizeof(uint32_t));
                     memcpy((uint32_t*)pTimeDomainCount, *readStreamPtrPtr, sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
@@ -22599,49 +26298,61 @@
                 memcpy((VkTimeDomainEXT**)&pTimeDomains, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pTimeDomains);
                 *readStreamPtrPtr += 8;
-                if (pTimeDomains)
-                {
-                    vkReadStream->alloc((void**)&pTimeDomains, (*(pTimeDomainCount)) * sizeof(VkTimeDomainEXT));
-                    memcpy((VkTimeDomainEXT*)pTimeDomains, *readStreamPtrPtr, (*(pTimeDomainCount)) * sizeof(VkTimeDomainEXT));
+                if (pTimeDomains) {
+                    vkReadStream->alloc((void**)&pTimeDomains,
+                                        (*(pTimeDomainCount)) * sizeof(VkTimeDomainEXT));
+                    memcpy((VkTimeDomainEXT*)pTimeDomains, *readStreamPtrPtr,
+                           (*(pTimeDomainCount)) * sizeof(VkTimeDomainEXT));
                     *readStreamPtrPtr += (*(pTimeDomainCount)) * sizeof(VkTimeDomainEXT);
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceCalibrateableTimeDomainsEXT 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pTimeDomainCount, (unsigned long long)pTimeDomains);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceCalibrateableTimeDomainsEXT 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)pTimeDomainCount, (unsigned long long)pTimeDomains);
                 }
-                VkResult vkGetPhysicalDeviceCalibrateableTimeDomainsEXT_VkResult_return = (VkResult)0;
-                vkGetPhysicalDeviceCalibrateableTimeDomainsEXT_VkResult_return = vk->vkGetPhysicalDeviceCalibrateableTimeDomainsEXT(unboxed_physicalDevice, pTimeDomainCount, pTimeDomains);
-                if ((vkGetPhysicalDeviceCalibrateableTimeDomainsEXT_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                VkResult vkGetPhysicalDeviceCalibrateableTimeDomainsEXT_VkResult_return =
+                    (VkResult)0;
+                vkGetPhysicalDeviceCalibrateableTimeDomainsEXT_VkResult_return =
+                    vk->vkGetPhysicalDeviceCalibrateableTimeDomainsEXT(
+                        unboxed_physicalDevice, pTimeDomainCount, pTimeDomains);
+                if ((vkGetPhysicalDeviceCalibrateableTimeDomainsEXT_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pTimeDomainCount;
                 vkStream->putBe64(cgen_var_3);
-                if (pTimeDomainCount)
-                {
+                if (pTimeDomainCount) {
                     vkStream->write((uint32_t*)pTimeDomainCount, sizeof(uint32_t));
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pTimeDomains;
                 vkStream->putBe64(cgen_var_4);
-                if (pTimeDomains)
-                {
-                    vkStream->write((VkTimeDomainEXT*)pTimeDomains, (*(pTimeDomainCount)) * sizeof(VkTimeDomainEXT));
+                if (pTimeDomains) {
+                    vkStream->write((VkTimeDomainEXT*)pTimeDomains,
+                                    (*(pTimeDomainCount)) * sizeof(VkTimeDomainEXT));
                 }
-                vkStream->write(&vkGetPhysicalDeviceCalibrateableTimeDomainsEXT_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkGetPhysicalDeviceCalibrateableTimeDomainsEXT_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceCalibrateableTimeDomainsEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetPhysicalDeviceCalibrateableTimeDomainsEXT_VkResult_return, physicalDevice, pTimeDomainCount, pTimeDomains);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceCalibrateableTimeDomainsEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetPhysicalDeviceCalibrateableTimeDomainsEXT_VkResult_return,
+                        physicalDevice, pTimeDomainCount, pTimeDomains);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetCalibratedTimestampsEXT:
-            {
+            case OP_vkGetCalibratedTimestampsEXT: {
                 android::base::beginTrace("vkGetCalibratedTimestampsEXT decode");
                 VkDevice device;
                 uint32_t timestampCount;
@@ -22658,48 +26369,61 @@
                 // End manual dispatchable handle unboxing for device;
                 memcpy((uint32_t*)&timestampCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pTimestampInfos, ((timestampCount)) * sizeof(const VkCalibratedTimestampInfoEXT));
-                for (uint32_t i = 0; i < (uint32_t)((timestampCount)); ++i)
-                {
-                    reservedunmarshal_VkCalibratedTimestampInfoEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCalibratedTimestampInfoEXT*)(pTimestampInfos + i), readStreamPtrPtr);
+                vkReadStream->alloc(
+                    (void**)&pTimestampInfos,
+                    ((timestampCount)) * sizeof(const VkCalibratedTimestampInfoEXT));
+                for (uint32_t i = 0; i < (uint32_t)((timestampCount)); ++i) {
+                    reservedunmarshal_VkCalibratedTimestampInfoEXT(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkCalibratedTimestampInfoEXT*)(pTimestampInfos + i), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pTimestamps;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pTimestamps, ((timestampCount)) * sizeof(uint64_t));
-                memcpy((uint64_t*)pTimestamps, *readStreamPtrPtr, ((timestampCount)) * sizeof(uint64_t));
+                memcpy((uint64_t*)pTimestamps, *readStreamPtrPtr,
+                       ((timestampCount)) * sizeof(uint64_t));
                 *readStreamPtrPtr += ((timestampCount)) * sizeof(uint64_t);
                 // Begin manual dispatchable handle unboxing for pMaxDeviation;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pMaxDeviation, sizeof(uint64_t));
                 memcpy((uint64_t*)pMaxDeviation, *readStreamPtrPtr, sizeof(uint64_t));
                 *readStreamPtrPtr += sizeof(uint64_t);
-                if (pTimestampInfos)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((timestampCount)); ++i)
-                    {
-                        transform_tohost_VkCalibratedTimestampInfoEXT(m_state, (VkCalibratedTimestampInfoEXT*)(pTimestampInfos + i));
+                if (pTimestampInfos) {
+                    for (uint32_t i = 0; i < (uint32_t)((timestampCount)); ++i) {
+                        transform_tohost_VkCalibratedTimestampInfoEXT(
+                            m_state, (VkCalibratedTimestampInfoEXT*)(pTimestampInfos + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetCalibratedTimestampsEXT 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)timestampCount, (unsigned long long)pTimestampInfos, (unsigned long long)pTimestamps, (unsigned long long)pMaxDeviation);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetCalibratedTimestampsEXT 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device,
+                            (unsigned long long)timestampCount, (unsigned long long)pTimestampInfos,
+                            (unsigned long long)pTimestamps, (unsigned long long)pMaxDeviation);
                 }
                 VkResult vkGetCalibratedTimestampsEXT_VkResult_return = (VkResult)0;
-                vkGetCalibratedTimestampsEXT_VkResult_return = vk->vkGetCalibratedTimestampsEXT(unboxed_device, timestampCount, pTimestampInfos, pTimestamps, pMaxDeviation);
-                if ((vkGetCalibratedTimestampsEXT_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetCalibratedTimestampsEXT_VkResult_return = vk->vkGetCalibratedTimestampsEXT(
+                    unboxed_device, timestampCount, pTimestampInfos, pTimestamps, pMaxDeviation);
+                if ((vkGetCalibratedTimestampsEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write((uint64_t*)pTimestamps, ((timestampCount)) * sizeof(uint64_t));
                 vkStream->write((uint64_t*)pMaxDeviation, sizeof(uint64_t));
                 vkStream->write(&vkGetCalibratedTimestampsEXT_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetCalibratedTimestampsEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetCalibratedTimestampsEXT_VkResult_return, device, timestampCount, pTimestampInfos, pTimestamps, pMaxDeviation);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetCalibratedTimestampsEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetCalibratedTimestampsEXT_VkResult_return, device, timestampCount,
+                        pTimestampInfos, pTimestamps, pMaxDeviation);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -22721,8 +26445,7 @@
 #ifdef VK_NV_compute_shader_derivatives
 #endif
 #ifdef VK_NV_mesh_shader
-            case OP_vkCmdDrawMeshTasksNV:
-            {
+            case OP_vkCmdDrawMeshTasksNV: {
                 android::base::beginTrace("vkCmdDrawMeshTasksNV decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t taskCount;
@@ -22731,7 +26454,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -22739,25 +26463,28 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&firstTask, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdDrawMeshTasksNV 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)taskCount, (unsigned long long)firstTask);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdDrawMeshTasksNV 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)taskCount, (unsigned long long)firstTask);
                 }
                 vk->vkCmdDrawMeshTasksNV(unboxed_commandBuffer, taskCount, firstTask);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdDrawMeshTasksNV(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, taskCount, firstTask);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdDrawMeshTasksNV(snapshotTraceBegin,
+                                                              snapshotTraceBytes, &m_pool,
+                                                              commandBuffer, taskCount, firstTask);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdDrawMeshTasksIndirectNV:
-            {
+            case OP_vkCmdDrawMeshTasksIndirectNV: {
                 android::base::beginTrace("vkCmdDrawMeshTasksIndirectNV decode");
                 VkCommandBuffer commandBuffer;
                 VkBuffer buffer;
@@ -22768,7 +26495,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -22782,25 +26510,32 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&stride, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdDrawMeshTasksIndirectNV 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)buffer, (unsigned long long)offset, (unsigned long long)drawCount, (unsigned long long)stride);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdDrawMeshTasksIndirectNV 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer, (unsigned long long)buffer,
+                            (unsigned long long)offset, (unsigned long long)drawCount,
+                            (unsigned long long)stride);
                 }
-                vk->vkCmdDrawMeshTasksIndirectNV(unboxed_commandBuffer, buffer, offset, drawCount, stride);
+                vk->vkCmdDrawMeshTasksIndirectNV(unboxed_commandBuffer, buffer, offset, drawCount,
+                                                 stride);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdDrawMeshTasksIndirectNV(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, buffer, offset, drawCount, stride);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdDrawMeshTasksIndirectNV(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, buffer,
+                        offset, drawCount, stride);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdDrawMeshTasksIndirectCountNV:
-            {
+            case OP_vkCmdDrawMeshTasksIndirectCountNV: {
                 android::base::beginTrace("vkCmdDrawMeshTasksIndirectCountNV decode");
                 VkCommandBuffer commandBuffer;
                 VkBuffer buffer;
@@ -22813,7 +26548,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -22833,20 +26569,30 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&stride, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdDrawMeshTasksIndirectCountNV 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)buffer, (unsigned long long)offset, (unsigned long long)countBuffer, (unsigned long long)countBufferOffset, (unsigned long long)maxDrawCount, (unsigned long long)stride);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdDrawMeshTasksIndirectCountNV 0x%llx 0x%llx "
+                            "0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer, (unsigned long long)buffer,
+                            (unsigned long long)offset, (unsigned long long)countBuffer,
+                            (unsigned long long)countBufferOffset, (unsigned long long)maxDrawCount,
+                            (unsigned long long)stride);
                 }
-                vk->vkCmdDrawMeshTasksIndirectCountNV(unboxed_commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+                vk->vkCmdDrawMeshTasksIndirectCountNV(unboxed_commandBuffer, buffer, offset,
+                                                      countBuffer, countBufferOffset, maxDrawCount,
+                                                      stride);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdDrawMeshTasksIndirectCountNV(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdDrawMeshTasksIndirectCountNV(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, buffer,
+                        offset, countBuffer, countBufferOffset, maxDrawCount, stride);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -22856,8 +26602,7 @@
 #ifdef VK_NV_shader_image_footprint
 #endif
 #ifdef VK_NV_scissor_exclusive
-            case OP_vkCmdSetExclusiveScissorNV:
-            {
+            case OP_vkCmdSetExclusiveScissorNV: {
                 android::base::beginTrace("vkCmdSetExclusiveScissorNV decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t firstExclusiveScissor;
@@ -22867,7 +26612,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -22875,39 +26621,47 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&exclusiveScissorCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pExclusiveScissors, ((exclusiveScissorCount)) * sizeof(const VkRect2D));
-                for (uint32_t i = 0; i < (uint32_t)((exclusiveScissorCount)); ++i)
-                {
-                    reservedunmarshal_VkRect2D(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRect2D*)(pExclusiveScissors + i), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pExclusiveScissors,
+                                    ((exclusiveScissorCount)) * sizeof(const VkRect2D));
+                for (uint32_t i = 0; i < (uint32_t)((exclusiveScissorCount)); ++i) {
+                    reservedunmarshal_VkRect2D(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                               (VkRect2D*)(pExclusiveScissors + i),
+                                               readStreamPtrPtr);
                 }
-                if (pExclusiveScissors)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((exclusiveScissorCount)); ++i)
-                    {
+                if (pExclusiveScissors) {
+                    for (uint32_t i = 0; i < (uint32_t)((exclusiveScissorCount)); ++i) {
                         transform_tohost_VkRect2D(m_state, (VkRect2D*)(pExclusiveScissors + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetExclusiveScissorNV 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)firstExclusiveScissor, (unsigned long long)exclusiveScissorCount, (unsigned long long)pExclusiveScissors);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkCmdSetExclusiveScissorNV 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)commandBuffer,
+                        (unsigned long long)firstExclusiveScissor,
+                        (unsigned long long)exclusiveScissorCount,
+                        (unsigned long long)pExclusiveScissors);
                 }
-                vk->vkCmdSetExclusiveScissorNV(unboxed_commandBuffer, firstExclusiveScissor, exclusiveScissorCount, pExclusiveScissors);
+                vk->vkCmdSetExclusiveScissorNV(unboxed_commandBuffer, firstExclusiveScissor,
+                                               exclusiveScissorCount, pExclusiveScissors);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetExclusiveScissorNV(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, firstExclusiveScissor, exclusiveScissorCount, pExclusiveScissors);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetExclusiveScissorNV(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        firstExclusiveScissor, exclusiveScissorCount, pExclusiveScissors);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
-            case OP_vkCmdSetCheckpointNV:
-            {
+            case OP_vkCmdSetCheckpointNV: {
                 android::base::beginTrace("vkCmdSetCheckpointNV decode");
                 VkCommandBuffer commandBuffer;
                 const void* pCheckpointMarker;
@@ -22915,7 +26669,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -22923,31 +26678,33 @@
                 memcpy((void**)&pCheckpointMarker, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pCheckpointMarker);
                 *readStreamPtrPtr += 8;
-                if (pCheckpointMarker)
-                {
+                if (pCheckpointMarker) {
                     vkReadStream->alloc((void**)&pCheckpointMarker, sizeof(const uint8_t));
                     memcpy((void*)pCheckpointMarker, *readStreamPtrPtr, sizeof(const uint8_t));
                     *readStreamPtrPtr += sizeof(const uint8_t);
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetCheckpointNV 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pCheckpointMarker);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdSetCheckpointNV 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pCheckpointMarker);
                 }
                 vk->vkCmdSetCheckpointNV(unboxed_commandBuffer, pCheckpointMarker);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetCheckpointNV(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pCheckpointMarker);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetCheckpointNV(snapshotTraceBegin,
+                                                              snapshotTraceBytes, &m_pool,
+                                                              commandBuffer, pCheckpointMarker);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetQueueCheckpointDataNV:
-            {
+            case OP_vkGetQueueCheckpointDataNV: {
                 android::base::beginTrace("vkGetQueueCheckpointDataNV decode");
                 VkQueue queue;
                 uint32_t* pCheckpointDataCount;
@@ -22966,8 +26723,7 @@
                 memcpy((uint32_t**)&pCheckpointDataCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pCheckpointDataCount);
                 *readStreamPtrPtr += 8;
-                if (pCheckpointDataCount)
-                {
+                if (pCheckpointDataCount) {
                     vkReadStream->alloc((void**)&pCheckpointDataCount, sizeof(uint32_t));
                     memcpy((uint32_t*)pCheckpointDataCount, *readStreamPtrPtr, sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
@@ -22978,69 +26734,70 @@
                 memcpy((VkCheckpointDataNV**)&pCheckpointData, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pCheckpointData);
                 *readStreamPtrPtr += 8;
-                if (pCheckpointData)
-                {
-                    vkReadStream->alloc((void**)&pCheckpointData, (*(pCheckpointDataCount)) * sizeof(VkCheckpointDataNV));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pCheckpointDataCount)); ++i)
-                    {
-                        reservedunmarshal_VkCheckpointDataNV(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCheckpointDataNV*)(pCheckpointData + i), readStreamPtrPtr);
+                if (pCheckpointData) {
+                    vkReadStream->alloc((void**)&pCheckpointData,
+                                        (*(pCheckpointDataCount)) * sizeof(VkCheckpointDataNV));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pCheckpointDataCount)); ++i) {
+                        reservedunmarshal_VkCheckpointDataNV(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkCheckpointDataNV*)(pCheckpointData + i), readStreamPtrPtr);
                     }
                 }
-                if (pCheckpointDataCount)
-                {
-                    if (pCheckpointData)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pCheckpointDataCount)); ++i)
-                        {
-                            transform_tohost_VkCheckpointDataNV(m_state, (VkCheckpointDataNV*)(pCheckpointData + i));
+                if (pCheckpointDataCount) {
+                    if (pCheckpointData) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pCheckpointDataCount)); ++i) {
+                            transform_tohost_VkCheckpointDataNV(
+                                m_state, (VkCheckpointDataNV*)(pCheckpointData + i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetQueueCheckpointDataNV 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)queue, (unsigned long long)pCheckpointDataCount, (unsigned long long)pCheckpointData);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetQueueCheckpointDataNV 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)queue,
+                            (unsigned long long)pCheckpointDataCount,
+                            (unsigned long long)pCheckpointData);
                 }
-                vk->vkGetQueueCheckpointDataNV(unboxed_queue, pCheckpointDataCount, pCheckpointData);
+                vk->vkGetQueueCheckpointDataNV(unboxed_queue, pCheckpointDataCount,
+                                               pCheckpointData);
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pCheckpointDataCount;
                 vkStream->putBe64(cgen_var_3);
-                if (pCheckpointDataCount)
-                {
+                if (pCheckpointDataCount) {
                     vkStream->write((uint32_t*)pCheckpointDataCount, sizeof(uint32_t));
                 }
-                if (pCheckpointDataCount)
-                {
-                    if (pCheckpointData)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pCheckpointDataCount)); ++i)
-                        {
-                            transform_fromhost_VkCheckpointDataNV(m_state, (VkCheckpointDataNV*)(pCheckpointData + i));
+                if (pCheckpointDataCount) {
+                    if (pCheckpointData) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pCheckpointDataCount)); ++i) {
+                            transform_fromhost_VkCheckpointDataNV(
+                                m_state, (VkCheckpointDataNV*)(pCheckpointData + i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pCheckpointData;
                 vkStream->putBe64(cgen_var_4);
-                if (pCheckpointData)
-                {
-                    if (pCheckpointDataCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pCheckpointDataCount)); ++i)
-                        {
-                            marshal_VkCheckpointDataNV(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCheckpointDataNV*)(pCheckpointData + i));
+                if (pCheckpointData) {
+                    if (pCheckpointDataCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pCheckpointDataCount)); ++i) {
+                            marshal_VkCheckpointDataNV(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                       (VkCheckpointDataNV*)(pCheckpointData + i));
                         }
                     }
                 }
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetQueueCheckpointDataNV(snapshotTraceBegin, snapshotTraceBytes, &m_pool, queue, pCheckpointDataCount, pCheckpointData);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetQueueCheckpointDataNV(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, queue,
+                        pCheckpointDataCount, pCheckpointData);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -23048,8 +26805,7 @@
 #ifdef VK_INTEL_shader_integer_functions2
 #endif
 #ifdef VK_INTEL_performance_query
-            case OP_vkInitializePerformanceApiINTEL:
-            {
+            case OP_vkInitializePerformanceApiINTEL: {
                 android::base::beginTrace("vkInitializePerformanceApiINTEL decode");
                 VkDevice device;
                 const VkInitializePerformanceApiInfoINTEL* pInitializeInfo;
@@ -23061,35 +26817,43 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pInitializeInfo, sizeof(const VkInitializePerformanceApiInfoINTEL));
-                reservedunmarshal_VkInitializePerformanceApiInfoINTEL(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkInitializePerformanceApiInfoINTEL*)(pInitializeInfo), readStreamPtrPtr);
-                if (pInitializeInfo)
-                {
-                    transform_tohost_VkInitializePerformanceApiInfoINTEL(m_state, (VkInitializePerformanceApiInfoINTEL*)(pInitializeInfo));
+                vkReadStream->alloc((void**)&pInitializeInfo,
+                                    sizeof(const VkInitializePerformanceApiInfoINTEL));
+                reservedunmarshal_VkInitializePerformanceApiInfoINTEL(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkInitializePerformanceApiInfoINTEL*)(pInitializeInfo), readStreamPtrPtr);
+                if (pInitializeInfo) {
+                    transform_tohost_VkInitializePerformanceApiInfoINTEL(
+                        m_state, (VkInitializePerformanceApiInfoINTEL*)(pInitializeInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkInitializePerformanceApiINTEL 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pInitializeInfo);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr, "stream %p: call vkInitializePerformanceApiINTEL 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device, (unsigned long long)pInitializeInfo);
                 }
                 VkResult vkInitializePerformanceApiINTEL_VkResult_return = (VkResult)0;
-                vkInitializePerformanceApiINTEL_VkResult_return = vk->vkInitializePerformanceApiINTEL(unboxed_device, pInitializeInfo);
-                if ((vkInitializePerformanceApiINTEL_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkInitializePerformanceApiINTEL_VkResult_return =
+                    vk->vkInitializePerformanceApiINTEL(unboxed_device, pInitializeInfo);
+                if ((vkInitializePerformanceApiINTEL_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkInitializePerformanceApiINTEL_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkInitializePerformanceApiINTEL(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkInitializePerformanceApiINTEL_VkResult_return, device, pInitializeInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkInitializePerformanceApiINTEL(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkInitializePerformanceApiINTEL_VkResult_return, device, pInitializeInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkUninitializePerformanceApiINTEL:
-            {
+            case OP_vkUninitializePerformanceApiINTEL: {
                 android::base::beginTrace("vkUninitializePerformanceApiINTEL decode");
                 VkDevice device;
                 // Begin non wrapped dispatchable handle unboxing for device;
@@ -23100,25 +26864,26 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkUninitializePerformanceApiINTEL 0x%llx \n", ioStream, (unsigned long long)device);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkUninitializePerformanceApiINTEL 0x%llx \n",
+                            ioStream, (unsigned long long)device);
                 }
                 vk->vkUninitializePerformanceApiINTEL(unboxed_device);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkUninitializePerformanceApiINTEL(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkUninitializePerformanceApiINTEL(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetPerformanceMarkerINTEL:
-            {
+            case OP_vkCmdSetPerformanceMarkerINTEL: {
                 android::base::beginTrace("vkCmdSetPerformanceMarkerINTEL decode");
                 VkCommandBuffer commandBuffer;
                 const VkPerformanceMarkerInfoINTEL* pMarkerInfo;
@@ -23126,39 +26891,49 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
-                vkReadStream->alloc((void**)&pMarkerInfo, sizeof(const VkPerformanceMarkerInfoINTEL));
-                reservedunmarshal_VkPerformanceMarkerInfoINTEL(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPerformanceMarkerInfoINTEL*)(pMarkerInfo), readStreamPtrPtr);
-                if (pMarkerInfo)
-                {
-                    transform_tohost_VkPerformanceMarkerInfoINTEL(m_state, (VkPerformanceMarkerInfoINTEL*)(pMarkerInfo));
+                vkReadStream->alloc((void**)&pMarkerInfo,
+                                    sizeof(const VkPerformanceMarkerInfoINTEL));
+                reservedunmarshal_VkPerformanceMarkerInfoINTEL(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPerformanceMarkerInfoINTEL*)(pMarkerInfo), readStreamPtrPtr);
+                if (pMarkerInfo) {
+                    transform_tohost_VkPerformanceMarkerInfoINTEL(
+                        m_state, (VkPerformanceMarkerInfoINTEL*)(pMarkerInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetPerformanceMarkerINTEL 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pMarkerInfo);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdSetPerformanceMarkerINTEL 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pMarkerInfo);
                 }
                 VkResult vkCmdSetPerformanceMarkerINTEL_VkResult_return = (VkResult)0;
-                vkCmdSetPerformanceMarkerINTEL_VkResult_return = vk->vkCmdSetPerformanceMarkerINTEL(unboxed_commandBuffer, pMarkerInfo);
-                if ((vkCmdSetPerformanceMarkerINTEL_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCmdSetPerformanceMarkerINTEL_VkResult_return =
+                    vk->vkCmdSetPerformanceMarkerINTEL(unboxed_commandBuffer, pMarkerInfo);
+                if ((vkCmdSetPerformanceMarkerINTEL_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkCmdSetPerformanceMarkerINTEL_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetPerformanceMarkerINTEL(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCmdSetPerformanceMarkerINTEL_VkResult_return, commandBuffer, pMarkerInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetPerformanceMarkerINTEL(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCmdSetPerformanceMarkerINTEL_VkResult_return, commandBuffer, pMarkerInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetPerformanceStreamMarkerINTEL:
-            {
+            case OP_vkCmdSetPerformanceStreamMarkerINTEL: {
                 android::base::beginTrace("vkCmdSetPerformanceStreamMarkerINTEL decode");
                 VkCommandBuffer commandBuffer;
                 const VkPerformanceStreamMarkerInfoINTEL* pMarkerInfo;
@@ -23166,39 +26941,51 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
-                vkReadStream->alloc((void**)&pMarkerInfo, sizeof(const VkPerformanceStreamMarkerInfoINTEL));
-                reservedunmarshal_VkPerformanceStreamMarkerInfoINTEL(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPerformanceStreamMarkerInfoINTEL*)(pMarkerInfo), readStreamPtrPtr);
-                if (pMarkerInfo)
-                {
-                    transform_tohost_VkPerformanceStreamMarkerInfoINTEL(m_state, (VkPerformanceStreamMarkerInfoINTEL*)(pMarkerInfo));
+                vkReadStream->alloc((void**)&pMarkerInfo,
+                                    sizeof(const VkPerformanceStreamMarkerInfoINTEL));
+                reservedunmarshal_VkPerformanceStreamMarkerInfoINTEL(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPerformanceStreamMarkerInfoINTEL*)(pMarkerInfo), readStreamPtrPtr);
+                if (pMarkerInfo) {
+                    transform_tohost_VkPerformanceStreamMarkerInfoINTEL(
+                        m_state, (VkPerformanceStreamMarkerInfoINTEL*)(pMarkerInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetPerformanceStreamMarkerINTEL 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pMarkerInfo);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdSetPerformanceStreamMarkerINTEL 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pMarkerInfo);
                 }
                 VkResult vkCmdSetPerformanceStreamMarkerINTEL_VkResult_return = (VkResult)0;
-                vkCmdSetPerformanceStreamMarkerINTEL_VkResult_return = vk->vkCmdSetPerformanceStreamMarkerINTEL(unboxed_commandBuffer, pMarkerInfo);
-                if ((vkCmdSetPerformanceStreamMarkerINTEL_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCmdSetPerformanceStreamMarkerINTEL_VkResult_return =
+                    vk->vkCmdSetPerformanceStreamMarkerINTEL(unboxed_commandBuffer, pMarkerInfo);
+                if ((vkCmdSetPerformanceStreamMarkerINTEL_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                vkStream->write(&vkCmdSetPerformanceStreamMarkerINTEL_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkCmdSetPerformanceStreamMarkerINTEL_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetPerformanceStreamMarkerINTEL(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCmdSetPerformanceStreamMarkerINTEL_VkResult_return, commandBuffer, pMarkerInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetPerformanceStreamMarkerINTEL(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCmdSetPerformanceStreamMarkerINTEL_VkResult_return, commandBuffer,
+                        pMarkerInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetPerformanceOverrideINTEL:
-            {
+            case OP_vkCmdSetPerformanceOverrideINTEL: {
                 android::base::beginTrace("vkCmdSetPerformanceOverrideINTEL decode");
                 VkCommandBuffer commandBuffer;
                 const VkPerformanceOverrideInfoINTEL* pOverrideInfo;
@@ -23206,39 +26993,51 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
-                vkReadStream->alloc((void**)&pOverrideInfo, sizeof(const VkPerformanceOverrideInfoINTEL));
-                reservedunmarshal_VkPerformanceOverrideInfoINTEL(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPerformanceOverrideInfoINTEL*)(pOverrideInfo), readStreamPtrPtr);
-                if (pOverrideInfo)
-                {
-                    transform_tohost_VkPerformanceOverrideInfoINTEL(m_state, (VkPerformanceOverrideInfoINTEL*)(pOverrideInfo));
+                vkReadStream->alloc((void**)&pOverrideInfo,
+                                    sizeof(const VkPerformanceOverrideInfoINTEL));
+                reservedunmarshal_VkPerformanceOverrideInfoINTEL(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPerformanceOverrideInfoINTEL*)(pOverrideInfo), readStreamPtrPtr);
+                if (pOverrideInfo) {
+                    transform_tohost_VkPerformanceOverrideInfoINTEL(
+                        m_state, (VkPerformanceOverrideInfoINTEL*)(pOverrideInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetPerformanceOverrideINTEL 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pOverrideInfo);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdSetPerformanceOverrideINTEL 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pOverrideInfo);
                 }
                 VkResult vkCmdSetPerformanceOverrideINTEL_VkResult_return = (VkResult)0;
-                vkCmdSetPerformanceOverrideINTEL_VkResult_return = vk->vkCmdSetPerformanceOverrideINTEL(unboxed_commandBuffer, pOverrideInfo);
-                if ((vkCmdSetPerformanceOverrideINTEL_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCmdSetPerformanceOverrideINTEL_VkResult_return =
+                    vk->vkCmdSetPerformanceOverrideINTEL(unboxed_commandBuffer, pOverrideInfo);
+                if ((vkCmdSetPerformanceOverrideINTEL_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                vkStream->write(&vkCmdSetPerformanceOverrideINTEL_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkCmdSetPerformanceOverrideINTEL_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetPerformanceOverrideINTEL(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCmdSetPerformanceOverrideINTEL_VkResult_return, commandBuffer, pOverrideInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetPerformanceOverrideINTEL(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCmdSetPerformanceOverrideINTEL_VkResult_return, commandBuffer,
+                        pOverrideInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkAcquirePerformanceConfigurationINTEL:
-            {
+            case OP_vkAcquirePerformanceConfigurationINTEL: {
                 android::base::beginTrace("vkAcquirePerformanceConfigurationINTEL decode");
                 VkDevice device;
                 const VkPerformanceConfigurationAcquireInfoINTEL* pAcquireInfo;
@@ -23251,43 +27050,59 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pAcquireInfo, sizeof(const VkPerformanceConfigurationAcquireInfoINTEL));
-                reservedunmarshal_VkPerformanceConfigurationAcquireInfoINTEL(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPerformanceConfigurationAcquireInfoINTEL*)(pAcquireInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pAcquireInfo,
+                                    sizeof(const VkPerformanceConfigurationAcquireInfoINTEL));
+                reservedunmarshal_VkPerformanceConfigurationAcquireInfoINTEL(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPerformanceConfigurationAcquireInfoINTEL*)(pAcquireInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pConfiguration;
                 vkReadStream->unsetHandleMapping();
-                vkReadStream->alloc((void**)&pConfiguration, sizeof(VkPerformanceConfigurationINTEL));
-                memcpy((VkPerformanceConfigurationINTEL*)&(*pConfiguration), (*readStreamPtrPtr), 8);
+                vkReadStream->alloc((void**)&pConfiguration,
+                                    sizeof(VkPerformanceConfigurationINTEL));
+                memcpy((VkPerformanceConfigurationINTEL*)&(*pConfiguration), (*readStreamPtrPtr),
+                       8);
                 android::base::Stream::fromBe64((uint8_t*)&(*pConfiguration));
                 *readStreamPtrPtr += 8;
-                if (pAcquireInfo)
-                {
-                    transform_tohost_VkPerformanceConfigurationAcquireInfoINTEL(m_state, (VkPerformanceConfigurationAcquireInfoINTEL*)(pAcquireInfo));
+                if (pAcquireInfo) {
+                    transform_tohost_VkPerformanceConfigurationAcquireInfoINTEL(
+                        m_state, (VkPerformanceConfigurationAcquireInfoINTEL*)(pAcquireInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkAcquirePerformanceConfigurationINTEL 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pAcquireInfo, (unsigned long long)pConfiguration);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkAcquirePerformanceConfigurationINTEL 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pAcquireInfo,
+                            (unsigned long long)pConfiguration);
                 }
                 VkResult vkAcquirePerformanceConfigurationINTEL_VkResult_return = (VkResult)0;
-                vkAcquirePerformanceConfigurationINTEL_VkResult_return = vk->vkAcquirePerformanceConfigurationINTEL(unboxed_device, pAcquireInfo, pConfiguration);
-                if ((vkAcquirePerformanceConfigurationINTEL_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkAcquirePerformanceConfigurationINTEL_VkResult_return =
+                    vk->vkAcquirePerformanceConfigurationINTEL(unboxed_device, pAcquireInfo,
+                                                               pConfiguration);
+                if ((vkAcquirePerformanceConfigurationINTEL_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_2 = (uint64_t)(*pConfiguration);
                 vkStream->putBe64(cgen_var_2);
-                vkStream->write(&vkAcquirePerformanceConfigurationINTEL_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkAcquirePerformanceConfigurationINTEL_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkAcquirePerformanceConfigurationINTEL(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkAcquirePerformanceConfigurationINTEL_VkResult_return, device, pAcquireInfo, pConfiguration);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkAcquirePerformanceConfigurationINTEL(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkAcquirePerformanceConfigurationINTEL_VkResult_return, device,
+                        pAcquireInfo, pConfiguration);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkReleasePerformanceConfigurationINTEL:
-            {
+            case OP_vkReleasePerformanceConfigurationINTEL: {
                 android::base::beginTrace("vkReleasePerformanceConfigurationINTEL decode");
                 VkDevice device;
                 VkPerformanceConfigurationINTEL configuration;
@@ -23302,29 +27117,38 @@
                 memcpy((VkPerformanceConfigurationINTEL*)&configuration, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&configuration);
                 *readStreamPtrPtr += 8;
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkReleasePerformanceConfigurationINTEL 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)configuration);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkReleasePerformanceConfigurationINTEL 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device, (unsigned long long)configuration);
                 }
                 VkResult vkReleasePerformanceConfigurationINTEL_VkResult_return = (VkResult)0;
-                vkReleasePerformanceConfigurationINTEL_VkResult_return = vk->vkReleasePerformanceConfigurationINTEL(unboxed_device, configuration);
-                if ((vkReleasePerformanceConfigurationINTEL_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkReleasePerformanceConfigurationINTEL_VkResult_return =
+                    vk->vkReleasePerformanceConfigurationINTEL(unboxed_device, configuration);
+                if ((vkReleasePerformanceConfigurationINTEL_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                vkStream->write(&vkReleasePerformanceConfigurationINTEL_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkReleasePerformanceConfigurationINTEL_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkReleasePerformanceConfigurationINTEL(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkReleasePerformanceConfigurationINTEL_VkResult_return, device, configuration);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkReleasePerformanceConfigurationINTEL(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkReleasePerformanceConfigurationINTEL_VkResult_return, device,
+                        configuration);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkQueueSetPerformanceConfigurationINTEL:
-            {
+            case OP_vkQueueSetPerformanceConfigurationINTEL: {
                 android::base::beginTrace("vkQueueSetPerformanceConfigurationINTEL decode");
                 VkQueue queue;
                 VkPerformanceConfigurationINTEL configuration;
@@ -23339,29 +27163,38 @@
                 memcpy((VkPerformanceConfigurationINTEL*)&configuration, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&configuration);
                 *readStreamPtrPtr += 8;
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkQueueSetPerformanceConfigurationINTEL 0x%llx 0x%llx \n", ioStream, (unsigned long long)queue, (unsigned long long)configuration);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkQueueSetPerformanceConfigurationINTEL 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)queue, (unsigned long long)configuration);
                 }
                 VkResult vkQueueSetPerformanceConfigurationINTEL_VkResult_return = (VkResult)0;
-                vkQueueSetPerformanceConfigurationINTEL_VkResult_return = vk->vkQueueSetPerformanceConfigurationINTEL(unboxed_queue, configuration);
-                if ((vkQueueSetPerformanceConfigurationINTEL_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkQueueSetPerformanceConfigurationINTEL_VkResult_return =
+                    vk->vkQueueSetPerformanceConfigurationINTEL(unboxed_queue, configuration);
+                if ((vkQueueSetPerformanceConfigurationINTEL_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                vkStream->write(&vkQueueSetPerformanceConfigurationINTEL_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkQueueSetPerformanceConfigurationINTEL_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkQueueSetPerformanceConfigurationINTEL(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkQueueSetPerformanceConfigurationINTEL_VkResult_return, queue, configuration);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkQueueSetPerformanceConfigurationINTEL(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkQueueSetPerformanceConfigurationINTEL_VkResult_return, queue,
+                        configuration);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPerformanceParameterINTEL:
-            {
+            case OP_vkGetPerformanceParameterINTEL: {
                 android::base::beginTrace("vkGetPerformanceParameterINTEL decode");
                 VkDevice device;
                 VkPerformanceParameterTypeINTEL parameter;
@@ -23374,39 +27207,51 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                memcpy((VkPerformanceParameterTypeINTEL*)&parameter, *readStreamPtrPtr, sizeof(VkPerformanceParameterTypeINTEL));
+                memcpy((VkPerformanceParameterTypeINTEL*)&parameter, *readStreamPtrPtr,
+                       sizeof(VkPerformanceParameterTypeINTEL));
                 *readStreamPtrPtr += sizeof(VkPerformanceParameterTypeINTEL);
                 // Begin manual dispatchable handle unboxing for pValue;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pValue, sizeof(VkPerformanceValueINTEL));
-                reservedunmarshal_VkPerformanceValueINTEL(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPerformanceValueINTEL*)(pValue), readStreamPtrPtr);
-                if (pValue)
-                {
-                    transform_tohost_VkPerformanceValueINTEL(m_state, (VkPerformanceValueINTEL*)(pValue));
+                reservedunmarshal_VkPerformanceValueINTEL(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                          (VkPerformanceValueINTEL*)(pValue),
+                                                          readStreamPtrPtr);
+                if (pValue) {
+                    transform_tohost_VkPerformanceValueINTEL(m_state,
+                                                             (VkPerformanceValueINTEL*)(pValue));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPerformanceParameterINTEL 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)parameter, (unsigned long long)pValue);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkGetPerformanceParameterINTEL 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device, (unsigned long long)parameter,
+                        (unsigned long long)pValue);
                 }
                 VkResult vkGetPerformanceParameterINTEL_VkResult_return = (VkResult)0;
-                vkGetPerformanceParameterINTEL_VkResult_return = vk->vkGetPerformanceParameterINTEL(unboxed_device, parameter, pValue);
-                if ((vkGetPerformanceParameterINTEL_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetPerformanceParameterINTEL_VkResult_return =
+                    vk->vkGetPerformanceParameterINTEL(unboxed_device, parameter, pValue);
+                if ((vkGetPerformanceParameterINTEL_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                if (pValue)
-                {
-                    transform_fromhost_VkPerformanceValueINTEL(m_state, (VkPerformanceValueINTEL*)(pValue));
+                if (pValue) {
+                    transform_fromhost_VkPerformanceValueINTEL(m_state,
+                                                               (VkPerformanceValueINTEL*)(pValue));
                 }
-                marshal_VkPerformanceValueINTEL(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPerformanceValueINTEL*)(pValue));
+                marshal_VkPerformanceValueINTEL(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                (VkPerformanceValueINTEL*)(pValue));
                 vkStream->write(&vkGetPerformanceParameterINTEL_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPerformanceParameterINTEL(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetPerformanceParameterINTEL_VkResult_return, device, parameter, pValue);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPerformanceParameterINTEL(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetPerformanceParameterINTEL_VkResult_return, device, parameter, pValue);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -23414,8 +27259,7 @@
 #ifdef VK_EXT_pci_bus_info
 #endif
 #ifdef VK_AMD_display_native_hdr
-            case OP_vkSetLocalDimmingAMD:
-            {
+            case OP_vkSetLocalDimmingAMD: {
                 android::base::beginTrace("vkSetLocalDimmingAMD decode");
                 VkDevice device;
                 VkSwapchainKHR swapChain;
@@ -23431,30 +27275,34 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkSwapchainKHR*)&swapChain = (VkSwapchainKHR)unbox_VkSwapchainKHR((VkSwapchainKHR)(*&cgen_var_1));
+                *(VkSwapchainKHR*)&swapChain =
+                    (VkSwapchainKHR)unbox_VkSwapchainKHR((VkSwapchainKHR)(*&cgen_var_1));
                 memcpy((VkBool32*)&localDimmingEnable, *readStreamPtrPtr, sizeof(VkBool32));
                 *readStreamPtrPtr += sizeof(VkBool32);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkSetLocalDimmingAMD 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)swapChain, (unsigned long long)localDimmingEnable);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkSetLocalDimmingAMD 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)swapChain,
+                            (unsigned long long)localDimmingEnable);
                 }
                 vk->vkSetLocalDimmingAMD(unboxed_device, swapChain, localDimmingEnable);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkSetLocalDimmingAMD(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, swapChain, localDimmingEnable);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkSetLocalDimmingAMD(snapshotTraceBegin,
+                                                              snapshotTraceBytes, &m_pool, device,
+                                                              swapChain, localDimmingEnable);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_FUCHSIA_imagepipe_surface
-            case OP_vkCreateImagePipeSurfaceFUCHSIA:
-            {
+            case OP_vkCreateImagePipeSurfaceFUCHSIA: {
                 android::base::beginTrace("vkCreateImagePipeSurfaceFUCHSIA decode");
                 VkInstance instance;
                 const VkImagePipeSurfaceCreateInfoFUCHSIA* pCreateInfo;
@@ -23468,16 +27316,20 @@
                 auto unboxed_instance = unbox_VkInstance(instance);
                 auto vk = dispatch_VkInstance(instance);
                 // End manual dispatchable handle unboxing for instance;
-                vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkImagePipeSurfaceCreateInfoFUCHSIA));
-                reservedunmarshal_VkImagePipeSurfaceCreateInfoFUCHSIA(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImagePipeSurfaceCreateInfoFUCHSIA*)(pCreateInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pCreateInfo,
+                                    sizeof(const VkImagePipeSurfaceCreateInfoFUCHSIA));
+                reservedunmarshal_VkImagePipeSurfaceCreateInfoFUCHSIA(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkImagePipeSurfaceCreateInfoFUCHSIA*)(pCreateInfo), readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pSurface;
                 vkReadStream->unsetHandleMapping();
@@ -23485,46 +27337,58 @@
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkSurfaceKHR*)pSurface = (VkSurfaceKHR)(VkSurfaceKHR)((VkSurfaceKHR)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkImagePipeSurfaceCreateInfoFUCHSIA(m_state, (VkImagePipeSurfaceCreateInfoFUCHSIA*)(pCreateInfo));
+                *(VkSurfaceKHR*)pSurface =
+                    (VkSurfaceKHR)(VkSurfaceKHR)((VkSurfaceKHR)(*&cgen_var_2));
+                if (pCreateInfo) {
+                    transform_tohost_VkImagePipeSurfaceCreateInfoFUCHSIA(
+                        m_state, (VkImagePipeSurfaceCreateInfoFUCHSIA*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateImagePipeSurfaceFUCHSIA 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)instance, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pSurface);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateImagePipeSurfaceFUCHSIA 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)instance, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pSurface);
                 }
                 VkResult vkCreateImagePipeSurfaceFUCHSIA_VkResult_return = (VkResult)0;
-                vkCreateImagePipeSurfaceFUCHSIA_VkResult_return = vk->vkCreateImagePipeSurfaceFUCHSIA(unboxed_instance, pCreateInfo, pAllocator, pSurface);
-                if ((vkCreateImagePipeSurfaceFUCHSIA_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateImagePipeSurfaceFUCHSIA_VkResult_return =
+                    vk->vkCreateImagePipeSurfaceFUCHSIA(unboxed_instance, pCreateInfo, pAllocator,
+                                                        pSurface);
+                if ((vkCreateImagePipeSurfaceFUCHSIA_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3;
                 vkStream->handleMapping()->mapHandles_VkSurfaceKHR_u64(pSurface, &cgen_var_3, 1);
                 vkStream->write((uint64_t*)&cgen_var_3, 8);
                 vkStream->write(&vkCreateImagePipeSurfaceFUCHSIA_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateImagePipeSurfaceFUCHSIA(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateImagePipeSurfaceFUCHSIA_VkResult_return, instance, pCreateInfo, pAllocator, pSurface);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateImagePipeSurfaceFUCHSIA(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateImagePipeSurfaceFUCHSIA_VkResult_return, instance, pCreateInfo,
+                        pAllocator, pSurface);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_EXT_metal_surface
-            case OP_vkCreateMetalSurfaceEXT:
-            {
+            case OP_vkCreateMetalSurfaceEXT: {
                 android::base::beginTrace("vkCreateMetalSurfaceEXT decode");
                 // Decoding vkCreateMetalSurfaceEXT is not supported. This should not run.
-                fprintf(stderr, "stream %p: fatal: decoding unsupported API vkCreateMetalSurfaceEXT\n", ioStream);
+                fprintf(stderr,
+                        "stream %p: fatal: decoding unsupported API vkCreateMetalSurfaceEXT\n",
+                        ioStream);
                 __builtin_trap();
                 android::base::endTrace();
                 break;
@@ -23553,8 +27417,7 @@
 #ifdef VK_NV_dedicated_allocation_image_aliasing
 #endif
 #ifdef VK_EXT_buffer_device_address
-            case OP_vkGetBufferDeviceAddressEXT:
-            {
+            case OP_vkGetBufferDeviceAddressEXT: {
                 android::base::beginTrace("vkGetBufferDeviceAddressEXT decode");
                 VkDevice device;
                 const VkBufferDeviceAddressInfo* pInfo;
@@ -23567,35 +27430,42 @@
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
                 vkReadStream->alloc((void**)&pInfo, sizeof(const VkBufferDeviceAddressInfo));
-                reservedunmarshal_VkBufferDeviceAddressInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferDeviceAddressInfo*)(pInfo), readStreamPtrPtr);
-                if (pInfo)
-                {
-                    transform_tohost_VkBufferDeviceAddressInfo(m_state, (VkBufferDeviceAddressInfo*)(pInfo));
+                reservedunmarshal_VkBufferDeviceAddressInfo(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferDeviceAddressInfo*)(pInfo),
+                    readStreamPtrPtr);
+                if (pInfo) {
+                    transform_tohost_VkBufferDeviceAddressInfo(m_state,
+                                                               (VkBufferDeviceAddressInfo*)(pInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetBufferDeviceAddressEXT 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pInfo);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkGetBufferDeviceAddressEXT 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pInfo);
                 }
-                VkDeviceAddress vkGetBufferDeviceAddressEXT_VkDeviceAddress_return = (VkDeviceAddress)0;
-                vkGetBufferDeviceAddressEXT_VkDeviceAddress_return = vk->vkGetBufferDeviceAddressEXT(unboxed_device, pInfo);
+                VkDeviceAddress vkGetBufferDeviceAddressEXT_VkDeviceAddress_return =
+                    (VkDeviceAddress)0;
+                vkGetBufferDeviceAddressEXT_VkDeviceAddress_return =
+                    vk->vkGetBufferDeviceAddressEXT(unboxed_device, pInfo);
                 vkStream->unsetHandleMapping();
-                vkStream->write(&vkGetBufferDeviceAddressEXT_VkDeviceAddress_return, sizeof(VkDeviceAddress));
+                vkStream->write(&vkGetBufferDeviceAddressEXT_VkDeviceAddress_return,
+                                sizeof(VkDeviceAddress));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetBufferDeviceAddressEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetBufferDeviceAddressEXT_VkDeviceAddress_return, device, pInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetBufferDeviceAddressEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetBufferDeviceAddressEXT_VkDeviceAddress_return, device, pInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_EXT_tooling_info
-            case OP_vkGetPhysicalDeviceToolPropertiesEXT:
-            {
+            case OP_vkGetPhysicalDeviceToolPropertiesEXT: {
                 android::base::beginTrace("vkGetPhysicalDeviceToolPropertiesEXT decode");
                 VkPhysicalDevice physicalDevice;
                 uint32_t* pToolCount;
@@ -23604,7 +27474,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
@@ -23614,8 +27485,7 @@
                 memcpy((uint32_t**)&pToolCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pToolCount);
                 *readStreamPtrPtr += 8;
-                if (pToolCount)
-                {
+                if (pToolCount) {
                     vkReadStream->alloc((void**)&pToolCount, sizeof(uint32_t));
                     memcpy((uint32_t*)pToolCount, *readStreamPtrPtr, sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
@@ -23623,75 +27493,84 @@
                 // Begin manual dispatchable handle unboxing for pToolProperties;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
-                memcpy((VkPhysicalDeviceToolPropertiesEXT**)&pToolProperties, (*readStreamPtrPtr), 8);
+                memcpy((VkPhysicalDeviceToolPropertiesEXT**)&pToolProperties, (*readStreamPtrPtr),
+                       8);
                 android::base::Stream::fromBe64((uint8_t*)&pToolProperties);
                 *readStreamPtrPtr += 8;
-                if (pToolProperties)
-                {
-                    vkReadStream->alloc((void**)&pToolProperties, (*(pToolCount)) * sizeof(VkPhysicalDeviceToolPropertiesEXT));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pToolCount)); ++i)
-                    {
-                        reservedunmarshal_VkPhysicalDeviceToolPropertiesEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceToolPropertiesEXT*)(pToolProperties + i), readStreamPtrPtr);
+                if (pToolProperties) {
+                    vkReadStream->alloc(
+                        (void**)&pToolProperties,
+                        (*(pToolCount)) * sizeof(VkPhysicalDeviceToolPropertiesEXT));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pToolCount)); ++i) {
+                        reservedunmarshal_VkPhysicalDeviceToolPropertiesEXT(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkPhysicalDeviceToolPropertiesEXT*)(pToolProperties + i),
+                            readStreamPtrPtr);
                     }
                 }
-                if (pToolCount)
-                {
-                    if (pToolProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pToolCount)); ++i)
-                        {
-                            transform_tohost_VkPhysicalDeviceToolPropertiesEXT(m_state, (VkPhysicalDeviceToolPropertiesEXT*)(pToolProperties + i));
+                if (pToolCount) {
+                    if (pToolProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pToolCount)); ++i) {
+                            transform_tohost_VkPhysicalDeviceToolPropertiesEXT(
+                                m_state, (VkPhysicalDeviceToolPropertiesEXT*)(pToolProperties + i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceToolPropertiesEXT 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pToolCount, (unsigned long long)pToolProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceToolPropertiesEXT 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)pToolCount, (unsigned long long)pToolProperties);
                 }
                 VkResult vkGetPhysicalDeviceToolPropertiesEXT_VkResult_return = (VkResult)0;
-                vkGetPhysicalDeviceToolPropertiesEXT_VkResult_return = vk->vkGetPhysicalDeviceToolPropertiesEXT(unboxed_physicalDevice, pToolCount, pToolProperties);
-                if ((vkGetPhysicalDeviceToolPropertiesEXT_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetPhysicalDeviceToolPropertiesEXT_VkResult_return =
+                    vk->vkGetPhysicalDeviceToolPropertiesEXT(unboxed_physicalDevice, pToolCount,
+                                                             pToolProperties);
+                if ((vkGetPhysicalDeviceToolPropertiesEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pToolCount;
                 vkStream->putBe64(cgen_var_3);
-                if (pToolCount)
-                {
+                if (pToolCount) {
                     vkStream->write((uint32_t*)pToolCount, sizeof(uint32_t));
                 }
-                if (pToolCount)
-                {
-                    if (pToolProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pToolCount)); ++i)
-                        {
-                            transform_fromhost_VkPhysicalDeviceToolPropertiesEXT(m_state, (VkPhysicalDeviceToolPropertiesEXT*)(pToolProperties + i));
+                if (pToolCount) {
+                    if (pToolProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pToolCount)); ++i) {
+                            transform_fromhost_VkPhysicalDeviceToolPropertiesEXT(
+                                m_state, (VkPhysicalDeviceToolPropertiesEXT*)(pToolProperties + i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pToolProperties;
                 vkStream->putBe64(cgen_var_4);
-                if (pToolProperties)
-                {
-                    if (pToolCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pToolCount)); ++i)
-                        {
-                            marshal_VkPhysicalDeviceToolPropertiesEXT(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceToolPropertiesEXT*)(pToolProperties + i));
+                if (pToolProperties) {
+                    if (pToolCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pToolCount)); ++i) {
+                            marshal_VkPhysicalDeviceToolPropertiesEXT(
+                                vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                (VkPhysicalDeviceToolPropertiesEXT*)(pToolProperties + i));
                         }
                     }
                 }
-                vkStream->write(&vkGetPhysicalDeviceToolPropertiesEXT_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkGetPhysicalDeviceToolPropertiesEXT_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceToolPropertiesEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetPhysicalDeviceToolPropertiesEXT_VkResult_return, physicalDevice, pToolCount, pToolProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceToolPropertiesEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetPhysicalDeviceToolPropertiesEXT_VkResult_return, physicalDevice,
+                        pToolCount, pToolProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -23701,9 +27580,9 @@
 #ifdef VK_EXT_validation_features
 #endif
 #ifdef VK_NV_cooperative_matrix
-            case OP_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV:
-            {
-                android::base::beginTrace("vkGetPhysicalDeviceCooperativeMatrixPropertiesNV decode");
+            case OP_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV: {
+                android::base::beginTrace(
+                    "vkGetPhysicalDeviceCooperativeMatrixPropertiesNV decode");
                 VkPhysicalDevice physicalDevice;
                 uint32_t* pPropertyCount;
                 VkCooperativeMatrixPropertiesNV* pProperties;
@@ -23711,7 +27590,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
@@ -23721,8 +27601,7 @@
                 memcpy((uint32_t**)&pPropertyCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pPropertyCount);
                 *readStreamPtrPtr += 8;
-                if (pPropertyCount)
-                {
+                if (pPropertyCount) {
                     vkReadStream->alloc((void**)&pPropertyCount, sizeof(uint32_t));
                     memcpy((uint32_t*)pPropertyCount, *readStreamPtrPtr, sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
@@ -23733,80 +27612,89 @@
                 memcpy((VkCooperativeMatrixPropertiesNV**)&pProperties, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pProperties);
                 *readStreamPtrPtr += 8;
-                if (pProperties)
-                {
-                    vkReadStream->alloc((void**)&pProperties, (*(pPropertyCount)) * sizeof(VkCooperativeMatrixPropertiesNV));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                    {
-                        reservedunmarshal_VkCooperativeMatrixPropertiesNV(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCooperativeMatrixPropertiesNV*)(pProperties + i), readStreamPtrPtr);
+                if (pProperties) {
+                    vkReadStream->alloc(
+                        (void**)&pProperties,
+                        (*(pPropertyCount)) * sizeof(VkCooperativeMatrixPropertiesNV));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                        reservedunmarshal_VkCooperativeMatrixPropertiesNV(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkCooperativeMatrixPropertiesNV*)(pProperties + i), readStreamPtrPtr);
                     }
                 }
-                if (pPropertyCount)
-                {
-                    if (pProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            transform_tohost_VkCooperativeMatrixPropertiesNV(m_state, (VkCooperativeMatrixPropertiesNV*)(pProperties + i));
+                if (pPropertyCount) {
+                    if (pProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            transform_tohost_VkCooperativeMatrixPropertiesNV(
+                                m_state, (VkCooperativeMatrixPropertiesNV*)(pProperties + i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceCooperativeMatrixPropertiesNV 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pPropertyCount, (unsigned long long)pProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceCooperativeMatrixPropertiesNV "
+                            "0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)pPropertyCount, (unsigned long long)pProperties);
                 }
-                VkResult vkGetPhysicalDeviceCooperativeMatrixPropertiesNV_VkResult_return = (VkResult)0;
-                vkGetPhysicalDeviceCooperativeMatrixPropertiesNV_VkResult_return = vk->vkGetPhysicalDeviceCooperativeMatrixPropertiesNV(unboxed_physicalDevice, pPropertyCount, pProperties);
-                if ((vkGetPhysicalDeviceCooperativeMatrixPropertiesNV_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                VkResult vkGetPhysicalDeviceCooperativeMatrixPropertiesNV_VkResult_return =
+                    (VkResult)0;
+                vkGetPhysicalDeviceCooperativeMatrixPropertiesNV_VkResult_return =
+                    vk->vkGetPhysicalDeviceCooperativeMatrixPropertiesNV(
+                        unboxed_physicalDevice, pPropertyCount, pProperties);
+                if ((vkGetPhysicalDeviceCooperativeMatrixPropertiesNV_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pPropertyCount;
                 vkStream->putBe64(cgen_var_3);
-                if (pPropertyCount)
-                {
+                if (pPropertyCount) {
                     vkStream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
                 }
-                if (pPropertyCount)
-                {
-                    if (pProperties)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            transform_fromhost_VkCooperativeMatrixPropertiesNV(m_state, (VkCooperativeMatrixPropertiesNV*)(pProperties + i));
+                if (pPropertyCount) {
+                    if (pProperties) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            transform_fromhost_VkCooperativeMatrixPropertiesNV(
+                                m_state, (VkCooperativeMatrixPropertiesNV*)(pProperties + i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pProperties;
                 vkStream->putBe64(cgen_var_4);
-                if (pProperties)
-                {
-                    if (pPropertyCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
-                        {
-                            marshal_VkCooperativeMatrixPropertiesNV(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCooperativeMatrixPropertiesNV*)(pProperties + i));
+                if (pProperties) {
+                    if (pPropertyCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
+                            marshal_VkCooperativeMatrixPropertiesNV(
+                                vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                (VkCooperativeMatrixPropertiesNV*)(pProperties + i));
                         }
                     }
                 }
-                vkStream->write(&vkGetPhysicalDeviceCooperativeMatrixPropertiesNV_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkGetPhysicalDeviceCooperativeMatrixPropertiesNV_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceCooperativeMatrixPropertiesNV(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetPhysicalDeviceCooperativeMatrixPropertiesNV_VkResult_return, physicalDevice, pPropertyCount, pProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceCooperativeMatrixPropertiesNV(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetPhysicalDeviceCooperativeMatrixPropertiesNV_VkResult_return,
+                        physicalDevice, pPropertyCount, pProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_NV_coverage_reduction_mode
-            case OP_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV:
-            {
-                android::base::beginTrace("vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV decode");
+            case OP_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV: {
+                android::base::beginTrace(
+                    "vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV decode");
                 VkPhysicalDevice physicalDevice;
                 uint32_t* pCombinationCount;
                 VkFramebufferMixedSamplesCombinationNV* pCombinations;
@@ -23814,7 +27702,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
@@ -23824,8 +27713,7 @@
                 memcpy((uint32_t**)&pCombinationCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pCombinationCount);
                 *readStreamPtrPtr += 8;
-                if (pCombinationCount)
-                {
+                if (pCombinationCount) {
                     vkReadStream->alloc((void**)&pCombinationCount, sizeof(uint32_t));
                     memcpy((uint32_t*)pCombinationCount, *readStreamPtrPtr, sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
@@ -23833,75 +27721,93 @@
                 // Begin manual dispatchable handle unboxing for pCombinations;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
-                memcpy((VkFramebufferMixedSamplesCombinationNV**)&pCombinations, (*readStreamPtrPtr), 8);
+                memcpy((VkFramebufferMixedSamplesCombinationNV**)&pCombinations,
+                       (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pCombinations);
                 *readStreamPtrPtr += 8;
-                if (pCombinations)
-                {
-                    vkReadStream->alloc((void**)&pCombinations, (*(pCombinationCount)) * sizeof(VkFramebufferMixedSamplesCombinationNV));
-                    for (uint32_t i = 0; i < (uint32_t)(*(pCombinationCount)); ++i)
-                    {
-                        reservedunmarshal_VkFramebufferMixedSamplesCombinationNV(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkFramebufferMixedSamplesCombinationNV*)(pCombinations + i), readStreamPtrPtr);
+                if (pCombinations) {
+                    vkReadStream->alloc(
+                        (void**)&pCombinations,
+                        (*(pCombinationCount)) * sizeof(VkFramebufferMixedSamplesCombinationNV));
+                    for (uint32_t i = 0; i < (uint32_t)(*(pCombinationCount)); ++i) {
+                        reservedunmarshal_VkFramebufferMixedSamplesCombinationNV(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkFramebufferMixedSamplesCombinationNV*)(pCombinations + i),
+                            readStreamPtrPtr);
                     }
                 }
-                if (pCombinationCount)
-                {
-                    if (pCombinations)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pCombinationCount)); ++i)
-                        {
-                            transform_tohost_VkFramebufferMixedSamplesCombinationNV(m_state, (VkFramebufferMixedSamplesCombinationNV*)(pCombinations + i));
+                if (pCombinationCount) {
+                    if (pCombinations) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pCombinationCount)); ++i) {
+                            transform_tohost_VkFramebufferMixedSamplesCombinationNV(
+                                m_state,
+                                (VkFramebufferMixedSamplesCombinationNV*)(pCombinations + i));
                         }
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pCombinationCount, (unsigned long long)pCombinations);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call "
+                            "vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV "
+                            "0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)pCombinationCount,
+                            (unsigned long long)pCombinations);
                 }
-                VkResult vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV_VkResult_return = (VkResult)0;
-                vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV_VkResult_return = vk->vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV(unboxed_physicalDevice, pCombinationCount, pCombinations);
-                if ((vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                VkResult
+                    vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV_VkResult_return =
+                        (VkResult)0;
+                vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV_VkResult_return =
+                    vk->vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV(
+                        unboxed_physicalDevice, pCombinationCount, pCombinations);
+                if ((vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pCombinationCount;
                 vkStream->putBe64(cgen_var_3);
-                if (pCombinationCount)
-                {
+                if (pCombinationCount) {
                     vkStream->write((uint32_t*)pCombinationCount, sizeof(uint32_t));
                 }
-                if (pCombinationCount)
-                {
-                    if (pCombinations)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pCombinationCount)); ++i)
-                        {
-                            transform_fromhost_VkFramebufferMixedSamplesCombinationNV(m_state, (VkFramebufferMixedSamplesCombinationNV*)(pCombinations + i));
+                if (pCombinationCount) {
+                    if (pCombinations) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pCombinationCount)); ++i) {
+                            transform_fromhost_VkFramebufferMixedSamplesCombinationNV(
+                                m_state,
+                                (VkFramebufferMixedSamplesCombinationNV*)(pCombinations + i));
                         }
                     }
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pCombinations;
                 vkStream->putBe64(cgen_var_4);
-                if (pCombinations)
-                {
-                    if (pCombinationCount)
-                    {
-                        for (uint32_t i = 0; i < (uint32_t)(*(pCombinationCount)); ++i)
-                        {
-                            marshal_VkFramebufferMixedSamplesCombinationNV(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkFramebufferMixedSamplesCombinationNV*)(pCombinations + i));
+                if (pCombinations) {
+                    if (pCombinationCount) {
+                        for (uint32_t i = 0; i < (uint32_t)(*(pCombinationCount)); ++i) {
+                            marshal_VkFramebufferMixedSamplesCombinationNV(
+                                vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                (VkFramebufferMixedSamplesCombinationNV*)(pCombinations + i));
                         }
                     }
                 }
-                vkStream->write(&vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV_VkResult_return, sizeof(VkResult));
+                vkStream->write(
+                    &vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV_VkResult_return,
+                    sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV_VkResult_return, physicalDevice, pCombinationCount, pCombinations);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()
+                        ->vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV(
+                            snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                            vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV_VkResult_return,
+                            physicalDevice, pCombinationCount, pCombinations);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -23913,8 +27819,7 @@
 #ifdef VK_EXT_provoking_vertex
 #endif
 #ifdef VK_EXT_full_screen_exclusive
-            case OP_vkGetPhysicalDeviceSurfacePresentModes2EXT:
-            {
+            case OP_vkGetPhysicalDeviceSurfacePresentModes2EXT: {
                 android::base::beginTrace("vkGetPhysicalDeviceSurfacePresentModes2EXT decode");
                 VkPhysicalDevice physicalDevice;
                 const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo;
@@ -23924,20 +27829,23 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
-                vkReadStream->alloc((void**)&pSurfaceInfo, sizeof(const VkPhysicalDeviceSurfaceInfo2KHR));
-                reservedunmarshal_VkPhysicalDeviceSurfaceInfo2KHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceSurfaceInfo2KHR*)(pSurfaceInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pSurfaceInfo,
+                                    sizeof(const VkPhysicalDeviceSurfaceInfo2KHR));
+                reservedunmarshal_VkPhysicalDeviceSurfaceInfo2KHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPhysicalDeviceSurfaceInfo2KHR*)(pSurfaceInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pPresentModeCount;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 memcpy((uint32_t**)&pPresentModeCount, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pPresentModeCount);
                 *readStreamPtrPtr += 8;
-                if (pPresentModeCount)
-                {
+                if (pPresentModeCount) {
                     vkReadStream->alloc((void**)&pPresentModeCount, sizeof(uint32_t));
                     memcpy((uint32_t*)pPresentModeCount, *readStreamPtrPtr, sizeof(uint32_t));
                     *readStreamPtrPtr += sizeof(uint32_t);
@@ -23948,53 +27856,65 @@
                 memcpy((VkPresentModeKHR**)&pPresentModes, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pPresentModes);
                 *readStreamPtrPtr += 8;
-                if (pPresentModes)
-                {
-                    vkReadStream->alloc((void**)&pPresentModes, (*(pPresentModeCount)) * sizeof(VkPresentModeKHR));
-                    memcpy((VkPresentModeKHR*)pPresentModes, *readStreamPtrPtr, (*(pPresentModeCount)) * sizeof(VkPresentModeKHR));
+                if (pPresentModes) {
+                    vkReadStream->alloc((void**)&pPresentModes,
+                                        (*(pPresentModeCount)) * sizeof(VkPresentModeKHR));
+                    memcpy((VkPresentModeKHR*)pPresentModes, *readStreamPtrPtr,
+                           (*(pPresentModeCount)) * sizeof(VkPresentModeKHR));
                     *readStreamPtrPtr += (*(pPresentModeCount)) * sizeof(VkPresentModeKHR);
                 }
-                if (pSurfaceInfo)
-                {
-                    transform_tohost_VkPhysicalDeviceSurfaceInfo2KHR(m_state, (VkPhysicalDeviceSurfaceInfo2KHR*)(pSurfaceInfo));
+                if (pSurfaceInfo) {
+                    transform_tohost_VkPhysicalDeviceSurfaceInfo2KHR(
+                        m_state, (VkPhysicalDeviceSurfaceInfo2KHR*)(pSurfaceInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceSurfacePresentModes2EXT 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)pSurfaceInfo, (unsigned long long)pPresentModeCount, (unsigned long long)pPresentModes);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceSurfacePresentModes2EXT 0x%llx "
+                            "0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)pSurfaceInfo, (unsigned long long)pPresentModeCount,
+                            (unsigned long long)pPresentModes);
                 }
                 VkResult vkGetPhysicalDeviceSurfacePresentModes2EXT_VkResult_return = (VkResult)0;
-                vkGetPhysicalDeviceSurfacePresentModes2EXT_VkResult_return = vk->vkGetPhysicalDeviceSurfacePresentModes2EXT(unboxed_physicalDevice, pSurfaceInfo, pPresentModeCount, pPresentModes);
-                if ((vkGetPhysicalDeviceSurfacePresentModes2EXT_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetPhysicalDeviceSurfacePresentModes2EXT_VkResult_return =
+                    vk->vkGetPhysicalDeviceSurfacePresentModes2EXT(
+                        unboxed_physicalDevice, pSurfaceInfo, pPresentModeCount, pPresentModes);
+                if ((vkGetPhysicalDeviceSurfacePresentModes2EXT_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pPresentModeCount;
                 vkStream->putBe64(cgen_var_3);
-                if (pPresentModeCount)
-                {
+                if (pPresentModeCount) {
                     vkStream->write((uint32_t*)pPresentModeCount, sizeof(uint32_t));
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pPresentModes;
                 vkStream->putBe64(cgen_var_4);
-                if (pPresentModes)
-                {
-                    vkStream->write((VkPresentModeKHR*)pPresentModes, (*(pPresentModeCount)) * sizeof(VkPresentModeKHR));
+                if (pPresentModes) {
+                    vkStream->write((VkPresentModeKHR*)pPresentModes,
+                                    (*(pPresentModeCount)) * sizeof(VkPresentModeKHR));
                 }
-                vkStream->write(&vkGetPhysicalDeviceSurfacePresentModes2EXT_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkGetPhysicalDeviceSurfacePresentModes2EXT_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceSurfacePresentModes2EXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetPhysicalDeviceSurfacePresentModes2EXT_VkResult_return, physicalDevice, pSurfaceInfo, pPresentModeCount, pPresentModes);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceSurfacePresentModes2EXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetPhysicalDeviceSurfacePresentModes2EXT_VkResult_return, physicalDevice,
+                        pSurfaceInfo, pPresentModeCount, pPresentModes);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkAcquireFullScreenExclusiveModeEXT:
-            {
+            case OP_vkAcquireFullScreenExclusiveModeEXT: {
                 android::base::beginTrace("vkAcquireFullScreenExclusiveModeEXT decode");
                 VkDevice device;
                 VkSwapchainKHR swapchain;
@@ -24009,30 +27929,37 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkSwapchainKHR*)&swapchain = (VkSwapchainKHR)unbox_VkSwapchainKHR((VkSwapchainKHR)(*&cgen_var_1));
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkAcquireFullScreenExclusiveModeEXT 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)swapchain);
+                *(VkSwapchainKHR*)&swapchain =
+                    (VkSwapchainKHR)unbox_VkSwapchainKHR((VkSwapchainKHR)(*&cgen_var_1));
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkAcquireFullScreenExclusiveModeEXT 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)swapchain);
                 }
                 VkResult vkAcquireFullScreenExclusiveModeEXT_VkResult_return = (VkResult)0;
-                vkAcquireFullScreenExclusiveModeEXT_VkResult_return = vk->vkAcquireFullScreenExclusiveModeEXT(unboxed_device, swapchain);
-                if ((vkAcquireFullScreenExclusiveModeEXT_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkAcquireFullScreenExclusiveModeEXT_VkResult_return =
+                    vk->vkAcquireFullScreenExclusiveModeEXT(unboxed_device, swapchain);
+                if ((vkAcquireFullScreenExclusiveModeEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                vkStream->write(&vkAcquireFullScreenExclusiveModeEXT_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkAcquireFullScreenExclusiveModeEXT_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkAcquireFullScreenExclusiveModeEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkAcquireFullScreenExclusiveModeEXT_VkResult_return, device, swapchain);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkAcquireFullScreenExclusiveModeEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkAcquireFullScreenExclusiveModeEXT_VkResult_return, device, swapchain);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkReleaseFullScreenExclusiveModeEXT:
-            {
+            case OP_vkReleaseFullScreenExclusiveModeEXT: {
                 android::base::beginTrace("vkReleaseFullScreenExclusiveModeEXT decode");
                 VkDevice device;
                 VkSwapchainKHR swapchain;
@@ -24047,30 +27974,37 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkSwapchainKHR*)&swapchain = (VkSwapchainKHR)unbox_VkSwapchainKHR((VkSwapchainKHR)(*&cgen_var_1));
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkReleaseFullScreenExclusiveModeEXT 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)swapchain);
+                *(VkSwapchainKHR*)&swapchain =
+                    (VkSwapchainKHR)unbox_VkSwapchainKHR((VkSwapchainKHR)(*&cgen_var_1));
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkReleaseFullScreenExclusiveModeEXT 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)swapchain);
                 }
                 VkResult vkReleaseFullScreenExclusiveModeEXT_VkResult_return = (VkResult)0;
-                vkReleaseFullScreenExclusiveModeEXT_VkResult_return = vk->vkReleaseFullScreenExclusiveModeEXT(unboxed_device, swapchain);
-                if ((vkReleaseFullScreenExclusiveModeEXT_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkReleaseFullScreenExclusiveModeEXT_VkResult_return =
+                    vk->vkReleaseFullScreenExclusiveModeEXT(unboxed_device, swapchain);
+                if ((vkReleaseFullScreenExclusiveModeEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                vkStream->write(&vkReleaseFullScreenExclusiveModeEXT_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkReleaseFullScreenExclusiveModeEXT_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkReleaseFullScreenExclusiveModeEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkReleaseFullScreenExclusiveModeEXT_VkResult_return, device, swapchain);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkReleaseFullScreenExclusiveModeEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkReleaseFullScreenExclusiveModeEXT_VkResult_return, device, swapchain);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetDeviceGroupSurfacePresentModes2EXT:
-            {
+            case OP_vkGetDeviceGroupSurfacePresentModes2EXT: {
                 android::base::beginTrace("vkGetDeviceGroupSurfacePresentModes2EXT decode");
                 VkDevice device;
                 const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo;
@@ -24083,56 +28017,70 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pSurfaceInfo, sizeof(const VkPhysicalDeviceSurfaceInfo2KHR));
-                reservedunmarshal_VkPhysicalDeviceSurfaceInfo2KHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceSurfaceInfo2KHR*)(pSurfaceInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pSurfaceInfo,
+                                    sizeof(const VkPhysicalDeviceSurfaceInfo2KHR));
+                reservedunmarshal_VkPhysicalDeviceSurfaceInfo2KHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPhysicalDeviceSurfaceInfo2KHR*)(pSurfaceInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pModes;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 memcpy((VkDeviceGroupPresentModeFlagsKHR**)&pModes, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pModes);
                 *readStreamPtrPtr += 8;
-                if (pModes)
-                {
+                if (pModes) {
                     vkReadStream->alloc((void**)&pModes, sizeof(VkDeviceGroupPresentModeFlagsKHR));
-                    memcpy((VkDeviceGroupPresentModeFlagsKHR*)pModes, *readStreamPtrPtr, sizeof(VkDeviceGroupPresentModeFlagsKHR));
+                    memcpy((VkDeviceGroupPresentModeFlagsKHR*)pModes, *readStreamPtrPtr,
+                           sizeof(VkDeviceGroupPresentModeFlagsKHR));
                     *readStreamPtrPtr += sizeof(VkDeviceGroupPresentModeFlagsKHR);
                 }
-                if (pSurfaceInfo)
-                {
-                    transform_tohost_VkPhysicalDeviceSurfaceInfo2KHR(m_state, (VkPhysicalDeviceSurfaceInfo2KHR*)(pSurfaceInfo));
+                if (pSurfaceInfo) {
+                    transform_tohost_VkPhysicalDeviceSurfaceInfo2KHR(
+                        m_state, (VkPhysicalDeviceSurfaceInfo2KHR*)(pSurfaceInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetDeviceGroupSurfacePresentModes2EXT 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pSurfaceInfo, (unsigned long long)pModes);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetDeviceGroupSurfacePresentModes2EXT 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pSurfaceInfo,
+                            (unsigned long long)pModes);
                 }
                 VkResult vkGetDeviceGroupSurfacePresentModes2EXT_VkResult_return = (VkResult)0;
-                vkGetDeviceGroupSurfacePresentModes2EXT_VkResult_return = vk->vkGetDeviceGroupSurfacePresentModes2EXT(unboxed_device, pSurfaceInfo, pModes);
-                if ((vkGetDeviceGroupSurfacePresentModes2EXT_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetDeviceGroupSurfacePresentModes2EXT_VkResult_return =
+                    vk->vkGetDeviceGroupSurfacePresentModes2EXT(unboxed_device, pSurfaceInfo,
+                                                                pModes);
+                if ((vkGetDeviceGroupSurfacePresentModes2EXT_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_2 = (uint64_t)(uintptr_t)pModes;
                 vkStream->putBe64(cgen_var_2);
-                if (pModes)
-                {
-                    vkStream->write((VkDeviceGroupPresentModeFlagsKHR*)pModes, sizeof(VkDeviceGroupPresentModeFlagsKHR));
+                if (pModes) {
+                    vkStream->write((VkDeviceGroupPresentModeFlagsKHR*)pModes,
+                                    sizeof(VkDeviceGroupPresentModeFlagsKHR));
                 }
-                vkStream->write(&vkGetDeviceGroupSurfacePresentModes2EXT_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkGetDeviceGroupSurfacePresentModes2EXT_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetDeviceGroupSurfacePresentModes2EXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetDeviceGroupSurfacePresentModes2EXT_VkResult_return, device, pSurfaceInfo, pModes);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetDeviceGroupSurfacePresentModes2EXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetDeviceGroupSurfacePresentModes2EXT_VkResult_return, device,
+                        pSurfaceInfo, pModes);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_EXT_headless_surface
-            case OP_vkCreateHeadlessSurfaceEXT:
-            {
+            case OP_vkCreateHeadlessSurfaceEXT: {
                 android::base::beginTrace("vkCreateHeadlessSurfaceEXT decode");
                 VkInstance instance;
                 const VkHeadlessSurfaceCreateInfoEXT* pCreateInfo;
@@ -24146,16 +28094,20 @@
                 auto unboxed_instance = unbox_VkInstance(instance);
                 auto vk = dispatch_VkInstance(instance);
                 // End manual dispatchable handle unboxing for instance;
-                vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkHeadlessSurfaceCreateInfoEXT));
-                reservedunmarshal_VkHeadlessSurfaceCreateInfoEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkHeadlessSurfaceCreateInfoEXT*)(pCreateInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pCreateInfo,
+                                    sizeof(const VkHeadlessSurfaceCreateInfoEXT));
+                reservedunmarshal_VkHeadlessSurfaceCreateInfoEXT(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkHeadlessSurfaceCreateInfoEXT*)(pCreateInfo), readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pSurface;
                 vkReadStream->unsetHandleMapping();
@@ -24163,43 +28115,52 @@
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkSurfaceKHR*)pSurface = (VkSurfaceKHR)(VkSurfaceKHR)((VkSurfaceKHR)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkHeadlessSurfaceCreateInfoEXT(m_state, (VkHeadlessSurfaceCreateInfoEXT*)(pCreateInfo));
+                *(VkSurfaceKHR*)pSurface =
+                    (VkSurfaceKHR)(VkSurfaceKHR)((VkSurfaceKHR)(*&cgen_var_2));
+                if (pCreateInfo) {
+                    transform_tohost_VkHeadlessSurfaceCreateInfoEXT(
+                        m_state, (VkHeadlessSurfaceCreateInfoEXT*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateHeadlessSurfaceEXT 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)instance, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pSurface);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkCreateHeadlessSurfaceEXT 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)instance, (unsigned long long)pCreateInfo,
+                        (unsigned long long)pAllocator, (unsigned long long)pSurface);
                 }
                 VkResult vkCreateHeadlessSurfaceEXT_VkResult_return = (VkResult)0;
-                vkCreateHeadlessSurfaceEXT_VkResult_return = vk->vkCreateHeadlessSurfaceEXT(unboxed_instance, pCreateInfo, pAllocator, pSurface);
-                if ((vkCreateHeadlessSurfaceEXT_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateHeadlessSurfaceEXT_VkResult_return = vk->vkCreateHeadlessSurfaceEXT(
+                    unboxed_instance, pCreateInfo, pAllocator, pSurface);
+                if ((vkCreateHeadlessSurfaceEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3;
                 vkStream->handleMapping()->mapHandles_VkSurfaceKHR_u64(pSurface, &cgen_var_3, 1);
                 vkStream->write((uint64_t*)&cgen_var_3, 8);
                 vkStream->write(&vkCreateHeadlessSurfaceEXT_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateHeadlessSurfaceEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateHeadlessSurfaceEXT_VkResult_return, instance, pCreateInfo, pAllocator, pSurface);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateHeadlessSurfaceEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateHeadlessSurfaceEXT_VkResult_return, instance, pCreateInfo,
+                        pAllocator, pSurface);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_EXT_line_rasterization
-            case OP_vkCmdSetLineStippleEXT:
-            {
+            case OP_vkCmdSetLineStippleEXT: {
                 android::base::beginTrace("vkCmdSetLineStippleEXT decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t lineStippleFactor;
@@ -24208,7 +28169,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -24216,20 +28178,27 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint16_t*)&lineStipplePattern, *readStreamPtrPtr, sizeof(uint16_t));
                 *readStreamPtrPtr += sizeof(uint16_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetLineStippleEXT 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)lineStippleFactor, (unsigned long long)lineStipplePattern);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdSetLineStippleEXT 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)lineStippleFactor,
+                            (unsigned long long)lineStipplePattern);
                 }
-                vk->vkCmdSetLineStippleEXT(unboxed_commandBuffer, lineStippleFactor, lineStipplePattern);
+                vk->vkCmdSetLineStippleEXT(unboxed_commandBuffer, lineStippleFactor,
+                                           lineStipplePattern);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetLineStippleEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, lineStippleFactor, lineStipplePattern);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetLineStippleEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        lineStippleFactor, lineStipplePattern);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -24237,8 +28206,7 @@
 #ifdef VK_EXT_shader_atomic_float
 #endif
 #ifdef VK_EXT_host_query_reset
-            case OP_vkResetQueryPoolEXT:
-            {
+            case OP_vkResetQueryPoolEXT: {
                 android::base::beginTrace("vkResetQueryPoolEXT decode");
                 VkDevice device;
                 VkQueryPool queryPool;
@@ -24255,25 +28223,31 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkQueryPool*)&queryPool = (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_1));
+                *(VkQueryPool*)&queryPool =
+                    (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_1));
                 memcpy((uint32_t*)&firstQuery, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&queryCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkResetQueryPoolEXT 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)queryPool, (unsigned long long)firstQuery, (unsigned long long)queryCount);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkResetQueryPoolEXT 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)queryPool,
+                            (unsigned long long)firstQuery, (unsigned long long)queryCount);
                 }
                 vk->vkResetQueryPoolEXT(unboxed_device, queryPool, firstQuery, queryCount);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkResetQueryPoolEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, queryPool, firstQuery, queryCount);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkResetQueryPoolEXT(snapshotTraceBegin, snapshotTraceBytes,
+                                                             &m_pool, device, queryPool, firstQuery,
+                                                             queryCount);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -24281,8 +28255,7 @@
 #ifdef VK_EXT_index_type_uint8
 #endif
 #ifdef VK_EXT_extended_dynamic_state
-            case OP_vkCmdSetCullModeEXT:
-            {
+            case OP_vkCmdSetCullModeEXT: {
                 android::base::beginTrace("vkCmdSetCullModeEXT decode");
                 VkCommandBuffer commandBuffer;
                 VkCullModeFlags cullMode;
@@ -24290,31 +28263,34 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 memcpy((VkCullModeFlags*)&cullMode, *readStreamPtrPtr, sizeof(VkCullModeFlags));
                 *readStreamPtrPtr += sizeof(VkCullModeFlags);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetCullModeEXT 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)cullMode);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdSetCullModeEXT 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)cullMode);
                 }
                 vk->vkCmdSetCullModeEXT(unboxed_commandBuffer, cullMode);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetCullModeEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, cullMode);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetCullModeEXT(snapshotTraceBegin, snapshotTraceBytes,
+                                                             &m_pool, commandBuffer, cullMode);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetFrontFaceEXT:
-            {
+            case OP_vkCmdSetFrontFaceEXT: {
                 android::base::beginTrace("vkCmdSetFrontFaceEXT decode");
                 VkCommandBuffer commandBuffer;
                 VkFrontFace frontFace;
@@ -24322,31 +28298,34 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 memcpy((VkFrontFace*)&frontFace, *readStreamPtrPtr, sizeof(VkFrontFace));
                 *readStreamPtrPtr += sizeof(VkFrontFace);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetFrontFaceEXT 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)frontFace);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdSetFrontFaceEXT 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)frontFace);
                 }
                 vk->vkCmdSetFrontFaceEXT(unboxed_commandBuffer, frontFace);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetFrontFaceEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, frontFace);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetFrontFaceEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, frontFace);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetPrimitiveTopologyEXT:
-            {
+            case OP_vkCmdSetPrimitiveTopologyEXT: {
                 android::base::beginTrace("vkCmdSetPrimitiveTopologyEXT decode");
                 VkCommandBuffer commandBuffer;
                 VkPrimitiveTopology primitiveTopology;
@@ -24354,31 +28333,36 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
-                memcpy((VkPrimitiveTopology*)&primitiveTopology, *readStreamPtrPtr, sizeof(VkPrimitiveTopology));
+                memcpy((VkPrimitiveTopology*)&primitiveTopology, *readStreamPtrPtr,
+                       sizeof(VkPrimitiveTopology));
                 *readStreamPtrPtr += sizeof(VkPrimitiveTopology);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetPrimitiveTopologyEXT 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)primitiveTopology);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdSetPrimitiveTopologyEXT 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)primitiveTopology);
                 }
                 vk->vkCmdSetPrimitiveTopologyEXT(unboxed_commandBuffer, primitiveTopology);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetPrimitiveTopologyEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, primitiveTopology);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetPrimitiveTopologyEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        primitiveTopology);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetViewportWithCountEXT:
-            {
+            case OP_vkCmdSetViewportWithCountEXT: {
                 android::base::beginTrace("vkCmdSetViewportWithCountEXT decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t viewportCount;
@@ -24387,43 +28371,47 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 memcpy((uint32_t*)&viewportCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pViewports, ((viewportCount)) * sizeof(const VkViewport));
-                for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i)
-                {
-                    reservedunmarshal_VkViewport(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkViewport*)(pViewports + i), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pViewports,
+                                    ((viewportCount)) * sizeof(const VkViewport));
+                for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i) {
+                    reservedunmarshal_VkViewport(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                 (VkViewport*)(pViewports + i), readStreamPtrPtr);
                 }
-                if (pViewports)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i)
-                    {
+                if (pViewports) {
+                    for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i) {
                         transform_tohost_VkViewport(m_state, (VkViewport*)(pViewports + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetViewportWithCountEXT 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)viewportCount, (unsigned long long)pViewports);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdSetViewportWithCountEXT 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)viewportCount, (unsigned long long)pViewports);
                 }
                 vk->vkCmdSetViewportWithCountEXT(unboxed_commandBuffer, viewportCount, pViewports);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetViewportWithCountEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, viewportCount, pViewports);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetViewportWithCountEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        viewportCount, pViewports);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetScissorWithCountEXT:
-            {
+            case OP_vkCmdSetScissorWithCountEXT: {
                 android::base::beginTrace("vkCmdSetScissorWithCountEXT decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t scissorCount;
@@ -24432,43 +28420,46 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 memcpy((uint32_t*)&scissorCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 vkReadStream->alloc((void**)&pScissors, ((scissorCount)) * sizeof(const VkRect2D));
-                for (uint32_t i = 0; i < (uint32_t)((scissorCount)); ++i)
-                {
-                    reservedunmarshal_VkRect2D(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRect2D*)(pScissors + i), readStreamPtrPtr);
+                for (uint32_t i = 0; i < (uint32_t)((scissorCount)); ++i) {
+                    reservedunmarshal_VkRect2D(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                               (VkRect2D*)(pScissors + i), readStreamPtrPtr);
                 }
-                if (pScissors)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((scissorCount)); ++i)
-                    {
+                if (pScissors) {
+                    for (uint32_t i = 0; i < (uint32_t)((scissorCount)); ++i) {
                         transform_tohost_VkRect2D(m_state, (VkRect2D*)(pScissors + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetScissorWithCountEXT 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)scissorCount, (unsigned long long)pScissors);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdSetScissorWithCountEXT 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)scissorCount, (unsigned long long)pScissors);
                 }
                 vk->vkCmdSetScissorWithCountEXT(unboxed_commandBuffer, scissorCount, pScissors);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetScissorWithCountEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, scissorCount, pScissors);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetScissorWithCountEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        scissorCount, pScissors);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdBindVertexBuffers2EXT:
-            {
+            case OP_vkCmdBindVertexBuffers2EXT: {
                 android::base::beginTrace("vkCmdBindVertexBuffers2EXT decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t firstBinding;
@@ -24481,7 +28472,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -24493,62 +28485,74 @@
                 memcpy((VkBuffer**)&pBuffers, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pBuffers);
                 *readStreamPtrPtr += 8;
-                if (pBuffers)
-                {
-                    vkReadStream->alloc((void**)&pBuffers, ((bindingCount)) * sizeof(const VkBuffer));
-                    if (((bindingCount)))
-                    {
+                if (pBuffers) {
+                    vkReadStream->alloc((void**)&pBuffers,
+                                        ((bindingCount)) * sizeof(const VkBuffer));
+                    if (((bindingCount))) {
                         uint8_t* cgen_var_1_0_ptr = (uint8_t*)(*readStreamPtrPtr);
                         *readStreamPtrPtr += 8 * ((bindingCount));
-                        for (uint32_t k = 0; k < ((bindingCount)); ++k)
-                        {
-                            uint64_t tmpval; memcpy(&tmpval, cgen_var_1_0_ptr + k * 8, sizeof(uint64_t));
-                            *(((VkBuffer*)pBuffers) + k) = (VkBuffer)unbox_VkBuffer((VkBuffer)tmpval);
+                        for (uint32_t k = 0; k < ((bindingCount)); ++k) {
+                            uint64_t tmpval;
+                            memcpy(&tmpval, cgen_var_1_0_ptr + k * 8, sizeof(uint64_t));
+                            *(((VkBuffer*)pBuffers) + k) =
+                                (VkBuffer)unbox_VkBuffer((VkBuffer)tmpval);
                         }
                     }
                 }
-                vkReadStream->alloc((void**)&pOffsets, ((bindingCount)) * sizeof(const VkDeviceSize));
-                memcpy((VkDeviceSize*)pOffsets, *readStreamPtrPtr, ((bindingCount)) * sizeof(const VkDeviceSize));
+                vkReadStream->alloc((void**)&pOffsets,
+                                    ((bindingCount)) * sizeof(const VkDeviceSize));
+                memcpy((VkDeviceSize*)pOffsets, *readStreamPtrPtr,
+                       ((bindingCount)) * sizeof(const VkDeviceSize));
                 *readStreamPtrPtr += ((bindingCount)) * sizeof(const VkDeviceSize);
                 // WARNING PTR CHECK
                 memcpy((VkDeviceSize**)&pSizes, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pSizes);
                 *readStreamPtrPtr += 8;
-                if (pSizes)
-                {
-                    vkReadStream->alloc((void**)&pSizes, ((bindingCount)) * sizeof(const VkDeviceSize));
-                    memcpy((VkDeviceSize*)pSizes, *readStreamPtrPtr, ((bindingCount)) * sizeof(const VkDeviceSize));
+                if (pSizes) {
+                    vkReadStream->alloc((void**)&pSizes,
+                                        ((bindingCount)) * sizeof(const VkDeviceSize));
+                    memcpy((VkDeviceSize*)pSizes, *readStreamPtrPtr,
+                           ((bindingCount)) * sizeof(const VkDeviceSize));
                     *readStreamPtrPtr += ((bindingCount)) * sizeof(const VkDeviceSize);
                 }
                 // WARNING PTR CHECK
                 memcpy((VkDeviceSize**)&pStrides, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pStrides);
                 *readStreamPtrPtr += 8;
-                if (pStrides)
-                {
-                    vkReadStream->alloc((void**)&pStrides, ((bindingCount)) * sizeof(const VkDeviceSize));
-                    memcpy((VkDeviceSize*)pStrides, *readStreamPtrPtr, ((bindingCount)) * sizeof(const VkDeviceSize));
+                if (pStrides) {
+                    vkReadStream->alloc((void**)&pStrides,
+                                        ((bindingCount)) * sizeof(const VkDeviceSize));
+                    memcpy((VkDeviceSize*)pStrides, *readStreamPtrPtr,
+                           ((bindingCount)) * sizeof(const VkDeviceSize));
                     *readStreamPtrPtr += ((bindingCount)) * sizeof(const VkDeviceSize);
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdBindVertexBuffers2EXT 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)firstBinding, (unsigned long long)bindingCount, (unsigned long long)pBuffers, (unsigned long long)pOffsets, (unsigned long long)pSizes, (unsigned long long)pStrides);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdBindVertexBuffers2EXT 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)firstBinding, (unsigned long long)bindingCount,
+                            (unsigned long long)pBuffers, (unsigned long long)pOffsets,
+                            (unsigned long long)pSizes, (unsigned long long)pStrides);
                 }
-                vk->vkCmdBindVertexBuffers2EXT(unboxed_commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets, pSizes, pStrides);
+                vk->vkCmdBindVertexBuffers2EXT(unboxed_commandBuffer, firstBinding, bindingCount,
+                                               pBuffers, pOffsets, pSizes, pStrides);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdBindVertexBuffers2EXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets, pSizes, pStrides);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdBindVertexBuffers2EXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        firstBinding, bindingCount, pBuffers, pOffsets, pSizes, pStrides);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetDepthTestEnableEXT:
-            {
+            case OP_vkCmdSetDepthTestEnableEXT: {
                 android::base::beginTrace("vkCmdSetDepthTestEnableEXT decode");
                 VkCommandBuffer commandBuffer;
                 VkBool32 depthTestEnable;
@@ -24556,31 +28560,35 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 memcpy((VkBool32*)&depthTestEnable, *readStreamPtrPtr, sizeof(VkBool32));
                 *readStreamPtrPtr += sizeof(VkBool32);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetDepthTestEnableEXT 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)depthTestEnable);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdSetDepthTestEnableEXT 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)depthTestEnable);
                 }
                 vk->vkCmdSetDepthTestEnableEXT(unboxed_commandBuffer, depthTestEnable);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetDepthTestEnableEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, depthTestEnable);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetDepthTestEnableEXT(snapshotTraceBegin,
+                                                                    snapshotTraceBytes, &m_pool,
+                                                                    commandBuffer, depthTestEnable);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetDepthWriteEnableEXT:
-            {
+            case OP_vkCmdSetDepthWriteEnableEXT: {
                 android::base::beginTrace("vkCmdSetDepthWriteEnableEXT decode");
                 VkCommandBuffer commandBuffer;
                 VkBool32 depthWriteEnable;
@@ -24588,31 +28596,35 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 memcpy((VkBool32*)&depthWriteEnable, *readStreamPtrPtr, sizeof(VkBool32));
                 *readStreamPtrPtr += sizeof(VkBool32);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetDepthWriteEnableEXT 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)depthWriteEnable);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdSetDepthWriteEnableEXT 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)depthWriteEnable);
                 }
                 vk->vkCmdSetDepthWriteEnableEXT(unboxed_commandBuffer, depthWriteEnable);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetDepthWriteEnableEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, depthWriteEnable);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetDepthWriteEnableEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        depthWriteEnable);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetDepthCompareOpEXT:
-            {
+            case OP_vkCmdSetDepthCompareOpEXT: {
                 android::base::beginTrace("vkCmdSetDepthCompareOpEXT decode");
                 VkCommandBuffer commandBuffer;
                 VkCompareOp depthCompareOp;
@@ -24620,31 +28632,35 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 memcpy((VkCompareOp*)&depthCompareOp, *readStreamPtrPtr, sizeof(VkCompareOp));
                 *readStreamPtrPtr += sizeof(VkCompareOp);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetDepthCompareOpEXT 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)depthCompareOp);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdSetDepthCompareOpEXT 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)depthCompareOp);
                 }
                 vk->vkCmdSetDepthCompareOpEXT(unboxed_commandBuffer, depthCompareOp);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetDepthCompareOpEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, depthCompareOp);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetDepthCompareOpEXT(snapshotTraceBegin,
+                                                                   snapshotTraceBytes, &m_pool,
+                                                                   commandBuffer, depthCompareOp);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetDepthBoundsTestEnableEXT:
-            {
+            case OP_vkCmdSetDepthBoundsTestEnableEXT: {
                 android::base::beginTrace("vkCmdSetDepthBoundsTestEnableEXT decode");
                 VkCommandBuffer commandBuffer;
                 VkBool32 depthBoundsTestEnable;
@@ -24652,31 +28668,36 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 memcpy((VkBool32*)&depthBoundsTestEnable, *readStreamPtrPtr, sizeof(VkBool32));
                 *readStreamPtrPtr += sizeof(VkBool32);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetDepthBoundsTestEnableEXT 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)depthBoundsTestEnable);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdSetDepthBoundsTestEnableEXT 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)depthBoundsTestEnable);
                 }
                 vk->vkCmdSetDepthBoundsTestEnableEXT(unboxed_commandBuffer, depthBoundsTestEnable);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetDepthBoundsTestEnableEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, depthBoundsTestEnable);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetDepthBoundsTestEnableEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        depthBoundsTestEnable);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetStencilTestEnableEXT:
-            {
+            case OP_vkCmdSetStencilTestEnableEXT: {
                 android::base::beginTrace("vkCmdSetStencilTestEnableEXT decode");
                 VkCommandBuffer commandBuffer;
                 VkBool32 stencilTestEnable;
@@ -24684,31 +28705,35 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 memcpy((VkBool32*)&stencilTestEnable, *readStreamPtrPtr, sizeof(VkBool32));
                 *readStreamPtrPtr += sizeof(VkBool32);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetStencilTestEnableEXT 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)stencilTestEnable);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdSetStencilTestEnableEXT 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)stencilTestEnable);
                 }
                 vk->vkCmdSetStencilTestEnableEXT(unboxed_commandBuffer, stencilTestEnable);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetStencilTestEnableEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, stencilTestEnable);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetStencilTestEnableEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        stencilTestEnable);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetStencilOpEXT:
-            {
+            case OP_vkCmdSetStencilOpEXT: {
                 android::base::beginTrace("vkCmdSetStencilOpEXT decode");
                 VkCommandBuffer commandBuffer;
                 VkStencilFaceFlags faceMask;
@@ -24720,11 +28745,13 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
-                memcpy((VkStencilFaceFlags*)&faceMask, *readStreamPtrPtr, sizeof(VkStencilFaceFlags));
+                memcpy((VkStencilFaceFlags*)&faceMask, *readStreamPtrPtr,
+                       sizeof(VkStencilFaceFlags));
                 *readStreamPtrPtr += sizeof(VkStencilFaceFlags);
                 memcpy((VkStencilOp*)&failOp, *readStreamPtrPtr, sizeof(VkStencilOp));
                 *readStreamPtrPtr += sizeof(VkStencilOp);
@@ -24734,20 +28761,29 @@
                 *readStreamPtrPtr += sizeof(VkStencilOp);
                 memcpy((VkCompareOp*)&compareOp, *readStreamPtrPtr, sizeof(VkCompareOp));
                 *readStreamPtrPtr += sizeof(VkCompareOp);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetStencilOpEXT 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)faceMask, (unsigned long long)failOp, (unsigned long long)passOp, (unsigned long long)depthFailOp, (unsigned long long)compareOp);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdSetStencilOpEXT 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)faceMask, (unsigned long long)failOp,
+                            (unsigned long long)passOp, (unsigned long long)depthFailOp,
+                            (unsigned long long)compareOp);
                 }
-                vk->vkCmdSetStencilOpEXT(unboxed_commandBuffer, faceMask, failOp, passOp, depthFailOp, compareOp);
+                vk->vkCmdSetStencilOpEXT(unboxed_commandBuffer, faceMask, failOp, passOp,
+                                         depthFailOp, compareOp);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetStencilOpEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, faceMask, failOp, passOp, depthFailOp, compareOp);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetStencilOpEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, faceMask,
+                        failOp, passOp, depthFailOp, compareOp);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -24757,8 +28793,7 @@
 #ifdef VK_EXT_shader_demote_to_helper_invocation
 #endif
 #ifdef VK_NV_device_generated_commands
-            case OP_vkGetGeneratedCommandsMemoryRequirementsNV:
-            {
+            case OP_vkGetGeneratedCommandsMemoryRequirementsNV: {
                 android::base::beginTrace("vkGetGeneratedCommandsMemoryRequirementsNV decode");
                 VkDevice device;
                 const VkGeneratedCommandsMemoryRequirementsInfoNV* pInfo;
@@ -24771,45 +28806,57 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pInfo, sizeof(const VkGeneratedCommandsMemoryRequirementsInfoNV));
-                reservedunmarshal_VkGeneratedCommandsMemoryRequirementsInfoNV(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkGeneratedCommandsMemoryRequirementsInfoNV*)(pInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pInfo,
+                                    sizeof(const VkGeneratedCommandsMemoryRequirementsInfoNV));
+                reservedunmarshal_VkGeneratedCommandsMemoryRequirementsInfoNV(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkGeneratedCommandsMemoryRequirementsInfoNV*)(pInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pMemoryRequirements;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pMemoryRequirements, sizeof(VkMemoryRequirements2));
-                reservedunmarshal_VkMemoryRequirements2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements2*)(pMemoryRequirements), readStreamPtrPtr);
-                if (pInfo)
-                {
-                    transform_tohost_VkGeneratedCommandsMemoryRequirementsInfoNV(m_state, (VkGeneratedCommandsMemoryRequirementsInfoNV*)(pInfo));
+                reservedunmarshal_VkMemoryRequirements2(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkMemoryRequirements2*)(pMemoryRequirements), readStreamPtrPtr);
+                if (pInfo) {
+                    transform_tohost_VkGeneratedCommandsMemoryRequirementsInfoNV(
+                        m_state, (VkGeneratedCommandsMemoryRequirementsInfoNV*)(pInfo));
                 }
-                if (pMemoryRequirements)
-                {
-                    transform_tohost_VkMemoryRequirements2(m_state, (VkMemoryRequirements2*)(pMemoryRequirements));
+                if (pMemoryRequirements) {
+                    transform_tohost_VkMemoryRequirements2(
+                        m_state, (VkMemoryRequirements2*)(pMemoryRequirements));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetGeneratedCommandsMemoryRequirementsNV 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pInfo, (unsigned long long)pMemoryRequirements);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetGeneratedCommandsMemoryRequirementsNV 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pInfo,
+                            (unsigned long long)pMemoryRequirements);
                 }
-                vk->vkGetGeneratedCommandsMemoryRequirementsNV(unboxed_device, pInfo, pMemoryRequirements);
+                vk->vkGetGeneratedCommandsMemoryRequirementsNV(unboxed_device, pInfo,
+                                                               pMemoryRequirements);
                 vkStream->unsetHandleMapping();
-                if (pMemoryRequirements)
-                {
-                    transform_fromhost_VkMemoryRequirements2(m_state, (VkMemoryRequirements2*)(pMemoryRequirements));
+                if (pMemoryRequirements) {
+                    transform_fromhost_VkMemoryRequirements2(
+                        m_state, (VkMemoryRequirements2*)(pMemoryRequirements));
                 }
-                marshal_VkMemoryRequirements2(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements2*)(pMemoryRequirements));
+                marshal_VkMemoryRequirements2(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                              (VkMemoryRequirements2*)(pMemoryRequirements));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetGeneratedCommandsMemoryRequirementsNV(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, pInfo, pMemoryRequirements);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetGeneratedCommandsMemoryRequirementsNV(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, pInfo,
+                        pMemoryRequirements);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdPreprocessGeneratedCommandsNV:
-            {
+            case OP_vkCmdPreprocessGeneratedCommandsNV: {
                 android::base::beginTrace("vkCmdPreprocessGeneratedCommandsNV decode");
                 VkCommandBuffer commandBuffer;
                 const VkGeneratedCommandsInfoNV* pGeneratedCommandsInfo;
@@ -24817,35 +28864,44 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
-                vkReadStream->alloc((void**)&pGeneratedCommandsInfo, sizeof(const VkGeneratedCommandsInfoNV));
-                reservedunmarshal_VkGeneratedCommandsInfoNV(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkGeneratedCommandsInfoNV*)(pGeneratedCommandsInfo), readStreamPtrPtr);
-                if (pGeneratedCommandsInfo)
-                {
-                    transform_tohost_VkGeneratedCommandsInfoNV(m_state, (VkGeneratedCommandsInfoNV*)(pGeneratedCommandsInfo));
+                vkReadStream->alloc((void**)&pGeneratedCommandsInfo,
+                                    sizeof(const VkGeneratedCommandsInfoNV));
+                reservedunmarshal_VkGeneratedCommandsInfoNV(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkGeneratedCommandsInfoNV*)(pGeneratedCommandsInfo), readStreamPtrPtr);
+                if (pGeneratedCommandsInfo) {
+                    transform_tohost_VkGeneratedCommandsInfoNV(
+                        m_state, (VkGeneratedCommandsInfoNV*)(pGeneratedCommandsInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdPreprocessGeneratedCommandsNV 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pGeneratedCommandsInfo);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdPreprocessGeneratedCommandsNV 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pGeneratedCommandsInfo);
                 }
-                vk->vkCmdPreprocessGeneratedCommandsNV(unboxed_commandBuffer, pGeneratedCommandsInfo);
+                vk->vkCmdPreprocessGeneratedCommandsNV(unboxed_commandBuffer,
+                                                       pGeneratedCommandsInfo);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdPreprocessGeneratedCommandsNV(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pGeneratedCommandsInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdPreprocessGeneratedCommandsNV(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        pGeneratedCommandsInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdExecuteGeneratedCommandsNV:
-            {
+            case OP_vkCmdExecuteGeneratedCommandsNV: {
                 android::base::beginTrace("vkCmdExecuteGeneratedCommandsNV decode");
                 VkCommandBuffer commandBuffer;
                 VkBool32 isPreprocessed;
@@ -24854,37 +28910,48 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 memcpy((VkBool32*)&isPreprocessed, *readStreamPtrPtr, sizeof(VkBool32));
                 *readStreamPtrPtr += sizeof(VkBool32);
-                vkReadStream->alloc((void**)&pGeneratedCommandsInfo, sizeof(const VkGeneratedCommandsInfoNV));
-                reservedunmarshal_VkGeneratedCommandsInfoNV(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkGeneratedCommandsInfoNV*)(pGeneratedCommandsInfo), readStreamPtrPtr);
-                if (pGeneratedCommandsInfo)
-                {
-                    transform_tohost_VkGeneratedCommandsInfoNV(m_state, (VkGeneratedCommandsInfoNV*)(pGeneratedCommandsInfo));
+                vkReadStream->alloc((void**)&pGeneratedCommandsInfo,
+                                    sizeof(const VkGeneratedCommandsInfoNV));
+                reservedunmarshal_VkGeneratedCommandsInfoNV(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkGeneratedCommandsInfoNV*)(pGeneratedCommandsInfo), readStreamPtrPtr);
+                if (pGeneratedCommandsInfo) {
+                    transform_tohost_VkGeneratedCommandsInfoNV(
+                        m_state, (VkGeneratedCommandsInfoNV*)(pGeneratedCommandsInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdExecuteGeneratedCommandsNV 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)isPreprocessed, (unsigned long long)pGeneratedCommandsInfo);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkCmdExecuteGeneratedCommandsNV 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)commandBuffer,
+                        (unsigned long long)isPreprocessed,
+                        (unsigned long long)pGeneratedCommandsInfo);
                 }
-                vk->vkCmdExecuteGeneratedCommandsNV(unboxed_commandBuffer, isPreprocessed, pGeneratedCommandsInfo);
+                vk->vkCmdExecuteGeneratedCommandsNV(unboxed_commandBuffer, isPreprocessed,
+                                                    pGeneratedCommandsInfo);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdExecuteGeneratedCommandsNV(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, isPreprocessed, pGeneratedCommandsInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdExecuteGeneratedCommandsNV(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        isPreprocessed, pGeneratedCommandsInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdBindPipelineShaderGroupNV:
-            {
+            case OP_vkCmdBindPipelineShaderGroupNV: {
                 android::base::beginTrace("vkCmdBindPipelineShaderGroupNV decode");
                 VkCommandBuffer commandBuffer;
                 VkPipelineBindPoint pipelineBindPoint;
@@ -24894,11 +28961,13 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
-                memcpy((VkPipelineBindPoint*)&pipelineBindPoint, *readStreamPtrPtr, sizeof(VkPipelineBindPoint));
+                memcpy((VkPipelineBindPoint*)&pipelineBindPoint, *readStreamPtrPtr,
+                       sizeof(VkPipelineBindPoint));
                 *readStreamPtrPtr += sizeof(VkPipelineBindPoint);
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
@@ -24906,25 +28975,32 @@
                 *(VkPipeline*)&pipeline = (VkPipeline)unbox_VkPipeline((VkPipeline)(*&cgen_var_1));
                 memcpy((uint32_t*)&groupIndex, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdBindPipelineShaderGroupNV 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pipelineBindPoint, (unsigned long long)pipeline, (unsigned long long)groupIndex);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdBindPipelineShaderGroupNV 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pipelineBindPoint, (unsigned long long)pipeline,
+                            (unsigned long long)groupIndex);
                 }
-                vk->vkCmdBindPipelineShaderGroupNV(unboxed_commandBuffer, pipelineBindPoint, pipeline, groupIndex);
+                vk->vkCmdBindPipelineShaderGroupNV(unboxed_commandBuffer, pipelineBindPoint,
+                                                   pipeline, groupIndex);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdBindPipelineShaderGroupNV(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pipelineBindPoint, pipeline, groupIndex);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdBindPipelineShaderGroupNV(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        pipelineBindPoint, pipeline, groupIndex);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCreateIndirectCommandsLayoutNV:
-            {
+            case OP_vkCreateIndirectCommandsLayoutNV: {
                 android::base::beginTrace("vkCreateIndirectCommandsLayoutNV decode");
                 VkDevice device;
                 const VkIndirectCommandsLayoutCreateInfoNV* pCreateInfo;
@@ -24938,63 +29014,85 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkIndirectCommandsLayoutCreateInfoNV));
-                reservedunmarshal_VkIndirectCommandsLayoutCreateInfoNV(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkIndirectCommandsLayoutCreateInfoNV*)(pCreateInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pCreateInfo,
+                                    sizeof(const VkIndirectCommandsLayoutCreateInfoNV));
+                reservedunmarshal_VkIndirectCommandsLayoutCreateInfoNV(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkIndirectCommandsLayoutCreateInfoNV*)(pCreateInfo), readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pIndirectCommandsLayout;
                 vkReadStream->unsetHandleMapping();
-                vkReadStream->alloc((void**)&pIndirectCommandsLayout, sizeof(VkIndirectCommandsLayoutNV));
+                vkReadStream->alloc((void**)&pIndirectCommandsLayout,
+                                    sizeof(VkIndirectCommandsLayoutNV));
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkIndirectCommandsLayoutNV*)pIndirectCommandsLayout = (VkIndirectCommandsLayoutNV)(VkIndirectCommandsLayoutNV)((VkIndirectCommandsLayoutNV)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkIndirectCommandsLayoutCreateInfoNV(m_state, (VkIndirectCommandsLayoutCreateInfoNV*)(pCreateInfo));
+                *(VkIndirectCommandsLayoutNV*)pIndirectCommandsLayout =
+                    (VkIndirectCommandsLayoutNV)(VkIndirectCommandsLayoutNV)((
+                        VkIndirectCommandsLayoutNV)(*&cgen_var_2));
+                if (pCreateInfo) {
+                    transform_tohost_VkIndirectCommandsLayoutCreateInfoNV(
+                        m_state, (VkIndirectCommandsLayoutCreateInfoNV*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateIndirectCommandsLayoutNV 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pIndirectCommandsLayout);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateIndirectCommandsLayoutNV 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator,
+                            (unsigned long long)pIndirectCommandsLayout);
                 }
                 VkResult vkCreateIndirectCommandsLayoutNV_VkResult_return = (VkResult)0;
-                vkCreateIndirectCommandsLayoutNV_VkResult_return = vk->vkCreateIndirectCommandsLayoutNV(unboxed_device, pCreateInfo, pAllocator, pIndirectCommandsLayout);
-                if ((vkCreateIndirectCommandsLayoutNV_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateIndirectCommandsLayoutNV_VkResult_return =
+                    vk->vkCreateIndirectCommandsLayoutNV(unboxed_device, pCreateInfo, pAllocator,
+                                                         pIndirectCommandsLayout);
+                if ((vkCreateIndirectCommandsLayoutNV_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // Begin auto non dispatchable handle create for pIndirectCommandsLayout;
-                if (vkCreateIndirectCommandsLayoutNV_VkResult_return == VK_SUCCESS) vkStream->setHandleMapping(&m_boxedHandleCreateMapping);
+                if (vkCreateIndirectCommandsLayoutNV_VkResult_return == VK_SUCCESS)
+                    vkStream->setHandleMapping(&m_boxedHandleCreateMapping);
                 uint64_t cgen_var_3;
-                static_assert(8 == sizeof(VkIndirectCommandsLayoutNV), "handle map overwrite requires VkIndirectCommandsLayoutNV to be 8 bytes long");
-                vkStream->handleMapping()->mapHandles_VkIndirectCommandsLayoutNV((VkIndirectCommandsLayoutNV*)pIndirectCommandsLayout, 1);
+                static_assert(
+                    8 == sizeof(VkIndirectCommandsLayoutNV),
+                    "handle map overwrite requires VkIndirectCommandsLayoutNV to be 8 bytes long");
+                vkStream->handleMapping()->mapHandles_VkIndirectCommandsLayoutNV(
+                    (VkIndirectCommandsLayoutNV*)pIndirectCommandsLayout, 1);
                 vkStream->write((VkIndirectCommandsLayoutNV*)pIndirectCommandsLayout, 8 * 1);
                 // Begin auto non dispatchable handle create for pIndirectCommandsLayout;
                 vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
-                vkStream->write(&vkCreateIndirectCommandsLayoutNV_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkCreateIndirectCommandsLayoutNV_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateIndirectCommandsLayoutNV(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateIndirectCommandsLayoutNV_VkResult_return, device, pCreateInfo, pAllocator, pIndirectCommandsLayout);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateIndirectCommandsLayoutNV(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateIndirectCommandsLayoutNV_VkResult_return, device, pCreateInfo,
+                        pAllocator, pIndirectCommandsLayout);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroyIndirectCommandsLayoutNV:
-            {
+            case OP_vkDestroyIndirectCommandsLayoutNV: {
                 android::base::beginTrace("vkDestroyIndirectCommandsLayoutNV decode");
                 VkDevice device;
                 VkIndirectCommandsLayoutNV indirectCommandsLayout;
@@ -25012,37 +29110,47 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkIndirectCommandsLayoutNV*)&indirectCommandsLayout = (VkIndirectCommandsLayoutNV)(VkIndirectCommandsLayoutNV)((VkIndirectCommandsLayoutNV)(*&cgen_var_1));
+                *(VkIndirectCommandsLayoutNV*)&indirectCommandsLayout =
+                    (VkIndirectCommandsLayoutNV)(VkIndirectCommandsLayoutNV)((
+                        VkIndirectCommandsLayoutNV)(*&cgen_var_1));
                 boxed_indirectCommandsLayout_preserve = indirectCommandsLayout;
                 indirectCommandsLayout = unbox_VkIndirectCommandsLayoutNV(indirectCommandsLayout);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroyIndirectCommandsLayoutNV 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)indirectCommandsLayout, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkDestroyIndirectCommandsLayoutNV 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device,
+                        (unsigned long long)indirectCommandsLayout, (unsigned long long)pAllocator);
                 }
-                vk->vkDestroyIndirectCommandsLayoutNV(unboxed_device, indirectCommandsLayout, pAllocator);
+                vk->vkDestroyIndirectCommandsLayoutNV(unboxed_device, indirectCommandsLayout,
+                                                      pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroyIndirectCommandsLayoutNV(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, boxed_indirectCommandsLayout_preserve, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroyIndirectCommandsLayoutNV(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device,
+                        boxed_indirectCommandsLayout_preserve, pAllocator);
                 }
                 delete_VkIndirectCommandsLayoutNV(boxed_indirectCommandsLayout_preserve);
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -25056,8 +29164,7 @@
 #ifdef VK_EXT_device_memory_report
 #endif
 #ifdef VK_EXT_acquire_drm_display
-            case OP_vkAcquireDrmDisplayEXT:
-            {
+            case OP_vkAcquireDrmDisplayEXT: {
                 android::base::beginTrace("vkAcquireDrmDisplayEXT decode");
                 VkPhysicalDevice physicalDevice;
                 int32_t drmFd;
@@ -25066,7 +29173,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
@@ -25075,30 +29183,37 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDisplayKHR*)&display = (VkDisplayKHR)unbox_VkDisplayKHR((VkDisplayKHR)(*&cgen_var_1));
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkAcquireDrmDisplayEXT 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)drmFd, (unsigned long long)display);
+                *(VkDisplayKHR*)&display =
+                    (VkDisplayKHR)unbox_VkDisplayKHR((VkDisplayKHR)(*&cgen_var_1));
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkAcquireDrmDisplayEXT 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice, (unsigned long long)drmFd,
+                            (unsigned long long)display);
                 }
                 VkResult vkAcquireDrmDisplayEXT_VkResult_return = (VkResult)0;
-                vkAcquireDrmDisplayEXT_VkResult_return = vk->vkAcquireDrmDisplayEXT(unboxed_physicalDevice, drmFd, display);
-                if ((vkAcquireDrmDisplayEXT_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkAcquireDrmDisplayEXT_VkResult_return =
+                    vk->vkAcquireDrmDisplayEXT(unboxed_physicalDevice, drmFd, display);
+                if ((vkAcquireDrmDisplayEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkAcquireDrmDisplayEXT_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkAcquireDrmDisplayEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkAcquireDrmDisplayEXT_VkResult_return, physicalDevice, drmFd, display);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkAcquireDrmDisplayEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkAcquireDrmDisplayEXT_VkResult_return, physicalDevice, drmFd, display);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetDrmDisplayEXT:
-            {
+            case OP_vkGetDrmDisplayEXT: {
                 android::base::beginTrace("vkGetDrmDisplayEXT decode");
                 VkPhysicalDevice physicalDevice;
                 int32_t drmFd;
@@ -25108,7 +29223,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
@@ -25122,28 +29238,37 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkDisplayKHR*)display = (VkDisplayKHR)(VkDisplayKHR)((VkDisplayKHR)(*&cgen_var_1));
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetDrmDisplayEXT 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)drmFd, (unsigned long long)connectorId, (unsigned long long)display);
+                *(VkDisplayKHR*)display =
+                    (VkDisplayKHR)(VkDisplayKHR)((VkDisplayKHR)(*&cgen_var_1));
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetDrmDisplayEXT 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice, (unsigned long long)drmFd,
+                            (unsigned long long)connectorId, (unsigned long long)display);
                 }
                 VkResult vkGetDrmDisplayEXT_VkResult_return = (VkResult)0;
-                vkGetDrmDisplayEXT_VkResult_return = vk->vkGetDrmDisplayEXT(unboxed_physicalDevice, drmFd, connectorId, display);
-                if ((vkGetDrmDisplayEXT_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetDrmDisplayEXT_VkResult_return =
+                    vk->vkGetDrmDisplayEXT(unboxed_physicalDevice, drmFd, connectorId, display);
+                if ((vkGetDrmDisplayEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_2;
                 vkStream->handleMapping()->mapHandles_VkDisplayKHR_u64(display, &cgen_var_2, 1);
                 vkStream->write((uint64_t*)&cgen_var_2, 8);
                 vkStream->write(&vkGetDrmDisplayEXT_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetDrmDisplayEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetDrmDisplayEXT_VkResult_return, physicalDevice, drmFd, connectorId, display);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetDrmDisplayEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetDrmDisplayEXT_VkResult_return, physicalDevice, drmFd, connectorId,
+                        display);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -25155,8 +29280,7 @@
 #ifdef VK_GOOGLE_user_type
 #endif
 #ifdef VK_EXT_private_data
-            case OP_vkCreatePrivateDataSlotEXT:
-            {
+            case OP_vkCreatePrivateDataSlotEXT: {
                 android::base::beginTrace("vkCreatePrivateDataSlotEXT decode");
                 VkDevice device;
                 const VkPrivateDataSlotCreateInfoEXT* pCreateInfo;
@@ -25170,16 +29294,20 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkPrivateDataSlotCreateInfoEXT));
-                reservedunmarshal_VkPrivateDataSlotCreateInfoEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPrivateDataSlotCreateInfoEXT*)(pCreateInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pCreateInfo,
+                                    sizeof(const VkPrivateDataSlotCreateInfoEXT));
+                reservedunmarshal_VkPrivateDataSlotCreateInfoEXT(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPrivateDataSlotCreateInfoEXT*)(pCreateInfo), readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pPrivateDataSlot;
                 vkReadStream->unsetHandleMapping();
@@ -25187,39 +29315,47 @@
                 memcpy((VkPrivateDataSlotEXT*)&(*pPrivateDataSlot), (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&(*pPrivateDataSlot));
                 *readStreamPtrPtr += 8;
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkPrivateDataSlotCreateInfoEXT(m_state, (VkPrivateDataSlotCreateInfoEXT*)(pCreateInfo));
+                if (pCreateInfo) {
+                    transform_tohost_VkPrivateDataSlotCreateInfoEXT(
+                        m_state, (VkPrivateDataSlotCreateInfoEXT*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreatePrivateDataSlotEXT 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pPrivateDataSlot);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkCreatePrivateDataSlotEXT 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                        (unsigned long long)pAllocator, (unsigned long long)pPrivateDataSlot);
                 }
                 VkResult vkCreatePrivateDataSlotEXT_VkResult_return = (VkResult)0;
-                vkCreatePrivateDataSlotEXT_VkResult_return = vk->vkCreatePrivateDataSlotEXT(unboxed_device, pCreateInfo, pAllocator, pPrivateDataSlot);
-                if ((vkCreatePrivateDataSlotEXT_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreatePrivateDataSlotEXT_VkResult_return = vk->vkCreatePrivateDataSlotEXT(
+                    unboxed_device, pCreateInfo, pAllocator, pPrivateDataSlot);
+                if ((vkCreatePrivateDataSlotEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3 = (uint64_t)(*pPrivateDataSlot);
                 vkStream->putBe64(cgen_var_3);
                 vkStream->write(&vkCreatePrivateDataSlotEXT_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreatePrivateDataSlotEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreatePrivateDataSlotEXT_VkResult_return, device, pCreateInfo, pAllocator, pPrivateDataSlot);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreatePrivateDataSlotEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreatePrivateDataSlotEXT_VkResult_return, device, pCreateInfo, pAllocator,
+                        pPrivateDataSlot);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroyPrivateDataSlotEXT:
-            {
+            case OP_vkDestroyPrivateDataSlotEXT: {
                 android::base::beginTrace("vkDestroyPrivateDataSlotEXT decode");
                 VkDevice device;
                 VkPrivateDataSlotEXT privateDataSlot;
@@ -25239,34 +29375,39 @@
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroyPrivateDataSlotEXT 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)privateDataSlot, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkDestroyPrivateDataSlotEXT 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device,
+                            (unsigned long long)privateDataSlot, (unsigned long long)pAllocator);
                 }
                 vk->vkDestroyPrivateDataSlotEXT(unboxed_device, privateDataSlot, pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroyPrivateDataSlotEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, privateDataSlot, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroyPrivateDataSlotEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, privateDataSlot,
+                        pAllocator);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkSetPrivateDataEXT:
-            {
+            case OP_vkSetPrivateDataEXT: {
                 android::base::beginTrace("vkSetPrivateDataEXT decode");
                 VkDevice device;
                 VkObjectType objectType;
@@ -25290,29 +29431,38 @@
                 *readStreamPtrPtr += 8;
                 memcpy((uint64_t*)&data, *readStreamPtrPtr, sizeof(uint64_t));
                 *readStreamPtrPtr += sizeof(uint64_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkSetPrivateDataEXT 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)objectType, (unsigned long long)objectHandle, (unsigned long long)privateDataSlot, (unsigned long long)data);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkSetPrivateDataEXT 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device, (unsigned long long)objectType,
+                        (unsigned long long)objectHandle, (unsigned long long)privateDataSlot,
+                        (unsigned long long)data);
                 }
                 VkResult vkSetPrivateDataEXT_VkResult_return = (VkResult)0;
-                vkSetPrivateDataEXT_VkResult_return = vk->vkSetPrivateDataEXT(unboxed_device, objectType, objectHandle, privateDataSlot, data);
-                if ((vkSetPrivateDataEXT_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkSetPrivateDataEXT_VkResult_return = vk->vkSetPrivateDataEXT(
+                    unboxed_device, objectType, objectHandle, privateDataSlot, data);
+                if ((vkSetPrivateDataEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkSetPrivateDataEXT_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkSetPrivateDataEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkSetPrivateDataEXT_VkResult_return, device, objectType, objectHandle, privateDataSlot, data);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkSetPrivateDataEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkSetPrivateDataEXT_VkResult_return, device, objectType, objectHandle,
+                        privateDataSlot, data);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPrivateDataEXT:
-            {
+            case OP_vkGetPrivateDataEXT: {
                 android::base::beginTrace("vkGetPrivateDataEXT decode");
                 VkDevice device;
                 VkObjectType objectType;
@@ -25339,22 +29489,30 @@
                 vkReadStream->alloc((void**)&pData, sizeof(uint64_t));
                 memcpy((uint64_t*)pData, *readStreamPtrPtr, sizeof(uint64_t));
                 *readStreamPtrPtr += sizeof(uint64_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPrivateDataEXT 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)objectType, (unsigned long long)objectHandle, (unsigned long long)privateDataSlot, (unsigned long long)pData);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkGetPrivateDataEXT 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device, (unsigned long long)objectType,
+                        (unsigned long long)objectHandle, (unsigned long long)privateDataSlot,
+                        (unsigned long long)pData);
                 }
-                vk->vkGetPrivateDataEXT(unboxed_device, objectType, objectHandle, privateDataSlot, pData);
+                vk->vkGetPrivateDataEXT(unboxed_device, objectType, objectHandle, privateDataSlot,
+                                        pData);
                 vkStream->unsetHandleMapping();
                 vkStream->write((uint64_t*)pData, sizeof(uint64_t));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPrivateDataEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, objectType, objectHandle, privateDataSlot, pData);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPrivateDataEXT(snapshotTraceBegin, snapshotTraceBytes,
+                                                             &m_pool, device, objectType,
+                                                             objectHandle, privateDataSlot, pData);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -25366,8 +29524,7 @@
 #ifdef VK_QCOM_render_pass_store_ops
 #endif
 #ifdef VK_NV_fragment_shading_rate_enums
-            case OP_vkCmdSetFragmentShadingRateEnumNV:
-            {
+            case OP_vkCmdSetFragmentShadingRateEnumNV: {
                 android::base::beginTrace("vkCmdSetFragmentShadingRateEnumNV decode");
                 VkCommandBuffer commandBuffer;
                 VkFragmentShadingRateNV shadingRate;
@@ -25376,28 +29533,38 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
-                memcpy((VkFragmentShadingRateNV*)&shadingRate, *readStreamPtrPtr, sizeof(VkFragmentShadingRateNV));
+                memcpy((VkFragmentShadingRateNV*)&shadingRate, *readStreamPtrPtr,
+                       sizeof(VkFragmentShadingRateNV));
                 *readStreamPtrPtr += sizeof(VkFragmentShadingRateNV);
-                memcpy((VkFragmentShadingRateCombinerOpKHR*)combinerOps, *readStreamPtrPtr, 2 * sizeof(const VkFragmentShadingRateCombinerOpKHR));
+                memcpy((VkFragmentShadingRateCombinerOpKHR*)combinerOps, *readStreamPtrPtr,
+                       2 * sizeof(const VkFragmentShadingRateCombinerOpKHR));
                 *readStreamPtrPtr += 2 * sizeof(const VkFragmentShadingRateCombinerOpKHR);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetFragmentShadingRateEnumNV 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)shadingRate, (unsigned long long)combinerOps);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkCmdSetFragmentShadingRateEnumNV 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)commandBuffer,
+                        (unsigned long long)shadingRate, (unsigned long long)combinerOps);
                 }
-                vk->vkCmdSetFragmentShadingRateEnumNV(unboxed_commandBuffer, shadingRate, combinerOps);
+                vk->vkCmdSetFragmentShadingRateEnumNV(unboxed_commandBuffer, shadingRate,
+                                                      combinerOps);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetFragmentShadingRateEnumNV(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, shadingRate, combinerOps);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetFragmentShadingRateEnumNV(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, shadingRate,
+                        combinerOps);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -25417,8 +29584,7 @@
 #ifdef VK_EXT_rgba10x6_formats
 #endif
 #ifdef VK_NV_acquire_winrt_display
-            case OP_vkAcquireWinrtDisplayNV:
-            {
+            case OP_vkAcquireWinrtDisplayNV: {
                 android::base::beginTrace("vkAcquireWinrtDisplayNV decode");
                 VkPhysicalDevice physicalDevice;
                 VkDisplayKHR display;
@@ -25426,37 +29592,44 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDisplayKHR*)&display = (VkDisplayKHR)unbox_VkDisplayKHR((VkDisplayKHR)(*&cgen_var_1));
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkAcquireWinrtDisplayNV 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)display);
+                *(VkDisplayKHR*)&display =
+                    (VkDisplayKHR)unbox_VkDisplayKHR((VkDisplayKHR)(*&cgen_var_1));
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkAcquireWinrtDisplayNV 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)display);
                 }
                 VkResult vkAcquireWinrtDisplayNV_VkResult_return = (VkResult)0;
-                vkAcquireWinrtDisplayNV_VkResult_return = vk->vkAcquireWinrtDisplayNV(unboxed_physicalDevice, display);
-                if ((vkAcquireWinrtDisplayNV_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkAcquireWinrtDisplayNV_VkResult_return =
+                    vk->vkAcquireWinrtDisplayNV(unboxed_physicalDevice, display);
+                if ((vkAcquireWinrtDisplayNV_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkAcquireWinrtDisplayNV_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkAcquireWinrtDisplayNV(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkAcquireWinrtDisplayNV_VkResult_return, physicalDevice, display);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkAcquireWinrtDisplayNV(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkAcquireWinrtDisplayNV_VkResult_return, physicalDevice, display);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetWinrtDisplayNV:
-            {
+            case OP_vkGetWinrtDisplayNV: {
                 android::base::beginTrace("vkGetWinrtDisplayNV decode");
                 VkPhysicalDevice physicalDevice;
                 uint32_t deviceRelativeId;
@@ -25465,7 +29638,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
@@ -25477,35 +29651,42 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkDisplayKHR*)pDisplay = (VkDisplayKHR)(VkDisplayKHR)((VkDisplayKHR)(*&cgen_var_1));
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetWinrtDisplayNV 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)deviceRelativeId, (unsigned long long)pDisplay);
+                *(VkDisplayKHR*)pDisplay =
+                    (VkDisplayKHR)(VkDisplayKHR)((VkDisplayKHR)(*&cgen_var_1));
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkGetWinrtDisplayNV 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)deviceRelativeId, (unsigned long long)pDisplay);
                 }
                 VkResult vkGetWinrtDisplayNV_VkResult_return = (VkResult)0;
-                vkGetWinrtDisplayNV_VkResult_return = vk->vkGetWinrtDisplayNV(unboxed_physicalDevice, deviceRelativeId, pDisplay);
-                if ((vkGetWinrtDisplayNV_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetWinrtDisplayNV_VkResult_return =
+                    vk->vkGetWinrtDisplayNV(unboxed_physicalDevice, deviceRelativeId, pDisplay);
+                if ((vkGetWinrtDisplayNV_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_2;
                 vkStream->handleMapping()->mapHandles_VkDisplayKHR_u64(pDisplay, &cgen_var_2, 1);
                 vkStream->write((uint64_t*)&cgen_var_2, 8);
                 vkStream->write(&vkGetWinrtDisplayNV_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetWinrtDisplayNV(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetWinrtDisplayNV_VkResult_return, physicalDevice, deviceRelativeId, pDisplay);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetWinrtDisplayNV(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetWinrtDisplayNV_VkResult_return, physicalDevice, deviceRelativeId,
+                        pDisplay);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_EXT_directfb_surface
-            case OP_vkCreateDirectFBSurfaceEXT:
-            {
+            case OP_vkCreateDirectFBSurfaceEXT: {
                 android::base::beginTrace("vkCreateDirectFBSurfaceEXT decode");
                 VkInstance instance;
                 const VkDirectFBSurfaceCreateInfoEXT* pCreateInfo;
@@ -25519,16 +29700,20 @@
                 auto unboxed_instance = unbox_VkInstance(instance);
                 auto vk = dispatch_VkInstance(instance);
                 // End manual dispatchable handle unboxing for instance;
-                vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkDirectFBSurfaceCreateInfoEXT));
-                reservedunmarshal_VkDirectFBSurfaceCreateInfoEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDirectFBSurfaceCreateInfoEXT*)(pCreateInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pCreateInfo,
+                                    sizeof(const VkDirectFBSurfaceCreateInfoEXT));
+                reservedunmarshal_VkDirectFBSurfaceCreateInfoEXT(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkDirectFBSurfaceCreateInfoEXT*)(pCreateInfo), readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pSurface;
                 vkReadStream->unsetHandleMapping();
@@ -25536,42 +29721,52 @@
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkSurfaceKHR*)pSurface = (VkSurfaceKHR)(VkSurfaceKHR)((VkSurfaceKHR)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkDirectFBSurfaceCreateInfoEXT(m_state, (VkDirectFBSurfaceCreateInfoEXT*)(pCreateInfo));
+                *(VkSurfaceKHR*)pSurface =
+                    (VkSurfaceKHR)(VkSurfaceKHR)((VkSurfaceKHR)(*&cgen_var_2));
+                if (pCreateInfo) {
+                    transform_tohost_VkDirectFBSurfaceCreateInfoEXT(
+                        m_state, (VkDirectFBSurfaceCreateInfoEXT*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateDirectFBSurfaceEXT 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)instance, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pSurface);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkCreateDirectFBSurfaceEXT 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)instance, (unsigned long long)pCreateInfo,
+                        (unsigned long long)pAllocator, (unsigned long long)pSurface);
                 }
                 VkResult vkCreateDirectFBSurfaceEXT_VkResult_return = (VkResult)0;
-                vkCreateDirectFBSurfaceEXT_VkResult_return = vk->vkCreateDirectFBSurfaceEXT(unboxed_instance, pCreateInfo, pAllocator, pSurface);
-                if ((vkCreateDirectFBSurfaceEXT_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateDirectFBSurfaceEXT_VkResult_return = vk->vkCreateDirectFBSurfaceEXT(
+                    unboxed_instance, pCreateInfo, pAllocator, pSurface);
+                if ((vkCreateDirectFBSurfaceEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3;
                 vkStream->handleMapping()->mapHandles_VkSurfaceKHR_u64(pSurface, &cgen_var_3, 1);
                 vkStream->write((uint64_t*)&cgen_var_3, 8);
                 vkStream->write(&vkCreateDirectFBSurfaceEXT_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateDirectFBSurfaceEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateDirectFBSurfaceEXT_VkResult_return, instance, pCreateInfo, pAllocator, pSurface);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateDirectFBSurfaceEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateDirectFBSurfaceEXT_VkResult_return, instance, pCreateInfo,
+                        pAllocator, pSurface);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceDirectFBPresentationSupportEXT:
-            {
-                android::base::beginTrace("vkGetPhysicalDeviceDirectFBPresentationSupportEXT decode");
+            case OP_vkGetPhysicalDeviceDirectFBPresentationSupportEXT: {
+                android::base::beginTrace(
+                    "vkGetPhysicalDeviceDirectFBPresentationSupportEXT decode");
                 VkPhysicalDevice physicalDevice;
                 uint32_t queueFamilyIndex;
                 IDirectFB* dfb;
@@ -25579,7 +29774,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
@@ -25590,24 +29786,35 @@
                 vkReadStream->alloc((void**)&dfb, sizeof(IDirectFB));
                 memcpy((IDirectFB*)dfb, *readStreamPtrPtr, sizeof(IDirectFB));
                 *readStreamPtrPtr += sizeof(IDirectFB);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceDirectFBPresentationSupportEXT 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)queueFamilyIndex, (unsigned long long)dfb);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceDirectFBPresentationSupportEXT "
+                            "0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)queueFamilyIndex, (unsigned long long)dfb);
                 }
-                VkBool32 vkGetPhysicalDeviceDirectFBPresentationSupportEXT_VkBool32_return = (VkBool32)0;
-                vkGetPhysicalDeviceDirectFBPresentationSupportEXT_VkBool32_return = vk->vkGetPhysicalDeviceDirectFBPresentationSupportEXT(unboxed_physicalDevice, queueFamilyIndex, dfb);
+                VkBool32 vkGetPhysicalDeviceDirectFBPresentationSupportEXT_VkBool32_return =
+                    (VkBool32)0;
+                vkGetPhysicalDeviceDirectFBPresentationSupportEXT_VkBool32_return =
+                    vk->vkGetPhysicalDeviceDirectFBPresentationSupportEXT(unboxed_physicalDevice,
+                                                                          queueFamilyIndex, dfb);
                 vkStream->unsetHandleMapping();
                 vkStream->write((IDirectFB*)dfb, sizeof(IDirectFB));
-                vkStream->write(&vkGetPhysicalDeviceDirectFBPresentationSupportEXT_VkBool32_return, sizeof(VkBool32));
+                vkStream->write(&vkGetPhysicalDeviceDirectFBPresentationSupportEXT_VkBool32_return,
+                                sizeof(VkBool32));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceDirectFBPresentationSupportEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetPhysicalDeviceDirectFBPresentationSupportEXT_VkBool32_return, physicalDevice, queueFamilyIndex, dfb);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceDirectFBPresentationSupportEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetPhysicalDeviceDirectFBPresentationSupportEXT_VkBool32_return,
+                        physicalDevice, queueFamilyIndex, dfb);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -25615,8 +29822,7 @@
 #ifdef VK_VALVE_mutable_descriptor_type
 #endif
 #ifdef VK_EXT_vertex_input_dynamic_state
-            case OP_vkCmdSetVertexInputEXT:
-            {
+            case OP_vkCmdSetVertexInputEXT: {
                 android::base::beginTrace("vkCmdSetVertexInputEXT decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t vertexBindingDescriptionCount;
@@ -25627,52 +29833,77 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
-                memcpy((uint32_t*)&vertexBindingDescriptionCount, *readStreamPtrPtr, sizeof(uint32_t));
+                memcpy((uint32_t*)&vertexBindingDescriptionCount, *readStreamPtrPtr,
+                       sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pVertexBindingDescriptions, ((vertexBindingDescriptionCount)) * sizeof(const VkVertexInputBindingDescription2EXT));
-                for (uint32_t i = 0; i < (uint32_t)((vertexBindingDescriptionCount)); ++i)
-                {
-                    reservedunmarshal_VkVertexInputBindingDescription2EXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkVertexInputBindingDescription2EXT*)(pVertexBindingDescriptions + i), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pVertexBindingDescriptions,
+                                    ((vertexBindingDescriptionCount)) *
+                                        sizeof(const VkVertexInputBindingDescription2EXT));
+                for (uint32_t i = 0; i < (uint32_t)((vertexBindingDescriptionCount)); ++i) {
+                    reservedunmarshal_VkVertexInputBindingDescription2EXT(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkVertexInputBindingDescription2EXT*)(pVertexBindingDescriptions + i),
+                        readStreamPtrPtr);
                 }
-                memcpy((uint32_t*)&vertexAttributeDescriptionCount, *readStreamPtrPtr, sizeof(uint32_t));
+                memcpy((uint32_t*)&vertexAttributeDescriptionCount, *readStreamPtrPtr,
+                       sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pVertexAttributeDescriptions, ((vertexAttributeDescriptionCount)) * sizeof(const VkVertexInputAttributeDescription2EXT));
-                for (uint32_t i = 0; i < (uint32_t)((vertexAttributeDescriptionCount)); ++i)
-                {
-                    reservedunmarshal_VkVertexInputAttributeDescription2EXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkVertexInputAttributeDescription2EXT*)(pVertexAttributeDescriptions + i), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pVertexAttributeDescriptions,
+                                    ((vertexAttributeDescriptionCount)) *
+                                        sizeof(const VkVertexInputAttributeDescription2EXT));
+                for (uint32_t i = 0; i < (uint32_t)((vertexAttributeDescriptionCount)); ++i) {
+                    reservedunmarshal_VkVertexInputAttributeDescription2EXT(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkVertexInputAttributeDescription2EXT*)(pVertexAttributeDescriptions + i),
+                        readStreamPtrPtr);
                 }
-                if (pVertexBindingDescriptions)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((vertexBindingDescriptionCount)); ++i)
-                    {
-                        transform_tohost_VkVertexInputBindingDescription2EXT(m_state, (VkVertexInputBindingDescription2EXT*)(pVertexBindingDescriptions + i));
+                if (pVertexBindingDescriptions) {
+                    for (uint32_t i = 0; i < (uint32_t)((vertexBindingDescriptionCount)); ++i) {
+                        transform_tohost_VkVertexInputBindingDescription2EXT(
+                            m_state,
+                            (VkVertexInputBindingDescription2EXT*)(pVertexBindingDescriptions + i));
                     }
                 }
-                if (pVertexAttributeDescriptions)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((vertexAttributeDescriptionCount)); ++i)
-                    {
-                        transform_tohost_VkVertexInputAttributeDescription2EXT(m_state, (VkVertexInputAttributeDescription2EXT*)(pVertexAttributeDescriptions + i));
+                if (pVertexAttributeDescriptions) {
+                    for (uint32_t i = 0; i < (uint32_t)((vertexAttributeDescriptionCount)); ++i) {
+                        transform_tohost_VkVertexInputAttributeDescription2EXT(
+                            m_state,
+                            (VkVertexInputAttributeDescription2EXT*)(pVertexAttributeDescriptions +
+                                                                     i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetVertexInputEXT 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)vertexBindingDescriptionCount, (unsigned long long)pVertexBindingDescriptions, (unsigned long long)vertexAttributeDescriptionCount, (unsigned long long)pVertexAttributeDescriptions);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdSetVertexInputEXT 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)vertexBindingDescriptionCount,
+                            (unsigned long long)pVertexBindingDescriptions,
+                            (unsigned long long)vertexAttributeDescriptionCount,
+                            (unsigned long long)pVertexAttributeDescriptions);
                 }
-                vk->vkCmdSetVertexInputEXT(unboxed_commandBuffer, vertexBindingDescriptionCount, pVertexBindingDescriptions, vertexAttributeDescriptionCount, pVertexAttributeDescriptions);
+                vk->vkCmdSetVertexInputEXT(unboxed_commandBuffer, vertexBindingDescriptionCount,
+                                           pVertexBindingDescriptions,
+                                           vertexAttributeDescriptionCount,
+                                           pVertexAttributeDescriptions);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetVertexInputEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, vertexBindingDescriptionCount, pVertexBindingDescriptions, vertexAttributeDescriptionCount, pVertexAttributeDescriptions);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetVertexInputEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        vertexBindingDescriptionCount, pVertexBindingDescriptions,
+                        vertexAttributeDescriptionCount, pVertexAttributeDescriptions);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -25682,8 +29913,7 @@
 #ifdef VK_EXT_primitive_topology_list_restart
 #endif
 #ifdef VK_FUCHSIA_external_memory
-            case OP_vkGetMemoryZirconHandleFUCHSIA:
-            {
+            case OP_vkGetMemoryZirconHandleFUCHSIA: {
                 android::base::beginTrace("vkGetMemoryZirconHandleFUCHSIA decode");
                 VkDevice device;
                 const VkMemoryGetZirconHandleInfoFUCHSIA* pGetZirconHandleInfo;
@@ -25696,41 +29926,53 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pGetZirconHandleInfo, sizeof(const VkMemoryGetZirconHandleInfoFUCHSIA));
-                reservedunmarshal_VkMemoryGetZirconHandleInfoFUCHSIA(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryGetZirconHandleInfoFUCHSIA*)(pGetZirconHandleInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pGetZirconHandleInfo,
+                                    sizeof(const VkMemoryGetZirconHandleInfoFUCHSIA));
+                reservedunmarshal_VkMemoryGetZirconHandleInfoFUCHSIA(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkMemoryGetZirconHandleInfoFUCHSIA*)(pGetZirconHandleInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pZirconHandle;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pZirconHandle, sizeof(zx_handle_t));
                 memcpy((zx_handle_t*)pZirconHandle, *readStreamPtrPtr, sizeof(zx_handle_t));
                 *readStreamPtrPtr += sizeof(zx_handle_t);
-                if (pGetZirconHandleInfo)
-                {
-                    transform_tohost_VkMemoryGetZirconHandleInfoFUCHSIA(m_state, (VkMemoryGetZirconHandleInfoFUCHSIA*)(pGetZirconHandleInfo));
+                if (pGetZirconHandleInfo) {
+                    transform_tohost_VkMemoryGetZirconHandleInfoFUCHSIA(
+                        m_state, (VkMemoryGetZirconHandleInfoFUCHSIA*)(pGetZirconHandleInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetMemoryZirconHandleFUCHSIA 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pGetZirconHandleInfo, (unsigned long long)pZirconHandle);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkGetMemoryZirconHandleFUCHSIA 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device,
+                        (unsigned long long)pGetZirconHandleInfo,
+                        (unsigned long long)pZirconHandle);
                 }
                 VkResult vkGetMemoryZirconHandleFUCHSIA_VkResult_return = (VkResult)0;
-                vkGetMemoryZirconHandleFUCHSIA_VkResult_return = vk->vkGetMemoryZirconHandleFUCHSIA(unboxed_device, pGetZirconHandleInfo, pZirconHandle);
-                if ((vkGetMemoryZirconHandleFUCHSIA_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetMemoryZirconHandleFUCHSIA_VkResult_return = vk->vkGetMemoryZirconHandleFUCHSIA(
+                    unboxed_device, pGetZirconHandleInfo, pZirconHandle);
+                if ((vkGetMemoryZirconHandleFUCHSIA_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write((zx_handle_t*)pZirconHandle, sizeof(zx_handle_t));
                 vkStream->write(&vkGetMemoryZirconHandleFUCHSIA_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetMemoryZirconHandleFUCHSIA(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetMemoryZirconHandleFUCHSIA_VkResult_return, device, pGetZirconHandleInfo, pZirconHandle);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetMemoryZirconHandleFUCHSIA(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetMemoryZirconHandleFUCHSIA_VkResult_return, device,
+                        pGetZirconHandleInfo, pZirconHandle);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetMemoryZirconHandlePropertiesFUCHSIA:
-            {
+            case OP_vkGetMemoryZirconHandlePropertiesFUCHSIA: {
                 android::base::beginTrace("vkGetMemoryZirconHandlePropertiesFUCHSIA decode");
                 VkDevice device;
                 VkExternalMemoryHandleTypeFlagBits handleType;
@@ -25744,48 +29986,69 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                memcpy((VkExternalMemoryHandleTypeFlagBits*)&handleType, *readStreamPtrPtr, sizeof(VkExternalMemoryHandleTypeFlagBits));
+                memcpy((VkExternalMemoryHandleTypeFlagBits*)&handleType, *readStreamPtrPtr,
+                       sizeof(VkExternalMemoryHandleTypeFlagBits));
                 *readStreamPtrPtr += sizeof(VkExternalMemoryHandleTypeFlagBits);
                 memcpy((zx_handle_t*)&zirconHandle, *readStreamPtrPtr, sizeof(zx_handle_t));
                 *readStreamPtrPtr += sizeof(zx_handle_t);
                 // Begin manual dispatchable handle unboxing for pMemoryZirconHandleProperties;
                 vkReadStream->unsetHandleMapping();
-                vkReadStream->alloc((void**)&pMemoryZirconHandleProperties, sizeof(VkMemoryZirconHandlePropertiesFUCHSIA));
-                reservedunmarshal_VkMemoryZirconHandlePropertiesFUCHSIA(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryZirconHandlePropertiesFUCHSIA*)(pMemoryZirconHandleProperties), readStreamPtrPtr);
-                if (pMemoryZirconHandleProperties)
-                {
-                    transform_tohost_VkMemoryZirconHandlePropertiesFUCHSIA(m_state, (VkMemoryZirconHandlePropertiesFUCHSIA*)(pMemoryZirconHandleProperties));
+                vkReadStream->alloc((void**)&pMemoryZirconHandleProperties,
+                                    sizeof(VkMemoryZirconHandlePropertiesFUCHSIA));
+                reservedunmarshal_VkMemoryZirconHandlePropertiesFUCHSIA(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkMemoryZirconHandlePropertiesFUCHSIA*)(pMemoryZirconHandleProperties),
+                    readStreamPtrPtr);
+                if (pMemoryZirconHandleProperties) {
+                    transform_tohost_VkMemoryZirconHandlePropertiesFUCHSIA(
+                        m_state,
+                        (VkMemoryZirconHandlePropertiesFUCHSIA*)(pMemoryZirconHandleProperties));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetMemoryZirconHandlePropertiesFUCHSIA 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)handleType, (unsigned long long)zirconHandle, (unsigned long long)pMemoryZirconHandleProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetMemoryZirconHandlePropertiesFUCHSIA 0x%llx "
+                            "0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)handleType,
+                            (unsigned long long)zirconHandle,
+                            (unsigned long long)pMemoryZirconHandleProperties);
                 }
                 VkResult vkGetMemoryZirconHandlePropertiesFUCHSIA_VkResult_return = (VkResult)0;
-                vkGetMemoryZirconHandlePropertiesFUCHSIA_VkResult_return = vk->vkGetMemoryZirconHandlePropertiesFUCHSIA(unboxed_device, handleType, zirconHandle, pMemoryZirconHandleProperties);
-                if ((vkGetMemoryZirconHandlePropertiesFUCHSIA_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetMemoryZirconHandlePropertiesFUCHSIA_VkResult_return =
+                    vk->vkGetMemoryZirconHandlePropertiesFUCHSIA(
+                        unboxed_device, handleType, zirconHandle, pMemoryZirconHandleProperties);
+                if ((vkGetMemoryZirconHandlePropertiesFUCHSIA_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                if (pMemoryZirconHandleProperties)
-                {
-                    transform_fromhost_VkMemoryZirconHandlePropertiesFUCHSIA(m_state, (VkMemoryZirconHandlePropertiesFUCHSIA*)(pMemoryZirconHandleProperties));
+                if (pMemoryZirconHandleProperties) {
+                    transform_fromhost_VkMemoryZirconHandlePropertiesFUCHSIA(
+                        m_state,
+                        (VkMemoryZirconHandlePropertiesFUCHSIA*)(pMemoryZirconHandleProperties));
                 }
-                marshal_VkMemoryZirconHandlePropertiesFUCHSIA(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryZirconHandlePropertiesFUCHSIA*)(pMemoryZirconHandleProperties));
-                vkStream->write(&vkGetMemoryZirconHandlePropertiesFUCHSIA_VkResult_return, sizeof(VkResult));
+                marshal_VkMemoryZirconHandlePropertiesFUCHSIA(
+                    vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkMemoryZirconHandlePropertiesFUCHSIA*)(pMemoryZirconHandleProperties));
+                vkStream->write(&vkGetMemoryZirconHandlePropertiesFUCHSIA_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetMemoryZirconHandlePropertiesFUCHSIA(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetMemoryZirconHandlePropertiesFUCHSIA_VkResult_return, device, handleType, zirconHandle, pMemoryZirconHandleProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetMemoryZirconHandlePropertiesFUCHSIA(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetMemoryZirconHandlePropertiesFUCHSIA_VkResult_return, device,
+                        handleType, zirconHandle, pMemoryZirconHandleProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_FUCHSIA_external_semaphore
-            case OP_vkImportSemaphoreZirconHandleFUCHSIA:
-            {
+            case OP_vkImportSemaphoreZirconHandleFUCHSIA: {
                 android::base::beginTrace("vkImportSemaphoreZirconHandleFUCHSIA decode");
                 VkDevice device;
                 const VkImportSemaphoreZirconHandleInfoFUCHSIA* pImportSemaphoreZirconHandleInfo;
@@ -25797,35 +30060,49 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pImportSemaphoreZirconHandleInfo, sizeof(const VkImportSemaphoreZirconHandleInfoFUCHSIA));
-                reservedunmarshal_VkImportSemaphoreZirconHandleInfoFUCHSIA(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImportSemaphoreZirconHandleInfoFUCHSIA*)(pImportSemaphoreZirconHandleInfo), readStreamPtrPtr);
-                if (pImportSemaphoreZirconHandleInfo)
-                {
-                    transform_tohost_VkImportSemaphoreZirconHandleInfoFUCHSIA(m_state, (VkImportSemaphoreZirconHandleInfoFUCHSIA*)(pImportSemaphoreZirconHandleInfo));
+                vkReadStream->alloc((void**)&pImportSemaphoreZirconHandleInfo,
+                                    sizeof(const VkImportSemaphoreZirconHandleInfoFUCHSIA));
+                reservedunmarshal_VkImportSemaphoreZirconHandleInfoFUCHSIA(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkImportSemaphoreZirconHandleInfoFUCHSIA*)(pImportSemaphoreZirconHandleInfo),
+                    readStreamPtrPtr);
+                if (pImportSemaphoreZirconHandleInfo) {
+                    transform_tohost_VkImportSemaphoreZirconHandleInfoFUCHSIA(
+                        m_state,
+                        (VkImportSemaphoreZirconHandleInfoFUCHSIA*)(pImportSemaphoreZirconHandleInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkImportSemaphoreZirconHandleFUCHSIA 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pImportSemaphoreZirconHandleInfo);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkImportSemaphoreZirconHandleFUCHSIA 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device,
+                            (unsigned long long)pImportSemaphoreZirconHandleInfo);
                 }
                 VkResult vkImportSemaphoreZirconHandleFUCHSIA_VkResult_return = (VkResult)0;
-                vkImportSemaphoreZirconHandleFUCHSIA_VkResult_return = vk->vkImportSemaphoreZirconHandleFUCHSIA(unboxed_device, pImportSemaphoreZirconHandleInfo);
-                if ((vkImportSemaphoreZirconHandleFUCHSIA_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkImportSemaphoreZirconHandleFUCHSIA_VkResult_return =
+                    vk->vkImportSemaphoreZirconHandleFUCHSIA(unboxed_device,
+                                                             pImportSemaphoreZirconHandleInfo);
+                if ((vkImportSemaphoreZirconHandleFUCHSIA_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                vkStream->write(&vkImportSemaphoreZirconHandleFUCHSIA_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkImportSemaphoreZirconHandleFUCHSIA_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkImportSemaphoreZirconHandleFUCHSIA(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkImportSemaphoreZirconHandleFUCHSIA_VkResult_return, device, pImportSemaphoreZirconHandleInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkImportSemaphoreZirconHandleFUCHSIA(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkImportSemaphoreZirconHandleFUCHSIA_VkResult_return, device,
+                        pImportSemaphoreZirconHandleInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetSemaphoreZirconHandleFUCHSIA:
-            {
+            case OP_vkGetSemaphoreZirconHandleFUCHSIA: {
                 android::base::beginTrace("vkGetSemaphoreZirconHandleFUCHSIA decode");
                 VkDevice device;
                 const VkSemaphoreGetZirconHandleInfoFUCHSIA* pGetZirconHandleInfo;
@@ -25838,43 +30115,58 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pGetZirconHandleInfo, sizeof(const VkSemaphoreGetZirconHandleInfoFUCHSIA));
-                reservedunmarshal_VkSemaphoreGetZirconHandleInfoFUCHSIA(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSemaphoreGetZirconHandleInfoFUCHSIA*)(pGetZirconHandleInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pGetZirconHandleInfo,
+                                    sizeof(const VkSemaphoreGetZirconHandleInfoFUCHSIA));
+                reservedunmarshal_VkSemaphoreGetZirconHandleInfoFUCHSIA(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkSemaphoreGetZirconHandleInfoFUCHSIA*)(pGetZirconHandleInfo),
+                    readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pZirconHandle;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pZirconHandle, sizeof(zx_handle_t));
                 memcpy((zx_handle_t*)pZirconHandle, *readStreamPtrPtr, sizeof(zx_handle_t));
                 *readStreamPtrPtr += sizeof(zx_handle_t);
-                if (pGetZirconHandleInfo)
-                {
-                    transform_tohost_VkSemaphoreGetZirconHandleInfoFUCHSIA(m_state, (VkSemaphoreGetZirconHandleInfoFUCHSIA*)(pGetZirconHandleInfo));
+                if (pGetZirconHandleInfo) {
+                    transform_tohost_VkSemaphoreGetZirconHandleInfoFUCHSIA(
+                        m_state, (VkSemaphoreGetZirconHandleInfoFUCHSIA*)(pGetZirconHandleInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetSemaphoreZirconHandleFUCHSIA 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pGetZirconHandleInfo, (unsigned long long)pZirconHandle);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkGetSemaphoreZirconHandleFUCHSIA 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device,
+                        (unsigned long long)pGetZirconHandleInfo,
+                        (unsigned long long)pZirconHandle);
                 }
                 VkResult vkGetSemaphoreZirconHandleFUCHSIA_VkResult_return = (VkResult)0;
-                vkGetSemaphoreZirconHandleFUCHSIA_VkResult_return = vk->vkGetSemaphoreZirconHandleFUCHSIA(unboxed_device, pGetZirconHandleInfo, pZirconHandle);
-                if ((vkGetSemaphoreZirconHandleFUCHSIA_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetSemaphoreZirconHandleFUCHSIA_VkResult_return =
+                    vk->vkGetSemaphoreZirconHandleFUCHSIA(unboxed_device, pGetZirconHandleInfo,
+                                                          pZirconHandle);
+                if ((vkGetSemaphoreZirconHandleFUCHSIA_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write((zx_handle_t*)pZirconHandle, sizeof(zx_handle_t));
-                vkStream->write(&vkGetSemaphoreZirconHandleFUCHSIA_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkGetSemaphoreZirconHandleFUCHSIA_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetSemaphoreZirconHandleFUCHSIA(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetSemaphoreZirconHandleFUCHSIA_VkResult_return, device, pGetZirconHandleInfo, pZirconHandle);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetSemaphoreZirconHandleFUCHSIA(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetSemaphoreZirconHandleFUCHSIA_VkResult_return, device,
+                        pGetZirconHandleInfo, pZirconHandle);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
-            case OP_vkCreateBufferCollectionFUCHSIA:
-            {
+            case OP_vkCreateBufferCollectionFUCHSIA: {
                 android::base::beginTrace("vkCreateBufferCollectionFUCHSIA decode");
                 VkDevice device;
                 const VkBufferCollectionCreateInfoFUCHSIA* pCreateInfo;
@@ -25888,16 +30180,20 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkBufferCollectionCreateInfoFUCHSIA));
-                reservedunmarshal_VkBufferCollectionCreateInfoFUCHSIA(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferCollectionCreateInfoFUCHSIA*)(pCreateInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pCreateInfo,
+                                    sizeof(const VkBufferCollectionCreateInfoFUCHSIA));
+                reservedunmarshal_VkBufferCollectionCreateInfoFUCHSIA(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkBufferCollectionCreateInfoFUCHSIA*)(pCreateInfo), readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pCollection;
                 vkReadStream->unsetHandleMapping();
@@ -25905,39 +30201,48 @@
                 memcpy((VkBufferCollectionFUCHSIA*)&(*pCollection), (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&(*pCollection));
                 *readStreamPtrPtr += 8;
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkBufferCollectionCreateInfoFUCHSIA(m_state, (VkBufferCollectionCreateInfoFUCHSIA*)(pCreateInfo));
+                if (pCreateInfo) {
+                    transform_tohost_VkBufferCollectionCreateInfoFUCHSIA(
+                        m_state, (VkBufferCollectionCreateInfoFUCHSIA*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateBufferCollectionFUCHSIA 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pCollection);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateBufferCollectionFUCHSIA 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pCollection);
                 }
                 VkResult vkCreateBufferCollectionFUCHSIA_VkResult_return = (VkResult)0;
-                vkCreateBufferCollectionFUCHSIA_VkResult_return = vk->vkCreateBufferCollectionFUCHSIA(unboxed_device, pCreateInfo, pAllocator, pCollection);
-                if ((vkCreateBufferCollectionFUCHSIA_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateBufferCollectionFUCHSIA_VkResult_return =
+                    vk->vkCreateBufferCollectionFUCHSIA(unboxed_device, pCreateInfo, pAllocator,
+                                                        pCollection);
+                if ((vkCreateBufferCollectionFUCHSIA_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3 = (uint64_t)(*pCollection);
                 vkStream->putBe64(cgen_var_3);
                 vkStream->write(&vkCreateBufferCollectionFUCHSIA_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateBufferCollectionFUCHSIA(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateBufferCollectionFUCHSIA_VkResult_return, device, pCreateInfo, pAllocator, pCollection);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateBufferCollectionFUCHSIA(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateBufferCollectionFUCHSIA_VkResult_return, device, pCreateInfo,
+                        pAllocator, pCollection);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkSetBufferCollectionImageConstraintsFUCHSIA:
-            {
+            case OP_vkSetBufferCollectionImageConstraintsFUCHSIA: {
                 android::base::beginTrace("vkSetBufferCollectionImageConstraintsFUCHSIA decode");
                 VkDevice device;
                 VkBufferCollectionFUCHSIA collection;
@@ -25953,35 +30258,49 @@
                 memcpy((VkBufferCollectionFUCHSIA*)&collection, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&collection);
                 *readStreamPtrPtr += 8;
-                vkReadStream->alloc((void**)&pImageConstraintsInfo, sizeof(const VkImageConstraintsInfoFUCHSIA));
-                reservedunmarshal_VkImageConstraintsInfoFUCHSIA(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageConstraintsInfoFUCHSIA*)(pImageConstraintsInfo), readStreamPtrPtr);
-                if (pImageConstraintsInfo)
-                {
-                    transform_tohost_VkImageConstraintsInfoFUCHSIA(m_state, (VkImageConstraintsInfoFUCHSIA*)(pImageConstraintsInfo));
+                vkReadStream->alloc((void**)&pImageConstraintsInfo,
+                                    sizeof(const VkImageConstraintsInfoFUCHSIA));
+                reservedunmarshal_VkImageConstraintsInfoFUCHSIA(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkImageConstraintsInfoFUCHSIA*)(pImageConstraintsInfo), readStreamPtrPtr);
+                if (pImageConstraintsInfo) {
+                    transform_tohost_VkImageConstraintsInfoFUCHSIA(
+                        m_state, (VkImageConstraintsInfoFUCHSIA*)(pImageConstraintsInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkSetBufferCollectionImageConstraintsFUCHSIA 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)collection, (unsigned long long)pImageConstraintsInfo);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkSetBufferCollectionImageConstraintsFUCHSIA 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)collection,
+                            (unsigned long long)pImageConstraintsInfo);
                 }
                 VkResult vkSetBufferCollectionImageConstraintsFUCHSIA_VkResult_return = (VkResult)0;
-                vkSetBufferCollectionImageConstraintsFUCHSIA_VkResult_return = vk->vkSetBufferCollectionImageConstraintsFUCHSIA(unboxed_device, collection, pImageConstraintsInfo);
-                if ((vkSetBufferCollectionImageConstraintsFUCHSIA_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkSetBufferCollectionImageConstraintsFUCHSIA_VkResult_return =
+                    vk->vkSetBufferCollectionImageConstraintsFUCHSIA(unboxed_device, collection,
+                                                                     pImageConstraintsInfo);
+                if ((vkSetBufferCollectionImageConstraintsFUCHSIA_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                vkStream->write(&vkSetBufferCollectionImageConstraintsFUCHSIA_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkSetBufferCollectionImageConstraintsFUCHSIA_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkSetBufferCollectionImageConstraintsFUCHSIA(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkSetBufferCollectionImageConstraintsFUCHSIA_VkResult_return, device, collection, pImageConstraintsInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkSetBufferCollectionImageConstraintsFUCHSIA(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkSetBufferCollectionImageConstraintsFUCHSIA_VkResult_return, device,
+                        collection, pImageConstraintsInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkSetBufferCollectionBufferConstraintsFUCHSIA:
-            {
+            case OP_vkSetBufferCollectionBufferConstraintsFUCHSIA: {
                 android::base::beginTrace("vkSetBufferCollectionBufferConstraintsFUCHSIA decode");
                 VkDevice device;
                 VkBufferCollectionFUCHSIA collection;
@@ -25997,35 +30316,50 @@
                 memcpy((VkBufferCollectionFUCHSIA*)&collection, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&collection);
                 *readStreamPtrPtr += 8;
-                vkReadStream->alloc((void**)&pBufferConstraintsInfo, sizeof(const VkBufferConstraintsInfoFUCHSIA));
-                reservedunmarshal_VkBufferConstraintsInfoFUCHSIA(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferConstraintsInfoFUCHSIA*)(pBufferConstraintsInfo), readStreamPtrPtr);
-                if (pBufferConstraintsInfo)
-                {
-                    transform_tohost_VkBufferConstraintsInfoFUCHSIA(m_state, (VkBufferConstraintsInfoFUCHSIA*)(pBufferConstraintsInfo));
+                vkReadStream->alloc((void**)&pBufferConstraintsInfo,
+                                    sizeof(const VkBufferConstraintsInfoFUCHSIA));
+                reservedunmarshal_VkBufferConstraintsInfoFUCHSIA(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkBufferConstraintsInfoFUCHSIA*)(pBufferConstraintsInfo), readStreamPtrPtr);
+                if (pBufferConstraintsInfo) {
+                    transform_tohost_VkBufferConstraintsInfoFUCHSIA(
+                        m_state, (VkBufferConstraintsInfoFUCHSIA*)(pBufferConstraintsInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkSetBufferCollectionBufferConstraintsFUCHSIA 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)collection, (unsigned long long)pBufferConstraintsInfo);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkSetBufferCollectionBufferConstraintsFUCHSIA 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)collection,
+                            (unsigned long long)pBufferConstraintsInfo);
                 }
-                VkResult vkSetBufferCollectionBufferConstraintsFUCHSIA_VkResult_return = (VkResult)0;
-                vkSetBufferCollectionBufferConstraintsFUCHSIA_VkResult_return = vk->vkSetBufferCollectionBufferConstraintsFUCHSIA(unboxed_device, collection, pBufferConstraintsInfo);
-                if ((vkSetBufferCollectionBufferConstraintsFUCHSIA_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                VkResult vkSetBufferCollectionBufferConstraintsFUCHSIA_VkResult_return =
+                    (VkResult)0;
+                vkSetBufferCollectionBufferConstraintsFUCHSIA_VkResult_return =
+                    vk->vkSetBufferCollectionBufferConstraintsFUCHSIA(unboxed_device, collection,
+                                                                      pBufferConstraintsInfo);
+                if ((vkSetBufferCollectionBufferConstraintsFUCHSIA_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                vkStream->write(&vkSetBufferCollectionBufferConstraintsFUCHSIA_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkSetBufferCollectionBufferConstraintsFUCHSIA_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkSetBufferCollectionBufferConstraintsFUCHSIA(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkSetBufferCollectionBufferConstraintsFUCHSIA_VkResult_return, device, collection, pBufferConstraintsInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkSetBufferCollectionBufferConstraintsFUCHSIA(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkSetBufferCollectionBufferConstraintsFUCHSIA_VkResult_return, device,
+                        collection, pBufferConstraintsInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroyBufferCollectionFUCHSIA:
-            {
+            case OP_vkDestroyBufferCollectionFUCHSIA: {
                 android::base::beginTrace("vkDestroyBufferCollectionFUCHSIA decode");
                 VkDevice device;
                 VkBufferCollectionFUCHSIA collection;
@@ -26045,34 +30379,40 @@
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroyBufferCollectionFUCHSIA 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)collection, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkDestroyBufferCollectionFUCHSIA 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device, (unsigned long long)collection,
+                        (unsigned long long)pAllocator);
                 }
                 vk->vkDestroyBufferCollectionFUCHSIA(unboxed_device, collection, pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroyBufferCollectionFUCHSIA(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, collection, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroyBufferCollectionFUCHSIA(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, collection,
+                        pAllocator);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetBufferCollectionPropertiesFUCHSIA:
-            {
+            case OP_vkGetBufferCollectionPropertiesFUCHSIA: {
                 android::base::beginTrace("vkGetBufferCollectionPropertiesFUCHSIA decode");
                 VkDevice device;
                 VkBufferCollectionFUCHSIA collection;
@@ -26090,42 +30430,58 @@
                 *readStreamPtrPtr += 8;
                 // Begin manual dispatchable handle unboxing for pProperties;
                 vkReadStream->unsetHandleMapping();
-                vkReadStream->alloc((void**)&pProperties, sizeof(VkBufferCollectionPropertiesFUCHSIA));
-                reservedunmarshal_VkBufferCollectionPropertiesFUCHSIA(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferCollectionPropertiesFUCHSIA*)(pProperties), readStreamPtrPtr);
-                if (pProperties)
-                {
-                    transform_tohost_VkBufferCollectionPropertiesFUCHSIA(m_state, (VkBufferCollectionPropertiesFUCHSIA*)(pProperties));
+                vkReadStream->alloc((void**)&pProperties,
+                                    sizeof(VkBufferCollectionPropertiesFUCHSIA));
+                reservedunmarshal_VkBufferCollectionPropertiesFUCHSIA(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkBufferCollectionPropertiesFUCHSIA*)(pProperties), readStreamPtrPtr);
+                if (pProperties) {
+                    transform_tohost_VkBufferCollectionPropertiesFUCHSIA(
+                        m_state, (VkBufferCollectionPropertiesFUCHSIA*)(pProperties));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetBufferCollectionPropertiesFUCHSIA 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)collection, (unsigned long long)pProperties);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetBufferCollectionPropertiesFUCHSIA 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)collection,
+                            (unsigned long long)pProperties);
                 }
                 VkResult vkGetBufferCollectionPropertiesFUCHSIA_VkResult_return = (VkResult)0;
-                vkGetBufferCollectionPropertiesFUCHSIA_VkResult_return = vk->vkGetBufferCollectionPropertiesFUCHSIA(unboxed_device, collection, pProperties);
-                if ((vkGetBufferCollectionPropertiesFUCHSIA_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetBufferCollectionPropertiesFUCHSIA_VkResult_return =
+                    vk->vkGetBufferCollectionPropertiesFUCHSIA(unboxed_device, collection,
+                                                               pProperties);
+                if ((vkGetBufferCollectionPropertiesFUCHSIA_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                if (pProperties)
-                {
-                    transform_fromhost_VkBufferCollectionPropertiesFUCHSIA(m_state, (VkBufferCollectionPropertiesFUCHSIA*)(pProperties));
+                if (pProperties) {
+                    transform_fromhost_VkBufferCollectionPropertiesFUCHSIA(
+                        m_state, (VkBufferCollectionPropertiesFUCHSIA*)(pProperties));
                 }
-                marshal_VkBufferCollectionPropertiesFUCHSIA(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferCollectionPropertiesFUCHSIA*)(pProperties));
-                vkStream->write(&vkGetBufferCollectionPropertiesFUCHSIA_VkResult_return, sizeof(VkResult));
+                marshal_VkBufferCollectionPropertiesFUCHSIA(
+                    vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkBufferCollectionPropertiesFUCHSIA*)(pProperties));
+                vkStream->write(&vkGetBufferCollectionPropertiesFUCHSIA_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetBufferCollectionPropertiesFUCHSIA(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetBufferCollectionPropertiesFUCHSIA_VkResult_return, device, collection, pProperties);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetBufferCollectionPropertiesFUCHSIA(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetBufferCollectionPropertiesFUCHSIA_VkResult_return, device, collection,
+                        pProperties);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_HUAWEI_subpass_shading
-            case OP_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI:
-            {
+            case OP_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI: {
                 android::base::beginTrace("vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI decode");
                 VkDevice device;
                 VkRenderPass renderpass;
@@ -26141,74 +30497,89 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkRenderPass*)&renderpass = (VkRenderPass)unbox_VkRenderPass((VkRenderPass)(*&cgen_var_1));
+                *(VkRenderPass*)&renderpass =
+                    (VkRenderPass)unbox_VkRenderPass((VkRenderPass)(*&cgen_var_1));
                 // Begin manual dispatchable handle unboxing for pMaxWorkgroupSize;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pMaxWorkgroupSize, sizeof(VkExtent2D));
-                reservedunmarshal_VkExtent2D(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExtent2D*)(pMaxWorkgroupSize), readStreamPtrPtr);
-                if (pMaxWorkgroupSize)
-                {
+                reservedunmarshal_VkExtent2D(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                             (VkExtent2D*)(pMaxWorkgroupSize), readStreamPtrPtr);
+                if (pMaxWorkgroupSize) {
                     transform_tohost_VkExtent2D(m_state, (VkExtent2D*)(pMaxWorkgroupSize));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)renderpass, (unsigned long long)pMaxWorkgroupSize);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI "
+                            "0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)renderpass,
+                            (unsigned long long)pMaxWorkgroupSize);
                 }
-                VkResult vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI_VkResult_return = (VkResult)0;
-                vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI_VkResult_return = vk->vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI(unboxed_device, renderpass, pMaxWorkgroupSize);
-                if ((vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                VkResult vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI_VkResult_return =
+                    (VkResult)0;
+                vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI_VkResult_return =
+                    vk->vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI(unboxed_device, renderpass,
+                                                                        pMaxWorkgroupSize);
+                if ((vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                if (pMaxWorkgroupSize)
-                {
+                if (pMaxWorkgroupSize) {
                     transform_fromhost_VkExtent2D(m_state, (VkExtent2D*)(pMaxWorkgroupSize));
                 }
-                marshal_VkExtent2D(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExtent2D*)(pMaxWorkgroupSize));
-                vkStream->write(&vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI_VkResult_return, sizeof(VkResult));
+                marshal_VkExtent2D(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                   (VkExtent2D*)(pMaxWorkgroupSize));
+                vkStream->write(&vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI_VkResult_return, device, renderpass, pMaxWorkgroupSize);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI_VkResult_return, device,
+                        renderpass, pMaxWorkgroupSize);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSubpassShadingHUAWEI:
-            {
+            case OP_vkCmdSubpassShadingHUAWEI: {
                 android::base::beginTrace("vkCmdSubpassShadingHUAWEI decode");
                 VkCommandBuffer commandBuffer;
                 // Begin non wrapped dispatchable handle unboxing for commandBuffer;
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSubpassShadingHUAWEI 0x%llx \n", ioStream, (unsigned long long)commandBuffer);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdSubpassShadingHUAWEI 0x%llx \n", ioStream,
+                            (unsigned long long)commandBuffer);
                 }
                 vk->vkCmdSubpassShadingHUAWEI(unboxed_commandBuffer);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSubpassShadingHUAWEI(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSubpassShadingHUAWEI(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_HUAWEI_invocation_mask
-            case OP_vkCmdBindInvocationMaskHUAWEI:
-            {
+            case OP_vkCmdBindInvocationMaskHUAWEI: {
                 android::base::beginTrace("vkCmdBindInvocationMaskHUAWEI decode");
                 VkCommandBuffer commandBuffer;
                 VkImageView imageView;
@@ -26217,37 +30588,43 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkImageView*)&imageView = (VkImageView)unbox_VkImageView((VkImageView)(*&cgen_var_1));
+                *(VkImageView*)&imageView =
+                    (VkImageView)unbox_VkImageView((VkImageView)(*&cgen_var_1));
                 memcpy((VkImageLayout*)&imageLayout, *readStreamPtrPtr, sizeof(VkImageLayout));
                 *readStreamPtrPtr += sizeof(VkImageLayout);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdBindInvocationMaskHUAWEI 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)imageView, (unsigned long long)imageLayout);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdBindInvocationMaskHUAWEI 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)imageView, (unsigned long long)imageLayout);
                 }
                 vk->vkCmdBindInvocationMaskHUAWEI(unboxed_commandBuffer, imageView, imageLayout);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdBindInvocationMaskHUAWEI(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, imageView, imageLayout);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdBindInvocationMaskHUAWEI(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, imageView,
+                        imageLayout);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_NV_external_memory_rdma
-            case OP_vkGetMemoryRemoteAddressNV:
-            {
+            case OP_vkGetMemoryRemoteAddressNV: {
                 android::base::beginTrace("vkGetMemoryRemoteAddressNV decode");
                 VkDevice device;
                 const VkMemoryGetRemoteAddressInfoNV* pMemoryGetRemoteAddressInfo;
@@ -26260,43 +30637,55 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pMemoryGetRemoteAddressInfo, sizeof(const VkMemoryGetRemoteAddressInfoNV));
-                reservedunmarshal_VkMemoryGetRemoteAddressInfoNV(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryGetRemoteAddressInfoNV*)(pMemoryGetRemoteAddressInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pMemoryGetRemoteAddressInfo,
+                                    sizeof(const VkMemoryGetRemoteAddressInfoNV));
+                reservedunmarshal_VkMemoryGetRemoteAddressInfoNV(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkMemoryGetRemoteAddressInfoNV*)(pMemoryGetRemoteAddressInfo),
+                    readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pAddress;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pAddress, sizeof(VkRemoteAddressNV));
                 memcpy((VkRemoteAddressNV*)pAddress, *readStreamPtrPtr, sizeof(VkRemoteAddressNV));
                 *readStreamPtrPtr += sizeof(VkRemoteAddressNV);
-                if (pMemoryGetRemoteAddressInfo)
-                {
-                    transform_tohost_VkMemoryGetRemoteAddressInfoNV(m_state, (VkMemoryGetRemoteAddressInfoNV*)(pMemoryGetRemoteAddressInfo));
+                if (pMemoryGetRemoteAddressInfo) {
+                    transform_tohost_VkMemoryGetRemoteAddressInfoNV(
+                        m_state, (VkMemoryGetRemoteAddressInfoNV*)(pMemoryGetRemoteAddressInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetMemoryRemoteAddressNV 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pMemoryGetRemoteAddressInfo, (unsigned long long)pAddress);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetMemoryRemoteAddressNV 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device,
+                            (unsigned long long)pMemoryGetRemoteAddressInfo,
+                            (unsigned long long)pAddress);
                 }
                 VkResult vkGetMemoryRemoteAddressNV_VkResult_return = (VkResult)0;
-                vkGetMemoryRemoteAddressNV_VkResult_return = vk->vkGetMemoryRemoteAddressNV(unboxed_device, pMemoryGetRemoteAddressInfo, pAddress);
-                if ((vkGetMemoryRemoteAddressNV_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetMemoryRemoteAddressNV_VkResult_return = vk->vkGetMemoryRemoteAddressNV(
+                    unboxed_device, pMemoryGetRemoteAddressInfo, pAddress);
+                if ((vkGetMemoryRemoteAddressNV_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write((VkRemoteAddressNV*)pAddress, sizeof(VkRemoteAddressNV));
                 vkStream->write(&vkGetMemoryRemoteAddressNV_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetMemoryRemoteAddressNV(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetMemoryRemoteAddressNV_VkResult_return, device, pMemoryGetRemoteAddressInfo, pAddress);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetMemoryRemoteAddressNV(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetMemoryRemoteAddressNV_VkResult_return, device,
+                        pMemoryGetRemoteAddressInfo, pAddress);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
-            case OP_vkCmdSetPatchControlPointsEXT:
-            {
+            case OP_vkCmdSetPatchControlPointsEXT: {
                 android::base::beginTrace("vkCmdSetPatchControlPointsEXT decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t patchControlPoints;
@@ -26304,31 +30693,36 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 memcpy((uint32_t*)&patchControlPoints, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetPatchControlPointsEXT 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)patchControlPoints);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdSetPatchControlPointsEXT 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)patchControlPoints);
                 }
                 vk->vkCmdSetPatchControlPointsEXT(unboxed_commandBuffer, patchControlPoints);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetPatchControlPointsEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, patchControlPoints);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetPatchControlPointsEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        patchControlPoints);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetRasterizerDiscardEnableEXT:
-            {
+            case OP_vkCmdSetRasterizerDiscardEnableEXT: {
                 android::base::beginTrace("vkCmdSetRasterizerDiscardEnableEXT decode");
                 VkCommandBuffer commandBuffer;
                 VkBool32 rasterizerDiscardEnable;
@@ -26336,31 +30730,37 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 memcpy((VkBool32*)&rasterizerDiscardEnable, *readStreamPtrPtr, sizeof(VkBool32));
                 *readStreamPtrPtr += sizeof(VkBool32);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetRasterizerDiscardEnableEXT 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)rasterizerDiscardEnable);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdSetRasterizerDiscardEnableEXT 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)rasterizerDiscardEnable);
                 }
-                vk->vkCmdSetRasterizerDiscardEnableEXT(unboxed_commandBuffer, rasterizerDiscardEnable);
+                vk->vkCmdSetRasterizerDiscardEnableEXT(unboxed_commandBuffer,
+                                                       rasterizerDiscardEnable);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetRasterizerDiscardEnableEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, rasterizerDiscardEnable);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetRasterizerDiscardEnableEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        rasterizerDiscardEnable);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetDepthBiasEnableEXT:
-            {
+            case OP_vkCmdSetDepthBiasEnableEXT: {
                 android::base::beginTrace("vkCmdSetDepthBiasEnableEXT decode");
                 VkCommandBuffer commandBuffer;
                 VkBool32 depthBiasEnable;
@@ -26368,31 +30768,35 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 memcpy((VkBool32*)&depthBiasEnable, *readStreamPtrPtr, sizeof(VkBool32));
                 *readStreamPtrPtr += sizeof(VkBool32);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetDepthBiasEnableEXT 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)depthBiasEnable);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdSetDepthBiasEnableEXT 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)depthBiasEnable);
                 }
                 vk->vkCmdSetDepthBiasEnableEXT(unboxed_commandBuffer, depthBiasEnable);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetDepthBiasEnableEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, depthBiasEnable);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetDepthBiasEnableEXT(snapshotTraceBegin,
+                                                                    snapshotTraceBytes, &m_pool,
+                                                                    commandBuffer, depthBiasEnable);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetLogicOpEXT:
-            {
+            case OP_vkCmdSetLogicOpEXT: {
                 android::base::beginTrace("vkCmdSetLogicOpEXT decode");
                 VkCommandBuffer commandBuffer;
                 VkLogicOp logicOp;
@@ -26400,31 +30804,33 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 memcpy((VkLogicOp*)&logicOp, *readStreamPtrPtr, sizeof(VkLogicOp));
                 *readStreamPtrPtr += sizeof(VkLogicOp);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetLogicOpEXT 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)logicOp);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkCmdSetLogicOpEXT 0x%llx 0x%llx \n", ioStream,
+                            (unsigned long long)commandBuffer, (unsigned long long)logicOp);
                 }
                 vk->vkCmdSetLogicOpEXT(unboxed_commandBuffer, logicOp);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetLogicOpEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, logicOp);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetLogicOpEXT(snapshotTraceBegin, snapshotTraceBytes,
+                                                            &m_pool, commandBuffer, logicOp);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetPrimitiveRestartEnableEXT:
-            {
+            case OP_vkCmdSetPrimitiveRestartEnableEXT: {
                 android::base::beginTrace("vkCmdSetPrimitiveRestartEnableEXT decode");
                 VkCommandBuffer commandBuffer;
                 VkBool32 primitiveRestartEnable;
@@ -26432,33 +30838,39 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 memcpy((VkBool32*)&primitiveRestartEnable, *readStreamPtrPtr, sizeof(VkBool32));
                 *readStreamPtrPtr += sizeof(VkBool32);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetPrimitiveRestartEnableEXT 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)primitiveRestartEnable);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdSetPrimitiveRestartEnableEXT 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)primitiveRestartEnable);
                 }
-                vk->vkCmdSetPrimitiveRestartEnableEXT(unboxed_commandBuffer, primitiveRestartEnable);
+                vk->vkCmdSetPrimitiveRestartEnableEXT(unboxed_commandBuffer,
+                                                      primitiveRestartEnable);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetPrimitiveRestartEnableEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, primitiveRestartEnable);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetPrimitiveRestartEnableEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        primitiveRestartEnable);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_QNX_screen_surface
-            case OP_vkCreateScreenSurfaceQNX:
-            {
+            case OP_vkCreateScreenSurfaceQNX: {
                 android::base::beginTrace("vkCreateScreenSurfaceQNX decode");
                 VkInstance instance;
                 const VkScreenSurfaceCreateInfoQNX* pCreateInfo;
@@ -26472,16 +30884,20 @@
                 auto unboxed_instance = unbox_VkInstance(instance);
                 auto vk = dispatch_VkInstance(instance);
                 // End manual dispatchable handle unboxing for instance;
-                vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkScreenSurfaceCreateInfoQNX));
-                reservedunmarshal_VkScreenSurfaceCreateInfoQNX(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkScreenSurfaceCreateInfoQNX*)(pCreateInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pCreateInfo,
+                                    sizeof(const VkScreenSurfaceCreateInfoQNX));
+                reservedunmarshal_VkScreenSurfaceCreateInfoQNX(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkScreenSurfaceCreateInfoQNX*)(pCreateInfo), readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pSurface;
                 vkReadStream->unsetHandleMapping();
@@ -26489,41 +30905,50 @@
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkSurfaceKHR*)pSurface = (VkSurfaceKHR)(VkSurfaceKHR)((VkSurfaceKHR)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkScreenSurfaceCreateInfoQNX(m_state, (VkScreenSurfaceCreateInfoQNX*)(pCreateInfo));
+                *(VkSurfaceKHR*)pSurface =
+                    (VkSurfaceKHR)(VkSurfaceKHR)((VkSurfaceKHR)(*&cgen_var_2));
+                if (pCreateInfo) {
+                    transform_tohost_VkScreenSurfaceCreateInfoQNX(
+                        m_state, (VkScreenSurfaceCreateInfoQNX*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateScreenSurfaceQNX 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)instance, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pSurface);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkCreateScreenSurfaceQNX 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)instance, (unsigned long long)pCreateInfo,
+                        (unsigned long long)pAllocator, (unsigned long long)pSurface);
                 }
                 VkResult vkCreateScreenSurfaceQNX_VkResult_return = (VkResult)0;
-                vkCreateScreenSurfaceQNX_VkResult_return = vk->vkCreateScreenSurfaceQNX(unboxed_instance, pCreateInfo, pAllocator, pSurface);
-                if ((vkCreateScreenSurfaceQNX_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateScreenSurfaceQNX_VkResult_return = vk->vkCreateScreenSurfaceQNX(
+                    unboxed_instance, pCreateInfo, pAllocator, pSurface);
+                if ((vkCreateScreenSurfaceQNX_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3;
                 vkStream->handleMapping()->mapHandles_VkSurfaceKHR_u64(pSurface, &cgen_var_3, 1);
                 vkStream->write((uint64_t*)&cgen_var_3, 8);
                 vkStream->write(&vkCreateScreenSurfaceQNX_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateScreenSurfaceQNX(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateScreenSurfaceQNX_VkResult_return, instance, pCreateInfo, pAllocator, pSurface);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateScreenSurfaceQNX(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateScreenSurfaceQNX_VkResult_return, instance, pCreateInfo, pAllocator,
+                        pSurface);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetPhysicalDeviceScreenPresentationSupportQNX:
-            {
+            case OP_vkGetPhysicalDeviceScreenPresentationSupportQNX: {
                 android::base::beginTrace("vkGetPhysicalDeviceScreenPresentationSupportQNX decode");
                 VkPhysicalDevice physicalDevice;
                 uint32_t queueFamilyIndex;
@@ -26532,7 +30957,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPhysicalDevice*)&physicalDevice = (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                *(VkPhysicalDevice*)&physicalDevice =
+                    (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
                 auto unboxed_physicalDevice = unbox_VkPhysicalDevice(physicalDevice);
                 auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // End manual dispatchable handle unboxing for physicalDevice;
@@ -26543,31 +30969,41 @@
                 vkReadStream->alloc((void**)&window, sizeof(_screen_window));
                 memcpy((_screen_window*)window, *readStreamPtrPtr, sizeof(_screen_window));
                 *readStreamPtrPtr += sizeof(_screen_window);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetPhysicalDeviceScreenPresentationSupportQNX 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)physicalDevice, (unsigned long long)queueFamilyIndex, (unsigned long long)window);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetPhysicalDeviceScreenPresentationSupportQNX "
+                            "0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)physicalDevice,
+                            (unsigned long long)queueFamilyIndex, (unsigned long long)window);
                 }
-                VkBool32 vkGetPhysicalDeviceScreenPresentationSupportQNX_VkBool32_return = (VkBool32)0;
-                vkGetPhysicalDeviceScreenPresentationSupportQNX_VkBool32_return = vk->vkGetPhysicalDeviceScreenPresentationSupportQNX(unboxed_physicalDevice, queueFamilyIndex, window);
+                VkBool32 vkGetPhysicalDeviceScreenPresentationSupportQNX_VkBool32_return =
+                    (VkBool32)0;
+                vkGetPhysicalDeviceScreenPresentationSupportQNX_VkBool32_return =
+                    vk->vkGetPhysicalDeviceScreenPresentationSupportQNX(unboxed_physicalDevice,
+                                                                        queueFamilyIndex, window);
                 vkStream->unsetHandleMapping();
                 vkStream->write((_screen_window*)window, sizeof(_screen_window));
-                vkStream->write(&vkGetPhysicalDeviceScreenPresentationSupportQNX_VkBool32_return, sizeof(VkBool32));
+                vkStream->write(&vkGetPhysicalDeviceScreenPresentationSupportQNX_VkBool32_return,
+                                sizeof(VkBool32));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetPhysicalDeviceScreenPresentationSupportQNX(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetPhysicalDeviceScreenPresentationSupportQNX_VkBool32_return, physicalDevice, queueFamilyIndex, window);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetPhysicalDeviceScreenPresentationSupportQNX(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetPhysicalDeviceScreenPresentationSupportQNX_VkBool32_return,
+                        physicalDevice, queueFamilyIndex, window);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_EXT_color_write_enable
-            case OP_vkCmdSetColorWriteEnableEXT:
-            {
+            case OP_vkCmdSetColorWriteEnableEXT: {
                 android::base::beginTrace("vkCmdSetColorWriteEnableEXT decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t attachmentCount;
@@ -26576,36 +31012,45 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 memcpy((uint32_t*)&attachmentCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pColorWriteEnables, ((attachmentCount)) * sizeof(const VkBool32));
-                memcpy((VkBool32*)pColorWriteEnables, *readStreamPtrPtr, ((attachmentCount)) * sizeof(const VkBool32));
+                vkReadStream->alloc((void**)&pColorWriteEnables,
+                                    ((attachmentCount)) * sizeof(const VkBool32));
+                memcpy((VkBool32*)pColorWriteEnables, *readStreamPtrPtr,
+                       ((attachmentCount)) * sizeof(const VkBool32));
                 *readStreamPtrPtr += ((attachmentCount)) * sizeof(const VkBool32);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetColorWriteEnableEXT 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)attachmentCount, (unsigned long long)pColorWriteEnables);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdSetColorWriteEnableEXT 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)attachmentCount,
+                            (unsigned long long)pColorWriteEnables);
                 }
-                vk->vkCmdSetColorWriteEnableEXT(unboxed_commandBuffer, attachmentCount, pColorWriteEnables);
+                vk->vkCmdSetColorWriteEnableEXT(unboxed_commandBuffer, attachmentCount,
+                                                pColorWriteEnables);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetColorWriteEnableEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, attachmentCount, pColorWriteEnables);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetColorWriteEnableEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        attachmentCount, pColorWriteEnables);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_GOOGLE_gfxstream
-            case OP_vkRegisterImageColorBufferGOOGLE:
-            {
+            case OP_vkRegisterImageColorBufferGOOGLE: {
                 android::base::beginTrace("vkRegisterImageColorBufferGOOGLE decode");
                 VkDevice device;
                 VkImage image;
@@ -26621,29 +31066,39 @@
                 *(VkImage*)&image = (VkImage)unbox_VkImage((VkImage)(*&cgen_var_1));
                 memcpy((uint32_t*)&colorBuffer, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkRegisterImageColorBufferGOOGLE 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)image, (unsigned long long)colorBuffer);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkRegisterImageColorBufferGOOGLE 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device, (unsigned long long)image,
+                        (unsigned long long)colorBuffer);
                 }
                 VkResult vkRegisterImageColorBufferGOOGLE_VkResult_return = (VkResult)0;
-                vkRegisterImageColorBufferGOOGLE_VkResult_return = m_state->on_vkRegisterImageColorBufferGOOGLE(&m_pool, device, image, colorBuffer);
-                if ((vkRegisterImageColorBufferGOOGLE_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkRegisterImageColorBufferGOOGLE_VkResult_return =
+                    m_state->on_vkRegisterImageColorBufferGOOGLE(&m_pool, device, image,
+                                                                 colorBuffer);
+                if ((vkRegisterImageColorBufferGOOGLE_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                vkStream->write(&vkRegisterImageColorBufferGOOGLE_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkRegisterImageColorBufferGOOGLE_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkRegisterImageColorBufferGOOGLE(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkRegisterImageColorBufferGOOGLE_VkResult_return, device, image, colorBuffer);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkRegisterImageColorBufferGOOGLE(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkRegisterImageColorBufferGOOGLE_VkResult_return, device, image,
+                        colorBuffer);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkRegisterBufferColorBufferGOOGLE:
-            {
+            case OP_vkRegisterBufferColorBufferGOOGLE: {
                 android::base::beginTrace("vkRegisterBufferColorBufferGOOGLE decode");
                 VkDevice device;
                 VkBuffer buffer;
@@ -26659,29 +31114,39 @@
                 *(VkBuffer*)&buffer = (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_1));
                 memcpy((uint32_t*)&colorBuffer, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkRegisterBufferColorBufferGOOGLE 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)buffer, (unsigned long long)colorBuffer);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkRegisterBufferColorBufferGOOGLE 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device, (unsigned long long)buffer,
+                        (unsigned long long)colorBuffer);
                 }
                 VkResult vkRegisterBufferColorBufferGOOGLE_VkResult_return = (VkResult)0;
-                vkRegisterBufferColorBufferGOOGLE_VkResult_return = m_state->on_vkRegisterBufferColorBufferGOOGLE(&m_pool, device, buffer, colorBuffer);
-                if ((vkRegisterBufferColorBufferGOOGLE_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkRegisterBufferColorBufferGOOGLE_VkResult_return =
+                    m_state->on_vkRegisterBufferColorBufferGOOGLE(&m_pool, device, buffer,
+                                                                  colorBuffer);
+                if ((vkRegisterBufferColorBufferGOOGLE_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                vkStream->write(&vkRegisterBufferColorBufferGOOGLE_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkRegisterBufferColorBufferGOOGLE_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkRegisterBufferColorBufferGOOGLE(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkRegisterBufferColorBufferGOOGLE_VkResult_return, device, buffer, colorBuffer);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkRegisterBufferColorBufferGOOGLE(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkRegisterBufferColorBufferGOOGLE_VkResult_return, device, buffer,
+                        colorBuffer);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkMapMemoryIntoAddressSpaceGOOGLE:
-            {
+            case OP_vkMapMemoryIntoAddressSpaceGOOGLE: {
                 android::base::beginTrace("vkMapMemoryIntoAddressSpaceGOOGLE decode");
                 VkDevice device;
                 VkDeviceMemory memory;
@@ -26694,49 +31159,58 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDeviceMemory*)&memory = (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_1));
+                *(VkDeviceMemory*)&memory =
+                    (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_1));
                 // Begin manual dispatchable handle unboxing for pAddress;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 memcpy((uint64_t**)&pAddress, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAddress);
                 *readStreamPtrPtr += 8;
-                if (pAddress)
-                {
+                if (pAddress) {
                     vkReadStream->alloc((void**)&pAddress, sizeof(uint64_t));
                     memcpy((uint64_t*)pAddress, *readStreamPtrPtr, sizeof(uint64_t));
                     *readStreamPtrPtr += sizeof(uint64_t);
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkMapMemoryIntoAddressSpaceGOOGLE 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)memory, (unsigned long long)pAddress);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkMapMemoryIntoAddressSpaceGOOGLE 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device, (unsigned long long)memory,
+                        (unsigned long long)pAddress);
                 }
                 VkResult vkMapMemoryIntoAddressSpaceGOOGLE_VkResult_return = (VkResult)0;
-                vkMapMemoryIntoAddressSpaceGOOGLE_VkResult_return = m_state->on_vkMapMemoryIntoAddressSpaceGOOGLE(&m_pool, device, memory, pAddress);
-                if ((vkMapMemoryIntoAddressSpaceGOOGLE_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkMapMemoryIntoAddressSpaceGOOGLE_VkResult_return =
+                    m_state->on_vkMapMemoryIntoAddressSpaceGOOGLE(&m_pool, device, memory,
+                                                                  pAddress);
+                if ((vkMapMemoryIntoAddressSpaceGOOGLE_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pAddress;
                 vkStream->putBe64(cgen_var_3);
-                if (pAddress)
-                {
+                if (pAddress) {
                     vkStream->write((uint64_t*)pAddress, sizeof(uint64_t));
                 }
-                vkStream->write(&vkMapMemoryIntoAddressSpaceGOOGLE_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkMapMemoryIntoAddressSpaceGOOGLE_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkMapMemoryIntoAddressSpaceGOOGLE(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkMapMemoryIntoAddressSpaceGOOGLE_VkResult_return, device, memory, pAddress);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkMapMemoryIntoAddressSpaceGOOGLE(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkMapMemoryIntoAddressSpaceGOOGLE_VkResult_return, device, memory,
+                        pAddress);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkUpdateDescriptorSetWithTemplateSizedGOOGLE:
-            {
+            case OP_vkUpdateDescriptorSetWithTemplateSizedGOOGLE: {
                 android::base::beginTrace("vkUpdateDescriptorSetWithTemplateSizedGOOGLE decode");
                 VkDevice device;
                 VkDescriptorSet descriptorSet;
@@ -26758,11 +31232,14 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDescriptorSet*)&descriptorSet = (VkDescriptorSet)unbox_VkDescriptorSet((VkDescriptorSet)(*&cgen_var_1));
+                *(VkDescriptorSet*)&descriptorSet =
+                    (VkDescriptorSet)unbox_VkDescriptorSet((VkDescriptorSet)(*&cgen_var_1));
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDescriptorUpdateTemplate*)&descriptorUpdateTemplate = (VkDescriptorUpdateTemplate)unbox_VkDescriptorUpdateTemplate((VkDescriptorUpdateTemplate)(*&cgen_var_2));
+                *(VkDescriptorUpdateTemplate*)&descriptorUpdateTemplate =
+                    (VkDescriptorUpdateTemplate)unbox_VkDescriptorUpdateTemplate(
+                        (VkDescriptorUpdateTemplate)(*&cgen_var_2));
                 memcpy((uint32_t*)&imageInfoCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&bufferInfoCount, *readStreamPtrPtr, sizeof(uint32_t));
@@ -26773,107 +31250,129 @@
                 memcpy((uint32_t**)&pImageInfoEntryIndices, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pImageInfoEntryIndices);
                 *readStreamPtrPtr += 8;
-                if (pImageInfoEntryIndices)
-                {
-                    vkReadStream->alloc((void**)&pImageInfoEntryIndices, ((imageInfoCount)) * sizeof(const uint32_t));
-                    memcpy((uint32_t*)pImageInfoEntryIndices, *readStreamPtrPtr, ((imageInfoCount)) * sizeof(const uint32_t));
+                if (pImageInfoEntryIndices) {
+                    vkReadStream->alloc((void**)&pImageInfoEntryIndices,
+                                        ((imageInfoCount)) * sizeof(const uint32_t));
+                    memcpy((uint32_t*)pImageInfoEntryIndices, *readStreamPtrPtr,
+                           ((imageInfoCount)) * sizeof(const uint32_t));
                     *readStreamPtrPtr += ((imageInfoCount)) * sizeof(const uint32_t);
                 }
                 // WARNING PTR CHECK
                 memcpy((uint32_t**)&pBufferInfoEntryIndices, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pBufferInfoEntryIndices);
                 *readStreamPtrPtr += 8;
-                if (pBufferInfoEntryIndices)
-                {
-                    vkReadStream->alloc((void**)&pBufferInfoEntryIndices, ((bufferInfoCount)) * sizeof(const uint32_t));
-                    memcpy((uint32_t*)pBufferInfoEntryIndices, *readStreamPtrPtr, ((bufferInfoCount)) * sizeof(const uint32_t));
+                if (pBufferInfoEntryIndices) {
+                    vkReadStream->alloc((void**)&pBufferInfoEntryIndices,
+                                        ((bufferInfoCount)) * sizeof(const uint32_t));
+                    memcpy((uint32_t*)pBufferInfoEntryIndices, *readStreamPtrPtr,
+                           ((bufferInfoCount)) * sizeof(const uint32_t));
                     *readStreamPtrPtr += ((bufferInfoCount)) * sizeof(const uint32_t);
                 }
                 // WARNING PTR CHECK
                 memcpy((uint32_t**)&pBufferViewEntryIndices, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pBufferViewEntryIndices);
                 *readStreamPtrPtr += 8;
-                if (pBufferViewEntryIndices)
-                {
-                    vkReadStream->alloc((void**)&pBufferViewEntryIndices, ((bufferViewCount)) * sizeof(const uint32_t));
-                    memcpy((uint32_t*)pBufferViewEntryIndices, *readStreamPtrPtr, ((bufferViewCount)) * sizeof(const uint32_t));
+                if (pBufferViewEntryIndices) {
+                    vkReadStream->alloc((void**)&pBufferViewEntryIndices,
+                                        ((bufferViewCount)) * sizeof(const uint32_t));
+                    memcpy((uint32_t*)pBufferViewEntryIndices, *readStreamPtrPtr,
+                           ((bufferViewCount)) * sizeof(const uint32_t));
                     *readStreamPtrPtr += ((bufferViewCount)) * sizeof(const uint32_t);
                 }
                 // WARNING PTR CHECK
                 memcpy((VkDescriptorImageInfo**)&pImageInfos, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pImageInfos);
                 *readStreamPtrPtr += 8;
-                if (pImageInfos)
-                {
-                    vkReadStream->alloc((void**)&pImageInfos, ((imageInfoCount)) * sizeof(const VkDescriptorImageInfo));
-                    for (uint32_t i = 0; i < (uint32_t)((imageInfoCount)); ++i)
-                    {
-                        reservedunmarshal_VkDescriptorImageInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorImageInfo*)(pImageInfos + i), readStreamPtrPtr);
+                if (pImageInfos) {
+                    vkReadStream->alloc((void**)&pImageInfos,
+                                        ((imageInfoCount)) * sizeof(const VkDescriptorImageInfo));
+                    for (uint32_t i = 0; i < (uint32_t)((imageInfoCount)); ++i) {
+                        reservedunmarshal_VkDescriptorImageInfo(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkDescriptorImageInfo*)(pImageInfos + i), readStreamPtrPtr);
                     }
                 }
                 // WARNING PTR CHECK
                 memcpy((VkDescriptorBufferInfo**)&pBufferInfos, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pBufferInfos);
                 *readStreamPtrPtr += 8;
-                if (pBufferInfos)
-                {
-                    vkReadStream->alloc((void**)&pBufferInfos, ((bufferInfoCount)) * sizeof(const VkDescriptorBufferInfo));
-                    for (uint32_t i = 0; i < (uint32_t)((bufferInfoCount)); ++i)
-                    {
-                        reservedunmarshal_VkDescriptorBufferInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorBufferInfo*)(pBufferInfos + i), readStreamPtrPtr);
+                if (pBufferInfos) {
+                    vkReadStream->alloc((void**)&pBufferInfos,
+                                        ((bufferInfoCount)) * sizeof(const VkDescriptorBufferInfo));
+                    for (uint32_t i = 0; i < (uint32_t)((bufferInfoCount)); ++i) {
+                        reservedunmarshal_VkDescriptorBufferInfo(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkDescriptorBufferInfo*)(pBufferInfos + i), readStreamPtrPtr);
                     }
                 }
                 // WARNING PTR CHECK
                 memcpy((VkBufferView**)&pBufferViews, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pBufferViews);
                 *readStreamPtrPtr += 8;
-                if (pBufferViews)
-                {
-                    vkReadStream->alloc((void**)&pBufferViews, ((bufferViewCount)) * sizeof(const VkBufferView));
-                    if (((bufferViewCount)))
-                    {
+                if (pBufferViews) {
+                    vkReadStream->alloc((void**)&pBufferViews,
+                                        ((bufferViewCount)) * sizeof(const VkBufferView));
+                    if (((bufferViewCount))) {
                         uint8_t* cgen_var_8_0_ptr = (uint8_t*)(*readStreamPtrPtr);
                         *readStreamPtrPtr += 8 * ((bufferViewCount));
-                        for (uint32_t k = 0; k < ((bufferViewCount)); ++k)
-                        {
-                            uint64_t tmpval; memcpy(&tmpval, cgen_var_8_0_ptr + k * 8, sizeof(uint64_t));
-                            *(((VkBufferView*)pBufferViews) + k) = (VkBufferView)unbox_VkBufferView((VkBufferView)tmpval);
+                        for (uint32_t k = 0; k < ((bufferViewCount)); ++k) {
+                            uint64_t tmpval;
+                            memcpy(&tmpval, cgen_var_8_0_ptr + k * 8, sizeof(uint64_t));
+                            *(((VkBufferView*)pBufferViews) + k) =
+                                (VkBufferView)unbox_VkBufferView((VkBufferView)tmpval);
                         }
                     }
                 }
-                if (pImageInfos)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((imageInfoCount)); ++i)
-                    {
-                        transform_tohost_VkDescriptorImageInfo(m_state, (VkDescriptorImageInfo*)(pImageInfos + i));
+                if (pImageInfos) {
+                    for (uint32_t i = 0; i < (uint32_t)((imageInfoCount)); ++i) {
+                        transform_tohost_VkDescriptorImageInfo(
+                            m_state, (VkDescriptorImageInfo*)(pImageInfos + i));
                     }
                 }
-                if (pBufferInfos)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((bufferInfoCount)); ++i)
-                    {
-                        transform_tohost_VkDescriptorBufferInfo(m_state, (VkDescriptorBufferInfo*)(pBufferInfos + i));
+                if (pBufferInfos) {
+                    for (uint32_t i = 0; i < (uint32_t)((bufferInfoCount)); ++i) {
+                        transform_tohost_VkDescriptorBufferInfo(
+                            m_state, (VkDescriptorBufferInfo*)(pBufferInfos + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkUpdateDescriptorSetWithTemplateSizedGOOGLE 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)descriptorSet, (unsigned long long)descriptorUpdateTemplate, (unsigned long long)imageInfoCount, (unsigned long long)bufferInfoCount, (unsigned long long)bufferViewCount, (unsigned long long)pImageInfoEntryIndices, (unsigned long long)pBufferInfoEntryIndices, (unsigned long long)pBufferViewEntryIndices, (unsigned long long)pImageInfos, (unsigned long long)pBufferInfos, (unsigned long long)pBufferViews);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkUpdateDescriptorSetWithTemplateSizedGOOGLE 0x%llx "
+                            "0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)descriptorSet,
+                            (unsigned long long)descriptorUpdateTemplate,
+                            (unsigned long long)imageInfoCount, (unsigned long long)bufferInfoCount,
+                            (unsigned long long)bufferViewCount,
+                            (unsigned long long)pImageInfoEntryIndices,
+                            (unsigned long long)pBufferInfoEntryIndices,
+                            (unsigned long long)pBufferViewEntryIndices,
+                            (unsigned long long)pImageInfos, (unsigned long long)pBufferInfos,
+                            (unsigned long long)pBufferViews);
                 }
-                m_state->on_vkUpdateDescriptorSetWithTemplateSizedGOOGLE(&m_pool, device, descriptorSet, descriptorUpdateTemplate, imageInfoCount, bufferInfoCount, bufferViewCount, pImageInfoEntryIndices, pBufferInfoEntryIndices, pBufferViewEntryIndices, pImageInfos, pBufferInfos, pBufferViews);
+                m_state->on_vkUpdateDescriptorSetWithTemplateSizedGOOGLE(
+                    &m_pool, device, descriptorSet, descriptorUpdateTemplate, imageInfoCount,
+                    bufferInfoCount, bufferViewCount, pImageInfoEntryIndices,
+                    pBufferInfoEntryIndices, pBufferViewEntryIndices, pImageInfos, pBufferInfos,
+                    pBufferViews);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkUpdateDescriptorSetWithTemplateSizedGOOGLE(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, descriptorSet, descriptorUpdateTemplate, imageInfoCount, bufferInfoCount, bufferViewCount, pImageInfoEntryIndices, pBufferInfoEntryIndices, pBufferViewEntryIndices, pImageInfos, pBufferInfos, pBufferViews);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkUpdateDescriptorSetWithTemplateSizedGOOGLE(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, descriptorSet,
+                        descriptorUpdateTemplate, imageInfoCount, bufferInfoCount, bufferViewCount,
+                        pImageInfoEntryIndices, pBufferInfoEntryIndices, pBufferViewEntryIndices,
+                        pImageInfos, pBufferInfos, pBufferViews);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkBeginCommandBufferAsyncGOOGLE:
-            {
+            case OP_vkBeginCommandBufferAsyncGOOGLE: {
                 android::base::beginTrace("vkBeginCommandBufferAsyncGOOGLE decode");
                 VkCommandBuffer commandBuffer;
                 const VkCommandBufferBeginInfo* pBeginInfo;
@@ -26881,58 +31380,67 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 vkReadStream->alloc((void**)&pBeginInfo, sizeof(const VkCommandBufferBeginInfo));
-                reservedunmarshal_VkCommandBufferBeginInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCommandBufferBeginInfo*)(pBeginInfo), readStreamPtrPtr);
-                if (pBeginInfo)
-                {
-                    transform_tohost_VkCommandBufferBeginInfo(m_state, (VkCommandBufferBeginInfo*)(pBeginInfo));
+                reservedunmarshal_VkCommandBufferBeginInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                           (VkCommandBufferBeginInfo*)(pBeginInfo),
+                                                           readStreamPtrPtr);
+                if (pBeginInfo) {
+                    transform_tohost_VkCommandBufferBeginInfo(
+                        m_state, (VkCommandBufferBeginInfo*)(pBeginInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkBeginCommandBufferAsyncGOOGLE 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pBeginInfo);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkBeginCommandBufferAsyncGOOGLE 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pBeginInfo);
                 }
-                m_state->on_vkBeginCommandBufferAsyncGOOGLE(&m_pool, commandBuffer, pBeginInfo, gfx_logger);
+                m_state->on_vkBeginCommandBufferAsyncGOOGLE(&m_pool, commandBuffer, pBeginInfo,
+                                                            gfx_logger);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkBeginCommandBufferAsyncGOOGLE(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pBeginInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkBeginCommandBufferAsyncGOOGLE(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pBeginInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkEndCommandBufferAsyncGOOGLE:
-            {
+            case OP_vkEndCommandBufferAsyncGOOGLE: {
                 android::base::beginTrace("vkEndCommandBufferAsyncGOOGLE decode");
                 VkCommandBuffer commandBuffer;
                 // Begin global wrapped dispatchable handle unboxing for commandBuffer;
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkEndCommandBufferAsyncGOOGLE 0x%llx \n", ioStream, (unsigned long long)commandBuffer);
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkEndCommandBufferAsyncGOOGLE 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer);
                 }
                 m_state->on_vkEndCommandBufferAsyncGOOGLE(&m_pool, commandBuffer, gfx_logger);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkEndCommandBufferAsyncGOOGLE(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkEndCommandBufferAsyncGOOGLE(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkResetCommandBufferAsyncGOOGLE:
-            {
+            case OP_vkResetCommandBufferAsyncGOOGLE: {
                 android::base::beginTrace("vkResetCommandBufferAsyncGOOGLE decode");
                 VkCommandBuffer commandBuffer;
                 VkCommandBufferResetFlags flags;
@@ -26940,28 +31448,32 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
-                memcpy((VkCommandBufferResetFlags*)&flags, *readStreamPtrPtr, sizeof(VkCommandBufferResetFlags));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                memcpy((VkCommandBufferResetFlags*)&flags, *readStreamPtrPtr,
+                       sizeof(VkCommandBufferResetFlags));
                 *readStreamPtrPtr += sizeof(VkCommandBufferResetFlags);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkResetCommandBufferAsyncGOOGLE 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)flags);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkResetCommandBufferAsyncGOOGLE 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer, (unsigned long long)flags);
                 }
                 m_state->on_vkResetCommandBufferAsyncGOOGLE(&m_pool, commandBuffer, flags);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkResetCommandBufferAsyncGOOGLE(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, flags);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkResetCommandBufferAsyncGOOGLE(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, flags);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCommandBufferHostSyncGOOGLE:
-            {
+            case OP_vkCommandBufferHostSyncGOOGLE: {
                 android::base::beginTrace("vkCommandBufferHostSyncGOOGLE decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t needHostSync;
@@ -26970,30 +31482,36 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 memcpy((uint32_t*)&needHostSync, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&sequenceNumber, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCommandBufferHostSyncGOOGLE 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)needHostSync, (unsigned long long)sequenceNumber);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCommandBufferHostSyncGOOGLE 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)needHostSync, (unsigned long long)sequenceNumber);
                 }
-                m_state->on_vkCommandBufferHostSyncGOOGLE(&m_pool, commandBuffer, needHostSync, sequenceNumber);
+                m_state->on_vkCommandBufferHostSyncGOOGLE(&m_pool, commandBuffer, needHostSync,
+                                                          sequenceNumber);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCommandBufferHostSyncGOOGLE(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, needHostSync, sequenceNumber);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCommandBufferHostSyncGOOGLE(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        needHostSync, sequenceNumber);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCreateImageWithRequirementsGOOGLE:
-            {
+            case OP_vkCreateImageWithRequirementsGOOGLE: {
                 android::base::beginTrace("vkCreateImageWithRequirementsGOOGLE decode");
                 VkDevice device;
                 const VkImageCreateInfo* pCreateInfo;
@@ -27006,15 +31524,18 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkImageCreateInfo));
-                reservedunmarshal_VkImageCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageCreateInfo*)(pCreateInfo), readStreamPtrPtr);
+                reservedunmarshal_VkImageCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                    (VkImageCreateInfo*)(pCreateInfo),
+                                                    readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pImage;
                 vkReadStream->unsetHandleMapping();
@@ -27026,56 +31547,70 @@
                 // Begin manual dispatchable handle unboxing for pMemoryRequirements;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pMemoryRequirements, sizeof(VkMemoryRequirements));
-                reservedunmarshal_VkMemoryRequirements(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements*)(pMemoryRequirements), readStreamPtrPtr);
-                if (pCreateInfo)
-                {
+                reservedunmarshal_VkMemoryRequirements(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                       (VkMemoryRequirements*)(pMemoryRequirements),
+                                                       readStreamPtrPtr);
+                if (pCreateInfo) {
                     m_state->transformImpl_VkImageCreateInfo_tohost(pCreateInfo, 1);
                     transform_tohost_VkImageCreateInfo(m_state, (VkImageCreateInfo*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (pMemoryRequirements)
-                {
-                    transform_tohost_VkMemoryRequirements(m_state, (VkMemoryRequirements*)(pMemoryRequirements));
+                if (pMemoryRequirements) {
+                    transform_tohost_VkMemoryRequirements(
+                        m_state, (VkMemoryRequirements*)(pMemoryRequirements));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateImageWithRequirementsGOOGLE 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pImage, (unsigned long long)pMemoryRequirements);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateImageWithRequirementsGOOGLE 0x%llx 0x%llx "
+                            "0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pImage,
+                            (unsigned long long)pMemoryRequirements);
                 }
                 VkResult vkCreateImageWithRequirementsGOOGLE_VkResult_return = (VkResult)0;
-                vkCreateImageWithRequirementsGOOGLE_VkResult_return = m_state->on_vkCreateImageWithRequirementsGOOGLE(&m_pool, device, pCreateInfo, pAllocator, pImage, pMemoryRequirements);
-                if ((vkCreateImageWithRequirementsGOOGLE_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateImageWithRequirementsGOOGLE_VkResult_return =
+                    m_state->on_vkCreateImageWithRequirementsGOOGLE(
+                        &m_pool, device, pCreateInfo, pAllocator, pImage, pMemoryRequirements);
+                if ((vkCreateImageWithRequirementsGOOGLE_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // Begin manual non dispatchable handle create for pImage;
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3;
-                static_assert(8 == sizeof(VkImage), "handle map overwrite requires VkImage to be 8 bytes long");
+                static_assert(8 == sizeof(VkImage),
+                              "handle map overwrite requires VkImage to be 8 bytes long");
                 vkStream->handleMapping()->mapHandles_VkImage((VkImage*)pImage, 1);
                 vkStream->write((VkImage*)pImage, 8 * 1);
                 // Begin manual non dispatchable handle create for pImage;
                 vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
-                if (pMemoryRequirements)
-                {
-                    transform_fromhost_VkMemoryRequirements(m_state, (VkMemoryRequirements*)(pMemoryRequirements));
+                if (pMemoryRequirements) {
+                    transform_fromhost_VkMemoryRequirements(
+                        m_state, (VkMemoryRequirements*)(pMemoryRequirements));
                 }
-                marshal_VkMemoryRequirements(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements*)(pMemoryRequirements));
-                vkStream->write(&vkCreateImageWithRequirementsGOOGLE_VkResult_return, sizeof(VkResult));
+                marshal_VkMemoryRequirements(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                             (VkMemoryRequirements*)(pMemoryRequirements));
+                vkStream->write(&vkCreateImageWithRequirementsGOOGLE_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateImageWithRequirementsGOOGLE(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateImageWithRequirementsGOOGLE_VkResult_return, device, pCreateInfo, pAllocator, pImage, pMemoryRequirements);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateImageWithRequirementsGOOGLE(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateImageWithRequirementsGOOGLE_VkResult_return, device, pCreateInfo,
+                        pAllocator, pImage, pMemoryRequirements);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCreateBufferWithRequirementsGOOGLE:
-            {
+            case OP_vkCreateBufferWithRequirementsGOOGLE: {
                 android::base::beginTrace("vkCreateBufferWithRequirementsGOOGLE decode");
                 VkDevice device;
                 const VkBufferCreateInfo* pCreateInfo;
@@ -27088,15 +31623,18 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkBufferCreateInfo));
-                reservedunmarshal_VkBufferCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferCreateInfo*)(pCreateInfo), readStreamPtrPtr);
+                reservedunmarshal_VkBufferCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                     (VkBufferCreateInfo*)(pCreateInfo),
+                                                     readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pBuffer;
                 vkReadStream->unsetHandleMapping();
@@ -27108,55 +31646,70 @@
                 // Begin manual dispatchable handle unboxing for pMemoryRequirements;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pMemoryRequirements, sizeof(VkMemoryRequirements));
-                reservedunmarshal_VkMemoryRequirements(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements*)(pMemoryRequirements), readStreamPtrPtr);
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkBufferCreateInfo(m_state, (VkBufferCreateInfo*)(pCreateInfo));
+                reservedunmarshal_VkMemoryRequirements(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                       (VkMemoryRequirements*)(pMemoryRequirements),
+                                                       readStreamPtrPtr);
+                if (pCreateInfo) {
+                    transform_tohost_VkBufferCreateInfo(m_state,
+                                                        (VkBufferCreateInfo*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (pMemoryRequirements)
-                {
-                    transform_tohost_VkMemoryRequirements(m_state, (VkMemoryRequirements*)(pMemoryRequirements));
+                if (pMemoryRequirements) {
+                    transform_tohost_VkMemoryRequirements(
+                        m_state, (VkMemoryRequirements*)(pMemoryRequirements));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateBufferWithRequirementsGOOGLE 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pBuffer, (unsigned long long)pMemoryRequirements);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateBufferWithRequirementsGOOGLE 0x%llx 0x%llx "
+                            "0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator, (unsigned long long)pBuffer,
+                            (unsigned long long)pMemoryRequirements);
                 }
                 VkResult vkCreateBufferWithRequirementsGOOGLE_VkResult_return = (VkResult)0;
-                vkCreateBufferWithRequirementsGOOGLE_VkResult_return = m_state->on_vkCreateBufferWithRequirementsGOOGLE(&m_pool, device, pCreateInfo, pAllocator, pBuffer, pMemoryRequirements);
-                if ((vkCreateBufferWithRequirementsGOOGLE_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateBufferWithRequirementsGOOGLE_VkResult_return =
+                    m_state->on_vkCreateBufferWithRequirementsGOOGLE(
+                        &m_pool, device, pCreateInfo, pAllocator, pBuffer, pMemoryRequirements);
+                if ((vkCreateBufferWithRequirementsGOOGLE_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // Begin manual non dispatchable handle create for pBuffer;
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_3;
-                static_assert(8 == sizeof(VkBuffer), "handle map overwrite requires VkBuffer to be 8 bytes long");
+                static_assert(8 == sizeof(VkBuffer),
+                              "handle map overwrite requires VkBuffer to be 8 bytes long");
                 vkStream->handleMapping()->mapHandles_VkBuffer((VkBuffer*)pBuffer, 1);
                 vkStream->write((VkBuffer*)pBuffer, 8 * 1);
                 // Begin manual non dispatchable handle create for pBuffer;
                 vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
-                if (pMemoryRequirements)
-                {
-                    transform_fromhost_VkMemoryRequirements(m_state, (VkMemoryRequirements*)(pMemoryRequirements));
+                if (pMemoryRequirements) {
+                    transform_fromhost_VkMemoryRequirements(
+                        m_state, (VkMemoryRequirements*)(pMemoryRequirements));
                 }
-                marshal_VkMemoryRequirements(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements*)(pMemoryRequirements));
-                vkStream->write(&vkCreateBufferWithRequirementsGOOGLE_VkResult_return, sizeof(VkResult));
+                marshal_VkMemoryRequirements(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                             (VkMemoryRequirements*)(pMemoryRequirements));
+                vkStream->write(&vkCreateBufferWithRequirementsGOOGLE_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateBufferWithRequirementsGOOGLE(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateBufferWithRequirementsGOOGLE_VkResult_return, device, pCreateInfo, pAllocator, pBuffer, pMemoryRequirements);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateBufferWithRequirementsGOOGLE(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateBufferWithRequirementsGOOGLE_VkResult_return, device, pCreateInfo,
+                        pAllocator, pBuffer, pMemoryRequirements);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetMemoryHostAddressInfoGOOGLE:
-            {
+            case OP_vkGetMemoryHostAddressInfoGOOGLE: {
                 android::base::beginTrace("vkGetMemoryHostAddressInfoGOOGLE decode");
                 VkDevice device;
                 VkDeviceMemory memory;
@@ -27171,15 +31724,15 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDeviceMemory*)&memory = (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_1));
+                *(VkDeviceMemory*)&memory =
+                    (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_1));
                 // Begin manual dispatchable handle unboxing for pAddress;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 memcpy((uint64_t**)&pAddress, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAddress);
                 *readStreamPtrPtr += 8;
-                if (pAddress)
-                {
+                if (pAddress) {
                     vkReadStream->alloc((void**)&pAddress, sizeof(uint64_t));
                     memcpy((uint64_t*)pAddress, *readStreamPtrPtr, sizeof(uint64_t));
                     *readStreamPtrPtr += sizeof(uint64_t);
@@ -27190,8 +31743,7 @@
                 memcpy((uint64_t**)&pSize, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pSize);
                 *readStreamPtrPtr += 8;
-                if (pSize)
-                {
+                if (pSize) {
                     vkReadStream->alloc((void**)&pSize, sizeof(uint64_t));
                     memcpy((uint64_t*)pSize, *readStreamPtrPtr, sizeof(uint64_t));
                     *readStreamPtrPtr += sizeof(uint64_t);
@@ -27202,56 +31754,63 @@
                 memcpy((uint64_t**)&pHostmemId, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pHostmemId);
                 *readStreamPtrPtr += 8;
-                if (pHostmemId)
-                {
+                if (pHostmemId) {
                     vkReadStream->alloc((void**)&pHostmemId, sizeof(uint64_t));
                     memcpy((uint64_t*)pHostmemId, *readStreamPtrPtr, sizeof(uint64_t));
                     *readStreamPtrPtr += sizeof(uint64_t);
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetMemoryHostAddressInfoGOOGLE 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)memory, (unsigned long long)pAddress, (unsigned long long)pSize, (unsigned long long)pHostmemId);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetMemoryHostAddressInfoGOOGLE 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)memory,
+                            (unsigned long long)pAddress, (unsigned long long)pSize,
+                            (unsigned long long)pHostmemId);
                 }
                 VkResult vkGetMemoryHostAddressInfoGOOGLE_VkResult_return = (VkResult)0;
-                vkGetMemoryHostAddressInfoGOOGLE_VkResult_return = m_state->on_vkGetMemoryHostAddressInfoGOOGLE(&m_pool, device, memory, pAddress, pSize, pHostmemId);
-                if ((vkGetMemoryHostAddressInfoGOOGLE_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkGetMemoryHostAddressInfoGOOGLE_VkResult_return =
+                    m_state->on_vkGetMemoryHostAddressInfoGOOGLE(&m_pool, device, memory, pAddress,
+                                                                 pSize, pHostmemId);
+                if ((vkGetMemoryHostAddressInfoGOOGLE_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_5 = (uint64_t)(uintptr_t)pAddress;
                 vkStream->putBe64(cgen_var_5);
-                if (pAddress)
-                {
+                if (pAddress) {
                     vkStream->write((uint64_t*)pAddress, sizeof(uint64_t));
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_6 = (uint64_t)(uintptr_t)pSize;
                 vkStream->putBe64(cgen_var_6);
-                if (pSize)
-                {
+                if (pSize) {
                     vkStream->write((uint64_t*)pSize, sizeof(uint64_t));
                 }
                 // WARNING PTR CHECK
                 uint64_t cgen_var_7 = (uint64_t)(uintptr_t)pHostmemId;
                 vkStream->putBe64(cgen_var_7);
-                if (pHostmemId)
-                {
+                if (pHostmemId) {
                     vkStream->write((uint64_t*)pHostmemId, sizeof(uint64_t));
                 }
-                vkStream->write(&vkGetMemoryHostAddressInfoGOOGLE_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkGetMemoryHostAddressInfoGOOGLE_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetMemoryHostAddressInfoGOOGLE(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetMemoryHostAddressInfoGOOGLE_VkResult_return, device, memory, pAddress, pSize, pHostmemId);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetMemoryHostAddressInfoGOOGLE(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetMemoryHostAddressInfoGOOGLE_VkResult_return, device, memory, pAddress,
+                        pSize, pHostmemId);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkFreeMemorySyncGOOGLE:
-            {
+            case OP_vkFreeMemorySyncGOOGLE: {
                 android::base::beginTrace("vkFreeMemorySyncGOOGLE decode");
                 VkDevice device;
                 VkDeviceMemory memory;
@@ -27266,46 +31825,55 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDeviceMemory*)&memory = (VkDeviceMemory)(VkDeviceMemory)((VkDeviceMemory)(*&cgen_var_1));
+                *(VkDeviceMemory*)&memory =
+                    (VkDeviceMemory)(VkDeviceMemory)((VkDeviceMemory)(*&cgen_var_1));
                 boxed_memory_preserve = memory;
                 memory = unbox_VkDeviceMemory(memory);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkFreeMemorySyncGOOGLE 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)memory, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkFreeMemorySyncGOOGLE 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)memory,
+                            (unsigned long long)pAllocator);
                 }
                 VkResult vkFreeMemorySyncGOOGLE_VkResult_return = (VkResult)0;
-                vkFreeMemorySyncGOOGLE_VkResult_return = m_state->on_vkFreeMemorySyncGOOGLE(&m_pool, device, memory, pAllocator);
-                if ((vkFreeMemorySyncGOOGLE_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkFreeMemorySyncGOOGLE_VkResult_return =
+                    m_state->on_vkFreeMemorySyncGOOGLE(&m_pool, device, memory, pAllocator);
+                if ((vkFreeMemorySyncGOOGLE_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkFreeMemorySyncGOOGLE_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkFreeMemorySyncGOOGLE(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkFreeMemorySyncGOOGLE_VkResult_return, device, boxed_memory_preserve, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkFreeMemorySyncGOOGLE(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkFreeMemorySyncGOOGLE_VkResult_return, device, boxed_memory_preserve,
+                        pAllocator);
                 }
                 delete_VkDeviceMemory(boxed_memory_preserve);
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkQueueHostSyncGOOGLE:
-            {
+            case OP_vkQueueHostSyncGOOGLE: {
                 android::base::beginTrace("vkQueueHostSyncGOOGLE decode");
                 VkQueue queue;
                 uint32_t needHostSync;
@@ -27319,25 +31887,28 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&sequenceNumber, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkQueueHostSyncGOOGLE 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)queue, (unsigned long long)needHostSync, (unsigned long long)sequenceNumber);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkQueueHostSyncGOOGLE 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)queue, (unsigned long long)needHostSync,
+                            (unsigned long long)sequenceNumber);
                 }
                 m_state->on_vkQueueHostSyncGOOGLE(&m_pool, queue, needHostSync, sequenceNumber);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkQueueHostSyncGOOGLE(snapshotTraceBegin, snapshotTraceBytes, &m_pool, queue, needHostSync, sequenceNumber);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkQueueHostSyncGOOGLE(snapshotTraceBegin,
+                                                               snapshotTraceBytes, &m_pool, queue,
+                                                               needHostSync, sequenceNumber);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkQueueSubmitAsyncGOOGLE:
-            {
+            case OP_vkQueueSubmitAsyncGOOGLE: {
                 android::base::beginTrace("vkQueueSubmitAsyncGOOGLE decode");
                 VkQueue queue;
                 uint32_t submitCount;
@@ -27350,41 +31921,45 @@
                 *(VkQueue*)&queue = (VkQueue)(VkQueue)((VkQueue)(*&cgen_var_0));
                 memcpy((uint32_t*)&submitCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pSubmits, ((submitCount)) * sizeof(const VkSubmitInfo));
-                for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i)
-                {
-                    reservedunmarshal_VkSubmitInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubmitInfo*)(pSubmits + i), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pSubmits,
+                                    ((submitCount)) * sizeof(const VkSubmitInfo));
+                for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i) {
+                    reservedunmarshal_VkSubmitInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                   (VkSubmitInfo*)(pSubmits + i), readStreamPtrPtr);
                 }
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkFence*)&fence = (VkFence)unbox_VkFence((VkFence)(*&cgen_var_1));
-                if (pSubmits)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i)
-                    {
+                if (pSubmits) {
+                    for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i) {
                         transform_tohost_VkSubmitInfo(m_state, (VkSubmitInfo*)(pSubmits + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkQueueSubmitAsyncGOOGLE 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)queue, (unsigned long long)submitCount, (unsigned long long)pSubmits, (unsigned long long)fence);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkQueueSubmitAsyncGOOGLE 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)queue, (unsigned long long)submitCount,
+                        (unsigned long long)pSubmits, (unsigned long long)fence);
                 }
                 m_state->on_vkQueueSubmitAsyncGOOGLE(&m_pool, queue, submitCount, pSubmits, fence);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkQueueSubmitAsyncGOOGLE(snapshotTraceBegin, snapshotTraceBytes, &m_pool, queue, submitCount, pSubmits, fence);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkQueueSubmitAsyncGOOGLE(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, queue, submitCount,
+                        pSubmits, fence);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkQueueWaitIdleAsyncGOOGLE:
-            {
+            case OP_vkQueueWaitIdleAsyncGOOGLE: {
                 android::base::beginTrace("vkQueueWaitIdleAsyncGOOGLE decode");
                 VkQueue queue;
                 // Begin global wrapped dispatchable handle unboxing for queue;
@@ -27392,25 +31967,26 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkQueue*)&queue = (VkQueue)(VkQueue)((VkQueue)(*&cgen_var_0));
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkQueueWaitIdleAsyncGOOGLE 0x%llx \n", ioStream, (unsigned long long)queue);
+                if (m_logCalls) {
+                    fprintf(stderr, "stream %p: call vkQueueWaitIdleAsyncGOOGLE 0x%llx \n",
+                            ioStream, (unsigned long long)queue);
                 }
                 m_state->on_vkQueueWaitIdleAsyncGOOGLE(&m_pool, queue);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkQueueWaitIdleAsyncGOOGLE(snapshotTraceBegin, snapshotTraceBytes, &m_pool, queue);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkQueueWaitIdleAsyncGOOGLE(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, queue);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkQueueBindSparseAsyncGOOGLE:
-            {
+            case OP_vkQueueBindSparseAsyncGOOGLE: {
                 android::base::beginTrace("vkQueueBindSparseAsyncGOOGLE decode");
                 VkQueue queue;
                 uint32_t bindInfoCount;
@@ -27423,41 +31999,48 @@
                 *(VkQueue*)&queue = (VkQueue)(VkQueue)((VkQueue)(*&cgen_var_0));
                 memcpy((uint32_t*)&bindInfoCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pBindInfo, ((bindInfoCount)) * sizeof(const VkBindSparseInfo));
-                for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
-                {
-                    reservedunmarshal_VkBindSparseInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBindSparseInfo*)(pBindInfo + i), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pBindInfo,
+                                    ((bindInfoCount)) * sizeof(const VkBindSparseInfo));
+                for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
+                    reservedunmarshal_VkBindSparseInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                       (VkBindSparseInfo*)(pBindInfo + i),
+                                                       readStreamPtrPtr);
                 }
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkFence*)&fence = (VkFence)unbox_VkFence((VkFence)(*&cgen_var_1));
-                if (pBindInfo)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
-                    {
-                        transform_tohost_VkBindSparseInfo(m_state, (VkBindSparseInfo*)(pBindInfo + i));
+                if (pBindInfo) {
+                    for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
+                        transform_tohost_VkBindSparseInfo(m_state,
+                                                          (VkBindSparseInfo*)(pBindInfo + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkQueueBindSparseAsyncGOOGLE 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)queue, (unsigned long long)bindInfoCount, (unsigned long long)pBindInfo, (unsigned long long)fence);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkQueueBindSparseAsyncGOOGLE 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)queue, (unsigned long long)bindInfoCount,
+                            (unsigned long long)pBindInfo, (unsigned long long)fence);
                 }
-                m_state->on_vkQueueBindSparseAsyncGOOGLE(&m_pool, queue, bindInfoCount, pBindInfo, fence);
+                m_state->on_vkQueueBindSparseAsyncGOOGLE(&m_pool, queue, bindInfoCount, pBindInfo,
+                                                         fence);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkQueueBindSparseAsyncGOOGLE(snapshotTraceBegin, snapshotTraceBytes, &m_pool, queue, bindInfoCount, pBindInfo, fence);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkQueueBindSparseAsyncGOOGLE(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, queue, bindInfoCount,
+                        pBindInfo, fence);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetLinearImageLayoutGOOGLE:
-            {
+            case OP_vkGetLinearImageLayoutGOOGLE: {
                 android::base::beginTrace("vkGetLinearImageLayoutGOOGLE decode");
                 VkDevice device;
                 VkFormat format;
@@ -27480,28 +32063,34 @@
                 vkReadStream->alloc((void**)&pRowPitchAlignment, sizeof(VkDeviceSize));
                 memcpy((VkDeviceSize*)pRowPitchAlignment, *readStreamPtrPtr, sizeof(VkDeviceSize));
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetLinearImageLayoutGOOGLE 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)format, (unsigned long long)pOffset, (unsigned long long)pRowPitchAlignment);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetLinearImageLayoutGOOGLE 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)format,
+                            (unsigned long long)pOffset, (unsigned long long)pRowPitchAlignment);
                 }
-                m_state->on_vkGetLinearImageLayoutGOOGLE(&m_pool, device, format, pOffset, pRowPitchAlignment);
+                m_state->on_vkGetLinearImageLayoutGOOGLE(&m_pool, device, format, pOffset,
+                                                         pRowPitchAlignment);
                 vkStream->unsetHandleMapping();
                 vkStream->write((VkDeviceSize*)pOffset, sizeof(VkDeviceSize));
                 vkStream->write((VkDeviceSize*)pRowPitchAlignment, sizeof(VkDeviceSize));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetLinearImageLayoutGOOGLE(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, format, pOffset, pRowPitchAlignment);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetLinearImageLayoutGOOGLE(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, format, pOffset,
+                        pRowPitchAlignment);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetLinearImageLayout2GOOGLE:
-            {
+            case OP_vkGetLinearImageLayout2GOOGLE: {
                 android::base::beginTrace("vkGetLinearImageLayout2GOOGLE decode");
                 VkDevice device;
                 const VkImageCreateInfo* pCreateInfo;
@@ -27513,7 +32102,9 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkImageCreateInfo));
-                reservedunmarshal_VkImageCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageCreateInfo*)(pCreateInfo), readStreamPtrPtr);
+                reservedunmarshal_VkImageCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                    (VkImageCreateInfo*)(pCreateInfo),
+                                                    readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pOffset;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pOffset, sizeof(VkDeviceSize));
@@ -27524,33 +32115,38 @@
                 vkReadStream->alloc((void**)&pRowPitchAlignment, sizeof(VkDeviceSize));
                 memcpy((VkDeviceSize*)pRowPitchAlignment, *readStreamPtrPtr, sizeof(VkDeviceSize));
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
-                if (pCreateInfo)
-                {
+                if (pCreateInfo) {
                     m_state->transformImpl_VkImageCreateInfo_tohost(pCreateInfo, 1);
                     transform_tohost_VkImageCreateInfo(m_state, (VkImageCreateInfo*)(pCreateInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetLinearImageLayout2GOOGLE 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pOffset, (unsigned long long)pRowPitchAlignment);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetLinearImageLayout2GOOGLE 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pOffset, (unsigned long long)pRowPitchAlignment);
                 }
-                m_state->on_vkGetLinearImageLayout2GOOGLE(&m_pool, device, pCreateInfo, pOffset, pRowPitchAlignment);
+                m_state->on_vkGetLinearImageLayout2GOOGLE(&m_pool, device, pCreateInfo, pOffset,
+                                                          pRowPitchAlignment);
                 vkStream->unsetHandleMapping();
                 vkStream->write((VkDeviceSize*)pOffset, sizeof(VkDeviceSize));
                 vkStream->write((VkDeviceSize*)pRowPitchAlignment, sizeof(VkDeviceSize));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetLinearImageLayout2GOOGLE(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, pCreateInfo, pOffset, pRowPitchAlignment);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetLinearImageLayout2GOOGLE(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, pCreateInfo,
+                        pOffset, pRowPitchAlignment);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkQueueFlushCommandsGOOGLE:
-            {
+            case OP_vkQueueFlushCommandsGOOGLE: {
                 android::base::beginTrace("vkQueueFlushCommandsGOOGLE decode");
                 VkQueue queue;
                 VkCommandBuffer commandBuffer;
@@ -27565,31 +32161,38 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_1));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_1));
                 memcpy((VkDeviceSize*)&dataSize, *readStreamPtrPtr, sizeof(VkDeviceSize));
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
                 vkReadStream->alloc((void**)&pData, ((dataSize)) * sizeof(const uint8_t));
                 memcpy((void*)pData, *readStreamPtrPtr, ((dataSize)) * sizeof(const uint8_t));
                 *readStreamPtrPtr += ((dataSize)) * sizeof(const uint8_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkQueueFlushCommandsGOOGLE 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)queue, (unsigned long long)commandBuffer, (unsigned long long)dataSize, (unsigned long long)pData);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkQueueFlushCommandsGOOGLE 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)queue, (unsigned long long)commandBuffer,
+                        (unsigned long long)dataSize, (unsigned long long)pData);
                 }
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
-                m_state->on_vkQueueFlushCommandsGOOGLE(&m_pool, queue, commandBuffer, dataSize, pData, gfx_logger);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                m_state->on_vkQueueFlushCommandsGOOGLE(&m_pool, queue, commandBuffer, dataSize,
+                                                       pData, gfx_logger);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkQueueFlushCommandsGOOGLE(snapshotTraceBegin, snapshotTraceBytes, &m_pool, queue, commandBuffer, dataSize, pData);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkQueueFlushCommandsGOOGLE(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, queue, commandBuffer,
+                        dataSize, pData);
                 }
                 vkReadStream->clearPool();
                 android::base::endTrace();
                 break;
             }
-            case OP_vkQueueCommitDescriptorSetUpdatesGOOGLE:
-            {
+            case OP_vkQueueCommitDescriptorSetUpdatesGOOGLE: {
                 android::base::beginTrace("vkQueueCommitDescriptorSetUpdatesGOOGLE decode");
                 VkQueue queue;
                 uint32_t descriptorPoolCount;
@@ -27609,75 +32212,109 @@
                 *(VkQueue*)&queue = (VkQueue)(VkQueue)((VkQueue)(*&cgen_var_0));
                 memcpy((uint32_t*)&descriptorPoolCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pDescriptorPools, ((descriptorPoolCount)) * sizeof(const VkDescriptorPool));
-                if (((descriptorPoolCount)))
-                {
+                vkReadStream->alloc((void**)&pDescriptorPools,
+                                    ((descriptorPoolCount)) * sizeof(const VkDescriptorPool));
+                if (((descriptorPoolCount))) {
                     uint8_t* cgen_var_1_ptr = (uint8_t*)(*readStreamPtrPtr);
                     *readStreamPtrPtr += 8 * ((descriptorPoolCount));
-                    for (uint32_t k = 0; k < ((descriptorPoolCount)); ++k)
-                    {
-                        uint64_t tmpval; memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
-                        *(((VkDescriptorPool*)pDescriptorPools) + k) = (VkDescriptorPool)unbox_VkDescriptorPool((VkDescriptorPool)tmpval);
+                    for (uint32_t k = 0; k < ((descriptorPoolCount)); ++k) {
+                        uint64_t tmpval;
+                        memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
+                        *(((VkDescriptorPool*)pDescriptorPools) + k) =
+                            (VkDescriptorPool)unbox_VkDescriptorPool((VkDescriptorPool)tmpval);
                     }
                 }
                 memcpy((uint32_t*)&descriptorSetCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pSetLayouts, ((descriptorSetCount)) * sizeof(const VkDescriptorSetLayout));
-                if (((descriptorSetCount)))
-                {
+                vkReadStream->alloc((void**)&pSetLayouts,
+                                    ((descriptorSetCount)) * sizeof(const VkDescriptorSetLayout));
+                if (((descriptorSetCount))) {
                     uint8_t* cgen_var_2_ptr = (uint8_t*)(*readStreamPtrPtr);
                     *readStreamPtrPtr += 8 * ((descriptorSetCount));
-                    for (uint32_t k = 0; k < ((descriptorSetCount)); ++k)
-                    {
-                        uint64_t tmpval; memcpy(&tmpval, cgen_var_2_ptr + k * 8, sizeof(uint64_t));
-                        *(((VkDescriptorSetLayout*)pSetLayouts) + k) = (VkDescriptorSetLayout)unbox_VkDescriptorSetLayout((VkDescriptorSetLayout)tmpval);
+                    for (uint32_t k = 0; k < ((descriptorSetCount)); ++k) {
+                        uint64_t tmpval;
+                        memcpy(&tmpval, cgen_var_2_ptr + k * 8, sizeof(uint64_t));
+                        *(((VkDescriptorSetLayout*)pSetLayouts) + k) =
+                            (VkDescriptorSetLayout)unbox_VkDescriptorSetLayout(
+                                (VkDescriptorSetLayout)tmpval);
                     }
                 }
-                vkReadStream->alloc((void**)&pDescriptorSetPoolIds, ((descriptorSetCount)) * sizeof(const uint64_t));
-                memcpy((uint64_t*)pDescriptorSetPoolIds, *readStreamPtrPtr, ((descriptorSetCount)) * sizeof(const uint64_t));
+                vkReadStream->alloc((void**)&pDescriptorSetPoolIds,
+                                    ((descriptorSetCount)) * sizeof(const uint64_t));
+                memcpy((uint64_t*)pDescriptorSetPoolIds, *readStreamPtrPtr,
+                       ((descriptorSetCount)) * sizeof(const uint64_t));
                 *readStreamPtrPtr += ((descriptorSetCount)) * sizeof(const uint64_t);
-                vkReadStream->alloc((void**)&pDescriptorSetWhichPool, ((descriptorSetCount)) * sizeof(const uint32_t));
-                memcpy((uint32_t*)pDescriptorSetWhichPool, *readStreamPtrPtr, ((descriptorSetCount)) * sizeof(const uint32_t));
+                vkReadStream->alloc((void**)&pDescriptorSetWhichPool,
+                                    ((descriptorSetCount)) * sizeof(const uint32_t));
+                memcpy((uint32_t*)pDescriptorSetWhichPool, *readStreamPtrPtr,
+                       ((descriptorSetCount)) * sizeof(const uint32_t));
                 *readStreamPtrPtr += ((descriptorSetCount)) * sizeof(const uint32_t);
-                vkReadStream->alloc((void**)&pDescriptorSetPendingAllocation, ((descriptorSetCount)) * sizeof(const uint32_t));
-                memcpy((uint32_t*)pDescriptorSetPendingAllocation, *readStreamPtrPtr, ((descriptorSetCount)) * sizeof(const uint32_t));
+                vkReadStream->alloc((void**)&pDescriptorSetPendingAllocation,
+                                    ((descriptorSetCount)) * sizeof(const uint32_t));
+                memcpy((uint32_t*)pDescriptorSetPendingAllocation, *readStreamPtrPtr,
+                       ((descriptorSetCount)) * sizeof(const uint32_t));
                 *readStreamPtrPtr += ((descriptorSetCount)) * sizeof(const uint32_t);
-                vkReadStream->alloc((void**)&pDescriptorWriteStartingIndices, ((descriptorSetCount)) * sizeof(const uint32_t));
-                memcpy((uint32_t*)pDescriptorWriteStartingIndices, *readStreamPtrPtr, ((descriptorSetCount)) * sizeof(const uint32_t));
+                vkReadStream->alloc((void**)&pDescriptorWriteStartingIndices,
+                                    ((descriptorSetCount)) * sizeof(const uint32_t));
+                memcpy((uint32_t*)pDescriptorWriteStartingIndices, *readStreamPtrPtr,
+                       ((descriptorSetCount)) * sizeof(const uint32_t));
                 *readStreamPtrPtr += ((descriptorSetCount)) * sizeof(const uint32_t);
-                memcpy((uint32_t*)&pendingDescriptorWriteCount, *readStreamPtrPtr, sizeof(uint32_t));
+                memcpy((uint32_t*)&pendingDescriptorWriteCount, *readStreamPtrPtr,
+                       sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pPendingDescriptorWrites, ((pendingDescriptorWriteCount)) * sizeof(const VkWriteDescriptorSet));
-                for (uint32_t i = 0; i < (uint32_t)((pendingDescriptorWriteCount)); ++i)
-                {
-                    reservedunmarshal_VkWriteDescriptorSet(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkWriteDescriptorSet*)(pPendingDescriptorWrites + i), readStreamPtrPtr);
+                vkReadStream->alloc(
+                    (void**)&pPendingDescriptorWrites,
+                    ((pendingDescriptorWriteCount)) * sizeof(const VkWriteDescriptorSet));
+                for (uint32_t i = 0; i < (uint32_t)((pendingDescriptorWriteCount)); ++i) {
+                    reservedunmarshal_VkWriteDescriptorSet(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkWriteDescriptorSet*)(pPendingDescriptorWrites + i), readStreamPtrPtr);
                 }
-                if (pPendingDescriptorWrites)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((pendingDescriptorWriteCount)); ++i)
-                    {
-                        transform_tohost_VkWriteDescriptorSet(m_state, (VkWriteDescriptorSet*)(pPendingDescriptorWrites + i));
+                if (pPendingDescriptorWrites) {
+                    for (uint32_t i = 0; i < (uint32_t)((pendingDescriptorWriteCount)); ++i) {
+                        transform_tohost_VkWriteDescriptorSet(
+                            m_state, (VkWriteDescriptorSet*)(pPendingDescriptorWrites + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkQueueCommitDescriptorSetUpdatesGOOGLE 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)queue, (unsigned long long)descriptorPoolCount, (unsigned long long)pDescriptorPools, (unsigned long long)descriptorSetCount, (unsigned long long)pSetLayouts, (unsigned long long)pDescriptorSetPoolIds, (unsigned long long)pDescriptorSetWhichPool, (unsigned long long)pDescriptorSetPendingAllocation, (unsigned long long)pDescriptorWriteStartingIndices, (unsigned long long)pendingDescriptorWriteCount, (unsigned long long)pPendingDescriptorWrites);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkQueueCommitDescriptorSetUpdatesGOOGLE 0x%llx 0x%llx "
+                            "0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)queue,
+                            (unsigned long long)descriptorPoolCount,
+                            (unsigned long long)pDescriptorPools,
+                            (unsigned long long)descriptorSetCount, (unsigned long long)pSetLayouts,
+                            (unsigned long long)pDescriptorSetPoolIds,
+                            (unsigned long long)pDescriptorSetWhichPool,
+                            (unsigned long long)pDescriptorSetPendingAllocation,
+                            (unsigned long long)pDescriptorWriteStartingIndices,
+                            (unsigned long long)pendingDescriptorWriteCount,
+                            (unsigned long long)pPendingDescriptorWrites);
                 }
-                m_state->on_vkQueueCommitDescriptorSetUpdatesGOOGLE(&m_pool, queue, descriptorPoolCount, pDescriptorPools, descriptorSetCount, pSetLayouts, pDescriptorSetPoolIds, pDescriptorSetWhichPool, pDescriptorSetPendingAllocation, pDescriptorWriteStartingIndices, pendingDescriptorWriteCount, pPendingDescriptorWrites);
+                m_state->on_vkQueueCommitDescriptorSetUpdatesGOOGLE(
+                    &m_pool, queue, descriptorPoolCount, pDescriptorPools, descriptorSetCount,
+                    pSetLayouts, pDescriptorSetPoolIds, pDescriptorSetWhichPool,
+                    pDescriptorSetPendingAllocation, pDescriptorWriteStartingIndices,
+                    pendingDescriptorWriteCount, pPendingDescriptorWrites);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkQueueCommitDescriptorSetUpdatesGOOGLE(snapshotTraceBegin, snapshotTraceBytes, &m_pool, queue, descriptorPoolCount, pDescriptorPools, descriptorSetCount, pSetLayouts, pDescriptorSetPoolIds, pDescriptorSetWhichPool, pDescriptorSetPendingAllocation, pDescriptorWriteStartingIndices, pendingDescriptorWriteCount, pPendingDescriptorWrites);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkQueueCommitDescriptorSetUpdatesGOOGLE(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, queue, descriptorPoolCount,
+                        pDescriptorPools, descriptorSetCount, pSetLayouts, pDescriptorSetPoolIds,
+                        pDescriptorSetWhichPool, pDescriptorSetPendingAllocation,
+                        pDescriptorWriteStartingIndices, pendingDescriptorWriteCount,
+                        pPendingDescriptorWrites);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCollectDescriptorPoolIdsGOOGLE:
-            {
+            case OP_vkCollectDescriptorPoolIdsGOOGLE: {
                 android::base::beginTrace("vkCollectDescriptorPoolIdsGOOGLE decode");
                 VkDevice device;
                 VkDescriptorPool descriptorPool;
@@ -27691,7 +32328,8 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDescriptorPool*)&descriptorPool = (VkDescriptorPool)unbox_VkDescriptorPool((VkDescriptorPool)(*&cgen_var_1));
+                *(VkDescriptorPool*)&descriptorPool =
+                    (VkDescriptorPool)unbox_VkDescriptorPool((VkDescriptorPool)(*&cgen_var_1));
                 // Begin manual dispatchable handle unboxing for pPoolIdCount;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pPoolIdCount, sizeof(uint32_t));
@@ -27703,40 +32341,46 @@
                 memcpy((uint64_t**)&pPoolIds, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pPoolIds);
                 *readStreamPtrPtr += 8;
-                if (pPoolIds)
-                {
+                if (pPoolIds) {
                     vkReadStream->alloc((void**)&pPoolIds, (*(pPoolIdCount)) * sizeof(uint64_t));
-                    memcpy((uint64_t*)pPoolIds, *readStreamPtrPtr, (*(pPoolIdCount)) * sizeof(uint64_t));
+                    memcpy((uint64_t*)pPoolIds, *readStreamPtrPtr,
+                           (*(pPoolIdCount)) * sizeof(uint64_t));
                     *readStreamPtrPtr += (*(pPoolIdCount)) * sizeof(uint64_t);
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCollectDescriptorPoolIdsGOOGLE 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)descriptorPool, (unsigned long long)pPoolIdCount, (unsigned long long)pPoolIds);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCollectDescriptorPoolIdsGOOGLE 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)device,
+                            (unsigned long long)descriptorPool, (unsigned long long)pPoolIdCount,
+                            (unsigned long long)pPoolIds);
                 }
-                m_state->on_vkCollectDescriptorPoolIdsGOOGLE(&m_pool, device, descriptorPool, pPoolIdCount, pPoolIds);
+                m_state->on_vkCollectDescriptorPoolIdsGOOGLE(&m_pool, device, descriptorPool,
+                                                             pPoolIdCount, pPoolIds);
                 vkStream->unsetHandleMapping();
                 vkStream->write((uint32_t*)pPoolIdCount, sizeof(uint32_t));
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pPoolIds;
                 vkStream->putBe64(cgen_var_3);
-                if (pPoolIds)
-                {
+                if (pPoolIds) {
                     vkStream->write((uint64_t*)pPoolIds, (*(pPoolIdCount)) * sizeof(uint64_t));
                 }
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCollectDescriptorPoolIdsGOOGLE(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, descriptorPool, pPoolIdCount, pPoolIds);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCollectDescriptorPoolIdsGOOGLE(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, descriptorPool,
+                        pPoolIdCount, pPoolIds);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE:
-            {
+            case OP_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE: {
                 android::base::beginTrace("vkQueueSignalReleaseImageANDROIDAsyncGOOGLE decode");
                 VkQueue queue;
                 uint32_t waitSemaphoreCount;
@@ -27753,17 +32397,17 @@
                 memcpy((VkSemaphore**)&pWaitSemaphores, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pWaitSemaphores);
                 *readStreamPtrPtr += 8;
-                if (pWaitSemaphores)
-                {
-                    vkReadStream->alloc((void**)&pWaitSemaphores, ((waitSemaphoreCount)) * sizeof(const VkSemaphore));
-                    if (((waitSemaphoreCount)))
-                    {
+                if (pWaitSemaphores) {
+                    vkReadStream->alloc((void**)&pWaitSemaphores,
+                                        ((waitSemaphoreCount)) * sizeof(const VkSemaphore));
+                    if (((waitSemaphoreCount))) {
                         uint8_t* cgen_var_1_0_ptr = (uint8_t*)(*readStreamPtrPtr);
                         *readStreamPtrPtr += 8 * ((waitSemaphoreCount));
-                        for (uint32_t k = 0; k < ((waitSemaphoreCount)); ++k)
-                        {
-                            uint64_t tmpval; memcpy(&tmpval, cgen_var_1_0_ptr + k * 8, sizeof(uint64_t));
-                            *(((VkSemaphore*)pWaitSemaphores) + k) = (VkSemaphore)unbox_VkSemaphore((VkSemaphore)tmpval);
+                        for (uint32_t k = 0; k < ((waitSemaphoreCount)); ++k) {
+                            uint64_t tmpval;
+                            memcpy(&tmpval, cgen_var_1_0_ptr + k * 8, sizeof(uint64_t));
+                            *(((VkSemaphore*)pWaitSemaphores) + k) =
+                                (VkSemaphore)unbox_VkSemaphore((VkSemaphore)tmpval);
                         }
                     }
                 }
@@ -27771,20 +32415,28 @@
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkImage*)&image = (VkImage)unbox_VkImage((VkImage)(*&cgen_var_2));
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkQueueSignalReleaseImageANDROIDAsyncGOOGLE 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)queue, (unsigned long long)waitSemaphoreCount, (unsigned long long)pWaitSemaphores, (unsigned long long)image);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkQueueSignalReleaseImageANDROIDAsyncGOOGLE 0x%llx "
+                            "0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)queue,
+                            (unsigned long long)waitSemaphoreCount,
+                            (unsigned long long)pWaitSemaphores, (unsigned long long)image);
                 }
-                m_state->on_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE(&m_pool, queue, waitSemaphoreCount, pWaitSemaphores, image);
+                m_state->on_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE(
+                    &m_pool, queue, waitSemaphoreCount, pWaitSemaphores, image);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkQueueSignalReleaseImageANDROIDAsyncGOOGLE(snapshotTraceBegin, snapshotTraceBytes, &m_pool, queue, waitSemaphoreCount, pWaitSemaphores, image);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkQueueSignalReleaseImageANDROIDAsyncGOOGLE(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, queue, waitSemaphoreCount,
+                        pWaitSemaphores, image);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -27792,8 +32444,7 @@
 #ifdef VK_EXT_global_priority_query
 #endif
 #ifdef VK_EXT_multi_draw
-            case OP_vkCmdDrawMultiEXT:
-            {
+            case OP_vkCmdDrawMultiEXT: {
                 android::base::beginTrace("vkCmdDrawMultiEXT decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t drawCount;
@@ -27805,7 +32456,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -27815,12 +32467,13 @@
                 memcpy((VkMultiDrawInfoEXT**)&pVertexInfo, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pVertexInfo);
                 *readStreamPtrPtr += 8;
-                if (pVertexInfo)
-                {
-                    vkReadStream->alloc((void**)&pVertexInfo, ((drawCount)) * sizeof(const VkMultiDrawInfoEXT));
-                    for (uint32_t i = 0; i < (uint32_t)((drawCount)); ++i)
-                    {
-                        reservedunmarshal_VkMultiDrawInfoEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMultiDrawInfoEXT*)(pVertexInfo + i), readStreamPtrPtr);
+                if (pVertexInfo) {
+                    vkReadStream->alloc((void**)&pVertexInfo,
+                                        ((drawCount)) * sizeof(const VkMultiDrawInfoEXT));
+                    for (uint32_t i = 0; i < (uint32_t)((drawCount)); ++i) {
+                        reservedunmarshal_VkMultiDrawInfoEXT(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkMultiDrawInfoEXT*)(pVertexInfo + i), readStreamPtrPtr);
                     }
                 }
                 memcpy((uint32_t*)&instanceCount, *readStreamPtrPtr, sizeof(uint32_t));
@@ -27829,32 +32482,39 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&stride, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (pVertexInfo)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((drawCount)); ++i)
-                    {
-                        transform_tohost_VkMultiDrawInfoEXT(m_state, (VkMultiDrawInfoEXT*)(pVertexInfo + i));
+                if (pVertexInfo) {
+                    for (uint32_t i = 0; i < (uint32_t)((drawCount)); ++i) {
+                        transform_tohost_VkMultiDrawInfoEXT(m_state,
+                                                            (VkMultiDrawInfoEXT*)(pVertexInfo + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdDrawMultiEXT 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)drawCount, (unsigned long long)pVertexInfo, (unsigned long long)instanceCount, (unsigned long long)firstInstance, (unsigned long long)stride);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdDrawMultiEXT 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)drawCount, (unsigned long long)pVertexInfo,
+                            (unsigned long long)instanceCount, (unsigned long long)firstInstance,
+                            (unsigned long long)stride);
                 }
-                vk->vkCmdDrawMultiEXT(unboxed_commandBuffer, drawCount, pVertexInfo, instanceCount, firstInstance, stride);
+                vk->vkCmdDrawMultiEXT(unboxed_commandBuffer, drawCount, pVertexInfo, instanceCount,
+                                      firstInstance, stride);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdDrawMultiEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, drawCount, pVertexInfo, instanceCount, firstInstance, stride);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdDrawMultiEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, drawCount,
+                        pVertexInfo, instanceCount, firstInstance, stride);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdDrawMultiIndexedEXT:
-            {
+            case OP_vkCmdDrawMultiIndexedEXT: {
                 android::base::beginTrace("vkCmdDrawMultiIndexedEXT decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t drawCount;
@@ -27867,7 +32527,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
@@ -27877,12 +32538,13 @@
                 memcpy((VkMultiDrawIndexedInfoEXT**)&pIndexInfo, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pIndexInfo);
                 *readStreamPtrPtr += 8;
-                if (pIndexInfo)
-                {
-                    vkReadStream->alloc((void**)&pIndexInfo, ((drawCount)) * sizeof(const VkMultiDrawIndexedInfoEXT));
-                    for (uint32_t i = 0; i < (uint32_t)((drawCount)); ++i)
-                    {
-                        reservedunmarshal_VkMultiDrawIndexedInfoEXT(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMultiDrawIndexedInfoEXT*)(pIndexInfo + i), readStreamPtrPtr);
+                if (pIndexInfo) {
+                    vkReadStream->alloc((void**)&pIndexInfo,
+                                        ((drawCount)) * sizeof(const VkMultiDrawIndexedInfoEXT));
+                    for (uint32_t i = 0; i < (uint32_t)((drawCount)); ++i) {
+                        reservedunmarshal_VkMultiDrawIndexedInfoEXT(
+                            vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkMultiDrawIndexedInfoEXT*)(pIndexInfo + i), readStreamPtrPtr);
                     }
                 }
                 memcpy((uint32_t*)&instanceCount, *readStreamPtrPtr, sizeof(uint32_t));
@@ -27895,33 +32557,40 @@
                 memcpy((int32_t**)&pVertexOffset, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pVertexOffset);
                 *readStreamPtrPtr += 8;
-                if (pVertexOffset)
-                {
+                if (pVertexOffset) {
                     vkReadStream->alloc((void**)&pVertexOffset, sizeof(const int32_t));
                     memcpy((int32_t*)pVertexOffset, *readStreamPtrPtr, sizeof(const int32_t));
                     *readStreamPtrPtr += sizeof(const int32_t);
                 }
-                if (pIndexInfo)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((drawCount)); ++i)
-                    {
-                        transform_tohost_VkMultiDrawIndexedInfoEXT(m_state, (VkMultiDrawIndexedInfoEXT*)(pIndexInfo + i));
+                if (pIndexInfo) {
+                    for (uint32_t i = 0; i < (uint32_t)((drawCount)); ++i) {
+                        transform_tohost_VkMultiDrawIndexedInfoEXT(
+                            m_state, (VkMultiDrawIndexedInfoEXT*)(pIndexInfo + i));
                     }
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdDrawMultiIndexedEXT 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)drawCount, (unsigned long long)pIndexInfo, (unsigned long long)instanceCount, (unsigned long long)firstInstance, (unsigned long long)stride, (unsigned long long)pVertexOffset);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdDrawMultiIndexedEXT 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)drawCount, (unsigned long long)pIndexInfo,
+                            (unsigned long long)instanceCount, (unsigned long long)firstInstance,
+                            (unsigned long long)stride, (unsigned long long)pVertexOffset);
                 }
-                vk->vkCmdDrawMultiIndexedEXT(unboxed_commandBuffer, drawCount, pIndexInfo, instanceCount, firstInstance, stride, pVertexOffset);
+                vk->vkCmdDrawMultiIndexedEXT(unboxed_commandBuffer, drawCount, pIndexInfo,
+                                             instanceCount, firstInstance, stride, pVertexOffset);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdDrawMultiIndexedEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, drawCount, pIndexInfo, instanceCount, firstInstance, stride, pVertexOffset);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdDrawMultiIndexedEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, drawCount,
+                        pIndexInfo, instanceCount, firstInstance, stride, pVertexOffset);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
@@ -27931,8 +32600,7 @@
 #ifdef VK_EXT_border_color_swizzle
 #endif
 #ifdef VK_EXT_pageable_device_local_memory
-            case OP_vkSetDeviceMemoryPriorityEXT:
-            {
+            case OP_vkSetDeviceMemoryPriorityEXT: {
                 android::base::beginTrace("vkSetDeviceMemoryPriorityEXT decode");
                 VkDevice device;
                 VkDeviceMemory memory;
@@ -27948,30 +32616,34 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDeviceMemory*)&memory = (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_1));
+                *(VkDeviceMemory*)&memory =
+                    (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_1));
                 memcpy((float*)&priority, *readStreamPtrPtr, sizeof(float));
                 *readStreamPtrPtr += sizeof(float);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkSetDeviceMemoryPriorityEXT 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)memory, (unsigned long long)priority);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkSetDeviceMemoryPriorityEXT 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)memory,
+                            (unsigned long long)priority);
                 }
                 vk->vkSetDeviceMemoryPriorityEXT(unboxed_device, memory, priority);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkSetDeviceMemoryPriorityEXT(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, memory, priority);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkSetDeviceMemoryPriorityEXT(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, memory, priority);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_KHR_acceleration_structure
-            case OP_vkCreateAccelerationStructureKHR:
-            {
+            case OP_vkCreateAccelerationStructureKHR: {
                 android::base::beginTrace("vkCreateAccelerationStructureKHR decode");
                 VkDevice device;
                 const VkAccelerationStructureCreateInfoKHR* pCreateInfo;
@@ -27985,63 +32657,85 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkAccelerationStructureCreateInfoKHR));
-                reservedunmarshal_VkAccelerationStructureCreateInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureCreateInfoKHR*)(pCreateInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pCreateInfo,
+                                    sizeof(const VkAccelerationStructureCreateInfoKHR));
+                reservedunmarshal_VkAccelerationStructureCreateInfoKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkAccelerationStructureCreateInfoKHR*)(pCreateInfo), readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pAccelerationStructure;
                 vkReadStream->unsetHandleMapping();
-                vkReadStream->alloc((void**)&pAccelerationStructure, sizeof(VkAccelerationStructureKHR));
+                vkReadStream->alloc((void**)&pAccelerationStructure,
+                                    sizeof(VkAccelerationStructureKHR));
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
-                *(VkAccelerationStructureKHR*)pAccelerationStructure = (VkAccelerationStructureKHR)(VkAccelerationStructureKHR)((VkAccelerationStructureKHR)(*&cgen_var_2));
-                if (pCreateInfo)
-                {
-                    transform_tohost_VkAccelerationStructureCreateInfoKHR(m_state, (VkAccelerationStructureCreateInfoKHR*)(pCreateInfo));
+                *(VkAccelerationStructureKHR*)pAccelerationStructure =
+                    (VkAccelerationStructureKHR)(VkAccelerationStructureKHR)((
+                        VkAccelerationStructureKHR)(*&cgen_var_2));
+                if (pCreateInfo) {
+                    transform_tohost_VkAccelerationStructureCreateInfoKHR(
+                        m_state, (VkAccelerationStructureCreateInfoKHR*)(pCreateInfo));
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateAccelerationStructureKHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo, (unsigned long long)pAllocator, (unsigned long long)pAccelerationStructure);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateAccelerationStructureKHR 0x%llx 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
+                            (unsigned long long)pAllocator,
+                            (unsigned long long)pAccelerationStructure);
                 }
                 VkResult vkCreateAccelerationStructureKHR_VkResult_return = (VkResult)0;
-                vkCreateAccelerationStructureKHR_VkResult_return = vk->vkCreateAccelerationStructureKHR(unboxed_device, pCreateInfo, pAllocator, pAccelerationStructure);
-                if ((vkCreateAccelerationStructureKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateAccelerationStructureKHR_VkResult_return =
+                    vk->vkCreateAccelerationStructureKHR(unboxed_device, pCreateInfo, pAllocator,
+                                                         pAccelerationStructure);
+                if ((vkCreateAccelerationStructureKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 // Begin auto non dispatchable handle create for pAccelerationStructure;
-                if (vkCreateAccelerationStructureKHR_VkResult_return == VK_SUCCESS) vkStream->setHandleMapping(&m_boxedHandleCreateMapping);
+                if (vkCreateAccelerationStructureKHR_VkResult_return == VK_SUCCESS)
+                    vkStream->setHandleMapping(&m_boxedHandleCreateMapping);
                 uint64_t cgen_var_3;
-                static_assert(8 == sizeof(VkAccelerationStructureKHR), "handle map overwrite requires VkAccelerationStructureKHR to be 8 bytes long");
-                vkStream->handleMapping()->mapHandles_VkAccelerationStructureKHR((VkAccelerationStructureKHR*)pAccelerationStructure, 1);
+                static_assert(
+                    8 == sizeof(VkAccelerationStructureKHR),
+                    "handle map overwrite requires VkAccelerationStructureKHR to be 8 bytes long");
+                vkStream->handleMapping()->mapHandles_VkAccelerationStructureKHR(
+                    (VkAccelerationStructureKHR*)pAccelerationStructure, 1);
                 vkStream->write((VkAccelerationStructureKHR*)pAccelerationStructure, 8 * 1);
                 // Begin auto non dispatchable handle create for pAccelerationStructure;
                 vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
-                vkStream->write(&vkCreateAccelerationStructureKHR_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkCreateAccelerationStructureKHR_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateAccelerationStructureKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateAccelerationStructureKHR_VkResult_return, device, pCreateInfo, pAllocator, pAccelerationStructure);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateAccelerationStructureKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateAccelerationStructureKHR_VkResult_return, device, pCreateInfo,
+                        pAllocator, pAccelerationStructure);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkDestroyAccelerationStructureKHR:
-            {
+            case OP_vkDestroyAccelerationStructureKHR: {
                 android::base::beginTrace("vkDestroyAccelerationStructureKHR decode");
                 VkDevice device;
                 VkAccelerationStructureKHR accelerationStructure;
@@ -28059,42 +32753,51 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkAccelerationStructureKHR*)&accelerationStructure = (VkAccelerationStructureKHR)(VkAccelerationStructureKHR)((VkAccelerationStructureKHR)(*&cgen_var_1));
+                *(VkAccelerationStructureKHR*)&accelerationStructure =
+                    (VkAccelerationStructureKHR)(VkAccelerationStructureKHR)((
+                        VkAccelerationStructureKHR)(*&cgen_var_1));
                 boxed_accelerationStructure_preserve = accelerationStructure;
                 accelerationStructure = unbox_VkAccelerationStructureKHR(accelerationStructure);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkDestroyAccelerationStructureKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)accelerationStructure, (unsigned long long)pAllocator);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkDestroyAccelerationStructureKHR 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device,
+                        (unsigned long long)accelerationStructure, (unsigned long long)pAllocator);
                 }
-                vk->vkDestroyAccelerationStructureKHR(unboxed_device, accelerationStructure, pAllocator);
+                vk->vkDestroyAccelerationStructureKHR(unboxed_device, accelerationStructure,
+                                                      pAllocator);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkDestroyAccelerationStructureKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, boxed_accelerationStructure_preserve, pAllocator);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkDestroyAccelerationStructureKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device,
+                        boxed_accelerationStructure_preserve, pAllocator);
                 }
                 delete_VkAccelerationStructureKHR(boxed_accelerationStructure_preserve);
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdBuildAccelerationStructuresKHR:
-            {
+            case OP_vkCmdBuildAccelerationStructuresKHR: {
                 android::base::beginTrace("vkCmdBuildAccelerationStructuresKHR decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t infoCount;
@@ -28104,44 +32807,55 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 memcpy((uint32_t*)&infoCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pInfos, ((infoCount)) * sizeof(const VkAccelerationStructureBuildGeometryInfoKHR));
-                for (uint32_t i = 0; i < (uint32_t)((infoCount)); ++i)
-                {
-                    reservedunmarshal_VkAccelerationStructureBuildGeometryInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureBuildGeometryInfoKHR*)(pInfos + i), readStreamPtrPtr);
+                vkReadStream->alloc(
+                    (void**)&pInfos,
+                    ((infoCount)) * sizeof(const VkAccelerationStructureBuildGeometryInfoKHR));
+                for (uint32_t i = 0; i < (uint32_t)((infoCount)); ++i) {
+                    reservedunmarshal_VkAccelerationStructureBuildGeometryInfoKHR(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAccelerationStructureBuildGeometryInfoKHR*)(pInfos + i),
+                        readStreamPtrPtr);
                 }
-                if (pInfos)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((infoCount)); ++i)
-                    {
-                        transform_tohost_VkAccelerationStructureBuildGeometryInfoKHR(m_state, (VkAccelerationStructureBuildGeometryInfoKHR*)(pInfos + i));
+                if (pInfos) {
+                    for (uint32_t i = 0; i < (uint32_t)((infoCount)); ++i) {
+                        transform_tohost_VkAccelerationStructureBuildGeometryInfoKHR(
+                            m_state, (VkAccelerationStructureBuildGeometryInfoKHR*)(pInfos + i));
                     }
                 }
                 (void)ppBuildRangeInfos;
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdBuildAccelerationStructuresKHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)infoCount, (unsigned long long)pInfos, (unsigned long long)ppBuildRangeInfos);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdBuildAccelerationStructuresKHR 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)infoCount, (unsigned long long)pInfos,
+                            (unsigned long long)ppBuildRangeInfos);
                 }
-                vk->vkCmdBuildAccelerationStructuresKHR(unboxed_commandBuffer, infoCount, pInfos, ppBuildRangeInfos);
+                vk->vkCmdBuildAccelerationStructuresKHR(unboxed_commandBuffer, infoCount, pInfos,
+                                                        ppBuildRangeInfos);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdBuildAccelerationStructuresKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, infoCount, pInfos, ppBuildRangeInfos);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdBuildAccelerationStructuresKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, infoCount,
+                        pInfos, ppBuildRangeInfos);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdBuildAccelerationStructuresIndirectKHR:
-            {
+            case OP_vkCmdBuildAccelerationStructuresIndirectKHR: {
                 android::base::beginTrace("vkCmdBuildAccelerationStructuresIndirectKHR decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t infoCount;
@@ -28153,50 +32867,68 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 memcpy((uint32_t*)&infoCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pInfos, ((infoCount)) * sizeof(const VkAccelerationStructureBuildGeometryInfoKHR));
-                for (uint32_t i = 0; i < (uint32_t)((infoCount)); ++i)
-                {
-                    reservedunmarshal_VkAccelerationStructureBuildGeometryInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureBuildGeometryInfoKHR*)(pInfos + i), readStreamPtrPtr);
+                vkReadStream->alloc(
+                    (void**)&pInfos,
+                    ((infoCount)) * sizeof(const VkAccelerationStructureBuildGeometryInfoKHR));
+                for (uint32_t i = 0; i < (uint32_t)((infoCount)); ++i) {
+                    reservedunmarshal_VkAccelerationStructureBuildGeometryInfoKHR(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAccelerationStructureBuildGeometryInfoKHR*)(pInfos + i),
+                        readStreamPtrPtr);
                 }
-                vkReadStream->alloc((void**)&pIndirectDeviceAddresses, ((infoCount)) * sizeof(const VkDeviceAddress));
-                memcpy((VkDeviceAddress*)pIndirectDeviceAddresses, *readStreamPtrPtr, ((infoCount)) * sizeof(const VkDeviceAddress));
+                vkReadStream->alloc((void**)&pIndirectDeviceAddresses,
+                                    ((infoCount)) * sizeof(const VkDeviceAddress));
+                memcpy((VkDeviceAddress*)pIndirectDeviceAddresses, *readStreamPtrPtr,
+                       ((infoCount)) * sizeof(const VkDeviceAddress));
                 *readStreamPtrPtr += ((infoCount)) * sizeof(const VkDeviceAddress);
-                vkReadStream->alloc((void**)&pIndirectStrides, ((infoCount)) * sizeof(const uint32_t));
-                memcpy((uint32_t*)pIndirectStrides, *readStreamPtrPtr, ((infoCount)) * sizeof(const uint32_t));
+                vkReadStream->alloc((void**)&pIndirectStrides,
+                                    ((infoCount)) * sizeof(const uint32_t));
+                memcpy((uint32_t*)pIndirectStrides, *readStreamPtrPtr,
+                       ((infoCount)) * sizeof(const uint32_t));
                 *readStreamPtrPtr += ((infoCount)) * sizeof(const uint32_t);
-                if (pInfos)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((infoCount)); ++i)
-                    {
-                        transform_tohost_VkAccelerationStructureBuildGeometryInfoKHR(m_state, (VkAccelerationStructureBuildGeometryInfoKHR*)(pInfos + i));
+                if (pInfos) {
+                    for (uint32_t i = 0; i < (uint32_t)((infoCount)); ++i) {
+                        transform_tohost_VkAccelerationStructureBuildGeometryInfoKHR(
+                            m_state, (VkAccelerationStructureBuildGeometryInfoKHR*)(pInfos + i));
                     }
                 }
                 (void)ppMaxPrimitiveCounts;
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdBuildAccelerationStructuresIndirectKHR 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)infoCount, (unsigned long long)pInfos, (unsigned long long)pIndirectDeviceAddresses, (unsigned long long)pIndirectStrides, (unsigned long long)ppMaxPrimitiveCounts);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdBuildAccelerationStructuresIndirectKHR 0x%llx "
+                            "0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)infoCount, (unsigned long long)pInfos,
+                            (unsigned long long)pIndirectDeviceAddresses,
+                            (unsigned long long)pIndirectStrides,
+                            (unsigned long long)ppMaxPrimitiveCounts);
                 }
-                vk->vkCmdBuildAccelerationStructuresIndirectKHR(unboxed_commandBuffer, infoCount, pInfos, pIndirectDeviceAddresses, pIndirectStrides, ppMaxPrimitiveCounts);
+                vk->vkCmdBuildAccelerationStructuresIndirectKHR(
+                    unboxed_commandBuffer, infoCount, pInfos, pIndirectDeviceAddresses,
+                    pIndirectStrides, ppMaxPrimitiveCounts);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdBuildAccelerationStructuresIndirectKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, infoCount, pInfos, pIndirectDeviceAddresses, pIndirectStrides, ppMaxPrimitiveCounts);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdBuildAccelerationStructuresIndirectKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, infoCount,
+                        pInfos, pIndirectDeviceAddresses, pIndirectStrides, ppMaxPrimitiveCounts);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkBuildAccelerationStructuresKHR:
-            {
+            case OP_vkBuildAccelerationStructuresKHR: {
                 android::base::beginTrace("vkBuildAccelerationStructuresKHR decode");
                 VkDevice device;
                 VkDeferredOperationKHR deferredOperation;
@@ -28216,42 +32948,56 @@
                 *readStreamPtrPtr += 8;
                 memcpy((uint32_t*)&infoCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pInfos, ((infoCount)) * sizeof(const VkAccelerationStructureBuildGeometryInfoKHR));
-                for (uint32_t i = 0; i < (uint32_t)((infoCount)); ++i)
-                {
-                    reservedunmarshal_VkAccelerationStructureBuildGeometryInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureBuildGeometryInfoKHR*)(pInfos + i), readStreamPtrPtr);
+                vkReadStream->alloc(
+                    (void**)&pInfos,
+                    ((infoCount)) * sizeof(const VkAccelerationStructureBuildGeometryInfoKHR));
+                for (uint32_t i = 0; i < (uint32_t)((infoCount)); ++i) {
+                    reservedunmarshal_VkAccelerationStructureBuildGeometryInfoKHR(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAccelerationStructureBuildGeometryInfoKHR*)(pInfos + i),
+                        readStreamPtrPtr);
                 }
-                if (pInfos)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((infoCount)); ++i)
-                    {
-                        transform_tohost_VkAccelerationStructureBuildGeometryInfoKHR(m_state, (VkAccelerationStructureBuildGeometryInfoKHR*)(pInfos + i));
+                if (pInfos) {
+                    for (uint32_t i = 0; i < (uint32_t)((infoCount)); ++i) {
+                        transform_tohost_VkAccelerationStructureBuildGeometryInfoKHR(
+                            m_state, (VkAccelerationStructureBuildGeometryInfoKHR*)(pInfos + i));
                     }
                 }
                 (void)ppBuildRangeInfos;
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkBuildAccelerationStructuresKHR 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)deferredOperation, (unsigned long long)infoCount, (unsigned long long)pInfos, (unsigned long long)ppBuildRangeInfos);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkBuildAccelerationStructuresKHR 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device,
+                            (unsigned long long)deferredOperation, (unsigned long long)infoCount,
+                            (unsigned long long)pInfos, (unsigned long long)ppBuildRangeInfos);
                 }
                 VkResult vkBuildAccelerationStructuresKHR_VkResult_return = (VkResult)0;
-                vkBuildAccelerationStructuresKHR_VkResult_return = vk->vkBuildAccelerationStructuresKHR(unboxed_device, deferredOperation, infoCount, pInfos, ppBuildRangeInfos);
-                if ((vkBuildAccelerationStructuresKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkBuildAccelerationStructuresKHR_VkResult_return =
+                    vk->vkBuildAccelerationStructuresKHR(unboxed_device, deferredOperation,
+                                                         infoCount, pInfos, ppBuildRangeInfos);
+                if ((vkBuildAccelerationStructuresKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                vkStream->write(&vkBuildAccelerationStructuresKHR_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkBuildAccelerationStructuresKHR_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkBuildAccelerationStructuresKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkBuildAccelerationStructuresKHR_VkResult_return, device, deferredOperation, infoCount, pInfos, ppBuildRangeInfos);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkBuildAccelerationStructuresKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkBuildAccelerationStructuresKHR_VkResult_return, device, deferredOperation,
+                        infoCount, pInfos, ppBuildRangeInfos);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCopyAccelerationStructureKHR:
-            {
+            case OP_vkCopyAccelerationStructureKHR: {
                 android::base::beginTrace("vkCopyAccelerationStructureKHR decode");
                 VkDevice device;
                 VkDeferredOperationKHR deferredOperation;
@@ -28267,35 +33013,46 @@
                 memcpy((VkDeferredOperationKHR*)&deferredOperation, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&deferredOperation);
                 *readStreamPtrPtr += 8;
-                vkReadStream->alloc((void**)&pInfo, sizeof(const VkCopyAccelerationStructureInfoKHR));
-                reservedunmarshal_VkCopyAccelerationStructureInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyAccelerationStructureInfoKHR*)(pInfo), readStreamPtrPtr);
-                if (pInfo)
-                {
-                    transform_tohost_VkCopyAccelerationStructureInfoKHR(m_state, (VkCopyAccelerationStructureInfoKHR*)(pInfo));
+                vkReadStream->alloc((void**)&pInfo,
+                                    sizeof(const VkCopyAccelerationStructureInfoKHR));
+                reservedunmarshal_VkCopyAccelerationStructureInfoKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkCopyAccelerationStructureInfoKHR*)(pInfo), readStreamPtrPtr);
+                if (pInfo) {
+                    transform_tohost_VkCopyAccelerationStructureInfoKHR(
+                        m_state, (VkCopyAccelerationStructureInfoKHR*)(pInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCopyAccelerationStructureKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)deferredOperation, (unsigned long long)pInfo);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkCopyAccelerationStructureKHR 0x%llx 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)device, (unsigned long long)deferredOperation,
+                        (unsigned long long)pInfo);
                 }
                 VkResult vkCopyAccelerationStructureKHR_VkResult_return = (VkResult)0;
-                vkCopyAccelerationStructureKHR_VkResult_return = vk->vkCopyAccelerationStructureKHR(unboxed_device, deferredOperation, pInfo);
-                if ((vkCopyAccelerationStructureKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCopyAccelerationStructureKHR_VkResult_return =
+                    vk->vkCopyAccelerationStructureKHR(unboxed_device, deferredOperation, pInfo);
+                if ((vkCopyAccelerationStructureKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkCopyAccelerationStructureKHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCopyAccelerationStructureKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCopyAccelerationStructureKHR_VkResult_return, device, deferredOperation, pInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCopyAccelerationStructureKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCopyAccelerationStructureKHR_VkResult_return, device, deferredOperation,
+                        pInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCopyAccelerationStructureToMemoryKHR:
-            {
+            case OP_vkCopyAccelerationStructureToMemoryKHR: {
                 android::base::beginTrace("vkCopyAccelerationStructureToMemoryKHR decode");
                 VkDevice device;
                 VkDeferredOperationKHR deferredOperation;
@@ -28311,35 +33068,49 @@
                 memcpy((VkDeferredOperationKHR*)&deferredOperation, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&deferredOperation);
                 *readStreamPtrPtr += 8;
-                vkReadStream->alloc((void**)&pInfo, sizeof(const VkCopyAccelerationStructureToMemoryInfoKHR));
-                reservedunmarshal_VkCopyAccelerationStructureToMemoryInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyAccelerationStructureToMemoryInfoKHR*)(pInfo), readStreamPtrPtr);
-                if (pInfo)
-                {
-                    transform_tohost_VkCopyAccelerationStructureToMemoryInfoKHR(m_state, (VkCopyAccelerationStructureToMemoryInfoKHR*)(pInfo));
+                vkReadStream->alloc((void**)&pInfo,
+                                    sizeof(const VkCopyAccelerationStructureToMemoryInfoKHR));
+                reservedunmarshal_VkCopyAccelerationStructureToMemoryInfoKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkCopyAccelerationStructureToMemoryInfoKHR*)(pInfo), readStreamPtrPtr);
+                if (pInfo) {
+                    transform_tohost_VkCopyAccelerationStructureToMemoryInfoKHR(
+                        m_state, (VkCopyAccelerationStructureToMemoryInfoKHR*)(pInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCopyAccelerationStructureToMemoryKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)deferredOperation, (unsigned long long)pInfo);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCopyAccelerationStructureToMemoryKHR 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)device,
+                            (unsigned long long)deferredOperation, (unsigned long long)pInfo);
                 }
                 VkResult vkCopyAccelerationStructureToMemoryKHR_VkResult_return = (VkResult)0;
-                vkCopyAccelerationStructureToMemoryKHR_VkResult_return = vk->vkCopyAccelerationStructureToMemoryKHR(unboxed_device, deferredOperation, pInfo);
-                if ((vkCopyAccelerationStructureToMemoryKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCopyAccelerationStructureToMemoryKHR_VkResult_return =
+                    vk->vkCopyAccelerationStructureToMemoryKHR(unboxed_device, deferredOperation,
+                                                               pInfo);
+                if ((vkCopyAccelerationStructureToMemoryKHR_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                vkStream->write(&vkCopyAccelerationStructureToMemoryKHR_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkCopyAccelerationStructureToMemoryKHR_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCopyAccelerationStructureToMemoryKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCopyAccelerationStructureToMemoryKHR_VkResult_return, device, deferredOperation, pInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCopyAccelerationStructureToMemoryKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCopyAccelerationStructureToMemoryKHR_VkResult_return, device,
+                        deferredOperation, pInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCopyMemoryToAccelerationStructureKHR:
-            {
+            case OP_vkCopyMemoryToAccelerationStructureKHR: {
                 android::base::beginTrace("vkCopyMemoryToAccelerationStructureKHR decode");
                 VkDevice device;
                 VkDeferredOperationKHR deferredOperation;
@@ -28355,35 +33126,49 @@
                 memcpy((VkDeferredOperationKHR*)&deferredOperation, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&deferredOperation);
                 *readStreamPtrPtr += 8;
-                vkReadStream->alloc((void**)&pInfo, sizeof(const VkCopyMemoryToAccelerationStructureInfoKHR));
-                reservedunmarshal_VkCopyMemoryToAccelerationStructureInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyMemoryToAccelerationStructureInfoKHR*)(pInfo), readStreamPtrPtr);
-                if (pInfo)
-                {
-                    transform_tohost_VkCopyMemoryToAccelerationStructureInfoKHR(m_state, (VkCopyMemoryToAccelerationStructureInfoKHR*)(pInfo));
+                vkReadStream->alloc((void**)&pInfo,
+                                    sizeof(const VkCopyMemoryToAccelerationStructureInfoKHR));
+                reservedunmarshal_VkCopyMemoryToAccelerationStructureInfoKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkCopyMemoryToAccelerationStructureInfoKHR*)(pInfo), readStreamPtrPtr);
+                if (pInfo) {
+                    transform_tohost_VkCopyMemoryToAccelerationStructureInfoKHR(
+                        m_state, (VkCopyMemoryToAccelerationStructureInfoKHR*)(pInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCopyMemoryToAccelerationStructureKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)deferredOperation, (unsigned long long)pInfo);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCopyMemoryToAccelerationStructureKHR 0x%llx 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)device,
+                            (unsigned long long)deferredOperation, (unsigned long long)pInfo);
                 }
                 VkResult vkCopyMemoryToAccelerationStructureKHR_VkResult_return = (VkResult)0;
-                vkCopyMemoryToAccelerationStructureKHR_VkResult_return = vk->vkCopyMemoryToAccelerationStructureKHR(unboxed_device, deferredOperation, pInfo);
-                if ((vkCopyMemoryToAccelerationStructureKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCopyMemoryToAccelerationStructureKHR_VkResult_return =
+                    vk->vkCopyMemoryToAccelerationStructureKHR(unboxed_device, deferredOperation,
+                                                               pInfo);
+                if ((vkCopyMemoryToAccelerationStructureKHR_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                vkStream->write(&vkCopyMemoryToAccelerationStructureKHR_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkCopyMemoryToAccelerationStructureKHR_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCopyMemoryToAccelerationStructureKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCopyMemoryToAccelerationStructureKHR_VkResult_return, device, deferredOperation, pInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCopyMemoryToAccelerationStructureKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCopyMemoryToAccelerationStructureKHR_VkResult_return, device,
+                        deferredOperation, pInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkWriteAccelerationStructuresPropertiesKHR:
-            {
+            case OP_vkWriteAccelerationStructuresPropertiesKHR: {
                 android::base::beginTrace("vkWriteAccelerationStructuresPropertiesKHR decode");
                 VkDevice device;
                 uint32_t accelerationStructureCount;
@@ -28402,15 +33187,18 @@
                 // End manual dispatchable handle unboxing for device;
                 memcpy((uint32_t*)&accelerationStructureCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pAccelerationStructures, ((accelerationStructureCount)) * sizeof(const VkAccelerationStructureKHR));
-                if (((accelerationStructureCount)))
-                {
+                vkReadStream->alloc(
+                    (void**)&pAccelerationStructures,
+                    ((accelerationStructureCount)) * sizeof(const VkAccelerationStructureKHR));
+                if (((accelerationStructureCount))) {
                     uint8_t* cgen_var_1_ptr = (uint8_t*)(*readStreamPtrPtr);
                     *readStreamPtrPtr += 8 * ((accelerationStructureCount));
-                    for (uint32_t k = 0; k < ((accelerationStructureCount)); ++k)
-                    {
-                        uint64_t tmpval; memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
-                        *(((VkAccelerationStructureKHR*)pAccelerationStructures) + k) = (VkAccelerationStructureKHR)unbox_VkAccelerationStructureKHR((VkAccelerationStructureKHR)tmpval);
+                    for (uint32_t k = 0; k < ((accelerationStructureCount)); ++k) {
+                        uint64_t tmpval;
+                        memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
+                        *(((VkAccelerationStructureKHR*)pAccelerationStructures) + k) =
+                            (VkAccelerationStructureKHR)unbox_VkAccelerationStructureKHR(
+                                (VkAccelerationStructureKHR)tmpval);
                     }
                 }
                 memcpy((VkQueryType*)&queryType, *readStreamPtrPtr, sizeof(VkQueryType));
@@ -28426,30 +33214,46 @@
                 memcpy((size_t*)&stride, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&stride);
                 *readStreamPtrPtr += 8;
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkWriteAccelerationStructuresPropertiesKHR 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)accelerationStructureCount, (unsigned long long)pAccelerationStructures, (unsigned long long)queryType, (unsigned long long)dataSize, (unsigned long long)pData, (unsigned long long)stride);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkWriteAccelerationStructuresPropertiesKHR 0x%llx "
+                            "0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device,
+                            (unsigned long long)accelerationStructureCount,
+                            (unsigned long long)pAccelerationStructures,
+                            (unsigned long long)queryType, (unsigned long long)dataSize,
+                            (unsigned long long)pData, (unsigned long long)stride);
                 }
                 VkResult vkWriteAccelerationStructuresPropertiesKHR_VkResult_return = (VkResult)0;
-                vkWriteAccelerationStructuresPropertiesKHR_VkResult_return = vk->vkWriteAccelerationStructuresPropertiesKHR(unboxed_device, accelerationStructureCount, pAccelerationStructures, queryType, dataSize, pData, stride);
-                if ((vkWriteAccelerationStructuresPropertiesKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkWriteAccelerationStructuresPropertiesKHR_VkResult_return =
+                    vk->vkWriteAccelerationStructuresPropertiesKHR(
+                        unboxed_device, accelerationStructureCount, pAccelerationStructures,
+                        queryType, dataSize, pData, stride);
+                if ((vkWriteAccelerationStructuresPropertiesKHR_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write((void*)pData, ((dataSize)) * sizeof(uint8_t));
-                vkStream->write(&vkWriteAccelerationStructuresPropertiesKHR_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkWriteAccelerationStructuresPropertiesKHR_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkWriteAccelerationStructuresPropertiesKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkWriteAccelerationStructuresPropertiesKHR_VkResult_return, device, accelerationStructureCount, pAccelerationStructures, queryType, dataSize, pData, stride);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkWriteAccelerationStructuresPropertiesKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkWriteAccelerationStructuresPropertiesKHR_VkResult_return, device,
+                        accelerationStructureCount, pAccelerationStructures, queryType, dataSize,
+                        pData, stride);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdCopyAccelerationStructureKHR:
-            {
+            case OP_vkCmdCopyAccelerationStructureKHR: {
                 android::base::beginTrace("vkCmdCopyAccelerationStructureKHR decode");
                 VkCommandBuffer commandBuffer;
                 const VkCopyAccelerationStructureInfoKHR* pInfo;
@@ -28457,35 +33261,41 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
-                vkReadStream->alloc((void**)&pInfo, sizeof(const VkCopyAccelerationStructureInfoKHR));
-                reservedunmarshal_VkCopyAccelerationStructureInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyAccelerationStructureInfoKHR*)(pInfo), readStreamPtrPtr);
-                if (pInfo)
-                {
-                    transform_tohost_VkCopyAccelerationStructureInfoKHR(m_state, (VkCopyAccelerationStructureInfoKHR*)(pInfo));
+                vkReadStream->alloc((void**)&pInfo,
+                                    sizeof(const VkCopyAccelerationStructureInfoKHR));
+                reservedunmarshal_VkCopyAccelerationStructureInfoKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkCopyAccelerationStructureInfoKHR*)(pInfo), readStreamPtrPtr);
+                if (pInfo) {
+                    transform_tohost_VkCopyAccelerationStructureInfoKHR(
+                        m_state, (VkCopyAccelerationStructureInfoKHR*)(pInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdCopyAccelerationStructureKHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pInfo);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdCopyAccelerationStructureKHR 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer, (unsigned long long)pInfo);
                 }
                 vk->vkCmdCopyAccelerationStructureKHR(unboxed_commandBuffer, pInfo);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdCopyAccelerationStructureKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdCopyAccelerationStructureKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdCopyAccelerationStructureToMemoryKHR:
-            {
+            case OP_vkCmdCopyAccelerationStructureToMemoryKHR: {
                 android::base::beginTrace("vkCmdCopyAccelerationStructureToMemoryKHR decode");
                 VkCommandBuffer commandBuffer;
                 const VkCopyAccelerationStructureToMemoryInfoKHR* pInfo;
@@ -28493,35 +33303,42 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
-                vkReadStream->alloc((void**)&pInfo, sizeof(const VkCopyAccelerationStructureToMemoryInfoKHR));
-                reservedunmarshal_VkCopyAccelerationStructureToMemoryInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyAccelerationStructureToMemoryInfoKHR*)(pInfo), readStreamPtrPtr);
-                if (pInfo)
-                {
-                    transform_tohost_VkCopyAccelerationStructureToMemoryInfoKHR(m_state, (VkCopyAccelerationStructureToMemoryInfoKHR*)(pInfo));
+                vkReadStream->alloc((void**)&pInfo,
+                                    sizeof(const VkCopyAccelerationStructureToMemoryInfoKHR));
+                reservedunmarshal_VkCopyAccelerationStructureToMemoryInfoKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkCopyAccelerationStructureToMemoryInfoKHR*)(pInfo), readStreamPtrPtr);
+                if (pInfo) {
+                    transform_tohost_VkCopyAccelerationStructureToMemoryInfoKHR(
+                        m_state, (VkCopyAccelerationStructureToMemoryInfoKHR*)(pInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdCopyAccelerationStructureToMemoryKHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pInfo);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdCopyAccelerationStructureToMemoryKHR 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer, (unsigned long long)pInfo);
                 }
                 vk->vkCmdCopyAccelerationStructureToMemoryKHR(unboxed_commandBuffer, pInfo);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdCopyAccelerationStructureToMemoryKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdCopyAccelerationStructureToMemoryKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdCopyMemoryToAccelerationStructureKHR:
-            {
+            case OP_vkCmdCopyMemoryToAccelerationStructureKHR: {
                 android::base::beginTrace("vkCmdCopyMemoryToAccelerationStructureKHR decode");
                 VkCommandBuffer commandBuffer;
                 const VkCopyMemoryToAccelerationStructureInfoKHR* pInfo;
@@ -28529,35 +33346,42 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
-                vkReadStream->alloc((void**)&pInfo, sizeof(const VkCopyMemoryToAccelerationStructureInfoKHR));
-                reservedunmarshal_VkCopyMemoryToAccelerationStructureInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyMemoryToAccelerationStructureInfoKHR*)(pInfo), readStreamPtrPtr);
-                if (pInfo)
-                {
-                    transform_tohost_VkCopyMemoryToAccelerationStructureInfoKHR(m_state, (VkCopyMemoryToAccelerationStructureInfoKHR*)(pInfo));
+                vkReadStream->alloc((void**)&pInfo,
+                                    sizeof(const VkCopyMemoryToAccelerationStructureInfoKHR));
+                reservedunmarshal_VkCopyMemoryToAccelerationStructureInfoKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkCopyMemoryToAccelerationStructureInfoKHR*)(pInfo), readStreamPtrPtr);
+                if (pInfo) {
+                    transform_tohost_VkCopyMemoryToAccelerationStructureInfoKHR(
+                        m_state, (VkCopyMemoryToAccelerationStructureInfoKHR*)(pInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdCopyMemoryToAccelerationStructureKHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pInfo);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdCopyMemoryToAccelerationStructureKHR 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer, (unsigned long long)pInfo);
                 }
                 vk->vkCmdCopyMemoryToAccelerationStructureKHR(unboxed_commandBuffer, pInfo);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdCopyMemoryToAccelerationStructureKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdCopyMemoryToAccelerationStructureKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetAccelerationStructureDeviceAddressKHR:
-            {
+            case OP_vkGetAccelerationStructureDeviceAddressKHR: {
                 android::base::beginTrace("vkGetAccelerationStructureDeviceAddressKHR decode");
                 VkDevice device;
                 const VkAccelerationStructureDeviceAddressInfoKHR* pInfo;
@@ -28569,34 +33393,45 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pInfo, sizeof(const VkAccelerationStructureDeviceAddressInfoKHR));
-                reservedunmarshal_VkAccelerationStructureDeviceAddressInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureDeviceAddressInfoKHR*)(pInfo), readStreamPtrPtr);
-                if (pInfo)
-                {
-                    transform_tohost_VkAccelerationStructureDeviceAddressInfoKHR(m_state, (VkAccelerationStructureDeviceAddressInfoKHR*)(pInfo));
+                vkReadStream->alloc((void**)&pInfo,
+                                    sizeof(const VkAccelerationStructureDeviceAddressInfoKHR));
+                reservedunmarshal_VkAccelerationStructureDeviceAddressInfoKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkAccelerationStructureDeviceAddressInfoKHR*)(pInfo), readStreamPtrPtr);
+                if (pInfo) {
+                    transform_tohost_VkAccelerationStructureDeviceAddressInfoKHR(
+                        m_state, (VkAccelerationStructureDeviceAddressInfoKHR*)(pInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetAccelerationStructureDeviceAddressKHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pInfo);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetAccelerationStructureDeviceAddressKHR 0x%llx "
+                            "0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pInfo);
                 }
-                VkDeviceAddress vkGetAccelerationStructureDeviceAddressKHR_VkDeviceAddress_return = (VkDeviceAddress)0;
-                vkGetAccelerationStructureDeviceAddressKHR_VkDeviceAddress_return = vk->vkGetAccelerationStructureDeviceAddressKHR(unboxed_device, pInfo);
+                VkDeviceAddress vkGetAccelerationStructureDeviceAddressKHR_VkDeviceAddress_return =
+                    (VkDeviceAddress)0;
+                vkGetAccelerationStructureDeviceAddressKHR_VkDeviceAddress_return =
+                    vk->vkGetAccelerationStructureDeviceAddressKHR(unboxed_device, pInfo);
                 vkStream->unsetHandleMapping();
-                vkStream->write(&vkGetAccelerationStructureDeviceAddressKHR_VkDeviceAddress_return, sizeof(VkDeviceAddress));
+                vkStream->write(&vkGetAccelerationStructureDeviceAddressKHR_VkDeviceAddress_return,
+                                sizeof(VkDeviceAddress));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetAccelerationStructureDeviceAddressKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetAccelerationStructureDeviceAddressKHR_VkDeviceAddress_return, device, pInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetAccelerationStructureDeviceAddressKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetAccelerationStructureDeviceAddressKHR_VkDeviceAddress_return, device,
+                        pInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdWriteAccelerationStructuresPropertiesKHR:
-            {
+            case OP_vkCmdWriteAccelerationStructuresPropertiesKHR: {
                 android::base::beginTrace("vkCmdWriteAccelerationStructuresPropertiesKHR decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t accelerationStructureCount;
@@ -28608,21 +33443,25 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 memcpy((uint32_t*)&accelerationStructureCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pAccelerationStructures, ((accelerationStructureCount)) * sizeof(const VkAccelerationStructureKHR));
-                if (((accelerationStructureCount)))
-                {
+                vkReadStream->alloc(
+                    (void**)&pAccelerationStructures,
+                    ((accelerationStructureCount)) * sizeof(const VkAccelerationStructureKHR));
+                if (((accelerationStructureCount))) {
                     uint8_t* cgen_var_1_ptr = (uint8_t*)(*readStreamPtrPtr);
                     *readStreamPtrPtr += 8 * ((accelerationStructureCount));
-                    for (uint32_t k = 0; k < ((accelerationStructureCount)); ++k)
-                    {
-                        uint64_t tmpval; memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
-                        *(((VkAccelerationStructureKHR*)pAccelerationStructures) + k) = (VkAccelerationStructureKHR)unbox_VkAccelerationStructureKHR((VkAccelerationStructureKHR)tmpval);
+                    for (uint32_t k = 0; k < ((accelerationStructureCount)); ++k) {
+                        uint64_t tmpval;
+                        memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
+                        *(((VkAccelerationStructureKHR*)pAccelerationStructures) + k) =
+                            (VkAccelerationStructureKHR)unbox_VkAccelerationStructureKHR(
+                                (VkAccelerationStructureKHR)tmpval);
                     }
                 }
                 memcpy((VkQueryType*)&queryType, *readStreamPtrPtr, sizeof(VkQueryType));
@@ -28630,29 +33469,42 @@
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkQueryPool*)&queryPool = (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_2));
+                *(VkQueryPool*)&queryPool =
+                    (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_2));
                 memcpy((uint32_t*)&firstQuery, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdWriteAccelerationStructuresPropertiesKHR 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)accelerationStructureCount, (unsigned long long)pAccelerationStructures, (unsigned long long)queryType, (unsigned long long)queryPool, (unsigned long long)firstQuery);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdWriteAccelerationStructuresPropertiesKHR 0x%llx "
+                            "0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)accelerationStructureCount,
+                            (unsigned long long)pAccelerationStructures,
+                            (unsigned long long)queryType, (unsigned long long)queryPool,
+                            (unsigned long long)firstQuery);
                 }
-                vk->vkCmdWriteAccelerationStructuresPropertiesKHR(unboxed_commandBuffer, accelerationStructureCount, pAccelerationStructures, queryType, queryPool, firstQuery);
+                vk->vkCmdWriteAccelerationStructuresPropertiesKHR(
+                    unboxed_commandBuffer, accelerationStructureCount, pAccelerationStructures,
+                    queryType, queryPool, firstQuery);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdWriteAccelerationStructuresPropertiesKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, accelerationStructureCount, pAccelerationStructures, queryType, queryPool, firstQuery);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdWriteAccelerationStructuresPropertiesKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        accelerationStructureCount, pAccelerationStructures, queryType, queryPool,
+                        firstQuery);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetDeviceAccelerationStructureCompatibilityKHR:
-            {
-                android::base::beginTrace("vkGetDeviceAccelerationStructureCompatibilityKHR decode");
+            case OP_vkGetDeviceAccelerationStructureCompatibilityKHR: {
+                android::base::beginTrace(
+                    "vkGetDeviceAccelerationStructureCompatibilityKHR decode");
                 VkDevice device;
                 const VkAccelerationStructureVersionInfoKHR* pVersionInfo;
                 VkAccelerationStructureCompatibilityKHR* pCompatibility;
@@ -28664,38 +33516,50 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                vkReadStream->alloc((void**)&pVersionInfo, sizeof(const VkAccelerationStructureVersionInfoKHR));
-                reservedunmarshal_VkAccelerationStructureVersionInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureVersionInfoKHR*)(pVersionInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pVersionInfo,
+                                    sizeof(const VkAccelerationStructureVersionInfoKHR));
+                reservedunmarshal_VkAccelerationStructureVersionInfoKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkAccelerationStructureVersionInfoKHR*)(pVersionInfo), readStreamPtrPtr);
                 // Begin manual dispatchable handle unboxing for pCompatibility;
                 vkReadStream->unsetHandleMapping();
-                vkReadStream->alloc((void**)&pCompatibility, sizeof(VkAccelerationStructureCompatibilityKHR));
-                memcpy((VkAccelerationStructureCompatibilityKHR*)pCompatibility, *readStreamPtrPtr, sizeof(VkAccelerationStructureCompatibilityKHR));
+                vkReadStream->alloc((void**)&pCompatibility,
+                                    sizeof(VkAccelerationStructureCompatibilityKHR));
+                memcpy((VkAccelerationStructureCompatibilityKHR*)pCompatibility, *readStreamPtrPtr,
+                       sizeof(VkAccelerationStructureCompatibilityKHR));
                 *readStreamPtrPtr += sizeof(VkAccelerationStructureCompatibilityKHR);
-                if (pVersionInfo)
-                {
-                    transform_tohost_VkAccelerationStructureVersionInfoKHR(m_state, (VkAccelerationStructureVersionInfoKHR*)(pVersionInfo));
+                if (pVersionInfo) {
+                    transform_tohost_VkAccelerationStructureVersionInfoKHR(
+                        m_state, (VkAccelerationStructureVersionInfoKHR*)(pVersionInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetDeviceAccelerationStructureCompatibilityKHR 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pVersionInfo, (unsigned long long)pCompatibility);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetDeviceAccelerationStructureCompatibilityKHR "
+                            "0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pVersionInfo,
+                            (unsigned long long)pCompatibility);
                 }
-                vk->vkGetDeviceAccelerationStructureCompatibilityKHR(unboxed_device, pVersionInfo, pCompatibility);
+                vk->vkGetDeviceAccelerationStructureCompatibilityKHR(unboxed_device, pVersionInfo,
+                                                                     pCompatibility);
                 vkStream->unsetHandleMapping();
-                vkStream->write((VkAccelerationStructureCompatibilityKHR*)pCompatibility, sizeof(VkAccelerationStructureCompatibilityKHR));
+                vkStream->write((VkAccelerationStructureCompatibilityKHR*)pCompatibility,
+                                sizeof(VkAccelerationStructureCompatibilityKHR));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetDeviceAccelerationStructureCompatibilityKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, pVersionInfo, pCompatibility);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetDeviceAccelerationStructureCompatibilityKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, pVersionInfo,
+                        pCompatibility);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetAccelerationStructureBuildSizesKHR:
-            {
+            case OP_vkGetAccelerationStructureBuildSizesKHR: {
                 android::base::beginTrace("vkGetAccelerationStructureBuildSizesKHR decode");
                 VkDevice device;
                 VkAccelerationStructureBuildTypeKHR buildType;
@@ -28710,59 +33574,76 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                memcpy((VkAccelerationStructureBuildTypeKHR*)&buildType, *readStreamPtrPtr, sizeof(VkAccelerationStructureBuildTypeKHR));
+                memcpy((VkAccelerationStructureBuildTypeKHR*)&buildType, *readStreamPtrPtr,
+                       sizeof(VkAccelerationStructureBuildTypeKHR));
                 *readStreamPtrPtr += sizeof(VkAccelerationStructureBuildTypeKHR);
-                vkReadStream->alloc((void**)&pBuildInfo, sizeof(const VkAccelerationStructureBuildGeometryInfoKHR));
-                reservedunmarshal_VkAccelerationStructureBuildGeometryInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureBuildGeometryInfoKHR*)(pBuildInfo), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pBuildInfo,
+                                    sizeof(const VkAccelerationStructureBuildGeometryInfoKHR));
+                reservedunmarshal_VkAccelerationStructureBuildGeometryInfoKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkAccelerationStructureBuildGeometryInfoKHR*)(pBuildInfo), readStreamPtrPtr);
                 // WARNING PTR CHECK
                 memcpy((uint32_t**)&pMaxPrimitiveCounts, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pMaxPrimitiveCounts);
                 *readStreamPtrPtr += 8;
-                if (pMaxPrimitiveCounts)
-                {
-                    vkReadStream->alloc((void**)&pMaxPrimitiveCounts, pBuildInfo->geometryCount * sizeof(const uint32_t));
-                    memcpy((uint32_t*)pMaxPrimitiveCounts, *readStreamPtrPtr, pBuildInfo->geometryCount * sizeof(const uint32_t));
+                if (pMaxPrimitiveCounts) {
+                    vkReadStream->alloc((void**)&pMaxPrimitiveCounts,
+                                        pBuildInfo->geometryCount * sizeof(const uint32_t));
+                    memcpy((uint32_t*)pMaxPrimitiveCounts, *readStreamPtrPtr,
+                           pBuildInfo->geometryCount * sizeof(const uint32_t));
                     *readStreamPtrPtr += pBuildInfo->geometryCount * sizeof(const uint32_t);
                 }
                 // Begin manual dispatchable handle unboxing for pSizeInfo;
                 vkReadStream->unsetHandleMapping();
-                vkReadStream->alloc((void**)&pSizeInfo, sizeof(VkAccelerationStructureBuildSizesInfoKHR));
-                reservedunmarshal_VkAccelerationStructureBuildSizesInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureBuildSizesInfoKHR*)(pSizeInfo), readStreamPtrPtr);
-                if (pBuildInfo)
-                {
-                    transform_tohost_VkAccelerationStructureBuildGeometryInfoKHR(m_state, (VkAccelerationStructureBuildGeometryInfoKHR*)(pBuildInfo));
+                vkReadStream->alloc((void**)&pSizeInfo,
+                                    sizeof(VkAccelerationStructureBuildSizesInfoKHR));
+                reservedunmarshal_VkAccelerationStructureBuildSizesInfoKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkAccelerationStructureBuildSizesInfoKHR*)(pSizeInfo), readStreamPtrPtr);
+                if (pBuildInfo) {
+                    transform_tohost_VkAccelerationStructureBuildGeometryInfoKHR(
+                        m_state, (VkAccelerationStructureBuildGeometryInfoKHR*)(pBuildInfo));
                 }
-                if (pSizeInfo)
-                {
-                    transform_tohost_VkAccelerationStructureBuildSizesInfoKHR(m_state, (VkAccelerationStructureBuildSizesInfoKHR*)(pSizeInfo));
+                if (pSizeInfo) {
+                    transform_tohost_VkAccelerationStructureBuildSizesInfoKHR(
+                        m_state, (VkAccelerationStructureBuildSizesInfoKHR*)(pSizeInfo));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetAccelerationStructureBuildSizesKHR 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)buildType, (unsigned long long)pBuildInfo, (unsigned long long)pMaxPrimitiveCounts, (unsigned long long)pSizeInfo);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetAccelerationStructureBuildSizesKHR 0x%llx 0x%llx "
+                            "0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)buildType,
+                            (unsigned long long)pBuildInfo, (unsigned long long)pMaxPrimitiveCounts,
+                            (unsigned long long)pSizeInfo);
                 }
-                vk->vkGetAccelerationStructureBuildSizesKHR(unboxed_device, buildType, pBuildInfo, pMaxPrimitiveCounts, pSizeInfo);
+                vk->vkGetAccelerationStructureBuildSizesKHR(unboxed_device, buildType, pBuildInfo,
+                                                            pMaxPrimitiveCounts, pSizeInfo);
                 vkStream->unsetHandleMapping();
-                if (pSizeInfo)
-                {
-                    transform_fromhost_VkAccelerationStructureBuildSizesInfoKHR(m_state, (VkAccelerationStructureBuildSizesInfoKHR*)(pSizeInfo));
+                if (pSizeInfo) {
+                    transform_fromhost_VkAccelerationStructureBuildSizesInfoKHR(
+                        m_state, (VkAccelerationStructureBuildSizesInfoKHR*)(pSizeInfo));
                 }
-                marshal_VkAccelerationStructureBuildSizesInfoKHR(vkStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureBuildSizesInfoKHR*)(pSizeInfo));
+                marshal_VkAccelerationStructureBuildSizesInfoKHR(
+                    vkStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkAccelerationStructureBuildSizesInfoKHR*)(pSizeInfo));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetAccelerationStructureBuildSizesKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, buildType, pBuildInfo, pMaxPrimitiveCounts, pSizeInfo);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetAccelerationStructureBuildSizesKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, buildType,
+                        pBuildInfo, pMaxPrimitiveCounts, pSizeInfo);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
-            case OP_vkCmdTraceRaysKHR:
-            {
+            case OP_vkCmdTraceRaysKHR: {
                 android::base::beginTrace("vkCmdTraceRaysKHR decode");
                 VkCommandBuffer commandBuffer;
                 const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable;
@@ -28776,59 +33657,87 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
-                vkReadStream->alloc((void**)&pRaygenShaderBindingTable, sizeof(const VkStridedDeviceAddressRegionKHR));
-                reservedunmarshal_VkStridedDeviceAddressRegionKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkStridedDeviceAddressRegionKHR*)(pRaygenShaderBindingTable), readStreamPtrPtr);
-                vkReadStream->alloc((void**)&pMissShaderBindingTable, sizeof(const VkStridedDeviceAddressRegionKHR));
-                reservedunmarshal_VkStridedDeviceAddressRegionKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkStridedDeviceAddressRegionKHR*)(pMissShaderBindingTable), readStreamPtrPtr);
-                vkReadStream->alloc((void**)&pHitShaderBindingTable, sizeof(const VkStridedDeviceAddressRegionKHR));
-                reservedunmarshal_VkStridedDeviceAddressRegionKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkStridedDeviceAddressRegionKHR*)(pHitShaderBindingTable), readStreamPtrPtr);
-                vkReadStream->alloc((void**)&pCallableShaderBindingTable, sizeof(const VkStridedDeviceAddressRegionKHR));
-                reservedunmarshal_VkStridedDeviceAddressRegionKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkStridedDeviceAddressRegionKHR*)(pCallableShaderBindingTable), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pRaygenShaderBindingTable,
+                                    sizeof(const VkStridedDeviceAddressRegionKHR));
+                reservedunmarshal_VkStridedDeviceAddressRegionKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkStridedDeviceAddressRegionKHR*)(pRaygenShaderBindingTable),
+                    readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pMissShaderBindingTable,
+                                    sizeof(const VkStridedDeviceAddressRegionKHR));
+                reservedunmarshal_VkStridedDeviceAddressRegionKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkStridedDeviceAddressRegionKHR*)(pMissShaderBindingTable), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pHitShaderBindingTable,
+                                    sizeof(const VkStridedDeviceAddressRegionKHR));
+                reservedunmarshal_VkStridedDeviceAddressRegionKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkStridedDeviceAddressRegionKHR*)(pHitShaderBindingTable), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pCallableShaderBindingTable,
+                                    sizeof(const VkStridedDeviceAddressRegionKHR));
+                reservedunmarshal_VkStridedDeviceAddressRegionKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkStridedDeviceAddressRegionKHR*)(pCallableShaderBindingTable),
+                    readStreamPtrPtr);
                 memcpy((uint32_t*)&width, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&height, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&depth, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (pRaygenShaderBindingTable)
-                {
-                    transform_tohost_VkStridedDeviceAddressRegionKHR(m_state, (VkStridedDeviceAddressRegionKHR*)(pRaygenShaderBindingTable));
+                if (pRaygenShaderBindingTable) {
+                    transform_tohost_VkStridedDeviceAddressRegionKHR(
+                        m_state, (VkStridedDeviceAddressRegionKHR*)(pRaygenShaderBindingTable));
                 }
-                if (pMissShaderBindingTable)
-                {
-                    transform_tohost_VkStridedDeviceAddressRegionKHR(m_state, (VkStridedDeviceAddressRegionKHR*)(pMissShaderBindingTable));
+                if (pMissShaderBindingTable) {
+                    transform_tohost_VkStridedDeviceAddressRegionKHR(
+                        m_state, (VkStridedDeviceAddressRegionKHR*)(pMissShaderBindingTable));
                 }
-                if (pHitShaderBindingTable)
-                {
-                    transform_tohost_VkStridedDeviceAddressRegionKHR(m_state, (VkStridedDeviceAddressRegionKHR*)(pHitShaderBindingTable));
+                if (pHitShaderBindingTable) {
+                    transform_tohost_VkStridedDeviceAddressRegionKHR(
+                        m_state, (VkStridedDeviceAddressRegionKHR*)(pHitShaderBindingTable));
                 }
-                if (pCallableShaderBindingTable)
-                {
-                    transform_tohost_VkStridedDeviceAddressRegionKHR(m_state, (VkStridedDeviceAddressRegionKHR*)(pCallableShaderBindingTable));
+                if (pCallableShaderBindingTable) {
+                    transform_tohost_VkStridedDeviceAddressRegionKHR(
+                        m_state, (VkStridedDeviceAddressRegionKHR*)(pCallableShaderBindingTable));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdTraceRaysKHR 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pRaygenShaderBindingTable, (unsigned long long)pMissShaderBindingTable, (unsigned long long)pHitShaderBindingTable, (unsigned long long)pCallableShaderBindingTable, (unsigned long long)width, (unsigned long long)height, (unsigned long long)depth);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdTraceRaysKHR 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pRaygenShaderBindingTable,
+                            (unsigned long long)pMissShaderBindingTable,
+                            (unsigned long long)pHitShaderBindingTable,
+                            (unsigned long long)pCallableShaderBindingTable,
+                            (unsigned long long)width, (unsigned long long)height,
+                            (unsigned long long)depth);
                 }
-                vk->vkCmdTraceRaysKHR(unboxed_commandBuffer, pRaygenShaderBindingTable, pMissShaderBindingTable, pHitShaderBindingTable, pCallableShaderBindingTable, width, height, depth);
+                vk->vkCmdTraceRaysKHR(unboxed_commandBuffer, pRaygenShaderBindingTable,
+                                      pMissShaderBindingTable, pHitShaderBindingTable,
+                                      pCallableShaderBindingTable, width, height, depth);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdTraceRaysKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pRaygenShaderBindingTable, pMissShaderBindingTable, pHitShaderBindingTable, pCallableShaderBindingTable, width, height, depth);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdTraceRaysKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        pRaygenShaderBindingTable, pMissShaderBindingTable, pHitShaderBindingTable,
+                        pCallableShaderBindingTable, width, height, depth);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCreateRayTracingPipelinesKHR:
-            {
+            case OP_vkCreateRayTracingPipelinesKHR: {
                 android::base::beginTrace("vkCreateRayTracingPipelinesKHR decode");
                 VkDevice device;
                 VkDeferredOperationKHR deferredOperation;
@@ -28851,78 +33760,95 @@
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPipelineCache*)&pipelineCache = (VkPipelineCache)unbox_VkPipelineCache((VkPipelineCache)(*&cgen_var_2));
+                *(VkPipelineCache*)&pipelineCache =
+                    (VkPipelineCache)unbox_VkPipelineCache((VkPipelineCache)(*&cgen_var_2));
                 memcpy((uint32_t*)&createInfoCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vkReadStream->alloc((void**)&pCreateInfos, ((createInfoCount)) * sizeof(const VkRayTracingPipelineCreateInfoKHR));
-                for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i)
-                {
-                    reservedunmarshal_VkRayTracingPipelineCreateInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRayTracingPipelineCreateInfoKHR*)(pCreateInfos + i), readStreamPtrPtr);
+                vkReadStream->alloc(
+                    (void**)&pCreateInfos,
+                    ((createInfoCount)) * sizeof(const VkRayTracingPipelineCreateInfoKHR));
+                for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i) {
+                    reservedunmarshal_VkRayTracingPipelineCreateInfoKHR(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkRayTracingPipelineCreateInfoKHR*)(pCreateInfos + i), readStreamPtrPtr);
                 }
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
                 *readStreamPtrPtr += 8;
-                if (pAllocator)
-                {
+                if (pAllocator) {
                     vkReadStream->alloc((void**)&pAllocator, sizeof(const VkAllocationCallbacks));
-                    reservedunmarshal_VkAllocationCallbacks(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
+                    reservedunmarshal_VkAllocationCallbacks(
+                        vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAllocationCallbacks*)(pAllocator), readStreamPtrPtr);
                 }
                 // Begin manual dispatchable handle unboxing for pPipelines;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pPipelines, ((createInfoCount)) * sizeof(VkPipeline));
-                if (((createInfoCount)))
-                {
+                if (((createInfoCount))) {
                     uint8_t* cgen_var_4_ptr = (uint8_t*)(*readStreamPtrPtr);
                     *readStreamPtrPtr += 8 * ((createInfoCount));
-                    for (uint32_t k = 0; k < ((createInfoCount)); ++k)
-                    {
-                        uint64_t tmpval; memcpy(&tmpval, cgen_var_4_ptr + k * 8, sizeof(uint64_t));
-                        *(((VkPipeline*)pPipelines) + k) = (VkPipeline)(VkPipeline)((VkPipeline)tmpval);
+                    for (uint32_t k = 0; k < ((createInfoCount)); ++k) {
+                        uint64_t tmpval;
+                        memcpy(&tmpval, cgen_var_4_ptr + k * 8, sizeof(uint64_t));
+                        *(((VkPipeline*)pPipelines) + k) =
+                            (VkPipeline)(VkPipeline)((VkPipeline)tmpval);
                     }
                 }
-                if (pCreateInfos)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i)
-                    {
-                        transform_tohost_VkRayTracingPipelineCreateInfoKHR(m_state, (VkRayTracingPipelineCreateInfoKHR*)(pCreateInfos + i));
+                if (pCreateInfos) {
+                    for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i) {
+                        transform_tohost_VkRayTracingPipelineCreateInfoKHR(
+                            m_state, (VkRayTracingPipelineCreateInfoKHR*)(pCreateInfos + i));
                     }
                 }
-                if (pAllocator)
-                {
-                    transform_tohost_VkAllocationCallbacks(m_state, (VkAllocationCallbacks*)(pAllocator));
+                if (pAllocator) {
+                    transform_tohost_VkAllocationCallbacks(m_state,
+                                                           (VkAllocationCallbacks*)(pAllocator));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCreateRayTracingPipelinesKHR 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)deferredOperation, (unsigned long long)pipelineCache, (unsigned long long)createInfoCount, (unsigned long long)pCreateInfos, (unsigned long long)pAllocator, (unsigned long long)pPipelines);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCreateRayTracingPipelinesKHR 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device,
+                            (unsigned long long)deferredOperation,
+                            (unsigned long long)pipelineCache, (unsigned long long)createInfoCount,
+                            (unsigned long long)pCreateInfos, (unsigned long long)pAllocator,
+                            (unsigned long long)pPipelines);
                 }
                 VkResult vkCreateRayTracingPipelinesKHR_VkResult_return = (VkResult)0;
-                vkCreateRayTracingPipelinesKHR_VkResult_return = vk->vkCreateRayTracingPipelinesKHR(unboxed_device, deferredOperation, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
-                if ((vkCreateRayTracingPipelinesKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                vkCreateRayTracingPipelinesKHR_VkResult_return = vk->vkCreateRayTracingPipelinesKHR(
+                    unboxed_device, deferredOperation, pipelineCache, createInfoCount, pCreateInfos,
+                    pAllocator, pPipelines);
+                if ((vkCreateRayTracingPipelinesKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
-                if (((createInfoCount)))
-                {
+                if (((createInfoCount))) {
                     uint64_t* cgen_var_5;
                     vkStream->alloc((void**)&cgen_var_5, ((createInfoCount)) * 8);
-                    vkStream->handleMapping()->mapHandles_VkPipeline_u64(pPipelines, cgen_var_5, ((createInfoCount)));
+                    vkStream->handleMapping()->mapHandles_VkPipeline_u64(pPipelines, cgen_var_5,
+                                                                         ((createInfoCount)));
                     vkStream->write((uint64_t*)cgen_var_5, ((createInfoCount)) * 8);
                 }
                 vkStream->write(&vkCreateRayTracingPipelinesKHR_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCreateRayTracingPipelinesKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkCreateRayTracingPipelinesKHR_VkResult_return, device, deferredOperation, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCreateRayTracingPipelinesKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkCreateRayTracingPipelinesKHR_VkResult_return, device, deferredOperation,
+                        pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR:
-            {
-                android::base::beginTrace("vkGetRayTracingCaptureReplayShaderGroupHandlesKHR decode");
+            case OP_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR: {
+                android::base::beginTrace(
+                    "vkGetRayTracingCaptureReplayShaderGroupHandlesKHR decode");
                 VkDevice device;
                 VkPipeline pipeline;
                 uint32_t firstGroup;
@@ -28953,30 +33879,43 @@
                 vkReadStream->alloc((void**)&pData, ((dataSize)) * sizeof(uint8_t));
                 memcpy((void*)pData, *readStreamPtrPtr, ((dataSize)) * sizeof(uint8_t));
                 *readStreamPtrPtr += ((dataSize)) * sizeof(uint8_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetRayTracingCaptureReplayShaderGroupHandlesKHR 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pipeline, (unsigned long long)firstGroup, (unsigned long long)groupCount, (unsigned long long)dataSize, (unsigned long long)pData);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetRayTracingCaptureReplayShaderGroupHandlesKHR "
+                            "0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pipeline,
+                            (unsigned long long)firstGroup, (unsigned long long)groupCount,
+                            (unsigned long long)dataSize, (unsigned long long)pData);
                 }
-                VkResult vkGetRayTracingCaptureReplayShaderGroupHandlesKHR_VkResult_return = (VkResult)0;
-                vkGetRayTracingCaptureReplayShaderGroupHandlesKHR_VkResult_return = vk->vkGetRayTracingCaptureReplayShaderGroupHandlesKHR(unboxed_device, pipeline, firstGroup, groupCount, dataSize, pData);
-                if ((vkGetRayTracingCaptureReplayShaderGroupHandlesKHR_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
+                VkResult vkGetRayTracingCaptureReplayShaderGroupHandlesKHR_VkResult_return =
+                    (VkResult)0;
+                vkGetRayTracingCaptureReplayShaderGroupHandlesKHR_VkResult_return =
+                    vk->vkGetRayTracingCaptureReplayShaderGroupHandlesKHR(
+                        unboxed_device, pipeline, firstGroup, groupCount, dataSize, pData);
+                if ((vkGetRayTracingCaptureReplayShaderGroupHandlesKHR_VkResult_return) ==
+                    VK_ERROR_DEVICE_LOST)
+                    m_state->on_DeviceLost();
                 vkStream->unsetHandleMapping();
                 vkStream->write((void*)pData, ((dataSize)) * sizeof(uint8_t));
-                vkStream->write(&vkGetRayTracingCaptureReplayShaderGroupHandlesKHR_VkResult_return, sizeof(VkResult));
+                vkStream->write(&vkGetRayTracingCaptureReplayShaderGroupHandlesKHR_VkResult_return,
+                                sizeof(VkResult));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetRayTracingCaptureReplayShaderGroupHandlesKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetRayTracingCaptureReplayShaderGroupHandlesKHR_VkResult_return, device, pipeline, firstGroup, groupCount, dataSize, pData);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetRayTracingCaptureReplayShaderGroupHandlesKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetRayTracingCaptureReplayShaderGroupHandlesKHR_VkResult_return, device,
+                        pipeline, firstGroup, groupCount, dataSize, pData);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdTraceRaysIndirectKHR:
-            {
+            case OP_vkCmdTraceRaysIndirectKHR: {
                 android::base::beginTrace("vkCmdTraceRaysIndirectKHR decode");
                 VkCommandBuffer commandBuffer;
                 const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable;
@@ -28988,55 +33927,83 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
-                vkReadStream->alloc((void**)&pRaygenShaderBindingTable, sizeof(const VkStridedDeviceAddressRegionKHR));
-                reservedunmarshal_VkStridedDeviceAddressRegionKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkStridedDeviceAddressRegionKHR*)(pRaygenShaderBindingTable), readStreamPtrPtr);
-                vkReadStream->alloc((void**)&pMissShaderBindingTable, sizeof(const VkStridedDeviceAddressRegionKHR));
-                reservedunmarshal_VkStridedDeviceAddressRegionKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkStridedDeviceAddressRegionKHR*)(pMissShaderBindingTable), readStreamPtrPtr);
-                vkReadStream->alloc((void**)&pHitShaderBindingTable, sizeof(const VkStridedDeviceAddressRegionKHR));
-                reservedunmarshal_VkStridedDeviceAddressRegionKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkStridedDeviceAddressRegionKHR*)(pHitShaderBindingTable), readStreamPtrPtr);
-                vkReadStream->alloc((void**)&pCallableShaderBindingTable, sizeof(const VkStridedDeviceAddressRegionKHR));
-                reservedunmarshal_VkStridedDeviceAddressRegionKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkStridedDeviceAddressRegionKHR*)(pCallableShaderBindingTable), readStreamPtrPtr);
-                memcpy((VkDeviceAddress*)&indirectDeviceAddress, *readStreamPtrPtr, sizeof(VkDeviceAddress));
+                vkReadStream->alloc((void**)&pRaygenShaderBindingTable,
+                                    sizeof(const VkStridedDeviceAddressRegionKHR));
+                reservedunmarshal_VkStridedDeviceAddressRegionKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkStridedDeviceAddressRegionKHR*)(pRaygenShaderBindingTable),
+                    readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pMissShaderBindingTable,
+                                    sizeof(const VkStridedDeviceAddressRegionKHR));
+                reservedunmarshal_VkStridedDeviceAddressRegionKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkStridedDeviceAddressRegionKHR*)(pMissShaderBindingTable), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pHitShaderBindingTable,
+                                    sizeof(const VkStridedDeviceAddressRegionKHR));
+                reservedunmarshal_VkStridedDeviceAddressRegionKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkStridedDeviceAddressRegionKHR*)(pHitShaderBindingTable), readStreamPtrPtr);
+                vkReadStream->alloc((void**)&pCallableShaderBindingTable,
+                                    sizeof(const VkStridedDeviceAddressRegionKHR));
+                reservedunmarshal_VkStridedDeviceAddressRegionKHR(
+                    vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkStridedDeviceAddressRegionKHR*)(pCallableShaderBindingTable),
+                    readStreamPtrPtr);
+                memcpy((VkDeviceAddress*)&indirectDeviceAddress, *readStreamPtrPtr,
+                       sizeof(VkDeviceAddress));
                 *readStreamPtrPtr += sizeof(VkDeviceAddress);
-                if (pRaygenShaderBindingTable)
-                {
-                    transform_tohost_VkStridedDeviceAddressRegionKHR(m_state, (VkStridedDeviceAddressRegionKHR*)(pRaygenShaderBindingTable));
+                if (pRaygenShaderBindingTable) {
+                    transform_tohost_VkStridedDeviceAddressRegionKHR(
+                        m_state, (VkStridedDeviceAddressRegionKHR*)(pRaygenShaderBindingTable));
                 }
-                if (pMissShaderBindingTable)
-                {
-                    transform_tohost_VkStridedDeviceAddressRegionKHR(m_state, (VkStridedDeviceAddressRegionKHR*)(pMissShaderBindingTable));
+                if (pMissShaderBindingTable) {
+                    transform_tohost_VkStridedDeviceAddressRegionKHR(
+                        m_state, (VkStridedDeviceAddressRegionKHR*)(pMissShaderBindingTable));
                 }
-                if (pHitShaderBindingTable)
-                {
-                    transform_tohost_VkStridedDeviceAddressRegionKHR(m_state, (VkStridedDeviceAddressRegionKHR*)(pHitShaderBindingTable));
+                if (pHitShaderBindingTable) {
+                    transform_tohost_VkStridedDeviceAddressRegionKHR(
+                        m_state, (VkStridedDeviceAddressRegionKHR*)(pHitShaderBindingTable));
                 }
-                if (pCallableShaderBindingTable)
-                {
-                    transform_tohost_VkStridedDeviceAddressRegionKHR(m_state, (VkStridedDeviceAddressRegionKHR*)(pCallableShaderBindingTable));
+                if (pCallableShaderBindingTable) {
+                    transform_tohost_VkStridedDeviceAddressRegionKHR(
+                        m_state, (VkStridedDeviceAddressRegionKHR*)(pCallableShaderBindingTable));
                 }
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdTraceRaysIndirectKHR 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pRaygenShaderBindingTable, (unsigned long long)pMissShaderBindingTable, (unsigned long long)pHitShaderBindingTable, (unsigned long long)pCallableShaderBindingTable, (unsigned long long)indirectDeviceAddress);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkCmdTraceRaysIndirectKHR 0x%llx 0x%llx 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)commandBuffer,
+                            (unsigned long long)pRaygenShaderBindingTable,
+                            (unsigned long long)pMissShaderBindingTable,
+                            (unsigned long long)pHitShaderBindingTable,
+                            (unsigned long long)pCallableShaderBindingTable,
+                            (unsigned long long)indirectDeviceAddress);
                 }
-                vk->vkCmdTraceRaysIndirectKHR(unboxed_commandBuffer, pRaygenShaderBindingTable, pMissShaderBindingTable, pHitShaderBindingTable, pCallableShaderBindingTable, indirectDeviceAddress);
+                vk->vkCmdTraceRaysIndirectKHR(unboxed_commandBuffer, pRaygenShaderBindingTable,
+                                              pMissShaderBindingTable, pHitShaderBindingTable,
+                                              pCallableShaderBindingTable, indirectDeviceAddress);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdTraceRaysIndirectKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pRaygenShaderBindingTable, pMissShaderBindingTable, pHitShaderBindingTable, pCallableShaderBindingTable, indirectDeviceAddress);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdTraceRaysIndirectKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        pRaygenShaderBindingTable, pMissShaderBindingTable, pHitShaderBindingTable,
+                        pCallableShaderBindingTable, indirectDeviceAddress);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkGetRayTracingShaderGroupStackSizeKHR:
-            {
+            case OP_vkGetRayTracingShaderGroupStackSizeKHR: {
                 android::base::beginTrace("vkGetRayTracingShaderGroupStackSizeKHR decode");
                 VkDevice device;
                 VkPipeline pipeline;
@@ -29056,30 +34023,41 @@
                 *(VkPipeline*)&pipeline = (VkPipeline)unbox_VkPipeline((VkPipeline)(*&cgen_var_1));
                 memcpy((uint32_t*)&group, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                memcpy((VkShaderGroupShaderKHR*)&groupShader, *readStreamPtrPtr, sizeof(VkShaderGroupShaderKHR));
+                memcpy((VkShaderGroupShaderKHR*)&groupShader, *readStreamPtrPtr,
+                       sizeof(VkShaderGroupShaderKHR));
                 *readStreamPtrPtr += sizeof(VkShaderGroupShaderKHR);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkGetRayTracingShaderGroupStackSizeKHR 0x%llx 0x%llx 0x%llx 0x%llx \n", ioStream, (unsigned long long)device, (unsigned long long)pipeline, (unsigned long long)group, (unsigned long long)groupShader);
+                if (m_logCalls) {
+                    fprintf(stderr,
+                            "stream %p: call vkGetRayTracingShaderGroupStackSizeKHR 0x%llx 0x%llx "
+                            "0x%llx 0x%llx \n",
+                            ioStream, (unsigned long long)device, (unsigned long long)pipeline,
+                            (unsigned long long)group, (unsigned long long)groupShader);
                 }
-                VkDeviceSize vkGetRayTracingShaderGroupStackSizeKHR_VkDeviceSize_return = (VkDeviceSize)0;
-                vkGetRayTracingShaderGroupStackSizeKHR_VkDeviceSize_return = vk->vkGetRayTracingShaderGroupStackSizeKHR(unboxed_device, pipeline, group, groupShader);
+                VkDeviceSize vkGetRayTracingShaderGroupStackSizeKHR_VkDeviceSize_return =
+                    (VkDeviceSize)0;
+                vkGetRayTracingShaderGroupStackSizeKHR_VkDeviceSize_return =
+                    vk->vkGetRayTracingShaderGroupStackSizeKHR(unboxed_device, pipeline, group,
+                                                               groupShader);
                 vkStream->unsetHandleMapping();
-                vkStream->write(&vkGetRayTracingShaderGroupStackSizeKHR_VkDeviceSize_return, sizeof(VkDeviceSize));
+                vkStream->write(&vkGetRayTracingShaderGroupStackSizeKHR_VkDeviceSize_return,
+                                sizeof(VkDeviceSize));
                 vkStream->commitWrite();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkGetRayTracingShaderGroupStackSizeKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, vkGetRayTracingShaderGroupStackSizeKHR_VkDeviceSize_return, device, pipeline, group, groupShader);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkGetRayTracingShaderGroupStackSizeKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool,
+                        vkGetRayTracingShaderGroupStackSizeKHR_VkDeviceSize_return, device,
+                        pipeline, group, groupShader);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetRayTracingPipelineStackSizeKHR:
-            {
+            case OP_vkCmdSetRayTracingPipelineStackSizeKHR: {
                 android::base::beginTrace("vkCmdSetRayTracingPipelineStackSizeKHR decode");
                 VkCommandBuffer commandBuffer;
                 uint32_t pipelineStackSize;
@@ -29087,46 +34065,51 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkCommandBuffer*)&commandBuffer = (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                *(VkCommandBuffer*)&commandBuffer =
+                    (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
                 auto unboxed_commandBuffer = unbox_VkCommandBuffer(commandBuffer);
                 auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 // End manual dispatchable handle unboxing for commandBuffer;
                 memcpy((uint32_t*)&pipelineStackSize, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (m_logCalls)
-                {
-                    fprintf(stderr, "stream %p: call vkCmdSetRayTracingPipelineStackSizeKHR 0x%llx 0x%llx \n", ioStream, (unsigned long long)commandBuffer, (unsigned long long)pipelineStackSize);
+                if (m_logCalls) {
+                    fprintf(
+                        stderr,
+                        "stream %p: call vkCmdSetRayTracingPipelineStackSizeKHR 0x%llx 0x%llx \n",
+                        ioStream, (unsigned long long)commandBuffer,
+                        (unsigned long long)pipelineStackSize);
                 }
-                vk->vkCmdSetRayTracingPipelineStackSizeKHR(unboxed_commandBuffer, pipelineStackSize);
+                vk->vkCmdSetRayTracingPipelineStackSizeKHR(unboxed_commandBuffer,
+                                                           pipelineStackSize);
                 vkStream->unsetHandleMapping();
-                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) - (uintptr_t)snapshotTraceBegin);
+                vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
+                                         (uintptr_t)snapshotTraceBegin);
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
-                if (m_state->snapshotsEnabled())
-                {
-                    m_state->snapshot()->vkCmdSetRayTracingPipelineStackSizeKHR(snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer, pipelineStackSize);
+                if (m_state->snapshotsEnabled()) {
+                    m_state->snapshot()->vkCmdSetRayTracingPipelineStackSizeKHR(
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, commandBuffer,
+                        pipelineStackSize);
                 }
                 vkReadStream->clearPool();
-                if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
+                if (queueSubmitWithCommandsEnabled)
+                    __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_KHR_ray_query
 #endif
-            default:
-            {
+            default: {
                 m_pool.freeAll();
-                return ptr - (unsigned char *)buf;
+                return ptr - (unsigned char*)buf;
             }
         }
         ptr += packetLen;
     }
-    if (m_forSnapshotLoad)
-    {
+    if (m_forSnapshotLoad) {
         m_state->clearCreatedHandlesForSnapshotLoad();
     }
     m_pool.freeAll();
-    return ptr - (unsigned char*)buf;;
+    return ptr - (unsigned char*)buf;
+    ;
 }
-
-
diff --git a/stream-servers/vulkan/VkDecoder.h b/stream-servers/vulkan/VkDecoder.h
index 9c42e19..f2a36e7 100644
--- a/stream-servers/vulkan/VkDecoder.h
+++ b/stream-servers/vulkan/VkDecoder.h
@@ -14,40 +14,45 @@
 // limitations under the License.
 
 // Autogenerated module VkDecoder
-// (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
+// (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml
+// cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
 // VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
 // VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+//
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o
+// $CEREAL_OUTPUT_DIR
+//
 #pragma once
 #include <vulkan/vulkan.h>
-#include "vulkan_gfxstream.h"
-
-#include "base/GfxApiLogger.h"
 
 #include <memory>
 
+#include "base/GfxApiLogger.h"
+#include "vulkan_gfxstream.h"
+
 namespace android {
 namespace base {
 class BumpPool;
-} // namespace android
-} // namespace base
-
-
-
+}  // namespace base
+}  // namespace android
 
 class IOStream;
 
 class VkDecoder {
-public:
+   public:
     VkDecoder();
     ~VkDecoder();
     void setForSnapshotLoad(bool forSnapshotLoad);
-    size_t decode(void* buf, size_t bufsize, IOStream* stream, uint32_t* seqnoPtr, emugl::GfxApiLogger& gfx_logger);
-private:
+    size_t decode(void* buf, size_t bufsize, IOStream* stream, uint32_t* seqnoPtr,
+                  emugl::GfxApiLogger& gfx_logger);
+
+   private:
     class Impl;
     std::unique_ptr<Impl> mImpl;
 };
@@ -593,5 +598,3 @@
 #endif
 #ifdef VK_KHR_ray_query
 #endif
-
-
diff --git a/stream-servers/vulkan/VkDecoderSnapshot.cpp b/stream-servers/vulkan/VkDecoderSnapshot.cpp
index a3345f0..f1971e8 100644
--- a/stream-servers/vulkan/VkDecoderSnapshot.cpp
+++ b/stream-servers/vulkan/VkDecoderSnapshot.cpp
@@ -14,3244 +14,2067 @@
 // limitations under the License.
 
 // Autogenerated module VkDecoderSnapshot
-// (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
+// (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal
+// -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
 // VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
 // VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+//
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o
+// $CEREAL_OUTPUT_DIR
+//
 
 #include "VkDecoderSnapshot.h"
 
-
-#include "VulkanHandleMapping.h"
 #include "VkDecoderGlobalState.h"
 #include "VkReconstruction.h"
-
+#include "VulkanHandleMapping.h"
 #include "base/Lock.h"
 
-
-
-
-
-
 using namespace goldfish_vk;
 using emugl::GfxApiLogger;
 
 class VkDecoderSnapshot::Impl {
-public:
-    Impl() { }
+   public:
+    Impl() {}
 
-    void save(android::base::Stream* stream) {
-        mReconstruction.save(stream);
-    }
+    void save(android::base::Stream* stream) { mReconstruction.save(stream); }
 
     void load(android::base::Stream* stream, GfxApiLogger& gfx_logger) {
         mReconstruction.load(stream, gfx_logger);
     }
 
 #ifdef VK_VERSION_1_0
-void vkCreateInstance(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    const VkInstanceCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkInstance* pInstance)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pInstance create
-    mReconstruction.addHandles((const uint64_t*)pInstance, 1);
-    if (!pInstance) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkCreateInstance, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pInstance, 1, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pInstance, 1);
-}
-void vkDestroyInstance(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkInstance instance,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // instance destroy
-    mReconstruction.removeHandles((const uint64_t*)(&instance), 1);
-}
-void vkEnumeratePhysicalDevices(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    uint32_t* pPhysicalDeviceCount,
-    VkPhysicalDevice* pPhysicalDevices)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pPhysicalDevices create
-    mReconstruction.addHandles((const uint64_t*)pPhysicalDevices, (*(pPhysicalDeviceCount)));
-    mReconstruction.addHandleDependency((const uint64_t*)pPhysicalDevices, (*(pPhysicalDeviceCount)), (uint64_t)(uintptr_t)instance);
-    if (!pPhysicalDevices) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkEnumeratePhysicalDevices, snapshotTraceBegin, snapshotTraceBytes);
-    if (pPhysicalDeviceCount)
-    {
-        mReconstruction.forEachHandleAddApi((const uint64_t*)pPhysicalDevices, (*(pPhysicalDeviceCount)), apiHandle);
-        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pPhysicalDevices, (*(pPhysicalDeviceCount)));
+    void vkCreateInstance(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                          android::base::BumpPool* pool, VkResult input_result,
+                          const VkInstanceCreateInfo* pCreateInfo,
+                          const VkAllocationCallbacks* pAllocator, VkInstance* pInstance) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pInstance create
+        mReconstruction.addHandles((const uint64_t*)pInstance, 1);
+        if (!pInstance) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreateInstance, snapshotTraceBegin,
+                                    snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pInstance, 1, apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pInstance, 1);
     }
-}
-void vkGetPhysicalDeviceFeatures(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    VkPhysicalDeviceFeatures* pFeatures)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDeviceFormatProperties(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    VkFormat format,
-    VkFormatProperties* pFormatProperties)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDeviceImageFormatProperties(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    VkFormat format,
-    VkImageType type,
-    VkImageTiling tiling,
-    VkImageUsageFlags usage,
-    VkImageCreateFlags flags,
-    VkImageFormatProperties* pImageFormatProperties)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDeviceProperties(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    VkPhysicalDeviceProperties* pProperties)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDeviceQueueFamilyProperties(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    uint32_t* pQueueFamilyPropertyCount,
-    VkQueueFamilyProperties* pQueueFamilyProperties)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDeviceMemoryProperties(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    VkPhysicalDeviceMemoryProperties* pMemoryProperties)
-{
-    // TODO: Implement
-}
-void vkGetInstanceProcAddr(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    PFN_vkVoidFunction input_result,
-    VkInstance instance,
-    const char* pName)
-{
-    // TODO: Implement
-}
-void vkGetDeviceProcAddr(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    PFN_vkVoidFunction input_result,
-    VkDevice device,
-    const char* pName)
-{
-    // TODO: Implement
-}
-void vkCreateDevice(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    const VkDeviceCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkDevice* pDevice)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pDevice create
-    mReconstruction.addHandles((const uint64_t*)pDevice, 1);
-    mReconstruction.addHandleDependency((const uint64_t*)pDevice, 1, (uint64_t)(uintptr_t)physicalDevice);
-    if (!pDevice) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkCreateDevice, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pDevice, 1, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pDevice, 1);
-}
-void vkDestroyDevice(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // device destroy
-    mReconstruction.removeHandles((const uint64_t*)(&device), 1);
-}
-void vkEnumerateInstanceExtensionProperties(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    const char* pLayerName,
-    uint32_t* pPropertyCount,
-    VkExtensionProperties* pProperties)
-{
-    // TODO: Implement
-}
-void vkEnumerateDeviceExtensionProperties(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    const char* pLayerName,
-    uint32_t* pPropertyCount,
-    VkExtensionProperties* pProperties)
-{
-    // TODO: Implement
-}
-void vkEnumerateInstanceLayerProperties(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    uint32_t* pPropertyCount,
-    VkLayerProperties* pProperties)
-{
-    // TODO: Implement
-}
-void vkEnumerateDeviceLayerProperties(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t* pPropertyCount,
-    VkLayerProperties* pProperties)
-{
-    // TODO: Implement
-}
-void vkGetDeviceQueue(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    uint32_t queueFamilyIndex,
-    uint32_t queueIndex,
-    VkQueue* pQueue)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pQueue create
-    mReconstruction.addHandles((const uint64_t*)pQueue, 1);
-    mReconstruction.addHandleDependency((const uint64_t*)pQueue, 1, (uint64_t)(uintptr_t)device);
-    if (!pQueue) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkGetDeviceQueue, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pQueue, 1, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pQueue, 1);
-}
-void vkQueueSubmit(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkQueue queue,
-    uint32_t submitCount,
-    const VkSubmitInfo* pSubmits,
-    VkFence fence)
-{
-    // TODO: Implement
-}
-void vkQueueWaitIdle(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkQueue queue)
-{
-    // TODO: Implement
-}
-void vkDeviceWaitIdle(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device)
-{
-    // TODO: Implement
-}
-void vkAllocateMemory(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkMemoryAllocateInfo* pAllocateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkDeviceMemory* pMemory)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pMemory create
-    mReconstruction.addHandles((const uint64_t*)pMemory, 1);
-    mReconstruction.addHandleDependency((const uint64_t*)pMemory, 1, (uint64_t)(uintptr_t)device);
-    if (!pMemory) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkAllocateMemory, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pMemory, 1, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pMemory, 1);
-}
-void vkFreeMemory(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkDeviceMemory memory,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // memory destroy
-    mReconstruction.removeHandles((const uint64_t*)(&memory), 1);
-}
-void vkMapMemory(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkDeviceMemory memory,
-    VkDeviceSize offset,
-    VkDeviceSize size,
-    VkMemoryMapFlags flags,
-    void** ppData)
-{
-    // TODO: Implement
-}
-void vkUnmapMemory(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkDeviceMemory memory)
-{
-    // TODO: Implement
-}
-void vkFlushMappedMemoryRanges(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    uint32_t memoryRangeCount,
-    const VkMappedMemoryRange* pMemoryRanges)
-{
-    // TODO: Implement
-}
-void vkInvalidateMappedMemoryRanges(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    uint32_t memoryRangeCount,
-    const VkMappedMemoryRange* pMemoryRanges)
-{
-    // TODO: Implement
-}
-void vkGetDeviceMemoryCommitment(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkDeviceMemory memory,
-    VkDeviceSize* pCommittedMemoryInBytes)
-{
-    // TODO: Implement
-}
-void vkBindBufferMemory(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkBuffer buffer,
-    VkDeviceMemory memory,
-    VkDeviceSize memoryOffset)
-{
-    // TODO: Implement
-}
-void vkBindImageMemory(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkImage image,
-    VkDeviceMemory memory,
-    VkDeviceSize memoryOffset)
-{
-    // TODO: Implement
-}
-void vkGetBufferMemoryRequirements(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkBuffer buffer,
-    VkMemoryRequirements* pMemoryRequirements)
-{
-    // TODO: Implement
-}
-void vkGetImageMemoryRequirements(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkImage image,
-    VkMemoryRequirements* pMemoryRequirements)
-{
-    // TODO: Implement
-}
-void vkGetImageSparseMemoryRequirements(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkImage image,
-    uint32_t* pSparseMemoryRequirementCount,
-    VkSparseImageMemoryRequirements* pSparseMemoryRequirements)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDeviceSparseImageFormatProperties(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    VkFormat format,
-    VkImageType type,
-    VkSampleCountFlagBits samples,
-    VkImageUsageFlags usage,
-    VkImageTiling tiling,
-    uint32_t* pPropertyCount,
-    VkSparseImageFormatProperties* pProperties)
-{
-    // TODO: Implement
-}
-void vkQueueBindSparse(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkQueue queue,
-    uint32_t bindInfoCount,
-    const VkBindSparseInfo* pBindInfo,
-    VkFence fence)
-{
-    // TODO: Implement
-}
-void vkCreateFence(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkFenceCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkFence* pFence)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pFence create
-    mReconstruction.addHandles((const uint64_t*)pFence, 1);
-    mReconstruction.addHandleDependency((const uint64_t*)pFence, 1, (uint64_t)(uintptr_t)device);
-    if (!pFence) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkCreateFence, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pFence, 1, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pFence, 1);
-}
-void vkDestroyFence(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkFence fence,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // fence destroy
-    mReconstruction.removeHandles((const uint64_t*)(&fence), 1);
-}
-void vkResetFences(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    uint32_t fenceCount,
-    const VkFence* pFences)
-{
-    // TODO: Implement
-}
-void vkGetFenceStatus(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkFence fence)
-{
-    // TODO: Implement
-}
-void vkWaitForFences(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    uint32_t fenceCount,
-    const VkFence* pFences,
-    VkBool32 waitAll,
-    uint64_t timeout)
-{
-    // TODO: Implement
-}
-void vkCreateSemaphore(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkSemaphoreCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSemaphore* pSemaphore)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pSemaphore create
-    mReconstruction.addHandles((const uint64_t*)pSemaphore, 1);
-    mReconstruction.addHandleDependency((const uint64_t*)pSemaphore, 1, (uint64_t)(uintptr_t)device);
-    if (!pSemaphore) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkCreateSemaphore, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pSemaphore, 1, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pSemaphore, 1);
-}
-void vkDestroySemaphore(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkSemaphore semaphore,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // semaphore destroy
-    mReconstruction.removeHandles((const uint64_t*)(&semaphore), 1);
-}
-void vkCreateEvent(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkEventCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkEvent* pEvent)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pEvent create
-    mReconstruction.addHandles((const uint64_t*)pEvent, 1);
-    mReconstruction.addHandleDependency((const uint64_t*)pEvent, 1, (uint64_t)(uintptr_t)device);
-    if (!pEvent) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkCreateEvent, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pEvent, 1, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pEvent, 1);
-}
-void vkDestroyEvent(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkEvent event,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // event destroy
-    mReconstruction.removeHandles((const uint64_t*)(&event), 1);
-}
-void vkGetEventStatus(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkEvent event)
-{
-    // TODO: Implement
-}
-void vkSetEvent(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkEvent event)
-{
-    // TODO: Implement
-}
-void vkResetEvent(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkEvent event)
-{
-    // TODO: Implement
-}
-void vkCreateQueryPool(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkQueryPoolCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkQueryPool* pQueryPool)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pQueryPool create
-    mReconstruction.addHandles((const uint64_t*)pQueryPool, 1);
-    mReconstruction.addHandleDependency((const uint64_t*)pQueryPool, 1, (uint64_t)(uintptr_t)device);
-    if (!pQueryPool) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkCreateQueryPool, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pQueryPool, 1, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pQueryPool, 1);
-}
-void vkDestroyQueryPool(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkQueryPool queryPool,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // queryPool destroy
-    mReconstruction.removeHandles((const uint64_t*)(&queryPool), 1);
-}
-void vkGetQueryPoolResults(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkQueryPool queryPool,
-    uint32_t firstQuery,
-    uint32_t queryCount,
-    size_t dataSize,
-    void* pData,
-    VkDeviceSize stride,
-    VkQueryResultFlags flags)
-{
-    // TODO: Implement
-}
-void vkCreateBuffer(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkBufferCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkBuffer* pBuffer)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pBuffer create
-    mReconstruction.addHandles((const uint64_t*)pBuffer, 1);
-    mReconstruction.addHandleDependency((const uint64_t*)pBuffer, 1, (uint64_t)(uintptr_t)device);
-    if (!pBuffer) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkCreateBuffer, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pBuffer, 1, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pBuffer, 1);
-}
-void vkDestroyBuffer(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkBuffer buffer,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // buffer destroy
-    mReconstruction.removeHandles((const uint64_t*)(&buffer), 1);
-}
-void vkCreateBufferView(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkBufferViewCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkBufferView* pView)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pView create
-    mReconstruction.addHandles((const uint64_t*)pView, 1);
-    mReconstruction.addHandleDependency((const uint64_t*)pView, 1, (uint64_t)(uintptr_t)device);
-    if (!pView) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkCreateBufferView, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pView, 1, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pView, 1);
-}
-void vkDestroyBufferView(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkBufferView bufferView,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // bufferView destroy
-    mReconstruction.removeHandles((const uint64_t*)(&bufferView), 1);
-}
-void vkCreateImage(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkImageCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkImage* pImage)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pImage create
-    mReconstruction.addHandles((const uint64_t*)pImage, 1);
-    mReconstruction.addHandleDependency((const uint64_t*)pImage, 1, (uint64_t)(uintptr_t)device);
-    if (!pImage) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkCreateImage, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pImage, 1, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pImage, 1);
-}
-void vkDestroyImage(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkImage image,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // image destroy
-    mReconstruction.removeHandles((const uint64_t*)(&image), 1);
-}
-void vkGetImageSubresourceLayout(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkImage image,
-    const VkImageSubresource* pSubresource,
-    VkSubresourceLayout* pLayout)
-{
-    // TODO: Implement
-}
-void vkCreateImageView(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkImageViewCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkImageView* pView)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pView create
-    mReconstruction.addHandles((const uint64_t*)pView, 1);
-    mReconstruction.addHandleDependency((const uint64_t*)pView, 1, (uint64_t)(uintptr_t)device);
-    if (!pView) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkCreateImageView, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pView, 1, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pView, 1);
-}
-void vkDestroyImageView(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkImageView imageView,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // imageView destroy
-    mReconstruction.removeHandles((const uint64_t*)(&imageView), 1);
-}
-void vkCreateShaderModule(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkShaderModuleCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkShaderModule* pShaderModule)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pShaderModule create
-    mReconstruction.addHandles((const uint64_t*)pShaderModule, 1);
-    mReconstruction.addHandleDependency((const uint64_t*)pShaderModule, 1, (uint64_t)(uintptr_t)device);
-    if (!pShaderModule) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkCreateShaderModule, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pShaderModule, 1, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pShaderModule, 1);
-}
-void vkDestroyShaderModule(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkShaderModule shaderModule,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // shaderModule destroy
-    mReconstruction.removeHandles((const uint64_t*)(&shaderModule), 1);
-}
-void vkCreatePipelineCache(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkPipelineCacheCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkPipelineCache* pPipelineCache)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pPipelineCache create
-    mReconstruction.addHandles((const uint64_t*)pPipelineCache, 1);
-    mReconstruction.addHandleDependency((const uint64_t*)pPipelineCache, 1, (uint64_t)(uintptr_t)device);
-    if (!pPipelineCache) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkCreatePipelineCache, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pPipelineCache, 1, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pPipelineCache, 1);
-}
-void vkDestroyPipelineCache(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkPipelineCache pipelineCache,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pipelineCache destroy
-    mReconstruction.removeHandles((const uint64_t*)(&pipelineCache), 1);
-}
-void vkGetPipelineCacheData(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkPipelineCache pipelineCache,
-    size_t* pDataSize,
-    void* pData)
-{
-    // TODO: Implement
-}
-void vkMergePipelineCaches(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkPipelineCache dstCache,
-    uint32_t srcCacheCount,
-    const VkPipelineCache* pSrcCaches)
-{
-    // TODO: Implement
-}
-void vkCreateGraphicsPipelines(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkPipelineCache pipelineCache,
-    uint32_t createInfoCount,
-    const VkGraphicsPipelineCreateInfo* pCreateInfos,
-    const VkAllocationCallbacks* pAllocator,
-    VkPipeline* pPipelines)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pPipelines create
-    mReconstruction.addHandles((const uint64_t*)pPipelines, ((createInfoCount)));
-    mReconstruction.addHandleDependency((const uint64_t*)pPipelines, ((createInfoCount)), (uint64_t)(uintptr_t)device);
-    if (!pPipelines) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkCreateGraphicsPipelines, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pPipelines, ((createInfoCount)), apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pPipelines, ((createInfoCount)));
-}
-void vkCreateComputePipelines(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkPipelineCache pipelineCache,
-    uint32_t createInfoCount,
-    const VkComputePipelineCreateInfo* pCreateInfos,
-    const VkAllocationCallbacks* pAllocator,
-    VkPipeline* pPipelines)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pPipelines create
-    mReconstruction.addHandles((const uint64_t*)pPipelines, ((createInfoCount)));
-    mReconstruction.addHandleDependency((const uint64_t*)pPipelines, ((createInfoCount)), (uint64_t)(uintptr_t)device);
-    if (!pPipelines) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkCreateComputePipelines, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pPipelines, ((createInfoCount)), apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pPipelines, ((createInfoCount)));
-}
-void vkDestroyPipeline(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkPipeline pipeline,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pipeline destroy
-    mReconstruction.removeHandles((const uint64_t*)(&pipeline), 1);
-}
-void vkCreatePipelineLayout(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkPipelineLayoutCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkPipelineLayout* pPipelineLayout)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pPipelineLayout create
-    mReconstruction.addHandles((const uint64_t*)pPipelineLayout, 1);
-    mReconstruction.addHandleDependency((const uint64_t*)pPipelineLayout, 1, (uint64_t)(uintptr_t)device);
-    if (!pPipelineLayout) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkCreatePipelineLayout, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pPipelineLayout, 1, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pPipelineLayout, 1);
-}
-void vkDestroyPipelineLayout(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkPipelineLayout pipelineLayout,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pipelineLayout destroy
-    mReconstruction.removeHandles((const uint64_t*)(&pipelineLayout), 1);
-}
-void vkCreateSampler(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkSamplerCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSampler* pSampler)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pSampler create
-    mReconstruction.addHandles((const uint64_t*)pSampler, 1);
-    mReconstruction.addHandleDependency((const uint64_t*)pSampler, 1, (uint64_t)(uintptr_t)device);
-    if (!pSampler) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkCreateSampler, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pSampler, 1, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pSampler, 1);
-}
-void vkDestroySampler(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkSampler sampler,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // sampler destroy
-    mReconstruction.removeHandles((const uint64_t*)(&sampler), 1);
-}
-void vkCreateDescriptorSetLayout(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkDescriptorSetLayout* pSetLayout)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pSetLayout create
-    mReconstruction.addHandles((const uint64_t*)pSetLayout, 1);
-    mReconstruction.addHandleDependency((const uint64_t*)pSetLayout, 1, (uint64_t)(uintptr_t)device);
-    if (!pSetLayout) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkCreateDescriptorSetLayout, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pSetLayout, 1, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pSetLayout, 1);
-}
-void vkDestroyDescriptorSetLayout(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkDescriptorSetLayout descriptorSetLayout,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // descriptorSetLayout destroy
-    mReconstruction.removeHandles((const uint64_t*)(&descriptorSetLayout), 1);
-}
-void vkCreateDescriptorPool(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkDescriptorPoolCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkDescriptorPool* pDescriptorPool)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pDescriptorPool create
-    mReconstruction.addHandles((const uint64_t*)pDescriptorPool, 1);
-    mReconstruction.addHandleDependency((const uint64_t*)pDescriptorPool, 1, (uint64_t)(uintptr_t)device);
-    if (!pDescriptorPool) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkCreateDescriptorPool, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pDescriptorPool, 1, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pDescriptorPool, 1);
-}
-void vkDestroyDescriptorPool(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkDescriptorPool descriptorPool,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // descriptorPool destroy
-    mReconstruction.removeHandles((const uint64_t*)(&descriptorPool), 1);
-}
-void vkResetDescriptorPool(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkDescriptorPool descriptorPool,
-    VkDescriptorPoolResetFlags flags)
-{
-    // TODO: Implement
-}
-void vkAllocateDescriptorSets(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkDescriptorSetAllocateInfo* pAllocateInfo,
-    VkDescriptorSet* pDescriptorSets)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pDescriptorSets create
-    mReconstruction.addHandles((const uint64_t*)pDescriptorSets, pAllocateInfo->descriptorSetCount);
-    mReconstruction.addHandleDependency((const uint64_t*)pDescriptorSets, pAllocateInfo->descriptorSetCount, (uint64_t)(uintptr_t)device);
-    if (!pDescriptorSets) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkAllocateDescriptorSets, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pDescriptorSets, pAllocateInfo->descriptorSetCount, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pDescriptorSets, pAllocateInfo->descriptorSetCount);
-}
-void vkFreeDescriptorSets(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkDescriptorPool descriptorPool,
-    uint32_t descriptorSetCount,
-    const VkDescriptorSet* pDescriptorSets)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pDescriptorSets destroy
-    mReconstruction.removeHandles((const uint64_t*)pDescriptorSets, ((descriptorSetCount)));
-}
-void vkUpdateDescriptorSets(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    uint32_t descriptorWriteCount,
-    const VkWriteDescriptorSet* pDescriptorWrites,
-    uint32_t descriptorCopyCount,
-    const VkCopyDescriptorSet* pDescriptorCopies)
-{
-    // TODO: Implement
-}
-void vkCreateFramebuffer(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkFramebufferCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkFramebuffer* pFramebuffer)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pFramebuffer create
-    mReconstruction.addHandles((const uint64_t*)pFramebuffer, 1);
-    mReconstruction.addHandleDependency((const uint64_t*)pFramebuffer, 1, (uint64_t)(uintptr_t)device);
-    if (!pFramebuffer) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkCreateFramebuffer, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pFramebuffer, 1, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pFramebuffer, 1);
-}
-void vkDestroyFramebuffer(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkFramebuffer framebuffer,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // framebuffer destroy
-    mReconstruction.removeHandles((const uint64_t*)(&framebuffer), 1);
-}
-void vkCreateRenderPass(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkRenderPassCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkRenderPass* pRenderPass)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pRenderPass create
-    mReconstruction.addHandles((const uint64_t*)pRenderPass, 1);
-    mReconstruction.addHandleDependency((const uint64_t*)pRenderPass, 1, (uint64_t)(uintptr_t)device);
-    if (!pRenderPass) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkCreateRenderPass, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pRenderPass, 1, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pRenderPass, 1);
-}
-void vkDestroyRenderPass(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkRenderPass renderPass,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // renderPass destroy
-    mReconstruction.removeHandles((const uint64_t*)(&renderPass), 1);
-}
-void vkGetRenderAreaGranularity(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkRenderPass renderPass,
-    VkExtent2D* pGranularity)
-{
-    // TODO: Implement
-}
-void vkCreateCommandPool(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkCommandPoolCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkCommandPool* pCommandPool)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pCommandPool create
-    mReconstruction.addHandles((const uint64_t*)pCommandPool, 1);
-    mReconstruction.addHandleDependency((const uint64_t*)pCommandPool, 1, (uint64_t)(uintptr_t)device);
-    if (!pCommandPool) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkCreateCommandPool, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pCommandPool, 1, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pCommandPool, 1);
-}
-void vkDestroyCommandPool(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkCommandPool commandPool,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // commandPool destroy
-    mReconstruction.removeHandles((const uint64_t*)(&commandPool), 1);
-}
-void vkResetCommandPool(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkCommandPool commandPool,
-    VkCommandPoolResetFlags flags)
-{
-    // TODO: Implement
-}
-void vkAllocateCommandBuffers(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkCommandBufferAllocateInfo* pAllocateInfo,
-    VkCommandBuffer* pCommandBuffers)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pCommandBuffers create
-    mReconstruction.addHandles((const uint64_t*)pCommandBuffers, pAllocateInfo->commandBufferCount);
-    mReconstruction.addHandleDependency((const uint64_t*)pCommandBuffers, pAllocateInfo->commandBufferCount, (uint64_t)(uintptr_t)unboxed_to_boxed_non_dispatchable_VkCommandPool(pAllocateInfo->commandPool));
-    if (!pCommandBuffers) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkAllocateCommandBuffers, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pCommandBuffers, pAllocateInfo->commandBufferCount, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pCommandBuffers, pAllocateInfo->commandBufferCount);
-}
-void vkFreeCommandBuffers(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkCommandPool commandPool,
-    uint32_t commandBufferCount,
-    const VkCommandBuffer* pCommandBuffers)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pCommandBuffers destroy
-    mReconstruction.removeHandles((const uint64_t*)pCommandBuffers, ((commandBufferCount)));
-}
-void vkBeginCommandBuffer(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkCommandBuffer commandBuffer,
-    const VkCommandBufferBeginInfo* pBeginInfo)
-{
-    // TODO: Implement
-}
-void vkEndCommandBuffer(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkCommandBuffer commandBuffer)
-{
-    // TODO: Implement
-}
-void vkResetCommandBuffer(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkCommandBuffer commandBuffer,
-    VkCommandBufferResetFlags flags)
-{
-    // TODO: Implement
-}
-void vkCmdBindPipeline(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkPipelineBindPoint pipelineBindPoint,
-    VkPipeline pipeline)
-{
-    // TODO: Implement
-}
-void vkCmdSetViewport(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t firstViewport,
-    uint32_t viewportCount,
-    const VkViewport* pViewports)
-{
-    // TODO: Implement
-}
-void vkCmdSetScissor(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t firstScissor,
-    uint32_t scissorCount,
-    const VkRect2D* pScissors)
-{
-    // TODO: Implement
-}
-void vkCmdSetLineWidth(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    float lineWidth)
-{
-    // TODO: Implement
-}
-void vkCmdSetDepthBias(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    float depthBiasConstantFactor,
-    float depthBiasClamp,
-    float depthBiasSlopeFactor)
-{
-    // TODO: Implement
-}
-void vkCmdSetBlendConstants(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const float blendConstants[4])
-{
-    // TODO: Implement
-}
-void vkCmdSetDepthBounds(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    float minDepthBounds,
-    float maxDepthBounds)
-{
-    // TODO: Implement
-}
-void vkCmdSetStencilCompareMask(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkStencilFaceFlags faceMask,
-    uint32_t compareMask)
-{
-    // TODO: Implement
-}
-void vkCmdSetStencilWriteMask(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkStencilFaceFlags faceMask,
-    uint32_t writeMask)
-{
-    // TODO: Implement
-}
-void vkCmdSetStencilReference(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkStencilFaceFlags faceMask,
-    uint32_t reference)
-{
-    // TODO: Implement
-}
-void vkCmdBindDescriptorSets(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkPipelineBindPoint pipelineBindPoint,
-    VkPipelineLayout layout,
-    uint32_t firstSet,
-    uint32_t descriptorSetCount,
-    const VkDescriptorSet* pDescriptorSets,
-    uint32_t dynamicOffsetCount,
-    const uint32_t* pDynamicOffsets)
-{
-    // TODO: Implement
-}
-void vkCmdBindIndexBuffer(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBuffer buffer,
-    VkDeviceSize offset,
-    VkIndexType indexType)
-{
-    // TODO: Implement
-}
-void vkCmdBindVertexBuffers(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t firstBinding,
-    uint32_t bindingCount,
-    const VkBuffer* pBuffers,
-    const VkDeviceSize* pOffsets)
-{
-    // TODO: Implement
-}
-void vkCmdDraw(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t vertexCount,
-    uint32_t instanceCount,
-    uint32_t firstVertex,
-    uint32_t firstInstance)
-{
-    // TODO: Implement
-}
-void vkCmdDrawIndexed(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t indexCount,
-    uint32_t instanceCount,
-    uint32_t firstIndex,
-    int32_t vertexOffset,
-    uint32_t firstInstance)
-{
-    // TODO: Implement
-}
-void vkCmdDrawIndirect(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBuffer buffer,
-    VkDeviceSize offset,
-    uint32_t drawCount,
-    uint32_t stride)
-{
-    // TODO: Implement
-}
-void vkCmdDrawIndexedIndirect(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBuffer buffer,
-    VkDeviceSize offset,
-    uint32_t drawCount,
-    uint32_t stride)
-{
-    // TODO: Implement
-}
-void vkCmdDispatch(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t groupCountX,
-    uint32_t groupCountY,
-    uint32_t groupCountZ)
-{
-    // TODO: Implement
-}
-void vkCmdDispatchIndirect(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBuffer buffer,
-    VkDeviceSize offset)
-{
-    // TODO: Implement
-}
-void vkCmdCopyBuffer(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBuffer srcBuffer,
-    VkBuffer dstBuffer,
-    uint32_t regionCount,
-    const VkBufferCopy* pRegions)
-{
-    // TODO: Implement
-}
-void vkCmdCopyImage(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkImage srcImage,
-    VkImageLayout srcImageLayout,
-    VkImage dstImage,
-    VkImageLayout dstImageLayout,
-    uint32_t regionCount,
-    const VkImageCopy* pRegions)
-{
-    // TODO: Implement
-}
-void vkCmdBlitImage(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkImage srcImage,
-    VkImageLayout srcImageLayout,
-    VkImage dstImage,
-    VkImageLayout dstImageLayout,
-    uint32_t regionCount,
-    const VkImageBlit* pRegions,
-    VkFilter filter)
-{
-    // TODO: Implement
-}
-void vkCmdCopyBufferToImage(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBuffer srcBuffer,
-    VkImage dstImage,
-    VkImageLayout dstImageLayout,
-    uint32_t regionCount,
-    const VkBufferImageCopy* pRegions)
-{
-    // TODO: Implement
-}
-void vkCmdCopyImageToBuffer(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkImage srcImage,
-    VkImageLayout srcImageLayout,
-    VkBuffer dstBuffer,
-    uint32_t regionCount,
-    const VkBufferImageCopy* pRegions)
-{
-    // TODO: Implement
-}
-void vkCmdUpdateBuffer(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBuffer dstBuffer,
-    VkDeviceSize dstOffset,
-    VkDeviceSize dataSize,
-    const void* pData)
-{
-    // TODO: Implement
-}
-void vkCmdFillBuffer(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBuffer dstBuffer,
-    VkDeviceSize dstOffset,
-    VkDeviceSize size,
-    uint32_t data)
-{
-    // TODO: Implement
-}
-void vkCmdClearColorImage(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkImage image,
-    VkImageLayout imageLayout,
-    const VkClearColorValue* pColor,
-    uint32_t rangeCount,
-    const VkImageSubresourceRange* pRanges)
-{
-    // TODO: Implement
-}
-void vkCmdClearDepthStencilImage(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkImage image,
-    VkImageLayout imageLayout,
-    const VkClearDepthStencilValue* pDepthStencil,
-    uint32_t rangeCount,
-    const VkImageSubresourceRange* pRanges)
-{
-    // TODO: Implement
-}
-void vkCmdClearAttachments(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t attachmentCount,
-    const VkClearAttachment* pAttachments,
-    uint32_t rectCount,
-    const VkClearRect* pRects)
-{
-    // TODO: Implement
-}
-void vkCmdResolveImage(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkImage srcImage,
-    VkImageLayout srcImageLayout,
-    VkImage dstImage,
-    VkImageLayout dstImageLayout,
-    uint32_t regionCount,
-    const VkImageResolve* pRegions)
-{
-    // TODO: Implement
-}
-void vkCmdSetEvent(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkEvent event,
-    VkPipelineStageFlags stageMask)
-{
-    // TODO: Implement
-}
-void vkCmdResetEvent(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkEvent event,
-    VkPipelineStageFlags stageMask)
-{
-    // TODO: Implement
-}
-void vkCmdWaitEvents(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t eventCount,
-    const VkEvent* pEvents,
-    VkPipelineStageFlags srcStageMask,
-    VkPipelineStageFlags dstStageMask,
-    uint32_t memoryBarrierCount,
-    const VkMemoryBarrier* pMemoryBarriers,
-    uint32_t bufferMemoryBarrierCount,
-    const VkBufferMemoryBarrier* pBufferMemoryBarriers,
-    uint32_t imageMemoryBarrierCount,
-    const VkImageMemoryBarrier* pImageMemoryBarriers)
-{
-    // TODO: Implement
-}
-void vkCmdPipelineBarrier(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkPipelineStageFlags srcStageMask,
-    VkPipelineStageFlags dstStageMask,
-    VkDependencyFlags dependencyFlags,
-    uint32_t memoryBarrierCount,
-    const VkMemoryBarrier* pMemoryBarriers,
-    uint32_t bufferMemoryBarrierCount,
-    const VkBufferMemoryBarrier* pBufferMemoryBarriers,
-    uint32_t imageMemoryBarrierCount,
-    const VkImageMemoryBarrier* pImageMemoryBarriers)
-{
-    // TODO: Implement
-}
-void vkCmdBeginQuery(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkQueryPool queryPool,
-    uint32_t query,
-    VkQueryControlFlags flags)
-{
-    // TODO: Implement
-}
-void vkCmdEndQuery(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkQueryPool queryPool,
-    uint32_t query)
-{
-    // TODO: Implement
-}
-void vkCmdResetQueryPool(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkQueryPool queryPool,
-    uint32_t firstQuery,
-    uint32_t queryCount)
-{
-    // TODO: Implement
-}
-void vkCmdWriteTimestamp(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkPipelineStageFlagBits pipelineStage,
-    VkQueryPool queryPool,
-    uint32_t query)
-{
-    // TODO: Implement
-}
-void vkCmdCopyQueryPoolResults(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkQueryPool queryPool,
-    uint32_t firstQuery,
-    uint32_t queryCount,
-    VkBuffer dstBuffer,
-    VkDeviceSize dstOffset,
-    VkDeviceSize stride,
-    VkQueryResultFlags flags)
-{
-    // TODO: Implement
-}
-void vkCmdPushConstants(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkPipelineLayout layout,
-    VkShaderStageFlags stageFlags,
-    uint32_t offset,
-    uint32_t size,
-    const void* pValues)
-{
-    // TODO: Implement
-}
-void vkCmdBeginRenderPass(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkRenderPassBeginInfo* pRenderPassBegin,
-    VkSubpassContents contents)
-{
-    // TODO: Implement
-}
-void vkCmdNextSubpass(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkSubpassContents contents)
-{
-    // TODO: Implement
-}
-void vkCmdEndRenderPass(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer)
-{
-    // TODO: Implement
-}
-void vkCmdExecuteCommands(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t commandBufferCount,
-    const VkCommandBuffer* pCommandBuffers)
-{
-    // TODO: Implement
-}
+    void vkDestroyInstance(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkInstance instance,
+                           const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // instance destroy
+        mReconstruction.removeHandles((const uint64_t*)(&instance), 1);
+    }
+    void vkEnumeratePhysicalDevices(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkResult input_result,
+                                    VkInstance instance, uint32_t* pPhysicalDeviceCount,
+                                    VkPhysicalDevice* pPhysicalDevices) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pPhysicalDevices create
+        mReconstruction.addHandles((const uint64_t*)pPhysicalDevices, (*(pPhysicalDeviceCount)));
+        mReconstruction.addHandleDependency((const uint64_t*)pPhysicalDevices,
+                                            (*(pPhysicalDeviceCount)),
+                                            (uint64_t)(uintptr_t)instance);
+        if (!pPhysicalDevices) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkEnumeratePhysicalDevices, snapshotTraceBegin,
+                                    snapshotTraceBytes);
+        if (pPhysicalDeviceCount) {
+            mReconstruction.forEachHandleAddApi((const uint64_t*)pPhysicalDevices,
+                                                (*(pPhysicalDeviceCount)), apiHandle);
+            mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pPhysicalDevices,
+                                                    (*(pPhysicalDeviceCount)));
+        }
+    }
+    void vkGetPhysicalDeviceFeatures(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkPhysicalDevice physicalDevice,
+                                     VkPhysicalDeviceFeatures* pFeatures) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDeviceFormatProperties(const uint8_t* snapshotTraceBegin,
+                                             size_t snapshotTraceBytes,
+                                             android::base::BumpPool* pool,
+                                             VkPhysicalDevice physicalDevice, VkFormat format,
+                                             VkFormatProperties* pFormatProperties) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDeviceImageFormatProperties(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
+        VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags,
+        VkImageFormatProperties* pImageFormatProperties) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDeviceProperties(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool,
+                                       VkPhysicalDevice physicalDevice,
+                                       VkPhysicalDeviceProperties* pProperties) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDeviceQueueFamilyProperties(const uint8_t* snapshotTraceBegin,
+                                                  size_t snapshotTraceBytes,
+                                                  android::base::BumpPool* pool,
+                                                  VkPhysicalDevice physicalDevice,
+                                                  uint32_t* pQueueFamilyPropertyCount,
+                                                  VkQueueFamilyProperties* pQueueFamilyProperties) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDeviceMemoryProperties(const uint8_t* snapshotTraceBegin,
+                                             size_t snapshotTraceBytes,
+                                             android::base::BumpPool* pool,
+                                             VkPhysicalDevice physicalDevice,
+                                             VkPhysicalDeviceMemoryProperties* pMemoryProperties) {
+        // TODO: Implement
+    }
+    void vkGetInstanceProcAddr(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, PFN_vkVoidFunction input_result,
+                               VkInstance instance, const char* pName) {
+        // TODO: Implement
+    }
+    void vkGetDeviceProcAddr(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, PFN_vkVoidFunction input_result,
+                             VkDevice device, const char* pName) {
+        // TODO: Implement
+    }
+    void vkCreateDevice(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                        android::base::BumpPool* pool, VkResult input_result,
+                        VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo* pCreateInfo,
+                        const VkAllocationCallbacks* pAllocator, VkDevice* pDevice) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pDevice create
+        mReconstruction.addHandles((const uint64_t*)pDevice, 1);
+        mReconstruction.addHandleDependency((const uint64_t*)pDevice, 1,
+                                            (uint64_t)(uintptr_t)physicalDevice);
+        if (!pDevice) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreateDevice, snapshotTraceBegin,
+                                    snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pDevice, 1, apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pDevice, 1);
+    }
+    void vkDestroyDevice(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                         android::base::BumpPool* pool, VkDevice device,
+                         const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // device destroy
+        mReconstruction.removeHandles((const uint64_t*)(&device), 1);
+    }
+    void vkEnumerateInstanceExtensionProperties(const uint8_t* snapshotTraceBegin,
+                                                size_t snapshotTraceBytes,
+                                                android::base::BumpPool* pool,
+                                                VkResult input_result, const char* pLayerName,
+                                                uint32_t* pPropertyCount,
+                                                VkExtensionProperties* pProperties) {
+        // TODO: Implement
+    }
+    void vkEnumerateDeviceExtensionProperties(const uint8_t* snapshotTraceBegin,
+                                              size_t snapshotTraceBytes,
+                                              android::base::BumpPool* pool, VkResult input_result,
+                                              VkPhysicalDevice physicalDevice,
+                                              const char* pLayerName, uint32_t* pPropertyCount,
+                                              VkExtensionProperties* pProperties) {
+        // TODO: Implement
+    }
+    void vkEnumerateInstanceLayerProperties(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool, VkResult input_result,
+                                            uint32_t* pPropertyCount,
+                                            VkLayerProperties* pProperties) {
+        // TODO: Implement
+    }
+    void vkEnumerateDeviceLayerProperties(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkResult input_result, VkPhysicalDevice physicalDevice,
+                                          uint32_t* pPropertyCount,
+                                          VkLayerProperties* pProperties) {
+        // TODO: Implement
+    }
+    void vkGetDeviceQueue(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                          android::base::BumpPool* pool, VkDevice device, uint32_t queueFamilyIndex,
+                          uint32_t queueIndex, VkQueue* pQueue) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pQueue create
+        mReconstruction.addHandles((const uint64_t*)pQueue, 1);
+        mReconstruction.addHandleDependency((const uint64_t*)pQueue, 1,
+                                            (uint64_t)(uintptr_t)device);
+        if (!pQueue) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkGetDeviceQueue, snapshotTraceBegin,
+                                    snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pQueue, 1, apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pQueue, 1);
+    }
+    void vkQueueSubmit(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                       android::base::BumpPool* pool, VkResult input_result, VkQueue queue,
+                       uint32_t submitCount, const VkSubmitInfo* pSubmits, VkFence fence) {
+        // TODO: Implement
+    }
+    void vkQueueWaitIdle(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                         android::base::BumpPool* pool, VkResult input_result, VkQueue queue) {
+        // TODO: Implement
+    }
+    void vkDeviceWaitIdle(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                          android::base::BumpPool* pool, VkResult input_result, VkDevice device) {
+        // TODO: Implement
+    }
+    void vkAllocateMemory(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                          android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                          const VkMemoryAllocateInfo* pAllocateInfo,
+                          const VkAllocationCallbacks* pAllocator, VkDeviceMemory* pMemory) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pMemory create
+        mReconstruction.addHandles((const uint64_t*)pMemory, 1);
+        mReconstruction.addHandleDependency((const uint64_t*)pMemory, 1,
+                                            (uint64_t)(uintptr_t)device);
+        if (!pMemory) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkAllocateMemory, snapshotTraceBegin,
+                                    snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pMemory, 1, apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pMemory, 1);
+    }
+    void vkFreeMemory(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                      android::base::BumpPool* pool, VkDevice device, VkDeviceMemory memory,
+                      const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // memory destroy
+        mReconstruction.removeHandles((const uint64_t*)(&memory), 1);
+    }
+    void vkMapMemory(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                     android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                     VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size,
+                     VkMemoryMapFlags flags, void** ppData) {
+        // TODO: Implement
+    }
+    void vkUnmapMemory(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                       android::base::BumpPool* pool, VkDevice device, VkDeviceMemory memory) {
+        // TODO: Implement
+    }
+    void vkFlushMappedMemoryRanges(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                   android::base::BumpPool* pool, VkResult input_result,
+                                   VkDevice device, uint32_t memoryRangeCount,
+                                   const VkMappedMemoryRange* pMemoryRanges) {
+        // TODO: Implement
+    }
+    void vkInvalidateMappedMemoryRanges(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkResult input_result, VkDevice device,
+                                        uint32_t memoryRangeCount,
+                                        const VkMappedMemoryRange* pMemoryRanges) {
+        // TODO: Implement
+    }
+    void vkGetDeviceMemoryCommitment(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkDevice device,
+                                     VkDeviceMemory memory, VkDeviceSize* pCommittedMemoryInBytes) {
+        // TODO: Implement
+    }
+    void vkBindBufferMemory(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                            VkBuffer buffer, VkDeviceMemory memory, VkDeviceSize memoryOffset) {
+        // TODO: Implement
+    }
+    void vkBindImageMemory(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                           VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset) {
+        // TODO: Implement
+    }
+    void vkGetBufferMemoryRequirements(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool, VkDevice device,
+                                       VkBuffer buffer, VkMemoryRequirements* pMemoryRequirements) {
+        // TODO: Implement
+    }
+    void vkGetImageMemoryRequirements(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkDevice device, VkImage image,
+                                      VkMemoryRequirements* pMemoryRequirements) {
+        // TODO: Implement
+    }
+    void vkGetImageSparseMemoryRequirements(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkDevice device, VkImage image, uint32_t* pSparseMemoryRequirementCount,
+        VkSparseImageMemoryRequirements* pSparseMemoryRequirements) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDeviceSparseImageFormatProperties(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
+        VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
+        uint32_t* pPropertyCount, VkSparseImageFormatProperties* pProperties) {
+        // TODO: Implement
+    }
+    void vkQueueBindSparse(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkResult input_result, VkQueue queue,
+                           uint32_t bindInfoCount, const VkBindSparseInfo* pBindInfo,
+                           VkFence fence) {
+        // TODO: Implement
+    }
+    void vkCreateFence(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                       android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                       const VkFenceCreateInfo* pCreateInfo,
+                       const VkAllocationCallbacks* pAllocator, VkFence* pFence) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pFence create
+        mReconstruction.addHandles((const uint64_t*)pFence, 1);
+        mReconstruction.addHandleDependency((const uint64_t*)pFence, 1,
+                                            (uint64_t)(uintptr_t)device);
+        if (!pFence) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreateFence, snapshotTraceBegin,
+                                    snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pFence, 1, apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pFence, 1);
+    }
+    void vkDestroyFence(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                        android::base::BumpPool* pool, VkDevice device, VkFence fence,
+                        const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // fence destroy
+        mReconstruction.removeHandles((const uint64_t*)(&fence), 1);
+    }
+    void vkResetFences(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                       android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                       uint32_t fenceCount, const VkFence* pFences) {
+        // TODO: Implement
+    }
+    void vkGetFenceStatus(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                          android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                          VkFence fence) {
+        // TODO: Implement
+    }
+    void vkWaitForFences(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                         android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                         uint32_t fenceCount, const VkFence* pFences, VkBool32 waitAll,
+                         uint64_t timeout) {
+        // TODO: Implement
+    }
+    void vkCreateSemaphore(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                           const VkSemaphoreCreateInfo* pCreateInfo,
+                           const VkAllocationCallbacks* pAllocator, VkSemaphore* pSemaphore) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pSemaphore create
+        mReconstruction.addHandles((const uint64_t*)pSemaphore, 1);
+        mReconstruction.addHandleDependency((const uint64_t*)pSemaphore, 1,
+                                            (uint64_t)(uintptr_t)device);
+        if (!pSemaphore) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreateSemaphore, snapshotTraceBegin,
+                                    snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pSemaphore, 1, apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pSemaphore, 1);
+    }
+    void vkDestroySemaphore(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkDevice device, VkSemaphore semaphore,
+                            const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // semaphore destroy
+        mReconstruction.removeHandles((const uint64_t*)(&semaphore), 1);
+    }
+    void vkCreateEvent(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                       android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                       const VkEventCreateInfo* pCreateInfo,
+                       const VkAllocationCallbacks* pAllocator, VkEvent* pEvent) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pEvent create
+        mReconstruction.addHandles((const uint64_t*)pEvent, 1);
+        mReconstruction.addHandleDependency((const uint64_t*)pEvent, 1,
+                                            (uint64_t)(uintptr_t)device);
+        if (!pEvent) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreateEvent, snapshotTraceBegin,
+                                    snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pEvent, 1, apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pEvent, 1);
+    }
+    void vkDestroyEvent(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                        android::base::BumpPool* pool, VkDevice device, VkEvent event,
+                        const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // event destroy
+        mReconstruction.removeHandles((const uint64_t*)(&event), 1);
+    }
+    void vkGetEventStatus(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                          android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                          VkEvent event) {
+        // TODO: Implement
+    }
+    void vkSetEvent(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                    android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                    VkEvent event) {
+        // TODO: Implement
+    }
+    void vkResetEvent(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                      android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                      VkEvent event) {
+        // TODO: Implement
+    }
+    void vkCreateQueryPool(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                           const VkQueryPoolCreateInfo* pCreateInfo,
+                           const VkAllocationCallbacks* pAllocator, VkQueryPool* pQueryPool) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pQueryPool create
+        mReconstruction.addHandles((const uint64_t*)pQueryPool, 1);
+        mReconstruction.addHandleDependency((const uint64_t*)pQueryPool, 1,
+                                            (uint64_t)(uintptr_t)device);
+        if (!pQueryPool) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreateQueryPool, snapshotTraceBegin,
+                                    snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pQueryPool, 1, apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pQueryPool, 1);
+    }
+    void vkDestroyQueryPool(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkDevice device, VkQueryPool queryPool,
+                            const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // queryPool destroy
+        mReconstruction.removeHandles((const uint64_t*)(&queryPool), 1);
+    }
+    void vkGetQueryPoolResults(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, VkResult input_result,
+                               VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
+                               uint32_t queryCount, size_t dataSize, void* pData,
+                               VkDeviceSize stride, VkQueryResultFlags flags) {
+        // TODO: Implement
+    }
+    void vkCreateBuffer(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                        android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                        const VkBufferCreateInfo* pCreateInfo,
+                        const VkAllocationCallbacks* pAllocator, VkBuffer* pBuffer) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pBuffer create
+        mReconstruction.addHandles((const uint64_t*)pBuffer, 1);
+        mReconstruction.addHandleDependency((const uint64_t*)pBuffer, 1,
+                                            (uint64_t)(uintptr_t)device);
+        if (!pBuffer) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreateBuffer, snapshotTraceBegin,
+                                    snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pBuffer, 1, apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pBuffer, 1);
+    }
+    void vkDestroyBuffer(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                         android::base::BumpPool* pool, VkDevice device, VkBuffer buffer,
+                         const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // buffer destroy
+        mReconstruction.removeHandles((const uint64_t*)(&buffer), 1);
+    }
+    void vkCreateBufferView(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                            const VkBufferViewCreateInfo* pCreateInfo,
+                            const VkAllocationCallbacks* pAllocator, VkBufferView* pView) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pView create
+        mReconstruction.addHandles((const uint64_t*)pView, 1);
+        mReconstruction.addHandleDependency((const uint64_t*)pView, 1, (uint64_t)(uintptr_t)device);
+        if (!pView) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreateBufferView, snapshotTraceBegin,
+                                    snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pView, 1, apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pView, 1);
+    }
+    void vkDestroyBufferView(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkDevice device,
+                             VkBufferView bufferView, const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // bufferView destroy
+        mReconstruction.removeHandles((const uint64_t*)(&bufferView), 1);
+    }
+    void vkCreateImage(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                       android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                       const VkImageCreateInfo* pCreateInfo,
+                       const VkAllocationCallbacks* pAllocator, VkImage* pImage) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pImage create
+        mReconstruction.addHandles((const uint64_t*)pImage, 1);
+        mReconstruction.addHandleDependency((const uint64_t*)pImage, 1,
+                                            (uint64_t)(uintptr_t)device);
+        if (!pImage) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreateImage, snapshotTraceBegin,
+                                    snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pImage, 1, apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pImage, 1);
+    }
+    void vkDestroyImage(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                        android::base::BumpPool* pool, VkDevice device, VkImage image,
+                        const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // image destroy
+        mReconstruction.removeHandles((const uint64_t*)(&image), 1);
+    }
+    void vkGetImageSubresourceLayout(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkDevice device, VkImage image,
+                                     const VkImageSubresource* pSubresource,
+                                     VkSubresourceLayout* pLayout) {
+        // TODO: Implement
+    }
+    void vkCreateImageView(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                           const VkImageViewCreateInfo* pCreateInfo,
+                           const VkAllocationCallbacks* pAllocator, VkImageView* pView) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pView create
+        mReconstruction.addHandles((const uint64_t*)pView, 1);
+        mReconstruction.addHandleDependency((const uint64_t*)pView, 1, (uint64_t)(uintptr_t)device);
+        if (!pView) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreateImageView, snapshotTraceBegin,
+                                    snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pView, 1, apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pView, 1);
+    }
+    void vkDestroyImageView(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkDevice device, VkImageView imageView,
+                            const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // imageView destroy
+        mReconstruction.removeHandles((const uint64_t*)(&imageView), 1);
+    }
+    void vkCreateShaderModule(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                              const VkShaderModuleCreateInfo* pCreateInfo,
+                              const VkAllocationCallbacks* pAllocator,
+                              VkShaderModule* pShaderModule) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pShaderModule create
+        mReconstruction.addHandles((const uint64_t*)pShaderModule, 1);
+        mReconstruction.addHandleDependency((const uint64_t*)pShaderModule, 1,
+                                            (uint64_t)(uintptr_t)device);
+        if (!pShaderModule) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreateShaderModule, snapshotTraceBegin,
+                                    snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pShaderModule, 1, apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pShaderModule, 1);
+    }
+    void vkDestroyShaderModule(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, VkDevice device,
+                               VkShaderModule shaderModule,
+                               const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // shaderModule destroy
+        mReconstruction.removeHandles((const uint64_t*)(&shaderModule), 1);
+    }
+    void vkCreatePipelineCache(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, VkResult input_result,
+                               VkDevice device, const VkPipelineCacheCreateInfo* pCreateInfo,
+                               const VkAllocationCallbacks* pAllocator,
+                               VkPipelineCache* pPipelineCache) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pPipelineCache create
+        mReconstruction.addHandles((const uint64_t*)pPipelineCache, 1);
+        mReconstruction.addHandleDependency((const uint64_t*)pPipelineCache, 1,
+                                            (uint64_t)(uintptr_t)device);
+        if (!pPipelineCache) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreatePipelineCache, snapshotTraceBegin,
+                                    snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pPipelineCache, 1, apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pPipelineCache, 1);
+    }
+    void vkDestroyPipelineCache(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkDevice device,
+                                VkPipelineCache pipelineCache,
+                                const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pipelineCache destroy
+        mReconstruction.removeHandles((const uint64_t*)(&pipelineCache), 1);
+    }
+    void vkGetPipelineCacheData(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkResult input_result,
+                                VkDevice device, VkPipelineCache pipelineCache, size_t* pDataSize,
+                                void* pData) {
+        // TODO: Implement
+    }
+    void vkMergePipelineCaches(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, VkResult input_result,
+                               VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount,
+                               const VkPipelineCache* pSrcCaches) {
+        // TODO: Implement
+    }
+    void vkCreateGraphicsPipelines(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                   android::base::BumpPool* pool, VkResult input_result,
+                                   VkDevice device, VkPipelineCache pipelineCache,
+                                   uint32_t createInfoCount,
+                                   const VkGraphicsPipelineCreateInfo* pCreateInfos,
+                                   const VkAllocationCallbacks* pAllocator,
+                                   VkPipeline* pPipelines) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pPipelines create
+        mReconstruction.addHandles((const uint64_t*)pPipelines, ((createInfoCount)));
+        mReconstruction.addHandleDependency((const uint64_t*)pPipelines, ((createInfoCount)),
+                                            (uint64_t)(uintptr_t)device);
+        if (!pPipelines) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreateGraphicsPipelines, snapshotTraceBegin,
+                                    snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pPipelines, ((createInfoCount)),
+                                            apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pPipelines,
+                                                ((createInfoCount)));
+    }
+    void vkCreateComputePipelines(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkResult input_result,
+                                  VkDevice device, VkPipelineCache pipelineCache,
+                                  uint32_t createInfoCount,
+                                  const VkComputePipelineCreateInfo* pCreateInfos,
+                                  const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pPipelines create
+        mReconstruction.addHandles((const uint64_t*)pPipelines, ((createInfoCount)));
+        mReconstruction.addHandleDependency((const uint64_t*)pPipelines, ((createInfoCount)),
+                                            (uint64_t)(uintptr_t)device);
+        if (!pPipelines) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreateComputePipelines, snapshotTraceBegin,
+                                    snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pPipelines, ((createInfoCount)),
+                                            apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pPipelines,
+                                                ((createInfoCount)));
+    }
+    void vkDestroyPipeline(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkDevice device, VkPipeline pipeline,
+                           const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pipeline destroy
+        mReconstruction.removeHandles((const uint64_t*)(&pipeline), 1);
+    }
+    void vkCreatePipelineLayout(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkResult input_result,
+                                VkDevice device, const VkPipelineLayoutCreateInfo* pCreateInfo,
+                                const VkAllocationCallbacks* pAllocator,
+                                VkPipelineLayout* pPipelineLayout) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pPipelineLayout create
+        mReconstruction.addHandles((const uint64_t*)pPipelineLayout, 1);
+        mReconstruction.addHandleDependency((const uint64_t*)pPipelineLayout, 1,
+                                            (uint64_t)(uintptr_t)device);
+        if (!pPipelineLayout) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreatePipelineLayout, snapshotTraceBegin,
+                                    snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pPipelineLayout, 1, apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pPipelineLayout, 1);
+    }
+    void vkDestroyPipelineLayout(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                 android::base::BumpPool* pool, VkDevice device,
+                                 VkPipelineLayout pipelineLayout,
+                                 const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pipelineLayout destroy
+        mReconstruction.removeHandles((const uint64_t*)(&pipelineLayout), 1);
+    }
+    void vkCreateSampler(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                         android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                         const VkSamplerCreateInfo* pCreateInfo,
+                         const VkAllocationCallbacks* pAllocator, VkSampler* pSampler) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pSampler create
+        mReconstruction.addHandles((const uint64_t*)pSampler, 1);
+        mReconstruction.addHandleDependency((const uint64_t*)pSampler, 1,
+                                            (uint64_t)(uintptr_t)device);
+        if (!pSampler) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreateSampler, snapshotTraceBegin,
+                                    snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pSampler, 1, apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pSampler, 1);
+    }
+    void vkDestroySampler(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                          android::base::BumpPool* pool, VkDevice device, VkSampler sampler,
+                          const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // sampler destroy
+        mReconstruction.removeHandles((const uint64_t*)(&sampler), 1);
+    }
+    void vkCreateDescriptorSetLayout(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkResult input_result,
+                                     VkDevice device,
+                                     const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
+                                     const VkAllocationCallbacks* pAllocator,
+                                     VkDescriptorSetLayout* pSetLayout) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pSetLayout create
+        mReconstruction.addHandles((const uint64_t*)pSetLayout, 1);
+        mReconstruction.addHandleDependency((const uint64_t*)pSetLayout, 1,
+                                            (uint64_t)(uintptr_t)device);
+        if (!pSetLayout) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreateDescriptorSetLayout, snapshotTraceBegin,
+                                    snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pSetLayout, 1, apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pSetLayout, 1);
+    }
+    void vkDestroyDescriptorSetLayout(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkDevice device,
+                                      VkDescriptorSetLayout descriptorSetLayout,
+                                      const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // descriptorSetLayout destroy
+        mReconstruction.removeHandles((const uint64_t*)(&descriptorSetLayout), 1);
+    }
+    void vkCreateDescriptorPool(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkResult input_result,
+                                VkDevice device, const VkDescriptorPoolCreateInfo* pCreateInfo,
+                                const VkAllocationCallbacks* pAllocator,
+                                VkDescriptorPool* pDescriptorPool) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pDescriptorPool create
+        mReconstruction.addHandles((const uint64_t*)pDescriptorPool, 1);
+        mReconstruction.addHandleDependency((const uint64_t*)pDescriptorPool, 1,
+                                            (uint64_t)(uintptr_t)device);
+        if (!pDescriptorPool) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreateDescriptorPool, snapshotTraceBegin,
+                                    snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pDescriptorPool, 1, apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pDescriptorPool, 1);
+    }
+    void vkDestroyDescriptorPool(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                 android::base::BumpPool* pool, VkDevice device,
+                                 VkDescriptorPool descriptorPool,
+                                 const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // descriptorPool destroy
+        mReconstruction.removeHandles((const uint64_t*)(&descriptorPool), 1);
+    }
+    void vkResetDescriptorPool(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, VkResult input_result,
+                               VkDevice device, VkDescriptorPool descriptorPool,
+                               VkDescriptorPoolResetFlags flags) {
+        // TODO: Implement
+    }
+    void vkAllocateDescriptorSets(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkResult input_result,
+                                  VkDevice device, const VkDescriptorSetAllocateInfo* pAllocateInfo,
+                                  VkDescriptorSet* pDescriptorSets) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pDescriptorSets create
+        mReconstruction.addHandles((const uint64_t*)pDescriptorSets,
+                                   pAllocateInfo->descriptorSetCount);
+        mReconstruction.addHandleDependency((const uint64_t*)pDescriptorSets,
+                                            pAllocateInfo->descriptorSetCount,
+                                            (uint64_t)(uintptr_t)device);
+        if (!pDescriptorSets) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkAllocateDescriptorSets, snapshotTraceBegin,
+                                    snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pDescriptorSets,
+                                            pAllocateInfo->descriptorSetCount, apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pDescriptorSets,
+                                                pAllocateInfo->descriptorSetCount);
+    }
+    void vkFreeDescriptorSets(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                              VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
+                              const VkDescriptorSet* pDescriptorSets) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pDescriptorSets destroy
+        mReconstruction.removeHandles((const uint64_t*)pDescriptorSets, ((descriptorSetCount)));
+    }
+    void vkUpdateDescriptorSets(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkDevice device,
+                                uint32_t descriptorWriteCount,
+                                const VkWriteDescriptorSet* pDescriptorWrites,
+                                uint32_t descriptorCopyCount,
+                                const VkCopyDescriptorSet* pDescriptorCopies) {
+        // TODO: Implement
+    }
+    void vkCreateFramebuffer(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                             const VkFramebufferCreateInfo* pCreateInfo,
+                             const VkAllocationCallbacks* pAllocator, VkFramebuffer* pFramebuffer) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pFramebuffer create
+        mReconstruction.addHandles((const uint64_t*)pFramebuffer, 1);
+        mReconstruction.addHandleDependency((const uint64_t*)pFramebuffer, 1,
+                                            (uint64_t)(uintptr_t)device);
+        if (!pFramebuffer) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreateFramebuffer, snapshotTraceBegin,
+                                    snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pFramebuffer, 1, apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pFramebuffer, 1);
+    }
+    void vkDestroyFramebuffer(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkDevice device,
+                              VkFramebuffer framebuffer, const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // framebuffer destroy
+        mReconstruction.removeHandles((const uint64_t*)(&framebuffer), 1);
+    }
+    void vkCreateRenderPass(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                            const VkRenderPassCreateInfo* pCreateInfo,
+                            const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pRenderPass create
+        mReconstruction.addHandles((const uint64_t*)pRenderPass, 1);
+        mReconstruction.addHandleDependency((const uint64_t*)pRenderPass, 1,
+                                            (uint64_t)(uintptr_t)device);
+        if (!pRenderPass) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreateRenderPass, snapshotTraceBegin,
+                                    snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pRenderPass, 1, apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pRenderPass, 1);
+    }
+    void vkDestroyRenderPass(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkDevice device,
+                             VkRenderPass renderPass, const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // renderPass destroy
+        mReconstruction.removeHandles((const uint64_t*)(&renderPass), 1);
+    }
+    void vkGetRenderAreaGranularity(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkDevice device,
+                                    VkRenderPass renderPass, VkExtent2D* pGranularity) {
+        // TODO: Implement
+    }
+    void vkCreateCommandPool(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                             const VkCommandPoolCreateInfo* pCreateInfo,
+                             const VkAllocationCallbacks* pAllocator, VkCommandPool* pCommandPool) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pCommandPool create
+        mReconstruction.addHandles((const uint64_t*)pCommandPool, 1);
+        mReconstruction.addHandleDependency((const uint64_t*)pCommandPool, 1,
+                                            (uint64_t)(uintptr_t)device);
+        if (!pCommandPool) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreateCommandPool, snapshotTraceBegin,
+                                    snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pCommandPool, 1, apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pCommandPool, 1);
+    }
+    void vkDestroyCommandPool(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkDevice device,
+                              VkCommandPool commandPool, const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // commandPool destroy
+        mReconstruction.removeHandles((const uint64_t*)(&commandPool), 1);
+    }
+    void vkResetCommandPool(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                            VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
+        // TODO: Implement
+    }
+    void vkAllocateCommandBuffers(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkResult input_result,
+                                  VkDevice device, const VkCommandBufferAllocateInfo* pAllocateInfo,
+                                  VkCommandBuffer* pCommandBuffers) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pCommandBuffers create
+        mReconstruction.addHandles((const uint64_t*)pCommandBuffers,
+                                   pAllocateInfo->commandBufferCount);
+        mReconstruction.addHandleDependency(
+            (const uint64_t*)pCommandBuffers, pAllocateInfo->commandBufferCount,
+            (uint64_t)(uintptr_t)unboxed_to_boxed_non_dispatchable_VkCommandPool(
+                pAllocateInfo->commandPool));
+        if (!pCommandBuffers) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkAllocateCommandBuffers, snapshotTraceBegin,
+                                    snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pCommandBuffers,
+                                            pAllocateInfo->commandBufferCount, apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pCommandBuffers,
+                                                pAllocateInfo->commandBufferCount);
+    }
+    void vkFreeCommandBuffers(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkDevice device,
+                              VkCommandPool commandPool, uint32_t commandBufferCount,
+                              const VkCommandBuffer* pCommandBuffers) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pCommandBuffers destroy
+        mReconstruction.removeHandles((const uint64_t*)pCommandBuffers, ((commandBufferCount)));
+    }
+    void vkBeginCommandBuffer(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkResult input_result,
+                              VkCommandBuffer commandBuffer,
+                              const VkCommandBufferBeginInfo* pBeginInfo) {
+        // TODO: Implement
+    }
+    void vkEndCommandBuffer(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkResult input_result,
+                            VkCommandBuffer commandBuffer) {
+        // TODO: Implement
+    }
+    void vkResetCommandBuffer(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkResult input_result,
+                              VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
+        // TODO: Implement
+    }
+    void vkCmdBindPipeline(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                           VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline) {
+        // TODO: Implement
+    }
+    void vkCmdSetViewport(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                          android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                          uint32_t firstViewport, uint32_t viewportCount,
+                          const VkViewport* pViewports) {
+        // TODO: Implement
+    }
+    void vkCmdSetScissor(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                         android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                         uint32_t firstScissor, uint32_t scissorCount, const VkRect2D* pScissors) {
+        // TODO: Implement
+    }
+    void vkCmdSetLineWidth(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                           float lineWidth) {
+        // TODO: Implement
+    }
+    void vkCmdSetDepthBias(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                           float depthBiasConstantFactor, float depthBiasClamp,
+                           float depthBiasSlopeFactor) {
+        // TODO: Implement
+    }
+    void vkCmdSetBlendConstants(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                const float blendConstants[4]) {
+        // TODO: Implement
+    }
+    void vkCmdSetDepthBounds(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                             float minDepthBounds, float maxDepthBounds) {
+        // TODO: Implement
+    }
+    void vkCmdSetStencilCompareMask(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                    VkStencilFaceFlags faceMask, uint32_t compareMask) {
+        // TODO: Implement
+    }
+    void vkCmdSetStencilWriteMask(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                  VkStencilFaceFlags faceMask, uint32_t writeMask) {
+        // TODO: Implement
+    }
+    void vkCmdSetStencilReference(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                  VkStencilFaceFlags faceMask, uint32_t reference) {
+        // TODO: Implement
+    }
+    void vkCmdBindDescriptorSets(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                 android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                 VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
+                                 uint32_t firstSet, uint32_t descriptorSetCount,
+                                 const VkDescriptorSet* pDescriptorSets,
+                                 uint32_t dynamicOffsetCount, const uint32_t* pDynamicOffsets) {
+        // TODO: Implement
+    }
+    void vkCmdBindIndexBuffer(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                              VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType) {
+        // TODO: Implement
+    }
+    void vkCmdBindVertexBuffers(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                uint32_t firstBinding, uint32_t bindingCount,
+                                const VkBuffer* pBuffers, const VkDeviceSize* pOffsets) {
+        // TODO: Implement
+    }
+    void vkCmdDraw(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                   android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                   uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
+                   uint32_t firstInstance) {
+        // TODO: Implement
+    }
+    void vkCmdDrawIndexed(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                          android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                          uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex,
+                          int32_t vertexOffset, uint32_t firstInstance) {
+        // TODO: Implement
+    }
+    void vkCmdDrawIndirect(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                           VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
+                           uint32_t stride) {
+        // TODO: Implement
+    }
+    void vkCmdDrawIndexedIndirect(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                  VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
+                                  uint32_t stride) {
+        // TODO: Implement
+    }
+    void vkCmdDispatch(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                       android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                       uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ) {
+        // TODO: Implement
+    }
+    void vkCmdDispatchIndirect(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                               VkBuffer buffer, VkDeviceSize offset) {
+        // TODO: Implement
+    }
+    void vkCmdCopyBuffer(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                         android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                         VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount,
+                         const VkBufferCopy* pRegions) {
+        // TODO: Implement
+    }
+    void vkCmdCopyImage(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                        android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                        VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
+                        VkImageLayout dstImageLayout, uint32_t regionCount,
+                        const VkImageCopy* pRegions) {
+        // TODO: Implement
+    }
+    void vkCmdBlitImage(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                        android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                        VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
+                        VkImageLayout dstImageLayout, uint32_t regionCount,
+                        const VkImageBlit* pRegions, VkFilter filter) {
+        // TODO: Implement
+    }
+    void vkCmdCopyBufferToImage(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                VkBuffer srcBuffer, VkImage dstImage, VkImageLayout dstImageLayout,
+                                uint32_t regionCount, const VkBufferImageCopy* pRegions) {
+        // TODO: Implement
+    }
+    void vkCmdCopyImageToBuffer(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer dstBuffer,
+                                uint32_t regionCount, const VkBufferImageCopy* pRegions) {
+        // TODO: Implement
+    }
+    void vkCmdUpdateBuffer(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                           VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize dataSize,
+                           const void* pData) {
+        // TODO: Implement
+    }
+    void vkCmdFillBuffer(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                         android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                         VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size,
+                         uint32_t data) {
+        // TODO: Implement
+    }
+    void vkCmdClearColorImage(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                              VkImage image, VkImageLayout imageLayout,
+                              const VkClearColorValue* pColor, uint32_t rangeCount,
+                              const VkImageSubresourceRange* pRanges) {
+        // TODO: Implement
+    }
+    void vkCmdClearDepthStencilImage(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                     VkImage image, VkImageLayout imageLayout,
+                                     const VkClearDepthStencilValue* pDepthStencil,
+                                     uint32_t rangeCount, const VkImageSubresourceRange* pRanges) {
+        // TODO: Implement
+    }
+    void vkCmdClearAttachments(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                               uint32_t attachmentCount, const VkClearAttachment* pAttachments,
+                               uint32_t rectCount, const VkClearRect* pRects) {
+        // TODO: Implement
+    }
+    void vkCmdResolveImage(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                           VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
+                           VkImageLayout dstImageLayout, uint32_t regionCount,
+                           const VkImageResolve* pRegions) {
+        // TODO: Implement
+    }
+    void vkCmdSetEvent(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                       android::base::BumpPool* pool, VkCommandBuffer commandBuffer, VkEvent event,
+                       VkPipelineStageFlags stageMask) {
+        // TODO: Implement
+    }
+    void vkCmdResetEvent(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                         android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                         VkEvent event, VkPipelineStageFlags stageMask) {
+        // TODO: Implement
+    }
+    void vkCmdWaitEvents(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                         android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                         uint32_t eventCount, const VkEvent* pEvents,
+                         VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
+                         uint32_t memoryBarrierCount, const VkMemoryBarrier* pMemoryBarriers,
+                         uint32_t bufferMemoryBarrierCount,
+                         const VkBufferMemoryBarrier* pBufferMemoryBarriers,
+                         uint32_t imageMemoryBarrierCount,
+                         const VkImageMemoryBarrier* pImageMemoryBarriers) {
+        // TODO: Implement
+    }
+    void vkCmdPipelineBarrier(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                              VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
+                              VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount,
+                              const VkMemoryBarrier* pMemoryBarriers,
+                              uint32_t bufferMemoryBarrierCount,
+                              const VkBufferMemoryBarrier* pBufferMemoryBarriers,
+                              uint32_t imageMemoryBarrierCount,
+                              const VkImageMemoryBarrier* pImageMemoryBarriers) {
+        // TODO: Implement
+    }
+    void vkCmdBeginQuery(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                         android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                         VkQueryPool queryPool, uint32_t query, VkQueryControlFlags flags) {
+        // TODO: Implement
+    }
+    void vkCmdEndQuery(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                       android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                       VkQueryPool queryPool, uint32_t query) {
+        // TODO: Implement
+    }
+    void vkCmdResetQueryPool(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                             VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount) {
+        // TODO: Implement
+    }
+    void vkCmdWriteTimestamp(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                             VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
+                             uint32_t query) {
+        // TODO: Implement
+    }
+    void vkCmdCopyQueryPoolResults(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                   android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                   VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
+                                   VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride,
+                                   VkQueryResultFlags flags) {
+        // TODO: Implement
+    }
+    void vkCmdPushConstants(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                            VkPipelineLayout layout, VkShaderStageFlags stageFlags, uint32_t offset,
+                            uint32_t size, const void* pValues) {
+        // TODO: Implement
+    }
+    void vkCmdBeginRenderPass(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                              const VkRenderPassBeginInfo* pRenderPassBegin,
+                              VkSubpassContents contents) {
+        // TODO: Implement
+    }
+    void vkCmdNextSubpass(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                          android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                          VkSubpassContents contents) {
+        // TODO: Implement
+    }
+    void vkCmdEndRenderPass(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkCommandBuffer commandBuffer) {
+        // TODO: Implement
+    }
+    void vkCmdExecuteCommands(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                              uint32_t commandBufferCount, const VkCommandBuffer* pCommandBuffers) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_VERSION_1_1
-void vkEnumerateInstanceVersion(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    uint32_t* pApiVersion)
-{
-    // TODO: Implement
-}
-void vkBindBufferMemory2(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    uint32_t bindInfoCount,
-    const VkBindBufferMemoryInfo* pBindInfos)
-{
-    // TODO: Implement
-}
-void vkBindImageMemory2(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    uint32_t bindInfoCount,
-    const VkBindImageMemoryInfo* pBindInfos)
-{
-    // TODO: Implement
-}
-void vkGetDeviceGroupPeerMemoryFeatures(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    uint32_t heapIndex,
-    uint32_t localDeviceIndex,
-    uint32_t remoteDeviceIndex,
-    VkPeerMemoryFeatureFlags* pPeerMemoryFeatures)
-{
-    // TODO: Implement
-}
-void vkCmdSetDeviceMask(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t deviceMask)
-{
-    // TODO: Implement
-}
-void vkCmdDispatchBase(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t baseGroupX,
-    uint32_t baseGroupY,
-    uint32_t baseGroupZ,
-    uint32_t groupCountX,
-    uint32_t groupCountY,
-    uint32_t groupCountZ)
-{
-    // TODO: Implement
-}
-void vkEnumeratePhysicalDeviceGroups(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    uint32_t* pPhysicalDeviceGroupCount,
-    VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProperties)
-{
-    // TODO: Implement
-}
-void vkGetImageMemoryRequirements2(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    const VkImageMemoryRequirementsInfo2* pInfo,
-    VkMemoryRequirements2* pMemoryRequirements)
-{
-    // TODO: Implement
-}
-void vkGetBufferMemoryRequirements2(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    const VkBufferMemoryRequirementsInfo2* pInfo,
-    VkMemoryRequirements2* pMemoryRequirements)
-{
-    // TODO: Implement
-}
-void vkGetImageSparseMemoryRequirements2(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    const VkImageSparseMemoryRequirementsInfo2* pInfo,
-    uint32_t* pSparseMemoryRequirementCount,
-    VkSparseImageMemoryRequirements2* pSparseMemoryRequirements)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDeviceFeatures2(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    VkPhysicalDeviceFeatures2* pFeatures)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDeviceProperties2(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    VkPhysicalDeviceProperties2* pProperties)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDeviceFormatProperties2(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    VkFormat format,
-    VkFormatProperties2* pFormatProperties)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDeviceImageFormatProperties2(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo,
-    VkImageFormatProperties2* pImageFormatProperties)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDeviceQueueFamilyProperties2(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    uint32_t* pQueueFamilyPropertyCount,
-    VkQueueFamilyProperties2* pQueueFamilyProperties)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDeviceMemoryProperties2(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    VkPhysicalDeviceMemoryProperties2* pMemoryProperties)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDeviceSparseImageFormatProperties2(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    const VkPhysicalDeviceSparseImageFormatInfo2* pFormatInfo,
-    uint32_t* pPropertyCount,
-    VkSparseImageFormatProperties2* pProperties)
-{
-    // TODO: Implement
-}
-void vkTrimCommandPool(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkCommandPool commandPool,
-    VkCommandPoolTrimFlags flags)
-{
-    // TODO: Implement
-}
-void vkGetDeviceQueue2(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    const VkDeviceQueueInfo2* pQueueInfo,
-    VkQueue* pQueue)
-{
-    // TODO: Implement
-}
-void vkCreateSamplerYcbcrConversion(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkSamplerYcbcrConversionCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSamplerYcbcrConversion* pYcbcrConversion)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pYcbcrConversion create
-    mReconstruction.addHandles((const uint64_t*)pYcbcrConversion, 1);
-    mReconstruction.addHandleDependency((const uint64_t*)pYcbcrConversion, 1, (uint64_t)(uintptr_t)device);
-    if (!pYcbcrConversion) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkCreateSamplerYcbcrConversion, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pYcbcrConversion, 1, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pYcbcrConversion, 1);
-}
-void vkDestroySamplerYcbcrConversion(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkSamplerYcbcrConversion ycbcrConversion,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // ycbcrConversion destroy
-    mReconstruction.removeHandles((const uint64_t*)(&ycbcrConversion), 1);
-}
-void vkCreateDescriptorUpdateTemplate(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkDescriptorUpdateTemplate* pDescriptorUpdateTemplate)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pDescriptorUpdateTemplate create
-    mReconstruction.addHandles((const uint64_t*)pDescriptorUpdateTemplate, 1);
-    mReconstruction.addHandleDependency((const uint64_t*)pDescriptorUpdateTemplate, 1, (uint64_t)(uintptr_t)device);
-    if (!pDescriptorUpdateTemplate) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkCreateDescriptorUpdateTemplate, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pDescriptorUpdateTemplate, 1, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pDescriptorUpdateTemplate, 1);
-}
-void vkDestroyDescriptorUpdateTemplate(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkDescriptorUpdateTemplate descriptorUpdateTemplate,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // descriptorUpdateTemplate destroy
-    mReconstruction.removeHandles((const uint64_t*)(&descriptorUpdateTemplate), 1);
-}
-void vkUpdateDescriptorSetWithTemplate(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkDescriptorSet descriptorSet,
-    VkDescriptorUpdateTemplate descriptorUpdateTemplate,
-    const void* pData)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDeviceExternalBufferProperties(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    const VkPhysicalDeviceExternalBufferInfo* pExternalBufferInfo,
-    VkExternalBufferProperties* pExternalBufferProperties)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDeviceExternalFenceProperties(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo,
-    VkExternalFenceProperties* pExternalFenceProperties)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDeviceExternalSemaphoreProperties(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo,
-    VkExternalSemaphoreProperties* pExternalSemaphoreProperties)
-{
-    // TODO: Implement
-}
-void vkGetDescriptorSetLayoutSupport(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
-    VkDescriptorSetLayoutSupport* pSupport)
-{
-    // TODO: Implement
-}
+    void vkEnumerateInstanceVersion(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkResult input_result,
+                                    uint32_t* pApiVersion) {
+        // TODO: Implement
+    }
+    void vkBindBufferMemory2(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                             uint32_t bindInfoCount, const VkBindBufferMemoryInfo* pBindInfos) {
+        // TODO: Implement
+    }
+    void vkBindImageMemory2(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                            uint32_t bindInfoCount, const VkBindImageMemoryInfo* pBindInfos) {
+        // TODO: Implement
+    }
+    void vkGetDeviceGroupPeerMemoryFeatures(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool, VkDevice device,
+                                            uint32_t heapIndex, uint32_t localDeviceIndex,
+                                            uint32_t remoteDeviceIndex,
+                                            VkPeerMemoryFeatureFlags* pPeerMemoryFeatures) {
+        // TODO: Implement
+    }
+    void vkCmdSetDeviceMask(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                            uint32_t deviceMask) {
+        // TODO: Implement
+    }
+    void vkCmdDispatchBase(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                           uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ,
+                           uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ) {
+        // TODO: Implement
+    }
+    void vkEnumeratePhysicalDeviceGroups(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkInstance instance, uint32_t* pPhysicalDeviceGroupCount,
+        VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProperties) {
+        // TODO: Implement
+    }
+    void vkGetImageMemoryRequirements2(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool, VkDevice device,
+                                       const VkImageMemoryRequirementsInfo2* pInfo,
+                                       VkMemoryRequirements2* pMemoryRequirements) {
+        // TODO: Implement
+    }
+    void vkGetBufferMemoryRequirements2(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkDevice device,
+                                        const VkBufferMemoryRequirementsInfo2* pInfo,
+                                        VkMemoryRequirements2* pMemoryRequirements) {
+        // TODO: Implement
+    }
+    void vkGetImageSparseMemoryRequirements2(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkDevice device, const VkImageSparseMemoryRequirementsInfo2* pInfo,
+        uint32_t* pSparseMemoryRequirementCount,
+        VkSparseImageMemoryRequirements2* pSparseMemoryRequirements) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDeviceFeatures2(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool,
+                                      VkPhysicalDevice physicalDevice,
+                                      VkPhysicalDeviceFeatures2* pFeatures) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDeviceProperties2(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkPhysicalDevice physicalDevice,
+                                        VkPhysicalDeviceProperties2* pProperties) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDeviceFormatProperties2(const uint8_t* snapshotTraceBegin,
+                                              size_t snapshotTraceBytes,
+                                              android::base::BumpPool* pool,
+                                              VkPhysicalDevice physicalDevice, VkFormat format,
+                                              VkFormatProperties2* pFormatProperties) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDeviceImageFormatProperties2(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice,
+        const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo,
+        VkImageFormatProperties2* pImageFormatProperties) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDeviceQueueFamilyProperties2(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkPhysicalDevice physicalDevice, uint32_t* pQueueFamilyPropertyCount,
+        VkQueueFamilyProperties2* pQueueFamilyProperties) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDeviceMemoryProperties2(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties2* pMemoryProperties) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDeviceSparseImageFormatProperties2(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSparseImageFormatInfo2* pFormatInfo,
+        uint32_t* pPropertyCount, VkSparseImageFormatProperties2* pProperties) {
+        // TODO: Implement
+    }
+    void vkTrimCommandPool(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkDevice device,
+                           VkCommandPool commandPool, VkCommandPoolTrimFlags flags) {
+        // TODO: Implement
+    }
+    void vkGetDeviceQueue2(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkDevice device,
+                           const VkDeviceQueueInfo2* pQueueInfo, VkQueue* pQueue) {
+        // TODO: Implement
+    }
+    void vkCreateSamplerYcbcrConversion(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkResult input_result, VkDevice device,
+                                        const VkSamplerYcbcrConversionCreateInfo* pCreateInfo,
+                                        const VkAllocationCallbacks* pAllocator,
+                                        VkSamplerYcbcrConversion* pYcbcrConversion) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pYcbcrConversion create
+        mReconstruction.addHandles((const uint64_t*)pYcbcrConversion, 1);
+        mReconstruction.addHandleDependency((const uint64_t*)pYcbcrConversion, 1,
+                                            (uint64_t)(uintptr_t)device);
+        if (!pYcbcrConversion) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreateSamplerYcbcrConversion, snapshotTraceBegin,
+                                    snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pYcbcrConversion, 1, apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pYcbcrConversion, 1);
+    }
+    void vkDestroySamplerYcbcrConversion(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkDevice device, VkSamplerYcbcrConversion ycbcrConversion,
+                                         const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // ycbcrConversion destroy
+        mReconstruction.removeHandles((const uint64_t*)(&ycbcrConversion), 1);
+    }
+    void vkCreateDescriptorUpdateTemplate(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkResult input_result, VkDevice device,
+                                          const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo,
+                                          const VkAllocationCallbacks* pAllocator,
+                                          VkDescriptorUpdateTemplate* pDescriptorUpdateTemplate) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pDescriptorUpdateTemplate create
+        mReconstruction.addHandles((const uint64_t*)pDescriptorUpdateTemplate, 1);
+        mReconstruction.addHandleDependency((const uint64_t*)pDescriptorUpdateTemplate, 1,
+                                            (uint64_t)(uintptr_t)device);
+        if (!pDescriptorUpdateTemplate) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreateDescriptorUpdateTemplate,
+                                    snapshotTraceBegin, snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pDescriptorUpdateTemplate, 1,
+                                            apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle,
+                                                (const uint64_t*)pDescriptorUpdateTemplate, 1);
+    }
+    void vkDestroyDescriptorUpdateTemplate(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkDevice device,
+                                           VkDescriptorUpdateTemplate descriptorUpdateTemplate,
+                                           const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // descriptorUpdateTemplate destroy
+        mReconstruction.removeHandles((const uint64_t*)(&descriptorUpdateTemplate), 1);
+    }
+    void vkUpdateDescriptorSetWithTemplate(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkDevice device, VkDescriptorSet descriptorSet,
+                                           VkDescriptorUpdateTemplate descriptorUpdateTemplate,
+                                           const void* pData) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDeviceExternalBufferProperties(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkPhysicalDevice physicalDevice,
+        const VkPhysicalDeviceExternalBufferInfo* pExternalBufferInfo,
+        VkExternalBufferProperties* pExternalBufferProperties) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDeviceExternalFenceProperties(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkPhysicalDevice physicalDevice,
+        const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo,
+        VkExternalFenceProperties* pExternalFenceProperties) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDeviceExternalSemaphoreProperties(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkPhysicalDevice physicalDevice,
+        const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo,
+        VkExternalSemaphoreProperties* pExternalSemaphoreProperties) {
+        // TODO: Implement
+    }
+    void vkGetDescriptorSetLayoutSupport(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkDevice device,
+                                         const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
+                                         VkDescriptorSetLayoutSupport* pSupport) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_VERSION_1_2
-void vkCmdDrawIndirectCount(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBuffer buffer,
-    VkDeviceSize offset,
-    VkBuffer countBuffer,
-    VkDeviceSize countBufferOffset,
-    uint32_t maxDrawCount,
-    uint32_t stride)
-{
-    // TODO: Implement
-}
-void vkCmdDrawIndexedIndirectCount(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBuffer buffer,
-    VkDeviceSize offset,
-    VkBuffer countBuffer,
-    VkDeviceSize countBufferOffset,
-    uint32_t maxDrawCount,
-    uint32_t stride)
-{
-    // TODO: Implement
-}
-void vkCreateRenderPass2(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkRenderPassCreateInfo2* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkRenderPass* pRenderPass)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pRenderPass create
-    mReconstruction.addHandles((const uint64_t*)pRenderPass, 1);
-    mReconstruction.addHandleDependency((const uint64_t*)pRenderPass, 1, (uint64_t)(uintptr_t)device);
-    if (!pRenderPass) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkCreateRenderPass2, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pRenderPass, 1, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pRenderPass, 1);
-}
-void vkCmdBeginRenderPass2(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkRenderPassBeginInfo* pRenderPassBegin,
-    const VkSubpassBeginInfo* pSubpassBeginInfo)
-{
-    // TODO: Implement
-}
-void vkCmdNextSubpass2(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkSubpassBeginInfo* pSubpassBeginInfo,
-    const VkSubpassEndInfo* pSubpassEndInfo)
-{
-    // TODO: Implement
-}
-void vkCmdEndRenderPass2(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkSubpassEndInfo* pSubpassEndInfo)
-{
-    // TODO: Implement
-}
-void vkResetQueryPool(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkQueryPool queryPool,
-    uint32_t firstQuery,
-    uint32_t queryCount)
-{
-    // TODO: Implement
-}
-void vkGetSemaphoreCounterValue(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkSemaphore semaphore,
-    uint64_t* pValue)
-{
-    // TODO: Implement
-}
-void vkWaitSemaphores(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkSemaphoreWaitInfo* pWaitInfo,
-    uint64_t timeout)
-{
-    // TODO: Implement
-}
-void vkSignalSemaphore(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkSemaphoreSignalInfo* pSignalInfo)
-{
-    // TODO: Implement
-}
-void vkGetBufferDeviceAddress(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDeviceAddress input_result,
-    VkDevice device,
-    const VkBufferDeviceAddressInfo* pInfo)
-{
-    // TODO: Implement
-}
-void vkGetBufferOpaqueCaptureAddress(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    uint64_t input_result,
-    VkDevice device,
-    const VkBufferDeviceAddressInfo* pInfo)
-{
-    // TODO: Implement
-}
-void vkGetDeviceMemoryOpaqueCaptureAddress(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    uint64_t input_result,
-    VkDevice device,
-    const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo)
-{
-    // TODO: Implement
-}
+    void vkCmdDrawIndirectCount(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
+                                VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+                                uint32_t stride) {
+        // TODO: Implement
+    }
+    void vkCmdDrawIndexedIndirectCount(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                       VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
+                                       VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+                                       uint32_t stride) {
+        // TODO: Implement
+    }
+    void vkCreateRenderPass2(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                             const VkRenderPassCreateInfo2* pCreateInfo,
+                             const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pRenderPass create
+        mReconstruction.addHandles((const uint64_t*)pRenderPass, 1);
+        mReconstruction.addHandleDependency((const uint64_t*)pRenderPass, 1,
+                                            (uint64_t)(uintptr_t)device);
+        if (!pRenderPass) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreateRenderPass2, snapshotTraceBegin,
+                                    snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pRenderPass, 1, apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pRenderPass, 1);
+    }
+    void vkCmdBeginRenderPass2(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                               const VkRenderPassBeginInfo* pRenderPassBegin,
+                               const VkSubpassBeginInfo* pSubpassBeginInfo) {
+        // TODO: Implement
+    }
+    void vkCmdNextSubpass2(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                           const VkSubpassBeginInfo* pSubpassBeginInfo,
+                           const VkSubpassEndInfo* pSubpassEndInfo) {
+        // TODO: Implement
+    }
+    void vkCmdEndRenderPass2(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                             const VkSubpassEndInfo* pSubpassEndInfo) {
+        // TODO: Implement
+    }
+    void vkResetQueryPool(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                          android::base::BumpPool* pool, VkDevice device, VkQueryPool queryPool,
+                          uint32_t firstQuery, uint32_t queryCount) {
+        // TODO: Implement
+    }
+    void vkGetSemaphoreCounterValue(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkResult input_result,
+                                    VkDevice device, VkSemaphore semaphore, uint64_t* pValue) {
+        // TODO: Implement
+    }
+    void vkWaitSemaphores(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                          android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                          const VkSemaphoreWaitInfo* pWaitInfo, uint64_t timeout) {
+        // TODO: Implement
+    }
+    void vkSignalSemaphore(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                           const VkSemaphoreSignalInfo* pSignalInfo) {
+        // TODO: Implement
+    }
+    void vkGetBufferDeviceAddress(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkDeviceAddress input_result,
+                                  VkDevice device, const VkBufferDeviceAddressInfo* pInfo) {
+        // TODO: Implement
+    }
+    void vkGetBufferOpaqueCaptureAddress(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         uint64_t input_result, VkDevice device,
+                                         const VkBufferDeviceAddressInfo* pInfo) {
+        // TODO: Implement
+    }
+    void vkGetDeviceMemoryOpaqueCaptureAddress(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        uint64_t input_result, VkDevice device,
+        const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_surface
-void vkDestroySurfaceKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkInstance instance,
-    VkSurfaceKHR surface,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // surface destroy
-    mReconstruction.removeHandles((const uint64_t*)(&surface), 1);
-}
-void vkGetPhysicalDeviceSurfaceSupportKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t queueFamilyIndex,
-    VkSurfaceKHR surface,
-    VkBool32* pSupported)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDeviceSurfaceCapabilitiesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    VkSurfaceKHR surface,
-    VkSurfaceCapabilitiesKHR* pSurfaceCapabilities)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDeviceSurfaceFormatsKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    VkSurfaceKHR surface,
-    uint32_t* pSurfaceFormatCount,
-    VkSurfaceFormatKHR* pSurfaceFormats)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDeviceSurfacePresentModesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    VkSurfaceKHR surface,
-    uint32_t* pPresentModeCount,
-    VkPresentModeKHR* pPresentModes)
-{
-    // TODO: Implement
-}
+    void vkDestroySurfaceKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkInstance instance,
+                             VkSurfaceKHR surface, const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // surface destroy
+        mReconstruction.removeHandles((const uint64_t*)(&surface), 1);
+    }
+    void vkGetPhysicalDeviceSurfaceSupportKHR(const uint8_t* snapshotTraceBegin,
+                                              size_t snapshotTraceBytes,
+                                              android::base::BumpPool* pool, VkResult input_result,
+                                              VkPhysicalDevice physicalDevice,
+                                              uint32_t queueFamilyIndex, VkSurfaceKHR surface,
+                                              VkBool32* pSupported) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDeviceSurfaceCapabilitiesKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
+        VkSurfaceCapabilitiesKHR* pSurfaceCapabilities) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDeviceSurfaceFormatsKHR(const uint8_t* snapshotTraceBegin,
+                                              size_t snapshotTraceBytes,
+                                              android::base::BumpPool* pool, VkResult input_result,
+                                              VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
+                                              uint32_t* pSurfaceFormatCount,
+                                              VkSurfaceFormatKHR* pSurfaceFormats) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDeviceSurfacePresentModesKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
+        uint32_t* pPresentModeCount, VkPresentModeKHR* pPresentModes) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_swapchain
-void vkCreateSwapchainKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkSwapchainCreateInfoKHR* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSwapchainKHR* pSwapchain)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pSwapchain create
-    mReconstruction.addHandles((const uint64_t*)pSwapchain, 1);
-    mReconstruction.addHandleDependency((const uint64_t*)pSwapchain, 1, (uint64_t)(uintptr_t)device);
-    if (!pSwapchain) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkCreateSwapchainKHR, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pSwapchain, 1, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pSwapchain, 1);
-}
-void vkDestroySwapchainKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkSwapchainKHR swapchain,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // swapchain destroy
-    mReconstruction.removeHandles((const uint64_t*)(&swapchain), 1);
-}
-void vkGetSwapchainImagesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkSwapchainKHR swapchain,
-    uint32_t* pSwapchainImageCount,
-    VkImage* pSwapchainImages)
-{
-    // TODO: Implement
-}
-void vkAcquireNextImageKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkSwapchainKHR swapchain,
-    uint64_t timeout,
-    VkSemaphore semaphore,
-    VkFence fence,
-    uint32_t* pImageIndex)
-{
-    // TODO: Implement
-}
-void vkQueuePresentKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkQueue queue,
-    const VkPresentInfoKHR* pPresentInfo)
-{
-    // TODO: Implement
-}
-void vkGetDeviceGroupPresentCapabilitiesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkDeviceGroupPresentCapabilitiesKHR* pDeviceGroupPresentCapabilities)
-{
-    // TODO: Implement
-}
-void vkGetDeviceGroupSurfacePresentModesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkSurfaceKHR surface,
-    VkDeviceGroupPresentModeFlagsKHR* pModes)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDevicePresentRectanglesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    VkSurfaceKHR surface,
-    uint32_t* pRectCount,
-    VkRect2D* pRects)
-{
-    // TODO: Implement
-}
-void vkAcquireNextImage2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkAcquireNextImageInfoKHR* pAcquireInfo,
-    uint32_t* pImageIndex)
-{
-    // TODO: Implement
-}
+    void vkCreateSwapchainKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                              const VkSwapchainCreateInfoKHR* pCreateInfo,
+                              const VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchain) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pSwapchain create
+        mReconstruction.addHandles((const uint64_t*)pSwapchain, 1);
+        mReconstruction.addHandleDependency((const uint64_t*)pSwapchain, 1,
+                                            (uint64_t)(uintptr_t)device);
+        if (!pSwapchain) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreateSwapchainKHR, snapshotTraceBegin,
+                                    snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pSwapchain, 1, apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pSwapchain, 1);
+    }
+    void vkDestroySwapchainKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, VkDevice device,
+                               VkSwapchainKHR swapchain, const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // swapchain destroy
+        mReconstruction.removeHandles((const uint64_t*)(&swapchain), 1);
+    }
+    void vkGetSwapchainImagesKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                 android::base::BumpPool* pool, VkResult input_result,
+                                 VkDevice device, VkSwapchainKHR swapchain,
+                                 uint32_t* pSwapchainImageCount, VkImage* pSwapchainImages) {
+        // TODO: Implement
+    }
+    void vkAcquireNextImageKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, VkResult input_result,
+                               VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
+                               VkSemaphore semaphore, VkFence fence, uint32_t* pImageIndex) {
+        // TODO: Implement
+    }
+    void vkQueuePresentKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkResult input_result, VkQueue queue,
+                           const VkPresentInfoKHR* pPresentInfo) {
+        // TODO: Implement
+    }
+    void vkGetDeviceGroupPresentCapabilitiesKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device,
+        VkDeviceGroupPresentCapabilitiesKHR* pDeviceGroupPresentCapabilities) {
+        // TODO: Implement
+    }
+    void vkGetDeviceGroupSurfacePresentModesKHR(const uint8_t* snapshotTraceBegin,
+                                                size_t snapshotTraceBytes,
+                                                android::base::BumpPool* pool,
+                                                VkResult input_result, VkDevice device,
+                                                VkSurfaceKHR surface,
+                                                VkDeviceGroupPresentModeFlagsKHR* pModes) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDevicePresentRectanglesKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
+        uint32_t* pRectCount, VkRect2D* pRects) {
+        // TODO: Implement
+    }
+    void vkAcquireNextImage2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkResult input_result,
+                                VkDevice device, const VkAcquireNextImageInfoKHR* pAcquireInfo,
+                                uint32_t* pImageIndex) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_display
-void vkGetPhysicalDeviceDisplayPropertiesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t* pPropertyCount,
-    VkDisplayPropertiesKHR* pProperties)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDeviceDisplayPlanePropertiesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t* pPropertyCount,
-    VkDisplayPlanePropertiesKHR* pProperties)
-{
-    // TODO: Implement
-}
-void vkGetDisplayPlaneSupportedDisplaysKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t planeIndex,
-    uint32_t* pDisplayCount,
-    VkDisplayKHR* pDisplays)
-{
-    // TODO: Implement
-}
-void vkGetDisplayModePropertiesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    VkDisplayKHR display,
-    uint32_t* pPropertyCount,
-    VkDisplayModePropertiesKHR* pProperties)
-{
-    // TODO: Implement
-}
-void vkCreateDisplayModeKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    VkDisplayKHR display,
-    const VkDisplayModeCreateInfoKHR* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkDisplayModeKHR* pMode)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pMode create
-    mReconstruction.addHandles((const uint64_t*)pMode, 1);
-    if (!pMode) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkCreateDisplayModeKHR, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pMode, 1, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pMode, 1);
-}
-void vkGetDisplayPlaneCapabilitiesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    VkDisplayModeKHR mode,
-    uint32_t planeIndex,
-    VkDisplayPlaneCapabilitiesKHR* pCapabilities)
-{
-    // TODO: Implement
-}
-void vkCreateDisplayPlaneSurfaceKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    const VkDisplaySurfaceCreateInfoKHR* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
-{
-    // TODO: Implement
-}
+    void vkGetPhysicalDeviceDisplayPropertiesKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount,
+        VkDisplayPropertiesKHR* pProperties) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDeviceDisplayPlanePropertiesKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount,
+        VkDisplayPlanePropertiesKHR* pProperties) {
+        // TODO: Implement
+    }
+    void vkGetDisplayPlaneSupportedDisplaysKHR(const uint8_t* snapshotTraceBegin,
+                                               size_t snapshotTraceBytes,
+                                               android::base::BumpPool* pool, VkResult input_result,
+                                               VkPhysicalDevice physicalDevice, uint32_t planeIndex,
+                                               uint32_t* pDisplayCount, VkDisplayKHR* pDisplays) {
+        // TODO: Implement
+    }
+    void vkGetDisplayModePropertiesKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool, VkResult input_result,
+                                       VkPhysicalDevice physicalDevice, VkDisplayKHR display,
+                                       uint32_t* pPropertyCount,
+                                       VkDisplayModePropertiesKHR* pProperties) {
+        // TODO: Implement
+    }
+    void vkCreateDisplayModeKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkResult input_result,
+                                VkPhysicalDevice physicalDevice, VkDisplayKHR display,
+                                const VkDisplayModeCreateInfoKHR* pCreateInfo,
+                                const VkAllocationCallbacks* pAllocator, VkDisplayModeKHR* pMode) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pMode create
+        mReconstruction.addHandles((const uint64_t*)pMode, 1);
+        if (!pMode) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreateDisplayModeKHR, snapshotTraceBegin,
+                                    snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pMode, 1, apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pMode, 1);
+    }
+    void vkGetDisplayPlaneCapabilitiesKHR(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkResult input_result, VkPhysicalDevice physicalDevice,
+                                          VkDisplayModeKHR mode, uint32_t planeIndex,
+                                          VkDisplayPlaneCapabilitiesKHR* pCapabilities) {
+        // TODO: Implement
+    }
+    void vkCreateDisplayPlaneSurfaceKHR(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkResult input_result, VkInstance instance,
+                                        const VkDisplaySurfaceCreateInfoKHR* pCreateInfo,
+                                        const VkAllocationCallbacks* pAllocator,
+                                        VkSurfaceKHR* pSurface) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_display_swapchain
-void vkCreateSharedSwapchainsKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    uint32_t swapchainCount,
-    const VkSwapchainCreateInfoKHR* pCreateInfos,
-    const VkAllocationCallbacks* pAllocator,
-    VkSwapchainKHR* pSwapchains)
-{
-    // TODO: Implement
-}
+    void vkCreateSharedSwapchainsKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkResult input_result,
+                                     VkDevice device, uint32_t swapchainCount,
+                                     const VkSwapchainCreateInfoKHR* pCreateInfos,
+                                     const VkAllocationCallbacks* pAllocator,
+                                     VkSwapchainKHR* pSwapchains) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_xlib_surface
-void vkCreateXlibSurfaceKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    const VkXlibSurfaceCreateInfoKHR* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDeviceXlibPresentationSupportKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkBool32 input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t queueFamilyIndex,
-    Display* dpy,
-    VisualID visualID)
-{
-    // TODO: Implement
-}
+    void vkCreateXlibSurfaceKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkResult input_result,
+                                VkInstance instance, const VkXlibSurfaceCreateInfoKHR* pCreateInfo,
+                                const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDeviceXlibPresentationSupportKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkBool32 input_result, VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
+        Display* dpy, VisualID visualID) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_xcb_surface
-void vkCreateXcbSurfaceKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    const VkXcbSurfaceCreateInfoKHR* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDeviceXcbPresentationSupportKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkBool32 input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t queueFamilyIndex,
-    xcb_connection_t* connection,
-    xcb_visualid_t visual_id)
-{
-    // TODO: Implement
-}
+    void vkCreateXcbSurfaceKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, VkResult input_result,
+                               VkInstance instance, const VkXcbSurfaceCreateInfoKHR* pCreateInfo,
+                               const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDeviceXcbPresentationSupportKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkBool32 input_result, VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
+        xcb_connection_t* connection, xcb_visualid_t visual_id) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_wayland_surface
-void vkCreateWaylandSurfaceKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    const VkWaylandSurfaceCreateInfoKHR* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDeviceWaylandPresentationSupportKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkBool32 input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t queueFamilyIndex,
-    wl_display* display)
-{
-    // TODO: Implement
-}
+    void vkCreateWaylandSurfaceKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                   android::base::BumpPool* pool, VkResult input_result,
+                                   VkInstance instance,
+                                   const VkWaylandSurfaceCreateInfoKHR* pCreateInfo,
+                                   const VkAllocationCallbacks* pAllocator,
+                                   VkSurfaceKHR* pSurface) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDeviceWaylandPresentationSupportKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkBool32 input_result, VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
+        wl_display* display) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_android_surface
-void vkCreateAndroidSurfaceKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    const VkAndroidSurfaceCreateInfoKHR* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
-{
-    // TODO: Implement
-}
+    void vkCreateAndroidSurfaceKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                   android::base::BumpPool* pool, VkResult input_result,
+                                   VkInstance instance,
+                                   const VkAndroidSurfaceCreateInfoKHR* pCreateInfo,
+                                   const VkAllocationCallbacks* pAllocator,
+                                   VkSurfaceKHR* pSurface) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_win32_surface
-void vkCreateWin32SurfaceKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    const VkWin32SurfaceCreateInfoKHR* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDeviceWin32PresentationSupportKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkBool32 input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t queueFamilyIndex)
-{
-    // TODO: Implement
-}
+    void vkCreateWin32SurfaceKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                 android::base::BumpPool* pool, VkResult input_result,
+                                 VkInstance instance,
+                                 const VkWin32SurfaceCreateInfoKHR* pCreateInfo,
+                                 const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDeviceWin32PresentationSupportKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkBool32 input_result, VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_sampler_mirror_clamp_to_edge
 #endif
 #ifdef VK_KHR_video_queue
-void vkGetPhysicalDeviceVideoCapabilitiesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    const VkVideoProfileKHR* pVideoProfile,
-    VkVideoCapabilitiesKHR* pCapabilities)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDeviceVideoFormatPropertiesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    const VkPhysicalDeviceVideoFormatInfoKHR* pVideoFormatInfo,
-    uint32_t* pVideoFormatPropertyCount,
-    VkVideoFormatPropertiesKHR* pVideoFormatProperties)
-{
-    // TODO: Implement
-}
-void vkCreateVideoSessionKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkVideoSessionCreateInfoKHR* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkVideoSessionKHR* pVideoSession)
-{
-    // TODO: Implement
-}
-void vkDestroyVideoSessionKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkVideoSessionKHR videoSession,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-}
-void vkGetVideoSessionMemoryRequirementsKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkVideoSessionKHR videoSession,
-    uint32_t* pVideoSessionMemoryRequirementsCount,
-    VkVideoGetMemoryPropertiesKHR* pVideoSessionMemoryRequirements)
-{
-    // TODO: Implement
-}
-void vkBindVideoSessionMemoryKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkVideoSessionKHR videoSession,
-    uint32_t videoSessionBindMemoryCount,
-    const VkVideoBindMemoryKHR* pVideoSessionBindMemories)
-{
-    // TODO: Implement
-}
-void vkCreateVideoSessionParametersKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkVideoSessionParametersCreateInfoKHR* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkVideoSessionParametersKHR* pVideoSessionParameters)
-{
-    // TODO: Implement
-}
-void vkUpdateVideoSessionParametersKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkVideoSessionParametersKHR videoSessionParameters,
-    const VkVideoSessionParametersUpdateInfoKHR* pUpdateInfo)
-{
-    // TODO: Implement
-}
-void vkDestroyVideoSessionParametersKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkVideoSessionParametersKHR videoSessionParameters,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-}
-void vkCmdBeginVideoCodingKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkVideoBeginCodingInfoKHR* pBeginInfo)
-{
-    // TODO: Implement
-}
-void vkCmdEndVideoCodingKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkVideoEndCodingInfoKHR* pEndCodingInfo)
-{
-    // TODO: Implement
-}
-void vkCmdControlVideoCodingKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkVideoCodingControlInfoKHR* pCodingControlInfo)
-{
-    // TODO: Implement
-}
+    void vkGetPhysicalDeviceVideoCapabilitiesKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice,
+        const VkVideoProfileKHR* pVideoProfile, VkVideoCapabilitiesKHR* pCapabilities) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDeviceVideoFormatPropertiesKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice,
+        const VkPhysicalDeviceVideoFormatInfoKHR* pVideoFormatInfo,
+        uint32_t* pVideoFormatPropertyCount, VkVideoFormatPropertiesKHR* pVideoFormatProperties) {
+        // TODO: Implement
+    }
+    void vkCreateVideoSessionKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                 android::base::BumpPool* pool, VkResult input_result,
+                                 VkDevice device, const VkVideoSessionCreateInfoKHR* pCreateInfo,
+                                 const VkAllocationCallbacks* pAllocator,
+                                 VkVideoSessionKHR* pVideoSession) {
+        // TODO: Implement
+    }
+    void vkDestroyVideoSessionKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkDevice device,
+                                  VkVideoSessionKHR videoSession,
+                                  const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+    }
+    void vkGetVideoSessionMemoryRequirementsKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, VkVideoSessionKHR videoSession,
+        uint32_t* pVideoSessionMemoryRequirementsCount,
+        VkVideoGetMemoryPropertiesKHR* pVideoSessionMemoryRequirements) {
+        // TODO: Implement
+    }
+    void vkBindVideoSessionMemoryKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkResult input_result,
+                                     VkDevice device, VkVideoSessionKHR videoSession,
+                                     uint32_t videoSessionBindMemoryCount,
+                                     const VkVideoBindMemoryKHR* pVideoSessionBindMemories) {
+        // TODO: Implement
+    }
+    void vkCreateVideoSessionParametersKHR(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkResult input_result, VkDevice device,
+                                           const VkVideoSessionParametersCreateInfoKHR* pCreateInfo,
+                                           const VkAllocationCallbacks* pAllocator,
+                                           VkVideoSessionParametersKHR* pVideoSessionParameters) {
+        // TODO: Implement
+    }
+    void vkUpdateVideoSessionParametersKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, VkVideoSessionParametersKHR videoSessionParameters,
+        const VkVideoSessionParametersUpdateInfoKHR* pUpdateInfo) {
+        // TODO: Implement
+    }
+    void vkDestroyVideoSessionParametersKHR(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool, VkDevice device,
+                                            VkVideoSessionParametersKHR videoSessionParameters,
+                                            const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+    }
+    void vkCmdBeginVideoCodingKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                  const VkVideoBeginCodingInfoKHR* pBeginInfo) {
+        // TODO: Implement
+    }
+    void vkCmdEndVideoCodingKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                const VkVideoEndCodingInfoKHR* pEndCodingInfo) {
+        // TODO: Implement
+    }
+    void vkCmdControlVideoCodingKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                    const VkVideoCodingControlInfoKHR* pCodingControlInfo) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_video_decode_queue
-void vkCmdDecodeVideoKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkVideoDecodeInfoKHR* pFrameInfo)
-{
-    // TODO: Implement
-}
+    void vkCmdDecodeVideoKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                             const VkVideoDecodeInfoKHR* pFrameInfo) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_dynamic_rendering
-void vkCmdBeginRenderingKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkRenderingInfoKHR* pRenderingInfo)
-{
-    // TODO: Implement
-}
-void vkCmdEndRenderingKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer)
-{
-    // TODO: Implement
-}
+    void vkCmdBeginRenderingKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                const VkRenderingInfoKHR* pRenderingInfo) {
+        // TODO: Implement
+    }
+    void vkCmdEndRenderingKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkCommandBuffer commandBuffer) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_multiview
 #endif
 #ifdef VK_KHR_get_physical_device_properties2
-void vkGetPhysicalDeviceFeatures2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    VkPhysicalDeviceFeatures2* pFeatures)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDeviceProperties2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    VkPhysicalDeviceProperties2* pProperties)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDeviceFormatProperties2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    VkFormat format,
-    VkFormatProperties2* pFormatProperties)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDeviceImageFormatProperties2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo,
-    VkImageFormatProperties2* pImageFormatProperties)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDeviceQueueFamilyProperties2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    uint32_t* pQueueFamilyPropertyCount,
-    VkQueueFamilyProperties2* pQueueFamilyProperties)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDeviceMemoryProperties2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    VkPhysicalDeviceMemoryProperties2* pMemoryProperties)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDeviceSparseImageFormatProperties2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    const VkPhysicalDeviceSparseImageFormatInfo2* pFormatInfo,
-    uint32_t* pPropertyCount,
-    VkSparseImageFormatProperties2* pProperties)
-{
-    // TODO: Implement
-}
+    void vkGetPhysicalDeviceFeatures2KHR(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkPhysicalDevice physicalDevice,
+                                         VkPhysicalDeviceFeatures2* pFeatures) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDeviceProperties2KHR(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkPhysicalDevice physicalDevice,
+                                           VkPhysicalDeviceProperties2* pProperties) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDeviceFormatProperties2KHR(const uint8_t* snapshotTraceBegin,
+                                                 size_t snapshotTraceBytes,
+                                                 android::base::BumpPool* pool,
+                                                 VkPhysicalDevice physicalDevice, VkFormat format,
+                                                 VkFormatProperties2* pFormatProperties) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDeviceImageFormatProperties2KHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice,
+        const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo,
+        VkImageFormatProperties2* pImageFormatProperties) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDeviceQueueFamilyProperties2KHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkPhysicalDevice physicalDevice, uint32_t* pQueueFamilyPropertyCount,
+        VkQueueFamilyProperties2* pQueueFamilyProperties) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDeviceMemoryProperties2KHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties2* pMemoryProperties) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDeviceSparseImageFormatProperties2KHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSparseImageFormatInfo2* pFormatInfo,
+        uint32_t* pPropertyCount, VkSparseImageFormatProperties2* pProperties) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_device_group
-void vkGetDeviceGroupPeerMemoryFeaturesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    uint32_t heapIndex,
-    uint32_t localDeviceIndex,
-    uint32_t remoteDeviceIndex,
-    VkPeerMemoryFeatureFlags* pPeerMemoryFeatures)
-{
-    // TODO: Implement
-}
-void vkCmdSetDeviceMaskKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t deviceMask)
-{
-    // TODO: Implement
-}
-void vkCmdDispatchBaseKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t baseGroupX,
-    uint32_t baseGroupY,
-    uint32_t baseGroupZ,
-    uint32_t groupCountX,
-    uint32_t groupCountY,
-    uint32_t groupCountZ)
-{
-    // TODO: Implement
-}
+    void vkGetDeviceGroupPeerMemoryFeaturesKHR(const uint8_t* snapshotTraceBegin,
+                                               size_t snapshotTraceBytes,
+                                               android::base::BumpPool* pool, VkDevice device,
+                                               uint32_t heapIndex, uint32_t localDeviceIndex,
+                                               uint32_t remoteDeviceIndex,
+                                               VkPeerMemoryFeatureFlags* pPeerMemoryFeatures) {
+        // TODO: Implement
+    }
+    void vkCmdSetDeviceMaskKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                               uint32_t deviceMask) {
+        // TODO: Implement
+    }
+    void vkCmdDispatchBaseKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                              uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ,
+                              uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_shader_draw_parameters
 #endif
 #ifdef VK_KHR_maintenance1
-void vkTrimCommandPoolKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkCommandPool commandPool,
-    VkCommandPoolTrimFlags flags)
-{
-    // TODO: Implement
-}
+    void vkTrimCommandPoolKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkDevice device,
+                              VkCommandPool commandPool, VkCommandPoolTrimFlags flags) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_device_group_creation
-void vkEnumeratePhysicalDeviceGroupsKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    uint32_t* pPhysicalDeviceGroupCount,
-    VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProperties)
-{
-    // TODO: Implement
-}
+    void vkEnumeratePhysicalDeviceGroupsKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkInstance instance, uint32_t* pPhysicalDeviceGroupCount,
+        VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProperties) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_external_memory_capabilities
-void vkGetPhysicalDeviceExternalBufferPropertiesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    const VkPhysicalDeviceExternalBufferInfo* pExternalBufferInfo,
-    VkExternalBufferProperties* pExternalBufferProperties)
-{
-    // TODO: Implement
-}
+    void vkGetPhysicalDeviceExternalBufferPropertiesKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkPhysicalDevice physicalDevice,
+        const VkPhysicalDeviceExternalBufferInfo* pExternalBufferInfo,
+        VkExternalBufferProperties* pExternalBufferProperties) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_external_memory
 #endif
 #ifdef VK_KHR_external_memory_win32
-void vkGetMemoryWin32HandleKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkMemoryGetWin32HandleInfoKHR* pGetWin32HandleInfo,
-    HANDLE* pHandle)
-{
-    // TODO: Implement
-}
-void vkGetMemoryWin32HandlePropertiesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkExternalMemoryHandleTypeFlagBits handleType,
-    HANDLE handle,
-    VkMemoryWin32HandlePropertiesKHR* pMemoryWin32HandleProperties)
-{
-    // TODO: Implement
-}
+    void vkGetMemoryWin32HandleKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                   android::base::BumpPool* pool, VkResult input_result,
+                                   VkDevice device,
+                                   const VkMemoryGetWin32HandleInfoKHR* pGetWin32HandleInfo,
+                                   HANDLE* pHandle) {
+        // TODO: Implement
+    }
+    void vkGetMemoryWin32HandlePropertiesKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType,
+        HANDLE handle, VkMemoryWin32HandlePropertiesKHR* pMemoryWin32HandleProperties) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_external_memory_fd
-void vkGetMemoryFdKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkMemoryGetFdInfoKHR* pGetFdInfo,
-    int* pFd)
-{
-    // TODO: Implement
-}
-void vkGetMemoryFdPropertiesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkExternalMemoryHandleTypeFlagBits handleType,
-    int fd,
-    VkMemoryFdPropertiesKHR* pMemoryFdProperties)
-{
-    // TODO: Implement
-}
+    void vkGetMemoryFdKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                          android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                          const VkMemoryGetFdInfoKHR* pGetFdInfo, int* pFd) {
+        // TODO: Implement
+    }
+    void vkGetMemoryFdPropertiesKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkResult input_result,
+                                    VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType,
+                                    int fd, VkMemoryFdPropertiesKHR* pMemoryFdProperties) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_win32_keyed_mutex
 #endif
 #ifdef VK_KHR_external_semaphore_capabilities
-void vkGetPhysicalDeviceExternalSemaphorePropertiesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo,
-    VkExternalSemaphoreProperties* pExternalSemaphoreProperties)
-{
-    // TODO: Implement
-}
+    void vkGetPhysicalDeviceExternalSemaphorePropertiesKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkPhysicalDevice physicalDevice,
+        const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo,
+        VkExternalSemaphoreProperties* pExternalSemaphoreProperties) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_external_semaphore
 #endif
 #ifdef VK_KHR_external_semaphore_win32
-void vkImportSemaphoreWin32HandleKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkImportSemaphoreWin32HandleInfoKHR* pImportSemaphoreWin32HandleInfo)
-{
-    // TODO: Implement
-}
-void vkGetSemaphoreWin32HandleKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkSemaphoreGetWin32HandleInfoKHR* pGetWin32HandleInfo,
-    HANDLE* pHandle)
-{
-    // TODO: Implement
-}
+    void vkImportSemaphoreWin32HandleKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device,
+        const VkImportSemaphoreWin32HandleInfoKHR* pImportSemaphoreWin32HandleInfo) {
+        // TODO: Implement
+    }
+    void vkGetSemaphoreWin32HandleKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkResult input_result,
+                                      VkDevice device,
+                                      const VkSemaphoreGetWin32HandleInfoKHR* pGetWin32HandleInfo,
+                                      HANDLE* pHandle) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_external_semaphore_fd
-void vkImportSemaphoreFdKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkImportSemaphoreFdInfoKHR* pImportSemaphoreFdInfo)
-{
-    // TODO: Implement
-}
-void vkGetSemaphoreFdKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkSemaphoreGetFdInfoKHR* pGetFdInfo,
-    int* pFd)
-{
-    // TODO: Implement
-}
+    void vkImportSemaphoreFdKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkResult input_result,
+                                VkDevice device,
+                                const VkImportSemaphoreFdInfoKHR* pImportSemaphoreFdInfo) {
+        // TODO: Implement
+    }
+    void vkGetSemaphoreFdKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                             const VkSemaphoreGetFdInfoKHR* pGetFdInfo, int* pFd) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_push_descriptor
-void vkCmdPushDescriptorSetKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkPipelineBindPoint pipelineBindPoint,
-    VkPipelineLayout layout,
-    uint32_t set,
-    uint32_t descriptorWriteCount,
-    const VkWriteDescriptorSet* pDescriptorWrites)
-{
-    // TODO: Implement
-}
-void vkCmdPushDescriptorSetWithTemplateKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkDescriptorUpdateTemplate descriptorUpdateTemplate,
-    VkPipelineLayout layout,
-    uint32_t set,
-    const void* pData)
-{
-    // TODO: Implement
-}
+    void vkCmdPushDescriptorSetKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                   android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                   VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
+                                   uint32_t set, uint32_t descriptorWriteCount,
+                                   const VkWriteDescriptorSet* pDescriptorWrites) {
+        // TODO: Implement
+    }
+    void vkCmdPushDescriptorSetWithTemplateKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkCommandBuffer commandBuffer, VkDescriptorUpdateTemplate descriptorUpdateTemplate,
+        VkPipelineLayout layout, uint32_t set, const void* pData) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_shader_float16_int8
 #endif
@@ -3260,298 +2083,206 @@
 #ifdef VK_KHR_incremental_present
 #endif
 #ifdef VK_KHR_descriptor_update_template
-void vkCreateDescriptorUpdateTemplateKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkDescriptorUpdateTemplate* pDescriptorUpdateTemplate)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pDescriptorUpdateTemplate create
-    mReconstruction.addHandles((const uint64_t*)pDescriptorUpdateTemplate, 1);
-    mReconstruction.addHandleDependency((const uint64_t*)pDescriptorUpdateTemplate, 1, (uint64_t)(uintptr_t)device);
-    if (!pDescriptorUpdateTemplate) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkCreateDescriptorUpdateTemplateKHR, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pDescriptorUpdateTemplate, 1, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pDescriptorUpdateTemplate, 1);
-}
-void vkDestroyDescriptorUpdateTemplateKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkDescriptorUpdateTemplate descriptorUpdateTemplate,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // descriptorUpdateTemplate destroy
-    mReconstruction.removeHandles((const uint64_t*)(&descriptorUpdateTemplate), 1);
-}
-void vkUpdateDescriptorSetWithTemplateKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkDescriptorSet descriptorSet,
-    VkDescriptorUpdateTemplate descriptorUpdateTemplate,
-    const void* pData)
-{
-    // TODO: Implement
-}
+    void vkCreateDescriptorUpdateTemplateKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device,
+        const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo,
+        const VkAllocationCallbacks* pAllocator,
+        VkDescriptorUpdateTemplate* pDescriptorUpdateTemplate) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pDescriptorUpdateTemplate create
+        mReconstruction.addHandles((const uint64_t*)pDescriptorUpdateTemplate, 1);
+        mReconstruction.addHandleDependency((const uint64_t*)pDescriptorUpdateTemplate, 1,
+                                            (uint64_t)(uintptr_t)device);
+        if (!pDescriptorUpdateTemplate) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreateDescriptorUpdateTemplateKHR,
+                                    snapshotTraceBegin, snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pDescriptorUpdateTemplate, 1,
+                                            apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle,
+                                                (const uint64_t*)pDescriptorUpdateTemplate, 1);
+    }
+    void vkDestroyDescriptorUpdateTemplateKHR(const uint8_t* snapshotTraceBegin,
+                                              size_t snapshotTraceBytes,
+                                              android::base::BumpPool* pool, VkDevice device,
+                                              VkDescriptorUpdateTemplate descriptorUpdateTemplate,
+                                              const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // descriptorUpdateTemplate destroy
+        mReconstruction.removeHandles((const uint64_t*)(&descriptorUpdateTemplate), 1);
+    }
+    void vkUpdateDescriptorSetWithTemplateKHR(const uint8_t* snapshotTraceBegin,
+                                              size_t snapshotTraceBytes,
+                                              android::base::BumpPool* pool, VkDevice device,
+                                              VkDescriptorSet descriptorSet,
+                                              VkDescriptorUpdateTemplate descriptorUpdateTemplate,
+                                              const void* pData) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_imageless_framebuffer
 #endif
 #ifdef VK_KHR_create_renderpass2
-void vkCreateRenderPass2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkRenderPassCreateInfo2* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkRenderPass* pRenderPass)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pRenderPass create
-    mReconstruction.addHandles((const uint64_t*)pRenderPass, 1);
-    mReconstruction.addHandleDependency((const uint64_t*)pRenderPass, 1, (uint64_t)(uintptr_t)device);
-    if (!pRenderPass) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkCreateRenderPass2KHR, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pRenderPass, 1, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pRenderPass, 1);
-}
-void vkCmdBeginRenderPass2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkRenderPassBeginInfo* pRenderPassBegin,
-    const VkSubpassBeginInfo* pSubpassBeginInfo)
-{
-    // TODO: Implement
-}
-void vkCmdNextSubpass2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkSubpassBeginInfo* pSubpassBeginInfo,
-    const VkSubpassEndInfo* pSubpassEndInfo)
-{
-    // TODO: Implement
-}
-void vkCmdEndRenderPass2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkSubpassEndInfo* pSubpassEndInfo)
-{
-    // TODO: Implement
-}
+    void vkCreateRenderPass2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkResult input_result,
+                                VkDevice device, const VkRenderPassCreateInfo2* pCreateInfo,
+                                const VkAllocationCallbacks* pAllocator,
+                                VkRenderPass* pRenderPass) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pRenderPass create
+        mReconstruction.addHandles((const uint64_t*)pRenderPass, 1);
+        mReconstruction.addHandleDependency((const uint64_t*)pRenderPass, 1,
+                                            (uint64_t)(uintptr_t)device);
+        if (!pRenderPass) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreateRenderPass2KHR, snapshotTraceBegin,
+                                    snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pRenderPass, 1, apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pRenderPass, 1);
+    }
+    void vkCmdBeginRenderPass2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                  const VkRenderPassBeginInfo* pRenderPassBegin,
+                                  const VkSubpassBeginInfo* pSubpassBeginInfo) {
+        // TODO: Implement
+    }
+    void vkCmdNextSubpass2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                              const VkSubpassBeginInfo* pSubpassBeginInfo,
+                              const VkSubpassEndInfo* pSubpassEndInfo) {
+        // TODO: Implement
+    }
+    void vkCmdEndRenderPass2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                const VkSubpassEndInfo* pSubpassEndInfo) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_shared_presentable_image
-void vkGetSwapchainStatusKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkSwapchainKHR swapchain)
-{
-    // TODO: Implement
-}
+    void vkGetSwapchainStatusKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                 android::base::BumpPool* pool, VkResult input_result,
+                                 VkDevice device, VkSwapchainKHR swapchain) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_external_fence_capabilities
-void vkGetPhysicalDeviceExternalFencePropertiesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo,
-    VkExternalFenceProperties* pExternalFenceProperties)
-{
-    // TODO: Implement
-}
+    void vkGetPhysicalDeviceExternalFencePropertiesKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkPhysicalDevice physicalDevice,
+        const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo,
+        VkExternalFenceProperties* pExternalFenceProperties) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_external_fence
 #endif
 #ifdef VK_KHR_external_fence_win32
-void vkImportFenceWin32HandleKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkImportFenceWin32HandleInfoKHR* pImportFenceWin32HandleInfo)
-{
-    // TODO: Implement
-}
-void vkGetFenceWin32HandleKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkFenceGetWin32HandleInfoKHR* pGetWin32HandleInfo,
-    HANDLE* pHandle)
-{
-    // TODO: Implement
-}
+    void vkImportFenceWin32HandleKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device,
+        const VkImportFenceWin32HandleInfoKHR* pImportFenceWin32HandleInfo) {
+        // TODO: Implement
+    }
+    void vkGetFenceWin32HandleKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkResult input_result,
+                                  VkDevice device,
+                                  const VkFenceGetWin32HandleInfoKHR* pGetWin32HandleInfo,
+                                  HANDLE* pHandle) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_external_fence_fd
-void vkImportFenceFdKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkImportFenceFdInfoKHR* pImportFenceFdInfo)
-{
-    // TODO: Implement
-}
-void vkGetFenceFdKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkFenceGetFdInfoKHR* pGetFdInfo,
-    int* pFd)
-{
-    // TODO: Implement
-}
+    void vkImportFenceFdKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                            const VkImportFenceFdInfoKHR* pImportFenceFdInfo) {
+        // TODO: Implement
+    }
+    void vkGetFenceFdKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                         android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                         const VkFenceGetFdInfoKHR* pGetFdInfo, int* pFd) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_performance_query
-void vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t queueFamilyIndex,
-    uint32_t* pCounterCount,
-    VkPerformanceCounterKHR* pCounters,
-    VkPerformanceCounterDescriptionKHR* pCounterDescriptions)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    const VkQueryPoolPerformanceCreateInfoKHR* pPerformanceQueryCreateInfo,
-    uint32_t* pNumPasses)
-{
-    // TODO: Implement
-}
-void vkAcquireProfilingLockKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkAcquireProfilingLockInfoKHR* pInfo)
-{
-    // TODO: Implement
-}
-void vkReleaseProfilingLockKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device)
-{
-    // TODO: Implement
-}
+    void vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
+        uint32_t* pCounterCount, VkPerformanceCounterKHR* pCounters,
+        VkPerformanceCounterDescriptionKHR* pCounterDescriptions) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkPhysicalDevice physicalDevice,
+        const VkQueryPoolPerformanceCreateInfoKHR* pPerformanceQueryCreateInfo,
+        uint32_t* pNumPasses) {
+        // TODO: Implement
+    }
+    void vkAcquireProfilingLockKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                   android::base::BumpPool* pool, VkResult input_result,
+                                   VkDevice device, const VkAcquireProfilingLockInfoKHR* pInfo) {
+        // TODO: Implement
+    }
+    void vkReleaseProfilingLockKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                   android::base::BumpPool* pool, VkDevice device) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_maintenance2
 #endif
 #ifdef VK_KHR_get_surface_capabilities2
-void vkGetPhysicalDeviceSurfaceCapabilities2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo,
-    VkSurfaceCapabilities2KHR* pSurfaceCapabilities)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDeviceSurfaceFormats2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo,
-    uint32_t* pSurfaceFormatCount,
-    VkSurfaceFormat2KHR* pSurfaceFormats)
-{
-    // TODO: Implement
-}
+    void vkGetPhysicalDeviceSurfaceCapabilities2KHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice,
+        const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo,
+        VkSurfaceCapabilities2KHR* pSurfaceCapabilities) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDeviceSurfaceFormats2KHR(const uint8_t* snapshotTraceBegin,
+                                               size_t snapshotTraceBytes,
+                                               android::base::BumpPool* pool, VkResult input_result,
+                                               VkPhysicalDevice physicalDevice,
+                                               const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo,
+                                               uint32_t* pSurfaceFormatCount,
+                                               VkSurfaceFormat2KHR* pSurfaceFormats) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_variable_pointers
 #endif
 #ifdef VK_KHR_get_display_properties2
-void vkGetPhysicalDeviceDisplayProperties2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t* pPropertyCount,
-    VkDisplayProperties2KHR* pProperties)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDeviceDisplayPlaneProperties2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t* pPropertyCount,
-    VkDisplayPlaneProperties2KHR* pProperties)
-{
-    // TODO: Implement
-}
-void vkGetDisplayModeProperties2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    VkDisplayKHR display,
-    uint32_t* pPropertyCount,
-    VkDisplayModeProperties2KHR* pProperties)
-{
-    // TODO: Implement
-}
-void vkGetDisplayPlaneCapabilities2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    const VkDisplayPlaneInfo2KHR* pDisplayPlaneInfo,
-    VkDisplayPlaneCapabilities2KHR* pCapabilities)
-{
-    // TODO: Implement
-}
+    void vkGetPhysicalDeviceDisplayProperties2KHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount,
+        VkDisplayProperties2KHR* pProperties) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDeviceDisplayPlaneProperties2KHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount,
+        VkDisplayPlaneProperties2KHR* pProperties) {
+        // TODO: Implement
+    }
+    void vkGetDisplayModeProperties2KHR(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkResult input_result, VkPhysicalDevice physicalDevice,
+                                        VkDisplayKHR display, uint32_t* pPropertyCount,
+                                        VkDisplayModeProperties2KHR* pProperties) {
+        // TODO: Implement
+    }
+    void vkGetDisplayPlaneCapabilities2KHR(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkResult input_result, VkPhysicalDevice physicalDevice,
+                                           const VkDisplayPlaneInfo2KHR* pDisplayPlaneInfo,
+                                           VkDisplayPlaneCapabilities2KHR* pCapabilities) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_dedicated_allocation
 #endif
@@ -3560,144 +2291,103 @@
 #ifdef VK_KHR_relaxed_block_layout
 #endif
 #ifdef VK_KHR_get_memory_requirements2
-void vkGetImageMemoryRequirements2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    const VkImageMemoryRequirementsInfo2* pInfo,
-    VkMemoryRequirements2* pMemoryRequirements)
-{
-    // TODO: Implement
-}
-void vkGetBufferMemoryRequirements2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    const VkBufferMemoryRequirementsInfo2* pInfo,
-    VkMemoryRequirements2* pMemoryRequirements)
-{
-    // TODO: Implement
-}
-void vkGetImageSparseMemoryRequirements2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    const VkImageSparseMemoryRequirementsInfo2* pInfo,
-    uint32_t* pSparseMemoryRequirementCount,
-    VkSparseImageMemoryRequirements2* pSparseMemoryRequirements)
-{
-    // TODO: Implement
-}
+    void vkGetImageMemoryRequirements2KHR(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkDevice device,
+                                          const VkImageMemoryRequirementsInfo2* pInfo,
+                                          VkMemoryRequirements2* pMemoryRequirements) {
+        // TODO: Implement
+    }
+    void vkGetBufferMemoryRequirements2KHR(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkDevice device,
+                                           const VkBufferMemoryRequirementsInfo2* pInfo,
+                                           VkMemoryRequirements2* pMemoryRequirements) {
+        // TODO: Implement
+    }
+    void vkGetImageSparseMemoryRequirements2KHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkDevice device, const VkImageSparseMemoryRequirementsInfo2* pInfo,
+        uint32_t* pSparseMemoryRequirementCount,
+        VkSparseImageMemoryRequirements2* pSparseMemoryRequirements) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_image_format_list
 #endif
 #ifdef VK_KHR_sampler_ycbcr_conversion
-void vkCreateSamplerYcbcrConversionKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkSamplerYcbcrConversionCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSamplerYcbcrConversion* pYcbcrConversion)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pYcbcrConversion create
-    mReconstruction.addHandles((const uint64_t*)pYcbcrConversion, 1);
-    mReconstruction.addHandleDependency((const uint64_t*)pYcbcrConversion, 1, (uint64_t)(uintptr_t)device);
-    if (!pYcbcrConversion) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkCreateSamplerYcbcrConversionKHR, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pYcbcrConversion, 1, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pYcbcrConversion, 1);
-}
-void vkDestroySamplerYcbcrConversionKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkSamplerYcbcrConversion ycbcrConversion,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // ycbcrConversion destroy
-    mReconstruction.removeHandles((const uint64_t*)(&ycbcrConversion), 1);
-}
+    void vkCreateSamplerYcbcrConversionKHR(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkResult input_result, VkDevice device,
+                                           const VkSamplerYcbcrConversionCreateInfo* pCreateInfo,
+                                           const VkAllocationCallbacks* pAllocator,
+                                           VkSamplerYcbcrConversion* pYcbcrConversion) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pYcbcrConversion create
+        mReconstruction.addHandles((const uint64_t*)pYcbcrConversion, 1);
+        mReconstruction.addHandleDependency((const uint64_t*)pYcbcrConversion, 1,
+                                            (uint64_t)(uintptr_t)device);
+        if (!pYcbcrConversion) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreateSamplerYcbcrConversionKHR,
+                                    snapshotTraceBegin, snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pYcbcrConversion, 1, apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pYcbcrConversion, 1);
+    }
+    void vkDestroySamplerYcbcrConversionKHR(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool, VkDevice device,
+                                            VkSamplerYcbcrConversion ycbcrConversion,
+                                            const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // ycbcrConversion destroy
+        mReconstruction.removeHandles((const uint64_t*)(&ycbcrConversion), 1);
+    }
 #endif
 #ifdef VK_KHR_bind_memory2
-void vkBindBufferMemory2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    uint32_t bindInfoCount,
-    const VkBindBufferMemoryInfo* pBindInfos)
-{
-    // TODO: Implement
-}
-void vkBindImageMemory2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    uint32_t bindInfoCount,
-    const VkBindImageMemoryInfo* pBindInfos)
-{
-    // TODO: Implement
-}
+    void vkBindBufferMemory2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkResult input_result,
+                                VkDevice device, uint32_t bindInfoCount,
+                                const VkBindBufferMemoryInfo* pBindInfos) {
+        // TODO: Implement
+    }
+    void vkBindImageMemory2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, VkResult input_result,
+                               VkDevice device, uint32_t bindInfoCount,
+                               const VkBindImageMemoryInfo* pBindInfos) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_portability_subset
 #endif
 #ifdef VK_KHR_maintenance3
-void vkGetDescriptorSetLayoutSupportKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
-    VkDescriptorSetLayoutSupport* pSupport)
-{
-    // TODO: Implement
-}
+    void vkGetDescriptorSetLayoutSupportKHR(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool, VkDevice device,
+                                            const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
+                                            VkDescriptorSetLayoutSupport* pSupport) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_draw_indirect_count
-void vkCmdDrawIndirectCountKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBuffer buffer,
-    VkDeviceSize offset,
-    VkBuffer countBuffer,
-    VkDeviceSize countBufferOffset,
-    uint32_t maxDrawCount,
-    uint32_t stride)
-{
-    // TODO: Implement
-}
-void vkCmdDrawIndexedIndirectCountKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBuffer buffer,
-    VkDeviceSize offset,
-    VkBuffer countBuffer,
-    VkDeviceSize countBufferOffset,
-    uint32_t maxDrawCount,
-    uint32_t stride)
-{
-    // TODO: Implement
-}
+    void vkCmdDrawIndirectCountKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                   android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                   VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
+                                   VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+                                   uint32_t stride) {
+        // TODO: Implement
+    }
+    void vkCmdDrawIndexedIndirectCountKHR(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkCommandBuffer commandBuffer, VkBuffer buffer,
+                                          VkDeviceSize offset, VkBuffer countBuffer,
+                                          VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+                                          uint32_t stride) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_shader_subgroup_extended_types
 #endif
@@ -3716,65 +2406,40 @@
 #ifdef VK_KHR_swapchain_mutable_format
 #endif
 #ifdef VK_KHR_timeline_semaphore
-void vkGetSemaphoreCounterValueKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkSemaphore semaphore,
-    uint64_t* pValue)
-{
-    // TODO: Implement
-}
-void vkWaitSemaphoresKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkSemaphoreWaitInfo* pWaitInfo,
-    uint64_t timeout)
-{
-    // TODO: Implement
-}
-void vkSignalSemaphoreKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkSemaphoreSignalInfo* pSignalInfo)
-{
-    // TODO: Implement
-}
+    void vkGetSemaphoreCounterValueKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool, VkResult input_result,
+                                       VkDevice device, VkSemaphore semaphore, uint64_t* pValue) {
+        // TODO: Implement
+    }
+    void vkWaitSemaphoresKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                             const VkSemaphoreWaitInfo* pWaitInfo, uint64_t timeout) {
+        // TODO: Implement
+    }
+    void vkSignalSemaphoreKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                              const VkSemaphoreSignalInfo* pSignalInfo) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_vulkan_memory_model
 #endif
 #ifdef VK_KHR_shader_terminate_invocation
 #endif
 #ifdef VK_KHR_fragment_shading_rate
-void vkGetPhysicalDeviceFragmentShadingRatesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t* pFragmentShadingRateCount,
-    VkPhysicalDeviceFragmentShadingRateKHR* pFragmentShadingRates)
-{
-    // TODO: Implement
-}
-void vkCmdSetFragmentShadingRateKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkExtent2D* pFragmentSize,
-    const VkFragmentShadingRateCombinerOpKHR combinerOps[2])
-{
-    // TODO: Implement
-}
+    void vkGetPhysicalDeviceFragmentShadingRatesKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice, uint32_t* pFragmentShadingRateCount,
+        VkPhysicalDeviceFragmentShadingRateKHR* pFragmentShadingRates) {
+        // TODO: Implement
+    }
+    void vkCmdSetFragmentShadingRateKHR(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkCommandBuffer commandBuffer,
+                                        const VkExtent2D* pFragmentSize,
+                                        const VkFragmentShadingRateCombinerOpKHR combinerOps[2]) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_spirv_1_4
 #endif
@@ -3783,143 +2448,86 @@
 #ifdef VK_KHR_separate_depth_stencil_layouts
 #endif
 #ifdef VK_KHR_present_wait
-void vkWaitForPresentKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkSwapchainKHR swapchain,
-    uint64_t presentId,
-    uint64_t timeout)
-{
-    // TODO: Implement
-}
+    void vkWaitForPresentKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                             VkSwapchainKHR swapchain, uint64_t presentId, uint64_t timeout) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_uniform_buffer_standard_layout
 #endif
 #ifdef VK_KHR_buffer_device_address
-void vkGetBufferDeviceAddressKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDeviceAddress input_result,
-    VkDevice device,
-    const VkBufferDeviceAddressInfo* pInfo)
-{
-    // TODO: Implement
-}
-void vkGetBufferOpaqueCaptureAddressKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    uint64_t input_result,
-    VkDevice device,
-    const VkBufferDeviceAddressInfo* pInfo)
-{
-    // TODO: Implement
-}
-void vkGetDeviceMemoryOpaqueCaptureAddressKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    uint64_t input_result,
-    VkDevice device,
-    const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo)
-{
-    // TODO: Implement
-}
+    void vkGetBufferDeviceAddressKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkDeviceAddress input_result,
+                                     VkDevice device, const VkBufferDeviceAddressInfo* pInfo) {
+        // TODO: Implement
+    }
+    void vkGetBufferOpaqueCaptureAddressKHR(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool, uint64_t input_result,
+                                            VkDevice device,
+                                            const VkBufferDeviceAddressInfo* pInfo) {
+        // TODO: Implement
+    }
+    void vkGetDeviceMemoryOpaqueCaptureAddressKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        uint64_t input_result, VkDevice device,
+        const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_deferred_host_operations
-void vkCreateDeferredOperationKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkAllocationCallbacks* pAllocator,
-    VkDeferredOperationKHR* pDeferredOperation)
-{
-    // TODO: Implement
-}
-void vkDestroyDeferredOperationKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkDeferredOperationKHR operation,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-}
-void vkGetDeferredOperationMaxConcurrencyKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    uint32_t input_result,
-    VkDevice device,
-    VkDeferredOperationKHR operation)
-{
-    // TODO: Implement
-}
-void vkGetDeferredOperationResultKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkDeferredOperationKHR operation)
-{
-    // TODO: Implement
-}
-void vkDeferredOperationJoinKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkDeferredOperationKHR operation)
-{
-    // TODO: Implement
-}
+    void vkCreateDeferredOperationKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkResult input_result,
+                                      VkDevice device, const VkAllocationCallbacks* pAllocator,
+                                      VkDeferredOperationKHR* pDeferredOperation) {
+        // TODO: Implement
+    }
+    void vkDestroyDeferredOperationKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool, VkDevice device,
+                                       VkDeferredOperationKHR operation,
+                                       const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+    }
+    void vkGetDeferredOperationMaxConcurrencyKHR(const uint8_t* snapshotTraceBegin,
+                                                 size_t snapshotTraceBytes,
+                                                 android::base::BumpPool* pool,
+                                                 uint32_t input_result, VkDevice device,
+                                                 VkDeferredOperationKHR operation) {
+        // TODO: Implement
+    }
+    void vkGetDeferredOperationResultKHR(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkResult input_result, VkDevice device,
+                                         VkDeferredOperationKHR operation) {
+        // TODO: Implement
+    }
+    void vkDeferredOperationJoinKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkResult input_result,
+                                    VkDevice device, VkDeferredOperationKHR operation) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_pipeline_executable_properties
-void vkGetPipelineExecutablePropertiesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkPipelineInfoKHR* pPipelineInfo,
-    uint32_t* pExecutableCount,
-    VkPipelineExecutablePropertiesKHR* pProperties)
-{
-    // TODO: Implement
-}
-void vkGetPipelineExecutableStatisticsKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkPipelineExecutableInfoKHR* pExecutableInfo,
-    uint32_t* pStatisticCount,
-    VkPipelineExecutableStatisticKHR* pStatistics)
-{
-    // TODO: Implement
-}
-void vkGetPipelineExecutableInternalRepresentationsKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkPipelineExecutableInfoKHR* pExecutableInfo,
-    uint32_t* pInternalRepresentationCount,
-    VkPipelineExecutableInternalRepresentationKHR* pInternalRepresentations)
-{
-    // TODO: Implement
-}
+    void vkGetPipelineExecutablePropertiesKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, const VkPipelineInfoKHR* pPipelineInfo,
+        uint32_t* pExecutableCount, VkPipelineExecutablePropertiesKHR* pProperties) {
+        // TODO: Implement
+    }
+    void vkGetPipelineExecutableStatisticsKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, const VkPipelineExecutableInfoKHR* pExecutableInfo,
+        uint32_t* pStatisticCount, VkPipelineExecutableStatisticKHR* pStatistics) {
+        // TODO: Implement
+    }
+    void vkGetPipelineExecutableInternalRepresentationsKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, const VkPipelineExecutableInfoKHR* pExecutableInfo,
+        uint32_t* pInternalRepresentationCount,
+        VkPipelineExecutableInternalRepresentationKHR* pInternalRepresentations) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_shader_integer_dot_product
 #endif
@@ -3930,102 +2538,57 @@
 #ifdef VK_KHR_present_id
 #endif
 #ifdef VK_KHR_video_encode_queue
-void vkCmdEncodeVideoKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkVideoEncodeInfoKHR* pEncodeInfo)
-{
-    // TODO: Implement
-}
+    void vkCmdEncodeVideoKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                             const VkVideoEncodeInfoKHR* pEncodeInfo) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_synchronization2
-void vkCmdSetEvent2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkEvent event,
-    const VkDependencyInfoKHR* pDependencyInfo)
-{
-    // TODO: Implement
-}
-void vkCmdResetEvent2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkEvent event,
-    VkPipelineStageFlags2KHR stageMask)
-{
-    // TODO: Implement
-}
-void vkCmdWaitEvents2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t eventCount,
-    const VkEvent* pEvents,
-    const VkDependencyInfoKHR* pDependencyInfos)
-{
-    // TODO: Implement
-}
-void vkCmdPipelineBarrier2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkDependencyInfoKHR* pDependencyInfo)
-{
-    // TODO: Implement
-}
-void vkCmdWriteTimestamp2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkPipelineStageFlags2KHR stage,
-    VkQueryPool queryPool,
-    uint32_t query)
-{
-    // TODO: Implement
-}
-void vkQueueSubmit2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkQueue queue,
-    uint32_t submitCount,
-    const VkSubmitInfo2KHR* pSubmits,
-    VkFence fence)
-{
-    // TODO: Implement
-}
-void vkCmdWriteBufferMarker2AMD(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkPipelineStageFlags2KHR stage,
-    VkBuffer dstBuffer,
-    VkDeviceSize dstOffset,
-    uint32_t marker)
-{
-    // TODO: Implement
-}
-void vkGetQueueCheckpointData2NV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkQueue queue,
-    uint32_t* pCheckpointDataCount,
-    VkCheckpointData2NV* pCheckpointData)
-{
-    // TODO: Implement
-}
+    void vkCmdSetEvent2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                           VkEvent event, const VkDependencyInfoKHR* pDependencyInfo) {
+        // TODO: Implement
+    }
+    void vkCmdResetEvent2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                             VkEvent event, VkPipelineStageFlags2KHR stageMask) {
+        // TODO: Implement
+    }
+    void vkCmdWaitEvents2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                             uint32_t eventCount, const VkEvent* pEvents,
+                             const VkDependencyInfoKHR* pDependencyInfos) {
+        // TODO: Implement
+    }
+    void vkCmdPipelineBarrier2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                  const VkDependencyInfoKHR* pDependencyInfo) {
+        // TODO: Implement
+    }
+    void vkCmdWriteTimestamp2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                 android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                 VkPipelineStageFlags2KHR stage, VkQueryPool queryPool,
+                                 uint32_t query) {
+        // TODO: Implement
+    }
+    void vkQueueSubmit2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkResult input_result, VkQueue queue,
+                           uint32_t submitCount, const VkSubmitInfo2KHR* pSubmits, VkFence fence) {
+        // TODO: Implement
+    }
+    void vkCmdWriteBufferMarker2AMD(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                    VkPipelineStageFlags2KHR stage, VkBuffer dstBuffer,
+                                    VkDeviceSize dstOffset, uint32_t marker) {
+        // TODO: Implement
+    }
+    void vkGetQueueCheckpointData2NV(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkQueue queue,
+                                     uint32_t* pCheckpointDataCount,
+                                     VkCheckpointData2NV* pCheckpointData) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_shader_subgroup_uniform_control_flow
 #endif
@@ -4034,186 +2597,119 @@
 #ifdef VK_KHR_workgroup_memory_explicit_layout
 #endif
 #ifdef VK_KHR_copy_commands2
-void vkCmdCopyBuffer2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkCopyBufferInfo2KHR* pCopyBufferInfo)
-{
-    // TODO: Implement
-}
-void vkCmdCopyImage2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkCopyImageInfo2KHR* pCopyImageInfo)
-{
-    // TODO: Implement
-}
-void vkCmdCopyBufferToImage2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkCopyBufferToImageInfo2KHR* pCopyBufferToImageInfo)
-{
-    // TODO: Implement
-}
-void vkCmdCopyImageToBuffer2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkCopyImageToBufferInfo2KHR* pCopyImageToBufferInfo)
-{
-    // TODO: Implement
-}
-void vkCmdBlitImage2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkBlitImageInfo2KHR* pBlitImageInfo)
-{
-    // TODO: Implement
-}
-void vkCmdResolveImage2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkResolveImageInfo2KHR* pResolveImageInfo)
-{
-    // TODO: Implement
-}
+    void vkCmdCopyBuffer2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                             const VkCopyBufferInfo2KHR* pCopyBufferInfo) {
+        // TODO: Implement
+    }
+    void vkCmdCopyImage2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                            const VkCopyImageInfo2KHR* pCopyImageInfo) {
+        // TODO: Implement
+    }
+    void vkCmdCopyBufferToImage2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                    const VkCopyBufferToImageInfo2KHR* pCopyBufferToImageInfo) {
+        // TODO: Implement
+    }
+    void vkCmdCopyImageToBuffer2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                    const VkCopyImageToBufferInfo2KHR* pCopyImageToBufferInfo) {
+        // TODO: Implement
+    }
+    void vkCmdBlitImage2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                            const VkBlitImageInfo2KHR* pBlitImageInfo) {
+        // TODO: Implement
+    }
+    void vkCmdResolveImage2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                               const VkResolveImageInfo2KHR* pResolveImageInfo) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_format_feature_flags2
 #endif
 #ifdef VK_KHR_maintenance4
-void vkGetDeviceBufferMemoryRequirementsKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    const VkDeviceBufferMemoryRequirementsKHR* pInfo,
-    VkMemoryRequirements2* pMemoryRequirements)
-{
-    // TODO: Implement
-}
-void vkGetDeviceImageMemoryRequirementsKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    const VkDeviceImageMemoryRequirementsKHR* pInfo,
-    VkMemoryRequirements2* pMemoryRequirements)
-{
-    // TODO: Implement
-}
-void vkGetDeviceImageSparseMemoryRequirementsKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    const VkDeviceImageMemoryRequirementsKHR* pInfo,
-    uint32_t* pSparseMemoryRequirementCount,
-    VkSparseImageMemoryRequirements2* pSparseMemoryRequirements)
-{
-    // TODO: Implement
-}
+    void vkGetDeviceBufferMemoryRequirementsKHR(const uint8_t* snapshotTraceBegin,
+                                                size_t snapshotTraceBytes,
+                                                android::base::BumpPool* pool, VkDevice device,
+                                                const VkDeviceBufferMemoryRequirementsKHR* pInfo,
+                                                VkMemoryRequirements2* pMemoryRequirements) {
+        // TODO: Implement
+    }
+    void vkGetDeviceImageMemoryRequirementsKHR(const uint8_t* snapshotTraceBegin,
+                                               size_t snapshotTraceBytes,
+                                               android::base::BumpPool* pool, VkDevice device,
+                                               const VkDeviceImageMemoryRequirementsKHR* pInfo,
+                                               VkMemoryRequirements2* pMemoryRequirements) {
+        // TODO: Implement
+    }
+    void vkGetDeviceImageSparseMemoryRequirementsKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkDevice device, const VkDeviceImageMemoryRequirementsKHR* pInfo,
+        uint32_t* pSparseMemoryRequirementCount,
+        VkSparseImageMemoryRequirements2* pSparseMemoryRequirements) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_ANDROID_native_buffer
-void vkGetSwapchainGrallocUsageANDROID(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkFormat format,
-    VkImageUsageFlags imageUsage,
-    int* grallocUsage)
-{
-    // TODO: Implement
-}
-void vkAcquireImageANDROID(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkImage image,
-    int nativeFenceFd,
-    VkSemaphore semaphore,
-    VkFence fence)
-{
-    // TODO: Implement
-}
-void vkQueueSignalReleaseImageANDROID(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkQueue queue,
-    uint32_t waitSemaphoreCount,
-    const VkSemaphore* pWaitSemaphores,
-    VkImage image,
-    int* pNativeFenceFd)
-{
-    // TODO: Implement
-}
+    void vkGetSwapchainGrallocUsageANDROID(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkResult input_result, VkDevice device, VkFormat format,
+                                           VkImageUsageFlags imageUsage, int* grallocUsage) {
+        // TODO: Implement
+    }
+    void vkAcquireImageANDROID(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, VkResult input_result,
+                               VkDevice device, VkImage image, int nativeFenceFd,
+                               VkSemaphore semaphore, VkFence fence) {
+        // TODO: Implement
+    }
+    void vkQueueSignalReleaseImageANDROID(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkResult input_result, VkQueue queue,
+                                          uint32_t waitSemaphoreCount,
+                                          const VkSemaphore* pWaitSemaphores, VkImage image,
+                                          int* pNativeFenceFd) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_EXT_debug_report
-void vkCreateDebugReportCallbackEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    const VkDebugReportCallbackCreateInfoEXT* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkDebugReportCallbackEXT* pCallback)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pCallback create
-    mReconstruction.addHandles((const uint64_t*)pCallback, 1);
-    if (!pCallback) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkCreateDebugReportCallbackEXT, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pCallback, 1, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pCallback, 1);
-}
-void vkDestroyDebugReportCallbackEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkInstance instance,
-    VkDebugReportCallbackEXT callback,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // callback destroy
-    mReconstruction.removeHandles((const uint64_t*)(&callback), 1);
-}
-void vkDebugReportMessageEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkInstance instance,
-    VkDebugReportFlagsEXT flags,
-    VkDebugReportObjectTypeEXT objectType,
-    uint64_t object,
-    size_t location,
-    int32_t messageCode,
-    const char* pLayerPrefix,
-    const char* pMessage)
-{
-    // TODO: Implement
-}
+    void vkCreateDebugReportCallbackEXT(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkResult input_result, VkInstance instance,
+                                        const VkDebugReportCallbackCreateInfoEXT* pCreateInfo,
+                                        const VkAllocationCallbacks* pAllocator,
+                                        VkDebugReportCallbackEXT* pCallback) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pCallback create
+        mReconstruction.addHandles((const uint64_t*)pCallback, 1);
+        if (!pCallback) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreateDebugReportCallbackEXT, snapshotTraceBegin,
+                                    snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pCallback, 1, apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pCallback, 1);
+    }
+    void vkDestroyDebugReportCallbackEXT(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkInstance instance, VkDebugReportCallbackEXT callback,
+                                         const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // callback destroy
+        mReconstruction.removeHandles((const uint64_t*)(&callback), 1);
+    }
+    void vkDebugReportMessageEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                 android::base::BumpPool* pool, VkInstance instance,
+                                 VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType,
+                                 uint64_t object, size_t location, int32_t messageCode,
+                                 const char* pLayerPrefix, const char* pMessage) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_NV_glsl_shader
 #endif
@@ -4228,240 +2724,137 @@
 #ifdef VK_AMD_shader_explicit_vertex_parameter
 #endif
 #ifdef VK_EXT_debug_marker
-void vkDebugMarkerSetObjectTagEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkDebugMarkerObjectTagInfoEXT* pTagInfo)
-{
-    // TODO: Implement
-}
-void vkDebugMarkerSetObjectNameEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkDebugMarkerObjectNameInfoEXT* pNameInfo)
-{
-    // TODO: Implement
-}
-void vkCmdDebugMarkerBeginEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkDebugMarkerMarkerInfoEXT* pMarkerInfo)
-{
-    // TODO: Implement
-}
-void vkCmdDebugMarkerEndEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer)
-{
-    // TODO: Implement
-}
-void vkCmdDebugMarkerInsertEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkDebugMarkerMarkerInfoEXT* pMarkerInfo)
-{
-    // TODO: Implement
-}
+    void vkDebugMarkerSetObjectTagEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkResult input_result,
+                                      VkDevice device,
+                                      const VkDebugMarkerObjectTagInfoEXT* pTagInfo) {
+        // TODO: Implement
+    }
+    void vkDebugMarkerSetObjectNameEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool, VkResult input_result,
+                                       VkDevice device,
+                                       const VkDebugMarkerObjectNameInfoEXT* pNameInfo) {
+        // TODO: Implement
+    }
+    void vkCmdDebugMarkerBeginEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                  const VkDebugMarkerMarkerInfoEXT* pMarkerInfo) {
+        // TODO: Implement
+    }
+    void vkCmdDebugMarkerEndEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkCommandBuffer commandBuffer) {
+        // TODO: Implement
+    }
+    void vkCmdDebugMarkerInsertEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                   android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                   const VkDebugMarkerMarkerInfoEXT* pMarkerInfo) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_AMD_gcn_shader
 #endif
 #ifdef VK_NV_dedicated_allocation
 #endif
 #ifdef VK_EXT_transform_feedback
-void vkCmdBindTransformFeedbackBuffersEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t firstBinding,
-    uint32_t bindingCount,
-    const VkBuffer* pBuffers,
-    const VkDeviceSize* pOffsets,
-    const VkDeviceSize* pSizes)
-{
-    // TODO: Implement
-}
-void vkCmdBeginTransformFeedbackEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t firstCounterBuffer,
-    uint32_t counterBufferCount,
-    const VkBuffer* pCounterBuffers,
-    const VkDeviceSize* pCounterBufferOffsets)
-{
-    // TODO: Implement
-}
-void vkCmdEndTransformFeedbackEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t firstCounterBuffer,
-    uint32_t counterBufferCount,
-    const VkBuffer* pCounterBuffers,
-    const VkDeviceSize* pCounterBufferOffsets)
-{
-    // TODO: Implement
-}
-void vkCmdBeginQueryIndexedEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkQueryPool queryPool,
-    uint32_t query,
-    VkQueryControlFlags flags,
-    uint32_t index)
-{
-    // TODO: Implement
-}
-void vkCmdEndQueryIndexedEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkQueryPool queryPool,
-    uint32_t query,
-    uint32_t index)
-{
-    // TODO: Implement
-}
-void vkCmdDrawIndirectByteCountEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t instanceCount,
-    uint32_t firstInstance,
-    VkBuffer counterBuffer,
-    VkDeviceSize counterBufferOffset,
-    uint32_t counterOffset,
-    uint32_t vertexStride)
-{
-    // TODO: Implement
-}
+    void vkCmdBindTransformFeedbackBuffersEXT(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
+        const VkBuffer* pBuffers, const VkDeviceSize* pOffsets, const VkDeviceSize* pSizes) {
+        // TODO: Implement
+    }
+    void vkCmdBeginTransformFeedbackEXT(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer,
+                                        uint32_t counterBufferCount,
+                                        const VkBuffer* pCounterBuffers,
+                                        const VkDeviceSize* pCounterBufferOffsets) {
+        // TODO: Implement
+    }
+    void vkCmdEndTransformFeedbackEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                      uint32_t firstCounterBuffer, uint32_t counterBufferCount,
+                                      const VkBuffer* pCounterBuffers,
+                                      const VkDeviceSize* pCounterBufferOffsets) {
+        // TODO: Implement
+    }
+    void vkCmdBeginQueryIndexedEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                   android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                   VkQueryPool queryPool, uint32_t query, VkQueryControlFlags flags,
+                                   uint32_t index) {
+        // TODO: Implement
+    }
+    void vkCmdEndQueryIndexedEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                 android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                 VkQueryPool queryPool, uint32_t query, uint32_t index) {
+        // TODO: Implement
+    }
+    void vkCmdDrawIndirectByteCountEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                       uint32_t instanceCount, uint32_t firstInstance,
+                                       VkBuffer counterBuffer, VkDeviceSize counterBufferOffset,
+                                       uint32_t counterOffset, uint32_t vertexStride) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_NVX_binary_import
-void vkCreateCuModuleNVX(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkCuModuleCreateInfoNVX* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkCuModuleNVX* pModule)
-{
-    // TODO: Implement
-}
-void vkCreateCuFunctionNVX(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkCuFunctionCreateInfoNVX* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkCuFunctionNVX* pFunction)
-{
-    // TODO: Implement
-}
-void vkDestroyCuModuleNVX(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkCuModuleNVX module,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-}
-void vkDestroyCuFunctionNVX(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkCuFunctionNVX function,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-}
-void vkCmdCuLaunchKernelNVX(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkCuLaunchInfoNVX* pLaunchInfo)
-{
-    // TODO: Implement
-}
+    void vkCreateCuModuleNVX(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                             const VkCuModuleCreateInfoNVX* pCreateInfo,
+                             const VkAllocationCallbacks* pAllocator, VkCuModuleNVX* pModule) {
+        // TODO: Implement
+    }
+    void vkCreateCuFunctionNVX(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, VkResult input_result,
+                               VkDevice device, const VkCuFunctionCreateInfoNVX* pCreateInfo,
+                               const VkAllocationCallbacks* pAllocator,
+                               VkCuFunctionNVX* pFunction) {
+        // TODO: Implement
+    }
+    void vkDestroyCuModuleNVX(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkDevice device, VkCuModuleNVX module,
+                              const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+    }
+    void vkDestroyCuFunctionNVX(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkDevice device,
+                                VkCuFunctionNVX function, const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+    }
+    void vkCmdCuLaunchKernelNVX(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                const VkCuLaunchInfoNVX* pLaunchInfo) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_NVX_image_view_handle
-void vkGetImageViewHandleNVX(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    uint32_t input_result,
-    VkDevice device,
-    const VkImageViewHandleInfoNVX* pInfo)
-{
-    // TODO: Implement
-}
-void vkGetImageViewAddressNVX(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkImageView imageView,
-    VkImageViewAddressPropertiesNVX* pProperties)
-{
-    // TODO: Implement
-}
+    void vkGetImageViewHandleNVX(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                 android::base::BumpPool* pool, uint32_t input_result,
+                                 VkDevice device, const VkImageViewHandleInfoNVX* pInfo) {
+        // TODO: Implement
+    }
+    void vkGetImageViewAddressNVX(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkResult input_result,
+                                  VkDevice device, VkImageView imageView,
+                                  VkImageViewAddressPropertiesNVX* pProperties) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_AMD_draw_indirect_count
-void vkCmdDrawIndirectCountAMD(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBuffer buffer,
-    VkDeviceSize offset,
-    VkBuffer countBuffer,
-    VkDeviceSize countBufferOffset,
-    uint32_t maxDrawCount,
-    uint32_t stride)
-{
-    // TODO: Implement
-}
-void vkCmdDrawIndexedIndirectCountAMD(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBuffer buffer,
-    VkDeviceSize offset,
-    VkBuffer countBuffer,
-    VkDeviceSize countBufferOffset,
-    uint32_t maxDrawCount,
-    uint32_t stride)
-{
-    // TODO: Implement
-}
+    void vkCmdDrawIndirectCountAMD(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                   android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                   VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
+                                   VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+                                   uint32_t stride) {
+        // TODO: Implement
+    }
+    void vkCmdDrawIndexedIndirectCountAMD(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkCommandBuffer commandBuffer, VkBuffer buffer,
+                                          VkDeviceSize offset, VkBuffer countBuffer,
+                                          VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+                                          uint32_t stride) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_AMD_negative_viewport_height
 #endif
@@ -4478,92 +2871,59 @@
 #ifdef VK_AMD_texture_gather_bias_lod
 #endif
 #ifdef VK_AMD_shader_info
-void vkGetShaderInfoAMD(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkPipeline pipeline,
-    VkShaderStageFlagBits shaderStage,
-    VkShaderInfoTypeAMD infoType,
-    size_t* pInfoSize,
-    void* pInfo)
-{
-    // TODO: Implement
-}
+    void vkGetShaderInfoAMD(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                            VkPipeline pipeline, VkShaderStageFlagBits shaderStage,
+                            VkShaderInfoTypeAMD infoType, size_t* pInfoSize, void* pInfo) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_AMD_shader_image_load_store_lod
 #endif
 #ifdef VK_GGP_stream_descriptor_surface
-void vkCreateStreamDescriptorSurfaceGGP(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    const VkStreamDescriptorSurfaceCreateInfoGGP* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
-{
-    // TODO: Implement
-}
+    void vkCreateStreamDescriptorSurfaceGGP(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkInstance instance,
+        const VkStreamDescriptorSurfaceCreateInfoGGP* pCreateInfo,
+        const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_NV_corner_sampled_image
 #endif
 #ifdef VK_IMG_format_pvrtc
 #endif
 #ifdef VK_NV_external_memory_capabilities
-void vkGetPhysicalDeviceExternalImageFormatPropertiesNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    VkFormat format,
-    VkImageType type,
-    VkImageTiling tiling,
-    VkImageUsageFlags usage,
-    VkImageCreateFlags flags,
-    VkExternalMemoryHandleTypeFlagsNV externalHandleType,
-    VkExternalImageFormatPropertiesNV* pExternalImageFormatProperties)
-{
-    // TODO: Implement
-}
+    void vkGetPhysicalDeviceExternalImageFormatPropertiesNV(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
+        VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags,
+        VkExternalMemoryHandleTypeFlagsNV externalHandleType,
+        VkExternalImageFormatPropertiesNV* pExternalImageFormatProperties) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_NV_external_memory
 #endif
 #ifdef VK_NV_external_memory_win32
-void vkGetMemoryWin32HandleNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkDeviceMemory memory,
-    VkExternalMemoryHandleTypeFlagsNV handleType,
-    HANDLE* pHandle)
-{
-    // TODO: Implement
-}
+    void vkGetMemoryWin32HandleNV(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkResult input_result,
+                                  VkDevice device, VkDeviceMemory memory,
+                                  VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE* pHandle) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_NV_win32_keyed_mutex
 #endif
 #ifdef VK_EXT_validation_flags
 #endif
 #ifdef VK_NN_vi_surface
-void vkCreateViSurfaceNN(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    const VkViSurfaceCreateInfoNN* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
-{
-    // TODO: Implement
-}
+    void vkCreateViSurfaceNN(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkResult input_result,
+                             VkInstance instance, const VkViSurfaceCreateInfoNN* pCreateInfo,
+                             const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_EXT_shader_subgroup_ballot
 #endif
@@ -4574,161 +2934,98 @@
 #ifdef VK_EXT_astc_decode_mode
 #endif
 #ifdef VK_EXT_conditional_rendering
-void vkCmdBeginConditionalRenderingEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkConditionalRenderingBeginInfoEXT* pConditionalRenderingBegin)
-{
-    // TODO: Implement
-}
-void vkCmdEndConditionalRenderingEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer)
-{
-    // TODO: Implement
-}
+    void vkCmdBeginConditionalRenderingEXT(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkCommandBuffer commandBuffer,
+        const VkConditionalRenderingBeginInfoEXT* pConditionalRenderingBegin) {
+        // TODO: Implement
+    }
+    void vkCmdEndConditionalRenderingEXT(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkCommandBuffer commandBuffer) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_NV_clip_space_w_scaling
-void vkCmdSetViewportWScalingNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t firstViewport,
-    uint32_t viewportCount,
-    const VkViewportWScalingNV* pViewportWScalings)
-{
-    // TODO: Implement
-}
+    void vkCmdSetViewportWScalingNV(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                    uint32_t firstViewport, uint32_t viewportCount,
+                                    const VkViewportWScalingNV* pViewportWScalings) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_EXT_direct_mode_display
-void vkReleaseDisplayEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    VkDisplayKHR display)
-{
-    // TODO: Implement
-}
+    void vkReleaseDisplayEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkResult input_result,
+                             VkPhysicalDevice physicalDevice, VkDisplayKHR display) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_EXT_acquire_xlib_display
-void vkAcquireXlibDisplayEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    Display* dpy,
-    VkDisplayKHR display)
-{
-    // TODO: Implement
-}
-void vkGetRandROutputDisplayEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    Display* dpy,
-    RROutput rrOutput,
-    VkDisplayKHR* pDisplay)
-{
-    // TODO: Implement
-}
+    void vkAcquireXlibDisplayEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                 android::base::BumpPool* pool, VkResult input_result,
+                                 VkPhysicalDevice physicalDevice, Display* dpy,
+                                 VkDisplayKHR display) {
+        // TODO: Implement
+    }
+    void vkGetRandROutputDisplayEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkResult input_result,
+                                    VkPhysicalDevice physicalDevice, Display* dpy,
+                                    RROutput rrOutput, VkDisplayKHR* pDisplay) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_EXT_display_surface_counter
-void vkGetPhysicalDeviceSurfaceCapabilities2EXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    VkSurfaceKHR surface,
-    VkSurfaceCapabilities2EXT* pSurfaceCapabilities)
-{
-    // TODO: Implement
-}
+    void vkGetPhysicalDeviceSurfaceCapabilities2EXT(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
+        VkSurfaceCapabilities2EXT* pSurfaceCapabilities) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_EXT_display_control
-void vkDisplayPowerControlEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkDisplayKHR display,
-    const VkDisplayPowerInfoEXT* pDisplayPowerInfo)
-{
-    // TODO: Implement
-}
-void vkRegisterDeviceEventEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkDeviceEventInfoEXT* pDeviceEventInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkFence* pFence)
-{
-    // TODO: Implement
-}
-void vkRegisterDisplayEventEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkDisplayKHR display,
-    const VkDisplayEventInfoEXT* pDisplayEventInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkFence* pFence)
-{
-    // TODO: Implement
-}
-void vkGetSwapchainCounterEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkSwapchainKHR swapchain,
-    VkSurfaceCounterFlagBitsEXT counter,
-    uint64_t* pCounterValue)
-{
-    // TODO: Implement
-}
+    void vkDisplayPowerControlEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkResult input_result,
+                                  VkDevice device, VkDisplayKHR display,
+                                  const VkDisplayPowerInfoEXT* pDisplayPowerInfo) {
+        // TODO: Implement
+    }
+    void vkRegisterDeviceEventEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkResult input_result,
+                                  VkDevice device, const VkDeviceEventInfoEXT* pDeviceEventInfo,
+                                  const VkAllocationCallbacks* pAllocator, VkFence* pFence) {
+        // TODO: Implement
+    }
+    void vkRegisterDisplayEventEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                   android::base::BumpPool* pool, VkResult input_result,
+                                   VkDevice device, VkDisplayKHR display,
+                                   const VkDisplayEventInfoEXT* pDisplayEventInfo,
+                                   const VkAllocationCallbacks* pAllocator, VkFence* pFence) {
+        // TODO: Implement
+    }
+    void vkGetSwapchainCounterEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkResult input_result,
+                                  VkDevice device, VkSwapchainKHR swapchain,
+                                  VkSurfaceCounterFlagBitsEXT counter, uint64_t* pCounterValue) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_GOOGLE_display_timing
-void vkGetRefreshCycleDurationGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkSwapchainKHR swapchain,
-    VkRefreshCycleDurationGOOGLE* pDisplayTimingProperties)
-{
-    // TODO: Implement
-}
-void vkGetPastPresentationTimingGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkSwapchainKHR swapchain,
-    uint32_t* pPresentationTimingCount,
-    VkPastPresentationTimingGOOGLE* pPresentationTimings)
-{
-    // TODO: Implement
-}
+    void vkGetRefreshCycleDurationGOOGLE(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkResult input_result, VkDevice device,
+                                         VkSwapchainKHR swapchain,
+                                         VkRefreshCycleDurationGOOGLE* pDisplayTimingProperties) {
+        // TODO: Implement
+    }
+    void vkGetPastPresentationTimingGOOGLE(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkResult input_result, VkDevice device,
+                                           VkSwapchainKHR swapchain,
+                                           uint32_t* pPresentationTimingCount,
+                                           VkPastPresentationTimingGOOGLE* pPresentationTimings) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_NV_sample_mask_override_coverage
 #endif
@@ -4741,17 +3038,12 @@
 #ifdef VK_NV_viewport_swizzle
 #endif
 #ifdef VK_EXT_discard_rectangles
-void vkCmdSetDiscardRectangleEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t firstDiscardRectangle,
-    uint32_t discardRectangleCount,
-    const VkRect2D* pDiscardRectangles)
-{
-    // TODO: Implement
-}
+    void vkCmdSetDiscardRectangleEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                     uint32_t firstDiscardRectangle, uint32_t discardRectangleCount,
+                                     const VkRect2D* pDiscardRectangles) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_EXT_conservative_rasterization
 #endif
@@ -4760,250 +3052,152 @@
 #ifdef VK_EXT_swapchain_colorspace
 #endif
 #ifdef VK_EXT_hdr_metadata
-void vkSetHdrMetadataEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    uint32_t swapchainCount,
-    const VkSwapchainKHR* pSwapchains,
-    const VkHdrMetadataEXT* pMetadata)
-{
-    // TODO: Implement
-}
+    void vkSetHdrMetadataEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkDevice device,
+                             uint32_t swapchainCount, const VkSwapchainKHR* pSwapchains,
+                             const VkHdrMetadataEXT* pMetadata) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_MVK_ios_surface
-void vkCreateIOSSurfaceMVK(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    const VkIOSSurfaceCreateInfoMVK* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
-{
-    // TODO: Implement
-}
+    void vkCreateIOSSurfaceMVK(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, VkResult input_result,
+                               VkInstance instance, const VkIOSSurfaceCreateInfoMVK* pCreateInfo,
+                               const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_MVK_macos_surface
-void vkCreateMacOSSurfaceMVK(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    const VkMacOSSurfaceCreateInfoMVK* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
-{
-    // TODO: Implement
-}
+    void vkCreateMacOSSurfaceMVK(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                 android::base::BumpPool* pool, VkResult input_result,
+                                 VkInstance instance,
+                                 const VkMacOSSurfaceCreateInfoMVK* pCreateInfo,
+                                 const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_MVK_moltenvk
-void vkGetMTLDeviceMVK(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    void** pMTLDevice)
-{
-    // TODO: Implement
-}
-void vkSetMTLTextureMVK(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkImage image,
-    void* mtlTexture)
-{
-    // TODO: Implement
-}
-void vkGetMTLTextureMVK(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkImage image,
-    void** pMTLTexture)
-{
-    // TODO: Implement
-}
-void vkGetMTLBufferMVK(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkBuffer buffer,
-    void** pMTLBuffer)
-{
-    // TODO: Implement
-}
-void vkUseIOSurfaceMVK(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkImage image,
-    void* ioSurface)
-{
-    // TODO: Implement
-}
-void vkGetIOSurfaceMVK(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkImage image,
-    void** pIOSurface)
-{
-    // TODO: Implement
-}
+    void vkGetMTLDeviceMVK(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkPhysicalDevice physicalDevice,
+                           void** pMTLDevice) {
+        // TODO: Implement
+    }
+    void vkSetMTLTextureMVK(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkResult input_result, VkImage image,
+                            void* mtlTexture) {
+        // TODO: Implement
+    }
+    void vkGetMTLTextureMVK(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkImage image, void** pMTLTexture) {
+        // TODO: Implement
+    }
+    void vkGetMTLBufferMVK(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkBuffer buffer, void** pMTLBuffer) {
+        // TODO: Implement
+    }
+    void vkUseIOSurfaceMVK(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkResult input_result, VkImage image,
+                           void* ioSurface) {
+        // TODO: Implement
+    }
+    void vkGetIOSurfaceMVK(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkImage image, void** pIOSurface) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_EXT_external_memory_dma_buf
 #endif
 #ifdef VK_EXT_queue_family_foreign
 #endif
 #ifdef VK_EXT_debug_utils
-void vkSetDebugUtilsObjectNameEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkDebugUtilsObjectNameInfoEXT* pNameInfo)
-{
-    // TODO: Implement
-}
-void vkSetDebugUtilsObjectTagEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkDebugUtilsObjectTagInfoEXT* pTagInfo)
-{
-    // TODO: Implement
-}
-void vkQueueBeginDebugUtilsLabelEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkQueue queue,
-    const VkDebugUtilsLabelEXT* pLabelInfo)
-{
-    // TODO: Implement
-}
-void vkQueueEndDebugUtilsLabelEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkQueue queue)
-{
-    // TODO: Implement
-}
-void vkQueueInsertDebugUtilsLabelEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkQueue queue,
-    const VkDebugUtilsLabelEXT* pLabelInfo)
-{
-    // TODO: Implement
-}
-void vkCmdBeginDebugUtilsLabelEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkDebugUtilsLabelEXT* pLabelInfo)
-{
-    // TODO: Implement
-}
-void vkCmdEndDebugUtilsLabelEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer)
-{
-    // TODO: Implement
-}
-void vkCmdInsertDebugUtilsLabelEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkDebugUtilsLabelEXT* pLabelInfo)
-{
-    // TODO: Implement
-}
-void vkCreateDebugUtilsMessengerEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkDebugUtilsMessengerEXT* pMessenger)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pMessenger create
-    mReconstruction.addHandles((const uint64_t*)pMessenger, 1);
-    if (!pMessenger) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkCreateDebugUtilsMessengerEXT, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pMessenger, 1, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pMessenger, 1);
-}
-void vkDestroyDebugUtilsMessengerEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkInstance instance,
-    VkDebugUtilsMessengerEXT messenger,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // messenger destroy
-    mReconstruction.removeHandles((const uint64_t*)(&messenger), 1);
-}
-void vkSubmitDebugUtilsMessageEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkInstance instance,
-    VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
-    VkDebugUtilsMessageTypeFlagsEXT messageTypes,
-    const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData)
-{
-    // TODO: Implement
-}
+    void vkSetDebugUtilsObjectNameEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkResult input_result,
+                                      VkDevice device,
+                                      const VkDebugUtilsObjectNameInfoEXT* pNameInfo) {
+        // TODO: Implement
+    }
+    void vkSetDebugUtilsObjectTagEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkResult input_result,
+                                     VkDevice device,
+                                     const VkDebugUtilsObjectTagInfoEXT* pTagInfo) {
+        // TODO: Implement
+    }
+    void vkQueueBeginDebugUtilsLabelEXT(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkQueue queue, const VkDebugUtilsLabelEXT* pLabelInfo) {
+        // TODO: Implement
+    }
+    void vkQueueEndDebugUtilsLabelEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkQueue queue) {
+        // TODO: Implement
+    }
+    void vkQueueInsertDebugUtilsLabelEXT(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkQueue queue, const VkDebugUtilsLabelEXT* pLabelInfo) {
+        // TODO: Implement
+    }
+    void vkCmdBeginDebugUtilsLabelEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                      const VkDebugUtilsLabelEXT* pLabelInfo) {
+        // TODO: Implement
+    }
+    void vkCmdEndDebugUtilsLabelEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkCommandBuffer commandBuffer) {
+        // TODO: Implement
+    }
+    void vkCmdInsertDebugUtilsLabelEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                       const VkDebugUtilsLabelEXT* pLabelInfo) {
+        // TODO: Implement
+    }
+    void vkCreateDebugUtilsMessengerEXT(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkResult input_result, VkInstance instance,
+                                        const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo,
+                                        const VkAllocationCallbacks* pAllocator,
+                                        VkDebugUtilsMessengerEXT* pMessenger) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pMessenger create
+        mReconstruction.addHandles((const uint64_t*)pMessenger, 1);
+        if (!pMessenger) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreateDebugUtilsMessengerEXT, snapshotTraceBegin,
+                                    snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pMessenger, 1, apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pMessenger, 1);
+    }
+    void vkDestroyDebugUtilsMessengerEXT(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkInstance instance, VkDebugUtilsMessengerEXT messenger,
+                                         const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // messenger destroy
+        mReconstruction.removeHandles((const uint64_t*)(&messenger), 1);
+    }
+    void vkSubmitDebugUtilsMessageEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkInstance instance,
+                                      VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
+                                      VkDebugUtilsMessageTypeFlagsEXT messageTypes,
+                                      const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
-void vkGetAndroidHardwareBufferPropertiesANDROID(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const AHardwareBuffer* buffer,
-    VkAndroidHardwareBufferPropertiesANDROID* pProperties)
-{
-    // TODO: Implement
-}
-void vkGetMemoryAndroidHardwareBufferANDROID(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo,
-    AHardwareBuffer** pBuffer)
-{
-    // TODO: Implement
-}
+    void vkGetAndroidHardwareBufferPropertiesANDROID(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, const AHardwareBuffer* buffer,
+        VkAndroidHardwareBufferPropertiesANDROID* pProperties) {
+        // TODO: Implement
+    }
+    void vkGetMemoryAndroidHardwareBufferANDROID(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device,
+        const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo, AHardwareBuffer** pBuffer) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_EXT_sampler_filter_minmax
 #endif
@@ -5018,25 +3212,17 @@
 #ifdef VK_EXT_shader_stencil_export
 #endif
 #ifdef VK_EXT_sample_locations
-void vkCmdSetSampleLocationsEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkSampleLocationsInfoEXT* pSampleLocationsInfo)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDeviceMultisamplePropertiesEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    VkSampleCountFlagBits samples,
-    VkMultisamplePropertiesEXT* pMultisampleProperties)
-{
-    // TODO: Implement
-}
+    void vkCmdSetSampleLocationsEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                    const VkSampleLocationsInfoEXT* pSampleLocationsInfo) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDeviceMultisamplePropertiesEXT(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkPhysicalDevice physicalDevice, VkSampleCountFlagBits samples,
+        VkMultisamplePropertiesEXT* pMultisampleProperties) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_EXT_blend_operation_advanced
 #endif
@@ -5051,301 +3237,201 @@
 #ifdef VK_EXT_post_depth_coverage
 #endif
 #ifdef VK_EXT_image_drm_format_modifier
-void vkGetImageDrmFormatModifierPropertiesEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkImage image,
-    VkImageDrmFormatModifierPropertiesEXT* pProperties)
-{
-    // TODO: Implement
-}
+    void vkGetImageDrmFormatModifierPropertiesEXT(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, VkImage image,
+        VkImageDrmFormatModifierPropertiesEXT* pProperties) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_EXT_validation_cache
-void vkCreateValidationCacheEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkValidationCacheCreateInfoEXT* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkValidationCacheEXT* pValidationCache)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pValidationCache create
-    mReconstruction.addHandles((const uint64_t*)pValidationCache, 1);
-    mReconstruction.addHandleDependency((const uint64_t*)pValidationCache, 1, (uint64_t)(uintptr_t)device);
-    if (!pValidationCache) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkCreateValidationCacheEXT, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pValidationCache, 1, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pValidationCache, 1);
-}
-void vkDestroyValidationCacheEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkValidationCacheEXT validationCache,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // validationCache destroy
-    mReconstruction.removeHandles((const uint64_t*)(&validationCache), 1);
-}
-void vkMergeValidationCachesEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkValidationCacheEXT dstCache,
-    uint32_t srcCacheCount,
-    const VkValidationCacheEXT* pSrcCaches)
-{
-    // TODO: Implement
-}
-void vkGetValidationCacheDataEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkValidationCacheEXT validationCache,
-    size_t* pDataSize,
-    void* pData)
-{
-    // TODO: Implement
-}
+    void vkCreateValidationCacheEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkResult input_result,
+                                    VkDevice device,
+                                    const VkValidationCacheCreateInfoEXT* pCreateInfo,
+                                    const VkAllocationCallbacks* pAllocator,
+                                    VkValidationCacheEXT* pValidationCache) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pValidationCache create
+        mReconstruction.addHandles((const uint64_t*)pValidationCache, 1);
+        mReconstruction.addHandleDependency((const uint64_t*)pValidationCache, 1,
+                                            (uint64_t)(uintptr_t)device);
+        if (!pValidationCache) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreateValidationCacheEXT, snapshotTraceBegin,
+                                    snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pValidationCache, 1, apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pValidationCache, 1);
+    }
+    void vkDestroyValidationCacheEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkDevice device,
+                                     VkValidationCacheEXT validationCache,
+                                     const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // validationCache destroy
+        mReconstruction.removeHandles((const uint64_t*)(&validationCache), 1);
+    }
+    void vkMergeValidationCachesEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkResult input_result,
+                                    VkDevice device, VkValidationCacheEXT dstCache,
+                                    uint32_t srcCacheCount,
+                                    const VkValidationCacheEXT* pSrcCaches) {
+        // TODO: Implement
+    }
+    void vkGetValidationCacheDataEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkResult input_result,
+                                     VkDevice device, VkValidationCacheEXT validationCache,
+                                     size_t* pDataSize, void* pData) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_EXT_descriptor_indexing
 #endif
 #ifdef VK_EXT_shader_viewport_index_layer
 #endif
 #ifdef VK_NV_shading_rate_image
-void vkCmdBindShadingRateImageNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkImageView imageView,
-    VkImageLayout imageLayout)
-{
-    // TODO: Implement
-}
-void vkCmdSetViewportShadingRatePaletteNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t firstViewport,
-    uint32_t viewportCount,
-    const VkShadingRatePaletteNV* pShadingRatePalettes)
-{
-    // TODO: Implement
-}
-void vkCmdSetCoarseSampleOrderNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkCoarseSampleOrderTypeNV sampleOrderType,
-    uint32_t customSampleOrderCount,
-    const VkCoarseSampleOrderCustomNV* pCustomSampleOrders)
-{
-    // TODO: Implement
-}
+    void vkCmdBindShadingRateImageNV(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                     VkImageView imageView, VkImageLayout imageLayout) {
+        // TODO: Implement
+    }
+    void vkCmdSetViewportShadingRatePaletteNV(const uint8_t* snapshotTraceBegin,
+                                              size_t snapshotTraceBytes,
+                                              android::base::BumpPool* pool,
+                                              VkCommandBuffer commandBuffer, uint32_t firstViewport,
+                                              uint32_t viewportCount,
+                                              const VkShadingRatePaletteNV* pShadingRatePalettes) {
+        // TODO: Implement
+    }
+    void vkCmdSetCoarseSampleOrderNV(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                     VkCoarseSampleOrderTypeNV sampleOrderType,
+                                     uint32_t customSampleOrderCount,
+                                     const VkCoarseSampleOrderCustomNV* pCustomSampleOrders) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_NV_ray_tracing
-void vkCreateAccelerationStructureNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkAccelerationStructureCreateInfoNV* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkAccelerationStructureNV* pAccelerationStructure)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pAccelerationStructure create
-    mReconstruction.addHandles((const uint64_t*)pAccelerationStructure, 1);
-    mReconstruction.addHandleDependency((const uint64_t*)pAccelerationStructure, 1, (uint64_t)(uintptr_t)device);
-    if (!pAccelerationStructure) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkCreateAccelerationStructureNV, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pAccelerationStructure, 1, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pAccelerationStructure, 1);
-}
-void vkDestroyAccelerationStructureNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkAccelerationStructureNV accelerationStructure,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // accelerationStructure destroy
-    mReconstruction.removeHandles((const uint64_t*)(&accelerationStructure), 1);
-}
-void vkGetAccelerationStructureMemoryRequirementsNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    const VkAccelerationStructureMemoryRequirementsInfoNV* pInfo,
-    VkMemoryRequirements2KHR* pMemoryRequirements)
-{
-    // TODO: Implement
-}
-void vkBindAccelerationStructureMemoryNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    uint32_t bindInfoCount,
-    const VkBindAccelerationStructureMemoryInfoNV* pBindInfos)
-{
-    // TODO: Implement
-}
-void vkCmdBuildAccelerationStructureNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkAccelerationStructureInfoNV* pInfo,
-    VkBuffer instanceData,
-    VkDeviceSize instanceOffset,
-    VkBool32 update,
-    VkAccelerationStructureNV dst,
-    VkAccelerationStructureNV src,
-    VkBuffer scratch,
-    VkDeviceSize scratchOffset)
-{
-    // TODO: Implement
-}
-void vkCmdCopyAccelerationStructureNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkAccelerationStructureNV dst,
-    VkAccelerationStructureNV src,
-    VkCopyAccelerationStructureModeKHR mode)
-{
-    // TODO: Implement
-}
-void vkCmdTraceRaysNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBuffer raygenShaderBindingTableBuffer,
-    VkDeviceSize raygenShaderBindingOffset,
-    VkBuffer missShaderBindingTableBuffer,
-    VkDeviceSize missShaderBindingOffset,
-    VkDeviceSize missShaderBindingStride,
-    VkBuffer hitShaderBindingTableBuffer,
-    VkDeviceSize hitShaderBindingOffset,
-    VkDeviceSize hitShaderBindingStride,
-    VkBuffer callableShaderBindingTableBuffer,
-    VkDeviceSize callableShaderBindingOffset,
-    VkDeviceSize callableShaderBindingStride,
-    uint32_t width,
-    uint32_t height,
-    uint32_t depth)
-{
-    // TODO: Implement
-}
-void vkCreateRayTracingPipelinesNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkPipelineCache pipelineCache,
-    uint32_t createInfoCount,
-    const VkRayTracingPipelineCreateInfoNV* pCreateInfos,
-    const VkAllocationCallbacks* pAllocator,
-    VkPipeline* pPipelines)
-{
-    // TODO: Implement
-}
-void vkGetRayTracingShaderGroupHandlesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkPipeline pipeline,
-    uint32_t firstGroup,
-    uint32_t groupCount,
-    size_t dataSize,
-    void* pData)
-{
-    // TODO: Implement
-}
-void vkGetRayTracingShaderGroupHandlesNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkPipeline pipeline,
-    uint32_t firstGroup,
-    uint32_t groupCount,
-    size_t dataSize,
-    void* pData)
-{
-    // TODO: Implement
-}
-void vkGetAccelerationStructureHandleNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkAccelerationStructureNV accelerationStructure,
-    size_t dataSize,
-    void* pData)
-{
-    // TODO: Implement
-}
-void vkCmdWriteAccelerationStructuresPropertiesNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t accelerationStructureCount,
-    const VkAccelerationStructureNV* pAccelerationStructures,
-    VkQueryType queryType,
-    VkQueryPool queryPool,
-    uint32_t firstQuery)
-{
-    // TODO: Implement
-}
-void vkCompileDeferredNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkPipeline pipeline,
-    uint32_t shader)
-{
-    // TODO: Implement
-}
+    void vkCreateAccelerationStructureNV(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkResult input_result, VkDevice device,
+                                         const VkAccelerationStructureCreateInfoNV* pCreateInfo,
+                                         const VkAllocationCallbacks* pAllocator,
+                                         VkAccelerationStructureNV* pAccelerationStructure) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pAccelerationStructure create
+        mReconstruction.addHandles((const uint64_t*)pAccelerationStructure, 1);
+        mReconstruction.addHandleDependency((const uint64_t*)pAccelerationStructure, 1,
+                                            (uint64_t)(uintptr_t)device);
+        if (!pAccelerationStructure) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreateAccelerationStructureNV, snapshotTraceBegin,
+                                    snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pAccelerationStructure, 1, apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pAccelerationStructure,
+                                                1);
+    }
+    void vkDestroyAccelerationStructureNV(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkDevice device,
+                                          VkAccelerationStructureNV accelerationStructure,
+                                          const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // accelerationStructure destroy
+        mReconstruction.removeHandles((const uint64_t*)(&accelerationStructure), 1);
+    }
+    void vkGetAccelerationStructureMemoryRequirementsNV(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkDevice device, const VkAccelerationStructureMemoryRequirementsInfoNV* pInfo,
+        VkMemoryRequirements2KHR* pMemoryRequirements) {
+        // TODO: Implement
+    }
+    void vkBindAccelerationStructureMemoryNV(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, uint32_t bindInfoCount,
+        const VkBindAccelerationStructureMemoryInfoNV* pBindInfos) {
+        // TODO: Implement
+    }
+    void vkCmdBuildAccelerationStructureNV(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkCommandBuffer commandBuffer,
+                                           const VkAccelerationStructureInfoNV* pInfo,
+                                           VkBuffer instanceData, VkDeviceSize instanceOffset,
+                                           VkBool32 update, VkAccelerationStructureNV dst,
+                                           VkAccelerationStructureNV src, VkBuffer scratch,
+                                           VkDeviceSize scratchOffset) {
+        // TODO: Implement
+    }
+    void vkCmdCopyAccelerationStructureNV(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkCommandBuffer commandBuffer,
+                                          VkAccelerationStructureNV dst,
+                                          VkAccelerationStructureNV src,
+                                          VkCopyAccelerationStructureModeKHR mode) {
+        // TODO: Implement
+    }
+    void vkCmdTraceRaysNV(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
+        VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
+        VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
+        VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
+        VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
+        VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
+        uint32_t width, uint32_t height, uint32_t depth) {
+        // TODO: Implement
+    }
+    void vkCreateRayTracingPipelinesNV(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool, VkResult input_result,
+                                       VkDevice device, VkPipelineCache pipelineCache,
+                                       uint32_t createInfoCount,
+                                       const VkRayTracingPipelineCreateInfoNV* pCreateInfos,
+                                       const VkAllocationCallbacks* pAllocator,
+                                       VkPipeline* pPipelines) {
+        // TODO: Implement
+    }
+    void vkGetRayTracingShaderGroupHandlesKHR(const uint8_t* snapshotTraceBegin,
+                                              size_t snapshotTraceBytes,
+                                              android::base::BumpPool* pool, VkResult input_result,
+                                              VkDevice device, VkPipeline pipeline,
+                                              uint32_t firstGroup, uint32_t groupCount,
+                                              size_t dataSize, void* pData) {
+        // TODO: Implement
+    }
+    void vkGetRayTracingShaderGroupHandlesNV(const uint8_t* snapshotTraceBegin,
+                                             size_t snapshotTraceBytes,
+                                             android::base::BumpPool* pool, VkResult input_result,
+                                             VkDevice device, VkPipeline pipeline,
+                                             uint32_t firstGroup, uint32_t groupCount,
+                                             size_t dataSize, void* pData) {
+        // TODO: Implement
+    }
+    void vkGetAccelerationStructureHandleNV(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool, VkResult input_result,
+                                            VkDevice device,
+                                            VkAccelerationStructureNV accelerationStructure,
+                                            size_t dataSize, void* pData) {
+        // TODO: Implement
+    }
+    void vkCmdWriteAccelerationStructuresPropertiesNV(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkCommandBuffer commandBuffer, uint32_t accelerationStructureCount,
+        const VkAccelerationStructureNV* pAccelerationStructures, VkQueryType queryType,
+        VkQueryPool queryPool, uint32_t firstQuery) {
+        // TODO: Implement
+    }
+    void vkCompileDeferredNV(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                             VkPipeline pipeline, uint32_t shader) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_NV_representative_fragment_test
 #endif
@@ -5356,60 +3442,37 @@
 #ifdef VK_EXT_global_priority
 #endif
 #ifdef VK_EXT_external_memory_host
-void vkGetMemoryHostPointerPropertiesEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkExternalMemoryHandleTypeFlagBits handleType,
-    const void* pHostPointer,
-    VkMemoryHostPointerPropertiesEXT* pMemoryHostPointerProperties)
-{
-    // TODO: Implement
-}
+    void vkGetMemoryHostPointerPropertiesEXT(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType,
+        const void* pHostPointer, VkMemoryHostPointerPropertiesEXT* pMemoryHostPointerProperties) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_AMD_buffer_marker
-void vkCmdWriteBufferMarkerAMD(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkPipelineStageFlagBits pipelineStage,
-    VkBuffer dstBuffer,
-    VkDeviceSize dstOffset,
-    uint32_t marker)
-{
-    // TODO: Implement
-}
+    void vkCmdWriteBufferMarkerAMD(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                   android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                   VkPipelineStageFlagBits pipelineStage, VkBuffer dstBuffer,
+                                   VkDeviceSize dstOffset, uint32_t marker) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_AMD_pipeline_compiler_control
 #endif
 #ifdef VK_EXT_calibrated_timestamps
-void vkGetPhysicalDeviceCalibrateableTimeDomainsEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t* pTimeDomainCount,
-    VkTimeDomainEXT* pTimeDomains)
-{
-    // TODO: Implement
-}
-void vkGetCalibratedTimestampsEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    uint32_t timestampCount,
-    const VkCalibratedTimestampInfoEXT* pTimestampInfos,
-    uint64_t* pTimestamps,
-    uint64_t* pMaxDeviation)
-{
-    // TODO: Implement
-}
+    void vkGetPhysicalDeviceCalibrateableTimeDomainsEXT(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice, uint32_t* pTimeDomainCount,
+        VkTimeDomainEXT* pTimeDomains) {
+        // TODO: Implement
+    }
+    void vkGetCalibratedTimestampsEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkResult input_result,
+                                      VkDevice device, uint32_t timestampCount,
+                                      const VkCalibratedTimestampInfoEXT* pTimestampInfos,
+                                      uint64_t* pTimestamps, uint64_t* pMaxDeviation) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_AMD_shader_core_properties
 #endif
@@ -5428,216 +3491,139 @@
 #ifdef VK_NV_compute_shader_derivatives
 #endif
 #ifdef VK_NV_mesh_shader
-void vkCmdDrawMeshTasksNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t taskCount,
-    uint32_t firstTask)
-{
-    // TODO: Implement
-}
-void vkCmdDrawMeshTasksIndirectNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBuffer buffer,
-    VkDeviceSize offset,
-    uint32_t drawCount,
-    uint32_t stride)
-{
-    // TODO: Implement
-}
-void vkCmdDrawMeshTasksIndirectCountNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBuffer buffer,
-    VkDeviceSize offset,
-    VkBuffer countBuffer,
-    VkDeviceSize countBufferOffset,
-    uint32_t maxDrawCount,
-    uint32_t stride)
-{
-    // TODO: Implement
-}
+    void vkCmdDrawMeshTasksNV(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                              uint32_t taskCount, uint32_t firstTask) {
+        // TODO: Implement
+    }
+    void vkCmdDrawMeshTasksIndirectNV(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                      VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
+                                      uint32_t stride) {
+        // TODO: Implement
+    }
+    void vkCmdDrawMeshTasksIndirectCountNV(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkCommandBuffer commandBuffer, VkBuffer buffer,
+                                           VkDeviceSize offset, VkBuffer countBuffer,
+                                           VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+                                           uint32_t stride) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_NV_fragment_shader_barycentric
 #endif
 #ifdef VK_NV_shader_image_footprint
 #endif
 #ifdef VK_NV_scissor_exclusive
-void vkCmdSetExclusiveScissorNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t firstExclusiveScissor,
-    uint32_t exclusiveScissorCount,
-    const VkRect2D* pExclusiveScissors)
-{
-    // TODO: Implement
-}
+    void vkCmdSetExclusiveScissorNV(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                    uint32_t firstExclusiveScissor, uint32_t exclusiveScissorCount,
+                                    const VkRect2D* pExclusiveScissors) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
-void vkCmdSetCheckpointNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const void* pCheckpointMarker)
-{
-    // TODO: Implement
-}
-void vkGetQueueCheckpointDataNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkQueue queue,
-    uint32_t* pCheckpointDataCount,
-    VkCheckpointDataNV* pCheckpointData)
-{
-    // TODO: Implement
-}
+    void vkCmdSetCheckpointNV(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                              const void* pCheckpointMarker) {
+        // TODO: Implement
+    }
+    void vkGetQueueCheckpointDataNV(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkQueue queue,
+                                    uint32_t* pCheckpointDataCount,
+                                    VkCheckpointDataNV* pCheckpointData) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_INTEL_shader_integer_functions2
 #endif
 #ifdef VK_INTEL_performance_query
-void vkInitializePerformanceApiINTEL(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkInitializePerformanceApiInfoINTEL* pInitializeInfo)
-{
-    // TODO: Implement
-}
-void vkUninitializePerformanceApiINTEL(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device)
-{
-    // TODO: Implement
-}
-void vkCmdSetPerformanceMarkerINTEL(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkCommandBuffer commandBuffer,
-    const VkPerformanceMarkerInfoINTEL* pMarkerInfo)
-{
-    // TODO: Implement
-}
-void vkCmdSetPerformanceStreamMarkerINTEL(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkCommandBuffer commandBuffer,
-    const VkPerformanceStreamMarkerInfoINTEL* pMarkerInfo)
-{
-    // TODO: Implement
-}
-void vkCmdSetPerformanceOverrideINTEL(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkCommandBuffer commandBuffer,
-    const VkPerformanceOverrideInfoINTEL* pOverrideInfo)
-{
-    // TODO: Implement
-}
-void vkAcquirePerformanceConfigurationINTEL(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkPerformanceConfigurationAcquireInfoINTEL* pAcquireInfo,
-    VkPerformanceConfigurationINTEL* pConfiguration)
-{
-    // TODO: Implement
-}
-void vkReleasePerformanceConfigurationINTEL(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkPerformanceConfigurationINTEL configuration)
-{
-    // TODO: Implement
-}
-void vkQueueSetPerformanceConfigurationINTEL(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkQueue queue,
-    VkPerformanceConfigurationINTEL configuration)
-{
-    // TODO: Implement
-}
-void vkGetPerformanceParameterINTEL(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkPerformanceParameterTypeINTEL parameter,
-    VkPerformanceValueINTEL* pValue)
-{
-    // TODO: Implement
-}
+    void vkInitializePerformanceApiINTEL(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device,
+        const VkInitializePerformanceApiInfoINTEL* pInitializeInfo) {
+        // TODO: Implement
+    }
+    void vkUninitializePerformanceApiINTEL(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkDevice device) {
+        // TODO: Implement
+    }
+    void vkCmdSetPerformanceMarkerINTEL(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkResult input_result, VkCommandBuffer commandBuffer,
+                                        const VkPerformanceMarkerInfoINTEL* pMarkerInfo) {
+        // TODO: Implement
+    }
+    void vkCmdSetPerformanceStreamMarkerINTEL(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkCommandBuffer commandBuffer,
+        const VkPerformanceStreamMarkerInfoINTEL* pMarkerInfo) {
+        // TODO: Implement
+    }
+    void vkCmdSetPerformanceOverrideINTEL(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkResult input_result, VkCommandBuffer commandBuffer,
+                                          const VkPerformanceOverrideInfoINTEL* pOverrideInfo) {
+        // TODO: Implement
+    }
+    void vkAcquirePerformanceConfigurationINTEL(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device,
+        const VkPerformanceConfigurationAcquireInfoINTEL* pAcquireInfo,
+        VkPerformanceConfigurationINTEL* pConfiguration) {
+        // TODO: Implement
+    }
+    void vkReleasePerformanceConfigurationINTEL(const uint8_t* snapshotTraceBegin,
+                                                size_t snapshotTraceBytes,
+                                                android::base::BumpPool* pool,
+                                                VkResult input_result, VkDevice device,
+                                                VkPerformanceConfigurationINTEL configuration) {
+        // TODO: Implement
+    }
+    void vkQueueSetPerformanceConfigurationINTEL(const uint8_t* snapshotTraceBegin,
+                                                 size_t snapshotTraceBytes,
+                                                 android::base::BumpPool* pool,
+                                                 VkResult input_result, VkQueue queue,
+                                                 VkPerformanceConfigurationINTEL configuration) {
+        // TODO: Implement
+    }
+    void vkGetPerformanceParameterINTEL(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkResult input_result, VkDevice device,
+                                        VkPerformanceParameterTypeINTEL parameter,
+                                        VkPerformanceValueINTEL* pValue) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_EXT_pci_bus_info
 #endif
 #ifdef VK_AMD_display_native_hdr
-void vkSetLocalDimmingAMD(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkSwapchainKHR swapChain,
-    VkBool32 localDimmingEnable)
-{
-    // TODO: Implement
-}
+    void vkSetLocalDimmingAMD(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkDevice device,
+                              VkSwapchainKHR swapChain, VkBool32 localDimmingEnable) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_FUCHSIA_imagepipe_surface
-void vkCreateImagePipeSurfaceFUCHSIA(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    const VkImagePipeSurfaceCreateInfoFUCHSIA* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
-{
-    // TODO: Implement
-}
+    void vkCreateImagePipeSurfaceFUCHSIA(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkResult input_result, VkInstance instance,
+                                         const VkImagePipeSurfaceCreateInfoFUCHSIA* pCreateInfo,
+                                         const VkAllocationCallbacks* pAllocator,
+                                         VkSurfaceKHR* pSurface) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_EXT_metal_surface
-void vkCreateMetalSurfaceEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    const VkMetalSurfaceCreateInfoEXT* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
-{
-    // TODO: Implement
-}
+    void vkCreateMetalSurfaceEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                 android::base::BumpPool* pool, VkResult input_result,
+                                 VkInstance instance,
+                                 const VkMetalSurfaceCreateInfoEXT* pCreateInfo,
+                                 const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_EXT_fragment_density_map
 #endif
@@ -5662,59 +3648,40 @@
 #ifdef VK_NV_dedicated_allocation_image_aliasing
 #endif
 #ifdef VK_EXT_buffer_device_address
-void vkGetBufferDeviceAddressEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDeviceAddress input_result,
-    VkDevice device,
-    const VkBufferDeviceAddressInfo* pInfo)
-{
-    // TODO: Implement
-}
+    void vkGetBufferDeviceAddressEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkDeviceAddress input_result,
+                                     VkDevice device, const VkBufferDeviceAddressInfo* pInfo) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_EXT_tooling_info
-void vkGetPhysicalDeviceToolPropertiesEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t* pToolCount,
-    VkPhysicalDeviceToolPropertiesEXT* pToolProperties)
-{
-    // TODO: Implement
-}
+    void vkGetPhysicalDeviceToolPropertiesEXT(const uint8_t* snapshotTraceBegin,
+                                              size_t snapshotTraceBytes,
+                                              android::base::BumpPool* pool, VkResult input_result,
+                                              VkPhysicalDevice physicalDevice, uint32_t* pToolCount,
+                                              VkPhysicalDeviceToolPropertiesEXT* pToolProperties) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_EXT_separate_stencil_usage
 #endif
 #ifdef VK_EXT_validation_features
 #endif
 #ifdef VK_NV_cooperative_matrix
-void vkGetPhysicalDeviceCooperativeMatrixPropertiesNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t* pPropertyCount,
-    VkCooperativeMatrixPropertiesNV* pProperties)
-{
-    // TODO: Implement
-}
+    void vkGetPhysicalDeviceCooperativeMatrixPropertiesNV(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount,
+        VkCooperativeMatrixPropertiesNV* pProperties) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_NV_coverage_reduction_mode
-void vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t* pCombinationCount,
-    VkFramebufferMixedSamplesCombinationNV* pCombinations)
-{
-    // TODO: Implement
-}
+    void vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice, uint32_t* pCombinationCount,
+        VkFramebufferMixedSamplesCombinationNV* pCombinations) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_EXT_fragment_shader_interlock
 #endif
@@ -5723,294 +3690,186 @@
 #ifdef VK_EXT_provoking_vertex
 #endif
 #ifdef VK_EXT_full_screen_exclusive
-void vkGetPhysicalDeviceSurfacePresentModes2EXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo,
-    uint32_t* pPresentModeCount,
-    VkPresentModeKHR* pPresentModes)
-{
-    // TODO: Implement
-}
-void vkAcquireFullScreenExclusiveModeEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkSwapchainKHR swapchain)
-{
-    // TODO: Implement
-}
-void vkReleaseFullScreenExclusiveModeEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkSwapchainKHR swapchain)
-{
-    // TODO: Implement
-}
-void vkGetDeviceGroupSurfacePresentModes2EXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo,
-    VkDeviceGroupPresentModeFlagsKHR* pModes)
-{
-    // TODO: Implement
-}
+    void vkGetPhysicalDeviceSurfacePresentModes2EXT(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice,
+        const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, uint32_t* pPresentModeCount,
+        VkPresentModeKHR* pPresentModes) {
+        // TODO: Implement
+    }
+    void vkAcquireFullScreenExclusiveModeEXT(const uint8_t* snapshotTraceBegin,
+                                             size_t snapshotTraceBytes,
+                                             android::base::BumpPool* pool, VkResult input_result,
+                                             VkDevice device, VkSwapchainKHR swapchain) {
+        // TODO: Implement
+    }
+    void vkReleaseFullScreenExclusiveModeEXT(const uint8_t* snapshotTraceBegin,
+                                             size_t snapshotTraceBytes,
+                                             android::base::BumpPool* pool, VkResult input_result,
+                                             VkDevice device, VkSwapchainKHR swapchain) {
+        // TODO: Implement
+    }
+    void vkGetDeviceGroupSurfacePresentModes2EXT(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo,
+        VkDeviceGroupPresentModeFlagsKHR* pModes) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_EXT_headless_surface
-void vkCreateHeadlessSurfaceEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    const VkHeadlessSurfaceCreateInfoEXT* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
-{
-    // TODO: Implement
-}
+    void vkCreateHeadlessSurfaceEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkResult input_result,
+                                    VkInstance instance,
+                                    const VkHeadlessSurfaceCreateInfoEXT* pCreateInfo,
+                                    const VkAllocationCallbacks* pAllocator,
+                                    VkSurfaceKHR* pSurface) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_EXT_line_rasterization
-void vkCmdSetLineStippleEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t lineStippleFactor,
-    uint16_t lineStipplePattern)
-{
-    // TODO: Implement
-}
+    void vkCmdSetLineStippleEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                uint32_t lineStippleFactor, uint16_t lineStipplePattern) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_EXT_shader_atomic_float
 #endif
 #ifdef VK_EXT_host_query_reset
-void vkResetQueryPoolEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkQueryPool queryPool,
-    uint32_t firstQuery,
-    uint32_t queryCount)
-{
-    // TODO: Implement
-}
+    void vkResetQueryPoolEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkDevice device, VkQueryPool queryPool,
+                             uint32_t firstQuery, uint32_t queryCount) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_EXT_index_type_uint8
 #endif
 #ifdef VK_EXT_extended_dynamic_state
-void vkCmdSetCullModeEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkCullModeFlags cullMode)
-{
-    // TODO: Implement
-}
-void vkCmdSetFrontFaceEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkFrontFace frontFace)
-{
-    // TODO: Implement
-}
-void vkCmdSetPrimitiveTopologyEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkPrimitiveTopology primitiveTopology)
-{
-    // TODO: Implement
-}
-void vkCmdSetViewportWithCountEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t viewportCount,
-    const VkViewport* pViewports)
-{
-    // TODO: Implement
-}
-void vkCmdSetScissorWithCountEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t scissorCount,
-    const VkRect2D* pScissors)
-{
-    // TODO: Implement
-}
-void vkCmdBindVertexBuffers2EXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t firstBinding,
-    uint32_t bindingCount,
-    const VkBuffer* pBuffers,
-    const VkDeviceSize* pOffsets,
-    const VkDeviceSize* pSizes,
-    const VkDeviceSize* pStrides)
-{
-    // TODO: Implement
-}
-void vkCmdSetDepthTestEnableEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBool32 depthTestEnable)
-{
-    // TODO: Implement
-}
-void vkCmdSetDepthWriteEnableEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBool32 depthWriteEnable)
-{
-    // TODO: Implement
-}
-void vkCmdSetDepthCompareOpEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkCompareOp depthCompareOp)
-{
-    // TODO: Implement
-}
-void vkCmdSetDepthBoundsTestEnableEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBool32 depthBoundsTestEnable)
-{
-    // TODO: Implement
-}
-void vkCmdSetStencilTestEnableEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBool32 stencilTestEnable)
-{
-    // TODO: Implement
-}
-void vkCmdSetStencilOpEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkStencilFaceFlags faceMask,
-    VkStencilOp failOp,
-    VkStencilOp passOp,
-    VkStencilOp depthFailOp,
-    VkCompareOp compareOp)
-{
-    // TODO: Implement
-}
+    void vkCmdSetCullModeEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                             VkCullModeFlags cullMode) {
+        // TODO: Implement
+    }
+    void vkCmdSetFrontFaceEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                              VkFrontFace frontFace) {
+        // TODO: Implement
+    }
+    void vkCmdSetPrimitiveTopologyEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                      VkPrimitiveTopology primitiveTopology) {
+        // TODO: Implement
+    }
+    void vkCmdSetViewportWithCountEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                      uint32_t viewportCount, const VkViewport* pViewports) {
+        // TODO: Implement
+    }
+    void vkCmdSetScissorWithCountEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                     uint32_t scissorCount, const VkRect2D* pScissors) {
+        // TODO: Implement
+    }
+    void vkCmdBindVertexBuffers2EXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                    uint32_t firstBinding, uint32_t bindingCount,
+                                    const VkBuffer* pBuffers, const VkDeviceSize* pOffsets,
+                                    const VkDeviceSize* pSizes, const VkDeviceSize* pStrides) {
+        // TODO: Implement
+    }
+    void vkCmdSetDepthTestEnableEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                    VkBool32 depthTestEnable) {
+        // TODO: Implement
+    }
+    void vkCmdSetDepthWriteEnableEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                     VkBool32 depthWriteEnable) {
+        // TODO: Implement
+    }
+    void vkCmdSetDepthCompareOpEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                   android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                   VkCompareOp depthCompareOp) {
+        // TODO: Implement
+    }
+    void vkCmdSetDepthBoundsTestEnableEXT(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkCommandBuffer commandBuffer,
+                                          VkBool32 depthBoundsTestEnable) {
+        // TODO: Implement
+    }
+    void vkCmdSetStencilTestEnableEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                      VkBool32 stencilTestEnable) {
+        // TODO: Implement
+    }
+    void vkCmdSetStencilOpEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                              VkStencilFaceFlags faceMask, VkStencilOp failOp, VkStencilOp passOp,
+                              VkStencilOp depthFailOp, VkCompareOp compareOp) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_EXT_shader_atomic_float2
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
 #endif
 #ifdef VK_NV_device_generated_commands
-void vkGetGeneratedCommandsMemoryRequirementsNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    const VkGeneratedCommandsMemoryRequirementsInfoNV* pInfo,
-    VkMemoryRequirements2* pMemoryRequirements)
-{
-    // TODO: Implement
-}
-void vkCmdPreprocessGeneratedCommandsNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkGeneratedCommandsInfoNV* pGeneratedCommandsInfo)
-{
-    // TODO: Implement
-}
-void vkCmdExecuteGeneratedCommandsNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBool32 isPreprocessed,
-    const VkGeneratedCommandsInfoNV* pGeneratedCommandsInfo)
-{
-    // TODO: Implement
-}
-void vkCmdBindPipelineShaderGroupNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkPipelineBindPoint pipelineBindPoint,
-    VkPipeline pipeline,
-    uint32_t groupIndex)
-{
-    // TODO: Implement
-}
-void vkCreateIndirectCommandsLayoutNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkIndirectCommandsLayoutCreateInfoNV* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkIndirectCommandsLayoutNV* pIndirectCommandsLayout)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pIndirectCommandsLayout create
-    mReconstruction.addHandles((const uint64_t*)pIndirectCommandsLayout, 1);
-    mReconstruction.addHandleDependency((const uint64_t*)pIndirectCommandsLayout, 1, (uint64_t)(uintptr_t)device);
-    if (!pIndirectCommandsLayout) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkCreateIndirectCommandsLayoutNV, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pIndirectCommandsLayout, 1, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pIndirectCommandsLayout, 1);
-}
-void vkDestroyIndirectCommandsLayoutNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkIndirectCommandsLayoutNV indirectCommandsLayout,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // indirectCommandsLayout destroy
-    mReconstruction.removeHandles((const uint64_t*)(&indirectCommandsLayout), 1);
-}
+    void vkGetGeneratedCommandsMemoryRequirementsNV(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkDevice device, const VkGeneratedCommandsMemoryRequirementsInfoNV* pInfo,
+        VkMemoryRequirements2* pMemoryRequirements) {
+        // TODO: Implement
+    }
+    void vkCmdPreprocessGeneratedCommandsNV(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkCommandBuffer commandBuffer, const VkGeneratedCommandsInfoNV* pGeneratedCommandsInfo) {
+        // TODO: Implement
+    }
+    void vkCmdExecuteGeneratedCommandsNV(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkCommandBuffer commandBuffer, VkBool32 isPreprocessed,
+                                         const VkGeneratedCommandsInfoNV* pGeneratedCommandsInfo) {
+        // TODO: Implement
+    }
+    void vkCmdBindPipelineShaderGroupNV(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkCommandBuffer commandBuffer,
+                                        VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline,
+                                        uint32_t groupIndex) {
+        // TODO: Implement
+    }
+    void vkCreateIndirectCommandsLayoutNV(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkResult input_result, VkDevice device,
+                                          const VkIndirectCommandsLayoutCreateInfoNV* pCreateInfo,
+                                          const VkAllocationCallbacks* pAllocator,
+                                          VkIndirectCommandsLayoutNV* pIndirectCommandsLayout) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pIndirectCommandsLayout create
+        mReconstruction.addHandles((const uint64_t*)pIndirectCommandsLayout, 1);
+        mReconstruction.addHandleDependency((const uint64_t*)pIndirectCommandsLayout, 1,
+                                            (uint64_t)(uintptr_t)device);
+        if (!pIndirectCommandsLayout) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreateIndirectCommandsLayoutNV,
+                                    snapshotTraceBegin, snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pIndirectCommandsLayout, 1, apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pIndirectCommandsLayout,
+                                                1);
+    }
+    void vkDestroyIndirectCommandsLayoutNV(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkDevice device,
+                                           VkIndirectCommandsLayoutNV indirectCommandsLayout,
+                                           const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // indirectCommandsLayout destroy
+        mReconstruction.removeHandles((const uint64_t*)(&indirectCommandsLayout), 1);
+    }
 #endif
 #ifdef VK_NV_inherited_viewport_scissor
 #endif
@@ -6021,29 +3880,18 @@
 #ifdef VK_EXT_device_memory_report
 #endif
 #ifdef VK_EXT_acquire_drm_display
-void vkAcquireDrmDisplayEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    int32_t drmFd,
-    VkDisplayKHR display)
-{
-    // TODO: Implement
-}
-void vkGetDrmDisplayEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    int32_t drmFd,
-    uint32_t connectorId,
-    VkDisplayKHR* display)
-{
-    // TODO: Implement
-}
+    void vkAcquireDrmDisplayEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkResult input_result,
+                                VkPhysicalDevice physicalDevice, int32_t drmFd,
+                                VkDisplayKHR display) {
+        // TODO: Implement
+    }
+    void vkGetDrmDisplayEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkResult input_result,
+                            VkPhysicalDevice physicalDevice, int32_t drmFd, uint32_t connectorId,
+                            VkDisplayKHR* display) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_EXT_robustness2
 #endif
@@ -6052,53 +3900,32 @@
 #ifdef VK_GOOGLE_user_type
 #endif
 #ifdef VK_EXT_private_data
-void vkCreatePrivateDataSlotEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkPrivateDataSlotCreateInfoEXT* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkPrivateDataSlotEXT* pPrivateDataSlot)
-{
-    // TODO: Implement
-}
-void vkDestroyPrivateDataSlotEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkPrivateDataSlotEXT privateDataSlot,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-}
-void vkSetPrivateDataEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkObjectType objectType,
-    uint64_t objectHandle,
-    VkPrivateDataSlotEXT privateDataSlot,
-    uint64_t data)
-{
-    // TODO: Implement
-}
-void vkGetPrivateDataEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkObjectType objectType,
-    uint64_t objectHandle,
-    VkPrivateDataSlotEXT privateDataSlot,
-    uint64_t* pData)
-{
-    // TODO: Implement
-}
+    void vkCreatePrivateDataSlotEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkResult input_result,
+                                    VkDevice device,
+                                    const VkPrivateDataSlotCreateInfoEXT* pCreateInfo,
+                                    const VkAllocationCallbacks* pAllocator,
+                                    VkPrivateDataSlotEXT* pPrivateDataSlot) {
+        // TODO: Implement
+    }
+    void vkDestroyPrivateDataSlotEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkDevice device,
+                                     VkPrivateDataSlotEXT privateDataSlot,
+                                     const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+    }
+    void vkSetPrivateDataEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                             VkObjectType objectType, uint64_t objectHandle,
+                             VkPrivateDataSlotEXT privateDataSlot, uint64_t data) {
+        // TODO: Implement
+    }
+    void vkGetPrivateDataEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkDevice device,
+                             VkObjectType objectType, uint64_t objectHandle,
+                             VkPrivateDataSlotEXT privateDataSlot, uint64_t* pData) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_EXT_pipeline_creation_cache_control
 #endif
@@ -6107,16 +3934,12 @@
 #ifdef VK_QCOM_render_pass_store_ops
 #endif
 #ifdef VK_NV_fragment_shading_rate_enums
-void vkCmdSetFragmentShadingRateEnumNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkFragmentShadingRateNV shadingRate,
-    const VkFragmentShadingRateCombinerOpKHR combinerOps[2])
-{
-    // TODO: Implement
-}
+    void vkCmdSetFragmentShadingRateEnumNV(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkCommandBuffer commandBuffer, VkFragmentShadingRateNV shadingRate,
+        const VkFragmentShadingRateCombinerOpKHR combinerOps[2]) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_NV_ray_tracing_motion_blur
 #endif
@@ -6133,929 +3956,594 @@
 #ifdef VK_EXT_rgba10x6_formats
 #endif
 #ifdef VK_NV_acquire_winrt_display
-void vkAcquireWinrtDisplayNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    VkDisplayKHR display)
-{
-    // TODO: Implement
-}
-void vkGetWinrtDisplayNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t deviceRelativeId,
-    VkDisplayKHR* pDisplay)
-{
-    // TODO: Implement
-}
+    void vkAcquireWinrtDisplayNV(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                 android::base::BumpPool* pool, VkResult input_result,
+                                 VkPhysicalDevice physicalDevice, VkDisplayKHR display) {
+        // TODO: Implement
+    }
+    void vkGetWinrtDisplayNV(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkResult input_result,
+                             VkPhysicalDevice physicalDevice, uint32_t deviceRelativeId,
+                             VkDisplayKHR* pDisplay) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_EXT_directfb_surface
-void vkCreateDirectFBSurfaceEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    const VkDirectFBSurfaceCreateInfoEXT* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDeviceDirectFBPresentationSupportEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkBool32 input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t queueFamilyIndex,
-    IDirectFB* dfb)
-{
-    // TODO: Implement
-}
+    void vkCreateDirectFBSurfaceEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkResult input_result,
+                                    VkInstance instance,
+                                    const VkDirectFBSurfaceCreateInfoEXT* pCreateInfo,
+                                    const VkAllocationCallbacks* pAllocator,
+                                    VkSurfaceKHR* pSurface) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDeviceDirectFBPresentationSupportEXT(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkBool32 input_result, VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
+        IDirectFB* dfb) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_VALVE_mutable_descriptor_type
 #endif
 #ifdef VK_EXT_vertex_input_dynamic_state
-void vkCmdSetVertexInputEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t vertexBindingDescriptionCount,
-    const VkVertexInputBindingDescription2EXT* pVertexBindingDescriptions,
-    uint32_t vertexAttributeDescriptionCount,
-    const VkVertexInputAttributeDescription2EXT* pVertexAttributeDescriptions)
-{
-    // TODO: Implement
-}
+    void vkCmdSetVertexInputEXT(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkCommandBuffer commandBuffer, uint32_t vertexBindingDescriptionCount,
+        const VkVertexInputBindingDescription2EXT* pVertexBindingDescriptions,
+        uint32_t vertexAttributeDescriptionCount,
+        const VkVertexInputAttributeDescription2EXT* pVertexAttributeDescriptions) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_EXT_physical_device_drm
 #endif
 #ifdef VK_EXT_primitive_topology_list_restart
 #endif
 #ifdef VK_FUCHSIA_external_memory
-void vkGetMemoryZirconHandleFUCHSIA(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkMemoryGetZirconHandleInfoFUCHSIA* pGetZirconHandleInfo,
-    zx_handle_t* pZirconHandle)
-{
-    // TODO: Implement
-}
-void vkGetMemoryZirconHandlePropertiesFUCHSIA(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkExternalMemoryHandleTypeFlagBits handleType,
-    zx_handle_t zirconHandle,
-    VkMemoryZirconHandlePropertiesFUCHSIA* pMemoryZirconHandleProperties)
-{
-    // TODO: Implement
-}
+    void vkGetMemoryZirconHandleFUCHSIA(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device,
+        const VkMemoryGetZirconHandleInfoFUCHSIA* pGetZirconHandleInfo,
+        zx_handle_t* pZirconHandle) {
+        // TODO: Implement
+    }
+    void vkGetMemoryZirconHandlePropertiesFUCHSIA(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType,
+        zx_handle_t zirconHandle,
+        VkMemoryZirconHandlePropertiesFUCHSIA* pMemoryZirconHandleProperties) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_FUCHSIA_external_semaphore
-void vkImportSemaphoreZirconHandleFUCHSIA(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkImportSemaphoreZirconHandleInfoFUCHSIA* pImportSemaphoreZirconHandleInfo)
-{
-    // TODO: Implement
-}
-void vkGetSemaphoreZirconHandleFUCHSIA(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkSemaphoreGetZirconHandleInfoFUCHSIA* pGetZirconHandleInfo,
-    zx_handle_t* pZirconHandle)
-{
-    // TODO: Implement
-}
+    void vkImportSemaphoreZirconHandleFUCHSIA(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device,
+        const VkImportSemaphoreZirconHandleInfoFUCHSIA* pImportSemaphoreZirconHandleInfo) {
+        // TODO: Implement
+    }
+    void vkGetSemaphoreZirconHandleFUCHSIA(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device,
+        const VkSemaphoreGetZirconHandleInfoFUCHSIA* pGetZirconHandleInfo,
+        zx_handle_t* pZirconHandle) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
-void vkCreateBufferCollectionFUCHSIA(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkBufferCollectionCreateInfoFUCHSIA* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkBufferCollectionFUCHSIA* pCollection)
-{
-    // TODO: Implement
-}
-void vkSetBufferCollectionImageConstraintsFUCHSIA(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkBufferCollectionFUCHSIA collection,
-    const VkImageConstraintsInfoFUCHSIA* pImageConstraintsInfo)
-{
-    // TODO: Implement
-}
-void vkSetBufferCollectionBufferConstraintsFUCHSIA(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkBufferCollectionFUCHSIA collection,
-    const VkBufferConstraintsInfoFUCHSIA* pBufferConstraintsInfo)
-{
-    // TODO: Implement
-}
-void vkDestroyBufferCollectionFUCHSIA(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkBufferCollectionFUCHSIA collection,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-}
-void vkGetBufferCollectionPropertiesFUCHSIA(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkBufferCollectionFUCHSIA collection,
-    VkBufferCollectionPropertiesFUCHSIA* pProperties)
-{
-    // TODO: Implement
-}
+    void vkCreateBufferCollectionFUCHSIA(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkResult input_result, VkDevice device,
+                                         const VkBufferCollectionCreateInfoFUCHSIA* pCreateInfo,
+                                         const VkAllocationCallbacks* pAllocator,
+                                         VkBufferCollectionFUCHSIA* pCollection) {
+        // TODO: Implement
+    }
+    void vkSetBufferCollectionImageConstraintsFUCHSIA(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, VkBufferCollectionFUCHSIA collection,
+        const VkImageConstraintsInfoFUCHSIA* pImageConstraintsInfo) {
+        // TODO: Implement
+    }
+    void vkSetBufferCollectionBufferConstraintsFUCHSIA(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, VkBufferCollectionFUCHSIA collection,
+        const VkBufferConstraintsInfoFUCHSIA* pBufferConstraintsInfo) {
+        // TODO: Implement
+    }
+    void vkDestroyBufferCollectionFUCHSIA(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkDevice device, VkBufferCollectionFUCHSIA collection,
+                                          const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+    }
+    void vkGetBufferCollectionPropertiesFUCHSIA(const uint8_t* snapshotTraceBegin,
+                                                size_t snapshotTraceBytes,
+                                                android::base::BumpPool* pool,
+                                                VkResult input_result, VkDevice device,
+                                                VkBufferCollectionFUCHSIA collection,
+                                                VkBufferCollectionPropertiesFUCHSIA* pProperties) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_HUAWEI_subpass_shading
-void vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkRenderPass renderpass,
-    VkExtent2D* pMaxWorkgroupSize)
-{
-    // TODO: Implement
-}
-void vkCmdSubpassShadingHUAWEI(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer)
-{
-    // TODO: Implement
-}
+    void vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI(const uint8_t* snapshotTraceBegin,
+                                                         size_t snapshotTraceBytes,
+                                                         android::base::BumpPool* pool,
+                                                         VkResult input_result, VkDevice device,
+                                                         VkRenderPass renderpass,
+                                                         VkExtent2D* pMaxWorkgroupSize) {
+        // TODO: Implement
+    }
+    void vkCmdSubpassShadingHUAWEI(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                   android::base::BumpPool* pool, VkCommandBuffer commandBuffer) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_HUAWEI_invocation_mask
-void vkCmdBindInvocationMaskHUAWEI(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkImageView imageView,
-    VkImageLayout imageLayout)
-{
-    // TODO: Implement
-}
+    void vkCmdBindInvocationMaskHUAWEI(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                       VkImageView imageView, VkImageLayout imageLayout) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_NV_external_memory_rdma
-void vkGetMemoryRemoteAddressNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkMemoryGetRemoteAddressInfoNV* pMemoryGetRemoteAddressInfo,
-    VkRemoteAddressNV* pAddress)
-{
-    // TODO: Implement
-}
+    void vkGetMemoryRemoteAddressNV(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device,
+        const VkMemoryGetRemoteAddressInfoNV* pMemoryGetRemoteAddressInfo,
+        VkRemoteAddressNV* pAddress) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
-void vkCmdSetPatchControlPointsEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t patchControlPoints)
-{
-    // TODO: Implement
-}
-void vkCmdSetRasterizerDiscardEnableEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBool32 rasterizerDiscardEnable)
-{
-    // TODO: Implement
-}
-void vkCmdSetDepthBiasEnableEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBool32 depthBiasEnable)
-{
-    // TODO: Implement
-}
-void vkCmdSetLogicOpEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkLogicOp logicOp)
-{
-    // TODO: Implement
-}
-void vkCmdSetPrimitiveRestartEnableEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBool32 primitiveRestartEnable)
-{
-    // TODO: Implement
-}
+    void vkCmdSetPatchControlPointsEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                       uint32_t patchControlPoints) {
+        // TODO: Implement
+    }
+    void vkCmdSetRasterizerDiscardEnableEXT(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool,
+                                            VkCommandBuffer commandBuffer,
+                                            VkBool32 rasterizerDiscardEnable) {
+        // TODO: Implement
+    }
+    void vkCmdSetDepthBiasEnableEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                    VkBool32 depthBiasEnable) {
+        // TODO: Implement
+    }
+    void vkCmdSetLogicOpEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                            VkLogicOp logicOp) {
+        // TODO: Implement
+    }
+    void vkCmdSetPrimitiveRestartEnableEXT(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkCommandBuffer commandBuffer,
+                                           VkBool32 primitiveRestartEnable) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_QNX_screen_surface
-void vkCreateScreenSurfaceQNX(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    const VkScreenSurfaceCreateInfoQNX* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
-{
-    // TODO: Implement
-}
-void vkGetPhysicalDeviceScreenPresentationSupportQNX(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkBool32 input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t queueFamilyIndex,
-    _screen_window* window)
-{
-    // TODO: Implement
-}
+    void vkCreateScreenSurfaceQNX(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkResult input_result,
+                                  VkInstance instance,
+                                  const VkScreenSurfaceCreateInfoQNX* pCreateInfo,
+                                  const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) {
+        // TODO: Implement
+    }
+    void vkGetPhysicalDeviceScreenPresentationSupportQNX(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkBool32 input_result, VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
+        _screen_window* window) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_EXT_color_write_enable
-void vkCmdSetColorWriteEnableEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t attachmentCount,
-    const VkBool32* pColorWriteEnables)
-{
-    // TODO: Implement
-}
+    void vkCmdSetColorWriteEnableEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                     uint32_t attachmentCount, const VkBool32* pColorWriteEnables) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_GOOGLE_gfxstream
-void vkRegisterImageColorBufferGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkImage image,
-    uint32_t colorBuffer)
-{
-    // TODO: Implement
-}
-void vkRegisterBufferColorBufferGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkBuffer buffer,
-    uint32_t colorBuffer)
-{
-    // TODO: Implement
-}
-void vkMapMemoryIntoAddressSpaceGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkDeviceMemory memory,
-    uint64_t* pAddress)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // memory modify
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkMapMemoryIntoAddressSpaceGOOGLE, snapshotTraceBegin, snapshotTraceBytes);
-    for (uint32_t i = 0; i < 1; ++i)
-    {
-        VkDeviceMemory boxed = unboxed_to_boxed_non_dispatchable_VkDeviceMemory((&memory)[i]);
-        mReconstruction.forEachHandleAddModifyApi((const uint64_t*)(&boxed), 1, apiHandle);
+    void vkRegisterImageColorBufferGOOGLE(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkResult input_result, VkDevice device, VkImage image,
+                                          uint32_t colorBuffer) {
+        // TODO: Implement
     }
-}
-void vkUpdateDescriptorSetWithTemplateSizedGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkDescriptorSet descriptorSet,
-    VkDescriptorUpdateTemplate descriptorUpdateTemplate,
-    uint32_t imageInfoCount,
-    uint32_t bufferInfoCount,
-    uint32_t bufferViewCount,
-    const uint32_t* pImageInfoEntryIndices,
-    const uint32_t* pBufferInfoEntryIndices,
-    const uint32_t* pBufferViewEntryIndices,
-    const VkDescriptorImageInfo* pImageInfos,
-    const VkDescriptorBufferInfo* pBufferInfos,
-    const VkBufferView* pBufferViews)
-{
-    // TODO: Implement
-}
-void vkBeginCommandBufferAsyncGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkCommandBufferBeginInfo* pBeginInfo)
-{
-    // TODO: Implement
-}
-void vkEndCommandBufferAsyncGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer)
-{
-    // TODO: Implement
-}
-void vkResetCommandBufferAsyncGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkCommandBufferResetFlags flags)
-{
-    // TODO: Implement
-}
-void vkCommandBufferHostSyncGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t needHostSync,
-    uint32_t sequenceNumber)
-{
-    // TODO: Implement
-}
-void vkCreateImageWithRequirementsGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkImageCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkImage* pImage,
-    VkMemoryRequirements* pMemoryRequirements)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pImage create
-    mReconstruction.addHandles((const uint64_t*)pImage, 1);
-    mReconstruction.addHandleDependency((const uint64_t*)pImage, 1, (uint64_t)(uintptr_t)device);
-    if (!pImage) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkCreateImageWithRequirementsGOOGLE, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pImage, 1, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pImage, 1);
-}
-void vkCreateBufferWithRequirementsGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkBufferCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkBuffer* pBuffer,
-    VkMemoryRequirements* pMemoryRequirements)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pBuffer create
-    mReconstruction.addHandles((const uint64_t*)pBuffer, 1);
-    mReconstruction.addHandleDependency((const uint64_t*)pBuffer, 1, (uint64_t)(uintptr_t)device);
-    if (!pBuffer) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkCreateBufferWithRequirementsGOOGLE, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pBuffer, 1, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pBuffer, 1);
-}
-void vkGetMemoryHostAddressInfoGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkDeviceMemory memory,
-    uint64_t* pAddress,
-    uint64_t* pSize,
-    uint64_t* pHostmemId)
-{
-    // TODO: Implement
-}
-void vkFreeMemorySyncGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkDeviceMemory memory,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // memory destroy
-    mReconstruction.removeHandles((const uint64_t*)(&memory), 1);
-}
-void vkQueueHostSyncGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkQueue queue,
-    uint32_t needHostSync,
-    uint32_t sequenceNumber)
-{
-    // TODO: Implement
-}
-void vkQueueSubmitAsyncGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkQueue queue,
-    uint32_t submitCount,
-    const VkSubmitInfo* pSubmits,
-    VkFence fence)
-{
-    // TODO: Implement
-}
-void vkQueueWaitIdleAsyncGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkQueue queue)
-{
-    // TODO: Implement
-}
-void vkQueueBindSparseAsyncGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkQueue queue,
-    uint32_t bindInfoCount,
-    const VkBindSparseInfo* pBindInfo,
-    VkFence fence)
-{
-    // TODO: Implement
-}
-void vkGetLinearImageLayoutGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkFormat format,
-    VkDeviceSize* pOffset,
-    VkDeviceSize* pRowPitchAlignment)
-{
-    // TODO: Implement
-}
-void vkGetLinearImageLayout2GOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    const VkImageCreateInfo* pCreateInfo,
-    VkDeviceSize* pOffset,
-    VkDeviceSize* pRowPitchAlignment)
-{
-    // TODO: Implement
-}
-void vkQueueFlushCommandsGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkQueue queue,
-    VkCommandBuffer commandBuffer,
-    VkDeviceSize dataSize,
-    const void* pData)
-{
-    // TODO: Implement
-}
-void vkQueueCommitDescriptorSetUpdatesGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkQueue queue,
-    uint32_t descriptorPoolCount,
-    const VkDescriptorPool* pDescriptorPools,
-    uint32_t descriptorSetCount,
-    const VkDescriptorSetLayout* pSetLayouts,
-    const uint64_t* pDescriptorSetPoolIds,
-    const uint32_t* pDescriptorSetWhichPool,
-    const uint32_t* pDescriptorSetPendingAllocation,
-    const uint32_t* pDescriptorWriteStartingIndices,
-    uint32_t pendingDescriptorWriteCount,
-    const VkWriteDescriptorSet* pPendingDescriptorWrites)
-{
-    // TODO: Implement
-}
-void vkCollectDescriptorPoolIdsGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkDescriptorPool descriptorPool,
-    uint32_t* pPoolIdCount,
-    uint64_t* pPoolIds)
-{
-    // TODO: Implement
-}
-void vkQueueSignalReleaseImageANDROIDAsyncGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkQueue queue,
-    uint32_t waitSemaphoreCount,
-    const VkSemaphore* pWaitSemaphores,
-    VkImage image)
-{
-    // TODO: Implement
-}
+    void vkRegisterBufferColorBufferGOOGLE(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkResult input_result, VkDevice device, VkBuffer buffer,
+                                           uint32_t colorBuffer) {
+        // TODO: Implement
+    }
+    void vkMapMemoryIntoAddressSpaceGOOGLE(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkResult input_result, VkDevice device,
+                                           VkDeviceMemory memory, uint64_t* pAddress) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // memory modify
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkMapMemoryIntoAddressSpaceGOOGLE,
+                                    snapshotTraceBegin, snapshotTraceBytes);
+        for (uint32_t i = 0; i < 1; ++i) {
+            VkDeviceMemory boxed = unboxed_to_boxed_non_dispatchable_VkDeviceMemory((&memory)[i]);
+            mReconstruction.forEachHandleAddModifyApi((const uint64_t*)(&boxed), 1, apiHandle);
+        }
+    }
+    void vkUpdateDescriptorSetWithTemplateSizedGOOGLE(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkDevice device, VkDescriptorSet descriptorSet,
+        VkDescriptorUpdateTemplate descriptorUpdateTemplate, uint32_t imageInfoCount,
+        uint32_t bufferInfoCount, uint32_t bufferViewCount, const uint32_t* pImageInfoEntryIndices,
+        const uint32_t* pBufferInfoEntryIndices, const uint32_t* pBufferViewEntryIndices,
+        const VkDescriptorImageInfo* pImageInfos, const VkDescriptorBufferInfo* pBufferInfos,
+        const VkBufferView* pBufferViews) {
+        // TODO: Implement
+    }
+    void vkBeginCommandBufferAsyncGOOGLE(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkCommandBuffer commandBuffer,
+                                         const VkCommandBufferBeginInfo* pBeginInfo) {
+        // TODO: Implement
+    }
+    void vkEndCommandBufferAsyncGOOGLE(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool,
+                                       VkCommandBuffer commandBuffer) {
+        // TODO: Implement
+    }
+    void vkResetCommandBufferAsyncGOOGLE(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkCommandBuffer commandBuffer,
+                                         VkCommandBufferResetFlags flags) {
+        // TODO: Implement
+    }
+    void vkCommandBufferHostSyncGOOGLE(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                       uint32_t needHostSync, uint32_t sequenceNumber) {
+        // TODO: Implement
+    }
+    void vkCreateImageWithRequirementsGOOGLE(const uint8_t* snapshotTraceBegin,
+                                             size_t snapshotTraceBytes,
+                                             android::base::BumpPool* pool, VkResult input_result,
+                                             VkDevice device, const VkImageCreateInfo* pCreateInfo,
+                                             const VkAllocationCallbacks* pAllocator,
+                                             VkImage* pImage,
+                                             VkMemoryRequirements* pMemoryRequirements) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pImage create
+        mReconstruction.addHandles((const uint64_t*)pImage, 1);
+        mReconstruction.addHandleDependency((const uint64_t*)pImage, 1,
+                                            (uint64_t)(uintptr_t)device);
+        if (!pImage) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreateImageWithRequirementsGOOGLE,
+                                    snapshotTraceBegin, snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pImage, 1, apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pImage, 1);
+    }
+    void vkCreateBufferWithRequirementsGOOGLE(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, const VkBufferCreateInfo* pCreateInfo,
+        const VkAllocationCallbacks* pAllocator, VkBuffer* pBuffer,
+        VkMemoryRequirements* pMemoryRequirements) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pBuffer create
+        mReconstruction.addHandles((const uint64_t*)pBuffer, 1);
+        mReconstruction.addHandleDependency((const uint64_t*)pBuffer, 1,
+                                            (uint64_t)(uintptr_t)device);
+        if (!pBuffer) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreateBufferWithRequirementsGOOGLE,
+                                    snapshotTraceBegin, snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pBuffer, 1, apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pBuffer, 1);
+    }
+    void vkGetMemoryHostAddressInfoGOOGLE(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkResult input_result, VkDevice device,
+                                          VkDeviceMemory memory, uint64_t* pAddress,
+                                          uint64_t* pSize, uint64_t* pHostmemId) {
+        // TODO: Implement
+    }
+    void vkFreeMemorySyncGOOGLE(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkResult input_result,
+                                VkDevice device, VkDeviceMemory memory,
+                                const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // memory destroy
+        mReconstruction.removeHandles((const uint64_t*)(&memory), 1);
+    }
+    void vkQueueHostSyncGOOGLE(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, VkQueue queue, uint32_t needHostSync,
+                               uint32_t sequenceNumber) {
+        // TODO: Implement
+    }
+    void vkQueueSubmitAsyncGOOGLE(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkQueue queue,
+                                  uint32_t submitCount, const VkSubmitInfo* pSubmits,
+                                  VkFence fence) {
+        // TODO: Implement
+    }
+    void vkQueueWaitIdleAsyncGOOGLE(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkQueue queue) {
+        // TODO: Implement
+    }
+    void vkQueueBindSparseAsyncGOOGLE(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkQueue queue,
+                                      uint32_t bindInfoCount, const VkBindSparseInfo* pBindInfo,
+                                      VkFence fence) {
+        // TODO: Implement
+    }
+    void vkGetLinearImageLayoutGOOGLE(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkDevice device,
+                                      VkFormat format, VkDeviceSize* pOffset,
+                                      VkDeviceSize* pRowPitchAlignment) {
+        // TODO: Implement
+    }
+    void vkGetLinearImageLayout2GOOGLE(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool, VkDevice device,
+                                       const VkImageCreateInfo* pCreateInfo, VkDeviceSize* pOffset,
+                                       VkDeviceSize* pRowPitchAlignment) {
+        // TODO: Implement
+    }
+    void vkQueueFlushCommandsGOOGLE(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkQueue queue,
+                                    VkCommandBuffer commandBuffer, VkDeviceSize dataSize,
+                                    const void* pData) {
+        // TODO: Implement
+    }
+    void vkQueueCommitDescriptorSetUpdatesGOOGLE(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkQueue queue, uint32_t descriptorPoolCount, const VkDescriptorPool* pDescriptorPools,
+        uint32_t descriptorSetCount, const VkDescriptorSetLayout* pSetLayouts,
+        const uint64_t* pDescriptorSetPoolIds, const uint32_t* pDescriptorSetWhichPool,
+        const uint32_t* pDescriptorSetPendingAllocation,
+        const uint32_t* pDescriptorWriteStartingIndices, uint32_t pendingDescriptorWriteCount,
+        const VkWriteDescriptorSet* pPendingDescriptorWrites) {
+        // TODO: Implement
+    }
+    void vkCollectDescriptorPoolIdsGOOGLE(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkDevice device, VkDescriptorPool descriptorPool,
+                                          uint32_t* pPoolIdCount, uint64_t* pPoolIds) {
+        // TODO: Implement
+    }
+    void vkQueueSignalReleaseImageANDROIDAsyncGOOGLE(const uint8_t* snapshotTraceBegin,
+                                                     size_t snapshotTraceBytes,
+                                                     android::base::BumpPool* pool, VkQueue queue,
+                                                     uint32_t waitSemaphoreCount,
+                                                     const VkSemaphore* pWaitSemaphores,
+                                                     VkImage image) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_EXT_global_priority_query
 #endif
 #ifdef VK_EXT_multi_draw
-void vkCmdDrawMultiEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t drawCount,
-    const VkMultiDrawInfoEXT* pVertexInfo,
-    uint32_t instanceCount,
-    uint32_t firstInstance,
-    uint32_t stride)
-{
-    // TODO: Implement
-}
-void vkCmdDrawMultiIndexedEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t drawCount,
-    const VkMultiDrawIndexedInfoEXT* pIndexInfo,
-    uint32_t instanceCount,
-    uint32_t firstInstance,
-    uint32_t stride,
-    const int32_t* pVertexOffset)
-{
-    // TODO: Implement
-}
+    void vkCmdDrawMultiEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                           uint32_t drawCount, const VkMultiDrawInfoEXT* pVertexInfo,
+                           uint32_t instanceCount, uint32_t firstInstance, uint32_t stride) {
+        // TODO: Implement
+    }
+    void vkCmdDrawMultiIndexedEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                  uint32_t drawCount, const VkMultiDrawIndexedInfoEXT* pIndexInfo,
+                                  uint32_t instanceCount, uint32_t firstInstance, uint32_t stride,
+                                  const int32_t* pVertexOffset) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_EXT_load_store_op_none
 #endif
 #ifdef VK_EXT_border_color_swizzle
 #endif
 #ifdef VK_EXT_pageable_device_local_memory
-void vkSetDeviceMemoryPriorityEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkDeviceMemory memory,
-    float priority)
-{
-    // TODO: Implement
-}
+    void vkSetDeviceMemoryPriorityEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkDevice device,
+                                      VkDeviceMemory memory, float priority) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_acceleration_structure
-void vkCreateAccelerationStructureKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkAccelerationStructureCreateInfoKHR* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkAccelerationStructureKHR* pAccelerationStructure)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // pAccelerationStructure create
-    mReconstruction.addHandles((const uint64_t*)pAccelerationStructure, 1);
-    mReconstruction.addHandleDependency((const uint64_t*)pAccelerationStructure, 1, (uint64_t)(uintptr_t)device);
-    if (!pAccelerationStructure) return;
-    auto apiHandle = mReconstruction.createApiInfo();
-    auto apiInfo = mReconstruction.getApiInfo(apiHandle);
-    mReconstruction.setApiTrace(apiInfo, OP_vkCreateAccelerationStructureKHR, snapshotTraceBegin, snapshotTraceBytes);
-    mReconstruction.forEachHandleAddApi((const uint64_t*)pAccelerationStructure, 1, apiHandle);
-    mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pAccelerationStructure, 1);
-}
-void vkDestroyAccelerationStructureKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkAccelerationStructureKHR accelerationStructure,
-    const VkAllocationCallbacks* pAllocator)
-{
-    // TODO: Implement
-    android::base::AutoLock lock(mLock);
-    // accelerationStructure destroy
-    mReconstruction.removeHandles((const uint64_t*)(&accelerationStructure), 1);
-}
-void vkCmdBuildAccelerationStructuresKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t infoCount,
-    const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,
-    const VkAccelerationStructureBuildRangeInfoKHR* const* ppBuildRangeInfos)
-{
-    // TODO: Implement
-}
-void vkCmdBuildAccelerationStructuresIndirectKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t infoCount,
-    const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,
-    const VkDeviceAddress* pIndirectDeviceAddresses,
-    const uint32_t* pIndirectStrides,
-    const uint32_t* const* ppMaxPrimitiveCounts)
-{
-    // TODO: Implement
-}
-void vkBuildAccelerationStructuresKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkDeferredOperationKHR deferredOperation,
-    uint32_t infoCount,
-    const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,
-    const VkAccelerationStructureBuildRangeInfoKHR* const* ppBuildRangeInfos)
-{
-    // TODO: Implement
-}
-void vkCopyAccelerationStructureKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkDeferredOperationKHR deferredOperation,
-    const VkCopyAccelerationStructureInfoKHR* pInfo)
-{
-    // TODO: Implement
-}
-void vkCopyAccelerationStructureToMemoryKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkDeferredOperationKHR deferredOperation,
-    const VkCopyAccelerationStructureToMemoryInfoKHR* pInfo)
-{
-    // TODO: Implement
-}
-void vkCopyMemoryToAccelerationStructureKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkDeferredOperationKHR deferredOperation,
-    const VkCopyMemoryToAccelerationStructureInfoKHR* pInfo)
-{
-    // TODO: Implement
-}
-void vkWriteAccelerationStructuresPropertiesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    uint32_t accelerationStructureCount,
-    const VkAccelerationStructureKHR* pAccelerationStructures,
-    VkQueryType queryType,
-    size_t dataSize,
-    void* pData,
-    size_t stride)
-{
-    // TODO: Implement
-}
-void vkCmdCopyAccelerationStructureKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkCopyAccelerationStructureInfoKHR* pInfo)
-{
-    // TODO: Implement
-}
-void vkCmdCopyAccelerationStructureToMemoryKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkCopyAccelerationStructureToMemoryInfoKHR* pInfo)
-{
-    // TODO: Implement
-}
-void vkCmdCopyMemoryToAccelerationStructureKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkCopyMemoryToAccelerationStructureInfoKHR* pInfo)
-{
-    // TODO: Implement
-}
-void vkGetAccelerationStructureDeviceAddressKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDeviceAddress input_result,
-    VkDevice device,
-    const VkAccelerationStructureDeviceAddressInfoKHR* pInfo)
-{
-    // TODO: Implement
-}
-void vkCmdWriteAccelerationStructuresPropertiesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t accelerationStructureCount,
-    const VkAccelerationStructureKHR* pAccelerationStructures,
-    VkQueryType queryType,
-    VkQueryPool queryPool,
-    uint32_t firstQuery)
-{
-    // TODO: Implement
-}
-void vkGetDeviceAccelerationStructureCompatibilityKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    const VkAccelerationStructureVersionInfoKHR* pVersionInfo,
-    VkAccelerationStructureCompatibilityKHR* pCompatibility)
-{
-    // TODO: Implement
-}
-void vkGetAccelerationStructureBuildSizesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkAccelerationStructureBuildTypeKHR buildType,
-    const VkAccelerationStructureBuildGeometryInfoKHR* pBuildInfo,
-    const uint32_t* pMaxPrimitiveCounts,
-    VkAccelerationStructureBuildSizesInfoKHR* pSizeInfo)
-{
-    // TODO: Implement
-}
+    void vkCreateAccelerationStructureKHR(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkResult input_result, VkDevice device,
+                                          const VkAccelerationStructureCreateInfoKHR* pCreateInfo,
+                                          const VkAllocationCallbacks* pAllocator,
+                                          VkAccelerationStructureKHR* pAccelerationStructure) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // pAccelerationStructure create
+        mReconstruction.addHandles((const uint64_t*)pAccelerationStructure, 1);
+        mReconstruction.addHandleDependency((const uint64_t*)pAccelerationStructure, 1,
+                                            (uint64_t)(uintptr_t)device);
+        if (!pAccelerationStructure) return;
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreateAccelerationStructureKHR,
+                                    snapshotTraceBegin, snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pAccelerationStructure, 1, apiHandle);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pAccelerationStructure,
+                                                1);
+    }
+    void vkDestroyAccelerationStructureKHR(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkDevice device,
+                                           VkAccelerationStructureKHR accelerationStructure,
+                                           const VkAllocationCallbacks* pAllocator) {
+        // TODO: Implement
+        android::base::AutoLock lock(mLock);
+        // accelerationStructure destroy
+        mReconstruction.removeHandles((const uint64_t*)(&accelerationStructure), 1);
+    }
+    void vkCmdBuildAccelerationStructuresKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkCommandBuffer commandBuffer, uint32_t infoCount,
+        const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,
+        const VkAccelerationStructureBuildRangeInfoKHR* const* ppBuildRangeInfos) {
+        // TODO: Implement
+    }
+    void vkCmdBuildAccelerationStructuresIndirectKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkCommandBuffer commandBuffer, uint32_t infoCount,
+        const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,
+        const VkDeviceAddress* pIndirectDeviceAddresses, const uint32_t* pIndirectStrides,
+        const uint32_t* const* ppMaxPrimitiveCounts) {
+        // TODO: Implement
+    }
+    void vkBuildAccelerationStructuresKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, VkDeferredOperationKHR deferredOperation,
+        uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,
+        const VkAccelerationStructureBuildRangeInfoKHR* const* ppBuildRangeInfos) {
+        // TODO: Implement
+    }
+    void vkCopyAccelerationStructureKHR(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkResult input_result, VkDevice device,
+                                        VkDeferredOperationKHR deferredOperation,
+                                        const VkCopyAccelerationStructureInfoKHR* pInfo) {
+        // TODO: Implement
+    }
+    void vkCopyAccelerationStructureToMemoryKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, VkDeferredOperationKHR deferredOperation,
+        const VkCopyAccelerationStructureToMemoryInfoKHR* pInfo) {
+        // TODO: Implement
+    }
+    void vkCopyMemoryToAccelerationStructureKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, VkDeferredOperationKHR deferredOperation,
+        const VkCopyMemoryToAccelerationStructureInfoKHR* pInfo) {
+        // TODO: Implement
+    }
+    void vkWriteAccelerationStructuresPropertiesKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, uint32_t accelerationStructureCount,
+        const VkAccelerationStructureKHR* pAccelerationStructures, VkQueryType queryType,
+        size_t dataSize, void* pData, size_t stride) {
+        // TODO: Implement
+    }
+    void vkCmdCopyAccelerationStructureKHR(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkCommandBuffer commandBuffer,
+                                           const VkCopyAccelerationStructureInfoKHR* pInfo) {
+        // TODO: Implement
+    }
+    void vkCmdCopyAccelerationStructureToMemoryKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkCommandBuffer commandBuffer, const VkCopyAccelerationStructureToMemoryInfoKHR* pInfo) {
+        // TODO: Implement
+    }
+    void vkCmdCopyMemoryToAccelerationStructureKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkCommandBuffer commandBuffer, const VkCopyMemoryToAccelerationStructureInfoKHR* pInfo) {
+        // TODO: Implement
+    }
+    void vkGetAccelerationStructureDeviceAddressKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkDeviceAddress input_result, VkDevice device,
+        const VkAccelerationStructureDeviceAddressInfoKHR* pInfo) {
+        // TODO: Implement
+    }
+    void vkCmdWriteAccelerationStructuresPropertiesKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkCommandBuffer commandBuffer, uint32_t accelerationStructureCount,
+        const VkAccelerationStructureKHR* pAccelerationStructures, VkQueryType queryType,
+        VkQueryPool queryPool, uint32_t firstQuery) {
+        // TODO: Implement
+    }
+    void vkGetDeviceAccelerationStructureCompatibilityKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkDevice device, const VkAccelerationStructureVersionInfoKHR* pVersionInfo,
+        VkAccelerationStructureCompatibilityKHR* pCompatibility) {
+        // TODO: Implement
+    }
+    void vkGetAccelerationStructureBuildSizesKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkDevice device, VkAccelerationStructureBuildTypeKHR buildType,
+        const VkAccelerationStructureBuildGeometryInfoKHR* pBuildInfo,
+        const uint32_t* pMaxPrimitiveCounts, VkAccelerationStructureBuildSizesInfoKHR* pSizeInfo) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
-void vkCmdTraceRaysKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable,
-    const VkStridedDeviceAddressRegionKHR* pMissShaderBindingTable,
-    const VkStridedDeviceAddressRegionKHR* pHitShaderBindingTable,
-    const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable,
-    uint32_t width,
-    uint32_t height,
-    uint32_t depth)
-{
-    // TODO: Implement
-}
-void vkCreateRayTracingPipelinesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkDeferredOperationKHR deferredOperation,
-    VkPipelineCache pipelineCache,
-    uint32_t createInfoCount,
-    const VkRayTracingPipelineCreateInfoKHR* pCreateInfos,
-    const VkAllocationCallbacks* pAllocator,
-    VkPipeline* pPipelines)
-{
-    // TODO: Implement
-}
-void vkGetRayTracingCaptureReplayShaderGroupHandlesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkPipeline pipeline,
-    uint32_t firstGroup,
-    uint32_t groupCount,
-    size_t dataSize,
-    void* pData)
-{
-    // TODO: Implement
-}
-void vkCmdTraceRaysIndirectKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable,
-    const VkStridedDeviceAddressRegionKHR* pMissShaderBindingTable,
-    const VkStridedDeviceAddressRegionKHR* pHitShaderBindingTable,
-    const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable,
-    VkDeviceAddress indirectDeviceAddress)
-{
-    // TODO: Implement
-}
-void vkGetRayTracingShaderGroupStackSizeKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDeviceSize input_result,
-    VkDevice device,
-    VkPipeline pipeline,
-    uint32_t group,
-    VkShaderGroupShaderKHR groupShader)
-{
-    // TODO: Implement
-}
-void vkCmdSetRayTracingPipelineStackSizeKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t pipelineStackSize)
-{
-    // TODO: Implement
-}
+    void vkCmdTraceRaysKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                           const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable,
+                           const VkStridedDeviceAddressRegionKHR* pMissShaderBindingTable,
+                           const VkStridedDeviceAddressRegionKHR* pHitShaderBindingTable,
+                           const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable,
+                           uint32_t width, uint32_t height, uint32_t depth) {
+        // TODO: Implement
+    }
+    void vkCreateRayTracingPipelinesKHR(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkResult input_result, VkDevice device,
+                                        VkDeferredOperationKHR deferredOperation,
+                                        VkPipelineCache pipelineCache, uint32_t createInfoCount,
+                                        const VkRayTracingPipelineCreateInfoKHR* pCreateInfos,
+                                        const VkAllocationCallbacks* pAllocator,
+                                        VkPipeline* pPipelines) {
+        // TODO: Implement
+    }
+    void vkGetRayTracingCaptureReplayShaderGroupHandlesKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, VkPipeline pipeline, uint32_t firstGroup,
+        uint32_t groupCount, size_t dataSize, void* pData) {
+        // TODO: Implement
+    }
+    void vkCmdTraceRaysIndirectKHR(
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkCommandBuffer commandBuffer,
+        const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable,
+        const VkStridedDeviceAddressRegionKHR* pMissShaderBindingTable,
+        const VkStridedDeviceAddressRegionKHR* pHitShaderBindingTable,
+        const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable,
+        VkDeviceAddress indirectDeviceAddress) {
+        // TODO: Implement
+    }
+    void vkGetRayTracingShaderGroupStackSizeKHR(const uint8_t* snapshotTraceBegin,
+                                                size_t snapshotTraceBytes,
+                                                android::base::BumpPool* pool,
+                                                VkDeviceSize input_result, VkDevice device,
+                                                VkPipeline pipeline, uint32_t group,
+                                                VkShaderGroupShaderKHR groupShader) {
+        // TODO: Implement
+    }
+    void vkCmdSetRayTracingPipelineStackSizeKHR(const uint8_t* snapshotTraceBegin,
+                                                size_t snapshotTraceBytes,
+                                                android::base::BumpPool* pool,
+                                                VkCommandBuffer commandBuffer,
+                                                uint32_t pipelineStackSize) {
+        // TODO: Implement
+    }
 #endif
 #ifdef VK_KHR_ray_query
 #endif
 
-private:
+   private:
     android::base::Lock mLock;
     VkReconstruction mReconstruction;
 };
 
-VkDecoderSnapshot::VkDecoderSnapshot() :
-    mImpl(new VkDecoderSnapshot::Impl()) { }
+VkDecoderSnapshot::VkDecoderSnapshot() : mImpl(new VkDecoderSnapshot::Impl()) {}
 
-void VkDecoderSnapshot::save(android::base::Stream* stream) {
-    mImpl->save(stream);
-}
+void VkDecoderSnapshot::save(android::base::Stream* stream) { mImpl->save(stream); }
 
 void VkDecoderSnapshot::load(android::base::Stream* stream, GfxApiLogger& gfx_logger) {
     mImpl->load(stream, gfx_logger);
@@ -7063,6991 +4551,5217 @@
 
 VkDecoderSnapshot::~VkDecoderSnapshot() = default;
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCreateInstance(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    const VkInstanceCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkInstance* pInstance)
-{
-    mImpl->vkCreateInstance(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, pCreateInfo, pAllocator, pInstance);
+void VkDecoderSnapshot::vkCreateInstance(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkResult input_result,
+                                         const VkInstanceCreateInfo* pCreateInfo,
+                                         const VkAllocationCallbacks* pAllocator,
+                                         VkInstance* pInstance) {
+    mImpl->vkCreateInstance(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, pCreateInfo,
+                            pAllocator, pInstance);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkDestroyInstance(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkInstance instance,
-    const VkAllocationCallbacks* pAllocator)
-{
+void VkDecoderSnapshot::vkDestroyInstance(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkInstance instance,
+                                          const VkAllocationCallbacks* pAllocator) {
     mImpl->vkDestroyInstance(snapshotTraceBegin, snapshotTraceBytes, pool, instance, pAllocator);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkEnumeratePhysicalDevices(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    uint32_t* pPhysicalDeviceCount,
-    VkPhysicalDevice* pPhysicalDevices)
-{
-    mImpl->vkEnumeratePhysicalDevices(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, instance, pPhysicalDeviceCount, pPhysicalDevices);
+void VkDecoderSnapshot::vkEnumeratePhysicalDevices(const uint8_t* snapshotTraceBegin,
+                                                   size_t snapshotTraceBytes,
+                                                   android::base::BumpPool* pool,
+                                                   VkResult input_result, VkInstance instance,
+                                                   uint32_t* pPhysicalDeviceCount,
+                                                   VkPhysicalDevice* pPhysicalDevices) {
+    mImpl->vkEnumeratePhysicalDevices(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                      instance, pPhysicalDeviceCount, pPhysicalDevices);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkGetPhysicalDeviceFeatures(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    VkPhysicalDeviceFeatures* pFeatures)
-{
-    mImpl->vkGetPhysicalDeviceFeatures(snapshotTraceBegin, snapshotTraceBytes, pool, physicalDevice, pFeatures);
+void VkDecoderSnapshot::vkGetPhysicalDeviceFeatures(const uint8_t* snapshotTraceBegin,
+                                                    size_t snapshotTraceBytes,
+                                                    android::base::BumpPool* pool,
+                                                    VkPhysicalDevice physicalDevice,
+                                                    VkPhysicalDeviceFeatures* pFeatures) {
+    mImpl->vkGetPhysicalDeviceFeatures(snapshotTraceBegin, snapshotTraceBytes, pool, physicalDevice,
+                                       pFeatures);
 }
 #endif
 #ifdef VK_VERSION_1_0
 void VkDecoderSnapshot::vkGetPhysicalDeviceFormatProperties(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    VkFormat format,
-    VkFormatProperties* pFormatProperties)
-{
-    mImpl->vkGetPhysicalDeviceFormatProperties(snapshotTraceBegin, snapshotTraceBytes, pool, physicalDevice, format, pFormatProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties* pFormatProperties) {
+    mImpl->vkGetPhysicalDeviceFormatProperties(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                               physicalDevice, format, pFormatProperties);
 }
 #endif
 #ifdef VK_VERSION_1_0
 void VkDecoderSnapshot::vkGetPhysicalDeviceImageFormatProperties(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    VkFormat format,
-    VkImageType type,
-    VkImageTiling tiling,
-    VkImageUsageFlags usage,
-    VkImageCreateFlags flags,
-    VkImageFormatProperties* pImageFormatProperties)
-{
-    mImpl->vkGetPhysicalDeviceImageFormatProperties(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, format, type, tiling, usage, flags, pImageFormatProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
+    VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags,
+    VkImageFormatProperties* pImageFormatProperties) {
+    mImpl->vkGetPhysicalDeviceImageFormatProperties(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                    input_result, physicalDevice, format, type,
+                                                    tiling, usage, flags, pImageFormatProperties);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkGetPhysicalDeviceProperties(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    VkPhysicalDeviceProperties* pProperties)
-{
-    mImpl->vkGetPhysicalDeviceProperties(snapshotTraceBegin, snapshotTraceBytes, pool, physicalDevice, pProperties);
+void VkDecoderSnapshot::vkGetPhysicalDeviceProperties(const uint8_t* snapshotTraceBegin,
+                                                      size_t snapshotTraceBytes,
+                                                      android::base::BumpPool* pool,
+                                                      VkPhysicalDevice physicalDevice,
+                                                      VkPhysicalDeviceProperties* pProperties) {
+    mImpl->vkGetPhysicalDeviceProperties(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                         physicalDevice, pProperties);
 }
 #endif
 #ifdef VK_VERSION_1_0
 void VkDecoderSnapshot::vkGetPhysicalDeviceQueueFamilyProperties(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    uint32_t* pQueueFamilyPropertyCount,
-    VkQueueFamilyProperties* pQueueFamilyProperties)
-{
-    mImpl->vkGetPhysicalDeviceQueueFamilyProperties(snapshotTraceBegin, snapshotTraceBytes, pool, physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkPhysicalDevice physicalDevice, uint32_t* pQueueFamilyPropertyCount,
+    VkQueueFamilyProperties* pQueueFamilyProperties) {
+    mImpl->vkGetPhysicalDeviceQueueFamilyProperties(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                    physicalDevice, pQueueFamilyPropertyCount,
+                                                    pQueueFamilyProperties);
 }
 #endif
 #ifdef VK_VERSION_1_0
 void VkDecoderSnapshot::vkGetPhysicalDeviceMemoryProperties(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    VkPhysicalDeviceMemoryProperties* pMemoryProperties)
-{
-    mImpl->vkGetPhysicalDeviceMemoryProperties(snapshotTraceBegin, snapshotTraceBytes, pool, physicalDevice, pMemoryProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties* pMemoryProperties) {
+    mImpl->vkGetPhysicalDeviceMemoryProperties(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                               physicalDevice, pMemoryProperties);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkGetInstanceProcAddr(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    PFN_vkVoidFunction input_result,
-    VkInstance instance,
-    const char* pName)
-{
-    mImpl->vkGetInstanceProcAddr(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, instance, pName);
+void VkDecoderSnapshot::vkGetInstanceProcAddr(const uint8_t* snapshotTraceBegin,
+                                              size_t snapshotTraceBytes,
+                                              android::base::BumpPool* pool,
+                                              PFN_vkVoidFunction input_result, VkInstance instance,
+                                              const char* pName) {
+    mImpl->vkGetInstanceProcAddr(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                 instance, pName);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkGetDeviceProcAddr(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    PFN_vkVoidFunction input_result,
-    VkDevice device,
-    const char* pName)
-{
-    mImpl->vkGetDeviceProcAddr(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pName);
+void VkDecoderSnapshot::vkGetDeviceProcAddr(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool,
+                                            PFN_vkVoidFunction input_result, VkDevice device,
+                                            const char* pName) {
+    mImpl->vkGetDeviceProcAddr(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                               pName);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCreateDevice(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    const VkDeviceCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkDevice* pDevice)
-{
-    mImpl->vkCreateDevice(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, pCreateInfo, pAllocator, pDevice);
+void VkDecoderSnapshot::vkCreateDevice(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool, VkResult input_result,
+                                       VkPhysicalDevice physicalDevice,
+                                       const VkDeviceCreateInfo* pCreateInfo,
+                                       const VkAllocationCallbacks* pAllocator, VkDevice* pDevice) {
+    mImpl->vkCreateDevice(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                          physicalDevice, pCreateInfo, pAllocator, pDevice);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkDestroyDevice(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    const VkAllocationCallbacks* pAllocator)
-{
+void VkDecoderSnapshot::vkDestroyDevice(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkDevice device, const VkAllocationCallbacks* pAllocator) {
     mImpl->vkDestroyDevice(snapshotTraceBegin, snapshotTraceBytes, pool, device, pAllocator);
 }
 #endif
 #ifdef VK_VERSION_1_0
 void VkDecoderSnapshot::vkEnumerateInstanceExtensionProperties(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    const char* pLayerName,
-    uint32_t* pPropertyCount,
-    VkExtensionProperties* pProperties)
-{
-    mImpl->vkEnumerateInstanceExtensionProperties(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, pLayerName, pPropertyCount, pProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, const char* pLayerName, uint32_t* pPropertyCount,
+    VkExtensionProperties* pProperties) {
+    mImpl->vkEnumerateInstanceExtensionProperties(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                  input_result, pLayerName, pPropertyCount,
+                                                  pProperties);
 }
 #endif
 #ifdef VK_VERSION_1_0
 void VkDecoderSnapshot::vkEnumerateDeviceExtensionProperties(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    const char* pLayerName,
-    uint32_t* pPropertyCount,
-    VkExtensionProperties* pProperties)
-{
-    mImpl->vkEnumerateDeviceExtensionProperties(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, pLayerName, pPropertyCount, pProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkPhysicalDevice physicalDevice, const char* pLayerName,
+    uint32_t* pPropertyCount, VkExtensionProperties* pProperties) {
+    mImpl->vkEnumerateDeviceExtensionProperties(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                input_result, physicalDevice, pLayerName,
+                                                pPropertyCount, pProperties);
 }
 #endif
 #ifdef VK_VERSION_1_0
 void VkDecoderSnapshot::vkEnumerateInstanceLayerProperties(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    uint32_t* pPropertyCount,
-    VkLayerProperties* pProperties)
-{
-    mImpl->vkEnumerateInstanceLayerProperties(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, pPropertyCount, pProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, uint32_t* pPropertyCount, VkLayerProperties* pProperties) {
+    mImpl->vkEnumerateInstanceLayerProperties(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                              input_result, pPropertyCount, pProperties);
 }
 #endif
 #ifdef VK_VERSION_1_0
 void VkDecoderSnapshot::vkEnumerateDeviceLayerProperties(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t* pPropertyCount,
-    VkLayerProperties* pProperties)
-{
-    mImpl->vkEnumerateDeviceLayerProperties(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, pPropertyCount, pProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount,
+    VkLayerProperties* pProperties) {
+    mImpl->vkEnumerateDeviceLayerProperties(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                            input_result, physicalDevice, pPropertyCount,
+                                            pProperties);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkGetDeviceQueue(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    uint32_t queueFamilyIndex,
-    uint32_t queueIndex,
-    VkQueue* pQueue)
-{
-    mImpl->vkGetDeviceQueue(snapshotTraceBegin, snapshotTraceBytes, pool, device, queueFamilyIndex, queueIndex, pQueue);
+void VkDecoderSnapshot::vkGetDeviceQueue(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkDevice device, uint32_t queueFamilyIndex,
+                                         uint32_t queueIndex, VkQueue* pQueue) {
+    mImpl->vkGetDeviceQueue(snapshotTraceBegin, snapshotTraceBytes, pool, device, queueFamilyIndex,
+                            queueIndex, pQueue);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkQueueSubmit(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkQueue queue,
-    uint32_t submitCount,
-    const VkSubmitInfo* pSubmits,
-    VkFence fence)
-{
-    mImpl->vkQueueSubmit(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, queue, submitCount, pSubmits, fence);
+void VkDecoderSnapshot::vkQueueSubmit(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkResult input_result,
+                                      VkQueue queue, uint32_t submitCount,
+                                      const VkSubmitInfo* pSubmits, VkFence fence) {
+    mImpl->vkQueueSubmit(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, queue,
+                         submitCount, pSubmits, fence);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkQueueWaitIdle(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkQueue queue)
-{
+void VkDecoderSnapshot::vkQueueWaitIdle(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkResult input_result, VkQueue queue) {
     mImpl->vkQueueWaitIdle(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, queue);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkDeviceWaitIdle(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device)
-{
+void VkDecoderSnapshot::vkDeviceWaitIdle(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkResult input_result, VkDevice device) {
     mImpl->vkDeviceWaitIdle(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkAllocateMemory(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkMemoryAllocateInfo* pAllocateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkDeviceMemory* pMemory)
-{
-    mImpl->vkAllocateMemory(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pAllocateInfo, pAllocator, pMemory);
+void VkDecoderSnapshot::vkAllocateMemory(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkResult input_result, VkDevice device,
+                                         const VkMemoryAllocateInfo* pAllocateInfo,
+                                         const VkAllocationCallbacks* pAllocator,
+                                         VkDeviceMemory* pMemory) {
+    mImpl->vkAllocateMemory(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                            pAllocateInfo, pAllocator, pMemory);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkFreeMemory(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkDeviceMemory memory,
-    const VkAllocationCallbacks* pAllocator)
-{
+void VkDecoderSnapshot::vkFreeMemory(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkDevice device,
+                                     VkDeviceMemory memory,
+                                     const VkAllocationCallbacks* pAllocator) {
     mImpl->vkFreeMemory(snapshotTraceBegin, snapshotTraceBytes, pool, device, memory, pAllocator);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkMapMemory(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkDeviceMemory memory,
-    VkDeviceSize offset,
-    VkDeviceSize size,
-    VkMemoryMapFlags flags,
-    void** ppData)
-{
-    mImpl->vkMapMemory(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, memory, offset, size, flags, ppData);
+void VkDecoderSnapshot::vkMapMemory(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkResult input_result,
+                                    VkDevice device, VkDeviceMemory memory, VkDeviceSize offset,
+                                    VkDeviceSize size, VkMemoryMapFlags flags, void** ppData) {
+    mImpl->vkMapMemory(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, memory,
+                       offset, size, flags, ppData);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkUnmapMemory(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkDeviceMemory memory)
-{
+void VkDecoderSnapshot::vkUnmapMemory(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkDevice device,
+                                      VkDeviceMemory memory) {
     mImpl->vkUnmapMemory(snapshotTraceBegin, snapshotTraceBytes, pool, device, memory);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkFlushMappedMemoryRanges(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    uint32_t memoryRangeCount,
-    const VkMappedMemoryRange* pMemoryRanges)
-{
-    mImpl->vkFlushMappedMemoryRanges(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, memoryRangeCount, pMemoryRanges);
+void VkDecoderSnapshot::vkFlushMappedMemoryRanges(const uint8_t* snapshotTraceBegin,
+                                                  size_t snapshotTraceBytes,
+                                                  android::base::BumpPool* pool,
+                                                  VkResult input_result, VkDevice device,
+                                                  uint32_t memoryRangeCount,
+                                                  const VkMappedMemoryRange* pMemoryRanges) {
+    mImpl->vkFlushMappedMemoryRanges(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                     device, memoryRangeCount, pMemoryRanges);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkInvalidateMappedMemoryRanges(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    uint32_t memoryRangeCount,
-    const VkMappedMemoryRange* pMemoryRanges)
-{
-    mImpl->vkInvalidateMappedMemoryRanges(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, memoryRangeCount, pMemoryRanges);
+void VkDecoderSnapshot::vkInvalidateMappedMemoryRanges(const uint8_t* snapshotTraceBegin,
+                                                       size_t snapshotTraceBytes,
+                                                       android::base::BumpPool* pool,
+                                                       VkResult input_result, VkDevice device,
+                                                       uint32_t memoryRangeCount,
+                                                       const VkMappedMemoryRange* pMemoryRanges) {
+    mImpl->vkInvalidateMappedMemoryRanges(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                          input_result, device, memoryRangeCount, pMemoryRanges);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkGetDeviceMemoryCommitment(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkDeviceMemory memory,
-    VkDeviceSize* pCommittedMemoryInBytes)
-{
-    mImpl->vkGetDeviceMemoryCommitment(snapshotTraceBegin, snapshotTraceBytes, pool, device, memory, pCommittedMemoryInBytes);
+void VkDecoderSnapshot::vkGetDeviceMemoryCommitment(const uint8_t* snapshotTraceBegin,
+                                                    size_t snapshotTraceBytes,
+                                                    android::base::BumpPool* pool, VkDevice device,
+                                                    VkDeviceMemory memory,
+                                                    VkDeviceSize* pCommittedMemoryInBytes) {
+    mImpl->vkGetDeviceMemoryCommitment(snapshotTraceBegin, snapshotTraceBytes, pool, device, memory,
+                                       pCommittedMemoryInBytes);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkBindBufferMemory(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkBuffer buffer,
-    VkDeviceMemory memory,
-    VkDeviceSize memoryOffset)
-{
-    mImpl->vkBindBufferMemory(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, buffer, memory, memoryOffset);
+void VkDecoderSnapshot::vkBindBufferMemory(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkResult input_result, VkDevice device, VkBuffer buffer,
+                                           VkDeviceMemory memory, VkDeviceSize memoryOffset) {
+    mImpl->vkBindBufferMemory(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                              buffer, memory, memoryOffset);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkBindImageMemory(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkImage image,
-    VkDeviceMemory memory,
-    VkDeviceSize memoryOffset)
-{
-    mImpl->vkBindImageMemory(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, image, memory, memoryOffset);
+void VkDecoderSnapshot::vkBindImageMemory(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkResult input_result, VkDevice device, VkImage image,
+                                          VkDeviceMemory memory, VkDeviceSize memoryOffset) {
+    mImpl->vkBindImageMemory(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                             image, memory, memoryOffset);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkGetBufferMemoryRequirements(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkBuffer buffer,
-    VkMemoryRequirements* pMemoryRequirements)
-{
-    mImpl->vkGetBufferMemoryRequirements(snapshotTraceBegin, snapshotTraceBytes, pool, device, buffer, pMemoryRequirements);
+void VkDecoderSnapshot::vkGetBufferMemoryRequirements(const uint8_t* snapshotTraceBegin,
+                                                      size_t snapshotTraceBytes,
+                                                      android::base::BumpPool* pool,
+                                                      VkDevice device, VkBuffer buffer,
+                                                      VkMemoryRequirements* pMemoryRequirements) {
+    mImpl->vkGetBufferMemoryRequirements(snapshotTraceBegin, snapshotTraceBytes, pool, device,
+                                         buffer, pMemoryRequirements);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkGetImageMemoryRequirements(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkImage image,
-    VkMemoryRequirements* pMemoryRequirements)
-{
-    mImpl->vkGetImageMemoryRequirements(snapshotTraceBegin, snapshotTraceBytes, pool, device, image, pMemoryRequirements);
+void VkDecoderSnapshot::vkGetImageMemoryRequirements(const uint8_t* snapshotTraceBegin,
+                                                     size_t snapshotTraceBytes,
+                                                     android::base::BumpPool* pool, VkDevice device,
+                                                     VkImage image,
+                                                     VkMemoryRequirements* pMemoryRequirements) {
+    mImpl->vkGetImageMemoryRequirements(snapshotTraceBegin, snapshotTraceBytes, pool, device, image,
+                                        pMemoryRequirements);
 }
 #endif
 #ifdef VK_VERSION_1_0
 void VkDecoderSnapshot::vkGetImageSparseMemoryRequirements(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkImage image,
-    uint32_t* pSparseMemoryRequirementCount,
-    VkSparseImageMemoryRequirements* pSparseMemoryRequirements)
-{
-    mImpl->vkGetImageSparseMemoryRequirements(snapshotTraceBegin, snapshotTraceBytes, pool, device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkDevice device, VkImage image, uint32_t* pSparseMemoryRequirementCount,
+    VkSparseImageMemoryRequirements* pSparseMemoryRequirements) {
+    mImpl->vkGetImageSparseMemoryRequirements(snapshotTraceBegin, snapshotTraceBytes, pool, device,
+                                              image, pSparseMemoryRequirementCount,
+                                              pSparseMemoryRequirements);
 }
 #endif
 #ifdef VK_VERSION_1_0
 void VkDecoderSnapshot::vkGetPhysicalDeviceSparseImageFormatProperties(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    VkFormat format,
-    VkImageType type,
-    VkSampleCountFlagBits samples,
-    VkImageUsageFlags usage,
-    VkImageTiling tiling,
-    uint32_t* pPropertyCount,
-    VkSparseImageFormatProperties* pProperties)
-{
-    mImpl->vkGetPhysicalDeviceSparseImageFormatProperties(snapshotTraceBegin, snapshotTraceBytes, pool, physicalDevice, format, type, samples, usage, tiling, pPropertyCount, pProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
+    VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
+    uint32_t* pPropertyCount, VkSparseImageFormatProperties* pProperties) {
+    mImpl->vkGetPhysicalDeviceSparseImageFormatProperties(
+        snapshotTraceBegin, snapshotTraceBytes, pool, physicalDevice, format, type, samples, usage,
+        tiling, pPropertyCount, pProperties);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkQueueBindSparse(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkQueue queue,
-    uint32_t bindInfoCount,
-    const VkBindSparseInfo* pBindInfo,
-    VkFence fence)
-{
-    mImpl->vkQueueBindSparse(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, queue, bindInfoCount, pBindInfo, fence);
+void VkDecoderSnapshot::vkQueueBindSparse(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkResult input_result, VkQueue queue,
+                                          uint32_t bindInfoCount, const VkBindSparseInfo* pBindInfo,
+                                          VkFence fence) {
+    mImpl->vkQueueBindSparse(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, queue,
+                             bindInfoCount, pBindInfo, fence);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCreateFence(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkFenceCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkFence* pFence)
-{
-    mImpl->vkCreateFence(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pCreateInfo, pAllocator, pFence);
+void VkDecoderSnapshot::vkCreateFence(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkResult input_result,
+                                      VkDevice device, const VkFenceCreateInfo* pCreateInfo,
+                                      const VkAllocationCallbacks* pAllocator, VkFence* pFence) {
+    mImpl->vkCreateFence(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                         pCreateInfo, pAllocator, pFence);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkDestroyFence(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkFence fence,
-    const VkAllocationCallbacks* pAllocator)
-{
+void VkDecoderSnapshot::vkDestroyFence(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool, VkDevice device,
+                                       VkFence fence, const VkAllocationCallbacks* pAllocator) {
     mImpl->vkDestroyFence(snapshotTraceBegin, snapshotTraceBytes, pool, device, fence, pAllocator);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkResetFences(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    uint32_t fenceCount,
-    const VkFence* pFences)
-{
-    mImpl->vkResetFences(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, fenceCount, pFences);
+void VkDecoderSnapshot::vkResetFences(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkResult input_result,
+                                      VkDevice device, uint32_t fenceCount,
+                                      const VkFence* pFences) {
+    mImpl->vkResetFences(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                         fenceCount, pFences);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkGetFenceStatus(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkFence fence)
-{
-    mImpl->vkGetFenceStatus(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, fence);
+void VkDecoderSnapshot::vkGetFenceStatus(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkResult input_result, VkDevice device, VkFence fence) {
+    mImpl->vkGetFenceStatus(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                            fence);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkWaitForFences(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    uint32_t fenceCount,
-    const VkFence* pFences,
-    VkBool32 waitAll,
-    uint64_t timeout)
-{
-    mImpl->vkWaitForFences(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, fenceCount, pFences, waitAll, timeout);
+void VkDecoderSnapshot::vkWaitForFences(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkResult input_result, VkDevice device, uint32_t fenceCount,
+                                        const VkFence* pFences, VkBool32 waitAll,
+                                        uint64_t timeout) {
+    mImpl->vkWaitForFences(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                           fenceCount, pFences, waitAll, timeout);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCreateSemaphore(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkSemaphoreCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSemaphore* pSemaphore)
-{
-    mImpl->vkCreateSemaphore(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pCreateInfo, pAllocator, pSemaphore);
+void VkDecoderSnapshot::vkCreateSemaphore(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkResult input_result, VkDevice device,
+                                          const VkSemaphoreCreateInfo* pCreateInfo,
+                                          const VkAllocationCallbacks* pAllocator,
+                                          VkSemaphore* pSemaphore) {
+    mImpl->vkCreateSemaphore(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                             pCreateInfo, pAllocator, pSemaphore);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkDestroySemaphore(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkSemaphore semaphore,
-    const VkAllocationCallbacks* pAllocator)
-{
-    mImpl->vkDestroySemaphore(snapshotTraceBegin, snapshotTraceBytes, pool, device, semaphore, pAllocator);
+void VkDecoderSnapshot::vkDestroySemaphore(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkDevice device, VkSemaphore semaphore,
+                                           const VkAllocationCallbacks* pAllocator) {
+    mImpl->vkDestroySemaphore(snapshotTraceBegin, snapshotTraceBytes, pool, device, semaphore,
+                              pAllocator);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCreateEvent(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkEventCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkEvent* pEvent)
-{
-    mImpl->vkCreateEvent(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pCreateInfo, pAllocator, pEvent);
+void VkDecoderSnapshot::vkCreateEvent(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkResult input_result,
+                                      VkDevice device, const VkEventCreateInfo* pCreateInfo,
+                                      const VkAllocationCallbacks* pAllocator, VkEvent* pEvent) {
+    mImpl->vkCreateEvent(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                         pCreateInfo, pAllocator, pEvent);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkDestroyEvent(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkEvent event,
-    const VkAllocationCallbacks* pAllocator)
-{
+void VkDecoderSnapshot::vkDestroyEvent(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool, VkDevice device,
+                                       VkEvent event, const VkAllocationCallbacks* pAllocator) {
     mImpl->vkDestroyEvent(snapshotTraceBegin, snapshotTraceBytes, pool, device, event, pAllocator);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkGetEventStatus(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkEvent event)
-{
-    mImpl->vkGetEventStatus(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, event);
+void VkDecoderSnapshot::vkGetEventStatus(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkResult input_result, VkDevice device, VkEvent event) {
+    mImpl->vkGetEventStatus(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                            event);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkSetEvent(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkEvent event)
-{
+void VkDecoderSnapshot::vkSetEvent(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                   android::base::BumpPool* pool, VkResult input_result,
+                                   VkDevice device, VkEvent event) {
     mImpl->vkSetEvent(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, event);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkResetEvent(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkEvent event)
-{
+void VkDecoderSnapshot::vkResetEvent(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkResult input_result,
+                                     VkDevice device, VkEvent event) {
     mImpl->vkResetEvent(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, event);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCreateQueryPool(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkQueryPoolCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkQueryPool* pQueryPool)
-{
-    mImpl->vkCreateQueryPool(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pCreateInfo, pAllocator, pQueryPool);
+void VkDecoderSnapshot::vkCreateQueryPool(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkResult input_result, VkDevice device,
+                                          const VkQueryPoolCreateInfo* pCreateInfo,
+                                          const VkAllocationCallbacks* pAllocator,
+                                          VkQueryPool* pQueryPool) {
+    mImpl->vkCreateQueryPool(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                             pCreateInfo, pAllocator, pQueryPool);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkDestroyQueryPool(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkQueryPool queryPool,
-    const VkAllocationCallbacks* pAllocator)
-{
-    mImpl->vkDestroyQueryPool(snapshotTraceBegin, snapshotTraceBytes, pool, device, queryPool, pAllocator);
+void VkDecoderSnapshot::vkDestroyQueryPool(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkDevice device, VkQueryPool queryPool,
+                                           const VkAllocationCallbacks* pAllocator) {
+    mImpl->vkDestroyQueryPool(snapshotTraceBegin, snapshotTraceBytes, pool, device, queryPool,
+                              pAllocator);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkGetQueryPoolResults(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkQueryPool queryPool,
-    uint32_t firstQuery,
-    uint32_t queryCount,
-    size_t dataSize,
-    void* pData,
-    VkDeviceSize stride,
-    VkQueryResultFlags flags)
-{
-    mImpl->vkGetQueryPoolResults(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
+void VkDecoderSnapshot::vkGetQueryPoolResults(const uint8_t* snapshotTraceBegin,
+                                              size_t snapshotTraceBytes,
+                                              android::base::BumpPool* pool, VkResult input_result,
+                                              VkDevice device, VkQueryPool queryPool,
+                                              uint32_t firstQuery, uint32_t queryCount,
+                                              size_t dataSize, void* pData, VkDeviceSize stride,
+                                              VkQueryResultFlags flags) {
+    mImpl->vkGetQueryPoolResults(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                                 queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCreateBuffer(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkBufferCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkBuffer* pBuffer)
-{
-    mImpl->vkCreateBuffer(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pCreateInfo, pAllocator, pBuffer);
+void VkDecoderSnapshot::vkCreateBuffer(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool, VkResult input_result,
+                                       VkDevice device, const VkBufferCreateInfo* pCreateInfo,
+                                       const VkAllocationCallbacks* pAllocator, VkBuffer* pBuffer) {
+    mImpl->vkCreateBuffer(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                          pCreateInfo, pAllocator, pBuffer);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkDestroyBuffer(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkBuffer buffer,
-    const VkAllocationCallbacks* pAllocator)
-{
-    mImpl->vkDestroyBuffer(snapshotTraceBegin, snapshotTraceBytes, pool, device, buffer, pAllocator);
+void VkDecoderSnapshot::vkDestroyBuffer(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkDevice device, VkBuffer buffer,
+                                        const VkAllocationCallbacks* pAllocator) {
+    mImpl->vkDestroyBuffer(snapshotTraceBegin, snapshotTraceBytes, pool, device, buffer,
+                           pAllocator);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCreateBufferView(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkBufferViewCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkBufferView* pView)
-{
-    mImpl->vkCreateBufferView(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pCreateInfo, pAllocator, pView);
+void VkDecoderSnapshot::vkCreateBufferView(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkResult input_result, VkDevice device,
+                                           const VkBufferViewCreateInfo* pCreateInfo,
+                                           const VkAllocationCallbacks* pAllocator,
+                                           VkBufferView* pView) {
+    mImpl->vkCreateBufferView(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                              pCreateInfo, pAllocator, pView);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkDestroyBufferView(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkBufferView bufferView,
-    const VkAllocationCallbacks* pAllocator)
-{
-    mImpl->vkDestroyBufferView(snapshotTraceBegin, snapshotTraceBytes, pool, device, bufferView, pAllocator);
+void VkDecoderSnapshot::vkDestroyBufferView(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool, VkDevice device,
+                                            VkBufferView bufferView,
+                                            const VkAllocationCallbacks* pAllocator) {
+    mImpl->vkDestroyBufferView(snapshotTraceBegin, snapshotTraceBytes, pool, device, bufferView,
+                               pAllocator);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCreateImage(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkImageCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkImage* pImage)
-{
-    mImpl->vkCreateImage(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pCreateInfo, pAllocator, pImage);
+void VkDecoderSnapshot::vkCreateImage(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkResult input_result,
+                                      VkDevice device, const VkImageCreateInfo* pCreateInfo,
+                                      const VkAllocationCallbacks* pAllocator, VkImage* pImage) {
+    mImpl->vkCreateImage(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                         pCreateInfo, pAllocator, pImage);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkDestroyImage(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkImage image,
-    const VkAllocationCallbacks* pAllocator)
-{
+void VkDecoderSnapshot::vkDestroyImage(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool, VkDevice device,
+                                       VkImage image, const VkAllocationCallbacks* pAllocator) {
     mImpl->vkDestroyImage(snapshotTraceBegin, snapshotTraceBytes, pool, device, image, pAllocator);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkGetImageSubresourceLayout(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkImage image,
-    const VkImageSubresource* pSubresource,
-    VkSubresourceLayout* pLayout)
-{
-    mImpl->vkGetImageSubresourceLayout(snapshotTraceBegin, snapshotTraceBytes, pool, device, image, pSubresource, pLayout);
+void VkDecoderSnapshot::vkGetImageSubresourceLayout(const uint8_t* snapshotTraceBegin,
+                                                    size_t snapshotTraceBytes,
+                                                    android::base::BumpPool* pool, VkDevice device,
+                                                    VkImage image,
+                                                    const VkImageSubresource* pSubresource,
+                                                    VkSubresourceLayout* pLayout) {
+    mImpl->vkGetImageSubresourceLayout(snapshotTraceBegin, snapshotTraceBytes, pool, device, image,
+                                       pSubresource, pLayout);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCreateImageView(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkImageViewCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkImageView* pView)
-{
-    mImpl->vkCreateImageView(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pCreateInfo, pAllocator, pView);
+void VkDecoderSnapshot::vkCreateImageView(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkResult input_result, VkDevice device,
+                                          const VkImageViewCreateInfo* pCreateInfo,
+                                          const VkAllocationCallbacks* pAllocator,
+                                          VkImageView* pView) {
+    mImpl->vkCreateImageView(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                             pCreateInfo, pAllocator, pView);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkDestroyImageView(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkImageView imageView,
-    const VkAllocationCallbacks* pAllocator)
-{
-    mImpl->vkDestroyImageView(snapshotTraceBegin, snapshotTraceBytes, pool, device, imageView, pAllocator);
+void VkDecoderSnapshot::vkDestroyImageView(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkDevice device, VkImageView imageView,
+                                           const VkAllocationCallbacks* pAllocator) {
+    mImpl->vkDestroyImageView(snapshotTraceBegin, snapshotTraceBytes, pool, device, imageView,
+                              pAllocator);
 }
 #endif
 #ifdef VK_VERSION_1_0
 void VkDecoderSnapshot::vkCreateShaderModule(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkShaderModuleCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkShaderModule* pShaderModule)
-{
-    mImpl->vkCreateShaderModule(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pCreateInfo, pAllocator, pShaderModule);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, const VkShaderModuleCreateInfo* pCreateInfo,
+    const VkAllocationCallbacks* pAllocator, VkShaderModule* pShaderModule) {
+    mImpl->vkCreateShaderModule(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                                pCreateInfo, pAllocator, pShaderModule);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkDestroyShaderModule(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkShaderModule shaderModule,
-    const VkAllocationCallbacks* pAllocator)
-{
-    mImpl->vkDestroyShaderModule(snapshotTraceBegin, snapshotTraceBytes, pool, device, shaderModule, pAllocator);
+void VkDecoderSnapshot::vkDestroyShaderModule(const uint8_t* snapshotTraceBegin,
+                                              size_t snapshotTraceBytes,
+                                              android::base::BumpPool* pool, VkDevice device,
+                                              VkShaderModule shaderModule,
+                                              const VkAllocationCallbacks* pAllocator) {
+    mImpl->vkDestroyShaderModule(snapshotTraceBegin, snapshotTraceBytes, pool, device, shaderModule,
+                                 pAllocator);
 }
 #endif
 #ifdef VK_VERSION_1_0
 void VkDecoderSnapshot::vkCreatePipelineCache(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkPipelineCacheCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkPipelineCache* pPipelineCache)
-{
-    mImpl->vkCreatePipelineCache(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pCreateInfo, pAllocator, pPipelineCache);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, const VkPipelineCacheCreateInfo* pCreateInfo,
+    const VkAllocationCallbacks* pAllocator, VkPipelineCache* pPipelineCache) {
+    mImpl->vkCreatePipelineCache(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                                 pCreateInfo, pAllocator, pPipelineCache);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkDestroyPipelineCache(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkPipelineCache pipelineCache,
-    const VkAllocationCallbacks* pAllocator)
-{
-    mImpl->vkDestroyPipelineCache(snapshotTraceBegin, snapshotTraceBytes, pool, device, pipelineCache, pAllocator);
+void VkDecoderSnapshot::vkDestroyPipelineCache(const uint8_t* snapshotTraceBegin,
+                                               size_t snapshotTraceBytes,
+                                               android::base::BumpPool* pool, VkDevice device,
+                                               VkPipelineCache pipelineCache,
+                                               const VkAllocationCallbacks* pAllocator) {
+    mImpl->vkDestroyPipelineCache(snapshotTraceBegin, snapshotTraceBytes, pool, device,
+                                  pipelineCache, pAllocator);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkGetPipelineCacheData(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkPipelineCache pipelineCache,
-    size_t* pDataSize,
-    void* pData)
-{
-    mImpl->vkGetPipelineCacheData(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pipelineCache, pDataSize, pData);
+void VkDecoderSnapshot::vkGetPipelineCacheData(const uint8_t* snapshotTraceBegin,
+                                               size_t snapshotTraceBytes,
+                                               android::base::BumpPool* pool, VkResult input_result,
+                                               VkDevice device, VkPipelineCache pipelineCache,
+                                               size_t* pDataSize, void* pData) {
+    mImpl->vkGetPipelineCacheData(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                  device, pipelineCache, pDataSize, pData);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkMergePipelineCaches(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkPipelineCache dstCache,
-    uint32_t srcCacheCount,
-    const VkPipelineCache* pSrcCaches)
-{
-    mImpl->vkMergePipelineCaches(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, dstCache, srcCacheCount, pSrcCaches);
+void VkDecoderSnapshot::vkMergePipelineCaches(const uint8_t* snapshotTraceBegin,
+                                              size_t snapshotTraceBytes,
+                                              android::base::BumpPool* pool, VkResult input_result,
+                                              VkDevice device, VkPipelineCache dstCache,
+                                              uint32_t srcCacheCount,
+                                              const VkPipelineCache* pSrcCaches) {
+    mImpl->vkMergePipelineCaches(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                                 dstCache, srcCacheCount, pSrcCaches);
 }
 #endif
 #ifdef VK_VERSION_1_0
 void VkDecoderSnapshot::vkCreateGraphicsPipelines(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkPipelineCache pipelineCache,
-    uint32_t createInfoCount,
-    const VkGraphicsPipelineCreateInfo* pCreateInfos,
-    const VkAllocationCallbacks* pAllocator,
-    VkPipeline* pPipelines)
-{
-    mImpl->vkCreateGraphicsPipelines(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
+    const VkGraphicsPipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator,
+    VkPipeline* pPipelines) {
+    mImpl->vkCreateGraphicsPipelines(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                     device, pipelineCache, createInfoCount, pCreateInfos,
+                                     pAllocator, pPipelines);
 }
 #endif
 #ifdef VK_VERSION_1_0
 void VkDecoderSnapshot::vkCreateComputePipelines(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkPipelineCache pipelineCache,
-    uint32_t createInfoCount,
-    const VkComputePipelineCreateInfo* pCreateInfos,
-    const VkAllocationCallbacks* pAllocator,
-    VkPipeline* pPipelines)
-{
-    mImpl->vkCreateComputePipelines(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
+    const VkComputePipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator,
+    VkPipeline* pPipelines) {
+    mImpl->vkCreateComputePipelines(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                    device, pipelineCache, createInfoCount, pCreateInfos,
+                                    pAllocator, pPipelines);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkDestroyPipeline(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkPipeline pipeline,
-    const VkAllocationCallbacks* pAllocator)
-{
-    mImpl->vkDestroyPipeline(snapshotTraceBegin, snapshotTraceBytes, pool, device, pipeline, pAllocator);
+void VkDecoderSnapshot::vkDestroyPipeline(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkDevice device, VkPipeline pipeline,
+                                          const VkAllocationCallbacks* pAllocator) {
+    mImpl->vkDestroyPipeline(snapshotTraceBegin, snapshotTraceBytes, pool, device, pipeline,
+                             pAllocator);
 }
 #endif
 #ifdef VK_VERSION_1_0
 void VkDecoderSnapshot::vkCreatePipelineLayout(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkPipelineLayoutCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkPipelineLayout* pPipelineLayout)
-{
-    mImpl->vkCreatePipelineLayout(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pCreateInfo, pAllocator, pPipelineLayout);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, const VkPipelineLayoutCreateInfo* pCreateInfo,
+    const VkAllocationCallbacks* pAllocator, VkPipelineLayout* pPipelineLayout) {
+    mImpl->vkCreatePipelineLayout(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                  device, pCreateInfo, pAllocator, pPipelineLayout);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkDestroyPipelineLayout(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkPipelineLayout pipelineLayout,
-    const VkAllocationCallbacks* pAllocator)
-{
-    mImpl->vkDestroyPipelineLayout(snapshotTraceBegin, snapshotTraceBytes, pool, device, pipelineLayout, pAllocator);
+void VkDecoderSnapshot::vkDestroyPipelineLayout(const uint8_t* snapshotTraceBegin,
+                                                size_t snapshotTraceBytes,
+                                                android::base::BumpPool* pool, VkDevice device,
+                                                VkPipelineLayout pipelineLayout,
+                                                const VkAllocationCallbacks* pAllocator) {
+    mImpl->vkDestroyPipelineLayout(snapshotTraceBegin, snapshotTraceBytes, pool, device,
+                                   pipelineLayout, pAllocator);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCreateSampler(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkSamplerCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSampler* pSampler)
-{
-    mImpl->vkCreateSampler(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pCreateInfo, pAllocator, pSampler);
+void VkDecoderSnapshot::vkCreateSampler(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkResult input_result, VkDevice device,
+                                        const VkSamplerCreateInfo* pCreateInfo,
+                                        const VkAllocationCallbacks* pAllocator,
+                                        VkSampler* pSampler) {
+    mImpl->vkCreateSampler(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                           pCreateInfo, pAllocator, pSampler);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkDestroySampler(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkSampler sampler,
-    const VkAllocationCallbacks* pAllocator)
-{
-    mImpl->vkDestroySampler(snapshotTraceBegin, snapshotTraceBytes, pool, device, sampler, pAllocator);
+void VkDecoderSnapshot::vkDestroySampler(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkDevice device, VkSampler sampler,
+                                         const VkAllocationCallbacks* pAllocator) {
+    mImpl->vkDestroySampler(snapshotTraceBegin, snapshotTraceBytes, pool, device, sampler,
+                            pAllocator);
 }
 #endif
 #ifdef VK_VERSION_1_0
 void VkDecoderSnapshot::vkCreateDescriptorSetLayout(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkDescriptorSetLayout* pSetLayout)
-{
-    mImpl->vkCreateDescriptorSetLayout(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pCreateInfo, pAllocator, pSetLayout);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
+    const VkAllocationCallbacks* pAllocator, VkDescriptorSetLayout* pSetLayout) {
+    mImpl->vkCreateDescriptorSetLayout(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                       device, pCreateInfo, pAllocator, pSetLayout);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkDestroyDescriptorSetLayout(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkDescriptorSetLayout descriptorSetLayout,
-    const VkAllocationCallbacks* pAllocator)
-{
-    mImpl->vkDestroyDescriptorSetLayout(snapshotTraceBegin, snapshotTraceBytes, pool, device, descriptorSetLayout, pAllocator);
+void VkDecoderSnapshot::vkDestroyDescriptorSetLayout(const uint8_t* snapshotTraceBegin,
+                                                     size_t snapshotTraceBytes,
+                                                     android::base::BumpPool* pool, VkDevice device,
+                                                     VkDescriptorSetLayout descriptorSetLayout,
+                                                     const VkAllocationCallbacks* pAllocator) {
+    mImpl->vkDestroyDescriptorSetLayout(snapshotTraceBegin, snapshotTraceBytes, pool, device,
+                                        descriptorSetLayout, pAllocator);
 }
 #endif
 #ifdef VK_VERSION_1_0
 void VkDecoderSnapshot::vkCreateDescriptorPool(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkDescriptorPoolCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkDescriptorPool* pDescriptorPool)
-{
-    mImpl->vkCreateDescriptorPool(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pCreateInfo, pAllocator, pDescriptorPool);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, const VkDescriptorPoolCreateInfo* pCreateInfo,
+    const VkAllocationCallbacks* pAllocator, VkDescriptorPool* pDescriptorPool) {
+    mImpl->vkCreateDescriptorPool(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                  device, pCreateInfo, pAllocator, pDescriptorPool);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkDestroyDescriptorPool(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkDescriptorPool descriptorPool,
-    const VkAllocationCallbacks* pAllocator)
-{
-    mImpl->vkDestroyDescriptorPool(snapshotTraceBegin, snapshotTraceBytes, pool, device, descriptorPool, pAllocator);
+void VkDecoderSnapshot::vkDestroyDescriptorPool(const uint8_t* snapshotTraceBegin,
+                                                size_t snapshotTraceBytes,
+                                                android::base::BumpPool* pool, VkDevice device,
+                                                VkDescriptorPool descriptorPool,
+                                                const VkAllocationCallbacks* pAllocator) {
+    mImpl->vkDestroyDescriptorPool(snapshotTraceBegin, snapshotTraceBytes, pool, device,
+                                   descriptorPool, pAllocator);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkResetDescriptorPool(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkDescriptorPool descriptorPool,
-    VkDescriptorPoolResetFlags flags)
-{
-    mImpl->vkResetDescriptorPool(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, descriptorPool, flags);
+void VkDecoderSnapshot::vkResetDescriptorPool(const uint8_t* snapshotTraceBegin,
+                                              size_t snapshotTraceBytes,
+                                              android::base::BumpPool* pool, VkResult input_result,
+                                              VkDevice device, VkDescriptorPool descriptorPool,
+                                              VkDescriptorPoolResetFlags flags) {
+    mImpl->vkResetDescriptorPool(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                                 descriptorPool, flags);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkAllocateDescriptorSets(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkDescriptorSetAllocateInfo* pAllocateInfo,
-    VkDescriptorSet* pDescriptorSets)
-{
-    mImpl->vkAllocateDescriptorSets(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pAllocateInfo, pDescriptorSets);
+void VkDecoderSnapshot::vkAllocateDescriptorSets(const uint8_t* snapshotTraceBegin,
+                                                 size_t snapshotTraceBytes,
+                                                 android::base::BumpPool* pool,
+                                                 VkResult input_result, VkDevice device,
+                                                 const VkDescriptorSetAllocateInfo* pAllocateInfo,
+                                                 VkDescriptorSet* pDescriptorSets) {
+    mImpl->vkAllocateDescriptorSets(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                    device, pAllocateInfo, pDescriptorSets);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkFreeDescriptorSets(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkDescriptorPool descriptorPool,
-    uint32_t descriptorSetCount,
-    const VkDescriptorSet* pDescriptorSets)
-{
-    mImpl->vkFreeDescriptorSets(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, descriptorPool, descriptorSetCount, pDescriptorSets);
+void VkDecoderSnapshot::vkFreeDescriptorSets(const uint8_t* snapshotTraceBegin,
+                                             size_t snapshotTraceBytes,
+                                             android::base::BumpPool* pool, VkResult input_result,
+                                             VkDevice device, VkDescriptorPool descriptorPool,
+                                             uint32_t descriptorSetCount,
+                                             const VkDescriptorSet* pDescriptorSets) {
+    mImpl->vkFreeDescriptorSets(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                                descriptorPool, descriptorSetCount, pDescriptorSets);
 }
 #endif
 #ifdef VK_VERSION_1_0
 void VkDecoderSnapshot::vkUpdateDescriptorSets(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    uint32_t descriptorWriteCount,
-    const VkWriteDescriptorSet* pDescriptorWrites,
-    uint32_t descriptorCopyCount,
-    const VkCopyDescriptorSet* pDescriptorCopies)
-{
-    mImpl->vkUpdateDescriptorSets(snapshotTraceBegin, snapshotTraceBytes, pool, device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkDevice device, uint32_t descriptorWriteCount, const VkWriteDescriptorSet* pDescriptorWrites,
+    uint32_t descriptorCopyCount, const VkCopyDescriptorSet* pDescriptorCopies) {
+    mImpl->vkUpdateDescriptorSets(snapshotTraceBegin, snapshotTraceBytes, pool, device,
+                                  descriptorWriteCount, pDescriptorWrites, descriptorCopyCount,
+                                  pDescriptorCopies);
 }
 #endif
 #ifdef VK_VERSION_1_0
 void VkDecoderSnapshot::vkCreateFramebuffer(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkFramebufferCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkFramebuffer* pFramebuffer)
-{
-    mImpl->vkCreateFramebuffer(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pCreateInfo, pAllocator, pFramebuffer);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, const VkFramebufferCreateInfo* pCreateInfo,
+    const VkAllocationCallbacks* pAllocator, VkFramebuffer* pFramebuffer) {
+    mImpl->vkCreateFramebuffer(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                               pCreateInfo, pAllocator, pFramebuffer);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkDestroyFramebuffer(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkFramebuffer framebuffer,
-    const VkAllocationCallbacks* pAllocator)
-{
-    mImpl->vkDestroyFramebuffer(snapshotTraceBegin, snapshotTraceBytes, pool, device, framebuffer, pAllocator);
+void VkDecoderSnapshot::vkDestroyFramebuffer(const uint8_t* snapshotTraceBegin,
+                                             size_t snapshotTraceBytes,
+                                             android::base::BumpPool* pool, VkDevice device,
+                                             VkFramebuffer framebuffer,
+                                             const VkAllocationCallbacks* pAllocator) {
+    mImpl->vkDestroyFramebuffer(snapshotTraceBegin, snapshotTraceBytes, pool, device, framebuffer,
+                                pAllocator);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCreateRenderPass(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkRenderPassCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkRenderPass* pRenderPass)
-{
-    mImpl->vkCreateRenderPass(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pCreateInfo, pAllocator, pRenderPass);
+void VkDecoderSnapshot::vkCreateRenderPass(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkResult input_result, VkDevice device,
+                                           const VkRenderPassCreateInfo* pCreateInfo,
+                                           const VkAllocationCallbacks* pAllocator,
+                                           VkRenderPass* pRenderPass) {
+    mImpl->vkCreateRenderPass(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                              pCreateInfo, pAllocator, pRenderPass);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkDestroyRenderPass(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkRenderPass renderPass,
-    const VkAllocationCallbacks* pAllocator)
-{
-    mImpl->vkDestroyRenderPass(snapshotTraceBegin, snapshotTraceBytes, pool, device, renderPass, pAllocator);
+void VkDecoderSnapshot::vkDestroyRenderPass(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool, VkDevice device,
+                                            VkRenderPass renderPass,
+                                            const VkAllocationCallbacks* pAllocator) {
+    mImpl->vkDestroyRenderPass(snapshotTraceBegin, snapshotTraceBytes, pool, device, renderPass,
+                               pAllocator);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkGetRenderAreaGranularity(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkRenderPass renderPass,
-    VkExtent2D* pGranularity)
-{
-    mImpl->vkGetRenderAreaGranularity(snapshotTraceBegin, snapshotTraceBytes, pool, device, renderPass, pGranularity);
+void VkDecoderSnapshot::vkGetRenderAreaGranularity(const uint8_t* snapshotTraceBegin,
+                                                   size_t snapshotTraceBytes,
+                                                   android::base::BumpPool* pool, VkDevice device,
+                                                   VkRenderPass renderPass,
+                                                   VkExtent2D* pGranularity) {
+    mImpl->vkGetRenderAreaGranularity(snapshotTraceBegin, snapshotTraceBytes, pool, device,
+                                      renderPass, pGranularity);
 }
 #endif
 #ifdef VK_VERSION_1_0
 void VkDecoderSnapshot::vkCreateCommandPool(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkCommandPoolCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkCommandPool* pCommandPool)
-{
-    mImpl->vkCreateCommandPool(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pCreateInfo, pAllocator, pCommandPool);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, const VkCommandPoolCreateInfo* pCreateInfo,
+    const VkAllocationCallbacks* pAllocator, VkCommandPool* pCommandPool) {
+    mImpl->vkCreateCommandPool(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                               pCreateInfo, pAllocator, pCommandPool);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkDestroyCommandPool(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkCommandPool commandPool,
-    const VkAllocationCallbacks* pAllocator)
-{
-    mImpl->vkDestroyCommandPool(snapshotTraceBegin, snapshotTraceBytes, pool, device, commandPool, pAllocator);
+void VkDecoderSnapshot::vkDestroyCommandPool(const uint8_t* snapshotTraceBegin,
+                                             size_t snapshotTraceBytes,
+                                             android::base::BumpPool* pool, VkDevice device,
+                                             VkCommandPool commandPool,
+                                             const VkAllocationCallbacks* pAllocator) {
+    mImpl->vkDestroyCommandPool(snapshotTraceBegin, snapshotTraceBytes, pool, device, commandPool,
+                                pAllocator);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkResetCommandPool(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkCommandPool commandPool,
-    VkCommandPoolResetFlags flags)
-{
-    mImpl->vkResetCommandPool(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, commandPool, flags);
+void VkDecoderSnapshot::vkResetCommandPool(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkResult input_result, VkDevice device,
+                                           VkCommandPool commandPool,
+                                           VkCommandPoolResetFlags flags) {
+    mImpl->vkResetCommandPool(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                              commandPool, flags);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkAllocateCommandBuffers(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkCommandBufferAllocateInfo* pAllocateInfo,
-    VkCommandBuffer* pCommandBuffers)
-{
-    mImpl->vkAllocateCommandBuffers(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pAllocateInfo, pCommandBuffers);
+void VkDecoderSnapshot::vkAllocateCommandBuffers(const uint8_t* snapshotTraceBegin,
+                                                 size_t snapshotTraceBytes,
+                                                 android::base::BumpPool* pool,
+                                                 VkResult input_result, VkDevice device,
+                                                 const VkCommandBufferAllocateInfo* pAllocateInfo,
+                                                 VkCommandBuffer* pCommandBuffers) {
+    mImpl->vkAllocateCommandBuffers(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                    device, pAllocateInfo, pCommandBuffers);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkFreeCommandBuffers(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkCommandPool commandPool,
-    uint32_t commandBufferCount,
-    const VkCommandBuffer* pCommandBuffers)
-{
-    mImpl->vkFreeCommandBuffers(snapshotTraceBegin, snapshotTraceBytes, pool, device, commandPool, commandBufferCount, pCommandBuffers);
+void VkDecoderSnapshot::vkFreeCommandBuffers(const uint8_t* snapshotTraceBegin,
+                                             size_t snapshotTraceBytes,
+                                             android::base::BumpPool* pool, VkDevice device,
+                                             VkCommandPool commandPool, uint32_t commandBufferCount,
+                                             const VkCommandBuffer* pCommandBuffers) {
+    mImpl->vkFreeCommandBuffers(snapshotTraceBegin, snapshotTraceBytes, pool, device, commandPool,
+                                commandBufferCount, pCommandBuffers);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkBeginCommandBuffer(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkCommandBuffer commandBuffer,
-    const VkCommandBufferBeginInfo* pBeginInfo)
-{
-    mImpl->vkBeginCommandBuffer(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, commandBuffer, pBeginInfo);
+void VkDecoderSnapshot::vkBeginCommandBuffer(const uint8_t* snapshotTraceBegin,
+                                             size_t snapshotTraceBytes,
+                                             android::base::BumpPool* pool, VkResult input_result,
+                                             VkCommandBuffer commandBuffer,
+                                             const VkCommandBufferBeginInfo* pBeginInfo) {
+    mImpl->vkBeginCommandBuffer(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                commandBuffer, pBeginInfo);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkEndCommandBuffer(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkCommandBuffer commandBuffer)
-{
-    mImpl->vkEndCommandBuffer(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, commandBuffer);
+void VkDecoderSnapshot::vkEndCommandBuffer(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkResult input_result, VkCommandBuffer commandBuffer) {
+    mImpl->vkEndCommandBuffer(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                              commandBuffer);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkResetCommandBuffer(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkCommandBuffer commandBuffer,
-    VkCommandBufferResetFlags flags)
-{
-    mImpl->vkResetCommandBuffer(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, commandBuffer, flags);
+void VkDecoderSnapshot::vkResetCommandBuffer(const uint8_t* snapshotTraceBegin,
+                                             size_t snapshotTraceBytes,
+                                             android::base::BumpPool* pool, VkResult input_result,
+                                             VkCommandBuffer commandBuffer,
+                                             VkCommandBufferResetFlags flags) {
+    mImpl->vkResetCommandBuffer(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                commandBuffer, flags);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCmdBindPipeline(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkPipelineBindPoint pipelineBindPoint,
-    VkPipeline pipeline)
-{
-    mImpl->vkCmdBindPipeline(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pipelineBindPoint, pipeline);
+void VkDecoderSnapshot::vkCmdBindPipeline(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkCommandBuffer commandBuffer,
+                                          VkPipelineBindPoint pipelineBindPoint,
+                                          VkPipeline pipeline) {
+    mImpl->vkCmdBindPipeline(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                             pipelineBindPoint, pipeline);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCmdSetViewport(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t firstViewport,
-    uint32_t viewportCount,
-    const VkViewport* pViewports)
-{
-    mImpl->vkCmdSetViewport(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, firstViewport, viewportCount, pViewports);
+void VkDecoderSnapshot::vkCmdSetViewport(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkCommandBuffer commandBuffer, uint32_t firstViewport,
+                                         uint32_t viewportCount, const VkViewport* pViewports) {
+    mImpl->vkCmdSetViewport(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                            firstViewport, viewportCount, pViewports);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCmdSetScissor(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t firstScissor,
-    uint32_t scissorCount,
-    const VkRect2D* pScissors)
-{
-    mImpl->vkCmdSetScissor(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, firstScissor, scissorCount, pScissors);
+void VkDecoderSnapshot::vkCmdSetScissor(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkCommandBuffer commandBuffer, uint32_t firstScissor,
+                                        uint32_t scissorCount, const VkRect2D* pScissors) {
+    mImpl->vkCmdSetScissor(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                           firstScissor, scissorCount, pScissors);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCmdSetLineWidth(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    float lineWidth)
-{
-    mImpl->vkCmdSetLineWidth(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, lineWidth);
+void VkDecoderSnapshot::vkCmdSetLineWidth(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkCommandBuffer commandBuffer, float lineWidth) {
+    mImpl->vkCmdSetLineWidth(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                             lineWidth);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCmdSetDepthBias(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    float depthBiasConstantFactor,
-    float depthBiasClamp,
-    float depthBiasSlopeFactor)
-{
-    mImpl->vkCmdSetDepthBias(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
+void VkDecoderSnapshot::vkCmdSetDepthBias(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkCommandBuffer commandBuffer,
+                                          float depthBiasConstantFactor, float depthBiasClamp,
+                                          float depthBiasSlopeFactor) {
+    mImpl->vkCmdSetDepthBias(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                             depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCmdSetBlendConstants(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const float blendConstants[4])
-{
-    mImpl->vkCmdSetBlendConstants(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, blendConstants);
+void VkDecoderSnapshot::vkCmdSetBlendConstants(const uint8_t* snapshotTraceBegin,
+                                               size_t snapshotTraceBytes,
+                                               android::base::BumpPool* pool,
+                                               VkCommandBuffer commandBuffer,
+                                               const float blendConstants[4]) {
+    mImpl->vkCmdSetBlendConstants(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                  blendConstants);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCmdSetDepthBounds(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    float minDepthBounds,
-    float maxDepthBounds)
-{
-    mImpl->vkCmdSetDepthBounds(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, minDepthBounds, maxDepthBounds);
+void VkDecoderSnapshot::vkCmdSetDepthBounds(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool,
+                                            VkCommandBuffer commandBuffer, float minDepthBounds,
+                                            float maxDepthBounds) {
+    mImpl->vkCmdSetDepthBounds(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                               minDepthBounds, maxDepthBounds);
 }
 #endif
 #ifdef VK_VERSION_1_0
 void VkDecoderSnapshot::vkCmdSetStencilCompareMask(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkStencilFaceFlags faceMask,
-    uint32_t compareMask)
-{
-    mImpl->vkCmdSetStencilCompareMask(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, faceMask, compareMask);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t compareMask) {
+    mImpl->vkCmdSetStencilCompareMask(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                      faceMask, compareMask);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCmdSetStencilWriteMask(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkStencilFaceFlags faceMask,
-    uint32_t writeMask)
-{
-    mImpl->vkCmdSetStencilWriteMask(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, faceMask, writeMask);
+void VkDecoderSnapshot::vkCmdSetStencilWriteMask(const uint8_t* snapshotTraceBegin,
+                                                 size_t snapshotTraceBytes,
+                                                 android::base::BumpPool* pool,
+                                                 VkCommandBuffer commandBuffer,
+                                                 VkStencilFaceFlags faceMask, uint32_t writeMask) {
+    mImpl->vkCmdSetStencilWriteMask(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                    faceMask, writeMask);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCmdSetStencilReference(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkStencilFaceFlags faceMask,
-    uint32_t reference)
-{
-    mImpl->vkCmdSetStencilReference(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, faceMask, reference);
+void VkDecoderSnapshot::vkCmdSetStencilReference(const uint8_t* snapshotTraceBegin,
+                                                 size_t snapshotTraceBytes,
+                                                 android::base::BumpPool* pool,
+                                                 VkCommandBuffer commandBuffer,
+                                                 VkStencilFaceFlags faceMask, uint32_t reference) {
+    mImpl->vkCmdSetStencilReference(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                    faceMask, reference);
 }
 #endif
 #ifdef VK_VERSION_1_0
 void VkDecoderSnapshot::vkCmdBindDescriptorSets(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkPipelineBindPoint pipelineBindPoint,
-    VkPipelineLayout layout,
-    uint32_t firstSet,
-    uint32_t descriptorSetCount,
-    const VkDescriptorSet* pDescriptorSets,
-    uint32_t dynamicOffsetCount,
-    const uint32_t* pDynamicOffsets)
-{
-    mImpl->vkCmdBindDescriptorSets(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
+    uint32_t firstSet, uint32_t descriptorSetCount, const VkDescriptorSet* pDescriptorSets,
+    uint32_t dynamicOffsetCount, const uint32_t* pDynamicOffsets) {
+    mImpl->vkCmdBindDescriptorSets(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                   pipelineBindPoint, layout, firstSet, descriptorSetCount,
+                                   pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCmdBindIndexBuffer(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBuffer buffer,
-    VkDeviceSize offset,
-    VkIndexType indexType)
-{
-    mImpl->vkCmdBindIndexBuffer(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, buffer, offset, indexType);
+void VkDecoderSnapshot::vkCmdBindIndexBuffer(const uint8_t* snapshotTraceBegin,
+                                             size_t snapshotTraceBytes,
+                                             android::base::BumpPool* pool,
+                                             VkCommandBuffer commandBuffer, VkBuffer buffer,
+                                             VkDeviceSize offset, VkIndexType indexType) {
+    mImpl->vkCmdBindIndexBuffer(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, buffer,
+                                offset, indexType);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCmdBindVertexBuffers(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t firstBinding,
-    uint32_t bindingCount,
-    const VkBuffer* pBuffers,
-    const VkDeviceSize* pOffsets)
-{
-    mImpl->vkCmdBindVertexBuffers(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
+void VkDecoderSnapshot::vkCmdBindVertexBuffers(const uint8_t* snapshotTraceBegin,
+                                               size_t snapshotTraceBytes,
+                                               android::base::BumpPool* pool,
+                                               VkCommandBuffer commandBuffer, uint32_t firstBinding,
+                                               uint32_t bindingCount, const VkBuffer* pBuffers,
+                                               const VkDeviceSize* pOffsets) {
+    mImpl->vkCmdBindVertexBuffers(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                  firstBinding, bindingCount, pBuffers, pOffsets);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCmdDraw(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t vertexCount,
-    uint32_t instanceCount,
-    uint32_t firstVertex,
-    uint32_t firstInstance)
-{
-    mImpl->vkCmdDraw(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
+void VkDecoderSnapshot::vkCmdDraw(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                  uint32_t vertexCount, uint32_t instanceCount,
+                                  uint32_t firstVertex, uint32_t firstInstance) {
+    mImpl->vkCmdDraw(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, vertexCount,
+                     instanceCount, firstVertex, firstInstance);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCmdDrawIndexed(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t indexCount,
-    uint32_t instanceCount,
-    uint32_t firstIndex,
-    int32_t vertexOffset,
-    uint32_t firstInstance)
-{
-    mImpl->vkCmdDrawIndexed(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
+void VkDecoderSnapshot::vkCmdDrawIndexed(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkCommandBuffer commandBuffer, uint32_t indexCount,
+                                         uint32_t instanceCount, uint32_t firstIndex,
+                                         int32_t vertexOffset, uint32_t firstInstance) {
+    mImpl->vkCmdDrawIndexed(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, indexCount,
+                            instanceCount, firstIndex, vertexOffset, firstInstance);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCmdDrawIndirect(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBuffer buffer,
-    VkDeviceSize offset,
-    uint32_t drawCount,
-    uint32_t stride)
-{
-    mImpl->vkCmdDrawIndirect(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, buffer, offset, drawCount, stride);
+void VkDecoderSnapshot::vkCmdDrawIndirect(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkCommandBuffer commandBuffer, VkBuffer buffer,
+                                          VkDeviceSize offset, uint32_t drawCount,
+                                          uint32_t stride) {
+    mImpl->vkCmdDrawIndirect(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, buffer,
+                             offset, drawCount, stride);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCmdDrawIndexedIndirect(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBuffer buffer,
-    VkDeviceSize offset,
-    uint32_t drawCount,
-    uint32_t stride)
-{
-    mImpl->vkCmdDrawIndexedIndirect(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, buffer, offset, drawCount, stride);
+void VkDecoderSnapshot::vkCmdDrawIndexedIndirect(const uint8_t* snapshotTraceBegin,
+                                                 size_t snapshotTraceBytes,
+                                                 android::base::BumpPool* pool,
+                                                 VkCommandBuffer commandBuffer, VkBuffer buffer,
+                                                 VkDeviceSize offset, uint32_t drawCount,
+                                                 uint32_t stride) {
+    mImpl->vkCmdDrawIndexedIndirect(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                    buffer, offset, drawCount, stride);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCmdDispatch(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t groupCountX,
-    uint32_t groupCountY,
-    uint32_t groupCountZ)
-{
-    mImpl->vkCmdDispatch(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, groupCountX, groupCountY, groupCountZ);
+void VkDecoderSnapshot::vkCmdDispatch(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                      uint32_t groupCountX, uint32_t groupCountY,
+                                      uint32_t groupCountZ) {
+    mImpl->vkCmdDispatch(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, groupCountX,
+                         groupCountY, groupCountZ);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCmdDispatchIndirect(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBuffer buffer,
-    VkDeviceSize offset)
-{
-    mImpl->vkCmdDispatchIndirect(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, buffer, offset);
+void VkDecoderSnapshot::vkCmdDispatchIndirect(const uint8_t* snapshotTraceBegin,
+                                              size_t snapshotTraceBytes,
+                                              android::base::BumpPool* pool,
+                                              VkCommandBuffer commandBuffer, VkBuffer buffer,
+                                              VkDeviceSize offset) {
+    mImpl->vkCmdDispatchIndirect(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                 buffer, offset);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCmdCopyBuffer(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBuffer srcBuffer,
-    VkBuffer dstBuffer,
-    uint32_t regionCount,
-    const VkBufferCopy* pRegions)
-{
-    mImpl->vkCmdCopyBuffer(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
+void VkDecoderSnapshot::vkCmdCopyBuffer(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkCommandBuffer commandBuffer, VkBuffer srcBuffer,
+                                        VkBuffer dstBuffer, uint32_t regionCount,
+                                        const VkBufferCopy* pRegions) {
+    mImpl->vkCmdCopyBuffer(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, srcBuffer,
+                           dstBuffer, regionCount, pRegions);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCmdCopyImage(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkImage srcImage,
-    VkImageLayout srcImageLayout,
-    VkImage dstImage,
-    VkImageLayout dstImageLayout,
-    uint32_t regionCount,
-    const VkImageCopy* pRegions)
-{
-    mImpl->vkCmdCopyImage(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
+void VkDecoderSnapshot::vkCmdCopyImage(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                       VkImage srcImage, VkImageLayout srcImageLayout,
+                                       VkImage dstImage, VkImageLayout dstImageLayout,
+                                       uint32_t regionCount, const VkImageCopy* pRegions) {
+    mImpl->vkCmdCopyImage(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, srcImage,
+                          srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCmdBlitImage(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkImage srcImage,
-    VkImageLayout srcImageLayout,
-    VkImage dstImage,
-    VkImageLayout dstImageLayout,
-    uint32_t regionCount,
-    const VkImageBlit* pRegions,
-    VkFilter filter)
-{
-    mImpl->vkCmdBlitImage(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
+void VkDecoderSnapshot::vkCmdBlitImage(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                       VkImage srcImage, VkImageLayout srcImageLayout,
+                                       VkImage dstImage, VkImageLayout dstImageLayout,
+                                       uint32_t regionCount, const VkImageBlit* pRegions,
+                                       VkFilter filter) {
+    mImpl->vkCmdBlitImage(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, srcImage,
+                          srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
 }
 #endif
 #ifdef VK_VERSION_1_0
 void VkDecoderSnapshot::vkCmdCopyBufferToImage(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBuffer srcBuffer,
-    VkImage dstImage,
-    VkImageLayout dstImageLayout,
-    uint32_t regionCount,
-    const VkBufferImageCopy* pRegions)
-{
-    mImpl->vkCmdCopyBufferToImage(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
+    VkImageLayout dstImageLayout, uint32_t regionCount, const VkBufferImageCopy* pRegions) {
+    mImpl->vkCmdCopyBufferToImage(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                  srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
 }
 #endif
 #ifdef VK_VERSION_1_0
 void VkDecoderSnapshot::vkCmdCopyImageToBuffer(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkImage srcImage,
-    VkImageLayout srcImageLayout,
-    VkBuffer dstBuffer,
-    uint32_t regionCount,
-    const VkBufferImageCopy* pRegions)
-{
-    mImpl->vkCmdCopyImageToBuffer(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
+    VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy* pRegions) {
+    mImpl->vkCmdCopyImageToBuffer(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                  srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCmdUpdateBuffer(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBuffer dstBuffer,
-    VkDeviceSize dstOffset,
-    VkDeviceSize dataSize,
-    const void* pData)
-{
-    mImpl->vkCmdUpdateBuffer(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, dstBuffer, dstOffset, dataSize, pData);
+void VkDecoderSnapshot::vkCmdUpdateBuffer(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkCommandBuffer commandBuffer, VkBuffer dstBuffer,
+                                          VkDeviceSize dstOffset, VkDeviceSize dataSize,
+                                          const void* pData) {
+    mImpl->vkCmdUpdateBuffer(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, dstBuffer,
+                             dstOffset, dataSize, pData);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCmdFillBuffer(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBuffer dstBuffer,
-    VkDeviceSize dstOffset,
-    VkDeviceSize size,
-    uint32_t data)
-{
-    mImpl->vkCmdFillBuffer(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, dstBuffer, dstOffset, size, data);
+void VkDecoderSnapshot::vkCmdFillBuffer(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkCommandBuffer commandBuffer, VkBuffer dstBuffer,
+                                        VkDeviceSize dstOffset, VkDeviceSize size, uint32_t data) {
+    mImpl->vkCmdFillBuffer(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, dstBuffer,
+                           dstOffset, size, data);
 }
 #endif
 #ifdef VK_VERSION_1_0
 void VkDecoderSnapshot::vkCmdClearColorImage(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkImage image,
-    VkImageLayout imageLayout,
-    const VkClearColorValue* pColor,
-    uint32_t rangeCount,
-    const VkImageSubresourceRange* pRanges)
-{
-    mImpl->vkCmdClearColorImage(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
+    const VkClearColorValue* pColor, uint32_t rangeCount, const VkImageSubresourceRange* pRanges) {
+    mImpl->vkCmdClearColorImage(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, image,
+                                imageLayout, pColor, rangeCount, pRanges);
 }
 #endif
 #ifdef VK_VERSION_1_0
 void VkDecoderSnapshot::vkCmdClearDepthStencilImage(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkImage image,
-    VkImageLayout imageLayout,
-    const VkClearDepthStencilValue* pDepthStencil,
-    uint32_t rangeCount,
-    const VkImageSubresourceRange* pRanges)
-{
-    mImpl->vkCmdClearDepthStencilImage(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
+    const VkClearDepthStencilValue* pDepthStencil, uint32_t rangeCount,
+    const VkImageSubresourceRange* pRanges) {
+    mImpl->vkCmdClearDepthStencilImage(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                       image, imageLayout, pDepthStencil, rangeCount, pRanges);
 }
 #endif
 #ifdef VK_VERSION_1_0
 void VkDecoderSnapshot::vkCmdClearAttachments(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t attachmentCount,
-    const VkClearAttachment* pAttachments,
-    uint32_t rectCount,
-    const VkClearRect* pRects)
-{
-    mImpl->vkCmdClearAttachments(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, uint32_t attachmentCount, const VkClearAttachment* pAttachments,
+    uint32_t rectCount, const VkClearRect* pRects) {
+    mImpl->vkCmdClearAttachments(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                 attachmentCount, pAttachments, rectCount, pRects);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCmdResolveImage(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkImage srcImage,
-    VkImageLayout srcImageLayout,
-    VkImage dstImage,
-    VkImageLayout dstImageLayout,
-    uint32_t regionCount,
-    const VkImageResolve* pRegions)
-{
-    mImpl->vkCmdResolveImage(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
+void VkDecoderSnapshot::vkCmdResolveImage(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkCommandBuffer commandBuffer, VkImage srcImage,
+                                          VkImageLayout srcImageLayout, VkImage dstImage,
+                                          VkImageLayout dstImageLayout, uint32_t regionCount,
+                                          const VkImageResolve* pRegions) {
+    mImpl->vkCmdResolveImage(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, srcImage,
+                             srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCmdSetEvent(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkEvent event,
-    VkPipelineStageFlags stageMask)
-{
-    mImpl->vkCmdSetEvent(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, event, stageMask);
+void VkDecoderSnapshot::vkCmdSetEvent(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                      VkEvent event, VkPipelineStageFlags stageMask) {
+    mImpl->vkCmdSetEvent(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, event,
+                         stageMask);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCmdResetEvent(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkEvent event,
-    VkPipelineStageFlags stageMask)
-{
-    mImpl->vkCmdResetEvent(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, event, stageMask);
+void VkDecoderSnapshot::vkCmdResetEvent(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkCommandBuffer commandBuffer, VkEvent event,
+                                        VkPipelineStageFlags stageMask) {
+    mImpl->vkCmdResetEvent(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, event,
+                           stageMask);
 }
 #endif
 #ifdef VK_VERSION_1_0
 void VkDecoderSnapshot::vkCmdWaitEvents(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t eventCount,
-    const VkEvent* pEvents,
-    VkPipelineStageFlags srcStageMask,
-    VkPipelineStageFlags dstStageMask,
-    uint32_t memoryBarrierCount,
-    const VkMemoryBarrier* pMemoryBarriers,
-    uint32_t bufferMemoryBarrierCount,
-    const VkBufferMemoryBarrier* pBufferMemoryBarriers,
-    uint32_t imageMemoryBarrierCount,
-    const VkImageMemoryBarrier* pImageMemoryBarriers)
-{
-    mImpl->vkCmdWaitEvents(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent* pEvents,
+    VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
+    uint32_t memoryBarrierCount, const VkMemoryBarrier* pMemoryBarriers,
+    uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier* pBufferMemoryBarriers,
+    uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier* pImageMemoryBarriers) {
+    mImpl->vkCmdWaitEvents(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, eventCount,
+                           pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
+                           bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount,
+                           pImageMemoryBarriers);
 }
 #endif
 #ifdef VK_VERSION_1_0
 void VkDecoderSnapshot::vkCmdPipelineBarrier(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkPipelineStageFlags srcStageMask,
-    VkPipelineStageFlags dstStageMask,
-    VkDependencyFlags dependencyFlags,
-    uint32_t memoryBarrierCount,
-    const VkMemoryBarrier* pMemoryBarriers,
-    uint32_t bufferMemoryBarrierCount,
-    const VkBufferMemoryBarrier* pBufferMemoryBarriers,
-    uint32_t imageMemoryBarrierCount,
-    const VkImageMemoryBarrier* pImageMemoryBarriers)
-{
-    mImpl->vkCmdPipelineBarrier(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
+    VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
+    uint32_t memoryBarrierCount, const VkMemoryBarrier* pMemoryBarriers,
+    uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier* pBufferMemoryBarriers,
+    uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier* pImageMemoryBarriers) {
+    mImpl->vkCmdPipelineBarrier(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount,
+                                pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
+                                imageMemoryBarrierCount, pImageMemoryBarriers);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCmdBeginQuery(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkQueryPool queryPool,
-    uint32_t query,
-    VkQueryControlFlags flags)
-{
-    mImpl->vkCmdBeginQuery(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, queryPool, query, flags);
+void VkDecoderSnapshot::vkCmdBeginQuery(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkCommandBuffer commandBuffer, VkQueryPool queryPool,
+                                        uint32_t query, VkQueryControlFlags flags) {
+    mImpl->vkCmdBeginQuery(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, queryPool,
+                           query, flags);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCmdEndQuery(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkQueryPool queryPool,
-    uint32_t query)
-{
-    mImpl->vkCmdEndQuery(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, queryPool, query);
+void VkDecoderSnapshot::vkCmdEndQuery(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                      VkQueryPool queryPool, uint32_t query) {
+    mImpl->vkCmdEndQuery(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, queryPool,
+                         query);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCmdResetQueryPool(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkQueryPool queryPool,
-    uint32_t firstQuery,
-    uint32_t queryCount)
-{
-    mImpl->vkCmdResetQueryPool(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, queryPool, firstQuery, queryCount);
+void VkDecoderSnapshot::vkCmdResetQueryPool(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool,
+                                            VkCommandBuffer commandBuffer, VkQueryPool queryPool,
+                                            uint32_t firstQuery, uint32_t queryCount) {
+    mImpl->vkCmdResetQueryPool(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                               queryPool, firstQuery, queryCount);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCmdWriteTimestamp(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkPipelineStageFlagBits pipelineStage,
-    VkQueryPool queryPool,
-    uint32_t query)
-{
-    mImpl->vkCmdWriteTimestamp(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pipelineStage, queryPool, query);
+void VkDecoderSnapshot::vkCmdWriteTimestamp(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool,
+                                            VkCommandBuffer commandBuffer,
+                                            VkPipelineStageFlagBits pipelineStage,
+                                            VkQueryPool queryPool, uint32_t query) {
+    mImpl->vkCmdWriteTimestamp(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                               pipelineStage, queryPool, query);
 }
 #endif
 #ifdef VK_VERSION_1_0
 void VkDecoderSnapshot::vkCmdCopyQueryPoolResults(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkQueryPool queryPool,
-    uint32_t firstQuery,
-    uint32_t queryCount,
-    VkBuffer dstBuffer,
-    VkDeviceSize dstOffset,
-    VkDeviceSize stride,
-    VkQueryResultFlags flags)
-{
-    mImpl->vkCmdCopyQueryPoolResults(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
+    VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags) {
+    mImpl->vkCmdCopyQueryPoolResults(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                     queryPool, firstQuery, queryCount, dstBuffer, dstOffset,
+                                     stride, flags);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCmdPushConstants(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkPipelineLayout layout,
-    VkShaderStageFlags stageFlags,
-    uint32_t offset,
-    uint32_t size,
-    const void* pValues)
-{
-    mImpl->vkCmdPushConstants(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, layout, stageFlags, offset, size, pValues);
+void VkDecoderSnapshot::vkCmdPushConstants(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkCommandBuffer commandBuffer, VkPipelineLayout layout,
+                                           VkShaderStageFlags stageFlags, uint32_t offset,
+                                           uint32_t size, const void* pValues) {
+    mImpl->vkCmdPushConstants(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, layout,
+                              stageFlags, offset, size, pValues);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCmdBeginRenderPass(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkRenderPassBeginInfo* pRenderPassBegin,
-    VkSubpassContents contents)
-{
-    mImpl->vkCmdBeginRenderPass(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pRenderPassBegin, contents);
+void VkDecoderSnapshot::vkCmdBeginRenderPass(const uint8_t* snapshotTraceBegin,
+                                             size_t snapshotTraceBytes,
+                                             android::base::BumpPool* pool,
+                                             VkCommandBuffer commandBuffer,
+                                             const VkRenderPassBeginInfo* pRenderPassBegin,
+                                             VkSubpassContents contents) {
+    mImpl->vkCmdBeginRenderPass(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                pRenderPassBegin, contents);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCmdNextSubpass(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkSubpassContents contents)
-{
+void VkDecoderSnapshot::vkCmdNextSubpass(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkCommandBuffer commandBuffer,
+                                         VkSubpassContents contents) {
     mImpl->vkCmdNextSubpass(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, contents);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCmdEndRenderPass(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer)
-{
+void VkDecoderSnapshot::vkCmdEndRenderPass(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkCommandBuffer commandBuffer) {
     mImpl->vkCmdEndRenderPass(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer);
 }
 #endif
 #ifdef VK_VERSION_1_0
-void VkDecoderSnapshot::vkCmdExecuteCommands(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t commandBufferCount,
-    const VkCommandBuffer* pCommandBuffers)
-{
-    mImpl->vkCmdExecuteCommands(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, commandBufferCount, pCommandBuffers);
+void VkDecoderSnapshot::vkCmdExecuteCommands(const uint8_t* snapshotTraceBegin,
+                                             size_t snapshotTraceBytes,
+                                             android::base::BumpPool* pool,
+                                             VkCommandBuffer commandBuffer,
+                                             uint32_t commandBufferCount,
+                                             const VkCommandBuffer* pCommandBuffers) {
+    mImpl->vkCmdExecuteCommands(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                commandBufferCount, pCommandBuffers);
 }
 #endif
 #ifdef VK_VERSION_1_1
-void VkDecoderSnapshot::vkEnumerateInstanceVersion(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    uint32_t* pApiVersion)
-{
-    mImpl->vkEnumerateInstanceVersion(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, pApiVersion);
+void VkDecoderSnapshot::vkEnumerateInstanceVersion(const uint8_t* snapshotTraceBegin,
+                                                   size_t snapshotTraceBytes,
+                                                   android::base::BumpPool* pool,
+                                                   VkResult input_result, uint32_t* pApiVersion) {
+    mImpl->vkEnumerateInstanceVersion(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                      pApiVersion);
 }
 #endif
 #ifdef VK_VERSION_1_1
-void VkDecoderSnapshot::vkBindBufferMemory2(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    uint32_t bindInfoCount,
-    const VkBindBufferMemoryInfo* pBindInfos)
-{
-    mImpl->vkBindBufferMemory2(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, bindInfoCount, pBindInfos);
+void VkDecoderSnapshot::vkBindBufferMemory2(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool, VkResult input_result,
+                                            VkDevice device, uint32_t bindInfoCount,
+                                            const VkBindBufferMemoryInfo* pBindInfos) {
+    mImpl->vkBindBufferMemory2(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                               bindInfoCount, pBindInfos);
 }
 #endif
 #ifdef VK_VERSION_1_1
-void VkDecoderSnapshot::vkBindImageMemory2(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    uint32_t bindInfoCount,
-    const VkBindImageMemoryInfo* pBindInfos)
-{
-    mImpl->vkBindImageMemory2(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, bindInfoCount, pBindInfos);
+void VkDecoderSnapshot::vkBindImageMemory2(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkResult input_result, VkDevice device,
+                                           uint32_t bindInfoCount,
+                                           const VkBindImageMemoryInfo* pBindInfos) {
+    mImpl->vkBindImageMemory2(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                              bindInfoCount, pBindInfos);
 }
 #endif
 #ifdef VK_VERSION_1_1
 void VkDecoderSnapshot::vkGetDeviceGroupPeerMemoryFeatures(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    uint32_t heapIndex,
-    uint32_t localDeviceIndex,
-    uint32_t remoteDeviceIndex,
-    VkPeerMemoryFeatureFlags* pPeerMemoryFeatures)
-{
-    mImpl->vkGetDeviceGroupPeerMemoryFeatures(snapshotTraceBegin, snapshotTraceBytes, pool, device, heapIndex, localDeviceIndex, remoteDeviceIndex, pPeerMemoryFeatures);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkDevice device, uint32_t heapIndex, uint32_t localDeviceIndex, uint32_t remoteDeviceIndex,
+    VkPeerMemoryFeatureFlags* pPeerMemoryFeatures) {
+    mImpl->vkGetDeviceGroupPeerMemoryFeatures(snapshotTraceBegin, snapshotTraceBytes, pool, device,
+                                              heapIndex, localDeviceIndex, remoteDeviceIndex,
+                                              pPeerMemoryFeatures);
 }
 #endif
 #ifdef VK_VERSION_1_1
-void VkDecoderSnapshot::vkCmdSetDeviceMask(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t deviceMask)
-{
-    mImpl->vkCmdSetDeviceMask(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, deviceMask);
+void VkDecoderSnapshot::vkCmdSetDeviceMask(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkCommandBuffer commandBuffer, uint32_t deviceMask) {
+    mImpl->vkCmdSetDeviceMask(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                              deviceMask);
 }
 #endif
 #ifdef VK_VERSION_1_1
-void VkDecoderSnapshot::vkCmdDispatchBase(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t baseGroupX,
-    uint32_t baseGroupY,
-    uint32_t baseGroupZ,
-    uint32_t groupCountX,
-    uint32_t groupCountY,
-    uint32_t groupCountZ)
-{
-    mImpl->vkCmdDispatchBase(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ);
+void VkDecoderSnapshot::vkCmdDispatchBase(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkCommandBuffer commandBuffer, uint32_t baseGroupX,
+                                          uint32_t baseGroupY, uint32_t baseGroupZ,
+                                          uint32_t groupCountX, uint32_t groupCountY,
+                                          uint32_t groupCountZ) {
+    mImpl->vkCmdDispatchBase(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                             baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY,
+                             groupCountZ);
 }
 #endif
 #ifdef VK_VERSION_1_1
 void VkDecoderSnapshot::vkEnumeratePhysicalDeviceGroups(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    uint32_t* pPhysicalDeviceGroupCount,
-    VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProperties)
-{
-    mImpl->vkEnumeratePhysicalDeviceGroups(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, instance, pPhysicalDeviceGroupCount, pPhysicalDeviceGroupProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkInstance instance, uint32_t* pPhysicalDeviceGroupCount,
+    VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProperties) {
+    mImpl->vkEnumeratePhysicalDeviceGroups(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                           input_result, instance, pPhysicalDeviceGroupCount,
+                                           pPhysicalDeviceGroupProperties);
 }
 #endif
 #ifdef VK_VERSION_1_1
-void VkDecoderSnapshot::vkGetImageMemoryRequirements2(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    const VkImageMemoryRequirementsInfo2* pInfo,
-    VkMemoryRequirements2* pMemoryRequirements)
-{
-    mImpl->vkGetImageMemoryRequirements2(snapshotTraceBegin, snapshotTraceBytes, pool, device, pInfo, pMemoryRequirements);
+void VkDecoderSnapshot::vkGetImageMemoryRequirements2(const uint8_t* snapshotTraceBegin,
+                                                      size_t snapshotTraceBytes,
+                                                      android::base::BumpPool* pool,
+                                                      VkDevice device,
+                                                      const VkImageMemoryRequirementsInfo2* pInfo,
+                                                      VkMemoryRequirements2* pMemoryRequirements) {
+    mImpl->vkGetImageMemoryRequirements2(snapshotTraceBegin, snapshotTraceBytes, pool, device,
+                                         pInfo, pMemoryRequirements);
 }
 #endif
 #ifdef VK_VERSION_1_1
-void VkDecoderSnapshot::vkGetBufferMemoryRequirements2(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    const VkBufferMemoryRequirementsInfo2* pInfo,
-    VkMemoryRequirements2* pMemoryRequirements)
-{
-    mImpl->vkGetBufferMemoryRequirements2(snapshotTraceBegin, snapshotTraceBytes, pool, device, pInfo, pMemoryRequirements);
+void VkDecoderSnapshot::vkGetBufferMemoryRequirements2(const uint8_t* snapshotTraceBegin,
+                                                       size_t snapshotTraceBytes,
+                                                       android::base::BumpPool* pool,
+                                                       VkDevice device,
+                                                       const VkBufferMemoryRequirementsInfo2* pInfo,
+                                                       VkMemoryRequirements2* pMemoryRequirements) {
+    mImpl->vkGetBufferMemoryRequirements2(snapshotTraceBegin, snapshotTraceBytes, pool, device,
+                                          pInfo, pMemoryRequirements);
 }
 #endif
 #ifdef VK_VERSION_1_1
 void VkDecoderSnapshot::vkGetImageSparseMemoryRequirements2(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    const VkImageSparseMemoryRequirementsInfo2* pInfo,
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkDevice device, const VkImageSparseMemoryRequirementsInfo2* pInfo,
     uint32_t* pSparseMemoryRequirementCount,
-    VkSparseImageMemoryRequirements2* pSparseMemoryRequirements)
-{
-    mImpl->vkGetImageSparseMemoryRequirements2(snapshotTraceBegin, snapshotTraceBytes, pool, device, pInfo, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
+    VkSparseImageMemoryRequirements2* pSparseMemoryRequirements) {
+    mImpl->vkGetImageSparseMemoryRequirements2(snapshotTraceBegin, snapshotTraceBytes, pool, device,
+                                               pInfo, pSparseMemoryRequirementCount,
+                                               pSparseMemoryRequirements);
 }
 #endif
 #ifdef VK_VERSION_1_1
-void VkDecoderSnapshot::vkGetPhysicalDeviceFeatures2(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    VkPhysicalDeviceFeatures2* pFeatures)
-{
-    mImpl->vkGetPhysicalDeviceFeatures2(snapshotTraceBegin, snapshotTraceBytes, pool, physicalDevice, pFeatures);
+void VkDecoderSnapshot::vkGetPhysicalDeviceFeatures2(const uint8_t* snapshotTraceBegin,
+                                                     size_t snapshotTraceBytes,
+                                                     android::base::BumpPool* pool,
+                                                     VkPhysicalDevice physicalDevice,
+                                                     VkPhysicalDeviceFeatures2* pFeatures) {
+    mImpl->vkGetPhysicalDeviceFeatures2(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                        physicalDevice, pFeatures);
 }
 #endif
 #ifdef VK_VERSION_1_1
-void VkDecoderSnapshot::vkGetPhysicalDeviceProperties2(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    VkPhysicalDeviceProperties2* pProperties)
-{
-    mImpl->vkGetPhysicalDeviceProperties2(snapshotTraceBegin, snapshotTraceBytes, pool, physicalDevice, pProperties);
+void VkDecoderSnapshot::vkGetPhysicalDeviceProperties2(const uint8_t* snapshotTraceBegin,
+                                                       size_t snapshotTraceBytes,
+                                                       android::base::BumpPool* pool,
+                                                       VkPhysicalDevice physicalDevice,
+                                                       VkPhysicalDeviceProperties2* pProperties) {
+    mImpl->vkGetPhysicalDeviceProperties2(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                          physicalDevice, pProperties);
 }
 #endif
 #ifdef VK_VERSION_1_1
 void VkDecoderSnapshot::vkGetPhysicalDeviceFormatProperties2(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    VkFormat format,
-    VkFormatProperties2* pFormatProperties)
-{
-    mImpl->vkGetPhysicalDeviceFormatProperties2(snapshotTraceBegin, snapshotTraceBytes, pool, physicalDevice, format, pFormatProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties2* pFormatProperties) {
+    mImpl->vkGetPhysicalDeviceFormatProperties2(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                physicalDevice, format, pFormatProperties);
 }
 #endif
 #ifdef VK_VERSION_1_1
 void VkDecoderSnapshot::vkGetPhysicalDeviceImageFormatProperties2(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkPhysicalDevice physicalDevice,
     const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo,
-    VkImageFormatProperties2* pImageFormatProperties)
-{
-    mImpl->vkGetPhysicalDeviceImageFormatProperties2(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, pImageFormatInfo, pImageFormatProperties);
+    VkImageFormatProperties2* pImageFormatProperties) {
+    mImpl->vkGetPhysicalDeviceImageFormatProperties2(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                     input_result, physicalDevice, pImageFormatInfo,
+                                                     pImageFormatProperties);
 }
 #endif
 #ifdef VK_VERSION_1_1
 void VkDecoderSnapshot::vkGetPhysicalDeviceQueueFamilyProperties2(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    uint32_t* pQueueFamilyPropertyCount,
-    VkQueueFamilyProperties2* pQueueFamilyProperties)
-{
-    mImpl->vkGetPhysicalDeviceQueueFamilyProperties2(snapshotTraceBegin, snapshotTraceBytes, pool, physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkPhysicalDevice physicalDevice, uint32_t* pQueueFamilyPropertyCount,
+    VkQueueFamilyProperties2* pQueueFamilyProperties) {
+    mImpl->vkGetPhysicalDeviceQueueFamilyProperties2(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                     physicalDevice, pQueueFamilyPropertyCount,
+                                                     pQueueFamilyProperties);
 }
 #endif
 #ifdef VK_VERSION_1_1
 void VkDecoderSnapshot::vkGetPhysicalDeviceMemoryProperties2(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    VkPhysicalDeviceMemoryProperties2* pMemoryProperties)
-{
-    mImpl->vkGetPhysicalDeviceMemoryProperties2(snapshotTraceBegin, snapshotTraceBytes, pool, physicalDevice, pMemoryProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties2* pMemoryProperties) {
+    mImpl->vkGetPhysicalDeviceMemoryProperties2(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                physicalDevice, pMemoryProperties);
 }
 #endif
 #ifdef VK_VERSION_1_1
 void VkDecoderSnapshot::vkGetPhysicalDeviceSparseImageFormatProperties2(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    const VkPhysicalDeviceSparseImageFormatInfo2* pFormatInfo,
-    uint32_t* pPropertyCount,
-    VkSparseImageFormatProperties2* pProperties)
-{
-    mImpl->vkGetPhysicalDeviceSparseImageFormatProperties2(snapshotTraceBegin, snapshotTraceBytes, pool, physicalDevice, pFormatInfo, pPropertyCount, pProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSparseImageFormatInfo2* pFormatInfo,
+    uint32_t* pPropertyCount, VkSparseImageFormatProperties2* pProperties) {
+    mImpl->vkGetPhysicalDeviceSparseImageFormatProperties2(snapshotTraceBegin, snapshotTraceBytes,
+                                                           pool, physicalDevice, pFormatInfo,
+                                                           pPropertyCount, pProperties);
 }
 #endif
 #ifdef VK_VERSION_1_1
-void VkDecoderSnapshot::vkTrimCommandPool(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkCommandPool commandPool,
-    VkCommandPoolTrimFlags flags)
-{
-    mImpl->vkTrimCommandPool(snapshotTraceBegin, snapshotTraceBytes, pool, device, commandPool, flags);
+void VkDecoderSnapshot::vkTrimCommandPool(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkDevice device, VkCommandPool commandPool,
+                                          VkCommandPoolTrimFlags flags) {
+    mImpl->vkTrimCommandPool(snapshotTraceBegin, snapshotTraceBytes, pool, device, commandPool,
+                             flags);
 }
 #endif
 #ifdef VK_VERSION_1_1
-void VkDecoderSnapshot::vkGetDeviceQueue2(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    const VkDeviceQueueInfo2* pQueueInfo,
-    VkQueue* pQueue)
-{
-    mImpl->vkGetDeviceQueue2(snapshotTraceBegin, snapshotTraceBytes, pool, device, pQueueInfo, pQueue);
+void VkDecoderSnapshot::vkGetDeviceQueue2(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkDevice device, const VkDeviceQueueInfo2* pQueueInfo,
+                                          VkQueue* pQueue) {
+    mImpl->vkGetDeviceQueue2(snapshotTraceBegin, snapshotTraceBytes, pool, device, pQueueInfo,
+                             pQueue);
 }
 #endif
 #ifdef VK_VERSION_1_1
 void VkDecoderSnapshot::vkCreateSamplerYcbcrConversion(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkSamplerYcbcrConversionCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSamplerYcbcrConversion* pYcbcrConversion)
-{
-    mImpl->vkCreateSamplerYcbcrConversion(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pCreateInfo, pAllocator, pYcbcrConversion);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, const VkSamplerYcbcrConversionCreateInfo* pCreateInfo,
+    const VkAllocationCallbacks* pAllocator, VkSamplerYcbcrConversion* pYcbcrConversion) {
+    mImpl->vkCreateSamplerYcbcrConversion(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                          input_result, device, pCreateInfo, pAllocator,
+                                          pYcbcrConversion);
 }
 #endif
 #ifdef VK_VERSION_1_1
-void VkDecoderSnapshot::vkDestroySamplerYcbcrConversion(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkSamplerYcbcrConversion ycbcrConversion,
-    const VkAllocationCallbacks* pAllocator)
-{
-    mImpl->vkDestroySamplerYcbcrConversion(snapshotTraceBegin, snapshotTraceBytes, pool, device, ycbcrConversion, pAllocator);
+void VkDecoderSnapshot::vkDestroySamplerYcbcrConversion(const uint8_t* snapshotTraceBegin,
+                                                        size_t snapshotTraceBytes,
+                                                        android::base::BumpPool* pool,
+                                                        VkDevice device,
+                                                        VkSamplerYcbcrConversion ycbcrConversion,
+                                                        const VkAllocationCallbacks* pAllocator) {
+    mImpl->vkDestroySamplerYcbcrConversion(snapshotTraceBegin, snapshotTraceBytes, pool, device,
+                                           ycbcrConversion, pAllocator);
 }
 #endif
 #ifdef VK_VERSION_1_1
 void VkDecoderSnapshot::vkCreateDescriptorUpdateTemplate(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo,
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkDescriptorUpdateTemplate* pDescriptorUpdateTemplate)
-{
-    mImpl->vkCreateDescriptorUpdateTemplate(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pCreateInfo, pAllocator, pDescriptorUpdateTemplate);
+    VkDescriptorUpdateTemplate* pDescriptorUpdateTemplate) {
+    mImpl->vkCreateDescriptorUpdateTemplate(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                            input_result, device, pCreateInfo, pAllocator,
+                                            pDescriptorUpdateTemplate);
 }
 #endif
 #ifdef VK_VERSION_1_1
 void VkDecoderSnapshot::vkDestroyDescriptorUpdateTemplate(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkDescriptorUpdateTemplate descriptorUpdateTemplate,
-    const VkAllocationCallbacks* pAllocator)
-{
-    mImpl->vkDestroyDescriptorUpdateTemplate(snapshotTraceBegin, snapshotTraceBytes, pool, device, descriptorUpdateTemplate, pAllocator);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkDevice device, VkDescriptorUpdateTemplate descriptorUpdateTemplate,
+    const VkAllocationCallbacks* pAllocator) {
+    mImpl->vkDestroyDescriptorUpdateTemplate(snapshotTraceBegin, snapshotTraceBytes, pool, device,
+                                             descriptorUpdateTemplate, pAllocator);
 }
 #endif
 #ifdef VK_VERSION_1_1
 void VkDecoderSnapshot::vkUpdateDescriptorSetWithTemplate(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkDescriptorSet descriptorSet,
-    VkDescriptorUpdateTemplate descriptorUpdateTemplate,
-    const void* pData)
-{
-    mImpl->vkUpdateDescriptorSetWithTemplate(snapshotTraceBegin, snapshotTraceBytes, pool, device, descriptorSet, descriptorUpdateTemplate, pData);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkDevice device, VkDescriptorSet descriptorSet,
+    VkDescriptorUpdateTemplate descriptorUpdateTemplate, const void* pData) {
+    mImpl->vkUpdateDescriptorSetWithTemplate(snapshotTraceBegin, snapshotTraceBytes, pool, device,
+                                             descriptorSet, descriptorUpdateTemplate, pData);
 }
 #endif
 #ifdef VK_VERSION_1_1
 void VkDecoderSnapshot::vkGetPhysicalDeviceExternalBufferProperties(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    const VkPhysicalDeviceExternalBufferInfo* pExternalBufferInfo,
-    VkExternalBufferProperties* pExternalBufferProperties)
-{
-    mImpl->vkGetPhysicalDeviceExternalBufferProperties(snapshotTraceBegin, snapshotTraceBytes, pool, physicalDevice, pExternalBufferInfo, pExternalBufferProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalBufferInfo* pExternalBufferInfo,
+    VkExternalBufferProperties* pExternalBufferProperties) {
+    mImpl->vkGetPhysicalDeviceExternalBufferProperties(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                       physicalDevice, pExternalBufferInfo,
+                                                       pExternalBufferProperties);
 }
 #endif
 #ifdef VK_VERSION_1_1
 void VkDecoderSnapshot::vkGetPhysicalDeviceExternalFenceProperties(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo,
-    VkExternalFenceProperties* pExternalFenceProperties)
-{
-    mImpl->vkGetPhysicalDeviceExternalFenceProperties(snapshotTraceBegin, snapshotTraceBytes, pool, physicalDevice, pExternalFenceInfo, pExternalFenceProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo,
+    VkExternalFenceProperties* pExternalFenceProperties) {
+    mImpl->vkGetPhysicalDeviceExternalFenceProperties(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                      physicalDevice, pExternalFenceInfo,
+                                                      pExternalFenceProperties);
 }
 #endif
 #ifdef VK_VERSION_1_1
 void VkDecoderSnapshot::vkGetPhysicalDeviceExternalSemaphoreProperties(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
     VkPhysicalDevice physicalDevice,
     const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo,
-    VkExternalSemaphoreProperties* pExternalSemaphoreProperties)
-{
-    mImpl->vkGetPhysicalDeviceExternalSemaphoreProperties(snapshotTraceBegin, snapshotTraceBytes, pool, physicalDevice, pExternalSemaphoreInfo, pExternalSemaphoreProperties);
+    VkExternalSemaphoreProperties* pExternalSemaphoreProperties) {
+    mImpl->vkGetPhysicalDeviceExternalSemaphoreProperties(
+        snapshotTraceBegin, snapshotTraceBytes, pool, physicalDevice, pExternalSemaphoreInfo,
+        pExternalSemaphoreProperties);
 }
 #endif
 #ifdef VK_VERSION_1_1
 void VkDecoderSnapshot::vkGetDescriptorSetLayoutSupport(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
-    VkDescriptorSetLayoutSupport* pSupport)
-{
-    mImpl->vkGetDescriptorSetLayoutSupport(snapshotTraceBegin, snapshotTraceBytes, pool, device, pCreateInfo, pSupport);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkDevice device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
+    VkDescriptorSetLayoutSupport* pSupport) {
+    mImpl->vkGetDescriptorSetLayoutSupport(snapshotTraceBegin, snapshotTraceBytes, pool, device,
+                                           pCreateInfo, pSupport);
 }
 #endif
 #ifdef VK_VERSION_1_2
 void VkDecoderSnapshot::vkCmdDrawIndirectCount(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBuffer buffer,
-    VkDeviceSize offset,
-    VkBuffer countBuffer,
-    VkDeviceSize countBufferOffset,
-    uint32_t maxDrawCount,
-    uint32_t stride)
-{
-    mImpl->vkCmdDrawIndirectCount(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
+    VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride) {
+    mImpl->vkCmdDrawIndirectCount(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                  buffer, offset, countBuffer, countBufferOffset, maxDrawCount,
+                                  stride);
 }
 #endif
 #ifdef VK_VERSION_1_2
 void VkDecoderSnapshot::vkCmdDrawIndexedIndirectCount(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBuffer buffer,
-    VkDeviceSize offset,
-    VkBuffer countBuffer,
-    VkDeviceSize countBufferOffset,
-    uint32_t maxDrawCount,
-    uint32_t stride)
-{
-    mImpl->vkCmdDrawIndexedIndirectCount(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
+    VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride) {
+    mImpl->vkCmdDrawIndexedIndirectCount(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                         commandBuffer, buffer, offset, countBuffer,
+                                         countBufferOffset, maxDrawCount, stride);
 }
 #endif
 #ifdef VK_VERSION_1_2
 void VkDecoderSnapshot::vkCreateRenderPass2(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkRenderPassCreateInfo2* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkRenderPass* pRenderPass)
-{
-    mImpl->vkCreateRenderPass2(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pCreateInfo, pAllocator, pRenderPass);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, const VkRenderPassCreateInfo2* pCreateInfo,
+    const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass) {
+    mImpl->vkCreateRenderPass2(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                               pCreateInfo, pAllocator, pRenderPass);
 }
 #endif
 #ifdef VK_VERSION_1_2
-void VkDecoderSnapshot::vkCmdBeginRenderPass2(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkRenderPassBeginInfo* pRenderPassBegin,
-    const VkSubpassBeginInfo* pSubpassBeginInfo)
-{
-    mImpl->vkCmdBeginRenderPass2(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pRenderPassBegin, pSubpassBeginInfo);
+void VkDecoderSnapshot::vkCmdBeginRenderPass2(const uint8_t* snapshotTraceBegin,
+                                              size_t snapshotTraceBytes,
+                                              android::base::BumpPool* pool,
+                                              VkCommandBuffer commandBuffer,
+                                              const VkRenderPassBeginInfo* pRenderPassBegin,
+                                              const VkSubpassBeginInfo* pSubpassBeginInfo) {
+    mImpl->vkCmdBeginRenderPass2(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                 pRenderPassBegin, pSubpassBeginInfo);
 }
 #endif
 #ifdef VK_VERSION_1_2
-void VkDecoderSnapshot::vkCmdNextSubpass2(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkSubpassBeginInfo* pSubpassBeginInfo,
-    const VkSubpassEndInfo* pSubpassEndInfo)
-{
-    mImpl->vkCmdNextSubpass2(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pSubpassBeginInfo, pSubpassEndInfo);
+void VkDecoderSnapshot::vkCmdNextSubpass2(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkCommandBuffer commandBuffer,
+                                          const VkSubpassBeginInfo* pSubpassBeginInfo,
+                                          const VkSubpassEndInfo* pSubpassEndInfo) {
+    mImpl->vkCmdNextSubpass2(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                             pSubpassBeginInfo, pSubpassEndInfo);
 }
 #endif
 #ifdef VK_VERSION_1_2
-void VkDecoderSnapshot::vkCmdEndRenderPass2(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkSubpassEndInfo* pSubpassEndInfo)
-{
-    mImpl->vkCmdEndRenderPass2(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pSubpassEndInfo);
+void VkDecoderSnapshot::vkCmdEndRenderPass2(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool,
+                                            VkCommandBuffer commandBuffer,
+                                            const VkSubpassEndInfo* pSubpassEndInfo) {
+    mImpl->vkCmdEndRenderPass2(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                               pSubpassEndInfo);
 }
 #endif
 #ifdef VK_VERSION_1_2
-void VkDecoderSnapshot::vkResetQueryPool(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkQueryPool queryPool,
-    uint32_t firstQuery,
-    uint32_t queryCount)
-{
-    mImpl->vkResetQueryPool(snapshotTraceBegin, snapshotTraceBytes, pool, device, queryPool, firstQuery, queryCount);
+void VkDecoderSnapshot::vkResetQueryPool(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkDevice device, VkQueryPool queryPool,
+                                         uint32_t firstQuery, uint32_t queryCount) {
+    mImpl->vkResetQueryPool(snapshotTraceBegin, snapshotTraceBytes, pool, device, queryPool,
+                            firstQuery, queryCount);
 }
 #endif
 #ifdef VK_VERSION_1_2
-void VkDecoderSnapshot::vkGetSemaphoreCounterValue(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkSemaphore semaphore,
-    uint64_t* pValue)
-{
-    mImpl->vkGetSemaphoreCounterValue(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, semaphore, pValue);
+void VkDecoderSnapshot::vkGetSemaphoreCounterValue(const uint8_t* snapshotTraceBegin,
+                                                   size_t snapshotTraceBytes,
+                                                   android::base::BumpPool* pool,
+                                                   VkResult input_result, VkDevice device,
+                                                   VkSemaphore semaphore, uint64_t* pValue) {
+    mImpl->vkGetSemaphoreCounterValue(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                      device, semaphore, pValue);
 }
 #endif
 #ifdef VK_VERSION_1_2
-void VkDecoderSnapshot::vkWaitSemaphores(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkSemaphoreWaitInfo* pWaitInfo,
-    uint64_t timeout)
-{
-    mImpl->vkWaitSemaphores(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pWaitInfo, timeout);
+void VkDecoderSnapshot::vkWaitSemaphores(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkResult input_result, VkDevice device,
+                                         const VkSemaphoreWaitInfo* pWaitInfo, uint64_t timeout) {
+    mImpl->vkWaitSemaphores(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                            pWaitInfo, timeout);
 }
 #endif
 #ifdef VK_VERSION_1_2
-void VkDecoderSnapshot::vkSignalSemaphore(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkSemaphoreSignalInfo* pSignalInfo)
-{
-    mImpl->vkSignalSemaphore(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pSignalInfo);
+void VkDecoderSnapshot::vkSignalSemaphore(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkResult input_result, VkDevice device,
+                                          const VkSemaphoreSignalInfo* pSignalInfo) {
+    mImpl->vkSignalSemaphore(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                             pSignalInfo);
 }
 #endif
 #ifdef VK_VERSION_1_2
-void VkDecoderSnapshot::vkGetBufferDeviceAddress(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDeviceAddress input_result,
-    VkDevice device,
-    const VkBufferDeviceAddressInfo* pInfo)
-{
-    mImpl->vkGetBufferDeviceAddress(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pInfo);
+void VkDecoderSnapshot::vkGetBufferDeviceAddress(const uint8_t* snapshotTraceBegin,
+                                                 size_t snapshotTraceBytes,
+                                                 android::base::BumpPool* pool,
+                                                 VkDeviceAddress input_result, VkDevice device,
+                                                 const VkBufferDeviceAddressInfo* pInfo) {
+    mImpl->vkGetBufferDeviceAddress(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                    device, pInfo);
 }
 #endif
 #ifdef VK_VERSION_1_2
-void VkDecoderSnapshot::vkGetBufferOpaqueCaptureAddress(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    uint64_t input_result,
-    VkDevice device,
-    const VkBufferDeviceAddressInfo* pInfo)
-{
-    mImpl->vkGetBufferOpaqueCaptureAddress(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pInfo);
+void VkDecoderSnapshot::vkGetBufferOpaqueCaptureAddress(const uint8_t* snapshotTraceBegin,
+                                                        size_t snapshotTraceBytes,
+                                                        android::base::BumpPool* pool,
+                                                        uint64_t input_result, VkDevice device,
+                                                        const VkBufferDeviceAddressInfo* pInfo) {
+    mImpl->vkGetBufferOpaqueCaptureAddress(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                           input_result, device, pInfo);
 }
 #endif
 #ifdef VK_VERSION_1_2
 void VkDecoderSnapshot::vkGetDeviceMemoryOpaqueCaptureAddress(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    uint64_t input_result,
-    VkDevice device,
-    const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo)
-{
-    mImpl->vkGetDeviceMemoryOpaqueCaptureAddress(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pInfo);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    uint64_t input_result, VkDevice device, const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo) {
+    mImpl->vkGetDeviceMemoryOpaqueCaptureAddress(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                 input_result, device, pInfo);
 }
 #endif
 #ifdef VK_KHR_surface
-void VkDecoderSnapshot::vkDestroySurfaceKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkInstance instance,
-    VkSurfaceKHR surface,
-    const VkAllocationCallbacks* pAllocator)
-{
-    mImpl->vkDestroySurfaceKHR(snapshotTraceBegin, snapshotTraceBytes, pool, instance, surface, pAllocator);
+void VkDecoderSnapshot::vkDestroySurfaceKHR(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool, VkInstance instance,
+                                            VkSurfaceKHR surface,
+                                            const VkAllocationCallbacks* pAllocator) {
+    mImpl->vkDestroySurfaceKHR(snapshotTraceBegin, snapshotTraceBytes, pool, instance, surface,
+                               pAllocator);
 }
 #endif
 #ifdef VK_KHR_surface
 void VkDecoderSnapshot::vkGetPhysicalDeviceSurfaceSupportKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t queueFamilyIndex,
-    VkSurfaceKHR surface,
-    VkBool32* pSupported)
-{
-    mImpl->vkGetPhysicalDeviceSurfaceSupportKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, queueFamilyIndex, surface, pSupported);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
+    VkSurfaceKHR surface, VkBool32* pSupported) {
+    mImpl->vkGetPhysicalDeviceSurfaceSupportKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                input_result, physicalDevice, queueFamilyIndex,
+                                                surface, pSupported);
 }
 #endif
 #ifdef VK_KHR_surface
 void VkDecoderSnapshot::vkGetPhysicalDeviceSurfaceCapabilitiesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    VkSurfaceKHR surface,
-    VkSurfaceCapabilitiesKHR* pSurfaceCapabilities)
-{
-    mImpl->vkGetPhysicalDeviceSurfaceCapabilitiesKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, surface, pSurfaceCapabilities);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
+    VkSurfaceCapabilitiesKHR* pSurfaceCapabilities) {
+    mImpl->vkGetPhysicalDeviceSurfaceCapabilitiesKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                     input_result, physicalDevice, surface,
+                                                     pSurfaceCapabilities);
 }
 #endif
 #ifdef VK_KHR_surface
 void VkDecoderSnapshot::vkGetPhysicalDeviceSurfaceFormatsKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    VkSurfaceKHR surface,
-    uint32_t* pSurfaceFormatCount,
-    VkSurfaceFormatKHR* pSurfaceFormats)
-{
-    mImpl->vkGetPhysicalDeviceSurfaceFormatsKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, surface, pSurfaceFormatCount, pSurfaceFormats);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
+    uint32_t* pSurfaceFormatCount, VkSurfaceFormatKHR* pSurfaceFormats) {
+    mImpl->vkGetPhysicalDeviceSurfaceFormatsKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                input_result, physicalDevice, surface,
+                                                pSurfaceFormatCount, pSurfaceFormats);
 }
 #endif
 #ifdef VK_KHR_surface
 void VkDecoderSnapshot::vkGetPhysicalDeviceSurfacePresentModesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    VkSurfaceKHR surface,
-    uint32_t* pPresentModeCount,
-    VkPresentModeKHR* pPresentModes)
-{
-    mImpl->vkGetPhysicalDeviceSurfacePresentModesKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, surface, pPresentModeCount, pPresentModes);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
+    uint32_t* pPresentModeCount, VkPresentModeKHR* pPresentModes) {
+    mImpl->vkGetPhysicalDeviceSurfacePresentModesKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                     input_result, physicalDevice, surface,
+                                                     pPresentModeCount, pPresentModes);
 }
 #endif
 #ifdef VK_KHR_swapchain
 void VkDecoderSnapshot::vkCreateSwapchainKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkSwapchainCreateInfoKHR* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSwapchainKHR* pSwapchain)
-{
-    mImpl->vkCreateSwapchainKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pCreateInfo, pAllocator, pSwapchain);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, const VkSwapchainCreateInfoKHR* pCreateInfo,
+    const VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchain) {
+    mImpl->vkCreateSwapchainKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                                pCreateInfo, pAllocator, pSwapchain);
 }
 #endif
 #ifdef VK_KHR_swapchain
-void VkDecoderSnapshot::vkDestroySwapchainKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkSwapchainKHR swapchain,
-    const VkAllocationCallbacks* pAllocator)
-{
-    mImpl->vkDestroySwapchainKHR(snapshotTraceBegin, snapshotTraceBytes, pool, device, swapchain, pAllocator);
+void VkDecoderSnapshot::vkDestroySwapchainKHR(const uint8_t* snapshotTraceBegin,
+                                              size_t snapshotTraceBytes,
+                                              android::base::BumpPool* pool, VkDevice device,
+                                              VkSwapchainKHR swapchain,
+                                              const VkAllocationCallbacks* pAllocator) {
+    mImpl->vkDestroySwapchainKHR(snapshotTraceBegin, snapshotTraceBytes, pool, device, swapchain,
+                                 pAllocator);
 }
 #endif
 #ifdef VK_KHR_swapchain
 void VkDecoderSnapshot::vkGetSwapchainImagesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkSwapchainKHR swapchain,
-    uint32_t* pSwapchainImageCount,
-    VkImage* pSwapchainImages)
-{
-    mImpl->vkGetSwapchainImagesKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, swapchain, pSwapchainImageCount, pSwapchainImages);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, VkSwapchainKHR swapchain,
+    uint32_t* pSwapchainImageCount, VkImage* pSwapchainImages) {
+    mImpl->vkGetSwapchainImagesKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                   device, swapchain, pSwapchainImageCount, pSwapchainImages);
 }
 #endif
 #ifdef VK_KHR_swapchain
-void VkDecoderSnapshot::vkAcquireNextImageKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkSwapchainKHR swapchain,
-    uint64_t timeout,
-    VkSemaphore semaphore,
-    VkFence fence,
-    uint32_t* pImageIndex)
-{
-    mImpl->vkAcquireNextImageKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, swapchain, timeout, semaphore, fence, pImageIndex);
+void VkDecoderSnapshot::vkAcquireNextImageKHR(const uint8_t* snapshotTraceBegin,
+                                              size_t snapshotTraceBytes,
+                                              android::base::BumpPool* pool, VkResult input_result,
+                                              VkDevice device, VkSwapchainKHR swapchain,
+                                              uint64_t timeout, VkSemaphore semaphore,
+                                              VkFence fence, uint32_t* pImageIndex) {
+    mImpl->vkAcquireNextImageKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                                 swapchain, timeout, semaphore, fence, pImageIndex);
 }
 #endif
 #ifdef VK_KHR_swapchain
-void VkDecoderSnapshot::vkQueuePresentKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkQueue queue,
-    const VkPresentInfoKHR* pPresentInfo)
-{
-    mImpl->vkQueuePresentKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, queue, pPresentInfo);
+void VkDecoderSnapshot::vkQueuePresentKHR(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkResult input_result, VkQueue queue,
+                                          const VkPresentInfoKHR* pPresentInfo) {
+    mImpl->vkQueuePresentKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, queue,
+                             pPresentInfo);
 }
 #endif
 #ifdef VK_KHR_swapchain
 void VkDecoderSnapshot::vkGetDeviceGroupPresentCapabilitiesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkDeviceGroupPresentCapabilitiesKHR* pDeviceGroupPresentCapabilities)
-{
-    mImpl->vkGetDeviceGroupPresentCapabilitiesKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pDeviceGroupPresentCapabilities);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device,
+    VkDeviceGroupPresentCapabilitiesKHR* pDeviceGroupPresentCapabilities) {
+    mImpl->vkGetDeviceGroupPresentCapabilitiesKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                  input_result, device,
+                                                  pDeviceGroupPresentCapabilities);
 }
 #endif
 #ifdef VK_KHR_swapchain
 void VkDecoderSnapshot::vkGetDeviceGroupSurfacePresentModesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkSurfaceKHR surface,
-    VkDeviceGroupPresentModeFlagsKHR* pModes)
-{
-    mImpl->vkGetDeviceGroupSurfacePresentModesKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, surface, pModes);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, VkSurfaceKHR surface,
+    VkDeviceGroupPresentModeFlagsKHR* pModes) {
+    mImpl->vkGetDeviceGroupSurfacePresentModesKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                  input_result, device, surface, pModes);
 }
 #endif
 #ifdef VK_KHR_swapchain
 void VkDecoderSnapshot::vkGetPhysicalDevicePresentRectanglesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    VkSurfaceKHR surface,
-    uint32_t* pRectCount,
-    VkRect2D* pRects)
-{
-    mImpl->vkGetPhysicalDevicePresentRectanglesKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, surface, pRectCount, pRects);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
+    uint32_t* pRectCount, VkRect2D* pRects) {
+    mImpl->vkGetPhysicalDevicePresentRectanglesKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                   input_result, physicalDevice, surface,
+                                                   pRectCount, pRects);
 }
 #endif
 #ifdef VK_KHR_swapchain
-void VkDecoderSnapshot::vkAcquireNextImage2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkAcquireNextImageInfoKHR* pAcquireInfo,
-    uint32_t* pImageIndex)
-{
-    mImpl->vkAcquireNextImage2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pAcquireInfo, pImageIndex);
+void VkDecoderSnapshot::vkAcquireNextImage2KHR(const uint8_t* snapshotTraceBegin,
+                                               size_t snapshotTraceBytes,
+                                               android::base::BumpPool* pool, VkResult input_result,
+                                               VkDevice device,
+                                               const VkAcquireNextImageInfoKHR* pAcquireInfo,
+                                               uint32_t* pImageIndex) {
+    mImpl->vkAcquireNextImage2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                  device, pAcquireInfo, pImageIndex);
 }
 #endif
 #ifdef VK_KHR_display
 void VkDecoderSnapshot::vkGetPhysicalDeviceDisplayPropertiesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t* pPropertyCount,
-    VkDisplayPropertiesKHR* pProperties)
-{
-    mImpl->vkGetPhysicalDeviceDisplayPropertiesKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, pPropertyCount, pProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount,
+    VkDisplayPropertiesKHR* pProperties) {
+    mImpl->vkGetPhysicalDeviceDisplayPropertiesKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                   input_result, physicalDevice, pPropertyCount,
+                                                   pProperties);
 }
 #endif
 #ifdef VK_KHR_display
 void VkDecoderSnapshot::vkGetPhysicalDeviceDisplayPlanePropertiesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t* pPropertyCount,
-    VkDisplayPlanePropertiesKHR* pProperties)
-{
-    mImpl->vkGetPhysicalDeviceDisplayPlanePropertiesKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, pPropertyCount, pProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount,
+    VkDisplayPlanePropertiesKHR* pProperties) {
+    mImpl->vkGetPhysicalDeviceDisplayPlanePropertiesKHR(snapshotTraceBegin, snapshotTraceBytes,
+                                                        pool, input_result, physicalDevice,
+                                                        pPropertyCount, pProperties);
 }
 #endif
 #ifdef VK_KHR_display
 void VkDecoderSnapshot::vkGetDisplayPlaneSupportedDisplaysKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t planeIndex,
-    uint32_t* pDisplayCount,
-    VkDisplayKHR* pDisplays)
-{
-    mImpl->vkGetDisplayPlaneSupportedDisplaysKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, planeIndex, pDisplayCount, pDisplays);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkPhysicalDevice physicalDevice, uint32_t planeIndex,
+    uint32_t* pDisplayCount, VkDisplayKHR* pDisplays) {
+    mImpl->vkGetDisplayPlaneSupportedDisplaysKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                 input_result, physicalDevice, planeIndex,
+                                                 pDisplayCount, pDisplays);
 }
 #endif
 #ifdef VK_KHR_display
 void VkDecoderSnapshot::vkGetDisplayModePropertiesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    VkDisplayKHR display,
-    uint32_t* pPropertyCount,
-    VkDisplayModePropertiesKHR* pProperties)
-{
-    mImpl->vkGetDisplayModePropertiesKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, display, pPropertyCount, pProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkPhysicalDevice physicalDevice, VkDisplayKHR display,
+    uint32_t* pPropertyCount, VkDisplayModePropertiesKHR* pProperties) {
+    mImpl->vkGetDisplayModePropertiesKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                         physicalDevice, display, pPropertyCount, pProperties);
 }
 #endif
 #ifdef VK_KHR_display
 void VkDecoderSnapshot::vkCreateDisplayModeKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    VkDisplayKHR display,
-    const VkDisplayModeCreateInfoKHR* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkDisplayModeKHR* pMode)
-{
-    mImpl->vkCreateDisplayModeKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, display, pCreateInfo, pAllocator, pMode);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkPhysicalDevice physicalDevice, VkDisplayKHR display,
+    const VkDisplayModeCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator,
+    VkDisplayModeKHR* pMode) {
+    mImpl->vkCreateDisplayModeKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                  physicalDevice, display, pCreateInfo, pAllocator, pMode);
 }
 #endif
 #ifdef VK_KHR_display
 void VkDecoderSnapshot::vkGetDisplayPlaneCapabilitiesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    VkDisplayModeKHR mode,
-    uint32_t planeIndex,
-    VkDisplayPlaneCapabilitiesKHR* pCapabilities)
-{
-    mImpl->vkGetDisplayPlaneCapabilitiesKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, mode, planeIndex, pCapabilities);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkPhysicalDevice physicalDevice, VkDisplayModeKHR mode,
+    uint32_t planeIndex, VkDisplayPlaneCapabilitiesKHR* pCapabilities) {
+    mImpl->vkGetDisplayPlaneCapabilitiesKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                            input_result, physicalDevice, mode, planeIndex,
+                                            pCapabilities);
 }
 #endif
 #ifdef VK_KHR_display
 void VkDecoderSnapshot::vkCreateDisplayPlaneSurfaceKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    const VkDisplaySurfaceCreateInfoKHR* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
-{
-    mImpl->vkCreateDisplayPlaneSurfaceKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, instance, pCreateInfo, pAllocator, pSurface);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkInstance instance, const VkDisplaySurfaceCreateInfoKHR* pCreateInfo,
+    const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) {
+    mImpl->vkCreateDisplayPlaneSurfaceKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                          input_result, instance, pCreateInfo, pAllocator,
+                                          pSurface);
 }
 #endif
 #ifdef VK_KHR_display_swapchain
 void VkDecoderSnapshot::vkCreateSharedSwapchainsKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    uint32_t swapchainCount,
-    const VkSwapchainCreateInfoKHR* pCreateInfos,
-    const VkAllocationCallbacks* pAllocator,
-    VkSwapchainKHR* pSwapchains)
-{
-    mImpl->vkCreateSharedSwapchainsKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, uint32_t swapchainCount,
+    const VkSwapchainCreateInfoKHR* pCreateInfos, const VkAllocationCallbacks* pAllocator,
+    VkSwapchainKHR* pSwapchains) {
+    mImpl->vkCreateSharedSwapchainsKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                       device, swapchainCount, pCreateInfos, pAllocator,
+                                       pSwapchains);
 }
 #endif
 #ifdef VK_KHR_xlib_surface
 void VkDecoderSnapshot::vkCreateXlibSurfaceKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    const VkXlibSurfaceCreateInfoKHR* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
-{
-    mImpl->vkCreateXlibSurfaceKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, instance, pCreateInfo, pAllocator, pSurface);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkInstance instance, const VkXlibSurfaceCreateInfoKHR* pCreateInfo,
+    const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) {
+    mImpl->vkCreateXlibSurfaceKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                  instance, pCreateInfo, pAllocator, pSurface);
 }
 #endif
 #ifdef VK_KHR_xlib_surface
 void VkDecoderSnapshot::vkGetPhysicalDeviceXlibPresentationSupportKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkBool32 input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t queueFamilyIndex,
-    Display* dpy,
-    VisualID visualID)
-{
-    mImpl->vkGetPhysicalDeviceXlibPresentationSupportKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, queueFamilyIndex, dpy, visualID);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkBool32 input_result, VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, Display* dpy,
+    VisualID visualID) {
+    mImpl->vkGetPhysicalDeviceXlibPresentationSupportKHR(snapshotTraceBegin, snapshotTraceBytes,
+                                                         pool, input_result, physicalDevice,
+                                                         queueFamilyIndex, dpy, visualID);
 }
 #endif
 #ifdef VK_KHR_xcb_surface
 void VkDecoderSnapshot::vkCreateXcbSurfaceKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    const VkXcbSurfaceCreateInfoKHR* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
-{
-    mImpl->vkCreateXcbSurfaceKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, instance, pCreateInfo, pAllocator, pSurface);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkInstance instance, const VkXcbSurfaceCreateInfoKHR* pCreateInfo,
+    const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) {
+    mImpl->vkCreateXcbSurfaceKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                 instance, pCreateInfo, pAllocator, pSurface);
 }
 #endif
 #ifdef VK_KHR_xcb_surface
 void VkDecoderSnapshot::vkGetPhysicalDeviceXcbPresentationSupportKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkBool32 input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t queueFamilyIndex,
-    xcb_connection_t* connection,
-    xcb_visualid_t visual_id)
-{
-    mImpl->vkGetPhysicalDeviceXcbPresentationSupportKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, queueFamilyIndex, connection, visual_id);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkBool32 input_result, VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
+    xcb_connection_t* connection, xcb_visualid_t visual_id) {
+    mImpl->vkGetPhysicalDeviceXcbPresentationSupportKHR(snapshotTraceBegin, snapshotTraceBytes,
+                                                        pool, input_result, physicalDevice,
+                                                        queueFamilyIndex, connection, visual_id);
 }
 #endif
 #ifdef VK_KHR_wayland_surface
 void VkDecoderSnapshot::vkCreateWaylandSurfaceKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    const VkWaylandSurfaceCreateInfoKHR* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
-{
-    mImpl->vkCreateWaylandSurfaceKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, instance, pCreateInfo, pAllocator, pSurface);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkInstance instance, const VkWaylandSurfaceCreateInfoKHR* pCreateInfo,
+    const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) {
+    mImpl->vkCreateWaylandSurfaceKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                     instance, pCreateInfo, pAllocator, pSurface);
 }
 #endif
 #ifdef VK_KHR_wayland_surface
 void VkDecoderSnapshot::vkGetPhysicalDeviceWaylandPresentationSupportKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkBool32 input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t queueFamilyIndex,
-    wl_display* display)
-{
-    mImpl->vkGetPhysicalDeviceWaylandPresentationSupportKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, queueFamilyIndex, display);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkBool32 input_result, VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
+    wl_display* display) {
+    mImpl->vkGetPhysicalDeviceWaylandPresentationSupportKHR(snapshotTraceBegin, snapshotTraceBytes,
+                                                            pool, input_result, physicalDevice,
+                                                            queueFamilyIndex, display);
 }
 #endif
 #ifdef VK_KHR_android_surface
 void VkDecoderSnapshot::vkCreateAndroidSurfaceKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    const VkAndroidSurfaceCreateInfoKHR* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
-{
-    mImpl->vkCreateAndroidSurfaceKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, instance, pCreateInfo, pAllocator, pSurface);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkInstance instance, const VkAndroidSurfaceCreateInfoKHR* pCreateInfo,
+    const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) {
+    mImpl->vkCreateAndroidSurfaceKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                     instance, pCreateInfo, pAllocator, pSurface);
 }
 #endif
 #ifdef VK_KHR_win32_surface
 void VkDecoderSnapshot::vkCreateWin32SurfaceKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    const VkWin32SurfaceCreateInfoKHR* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
-{
-    mImpl->vkCreateWin32SurfaceKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, instance, pCreateInfo, pAllocator, pSurface);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkInstance instance, const VkWin32SurfaceCreateInfoKHR* pCreateInfo,
+    const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) {
+    mImpl->vkCreateWin32SurfaceKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                   instance, pCreateInfo, pAllocator, pSurface);
 }
 #endif
 #ifdef VK_KHR_win32_surface
 void VkDecoderSnapshot::vkGetPhysicalDeviceWin32PresentationSupportKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkBool32 input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t queueFamilyIndex)
-{
-    mImpl->vkGetPhysicalDeviceWin32PresentationSupportKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, queueFamilyIndex);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkBool32 input_result, VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex) {
+    mImpl->vkGetPhysicalDeviceWin32PresentationSupportKHR(snapshotTraceBegin, snapshotTraceBytes,
+                                                          pool, input_result, physicalDevice,
+                                                          queueFamilyIndex);
 }
 #endif
 #ifdef VK_KHR_video_queue
 void VkDecoderSnapshot::vkGetPhysicalDeviceVideoCapabilitiesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    const VkVideoProfileKHR* pVideoProfile,
-    VkVideoCapabilitiesKHR* pCapabilities)
-{
-    mImpl->vkGetPhysicalDeviceVideoCapabilitiesKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, pVideoProfile, pCapabilities);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkPhysicalDevice physicalDevice, const VkVideoProfileKHR* pVideoProfile,
+    VkVideoCapabilitiesKHR* pCapabilities) {
+    mImpl->vkGetPhysicalDeviceVideoCapabilitiesKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                   input_result, physicalDevice, pVideoProfile,
+                                                   pCapabilities);
 }
 #endif
 #ifdef VK_KHR_video_queue
 void VkDecoderSnapshot::vkGetPhysicalDeviceVideoFormatPropertiesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    const VkPhysicalDeviceVideoFormatInfoKHR* pVideoFormatInfo,
-    uint32_t* pVideoFormatPropertyCount,
-    VkVideoFormatPropertiesKHR* pVideoFormatProperties)
-{
-    mImpl->vkGetPhysicalDeviceVideoFormatPropertiesKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, pVideoFormatInfo, pVideoFormatPropertyCount, pVideoFormatProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkPhysicalDevice physicalDevice,
+    const VkPhysicalDeviceVideoFormatInfoKHR* pVideoFormatInfo, uint32_t* pVideoFormatPropertyCount,
+    VkVideoFormatPropertiesKHR* pVideoFormatProperties) {
+    mImpl->vkGetPhysicalDeviceVideoFormatPropertiesKHR(
+        snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice,
+        pVideoFormatInfo, pVideoFormatPropertyCount, pVideoFormatProperties);
 }
 #endif
 #ifdef VK_KHR_video_queue
 void VkDecoderSnapshot::vkCreateVideoSessionKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkVideoSessionCreateInfoKHR* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkVideoSessionKHR* pVideoSession)
-{
-    mImpl->vkCreateVideoSessionKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pCreateInfo, pAllocator, pVideoSession);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, const VkVideoSessionCreateInfoKHR* pCreateInfo,
+    const VkAllocationCallbacks* pAllocator, VkVideoSessionKHR* pVideoSession) {
+    mImpl->vkCreateVideoSessionKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                   device, pCreateInfo, pAllocator, pVideoSession);
 }
 #endif
 #ifdef VK_KHR_video_queue
-void VkDecoderSnapshot::vkDestroyVideoSessionKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkVideoSessionKHR videoSession,
-    const VkAllocationCallbacks* pAllocator)
-{
-    mImpl->vkDestroyVideoSessionKHR(snapshotTraceBegin, snapshotTraceBytes, pool, device, videoSession, pAllocator);
+void VkDecoderSnapshot::vkDestroyVideoSessionKHR(const uint8_t* snapshotTraceBegin,
+                                                 size_t snapshotTraceBytes,
+                                                 android::base::BumpPool* pool, VkDevice device,
+                                                 VkVideoSessionKHR videoSession,
+                                                 const VkAllocationCallbacks* pAllocator) {
+    mImpl->vkDestroyVideoSessionKHR(snapshotTraceBegin, snapshotTraceBytes, pool, device,
+                                    videoSession, pAllocator);
 }
 #endif
 #ifdef VK_KHR_video_queue
 void VkDecoderSnapshot::vkGetVideoSessionMemoryRequirementsKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkVideoSessionKHR videoSession,
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, VkVideoSessionKHR videoSession,
     uint32_t* pVideoSessionMemoryRequirementsCount,
-    VkVideoGetMemoryPropertiesKHR* pVideoSessionMemoryRequirements)
-{
-    mImpl->vkGetVideoSessionMemoryRequirementsKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, videoSession, pVideoSessionMemoryRequirementsCount, pVideoSessionMemoryRequirements);
+    VkVideoGetMemoryPropertiesKHR* pVideoSessionMemoryRequirements) {
+    mImpl->vkGetVideoSessionMemoryRequirementsKHR(
+        snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, videoSession,
+        pVideoSessionMemoryRequirementsCount, pVideoSessionMemoryRequirements);
 }
 #endif
 #ifdef VK_KHR_video_queue
 void VkDecoderSnapshot::vkBindVideoSessionMemoryKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkVideoSessionKHR videoSession,
-    uint32_t videoSessionBindMemoryCount,
-    const VkVideoBindMemoryKHR* pVideoSessionBindMemories)
-{
-    mImpl->vkBindVideoSessionMemoryKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, videoSession, videoSessionBindMemoryCount, pVideoSessionBindMemories);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, VkVideoSessionKHR videoSession,
+    uint32_t videoSessionBindMemoryCount, const VkVideoBindMemoryKHR* pVideoSessionBindMemories) {
+    mImpl->vkBindVideoSessionMemoryKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                       device, videoSession, videoSessionBindMemoryCount,
+                                       pVideoSessionBindMemories);
 }
 #endif
 #ifdef VK_KHR_video_queue
 void VkDecoderSnapshot::vkCreateVideoSessionParametersKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device,
     const VkVideoSessionParametersCreateInfoKHR* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkVideoSessionParametersKHR* pVideoSessionParameters)
-{
-    mImpl->vkCreateVideoSessionParametersKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pCreateInfo, pAllocator, pVideoSessionParameters);
+    const VkAllocationCallbacks* pAllocator, VkVideoSessionParametersKHR* pVideoSessionParameters) {
+    mImpl->vkCreateVideoSessionParametersKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                             input_result, device, pCreateInfo, pAllocator,
+                                             pVideoSessionParameters);
 }
 #endif
 #ifdef VK_KHR_video_queue
 void VkDecoderSnapshot::vkUpdateVideoSessionParametersKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkVideoSessionParametersKHR videoSessionParameters,
-    const VkVideoSessionParametersUpdateInfoKHR* pUpdateInfo)
-{
-    mImpl->vkUpdateVideoSessionParametersKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, videoSessionParameters, pUpdateInfo);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, VkVideoSessionParametersKHR videoSessionParameters,
+    const VkVideoSessionParametersUpdateInfoKHR* pUpdateInfo) {
+    mImpl->vkUpdateVideoSessionParametersKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                             input_result, device, videoSessionParameters,
+                                             pUpdateInfo);
 }
 #endif
 #ifdef VK_KHR_video_queue
 void VkDecoderSnapshot::vkDestroyVideoSessionParametersKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkVideoSessionParametersKHR videoSessionParameters,
-    const VkAllocationCallbacks* pAllocator)
-{
-    mImpl->vkDestroyVideoSessionParametersKHR(snapshotTraceBegin, snapshotTraceBytes, pool, device, videoSessionParameters, pAllocator);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkDevice device, VkVideoSessionParametersKHR videoSessionParameters,
+    const VkAllocationCallbacks* pAllocator) {
+    mImpl->vkDestroyVideoSessionParametersKHR(snapshotTraceBegin, snapshotTraceBytes, pool, device,
+                                              videoSessionParameters, pAllocator);
 }
 #endif
 #ifdef VK_KHR_video_queue
-void VkDecoderSnapshot::vkCmdBeginVideoCodingKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkVideoBeginCodingInfoKHR* pBeginInfo)
-{
-    mImpl->vkCmdBeginVideoCodingKHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pBeginInfo);
+void VkDecoderSnapshot::vkCmdBeginVideoCodingKHR(const uint8_t* snapshotTraceBegin,
+                                                 size_t snapshotTraceBytes,
+                                                 android::base::BumpPool* pool,
+                                                 VkCommandBuffer commandBuffer,
+                                                 const VkVideoBeginCodingInfoKHR* pBeginInfo) {
+    mImpl->vkCmdBeginVideoCodingKHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                    pBeginInfo);
 }
 #endif
 #ifdef VK_KHR_video_queue
-void VkDecoderSnapshot::vkCmdEndVideoCodingKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkVideoEndCodingInfoKHR* pEndCodingInfo)
-{
-    mImpl->vkCmdEndVideoCodingKHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pEndCodingInfo);
+void VkDecoderSnapshot::vkCmdEndVideoCodingKHR(const uint8_t* snapshotTraceBegin,
+                                               size_t snapshotTraceBytes,
+                                               android::base::BumpPool* pool,
+                                               VkCommandBuffer commandBuffer,
+                                               const VkVideoEndCodingInfoKHR* pEndCodingInfo) {
+    mImpl->vkCmdEndVideoCodingKHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                  pEndCodingInfo);
 }
 #endif
 #ifdef VK_KHR_video_queue
 void VkDecoderSnapshot::vkCmdControlVideoCodingKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkVideoCodingControlInfoKHR* pCodingControlInfo)
-{
-    mImpl->vkCmdControlVideoCodingKHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pCodingControlInfo);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, const VkVideoCodingControlInfoKHR* pCodingControlInfo) {
+    mImpl->vkCmdControlVideoCodingKHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                      pCodingControlInfo);
 }
 #endif
 #ifdef VK_KHR_video_decode_queue
-void VkDecoderSnapshot::vkCmdDecodeVideoKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkVideoDecodeInfoKHR* pFrameInfo)
-{
-    mImpl->vkCmdDecodeVideoKHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pFrameInfo);
+void VkDecoderSnapshot::vkCmdDecodeVideoKHR(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool,
+                                            VkCommandBuffer commandBuffer,
+                                            const VkVideoDecodeInfoKHR* pFrameInfo) {
+    mImpl->vkCmdDecodeVideoKHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                               pFrameInfo);
 }
 #endif
 #ifdef VK_KHR_dynamic_rendering
-void VkDecoderSnapshot::vkCmdBeginRenderingKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkRenderingInfoKHR* pRenderingInfo)
-{
-    mImpl->vkCmdBeginRenderingKHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pRenderingInfo);
+void VkDecoderSnapshot::vkCmdBeginRenderingKHR(const uint8_t* snapshotTraceBegin,
+                                               size_t snapshotTraceBytes,
+                                               android::base::BumpPool* pool,
+                                               VkCommandBuffer commandBuffer,
+                                               const VkRenderingInfoKHR* pRenderingInfo) {
+    mImpl->vkCmdBeginRenderingKHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                  pRenderingInfo);
 }
 #endif
 #ifdef VK_KHR_dynamic_rendering
-void VkDecoderSnapshot::vkCmdEndRenderingKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer)
-{
+void VkDecoderSnapshot::vkCmdEndRenderingKHR(const uint8_t* snapshotTraceBegin,
+                                             size_t snapshotTraceBytes,
+                                             android::base::BumpPool* pool,
+                                             VkCommandBuffer commandBuffer) {
     mImpl->vkCmdEndRenderingKHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer);
 }
 #endif
 #ifdef VK_KHR_get_physical_device_properties2
-void VkDecoderSnapshot::vkGetPhysicalDeviceFeatures2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    VkPhysicalDeviceFeatures2* pFeatures)
-{
-    mImpl->vkGetPhysicalDeviceFeatures2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, physicalDevice, pFeatures);
+void VkDecoderSnapshot::vkGetPhysicalDeviceFeatures2KHR(const uint8_t* snapshotTraceBegin,
+                                                        size_t snapshotTraceBytes,
+                                                        android::base::BumpPool* pool,
+                                                        VkPhysicalDevice physicalDevice,
+                                                        VkPhysicalDeviceFeatures2* pFeatures) {
+    mImpl->vkGetPhysicalDeviceFeatures2KHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                           physicalDevice, pFeatures);
 }
 #endif
 #ifdef VK_KHR_get_physical_device_properties2
 void VkDecoderSnapshot::vkGetPhysicalDeviceProperties2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    VkPhysicalDeviceProperties2* pProperties)
-{
-    mImpl->vkGetPhysicalDeviceProperties2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, physicalDevice, pProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties2* pProperties) {
+    mImpl->vkGetPhysicalDeviceProperties2KHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                             physicalDevice, pProperties);
 }
 #endif
 #ifdef VK_KHR_get_physical_device_properties2
 void VkDecoderSnapshot::vkGetPhysicalDeviceFormatProperties2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    VkFormat format,
-    VkFormatProperties2* pFormatProperties)
-{
-    mImpl->vkGetPhysicalDeviceFormatProperties2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, physicalDevice, format, pFormatProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties2* pFormatProperties) {
+    mImpl->vkGetPhysicalDeviceFormatProperties2KHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                   physicalDevice, format, pFormatProperties);
 }
 #endif
 #ifdef VK_KHR_get_physical_device_properties2
 void VkDecoderSnapshot::vkGetPhysicalDeviceImageFormatProperties2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkPhysicalDevice physicalDevice,
     const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo,
-    VkImageFormatProperties2* pImageFormatProperties)
-{
-    mImpl->vkGetPhysicalDeviceImageFormatProperties2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, pImageFormatInfo, pImageFormatProperties);
+    VkImageFormatProperties2* pImageFormatProperties) {
+    mImpl->vkGetPhysicalDeviceImageFormatProperties2KHR(snapshotTraceBegin, snapshotTraceBytes,
+                                                        pool, input_result, physicalDevice,
+                                                        pImageFormatInfo, pImageFormatProperties);
 }
 #endif
 #ifdef VK_KHR_get_physical_device_properties2
 void VkDecoderSnapshot::vkGetPhysicalDeviceQueueFamilyProperties2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    uint32_t* pQueueFamilyPropertyCount,
-    VkQueueFamilyProperties2* pQueueFamilyProperties)
-{
-    mImpl->vkGetPhysicalDeviceQueueFamilyProperties2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkPhysicalDevice physicalDevice, uint32_t* pQueueFamilyPropertyCount,
+    VkQueueFamilyProperties2* pQueueFamilyProperties) {
+    mImpl->vkGetPhysicalDeviceQueueFamilyProperties2KHR(
+        snapshotTraceBegin, snapshotTraceBytes, pool, physicalDevice, pQueueFamilyPropertyCount,
+        pQueueFamilyProperties);
 }
 #endif
 #ifdef VK_KHR_get_physical_device_properties2
 void VkDecoderSnapshot::vkGetPhysicalDeviceMemoryProperties2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    VkPhysicalDeviceMemoryProperties2* pMemoryProperties)
-{
-    mImpl->vkGetPhysicalDeviceMemoryProperties2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, physicalDevice, pMemoryProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties2* pMemoryProperties) {
+    mImpl->vkGetPhysicalDeviceMemoryProperties2KHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                   physicalDevice, pMemoryProperties);
 }
 #endif
 #ifdef VK_KHR_get_physical_device_properties2
 void VkDecoderSnapshot::vkGetPhysicalDeviceSparseImageFormatProperties2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    const VkPhysicalDeviceSparseImageFormatInfo2* pFormatInfo,
-    uint32_t* pPropertyCount,
-    VkSparseImageFormatProperties2* pProperties)
-{
-    mImpl->vkGetPhysicalDeviceSparseImageFormatProperties2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, physicalDevice, pFormatInfo, pPropertyCount, pProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSparseImageFormatInfo2* pFormatInfo,
+    uint32_t* pPropertyCount, VkSparseImageFormatProperties2* pProperties) {
+    mImpl->vkGetPhysicalDeviceSparseImageFormatProperties2KHR(
+        snapshotTraceBegin, snapshotTraceBytes, pool, physicalDevice, pFormatInfo, pPropertyCount,
+        pProperties);
 }
 #endif
 #ifdef VK_KHR_device_group
 void VkDecoderSnapshot::vkGetDeviceGroupPeerMemoryFeaturesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    uint32_t heapIndex,
-    uint32_t localDeviceIndex,
-    uint32_t remoteDeviceIndex,
-    VkPeerMemoryFeatureFlags* pPeerMemoryFeatures)
-{
-    mImpl->vkGetDeviceGroupPeerMemoryFeaturesKHR(snapshotTraceBegin, snapshotTraceBytes, pool, device, heapIndex, localDeviceIndex, remoteDeviceIndex, pPeerMemoryFeatures);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkDevice device, uint32_t heapIndex, uint32_t localDeviceIndex, uint32_t remoteDeviceIndex,
+    VkPeerMemoryFeatureFlags* pPeerMemoryFeatures) {
+    mImpl->vkGetDeviceGroupPeerMemoryFeaturesKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                 device, heapIndex, localDeviceIndex,
+                                                 remoteDeviceIndex, pPeerMemoryFeatures);
 }
 #endif
 #ifdef VK_KHR_device_group
-void VkDecoderSnapshot::vkCmdSetDeviceMaskKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t deviceMask)
-{
-    mImpl->vkCmdSetDeviceMaskKHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, deviceMask);
+void VkDecoderSnapshot::vkCmdSetDeviceMaskKHR(const uint8_t* snapshotTraceBegin,
+                                              size_t snapshotTraceBytes,
+                                              android::base::BumpPool* pool,
+                                              VkCommandBuffer commandBuffer, uint32_t deviceMask) {
+    mImpl->vkCmdSetDeviceMaskKHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                 deviceMask);
 }
 #endif
 #ifdef VK_KHR_device_group
 void VkDecoderSnapshot::vkCmdDispatchBaseKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t baseGroupX,
-    uint32_t baseGroupY,
-    uint32_t baseGroupZ,
-    uint32_t groupCountX,
-    uint32_t groupCountY,
-    uint32_t groupCountZ)
-{
-    mImpl->vkCmdDispatchBaseKHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ,
+    uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ) {
+    mImpl->vkCmdDispatchBaseKHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY,
+                                groupCountZ);
 }
 #endif
 #ifdef VK_KHR_maintenance1
-void VkDecoderSnapshot::vkTrimCommandPoolKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkCommandPool commandPool,
-    VkCommandPoolTrimFlags flags)
-{
-    mImpl->vkTrimCommandPoolKHR(snapshotTraceBegin, snapshotTraceBytes, pool, device, commandPool, flags);
+void VkDecoderSnapshot::vkTrimCommandPoolKHR(const uint8_t* snapshotTraceBegin,
+                                             size_t snapshotTraceBytes,
+                                             android::base::BumpPool* pool, VkDevice device,
+                                             VkCommandPool commandPool,
+                                             VkCommandPoolTrimFlags flags) {
+    mImpl->vkTrimCommandPoolKHR(snapshotTraceBegin, snapshotTraceBytes, pool, device, commandPool,
+                                flags);
 }
 #endif
 #ifdef VK_KHR_device_group_creation
 void VkDecoderSnapshot::vkEnumeratePhysicalDeviceGroupsKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    uint32_t* pPhysicalDeviceGroupCount,
-    VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProperties)
-{
-    mImpl->vkEnumeratePhysicalDeviceGroupsKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, instance, pPhysicalDeviceGroupCount, pPhysicalDeviceGroupProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkInstance instance, uint32_t* pPhysicalDeviceGroupCount,
+    VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProperties) {
+    mImpl->vkEnumeratePhysicalDeviceGroupsKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                              input_result, instance, pPhysicalDeviceGroupCount,
+                                              pPhysicalDeviceGroupProperties);
 }
 #endif
 #ifdef VK_KHR_external_memory_capabilities
 void VkDecoderSnapshot::vkGetPhysicalDeviceExternalBufferPropertiesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    const VkPhysicalDeviceExternalBufferInfo* pExternalBufferInfo,
-    VkExternalBufferProperties* pExternalBufferProperties)
-{
-    mImpl->vkGetPhysicalDeviceExternalBufferPropertiesKHR(snapshotTraceBegin, snapshotTraceBytes, pool, physicalDevice, pExternalBufferInfo, pExternalBufferProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalBufferInfo* pExternalBufferInfo,
+    VkExternalBufferProperties* pExternalBufferProperties) {
+    mImpl->vkGetPhysicalDeviceExternalBufferPropertiesKHR(snapshotTraceBegin, snapshotTraceBytes,
+                                                          pool, physicalDevice, pExternalBufferInfo,
+                                                          pExternalBufferProperties);
 }
 #endif
 #ifdef VK_KHR_external_memory_win32
 void VkDecoderSnapshot::vkGetMemoryWin32HandleKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkMemoryGetWin32HandleInfoKHR* pGetWin32HandleInfo,
-    HANDLE* pHandle)
-{
-    mImpl->vkGetMemoryWin32HandleKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pGetWin32HandleInfo, pHandle);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device,
+    const VkMemoryGetWin32HandleInfoKHR* pGetWin32HandleInfo, HANDLE* pHandle) {
+    mImpl->vkGetMemoryWin32HandleKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                     device, pGetWin32HandleInfo, pHandle);
 }
 #endif
 #ifdef VK_KHR_external_memory_win32
 void VkDecoderSnapshot::vkGetMemoryWin32HandlePropertiesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkExternalMemoryHandleTypeFlagBits handleType,
-    HANDLE handle,
-    VkMemoryWin32HandlePropertiesKHR* pMemoryWin32HandleProperties)
-{
-    mImpl->vkGetMemoryWin32HandlePropertiesKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, handleType, handle, pMemoryWin32HandleProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType,
+    HANDLE handle, VkMemoryWin32HandlePropertiesKHR* pMemoryWin32HandleProperties) {
+    mImpl->vkGetMemoryWin32HandlePropertiesKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                               input_result, device, handleType, handle,
+                                               pMemoryWin32HandleProperties);
 }
 #endif
 #ifdef VK_KHR_external_memory_fd
-void VkDecoderSnapshot::vkGetMemoryFdKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkMemoryGetFdInfoKHR* pGetFdInfo,
-    int* pFd)
-{
-    mImpl->vkGetMemoryFdKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pGetFdInfo, pFd);
+void VkDecoderSnapshot::vkGetMemoryFdKHR(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkResult input_result, VkDevice device,
+                                         const VkMemoryGetFdInfoKHR* pGetFdInfo, int* pFd) {
+    mImpl->vkGetMemoryFdKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                            pGetFdInfo, pFd);
 }
 #endif
 #ifdef VK_KHR_external_memory_fd
 void VkDecoderSnapshot::vkGetMemoryFdPropertiesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkExternalMemoryHandleTypeFlagBits handleType,
-    int fd,
-    VkMemoryFdPropertiesKHR* pMemoryFdProperties)
-{
-    mImpl->vkGetMemoryFdPropertiesKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, handleType, fd, pMemoryFdProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType, int fd,
+    VkMemoryFdPropertiesKHR* pMemoryFdProperties) {
+    mImpl->vkGetMemoryFdPropertiesKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                      device, handleType, fd, pMemoryFdProperties);
 }
 #endif
 #ifdef VK_KHR_external_semaphore_capabilities
 void VkDecoderSnapshot::vkGetPhysicalDeviceExternalSemaphorePropertiesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
     VkPhysicalDevice physicalDevice,
     const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo,
-    VkExternalSemaphoreProperties* pExternalSemaphoreProperties)
-{
-    mImpl->vkGetPhysicalDeviceExternalSemaphorePropertiesKHR(snapshotTraceBegin, snapshotTraceBytes, pool, physicalDevice, pExternalSemaphoreInfo, pExternalSemaphoreProperties);
+    VkExternalSemaphoreProperties* pExternalSemaphoreProperties) {
+    mImpl->vkGetPhysicalDeviceExternalSemaphorePropertiesKHR(
+        snapshotTraceBegin, snapshotTraceBytes, pool, physicalDevice, pExternalSemaphoreInfo,
+        pExternalSemaphoreProperties);
 }
 #endif
 #ifdef VK_KHR_external_semaphore_win32
 void VkDecoderSnapshot::vkImportSemaphoreWin32HandleKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkImportSemaphoreWin32HandleInfoKHR* pImportSemaphoreWin32HandleInfo)
-{
-    mImpl->vkImportSemaphoreWin32HandleKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pImportSemaphoreWin32HandleInfo);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device,
+    const VkImportSemaphoreWin32HandleInfoKHR* pImportSemaphoreWin32HandleInfo) {
+    mImpl->vkImportSemaphoreWin32HandleKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                           input_result, device, pImportSemaphoreWin32HandleInfo);
 }
 #endif
 #ifdef VK_KHR_external_semaphore_win32
 void VkDecoderSnapshot::vkGetSemaphoreWin32HandleKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkSemaphoreGetWin32HandleInfoKHR* pGetWin32HandleInfo,
-    HANDLE* pHandle)
-{
-    mImpl->vkGetSemaphoreWin32HandleKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pGetWin32HandleInfo, pHandle);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device,
+    const VkSemaphoreGetWin32HandleInfoKHR* pGetWin32HandleInfo, HANDLE* pHandle) {
+    mImpl->vkGetSemaphoreWin32HandleKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                        device, pGetWin32HandleInfo, pHandle);
 }
 #endif
 #ifdef VK_KHR_external_semaphore_fd
 void VkDecoderSnapshot::vkImportSemaphoreFdKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkImportSemaphoreFdInfoKHR* pImportSemaphoreFdInfo)
-{
-    mImpl->vkImportSemaphoreFdKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pImportSemaphoreFdInfo);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device,
+    const VkImportSemaphoreFdInfoKHR* pImportSemaphoreFdInfo) {
+    mImpl->vkImportSemaphoreFdKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                  device, pImportSemaphoreFdInfo);
 }
 #endif
 #ifdef VK_KHR_external_semaphore_fd
-void VkDecoderSnapshot::vkGetSemaphoreFdKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkSemaphoreGetFdInfoKHR* pGetFdInfo,
-    int* pFd)
-{
-    mImpl->vkGetSemaphoreFdKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pGetFdInfo, pFd);
+void VkDecoderSnapshot::vkGetSemaphoreFdKHR(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool, VkResult input_result,
+                                            VkDevice device,
+                                            const VkSemaphoreGetFdInfoKHR* pGetFdInfo, int* pFd) {
+    mImpl->vkGetSemaphoreFdKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                               pGetFdInfo, pFd);
 }
 #endif
 #ifdef VK_KHR_push_descriptor
 void VkDecoderSnapshot::vkCmdPushDescriptorSetKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkPipelineBindPoint pipelineBindPoint,
-    VkPipelineLayout layout,
-    uint32_t set,
-    uint32_t descriptorWriteCount,
-    const VkWriteDescriptorSet* pDescriptorWrites)
-{
-    mImpl->vkCmdPushDescriptorSetKHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pipelineBindPoint, layout, set, descriptorWriteCount, pDescriptorWrites);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
+    uint32_t set, uint32_t descriptorWriteCount, const VkWriteDescriptorSet* pDescriptorWrites) {
+    mImpl->vkCmdPushDescriptorSetKHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                     pipelineBindPoint, layout, set, descriptorWriteCount,
+                                     pDescriptorWrites);
 }
 #endif
 #ifdef VK_KHR_push_descriptor
 void VkDecoderSnapshot::vkCmdPushDescriptorSetWithTemplateKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkDescriptorUpdateTemplate descriptorUpdateTemplate,
-    VkPipelineLayout layout,
-    uint32_t set,
-    const void* pData)
-{
-    mImpl->vkCmdPushDescriptorSetWithTemplateKHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, descriptorUpdateTemplate, layout, set, pData);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, VkDescriptorUpdateTemplate descriptorUpdateTemplate,
+    VkPipelineLayout layout, uint32_t set, const void* pData) {
+    mImpl->vkCmdPushDescriptorSetWithTemplateKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                 commandBuffer, descriptorUpdateTemplate, layout,
+                                                 set, pData);
 }
 #endif
 #ifdef VK_KHR_descriptor_update_template
 void VkDecoderSnapshot::vkCreateDescriptorUpdateTemplateKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo,
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkDescriptorUpdateTemplate* pDescriptorUpdateTemplate)
-{
-    mImpl->vkCreateDescriptorUpdateTemplateKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pCreateInfo, pAllocator, pDescriptorUpdateTemplate);
+    VkDescriptorUpdateTemplate* pDescriptorUpdateTemplate) {
+    mImpl->vkCreateDescriptorUpdateTemplateKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                               input_result, device, pCreateInfo, pAllocator,
+                                               pDescriptorUpdateTemplate);
 }
 #endif
 #ifdef VK_KHR_descriptor_update_template
 void VkDecoderSnapshot::vkDestroyDescriptorUpdateTemplateKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkDescriptorUpdateTemplate descriptorUpdateTemplate,
-    const VkAllocationCallbacks* pAllocator)
-{
-    mImpl->vkDestroyDescriptorUpdateTemplateKHR(snapshotTraceBegin, snapshotTraceBytes, pool, device, descriptorUpdateTemplate, pAllocator);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkDevice device, VkDescriptorUpdateTemplate descriptorUpdateTemplate,
+    const VkAllocationCallbacks* pAllocator) {
+    mImpl->vkDestroyDescriptorUpdateTemplateKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                device, descriptorUpdateTemplate, pAllocator);
 }
 #endif
 #ifdef VK_KHR_descriptor_update_template
 void VkDecoderSnapshot::vkUpdateDescriptorSetWithTemplateKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkDescriptorSet descriptorSet,
-    VkDescriptorUpdateTemplate descriptorUpdateTemplate,
-    const void* pData)
-{
-    mImpl->vkUpdateDescriptorSetWithTemplateKHR(snapshotTraceBegin, snapshotTraceBytes, pool, device, descriptorSet, descriptorUpdateTemplate, pData);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkDevice device, VkDescriptorSet descriptorSet,
+    VkDescriptorUpdateTemplate descriptorUpdateTemplate, const void* pData) {
+    mImpl->vkUpdateDescriptorSetWithTemplateKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                device, descriptorSet, descriptorUpdateTemplate,
+                                                pData);
 }
 #endif
 #ifdef VK_KHR_create_renderpass2
 void VkDecoderSnapshot::vkCreateRenderPass2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkRenderPassCreateInfo2* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkRenderPass* pRenderPass)
-{
-    mImpl->vkCreateRenderPass2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pCreateInfo, pAllocator, pRenderPass);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, const VkRenderPassCreateInfo2* pCreateInfo,
+    const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass) {
+    mImpl->vkCreateRenderPass2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                  device, pCreateInfo, pAllocator, pRenderPass);
 }
 #endif
 #ifdef VK_KHR_create_renderpass2
-void VkDecoderSnapshot::vkCmdBeginRenderPass2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkRenderPassBeginInfo* pRenderPassBegin,
-    const VkSubpassBeginInfo* pSubpassBeginInfo)
-{
-    mImpl->vkCmdBeginRenderPass2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pRenderPassBegin, pSubpassBeginInfo);
+void VkDecoderSnapshot::vkCmdBeginRenderPass2KHR(const uint8_t* snapshotTraceBegin,
+                                                 size_t snapshotTraceBytes,
+                                                 android::base::BumpPool* pool,
+                                                 VkCommandBuffer commandBuffer,
+                                                 const VkRenderPassBeginInfo* pRenderPassBegin,
+                                                 const VkSubpassBeginInfo* pSubpassBeginInfo) {
+    mImpl->vkCmdBeginRenderPass2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                    pRenderPassBegin, pSubpassBeginInfo);
 }
 #endif
 #ifdef VK_KHR_create_renderpass2
-void VkDecoderSnapshot::vkCmdNextSubpass2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkSubpassBeginInfo* pSubpassBeginInfo,
-    const VkSubpassEndInfo* pSubpassEndInfo)
-{
-    mImpl->vkCmdNextSubpass2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pSubpassBeginInfo, pSubpassEndInfo);
+void VkDecoderSnapshot::vkCmdNextSubpass2KHR(const uint8_t* snapshotTraceBegin,
+                                             size_t snapshotTraceBytes,
+                                             android::base::BumpPool* pool,
+                                             VkCommandBuffer commandBuffer,
+                                             const VkSubpassBeginInfo* pSubpassBeginInfo,
+                                             const VkSubpassEndInfo* pSubpassEndInfo) {
+    mImpl->vkCmdNextSubpass2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                pSubpassBeginInfo, pSubpassEndInfo);
 }
 #endif
 #ifdef VK_KHR_create_renderpass2
-void VkDecoderSnapshot::vkCmdEndRenderPass2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkSubpassEndInfo* pSubpassEndInfo)
-{
-    mImpl->vkCmdEndRenderPass2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pSubpassEndInfo);
+void VkDecoderSnapshot::vkCmdEndRenderPass2KHR(const uint8_t* snapshotTraceBegin,
+                                               size_t snapshotTraceBytes,
+                                               android::base::BumpPool* pool,
+                                               VkCommandBuffer commandBuffer,
+                                               const VkSubpassEndInfo* pSubpassEndInfo) {
+    mImpl->vkCmdEndRenderPass2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                  pSubpassEndInfo);
 }
 #endif
 #ifdef VK_KHR_shared_presentable_image
-void VkDecoderSnapshot::vkGetSwapchainStatusKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkSwapchainKHR swapchain)
-{
-    mImpl->vkGetSwapchainStatusKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, swapchain);
+void VkDecoderSnapshot::vkGetSwapchainStatusKHR(const uint8_t* snapshotTraceBegin,
+                                                size_t snapshotTraceBytes,
+                                                android::base::BumpPool* pool,
+                                                VkResult input_result, VkDevice device,
+                                                VkSwapchainKHR swapchain) {
+    mImpl->vkGetSwapchainStatusKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                   device, swapchain);
 }
 #endif
 #ifdef VK_KHR_external_fence_capabilities
 void VkDecoderSnapshot::vkGetPhysicalDeviceExternalFencePropertiesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo,
-    VkExternalFenceProperties* pExternalFenceProperties)
-{
-    mImpl->vkGetPhysicalDeviceExternalFencePropertiesKHR(snapshotTraceBegin, snapshotTraceBytes, pool, physicalDevice, pExternalFenceInfo, pExternalFenceProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo,
+    VkExternalFenceProperties* pExternalFenceProperties) {
+    mImpl->vkGetPhysicalDeviceExternalFencePropertiesKHR(snapshotTraceBegin, snapshotTraceBytes,
+                                                         pool, physicalDevice, pExternalFenceInfo,
+                                                         pExternalFenceProperties);
 }
 #endif
 #ifdef VK_KHR_external_fence_win32
 void VkDecoderSnapshot::vkImportFenceWin32HandleKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkImportFenceWin32HandleInfoKHR* pImportFenceWin32HandleInfo)
-{
-    mImpl->vkImportFenceWin32HandleKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pImportFenceWin32HandleInfo);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device,
+    const VkImportFenceWin32HandleInfoKHR* pImportFenceWin32HandleInfo) {
+    mImpl->vkImportFenceWin32HandleKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                       device, pImportFenceWin32HandleInfo);
 }
 #endif
 #ifdef VK_KHR_external_fence_win32
 void VkDecoderSnapshot::vkGetFenceWin32HandleKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkFenceGetWin32HandleInfoKHR* pGetWin32HandleInfo,
-    HANDLE* pHandle)
-{
-    mImpl->vkGetFenceWin32HandleKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pGetWin32HandleInfo, pHandle);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, const VkFenceGetWin32HandleInfoKHR* pGetWin32HandleInfo,
+    HANDLE* pHandle) {
+    mImpl->vkGetFenceWin32HandleKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                    device, pGetWin32HandleInfo, pHandle);
 }
 #endif
 #ifdef VK_KHR_external_fence_fd
-void VkDecoderSnapshot::vkImportFenceFdKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkImportFenceFdInfoKHR* pImportFenceFdInfo)
-{
-    mImpl->vkImportFenceFdKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pImportFenceFdInfo);
+void VkDecoderSnapshot::vkImportFenceFdKHR(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkResult input_result, VkDevice device,
+                                           const VkImportFenceFdInfoKHR* pImportFenceFdInfo) {
+    mImpl->vkImportFenceFdKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                              pImportFenceFdInfo);
 }
 #endif
 #ifdef VK_KHR_external_fence_fd
-void VkDecoderSnapshot::vkGetFenceFdKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkFenceGetFdInfoKHR* pGetFdInfo,
-    int* pFd)
-{
-    mImpl->vkGetFenceFdKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pGetFdInfo, pFd);
+void VkDecoderSnapshot::vkGetFenceFdKHR(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkResult input_result, VkDevice device,
+                                        const VkFenceGetFdInfoKHR* pGetFdInfo, int* pFd) {
+    mImpl->vkGetFenceFdKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                           pGetFdInfo, pFd);
 }
 #endif
 #ifdef VK_KHR_performance_query
 void VkDecoderSnapshot::vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t queueFamilyIndex,
-    uint32_t* pCounterCount,
-    VkPerformanceCounterKHR* pCounters,
-    VkPerformanceCounterDescriptionKHR* pCounterDescriptions)
-{
-    mImpl->vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, queueFamilyIndex, pCounterCount, pCounters, pCounterDescriptions);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
+    uint32_t* pCounterCount, VkPerformanceCounterKHR* pCounters,
+    VkPerformanceCounterDescriptionKHR* pCounterDescriptions) {
+    mImpl->vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
+        snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice,
+        queueFamilyIndex, pCounterCount, pCounters, pCounterDescriptions);
 }
 #endif
 #ifdef VK_KHR_performance_query
 void VkDecoderSnapshot::vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
     VkPhysicalDevice physicalDevice,
-    const VkQueryPoolPerformanceCreateInfoKHR* pPerformanceQueryCreateInfo,
-    uint32_t* pNumPasses)
-{
-    mImpl->vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(snapshotTraceBegin, snapshotTraceBytes, pool, physicalDevice, pPerformanceQueryCreateInfo, pNumPasses);
+    const VkQueryPoolPerformanceCreateInfoKHR* pPerformanceQueryCreateInfo, uint32_t* pNumPasses) {
+    mImpl->vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(
+        snapshotTraceBegin, snapshotTraceBytes, pool, physicalDevice, pPerformanceQueryCreateInfo,
+        pNumPasses);
 }
 #endif
 #ifdef VK_KHR_performance_query
-void VkDecoderSnapshot::vkAcquireProfilingLockKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkAcquireProfilingLockInfoKHR* pInfo)
-{
-    mImpl->vkAcquireProfilingLockKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pInfo);
+void VkDecoderSnapshot::vkAcquireProfilingLockKHR(const uint8_t* snapshotTraceBegin,
+                                                  size_t snapshotTraceBytes,
+                                                  android::base::BumpPool* pool,
+                                                  VkResult input_result, VkDevice device,
+                                                  const VkAcquireProfilingLockInfoKHR* pInfo) {
+    mImpl->vkAcquireProfilingLockKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                     device, pInfo);
 }
 #endif
 #ifdef VK_KHR_performance_query
-void VkDecoderSnapshot::vkReleaseProfilingLockKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device)
-{
+void VkDecoderSnapshot::vkReleaseProfilingLockKHR(const uint8_t* snapshotTraceBegin,
+                                                  size_t snapshotTraceBytes,
+                                                  android::base::BumpPool* pool, VkDevice device) {
     mImpl->vkReleaseProfilingLockKHR(snapshotTraceBegin, snapshotTraceBytes, pool, device);
 }
 #endif
 #ifdef VK_KHR_get_surface_capabilities2
 void VkDecoderSnapshot::vkGetPhysicalDeviceSurfaceCapabilities2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkPhysicalDevice physicalDevice,
     const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo,
-    VkSurfaceCapabilities2KHR* pSurfaceCapabilities)
-{
-    mImpl->vkGetPhysicalDeviceSurfaceCapabilities2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, pSurfaceInfo, pSurfaceCapabilities);
+    VkSurfaceCapabilities2KHR* pSurfaceCapabilities) {
+    mImpl->vkGetPhysicalDeviceSurfaceCapabilities2KHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                      input_result, physicalDevice, pSurfaceInfo,
+                                                      pSurfaceCapabilities);
 }
 #endif
 #ifdef VK_KHR_get_surface_capabilities2
 void VkDecoderSnapshot::vkGetPhysicalDeviceSurfaceFormats2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo,
-    uint32_t* pSurfaceFormatCount,
-    VkSurfaceFormat2KHR* pSurfaceFormats)
-{
-    mImpl->vkGetPhysicalDeviceSurfaceFormats2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, pSurfaceInfo, pSurfaceFormatCount, pSurfaceFormats);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkPhysicalDevice physicalDevice,
+    const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, uint32_t* pSurfaceFormatCount,
+    VkSurfaceFormat2KHR* pSurfaceFormats) {
+    mImpl->vkGetPhysicalDeviceSurfaceFormats2KHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                 input_result, physicalDevice, pSurfaceInfo,
+                                                 pSurfaceFormatCount, pSurfaceFormats);
 }
 #endif
 #ifdef VK_KHR_get_display_properties2
 void VkDecoderSnapshot::vkGetPhysicalDeviceDisplayProperties2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t* pPropertyCount,
-    VkDisplayProperties2KHR* pProperties)
-{
-    mImpl->vkGetPhysicalDeviceDisplayProperties2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, pPropertyCount, pProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount,
+    VkDisplayProperties2KHR* pProperties) {
+    mImpl->vkGetPhysicalDeviceDisplayProperties2KHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                    input_result, physicalDevice, pPropertyCount,
+                                                    pProperties);
 }
 #endif
 #ifdef VK_KHR_get_display_properties2
 void VkDecoderSnapshot::vkGetPhysicalDeviceDisplayPlaneProperties2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t* pPropertyCount,
-    VkDisplayPlaneProperties2KHR* pProperties)
-{
-    mImpl->vkGetPhysicalDeviceDisplayPlaneProperties2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, pPropertyCount, pProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount,
+    VkDisplayPlaneProperties2KHR* pProperties) {
+    mImpl->vkGetPhysicalDeviceDisplayPlaneProperties2KHR(snapshotTraceBegin, snapshotTraceBytes,
+                                                         pool, input_result, physicalDevice,
+                                                         pPropertyCount, pProperties);
 }
 #endif
 #ifdef VK_KHR_get_display_properties2
 void VkDecoderSnapshot::vkGetDisplayModeProperties2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    VkDisplayKHR display,
-    uint32_t* pPropertyCount,
-    VkDisplayModeProperties2KHR* pProperties)
-{
-    mImpl->vkGetDisplayModeProperties2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, display, pPropertyCount, pProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkPhysicalDevice physicalDevice, VkDisplayKHR display,
+    uint32_t* pPropertyCount, VkDisplayModeProperties2KHR* pProperties) {
+    mImpl->vkGetDisplayModeProperties2KHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                          input_result, physicalDevice, display, pPropertyCount,
+                                          pProperties);
 }
 #endif
 #ifdef VK_KHR_get_display_properties2
 void VkDecoderSnapshot::vkGetDisplayPlaneCapabilities2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkPhysicalDevice physicalDevice,
     const VkDisplayPlaneInfo2KHR* pDisplayPlaneInfo,
-    VkDisplayPlaneCapabilities2KHR* pCapabilities)
-{
-    mImpl->vkGetDisplayPlaneCapabilities2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, pDisplayPlaneInfo, pCapabilities);
+    VkDisplayPlaneCapabilities2KHR* pCapabilities) {
+    mImpl->vkGetDisplayPlaneCapabilities2KHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                             input_result, physicalDevice, pDisplayPlaneInfo,
+                                             pCapabilities);
 }
 #endif
 #ifdef VK_KHR_get_memory_requirements2
 void VkDecoderSnapshot::vkGetImageMemoryRequirements2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    const VkImageMemoryRequirementsInfo2* pInfo,
-    VkMemoryRequirements2* pMemoryRequirements)
-{
-    mImpl->vkGetImageMemoryRequirements2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, device, pInfo, pMemoryRequirements);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkDevice device, const VkImageMemoryRequirementsInfo2* pInfo,
+    VkMemoryRequirements2* pMemoryRequirements) {
+    mImpl->vkGetImageMemoryRequirements2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, device,
+                                            pInfo, pMemoryRequirements);
 }
 #endif
 #ifdef VK_KHR_get_memory_requirements2
 void VkDecoderSnapshot::vkGetBufferMemoryRequirements2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    const VkBufferMemoryRequirementsInfo2* pInfo,
-    VkMemoryRequirements2* pMemoryRequirements)
-{
-    mImpl->vkGetBufferMemoryRequirements2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, device, pInfo, pMemoryRequirements);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkDevice device, const VkBufferMemoryRequirementsInfo2* pInfo,
+    VkMemoryRequirements2* pMemoryRequirements) {
+    mImpl->vkGetBufferMemoryRequirements2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, device,
+                                             pInfo, pMemoryRequirements);
 }
 #endif
 #ifdef VK_KHR_get_memory_requirements2
 void VkDecoderSnapshot::vkGetImageSparseMemoryRequirements2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    const VkImageSparseMemoryRequirementsInfo2* pInfo,
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkDevice device, const VkImageSparseMemoryRequirementsInfo2* pInfo,
     uint32_t* pSparseMemoryRequirementCount,
-    VkSparseImageMemoryRequirements2* pSparseMemoryRequirements)
-{
-    mImpl->vkGetImageSparseMemoryRequirements2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, device, pInfo, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
+    VkSparseImageMemoryRequirements2* pSparseMemoryRequirements) {
+    mImpl->vkGetImageSparseMemoryRequirements2KHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                  device, pInfo, pSparseMemoryRequirementCount,
+                                                  pSparseMemoryRequirements);
 }
 #endif
 #ifdef VK_KHR_sampler_ycbcr_conversion
 void VkDecoderSnapshot::vkCreateSamplerYcbcrConversionKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkSamplerYcbcrConversionCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSamplerYcbcrConversion* pYcbcrConversion)
-{
-    mImpl->vkCreateSamplerYcbcrConversionKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pCreateInfo, pAllocator, pYcbcrConversion);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, const VkSamplerYcbcrConversionCreateInfo* pCreateInfo,
+    const VkAllocationCallbacks* pAllocator, VkSamplerYcbcrConversion* pYcbcrConversion) {
+    mImpl->vkCreateSamplerYcbcrConversionKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                             input_result, device, pCreateInfo, pAllocator,
+                                             pYcbcrConversion);
 }
 #endif
 #ifdef VK_KHR_sampler_ycbcr_conversion
 void VkDecoderSnapshot::vkDestroySamplerYcbcrConversionKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkSamplerYcbcrConversion ycbcrConversion,
-    const VkAllocationCallbacks* pAllocator)
-{
-    mImpl->vkDestroySamplerYcbcrConversionKHR(snapshotTraceBegin, snapshotTraceBytes, pool, device, ycbcrConversion, pAllocator);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkDevice device, VkSamplerYcbcrConversion ycbcrConversion,
+    const VkAllocationCallbacks* pAllocator) {
+    mImpl->vkDestroySamplerYcbcrConversionKHR(snapshotTraceBegin, snapshotTraceBytes, pool, device,
+                                              ycbcrConversion, pAllocator);
 }
 #endif
 #ifdef VK_KHR_bind_memory2
-void VkDecoderSnapshot::vkBindBufferMemory2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    uint32_t bindInfoCount,
-    const VkBindBufferMemoryInfo* pBindInfos)
-{
-    mImpl->vkBindBufferMemory2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, bindInfoCount, pBindInfos);
+void VkDecoderSnapshot::vkBindBufferMemory2KHR(const uint8_t* snapshotTraceBegin,
+                                               size_t snapshotTraceBytes,
+                                               android::base::BumpPool* pool, VkResult input_result,
+                                               VkDevice device, uint32_t bindInfoCount,
+                                               const VkBindBufferMemoryInfo* pBindInfos) {
+    mImpl->vkBindBufferMemory2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                  device, bindInfoCount, pBindInfos);
 }
 #endif
 #ifdef VK_KHR_bind_memory2
-void VkDecoderSnapshot::vkBindImageMemory2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    uint32_t bindInfoCount,
-    const VkBindImageMemoryInfo* pBindInfos)
-{
-    mImpl->vkBindImageMemory2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, bindInfoCount, pBindInfos);
+void VkDecoderSnapshot::vkBindImageMemory2KHR(const uint8_t* snapshotTraceBegin,
+                                              size_t snapshotTraceBytes,
+                                              android::base::BumpPool* pool, VkResult input_result,
+                                              VkDevice device, uint32_t bindInfoCount,
+                                              const VkBindImageMemoryInfo* pBindInfos) {
+    mImpl->vkBindImageMemory2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                                 bindInfoCount, pBindInfos);
 }
 #endif
 #ifdef VK_KHR_maintenance3
 void VkDecoderSnapshot::vkGetDescriptorSetLayoutSupportKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
-    VkDescriptorSetLayoutSupport* pSupport)
-{
-    mImpl->vkGetDescriptorSetLayoutSupportKHR(snapshotTraceBegin, snapshotTraceBytes, pool, device, pCreateInfo, pSupport);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkDevice device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
+    VkDescriptorSetLayoutSupport* pSupport) {
+    mImpl->vkGetDescriptorSetLayoutSupportKHR(snapshotTraceBegin, snapshotTraceBytes, pool, device,
+                                              pCreateInfo, pSupport);
 }
 #endif
 #ifdef VK_KHR_draw_indirect_count
 void VkDecoderSnapshot::vkCmdDrawIndirectCountKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBuffer buffer,
-    VkDeviceSize offset,
-    VkBuffer countBuffer,
-    VkDeviceSize countBufferOffset,
-    uint32_t maxDrawCount,
-    uint32_t stride)
-{
-    mImpl->vkCmdDrawIndirectCountKHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
+    VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride) {
+    mImpl->vkCmdDrawIndirectCountKHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                     buffer, offset, countBuffer, countBufferOffset, maxDrawCount,
+                                     stride);
 }
 #endif
 #ifdef VK_KHR_draw_indirect_count
 void VkDecoderSnapshot::vkCmdDrawIndexedIndirectCountKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBuffer buffer,
-    VkDeviceSize offset,
-    VkBuffer countBuffer,
-    VkDeviceSize countBufferOffset,
-    uint32_t maxDrawCount,
-    uint32_t stride)
-{
-    mImpl->vkCmdDrawIndexedIndirectCountKHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
+    VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride) {
+    mImpl->vkCmdDrawIndexedIndirectCountKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                            commandBuffer, buffer, offset, countBuffer,
+                                            countBufferOffset, maxDrawCount, stride);
 }
 #endif
 #ifdef VK_KHR_timeline_semaphore
-void VkDecoderSnapshot::vkGetSemaphoreCounterValueKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkSemaphore semaphore,
-    uint64_t* pValue)
-{
-    mImpl->vkGetSemaphoreCounterValueKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, semaphore, pValue);
+void VkDecoderSnapshot::vkGetSemaphoreCounterValueKHR(const uint8_t* snapshotTraceBegin,
+                                                      size_t snapshotTraceBytes,
+                                                      android::base::BumpPool* pool,
+                                                      VkResult input_result, VkDevice device,
+                                                      VkSemaphore semaphore, uint64_t* pValue) {
+    mImpl->vkGetSemaphoreCounterValueKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                         device, semaphore, pValue);
 }
 #endif
 #ifdef VK_KHR_timeline_semaphore
-void VkDecoderSnapshot::vkWaitSemaphoresKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkSemaphoreWaitInfo* pWaitInfo,
-    uint64_t timeout)
-{
-    mImpl->vkWaitSemaphoresKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pWaitInfo, timeout);
+void VkDecoderSnapshot::vkWaitSemaphoresKHR(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool, VkResult input_result,
+                                            VkDevice device, const VkSemaphoreWaitInfo* pWaitInfo,
+                                            uint64_t timeout) {
+    mImpl->vkWaitSemaphoresKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                               pWaitInfo, timeout);
 }
 #endif
 #ifdef VK_KHR_timeline_semaphore
-void VkDecoderSnapshot::vkSignalSemaphoreKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkSemaphoreSignalInfo* pSignalInfo)
-{
-    mImpl->vkSignalSemaphoreKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pSignalInfo);
+void VkDecoderSnapshot::vkSignalSemaphoreKHR(const uint8_t* snapshotTraceBegin,
+                                             size_t snapshotTraceBytes,
+                                             android::base::BumpPool* pool, VkResult input_result,
+                                             VkDevice device,
+                                             const VkSemaphoreSignalInfo* pSignalInfo) {
+    mImpl->vkSignalSemaphoreKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                                pSignalInfo);
 }
 #endif
 #ifdef VK_KHR_fragment_shading_rate
 void VkDecoderSnapshot::vkGetPhysicalDeviceFragmentShadingRatesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t* pFragmentShadingRateCount,
-    VkPhysicalDeviceFragmentShadingRateKHR* pFragmentShadingRates)
-{
-    mImpl->vkGetPhysicalDeviceFragmentShadingRatesKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, pFragmentShadingRateCount, pFragmentShadingRates);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkPhysicalDevice physicalDevice, uint32_t* pFragmentShadingRateCount,
+    VkPhysicalDeviceFragmentShadingRateKHR* pFragmentShadingRates) {
+    mImpl->vkGetPhysicalDeviceFragmentShadingRatesKHR(
+        snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice,
+        pFragmentShadingRateCount, pFragmentShadingRates);
 }
 #endif
 #ifdef VK_KHR_fragment_shading_rate
 void VkDecoderSnapshot::vkCmdSetFragmentShadingRateKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkExtent2D* pFragmentSize,
-    const VkFragmentShadingRateCombinerOpKHR combinerOps[2])
-{
-    mImpl->vkCmdSetFragmentShadingRateKHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pFragmentSize, combinerOps);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, const VkExtent2D* pFragmentSize,
+    const VkFragmentShadingRateCombinerOpKHR combinerOps[2]) {
+    mImpl->vkCmdSetFragmentShadingRateKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                          commandBuffer, pFragmentSize, combinerOps);
 }
 #endif
 #ifdef VK_KHR_present_wait
-void VkDecoderSnapshot::vkWaitForPresentKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkSwapchainKHR swapchain,
-    uint64_t presentId,
-    uint64_t timeout)
-{
-    mImpl->vkWaitForPresentKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, swapchain, presentId, timeout);
+void VkDecoderSnapshot::vkWaitForPresentKHR(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool, VkResult input_result,
+                                            VkDevice device, VkSwapchainKHR swapchain,
+                                            uint64_t presentId, uint64_t timeout) {
+    mImpl->vkWaitForPresentKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                               swapchain, presentId, timeout);
 }
 #endif
 #ifdef VK_KHR_buffer_device_address
-void VkDecoderSnapshot::vkGetBufferDeviceAddressKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDeviceAddress input_result,
-    VkDevice device,
-    const VkBufferDeviceAddressInfo* pInfo)
-{
-    mImpl->vkGetBufferDeviceAddressKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pInfo);
+void VkDecoderSnapshot::vkGetBufferDeviceAddressKHR(const uint8_t* snapshotTraceBegin,
+                                                    size_t snapshotTraceBytes,
+                                                    android::base::BumpPool* pool,
+                                                    VkDeviceAddress input_result, VkDevice device,
+                                                    const VkBufferDeviceAddressInfo* pInfo) {
+    mImpl->vkGetBufferDeviceAddressKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                       device, pInfo);
 }
 #endif
 #ifdef VK_KHR_buffer_device_address
-void VkDecoderSnapshot::vkGetBufferOpaqueCaptureAddressKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    uint64_t input_result,
-    VkDevice device,
-    const VkBufferDeviceAddressInfo* pInfo)
-{
-    mImpl->vkGetBufferOpaqueCaptureAddressKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pInfo);
+void VkDecoderSnapshot::vkGetBufferOpaqueCaptureAddressKHR(const uint8_t* snapshotTraceBegin,
+                                                           size_t snapshotTraceBytes,
+                                                           android::base::BumpPool* pool,
+                                                           uint64_t input_result, VkDevice device,
+                                                           const VkBufferDeviceAddressInfo* pInfo) {
+    mImpl->vkGetBufferOpaqueCaptureAddressKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                              input_result, device, pInfo);
 }
 #endif
 #ifdef VK_KHR_buffer_device_address
 void VkDecoderSnapshot::vkGetDeviceMemoryOpaqueCaptureAddressKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    uint64_t input_result,
-    VkDevice device,
-    const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo)
-{
-    mImpl->vkGetDeviceMemoryOpaqueCaptureAddressKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pInfo);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    uint64_t input_result, VkDevice device, const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo) {
+    mImpl->vkGetDeviceMemoryOpaqueCaptureAddressKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                    input_result, device, pInfo);
 }
 #endif
 #ifdef VK_KHR_deferred_host_operations
-void VkDecoderSnapshot::vkCreateDeferredOperationKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkAllocationCallbacks* pAllocator,
-    VkDeferredOperationKHR* pDeferredOperation)
-{
-    mImpl->vkCreateDeferredOperationKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pAllocator, pDeferredOperation);
+void VkDecoderSnapshot::vkCreateDeferredOperationKHR(const uint8_t* snapshotTraceBegin,
+                                                     size_t snapshotTraceBytes,
+                                                     android::base::BumpPool* pool,
+                                                     VkResult input_result, VkDevice device,
+                                                     const VkAllocationCallbacks* pAllocator,
+                                                     VkDeferredOperationKHR* pDeferredOperation) {
+    mImpl->vkCreateDeferredOperationKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                        device, pAllocator, pDeferredOperation);
 }
 #endif
 #ifdef VK_KHR_deferred_host_operations
 void VkDecoderSnapshot::vkDestroyDeferredOperationKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkDeferredOperationKHR operation,
-    const VkAllocationCallbacks* pAllocator)
-{
-    mImpl->vkDestroyDeferredOperationKHR(snapshotTraceBegin, snapshotTraceBytes, pool, device, operation, pAllocator);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkDevice device, VkDeferredOperationKHR operation, const VkAllocationCallbacks* pAllocator) {
+    mImpl->vkDestroyDeferredOperationKHR(snapshotTraceBegin, snapshotTraceBytes, pool, device,
+                                         operation, pAllocator);
 }
 #endif
 #ifdef VK_KHR_deferred_host_operations
 void VkDecoderSnapshot::vkGetDeferredOperationMaxConcurrencyKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    uint32_t input_result,
-    VkDevice device,
-    VkDeferredOperationKHR operation)
-{
-    mImpl->vkGetDeferredOperationMaxConcurrencyKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, operation);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    uint32_t input_result, VkDevice device, VkDeferredOperationKHR operation) {
+    mImpl->vkGetDeferredOperationMaxConcurrencyKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                   input_result, device, operation);
 }
 #endif
 #ifdef VK_KHR_deferred_host_operations
-void VkDecoderSnapshot::vkGetDeferredOperationResultKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkDeferredOperationKHR operation)
-{
-    mImpl->vkGetDeferredOperationResultKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, operation);
+void VkDecoderSnapshot::vkGetDeferredOperationResultKHR(const uint8_t* snapshotTraceBegin,
+                                                        size_t snapshotTraceBytes,
+                                                        android::base::BumpPool* pool,
+                                                        VkResult input_result, VkDevice device,
+                                                        VkDeferredOperationKHR operation) {
+    mImpl->vkGetDeferredOperationResultKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                           input_result, device, operation);
 }
 #endif
 #ifdef VK_KHR_deferred_host_operations
-void VkDecoderSnapshot::vkDeferredOperationJoinKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkDeferredOperationKHR operation)
-{
-    mImpl->vkDeferredOperationJoinKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, operation);
+void VkDecoderSnapshot::vkDeferredOperationJoinKHR(const uint8_t* snapshotTraceBegin,
+                                                   size_t snapshotTraceBytes,
+                                                   android::base::BumpPool* pool,
+                                                   VkResult input_result, VkDevice device,
+                                                   VkDeferredOperationKHR operation) {
+    mImpl->vkDeferredOperationJoinKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                      device, operation);
 }
 #endif
 #ifdef VK_KHR_pipeline_executable_properties
 void VkDecoderSnapshot::vkGetPipelineExecutablePropertiesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkPipelineInfoKHR* pPipelineInfo,
-    uint32_t* pExecutableCount,
-    VkPipelineExecutablePropertiesKHR* pProperties)
-{
-    mImpl->vkGetPipelineExecutablePropertiesKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pPipelineInfo, pExecutableCount, pProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, const VkPipelineInfoKHR* pPipelineInfo,
+    uint32_t* pExecutableCount, VkPipelineExecutablePropertiesKHR* pProperties) {
+    mImpl->vkGetPipelineExecutablePropertiesKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                input_result, device, pPipelineInfo,
+                                                pExecutableCount, pProperties);
 }
 #endif
 #ifdef VK_KHR_pipeline_executable_properties
 void VkDecoderSnapshot::vkGetPipelineExecutableStatisticsKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkPipelineExecutableInfoKHR* pExecutableInfo,
-    uint32_t* pStatisticCount,
-    VkPipelineExecutableStatisticKHR* pStatistics)
-{
-    mImpl->vkGetPipelineExecutableStatisticsKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pExecutableInfo, pStatisticCount, pStatistics);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, const VkPipelineExecutableInfoKHR* pExecutableInfo,
+    uint32_t* pStatisticCount, VkPipelineExecutableStatisticKHR* pStatistics) {
+    mImpl->vkGetPipelineExecutableStatisticsKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                input_result, device, pExecutableInfo,
+                                                pStatisticCount, pStatistics);
 }
 #endif
 #ifdef VK_KHR_pipeline_executable_properties
 void VkDecoderSnapshot::vkGetPipelineExecutableInternalRepresentationsKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkPipelineExecutableInfoKHR* pExecutableInfo,
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, const VkPipelineExecutableInfoKHR* pExecutableInfo,
     uint32_t* pInternalRepresentationCount,
-    VkPipelineExecutableInternalRepresentationKHR* pInternalRepresentations)
-{
-    mImpl->vkGetPipelineExecutableInternalRepresentationsKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pExecutableInfo, pInternalRepresentationCount, pInternalRepresentations);
+    VkPipelineExecutableInternalRepresentationKHR* pInternalRepresentations) {
+    mImpl->vkGetPipelineExecutableInternalRepresentationsKHR(
+        snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pExecutableInfo,
+        pInternalRepresentationCount, pInternalRepresentations);
 }
 #endif
 #ifdef VK_KHR_video_encode_queue
-void VkDecoderSnapshot::vkCmdEncodeVideoKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkVideoEncodeInfoKHR* pEncodeInfo)
-{
-    mImpl->vkCmdEncodeVideoKHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pEncodeInfo);
+void VkDecoderSnapshot::vkCmdEncodeVideoKHR(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool,
+                                            VkCommandBuffer commandBuffer,
+                                            const VkVideoEncodeInfoKHR* pEncodeInfo) {
+    mImpl->vkCmdEncodeVideoKHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                               pEncodeInfo);
 }
 #endif
 #ifdef VK_KHR_synchronization2
-void VkDecoderSnapshot::vkCmdSetEvent2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkEvent event,
-    const VkDependencyInfoKHR* pDependencyInfo)
-{
-    mImpl->vkCmdSetEvent2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, event, pDependencyInfo);
+void VkDecoderSnapshot::vkCmdSetEvent2KHR(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkCommandBuffer commandBuffer, VkEvent event,
+                                          const VkDependencyInfoKHR* pDependencyInfo) {
+    mImpl->vkCmdSetEvent2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, event,
+                             pDependencyInfo);
 }
 #endif
 #ifdef VK_KHR_synchronization2
-void VkDecoderSnapshot::vkCmdResetEvent2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkEvent event,
-    VkPipelineStageFlags2KHR stageMask)
-{
-    mImpl->vkCmdResetEvent2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, event, stageMask);
+void VkDecoderSnapshot::vkCmdResetEvent2KHR(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool,
+                                            VkCommandBuffer commandBuffer, VkEvent event,
+                                            VkPipelineStageFlags2KHR stageMask) {
+    mImpl->vkCmdResetEvent2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, event,
+                               stageMask);
 }
 #endif
 #ifdef VK_KHR_synchronization2
-void VkDecoderSnapshot::vkCmdWaitEvents2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t eventCount,
-    const VkEvent* pEvents,
-    const VkDependencyInfoKHR* pDependencyInfos)
-{
-    mImpl->vkCmdWaitEvents2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, eventCount, pEvents, pDependencyInfos);
+void VkDecoderSnapshot::vkCmdWaitEvents2KHR(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool,
+                                            VkCommandBuffer commandBuffer, uint32_t eventCount,
+                                            const VkEvent* pEvents,
+                                            const VkDependencyInfoKHR* pDependencyInfos) {
+    mImpl->vkCmdWaitEvents2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                               eventCount, pEvents, pDependencyInfos);
 }
 #endif
 #ifdef VK_KHR_synchronization2
-void VkDecoderSnapshot::vkCmdPipelineBarrier2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkDependencyInfoKHR* pDependencyInfo)
-{
-    mImpl->vkCmdPipelineBarrier2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pDependencyInfo);
+void VkDecoderSnapshot::vkCmdPipelineBarrier2KHR(const uint8_t* snapshotTraceBegin,
+                                                 size_t snapshotTraceBytes,
+                                                 android::base::BumpPool* pool,
+                                                 VkCommandBuffer commandBuffer,
+                                                 const VkDependencyInfoKHR* pDependencyInfo) {
+    mImpl->vkCmdPipelineBarrier2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                    pDependencyInfo);
 }
 #endif
 #ifdef VK_KHR_synchronization2
-void VkDecoderSnapshot::vkCmdWriteTimestamp2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkPipelineStageFlags2KHR stage,
-    VkQueryPool queryPool,
-    uint32_t query)
-{
-    mImpl->vkCmdWriteTimestamp2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, stage, queryPool, query);
+void VkDecoderSnapshot::vkCmdWriteTimestamp2KHR(const uint8_t* snapshotTraceBegin,
+                                                size_t snapshotTraceBytes,
+                                                android::base::BumpPool* pool,
+                                                VkCommandBuffer commandBuffer,
+                                                VkPipelineStageFlags2KHR stage,
+                                                VkQueryPool queryPool, uint32_t query) {
+    mImpl->vkCmdWriteTimestamp2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                   stage, queryPool, query);
 }
 #endif
 #ifdef VK_KHR_synchronization2
-void VkDecoderSnapshot::vkQueueSubmit2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkQueue queue,
-    uint32_t submitCount,
-    const VkSubmitInfo2KHR* pSubmits,
-    VkFence fence)
-{
-    mImpl->vkQueueSubmit2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, queue, submitCount, pSubmits, fence);
+void VkDecoderSnapshot::vkQueueSubmit2KHR(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkResult input_result, VkQueue queue,
+                                          uint32_t submitCount, const VkSubmitInfo2KHR* pSubmits,
+                                          VkFence fence) {
+    mImpl->vkQueueSubmit2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, queue,
+                             submitCount, pSubmits, fence);
 }
 #endif
 #ifdef VK_KHR_synchronization2
 void VkDecoderSnapshot::vkCmdWriteBufferMarker2AMD(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkPipelineStageFlags2KHR stage,
-    VkBuffer dstBuffer,
-    VkDeviceSize dstOffset,
-    uint32_t marker)
-{
-    mImpl->vkCmdWriteBufferMarker2AMD(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, stage, dstBuffer, dstOffset, marker);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, VkPipelineStageFlags2KHR stage, VkBuffer dstBuffer,
+    VkDeviceSize dstOffset, uint32_t marker) {
+    mImpl->vkCmdWriteBufferMarker2AMD(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                      stage, dstBuffer, dstOffset, marker);
 }
 #endif
 #ifdef VK_KHR_synchronization2
-void VkDecoderSnapshot::vkGetQueueCheckpointData2NV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkQueue queue,
-    uint32_t* pCheckpointDataCount,
-    VkCheckpointData2NV* pCheckpointData)
-{
-    mImpl->vkGetQueueCheckpointData2NV(snapshotTraceBegin, snapshotTraceBytes, pool, queue, pCheckpointDataCount, pCheckpointData);
+void VkDecoderSnapshot::vkGetQueueCheckpointData2NV(const uint8_t* snapshotTraceBegin,
+                                                    size_t snapshotTraceBytes,
+                                                    android::base::BumpPool* pool, VkQueue queue,
+                                                    uint32_t* pCheckpointDataCount,
+                                                    VkCheckpointData2NV* pCheckpointData) {
+    mImpl->vkGetQueueCheckpointData2NV(snapshotTraceBegin, snapshotTraceBytes, pool, queue,
+                                       pCheckpointDataCount, pCheckpointData);
 }
 #endif
 #ifdef VK_KHR_copy_commands2
-void VkDecoderSnapshot::vkCmdCopyBuffer2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkCopyBufferInfo2KHR* pCopyBufferInfo)
-{
-    mImpl->vkCmdCopyBuffer2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pCopyBufferInfo);
+void VkDecoderSnapshot::vkCmdCopyBuffer2KHR(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool,
+                                            VkCommandBuffer commandBuffer,
+                                            const VkCopyBufferInfo2KHR* pCopyBufferInfo) {
+    mImpl->vkCmdCopyBuffer2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                               pCopyBufferInfo);
 }
 #endif
 #ifdef VK_KHR_copy_commands2
-void VkDecoderSnapshot::vkCmdCopyImage2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkCopyImageInfo2KHR* pCopyImageInfo)
-{
-    mImpl->vkCmdCopyImage2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pCopyImageInfo);
+void VkDecoderSnapshot::vkCmdCopyImage2KHR(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkCommandBuffer commandBuffer,
+                                           const VkCopyImageInfo2KHR* pCopyImageInfo) {
+    mImpl->vkCmdCopyImage2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                              pCopyImageInfo);
 }
 #endif
 #ifdef VK_KHR_copy_commands2
 void VkDecoderSnapshot::vkCmdCopyBufferToImage2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkCopyBufferToImageInfo2KHR* pCopyBufferToImageInfo)
-{
-    mImpl->vkCmdCopyBufferToImage2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pCopyBufferToImageInfo);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, const VkCopyBufferToImageInfo2KHR* pCopyBufferToImageInfo) {
+    mImpl->vkCmdCopyBufferToImage2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                      pCopyBufferToImageInfo);
 }
 #endif
 #ifdef VK_KHR_copy_commands2
 void VkDecoderSnapshot::vkCmdCopyImageToBuffer2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkCopyImageToBufferInfo2KHR* pCopyImageToBufferInfo)
-{
-    mImpl->vkCmdCopyImageToBuffer2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pCopyImageToBufferInfo);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, const VkCopyImageToBufferInfo2KHR* pCopyImageToBufferInfo) {
+    mImpl->vkCmdCopyImageToBuffer2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                      pCopyImageToBufferInfo);
 }
 #endif
 #ifdef VK_KHR_copy_commands2
-void VkDecoderSnapshot::vkCmdBlitImage2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkBlitImageInfo2KHR* pBlitImageInfo)
-{
-    mImpl->vkCmdBlitImage2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pBlitImageInfo);
+void VkDecoderSnapshot::vkCmdBlitImage2KHR(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkCommandBuffer commandBuffer,
+                                           const VkBlitImageInfo2KHR* pBlitImageInfo) {
+    mImpl->vkCmdBlitImage2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                              pBlitImageInfo);
 }
 #endif
 #ifdef VK_KHR_copy_commands2
-void VkDecoderSnapshot::vkCmdResolveImage2KHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkResolveImageInfo2KHR* pResolveImageInfo)
-{
-    mImpl->vkCmdResolveImage2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pResolveImageInfo);
+void VkDecoderSnapshot::vkCmdResolveImage2KHR(const uint8_t* snapshotTraceBegin,
+                                              size_t snapshotTraceBytes,
+                                              android::base::BumpPool* pool,
+                                              VkCommandBuffer commandBuffer,
+                                              const VkResolveImageInfo2KHR* pResolveImageInfo) {
+    mImpl->vkCmdResolveImage2KHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                 pResolveImageInfo);
 }
 #endif
 #ifdef VK_KHR_maintenance4
 void VkDecoderSnapshot::vkGetDeviceBufferMemoryRequirementsKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    const VkDeviceBufferMemoryRequirementsKHR* pInfo,
-    VkMemoryRequirements2* pMemoryRequirements)
-{
-    mImpl->vkGetDeviceBufferMemoryRequirementsKHR(snapshotTraceBegin, snapshotTraceBytes, pool, device, pInfo, pMemoryRequirements);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkDevice device, const VkDeviceBufferMemoryRequirementsKHR* pInfo,
+    VkMemoryRequirements2* pMemoryRequirements) {
+    mImpl->vkGetDeviceBufferMemoryRequirementsKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                  device, pInfo, pMemoryRequirements);
 }
 #endif
 #ifdef VK_KHR_maintenance4
 void VkDecoderSnapshot::vkGetDeviceImageMemoryRequirementsKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    const VkDeviceImageMemoryRequirementsKHR* pInfo,
-    VkMemoryRequirements2* pMemoryRequirements)
-{
-    mImpl->vkGetDeviceImageMemoryRequirementsKHR(snapshotTraceBegin, snapshotTraceBytes, pool, device, pInfo, pMemoryRequirements);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkDevice device, const VkDeviceImageMemoryRequirementsKHR* pInfo,
+    VkMemoryRequirements2* pMemoryRequirements) {
+    mImpl->vkGetDeviceImageMemoryRequirementsKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                 device, pInfo, pMemoryRequirements);
 }
 #endif
 #ifdef VK_KHR_maintenance4
 void VkDecoderSnapshot::vkGetDeviceImageSparseMemoryRequirementsKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    const VkDeviceImageMemoryRequirementsKHR* pInfo,
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkDevice device, const VkDeviceImageMemoryRequirementsKHR* pInfo,
     uint32_t* pSparseMemoryRequirementCount,
-    VkSparseImageMemoryRequirements2* pSparseMemoryRequirements)
-{
-    mImpl->vkGetDeviceImageSparseMemoryRequirementsKHR(snapshotTraceBegin, snapshotTraceBytes, pool, device, pInfo, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
+    VkSparseImageMemoryRequirements2* pSparseMemoryRequirements) {
+    mImpl->vkGetDeviceImageSparseMemoryRequirementsKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                       device, pInfo, pSparseMemoryRequirementCount,
+                                                       pSparseMemoryRequirements);
 }
 #endif
 #ifdef VK_ANDROID_native_buffer
 void VkDecoderSnapshot::vkGetSwapchainGrallocUsageANDROID(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkFormat format,
-    VkImageUsageFlags imageUsage,
-    int* grallocUsage)
-{
-    mImpl->vkGetSwapchainGrallocUsageANDROID(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, format, imageUsage, grallocUsage);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, VkFormat format, VkImageUsageFlags imageUsage,
+    int* grallocUsage) {
+    mImpl->vkGetSwapchainGrallocUsageANDROID(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                             input_result, device, format, imageUsage,
+                                             grallocUsage);
 }
 #endif
 #ifdef VK_ANDROID_native_buffer
-void VkDecoderSnapshot::vkAcquireImageANDROID(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkImage image,
-    int nativeFenceFd,
-    VkSemaphore semaphore,
-    VkFence fence)
-{
-    mImpl->vkAcquireImageANDROID(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, image, nativeFenceFd, semaphore, fence);
+void VkDecoderSnapshot::vkAcquireImageANDROID(const uint8_t* snapshotTraceBegin,
+                                              size_t snapshotTraceBytes,
+                                              android::base::BumpPool* pool, VkResult input_result,
+                                              VkDevice device, VkImage image, int nativeFenceFd,
+                                              VkSemaphore semaphore, VkFence fence) {
+    mImpl->vkAcquireImageANDROID(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                                 image, nativeFenceFd, semaphore, fence);
 }
 #endif
 #ifdef VK_ANDROID_native_buffer
 void VkDecoderSnapshot::vkQueueSignalReleaseImageANDROID(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkQueue queue,
-    uint32_t waitSemaphoreCount,
-    const VkSemaphore* pWaitSemaphores,
-    VkImage image,
-    int* pNativeFenceFd)
-{
-    mImpl->vkQueueSignalReleaseImageANDROID(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, queue, waitSemaphoreCount, pWaitSemaphores, image, pNativeFenceFd);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkQueue queue, uint32_t waitSemaphoreCount,
+    const VkSemaphore* pWaitSemaphores, VkImage image, int* pNativeFenceFd) {
+    mImpl->vkQueueSignalReleaseImageANDROID(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                            input_result, queue, waitSemaphoreCount,
+                                            pWaitSemaphores, image, pNativeFenceFd);
 }
 #endif
 #ifdef VK_EXT_debug_report
 void VkDecoderSnapshot::vkCreateDebugReportCallbackEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    const VkDebugReportCallbackCreateInfoEXT* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkDebugReportCallbackEXT* pCallback)
-{
-    mImpl->vkCreateDebugReportCallbackEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, instance, pCreateInfo, pAllocator, pCallback);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkInstance instance,
+    const VkDebugReportCallbackCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator,
+    VkDebugReportCallbackEXT* pCallback) {
+    mImpl->vkCreateDebugReportCallbackEXT(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                          input_result, instance, pCreateInfo, pAllocator,
+                                          pCallback);
 }
 #endif
 #ifdef VK_EXT_debug_report
-void VkDecoderSnapshot::vkDestroyDebugReportCallbackEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkInstance instance,
-    VkDebugReportCallbackEXT callback,
-    const VkAllocationCallbacks* pAllocator)
-{
-    mImpl->vkDestroyDebugReportCallbackEXT(snapshotTraceBegin, snapshotTraceBytes, pool, instance, callback, pAllocator);
+void VkDecoderSnapshot::vkDestroyDebugReportCallbackEXT(const uint8_t* snapshotTraceBegin,
+                                                        size_t snapshotTraceBytes,
+                                                        android::base::BumpPool* pool,
+                                                        VkInstance instance,
+                                                        VkDebugReportCallbackEXT callback,
+                                                        const VkAllocationCallbacks* pAllocator) {
+    mImpl->vkDestroyDebugReportCallbackEXT(snapshotTraceBegin, snapshotTraceBytes, pool, instance,
+                                           callback, pAllocator);
 }
 #endif
 #ifdef VK_EXT_debug_report
 void VkDecoderSnapshot::vkDebugReportMessageEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkInstance instance,
-    VkDebugReportFlagsEXT flags,
-    VkDebugReportObjectTypeEXT objectType,
-    uint64_t object,
-    size_t location,
-    int32_t messageCode,
-    const char* pLayerPrefix,
-    const char* pMessage)
-{
-    mImpl->vkDebugReportMessageEXT(snapshotTraceBegin, snapshotTraceBytes, pool, instance, flags, objectType, object, location, messageCode, pLayerPrefix, pMessage);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType,
+    uint64_t object, size_t location, int32_t messageCode, const char* pLayerPrefix,
+    const char* pMessage) {
+    mImpl->vkDebugReportMessageEXT(snapshotTraceBegin, snapshotTraceBytes, pool, instance, flags,
+                                   objectType, object, location, messageCode, pLayerPrefix,
+                                   pMessage);
 }
 #endif
 #ifdef VK_EXT_debug_marker
 void VkDecoderSnapshot::vkDebugMarkerSetObjectTagEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkDebugMarkerObjectTagInfoEXT* pTagInfo)
-{
-    mImpl->vkDebugMarkerSetObjectTagEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pTagInfo);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, const VkDebugMarkerObjectTagInfoEXT* pTagInfo) {
+    mImpl->vkDebugMarkerSetObjectTagEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                        device, pTagInfo);
 }
 #endif
 #ifdef VK_EXT_debug_marker
 void VkDecoderSnapshot::vkDebugMarkerSetObjectNameEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkDebugMarkerObjectNameInfoEXT* pNameInfo)
-{
-    mImpl->vkDebugMarkerSetObjectNameEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pNameInfo);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, const VkDebugMarkerObjectNameInfoEXT* pNameInfo) {
+    mImpl->vkDebugMarkerSetObjectNameEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                         device, pNameInfo);
 }
 #endif
 #ifdef VK_EXT_debug_marker
-void VkDecoderSnapshot::vkCmdDebugMarkerBeginEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkDebugMarkerMarkerInfoEXT* pMarkerInfo)
-{
-    mImpl->vkCmdDebugMarkerBeginEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pMarkerInfo);
+void VkDecoderSnapshot::vkCmdDebugMarkerBeginEXT(const uint8_t* snapshotTraceBegin,
+                                                 size_t snapshotTraceBytes,
+                                                 android::base::BumpPool* pool,
+                                                 VkCommandBuffer commandBuffer,
+                                                 const VkDebugMarkerMarkerInfoEXT* pMarkerInfo) {
+    mImpl->vkCmdDebugMarkerBeginEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                    pMarkerInfo);
 }
 #endif
 #ifdef VK_EXT_debug_marker
-void VkDecoderSnapshot::vkCmdDebugMarkerEndEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer)
-{
+void VkDecoderSnapshot::vkCmdDebugMarkerEndEXT(const uint8_t* snapshotTraceBegin,
+                                               size_t snapshotTraceBytes,
+                                               android::base::BumpPool* pool,
+                                               VkCommandBuffer commandBuffer) {
     mImpl->vkCmdDebugMarkerEndEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer);
 }
 #endif
 #ifdef VK_EXT_debug_marker
-void VkDecoderSnapshot::vkCmdDebugMarkerInsertEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkDebugMarkerMarkerInfoEXT* pMarkerInfo)
-{
-    mImpl->vkCmdDebugMarkerInsertEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pMarkerInfo);
+void VkDecoderSnapshot::vkCmdDebugMarkerInsertEXT(const uint8_t* snapshotTraceBegin,
+                                                  size_t snapshotTraceBytes,
+                                                  android::base::BumpPool* pool,
+                                                  VkCommandBuffer commandBuffer,
+                                                  const VkDebugMarkerMarkerInfoEXT* pMarkerInfo) {
+    mImpl->vkCmdDebugMarkerInsertEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                     pMarkerInfo);
 }
 #endif
 #ifdef VK_EXT_transform_feedback
 void VkDecoderSnapshot::vkCmdBindTransformFeedbackBuffersEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t firstBinding,
-    uint32_t bindingCount,
-    const VkBuffer* pBuffers,
-    const VkDeviceSize* pOffsets,
-    const VkDeviceSize* pSizes)
-{
-    mImpl->vkCmdBindTransformFeedbackBuffersEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets, pSizes);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
+    const VkBuffer* pBuffers, const VkDeviceSize* pOffsets, const VkDeviceSize* pSizes) {
+    mImpl->vkCmdBindTransformFeedbackBuffersEXT(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                commandBuffer, firstBinding, bindingCount, pBuffers,
+                                                pOffsets, pSizes);
 }
 #endif
 #ifdef VK_EXT_transform_feedback
 void VkDecoderSnapshot::vkCmdBeginTransformFeedbackEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t firstCounterBuffer,
-    uint32_t counterBufferCount,
-    const VkBuffer* pCounterBuffers,
-    const VkDeviceSize* pCounterBufferOffsets)
-{
-    mImpl->vkCmdBeginTransformFeedbackEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, firstCounterBuffer, counterBufferCount, pCounterBuffers, pCounterBufferOffsets);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer, uint32_t counterBufferCount,
+    const VkBuffer* pCounterBuffers, const VkDeviceSize* pCounterBufferOffsets) {
+    mImpl->vkCmdBeginTransformFeedbackEXT(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                          commandBuffer, firstCounterBuffer, counterBufferCount,
+                                          pCounterBuffers, pCounterBufferOffsets);
 }
 #endif
 #ifdef VK_EXT_transform_feedback
 void VkDecoderSnapshot::vkCmdEndTransformFeedbackEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t firstCounterBuffer,
-    uint32_t counterBufferCount,
-    const VkBuffer* pCounterBuffers,
-    const VkDeviceSize* pCounterBufferOffsets)
-{
-    mImpl->vkCmdEndTransformFeedbackEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, firstCounterBuffer, counterBufferCount, pCounterBuffers, pCounterBufferOffsets);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer, uint32_t counterBufferCount,
+    const VkBuffer* pCounterBuffers, const VkDeviceSize* pCounterBufferOffsets) {
+    mImpl->vkCmdEndTransformFeedbackEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                        firstCounterBuffer, counterBufferCount, pCounterBuffers,
+                                        pCounterBufferOffsets);
 }
 #endif
 #ifdef VK_EXT_transform_feedback
-void VkDecoderSnapshot::vkCmdBeginQueryIndexedEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkQueryPool queryPool,
-    uint32_t query,
-    VkQueryControlFlags flags,
-    uint32_t index)
-{
-    mImpl->vkCmdBeginQueryIndexedEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, queryPool, query, flags, index);
+void VkDecoderSnapshot::vkCmdBeginQueryIndexedEXT(const uint8_t* snapshotTraceBegin,
+                                                  size_t snapshotTraceBytes,
+                                                  android::base::BumpPool* pool,
+                                                  VkCommandBuffer commandBuffer,
+                                                  VkQueryPool queryPool, uint32_t query,
+                                                  VkQueryControlFlags flags, uint32_t index) {
+    mImpl->vkCmdBeginQueryIndexedEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                     queryPool, query, flags, index);
 }
 #endif
 #ifdef VK_EXT_transform_feedback
 void VkDecoderSnapshot::vkCmdEndQueryIndexedEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkQueryPool queryPool,
-    uint32_t query,
-    uint32_t index)
-{
-    mImpl->vkCmdEndQueryIndexedEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, queryPool, query, index);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query, uint32_t index) {
+    mImpl->vkCmdEndQueryIndexedEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                   queryPool, query, index);
 }
 #endif
 #ifdef VK_EXT_transform_feedback
 void VkDecoderSnapshot::vkCmdDrawIndirectByteCountEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t instanceCount,
-    uint32_t firstInstance,
-    VkBuffer counterBuffer,
-    VkDeviceSize counterBufferOffset,
-    uint32_t counterOffset,
-    uint32_t vertexStride)
-{
-    mImpl->vkCmdDrawIndirectByteCountEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, instanceCount, firstInstance, counterBuffer, counterBufferOffset, counterOffset, vertexStride);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, uint32_t instanceCount, uint32_t firstInstance,
+    VkBuffer counterBuffer, VkDeviceSize counterBufferOffset, uint32_t counterOffset,
+    uint32_t vertexStride) {
+    mImpl->vkCmdDrawIndirectByteCountEXT(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                         commandBuffer, instanceCount, firstInstance, counterBuffer,
+                                         counterBufferOffset, counterOffset, vertexStride);
 }
 #endif
 #ifdef VK_NVX_binary_import
 void VkDecoderSnapshot::vkCreateCuModuleNVX(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkCuModuleCreateInfoNVX* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkCuModuleNVX* pModule)
-{
-    mImpl->vkCreateCuModuleNVX(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pCreateInfo, pAllocator, pModule);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, const VkCuModuleCreateInfoNVX* pCreateInfo,
+    const VkAllocationCallbacks* pAllocator, VkCuModuleNVX* pModule) {
+    mImpl->vkCreateCuModuleNVX(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                               pCreateInfo, pAllocator, pModule);
 }
 #endif
 #ifdef VK_NVX_binary_import
 void VkDecoderSnapshot::vkCreateCuFunctionNVX(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkCuFunctionCreateInfoNVX* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkCuFunctionNVX* pFunction)
-{
-    mImpl->vkCreateCuFunctionNVX(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pCreateInfo, pAllocator, pFunction);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, const VkCuFunctionCreateInfoNVX* pCreateInfo,
+    const VkAllocationCallbacks* pAllocator, VkCuFunctionNVX* pFunction) {
+    mImpl->vkCreateCuFunctionNVX(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                                 pCreateInfo, pAllocator, pFunction);
 }
 #endif
 #ifdef VK_NVX_binary_import
-void VkDecoderSnapshot::vkDestroyCuModuleNVX(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkCuModuleNVX module,
-    const VkAllocationCallbacks* pAllocator)
-{
-    mImpl->vkDestroyCuModuleNVX(snapshotTraceBegin, snapshotTraceBytes, pool, device, module, pAllocator);
+void VkDecoderSnapshot::vkDestroyCuModuleNVX(const uint8_t* snapshotTraceBegin,
+                                             size_t snapshotTraceBytes,
+                                             android::base::BumpPool* pool, VkDevice device,
+                                             VkCuModuleNVX module,
+                                             const VkAllocationCallbacks* pAllocator) {
+    mImpl->vkDestroyCuModuleNVX(snapshotTraceBegin, snapshotTraceBytes, pool, device, module,
+                                pAllocator);
 }
 #endif
 #ifdef VK_NVX_binary_import
-void VkDecoderSnapshot::vkDestroyCuFunctionNVX(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkCuFunctionNVX function,
-    const VkAllocationCallbacks* pAllocator)
-{
-    mImpl->vkDestroyCuFunctionNVX(snapshotTraceBegin, snapshotTraceBytes, pool, device, function, pAllocator);
+void VkDecoderSnapshot::vkDestroyCuFunctionNVX(const uint8_t* snapshotTraceBegin,
+                                               size_t snapshotTraceBytes,
+                                               android::base::BumpPool* pool, VkDevice device,
+                                               VkCuFunctionNVX function,
+                                               const VkAllocationCallbacks* pAllocator) {
+    mImpl->vkDestroyCuFunctionNVX(snapshotTraceBegin, snapshotTraceBytes, pool, device, function,
+                                  pAllocator);
 }
 #endif
 #ifdef VK_NVX_binary_import
-void VkDecoderSnapshot::vkCmdCuLaunchKernelNVX(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkCuLaunchInfoNVX* pLaunchInfo)
-{
-    mImpl->vkCmdCuLaunchKernelNVX(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pLaunchInfo);
+void VkDecoderSnapshot::vkCmdCuLaunchKernelNVX(const uint8_t* snapshotTraceBegin,
+                                               size_t snapshotTraceBytes,
+                                               android::base::BumpPool* pool,
+                                               VkCommandBuffer commandBuffer,
+                                               const VkCuLaunchInfoNVX* pLaunchInfo) {
+    mImpl->vkCmdCuLaunchKernelNVX(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                  pLaunchInfo);
 }
 #endif
 #ifdef VK_NVX_image_view_handle
-void VkDecoderSnapshot::vkGetImageViewHandleNVX(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    uint32_t input_result,
-    VkDevice device,
-    const VkImageViewHandleInfoNVX* pInfo)
-{
-    mImpl->vkGetImageViewHandleNVX(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pInfo);
+void VkDecoderSnapshot::vkGetImageViewHandleNVX(const uint8_t* snapshotTraceBegin,
+                                                size_t snapshotTraceBytes,
+                                                android::base::BumpPool* pool,
+                                                uint32_t input_result, VkDevice device,
+                                                const VkImageViewHandleInfoNVX* pInfo) {
+    mImpl->vkGetImageViewHandleNVX(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                   device, pInfo);
 }
 #endif
 #ifdef VK_NVX_image_view_handle
-void VkDecoderSnapshot::vkGetImageViewAddressNVX(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkImageView imageView,
-    VkImageViewAddressPropertiesNVX* pProperties)
-{
-    mImpl->vkGetImageViewAddressNVX(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, imageView, pProperties);
+void VkDecoderSnapshot::vkGetImageViewAddressNVX(const uint8_t* snapshotTraceBegin,
+                                                 size_t snapshotTraceBytes,
+                                                 android::base::BumpPool* pool,
+                                                 VkResult input_result, VkDevice device,
+                                                 VkImageView imageView,
+                                                 VkImageViewAddressPropertiesNVX* pProperties) {
+    mImpl->vkGetImageViewAddressNVX(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                    device, imageView, pProperties);
 }
 #endif
 #ifdef VK_AMD_draw_indirect_count
 void VkDecoderSnapshot::vkCmdDrawIndirectCountAMD(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBuffer buffer,
-    VkDeviceSize offset,
-    VkBuffer countBuffer,
-    VkDeviceSize countBufferOffset,
-    uint32_t maxDrawCount,
-    uint32_t stride)
-{
-    mImpl->vkCmdDrawIndirectCountAMD(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
+    VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride) {
+    mImpl->vkCmdDrawIndirectCountAMD(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                     buffer, offset, countBuffer, countBufferOffset, maxDrawCount,
+                                     stride);
 }
 #endif
 #ifdef VK_AMD_draw_indirect_count
 void VkDecoderSnapshot::vkCmdDrawIndexedIndirectCountAMD(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBuffer buffer,
-    VkDeviceSize offset,
-    VkBuffer countBuffer,
-    VkDeviceSize countBufferOffset,
-    uint32_t maxDrawCount,
-    uint32_t stride)
-{
-    mImpl->vkCmdDrawIndexedIndirectCountAMD(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
+    VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride) {
+    mImpl->vkCmdDrawIndexedIndirectCountAMD(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                            commandBuffer, buffer, offset, countBuffer,
+                                            countBufferOffset, maxDrawCount, stride);
 }
 #endif
 #ifdef VK_AMD_shader_info
-void VkDecoderSnapshot::vkGetShaderInfoAMD(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkPipeline pipeline,
-    VkShaderStageFlagBits shaderStage,
-    VkShaderInfoTypeAMD infoType,
-    size_t* pInfoSize,
-    void* pInfo)
-{
-    mImpl->vkGetShaderInfoAMD(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pipeline, shaderStage, infoType, pInfoSize, pInfo);
+void VkDecoderSnapshot::vkGetShaderInfoAMD(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkResult input_result, VkDevice device,
+                                           VkPipeline pipeline, VkShaderStageFlagBits shaderStage,
+                                           VkShaderInfoTypeAMD infoType, size_t* pInfoSize,
+                                           void* pInfo) {
+    mImpl->vkGetShaderInfoAMD(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                              pipeline, shaderStage, infoType, pInfoSize, pInfo);
 }
 #endif
 #ifdef VK_GGP_stream_descriptor_surface
 void VkDecoderSnapshot::vkCreateStreamDescriptorSurfaceGGP(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkInstance instance,
     const VkStreamDescriptorSurfaceCreateInfoGGP* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
-{
-    mImpl->vkCreateStreamDescriptorSurfaceGGP(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, instance, pCreateInfo, pAllocator, pSurface);
+    const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) {
+    mImpl->vkCreateStreamDescriptorSurfaceGGP(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                              input_result, instance, pCreateInfo, pAllocator,
+                                              pSurface);
 }
 #endif
 #ifdef VK_NV_external_memory_capabilities
 void VkDecoderSnapshot::vkGetPhysicalDeviceExternalImageFormatPropertiesNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    VkFormat format,
-    VkImageType type,
-    VkImageTiling tiling,
-    VkImageUsageFlags usage,
-    VkImageCreateFlags flags,
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
+    VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags,
     VkExternalMemoryHandleTypeFlagsNV externalHandleType,
-    VkExternalImageFormatPropertiesNV* pExternalImageFormatProperties)
-{
-    mImpl->vkGetPhysicalDeviceExternalImageFormatPropertiesNV(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, format, type, tiling, usage, flags, externalHandleType, pExternalImageFormatProperties);
+    VkExternalImageFormatPropertiesNV* pExternalImageFormatProperties) {
+    mImpl->vkGetPhysicalDeviceExternalImageFormatPropertiesNV(
+        snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, format, type,
+        tiling, usage, flags, externalHandleType, pExternalImageFormatProperties);
 }
 #endif
 #ifdef VK_NV_external_memory_win32
 void VkDecoderSnapshot::vkGetMemoryWin32HandleNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkDeviceMemory memory,
-    VkExternalMemoryHandleTypeFlagsNV handleType,
-    HANDLE* pHandle)
-{
-    mImpl->vkGetMemoryWin32HandleNV(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, memory, handleType, pHandle);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, VkDeviceMemory memory,
+    VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE* pHandle) {
+    mImpl->vkGetMemoryWin32HandleNV(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                    device, memory, handleType, pHandle);
 }
 #endif
 #ifdef VK_NN_vi_surface
 void VkDecoderSnapshot::vkCreateViSurfaceNN(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    const VkViSurfaceCreateInfoNN* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
-{
-    mImpl->vkCreateViSurfaceNN(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, instance, pCreateInfo, pAllocator, pSurface);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkInstance instance, const VkViSurfaceCreateInfoNN* pCreateInfo,
+    const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) {
+    mImpl->vkCreateViSurfaceNN(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, instance,
+                               pCreateInfo, pAllocator, pSurface);
 }
 #endif
 #ifdef VK_EXT_conditional_rendering
 void VkDecoderSnapshot::vkCmdBeginConditionalRenderingEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
     VkCommandBuffer commandBuffer,
-    const VkConditionalRenderingBeginInfoEXT* pConditionalRenderingBegin)
-{
-    mImpl->vkCmdBeginConditionalRenderingEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pConditionalRenderingBegin);
+    const VkConditionalRenderingBeginInfoEXT* pConditionalRenderingBegin) {
+    mImpl->vkCmdBeginConditionalRenderingEXT(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                             commandBuffer, pConditionalRenderingBegin);
 }
 #endif
 #ifdef VK_EXT_conditional_rendering
-void VkDecoderSnapshot::vkCmdEndConditionalRenderingEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer)
-{
-    mImpl->vkCmdEndConditionalRenderingEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer);
+void VkDecoderSnapshot::vkCmdEndConditionalRenderingEXT(const uint8_t* snapshotTraceBegin,
+                                                        size_t snapshotTraceBytes,
+                                                        android::base::BumpPool* pool,
+                                                        VkCommandBuffer commandBuffer) {
+    mImpl->vkCmdEndConditionalRenderingEXT(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                           commandBuffer);
 }
 #endif
 #ifdef VK_NV_clip_space_w_scaling
-void VkDecoderSnapshot::vkCmdSetViewportWScalingNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t firstViewport,
-    uint32_t viewportCount,
-    const VkViewportWScalingNV* pViewportWScalings)
-{
-    mImpl->vkCmdSetViewportWScalingNV(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, firstViewport, viewportCount, pViewportWScalings);
+void VkDecoderSnapshot::vkCmdSetViewportWScalingNV(const uint8_t* snapshotTraceBegin,
+                                                   size_t snapshotTraceBytes,
+                                                   android::base::BumpPool* pool,
+                                                   VkCommandBuffer commandBuffer,
+                                                   uint32_t firstViewport, uint32_t viewportCount,
+                                                   const VkViewportWScalingNV* pViewportWScalings) {
+    mImpl->vkCmdSetViewportWScalingNV(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                      firstViewport, viewportCount, pViewportWScalings);
 }
 #endif
 #ifdef VK_EXT_direct_mode_display
-void VkDecoderSnapshot::vkReleaseDisplayEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    VkDisplayKHR display)
-{
-    mImpl->vkReleaseDisplayEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, display);
+void VkDecoderSnapshot::vkReleaseDisplayEXT(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool, VkResult input_result,
+                                            VkPhysicalDevice physicalDevice, VkDisplayKHR display) {
+    mImpl->vkReleaseDisplayEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                               physicalDevice, display);
 }
 #endif
 #ifdef VK_EXT_acquire_xlib_display
 void VkDecoderSnapshot::vkAcquireXlibDisplayEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    Display* dpy,
-    VkDisplayKHR display)
-{
-    mImpl->vkAcquireXlibDisplayEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, dpy, display);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkPhysicalDevice physicalDevice, Display* dpy, VkDisplayKHR display) {
+    mImpl->vkAcquireXlibDisplayEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                   physicalDevice, dpy, display);
 }
 #endif
 #ifdef VK_EXT_acquire_xlib_display
-void VkDecoderSnapshot::vkGetRandROutputDisplayEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    Display* dpy,
-    RROutput rrOutput,
-    VkDisplayKHR* pDisplay)
-{
-    mImpl->vkGetRandROutputDisplayEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, dpy, rrOutput, pDisplay);
+void VkDecoderSnapshot::vkGetRandROutputDisplayEXT(const uint8_t* snapshotTraceBegin,
+                                                   size_t snapshotTraceBytes,
+                                                   android::base::BumpPool* pool,
+                                                   VkResult input_result,
+                                                   VkPhysicalDevice physicalDevice, Display* dpy,
+                                                   RROutput rrOutput, VkDisplayKHR* pDisplay) {
+    mImpl->vkGetRandROutputDisplayEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                      physicalDevice, dpy, rrOutput, pDisplay);
 }
 #endif
 #ifdef VK_EXT_display_surface_counter
 void VkDecoderSnapshot::vkGetPhysicalDeviceSurfaceCapabilities2EXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    VkSurfaceKHR surface,
-    VkSurfaceCapabilities2EXT* pSurfaceCapabilities)
-{
-    mImpl->vkGetPhysicalDeviceSurfaceCapabilities2EXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, surface, pSurfaceCapabilities);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
+    VkSurfaceCapabilities2EXT* pSurfaceCapabilities) {
+    mImpl->vkGetPhysicalDeviceSurfaceCapabilities2EXT(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                      input_result, physicalDevice, surface,
+                                                      pSurfaceCapabilities);
 }
 #endif
 #ifdef VK_EXT_display_control
-void VkDecoderSnapshot::vkDisplayPowerControlEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkDisplayKHR display,
-    const VkDisplayPowerInfoEXT* pDisplayPowerInfo)
-{
-    mImpl->vkDisplayPowerControlEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, display, pDisplayPowerInfo);
+void VkDecoderSnapshot::vkDisplayPowerControlEXT(const uint8_t* snapshotTraceBegin,
+                                                 size_t snapshotTraceBytes,
+                                                 android::base::BumpPool* pool,
+                                                 VkResult input_result, VkDevice device,
+                                                 VkDisplayKHR display,
+                                                 const VkDisplayPowerInfoEXT* pDisplayPowerInfo) {
+    mImpl->vkDisplayPowerControlEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                    device, display, pDisplayPowerInfo);
 }
 #endif
 #ifdef VK_EXT_display_control
 void VkDecoderSnapshot::vkRegisterDeviceEventEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkDeviceEventInfoEXT* pDeviceEventInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkFence* pFence)
-{
-    mImpl->vkRegisterDeviceEventEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pDeviceEventInfo, pAllocator, pFence);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, const VkDeviceEventInfoEXT* pDeviceEventInfo,
+    const VkAllocationCallbacks* pAllocator, VkFence* pFence) {
+    mImpl->vkRegisterDeviceEventEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                    device, pDeviceEventInfo, pAllocator, pFence);
 }
 #endif
 #ifdef VK_EXT_display_control
 void VkDecoderSnapshot::vkRegisterDisplayEventEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkDisplayKHR display,
-    const VkDisplayEventInfoEXT* pDisplayEventInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkFence* pFence)
-{
-    mImpl->vkRegisterDisplayEventEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, display, pDisplayEventInfo, pAllocator, pFence);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, VkDisplayKHR display,
+    const VkDisplayEventInfoEXT* pDisplayEventInfo, const VkAllocationCallbacks* pAllocator,
+    VkFence* pFence) {
+    mImpl->vkRegisterDisplayEventEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                     device, display, pDisplayEventInfo, pAllocator, pFence);
 }
 #endif
 #ifdef VK_EXT_display_control
 void VkDecoderSnapshot::vkGetSwapchainCounterEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkSwapchainKHR swapchain,
-    VkSurfaceCounterFlagBitsEXT counter,
-    uint64_t* pCounterValue)
-{
-    mImpl->vkGetSwapchainCounterEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, swapchain, counter, pCounterValue);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, VkSwapchainKHR swapchain,
+    VkSurfaceCounterFlagBitsEXT counter, uint64_t* pCounterValue) {
+    mImpl->vkGetSwapchainCounterEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                    device, swapchain, counter, pCounterValue);
 }
 #endif
 #ifdef VK_GOOGLE_display_timing
 void VkDecoderSnapshot::vkGetRefreshCycleDurationGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkSwapchainKHR swapchain,
-    VkRefreshCycleDurationGOOGLE* pDisplayTimingProperties)
-{
-    mImpl->vkGetRefreshCycleDurationGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, swapchain, pDisplayTimingProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, VkSwapchainKHR swapchain,
+    VkRefreshCycleDurationGOOGLE* pDisplayTimingProperties) {
+    mImpl->vkGetRefreshCycleDurationGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                           input_result, device, swapchain,
+                                           pDisplayTimingProperties);
 }
 #endif
 #ifdef VK_GOOGLE_display_timing
 void VkDecoderSnapshot::vkGetPastPresentationTimingGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkSwapchainKHR swapchain,
-    uint32_t* pPresentationTimingCount,
-    VkPastPresentationTimingGOOGLE* pPresentationTimings)
-{
-    mImpl->vkGetPastPresentationTimingGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, swapchain, pPresentationTimingCount, pPresentationTimings);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, VkSwapchainKHR swapchain,
+    uint32_t* pPresentationTimingCount, VkPastPresentationTimingGOOGLE* pPresentationTimings) {
+    mImpl->vkGetPastPresentationTimingGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                             input_result, device, swapchain,
+                                             pPresentationTimingCount, pPresentationTimings);
 }
 #endif
 #ifdef VK_EXT_discard_rectangles
 void VkDecoderSnapshot::vkCmdSetDiscardRectangleEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t firstDiscardRectangle,
-    uint32_t discardRectangleCount,
-    const VkRect2D* pDiscardRectangles)
-{
-    mImpl->vkCmdSetDiscardRectangleEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, firstDiscardRectangle, discardRectangleCount, pDiscardRectangles);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, uint32_t firstDiscardRectangle, uint32_t discardRectangleCount,
+    const VkRect2D* pDiscardRectangles) {
+    mImpl->vkCmdSetDiscardRectangleEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                       firstDiscardRectangle, discardRectangleCount,
+                                       pDiscardRectangles);
 }
 #endif
 #ifdef VK_EXT_hdr_metadata
-void VkDecoderSnapshot::vkSetHdrMetadataEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    uint32_t swapchainCount,
-    const VkSwapchainKHR* pSwapchains,
-    const VkHdrMetadataEXT* pMetadata)
-{
-    mImpl->vkSetHdrMetadataEXT(snapshotTraceBegin, snapshotTraceBytes, pool, device, swapchainCount, pSwapchains, pMetadata);
+void VkDecoderSnapshot::vkSetHdrMetadataEXT(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool, VkDevice device,
+                                            uint32_t swapchainCount,
+                                            const VkSwapchainKHR* pSwapchains,
+                                            const VkHdrMetadataEXT* pMetadata) {
+    mImpl->vkSetHdrMetadataEXT(snapshotTraceBegin, snapshotTraceBytes, pool, device, swapchainCount,
+                               pSwapchains, pMetadata);
 }
 #endif
 #ifdef VK_MVK_ios_surface
 void VkDecoderSnapshot::vkCreateIOSSurfaceMVK(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    const VkIOSSurfaceCreateInfoMVK* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
-{
-    mImpl->vkCreateIOSSurfaceMVK(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, instance, pCreateInfo, pAllocator, pSurface);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkInstance instance, const VkIOSSurfaceCreateInfoMVK* pCreateInfo,
+    const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) {
+    mImpl->vkCreateIOSSurfaceMVK(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                 instance, pCreateInfo, pAllocator, pSurface);
 }
 #endif
 #ifdef VK_MVK_macos_surface
 void VkDecoderSnapshot::vkCreateMacOSSurfaceMVK(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    const VkMacOSSurfaceCreateInfoMVK* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
-{
-    mImpl->vkCreateMacOSSurfaceMVK(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, instance, pCreateInfo, pAllocator, pSurface);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkInstance instance, const VkMacOSSurfaceCreateInfoMVK* pCreateInfo,
+    const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) {
+    mImpl->vkCreateMacOSSurfaceMVK(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                   instance, pCreateInfo, pAllocator, pSurface);
 }
 #endif
 #ifdef VK_MVK_moltenvk
-void VkDecoderSnapshot::vkGetMTLDeviceMVK(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    void** pMTLDevice)
-{
-    mImpl->vkGetMTLDeviceMVK(snapshotTraceBegin, snapshotTraceBytes, pool, physicalDevice, pMTLDevice);
+void VkDecoderSnapshot::vkGetMTLDeviceMVK(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkPhysicalDevice physicalDevice, void** pMTLDevice) {
+    mImpl->vkGetMTLDeviceMVK(snapshotTraceBegin, snapshotTraceBytes, pool, physicalDevice,
+                             pMTLDevice);
 }
 #endif
 #ifdef VK_MVK_moltenvk
-void VkDecoderSnapshot::vkSetMTLTextureMVK(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkImage image,
-    void* mtlTexture)
-{
-    mImpl->vkSetMTLTextureMVK(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, image, mtlTexture);
+void VkDecoderSnapshot::vkSetMTLTextureMVK(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkResult input_result, VkImage image, void* mtlTexture) {
+    mImpl->vkSetMTLTextureMVK(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, image,
+                              mtlTexture);
 }
 #endif
 #ifdef VK_MVK_moltenvk
-void VkDecoderSnapshot::vkGetMTLTextureMVK(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkImage image,
-    void** pMTLTexture)
-{
+void VkDecoderSnapshot::vkGetMTLTextureMVK(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkImage image, void** pMTLTexture) {
     mImpl->vkGetMTLTextureMVK(snapshotTraceBegin, snapshotTraceBytes, pool, image, pMTLTexture);
 }
 #endif
 #ifdef VK_MVK_moltenvk
-void VkDecoderSnapshot::vkGetMTLBufferMVK(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkBuffer buffer,
-    void** pMTLBuffer)
-{
+void VkDecoderSnapshot::vkGetMTLBufferMVK(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkBuffer buffer, void** pMTLBuffer) {
     mImpl->vkGetMTLBufferMVK(snapshotTraceBegin, snapshotTraceBytes, pool, buffer, pMTLBuffer);
 }
 #endif
 #ifdef VK_MVK_moltenvk
-void VkDecoderSnapshot::vkUseIOSurfaceMVK(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkImage image,
-    void* ioSurface)
-{
-    mImpl->vkUseIOSurfaceMVK(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, image, ioSurface);
+void VkDecoderSnapshot::vkUseIOSurfaceMVK(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkResult input_result, VkImage image, void* ioSurface) {
+    mImpl->vkUseIOSurfaceMVK(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, image,
+                             ioSurface);
 }
 #endif
 #ifdef VK_MVK_moltenvk
-void VkDecoderSnapshot::vkGetIOSurfaceMVK(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkImage image,
-    void** pIOSurface)
-{
+void VkDecoderSnapshot::vkGetIOSurfaceMVK(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkImage image, void** pIOSurface) {
     mImpl->vkGetIOSurfaceMVK(snapshotTraceBegin, snapshotTraceBytes, pool, image, pIOSurface);
 }
 #endif
 #ifdef VK_EXT_debug_utils
 void VkDecoderSnapshot::vkSetDebugUtilsObjectNameEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkDebugUtilsObjectNameInfoEXT* pNameInfo)
-{
-    mImpl->vkSetDebugUtilsObjectNameEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pNameInfo);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, const VkDebugUtilsObjectNameInfoEXT* pNameInfo) {
+    mImpl->vkSetDebugUtilsObjectNameEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                        device, pNameInfo);
 }
 #endif
 #ifdef VK_EXT_debug_utils
-void VkDecoderSnapshot::vkSetDebugUtilsObjectTagEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkDebugUtilsObjectTagInfoEXT* pTagInfo)
-{
-    mImpl->vkSetDebugUtilsObjectTagEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pTagInfo);
+void VkDecoderSnapshot::vkSetDebugUtilsObjectTagEXT(const uint8_t* snapshotTraceBegin,
+                                                    size_t snapshotTraceBytes,
+                                                    android::base::BumpPool* pool,
+                                                    VkResult input_result, VkDevice device,
+                                                    const VkDebugUtilsObjectTagInfoEXT* pTagInfo) {
+    mImpl->vkSetDebugUtilsObjectTagEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                       device, pTagInfo);
 }
 #endif
 #ifdef VK_EXT_debug_utils
-void VkDecoderSnapshot::vkQueueBeginDebugUtilsLabelEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkQueue queue,
-    const VkDebugUtilsLabelEXT* pLabelInfo)
-{
-    mImpl->vkQueueBeginDebugUtilsLabelEXT(snapshotTraceBegin, snapshotTraceBytes, pool, queue, pLabelInfo);
+void VkDecoderSnapshot::vkQueueBeginDebugUtilsLabelEXT(const uint8_t* snapshotTraceBegin,
+                                                       size_t snapshotTraceBytes,
+                                                       android::base::BumpPool* pool, VkQueue queue,
+                                                       const VkDebugUtilsLabelEXT* pLabelInfo) {
+    mImpl->vkQueueBeginDebugUtilsLabelEXT(snapshotTraceBegin, snapshotTraceBytes, pool, queue,
+                                          pLabelInfo);
 }
 #endif
 #ifdef VK_EXT_debug_utils
-void VkDecoderSnapshot::vkQueueEndDebugUtilsLabelEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkQueue queue)
-{
+void VkDecoderSnapshot::vkQueueEndDebugUtilsLabelEXT(const uint8_t* snapshotTraceBegin,
+                                                     size_t snapshotTraceBytes,
+                                                     android::base::BumpPool* pool, VkQueue queue) {
     mImpl->vkQueueEndDebugUtilsLabelEXT(snapshotTraceBegin, snapshotTraceBytes, pool, queue);
 }
 #endif
 #ifdef VK_EXT_debug_utils
-void VkDecoderSnapshot::vkQueueInsertDebugUtilsLabelEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkQueue queue,
-    const VkDebugUtilsLabelEXT* pLabelInfo)
-{
-    mImpl->vkQueueInsertDebugUtilsLabelEXT(snapshotTraceBegin, snapshotTraceBytes, pool, queue, pLabelInfo);
+void VkDecoderSnapshot::vkQueueInsertDebugUtilsLabelEXT(const uint8_t* snapshotTraceBegin,
+                                                        size_t snapshotTraceBytes,
+                                                        android::base::BumpPool* pool,
+                                                        VkQueue queue,
+                                                        const VkDebugUtilsLabelEXT* pLabelInfo) {
+    mImpl->vkQueueInsertDebugUtilsLabelEXT(snapshotTraceBegin, snapshotTraceBytes, pool, queue,
+                                           pLabelInfo);
 }
 #endif
 #ifdef VK_EXT_debug_utils
-void VkDecoderSnapshot::vkCmdBeginDebugUtilsLabelEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkDebugUtilsLabelEXT* pLabelInfo)
-{
-    mImpl->vkCmdBeginDebugUtilsLabelEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pLabelInfo);
+void VkDecoderSnapshot::vkCmdBeginDebugUtilsLabelEXT(const uint8_t* snapshotTraceBegin,
+                                                     size_t snapshotTraceBytes,
+                                                     android::base::BumpPool* pool,
+                                                     VkCommandBuffer commandBuffer,
+                                                     const VkDebugUtilsLabelEXT* pLabelInfo) {
+    mImpl->vkCmdBeginDebugUtilsLabelEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                        pLabelInfo);
 }
 #endif
 #ifdef VK_EXT_debug_utils
-void VkDecoderSnapshot::vkCmdEndDebugUtilsLabelEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer)
-{
+void VkDecoderSnapshot::vkCmdEndDebugUtilsLabelEXT(const uint8_t* snapshotTraceBegin,
+                                                   size_t snapshotTraceBytes,
+                                                   android::base::BumpPool* pool,
+                                                   VkCommandBuffer commandBuffer) {
     mImpl->vkCmdEndDebugUtilsLabelEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer);
 }
 #endif
 #ifdef VK_EXT_debug_utils
-void VkDecoderSnapshot::vkCmdInsertDebugUtilsLabelEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkDebugUtilsLabelEXT* pLabelInfo)
-{
-    mImpl->vkCmdInsertDebugUtilsLabelEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pLabelInfo);
+void VkDecoderSnapshot::vkCmdInsertDebugUtilsLabelEXT(const uint8_t* snapshotTraceBegin,
+                                                      size_t snapshotTraceBytes,
+                                                      android::base::BumpPool* pool,
+                                                      VkCommandBuffer commandBuffer,
+                                                      const VkDebugUtilsLabelEXT* pLabelInfo) {
+    mImpl->vkCmdInsertDebugUtilsLabelEXT(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                         commandBuffer, pLabelInfo);
 }
 #endif
 #ifdef VK_EXT_debug_utils
 void VkDecoderSnapshot::vkCreateDebugUtilsMessengerEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkDebugUtilsMessengerEXT* pMessenger)
-{
-    mImpl->vkCreateDebugUtilsMessengerEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, instance, pCreateInfo, pAllocator, pMessenger);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkInstance instance,
+    const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator,
+    VkDebugUtilsMessengerEXT* pMessenger) {
+    mImpl->vkCreateDebugUtilsMessengerEXT(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                          input_result, instance, pCreateInfo, pAllocator,
+                                          pMessenger);
 }
 #endif
 #ifdef VK_EXT_debug_utils
-void VkDecoderSnapshot::vkDestroyDebugUtilsMessengerEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkInstance instance,
-    VkDebugUtilsMessengerEXT messenger,
-    const VkAllocationCallbacks* pAllocator)
-{
-    mImpl->vkDestroyDebugUtilsMessengerEXT(snapshotTraceBegin, snapshotTraceBytes, pool, instance, messenger, pAllocator);
+void VkDecoderSnapshot::vkDestroyDebugUtilsMessengerEXT(const uint8_t* snapshotTraceBegin,
+                                                        size_t snapshotTraceBytes,
+                                                        android::base::BumpPool* pool,
+                                                        VkInstance instance,
+                                                        VkDebugUtilsMessengerEXT messenger,
+                                                        const VkAllocationCallbacks* pAllocator) {
+    mImpl->vkDestroyDebugUtilsMessengerEXT(snapshotTraceBegin, snapshotTraceBytes, pool, instance,
+                                           messenger, pAllocator);
 }
 #endif
 #ifdef VK_EXT_debug_utils
 void VkDecoderSnapshot::vkSubmitDebugUtilsMessageEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkInstance instance,
-    VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkInstance instance, VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
     VkDebugUtilsMessageTypeFlagsEXT messageTypes,
-    const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData)
-{
-    mImpl->vkSubmitDebugUtilsMessageEXT(snapshotTraceBegin, snapshotTraceBytes, pool, instance, messageSeverity, messageTypes, pCallbackData);
+    const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData) {
+    mImpl->vkSubmitDebugUtilsMessageEXT(snapshotTraceBegin, snapshotTraceBytes, pool, instance,
+                                        messageSeverity, messageTypes, pCallbackData);
 }
 #endif
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
 void VkDecoderSnapshot::vkGetAndroidHardwareBufferPropertiesANDROID(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const AHardwareBuffer* buffer,
-    VkAndroidHardwareBufferPropertiesANDROID* pProperties)
-{
-    mImpl->vkGetAndroidHardwareBufferPropertiesANDROID(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, buffer, pProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, const AHardwareBuffer* buffer,
+    VkAndroidHardwareBufferPropertiesANDROID* pProperties) {
+    mImpl->vkGetAndroidHardwareBufferPropertiesANDROID(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                       input_result, device, buffer, pProperties);
 }
 #endif
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
 void VkDecoderSnapshot::vkGetMemoryAndroidHardwareBufferANDROID(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo,
-    AHardwareBuffer** pBuffer)
-{
-    mImpl->vkGetMemoryAndroidHardwareBufferANDROID(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pInfo, pBuffer);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device,
+    const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo, AHardwareBuffer** pBuffer) {
+    mImpl->vkGetMemoryAndroidHardwareBufferANDROID(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                   input_result, device, pInfo, pBuffer);
 }
 #endif
 #ifdef VK_EXT_sample_locations
 void VkDecoderSnapshot::vkCmdSetSampleLocationsEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkSampleLocationsInfoEXT* pSampleLocationsInfo)
-{
-    mImpl->vkCmdSetSampleLocationsEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pSampleLocationsInfo);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, const VkSampleLocationsInfoEXT* pSampleLocationsInfo) {
+    mImpl->vkCmdSetSampleLocationsEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                      pSampleLocationsInfo);
 }
 #endif
 #ifdef VK_EXT_sample_locations
 void VkDecoderSnapshot::vkGetPhysicalDeviceMultisamplePropertiesEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkPhysicalDevice physicalDevice,
-    VkSampleCountFlagBits samples,
-    VkMultisamplePropertiesEXT* pMultisampleProperties)
-{
-    mImpl->vkGetPhysicalDeviceMultisamplePropertiesEXT(snapshotTraceBegin, snapshotTraceBytes, pool, physicalDevice, samples, pMultisampleProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkPhysicalDevice physicalDevice, VkSampleCountFlagBits samples,
+    VkMultisamplePropertiesEXT* pMultisampleProperties) {
+    mImpl->vkGetPhysicalDeviceMultisamplePropertiesEXT(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                       physicalDevice, samples,
+                                                       pMultisampleProperties);
 }
 #endif
 #ifdef VK_EXT_image_drm_format_modifier
 void VkDecoderSnapshot::vkGetImageDrmFormatModifierPropertiesEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkImage image,
-    VkImageDrmFormatModifierPropertiesEXT* pProperties)
-{
-    mImpl->vkGetImageDrmFormatModifierPropertiesEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, image, pProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, VkImage image,
+    VkImageDrmFormatModifierPropertiesEXT* pProperties) {
+    mImpl->vkGetImageDrmFormatModifierPropertiesEXT(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                    input_result, device, image, pProperties);
 }
 #endif
 #ifdef VK_EXT_validation_cache
 void VkDecoderSnapshot::vkCreateValidationCacheEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkValidationCacheCreateInfoEXT* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkValidationCacheEXT* pValidationCache)
-{
-    mImpl->vkCreateValidationCacheEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pCreateInfo, pAllocator, pValidationCache);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, const VkValidationCacheCreateInfoEXT* pCreateInfo,
+    const VkAllocationCallbacks* pAllocator, VkValidationCacheEXT* pValidationCache) {
+    mImpl->vkCreateValidationCacheEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                      device, pCreateInfo, pAllocator, pValidationCache);
 }
 #endif
 #ifdef VK_EXT_validation_cache
-void VkDecoderSnapshot::vkDestroyValidationCacheEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkValidationCacheEXT validationCache,
-    const VkAllocationCallbacks* pAllocator)
-{
-    mImpl->vkDestroyValidationCacheEXT(snapshotTraceBegin, snapshotTraceBytes, pool, device, validationCache, pAllocator);
+void VkDecoderSnapshot::vkDestroyValidationCacheEXT(const uint8_t* snapshotTraceBegin,
+                                                    size_t snapshotTraceBytes,
+                                                    android::base::BumpPool* pool, VkDevice device,
+                                                    VkValidationCacheEXT validationCache,
+                                                    const VkAllocationCallbacks* pAllocator) {
+    mImpl->vkDestroyValidationCacheEXT(snapshotTraceBegin, snapshotTraceBytes, pool, device,
+                                       validationCache, pAllocator);
 }
 #endif
 #ifdef VK_EXT_validation_cache
 void VkDecoderSnapshot::vkMergeValidationCachesEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkValidationCacheEXT dstCache,
-    uint32_t srcCacheCount,
-    const VkValidationCacheEXT* pSrcCaches)
-{
-    mImpl->vkMergeValidationCachesEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, dstCache, srcCacheCount, pSrcCaches);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, VkValidationCacheEXT dstCache, uint32_t srcCacheCount,
+    const VkValidationCacheEXT* pSrcCaches) {
+    mImpl->vkMergeValidationCachesEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                      device, dstCache, srcCacheCount, pSrcCaches);
 }
 #endif
 #ifdef VK_EXT_validation_cache
-void VkDecoderSnapshot::vkGetValidationCacheDataEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkValidationCacheEXT validationCache,
-    size_t* pDataSize,
-    void* pData)
-{
-    mImpl->vkGetValidationCacheDataEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, validationCache, pDataSize, pData);
+void VkDecoderSnapshot::vkGetValidationCacheDataEXT(const uint8_t* snapshotTraceBegin,
+                                                    size_t snapshotTraceBytes,
+                                                    android::base::BumpPool* pool,
+                                                    VkResult input_result, VkDevice device,
+                                                    VkValidationCacheEXT validationCache,
+                                                    size_t* pDataSize, void* pData) {
+    mImpl->vkGetValidationCacheDataEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                       device, validationCache, pDataSize, pData);
 }
 #endif
 #ifdef VK_NV_shading_rate_image
 void VkDecoderSnapshot::vkCmdBindShadingRateImageNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkImageView imageView,
-    VkImageLayout imageLayout)
-{
-    mImpl->vkCmdBindShadingRateImageNV(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, imageView, imageLayout);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, VkImageView imageView, VkImageLayout imageLayout) {
+    mImpl->vkCmdBindShadingRateImageNV(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                       imageView, imageLayout);
 }
 #endif
 #ifdef VK_NV_shading_rate_image
 void VkDecoderSnapshot::vkCmdSetViewportShadingRatePaletteNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t firstViewport,
-    uint32_t viewportCount,
-    const VkShadingRatePaletteNV* pShadingRatePalettes)
-{
-    mImpl->vkCmdSetViewportShadingRatePaletteNV(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, firstViewport, viewportCount, pShadingRatePalettes);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount,
+    const VkShadingRatePaletteNV* pShadingRatePalettes) {
+    mImpl->vkCmdSetViewportShadingRatePaletteNV(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                commandBuffer, firstViewport, viewportCount,
+                                                pShadingRatePalettes);
 }
 #endif
 #ifdef VK_NV_shading_rate_image
 void VkDecoderSnapshot::vkCmdSetCoarseSampleOrderNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkCoarseSampleOrderTypeNV sampleOrderType,
-    uint32_t customSampleOrderCount,
-    const VkCoarseSampleOrderCustomNV* pCustomSampleOrders)
-{
-    mImpl->vkCmdSetCoarseSampleOrderNV(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, sampleOrderType, customSampleOrderCount, pCustomSampleOrders);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, VkCoarseSampleOrderTypeNV sampleOrderType,
+    uint32_t customSampleOrderCount, const VkCoarseSampleOrderCustomNV* pCustomSampleOrders) {
+    mImpl->vkCmdSetCoarseSampleOrderNV(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                       sampleOrderType, customSampleOrderCount,
+                                       pCustomSampleOrders);
 }
 #endif
 #ifdef VK_NV_ray_tracing
 void VkDecoderSnapshot::vkCreateAccelerationStructureNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkAccelerationStructureCreateInfoNV* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkAccelerationStructureNV* pAccelerationStructure)
-{
-    mImpl->vkCreateAccelerationStructureNV(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pCreateInfo, pAllocator, pAccelerationStructure);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, const VkAccelerationStructureCreateInfoNV* pCreateInfo,
+    const VkAllocationCallbacks* pAllocator, VkAccelerationStructureNV* pAccelerationStructure) {
+    mImpl->vkCreateAccelerationStructureNV(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                           input_result, device, pCreateInfo, pAllocator,
+                                           pAccelerationStructure);
 }
 #endif
 #ifdef VK_NV_ray_tracing
 void VkDecoderSnapshot::vkDestroyAccelerationStructureNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkAccelerationStructureNV accelerationStructure,
-    const VkAllocationCallbacks* pAllocator)
-{
-    mImpl->vkDestroyAccelerationStructureNV(snapshotTraceBegin, snapshotTraceBytes, pool, device, accelerationStructure, pAllocator);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkDevice device, VkAccelerationStructureNV accelerationStructure,
+    const VkAllocationCallbacks* pAllocator) {
+    mImpl->vkDestroyAccelerationStructureNV(snapshotTraceBegin, snapshotTraceBytes, pool, device,
+                                            accelerationStructure, pAllocator);
 }
 #endif
 #ifdef VK_NV_ray_tracing
 void VkDecoderSnapshot::vkGetAccelerationStructureMemoryRequirementsNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    const VkAccelerationStructureMemoryRequirementsInfoNV* pInfo,
-    VkMemoryRequirements2KHR* pMemoryRequirements)
-{
-    mImpl->vkGetAccelerationStructureMemoryRequirementsNV(snapshotTraceBegin, snapshotTraceBytes, pool, device, pInfo, pMemoryRequirements);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkDevice device, const VkAccelerationStructureMemoryRequirementsInfoNV* pInfo,
+    VkMemoryRequirements2KHR* pMemoryRequirements) {
+    mImpl->vkGetAccelerationStructureMemoryRequirementsNV(snapshotTraceBegin, snapshotTraceBytes,
+                                                          pool, device, pInfo, pMemoryRequirements);
 }
 #endif
 #ifdef VK_NV_ray_tracing
 void VkDecoderSnapshot::vkBindAccelerationStructureMemoryNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    uint32_t bindInfoCount,
-    const VkBindAccelerationStructureMemoryInfoNV* pBindInfos)
-{
-    mImpl->vkBindAccelerationStructureMemoryNV(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, bindInfoCount, pBindInfos);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, uint32_t bindInfoCount,
+    const VkBindAccelerationStructureMemoryInfoNV* pBindInfos) {
+    mImpl->vkBindAccelerationStructureMemoryNV(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                               input_result, device, bindInfoCount, pBindInfos);
 }
 #endif
 #ifdef VK_NV_ray_tracing
 void VkDecoderSnapshot::vkCmdBuildAccelerationStructureNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkAccelerationStructureInfoNV* pInfo,
-    VkBuffer instanceData,
-    VkDeviceSize instanceOffset,
-    VkBool32 update,
-    VkAccelerationStructureNV dst,
-    VkAccelerationStructureNV src,
-    VkBuffer scratch,
-    VkDeviceSize scratchOffset)
-{
-    mImpl->vkCmdBuildAccelerationStructureNV(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pInfo, instanceData, instanceOffset, update, dst, src, scratch, scratchOffset);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, const VkAccelerationStructureInfoNV* pInfo,
+    VkBuffer instanceData, VkDeviceSize instanceOffset, VkBool32 update,
+    VkAccelerationStructureNV dst, VkAccelerationStructureNV src, VkBuffer scratch,
+    VkDeviceSize scratchOffset) {
+    mImpl->vkCmdBuildAccelerationStructureNV(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                             commandBuffer, pInfo, instanceData, instanceOffset,
+                                             update, dst, src, scratch, scratchOffset);
 }
 #endif
 #ifdef VK_NV_ray_tracing
 void VkDecoderSnapshot::vkCmdCopyAccelerationStructureNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkAccelerationStructureNV dst,
-    VkAccelerationStructureNV src,
-    VkCopyAccelerationStructureModeKHR mode)
-{
-    mImpl->vkCmdCopyAccelerationStructureNV(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, dst, src, mode);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, VkAccelerationStructureNV dst, VkAccelerationStructureNV src,
+    VkCopyAccelerationStructureModeKHR mode) {
+    mImpl->vkCmdCopyAccelerationStructureNV(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                            commandBuffer, dst, src, mode);
 }
 #endif
 #ifdef VK_NV_ray_tracing
 void VkDecoderSnapshot::vkCmdTraceRaysNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBuffer raygenShaderBindingTableBuffer,
-    VkDeviceSize raygenShaderBindingOffset,
-    VkBuffer missShaderBindingTableBuffer,
-    VkDeviceSize missShaderBindingOffset,
-    VkDeviceSize missShaderBindingStride,
-    VkBuffer hitShaderBindingTableBuffer,
-    VkDeviceSize hitShaderBindingOffset,
-    VkDeviceSize hitShaderBindingStride,
-    VkBuffer callableShaderBindingTableBuffer,
-    VkDeviceSize callableShaderBindingOffset,
-    VkDeviceSize callableShaderBindingStride,
-    uint32_t width,
-    uint32_t height,
-    uint32_t depth)
-{
-    mImpl->vkCmdTraceRaysNV(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, raygenShaderBindingTableBuffer, raygenShaderBindingOffset, missShaderBindingTableBuffer, missShaderBindingOffset, missShaderBindingStride, hitShaderBindingTableBuffer, hitShaderBindingOffset, hitShaderBindingStride, callableShaderBindingTableBuffer, callableShaderBindingOffset, callableShaderBindingStride, width, height, depth);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
+    VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
+    VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
+    VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
+    VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
+    VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
+    uint32_t width, uint32_t height, uint32_t depth) {
+    mImpl->vkCmdTraceRaysNV(
+        snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, raygenShaderBindingTableBuffer,
+        raygenShaderBindingOffset, missShaderBindingTableBuffer, missShaderBindingOffset,
+        missShaderBindingStride, hitShaderBindingTableBuffer, hitShaderBindingOffset,
+        hitShaderBindingStride, callableShaderBindingTableBuffer, callableShaderBindingOffset,
+        callableShaderBindingStride, width, height, depth);
 }
 #endif
 #ifdef VK_NV_ray_tracing
 void VkDecoderSnapshot::vkCreateRayTracingPipelinesNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkPipelineCache pipelineCache,
-    uint32_t createInfoCount,
-    const VkRayTracingPipelineCreateInfoNV* pCreateInfos,
-    const VkAllocationCallbacks* pAllocator,
-    VkPipeline* pPipelines)
-{
-    mImpl->vkCreateRayTracingPipelinesNV(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
+    const VkRayTracingPipelineCreateInfoNV* pCreateInfos, const VkAllocationCallbacks* pAllocator,
+    VkPipeline* pPipelines) {
+    mImpl->vkCreateRayTracingPipelinesNV(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                         device, pipelineCache, createInfoCount, pCreateInfos,
+                                         pAllocator, pPipelines);
 }
 #endif
 #ifdef VK_NV_ray_tracing
 void VkDecoderSnapshot::vkGetRayTracingShaderGroupHandlesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkPipeline pipeline,
-    uint32_t firstGroup,
-    uint32_t groupCount,
-    size_t dataSize,
-    void* pData)
-{
-    mImpl->vkGetRayTracingShaderGroupHandlesKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pipeline, firstGroup, groupCount, dataSize, pData);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, VkPipeline pipeline, uint32_t firstGroup,
+    uint32_t groupCount, size_t dataSize, void* pData) {
+    mImpl->vkGetRayTracingShaderGroupHandlesKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                input_result, device, pipeline, firstGroup,
+                                                groupCount, dataSize, pData);
 }
 #endif
 #ifdef VK_NV_ray_tracing
 void VkDecoderSnapshot::vkGetRayTracingShaderGroupHandlesNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkPipeline pipeline,
-    uint32_t firstGroup,
-    uint32_t groupCount,
-    size_t dataSize,
-    void* pData)
-{
-    mImpl->vkGetRayTracingShaderGroupHandlesNV(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pipeline, firstGroup, groupCount, dataSize, pData);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, VkPipeline pipeline, uint32_t firstGroup,
+    uint32_t groupCount, size_t dataSize, void* pData) {
+    mImpl->vkGetRayTracingShaderGroupHandlesNV(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                               input_result, device, pipeline, firstGroup,
+                                               groupCount, dataSize, pData);
 }
 #endif
 #ifdef VK_NV_ray_tracing
 void VkDecoderSnapshot::vkGetAccelerationStructureHandleNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkAccelerationStructureNV accelerationStructure,
-    size_t dataSize,
-    void* pData)
-{
-    mImpl->vkGetAccelerationStructureHandleNV(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, accelerationStructure, dataSize, pData);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, VkAccelerationStructureNV accelerationStructure,
+    size_t dataSize, void* pData) {
+    mImpl->vkGetAccelerationStructureHandleNV(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                              input_result, device, accelerationStructure, dataSize,
+                                              pData);
 }
 #endif
 #ifdef VK_NV_ray_tracing
 void VkDecoderSnapshot::vkCmdWriteAccelerationStructuresPropertiesNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t accelerationStructureCount,
-    const VkAccelerationStructureNV* pAccelerationStructures,
-    VkQueryType queryType,
-    VkQueryPool queryPool,
-    uint32_t firstQuery)
-{
-    mImpl->vkCmdWriteAccelerationStructuresPropertiesNV(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, accelerationStructureCount, pAccelerationStructures, queryType, queryPool, firstQuery);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, uint32_t accelerationStructureCount,
+    const VkAccelerationStructureNV* pAccelerationStructures, VkQueryType queryType,
+    VkQueryPool queryPool, uint32_t firstQuery) {
+    mImpl->vkCmdWriteAccelerationStructuresPropertiesNV(
+        snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, accelerationStructureCount,
+        pAccelerationStructures, queryType, queryPool, firstQuery);
 }
 #endif
 #ifdef VK_NV_ray_tracing
-void VkDecoderSnapshot::vkCompileDeferredNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkPipeline pipeline,
-    uint32_t shader)
-{
-    mImpl->vkCompileDeferredNV(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pipeline, shader);
+void VkDecoderSnapshot::vkCompileDeferredNV(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool, VkResult input_result,
+                                            VkDevice device, VkPipeline pipeline, uint32_t shader) {
+    mImpl->vkCompileDeferredNV(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                               pipeline, shader);
 }
 #endif
 #ifdef VK_EXT_external_memory_host
 void VkDecoderSnapshot::vkGetMemoryHostPointerPropertiesEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkExternalMemoryHandleTypeFlagBits handleType,
-    const void* pHostPointer,
-    VkMemoryHostPointerPropertiesEXT* pMemoryHostPointerProperties)
-{
-    mImpl->vkGetMemoryHostPointerPropertiesEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, handleType, pHostPointer, pMemoryHostPointerProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType,
+    const void* pHostPointer, VkMemoryHostPointerPropertiesEXT* pMemoryHostPointerProperties) {
+    mImpl->vkGetMemoryHostPointerPropertiesEXT(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                               input_result, device, handleType, pHostPointer,
+                                               pMemoryHostPointerProperties);
 }
 #endif
 #ifdef VK_AMD_buffer_marker
 void VkDecoderSnapshot::vkCmdWriteBufferMarkerAMD(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkPipelineStageFlagBits pipelineStage,
-    VkBuffer dstBuffer,
-    VkDeviceSize dstOffset,
-    uint32_t marker)
-{
-    mImpl->vkCmdWriteBufferMarkerAMD(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pipelineStage, dstBuffer, dstOffset, marker);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkBuffer dstBuffer,
+    VkDeviceSize dstOffset, uint32_t marker) {
+    mImpl->vkCmdWriteBufferMarkerAMD(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                     pipelineStage, dstBuffer, dstOffset, marker);
 }
 #endif
 #ifdef VK_EXT_calibrated_timestamps
 void VkDecoderSnapshot::vkGetPhysicalDeviceCalibrateableTimeDomainsEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t* pTimeDomainCount,
-    VkTimeDomainEXT* pTimeDomains)
-{
-    mImpl->vkGetPhysicalDeviceCalibrateableTimeDomainsEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, pTimeDomainCount, pTimeDomains);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkPhysicalDevice physicalDevice, uint32_t* pTimeDomainCount,
+    VkTimeDomainEXT* pTimeDomains) {
+    mImpl->vkGetPhysicalDeviceCalibrateableTimeDomainsEXT(snapshotTraceBegin, snapshotTraceBytes,
+                                                          pool, input_result, physicalDevice,
+                                                          pTimeDomainCount, pTimeDomains);
 }
 #endif
 #ifdef VK_EXT_calibrated_timestamps
 void VkDecoderSnapshot::vkGetCalibratedTimestampsEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    uint32_t timestampCount,
-    const VkCalibratedTimestampInfoEXT* pTimestampInfos,
-    uint64_t* pTimestamps,
-    uint64_t* pMaxDeviation)
-{
-    mImpl->vkGetCalibratedTimestampsEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, timestampCount, pTimestampInfos, pTimestamps, pMaxDeviation);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, uint32_t timestampCount,
+    const VkCalibratedTimestampInfoEXT* pTimestampInfos, uint64_t* pTimestamps,
+    uint64_t* pMaxDeviation) {
+    mImpl->vkGetCalibratedTimestampsEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                        device, timestampCount, pTimestampInfos, pTimestamps,
+                                        pMaxDeviation);
 }
 #endif
 #ifdef VK_NV_mesh_shader
-void VkDecoderSnapshot::vkCmdDrawMeshTasksNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t taskCount,
-    uint32_t firstTask)
-{
-    mImpl->vkCmdDrawMeshTasksNV(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, taskCount, firstTask);
+void VkDecoderSnapshot::vkCmdDrawMeshTasksNV(const uint8_t* snapshotTraceBegin,
+                                             size_t snapshotTraceBytes,
+                                             android::base::BumpPool* pool,
+                                             VkCommandBuffer commandBuffer, uint32_t taskCount,
+                                             uint32_t firstTask) {
+    mImpl->vkCmdDrawMeshTasksNV(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                taskCount, firstTask);
 }
 #endif
 #ifdef VK_NV_mesh_shader
-void VkDecoderSnapshot::vkCmdDrawMeshTasksIndirectNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBuffer buffer,
-    VkDeviceSize offset,
-    uint32_t drawCount,
-    uint32_t stride)
-{
-    mImpl->vkCmdDrawMeshTasksIndirectNV(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, buffer, offset, drawCount, stride);
+void VkDecoderSnapshot::vkCmdDrawMeshTasksIndirectNV(const uint8_t* snapshotTraceBegin,
+                                                     size_t snapshotTraceBytes,
+                                                     android::base::BumpPool* pool,
+                                                     VkCommandBuffer commandBuffer, VkBuffer buffer,
+                                                     VkDeviceSize offset, uint32_t drawCount,
+                                                     uint32_t stride) {
+    mImpl->vkCmdDrawMeshTasksIndirectNV(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                        buffer, offset, drawCount, stride);
 }
 #endif
 #ifdef VK_NV_mesh_shader
 void VkDecoderSnapshot::vkCmdDrawMeshTasksIndirectCountNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBuffer buffer,
-    VkDeviceSize offset,
-    VkBuffer countBuffer,
-    VkDeviceSize countBufferOffset,
-    uint32_t maxDrawCount,
-    uint32_t stride)
-{
-    mImpl->vkCmdDrawMeshTasksIndirectCountNV(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
+    VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride) {
+    mImpl->vkCmdDrawMeshTasksIndirectCountNV(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                             commandBuffer, buffer, offset, countBuffer,
+                                             countBufferOffset, maxDrawCount, stride);
 }
 #endif
 #ifdef VK_NV_scissor_exclusive
 void VkDecoderSnapshot::vkCmdSetExclusiveScissorNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t firstExclusiveScissor,
-    uint32_t exclusiveScissorCount,
-    const VkRect2D* pExclusiveScissors)
-{
-    mImpl->vkCmdSetExclusiveScissorNV(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, firstExclusiveScissor, exclusiveScissorCount, pExclusiveScissors);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, uint32_t firstExclusiveScissor, uint32_t exclusiveScissorCount,
+    const VkRect2D* pExclusiveScissors) {
+    mImpl->vkCmdSetExclusiveScissorNV(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                      firstExclusiveScissor, exclusiveScissorCount,
+                                      pExclusiveScissors);
 }
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
-void VkDecoderSnapshot::vkCmdSetCheckpointNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const void* pCheckpointMarker)
-{
-    mImpl->vkCmdSetCheckpointNV(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pCheckpointMarker);
+void VkDecoderSnapshot::vkCmdSetCheckpointNV(const uint8_t* snapshotTraceBegin,
+                                             size_t snapshotTraceBytes,
+                                             android::base::BumpPool* pool,
+                                             VkCommandBuffer commandBuffer,
+                                             const void* pCheckpointMarker) {
+    mImpl->vkCmdSetCheckpointNV(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                pCheckpointMarker);
 }
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
-void VkDecoderSnapshot::vkGetQueueCheckpointDataNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkQueue queue,
-    uint32_t* pCheckpointDataCount,
-    VkCheckpointDataNV* pCheckpointData)
-{
-    mImpl->vkGetQueueCheckpointDataNV(snapshotTraceBegin, snapshotTraceBytes, pool, queue, pCheckpointDataCount, pCheckpointData);
+void VkDecoderSnapshot::vkGetQueueCheckpointDataNV(const uint8_t* snapshotTraceBegin,
+                                                   size_t snapshotTraceBytes,
+                                                   android::base::BumpPool* pool, VkQueue queue,
+                                                   uint32_t* pCheckpointDataCount,
+                                                   VkCheckpointDataNV* pCheckpointData) {
+    mImpl->vkGetQueueCheckpointDataNV(snapshotTraceBegin, snapshotTraceBytes, pool, queue,
+                                      pCheckpointDataCount, pCheckpointData);
 }
 #endif
 #ifdef VK_INTEL_performance_query
 void VkDecoderSnapshot::vkInitializePerformanceApiINTEL(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkInitializePerformanceApiInfoINTEL* pInitializeInfo)
-{
-    mImpl->vkInitializePerformanceApiINTEL(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pInitializeInfo);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device,
+    const VkInitializePerformanceApiInfoINTEL* pInitializeInfo) {
+    mImpl->vkInitializePerformanceApiINTEL(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                           input_result, device, pInitializeInfo);
 }
 #endif
 #ifdef VK_INTEL_performance_query
-void VkDecoderSnapshot::vkUninitializePerformanceApiINTEL(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device)
-{
+void VkDecoderSnapshot::vkUninitializePerformanceApiINTEL(const uint8_t* snapshotTraceBegin,
+                                                          size_t snapshotTraceBytes,
+                                                          android::base::BumpPool* pool,
+                                                          VkDevice device) {
     mImpl->vkUninitializePerformanceApiINTEL(snapshotTraceBegin, snapshotTraceBytes, pool, device);
 }
 #endif
 #ifdef VK_INTEL_performance_query
 void VkDecoderSnapshot::vkCmdSetPerformanceMarkerINTEL(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkCommandBuffer commandBuffer,
-    const VkPerformanceMarkerInfoINTEL* pMarkerInfo)
-{
-    mImpl->vkCmdSetPerformanceMarkerINTEL(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, commandBuffer, pMarkerInfo);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkCommandBuffer commandBuffer,
+    const VkPerformanceMarkerInfoINTEL* pMarkerInfo) {
+    mImpl->vkCmdSetPerformanceMarkerINTEL(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                          input_result, commandBuffer, pMarkerInfo);
 }
 #endif
 #ifdef VK_INTEL_performance_query
 void VkDecoderSnapshot::vkCmdSetPerformanceStreamMarkerINTEL(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkCommandBuffer commandBuffer,
-    const VkPerformanceStreamMarkerInfoINTEL* pMarkerInfo)
-{
-    mImpl->vkCmdSetPerformanceStreamMarkerINTEL(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, commandBuffer, pMarkerInfo);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkCommandBuffer commandBuffer,
+    const VkPerformanceStreamMarkerInfoINTEL* pMarkerInfo) {
+    mImpl->vkCmdSetPerformanceStreamMarkerINTEL(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                input_result, commandBuffer, pMarkerInfo);
 }
 #endif
 #ifdef VK_INTEL_performance_query
 void VkDecoderSnapshot::vkCmdSetPerformanceOverrideINTEL(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkCommandBuffer commandBuffer,
-    const VkPerformanceOverrideInfoINTEL* pOverrideInfo)
-{
-    mImpl->vkCmdSetPerformanceOverrideINTEL(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, commandBuffer, pOverrideInfo);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkCommandBuffer commandBuffer,
+    const VkPerformanceOverrideInfoINTEL* pOverrideInfo) {
+    mImpl->vkCmdSetPerformanceOverrideINTEL(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                            input_result, commandBuffer, pOverrideInfo);
 }
 #endif
 #ifdef VK_INTEL_performance_query
 void VkDecoderSnapshot::vkAcquirePerformanceConfigurationINTEL(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device,
     const VkPerformanceConfigurationAcquireInfoINTEL* pAcquireInfo,
-    VkPerformanceConfigurationINTEL* pConfiguration)
-{
-    mImpl->vkAcquirePerformanceConfigurationINTEL(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pAcquireInfo, pConfiguration);
+    VkPerformanceConfigurationINTEL* pConfiguration) {
+    mImpl->vkAcquirePerformanceConfigurationINTEL(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                  input_result, device, pAcquireInfo,
+                                                  pConfiguration);
 }
 #endif
 #ifdef VK_INTEL_performance_query
 void VkDecoderSnapshot::vkReleasePerformanceConfigurationINTEL(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkPerformanceConfigurationINTEL configuration)
-{
-    mImpl->vkReleasePerformanceConfigurationINTEL(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, configuration);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, VkPerformanceConfigurationINTEL configuration) {
+    mImpl->vkReleasePerformanceConfigurationINTEL(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                  input_result, device, configuration);
 }
 #endif
 #ifdef VK_INTEL_performance_query
 void VkDecoderSnapshot::vkQueueSetPerformanceConfigurationINTEL(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkQueue queue,
-    VkPerformanceConfigurationINTEL configuration)
-{
-    mImpl->vkQueueSetPerformanceConfigurationINTEL(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, queue, configuration);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkQueue queue, VkPerformanceConfigurationINTEL configuration) {
+    mImpl->vkQueueSetPerformanceConfigurationINTEL(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                   input_result, queue, configuration);
 }
 #endif
 #ifdef VK_INTEL_performance_query
-void VkDecoderSnapshot::vkGetPerformanceParameterINTEL(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkPerformanceParameterTypeINTEL parameter,
-    VkPerformanceValueINTEL* pValue)
-{
-    mImpl->vkGetPerformanceParameterINTEL(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, parameter, pValue);
+void VkDecoderSnapshot::vkGetPerformanceParameterINTEL(const uint8_t* snapshotTraceBegin,
+                                                       size_t snapshotTraceBytes,
+                                                       android::base::BumpPool* pool,
+                                                       VkResult input_result, VkDevice device,
+                                                       VkPerformanceParameterTypeINTEL parameter,
+                                                       VkPerformanceValueINTEL* pValue) {
+    mImpl->vkGetPerformanceParameterINTEL(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                          input_result, device, parameter, pValue);
 }
 #endif
 #ifdef VK_AMD_display_native_hdr
-void VkDecoderSnapshot::vkSetLocalDimmingAMD(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkSwapchainKHR swapChain,
-    VkBool32 localDimmingEnable)
-{
-    mImpl->vkSetLocalDimmingAMD(snapshotTraceBegin, snapshotTraceBytes, pool, device, swapChain, localDimmingEnable);
+void VkDecoderSnapshot::vkSetLocalDimmingAMD(const uint8_t* snapshotTraceBegin,
+                                             size_t snapshotTraceBytes,
+                                             android::base::BumpPool* pool, VkDevice device,
+                                             VkSwapchainKHR swapChain,
+                                             VkBool32 localDimmingEnable) {
+    mImpl->vkSetLocalDimmingAMD(snapshotTraceBegin, snapshotTraceBytes, pool, device, swapChain,
+                                localDimmingEnable);
 }
 #endif
 #ifdef VK_FUCHSIA_imagepipe_surface
 void VkDecoderSnapshot::vkCreateImagePipeSurfaceFUCHSIA(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    const VkImagePipeSurfaceCreateInfoFUCHSIA* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
-{
-    mImpl->vkCreateImagePipeSurfaceFUCHSIA(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, instance, pCreateInfo, pAllocator, pSurface);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkInstance instance,
+    const VkImagePipeSurfaceCreateInfoFUCHSIA* pCreateInfo, const VkAllocationCallbacks* pAllocator,
+    VkSurfaceKHR* pSurface) {
+    mImpl->vkCreateImagePipeSurfaceFUCHSIA(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                           input_result, instance, pCreateInfo, pAllocator,
+                                           pSurface);
 }
 #endif
 #ifdef VK_EXT_metal_surface
 void VkDecoderSnapshot::vkCreateMetalSurfaceEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    const VkMetalSurfaceCreateInfoEXT* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
-{
-    mImpl->vkCreateMetalSurfaceEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, instance, pCreateInfo, pAllocator, pSurface);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkInstance instance, const VkMetalSurfaceCreateInfoEXT* pCreateInfo,
+    const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) {
+    mImpl->vkCreateMetalSurfaceEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                   instance, pCreateInfo, pAllocator, pSurface);
 }
 #endif
 #ifdef VK_EXT_buffer_device_address
-void VkDecoderSnapshot::vkGetBufferDeviceAddressEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDeviceAddress input_result,
-    VkDevice device,
-    const VkBufferDeviceAddressInfo* pInfo)
-{
-    mImpl->vkGetBufferDeviceAddressEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pInfo);
+void VkDecoderSnapshot::vkGetBufferDeviceAddressEXT(const uint8_t* snapshotTraceBegin,
+                                                    size_t snapshotTraceBytes,
+                                                    android::base::BumpPool* pool,
+                                                    VkDeviceAddress input_result, VkDevice device,
+                                                    const VkBufferDeviceAddressInfo* pInfo) {
+    mImpl->vkGetBufferDeviceAddressEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                       device, pInfo);
 }
 #endif
 #ifdef VK_EXT_tooling_info
 void VkDecoderSnapshot::vkGetPhysicalDeviceToolPropertiesEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t* pToolCount,
-    VkPhysicalDeviceToolPropertiesEXT* pToolProperties)
-{
-    mImpl->vkGetPhysicalDeviceToolPropertiesEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, pToolCount, pToolProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkPhysicalDevice physicalDevice, uint32_t* pToolCount,
+    VkPhysicalDeviceToolPropertiesEXT* pToolProperties) {
+    mImpl->vkGetPhysicalDeviceToolPropertiesEXT(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                input_result, physicalDevice, pToolCount,
+                                                pToolProperties);
 }
 #endif
 #ifdef VK_NV_cooperative_matrix
 void VkDecoderSnapshot::vkGetPhysicalDeviceCooperativeMatrixPropertiesNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t* pPropertyCount,
-    VkCooperativeMatrixPropertiesNV* pProperties)
-{
-    mImpl->vkGetPhysicalDeviceCooperativeMatrixPropertiesNV(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, pPropertyCount, pProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount,
+    VkCooperativeMatrixPropertiesNV* pProperties) {
+    mImpl->vkGetPhysicalDeviceCooperativeMatrixPropertiesNV(snapshotTraceBegin, snapshotTraceBytes,
+                                                            pool, input_result, physicalDevice,
+                                                            pPropertyCount, pProperties);
 }
 #endif
 #ifdef VK_NV_coverage_reduction_mode
 void VkDecoderSnapshot::vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t* pCombinationCount,
-    VkFramebufferMixedSamplesCombinationNV* pCombinations)
-{
-    mImpl->vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, pCombinationCount, pCombinations);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkPhysicalDevice physicalDevice, uint32_t* pCombinationCount,
+    VkFramebufferMixedSamplesCombinationNV* pCombinations) {
+    mImpl->vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV(
+        snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice,
+        pCombinationCount, pCombinations);
 }
 #endif
 #ifdef VK_EXT_full_screen_exclusive
 void VkDecoderSnapshot::vkGetPhysicalDeviceSurfacePresentModes2EXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo,
-    uint32_t* pPresentModeCount,
-    VkPresentModeKHR* pPresentModes)
-{
-    mImpl->vkGetPhysicalDeviceSurfacePresentModes2EXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, pSurfaceInfo, pPresentModeCount, pPresentModes);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkPhysicalDevice physicalDevice,
+    const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, uint32_t* pPresentModeCount,
+    VkPresentModeKHR* pPresentModes) {
+    mImpl->vkGetPhysicalDeviceSurfacePresentModes2EXT(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                      input_result, physicalDevice, pSurfaceInfo,
+                                                      pPresentModeCount, pPresentModes);
 }
 #endif
 #ifdef VK_EXT_full_screen_exclusive
-void VkDecoderSnapshot::vkAcquireFullScreenExclusiveModeEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkSwapchainKHR swapchain)
-{
-    mImpl->vkAcquireFullScreenExclusiveModeEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, swapchain);
+void VkDecoderSnapshot::vkAcquireFullScreenExclusiveModeEXT(const uint8_t* snapshotTraceBegin,
+                                                            size_t snapshotTraceBytes,
+                                                            android::base::BumpPool* pool,
+                                                            VkResult input_result, VkDevice device,
+                                                            VkSwapchainKHR swapchain) {
+    mImpl->vkAcquireFullScreenExclusiveModeEXT(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                               input_result, device, swapchain);
 }
 #endif
 #ifdef VK_EXT_full_screen_exclusive
-void VkDecoderSnapshot::vkReleaseFullScreenExclusiveModeEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkSwapchainKHR swapchain)
-{
-    mImpl->vkReleaseFullScreenExclusiveModeEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, swapchain);
+void VkDecoderSnapshot::vkReleaseFullScreenExclusiveModeEXT(const uint8_t* snapshotTraceBegin,
+                                                            size_t snapshotTraceBytes,
+                                                            android::base::BumpPool* pool,
+                                                            VkResult input_result, VkDevice device,
+                                                            VkSwapchainKHR swapchain) {
+    mImpl->vkReleaseFullScreenExclusiveModeEXT(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                               input_result, device, swapchain);
 }
 #endif
 #ifdef VK_EXT_full_screen_exclusive
 void VkDecoderSnapshot::vkGetDeviceGroupSurfacePresentModes2EXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo,
-    VkDeviceGroupPresentModeFlagsKHR* pModes)
-{
-    mImpl->vkGetDeviceGroupSurfacePresentModes2EXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pSurfaceInfo, pModes);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo,
+    VkDeviceGroupPresentModeFlagsKHR* pModes) {
+    mImpl->vkGetDeviceGroupSurfacePresentModes2EXT(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                   input_result, device, pSurfaceInfo, pModes);
 }
 #endif
 #ifdef VK_EXT_headless_surface
 void VkDecoderSnapshot::vkCreateHeadlessSurfaceEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    const VkHeadlessSurfaceCreateInfoEXT* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
-{
-    mImpl->vkCreateHeadlessSurfaceEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, instance, pCreateInfo, pAllocator, pSurface);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkInstance instance, const VkHeadlessSurfaceCreateInfoEXT* pCreateInfo,
+    const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) {
+    mImpl->vkCreateHeadlessSurfaceEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                      instance, pCreateInfo, pAllocator, pSurface);
 }
 #endif
 #ifdef VK_EXT_line_rasterization
 void VkDecoderSnapshot::vkCmdSetLineStippleEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t lineStippleFactor,
-    uint16_t lineStipplePattern)
-{
-    mImpl->vkCmdSetLineStippleEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, lineStippleFactor, lineStipplePattern);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, uint32_t lineStippleFactor, uint16_t lineStipplePattern) {
+    mImpl->vkCmdSetLineStippleEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                  lineStippleFactor, lineStipplePattern);
 }
 #endif
 #ifdef VK_EXT_host_query_reset
-void VkDecoderSnapshot::vkResetQueryPoolEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkQueryPool queryPool,
-    uint32_t firstQuery,
-    uint32_t queryCount)
-{
-    mImpl->vkResetQueryPoolEXT(snapshotTraceBegin, snapshotTraceBytes, pool, device, queryPool, firstQuery, queryCount);
+void VkDecoderSnapshot::vkResetQueryPoolEXT(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool, VkDevice device,
+                                            VkQueryPool queryPool, uint32_t firstQuery,
+                                            uint32_t queryCount) {
+    mImpl->vkResetQueryPoolEXT(snapshotTraceBegin, snapshotTraceBytes, pool, device, queryPool,
+                               firstQuery, queryCount);
 }
 #endif
 #ifdef VK_EXT_extended_dynamic_state
-void VkDecoderSnapshot::vkCmdSetCullModeEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkCullModeFlags cullMode)
-{
-    mImpl->vkCmdSetCullModeEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, cullMode);
+void VkDecoderSnapshot::vkCmdSetCullModeEXT(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool,
+                                            VkCommandBuffer commandBuffer,
+                                            VkCullModeFlags cullMode) {
+    mImpl->vkCmdSetCullModeEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                               cullMode);
 }
 #endif
 #ifdef VK_EXT_extended_dynamic_state
-void VkDecoderSnapshot::vkCmdSetFrontFaceEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkFrontFace frontFace)
-{
-    mImpl->vkCmdSetFrontFaceEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, frontFace);
+void VkDecoderSnapshot::vkCmdSetFrontFaceEXT(const uint8_t* snapshotTraceBegin,
+                                             size_t snapshotTraceBytes,
+                                             android::base::BumpPool* pool,
+                                             VkCommandBuffer commandBuffer, VkFrontFace frontFace) {
+    mImpl->vkCmdSetFrontFaceEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                frontFace);
 }
 #endif
 #ifdef VK_EXT_extended_dynamic_state
-void VkDecoderSnapshot::vkCmdSetPrimitiveTopologyEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkPrimitiveTopology primitiveTopology)
-{
-    mImpl->vkCmdSetPrimitiveTopologyEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, primitiveTopology);
+void VkDecoderSnapshot::vkCmdSetPrimitiveTopologyEXT(const uint8_t* snapshotTraceBegin,
+                                                     size_t snapshotTraceBytes,
+                                                     android::base::BumpPool* pool,
+                                                     VkCommandBuffer commandBuffer,
+                                                     VkPrimitiveTopology primitiveTopology) {
+    mImpl->vkCmdSetPrimitiveTopologyEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                        primitiveTopology);
 }
 #endif
 #ifdef VK_EXT_extended_dynamic_state
 void VkDecoderSnapshot::vkCmdSetViewportWithCountEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t viewportCount,
-    const VkViewport* pViewports)
-{
-    mImpl->vkCmdSetViewportWithCountEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, viewportCount, pViewports);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, uint32_t viewportCount, const VkViewport* pViewports) {
+    mImpl->vkCmdSetViewportWithCountEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                        viewportCount, pViewports);
 }
 #endif
 #ifdef VK_EXT_extended_dynamic_state
 void VkDecoderSnapshot::vkCmdSetScissorWithCountEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t scissorCount,
-    const VkRect2D* pScissors)
-{
-    mImpl->vkCmdSetScissorWithCountEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, scissorCount, pScissors);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, uint32_t scissorCount, const VkRect2D* pScissors) {
+    mImpl->vkCmdSetScissorWithCountEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                       scissorCount, pScissors);
 }
 #endif
 #ifdef VK_EXT_extended_dynamic_state
 void VkDecoderSnapshot::vkCmdBindVertexBuffers2EXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t firstBinding,
-    uint32_t bindingCount,
-    const VkBuffer* pBuffers,
-    const VkDeviceSize* pOffsets,
-    const VkDeviceSize* pSizes,
-    const VkDeviceSize* pStrides)
-{
-    mImpl->vkCmdBindVertexBuffers2EXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets, pSizes, pStrides);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
+    const VkBuffer* pBuffers, const VkDeviceSize* pOffsets, const VkDeviceSize* pSizes,
+    const VkDeviceSize* pStrides) {
+    mImpl->vkCmdBindVertexBuffers2EXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                      firstBinding, bindingCount, pBuffers, pOffsets, pSizes,
+                                      pStrides);
 }
 #endif
 #ifdef VK_EXT_extended_dynamic_state
-void VkDecoderSnapshot::vkCmdSetDepthTestEnableEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBool32 depthTestEnable)
-{
-    mImpl->vkCmdSetDepthTestEnableEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, depthTestEnable);
+void VkDecoderSnapshot::vkCmdSetDepthTestEnableEXT(const uint8_t* snapshotTraceBegin,
+                                                   size_t snapshotTraceBytes,
+                                                   android::base::BumpPool* pool,
+                                                   VkCommandBuffer commandBuffer,
+                                                   VkBool32 depthTestEnable) {
+    mImpl->vkCmdSetDepthTestEnableEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                      depthTestEnable);
 }
 #endif
 #ifdef VK_EXT_extended_dynamic_state
-void VkDecoderSnapshot::vkCmdSetDepthWriteEnableEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBool32 depthWriteEnable)
-{
-    mImpl->vkCmdSetDepthWriteEnableEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, depthWriteEnable);
+void VkDecoderSnapshot::vkCmdSetDepthWriteEnableEXT(const uint8_t* snapshotTraceBegin,
+                                                    size_t snapshotTraceBytes,
+                                                    android::base::BumpPool* pool,
+                                                    VkCommandBuffer commandBuffer,
+                                                    VkBool32 depthWriteEnable) {
+    mImpl->vkCmdSetDepthWriteEnableEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                       depthWriteEnable);
 }
 #endif
 #ifdef VK_EXT_extended_dynamic_state
-void VkDecoderSnapshot::vkCmdSetDepthCompareOpEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkCompareOp depthCompareOp)
-{
-    mImpl->vkCmdSetDepthCompareOpEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, depthCompareOp);
+void VkDecoderSnapshot::vkCmdSetDepthCompareOpEXT(const uint8_t* snapshotTraceBegin,
+                                                  size_t snapshotTraceBytes,
+                                                  android::base::BumpPool* pool,
+                                                  VkCommandBuffer commandBuffer,
+                                                  VkCompareOp depthCompareOp) {
+    mImpl->vkCmdSetDepthCompareOpEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                     depthCompareOp);
 }
 #endif
 #ifdef VK_EXT_extended_dynamic_state
-void VkDecoderSnapshot::vkCmdSetDepthBoundsTestEnableEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBool32 depthBoundsTestEnable)
-{
-    mImpl->vkCmdSetDepthBoundsTestEnableEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, depthBoundsTestEnable);
+void VkDecoderSnapshot::vkCmdSetDepthBoundsTestEnableEXT(const uint8_t* snapshotTraceBegin,
+                                                         size_t snapshotTraceBytes,
+                                                         android::base::BumpPool* pool,
+                                                         VkCommandBuffer commandBuffer,
+                                                         VkBool32 depthBoundsTestEnable) {
+    mImpl->vkCmdSetDepthBoundsTestEnableEXT(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                            commandBuffer, depthBoundsTestEnable);
 }
 #endif
 #ifdef VK_EXT_extended_dynamic_state
-void VkDecoderSnapshot::vkCmdSetStencilTestEnableEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBool32 stencilTestEnable)
-{
-    mImpl->vkCmdSetStencilTestEnableEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, stencilTestEnable);
+void VkDecoderSnapshot::vkCmdSetStencilTestEnableEXT(const uint8_t* snapshotTraceBegin,
+                                                     size_t snapshotTraceBytes,
+                                                     android::base::BumpPool* pool,
+                                                     VkCommandBuffer commandBuffer,
+                                                     VkBool32 stencilTestEnable) {
+    mImpl->vkCmdSetStencilTestEnableEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                        stencilTestEnable);
 }
 #endif
 #ifdef VK_EXT_extended_dynamic_state
 void VkDecoderSnapshot::vkCmdSetStencilOpEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkStencilFaceFlags faceMask,
-    VkStencilOp failOp,
-    VkStencilOp passOp,
-    VkStencilOp depthFailOp,
-    VkCompareOp compareOp)
-{
-    mImpl->vkCmdSetStencilOpEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, faceMask, failOp, passOp, depthFailOp, compareOp);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, VkStencilOp failOp,
+    VkStencilOp passOp, VkStencilOp depthFailOp, VkCompareOp compareOp) {
+    mImpl->vkCmdSetStencilOpEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                faceMask, failOp, passOp, depthFailOp, compareOp);
 }
 #endif
 #ifdef VK_NV_device_generated_commands
 void VkDecoderSnapshot::vkGetGeneratedCommandsMemoryRequirementsNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    const VkGeneratedCommandsMemoryRequirementsInfoNV* pInfo,
-    VkMemoryRequirements2* pMemoryRequirements)
-{
-    mImpl->vkGetGeneratedCommandsMemoryRequirementsNV(snapshotTraceBegin, snapshotTraceBytes, pool, device, pInfo, pMemoryRequirements);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkDevice device, const VkGeneratedCommandsMemoryRequirementsInfoNV* pInfo,
+    VkMemoryRequirements2* pMemoryRequirements) {
+    mImpl->vkGetGeneratedCommandsMemoryRequirementsNV(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                      device, pInfo, pMemoryRequirements);
 }
 #endif
 #ifdef VK_NV_device_generated_commands
 void VkDecoderSnapshot::vkCmdPreprocessGeneratedCommandsNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkGeneratedCommandsInfoNV* pGeneratedCommandsInfo)
-{
-    mImpl->vkCmdPreprocessGeneratedCommandsNV(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pGeneratedCommandsInfo);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, const VkGeneratedCommandsInfoNV* pGeneratedCommandsInfo) {
+    mImpl->vkCmdPreprocessGeneratedCommandsNV(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                              commandBuffer, pGeneratedCommandsInfo);
 }
 #endif
 #ifdef VK_NV_device_generated_commands
 void VkDecoderSnapshot::vkCmdExecuteGeneratedCommandsNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBool32 isPreprocessed,
-    const VkGeneratedCommandsInfoNV* pGeneratedCommandsInfo)
-{
-    mImpl->vkCmdExecuteGeneratedCommandsNV(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, isPreprocessed, pGeneratedCommandsInfo);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, VkBool32 isPreprocessed,
+    const VkGeneratedCommandsInfoNV* pGeneratedCommandsInfo) {
+    mImpl->vkCmdExecuteGeneratedCommandsNV(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                           commandBuffer, isPreprocessed, pGeneratedCommandsInfo);
 }
 #endif
 #ifdef VK_NV_device_generated_commands
-void VkDecoderSnapshot::vkCmdBindPipelineShaderGroupNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkPipelineBindPoint pipelineBindPoint,
-    VkPipeline pipeline,
-    uint32_t groupIndex)
-{
-    mImpl->vkCmdBindPipelineShaderGroupNV(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pipelineBindPoint, pipeline, groupIndex);
+void VkDecoderSnapshot::vkCmdBindPipelineShaderGroupNV(const uint8_t* snapshotTraceBegin,
+                                                       size_t snapshotTraceBytes,
+                                                       android::base::BumpPool* pool,
+                                                       VkCommandBuffer commandBuffer,
+                                                       VkPipelineBindPoint pipelineBindPoint,
+                                                       VkPipeline pipeline, uint32_t groupIndex) {
+    mImpl->vkCmdBindPipelineShaderGroupNV(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                          commandBuffer, pipelineBindPoint, pipeline, groupIndex);
 }
 #endif
 #ifdef VK_NV_device_generated_commands
 void VkDecoderSnapshot::vkCreateIndirectCommandsLayoutNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkIndirectCommandsLayoutCreateInfoNV* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkIndirectCommandsLayoutNV* pIndirectCommandsLayout)
-{
-    mImpl->vkCreateIndirectCommandsLayoutNV(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pCreateInfo, pAllocator, pIndirectCommandsLayout);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, const VkIndirectCommandsLayoutCreateInfoNV* pCreateInfo,
+    const VkAllocationCallbacks* pAllocator, VkIndirectCommandsLayoutNV* pIndirectCommandsLayout) {
+    mImpl->vkCreateIndirectCommandsLayoutNV(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                            input_result, device, pCreateInfo, pAllocator,
+                                            pIndirectCommandsLayout);
 }
 #endif
 #ifdef VK_NV_device_generated_commands
 void VkDecoderSnapshot::vkDestroyIndirectCommandsLayoutNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkIndirectCommandsLayoutNV indirectCommandsLayout,
-    const VkAllocationCallbacks* pAllocator)
-{
-    mImpl->vkDestroyIndirectCommandsLayoutNV(snapshotTraceBegin, snapshotTraceBytes, pool, device, indirectCommandsLayout, pAllocator);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkDevice device, VkIndirectCommandsLayoutNV indirectCommandsLayout,
+    const VkAllocationCallbacks* pAllocator) {
+    mImpl->vkDestroyIndirectCommandsLayoutNV(snapshotTraceBegin, snapshotTraceBytes, pool, device,
+                                             indirectCommandsLayout, pAllocator);
 }
 #endif
 #ifdef VK_EXT_acquire_drm_display
-void VkDecoderSnapshot::vkAcquireDrmDisplayEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    int32_t drmFd,
-    VkDisplayKHR display)
-{
-    mImpl->vkAcquireDrmDisplayEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, drmFd, display);
+void VkDecoderSnapshot::vkAcquireDrmDisplayEXT(const uint8_t* snapshotTraceBegin,
+                                               size_t snapshotTraceBytes,
+                                               android::base::BumpPool* pool, VkResult input_result,
+                                               VkPhysicalDevice physicalDevice, int32_t drmFd,
+                                               VkDisplayKHR display) {
+    mImpl->vkAcquireDrmDisplayEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                  physicalDevice, drmFd, display);
 }
 #endif
 #ifdef VK_EXT_acquire_drm_display
-void VkDecoderSnapshot::vkGetDrmDisplayEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    int32_t drmFd,
-    uint32_t connectorId,
-    VkDisplayKHR* display)
-{
-    mImpl->vkGetDrmDisplayEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, drmFd, connectorId, display);
+void VkDecoderSnapshot::vkGetDrmDisplayEXT(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkResult input_result, VkPhysicalDevice physicalDevice,
+                                           int32_t drmFd, uint32_t connectorId,
+                                           VkDisplayKHR* display) {
+    mImpl->vkGetDrmDisplayEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                              physicalDevice, drmFd, connectorId, display);
 }
 #endif
 #ifdef VK_EXT_private_data
 void VkDecoderSnapshot::vkCreatePrivateDataSlotEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkPrivateDataSlotCreateInfoEXT* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkPrivateDataSlotEXT* pPrivateDataSlot)
-{
-    mImpl->vkCreatePrivateDataSlotEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pCreateInfo, pAllocator, pPrivateDataSlot);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, const VkPrivateDataSlotCreateInfoEXT* pCreateInfo,
+    const VkAllocationCallbacks* pAllocator, VkPrivateDataSlotEXT* pPrivateDataSlot) {
+    mImpl->vkCreatePrivateDataSlotEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                      device, pCreateInfo, pAllocator, pPrivateDataSlot);
 }
 #endif
 #ifdef VK_EXT_private_data
-void VkDecoderSnapshot::vkDestroyPrivateDataSlotEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkPrivateDataSlotEXT privateDataSlot,
-    const VkAllocationCallbacks* pAllocator)
-{
-    mImpl->vkDestroyPrivateDataSlotEXT(snapshotTraceBegin, snapshotTraceBytes, pool, device, privateDataSlot, pAllocator);
+void VkDecoderSnapshot::vkDestroyPrivateDataSlotEXT(const uint8_t* snapshotTraceBegin,
+                                                    size_t snapshotTraceBytes,
+                                                    android::base::BumpPool* pool, VkDevice device,
+                                                    VkPrivateDataSlotEXT privateDataSlot,
+                                                    const VkAllocationCallbacks* pAllocator) {
+    mImpl->vkDestroyPrivateDataSlotEXT(snapshotTraceBegin, snapshotTraceBytes, pool, device,
+                                       privateDataSlot, pAllocator);
 }
 #endif
 #ifdef VK_EXT_private_data
-void VkDecoderSnapshot::vkSetPrivateDataEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkObjectType objectType,
-    uint64_t objectHandle,
-    VkPrivateDataSlotEXT privateDataSlot,
-    uint64_t data)
-{
-    mImpl->vkSetPrivateDataEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, objectType, objectHandle, privateDataSlot, data);
+void VkDecoderSnapshot::vkSetPrivateDataEXT(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool, VkResult input_result,
+                                            VkDevice device, VkObjectType objectType,
+                                            uint64_t objectHandle,
+                                            VkPrivateDataSlotEXT privateDataSlot, uint64_t data) {
+    mImpl->vkSetPrivateDataEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+                               objectType, objectHandle, privateDataSlot, data);
 }
 #endif
 #ifdef VK_EXT_private_data
-void VkDecoderSnapshot::vkGetPrivateDataEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkObjectType objectType,
-    uint64_t objectHandle,
-    VkPrivateDataSlotEXT privateDataSlot,
-    uint64_t* pData)
-{
-    mImpl->vkGetPrivateDataEXT(snapshotTraceBegin, snapshotTraceBytes, pool, device, objectType, objectHandle, privateDataSlot, pData);
+void VkDecoderSnapshot::vkGetPrivateDataEXT(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool, VkDevice device,
+                                            VkObjectType objectType, uint64_t objectHandle,
+                                            VkPrivateDataSlotEXT privateDataSlot, uint64_t* pData) {
+    mImpl->vkGetPrivateDataEXT(snapshotTraceBegin, snapshotTraceBytes, pool, device, objectType,
+                               objectHandle, privateDataSlot, pData);
 }
 #endif
 #ifdef VK_NV_fragment_shading_rate_enums
 void VkDecoderSnapshot::vkCmdSetFragmentShadingRateEnumNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkFragmentShadingRateNV shadingRate,
-    const VkFragmentShadingRateCombinerOpKHR combinerOps[2])
-{
-    mImpl->vkCmdSetFragmentShadingRateEnumNV(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, shadingRate, combinerOps);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, VkFragmentShadingRateNV shadingRate,
+    const VkFragmentShadingRateCombinerOpKHR combinerOps[2]) {
+    mImpl->vkCmdSetFragmentShadingRateEnumNV(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                             commandBuffer, shadingRate, combinerOps);
 }
 #endif
 #ifdef VK_NV_acquire_winrt_display
 void VkDecoderSnapshot::vkAcquireWinrtDisplayNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    VkDisplayKHR display)
-{
-    mImpl->vkAcquireWinrtDisplayNV(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, display);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkPhysicalDevice physicalDevice, VkDisplayKHR display) {
+    mImpl->vkAcquireWinrtDisplayNV(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                   physicalDevice, display);
 }
 #endif
 #ifdef VK_NV_acquire_winrt_display
-void VkDecoderSnapshot::vkGetWinrtDisplayNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t deviceRelativeId,
-    VkDisplayKHR* pDisplay)
-{
-    mImpl->vkGetWinrtDisplayNV(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, deviceRelativeId, pDisplay);
+void VkDecoderSnapshot::vkGetWinrtDisplayNV(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool, VkResult input_result,
+                                            VkPhysicalDevice physicalDevice,
+                                            uint32_t deviceRelativeId, VkDisplayKHR* pDisplay) {
+    mImpl->vkGetWinrtDisplayNV(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                               physicalDevice, deviceRelativeId, pDisplay);
 }
 #endif
 #ifdef VK_EXT_directfb_surface
 void VkDecoderSnapshot::vkCreateDirectFBSurfaceEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    const VkDirectFBSurfaceCreateInfoEXT* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
-{
-    mImpl->vkCreateDirectFBSurfaceEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, instance, pCreateInfo, pAllocator, pSurface);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkInstance instance, const VkDirectFBSurfaceCreateInfoEXT* pCreateInfo,
+    const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) {
+    mImpl->vkCreateDirectFBSurfaceEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                      instance, pCreateInfo, pAllocator, pSurface);
 }
 #endif
 #ifdef VK_EXT_directfb_surface
 void VkDecoderSnapshot::vkGetPhysicalDeviceDirectFBPresentationSupportEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkBool32 input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t queueFamilyIndex,
-    IDirectFB* dfb)
-{
-    mImpl->vkGetPhysicalDeviceDirectFBPresentationSupportEXT(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, queueFamilyIndex, dfb);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkBool32 input_result, VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
+    IDirectFB* dfb) {
+    mImpl->vkGetPhysicalDeviceDirectFBPresentationSupportEXT(snapshotTraceBegin, snapshotTraceBytes,
+                                                             pool, input_result, physicalDevice,
+                                                             queueFamilyIndex, dfb);
 }
 #endif
 #ifdef VK_EXT_vertex_input_dynamic_state
 void VkDecoderSnapshot::vkCmdSetVertexInputEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t vertexBindingDescriptionCount,
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, uint32_t vertexBindingDescriptionCount,
     const VkVertexInputBindingDescription2EXT* pVertexBindingDescriptions,
     uint32_t vertexAttributeDescriptionCount,
-    const VkVertexInputAttributeDescription2EXT* pVertexAttributeDescriptions)
-{
-    mImpl->vkCmdSetVertexInputEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, vertexBindingDescriptionCount, pVertexBindingDescriptions, vertexAttributeDescriptionCount, pVertexAttributeDescriptions);
+    const VkVertexInputAttributeDescription2EXT* pVertexAttributeDescriptions) {
+    mImpl->vkCmdSetVertexInputEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                  vertexBindingDescriptionCount, pVertexBindingDescriptions,
+                                  vertexAttributeDescriptionCount, pVertexAttributeDescriptions);
 }
 #endif
 #ifdef VK_FUCHSIA_external_memory
 void VkDecoderSnapshot::vkGetMemoryZirconHandleFUCHSIA(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkMemoryGetZirconHandleInfoFUCHSIA* pGetZirconHandleInfo,
-    zx_handle_t* pZirconHandle)
-{
-    mImpl->vkGetMemoryZirconHandleFUCHSIA(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pGetZirconHandleInfo, pZirconHandle);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device,
+    const VkMemoryGetZirconHandleInfoFUCHSIA* pGetZirconHandleInfo, zx_handle_t* pZirconHandle) {
+    mImpl->vkGetMemoryZirconHandleFUCHSIA(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                          input_result, device, pGetZirconHandleInfo,
+                                          pZirconHandle);
 }
 #endif
 #ifdef VK_FUCHSIA_external_memory
 void VkDecoderSnapshot::vkGetMemoryZirconHandlePropertiesFUCHSIA(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkExternalMemoryHandleTypeFlagBits handleType,
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType,
     zx_handle_t zirconHandle,
-    VkMemoryZirconHandlePropertiesFUCHSIA* pMemoryZirconHandleProperties)
-{
-    mImpl->vkGetMemoryZirconHandlePropertiesFUCHSIA(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, handleType, zirconHandle, pMemoryZirconHandleProperties);
+    VkMemoryZirconHandlePropertiesFUCHSIA* pMemoryZirconHandleProperties) {
+    mImpl->vkGetMemoryZirconHandlePropertiesFUCHSIA(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                    input_result, device, handleType, zirconHandle,
+                                                    pMemoryZirconHandleProperties);
 }
 #endif
 #ifdef VK_FUCHSIA_external_semaphore
 void VkDecoderSnapshot::vkImportSemaphoreZirconHandleFUCHSIA(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkImportSemaphoreZirconHandleInfoFUCHSIA* pImportSemaphoreZirconHandleInfo)
-{
-    mImpl->vkImportSemaphoreZirconHandleFUCHSIA(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pImportSemaphoreZirconHandleInfo);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device,
+    const VkImportSemaphoreZirconHandleInfoFUCHSIA* pImportSemaphoreZirconHandleInfo) {
+    mImpl->vkImportSemaphoreZirconHandleFUCHSIA(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                input_result, device,
+                                                pImportSemaphoreZirconHandleInfo);
 }
 #endif
 #ifdef VK_FUCHSIA_external_semaphore
 void VkDecoderSnapshot::vkGetSemaphoreZirconHandleFUCHSIA(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkSemaphoreGetZirconHandleInfoFUCHSIA* pGetZirconHandleInfo,
-    zx_handle_t* pZirconHandle)
-{
-    mImpl->vkGetSemaphoreZirconHandleFUCHSIA(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pGetZirconHandleInfo, pZirconHandle);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device,
+    const VkSemaphoreGetZirconHandleInfoFUCHSIA* pGetZirconHandleInfo, zx_handle_t* pZirconHandle) {
+    mImpl->vkGetSemaphoreZirconHandleFUCHSIA(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                             input_result, device, pGetZirconHandleInfo,
+                                             pZirconHandle);
 }
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
 void VkDecoderSnapshot::vkCreateBufferCollectionFUCHSIA(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkBufferCollectionCreateInfoFUCHSIA* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkBufferCollectionFUCHSIA* pCollection)
-{
-    mImpl->vkCreateBufferCollectionFUCHSIA(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pCreateInfo, pAllocator, pCollection);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, const VkBufferCollectionCreateInfoFUCHSIA* pCreateInfo,
+    const VkAllocationCallbacks* pAllocator, VkBufferCollectionFUCHSIA* pCollection) {
+    mImpl->vkCreateBufferCollectionFUCHSIA(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                           input_result, device, pCreateInfo, pAllocator,
+                                           pCollection);
 }
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
 void VkDecoderSnapshot::vkSetBufferCollectionImageConstraintsFUCHSIA(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkBufferCollectionFUCHSIA collection,
-    const VkImageConstraintsInfoFUCHSIA* pImageConstraintsInfo)
-{
-    mImpl->vkSetBufferCollectionImageConstraintsFUCHSIA(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, collection, pImageConstraintsInfo);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, VkBufferCollectionFUCHSIA collection,
+    const VkImageConstraintsInfoFUCHSIA* pImageConstraintsInfo) {
+    mImpl->vkSetBufferCollectionImageConstraintsFUCHSIA(snapshotTraceBegin, snapshotTraceBytes,
+                                                        pool, input_result, device, collection,
+                                                        pImageConstraintsInfo);
 }
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
 void VkDecoderSnapshot::vkSetBufferCollectionBufferConstraintsFUCHSIA(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkBufferCollectionFUCHSIA collection,
-    const VkBufferConstraintsInfoFUCHSIA* pBufferConstraintsInfo)
-{
-    mImpl->vkSetBufferCollectionBufferConstraintsFUCHSIA(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, collection, pBufferConstraintsInfo);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, VkBufferCollectionFUCHSIA collection,
+    const VkBufferConstraintsInfoFUCHSIA* pBufferConstraintsInfo) {
+    mImpl->vkSetBufferCollectionBufferConstraintsFUCHSIA(snapshotTraceBegin, snapshotTraceBytes,
+                                                         pool, input_result, device, collection,
+                                                         pBufferConstraintsInfo);
 }
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
-void VkDecoderSnapshot::vkDestroyBufferCollectionFUCHSIA(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkBufferCollectionFUCHSIA collection,
-    const VkAllocationCallbacks* pAllocator)
-{
-    mImpl->vkDestroyBufferCollectionFUCHSIA(snapshotTraceBegin, snapshotTraceBytes, pool, device, collection, pAllocator);
+void VkDecoderSnapshot::vkDestroyBufferCollectionFUCHSIA(const uint8_t* snapshotTraceBegin,
+                                                         size_t snapshotTraceBytes,
+                                                         android::base::BumpPool* pool,
+                                                         VkDevice device,
+                                                         VkBufferCollectionFUCHSIA collection,
+                                                         const VkAllocationCallbacks* pAllocator) {
+    mImpl->vkDestroyBufferCollectionFUCHSIA(snapshotTraceBegin, snapshotTraceBytes, pool, device,
+                                            collection, pAllocator);
 }
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
 void VkDecoderSnapshot::vkGetBufferCollectionPropertiesFUCHSIA(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkBufferCollectionFUCHSIA collection,
-    VkBufferCollectionPropertiesFUCHSIA* pProperties)
-{
-    mImpl->vkGetBufferCollectionPropertiesFUCHSIA(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, collection, pProperties);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, VkBufferCollectionFUCHSIA collection,
+    VkBufferCollectionPropertiesFUCHSIA* pProperties) {
+    mImpl->vkGetBufferCollectionPropertiesFUCHSIA(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                  input_result, device, collection, pProperties);
 }
 #endif
 #ifdef VK_HUAWEI_subpass_shading
 void VkDecoderSnapshot::vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkRenderPass renderpass,
-    VkExtent2D* pMaxWorkgroupSize)
-{
-    mImpl->vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, renderpass, pMaxWorkgroupSize);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, VkRenderPass renderpass,
+    VkExtent2D* pMaxWorkgroupSize) {
+    mImpl->vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI(snapshotTraceBegin, snapshotTraceBytes,
+                                                           pool, input_result, device, renderpass,
+                                                           pMaxWorkgroupSize);
 }
 #endif
 #ifdef VK_HUAWEI_subpass_shading
-void VkDecoderSnapshot::vkCmdSubpassShadingHUAWEI(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer)
-{
+void VkDecoderSnapshot::vkCmdSubpassShadingHUAWEI(const uint8_t* snapshotTraceBegin,
+                                                  size_t snapshotTraceBytes,
+                                                  android::base::BumpPool* pool,
+                                                  VkCommandBuffer commandBuffer) {
     mImpl->vkCmdSubpassShadingHUAWEI(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer);
 }
 #endif
 #ifdef VK_HUAWEI_invocation_mask
 void VkDecoderSnapshot::vkCmdBindInvocationMaskHUAWEI(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkImageView imageView,
-    VkImageLayout imageLayout)
-{
-    mImpl->vkCmdBindInvocationMaskHUAWEI(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, imageView, imageLayout);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, VkImageView imageView, VkImageLayout imageLayout) {
+    mImpl->vkCmdBindInvocationMaskHUAWEI(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                         commandBuffer, imageView, imageLayout);
 }
 #endif
 #ifdef VK_NV_external_memory_rdma
 void VkDecoderSnapshot::vkGetMemoryRemoteAddressNV(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device,
     const VkMemoryGetRemoteAddressInfoNV* pMemoryGetRemoteAddressInfo,
-    VkRemoteAddressNV* pAddress)
-{
-    mImpl->vkGetMemoryRemoteAddressNV(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pMemoryGetRemoteAddressInfo, pAddress);
+    VkRemoteAddressNV* pAddress) {
+    mImpl->vkGetMemoryRemoteAddressNV(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                      device, pMemoryGetRemoteAddressInfo, pAddress);
 }
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
-void VkDecoderSnapshot::vkCmdSetPatchControlPointsEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t patchControlPoints)
-{
-    mImpl->vkCmdSetPatchControlPointsEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, patchControlPoints);
+void VkDecoderSnapshot::vkCmdSetPatchControlPointsEXT(const uint8_t* snapshotTraceBegin,
+                                                      size_t snapshotTraceBytes,
+                                                      android::base::BumpPool* pool,
+                                                      VkCommandBuffer commandBuffer,
+                                                      uint32_t patchControlPoints) {
+    mImpl->vkCmdSetPatchControlPointsEXT(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                         commandBuffer, patchControlPoints);
 }
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
-void VkDecoderSnapshot::vkCmdSetRasterizerDiscardEnableEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBool32 rasterizerDiscardEnable)
-{
-    mImpl->vkCmdSetRasterizerDiscardEnableEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, rasterizerDiscardEnable);
+void VkDecoderSnapshot::vkCmdSetRasterizerDiscardEnableEXT(const uint8_t* snapshotTraceBegin,
+                                                           size_t snapshotTraceBytes,
+                                                           android::base::BumpPool* pool,
+                                                           VkCommandBuffer commandBuffer,
+                                                           VkBool32 rasterizerDiscardEnable) {
+    mImpl->vkCmdSetRasterizerDiscardEnableEXT(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                              commandBuffer, rasterizerDiscardEnable);
 }
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
-void VkDecoderSnapshot::vkCmdSetDepthBiasEnableEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBool32 depthBiasEnable)
-{
-    mImpl->vkCmdSetDepthBiasEnableEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, depthBiasEnable);
+void VkDecoderSnapshot::vkCmdSetDepthBiasEnableEXT(const uint8_t* snapshotTraceBegin,
+                                                   size_t snapshotTraceBytes,
+                                                   android::base::BumpPool* pool,
+                                                   VkCommandBuffer commandBuffer,
+                                                   VkBool32 depthBiasEnable) {
+    mImpl->vkCmdSetDepthBiasEnableEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                      depthBiasEnable);
 }
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
-void VkDecoderSnapshot::vkCmdSetLogicOpEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkLogicOp logicOp)
-{
+void VkDecoderSnapshot::vkCmdSetLogicOpEXT(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkCommandBuffer commandBuffer, VkLogicOp logicOp) {
     mImpl->vkCmdSetLogicOpEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, logicOp);
 }
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
-void VkDecoderSnapshot::vkCmdSetPrimitiveRestartEnableEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkBool32 primitiveRestartEnable)
-{
-    mImpl->vkCmdSetPrimitiveRestartEnableEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, primitiveRestartEnable);
+void VkDecoderSnapshot::vkCmdSetPrimitiveRestartEnableEXT(const uint8_t* snapshotTraceBegin,
+                                                          size_t snapshotTraceBytes,
+                                                          android::base::BumpPool* pool,
+                                                          VkCommandBuffer commandBuffer,
+                                                          VkBool32 primitiveRestartEnable) {
+    mImpl->vkCmdSetPrimitiveRestartEnableEXT(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                             commandBuffer, primitiveRestartEnable);
 }
 #endif
 #ifdef VK_QNX_screen_surface
 void VkDecoderSnapshot::vkCreateScreenSurfaceQNX(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkInstance instance,
-    const VkScreenSurfaceCreateInfoQNX* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
-{
-    mImpl->vkCreateScreenSurfaceQNX(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, instance, pCreateInfo, pAllocator, pSurface);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkInstance instance, const VkScreenSurfaceCreateInfoQNX* pCreateInfo,
+    const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) {
+    mImpl->vkCreateScreenSurfaceQNX(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                    instance, pCreateInfo, pAllocator, pSurface);
 }
 #endif
 #ifdef VK_QNX_screen_surface
 void VkDecoderSnapshot::vkGetPhysicalDeviceScreenPresentationSupportQNX(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkBool32 input_result,
-    VkPhysicalDevice physicalDevice,
-    uint32_t queueFamilyIndex,
-    _screen_window* window)
-{
-    mImpl->vkGetPhysicalDeviceScreenPresentationSupportQNX(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, physicalDevice, queueFamilyIndex, window);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkBool32 input_result, VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
+    _screen_window* window) {
+    mImpl->vkGetPhysicalDeviceScreenPresentationSupportQNX(snapshotTraceBegin, snapshotTraceBytes,
+                                                           pool, input_result, physicalDevice,
+                                                           queueFamilyIndex, window);
 }
 #endif
 #ifdef VK_EXT_color_write_enable
 void VkDecoderSnapshot::vkCmdSetColorWriteEnableEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t attachmentCount,
-    const VkBool32* pColorWriteEnables)
-{
-    mImpl->vkCmdSetColorWriteEnableEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, attachmentCount, pColorWriteEnables);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, uint32_t attachmentCount, const VkBool32* pColorWriteEnables) {
+    mImpl->vkCmdSetColorWriteEnableEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                       attachmentCount, pColorWriteEnables);
 }
 #endif
 #ifdef VK_GOOGLE_gfxstream
-void VkDecoderSnapshot::vkRegisterImageColorBufferGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkImage image,
-    uint32_t colorBuffer)
-{
-    mImpl->vkRegisterImageColorBufferGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, image, colorBuffer);
+void VkDecoderSnapshot::vkRegisterImageColorBufferGOOGLE(const uint8_t* snapshotTraceBegin,
+                                                         size_t snapshotTraceBytes,
+                                                         android::base::BumpPool* pool,
+                                                         VkResult input_result, VkDevice device,
+                                                         VkImage image, uint32_t colorBuffer) {
+    mImpl->vkRegisterImageColorBufferGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                            input_result, device, image, colorBuffer);
 }
 #endif
 #ifdef VK_GOOGLE_gfxstream
-void VkDecoderSnapshot::vkRegisterBufferColorBufferGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkBuffer buffer,
-    uint32_t colorBuffer)
-{
-    mImpl->vkRegisterBufferColorBufferGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, buffer, colorBuffer);
+void VkDecoderSnapshot::vkRegisterBufferColorBufferGOOGLE(const uint8_t* snapshotTraceBegin,
+                                                          size_t snapshotTraceBytes,
+                                                          android::base::BumpPool* pool,
+                                                          VkResult input_result, VkDevice device,
+                                                          VkBuffer buffer, uint32_t colorBuffer) {
+    mImpl->vkRegisterBufferColorBufferGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                             input_result, device, buffer, colorBuffer);
 }
 #endif
 #ifdef VK_GOOGLE_gfxstream
 void VkDecoderSnapshot::vkMapMemoryIntoAddressSpaceGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkDeviceMemory memory,
-    uint64_t* pAddress)
-{
-    mImpl->vkMapMemoryIntoAddressSpaceGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, memory, pAddress);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, VkDeviceMemory memory, uint64_t* pAddress) {
+    mImpl->vkMapMemoryIntoAddressSpaceGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                             input_result, device, memory, pAddress);
 }
 #endif
 #ifdef VK_GOOGLE_gfxstream
 void VkDecoderSnapshot::vkUpdateDescriptorSetWithTemplateSizedGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkDescriptorSet descriptorSet,
-    VkDescriptorUpdateTemplate descriptorUpdateTemplate,
-    uint32_t imageInfoCount,
-    uint32_t bufferInfoCount,
-    uint32_t bufferViewCount,
-    const uint32_t* pImageInfoEntryIndices,
-    const uint32_t* pBufferInfoEntryIndices,
-    const uint32_t* pBufferViewEntryIndices,
-    const VkDescriptorImageInfo* pImageInfos,
-    const VkDescriptorBufferInfo* pBufferInfos,
-    const VkBufferView* pBufferViews)
-{
-    mImpl->vkUpdateDescriptorSetWithTemplateSizedGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool, device, descriptorSet, descriptorUpdateTemplate, imageInfoCount, bufferInfoCount, bufferViewCount, pImageInfoEntryIndices, pBufferInfoEntryIndices, pBufferViewEntryIndices, pImageInfos, pBufferInfos, pBufferViews);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkDevice device, VkDescriptorSet descriptorSet,
+    VkDescriptorUpdateTemplate descriptorUpdateTemplate, uint32_t imageInfoCount,
+    uint32_t bufferInfoCount, uint32_t bufferViewCount, const uint32_t* pImageInfoEntryIndices,
+    const uint32_t* pBufferInfoEntryIndices, const uint32_t* pBufferViewEntryIndices,
+    const VkDescriptorImageInfo* pImageInfos, const VkDescriptorBufferInfo* pBufferInfos,
+    const VkBufferView* pBufferViews) {
+    mImpl->vkUpdateDescriptorSetWithTemplateSizedGOOGLE(
+        snapshotTraceBegin, snapshotTraceBytes, pool, device, descriptorSet,
+        descriptorUpdateTemplate, imageInfoCount, bufferInfoCount, bufferViewCount,
+        pImageInfoEntryIndices, pBufferInfoEntryIndices, pBufferViewEntryIndices, pImageInfos,
+        pBufferInfos, pBufferViews);
 }
 #endif
 #ifdef VK_GOOGLE_gfxstream
 void VkDecoderSnapshot::vkBeginCommandBufferAsyncGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkCommandBufferBeginInfo* pBeginInfo)
-{
-    mImpl->vkBeginCommandBufferAsyncGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pBeginInfo);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo* pBeginInfo) {
+    mImpl->vkBeginCommandBufferAsyncGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                           commandBuffer, pBeginInfo);
 }
 #endif
 #ifdef VK_GOOGLE_gfxstream
-void VkDecoderSnapshot::vkEndCommandBufferAsyncGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer)
-{
-    mImpl->vkEndCommandBufferAsyncGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer);
+void VkDecoderSnapshot::vkEndCommandBufferAsyncGOOGLE(const uint8_t* snapshotTraceBegin,
+                                                      size_t snapshotTraceBytes,
+                                                      android::base::BumpPool* pool,
+                                                      VkCommandBuffer commandBuffer) {
+    mImpl->vkEndCommandBufferAsyncGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                         commandBuffer);
 }
 #endif
 #ifdef VK_GOOGLE_gfxstream
-void VkDecoderSnapshot::vkResetCommandBufferAsyncGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    VkCommandBufferResetFlags flags)
-{
-    mImpl->vkResetCommandBufferAsyncGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, flags);
+void VkDecoderSnapshot::vkResetCommandBufferAsyncGOOGLE(const uint8_t* snapshotTraceBegin,
+                                                        size_t snapshotTraceBytes,
+                                                        android::base::BumpPool* pool,
+                                                        VkCommandBuffer commandBuffer,
+                                                        VkCommandBufferResetFlags flags) {
+    mImpl->vkResetCommandBufferAsyncGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                           commandBuffer, flags);
 }
 #endif
 #ifdef VK_GOOGLE_gfxstream
 void VkDecoderSnapshot::vkCommandBufferHostSyncGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t needHostSync,
-    uint32_t sequenceNumber)
-{
-    mImpl->vkCommandBufferHostSyncGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, needHostSync, sequenceNumber);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, uint32_t needHostSync, uint32_t sequenceNumber) {
+    mImpl->vkCommandBufferHostSyncGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                         commandBuffer, needHostSync, sequenceNumber);
 }
 #endif
 #ifdef VK_GOOGLE_gfxstream
 void VkDecoderSnapshot::vkCreateImageWithRequirementsGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkImageCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkImage* pImage,
-    VkMemoryRequirements* pMemoryRequirements)
-{
-    mImpl->vkCreateImageWithRequirementsGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pCreateInfo, pAllocator, pImage, pMemoryRequirements);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, const VkImageCreateInfo* pCreateInfo,
+    const VkAllocationCallbacks* pAllocator, VkImage* pImage,
+    VkMemoryRequirements* pMemoryRequirements) {
+    mImpl->vkCreateImageWithRequirementsGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                               input_result, device, pCreateInfo, pAllocator,
+                                               pImage, pMemoryRequirements);
 }
 #endif
 #ifdef VK_GOOGLE_gfxstream
 void VkDecoderSnapshot::vkCreateBufferWithRequirementsGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkBufferCreateInfo* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkBuffer* pBuffer,
-    VkMemoryRequirements* pMemoryRequirements)
-{
-    mImpl->vkCreateBufferWithRequirementsGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pCreateInfo, pAllocator, pBuffer, pMemoryRequirements);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, const VkBufferCreateInfo* pCreateInfo,
+    const VkAllocationCallbacks* pAllocator, VkBuffer* pBuffer,
+    VkMemoryRequirements* pMemoryRequirements) {
+    mImpl->vkCreateBufferWithRequirementsGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                input_result, device, pCreateInfo, pAllocator,
+                                                pBuffer, pMemoryRequirements);
 }
 #endif
 #ifdef VK_GOOGLE_gfxstream
-void VkDecoderSnapshot::vkGetMemoryHostAddressInfoGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkDeviceMemory memory,
-    uint64_t* pAddress,
-    uint64_t* pSize,
-    uint64_t* pHostmemId)
-{
-    mImpl->vkGetMemoryHostAddressInfoGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, memory, pAddress, pSize, pHostmemId);
+void VkDecoderSnapshot::vkGetMemoryHostAddressInfoGOOGLE(const uint8_t* snapshotTraceBegin,
+                                                         size_t snapshotTraceBytes,
+                                                         android::base::BumpPool* pool,
+                                                         VkResult input_result, VkDevice device,
+                                                         VkDeviceMemory memory, uint64_t* pAddress,
+                                                         uint64_t* pSize, uint64_t* pHostmemId) {
+    mImpl->vkGetMemoryHostAddressInfoGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                            input_result, device, memory, pAddress, pSize,
+                                            pHostmemId);
 }
 #endif
 #ifdef VK_GOOGLE_gfxstream
-void VkDecoderSnapshot::vkFreeMemorySyncGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkDeviceMemory memory,
-    const VkAllocationCallbacks* pAllocator)
-{
-    mImpl->vkFreeMemorySyncGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, memory, pAllocator);
+void VkDecoderSnapshot::vkFreeMemorySyncGOOGLE(const uint8_t* snapshotTraceBegin,
+                                               size_t snapshotTraceBytes,
+                                               android::base::BumpPool* pool, VkResult input_result,
+                                               VkDevice device, VkDeviceMemory memory,
+                                               const VkAllocationCallbacks* pAllocator) {
+    mImpl->vkFreeMemorySyncGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool, input_result,
+                                  device, memory, pAllocator);
 }
 #endif
 #ifdef VK_GOOGLE_gfxstream
-void VkDecoderSnapshot::vkQueueHostSyncGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkQueue queue,
-    uint32_t needHostSync,
-    uint32_t sequenceNumber)
-{
-    mImpl->vkQueueHostSyncGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool, queue, needHostSync, sequenceNumber);
+void VkDecoderSnapshot::vkQueueHostSyncGOOGLE(const uint8_t* snapshotTraceBegin,
+                                              size_t snapshotTraceBytes,
+                                              android::base::BumpPool* pool, VkQueue queue,
+                                              uint32_t needHostSync, uint32_t sequenceNumber) {
+    mImpl->vkQueueHostSyncGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool, queue, needHostSync,
+                                 sequenceNumber);
 }
 #endif
 #ifdef VK_GOOGLE_gfxstream
-void VkDecoderSnapshot::vkQueueSubmitAsyncGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkQueue queue,
-    uint32_t submitCount,
-    const VkSubmitInfo* pSubmits,
-    VkFence fence)
-{
-    mImpl->vkQueueSubmitAsyncGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool, queue, submitCount, pSubmits, fence);
+void VkDecoderSnapshot::vkQueueSubmitAsyncGOOGLE(const uint8_t* snapshotTraceBegin,
+                                                 size_t snapshotTraceBytes,
+                                                 android::base::BumpPool* pool, VkQueue queue,
+                                                 uint32_t submitCount, const VkSubmitInfo* pSubmits,
+                                                 VkFence fence) {
+    mImpl->vkQueueSubmitAsyncGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool, queue,
+                                    submitCount, pSubmits, fence);
 }
 #endif
 #ifdef VK_GOOGLE_gfxstream
-void VkDecoderSnapshot::vkQueueWaitIdleAsyncGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkQueue queue)
-{
+void VkDecoderSnapshot::vkQueueWaitIdleAsyncGOOGLE(const uint8_t* snapshotTraceBegin,
+                                                   size_t snapshotTraceBytes,
+                                                   android::base::BumpPool* pool, VkQueue queue) {
     mImpl->vkQueueWaitIdleAsyncGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool, queue);
 }
 #endif
 #ifdef VK_GOOGLE_gfxstream
 void VkDecoderSnapshot::vkQueueBindSparseAsyncGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkQueue queue,
-    uint32_t bindInfoCount,
-    const VkBindSparseInfo* pBindInfo,
-    VkFence fence)
-{
-    mImpl->vkQueueBindSparseAsyncGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool, queue, bindInfoCount, pBindInfo, fence);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo* pBindInfo, VkFence fence) {
+    mImpl->vkQueueBindSparseAsyncGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool, queue,
+                                        bindInfoCount, pBindInfo, fence);
 }
 #endif
 #ifdef VK_GOOGLE_gfxstream
-void VkDecoderSnapshot::vkGetLinearImageLayoutGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkFormat format,
-    VkDeviceSize* pOffset,
-    VkDeviceSize* pRowPitchAlignment)
-{
-    mImpl->vkGetLinearImageLayoutGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool, device, format, pOffset, pRowPitchAlignment);
+void VkDecoderSnapshot::vkGetLinearImageLayoutGOOGLE(const uint8_t* snapshotTraceBegin,
+                                                     size_t snapshotTraceBytes,
+                                                     android::base::BumpPool* pool, VkDevice device,
+                                                     VkFormat format, VkDeviceSize* pOffset,
+                                                     VkDeviceSize* pRowPitchAlignment) {
+    mImpl->vkGetLinearImageLayoutGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool, device,
+                                        format, pOffset, pRowPitchAlignment);
 }
 #endif
 #ifdef VK_GOOGLE_gfxstream
 void VkDecoderSnapshot::vkGetLinearImageLayout2GOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    const VkImageCreateInfo* pCreateInfo,
-    VkDeviceSize* pOffset,
-    VkDeviceSize* pRowPitchAlignment)
-{
-    mImpl->vkGetLinearImageLayout2GOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool, device, pCreateInfo, pOffset, pRowPitchAlignment);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkDevice device, const VkImageCreateInfo* pCreateInfo, VkDeviceSize* pOffset,
+    VkDeviceSize* pRowPitchAlignment) {
+    mImpl->vkGetLinearImageLayout2GOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool, device,
+                                         pCreateInfo, pOffset, pRowPitchAlignment);
 }
 #endif
 #ifdef VK_GOOGLE_gfxstream
-void VkDecoderSnapshot::vkQueueFlushCommandsGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkQueue queue,
-    VkCommandBuffer commandBuffer,
-    VkDeviceSize dataSize,
-    const void* pData)
-{
-    mImpl->vkQueueFlushCommandsGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool, queue, commandBuffer, dataSize, pData);
+void VkDecoderSnapshot::vkQueueFlushCommandsGOOGLE(const uint8_t* snapshotTraceBegin,
+                                                   size_t snapshotTraceBytes,
+                                                   android::base::BumpPool* pool, VkQueue queue,
+                                                   VkCommandBuffer commandBuffer,
+                                                   VkDeviceSize dataSize, const void* pData) {
+    mImpl->vkQueueFlushCommandsGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool, queue,
+                                      commandBuffer, dataSize, pData);
 }
 #endif
 #ifdef VK_GOOGLE_gfxstream
 void VkDecoderSnapshot::vkQueueCommitDescriptorSetUpdatesGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkQueue queue,
-    uint32_t descriptorPoolCount,
-    const VkDescriptorPool* pDescriptorPools,
-    uint32_t descriptorSetCount,
-    const VkDescriptorSetLayout* pSetLayouts,
-    const uint64_t* pDescriptorSetPoolIds,
-    const uint32_t* pDescriptorSetWhichPool,
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkQueue queue, uint32_t descriptorPoolCount, const VkDescriptorPool* pDescriptorPools,
+    uint32_t descriptorSetCount, const VkDescriptorSetLayout* pSetLayouts,
+    const uint64_t* pDescriptorSetPoolIds, const uint32_t* pDescriptorSetWhichPool,
     const uint32_t* pDescriptorSetPendingAllocation,
-    const uint32_t* pDescriptorWriteStartingIndices,
-    uint32_t pendingDescriptorWriteCount,
-    const VkWriteDescriptorSet* pPendingDescriptorWrites)
-{
-    mImpl->vkQueueCommitDescriptorSetUpdatesGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool, queue, descriptorPoolCount, pDescriptorPools, descriptorSetCount, pSetLayouts, pDescriptorSetPoolIds, pDescriptorSetWhichPool, pDescriptorSetPendingAllocation, pDescriptorWriteStartingIndices, pendingDescriptorWriteCount, pPendingDescriptorWrites);
+    const uint32_t* pDescriptorWriteStartingIndices, uint32_t pendingDescriptorWriteCount,
+    const VkWriteDescriptorSet* pPendingDescriptorWrites) {
+    mImpl->vkQueueCommitDescriptorSetUpdatesGOOGLE(
+        snapshotTraceBegin, snapshotTraceBytes, pool, queue, descriptorPoolCount, pDescriptorPools,
+        descriptorSetCount, pSetLayouts, pDescriptorSetPoolIds, pDescriptorSetWhichPool,
+        pDescriptorSetPendingAllocation, pDescriptorWriteStartingIndices,
+        pendingDescriptorWriteCount, pPendingDescriptorWrites);
 }
 #endif
 #ifdef VK_GOOGLE_gfxstream
 void VkDecoderSnapshot::vkCollectDescriptorPoolIdsGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkDescriptorPool descriptorPool,
-    uint32_t* pPoolIdCount,
-    uint64_t* pPoolIds)
-{
-    mImpl->vkCollectDescriptorPoolIdsGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool, device, descriptorPool, pPoolIdCount, pPoolIds);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkDevice device, VkDescriptorPool descriptorPool, uint32_t* pPoolIdCount, uint64_t* pPoolIds) {
+    mImpl->vkCollectDescriptorPoolIdsGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool, device,
+                                            descriptorPool, pPoolIdCount, pPoolIds);
 }
 #endif
 #ifdef VK_GOOGLE_gfxstream
 void VkDecoderSnapshot::vkQueueSignalReleaseImageANDROIDAsyncGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkQueue queue,
-    uint32_t waitSemaphoreCount,
-    const VkSemaphore* pWaitSemaphores,
-    VkImage image)
-{
-    mImpl->vkQueueSignalReleaseImageANDROIDAsyncGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool, queue, waitSemaphoreCount, pWaitSemaphores, image);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkQueue queue, uint32_t waitSemaphoreCount, const VkSemaphore* pWaitSemaphores, VkImage image) {
+    mImpl->vkQueueSignalReleaseImageANDROIDAsyncGOOGLE(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                       queue, waitSemaphoreCount, pWaitSemaphores,
+                                                       image);
 }
 #endif
 #ifdef VK_EXT_multi_draw
-void VkDecoderSnapshot::vkCmdDrawMultiEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t drawCount,
-    const VkMultiDrawInfoEXT* pVertexInfo,
-    uint32_t instanceCount,
-    uint32_t firstInstance,
-    uint32_t stride)
-{
-    mImpl->vkCmdDrawMultiEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, drawCount, pVertexInfo, instanceCount, firstInstance, stride);
+void VkDecoderSnapshot::vkCmdDrawMultiEXT(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkCommandBuffer commandBuffer, uint32_t drawCount,
+                                          const VkMultiDrawInfoEXT* pVertexInfo,
+                                          uint32_t instanceCount, uint32_t firstInstance,
+                                          uint32_t stride) {
+    mImpl->vkCmdDrawMultiEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, drawCount,
+                             pVertexInfo, instanceCount, firstInstance, stride);
 }
 #endif
 #ifdef VK_EXT_multi_draw
 void VkDecoderSnapshot::vkCmdDrawMultiIndexedEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t drawCount,
-    const VkMultiDrawIndexedInfoEXT* pIndexInfo,
-    uint32_t instanceCount,
-    uint32_t firstInstance,
-    uint32_t stride,
-    const int32_t* pVertexOffset)
-{
-    mImpl->vkCmdDrawMultiIndexedEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, drawCount, pIndexInfo, instanceCount, firstInstance, stride, pVertexOffset);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, uint32_t drawCount, const VkMultiDrawIndexedInfoEXT* pIndexInfo,
+    uint32_t instanceCount, uint32_t firstInstance, uint32_t stride, const int32_t* pVertexOffset) {
+    mImpl->vkCmdDrawMultiIndexedEXT(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                    drawCount, pIndexInfo, instanceCount, firstInstance, stride,
+                                    pVertexOffset);
 }
 #endif
 #ifdef VK_EXT_pageable_device_local_memory
-void VkDecoderSnapshot::vkSetDeviceMemoryPriorityEXT(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkDeviceMemory memory,
-    float priority)
-{
-    mImpl->vkSetDeviceMemoryPriorityEXT(snapshotTraceBegin, snapshotTraceBytes, pool, device, memory, priority);
+void VkDecoderSnapshot::vkSetDeviceMemoryPriorityEXT(const uint8_t* snapshotTraceBegin,
+                                                     size_t snapshotTraceBytes,
+                                                     android::base::BumpPool* pool, VkDevice device,
+                                                     VkDeviceMemory memory, float priority) {
+    mImpl->vkSetDeviceMemoryPriorityEXT(snapshotTraceBegin, snapshotTraceBytes, pool, device,
+                                        memory, priority);
 }
 #endif
 #ifdef VK_KHR_acceleration_structure
 void VkDecoderSnapshot::vkCreateAccelerationStructureKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    const VkAccelerationStructureCreateInfoKHR* pCreateInfo,
-    const VkAllocationCallbacks* pAllocator,
-    VkAccelerationStructureKHR* pAccelerationStructure)
-{
-    mImpl->vkCreateAccelerationStructureKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pCreateInfo, pAllocator, pAccelerationStructure);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, const VkAccelerationStructureCreateInfoKHR* pCreateInfo,
+    const VkAllocationCallbacks* pAllocator, VkAccelerationStructureKHR* pAccelerationStructure) {
+    mImpl->vkCreateAccelerationStructureKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                            input_result, device, pCreateInfo, pAllocator,
+                                            pAccelerationStructure);
 }
 #endif
 #ifdef VK_KHR_acceleration_structure
 void VkDecoderSnapshot::vkDestroyAccelerationStructureKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkAccelerationStructureKHR accelerationStructure,
-    const VkAllocationCallbacks* pAllocator)
-{
-    mImpl->vkDestroyAccelerationStructureKHR(snapshotTraceBegin, snapshotTraceBytes, pool, device, accelerationStructure, pAllocator);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkDevice device, VkAccelerationStructureKHR accelerationStructure,
+    const VkAllocationCallbacks* pAllocator) {
+    mImpl->vkDestroyAccelerationStructureKHR(snapshotTraceBegin, snapshotTraceBytes, pool, device,
+                                             accelerationStructure, pAllocator);
 }
 #endif
 #ifdef VK_KHR_acceleration_structure
 void VkDecoderSnapshot::vkCmdBuildAccelerationStructuresKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t infoCount,
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, uint32_t infoCount,
     const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,
-    const VkAccelerationStructureBuildRangeInfoKHR* const* ppBuildRangeInfos)
-{
-    mImpl->vkCmdBuildAccelerationStructuresKHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, infoCount, pInfos, ppBuildRangeInfos);
+    const VkAccelerationStructureBuildRangeInfoKHR* const* ppBuildRangeInfos) {
+    mImpl->vkCmdBuildAccelerationStructuresKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                               commandBuffer, infoCount, pInfos, ppBuildRangeInfos);
 }
 #endif
 #ifdef VK_KHR_acceleration_structure
 void VkDecoderSnapshot::vkCmdBuildAccelerationStructuresIndirectKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t infoCount,
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, uint32_t infoCount,
     const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,
-    const VkDeviceAddress* pIndirectDeviceAddresses,
-    const uint32_t* pIndirectStrides,
-    const uint32_t* const* ppMaxPrimitiveCounts)
-{
-    mImpl->vkCmdBuildAccelerationStructuresIndirectKHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, infoCount, pInfos, pIndirectDeviceAddresses, pIndirectStrides, ppMaxPrimitiveCounts);
+    const VkDeviceAddress* pIndirectDeviceAddresses, const uint32_t* pIndirectStrides,
+    const uint32_t* const* ppMaxPrimitiveCounts) {
+    mImpl->vkCmdBuildAccelerationStructuresIndirectKHR(
+        snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, infoCount, pInfos,
+        pIndirectDeviceAddresses, pIndirectStrides, ppMaxPrimitiveCounts);
 }
 #endif
 #ifdef VK_KHR_acceleration_structure
 void VkDecoderSnapshot::vkBuildAccelerationStructuresKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkDeferredOperationKHR deferredOperation,
-    uint32_t infoCount,
-    const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,
-    const VkAccelerationStructureBuildRangeInfoKHR* const* ppBuildRangeInfos)
-{
-    mImpl->vkBuildAccelerationStructuresKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, deferredOperation, infoCount, pInfos, ppBuildRangeInfos);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, VkDeferredOperationKHR deferredOperation,
+    uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,
+    const VkAccelerationStructureBuildRangeInfoKHR* const* ppBuildRangeInfos) {
+    mImpl->vkBuildAccelerationStructuresKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                            input_result, device, deferredOperation, infoCount,
+                                            pInfos, ppBuildRangeInfos);
 }
 #endif
 #ifdef VK_KHR_acceleration_structure
 void VkDecoderSnapshot::vkCopyAccelerationStructureKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkDeferredOperationKHR deferredOperation,
-    const VkCopyAccelerationStructureInfoKHR* pInfo)
-{
-    mImpl->vkCopyAccelerationStructureKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, deferredOperation, pInfo);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, VkDeferredOperationKHR deferredOperation,
+    const VkCopyAccelerationStructureInfoKHR* pInfo) {
+    mImpl->vkCopyAccelerationStructureKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                          input_result, device, deferredOperation, pInfo);
 }
 #endif
 #ifdef VK_KHR_acceleration_structure
 void VkDecoderSnapshot::vkCopyAccelerationStructureToMemoryKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkDeferredOperationKHR deferredOperation,
-    const VkCopyAccelerationStructureToMemoryInfoKHR* pInfo)
-{
-    mImpl->vkCopyAccelerationStructureToMemoryKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, deferredOperation, pInfo);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, VkDeferredOperationKHR deferredOperation,
+    const VkCopyAccelerationStructureToMemoryInfoKHR* pInfo) {
+    mImpl->vkCopyAccelerationStructureToMemoryKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                  input_result, device, deferredOperation, pInfo);
 }
 #endif
 #ifdef VK_KHR_acceleration_structure
 void VkDecoderSnapshot::vkCopyMemoryToAccelerationStructureKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkDeferredOperationKHR deferredOperation,
-    const VkCopyMemoryToAccelerationStructureInfoKHR* pInfo)
-{
-    mImpl->vkCopyMemoryToAccelerationStructureKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, deferredOperation, pInfo);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, VkDeferredOperationKHR deferredOperation,
+    const VkCopyMemoryToAccelerationStructureInfoKHR* pInfo) {
+    mImpl->vkCopyMemoryToAccelerationStructureKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                  input_result, device, deferredOperation, pInfo);
 }
 #endif
 #ifdef VK_KHR_acceleration_structure
 void VkDecoderSnapshot::vkWriteAccelerationStructuresPropertiesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    uint32_t accelerationStructureCount,
-    const VkAccelerationStructureKHR* pAccelerationStructures,
-    VkQueryType queryType,
-    size_t dataSize,
-    void* pData,
-    size_t stride)
-{
-    mImpl->vkWriteAccelerationStructuresPropertiesKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, accelerationStructureCount, pAccelerationStructures, queryType, dataSize, pData, stride);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, uint32_t accelerationStructureCount,
+    const VkAccelerationStructureKHR* pAccelerationStructures, VkQueryType queryType,
+    size_t dataSize, void* pData, size_t stride) {
+    mImpl->vkWriteAccelerationStructuresPropertiesKHR(
+        snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device,
+        accelerationStructureCount, pAccelerationStructures, queryType, dataSize, pData, stride);
 }
 #endif
 #ifdef VK_KHR_acceleration_structure
 void VkDecoderSnapshot::vkCmdCopyAccelerationStructureKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkCopyAccelerationStructureInfoKHR* pInfo)
-{
-    mImpl->vkCmdCopyAccelerationStructureKHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pInfo);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, const VkCopyAccelerationStructureInfoKHR* pInfo) {
+    mImpl->vkCmdCopyAccelerationStructureKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                             commandBuffer, pInfo);
 }
 #endif
 #ifdef VK_KHR_acceleration_structure
 void VkDecoderSnapshot::vkCmdCopyAccelerationStructureToMemoryKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkCopyAccelerationStructureToMemoryInfoKHR* pInfo)
-{
-    mImpl->vkCmdCopyAccelerationStructureToMemoryKHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pInfo);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, const VkCopyAccelerationStructureToMemoryInfoKHR* pInfo) {
+    mImpl->vkCmdCopyAccelerationStructureToMemoryKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                     commandBuffer, pInfo);
 }
 #endif
 #ifdef VK_KHR_acceleration_structure
 void VkDecoderSnapshot::vkCmdCopyMemoryToAccelerationStructureKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkCopyMemoryToAccelerationStructureInfoKHR* pInfo)
-{
-    mImpl->vkCmdCopyMemoryToAccelerationStructureKHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pInfo);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, const VkCopyMemoryToAccelerationStructureInfoKHR* pInfo) {
+    mImpl->vkCmdCopyMemoryToAccelerationStructureKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                     commandBuffer, pInfo);
 }
 #endif
 #ifdef VK_KHR_acceleration_structure
 void VkDecoderSnapshot::vkGetAccelerationStructureDeviceAddressKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDeviceAddress input_result,
-    VkDevice device,
-    const VkAccelerationStructureDeviceAddressInfoKHR* pInfo)
-{
-    mImpl->vkGetAccelerationStructureDeviceAddressKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pInfo);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkDeviceAddress input_result, VkDevice device,
+    const VkAccelerationStructureDeviceAddressInfoKHR* pInfo) {
+    mImpl->vkGetAccelerationStructureDeviceAddressKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                      input_result, device, pInfo);
 }
 #endif
 #ifdef VK_KHR_acceleration_structure
 void VkDecoderSnapshot::vkCmdWriteAccelerationStructuresPropertiesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t accelerationStructureCount,
-    const VkAccelerationStructureKHR* pAccelerationStructures,
-    VkQueryType queryType,
-    VkQueryPool queryPool,
-    uint32_t firstQuery)
-{
-    mImpl->vkCmdWriteAccelerationStructuresPropertiesKHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, accelerationStructureCount, pAccelerationStructures, queryType, queryPool, firstQuery);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, uint32_t accelerationStructureCount,
+    const VkAccelerationStructureKHR* pAccelerationStructures, VkQueryType queryType,
+    VkQueryPool queryPool, uint32_t firstQuery) {
+    mImpl->vkCmdWriteAccelerationStructuresPropertiesKHR(
+        snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, accelerationStructureCount,
+        pAccelerationStructures, queryType, queryPool, firstQuery);
 }
 #endif
 #ifdef VK_KHR_acceleration_structure
 void VkDecoderSnapshot::vkGetDeviceAccelerationStructureCompatibilityKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    const VkAccelerationStructureVersionInfoKHR* pVersionInfo,
-    VkAccelerationStructureCompatibilityKHR* pCompatibility)
-{
-    mImpl->vkGetDeviceAccelerationStructureCompatibilityKHR(snapshotTraceBegin, snapshotTraceBytes, pool, device, pVersionInfo, pCompatibility);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkDevice device, const VkAccelerationStructureVersionInfoKHR* pVersionInfo,
+    VkAccelerationStructureCompatibilityKHR* pCompatibility) {
+    mImpl->vkGetDeviceAccelerationStructureCompatibilityKHR(
+        snapshotTraceBegin, snapshotTraceBytes, pool, device, pVersionInfo, pCompatibility);
 }
 #endif
 #ifdef VK_KHR_acceleration_structure
 void VkDecoderSnapshot::vkGetAccelerationStructureBuildSizesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDevice device,
-    VkAccelerationStructureBuildTypeKHR buildType,
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkDevice device, VkAccelerationStructureBuildTypeKHR buildType,
     const VkAccelerationStructureBuildGeometryInfoKHR* pBuildInfo,
-    const uint32_t* pMaxPrimitiveCounts,
-    VkAccelerationStructureBuildSizesInfoKHR* pSizeInfo)
-{
-    mImpl->vkGetAccelerationStructureBuildSizesKHR(snapshotTraceBegin, snapshotTraceBytes, pool, device, buildType, pBuildInfo, pMaxPrimitiveCounts, pSizeInfo);
+    const uint32_t* pMaxPrimitiveCounts, VkAccelerationStructureBuildSizesInfoKHR* pSizeInfo) {
+    mImpl->vkGetAccelerationStructureBuildSizesKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                   device, buildType, pBuildInfo,
+                                                   pMaxPrimitiveCounts, pSizeInfo);
 }
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
 void VkDecoderSnapshot::vkCmdTraceRaysKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable,
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable,
     const VkStridedDeviceAddressRegionKHR* pMissShaderBindingTable,
     const VkStridedDeviceAddressRegionKHR* pHitShaderBindingTable,
-    const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable,
-    uint32_t width,
-    uint32_t height,
-    uint32_t depth)
-{
-    mImpl->vkCmdTraceRaysKHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pRaygenShaderBindingTable, pMissShaderBindingTable, pHitShaderBindingTable, pCallableShaderBindingTable, width, height, depth);
+    const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable, uint32_t width,
+    uint32_t height, uint32_t depth) {
+    mImpl->vkCmdTraceRaysKHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                             pRaygenShaderBindingTable, pMissShaderBindingTable,
+                             pHitShaderBindingTable, pCallableShaderBindingTable, width, height,
+                             depth);
 }
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
 void VkDecoderSnapshot::vkCreateRayTracingPipelinesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkDeferredOperationKHR deferredOperation,
-    VkPipelineCache pipelineCache,
-    uint32_t createInfoCount,
-    const VkRayTracingPipelineCreateInfoKHR* pCreateInfos,
-    const VkAllocationCallbacks* pAllocator,
-    VkPipeline* pPipelines)
-{
-    mImpl->vkCreateRayTracingPipelinesKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, deferredOperation, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, VkDeferredOperationKHR deferredOperation,
+    VkPipelineCache pipelineCache, uint32_t createInfoCount,
+    const VkRayTracingPipelineCreateInfoKHR* pCreateInfos, const VkAllocationCallbacks* pAllocator,
+    VkPipeline* pPipelines) {
+    mImpl->vkCreateRayTracingPipelinesKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                          input_result, device, deferredOperation, pipelineCache,
+                                          createInfoCount, pCreateInfos, pAllocator, pPipelines);
 }
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
 void VkDecoderSnapshot::vkGetRayTracingCaptureReplayShaderGroupHandlesKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkResult input_result,
-    VkDevice device,
-    VkPipeline pipeline,
-    uint32_t firstGroup,
-    uint32_t groupCount,
-    size_t dataSize,
-    void* pData)
-{
-    mImpl->vkGetRayTracingCaptureReplayShaderGroupHandlesKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pipeline, firstGroup, groupCount, dataSize, pData);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkResult input_result, VkDevice device, VkPipeline pipeline, uint32_t firstGroup,
+    uint32_t groupCount, size_t dataSize, void* pData) {
+    mImpl->vkGetRayTracingCaptureReplayShaderGroupHandlesKHR(
+        snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pipeline, firstGroup,
+        groupCount, dataSize, pData);
 }
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
 void VkDecoderSnapshot::vkCmdTraceRaysIndirectKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable,
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkCommandBuffer commandBuffer, const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable,
     const VkStridedDeviceAddressRegionKHR* pMissShaderBindingTable,
     const VkStridedDeviceAddressRegionKHR* pHitShaderBindingTable,
     const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable,
-    VkDeviceAddress indirectDeviceAddress)
-{
-    mImpl->vkCmdTraceRaysIndirectKHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pRaygenShaderBindingTable, pMissShaderBindingTable, pHitShaderBindingTable, pCallableShaderBindingTable, indirectDeviceAddress);
+    VkDeviceAddress indirectDeviceAddress) {
+    mImpl->vkCmdTraceRaysIndirectKHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer,
+                                     pRaygenShaderBindingTable, pMissShaderBindingTable,
+                                     pHitShaderBindingTable, pCallableShaderBindingTable,
+                                     indirectDeviceAddress);
 }
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
 void VkDecoderSnapshot::vkGetRayTracingShaderGroupStackSizeKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkDeviceSize input_result,
-    VkDevice device,
-    VkPipeline pipeline,
-    uint32_t group,
-    VkShaderGroupShaderKHR groupShader)
-{
-    mImpl->vkGetRayTracingShaderGroupStackSizeKHR(snapshotTraceBegin, snapshotTraceBytes, pool, input_result, device, pipeline, group, groupShader);
+    const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+    VkDeviceSize input_result, VkDevice device, VkPipeline pipeline, uint32_t group,
+    VkShaderGroupShaderKHR groupShader) {
+    mImpl->vkGetRayTracingShaderGroupStackSizeKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                  input_result, device, pipeline, group,
+                                                  groupShader);
 }
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
-void VkDecoderSnapshot::vkCmdSetRayTracingPipelineStackSizeKHR(
-    const uint8_t* snapshotTraceBegin,
-    size_t snapshotTraceBytes,
-    android::base::BumpPool* pool,
-    VkCommandBuffer commandBuffer,
-    uint32_t pipelineStackSize)
-{
-    mImpl->vkCmdSetRayTracingPipelineStackSizeKHR(snapshotTraceBegin, snapshotTraceBytes, pool, commandBuffer, pipelineStackSize);
+void VkDecoderSnapshot::vkCmdSetRayTracingPipelineStackSizeKHR(const uint8_t* snapshotTraceBegin,
+                                                               size_t snapshotTraceBytes,
+                                                               android::base::BumpPool* pool,
+                                                               VkCommandBuffer commandBuffer,
+                                                               uint32_t pipelineStackSize) {
+    mImpl->vkCmdSetRayTracingPipelineStackSizeKHR(snapshotTraceBegin, snapshotTraceBytes, pool,
+                                                  commandBuffer, pipelineStackSize);
 }
 #endif
-
-
diff --git a/stream-servers/vulkan/VkDecoderSnapshot.h b/stream-servers/vulkan/VkDecoderSnapshot.h
index 3e53e64..3460736 100644
--- a/stream-servers/vulkan/VkDecoderSnapshot.h
+++ b/stream-servers/vulkan/VkDecoderSnapshot.h
@@ -14,1991 +14,1038 @@
 // limitations under the License.
 
 // Autogenerated module VkDecoderSnapshot
-// (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
+// (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml
+// cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
 // VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
 // VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+//
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o
+// $CEREAL_OUTPUT_DIR
+//
 #pragma once
 #include <vulkan/vulkan.h>
-#include "vulkan_gfxstream.h"
 
 #include <memory>
+
 #include "base/GfxApiLogger.h"
 #include "common/goldfish_vk_private_defs.h"
-
-
+#include "vulkan_gfxstream.h"
 
 namespace android {
 namespace base {
 class BumpPool;
 class Stream;
-} // namespace base {
-} // namespace android {
+}  // namespace base
+}  // namespace android
 
 class VkDecoderSnapshot {
-public:
+   public:
     VkDecoderSnapshot();
     ~VkDecoderSnapshot();
 
     void save(android::base::Stream* stream);
     void load(android::base::Stream* stream, emugl::GfxApiLogger& gfx_logger);
 #ifdef VK_VERSION_1_0
-    void vkCreateInstance(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        const VkInstanceCreateInfo* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkInstance* pInstance);
-    void vkDestroyInstance(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkInstance instance,
-        const VkAllocationCallbacks* pAllocator);
-    void vkEnumeratePhysicalDevices(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkInstance instance,
-        uint32_t* pPhysicalDeviceCount,
-        VkPhysicalDevice* pPhysicalDevices);
-    void vkGetPhysicalDeviceFeatures(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkPhysicalDevice physicalDevice,
-        VkPhysicalDeviceFeatures* pFeatures);
-    void vkGetPhysicalDeviceFormatProperties(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkPhysicalDevice physicalDevice,
-        VkFormat format,
-        VkFormatProperties* pFormatProperties);
+    void vkCreateInstance(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                          android::base::BumpPool* pool, VkResult input_result,
+                          const VkInstanceCreateInfo* pCreateInfo,
+                          const VkAllocationCallbacks* pAllocator, VkInstance* pInstance);
+    void vkDestroyInstance(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkInstance instance,
+                           const VkAllocationCallbacks* pAllocator);
+    void vkEnumeratePhysicalDevices(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkResult input_result,
+                                    VkInstance instance, uint32_t* pPhysicalDeviceCount,
+                                    VkPhysicalDevice* pPhysicalDevices);
+    void vkGetPhysicalDeviceFeatures(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkPhysicalDevice physicalDevice,
+                                     VkPhysicalDeviceFeatures* pFeatures);
+    void vkGetPhysicalDeviceFormatProperties(const uint8_t* snapshotTraceBegin,
+                                             size_t snapshotTraceBytes,
+                                             android::base::BumpPool* pool,
+                                             VkPhysicalDevice physicalDevice, VkFormat format,
+                                             VkFormatProperties* pFormatProperties);
     void vkGetPhysicalDeviceImageFormatProperties(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
-        VkFormat format,
-        VkImageType type,
-        VkImageTiling tiling,
-        VkImageUsageFlags usage,
-        VkImageCreateFlags flags,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
+        VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags,
         VkImageFormatProperties* pImageFormatProperties);
-    void vkGetPhysicalDeviceProperties(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkPhysicalDevice physicalDevice,
-        VkPhysicalDeviceProperties* pProperties);
-    void vkGetPhysicalDeviceQueueFamilyProperties(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkPhysicalDevice physicalDevice,
-        uint32_t* pQueueFamilyPropertyCount,
-        VkQueueFamilyProperties* pQueueFamilyProperties);
-    void vkGetPhysicalDeviceMemoryProperties(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkPhysicalDevice physicalDevice,
-        VkPhysicalDeviceMemoryProperties* pMemoryProperties);
-    void vkGetInstanceProcAddr(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        PFN_vkVoidFunction input_result,
-        VkInstance instance,
-        const char* pName);
-    void vkGetDeviceProcAddr(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        PFN_vkVoidFunction input_result,
-        VkDevice device,
-        const char* pName);
-    void vkCreateDevice(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
-        const VkDeviceCreateInfo* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkDevice* pDevice);
-    void vkDestroyDevice(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        const VkAllocationCallbacks* pAllocator);
-    void vkEnumerateInstanceExtensionProperties(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        const char* pLayerName,
-        uint32_t* pPropertyCount,
-        VkExtensionProperties* pProperties);
-    void vkEnumerateDeviceExtensionProperties(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
-        const char* pLayerName,
-        uint32_t* pPropertyCount,
-        VkExtensionProperties* pProperties);
-    void vkEnumerateInstanceLayerProperties(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        uint32_t* pPropertyCount,
-        VkLayerProperties* pProperties);
-    void vkEnumerateDeviceLayerProperties(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
-        uint32_t* pPropertyCount,
-        VkLayerProperties* pProperties);
-    void vkGetDeviceQueue(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        uint32_t queueFamilyIndex,
-        uint32_t queueIndex,
-        VkQueue* pQueue);
-    void vkQueueSubmit(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkQueue queue,
-        uint32_t submitCount,
-        const VkSubmitInfo* pSubmits,
-        VkFence fence);
-    void vkQueueWaitIdle(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkQueue queue);
-    void vkDeviceWaitIdle(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device);
-    void vkAllocateMemory(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkMemoryAllocateInfo* pAllocateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkDeviceMemory* pMemory);
-    void vkFreeMemory(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkDeviceMemory memory,
-        const VkAllocationCallbacks* pAllocator);
-    void vkMapMemory(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkDeviceMemory memory,
-        VkDeviceSize offset,
-        VkDeviceSize size,
-        VkMemoryMapFlags flags,
-        void** ppData);
-    void vkUnmapMemory(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkDeviceMemory memory);
-    void vkFlushMappedMemoryRanges(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        uint32_t memoryRangeCount,
-        const VkMappedMemoryRange* pMemoryRanges);
-    void vkInvalidateMappedMemoryRanges(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        uint32_t memoryRangeCount,
-        const VkMappedMemoryRange* pMemoryRanges);
-    void vkGetDeviceMemoryCommitment(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkDeviceMemory memory,
-        VkDeviceSize* pCommittedMemoryInBytes);
-    void vkBindBufferMemory(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkBuffer buffer,
-        VkDeviceMemory memory,
-        VkDeviceSize memoryOffset);
-    void vkBindImageMemory(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkImage image,
-        VkDeviceMemory memory,
-        VkDeviceSize memoryOffset);
-    void vkGetBufferMemoryRequirements(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkBuffer buffer,
-        VkMemoryRequirements* pMemoryRequirements);
-    void vkGetImageMemoryRequirements(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkImage image,
-        VkMemoryRequirements* pMemoryRequirements);
+    void vkGetPhysicalDeviceProperties(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool,
+                                       VkPhysicalDevice physicalDevice,
+                                       VkPhysicalDeviceProperties* pProperties);
+    void vkGetPhysicalDeviceQueueFamilyProperties(const uint8_t* snapshotTraceBegin,
+                                                  size_t snapshotTraceBytes,
+                                                  android::base::BumpPool* pool,
+                                                  VkPhysicalDevice physicalDevice,
+                                                  uint32_t* pQueueFamilyPropertyCount,
+                                                  VkQueueFamilyProperties* pQueueFamilyProperties);
+    void vkGetPhysicalDeviceMemoryProperties(const uint8_t* snapshotTraceBegin,
+                                             size_t snapshotTraceBytes,
+                                             android::base::BumpPool* pool,
+                                             VkPhysicalDevice physicalDevice,
+                                             VkPhysicalDeviceMemoryProperties* pMemoryProperties);
+    void vkGetInstanceProcAddr(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, PFN_vkVoidFunction input_result,
+                               VkInstance instance, const char* pName);
+    void vkGetDeviceProcAddr(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, PFN_vkVoidFunction input_result,
+                             VkDevice device, const char* pName);
+    void vkCreateDevice(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                        android::base::BumpPool* pool, VkResult input_result,
+                        VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo* pCreateInfo,
+                        const VkAllocationCallbacks* pAllocator, VkDevice* pDevice);
+    void vkDestroyDevice(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                         android::base::BumpPool* pool, VkDevice device,
+                         const VkAllocationCallbacks* pAllocator);
+    void vkEnumerateInstanceExtensionProperties(const uint8_t* snapshotTraceBegin,
+                                                size_t snapshotTraceBytes,
+                                                android::base::BumpPool* pool,
+                                                VkResult input_result, const char* pLayerName,
+                                                uint32_t* pPropertyCount,
+                                                VkExtensionProperties* pProperties);
+    void vkEnumerateDeviceExtensionProperties(const uint8_t* snapshotTraceBegin,
+                                              size_t snapshotTraceBytes,
+                                              android::base::BumpPool* pool, VkResult input_result,
+                                              VkPhysicalDevice physicalDevice,
+                                              const char* pLayerName, uint32_t* pPropertyCount,
+                                              VkExtensionProperties* pProperties);
+    void vkEnumerateInstanceLayerProperties(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool, VkResult input_result,
+                                            uint32_t* pPropertyCount,
+                                            VkLayerProperties* pProperties);
+    void vkEnumerateDeviceLayerProperties(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkResult input_result, VkPhysicalDevice physicalDevice,
+                                          uint32_t* pPropertyCount, VkLayerProperties* pProperties);
+    void vkGetDeviceQueue(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                          android::base::BumpPool* pool, VkDevice device, uint32_t queueFamilyIndex,
+                          uint32_t queueIndex, VkQueue* pQueue);
+    void vkQueueSubmit(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                       android::base::BumpPool* pool, VkResult input_result, VkQueue queue,
+                       uint32_t submitCount, const VkSubmitInfo* pSubmits, VkFence fence);
+    void vkQueueWaitIdle(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                         android::base::BumpPool* pool, VkResult input_result, VkQueue queue);
+    void vkDeviceWaitIdle(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                          android::base::BumpPool* pool, VkResult input_result, VkDevice device);
+    void vkAllocateMemory(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                          android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                          const VkMemoryAllocateInfo* pAllocateInfo,
+                          const VkAllocationCallbacks* pAllocator, VkDeviceMemory* pMemory);
+    void vkFreeMemory(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                      android::base::BumpPool* pool, VkDevice device, VkDeviceMemory memory,
+                      const VkAllocationCallbacks* pAllocator);
+    void vkMapMemory(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                     android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                     VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size,
+                     VkMemoryMapFlags flags, void** ppData);
+    void vkUnmapMemory(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                       android::base::BumpPool* pool, VkDevice device, VkDeviceMemory memory);
+    void vkFlushMappedMemoryRanges(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                   android::base::BumpPool* pool, VkResult input_result,
+                                   VkDevice device, uint32_t memoryRangeCount,
+                                   const VkMappedMemoryRange* pMemoryRanges);
+    void vkInvalidateMappedMemoryRanges(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkResult input_result, VkDevice device,
+                                        uint32_t memoryRangeCount,
+                                        const VkMappedMemoryRange* pMemoryRanges);
+    void vkGetDeviceMemoryCommitment(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkDevice device,
+                                     VkDeviceMemory memory, VkDeviceSize* pCommittedMemoryInBytes);
+    void vkBindBufferMemory(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                            VkBuffer buffer, VkDeviceMemory memory, VkDeviceSize memoryOffset);
+    void vkBindImageMemory(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                           VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset);
+    void vkGetBufferMemoryRequirements(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool, VkDevice device,
+                                       VkBuffer buffer, VkMemoryRequirements* pMemoryRequirements);
+    void vkGetImageMemoryRequirements(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkDevice device, VkImage image,
+                                      VkMemoryRequirements* pMemoryRequirements);
     void vkGetImageSparseMemoryRequirements(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkImage image,
-        uint32_t* pSparseMemoryRequirementCount,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkDevice device, VkImage image, uint32_t* pSparseMemoryRequirementCount,
         VkSparseImageMemoryRequirements* pSparseMemoryRequirements);
     void vkGetPhysicalDeviceSparseImageFormatProperties(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkPhysicalDevice physicalDevice,
-        VkFormat format,
-        VkImageType type,
-        VkSampleCountFlagBits samples,
-        VkImageUsageFlags usage,
-        VkImageTiling tiling,
-        uint32_t* pPropertyCount,
-        VkSparseImageFormatProperties* pProperties);
-    void vkQueueBindSparse(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkQueue queue,
-        uint32_t bindInfoCount,
-        const VkBindSparseInfo* pBindInfo,
-        VkFence fence);
-    void vkCreateFence(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkFenceCreateInfo* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkFence* pFence);
-    void vkDestroyFence(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkFence fence,
-        const VkAllocationCallbacks* pAllocator);
-    void vkResetFences(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        uint32_t fenceCount,
-        const VkFence* pFences);
-    void vkGetFenceStatus(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkFence fence);
-    void vkWaitForFences(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        uint32_t fenceCount,
-        const VkFence* pFences,
-        VkBool32 waitAll,
-        uint64_t timeout);
-    void vkCreateSemaphore(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkSemaphoreCreateInfo* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkSemaphore* pSemaphore);
-    void vkDestroySemaphore(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkSemaphore semaphore,
-        const VkAllocationCallbacks* pAllocator);
-    void vkCreateEvent(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkEventCreateInfo* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkEvent* pEvent);
-    void vkDestroyEvent(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkEvent event,
-        const VkAllocationCallbacks* pAllocator);
-    void vkGetEventStatus(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkEvent event);
-    void vkSetEvent(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkEvent event);
-    void vkResetEvent(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkEvent event);
-    void vkCreateQueryPool(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkQueryPoolCreateInfo* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkQueryPool* pQueryPool);
-    void vkDestroyQueryPool(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkQueryPool queryPool,
-        const VkAllocationCallbacks* pAllocator);
-    void vkGetQueryPoolResults(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkQueryPool queryPool,
-        uint32_t firstQuery,
-        uint32_t queryCount,
-        size_t dataSize,
-        void* pData,
-        VkDeviceSize stride,
-        VkQueryResultFlags flags);
-    void vkCreateBuffer(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkBufferCreateInfo* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkBuffer* pBuffer);
-    void vkDestroyBuffer(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkBuffer buffer,
-        const VkAllocationCallbacks* pAllocator);
-    void vkCreateBufferView(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkBufferViewCreateInfo* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkBufferView* pView);
-    void vkDestroyBufferView(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkBufferView bufferView,
-        const VkAllocationCallbacks* pAllocator);
-    void vkCreateImage(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkImageCreateInfo* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkImage* pImage);
-    void vkDestroyImage(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkImage image,
-        const VkAllocationCallbacks* pAllocator);
-    void vkGetImageSubresourceLayout(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkImage image,
-        const VkImageSubresource* pSubresource,
-        VkSubresourceLayout* pLayout);
-    void vkCreateImageView(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkImageViewCreateInfo* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkImageView* pView);
-    void vkDestroyImageView(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkImageView imageView,
-        const VkAllocationCallbacks* pAllocator);
-    void vkCreateShaderModule(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkShaderModuleCreateInfo* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkShaderModule* pShaderModule);
-    void vkDestroyShaderModule(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkShaderModule shaderModule,
-        const VkAllocationCallbacks* pAllocator);
-    void vkCreatePipelineCache(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkPipelineCacheCreateInfo* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkPipelineCache* pPipelineCache);
-    void vkDestroyPipelineCache(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkPipelineCache pipelineCache,
-        const VkAllocationCallbacks* pAllocator);
-    void vkGetPipelineCacheData(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkPipelineCache pipelineCache,
-        size_t* pDataSize,
-        void* pData);
-    void vkMergePipelineCaches(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkPipelineCache dstCache,
-        uint32_t srcCacheCount,
-        const VkPipelineCache* pSrcCaches);
-    void vkCreateGraphicsPipelines(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkPipelineCache pipelineCache,
-        uint32_t createInfoCount,
-        const VkGraphicsPipelineCreateInfo* pCreateInfos,
-        const VkAllocationCallbacks* pAllocator,
-        VkPipeline* pPipelines);
-    void vkCreateComputePipelines(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkPipelineCache pipelineCache,
-        uint32_t createInfoCount,
-        const VkComputePipelineCreateInfo* pCreateInfos,
-        const VkAllocationCallbacks* pAllocator,
-        VkPipeline* pPipelines);
-    void vkDestroyPipeline(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkPipeline pipeline,
-        const VkAllocationCallbacks* pAllocator);
-    void vkCreatePipelineLayout(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkPipelineLayoutCreateInfo* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkPipelineLayout* pPipelineLayout);
-    void vkDestroyPipelineLayout(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkPipelineLayout pipelineLayout,
-        const VkAllocationCallbacks* pAllocator);
-    void vkCreateSampler(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkSamplerCreateInfo* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkSampler* pSampler);
-    void vkDestroySampler(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkSampler sampler,
-        const VkAllocationCallbacks* pAllocator);
-    void vkCreateDescriptorSetLayout(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkDescriptorSetLayout* pSetLayout);
-    void vkDestroyDescriptorSetLayout(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkDescriptorSetLayout descriptorSetLayout,
-        const VkAllocationCallbacks* pAllocator);
-    void vkCreateDescriptorPool(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkDescriptorPoolCreateInfo* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkDescriptorPool* pDescriptorPool);
-    void vkDestroyDescriptorPool(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkDescriptorPool descriptorPool,
-        const VkAllocationCallbacks* pAllocator);
-    void vkResetDescriptorPool(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkDescriptorPool descriptorPool,
-        VkDescriptorPoolResetFlags flags);
-    void vkAllocateDescriptorSets(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkDescriptorSetAllocateInfo* pAllocateInfo,
-        VkDescriptorSet* pDescriptorSets);
-    void vkFreeDescriptorSets(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkDescriptorPool descriptorPool,
-        uint32_t descriptorSetCount,
-        const VkDescriptorSet* pDescriptorSets);
-    void vkUpdateDescriptorSets(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        uint32_t descriptorWriteCount,
-        const VkWriteDescriptorSet* pDescriptorWrites,
-        uint32_t descriptorCopyCount,
-        const VkCopyDescriptorSet* pDescriptorCopies);
-    void vkCreateFramebuffer(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkFramebufferCreateInfo* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkFramebuffer* pFramebuffer);
-    void vkDestroyFramebuffer(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkFramebuffer framebuffer,
-        const VkAllocationCallbacks* pAllocator);
-    void vkCreateRenderPass(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkRenderPassCreateInfo* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkRenderPass* pRenderPass);
-    void vkDestroyRenderPass(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkRenderPass renderPass,
-        const VkAllocationCallbacks* pAllocator);
-    void vkGetRenderAreaGranularity(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkRenderPass renderPass,
-        VkExtent2D* pGranularity);
-    void vkCreateCommandPool(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkCommandPoolCreateInfo* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkCommandPool* pCommandPool);
-    void vkDestroyCommandPool(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkCommandPool commandPool,
-        const VkAllocationCallbacks* pAllocator);
-    void vkResetCommandPool(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkCommandPool commandPool,
-        VkCommandPoolResetFlags flags);
-    void vkAllocateCommandBuffers(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkCommandBufferAllocateInfo* pAllocateInfo,
-        VkCommandBuffer* pCommandBuffers);
-    void vkFreeCommandBuffers(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkCommandPool commandPool,
-        uint32_t commandBufferCount,
-        const VkCommandBuffer* pCommandBuffers);
-    void vkBeginCommandBuffer(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkCommandBuffer commandBuffer,
-        const VkCommandBufferBeginInfo* pBeginInfo);
-    void vkEndCommandBuffer(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkCommandBuffer commandBuffer);
-    void vkResetCommandBuffer(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkCommandBuffer commandBuffer,
-        VkCommandBufferResetFlags flags);
-    void vkCmdBindPipeline(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkPipelineBindPoint pipelineBindPoint,
-        VkPipeline pipeline);
-    void vkCmdSetViewport(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t firstViewport,
-        uint32_t viewportCount,
-        const VkViewport* pViewports);
-    void vkCmdSetScissor(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t firstScissor,
-        uint32_t scissorCount,
-        const VkRect2D* pScissors);
-    void vkCmdSetLineWidth(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        float lineWidth);
-    void vkCmdSetDepthBias(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        float depthBiasConstantFactor,
-        float depthBiasClamp,
-        float depthBiasSlopeFactor);
-    void vkCmdSetBlendConstants(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        const float blendConstants[4]);
-    void vkCmdSetDepthBounds(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        float minDepthBounds,
-        float maxDepthBounds);
-    void vkCmdSetStencilCompareMask(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkStencilFaceFlags faceMask,
-        uint32_t compareMask);
-    void vkCmdSetStencilWriteMask(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkStencilFaceFlags faceMask,
-        uint32_t writeMask);
-    void vkCmdSetStencilReference(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkStencilFaceFlags faceMask,
-        uint32_t reference);
-    void vkCmdBindDescriptorSets(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkPipelineBindPoint pipelineBindPoint,
-        VkPipelineLayout layout,
-        uint32_t firstSet,
-        uint32_t descriptorSetCount,
-        const VkDescriptorSet* pDescriptorSets,
-        uint32_t dynamicOffsetCount,
-        const uint32_t* pDynamicOffsets);
-    void vkCmdBindIndexBuffer(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkBuffer buffer,
-        VkDeviceSize offset,
-        VkIndexType indexType);
-    void vkCmdBindVertexBuffers(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t firstBinding,
-        uint32_t bindingCount,
-        const VkBuffer* pBuffers,
-        const VkDeviceSize* pOffsets);
-    void vkCmdDraw(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t vertexCount,
-        uint32_t instanceCount,
-        uint32_t firstVertex,
-        uint32_t firstInstance);
-    void vkCmdDrawIndexed(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t indexCount,
-        uint32_t instanceCount,
-        uint32_t firstIndex,
-        int32_t vertexOffset,
-        uint32_t firstInstance);
-    void vkCmdDrawIndirect(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkBuffer buffer,
-        VkDeviceSize offset,
-        uint32_t drawCount,
-        uint32_t stride);
-    void vkCmdDrawIndexedIndirect(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkBuffer buffer,
-        VkDeviceSize offset,
-        uint32_t drawCount,
-        uint32_t stride);
-    void vkCmdDispatch(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t groupCountX,
-        uint32_t groupCountY,
-        uint32_t groupCountZ);
-    void vkCmdDispatchIndirect(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkBuffer buffer,
-        VkDeviceSize offset);
-    void vkCmdCopyBuffer(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkBuffer srcBuffer,
-        VkBuffer dstBuffer,
-        uint32_t regionCount,
-        const VkBufferCopy* pRegions);
-    void vkCmdCopyImage(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkImage srcImage,
-        VkImageLayout srcImageLayout,
-        VkImage dstImage,
-        VkImageLayout dstImageLayout,
-        uint32_t regionCount,
-        const VkImageCopy* pRegions);
-    void vkCmdBlitImage(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkImage srcImage,
-        VkImageLayout srcImageLayout,
-        VkImage dstImage,
-        VkImageLayout dstImageLayout,
-        uint32_t regionCount,
-        const VkImageBlit* pRegions,
-        VkFilter filter);
-    void vkCmdCopyBufferToImage(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkBuffer srcBuffer,
-        VkImage dstImage,
-        VkImageLayout dstImageLayout,
-        uint32_t regionCount,
-        const VkBufferImageCopy* pRegions);
-    void vkCmdCopyImageToBuffer(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkImage srcImage,
-        VkImageLayout srcImageLayout,
-        VkBuffer dstBuffer,
-        uint32_t regionCount,
-        const VkBufferImageCopy* pRegions);
-    void vkCmdUpdateBuffer(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkBuffer dstBuffer,
-        VkDeviceSize dstOffset,
-        VkDeviceSize dataSize,
-        const void* pData);
-    void vkCmdFillBuffer(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkBuffer dstBuffer,
-        VkDeviceSize dstOffset,
-        VkDeviceSize size,
-        uint32_t data);
-    void vkCmdClearColorImage(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkImage image,
-        VkImageLayout imageLayout,
-        const VkClearColorValue* pColor,
-        uint32_t rangeCount,
-        const VkImageSubresourceRange* pRanges);
-    void vkCmdClearDepthStencilImage(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkImage image,
-        VkImageLayout imageLayout,
-        const VkClearDepthStencilValue* pDepthStencil,
-        uint32_t rangeCount,
-        const VkImageSubresourceRange* pRanges);
-    void vkCmdClearAttachments(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t attachmentCount,
-        const VkClearAttachment* pAttachments,
-        uint32_t rectCount,
-        const VkClearRect* pRects);
-    void vkCmdResolveImage(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkImage srcImage,
-        VkImageLayout srcImageLayout,
-        VkImage dstImage,
-        VkImageLayout dstImageLayout,
-        uint32_t regionCount,
-        const VkImageResolve* pRegions);
-    void vkCmdSetEvent(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkEvent event,
-        VkPipelineStageFlags stageMask);
-    void vkCmdResetEvent(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkEvent event,
-        VkPipelineStageFlags stageMask);
-    void vkCmdWaitEvents(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t eventCount,
-        const VkEvent* pEvents,
-        VkPipelineStageFlags srcStageMask,
-        VkPipelineStageFlags dstStageMask,
-        uint32_t memoryBarrierCount,
-        const VkMemoryBarrier* pMemoryBarriers,
-        uint32_t bufferMemoryBarrierCount,
-        const VkBufferMemoryBarrier* pBufferMemoryBarriers,
-        uint32_t imageMemoryBarrierCount,
-        const VkImageMemoryBarrier* pImageMemoryBarriers);
-    void vkCmdPipelineBarrier(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkPipelineStageFlags srcStageMask,
-        VkPipelineStageFlags dstStageMask,
-        VkDependencyFlags dependencyFlags,
-        uint32_t memoryBarrierCount,
-        const VkMemoryBarrier* pMemoryBarriers,
-        uint32_t bufferMemoryBarrierCount,
-        const VkBufferMemoryBarrier* pBufferMemoryBarriers,
-        uint32_t imageMemoryBarrierCount,
-        const VkImageMemoryBarrier* pImageMemoryBarriers);
-    void vkCmdBeginQuery(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkQueryPool queryPool,
-        uint32_t query,
-        VkQueryControlFlags flags);
-    void vkCmdEndQuery(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkQueryPool queryPool,
-        uint32_t query);
-    void vkCmdResetQueryPool(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkQueryPool queryPool,
-        uint32_t firstQuery,
-        uint32_t queryCount);
-    void vkCmdWriteTimestamp(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkPipelineStageFlagBits pipelineStage,
-        VkQueryPool queryPool,
-        uint32_t query);
-    void vkCmdCopyQueryPoolResults(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkQueryPool queryPool,
-        uint32_t firstQuery,
-        uint32_t queryCount,
-        VkBuffer dstBuffer,
-        VkDeviceSize dstOffset,
-        VkDeviceSize stride,
-        VkQueryResultFlags flags);
-    void vkCmdPushConstants(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkPipelineLayout layout,
-        VkShaderStageFlags stageFlags,
-        uint32_t offset,
-        uint32_t size,
-        const void* pValues);
-    void vkCmdBeginRenderPass(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        const VkRenderPassBeginInfo* pRenderPassBegin,
-        VkSubpassContents contents);
-    void vkCmdNextSubpass(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkSubpassContents contents);
-    void vkCmdEndRenderPass(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer);
-    void vkCmdExecuteCommands(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t commandBufferCount,
-        const VkCommandBuffer* pCommandBuffers);
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
+        VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
+        uint32_t* pPropertyCount, VkSparseImageFormatProperties* pProperties);
+    void vkQueueBindSparse(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkResult input_result, VkQueue queue,
+                           uint32_t bindInfoCount, const VkBindSparseInfo* pBindInfo,
+                           VkFence fence);
+    void vkCreateFence(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                       android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                       const VkFenceCreateInfo* pCreateInfo,
+                       const VkAllocationCallbacks* pAllocator, VkFence* pFence);
+    void vkDestroyFence(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                        android::base::BumpPool* pool, VkDevice device, VkFence fence,
+                        const VkAllocationCallbacks* pAllocator);
+    void vkResetFences(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                       android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                       uint32_t fenceCount, const VkFence* pFences);
+    void vkGetFenceStatus(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                          android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                          VkFence fence);
+    void vkWaitForFences(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                         android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                         uint32_t fenceCount, const VkFence* pFences, VkBool32 waitAll,
+                         uint64_t timeout);
+    void vkCreateSemaphore(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                           const VkSemaphoreCreateInfo* pCreateInfo,
+                           const VkAllocationCallbacks* pAllocator, VkSemaphore* pSemaphore);
+    void vkDestroySemaphore(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkDevice device, VkSemaphore semaphore,
+                            const VkAllocationCallbacks* pAllocator);
+    void vkCreateEvent(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                       android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                       const VkEventCreateInfo* pCreateInfo,
+                       const VkAllocationCallbacks* pAllocator, VkEvent* pEvent);
+    void vkDestroyEvent(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                        android::base::BumpPool* pool, VkDevice device, VkEvent event,
+                        const VkAllocationCallbacks* pAllocator);
+    void vkGetEventStatus(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                          android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                          VkEvent event);
+    void vkSetEvent(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                    android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                    VkEvent event);
+    void vkResetEvent(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                      android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                      VkEvent event);
+    void vkCreateQueryPool(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                           const VkQueryPoolCreateInfo* pCreateInfo,
+                           const VkAllocationCallbacks* pAllocator, VkQueryPool* pQueryPool);
+    void vkDestroyQueryPool(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkDevice device, VkQueryPool queryPool,
+                            const VkAllocationCallbacks* pAllocator);
+    void vkGetQueryPoolResults(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, VkResult input_result,
+                               VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
+                               uint32_t queryCount, size_t dataSize, void* pData,
+                               VkDeviceSize stride, VkQueryResultFlags flags);
+    void vkCreateBuffer(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                        android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                        const VkBufferCreateInfo* pCreateInfo,
+                        const VkAllocationCallbacks* pAllocator, VkBuffer* pBuffer);
+    void vkDestroyBuffer(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                         android::base::BumpPool* pool, VkDevice device, VkBuffer buffer,
+                         const VkAllocationCallbacks* pAllocator);
+    void vkCreateBufferView(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                            const VkBufferViewCreateInfo* pCreateInfo,
+                            const VkAllocationCallbacks* pAllocator, VkBufferView* pView);
+    void vkDestroyBufferView(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkDevice device,
+                             VkBufferView bufferView, const VkAllocationCallbacks* pAllocator);
+    void vkCreateImage(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                       android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                       const VkImageCreateInfo* pCreateInfo,
+                       const VkAllocationCallbacks* pAllocator, VkImage* pImage);
+    void vkDestroyImage(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                        android::base::BumpPool* pool, VkDevice device, VkImage image,
+                        const VkAllocationCallbacks* pAllocator);
+    void vkGetImageSubresourceLayout(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkDevice device, VkImage image,
+                                     const VkImageSubresource* pSubresource,
+                                     VkSubresourceLayout* pLayout);
+    void vkCreateImageView(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                           const VkImageViewCreateInfo* pCreateInfo,
+                           const VkAllocationCallbacks* pAllocator, VkImageView* pView);
+    void vkDestroyImageView(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkDevice device, VkImageView imageView,
+                            const VkAllocationCallbacks* pAllocator);
+    void vkCreateShaderModule(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                              const VkShaderModuleCreateInfo* pCreateInfo,
+                              const VkAllocationCallbacks* pAllocator,
+                              VkShaderModule* pShaderModule);
+    void vkDestroyShaderModule(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, VkDevice device,
+                               VkShaderModule shaderModule,
+                               const VkAllocationCallbacks* pAllocator);
+    void vkCreatePipelineCache(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, VkResult input_result,
+                               VkDevice device, const VkPipelineCacheCreateInfo* pCreateInfo,
+                               const VkAllocationCallbacks* pAllocator,
+                               VkPipelineCache* pPipelineCache);
+    void vkDestroyPipelineCache(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkDevice device,
+                                VkPipelineCache pipelineCache,
+                                const VkAllocationCallbacks* pAllocator);
+    void vkGetPipelineCacheData(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkResult input_result,
+                                VkDevice device, VkPipelineCache pipelineCache, size_t* pDataSize,
+                                void* pData);
+    void vkMergePipelineCaches(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, VkResult input_result,
+                               VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount,
+                               const VkPipelineCache* pSrcCaches);
+    void vkCreateGraphicsPipelines(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                   android::base::BumpPool* pool, VkResult input_result,
+                                   VkDevice device, VkPipelineCache pipelineCache,
+                                   uint32_t createInfoCount,
+                                   const VkGraphicsPipelineCreateInfo* pCreateInfos,
+                                   const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines);
+    void vkCreateComputePipelines(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkResult input_result,
+                                  VkDevice device, VkPipelineCache pipelineCache,
+                                  uint32_t createInfoCount,
+                                  const VkComputePipelineCreateInfo* pCreateInfos,
+                                  const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines);
+    void vkDestroyPipeline(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkDevice device, VkPipeline pipeline,
+                           const VkAllocationCallbacks* pAllocator);
+    void vkCreatePipelineLayout(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkResult input_result,
+                                VkDevice device, const VkPipelineLayoutCreateInfo* pCreateInfo,
+                                const VkAllocationCallbacks* pAllocator,
+                                VkPipelineLayout* pPipelineLayout);
+    void vkDestroyPipelineLayout(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                 android::base::BumpPool* pool, VkDevice device,
+                                 VkPipelineLayout pipelineLayout,
+                                 const VkAllocationCallbacks* pAllocator);
+    void vkCreateSampler(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                         android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                         const VkSamplerCreateInfo* pCreateInfo,
+                         const VkAllocationCallbacks* pAllocator, VkSampler* pSampler);
+    void vkDestroySampler(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                          android::base::BumpPool* pool, VkDevice device, VkSampler sampler,
+                          const VkAllocationCallbacks* pAllocator);
+    void vkCreateDescriptorSetLayout(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkResult input_result,
+                                     VkDevice device,
+                                     const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
+                                     const VkAllocationCallbacks* pAllocator,
+                                     VkDescriptorSetLayout* pSetLayout);
+    void vkDestroyDescriptorSetLayout(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkDevice device,
+                                      VkDescriptorSetLayout descriptorSetLayout,
+                                      const VkAllocationCallbacks* pAllocator);
+    void vkCreateDescriptorPool(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkResult input_result,
+                                VkDevice device, const VkDescriptorPoolCreateInfo* pCreateInfo,
+                                const VkAllocationCallbacks* pAllocator,
+                                VkDescriptorPool* pDescriptorPool);
+    void vkDestroyDescriptorPool(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                 android::base::BumpPool* pool, VkDevice device,
+                                 VkDescriptorPool descriptorPool,
+                                 const VkAllocationCallbacks* pAllocator);
+    void vkResetDescriptorPool(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, VkResult input_result,
+                               VkDevice device, VkDescriptorPool descriptorPool,
+                               VkDescriptorPoolResetFlags flags);
+    void vkAllocateDescriptorSets(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkResult input_result,
+                                  VkDevice device, const VkDescriptorSetAllocateInfo* pAllocateInfo,
+                                  VkDescriptorSet* pDescriptorSets);
+    void vkFreeDescriptorSets(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                              VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
+                              const VkDescriptorSet* pDescriptorSets);
+    void vkUpdateDescriptorSets(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkDevice device,
+                                uint32_t descriptorWriteCount,
+                                const VkWriteDescriptorSet* pDescriptorWrites,
+                                uint32_t descriptorCopyCount,
+                                const VkCopyDescriptorSet* pDescriptorCopies);
+    void vkCreateFramebuffer(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                             const VkFramebufferCreateInfo* pCreateInfo,
+                             const VkAllocationCallbacks* pAllocator, VkFramebuffer* pFramebuffer);
+    void vkDestroyFramebuffer(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkDevice device,
+                              VkFramebuffer framebuffer, const VkAllocationCallbacks* pAllocator);
+    void vkCreateRenderPass(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                            const VkRenderPassCreateInfo* pCreateInfo,
+                            const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass);
+    void vkDestroyRenderPass(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkDevice device,
+                             VkRenderPass renderPass, const VkAllocationCallbacks* pAllocator);
+    void vkGetRenderAreaGranularity(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkDevice device,
+                                    VkRenderPass renderPass, VkExtent2D* pGranularity);
+    void vkCreateCommandPool(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                             const VkCommandPoolCreateInfo* pCreateInfo,
+                             const VkAllocationCallbacks* pAllocator, VkCommandPool* pCommandPool);
+    void vkDestroyCommandPool(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkDevice device,
+                              VkCommandPool commandPool, const VkAllocationCallbacks* pAllocator);
+    void vkResetCommandPool(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                            VkCommandPool commandPool, VkCommandPoolResetFlags flags);
+    void vkAllocateCommandBuffers(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkResult input_result,
+                                  VkDevice device, const VkCommandBufferAllocateInfo* pAllocateInfo,
+                                  VkCommandBuffer* pCommandBuffers);
+    void vkFreeCommandBuffers(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkDevice device,
+                              VkCommandPool commandPool, uint32_t commandBufferCount,
+                              const VkCommandBuffer* pCommandBuffers);
+    void vkBeginCommandBuffer(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkResult input_result,
+                              VkCommandBuffer commandBuffer,
+                              const VkCommandBufferBeginInfo* pBeginInfo);
+    void vkEndCommandBuffer(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkResult input_result,
+                            VkCommandBuffer commandBuffer);
+    void vkResetCommandBuffer(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkResult input_result,
+                              VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags);
+    void vkCmdBindPipeline(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                           VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline);
+    void vkCmdSetViewport(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                          android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                          uint32_t firstViewport, uint32_t viewportCount,
+                          const VkViewport* pViewports);
+    void vkCmdSetScissor(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                         android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                         uint32_t firstScissor, uint32_t scissorCount, const VkRect2D* pScissors);
+    void vkCmdSetLineWidth(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                           float lineWidth);
+    void vkCmdSetDepthBias(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                           float depthBiasConstantFactor, float depthBiasClamp,
+                           float depthBiasSlopeFactor);
+    void vkCmdSetBlendConstants(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                const float blendConstants[4]);
+    void vkCmdSetDepthBounds(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                             float minDepthBounds, float maxDepthBounds);
+    void vkCmdSetStencilCompareMask(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                    VkStencilFaceFlags faceMask, uint32_t compareMask);
+    void vkCmdSetStencilWriteMask(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                  VkStencilFaceFlags faceMask, uint32_t writeMask);
+    void vkCmdSetStencilReference(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                  VkStencilFaceFlags faceMask, uint32_t reference);
+    void vkCmdBindDescriptorSets(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                 android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                 VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
+                                 uint32_t firstSet, uint32_t descriptorSetCount,
+                                 const VkDescriptorSet* pDescriptorSets,
+                                 uint32_t dynamicOffsetCount, const uint32_t* pDynamicOffsets);
+    void vkCmdBindIndexBuffer(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                              VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType);
+    void vkCmdBindVertexBuffers(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                uint32_t firstBinding, uint32_t bindingCount,
+                                const VkBuffer* pBuffers, const VkDeviceSize* pOffsets);
+    void vkCmdDraw(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                   android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                   uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
+                   uint32_t firstInstance);
+    void vkCmdDrawIndexed(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                          android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                          uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex,
+                          int32_t vertexOffset, uint32_t firstInstance);
+    void vkCmdDrawIndirect(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                           VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
+                           uint32_t stride);
+    void vkCmdDrawIndexedIndirect(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                  VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
+                                  uint32_t stride);
+    void vkCmdDispatch(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                       android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                       uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ);
+    void vkCmdDispatchIndirect(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                               VkBuffer buffer, VkDeviceSize offset);
+    void vkCmdCopyBuffer(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                         android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                         VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount,
+                         const VkBufferCopy* pRegions);
+    void vkCmdCopyImage(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                        android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                        VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
+                        VkImageLayout dstImageLayout, uint32_t regionCount,
+                        const VkImageCopy* pRegions);
+    void vkCmdBlitImage(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                        android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                        VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
+                        VkImageLayout dstImageLayout, uint32_t regionCount,
+                        const VkImageBlit* pRegions, VkFilter filter);
+    void vkCmdCopyBufferToImage(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                VkBuffer srcBuffer, VkImage dstImage, VkImageLayout dstImageLayout,
+                                uint32_t regionCount, const VkBufferImageCopy* pRegions);
+    void vkCmdCopyImageToBuffer(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer dstBuffer,
+                                uint32_t regionCount, const VkBufferImageCopy* pRegions);
+    void vkCmdUpdateBuffer(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                           VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize dataSize,
+                           const void* pData);
+    void vkCmdFillBuffer(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                         android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                         VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size,
+                         uint32_t data);
+    void vkCmdClearColorImage(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                              VkImage image, VkImageLayout imageLayout,
+                              const VkClearColorValue* pColor, uint32_t rangeCount,
+                              const VkImageSubresourceRange* pRanges);
+    void vkCmdClearDepthStencilImage(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                     VkImage image, VkImageLayout imageLayout,
+                                     const VkClearDepthStencilValue* pDepthStencil,
+                                     uint32_t rangeCount, const VkImageSubresourceRange* pRanges);
+    void vkCmdClearAttachments(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                               uint32_t attachmentCount, const VkClearAttachment* pAttachments,
+                               uint32_t rectCount, const VkClearRect* pRects);
+    void vkCmdResolveImage(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                           VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
+                           VkImageLayout dstImageLayout, uint32_t regionCount,
+                           const VkImageResolve* pRegions);
+    void vkCmdSetEvent(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                       android::base::BumpPool* pool, VkCommandBuffer commandBuffer, VkEvent event,
+                       VkPipelineStageFlags stageMask);
+    void vkCmdResetEvent(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                         android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                         VkEvent event, VkPipelineStageFlags stageMask);
+    void vkCmdWaitEvents(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                         android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                         uint32_t eventCount, const VkEvent* pEvents,
+                         VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
+                         uint32_t memoryBarrierCount, const VkMemoryBarrier* pMemoryBarriers,
+                         uint32_t bufferMemoryBarrierCount,
+                         const VkBufferMemoryBarrier* pBufferMemoryBarriers,
+                         uint32_t imageMemoryBarrierCount,
+                         const VkImageMemoryBarrier* pImageMemoryBarriers);
+    void vkCmdPipelineBarrier(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                              VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
+                              VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount,
+                              const VkMemoryBarrier* pMemoryBarriers,
+                              uint32_t bufferMemoryBarrierCount,
+                              const VkBufferMemoryBarrier* pBufferMemoryBarriers,
+                              uint32_t imageMemoryBarrierCount,
+                              const VkImageMemoryBarrier* pImageMemoryBarriers);
+    void vkCmdBeginQuery(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                         android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                         VkQueryPool queryPool, uint32_t query, VkQueryControlFlags flags);
+    void vkCmdEndQuery(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                       android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                       VkQueryPool queryPool, uint32_t query);
+    void vkCmdResetQueryPool(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                             VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount);
+    void vkCmdWriteTimestamp(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                             VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
+                             uint32_t query);
+    void vkCmdCopyQueryPoolResults(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                   android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                   VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
+                                   VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride,
+                                   VkQueryResultFlags flags);
+    void vkCmdPushConstants(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                            VkPipelineLayout layout, VkShaderStageFlags stageFlags, uint32_t offset,
+                            uint32_t size, const void* pValues);
+    void vkCmdBeginRenderPass(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                              const VkRenderPassBeginInfo* pRenderPassBegin,
+                              VkSubpassContents contents);
+    void vkCmdNextSubpass(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                          android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                          VkSubpassContents contents);
+    void vkCmdEndRenderPass(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkCommandBuffer commandBuffer);
+    void vkCmdExecuteCommands(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                              uint32_t commandBufferCount, const VkCommandBuffer* pCommandBuffers);
 #endif
 #ifdef VK_VERSION_1_1
-    void vkEnumerateInstanceVersion(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        uint32_t* pApiVersion);
-    void vkBindBufferMemory2(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        uint32_t bindInfoCount,
-        const VkBindBufferMemoryInfo* pBindInfos);
-    void vkBindImageMemory2(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        uint32_t bindInfoCount,
-        const VkBindImageMemoryInfo* pBindInfos);
-    void vkGetDeviceGroupPeerMemoryFeatures(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        uint32_t heapIndex,
-        uint32_t localDeviceIndex,
-        uint32_t remoteDeviceIndex,
-        VkPeerMemoryFeatureFlags* pPeerMemoryFeatures);
-    void vkCmdSetDeviceMask(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t deviceMask);
-    void vkCmdDispatchBase(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t baseGroupX,
-        uint32_t baseGroupY,
-        uint32_t baseGroupZ,
-        uint32_t groupCountX,
-        uint32_t groupCountY,
-        uint32_t groupCountZ);
+    void vkEnumerateInstanceVersion(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkResult input_result,
+                                    uint32_t* pApiVersion);
+    void vkBindBufferMemory2(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                             uint32_t bindInfoCount, const VkBindBufferMemoryInfo* pBindInfos);
+    void vkBindImageMemory2(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                            uint32_t bindInfoCount, const VkBindImageMemoryInfo* pBindInfos);
+    void vkGetDeviceGroupPeerMemoryFeatures(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool, VkDevice device,
+                                            uint32_t heapIndex, uint32_t localDeviceIndex,
+                                            uint32_t remoteDeviceIndex,
+                                            VkPeerMemoryFeatureFlags* pPeerMemoryFeatures);
+    void vkCmdSetDeviceMask(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                            uint32_t deviceMask);
+    void vkCmdDispatchBase(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                           uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ,
+                           uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ);
     void vkEnumeratePhysicalDeviceGroups(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkInstance instance,
-        uint32_t* pPhysicalDeviceGroupCount,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkInstance instance, uint32_t* pPhysicalDeviceGroupCount,
         VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProperties);
-    void vkGetImageMemoryRequirements2(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        const VkImageMemoryRequirementsInfo2* pInfo,
-        VkMemoryRequirements2* pMemoryRequirements);
-    void vkGetBufferMemoryRequirements2(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        const VkBufferMemoryRequirementsInfo2* pInfo,
-        VkMemoryRequirements2* pMemoryRequirements);
+    void vkGetImageMemoryRequirements2(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool, VkDevice device,
+                                       const VkImageMemoryRequirementsInfo2* pInfo,
+                                       VkMemoryRequirements2* pMemoryRequirements);
+    void vkGetBufferMemoryRequirements2(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkDevice device,
+                                        const VkBufferMemoryRequirementsInfo2* pInfo,
+                                        VkMemoryRequirements2* pMemoryRequirements);
     void vkGetImageSparseMemoryRequirements2(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        const VkImageSparseMemoryRequirementsInfo2* pInfo,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkDevice device, const VkImageSparseMemoryRequirementsInfo2* pInfo,
         uint32_t* pSparseMemoryRequirementCount,
         VkSparseImageMemoryRequirements2* pSparseMemoryRequirements);
-    void vkGetPhysicalDeviceFeatures2(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkPhysicalDevice physicalDevice,
-        VkPhysicalDeviceFeatures2* pFeatures);
-    void vkGetPhysicalDeviceProperties2(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkPhysicalDevice physicalDevice,
-        VkPhysicalDeviceProperties2* pProperties);
-    void vkGetPhysicalDeviceFormatProperties2(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkPhysicalDevice physicalDevice,
-        VkFormat format,
-        VkFormatProperties2* pFormatProperties);
+    void vkGetPhysicalDeviceFeatures2(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool,
+                                      VkPhysicalDevice physicalDevice,
+                                      VkPhysicalDeviceFeatures2* pFeatures);
+    void vkGetPhysicalDeviceProperties2(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkPhysicalDevice physicalDevice,
+                                        VkPhysicalDeviceProperties2* pProperties);
+    void vkGetPhysicalDeviceFormatProperties2(const uint8_t* snapshotTraceBegin,
+                                              size_t snapshotTraceBytes,
+                                              android::base::BumpPool* pool,
+                                              VkPhysicalDevice physicalDevice, VkFormat format,
+                                              VkFormatProperties2* pFormatProperties);
     void vkGetPhysicalDeviceImageFormatProperties2(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice,
         const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo,
         VkImageFormatProperties2* pImageFormatProperties);
     void vkGetPhysicalDeviceQueueFamilyProperties2(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkPhysicalDevice physicalDevice,
-        uint32_t* pQueueFamilyPropertyCount,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkPhysicalDevice physicalDevice, uint32_t* pQueueFamilyPropertyCount,
         VkQueueFamilyProperties2* pQueueFamilyProperties);
-    void vkGetPhysicalDeviceMemoryProperties2(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkPhysicalDevice physicalDevice,
-        VkPhysicalDeviceMemoryProperties2* pMemoryProperties);
+    void vkGetPhysicalDeviceMemoryProperties2(const uint8_t* snapshotTraceBegin,
+                                              size_t snapshotTraceBytes,
+                                              android::base::BumpPool* pool,
+                                              VkPhysicalDevice physicalDevice,
+                                              VkPhysicalDeviceMemoryProperties2* pMemoryProperties);
     void vkGetPhysicalDeviceSparseImageFormatProperties2(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkPhysicalDevice physicalDevice,
-        const VkPhysicalDeviceSparseImageFormatInfo2* pFormatInfo,
-        uint32_t* pPropertyCount,
-        VkSparseImageFormatProperties2* pProperties);
-    void vkTrimCommandPool(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkCommandPool commandPool,
-        VkCommandPoolTrimFlags flags);
-    void vkGetDeviceQueue2(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        const VkDeviceQueueInfo2* pQueueInfo,
-        VkQueue* pQueue);
-    void vkCreateSamplerYcbcrConversion(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkSamplerYcbcrConversionCreateInfo* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkSamplerYcbcrConversion* pYcbcrConversion);
-    void vkDestroySamplerYcbcrConversion(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkSamplerYcbcrConversion ycbcrConversion,
-        const VkAllocationCallbacks* pAllocator);
-    void vkCreateDescriptorUpdateTemplate(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkDescriptorUpdateTemplate* pDescriptorUpdateTemplate);
-    void vkDestroyDescriptorUpdateTemplate(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkDescriptorUpdateTemplate descriptorUpdateTemplate,
-        const VkAllocationCallbacks* pAllocator);
-    void vkUpdateDescriptorSetWithTemplate(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkDescriptorSet descriptorSet,
-        VkDescriptorUpdateTemplate descriptorUpdateTemplate,
-        const void* pData);
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSparseImageFormatInfo2* pFormatInfo,
+        uint32_t* pPropertyCount, VkSparseImageFormatProperties2* pProperties);
+    void vkTrimCommandPool(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkDevice device,
+                           VkCommandPool commandPool, VkCommandPoolTrimFlags flags);
+    void vkGetDeviceQueue2(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkDevice device,
+                           const VkDeviceQueueInfo2* pQueueInfo, VkQueue* pQueue);
+    void vkCreateSamplerYcbcrConversion(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkResult input_result, VkDevice device,
+                                        const VkSamplerYcbcrConversionCreateInfo* pCreateInfo,
+                                        const VkAllocationCallbacks* pAllocator,
+                                        VkSamplerYcbcrConversion* pYcbcrConversion);
+    void vkDestroySamplerYcbcrConversion(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkDevice device, VkSamplerYcbcrConversion ycbcrConversion,
+                                         const VkAllocationCallbacks* pAllocator);
+    void vkCreateDescriptorUpdateTemplate(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkResult input_result, VkDevice device,
+                                          const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo,
+                                          const VkAllocationCallbacks* pAllocator,
+                                          VkDescriptorUpdateTemplate* pDescriptorUpdateTemplate);
+    void vkDestroyDescriptorUpdateTemplate(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkDevice device,
+                                           VkDescriptorUpdateTemplate descriptorUpdateTemplate,
+                                           const VkAllocationCallbacks* pAllocator);
+    void vkUpdateDescriptorSetWithTemplate(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkDevice device, VkDescriptorSet descriptorSet,
+                                           VkDescriptorUpdateTemplate descriptorUpdateTemplate,
+                                           const void* pData);
     void vkGetPhysicalDeviceExternalBufferProperties(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
         VkPhysicalDevice physicalDevice,
         const VkPhysicalDeviceExternalBufferInfo* pExternalBufferInfo,
         VkExternalBufferProperties* pExternalBufferProperties);
     void vkGetPhysicalDeviceExternalFenceProperties(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
         VkPhysicalDevice physicalDevice,
         const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo,
         VkExternalFenceProperties* pExternalFenceProperties);
     void vkGetPhysicalDeviceExternalSemaphoreProperties(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
         VkPhysicalDevice physicalDevice,
         const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo,
         VkExternalSemaphoreProperties* pExternalSemaphoreProperties);
-    void vkGetDescriptorSetLayoutSupport(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
-        VkDescriptorSetLayoutSupport* pSupport);
+    void vkGetDescriptorSetLayoutSupport(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkDevice device,
+                                         const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
+                                         VkDescriptorSetLayoutSupport* pSupport);
 #endif
 #ifdef VK_VERSION_1_2
-    void vkCmdDrawIndirectCount(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkBuffer buffer,
-        VkDeviceSize offset,
-        VkBuffer countBuffer,
-        VkDeviceSize countBufferOffset,
-        uint32_t maxDrawCount,
-        uint32_t stride);
-    void vkCmdDrawIndexedIndirectCount(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkBuffer buffer,
-        VkDeviceSize offset,
-        VkBuffer countBuffer,
-        VkDeviceSize countBufferOffset,
-        uint32_t maxDrawCount,
-        uint32_t stride);
-    void vkCreateRenderPass2(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkRenderPassCreateInfo2* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkRenderPass* pRenderPass);
-    void vkCmdBeginRenderPass2(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        const VkRenderPassBeginInfo* pRenderPassBegin,
-        const VkSubpassBeginInfo* pSubpassBeginInfo);
-    void vkCmdNextSubpass2(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        const VkSubpassBeginInfo* pSubpassBeginInfo,
-        const VkSubpassEndInfo* pSubpassEndInfo);
-    void vkCmdEndRenderPass2(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        const VkSubpassEndInfo* pSubpassEndInfo);
-    void vkResetQueryPool(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkQueryPool queryPool,
-        uint32_t firstQuery,
-        uint32_t queryCount);
-    void vkGetSemaphoreCounterValue(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkSemaphore semaphore,
-        uint64_t* pValue);
-    void vkWaitSemaphores(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkSemaphoreWaitInfo* pWaitInfo,
-        uint64_t timeout);
-    void vkSignalSemaphore(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkSemaphoreSignalInfo* pSignalInfo);
-    void vkGetBufferDeviceAddress(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDeviceAddress input_result,
-        VkDevice device,
-        const VkBufferDeviceAddressInfo* pInfo);
-    void vkGetBufferOpaqueCaptureAddress(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        uint64_t input_result,
-        VkDevice device,
-        const VkBufferDeviceAddressInfo* pInfo);
-    void vkGetDeviceMemoryOpaqueCaptureAddress(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        uint64_t input_result,
-        VkDevice device,
-        const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo);
+    void vkCmdDrawIndirectCount(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
+                                VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+                                uint32_t stride);
+    void vkCmdDrawIndexedIndirectCount(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                       VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
+                                       VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+                                       uint32_t stride);
+    void vkCreateRenderPass2(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                             const VkRenderPassCreateInfo2* pCreateInfo,
+                             const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass);
+    void vkCmdBeginRenderPass2(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                               const VkRenderPassBeginInfo* pRenderPassBegin,
+                               const VkSubpassBeginInfo* pSubpassBeginInfo);
+    void vkCmdNextSubpass2(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                           const VkSubpassBeginInfo* pSubpassBeginInfo,
+                           const VkSubpassEndInfo* pSubpassEndInfo);
+    void vkCmdEndRenderPass2(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                             const VkSubpassEndInfo* pSubpassEndInfo);
+    void vkResetQueryPool(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                          android::base::BumpPool* pool, VkDevice device, VkQueryPool queryPool,
+                          uint32_t firstQuery, uint32_t queryCount);
+    void vkGetSemaphoreCounterValue(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkResult input_result,
+                                    VkDevice device, VkSemaphore semaphore, uint64_t* pValue);
+    void vkWaitSemaphores(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                          android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                          const VkSemaphoreWaitInfo* pWaitInfo, uint64_t timeout);
+    void vkSignalSemaphore(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                           const VkSemaphoreSignalInfo* pSignalInfo);
+    void vkGetBufferDeviceAddress(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkDeviceAddress input_result,
+                                  VkDevice device, const VkBufferDeviceAddressInfo* pInfo);
+    void vkGetBufferOpaqueCaptureAddress(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         uint64_t input_result, VkDevice device,
+                                         const VkBufferDeviceAddressInfo* pInfo);
+    void vkGetDeviceMemoryOpaqueCaptureAddress(const uint8_t* snapshotTraceBegin,
+                                               size_t snapshotTraceBytes,
+                                               android::base::BumpPool* pool, uint64_t input_result,
+                                               VkDevice device,
+                                               const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo);
 #endif
 #ifdef VK_KHR_surface
-    void vkDestroySurfaceKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkInstance instance,
-        VkSurfaceKHR surface,
-        const VkAllocationCallbacks* pAllocator);
-    void vkGetPhysicalDeviceSurfaceSupportKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
-        uint32_t queueFamilyIndex,
-        VkSurfaceKHR surface,
-        VkBool32* pSupported);
+    void vkDestroySurfaceKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkInstance instance,
+                             VkSurfaceKHR surface, const VkAllocationCallbacks* pAllocator);
+    void vkGetPhysicalDeviceSurfaceSupportKHR(const uint8_t* snapshotTraceBegin,
+                                              size_t snapshotTraceBytes,
+                                              android::base::BumpPool* pool, VkResult input_result,
+                                              VkPhysicalDevice physicalDevice,
+                                              uint32_t queueFamilyIndex, VkSurfaceKHR surface,
+                                              VkBool32* pSupported);
     void vkGetPhysicalDeviceSurfaceCapabilitiesKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
-        VkSurfaceKHR surface,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
         VkSurfaceCapabilitiesKHR* pSurfaceCapabilities);
-    void vkGetPhysicalDeviceSurfaceFormatsKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
-        VkSurfaceKHR surface,
-        uint32_t* pSurfaceFormatCount,
-        VkSurfaceFormatKHR* pSurfaceFormats);
+    void vkGetPhysicalDeviceSurfaceFormatsKHR(const uint8_t* snapshotTraceBegin,
+                                              size_t snapshotTraceBytes,
+                                              android::base::BumpPool* pool, VkResult input_result,
+                                              VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
+                                              uint32_t* pSurfaceFormatCount,
+                                              VkSurfaceFormatKHR* pSurfaceFormats);
     void vkGetPhysicalDeviceSurfacePresentModesKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
-        VkSurfaceKHR surface,
-        uint32_t* pPresentModeCount,
-        VkPresentModeKHR* pPresentModes);
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
+        uint32_t* pPresentModeCount, VkPresentModeKHR* pPresentModes);
 #endif
 #ifdef VK_KHR_swapchain
-    void vkCreateSwapchainKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkSwapchainCreateInfoKHR* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkSwapchainKHR* pSwapchain);
-    void vkDestroySwapchainKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkSwapchainKHR swapchain,
-        const VkAllocationCallbacks* pAllocator);
-    void vkGetSwapchainImagesKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkSwapchainKHR swapchain,
-        uint32_t* pSwapchainImageCount,
-        VkImage* pSwapchainImages);
-    void vkAcquireNextImageKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkSwapchainKHR swapchain,
-        uint64_t timeout,
-        VkSemaphore semaphore,
-        VkFence fence,
-        uint32_t* pImageIndex);
-    void vkQueuePresentKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkQueue queue,
-        const VkPresentInfoKHR* pPresentInfo);
+    void vkCreateSwapchainKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                              const VkSwapchainCreateInfoKHR* pCreateInfo,
+                              const VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchain);
+    void vkDestroySwapchainKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, VkDevice device,
+                               VkSwapchainKHR swapchain, const VkAllocationCallbacks* pAllocator);
+    void vkGetSwapchainImagesKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                 android::base::BumpPool* pool, VkResult input_result,
+                                 VkDevice device, VkSwapchainKHR swapchain,
+                                 uint32_t* pSwapchainImageCount, VkImage* pSwapchainImages);
+    void vkAcquireNextImageKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, VkResult input_result,
+                               VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
+                               VkSemaphore semaphore, VkFence fence, uint32_t* pImageIndex);
+    void vkQueuePresentKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkResult input_result, VkQueue queue,
+                           const VkPresentInfoKHR* pPresentInfo);
     void vkGetDeviceGroupPresentCapabilitiesKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device,
         VkDeviceGroupPresentCapabilitiesKHR* pDeviceGroupPresentCapabilities);
-    void vkGetDeviceGroupSurfacePresentModesKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkSurfaceKHR surface,
-        VkDeviceGroupPresentModeFlagsKHR* pModes);
+    void vkGetDeviceGroupSurfacePresentModesKHR(const uint8_t* snapshotTraceBegin,
+                                                size_t snapshotTraceBytes,
+                                                android::base::BumpPool* pool,
+                                                VkResult input_result, VkDevice device,
+                                                VkSurfaceKHR surface,
+                                                VkDeviceGroupPresentModeFlagsKHR* pModes);
     void vkGetPhysicalDevicePresentRectanglesKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
-        VkSurfaceKHR surface,
-        uint32_t* pRectCount,
-        VkRect2D* pRects);
-    void vkAcquireNextImage2KHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkAcquireNextImageInfoKHR* pAcquireInfo,
-        uint32_t* pImageIndex);
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
+        uint32_t* pRectCount, VkRect2D* pRects);
+    void vkAcquireNextImage2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkResult input_result,
+                                VkDevice device, const VkAcquireNextImageInfoKHR* pAcquireInfo,
+                                uint32_t* pImageIndex);
 #endif
 #ifdef VK_KHR_display
     void vkGetPhysicalDeviceDisplayPropertiesKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
-        uint32_t* pPropertyCount,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount,
         VkDisplayPropertiesKHR* pProperties);
     void vkGetPhysicalDeviceDisplayPlanePropertiesKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
-        uint32_t* pPropertyCount,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount,
         VkDisplayPlanePropertiesKHR* pProperties);
-    void vkGetDisplayPlaneSupportedDisplaysKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
-        uint32_t planeIndex,
-        uint32_t* pDisplayCount,
-        VkDisplayKHR* pDisplays);
-    void vkGetDisplayModePropertiesKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
-        VkDisplayKHR display,
-        uint32_t* pPropertyCount,
-        VkDisplayModePropertiesKHR* pProperties);
-    void vkCreateDisplayModeKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
-        VkDisplayKHR display,
-        const VkDisplayModeCreateInfoKHR* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkDisplayModeKHR* pMode);
-    void vkGetDisplayPlaneCapabilitiesKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
-        VkDisplayModeKHR mode,
-        uint32_t planeIndex,
-        VkDisplayPlaneCapabilitiesKHR* pCapabilities);
-    void vkCreateDisplayPlaneSurfaceKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkInstance instance,
-        const VkDisplaySurfaceCreateInfoKHR* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkSurfaceKHR* pSurface);
+    void vkGetDisplayPlaneSupportedDisplaysKHR(const uint8_t* snapshotTraceBegin,
+                                               size_t snapshotTraceBytes,
+                                               android::base::BumpPool* pool, VkResult input_result,
+                                               VkPhysicalDevice physicalDevice, uint32_t planeIndex,
+                                               uint32_t* pDisplayCount, VkDisplayKHR* pDisplays);
+    void vkGetDisplayModePropertiesKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool, VkResult input_result,
+                                       VkPhysicalDevice physicalDevice, VkDisplayKHR display,
+                                       uint32_t* pPropertyCount,
+                                       VkDisplayModePropertiesKHR* pProperties);
+    void vkCreateDisplayModeKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkResult input_result,
+                                VkPhysicalDevice physicalDevice, VkDisplayKHR display,
+                                const VkDisplayModeCreateInfoKHR* pCreateInfo,
+                                const VkAllocationCallbacks* pAllocator, VkDisplayModeKHR* pMode);
+    void vkGetDisplayPlaneCapabilitiesKHR(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkResult input_result, VkPhysicalDevice physicalDevice,
+                                          VkDisplayModeKHR mode, uint32_t planeIndex,
+                                          VkDisplayPlaneCapabilitiesKHR* pCapabilities);
+    void vkCreateDisplayPlaneSurfaceKHR(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkResult input_result, VkInstance instance,
+                                        const VkDisplaySurfaceCreateInfoKHR* pCreateInfo,
+                                        const VkAllocationCallbacks* pAllocator,
+                                        VkSurfaceKHR* pSurface);
 #endif
 #ifdef VK_KHR_display_swapchain
-    void vkCreateSharedSwapchainsKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        uint32_t swapchainCount,
-        const VkSwapchainCreateInfoKHR* pCreateInfos,
-        const VkAllocationCallbacks* pAllocator,
-        VkSwapchainKHR* pSwapchains);
+    void vkCreateSharedSwapchainsKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkResult input_result,
+                                     VkDevice device, uint32_t swapchainCount,
+                                     const VkSwapchainCreateInfoKHR* pCreateInfos,
+                                     const VkAllocationCallbacks* pAllocator,
+                                     VkSwapchainKHR* pSwapchains);
 #endif
 #ifdef VK_KHR_xlib_surface
-    void vkCreateXlibSurfaceKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkInstance instance,
-        const VkXlibSurfaceCreateInfoKHR* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkSurfaceKHR* pSurface);
+    void vkCreateXlibSurfaceKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkResult input_result,
+                                VkInstance instance, const VkXlibSurfaceCreateInfoKHR* pCreateInfo,
+                                const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
     void vkGetPhysicalDeviceXlibPresentationSupportKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkBool32 input_result,
-        VkPhysicalDevice physicalDevice,
-        uint32_t queueFamilyIndex,
-        Display* dpy,
-        VisualID visualID);
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkBool32 input_result, VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
+        Display* dpy, VisualID visualID);
 #endif
 #ifdef VK_KHR_xcb_surface
-    void vkCreateXcbSurfaceKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkInstance instance,
-        const VkXcbSurfaceCreateInfoKHR* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkSurfaceKHR* pSurface);
+    void vkCreateXcbSurfaceKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, VkResult input_result,
+                               VkInstance instance, const VkXcbSurfaceCreateInfoKHR* pCreateInfo,
+                               const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
     void vkGetPhysicalDeviceXcbPresentationSupportKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkBool32 input_result,
-        VkPhysicalDevice physicalDevice,
-        uint32_t queueFamilyIndex,
-        xcb_connection_t* connection,
-        xcb_visualid_t visual_id);
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkBool32 input_result, VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
+        xcb_connection_t* connection, xcb_visualid_t visual_id);
 #endif
 #ifdef VK_KHR_wayland_surface
-    void vkCreateWaylandSurfaceKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkInstance instance,
-        const VkWaylandSurfaceCreateInfoKHR* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkSurfaceKHR* pSurface);
+    void vkCreateWaylandSurfaceKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                   android::base::BumpPool* pool, VkResult input_result,
+                                   VkInstance instance,
+                                   const VkWaylandSurfaceCreateInfoKHR* pCreateInfo,
+                                   const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
     void vkGetPhysicalDeviceWaylandPresentationSupportKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkBool32 input_result,
-        VkPhysicalDevice physicalDevice,
-        uint32_t queueFamilyIndex,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkBool32 input_result, VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
         wl_display* display);
 #endif
 #ifdef VK_KHR_android_surface
-    void vkCreateAndroidSurfaceKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkInstance instance,
-        const VkAndroidSurfaceCreateInfoKHR* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkSurfaceKHR* pSurface);
+    void vkCreateAndroidSurfaceKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                   android::base::BumpPool* pool, VkResult input_result,
+                                   VkInstance instance,
+                                   const VkAndroidSurfaceCreateInfoKHR* pCreateInfo,
+                                   const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
 #endif
 #ifdef VK_KHR_win32_surface
-    void vkCreateWin32SurfaceKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkInstance instance,
-        const VkWin32SurfaceCreateInfoKHR* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkSurfaceKHR* pSurface);
+    void vkCreateWin32SurfaceKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                 android::base::BumpPool* pool, VkResult input_result,
+                                 VkInstance instance,
+                                 const VkWin32SurfaceCreateInfoKHR* pCreateInfo,
+                                 const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
     void vkGetPhysicalDeviceWin32PresentationSupportKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkBool32 input_result,
-        VkPhysicalDevice physicalDevice,
-        uint32_t queueFamilyIndex);
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkBool32 input_result, VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex);
 #endif
 #ifdef VK_KHR_sampler_mirror_clamp_to_edge
 #endif
 #ifdef VK_KHR_video_queue
     void vkGetPhysicalDeviceVideoCapabilitiesKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
-        const VkVideoProfileKHR* pVideoProfile,
-        VkVideoCapabilitiesKHR* pCapabilities);
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice,
+        const VkVideoProfileKHR* pVideoProfile, VkVideoCapabilitiesKHR* pCapabilities);
     void vkGetPhysicalDeviceVideoFormatPropertiesKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice,
         const VkPhysicalDeviceVideoFormatInfoKHR* pVideoFormatInfo,
-        uint32_t* pVideoFormatPropertyCount,
-        VkVideoFormatPropertiesKHR* pVideoFormatProperties);
-    void vkCreateVideoSessionKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkVideoSessionCreateInfoKHR* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkVideoSessionKHR* pVideoSession);
-    void vkDestroyVideoSessionKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkVideoSessionKHR videoSession,
-        const VkAllocationCallbacks* pAllocator);
+        uint32_t* pVideoFormatPropertyCount, VkVideoFormatPropertiesKHR* pVideoFormatProperties);
+    void vkCreateVideoSessionKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                 android::base::BumpPool* pool, VkResult input_result,
+                                 VkDevice device, const VkVideoSessionCreateInfoKHR* pCreateInfo,
+                                 const VkAllocationCallbacks* pAllocator,
+                                 VkVideoSessionKHR* pVideoSession);
+    void vkDestroyVideoSessionKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkDevice device,
+                                  VkVideoSessionKHR videoSession,
+                                  const VkAllocationCallbacks* pAllocator);
     void vkGetVideoSessionMemoryRequirementsKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkVideoSessionKHR videoSession,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, VkVideoSessionKHR videoSession,
         uint32_t* pVideoSessionMemoryRequirementsCount,
         VkVideoGetMemoryPropertiesKHR* pVideoSessionMemoryRequirements);
-    void vkBindVideoSessionMemoryKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkVideoSessionKHR videoSession,
-        uint32_t videoSessionBindMemoryCount,
-        const VkVideoBindMemoryKHR* pVideoSessionBindMemories);
-    void vkCreateVideoSessionParametersKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkVideoSessionParametersCreateInfoKHR* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkVideoSessionParametersKHR* pVideoSessionParameters);
+    void vkBindVideoSessionMemoryKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkResult input_result,
+                                     VkDevice device, VkVideoSessionKHR videoSession,
+                                     uint32_t videoSessionBindMemoryCount,
+                                     const VkVideoBindMemoryKHR* pVideoSessionBindMemories);
+    void vkCreateVideoSessionParametersKHR(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkResult input_result, VkDevice device,
+                                           const VkVideoSessionParametersCreateInfoKHR* pCreateInfo,
+                                           const VkAllocationCallbacks* pAllocator,
+                                           VkVideoSessionParametersKHR* pVideoSessionParameters);
     void vkUpdateVideoSessionParametersKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkVideoSessionParametersKHR videoSessionParameters,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, VkVideoSessionParametersKHR videoSessionParameters,
         const VkVideoSessionParametersUpdateInfoKHR* pUpdateInfo);
-    void vkDestroyVideoSessionParametersKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkVideoSessionParametersKHR videoSessionParameters,
-        const VkAllocationCallbacks* pAllocator);
-    void vkCmdBeginVideoCodingKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        const VkVideoBeginCodingInfoKHR* pBeginInfo);
-    void vkCmdEndVideoCodingKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        const VkVideoEndCodingInfoKHR* pEndCodingInfo);
-    void vkCmdControlVideoCodingKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        const VkVideoCodingControlInfoKHR* pCodingControlInfo);
+    void vkDestroyVideoSessionParametersKHR(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool, VkDevice device,
+                                            VkVideoSessionParametersKHR videoSessionParameters,
+                                            const VkAllocationCallbacks* pAllocator);
+    void vkCmdBeginVideoCodingKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                  const VkVideoBeginCodingInfoKHR* pBeginInfo);
+    void vkCmdEndVideoCodingKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                const VkVideoEndCodingInfoKHR* pEndCodingInfo);
+    void vkCmdControlVideoCodingKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                    const VkVideoCodingControlInfoKHR* pCodingControlInfo);
 #endif
 #ifdef VK_KHR_video_decode_queue
-    void vkCmdDecodeVideoKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        const VkVideoDecodeInfoKHR* pFrameInfo);
+    void vkCmdDecodeVideoKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                             const VkVideoDecodeInfoKHR* pFrameInfo);
 #endif
 #ifdef VK_KHR_dynamic_rendering
-    void vkCmdBeginRenderingKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        const VkRenderingInfoKHR* pRenderingInfo);
-    void vkCmdEndRenderingKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer);
+    void vkCmdBeginRenderingKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                const VkRenderingInfoKHR* pRenderingInfo);
+    void vkCmdEndRenderingKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkCommandBuffer commandBuffer);
 #endif
 #ifdef VK_KHR_multiview
 #endif
 #ifdef VK_KHR_get_physical_device_properties2
-    void vkGetPhysicalDeviceFeatures2KHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkPhysicalDevice physicalDevice,
-        VkPhysicalDeviceFeatures2* pFeatures);
-    void vkGetPhysicalDeviceProperties2KHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkPhysicalDevice physicalDevice,
-        VkPhysicalDeviceProperties2* pProperties);
-    void vkGetPhysicalDeviceFormatProperties2KHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkPhysicalDevice physicalDevice,
-        VkFormat format,
-        VkFormatProperties2* pFormatProperties);
+    void vkGetPhysicalDeviceFeatures2KHR(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkPhysicalDevice physicalDevice,
+                                         VkPhysicalDeviceFeatures2* pFeatures);
+    void vkGetPhysicalDeviceProperties2KHR(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkPhysicalDevice physicalDevice,
+                                           VkPhysicalDeviceProperties2* pProperties);
+    void vkGetPhysicalDeviceFormatProperties2KHR(const uint8_t* snapshotTraceBegin,
+                                                 size_t snapshotTraceBytes,
+                                                 android::base::BumpPool* pool,
+                                                 VkPhysicalDevice physicalDevice, VkFormat format,
+                                                 VkFormatProperties2* pFormatProperties);
     void vkGetPhysicalDeviceImageFormatProperties2KHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice,
         const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo,
         VkImageFormatProperties2* pImageFormatProperties);
     void vkGetPhysicalDeviceQueueFamilyProperties2KHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkPhysicalDevice physicalDevice,
-        uint32_t* pQueueFamilyPropertyCount,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkPhysicalDevice physicalDevice, uint32_t* pQueueFamilyPropertyCount,
         VkQueueFamilyProperties2* pQueueFamilyProperties);
     void vkGetPhysicalDeviceMemoryProperties2KHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkPhysicalDevice physicalDevice,
-        VkPhysicalDeviceMemoryProperties2* pMemoryProperties);
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties2* pMemoryProperties);
     void vkGetPhysicalDeviceSparseImageFormatProperties2KHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkPhysicalDevice physicalDevice,
-        const VkPhysicalDeviceSparseImageFormatInfo2* pFormatInfo,
-        uint32_t* pPropertyCount,
-        VkSparseImageFormatProperties2* pProperties);
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSparseImageFormatInfo2* pFormatInfo,
+        uint32_t* pPropertyCount, VkSparseImageFormatProperties2* pProperties);
 #endif
 #ifdef VK_KHR_device_group
-    void vkGetDeviceGroupPeerMemoryFeaturesKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        uint32_t heapIndex,
-        uint32_t localDeviceIndex,
-        uint32_t remoteDeviceIndex,
-        VkPeerMemoryFeatureFlags* pPeerMemoryFeatures);
-    void vkCmdSetDeviceMaskKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t deviceMask);
-    void vkCmdDispatchBaseKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t baseGroupX,
-        uint32_t baseGroupY,
-        uint32_t baseGroupZ,
-        uint32_t groupCountX,
-        uint32_t groupCountY,
-        uint32_t groupCountZ);
+    void vkGetDeviceGroupPeerMemoryFeaturesKHR(const uint8_t* snapshotTraceBegin,
+                                               size_t snapshotTraceBytes,
+                                               android::base::BumpPool* pool, VkDevice device,
+                                               uint32_t heapIndex, uint32_t localDeviceIndex,
+                                               uint32_t remoteDeviceIndex,
+                                               VkPeerMemoryFeatureFlags* pPeerMemoryFeatures);
+    void vkCmdSetDeviceMaskKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                               uint32_t deviceMask);
+    void vkCmdDispatchBaseKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                              uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ,
+                              uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ);
 #endif
 #ifdef VK_KHR_shader_draw_parameters
 #endif
 #ifdef VK_KHR_maintenance1
-    void vkTrimCommandPoolKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkCommandPool commandPool,
-        VkCommandPoolTrimFlags flags);
+    void vkTrimCommandPoolKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkDevice device,
+                              VkCommandPool commandPool, VkCommandPoolTrimFlags flags);
 #endif
 #ifdef VK_KHR_device_group_creation
     void vkEnumeratePhysicalDeviceGroupsKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkInstance instance,
-        uint32_t* pPhysicalDeviceGroupCount,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkInstance instance, uint32_t* pPhysicalDeviceGroupCount,
         VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProperties);
 #endif
 #ifdef VK_KHR_external_memory_capabilities
     void vkGetPhysicalDeviceExternalBufferPropertiesKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
         VkPhysicalDevice physicalDevice,
         const VkPhysicalDeviceExternalBufferInfo* pExternalBufferInfo,
         VkExternalBufferProperties* pExternalBufferProperties);
@@ -2006,50 +1053,30 @@
 #ifdef VK_KHR_external_memory
 #endif
 #ifdef VK_KHR_external_memory_win32
-    void vkGetMemoryWin32HandleKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkMemoryGetWin32HandleInfoKHR* pGetWin32HandleInfo,
-        HANDLE* pHandle);
+    void vkGetMemoryWin32HandleKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                   android::base::BumpPool* pool, VkResult input_result,
+                                   VkDevice device,
+                                   const VkMemoryGetWin32HandleInfoKHR* pGetWin32HandleInfo,
+                                   HANDLE* pHandle);
     void vkGetMemoryWin32HandlePropertiesKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkExternalMemoryHandleTypeFlagBits handleType,
-        HANDLE handle,
-        VkMemoryWin32HandlePropertiesKHR* pMemoryWin32HandleProperties);
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType,
+        HANDLE handle, VkMemoryWin32HandlePropertiesKHR* pMemoryWin32HandleProperties);
 #endif
 #ifdef VK_KHR_external_memory_fd
-    void vkGetMemoryFdKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkMemoryGetFdInfoKHR* pGetFdInfo,
-        int* pFd);
-    void vkGetMemoryFdPropertiesKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkExternalMemoryHandleTypeFlagBits handleType,
-        int fd,
-        VkMemoryFdPropertiesKHR* pMemoryFdProperties);
+    void vkGetMemoryFdKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                          android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                          const VkMemoryGetFdInfoKHR* pGetFdInfo, int* pFd);
+    void vkGetMemoryFdPropertiesKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkResult input_result,
+                                    VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType,
+                                    int fd, VkMemoryFdPropertiesKHR* pMemoryFdProperties);
 #endif
 #ifdef VK_KHR_win32_keyed_mutex
 #endif
 #ifdef VK_KHR_external_semaphore_capabilities
     void vkGetPhysicalDeviceExternalSemaphorePropertiesKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
         VkPhysicalDevice physicalDevice,
         const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo,
         VkExternalSemaphoreProperties* pExternalSemaphoreProperties);
@@ -2058,58 +1085,34 @@
 #endif
 #ifdef VK_KHR_external_semaphore_win32
     void vkImportSemaphoreWin32HandleKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device,
         const VkImportSemaphoreWin32HandleInfoKHR* pImportSemaphoreWin32HandleInfo);
-    void vkGetSemaphoreWin32HandleKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkSemaphoreGetWin32HandleInfoKHR* pGetWin32HandleInfo,
-        HANDLE* pHandle);
+    void vkGetSemaphoreWin32HandleKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkResult input_result,
+                                      VkDevice device,
+                                      const VkSemaphoreGetWin32HandleInfoKHR* pGetWin32HandleInfo,
+                                      HANDLE* pHandle);
 #endif
 #ifdef VK_KHR_external_semaphore_fd
-    void vkImportSemaphoreFdKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkImportSemaphoreFdInfoKHR* pImportSemaphoreFdInfo);
-    void vkGetSemaphoreFdKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkSemaphoreGetFdInfoKHR* pGetFdInfo,
-        int* pFd);
+    void vkImportSemaphoreFdKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkResult input_result,
+                                VkDevice device,
+                                const VkImportSemaphoreFdInfoKHR* pImportSemaphoreFdInfo);
+    void vkGetSemaphoreFdKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                             const VkSemaphoreGetFdInfoKHR* pGetFdInfo, int* pFd);
 #endif
 #ifdef VK_KHR_push_descriptor
-    void vkCmdPushDescriptorSetKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkPipelineBindPoint pipelineBindPoint,
-        VkPipelineLayout layout,
-        uint32_t set,
-        uint32_t descriptorWriteCount,
-        const VkWriteDescriptorSet* pDescriptorWrites);
+    void vkCmdPushDescriptorSetKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                   android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                   VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
+                                   uint32_t set, uint32_t descriptorWriteCount,
+                                   const VkWriteDescriptorSet* pDescriptorWrites);
     void vkCmdPushDescriptorSetWithTemplateKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkDescriptorUpdateTemplate descriptorUpdateTemplate,
-        VkPipelineLayout layout,
-        uint32_t set,
-        const void* pData);
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkCommandBuffer commandBuffer, VkDescriptorUpdateTemplate descriptorUpdateTemplate,
+        VkPipelineLayout layout, uint32_t set, const void* pData);
 #endif
 #ifdef VK_KHR_shader_float16_int8
 #endif
@@ -2119,77 +1122,50 @@
 #endif
 #ifdef VK_KHR_descriptor_update_template
     void vkCreateDescriptorUpdateTemplateKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device,
         const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
         VkDescriptorUpdateTemplate* pDescriptorUpdateTemplate);
-    void vkDestroyDescriptorUpdateTemplateKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkDescriptorUpdateTemplate descriptorUpdateTemplate,
-        const VkAllocationCallbacks* pAllocator);
-    void vkUpdateDescriptorSetWithTemplateKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkDescriptorSet descriptorSet,
-        VkDescriptorUpdateTemplate descriptorUpdateTemplate,
-        const void* pData);
+    void vkDestroyDescriptorUpdateTemplateKHR(const uint8_t* snapshotTraceBegin,
+                                              size_t snapshotTraceBytes,
+                                              android::base::BumpPool* pool, VkDevice device,
+                                              VkDescriptorUpdateTemplate descriptorUpdateTemplate,
+                                              const VkAllocationCallbacks* pAllocator);
+    void vkUpdateDescriptorSetWithTemplateKHR(const uint8_t* snapshotTraceBegin,
+                                              size_t snapshotTraceBytes,
+                                              android::base::BumpPool* pool, VkDevice device,
+                                              VkDescriptorSet descriptorSet,
+                                              VkDescriptorUpdateTemplate descriptorUpdateTemplate,
+                                              const void* pData);
 #endif
 #ifdef VK_KHR_imageless_framebuffer
 #endif
 #ifdef VK_KHR_create_renderpass2
-    void vkCreateRenderPass2KHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkRenderPassCreateInfo2* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkRenderPass* pRenderPass);
-    void vkCmdBeginRenderPass2KHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        const VkRenderPassBeginInfo* pRenderPassBegin,
-        const VkSubpassBeginInfo* pSubpassBeginInfo);
-    void vkCmdNextSubpass2KHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        const VkSubpassBeginInfo* pSubpassBeginInfo,
-        const VkSubpassEndInfo* pSubpassEndInfo);
-    void vkCmdEndRenderPass2KHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        const VkSubpassEndInfo* pSubpassEndInfo);
+    void vkCreateRenderPass2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkResult input_result,
+                                VkDevice device, const VkRenderPassCreateInfo2* pCreateInfo,
+                                const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass);
+    void vkCmdBeginRenderPass2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                  const VkRenderPassBeginInfo* pRenderPassBegin,
+                                  const VkSubpassBeginInfo* pSubpassBeginInfo);
+    void vkCmdNextSubpass2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                              const VkSubpassBeginInfo* pSubpassBeginInfo,
+                              const VkSubpassEndInfo* pSubpassEndInfo);
+    void vkCmdEndRenderPass2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                const VkSubpassEndInfo* pSubpassEndInfo);
 #endif
 #ifdef VK_KHR_shared_presentable_image
-    void vkGetSwapchainStatusKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkSwapchainKHR swapchain);
+    void vkGetSwapchainStatusKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                 android::base::BumpPool* pool, VkResult input_result,
+                                 VkDevice device, VkSwapchainKHR swapchain);
 #endif
 #ifdef VK_KHR_external_fence_capabilities
     void vkGetPhysicalDeviceExternalFencePropertiesKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
         VkPhysicalDevice physicalDevice,
         const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo,
         VkExternalFenceProperties* pExternalFenceProperties);
@@ -2198,126 +1174,77 @@
 #endif
 #ifdef VK_KHR_external_fence_win32
     void vkImportFenceWin32HandleKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device,
         const VkImportFenceWin32HandleInfoKHR* pImportFenceWin32HandleInfo);
-    void vkGetFenceWin32HandleKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkFenceGetWin32HandleInfoKHR* pGetWin32HandleInfo,
-        HANDLE* pHandle);
+    void vkGetFenceWin32HandleKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkResult input_result,
+                                  VkDevice device,
+                                  const VkFenceGetWin32HandleInfoKHR* pGetWin32HandleInfo,
+                                  HANDLE* pHandle);
 #endif
 #ifdef VK_KHR_external_fence_fd
-    void vkImportFenceFdKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkImportFenceFdInfoKHR* pImportFenceFdInfo);
-    void vkGetFenceFdKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkFenceGetFdInfoKHR* pGetFdInfo,
-        int* pFd);
+    void vkImportFenceFdKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                            const VkImportFenceFdInfoKHR* pImportFenceFdInfo);
+    void vkGetFenceFdKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                         android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                         const VkFenceGetFdInfoKHR* pGetFdInfo, int* pFd);
 #endif
 #ifdef VK_KHR_performance_query
     void vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
-        uint32_t queueFamilyIndex,
-        uint32_t* pCounterCount,
-        VkPerformanceCounterKHR* pCounters,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
+        uint32_t* pCounterCount, VkPerformanceCounterKHR* pCounters,
         VkPerformanceCounterDescriptionKHR* pCounterDescriptions);
     void vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
         VkPhysicalDevice physicalDevice,
         const VkQueryPoolPerformanceCreateInfoKHR* pPerformanceQueryCreateInfo,
         uint32_t* pNumPasses);
-    void vkAcquireProfilingLockKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkAcquireProfilingLockInfoKHR* pInfo);
-    void vkReleaseProfilingLockKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device);
+    void vkAcquireProfilingLockKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                   android::base::BumpPool* pool, VkResult input_result,
+                                   VkDevice device, const VkAcquireProfilingLockInfoKHR* pInfo);
+    void vkReleaseProfilingLockKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                   android::base::BumpPool* pool, VkDevice device);
 #endif
 #ifdef VK_KHR_maintenance2
 #endif
 #ifdef VK_KHR_get_surface_capabilities2
     void vkGetPhysicalDeviceSurfaceCapabilities2KHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice,
         const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo,
         VkSurfaceCapabilities2KHR* pSurfaceCapabilities);
-    void vkGetPhysicalDeviceSurfaceFormats2KHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
-        const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo,
-        uint32_t* pSurfaceFormatCount,
-        VkSurfaceFormat2KHR* pSurfaceFormats);
+    void vkGetPhysicalDeviceSurfaceFormats2KHR(const uint8_t* snapshotTraceBegin,
+                                               size_t snapshotTraceBytes,
+                                               android::base::BumpPool* pool, VkResult input_result,
+                                               VkPhysicalDevice physicalDevice,
+                                               const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo,
+                                               uint32_t* pSurfaceFormatCount,
+                                               VkSurfaceFormat2KHR* pSurfaceFormats);
 #endif
 #ifdef VK_KHR_variable_pointers
 #endif
 #ifdef VK_KHR_get_display_properties2
     void vkGetPhysicalDeviceDisplayProperties2KHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
-        uint32_t* pPropertyCount,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount,
         VkDisplayProperties2KHR* pProperties);
     void vkGetPhysicalDeviceDisplayPlaneProperties2KHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
-        uint32_t* pPropertyCount,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount,
         VkDisplayPlaneProperties2KHR* pProperties);
-    void vkGetDisplayModeProperties2KHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
-        VkDisplayKHR display,
-        uint32_t* pPropertyCount,
-        VkDisplayModeProperties2KHR* pProperties);
-    void vkGetDisplayPlaneCapabilities2KHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
-        const VkDisplayPlaneInfo2KHR* pDisplayPlaneInfo,
-        VkDisplayPlaneCapabilities2KHR* pCapabilities);
+    void vkGetDisplayModeProperties2KHR(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkResult input_result, VkPhysicalDevice physicalDevice,
+                                        VkDisplayKHR display, uint32_t* pPropertyCount,
+                                        VkDisplayModeProperties2KHR* pProperties);
+    void vkGetDisplayPlaneCapabilities2KHR(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkResult input_result, VkPhysicalDevice physicalDevice,
+                                           const VkDisplayPlaneInfo2KHR* pDisplayPlaneInfo,
+                                           VkDisplayPlaneCapabilities2KHR* pCapabilities);
 #endif
 #ifdef VK_KHR_dedicated_allocation
 #endif
@@ -2326,101 +1253,68 @@
 #ifdef VK_KHR_relaxed_block_layout
 #endif
 #ifdef VK_KHR_get_memory_requirements2
-    void vkGetImageMemoryRequirements2KHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        const VkImageMemoryRequirementsInfo2* pInfo,
-        VkMemoryRequirements2* pMemoryRequirements);
-    void vkGetBufferMemoryRequirements2KHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        const VkBufferMemoryRequirementsInfo2* pInfo,
-        VkMemoryRequirements2* pMemoryRequirements);
+    void vkGetImageMemoryRequirements2KHR(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkDevice device,
+                                          const VkImageMemoryRequirementsInfo2* pInfo,
+                                          VkMemoryRequirements2* pMemoryRequirements);
+    void vkGetBufferMemoryRequirements2KHR(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkDevice device,
+                                           const VkBufferMemoryRequirementsInfo2* pInfo,
+                                           VkMemoryRequirements2* pMemoryRequirements);
     void vkGetImageSparseMemoryRequirements2KHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        const VkImageSparseMemoryRequirementsInfo2* pInfo,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkDevice device, const VkImageSparseMemoryRequirementsInfo2* pInfo,
         uint32_t* pSparseMemoryRequirementCount,
         VkSparseImageMemoryRequirements2* pSparseMemoryRequirements);
 #endif
 #ifdef VK_KHR_image_format_list
 #endif
 #ifdef VK_KHR_sampler_ycbcr_conversion
-    void vkCreateSamplerYcbcrConversionKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkSamplerYcbcrConversionCreateInfo* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkSamplerYcbcrConversion* pYcbcrConversion);
-    void vkDestroySamplerYcbcrConversionKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkSamplerYcbcrConversion ycbcrConversion,
-        const VkAllocationCallbacks* pAllocator);
+    void vkCreateSamplerYcbcrConversionKHR(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkResult input_result, VkDevice device,
+                                           const VkSamplerYcbcrConversionCreateInfo* pCreateInfo,
+                                           const VkAllocationCallbacks* pAllocator,
+                                           VkSamplerYcbcrConversion* pYcbcrConversion);
+    void vkDestroySamplerYcbcrConversionKHR(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool, VkDevice device,
+                                            VkSamplerYcbcrConversion ycbcrConversion,
+                                            const VkAllocationCallbacks* pAllocator);
 #endif
 #ifdef VK_KHR_bind_memory2
-    void vkBindBufferMemory2KHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        uint32_t bindInfoCount,
-        const VkBindBufferMemoryInfo* pBindInfos);
-    void vkBindImageMemory2KHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        uint32_t bindInfoCount,
-        const VkBindImageMemoryInfo* pBindInfos);
+    void vkBindBufferMemory2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkResult input_result,
+                                VkDevice device, uint32_t bindInfoCount,
+                                const VkBindBufferMemoryInfo* pBindInfos);
+    void vkBindImageMemory2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, VkResult input_result,
+                               VkDevice device, uint32_t bindInfoCount,
+                               const VkBindImageMemoryInfo* pBindInfos);
 #endif
 #ifdef VK_KHR_portability_subset
 #endif
 #ifdef VK_KHR_maintenance3
-    void vkGetDescriptorSetLayoutSupportKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
-        VkDescriptorSetLayoutSupport* pSupport);
+    void vkGetDescriptorSetLayoutSupportKHR(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool, VkDevice device,
+                                            const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
+                                            VkDescriptorSetLayoutSupport* pSupport);
 #endif
 #ifdef VK_KHR_draw_indirect_count
-    void vkCmdDrawIndirectCountKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkBuffer buffer,
-        VkDeviceSize offset,
-        VkBuffer countBuffer,
-        VkDeviceSize countBufferOffset,
-        uint32_t maxDrawCount,
-        uint32_t stride);
-    void vkCmdDrawIndexedIndirectCountKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkBuffer buffer,
-        VkDeviceSize offset,
-        VkBuffer countBuffer,
-        VkDeviceSize countBufferOffset,
-        uint32_t maxDrawCount,
-        uint32_t stride);
+    void vkCmdDrawIndirectCountKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                   android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                   VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
+                                   VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+                                   uint32_t stride);
+    void vkCmdDrawIndexedIndirectCountKHR(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkCommandBuffer commandBuffer, VkBuffer buffer,
+                                          VkDeviceSize offset, VkBuffer countBuffer,
+                                          VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+                                          uint32_t stride);
 #endif
 #ifdef VK_KHR_shader_subgroup_extended_types
 #endif
@@ -2439,29 +1333,15 @@
 #ifdef VK_KHR_swapchain_mutable_format
 #endif
 #ifdef VK_KHR_timeline_semaphore
-    void vkGetSemaphoreCounterValueKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkSemaphore semaphore,
-        uint64_t* pValue);
-    void vkWaitSemaphoresKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkSemaphoreWaitInfo* pWaitInfo,
-        uint64_t timeout);
-    void vkSignalSemaphoreKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkSemaphoreSignalInfo* pSignalInfo);
+    void vkGetSemaphoreCounterValueKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool, VkResult input_result,
+                                       VkDevice device, VkSemaphore semaphore, uint64_t* pValue);
+    void vkWaitSemaphoresKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                             const VkSemaphoreWaitInfo* pWaitInfo, uint64_t timeout);
+    void vkSignalSemaphoreKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                              const VkSemaphoreSignalInfo* pSignalInfo);
 #endif
 #ifdef VK_KHR_vulkan_memory_model
 #endif
@@ -2469,20 +1349,14 @@
 #endif
 #ifdef VK_KHR_fragment_shading_rate
     void vkGetPhysicalDeviceFragmentShadingRatesKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
-        uint32_t* pFragmentShadingRateCount,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice, uint32_t* pFragmentShadingRateCount,
         VkPhysicalDeviceFragmentShadingRateKHR* pFragmentShadingRates);
-    void vkCmdSetFragmentShadingRateKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        const VkExtent2D* pFragmentSize,
-        const VkFragmentShadingRateCombinerOpKHR combinerOps[2]);
+    void vkCmdSetFragmentShadingRateKHR(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkCommandBuffer commandBuffer,
+                                        const VkExtent2D* pFragmentSize,
+                                        const VkFragmentShadingRateCombinerOpKHR combinerOps[2]);
 #endif
 #ifdef VK_KHR_spirv_1_4
 #endif
@@ -2491,105 +1365,60 @@
 #ifdef VK_KHR_separate_depth_stencil_layouts
 #endif
 #ifdef VK_KHR_present_wait
-    void vkWaitForPresentKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkSwapchainKHR swapchain,
-        uint64_t presentId,
-        uint64_t timeout);
+    void vkWaitForPresentKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                             VkSwapchainKHR swapchain, uint64_t presentId, uint64_t timeout);
 #endif
 #ifdef VK_KHR_uniform_buffer_standard_layout
 #endif
 #ifdef VK_KHR_buffer_device_address
-    void vkGetBufferDeviceAddressKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDeviceAddress input_result,
-        VkDevice device,
-        const VkBufferDeviceAddressInfo* pInfo);
-    void vkGetBufferOpaqueCaptureAddressKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        uint64_t input_result,
-        VkDevice device,
-        const VkBufferDeviceAddressInfo* pInfo);
+    void vkGetBufferDeviceAddressKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkDeviceAddress input_result,
+                                     VkDevice device, const VkBufferDeviceAddressInfo* pInfo);
+    void vkGetBufferOpaqueCaptureAddressKHR(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool, uint64_t input_result,
+                                            VkDevice device,
+                                            const VkBufferDeviceAddressInfo* pInfo);
     void vkGetDeviceMemoryOpaqueCaptureAddressKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        uint64_t input_result,
-        VkDevice device,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        uint64_t input_result, VkDevice device,
         const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo);
 #endif
 #ifdef VK_KHR_deferred_host_operations
-    void vkCreateDeferredOperationKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkAllocationCallbacks* pAllocator,
-        VkDeferredOperationKHR* pDeferredOperation);
-    void vkDestroyDeferredOperationKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkDeferredOperationKHR operation,
-        const VkAllocationCallbacks* pAllocator);
-    void vkGetDeferredOperationMaxConcurrencyKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        uint32_t input_result,
-        VkDevice device,
-        VkDeferredOperationKHR operation);
-    void vkGetDeferredOperationResultKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkDeferredOperationKHR operation);
-    void vkDeferredOperationJoinKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkDeferredOperationKHR operation);
+    void vkCreateDeferredOperationKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkResult input_result,
+                                      VkDevice device, const VkAllocationCallbacks* pAllocator,
+                                      VkDeferredOperationKHR* pDeferredOperation);
+    void vkDestroyDeferredOperationKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool, VkDevice device,
+                                       VkDeferredOperationKHR operation,
+                                       const VkAllocationCallbacks* pAllocator);
+    void vkGetDeferredOperationMaxConcurrencyKHR(const uint8_t* snapshotTraceBegin,
+                                                 size_t snapshotTraceBytes,
+                                                 android::base::BumpPool* pool,
+                                                 uint32_t input_result, VkDevice device,
+                                                 VkDeferredOperationKHR operation);
+    void vkGetDeferredOperationResultKHR(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkResult input_result, VkDevice device,
+                                         VkDeferredOperationKHR operation);
+    void vkDeferredOperationJoinKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkResult input_result,
+                                    VkDevice device, VkDeferredOperationKHR operation);
 #endif
 #ifdef VK_KHR_pipeline_executable_properties
     void vkGetPipelineExecutablePropertiesKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkPipelineInfoKHR* pPipelineInfo,
-        uint32_t* pExecutableCount,
-        VkPipelineExecutablePropertiesKHR* pProperties);
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, const VkPipelineInfoKHR* pPipelineInfo,
+        uint32_t* pExecutableCount, VkPipelineExecutablePropertiesKHR* pProperties);
     void vkGetPipelineExecutableStatisticsKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkPipelineExecutableInfoKHR* pExecutableInfo,
-        uint32_t* pStatisticCount,
-        VkPipelineExecutableStatisticKHR* pStatistics);
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, const VkPipelineExecutableInfoKHR* pExecutableInfo,
+        uint32_t* pStatisticCount, VkPipelineExecutableStatisticKHR* pStatistics);
     void vkGetPipelineExecutableInternalRepresentationsKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkPipelineExecutableInfoKHR* pExecutableInfo,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, const VkPipelineExecutableInfoKHR* pExecutableInfo,
         uint32_t* pInternalRepresentationCount,
         VkPipelineExecutableInternalRepresentationKHR* pInternalRepresentations);
 #endif
@@ -2602,75 +1431,39 @@
 #ifdef VK_KHR_present_id
 #endif
 #ifdef VK_KHR_video_encode_queue
-    void vkCmdEncodeVideoKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        const VkVideoEncodeInfoKHR* pEncodeInfo);
+    void vkCmdEncodeVideoKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                             const VkVideoEncodeInfoKHR* pEncodeInfo);
 #endif
 #ifdef VK_KHR_synchronization2
-    void vkCmdSetEvent2KHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkEvent event,
-        const VkDependencyInfoKHR* pDependencyInfo);
-    void vkCmdResetEvent2KHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkEvent event,
-        VkPipelineStageFlags2KHR stageMask);
-    void vkCmdWaitEvents2KHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t eventCount,
-        const VkEvent* pEvents,
-        const VkDependencyInfoKHR* pDependencyInfos);
-    void vkCmdPipelineBarrier2KHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        const VkDependencyInfoKHR* pDependencyInfo);
-    void vkCmdWriteTimestamp2KHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkPipelineStageFlags2KHR stage,
-        VkQueryPool queryPool,
-        uint32_t query);
-    void vkQueueSubmit2KHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkQueue queue,
-        uint32_t submitCount,
-        const VkSubmitInfo2KHR* pSubmits,
-        VkFence fence);
-    void vkCmdWriteBufferMarker2AMD(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkPipelineStageFlags2KHR stage,
-        VkBuffer dstBuffer,
-        VkDeviceSize dstOffset,
-        uint32_t marker);
-    void vkGetQueueCheckpointData2NV(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkQueue queue,
-        uint32_t* pCheckpointDataCount,
-        VkCheckpointData2NV* pCheckpointData);
+    void vkCmdSetEvent2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                           VkEvent event, const VkDependencyInfoKHR* pDependencyInfo);
+    void vkCmdResetEvent2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                             VkEvent event, VkPipelineStageFlags2KHR stageMask);
+    void vkCmdWaitEvents2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                             uint32_t eventCount, const VkEvent* pEvents,
+                             const VkDependencyInfoKHR* pDependencyInfos);
+    void vkCmdPipelineBarrier2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                  const VkDependencyInfoKHR* pDependencyInfo);
+    void vkCmdWriteTimestamp2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                 android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                 VkPipelineStageFlags2KHR stage, VkQueryPool queryPool,
+                                 uint32_t query);
+    void vkQueueSubmit2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkResult input_result, VkQueue queue,
+                           uint32_t submitCount, const VkSubmitInfo2KHR* pSubmits, VkFence fence);
+    void vkCmdWriteBufferMarker2AMD(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                    VkPipelineStageFlags2KHR stage, VkBuffer dstBuffer,
+                                    VkDeviceSize dstOffset, uint32_t marker);
+    void vkGetQueueCheckpointData2NV(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkQueue queue,
+                                     uint32_t* pCheckpointDataCount,
+                                     VkCheckpointData2NV* pCheckpointData);
 #endif
 #ifdef VK_KHR_shader_subgroup_uniform_control_flow
 #endif
@@ -2679,129 +1472,76 @@
 #ifdef VK_KHR_workgroup_memory_explicit_layout
 #endif
 #ifdef VK_KHR_copy_commands2
-    void vkCmdCopyBuffer2KHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        const VkCopyBufferInfo2KHR* pCopyBufferInfo);
-    void vkCmdCopyImage2KHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        const VkCopyImageInfo2KHR* pCopyImageInfo);
-    void vkCmdCopyBufferToImage2KHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        const VkCopyBufferToImageInfo2KHR* pCopyBufferToImageInfo);
-    void vkCmdCopyImageToBuffer2KHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        const VkCopyImageToBufferInfo2KHR* pCopyImageToBufferInfo);
-    void vkCmdBlitImage2KHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        const VkBlitImageInfo2KHR* pBlitImageInfo);
-    void vkCmdResolveImage2KHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        const VkResolveImageInfo2KHR* pResolveImageInfo);
+    void vkCmdCopyBuffer2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                             const VkCopyBufferInfo2KHR* pCopyBufferInfo);
+    void vkCmdCopyImage2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                            const VkCopyImageInfo2KHR* pCopyImageInfo);
+    void vkCmdCopyBufferToImage2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                    const VkCopyBufferToImageInfo2KHR* pCopyBufferToImageInfo);
+    void vkCmdCopyImageToBuffer2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                    const VkCopyImageToBufferInfo2KHR* pCopyImageToBufferInfo);
+    void vkCmdBlitImage2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                            const VkBlitImageInfo2KHR* pBlitImageInfo);
+    void vkCmdResolveImage2KHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                               const VkResolveImageInfo2KHR* pResolveImageInfo);
 #endif
 #ifdef VK_KHR_format_feature_flags2
 #endif
 #ifdef VK_KHR_maintenance4
-    void vkGetDeviceBufferMemoryRequirementsKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        const VkDeviceBufferMemoryRequirementsKHR* pInfo,
-        VkMemoryRequirements2* pMemoryRequirements);
-    void vkGetDeviceImageMemoryRequirementsKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        const VkDeviceImageMemoryRequirementsKHR* pInfo,
-        VkMemoryRequirements2* pMemoryRequirements);
+    void vkGetDeviceBufferMemoryRequirementsKHR(const uint8_t* snapshotTraceBegin,
+                                                size_t snapshotTraceBytes,
+                                                android::base::BumpPool* pool, VkDevice device,
+                                                const VkDeviceBufferMemoryRequirementsKHR* pInfo,
+                                                VkMemoryRequirements2* pMemoryRequirements);
+    void vkGetDeviceImageMemoryRequirementsKHR(const uint8_t* snapshotTraceBegin,
+                                               size_t snapshotTraceBytes,
+                                               android::base::BumpPool* pool, VkDevice device,
+                                               const VkDeviceImageMemoryRequirementsKHR* pInfo,
+                                               VkMemoryRequirements2* pMemoryRequirements);
     void vkGetDeviceImageSparseMemoryRequirementsKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        const VkDeviceImageMemoryRequirementsKHR* pInfo,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkDevice device, const VkDeviceImageMemoryRequirementsKHR* pInfo,
         uint32_t* pSparseMemoryRequirementCount,
         VkSparseImageMemoryRequirements2* pSparseMemoryRequirements);
 #endif
 #ifdef VK_ANDROID_native_buffer
-    void vkGetSwapchainGrallocUsageANDROID(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkFormat format,
-        VkImageUsageFlags imageUsage,
-        int* grallocUsage);
-    void vkAcquireImageANDROID(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkImage image,
-        int nativeFenceFd,
-        VkSemaphore semaphore,
-        VkFence fence);
-    void vkQueueSignalReleaseImageANDROID(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkQueue queue,
-        uint32_t waitSemaphoreCount,
-        const VkSemaphore* pWaitSemaphores,
-        VkImage image,
-        int* pNativeFenceFd);
+    void vkGetSwapchainGrallocUsageANDROID(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkResult input_result, VkDevice device, VkFormat format,
+                                           VkImageUsageFlags imageUsage, int* grallocUsage);
+    void vkAcquireImageANDROID(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, VkResult input_result,
+                               VkDevice device, VkImage image, int nativeFenceFd,
+                               VkSemaphore semaphore, VkFence fence);
+    void vkQueueSignalReleaseImageANDROID(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkResult input_result, VkQueue queue,
+                                          uint32_t waitSemaphoreCount,
+                                          const VkSemaphore* pWaitSemaphores, VkImage image,
+                                          int* pNativeFenceFd);
 #endif
 #ifdef VK_EXT_debug_report
-    void vkCreateDebugReportCallbackEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkInstance instance,
-        const VkDebugReportCallbackCreateInfoEXT* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkDebugReportCallbackEXT* pCallback);
-    void vkDestroyDebugReportCallbackEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkInstance instance,
-        VkDebugReportCallbackEXT callback,
-        const VkAllocationCallbacks* pAllocator);
-    void vkDebugReportMessageEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkInstance instance,
-        VkDebugReportFlagsEXT flags,
-        VkDebugReportObjectTypeEXT objectType,
-        uint64_t object,
-        size_t location,
-        int32_t messageCode,
-        const char* pLayerPrefix,
-        const char* pMessage);
+    void vkCreateDebugReportCallbackEXT(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkResult input_result, VkInstance instance,
+                                        const VkDebugReportCallbackCreateInfoEXT* pCreateInfo,
+                                        const VkAllocationCallbacks* pAllocator,
+                                        VkDebugReportCallbackEXT* pCallback);
+    void vkDestroyDebugReportCallbackEXT(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkInstance instance, VkDebugReportCallbackEXT callback,
+                                         const VkAllocationCallbacks* pAllocator);
+    void vkDebugReportMessageEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                 android::base::BumpPool* pool, VkInstance instance,
+                                 VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType,
+                                 uint64_t object, size_t location, int32_t messageCode,
+                                 const char* pLayerPrefix, const char* pMessage);
 #endif
 #ifdef VK_NV_glsl_shader
 #endif
@@ -2816,37 +1556,22 @@
 #ifdef VK_AMD_shader_explicit_vertex_parameter
 #endif
 #ifdef VK_EXT_debug_marker
-    void vkDebugMarkerSetObjectTagEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkDebugMarkerObjectTagInfoEXT* pTagInfo);
-    void vkDebugMarkerSetObjectNameEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkDebugMarkerObjectNameInfoEXT* pNameInfo);
-    void vkCmdDebugMarkerBeginEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        const VkDebugMarkerMarkerInfoEXT* pMarkerInfo);
-    void vkCmdDebugMarkerEndEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer);
-    void vkCmdDebugMarkerInsertEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        const VkDebugMarkerMarkerInfoEXT* pMarkerInfo);
+    void vkDebugMarkerSetObjectTagEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkResult input_result,
+                                      VkDevice device,
+                                      const VkDebugMarkerObjectTagInfoEXT* pTagInfo);
+    void vkDebugMarkerSetObjectNameEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool, VkResult input_result,
+                                       VkDevice device,
+                                       const VkDebugMarkerObjectNameInfoEXT* pNameInfo);
+    void vkCmdDebugMarkerBeginEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                  const VkDebugMarkerMarkerInfoEXT* pMarkerInfo);
+    void vkCmdDebugMarkerEndEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkCommandBuffer commandBuffer);
+    void vkCmdDebugMarkerInsertEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                   android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                   const VkDebugMarkerMarkerInfoEXT* pMarkerInfo);
 #endif
 #ifdef VK_AMD_gcn_shader
 #endif
@@ -2854,142 +1579,73 @@
 #endif
 #ifdef VK_EXT_transform_feedback
     void vkCmdBindTransformFeedbackBuffersEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t firstBinding,
-        uint32_t bindingCount,
-        const VkBuffer* pBuffers,
-        const VkDeviceSize* pOffsets,
-        const VkDeviceSize* pSizes);
-    void vkCmdBeginTransformFeedbackEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t firstCounterBuffer,
-        uint32_t counterBufferCount,
-        const VkBuffer* pCounterBuffers,
-        const VkDeviceSize* pCounterBufferOffsets);
-    void vkCmdEndTransformFeedbackEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t firstCounterBuffer,
-        uint32_t counterBufferCount,
-        const VkBuffer* pCounterBuffers,
-        const VkDeviceSize* pCounterBufferOffsets);
-    void vkCmdBeginQueryIndexedEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkQueryPool queryPool,
-        uint32_t query,
-        VkQueryControlFlags flags,
-        uint32_t index);
-    void vkCmdEndQueryIndexedEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkQueryPool queryPool,
-        uint32_t query,
-        uint32_t index);
-    void vkCmdDrawIndirectByteCountEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t instanceCount,
-        uint32_t firstInstance,
-        VkBuffer counterBuffer,
-        VkDeviceSize counterBufferOffset,
-        uint32_t counterOffset,
-        uint32_t vertexStride);
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
+        const VkBuffer* pBuffers, const VkDeviceSize* pOffsets, const VkDeviceSize* pSizes);
+    void vkCmdBeginTransformFeedbackEXT(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer,
+                                        uint32_t counterBufferCount,
+                                        const VkBuffer* pCounterBuffers,
+                                        const VkDeviceSize* pCounterBufferOffsets);
+    void vkCmdEndTransformFeedbackEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                      uint32_t firstCounterBuffer, uint32_t counterBufferCount,
+                                      const VkBuffer* pCounterBuffers,
+                                      const VkDeviceSize* pCounterBufferOffsets);
+    void vkCmdBeginQueryIndexedEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                   android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                   VkQueryPool queryPool, uint32_t query, VkQueryControlFlags flags,
+                                   uint32_t index);
+    void vkCmdEndQueryIndexedEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                 android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                 VkQueryPool queryPool, uint32_t query, uint32_t index);
+    void vkCmdDrawIndirectByteCountEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                       uint32_t instanceCount, uint32_t firstInstance,
+                                       VkBuffer counterBuffer, VkDeviceSize counterBufferOffset,
+                                       uint32_t counterOffset, uint32_t vertexStride);
 #endif
 #ifdef VK_NVX_binary_import
-    void vkCreateCuModuleNVX(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkCuModuleCreateInfoNVX* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkCuModuleNVX* pModule);
-    void vkCreateCuFunctionNVX(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkCuFunctionCreateInfoNVX* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkCuFunctionNVX* pFunction);
-    void vkDestroyCuModuleNVX(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkCuModuleNVX module,
-        const VkAllocationCallbacks* pAllocator);
-    void vkDestroyCuFunctionNVX(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkCuFunctionNVX function,
-        const VkAllocationCallbacks* pAllocator);
-    void vkCmdCuLaunchKernelNVX(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        const VkCuLaunchInfoNVX* pLaunchInfo);
+    void vkCreateCuModuleNVX(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                             const VkCuModuleCreateInfoNVX* pCreateInfo,
+                             const VkAllocationCallbacks* pAllocator, VkCuModuleNVX* pModule);
+    void vkCreateCuFunctionNVX(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, VkResult input_result,
+                               VkDevice device, const VkCuFunctionCreateInfoNVX* pCreateInfo,
+                               const VkAllocationCallbacks* pAllocator, VkCuFunctionNVX* pFunction);
+    void vkDestroyCuModuleNVX(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkDevice device, VkCuModuleNVX module,
+                              const VkAllocationCallbacks* pAllocator);
+    void vkDestroyCuFunctionNVX(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkDevice device,
+                                VkCuFunctionNVX function, const VkAllocationCallbacks* pAllocator);
+    void vkCmdCuLaunchKernelNVX(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                const VkCuLaunchInfoNVX* pLaunchInfo);
 #endif
 #ifdef VK_NVX_image_view_handle
-    void vkGetImageViewHandleNVX(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        uint32_t input_result,
-        VkDevice device,
-        const VkImageViewHandleInfoNVX* pInfo);
-    void vkGetImageViewAddressNVX(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkImageView imageView,
-        VkImageViewAddressPropertiesNVX* pProperties);
+    void vkGetImageViewHandleNVX(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                 android::base::BumpPool* pool, uint32_t input_result,
+                                 VkDevice device, const VkImageViewHandleInfoNVX* pInfo);
+    void vkGetImageViewAddressNVX(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkResult input_result,
+                                  VkDevice device, VkImageView imageView,
+                                  VkImageViewAddressPropertiesNVX* pProperties);
 #endif
 #ifdef VK_AMD_draw_indirect_count
-    void vkCmdDrawIndirectCountAMD(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkBuffer buffer,
-        VkDeviceSize offset,
-        VkBuffer countBuffer,
-        VkDeviceSize countBufferOffset,
-        uint32_t maxDrawCount,
-        uint32_t stride);
-    void vkCmdDrawIndexedIndirectCountAMD(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkBuffer buffer,
-        VkDeviceSize offset,
-        VkBuffer countBuffer,
-        VkDeviceSize countBufferOffset,
-        uint32_t maxDrawCount,
-        uint32_t stride);
+    void vkCmdDrawIndirectCountAMD(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                   android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                   VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
+                                   VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+                                   uint32_t stride);
+    void vkCmdDrawIndexedIndirectCountAMD(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkCommandBuffer commandBuffer, VkBuffer buffer,
+                                          VkDeviceSize offset, VkBuffer countBuffer,
+                                          VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+                                          uint32_t stride);
 #endif
 #ifdef VK_AMD_negative_viewport_height
 #endif
@@ -3006,30 +1662,19 @@
 #ifdef VK_AMD_texture_gather_bias_lod
 #endif
 #ifdef VK_AMD_shader_info
-    void vkGetShaderInfoAMD(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkPipeline pipeline,
-        VkShaderStageFlagBits shaderStage,
-        VkShaderInfoTypeAMD infoType,
-        size_t* pInfoSize,
-        void* pInfo);
+    void vkGetShaderInfoAMD(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                            VkPipeline pipeline, VkShaderStageFlagBits shaderStage,
+                            VkShaderInfoTypeAMD infoType, size_t* pInfoSize, void* pInfo);
 #endif
 #ifdef VK_AMD_shader_image_load_store_lod
 #endif
 #ifdef VK_GGP_stream_descriptor_surface
     void vkCreateStreamDescriptorSurfaceGGP(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkInstance instance,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkInstance instance,
         const VkStreamDescriptorSurfaceCreateInfoGGP* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkSurfaceKHR* pSurface);
+        const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
 #endif
 #ifdef VK_NV_corner_sampled_image
 #endif
@@ -3037,46 +1682,29 @@
 #endif
 #ifdef VK_NV_external_memory_capabilities
     void vkGetPhysicalDeviceExternalImageFormatPropertiesNV(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
-        VkFormat format,
-        VkImageType type,
-        VkImageTiling tiling,
-        VkImageUsageFlags usage,
-        VkImageCreateFlags flags,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
+        VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags,
         VkExternalMemoryHandleTypeFlagsNV externalHandleType,
         VkExternalImageFormatPropertiesNV* pExternalImageFormatProperties);
 #endif
 #ifdef VK_NV_external_memory
 #endif
 #ifdef VK_NV_external_memory_win32
-    void vkGetMemoryWin32HandleNV(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkDeviceMemory memory,
-        VkExternalMemoryHandleTypeFlagsNV handleType,
-        HANDLE* pHandle);
+    void vkGetMemoryWin32HandleNV(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkResult input_result,
+                                  VkDevice device, VkDeviceMemory memory,
+                                  VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE* pHandle);
 #endif
 #ifdef VK_NV_win32_keyed_mutex
 #endif
 #ifdef VK_EXT_validation_flags
 #endif
 #ifdef VK_NN_vi_surface
-    void vkCreateViSurfaceNN(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkInstance instance,
-        const VkViSurfaceCreateInfoNN* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkSurfaceKHR* pSurface);
+    void vkCreateViSurfaceNN(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkResult input_result,
+                             VkInstance instance, const VkViSurfaceCreateInfoNN* pCreateInfo,
+                             const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
 #endif
 #ifdef VK_EXT_shader_subgroup_ballot
 #endif
@@ -3088,121 +1716,71 @@
 #endif
 #ifdef VK_EXT_conditional_rendering
     void vkCmdBeginConditionalRenderingEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
         VkCommandBuffer commandBuffer,
         const VkConditionalRenderingBeginInfoEXT* pConditionalRenderingBegin);
-    void vkCmdEndConditionalRenderingEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer);
+    void vkCmdEndConditionalRenderingEXT(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkCommandBuffer commandBuffer);
 #endif
 #ifdef VK_NV_clip_space_w_scaling
-    void vkCmdSetViewportWScalingNV(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t firstViewport,
-        uint32_t viewportCount,
-        const VkViewportWScalingNV* pViewportWScalings);
+    void vkCmdSetViewportWScalingNV(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                    uint32_t firstViewport, uint32_t viewportCount,
+                                    const VkViewportWScalingNV* pViewportWScalings);
 #endif
 #ifdef VK_EXT_direct_mode_display
-    void vkReleaseDisplayEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
-        VkDisplayKHR display);
+    void vkReleaseDisplayEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkResult input_result,
+                             VkPhysicalDevice physicalDevice, VkDisplayKHR display);
 #endif
 #ifdef VK_EXT_acquire_xlib_display
-    void vkAcquireXlibDisplayEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
-        Display* dpy,
-        VkDisplayKHR display);
-    void vkGetRandROutputDisplayEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
-        Display* dpy,
-        RROutput rrOutput,
-        VkDisplayKHR* pDisplay);
+    void vkAcquireXlibDisplayEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                 android::base::BumpPool* pool, VkResult input_result,
+                                 VkPhysicalDevice physicalDevice, Display* dpy,
+                                 VkDisplayKHR display);
+    void vkGetRandROutputDisplayEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkResult input_result,
+                                    VkPhysicalDevice physicalDevice, Display* dpy,
+                                    RROutput rrOutput, VkDisplayKHR* pDisplay);
 #endif
 #ifdef VK_EXT_display_surface_counter
     void vkGetPhysicalDeviceSurfaceCapabilities2EXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
-        VkSurfaceKHR surface,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
         VkSurfaceCapabilities2EXT* pSurfaceCapabilities);
 #endif
 #ifdef VK_EXT_display_control
-    void vkDisplayPowerControlEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkDisplayKHR display,
-        const VkDisplayPowerInfoEXT* pDisplayPowerInfo);
-    void vkRegisterDeviceEventEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkDeviceEventInfoEXT* pDeviceEventInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkFence* pFence);
-    void vkRegisterDisplayEventEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkDisplayKHR display,
-        const VkDisplayEventInfoEXT* pDisplayEventInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkFence* pFence);
-    void vkGetSwapchainCounterEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkSwapchainKHR swapchain,
-        VkSurfaceCounterFlagBitsEXT counter,
-        uint64_t* pCounterValue);
+    void vkDisplayPowerControlEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkResult input_result,
+                                  VkDevice device, VkDisplayKHR display,
+                                  const VkDisplayPowerInfoEXT* pDisplayPowerInfo);
+    void vkRegisterDeviceEventEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkResult input_result,
+                                  VkDevice device, const VkDeviceEventInfoEXT* pDeviceEventInfo,
+                                  const VkAllocationCallbacks* pAllocator, VkFence* pFence);
+    void vkRegisterDisplayEventEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                   android::base::BumpPool* pool, VkResult input_result,
+                                   VkDevice device, VkDisplayKHR display,
+                                   const VkDisplayEventInfoEXT* pDisplayEventInfo,
+                                   const VkAllocationCallbacks* pAllocator, VkFence* pFence);
+    void vkGetSwapchainCounterEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkResult input_result,
+                                  VkDevice device, VkSwapchainKHR swapchain,
+                                  VkSurfaceCounterFlagBitsEXT counter, uint64_t* pCounterValue);
 #endif
 #ifdef VK_GOOGLE_display_timing
-    void vkGetRefreshCycleDurationGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkSwapchainKHR swapchain,
-        VkRefreshCycleDurationGOOGLE* pDisplayTimingProperties);
-    void vkGetPastPresentationTimingGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkSwapchainKHR swapchain,
-        uint32_t* pPresentationTimingCount,
-        VkPastPresentationTimingGOOGLE* pPresentationTimings);
+    void vkGetRefreshCycleDurationGOOGLE(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkResult input_result, VkDevice device,
+                                         VkSwapchainKHR swapchain,
+                                         VkRefreshCycleDurationGOOGLE* pDisplayTimingProperties);
+    void vkGetPastPresentationTimingGOOGLE(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkResult input_result, VkDevice device,
+                                           VkSwapchainKHR swapchain,
+                                           uint32_t* pPresentationTimingCount,
+                                           VkPastPresentationTimingGOOGLE* pPresentationTimings);
 #endif
 #ifdef VK_NV_sample_mask_override_coverage
 #endif
@@ -3215,14 +1793,10 @@
 #ifdef VK_NV_viewport_swizzle
 #endif
 #ifdef VK_EXT_discard_rectangles
-    void vkCmdSetDiscardRectangleEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t firstDiscardRectangle,
-        uint32_t discardRectangleCount,
-        const VkRect2D* pDiscardRectangles);
+    void vkCmdSetDiscardRectangleEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                     uint32_t firstDiscardRectangle, uint32_t discardRectangleCount,
+                                     const VkRect2D* pDiscardRectangles);
 #endif
 #ifdef VK_EXT_conservative_rasterization
 #endif
@@ -3231,172 +1805,94 @@
 #ifdef VK_EXT_swapchain_colorspace
 #endif
 #ifdef VK_EXT_hdr_metadata
-    void vkSetHdrMetadataEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        uint32_t swapchainCount,
-        const VkSwapchainKHR* pSwapchains,
-        const VkHdrMetadataEXT* pMetadata);
+    void vkSetHdrMetadataEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkDevice device,
+                             uint32_t swapchainCount, const VkSwapchainKHR* pSwapchains,
+                             const VkHdrMetadataEXT* pMetadata);
 #endif
 #ifdef VK_MVK_ios_surface
-    void vkCreateIOSSurfaceMVK(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkInstance instance,
-        const VkIOSSurfaceCreateInfoMVK* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkSurfaceKHR* pSurface);
+    void vkCreateIOSSurfaceMVK(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, VkResult input_result,
+                               VkInstance instance, const VkIOSSurfaceCreateInfoMVK* pCreateInfo,
+                               const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
 #endif
 #ifdef VK_MVK_macos_surface
-    void vkCreateMacOSSurfaceMVK(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkInstance instance,
-        const VkMacOSSurfaceCreateInfoMVK* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkSurfaceKHR* pSurface);
+    void vkCreateMacOSSurfaceMVK(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                 android::base::BumpPool* pool, VkResult input_result,
+                                 VkInstance instance,
+                                 const VkMacOSSurfaceCreateInfoMVK* pCreateInfo,
+                                 const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
 #endif
 #ifdef VK_MVK_moltenvk
-    void vkGetMTLDeviceMVK(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkPhysicalDevice physicalDevice,
-        void** pMTLDevice);
-    void vkSetMTLTextureMVK(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkImage image,
-        void* mtlTexture);
-    void vkGetMTLTextureMVK(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkImage image,
-        void** pMTLTexture);
-    void vkGetMTLBufferMVK(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkBuffer buffer,
-        void** pMTLBuffer);
-    void vkUseIOSurfaceMVK(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkImage image,
-        void* ioSurface);
-    void vkGetIOSurfaceMVK(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkImage image,
-        void** pIOSurface);
+    void vkGetMTLDeviceMVK(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkPhysicalDevice physicalDevice,
+                           void** pMTLDevice);
+    void vkSetMTLTextureMVK(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkResult input_result, VkImage image,
+                            void* mtlTexture);
+    void vkGetMTLTextureMVK(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkImage image, void** pMTLTexture);
+    void vkGetMTLBufferMVK(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkBuffer buffer, void** pMTLBuffer);
+    void vkUseIOSurfaceMVK(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkResult input_result, VkImage image,
+                           void* ioSurface);
+    void vkGetIOSurfaceMVK(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkImage image, void** pIOSurface);
 #endif
 #ifdef VK_EXT_external_memory_dma_buf
 #endif
 #ifdef VK_EXT_queue_family_foreign
 #endif
 #ifdef VK_EXT_debug_utils
-    void vkSetDebugUtilsObjectNameEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkDebugUtilsObjectNameInfoEXT* pNameInfo);
-    void vkSetDebugUtilsObjectTagEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkDebugUtilsObjectTagInfoEXT* pTagInfo);
-    void vkQueueBeginDebugUtilsLabelEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkQueue queue,
-        const VkDebugUtilsLabelEXT* pLabelInfo);
-    void vkQueueEndDebugUtilsLabelEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkQueue queue);
-    void vkQueueInsertDebugUtilsLabelEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkQueue queue,
-        const VkDebugUtilsLabelEXT* pLabelInfo);
-    void vkCmdBeginDebugUtilsLabelEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        const VkDebugUtilsLabelEXT* pLabelInfo);
-    void vkCmdEndDebugUtilsLabelEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer);
-    void vkCmdInsertDebugUtilsLabelEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        const VkDebugUtilsLabelEXT* pLabelInfo);
-    void vkCreateDebugUtilsMessengerEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkInstance instance,
-        const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkDebugUtilsMessengerEXT* pMessenger);
-    void vkDestroyDebugUtilsMessengerEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkInstance instance,
-        VkDebugUtilsMessengerEXT messenger,
-        const VkAllocationCallbacks* pAllocator);
-    void vkSubmitDebugUtilsMessageEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkInstance instance,
-        VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
-        VkDebugUtilsMessageTypeFlagsEXT messageTypes,
-        const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData);
+    void vkSetDebugUtilsObjectNameEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkResult input_result,
+                                      VkDevice device,
+                                      const VkDebugUtilsObjectNameInfoEXT* pNameInfo);
+    void vkSetDebugUtilsObjectTagEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkResult input_result,
+                                     VkDevice device, const VkDebugUtilsObjectTagInfoEXT* pTagInfo);
+    void vkQueueBeginDebugUtilsLabelEXT(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkQueue queue, const VkDebugUtilsLabelEXT* pLabelInfo);
+    void vkQueueEndDebugUtilsLabelEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkQueue queue);
+    void vkQueueInsertDebugUtilsLabelEXT(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkQueue queue, const VkDebugUtilsLabelEXT* pLabelInfo);
+    void vkCmdBeginDebugUtilsLabelEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                      const VkDebugUtilsLabelEXT* pLabelInfo);
+    void vkCmdEndDebugUtilsLabelEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkCommandBuffer commandBuffer);
+    void vkCmdInsertDebugUtilsLabelEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                       const VkDebugUtilsLabelEXT* pLabelInfo);
+    void vkCreateDebugUtilsMessengerEXT(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkResult input_result, VkInstance instance,
+                                        const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo,
+                                        const VkAllocationCallbacks* pAllocator,
+                                        VkDebugUtilsMessengerEXT* pMessenger);
+    void vkDestroyDebugUtilsMessengerEXT(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkInstance instance, VkDebugUtilsMessengerEXT messenger,
+                                         const VkAllocationCallbacks* pAllocator);
+    void vkSubmitDebugUtilsMessageEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkInstance instance,
+                                      VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
+                                      VkDebugUtilsMessageTypeFlagsEXT messageTypes,
+                                      const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData);
 #endif
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
     void vkGetAndroidHardwareBufferPropertiesANDROID(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const AHardwareBuffer* buffer,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, const AHardwareBuffer* buffer,
         VkAndroidHardwareBufferPropertiesANDROID* pProperties);
     void vkGetMemoryAndroidHardwareBufferANDROID(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo,
-        AHardwareBuffer** pBuffer);
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device,
+        const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo, AHardwareBuffer** pBuffer);
 #endif
 #ifdef VK_EXT_sampler_filter_minmax
 #endif
@@ -3411,18 +1907,12 @@
 #ifdef VK_EXT_shader_stencil_export
 #endif
 #ifdef VK_EXT_sample_locations
-    void vkCmdSetSampleLocationsEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        const VkSampleLocationsInfoEXT* pSampleLocationsInfo);
+    void vkCmdSetSampleLocationsEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                    const VkSampleLocationsInfoEXT* pSampleLocationsInfo);
     void vkGetPhysicalDeviceMultisamplePropertiesEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkPhysicalDevice physicalDevice,
-        VkSampleCountFlagBits samples,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkPhysicalDevice physicalDevice, VkSampleCountFlagBits samples,
         VkMultisamplePropertiesEXT* pMultisampleProperties);
 #endif
 #ifdef VK_EXT_blend_operation_advanced
@@ -3439,211 +1929,126 @@
 #endif
 #ifdef VK_EXT_image_drm_format_modifier
     void vkGetImageDrmFormatModifierPropertiesEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkImage image,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, VkImage image,
         VkImageDrmFormatModifierPropertiesEXT* pProperties);
 #endif
 #ifdef VK_EXT_validation_cache
-    void vkCreateValidationCacheEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkValidationCacheCreateInfoEXT* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkValidationCacheEXT* pValidationCache);
-    void vkDestroyValidationCacheEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkValidationCacheEXT validationCache,
-        const VkAllocationCallbacks* pAllocator);
-    void vkMergeValidationCachesEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkValidationCacheEXT dstCache,
-        uint32_t srcCacheCount,
-        const VkValidationCacheEXT* pSrcCaches);
-    void vkGetValidationCacheDataEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkValidationCacheEXT validationCache,
-        size_t* pDataSize,
-        void* pData);
+    void vkCreateValidationCacheEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkResult input_result,
+                                    VkDevice device,
+                                    const VkValidationCacheCreateInfoEXT* pCreateInfo,
+                                    const VkAllocationCallbacks* pAllocator,
+                                    VkValidationCacheEXT* pValidationCache);
+    void vkDestroyValidationCacheEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkDevice device,
+                                     VkValidationCacheEXT validationCache,
+                                     const VkAllocationCallbacks* pAllocator);
+    void vkMergeValidationCachesEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkResult input_result,
+                                    VkDevice device, VkValidationCacheEXT dstCache,
+                                    uint32_t srcCacheCount, const VkValidationCacheEXT* pSrcCaches);
+    void vkGetValidationCacheDataEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkResult input_result,
+                                     VkDevice device, VkValidationCacheEXT validationCache,
+                                     size_t* pDataSize, void* pData);
 #endif
 #ifdef VK_EXT_descriptor_indexing
 #endif
 #ifdef VK_EXT_shader_viewport_index_layer
 #endif
 #ifdef VK_NV_shading_rate_image
-    void vkCmdBindShadingRateImageNV(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkImageView imageView,
-        VkImageLayout imageLayout);
-    void vkCmdSetViewportShadingRatePaletteNV(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t firstViewport,
-        uint32_t viewportCount,
-        const VkShadingRatePaletteNV* pShadingRatePalettes);
-    void vkCmdSetCoarseSampleOrderNV(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkCoarseSampleOrderTypeNV sampleOrderType,
-        uint32_t customSampleOrderCount,
-        const VkCoarseSampleOrderCustomNV* pCustomSampleOrders);
+    void vkCmdBindShadingRateImageNV(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                     VkImageView imageView, VkImageLayout imageLayout);
+    void vkCmdSetViewportShadingRatePaletteNV(const uint8_t* snapshotTraceBegin,
+                                              size_t snapshotTraceBytes,
+                                              android::base::BumpPool* pool,
+                                              VkCommandBuffer commandBuffer, uint32_t firstViewport,
+                                              uint32_t viewportCount,
+                                              const VkShadingRatePaletteNV* pShadingRatePalettes);
+    void vkCmdSetCoarseSampleOrderNV(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                     VkCoarseSampleOrderTypeNV sampleOrderType,
+                                     uint32_t customSampleOrderCount,
+                                     const VkCoarseSampleOrderCustomNV* pCustomSampleOrders);
 #endif
 #ifdef VK_NV_ray_tracing
-    void vkCreateAccelerationStructureNV(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkAccelerationStructureCreateInfoNV* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkAccelerationStructureNV* pAccelerationStructure);
-    void vkDestroyAccelerationStructureNV(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkAccelerationStructureNV accelerationStructure,
-        const VkAllocationCallbacks* pAllocator);
+    void vkCreateAccelerationStructureNV(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkResult input_result, VkDevice device,
+                                         const VkAccelerationStructureCreateInfoNV* pCreateInfo,
+                                         const VkAllocationCallbacks* pAllocator,
+                                         VkAccelerationStructureNV* pAccelerationStructure);
+    void vkDestroyAccelerationStructureNV(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkDevice device,
+                                          VkAccelerationStructureNV accelerationStructure,
+                                          const VkAllocationCallbacks* pAllocator);
     void vkGetAccelerationStructureMemoryRequirementsNV(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        const VkAccelerationStructureMemoryRequirementsInfoNV* pInfo,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkDevice device, const VkAccelerationStructureMemoryRequirementsInfoNV* pInfo,
         VkMemoryRequirements2KHR* pMemoryRequirements);
     void vkBindAccelerationStructureMemoryNV(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        uint32_t bindInfoCount,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, uint32_t bindInfoCount,
         const VkBindAccelerationStructureMemoryInfoNV* pBindInfos);
-    void vkCmdBuildAccelerationStructureNV(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        const VkAccelerationStructureInfoNV* pInfo,
-        VkBuffer instanceData,
-        VkDeviceSize instanceOffset,
-        VkBool32 update,
-        VkAccelerationStructureNV dst,
-        VkAccelerationStructureNV src,
-        VkBuffer scratch,
-        VkDeviceSize scratchOffset);
-    void vkCmdCopyAccelerationStructureNV(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkAccelerationStructureNV dst,
-        VkAccelerationStructureNV src,
-        VkCopyAccelerationStructureModeKHR mode);
+    void vkCmdBuildAccelerationStructureNV(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkCommandBuffer commandBuffer,
+                                           const VkAccelerationStructureInfoNV* pInfo,
+                                           VkBuffer instanceData, VkDeviceSize instanceOffset,
+                                           VkBool32 update, VkAccelerationStructureNV dst,
+                                           VkAccelerationStructureNV src, VkBuffer scratch,
+                                           VkDeviceSize scratchOffset);
+    void vkCmdCopyAccelerationStructureNV(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkCommandBuffer commandBuffer,
+                                          VkAccelerationStructureNV dst,
+                                          VkAccelerationStructureNV src,
+                                          VkCopyAccelerationStructureModeKHR mode);
     void vkCmdTraceRaysNV(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkBuffer raygenShaderBindingTableBuffer,
-        VkDeviceSize raygenShaderBindingOffset,
-        VkBuffer missShaderBindingTableBuffer,
-        VkDeviceSize missShaderBindingOffset,
-        VkDeviceSize missShaderBindingStride,
-        VkBuffer hitShaderBindingTableBuffer,
-        VkDeviceSize hitShaderBindingOffset,
-        VkDeviceSize hitShaderBindingStride,
-        VkBuffer callableShaderBindingTableBuffer,
-        VkDeviceSize callableShaderBindingOffset,
-        VkDeviceSize callableShaderBindingStride,
-        uint32_t width,
-        uint32_t height,
-        uint32_t depth);
-    void vkCreateRayTracingPipelinesNV(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkPipelineCache pipelineCache,
-        uint32_t createInfoCount,
-        const VkRayTracingPipelineCreateInfoNV* pCreateInfos,
-        const VkAllocationCallbacks* pAllocator,
-        VkPipeline* pPipelines);
-    void vkGetRayTracingShaderGroupHandlesKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkPipeline pipeline,
-        uint32_t firstGroup,
-        uint32_t groupCount,
-        size_t dataSize,
-        void* pData);
-    void vkGetRayTracingShaderGroupHandlesNV(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkPipeline pipeline,
-        uint32_t firstGroup,
-        uint32_t groupCount,
-        size_t dataSize,
-        void* pData);
-    void vkGetAccelerationStructureHandleNV(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkAccelerationStructureNV accelerationStructure,
-        size_t dataSize,
-        void* pData);
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
+        VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
+        VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
+        VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
+        VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
+        VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
+        uint32_t width, uint32_t height, uint32_t depth);
+    void vkCreateRayTracingPipelinesNV(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool, VkResult input_result,
+                                       VkDevice device, VkPipelineCache pipelineCache,
+                                       uint32_t createInfoCount,
+                                       const VkRayTracingPipelineCreateInfoNV* pCreateInfos,
+                                       const VkAllocationCallbacks* pAllocator,
+                                       VkPipeline* pPipelines);
+    void vkGetRayTracingShaderGroupHandlesKHR(const uint8_t* snapshotTraceBegin,
+                                              size_t snapshotTraceBytes,
+                                              android::base::BumpPool* pool, VkResult input_result,
+                                              VkDevice device, VkPipeline pipeline,
+                                              uint32_t firstGroup, uint32_t groupCount,
+                                              size_t dataSize, void* pData);
+    void vkGetRayTracingShaderGroupHandlesNV(const uint8_t* snapshotTraceBegin,
+                                             size_t snapshotTraceBytes,
+                                             android::base::BumpPool* pool, VkResult input_result,
+                                             VkDevice device, VkPipeline pipeline,
+                                             uint32_t firstGroup, uint32_t groupCount,
+                                             size_t dataSize, void* pData);
+    void vkGetAccelerationStructureHandleNV(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool, VkResult input_result,
+                                            VkDevice device,
+                                            VkAccelerationStructureNV accelerationStructure,
+                                            size_t dataSize, void* pData);
     void vkCmdWriteAccelerationStructuresPropertiesNV(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t accelerationStructureCount,
-        const VkAccelerationStructureNV* pAccelerationStructures,
-        VkQueryType queryType,
-        VkQueryPool queryPool,
-        uint32_t firstQuery);
-    void vkCompileDeferredNV(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkPipeline pipeline,
-        uint32_t shader);
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkCommandBuffer commandBuffer, uint32_t accelerationStructureCount,
+        const VkAccelerationStructureNV* pAccelerationStructures, VkQueryType queryType,
+        VkQueryPool queryPool, uint32_t firstQuery);
+    void vkCompileDeferredNV(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                             VkPipeline pipeline, uint32_t shader);
 #endif
 #ifdef VK_NV_representative_fragment_test
 #endif
@@ -3655,47 +2060,28 @@
 #endif
 #ifdef VK_EXT_external_memory_host
     void vkGetMemoryHostPointerPropertiesEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkExternalMemoryHandleTypeFlagBits handleType,
-        const void* pHostPointer,
-        VkMemoryHostPointerPropertiesEXT* pMemoryHostPointerProperties);
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType,
+        const void* pHostPointer, VkMemoryHostPointerPropertiesEXT* pMemoryHostPointerProperties);
 #endif
 #ifdef VK_AMD_buffer_marker
-    void vkCmdWriteBufferMarkerAMD(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkPipelineStageFlagBits pipelineStage,
-        VkBuffer dstBuffer,
-        VkDeviceSize dstOffset,
-        uint32_t marker);
+    void vkCmdWriteBufferMarkerAMD(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                   android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                   VkPipelineStageFlagBits pipelineStage, VkBuffer dstBuffer,
+                                   VkDeviceSize dstOffset, uint32_t marker);
 #endif
 #ifdef VK_AMD_pipeline_compiler_control
 #endif
 #ifdef VK_EXT_calibrated_timestamps
     void vkGetPhysicalDeviceCalibrateableTimeDomainsEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
-        uint32_t* pTimeDomainCount,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice, uint32_t* pTimeDomainCount,
         VkTimeDomainEXT* pTimeDomains);
-    void vkGetCalibratedTimestampsEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        uint32_t timestampCount,
-        const VkCalibratedTimestampInfoEXT* pTimestampInfos,
-        uint64_t* pTimestamps,
-        uint64_t* pMaxDeviation);
+    void vkGetCalibratedTimestampsEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkResult input_result,
+                                      VkDevice device, uint32_t timestampCount,
+                                      const VkCalibratedTimestampInfoEXT* pTimestampInfos,
+                                      uint64_t* pTimestamps, uint64_t* pMaxDeviation);
 #endif
 #ifdef VK_AMD_shader_core_properties
 #endif
@@ -3714,162 +2100,103 @@
 #ifdef VK_NV_compute_shader_derivatives
 #endif
 #ifdef VK_NV_mesh_shader
-    void vkCmdDrawMeshTasksNV(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t taskCount,
-        uint32_t firstTask);
-    void vkCmdDrawMeshTasksIndirectNV(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkBuffer buffer,
-        VkDeviceSize offset,
-        uint32_t drawCount,
-        uint32_t stride);
-    void vkCmdDrawMeshTasksIndirectCountNV(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkBuffer buffer,
-        VkDeviceSize offset,
-        VkBuffer countBuffer,
-        VkDeviceSize countBufferOffset,
-        uint32_t maxDrawCount,
-        uint32_t stride);
+    void vkCmdDrawMeshTasksNV(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                              uint32_t taskCount, uint32_t firstTask);
+    void vkCmdDrawMeshTasksIndirectNV(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                      VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
+                                      uint32_t stride);
+    void vkCmdDrawMeshTasksIndirectCountNV(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkCommandBuffer commandBuffer, VkBuffer buffer,
+                                           VkDeviceSize offset, VkBuffer countBuffer,
+                                           VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+                                           uint32_t stride);
 #endif
 #ifdef VK_NV_fragment_shader_barycentric
 #endif
 #ifdef VK_NV_shader_image_footprint
 #endif
 #ifdef VK_NV_scissor_exclusive
-    void vkCmdSetExclusiveScissorNV(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t firstExclusiveScissor,
-        uint32_t exclusiveScissorCount,
-        const VkRect2D* pExclusiveScissors);
+    void vkCmdSetExclusiveScissorNV(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                    uint32_t firstExclusiveScissor, uint32_t exclusiveScissorCount,
+                                    const VkRect2D* pExclusiveScissors);
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
-    void vkCmdSetCheckpointNV(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        const void* pCheckpointMarker);
-    void vkGetQueueCheckpointDataNV(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkQueue queue,
-        uint32_t* pCheckpointDataCount,
-        VkCheckpointDataNV* pCheckpointData);
+    void vkCmdSetCheckpointNV(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                              const void* pCheckpointMarker);
+    void vkGetQueueCheckpointDataNV(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkQueue queue,
+                                    uint32_t* pCheckpointDataCount,
+                                    VkCheckpointDataNV* pCheckpointData);
 #endif
 #ifdef VK_INTEL_shader_integer_functions2
 #endif
 #ifdef VK_INTEL_performance_query
     void vkInitializePerformanceApiINTEL(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device,
         const VkInitializePerformanceApiInfoINTEL* pInitializeInfo);
-    void vkUninitializePerformanceApiINTEL(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device);
-    void vkCmdSetPerformanceMarkerINTEL(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkCommandBuffer commandBuffer,
-        const VkPerformanceMarkerInfoINTEL* pMarkerInfo);
+    void vkUninitializePerformanceApiINTEL(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkDevice device);
+    void vkCmdSetPerformanceMarkerINTEL(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkResult input_result, VkCommandBuffer commandBuffer,
+                                        const VkPerformanceMarkerInfoINTEL* pMarkerInfo);
     void vkCmdSetPerformanceStreamMarkerINTEL(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkCommandBuffer commandBuffer,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkCommandBuffer commandBuffer,
         const VkPerformanceStreamMarkerInfoINTEL* pMarkerInfo);
-    void vkCmdSetPerformanceOverrideINTEL(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkCommandBuffer commandBuffer,
-        const VkPerformanceOverrideInfoINTEL* pOverrideInfo);
+    void vkCmdSetPerformanceOverrideINTEL(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkResult input_result, VkCommandBuffer commandBuffer,
+                                          const VkPerformanceOverrideInfoINTEL* pOverrideInfo);
     void vkAcquirePerformanceConfigurationINTEL(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device,
         const VkPerformanceConfigurationAcquireInfoINTEL* pAcquireInfo,
         VkPerformanceConfigurationINTEL* pConfiguration);
-    void vkReleasePerformanceConfigurationINTEL(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkPerformanceConfigurationINTEL configuration);
-    void vkQueueSetPerformanceConfigurationINTEL(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkQueue queue,
-        VkPerformanceConfigurationINTEL configuration);
-    void vkGetPerformanceParameterINTEL(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkPerformanceParameterTypeINTEL parameter,
-        VkPerformanceValueINTEL* pValue);
+    void vkReleasePerformanceConfigurationINTEL(const uint8_t* snapshotTraceBegin,
+                                                size_t snapshotTraceBytes,
+                                                android::base::BumpPool* pool,
+                                                VkResult input_result, VkDevice device,
+                                                VkPerformanceConfigurationINTEL configuration);
+    void vkQueueSetPerformanceConfigurationINTEL(const uint8_t* snapshotTraceBegin,
+                                                 size_t snapshotTraceBytes,
+                                                 android::base::BumpPool* pool,
+                                                 VkResult input_result, VkQueue queue,
+                                                 VkPerformanceConfigurationINTEL configuration);
+    void vkGetPerformanceParameterINTEL(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkResult input_result, VkDevice device,
+                                        VkPerformanceParameterTypeINTEL parameter,
+                                        VkPerformanceValueINTEL* pValue);
 #endif
 #ifdef VK_EXT_pci_bus_info
 #endif
 #ifdef VK_AMD_display_native_hdr
-    void vkSetLocalDimmingAMD(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkSwapchainKHR swapChain,
-        VkBool32 localDimmingEnable);
+    void vkSetLocalDimmingAMD(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkDevice device,
+                              VkSwapchainKHR swapChain, VkBool32 localDimmingEnable);
 #endif
 #ifdef VK_FUCHSIA_imagepipe_surface
-    void vkCreateImagePipeSurfaceFUCHSIA(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkInstance instance,
-        const VkImagePipeSurfaceCreateInfoFUCHSIA* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkSurfaceKHR* pSurface);
+    void vkCreateImagePipeSurfaceFUCHSIA(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkResult input_result, VkInstance instance,
+                                         const VkImagePipeSurfaceCreateInfoFUCHSIA* pCreateInfo,
+                                         const VkAllocationCallbacks* pAllocator,
+                                         VkSurfaceKHR* pSurface);
 #endif
 #ifdef VK_EXT_metal_surface
-    void vkCreateMetalSurfaceEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkInstance instance,
-        const VkMetalSurfaceCreateInfoEXT* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkSurfaceKHR* pSurface);
+    void vkCreateMetalSurfaceEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                 android::base::BumpPool* pool, VkResult input_result,
+                                 VkInstance instance,
+                                 const VkMetalSurfaceCreateInfoEXT* pCreateInfo,
+                                 const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
 #endif
 #ifdef VK_EXT_fragment_density_map
 #endif
@@ -3894,23 +2221,16 @@
 #ifdef VK_NV_dedicated_allocation_image_aliasing
 #endif
 #ifdef VK_EXT_buffer_device_address
-    void vkGetBufferDeviceAddressEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDeviceAddress input_result,
-        VkDevice device,
-        const VkBufferDeviceAddressInfo* pInfo);
+    void vkGetBufferDeviceAddressEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkDeviceAddress input_result,
+                                     VkDevice device, const VkBufferDeviceAddressInfo* pInfo);
 #endif
 #ifdef VK_EXT_tooling_info
-    void vkGetPhysicalDeviceToolPropertiesEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
-        uint32_t* pToolCount,
-        VkPhysicalDeviceToolPropertiesEXT* pToolProperties);
+    void vkGetPhysicalDeviceToolPropertiesEXT(const uint8_t* snapshotTraceBegin,
+                                              size_t snapshotTraceBytes,
+                                              android::base::BumpPool* pool, VkResult input_result,
+                                              VkPhysicalDevice physicalDevice, uint32_t* pToolCount,
+                                              VkPhysicalDeviceToolPropertiesEXT* pToolProperties);
 #endif
 #ifdef VK_EXT_separate_stencil_usage
 #endif
@@ -3918,22 +2238,14 @@
 #endif
 #ifdef VK_NV_cooperative_matrix
     void vkGetPhysicalDeviceCooperativeMatrixPropertiesNV(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
-        uint32_t* pPropertyCount,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount,
         VkCooperativeMatrixPropertiesNV* pProperties);
 #endif
 #ifdef VK_NV_coverage_reduction_mode
     void vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
-        uint32_t* pCombinationCount,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice, uint32_t* pCombinationCount,
         VkFramebufferMixedSamplesCombinationNV* pCombinations);
 #endif
 #ifdef VK_EXT_fragment_shader_interlock
@@ -3944,155 +2256,86 @@
 #endif
 #ifdef VK_EXT_full_screen_exclusive
     void vkGetPhysicalDeviceSurfacePresentModes2EXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
-        const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo,
-        uint32_t* pPresentModeCount,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkPhysicalDevice physicalDevice,
+        const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, uint32_t* pPresentModeCount,
         VkPresentModeKHR* pPresentModes);
-    void vkAcquireFullScreenExclusiveModeEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkSwapchainKHR swapchain);
-    void vkReleaseFullScreenExclusiveModeEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkSwapchainKHR swapchain);
+    void vkAcquireFullScreenExclusiveModeEXT(const uint8_t* snapshotTraceBegin,
+                                             size_t snapshotTraceBytes,
+                                             android::base::BumpPool* pool, VkResult input_result,
+                                             VkDevice device, VkSwapchainKHR swapchain);
+    void vkReleaseFullScreenExclusiveModeEXT(const uint8_t* snapshotTraceBegin,
+                                             size_t snapshotTraceBytes,
+                                             android::base::BumpPool* pool, VkResult input_result,
+                                             VkDevice device, VkSwapchainKHR swapchain);
     void vkGetDeviceGroupSurfacePresentModes2EXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo,
         VkDeviceGroupPresentModeFlagsKHR* pModes);
 #endif
 #ifdef VK_EXT_headless_surface
-    void vkCreateHeadlessSurfaceEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkInstance instance,
-        const VkHeadlessSurfaceCreateInfoEXT* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkSurfaceKHR* pSurface);
+    void vkCreateHeadlessSurfaceEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkResult input_result,
+                                    VkInstance instance,
+                                    const VkHeadlessSurfaceCreateInfoEXT* pCreateInfo,
+                                    const VkAllocationCallbacks* pAllocator,
+                                    VkSurfaceKHR* pSurface);
 #endif
 #ifdef VK_EXT_line_rasterization
-    void vkCmdSetLineStippleEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t lineStippleFactor,
-        uint16_t lineStipplePattern);
+    void vkCmdSetLineStippleEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                uint32_t lineStippleFactor, uint16_t lineStipplePattern);
 #endif
 #ifdef VK_EXT_shader_atomic_float
 #endif
 #ifdef VK_EXT_host_query_reset
-    void vkResetQueryPoolEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkQueryPool queryPool,
-        uint32_t firstQuery,
-        uint32_t queryCount);
+    void vkResetQueryPoolEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkDevice device, VkQueryPool queryPool,
+                             uint32_t firstQuery, uint32_t queryCount);
 #endif
 #ifdef VK_EXT_index_type_uint8
 #endif
 #ifdef VK_EXT_extended_dynamic_state
-    void vkCmdSetCullModeEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkCullModeFlags cullMode);
-    void vkCmdSetFrontFaceEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkFrontFace frontFace);
-    void vkCmdSetPrimitiveTopologyEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkPrimitiveTopology primitiveTopology);
-    void vkCmdSetViewportWithCountEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t viewportCount,
-        const VkViewport* pViewports);
-    void vkCmdSetScissorWithCountEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t scissorCount,
-        const VkRect2D* pScissors);
-    void vkCmdBindVertexBuffers2EXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t firstBinding,
-        uint32_t bindingCount,
-        const VkBuffer* pBuffers,
-        const VkDeviceSize* pOffsets,
-        const VkDeviceSize* pSizes,
-        const VkDeviceSize* pStrides);
-    void vkCmdSetDepthTestEnableEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkBool32 depthTestEnable);
-    void vkCmdSetDepthWriteEnableEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkBool32 depthWriteEnable);
-    void vkCmdSetDepthCompareOpEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkCompareOp depthCompareOp);
-    void vkCmdSetDepthBoundsTestEnableEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkBool32 depthBoundsTestEnable);
-    void vkCmdSetStencilTestEnableEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkBool32 stencilTestEnable);
-    void vkCmdSetStencilOpEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkStencilFaceFlags faceMask,
-        VkStencilOp failOp,
-        VkStencilOp passOp,
-        VkStencilOp depthFailOp,
-        VkCompareOp compareOp);
+    void vkCmdSetCullModeEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                             VkCullModeFlags cullMode);
+    void vkCmdSetFrontFaceEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                              VkFrontFace frontFace);
+    void vkCmdSetPrimitiveTopologyEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                      VkPrimitiveTopology primitiveTopology);
+    void vkCmdSetViewportWithCountEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                      uint32_t viewportCount, const VkViewport* pViewports);
+    void vkCmdSetScissorWithCountEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                     uint32_t scissorCount, const VkRect2D* pScissors);
+    void vkCmdBindVertexBuffers2EXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                    uint32_t firstBinding, uint32_t bindingCount,
+                                    const VkBuffer* pBuffers, const VkDeviceSize* pOffsets,
+                                    const VkDeviceSize* pSizes, const VkDeviceSize* pStrides);
+    void vkCmdSetDepthTestEnableEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                    VkBool32 depthTestEnable);
+    void vkCmdSetDepthWriteEnableEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                     VkBool32 depthWriteEnable);
+    void vkCmdSetDepthCompareOpEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                   android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                   VkCompareOp depthCompareOp);
+    void vkCmdSetDepthBoundsTestEnableEXT(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkCommandBuffer commandBuffer,
+                                          VkBool32 depthBoundsTestEnable);
+    void vkCmdSetStencilTestEnableEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                      VkBool32 stencilTestEnable);
+    void vkCmdSetStencilOpEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                              android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                              VkStencilFaceFlags faceMask, VkStencilOp failOp, VkStencilOp passOp,
+                              VkStencilOp depthFailOp, VkCompareOp compareOp);
 #endif
 #ifdef VK_EXT_shader_atomic_float2
 #endif
@@ -4100,49 +2343,32 @@
 #endif
 #ifdef VK_NV_device_generated_commands
     void vkGetGeneratedCommandsMemoryRequirementsNV(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        const VkGeneratedCommandsMemoryRequirementsInfoNV* pInfo,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkDevice device, const VkGeneratedCommandsMemoryRequirementsInfoNV* pInfo,
         VkMemoryRequirements2* pMemoryRequirements);
     void vkCmdPreprocessGeneratedCommandsNV(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        const VkGeneratedCommandsInfoNV* pGeneratedCommandsInfo);
-    void vkCmdExecuteGeneratedCommandsNV(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkBool32 isPreprocessed,
-        const VkGeneratedCommandsInfoNV* pGeneratedCommandsInfo);
-    void vkCmdBindPipelineShaderGroupNV(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkPipelineBindPoint pipelineBindPoint,
-        VkPipeline pipeline,
-        uint32_t groupIndex);
-    void vkCreateIndirectCommandsLayoutNV(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkIndirectCommandsLayoutCreateInfoNV* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkIndirectCommandsLayoutNV* pIndirectCommandsLayout);
-    void vkDestroyIndirectCommandsLayoutNV(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkIndirectCommandsLayoutNV indirectCommandsLayout,
-        const VkAllocationCallbacks* pAllocator);
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkCommandBuffer commandBuffer, const VkGeneratedCommandsInfoNV* pGeneratedCommandsInfo);
+    void vkCmdExecuteGeneratedCommandsNV(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkCommandBuffer commandBuffer, VkBool32 isPreprocessed,
+                                         const VkGeneratedCommandsInfoNV* pGeneratedCommandsInfo);
+    void vkCmdBindPipelineShaderGroupNV(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkCommandBuffer commandBuffer,
+                                        VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline,
+                                        uint32_t groupIndex);
+    void vkCreateIndirectCommandsLayoutNV(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkResult input_result, VkDevice device,
+                                          const VkIndirectCommandsLayoutCreateInfoNV* pCreateInfo,
+                                          const VkAllocationCallbacks* pAllocator,
+                                          VkIndirectCommandsLayoutNV* pIndirectCommandsLayout);
+    void vkDestroyIndirectCommandsLayoutNV(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkDevice device,
+                                           VkIndirectCommandsLayoutNV indirectCommandsLayout,
+                                           const VkAllocationCallbacks* pAllocator);
 #endif
 #ifdef VK_NV_inherited_viewport_scissor
 #endif
@@ -4153,23 +2379,14 @@
 #ifdef VK_EXT_device_memory_report
 #endif
 #ifdef VK_EXT_acquire_drm_display
-    void vkAcquireDrmDisplayEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
-        int32_t drmFd,
-        VkDisplayKHR display);
-    void vkGetDrmDisplayEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
-        int32_t drmFd,
-        uint32_t connectorId,
-        VkDisplayKHR* display);
+    void vkAcquireDrmDisplayEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkResult input_result,
+                                VkPhysicalDevice physicalDevice, int32_t drmFd,
+                                VkDisplayKHR display);
+    void vkGetDrmDisplayEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkResult input_result,
+                            VkPhysicalDevice physicalDevice, int32_t drmFd, uint32_t connectorId,
+                            VkDisplayKHR* display);
 #endif
 #ifdef VK_EXT_robustness2
 #endif
@@ -4178,41 +2395,24 @@
 #ifdef VK_GOOGLE_user_type
 #endif
 #ifdef VK_EXT_private_data
-    void vkCreatePrivateDataSlotEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkPrivateDataSlotCreateInfoEXT* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkPrivateDataSlotEXT* pPrivateDataSlot);
-    void vkDestroyPrivateDataSlotEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkPrivateDataSlotEXT privateDataSlot,
-        const VkAllocationCallbacks* pAllocator);
-    void vkSetPrivateDataEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkObjectType objectType,
-        uint64_t objectHandle,
-        VkPrivateDataSlotEXT privateDataSlot,
-        uint64_t data);
-    void vkGetPrivateDataEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkObjectType objectType,
-        uint64_t objectHandle,
-        VkPrivateDataSlotEXT privateDataSlot,
-        uint64_t* pData);
+    void vkCreatePrivateDataSlotEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkResult input_result,
+                                    VkDevice device,
+                                    const VkPrivateDataSlotCreateInfoEXT* pCreateInfo,
+                                    const VkAllocationCallbacks* pAllocator,
+                                    VkPrivateDataSlotEXT* pPrivateDataSlot);
+    void vkDestroyPrivateDataSlotEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkDevice device,
+                                     VkPrivateDataSlotEXT privateDataSlot,
+                                     const VkAllocationCallbacks* pAllocator);
+    void vkSetPrivateDataEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkResult input_result, VkDevice device,
+                             VkObjectType objectType, uint64_t objectHandle,
+                             VkPrivateDataSlotEXT privateDataSlot, uint64_t data);
+    void vkGetPrivateDataEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkDevice device,
+                             VkObjectType objectType, uint64_t objectHandle,
+                             VkPrivateDataSlotEXT privateDataSlot, uint64_t* pData);
 #endif
 #ifdef VK_EXT_pipeline_creation_cache_control
 #endif
@@ -4221,13 +2421,11 @@
 #ifdef VK_QCOM_render_pass_store_ops
 #endif
 #ifdef VK_NV_fragment_shading_rate_enums
-    void vkCmdSetFragmentShadingRateEnumNV(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkFragmentShadingRateNV shadingRate,
-        const VkFragmentShadingRateCombinerOpKHR combinerOps[2]);
+    void vkCmdSetFragmentShadingRateEnumNV(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkCommandBuffer commandBuffer,
+                                           VkFragmentShadingRateNV shadingRate,
+                                           const VkFragmentShadingRateCombinerOpKHR combinerOps[2]);
 #endif
 #ifdef VK_NV_ray_tracing_motion_blur
 #endif
@@ -4244,50 +2442,32 @@
 #ifdef VK_EXT_rgba10x6_formats
 #endif
 #ifdef VK_NV_acquire_winrt_display
-    void vkAcquireWinrtDisplayNV(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
-        VkDisplayKHR display);
-    void vkGetWinrtDisplayNV(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkPhysicalDevice physicalDevice,
-        uint32_t deviceRelativeId,
-        VkDisplayKHR* pDisplay);
+    void vkAcquireWinrtDisplayNV(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                 android::base::BumpPool* pool, VkResult input_result,
+                                 VkPhysicalDevice physicalDevice, VkDisplayKHR display);
+    void vkGetWinrtDisplayNV(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                             android::base::BumpPool* pool, VkResult input_result,
+                             VkPhysicalDevice physicalDevice, uint32_t deviceRelativeId,
+                             VkDisplayKHR* pDisplay);
 #endif
 #ifdef VK_EXT_directfb_surface
-    void vkCreateDirectFBSurfaceEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkInstance instance,
-        const VkDirectFBSurfaceCreateInfoEXT* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkSurfaceKHR* pSurface);
+    void vkCreateDirectFBSurfaceEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkResult input_result,
+                                    VkInstance instance,
+                                    const VkDirectFBSurfaceCreateInfoEXT* pCreateInfo,
+                                    const VkAllocationCallbacks* pAllocator,
+                                    VkSurfaceKHR* pSurface);
     void vkGetPhysicalDeviceDirectFBPresentationSupportEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkBool32 input_result,
-        VkPhysicalDevice physicalDevice,
-        uint32_t queueFamilyIndex,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkBool32 input_result, VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
         IDirectFB* dfb);
 #endif
 #ifdef VK_VALVE_mutable_descriptor_type
 #endif
 #ifdef VK_EXT_vertex_input_dynamic_state
     void vkCmdSetVertexInputEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t vertexBindingDescriptionCount,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkCommandBuffer commandBuffer, uint32_t vertexBindingDescriptionCount,
         const VkVertexInputBindingDescription2EXT* pVertexBindingDescriptions,
         uint32_t vertexAttributeDescriptionCount,
         const VkVertexInputAttributeDescription2EXT* pVertexAttributeDescriptions);
@@ -4298,603 +2478,351 @@
 #endif
 #ifdef VK_FUCHSIA_external_memory
     void vkGetMemoryZirconHandleFUCHSIA(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkMemoryGetZirconHandleInfoFUCHSIA* pGetZirconHandleInfo,
-        zx_handle_t* pZirconHandle);
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device,
+        const VkMemoryGetZirconHandleInfoFUCHSIA* pGetZirconHandleInfo, zx_handle_t* pZirconHandle);
     void vkGetMemoryZirconHandlePropertiesFUCHSIA(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkExternalMemoryHandleTypeFlagBits handleType,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType,
         zx_handle_t zirconHandle,
         VkMemoryZirconHandlePropertiesFUCHSIA* pMemoryZirconHandleProperties);
 #endif
 #ifdef VK_FUCHSIA_external_semaphore
     void vkImportSemaphoreZirconHandleFUCHSIA(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device,
         const VkImportSemaphoreZirconHandleInfoFUCHSIA* pImportSemaphoreZirconHandleInfo);
     void vkGetSemaphoreZirconHandleFUCHSIA(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device,
         const VkSemaphoreGetZirconHandleInfoFUCHSIA* pGetZirconHandleInfo,
         zx_handle_t* pZirconHandle);
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
-    void vkCreateBufferCollectionFUCHSIA(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkBufferCollectionCreateInfoFUCHSIA* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkBufferCollectionFUCHSIA* pCollection);
+    void vkCreateBufferCollectionFUCHSIA(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkResult input_result, VkDevice device,
+                                         const VkBufferCollectionCreateInfoFUCHSIA* pCreateInfo,
+                                         const VkAllocationCallbacks* pAllocator,
+                                         VkBufferCollectionFUCHSIA* pCollection);
     void vkSetBufferCollectionImageConstraintsFUCHSIA(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkBufferCollectionFUCHSIA collection,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, VkBufferCollectionFUCHSIA collection,
         const VkImageConstraintsInfoFUCHSIA* pImageConstraintsInfo);
     void vkSetBufferCollectionBufferConstraintsFUCHSIA(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkBufferCollectionFUCHSIA collection,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, VkBufferCollectionFUCHSIA collection,
         const VkBufferConstraintsInfoFUCHSIA* pBufferConstraintsInfo);
-    void vkDestroyBufferCollectionFUCHSIA(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkBufferCollectionFUCHSIA collection,
-        const VkAllocationCallbacks* pAllocator);
-    void vkGetBufferCollectionPropertiesFUCHSIA(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkBufferCollectionFUCHSIA collection,
-        VkBufferCollectionPropertiesFUCHSIA* pProperties);
+    void vkDestroyBufferCollectionFUCHSIA(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkDevice device, VkBufferCollectionFUCHSIA collection,
+                                          const VkAllocationCallbacks* pAllocator);
+    void vkGetBufferCollectionPropertiesFUCHSIA(const uint8_t* snapshotTraceBegin,
+                                                size_t snapshotTraceBytes,
+                                                android::base::BumpPool* pool,
+                                                VkResult input_result, VkDevice device,
+                                                VkBufferCollectionFUCHSIA collection,
+                                                VkBufferCollectionPropertiesFUCHSIA* pProperties);
 #endif
 #ifdef VK_HUAWEI_subpass_shading
-    void vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkRenderPass renderpass,
-        VkExtent2D* pMaxWorkgroupSize);
-    void vkCmdSubpassShadingHUAWEI(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer);
+    void vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI(const uint8_t* snapshotTraceBegin,
+                                                         size_t snapshotTraceBytes,
+                                                         android::base::BumpPool* pool,
+                                                         VkResult input_result, VkDevice device,
+                                                         VkRenderPass renderpass,
+                                                         VkExtent2D* pMaxWorkgroupSize);
+    void vkCmdSubpassShadingHUAWEI(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                   android::base::BumpPool* pool, VkCommandBuffer commandBuffer);
 #endif
 #ifdef VK_HUAWEI_invocation_mask
-    void vkCmdBindInvocationMaskHUAWEI(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkImageView imageView,
-        VkImageLayout imageLayout);
+    void vkCmdBindInvocationMaskHUAWEI(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                       VkImageView imageView, VkImageLayout imageLayout);
 #endif
 #ifdef VK_NV_external_memory_rdma
     void vkGetMemoryRemoteAddressNV(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device,
         const VkMemoryGetRemoteAddressInfoNV* pMemoryGetRemoteAddressInfo,
         VkRemoteAddressNV* pAddress);
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
-    void vkCmdSetPatchControlPointsEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t patchControlPoints);
-    void vkCmdSetRasterizerDiscardEnableEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkBool32 rasterizerDiscardEnable);
-    void vkCmdSetDepthBiasEnableEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkBool32 depthBiasEnable);
-    void vkCmdSetLogicOpEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkLogicOp logicOp);
-    void vkCmdSetPrimitiveRestartEnableEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkBool32 primitiveRestartEnable);
+    void vkCmdSetPatchControlPointsEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                       uint32_t patchControlPoints);
+    void vkCmdSetRasterizerDiscardEnableEXT(const uint8_t* snapshotTraceBegin,
+                                            size_t snapshotTraceBytes,
+                                            android::base::BumpPool* pool,
+                                            VkCommandBuffer commandBuffer,
+                                            VkBool32 rasterizerDiscardEnable);
+    void vkCmdSetDepthBiasEnableEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                    VkBool32 depthBiasEnable);
+    void vkCmdSetLogicOpEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                            android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                            VkLogicOp logicOp);
+    void vkCmdSetPrimitiveRestartEnableEXT(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkCommandBuffer commandBuffer,
+                                           VkBool32 primitiveRestartEnable);
 #endif
 #ifdef VK_QNX_screen_surface
-    void vkCreateScreenSurfaceQNX(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkInstance instance,
-        const VkScreenSurfaceCreateInfoQNX* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkSurfaceKHR* pSurface);
+    void vkCreateScreenSurfaceQNX(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkResult input_result,
+                                  VkInstance instance,
+                                  const VkScreenSurfaceCreateInfoQNX* pCreateInfo,
+                                  const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
     void vkGetPhysicalDeviceScreenPresentationSupportQNX(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkBool32 input_result,
-        VkPhysicalDevice physicalDevice,
-        uint32_t queueFamilyIndex,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkBool32 input_result, VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
         _screen_window* window);
 #endif
 #ifdef VK_EXT_color_write_enable
-    void vkCmdSetColorWriteEnableEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t attachmentCount,
-        const VkBool32* pColorWriteEnables);
+    void vkCmdSetColorWriteEnableEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                     android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                     uint32_t attachmentCount, const VkBool32* pColorWriteEnables);
 #endif
 #ifdef VK_GOOGLE_gfxstream
-    void vkRegisterImageColorBufferGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkImage image,
-        uint32_t colorBuffer);
-    void vkRegisterBufferColorBufferGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkBuffer buffer,
-        uint32_t colorBuffer);
-    void vkMapMemoryIntoAddressSpaceGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkDeviceMemory memory,
-        uint64_t* pAddress);
+    void vkRegisterImageColorBufferGOOGLE(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkResult input_result, VkDevice device, VkImage image,
+                                          uint32_t colorBuffer);
+    void vkRegisterBufferColorBufferGOOGLE(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkResult input_result, VkDevice device, VkBuffer buffer,
+                                           uint32_t colorBuffer);
+    void vkMapMemoryIntoAddressSpaceGOOGLE(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkResult input_result, VkDevice device,
+                                           VkDeviceMemory memory, uint64_t* pAddress);
     void vkUpdateDescriptorSetWithTemplateSizedGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkDescriptorSet descriptorSet,
-        VkDescriptorUpdateTemplate descriptorUpdateTemplate,
-        uint32_t imageInfoCount,
-        uint32_t bufferInfoCount,
-        uint32_t bufferViewCount,
-        const uint32_t* pImageInfoEntryIndices,
-        const uint32_t* pBufferInfoEntryIndices,
-        const uint32_t* pBufferViewEntryIndices,
-        const VkDescriptorImageInfo* pImageInfos,
-        const VkDescriptorBufferInfo* pBufferInfos,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkDevice device, VkDescriptorSet descriptorSet,
+        VkDescriptorUpdateTemplate descriptorUpdateTemplate, uint32_t imageInfoCount,
+        uint32_t bufferInfoCount, uint32_t bufferViewCount, const uint32_t* pImageInfoEntryIndices,
+        const uint32_t* pBufferInfoEntryIndices, const uint32_t* pBufferViewEntryIndices,
+        const VkDescriptorImageInfo* pImageInfos, const VkDescriptorBufferInfo* pBufferInfos,
         const VkBufferView* pBufferViews);
-    void vkBeginCommandBufferAsyncGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        const VkCommandBufferBeginInfo* pBeginInfo);
-    void vkEndCommandBufferAsyncGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer);
-    void vkResetCommandBufferAsyncGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        VkCommandBufferResetFlags flags);
-    void vkCommandBufferHostSyncGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t needHostSync,
-        uint32_t sequenceNumber);
-    void vkCreateImageWithRequirementsGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkImageCreateInfo* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkImage* pImage,
-        VkMemoryRequirements* pMemoryRequirements);
+    void vkBeginCommandBufferAsyncGOOGLE(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkCommandBuffer commandBuffer,
+                                         const VkCommandBufferBeginInfo* pBeginInfo);
+    void vkEndCommandBufferAsyncGOOGLE(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool,
+                                       VkCommandBuffer commandBuffer);
+    void vkResetCommandBufferAsyncGOOGLE(const uint8_t* snapshotTraceBegin,
+                                         size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                         VkCommandBuffer commandBuffer,
+                                         VkCommandBufferResetFlags flags);
+    void vkCommandBufferHostSyncGOOGLE(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                       uint32_t needHostSync, uint32_t sequenceNumber);
+    void vkCreateImageWithRequirementsGOOGLE(const uint8_t* snapshotTraceBegin,
+                                             size_t snapshotTraceBytes,
+                                             android::base::BumpPool* pool, VkResult input_result,
+                                             VkDevice device, const VkImageCreateInfo* pCreateInfo,
+                                             const VkAllocationCallbacks* pAllocator,
+                                             VkImage* pImage,
+                                             VkMemoryRequirements* pMemoryRequirements);
     void vkCreateBufferWithRequirementsGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkBufferCreateInfo* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkBuffer* pBuffer,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, const VkBufferCreateInfo* pCreateInfo,
+        const VkAllocationCallbacks* pAllocator, VkBuffer* pBuffer,
         VkMemoryRequirements* pMemoryRequirements);
-    void vkGetMemoryHostAddressInfoGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkDeviceMemory memory,
-        uint64_t* pAddress,
-        uint64_t* pSize,
-        uint64_t* pHostmemId);
-    void vkFreeMemorySyncGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkDeviceMemory memory,
-        const VkAllocationCallbacks* pAllocator);
-    void vkQueueHostSyncGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkQueue queue,
-        uint32_t needHostSync,
-        uint32_t sequenceNumber);
-    void vkQueueSubmitAsyncGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkQueue queue,
-        uint32_t submitCount,
-        const VkSubmitInfo* pSubmits,
-        VkFence fence);
-    void vkQueueWaitIdleAsyncGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkQueue queue);
-    void vkQueueBindSparseAsyncGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkQueue queue,
-        uint32_t bindInfoCount,
-        const VkBindSparseInfo* pBindInfo,
-        VkFence fence);
-    void vkGetLinearImageLayoutGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkFormat format,
-        VkDeviceSize* pOffset,
-        VkDeviceSize* pRowPitchAlignment);
-    void vkGetLinearImageLayout2GOOGLE(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        const VkImageCreateInfo* pCreateInfo,
-        VkDeviceSize* pOffset,
-        VkDeviceSize* pRowPitchAlignment);
-    void vkQueueFlushCommandsGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkQueue queue,
-        VkCommandBuffer commandBuffer,
-        VkDeviceSize dataSize,
-        const void* pData);
+    void vkGetMemoryHostAddressInfoGOOGLE(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkResult input_result, VkDevice device,
+                                          VkDeviceMemory memory, uint64_t* pAddress,
+                                          uint64_t* pSize, uint64_t* pHostmemId);
+    void vkFreeMemorySyncGOOGLE(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                android::base::BumpPool* pool, VkResult input_result,
+                                VkDevice device, VkDeviceMemory memory,
+                                const VkAllocationCallbacks* pAllocator);
+    void vkQueueHostSyncGOOGLE(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                               android::base::BumpPool* pool, VkQueue queue, uint32_t needHostSync,
+                               uint32_t sequenceNumber);
+    void vkQueueSubmitAsyncGOOGLE(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkQueue queue,
+                                  uint32_t submitCount, const VkSubmitInfo* pSubmits,
+                                  VkFence fence);
+    void vkQueueWaitIdleAsyncGOOGLE(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkQueue queue);
+    void vkQueueBindSparseAsyncGOOGLE(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkQueue queue,
+                                      uint32_t bindInfoCount, const VkBindSparseInfo* pBindInfo,
+                                      VkFence fence);
+    void vkGetLinearImageLayoutGOOGLE(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkDevice device,
+                                      VkFormat format, VkDeviceSize* pOffset,
+                                      VkDeviceSize* pRowPitchAlignment);
+    void vkGetLinearImageLayout2GOOGLE(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                       android::base::BumpPool* pool, VkDevice device,
+                                       const VkImageCreateInfo* pCreateInfo, VkDeviceSize* pOffset,
+                                       VkDeviceSize* pRowPitchAlignment);
+    void vkQueueFlushCommandsGOOGLE(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                    android::base::BumpPool* pool, VkQueue queue,
+                                    VkCommandBuffer commandBuffer, VkDeviceSize dataSize,
+                                    const void* pData);
     void vkQueueCommitDescriptorSetUpdatesGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkQueue queue,
-        uint32_t descriptorPoolCount,
-        const VkDescriptorPool* pDescriptorPools,
-        uint32_t descriptorSetCount,
-        const VkDescriptorSetLayout* pSetLayouts,
-        const uint64_t* pDescriptorSetPoolIds,
-        const uint32_t* pDescriptorSetWhichPool,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkQueue queue, uint32_t descriptorPoolCount, const VkDescriptorPool* pDescriptorPools,
+        uint32_t descriptorSetCount, const VkDescriptorSetLayout* pSetLayouts,
+        const uint64_t* pDescriptorSetPoolIds, const uint32_t* pDescriptorSetWhichPool,
         const uint32_t* pDescriptorSetPendingAllocation,
-        const uint32_t* pDescriptorWriteStartingIndices,
-        uint32_t pendingDescriptorWriteCount,
+        const uint32_t* pDescriptorWriteStartingIndices, uint32_t pendingDescriptorWriteCount,
         const VkWriteDescriptorSet* pPendingDescriptorWrites);
-    void vkCollectDescriptorPoolIdsGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkDescriptorPool descriptorPool,
-        uint32_t* pPoolIdCount,
-        uint64_t* pPoolIds);
-    void vkQueueSignalReleaseImageANDROIDAsyncGOOGLE(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkQueue queue,
-        uint32_t waitSemaphoreCount,
-        const VkSemaphore* pWaitSemaphores,
-        VkImage image);
+    void vkCollectDescriptorPoolIdsGOOGLE(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkDevice device, VkDescriptorPool descriptorPool,
+                                          uint32_t* pPoolIdCount, uint64_t* pPoolIds);
+    void vkQueueSignalReleaseImageANDROIDAsyncGOOGLE(const uint8_t* snapshotTraceBegin,
+                                                     size_t snapshotTraceBytes,
+                                                     android::base::BumpPool* pool, VkQueue queue,
+                                                     uint32_t waitSemaphoreCount,
+                                                     const VkSemaphore* pWaitSemaphores,
+                                                     VkImage image);
 #endif
 #ifdef VK_EXT_global_priority_query
 #endif
 #ifdef VK_EXT_multi_draw
-    void vkCmdDrawMultiEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t drawCount,
-        const VkMultiDrawInfoEXT* pVertexInfo,
-        uint32_t instanceCount,
-        uint32_t firstInstance,
-        uint32_t stride);
-    void vkCmdDrawMultiIndexedEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t drawCount,
-        const VkMultiDrawIndexedInfoEXT* pIndexInfo,
-        uint32_t instanceCount,
-        uint32_t firstInstance,
-        uint32_t stride,
-        const int32_t* pVertexOffset);
+    void vkCmdDrawMultiEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                           uint32_t drawCount, const VkMultiDrawInfoEXT* pVertexInfo,
+                           uint32_t instanceCount, uint32_t firstInstance, uint32_t stride);
+    void vkCmdDrawMultiIndexedEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                  android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                                  uint32_t drawCount, const VkMultiDrawIndexedInfoEXT* pIndexInfo,
+                                  uint32_t instanceCount, uint32_t firstInstance, uint32_t stride,
+                                  const int32_t* pVertexOffset);
 #endif
 #ifdef VK_EXT_load_store_op_none
 #endif
 #ifdef VK_EXT_border_color_swizzle
 #endif
 #ifdef VK_EXT_pageable_device_local_memory
-    void vkSetDeviceMemoryPriorityEXT(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkDeviceMemory memory,
-        float priority);
+    void vkSetDeviceMemoryPriorityEXT(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                                      android::base::BumpPool* pool, VkDevice device,
+                                      VkDeviceMemory memory, float priority);
 #endif
 #ifdef VK_KHR_acceleration_structure
-    void vkCreateAccelerationStructureKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        const VkAccelerationStructureCreateInfoKHR* pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkAccelerationStructureKHR* pAccelerationStructure);
-    void vkDestroyAccelerationStructureKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkAccelerationStructureKHR accelerationStructure,
-        const VkAllocationCallbacks* pAllocator);
+    void vkCreateAccelerationStructureKHR(const uint8_t* snapshotTraceBegin,
+                                          size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                          VkResult input_result, VkDevice device,
+                                          const VkAccelerationStructureCreateInfoKHR* pCreateInfo,
+                                          const VkAllocationCallbacks* pAllocator,
+                                          VkAccelerationStructureKHR* pAccelerationStructure);
+    void vkDestroyAccelerationStructureKHR(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkDevice device,
+                                           VkAccelerationStructureKHR accelerationStructure,
+                                           const VkAllocationCallbacks* pAllocator);
     void vkCmdBuildAccelerationStructuresKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t infoCount,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkCommandBuffer commandBuffer, uint32_t infoCount,
         const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,
         const VkAccelerationStructureBuildRangeInfoKHR* const* ppBuildRangeInfos);
     void vkCmdBuildAccelerationStructuresIndirectKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t infoCount,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkCommandBuffer commandBuffer, uint32_t infoCount,
         const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,
-        const VkDeviceAddress* pIndirectDeviceAddresses,
-        const uint32_t* pIndirectStrides,
+        const VkDeviceAddress* pIndirectDeviceAddresses, const uint32_t* pIndirectStrides,
         const uint32_t* const* ppMaxPrimitiveCounts);
     void vkBuildAccelerationStructuresKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkDeferredOperationKHR deferredOperation,
-        uint32_t infoCount,
-        const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, VkDeferredOperationKHR deferredOperation,
+        uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,
         const VkAccelerationStructureBuildRangeInfoKHR* const* ppBuildRangeInfos);
-    void vkCopyAccelerationStructureKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkDeferredOperationKHR deferredOperation,
-        const VkCopyAccelerationStructureInfoKHR* pInfo);
+    void vkCopyAccelerationStructureKHR(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkResult input_result, VkDevice device,
+                                        VkDeferredOperationKHR deferredOperation,
+                                        const VkCopyAccelerationStructureInfoKHR* pInfo);
     void vkCopyAccelerationStructureToMemoryKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkDeferredOperationKHR deferredOperation,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, VkDeferredOperationKHR deferredOperation,
         const VkCopyAccelerationStructureToMemoryInfoKHR* pInfo);
     void vkCopyMemoryToAccelerationStructureKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkDeferredOperationKHR deferredOperation,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, VkDeferredOperationKHR deferredOperation,
         const VkCopyMemoryToAccelerationStructureInfoKHR* pInfo);
     void vkWriteAccelerationStructuresPropertiesKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        uint32_t accelerationStructureCount,
-        const VkAccelerationStructureKHR* pAccelerationStructures,
-        VkQueryType queryType,
-        size_t dataSize,
-        void* pData,
-        size_t stride);
-    void vkCmdCopyAccelerationStructureKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        const VkCopyAccelerationStructureInfoKHR* pInfo);
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, uint32_t accelerationStructureCount,
+        const VkAccelerationStructureKHR* pAccelerationStructures, VkQueryType queryType,
+        size_t dataSize, void* pData, size_t stride);
+    void vkCmdCopyAccelerationStructureKHR(const uint8_t* snapshotTraceBegin,
+                                           size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                           VkCommandBuffer commandBuffer,
+                                           const VkCopyAccelerationStructureInfoKHR* pInfo);
     void vkCmdCopyAccelerationStructureToMemoryKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        const VkCopyAccelerationStructureToMemoryInfoKHR* pInfo);
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkCommandBuffer commandBuffer, const VkCopyAccelerationStructureToMemoryInfoKHR* pInfo);
     void vkCmdCopyMemoryToAccelerationStructureKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        const VkCopyMemoryToAccelerationStructureInfoKHR* pInfo);
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkCommandBuffer commandBuffer, const VkCopyMemoryToAccelerationStructureInfoKHR* pInfo);
     void vkGetAccelerationStructureDeviceAddressKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDeviceAddress input_result,
-        VkDevice device,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkDeviceAddress input_result, VkDevice device,
         const VkAccelerationStructureDeviceAddressInfoKHR* pInfo);
     void vkCmdWriteAccelerationStructuresPropertiesKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t accelerationStructureCount,
-        const VkAccelerationStructureKHR* pAccelerationStructures,
-        VkQueryType queryType,
-        VkQueryPool queryPool,
-        uint32_t firstQuery);
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkCommandBuffer commandBuffer, uint32_t accelerationStructureCount,
+        const VkAccelerationStructureKHR* pAccelerationStructures, VkQueryType queryType,
+        VkQueryPool queryPool, uint32_t firstQuery);
     void vkGetDeviceAccelerationStructureCompatibilityKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        const VkAccelerationStructureVersionInfoKHR* pVersionInfo,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkDevice device, const VkAccelerationStructureVersionInfoKHR* pVersionInfo,
         VkAccelerationStructureCompatibilityKHR* pCompatibility);
     void vkGetAccelerationStructureBuildSizesKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDevice device,
-        VkAccelerationStructureBuildTypeKHR buildType,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkDevice device, VkAccelerationStructureBuildTypeKHR buildType,
         const VkAccelerationStructureBuildGeometryInfoKHR* pBuildInfo,
-        const uint32_t* pMaxPrimitiveCounts,
-        VkAccelerationStructureBuildSizesInfoKHR* pSizeInfo);
+        const uint32_t* pMaxPrimitiveCounts, VkAccelerationStructureBuildSizesInfoKHR* pSizeInfo);
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
-    void vkCmdTraceRaysKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable,
-        const VkStridedDeviceAddressRegionKHR* pMissShaderBindingTable,
-        const VkStridedDeviceAddressRegionKHR* pHitShaderBindingTable,
-        const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable,
-        uint32_t width,
-        uint32_t height,
-        uint32_t depth);
-    void vkCreateRayTracingPipelinesKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkDeferredOperationKHR deferredOperation,
-        VkPipelineCache pipelineCache,
-        uint32_t createInfoCount,
-        const VkRayTracingPipelineCreateInfoKHR* pCreateInfos,
-        const VkAllocationCallbacks* pAllocator,
-        VkPipeline* pPipelines);
+    void vkCmdTraceRaysKHR(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
+                           android::base::BumpPool* pool, VkCommandBuffer commandBuffer,
+                           const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable,
+                           const VkStridedDeviceAddressRegionKHR* pMissShaderBindingTable,
+                           const VkStridedDeviceAddressRegionKHR* pHitShaderBindingTable,
+                           const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable,
+                           uint32_t width, uint32_t height, uint32_t depth);
+    void vkCreateRayTracingPipelinesKHR(const uint8_t* snapshotTraceBegin,
+                                        size_t snapshotTraceBytes, android::base::BumpPool* pool,
+                                        VkResult input_result, VkDevice device,
+                                        VkDeferredOperationKHR deferredOperation,
+                                        VkPipelineCache pipelineCache, uint32_t createInfoCount,
+                                        const VkRayTracingPipelineCreateInfoKHR* pCreateInfos,
+                                        const VkAllocationCallbacks* pAllocator,
+                                        VkPipeline* pPipelines);
     void vkGetRayTracingCaptureReplayShaderGroupHandlesKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkResult input_result,
-        VkDevice device,
-        VkPipeline pipeline,
-        uint32_t firstGroup,
-        uint32_t groupCount,
-        size_t dataSize,
-        void* pData);
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
+        VkResult input_result, VkDevice device, VkPipeline pipeline, uint32_t firstGroup,
+        uint32_t groupCount, size_t dataSize, void* pData);
     void vkCmdTraceRaysIndirectKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
+        const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes, android::base::BumpPool* pool,
         VkCommandBuffer commandBuffer,
         const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable,
         const VkStridedDeviceAddressRegionKHR* pMissShaderBindingTable,
         const VkStridedDeviceAddressRegionKHR* pHitShaderBindingTable,
         const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable,
         VkDeviceAddress indirectDeviceAddress);
-    void vkGetRayTracingShaderGroupStackSizeKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkDeviceSize input_result,
-        VkDevice device,
-        VkPipeline pipeline,
-        uint32_t group,
-        VkShaderGroupShaderKHR groupShader);
-    void vkCmdSetRayTracingPipelineStackSizeKHR(
-    const uint8_t* snapshotTraceBegin,
-        size_t snapshotTraceBytes,
-        android::base::BumpPool* pool,
-        VkCommandBuffer commandBuffer,
-        uint32_t pipelineStackSize);
+    void vkGetRayTracingShaderGroupStackSizeKHR(const uint8_t* snapshotTraceBegin,
+                                                size_t snapshotTraceBytes,
+                                                android::base::BumpPool* pool,
+                                                VkDeviceSize input_result, VkDevice device,
+                                                VkPipeline pipeline, uint32_t group,
+                                                VkShaderGroupShaderKHR groupShader);
+    void vkCmdSetRayTracingPipelineStackSizeKHR(const uint8_t* snapshotTraceBegin,
+                                                size_t snapshotTraceBytes,
+                                                android::base::BumpPool* pool,
+                                                VkCommandBuffer commandBuffer,
+                                                uint32_t pipelineStackSize);
 #endif
 #ifdef VK_KHR_ray_query
 #endif
 
-private:
+   private:
     class Impl;
     std::unique_ptr<Impl> mImpl;
-
 };
-
-
diff --git a/stream-servers/vulkan/VkSubDecoder.cpp b/stream-servers/vulkan/VkSubDecoder.cpp
index d662438..b4fa842 100644
--- a/stream-servers/vulkan/VkSubDecoder.cpp
+++ b/stream-servers/vulkan/VkSubDecoder.cpp
@@ -14,89 +14,101 @@
 // limitations under the License.
 
 // Autogenerated module VkSubDecoder
-// (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
+// (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal
+// -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
 // VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
 // VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+//
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o
+// $CEREAL_OUTPUT_DIR
+//
 #define MAX_STACK_ITEMS 16
-size_t subDecode(VulkanMemReadingStream* readStream, VulkanDispatch* vk, void* boxed_dispatchHandle, void* dispatchHandle, VkDeviceSize dataSize, const void* pData, GfxApiLogger& gfx_logger)
-{
+size_t subDecode(VulkanMemReadingStream* readStream, VulkanDispatch* vk, void* boxed_dispatchHandle,
+                 void* dispatchHandle, VkDeviceSize dataSize, const void* pData,
+                 GfxApiLogger& gfx_logger) {
     uint32_t count = 0;
-    unsigned char *buf = (unsigned char *)pData;
+    unsigned char* buf = (unsigned char*)pData;
     android::base::BumpPool* pool = readStream->pool();
-    unsigned char *ptr = (unsigned char *)pData;
+    unsigned char* ptr = (unsigned char*)pData;
     const unsigned char* const end = (const unsigned char*)buf + dataSize;
     VkDecoderGlobalState* globalstate = VkDecoderGlobalState::get();
-    while (end - ptr >= 8)
-    {
-        uint32_t opcode = *(uint32_t *)ptr;
-        uint32_t packetLen = *(uint32_t *)(ptr + 4);
+    while (end - ptr >= 8) {
+        uint32_t opcode = *(uint32_t*)ptr;
+        uint32_t packetLen = *(uint32_t*)(ptr + 4);
         if (end - ptr < packetLen) return ptr - (unsigned char*)buf;
         gfx_logger.record(ptr, std::min(size_t(packetLen + 8), size_t(end - ptr)));
         readStream->setBuf((uint8_t*)(ptr + 8));
-        uint8_t* readStreamPtr = readStream->getBuf(); uint8_t** readStreamPtrPtr = &readStreamPtr;
-        switch (opcode)
-        {
+        uint8_t* readStreamPtr = readStream->getBuf();
+        uint8_t** readStreamPtrPtr = &readStreamPtr;
+        switch (opcode) {
 #ifdef VK_VERSION_1_0
-            case OP_vkBeginCommandBuffer:
-            {
+            case OP_vkBeginCommandBuffer: {
                 android::base::beginTrace("vkBeginCommandBuffer subdecode");
                 const VkCommandBufferBeginInfo* pBeginInfo;
                 VkCommandBufferBeginInfo stack_pBeginInfo[1];
                 pBeginInfo = (VkCommandBufferBeginInfo*)stack_pBeginInfo;
-                reservedunmarshal_VkCommandBufferBeginInfo(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCommandBufferBeginInfo*)(pBeginInfo), readStreamPtrPtr);
-                if (pBeginInfo)
-                {
-                    transform_tohost_VkCommandBufferBeginInfo(globalstate, (VkCommandBufferBeginInfo*)(pBeginInfo));
+                reservedunmarshal_VkCommandBufferBeginInfo(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                           (VkCommandBufferBeginInfo*)(pBeginInfo),
+                                                           readStreamPtrPtr);
+                if (pBeginInfo) {
+                    transform_tohost_VkCommandBufferBeginInfo(
+                        globalstate, (VkCommandBufferBeginInfo*)(pBeginInfo));
                 }
                 VkResult vkBeginCommandBuffer_VkResult_return = (VkResult)0;
-                vkBeginCommandBuffer_VkResult_return = this->on_vkBeginCommandBuffer(pool, (VkCommandBuffer)(boxed_dispatchHandle), pBeginInfo, gfx_logger);
-                if ((vkBeginCommandBuffer_VkResult_return) == VK_ERROR_DEVICE_LOST) this->on_DeviceLost();
+                vkBeginCommandBuffer_VkResult_return = this->on_vkBeginCommandBuffer(
+                    pool, (VkCommandBuffer)(boxed_dispatchHandle), pBeginInfo, gfx_logger);
+                if ((vkBeginCommandBuffer_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    this->on_DeviceLost();
                 android::base::endTrace();
                 break;
             }
-            case OP_vkEndCommandBuffer:
-            {
+            case OP_vkEndCommandBuffer: {
                 android::base::beginTrace("vkEndCommandBuffer subdecode");
                 VkResult vkEndCommandBuffer_VkResult_return = (VkResult)0;
-                vkEndCommandBuffer_VkResult_return = this->on_vkEndCommandBuffer(pool, (VkCommandBuffer)(boxed_dispatchHandle), gfx_logger);
-                if ((vkEndCommandBuffer_VkResult_return) == VK_ERROR_DEVICE_LOST) this->on_DeviceLost();
+                vkEndCommandBuffer_VkResult_return = this->on_vkEndCommandBuffer(
+                    pool, (VkCommandBuffer)(boxed_dispatchHandle), gfx_logger);
+                if ((vkEndCommandBuffer_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    this->on_DeviceLost();
                 android::base::endTrace();
                 break;
             }
-            case OP_vkResetCommandBuffer:
-            {
+            case OP_vkResetCommandBuffer: {
                 android::base::beginTrace("vkResetCommandBuffer subdecode");
                 VkCommandBufferResetFlags flags;
-                memcpy((VkCommandBufferResetFlags*)&flags, *readStreamPtrPtr, sizeof(VkCommandBufferResetFlags));
+                memcpy((VkCommandBufferResetFlags*)&flags, *readStreamPtrPtr,
+                       sizeof(VkCommandBufferResetFlags));
                 *readStreamPtrPtr += sizeof(VkCommandBufferResetFlags);
                 VkResult vkResetCommandBuffer_VkResult_return = (VkResult)0;
-                vkResetCommandBuffer_VkResult_return = this->on_vkResetCommandBuffer(pool, (VkCommandBuffer)(boxed_dispatchHandle), flags);
-                if ((vkResetCommandBuffer_VkResult_return) == VK_ERROR_DEVICE_LOST) this->on_DeviceLost();
+                vkResetCommandBuffer_VkResult_return = this->on_vkResetCommandBuffer(
+                    pool, (VkCommandBuffer)(boxed_dispatchHandle), flags);
+                if ((vkResetCommandBuffer_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    this->on_DeviceLost();
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdBindPipeline:
-            {
+            case OP_vkCmdBindPipeline: {
                 android::base::beginTrace("vkCmdBindPipeline subdecode");
                 VkPipelineBindPoint pipelineBindPoint;
                 VkPipeline pipeline;
-                memcpy((VkPipelineBindPoint*)&pipelineBindPoint, *readStreamPtrPtr, sizeof(VkPipelineBindPoint));
+                memcpy((VkPipelineBindPoint*)&pipelineBindPoint, *readStreamPtrPtr,
+                       sizeof(VkPipelineBindPoint));
                 *readStreamPtrPtr += sizeof(VkPipelineBindPoint);
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkPipeline*)&pipeline = (VkPipeline)unbox_VkPipeline((VkPipeline)(*&cgen_var_0));
-                this->on_vkCmdBindPipeline(pool, (VkCommandBuffer)(boxed_dispatchHandle), pipelineBindPoint, pipeline);
+                this->on_vkCmdBindPipeline(pool, (VkCommandBuffer)(boxed_dispatchHandle),
+                                           pipelineBindPoint, pipeline);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetViewport:
-            {
+            case OP_vkCmdSetViewport: {
                 android::base::beginTrace("vkCmdSetViewport subdecode");
                 uint32_t firstViewport;
                 uint32_t viewportCount;
@@ -106,31 +118,27 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&viewportCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((viewportCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((viewportCount)) <= MAX_STACK_ITEMS) {
                     pViewports = (VkViewport*)stack_pViewports;
+                } else {
+                    readStream->alloc((void**)&pViewports,
+                                      ((viewportCount)) * sizeof(const VkViewport));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pViewports, ((viewportCount)) * sizeof(const VkViewport));
+                for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i) {
+                    reservedunmarshal_VkViewport(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                 (VkViewport*)(pViewports + i), readStreamPtrPtr);
                 }
-                for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i)
-                {
-                    reservedunmarshal_VkViewport(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkViewport*)(pViewports + i), readStreamPtrPtr);
-                }
-                if (pViewports)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i)
-                    {
+                if (pViewports) {
+                    for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i) {
                         transform_tohost_VkViewport(globalstate, (VkViewport*)(pViewports + i));
                     }
                 }
-                vk->vkCmdSetViewport((VkCommandBuffer)dispatchHandle, firstViewport, viewportCount, pViewports);
+                vk->vkCmdSetViewport((VkCommandBuffer)dispatchHandle, firstViewport, viewportCount,
+                                     pViewports);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetScissor:
-            {
+            case OP_vkCmdSetScissor: {
                 android::base::beginTrace("vkCmdSetScissor subdecode");
                 uint32_t firstScissor;
                 uint32_t scissorCount;
@@ -140,31 +148,27 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&scissorCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((scissorCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((scissorCount)) <= MAX_STACK_ITEMS) {
                     pScissors = (VkRect2D*)stack_pScissors;
+                } else {
+                    readStream->alloc((void**)&pScissors,
+                                      ((scissorCount)) * sizeof(const VkRect2D));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pScissors, ((scissorCount)) * sizeof(const VkRect2D));
+                for (uint32_t i = 0; i < (uint32_t)((scissorCount)); ++i) {
+                    reservedunmarshal_VkRect2D(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                               (VkRect2D*)(pScissors + i), readStreamPtrPtr);
                 }
-                for (uint32_t i = 0; i < (uint32_t)((scissorCount)); ++i)
-                {
-                    reservedunmarshal_VkRect2D(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRect2D*)(pScissors + i), readStreamPtrPtr);
-                }
-                if (pScissors)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((scissorCount)); ++i)
-                    {
+                if (pScissors) {
+                    for (uint32_t i = 0; i < (uint32_t)((scissorCount)); ++i) {
                         transform_tohost_VkRect2D(globalstate, (VkRect2D*)(pScissors + i));
                     }
                 }
-                vk->vkCmdSetScissor((VkCommandBuffer)dispatchHandle, firstScissor, scissorCount, pScissors);
+                vk->vkCmdSetScissor((VkCommandBuffer)dispatchHandle, firstScissor, scissorCount,
+                                    pScissors);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetLineWidth:
-            {
+            case OP_vkCmdSetLineWidth: {
                 android::base::beginTrace("vkCmdSetLineWidth subdecode");
                 float lineWidth;
                 memcpy((float*)&lineWidth, *readStreamPtrPtr, sizeof(float));
@@ -173,8 +177,7 @@
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetDepthBias:
-            {
+            case OP_vkCmdSetDepthBias: {
                 android::base::beginTrace("vkCmdSetDepthBias subdecode");
                 float depthBiasConstantFactor;
                 float depthBiasClamp;
@@ -185,12 +188,12 @@
                 *readStreamPtrPtr += sizeof(float);
                 memcpy((float*)&depthBiasSlopeFactor, *readStreamPtrPtr, sizeof(float));
                 *readStreamPtrPtr += sizeof(float);
-                vk->vkCmdSetDepthBias((VkCommandBuffer)dispatchHandle, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
+                vk->vkCmdSetDepthBias((VkCommandBuffer)dispatchHandle, depthBiasConstantFactor,
+                                      depthBiasClamp, depthBiasSlopeFactor);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetBlendConstants:
-            {
+            case OP_vkCmdSetBlendConstants: {
                 android::base::beginTrace("vkCmdSetBlendConstants subdecode");
                 float blendConstants[4];
                 memcpy((float*)blendConstants, *readStreamPtrPtr, 4 * sizeof(const float));
@@ -199,8 +202,7 @@
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetDepthBounds:
-            {
+            case OP_vkCmdSetDepthBounds: {
                 android::base::beginTrace("vkCmdSetDepthBounds subdecode");
                 float minDepthBounds;
                 float maxDepthBounds;
@@ -208,29 +210,31 @@
                 *readStreamPtrPtr += sizeof(float);
                 memcpy((float*)&maxDepthBounds, *readStreamPtrPtr, sizeof(float));
                 *readStreamPtrPtr += sizeof(float);
-                vk->vkCmdSetDepthBounds((VkCommandBuffer)dispatchHandle, minDepthBounds, maxDepthBounds);
+                vk->vkCmdSetDepthBounds((VkCommandBuffer)dispatchHandle, minDepthBounds,
+                                        maxDepthBounds);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetStencilCompareMask:
-            {
+            case OP_vkCmdSetStencilCompareMask: {
                 android::base::beginTrace("vkCmdSetStencilCompareMask subdecode");
                 VkStencilFaceFlags faceMask;
                 uint32_t compareMask;
-                memcpy((VkStencilFaceFlags*)&faceMask, *readStreamPtrPtr, sizeof(VkStencilFaceFlags));
+                memcpy((VkStencilFaceFlags*)&faceMask, *readStreamPtrPtr,
+                       sizeof(VkStencilFaceFlags));
                 *readStreamPtrPtr += sizeof(VkStencilFaceFlags);
                 memcpy((uint32_t*)&compareMask, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdSetStencilCompareMask((VkCommandBuffer)dispatchHandle, faceMask, compareMask);
+                vk->vkCmdSetStencilCompareMask((VkCommandBuffer)dispatchHandle, faceMask,
+                                               compareMask);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetStencilWriteMask:
-            {
+            case OP_vkCmdSetStencilWriteMask: {
                 android::base::beginTrace("vkCmdSetStencilWriteMask subdecode");
                 VkStencilFaceFlags faceMask;
                 uint32_t writeMask;
-                memcpy((VkStencilFaceFlags*)&faceMask, *readStreamPtrPtr, sizeof(VkStencilFaceFlags));
+                memcpy((VkStencilFaceFlags*)&faceMask, *readStreamPtrPtr,
+                       sizeof(VkStencilFaceFlags));
                 *readStreamPtrPtr += sizeof(VkStencilFaceFlags);
                 memcpy((uint32_t*)&writeMask, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
@@ -238,12 +242,12 @@
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetStencilReference:
-            {
+            case OP_vkCmdSetStencilReference: {
                 android::base::beginTrace("vkCmdSetStencilReference subdecode");
                 VkStencilFaceFlags faceMask;
                 uint32_t reference;
-                memcpy((VkStencilFaceFlags*)&faceMask, *readStreamPtrPtr, sizeof(VkStencilFaceFlags));
+                memcpy((VkStencilFaceFlags*)&faceMask, *readStreamPtrPtr,
+                       sizeof(VkStencilFaceFlags));
                 *readStreamPtrPtr += sizeof(VkStencilFaceFlags);
                 memcpy((uint32_t*)&reference, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
@@ -251,8 +255,7 @@
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdBindDescriptorSets:
-            {
+            case OP_vkCmdBindDescriptorSets: {
                 android::base::beginTrace("vkCmdBindDescriptorSets subdecode");
                 VkPipelineBindPoint pipelineBindPoint;
                 VkPipelineLayout layout;
@@ -263,52 +266,53 @@
                 uint32_t dynamicOffsetCount;
                 const uint32_t* pDynamicOffsets;
                 uint32_t stack_pDynamicOffsets[MAX_STACK_ITEMS];
-                memcpy((VkPipelineBindPoint*)&pipelineBindPoint, *readStreamPtrPtr, sizeof(VkPipelineBindPoint));
+                memcpy((VkPipelineBindPoint*)&pipelineBindPoint, *readStreamPtrPtr,
+                       sizeof(VkPipelineBindPoint));
                 *readStreamPtrPtr += sizeof(VkPipelineBindPoint);
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPipelineLayout*)&layout = (VkPipelineLayout)unbox_VkPipelineLayout((VkPipelineLayout)(*&cgen_var_0));
+                *(VkPipelineLayout*)&layout =
+                    (VkPipelineLayout)unbox_VkPipelineLayout((VkPipelineLayout)(*&cgen_var_0));
                 memcpy((uint32_t*)&firstSet, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&descriptorSetCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((descriptorSetCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((descriptorSetCount)) <= MAX_STACK_ITEMS) {
                     pDescriptorSets = (VkDescriptorSet*)stack_pDescriptorSets;
+                } else {
+                    readStream->alloc((void**)&pDescriptorSets,
+                                      ((descriptorSetCount)) * sizeof(const VkDescriptorSet));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pDescriptorSets, ((descriptorSetCount)) * sizeof(const VkDescriptorSet));
-                }
-                if (((descriptorSetCount)))
-                {
+                if (((descriptorSetCount))) {
                     uint8_t* cgen_var_1_ptr = (uint8_t*)(*readStreamPtrPtr);
                     *readStreamPtrPtr += 8 * ((descriptorSetCount));
-                    for (uint32_t k = 0; k < ((descriptorSetCount)); ++k)
-                    {
-                        uint64_t tmpval; memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
-                        *(((VkDescriptorSet*)pDescriptorSets) + k) = (VkDescriptorSet)unbox_VkDescriptorSet((VkDescriptorSet)tmpval);
+                    for (uint32_t k = 0; k < ((descriptorSetCount)); ++k) {
+                        uint64_t tmpval;
+                        memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
+                        *(((VkDescriptorSet*)pDescriptorSets) + k) =
+                            (VkDescriptorSet)unbox_VkDescriptorSet((VkDescriptorSet)tmpval);
                     }
                 }
                 memcpy((uint32_t*)&dynamicOffsetCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((dynamicOffsetCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((dynamicOffsetCount)) <= MAX_STACK_ITEMS) {
                     pDynamicOffsets = (uint32_t*)stack_pDynamicOffsets;
+                } else {
+                    readStream->alloc((void**)&pDynamicOffsets,
+                                      ((dynamicOffsetCount)) * sizeof(const uint32_t));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pDynamicOffsets, ((dynamicOffsetCount)) * sizeof(const uint32_t));
-                }
-                memcpy((uint32_t*)pDynamicOffsets, *readStreamPtrPtr, ((dynamicOffsetCount)) * sizeof(const uint32_t));
+                memcpy((uint32_t*)pDynamicOffsets, *readStreamPtrPtr,
+                       ((dynamicOffsetCount)) * sizeof(const uint32_t));
                 *readStreamPtrPtr += ((dynamicOffsetCount)) * sizeof(const uint32_t);
-                this->on_vkCmdBindDescriptorSets(pool, (VkCommandBuffer)(boxed_dispatchHandle), pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
+                this->on_vkCmdBindDescriptorSets(pool, (VkCommandBuffer)(boxed_dispatchHandle),
+                                                 pipelineBindPoint, layout, firstSet,
+                                                 descriptorSetCount, pDescriptorSets,
+                                                 dynamicOffsetCount, pDynamicOffsets);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdBindIndexBuffer:
-            {
+            case OP_vkCmdBindIndexBuffer: {
                 android::base::beginTrace("vkCmdBindIndexBuffer subdecode");
                 VkBuffer buffer;
                 VkDeviceSize offset;
@@ -321,12 +325,12 @@
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
                 memcpy((VkIndexType*)&indexType, *readStreamPtrPtr, sizeof(VkIndexType));
                 *readStreamPtrPtr += sizeof(VkIndexType);
-                vk->vkCmdBindIndexBuffer((VkCommandBuffer)dispatchHandle, buffer, offset, indexType);
+                vk->vkCmdBindIndexBuffer((VkCommandBuffer)dispatchHandle, buffer, offset,
+                                         indexType);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdBindVertexBuffers:
-            {
+            case OP_vkCmdBindVertexBuffers: {
                 android::base::beginTrace("vkCmdBindVertexBuffers subdecode");
                 uint32_t firstBinding;
                 uint32_t bindingCount;
@@ -338,40 +342,35 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&bindingCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((bindingCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((bindingCount)) <= MAX_STACK_ITEMS) {
                     pBuffers = (VkBuffer*)stack_pBuffers;
-                }
-                else
-                {
+                } else {
                     readStream->alloc((void**)&pBuffers, ((bindingCount)) * sizeof(const VkBuffer));
                 }
-                if (((bindingCount)))
-                {
+                if (((bindingCount))) {
                     uint8_t* cgen_var_0_ptr = (uint8_t*)(*readStreamPtrPtr);
                     *readStreamPtrPtr += 8 * ((bindingCount));
-                    for (uint32_t k = 0; k < ((bindingCount)); ++k)
-                    {
-                        uint64_t tmpval; memcpy(&tmpval, cgen_var_0_ptr + k * 8, sizeof(uint64_t));
+                    for (uint32_t k = 0; k < ((bindingCount)); ++k) {
+                        uint64_t tmpval;
+                        memcpy(&tmpval, cgen_var_0_ptr + k * 8, sizeof(uint64_t));
                         *(((VkBuffer*)pBuffers) + k) = (VkBuffer)unbox_VkBuffer((VkBuffer)tmpval);
                     }
                 }
-                if (((bindingCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((bindingCount)) <= MAX_STACK_ITEMS) {
                     pOffsets = (VkDeviceSize*)stack_pOffsets;
+                } else {
+                    readStream->alloc((void**)&pOffsets,
+                                      ((bindingCount)) * sizeof(const VkDeviceSize));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pOffsets, ((bindingCount)) * sizeof(const VkDeviceSize));
-                }
-                memcpy((VkDeviceSize*)pOffsets, *readStreamPtrPtr, ((bindingCount)) * sizeof(const VkDeviceSize));
+                memcpy((VkDeviceSize*)pOffsets, *readStreamPtrPtr,
+                       ((bindingCount)) * sizeof(const VkDeviceSize));
                 *readStreamPtrPtr += ((bindingCount)) * sizeof(const VkDeviceSize);
-                vk->vkCmdBindVertexBuffers((VkCommandBuffer)dispatchHandle, firstBinding, bindingCount, pBuffers, pOffsets);
+                vk->vkCmdBindVertexBuffers((VkCommandBuffer)dispatchHandle, firstBinding,
+                                           bindingCount, pBuffers, pOffsets);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdDraw:
-            {
+            case OP_vkCmdDraw: {
                 android::base::beginTrace("vkCmdDraw subdecode");
                 uint32_t vertexCount;
                 uint32_t instanceCount;
@@ -385,12 +384,12 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&firstInstance, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdDraw((VkCommandBuffer)dispatchHandle, vertexCount, instanceCount, firstVertex, firstInstance);
+                vk->vkCmdDraw((VkCommandBuffer)dispatchHandle, vertexCount, instanceCount,
+                              firstVertex, firstInstance);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdDrawIndexed:
-            {
+            case OP_vkCmdDrawIndexed: {
                 android::base::beginTrace("vkCmdDrawIndexed subdecode");
                 uint32_t indexCount;
                 uint32_t instanceCount;
@@ -407,12 +406,12 @@
                 *readStreamPtrPtr += sizeof(int32_t);
                 memcpy((uint32_t*)&firstInstance, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdDrawIndexed((VkCommandBuffer)dispatchHandle, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
+                vk->vkCmdDrawIndexed((VkCommandBuffer)dispatchHandle, indexCount, instanceCount,
+                                     firstIndex, vertexOffset, firstInstance);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdDrawIndirect:
-            {
+            case OP_vkCmdDrawIndirect: {
                 android::base::beginTrace("vkCmdDrawIndirect subdecode");
                 VkBuffer buffer;
                 VkDeviceSize offset;
@@ -428,12 +427,12 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&stride, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdDrawIndirect((VkCommandBuffer)dispatchHandle, buffer, offset, drawCount, stride);
+                vk->vkCmdDrawIndirect((VkCommandBuffer)dispatchHandle, buffer, offset, drawCount,
+                                      stride);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdDrawIndexedIndirect:
-            {
+            case OP_vkCmdDrawIndexedIndirect: {
                 android::base::beginTrace("vkCmdDrawIndexedIndirect subdecode");
                 VkBuffer buffer;
                 VkDeviceSize offset;
@@ -449,12 +448,12 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&stride, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdDrawIndexedIndirect((VkCommandBuffer)dispatchHandle, buffer, offset, drawCount, stride);
+                vk->vkCmdDrawIndexedIndirect((VkCommandBuffer)dispatchHandle, buffer, offset,
+                                             drawCount, stride);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdDispatch:
-            {
+            case OP_vkCmdDispatch: {
                 android::base::beginTrace("vkCmdDispatch subdecode");
                 uint32_t groupCountX;
                 uint32_t groupCountY;
@@ -465,12 +464,12 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&groupCountZ, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdDispatch((VkCommandBuffer)dispatchHandle, groupCountX, groupCountY, groupCountZ);
+                vk->vkCmdDispatch((VkCommandBuffer)dispatchHandle, groupCountX, groupCountY,
+                                  groupCountZ);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdDispatchIndirect:
-            {
+            case OP_vkCmdDispatchIndirect: {
                 android::base::beginTrace("vkCmdDispatchIndirect subdecode");
                 VkBuffer buffer;
                 VkDeviceSize offset;
@@ -484,8 +483,7 @@
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdCopyBuffer:
-            {
+            case OP_vkCmdCopyBuffer: {
                 android::base::beginTrace("vkCmdCopyBuffer subdecode");
                 VkBuffer srcBuffer;
                 VkBuffer dstBuffer;
@@ -502,31 +500,27 @@
                 *(VkBuffer*)&dstBuffer = (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_1));
                 memcpy((uint32_t*)&regionCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((regionCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((regionCount)) <= MAX_STACK_ITEMS) {
                     pRegions = (VkBufferCopy*)stack_pRegions;
+                } else {
+                    readStream->alloc((void**)&pRegions,
+                                      ((regionCount)) * sizeof(const VkBufferCopy));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pRegions, ((regionCount)) * sizeof(const VkBufferCopy));
+                for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
+                    reservedunmarshal_VkBufferCopy(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                   (VkBufferCopy*)(pRegions + i), readStreamPtrPtr);
                 }
-                for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
-                {
-                    reservedunmarshal_VkBufferCopy(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferCopy*)(pRegions + i), readStreamPtrPtr);
-                }
-                if (pRegions)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
-                    {
+                if (pRegions) {
+                    for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
                         transform_tohost_VkBufferCopy(globalstate, (VkBufferCopy*)(pRegions + i));
                     }
                 }
-                vk->vkCmdCopyBuffer((VkCommandBuffer)dispatchHandle, srcBuffer, dstBuffer, regionCount, pRegions);
+                vk->vkCmdCopyBuffer((VkCommandBuffer)dispatchHandle, srcBuffer, dstBuffer,
+                                    regionCount, pRegions);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdCopyImage:
-            {
+            case OP_vkCmdCopyImage: {
                 android::base::beginTrace("vkCmdCopyImage subdecode");
                 VkImage srcImage;
                 VkImageLayout srcImageLayout;
@@ -549,31 +543,28 @@
                 *readStreamPtrPtr += sizeof(VkImageLayout);
                 memcpy((uint32_t*)&regionCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((regionCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((regionCount)) <= MAX_STACK_ITEMS) {
                     pRegions = (VkImageCopy*)stack_pRegions;
+                } else {
+                    readStream->alloc((void**)&pRegions,
+                                      ((regionCount)) * sizeof(const VkImageCopy));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pRegions, ((regionCount)) * sizeof(const VkImageCopy));
+                for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
+                    reservedunmarshal_VkImageCopy(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                  (VkImageCopy*)(pRegions + i), readStreamPtrPtr);
                 }
-                for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
-                {
-                    reservedunmarshal_VkImageCopy(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageCopy*)(pRegions + i), readStreamPtrPtr);
-                }
-                if (pRegions)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
-                    {
+                if (pRegions) {
+                    for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
                         transform_tohost_VkImageCopy(globalstate, (VkImageCopy*)(pRegions + i));
                     }
                 }
-                this->on_vkCmdCopyImage(pool, (VkCommandBuffer)(boxed_dispatchHandle), srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
+                this->on_vkCmdCopyImage(pool, (VkCommandBuffer)(boxed_dispatchHandle), srcImage,
+                                        srcImageLayout, dstImage, dstImageLayout, regionCount,
+                                        pRegions);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdBlitImage:
-            {
+            case OP_vkCmdBlitImage: {
                 android::base::beginTrace("vkCmdBlitImage subdecode");
                 VkImage srcImage;
                 VkImageLayout srcImageLayout;
@@ -597,33 +588,29 @@
                 *readStreamPtrPtr += sizeof(VkImageLayout);
                 memcpy((uint32_t*)&regionCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((regionCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((regionCount)) <= MAX_STACK_ITEMS) {
                     pRegions = (VkImageBlit*)stack_pRegions;
+                } else {
+                    readStream->alloc((void**)&pRegions,
+                                      ((regionCount)) * sizeof(const VkImageBlit));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pRegions, ((regionCount)) * sizeof(const VkImageBlit));
-                }
-                for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
-                {
-                    reservedunmarshal_VkImageBlit(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageBlit*)(pRegions + i), readStreamPtrPtr);
+                for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
+                    reservedunmarshal_VkImageBlit(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                  (VkImageBlit*)(pRegions + i), readStreamPtrPtr);
                 }
                 memcpy((VkFilter*)&filter, *readStreamPtrPtr, sizeof(VkFilter));
                 *readStreamPtrPtr += sizeof(VkFilter);
-                if (pRegions)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
-                    {
+                if (pRegions) {
+                    for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
                         transform_tohost_VkImageBlit(globalstate, (VkImageBlit*)(pRegions + i));
                     }
                 }
-                vk->vkCmdBlitImage((VkCommandBuffer)dispatchHandle, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
+                vk->vkCmdBlitImage((VkCommandBuffer)dispatchHandle, srcImage, srcImageLayout,
+                                   dstImage, dstImageLayout, regionCount, pRegions, filter);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdCopyBufferToImage:
-            {
+            case OP_vkCmdCopyBufferToImage: {
                 android::base::beginTrace("vkCmdCopyBufferToImage subdecode");
                 VkBuffer srcBuffer;
                 VkImage dstImage;
@@ -643,31 +630,30 @@
                 *readStreamPtrPtr += sizeof(VkImageLayout);
                 memcpy((uint32_t*)&regionCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((regionCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((regionCount)) <= MAX_STACK_ITEMS) {
                     pRegions = (VkBufferImageCopy*)stack_pRegions;
+                } else {
+                    readStream->alloc((void**)&pRegions,
+                                      ((regionCount)) * sizeof(const VkBufferImageCopy));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pRegions, ((regionCount)) * sizeof(const VkBufferImageCopy));
+                for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
+                    reservedunmarshal_VkBufferImageCopy(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                        (VkBufferImageCopy*)(pRegions + i),
+                                                        readStreamPtrPtr);
                 }
-                for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
-                {
-                    reservedunmarshal_VkBufferImageCopy(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferImageCopy*)(pRegions + i), readStreamPtrPtr);
-                }
-                if (pRegions)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
-                    {
-                        transform_tohost_VkBufferImageCopy(globalstate, (VkBufferImageCopy*)(pRegions + i));
+                if (pRegions) {
+                    for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
+                        transform_tohost_VkBufferImageCopy(globalstate,
+                                                           (VkBufferImageCopy*)(pRegions + i));
                     }
                 }
-                this->on_vkCmdCopyBufferToImage(pool, (VkCommandBuffer)(boxed_dispatchHandle), srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
+                this->on_vkCmdCopyBufferToImage(pool, (VkCommandBuffer)(boxed_dispatchHandle),
+                                                srcBuffer, dstImage, dstImageLayout, regionCount,
+                                                pRegions);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdCopyImageToBuffer:
-            {
+            case OP_vkCmdCopyImageToBuffer: {
                 android::base::beginTrace("vkCmdCopyImageToBuffer subdecode");
                 VkImage srcImage;
                 VkImageLayout srcImageLayout;
@@ -687,31 +673,30 @@
                 *(VkBuffer*)&dstBuffer = (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_1));
                 memcpy((uint32_t*)&regionCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((regionCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((regionCount)) <= MAX_STACK_ITEMS) {
                     pRegions = (VkBufferImageCopy*)stack_pRegions;
+                } else {
+                    readStream->alloc((void**)&pRegions,
+                                      ((regionCount)) * sizeof(const VkBufferImageCopy));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pRegions, ((regionCount)) * sizeof(const VkBufferImageCopy));
+                for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
+                    reservedunmarshal_VkBufferImageCopy(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                        (VkBufferImageCopy*)(pRegions + i),
+                                                        readStreamPtrPtr);
                 }
-                for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
-                {
-                    reservedunmarshal_VkBufferImageCopy(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferImageCopy*)(pRegions + i), readStreamPtrPtr);
-                }
-                if (pRegions)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
-                    {
-                        transform_tohost_VkBufferImageCopy(globalstate, (VkBufferImageCopy*)(pRegions + i));
+                if (pRegions) {
+                    for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
+                        transform_tohost_VkBufferImageCopy(globalstate,
+                                                           (VkBufferImageCopy*)(pRegions + i));
                     }
                 }
-                this->on_vkCmdCopyImageToBuffer(pool, (VkCommandBuffer)(boxed_dispatchHandle), srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
+                this->on_vkCmdCopyImageToBuffer(pool, (VkCommandBuffer)(boxed_dispatchHandle),
+                                                srcImage, srcImageLayout, dstBuffer, regionCount,
+                                                pRegions);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdUpdateBuffer:
-            {
+            case OP_vkCmdUpdateBuffer: {
                 android::base::beginTrace("vkCmdUpdateBuffer subdecode");
                 VkBuffer dstBuffer;
                 VkDeviceSize dstOffset;
@@ -726,22 +711,19 @@
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
                 memcpy((VkDeviceSize*)&dataSize, *readStreamPtrPtr, sizeof(VkDeviceSize));
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
-                if (((dataSize)) <= MAX_STACK_ITEMS)
-                {
+                if (((dataSize)) <= MAX_STACK_ITEMS) {
                     pData = (void*)stack_pData;
-                }
-                else
-                {
+                } else {
                     readStream->alloc((void**)&pData, ((dataSize)) * sizeof(const uint8_t));
                 }
                 memcpy((void*)pData, *readStreamPtrPtr, ((dataSize)) * sizeof(const uint8_t));
                 *readStreamPtrPtr += ((dataSize)) * sizeof(const uint8_t);
-                vk->vkCmdUpdateBuffer((VkCommandBuffer)dispatchHandle, dstBuffer, dstOffset, dataSize, pData);
+                vk->vkCmdUpdateBuffer((VkCommandBuffer)dispatchHandle, dstBuffer, dstOffset,
+                                      dataSize, pData);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdFillBuffer:
-            {
+            case OP_vkCmdFillBuffer: {
                 android::base::beginTrace("vkCmdFillBuffer subdecode");
                 VkBuffer dstBuffer;
                 VkDeviceSize dstOffset;
@@ -757,12 +739,12 @@
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
                 memcpy((uint32_t*)&data, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdFillBuffer((VkCommandBuffer)dispatchHandle, dstBuffer, dstOffset, size, data);
+                vk->vkCmdFillBuffer((VkCommandBuffer)dispatchHandle, dstBuffer, dstOffset, size,
+                                    data);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdClearColorImage:
-            {
+            case OP_vkCmdClearColorImage: {
                 android::base::beginTrace("vkCmdClearColorImage subdecode");
                 VkImage image;
                 VkImageLayout imageLayout;
@@ -778,38 +760,36 @@
                 memcpy((VkImageLayout*)&imageLayout, *readStreamPtrPtr, sizeof(VkImageLayout));
                 *readStreamPtrPtr += sizeof(VkImageLayout);
                 pColor = (VkClearColorValue*)stack_pColor;
-                reservedunmarshal_VkClearColorValue(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkClearColorValue*)(pColor), readStreamPtrPtr);
+                reservedunmarshal_VkClearColorValue(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                    (VkClearColorValue*)(pColor), readStreamPtrPtr);
                 memcpy((uint32_t*)&rangeCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((rangeCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((rangeCount)) <= MAX_STACK_ITEMS) {
                     pRanges = (VkImageSubresourceRange*)stack_pRanges;
+                } else {
+                    readStream->alloc((void**)&pRanges,
+                                      ((rangeCount)) * sizeof(const VkImageSubresourceRange));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pRanges, ((rangeCount)) * sizeof(const VkImageSubresourceRange));
+                for (uint32_t i = 0; i < (uint32_t)((rangeCount)); ++i) {
+                    reservedunmarshal_VkImageSubresourceRange(
+                        readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkImageSubresourceRange*)(pRanges + i), readStreamPtrPtr);
                 }
-                for (uint32_t i = 0; i < (uint32_t)((rangeCount)); ++i)
-                {
-                    reservedunmarshal_VkImageSubresourceRange(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageSubresourceRange*)(pRanges + i), readStreamPtrPtr);
-                }
-                if (pColor)
-                {
+                if (pColor) {
                     transform_tohost_VkClearColorValue(globalstate, (VkClearColorValue*)(pColor));
                 }
-                if (pRanges)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((rangeCount)); ++i)
-                    {
-                        transform_tohost_VkImageSubresourceRange(globalstate, (VkImageSubresourceRange*)(pRanges + i));
+                if (pRanges) {
+                    for (uint32_t i = 0; i < (uint32_t)((rangeCount)); ++i) {
+                        transform_tohost_VkImageSubresourceRange(
+                            globalstate, (VkImageSubresourceRange*)(pRanges + i));
                     }
                 }
-                vk->vkCmdClearColorImage((VkCommandBuffer)dispatchHandle, image, imageLayout, pColor, rangeCount, pRanges);
+                vk->vkCmdClearColorImage((VkCommandBuffer)dispatchHandle, image, imageLayout,
+                                         pColor, rangeCount, pRanges);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdClearDepthStencilImage:
-            {
+            case OP_vkCmdClearDepthStencilImage: {
                 android::base::beginTrace("vkCmdClearDepthStencilImage subdecode");
                 VkImage image;
                 VkImageLayout imageLayout;
@@ -825,38 +805,38 @@
                 memcpy((VkImageLayout*)&imageLayout, *readStreamPtrPtr, sizeof(VkImageLayout));
                 *readStreamPtrPtr += sizeof(VkImageLayout);
                 pDepthStencil = (VkClearDepthStencilValue*)stack_pDepthStencil;
-                reservedunmarshal_VkClearDepthStencilValue(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkClearDepthStencilValue*)(pDepthStencil), readStreamPtrPtr);
+                reservedunmarshal_VkClearDepthStencilValue(
+                    readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkClearDepthStencilValue*)(pDepthStencil), readStreamPtrPtr);
                 memcpy((uint32_t*)&rangeCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((rangeCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((rangeCount)) <= MAX_STACK_ITEMS) {
                     pRanges = (VkImageSubresourceRange*)stack_pRanges;
+                } else {
+                    readStream->alloc((void**)&pRanges,
+                                      ((rangeCount)) * sizeof(const VkImageSubresourceRange));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pRanges, ((rangeCount)) * sizeof(const VkImageSubresourceRange));
+                for (uint32_t i = 0; i < (uint32_t)((rangeCount)); ++i) {
+                    reservedunmarshal_VkImageSubresourceRange(
+                        readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkImageSubresourceRange*)(pRanges + i), readStreamPtrPtr);
                 }
-                for (uint32_t i = 0; i < (uint32_t)((rangeCount)); ++i)
-                {
-                    reservedunmarshal_VkImageSubresourceRange(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageSubresourceRange*)(pRanges + i), readStreamPtrPtr);
+                if (pDepthStencil) {
+                    transform_tohost_VkClearDepthStencilValue(
+                        globalstate, (VkClearDepthStencilValue*)(pDepthStencil));
                 }
-                if (pDepthStencil)
-                {
-                    transform_tohost_VkClearDepthStencilValue(globalstate, (VkClearDepthStencilValue*)(pDepthStencil));
-                }
-                if (pRanges)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((rangeCount)); ++i)
-                    {
-                        transform_tohost_VkImageSubresourceRange(globalstate, (VkImageSubresourceRange*)(pRanges + i));
+                if (pRanges) {
+                    for (uint32_t i = 0; i < (uint32_t)((rangeCount)); ++i) {
+                        transform_tohost_VkImageSubresourceRange(
+                            globalstate, (VkImageSubresourceRange*)(pRanges + i));
                     }
                 }
-                vk->vkCmdClearDepthStencilImage((VkCommandBuffer)dispatchHandle, image, imageLayout, pDepthStencil, rangeCount, pRanges);
+                vk->vkCmdClearDepthStencilImage((VkCommandBuffer)dispatchHandle, image, imageLayout,
+                                                pDepthStencil, rangeCount, pRanges);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdClearAttachments:
-            {
+            case OP_vkCmdClearAttachments: {
                 android::base::beginTrace("vkCmdClearAttachments subdecode");
                 uint32_t attachmentCount;
                 const VkClearAttachment* pAttachments;
@@ -866,52 +846,45 @@
                 VkClearRect stack_pRects[MAX_STACK_ITEMS];
                 memcpy((uint32_t*)&attachmentCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((attachmentCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((attachmentCount)) <= MAX_STACK_ITEMS) {
                     pAttachments = (VkClearAttachment*)stack_pAttachments;
+                } else {
+                    readStream->alloc((void**)&pAttachments,
+                                      ((attachmentCount)) * sizeof(const VkClearAttachment));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pAttachments, ((attachmentCount)) * sizeof(const VkClearAttachment));
-                }
-                for (uint32_t i = 0; i < (uint32_t)((attachmentCount)); ++i)
-                {
-                    reservedunmarshal_VkClearAttachment(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkClearAttachment*)(pAttachments + i), readStreamPtrPtr);
+                for (uint32_t i = 0; i < (uint32_t)((attachmentCount)); ++i) {
+                    reservedunmarshal_VkClearAttachment(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                        (VkClearAttachment*)(pAttachments + i),
+                                                        readStreamPtrPtr);
                 }
                 memcpy((uint32_t*)&rectCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((rectCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((rectCount)) <= MAX_STACK_ITEMS) {
                     pRects = (VkClearRect*)stack_pRects;
-                }
-                else
-                {
+                } else {
                     readStream->alloc((void**)&pRects, ((rectCount)) * sizeof(const VkClearRect));
                 }
-                for (uint32_t i = 0; i < (uint32_t)((rectCount)); ++i)
-                {
-                    reservedunmarshal_VkClearRect(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkClearRect*)(pRects + i), readStreamPtrPtr);
+                for (uint32_t i = 0; i < (uint32_t)((rectCount)); ++i) {
+                    reservedunmarshal_VkClearRect(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                  (VkClearRect*)(pRects + i), readStreamPtrPtr);
                 }
-                if (pAttachments)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((attachmentCount)); ++i)
-                    {
-                        transform_tohost_VkClearAttachment(globalstate, (VkClearAttachment*)(pAttachments + i));
+                if (pAttachments) {
+                    for (uint32_t i = 0; i < (uint32_t)((attachmentCount)); ++i) {
+                        transform_tohost_VkClearAttachment(globalstate,
+                                                           (VkClearAttachment*)(pAttachments + i));
                     }
                 }
-                if (pRects)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((rectCount)); ++i)
-                    {
+                if (pRects) {
+                    for (uint32_t i = 0; i < (uint32_t)((rectCount)); ++i) {
                         transform_tohost_VkClearRect(globalstate, (VkClearRect*)(pRects + i));
                     }
                 }
-                vk->vkCmdClearAttachments((VkCommandBuffer)dispatchHandle, attachmentCount, pAttachments, rectCount, pRects);
+                vk->vkCmdClearAttachments((VkCommandBuffer)dispatchHandle, attachmentCount,
+                                          pAttachments, rectCount, pRects);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdResolveImage:
-            {
+            case OP_vkCmdResolveImage: {
                 android::base::beginTrace("vkCmdResolveImage subdecode");
                 VkImage srcImage;
                 VkImageLayout srcImageLayout;
@@ -934,31 +907,29 @@
                 *readStreamPtrPtr += sizeof(VkImageLayout);
                 memcpy((uint32_t*)&regionCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((regionCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((regionCount)) <= MAX_STACK_ITEMS) {
                     pRegions = (VkImageResolve*)stack_pRegions;
+                } else {
+                    readStream->alloc((void**)&pRegions,
+                                      ((regionCount)) * sizeof(const VkImageResolve));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pRegions, ((regionCount)) * sizeof(const VkImageResolve));
+                for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
+                    reservedunmarshal_VkImageResolve(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                     (VkImageResolve*)(pRegions + i),
+                                                     readStreamPtrPtr);
                 }
-                for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
-                {
-                    reservedunmarshal_VkImageResolve(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageResolve*)(pRegions + i), readStreamPtrPtr);
-                }
-                if (pRegions)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
-                    {
-                        transform_tohost_VkImageResolve(globalstate, (VkImageResolve*)(pRegions + i));
+                if (pRegions) {
+                    for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
+                        transform_tohost_VkImageResolve(globalstate,
+                                                        (VkImageResolve*)(pRegions + i));
                     }
                 }
-                vk->vkCmdResolveImage((VkCommandBuffer)dispatchHandle, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
+                vk->vkCmdResolveImage((VkCommandBuffer)dispatchHandle, srcImage, srcImageLayout,
+                                      dstImage, dstImageLayout, regionCount, pRegions);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetEvent:
-            {
+            case OP_vkCmdSetEvent: {
                 android::base::beginTrace("vkCmdSetEvent subdecode");
                 VkEvent event;
                 VkPipelineStageFlags stageMask;
@@ -966,14 +937,14 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkEvent*)&event = (VkEvent)unbox_VkEvent((VkEvent)(*&cgen_var_0));
-                memcpy((VkPipelineStageFlags*)&stageMask, *readStreamPtrPtr, sizeof(VkPipelineStageFlags));
+                memcpy((VkPipelineStageFlags*)&stageMask, *readStreamPtrPtr,
+                       sizeof(VkPipelineStageFlags));
                 *readStreamPtrPtr += sizeof(VkPipelineStageFlags);
                 vk->vkCmdSetEvent((VkCommandBuffer)dispatchHandle, event, stageMask);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdResetEvent:
-            {
+            case OP_vkCmdResetEvent: {
                 android::base::beginTrace("vkCmdResetEvent subdecode");
                 VkEvent event;
                 VkPipelineStageFlags stageMask;
@@ -981,14 +952,14 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkEvent*)&event = (VkEvent)unbox_VkEvent((VkEvent)(*&cgen_var_0));
-                memcpy((VkPipelineStageFlags*)&stageMask, *readStreamPtrPtr, sizeof(VkPipelineStageFlags));
+                memcpy((VkPipelineStageFlags*)&stageMask, *readStreamPtrPtr,
+                       sizeof(VkPipelineStageFlags));
                 *readStreamPtrPtr += sizeof(VkPipelineStageFlags);
                 vk->vkCmdResetEvent((VkCommandBuffer)dispatchHandle, event, stageMask);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdWaitEvents:
-            {
+            case OP_vkCmdWaitEvents: {
                 android::base::beginTrace("vkCmdWaitEvents subdecode");
                 uint32_t eventCount;
                 const VkEvent* pEvents;
@@ -1006,97 +977,93 @@
                 VkImageMemoryBarrier stack_pImageMemoryBarriers[MAX_STACK_ITEMS];
                 memcpy((uint32_t*)&eventCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((eventCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((eventCount)) <= MAX_STACK_ITEMS) {
                     pEvents = (VkEvent*)stack_pEvents;
-                }
-                else
-                {
+                } else {
                     readStream->alloc((void**)&pEvents, ((eventCount)) * sizeof(const VkEvent));
                 }
-                if (((eventCount)))
-                {
+                if (((eventCount))) {
                     uint8_t* cgen_var_0_ptr = (uint8_t*)(*readStreamPtrPtr);
                     *readStreamPtrPtr += 8 * ((eventCount));
-                    for (uint32_t k = 0; k < ((eventCount)); ++k)
-                    {
-                        uint64_t tmpval; memcpy(&tmpval, cgen_var_0_ptr + k * 8, sizeof(uint64_t));
+                    for (uint32_t k = 0; k < ((eventCount)); ++k) {
+                        uint64_t tmpval;
+                        memcpy(&tmpval, cgen_var_0_ptr + k * 8, sizeof(uint64_t));
                         *(((VkEvent*)pEvents) + k) = (VkEvent)unbox_VkEvent((VkEvent)tmpval);
                     }
                 }
-                memcpy((VkPipelineStageFlags*)&srcStageMask, *readStreamPtrPtr, sizeof(VkPipelineStageFlags));
+                memcpy((VkPipelineStageFlags*)&srcStageMask, *readStreamPtrPtr,
+                       sizeof(VkPipelineStageFlags));
                 *readStreamPtrPtr += sizeof(VkPipelineStageFlags);
-                memcpy((VkPipelineStageFlags*)&dstStageMask, *readStreamPtrPtr, sizeof(VkPipelineStageFlags));
+                memcpy((VkPipelineStageFlags*)&dstStageMask, *readStreamPtrPtr,
+                       sizeof(VkPipelineStageFlags));
                 *readStreamPtrPtr += sizeof(VkPipelineStageFlags);
                 memcpy((uint32_t*)&memoryBarrierCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((memoryBarrierCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((memoryBarrierCount)) <= MAX_STACK_ITEMS) {
                     pMemoryBarriers = (VkMemoryBarrier*)stack_pMemoryBarriers;
+                } else {
+                    readStream->alloc((void**)&pMemoryBarriers,
+                                      ((memoryBarrierCount)) * sizeof(const VkMemoryBarrier));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pMemoryBarriers, ((memoryBarrierCount)) * sizeof(const VkMemoryBarrier));
-                }
-                for (uint32_t i = 0; i < (uint32_t)((memoryBarrierCount)); ++i)
-                {
-                    reservedunmarshal_VkMemoryBarrier(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryBarrier*)(pMemoryBarriers + i), readStreamPtrPtr);
+                for (uint32_t i = 0; i < (uint32_t)((memoryBarrierCount)); ++i) {
+                    reservedunmarshal_VkMemoryBarrier(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                      (VkMemoryBarrier*)(pMemoryBarriers + i),
+                                                      readStreamPtrPtr);
                 }
                 memcpy((uint32_t*)&bufferMemoryBarrierCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((bufferMemoryBarrierCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((bufferMemoryBarrierCount)) <= MAX_STACK_ITEMS) {
                     pBufferMemoryBarriers = (VkBufferMemoryBarrier*)stack_pBufferMemoryBarriers;
+                } else {
+                    readStream->alloc(
+                        (void**)&pBufferMemoryBarriers,
+                        ((bufferMemoryBarrierCount)) * sizeof(const VkBufferMemoryBarrier));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pBufferMemoryBarriers, ((bufferMemoryBarrierCount)) * sizeof(const VkBufferMemoryBarrier));
-                }
-                for (uint32_t i = 0; i < (uint32_t)((bufferMemoryBarrierCount)); ++i)
-                {
-                    reservedunmarshal_VkBufferMemoryBarrier(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferMemoryBarrier*)(pBufferMemoryBarriers + i), readStreamPtrPtr);
+                for (uint32_t i = 0; i < (uint32_t)((bufferMemoryBarrierCount)); ++i) {
+                    reservedunmarshal_VkBufferMemoryBarrier(
+                        readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkBufferMemoryBarrier*)(pBufferMemoryBarriers + i), readStreamPtrPtr);
                 }
                 memcpy((uint32_t*)&imageMemoryBarrierCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((imageMemoryBarrierCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((imageMemoryBarrierCount)) <= MAX_STACK_ITEMS) {
                     pImageMemoryBarriers = (VkImageMemoryBarrier*)stack_pImageMemoryBarriers;
+                } else {
+                    readStream->alloc(
+                        (void**)&pImageMemoryBarriers,
+                        ((imageMemoryBarrierCount)) * sizeof(const VkImageMemoryBarrier));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pImageMemoryBarriers, ((imageMemoryBarrierCount)) * sizeof(const VkImageMemoryBarrier));
+                for (uint32_t i = 0; i < (uint32_t)((imageMemoryBarrierCount)); ++i) {
+                    reservedunmarshal_VkImageMemoryBarrier(
+                        readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkImageMemoryBarrier*)(pImageMemoryBarriers + i), readStreamPtrPtr);
                 }
-                for (uint32_t i = 0; i < (uint32_t)((imageMemoryBarrierCount)); ++i)
-                {
-                    reservedunmarshal_VkImageMemoryBarrier(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageMemoryBarrier*)(pImageMemoryBarriers + i), readStreamPtrPtr);
-                }
-                if (pMemoryBarriers)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((memoryBarrierCount)); ++i)
-                    {
-                        transform_tohost_VkMemoryBarrier(globalstate, (VkMemoryBarrier*)(pMemoryBarriers + i));
+                if (pMemoryBarriers) {
+                    for (uint32_t i = 0; i < (uint32_t)((memoryBarrierCount)); ++i) {
+                        transform_tohost_VkMemoryBarrier(globalstate,
+                                                         (VkMemoryBarrier*)(pMemoryBarriers + i));
                     }
                 }
-                if (pBufferMemoryBarriers)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((bufferMemoryBarrierCount)); ++i)
-                    {
-                        transform_tohost_VkBufferMemoryBarrier(globalstate, (VkBufferMemoryBarrier*)(pBufferMemoryBarriers + i));
+                if (pBufferMemoryBarriers) {
+                    for (uint32_t i = 0; i < (uint32_t)((bufferMemoryBarrierCount)); ++i) {
+                        transform_tohost_VkBufferMemoryBarrier(
+                            globalstate, (VkBufferMemoryBarrier*)(pBufferMemoryBarriers + i));
                     }
                 }
-                if (pImageMemoryBarriers)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((imageMemoryBarrierCount)); ++i)
-                    {
-                        transform_tohost_VkImageMemoryBarrier(globalstate, (VkImageMemoryBarrier*)(pImageMemoryBarriers + i));
+                if (pImageMemoryBarriers) {
+                    for (uint32_t i = 0; i < (uint32_t)((imageMemoryBarrierCount)); ++i) {
+                        transform_tohost_VkImageMemoryBarrier(
+                            globalstate, (VkImageMemoryBarrier*)(pImageMemoryBarriers + i));
                     }
                 }
-                vk->vkCmdWaitEvents((VkCommandBuffer)dispatchHandle, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
+                vk->vkCmdWaitEvents((VkCommandBuffer)dispatchHandle, eventCount, pEvents,
+                                    srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
+                                    bufferMemoryBarrierCount, pBufferMemoryBarriers,
+                                    imageMemoryBarrierCount, pImageMemoryBarriers);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdPipelineBarrier:
-            {
+            case OP_vkCmdPipelineBarrier: {
                 android::base::beginTrace("vkCmdPipelineBarrier subdecode");
                 VkPipelineStageFlags srcStageMask;
                 VkPipelineStageFlags dstStageMask;
@@ -1110,81 +1077,82 @@
                 uint32_t imageMemoryBarrierCount;
                 const VkImageMemoryBarrier* pImageMemoryBarriers;
                 VkImageMemoryBarrier stack_pImageMemoryBarriers[MAX_STACK_ITEMS];
-                memcpy((VkPipelineStageFlags*)&srcStageMask, *readStreamPtrPtr, sizeof(VkPipelineStageFlags));
+                memcpy((VkPipelineStageFlags*)&srcStageMask, *readStreamPtrPtr,
+                       sizeof(VkPipelineStageFlags));
                 *readStreamPtrPtr += sizeof(VkPipelineStageFlags);
-                memcpy((VkPipelineStageFlags*)&dstStageMask, *readStreamPtrPtr, sizeof(VkPipelineStageFlags));
+                memcpy((VkPipelineStageFlags*)&dstStageMask, *readStreamPtrPtr,
+                       sizeof(VkPipelineStageFlags));
                 *readStreamPtrPtr += sizeof(VkPipelineStageFlags);
-                memcpy((VkDependencyFlags*)&dependencyFlags, *readStreamPtrPtr, sizeof(VkDependencyFlags));
+                memcpy((VkDependencyFlags*)&dependencyFlags, *readStreamPtrPtr,
+                       sizeof(VkDependencyFlags));
                 *readStreamPtrPtr += sizeof(VkDependencyFlags);
                 memcpy((uint32_t*)&memoryBarrierCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((memoryBarrierCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((memoryBarrierCount)) <= MAX_STACK_ITEMS) {
                     pMemoryBarriers = (VkMemoryBarrier*)stack_pMemoryBarriers;
+                } else {
+                    readStream->alloc((void**)&pMemoryBarriers,
+                                      ((memoryBarrierCount)) * sizeof(const VkMemoryBarrier));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pMemoryBarriers, ((memoryBarrierCount)) * sizeof(const VkMemoryBarrier));
-                }
-                for (uint32_t i = 0; i < (uint32_t)((memoryBarrierCount)); ++i)
-                {
-                    reservedunmarshal_VkMemoryBarrier(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryBarrier*)(pMemoryBarriers + i), readStreamPtrPtr);
+                for (uint32_t i = 0; i < (uint32_t)((memoryBarrierCount)); ++i) {
+                    reservedunmarshal_VkMemoryBarrier(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                      (VkMemoryBarrier*)(pMemoryBarriers + i),
+                                                      readStreamPtrPtr);
                 }
                 memcpy((uint32_t*)&bufferMemoryBarrierCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((bufferMemoryBarrierCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((bufferMemoryBarrierCount)) <= MAX_STACK_ITEMS) {
                     pBufferMemoryBarriers = (VkBufferMemoryBarrier*)stack_pBufferMemoryBarriers;
+                } else {
+                    readStream->alloc(
+                        (void**)&pBufferMemoryBarriers,
+                        ((bufferMemoryBarrierCount)) * sizeof(const VkBufferMemoryBarrier));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pBufferMemoryBarriers, ((bufferMemoryBarrierCount)) * sizeof(const VkBufferMemoryBarrier));
-                }
-                for (uint32_t i = 0; i < (uint32_t)((bufferMemoryBarrierCount)); ++i)
-                {
-                    reservedunmarshal_VkBufferMemoryBarrier(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBufferMemoryBarrier*)(pBufferMemoryBarriers + i), readStreamPtrPtr);
+                for (uint32_t i = 0; i < (uint32_t)((bufferMemoryBarrierCount)); ++i) {
+                    reservedunmarshal_VkBufferMemoryBarrier(
+                        readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkBufferMemoryBarrier*)(pBufferMemoryBarriers + i), readStreamPtrPtr);
                 }
                 memcpy((uint32_t*)&imageMemoryBarrierCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((imageMemoryBarrierCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((imageMemoryBarrierCount)) <= MAX_STACK_ITEMS) {
                     pImageMemoryBarriers = (VkImageMemoryBarrier*)stack_pImageMemoryBarriers;
+                } else {
+                    readStream->alloc(
+                        (void**)&pImageMemoryBarriers,
+                        ((imageMemoryBarrierCount)) * sizeof(const VkImageMemoryBarrier));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pImageMemoryBarriers, ((imageMemoryBarrierCount)) * sizeof(const VkImageMemoryBarrier));
+                for (uint32_t i = 0; i < (uint32_t)((imageMemoryBarrierCount)); ++i) {
+                    reservedunmarshal_VkImageMemoryBarrier(
+                        readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkImageMemoryBarrier*)(pImageMemoryBarriers + i), readStreamPtrPtr);
                 }
-                for (uint32_t i = 0; i < (uint32_t)((imageMemoryBarrierCount)); ++i)
-                {
-                    reservedunmarshal_VkImageMemoryBarrier(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageMemoryBarrier*)(pImageMemoryBarriers + i), readStreamPtrPtr);
-                }
-                if (pMemoryBarriers)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((memoryBarrierCount)); ++i)
-                    {
-                        transform_tohost_VkMemoryBarrier(globalstate, (VkMemoryBarrier*)(pMemoryBarriers + i));
+                if (pMemoryBarriers) {
+                    for (uint32_t i = 0; i < (uint32_t)((memoryBarrierCount)); ++i) {
+                        transform_tohost_VkMemoryBarrier(globalstate,
+                                                         (VkMemoryBarrier*)(pMemoryBarriers + i));
                     }
                 }
-                if (pBufferMemoryBarriers)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((bufferMemoryBarrierCount)); ++i)
-                    {
-                        transform_tohost_VkBufferMemoryBarrier(globalstate, (VkBufferMemoryBarrier*)(pBufferMemoryBarriers + i));
+                if (pBufferMemoryBarriers) {
+                    for (uint32_t i = 0; i < (uint32_t)((bufferMemoryBarrierCount)); ++i) {
+                        transform_tohost_VkBufferMemoryBarrier(
+                            globalstate, (VkBufferMemoryBarrier*)(pBufferMemoryBarriers + i));
                     }
                 }
-                if (pImageMemoryBarriers)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((imageMemoryBarrierCount)); ++i)
-                    {
-                        transform_tohost_VkImageMemoryBarrier(globalstate, (VkImageMemoryBarrier*)(pImageMemoryBarriers + i));
+                if (pImageMemoryBarriers) {
+                    for (uint32_t i = 0; i < (uint32_t)((imageMemoryBarrierCount)); ++i) {
+                        transform_tohost_VkImageMemoryBarrier(
+                            globalstate, (VkImageMemoryBarrier*)(pImageMemoryBarriers + i));
                     }
                 }
-                this->on_vkCmdPipelineBarrier(pool, (VkCommandBuffer)(boxed_dispatchHandle), srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
+                this->on_vkCmdPipelineBarrier(
+                    pool, (VkCommandBuffer)(boxed_dispatchHandle), srcStageMask, dstStageMask,
+                    dependencyFlags, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
+                    pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdBeginQuery:
-            {
+            case OP_vkCmdBeginQuery: {
                 android::base::beginTrace("vkCmdBeginQuery subdecode");
                 VkQueryPool queryPool;
                 uint32_t query;
@@ -1192,32 +1160,33 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkQueryPool*)&queryPool = (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_0));
+                *(VkQueryPool*)&queryPool =
+                    (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_0));
                 memcpy((uint32_t*)&query, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                memcpy((VkQueryControlFlags*)&flags, *readStreamPtrPtr, sizeof(VkQueryControlFlags));
+                memcpy((VkQueryControlFlags*)&flags, *readStreamPtrPtr,
+                       sizeof(VkQueryControlFlags));
                 *readStreamPtrPtr += sizeof(VkQueryControlFlags);
                 vk->vkCmdBeginQuery((VkCommandBuffer)dispatchHandle, queryPool, query, flags);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdEndQuery:
-            {
+            case OP_vkCmdEndQuery: {
                 android::base::beginTrace("vkCmdEndQuery subdecode");
                 VkQueryPool queryPool;
                 uint32_t query;
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkQueryPool*)&queryPool = (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_0));
+                *(VkQueryPool*)&queryPool =
+                    (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_0));
                 memcpy((uint32_t*)&query, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 vk->vkCmdEndQuery((VkCommandBuffer)dispatchHandle, queryPool, query);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdResetQueryPool:
-            {
+            case OP_vkCmdResetQueryPool: {
                 android::base::beginTrace("vkCmdResetQueryPool subdecode");
                 VkQueryPool queryPool;
                 uint32_t firstQuery;
@@ -1225,35 +1194,38 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkQueryPool*)&queryPool = (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_0));
+                *(VkQueryPool*)&queryPool =
+                    (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_0));
                 memcpy((uint32_t*)&firstQuery, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&queryCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdResetQueryPool((VkCommandBuffer)dispatchHandle, queryPool, firstQuery, queryCount);
+                vk->vkCmdResetQueryPool((VkCommandBuffer)dispatchHandle, queryPool, firstQuery,
+                                        queryCount);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdWriteTimestamp:
-            {
+            case OP_vkCmdWriteTimestamp: {
                 android::base::beginTrace("vkCmdWriteTimestamp subdecode");
                 VkPipelineStageFlagBits pipelineStage;
                 VkQueryPool queryPool;
                 uint32_t query;
-                memcpy((VkPipelineStageFlagBits*)&pipelineStage, *readStreamPtrPtr, sizeof(VkPipelineStageFlagBits));
+                memcpy((VkPipelineStageFlagBits*)&pipelineStage, *readStreamPtrPtr,
+                       sizeof(VkPipelineStageFlagBits));
                 *readStreamPtrPtr += sizeof(VkPipelineStageFlagBits);
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkQueryPool*)&queryPool = (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_0));
+                *(VkQueryPool*)&queryPool =
+                    (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_0));
                 memcpy((uint32_t*)&query, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdWriteTimestamp((VkCommandBuffer)dispatchHandle, pipelineStage, queryPool, query);
+                vk->vkCmdWriteTimestamp((VkCommandBuffer)dispatchHandle, pipelineStage, queryPool,
+                                        query);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdCopyQueryPoolResults:
-            {
+            case OP_vkCmdCopyQueryPoolResults: {
                 android::base::beginTrace("vkCmdCopyQueryPoolResults subdecode");
                 VkQueryPool queryPool;
                 uint32_t firstQuery;
@@ -1265,7 +1237,8 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkQueryPool*)&queryPool = (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_0));
+                *(VkQueryPool*)&queryPool =
+                    (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_0));
                 memcpy((uint32_t*)&firstQuery, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&queryCount, *readStreamPtrPtr, sizeof(uint32_t));
@@ -1280,12 +1253,13 @@
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
                 memcpy((VkQueryResultFlags*)&flags, *readStreamPtrPtr, sizeof(VkQueryResultFlags));
                 *readStreamPtrPtr += sizeof(VkQueryResultFlags);
-                this->on_vkCmdCopyQueryPoolResults(pool, (VkCommandBuffer)(boxed_dispatchHandle), queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
+                this->on_vkCmdCopyQueryPoolResults(pool, (VkCommandBuffer)(boxed_dispatchHandle),
+                                                   queryPool, firstQuery, queryCount, dstBuffer,
+                                                   dstOffset, stride, flags);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdPushConstants:
-            {
+            case OP_vkCmdPushConstants: {
                 android::base::beginTrace("vkCmdPushConstants subdecode");
                 VkPipelineLayout layout;
                 VkShaderStageFlags stageFlags;
@@ -1296,47 +1270,48 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPipelineLayout*)&layout = (VkPipelineLayout)unbox_VkPipelineLayout((VkPipelineLayout)(*&cgen_var_0));
-                memcpy((VkShaderStageFlags*)&stageFlags, *readStreamPtrPtr, sizeof(VkShaderStageFlags));
+                *(VkPipelineLayout*)&layout =
+                    (VkPipelineLayout)unbox_VkPipelineLayout((VkPipelineLayout)(*&cgen_var_0));
+                memcpy((VkShaderStageFlags*)&stageFlags, *readStreamPtrPtr,
+                       sizeof(VkShaderStageFlags));
                 *readStreamPtrPtr += sizeof(VkShaderStageFlags);
                 memcpy((uint32_t*)&offset, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&size, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((size)) <= MAX_STACK_ITEMS)
-                {
+                if (((size)) <= MAX_STACK_ITEMS) {
                     pValues = (void*)stack_pValues;
-                }
-                else
-                {
+                } else {
                     readStream->alloc((void**)&pValues, ((size)) * sizeof(const uint8_t));
                 }
                 memcpy((void*)pValues, *readStreamPtrPtr, ((size)) * sizeof(const uint8_t));
                 *readStreamPtrPtr += ((size)) * sizeof(const uint8_t);
-                vk->vkCmdPushConstants((VkCommandBuffer)dispatchHandle, layout, stageFlags, offset, size, pValues);
+                vk->vkCmdPushConstants((VkCommandBuffer)dispatchHandle, layout, stageFlags, offset,
+                                       size, pValues);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdBeginRenderPass:
-            {
+            case OP_vkCmdBeginRenderPass: {
                 android::base::beginTrace("vkCmdBeginRenderPass subdecode");
                 const VkRenderPassBeginInfo* pRenderPassBegin;
                 VkRenderPassBeginInfo stack_pRenderPassBegin[1];
                 VkSubpassContents contents;
                 pRenderPassBegin = (VkRenderPassBeginInfo*)stack_pRenderPassBegin;
-                reservedunmarshal_VkRenderPassBeginInfo(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRenderPassBeginInfo*)(pRenderPassBegin), readStreamPtrPtr);
+                reservedunmarshal_VkRenderPassBeginInfo(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                        (VkRenderPassBeginInfo*)(pRenderPassBegin),
+                                                        readStreamPtrPtr);
                 memcpy((VkSubpassContents*)&contents, *readStreamPtrPtr, sizeof(VkSubpassContents));
                 *readStreamPtrPtr += sizeof(VkSubpassContents);
-                if (pRenderPassBegin)
-                {
-                    transform_tohost_VkRenderPassBeginInfo(globalstate, (VkRenderPassBeginInfo*)(pRenderPassBegin));
+                if (pRenderPassBegin) {
+                    transform_tohost_VkRenderPassBeginInfo(
+                        globalstate, (VkRenderPassBeginInfo*)(pRenderPassBegin));
                 }
-                vk->vkCmdBeginRenderPass((VkCommandBuffer)dispatchHandle, pRenderPassBegin, contents);
+                vk->vkCmdBeginRenderPass((VkCommandBuffer)dispatchHandle, pRenderPassBegin,
+                                         contents);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdNextSubpass:
-            {
+            case OP_vkCmdNextSubpass: {
                 android::base::beginTrace("vkCmdNextSubpass subdecode");
                 VkSubpassContents contents;
                 memcpy((VkSubpassContents*)&contents, *readStreamPtrPtr, sizeof(VkSubpassContents));
@@ -1345,47 +1320,43 @@
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdEndRenderPass:
-            {
+            case OP_vkCmdEndRenderPass: {
                 android::base::beginTrace("vkCmdEndRenderPass subdecode");
                 vk->vkCmdEndRenderPass((VkCommandBuffer)dispatchHandle);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdExecuteCommands:
-            {
+            case OP_vkCmdExecuteCommands: {
                 android::base::beginTrace("vkCmdExecuteCommands subdecode");
                 uint32_t commandBufferCount;
                 const VkCommandBuffer* pCommandBuffers;
                 VkCommandBuffer stack_pCommandBuffers[MAX_STACK_ITEMS];
                 memcpy((uint32_t*)&commandBufferCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((commandBufferCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((commandBufferCount)) <= MAX_STACK_ITEMS) {
                     pCommandBuffers = (VkCommandBuffer*)stack_pCommandBuffers;
+                } else {
+                    readStream->alloc((void**)&pCommandBuffers,
+                                      ((commandBufferCount)) * sizeof(const VkCommandBuffer));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pCommandBuffers, ((commandBufferCount)) * sizeof(const VkCommandBuffer));
-                }
-                if (((commandBufferCount)))
-                {
+                if (((commandBufferCount))) {
                     uint8_t* cgen_var_0_ptr = (uint8_t*)(*readStreamPtrPtr);
                     *readStreamPtrPtr += 8 * ((commandBufferCount));
-                    for (uint32_t k = 0; k < ((commandBufferCount)); ++k)
-                    {
-                        uint64_t tmpval; memcpy(&tmpval, cgen_var_0_ptr + k * 8, sizeof(uint64_t));
-                        *(((VkCommandBuffer*)pCommandBuffers) + k) = (VkCommandBuffer)unbox_VkCommandBuffer((VkCommandBuffer)tmpval);
+                    for (uint32_t k = 0; k < ((commandBufferCount)); ++k) {
+                        uint64_t tmpval;
+                        memcpy(&tmpval, cgen_var_0_ptr + k * 8, sizeof(uint64_t));
+                        *(((VkCommandBuffer*)pCommandBuffers) + k) =
+                            (VkCommandBuffer)unbox_VkCommandBuffer((VkCommandBuffer)tmpval);
                     }
                 }
-                this->on_vkCmdExecuteCommands(pool, (VkCommandBuffer)(boxed_dispatchHandle), commandBufferCount, pCommandBuffers);
+                this->on_vkCmdExecuteCommands(pool, (VkCommandBuffer)(boxed_dispatchHandle),
+                                              commandBufferCount, pCommandBuffers);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_VERSION_1_1
-            case OP_vkCmdSetDeviceMask:
-            {
+            case OP_vkCmdSetDeviceMask: {
                 android::base::beginTrace("vkCmdSetDeviceMask subdecode");
                 uint32_t deviceMask;
                 memcpy((uint32_t*)&deviceMask, *readStreamPtrPtr, sizeof(uint32_t));
@@ -1394,8 +1365,7 @@
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdDispatchBase:
-            {
+            case OP_vkCmdDispatchBase: {
                 android::base::beginTrace("vkCmdDispatchBase subdecode");
                 uint32_t baseGroupX;
                 uint32_t baseGroupY;
@@ -1415,14 +1385,14 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&groupCountZ, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdDispatchBase((VkCommandBuffer)dispatchHandle, baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ);
+                vk->vkCmdDispatchBase((VkCommandBuffer)dispatchHandle, baseGroupX, baseGroupY,
+                                      baseGroupZ, groupCountX, groupCountY, groupCountZ);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_VERSION_1_2
-            case OP_vkCmdDrawIndirectCount:
-            {
+            case OP_vkCmdDrawIndirectCount: {
                 android::base::beginTrace("vkCmdDrawIndirectCount subdecode");
                 VkBuffer buffer;
                 VkDeviceSize offset;
@@ -1446,12 +1416,12 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&stride, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdDrawIndirectCount((VkCommandBuffer)dispatchHandle, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+                vk->vkCmdDrawIndirectCount((VkCommandBuffer)dispatchHandle, buffer, offset,
+                                           countBuffer, countBufferOffset, maxDrawCount, stride);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdDrawIndexedIndirectCount:
-            {
+            case OP_vkCmdDrawIndexedIndirectCount: {
                 android::base::beginTrace("vkCmdDrawIndexedIndirectCount subdecode");
                 VkBuffer buffer;
                 VkDeviceSize offset;
@@ -1475,66 +1445,77 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&stride, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdDrawIndexedIndirectCount((VkCommandBuffer)dispatchHandle, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+                vk->vkCmdDrawIndexedIndirectCount((VkCommandBuffer)dispatchHandle, buffer, offset,
+                                                  countBuffer, countBufferOffset, maxDrawCount,
+                                                  stride);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdBeginRenderPass2:
-            {
+            case OP_vkCmdBeginRenderPass2: {
                 android::base::beginTrace("vkCmdBeginRenderPass2 subdecode");
                 const VkRenderPassBeginInfo* pRenderPassBegin;
                 VkRenderPassBeginInfo stack_pRenderPassBegin[1];
                 const VkSubpassBeginInfo* pSubpassBeginInfo;
                 VkSubpassBeginInfo stack_pSubpassBeginInfo[1];
                 pRenderPassBegin = (VkRenderPassBeginInfo*)stack_pRenderPassBegin;
-                reservedunmarshal_VkRenderPassBeginInfo(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRenderPassBeginInfo*)(pRenderPassBegin), readStreamPtrPtr);
+                reservedunmarshal_VkRenderPassBeginInfo(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                        (VkRenderPassBeginInfo*)(pRenderPassBegin),
+                                                        readStreamPtrPtr);
                 pSubpassBeginInfo = (VkSubpassBeginInfo*)stack_pSubpassBeginInfo;
-                reservedunmarshal_VkSubpassBeginInfo(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubpassBeginInfo*)(pSubpassBeginInfo), readStreamPtrPtr);
-                if (pRenderPassBegin)
-                {
-                    transform_tohost_VkRenderPassBeginInfo(globalstate, (VkRenderPassBeginInfo*)(pRenderPassBegin));
+                reservedunmarshal_VkSubpassBeginInfo(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                     (VkSubpassBeginInfo*)(pSubpassBeginInfo),
+                                                     readStreamPtrPtr);
+                if (pRenderPassBegin) {
+                    transform_tohost_VkRenderPassBeginInfo(
+                        globalstate, (VkRenderPassBeginInfo*)(pRenderPassBegin));
                 }
-                if (pSubpassBeginInfo)
-                {
-                    transform_tohost_VkSubpassBeginInfo(globalstate, (VkSubpassBeginInfo*)(pSubpassBeginInfo));
+                if (pSubpassBeginInfo) {
+                    transform_tohost_VkSubpassBeginInfo(globalstate,
+                                                        (VkSubpassBeginInfo*)(pSubpassBeginInfo));
                 }
-                vk->vkCmdBeginRenderPass2((VkCommandBuffer)dispatchHandle, pRenderPassBegin, pSubpassBeginInfo);
+                vk->vkCmdBeginRenderPass2((VkCommandBuffer)dispatchHandle, pRenderPassBegin,
+                                          pSubpassBeginInfo);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdNextSubpass2:
-            {
+            case OP_vkCmdNextSubpass2: {
                 android::base::beginTrace("vkCmdNextSubpass2 subdecode");
                 const VkSubpassBeginInfo* pSubpassBeginInfo;
                 VkSubpassBeginInfo stack_pSubpassBeginInfo[1];
                 const VkSubpassEndInfo* pSubpassEndInfo;
                 VkSubpassEndInfo stack_pSubpassEndInfo[1];
                 pSubpassBeginInfo = (VkSubpassBeginInfo*)stack_pSubpassBeginInfo;
-                reservedunmarshal_VkSubpassBeginInfo(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubpassBeginInfo*)(pSubpassBeginInfo), readStreamPtrPtr);
+                reservedunmarshal_VkSubpassBeginInfo(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                     (VkSubpassBeginInfo*)(pSubpassBeginInfo),
+                                                     readStreamPtrPtr);
                 pSubpassEndInfo = (VkSubpassEndInfo*)stack_pSubpassEndInfo;
-                reservedunmarshal_VkSubpassEndInfo(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubpassEndInfo*)(pSubpassEndInfo), readStreamPtrPtr);
-                if (pSubpassBeginInfo)
-                {
-                    transform_tohost_VkSubpassBeginInfo(globalstate, (VkSubpassBeginInfo*)(pSubpassBeginInfo));
+                reservedunmarshal_VkSubpassEndInfo(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                   (VkSubpassEndInfo*)(pSubpassEndInfo),
+                                                   readStreamPtrPtr);
+                if (pSubpassBeginInfo) {
+                    transform_tohost_VkSubpassBeginInfo(globalstate,
+                                                        (VkSubpassBeginInfo*)(pSubpassBeginInfo));
                 }
-                if (pSubpassEndInfo)
-                {
-                    transform_tohost_VkSubpassEndInfo(globalstate, (VkSubpassEndInfo*)(pSubpassEndInfo));
+                if (pSubpassEndInfo) {
+                    transform_tohost_VkSubpassEndInfo(globalstate,
+                                                      (VkSubpassEndInfo*)(pSubpassEndInfo));
                 }
-                vk->vkCmdNextSubpass2((VkCommandBuffer)dispatchHandle, pSubpassBeginInfo, pSubpassEndInfo);
+                vk->vkCmdNextSubpass2((VkCommandBuffer)dispatchHandle, pSubpassBeginInfo,
+                                      pSubpassEndInfo);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdEndRenderPass2:
-            {
+            case OP_vkCmdEndRenderPass2: {
                 android::base::beginTrace("vkCmdEndRenderPass2 subdecode");
                 const VkSubpassEndInfo* pSubpassEndInfo;
                 VkSubpassEndInfo stack_pSubpassEndInfo[1];
                 pSubpassEndInfo = (VkSubpassEndInfo*)stack_pSubpassEndInfo;
-                reservedunmarshal_VkSubpassEndInfo(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubpassEndInfo*)(pSubpassEndInfo), readStreamPtrPtr);
-                if (pSubpassEndInfo)
-                {
-                    transform_tohost_VkSubpassEndInfo(globalstate, (VkSubpassEndInfo*)(pSubpassEndInfo));
+                reservedunmarshal_VkSubpassEndInfo(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                   (VkSubpassEndInfo*)(pSubpassEndInfo),
+                                                   readStreamPtrPtr);
+                if (pSubpassEndInfo) {
+                    transform_tohost_VkSubpassEndInfo(globalstate,
+                                                      (VkSubpassEndInfo*)(pSubpassEndInfo));
                 }
                 vk->vkCmdEndRenderPass2((VkCommandBuffer)dispatchHandle, pSubpassEndInfo);
                 android::base::endTrace();
@@ -1562,46 +1543,49 @@
 #ifdef VK_KHR_sampler_mirror_clamp_to_edge
 #endif
 #ifdef VK_KHR_video_queue
-            case OP_vkCmdBeginVideoCodingKHR:
-            {
+            case OP_vkCmdBeginVideoCodingKHR: {
                 android::base::beginTrace("vkCmdBeginVideoCodingKHR subdecode");
                 const VkVideoBeginCodingInfoKHR* pBeginInfo;
                 VkVideoBeginCodingInfoKHR stack_pBeginInfo[1];
                 pBeginInfo = (VkVideoBeginCodingInfoKHR*)stack_pBeginInfo;
-                reservedunmarshal_VkVideoBeginCodingInfoKHR(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkVideoBeginCodingInfoKHR*)(pBeginInfo), readStreamPtrPtr);
-                if (pBeginInfo)
-                {
-                    transform_tohost_VkVideoBeginCodingInfoKHR(globalstate, (VkVideoBeginCodingInfoKHR*)(pBeginInfo));
+                reservedunmarshal_VkVideoBeginCodingInfoKHR(
+                    readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkVideoBeginCodingInfoKHR*)(pBeginInfo), readStreamPtrPtr);
+                if (pBeginInfo) {
+                    transform_tohost_VkVideoBeginCodingInfoKHR(
+                        globalstate, (VkVideoBeginCodingInfoKHR*)(pBeginInfo));
                 }
                 vk->vkCmdBeginVideoCodingKHR((VkCommandBuffer)dispatchHandle, pBeginInfo);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdEndVideoCodingKHR:
-            {
+            case OP_vkCmdEndVideoCodingKHR: {
                 android::base::beginTrace("vkCmdEndVideoCodingKHR subdecode");
                 const VkVideoEndCodingInfoKHR* pEndCodingInfo;
                 VkVideoEndCodingInfoKHR stack_pEndCodingInfo[1];
                 pEndCodingInfo = (VkVideoEndCodingInfoKHR*)stack_pEndCodingInfo;
-                reservedunmarshal_VkVideoEndCodingInfoKHR(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkVideoEndCodingInfoKHR*)(pEndCodingInfo), readStreamPtrPtr);
-                if (pEndCodingInfo)
-                {
-                    transform_tohost_VkVideoEndCodingInfoKHR(globalstate, (VkVideoEndCodingInfoKHR*)(pEndCodingInfo));
+                reservedunmarshal_VkVideoEndCodingInfoKHR(
+                    readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkVideoEndCodingInfoKHR*)(pEndCodingInfo), readStreamPtrPtr);
+                if (pEndCodingInfo) {
+                    transform_tohost_VkVideoEndCodingInfoKHR(
+                        globalstate, (VkVideoEndCodingInfoKHR*)(pEndCodingInfo));
                 }
                 vk->vkCmdEndVideoCodingKHR((VkCommandBuffer)dispatchHandle, pEndCodingInfo);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdControlVideoCodingKHR:
-            {
+            case OP_vkCmdControlVideoCodingKHR: {
                 android::base::beginTrace("vkCmdControlVideoCodingKHR subdecode");
                 const VkVideoCodingControlInfoKHR* pCodingControlInfo;
                 VkVideoCodingControlInfoKHR stack_pCodingControlInfo[1];
                 pCodingControlInfo = (VkVideoCodingControlInfoKHR*)stack_pCodingControlInfo;
-                reservedunmarshal_VkVideoCodingControlInfoKHR(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkVideoCodingControlInfoKHR*)(pCodingControlInfo), readStreamPtrPtr);
-                if (pCodingControlInfo)
-                {
-                    transform_tohost_VkVideoCodingControlInfoKHR(globalstate, (VkVideoCodingControlInfoKHR*)(pCodingControlInfo));
+                reservedunmarshal_VkVideoCodingControlInfoKHR(
+                    readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkVideoCodingControlInfoKHR*)(pCodingControlInfo), readStreamPtrPtr);
+                if (pCodingControlInfo) {
+                    transform_tohost_VkVideoCodingControlInfoKHR(
+                        globalstate, (VkVideoCodingControlInfoKHR*)(pCodingControlInfo));
                 }
                 vk->vkCmdControlVideoCodingKHR((VkCommandBuffer)dispatchHandle, pCodingControlInfo);
                 android::base::endTrace();
@@ -1609,16 +1593,17 @@
             }
 #endif
 #ifdef VK_KHR_video_decode_queue
-            case OP_vkCmdDecodeVideoKHR:
-            {
+            case OP_vkCmdDecodeVideoKHR: {
                 android::base::beginTrace("vkCmdDecodeVideoKHR subdecode");
                 const VkVideoDecodeInfoKHR* pFrameInfo;
                 VkVideoDecodeInfoKHR stack_pFrameInfo[1];
                 pFrameInfo = (VkVideoDecodeInfoKHR*)stack_pFrameInfo;
-                reservedunmarshal_VkVideoDecodeInfoKHR(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkVideoDecodeInfoKHR*)(pFrameInfo), readStreamPtrPtr);
-                if (pFrameInfo)
-                {
-                    transform_tohost_VkVideoDecodeInfoKHR(globalstate, (VkVideoDecodeInfoKHR*)(pFrameInfo));
+                reservedunmarshal_VkVideoDecodeInfoKHR(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                       (VkVideoDecodeInfoKHR*)(pFrameInfo),
+                                                       readStreamPtrPtr);
+                if (pFrameInfo) {
+                    transform_tohost_VkVideoDecodeInfoKHR(globalstate,
+                                                          (VkVideoDecodeInfoKHR*)(pFrameInfo));
                 }
                 vk->vkCmdDecodeVideoKHR((VkCommandBuffer)dispatchHandle, pFrameInfo);
                 android::base::endTrace();
@@ -1626,23 +1611,23 @@
             }
 #endif
 #ifdef VK_KHR_dynamic_rendering
-            case OP_vkCmdBeginRenderingKHR:
-            {
+            case OP_vkCmdBeginRenderingKHR: {
                 android::base::beginTrace("vkCmdBeginRenderingKHR subdecode");
                 const VkRenderingInfoKHR* pRenderingInfo;
                 VkRenderingInfoKHR stack_pRenderingInfo[1];
                 pRenderingInfo = (VkRenderingInfoKHR*)stack_pRenderingInfo;
-                reservedunmarshal_VkRenderingInfoKHR(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRenderingInfoKHR*)(pRenderingInfo), readStreamPtrPtr);
-                if (pRenderingInfo)
-                {
-                    transform_tohost_VkRenderingInfoKHR(globalstate, (VkRenderingInfoKHR*)(pRenderingInfo));
+                reservedunmarshal_VkRenderingInfoKHR(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                     (VkRenderingInfoKHR*)(pRenderingInfo),
+                                                     readStreamPtrPtr);
+                if (pRenderingInfo) {
+                    transform_tohost_VkRenderingInfoKHR(globalstate,
+                                                        (VkRenderingInfoKHR*)(pRenderingInfo));
                 }
                 vk->vkCmdBeginRenderingKHR((VkCommandBuffer)dispatchHandle, pRenderingInfo);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdEndRenderingKHR:
-            {
+            case OP_vkCmdEndRenderingKHR: {
                 android::base::beginTrace("vkCmdEndRenderingKHR subdecode");
                 vk->vkCmdEndRenderingKHR((VkCommandBuffer)dispatchHandle);
                 android::base::endTrace();
@@ -1654,8 +1639,7 @@
 #ifdef VK_KHR_get_physical_device_properties2
 #endif
 #ifdef VK_KHR_device_group
-            case OP_vkCmdSetDeviceMaskKHR:
-            {
+            case OP_vkCmdSetDeviceMaskKHR: {
                 android::base::beginTrace("vkCmdSetDeviceMaskKHR subdecode");
                 uint32_t deviceMask;
                 memcpy((uint32_t*)&deviceMask, *readStreamPtrPtr, sizeof(uint32_t));
@@ -1664,8 +1648,7 @@
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdDispatchBaseKHR:
-            {
+            case OP_vkCmdDispatchBaseKHR: {
                 android::base::beginTrace("vkCmdDispatchBaseKHR subdecode");
                 uint32_t baseGroupX;
                 uint32_t baseGroupY;
@@ -1685,7 +1668,8 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&groupCountZ, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdDispatchBaseKHR((VkCommandBuffer)dispatchHandle, baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ);
+                vk->vkCmdDispatchBaseKHR((VkCommandBuffer)dispatchHandle, baseGroupX, baseGroupY,
+                                         baseGroupZ, groupCountX, groupCountY, groupCountZ);
                 android::base::endTrace();
                 break;
             }
@@ -1715,8 +1699,7 @@
 #ifdef VK_KHR_external_semaphore_fd
 #endif
 #ifdef VK_KHR_push_descriptor
-            case OP_vkCmdPushDescriptorSetKHR:
-            {
+            case OP_vkCmdPushDescriptorSetKHR: {
                 android::base::beginTrace("vkCmdPushDescriptorSetKHR subdecode");
                 VkPipelineBindPoint pipelineBindPoint;
                 VkPipelineLayout layout;
@@ -1724,41 +1707,42 @@
                 uint32_t descriptorWriteCount;
                 const VkWriteDescriptorSet* pDescriptorWrites;
                 VkWriteDescriptorSet stack_pDescriptorWrites[MAX_STACK_ITEMS];
-                memcpy((VkPipelineBindPoint*)&pipelineBindPoint, *readStreamPtrPtr, sizeof(VkPipelineBindPoint));
+                memcpy((VkPipelineBindPoint*)&pipelineBindPoint, *readStreamPtrPtr,
+                       sizeof(VkPipelineBindPoint));
                 *readStreamPtrPtr += sizeof(VkPipelineBindPoint);
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPipelineLayout*)&layout = (VkPipelineLayout)unbox_VkPipelineLayout((VkPipelineLayout)(*&cgen_var_0));
+                *(VkPipelineLayout*)&layout =
+                    (VkPipelineLayout)unbox_VkPipelineLayout((VkPipelineLayout)(*&cgen_var_0));
                 memcpy((uint32_t*)&set, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&descriptorWriteCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((descriptorWriteCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((descriptorWriteCount)) <= MAX_STACK_ITEMS) {
                     pDescriptorWrites = (VkWriteDescriptorSet*)stack_pDescriptorWrites;
+                } else {
+                    readStream->alloc(
+                        (void**)&pDescriptorWrites,
+                        ((descriptorWriteCount)) * sizeof(const VkWriteDescriptorSet));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pDescriptorWrites, ((descriptorWriteCount)) * sizeof(const VkWriteDescriptorSet));
+                for (uint32_t i = 0; i < (uint32_t)((descriptorWriteCount)); ++i) {
+                    reservedunmarshal_VkWriteDescriptorSet(
+                        readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkWriteDescriptorSet*)(pDescriptorWrites + i), readStreamPtrPtr);
                 }
-                for (uint32_t i = 0; i < (uint32_t)((descriptorWriteCount)); ++i)
-                {
-                    reservedunmarshal_VkWriteDescriptorSet(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkWriteDescriptorSet*)(pDescriptorWrites + i), readStreamPtrPtr);
-                }
-                if (pDescriptorWrites)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((descriptorWriteCount)); ++i)
-                    {
-                        transform_tohost_VkWriteDescriptorSet(globalstate, (VkWriteDescriptorSet*)(pDescriptorWrites + i));
+                if (pDescriptorWrites) {
+                    for (uint32_t i = 0; i < (uint32_t)((descriptorWriteCount)); ++i) {
+                        transform_tohost_VkWriteDescriptorSet(
+                            globalstate, (VkWriteDescriptorSet*)(pDescriptorWrites + i));
                     }
                 }
-                vk->vkCmdPushDescriptorSetKHR((VkCommandBuffer)dispatchHandle, pipelineBindPoint, layout, set, descriptorWriteCount, pDescriptorWrites);
+                vk->vkCmdPushDescriptorSetKHR((VkCommandBuffer)dispatchHandle, pipelineBindPoint,
+                                              layout, set, descriptorWriteCount, pDescriptorWrites);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdPushDescriptorSetWithTemplateKHR:
-            {
+            case OP_vkCmdPushDescriptorSetWithTemplateKHR: {
                 android::base::beginTrace("vkCmdPushDescriptorSetWithTemplateKHR subdecode");
                 VkDescriptorUpdateTemplate descriptorUpdateTemplate;
                 VkPipelineLayout layout;
@@ -1768,24 +1752,27 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkDescriptorUpdateTemplate*)&descriptorUpdateTemplate = (VkDescriptorUpdateTemplate)unbox_VkDescriptorUpdateTemplate((VkDescriptorUpdateTemplate)(*&cgen_var_0));
+                *(VkDescriptorUpdateTemplate*)&descriptorUpdateTemplate =
+                    (VkDescriptorUpdateTemplate)unbox_VkDescriptorUpdateTemplate(
+                        (VkDescriptorUpdateTemplate)(*&cgen_var_0));
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkPipelineLayout*)&layout = (VkPipelineLayout)unbox_VkPipelineLayout((VkPipelineLayout)(*&cgen_var_1));
+                *(VkPipelineLayout*)&layout =
+                    (VkPipelineLayout)unbox_VkPipelineLayout((VkPipelineLayout)(*&cgen_var_1));
                 memcpy((uint32_t*)&set, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 // WARNING PTR CHECK
                 memcpy((void**)&pData, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pData);
                 *readStreamPtrPtr += 8;
-                if (pData)
-                {
+                if (pData) {
                     pData = (void*)stack_pData;
                     memcpy((void*)pData, *readStreamPtrPtr, sizeof(const uint8_t));
                     *readStreamPtrPtr += sizeof(const uint8_t);
                 }
-                vk->vkCmdPushDescriptorSetWithTemplateKHR((VkCommandBuffer)dispatchHandle, descriptorUpdateTemplate, layout, set, pData);
+                vk->vkCmdPushDescriptorSetWithTemplateKHR(
+                    (VkCommandBuffer)dispatchHandle, descriptorUpdateTemplate, layout, set, pData);
                 android::base::endTrace();
                 break;
             }
@@ -1801,62 +1788,71 @@
 #ifdef VK_KHR_imageless_framebuffer
 #endif
 #ifdef VK_KHR_create_renderpass2
-            case OP_vkCmdBeginRenderPass2KHR:
-            {
+            case OP_vkCmdBeginRenderPass2KHR: {
                 android::base::beginTrace("vkCmdBeginRenderPass2KHR subdecode");
                 const VkRenderPassBeginInfo* pRenderPassBegin;
                 VkRenderPassBeginInfo stack_pRenderPassBegin[1];
                 const VkSubpassBeginInfo* pSubpassBeginInfo;
                 VkSubpassBeginInfo stack_pSubpassBeginInfo[1];
                 pRenderPassBegin = (VkRenderPassBeginInfo*)stack_pRenderPassBegin;
-                reservedunmarshal_VkRenderPassBeginInfo(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRenderPassBeginInfo*)(pRenderPassBegin), readStreamPtrPtr);
+                reservedunmarshal_VkRenderPassBeginInfo(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                        (VkRenderPassBeginInfo*)(pRenderPassBegin),
+                                                        readStreamPtrPtr);
                 pSubpassBeginInfo = (VkSubpassBeginInfo*)stack_pSubpassBeginInfo;
-                reservedunmarshal_VkSubpassBeginInfo(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubpassBeginInfo*)(pSubpassBeginInfo), readStreamPtrPtr);
-                if (pRenderPassBegin)
-                {
-                    transform_tohost_VkRenderPassBeginInfo(globalstate, (VkRenderPassBeginInfo*)(pRenderPassBegin));
+                reservedunmarshal_VkSubpassBeginInfo(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                     (VkSubpassBeginInfo*)(pSubpassBeginInfo),
+                                                     readStreamPtrPtr);
+                if (pRenderPassBegin) {
+                    transform_tohost_VkRenderPassBeginInfo(
+                        globalstate, (VkRenderPassBeginInfo*)(pRenderPassBegin));
                 }
-                if (pSubpassBeginInfo)
-                {
-                    transform_tohost_VkSubpassBeginInfo(globalstate, (VkSubpassBeginInfo*)(pSubpassBeginInfo));
+                if (pSubpassBeginInfo) {
+                    transform_tohost_VkSubpassBeginInfo(globalstate,
+                                                        (VkSubpassBeginInfo*)(pSubpassBeginInfo));
                 }
-                vk->vkCmdBeginRenderPass2KHR((VkCommandBuffer)dispatchHandle, pRenderPassBegin, pSubpassBeginInfo);
+                vk->vkCmdBeginRenderPass2KHR((VkCommandBuffer)dispatchHandle, pRenderPassBegin,
+                                             pSubpassBeginInfo);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdNextSubpass2KHR:
-            {
+            case OP_vkCmdNextSubpass2KHR: {
                 android::base::beginTrace("vkCmdNextSubpass2KHR subdecode");
                 const VkSubpassBeginInfo* pSubpassBeginInfo;
                 VkSubpassBeginInfo stack_pSubpassBeginInfo[1];
                 const VkSubpassEndInfo* pSubpassEndInfo;
                 VkSubpassEndInfo stack_pSubpassEndInfo[1];
                 pSubpassBeginInfo = (VkSubpassBeginInfo*)stack_pSubpassBeginInfo;
-                reservedunmarshal_VkSubpassBeginInfo(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubpassBeginInfo*)(pSubpassBeginInfo), readStreamPtrPtr);
+                reservedunmarshal_VkSubpassBeginInfo(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                     (VkSubpassBeginInfo*)(pSubpassBeginInfo),
+                                                     readStreamPtrPtr);
                 pSubpassEndInfo = (VkSubpassEndInfo*)stack_pSubpassEndInfo;
-                reservedunmarshal_VkSubpassEndInfo(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubpassEndInfo*)(pSubpassEndInfo), readStreamPtrPtr);
-                if (pSubpassBeginInfo)
-                {
-                    transform_tohost_VkSubpassBeginInfo(globalstate, (VkSubpassBeginInfo*)(pSubpassBeginInfo));
+                reservedunmarshal_VkSubpassEndInfo(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                   (VkSubpassEndInfo*)(pSubpassEndInfo),
+                                                   readStreamPtrPtr);
+                if (pSubpassBeginInfo) {
+                    transform_tohost_VkSubpassBeginInfo(globalstate,
+                                                        (VkSubpassBeginInfo*)(pSubpassBeginInfo));
                 }
-                if (pSubpassEndInfo)
-                {
-                    transform_tohost_VkSubpassEndInfo(globalstate, (VkSubpassEndInfo*)(pSubpassEndInfo));
+                if (pSubpassEndInfo) {
+                    transform_tohost_VkSubpassEndInfo(globalstate,
+                                                      (VkSubpassEndInfo*)(pSubpassEndInfo));
                 }
-                vk->vkCmdNextSubpass2KHR((VkCommandBuffer)dispatchHandle, pSubpassBeginInfo, pSubpassEndInfo);
+                vk->vkCmdNextSubpass2KHR((VkCommandBuffer)dispatchHandle, pSubpassBeginInfo,
+                                         pSubpassEndInfo);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdEndRenderPass2KHR:
-            {
+            case OP_vkCmdEndRenderPass2KHR: {
                 android::base::beginTrace("vkCmdEndRenderPass2KHR subdecode");
                 const VkSubpassEndInfo* pSubpassEndInfo;
                 VkSubpassEndInfo stack_pSubpassEndInfo[1];
                 pSubpassEndInfo = (VkSubpassEndInfo*)stack_pSubpassEndInfo;
-                reservedunmarshal_VkSubpassEndInfo(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSubpassEndInfo*)(pSubpassEndInfo), readStreamPtrPtr);
-                if (pSubpassEndInfo)
-                {
-                    transform_tohost_VkSubpassEndInfo(globalstate, (VkSubpassEndInfo*)(pSubpassEndInfo));
+                reservedunmarshal_VkSubpassEndInfo(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                   (VkSubpassEndInfo*)(pSubpassEndInfo),
+                                                   readStreamPtrPtr);
+                if (pSubpassEndInfo) {
+                    transform_tohost_VkSubpassEndInfo(globalstate,
+                                                      (VkSubpassEndInfo*)(pSubpassEndInfo));
                 }
                 vk->vkCmdEndRenderPass2KHR((VkCommandBuffer)dispatchHandle, pSubpassEndInfo);
                 android::base::endTrace();
@@ -1902,8 +1898,7 @@
 #ifdef VK_KHR_maintenance3
 #endif
 #ifdef VK_KHR_draw_indirect_count
-            case OP_vkCmdDrawIndirectCountKHR:
-            {
+            case OP_vkCmdDrawIndirectCountKHR: {
                 android::base::beginTrace("vkCmdDrawIndirectCountKHR subdecode");
                 VkBuffer buffer;
                 VkDeviceSize offset;
@@ -1927,12 +1922,12 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&stride, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdDrawIndirectCountKHR((VkCommandBuffer)dispatchHandle, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+                vk->vkCmdDrawIndirectCountKHR((VkCommandBuffer)dispatchHandle, buffer, offset,
+                                              countBuffer, countBufferOffset, maxDrawCount, stride);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdDrawIndexedIndirectCountKHR:
-            {
+            case OP_vkCmdDrawIndexedIndirectCountKHR: {
                 android::base::beginTrace("vkCmdDrawIndexedIndirectCountKHR subdecode");
                 VkBuffer buffer;
                 VkDeviceSize offset;
@@ -1956,7 +1951,9 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&stride, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdDrawIndexedIndirectCountKHR((VkCommandBuffer)dispatchHandle, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+                vk->vkCmdDrawIndexedIndirectCountKHR((VkCommandBuffer)dispatchHandle, buffer,
+                                                     offset, countBuffer, countBufferOffset,
+                                                     maxDrawCount, stride);
                 android::base::endTrace();
                 break;
             }
@@ -1984,21 +1981,22 @@
 #ifdef VK_KHR_shader_terminate_invocation
 #endif
 #ifdef VK_KHR_fragment_shading_rate
-            case OP_vkCmdSetFragmentShadingRateKHR:
-            {
+            case OP_vkCmdSetFragmentShadingRateKHR: {
                 android::base::beginTrace("vkCmdSetFragmentShadingRateKHR subdecode");
                 const VkExtent2D* pFragmentSize;
                 VkExtent2D stack_pFragmentSize[1];
                 VkFragmentShadingRateCombinerOpKHR combinerOps[2];
                 pFragmentSize = (VkExtent2D*)stack_pFragmentSize;
-                reservedunmarshal_VkExtent2D(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExtent2D*)(pFragmentSize), readStreamPtrPtr);
-                memcpy((VkFragmentShadingRateCombinerOpKHR*)combinerOps, *readStreamPtrPtr, 2 * sizeof(const VkFragmentShadingRateCombinerOpKHR));
+                reservedunmarshal_VkExtent2D(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                             (VkExtent2D*)(pFragmentSize), readStreamPtrPtr);
+                memcpy((VkFragmentShadingRateCombinerOpKHR*)combinerOps, *readStreamPtrPtr,
+                       2 * sizeof(const VkFragmentShadingRateCombinerOpKHR));
                 *readStreamPtrPtr += 2 * sizeof(const VkFragmentShadingRateCombinerOpKHR);
-                if (pFragmentSize)
-                {
+                if (pFragmentSize) {
                     transform_tohost_VkExtent2D(globalstate, (VkExtent2D*)(pFragmentSize));
                 }
-                vk->vkCmdSetFragmentShadingRateKHR((VkCommandBuffer)dispatchHandle, pFragmentSize, combinerOps);
+                vk->vkCmdSetFragmentShadingRateKHR((VkCommandBuffer)dispatchHandle, pFragmentSize,
+                                                   combinerOps);
                 android::base::endTrace();
                 break;
             }
@@ -2028,16 +2026,17 @@
 #ifdef VK_KHR_present_id
 #endif
 #ifdef VK_KHR_video_encode_queue
-            case OP_vkCmdEncodeVideoKHR:
-            {
+            case OP_vkCmdEncodeVideoKHR: {
                 android::base::beginTrace("vkCmdEncodeVideoKHR subdecode");
                 const VkVideoEncodeInfoKHR* pEncodeInfo;
                 VkVideoEncodeInfoKHR stack_pEncodeInfo[1];
                 pEncodeInfo = (VkVideoEncodeInfoKHR*)stack_pEncodeInfo;
-                reservedunmarshal_VkVideoEncodeInfoKHR(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkVideoEncodeInfoKHR*)(pEncodeInfo), readStreamPtrPtr);
-                if (pEncodeInfo)
-                {
-                    transform_tohost_VkVideoEncodeInfoKHR(globalstate, (VkVideoEncodeInfoKHR*)(pEncodeInfo));
+                reservedunmarshal_VkVideoEncodeInfoKHR(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                       (VkVideoEncodeInfoKHR*)(pEncodeInfo),
+                                                       readStreamPtrPtr);
+                if (pEncodeInfo) {
+                    transform_tohost_VkVideoEncodeInfoKHR(globalstate,
+                                                          (VkVideoEncodeInfoKHR*)(pEncodeInfo));
                 }
                 vk->vkCmdEncodeVideoKHR((VkCommandBuffer)dispatchHandle, pEncodeInfo);
                 android::base::endTrace();
@@ -2045,8 +2044,7 @@
             }
 #endif
 #ifdef VK_KHR_synchronization2
-            case OP_vkCmdSetEvent2KHR:
-            {
+            case OP_vkCmdSetEvent2KHR: {
                 android::base::beginTrace("vkCmdSetEvent2KHR subdecode");
                 VkEvent event;
                 const VkDependencyInfoKHR* pDependencyInfo;
@@ -2056,17 +2054,18 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkEvent*)&event = (VkEvent)unbox_VkEvent((VkEvent)(*&cgen_var_0));
                 pDependencyInfo = (VkDependencyInfoKHR*)stack_pDependencyInfo;
-                reservedunmarshal_VkDependencyInfoKHR(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDependencyInfoKHR*)(pDependencyInfo), readStreamPtrPtr);
-                if (pDependencyInfo)
-                {
-                    transform_tohost_VkDependencyInfoKHR(globalstate, (VkDependencyInfoKHR*)(pDependencyInfo));
+                reservedunmarshal_VkDependencyInfoKHR(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                      (VkDependencyInfoKHR*)(pDependencyInfo),
+                                                      readStreamPtrPtr);
+                if (pDependencyInfo) {
+                    transform_tohost_VkDependencyInfoKHR(globalstate,
+                                                         (VkDependencyInfoKHR*)(pDependencyInfo));
                 }
                 vk->vkCmdSetEvent2KHR((VkCommandBuffer)dispatchHandle, event, pDependencyInfo);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdResetEvent2KHR:
-            {
+            case OP_vkCmdResetEvent2KHR: {
                 android::base::beginTrace("vkCmdResetEvent2KHR subdecode");
                 VkEvent event;
                 VkPipelineStageFlags2KHR stageMask;
@@ -2074,14 +2073,14 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkEvent*)&event = (VkEvent)unbox_VkEvent((VkEvent)(*&cgen_var_0));
-                memcpy((VkPipelineStageFlags2KHR*)&stageMask, *readStreamPtrPtr, sizeof(VkPipelineStageFlags2KHR));
+                memcpy((VkPipelineStageFlags2KHR*)&stageMask, *readStreamPtrPtr,
+                       sizeof(VkPipelineStageFlags2KHR));
                 *readStreamPtrPtr += sizeof(VkPipelineStageFlags2KHR);
                 vk->vkCmdResetEvent2KHR((VkCommandBuffer)dispatchHandle, event, stageMask);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdWaitEvents2KHR:
-            {
+            case OP_vkCmdWaitEvents2KHR: {
                 android::base::beginTrace("vkCmdWaitEvents2KHR subdecode");
                 uint32_t eventCount;
                 const VkEvent* pEvents;
@@ -2090,88 +2089,86 @@
                 VkDependencyInfoKHR stack_pDependencyInfos[MAX_STACK_ITEMS];
                 memcpy((uint32_t*)&eventCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((eventCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((eventCount)) <= MAX_STACK_ITEMS) {
                     pEvents = (VkEvent*)stack_pEvents;
-                }
-                else
-                {
+                } else {
                     readStream->alloc((void**)&pEvents, ((eventCount)) * sizeof(const VkEvent));
                 }
-                if (((eventCount)))
-                {
+                if (((eventCount))) {
                     uint8_t* cgen_var_0_ptr = (uint8_t*)(*readStreamPtrPtr);
                     *readStreamPtrPtr += 8 * ((eventCount));
-                    for (uint32_t k = 0; k < ((eventCount)); ++k)
-                    {
-                        uint64_t tmpval; memcpy(&tmpval, cgen_var_0_ptr + k * 8, sizeof(uint64_t));
+                    for (uint32_t k = 0; k < ((eventCount)); ++k) {
+                        uint64_t tmpval;
+                        memcpy(&tmpval, cgen_var_0_ptr + k * 8, sizeof(uint64_t));
                         *(((VkEvent*)pEvents) + k) = (VkEvent)unbox_VkEvent((VkEvent)tmpval);
                     }
                 }
-                if (((eventCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((eventCount)) <= MAX_STACK_ITEMS) {
                     pDependencyInfos = (VkDependencyInfoKHR*)stack_pDependencyInfos;
+                } else {
+                    readStream->alloc((void**)&pDependencyInfos,
+                                      ((eventCount)) * sizeof(const VkDependencyInfoKHR));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pDependencyInfos, ((eventCount)) * sizeof(const VkDependencyInfoKHR));
+                for (uint32_t i = 0; i < (uint32_t)((eventCount)); ++i) {
+                    reservedunmarshal_VkDependencyInfoKHR(
+                        readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkDependencyInfoKHR*)(pDependencyInfos + i), readStreamPtrPtr);
                 }
-                for (uint32_t i = 0; i < (uint32_t)((eventCount)); ++i)
-                {
-                    reservedunmarshal_VkDependencyInfoKHR(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDependencyInfoKHR*)(pDependencyInfos + i), readStreamPtrPtr);
-                }
-                if (pDependencyInfos)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((eventCount)); ++i)
-                    {
-                        transform_tohost_VkDependencyInfoKHR(globalstate, (VkDependencyInfoKHR*)(pDependencyInfos + i));
+                if (pDependencyInfos) {
+                    for (uint32_t i = 0; i < (uint32_t)((eventCount)); ++i) {
+                        transform_tohost_VkDependencyInfoKHR(
+                            globalstate, (VkDependencyInfoKHR*)(pDependencyInfos + i));
                     }
                 }
-                vk->vkCmdWaitEvents2KHR((VkCommandBuffer)dispatchHandle, eventCount, pEvents, pDependencyInfos);
+                vk->vkCmdWaitEvents2KHR((VkCommandBuffer)dispatchHandle, eventCount, pEvents,
+                                        pDependencyInfos);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdPipelineBarrier2KHR:
-            {
+            case OP_vkCmdPipelineBarrier2KHR: {
                 android::base::beginTrace("vkCmdPipelineBarrier2KHR subdecode");
                 const VkDependencyInfoKHR* pDependencyInfo;
                 VkDependencyInfoKHR stack_pDependencyInfo[1];
                 pDependencyInfo = (VkDependencyInfoKHR*)stack_pDependencyInfo;
-                reservedunmarshal_VkDependencyInfoKHR(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDependencyInfoKHR*)(pDependencyInfo), readStreamPtrPtr);
-                if (pDependencyInfo)
-                {
-                    transform_tohost_VkDependencyInfoKHR(globalstate, (VkDependencyInfoKHR*)(pDependencyInfo));
+                reservedunmarshal_VkDependencyInfoKHR(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                      (VkDependencyInfoKHR*)(pDependencyInfo),
+                                                      readStreamPtrPtr);
+                if (pDependencyInfo) {
+                    transform_tohost_VkDependencyInfoKHR(globalstate,
+                                                         (VkDependencyInfoKHR*)(pDependencyInfo));
                 }
                 vk->vkCmdPipelineBarrier2KHR((VkCommandBuffer)dispatchHandle, pDependencyInfo);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdWriteTimestamp2KHR:
-            {
+            case OP_vkCmdWriteTimestamp2KHR: {
                 android::base::beginTrace("vkCmdWriteTimestamp2KHR subdecode");
                 VkPipelineStageFlags2KHR stage;
                 VkQueryPool queryPool;
                 uint32_t query;
-                memcpy((VkPipelineStageFlags2KHR*)&stage, *readStreamPtrPtr, sizeof(VkPipelineStageFlags2KHR));
+                memcpy((VkPipelineStageFlags2KHR*)&stage, *readStreamPtrPtr,
+                       sizeof(VkPipelineStageFlags2KHR));
                 *readStreamPtrPtr += sizeof(VkPipelineStageFlags2KHR);
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkQueryPool*)&queryPool = (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_0));
+                *(VkQueryPool*)&queryPool =
+                    (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_0));
                 memcpy((uint32_t*)&query, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdWriteTimestamp2KHR((VkCommandBuffer)dispatchHandle, stage, queryPool, query);
+                vk->vkCmdWriteTimestamp2KHR((VkCommandBuffer)dispatchHandle, stage, queryPool,
+                                            query);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdWriteBufferMarker2AMD:
-            {
+            case OP_vkCmdWriteBufferMarker2AMD: {
                 android::base::beginTrace("vkCmdWriteBufferMarker2AMD subdecode");
                 VkPipelineStageFlags2KHR stage;
                 VkBuffer dstBuffer;
                 VkDeviceSize dstOffset;
                 uint32_t marker;
-                memcpy((VkPipelineStageFlags2KHR*)&stage, *readStreamPtrPtr, sizeof(VkPipelineStageFlags2KHR));
+                memcpy((VkPipelineStageFlags2KHR*)&stage, *readStreamPtrPtr,
+                       sizeof(VkPipelineStageFlags2KHR));
                 *readStreamPtrPtr += sizeof(VkPipelineStageFlags2KHR);
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
@@ -2181,7 +2178,8 @@
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
                 memcpy((uint32_t*)&marker, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdWriteBufferMarker2AMD((VkCommandBuffer)dispatchHandle, stage, dstBuffer, dstOffset, marker);
+                vk->vkCmdWriteBufferMarker2AMD((VkCommandBuffer)dispatchHandle, stage, dstBuffer,
+                                               dstOffset, marker);
                 android::base::endTrace();
                 break;
             }
@@ -2193,91 +2191,99 @@
 #ifdef VK_KHR_workgroup_memory_explicit_layout
 #endif
 #ifdef VK_KHR_copy_commands2
-            case OP_vkCmdCopyBuffer2KHR:
-            {
+            case OP_vkCmdCopyBuffer2KHR: {
                 android::base::beginTrace("vkCmdCopyBuffer2KHR subdecode");
                 const VkCopyBufferInfo2KHR* pCopyBufferInfo;
                 VkCopyBufferInfo2KHR stack_pCopyBufferInfo[1];
                 pCopyBufferInfo = (VkCopyBufferInfo2KHR*)stack_pCopyBufferInfo;
-                reservedunmarshal_VkCopyBufferInfo2KHR(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyBufferInfo2KHR*)(pCopyBufferInfo), readStreamPtrPtr);
-                if (pCopyBufferInfo)
-                {
-                    transform_tohost_VkCopyBufferInfo2KHR(globalstate, (VkCopyBufferInfo2KHR*)(pCopyBufferInfo));
+                reservedunmarshal_VkCopyBufferInfo2KHR(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                       (VkCopyBufferInfo2KHR*)(pCopyBufferInfo),
+                                                       readStreamPtrPtr);
+                if (pCopyBufferInfo) {
+                    transform_tohost_VkCopyBufferInfo2KHR(globalstate,
+                                                          (VkCopyBufferInfo2KHR*)(pCopyBufferInfo));
                 }
                 vk->vkCmdCopyBuffer2KHR((VkCommandBuffer)dispatchHandle, pCopyBufferInfo);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdCopyImage2KHR:
-            {
+            case OP_vkCmdCopyImage2KHR: {
                 android::base::beginTrace("vkCmdCopyImage2KHR subdecode");
                 const VkCopyImageInfo2KHR* pCopyImageInfo;
                 VkCopyImageInfo2KHR stack_pCopyImageInfo[1];
                 pCopyImageInfo = (VkCopyImageInfo2KHR*)stack_pCopyImageInfo;
-                reservedunmarshal_VkCopyImageInfo2KHR(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyImageInfo2KHR*)(pCopyImageInfo), readStreamPtrPtr);
-                if (pCopyImageInfo)
-                {
-                    transform_tohost_VkCopyImageInfo2KHR(globalstate, (VkCopyImageInfo2KHR*)(pCopyImageInfo));
+                reservedunmarshal_VkCopyImageInfo2KHR(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                      (VkCopyImageInfo2KHR*)(pCopyImageInfo),
+                                                      readStreamPtrPtr);
+                if (pCopyImageInfo) {
+                    transform_tohost_VkCopyImageInfo2KHR(globalstate,
+                                                         (VkCopyImageInfo2KHR*)(pCopyImageInfo));
                 }
                 vk->vkCmdCopyImage2KHR((VkCommandBuffer)dispatchHandle, pCopyImageInfo);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdCopyBufferToImage2KHR:
-            {
+            case OP_vkCmdCopyBufferToImage2KHR: {
                 android::base::beginTrace("vkCmdCopyBufferToImage2KHR subdecode");
                 const VkCopyBufferToImageInfo2KHR* pCopyBufferToImageInfo;
                 VkCopyBufferToImageInfo2KHR stack_pCopyBufferToImageInfo[1];
                 pCopyBufferToImageInfo = (VkCopyBufferToImageInfo2KHR*)stack_pCopyBufferToImageInfo;
-                reservedunmarshal_VkCopyBufferToImageInfo2KHR(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyBufferToImageInfo2KHR*)(pCopyBufferToImageInfo), readStreamPtrPtr);
-                if (pCopyBufferToImageInfo)
-                {
-                    transform_tohost_VkCopyBufferToImageInfo2KHR(globalstate, (VkCopyBufferToImageInfo2KHR*)(pCopyBufferToImageInfo));
+                reservedunmarshal_VkCopyBufferToImageInfo2KHR(
+                    readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkCopyBufferToImageInfo2KHR*)(pCopyBufferToImageInfo), readStreamPtrPtr);
+                if (pCopyBufferToImageInfo) {
+                    transform_tohost_VkCopyBufferToImageInfo2KHR(
+                        globalstate, (VkCopyBufferToImageInfo2KHR*)(pCopyBufferToImageInfo));
                 }
-                vk->vkCmdCopyBufferToImage2KHR((VkCommandBuffer)dispatchHandle, pCopyBufferToImageInfo);
+                vk->vkCmdCopyBufferToImage2KHR((VkCommandBuffer)dispatchHandle,
+                                               pCopyBufferToImageInfo);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdCopyImageToBuffer2KHR:
-            {
+            case OP_vkCmdCopyImageToBuffer2KHR: {
                 android::base::beginTrace("vkCmdCopyImageToBuffer2KHR subdecode");
                 const VkCopyImageToBufferInfo2KHR* pCopyImageToBufferInfo;
                 VkCopyImageToBufferInfo2KHR stack_pCopyImageToBufferInfo[1];
                 pCopyImageToBufferInfo = (VkCopyImageToBufferInfo2KHR*)stack_pCopyImageToBufferInfo;
-                reservedunmarshal_VkCopyImageToBufferInfo2KHR(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyImageToBufferInfo2KHR*)(pCopyImageToBufferInfo), readStreamPtrPtr);
-                if (pCopyImageToBufferInfo)
-                {
-                    transform_tohost_VkCopyImageToBufferInfo2KHR(globalstate, (VkCopyImageToBufferInfo2KHR*)(pCopyImageToBufferInfo));
+                reservedunmarshal_VkCopyImageToBufferInfo2KHR(
+                    readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkCopyImageToBufferInfo2KHR*)(pCopyImageToBufferInfo), readStreamPtrPtr);
+                if (pCopyImageToBufferInfo) {
+                    transform_tohost_VkCopyImageToBufferInfo2KHR(
+                        globalstate, (VkCopyImageToBufferInfo2KHR*)(pCopyImageToBufferInfo));
                 }
-                vk->vkCmdCopyImageToBuffer2KHR((VkCommandBuffer)dispatchHandle, pCopyImageToBufferInfo);
+                vk->vkCmdCopyImageToBuffer2KHR((VkCommandBuffer)dispatchHandle,
+                                               pCopyImageToBufferInfo);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdBlitImage2KHR:
-            {
+            case OP_vkCmdBlitImage2KHR: {
                 android::base::beginTrace("vkCmdBlitImage2KHR subdecode");
                 const VkBlitImageInfo2KHR* pBlitImageInfo;
                 VkBlitImageInfo2KHR stack_pBlitImageInfo[1];
                 pBlitImageInfo = (VkBlitImageInfo2KHR*)stack_pBlitImageInfo;
-                reservedunmarshal_VkBlitImageInfo2KHR(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkBlitImageInfo2KHR*)(pBlitImageInfo), readStreamPtrPtr);
-                if (pBlitImageInfo)
-                {
-                    transform_tohost_VkBlitImageInfo2KHR(globalstate, (VkBlitImageInfo2KHR*)(pBlitImageInfo));
+                reservedunmarshal_VkBlitImageInfo2KHR(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                      (VkBlitImageInfo2KHR*)(pBlitImageInfo),
+                                                      readStreamPtrPtr);
+                if (pBlitImageInfo) {
+                    transform_tohost_VkBlitImageInfo2KHR(globalstate,
+                                                         (VkBlitImageInfo2KHR*)(pBlitImageInfo));
                 }
                 vk->vkCmdBlitImage2KHR((VkCommandBuffer)dispatchHandle, pBlitImageInfo);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdResolveImage2KHR:
-            {
+            case OP_vkCmdResolveImage2KHR: {
                 android::base::beginTrace("vkCmdResolveImage2KHR subdecode");
                 const VkResolveImageInfo2KHR* pResolveImageInfo;
                 VkResolveImageInfo2KHR stack_pResolveImageInfo[1];
                 pResolveImageInfo = (VkResolveImageInfo2KHR*)stack_pResolveImageInfo;
-                reservedunmarshal_VkResolveImageInfo2KHR(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkResolveImageInfo2KHR*)(pResolveImageInfo), readStreamPtrPtr);
-                if (pResolveImageInfo)
-                {
-                    transform_tohost_VkResolveImageInfo2KHR(globalstate, (VkResolveImageInfo2KHR*)(pResolveImageInfo));
+                reservedunmarshal_VkResolveImageInfo2KHR(
+                    readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkResolveImageInfo2KHR*)(pResolveImageInfo), readStreamPtrPtr);
+                if (pResolveImageInfo) {
+                    transform_tohost_VkResolveImageInfo2KHR(
+                        globalstate, (VkResolveImageInfo2KHR*)(pResolveImageInfo));
                 }
                 vk->vkCmdResolveImage2KHR((VkCommandBuffer)dispatchHandle, pResolveImageInfo);
                 android::base::endTrace();
@@ -2305,38 +2311,39 @@
 #ifdef VK_AMD_shader_explicit_vertex_parameter
 #endif
 #ifdef VK_EXT_debug_marker
-            case OP_vkCmdDebugMarkerBeginEXT:
-            {
+            case OP_vkCmdDebugMarkerBeginEXT: {
                 android::base::beginTrace("vkCmdDebugMarkerBeginEXT subdecode");
                 const VkDebugMarkerMarkerInfoEXT* pMarkerInfo;
                 VkDebugMarkerMarkerInfoEXT stack_pMarkerInfo[1];
                 pMarkerInfo = (VkDebugMarkerMarkerInfoEXT*)stack_pMarkerInfo;
-                reservedunmarshal_VkDebugMarkerMarkerInfoEXT(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugMarkerMarkerInfoEXT*)(pMarkerInfo), readStreamPtrPtr);
-                if (pMarkerInfo)
-                {
-                    transform_tohost_VkDebugMarkerMarkerInfoEXT(globalstate, (VkDebugMarkerMarkerInfoEXT*)(pMarkerInfo));
+                reservedunmarshal_VkDebugMarkerMarkerInfoEXT(
+                    readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkDebugMarkerMarkerInfoEXT*)(pMarkerInfo), readStreamPtrPtr);
+                if (pMarkerInfo) {
+                    transform_tohost_VkDebugMarkerMarkerInfoEXT(
+                        globalstate, (VkDebugMarkerMarkerInfoEXT*)(pMarkerInfo));
                 }
                 vk->vkCmdDebugMarkerBeginEXT((VkCommandBuffer)dispatchHandle, pMarkerInfo);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdDebugMarkerEndEXT:
-            {
+            case OP_vkCmdDebugMarkerEndEXT: {
                 android::base::beginTrace("vkCmdDebugMarkerEndEXT subdecode");
                 vk->vkCmdDebugMarkerEndEXT((VkCommandBuffer)dispatchHandle);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdDebugMarkerInsertEXT:
-            {
+            case OP_vkCmdDebugMarkerInsertEXT: {
                 android::base::beginTrace("vkCmdDebugMarkerInsertEXT subdecode");
                 const VkDebugMarkerMarkerInfoEXT* pMarkerInfo;
                 VkDebugMarkerMarkerInfoEXT stack_pMarkerInfo[1];
                 pMarkerInfo = (VkDebugMarkerMarkerInfoEXT*)stack_pMarkerInfo;
-                reservedunmarshal_VkDebugMarkerMarkerInfoEXT(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugMarkerMarkerInfoEXT*)(pMarkerInfo), readStreamPtrPtr);
-                if (pMarkerInfo)
-                {
-                    transform_tohost_VkDebugMarkerMarkerInfoEXT(globalstate, (VkDebugMarkerMarkerInfoEXT*)(pMarkerInfo));
+                reservedunmarshal_VkDebugMarkerMarkerInfoEXT(
+                    readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkDebugMarkerMarkerInfoEXT*)(pMarkerInfo), readStreamPtrPtr);
+                if (pMarkerInfo) {
+                    transform_tohost_VkDebugMarkerMarkerInfoEXT(
+                        globalstate, (VkDebugMarkerMarkerInfoEXT*)(pMarkerInfo));
                 }
                 vk->vkCmdDebugMarkerInsertEXT((VkCommandBuffer)dispatchHandle, pMarkerInfo);
                 android::base::endTrace();
@@ -2348,8 +2355,7 @@
 #ifdef VK_NV_dedicated_allocation
 #endif
 #ifdef VK_EXT_transform_feedback
-            case OP_vkCmdBindTransformFeedbackBuffersEXT:
-            {
+            case OP_vkCmdBindTransformFeedbackBuffersEXT: {
                 android::base::beginTrace("vkCmdBindTransformFeedbackBuffersEXT subdecode");
                 uint32_t firstBinding;
                 uint32_t bindingCount;
@@ -2363,57 +2369,51 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&bindingCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((bindingCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((bindingCount)) <= MAX_STACK_ITEMS) {
                     pBuffers = (VkBuffer*)stack_pBuffers;
-                }
-                else
-                {
+                } else {
                     readStream->alloc((void**)&pBuffers, ((bindingCount)) * sizeof(const VkBuffer));
                 }
-                if (((bindingCount)))
-                {
+                if (((bindingCount))) {
                     uint8_t* cgen_var_0_ptr = (uint8_t*)(*readStreamPtrPtr);
                     *readStreamPtrPtr += 8 * ((bindingCount));
-                    for (uint32_t k = 0; k < ((bindingCount)); ++k)
-                    {
-                        uint64_t tmpval; memcpy(&tmpval, cgen_var_0_ptr + k * 8, sizeof(uint64_t));
+                    for (uint32_t k = 0; k < ((bindingCount)); ++k) {
+                        uint64_t tmpval;
+                        memcpy(&tmpval, cgen_var_0_ptr + k * 8, sizeof(uint64_t));
                         *(((VkBuffer*)pBuffers) + k) = (VkBuffer)unbox_VkBuffer((VkBuffer)tmpval);
                     }
                 }
-                if (((bindingCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((bindingCount)) <= MAX_STACK_ITEMS) {
                     pOffsets = (VkDeviceSize*)stack_pOffsets;
+                } else {
+                    readStream->alloc((void**)&pOffsets,
+                                      ((bindingCount)) * sizeof(const VkDeviceSize));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pOffsets, ((bindingCount)) * sizeof(const VkDeviceSize));
-                }
-                memcpy((VkDeviceSize*)pOffsets, *readStreamPtrPtr, ((bindingCount)) * sizeof(const VkDeviceSize));
+                memcpy((VkDeviceSize*)pOffsets, *readStreamPtrPtr,
+                       ((bindingCount)) * sizeof(const VkDeviceSize));
                 *readStreamPtrPtr += ((bindingCount)) * sizeof(const VkDeviceSize);
                 // WARNING PTR CHECK
                 memcpy((VkDeviceSize**)&pSizes, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pSizes);
                 *readStreamPtrPtr += 8;
-                if (pSizes)
-                {
-                    if (((bindingCount)) <= MAX_STACK_ITEMS)
-                    {
+                if (pSizes) {
+                    if (((bindingCount)) <= MAX_STACK_ITEMS) {
                         pSizes = (VkDeviceSize*)stack_pSizes;
+                    } else {
+                        readStream->alloc((void**)&pSizes,
+                                          ((bindingCount)) * sizeof(const VkDeviceSize));
                     }
-                    else
-                    {
-                        readStream->alloc((void**)&pSizes, ((bindingCount)) * sizeof(const VkDeviceSize));
-                    }
-                    memcpy((VkDeviceSize*)pSizes, *readStreamPtrPtr, ((bindingCount)) * sizeof(const VkDeviceSize));
+                    memcpy((VkDeviceSize*)pSizes, *readStreamPtrPtr,
+                           ((bindingCount)) * sizeof(const VkDeviceSize));
                     *readStreamPtrPtr += ((bindingCount)) * sizeof(const VkDeviceSize);
                 }
-                vk->vkCmdBindTransformFeedbackBuffersEXT((VkCommandBuffer)dispatchHandle, firstBinding, bindingCount, pBuffers, pOffsets, pSizes);
+                vk->vkCmdBindTransformFeedbackBuffersEXT((VkCommandBuffer)dispatchHandle,
+                                                         firstBinding, bindingCount, pBuffers,
+                                                         pOffsets, pSizes);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdBeginTransformFeedbackEXT:
-            {
+            case OP_vkCmdBeginTransformFeedbackEXT: {
                 android::base::beginTrace("vkCmdBeginTransformFeedbackEXT subdecode");
                 uint32_t firstCounterBuffer;
                 uint32_t counterBufferCount;
@@ -2429,24 +2429,21 @@
                 memcpy((VkBuffer**)&pCounterBuffers, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pCounterBuffers);
                 *readStreamPtrPtr += 8;
-                if (pCounterBuffers)
-                {
-                    if (((counterBufferCount)) <= MAX_STACK_ITEMS)
-                    {
+                if (pCounterBuffers) {
+                    if (((counterBufferCount)) <= MAX_STACK_ITEMS) {
                         pCounterBuffers = (VkBuffer*)stack_pCounterBuffers;
+                    } else {
+                        readStream->alloc((void**)&pCounterBuffers,
+                                          ((counterBufferCount)) * sizeof(const VkBuffer));
                     }
-                    else
-                    {
-                        readStream->alloc((void**)&pCounterBuffers, ((counterBufferCount)) * sizeof(const VkBuffer));
-                    }
-                    if (((counterBufferCount)))
-                    {
+                    if (((counterBufferCount))) {
                         uint8_t* cgen_var_0_0_ptr = (uint8_t*)(*readStreamPtrPtr);
                         *readStreamPtrPtr += 8 * ((counterBufferCount));
-                        for (uint32_t k = 0; k < ((counterBufferCount)); ++k)
-                        {
-                            uint64_t tmpval; memcpy(&tmpval, cgen_var_0_0_ptr + k * 8, sizeof(uint64_t));
-                            *(((VkBuffer*)pCounterBuffers) + k) = (VkBuffer)unbox_VkBuffer((VkBuffer)tmpval);
+                        for (uint32_t k = 0; k < ((counterBufferCount)); ++k) {
+                            uint64_t tmpval;
+                            memcpy(&tmpval, cgen_var_0_0_ptr + k * 8, sizeof(uint64_t));
+                            *(((VkBuffer*)pCounterBuffers) + k) =
+                                (VkBuffer)unbox_VkBuffer((VkBuffer)tmpval);
                         }
                     }
                 }
@@ -2454,25 +2451,24 @@
                 memcpy((VkDeviceSize**)&pCounterBufferOffsets, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pCounterBufferOffsets);
                 *readStreamPtrPtr += 8;
-                if (pCounterBufferOffsets)
-                {
-                    if (((counterBufferCount)) <= MAX_STACK_ITEMS)
-                    {
+                if (pCounterBufferOffsets) {
+                    if (((counterBufferCount)) <= MAX_STACK_ITEMS) {
                         pCounterBufferOffsets = (VkDeviceSize*)stack_pCounterBufferOffsets;
+                    } else {
+                        readStream->alloc((void**)&pCounterBufferOffsets,
+                                          ((counterBufferCount)) * sizeof(const VkDeviceSize));
                     }
-                    else
-                    {
-                        readStream->alloc((void**)&pCounterBufferOffsets, ((counterBufferCount)) * sizeof(const VkDeviceSize));
-                    }
-                    memcpy((VkDeviceSize*)pCounterBufferOffsets, *readStreamPtrPtr, ((counterBufferCount)) * sizeof(const VkDeviceSize));
+                    memcpy((VkDeviceSize*)pCounterBufferOffsets, *readStreamPtrPtr,
+                           ((counterBufferCount)) * sizeof(const VkDeviceSize));
                     *readStreamPtrPtr += ((counterBufferCount)) * sizeof(const VkDeviceSize);
                 }
-                vk->vkCmdBeginTransformFeedbackEXT((VkCommandBuffer)dispatchHandle, firstCounterBuffer, counterBufferCount, pCounterBuffers, pCounterBufferOffsets);
+                vk->vkCmdBeginTransformFeedbackEXT((VkCommandBuffer)dispatchHandle,
+                                                   firstCounterBuffer, counterBufferCount,
+                                                   pCounterBuffers, pCounterBufferOffsets);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdEndTransformFeedbackEXT:
-            {
+            case OP_vkCmdEndTransformFeedbackEXT: {
                 android::base::beginTrace("vkCmdEndTransformFeedbackEXT subdecode");
                 uint32_t firstCounterBuffer;
                 uint32_t counterBufferCount;
@@ -2488,24 +2484,21 @@
                 memcpy((VkBuffer**)&pCounterBuffers, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pCounterBuffers);
                 *readStreamPtrPtr += 8;
-                if (pCounterBuffers)
-                {
-                    if (((counterBufferCount)) <= MAX_STACK_ITEMS)
-                    {
+                if (pCounterBuffers) {
+                    if (((counterBufferCount)) <= MAX_STACK_ITEMS) {
                         pCounterBuffers = (VkBuffer*)stack_pCounterBuffers;
+                    } else {
+                        readStream->alloc((void**)&pCounterBuffers,
+                                          ((counterBufferCount)) * sizeof(const VkBuffer));
                     }
-                    else
-                    {
-                        readStream->alloc((void**)&pCounterBuffers, ((counterBufferCount)) * sizeof(const VkBuffer));
-                    }
-                    if (((counterBufferCount)))
-                    {
+                    if (((counterBufferCount))) {
                         uint8_t* cgen_var_0_0_ptr = (uint8_t*)(*readStreamPtrPtr);
                         *readStreamPtrPtr += 8 * ((counterBufferCount));
-                        for (uint32_t k = 0; k < ((counterBufferCount)); ++k)
-                        {
-                            uint64_t tmpval; memcpy(&tmpval, cgen_var_0_0_ptr + k * 8, sizeof(uint64_t));
-                            *(((VkBuffer*)pCounterBuffers) + k) = (VkBuffer)unbox_VkBuffer((VkBuffer)tmpval);
+                        for (uint32_t k = 0; k < ((counterBufferCount)); ++k) {
+                            uint64_t tmpval;
+                            memcpy(&tmpval, cgen_var_0_0_ptr + k * 8, sizeof(uint64_t));
+                            *(((VkBuffer*)pCounterBuffers) + k) =
+                                (VkBuffer)unbox_VkBuffer((VkBuffer)tmpval);
                         }
                     }
                 }
@@ -2513,25 +2506,24 @@
                 memcpy((VkDeviceSize**)&pCounterBufferOffsets, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pCounterBufferOffsets);
                 *readStreamPtrPtr += 8;
-                if (pCounterBufferOffsets)
-                {
-                    if (((counterBufferCount)) <= MAX_STACK_ITEMS)
-                    {
+                if (pCounterBufferOffsets) {
+                    if (((counterBufferCount)) <= MAX_STACK_ITEMS) {
                         pCounterBufferOffsets = (VkDeviceSize*)stack_pCounterBufferOffsets;
+                    } else {
+                        readStream->alloc((void**)&pCounterBufferOffsets,
+                                          ((counterBufferCount)) * sizeof(const VkDeviceSize));
                     }
-                    else
-                    {
-                        readStream->alloc((void**)&pCounterBufferOffsets, ((counterBufferCount)) * sizeof(const VkDeviceSize));
-                    }
-                    memcpy((VkDeviceSize*)pCounterBufferOffsets, *readStreamPtrPtr, ((counterBufferCount)) * sizeof(const VkDeviceSize));
+                    memcpy((VkDeviceSize*)pCounterBufferOffsets, *readStreamPtrPtr,
+                           ((counterBufferCount)) * sizeof(const VkDeviceSize));
                     *readStreamPtrPtr += ((counterBufferCount)) * sizeof(const VkDeviceSize);
                 }
-                vk->vkCmdEndTransformFeedbackEXT((VkCommandBuffer)dispatchHandle, firstCounterBuffer, counterBufferCount, pCounterBuffers, pCounterBufferOffsets);
+                vk->vkCmdEndTransformFeedbackEXT((VkCommandBuffer)dispatchHandle,
+                                                 firstCounterBuffer, counterBufferCount,
+                                                 pCounterBuffers, pCounterBufferOffsets);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdBeginQueryIndexedEXT:
-            {
+            case OP_vkCmdBeginQueryIndexedEXT: {
                 android::base::beginTrace("vkCmdBeginQueryIndexedEXT subdecode");
                 VkQueryPool queryPool;
                 uint32_t query;
@@ -2540,19 +2532,21 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkQueryPool*)&queryPool = (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_0));
+                *(VkQueryPool*)&queryPool =
+                    (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_0));
                 memcpy((uint32_t*)&query, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                memcpy((VkQueryControlFlags*)&flags, *readStreamPtrPtr, sizeof(VkQueryControlFlags));
+                memcpy((VkQueryControlFlags*)&flags, *readStreamPtrPtr,
+                       sizeof(VkQueryControlFlags));
                 *readStreamPtrPtr += sizeof(VkQueryControlFlags);
                 memcpy((uint32_t*)&index, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdBeginQueryIndexedEXT((VkCommandBuffer)dispatchHandle, queryPool, query, flags, index);
+                vk->vkCmdBeginQueryIndexedEXT((VkCommandBuffer)dispatchHandle, queryPool, query,
+                                              flags, index);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdEndQueryIndexedEXT:
-            {
+            case OP_vkCmdEndQueryIndexedEXT: {
                 android::base::beginTrace("vkCmdEndQueryIndexedEXT subdecode");
                 VkQueryPool queryPool;
                 uint32_t query;
@@ -2560,17 +2554,18 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkQueryPool*)&queryPool = (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_0));
+                *(VkQueryPool*)&queryPool =
+                    (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_0));
                 memcpy((uint32_t*)&query, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&index, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdEndQueryIndexedEXT((VkCommandBuffer)dispatchHandle, queryPool, query, index);
+                vk->vkCmdEndQueryIndexedEXT((VkCommandBuffer)dispatchHandle, queryPool, query,
+                                            index);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdDrawIndirectByteCountEXT:
-            {
+            case OP_vkCmdDrawIndirectByteCountEXT: {
                 android::base::beginTrace("vkCmdDrawIndirectByteCountEXT subdecode");
                 uint32_t instanceCount;
                 uint32_t firstInstance;
@@ -2586,28 +2581,32 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkBuffer*)&counterBuffer = (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_0));
-                memcpy((VkDeviceSize*)&counterBufferOffset, *readStreamPtrPtr, sizeof(VkDeviceSize));
+                memcpy((VkDeviceSize*)&counterBufferOffset, *readStreamPtrPtr,
+                       sizeof(VkDeviceSize));
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
                 memcpy((uint32_t*)&counterOffset, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&vertexStride, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdDrawIndirectByteCountEXT((VkCommandBuffer)dispatchHandle, instanceCount, firstInstance, counterBuffer, counterBufferOffset, counterOffset, vertexStride);
+                vk->vkCmdDrawIndirectByteCountEXT((VkCommandBuffer)dispatchHandle, instanceCount,
+                                                  firstInstance, counterBuffer, counterBufferOffset,
+                                                  counterOffset, vertexStride);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_NVX_binary_import
-            case OP_vkCmdCuLaunchKernelNVX:
-            {
+            case OP_vkCmdCuLaunchKernelNVX: {
                 android::base::beginTrace("vkCmdCuLaunchKernelNVX subdecode");
                 const VkCuLaunchInfoNVX* pLaunchInfo;
                 VkCuLaunchInfoNVX stack_pLaunchInfo[1];
                 pLaunchInfo = (VkCuLaunchInfoNVX*)stack_pLaunchInfo;
-                reservedunmarshal_VkCuLaunchInfoNVX(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCuLaunchInfoNVX*)(pLaunchInfo), readStreamPtrPtr);
-                if (pLaunchInfo)
-                {
-                    transform_tohost_VkCuLaunchInfoNVX(globalstate, (VkCuLaunchInfoNVX*)(pLaunchInfo));
+                reservedunmarshal_VkCuLaunchInfoNVX(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                    (VkCuLaunchInfoNVX*)(pLaunchInfo),
+                                                    readStreamPtrPtr);
+                if (pLaunchInfo) {
+                    transform_tohost_VkCuLaunchInfoNVX(globalstate,
+                                                       (VkCuLaunchInfoNVX*)(pLaunchInfo));
                 }
                 vk->vkCmdCuLaunchKernelNVX((VkCommandBuffer)dispatchHandle, pLaunchInfo);
                 android::base::endTrace();
@@ -2617,8 +2616,7 @@
 #ifdef VK_NVX_image_view_handle
 #endif
 #ifdef VK_AMD_draw_indirect_count
-            case OP_vkCmdDrawIndirectCountAMD:
-            {
+            case OP_vkCmdDrawIndirectCountAMD: {
                 android::base::beginTrace("vkCmdDrawIndirectCountAMD subdecode");
                 VkBuffer buffer;
                 VkDeviceSize offset;
@@ -2642,12 +2640,12 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&stride, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdDrawIndirectCountAMD((VkCommandBuffer)dispatchHandle, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+                vk->vkCmdDrawIndirectCountAMD((VkCommandBuffer)dispatchHandle, buffer, offset,
+                                              countBuffer, countBufferOffset, maxDrawCount, stride);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdDrawIndexedIndirectCountAMD:
-            {
+            case OP_vkCmdDrawIndexedIndirectCountAMD: {
                 android::base::beginTrace("vkCmdDrawIndexedIndirectCountAMD subdecode");
                 VkBuffer buffer;
                 VkDeviceSize offset;
@@ -2671,7 +2669,9 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&stride, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdDrawIndexedIndirectCountAMD((VkCommandBuffer)dispatchHandle, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+                vk->vkCmdDrawIndexedIndirectCountAMD((VkCommandBuffer)dispatchHandle, buffer,
+                                                     offset, countBuffer, countBufferOffset,
+                                                     maxDrawCount, stride);
                 android::base::endTrace();
                 break;
             }
@@ -2721,23 +2721,27 @@
 #ifdef VK_EXT_astc_decode_mode
 #endif
 #ifdef VK_EXT_conditional_rendering
-            case OP_vkCmdBeginConditionalRenderingEXT:
-            {
+            case OP_vkCmdBeginConditionalRenderingEXT: {
                 android::base::beginTrace("vkCmdBeginConditionalRenderingEXT subdecode");
                 const VkConditionalRenderingBeginInfoEXT* pConditionalRenderingBegin;
                 VkConditionalRenderingBeginInfoEXT stack_pConditionalRenderingBegin[1];
-                pConditionalRenderingBegin = (VkConditionalRenderingBeginInfoEXT*)stack_pConditionalRenderingBegin;
-                reservedunmarshal_VkConditionalRenderingBeginInfoEXT(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkConditionalRenderingBeginInfoEXT*)(pConditionalRenderingBegin), readStreamPtrPtr);
-                if (pConditionalRenderingBegin)
-                {
-                    transform_tohost_VkConditionalRenderingBeginInfoEXT(globalstate, (VkConditionalRenderingBeginInfoEXT*)(pConditionalRenderingBegin));
+                pConditionalRenderingBegin =
+                    (VkConditionalRenderingBeginInfoEXT*)stack_pConditionalRenderingBegin;
+                reservedunmarshal_VkConditionalRenderingBeginInfoEXT(
+                    readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkConditionalRenderingBeginInfoEXT*)(pConditionalRenderingBegin),
+                    readStreamPtrPtr);
+                if (pConditionalRenderingBegin) {
+                    transform_tohost_VkConditionalRenderingBeginInfoEXT(
+                        globalstate,
+                        (VkConditionalRenderingBeginInfoEXT*)(pConditionalRenderingBegin));
                 }
-                vk->vkCmdBeginConditionalRenderingEXT((VkCommandBuffer)dispatchHandle, pConditionalRenderingBegin);
+                vk->vkCmdBeginConditionalRenderingEXT((VkCommandBuffer)dispatchHandle,
+                                                      pConditionalRenderingBegin);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdEndConditionalRenderingEXT:
-            {
+            case OP_vkCmdEndConditionalRenderingEXT: {
                 android::base::beginTrace("vkCmdEndConditionalRenderingEXT subdecode");
                 vk->vkCmdEndConditionalRenderingEXT((VkCommandBuffer)dispatchHandle);
                 android::base::endTrace();
@@ -2745,8 +2749,7 @@
             }
 #endif
 #ifdef VK_NV_clip_space_w_scaling
-            case OP_vkCmdSetViewportWScalingNV:
-            {
+            case OP_vkCmdSetViewportWScalingNV: {
                 android::base::beginTrace("vkCmdSetViewportWScalingNV subdecode");
                 uint32_t firstViewport;
                 uint32_t viewportCount;
@@ -2756,26 +2759,25 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&viewportCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((viewportCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((viewportCount)) <= MAX_STACK_ITEMS) {
                     pViewportWScalings = (VkViewportWScalingNV*)stack_pViewportWScalings;
+                } else {
+                    readStream->alloc((void**)&pViewportWScalings,
+                                      ((viewportCount)) * sizeof(const VkViewportWScalingNV));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pViewportWScalings, ((viewportCount)) * sizeof(const VkViewportWScalingNV));
+                for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i) {
+                    reservedunmarshal_VkViewportWScalingNV(
+                        readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkViewportWScalingNV*)(pViewportWScalings + i), readStreamPtrPtr);
                 }
-                for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i)
-                {
-                    reservedunmarshal_VkViewportWScalingNV(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkViewportWScalingNV*)(pViewportWScalings + i), readStreamPtrPtr);
-                }
-                if (pViewportWScalings)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i)
-                    {
-                        transform_tohost_VkViewportWScalingNV(globalstate, (VkViewportWScalingNV*)(pViewportWScalings + i));
+                if (pViewportWScalings) {
+                    for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i) {
+                        transform_tohost_VkViewportWScalingNV(
+                            globalstate, (VkViewportWScalingNV*)(pViewportWScalings + i));
                     }
                 }
-                vk->vkCmdSetViewportWScalingNV((VkCommandBuffer)dispatchHandle, firstViewport, viewportCount, pViewportWScalings);
+                vk->vkCmdSetViewportWScalingNV((VkCommandBuffer)dispatchHandle, firstViewport,
+                                               viewportCount, pViewportWScalings);
                 android::base::endTrace();
                 break;
             }
@@ -2801,8 +2803,7 @@
 #ifdef VK_NV_viewport_swizzle
 #endif
 #ifdef VK_EXT_discard_rectangles
-            case OP_vkCmdSetDiscardRectangleEXT:
-            {
+            case OP_vkCmdSetDiscardRectangleEXT: {
                 android::base::beginTrace("vkCmdSetDiscardRectangleEXT subdecode");
                 uint32_t firstDiscardRectangle;
                 uint32_t discardRectangleCount;
@@ -2812,26 +2813,25 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&discardRectangleCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((discardRectangleCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((discardRectangleCount)) <= MAX_STACK_ITEMS) {
                     pDiscardRectangles = (VkRect2D*)stack_pDiscardRectangles;
+                } else {
+                    readStream->alloc((void**)&pDiscardRectangles,
+                                      ((discardRectangleCount)) * sizeof(const VkRect2D));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pDiscardRectangles, ((discardRectangleCount)) * sizeof(const VkRect2D));
+                for (uint32_t i = 0; i < (uint32_t)((discardRectangleCount)); ++i) {
+                    reservedunmarshal_VkRect2D(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                               (VkRect2D*)(pDiscardRectangles + i),
+                                               readStreamPtrPtr);
                 }
-                for (uint32_t i = 0; i < (uint32_t)((discardRectangleCount)); ++i)
-                {
-                    reservedunmarshal_VkRect2D(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRect2D*)(pDiscardRectangles + i), readStreamPtrPtr);
-                }
-                if (pDiscardRectangles)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((discardRectangleCount)); ++i)
-                    {
+                if (pDiscardRectangles) {
+                    for (uint32_t i = 0; i < (uint32_t)((discardRectangleCount)); ++i) {
                         transform_tohost_VkRect2D(globalstate, (VkRect2D*)(pDiscardRectangles + i));
                     }
                 }
-                vk->vkCmdSetDiscardRectangleEXT((VkCommandBuffer)dispatchHandle, firstDiscardRectangle, discardRectangleCount, pDiscardRectangles);
+                vk->vkCmdSetDiscardRectangleEXT((VkCommandBuffer)dispatchHandle,
+                                                firstDiscardRectangle, discardRectangleCount,
+                                                pDiscardRectangles);
                 android::base::endTrace();
                 break;
             }
@@ -2855,38 +2855,39 @@
 #ifdef VK_EXT_queue_family_foreign
 #endif
 #ifdef VK_EXT_debug_utils
-            case OP_vkCmdBeginDebugUtilsLabelEXT:
-            {
+            case OP_vkCmdBeginDebugUtilsLabelEXT: {
                 android::base::beginTrace("vkCmdBeginDebugUtilsLabelEXT subdecode");
                 const VkDebugUtilsLabelEXT* pLabelInfo;
                 VkDebugUtilsLabelEXT stack_pLabelInfo[1];
                 pLabelInfo = (VkDebugUtilsLabelEXT*)stack_pLabelInfo;
-                reservedunmarshal_VkDebugUtilsLabelEXT(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugUtilsLabelEXT*)(pLabelInfo), readStreamPtrPtr);
-                if (pLabelInfo)
-                {
-                    transform_tohost_VkDebugUtilsLabelEXT(globalstate, (VkDebugUtilsLabelEXT*)(pLabelInfo));
+                reservedunmarshal_VkDebugUtilsLabelEXT(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                       (VkDebugUtilsLabelEXT*)(pLabelInfo),
+                                                       readStreamPtrPtr);
+                if (pLabelInfo) {
+                    transform_tohost_VkDebugUtilsLabelEXT(globalstate,
+                                                          (VkDebugUtilsLabelEXT*)(pLabelInfo));
                 }
                 vk->vkCmdBeginDebugUtilsLabelEXT((VkCommandBuffer)dispatchHandle, pLabelInfo);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdEndDebugUtilsLabelEXT:
-            {
+            case OP_vkCmdEndDebugUtilsLabelEXT: {
                 android::base::beginTrace("vkCmdEndDebugUtilsLabelEXT subdecode");
                 vk->vkCmdEndDebugUtilsLabelEXT((VkCommandBuffer)dispatchHandle);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdInsertDebugUtilsLabelEXT:
-            {
+            case OP_vkCmdInsertDebugUtilsLabelEXT: {
                 android::base::beginTrace("vkCmdInsertDebugUtilsLabelEXT subdecode");
                 const VkDebugUtilsLabelEXT* pLabelInfo;
                 VkDebugUtilsLabelEXT stack_pLabelInfo[1];
                 pLabelInfo = (VkDebugUtilsLabelEXT*)stack_pLabelInfo;
-                reservedunmarshal_VkDebugUtilsLabelEXT(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDebugUtilsLabelEXT*)(pLabelInfo), readStreamPtrPtr);
-                if (pLabelInfo)
-                {
-                    transform_tohost_VkDebugUtilsLabelEXT(globalstate, (VkDebugUtilsLabelEXT*)(pLabelInfo));
+                reservedunmarshal_VkDebugUtilsLabelEXT(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                       (VkDebugUtilsLabelEXT*)(pLabelInfo),
+                                                       readStreamPtrPtr);
+                if (pLabelInfo) {
+                    transform_tohost_VkDebugUtilsLabelEXT(globalstate,
+                                                          (VkDebugUtilsLabelEXT*)(pLabelInfo));
                 }
                 vk->vkCmdInsertDebugUtilsLabelEXT((VkCommandBuffer)dispatchHandle, pLabelInfo);
                 android::base::endTrace();
@@ -2908,18 +2909,20 @@
 #ifdef VK_EXT_shader_stencil_export
 #endif
 #ifdef VK_EXT_sample_locations
-            case OP_vkCmdSetSampleLocationsEXT:
-            {
+            case OP_vkCmdSetSampleLocationsEXT: {
                 android::base::beginTrace("vkCmdSetSampleLocationsEXT subdecode");
                 const VkSampleLocationsInfoEXT* pSampleLocationsInfo;
                 VkSampleLocationsInfoEXT stack_pSampleLocationsInfo[1];
                 pSampleLocationsInfo = (VkSampleLocationsInfoEXT*)stack_pSampleLocationsInfo;
-                reservedunmarshal_VkSampleLocationsInfoEXT(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkSampleLocationsInfoEXT*)(pSampleLocationsInfo), readStreamPtrPtr);
-                if (pSampleLocationsInfo)
-                {
-                    transform_tohost_VkSampleLocationsInfoEXT(globalstate, (VkSampleLocationsInfoEXT*)(pSampleLocationsInfo));
+                reservedunmarshal_VkSampleLocationsInfoEXT(
+                    readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkSampleLocationsInfoEXT*)(pSampleLocationsInfo), readStreamPtrPtr);
+                if (pSampleLocationsInfo) {
+                    transform_tohost_VkSampleLocationsInfoEXT(
+                        globalstate, (VkSampleLocationsInfoEXT*)(pSampleLocationsInfo));
                 }
-                vk->vkCmdSetSampleLocationsEXT((VkCommandBuffer)dispatchHandle, pSampleLocationsInfo);
+                vk->vkCmdSetSampleLocationsEXT((VkCommandBuffer)dispatchHandle,
+                                               pSampleLocationsInfo);
                 android::base::endTrace();
                 break;
             }
@@ -2945,23 +2948,23 @@
 #ifdef VK_EXT_shader_viewport_index_layer
 #endif
 #ifdef VK_NV_shading_rate_image
-            case OP_vkCmdBindShadingRateImageNV:
-            {
+            case OP_vkCmdBindShadingRateImageNV: {
                 android::base::beginTrace("vkCmdBindShadingRateImageNV subdecode");
                 VkImageView imageView;
                 VkImageLayout imageLayout;
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkImageView*)&imageView = (VkImageView)unbox_VkImageView((VkImageView)(*&cgen_var_0));
+                *(VkImageView*)&imageView =
+                    (VkImageView)unbox_VkImageView((VkImageView)(*&cgen_var_0));
                 memcpy((VkImageLayout*)&imageLayout, *readStreamPtrPtr, sizeof(VkImageLayout));
                 *readStreamPtrPtr += sizeof(VkImageLayout);
-                vk->vkCmdBindShadingRateImageNV((VkCommandBuffer)dispatchHandle, imageView, imageLayout);
+                vk->vkCmdBindShadingRateImageNV((VkCommandBuffer)dispatchHandle, imageView,
+                                                imageLayout);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetViewportShadingRatePaletteNV:
-            {
+            case OP_vkCmdSetViewportShadingRatePaletteNV: {
                 android::base::beginTrace("vkCmdSetViewportShadingRatePaletteNV subdecode");
                 uint32_t firstViewport;
                 uint32_t viewportCount;
@@ -2971,67 +2974,66 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&viewportCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((viewportCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((viewportCount)) <= MAX_STACK_ITEMS) {
                     pShadingRatePalettes = (VkShadingRatePaletteNV*)stack_pShadingRatePalettes;
+                } else {
+                    readStream->alloc((void**)&pShadingRatePalettes,
+                                      ((viewportCount)) * sizeof(const VkShadingRatePaletteNV));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pShadingRatePalettes, ((viewportCount)) * sizeof(const VkShadingRatePaletteNV));
+                for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i) {
+                    reservedunmarshal_VkShadingRatePaletteNV(
+                        readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkShadingRatePaletteNV*)(pShadingRatePalettes + i), readStreamPtrPtr);
                 }
-                for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i)
-                {
-                    reservedunmarshal_VkShadingRatePaletteNV(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkShadingRatePaletteNV*)(pShadingRatePalettes + i), readStreamPtrPtr);
-                }
-                if (pShadingRatePalettes)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i)
-                    {
-                        transform_tohost_VkShadingRatePaletteNV(globalstate, (VkShadingRatePaletteNV*)(pShadingRatePalettes + i));
+                if (pShadingRatePalettes) {
+                    for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i) {
+                        transform_tohost_VkShadingRatePaletteNV(
+                            globalstate, (VkShadingRatePaletteNV*)(pShadingRatePalettes + i));
                     }
                 }
-                vk->vkCmdSetViewportShadingRatePaletteNV((VkCommandBuffer)dispatchHandle, firstViewport, viewportCount, pShadingRatePalettes);
+                vk->vkCmdSetViewportShadingRatePaletteNV((VkCommandBuffer)dispatchHandle,
+                                                         firstViewport, viewportCount,
+                                                         pShadingRatePalettes);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetCoarseSampleOrderNV:
-            {
+            case OP_vkCmdSetCoarseSampleOrderNV: {
                 android::base::beginTrace("vkCmdSetCoarseSampleOrderNV subdecode");
                 VkCoarseSampleOrderTypeNV sampleOrderType;
                 uint32_t customSampleOrderCount;
                 const VkCoarseSampleOrderCustomNV* pCustomSampleOrders;
                 VkCoarseSampleOrderCustomNV stack_pCustomSampleOrders[MAX_STACK_ITEMS];
-                memcpy((VkCoarseSampleOrderTypeNV*)&sampleOrderType, *readStreamPtrPtr, sizeof(VkCoarseSampleOrderTypeNV));
+                memcpy((VkCoarseSampleOrderTypeNV*)&sampleOrderType, *readStreamPtrPtr,
+                       sizeof(VkCoarseSampleOrderTypeNV));
                 *readStreamPtrPtr += sizeof(VkCoarseSampleOrderTypeNV);
                 memcpy((uint32_t*)&customSampleOrderCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((customSampleOrderCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((customSampleOrderCount)) <= MAX_STACK_ITEMS) {
                     pCustomSampleOrders = (VkCoarseSampleOrderCustomNV*)stack_pCustomSampleOrders;
+                } else {
+                    readStream->alloc(
+                        (void**)&pCustomSampleOrders,
+                        ((customSampleOrderCount)) * sizeof(const VkCoarseSampleOrderCustomNV));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pCustomSampleOrders, ((customSampleOrderCount)) * sizeof(const VkCoarseSampleOrderCustomNV));
+                for (uint32_t i = 0; i < (uint32_t)((customSampleOrderCount)); ++i) {
+                    reservedunmarshal_VkCoarseSampleOrderCustomNV(
+                        readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkCoarseSampleOrderCustomNV*)(pCustomSampleOrders + i), readStreamPtrPtr);
                 }
-                for (uint32_t i = 0; i < (uint32_t)((customSampleOrderCount)); ++i)
-                {
-                    reservedunmarshal_VkCoarseSampleOrderCustomNV(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCoarseSampleOrderCustomNV*)(pCustomSampleOrders + i), readStreamPtrPtr);
-                }
-                if (pCustomSampleOrders)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((customSampleOrderCount)); ++i)
-                    {
-                        transform_tohost_VkCoarseSampleOrderCustomNV(globalstate, (VkCoarseSampleOrderCustomNV*)(pCustomSampleOrders + i));
+                if (pCustomSampleOrders) {
+                    for (uint32_t i = 0; i < (uint32_t)((customSampleOrderCount)); ++i) {
+                        transform_tohost_VkCoarseSampleOrderCustomNV(
+                            globalstate, (VkCoarseSampleOrderCustomNV*)(pCustomSampleOrders + i));
                     }
                 }
-                vk->vkCmdSetCoarseSampleOrderNV((VkCommandBuffer)dispatchHandle, sampleOrderType, customSampleOrderCount, pCustomSampleOrders);
+                vk->vkCmdSetCoarseSampleOrderNV((VkCommandBuffer)dispatchHandle, sampleOrderType,
+                                                customSampleOrderCount, pCustomSampleOrders);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_NV_ray_tracing
-            case OP_vkCmdBuildAccelerationStructureNV:
-            {
+            case OP_vkCmdBuildAccelerationStructureNV: {
                 android::base::beginTrace("vkCmdBuildAccelerationStructureNV subdecode");
                 const VkAccelerationStructureInfoNV* pInfo;
                 VkAccelerationStructureInfoNV stack_pInfo[1];
@@ -3043,7 +3045,9 @@
                 VkBuffer scratch;
                 VkDeviceSize scratchOffset;
                 pInfo = (VkAccelerationStructureInfoNV*)stack_pInfo;
-                reservedunmarshal_VkAccelerationStructureInfoNV(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureInfoNV*)(pInfo), readStreamPtrPtr);
+                reservedunmarshal_VkAccelerationStructureInfoNV(
+                    readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureInfoNV*)(pInfo),
+                    readStreamPtrPtr);
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
@@ -3055,27 +3059,32 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkAccelerationStructureNV*)&dst = (VkAccelerationStructureNV)unbox_VkAccelerationStructureNV((VkAccelerationStructureNV)(*&cgen_var_1));
+                *(VkAccelerationStructureNV*)&dst =
+                    (VkAccelerationStructureNV)unbox_VkAccelerationStructureNV(
+                        (VkAccelerationStructureNV)(*&cgen_var_1));
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkAccelerationStructureNV*)&src = (VkAccelerationStructureNV)unbox_VkAccelerationStructureNV((VkAccelerationStructureNV)(*&cgen_var_2));
+                *(VkAccelerationStructureNV*)&src =
+                    (VkAccelerationStructureNV)unbox_VkAccelerationStructureNV(
+                        (VkAccelerationStructureNV)(*&cgen_var_2));
                 uint64_t cgen_var_3;
                 memcpy((uint64_t*)&cgen_var_3, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkBuffer*)&scratch = (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_3));
                 memcpy((VkDeviceSize*)&scratchOffset, *readStreamPtrPtr, sizeof(VkDeviceSize));
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
-                if (pInfo)
-                {
-                    transform_tohost_VkAccelerationStructureInfoNV(globalstate, (VkAccelerationStructureInfoNV*)(pInfo));
+                if (pInfo) {
+                    transform_tohost_VkAccelerationStructureInfoNV(
+                        globalstate, (VkAccelerationStructureInfoNV*)(pInfo));
                 }
-                vk->vkCmdBuildAccelerationStructureNV((VkCommandBuffer)dispatchHandle, pInfo, instanceData, instanceOffset, update, dst, src, scratch, scratchOffset);
+                vk->vkCmdBuildAccelerationStructureNV((VkCommandBuffer)dispatchHandle, pInfo,
+                                                      instanceData, instanceOffset, update, dst,
+                                                      src, scratch, scratchOffset);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdCopyAccelerationStructureNV:
-            {
+            case OP_vkCmdCopyAccelerationStructureNV: {
                 android::base::beginTrace("vkCmdCopyAccelerationStructureNV subdecode");
                 VkAccelerationStructureNV dst;
                 VkAccelerationStructureNV src;
@@ -3083,19 +3092,24 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkAccelerationStructureNV*)&dst = (VkAccelerationStructureNV)unbox_VkAccelerationStructureNV((VkAccelerationStructureNV)(*&cgen_var_0));
+                *(VkAccelerationStructureNV*)&dst =
+                    (VkAccelerationStructureNV)unbox_VkAccelerationStructureNV(
+                        (VkAccelerationStructureNV)(*&cgen_var_0));
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkAccelerationStructureNV*)&src = (VkAccelerationStructureNV)unbox_VkAccelerationStructureNV((VkAccelerationStructureNV)(*&cgen_var_1));
-                memcpy((VkCopyAccelerationStructureModeKHR*)&mode, *readStreamPtrPtr, sizeof(VkCopyAccelerationStructureModeKHR));
+                *(VkAccelerationStructureNV*)&src =
+                    (VkAccelerationStructureNV)unbox_VkAccelerationStructureNV(
+                        (VkAccelerationStructureNV)(*&cgen_var_1));
+                memcpy((VkCopyAccelerationStructureModeKHR*)&mode, *readStreamPtrPtr,
+                       sizeof(VkCopyAccelerationStructureModeKHR));
                 *readStreamPtrPtr += sizeof(VkCopyAccelerationStructureModeKHR);
-                vk->vkCmdCopyAccelerationStructureNV((VkCommandBuffer)dispatchHandle, dst, src, mode);
+                vk->vkCmdCopyAccelerationStructureNV((VkCommandBuffer)dispatchHandle, dst, src,
+                                                     mode);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdTraceRaysNV:
-            {
+            case OP_vkCmdTraceRaysNV: {
                 android::base::beginTrace("vkCmdTraceRaysNV subdecode");
                 VkBuffer raygenShaderBindingTableBuffer;
                 VkDeviceSize raygenShaderBindingOffset;
@@ -3114,32 +3128,43 @@
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkBuffer*)&raygenShaderBindingTableBuffer = (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_0));
-                memcpy((VkDeviceSize*)&raygenShaderBindingOffset, *readStreamPtrPtr, sizeof(VkDeviceSize));
+                *(VkBuffer*)&raygenShaderBindingTableBuffer =
+                    (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_0));
+                memcpy((VkDeviceSize*)&raygenShaderBindingOffset, *readStreamPtrPtr,
+                       sizeof(VkDeviceSize));
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkBuffer*)&missShaderBindingTableBuffer = (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_1));
-                memcpy((VkDeviceSize*)&missShaderBindingOffset, *readStreamPtrPtr, sizeof(VkDeviceSize));
+                *(VkBuffer*)&missShaderBindingTableBuffer =
+                    (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_1));
+                memcpy((VkDeviceSize*)&missShaderBindingOffset, *readStreamPtrPtr,
+                       sizeof(VkDeviceSize));
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
-                memcpy((VkDeviceSize*)&missShaderBindingStride, *readStreamPtrPtr, sizeof(VkDeviceSize));
+                memcpy((VkDeviceSize*)&missShaderBindingStride, *readStreamPtrPtr,
+                       sizeof(VkDeviceSize));
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
                 uint64_t cgen_var_2;
                 memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkBuffer*)&hitShaderBindingTableBuffer = (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_2));
-                memcpy((VkDeviceSize*)&hitShaderBindingOffset, *readStreamPtrPtr, sizeof(VkDeviceSize));
+                *(VkBuffer*)&hitShaderBindingTableBuffer =
+                    (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_2));
+                memcpy((VkDeviceSize*)&hitShaderBindingOffset, *readStreamPtrPtr,
+                       sizeof(VkDeviceSize));
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
-                memcpy((VkDeviceSize*)&hitShaderBindingStride, *readStreamPtrPtr, sizeof(VkDeviceSize));
+                memcpy((VkDeviceSize*)&hitShaderBindingStride, *readStreamPtrPtr,
+                       sizeof(VkDeviceSize));
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
                 uint64_t cgen_var_3;
                 memcpy((uint64_t*)&cgen_var_3, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkBuffer*)&callableShaderBindingTableBuffer = (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_3));
-                memcpy((VkDeviceSize*)&callableShaderBindingOffset, *readStreamPtrPtr, sizeof(VkDeviceSize));
+                *(VkBuffer*)&callableShaderBindingTableBuffer =
+                    (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_3));
+                memcpy((VkDeviceSize*)&callableShaderBindingOffset, *readStreamPtrPtr,
+                       sizeof(VkDeviceSize));
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
-                memcpy((VkDeviceSize*)&callableShaderBindingStride, *readStreamPtrPtr, sizeof(VkDeviceSize));
+                memcpy((VkDeviceSize*)&callableShaderBindingStride, *readStreamPtrPtr,
+                       sizeof(VkDeviceSize));
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
                 memcpy((uint32_t*)&width, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
@@ -3147,12 +3172,17 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&depth, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdTraceRaysNV((VkCommandBuffer)dispatchHandle, raygenShaderBindingTableBuffer, raygenShaderBindingOffset, missShaderBindingTableBuffer, missShaderBindingOffset, missShaderBindingStride, hitShaderBindingTableBuffer, hitShaderBindingOffset, hitShaderBindingStride, callableShaderBindingTableBuffer, callableShaderBindingOffset, callableShaderBindingStride, width, height, depth);
+                vk->vkCmdTraceRaysNV((VkCommandBuffer)dispatchHandle,
+                                     raygenShaderBindingTableBuffer, raygenShaderBindingOffset,
+                                     missShaderBindingTableBuffer, missShaderBindingOffset,
+                                     missShaderBindingStride, hitShaderBindingTableBuffer,
+                                     hitShaderBindingOffset, hitShaderBindingStride,
+                                     callableShaderBindingTableBuffer, callableShaderBindingOffset,
+                                     callableShaderBindingStride, width, height, depth);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdWriteAccelerationStructuresPropertiesNV:
-            {
+            case OP_vkCmdWriteAccelerationStructuresPropertiesNV: {
                 android::base::beginTrace("vkCmdWriteAccelerationStructuresPropertiesNV subdecode");
                 uint32_t accelerationStructureCount;
                 const VkAccelerationStructureNV* pAccelerationStructures;
@@ -3162,22 +3192,23 @@
                 uint32_t firstQuery;
                 memcpy((uint32_t*)&accelerationStructureCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((accelerationStructureCount)) <= MAX_STACK_ITEMS)
-                {
-                    pAccelerationStructures = (VkAccelerationStructureNV*)stack_pAccelerationStructures;
+                if (((accelerationStructureCount)) <= MAX_STACK_ITEMS) {
+                    pAccelerationStructures =
+                        (VkAccelerationStructureNV*)stack_pAccelerationStructures;
+                } else {
+                    readStream->alloc(
+                        (void**)&pAccelerationStructures,
+                        ((accelerationStructureCount)) * sizeof(const VkAccelerationStructureNV));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pAccelerationStructures, ((accelerationStructureCount)) * sizeof(const VkAccelerationStructureNV));
-                }
-                if (((accelerationStructureCount)))
-                {
+                if (((accelerationStructureCount))) {
                     uint8_t* cgen_var_0_ptr = (uint8_t*)(*readStreamPtrPtr);
                     *readStreamPtrPtr += 8 * ((accelerationStructureCount));
-                    for (uint32_t k = 0; k < ((accelerationStructureCount)); ++k)
-                    {
-                        uint64_t tmpval; memcpy(&tmpval, cgen_var_0_ptr + k * 8, sizeof(uint64_t));
-                        *(((VkAccelerationStructureNV*)pAccelerationStructures) + k) = (VkAccelerationStructureNV)unbox_VkAccelerationStructureNV((VkAccelerationStructureNV)tmpval);
+                    for (uint32_t k = 0; k < ((accelerationStructureCount)); ++k) {
+                        uint64_t tmpval;
+                        memcpy(&tmpval, cgen_var_0_ptr + k * 8, sizeof(uint64_t));
+                        *(((VkAccelerationStructureNV*)pAccelerationStructures) + k) =
+                            (VkAccelerationStructureNV)unbox_VkAccelerationStructureNV(
+                                (VkAccelerationStructureNV)tmpval);
                     }
                 }
                 memcpy((VkQueryType*)&queryType, *readStreamPtrPtr, sizeof(VkQueryType));
@@ -3185,10 +3216,13 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkQueryPool*)&queryPool = (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_1));
+                *(VkQueryPool*)&queryPool =
+                    (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_1));
                 memcpy((uint32_t*)&firstQuery, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdWriteAccelerationStructuresPropertiesNV((VkCommandBuffer)dispatchHandle, accelerationStructureCount, pAccelerationStructures, queryType, queryPool, firstQuery);
+                vk->vkCmdWriteAccelerationStructuresPropertiesNV(
+                    (VkCommandBuffer)dispatchHandle, accelerationStructureCount,
+                    pAccelerationStructures, queryType, queryPool, firstQuery);
                 android::base::endTrace();
                 break;
             }
@@ -3204,14 +3238,14 @@
 #ifdef VK_EXT_external_memory_host
 #endif
 #ifdef VK_AMD_buffer_marker
-            case OP_vkCmdWriteBufferMarkerAMD:
-            {
+            case OP_vkCmdWriteBufferMarkerAMD: {
                 android::base::beginTrace("vkCmdWriteBufferMarkerAMD subdecode");
                 VkPipelineStageFlagBits pipelineStage;
                 VkBuffer dstBuffer;
                 VkDeviceSize dstOffset;
                 uint32_t marker;
-                memcpy((VkPipelineStageFlagBits*)&pipelineStage, *readStreamPtrPtr, sizeof(VkPipelineStageFlagBits));
+                memcpy((VkPipelineStageFlagBits*)&pipelineStage, *readStreamPtrPtr,
+                       sizeof(VkPipelineStageFlagBits));
                 *readStreamPtrPtr += sizeof(VkPipelineStageFlagBits);
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
@@ -3221,7 +3255,8 @@
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
                 memcpy((uint32_t*)&marker, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdWriteBufferMarkerAMD((VkCommandBuffer)dispatchHandle, pipelineStage, dstBuffer, dstOffset, marker);
+                vk->vkCmdWriteBufferMarkerAMD((VkCommandBuffer)dispatchHandle, pipelineStage,
+                                              dstBuffer, dstOffset, marker);
                 android::base::endTrace();
                 break;
             }
@@ -3247,8 +3282,7 @@
 #ifdef VK_NV_compute_shader_derivatives
 #endif
 #ifdef VK_NV_mesh_shader
-            case OP_vkCmdDrawMeshTasksNV:
-            {
+            case OP_vkCmdDrawMeshTasksNV: {
                 android::base::beginTrace("vkCmdDrawMeshTasksNV subdecode");
                 uint32_t taskCount;
                 uint32_t firstTask;
@@ -3260,8 +3294,7 @@
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdDrawMeshTasksIndirectNV:
-            {
+            case OP_vkCmdDrawMeshTasksIndirectNV: {
                 android::base::beginTrace("vkCmdDrawMeshTasksIndirectNV subdecode");
                 VkBuffer buffer;
                 VkDeviceSize offset;
@@ -3277,12 +3310,12 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&stride, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdDrawMeshTasksIndirectNV((VkCommandBuffer)dispatchHandle, buffer, offset, drawCount, stride);
+                vk->vkCmdDrawMeshTasksIndirectNV((VkCommandBuffer)dispatchHandle, buffer, offset,
+                                                 drawCount, stride);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdDrawMeshTasksIndirectCountNV:
-            {
+            case OP_vkCmdDrawMeshTasksIndirectCountNV: {
                 android::base::beginTrace("vkCmdDrawMeshTasksIndirectCountNV subdecode");
                 VkBuffer buffer;
                 VkDeviceSize offset;
@@ -3306,7 +3339,9 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&stride, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdDrawMeshTasksIndirectCountNV((VkCommandBuffer)dispatchHandle, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+                vk->vkCmdDrawMeshTasksIndirectCountNV((VkCommandBuffer)dispatchHandle, buffer,
+                                                      offset, countBuffer, countBufferOffset,
+                                                      maxDrawCount, stride);
                 android::base::endTrace();
                 break;
             }
@@ -3316,8 +3351,7 @@
 #ifdef VK_NV_shader_image_footprint
 #endif
 #ifdef VK_NV_scissor_exclusive
-            case OP_vkCmdSetExclusiveScissorNV:
-            {
+            case OP_vkCmdSetExclusiveScissorNV: {
                 android::base::beginTrace("vkCmdSetExclusiveScissorNV subdecode");
                 uint32_t firstExclusiveScissor;
                 uint32_t exclusiveScissorCount;
@@ -3327,33 +3361,31 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&exclusiveScissorCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((exclusiveScissorCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((exclusiveScissorCount)) <= MAX_STACK_ITEMS) {
                     pExclusiveScissors = (VkRect2D*)stack_pExclusiveScissors;
+                } else {
+                    readStream->alloc((void**)&pExclusiveScissors,
+                                      ((exclusiveScissorCount)) * sizeof(const VkRect2D));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pExclusiveScissors, ((exclusiveScissorCount)) * sizeof(const VkRect2D));
+                for (uint32_t i = 0; i < (uint32_t)((exclusiveScissorCount)); ++i) {
+                    reservedunmarshal_VkRect2D(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                               (VkRect2D*)(pExclusiveScissors + i),
+                                               readStreamPtrPtr);
                 }
-                for (uint32_t i = 0; i < (uint32_t)((exclusiveScissorCount)); ++i)
-                {
-                    reservedunmarshal_VkRect2D(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRect2D*)(pExclusiveScissors + i), readStreamPtrPtr);
-                }
-                if (pExclusiveScissors)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((exclusiveScissorCount)); ++i)
-                    {
+                if (pExclusiveScissors) {
+                    for (uint32_t i = 0; i < (uint32_t)((exclusiveScissorCount)); ++i) {
                         transform_tohost_VkRect2D(globalstate, (VkRect2D*)(pExclusiveScissors + i));
                     }
                 }
-                vk->vkCmdSetExclusiveScissorNV((VkCommandBuffer)dispatchHandle, firstExclusiveScissor, exclusiveScissorCount, pExclusiveScissors);
+                vk->vkCmdSetExclusiveScissorNV((VkCommandBuffer)dispatchHandle,
+                                               firstExclusiveScissor, exclusiveScissorCount,
+                                               pExclusiveScissors);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
-            case OP_vkCmdSetCheckpointNV:
-            {
+            case OP_vkCmdSetCheckpointNV: {
                 android::base::beginTrace("vkCmdSetCheckpointNV subdecode");
                 const void* pCheckpointMarker;
                 uint8_t* stack_pCheckpointMarker[1];
@@ -3361,8 +3393,7 @@
                 memcpy((void**)&pCheckpointMarker, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pCheckpointMarker);
                 *readStreamPtrPtr += 8;
-                if (pCheckpointMarker)
-                {
+                if (pCheckpointMarker) {
                     pCheckpointMarker = (void*)stack_pCheckpointMarker;
                     memcpy((void*)pCheckpointMarker, *readStreamPtrPtr, sizeof(const uint8_t));
                     *readStreamPtrPtr += sizeof(const uint8_t);
@@ -3375,54 +3406,65 @@
 #ifdef VK_INTEL_shader_integer_functions2
 #endif
 #ifdef VK_INTEL_performance_query
-            case OP_vkCmdSetPerformanceMarkerINTEL:
-            {
+            case OP_vkCmdSetPerformanceMarkerINTEL: {
                 android::base::beginTrace("vkCmdSetPerformanceMarkerINTEL subdecode");
                 const VkPerformanceMarkerInfoINTEL* pMarkerInfo;
                 VkPerformanceMarkerInfoINTEL stack_pMarkerInfo[1];
                 pMarkerInfo = (VkPerformanceMarkerInfoINTEL*)stack_pMarkerInfo;
-                reservedunmarshal_VkPerformanceMarkerInfoINTEL(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPerformanceMarkerInfoINTEL*)(pMarkerInfo), readStreamPtrPtr);
-                if (pMarkerInfo)
-                {
-                    transform_tohost_VkPerformanceMarkerInfoINTEL(globalstate, (VkPerformanceMarkerInfoINTEL*)(pMarkerInfo));
+                reservedunmarshal_VkPerformanceMarkerInfoINTEL(
+                    readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPerformanceMarkerInfoINTEL*)(pMarkerInfo), readStreamPtrPtr);
+                if (pMarkerInfo) {
+                    transform_tohost_VkPerformanceMarkerInfoINTEL(
+                        globalstate, (VkPerformanceMarkerInfoINTEL*)(pMarkerInfo));
                 }
                 VkResult vkCmdSetPerformanceMarkerINTEL_VkResult_return = (VkResult)0;
-                vkCmdSetPerformanceMarkerINTEL_VkResult_return = vk->vkCmdSetPerformanceMarkerINTEL((VkCommandBuffer)dispatchHandle, pMarkerInfo);
-                if ((vkCmdSetPerformanceMarkerINTEL_VkResult_return) == VK_ERROR_DEVICE_LOST) this->on_DeviceLost();
+                vkCmdSetPerformanceMarkerINTEL_VkResult_return = vk->vkCmdSetPerformanceMarkerINTEL(
+                    (VkCommandBuffer)dispatchHandle, pMarkerInfo);
+                if ((vkCmdSetPerformanceMarkerINTEL_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    this->on_DeviceLost();
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetPerformanceStreamMarkerINTEL:
-            {
+            case OP_vkCmdSetPerformanceStreamMarkerINTEL: {
                 android::base::beginTrace("vkCmdSetPerformanceStreamMarkerINTEL subdecode");
                 const VkPerformanceStreamMarkerInfoINTEL* pMarkerInfo;
                 VkPerformanceStreamMarkerInfoINTEL stack_pMarkerInfo[1];
                 pMarkerInfo = (VkPerformanceStreamMarkerInfoINTEL*)stack_pMarkerInfo;
-                reservedunmarshal_VkPerformanceStreamMarkerInfoINTEL(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPerformanceStreamMarkerInfoINTEL*)(pMarkerInfo), readStreamPtrPtr);
-                if (pMarkerInfo)
-                {
-                    transform_tohost_VkPerformanceStreamMarkerInfoINTEL(globalstate, (VkPerformanceStreamMarkerInfoINTEL*)(pMarkerInfo));
+                reservedunmarshal_VkPerformanceStreamMarkerInfoINTEL(
+                    readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPerformanceStreamMarkerInfoINTEL*)(pMarkerInfo), readStreamPtrPtr);
+                if (pMarkerInfo) {
+                    transform_tohost_VkPerformanceStreamMarkerInfoINTEL(
+                        globalstate, (VkPerformanceStreamMarkerInfoINTEL*)(pMarkerInfo));
                 }
                 VkResult vkCmdSetPerformanceStreamMarkerINTEL_VkResult_return = (VkResult)0;
-                vkCmdSetPerformanceStreamMarkerINTEL_VkResult_return = vk->vkCmdSetPerformanceStreamMarkerINTEL((VkCommandBuffer)dispatchHandle, pMarkerInfo);
-                if ((vkCmdSetPerformanceStreamMarkerINTEL_VkResult_return) == VK_ERROR_DEVICE_LOST) this->on_DeviceLost();
+                vkCmdSetPerformanceStreamMarkerINTEL_VkResult_return =
+                    vk->vkCmdSetPerformanceStreamMarkerINTEL((VkCommandBuffer)dispatchHandle,
+                                                             pMarkerInfo);
+                if ((vkCmdSetPerformanceStreamMarkerINTEL_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    this->on_DeviceLost();
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetPerformanceOverrideINTEL:
-            {
+            case OP_vkCmdSetPerformanceOverrideINTEL: {
                 android::base::beginTrace("vkCmdSetPerformanceOverrideINTEL subdecode");
                 const VkPerformanceOverrideInfoINTEL* pOverrideInfo;
                 VkPerformanceOverrideInfoINTEL stack_pOverrideInfo[1];
                 pOverrideInfo = (VkPerformanceOverrideInfoINTEL*)stack_pOverrideInfo;
-                reservedunmarshal_VkPerformanceOverrideInfoINTEL(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPerformanceOverrideInfoINTEL*)(pOverrideInfo), readStreamPtrPtr);
-                if (pOverrideInfo)
-                {
-                    transform_tohost_VkPerformanceOverrideInfoINTEL(globalstate, (VkPerformanceOverrideInfoINTEL*)(pOverrideInfo));
+                reservedunmarshal_VkPerformanceOverrideInfoINTEL(
+                    readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkPerformanceOverrideInfoINTEL*)(pOverrideInfo), readStreamPtrPtr);
+                if (pOverrideInfo) {
+                    transform_tohost_VkPerformanceOverrideInfoINTEL(
+                        globalstate, (VkPerformanceOverrideInfoINTEL*)(pOverrideInfo));
                 }
                 VkResult vkCmdSetPerformanceOverrideINTEL_VkResult_return = (VkResult)0;
-                vkCmdSetPerformanceOverrideINTEL_VkResult_return = vk->vkCmdSetPerformanceOverrideINTEL((VkCommandBuffer)dispatchHandle, pOverrideInfo);
-                if ((vkCmdSetPerformanceOverrideINTEL_VkResult_return) == VK_ERROR_DEVICE_LOST) this->on_DeviceLost();
+                vkCmdSetPerformanceOverrideINTEL_VkResult_return =
+                    vk->vkCmdSetPerformanceOverrideINTEL((VkCommandBuffer)dispatchHandle,
+                                                         pOverrideInfo);
+                if ((vkCmdSetPerformanceOverrideINTEL_VkResult_return) == VK_ERROR_DEVICE_LOST)
+                    this->on_DeviceLost();
                 android::base::endTrace();
                 break;
             }
@@ -3480,8 +3522,7 @@
 #ifdef VK_EXT_headless_surface
 #endif
 #ifdef VK_EXT_line_rasterization
-            case OP_vkCmdSetLineStippleEXT:
-            {
+            case OP_vkCmdSetLineStippleEXT: {
                 android::base::beginTrace("vkCmdSetLineStippleEXT subdecode");
                 uint32_t lineStippleFactor;
                 uint16_t lineStipplePattern;
@@ -3489,7 +3530,8 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint16_t*)&lineStipplePattern, *readStreamPtrPtr, sizeof(uint16_t));
                 *readStreamPtrPtr += sizeof(uint16_t);
-                vk->vkCmdSetLineStippleEXT((VkCommandBuffer)dispatchHandle, lineStippleFactor, lineStipplePattern);
+                vk->vkCmdSetLineStippleEXT((VkCommandBuffer)dispatchHandle, lineStippleFactor,
+                                           lineStipplePattern);
                 android::base::endTrace();
                 break;
             }
@@ -3501,8 +3543,7 @@
 #ifdef VK_EXT_index_type_uint8
 #endif
 #ifdef VK_EXT_extended_dynamic_state
-            case OP_vkCmdSetCullModeEXT:
-            {
+            case OP_vkCmdSetCullModeEXT: {
                 android::base::beginTrace("vkCmdSetCullModeEXT subdecode");
                 VkCullModeFlags cullMode;
                 memcpy((VkCullModeFlags*)&cullMode, *readStreamPtrPtr, sizeof(VkCullModeFlags));
@@ -3511,8 +3552,7 @@
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetFrontFaceEXT:
-            {
+            case OP_vkCmdSetFrontFaceEXT: {
                 android::base::beginTrace("vkCmdSetFrontFaceEXT subdecode");
                 VkFrontFace frontFace;
                 memcpy((VkFrontFace*)&frontFace, *readStreamPtrPtr, sizeof(VkFrontFace));
@@ -3521,80 +3561,72 @@
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetPrimitiveTopologyEXT:
-            {
+            case OP_vkCmdSetPrimitiveTopologyEXT: {
                 android::base::beginTrace("vkCmdSetPrimitiveTopologyEXT subdecode");
                 VkPrimitiveTopology primitiveTopology;
-                memcpy((VkPrimitiveTopology*)&primitiveTopology, *readStreamPtrPtr, sizeof(VkPrimitiveTopology));
+                memcpy((VkPrimitiveTopology*)&primitiveTopology, *readStreamPtrPtr,
+                       sizeof(VkPrimitiveTopology));
                 *readStreamPtrPtr += sizeof(VkPrimitiveTopology);
-                vk->vkCmdSetPrimitiveTopologyEXT((VkCommandBuffer)dispatchHandle, primitiveTopology);
+                vk->vkCmdSetPrimitiveTopologyEXT((VkCommandBuffer)dispatchHandle,
+                                                 primitiveTopology);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetViewportWithCountEXT:
-            {
+            case OP_vkCmdSetViewportWithCountEXT: {
                 android::base::beginTrace("vkCmdSetViewportWithCountEXT subdecode");
                 uint32_t viewportCount;
                 const VkViewport* pViewports;
                 VkViewport stack_pViewports[MAX_STACK_ITEMS];
                 memcpy((uint32_t*)&viewportCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((viewportCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((viewportCount)) <= MAX_STACK_ITEMS) {
                     pViewports = (VkViewport*)stack_pViewports;
+                } else {
+                    readStream->alloc((void**)&pViewports,
+                                      ((viewportCount)) * sizeof(const VkViewport));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pViewports, ((viewportCount)) * sizeof(const VkViewport));
+                for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i) {
+                    reservedunmarshal_VkViewport(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                 (VkViewport*)(pViewports + i), readStreamPtrPtr);
                 }
-                for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i)
-                {
-                    reservedunmarshal_VkViewport(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkViewport*)(pViewports + i), readStreamPtrPtr);
-                }
-                if (pViewports)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i)
-                    {
+                if (pViewports) {
+                    for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i) {
                         transform_tohost_VkViewport(globalstate, (VkViewport*)(pViewports + i));
                     }
                 }
-                vk->vkCmdSetViewportWithCountEXT((VkCommandBuffer)dispatchHandle, viewportCount, pViewports);
+                vk->vkCmdSetViewportWithCountEXT((VkCommandBuffer)dispatchHandle, viewportCount,
+                                                 pViewports);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetScissorWithCountEXT:
-            {
+            case OP_vkCmdSetScissorWithCountEXT: {
                 android::base::beginTrace("vkCmdSetScissorWithCountEXT subdecode");
                 uint32_t scissorCount;
                 const VkRect2D* pScissors;
                 VkRect2D stack_pScissors[MAX_STACK_ITEMS];
                 memcpy((uint32_t*)&scissorCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((scissorCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((scissorCount)) <= MAX_STACK_ITEMS) {
                     pScissors = (VkRect2D*)stack_pScissors;
+                } else {
+                    readStream->alloc((void**)&pScissors,
+                                      ((scissorCount)) * sizeof(const VkRect2D));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pScissors, ((scissorCount)) * sizeof(const VkRect2D));
+                for (uint32_t i = 0; i < (uint32_t)((scissorCount)); ++i) {
+                    reservedunmarshal_VkRect2D(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                               (VkRect2D*)(pScissors + i), readStreamPtrPtr);
                 }
-                for (uint32_t i = 0; i < (uint32_t)((scissorCount)); ++i)
-                {
-                    reservedunmarshal_VkRect2D(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRect2D*)(pScissors + i), readStreamPtrPtr);
-                }
-                if (pScissors)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((scissorCount)); ++i)
-                    {
+                if (pScissors) {
+                    for (uint32_t i = 0; i < (uint32_t)((scissorCount)); ++i) {
                         transform_tohost_VkRect2D(globalstate, (VkRect2D*)(pScissors + i));
                     }
                 }
-                vk->vkCmdSetScissorWithCountEXT((VkCommandBuffer)dispatchHandle, scissorCount, pScissors);
+                vk->vkCmdSetScissorWithCountEXT((VkCommandBuffer)dispatchHandle, scissorCount,
+                                                pScissors);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdBindVertexBuffers2EXT:
-            {
+            case OP_vkCmdBindVertexBuffers2EXT: {
                 android::base::beginTrace("vkCmdBindVertexBuffers2EXT subdecode");
                 uint32_t firstBinding;
                 uint32_t bindingCount;
@@ -3614,77 +3646,69 @@
                 memcpy((VkBuffer**)&pBuffers, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pBuffers);
                 *readStreamPtrPtr += 8;
-                if (pBuffers)
-                {
-                    if (((bindingCount)) <= MAX_STACK_ITEMS)
-                    {
+                if (pBuffers) {
+                    if (((bindingCount)) <= MAX_STACK_ITEMS) {
                         pBuffers = (VkBuffer*)stack_pBuffers;
+                    } else {
+                        readStream->alloc((void**)&pBuffers,
+                                          ((bindingCount)) * sizeof(const VkBuffer));
                     }
-                    else
-                    {
-                        readStream->alloc((void**)&pBuffers, ((bindingCount)) * sizeof(const VkBuffer));
-                    }
-                    if (((bindingCount)))
-                    {
+                    if (((bindingCount))) {
                         uint8_t* cgen_var_0_0_ptr = (uint8_t*)(*readStreamPtrPtr);
                         *readStreamPtrPtr += 8 * ((bindingCount));
-                        for (uint32_t k = 0; k < ((bindingCount)); ++k)
-                        {
-                            uint64_t tmpval; memcpy(&tmpval, cgen_var_0_0_ptr + k * 8, sizeof(uint64_t));
-                            *(((VkBuffer*)pBuffers) + k) = (VkBuffer)unbox_VkBuffer((VkBuffer)tmpval);
+                        for (uint32_t k = 0; k < ((bindingCount)); ++k) {
+                            uint64_t tmpval;
+                            memcpy(&tmpval, cgen_var_0_0_ptr + k * 8, sizeof(uint64_t));
+                            *(((VkBuffer*)pBuffers) + k) =
+                                (VkBuffer)unbox_VkBuffer((VkBuffer)tmpval);
                         }
                     }
                 }
-                if (((bindingCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((bindingCount)) <= MAX_STACK_ITEMS) {
                     pOffsets = (VkDeviceSize*)stack_pOffsets;
+                } else {
+                    readStream->alloc((void**)&pOffsets,
+                                      ((bindingCount)) * sizeof(const VkDeviceSize));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pOffsets, ((bindingCount)) * sizeof(const VkDeviceSize));
-                }
-                memcpy((VkDeviceSize*)pOffsets, *readStreamPtrPtr, ((bindingCount)) * sizeof(const VkDeviceSize));
+                memcpy((VkDeviceSize*)pOffsets, *readStreamPtrPtr,
+                       ((bindingCount)) * sizeof(const VkDeviceSize));
                 *readStreamPtrPtr += ((bindingCount)) * sizeof(const VkDeviceSize);
                 // WARNING PTR CHECK
                 memcpy((VkDeviceSize**)&pSizes, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pSizes);
                 *readStreamPtrPtr += 8;
-                if (pSizes)
-                {
-                    if (((bindingCount)) <= MAX_STACK_ITEMS)
-                    {
+                if (pSizes) {
+                    if (((bindingCount)) <= MAX_STACK_ITEMS) {
                         pSizes = (VkDeviceSize*)stack_pSizes;
+                    } else {
+                        readStream->alloc((void**)&pSizes,
+                                          ((bindingCount)) * sizeof(const VkDeviceSize));
                     }
-                    else
-                    {
-                        readStream->alloc((void**)&pSizes, ((bindingCount)) * sizeof(const VkDeviceSize));
-                    }
-                    memcpy((VkDeviceSize*)pSizes, *readStreamPtrPtr, ((bindingCount)) * sizeof(const VkDeviceSize));
+                    memcpy((VkDeviceSize*)pSizes, *readStreamPtrPtr,
+                           ((bindingCount)) * sizeof(const VkDeviceSize));
                     *readStreamPtrPtr += ((bindingCount)) * sizeof(const VkDeviceSize);
                 }
                 // WARNING PTR CHECK
                 memcpy((VkDeviceSize**)&pStrides, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pStrides);
                 *readStreamPtrPtr += 8;
-                if (pStrides)
-                {
-                    if (((bindingCount)) <= MAX_STACK_ITEMS)
-                    {
+                if (pStrides) {
+                    if (((bindingCount)) <= MAX_STACK_ITEMS) {
                         pStrides = (VkDeviceSize*)stack_pStrides;
+                    } else {
+                        readStream->alloc((void**)&pStrides,
+                                          ((bindingCount)) * sizeof(const VkDeviceSize));
                     }
-                    else
-                    {
-                        readStream->alloc((void**)&pStrides, ((bindingCount)) * sizeof(const VkDeviceSize));
-                    }
-                    memcpy((VkDeviceSize*)pStrides, *readStreamPtrPtr, ((bindingCount)) * sizeof(const VkDeviceSize));
+                    memcpy((VkDeviceSize*)pStrides, *readStreamPtrPtr,
+                           ((bindingCount)) * sizeof(const VkDeviceSize));
                     *readStreamPtrPtr += ((bindingCount)) * sizeof(const VkDeviceSize);
                 }
-                vk->vkCmdBindVertexBuffers2EXT((VkCommandBuffer)dispatchHandle, firstBinding, bindingCount, pBuffers, pOffsets, pSizes, pStrides);
+                vk->vkCmdBindVertexBuffers2EXT((VkCommandBuffer)dispatchHandle, firstBinding,
+                                               bindingCount, pBuffers, pOffsets, pSizes, pStrides);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetDepthTestEnableEXT:
-            {
+            case OP_vkCmdSetDepthTestEnableEXT: {
                 android::base::beginTrace("vkCmdSetDepthTestEnableEXT subdecode");
                 VkBool32 depthTestEnable;
                 memcpy((VkBool32*)&depthTestEnable, *readStreamPtrPtr, sizeof(VkBool32));
@@ -3693,8 +3717,7 @@
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetDepthWriteEnableEXT:
-            {
+            case OP_vkCmdSetDepthWriteEnableEXT: {
                 android::base::beginTrace("vkCmdSetDepthWriteEnableEXT subdecode");
                 VkBool32 depthWriteEnable;
                 memcpy((VkBool32*)&depthWriteEnable, *readStreamPtrPtr, sizeof(VkBool32));
@@ -3703,8 +3726,7 @@
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetDepthCompareOpEXT:
-            {
+            case OP_vkCmdSetDepthCompareOpEXT: {
                 android::base::beginTrace("vkCmdSetDepthCompareOpEXT subdecode");
                 VkCompareOp depthCompareOp;
                 memcpy((VkCompareOp*)&depthCompareOp, *readStreamPtrPtr, sizeof(VkCompareOp));
@@ -3713,35 +3735,35 @@
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetDepthBoundsTestEnableEXT:
-            {
+            case OP_vkCmdSetDepthBoundsTestEnableEXT: {
                 android::base::beginTrace("vkCmdSetDepthBoundsTestEnableEXT subdecode");
                 VkBool32 depthBoundsTestEnable;
                 memcpy((VkBool32*)&depthBoundsTestEnable, *readStreamPtrPtr, sizeof(VkBool32));
                 *readStreamPtrPtr += sizeof(VkBool32);
-                vk->vkCmdSetDepthBoundsTestEnableEXT((VkCommandBuffer)dispatchHandle, depthBoundsTestEnable);
+                vk->vkCmdSetDepthBoundsTestEnableEXT((VkCommandBuffer)dispatchHandle,
+                                                     depthBoundsTestEnable);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetStencilTestEnableEXT:
-            {
+            case OP_vkCmdSetStencilTestEnableEXT: {
                 android::base::beginTrace("vkCmdSetStencilTestEnableEXT subdecode");
                 VkBool32 stencilTestEnable;
                 memcpy((VkBool32*)&stencilTestEnable, *readStreamPtrPtr, sizeof(VkBool32));
                 *readStreamPtrPtr += sizeof(VkBool32);
-                vk->vkCmdSetStencilTestEnableEXT((VkCommandBuffer)dispatchHandle, stencilTestEnable);
+                vk->vkCmdSetStencilTestEnableEXT((VkCommandBuffer)dispatchHandle,
+                                                 stencilTestEnable);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetStencilOpEXT:
-            {
+            case OP_vkCmdSetStencilOpEXT: {
                 android::base::beginTrace("vkCmdSetStencilOpEXT subdecode");
                 VkStencilFaceFlags faceMask;
                 VkStencilOp failOp;
                 VkStencilOp passOp;
                 VkStencilOp depthFailOp;
                 VkCompareOp compareOp;
-                memcpy((VkStencilFaceFlags*)&faceMask, *readStreamPtrPtr, sizeof(VkStencilFaceFlags));
+                memcpy((VkStencilFaceFlags*)&faceMask, *readStreamPtrPtr,
+                       sizeof(VkStencilFaceFlags));
                 *readStreamPtrPtr += sizeof(VkStencilFaceFlags);
                 memcpy((VkStencilOp*)&failOp, *readStreamPtrPtr, sizeof(VkStencilOp));
                 *readStreamPtrPtr += sizeof(VkStencilOp);
@@ -3751,7 +3773,8 @@
                 *readStreamPtrPtr += sizeof(VkStencilOp);
                 memcpy((VkCompareOp*)&compareOp, *readStreamPtrPtr, sizeof(VkCompareOp));
                 *readStreamPtrPtr += sizeof(VkCompareOp);
-                vk->vkCmdSetStencilOpEXT((VkCommandBuffer)dispatchHandle, faceMask, failOp, passOp, depthFailOp, compareOp);
+                vk->vkCmdSetStencilOpEXT((VkCommandBuffer)dispatchHandle, faceMask, failOp, passOp,
+                                         depthFailOp, compareOp);
                 android::base::endTrace();
                 break;
             }
@@ -3761,23 +3784,24 @@
 #ifdef VK_EXT_shader_demote_to_helper_invocation
 #endif
 #ifdef VK_NV_device_generated_commands
-            case OP_vkCmdPreprocessGeneratedCommandsNV:
-            {
+            case OP_vkCmdPreprocessGeneratedCommandsNV: {
                 android::base::beginTrace("vkCmdPreprocessGeneratedCommandsNV subdecode");
                 const VkGeneratedCommandsInfoNV* pGeneratedCommandsInfo;
                 VkGeneratedCommandsInfoNV stack_pGeneratedCommandsInfo[1];
                 pGeneratedCommandsInfo = (VkGeneratedCommandsInfoNV*)stack_pGeneratedCommandsInfo;
-                reservedunmarshal_VkGeneratedCommandsInfoNV(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkGeneratedCommandsInfoNV*)(pGeneratedCommandsInfo), readStreamPtrPtr);
-                if (pGeneratedCommandsInfo)
-                {
-                    transform_tohost_VkGeneratedCommandsInfoNV(globalstate, (VkGeneratedCommandsInfoNV*)(pGeneratedCommandsInfo));
+                reservedunmarshal_VkGeneratedCommandsInfoNV(
+                    readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkGeneratedCommandsInfoNV*)(pGeneratedCommandsInfo), readStreamPtrPtr);
+                if (pGeneratedCommandsInfo) {
+                    transform_tohost_VkGeneratedCommandsInfoNV(
+                        globalstate, (VkGeneratedCommandsInfoNV*)(pGeneratedCommandsInfo));
                 }
-                vk->vkCmdPreprocessGeneratedCommandsNV((VkCommandBuffer)dispatchHandle, pGeneratedCommandsInfo);
+                vk->vkCmdPreprocessGeneratedCommandsNV((VkCommandBuffer)dispatchHandle,
+                                                       pGeneratedCommandsInfo);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdExecuteGeneratedCommandsNV:
-            {
+            case OP_vkCmdExecuteGeneratedCommandsNV: {
                 android::base::beginTrace("vkCmdExecuteGeneratedCommandsNV subdecode");
                 VkBool32 isPreprocessed;
                 const VkGeneratedCommandsInfoNV* pGeneratedCommandsInfo;
@@ -3785,22 +3809,25 @@
                 memcpy((VkBool32*)&isPreprocessed, *readStreamPtrPtr, sizeof(VkBool32));
                 *readStreamPtrPtr += sizeof(VkBool32);
                 pGeneratedCommandsInfo = (VkGeneratedCommandsInfoNV*)stack_pGeneratedCommandsInfo;
-                reservedunmarshal_VkGeneratedCommandsInfoNV(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkGeneratedCommandsInfoNV*)(pGeneratedCommandsInfo), readStreamPtrPtr);
-                if (pGeneratedCommandsInfo)
-                {
-                    transform_tohost_VkGeneratedCommandsInfoNV(globalstate, (VkGeneratedCommandsInfoNV*)(pGeneratedCommandsInfo));
+                reservedunmarshal_VkGeneratedCommandsInfoNV(
+                    readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkGeneratedCommandsInfoNV*)(pGeneratedCommandsInfo), readStreamPtrPtr);
+                if (pGeneratedCommandsInfo) {
+                    transform_tohost_VkGeneratedCommandsInfoNV(
+                        globalstate, (VkGeneratedCommandsInfoNV*)(pGeneratedCommandsInfo));
                 }
-                vk->vkCmdExecuteGeneratedCommandsNV((VkCommandBuffer)dispatchHandle, isPreprocessed, pGeneratedCommandsInfo);
+                vk->vkCmdExecuteGeneratedCommandsNV((VkCommandBuffer)dispatchHandle, isPreprocessed,
+                                                    pGeneratedCommandsInfo);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdBindPipelineShaderGroupNV:
-            {
+            case OP_vkCmdBindPipelineShaderGroupNV: {
                 android::base::beginTrace("vkCmdBindPipelineShaderGroupNV subdecode");
                 VkPipelineBindPoint pipelineBindPoint;
                 VkPipeline pipeline;
                 uint32_t groupIndex;
-                memcpy((VkPipelineBindPoint*)&pipelineBindPoint, *readStreamPtrPtr, sizeof(VkPipelineBindPoint));
+                memcpy((VkPipelineBindPoint*)&pipelineBindPoint, *readStreamPtrPtr,
+                       sizeof(VkPipelineBindPoint));
                 *readStreamPtrPtr += sizeof(VkPipelineBindPoint);
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
@@ -3808,7 +3835,8 @@
                 *(VkPipeline*)&pipeline = (VkPipeline)unbox_VkPipeline((VkPipeline)(*&cgen_var_0));
                 memcpy((uint32_t*)&groupIndex, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdBindPipelineShaderGroupNV((VkCommandBuffer)dispatchHandle, pipelineBindPoint, pipeline, groupIndex);
+                vk->vkCmdBindPipelineShaderGroupNV((VkCommandBuffer)dispatchHandle,
+                                                   pipelineBindPoint, pipeline, groupIndex);
                 android::base::endTrace();
                 break;
             }
@@ -3838,16 +3866,18 @@
 #ifdef VK_QCOM_render_pass_store_ops
 #endif
 #ifdef VK_NV_fragment_shading_rate_enums
-            case OP_vkCmdSetFragmentShadingRateEnumNV:
-            {
+            case OP_vkCmdSetFragmentShadingRateEnumNV: {
                 android::base::beginTrace("vkCmdSetFragmentShadingRateEnumNV subdecode");
                 VkFragmentShadingRateNV shadingRate;
                 VkFragmentShadingRateCombinerOpKHR combinerOps[2];
-                memcpy((VkFragmentShadingRateNV*)&shadingRate, *readStreamPtrPtr, sizeof(VkFragmentShadingRateNV));
+                memcpy((VkFragmentShadingRateNV*)&shadingRate, *readStreamPtrPtr,
+                       sizeof(VkFragmentShadingRateNV));
                 *readStreamPtrPtr += sizeof(VkFragmentShadingRateNV);
-                memcpy((VkFragmentShadingRateCombinerOpKHR*)combinerOps, *readStreamPtrPtr, 2 * sizeof(const VkFragmentShadingRateCombinerOpKHR));
+                memcpy((VkFragmentShadingRateCombinerOpKHR*)combinerOps, *readStreamPtrPtr,
+                       2 * sizeof(const VkFragmentShadingRateCombinerOpKHR));
                 *readStreamPtrPtr += 2 * sizeof(const VkFragmentShadingRateCombinerOpKHR);
-                vk->vkCmdSetFragmentShadingRateEnumNV((VkCommandBuffer)dispatchHandle, shadingRate, combinerOps);
+                vk->vkCmdSetFragmentShadingRateEnumNV((VkCommandBuffer)dispatchHandle, shadingRate,
+                                                      combinerOps);
                 android::base::endTrace();
                 break;
             }
@@ -3873,58 +3903,69 @@
 #ifdef VK_VALVE_mutable_descriptor_type
 #endif
 #ifdef VK_EXT_vertex_input_dynamic_state
-            case OP_vkCmdSetVertexInputEXT:
-            {
+            case OP_vkCmdSetVertexInputEXT: {
                 android::base::beginTrace("vkCmdSetVertexInputEXT subdecode");
                 uint32_t vertexBindingDescriptionCount;
                 const VkVertexInputBindingDescription2EXT* pVertexBindingDescriptions;
-                VkVertexInputBindingDescription2EXT stack_pVertexBindingDescriptions[MAX_STACK_ITEMS];
+                VkVertexInputBindingDescription2EXT
+                    stack_pVertexBindingDescriptions[MAX_STACK_ITEMS];
                 uint32_t vertexAttributeDescriptionCount;
                 const VkVertexInputAttributeDescription2EXT* pVertexAttributeDescriptions;
-                VkVertexInputAttributeDescription2EXT stack_pVertexAttributeDescriptions[MAX_STACK_ITEMS];
-                memcpy((uint32_t*)&vertexBindingDescriptionCount, *readStreamPtrPtr, sizeof(uint32_t));
+                VkVertexInputAttributeDescription2EXT
+                    stack_pVertexAttributeDescriptions[MAX_STACK_ITEMS];
+                memcpy((uint32_t*)&vertexBindingDescriptionCount, *readStreamPtrPtr,
+                       sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((vertexBindingDescriptionCount)) <= MAX_STACK_ITEMS)
-                {
-                    pVertexBindingDescriptions = (VkVertexInputBindingDescription2EXT*)stack_pVertexBindingDescriptions;
+                if (((vertexBindingDescriptionCount)) <= MAX_STACK_ITEMS) {
+                    pVertexBindingDescriptions =
+                        (VkVertexInputBindingDescription2EXT*)stack_pVertexBindingDescriptions;
+                } else {
+                    readStream->alloc((void**)&pVertexBindingDescriptions,
+                                      ((vertexBindingDescriptionCount)) *
+                                          sizeof(const VkVertexInputBindingDescription2EXT));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pVertexBindingDescriptions, ((vertexBindingDescriptionCount)) * sizeof(const VkVertexInputBindingDescription2EXT));
+                for (uint32_t i = 0; i < (uint32_t)((vertexBindingDescriptionCount)); ++i) {
+                    reservedunmarshal_VkVertexInputBindingDescription2EXT(
+                        readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkVertexInputBindingDescription2EXT*)(pVertexBindingDescriptions + i),
+                        readStreamPtrPtr);
                 }
-                for (uint32_t i = 0; i < (uint32_t)((vertexBindingDescriptionCount)); ++i)
-                {
-                    reservedunmarshal_VkVertexInputBindingDescription2EXT(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkVertexInputBindingDescription2EXT*)(pVertexBindingDescriptions + i), readStreamPtrPtr);
-                }
-                memcpy((uint32_t*)&vertexAttributeDescriptionCount, *readStreamPtrPtr, sizeof(uint32_t));
+                memcpy((uint32_t*)&vertexAttributeDescriptionCount, *readStreamPtrPtr,
+                       sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((vertexAttributeDescriptionCount)) <= MAX_STACK_ITEMS)
-                {
-                    pVertexAttributeDescriptions = (VkVertexInputAttributeDescription2EXT*)stack_pVertexAttributeDescriptions;
+                if (((vertexAttributeDescriptionCount)) <= MAX_STACK_ITEMS) {
+                    pVertexAttributeDescriptions =
+                        (VkVertexInputAttributeDescription2EXT*)stack_pVertexAttributeDescriptions;
+                } else {
+                    readStream->alloc((void**)&pVertexAttributeDescriptions,
+                                      ((vertexAttributeDescriptionCount)) *
+                                          sizeof(const VkVertexInputAttributeDescription2EXT));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pVertexAttributeDescriptions, ((vertexAttributeDescriptionCount)) * sizeof(const VkVertexInputAttributeDescription2EXT));
+                for (uint32_t i = 0; i < (uint32_t)((vertexAttributeDescriptionCount)); ++i) {
+                    reservedunmarshal_VkVertexInputAttributeDescription2EXT(
+                        readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkVertexInputAttributeDescription2EXT*)(pVertexAttributeDescriptions + i),
+                        readStreamPtrPtr);
                 }
-                for (uint32_t i = 0; i < (uint32_t)((vertexAttributeDescriptionCount)); ++i)
-                {
-                    reservedunmarshal_VkVertexInputAttributeDescription2EXT(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkVertexInputAttributeDescription2EXT*)(pVertexAttributeDescriptions + i), readStreamPtrPtr);
-                }
-                if (pVertexBindingDescriptions)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((vertexBindingDescriptionCount)); ++i)
-                    {
-                        transform_tohost_VkVertexInputBindingDescription2EXT(globalstate, (VkVertexInputBindingDescription2EXT*)(pVertexBindingDescriptions + i));
+                if (pVertexBindingDescriptions) {
+                    for (uint32_t i = 0; i < (uint32_t)((vertexBindingDescriptionCount)); ++i) {
+                        transform_tohost_VkVertexInputBindingDescription2EXT(
+                            globalstate,
+                            (VkVertexInputBindingDescription2EXT*)(pVertexBindingDescriptions + i));
                     }
                 }
-                if (pVertexAttributeDescriptions)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((vertexAttributeDescriptionCount)); ++i)
-                    {
-                        transform_tohost_VkVertexInputAttributeDescription2EXT(globalstate, (VkVertexInputAttributeDescription2EXT*)(pVertexAttributeDescriptions + i));
+                if (pVertexAttributeDescriptions) {
+                    for (uint32_t i = 0; i < (uint32_t)((vertexAttributeDescriptionCount)); ++i) {
+                        transform_tohost_VkVertexInputAttributeDescription2EXT(
+                            globalstate,
+                            (VkVertexInputAttributeDescription2EXT*)(pVertexAttributeDescriptions +
+                                                                     i));
                     }
                 }
-                vk->vkCmdSetVertexInputEXT((VkCommandBuffer)dispatchHandle, vertexBindingDescriptionCount, pVertexBindingDescriptions, vertexAttributeDescriptionCount, pVertexAttributeDescriptions);
+                vk->vkCmdSetVertexInputEXT(
+                    (VkCommandBuffer)dispatchHandle, vertexBindingDescriptionCount,
+                    pVertexBindingDescriptions, vertexAttributeDescriptionCount,
+                    pVertexAttributeDescriptions);
                 android::base::endTrace();
                 break;
             }
@@ -3940,8 +3981,7 @@
 #ifdef VK_FUCHSIA_buffer_collection
 #endif
 #ifdef VK_HUAWEI_subpass_shading
-            case OP_vkCmdSubpassShadingHUAWEI:
-            {
+            case OP_vkCmdSubpassShadingHUAWEI: {
                 android::base::beginTrace("vkCmdSubpassShadingHUAWEI subdecode");
                 vk->vkCmdSubpassShadingHUAWEI((VkCommandBuffer)dispatchHandle);
                 android::base::endTrace();
@@ -3949,18 +3989,19 @@
             }
 #endif
 #ifdef VK_HUAWEI_invocation_mask
-            case OP_vkCmdBindInvocationMaskHUAWEI:
-            {
+            case OP_vkCmdBindInvocationMaskHUAWEI: {
                 android::base::beginTrace("vkCmdBindInvocationMaskHUAWEI subdecode");
                 VkImageView imageView;
                 VkImageLayout imageLayout;
                 uint64_t cgen_var_0;
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkImageView*)&imageView = (VkImageView)unbox_VkImageView((VkImageView)(*&cgen_var_0));
+                *(VkImageView*)&imageView =
+                    (VkImageView)unbox_VkImageView((VkImageView)(*&cgen_var_0));
                 memcpy((VkImageLayout*)&imageLayout, *readStreamPtrPtr, sizeof(VkImageLayout));
                 *readStreamPtrPtr += sizeof(VkImageLayout);
-                vk->vkCmdBindInvocationMaskHUAWEI((VkCommandBuffer)dispatchHandle, imageView, imageLayout);
+                vk->vkCmdBindInvocationMaskHUAWEI((VkCommandBuffer)dispatchHandle, imageView,
+                                                  imageLayout);
                 android::base::endTrace();
                 break;
             }
@@ -3968,28 +4009,27 @@
 #ifdef VK_NV_external_memory_rdma
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
-            case OP_vkCmdSetPatchControlPointsEXT:
-            {
+            case OP_vkCmdSetPatchControlPointsEXT: {
                 android::base::beginTrace("vkCmdSetPatchControlPointsEXT subdecode");
                 uint32_t patchControlPoints;
                 memcpy((uint32_t*)&patchControlPoints, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdSetPatchControlPointsEXT((VkCommandBuffer)dispatchHandle, patchControlPoints);
+                vk->vkCmdSetPatchControlPointsEXT((VkCommandBuffer)dispatchHandle,
+                                                  patchControlPoints);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetRasterizerDiscardEnableEXT:
-            {
+            case OP_vkCmdSetRasterizerDiscardEnableEXT: {
                 android::base::beginTrace("vkCmdSetRasterizerDiscardEnableEXT subdecode");
                 VkBool32 rasterizerDiscardEnable;
                 memcpy((VkBool32*)&rasterizerDiscardEnable, *readStreamPtrPtr, sizeof(VkBool32));
                 *readStreamPtrPtr += sizeof(VkBool32);
-                vk->vkCmdSetRasterizerDiscardEnableEXT((VkCommandBuffer)dispatchHandle, rasterizerDiscardEnable);
+                vk->vkCmdSetRasterizerDiscardEnableEXT((VkCommandBuffer)dispatchHandle,
+                                                       rasterizerDiscardEnable);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetDepthBiasEnableEXT:
-            {
+            case OP_vkCmdSetDepthBiasEnableEXT: {
                 android::base::beginTrace("vkCmdSetDepthBiasEnableEXT subdecode");
                 VkBool32 depthBiasEnable;
                 memcpy((VkBool32*)&depthBiasEnable, *readStreamPtrPtr, sizeof(VkBool32));
@@ -3998,8 +4038,7 @@
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetLogicOpEXT:
-            {
+            case OP_vkCmdSetLogicOpEXT: {
                 android::base::beginTrace("vkCmdSetLogicOpEXT subdecode");
                 VkLogicOp logicOp;
                 memcpy((VkLogicOp*)&logicOp, *readStreamPtrPtr, sizeof(VkLogicOp));
@@ -4008,13 +4047,13 @@
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetPrimitiveRestartEnableEXT:
-            {
+            case OP_vkCmdSetPrimitiveRestartEnableEXT: {
                 android::base::beginTrace("vkCmdSetPrimitiveRestartEnableEXT subdecode");
                 VkBool32 primitiveRestartEnable;
                 memcpy((VkBool32*)&primitiveRestartEnable, *readStreamPtrPtr, sizeof(VkBool32));
                 *readStreamPtrPtr += sizeof(VkBool32);
-                vk->vkCmdSetPrimitiveRestartEnableEXT((VkCommandBuffer)dispatchHandle, primitiveRestartEnable);
+                vk->vkCmdSetPrimitiveRestartEnableEXT((VkCommandBuffer)dispatchHandle,
+                                                      primitiveRestartEnable);
                 android::base::endTrace();
                 break;
             }
@@ -4022,64 +4061,65 @@
 #ifdef VK_QNX_screen_surface
 #endif
 #ifdef VK_EXT_color_write_enable
-            case OP_vkCmdSetColorWriteEnableEXT:
-            {
+            case OP_vkCmdSetColorWriteEnableEXT: {
                 android::base::beginTrace("vkCmdSetColorWriteEnableEXT subdecode");
                 uint32_t attachmentCount;
                 const VkBool32* pColorWriteEnables;
                 VkBool32 stack_pColorWriteEnables[MAX_STACK_ITEMS];
                 memcpy((uint32_t*)&attachmentCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((attachmentCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((attachmentCount)) <= MAX_STACK_ITEMS) {
                     pColorWriteEnables = (VkBool32*)stack_pColorWriteEnables;
+                } else {
+                    readStream->alloc((void**)&pColorWriteEnables,
+                                      ((attachmentCount)) * sizeof(const VkBool32));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pColorWriteEnables, ((attachmentCount)) * sizeof(const VkBool32));
-                }
-                memcpy((VkBool32*)pColorWriteEnables, *readStreamPtrPtr, ((attachmentCount)) * sizeof(const VkBool32));
+                memcpy((VkBool32*)pColorWriteEnables, *readStreamPtrPtr,
+                       ((attachmentCount)) * sizeof(const VkBool32));
                 *readStreamPtrPtr += ((attachmentCount)) * sizeof(const VkBool32);
-                vk->vkCmdSetColorWriteEnableEXT((VkCommandBuffer)dispatchHandle, attachmentCount, pColorWriteEnables);
+                vk->vkCmdSetColorWriteEnableEXT((VkCommandBuffer)dispatchHandle, attachmentCount,
+                                                pColorWriteEnables);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_GOOGLE_gfxstream
-            case OP_vkBeginCommandBufferAsyncGOOGLE:
-            {
+            case OP_vkBeginCommandBufferAsyncGOOGLE: {
                 android::base::beginTrace("vkBeginCommandBufferAsyncGOOGLE subdecode");
                 const VkCommandBufferBeginInfo* pBeginInfo;
                 VkCommandBufferBeginInfo stack_pBeginInfo[1];
                 pBeginInfo = (VkCommandBufferBeginInfo*)stack_pBeginInfo;
-                reservedunmarshal_VkCommandBufferBeginInfo(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCommandBufferBeginInfo*)(pBeginInfo), readStreamPtrPtr);
-                if (pBeginInfo)
-                {
-                    transform_tohost_VkCommandBufferBeginInfo(globalstate, (VkCommandBufferBeginInfo*)(pBeginInfo));
+                reservedunmarshal_VkCommandBufferBeginInfo(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                           (VkCommandBufferBeginInfo*)(pBeginInfo),
+                                                           readStreamPtrPtr);
+                if (pBeginInfo) {
+                    transform_tohost_VkCommandBufferBeginInfo(
+                        globalstate, (VkCommandBufferBeginInfo*)(pBeginInfo));
                 }
-                this->on_vkBeginCommandBufferAsyncGOOGLE(pool, (VkCommandBuffer)(boxed_dispatchHandle), pBeginInfo, gfx_logger);
+                this->on_vkBeginCommandBufferAsyncGOOGLE(
+                    pool, (VkCommandBuffer)(boxed_dispatchHandle), pBeginInfo, gfx_logger);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkEndCommandBufferAsyncGOOGLE:
-            {
+            case OP_vkEndCommandBufferAsyncGOOGLE: {
                 android::base::beginTrace("vkEndCommandBufferAsyncGOOGLE subdecode");
-                this->on_vkEndCommandBufferAsyncGOOGLE(pool, (VkCommandBuffer)(boxed_dispatchHandle), gfx_logger);
+                this->on_vkEndCommandBufferAsyncGOOGLE(
+                    pool, (VkCommandBuffer)(boxed_dispatchHandle), gfx_logger);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkResetCommandBufferAsyncGOOGLE:
-            {
+            case OP_vkResetCommandBufferAsyncGOOGLE: {
                 android::base::beginTrace("vkResetCommandBufferAsyncGOOGLE subdecode");
                 VkCommandBufferResetFlags flags;
-                memcpy((VkCommandBufferResetFlags*)&flags, *readStreamPtrPtr, sizeof(VkCommandBufferResetFlags));
+                memcpy((VkCommandBufferResetFlags*)&flags, *readStreamPtrPtr,
+                       sizeof(VkCommandBufferResetFlags));
                 *readStreamPtrPtr += sizeof(VkCommandBufferResetFlags);
-                this->on_vkResetCommandBufferAsyncGOOGLE(pool, (VkCommandBuffer)(boxed_dispatchHandle), flags);
+                this->on_vkResetCommandBufferAsyncGOOGLE(
+                    pool, (VkCommandBuffer)(boxed_dispatchHandle), flags);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCommandBufferHostSyncGOOGLE:
-            {
+            case OP_vkCommandBufferHostSyncGOOGLE: {
                 android::base::beginTrace("vkCommandBufferHostSyncGOOGLE subdecode");
                 uint32_t needHostSync;
                 uint32_t sequenceNumber;
@@ -4087,7 +4127,8 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&sequenceNumber, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                this->on_vkCommandBufferHostSyncGOOGLE(pool, (VkCommandBuffer)(boxed_dispatchHandle), needHostSync, sequenceNumber);
+                this->on_vkCommandBufferHostSyncGOOGLE(
+                    pool, (VkCommandBuffer)(boxed_dispatchHandle), needHostSync, sequenceNumber);
                 android::base::endTrace();
                 break;
             }
@@ -4095,8 +4136,7 @@
 #ifdef VK_EXT_global_priority_query
 #endif
 #ifdef VK_EXT_multi_draw
-            case OP_vkCmdDrawMultiEXT:
-            {
+            case OP_vkCmdDrawMultiEXT: {
                 android::base::beginTrace("vkCmdDrawMultiEXT subdecode");
                 uint32_t drawCount;
                 const VkMultiDrawInfoEXT* pVertexInfo;
@@ -4110,19 +4150,17 @@
                 memcpy((VkMultiDrawInfoEXT**)&pVertexInfo, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pVertexInfo);
                 *readStreamPtrPtr += 8;
-                if (pVertexInfo)
-                {
-                    if (((drawCount)) <= MAX_STACK_ITEMS)
-                    {
+                if (pVertexInfo) {
+                    if (((drawCount)) <= MAX_STACK_ITEMS) {
                         pVertexInfo = (VkMultiDrawInfoEXT*)stack_pVertexInfo;
+                    } else {
+                        readStream->alloc((void**)&pVertexInfo,
+                                          ((drawCount)) * sizeof(const VkMultiDrawInfoEXT));
                     }
-                    else
-                    {
-                        readStream->alloc((void**)&pVertexInfo, ((drawCount)) * sizeof(const VkMultiDrawInfoEXT));
-                    }
-                    for (uint32_t i = 0; i < (uint32_t)((drawCount)); ++i)
-                    {
-                        reservedunmarshal_VkMultiDrawInfoEXT(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMultiDrawInfoEXT*)(pVertexInfo + i), readStreamPtrPtr);
+                    for (uint32_t i = 0; i < (uint32_t)((drawCount)); ++i) {
+                        reservedunmarshal_VkMultiDrawInfoEXT(readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                                                             (VkMultiDrawInfoEXT*)(pVertexInfo + i),
+                                                             readStreamPtrPtr);
                     }
                 }
                 memcpy((uint32_t*)&instanceCount, *readStreamPtrPtr, sizeof(uint32_t));
@@ -4131,19 +4169,18 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&stride, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (pVertexInfo)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((drawCount)); ++i)
-                    {
-                        transform_tohost_VkMultiDrawInfoEXT(globalstate, (VkMultiDrawInfoEXT*)(pVertexInfo + i));
+                if (pVertexInfo) {
+                    for (uint32_t i = 0; i < (uint32_t)((drawCount)); ++i) {
+                        transform_tohost_VkMultiDrawInfoEXT(globalstate,
+                                                            (VkMultiDrawInfoEXT*)(pVertexInfo + i));
                     }
                 }
-                vk->vkCmdDrawMultiEXT((VkCommandBuffer)dispatchHandle, drawCount, pVertexInfo, instanceCount, firstInstance, stride);
+                vk->vkCmdDrawMultiEXT((VkCommandBuffer)dispatchHandle, drawCount, pVertexInfo,
+                                      instanceCount, firstInstance, stride);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdDrawMultiIndexedEXT:
-            {
+            case OP_vkCmdDrawMultiIndexedEXT: {
                 android::base::beginTrace("vkCmdDrawMultiIndexedEXT subdecode");
                 uint32_t drawCount;
                 const VkMultiDrawIndexedInfoEXT* pIndexInfo;
@@ -4159,19 +4196,17 @@
                 memcpy((VkMultiDrawIndexedInfoEXT**)&pIndexInfo, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pIndexInfo);
                 *readStreamPtrPtr += 8;
-                if (pIndexInfo)
-                {
-                    if (((drawCount)) <= MAX_STACK_ITEMS)
-                    {
+                if (pIndexInfo) {
+                    if (((drawCount)) <= MAX_STACK_ITEMS) {
                         pIndexInfo = (VkMultiDrawIndexedInfoEXT*)stack_pIndexInfo;
+                    } else {
+                        readStream->alloc((void**)&pIndexInfo,
+                                          ((drawCount)) * sizeof(const VkMultiDrawIndexedInfoEXT));
                     }
-                    else
-                    {
-                        readStream->alloc((void**)&pIndexInfo, ((drawCount)) * sizeof(const VkMultiDrawIndexedInfoEXT));
-                    }
-                    for (uint32_t i = 0; i < (uint32_t)((drawCount)); ++i)
-                    {
-                        reservedunmarshal_VkMultiDrawIndexedInfoEXT(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMultiDrawIndexedInfoEXT*)(pIndexInfo + i), readStreamPtrPtr);
+                    for (uint32_t i = 0; i < (uint32_t)((drawCount)); ++i) {
+                        reservedunmarshal_VkMultiDrawIndexedInfoEXT(
+                            readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                            (VkMultiDrawIndexedInfoEXT*)(pIndexInfo + i), readStreamPtrPtr);
                     }
                 }
                 memcpy((uint32_t*)&instanceCount, *readStreamPtrPtr, sizeof(uint32_t));
@@ -4184,20 +4219,19 @@
                 memcpy((int32_t**)&pVertexOffset, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pVertexOffset);
                 *readStreamPtrPtr += 8;
-                if (pVertexOffset)
-                {
+                if (pVertexOffset) {
                     pVertexOffset = (int32_t*)stack_pVertexOffset;
                     memcpy((int32_t*)pVertexOffset, *readStreamPtrPtr, sizeof(const int32_t));
                     *readStreamPtrPtr += sizeof(const int32_t);
                 }
-                if (pIndexInfo)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((drawCount)); ++i)
-                    {
-                        transform_tohost_VkMultiDrawIndexedInfoEXT(globalstate, (VkMultiDrawIndexedInfoEXT*)(pIndexInfo + i));
+                if (pIndexInfo) {
+                    for (uint32_t i = 0; i < (uint32_t)((drawCount)); ++i) {
+                        transform_tohost_VkMultiDrawIndexedInfoEXT(
+                            globalstate, (VkMultiDrawIndexedInfoEXT*)(pIndexInfo + i));
                     }
                 }
-                vk->vkCmdDrawMultiIndexedEXT((VkCommandBuffer)dispatchHandle, drawCount, pIndexInfo, instanceCount, firstInstance, stride, pVertexOffset);
+                vk->vkCmdDrawMultiIndexedEXT((VkCommandBuffer)dispatchHandle, drawCount, pIndexInfo,
+                                             instanceCount, firstInstance, stride, pVertexOffset);
                 android::base::endTrace();
                 break;
             }
@@ -4209,8 +4243,7 @@
 #ifdef VK_EXT_pageable_device_local_memory
 #endif
 #ifdef VK_KHR_acceleration_structure
-            case OP_vkCmdBuildAccelerationStructuresKHR:
-            {
+            case OP_vkCmdBuildAccelerationStructuresKHR: {
                 android::base::beginTrace("vkCmdBuildAccelerationStructuresKHR subdecode");
                 uint32_t infoCount;
                 const VkAccelerationStructureBuildGeometryInfoKHR* pInfos;
@@ -4219,32 +4252,33 @@
                 VkAccelerationStructureBuildRangeInfoKHR* stack_ppBuildRangeInfos[MAX_STACK_ITEMS];
                 memcpy((uint32_t*)&infoCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((infoCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((infoCount)) <= MAX_STACK_ITEMS) {
                     pInfos = (VkAccelerationStructureBuildGeometryInfoKHR*)stack_pInfos;
+                } else {
+                    readStream->alloc(
+                        (void**)&pInfos,
+                        ((infoCount)) * sizeof(const VkAccelerationStructureBuildGeometryInfoKHR));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pInfos, ((infoCount)) * sizeof(const VkAccelerationStructureBuildGeometryInfoKHR));
+                for (uint32_t i = 0; i < (uint32_t)((infoCount)); ++i) {
+                    reservedunmarshal_VkAccelerationStructureBuildGeometryInfoKHR(
+                        readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAccelerationStructureBuildGeometryInfoKHR*)(pInfos + i),
+                        readStreamPtrPtr);
                 }
-                for (uint32_t i = 0; i < (uint32_t)((infoCount)); ++i)
-                {
-                    reservedunmarshal_VkAccelerationStructureBuildGeometryInfoKHR(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureBuildGeometryInfoKHR*)(pInfos + i), readStreamPtrPtr);
-                }
-                if (pInfos)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((infoCount)); ++i)
-                    {
-                        transform_tohost_VkAccelerationStructureBuildGeometryInfoKHR(globalstate, (VkAccelerationStructureBuildGeometryInfoKHR*)(pInfos + i));
+                if (pInfos) {
+                    for (uint32_t i = 0; i < (uint32_t)((infoCount)); ++i) {
+                        transform_tohost_VkAccelerationStructureBuildGeometryInfoKHR(
+                            globalstate,
+                            (VkAccelerationStructureBuildGeometryInfoKHR*)(pInfos + i));
                     }
                 }
                 (void)ppBuildRangeInfos;
-                vk->vkCmdBuildAccelerationStructuresKHR((VkCommandBuffer)dispatchHandle, infoCount, pInfos, ppBuildRangeInfos);
+                vk->vkCmdBuildAccelerationStructuresKHR((VkCommandBuffer)dispatchHandle, infoCount,
+                                                        pInfos, ppBuildRangeInfos);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdBuildAccelerationStructuresIndirectKHR:
-            {
+            case OP_vkCmdBuildAccelerationStructuresIndirectKHR: {
                 android::base::beginTrace("vkCmdBuildAccelerationStructuresIndirectKHR subdecode");
                 uint32_t infoCount;
                 const VkAccelerationStructureBuildGeometryInfoKHR* pInfos;
@@ -4257,98 +4291,104 @@
                 uint32_t* stack_ppMaxPrimitiveCounts[MAX_STACK_ITEMS];
                 memcpy((uint32_t*)&infoCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((infoCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((infoCount)) <= MAX_STACK_ITEMS) {
                     pInfos = (VkAccelerationStructureBuildGeometryInfoKHR*)stack_pInfos;
+                } else {
+                    readStream->alloc(
+                        (void**)&pInfos,
+                        ((infoCount)) * sizeof(const VkAccelerationStructureBuildGeometryInfoKHR));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pInfos, ((infoCount)) * sizeof(const VkAccelerationStructureBuildGeometryInfoKHR));
+                for (uint32_t i = 0; i < (uint32_t)((infoCount)); ++i) {
+                    reservedunmarshal_VkAccelerationStructureBuildGeometryInfoKHR(
+                        readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                        (VkAccelerationStructureBuildGeometryInfoKHR*)(pInfos + i),
+                        readStreamPtrPtr);
                 }
-                for (uint32_t i = 0; i < (uint32_t)((infoCount)); ++i)
-                {
-                    reservedunmarshal_VkAccelerationStructureBuildGeometryInfoKHR(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkAccelerationStructureBuildGeometryInfoKHR*)(pInfos + i), readStreamPtrPtr);
-                }
-                if (((infoCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((infoCount)) <= MAX_STACK_ITEMS) {
                     pIndirectDeviceAddresses = (VkDeviceAddress*)stack_pIndirectDeviceAddresses;
+                } else {
+                    readStream->alloc((void**)&pIndirectDeviceAddresses,
+                                      ((infoCount)) * sizeof(const VkDeviceAddress));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pIndirectDeviceAddresses, ((infoCount)) * sizeof(const VkDeviceAddress));
-                }
-                memcpy((VkDeviceAddress*)pIndirectDeviceAddresses, *readStreamPtrPtr, ((infoCount)) * sizeof(const VkDeviceAddress));
+                memcpy((VkDeviceAddress*)pIndirectDeviceAddresses, *readStreamPtrPtr,
+                       ((infoCount)) * sizeof(const VkDeviceAddress));
                 *readStreamPtrPtr += ((infoCount)) * sizeof(const VkDeviceAddress);
-                if (((infoCount)) <= MAX_STACK_ITEMS)
-                {
+                if (((infoCount)) <= MAX_STACK_ITEMS) {
                     pIndirectStrides = (uint32_t*)stack_pIndirectStrides;
+                } else {
+                    readStream->alloc((void**)&pIndirectStrides,
+                                      ((infoCount)) * sizeof(const uint32_t));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pIndirectStrides, ((infoCount)) * sizeof(const uint32_t));
-                }
-                memcpy((uint32_t*)pIndirectStrides, *readStreamPtrPtr, ((infoCount)) * sizeof(const uint32_t));
+                memcpy((uint32_t*)pIndirectStrides, *readStreamPtrPtr,
+                       ((infoCount)) * sizeof(const uint32_t));
                 *readStreamPtrPtr += ((infoCount)) * sizeof(const uint32_t);
-                if (pInfos)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)((infoCount)); ++i)
-                    {
-                        transform_tohost_VkAccelerationStructureBuildGeometryInfoKHR(globalstate, (VkAccelerationStructureBuildGeometryInfoKHR*)(pInfos + i));
+                if (pInfos) {
+                    for (uint32_t i = 0; i < (uint32_t)((infoCount)); ++i) {
+                        transform_tohost_VkAccelerationStructureBuildGeometryInfoKHR(
+                            globalstate,
+                            (VkAccelerationStructureBuildGeometryInfoKHR*)(pInfos + i));
                     }
                 }
                 (void)ppMaxPrimitiveCounts;
-                vk->vkCmdBuildAccelerationStructuresIndirectKHR((VkCommandBuffer)dispatchHandle, infoCount, pInfos, pIndirectDeviceAddresses, pIndirectStrides, ppMaxPrimitiveCounts);
+                vk->vkCmdBuildAccelerationStructuresIndirectKHR(
+                    (VkCommandBuffer)dispatchHandle, infoCount, pInfos, pIndirectDeviceAddresses,
+                    pIndirectStrides, ppMaxPrimitiveCounts);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdCopyAccelerationStructureKHR:
-            {
+            case OP_vkCmdCopyAccelerationStructureKHR: {
                 android::base::beginTrace("vkCmdCopyAccelerationStructureKHR subdecode");
                 const VkCopyAccelerationStructureInfoKHR* pInfo;
                 VkCopyAccelerationStructureInfoKHR stack_pInfo[1];
                 pInfo = (VkCopyAccelerationStructureInfoKHR*)stack_pInfo;
-                reservedunmarshal_VkCopyAccelerationStructureInfoKHR(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyAccelerationStructureInfoKHR*)(pInfo), readStreamPtrPtr);
-                if (pInfo)
-                {
-                    transform_tohost_VkCopyAccelerationStructureInfoKHR(globalstate, (VkCopyAccelerationStructureInfoKHR*)(pInfo));
+                reservedunmarshal_VkCopyAccelerationStructureInfoKHR(
+                    readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkCopyAccelerationStructureInfoKHR*)(pInfo), readStreamPtrPtr);
+                if (pInfo) {
+                    transform_tohost_VkCopyAccelerationStructureInfoKHR(
+                        globalstate, (VkCopyAccelerationStructureInfoKHR*)(pInfo));
                 }
                 vk->vkCmdCopyAccelerationStructureKHR((VkCommandBuffer)dispatchHandle, pInfo);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdCopyAccelerationStructureToMemoryKHR:
-            {
+            case OP_vkCmdCopyAccelerationStructureToMemoryKHR: {
                 android::base::beginTrace("vkCmdCopyAccelerationStructureToMemoryKHR subdecode");
                 const VkCopyAccelerationStructureToMemoryInfoKHR* pInfo;
                 VkCopyAccelerationStructureToMemoryInfoKHR stack_pInfo[1];
                 pInfo = (VkCopyAccelerationStructureToMemoryInfoKHR*)stack_pInfo;
-                reservedunmarshal_VkCopyAccelerationStructureToMemoryInfoKHR(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyAccelerationStructureToMemoryInfoKHR*)(pInfo), readStreamPtrPtr);
-                if (pInfo)
-                {
-                    transform_tohost_VkCopyAccelerationStructureToMemoryInfoKHR(globalstate, (VkCopyAccelerationStructureToMemoryInfoKHR*)(pInfo));
+                reservedunmarshal_VkCopyAccelerationStructureToMemoryInfoKHR(
+                    readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkCopyAccelerationStructureToMemoryInfoKHR*)(pInfo), readStreamPtrPtr);
+                if (pInfo) {
+                    transform_tohost_VkCopyAccelerationStructureToMemoryInfoKHR(
+                        globalstate, (VkCopyAccelerationStructureToMemoryInfoKHR*)(pInfo));
                 }
-                vk->vkCmdCopyAccelerationStructureToMemoryKHR((VkCommandBuffer)dispatchHandle, pInfo);
+                vk->vkCmdCopyAccelerationStructureToMemoryKHR((VkCommandBuffer)dispatchHandle,
+                                                              pInfo);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdCopyMemoryToAccelerationStructureKHR:
-            {
+            case OP_vkCmdCopyMemoryToAccelerationStructureKHR: {
                 android::base::beginTrace("vkCmdCopyMemoryToAccelerationStructureKHR subdecode");
                 const VkCopyMemoryToAccelerationStructureInfoKHR* pInfo;
                 VkCopyMemoryToAccelerationStructureInfoKHR stack_pInfo[1];
                 pInfo = (VkCopyMemoryToAccelerationStructureInfoKHR*)stack_pInfo;
-                reservedunmarshal_VkCopyMemoryToAccelerationStructureInfoKHR(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkCopyMemoryToAccelerationStructureInfoKHR*)(pInfo), readStreamPtrPtr);
-                if (pInfo)
-                {
-                    transform_tohost_VkCopyMemoryToAccelerationStructureInfoKHR(globalstate, (VkCopyMemoryToAccelerationStructureInfoKHR*)(pInfo));
+                reservedunmarshal_VkCopyMemoryToAccelerationStructureInfoKHR(
+                    readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkCopyMemoryToAccelerationStructureInfoKHR*)(pInfo), readStreamPtrPtr);
+                if (pInfo) {
+                    transform_tohost_VkCopyMemoryToAccelerationStructureInfoKHR(
+                        globalstate, (VkCopyMemoryToAccelerationStructureInfoKHR*)(pInfo));
                 }
-                vk->vkCmdCopyMemoryToAccelerationStructureKHR((VkCommandBuffer)dispatchHandle, pInfo);
+                vk->vkCmdCopyMemoryToAccelerationStructureKHR((VkCommandBuffer)dispatchHandle,
+                                                              pInfo);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdWriteAccelerationStructuresPropertiesKHR:
-            {
-                android::base::beginTrace("vkCmdWriteAccelerationStructuresPropertiesKHR subdecode");
+            case OP_vkCmdWriteAccelerationStructuresPropertiesKHR: {
+                android::base::beginTrace(
+                    "vkCmdWriteAccelerationStructuresPropertiesKHR subdecode");
                 uint32_t accelerationStructureCount;
                 const VkAccelerationStructureKHR* pAccelerationStructures;
                 VkAccelerationStructureKHR stack_pAccelerationStructures[MAX_STACK_ITEMS];
@@ -4357,22 +4397,23 @@
                 uint32_t firstQuery;
                 memcpy((uint32_t*)&accelerationStructureCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (((accelerationStructureCount)) <= MAX_STACK_ITEMS)
-                {
-                    pAccelerationStructures = (VkAccelerationStructureKHR*)stack_pAccelerationStructures;
+                if (((accelerationStructureCount)) <= MAX_STACK_ITEMS) {
+                    pAccelerationStructures =
+                        (VkAccelerationStructureKHR*)stack_pAccelerationStructures;
+                } else {
+                    readStream->alloc(
+                        (void**)&pAccelerationStructures,
+                        ((accelerationStructureCount)) * sizeof(const VkAccelerationStructureKHR));
                 }
-                else
-                {
-                    readStream->alloc((void**)&pAccelerationStructures, ((accelerationStructureCount)) * sizeof(const VkAccelerationStructureKHR));
-                }
-                if (((accelerationStructureCount)))
-                {
+                if (((accelerationStructureCount))) {
                     uint8_t* cgen_var_0_ptr = (uint8_t*)(*readStreamPtrPtr);
                     *readStreamPtrPtr += 8 * ((accelerationStructureCount));
-                    for (uint32_t k = 0; k < ((accelerationStructureCount)); ++k)
-                    {
-                        uint64_t tmpval; memcpy(&tmpval, cgen_var_0_ptr + k * 8, sizeof(uint64_t));
-                        *(((VkAccelerationStructureKHR*)pAccelerationStructures) + k) = (VkAccelerationStructureKHR)unbox_VkAccelerationStructureKHR((VkAccelerationStructureKHR)tmpval);
+                    for (uint32_t k = 0; k < ((accelerationStructureCount)); ++k) {
+                        uint64_t tmpval;
+                        memcpy(&tmpval, cgen_var_0_ptr + k * 8, sizeof(uint64_t));
+                        *(((VkAccelerationStructureKHR*)pAccelerationStructures) + k) =
+                            (VkAccelerationStructureKHR)unbox_VkAccelerationStructureKHR(
+                                (VkAccelerationStructureKHR)tmpval);
                     }
                 }
                 memcpy((VkQueryType*)&queryType, *readStreamPtrPtr, sizeof(VkQueryType));
@@ -4380,17 +4421,19 @@
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
-                *(VkQueryPool*)&queryPool = (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_1));
+                *(VkQueryPool*)&queryPool =
+                    (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_1));
                 memcpy((uint32_t*)&firstQuery, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdWriteAccelerationStructuresPropertiesKHR((VkCommandBuffer)dispatchHandle, accelerationStructureCount, pAccelerationStructures, queryType, queryPool, firstQuery);
+                vk->vkCmdWriteAccelerationStructuresPropertiesKHR(
+                    (VkCommandBuffer)dispatchHandle, accelerationStructureCount,
+                    pAccelerationStructures, queryType, queryPool, firstQuery);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
-            case OP_vkCmdTraceRaysKHR:
-            {
+            case OP_vkCmdTraceRaysKHR: {
                 android::base::beginTrace("vkCmdTraceRaysKHR subdecode");
                 const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable;
                 VkStridedDeviceAddressRegionKHR stack_pRaygenShaderBindingTable[1];
@@ -4403,42 +4446,58 @@
                 uint32_t width;
                 uint32_t height;
                 uint32_t depth;
-                pRaygenShaderBindingTable = (VkStridedDeviceAddressRegionKHR*)stack_pRaygenShaderBindingTable;
-                reservedunmarshal_VkStridedDeviceAddressRegionKHR(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkStridedDeviceAddressRegionKHR*)(pRaygenShaderBindingTable), readStreamPtrPtr);
-                pMissShaderBindingTable = (VkStridedDeviceAddressRegionKHR*)stack_pMissShaderBindingTable;
-                reservedunmarshal_VkStridedDeviceAddressRegionKHR(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkStridedDeviceAddressRegionKHR*)(pMissShaderBindingTable), readStreamPtrPtr);
-                pHitShaderBindingTable = (VkStridedDeviceAddressRegionKHR*)stack_pHitShaderBindingTable;
-                reservedunmarshal_VkStridedDeviceAddressRegionKHR(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkStridedDeviceAddressRegionKHR*)(pHitShaderBindingTable), readStreamPtrPtr);
-                pCallableShaderBindingTable = (VkStridedDeviceAddressRegionKHR*)stack_pCallableShaderBindingTable;
-                reservedunmarshal_VkStridedDeviceAddressRegionKHR(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkStridedDeviceAddressRegionKHR*)(pCallableShaderBindingTable), readStreamPtrPtr);
+                pRaygenShaderBindingTable =
+                    (VkStridedDeviceAddressRegionKHR*)stack_pRaygenShaderBindingTable;
+                reservedunmarshal_VkStridedDeviceAddressRegionKHR(
+                    readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkStridedDeviceAddressRegionKHR*)(pRaygenShaderBindingTable),
+                    readStreamPtrPtr);
+                pMissShaderBindingTable =
+                    (VkStridedDeviceAddressRegionKHR*)stack_pMissShaderBindingTable;
+                reservedunmarshal_VkStridedDeviceAddressRegionKHR(
+                    readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkStridedDeviceAddressRegionKHR*)(pMissShaderBindingTable), readStreamPtrPtr);
+                pHitShaderBindingTable =
+                    (VkStridedDeviceAddressRegionKHR*)stack_pHitShaderBindingTable;
+                reservedunmarshal_VkStridedDeviceAddressRegionKHR(
+                    readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkStridedDeviceAddressRegionKHR*)(pHitShaderBindingTable), readStreamPtrPtr);
+                pCallableShaderBindingTable =
+                    (VkStridedDeviceAddressRegionKHR*)stack_pCallableShaderBindingTable;
+                reservedunmarshal_VkStridedDeviceAddressRegionKHR(
+                    readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkStridedDeviceAddressRegionKHR*)(pCallableShaderBindingTable),
+                    readStreamPtrPtr);
                 memcpy((uint32_t*)&width, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&height, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&depth, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                if (pRaygenShaderBindingTable)
-                {
-                    transform_tohost_VkStridedDeviceAddressRegionKHR(globalstate, (VkStridedDeviceAddressRegionKHR*)(pRaygenShaderBindingTable));
+                if (pRaygenShaderBindingTable) {
+                    transform_tohost_VkStridedDeviceAddressRegionKHR(
+                        globalstate, (VkStridedDeviceAddressRegionKHR*)(pRaygenShaderBindingTable));
                 }
-                if (pMissShaderBindingTable)
-                {
-                    transform_tohost_VkStridedDeviceAddressRegionKHR(globalstate, (VkStridedDeviceAddressRegionKHR*)(pMissShaderBindingTable));
+                if (pMissShaderBindingTable) {
+                    transform_tohost_VkStridedDeviceAddressRegionKHR(
+                        globalstate, (VkStridedDeviceAddressRegionKHR*)(pMissShaderBindingTable));
                 }
-                if (pHitShaderBindingTable)
-                {
-                    transform_tohost_VkStridedDeviceAddressRegionKHR(globalstate, (VkStridedDeviceAddressRegionKHR*)(pHitShaderBindingTable));
+                if (pHitShaderBindingTable) {
+                    transform_tohost_VkStridedDeviceAddressRegionKHR(
+                        globalstate, (VkStridedDeviceAddressRegionKHR*)(pHitShaderBindingTable));
                 }
-                if (pCallableShaderBindingTable)
-                {
-                    transform_tohost_VkStridedDeviceAddressRegionKHR(globalstate, (VkStridedDeviceAddressRegionKHR*)(pCallableShaderBindingTable));
+                if (pCallableShaderBindingTable) {
+                    transform_tohost_VkStridedDeviceAddressRegionKHR(
+                        globalstate,
+                        (VkStridedDeviceAddressRegionKHR*)(pCallableShaderBindingTable));
                 }
-                vk->vkCmdTraceRaysKHR((VkCommandBuffer)dispatchHandle, pRaygenShaderBindingTable, pMissShaderBindingTable, pHitShaderBindingTable, pCallableShaderBindingTable, width, height, depth);
+                vk->vkCmdTraceRaysKHR((VkCommandBuffer)dispatchHandle, pRaygenShaderBindingTable,
+                                      pMissShaderBindingTable, pHitShaderBindingTable,
+                                      pCallableShaderBindingTable, width, height, depth);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdTraceRaysIndirectKHR:
-            {
+            case OP_vkCmdTraceRaysIndirectKHR: {
                 android::base::beginTrace("vkCmdTraceRaysIndirectKHR subdecode");
                 const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable;
                 VkStridedDeviceAddressRegionKHR stack_pRaygenShaderBindingTable[1];
@@ -4449,59 +4508,80 @@
                 const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable;
                 VkStridedDeviceAddressRegionKHR stack_pCallableShaderBindingTable[1];
                 VkDeviceAddress indirectDeviceAddress;
-                pRaygenShaderBindingTable = (VkStridedDeviceAddressRegionKHR*)stack_pRaygenShaderBindingTable;
-                reservedunmarshal_VkStridedDeviceAddressRegionKHR(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkStridedDeviceAddressRegionKHR*)(pRaygenShaderBindingTable), readStreamPtrPtr);
-                pMissShaderBindingTable = (VkStridedDeviceAddressRegionKHR*)stack_pMissShaderBindingTable;
-                reservedunmarshal_VkStridedDeviceAddressRegionKHR(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkStridedDeviceAddressRegionKHR*)(pMissShaderBindingTable), readStreamPtrPtr);
-                pHitShaderBindingTable = (VkStridedDeviceAddressRegionKHR*)stack_pHitShaderBindingTable;
-                reservedunmarshal_VkStridedDeviceAddressRegionKHR(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkStridedDeviceAddressRegionKHR*)(pHitShaderBindingTable), readStreamPtrPtr);
-                pCallableShaderBindingTable = (VkStridedDeviceAddressRegionKHR*)stack_pCallableShaderBindingTable;
-                reservedunmarshal_VkStridedDeviceAddressRegionKHR(readStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkStridedDeviceAddressRegionKHR*)(pCallableShaderBindingTable), readStreamPtrPtr);
-                memcpy((VkDeviceAddress*)&indirectDeviceAddress, *readStreamPtrPtr, sizeof(VkDeviceAddress));
+                pRaygenShaderBindingTable =
+                    (VkStridedDeviceAddressRegionKHR*)stack_pRaygenShaderBindingTable;
+                reservedunmarshal_VkStridedDeviceAddressRegionKHR(
+                    readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkStridedDeviceAddressRegionKHR*)(pRaygenShaderBindingTable),
+                    readStreamPtrPtr);
+                pMissShaderBindingTable =
+                    (VkStridedDeviceAddressRegionKHR*)stack_pMissShaderBindingTable;
+                reservedunmarshal_VkStridedDeviceAddressRegionKHR(
+                    readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkStridedDeviceAddressRegionKHR*)(pMissShaderBindingTable), readStreamPtrPtr);
+                pHitShaderBindingTable =
+                    (VkStridedDeviceAddressRegionKHR*)stack_pHitShaderBindingTable;
+                reservedunmarshal_VkStridedDeviceAddressRegionKHR(
+                    readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkStridedDeviceAddressRegionKHR*)(pHitShaderBindingTable), readStreamPtrPtr);
+                pCallableShaderBindingTable =
+                    (VkStridedDeviceAddressRegionKHR*)stack_pCallableShaderBindingTable;
+                reservedunmarshal_VkStridedDeviceAddressRegionKHR(
+                    readStream, VK_STRUCTURE_TYPE_MAX_ENUM,
+                    (VkStridedDeviceAddressRegionKHR*)(pCallableShaderBindingTable),
+                    readStreamPtrPtr);
+                memcpy((VkDeviceAddress*)&indirectDeviceAddress, *readStreamPtrPtr,
+                       sizeof(VkDeviceAddress));
                 *readStreamPtrPtr += sizeof(VkDeviceAddress);
-                if (pRaygenShaderBindingTable)
-                {
-                    transform_tohost_VkStridedDeviceAddressRegionKHR(globalstate, (VkStridedDeviceAddressRegionKHR*)(pRaygenShaderBindingTable));
+                if (pRaygenShaderBindingTable) {
+                    transform_tohost_VkStridedDeviceAddressRegionKHR(
+                        globalstate, (VkStridedDeviceAddressRegionKHR*)(pRaygenShaderBindingTable));
                 }
-                if (pMissShaderBindingTable)
-                {
-                    transform_tohost_VkStridedDeviceAddressRegionKHR(globalstate, (VkStridedDeviceAddressRegionKHR*)(pMissShaderBindingTable));
+                if (pMissShaderBindingTable) {
+                    transform_tohost_VkStridedDeviceAddressRegionKHR(
+                        globalstate, (VkStridedDeviceAddressRegionKHR*)(pMissShaderBindingTable));
                 }
-                if (pHitShaderBindingTable)
-                {
-                    transform_tohost_VkStridedDeviceAddressRegionKHR(globalstate, (VkStridedDeviceAddressRegionKHR*)(pHitShaderBindingTable));
+                if (pHitShaderBindingTable) {
+                    transform_tohost_VkStridedDeviceAddressRegionKHR(
+                        globalstate, (VkStridedDeviceAddressRegionKHR*)(pHitShaderBindingTable));
                 }
-                if (pCallableShaderBindingTable)
-                {
-                    transform_tohost_VkStridedDeviceAddressRegionKHR(globalstate, (VkStridedDeviceAddressRegionKHR*)(pCallableShaderBindingTable));
+                if (pCallableShaderBindingTable) {
+                    transform_tohost_VkStridedDeviceAddressRegionKHR(
+                        globalstate,
+                        (VkStridedDeviceAddressRegionKHR*)(pCallableShaderBindingTable));
                 }
-                vk->vkCmdTraceRaysIndirectKHR((VkCommandBuffer)dispatchHandle, pRaygenShaderBindingTable, pMissShaderBindingTable, pHitShaderBindingTable, pCallableShaderBindingTable, indirectDeviceAddress);
+                vk->vkCmdTraceRaysIndirectKHR((VkCommandBuffer)dispatchHandle,
+                                              pRaygenShaderBindingTable, pMissShaderBindingTable,
+                                              pHitShaderBindingTable, pCallableShaderBindingTable,
+                                              indirectDeviceAddress);
                 android::base::endTrace();
                 break;
             }
-            case OP_vkCmdSetRayTracingPipelineStackSizeKHR:
-            {
+            case OP_vkCmdSetRayTracingPipelineStackSizeKHR: {
                 android::base::beginTrace("vkCmdSetRayTracingPipelineStackSizeKHR subdecode");
                 uint32_t pipelineStackSize;
                 memcpy((uint32_t*)&pipelineStackSize, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdSetRayTracingPipelineStackSizeKHR((VkCommandBuffer)dispatchHandle, pipelineStackSize);
+                vk->vkCmdSetRayTracingPipelineStackSizeKHR((VkCommandBuffer)dispatchHandle,
+                                                           pipelineStackSize);
                 android::base::endTrace();
                 break;
             }
 #endif
 #ifdef VK_KHR_ray_query
 #endif
-            default:
-            {
-                GFXSTREAM_ABORT(::emugl::FatalError(::emugl::ABORT_REASON_OTHER)) << "Unrecognized opcode " << opcode;
+            default: {
+                GFXSTREAM_ABORT(::emugl::FatalError(::emugl::ABORT_REASON_OTHER))
+                    << "Unrecognized opcode " << opcode;
             }
         }
-        ++count; if (count % 1000 == 0) { pool->freeAll(); };
+        ++count;
+        if (count % 1000 == 0) {
+            pool->freeAll();
+        };
         ptr += packetLen;
     }
     pool->freeAll();
-    return ptr - (unsigned char*)buf;;
+    return ptr - (unsigned char*)buf;
+    ;
 }
-
-
diff --git a/stream-servers/vulkan/cereal/common/goldfish_vk_deepcopy.cpp b/stream-servers/vulkan/cereal/common/goldfish_vk_deepcopy.cpp
index 2fdefe8..d6239cc 100644
--- a/stream-servers/vulkan/cereal/common/goldfish_vk_deepcopy.cpp
+++ b/stream-servers/vulkan/cereal/common/goldfish_vk_deepcopy.cpp
@@ -14,84 +14,65 @@
 // limitations under the License.
 
 // Autogenerated module goldfish_vk_deepcopy
-// (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
+// (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal
+// -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
 // VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
 // VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+//
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o
+// $CEREAL_OUTPUT_DIR
+//
 
 #include "goldfish_vk_deepcopy.h"
 
+#include <string.h>
 
 #include "goldfish_vk_extension_structs.h"
 #include "goldfish_vk_private_defs.h"
-#include <string.h>
-
 #include "vk_util.h"
 
-
 namespace goldfish_vk {
 
-void deepcopy_extension_struct(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const void* structExtension,
-    void* structExtension_out);
+void deepcopy_extension_struct(Allocator* alloc, VkStructureType rootType,
+                               const void* structExtension, void* structExtension_out);
 
 #ifdef VK_VERSION_1_0
-void deepcopy_VkExtent2D(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExtent2D* from,
-    VkExtent2D* to)
-{
+void deepcopy_VkExtent2D(Allocator* alloc, VkStructureType rootType, const VkExtent2D* from,
+                         VkExtent2D* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkExtent3D(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExtent3D* from,
-    VkExtent3D* to)
-{
+void deepcopy_VkExtent3D(Allocator* alloc, VkStructureType rootType, const VkExtent3D* from,
+                         VkExtent3D* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkOffset2D(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkOffset2D* from,
-    VkOffset2D* to)
-{
+void deepcopy_VkOffset2D(Allocator* alloc, VkStructureType rootType, const VkOffset2D* from,
+                         VkOffset2D* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkOffset3D(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkOffset3D* from,
-    VkOffset3D* to)
-{
+void deepcopy_VkOffset3D(Allocator* alloc, VkStructureType rootType, const VkOffset3D* from,
+                         VkOffset3D* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkRect2D(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkRect2D* from,
-    VkRect2D* to)
-{
+void deepcopy_VkRect2D(Allocator* alloc, VkStructureType rootType, const VkRect2D* from,
+                       VkRect2D* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
@@ -99,363 +80,271 @@
     deepcopy_VkExtent2D(alloc, rootType, &from->extent, (VkExtent2D*)(&to->extent));
 }
 
-void deepcopy_VkBaseInStructure(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBaseInStructure* from,
-    VkBaseInStructure* to)
-{
+void deepcopy_VkBaseInStructure(Allocator* alloc, VkStructureType rootType,
+                                const VkBaseInStructure* from, VkBaseInStructure* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (VkBaseInStructure*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkBaseOutStructure(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBaseOutStructure* from,
-    VkBaseOutStructure* to)
-{
+void deepcopy_VkBaseOutStructure(Allocator* alloc, VkStructureType rootType,
+                                 const VkBaseOutStructure* from, VkBaseOutStructure* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (VkBaseOutStructure*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkBufferMemoryBarrier(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBufferMemoryBarrier* from,
-    VkBufferMemoryBarrier* to)
-{
+void deepcopy_VkBufferMemoryBarrier(Allocator* alloc, VkStructureType rootType,
+                                    const VkBufferMemoryBarrier* from, VkBufferMemoryBarrier* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkDispatchIndirectCommand(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDispatchIndirectCommand* from,
-    VkDispatchIndirectCommand* to)
-{
+void deepcopy_VkDispatchIndirectCommand(Allocator* alloc, VkStructureType rootType,
+                                        const VkDispatchIndirectCommand* from,
+                                        VkDispatchIndirectCommand* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkDrawIndexedIndirectCommand(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDrawIndexedIndirectCommand* from,
-    VkDrawIndexedIndirectCommand* to)
-{
+void deepcopy_VkDrawIndexedIndirectCommand(Allocator* alloc, VkStructureType rootType,
+                                           const VkDrawIndexedIndirectCommand* from,
+                                           VkDrawIndexedIndirectCommand* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkDrawIndirectCommand(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDrawIndirectCommand* from,
-    VkDrawIndirectCommand* to)
-{
+void deepcopy_VkDrawIndirectCommand(Allocator* alloc, VkStructureType rootType,
+                                    const VkDrawIndirectCommand* from, VkDrawIndirectCommand* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkImageSubresourceRange(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageSubresourceRange* from,
-    VkImageSubresourceRange* to)
-{
+void deepcopy_VkImageSubresourceRange(Allocator* alloc, VkStructureType rootType,
+                                      const VkImageSubresourceRange* from,
+                                      VkImageSubresourceRange* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkImageMemoryBarrier(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageMemoryBarrier* from,
-    VkImageMemoryBarrier* to)
-{
+void deepcopy_VkImageMemoryBarrier(Allocator* alloc, VkStructureType rootType,
+                                   const VkImageMemoryBarrier* from, VkImageMemoryBarrier* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkImageSubresourceRange(alloc, rootType, &from->subresourceRange, (VkImageSubresourceRange*)(&to->subresourceRange));
+    deepcopy_VkImageSubresourceRange(alloc, rootType, &from->subresourceRange,
+                                     (VkImageSubresourceRange*)(&to->subresourceRange));
 }
 
-void deepcopy_VkMemoryBarrier(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryBarrier* from,
-    VkMemoryBarrier* to)
-{
+void deepcopy_VkMemoryBarrier(Allocator* alloc, VkStructureType rootType,
+                              const VkMemoryBarrier* from, VkMemoryBarrier* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkPipelineCacheHeaderVersionOne(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineCacheHeaderVersionOne* from,
-    VkPipelineCacheHeaderVersionOne* to)
-{
+void deepcopy_VkPipelineCacheHeaderVersionOne(Allocator* alloc, VkStructureType rootType,
+                                              const VkPipelineCacheHeaderVersionOne* from,
+                                              VkPipelineCacheHeaderVersionOne* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
     memcpy(to->pipelineCacheUUID, from->pipelineCacheUUID, VK_UUID_SIZE * sizeof(uint8_t));
 }
 
-void deepcopy_VkAllocationCallbacks(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAllocationCallbacks* from,
-    VkAllocationCallbacks* to)
-{
+void deepcopy_VkAllocationCallbacks(Allocator* alloc, VkStructureType rootType,
+                                    const VkAllocationCallbacks* from, VkAllocationCallbacks* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
     to->pUserData = nullptr;
-    if (from->pUserData)
-    {
+    if (from->pUserData) {
         to->pUserData = (void*)alloc->dupArray(from->pUserData, sizeof(uint8_t));
     }
 }
 
-void deepcopy_VkApplicationInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkApplicationInfo* from,
-    VkApplicationInfo* to)
-{
+void deepcopy_VkApplicationInfo(Allocator* alloc, VkStructureType rootType,
+                                const VkApplicationInfo* from, VkApplicationInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pApplicationName = nullptr;
-    if (from->pApplicationName)
-    {
+    if (from->pApplicationName) {
         to->pApplicationName = alloc->strDup(from->pApplicationName);
     }
     to->pEngineName = nullptr;
-    if (from->pEngineName)
-    {
+    if (from->pEngineName) {
         to->pEngineName = alloc->strDup(from->pEngineName);
     }
 }
 
-void deepcopy_VkFormatProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkFormatProperties* from,
-    VkFormatProperties* to)
-{
+void deepcopy_VkFormatProperties(Allocator* alloc, VkStructureType rootType,
+                                 const VkFormatProperties* from, VkFormatProperties* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkImageFormatProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageFormatProperties* from,
-    VkImageFormatProperties* to)
-{
+void deepcopy_VkImageFormatProperties(Allocator* alloc, VkStructureType rootType,
+                                      const VkImageFormatProperties* from,
+                                      VkImageFormatProperties* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
     deepcopy_VkExtent3D(alloc, rootType, &from->maxExtent, (VkExtent3D*)(&to->maxExtent));
 }
 
-void deepcopy_VkInstanceCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkInstanceCreateInfo* from,
-    VkInstanceCreateInfo* to)
-{
+void deepcopy_VkInstanceCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                   const VkInstanceCreateInfo* from, VkInstanceCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pApplicationInfo = nullptr;
-    if (from->pApplicationInfo)
-    {
+    if (from->pApplicationInfo) {
         to->pApplicationInfo = (VkApplicationInfo*)alloc->alloc(sizeof(const VkApplicationInfo));
-        deepcopy_VkApplicationInfo(alloc, rootType, from->pApplicationInfo, (VkApplicationInfo*)(to->pApplicationInfo));
+        deepcopy_VkApplicationInfo(alloc, rootType, from->pApplicationInfo,
+                                   (VkApplicationInfo*)(to->pApplicationInfo));
     }
     to->ppEnabledLayerNames = nullptr;
-    if (from->ppEnabledLayerNames && from->enabledLayerCount)
-    {
-        to->ppEnabledLayerNames = alloc->strDupArray(from->ppEnabledLayerNames, from->enabledLayerCount);
+    if (from->ppEnabledLayerNames && from->enabledLayerCount) {
+        to->ppEnabledLayerNames =
+            alloc->strDupArray(from->ppEnabledLayerNames, from->enabledLayerCount);
     }
     to->ppEnabledExtensionNames = nullptr;
-    if (from->ppEnabledExtensionNames && from->enabledExtensionCount)
-    {
-        to->ppEnabledExtensionNames = alloc->strDupArray(from->ppEnabledExtensionNames, from->enabledExtensionCount);
+    if (from->ppEnabledExtensionNames && from->enabledExtensionCount) {
+        to->ppEnabledExtensionNames =
+            alloc->strDupArray(from->ppEnabledExtensionNames, from->enabledExtensionCount);
     }
 }
 
-void deepcopy_VkMemoryHeap(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryHeap* from,
-    VkMemoryHeap* to)
-{
+void deepcopy_VkMemoryHeap(Allocator* alloc, VkStructureType rootType, const VkMemoryHeap* from,
+                           VkMemoryHeap* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkMemoryType(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryType* from,
-    VkMemoryType* to)
-{
+void deepcopy_VkMemoryType(Allocator* alloc, VkStructureType rootType, const VkMemoryType* from,
+                           VkMemoryType* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkPhysicalDeviceFeatures(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceFeatures* from,
-    VkPhysicalDeviceFeatures* to)
-{
+void deepcopy_VkPhysicalDeviceFeatures(Allocator* alloc, VkStructureType rootType,
+                                       const VkPhysicalDeviceFeatures* from,
+                                       VkPhysicalDeviceFeatures* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkPhysicalDeviceLimits(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceLimits* from,
-    VkPhysicalDeviceLimits* to)
-{
+void deepcopy_VkPhysicalDeviceLimits(Allocator* alloc, VkStructureType rootType,
+                                     const VkPhysicalDeviceLimits* from,
+                                     VkPhysicalDeviceLimits* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
@@ -467,171 +356,143 @@
     memcpy(to->lineWidthRange, from->lineWidthRange, 2 * sizeof(float));
 }
 
-void deepcopy_VkPhysicalDeviceMemoryProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceMemoryProperties* from,
-    VkPhysicalDeviceMemoryProperties* to)
-{
+void deepcopy_VkPhysicalDeviceMemoryProperties(Allocator* alloc, VkStructureType rootType,
+                                               const VkPhysicalDeviceMemoryProperties* from,
+                                               VkPhysicalDeviceMemoryProperties* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_TYPES; ++i)
-    {
-        deepcopy_VkMemoryType(alloc, rootType, from->memoryTypes + i, (VkMemoryType*)(to->memoryTypes + i));
+    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_TYPES; ++i) {
+        deepcopy_VkMemoryType(alloc, rootType, from->memoryTypes + i,
+                              (VkMemoryType*)(to->memoryTypes + i));
     }
-    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_HEAPS; ++i)
-    {
-        deepcopy_VkMemoryHeap(alloc, rootType, from->memoryHeaps + i, (VkMemoryHeap*)(to->memoryHeaps + i));
+    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_HEAPS; ++i) {
+        deepcopy_VkMemoryHeap(alloc, rootType, from->memoryHeaps + i,
+                              (VkMemoryHeap*)(to->memoryHeaps + i));
     }
 }
 
-void deepcopy_VkPhysicalDeviceSparseProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceSparseProperties* from,
-    VkPhysicalDeviceSparseProperties* to)
-{
+void deepcopy_VkPhysicalDeviceSparseProperties(Allocator* alloc, VkStructureType rootType,
+                                               const VkPhysicalDeviceSparseProperties* from,
+                                               VkPhysicalDeviceSparseProperties* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkPhysicalDeviceProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceProperties* from,
-    VkPhysicalDeviceProperties* to)
-{
+void deepcopy_VkPhysicalDeviceProperties(Allocator* alloc, VkStructureType rootType,
+                                         const VkPhysicalDeviceProperties* from,
+                                         VkPhysicalDeviceProperties* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
     memcpy(to->deviceName, from->deviceName, VK_MAX_PHYSICAL_DEVICE_NAME_SIZE * sizeof(char));
     memcpy(to->pipelineCacheUUID, from->pipelineCacheUUID, VK_UUID_SIZE * sizeof(uint8_t));
-    deepcopy_VkPhysicalDeviceLimits(alloc, rootType, &from->limits, (VkPhysicalDeviceLimits*)(&to->limits));
-    deepcopy_VkPhysicalDeviceSparseProperties(alloc, rootType, &from->sparseProperties, (VkPhysicalDeviceSparseProperties*)(&to->sparseProperties));
+    deepcopy_VkPhysicalDeviceLimits(alloc, rootType, &from->limits,
+                                    (VkPhysicalDeviceLimits*)(&to->limits));
+    deepcopy_VkPhysicalDeviceSparseProperties(
+        alloc, rootType, &from->sparseProperties,
+        (VkPhysicalDeviceSparseProperties*)(&to->sparseProperties));
 }
 
-void deepcopy_VkQueueFamilyProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkQueueFamilyProperties* from,
-    VkQueueFamilyProperties* to)
-{
+void deepcopy_VkQueueFamilyProperties(Allocator* alloc, VkStructureType rootType,
+                                      const VkQueueFamilyProperties* from,
+                                      VkQueueFamilyProperties* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    deepcopy_VkExtent3D(alloc, rootType, &from->minImageTransferGranularity, (VkExtent3D*)(&to->minImageTransferGranularity));
+    deepcopy_VkExtent3D(alloc, rootType, &from->minImageTransferGranularity,
+                        (VkExtent3D*)(&to->minImageTransferGranularity));
 }
 
-void deepcopy_VkDeviceQueueCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDeviceQueueCreateInfo* from,
-    VkDeviceQueueCreateInfo* to)
-{
+void deepcopy_VkDeviceQueueCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                      const VkDeviceQueueCreateInfo* from,
+                                      VkDeviceQueueCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pQueuePriorities = nullptr;
-    if (from->pQueuePriorities)
-    {
-        to->pQueuePriorities = (float*)alloc->dupArray(from->pQueuePriorities, from->queueCount * sizeof(const float));
+    if (from->pQueuePriorities) {
+        to->pQueuePriorities =
+            (float*)alloc->dupArray(from->pQueuePriorities, from->queueCount * sizeof(const float));
     }
 }
 
-void deepcopy_VkDeviceCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDeviceCreateInfo* from,
-    VkDeviceCreateInfo* to)
-{
+void deepcopy_VkDeviceCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                 const VkDeviceCreateInfo* from, VkDeviceCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pQueueCreateInfos = nullptr;
-        if (from->pQueueCreateInfos)
-        {
-            to->pQueueCreateInfos = (VkDeviceQueueCreateInfo*)alloc->alloc(from->queueCreateInfoCount * sizeof(const VkDeviceQueueCreateInfo));
+        if (from->pQueueCreateInfos) {
+            to->pQueueCreateInfos = (VkDeviceQueueCreateInfo*)alloc->alloc(
+                from->queueCreateInfoCount * sizeof(const VkDeviceQueueCreateInfo));
             to->queueCreateInfoCount = from->queueCreateInfoCount;
-            for (uint32_t i = 0; i < (uint32_t)from->queueCreateInfoCount; ++i)
-            {
-                deepcopy_VkDeviceQueueCreateInfo(alloc, rootType, from->pQueueCreateInfos + i, (VkDeviceQueueCreateInfo*)(to->pQueueCreateInfos + i));
+            for (uint32_t i = 0; i < (uint32_t)from->queueCreateInfoCount; ++i) {
+                deepcopy_VkDeviceQueueCreateInfo(
+                    alloc, rootType, from->pQueueCreateInfos + i,
+                    (VkDeviceQueueCreateInfo*)(to->pQueueCreateInfos + i));
             }
         }
     }
     to->ppEnabledLayerNames = nullptr;
-    if (from->ppEnabledLayerNames && from->enabledLayerCount)
-    {
-        to->ppEnabledLayerNames = alloc->strDupArray(from->ppEnabledLayerNames, from->enabledLayerCount);
+    if (from->ppEnabledLayerNames && from->enabledLayerCount) {
+        to->ppEnabledLayerNames =
+            alloc->strDupArray(from->ppEnabledLayerNames, from->enabledLayerCount);
     }
     to->ppEnabledExtensionNames = nullptr;
-    if (from->ppEnabledExtensionNames && from->enabledExtensionCount)
-    {
-        to->ppEnabledExtensionNames = alloc->strDupArray(from->ppEnabledExtensionNames, from->enabledExtensionCount);
+    if (from->ppEnabledExtensionNames && from->enabledExtensionCount) {
+        to->ppEnabledExtensionNames =
+            alloc->strDupArray(from->ppEnabledExtensionNames, from->enabledExtensionCount);
     }
     to->pEnabledFeatures = nullptr;
-    if (from->pEnabledFeatures)
-    {
-        to->pEnabledFeatures = (VkPhysicalDeviceFeatures*)alloc->alloc(sizeof(const VkPhysicalDeviceFeatures));
-        deepcopy_VkPhysicalDeviceFeatures(alloc, rootType, from->pEnabledFeatures, (VkPhysicalDeviceFeatures*)(to->pEnabledFeatures));
+    if (from->pEnabledFeatures) {
+        to->pEnabledFeatures =
+            (VkPhysicalDeviceFeatures*)alloc->alloc(sizeof(const VkPhysicalDeviceFeatures));
+        deepcopy_VkPhysicalDeviceFeatures(alloc, rootType, from->pEnabledFeatures,
+                                          (VkPhysicalDeviceFeatures*)(to->pEnabledFeatures));
     }
 }
 
-void deepcopy_VkExtensionProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExtensionProperties* from,
-    VkExtensionProperties* to)
-{
+void deepcopy_VkExtensionProperties(Allocator* alloc, VkStructureType rootType,
+                                    const VkExtensionProperties* from, VkExtensionProperties* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
     memcpy(to->extensionName, from->extensionName, VK_MAX_EXTENSION_NAME_SIZE * sizeof(char));
 }
 
-void deepcopy_VkLayerProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkLayerProperties* from,
-    VkLayerProperties* to)
-{
+void deepcopy_VkLayerProperties(Allocator* alloc, VkStructureType rootType,
+                                const VkLayerProperties* from, VkLayerProperties* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
@@ -639,1055 +500,848 @@
     memcpy(to->description, from->description, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
 }
 
-void deepcopy_VkSubmitInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSubmitInfo* from,
-    VkSubmitInfo* to)
-{
+void deepcopy_VkSubmitInfo(Allocator* alloc, VkStructureType rootType, const VkSubmitInfo* from,
+                           VkSubmitInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    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));
+    if (from->pWaitSemaphores) {
+        to->pWaitSemaphores = (VkSemaphore*)alloc->dupArray(
+            from->pWaitSemaphores, from->waitSemaphoreCount * sizeof(const VkSemaphore));
     }
     to->pWaitDstStageMask = nullptr;
-    if (from->pWaitDstStageMask)
-    {
-        to->pWaitDstStageMask = (VkPipelineStageFlags*)alloc->dupArray(from->pWaitDstStageMask, from->waitSemaphoreCount * sizeof(const VkPipelineStageFlags));
+    if (from->pWaitDstStageMask) {
+        to->pWaitDstStageMask = (VkPipelineStageFlags*)alloc->dupArray(
+            from->pWaitDstStageMask, from->waitSemaphoreCount * sizeof(const VkPipelineStageFlags));
     }
     to->pCommandBuffers = nullptr;
-    if (from->pCommandBuffers)
-    {
-        to->pCommandBuffers = (VkCommandBuffer*)alloc->dupArray(from->pCommandBuffers, from->commandBufferCount * sizeof(const VkCommandBuffer));
+    if (from->pCommandBuffers) {
+        to->pCommandBuffers = (VkCommandBuffer*)alloc->dupArray(
+            from->pCommandBuffers, from->commandBufferCount * sizeof(const VkCommandBuffer));
     }
     to->pSignalSemaphores = nullptr;
-    if (from->pSignalSemaphores)
-    {
-        to->pSignalSemaphores = (VkSemaphore*)alloc->dupArray(from->pSignalSemaphores, from->signalSemaphoreCount * sizeof(const VkSemaphore));
+    if (from->pSignalSemaphores) {
+        to->pSignalSemaphores = (VkSemaphore*)alloc->dupArray(
+            from->pSignalSemaphores, from->signalSemaphoreCount * sizeof(const VkSemaphore));
     }
 }
 
-void deepcopy_VkMappedMemoryRange(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMappedMemoryRange* from,
-    VkMappedMemoryRange* to)
-{
+void deepcopy_VkMappedMemoryRange(Allocator* alloc, VkStructureType rootType,
+                                  const VkMappedMemoryRange* from, VkMappedMemoryRange* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkMemoryAllocateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryAllocateInfo* from,
-    VkMemoryAllocateInfo* to)
-{
+void deepcopy_VkMemoryAllocateInfo(Allocator* alloc, VkStructureType rootType,
+                                   const VkMemoryAllocateInfo* from, VkMemoryAllocateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkMemoryRequirements(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryRequirements* from,
-    VkMemoryRequirements* to)
-{
+void deepcopy_VkMemoryRequirements(Allocator* alloc, VkStructureType rootType,
+                                   const VkMemoryRequirements* from, VkMemoryRequirements* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkSparseMemoryBind(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSparseMemoryBind* from,
-    VkSparseMemoryBind* to)
-{
+void deepcopy_VkSparseMemoryBind(Allocator* alloc, VkStructureType rootType,
+                                 const VkSparseMemoryBind* from, VkSparseMemoryBind* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkSparseBufferMemoryBindInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSparseBufferMemoryBindInfo* from,
-    VkSparseBufferMemoryBindInfo* to)
-{
+void deepcopy_VkSparseBufferMemoryBindInfo(Allocator* alloc, VkStructureType rootType,
+                                           const VkSparseBufferMemoryBindInfo* from,
+                                           VkSparseBufferMemoryBindInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (from)
-    {
+    if (from) {
         to->pBinds = nullptr;
-        if (from->pBinds)
-        {
-            to->pBinds = (VkSparseMemoryBind*)alloc->alloc(from->bindCount * sizeof(const VkSparseMemoryBind));
+        if (from->pBinds) {
+            to->pBinds = (VkSparseMemoryBind*)alloc->alloc(from->bindCount *
+                                                           sizeof(const VkSparseMemoryBind));
             to->bindCount = from->bindCount;
-            for (uint32_t i = 0; i < (uint32_t)from->bindCount; ++i)
-            {
-                deepcopy_VkSparseMemoryBind(alloc, rootType, from->pBinds + i, (VkSparseMemoryBind*)(to->pBinds + i));
+            for (uint32_t i = 0; i < (uint32_t)from->bindCount; ++i) {
+                deepcopy_VkSparseMemoryBind(alloc, rootType, from->pBinds + i,
+                                            (VkSparseMemoryBind*)(to->pBinds + i));
             }
         }
     }
 }
 
-void deepcopy_VkSparseImageOpaqueMemoryBindInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSparseImageOpaqueMemoryBindInfo* from,
-    VkSparseImageOpaqueMemoryBindInfo* to)
-{
+void deepcopy_VkSparseImageOpaqueMemoryBindInfo(Allocator* alloc, VkStructureType rootType,
+                                                const VkSparseImageOpaqueMemoryBindInfo* from,
+                                                VkSparseImageOpaqueMemoryBindInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (from)
-    {
+    if (from) {
         to->pBinds = nullptr;
-        if (from->pBinds)
-        {
-            to->pBinds = (VkSparseMemoryBind*)alloc->alloc(from->bindCount * sizeof(const VkSparseMemoryBind));
+        if (from->pBinds) {
+            to->pBinds = (VkSparseMemoryBind*)alloc->alloc(from->bindCount *
+                                                           sizeof(const VkSparseMemoryBind));
             to->bindCount = from->bindCount;
-            for (uint32_t i = 0; i < (uint32_t)from->bindCount; ++i)
-            {
-                deepcopy_VkSparseMemoryBind(alloc, rootType, from->pBinds + i, (VkSparseMemoryBind*)(to->pBinds + i));
+            for (uint32_t i = 0; i < (uint32_t)from->bindCount; ++i) {
+                deepcopy_VkSparseMemoryBind(alloc, rootType, from->pBinds + i,
+                                            (VkSparseMemoryBind*)(to->pBinds + i));
             }
         }
     }
 }
 
-void deepcopy_VkImageSubresource(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageSubresource* from,
-    VkImageSubresource* to)
-{
+void deepcopy_VkImageSubresource(Allocator* alloc, VkStructureType rootType,
+                                 const VkImageSubresource* from, VkImageSubresource* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkSparseImageMemoryBind(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSparseImageMemoryBind* from,
-    VkSparseImageMemoryBind* to)
-{
+void deepcopy_VkSparseImageMemoryBind(Allocator* alloc, VkStructureType rootType,
+                                      const VkSparseImageMemoryBind* from,
+                                      VkSparseImageMemoryBind* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    deepcopy_VkImageSubresource(alloc, rootType, &from->subresource, (VkImageSubresource*)(&to->subresource));
+    deepcopy_VkImageSubresource(alloc, rootType, &from->subresource,
+                                (VkImageSubresource*)(&to->subresource));
     deepcopy_VkOffset3D(alloc, rootType, &from->offset, (VkOffset3D*)(&to->offset));
     deepcopy_VkExtent3D(alloc, rootType, &from->extent, (VkExtent3D*)(&to->extent));
 }
 
-void deepcopy_VkSparseImageMemoryBindInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSparseImageMemoryBindInfo* from,
-    VkSparseImageMemoryBindInfo* to)
-{
+void deepcopy_VkSparseImageMemoryBindInfo(Allocator* alloc, VkStructureType rootType,
+                                          const VkSparseImageMemoryBindInfo* from,
+                                          VkSparseImageMemoryBindInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (from)
-    {
+    if (from) {
         to->pBinds = nullptr;
-        if (from->pBinds)
-        {
-            to->pBinds = (VkSparseImageMemoryBind*)alloc->alloc(from->bindCount * sizeof(const VkSparseImageMemoryBind));
+        if (from->pBinds) {
+            to->pBinds = (VkSparseImageMemoryBind*)alloc->alloc(
+                from->bindCount * sizeof(const VkSparseImageMemoryBind));
             to->bindCount = from->bindCount;
-            for (uint32_t i = 0; i < (uint32_t)from->bindCount; ++i)
-            {
-                deepcopy_VkSparseImageMemoryBind(alloc, rootType, from->pBinds + i, (VkSparseImageMemoryBind*)(to->pBinds + i));
+            for (uint32_t i = 0; i < (uint32_t)from->bindCount; ++i) {
+                deepcopy_VkSparseImageMemoryBind(alloc, rootType, from->pBinds + i,
+                                                 (VkSparseImageMemoryBind*)(to->pBinds + i));
             }
         }
     }
 }
 
-void deepcopy_VkBindSparseInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBindSparseInfo* from,
-    VkBindSparseInfo* to)
-{
+void deepcopy_VkBindSparseInfo(Allocator* alloc, VkStructureType rootType,
+                               const VkBindSparseInfo* from, VkBindSparseInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    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));
+    if (from->pWaitSemaphores) {
+        to->pWaitSemaphores = (VkSemaphore*)alloc->dupArray(
+            from->pWaitSemaphores, from->waitSemaphoreCount * sizeof(const VkSemaphore));
     }
-    if (from)
-    {
+    if (from) {
         to->pBufferBinds = nullptr;
-        if (from->pBufferBinds)
-        {
-            to->pBufferBinds = (VkSparseBufferMemoryBindInfo*)alloc->alloc(from->bufferBindCount * sizeof(const VkSparseBufferMemoryBindInfo));
+        if (from->pBufferBinds) {
+            to->pBufferBinds = (VkSparseBufferMemoryBindInfo*)alloc->alloc(
+                from->bufferBindCount * sizeof(const VkSparseBufferMemoryBindInfo));
             to->bufferBindCount = from->bufferBindCount;
-            for (uint32_t i = 0; i < (uint32_t)from->bufferBindCount; ++i)
-            {
-                deepcopy_VkSparseBufferMemoryBindInfo(alloc, rootType, from->pBufferBinds + i, (VkSparseBufferMemoryBindInfo*)(to->pBufferBinds + i));
+            for (uint32_t i = 0; i < (uint32_t)from->bufferBindCount; ++i) {
+                deepcopy_VkSparseBufferMemoryBindInfo(
+                    alloc, rootType, from->pBufferBinds + i,
+                    (VkSparseBufferMemoryBindInfo*)(to->pBufferBinds + i));
             }
         }
     }
-    if (from)
-    {
+    if (from) {
         to->pImageOpaqueBinds = nullptr;
-        if (from->pImageOpaqueBinds)
-        {
-            to->pImageOpaqueBinds = (VkSparseImageOpaqueMemoryBindInfo*)alloc->alloc(from->imageOpaqueBindCount * sizeof(const VkSparseImageOpaqueMemoryBindInfo));
+        if (from->pImageOpaqueBinds) {
+            to->pImageOpaqueBinds = (VkSparseImageOpaqueMemoryBindInfo*)alloc->alloc(
+                from->imageOpaqueBindCount * sizeof(const VkSparseImageOpaqueMemoryBindInfo));
             to->imageOpaqueBindCount = from->imageOpaqueBindCount;
-            for (uint32_t i = 0; i < (uint32_t)from->imageOpaqueBindCount; ++i)
-            {
-                deepcopy_VkSparseImageOpaqueMemoryBindInfo(alloc, rootType, from->pImageOpaqueBinds + i, (VkSparseImageOpaqueMemoryBindInfo*)(to->pImageOpaqueBinds + i));
+            for (uint32_t i = 0; i < (uint32_t)from->imageOpaqueBindCount; ++i) {
+                deepcopy_VkSparseImageOpaqueMemoryBindInfo(
+                    alloc, rootType, from->pImageOpaqueBinds + i,
+                    (VkSparseImageOpaqueMemoryBindInfo*)(to->pImageOpaqueBinds + i));
             }
         }
     }
-    if (from)
-    {
+    if (from) {
         to->pImageBinds = nullptr;
-        if (from->pImageBinds)
-        {
-            to->pImageBinds = (VkSparseImageMemoryBindInfo*)alloc->alloc(from->imageBindCount * sizeof(const VkSparseImageMemoryBindInfo));
+        if (from->pImageBinds) {
+            to->pImageBinds = (VkSparseImageMemoryBindInfo*)alloc->alloc(
+                from->imageBindCount * sizeof(const VkSparseImageMemoryBindInfo));
             to->imageBindCount = from->imageBindCount;
-            for (uint32_t i = 0; i < (uint32_t)from->imageBindCount; ++i)
-            {
-                deepcopy_VkSparseImageMemoryBindInfo(alloc, rootType, from->pImageBinds + i, (VkSparseImageMemoryBindInfo*)(to->pImageBinds + i));
+            for (uint32_t i = 0; i < (uint32_t)from->imageBindCount; ++i) {
+                deepcopy_VkSparseImageMemoryBindInfo(
+                    alloc, rootType, from->pImageBinds + i,
+                    (VkSparseImageMemoryBindInfo*)(to->pImageBinds + i));
             }
         }
     }
     to->pSignalSemaphores = nullptr;
-    if (from->pSignalSemaphores)
-    {
-        to->pSignalSemaphores = (VkSemaphore*)alloc->dupArray(from->pSignalSemaphores, from->signalSemaphoreCount * sizeof(const VkSemaphore));
+    if (from->pSignalSemaphores) {
+        to->pSignalSemaphores = (VkSemaphore*)alloc->dupArray(
+            from->pSignalSemaphores, from->signalSemaphoreCount * sizeof(const VkSemaphore));
     }
 }
 
-void deepcopy_VkSparseImageFormatProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSparseImageFormatProperties* from,
-    VkSparseImageFormatProperties* to)
-{
+void deepcopy_VkSparseImageFormatProperties(Allocator* alloc, VkStructureType rootType,
+                                            const VkSparseImageFormatProperties* from,
+                                            VkSparseImageFormatProperties* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    deepcopy_VkExtent3D(alloc, rootType, &from->imageGranularity, (VkExtent3D*)(&to->imageGranularity));
+    deepcopy_VkExtent3D(alloc, rootType, &from->imageGranularity,
+                        (VkExtent3D*)(&to->imageGranularity));
 }
 
-void deepcopy_VkSparseImageMemoryRequirements(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSparseImageMemoryRequirements* from,
-    VkSparseImageMemoryRequirements* to)
-{
+void deepcopy_VkSparseImageMemoryRequirements(Allocator* alloc, VkStructureType rootType,
+                                              const VkSparseImageMemoryRequirements* from,
+                                              VkSparseImageMemoryRequirements* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    deepcopy_VkSparseImageFormatProperties(alloc, rootType, &from->formatProperties, (VkSparseImageFormatProperties*)(&to->formatProperties));
+    deepcopy_VkSparseImageFormatProperties(alloc, rootType, &from->formatProperties,
+                                           (VkSparseImageFormatProperties*)(&to->formatProperties));
 }
 
-void deepcopy_VkFenceCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkFenceCreateInfo* from,
-    VkFenceCreateInfo* to)
-{
+void deepcopy_VkFenceCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                const VkFenceCreateInfo* from, VkFenceCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkSemaphoreCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSemaphoreCreateInfo* from,
-    VkSemaphoreCreateInfo* to)
-{
+void deepcopy_VkSemaphoreCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                    const VkSemaphoreCreateInfo* from, VkSemaphoreCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkEventCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkEventCreateInfo* from,
-    VkEventCreateInfo* to)
-{
+void deepcopy_VkEventCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                const VkEventCreateInfo* from, VkEventCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkQueryPoolCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkQueryPoolCreateInfo* from,
-    VkQueryPoolCreateInfo* to)
-{
+void deepcopy_VkQueryPoolCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                    const VkQueryPoolCreateInfo* from, VkQueryPoolCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkBufferCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBufferCreateInfo* from,
-    VkBufferCreateInfo* to)
-{
+void deepcopy_VkBufferCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                 const VkBufferCreateInfo* from, VkBufferCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pQueueFamilyIndices = nullptr;
-    if (from->pQueueFamilyIndices)
-    {
-        to->pQueueFamilyIndices = (uint32_t*)alloc->dupArray(from->pQueueFamilyIndices, from->queueFamilyIndexCount * sizeof(const uint32_t));
+    if (from->pQueueFamilyIndices) {
+        to->pQueueFamilyIndices = (uint32_t*)alloc->dupArray(
+            from->pQueueFamilyIndices, from->queueFamilyIndexCount * sizeof(const uint32_t));
     }
 }
 
-void deepcopy_VkBufferViewCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBufferViewCreateInfo* from,
-    VkBufferViewCreateInfo* to)
-{
+void deepcopy_VkBufferViewCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                     const VkBufferViewCreateInfo* from,
+                                     VkBufferViewCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkImageCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageCreateInfo* from,
-    VkImageCreateInfo* to)
-{
+void deepcopy_VkImageCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                const VkImageCreateInfo* from, VkImageCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     deepcopy_VkExtent3D(alloc, rootType, &from->extent, (VkExtent3D*)(&to->extent));
     to->pQueueFamilyIndices = nullptr;
-    if (from->pQueueFamilyIndices)
-    {
-        to->pQueueFamilyIndices = (uint32_t*)alloc->dupArray(from->pQueueFamilyIndices, from->queueFamilyIndexCount * sizeof(const uint32_t));
+    if (from->pQueueFamilyIndices) {
+        to->pQueueFamilyIndices = (uint32_t*)alloc->dupArray(
+            from->pQueueFamilyIndices, from->queueFamilyIndexCount * sizeof(const uint32_t));
     }
 }
 
-void deepcopy_VkSubresourceLayout(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSubresourceLayout* from,
-    VkSubresourceLayout* to)
-{
+void deepcopy_VkSubresourceLayout(Allocator* alloc, VkStructureType rootType,
+                                  const VkSubresourceLayout* from, VkSubresourceLayout* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkComponentMapping(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkComponentMapping* from,
-    VkComponentMapping* to)
-{
+void deepcopy_VkComponentMapping(Allocator* alloc, VkStructureType rootType,
+                                 const VkComponentMapping* from, VkComponentMapping* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkImageViewCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageViewCreateInfo* from,
-    VkImageViewCreateInfo* to)
-{
+void deepcopy_VkImageViewCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                    const VkImageViewCreateInfo* from, VkImageViewCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkComponentMapping(alloc, rootType, &from->components, (VkComponentMapping*)(&to->components));
-    deepcopy_VkImageSubresourceRange(alloc, rootType, &from->subresourceRange, (VkImageSubresourceRange*)(&to->subresourceRange));
+    deepcopy_VkComponentMapping(alloc, rootType, &from->components,
+                                (VkComponentMapping*)(&to->components));
+    deepcopy_VkImageSubresourceRange(alloc, rootType, &from->subresourceRange,
+                                     (VkImageSubresourceRange*)(&to->subresourceRange));
 }
 
-void deepcopy_VkShaderModuleCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkShaderModuleCreateInfo* from,
-    VkShaderModuleCreateInfo* to)
-{
+void deepcopy_VkShaderModuleCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                       const VkShaderModuleCreateInfo* from,
+                                       VkShaderModuleCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pCode = nullptr;
-    if (from->pCode)
-    {
-        to->pCode = (uint32_t*)alloc->dupArray(from->pCode, (from->codeSize / 4) * sizeof(const uint32_t));
+    if (from->pCode) {
+        to->pCode =
+            (uint32_t*)alloc->dupArray(from->pCode, (from->codeSize / 4) * sizeof(const uint32_t));
     }
 }
 
-void deepcopy_VkPipelineCacheCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineCacheCreateInfo* from,
-    VkPipelineCacheCreateInfo* to)
-{
+void deepcopy_VkPipelineCacheCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                        const VkPipelineCacheCreateInfo* from,
+                                        VkPipelineCacheCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pInitialData = nullptr;
-    if (from->pInitialData)
-    {
-        to->pInitialData = (void*)alloc->dupArray(from->pInitialData, from->initialDataSize * sizeof(const uint8_t));
+    if (from->pInitialData) {
+        to->pInitialData = (void*)alloc->dupArray(from->pInitialData,
+                                                  from->initialDataSize * sizeof(const uint8_t));
     }
 }
 
-void deepcopy_VkSpecializationMapEntry(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSpecializationMapEntry* from,
-    VkSpecializationMapEntry* to)
-{
+void deepcopy_VkSpecializationMapEntry(Allocator* alloc, VkStructureType rootType,
+                                       const VkSpecializationMapEntry* from,
+                                       VkSpecializationMapEntry* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkSpecializationInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSpecializationInfo* from,
-    VkSpecializationInfo* to)
-{
+void deepcopy_VkSpecializationInfo(Allocator* alloc, VkStructureType rootType,
+                                   const VkSpecializationInfo* from, VkSpecializationInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (from)
-    {
+    if (from) {
         to->pMapEntries = nullptr;
-        if (from->pMapEntries)
-        {
-            to->pMapEntries = (VkSpecializationMapEntry*)alloc->alloc(from->mapEntryCount * sizeof(const VkSpecializationMapEntry));
+        if (from->pMapEntries) {
+            to->pMapEntries = (VkSpecializationMapEntry*)alloc->alloc(
+                from->mapEntryCount * sizeof(const VkSpecializationMapEntry));
             to->mapEntryCount = from->mapEntryCount;
-            for (uint32_t i = 0; i < (uint32_t)from->mapEntryCount; ++i)
-            {
-                deepcopy_VkSpecializationMapEntry(alloc, rootType, from->pMapEntries + i, (VkSpecializationMapEntry*)(to->pMapEntries + i));
+            for (uint32_t i = 0; i < (uint32_t)from->mapEntryCount; ++i) {
+                deepcopy_VkSpecializationMapEntry(alloc, rootType, from->pMapEntries + i,
+                                                  (VkSpecializationMapEntry*)(to->pMapEntries + i));
             }
         }
     }
     to->pData = nullptr;
-    if (from->pData)
-    {
+    if (from->pData) {
         to->pData = (void*)alloc->dupArray(from->pData, from->dataSize * sizeof(const uint8_t));
     }
 }
 
-void deepcopy_VkPipelineShaderStageCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineShaderStageCreateInfo* from,
-    VkPipelineShaderStageCreateInfo* to)
-{
+void deepcopy_VkPipelineShaderStageCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                              const VkPipelineShaderStageCreateInfo* from,
+                                              VkPipelineShaderStageCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pName = nullptr;
-    if (from->pName)
-    {
+    if (from->pName) {
         to->pName = alloc->strDup(from->pName);
     }
     to->pSpecializationInfo = nullptr;
-    if (from->pSpecializationInfo)
-    {
-        to->pSpecializationInfo = (VkSpecializationInfo*)alloc->alloc(sizeof(const VkSpecializationInfo));
-        deepcopy_VkSpecializationInfo(alloc, rootType, from->pSpecializationInfo, (VkSpecializationInfo*)(to->pSpecializationInfo));
+    if (from->pSpecializationInfo) {
+        to->pSpecializationInfo =
+            (VkSpecializationInfo*)alloc->alloc(sizeof(const VkSpecializationInfo));
+        deepcopy_VkSpecializationInfo(alloc, rootType, from->pSpecializationInfo,
+                                      (VkSpecializationInfo*)(to->pSpecializationInfo));
     }
 }
 
-void deepcopy_VkComputePipelineCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkComputePipelineCreateInfo* from,
-    VkComputePipelineCreateInfo* to)
-{
+void deepcopy_VkComputePipelineCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                          const VkComputePipelineCreateInfo* from,
+                                          VkComputePipelineCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkPipelineShaderStageCreateInfo(alloc, rootType, &from->stage, (VkPipelineShaderStageCreateInfo*)(&to->stage));
+    deepcopy_VkPipelineShaderStageCreateInfo(alloc, rootType, &from->stage,
+                                             (VkPipelineShaderStageCreateInfo*)(&to->stage));
 }
 
-void deepcopy_VkVertexInputBindingDescription(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVertexInputBindingDescription* from,
-    VkVertexInputBindingDescription* to)
-{
+void deepcopy_VkVertexInputBindingDescription(Allocator* alloc, VkStructureType rootType,
+                                              const VkVertexInputBindingDescription* from,
+                                              VkVertexInputBindingDescription* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkVertexInputAttributeDescription(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVertexInputAttributeDescription* from,
-    VkVertexInputAttributeDescription* to)
-{
+void deepcopy_VkVertexInputAttributeDescription(Allocator* alloc, VkStructureType rootType,
+                                                const VkVertexInputAttributeDescription* from,
+                                                VkVertexInputAttributeDescription* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkPipelineVertexInputStateCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineVertexInputStateCreateInfo* from,
-    VkPipelineVertexInputStateCreateInfo* to)
-{
+void deepcopy_VkPipelineVertexInputStateCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                                   const VkPipelineVertexInputStateCreateInfo* from,
+                                                   VkPipelineVertexInputStateCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pVertexBindingDescriptions = nullptr;
-        if (from->pVertexBindingDescriptions)
-        {
-            to->pVertexBindingDescriptions = (VkVertexInputBindingDescription*)alloc->alloc(from->vertexBindingDescriptionCount * sizeof(const VkVertexInputBindingDescription));
+        if (from->pVertexBindingDescriptions) {
+            to->pVertexBindingDescriptions = (VkVertexInputBindingDescription*)alloc->alloc(
+                from->vertexBindingDescriptionCount *
+                sizeof(const VkVertexInputBindingDescription));
             to->vertexBindingDescriptionCount = from->vertexBindingDescriptionCount;
-            for (uint32_t i = 0; i < (uint32_t)from->vertexBindingDescriptionCount; ++i)
-            {
-                deepcopy_VkVertexInputBindingDescription(alloc, rootType, from->pVertexBindingDescriptions + i, (VkVertexInputBindingDescription*)(to->pVertexBindingDescriptions + i));
+            for (uint32_t i = 0; i < (uint32_t)from->vertexBindingDescriptionCount; ++i) {
+                deepcopy_VkVertexInputBindingDescription(
+                    alloc, rootType, from->pVertexBindingDescriptions + i,
+                    (VkVertexInputBindingDescription*)(to->pVertexBindingDescriptions + i));
             }
         }
     }
-    if (from)
-    {
+    if (from) {
         to->pVertexAttributeDescriptions = nullptr;
-        if (from->pVertexAttributeDescriptions)
-        {
-            to->pVertexAttributeDescriptions = (VkVertexInputAttributeDescription*)alloc->alloc(from->vertexAttributeDescriptionCount * sizeof(const VkVertexInputAttributeDescription));
+        if (from->pVertexAttributeDescriptions) {
+            to->pVertexAttributeDescriptions = (VkVertexInputAttributeDescription*)alloc->alloc(
+                from->vertexAttributeDescriptionCount *
+                sizeof(const VkVertexInputAttributeDescription));
             to->vertexAttributeDescriptionCount = from->vertexAttributeDescriptionCount;
-            for (uint32_t i = 0; i < (uint32_t)from->vertexAttributeDescriptionCount; ++i)
-            {
-                deepcopy_VkVertexInputAttributeDescription(alloc, rootType, from->pVertexAttributeDescriptions + i, (VkVertexInputAttributeDescription*)(to->pVertexAttributeDescriptions + i));
+            for (uint32_t i = 0; i < (uint32_t)from->vertexAttributeDescriptionCount; ++i) {
+                deepcopy_VkVertexInputAttributeDescription(
+                    alloc, rootType, from->pVertexAttributeDescriptions + i,
+                    (VkVertexInputAttributeDescription*)(to->pVertexAttributeDescriptions + i));
             }
         }
     }
 }
 
 void deepcopy_VkPipelineInputAssemblyStateCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineInputAssemblyStateCreateInfo* from,
-    VkPipelineInputAssemblyStateCreateInfo* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkPipelineInputAssemblyStateCreateInfo* from,
+    VkPipelineInputAssemblyStateCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPipelineTessellationStateCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineTessellationStateCreateInfo* from,
-    VkPipelineTessellationStateCreateInfo* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkPipelineTessellationStateCreateInfo* from,
+    VkPipelineTessellationStateCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkViewport(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkViewport* from,
-    VkViewport* to)
-{
+void deepcopy_VkViewport(Allocator* alloc, VkStructureType rootType, const VkViewport* from,
+                         VkViewport* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkPipelineViewportStateCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineViewportStateCreateInfo* from,
-    VkPipelineViewportStateCreateInfo* to)
-{
+void deepcopy_VkPipelineViewportStateCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                                const VkPipelineViewportStateCreateInfo* from,
+                                                VkPipelineViewportStateCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pViewports = nullptr;
-        if (from->pViewports)
-        {
-            to->pViewports = (VkViewport*)alloc->alloc(from->viewportCount * sizeof(const VkViewport));
+        if (from->pViewports) {
+            to->pViewports =
+                (VkViewport*)alloc->alloc(from->viewportCount * sizeof(const VkViewport));
             to->viewportCount = from->viewportCount;
-            for (uint32_t i = 0; i < (uint32_t)from->viewportCount; ++i)
-            {
-                deepcopy_VkViewport(alloc, rootType, from->pViewports + i, (VkViewport*)(to->pViewports + i));
+            for (uint32_t i = 0; i < (uint32_t)from->viewportCount; ++i) {
+                deepcopy_VkViewport(alloc, rootType, from->pViewports + i,
+                                    (VkViewport*)(to->pViewports + i));
             }
         }
     }
-    if (from)
-    {
+    if (from) {
         to->pScissors = nullptr;
-        if (from->pScissors)
-        {
+        if (from->pScissors) {
             to->pScissors = (VkRect2D*)alloc->alloc(from->scissorCount * sizeof(const VkRect2D));
             to->scissorCount = from->scissorCount;
-            for (uint32_t i = 0; i < (uint32_t)from->scissorCount; ++i)
-            {
-                deepcopy_VkRect2D(alloc, rootType, from->pScissors + i, (VkRect2D*)(to->pScissors + i));
+            for (uint32_t i = 0; i < (uint32_t)from->scissorCount; ++i) {
+                deepcopy_VkRect2D(alloc, rootType, from->pScissors + i,
+                                  (VkRect2D*)(to->pScissors + i));
             }
         }
     }
 }
 
 void deepcopy_VkPipelineRasterizationStateCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineRasterizationStateCreateInfo* from,
-    VkPipelineRasterizationStateCreateInfo* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkPipelineRasterizationStateCreateInfo* from,
+    VkPipelineRasterizationStateCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkPipelineMultisampleStateCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineMultisampleStateCreateInfo* from,
-    VkPipelineMultisampleStateCreateInfo* to)
-{
+void deepcopy_VkPipelineMultisampleStateCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                                   const VkPipelineMultisampleStateCreateInfo* from,
+                                                   VkPipelineMultisampleStateCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pSampleMask = nullptr;
-    if (from->pSampleMask)
-    {
-        to->pSampleMask = (VkSampleMask*)alloc->dupArray(from->pSampleMask, (((from->rasterizationSamples) + 31) / 32) * sizeof(const VkSampleMask));
+    if (from->pSampleMask) {
+        to->pSampleMask = (VkSampleMask*)alloc->dupArray(
+            from->pSampleMask,
+            (((from->rasterizationSamples) + 31) / 32) * sizeof(const VkSampleMask));
     }
 }
 
-void deepcopy_VkStencilOpState(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkStencilOpState* from,
-    VkStencilOpState* to)
-{
+void deepcopy_VkStencilOpState(Allocator* alloc, VkStructureType rootType,
+                               const VkStencilOpState* from, VkStencilOpState* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkPipelineDepthStencilStateCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineDepthStencilStateCreateInfo* from,
-    VkPipelineDepthStencilStateCreateInfo* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkPipelineDepthStencilStateCreateInfo* from,
+    VkPipelineDepthStencilStateCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -1695,877 +1349,740 @@
     deepcopy_VkStencilOpState(alloc, rootType, &from->back, (VkStencilOpState*)(&to->back));
 }
 
-void deepcopy_VkPipelineColorBlendAttachmentState(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineColorBlendAttachmentState* from,
-    VkPipelineColorBlendAttachmentState* to)
-{
+void deepcopy_VkPipelineColorBlendAttachmentState(Allocator* alloc, VkStructureType rootType,
+                                                  const VkPipelineColorBlendAttachmentState* from,
+                                                  VkPipelineColorBlendAttachmentState* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkPipelineColorBlendStateCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineColorBlendStateCreateInfo* from,
-    VkPipelineColorBlendStateCreateInfo* to)
-{
+void deepcopy_VkPipelineColorBlendStateCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                                  const VkPipelineColorBlendStateCreateInfo* from,
+                                                  VkPipelineColorBlendStateCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pAttachments = nullptr;
-        if (from->pAttachments)
-        {
-            to->pAttachments = (VkPipelineColorBlendAttachmentState*)alloc->alloc(from->attachmentCount * sizeof(const VkPipelineColorBlendAttachmentState));
+        if (from->pAttachments) {
+            to->pAttachments = (VkPipelineColorBlendAttachmentState*)alloc->alloc(
+                from->attachmentCount * sizeof(const VkPipelineColorBlendAttachmentState));
             to->attachmentCount = from->attachmentCount;
-            for (uint32_t i = 0; i < (uint32_t)from->attachmentCount; ++i)
-            {
-                deepcopy_VkPipelineColorBlendAttachmentState(alloc, rootType, from->pAttachments + i, (VkPipelineColorBlendAttachmentState*)(to->pAttachments + i));
+            for (uint32_t i = 0; i < (uint32_t)from->attachmentCount; ++i) {
+                deepcopy_VkPipelineColorBlendAttachmentState(
+                    alloc, rootType, from->pAttachments + i,
+                    (VkPipelineColorBlendAttachmentState*)(to->pAttachments + i));
             }
         }
     }
     memcpy(to->blendConstants, from->blendConstants, 4 * sizeof(float));
 }
 
-void deepcopy_VkPipelineDynamicStateCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineDynamicStateCreateInfo* from,
-    VkPipelineDynamicStateCreateInfo* to)
-{
+void deepcopy_VkPipelineDynamicStateCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                               const VkPipelineDynamicStateCreateInfo* from,
+                                               VkPipelineDynamicStateCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pDynamicStates = nullptr;
-    if (from->pDynamicStates)
-    {
-        to->pDynamicStates = (VkDynamicState*)alloc->dupArray(from->pDynamicStates, from->dynamicStateCount * sizeof(const VkDynamicState));
+    if (from->pDynamicStates) {
+        to->pDynamicStates = (VkDynamicState*)alloc->dupArray(
+            from->pDynamicStates, from->dynamicStateCount * sizeof(const VkDynamicState));
     }
 }
 
-void deepcopy_VkGraphicsPipelineCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkGraphicsPipelineCreateInfo* from,
-    VkGraphicsPipelineCreateInfo* to)
-{
+void deepcopy_VkGraphicsPipelineCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                           const VkGraphicsPipelineCreateInfo* from,
+                                           VkGraphicsPipelineCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pStages = nullptr;
-        if (from->pStages)
-        {
-            to->pStages = (VkPipelineShaderStageCreateInfo*)alloc->alloc(from->stageCount * sizeof(const VkPipelineShaderStageCreateInfo));
+        if (from->pStages) {
+            to->pStages = (VkPipelineShaderStageCreateInfo*)alloc->alloc(
+                from->stageCount * sizeof(const VkPipelineShaderStageCreateInfo));
             to->stageCount = from->stageCount;
-            for (uint32_t i = 0; i < (uint32_t)from->stageCount; ++i)
-            {
-                deepcopy_VkPipelineShaderStageCreateInfo(alloc, rootType, from->pStages + i, (VkPipelineShaderStageCreateInfo*)(to->pStages + i));
+            for (uint32_t i = 0; i < (uint32_t)from->stageCount; ++i) {
+                deepcopy_VkPipelineShaderStageCreateInfo(
+                    alloc, rootType, from->pStages + i,
+                    (VkPipelineShaderStageCreateInfo*)(to->pStages + i));
             }
         }
     }
     to->pVertexInputState = nullptr;
-    if (from->pVertexInputState)
-    {
-        to->pVertexInputState = (VkPipelineVertexInputStateCreateInfo*)alloc->alloc(sizeof(const VkPipelineVertexInputStateCreateInfo));
-        deepcopy_VkPipelineVertexInputStateCreateInfo(alloc, rootType, from->pVertexInputState, (VkPipelineVertexInputStateCreateInfo*)(to->pVertexInputState));
+    if (from->pVertexInputState) {
+        to->pVertexInputState = (VkPipelineVertexInputStateCreateInfo*)alloc->alloc(
+            sizeof(const VkPipelineVertexInputStateCreateInfo));
+        deepcopy_VkPipelineVertexInputStateCreateInfo(
+            alloc, rootType, from->pVertexInputState,
+            (VkPipelineVertexInputStateCreateInfo*)(to->pVertexInputState));
     }
     to->pInputAssemblyState = nullptr;
-    if (from->pInputAssemblyState)
-    {
-        to->pInputAssemblyState = (VkPipelineInputAssemblyStateCreateInfo*)alloc->alloc(sizeof(const VkPipelineInputAssemblyStateCreateInfo));
-        deepcopy_VkPipelineInputAssemblyStateCreateInfo(alloc, rootType, from->pInputAssemblyState, (VkPipelineInputAssemblyStateCreateInfo*)(to->pInputAssemblyState));
+    if (from->pInputAssemblyState) {
+        to->pInputAssemblyState = (VkPipelineInputAssemblyStateCreateInfo*)alloc->alloc(
+            sizeof(const VkPipelineInputAssemblyStateCreateInfo));
+        deepcopy_VkPipelineInputAssemblyStateCreateInfo(
+            alloc, rootType, from->pInputAssemblyState,
+            (VkPipelineInputAssemblyStateCreateInfo*)(to->pInputAssemblyState));
     }
     to->pTessellationState = nullptr;
-    if (from->pTessellationState)
-    {
-        to->pTessellationState = (VkPipelineTessellationStateCreateInfo*)alloc->alloc(sizeof(const VkPipelineTessellationStateCreateInfo));
-        deepcopy_VkPipelineTessellationStateCreateInfo(alloc, rootType, from->pTessellationState, (VkPipelineTessellationStateCreateInfo*)(to->pTessellationState));
+    if (from->pTessellationState) {
+        to->pTessellationState = (VkPipelineTessellationStateCreateInfo*)alloc->alloc(
+            sizeof(const VkPipelineTessellationStateCreateInfo));
+        deepcopy_VkPipelineTessellationStateCreateInfo(
+            alloc, rootType, from->pTessellationState,
+            (VkPipelineTessellationStateCreateInfo*)(to->pTessellationState));
     }
     to->pViewportState = nullptr;
-    if (from->pViewportState)
-    {
-        to->pViewportState = (VkPipelineViewportStateCreateInfo*)alloc->alloc(sizeof(const VkPipelineViewportStateCreateInfo));
-        deepcopy_VkPipelineViewportStateCreateInfo(alloc, rootType, from->pViewportState, (VkPipelineViewportStateCreateInfo*)(to->pViewportState));
+    if (from->pViewportState) {
+        to->pViewportState = (VkPipelineViewportStateCreateInfo*)alloc->alloc(
+            sizeof(const VkPipelineViewportStateCreateInfo));
+        deepcopy_VkPipelineViewportStateCreateInfo(
+            alloc, rootType, from->pViewportState,
+            (VkPipelineViewportStateCreateInfo*)(to->pViewportState));
     }
     to->pRasterizationState = nullptr;
-    if (from->pRasterizationState)
-    {
-        to->pRasterizationState = (VkPipelineRasterizationStateCreateInfo*)alloc->alloc(sizeof(const VkPipelineRasterizationStateCreateInfo));
-        deepcopy_VkPipelineRasterizationStateCreateInfo(alloc, rootType, from->pRasterizationState, (VkPipelineRasterizationStateCreateInfo*)(to->pRasterizationState));
+    if (from->pRasterizationState) {
+        to->pRasterizationState = (VkPipelineRasterizationStateCreateInfo*)alloc->alloc(
+            sizeof(const VkPipelineRasterizationStateCreateInfo));
+        deepcopy_VkPipelineRasterizationStateCreateInfo(
+            alloc, rootType, from->pRasterizationState,
+            (VkPipelineRasterizationStateCreateInfo*)(to->pRasterizationState));
     }
     to->pMultisampleState = nullptr;
-    if (from->pMultisampleState)
-    {
-        to->pMultisampleState = (VkPipelineMultisampleStateCreateInfo*)alloc->alloc(sizeof(const VkPipelineMultisampleStateCreateInfo));
-        deepcopy_VkPipelineMultisampleStateCreateInfo(alloc, rootType, from->pMultisampleState, (VkPipelineMultisampleStateCreateInfo*)(to->pMultisampleState));
+    if (from->pMultisampleState) {
+        to->pMultisampleState = (VkPipelineMultisampleStateCreateInfo*)alloc->alloc(
+            sizeof(const VkPipelineMultisampleStateCreateInfo));
+        deepcopy_VkPipelineMultisampleStateCreateInfo(
+            alloc, rootType, from->pMultisampleState,
+            (VkPipelineMultisampleStateCreateInfo*)(to->pMultisampleState));
     }
     to->pDepthStencilState = nullptr;
-    if (from->pDepthStencilState)
-    {
-        to->pDepthStencilState = (VkPipelineDepthStencilStateCreateInfo*)alloc->alloc(sizeof(const VkPipelineDepthStencilStateCreateInfo));
-        deepcopy_VkPipelineDepthStencilStateCreateInfo(alloc, rootType, from->pDepthStencilState, (VkPipelineDepthStencilStateCreateInfo*)(to->pDepthStencilState));
+    if (from->pDepthStencilState) {
+        to->pDepthStencilState = (VkPipelineDepthStencilStateCreateInfo*)alloc->alloc(
+            sizeof(const VkPipelineDepthStencilStateCreateInfo));
+        deepcopy_VkPipelineDepthStencilStateCreateInfo(
+            alloc, rootType, from->pDepthStencilState,
+            (VkPipelineDepthStencilStateCreateInfo*)(to->pDepthStencilState));
     }
     to->pColorBlendState = nullptr;
-    if (from->pColorBlendState)
-    {
-        to->pColorBlendState = (VkPipelineColorBlendStateCreateInfo*)alloc->alloc(sizeof(const VkPipelineColorBlendStateCreateInfo));
-        deepcopy_VkPipelineColorBlendStateCreateInfo(alloc, rootType, from->pColorBlendState, (VkPipelineColorBlendStateCreateInfo*)(to->pColorBlendState));
+    if (from->pColorBlendState) {
+        to->pColorBlendState = (VkPipelineColorBlendStateCreateInfo*)alloc->alloc(
+            sizeof(const VkPipelineColorBlendStateCreateInfo));
+        deepcopy_VkPipelineColorBlendStateCreateInfo(
+            alloc, rootType, from->pColorBlendState,
+            (VkPipelineColorBlendStateCreateInfo*)(to->pColorBlendState));
     }
     to->pDynamicState = nullptr;
-    if (from->pDynamicState)
-    {
-        to->pDynamicState = (VkPipelineDynamicStateCreateInfo*)alloc->alloc(sizeof(const VkPipelineDynamicStateCreateInfo));
-        deepcopy_VkPipelineDynamicStateCreateInfo(alloc, rootType, from->pDynamicState, (VkPipelineDynamicStateCreateInfo*)(to->pDynamicState));
+    if (from->pDynamicState) {
+        to->pDynamicState = (VkPipelineDynamicStateCreateInfo*)alloc->alloc(
+            sizeof(const VkPipelineDynamicStateCreateInfo));
+        deepcopy_VkPipelineDynamicStateCreateInfo(
+            alloc, rootType, from->pDynamicState,
+            (VkPipelineDynamicStateCreateInfo*)(to->pDynamicState));
     }
 }
 
-void deepcopy_VkPushConstantRange(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPushConstantRange* from,
-    VkPushConstantRange* to)
-{
+void deepcopy_VkPushConstantRange(Allocator* alloc, VkStructureType rootType,
+                                  const VkPushConstantRange* from, VkPushConstantRange* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkPipelineLayoutCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineLayoutCreateInfo* from,
-    VkPipelineLayoutCreateInfo* to)
-{
+void deepcopy_VkPipelineLayoutCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                         const VkPipelineLayoutCreateInfo* from,
+                                         VkPipelineLayoutCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pSetLayouts = nullptr;
-    if (from->pSetLayouts)
-    {
-        to->pSetLayouts = (VkDescriptorSetLayout*)alloc->dupArray(from->pSetLayouts, from->setLayoutCount * sizeof(const VkDescriptorSetLayout));
+    if (from->pSetLayouts) {
+        to->pSetLayouts = (VkDescriptorSetLayout*)alloc->dupArray(
+            from->pSetLayouts, from->setLayoutCount * sizeof(const VkDescriptorSetLayout));
     }
-    if (from)
-    {
+    if (from) {
         to->pPushConstantRanges = nullptr;
-        if (from->pPushConstantRanges)
-        {
-            to->pPushConstantRanges = (VkPushConstantRange*)alloc->alloc(from->pushConstantRangeCount * sizeof(const VkPushConstantRange));
+        if (from->pPushConstantRanges) {
+            to->pPushConstantRanges = (VkPushConstantRange*)alloc->alloc(
+                from->pushConstantRangeCount * sizeof(const VkPushConstantRange));
             to->pushConstantRangeCount = from->pushConstantRangeCount;
-            for (uint32_t i = 0; i < (uint32_t)from->pushConstantRangeCount; ++i)
-            {
-                deepcopy_VkPushConstantRange(alloc, rootType, from->pPushConstantRanges + i, (VkPushConstantRange*)(to->pPushConstantRanges + i));
+            for (uint32_t i = 0; i < (uint32_t)from->pushConstantRangeCount; ++i) {
+                deepcopy_VkPushConstantRange(alloc, rootType, from->pPushConstantRanges + i,
+                                             (VkPushConstantRange*)(to->pPushConstantRanges + i));
             }
         }
     }
 }
 
-void deepcopy_VkSamplerCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSamplerCreateInfo* from,
-    VkSamplerCreateInfo* to)
-{
+void deepcopy_VkSamplerCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                  const VkSamplerCreateInfo* from, VkSamplerCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkCopyDescriptorSet(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCopyDescriptorSet* from,
-    VkCopyDescriptorSet* to)
-{
+void deepcopy_VkCopyDescriptorSet(Allocator* alloc, VkStructureType rootType,
+                                  const VkCopyDescriptorSet* from, VkCopyDescriptorSet* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkDescriptorBufferInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDescriptorBufferInfo* from,
-    VkDescriptorBufferInfo* to)
-{
+void deepcopy_VkDescriptorBufferInfo(Allocator* alloc, VkStructureType rootType,
+                                     const VkDescriptorBufferInfo* from,
+                                     VkDescriptorBufferInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkDescriptorImageInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDescriptorImageInfo* from,
-    VkDescriptorImageInfo* to)
-{
+void deepcopy_VkDescriptorImageInfo(Allocator* alloc, VkStructureType rootType,
+                                    const VkDescriptorImageInfo* from, VkDescriptorImageInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkDescriptorPoolSize(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDescriptorPoolSize* from,
-    VkDescriptorPoolSize* to)
-{
+void deepcopy_VkDescriptorPoolSize(Allocator* alloc, VkStructureType rootType,
+                                   const VkDescriptorPoolSize* from, VkDescriptorPoolSize* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkDescriptorPoolCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDescriptorPoolCreateInfo* from,
-    VkDescriptorPoolCreateInfo* to)
-{
+void deepcopy_VkDescriptorPoolCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                         const VkDescriptorPoolCreateInfo* from,
+                                         VkDescriptorPoolCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pPoolSizes = nullptr;
-        if (from->pPoolSizes)
-        {
-            to->pPoolSizes = (VkDescriptorPoolSize*)alloc->alloc(from->poolSizeCount * sizeof(const VkDescriptorPoolSize));
+        if (from->pPoolSizes) {
+            to->pPoolSizes = (VkDescriptorPoolSize*)alloc->alloc(
+                from->poolSizeCount * sizeof(const VkDescriptorPoolSize));
             to->poolSizeCount = from->poolSizeCount;
-            for (uint32_t i = 0; i < (uint32_t)from->poolSizeCount; ++i)
-            {
-                deepcopy_VkDescriptorPoolSize(alloc, rootType, from->pPoolSizes + i, (VkDescriptorPoolSize*)(to->pPoolSizes + i));
+            for (uint32_t i = 0; i < (uint32_t)from->poolSizeCount; ++i) {
+                deepcopy_VkDescriptorPoolSize(alloc, rootType, from->pPoolSizes + i,
+                                              (VkDescriptorPoolSize*)(to->pPoolSizes + i));
             }
         }
     }
 }
 
-void deepcopy_VkDescriptorSetAllocateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDescriptorSetAllocateInfo* from,
-    VkDescriptorSetAllocateInfo* to)
-{
+void deepcopy_VkDescriptorSetAllocateInfo(Allocator* alloc, VkStructureType rootType,
+                                          const VkDescriptorSetAllocateInfo* from,
+                                          VkDescriptorSetAllocateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pSetLayouts = nullptr;
-    if (from->pSetLayouts)
-    {
-        to->pSetLayouts = (VkDescriptorSetLayout*)alloc->dupArray(from->pSetLayouts, from->descriptorSetCount * sizeof(const VkDescriptorSetLayout));
+    if (from->pSetLayouts) {
+        to->pSetLayouts = (VkDescriptorSetLayout*)alloc->dupArray(
+            from->pSetLayouts, from->descriptorSetCount * sizeof(const VkDescriptorSetLayout));
     }
 }
 
-void deepcopy_VkDescriptorSetLayoutBinding(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDescriptorSetLayoutBinding* from,
-    VkDescriptorSetLayoutBinding* to)
-{
+void deepcopy_VkDescriptorSetLayoutBinding(Allocator* alloc, VkStructureType rootType,
+                                           const VkDescriptorSetLayoutBinding* from,
+                                           VkDescriptorSetLayoutBinding* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
     to->pImmutableSamplers = nullptr;
-    if (from->pImmutableSamplers)
-    {
-        to->pImmutableSamplers = (VkSampler*)alloc->dupArray(from->pImmutableSamplers, from->descriptorCount * sizeof(const VkSampler));
+    if (from->pImmutableSamplers) {
+        to->pImmutableSamplers = (VkSampler*)alloc->dupArray(
+            from->pImmutableSamplers, from->descriptorCount * sizeof(const VkSampler));
     }
 }
 
-void deepcopy_VkDescriptorSetLayoutCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDescriptorSetLayoutCreateInfo* from,
-    VkDescriptorSetLayoutCreateInfo* to)
-{
+void deepcopy_VkDescriptorSetLayoutCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                              const VkDescriptorSetLayoutCreateInfo* from,
+                                              VkDescriptorSetLayoutCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pBindings = nullptr;
-        if (from->pBindings)
-        {
-            to->pBindings = (VkDescriptorSetLayoutBinding*)alloc->alloc(from->bindingCount * sizeof(const VkDescriptorSetLayoutBinding));
+        if (from->pBindings) {
+            to->pBindings = (VkDescriptorSetLayoutBinding*)alloc->alloc(
+                from->bindingCount * sizeof(const VkDescriptorSetLayoutBinding));
             to->bindingCount = from->bindingCount;
-            for (uint32_t i = 0; i < (uint32_t)from->bindingCount; ++i)
-            {
-                deepcopy_VkDescriptorSetLayoutBinding(alloc, rootType, from->pBindings + i, (VkDescriptorSetLayoutBinding*)(to->pBindings + i));
+            for (uint32_t i = 0; i < (uint32_t)from->bindingCount; ++i) {
+                deepcopy_VkDescriptorSetLayoutBinding(
+                    alloc, rootType, from->pBindings + i,
+                    (VkDescriptorSetLayoutBinding*)(to->pBindings + i));
             }
         }
     }
 }
 
-void deepcopy_VkWriteDescriptorSet(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkWriteDescriptorSet* from,
-    VkWriteDescriptorSet* to)
-{
+void deepcopy_VkWriteDescriptorSet(Allocator* alloc, VkStructureType rootType,
+                                   const VkWriteDescriptorSet* from, VkWriteDescriptorSet* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pImageInfo = nullptr;
-        if (from->pImageInfo)
-        {
-            to->pImageInfo = (VkDescriptorImageInfo*)alloc->alloc(from->descriptorCount * sizeof(const VkDescriptorImageInfo));
+        if (from->pImageInfo) {
+            to->pImageInfo = (VkDescriptorImageInfo*)alloc->alloc(
+                from->descriptorCount * sizeof(const VkDescriptorImageInfo));
             to->descriptorCount = from->descriptorCount;
-            for (uint32_t i = 0; i < (uint32_t)from->descriptorCount; ++i)
-            {
-                deepcopy_VkDescriptorImageInfo(alloc, rootType, from->pImageInfo + i, (VkDescriptorImageInfo*)(to->pImageInfo + i));
+            for (uint32_t i = 0; i < (uint32_t)from->descriptorCount; ++i) {
+                deepcopy_VkDescriptorImageInfo(alloc, rootType, from->pImageInfo + i,
+                                               (VkDescriptorImageInfo*)(to->pImageInfo + i));
             }
         }
     }
-    if (from)
-    {
+    if (from) {
         to->pBufferInfo = nullptr;
-        if (from->pBufferInfo)
-        {
-            to->pBufferInfo = (VkDescriptorBufferInfo*)alloc->alloc(from->descriptorCount * sizeof(const VkDescriptorBufferInfo));
+        if (from->pBufferInfo) {
+            to->pBufferInfo = (VkDescriptorBufferInfo*)alloc->alloc(
+                from->descriptorCount * sizeof(const VkDescriptorBufferInfo));
             to->descriptorCount = from->descriptorCount;
-            for (uint32_t i = 0; i < (uint32_t)from->descriptorCount; ++i)
-            {
-                deepcopy_VkDescriptorBufferInfo(alloc, rootType, from->pBufferInfo + i, (VkDescriptorBufferInfo*)(to->pBufferInfo + i));
+            for (uint32_t i = 0; i < (uint32_t)from->descriptorCount; ++i) {
+                deepcopy_VkDescriptorBufferInfo(alloc, rootType, from->pBufferInfo + i,
+                                                (VkDescriptorBufferInfo*)(to->pBufferInfo + i));
             }
         }
     }
     to->pTexelBufferView = nullptr;
-    if (from->pTexelBufferView)
-    {
-        to->pTexelBufferView = (VkBufferView*)alloc->dupArray(from->pTexelBufferView, from->descriptorCount * sizeof(const VkBufferView));
+    if (from->pTexelBufferView) {
+        to->pTexelBufferView = (VkBufferView*)alloc->dupArray(
+            from->pTexelBufferView, from->descriptorCount * sizeof(const VkBufferView));
     }
 }
 
-void deepcopy_VkAttachmentDescription(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAttachmentDescription* from,
-    VkAttachmentDescription* to)
-{
+void deepcopy_VkAttachmentDescription(Allocator* alloc, VkStructureType rootType,
+                                      const VkAttachmentDescription* from,
+                                      VkAttachmentDescription* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkAttachmentReference(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAttachmentReference* from,
-    VkAttachmentReference* to)
-{
+void deepcopy_VkAttachmentReference(Allocator* alloc, VkStructureType rootType,
+                                    const VkAttachmentReference* from, VkAttachmentReference* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkFramebufferCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkFramebufferCreateInfo* from,
-    VkFramebufferCreateInfo* to)
-{
+void deepcopy_VkFramebufferCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                      const VkFramebufferCreateInfo* from,
+                                      VkFramebufferCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pAttachments = nullptr;
-    if (from->pAttachments)
-    {
-        to->pAttachments = (VkImageView*)alloc->dupArray(from->pAttachments, from->attachmentCount * sizeof(const VkImageView));
+    if (from->pAttachments) {
+        to->pAttachments = (VkImageView*)alloc->dupArray(
+            from->pAttachments, from->attachmentCount * sizeof(const VkImageView));
     }
 }
 
-void deepcopy_VkSubpassDescription(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSubpassDescription* from,
-    VkSubpassDescription* to)
-{
+void deepcopy_VkSubpassDescription(Allocator* alloc, VkStructureType rootType,
+                                   const VkSubpassDescription* from, VkSubpassDescription* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (from)
-    {
+    if (from) {
         to->pInputAttachments = nullptr;
-        if (from->pInputAttachments)
-        {
-            to->pInputAttachments = (VkAttachmentReference*)alloc->alloc(from->inputAttachmentCount * sizeof(const VkAttachmentReference));
+        if (from->pInputAttachments) {
+            to->pInputAttachments = (VkAttachmentReference*)alloc->alloc(
+                from->inputAttachmentCount * sizeof(const VkAttachmentReference));
             to->inputAttachmentCount = from->inputAttachmentCount;
-            for (uint32_t i = 0; i < (uint32_t)from->inputAttachmentCount; ++i)
-            {
-                deepcopy_VkAttachmentReference(alloc, rootType, from->pInputAttachments + i, (VkAttachmentReference*)(to->pInputAttachments + i));
+            for (uint32_t i = 0; i < (uint32_t)from->inputAttachmentCount; ++i) {
+                deepcopy_VkAttachmentReference(alloc, rootType, from->pInputAttachments + i,
+                                               (VkAttachmentReference*)(to->pInputAttachments + i));
             }
         }
     }
-    if (from)
-    {
+    if (from) {
         to->pColorAttachments = nullptr;
-        if (from->pColorAttachments)
-        {
-            to->pColorAttachments = (VkAttachmentReference*)alloc->alloc(from->colorAttachmentCount * sizeof(const VkAttachmentReference));
+        if (from->pColorAttachments) {
+            to->pColorAttachments = (VkAttachmentReference*)alloc->alloc(
+                from->colorAttachmentCount * sizeof(const VkAttachmentReference));
             to->colorAttachmentCount = from->colorAttachmentCount;
-            for (uint32_t i = 0; i < (uint32_t)from->colorAttachmentCount; ++i)
-            {
-                deepcopy_VkAttachmentReference(alloc, rootType, from->pColorAttachments + i, (VkAttachmentReference*)(to->pColorAttachments + i));
+            for (uint32_t i = 0; i < (uint32_t)from->colorAttachmentCount; ++i) {
+                deepcopy_VkAttachmentReference(alloc, rootType, from->pColorAttachments + i,
+                                               (VkAttachmentReference*)(to->pColorAttachments + i));
             }
         }
     }
-    if (from)
-    {
+    if (from) {
         to->pResolveAttachments = nullptr;
-        if (from->pResolveAttachments)
-        {
-            to->pResolveAttachments = (VkAttachmentReference*)alloc->alloc(from->colorAttachmentCount * sizeof(const VkAttachmentReference));
+        if (from->pResolveAttachments) {
+            to->pResolveAttachments = (VkAttachmentReference*)alloc->alloc(
+                from->colorAttachmentCount * sizeof(const VkAttachmentReference));
             to->colorAttachmentCount = from->colorAttachmentCount;
-            for (uint32_t i = 0; i < (uint32_t)from->colorAttachmentCount; ++i)
-            {
-                deepcopy_VkAttachmentReference(alloc, rootType, from->pResolveAttachments + i, (VkAttachmentReference*)(to->pResolveAttachments + i));
+            for (uint32_t i = 0; i < (uint32_t)from->colorAttachmentCount; ++i) {
+                deepcopy_VkAttachmentReference(
+                    alloc, rootType, from->pResolveAttachments + i,
+                    (VkAttachmentReference*)(to->pResolveAttachments + i));
             }
         }
     }
     to->pDepthStencilAttachment = nullptr;
-    if (from->pDepthStencilAttachment)
-    {
-        to->pDepthStencilAttachment = (VkAttachmentReference*)alloc->alloc(sizeof(const VkAttachmentReference));
-        deepcopy_VkAttachmentReference(alloc, rootType, from->pDepthStencilAttachment, (VkAttachmentReference*)(to->pDepthStencilAttachment));
+    if (from->pDepthStencilAttachment) {
+        to->pDepthStencilAttachment =
+            (VkAttachmentReference*)alloc->alloc(sizeof(const VkAttachmentReference));
+        deepcopy_VkAttachmentReference(alloc, rootType, from->pDepthStencilAttachment,
+                                       (VkAttachmentReference*)(to->pDepthStencilAttachment));
     }
     to->pPreserveAttachments = nullptr;
-    if (from->pPreserveAttachments)
-    {
-        to->pPreserveAttachments = (uint32_t*)alloc->dupArray(from->pPreserveAttachments, from->preserveAttachmentCount * sizeof(const uint32_t));
+    if (from->pPreserveAttachments) {
+        to->pPreserveAttachments = (uint32_t*)alloc->dupArray(
+            from->pPreserveAttachments, from->preserveAttachmentCount * sizeof(const uint32_t));
     }
 }
 
-void deepcopy_VkSubpassDependency(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSubpassDependency* from,
-    VkSubpassDependency* to)
-{
+void deepcopy_VkSubpassDependency(Allocator* alloc, VkStructureType rootType,
+                                  const VkSubpassDependency* from, VkSubpassDependency* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkRenderPassCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkRenderPassCreateInfo* from,
-    VkRenderPassCreateInfo* to)
-{
+void deepcopy_VkRenderPassCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                     const VkRenderPassCreateInfo* from,
+                                     VkRenderPassCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pAttachments = nullptr;
-        if (from->pAttachments)
-        {
-            to->pAttachments = (VkAttachmentDescription*)alloc->alloc(from->attachmentCount * sizeof(const VkAttachmentDescription));
+        if (from->pAttachments) {
+            to->pAttachments = (VkAttachmentDescription*)alloc->alloc(
+                from->attachmentCount * sizeof(const VkAttachmentDescription));
             to->attachmentCount = from->attachmentCount;
-            for (uint32_t i = 0; i < (uint32_t)from->attachmentCount; ++i)
-            {
-                deepcopy_VkAttachmentDescription(alloc, rootType, from->pAttachments + i, (VkAttachmentDescription*)(to->pAttachments + i));
+            for (uint32_t i = 0; i < (uint32_t)from->attachmentCount; ++i) {
+                deepcopy_VkAttachmentDescription(alloc, rootType, from->pAttachments + i,
+                                                 (VkAttachmentDescription*)(to->pAttachments + i));
             }
         }
     }
-    if (from)
-    {
+    if (from) {
         to->pSubpasses = nullptr;
-        if (from->pSubpasses)
-        {
-            to->pSubpasses = (VkSubpassDescription*)alloc->alloc(from->subpassCount * sizeof(const VkSubpassDescription));
+        if (from->pSubpasses) {
+            to->pSubpasses = (VkSubpassDescription*)alloc->alloc(
+                from->subpassCount * sizeof(const VkSubpassDescription));
             to->subpassCount = from->subpassCount;
-            for (uint32_t i = 0; i < (uint32_t)from->subpassCount; ++i)
-            {
-                deepcopy_VkSubpassDescription(alloc, rootType, from->pSubpasses + i, (VkSubpassDescription*)(to->pSubpasses + i));
+            for (uint32_t i = 0; i < (uint32_t)from->subpassCount; ++i) {
+                deepcopy_VkSubpassDescription(alloc, rootType, from->pSubpasses + i,
+                                              (VkSubpassDescription*)(to->pSubpasses + i));
             }
         }
     }
-    if (from)
-    {
+    if (from) {
         to->pDependencies = nullptr;
-        if (from->pDependencies)
-        {
-            to->pDependencies = (VkSubpassDependency*)alloc->alloc(from->dependencyCount * sizeof(const VkSubpassDependency));
+        if (from->pDependencies) {
+            to->pDependencies = (VkSubpassDependency*)alloc->alloc(
+                from->dependencyCount * sizeof(const VkSubpassDependency));
             to->dependencyCount = from->dependencyCount;
-            for (uint32_t i = 0; i < (uint32_t)from->dependencyCount; ++i)
-            {
-                deepcopy_VkSubpassDependency(alloc, rootType, from->pDependencies + i, (VkSubpassDependency*)(to->pDependencies + i));
+            for (uint32_t i = 0; i < (uint32_t)from->dependencyCount; ++i) {
+                deepcopy_VkSubpassDependency(alloc, rootType, from->pDependencies + i,
+                                             (VkSubpassDependency*)(to->pDependencies + i));
             }
         }
     }
 }
 
-void deepcopy_VkCommandPoolCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCommandPoolCreateInfo* from,
-    VkCommandPoolCreateInfo* to)
-{
+void deepcopy_VkCommandPoolCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                      const VkCommandPoolCreateInfo* from,
+                                      VkCommandPoolCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkCommandBufferAllocateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCommandBufferAllocateInfo* from,
-    VkCommandBufferAllocateInfo* to)
-{
+void deepcopy_VkCommandBufferAllocateInfo(Allocator* alloc, VkStructureType rootType,
+                                          const VkCommandBufferAllocateInfo* from,
+                                          VkCommandBufferAllocateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkCommandBufferInheritanceInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCommandBufferInheritanceInfo* from,
-    VkCommandBufferInheritanceInfo* to)
-{
+void deepcopy_VkCommandBufferInheritanceInfo(Allocator* alloc, VkStructureType rootType,
+                                             const VkCommandBufferInheritanceInfo* from,
+                                             VkCommandBufferInheritanceInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkCommandBufferBeginInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCommandBufferBeginInfo* from,
-    VkCommandBufferBeginInfo* to)
-{
+void deepcopy_VkCommandBufferBeginInfo(Allocator* alloc, VkStructureType rootType,
+                                       const VkCommandBufferBeginInfo* from,
+                                       VkCommandBufferBeginInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pInheritanceInfo = nullptr;
-    if (from->pInheritanceInfo)
-    {
-        to->pInheritanceInfo = (VkCommandBufferInheritanceInfo*)alloc->alloc(sizeof(const VkCommandBufferInheritanceInfo));
-        deepcopy_VkCommandBufferInheritanceInfo(alloc, rootType, from->pInheritanceInfo, (VkCommandBufferInheritanceInfo*)(to->pInheritanceInfo));
+    if (from->pInheritanceInfo) {
+        to->pInheritanceInfo = (VkCommandBufferInheritanceInfo*)alloc->alloc(
+            sizeof(const VkCommandBufferInheritanceInfo));
+        deepcopy_VkCommandBufferInheritanceInfo(
+            alloc, rootType, from->pInheritanceInfo,
+            (VkCommandBufferInheritanceInfo*)(to->pInheritanceInfo));
     }
 }
 
-void deepcopy_VkBufferCopy(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBufferCopy* from,
-    VkBufferCopy* to)
-{
+void deepcopy_VkBufferCopy(Allocator* alloc, VkStructureType rootType, const VkBufferCopy* from,
+                           VkBufferCopy* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkImageSubresourceLayers(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageSubresourceLayers* from,
-    VkImageSubresourceLayers* to)
-{
+void deepcopy_VkImageSubresourceLayers(Allocator* alloc, VkStructureType rootType,
+                                       const VkImageSubresourceLayers* from,
+                                       VkImageSubresourceLayers* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkBufferImageCopy(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBufferImageCopy* from,
-    VkBufferImageCopy* to)
-{
+void deepcopy_VkBufferImageCopy(Allocator* alloc, VkStructureType rootType,
+                                const VkBufferImageCopy* from, VkBufferImageCopy* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    deepcopy_VkImageSubresourceLayers(alloc, rootType, &from->imageSubresource, (VkImageSubresourceLayers*)(&to->imageSubresource));
+    deepcopy_VkImageSubresourceLayers(alloc, rootType, &from->imageSubresource,
+                                      (VkImageSubresourceLayers*)(&to->imageSubresource));
     deepcopy_VkOffset3D(alloc, rootType, &from->imageOffset, (VkOffset3D*)(&to->imageOffset));
     deepcopy_VkExtent3D(alloc, rootType, &from->imageExtent, (VkExtent3D*)(&to->imageExtent));
 }
 
-void deepcopy_VkClearColorValue(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkClearColorValue* from,
-    VkClearColorValue* to)
-{
+void deepcopy_VkClearColorValue(Allocator* alloc, VkStructureType rootType,
+                                const VkClearColorValue* from, VkClearColorValue* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
@@ -2574,144 +2091,116 @@
     memcpy(to->uint32, from->uint32, 4 * sizeof(uint32_t));
 }
 
-void deepcopy_VkClearDepthStencilValue(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkClearDepthStencilValue* from,
-    VkClearDepthStencilValue* to)
-{
+void deepcopy_VkClearDepthStencilValue(Allocator* alloc, VkStructureType rootType,
+                                       const VkClearDepthStencilValue* from,
+                                       VkClearDepthStencilValue* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkClearValue(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkClearValue* from,
-    VkClearValue* to)
-{
+void deepcopy_VkClearValue(Allocator* alloc, VkStructureType rootType, const VkClearValue* from,
+                           VkClearValue* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
     deepcopy_VkClearColorValue(alloc, rootType, &from->color, (VkClearColorValue*)(&to->color));
-    deepcopy_VkClearDepthStencilValue(alloc, rootType, &from->depthStencil, (VkClearDepthStencilValue*)(&to->depthStencil));
+    deepcopy_VkClearDepthStencilValue(alloc, rootType, &from->depthStencil,
+                                      (VkClearDepthStencilValue*)(&to->depthStencil));
 }
 
-void deepcopy_VkClearAttachment(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkClearAttachment* from,
-    VkClearAttachment* to)
-{
+void deepcopy_VkClearAttachment(Allocator* alloc, VkStructureType rootType,
+                                const VkClearAttachment* from, VkClearAttachment* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
     deepcopy_VkClearValue(alloc, rootType, &from->clearValue, (VkClearValue*)(&to->clearValue));
 }
 
-void deepcopy_VkClearRect(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkClearRect* from,
-    VkClearRect* to)
-{
+void deepcopy_VkClearRect(Allocator* alloc, VkStructureType rootType, const VkClearRect* from,
+                          VkClearRect* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
     deepcopy_VkRect2D(alloc, rootType, &from->rect, (VkRect2D*)(&to->rect));
 }
 
-void deepcopy_VkImageBlit(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageBlit* from,
-    VkImageBlit* to)
-{
+void deepcopy_VkImageBlit(Allocator* alloc, VkStructureType rootType, const VkImageBlit* from,
+                          VkImageBlit* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    deepcopy_VkImageSubresourceLayers(alloc, rootType, &from->srcSubresource, (VkImageSubresourceLayers*)(&to->srcSubresource));
-    for (uint32_t i = 0; i < (uint32_t)2; ++i)
-    {
-        deepcopy_VkOffset3D(alloc, rootType, from->srcOffsets + i, (VkOffset3D*)(to->srcOffsets + i));
+    deepcopy_VkImageSubresourceLayers(alloc, rootType, &from->srcSubresource,
+                                      (VkImageSubresourceLayers*)(&to->srcSubresource));
+    for (uint32_t i = 0; i < (uint32_t)2; ++i) {
+        deepcopy_VkOffset3D(alloc, rootType, from->srcOffsets + i,
+                            (VkOffset3D*)(to->srcOffsets + i));
     }
-    deepcopy_VkImageSubresourceLayers(alloc, rootType, &from->dstSubresource, (VkImageSubresourceLayers*)(&to->dstSubresource));
-    for (uint32_t i = 0; i < (uint32_t)2; ++i)
-    {
-        deepcopy_VkOffset3D(alloc, rootType, from->dstOffsets + i, (VkOffset3D*)(to->dstOffsets + i));
+    deepcopy_VkImageSubresourceLayers(alloc, rootType, &from->dstSubresource,
+                                      (VkImageSubresourceLayers*)(&to->dstSubresource));
+    for (uint32_t i = 0; i < (uint32_t)2; ++i) {
+        deepcopy_VkOffset3D(alloc, rootType, from->dstOffsets + i,
+                            (VkOffset3D*)(to->dstOffsets + i));
     }
 }
 
-void deepcopy_VkImageCopy(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageCopy* from,
-    VkImageCopy* to)
-{
+void deepcopy_VkImageCopy(Allocator* alloc, VkStructureType rootType, const VkImageCopy* from,
+                          VkImageCopy* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    deepcopy_VkImageSubresourceLayers(alloc, rootType, &from->srcSubresource, (VkImageSubresourceLayers*)(&to->srcSubresource));
+    deepcopy_VkImageSubresourceLayers(alloc, rootType, &from->srcSubresource,
+                                      (VkImageSubresourceLayers*)(&to->srcSubresource));
     deepcopy_VkOffset3D(alloc, rootType, &from->srcOffset, (VkOffset3D*)(&to->srcOffset));
-    deepcopy_VkImageSubresourceLayers(alloc, rootType, &from->dstSubresource, (VkImageSubresourceLayers*)(&to->dstSubresource));
+    deepcopy_VkImageSubresourceLayers(alloc, rootType, &from->dstSubresource,
+                                      (VkImageSubresourceLayers*)(&to->dstSubresource));
     deepcopy_VkOffset3D(alloc, rootType, &from->dstOffset, (VkOffset3D*)(&to->dstOffset));
     deepcopy_VkExtent3D(alloc, rootType, &from->extent, (VkExtent3D*)(&to->extent));
 }
 
-void deepcopy_VkImageResolve(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageResolve* from,
-    VkImageResolve* to)
-{
+void deepcopy_VkImageResolve(Allocator* alloc, VkStructureType rootType, const VkImageResolve* from,
+                             VkImageResolve* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    deepcopy_VkImageSubresourceLayers(alloc, rootType, &from->srcSubresource, (VkImageSubresourceLayers*)(&to->srcSubresource));
+    deepcopy_VkImageSubresourceLayers(alloc, rootType, &from->srcSubresource,
+                                      (VkImageSubresourceLayers*)(&to->srcSubresource));
     deepcopy_VkOffset3D(alloc, rootType, &from->srcOffset, (VkOffset3D*)(&to->srcOffset));
-    deepcopy_VkImageSubresourceLayers(alloc, rootType, &from->dstSubresource, (VkImageSubresourceLayers*)(&to->dstSubresource));
+    deepcopy_VkImageSubresourceLayers(alloc, rootType, &from->dstSubresource,
+                                      (VkImageSubresourceLayers*)(&to->dstSubresource));
     deepcopy_VkOffset3D(alloc, rootType, &from->dstOffset, (VkOffset3D*)(&to->dstOffset));
     deepcopy_VkExtent3D(alloc, rootType, &from->extent, (VkExtent3D*)(&to->extent));
 }
 
-void deepcopy_VkRenderPassBeginInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkRenderPassBeginInfo* from,
-    VkRenderPassBeginInfo* to)
-{
+void deepcopy_VkRenderPassBeginInfo(Allocator* alloc, VkStructureType rootType,
+                                    const VkRenderPassBeginInfo* from, VkRenderPassBeginInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     deepcopy_VkRect2D(alloc, rootType, &from->renderArea, (VkRect2D*)(&to->renderArea));
-    if (from)
-    {
+    if (from) {
         to->pClearValues = nullptr;
-        if (from->pClearValues)
-        {
-            to->pClearValues = (VkClearValue*)alloc->alloc(from->clearValueCount * sizeof(const VkClearValue));
+        if (from->pClearValues) {
+            to->pClearValues =
+                (VkClearValue*)alloc->alloc(from->clearValueCount * sizeof(const VkClearValue));
             to->clearValueCount = from->clearValueCount;
-            for (uint32_t i = 0; i < (uint32_t)from->clearValueCount; ++i)
-            {
-                deepcopy_VkClearValue(alloc, rootType, from->pClearValues + i, (VkClearValue*)(to->pClearValues + i));
+            for (uint32_t i = 0; i < (uint32_t)from->clearValueCount; ++i) {
+                deepcopy_VkClearValue(alloc, rootType, from->pClearValues + i,
+                                      (VkClearValue*)(to->pClearValues + i));
             }
         }
     }
@@ -2719,1628 +2208,1318 @@
 
 #endif
 #ifdef VK_VERSION_1_1
-void deepcopy_VkPhysicalDeviceSubgroupProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceSubgroupProperties* from,
-    VkPhysicalDeviceSubgroupProperties* to)
-{
+void deepcopy_VkPhysicalDeviceSubgroupProperties(Allocator* alloc, VkStructureType rootType,
+                                                 const VkPhysicalDeviceSubgroupProperties* from,
+                                                 VkPhysicalDeviceSubgroupProperties* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkBindBufferMemoryInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBindBufferMemoryInfo* from,
-    VkBindBufferMemoryInfo* to)
-{
+void deepcopy_VkBindBufferMemoryInfo(Allocator* alloc, VkStructureType rootType,
+                                     const VkBindBufferMemoryInfo* from,
+                                     VkBindBufferMemoryInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkBindImageMemoryInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBindImageMemoryInfo* from,
-    VkBindImageMemoryInfo* to)
-{
+void deepcopy_VkBindImageMemoryInfo(Allocator* alloc, VkStructureType rootType,
+                                    const VkBindImageMemoryInfo* from, VkBindImageMemoryInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkPhysicalDevice16BitStorageFeatures(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDevice16BitStorageFeatures* from,
-    VkPhysicalDevice16BitStorageFeatures* to)
-{
+void deepcopy_VkPhysicalDevice16BitStorageFeatures(Allocator* alloc, VkStructureType rootType,
+                                                   const VkPhysicalDevice16BitStorageFeatures* from,
+                                                   VkPhysicalDevice16BitStorageFeatures* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkMemoryDedicatedRequirements(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryDedicatedRequirements* from,
-    VkMemoryDedicatedRequirements* to)
-{
+void deepcopy_VkMemoryDedicatedRequirements(Allocator* alloc, VkStructureType rootType,
+                                            const VkMemoryDedicatedRequirements* from,
+                                            VkMemoryDedicatedRequirements* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkMemoryDedicatedAllocateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryDedicatedAllocateInfo* from,
-    VkMemoryDedicatedAllocateInfo* to)
-{
+void deepcopy_VkMemoryDedicatedAllocateInfo(Allocator* alloc, VkStructureType rootType,
+                                            const VkMemoryDedicatedAllocateInfo* from,
+                                            VkMemoryDedicatedAllocateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkMemoryAllocateFlagsInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryAllocateFlagsInfo* from,
-    VkMemoryAllocateFlagsInfo* to)
-{
+void deepcopy_VkMemoryAllocateFlagsInfo(Allocator* alloc, VkStructureType rootType,
+                                        const VkMemoryAllocateFlagsInfo* from,
+                                        VkMemoryAllocateFlagsInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkDeviceGroupRenderPassBeginInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDeviceGroupRenderPassBeginInfo* from,
-    VkDeviceGroupRenderPassBeginInfo* to)
-{
+void deepcopy_VkDeviceGroupRenderPassBeginInfo(Allocator* alloc, VkStructureType rootType,
+                                               const VkDeviceGroupRenderPassBeginInfo* from,
+                                               VkDeviceGroupRenderPassBeginInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pDeviceRenderAreas = nullptr;
-        if (from->pDeviceRenderAreas)
-        {
-            to->pDeviceRenderAreas = (VkRect2D*)alloc->alloc(from->deviceRenderAreaCount * sizeof(const VkRect2D));
+        if (from->pDeviceRenderAreas) {
+            to->pDeviceRenderAreas =
+                (VkRect2D*)alloc->alloc(from->deviceRenderAreaCount * sizeof(const VkRect2D));
             to->deviceRenderAreaCount = from->deviceRenderAreaCount;
-            for (uint32_t i = 0; i < (uint32_t)from->deviceRenderAreaCount; ++i)
-            {
-                deepcopy_VkRect2D(alloc, rootType, from->pDeviceRenderAreas + i, (VkRect2D*)(to->pDeviceRenderAreas + i));
+            for (uint32_t i = 0; i < (uint32_t)from->deviceRenderAreaCount; ++i) {
+                deepcopy_VkRect2D(alloc, rootType, from->pDeviceRenderAreas + i,
+                                  (VkRect2D*)(to->pDeviceRenderAreas + i));
             }
         }
     }
 }
 
-void deepcopy_VkDeviceGroupCommandBufferBeginInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDeviceGroupCommandBufferBeginInfo* from,
-    VkDeviceGroupCommandBufferBeginInfo* to)
-{
+void deepcopy_VkDeviceGroupCommandBufferBeginInfo(Allocator* alloc, VkStructureType rootType,
+                                                  const VkDeviceGroupCommandBufferBeginInfo* from,
+                                                  VkDeviceGroupCommandBufferBeginInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkDeviceGroupSubmitInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDeviceGroupSubmitInfo* from,
-    VkDeviceGroupSubmitInfo* to)
-{
+void deepcopy_VkDeviceGroupSubmitInfo(Allocator* alloc, VkStructureType rootType,
+                                      const VkDeviceGroupSubmitInfo* from,
+                                      VkDeviceGroupSubmitInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pWaitSemaphoreDeviceIndices = nullptr;
-    if (from->pWaitSemaphoreDeviceIndices)
-    {
-        to->pWaitSemaphoreDeviceIndices = (uint32_t*)alloc->dupArray(from->pWaitSemaphoreDeviceIndices, from->waitSemaphoreCount * sizeof(const uint32_t));
+    if (from->pWaitSemaphoreDeviceIndices) {
+        to->pWaitSemaphoreDeviceIndices = (uint32_t*)alloc->dupArray(
+            from->pWaitSemaphoreDeviceIndices, from->waitSemaphoreCount * sizeof(const uint32_t));
     }
     to->pCommandBufferDeviceMasks = nullptr;
-    if (from->pCommandBufferDeviceMasks)
-    {
-        to->pCommandBufferDeviceMasks = (uint32_t*)alloc->dupArray(from->pCommandBufferDeviceMasks, from->commandBufferCount * sizeof(const uint32_t));
+    if (from->pCommandBufferDeviceMasks) {
+        to->pCommandBufferDeviceMasks = (uint32_t*)alloc->dupArray(
+            from->pCommandBufferDeviceMasks, from->commandBufferCount * sizeof(const uint32_t));
     }
     to->pSignalSemaphoreDeviceIndices = nullptr;
-    if (from->pSignalSemaphoreDeviceIndices)
-    {
-        to->pSignalSemaphoreDeviceIndices = (uint32_t*)alloc->dupArray(from->pSignalSemaphoreDeviceIndices, from->signalSemaphoreCount * sizeof(const uint32_t));
+    if (from->pSignalSemaphoreDeviceIndices) {
+        to->pSignalSemaphoreDeviceIndices =
+            (uint32_t*)alloc->dupArray(from->pSignalSemaphoreDeviceIndices,
+                                       from->signalSemaphoreCount * sizeof(const uint32_t));
     }
 }
 
-void deepcopy_VkDeviceGroupBindSparseInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDeviceGroupBindSparseInfo* from,
-    VkDeviceGroupBindSparseInfo* to)
-{
+void deepcopy_VkDeviceGroupBindSparseInfo(Allocator* alloc, VkStructureType rootType,
+                                          const VkDeviceGroupBindSparseInfo* from,
+                                          VkDeviceGroupBindSparseInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkBindBufferMemoryDeviceGroupInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBindBufferMemoryDeviceGroupInfo* from,
-    VkBindBufferMemoryDeviceGroupInfo* to)
-{
+void deepcopy_VkBindBufferMemoryDeviceGroupInfo(Allocator* alloc, VkStructureType rootType,
+                                                const VkBindBufferMemoryDeviceGroupInfo* from,
+                                                VkBindBufferMemoryDeviceGroupInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pDeviceIndices = nullptr;
-    if (from->pDeviceIndices)
-    {
-        to->pDeviceIndices = (uint32_t*)alloc->dupArray(from->pDeviceIndices, from->deviceIndexCount * sizeof(const uint32_t));
+    if (from->pDeviceIndices) {
+        to->pDeviceIndices = (uint32_t*)alloc->dupArray(
+            from->pDeviceIndices, from->deviceIndexCount * sizeof(const uint32_t));
     }
 }
 
-void deepcopy_VkBindImageMemoryDeviceGroupInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBindImageMemoryDeviceGroupInfo* from,
-    VkBindImageMemoryDeviceGroupInfo* to)
-{
+void deepcopy_VkBindImageMemoryDeviceGroupInfo(Allocator* alloc, VkStructureType rootType,
+                                               const VkBindImageMemoryDeviceGroupInfo* from,
+                                               VkBindImageMemoryDeviceGroupInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pDeviceIndices = nullptr;
-    if (from->pDeviceIndices)
-    {
-        to->pDeviceIndices = (uint32_t*)alloc->dupArray(from->pDeviceIndices, from->deviceIndexCount * sizeof(const uint32_t));
+    if (from->pDeviceIndices) {
+        to->pDeviceIndices = (uint32_t*)alloc->dupArray(
+            from->pDeviceIndices, from->deviceIndexCount * sizeof(const uint32_t));
     }
-    if (from)
-    {
+    if (from) {
         to->pSplitInstanceBindRegions = nullptr;
-        if (from->pSplitInstanceBindRegions)
-        {
-            to->pSplitInstanceBindRegions = (VkRect2D*)alloc->alloc(from->splitInstanceBindRegionCount * sizeof(const VkRect2D));
+        if (from->pSplitInstanceBindRegions) {
+            to->pSplitInstanceBindRegions = (VkRect2D*)alloc->alloc(
+                from->splitInstanceBindRegionCount * sizeof(const VkRect2D));
             to->splitInstanceBindRegionCount = from->splitInstanceBindRegionCount;
-            for (uint32_t i = 0; i < (uint32_t)from->splitInstanceBindRegionCount; ++i)
-            {
-                deepcopy_VkRect2D(alloc, rootType, from->pSplitInstanceBindRegions + i, (VkRect2D*)(to->pSplitInstanceBindRegions + i));
+            for (uint32_t i = 0; i < (uint32_t)from->splitInstanceBindRegionCount; ++i) {
+                deepcopy_VkRect2D(alloc, rootType, from->pSplitInstanceBindRegions + i,
+                                  (VkRect2D*)(to->pSplitInstanceBindRegions + i));
             }
         }
     }
 }
 
-void deepcopy_VkPhysicalDeviceGroupProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceGroupProperties* from,
-    VkPhysicalDeviceGroupProperties* to)
-{
+void deepcopy_VkPhysicalDeviceGroupProperties(Allocator* alloc, VkStructureType rootType,
+                                              const VkPhysicalDeviceGroupProperties* from,
+                                              VkPhysicalDeviceGroupProperties* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    memcpy(to->physicalDevices, from->physicalDevices, VK_MAX_DEVICE_GROUP_SIZE * sizeof(VkPhysicalDevice));
+    memcpy(to->physicalDevices, from->physicalDevices,
+           VK_MAX_DEVICE_GROUP_SIZE * sizeof(VkPhysicalDevice));
 }
 
-void deepcopy_VkDeviceGroupDeviceCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDeviceGroupDeviceCreateInfo* from,
-    VkDeviceGroupDeviceCreateInfo* to)
-{
+void deepcopy_VkDeviceGroupDeviceCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                            const VkDeviceGroupDeviceCreateInfo* from,
+                                            VkDeviceGroupDeviceCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pPhysicalDevices = nullptr;
-    if (from->pPhysicalDevices)
-    {
-        to->pPhysicalDevices = (VkPhysicalDevice*)alloc->dupArray(from->pPhysicalDevices, from->physicalDeviceCount * sizeof(const VkPhysicalDevice));
+    if (from->pPhysicalDevices) {
+        to->pPhysicalDevices = (VkPhysicalDevice*)alloc->dupArray(
+            from->pPhysicalDevices, from->physicalDeviceCount * sizeof(const VkPhysicalDevice));
     }
 }
 
-void deepcopy_VkBufferMemoryRequirementsInfo2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBufferMemoryRequirementsInfo2* from,
-    VkBufferMemoryRequirementsInfo2* to)
-{
+void deepcopy_VkBufferMemoryRequirementsInfo2(Allocator* alloc, VkStructureType rootType,
+                                              const VkBufferMemoryRequirementsInfo2* from,
+                                              VkBufferMemoryRequirementsInfo2* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkImageMemoryRequirementsInfo2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageMemoryRequirementsInfo2* from,
-    VkImageMemoryRequirementsInfo2* to)
-{
+void deepcopy_VkImageMemoryRequirementsInfo2(Allocator* alloc, VkStructureType rootType,
+                                             const VkImageMemoryRequirementsInfo2* from,
+                                             VkImageMemoryRequirementsInfo2* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkImageSparseMemoryRequirementsInfo2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageSparseMemoryRequirementsInfo2* from,
-    VkImageSparseMemoryRequirementsInfo2* to)
-{
+void deepcopy_VkImageSparseMemoryRequirementsInfo2(Allocator* alloc, VkStructureType rootType,
+                                                   const VkImageSparseMemoryRequirementsInfo2* from,
+                                                   VkImageSparseMemoryRequirementsInfo2* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkMemoryRequirements2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryRequirements2* from,
-    VkMemoryRequirements2* to)
-{
+void deepcopy_VkMemoryRequirements2(Allocator* alloc, VkStructureType rootType,
+                                    const VkMemoryRequirements2* from, VkMemoryRequirements2* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkMemoryRequirements(alloc, rootType, &from->memoryRequirements, (VkMemoryRequirements*)(&to->memoryRequirements));
+    deepcopy_VkMemoryRequirements(alloc, rootType, &from->memoryRequirements,
+                                  (VkMemoryRequirements*)(&to->memoryRequirements));
 }
 
-void deepcopy_VkSparseImageMemoryRequirements2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSparseImageMemoryRequirements2* from,
-    VkSparseImageMemoryRequirements2* to)
-{
+void deepcopy_VkSparseImageMemoryRequirements2(Allocator* alloc, VkStructureType rootType,
+                                               const VkSparseImageMemoryRequirements2* from,
+                                               VkSparseImageMemoryRequirements2* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkSparseImageMemoryRequirements(alloc, rootType, &from->memoryRequirements, (VkSparseImageMemoryRequirements*)(&to->memoryRequirements));
+    deepcopy_VkSparseImageMemoryRequirements(
+        alloc, rootType, &from->memoryRequirements,
+        (VkSparseImageMemoryRequirements*)(&to->memoryRequirements));
 }
 
-void deepcopy_VkPhysicalDeviceFeatures2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceFeatures2* from,
-    VkPhysicalDeviceFeatures2* to)
-{
+void deepcopy_VkPhysicalDeviceFeatures2(Allocator* alloc, VkStructureType rootType,
+                                        const VkPhysicalDeviceFeatures2* from,
+                                        VkPhysicalDeviceFeatures2* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkPhysicalDeviceFeatures(alloc, rootType, &from->features, (VkPhysicalDeviceFeatures*)(&to->features));
+    deepcopy_VkPhysicalDeviceFeatures(alloc, rootType, &from->features,
+                                      (VkPhysicalDeviceFeatures*)(&to->features));
 }
 
-void deepcopy_VkPhysicalDeviceProperties2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceProperties2* from,
-    VkPhysicalDeviceProperties2* to)
-{
+void deepcopy_VkPhysicalDeviceProperties2(Allocator* alloc, VkStructureType rootType,
+                                          const VkPhysicalDeviceProperties2* from,
+                                          VkPhysicalDeviceProperties2* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkPhysicalDeviceProperties(alloc, rootType, &from->properties, (VkPhysicalDeviceProperties*)(&to->properties));
+    deepcopy_VkPhysicalDeviceProperties(alloc, rootType, &from->properties,
+                                        (VkPhysicalDeviceProperties*)(&to->properties));
 }
 
-void deepcopy_VkFormatProperties2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkFormatProperties2* from,
-    VkFormatProperties2* to)
-{
+void deepcopy_VkFormatProperties2(Allocator* alloc, VkStructureType rootType,
+                                  const VkFormatProperties2* from, VkFormatProperties2* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkFormatProperties(alloc, rootType, &from->formatProperties, (VkFormatProperties*)(&to->formatProperties));
+    deepcopy_VkFormatProperties(alloc, rootType, &from->formatProperties,
+                                (VkFormatProperties*)(&to->formatProperties));
 }
 
-void deepcopy_VkImageFormatProperties2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageFormatProperties2* from,
-    VkImageFormatProperties2* to)
-{
+void deepcopy_VkImageFormatProperties2(Allocator* alloc, VkStructureType rootType,
+                                       const VkImageFormatProperties2* from,
+                                       VkImageFormatProperties2* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkImageFormatProperties(alloc, rootType, &from->imageFormatProperties, (VkImageFormatProperties*)(&to->imageFormatProperties));
+    deepcopy_VkImageFormatProperties(alloc, rootType, &from->imageFormatProperties,
+                                     (VkImageFormatProperties*)(&to->imageFormatProperties));
 }
 
-void deepcopy_VkPhysicalDeviceImageFormatInfo2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceImageFormatInfo2* from,
-    VkPhysicalDeviceImageFormatInfo2* to)
-{
+void deepcopy_VkPhysicalDeviceImageFormatInfo2(Allocator* alloc, VkStructureType rootType,
+                                               const VkPhysicalDeviceImageFormatInfo2* from,
+                                               VkPhysicalDeviceImageFormatInfo2* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkQueueFamilyProperties2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkQueueFamilyProperties2* from,
-    VkQueueFamilyProperties2* to)
-{
+void deepcopy_VkQueueFamilyProperties2(Allocator* alloc, VkStructureType rootType,
+                                       const VkQueueFamilyProperties2* from,
+                                       VkQueueFamilyProperties2* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkQueueFamilyProperties(alloc, rootType, &from->queueFamilyProperties, (VkQueueFamilyProperties*)(&to->queueFamilyProperties));
+    deepcopy_VkQueueFamilyProperties(alloc, rootType, &from->queueFamilyProperties,
+                                     (VkQueueFamilyProperties*)(&to->queueFamilyProperties));
 }
 
-void deepcopy_VkPhysicalDeviceMemoryProperties2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceMemoryProperties2* from,
-    VkPhysicalDeviceMemoryProperties2* to)
-{
+void deepcopy_VkPhysicalDeviceMemoryProperties2(Allocator* alloc, VkStructureType rootType,
+                                                const VkPhysicalDeviceMemoryProperties2* from,
+                                                VkPhysicalDeviceMemoryProperties2* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkPhysicalDeviceMemoryProperties(alloc, rootType, &from->memoryProperties, (VkPhysicalDeviceMemoryProperties*)(&to->memoryProperties));
+    deepcopy_VkPhysicalDeviceMemoryProperties(
+        alloc, rootType, &from->memoryProperties,
+        (VkPhysicalDeviceMemoryProperties*)(&to->memoryProperties));
 }
 
-void deepcopy_VkSparseImageFormatProperties2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSparseImageFormatProperties2* from,
-    VkSparseImageFormatProperties2* to)
-{
+void deepcopy_VkSparseImageFormatProperties2(Allocator* alloc, VkStructureType rootType,
+                                             const VkSparseImageFormatProperties2* from,
+                                             VkSparseImageFormatProperties2* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkSparseImageFormatProperties(alloc, rootType, &from->properties, (VkSparseImageFormatProperties*)(&to->properties));
+    deepcopy_VkSparseImageFormatProperties(alloc, rootType, &from->properties,
+                                           (VkSparseImageFormatProperties*)(&to->properties));
 }
 
 void deepcopy_VkPhysicalDeviceSparseImageFormatInfo2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceSparseImageFormatInfo2* from,
-    VkPhysicalDeviceSparseImageFormatInfo2* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDeviceSparseImageFormatInfo2* from,
+    VkPhysicalDeviceSparseImageFormatInfo2* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDevicePointClippingProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDevicePointClippingProperties* from,
-    VkPhysicalDevicePointClippingProperties* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDevicePointClippingProperties* from,
+    VkPhysicalDevicePointClippingProperties* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkInputAttachmentAspectReference(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkInputAttachmentAspectReference* from,
-    VkInputAttachmentAspectReference* to)
-{
+void deepcopy_VkInputAttachmentAspectReference(Allocator* alloc, VkStructureType rootType,
+                                               const VkInputAttachmentAspectReference* from,
+                                               VkInputAttachmentAspectReference* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkRenderPassInputAttachmentAspectCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkRenderPassInputAttachmentAspectCreateInfo* from,
-    VkRenderPassInputAttachmentAspectCreateInfo* to)
-{
+    VkRenderPassInputAttachmentAspectCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pAspectReferences = nullptr;
-        if (from->pAspectReferences)
-        {
-            to->pAspectReferences = (VkInputAttachmentAspectReference*)alloc->alloc(from->aspectReferenceCount * sizeof(const VkInputAttachmentAspectReference));
+        if (from->pAspectReferences) {
+            to->pAspectReferences = (VkInputAttachmentAspectReference*)alloc->alloc(
+                from->aspectReferenceCount * sizeof(const VkInputAttachmentAspectReference));
             to->aspectReferenceCount = from->aspectReferenceCount;
-            for (uint32_t i = 0; i < (uint32_t)from->aspectReferenceCount; ++i)
-            {
-                deepcopy_VkInputAttachmentAspectReference(alloc, rootType, from->pAspectReferences + i, (VkInputAttachmentAspectReference*)(to->pAspectReferences + i));
+            for (uint32_t i = 0; i < (uint32_t)from->aspectReferenceCount; ++i) {
+                deepcopy_VkInputAttachmentAspectReference(
+                    alloc, rootType, from->pAspectReferences + i,
+                    (VkInputAttachmentAspectReference*)(to->pAspectReferences + i));
             }
         }
     }
 }
 
-void deepcopy_VkImageViewUsageCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageViewUsageCreateInfo* from,
-    VkImageViewUsageCreateInfo* to)
-{
+void deepcopy_VkImageViewUsageCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                         const VkImageViewUsageCreateInfo* from,
+                                         VkImageViewUsageCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPipelineTessellationDomainOriginStateCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineTessellationDomainOriginStateCreateInfo* from,
-    VkPipelineTessellationDomainOriginStateCreateInfo* to)
-{
+    VkPipelineTessellationDomainOriginStateCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkRenderPassMultiviewCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkRenderPassMultiviewCreateInfo* from,
-    VkRenderPassMultiviewCreateInfo* to)
-{
+void deepcopy_VkRenderPassMultiviewCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                              const VkRenderPassMultiviewCreateInfo* from,
+                                              VkRenderPassMultiviewCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pViewMasks = nullptr;
-    if (from->pViewMasks)
-    {
-        to->pViewMasks = (uint32_t*)alloc->dupArray(from->pViewMasks, from->subpassCount * sizeof(const uint32_t));
+    if (from->pViewMasks) {
+        to->pViewMasks = (uint32_t*)alloc->dupArray(from->pViewMasks,
+                                                    from->subpassCount * sizeof(const uint32_t));
     }
     to->pViewOffsets = nullptr;
-    if (from->pViewOffsets)
-    {
-        to->pViewOffsets = (int32_t*)alloc->dupArray(from->pViewOffsets, from->dependencyCount * sizeof(const int32_t));
+    if (from->pViewOffsets) {
+        to->pViewOffsets = (int32_t*)alloc->dupArray(from->pViewOffsets,
+                                                     from->dependencyCount * sizeof(const int32_t));
     }
     to->pCorrelationMasks = nullptr;
-    if (from->pCorrelationMasks)
-    {
-        to->pCorrelationMasks = (uint32_t*)alloc->dupArray(from->pCorrelationMasks, from->correlationMaskCount * sizeof(const uint32_t));
+    if (from->pCorrelationMasks) {
+        to->pCorrelationMasks = (uint32_t*)alloc->dupArray(
+            from->pCorrelationMasks, from->correlationMaskCount * sizeof(const uint32_t));
     }
 }
 
-void deepcopy_VkPhysicalDeviceMultiviewFeatures(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceMultiviewFeatures* from,
-    VkPhysicalDeviceMultiviewFeatures* to)
-{
+void deepcopy_VkPhysicalDeviceMultiviewFeatures(Allocator* alloc, VkStructureType rootType,
+                                                const VkPhysicalDeviceMultiviewFeatures* from,
+                                                VkPhysicalDeviceMultiviewFeatures* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkPhysicalDeviceMultiviewProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceMultiviewProperties* from,
-    VkPhysicalDeviceMultiviewProperties* to)
-{
+void deepcopy_VkPhysicalDeviceMultiviewProperties(Allocator* alloc, VkStructureType rootType,
+                                                  const VkPhysicalDeviceMultiviewProperties* from,
+                                                  VkPhysicalDeviceMultiviewProperties* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceVariablePointersFeatures(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceVariablePointersFeatures* from,
-    VkPhysicalDeviceVariablePointersFeatures* to)
-{
+    VkPhysicalDeviceVariablePointersFeatures* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceProtectedMemoryFeatures(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceProtectedMemoryFeatures* from,
-    VkPhysicalDeviceProtectedMemoryFeatures* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDeviceProtectedMemoryFeatures* from,
+    VkPhysicalDeviceProtectedMemoryFeatures* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceProtectedMemoryProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceProtectedMemoryProperties* from,
-    VkPhysicalDeviceProtectedMemoryProperties* to)
-{
+    VkPhysicalDeviceProtectedMemoryProperties* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkDeviceQueueInfo2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDeviceQueueInfo2* from,
-    VkDeviceQueueInfo2* to)
-{
+void deepcopy_VkDeviceQueueInfo2(Allocator* alloc, VkStructureType rootType,
+                                 const VkDeviceQueueInfo2* from, VkDeviceQueueInfo2* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkProtectedSubmitInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkProtectedSubmitInfo* from,
-    VkProtectedSubmitInfo* to)
-{
+void deepcopy_VkProtectedSubmitInfo(Allocator* alloc, VkStructureType rootType,
+                                    const VkProtectedSubmitInfo* from, VkProtectedSubmitInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkSamplerYcbcrConversionCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSamplerYcbcrConversionCreateInfo* from,
-    VkSamplerYcbcrConversionCreateInfo* to)
-{
+void deepcopy_VkSamplerYcbcrConversionCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                                 const VkSamplerYcbcrConversionCreateInfo* from,
+                                                 VkSamplerYcbcrConversionCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkComponentMapping(alloc, rootType, &from->components, (VkComponentMapping*)(&to->components));
+    deepcopy_VkComponentMapping(alloc, rootType, &from->components,
+                                (VkComponentMapping*)(&to->components));
 }
 
-void deepcopy_VkSamplerYcbcrConversionInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSamplerYcbcrConversionInfo* from,
-    VkSamplerYcbcrConversionInfo* to)
-{
+void deepcopy_VkSamplerYcbcrConversionInfo(Allocator* alloc, VkStructureType rootType,
+                                           const VkSamplerYcbcrConversionInfo* from,
+                                           VkSamplerYcbcrConversionInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkBindImagePlaneMemoryInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBindImagePlaneMemoryInfo* from,
-    VkBindImagePlaneMemoryInfo* to)
-{
+void deepcopy_VkBindImagePlaneMemoryInfo(Allocator* alloc, VkStructureType rootType,
+                                         const VkBindImagePlaneMemoryInfo* from,
+                                         VkBindImagePlaneMemoryInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkImagePlaneMemoryRequirementsInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImagePlaneMemoryRequirementsInfo* from,
-    VkImagePlaneMemoryRequirementsInfo* to)
-{
+void deepcopy_VkImagePlaneMemoryRequirementsInfo(Allocator* alloc, VkStructureType rootType,
+                                                 const VkImagePlaneMemoryRequirementsInfo* from,
+                                                 VkImagePlaneMemoryRequirementsInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceSamplerYcbcrConversionFeatures* from,
-    VkPhysicalDeviceSamplerYcbcrConversionFeatures* to)
-{
+    VkPhysicalDeviceSamplerYcbcrConversionFeatures* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkSamplerYcbcrConversionImageFormatProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkSamplerYcbcrConversionImageFormatProperties* from,
-    VkSamplerYcbcrConversionImageFormatProperties* to)
-{
+    VkSamplerYcbcrConversionImageFormatProperties* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkDescriptorUpdateTemplateEntry(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDescriptorUpdateTemplateEntry* from,
-    VkDescriptorUpdateTemplateEntry* to)
-{
+void deepcopy_VkDescriptorUpdateTemplateEntry(Allocator* alloc, VkStructureType rootType,
+                                              const VkDescriptorUpdateTemplateEntry* from,
+                                              VkDescriptorUpdateTemplateEntry* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkDescriptorUpdateTemplateCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDescriptorUpdateTemplateCreateInfo* from,
-    VkDescriptorUpdateTemplateCreateInfo* to)
-{
+void deepcopy_VkDescriptorUpdateTemplateCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                                   const VkDescriptorUpdateTemplateCreateInfo* from,
+                                                   VkDescriptorUpdateTemplateCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pDescriptorUpdateEntries = nullptr;
-        if (from->pDescriptorUpdateEntries)
-        {
-            to->pDescriptorUpdateEntries = (VkDescriptorUpdateTemplateEntry*)alloc->alloc(from->descriptorUpdateEntryCount * sizeof(const VkDescriptorUpdateTemplateEntry));
+        if (from->pDescriptorUpdateEntries) {
+            to->pDescriptorUpdateEntries = (VkDescriptorUpdateTemplateEntry*)alloc->alloc(
+                from->descriptorUpdateEntryCount * sizeof(const VkDescriptorUpdateTemplateEntry));
             to->descriptorUpdateEntryCount = from->descriptorUpdateEntryCount;
-            for (uint32_t i = 0; i < (uint32_t)from->descriptorUpdateEntryCount; ++i)
-            {
-                deepcopy_VkDescriptorUpdateTemplateEntry(alloc, rootType, from->pDescriptorUpdateEntries + i, (VkDescriptorUpdateTemplateEntry*)(to->pDescriptorUpdateEntries + i));
+            for (uint32_t i = 0; i < (uint32_t)from->descriptorUpdateEntryCount; ++i) {
+                deepcopy_VkDescriptorUpdateTemplateEntry(
+                    alloc, rootType, from->pDescriptorUpdateEntries + i,
+                    (VkDescriptorUpdateTemplateEntry*)(to->pDescriptorUpdateEntries + i));
             }
         }
     }
 }
 
-void deepcopy_VkExternalMemoryProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExternalMemoryProperties* from,
-    VkExternalMemoryProperties* to)
-{
+void deepcopy_VkExternalMemoryProperties(Allocator* alloc, VkStructureType rootType,
+                                         const VkExternalMemoryProperties* from,
+                                         VkExternalMemoryProperties* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkPhysicalDeviceExternalImageFormatInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceExternalImageFormatInfo* from,
-    VkPhysicalDeviceExternalImageFormatInfo* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDeviceExternalImageFormatInfo* from,
+    VkPhysicalDeviceExternalImageFormatInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkExternalImageFormatProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExternalImageFormatProperties* from,
-    VkExternalImageFormatProperties* to)
-{
+void deepcopy_VkExternalImageFormatProperties(Allocator* alloc, VkStructureType rootType,
+                                              const VkExternalImageFormatProperties* from,
+                                              VkExternalImageFormatProperties* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkExternalMemoryProperties(alloc, rootType, &from->externalMemoryProperties, (VkExternalMemoryProperties*)(&to->externalMemoryProperties));
+    deepcopy_VkExternalMemoryProperties(
+        alloc, rootType, &from->externalMemoryProperties,
+        (VkExternalMemoryProperties*)(&to->externalMemoryProperties));
 }
 
-void deepcopy_VkPhysicalDeviceExternalBufferInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceExternalBufferInfo* from,
-    VkPhysicalDeviceExternalBufferInfo* to)
-{
+void deepcopy_VkPhysicalDeviceExternalBufferInfo(Allocator* alloc, VkStructureType rootType,
+                                                 const VkPhysicalDeviceExternalBufferInfo* from,
+                                                 VkPhysicalDeviceExternalBufferInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkExternalBufferProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExternalBufferProperties* from,
-    VkExternalBufferProperties* to)
-{
+void deepcopy_VkExternalBufferProperties(Allocator* alloc, VkStructureType rootType,
+                                         const VkExternalBufferProperties* from,
+                                         VkExternalBufferProperties* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkExternalMemoryProperties(alloc, rootType, &from->externalMemoryProperties, (VkExternalMemoryProperties*)(&to->externalMemoryProperties));
+    deepcopy_VkExternalMemoryProperties(
+        alloc, rootType, &from->externalMemoryProperties,
+        (VkExternalMemoryProperties*)(&to->externalMemoryProperties));
 }
 
-void deepcopy_VkPhysicalDeviceIDProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceIDProperties* from,
-    VkPhysicalDeviceIDProperties* to)
-{
+void deepcopy_VkPhysicalDeviceIDProperties(Allocator* alloc, VkStructureType rootType,
+                                           const VkPhysicalDeviceIDProperties* from,
+                                           VkPhysicalDeviceIDProperties* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -4349,337 +3528,266 @@
     memcpy(to->deviceLUID, from->deviceLUID, VK_LUID_SIZE * sizeof(uint8_t));
 }
 
-void deepcopy_VkExternalMemoryImageCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExternalMemoryImageCreateInfo* from,
-    VkExternalMemoryImageCreateInfo* to)
-{
+void deepcopy_VkExternalMemoryImageCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                              const VkExternalMemoryImageCreateInfo* from,
+                                              VkExternalMemoryImageCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkExternalMemoryBufferCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExternalMemoryBufferCreateInfo* from,
-    VkExternalMemoryBufferCreateInfo* to)
-{
+void deepcopy_VkExternalMemoryBufferCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                               const VkExternalMemoryBufferCreateInfo* from,
+                                               VkExternalMemoryBufferCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkExportMemoryAllocateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExportMemoryAllocateInfo* from,
-    VkExportMemoryAllocateInfo* to)
-{
+void deepcopy_VkExportMemoryAllocateInfo(Allocator* alloc, VkStructureType rootType,
+                                         const VkExportMemoryAllocateInfo* from,
+                                         VkExportMemoryAllocateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkPhysicalDeviceExternalFenceInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceExternalFenceInfo* from,
-    VkPhysicalDeviceExternalFenceInfo* to)
-{
+void deepcopy_VkPhysicalDeviceExternalFenceInfo(Allocator* alloc, VkStructureType rootType,
+                                                const VkPhysicalDeviceExternalFenceInfo* from,
+                                                VkPhysicalDeviceExternalFenceInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkExternalFenceProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExternalFenceProperties* from,
-    VkExternalFenceProperties* to)
-{
+void deepcopy_VkExternalFenceProperties(Allocator* alloc, VkStructureType rootType,
+                                        const VkExternalFenceProperties* from,
+                                        VkExternalFenceProperties* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkExportFenceCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExportFenceCreateInfo* from,
-    VkExportFenceCreateInfo* to)
-{
+void deepcopy_VkExportFenceCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                      const VkExportFenceCreateInfo* from,
+                                      VkExportFenceCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkExportSemaphoreCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExportSemaphoreCreateInfo* from,
-    VkExportSemaphoreCreateInfo* to)
-{
+void deepcopy_VkExportSemaphoreCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                          const VkExportSemaphoreCreateInfo* from,
+                                          VkExportSemaphoreCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceExternalSemaphoreInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceExternalSemaphoreInfo* from,
-    VkPhysicalDeviceExternalSemaphoreInfo* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDeviceExternalSemaphoreInfo* from,
+    VkPhysicalDeviceExternalSemaphoreInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkExternalSemaphoreProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExternalSemaphoreProperties* from,
-    VkExternalSemaphoreProperties* to)
-{
+void deepcopy_VkExternalSemaphoreProperties(Allocator* alloc, VkStructureType rootType,
+                                            const VkExternalSemaphoreProperties* from,
+                                            VkExternalSemaphoreProperties* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceMaintenance3Properties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceMaintenance3Properties* from,
-    VkPhysicalDeviceMaintenance3Properties* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDeviceMaintenance3Properties* from,
+    VkPhysicalDeviceMaintenance3Properties* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkDescriptorSetLayoutSupport(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDescriptorSetLayoutSupport* from,
-    VkDescriptorSetLayoutSupport* to)
-{
+void deepcopy_VkDescriptorSetLayoutSupport(Allocator* alloc, VkStructureType rootType,
+                                           const VkDescriptorSetLayoutSupport* from,
+                                           VkDescriptorSetLayoutSupport* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceShaderDrawParametersFeatures(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShaderDrawParametersFeatures* from,
-    VkPhysicalDeviceShaderDrawParametersFeatures* to)
-{
+    VkPhysicalDeviceShaderDrawParametersFeatures* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -4687,57 +3795,45 @@
 
 #endif
 #ifdef VK_VERSION_1_2
-void deepcopy_VkPhysicalDeviceVulkan11Features(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceVulkan11Features* from,
-    VkPhysicalDeviceVulkan11Features* to)
-{
+void deepcopy_VkPhysicalDeviceVulkan11Features(Allocator* alloc, VkStructureType rootType,
+                                               const VkPhysicalDeviceVulkan11Features* from,
+                                               VkPhysicalDeviceVulkan11Features* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkPhysicalDeviceVulkan11Properties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceVulkan11Properties* from,
-    VkPhysicalDeviceVulkan11Properties* to)
-{
+void deepcopy_VkPhysicalDeviceVulkan11Properties(Allocator* alloc, VkStructureType rootType,
+                                                 const VkPhysicalDeviceVulkan11Properties* from,
+                                                 VkPhysicalDeviceVulkan11Properties* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -4746,1520 +3842,1244 @@
     memcpy(to->deviceLUID, from->deviceLUID, VK_LUID_SIZE * sizeof(uint8_t));
 }
 
-void deepcopy_VkPhysicalDeviceVulkan12Features(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceVulkan12Features* from,
-    VkPhysicalDeviceVulkan12Features* to)
-{
+void deepcopy_VkPhysicalDeviceVulkan12Features(Allocator* alloc, VkStructureType rootType,
+                                               const VkPhysicalDeviceVulkan12Features* from,
+                                               VkPhysicalDeviceVulkan12Features* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkConformanceVersion(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkConformanceVersion* from,
-    VkConformanceVersion* to)
-{
+void deepcopy_VkConformanceVersion(Allocator* alloc, VkStructureType rootType,
+                                   const VkConformanceVersion* from, VkConformanceVersion* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkPhysicalDeviceVulkan12Properties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceVulkan12Properties* from,
-    VkPhysicalDeviceVulkan12Properties* to)
-{
+void deepcopy_VkPhysicalDeviceVulkan12Properties(Allocator* alloc, VkStructureType rootType,
+                                                 const VkPhysicalDeviceVulkan12Properties* from,
+                                                 VkPhysicalDeviceVulkan12Properties* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     memcpy(to->driverName, from->driverName, VK_MAX_DRIVER_NAME_SIZE * sizeof(char));
     memcpy(to->driverInfo, from->driverInfo, VK_MAX_DRIVER_INFO_SIZE * sizeof(char));
-    deepcopy_VkConformanceVersion(alloc, rootType, &from->conformanceVersion, (VkConformanceVersion*)(&to->conformanceVersion));
+    deepcopy_VkConformanceVersion(alloc, rootType, &from->conformanceVersion,
+                                  (VkConformanceVersion*)(&to->conformanceVersion));
 }
 
-void deepcopy_VkImageFormatListCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageFormatListCreateInfo* from,
-    VkImageFormatListCreateInfo* to)
-{
+void deepcopy_VkImageFormatListCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                          const VkImageFormatListCreateInfo* from,
+                                          VkImageFormatListCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pViewFormats = nullptr;
-    if (from->pViewFormats)
-    {
-        to->pViewFormats = (VkFormat*)alloc->dupArray(from->pViewFormats, from->viewFormatCount * sizeof(const VkFormat));
+    if (from->pViewFormats) {
+        to->pViewFormats = (VkFormat*)alloc->dupArray(
+            from->pViewFormats, from->viewFormatCount * sizeof(const VkFormat));
     }
 }
 
-void deepcopy_VkAttachmentDescription2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAttachmentDescription2* from,
-    VkAttachmentDescription2* to)
-{
+void deepcopy_VkAttachmentDescription2(Allocator* alloc, VkStructureType rootType,
+                                       const VkAttachmentDescription2* from,
+                                       VkAttachmentDescription2* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkAttachmentReference2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAttachmentReference2* from,
-    VkAttachmentReference2* to)
-{
+void deepcopy_VkAttachmentReference2(Allocator* alloc, VkStructureType rootType,
+                                     const VkAttachmentReference2* from,
+                                     VkAttachmentReference2* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkSubpassDescription2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSubpassDescription2* from,
-    VkSubpassDescription2* to)
-{
+void deepcopy_VkSubpassDescription2(Allocator* alloc, VkStructureType rootType,
+                                    const VkSubpassDescription2* from, VkSubpassDescription2* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pInputAttachments = nullptr;
-        if (from->pInputAttachments)
-        {
-            to->pInputAttachments = (VkAttachmentReference2*)alloc->alloc(from->inputAttachmentCount * sizeof(const VkAttachmentReference2));
+        if (from->pInputAttachments) {
+            to->pInputAttachments = (VkAttachmentReference2*)alloc->alloc(
+                from->inputAttachmentCount * sizeof(const VkAttachmentReference2));
             to->inputAttachmentCount = from->inputAttachmentCount;
-            for (uint32_t i = 0; i < (uint32_t)from->inputAttachmentCount; ++i)
-            {
-                deepcopy_VkAttachmentReference2(alloc, rootType, from->pInputAttachments + i, (VkAttachmentReference2*)(to->pInputAttachments + i));
+            for (uint32_t i = 0; i < (uint32_t)from->inputAttachmentCount; ++i) {
+                deepcopy_VkAttachmentReference2(
+                    alloc, rootType, from->pInputAttachments + i,
+                    (VkAttachmentReference2*)(to->pInputAttachments + i));
             }
         }
     }
-    if (from)
-    {
+    if (from) {
         to->pColorAttachments = nullptr;
-        if (from->pColorAttachments)
-        {
-            to->pColorAttachments = (VkAttachmentReference2*)alloc->alloc(from->colorAttachmentCount * sizeof(const VkAttachmentReference2));
+        if (from->pColorAttachments) {
+            to->pColorAttachments = (VkAttachmentReference2*)alloc->alloc(
+                from->colorAttachmentCount * sizeof(const VkAttachmentReference2));
             to->colorAttachmentCount = from->colorAttachmentCount;
-            for (uint32_t i = 0; i < (uint32_t)from->colorAttachmentCount; ++i)
-            {
-                deepcopy_VkAttachmentReference2(alloc, rootType, from->pColorAttachments + i, (VkAttachmentReference2*)(to->pColorAttachments + i));
+            for (uint32_t i = 0; i < (uint32_t)from->colorAttachmentCount; ++i) {
+                deepcopy_VkAttachmentReference2(
+                    alloc, rootType, from->pColorAttachments + i,
+                    (VkAttachmentReference2*)(to->pColorAttachments + i));
             }
         }
     }
-    if (from)
-    {
+    if (from) {
         to->pResolveAttachments = nullptr;
-        if (from->pResolveAttachments)
-        {
-            to->pResolveAttachments = (VkAttachmentReference2*)alloc->alloc(from->colorAttachmentCount * sizeof(const VkAttachmentReference2));
+        if (from->pResolveAttachments) {
+            to->pResolveAttachments = (VkAttachmentReference2*)alloc->alloc(
+                from->colorAttachmentCount * sizeof(const VkAttachmentReference2));
             to->colorAttachmentCount = from->colorAttachmentCount;
-            for (uint32_t i = 0; i < (uint32_t)from->colorAttachmentCount; ++i)
-            {
-                deepcopy_VkAttachmentReference2(alloc, rootType, from->pResolveAttachments + i, (VkAttachmentReference2*)(to->pResolveAttachments + i));
+            for (uint32_t i = 0; i < (uint32_t)from->colorAttachmentCount; ++i) {
+                deepcopy_VkAttachmentReference2(
+                    alloc, rootType, from->pResolveAttachments + i,
+                    (VkAttachmentReference2*)(to->pResolveAttachments + i));
             }
         }
     }
     to->pDepthStencilAttachment = nullptr;
-    if (from->pDepthStencilAttachment)
-    {
-        to->pDepthStencilAttachment = (VkAttachmentReference2*)alloc->alloc(sizeof(const VkAttachmentReference2));
-        deepcopy_VkAttachmentReference2(alloc, rootType, from->pDepthStencilAttachment, (VkAttachmentReference2*)(to->pDepthStencilAttachment));
+    if (from->pDepthStencilAttachment) {
+        to->pDepthStencilAttachment =
+            (VkAttachmentReference2*)alloc->alloc(sizeof(const VkAttachmentReference2));
+        deepcopy_VkAttachmentReference2(alloc, rootType, from->pDepthStencilAttachment,
+                                        (VkAttachmentReference2*)(to->pDepthStencilAttachment));
     }
     to->pPreserveAttachments = nullptr;
-    if (from->pPreserveAttachments)
-    {
-        to->pPreserveAttachments = (uint32_t*)alloc->dupArray(from->pPreserveAttachments, from->preserveAttachmentCount * sizeof(const uint32_t));
+    if (from->pPreserveAttachments) {
+        to->pPreserveAttachments = (uint32_t*)alloc->dupArray(
+            from->pPreserveAttachments, from->preserveAttachmentCount * sizeof(const uint32_t));
     }
 }
 
-void deepcopy_VkSubpassDependency2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSubpassDependency2* from,
-    VkSubpassDependency2* to)
-{
+void deepcopy_VkSubpassDependency2(Allocator* alloc, VkStructureType rootType,
+                                   const VkSubpassDependency2* from, VkSubpassDependency2* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkRenderPassCreateInfo2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkRenderPassCreateInfo2* from,
-    VkRenderPassCreateInfo2* to)
-{
+void deepcopy_VkRenderPassCreateInfo2(Allocator* alloc, VkStructureType rootType,
+                                      const VkRenderPassCreateInfo2* from,
+                                      VkRenderPassCreateInfo2* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pAttachments = nullptr;
-        if (from->pAttachments)
-        {
-            to->pAttachments = (VkAttachmentDescription2*)alloc->alloc(from->attachmentCount * sizeof(const VkAttachmentDescription2));
+        if (from->pAttachments) {
+            to->pAttachments = (VkAttachmentDescription2*)alloc->alloc(
+                from->attachmentCount * sizeof(const VkAttachmentDescription2));
             to->attachmentCount = from->attachmentCount;
-            for (uint32_t i = 0; i < (uint32_t)from->attachmentCount; ++i)
-            {
-                deepcopy_VkAttachmentDescription2(alloc, rootType, from->pAttachments + i, (VkAttachmentDescription2*)(to->pAttachments + i));
+            for (uint32_t i = 0; i < (uint32_t)from->attachmentCount; ++i) {
+                deepcopy_VkAttachmentDescription2(
+                    alloc, rootType, from->pAttachments + i,
+                    (VkAttachmentDescription2*)(to->pAttachments + i));
             }
         }
     }
-    if (from)
-    {
+    if (from) {
         to->pSubpasses = nullptr;
-        if (from->pSubpasses)
-        {
-            to->pSubpasses = (VkSubpassDescription2*)alloc->alloc(from->subpassCount * sizeof(const VkSubpassDescription2));
+        if (from->pSubpasses) {
+            to->pSubpasses = (VkSubpassDescription2*)alloc->alloc(
+                from->subpassCount * sizeof(const VkSubpassDescription2));
             to->subpassCount = from->subpassCount;
-            for (uint32_t i = 0; i < (uint32_t)from->subpassCount; ++i)
-            {
-                deepcopy_VkSubpassDescription2(alloc, rootType, from->pSubpasses + i, (VkSubpassDescription2*)(to->pSubpasses + i));
+            for (uint32_t i = 0; i < (uint32_t)from->subpassCount; ++i) {
+                deepcopy_VkSubpassDescription2(alloc, rootType, from->pSubpasses + i,
+                                               (VkSubpassDescription2*)(to->pSubpasses + i));
             }
         }
     }
-    if (from)
-    {
+    if (from) {
         to->pDependencies = nullptr;
-        if (from->pDependencies)
-        {
-            to->pDependencies = (VkSubpassDependency2*)alloc->alloc(from->dependencyCount * sizeof(const VkSubpassDependency2));
+        if (from->pDependencies) {
+            to->pDependencies = (VkSubpassDependency2*)alloc->alloc(
+                from->dependencyCount * sizeof(const VkSubpassDependency2));
             to->dependencyCount = from->dependencyCount;
-            for (uint32_t i = 0; i < (uint32_t)from->dependencyCount; ++i)
-            {
-                deepcopy_VkSubpassDependency2(alloc, rootType, from->pDependencies + i, (VkSubpassDependency2*)(to->pDependencies + i));
+            for (uint32_t i = 0; i < (uint32_t)from->dependencyCount; ++i) {
+                deepcopy_VkSubpassDependency2(alloc, rootType, from->pDependencies + i,
+                                              (VkSubpassDependency2*)(to->pDependencies + i));
             }
         }
     }
     to->pCorrelatedViewMasks = nullptr;
-    if (from->pCorrelatedViewMasks)
-    {
-        to->pCorrelatedViewMasks = (uint32_t*)alloc->dupArray(from->pCorrelatedViewMasks, from->correlatedViewMaskCount * sizeof(const uint32_t));
+    if (from->pCorrelatedViewMasks) {
+        to->pCorrelatedViewMasks = (uint32_t*)alloc->dupArray(
+            from->pCorrelatedViewMasks, from->correlatedViewMaskCount * sizeof(const uint32_t));
     }
 }
 
-void deepcopy_VkSubpassBeginInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSubpassBeginInfo* from,
-    VkSubpassBeginInfo* to)
-{
+void deepcopy_VkSubpassBeginInfo(Allocator* alloc, VkStructureType rootType,
+                                 const VkSubpassBeginInfo* from, VkSubpassBeginInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkSubpassEndInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSubpassEndInfo* from,
-    VkSubpassEndInfo* to)
-{
+void deepcopy_VkSubpassEndInfo(Allocator* alloc, VkStructureType rootType,
+                               const VkSubpassEndInfo* from, VkSubpassEndInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkPhysicalDevice8BitStorageFeatures(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDevice8BitStorageFeatures* from,
-    VkPhysicalDevice8BitStorageFeatures* to)
-{
+void deepcopy_VkPhysicalDevice8BitStorageFeatures(Allocator* alloc, VkStructureType rootType,
+                                                  const VkPhysicalDevice8BitStorageFeatures* from,
+                                                  VkPhysicalDevice8BitStorageFeatures* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkPhysicalDeviceDriverProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceDriverProperties* from,
-    VkPhysicalDeviceDriverProperties* to)
-{
+void deepcopy_VkPhysicalDeviceDriverProperties(Allocator* alloc, VkStructureType rootType,
+                                               const VkPhysicalDeviceDriverProperties* from,
+                                               VkPhysicalDeviceDriverProperties* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     memcpy(to->driverName, from->driverName, VK_MAX_DRIVER_NAME_SIZE * sizeof(char));
     memcpy(to->driverInfo, from->driverInfo, VK_MAX_DRIVER_INFO_SIZE * sizeof(char));
-    deepcopy_VkConformanceVersion(alloc, rootType, &from->conformanceVersion, (VkConformanceVersion*)(&to->conformanceVersion));
+    deepcopy_VkConformanceVersion(alloc, rootType, &from->conformanceVersion,
+                                  (VkConformanceVersion*)(&to->conformanceVersion));
 }
 
 void deepcopy_VkPhysicalDeviceShaderAtomicInt64Features(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShaderAtomicInt64Features* from,
-    VkPhysicalDeviceShaderAtomicInt64Features* to)
-{
+    VkPhysicalDeviceShaderAtomicInt64Features* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceShaderFloat16Int8Features(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShaderFloat16Int8Features* from,
-    VkPhysicalDeviceShaderFloat16Int8Features* to)
-{
+    VkPhysicalDeviceShaderFloat16Int8Features* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceFloatControlsProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceFloatControlsProperties* from,
-    VkPhysicalDeviceFloatControlsProperties* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDeviceFloatControlsProperties* from,
+    VkPhysicalDeviceFloatControlsProperties* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkDescriptorSetLayoutBindingFlagsCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkDescriptorSetLayoutBindingFlagsCreateInfo* from,
-    VkDescriptorSetLayoutBindingFlagsCreateInfo* to)
-{
+    VkDescriptorSetLayoutBindingFlagsCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pBindingFlags = nullptr;
-    if (from->pBindingFlags)
-    {
-        to->pBindingFlags = (VkDescriptorBindingFlags*)alloc->dupArray(from->pBindingFlags, from->bindingCount * sizeof(const VkDescriptorBindingFlags));
+    if (from->pBindingFlags) {
+        to->pBindingFlags = (VkDescriptorBindingFlags*)alloc->dupArray(
+            from->pBindingFlags, from->bindingCount * sizeof(const VkDescriptorBindingFlags));
     }
 }
 
 void deepcopy_VkPhysicalDeviceDescriptorIndexingFeatures(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceDescriptorIndexingFeatures* from,
-    VkPhysicalDeviceDescriptorIndexingFeatures* to)
-{
+    VkPhysicalDeviceDescriptorIndexingFeatures* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceDescriptorIndexingProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceDescriptorIndexingProperties* from,
-    VkPhysicalDeviceDescriptorIndexingProperties* to)
-{
+    VkPhysicalDeviceDescriptorIndexingProperties* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkDescriptorSetVariableDescriptorCountAllocateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkDescriptorSetVariableDescriptorCountAllocateInfo* from,
-    VkDescriptorSetVariableDescriptorCountAllocateInfo* to)
-{
+    VkDescriptorSetVariableDescriptorCountAllocateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pDescriptorCounts = nullptr;
-    if (from->pDescriptorCounts)
-    {
-        to->pDescriptorCounts = (uint32_t*)alloc->dupArray(from->pDescriptorCounts, from->descriptorSetCount * sizeof(const uint32_t));
+    if (from->pDescriptorCounts) {
+        to->pDescriptorCounts = (uint32_t*)alloc->dupArray(
+            from->pDescriptorCounts, from->descriptorSetCount * sizeof(const uint32_t));
     }
 }
 
 void deepcopy_VkDescriptorSetVariableDescriptorCountLayoutSupport(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkDescriptorSetVariableDescriptorCountLayoutSupport* from,
-    VkDescriptorSetVariableDescriptorCountLayoutSupport* to)
-{
+    VkDescriptorSetVariableDescriptorCountLayoutSupport* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkSubpassDescriptionDepthStencilResolve(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSubpassDescriptionDepthStencilResolve* from,
-    VkSubpassDescriptionDepthStencilResolve* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkSubpassDescriptionDepthStencilResolve* from,
+    VkSubpassDescriptionDepthStencilResolve* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pDepthStencilResolveAttachment = nullptr;
-    if (from->pDepthStencilResolveAttachment)
-    {
-        to->pDepthStencilResolveAttachment = (VkAttachmentReference2*)alloc->alloc(sizeof(const VkAttachmentReference2));
-        deepcopy_VkAttachmentReference2(alloc, rootType, from->pDepthStencilResolveAttachment, (VkAttachmentReference2*)(to->pDepthStencilResolveAttachment));
+    if (from->pDepthStencilResolveAttachment) {
+        to->pDepthStencilResolveAttachment =
+            (VkAttachmentReference2*)alloc->alloc(sizeof(const VkAttachmentReference2));
+        deepcopy_VkAttachmentReference2(
+            alloc, rootType, from->pDepthStencilResolveAttachment,
+            (VkAttachmentReference2*)(to->pDepthStencilResolveAttachment));
     }
 }
 
 void deepcopy_VkPhysicalDeviceDepthStencilResolveProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceDepthStencilResolveProperties* from,
-    VkPhysicalDeviceDepthStencilResolveProperties* to)
-{
+    VkPhysicalDeviceDepthStencilResolveProperties* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceScalarBlockLayoutFeatures(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceScalarBlockLayoutFeatures* from,
-    VkPhysicalDeviceScalarBlockLayoutFeatures* to)
-{
+    VkPhysicalDeviceScalarBlockLayoutFeatures* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkImageStencilUsageCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageStencilUsageCreateInfo* from,
-    VkImageStencilUsageCreateInfo* to)
-{
+void deepcopy_VkImageStencilUsageCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                            const VkImageStencilUsageCreateInfo* from,
+                                            VkImageStencilUsageCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkSamplerReductionModeCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSamplerReductionModeCreateInfo* from,
-    VkSamplerReductionModeCreateInfo* to)
-{
+void deepcopy_VkSamplerReductionModeCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                               const VkSamplerReductionModeCreateInfo* from,
+                                               VkSamplerReductionModeCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceSamplerFilterMinmaxProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceSamplerFilterMinmaxProperties* from,
-    VkPhysicalDeviceSamplerFilterMinmaxProperties* to)
-{
+    VkPhysicalDeviceSamplerFilterMinmaxProperties* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceVulkanMemoryModelFeatures(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceVulkanMemoryModelFeatures* from,
-    VkPhysicalDeviceVulkanMemoryModelFeatures* to)
-{
+    VkPhysicalDeviceVulkanMemoryModelFeatures* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceImagelessFramebufferFeatures(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceImagelessFramebufferFeatures* from,
-    VkPhysicalDeviceImagelessFramebufferFeatures* to)
-{
+    VkPhysicalDeviceImagelessFramebufferFeatures* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkFramebufferAttachmentImageInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkFramebufferAttachmentImageInfo* from,
-    VkFramebufferAttachmentImageInfo* to)
-{
+void deepcopy_VkFramebufferAttachmentImageInfo(Allocator* alloc, VkStructureType rootType,
+                                               const VkFramebufferAttachmentImageInfo* from,
+                                               VkFramebufferAttachmentImageInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pViewFormats = nullptr;
-    if (from->pViewFormats)
-    {
-        to->pViewFormats = (VkFormat*)alloc->dupArray(from->pViewFormats, from->viewFormatCount * sizeof(const VkFormat));
+    if (from->pViewFormats) {
+        to->pViewFormats = (VkFormat*)alloc->dupArray(
+            from->pViewFormats, from->viewFormatCount * sizeof(const VkFormat));
     }
 }
 
-void deepcopy_VkFramebufferAttachmentsCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkFramebufferAttachmentsCreateInfo* from,
-    VkFramebufferAttachmentsCreateInfo* to)
-{
+void deepcopy_VkFramebufferAttachmentsCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                                 const VkFramebufferAttachmentsCreateInfo* from,
+                                                 VkFramebufferAttachmentsCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pAttachmentImageInfos = nullptr;
-        if (from->pAttachmentImageInfos)
-        {
-            to->pAttachmentImageInfos = (VkFramebufferAttachmentImageInfo*)alloc->alloc(from->attachmentImageInfoCount * sizeof(const VkFramebufferAttachmentImageInfo));
+        if (from->pAttachmentImageInfos) {
+            to->pAttachmentImageInfos = (VkFramebufferAttachmentImageInfo*)alloc->alloc(
+                from->attachmentImageInfoCount * sizeof(const VkFramebufferAttachmentImageInfo));
             to->attachmentImageInfoCount = from->attachmentImageInfoCount;
-            for (uint32_t i = 0; i < (uint32_t)from->attachmentImageInfoCount; ++i)
-            {
-                deepcopy_VkFramebufferAttachmentImageInfo(alloc, rootType, from->pAttachmentImageInfos + i, (VkFramebufferAttachmentImageInfo*)(to->pAttachmentImageInfos + i));
+            for (uint32_t i = 0; i < (uint32_t)from->attachmentImageInfoCount; ++i) {
+                deepcopy_VkFramebufferAttachmentImageInfo(
+                    alloc, rootType, from->pAttachmentImageInfos + i,
+                    (VkFramebufferAttachmentImageInfo*)(to->pAttachmentImageInfos + i));
             }
         }
     }
 }
 
-void deepcopy_VkRenderPassAttachmentBeginInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkRenderPassAttachmentBeginInfo* from,
-    VkRenderPassAttachmentBeginInfo* to)
-{
+void deepcopy_VkRenderPassAttachmentBeginInfo(Allocator* alloc, VkStructureType rootType,
+                                              const VkRenderPassAttachmentBeginInfo* from,
+                                              VkRenderPassAttachmentBeginInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pAttachments = nullptr;
-    if (from->pAttachments)
-    {
-        to->pAttachments = (VkImageView*)alloc->dupArray(from->pAttachments, from->attachmentCount * sizeof(const VkImageView));
+    if (from->pAttachments) {
+        to->pAttachments = (VkImageView*)alloc->dupArray(
+            from->pAttachments, from->attachmentCount * sizeof(const VkImageView));
     }
 }
 
 void deepcopy_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceUniformBufferStandardLayoutFeatures* from,
-    VkPhysicalDeviceUniformBufferStandardLayoutFeatures* to)
-{
+    VkPhysicalDeviceUniformBufferStandardLayoutFeatures* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* from,
-    VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* to)
-{
+    VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* from,
-    VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* to)
-{
+    VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkAttachmentReferenceStencilLayout(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAttachmentReferenceStencilLayout* from,
-    VkAttachmentReferenceStencilLayout* to)
-{
+void deepcopy_VkAttachmentReferenceStencilLayout(Allocator* alloc, VkStructureType rootType,
+                                                 const VkAttachmentReferenceStencilLayout* from,
+                                                 VkAttachmentReferenceStencilLayout* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkAttachmentDescriptionStencilLayout(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAttachmentDescriptionStencilLayout* from,
-    VkAttachmentDescriptionStencilLayout* to)
-{
+void deepcopy_VkAttachmentDescriptionStencilLayout(Allocator* alloc, VkStructureType rootType,
+                                                   const VkAttachmentDescriptionStencilLayout* from,
+                                                   VkAttachmentDescriptionStencilLayout* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceHostQueryResetFeatures(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceHostQueryResetFeatures* from,
-    VkPhysicalDeviceHostQueryResetFeatures* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDeviceHostQueryResetFeatures* from,
+    VkPhysicalDeviceHostQueryResetFeatures* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceTimelineSemaphoreFeatures(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceTimelineSemaphoreFeatures* from,
-    VkPhysicalDeviceTimelineSemaphoreFeatures* to)
-{
+    VkPhysicalDeviceTimelineSemaphoreFeatures* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceTimelineSemaphoreProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceTimelineSemaphoreProperties* from,
-    VkPhysicalDeviceTimelineSemaphoreProperties* to)
-{
+    VkPhysicalDeviceTimelineSemaphoreProperties* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkSemaphoreTypeCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSemaphoreTypeCreateInfo* from,
-    VkSemaphoreTypeCreateInfo* to)
-{
+void deepcopy_VkSemaphoreTypeCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                        const VkSemaphoreTypeCreateInfo* from,
+                                        VkSemaphoreTypeCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkTimelineSemaphoreSubmitInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkTimelineSemaphoreSubmitInfo* from,
-    VkTimelineSemaphoreSubmitInfo* to)
-{
+void deepcopy_VkTimelineSemaphoreSubmitInfo(Allocator* alloc, VkStructureType rootType,
+                                            const VkTimelineSemaphoreSubmitInfo* from,
+                                            VkTimelineSemaphoreSubmitInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pWaitSemaphoreValues = nullptr;
-    if (from->pWaitSemaphoreValues)
-    {
-        to->pWaitSemaphoreValues = (uint64_t*)alloc->dupArray(from->pWaitSemaphoreValues, from->waitSemaphoreValueCount * sizeof(const uint64_t));
+    if (from->pWaitSemaphoreValues) {
+        to->pWaitSemaphoreValues = (uint64_t*)alloc->dupArray(
+            from->pWaitSemaphoreValues, from->waitSemaphoreValueCount * sizeof(const uint64_t));
     }
     to->pSignalSemaphoreValues = nullptr;
-    if (from->pSignalSemaphoreValues)
-    {
-        to->pSignalSemaphoreValues = (uint64_t*)alloc->dupArray(from->pSignalSemaphoreValues, from->signalSemaphoreValueCount * sizeof(const uint64_t));
+    if (from->pSignalSemaphoreValues) {
+        to->pSignalSemaphoreValues = (uint64_t*)alloc->dupArray(
+            from->pSignalSemaphoreValues, from->signalSemaphoreValueCount * sizeof(const uint64_t));
     }
 }
 
-void deepcopy_VkSemaphoreWaitInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSemaphoreWaitInfo* from,
-    VkSemaphoreWaitInfo* to)
-{
+void deepcopy_VkSemaphoreWaitInfo(Allocator* alloc, VkStructureType rootType,
+                                  const VkSemaphoreWaitInfo* from, VkSemaphoreWaitInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pSemaphores = nullptr;
-    if (from->pSemaphores)
-    {
-        to->pSemaphores = (VkSemaphore*)alloc->dupArray(from->pSemaphores, from->semaphoreCount * sizeof(const VkSemaphore));
+    if (from->pSemaphores) {
+        to->pSemaphores = (VkSemaphore*)alloc->dupArray(
+            from->pSemaphores, from->semaphoreCount * sizeof(const VkSemaphore));
     }
     to->pValues = nullptr;
-    if (from->pValues)
-    {
-        to->pValues = (uint64_t*)alloc->dupArray(from->pValues, from->semaphoreCount * sizeof(const uint64_t));
+    if (from->pValues) {
+        to->pValues = (uint64_t*)alloc->dupArray(from->pValues,
+                                                 from->semaphoreCount * sizeof(const uint64_t));
     }
 }
 
-void deepcopy_VkSemaphoreSignalInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSemaphoreSignalInfo* from,
-    VkSemaphoreSignalInfo* to)
-{
+void deepcopy_VkSemaphoreSignalInfo(Allocator* alloc, VkStructureType rootType,
+                                    const VkSemaphoreSignalInfo* from, VkSemaphoreSignalInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceBufferDeviceAddressFeatures(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceBufferDeviceAddressFeatures* from,
-    VkPhysicalDeviceBufferDeviceAddressFeatures* to)
-{
+    VkPhysicalDeviceBufferDeviceAddressFeatures* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkBufferDeviceAddressInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBufferDeviceAddressInfo* from,
-    VkBufferDeviceAddressInfo* to)
-{
+void deepcopy_VkBufferDeviceAddressInfo(Allocator* alloc, VkStructureType rootType,
+                                        const VkBufferDeviceAddressInfo* from,
+                                        VkBufferDeviceAddressInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkBufferOpaqueCaptureAddressCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBufferOpaqueCaptureAddressCreateInfo* from,
-    VkBufferOpaqueCaptureAddressCreateInfo* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkBufferOpaqueCaptureAddressCreateInfo* from,
+    VkBufferOpaqueCaptureAddressCreateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkMemoryOpaqueCaptureAddressAllocateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkMemoryOpaqueCaptureAddressAllocateInfo* from,
-    VkMemoryOpaqueCaptureAddressAllocateInfo* to)
-{
+    VkMemoryOpaqueCaptureAddressAllocateInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkDeviceMemoryOpaqueCaptureAddressInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDeviceMemoryOpaqueCaptureAddressInfo* from,
-    VkDeviceMemoryOpaqueCaptureAddressInfo* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkDeviceMemoryOpaqueCaptureAddressInfo* from,
+    VkDeviceMemoryOpaqueCaptureAddressInfo* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -6267,12 +5087,9 @@
 
 #endif
 #ifdef VK_KHR_surface
-void deepcopy_VkSurfaceCapabilitiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSurfaceCapabilitiesKHR* from,
-    VkSurfaceCapabilitiesKHR* to)
-{
+void deepcopy_VkSurfaceCapabilitiesKHR(Allocator* alloc, VkStructureType rootType,
+                                       const VkSurfaceCapabilitiesKHR* from,
+                                       VkSurfaceCapabilitiesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
@@ -6281,12 +5098,8 @@
     deepcopy_VkExtent2D(alloc, rootType, &from->maxImageExtent, (VkExtent2D*)(&to->maxImageExtent));
 }
 
-void deepcopy_VkSurfaceFormatKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSurfaceFormatKHR* from,
-    VkSurfaceFormatKHR* to)
-{
+void deepcopy_VkSurfaceFormatKHR(Allocator* alloc, VkStructureType rootType,
+                                 const VkSurfaceFormatKHR* from, VkSurfaceFormatKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
@@ -6294,257 +5107,208 @@
 
 #endif
 #ifdef VK_KHR_swapchain
-void deepcopy_VkSwapchainCreateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSwapchainCreateInfoKHR* from,
-    VkSwapchainCreateInfoKHR* to)
-{
+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)
-    {
+    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)
-    {
+    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)
-    {
+    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));
+    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 deepcopy_VkPresentInfoKHR(Allocator* alloc, VkStructureType rootType,
+                               const VkPresentInfoKHR* from, VkPresentInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    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));
+    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));
+    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));
+    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));
+    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 deepcopy_VkImageSwapchainCreateInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                            const VkImageSwapchainCreateInfoKHR* from,
+                                            VkImageSwapchainCreateInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    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 deepcopy_VkBindImageMemorySwapchainInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                                const VkBindImageMemorySwapchainInfoKHR* from,
+                                                VkBindImageMemorySwapchainInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    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 deepcopy_VkAcquireNextImageInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                        const VkAcquireNextImageInfoKHR* from,
+                                        VkAcquireNextImageInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    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 deepcopy_VkDeviceGroupPresentCapabilitiesKHR(Allocator* alloc, VkStructureType rootType,
+                                                  const VkDeviceGroupPresentCapabilitiesKHR* from,
+                                                  VkDeviceGroupPresentCapabilitiesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    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 deepcopy_VkDeviceGroupPresentInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                          const VkDeviceGroupPresentInfoKHR* from,
+                                          VkDeviceGroupPresentInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    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));
+    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 deepcopy_VkDeviceGroupSwapchainCreateInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                                  const VkDeviceGroupSwapchainCreateInfoKHR* from,
+                                                  VkDeviceGroupSwapchainCreateInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -6552,65 +5316,52 @@
 
 #endif
 #ifdef VK_KHR_display
-void deepcopy_VkDisplayModeParametersKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDisplayModeParametersKHR* from,
-    VkDisplayModeParametersKHR* to)
-{
+void deepcopy_VkDisplayModeParametersKHR(Allocator* alloc, VkStructureType rootType,
+                                         const VkDisplayModeParametersKHR* from,
+                                         VkDisplayModeParametersKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
     deepcopy_VkExtent2D(alloc, rootType, &from->visibleRegion, (VkExtent2D*)(&to->visibleRegion));
 }
 
-void deepcopy_VkDisplayModeCreateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDisplayModeCreateInfoKHR* from,
-    VkDisplayModeCreateInfoKHR* to)
-{
+void deepcopy_VkDisplayModeCreateInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                         const VkDisplayModeCreateInfoKHR* from,
+                                         VkDisplayModeCreateInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkDisplayModeParametersKHR(alloc, rootType, &from->parameters, (VkDisplayModeParametersKHR*)(&to->parameters));
+    deepcopy_VkDisplayModeParametersKHR(alloc, rootType, &from->parameters,
+                                        (VkDisplayModeParametersKHR*)(&to->parameters));
 }
 
-void deepcopy_VkDisplayModePropertiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDisplayModePropertiesKHR* from,
-    VkDisplayModePropertiesKHR* to)
-{
+void deepcopy_VkDisplayModePropertiesKHR(Allocator* alloc, VkStructureType rootType,
+                                         const VkDisplayModePropertiesKHR* from,
+                                         VkDisplayModePropertiesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    deepcopy_VkDisplayModeParametersKHR(alloc, rootType, &from->parameters, (VkDisplayModeParametersKHR*)(&to->parameters));
+    deepcopy_VkDisplayModeParametersKHR(alloc, rootType, &from->parameters,
+                                        (VkDisplayModeParametersKHR*)(&to->parameters));
 }
 
-void deepcopy_VkDisplayPlaneCapabilitiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDisplayPlaneCapabilitiesKHR* from,
-    VkDisplayPlaneCapabilitiesKHR* to)
-{
+void deepcopy_VkDisplayPlaneCapabilitiesKHR(Allocator* alloc, VkStructureType rootType,
+                                            const VkDisplayPlaneCapabilitiesKHR* from,
+                                            VkDisplayPlaneCapabilitiesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
@@ -6624,58 +5375,47 @@
     deepcopy_VkExtent2D(alloc, rootType, &from->maxDstExtent, (VkExtent2D*)(&to->maxDstExtent));
 }
 
-void deepcopy_VkDisplayPlanePropertiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDisplayPlanePropertiesKHR* from,
-    VkDisplayPlanePropertiesKHR* to)
-{
+void deepcopy_VkDisplayPlanePropertiesKHR(Allocator* alloc, VkStructureType rootType,
+                                          const VkDisplayPlanePropertiesKHR* from,
+                                          VkDisplayPlanePropertiesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkDisplayPropertiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDisplayPropertiesKHR* from,
-    VkDisplayPropertiesKHR* to)
-{
+void deepcopy_VkDisplayPropertiesKHR(Allocator* alloc, VkStructureType rootType,
+                                     const VkDisplayPropertiesKHR* from,
+                                     VkDisplayPropertiesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
     to->displayName = nullptr;
-    if (from->displayName)
-    {
+    if (from->displayName) {
         to->displayName = alloc->strDup(from->displayName);
     }
-    deepcopy_VkExtent2D(alloc, rootType, &from->physicalDimensions, (VkExtent2D*)(&to->physicalDimensions));
-    deepcopy_VkExtent2D(alloc, rootType, &from->physicalResolution, (VkExtent2D*)(&to->physicalResolution));
+    deepcopy_VkExtent2D(alloc, rootType, &from->physicalDimensions,
+                        (VkExtent2D*)(&to->physicalDimensions));
+    deepcopy_VkExtent2D(alloc, rootType, &from->physicalResolution,
+                        (VkExtent2D*)(&to->physicalResolution));
 }
 
-void deepcopy_VkDisplaySurfaceCreateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDisplaySurfaceCreateInfoKHR* from,
-    VkDisplaySurfaceCreateInfoKHR* to)
-{
+void deepcopy_VkDisplaySurfaceCreateInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                            const VkDisplaySurfaceCreateInfoKHR* from,
+                                            VkDisplaySurfaceCreateInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -6684,29 +5424,23 @@
 
 #endif
 #ifdef VK_KHR_display_swapchain
-void deepcopy_VkDisplayPresentInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDisplayPresentInfoKHR* from,
-    VkDisplayPresentInfoKHR* to)
-{
+void deepcopy_VkDisplayPresentInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                      const VkDisplayPresentInfoKHR* from,
+                                      VkDisplayPresentInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -6716,174 +5450,140 @@
 
 #endif
 #ifdef VK_KHR_xlib_surface
-void deepcopy_VkXlibSurfaceCreateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkXlibSurfaceCreateInfoKHR* from,
-    VkXlibSurfaceCreateInfoKHR* to)
-{
+void deepcopy_VkXlibSurfaceCreateInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                         const VkXlibSurfaceCreateInfoKHR* from,
+                                         VkXlibSurfaceCreateInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->dpy = nullptr;
-    if (from->dpy)
-    {
+    if (from->dpy) {
         to->dpy = (Display*)alloc->dupArray(from->dpy, sizeof(Display));
     }
 }
 
 #endif
 #ifdef VK_KHR_xcb_surface
-void deepcopy_VkXcbSurfaceCreateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkXcbSurfaceCreateInfoKHR* from,
-    VkXcbSurfaceCreateInfoKHR* to)
-{
+void deepcopy_VkXcbSurfaceCreateInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                        const VkXcbSurfaceCreateInfoKHR* from,
+                                        VkXcbSurfaceCreateInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->connection = nullptr;
-    if (from->connection)
-    {
-        to->connection = (xcb_connection_t*)alloc->dupArray(from->connection, sizeof(xcb_connection_t));
+    if (from->connection) {
+        to->connection =
+            (xcb_connection_t*)alloc->dupArray(from->connection, sizeof(xcb_connection_t));
     }
 }
 
 #endif
 #ifdef VK_KHR_wayland_surface
-void deepcopy_VkWaylandSurfaceCreateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkWaylandSurfaceCreateInfoKHR* from,
-    VkWaylandSurfaceCreateInfoKHR* to)
-{
+void deepcopy_VkWaylandSurfaceCreateInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                            const VkWaylandSurfaceCreateInfoKHR* from,
+                                            VkWaylandSurfaceCreateInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->display = nullptr;
-    if (from->display)
-    {
+    if (from->display) {
         to->display = (wl_display*)alloc->dupArray(from->display, sizeof(wl_display));
     }
     to->surface = nullptr;
-    if (from->surface)
-    {
+    if (from->surface) {
         to->surface = (wl_surface*)alloc->dupArray(from->surface, sizeof(wl_surface));
     }
 }
 
 #endif
 #ifdef VK_KHR_android_surface
-void deepcopy_VkAndroidSurfaceCreateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAndroidSurfaceCreateInfoKHR* from,
-    VkAndroidSurfaceCreateInfoKHR* to)
-{
+void deepcopy_VkAndroidSurfaceCreateInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                            const VkAndroidSurfaceCreateInfoKHR* from,
+                                            VkAndroidSurfaceCreateInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->window = nullptr;
-    if (from->window)
-    {
+    if (from->window) {
         to->window = (ANativeWindow*)alloc->dupArray(from->window, sizeof(ANativeWindow));
     }
 }
 
 #endif
 #ifdef VK_KHR_win32_surface
-void deepcopy_VkWin32SurfaceCreateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkWin32SurfaceCreateInfoKHR* from,
-    VkWin32SurfaceCreateInfoKHR* to)
-{
+void deepcopy_VkWin32SurfaceCreateInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                          const VkWin32SurfaceCreateInfoKHR* from,
+                                          VkWin32SurfaceCreateInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -6893,212 +5593,169 @@
 #ifdef VK_KHR_sampler_mirror_clamp_to_edge
 #endif
 #ifdef VK_KHR_video_queue
-void deepcopy_VkVideoQueueFamilyProperties2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoQueueFamilyProperties2KHR* from,
-    VkVideoQueueFamilyProperties2KHR* to)
-{
+void deepcopy_VkVideoQueueFamilyProperties2KHR(Allocator* alloc, VkStructureType rootType,
+                                               const VkVideoQueueFamilyProperties2KHR* from,
+                                               VkVideoQueueFamilyProperties2KHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkVideoProfileKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoProfileKHR* from,
-    VkVideoProfileKHR* to)
-{
+void deepcopy_VkVideoProfileKHR(Allocator* alloc, VkStructureType rootType,
+                                const VkVideoProfileKHR* from, VkVideoProfileKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkVideoProfilesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoProfilesKHR* from,
-    VkVideoProfilesKHR* to)
-{
+void deepcopy_VkVideoProfilesKHR(Allocator* alloc, VkStructureType rootType,
+                                 const VkVideoProfilesKHR* from, VkVideoProfilesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pProfiles = nullptr;
-    if (from->pProfiles)
-    {
+    if (from->pProfiles) {
         to->pProfiles = (VkVideoProfileKHR*)alloc->alloc(sizeof(const VkVideoProfileKHR));
-        deepcopy_VkVideoProfileKHR(alloc, rootType, from->pProfiles, (VkVideoProfileKHR*)(to->pProfiles));
+        deepcopy_VkVideoProfileKHR(alloc, rootType, from->pProfiles,
+                                   (VkVideoProfileKHR*)(to->pProfiles));
     }
 }
 
-void deepcopy_VkVideoCapabilitiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoCapabilitiesKHR* from,
-    VkVideoCapabilitiesKHR* to)
-{
+void deepcopy_VkVideoCapabilitiesKHR(Allocator* alloc, VkStructureType rootType,
+                                     const VkVideoCapabilitiesKHR* from,
+                                     VkVideoCapabilitiesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    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->videoPictureExtentGranularity, (VkExtent2D*)(&to->videoPictureExtentGranularity));
+    deepcopy_VkExtent2D(alloc, rootType, &from->videoPictureExtentGranularity,
+                        (VkExtent2D*)(&to->videoPictureExtentGranularity));
     deepcopy_VkExtent2D(alloc, rootType, &from->minExtent, (VkExtent2D*)(&to->minExtent));
     deepcopy_VkExtent2D(alloc, rootType, &from->maxExtent, (VkExtent2D*)(&to->maxExtent));
 }
 
-void deepcopy_VkPhysicalDeviceVideoFormatInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceVideoFormatInfoKHR* from,
-    VkPhysicalDeviceVideoFormatInfoKHR* to)
-{
+void deepcopy_VkPhysicalDeviceVideoFormatInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                                 const VkPhysicalDeviceVideoFormatInfoKHR* from,
+                                                 VkPhysicalDeviceVideoFormatInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pVideoProfiles = nullptr;
-    if (from->pVideoProfiles)
-    {
+    if (from->pVideoProfiles) {
         to->pVideoProfiles = (VkVideoProfilesKHR*)alloc->alloc(sizeof(const VkVideoProfilesKHR));
-        deepcopy_VkVideoProfilesKHR(alloc, rootType, from->pVideoProfiles, (VkVideoProfilesKHR*)(to->pVideoProfiles));
+        deepcopy_VkVideoProfilesKHR(alloc, rootType, from->pVideoProfiles,
+                                    (VkVideoProfilesKHR*)(to->pVideoProfiles));
     }
 }
 
-void deepcopy_VkVideoFormatPropertiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoFormatPropertiesKHR* from,
-    VkVideoFormatPropertiesKHR* to)
-{
+void deepcopy_VkVideoFormatPropertiesKHR(Allocator* alloc, VkStructureType rootType,
+                                         const VkVideoFormatPropertiesKHR* from,
+                                         VkVideoFormatPropertiesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkVideoPictureResourceKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoPictureResourceKHR* from,
-    VkVideoPictureResourceKHR* to)
-{
+void deepcopy_VkVideoPictureResourceKHR(Allocator* alloc, VkStructureType rootType,
+                                        const VkVideoPictureResourceKHR* from,
+                                        VkVideoPictureResourceKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -7106,285 +5763,232 @@
     deepcopy_VkExtent2D(alloc, rootType, &from->codedExtent, (VkExtent2D*)(&to->codedExtent));
 }
 
-void deepcopy_VkVideoReferenceSlotKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoReferenceSlotKHR* from,
-    VkVideoReferenceSlotKHR* to)
-{
+void deepcopy_VkVideoReferenceSlotKHR(Allocator* alloc, VkStructureType rootType,
+                                      const VkVideoReferenceSlotKHR* from,
+                                      VkVideoReferenceSlotKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pPictureResource = nullptr;
-    if (from->pPictureResource)
-    {
-        to->pPictureResource = (VkVideoPictureResourceKHR*)alloc->alloc(sizeof(const VkVideoPictureResourceKHR));
-        deepcopy_VkVideoPictureResourceKHR(alloc, rootType, from->pPictureResource, (VkVideoPictureResourceKHR*)(to->pPictureResource));
+    if (from->pPictureResource) {
+        to->pPictureResource =
+            (VkVideoPictureResourceKHR*)alloc->alloc(sizeof(const VkVideoPictureResourceKHR));
+        deepcopy_VkVideoPictureResourceKHR(alloc, rootType, from->pPictureResource,
+                                           (VkVideoPictureResourceKHR*)(to->pPictureResource));
     }
 }
 
-void deepcopy_VkVideoGetMemoryPropertiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoGetMemoryPropertiesKHR* from,
-    VkVideoGetMemoryPropertiesKHR* to)
-{
+void deepcopy_VkVideoGetMemoryPropertiesKHR(Allocator* alloc, VkStructureType rootType,
+                                            const VkVideoGetMemoryPropertiesKHR* from,
+                                            VkVideoGetMemoryPropertiesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pMemoryRequirements = nullptr;
-    if (from->pMemoryRequirements)
-    {
-        to->pMemoryRequirements = (VkMemoryRequirements2*)alloc->alloc(sizeof(VkMemoryRequirements2));
-        deepcopy_VkMemoryRequirements2(alloc, rootType, from->pMemoryRequirements, (VkMemoryRequirements2*)(to->pMemoryRequirements));
+    if (from->pMemoryRequirements) {
+        to->pMemoryRequirements =
+            (VkMemoryRequirements2*)alloc->alloc(sizeof(VkMemoryRequirements2));
+        deepcopy_VkMemoryRequirements2(alloc, rootType, from->pMemoryRequirements,
+                                       (VkMemoryRequirements2*)(to->pMemoryRequirements));
     }
 }
 
-void deepcopy_VkVideoBindMemoryKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoBindMemoryKHR* from,
-    VkVideoBindMemoryKHR* to)
-{
+void deepcopy_VkVideoBindMemoryKHR(Allocator* alloc, VkStructureType rootType,
+                                   const VkVideoBindMemoryKHR* from, VkVideoBindMemoryKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkVideoSessionCreateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoSessionCreateInfoKHR* from,
-    VkVideoSessionCreateInfoKHR* to)
-{
+void deepcopy_VkVideoSessionCreateInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                          const VkVideoSessionCreateInfoKHR* from,
+                                          VkVideoSessionCreateInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pVideoProfile = nullptr;
-    if (from->pVideoProfile)
-    {
+    if (from->pVideoProfile) {
         to->pVideoProfile = (VkVideoProfileKHR*)alloc->alloc(sizeof(const VkVideoProfileKHR));
-        deepcopy_VkVideoProfileKHR(alloc, rootType, from->pVideoProfile, (VkVideoProfileKHR*)(to->pVideoProfile));
+        deepcopy_VkVideoProfileKHR(alloc, rootType, from->pVideoProfile,
+                                   (VkVideoProfileKHR*)(to->pVideoProfile));
     }
     deepcopy_VkExtent2D(alloc, rootType, &from->maxCodedExtent, (VkExtent2D*)(&to->maxCodedExtent));
 }
 
 void deepcopy_VkVideoSessionParametersCreateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoSessionParametersCreateInfoKHR* from,
-    VkVideoSessionParametersCreateInfoKHR* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkVideoSessionParametersCreateInfoKHR* from,
+    VkVideoSessionParametersCreateInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkVideoSessionParametersUpdateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoSessionParametersUpdateInfoKHR* from,
-    VkVideoSessionParametersUpdateInfoKHR* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkVideoSessionParametersUpdateInfoKHR* from,
+    VkVideoSessionParametersUpdateInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkVideoBeginCodingInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoBeginCodingInfoKHR* from,
-    VkVideoBeginCodingInfoKHR* to)
-{
+void deepcopy_VkVideoBeginCodingInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                        const VkVideoBeginCodingInfoKHR* from,
+                                        VkVideoBeginCodingInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pReferenceSlots = nullptr;
-        if (from->pReferenceSlots)
-        {
-            to->pReferenceSlots = (VkVideoReferenceSlotKHR*)alloc->alloc(from->referenceSlotCount * sizeof(const VkVideoReferenceSlotKHR));
+        if (from->pReferenceSlots) {
+            to->pReferenceSlots = (VkVideoReferenceSlotKHR*)alloc->alloc(
+                from->referenceSlotCount * sizeof(const VkVideoReferenceSlotKHR));
             to->referenceSlotCount = from->referenceSlotCount;
-            for (uint32_t i = 0; i < (uint32_t)from->referenceSlotCount; ++i)
-            {
-                deepcopy_VkVideoReferenceSlotKHR(alloc, rootType, from->pReferenceSlots + i, (VkVideoReferenceSlotKHR*)(to->pReferenceSlots + i));
+            for (uint32_t i = 0; i < (uint32_t)from->referenceSlotCount; ++i) {
+                deepcopy_VkVideoReferenceSlotKHR(
+                    alloc, rootType, from->pReferenceSlots + i,
+                    (VkVideoReferenceSlotKHR*)(to->pReferenceSlots + i));
             }
         }
     }
 }
 
-void deepcopy_VkVideoEndCodingInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoEndCodingInfoKHR* from,
-    VkVideoEndCodingInfoKHR* to)
-{
+void deepcopy_VkVideoEndCodingInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                      const VkVideoEndCodingInfoKHR* from,
+                                      VkVideoEndCodingInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkVideoCodingControlInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoCodingControlInfoKHR* from,
-    VkVideoCodingControlInfoKHR* to)
-{
+void deepcopy_VkVideoCodingControlInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                          const VkVideoCodingControlInfoKHR* from,
+                                          VkVideoCodingControlInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -7392,51 +5996,46 @@
 
 #endif
 #ifdef VK_KHR_video_decode_queue
-void deepcopy_VkVideoDecodeInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoDecodeInfoKHR* from,
-    VkVideoDecodeInfoKHR* to)
-{
+void deepcopy_VkVideoDecodeInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                   const VkVideoDecodeInfoKHR* from, VkVideoDecodeInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     deepcopy_VkOffset2D(alloc, rootType, &from->codedOffset, (VkOffset2D*)(&to->codedOffset));
     deepcopy_VkExtent2D(alloc, rootType, &from->codedExtent, (VkExtent2D*)(&to->codedExtent));
-    deepcopy_VkVideoPictureResourceKHR(alloc, rootType, &from->dstPictureResource, (VkVideoPictureResourceKHR*)(&to->dstPictureResource));
+    deepcopy_VkVideoPictureResourceKHR(alloc, rootType, &from->dstPictureResource,
+                                       (VkVideoPictureResourceKHR*)(&to->dstPictureResource));
     to->pSetupReferenceSlot = nullptr;
-    if (from->pSetupReferenceSlot)
-    {
-        to->pSetupReferenceSlot = (VkVideoReferenceSlotKHR*)alloc->alloc(sizeof(const VkVideoReferenceSlotKHR));
-        deepcopy_VkVideoReferenceSlotKHR(alloc, rootType, from->pSetupReferenceSlot, (VkVideoReferenceSlotKHR*)(to->pSetupReferenceSlot));
+    if (from->pSetupReferenceSlot) {
+        to->pSetupReferenceSlot =
+            (VkVideoReferenceSlotKHR*)alloc->alloc(sizeof(const VkVideoReferenceSlotKHR));
+        deepcopy_VkVideoReferenceSlotKHR(alloc, rootType, from->pSetupReferenceSlot,
+                                         (VkVideoReferenceSlotKHR*)(to->pSetupReferenceSlot));
     }
-    if (from)
-    {
+    if (from) {
         to->pReferenceSlots = nullptr;
-        if (from->pReferenceSlots)
-        {
-            to->pReferenceSlots = (VkVideoReferenceSlotKHR*)alloc->alloc(from->referenceSlotCount * sizeof(const VkVideoReferenceSlotKHR));
+        if (from->pReferenceSlots) {
+            to->pReferenceSlots = (VkVideoReferenceSlotKHR*)alloc->alloc(
+                from->referenceSlotCount * sizeof(const VkVideoReferenceSlotKHR));
             to->referenceSlotCount = from->referenceSlotCount;
-            for (uint32_t i = 0; i < (uint32_t)from->referenceSlotCount; ++i)
-            {
-                deepcopy_VkVideoReferenceSlotKHR(alloc, rootType, from->pReferenceSlots + i, (VkVideoReferenceSlotKHR*)(to->pReferenceSlots + i));
+            for (uint32_t i = 0; i < (uint32_t)from->referenceSlotCount; ++i) {
+                deepcopy_VkVideoReferenceSlotKHR(
+                    alloc, rootType, from->pReferenceSlots + i,
+                    (VkVideoReferenceSlotKHR*)(to->pReferenceSlots + i));
             }
         }
     }
@@ -7444,296 +6043,251 @@
 
 #endif
 #ifdef VK_KHR_dynamic_rendering
-void deepcopy_VkRenderingAttachmentInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkRenderingAttachmentInfoKHR* from,
-    VkRenderingAttachmentInfoKHR* to)
-{
+void deepcopy_VkRenderingAttachmentInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                           const VkRenderingAttachmentInfoKHR* from,
+                                           VkRenderingAttachmentInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     deepcopy_VkClearValue(alloc, rootType, &from->clearValue, (VkClearValue*)(&to->clearValue));
 }
 
-void deepcopy_VkRenderingInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkRenderingInfoKHR* from,
-    VkRenderingInfoKHR* to)
-{
+void deepcopy_VkRenderingInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                 const VkRenderingInfoKHR* from, VkRenderingInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     deepcopy_VkRect2D(alloc, rootType, &from->renderArea, (VkRect2D*)(&to->renderArea));
-    if (from)
-    {
+    if (from) {
         to->pColorAttachments = nullptr;
-        if (from->pColorAttachments)
-        {
-            to->pColorAttachments = (VkRenderingAttachmentInfoKHR*)alloc->alloc(from->colorAttachmentCount * sizeof(const VkRenderingAttachmentInfoKHR));
+        if (from->pColorAttachments) {
+            to->pColorAttachments = (VkRenderingAttachmentInfoKHR*)alloc->alloc(
+                from->colorAttachmentCount * sizeof(const VkRenderingAttachmentInfoKHR));
             to->colorAttachmentCount = from->colorAttachmentCount;
-            for (uint32_t i = 0; i < (uint32_t)from->colorAttachmentCount; ++i)
-            {
-                deepcopy_VkRenderingAttachmentInfoKHR(alloc, rootType, from->pColorAttachments + i, (VkRenderingAttachmentInfoKHR*)(to->pColorAttachments + i));
+            for (uint32_t i = 0; i < (uint32_t)from->colorAttachmentCount; ++i) {
+                deepcopy_VkRenderingAttachmentInfoKHR(
+                    alloc, rootType, from->pColorAttachments + i,
+                    (VkRenderingAttachmentInfoKHR*)(to->pColorAttachments + i));
             }
         }
     }
     to->pDepthAttachment = nullptr;
-    if (from->pDepthAttachment)
-    {
-        to->pDepthAttachment = (VkRenderingAttachmentInfoKHR*)alloc->alloc(sizeof(const VkRenderingAttachmentInfoKHR));
-        deepcopy_VkRenderingAttachmentInfoKHR(alloc, rootType, from->pDepthAttachment, (VkRenderingAttachmentInfoKHR*)(to->pDepthAttachment));
+    if (from->pDepthAttachment) {
+        to->pDepthAttachment =
+            (VkRenderingAttachmentInfoKHR*)alloc->alloc(sizeof(const VkRenderingAttachmentInfoKHR));
+        deepcopy_VkRenderingAttachmentInfoKHR(
+            alloc, rootType, from->pDepthAttachment,
+            (VkRenderingAttachmentInfoKHR*)(to->pDepthAttachment));
     }
     to->pStencilAttachment = nullptr;
-    if (from->pStencilAttachment)
-    {
-        to->pStencilAttachment = (VkRenderingAttachmentInfoKHR*)alloc->alloc(sizeof(const VkRenderingAttachmentInfoKHR));
-        deepcopy_VkRenderingAttachmentInfoKHR(alloc, rootType, from->pStencilAttachment, (VkRenderingAttachmentInfoKHR*)(to->pStencilAttachment));
+    if (from->pStencilAttachment) {
+        to->pStencilAttachment =
+            (VkRenderingAttachmentInfoKHR*)alloc->alloc(sizeof(const VkRenderingAttachmentInfoKHR));
+        deepcopy_VkRenderingAttachmentInfoKHR(
+            alloc, rootType, from->pStencilAttachment,
+            (VkRenderingAttachmentInfoKHR*)(to->pStencilAttachment));
     }
 }
 
-void deepcopy_VkPipelineRenderingCreateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineRenderingCreateInfoKHR* from,
-    VkPipelineRenderingCreateInfoKHR* to)
-{
+void deepcopy_VkPipelineRenderingCreateInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                               const VkPipelineRenderingCreateInfoKHR* from,
+                                               VkPipelineRenderingCreateInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pColorAttachmentFormats = nullptr;
-    if (from->pColorAttachmentFormats)
-    {
-        to->pColorAttachmentFormats = (VkFormat*)alloc->dupArray(from->pColorAttachmentFormats, from->colorAttachmentCount * sizeof(const VkFormat));
+    if (from->pColorAttachmentFormats) {
+        to->pColorAttachmentFormats = (VkFormat*)alloc->dupArray(
+            from->pColorAttachmentFormats, from->colorAttachmentCount * sizeof(const VkFormat));
     }
 }
 
 void deepcopy_VkPhysicalDeviceDynamicRenderingFeaturesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceDynamicRenderingFeaturesKHR* from,
-    VkPhysicalDeviceDynamicRenderingFeaturesKHR* to)
-{
+    VkPhysicalDeviceDynamicRenderingFeaturesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkCommandBufferInheritanceRenderingInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkCommandBufferInheritanceRenderingInfoKHR* from,
-    VkCommandBufferInheritanceRenderingInfoKHR* to)
-{
+    VkCommandBufferInheritanceRenderingInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pColorAttachmentFormats = nullptr;
-    if (from->pColorAttachmentFormats)
-    {
-        to->pColorAttachmentFormats = (VkFormat*)alloc->dupArray(from->pColorAttachmentFormats, from->colorAttachmentCount * sizeof(const VkFormat));
+    if (from->pColorAttachmentFormats) {
+        to->pColorAttachmentFormats = (VkFormat*)alloc->dupArray(
+            from->pColorAttachmentFormats, from->colorAttachmentCount * sizeof(const VkFormat));
     }
 }
 
 void deepcopy_VkRenderingFragmentShadingRateAttachmentInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkRenderingFragmentShadingRateAttachmentInfoKHR* from,
-    VkRenderingFragmentShadingRateAttachmentInfoKHR* to)
-{
+    VkRenderingFragmentShadingRateAttachmentInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    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->shadingRateAttachmentTexelSize, (VkExtent2D*)(&to->shadingRateAttachmentTexelSize));
+    deepcopy_VkExtent2D(alloc, rootType, &from->shadingRateAttachmentTexelSize,
+                        (VkExtent2D*)(&to->shadingRateAttachmentTexelSize));
 }
 
 void deepcopy_VkRenderingFragmentDensityMapAttachmentInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkRenderingFragmentDensityMapAttachmentInfoEXT* from,
-    VkRenderingFragmentDensityMapAttachmentInfoEXT* to)
-{
+    VkRenderingFragmentDensityMapAttachmentInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkAttachmentSampleCountInfoAMD(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAttachmentSampleCountInfoAMD* from,
-    VkAttachmentSampleCountInfoAMD* to)
-{
+void deepcopy_VkAttachmentSampleCountInfoAMD(Allocator* alloc, VkStructureType rootType,
+                                             const VkAttachmentSampleCountInfoAMD* from,
+                                             VkAttachmentSampleCountInfoAMD* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pColorAttachmentSamples = nullptr;
-    if (from->pColorAttachmentSamples)
-    {
-        to->pColorAttachmentSamples = (VkSampleCountFlagBits*)alloc->dupArray(from->pColorAttachmentSamples, from->colorAttachmentCount * sizeof(const VkSampleCountFlagBits));
+    if (from->pColorAttachmentSamples) {
+        to->pColorAttachmentSamples = (VkSampleCountFlagBits*)alloc->dupArray(
+            from->pColorAttachmentSamples,
+            from->colorAttachmentCount * sizeof(const VkSampleCountFlagBits));
     }
 }
 
-void deepcopy_VkMultiviewPerViewAttributesInfoNVX(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMultiviewPerViewAttributesInfoNVX* from,
-    VkMultiviewPerViewAttributesInfoNVX* to)
-{
+void deepcopy_VkMultiviewPerViewAttributesInfoNVX(Allocator* alloc, VkStructureType rootType,
+                                                  const VkMultiviewPerViewAttributesInfoNVX* from,
+                                                  VkMultiviewPerViewAttributesInfoNVX* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -7757,118 +6311,94 @@
 #ifdef VK_KHR_external_memory
 #endif
 #ifdef VK_KHR_external_memory_win32
-void deepcopy_VkImportMemoryWin32HandleInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImportMemoryWin32HandleInfoKHR* from,
-    VkImportMemoryWin32HandleInfoKHR* to)
-{
+void deepcopy_VkImportMemoryWin32HandleInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                               const VkImportMemoryWin32HandleInfoKHR* from,
+                                               VkImportMemoryWin32HandleInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkExportMemoryWin32HandleInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExportMemoryWin32HandleInfoKHR* from,
-    VkExportMemoryWin32HandleInfoKHR* to)
-{
+void deepcopy_VkExportMemoryWin32HandleInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                               const VkExportMemoryWin32HandleInfoKHR* from,
+                                               VkExportMemoryWin32HandleInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pAttributes = nullptr;
-    if (from->pAttributes)
-    {
-        to->pAttributes = (SECURITY_ATTRIBUTES*)alloc->dupArray(from->pAttributes, sizeof(const SECURITY_ATTRIBUTES));
+    if (from->pAttributes) {
+        to->pAttributes = (SECURITY_ATTRIBUTES*)alloc->dupArray(from->pAttributes,
+                                                                sizeof(const SECURITY_ATTRIBUTES));
     }
 }
 
-void deepcopy_VkMemoryWin32HandlePropertiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryWin32HandlePropertiesKHR* from,
-    VkMemoryWin32HandlePropertiesKHR* to)
-{
+void deepcopy_VkMemoryWin32HandlePropertiesKHR(Allocator* alloc, VkStructureType rootType,
+                                               const VkMemoryWin32HandlePropertiesKHR* from,
+                                               VkMemoryWin32HandlePropertiesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkMemoryGetWin32HandleInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryGetWin32HandleInfoKHR* from,
-    VkMemoryGetWin32HandleInfoKHR* to)
-{
+void deepcopy_VkMemoryGetWin32HandleInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                            const VkMemoryGetWin32HandleInfoKHR* from,
+                                            VkMemoryGetWin32HandleInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -7876,85 +6406,66 @@
 
 #endif
 #ifdef VK_KHR_external_memory_fd
-void deepcopy_VkImportMemoryFdInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImportMemoryFdInfoKHR* from,
-    VkImportMemoryFdInfoKHR* to)
-{
+void deepcopy_VkImportMemoryFdInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                      const VkImportMemoryFdInfoKHR* from,
+                                      VkImportMemoryFdInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkMemoryFdPropertiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryFdPropertiesKHR* from,
-    VkMemoryFdPropertiesKHR* to)
-{
+void deepcopy_VkMemoryFdPropertiesKHR(Allocator* alloc, VkStructureType rootType,
+                                      const VkMemoryFdPropertiesKHR* from,
+                                      VkMemoryFdPropertiesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkMemoryGetFdInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryGetFdInfoKHR* from,
-    VkMemoryGetFdInfoKHR* to)
-{
+void deepcopy_VkMemoryGetFdInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                   const VkMemoryGetFdInfoKHR* from, VkMemoryGetFdInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -7963,55 +6474,49 @@
 #endif
 #ifdef VK_KHR_win32_keyed_mutex
 void deepcopy_VkWin32KeyedMutexAcquireReleaseInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkWin32KeyedMutexAcquireReleaseInfoKHR* from,
-    VkWin32KeyedMutexAcquireReleaseInfoKHR* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkWin32KeyedMutexAcquireReleaseInfoKHR* from,
+    VkWin32KeyedMutexAcquireReleaseInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pAcquireSyncs = nullptr;
-    if (from->pAcquireSyncs)
-    {
-        to->pAcquireSyncs = (VkDeviceMemory*)alloc->dupArray(from->pAcquireSyncs, from->acquireCount * sizeof(const VkDeviceMemory));
+    if (from->pAcquireSyncs) {
+        to->pAcquireSyncs = (VkDeviceMemory*)alloc->dupArray(
+            from->pAcquireSyncs, from->acquireCount * sizeof(const VkDeviceMemory));
     }
     to->pAcquireKeys = nullptr;
-    if (from->pAcquireKeys)
-    {
-        to->pAcquireKeys = (uint64_t*)alloc->dupArray(from->pAcquireKeys, from->acquireCount * sizeof(const uint64_t));
+    if (from->pAcquireKeys) {
+        to->pAcquireKeys = (uint64_t*)alloc->dupArray(from->pAcquireKeys,
+                                                      from->acquireCount * sizeof(const uint64_t));
     }
     to->pAcquireTimeouts = nullptr;
-    if (from->pAcquireTimeouts)
-    {
-        to->pAcquireTimeouts = (uint32_t*)alloc->dupArray(from->pAcquireTimeouts, from->acquireCount * sizeof(const uint32_t));
+    if (from->pAcquireTimeouts) {
+        to->pAcquireTimeouts = (uint32_t*)alloc->dupArray(
+            from->pAcquireTimeouts, from->acquireCount * sizeof(const uint32_t));
     }
     to->pReleaseSyncs = nullptr;
-    if (from->pReleaseSyncs)
-    {
-        to->pReleaseSyncs = (VkDeviceMemory*)alloc->dupArray(from->pReleaseSyncs, from->releaseCount * sizeof(const VkDeviceMemory));
+    if (from->pReleaseSyncs) {
+        to->pReleaseSyncs = (VkDeviceMemory*)alloc->dupArray(
+            from->pReleaseSyncs, from->releaseCount * sizeof(const VkDeviceMemory));
     }
     to->pReleaseKeys = nullptr;
-    if (from->pReleaseKeys)
-    {
-        to->pReleaseKeys = (uint64_t*)alloc->dupArray(from->pReleaseKeys, from->releaseCount * sizeof(const uint64_t));
+    if (from->pReleaseKeys) {
+        to->pReleaseKeys = (uint64_t*)alloc->dupArray(from->pReleaseKeys,
+                                                      from->releaseCount * sizeof(const uint64_t));
     }
 }
 
@@ -8021,128 +6526,105 @@
 #ifdef VK_KHR_external_semaphore
 #endif
 #ifdef VK_KHR_external_semaphore_win32
-void deepcopy_VkImportSemaphoreWin32HandleInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImportSemaphoreWin32HandleInfoKHR* from,
-    VkImportSemaphoreWin32HandleInfoKHR* to)
-{
+void deepcopy_VkImportSemaphoreWin32HandleInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                                  const VkImportSemaphoreWin32HandleInfoKHR* from,
+                                                  VkImportSemaphoreWin32HandleInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkExportSemaphoreWin32HandleInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExportSemaphoreWin32HandleInfoKHR* from,
-    VkExportSemaphoreWin32HandleInfoKHR* to)
-{
+void deepcopy_VkExportSemaphoreWin32HandleInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                                  const VkExportSemaphoreWin32HandleInfoKHR* from,
+                                                  VkExportSemaphoreWin32HandleInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pAttributes = nullptr;
-    if (from->pAttributes)
-    {
-        to->pAttributes = (SECURITY_ATTRIBUTES*)alloc->dupArray(from->pAttributes, sizeof(const SECURITY_ATTRIBUTES));
+    if (from->pAttributes) {
+        to->pAttributes = (SECURITY_ATTRIBUTES*)alloc->dupArray(from->pAttributes,
+                                                                sizeof(const SECURITY_ATTRIBUTES));
     }
 }
 
-void deepcopy_VkD3D12FenceSubmitInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkD3D12FenceSubmitInfoKHR* from,
-    VkD3D12FenceSubmitInfoKHR* to)
-{
+void deepcopy_VkD3D12FenceSubmitInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                        const VkD3D12FenceSubmitInfoKHR* from,
+                                        VkD3D12FenceSubmitInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pWaitSemaphoreValues = nullptr;
-    if (from->pWaitSemaphoreValues)
-    {
-        to->pWaitSemaphoreValues = (uint64_t*)alloc->dupArray(from->pWaitSemaphoreValues, from->waitSemaphoreValuesCount * sizeof(const uint64_t));
+    if (from->pWaitSemaphoreValues) {
+        to->pWaitSemaphoreValues = (uint64_t*)alloc->dupArray(
+            from->pWaitSemaphoreValues, from->waitSemaphoreValuesCount * sizeof(const uint64_t));
     }
     to->pSignalSemaphoreValues = nullptr;
-    if (from->pSignalSemaphoreValues)
-    {
-        to->pSignalSemaphoreValues = (uint64_t*)alloc->dupArray(from->pSignalSemaphoreValues, from->signalSemaphoreValuesCount * sizeof(const uint64_t));
+    if (from->pSignalSemaphoreValues) {
+        to->pSignalSemaphoreValues =
+            (uint64_t*)alloc->dupArray(from->pSignalSemaphoreValues,
+                                       from->signalSemaphoreValuesCount * sizeof(const uint64_t));
     }
 }
 
-void deepcopy_VkSemaphoreGetWin32HandleInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSemaphoreGetWin32HandleInfoKHR* from,
-    VkSemaphoreGetWin32HandleInfoKHR* to)
-{
+void deepcopy_VkSemaphoreGetWin32HandleInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                               const VkSemaphoreGetWin32HandleInfoKHR* from,
+                                               VkSemaphoreGetWin32HandleInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -8150,57 +6632,45 @@
 
 #endif
 #ifdef VK_KHR_external_semaphore_fd
-void deepcopy_VkImportSemaphoreFdInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImportSemaphoreFdInfoKHR* from,
-    VkImportSemaphoreFdInfoKHR* to)
-{
+void deepcopy_VkImportSemaphoreFdInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                         const VkImportSemaphoreFdInfoKHR* from,
+                                         VkImportSemaphoreFdInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkSemaphoreGetFdInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSemaphoreGetFdInfoKHR* from,
-    VkSemaphoreGetFdInfoKHR* to)
-{
+void deepcopy_VkSemaphoreGetFdInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                      const VkSemaphoreGetFdInfoKHR* from,
+                                      VkSemaphoreGetFdInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -8209,28 +6679,23 @@
 #endif
 #ifdef VK_KHR_push_descriptor
 void deepcopy_VkPhysicalDevicePushDescriptorPropertiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDevicePushDescriptorPropertiesKHR* from,
-    VkPhysicalDevicePushDescriptorPropertiesKHR* to)
-{
+    VkPhysicalDevicePushDescriptorPropertiesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -8242,12 +6707,8 @@
 #ifdef VK_KHR_16bit_storage
 #endif
 #ifdef VK_KHR_incremental_present
-void deepcopy_VkRectLayerKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkRectLayerKHR* from,
-    VkRectLayerKHR* to)
-{
+void deepcopy_VkRectLayerKHR(Allocator* alloc, VkStructureType rootType, const VkRectLayerKHR* from,
+                             VkRectLayerKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
@@ -8255,66 +6716,53 @@
     deepcopy_VkExtent2D(alloc, rootType, &from->extent, (VkExtent2D*)(&to->extent));
 }
 
-void deepcopy_VkPresentRegionKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPresentRegionKHR* from,
-    VkPresentRegionKHR* to)
-{
+void deepcopy_VkPresentRegionKHR(Allocator* alloc, VkStructureType rootType,
+                                 const VkPresentRegionKHR* from, VkPresentRegionKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (from)
-    {
+    if (from) {
         to->pRectangles = nullptr;
-        if (from->pRectangles)
-        {
-            to->pRectangles = (VkRectLayerKHR*)alloc->alloc(from->rectangleCount * sizeof(const VkRectLayerKHR));
+        if (from->pRectangles) {
+            to->pRectangles =
+                (VkRectLayerKHR*)alloc->alloc(from->rectangleCount * sizeof(const VkRectLayerKHR));
             to->rectangleCount = from->rectangleCount;
-            for (uint32_t i = 0; i < (uint32_t)from->rectangleCount; ++i)
-            {
-                deepcopy_VkRectLayerKHR(alloc, rootType, from->pRectangles + i, (VkRectLayerKHR*)(to->pRectangles + i));
+            for (uint32_t i = 0; i < (uint32_t)from->rectangleCount; ++i) {
+                deepcopy_VkRectLayerKHR(alloc, rootType, from->pRectangles + i,
+                                        (VkRectLayerKHR*)(to->pRectangles + i));
             }
         }
     }
 }
 
-void deepcopy_VkPresentRegionsKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPresentRegionsKHR* from,
-    VkPresentRegionsKHR* to)
-{
+void deepcopy_VkPresentRegionsKHR(Allocator* alloc, VkStructureType rootType,
+                                  const VkPresentRegionsKHR* from, VkPresentRegionsKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pRegions = nullptr;
-        if (from->pRegions)
-        {
-            to->pRegions = (VkPresentRegionKHR*)alloc->alloc(from->swapchainCount * sizeof(const VkPresentRegionKHR));
+        if (from->pRegions) {
+            to->pRegions = (VkPresentRegionKHR*)alloc->alloc(from->swapchainCount *
+                                                             sizeof(const VkPresentRegionKHR));
             to->swapchainCount = from->swapchainCount;
-            for (uint32_t i = 0; i < (uint32_t)from->swapchainCount; ++i)
-            {
-                deepcopy_VkPresentRegionKHR(alloc, rootType, from->pRegions + i, (VkPresentRegionKHR*)(to->pRegions + i));
+            for (uint32_t i = 0; i < (uint32_t)from->swapchainCount; ++i) {
+                deepcopy_VkPresentRegionKHR(alloc, rootType, from->pRegions + i,
+                                            (VkPresentRegionKHR*)(to->pRegions + i));
             }
         }
     }
@@ -8329,28 +6777,22 @@
 #endif
 #ifdef VK_KHR_shared_presentable_image
 void deepcopy_VkSharedPresentSurfaceCapabilitiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSharedPresentSurfaceCapabilitiesKHR* from,
-    VkSharedPresentSurfaceCapabilitiesKHR* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkSharedPresentSurfaceCapabilitiesKHR* from,
+    VkSharedPresentSurfaceCapabilitiesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -8362,90 +6804,72 @@
 #ifdef VK_KHR_external_fence
 #endif
 #ifdef VK_KHR_external_fence_win32
-void deepcopy_VkImportFenceWin32HandleInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImportFenceWin32HandleInfoKHR* from,
-    VkImportFenceWin32HandleInfoKHR* to)
-{
+void deepcopy_VkImportFenceWin32HandleInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                              const VkImportFenceWin32HandleInfoKHR* from,
+                                              VkImportFenceWin32HandleInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkExportFenceWin32HandleInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExportFenceWin32HandleInfoKHR* from,
-    VkExportFenceWin32HandleInfoKHR* to)
-{
+void deepcopy_VkExportFenceWin32HandleInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                              const VkExportFenceWin32HandleInfoKHR* from,
+                                              VkExportFenceWin32HandleInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pAttributes = nullptr;
-    if (from->pAttributes)
-    {
-        to->pAttributes = (SECURITY_ATTRIBUTES*)alloc->dupArray(from->pAttributes, sizeof(const SECURITY_ATTRIBUTES));
+    if (from->pAttributes) {
+        to->pAttributes = (SECURITY_ATTRIBUTES*)alloc->dupArray(from->pAttributes,
+                                                                sizeof(const SECURITY_ATTRIBUTES));
     }
 }
 
-void deepcopy_VkFenceGetWin32HandleInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkFenceGetWin32HandleInfoKHR* from,
-    VkFenceGetWin32HandleInfoKHR* to)
-{
+void deepcopy_VkFenceGetWin32HandleInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                           const VkFenceGetWin32HandleInfoKHR* from,
+                                           VkFenceGetWin32HandleInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -8453,57 +6877,44 @@
 
 #endif
 #ifdef VK_KHR_external_fence_fd
-void deepcopy_VkImportFenceFdInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImportFenceFdInfoKHR* from,
-    VkImportFenceFdInfoKHR* to)
-{
+void deepcopy_VkImportFenceFdInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                     const VkImportFenceFdInfoKHR* from,
+                                     VkImportFenceFdInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkFenceGetFdInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkFenceGetFdInfoKHR* from,
-    VkFenceGetFdInfoKHR* to)
-{
+void deepcopy_VkFenceGetFdInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                  const VkFenceGetFdInfoKHR* from, VkFenceGetFdInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -8512,113 +6923,91 @@
 #endif
 #ifdef VK_KHR_performance_query
 void deepcopy_VkPhysicalDevicePerformanceQueryFeaturesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDevicePerformanceQueryFeaturesKHR* from,
-    VkPhysicalDevicePerformanceQueryFeaturesKHR* to)
-{
+    VkPhysicalDevicePerformanceQueryFeaturesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDevicePerformanceQueryPropertiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDevicePerformanceQueryPropertiesKHR* from,
-    VkPhysicalDevicePerformanceQueryPropertiesKHR* to)
-{
+    VkPhysicalDevicePerformanceQueryPropertiesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkPerformanceCounterKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPerformanceCounterKHR* from,
-    VkPerformanceCounterKHR* to)
-{
+void deepcopy_VkPerformanceCounterKHR(Allocator* alloc, VkStructureType rootType,
+                                      const VkPerformanceCounterKHR* from,
+                                      VkPerformanceCounterKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     memcpy(to->uuid, from->uuid, VK_UUID_SIZE * sizeof(uint8_t));
 }
 
-void deepcopy_VkPerformanceCounterDescriptionKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPerformanceCounterDescriptionKHR* from,
-    VkPerformanceCounterDescriptionKHR* to)
-{
+void deepcopy_VkPerformanceCounterDescriptionKHR(Allocator* alloc, VkStructureType rootType,
+                                                 const VkPerformanceCounterDescriptionKHR* from,
+                                                 VkPerformanceCounterDescriptionKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -8627,101 +7016,80 @@
     memcpy(to->description, from->description, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
 }
 
-void deepcopy_VkQueryPoolPerformanceCreateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkQueryPoolPerformanceCreateInfoKHR* from,
-    VkQueryPoolPerformanceCreateInfoKHR* to)
-{
+void deepcopy_VkQueryPoolPerformanceCreateInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                                  const VkQueryPoolPerformanceCreateInfoKHR* from,
+                                                  VkQueryPoolPerformanceCreateInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pCounterIndices = nullptr;
-    if (from->pCounterIndices)
-    {
-        to->pCounterIndices = (uint32_t*)alloc->dupArray(from->pCounterIndices, from->counterIndexCount * sizeof(const uint32_t));
+    if (from->pCounterIndices) {
+        to->pCounterIndices = (uint32_t*)alloc->dupArray(
+            from->pCounterIndices, from->counterIndexCount * sizeof(const uint32_t));
     }
 }
 
-void deepcopy_VkPerformanceCounterResultKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPerformanceCounterResultKHR* from,
-    VkPerformanceCounterResultKHR* to)
-{
+void deepcopy_VkPerformanceCounterResultKHR(Allocator* alloc, VkStructureType rootType,
+                                            const VkPerformanceCounterResultKHR* from,
+                                            VkPerformanceCounterResultKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkAcquireProfilingLockInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAcquireProfilingLockInfoKHR* from,
-    VkAcquireProfilingLockInfoKHR* to)
-{
+void deepcopy_VkAcquireProfilingLockInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                            const VkAcquireProfilingLockInfoKHR* from,
+                                            VkAcquireProfilingLockInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkPerformanceQuerySubmitInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPerformanceQuerySubmitInfoKHR* from,
-    VkPerformanceQuerySubmitInfoKHR* to)
-{
+void deepcopy_VkPerformanceQuerySubmitInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                              const VkPerformanceQuerySubmitInfoKHR* from,
+                                              VkPerformanceQuerySubmitInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -8731,238 +7099,196 @@
 #ifdef VK_KHR_maintenance2
 #endif
 #ifdef VK_KHR_get_surface_capabilities2
-void deepcopy_VkPhysicalDeviceSurfaceInfo2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceSurfaceInfo2KHR* from,
-    VkPhysicalDeviceSurfaceInfo2KHR* to)
-{
+void deepcopy_VkPhysicalDeviceSurfaceInfo2KHR(Allocator* alloc, VkStructureType rootType,
+                                              const VkPhysicalDeviceSurfaceInfo2KHR* from,
+                                              VkPhysicalDeviceSurfaceInfo2KHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkSurfaceCapabilities2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSurfaceCapabilities2KHR* from,
-    VkSurfaceCapabilities2KHR* to)
-{
+void deepcopy_VkSurfaceCapabilities2KHR(Allocator* alloc, VkStructureType rootType,
+                                        const VkSurfaceCapabilities2KHR* from,
+                                        VkSurfaceCapabilities2KHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkSurfaceCapabilitiesKHR(alloc, rootType, &from->surfaceCapabilities, (VkSurfaceCapabilitiesKHR*)(&to->surfaceCapabilities));
+    deepcopy_VkSurfaceCapabilitiesKHR(alloc, rootType, &from->surfaceCapabilities,
+                                      (VkSurfaceCapabilitiesKHR*)(&to->surfaceCapabilities));
 }
 
-void deepcopy_VkSurfaceFormat2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSurfaceFormat2KHR* from,
-    VkSurfaceFormat2KHR* to)
-{
+void deepcopy_VkSurfaceFormat2KHR(Allocator* alloc, VkStructureType rootType,
+                                  const VkSurfaceFormat2KHR* from, VkSurfaceFormat2KHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkSurfaceFormatKHR(alloc, rootType, &from->surfaceFormat, (VkSurfaceFormatKHR*)(&to->surfaceFormat));
+    deepcopy_VkSurfaceFormatKHR(alloc, rootType, &from->surfaceFormat,
+                                (VkSurfaceFormatKHR*)(&to->surfaceFormat));
 }
 
 #endif
 #ifdef VK_KHR_variable_pointers
 #endif
 #ifdef VK_KHR_get_display_properties2
-void deepcopy_VkDisplayProperties2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDisplayProperties2KHR* from,
-    VkDisplayProperties2KHR* to)
-{
+void deepcopy_VkDisplayProperties2KHR(Allocator* alloc, VkStructureType rootType,
+                                      const VkDisplayProperties2KHR* from,
+                                      VkDisplayProperties2KHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkDisplayPropertiesKHR(alloc, rootType, &from->displayProperties, (VkDisplayPropertiesKHR*)(&to->displayProperties));
+    deepcopy_VkDisplayPropertiesKHR(alloc, rootType, &from->displayProperties,
+                                    (VkDisplayPropertiesKHR*)(&to->displayProperties));
 }
 
-void deepcopy_VkDisplayPlaneProperties2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDisplayPlaneProperties2KHR* from,
-    VkDisplayPlaneProperties2KHR* to)
-{
+void deepcopy_VkDisplayPlaneProperties2KHR(Allocator* alloc, VkStructureType rootType,
+                                           const VkDisplayPlaneProperties2KHR* from,
+                                           VkDisplayPlaneProperties2KHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkDisplayPlanePropertiesKHR(alloc, rootType, &from->displayPlaneProperties, (VkDisplayPlanePropertiesKHR*)(&to->displayPlaneProperties));
+    deepcopy_VkDisplayPlanePropertiesKHR(
+        alloc, rootType, &from->displayPlaneProperties,
+        (VkDisplayPlanePropertiesKHR*)(&to->displayPlaneProperties));
 }
 
-void deepcopy_VkDisplayModeProperties2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDisplayModeProperties2KHR* from,
-    VkDisplayModeProperties2KHR* to)
-{
+void deepcopy_VkDisplayModeProperties2KHR(Allocator* alloc, VkStructureType rootType,
+                                          const VkDisplayModeProperties2KHR* from,
+                                          VkDisplayModeProperties2KHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkDisplayModePropertiesKHR(alloc, rootType, &from->displayModeProperties, (VkDisplayModePropertiesKHR*)(&to->displayModeProperties));
+    deepcopy_VkDisplayModePropertiesKHR(alloc, rootType, &from->displayModeProperties,
+                                        (VkDisplayModePropertiesKHR*)(&to->displayModeProperties));
 }
 
-void deepcopy_VkDisplayPlaneInfo2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDisplayPlaneInfo2KHR* from,
-    VkDisplayPlaneInfo2KHR* to)
-{
+void deepcopy_VkDisplayPlaneInfo2KHR(Allocator* alloc, VkStructureType rootType,
+                                     const VkDisplayPlaneInfo2KHR* from,
+                                     VkDisplayPlaneInfo2KHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkDisplayPlaneCapabilities2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDisplayPlaneCapabilities2KHR* from,
-    VkDisplayPlaneCapabilities2KHR* to)
-{
+void deepcopy_VkDisplayPlaneCapabilities2KHR(Allocator* alloc, VkStructureType rootType,
+                                             const VkDisplayPlaneCapabilities2KHR* from,
+                                             VkDisplayPlaneCapabilities2KHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkDisplayPlaneCapabilitiesKHR(alloc, rootType, &from->capabilities, (VkDisplayPlaneCapabilitiesKHR*)(&to->capabilities));
+    deepcopy_VkDisplayPlaneCapabilitiesKHR(alloc, rootType, &from->capabilities,
+                                           (VkDisplayPlaneCapabilitiesKHR*)(&to->capabilities));
 }
 
 #endif
@@ -8982,56 +7308,46 @@
 #endif
 #ifdef VK_KHR_portability_subset
 void deepcopy_VkPhysicalDevicePortabilitySubsetFeaturesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDevicePortabilitySubsetFeaturesKHR* from,
-    VkPhysicalDevicePortabilitySubsetFeaturesKHR* to)
-{
+    VkPhysicalDevicePortabilitySubsetFeaturesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDevicePortabilitySubsetPropertiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDevicePortabilitySubsetPropertiesKHR* from,
-    VkPhysicalDevicePortabilitySubsetPropertiesKHR* to)
-{
+    VkPhysicalDevicePortabilitySubsetPropertiesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -9050,28 +7366,22 @@
 #endif
 #ifdef VK_KHR_shader_clock
 void deepcopy_VkPhysicalDeviceShaderClockFeaturesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceShaderClockFeaturesKHR* from,
-    VkPhysicalDeviceShaderClockFeaturesKHR* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDeviceShaderClockFeaturesKHR* from,
+    VkPhysicalDeviceShaderClockFeaturesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -9092,28 +7402,23 @@
 #endif
 #ifdef VK_KHR_shader_terminate_invocation
 void deepcopy_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* from,
-    VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* to)
-{
+    VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -9122,63 +7427,55 @@
 #endif
 #ifdef VK_KHR_fragment_shading_rate
 void deepcopy_VkFragmentShadingRateAttachmentInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkFragmentShadingRateAttachmentInfoKHR* from,
-    VkFragmentShadingRateAttachmentInfoKHR* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkFragmentShadingRateAttachmentInfoKHR* from,
+    VkFragmentShadingRateAttachmentInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pFragmentShadingRateAttachment = nullptr;
-    if (from->pFragmentShadingRateAttachment)
-    {
-        to->pFragmentShadingRateAttachment = (VkAttachmentReference2*)alloc->alloc(sizeof(const VkAttachmentReference2));
-        deepcopy_VkAttachmentReference2(alloc, rootType, from->pFragmentShadingRateAttachment, (VkAttachmentReference2*)(to->pFragmentShadingRateAttachment));
+    if (from->pFragmentShadingRateAttachment) {
+        to->pFragmentShadingRateAttachment =
+            (VkAttachmentReference2*)alloc->alloc(sizeof(const VkAttachmentReference2));
+        deepcopy_VkAttachmentReference2(
+            alloc, rootType, from->pFragmentShadingRateAttachment,
+            (VkAttachmentReference2*)(to->pFragmentShadingRateAttachment));
     }
-    deepcopy_VkExtent2D(alloc, rootType, &from->shadingRateAttachmentTexelSize, (VkExtent2D*)(&to->shadingRateAttachmentTexelSize));
+    deepcopy_VkExtent2D(alloc, rootType, &from->shadingRateAttachmentTexelSize,
+                        (VkExtent2D*)(&to->shadingRateAttachmentTexelSize));
 }
 
 void deepcopy_VkPipelineFragmentShadingRateStateCreateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineFragmentShadingRateStateCreateInfoKHR* from,
-    VkPipelineFragmentShadingRateStateCreateInfoKHR* to)
-{
+    VkPipelineFragmentShadingRateStateCreateInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -9187,87 +7484,74 @@
 }
 
 void deepcopy_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateFeaturesKHR* from,
-    VkPhysicalDeviceFragmentShadingRateFeaturesKHR* to)
-{
+    VkPhysicalDeviceFragmentShadingRateFeaturesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRatePropertiesKHR* from,
-    VkPhysicalDeviceFragmentShadingRatePropertiesKHR* to)
-{
+    VkPhysicalDeviceFragmentShadingRatePropertiesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    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->minFragmentShadingRateAttachmentTexelSize, (VkExtent2D*)(&to->minFragmentShadingRateAttachmentTexelSize));
-    deepcopy_VkExtent2D(alloc, rootType, &from->maxFragmentShadingRateAttachmentTexelSize, (VkExtent2D*)(&to->maxFragmentShadingRateAttachmentTexelSize));
-    deepcopy_VkExtent2D(alloc, rootType, &from->maxFragmentSize, (VkExtent2D*)(&to->maxFragmentSize));
+    deepcopy_VkExtent2D(alloc, rootType, &from->minFragmentShadingRateAttachmentTexelSize,
+                        (VkExtent2D*)(&to->minFragmentShadingRateAttachmentTexelSize));
+    deepcopy_VkExtent2D(alloc, rootType, &from->maxFragmentShadingRateAttachmentTexelSize,
+                        (VkExtent2D*)(&to->maxFragmentShadingRateAttachmentTexelSize));
+    deepcopy_VkExtent2D(alloc, rootType, &from->maxFragmentSize,
+                        (VkExtent2D*)(&to->maxFragmentSize));
 }
 
 void deepcopy_VkPhysicalDeviceFragmentShadingRateKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceFragmentShadingRateKHR* from,
-    VkPhysicalDeviceFragmentShadingRateKHR* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDeviceFragmentShadingRateKHR* from,
+    VkPhysicalDeviceFragmentShadingRateKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -9278,29 +7562,23 @@
 #ifdef VK_KHR_spirv_1_4
 #endif
 #ifdef VK_KHR_surface_protected_capabilities
-void deepcopy_VkSurfaceProtectedCapabilitiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSurfaceProtectedCapabilitiesKHR* from,
-    VkSurfaceProtectedCapabilitiesKHR* to)
-{
+void deepcopy_VkSurfaceProtectedCapabilitiesKHR(Allocator* alloc, VkStructureType rootType,
+                                                const VkSurfaceProtectedCapabilitiesKHR* from,
+                                                VkSurfaceProtectedCapabilitiesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -9311,28 +7589,22 @@
 #endif
 #ifdef VK_KHR_present_wait
 void deepcopy_VkPhysicalDevicePresentWaitFeaturesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDevicePresentWaitFeaturesKHR* from,
-    VkPhysicalDevicePresentWaitFeaturesKHR* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDevicePresentWaitFeaturesKHR* from,
+    VkPhysicalDevicePresentWaitFeaturesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -9347,84 +7619,66 @@
 #endif
 #ifdef VK_KHR_pipeline_executable_properties
 void deepcopy_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* from,
-    VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* to)
-{
+    VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkPipelineInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineInfoKHR* from,
-    VkPipelineInfoKHR* to)
-{
+void deepcopy_VkPipelineInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                const VkPipelineInfoKHR* from, VkPipelineInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkPipelineExecutablePropertiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineExecutablePropertiesKHR* from,
-    VkPipelineExecutablePropertiesKHR* to)
-{
+void deepcopy_VkPipelineExecutablePropertiesKHR(Allocator* alloc, VkStructureType rootType,
+                                                const VkPipelineExecutablePropertiesKHR* from,
+                                                VkPipelineExecutablePropertiesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -9432,107 +7686,87 @@
     memcpy(to->description, from->description, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
 }
 
-void deepcopy_VkPipelineExecutableInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineExecutableInfoKHR* from,
-    VkPipelineExecutableInfoKHR* to)
-{
+void deepcopy_VkPipelineExecutableInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                          const VkPipelineExecutableInfoKHR* from,
+                                          VkPipelineExecutableInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPipelineExecutableStatisticValueKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineExecutableStatisticValueKHR* from,
-    VkPipelineExecutableStatisticValueKHR* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkPipelineExecutableStatisticValueKHR* from,
+    VkPipelineExecutableStatisticValueKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkPipelineExecutableStatisticKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineExecutableStatisticKHR* from,
-    VkPipelineExecutableStatisticKHR* to)
-{
+void deepcopy_VkPipelineExecutableStatisticKHR(Allocator* alloc, VkStructureType rootType,
+                                               const VkPipelineExecutableStatisticKHR* from,
+                                               VkPipelineExecutableStatisticKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     memcpy(to->name, from->name, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
     memcpy(to->description, from->description, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
-    deepcopy_VkPipelineExecutableStatisticValueKHR(alloc, rootType, &from->value, (VkPipelineExecutableStatisticValueKHR*)(&to->value));
+    deepcopy_VkPipelineExecutableStatisticValueKHR(
+        alloc, rootType, &from->value, (VkPipelineExecutableStatisticValueKHR*)(&to->value));
 }
 
 void deepcopy_VkPipelineExecutableInternalRepresentationKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineExecutableInternalRepresentationKHR* from,
-    VkPipelineExecutableInternalRepresentationKHR* to)
-{
+    VkPipelineExecutableInternalRepresentationKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     memcpy(to->name, from->name, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
     memcpy(to->description, from->description, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
     to->pData = nullptr;
-    if (from->pData)
-    {
+    if (from->pData) {
         to->pData = (void*)alloc->dupArray(from->pData, from->dataSize * sizeof(uint8_t));
     }
 }
@@ -9540,56 +7774,46 @@
 #endif
 #ifdef VK_KHR_shader_integer_dot_product
 void deepcopy_VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR* from,
-    VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR* to)
-{
+    VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR* from,
-    VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR* to)
-{
+    VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -9597,36 +7821,30 @@
 
 #endif
 #ifdef VK_KHR_pipeline_library
-void deepcopy_VkPipelineLibraryCreateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineLibraryCreateInfoKHR* from,
-    VkPipelineLibraryCreateInfoKHR* to)
-{
+void deepcopy_VkPipelineLibraryCreateInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                             const VkPipelineLibraryCreateInfoKHR* from,
+                                             VkPipelineLibraryCreateInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pLibraries = nullptr;
-    if (from->pLibraries)
-    {
-        to->pLibraries = (VkPipeline*)alloc->dupArray(from->pLibraries, from->libraryCount * sizeof(const VkPipeline));
+    if (from->pLibraries) {
+        to->pLibraries = (VkPipeline*)alloc->dupArray(
+            from->pLibraries, from->libraryCount * sizeof(const VkPipeline));
     }
 }
 
@@ -9634,62 +7852,49 @@
 #ifdef VK_KHR_shader_non_semantic_info
 #endif
 #ifdef VK_KHR_present_id
-void deepcopy_VkPresentIdKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPresentIdKHR* from,
-    VkPresentIdKHR* to)
-{
+void deepcopy_VkPresentIdKHR(Allocator* alloc, VkStructureType rootType, const VkPresentIdKHR* from,
+                             VkPresentIdKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pPresentIds = nullptr;
-    if (from->pPresentIds)
-    {
-        to->pPresentIds = (uint64_t*)alloc->dupArray(from->pPresentIds, from->swapchainCount * sizeof(const uint64_t));
+    if (from->pPresentIds) {
+        to->pPresentIds = (uint64_t*)alloc->dupArray(from->pPresentIds,
+                                                     from->swapchainCount * sizeof(const uint64_t));
     }
 }
 
-void deepcopy_VkPhysicalDevicePresentIdFeaturesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDevicePresentIdFeaturesKHR* from,
-    VkPhysicalDevicePresentIdFeaturesKHR* to)
-{
+void deepcopy_VkPhysicalDevicePresentIdFeaturesKHR(Allocator* alloc, VkStructureType rootType,
+                                                   const VkPhysicalDevicePresentIdFeaturesKHR* from,
+                                                   VkPhysicalDevicePresentIdFeaturesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -9697,78 +7902,67 @@
 
 #endif
 #ifdef VK_KHR_video_encode_queue
-void deepcopy_VkVideoEncodeInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoEncodeInfoKHR* from,
-    VkVideoEncodeInfoKHR* to)
-{
+void deepcopy_VkVideoEncodeInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                   const VkVideoEncodeInfoKHR* from, VkVideoEncodeInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    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->codedExtent, (VkExtent2D*)(&to->codedExtent));
-    deepcopy_VkVideoPictureResourceKHR(alloc, rootType, &from->srcPictureResource, (VkVideoPictureResourceKHR*)(&to->srcPictureResource));
+    deepcopy_VkVideoPictureResourceKHR(alloc, rootType, &from->srcPictureResource,
+                                       (VkVideoPictureResourceKHR*)(&to->srcPictureResource));
     to->pSetupReferenceSlot = nullptr;
-    if (from->pSetupReferenceSlot)
-    {
-        to->pSetupReferenceSlot = (VkVideoReferenceSlotKHR*)alloc->alloc(sizeof(const VkVideoReferenceSlotKHR));
-        deepcopy_VkVideoReferenceSlotKHR(alloc, rootType, from->pSetupReferenceSlot, (VkVideoReferenceSlotKHR*)(to->pSetupReferenceSlot));
+    if (from->pSetupReferenceSlot) {
+        to->pSetupReferenceSlot =
+            (VkVideoReferenceSlotKHR*)alloc->alloc(sizeof(const VkVideoReferenceSlotKHR));
+        deepcopy_VkVideoReferenceSlotKHR(alloc, rootType, from->pSetupReferenceSlot,
+                                         (VkVideoReferenceSlotKHR*)(to->pSetupReferenceSlot));
     }
-    if (from)
-    {
+    if (from) {
         to->pReferenceSlots = nullptr;
-        if (from->pReferenceSlots)
-        {
-            to->pReferenceSlots = (VkVideoReferenceSlotKHR*)alloc->alloc(from->referenceSlotCount * sizeof(const VkVideoReferenceSlotKHR));
+        if (from->pReferenceSlots) {
+            to->pReferenceSlots = (VkVideoReferenceSlotKHR*)alloc->alloc(
+                from->referenceSlotCount * sizeof(const VkVideoReferenceSlotKHR));
             to->referenceSlotCount = from->referenceSlotCount;
-            for (uint32_t i = 0; i < (uint32_t)from->referenceSlotCount; ++i)
-            {
-                deepcopy_VkVideoReferenceSlotKHR(alloc, rootType, from->pReferenceSlots + i, (VkVideoReferenceSlotKHR*)(to->pReferenceSlots + i));
+            for (uint32_t i = 0; i < (uint32_t)from->referenceSlotCount; ++i) {
+                deepcopy_VkVideoReferenceSlotKHR(
+                    alloc, rootType, from->pReferenceSlots + i,
+                    (VkVideoReferenceSlotKHR*)(to->pReferenceSlots + i));
             }
         }
     }
 }
 
-void deepcopy_VkVideoEncodeRateControlInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoEncodeRateControlInfoKHR* from,
-    VkVideoEncodeRateControlInfoKHR* to)
-{
+void deepcopy_VkVideoEncodeRateControlInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                              const VkVideoEncodeRateControlInfoKHR* from,
+                                              VkVideoEncodeRateControlInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -9776,366 +7970,302 @@
 
 #endif
 #ifdef VK_KHR_synchronization2
-void deepcopy_VkMemoryBarrier2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryBarrier2KHR* from,
-    VkMemoryBarrier2KHR* to)
-{
+void deepcopy_VkMemoryBarrier2KHR(Allocator* alloc, VkStructureType rootType,
+                                  const VkMemoryBarrier2KHR* from, VkMemoryBarrier2KHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkBufferMemoryBarrier2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBufferMemoryBarrier2KHR* from,
-    VkBufferMemoryBarrier2KHR* to)
-{
+void deepcopy_VkBufferMemoryBarrier2KHR(Allocator* alloc, VkStructureType rootType,
+                                        const VkBufferMemoryBarrier2KHR* from,
+                                        VkBufferMemoryBarrier2KHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkImageMemoryBarrier2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageMemoryBarrier2KHR* from,
-    VkImageMemoryBarrier2KHR* to)
-{
+void deepcopy_VkImageMemoryBarrier2KHR(Allocator* alloc, VkStructureType rootType,
+                                       const VkImageMemoryBarrier2KHR* from,
+                                       VkImageMemoryBarrier2KHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkImageSubresourceRange(alloc, rootType, &from->subresourceRange, (VkImageSubresourceRange*)(&to->subresourceRange));
+    deepcopy_VkImageSubresourceRange(alloc, rootType, &from->subresourceRange,
+                                     (VkImageSubresourceRange*)(&to->subresourceRange));
 }
 
-void deepcopy_VkDependencyInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDependencyInfoKHR* from,
-    VkDependencyInfoKHR* to)
-{
+void deepcopy_VkDependencyInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                  const VkDependencyInfoKHR* from, VkDependencyInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pMemoryBarriers = nullptr;
-        if (from->pMemoryBarriers)
-        {
-            to->pMemoryBarriers = (VkMemoryBarrier2KHR*)alloc->alloc(from->memoryBarrierCount * sizeof(const VkMemoryBarrier2KHR));
+        if (from->pMemoryBarriers) {
+            to->pMemoryBarriers = (VkMemoryBarrier2KHR*)alloc->alloc(
+                from->memoryBarrierCount * sizeof(const VkMemoryBarrier2KHR));
             to->memoryBarrierCount = from->memoryBarrierCount;
-            for (uint32_t i = 0; i < (uint32_t)from->memoryBarrierCount; ++i)
-            {
-                deepcopy_VkMemoryBarrier2KHR(alloc, rootType, from->pMemoryBarriers + i, (VkMemoryBarrier2KHR*)(to->pMemoryBarriers + i));
+            for (uint32_t i = 0; i < (uint32_t)from->memoryBarrierCount; ++i) {
+                deepcopy_VkMemoryBarrier2KHR(alloc, rootType, from->pMemoryBarriers + i,
+                                             (VkMemoryBarrier2KHR*)(to->pMemoryBarriers + i));
             }
         }
     }
-    if (from)
-    {
+    if (from) {
         to->pBufferMemoryBarriers = nullptr;
-        if (from->pBufferMemoryBarriers)
-        {
-            to->pBufferMemoryBarriers = (VkBufferMemoryBarrier2KHR*)alloc->alloc(from->bufferMemoryBarrierCount * sizeof(const VkBufferMemoryBarrier2KHR));
+        if (from->pBufferMemoryBarriers) {
+            to->pBufferMemoryBarriers = (VkBufferMemoryBarrier2KHR*)alloc->alloc(
+                from->bufferMemoryBarrierCount * sizeof(const VkBufferMemoryBarrier2KHR));
             to->bufferMemoryBarrierCount = from->bufferMemoryBarrierCount;
-            for (uint32_t i = 0; i < (uint32_t)from->bufferMemoryBarrierCount; ++i)
-            {
-                deepcopy_VkBufferMemoryBarrier2KHR(alloc, rootType, from->pBufferMemoryBarriers + i, (VkBufferMemoryBarrier2KHR*)(to->pBufferMemoryBarriers + i));
+            for (uint32_t i = 0; i < (uint32_t)from->bufferMemoryBarrierCount; ++i) {
+                deepcopy_VkBufferMemoryBarrier2KHR(
+                    alloc, rootType, from->pBufferMemoryBarriers + i,
+                    (VkBufferMemoryBarrier2KHR*)(to->pBufferMemoryBarriers + i));
             }
         }
     }
-    if (from)
-    {
+    if (from) {
         to->pImageMemoryBarriers = nullptr;
-        if (from->pImageMemoryBarriers)
-        {
-            to->pImageMemoryBarriers = (VkImageMemoryBarrier2KHR*)alloc->alloc(from->imageMemoryBarrierCount * sizeof(const VkImageMemoryBarrier2KHR));
+        if (from->pImageMemoryBarriers) {
+            to->pImageMemoryBarriers = (VkImageMemoryBarrier2KHR*)alloc->alloc(
+                from->imageMemoryBarrierCount * sizeof(const VkImageMemoryBarrier2KHR));
             to->imageMemoryBarrierCount = from->imageMemoryBarrierCount;
-            for (uint32_t i = 0; i < (uint32_t)from->imageMemoryBarrierCount; ++i)
-            {
-                deepcopy_VkImageMemoryBarrier2KHR(alloc, rootType, from->pImageMemoryBarriers + i, (VkImageMemoryBarrier2KHR*)(to->pImageMemoryBarriers + i));
+            for (uint32_t i = 0; i < (uint32_t)from->imageMemoryBarrierCount; ++i) {
+                deepcopy_VkImageMemoryBarrier2KHR(
+                    alloc, rootType, from->pImageMemoryBarriers + i,
+                    (VkImageMemoryBarrier2KHR*)(to->pImageMemoryBarriers + i));
             }
         }
     }
 }
 
-void deepcopy_VkSemaphoreSubmitInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSemaphoreSubmitInfoKHR* from,
-    VkSemaphoreSubmitInfoKHR* to)
-{
+void deepcopy_VkSemaphoreSubmitInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                       const VkSemaphoreSubmitInfoKHR* from,
+                                       VkSemaphoreSubmitInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkCommandBufferSubmitInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCommandBufferSubmitInfoKHR* from,
-    VkCommandBufferSubmitInfoKHR* to)
-{
+void deepcopy_VkCommandBufferSubmitInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                           const VkCommandBufferSubmitInfoKHR* from,
+                                           VkCommandBufferSubmitInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkSubmitInfo2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSubmitInfo2KHR* from,
-    VkSubmitInfo2KHR* to)
-{
+void deepcopy_VkSubmitInfo2KHR(Allocator* alloc, VkStructureType rootType,
+                               const VkSubmitInfo2KHR* from, VkSubmitInfo2KHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pWaitSemaphoreInfos = nullptr;
-        if (from->pWaitSemaphoreInfos)
-        {
-            to->pWaitSemaphoreInfos = (VkSemaphoreSubmitInfoKHR*)alloc->alloc(from->waitSemaphoreInfoCount * sizeof(const VkSemaphoreSubmitInfoKHR));
+        if (from->pWaitSemaphoreInfos) {
+            to->pWaitSemaphoreInfos = (VkSemaphoreSubmitInfoKHR*)alloc->alloc(
+                from->waitSemaphoreInfoCount * sizeof(const VkSemaphoreSubmitInfoKHR));
             to->waitSemaphoreInfoCount = from->waitSemaphoreInfoCount;
-            for (uint32_t i = 0; i < (uint32_t)from->waitSemaphoreInfoCount; ++i)
-            {
-                deepcopy_VkSemaphoreSubmitInfoKHR(alloc, rootType, from->pWaitSemaphoreInfos + i, (VkSemaphoreSubmitInfoKHR*)(to->pWaitSemaphoreInfos + i));
+            for (uint32_t i = 0; i < (uint32_t)from->waitSemaphoreInfoCount; ++i) {
+                deepcopy_VkSemaphoreSubmitInfoKHR(
+                    alloc, rootType, from->pWaitSemaphoreInfos + i,
+                    (VkSemaphoreSubmitInfoKHR*)(to->pWaitSemaphoreInfos + i));
             }
         }
     }
-    if (from)
-    {
+    if (from) {
         to->pCommandBufferInfos = nullptr;
-        if (from->pCommandBufferInfos)
-        {
-            to->pCommandBufferInfos = (VkCommandBufferSubmitInfoKHR*)alloc->alloc(from->commandBufferInfoCount * sizeof(const VkCommandBufferSubmitInfoKHR));
+        if (from->pCommandBufferInfos) {
+            to->pCommandBufferInfos = (VkCommandBufferSubmitInfoKHR*)alloc->alloc(
+                from->commandBufferInfoCount * sizeof(const VkCommandBufferSubmitInfoKHR));
             to->commandBufferInfoCount = from->commandBufferInfoCount;
-            for (uint32_t i = 0; i < (uint32_t)from->commandBufferInfoCount; ++i)
-            {
-                deepcopy_VkCommandBufferSubmitInfoKHR(alloc, rootType, from->pCommandBufferInfos + i, (VkCommandBufferSubmitInfoKHR*)(to->pCommandBufferInfos + i));
+            for (uint32_t i = 0; i < (uint32_t)from->commandBufferInfoCount; ++i) {
+                deepcopy_VkCommandBufferSubmitInfoKHR(
+                    alloc, rootType, from->pCommandBufferInfos + i,
+                    (VkCommandBufferSubmitInfoKHR*)(to->pCommandBufferInfos + i));
             }
         }
     }
-    if (from)
-    {
+    if (from) {
         to->pSignalSemaphoreInfos = nullptr;
-        if (from->pSignalSemaphoreInfos)
-        {
-            to->pSignalSemaphoreInfos = (VkSemaphoreSubmitInfoKHR*)alloc->alloc(from->signalSemaphoreInfoCount * sizeof(const VkSemaphoreSubmitInfoKHR));
+        if (from->pSignalSemaphoreInfos) {
+            to->pSignalSemaphoreInfos = (VkSemaphoreSubmitInfoKHR*)alloc->alloc(
+                from->signalSemaphoreInfoCount * sizeof(const VkSemaphoreSubmitInfoKHR));
             to->signalSemaphoreInfoCount = from->signalSemaphoreInfoCount;
-            for (uint32_t i = 0; i < (uint32_t)from->signalSemaphoreInfoCount; ++i)
-            {
-                deepcopy_VkSemaphoreSubmitInfoKHR(alloc, rootType, from->pSignalSemaphoreInfos + i, (VkSemaphoreSubmitInfoKHR*)(to->pSignalSemaphoreInfos + i));
+            for (uint32_t i = 0; i < (uint32_t)from->signalSemaphoreInfoCount; ++i) {
+                deepcopy_VkSemaphoreSubmitInfoKHR(
+                    alloc, rootType, from->pSignalSemaphoreInfos + i,
+                    (VkSemaphoreSubmitInfoKHR*)(to->pSignalSemaphoreInfos + i));
             }
         }
     }
 }
 
 void deepcopy_VkPhysicalDeviceSynchronization2FeaturesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceSynchronization2FeaturesKHR* from,
-    VkPhysicalDeviceSynchronization2FeaturesKHR* to)
-{
+    VkPhysicalDeviceSynchronization2FeaturesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkQueueFamilyCheckpointProperties2NV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkQueueFamilyCheckpointProperties2NV* from,
-    VkQueueFamilyCheckpointProperties2NV* to)
-{
+void deepcopy_VkQueueFamilyCheckpointProperties2NV(Allocator* alloc, VkStructureType rootType,
+                                                   const VkQueueFamilyCheckpointProperties2NV* from,
+                                                   VkQueueFamilyCheckpointProperties2NV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkCheckpointData2NV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCheckpointData2NV* from,
-    VkCheckpointData2NV* to)
-{
+void deepcopy_VkCheckpointData2NV(Allocator* alloc, VkStructureType rootType,
+                                  const VkCheckpointData2NV* from, VkCheckpointData2NV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pCheckpointMarker = nullptr;
-    if (from->pCheckpointMarker)
-    {
+    if (from->pCheckpointMarker) {
         to->pCheckpointMarker = (void*)alloc->dupArray(from->pCheckpointMarker, sizeof(uint8_t));
     }
 }
@@ -10143,28 +8273,23 @@
 #endif
 #ifdef VK_KHR_shader_subgroup_uniform_control_flow
 void deepcopy_VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR* from,
-    VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR* to)
-{
+    VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -10173,28 +8298,23 @@
 #endif
 #ifdef VK_KHR_zero_initialize_workgroup_memory
 void deepcopy_VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR* from,
-    VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR* to)
-{
+    VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -10203,28 +8323,23 @@
 #endif
 #ifdef VK_KHR_workgroup_memory_explicit_layout
 void deepcopy_VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR* from,
-    VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR* to)
-{
+    VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -10232,410 +8347,337 @@
 
 #endif
 #ifdef VK_KHR_copy_commands2
-void deepcopy_VkBufferCopy2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBufferCopy2KHR* from,
-    VkBufferCopy2KHR* to)
-{
+void deepcopy_VkBufferCopy2KHR(Allocator* alloc, VkStructureType rootType,
+                               const VkBufferCopy2KHR* from, VkBufferCopy2KHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkCopyBufferInfo2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCopyBufferInfo2KHR* from,
-    VkCopyBufferInfo2KHR* to)
-{
+void deepcopy_VkCopyBufferInfo2KHR(Allocator* alloc, VkStructureType rootType,
+                                   const VkCopyBufferInfo2KHR* from, VkCopyBufferInfo2KHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pRegions = nullptr;
-        if (from->pRegions)
-        {
-            to->pRegions = (VkBufferCopy2KHR*)alloc->alloc(from->regionCount * sizeof(const VkBufferCopy2KHR));
+        if (from->pRegions) {
+            to->pRegions =
+                (VkBufferCopy2KHR*)alloc->alloc(from->regionCount * sizeof(const VkBufferCopy2KHR));
             to->regionCount = from->regionCount;
-            for (uint32_t i = 0; i < (uint32_t)from->regionCount; ++i)
-            {
-                deepcopy_VkBufferCopy2KHR(alloc, rootType, from->pRegions + i, (VkBufferCopy2KHR*)(to->pRegions + i));
+            for (uint32_t i = 0; i < (uint32_t)from->regionCount; ++i) {
+                deepcopy_VkBufferCopy2KHR(alloc, rootType, from->pRegions + i,
+                                          (VkBufferCopy2KHR*)(to->pRegions + i));
             }
         }
     }
 }
 
-void deepcopy_VkImageCopy2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageCopy2KHR* from,
-    VkImageCopy2KHR* to)
-{
+void deepcopy_VkImageCopy2KHR(Allocator* alloc, VkStructureType rootType,
+                              const VkImageCopy2KHR* from, VkImageCopy2KHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkImageSubresourceLayers(alloc, rootType, &from->srcSubresource, (VkImageSubresourceLayers*)(&to->srcSubresource));
+    deepcopy_VkImageSubresourceLayers(alloc, rootType, &from->srcSubresource,
+                                      (VkImageSubresourceLayers*)(&to->srcSubresource));
     deepcopy_VkOffset3D(alloc, rootType, &from->srcOffset, (VkOffset3D*)(&to->srcOffset));
-    deepcopy_VkImageSubresourceLayers(alloc, rootType, &from->dstSubresource, (VkImageSubresourceLayers*)(&to->dstSubresource));
+    deepcopy_VkImageSubresourceLayers(alloc, rootType, &from->dstSubresource,
+                                      (VkImageSubresourceLayers*)(&to->dstSubresource));
     deepcopy_VkOffset3D(alloc, rootType, &from->dstOffset, (VkOffset3D*)(&to->dstOffset));
     deepcopy_VkExtent3D(alloc, rootType, &from->extent, (VkExtent3D*)(&to->extent));
 }
 
-void deepcopy_VkCopyImageInfo2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCopyImageInfo2KHR* from,
-    VkCopyImageInfo2KHR* to)
-{
+void deepcopy_VkCopyImageInfo2KHR(Allocator* alloc, VkStructureType rootType,
+                                  const VkCopyImageInfo2KHR* from, VkCopyImageInfo2KHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pRegions = nullptr;
-        if (from->pRegions)
-        {
-            to->pRegions = (VkImageCopy2KHR*)alloc->alloc(from->regionCount * sizeof(const VkImageCopy2KHR));
+        if (from->pRegions) {
+            to->pRegions =
+                (VkImageCopy2KHR*)alloc->alloc(from->regionCount * sizeof(const VkImageCopy2KHR));
             to->regionCount = from->regionCount;
-            for (uint32_t i = 0; i < (uint32_t)from->regionCount; ++i)
-            {
-                deepcopy_VkImageCopy2KHR(alloc, rootType, from->pRegions + i, (VkImageCopy2KHR*)(to->pRegions + i));
+            for (uint32_t i = 0; i < (uint32_t)from->regionCount; ++i) {
+                deepcopy_VkImageCopy2KHR(alloc, rootType, from->pRegions + i,
+                                         (VkImageCopy2KHR*)(to->pRegions + i));
             }
         }
     }
 }
 
-void deepcopy_VkBufferImageCopy2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBufferImageCopy2KHR* from,
-    VkBufferImageCopy2KHR* to)
-{
+void deepcopy_VkBufferImageCopy2KHR(Allocator* alloc, VkStructureType rootType,
+                                    const VkBufferImageCopy2KHR* from, VkBufferImageCopy2KHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkImageSubresourceLayers(alloc, rootType, &from->imageSubresource, (VkImageSubresourceLayers*)(&to->imageSubresource));
+    deepcopy_VkImageSubresourceLayers(alloc, rootType, &from->imageSubresource,
+                                      (VkImageSubresourceLayers*)(&to->imageSubresource));
     deepcopy_VkOffset3D(alloc, rootType, &from->imageOffset, (VkOffset3D*)(&to->imageOffset));
     deepcopy_VkExtent3D(alloc, rootType, &from->imageExtent, (VkExtent3D*)(&to->imageExtent));
 }
 
-void deepcopy_VkCopyBufferToImageInfo2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCopyBufferToImageInfo2KHR* from,
-    VkCopyBufferToImageInfo2KHR* to)
-{
+void deepcopy_VkCopyBufferToImageInfo2KHR(Allocator* alloc, VkStructureType rootType,
+                                          const VkCopyBufferToImageInfo2KHR* from,
+                                          VkCopyBufferToImageInfo2KHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pRegions = nullptr;
-        if (from->pRegions)
-        {
-            to->pRegions = (VkBufferImageCopy2KHR*)alloc->alloc(from->regionCount * sizeof(const VkBufferImageCopy2KHR));
+        if (from->pRegions) {
+            to->pRegions = (VkBufferImageCopy2KHR*)alloc->alloc(
+                from->regionCount * sizeof(const VkBufferImageCopy2KHR));
             to->regionCount = from->regionCount;
-            for (uint32_t i = 0; i < (uint32_t)from->regionCount; ++i)
-            {
-                deepcopy_VkBufferImageCopy2KHR(alloc, rootType, from->pRegions + i, (VkBufferImageCopy2KHR*)(to->pRegions + i));
+            for (uint32_t i = 0; i < (uint32_t)from->regionCount; ++i) {
+                deepcopy_VkBufferImageCopy2KHR(alloc, rootType, from->pRegions + i,
+                                               (VkBufferImageCopy2KHR*)(to->pRegions + i));
             }
         }
     }
 }
 
-void deepcopy_VkCopyImageToBufferInfo2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCopyImageToBufferInfo2KHR* from,
-    VkCopyImageToBufferInfo2KHR* to)
-{
+void deepcopy_VkCopyImageToBufferInfo2KHR(Allocator* alloc, VkStructureType rootType,
+                                          const VkCopyImageToBufferInfo2KHR* from,
+                                          VkCopyImageToBufferInfo2KHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pRegions = nullptr;
-        if (from->pRegions)
-        {
-            to->pRegions = (VkBufferImageCopy2KHR*)alloc->alloc(from->regionCount * sizeof(const VkBufferImageCopy2KHR));
+        if (from->pRegions) {
+            to->pRegions = (VkBufferImageCopy2KHR*)alloc->alloc(
+                from->regionCount * sizeof(const VkBufferImageCopy2KHR));
             to->regionCount = from->regionCount;
-            for (uint32_t i = 0; i < (uint32_t)from->regionCount; ++i)
-            {
-                deepcopy_VkBufferImageCopy2KHR(alloc, rootType, from->pRegions + i, (VkBufferImageCopy2KHR*)(to->pRegions + i));
+            for (uint32_t i = 0; i < (uint32_t)from->regionCount; ++i) {
+                deepcopy_VkBufferImageCopy2KHR(alloc, rootType, from->pRegions + i,
+                                               (VkBufferImageCopy2KHR*)(to->pRegions + i));
             }
         }
     }
 }
 
-void deepcopy_VkImageBlit2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageBlit2KHR* from,
-    VkImageBlit2KHR* to)
-{
+void deepcopy_VkImageBlit2KHR(Allocator* alloc, VkStructureType rootType,
+                              const VkImageBlit2KHR* from, VkImageBlit2KHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkImageSubresourceLayers(alloc, rootType, &from->srcSubresource, (VkImageSubresourceLayers*)(&to->srcSubresource));
-    for (uint32_t i = 0; i < (uint32_t)2; ++i)
-    {
-        deepcopy_VkOffset3D(alloc, rootType, from->srcOffsets + i, (VkOffset3D*)(to->srcOffsets + i));
+    deepcopy_VkImageSubresourceLayers(alloc, rootType, &from->srcSubresource,
+                                      (VkImageSubresourceLayers*)(&to->srcSubresource));
+    for (uint32_t i = 0; i < (uint32_t)2; ++i) {
+        deepcopy_VkOffset3D(alloc, rootType, from->srcOffsets + i,
+                            (VkOffset3D*)(to->srcOffsets + i));
     }
-    deepcopy_VkImageSubresourceLayers(alloc, rootType, &from->dstSubresource, (VkImageSubresourceLayers*)(&to->dstSubresource));
-    for (uint32_t i = 0; i < (uint32_t)2; ++i)
-    {
-        deepcopy_VkOffset3D(alloc, rootType, from->dstOffsets + i, (VkOffset3D*)(to->dstOffsets + i));
+    deepcopy_VkImageSubresourceLayers(alloc, rootType, &from->dstSubresource,
+                                      (VkImageSubresourceLayers*)(&to->dstSubresource));
+    for (uint32_t i = 0; i < (uint32_t)2; ++i) {
+        deepcopy_VkOffset3D(alloc, rootType, from->dstOffsets + i,
+                            (VkOffset3D*)(to->dstOffsets + i));
     }
 }
 
-void deepcopy_VkBlitImageInfo2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBlitImageInfo2KHR* from,
-    VkBlitImageInfo2KHR* to)
-{
+void deepcopy_VkBlitImageInfo2KHR(Allocator* alloc, VkStructureType rootType,
+                                  const VkBlitImageInfo2KHR* from, VkBlitImageInfo2KHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pRegions = nullptr;
-        if (from->pRegions)
-        {
-            to->pRegions = (VkImageBlit2KHR*)alloc->alloc(from->regionCount * sizeof(const VkImageBlit2KHR));
+        if (from->pRegions) {
+            to->pRegions =
+                (VkImageBlit2KHR*)alloc->alloc(from->regionCount * sizeof(const VkImageBlit2KHR));
             to->regionCount = from->regionCount;
-            for (uint32_t i = 0; i < (uint32_t)from->regionCount; ++i)
-            {
-                deepcopy_VkImageBlit2KHR(alloc, rootType, from->pRegions + i, (VkImageBlit2KHR*)(to->pRegions + i));
+            for (uint32_t i = 0; i < (uint32_t)from->regionCount; ++i) {
+                deepcopy_VkImageBlit2KHR(alloc, rootType, from->pRegions + i,
+                                         (VkImageBlit2KHR*)(to->pRegions + i));
             }
         }
     }
 }
 
-void deepcopy_VkImageResolve2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageResolve2KHR* from,
-    VkImageResolve2KHR* to)
-{
+void deepcopy_VkImageResolve2KHR(Allocator* alloc, VkStructureType rootType,
+                                 const VkImageResolve2KHR* from, VkImageResolve2KHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkImageSubresourceLayers(alloc, rootType, &from->srcSubresource, (VkImageSubresourceLayers*)(&to->srcSubresource));
+    deepcopy_VkImageSubresourceLayers(alloc, rootType, &from->srcSubresource,
+                                      (VkImageSubresourceLayers*)(&to->srcSubresource));
     deepcopy_VkOffset3D(alloc, rootType, &from->srcOffset, (VkOffset3D*)(&to->srcOffset));
-    deepcopy_VkImageSubresourceLayers(alloc, rootType, &from->dstSubresource, (VkImageSubresourceLayers*)(&to->dstSubresource));
+    deepcopy_VkImageSubresourceLayers(alloc, rootType, &from->dstSubresource,
+                                      (VkImageSubresourceLayers*)(&to->dstSubresource));
     deepcopy_VkOffset3D(alloc, rootType, &from->dstOffset, (VkOffset3D*)(&to->dstOffset));
     deepcopy_VkExtent3D(alloc, rootType, &from->extent, (VkExtent3D*)(&to->extent));
 }
 
-void deepcopy_VkResolveImageInfo2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkResolveImageInfo2KHR* from,
-    VkResolveImageInfo2KHR* to)
-{
+void deepcopy_VkResolveImageInfo2KHR(Allocator* alloc, VkStructureType rootType,
+                                     const VkResolveImageInfo2KHR* from,
+                                     VkResolveImageInfo2KHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pRegions = nullptr;
-        if (from->pRegions)
-        {
-            to->pRegions = (VkImageResolve2KHR*)alloc->alloc(from->regionCount * sizeof(const VkImageResolve2KHR));
+        if (from->pRegions) {
+            to->pRegions = (VkImageResolve2KHR*)alloc->alloc(from->regionCount *
+                                                             sizeof(const VkImageResolve2KHR));
             to->regionCount = from->regionCount;
-            for (uint32_t i = 0; i < (uint32_t)from->regionCount; ++i)
-            {
-                deepcopy_VkImageResolve2KHR(alloc, rootType, from->pRegions + i, (VkImageResolve2KHR*)(to->pRegions + i));
+            for (uint32_t i = 0; i < (uint32_t)from->regionCount; ++i) {
+                deepcopy_VkImageResolve2KHR(alloc, rootType, from->pRegions + i,
+                                            (VkImageResolve2KHR*)(to->pRegions + i));
             }
         }
     }
@@ -10643,29 +8685,23 @@
 
 #endif
 #ifdef VK_KHR_format_feature_flags2
-void deepcopy_VkFormatProperties3KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkFormatProperties3KHR* from,
-    VkFormatProperties3KHR* to)
-{
+void deepcopy_VkFormatProperties3KHR(Allocator* alloc, VkStructureType rootType,
+                                     const VkFormatProperties3KHR* from,
+                                     VkFormatProperties3KHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -10674,195 +8710,157 @@
 #endif
 #ifdef VK_KHR_maintenance4
 void deepcopy_VkPhysicalDeviceMaintenance4FeaturesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceMaintenance4FeaturesKHR* from,
-    VkPhysicalDeviceMaintenance4FeaturesKHR* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDeviceMaintenance4FeaturesKHR* from,
+    VkPhysicalDeviceMaintenance4FeaturesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceMaintenance4PropertiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceMaintenance4PropertiesKHR* from,
-    VkPhysicalDeviceMaintenance4PropertiesKHR* to)
-{
+    VkPhysicalDeviceMaintenance4PropertiesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkDeviceBufferMemoryRequirementsKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDeviceBufferMemoryRequirementsKHR* from,
-    VkDeviceBufferMemoryRequirementsKHR* to)
-{
+void deepcopy_VkDeviceBufferMemoryRequirementsKHR(Allocator* alloc, VkStructureType rootType,
+                                                  const VkDeviceBufferMemoryRequirementsKHR* from,
+                                                  VkDeviceBufferMemoryRequirementsKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pCreateInfo = nullptr;
-    if (from->pCreateInfo)
-    {
+    if (from->pCreateInfo) {
         to->pCreateInfo = (VkBufferCreateInfo*)alloc->alloc(sizeof(const VkBufferCreateInfo));
-        deepcopy_VkBufferCreateInfo(alloc, rootType, from->pCreateInfo, (VkBufferCreateInfo*)(to->pCreateInfo));
+        deepcopy_VkBufferCreateInfo(alloc, rootType, from->pCreateInfo,
+                                    (VkBufferCreateInfo*)(to->pCreateInfo));
     }
 }
 
-void deepcopy_VkDeviceImageMemoryRequirementsKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDeviceImageMemoryRequirementsKHR* from,
-    VkDeviceImageMemoryRequirementsKHR* to)
-{
+void deepcopy_VkDeviceImageMemoryRequirementsKHR(Allocator* alloc, VkStructureType rootType,
+                                                 const VkDeviceImageMemoryRequirementsKHR* from,
+                                                 VkDeviceImageMemoryRequirementsKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pCreateInfo = nullptr;
-    if (from->pCreateInfo)
-    {
+    if (from->pCreateInfo) {
         to->pCreateInfo = (VkImageCreateInfo*)alloc->alloc(sizeof(const VkImageCreateInfo));
-        deepcopy_VkImageCreateInfo(alloc, rootType, from->pCreateInfo, (VkImageCreateInfo*)(to->pCreateInfo));
+        deepcopy_VkImageCreateInfo(alloc, rootType, from->pCreateInfo,
+                                   (VkImageCreateInfo*)(to->pCreateInfo));
     }
 }
 
 #endif
 #ifdef VK_ANDROID_native_buffer
-void deepcopy_VkNativeBufferANDROID(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkNativeBufferANDROID* from,
-    VkNativeBufferANDROID* to)
-{
+void deepcopy_VkNativeBufferANDROID(Allocator* alloc, VkStructureType rootType,
+                                    const VkNativeBufferANDROID* from, VkNativeBufferANDROID* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->handle = nullptr;
-    if (from->handle)
-    {
+    if (from->handle) {
         to->handle = (uint32_t*)alloc->dupArray(from->handle, sizeof(const uint32_t));
     }
 }
 
 #endif
 #ifdef VK_EXT_debug_report
-void deepcopy_VkDebugReportCallbackCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDebugReportCallbackCreateInfoEXT* from,
-    VkDebugReportCallbackCreateInfoEXT* to)
-{
+void deepcopy_VkDebugReportCallbackCreateInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                                 const VkDebugReportCallbackCreateInfoEXT* from,
+                                                 VkDebugReportCallbackCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pUserData = nullptr;
-    if (from->pUserData)
-    {
+    if (from->pUserData) {
         to->pUserData = (void*)alloc->dupArray(from->pUserData, sizeof(uint8_t));
     }
 }
@@ -10876,28 +8874,23 @@
 #endif
 #ifdef VK_AMD_rasterization_order
 void deepcopy_VkPipelineRasterizationStateRasterizationOrderAMD(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineRasterizationStateRasterizationOrderAMD* from,
-    VkPipelineRasterizationStateRasterizationOrderAMD* to)
-{
+    VkPipelineRasterizationStateRasterizationOrderAMD* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -10909,101 +8902,80 @@
 #ifdef VK_AMD_shader_explicit_vertex_parameter
 #endif
 #ifdef VK_EXT_debug_marker
-void deepcopy_VkDebugMarkerObjectNameInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDebugMarkerObjectNameInfoEXT* from,
-    VkDebugMarkerObjectNameInfoEXT* to)
-{
+void deepcopy_VkDebugMarkerObjectNameInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                             const VkDebugMarkerObjectNameInfoEXT* from,
+                                             VkDebugMarkerObjectNameInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pObjectName = nullptr;
-    if (from->pObjectName)
-    {
+    if (from->pObjectName) {
         to->pObjectName = alloc->strDup(from->pObjectName);
     }
 }
 
-void deepcopy_VkDebugMarkerObjectTagInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDebugMarkerObjectTagInfoEXT* from,
-    VkDebugMarkerObjectTagInfoEXT* to)
-{
+void deepcopy_VkDebugMarkerObjectTagInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                            const VkDebugMarkerObjectTagInfoEXT* from,
+                                            VkDebugMarkerObjectTagInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pTag = nullptr;
-    if (from->pTag)
-    {
+    if (from->pTag) {
         to->pTag = (void*)alloc->dupArray(from->pTag, from->tagSize * sizeof(const uint8_t));
     }
 }
 
-void deepcopy_VkDebugMarkerMarkerInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDebugMarkerMarkerInfoEXT* from,
-    VkDebugMarkerMarkerInfoEXT* to)
-{
+void deepcopy_VkDebugMarkerMarkerInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                         const VkDebugMarkerMarkerInfoEXT* from,
+                                         VkDebugMarkerMarkerInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pMarkerName = nullptr;
-    if (from->pMarkerName)
-    {
+    if (from->pMarkerName) {
         to->pMarkerName = alloc->strDup(from->pMarkerName);
     }
     memcpy(to->color, from->color, 4 * sizeof(float));
@@ -11014,84 +8986,67 @@
 #endif
 #ifdef VK_NV_dedicated_allocation
 void deepcopy_VkDedicatedAllocationImageCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDedicatedAllocationImageCreateInfoNV* from,
-    VkDedicatedAllocationImageCreateInfoNV* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkDedicatedAllocationImageCreateInfoNV* from,
+    VkDedicatedAllocationImageCreateInfoNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkDedicatedAllocationBufferCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDedicatedAllocationBufferCreateInfoNV* from,
-    VkDedicatedAllocationBufferCreateInfoNV* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkDedicatedAllocationBufferCreateInfoNV* from,
+    VkDedicatedAllocationBufferCreateInfoNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkDedicatedAllocationMemoryAllocateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkDedicatedAllocationMemoryAllocateInfoNV* from,
-    VkDedicatedAllocationMemoryAllocateInfoNV* to)
-{
+    VkDedicatedAllocationMemoryAllocateInfoNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -11100,84 +9055,69 @@
 #endif
 #ifdef VK_EXT_transform_feedback
 void deepcopy_VkPhysicalDeviceTransformFeedbackFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceTransformFeedbackFeaturesEXT* from,
-    VkPhysicalDeviceTransformFeedbackFeaturesEXT* to)
-{
+    VkPhysicalDeviceTransformFeedbackFeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceTransformFeedbackPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceTransformFeedbackPropertiesEXT* from,
-    VkPhysicalDeviceTransformFeedbackPropertiesEXT* to)
-{
+    VkPhysicalDeviceTransformFeedbackPropertiesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPipelineRasterizationStateStreamCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineRasterizationStateStreamCreateInfoEXT* from,
-    VkPipelineRasterizationStateStreamCreateInfoEXT* to)
-{
+    VkPipelineRasterizationStateStreamCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -11185,95 +9125,74 @@
 
 #endif
 #ifdef VK_NVX_binary_import
-void deepcopy_VkCuModuleCreateInfoNVX(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCuModuleCreateInfoNVX* from,
-    VkCuModuleCreateInfoNVX* to)
-{
+void deepcopy_VkCuModuleCreateInfoNVX(Allocator* alloc, VkStructureType rootType,
+                                      const VkCuModuleCreateInfoNVX* from,
+                                      VkCuModuleCreateInfoNVX* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pData = nullptr;
-    if (from->pData)
-    {
+    if (from->pData) {
         to->pData = (void*)alloc->dupArray(from->pData, from->dataSize * sizeof(const uint8_t));
     }
 }
 
-void deepcopy_VkCuFunctionCreateInfoNVX(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCuFunctionCreateInfoNVX* from,
-    VkCuFunctionCreateInfoNVX* to)
-{
+void deepcopy_VkCuFunctionCreateInfoNVX(Allocator* alloc, VkStructureType rootType,
+                                        const VkCuFunctionCreateInfoNVX* from,
+                                        VkCuFunctionCreateInfoNVX* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pName = nullptr;
-    if (from->pName)
-    {
+    if (from->pName) {
         to->pName = alloc->strDup(from->pName);
     }
 }
 
-void deepcopy_VkCuLaunchInfoNVX(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCuLaunchInfoNVX* from,
-    VkCuLaunchInfoNVX* to)
-{
+void deepcopy_VkCuLaunchInfoNVX(Allocator* alloc, VkStructureType rootType,
+                                const VkCuLaunchInfoNVX* from, VkCuLaunchInfoNVX* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -11281,57 +9200,45 @@
 
 #endif
 #ifdef VK_NVX_image_view_handle
-void deepcopy_VkImageViewHandleInfoNVX(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageViewHandleInfoNVX* from,
-    VkImageViewHandleInfoNVX* to)
-{
+void deepcopy_VkImageViewHandleInfoNVX(Allocator* alloc, VkStructureType rootType,
+                                       const VkImageViewHandleInfoNVX* from,
+                                       VkImageViewHandleInfoNVX* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkImageViewAddressPropertiesNVX(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageViewAddressPropertiesNVX* from,
-    VkImageViewAddressPropertiesNVX* to)
-{
+void deepcopy_VkImageViewAddressPropertiesNVX(Allocator* alloc, VkStructureType rootType,
+                                              const VkImageViewAddressPropertiesNVX* from,
+                                              VkImageViewAddressPropertiesNVX* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -11347,366 +9254,327 @@
 #ifdef VK_AMD_shader_ballot
 #endif
 #ifdef VK_EXT_video_encode_h264
-void deepcopy_VkVideoEncodeH264CapabilitiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoEncodeH264CapabilitiesEXT* from,
-    VkVideoEncodeH264CapabilitiesEXT* to)
-{
+void deepcopy_VkVideoEncodeH264CapabilitiesEXT(Allocator* alloc, VkStructureType rootType,
+                                               const VkVideoEncodeH264CapabilitiesEXT* from,
+                                               VkVideoEncodeH264CapabilitiesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    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->minPictureSizeInMbs, (VkExtent2D*)(&to->minPictureSizeInMbs));
-    deepcopy_VkExtent2D(alloc, rootType, &from->maxPictureSizeInMbs, (VkExtent2D*)(&to->maxPictureSizeInMbs));
-    deepcopy_VkExtent2D(alloc, rootType, &from->inputImageDataAlignment, (VkExtent2D*)(&to->inputImageDataAlignment));
-    deepcopy_VkExtensionProperties(alloc, rootType, &from->stdExtensionVersion, (VkExtensionProperties*)(&to->stdExtensionVersion));
+    deepcopy_VkExtent2D(alloc, rootType, &from->minPictureSizeInMbs,
+                        (VkExtent2D*)(&to->minPictureSizeInMbs));
+    deepcopy_VkExtent2D(alloc, rootType, &from->maxPictureSizeInMbs,
+                        (VkExtent2D*)(&to->maxPictureSizeInMbs));
+    deepcopy_VkExtent2D(alloc, rootType, &from->inputImageDataAlignment,
+                        (VkExtent2D*)(&to->inputImageDataAlignment));
+    deepcopy_VkExtensionProperties(alloc, rootType, &from->stdExtensionVersion,
+                                   (VkExtensionProperties*)(&to->stdExtensionVersion));
 }
 
 void deepcopy_VkVideoEncodeH264SessionCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoEncodeH264SessionCreateInfoEXT* from,
-    VkVideoEncodeH264SessionCreateInfoEXT* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkVideoEncodeH264SessionCreateInfoEXT* from,
+    VkVideoEncodeH264SessionCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    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->maxPictureSizeInMbs, (VkExtent2D*)(&to->maxPictureSizeInMbs));
+    deepcopy_VkExtent2D(alloc, rootType, &from->maxPictureSizeInMbs,
+                        (VkExtent2D*)(&to->maxPictureSizeInMbs));
     to->pStdExtensionVersion = nullptr;
-    if (from->pStdExtensionVersion)
-    {
-        to->pStdExtensionVersion = (VkExtensionProperties*)alloc->alloc(sizeof(const VkExtensionProperties));
-        deepcopy_VkExtensionProperties(alloc, rootType, from->pStdExtensionVersion, (VkExtensionProperties*)(to->pStdExtensionVersion));
+    if (from->pStdExtensionVersion) {
+        to->pStdExtensionVersion =
+            (VkExtensionProperties*)alloc->alloc(sizeof(const VkExtensionProperties));
+        deepcopy_VkExtensionProperties(alloc, rootType, from->pStdExtensionVersion,
+                                       (VkExtensionProperties*)(to->pStdExtensionVersion));
     }
 }
 
 void deepcopy_VkVideoEncodeH264SessionParametersAddInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkVideoEncodeH264SessionParametersAddInfoEXT* from,
-    VkVideoEncodeH264SessionParametersAddInfoEXT* to)
-{
+    VkVideoEncodeH264SessionParametersAddInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pSpsStd = nullptr;
-    if (from->pSpsStd)
-    {
-        to->pSpsStd = (StdVideoH264SequenceParameterSet*)alloc->dupArray(from->pSpsStd, from->spsStdCount * sizeof(const StdVideoH264SequenceParameterSet));
+    if (from->pSpsStd) {
+        to->pSpsStd = (StdVideoH264SequenceParameterSet*)alloc->dupArray(
+            from->pSpsStd, from->spsStdCount * sizeof(const StdVideoH264SequenceParameterSet));
     }
     to->pPpsStd = nullptr;
-    if (from->pPpsStd)
-    {
-        to->pPpsStd = (StdVideoH264PictureParameterSet*)alloc->dupArray(from->pPpsStd, from->ppsStdCount * sizeof(const StdVideoH264PictureParameterSet));
+    if (from->pPpsStd) {
+        to->pPpsStd = (StdVideoH264PictureParameterSet*)alloc->dupArray(
+            from->pPpsStd, from->ppsStdCount * sizeof(const StdVideoH264PictureParameterSet));
     }
 }
 
 void deepcopy_VkVideoEncodeH264SessionParametersCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkVideoEncodeH264SessionParametersCreateInfoEXT* from,
-    VkVideoEncodeH264SessionParametersCreateInfoEXT* to)
-{
+    VkVideoEncodeH264SessionParametersCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pParametersAddInfo = nullptr;
-    if (from->pParametersAddInfo)
-    {
-        to->pParametersAddInfo = (VkVideoEncodeH264SessionParametersAddInfoEXT*)alloc->alloc(sizeof(const VkVideoEncodeH264SessionParametersAddInfoEXT));
-        deepcopy_VkVideoEncodeH264SessionParametersAddInfoEXT(alloc, rootType, from->pParametersAddInfo, (VkVideoEncodeH264SessionParametersAddInfoEXT*)(to->pParametersAddInfo));
+    if (from->pParametersAddInfo) {
+        to->pParametersAddInfo = (VkVideoEncodeH264SessionParametersAddInfoEXT*)alloc->alloc(
+            sizeof(const VkVideoEncodeH264SessionParametersAddInfoEXT));
+        deepcopy_VkVideoEncodeH264SessionParametersAddInfoEXT(
+            alloc, rootType, from->pParametersAddInfo,
+            (VkVideoEncodeH264SessionParametersAddInfoEXT*)(to->pParametersAddInfo));
     }
 }
 
-void deepcopy_VkVideoEncodeH264DpbSlotInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoEncodeH264DpbSlotInfoEXT* from,
-    VkVideoEncodeH264DpbSlotInfoEXT* to)
-{
+void deepcopy_VkVideoEncodeH264DpbSlotInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                              const VkVideoEncodeH264DpbSlotInfoEXT* from,
+                                              VkVideoEncodeH264DpbSlotInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pStdPictureInfo = nullptr;
-    if (from->pStdPictureInfo)
-    {
-        to->pStdPictureInfo = (StdVideoEncodeH264PictureInfo*)alloc->dupArray(from->pStdPictureInfo, sizeof(const StdVideoEncodeH264PictureInfo));
+    if (from->pStdPictureInfo) {
+        to->pStdPictureInfo = (StdVideoEncodeH264PictureInfo*)alloc->dupArray(
+            from->pStdPictureInfo, sizeof(const StdVideoEncodeH264PictureInfo));
     }
 }
 
-void deepcopy_VkVideoEncodeH264NaluSliceEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoEncodeH264NaluSliceEXT* from,
-    VkVideoEncodeH264NaluSliceEXT* to)
-{
+void deepcopy_VkVideoEncodeH264NaluSliceEXT(Allocator* alloc, VkStructureType rootType,
+                                            const VkVideoEncodeH264NaluSliceEXT* from,
+                                            VkVideoEncodeH264NaluSliceEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pSliceHeaderStd = nullptr;
-    if (from->pSliceHeaderStd)
-    {
-        to->pSliceHeaderStd = (StdVideoEncodeH264SliceHeader*)alloc->dupArray(from->pSliceHeaderStd, sizeof(const StdVideoEncodeH264SliceHeader));
+    if (from->pSliceHeaderStd) {
+        to->pSliceHeaderStd = (StdVideoEncodeH264SliceHeader*)alloc->dupArray(
+            from->pSliceHeaderStd, sizeof(const StdVideoEncodeH264SliceHeader));
     }
-    if (from)
-    {
+    if (from) {
         to->pRefFinalList0Entries = nullptr;
-        if (from->pRefFinalList0Entries)
-        {
-            to->pRefFinalList0Entries = (VkVideoEncodeH264DpbSlotInfoEXT*)alloc->alloc(from->refFinalList0EntryCount * sizeof(const VkVideoEncodeH264DpbSlotInfoEXT));
+        if (from->pRefFinalList0Entries) {
+            to->pRefFinalList0Entries = (VkVideoEncodeH264DpbSlotInfoEXT*)alloc->alloc(
+                from->refFinalList0EntryCount * sizeof(const VkVideoEncodeH264DpbSlotInfoEXT));
             to->refFinalList0EntryCount = from->refFinalList0EntryCount;
-            for (uint32_t i = 0; i < (uint32_t)from->refFinalList0EntryCount; ++i)
-            {
-                deepcopy_VkVideoEncodeH264DpbSlotInfoEXT(alloc, rootType, from->pRefFinalList0Entries + i, (VkVideoEncodeH264DpbSlotInfoEXT*)(to->pRefFinalList0Entries + i));
+            for (uint32_t i = 0; i < (uint32_t)from->refFinalList0EntryCount; ++i) {
+                deepcopy_VkVideoEncodeH264DpbSlotInfoEXT(
+                    alloc, rootType, from->pRefFinalList0Entries + i,
+                    (VkVideoEncodeH264DpbSlotInfoEXT*)(to->pRefFinalList0Entries + i));
             }
         }
     }
-    if (from)
-    {
+    if (from) {
         to->pRefFinalList1Entries = nullptr;
-        if (from->pRefFinalList1Entries)
-        {
-            to->pRefFinalList1Entries = (VkVideoEncodeH264DpbSlotInfoEXT*)alloc->alloc(from->refFinalList1EntryCount * sizeof(const VkVideoEncodeH264DpbSlotInfoEXT));
+        if (from->pRefFinalList1Entries) {
+            to->pRefFinalList1Entries = (VkVideoEncodeH264DpbSlotInfoEXT*)alloc->alloc(
+                from->refFinalList1EntryCount * sizeof(const VkVideoEncodeH264DpbSlotInfoEXT));
             to->refFinalList1EntryCount = from->refFinalList1EntryCount;
-            for (uint32_t i = 0; i < (uint32_t)from->refFinalList1EntryCount; ++i)
-            {
-                deepcopy_VkVideoEncodeH264DpbSlotInfoEXT(alloc, rootType, from->pRefFinalList1Entries + i, (VkVideoEncodeH264DpbSlotInfoEXT*)(to->pRefFinalList1Entries + i));
+            for (uint32_t i = 0; i < (uint32_t)from->refFinalList1EntryCount; ++i) {
+                deepcopy_VkVideoEncodeH264DpbSlotInfoEXT(
+                    alloc, rootType, from->pRefFinalList1Entries + i,
+                    (VkVideoEncodeH264DpbSlotInfoEXT*)(to->pRefFinalList1Entries + i));
             }
         }
     }
 }
 
-void deepcopy_VkVideoEncodeH264VclFrameInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoEncodeH264VclFrameInfoEXT* from,
-    VkVideoEncodeH264VclFrameInfoEXT* to)
-{
+void deepcopy_VkVideoEncodeH264VclFrameInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                               const VkVideoEncodeH264VclFrameInfoEXT* from,
+                                               VkVideoEncodeH264VclFrameInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pRefDefaultFinalList0Entries = nullptr;
-        if (from->pRefDefaultFinalList0Entries)
-        {
-            to->pRefDefaultFinalList0Entries = (VkVideoEncodeH264DpbSlotInfoEXT*)alloc->alloc(from->refDefaultFinalList0EntryCount * sizeof(const VkVideoEncodeH264DpbSlotInfoEXT));
+        if (from->pRefDefaultFinalList0Entries) {
+            to->pRefDefaultFinalList0Entries = (VkVideoEncodeH264DpbSlotInfoEXT*)alloc->alloc(
+                from->refDefaultFinalList0EntryCount *
+                sizeof(const VkVideoEncodeH264DpbSlotInfoEXT));
             to->refDefaultFinalList0EntryCount = from->refDefaultFinalList0EntryCount;
-            for (uint32_t i = 0; i < (uint32_t)from->refDefaultFinalList0EntryCount; ++i)
-            {
-                deepcopy_VkVideoEncodeH264DpbSlotInfoEXT(alloc, rootType, from->pRefDefaultFinalList0Entries + i, (VkVideoEncodeH264DpbSlotInfoEXT*)(to->pRefDefaultFinalList0Entries + i));
+            for (uint32_t i = 0; i < (uint32_t)from->refDefaultFinalList0EntryCount; ++i) {
+                deepcopy_VkVideoEncodeH264DpbSlotInfoEXT(
+                    alloc, rootType, from->pRefDefaultFinalList0Entries + i,
+                    (VkVideoEncodeH264DpbSlotInfoEXT*)(to->pRefDefaultFinalList0Entries + i));
             }
         }
     }
-    if (from)
-    {
+    if (from) {
         to->pRefDefaultFinalList1Entries = nullptr;
-        if (from->pRefDefaultFinalList1Entries)
-        {
-            to->pRefDefaultFinalList1Entries = (VkVideoEncodeH264DpbSlotInfoEXT*)alloc->alloc(from->refDefaultFinalList1EntryCount * sizeof(const VkVideoEncodeH264DpbSlotInfoEXT));
+        if (from->pRefDefaultFinalList1Entries) {
+            to->pRefDefaultFinalList1Entries = (VkVideoEncodeH264DpbSlotInfoEXT*)alloc->alloc(
+                from->refDefaultFinalList1EntryCount *
+                sizeof(const VkVideoEncodeH264DpbSlotInfoEXT));
             to->refDefaultFinalList1EntryCount = from->refDefaultFinalList1EntryCount;
-            for (uint32_t i = 0; i < (uint32_t)from->refDefaultFinalList1EntryCount; ++i)
-            {
-                deepcopy_VkVideoEncodeH264DpbSlotInfoEXT(alloc, rootType, from->pRefDefaultFinalList1Entries + i, (VkVideoEncodeH264DpbSlotInfoEXT*)(to->pRefDefaultFinalList1Entries + i));
+            for (uint32_t i = 0; i < (uint32_t)from->refDefaultFinalList1EntryCount; ++i) {
+                deepcopy_VkVideoEncodeH264DpbSlotInfoEXT(
+                    alloc, rootType, from->pRefDefaultFinalList1Entries + i,
+                    (VkVideoEncodeH264DpbSlotInfoEXT*)(to->pRefDefaultFinalList1Entries + i));
             }
         }
     }
-    if (from)
-    {
+    if (from) {
         to->pNaluSliceEntries = nullptr;
-        if (from->pNaluSliceEntries)
-        {
-            to->pNaluSliceEntries = (VkVideoEncodeH264NaluSliceEXT*)alloc->alloc(from->naluSliceEntryCount * sizeof(const VkVideoEncodeH264NaluSliceEXT));
+        if (from->pNaluSliceEntries) {
+            to->pNaluSliceEntries = (VkVideoEncodeH264NaluSliceEXT*)alloc->alloc(
+                from->naluSliceEntryCount * sizeof(const VkVideoEncodeH264NaluSliceEXT));
             to->naluSliceEntryCount = from->naluSliceEntryCount;
-            for (uint32_t i = 0; i < (uint32_t)from->naluSliceEntryCount; ++i)
-            {
-                deepcopy_VkVideoEncodeH264NaluSliceEXT(alloc, rootType, from->pNaluSliceEntries + i, (VkVideoEncodeH264NaluSliceEXT*)(to->pNaluSliceEntries + i));
+            for (uint32_t i = 0; i < (uint32_t)from->naluSliceEntryCount; ++i) {
+                deepcopy_VkVideoEncodeH264NaluSliceEXT(
+                    alloc, rootType, from->pNaluSliceEntries + i,
+                    (VkVideoEncodeH264NaluSliceEXT*)(to->pNaluSliceEntries + i));
             }
         }
     }
     to->pCurrentPictureInfo = nullptr;
-    if (from->pCurrentPictureInfo)
-    {
-        to->pCurrentPictureInfo = (VkVideoEncodeH264DpbSlotInfoEXT*)alloc->alloc(sizeof(const VkVideoEncodeH264DpbSlotInfoEXT));
-        deepcopy_VkVideoEncodeH264DpbSlotInfoEXT(alloc, rootType, from->pCurrentPictureInfo, (VkVideoEncodeH264DpbSlotInfoEXT*)(to->pCurrentPictureInfo));
+    if (from->pCurrentPictureInfo) {
+        to->pCurrentPictureInfo = (VkVideoEncodeH264DpbSlotInfoEXT*)alloc->alloc(
+            sizeof(const VkVideoEncodeH264DpbSlotInfoEXT));
+        deepcopy_VkVideoEncodeH264DpbSlotInfoEXT(
+            alloc, rootType, from->pCurrentPictureInfo,
+            (VkVideoEncodeH264DpbSlotInfoEXT*)(to->pCurrentPictureInfo));
     }
 }
 
 void deepcopy_VkVideoEncodeH264EmitPictureParametersEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkVideoEncodeH264EmitPictureParametersEXT* from,
-    VkVideoEncodeH264EmitPictureParametersEXT* to)
-{
+    VkVideoEncodeH264EmitPictureParametersEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->ppsIdEntries = nullptr;
-    if (from->ppsIdEntries)
-    {
-        to->ppsIdEntries = (uint8_t*)alloc->dupArray(from->ppsIdEntries, from->ppsIdEntryCount * sizeof(const uint8_t));
+    if (from->ppsIdEntries) {
+        to->ppsIdEntries = (uint8_t*)alloc->dupArray(from->ppsIdEntries,
+                                                     from->ppsIdEntryCount * sizeof(const uint8_t));
     }
 }
 
-void deepcopy_VkVideoEncodeH264ProfileEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoEncodeH264ProfileEXT* from,
-    VkVideoEncodeH264ProfileEXT* to)
-{
+void deepcopy_VkVideoEncodeH264ProfileEXT(Allocator* alloc, VkStructureType rootType,
+                                          const VkVideoEncodeH264ProfileEXT* from,
+                                          VkVideoEncodeH264ProfileEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -11714,386 +9582,338 @@
 
 #endif
 #ifdef VK_EXT_video_encode_h265
-void deepcopy_VkVideoEncodeH265CapabilitiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoEncodeH265CapabilitiesEXT* from,
-    VkVideoEncodeH265CapabilitiesEXT* to)
-{
+void deepcopy_VkVideoEncodeH265CapabilitiesEXT(Allocator* alloc, VkStructureType rootType,
+                                               const VkVideoEncodeH265CapabilitiesEXT* from,
+                                               VkVideoEncodeH265CapabilitiesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    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->inputImageDataAlignment, (VkExtent2D*)(&to->inputImageDataAlignment));
-    deepcopy_VkExtensionProperties(alloc, rootType, &from->stdExtensionVersion, (VkExtensionProperties*)(&to->stdExtensionVersion));
+    deepcopy_VkExtent2D(alloc, rootType, &from->inputImageDataAlignment,
+                        (VkExtent2D*)(&to->inputImageDataAlignment));
+    deepcopy_VkExtensionProperties(alloc, rootType, &from->stdExtensionVersion,
+                                   (VkExtensionProperties*)(&to->stdExtensionVersion));
 }
 
 void deepcopy_VkVideoEncodeH265SessionCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoEncodeH265SessionCreateInfoEXT* from,
-    VkVideoEncodeH265SessionCreateInfoEXT* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkVideoEncodeH265SessionCreateInfoEXT* from,
+    VkVideoEncodeH265SessionCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pStdExtensionVersion = nullptr;
-    if (from->pStdExtensionVersion)
-    {
-        to->pStdExtensionVersion = (VkExtensionProperties*)alloc->alloc(sizeof(const VkExtensionProperties));
-        deepcopy_VkExtensionProperties(alloc, rootType, from->pStdExtensionVersion, (VkExtensionProperties*)(to->pStdExtensionVersion));
+    if (from->pStdExtensionVersion) {
+        to->pStdExtensionVersion =
+            (VkExtensionProperties*)alloc->alloc(sizeof(const VkExtensionProperties));
+        deepcopy_VkExtensionProperties(alloc, rootType, from->pStdExtensionVersion,
+                                       (VkExtensionProperties*)(to->pStdExtensionVersion));
     }
 }
 
 void deepcopy_VkVideoEncodeH265SessionParametersAddInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkVideoEncodeH265SessionParametersAddInfoEXT* from,
-    VkVideoEncodeH265SessionParametersAddInfoEXT* to)
-{
+    VkVideoEncodeH265SessionParametersAddInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pVpsStd = nullptr;
-    if (from->pVpsStd)
-    {
-        to->pVpsStd = (StdVideoH265VideoParameterSet*)alloc->dupArray(from->pVpsStd, from->vpsStdCount * sizeof(const StdVideoH265VideoParameterSet));
+    if (from->pVpsStd) {
+        to->pVpsStd = (StdVideoH265VideoParameterSet*)alloc->dupArray(
+            from->pVpsStd, from->vpsStdCount * sizeof(const StdVideoH265VideoParameterSet));
     }
     to->pSpsStd = nullptr;
-    if (from->pSpsStd)
-    {
-        to->pSpsStd = (StdVideoH265SequenceParameterSet*)alloc->dupArray(from->pSpsStd, from->spsStdCount * sizeof(const StdVideoH265SequenceParameterSet));
+    if (from->pSpsStd) {
+        to->pSpsStd = (StdVideoH265SequenceParameterSet*)alloc->dupArray(
+            from->pSpsStd, from->spsStdCount * sizeof(const StdVideoH265SequenceParameterSet));
     }
     to->pPpsStd = nullptr;
-    if (from->pPpsStd)
-    {
-        to->pPpsStd = (StdVideoH265PictureParameterSet*)alloc->dupArray(from->pPpsStd, from->ppsStdCount * sizeof(const StdVideoH265PictureParameterSet));
+    if (from->pPpsStd) {
+        to->pPpsStd = (StdVideoH265PictureParameterSet*)alloc->dupArray(
+            from->pPpsStd, from->ppsStdCount * sizeof(const StdVideoH265PictureParameterSet));
     }
 }
 
 void deepcopy_VkVideoEncodeH265SessionParametersCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkVideoEncodeH265SessionParametersCreateInfoEXT* from,
-    VkVideoEncodeH265SessionParametersCreateInfoEXT* to)
-{
+    VkVideoEncodeH265SessionParametersCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pParametersAddInfo = nullptr;
-    if (from->pParametersAddInfo)
-    {
-        to->pParametersAddInfo = (VkVideoEncodeH265SessionParametersAddInfoEXT*)alloc->alloc(sizeof(const VkVideoEncodeH265SessionParametersAddInfoEXT));
-        deepcopy_VkVideoEncodeH265SessionParametersAddInfoEXT(alloc, rootType, from->pParametersAddInfo, (VkVideoEncodeH265SessionParametersAddInfoEXT*)(to->pParametersAddInfo));
+    if (from->pParametersAddInfo) {
+        to->pParametersAddInfo = (VkVideoEncodeH265SessionParametersAddInfoEXT*)alloc->alloc(
+            sizeof(const VkVideoEncodeH265SessionParametersAddInfoEXT));
+        deepcopy_VkVideoEncodeH265SessionParametersAddInfoEXT(
+            alloc, rootType, from->pParametersAddInfo,
+            (VkVideoEncodeH265SessionParametersAddInfoEXT*)(to->pParametersAddInfo));
     }
 }
 
-void deepcopy_VkVideoEncodeH265DpbSlotInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoEncodeH265DpbSlotInfoEXT* from,
-    VkVideoEncodeH265DpbSlotInfoEXT* to)
-{
+void deepcopy_VkVideoEncodeH265DpbSlotInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                              const VkVideoEncodeH265DpbSlotInfoEXT* from,
+                                              VkVideoEncodeH265DpbSlotInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pStdReferenceInfo = nullptr;
-    if (from->pStdReferenceInfo)
-    {
-        to->pStdReferenceInfo = (StdVideoEncodeH265ReferenceInfo*)alloc->dupArray(from->pStdReferenceInfo, sizeof(const StdVideoEncodeH265ReferenceInfo));
+    if (from->pStdReferenceInfo) {
+        to->pStdReferenceInfo = (StdVideoEncodeH265ReferenceInfo*)alloc->dupArray(
+            from->pStdReferenceInfo, sizeof(const StdVideoEncodeH265ReferenceInfo));
     }
 }
 
-void deepcopy_VkVideoEncodeH265ReferenceListsEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoEncodeH265ReferenceListsEXT* from,
-    VkVideoEncodeH265ReferenceListsEXT* to)
-{
+void deepcopy_VkVideoEncodeH265ReferenceListsEXT(Allocator* alloc, VkStructureType rootType,
+                                                 const VkVideoEncodeH265ReferenceListsEXT* from,
+                                                 VkVideoEncodeH265ReferenceListsEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pReferenceList0Entries = nullptr;
-        if (from->pReferenceList0Entries)
-        {
-            to->pReferenceList0Entries = (VkVideoEncodeH265DpbSlotInfoEXT*)alloc->alloc(from->referenceList0EntryCount * sizeof(const VkVideoEncodeH265DpbSlotInfoEXT));
+        if (from->pReferenceList0Entries) {
+            to->pReferenceList0Entries = (VkVideoEncodeH265DpbSlotInfoEXT*)alloc->alloc(
+                from->referenceList0EntryCount * sizeof(const VkVideoEncodeH265DpbSlotInfoEXT));
             to->referenceList0EntryCount = from->referenceList0EntryCount;
-            for (uint32_t i = 0; i < (uint32_t)from->referenceList0EntryCount; ++i)
-            {
-                deepcopy_VkVideoEncodeH265DpbSlotInfoEXT(alloc, rootType, from->pReferenceList0Entries + i, (VkVideoEncodeH265DpbSlotInfoEXT*)(to->pReferenceList0Entries + i));
+            for (uint32_t i = 0; i < (uint32_t)from->referenceList0EntryCount; ++i) {
+                deepcopy_VkVideoEncodeH265DpbSlotInfoEXT(
+                    alloc, rootType, from->pReferenceList0Entries + i,
+                    (VkVideoEncodeH265DpbSlotInfoEXT*)(to->pReferenceList0Entries + i));
             }
         }
     }
-    if (from)
-    {
+    if (from) {
         to->pReferenceList1Entries = nullptr;
-        if (from->pReferenceList1Entries)
-        {
-            to->pReferenceList1Entries = (VkVideoEncodeH265DpbSlotInfoEXT*)alloc->alloc(from->referenceList1EntryCount * sizeof(const VkVideoEncodeH265DpbSlotInfoEXT));
+        if (from->pReferenceList1Entries) {
+            to->pReferenceList1Entries = (VkVideoEncodeH265DpbSlotInfoEXT*)alloc->alloc(
+                from->referenceList1EntryCount * sizeof(const VkVideoEncodeH265DpbSlotInfoEXT));
             to->referenceList1EntryCount = from->referenceList1EntryCount;
-            for (uint32_t i = 0; i < (uint32_t)from->referenceList1EntryCount; ++i)
-            {
-                deepcopy_VkVideoEncodeH265DpbSlotInfoEXT(alloc, rootType, from->pReferenceList1Entries + i, (VkVideoEncodeH265DpbSlotInfoEXT*)(to->pReferenceList1Entries + i));
+            for (uint32_t i = 0; i < (uint32_t)from->referenceList1EntryCount; ++i) {
+                deepcopy_VkVideoEncodeH265DpbSlotInfoEXT(
+                    alloc, rootType, from->pReferenceList1Entries + i,
+                    (VkVideoEncodeH265DpbSlotInfoEXT*)(to->pReferenceList1Entries + i));
             }
         }
     }
     to->pReferenceModifications = nullptr;
-    if (from->pReferenceModifications)
-    {
-        to->pReferenceModifications = (StdVideoEncodeH265ReferenceModifications*)alloc->dupArray(from->pReferenceModifications, sizeof(const StdVideoEncodeH265ReferenceModifications));
+    if (from->pReferenceModifications) {
+        to->pReferenceModifications = (StdVideoEncodeH265ReferenceModifications*)alloc->dupArray(
+            from->pReferenceModifications, sizeof(const StdVideoEncodeH265ReferenceModifications));
     }
 }
 
-void deepcopy_VkVideoEncodeH265NaluSliceEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoEncodeH265NaluSliceEXT* from,
-    VkVideoEncodeH265NaluSliceEXT* to)
-{
+void deepcopy_VkVideoEncodeH265NaluSliceEXT(Allocator* alloc, VkStructureType rootType,
+                                            const VkVideoEncodeH265NaluSliceEXT* from,
+                                            VkVideoEncodeH265NaluSliceEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pReferenceFinalLists = nullptr;
-    if (from->pReferenceFinalLists)
-    {
-        to->pReferenceFinalLists = (VkVideoEncodeH265ReferenceListsEXT*)alloc->alloc(sizeof(const VkVideoEncodeH265ReferenceListsEXT));
-        deepcopy_VkVideoEncodeH265ReferenceListsEXT(alloc, rootType, from->pReferenceFinalLists, (VkVideoEncodeH265ReferenceListsEXT*)(to->pReferenceFinalLists));
+    if (from->pReferenceFinalLists) {
+        to->pReferenceFinalLists = (VkVideoEncodeH265ReferenceListsEXT*)alloc->alloc(
+            sizeof(const VkVideoEncodeH265ReferenceListsEXT));
+        deepcopy_VkVideoEncodeH265ReferenceListsEXT(
+            alloc, rootType, from->pReferenceFinalLists,
+            (VkVideoEncodeH265ReferenceListsEXT*)(to->pReferenceFinalLists));
     }
     to->pSliceHeaderStd = nullptr;
-    if (from->pSliceHeaderStd)
-    {
-        to->pSliceHeaderStd = (StdVideoEncodeH265SliceHeader*)alloc->dupArray(from->pSliceHeaderStd, sizeof(const StdVideoEncodeH265SliceHeader));
+    if (from->pSliceHeaderStd) {
+        to->pSliceHeaderStd = (StdVideoEncodeH265SliceHeader*)alloc->dupArray(
+            from->pSliceHeaderStd, sizeof(const StdVideoEncodeH265SliceHeader));
     }
 }
 
-void deepcopy_VkVideoEncodeH265VclFrameInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoEncodeH265VclFrameInfoEXT* from,
-    VkVideoEncodeH265VclFrameInfoEXT* to)
-{
+void deepcopy_VkVideoEncodeH265VclFrameInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                               const VkVideoEncodeH265VclFrameInfoEXT* from,
+                                               VkVideoEncodeH265VclFrameInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pReferenceFinalLists = nullptr;
-    if (from->pReferenceFinalLists)
-    {
-        to->pReferenceFinalLists = (VkVideoEncodeH265ReferenceListsEXT*)alloc->alloc(sizeof(const VkVideoEncodeH265ReferenceListsEXT));
-        deepcopy_VkVideoEncodeH265ReferenceListsEXT(alloc, rootType, from->pReferenceFinalLists, (VkVideoEncodeH265ReferenceListsEXT*)(to->pReferenceFinalLists));
+    if (from->pReferenceFinalLists) {
+        to->pReferenceFinalLists = (VkVideoEncodeH265ReferenceListsEXT*)alloc->alloc(
+            sizeof(const VkVideoEncodeH265ReferenceListsEXT));
+        deepcopy_VkVideoEncodeH265ReferenceListsEXT(
+            alloc, rootType, from->pReferenceFinalLists,
+            (VkVideoEncodeH265ReferenceListsEXT*)(to->pReferenceFinalLists));
     }
-    if (from)
-    {
+    if (from) {
         to->pNaluSliceEntries = nullptr;
-        if (from->pNaluSliceEntries)
-        {
-            to->pNaluSliceEntries = (VkVideoEncodeH265NaluSliceEXT*)alloc->alloc(from->naluSliceEntryCount * sizeof(const VkVideoEncodeH265NaluSliceEXT));
+        if (from->pNaluSliceEntries) {
+            to->pNaluSliceEntries = (VkVideoEncodeH265NaluSliceEXT*)alloc->alloc(
+                from->naluSliceEntryCount * sizeof(const VkVideoEncodeH265NaluSliceEXT));
             to->naluSliceEntryCount = from->naluSliceEntryCount;
-            for (uint32_t i = 0; i < (uint32_t)from->naluSliceEntryCount; ++i)
-            {
-                deepcopy_VkVideoEncodeH265NaluSliceEXT(alloc, rootType, from->pNaluSliceEntries + i, (VkVideoEncodeH265NaluSliceEXT*)(to->pNaluSliceEntries + i));
+            for (uint32_t i = 0; i < (uint32_t)from->naluSliceEntryCount; ++i) {
+                deepcopy_VkVideoEncodeH265NaluSliceEXT(
+                    alloc, rootType, from->pNaluSliceEntries + i,
+                    (VkVideoEncodeH265NaluSliceEXT*)(to->pNaluSliceEntries + i));
             }
         }
     }
     to->pCurrentPictureInfo = nullptr;
-    if (from->pCurrentPictureInfo)
-    {
-        to->pCurrentPictureInfo = (StdVideoEncodeH265PictureInfo*)alloc->dupArray(from->pCurrentPictureInfo, sizeof(const StdVideoEncodeH265PictureInfo));
+    if (from->pCurrentPictureInfo) {
+        to->pCurrentPictureInfo = (StdVideoEncodeH265PictureInfo*)alloc->dupArray(
+            from->pCurrentPictureInfo, sizeof(const StdVideoEncodeH265PictureInfo));
     }
 }
 
 void deepcopy_VkVideoEncodeH265EmitPictureParametersEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkVideoEncodeH265EmitPictureParametersEXT* from,
-    VkVideoEncodeH265EmitPictureParametersEXT* to)
-{
+    VkVideoEncodeH265EmitPictureParametersEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->ppsIdEntries = nullptr;
-    if (from->ppsIdEntries)
-    {
-        to->ppsIdEntries = (uint8_t*)alloc->dupArray(from->ppsIdEntries, from->ppsIdEntryCount * sizeof(const uint8_t));
+    if (from->ppsIdEntries) {
+        to->ppsIdEntries = (uint8_t*)alloc->dupArray(from->ppsIdEntries,
+                                                     from->ppsIdEntryCount * sizeof(const uint8_t));
     }
 }
 
-void deepcopy_VkVideoEncodeH265ProfileEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoEncodeH265ProfileEXT* from,
-    VkVideoEncodeH265ProfileEXT* to)
-{
+void deepcopy_VkVideoEncodeH265ProfileEXT(Allocator* alloc, VkStructureType rootType,
+                                          const VkVideoEncodeH265ProfileEXT* from,
+                                          VkVideoEncodeH265ProfileEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -12101,299 +9921,252 @@
 
 #endif
 #ifdef VK_EXT_video_decode_h264
-void deepcopy_VkVideoDecodeH264ProfileEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoDecodeH264ProfileEXT* from,
-    VkVideoDecodeH264ProfileEXT* to)
-{
+void deepcopy_VkVideoDecodeH264ProfileEXT(Allocator* alloc, VkStructureType rootType,
+                                          const VkVideoDecodeH264ProfileEXT* from,
+                                          VkVideoDecodeH264ProfileEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkVideoDecodeH264CapabilitiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoDecodeH264CapabilitiesEXT* from,
-    VkVideoDecodeH264CapabilitiesEXT* to)
-{
+void deepcopy_VkVideoDecodeH264CapabilitiesEXT(Allocator* alloc, VkStructureType rootType,
+                                               const VkVideoDecodeH264CapabilitiesEXT* from,
+                                               VkVideoDecodeH264CapabilitiesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkOffset2D(alloc, rootType, &from->fieldOffsetGranularity, (VkOffset2D*)(&to->fieldOffsetGranularity));
-    deepcopy_VkExtensionProperties(alloc, rootType, &from->stdExtensionVersion, (VkExtensionProperties*)(&to->stdExtensionVersion));
+    deepcopy_VkOffset2D(alloc, rootType, &from->fieldOffsetGranularity,
+                        (VkOffset2D*)(&to->fieldOffsetGranularity));
+    deepcopy_VkExtensionProperties(alloc, rootType, &from->stdExtensionVersion,
+                                   (VkExtensionProperties*)(&to->stdExtensionVersion));
 }
 
 void deepcopy_VkVideoDecodeH264SessionCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoDecodeH264SessionCreateInfoEXT* from,
-    VkVideoDecodeH264SessionCreateInfoEXT* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkVideoDecodeH264SessionCreateInfoEXT* from,
+    VkVideoDecodeH264SessionCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pStdExtensionVersion = nullptr;
-    if (from->pStdExtensionVersion)
-    {
-        to->pStdExtensionVersion = (VkExtensionProperties*)alloc->alloc(sizeof(const VkExtensionProperties));
-        deepcopy_VkExtensionProperties(alloc, rootType, from->pStdExtensionVersion, (VkExtensionProperties*)(to->pStdExtensionVersion));
+    if (from->pStdExtensionVersion) {
+        to->pStdExtensionVersion =
+            (VkExtensionProperties*)alloc->alloc(sizeof(const VkExtensionProperties));
+        deepcopy_VkExtensionProperties(alloc, rootType, from->pStdExtensionVersion,
+                                       (VkExtensionProperties*)(to->pStdExtensionVersion));
     }
 }
 
 void deepcopy_VkVideoDecodeH264SessionParametersAddInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkVideoDecodeH264SessionParametersAddInfoEXT* from,
-    VkVideoDecodeH264SessionParametersAddInfoEXT* to)
-{
+    VkVideoDecodeH264SessionParametersAddInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pSpsStd = nullptr;
-    if (from->pSpsStd)
-    {
-        to->pSpsStd = (StdVideoH264SequenceParameterSet*)alloc->dupArray(from->pSpsStd, from->spsStdCount * sizeof(const StdVideoH264SequenceParameterSet));
+    if (from->pSpsStd) {
+        to->pSpsStd = (StdVideoH264SequenceParameterSet*)alloc->dupArray(
+            from->pSpsStd, from->spsStdCount * sizeof(const StdVideoH264SequenceParameterSet));
     }
     to->pPpsStd = nullptr;
-    if (from->pPpsStd)
-    {
-        to->pPpsStd = (StdVideoH264PictureParameterSet*)alloc->dupArray(from->pPpsStd, from->ppsStdCount * sizeof(const StdVideoH264PictureParameterSet));
+    if (from->pPpsStd) {
+        to->pPpsStd = (StdVideoH264PictureParameterSet*)alloc->dupArray(
+            from->pPpsStd, from->ppsStdCount * sizeof(const StdVideoH264PictureParameterSet));
     }
 }
 
 void deepcopy_VkVideoDecodeH264SessionParametersCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkVideoDecodeH264SessionParametersCreateInfoEXT* from,
-    VkVideoDecodeH264SessionParametersCreateInfoEXT* to)
-{
+    VkVideoDecodeH264SessionParametersCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pParametersAddInfo = nullptr;
-    if (from->pParametersAddInfo)
-    {
-        to->pParametersAddInfo = (VkVideoDecodeH264SessionParametersAddInfoEXT*)alloc->alloc(sizeof(const VkVideoDecodeH264SessionParametersAddInfoEXT));
-        deepcopy_VkVideoDecodeH264SessionParametersAddInfoEXT(alloc, rootType, from->pParametersAddInfo, (VkVideoDecodeH264SessionParametersAddInfoEXT*)(to->pParametersAddInfo));
+    if (from->pParametersAddInfo) {
+        to->pParametersAddInfo = (VkVideoDecodeH264SessionParametersAddInfoEXT*)alloc->alloc(
+            sizeof(const VkVideoDecodeH264SessionParametersAddInfoEXT));
+        deepcopy_VkVideoDecodeH264SessionParametersAddInfoEXT(
+            alloc, rootType, from->pParametersAddInfo,
+            (VkVideoDecodeH264SessionParametersAddInfoEXT*)(to->pParametersAddInfo));
     }
 }
 
-void deepcopy_VkVideoDecodeH264PictureInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoDecodeH264PictureInfoEXT* from,
-    VkVideoDecodeH264PictureInfoEXT* to)
-{
+void deepcopy_VkVideoDecodeH264PictureInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                              const VkVideoDecodeH264PictureInfoEXT* from,
+                                              VkVideoDecodeH264PictureInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pStdPictureInfo = nullptr;
-    if (from->pStdPictureInfo)
-    {
-        to->pStdPictureInfo = (StdVideoDecodeH264PictureInfo*)alloc->dupArray(from->pStdPictureInfo, sizeof(const StdVideoDecodeH264PictureInfo));
+    if (from->pStdPictureInfo) {
+        to->pStdPictureInfo = (StdVideoDecodeH264PictureInfo*)alloc->dupArray(
+            from->pStdPictureInfo, sizeof(const StdVideoDecodeH264PictureInfo));
     }
     to->pSlicesDataOffsets = nullptr;
-    if (from->pSlicesDataOffsets)
-    {
-        to->pSlicesDataOffsets = (uint32_t*)alloc->dupArray(from->pSlicesDataOffsets, from->slicesCount * sizeof(const uint32_t));
+    if (from->pSlicesDataOffsets) {
+        to->pSlicesDataOffsets = (uint32_t*)alloc->dupArray(
+            from->pSlicesDataOffsets, from->slicesCount * sizeof(const uint32_t));
     }
 }
 
-void deepcopy_VkVideoDecodeH264MvcEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoDecodeH264MvcEXT* from,
-    VkVideoDecodeH264MvcEXT* to)
-{
+void deepcopy_VkVideoDecodeH264MvcEXT(Allocator* alloc, VkStructureType rootType,
+                                      const VkVideoDecodeH264MvcEXT* from,
+                                      VkVideoDecodeH264MvcEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pStdMvc = nullptr;
-    if (from->pStdMvc)
-    {
-        to->pStdMvc = (StdVideoDecodeH264Mvc*)alloc->dupArray(from->pStdMvc, sizeof(const StdVideoDecodeH264Mvc));
+    if (from->pStdMvc) {
+        to->pStdMvc = (StdVideoDecodeH264Mvc*)alloc->dupArray(from->pStdMvc,
+                                                              sizeof(const StdVideoDecodeH264Mvc));
     }
 }
 
-void deepcopy_VkVideoDecodeH264DpbSlotInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoDecodeH264DpbSlotInfoEXT* from,
-    VkVideoDecodeH264DpbSlotInfoEXT* to)
-{
+void deepcopy_VkVideoDecodeH264DpbSlotInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                              const VkVideoDecodeH264DpbSlotInfoEXT* from,
+                                              VkVideoDecodeH264DpbSlotInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pStdReferenceInfo = nullptr;
-    if (from->pStdReferenceInfo)
-    {
-        to->pStdReferenceInfo = (StdVideoDecodeH264ReferenceInfo*)alloc->dupArray(from->pStdReferenceInfo, sizeof(const StdVideoDecodeH264ReferenceInfo));
+    if (from->pStdReferenceInfo) {
+        to->pStdReferenceInfo = (StdVideoDecodeH264ReferenceInfo*)alloc->dupArray(
+            from->pStdReferenceInfo, sizeof(const StdVideoDecodeH264ReferenceInfo));
     }
 }
 
 #endif
 #ifdef VK_AMD_texture_gather_bias_lod
 void deepcopy_VkTextureLODGatherFormatPropertiesAMD(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkTextureLODGatherFormatPropertiesAMD* from,
-    VkTextureLODGatherFormatPropertiesAMD* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkTextureLODGatherFormatPropertiesAMD* from,
+    VkTextureLODGatherFormatPropertiesAMD* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -12401,27 +10174,22 @@
 
 #endif
 #ifdef VK_AMD_shader_info
-void deepcopy_VkShaderResourceUsageAMD(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkShaderResourceUsageAMD* from,
-    VkShaderResourceUsageAMD* to)
-{
+void deepcopy_VkShaderResourceUsageAMD(Allocator* alloc, VkStructureType rootType,
+                                       const VkShaderResourceUsageAMD* from,
+                                       VkShaderResourceUsageAMD* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkShaderStatisticsInfoAMD(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkShaderStatisticsInfoAMD* from,
-    VkShaderStatisticsInfoAMD* to)
-{
+void deepcopy_VkShaderStatisticsInfoAMD(Allocator* alloc, VkStructureType rootType,
+                                        const VkShaderStatisticsInfoAMD* from,
+                                        VkShaderStatisticsInfoAMD* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    deepcopy_VkShaderResourceUsageAMD(alloc, rootType, &from->resourceUsage, (VkShaderResourceUsageAMD*)(&to->resourceUsage));
+    deepcopy_VkShaderResourceUsageAMD(alloc, rootType, &from->resourceUsage,
+                                      (VkShaderResourceUsageAMD*)(&to->resourceUsage));
     memcpy(to->computeWorkGroupSize, from->computeWorkGroupSize, 3 * sizeof(uint32_t));
 }
 
@@ -12430,28 +10198,22 @@
 #endif
 #ifdef VK_GGP_stream_descriptor_surface
 void deepcopy_VkStreamDescriptorSurfaceCreateInfoGGP(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkStreamDescriptorSurfaceCreateInfoGGP* from,
-    VkStreamDescriptorSurfaceCreateInfoGGP* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkStreamDescriptorSurfaceCreateInfoGGP* from,
+    VkStreamDescriptorSurfaceCreateInfoGGP* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -12460,28 +10222,23 @@
 #endif
 #ifdef VK_NV_corner_sampled_image
 void deepcopy_VkPhysicalDeviceCornerSampledImageFeaturesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceCornerSampledImageFeaturesNV* from,
-    VkPhysicalDeviceCornerSampledImageFeaturesNV* to)
-{
+    VkPhysicalDeviceCornerSampledImageFeaturesNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -12491,71 +10248,57 @@
 #ifdef VK_IMG_format_pvrtc
 #endif
 #ifdef VK_NV_external_memory_capabilities
-void deepcopy_VkExternalImageFormatPropertiesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExternalImageFormatPropertiesNV* from,
-    VkExternalImageFormatPropertiesNV* to)
-{
+void deepcopy_VkExternalImageFormatPropertiesNV(Allocator* alloc, VkStructureType rootType,
+                                                const VkExternalImageFormatPropertiesNV* from,
+                                                VkExternalImageFormatPropertiesNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    deepcopy_VkImageFormatProperties(alloc, rootType, &from->imageFormatProperties, (VkImageFormatProperties*)(&to->imageFormatProperties));
+    deepcopy_VkImageFormatProperties(alloc, rootType, &from->imageFormatProperties,
+                                     (VkImageFormatProperties*)(&to->imageFormatProperties));
 }
 
 #endif
 #ifdef VK_NV_external_memory
-void deepcopy_VkExternalMemoryImageCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExternalMemoryImageCreateInfoNV* from,
-    VkExternalMemoryImageCreateInfoNV* to)
-{
+void deepcopy_VkExternalMemoryImageCreateInfoNV(Allocator* alloc, VkStructureType rootType,
+                                                const VkExternalMemoryImageCreateInfoNV* from,
+                                                VkExternalMemoryImageCreateInfoNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkExportMemoryAllocateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExportMemoryAllocateInfoNV* from,
-    VkExportMemoryAllocateInfoNV* to)
-{
+void deepcopy_VkExportMemoryAllocateInfoNV(Allocator* alloc, VkStructureType rootType,
+                                           const VkExportMemoryAllocateInfoNV* from,
+                                           VkExportMemoryAllocateInfoNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -12563,188 +10306,157 @@
 
 #endif
 #ifdef VK_NV_external_memory_win32
-void deepcopy_VkImportMemoryWin32HandleInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImportMemoryWin32HandleInfoNV* from,
-    VkImportMemoryWin32HandleInfoNV* to)
-{
+void deepcopy_VkImportMemoryWin32HandleInfoNV(Allocator* alloc, VkStructureType rootType,
+                                              const VkImportMemoryWin32HandleInfoNV* from,
+                                              VkImportMemoryWin32HandleInfoNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkExportMemoryWin32HandleInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExportMemoryWin32HandleInfoNV* from,
-    VkExportMemoryWin32HandleInfoNV* to)
-{
+void deepcopy_VkExportMemoryWin32HandleInfoNV(Allocator* alloc, VkStructureType rootType,
+                                              const VkExportMemoryWin32HandleInfoNV* from,
+                                              VkExportMemoryWin32HandleInfoNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pAttributes = nullptr;
-    if (from->pAttributes)
-    {
-        to->pAttributes = (SECURITY_ATTRIBUTES*)alloc->dupArray(from->pAttributes, sizeof(const SECURITY_ATTRIBUTES));
+    if (from->pAttributes) {
+        to->pAttributes = (SECURITY_ATTRIBUTES*)alloc->dupArray(from->pAttributes,
+                                                                sizeof(const SECURITY_ATTRIBUTES));
     }
 }
 
 #endif
 #ifdef VK_NV_win32_keyed_mutex
 void deepcopy_VkWin32KeyedMutexAcquireReleaseInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkWin32KeyedMutexAcquireReleaseInfoNV* from,
-    VkWin32KeyedMutexAcquireReleaseInfoNV* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkWin32KeyedMutexAcquireReleaseInfoNV* from,
+    VkWin32KeyedMutexAcquireReleaseInfoNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pAcquireSyncs = nullptr;
-    if (from->pAcquireSyncs)
-    {
-        to->pAcquireSyncs = (VkDeviceMemory*)alloc->dupArray(from->pAcquireSyncs, from->acquireCount * sizeof(const VkDeviceMemory));
+    if (from->pAcquireSyncs) {
+        to->pAcquireSyncs = (VkDeviceMemory*)alloc->dupArray(
+            from->pAcquireSyncs, from->acquireCount * sizeof(const VkDeviceMemory));
     }
     to->pAcquireKeys = nullptr;
-    if (from->pAcquireKeys)
-    {
-        to->pAcquireKeys = (uint64_t*)alloc->dupArray(from->pAcquireKeys, from->acquireCount * sizeof(const uint64_t));
+    if (from->pAcquireKeys) {
+        to->pAcquireKeys = (uint64_t*)alloc->dupArray(from->pAcquireKeys,
+                                                      from->acquireCount * sizeof(const uint64_t));
     }
     to->pAcquireTimeoutMilliseconds = nullptr;
-    if (from->pAcquireTimeoutMilliseconds)
-    {
-        to->pAcquireTimeoutMilliseconds = (uint32_t*)alloc->dupArray(from->pAcquireTimeoutMilliseconds, from->acquireCount * sizeof(const uint32_t));
+    if (from->pAcquireTimeoutMilliseconds) {
+        to->pAcquireTimeoutMilliseconds = (uint32_t*)alloc->dupArray(
+            from->pAcquireTimeoutMilliseconds, from->acquireCount * sizeof(const uint32_t));
     }
     to->pReleaseSyncs = nullptr;
-    if (from->pReleaseSyncs)
-    {
-        to->pReleaseSyncs = (VkDeviceMemory*)alloc->dupArray(from->pReleaseSyncs, from->releaseCount * sizeof(const VkDeviceMemory));
+    if (from->pReleaseSyncs) {
+        to->pReleaseSyncs = (VkDeviceMemory*)alloc->dupArray(
+            from->pReleaseSyncs, from->releaseCount * sizeof(const VkDeviceMemory));
     }
     to->pReleaseKeys = nullptr;
-    if (from->pReleaseKeys)
-    {
-        to->pReleaseKeys = (uint64_t*)alloc->dupArray(from->pReleaseKeys, from->releaseCount * sizeof(const uint64_t));
+    if (from->pReleaseKeys) {
+        to->pReleaseKeys = (uint64_t*)alloc->dupArray(from->pReleaseKeys,
+                                                      from->releaseCount * sizeof(const uint64_t));
     }
 }
 
 #endif
 #ifdef VK_EXT_validation_flags
-void deepcopy_VkValidationFlagsEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkValidationFlagsEXT* from,
-    VkValidationFlagsEXT* to)
-{
+void deepcopy_VkValidationFlagsEXT(Allocator* alloc, VkStructureType rootType,
+                                   const VkValidationFlagsEXT* from, VkValidationFlagsEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pDisabledValidationChecks = nullptr;
-    if (from->pDisabledValidationChecks)
-    {
-        to->pDisabledValidationChecks = (VkValidationCheckEXT*)alloc->dupArray(from->pDisabledValidationChecks, from->disabledValidationCheckCount * sizeof(const VkValidationCheckEXT));
+    if (from->pDisabledValidationChecks) {
+        to->pDisabledValidationChecks = (VkValidationCheckEXT*)alloc->dupArray(
+            from->pDisabledValidationChecks,
+            from->disabledValidationCheckCount * sizeof(const VkValidationCheckEXT));
     }
 }
 
 #endif
 #ifdef VK_NN_vi_surface
-void deepcopy_VkViSurfaceCreateInfoNN(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkViSurfaceCreateInfoNN* from,
-    VkViSurfaceCreateInfoNN* to)
-{
+void deepcopy_VkViSurfaceCreateInfoNN(Allocator* alloc, VkStructureType rootType,
+                                      const VkViSurfaceCreateInfoNN* from,
+                                      VkViSurfaceCreateInfoNN* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->window = nullptr;
-    if (from->window)
-    {
+    if (from->window) {
         to->window = (void*)alloc->dupArray(from->window, sizeof(uint8_t));
     }
 }
@@ -12756,28 +10468,23 @@
 #endif
 #ifdef VK_EXT_texture_compression_astc_hdr
 void deepcopy_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* from,
-    VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* to)
-{
+    VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -12785,57 +10492,45 @@
 
 #endif
 #ifdef VK_EXT_astc_decode_mode
-void deepcopy_VkImageViewASTCDecodeModeEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageViewASTCDecodeModeEXT* from,
-    VkImageViewASTCDecodeModeEXT* to)
-{
+void deepcopy_VkImageViewASTCDecodeModeEXT(Allocator* alloc, VkStructureType rootType,
+                                           const VkImageViewASTCDecodeModeEXT* from,
+                                           VkImageViewASTCDecodeModeEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceASTCDecodeFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceASTCDecodeFeaturesEXT* from,
-    VkPhysicalDeviceASTCDecodeFeaturesEXT* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDeviceASTCDecodeFeaturesEXT* from,
+    VkPhysicalDeviceASTCDecodeFeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -12843,85 +10538,69 @@
 
 #endif
 #ifdef VK_EXT_conditional_rendering
-void deepcopy_VkConditionalRenderingBeginInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkConditionalRenderingBeginInfoEXT* from,
-    VkConditionalRenderingBeginInfoEXT* to)
-{
+void deepcopy_VkConditionalRenderingBeginInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                                 const VkConditionalRenderingBeginInfoEXT* from,
+                                                 VkConditionalRenderingBeginInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceConditionalRenderingFeaturesEXT* from,
-    VkPhysicalDeviceConditionalRenderingFeaturesEXT* to)
-{
+    VkPhysicalDeviceConditionalRenderingFeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkCommandBufferInheritanceConditionalRenderingInfoEXT* from,
-    VkCommandBufferInheritanceConditionalRenderingInfoEXT* to)
-{
+    VkCommandBufferInheritanceConditionalRenderingInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -12929,53 +10608,43 @@
 
 #endif
 #ifdef VK_NV_clip_space_w_scaling
-void deepcopy_VkViewportWScalingNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkViewportWScalingNV* from,
-    VkViewportWScalingNV* to)
-{
+void deepcopy_VkViewportWScalingNV(Allocator* alloc, VkStructureType rootType,
+                                   const VkViewportWScalingNV* from, VkViewportWScalingNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkPipelineViewportWScalingStateCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineViewportWScalingStateCreateInfoNV* from,
-    VkPipelineViewportWScalingStateCreateInfoNV* to)
-{
+    VkPipelineViewportWScalingStateCreateInfoNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pViewportWScalings = nullptr;
-        if (from->pViewportWScalings)
-        {
-            to->pViewportWScalings = (VkViewportWScalingNV*)alloc->alloc(from->viewportCount * sizeof(const VkViewportWScalingNV));
+        if (from->pViewportWScalings) {
+            to->pViewportWScalings = (VkViewportWScalingNV*)alloc->alloc(
+                from->viewportCount * sizeof(const VkViewportWScalingNV));
             to->viewportCount = from->viewportCount;
-            for (uint32_t i = 0; i < (uint32_t)from->viewportCount; ++i)
-            {
-                deepcopy_VkViewportWScalingNV(alloc, rootType, from->pViewportWScalings + i, (VkViewportWScalingNV*)(to->pViewportWScalings + i));
+            for (uint32_t i = 0; i < (uint32_t)from->viewportCount; ++i) {
+                deepcopy_VkViewportWScalingNV(alloc, rootType, from->pViewportWScalings + i,
+                                              (VkViewportWScalingNV*)(to->pViewportWScalings + i));
             }
         }
     }
@@ -12987,29 +10656,23 @@
 #ifdef VK_EXT_acquire_xlib_display
 #endif
 #ifdef VK_EXT_display_surface_counter
-void deepcopy_VkSurfaceCapabilities2EXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSurfaceCapabilities2EXT* from,
-    VkSurfaceCapabilities2EXT* to)
-{
+void deepcopy_VkSurfaceCapabilities2EXT(Allocator* alloc, VkStructureType rootType,
+                                        const VkSurfaceCapabilities2EXT* from,
+                                        VkSurfaceCapabilities2EXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -13020,113 +10683,86 @@
 
 #endif
 #ifdef VK_EXT_display_control
-void deepcopy_VkDisplayPowerInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDisplayPowerInfoEXT* from,
-    VkDisplayPowerInfoEXT* to)
-{
+void deepcopy_VkDisplayPowerInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                    const VkDisplayPowerInfoEXT* from, VkDisplayPowerInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkDeviceEventInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDeviceEventInfoEXT* from,
-    VkDeviceEventInfoEXT* to)
-{
+void deepcopy_VkDeviceEventInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                   const VkDeviceEventInfoEXT* from, VkDeviceEventInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkDisplayEventInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDisplayEventInfoEXT* from,
-    VkDisplayEventInfoEXT* to)
-{
+void deepcopy_VkDisplayEventInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                    const VkDisplayEventInfoEXT* from, VkDisplayEventInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkSwapchainCounterCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSwapchainCounterCreateInfoEXT* from,
-    VkSwapchainCounterCreateInfoEXT* to)
-{
+void deepcopy_VkSwapchainCounterCreateInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                              const VkSwapchainCounterCreateInfoEXT* from,
+                                              VkSwapchainCounterCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -13134,75 +10770,58 @@
 
 #endif
 #ifdef VK_GOOGLE_display_timing
-void deepcopy_VkRefreshCycleDurationGOOGLE(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkRefreshCycleDurationGOOGLE* from,
-    VkRefreshCycleDurationGOOGLE* to)
-{
+void deepcopy_VkRefreshCycleDurationGOOGLE(Allocator* alloc, VkStructureType rootType,
+                                           const VkRefreshCycleDurationGOOGLE* from,
+                                           VkRefreshCycleDurationGOOGLE* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkPastPresentationTimingGOOGLE(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPastPresentationTimingGOOGLE* from,
-    VkPastPresentationTimingGOOGLE* to)
-{
+void deepcopy_VkPastPresentationTimingGOOGLE(Allocator* alloc, VkStructureType rootType,
+                                             const VkPastPresentationTimingGOOGLE* from,
+                                             VkPastPresentationTimingGOOGLE* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkPresentTimeGOOGLE(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPresentTimeGOOGLE* from,
-    VkPresentTimeGOOGLE* to)
-{
+void deepcopy_VkPresentTimeGOOGLE(Allocator* alloc, VkStructureType rootType,
+                                  const VkPresentTimeGOOGLE* from, VkPresentTimeGOOGLE* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkPresentTimesInfoGOOGLE(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPresentTimesInfoGOOGLE* from,
-    VkPresentTimesInfoGOOGLE* to)
-{
+void deepcopy_VkPresentTimesInfoGOOGLE(Allocator* alloc, VkStructureType rootType,
+                                       const VkPresentTimesInfoGOOGLE* from,
+                                       VkPresentTimesInfoGOOGLE* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pTimes = nullptr;
-        if (from->pTimes)
-        {
-            to->pTimes = (VkPresentTimeGOOGLE*)alloc->alloc(from->swapchainCount * sizeof(const VkPresentTimeGOOGLE));
+        if (from->pTimes) {
+            to->pTimes = (VkPresentTimeGOOGLE*)alloc->alloc(from->swapchainCount *
+                                                            sizeof(const VkPresentTimeGOOGLE));
             to->swapchainCount = from->swapchainCount;
-            for (uint32_t i = 0; i < (uint32_t)from->swapchainCount; ++i)
-            {
-                deepcopy_VkPresentTimeGOOGLE(alloc, rootType, from->pTimes + i, (VkPresentTimeGOOGLE*)(to->pTimes + i));
+            for (uint32_t i = 0; i < (uint32_t)from->swapchainCount; ++i) {
+                deepcopy_VkPresentTimeGOOGLE(alloc, rootType, from->pTimes + i,
+                                             (VkPresentTimeGOOGLE*)(to->pTimes + i));
             }
         }
     }
@@ -13217,28 +10836,23 @@
 #endif
 #ifdef VK_NVX_multiview_per_view_attributes
 void deepcopy_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* from,
-    VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* to)
-{
+    VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -13246,53 +10860,43 @@
 
 #endif
 #ifdef VK_NV_viewport_swizzle
-void deepcopy_VkViewportSwizzleNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkViewportSwizzleNV* from,
-    VkViewportSwizzleNV* to)
-{
+void deepcopy_VkViewportSwizzleNV(Allocator* alloc, VkStructureType rootType,
+                                  const VkViewportSwizzleNV* from, VkViewportSwizzleNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkPipelineViewportSwizzleStateCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineViewportSwizzleStateCreateInfoNV* from,
-    VkPipelineViewportSwizzleStateCreateInfoNV* to)
-{
+    VkPipelineViewportSwizzleStateCreateInfoNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pViewportSwizzles = nullptr;
-        if (from->pViewportSwizzles)
-        {
-            to->pViewportSwizzles = (VkViewportSwizzleNV*)alloc->alloc(from->viewportCount * sizeof(const VkViewportSwizzleNV));
+        if (from->pViewportSwizzles) {
+            to->pViewportSwizzles = (VkViewportSwizzleNV*)alloc->alloc(
+                from->viewportCount * sizeof(const VkViewportSwizzleNV));
             to->viewportCount = from->viewportCount;
-            for (uint32_t i = 0; i < (uint32_t)from->viewportCount; ++i)
-            {
-                deepcopy_VkViewportSwizzleNV(alloc, rootType, from->pViewportSwizzles + i, (VkViewportSwizzleNV*)(to->pViewportSwizzles + i));
+            for (uint32_t i = 0; i < (uint32_t)from->viewportCount; ++i) {
+                deepcopy_VkViewportSwizzleNV(alloc, rootType, from->pViewportSwizzles + i,
+                                             (VkViewportSwizzleNV*)(to->pViewportSwizzles + i));
             }
         }
     }
@@ -13301,69 +10905,58 @@
 #endif
 #ifdef VK_EXT_discard_rectangles
 void deepcopy_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceDiscardRectanglePropertiesEXT* from,
-    VkPhysicalDeviceDiscardRectanglePropertiesEXT* to)
-{
+    VkPhysicalDeviceDiscardRectanglePropertiesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPipelineDiscardRectangleStateCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineDiscardRectangleStateCreateInfoEXT* from,
-    VkPipelineDiscardRectangleStateCreateInfoEXT* to)
-{
+    VkPipelineDiscardRectangleStateCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pDiscardRectangles = nullptr;
-        if (from->pDiscardRectangles)
-        {
-            to->pDiscardRectangles = (VkRect2D*)alloc->alloc(from->discardRectangleCount * sizeof(const VkRect2D));
+        if (from->pDiscardRectangles) {
+            to->pDiscardRectangles =
+                (VkRect2D*)alloc->alloc(from->discardRectangleCount * sizeof(const VkRect2D));
             to->discardRectangleCount = from->discardRectangleCount;
-            for (uint32_t i = 0; i < (uint32_t)from->discardRectangleCount; ++i)
-            {
-                deepcopy_VkRect2D(alloc, rootType, from->pDiscardRectangles + i, (VkRect2D*)(to->pDiscardRectangles + i));
+            for (uint32_t i = 0; i < (uint32_t)from->discardRectangleCount; ++i) {
+                deepcopy_VkRect2D(alloc, rootType, from->pDiscardRectangles + i,
+                                  (VkRect2D*)(to->pDiscardRectangles + i));
             }
         }
     }
@@ -13372,56 +10965,46 @@
 #endif
 #ifdef VK_EXT_conservative_rasterization
 void deepcopy_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceConservativeRasterizationPropertiesEXT* from,
-    VkPhysicalDeviceConservativeRasterizationPropertiesEXT* to)
-{
+    VkPhysicalDeviceConservativeRasterizationPropertiesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPipelineRasterizationConservativeStateCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineRasterizationConservativeStateCreateInfoEXT* from,
-    VkPipelineRasterizationConservativeStateCreateInfoEXT* to)
-{
+    VkPipelineRasterizationConservativeStateCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -13430,56 +11013,46 @@
 #endif
 #ifdef VK_EXT_depth_clip_enable
 void deepcopy_VkPhysicalDeviceDepthClipEnableFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceDepthClipEnableFeaturesEXT* from,
-    VkPhysicalDeviceDepthClipEnableFeaturesEXT* to)
-{
+    VkPhysicalDeviceDepthClipEnableFeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPipelineRasterizationDepthClipStateCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineRasterizationDepthClipStateCreateInfoEXT* from,
-    VkPipelineRasterizationDepthClipStateCreateInfoEXT* to)
-{
+    VkPipelineRasterizationDepthClipStateCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -13489,115 +11062,93 @@
 #ifdef VK_EXT_swapchain_colorspace
 #endif
 #ifdef VK_EXT_hdr_metadata
-void deepcopy_VkXYColorEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkXYColorEXT* from,
-    VkXYColorEXT* to)
-{
+void deepcopy_VkXYColorEXT(Allocator* alloc, VkStructureType rootType, const VkXYColorEXT* from,
+                           VkXYColorEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkHdrMetadataEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkHdrMetadataEXT* from,
-    VkHdrMetadataEXT* to)
-{
+void deepcopy_VkHdrMetadataEXT(Allocator* alloc, VkStructureType rootType,
+                               const VkHdrMetadataEXT* from, VkHdrMetadataEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkXYColorEXT(alloc, rootType, &from->displayPrimaryRed, (VkXYColorEXT*)(&to->displayPrimaryRed));
-    deepcopy_VkXYColorEXT(alloc, rootType, &from->displayPrimaryGreen, (VkXYColorEXT*)(&to->displayPrimaryGreen));
-    deepcopy_VkXYColorEXT(alloc, rootType, &from->displayPrimaryBlue, (VkXYColorEXT*)(&to->displayPrimaryBlue));
+    deepcopy_VkXYColorEXT(alloc, rootType, &from->displayPrimaryRed,
+                          (VkXYColorEXT*)(&to->displayPrimaryRed));
+    deepcopy_VkXYColorEXT(alloc, rootType, &from->displayPrimaryGreen,
+                          (VkXYColorEXT*)(&to->displayPrimaryGreen));
+    deepcopy_VkXYColorEXT(alloc, rootType, &from->displayPrimaryBlue,
+                          (VkXYColorEXT*)(&to->displayPrimaryBlue));
     deepcopy_VkXYColorEXT(alloc, rootType, &from->whitePoint, (VkXYColorEXT*)(&to->whitePoint));
 }
 
 #endif
 #ifdef VK_MVK_ios_surface
-void deepcopy_VkIOSSurfaceCreateInfoMVK(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkIOSSurfaceCreateInfoMVK* from,
-    VkIOSSurfaceCreateInfoMVK* to)
-{
+void deepcopy_VkIOSSurfaceCreateInfoMVK(Allocator* alloc, VkStructureType rootType,
+                                        const VkIOSSurfaceCreateInfoMVK* from,
+                                        VkIOSSurfaceCreateInfoMVK* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pView = nullptr;
-    if (from->pView)
-    {
+    if (from->pView) {
         to->pView = (void*)alloc->dupArray(from->pView, sizeof(const uint8_t));
     }
 }
 
 #endif
 #ifdef VK_MVK_macos_surface
-void deepcopy_VkMacOSSurfaceCreateInfoMVK(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMacOSSurfaceCreateInfoMVK* from,
-    VkMacOSSurfaceCreateInfoMVK* to)
-{
+void deepcopy_VkMacOSSurfaceCreateInfoMVK(Allocator* alloc, VkStructureType rootType,
+                                          const VkMacOSSurfaceCreateInfoMVK* from,
+                                          VkMacOSSurfaceCreateInfoMVK* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pView = nullptr;
-    if (from->pView)
-    {
+    if (from->pView) {
         to->pView = (void*)alloc->dupArray(from->pView, sizeof(const uint8_t));
     }
 }
@@ -13610,419 +11161,344 @@
 #ifdef VK_EXT_queue_family_foreign
 #endif
 #ifdef VK_EXT_debug_utils
-void deepcopy_VkDebugUtilsLabelEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDebugUtilsLabelEXT* from,
-    VkDebugUtilsLabelEXT* to)
-{
+void deepcopy_VkDebugUtilsLabelEXT(Allocator* alloc, VkStructureType rootType,
+                                   const VkDebugUtilsLabelEXT* from, VkDebugUtilsLabelEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pLabelName = nullptr;
-    if (from->pLabelName)
-    {
+    if (from->pLabelName) {
         to->pLabelName = alloc->strDup(from->pLabelName);
     }
     memcpy(to->color, from->color, 4 * sizeof(float));
 }
 
-void deepcopy_VkDebugUtilsObjectNameInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDebugUtilsObjectNameInfoEXT* from,
-    VkDebugUtilsObjectNameInfoEXT* to)
-{
+void deepcopy_VkDebugUtilsObjectNameInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                            const VkDebugUtilsObjectNameInfoEXT* from,
+                                            VkDebugUtilsObjectNameInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pObjectName = nullptr;
-    if (from->pObjectName)
-    {
+    if (from->pObjectName) {
         to->pObjectName = alloc->strDup(from->pObjectName);
     }
 }
 
-void deepcopy_VkDebugUtilsMessengerCallbackDataEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDebugUtilsMessengerCallbackDataEXT* from,
-    VkDebugUtilsMessengerCallbackDataEXT* to)
-{
+void deepcopy_VkDebugUtilsMessengerCallbackDataEXT(Allocator* alloc, VkStructureType rootType,
+                                                   const VkDebugUtilsMessengerCallbackDataEXT* from,
+                                                   VkDebugUtilsMessengerCallbackDataEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pMessageIdName = nullptr;
-    if (from->pMessageIdName)
-    {
+    if (from->pMessageIdName) {
         to->pMessageIdName = alloc->strDup(from->pMessageIdName);
     }
     to->pMessage = nullptr;
-    if (from->pMessage)
-    {
+    if (from->pMessage) {
         to->pMessage = alloc->strDup(from->pMessage);
     }
-    if (from)
-    {
+    if (from) {
         to->pQueueLabels = nullptr;
-        if (from->pQueueLabels)
-        {
-            to->pQueueLabels = (VkDebugUtilsLabelEXT*)alloc->alloc(from->queueLabelCount * sizeof(VkDebugUtilsLabelEXT));
+        if (from->pQueueLabels) {
+            to->pQueueLabels = (VkDebugUtilsLabelEXT*)alloc->alloc(from->queueLabelCount *
+                                                                   sizeof(VkDebugUtilsLabelEXT));
             to->queueLabelCount = from->queueLabelCount;
-            for (uint32_t i = 0; i < (uint32_t)from->queueLabelCount; ++i)
-            {
-                deepcopy_VkDebugUtilsLabelEXT(alloc, rootType, from->pQueueLabels + i, (VkDebugUtilsLabelEXT*)(to->pQueueLabels + i));
+            for (uint32_t i = 0; i < (uint32_t)from->queueLabelCount; ++i) {
+                deepcopy_VkDebugUtilsLabelEXT(alloc, rootType, from->pQueueLabels + i,
+                                              (VkDebugUtilsLabelEXT*)(to->pQueueLabels + i));
             }
         }
     }
-    if (from)
-    {
+    if (from) {
         to->pCmdBufLabels = nullptr;
-        if (from->pCmdBufLabels)
-        {
-            to->pCmdBufLabels = (VkDebugUtilsLabelEXT*)alloc->alloc(from->cmdBufLabelCount * sizeof(VkDebugUtilsLabelEXT));
+        if (from->pCmdBufLabels) {
+            to->pCmdBufLabels = (VkDebugUtilsLabelEXT*)alloc->alloc(from->cmdBufLabelCount *
+                                                                    sizeof(VkDebugUtilsLabelEXT));
             to->cmdBufLabelCount = from->cmdBufLabelCount;
-            for (uint32_t i = 0; i < (uint32_t)from->cmdBufLabelCount; ++i)
-            {
-                deepcopy_VkDebugUtilsLabelEXT(alloc, rootType, from->pCmdBufLabels + i, (VkDebugUtilsLabelEXT*)(to->pCmdBufLabels + i));
+            for (uint32_t i = 0; i < (uint32_t)from->cmdBufLabelCount; ++i) {
+                deepcopy_VkDebugUtilsLabelEXT(alloc, rootType, from->pCmdBufLabels + i,
+                                              (VkDebugUtilsLabelEXT*)(to->pCmdBufLabels + i));
             }
         }
     }
-    if (from)
-    {
+    if (from) {
         to->pObjects = nullptr;
-        if (from->pObjects)
-        {
-            to->pObjects = (VkDebugUtilsObjectNameInfoEXT*)alloc->alloc(from->objectCount * sizeof(VkDebugUtilsObjectNameInfoEXT));
+        if (from->pObjects) {
+            to->pObjects = (VkDebugUtilsObjectNameInfoEXT*)alloc->alloc(
+                from->objectCount * sizeof(VkDebugUtilsObjectNameInfoEXT));
             to->objectCount = from->objectCount;
-            for (uint32_t i = 0; i < (uint32_t)from->objectCount; ++i)
-            {
-                deepcopy_VkDebugUtilsObjectNameInfoEXT(alloc, rootType, from->pObjects + i, (VkDebugUtilsObjectNameInfoEXT*)(to->pObjects + i));
+            for (uint32_t i = 0; i < (uint32_t)from->objectCount; ++i) {
+                deepcopy_VkDebugUtilsObjectNameInfoEXT(
+                    alloc, rootType, from->pObjects + i,
+                    (VkDebugUtilsObjectNameInfoEXT*)(to->pObjects + i));
             }
         }
     }
 }
 
-void deepcopy_VkDebugUtilsMessengerCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDebugUtilsMessengerCreateInfoEXT* from,
-    VkDebugUtilsMessengerCreateInfoEXT* to)
-{
+void deepcopy_VkDebugUtilsMessengerCreateInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                                 const VkDebugUtilsMessengerCreateInfoEXT* from,
+                                                 VkDebugUtilsMessengerCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pUserData = nullptr;
-    if (from->pUserData)
-    {
+    if (from->pUserData) {
         to->pUserData = (void*)alloc->dupArray(from->pUserData, sizeof(uint8_t));
     }
 }
 
-void deepcopy_VkDebugUtilsObjectTagInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDebugUtilsObjectTagInfoEXT* from,
-    VkDebugUtilsObjectTagInfoEXT* to)
-{
+void deepcopy_VkDebugUtilsObjectTagInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                           const VkDebugUtilsObjectTagInfoEXT* from,
+                                           VkDebugUtilsObjectTagInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pTag = nullptr;
-    if (from->pTag)
-    {
+    if (from->pTag) {
         to->pTag = (void*)alloc->dupArray(from->pTag, from->tagSize * sizeof(const uint8_t));
     }
 }
 
 #endif
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
-void deepcopy_VkAndroidHardwareBufferUsageANDROID(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAndroidHardwareBufferUsageANDROID* from,
-    VkAndroidHardwareBufferUsageANDROID* to)
-{
+void deepcopy_VkAndroidHardwareBufferUsageANDROID(Allocator* alloc, VkStructureType rootType,
+                                                  const VkAndroidHardwareBufferUsageANDROID* from,
+                                                  VkAndroidHardwareBufferUsageANDROID* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkAndroidHardwareBufferPropertiesANDROID(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkAndroidHardwareBufferPropertiesANDROID* from,
-    VkAndroidHardwareBufferPropertiesANDROID* to)
-{
+    VkAndroidHardwareBufferPropertiesANDROID* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkAndroidHardwareBufferFormatPropertiesANDROID(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkAndroidHardwareBufferFormatPropertiesANDROID* from,
-    VkAndroidHardwareBufferFormatPropertiesANDROID* to)
-{
+    VkAndroidHardwareBufferFormatPropertiesANDROID* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkComponentMapping(alloc, rootType, &from->samplerYcbcrConversionComponents, (VkComponentMapping*)(&to->samplerYcbcrConversionComponents));
+    deepcopy_VkComponentMapping(alloc, rootType, &from->samplerYcbcrConversionComponents,
+                                (VkComponentMapping*)(&to->samplerYcbcrConversionComponents));
 }
 
 void deepcopy_VkImportAndroidHardwareBufferInfoANDROID(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkImportAndroidHardwareBufferInfoANDROID* from,
-    VkImportAndroidHardwareBufferInfoANDROID* to)
-{
+    VkImportAndroidHardwareBufferInfoANDROID* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->buffer = nullptr;
-    if (from->buffer)
-    {
+    if (from->buffer) {
         to->buffer = (AHardwareBuffer*)alloc->dupArray(from->buffer, sizeof(AHardwareBuffer));
     }
 }
 
 void deepcopy_VkMemoryGetAndroidHardwareBufferInfoANDROID(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkMemoryGetAndroidHardwareBufferInfoANDROID* from,
-    VkMemoryGetAndroidHardwareBufferInfoANDROID* to)
-{
+    VkMemoryGetAndroidHardwareBufferInfoANDROID* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkExternalFormatANDROID(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExternalFormatANDROID* from,
-    VkExternalFormatANDROID* to)
-{
+void deepcopy_VkExternalFormatANDROID(Allocator* alloc, VkStructureType rootType,
+                                      const VkExternalFormatANDROID* from,
+                                      VkExternalFormatANDROID* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkAndroidHardwareBufferFormatProperties2ANDROID(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkAndroidHardwareBufferFormatProperties2ANDROID* from,
-    VkAndroidHardwareBufferFormatProperties2ANDROID* to)
-{
+    VkAndroidHardwareBufferFormatProperties2ANDROID* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkComponentMapping(alloc, rootType, &from->samplerYcbcrConversionComponents, (VkComponentMapping*)(&to->samplerYcbcrConversionComponents));
+    deepcopy_VkComponentMapping(alloc, rootType, &from->samplerYcbcrConversionComponents,
+                                (VkComponentMapping*)(&to->samplerYcbcrConversionComponents));
 }
 
 #endif
@@ -14036,117 +11512,96 @@
 #endif
 #ifdef VK_EXT_inline_uniform_block
 void deepcopy_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceInlineUniformBlockFeaturesEXT* from,
-    VkPhysicalDeviceInlineUniformBlockFeaturesEXT* to)
-{
+    VkPhysicalDeviceInlineUniformBlockFeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceInlineUniformBlockPropertiesEXT* from,
-    VkPhysicalDeviceInlineUniformBlockPropertiesEXT* to)
-{
+    VkPhysicalDeviceInlineUniformBlockPropertiesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkWriteDescriptorSetInlineUniformBlockEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkWriteDescriptorSetInlineUniformBlockEXT* from,
-    VkWriteDescriptorSetInlineUniformBlockEXT* to)
-{
+    VkWriteDescriptorSetInlineUniformBlockEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pData = nullptr;
-    if (from->pData)
-    {
+    if (from->pData) {
         to->pData = (void*)alloc->dupArray(from->pData, from->dataSize * sizeof(const uint8_t));
     }
 }
 
 void deepcopy_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkDescriptorPoolInlineUniformBlockCreateInfoEXT* from,
-    VkDescriptorPoolInlineUniformBlockCreateInfoEXT* to)
-{
+    VkDescriptorPoolInlineUniformBlockCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -14156,306 +11611,260 @@
 #ifdef VK_EXT_shader_stencil_export
 #endif
 #ifdef VK_EXT_sample_locations
-void deepcopy_VkSampleLocationEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSampleLocationEXT* from,
-    VkSampleLocationEXT* to)
-{
+void deepcopy_VkSampleLocationEXT(Allocator* alloc, VkStructureType rootType,
+                                  const VkSampleLocationEXT* from, VkSampleLocationEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkSampleLocationsInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSampleLocationsInfoEXT* from,
-    VkSampleLocationsInfoEXT* to)
-{
+void deepcopy_VkSampleLocationsInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                       const VkSampleLocationsInfoEXT* from,
+                                       VkSampleLocationsInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    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->sampleLocationGridSize, (VkExtent2D*)(&to->sampleLocationGridSize));
-    if (from)
-    {
+    deepcopy_VkExtent2D(alloc, rootType, &from->sampleLocationGridSize,
+                        (VkExtent2D*)(&to->sampleLocationGridSize));
+    if (from) {
         to->pSampleLocations = nullptr;
-        if (from->pSampleLocations)
-        {
-            to->pSampleLocations = (VkSampleLocationEXT*)alloc->alloc(from->sampleLocationsCount * sizeof(const VkSampleLocationEXT));
+        if (from->pSampleLocations) {
+            to->pSampleLocations = (VkSampleLocationEXT*)alloc->alloc(
+                from->sampleLocationsCount * sizeof(const VkSampleLocationEXT));
             to->sampleLocationsCount = from->sampleLocationsCount;
-            for (uint32_t i = 0; i < (uint32_t)from->sampleLocationsCount; ++i)
-            {
-                deepcopy_VkSampleLocationEXT(alloc, rootType, from->pSampleLocations + i, (VkSampleLocationEXT*)(to->pSampleLocations + i));
+            for (uint32_t i = 0; i < (uint32_t)from->sampleLocationsCount; ++i) {
+                deepcopy_VkSampleLocationEXT(alloc, rootType, from->pSampleLocations + i,
+                                             (VkSampleLocationEXT*)(to->pSampleLocations + i));
             }
         }
     }
 }
 
-void deepcopy_VkAttachmentSampleLocationsEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAttachmentSampleLocationsEXT* from,
-    VkAttachmentSampleLocationsEXT* to)
-{
+void deepcopy_VkAttachmentSampleLocationsEXT(Allocator* alloc, VkStructureType rootType,
+                                             const VkAttachmentSampleLocationsEXT* from,
+                                             VkAttachmentSampleLocationsEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    deepcopy_VkSampleLocationsInfoEXT(alloc, rootType, &from->sampleLocationsInfo, (VkSampleLocationsInfoEXT*)(&to->sampleLocationsInfo));
+    deepcopy_VkSampleLocationsInfoEXT(alloc, rootType, &from->sampleLocationsInfo,
+                                      (VkSampleLocationsInfoEXT*)(&to->sampleLocationsInfo));
 }
 
-void deepcopy_VkSubpassSampleLocationsEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSubpassSampleLocationsEXT* from,
-    VkSubpassSampleLocationsEXT* to)
-{
+void deepcopy_VkSubpassSampleLocationsEXT(Allocator* alloc, VkStructureType rootType,
+                                          const VkSubpassSampleLocationsEXT* from,
+                                          VkSubpassSampleLocationsEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    deepcopy_VkSampleLocationsInfoEXT(alloc, rootType, &from->sampleLocationsInfo, (VkSampleLocationsInfoEXT*)(&to->sampleLocationsInfo));
+    deepcopy_VkSampleLocationsInfoEXT(alloc, rootType, &from->sampleLocationsInfo,
+                                      (VkSampleLocationsInfoEXT*)(&to->sampleLocationsInfo));
 }
 
 void deepcopy_VkRenderPassSampleLocationsBeginInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkRenderPassSampleLocationsBeginInfoEXT* from,
-    VkRenderPassSampleLocationsBeginInfoEXT* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkRenderPassSampleLocationsBeginInfoEXT* from,
+    VkRenderPassSampleLocationsBeginInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pAttachmentInitialSampleLocations = nullptr;
-        if (from->pAttachmentInitialSampleLocations)
-        {
-            to->pAttachmentInitialSampleLocations = (VkAttachmentSampleLocationsEXT*)alloc->alloc(from->attachmentInitialSampleLocationsCount * sizeof(const VkAttachmentSampleLocationsEXT));
+        if (from->pAttachmentInitialSampleLocations) {
+            to->pAttachmentInitialSampleLocations = (VkAttachmentSampleLocationsEXT*)alloc->alloc(
+                from->attachmentInitialSampleLocationsCount *
+                sizeof(const VkAttachmentSampleLocationsEXT));
             to->attachmentInitialSampleLocationsCount = from->attachmentInitialSampleLocationsCount;
-            for (uint32_t i = 0; i < (uint32_t)from->attachmentInitialSampleLocationsCount; ++i)
-            {
-                deepcopy_VkAttachmentSampleLocationsEXT(alloc, rootType, from->pAttachmentInitialSampleLocations + i, (VkAttachmentSampleLocationsEXT*)(to->pAttachmentInitialSampleLocations + i));
+            for (uint32_t i = 0; i < (uint32_t)from->attachmentInitialSampleLocationsCount; ++i) {
+                deepcopy_VkAttachmentSampleLocationsEXT(
+                    alloc, rootType, from->pAttachmentInitialSampleLocations + i,
+                    (VkAttachmentSampleLocationsEXT*)(to->pAttachmentInitialSampleLocations + i));
             }
         }
     }
-    if (from)
-    {
+    if (from) {
         to->pPostSubpassSampleLocations = nullptr;
-        if (from->pPostSubpassSampleLocations)
-        {
-            to->pPostSubpassSampleLocations = (VkSubpassSampleLocationsEXT*)alloc->alloc(from->postSubpassSampleLocationsCount * sizeof(const VkSubpassSampleLocationsEXT));
+        if (from->pPostSubpassSampleLocations) {
+            to->pPostSubpassSampleLocations = (VkSubpassSampleLocationsEXT*)alloc->alloc(
+                from->postSubpassSampleLocationsCount * sizeof(const VkSubpassSampleLocationsEXT));
             to->postSubpassSampleLocationsCount = from->postSubpassSampleLocationsCount;
-            for (uint32_t i = 0; i < (uint32_t)from->postSubpassSampleLocationsCount; ++i)
-            {
-                deepcopy_VkSubpassSampleLocationsEXT(alloc, rootType, from->pPostSubpassSampleLocations + i, (VkSubpassSampleLocationsEXT*)(to->pPostSubpassSampleLocations + i));
+            for (uint32_t i = 0; i < (uint32_t)from->postSubpassSampleLocationsCount; ++i) {
+                deepcopy_VkSubpassSampleLocationsEXT(
+                    alloc, rootType, from->pPostSubpassSampleLocations + i,
+                    (VkSubpassSampleLocationsEXT*)(to->pPostSubpassSampleLocations + i));
             }
         }
     }
 }
 
 void deepcopy_VkPipelineSampleLocationsStateCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineSampleLocationsStateCreateInfoEXT* from,
-    VkPipelineSampleLocationsStateCreateInfoEXT* to)
-{
+    VkPipelineSampleLocationsStateCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkSampleLocationsInfoEXT(alloc, rootType, &from->sampleLocationsInfo, (VkSampleLocationsInfoEXT*)(&to->sampleLocationsInfo));
+    deepcopy_VkSampleLocationsInfoEXT(alloc, rootType, &from->sampleLocationsInfo,
+                                      (VkSampleLocationsInfoEXT*)(&to->sampleLocationsInfo));
 }
 
 void deepcopy_VkPhysicalDeviceSampleLocationsPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceSampleLocationsPropertiesEXT* from,
-    VkPhysicalDeviceSampleLocationsPropertiesEXT* to)
-{
+    VkPhysicalDeviceSampleLocationsPropertiesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    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->maxSampleLocationGridSize, (VkExtent2D*)(&to->maxSampleLocationGridSize));
-    memcpy(to->sampleLocationCoordinateRange, from->sampleLocationCoordinateRange, 2 * sizeof(float));
+    deepcopy_VkExtent2D(alloc, rootType, &from->maxSampleLocationGridSize,
+                        (VkExtent2D*)(&to->maxSampleLocationGridSize));
+    memcpy(to->sampleLocationCoordinateRange, from->sampleLocationCoordinateRange,
+           2 * sizeof(float));
 }
 
-void deepcopy_VkMultisamplePropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMultisamplePropertiesEXT* from,
-    VkMultisamplePropertiesEXT* to)
-{
+void deepcopy_VkMultisamplePropertiesEXT(Allocator* alloc, VkStructureType rootType,
+                                         const VkMultisamplePropertiesEXT* from,
+                                         VkMultisamplePropertiesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    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->maxSampleLocationGridSize, (VkExtent2D*)(&to->maxSampleLocationGridSize));
+    deepcopy_VkExtent2D(alloc, rootType, &from->maxSampleLocationGridSize,
+                        (VkExtent2D*)(&to->maxSampleLocationGridSize));
 }
 
 #endif
 #ifdef VK_EXT_blend_operation_advanced
 void deepcopy_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* from,
-    VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* to)
-{
+    VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* from,
-    VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* to)
-{
+    VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineColorBlendAdvancedStateCreateInfoEXT* from,
-    VkPipelineColorBlendAdvancedStateCreateInfoEXT* to)
-{
+    VkPipelineColorBlendAdvancedStateCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -14464,28 +11873,23 @@
 #endif
 #ifdef VK_NV_fragment_coverage_to_color
 void deepcopy_VkPipelineCoverageToColorStateCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineCoverageToColorStateCreateInfoNV* from,
-    VkPipelineCoverageToColorStateCreateInfoNV* to)
-{
+    VkPipelineCoverageToColorStateCreateInfoNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -14494,35 +11898,31 @@
 #endif
 #ifdef VK_NV_framebuffer_mixed_samples
 void deepcopy_VkPipelineCoverageModulationStateCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineCoverageModulationStateCreateInfoNV* from,
-    VkPipelineCoverageModulationStateCreateInfoNV* to)
-{
+    VkPipelineCoverageModulationStateCreateInfoNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pCoverageModulationTable = nullptr;
-    if (from->pCoverageModulationTable)
-    {
-        to->pCoverageModulationTable = (float*)alloc->dupArray(from->pCoverageModulationTable, from->coverageModulationTableCount * sizeof(const float));
+    if (from->pCoverageModulationTable) {
+        to->pCoverageModulationTable =
+            (float*)alloc->dupArray(from->pCoverageModulationTable,
+                                    from->coverageModulationTableCount * sizeof(const float));
     }
 }
 
@@ -14531,56 +11931,46 @@
 #endif
 #ifdef VK_NV_shader_sm_builtins
 void deepcopy_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* from,
-    VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* to)
-{
+    VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* from,
-    VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* to)
-{
+    VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -14590,240 +11980,200 @@
 #ifdef VK_EXT_post_depth_coverage
 #endif
 #ifdef VK_EXT_image_drm_format_modifier
-void deepcopy_VkDrmFormatModifierPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDrmFormatModifierPropertiesEXT* from,
-    VkDrmFormatModifierPropertiesEXT* to)
-{
+void deepcopy_VkDrmFormatModifierPropertiesEXT(Allocator* alloc, VkStructureType rootType,
+                                               const VkDrmFormatModifierPropertiesEXT* from,
+                                               VkDrmFormatModifierPropertiesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkDrmFormatModifierPropertiesListEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDrmFormatModifierPropertiesListEXT* from,
-    VkDrmFormatModifierPropertiesListEXT* to)
-{
+void deepcopy_VkDrmFormatModifierPropertiesListEXT(Allocator* alloc, VkStructureType rootType,
+                                                   const VkDrmFormatModifierPropertiesListEXT* from,
+                                                   VkDrmFormatModifierPropertiesListEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pDrmFormatModifierProperties = nullptr;
-        if (from->pDrmFormatModifierProperties)
-        {
-            to->pDrmFormatModifierProperties = (VkDrmFormatModifierPropertiesEXT*)alloc->alloc(from->drmFormatModifierCount * sizeof(VkDrmFormatModifierPropertiesEXT));
+        if (from->pDrmFormatModifierProperties) {
+            to->pDrmFormatModifierProperties = (VkDrmFormatModifierPropertiesEXT*)alloc->alloc(
+                from->drmFormatModifierCount * sizeof(VkDrmFormatModifierPropertiesEXT));
             to->drmFormatModifierCount = from->drmFormatModifierCount;
-            for (uint32_t i = 0; i < (uint32_t)from->drmFormatModifierCount; ++i)
-            {
-                deepcopy_VkDrmFormatModifierPropertiesEXT(alloc, rootType, from->pDrmFormatModifierProperties + i, (VkDrmFormatModifierPropertiesEXT*)(to->pDrmFormatModifierProperties + i));
+            for (uint32_t i = 0; i < (uint32_t)from->drmFormatModifierCount; ++i) {
+                deepcopy_VkDrmFormatModifierPropertiesEXT(
+                    alloc, rootType, from->pDrmFormatModifierProperties + i,
+                    (VkDrmFormatModifierPropertiesEXT*)(to->pDrmFormatModifierProperties + i));
             }
         }
     }
 }
 
 void deepcopy_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceImageDrmFormatModifierInfoEXT* from,
-    VkPhysicalDeviceImageDrmFormatModifierInfoEXT* to)
-{
+    VkPhysicalDeviceImageDrmFormatModifierInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pQueueFamilyIndices = nullptr;
-    if (from->pQueueFamilyIndices)
-    {
-        to->pQueueFamilyIndices = (uint32_t*)alloc->dupArray(from->pQueueFamilyIndices, from->queueFamilyIndexCount * sizeof(const uint32_t));
+    if (from->pQueueFamilyIndices) {
+        to->pQueueFamilyIndices = (uint32_t*)alloc->dupArray(
+            from->pQueueFamilyIndices, from->queueFamilyIndexCount * sizeof(const uint32_t));
     }
 }
 
 void deepcopy_VkImageDrmFormatModifierListCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkImageDrmFormatModifierListCreateInfoEXT* from,
-    VkImageDrmFormatModifierListCreateInfoEXT* to)
-{
+    VkImageDrmFormatModifierListCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pDrmFormatModifiers = nullptr;
-    if (from->pDrmFormatModifiers)
-    {
-        to->pDrmFormatModifiers = (uint64_t*)alloc->dupArray(from->pDrmFormatModifiers, from->drmFormatModifierCount * sizeof(const uint64_t));
+    if (from->pDrmFormatModifiers) {
+        to->pDrmFormatModifiers = (uint64_t*)alloc->dupArray(
+            from->pDrmFormatModifiers, from->drmFormatModifierCount * sizeof(const uint64_t));
     }
 }
 
 void deepcopy_VkImageDrmFormatModifierExplicitCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkImageDrmFormatModifierExplicitCreateInfoEXT* from,
-    VkImageDrmFormatModifierExplicitCreateInfoEXT* to)
-{
+    VkImageDrmFormatModifierExplicitCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pPlaneLayouts = nullptr;
-        if (from->pPlaneLayouts)
-        {
-            to->pPlaneLayouts = (VkSubresourceLayout*)alloc->alloc(from->drmFormatModifierPlaneCount * sizeof(const VkSubresourceLayout));
+        if (from->pPlaneLayouts) {
+            to->pPlaneLayouts = (VkSubresourceLayout*)alloc->alloc(
+                from->drmFormatModifierPlaneCount * sizeof(const VkSubresourceLayout));
             to->drmFormatModifierPlaneCount = from->drmFormatModifierPlaneCount;
-            for (uint32_t i = 0; i < (uint32_t)from->drmFormatModifierPlaneCount; ++i)
-            {
-                deepcopy_VkSubresourceLayout(alloc, rootType, from->pPlaneLayouts + i, (VkSubresourceLayout*)(to->pPlaneLayouts + i));
+            for (uint32_t i = 0; i < (uint32_t)from->drmFormatModifierPlaneCount; ++i) {
+                deepcopy_VkSubresourceLayout(alloc, rootType, from->pPlaneLayouts + i,
+                                             (VkSubresourceLayout*)(to->pPlaneLayouts + i));
             }
         }
     }
 }
 
 void deepcopy_VkImageDrmFormatModifierPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageDrmFormatModifierPropertiesEXT* from,
-    VkImageDrmFormatModifierPropertiesEXT* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkImageDrmFormatModifierPropertiesEXT* from,
+    VkImageDrmFormatModifierPropertiesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkDrmFormatModifierProperties2EXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDrmFormatModifierProperties2EXT* from,
-    VkDrmFormatModifierProperties2EXT* to)
-{
+void deepcopy_VkDrmFormatModifierProperties2EXT(Allocator* alloc, VkStructureType rootType,
+                                                const VkDrmFormatModifierProperties2EXT* from,
+                                                VkDrmFormatModifierProperties2EXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkDrmFormatModifierPropertiesList2EXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDrmFormatModifierPropertiesList2EXT* from,
-    VkDrmFormatModifierPropertiesList2EXT* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkDrmFormatModifierPropertiesList2EXT* from,
+    VkDrmFormatModifierPropertiesList2EXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pDrmFormatModifierProperties = nullptr;
-        if (from->pDrmFormatModifierProperties)
-        {
-            to->pDrmFormatModifierProperties = (VkDrmFormatModifierProperties2EXT*)alloc->alloc(from->drmFormatModifierCount * sizeof(VkDrmFormatModifierProperties2EXT));
+        if (from->pDrmFormatModifierProperties) {
+            to->pDrmFormatModifierProperties = (VkDrmFormatModifierProperties2EXT*)alloc->alloc(
+                from->drmFormatModifierCount * sizeof(VkDrmFormatModifierProperties2EXT));
             to->drmFormatModifierCount = from->drmFormatModifierCount;
-            for (uint32_t i = 0; i < (uint32_t)from->drmFormatModifierCount; ++i)
-            {
-                deepcopy_VkDrmFormatModifierProperties2EXT(alloc, rootType, from->pDrmFormatModifierProperties + i, (VkDrmFormatModifierProperties2EXT*)(to->pDrmFormatModifierProperties + i));
+            for (uint32_t i = 0; i < (uint32_t)from->drmFormatModifierCount; ++i) {
+                deepcopy_VkDrmFormatModifierProperties2EXT(
+                    alloc, rootType, from->pDrmFormatModifierProperties + i,
+                    (VkDrmFormatModifierProperties2EXT*)(to->pDrmFormatModifierProperties + i));
             }
         }
     }
@@ -14831,62 +12181,51 @@
 
 #endif
 #ifdef VK_EXT_validation_cache
-void deepcopy_VkValidationCacheCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkValidationCacheCreateInfoEXT* from,
-    VkValidationCacheCreateInfoEXT* to)
-{
+void deepcopy_VkValidationCacheCreateInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                             const VkValidationCacheCreateInfoEXT* from,
+                                             VkValidationCacheCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pInitialData = nullptr;
-    if (from->pInitialData)
-    {
-        to->pInitialData = (void*)alloc->dupArray(from->pInitialData, from->initialDataSize * sizeof(const uint8_t));
+    if (from->pInitialData) {
+        to->pInitialData = (void*)alloc->dupArray(from->pInitialData,
+                                                  from->initialDataSize * sizeof(const uint8_t));
     }
 }
 
 void deepcopy_VkShaderModuleValidationCacheCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkShaderModuleValidationCacheCreateInfoEXT* from,
-    VkShaderModuleValidationCacheCreateInfoEXT* to)
-{
+    VkShaderModuleValidationCacheCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -14898,191 +12237,164 @@
 #ifdef VK_EXT_shader_viewport_index_layer
 #endif
 #ifdef VK_NV_shading_rate_image
-void deepcopy_VkShadingRatePaletteNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkShadingRatePaletteNV* from,
-    VkShadingRatePaletteNV* to)
-{
+void deepcopy_VkShadingRatePaletteNV(Allocator* alloc, VkStructureType rootType,
+                                     const VkShadingRatePaletteNV* from,
+                                     VkShadingRatePaletteNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
     to->pShadingRatePaletteEntries = nullptr;
-    if (from->pShadingRatePaletteEntries)
-    {
-        to->pShadingRatePaletteEntries = (VkShadingRatePaletteEntryNV*)alloc->dupArray(from->pShadingRatePaletteEntries, from->shadingRatePaletteEntryCount * sizeof(const VkShadingRatePaletteEntryNV));
+    if (from->pShadingRatePaletteEntries) {
+        to->pShadingRatePaletteEntries = (VkShadingRatePaletteEntryNV*)alloc->dupArray(
+            from->pShadingRatePaletteEntries,
+            from->shadingRatePaletteEntryCount * sizeof(const VkShadingRatePaletteEntryNV));
     }
 }
 
 void deepcopy_VkPipelineViewportShadingRateImageStateCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineViewportShadingRateImageStateCreateInfoNV* from,
-    VkPipelineViewportShadingRateImageStateCreateInfoNV* to)
-{
+    VkPipelineViewportShadingRateImageStateCreateInfoNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pShadingRatePalettes = nullptr;
-        if (from->pShadingRatePalettes)
-        {
-            to->pShadingRatePalettes = (VkShadingRatePaletteNV*)alloc->alloc(from->viewportCount * sizeof(const VkShadingRatePaletteNV));
+        if (from->pShadingRatePalettes) {
+            to->pShadingRatePalettes = (VkShadingRatePaletteNV*)alloc->alloc(
+                from->viewportCount * sizeof(const VkShadingRatePaletteNV));
             to->viewportCount = from->viewportCount;
-            for (uint32_t i = 0; i < (uint32_t)from->viewportCount; ++i)
-            {
-                deepcopy_VkShadingRatePaletteNV(alloc, rootType, from->pShadingRatePalettes + i, (VkShadingRatePaletteNV*)(to->pShadingRatePalettes + i));
+            for (uint32_t i = 0; i < (uint32_t)from->viewportCount; ++i) {
+                deepcopy_VkShadingRatePaletteNV(
+                    alloc, rootType, from->pShadingRatePalettes + i,
+                    (VkShadingRatePaletteNV*)(to->pShadingRatePalettes + i));
             }
         }
     }
 }
 
 void deepcopy_VkPhysicalDeviceShadingRateImageFeaturesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShadingRateImageFeaturesNV* from,
-    VkPhysicalDeviceShadingRateImageFeaturesNV* to)
-{
+    VkPhysicalDeviceShadingRateImageFeaturesNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceShadingRateImagePropertiesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShadingRateImagePropertiesNV* from,
-    VkPhysicalDeviceShadingRateImagePropertiesNV* to)
-{
+    VkPhysicalDeviceShadingRateImagePropertiesNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    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->shadingRateTexelSize, (VkExtent2D*)(&to->shadingRateTexelSize));
+    deepcopy_VkExtent2D(alloc, rootType, &from->shadingRateTexelSize,
+                        (VkExtent2D*)(&to->shadingRateTexelSize));
 }
 
-void deepcopy_VkCoarseSampleLocationNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCoarseSampleLocationNV* from,
-    VkCoarseSampleLocationNV* to)
-{
+void deepcopy_VkCoarseSampleLocationNV(Allocator* alloc, VkStructureType rootType,
+                                       const VkCoarseSampleLocationNV* from,
+                                       VkCoarseSampleLocationNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkCoarseSampleOrderCustomNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCoarseSampleOrderCustomNV* from,
-    VkCoarseSampleOrderCustomNV* to)
-{
+void deepcopy_VkCoarseSampleOrderCustomNV(Allocator* alloc, VkStructureType rootType,
+                                          const VkCoarseSampleOrderCustomNV* from,
+                                          VkCoarseSampleOrderCustomNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (from)
-    {
+    if (from) {
         to->pSampleLocations = nullptr;
-        if (from->pSampleLocations)
-        {
-            to->pSampleLocations = (VkCoarseSampleLocationNV*)alloc->alloc(from->sampleLocationCount * sizeof(const VkCoarseSampleLocationNV));
+        if (from->pSampleLocations) {
+            to->pSampleLocations = (VkCoarseSampleLocationNV*)alloc->alloc(
+                from->sampleLocationCount * sizeof(const VkCoarseSampleLocationNV));
             to->sampleLocationCount = from->sampleLocationCount;
-            for (uint32_t i = 0; i < (uint32_t)from->sampleLocationCount; ++i)
-            {
-                deepcopy_VkCoarseSampleLocationNV(alloc, rootType, from->pSampleLocations + i, (VkCoarseSampleLocationNV*)(to->pSampleLocations + i));
+            for (uint32_t i = 0; i < (uint32_t)from->sampleLocationCount; ++i) {
+                deepcopy_VkCoarseSampleLocationNV(
+                    alloc, rootType, from->pSampleLocations + i,
+                    (VkCoarseSampleLocationNV*)(to->pSampleLocations + i));
             }
         }
     }
 }
 
 void deepcopy_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* from,
-    VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* to)
-{
+    VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pCustomSampleOrders = nullptr;
-        if (from->pCustomSampleOrders)
-        {
-            to->pCustomSampleOrders = (VkCoarseSampleOrderCustomNV*)alloc->alloc(from->customSampleOrderCount * sizeof(const VkCoarseSampleOrderCustomNV));
+        if (from->pCustomSampleOrders) {
+            to->pCustomSampleOrders = (VkCoarseSampleOrderCustomNV*)alloc->alloc(
+                from->customSampleOrderCount * sizeof(const VkCoarseSampleOrderCustomNV));
             to->customSampleOrderCount = from->customSampleOrderCount;
-            for (uint32_t i = 0; i < (uint32_t)from->customSampleOrderCount; ++i)
-            {
-                deepcopy_VkCoarseSampleOrderCustomNV(alloc, rootType, from->pCustomSampleOrders + i, (VkCoarseSampleOrderCustomNV*)(to->pCustomSampleOrders + i));
+            for (uint32_t i = 0; i < (uint32_t)from->customSampleOrderCount; ++i) {
+                deepcopy_VkCoarseSampleOrderCustomNV(
+                    alloc, rootType, from->pCustomSampleOrders + i,
+                    (VkCoarseSampleOrderCustomNV*)(to->pCustomSampleOrders + i));
             }
         }
     }
@@ -15090,466 +12402,377 @@
 
 #endif
 #ifdef VK_NV_ray_tracing
-void deepcopy_VkRayTracingShaderGroupCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkRayTracingShaderGroupCreateInfoNV* from,
-    VkRayTracingShaderGroupCreateInfoNV* to)
-{
+void deepcopy_VkRayTracingShaderGroupCreateInfoNV(Allocator* alloc, VkStructureType rootType,
+                                                  const VkRayTracingShaderGroupCreateInfoNV* from,
+                                                  VkRayTracingShaderGroupCreateInfoNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkRayTracingPipelineCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkRayTracingPipelineCreateInfoNV* from,
-    VkRayTracingPipelineCreateInfoNV* to)
-{
+void deepcopy_VkRayTracingPipelineCreateInfoNV(Allocator* alloc, VkStructureType rootType,
+                                               const VkRayTracingPipelineCreateInfoNV* from,
+                                               VkRayTracingPipelineCreateInfoNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pStages = nullptr;
-        if (from->pStages)
-        {
-            to->pStages = (VkPipelineShaderStageCreateInfo*)alloc->alloc(from->stageCount * sizeof(const VkPipelineShaderStageCreateInfo));
+        if (from->pStages) {
+            to->pStages = (VkPipelineShaderStageCreateInfo*)alloc->alloc(
+                from->stageCount * sizeof(const VkPipelineShaderStageCreateInfo));
             to->stageCount = from->stageCount;
-            for (uint32_t i = 0; i < (uint32_t)from->stageCount; ++i)
-            {
-                deepcopy_VkPipelineShaderStageCreateInfo(alloc, rootType, from->pStages + i, (VkPipelineShaderStageCreateInfo*)(to->pStages + i));
+            for (uint32_t i = 0; i < (uint32_t)from->stageCount; ++i) {
+                deepcopy_VkPipelineShaderStageCreateInfo(
+                    alloc, rootType, from->pStages + i,
+                    (VkPipelineShaderStageCreateInfo*)(to->pStages + i));
             }
         }
     }
-    if (from)
-    {
+    if (from) {
         to->pGroups = nullptr;
-        if (from->pGroups)
-        {
-            to->pGroups = (VkRayTracingShaderGroupCreateInfoNV*)alloc->alloc(from->groupCount * sizeof(const VkRayTracingShaderGroupCreateInfoNV));
+        if (from->pGroups) {
+            to->pGroups = (VkRayTracingShaderGroupCreateInfoNV*)alloc->alloc(
+                from->groupCount * sizeof(const VkRayTracingShaderGroupCreateInfoNV));
             to->groupCount = from->groupCount;
-            for (uint32_t i = 0; i < (uint32_t)from->groupCount; ++i)
-            {
-                deepcopy_VkRayTracingShaderGroupCreateInfoNV(alloc, rootType, from->pGroups + i, (VkRayTracingShaderGroupCreateInfoNV*)(to->pGroups + i));
+            for (uint32_t i = 0; i < (uint32_t)from->groupCount; ++i) {
+                deepcopy_VkRayTracingShaderGroupCreateInfoNV(
+                    alloc, rootType, from->pGroups + i,
+                    (VkRayTracingShaderGroupCreateInfoNV*)(to->pGroups + i));
             }
         }
     }
 }
 
-void deepcopy_VkGeometryTrianglesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkGeometryTrianglesNV* from,
-    VkGeometryTrianglesNV* to)
-{
+void deepcopy_VkGeometryTrianglesNV(Allocator* alloc, VkStructureType rootType,
+                                    const VkGeometryTrianglesNV* from, VkGeometryTrianglesNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkGeometryAABBNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkGeometryAABBNV* from,
-    VkGeometryAABBNV* to)
-{
+void deepcopy_VkGeometryAABBNV(Allocator* alloc, VkStructureType rootType,
+                               const VkGeometryAABBNV* from, VkGeometryAABBNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkGeometryDataNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkGeometryDataNV* from,
-    VkGeometryDataNV* to)
-{
+void deepcopy_VkGeometryDataNV(Allocator* alloc, VkStructureType rootType,
+                               const VkGeometryDataNV* from, VkGeometryDataNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    deepcopy_VkGeometryTrianglesNV(alloc, rootType, &from->triangles, (VkGeometryTrianglesNV*)(&to->triangles));
+    deepcopy_VkGeometryTrianglesNV(alloc, rootType, &from->triangles,
+                                   (VkGeometryTrianglesNV*)(&to->triangles));
     deepcopy_VkGeometryAABBNV(alloc, rootType, &from->aabbs, (VkGeometryAABBNV*)(&to->aabbs));
 }
 
-void deepcopy_VkGeometryNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkGeometryNV* from,
-    VkGeometryNV* to)
-{
+void deepcopy_VkGeometryNV(Allocator* alloc, VkStructureType rootType, const VkGeometryNV* from,
+                           VkGeometryNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     deepcopy_VkGeometryDataNV(alloc, rootType, &from->geometry, (VkGeometryDataNV*)(&to->geometry));
 }
 
-void deepcopy_VkAccelerationStructureInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAccelerationStructureInfoNV* from,
-    VkAccelerationStructureInfoNV* to)
-{
+void deepcopy_VkAccelerationStructureInfoNV(Allocator* alloc, VkStructureType rootType,
+                                            const VkAccelerationStructureInfoNV* from,
+                                            VkAccelerationStructureInfoNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pGeometries = nullptr;
-        if (from->pGeometries)
-        {
-            to->pGeometries = (VkGeometryNV*)alloc->alloc(from->geometryCount * sizeof(const VkGeometryNV));
+        if (from->pGeometries) {
+            to->pGeometries =
+                (VkGeometryNV*)alloc->alloc(from->geometryCount * sizeof(const VkGeometryNV));
             to->geometryCount = from->geometryCount;
-            for (uint32_t i = 0; i < (uint32_t)from->geometryCount; ++i)
-            {
-                deepcopy_VkGeometryNV(alloc, rootType, from->pGeometries + i, (VkGeometryNV*)(to->pGeometries + i));
+            for (uint32_t i = 0; i < (uint32_t)from->geometryCount; ++i) {
+                deepcopy_VkGeometryNV(alloc, rootType, from->pGeometries + i,
+                                      (VkGeometryNV*)(to->pGeometries + i));
             }
         }
     }
 }
 
-void deepcopy_VkAccelerationStructureCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAccelerationStructureCreateInfoNV* from,
-    VkAccelerationStructureCreateInfoNV* to)
-{
+void deepcopy_VkAccelerationStructureCreateInfoNV(Allocator* alloc, VkStructureType rootType,
+                                                  const VkAccelerationStructureCreateInfoNV* from,
+                                                  VkAccelerationStructureCreateInfoNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkAccelerationStructureInfoNV(alloc, rootType, &from->info, (VkAccelerationStructureInfoNV*)(&to->info));
+    deepcopy_VkAccelerationStructureInfoNV(alloc, rootType, &from->info,
+                                           (VkAccelerationStructureInfoNV*)(&to->info));
 }
 
 void deepcopy_VkBindAccelerationStructureMemoryInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBindAccelerationStructureMemoryInfoNV* from,
-    VkBindAccelerationStructureMemoryInfoNV* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkBindAccelerationStructureMemoryInfoNV* from,
+    VkBindAccelerationStructureMemoryInfoNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pDeviceIndices = nullptr;
-    if (from->pDeviceIndices)
-    {
-        to->pDeviceIndices = (uint32_t*)alloc->dupArray(from->pDeviceIndices, from->deviceIndexCount * sizeof(const uint32_t));
+    if (from->pDeviceIndices) {
+        to->pDeviceIndices = (uint32_t*)alloc->dupArray(
+            from->pDeviceIndices, from->deviceIndexCount * sizeof(const uint32_t));
     }
 }
 
 void deepcopy_VkWriteDescriptorSetAccelerationStructureNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkWriteDescriptorSetAccelerationStructureNV* from,
-    VkWriteDescriptorSetAccelerationStructureNV* to)
-{
+    VkWriteDescriptorSetAccelerationStructureNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pAccelerationStructures = nullptr;
-    if (from->pAccelerationStructures)
-    {
-        to->pAccelerationStructures = (VkAccelerationStructureNV*)alloc->dupArray(from->pAccelerationStructures, from->accelerationStructureCount * sizeof(const VkAccelerationStructureNV));
+    if (from->pAccelerationStructures) {
+        to->pAccelerationStructures = (VkAccelerationStructureNV*)alloc->dupArray(
+            from->pAccelerationStructures,
+            from->accelerationStructureCount * sizeof(const VkAccelerationStructureNV));
     }
 }
 
 void deepcopy_VkAccelerationStructureMemoryRequirementsInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkAccelerationStructureMemoryRequirementsInfoNV* from,
-    VkAccelerationStructureMemoryRequirementsInfoNV* to)
-{
+    VkAccelerationStructureMemoryRequirementsInfoNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceRayTracingPropertiesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceRayTracingPropertiesNV* from,
-    VkPhysicalDeviceRayTracingPropertiesNV* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDeviceRayTracingPropertiesNV* from,
+    VkPhysicalDeviceRayTracingPropertiesNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkTransformMatrixKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkTransformMatrixKHR* from,
-    VkTransformMatrixKHR* to)
-{
+void deepcopy_VkTransformMatrixKHR(Allocator* alloc, VkStructureType rootType,
+                                   const VkTransformMatrixKHR* from, VkTransformMatrixKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    memcpy(to->matrix, from->matrix, ((3)*(4)) * sizeof(float));
+    memcpy(to->matrix, from->matrix, ((3) * (4)) * sizeof(float));
 }
 
-void deepcopy_VkAabbPositionsKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAabbPositionsKHR* from,
-    VkAabbPositionsKHR* to)
-{
+void deepcopy_VkAabbPositionsKHR(Allocator* alloc, VkStructureType rootType,
+                                 const VkAabbPositionsKHR* from, VkAabbPositionsKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkAccelerationStructureInstanceKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAccelerationStructureInstanceKHR* from,
-    VkAccelerationStructureInstanceKHR* to)
-{
+void deepcopy_VkAccelerationStructureInstanceKHR(Allocator* alloc, VkStructureType rootType,
+                                                 const VkAccelerationStructureInstanceKHR* from,
+                                                 VkAccelerationStructureInstanceKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    deepcopy_VkTransformMatrixKHR(alloc, rootType, &from->transform, (VkTransformMatrixKHR*)(&to->transform));
+    deepcopy_VkTransformMatrixKHR(alloc, rootType, &from->transform,
+                                  (VkTransformMatrixKHR*)(&to->transform));
 }
 
 #endif
 #ifdef VK_NV_representative_fragment_test
 void deepcopy_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* from,
-    VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* to)
-{
+    VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineRepresentativeFragmentTestStateCreateInfoNV* from,
-    VkPipelineRepresentativeFragmentTestStateCreateInfoNV* to)
-{
+    VkPipelineRepresentativeFragmentTestStateCreateInfoNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -15558,56 +12781,46 @@
 #endif
 #ifdef VK_EXT_filter_cubic
 void deepcopy_VkPhysicalDeviceImageViewImageFormatInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceImageViewImageFormatInfoEXT* from,
-    VkPhysicalDeviceImageViewImageFormatInfoEXT* to)
-{
+    VkPhysicalDeviceImageViewImageFormatInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkFilterCubicImageViewImageFormatPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkFilterCubicImageViewImageFormatPropertiesEXT* from,
-    VkFilterCubicImageViewImageFormatPropertiesEXT* to)
-{
+    VkFilterCubicImageViewImageFormatPropertiesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -15618,28 +12831,23 @@
 #endif
 #ifdef VK_EXT_global_priority
 void deepcopy_VkDeviceQueueGlobalPriorityCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkDeviceQueueGlobalPriorityCreateInfoEXT* from,
-    VkDeviceQueueGlobalPriorityCreateInfoEXT* to)
-{
+    VkDeviceQueueGlobalPriorityCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -15647,90 +12855,72 @@
 
 #endif
 #ifdef VK_EXT_external_memory_host
-void deepcopy_VkImportMemoryHostPointerInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImportMemoryHostPointerInfoEXT* from,
-    VkImportMemoryHostPointerInfoEXT* to)
-{
+void deepcopy_VkImportMemoryHostPointerInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                               const VkImportMemoryHostPointerInfoEXT* from,
+                                               VkImportMemoryHostPointerInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pHostPointer = nullptr;
-    if (from->pHostPointer)
-    {
+    if (from->pHostPointer) {
         to->pHostPointer = (void*)alloc->dupArray(from->pHostPointer, sizeof(uint8_t));
     }
 }
 
-void deepcopy_VkMemoryHostPointerPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryHostPointerPropertiesEXT* from,
-    VkMemoryHostPointerPropertiesEXT* to)
-{
+void deepcopy_VkMemoryHostPointerPropertiesEXT(Allocator* alloc, VkStructureType rootType,
+                                               const VkMemoryHostPointerPropertiesEXT* from,
+                                               VkMemoryHostPointerPropertiesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceExternalMemoryHostPropertiesEXT* from,
-    VkPhysicalDeviceExternalMemoryHostPropertiesEXT* to)
-{
+    VkPhysicalDeviceExternalMemoryHostPropertiesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -15741,28 +12931,22 @@
 #endif
 #ifdef VK_AMD_pipeline_compiler_control
 void deepcopy_VkPipelineCompilerControlCreateInfoAMD(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineCompilerControlCreateInfoAMD* from,
-    VkPipelineCompilerControlCreateInfoAMD* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkPipelineCompilerControlCreateInfoAMD* from,
+    VkPipelineCompilerControlCreateInfoAMD* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -15770,29 +12954,23 @@
 
 #endif
 #ifdef VK_EXT_calibrated_timestamps
-void deepcopy_VkCalibratedTimestampInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCalibratedTimestampInfoEXT* from,
-    VkCalibratedTimestampInfoEXT* to)
-{
+void deepcopy_VkCalibratedTimestampInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                           const VkCalibratedTimestampInfoEXT* from,
+                                           VkCalibratedTimestampInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -15801,28 +12979,22 @@
 #endif
 #ifdef VK_AMD_shader_core_properties
 void deepcopy_VkPhysicalDeviceShaderCorePropertiesAMD(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceShaderCorePropertiesAMD* from,
-    VkPhysicalDeviceShaderCorePropertiesAMD* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDeviceShaderCorePropertiesAMD* from,
+    VkPhysicalDeviceShaderCorePropertiesAMD* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -15830,265 +13002,224 @@
 
 #endif
 #ifdef VK_EXT_video_decode_h265
-void deepcopy_VkVideoDecodeH265ProfileEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoDecodeH265ProfileEXT* from,
-    VkVideoDecodeH265ProfileEXT* to)
-{
+void deepcopy_VkVideoDecodeH265ProfileEXT(Allocator* alloc, VkStructureType rootType,
+                                          const VkVideoDecodeH265ProfileEXT* from,
+                                          VkVideoDecodeH265ProfileEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkVideoDecodeH265CapabilitiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoDecodeH265CapabilitiesEXT* from,
-    VkVideoDecodeH265CapabilitiesEXT* to)
-{
+void deepcopy_VkVideoDecodeH265CapabilitiesEXT(Allocator* alloc, VkStructureType rootType,
+                                               const VkVideoDecodeH265CapabilitiesEXT* from,
+                                               VkVideoDecodeH265CapabilitiesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkExtensionProperties(alloc, rootType, &from->stdExtensionVersion, (VkExtensionProperties*)(&to->stdExtensionVersion));
+    deepcopy_VkExtensionProperties(alloc, rootType, &from->stdExtensionVersion,
+                                   (VkExtensionProperties*)(&to->stdExtensionVersion));
 }
 
 void deepcopy_VkVideoDecodeH265SessionCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoDecodeH265SessionCreateInfoEXT* from,
-    VkVideoDecodeH265SessionCreateInfoEXT* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkVideoDecodeH265SessionCreateInfoEXT* from,
+    VkVideoDecodeH265SessionCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pStdExtensionVersion = nullptr;
-    if (from->pStdExtensionVersion)
-    {
-        to->pStdExtensionVersion = (VkExtensionProperties*)alloc->alloc(sizeof(const VkExtensionProperties));
-        deepcopy_VkExtensionProperties(alloc, rootType, from->pStdExtensionVersion, (VkExtensionProperties*)(to->pStdExtensionVersion));
+    if (from->pStdExtensionVersion) {
+        to->pStdExtensionVersion =
+            (VkExtensionProperties*)alloc->alloc(sizeof(const VkExtensionProperties));
+        deepcopy_VkExtensionProperties(alloc, rootType, from->pStdExtensionVersion,
+                                       (VkExtensionProperties*)(to->pStdExtensionVersion));
     }
 }
 
 void deepcopy_VkVideoDecodeH265SessionParametersAddInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkVideoDecodeH265SessionParametersAddInfoEXT* from,
-    VkVideoDecodeH265SessionParametersAddInfoEXT* to)
-{
+    VkVideoDecodeH265SessionParametersAddInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pSpsStd = nullptr;
-    if (from->pSpsStd)
-    {
-        to->pSpsStd = (StdVideoH265SequenceParameterSet*)alloc->dupArray(from->pSpsStd, from->spsStdCount * sizeof(const StdVideoH265SequenceParameterSet));
+    if (from->pSpsStd) {
+        to->pSpsStd = (StdVideoH265SequenceParameterSet*)alloc->dupArray(
+            from->pSpsStd, from->spsStdCount * sizeof(const StdVideoH265SequenceParameterSet));
     }
     to->pPpsStd = nullptr;
-    if (from->pPpsStd)
-    {
-        to->pPpsStd = (StdVideoH265PictureParameterSet*)alloc->dupArray(from->pPpsStd, from->ppsStdCount * sizeof(const StdVideoH265PictureParameterSet));
+    if (from->pPpsStd) {
+        to->pPpsStd = (StdVideoH265PictureParameterSet*)alloc->dupArray(
+            from->pPpsStd, from->ppsStdCount * sizeof(const StdVideoH265PictureParameterSet));
     }
 }
 
 void deepcopy_VkVideoDecodeH265SessionParametersCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkVideoDecodeH265SessionParametersCreateInfoEXT* from,
-    VkVideoDecodeH265SessionParametersCreateInfoEXT* to)
-{
+    VkVideoDecodeH265SessionParametersCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pParametersAddInfo = nullptr;
-    if (from->pParametersAddInfo)
-    {
-        to->pParametersAddInfo = (VkVideoDecodeH265SessionParametersAddInfoEXT*)alloc->alloc(sizeof(const VkVideoDecodeH265SessionParametersAddInfoEXT));
-        deepcopy_VkVideoDecodeH265SessionParametersAddInfoEXT(alloc, rootType, from->pParametersAddInfo, (VkVideoDecodeH265SessionParametersAddInfoEXT*)(to->pParametersAddInfo));
+    if (from->pParametersAddInfo) {
+        to->pParametersAddInfo = (VkVideoDecodeH265SessionParametersAddInfoEXT*)alloc->alloc(
+            sizeof(const VkVideoDecodeH265SessionParametersAddInfoEXT));
+        deepcopy_VkVideoDecodeH265SessionParametersAddInfoEXT(
+            alloc, rootType, from->pParametersAddInfo,
+            (VkVideoDecodeH265SessionParametersAddInfoEXT*)(to->pParametersAddInfo));
     }
 }
 
-void deepcopy_VkVideoDecodeH265PictureInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoDecodeH265PictureInfoEXT* from,
-    VkVideoDecodeH265PictureInfoEXT* to)
-{
+void deepcopy_VkVideoDecodeH265PictureInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                              const VkVideoDecodeH265PictureInfoEXT* from,
+                                              VkVideoDecodeH265PictureInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pStdPictureInfo = nullptr;
-    if (from->pStdPictureInfo)
-    {
-        to->pStdPictureInfo = (StdVideoDecodeH265PictureInfo*)alloc->dupArray(from->pStdPictureInfo, sizeof(StdVideoDecodeH265PictureInfo));
+    if (from->pStdPictureInfo) {
+        to->pStdPictureInfo = (StdVideoDecodeH265PictureInfo*)alloc->dupArray(
+            from->pStdPictureInfo, sizeof(StdVideoDecodeH265PictureInfo));
     }
     to->pSlicesDataOffsets = nullptr;
-    if (from->pSlicesDataOffsets)
-    {
-        to->pSlicesDataOffsets = (uint32_t*)alloc->dupArray(from->pSlicesDataOffsets, from->slicesCount * sizeof(const uint32_t));
+    if (from->pSlicesDataOffsets) {
+        to->pSlicesDataOffsets = (uint32_t*)alloc->dupArray(
+            from->pSlicesDataOffsets, from->slicesCount * sizeof(const uint32_t));
     }
 }
 
-void deepcopy_VkVideoDecodeH265DpbSlotInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoDecodeH265DpbSlotInfoEXT* from,
-    VkVideoDecodeH265DpbSlotInfoEXT* to)
-{
+void deepcopy_VkVideoDecodeH265DpbSlotInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                              const VkVideoDecodeH265DpbSlotInfoEXT* from,
+                                              VkVideoDecodeH265DpbSlotInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pStdReferenceInfo = nullptr;
-    if (from->pStdReferenceInfo)
-    {
-        to->pStdReferenceInfo = (StdVideoDecodeH265ReferenceInfo*)alloc->dupArray(from->pStdReferenceInfo, sizeof(const StdVideoDecodeH265ReferenceInfo));
+    if (from->pStdReferenceInfo) {
+        to->pStdReferenceInfo = (StdVideoDecodeH265ReferenceInfo*)alloc->dupArray(
+            from->pStdReferenceInfo, sizeof(const StdVideoDecodeH265ReferenceInfo));
     }
 }
 
 #endif
 #ifdef VK_AMD_memory_overallocation_behavior
 void deepcopy_VkDeviceMemoryOverallocationCreateInfoAMD(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkDeviceMemoryOverallocationCreateInfoAMD* from,
-    VkDeviceMemoryOverallocationCreateInfoAMD* to)
-{
+    VkDeviceMemoryOverallocationCreateInfoAMD* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -16097,108 +13228,92 @@
 #endif
 #ifdef VK_EXT_vertex_attribute_divisor
 void deepcopy_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* from,
-    VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* to)
-{
+    VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkVertexInputBindingDivisorDescriptionEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkVertexInputBindingDivisorDescriptionEXT* from,
-    VkVertexInputBindingDivisorDescriptionEXT* to)
-{
+    VkVertexInputBindingDivisorDescriptionEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkPipelineVertexInputDivisorStateCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineVertexInputDivisorStateCreateInfoEXT* from,
-    VkPipelineVertexInputDivisorStateCreateInfoEXT* to)
-{
+    VkPipelineVertexInputDivisorStateCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pVertexBindingDivisors = nullptr;
-        if (from->pVertexBindingDivisors)
-        {
-            to->pVertexBindingDivisors = (VkVertexInputBindingDivisorDescriptionEXT*)alloc->alloc(from->vertexBindingDivisorCount * sizeof(const VkVertexInputBindingDivisorDescriptionEXT));
+        if (from->pVertexBindingDivisors) {
+            to->pVertexBindingDivisors = (VkVertexInputBindingDivisorDescriptionEXT*)alloc->alloc(
+                from->vertexBindingDivisorCount *
+                sizeof(const VkVertexInputBindingDivisorDescriptionEXT));
             to->vertexBindingDivisorCount = from->vertexBindingDivisorCount;
-            for (uint32_t i = 0; i < (uint32_t)from->vertexBindingDivisorCount; ++i)
-            {
-                deepcopy_VkVertexInputBindingDivisorDescriptionEXT(alloc, rootType, from->pVertexBindingDivisors + i, (VkVertexInputBindingDivisorDescriptionEXT*)(to->pVertexBindingDivisors + i));
+            for (uint32_t i = 0; i < (uint32_t)from->vertexBindingDivisorCount; ++i) {
+                deepcopy_VkVertexInputBindingDivisorDescriptionEXT(
+                    alloc, rootType, from->pVertexBindingDivisors + i,
+                    (VkVertexInputBindingDivisorDescriptionEXT*)(to->pVertexBindingDivisors + i));
             }
         }
     }
 }
 
 void deepcopy_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* from,
-    VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* to)
-{
+    VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -16206,29 +13321,23 @@
 
 #endif
 #ifdef VK_GGP_frame_token
-void deepcopy_VkPresentFrameTokenGGP(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPresentFrameTokenGGP* from,
-    VkPresentFrameTokenGGP* to)
-{
+void deepcopy_VkPresentFrameTokenGGP(Allocator* alloc, VkStructureType rootType,
+                                     const VkPresentFrameTokenGGP* from,
+                                     VkPresentFrameTokenGGP* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -16236,59 +13345,52 @@
 
 #endif
 #ifdef VK_EXT_pipeline_creation_feedback
-void deepcopy_VkPipelineCreationFeedbackEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineCreationFeedbackEXT* from,
-    VkPipelineCreationFeedbackEXT* to)
-{
+void deepcopy_VkPipelineCreationFeedbackEXT(Allocator* alloc, VkStructureType rootType,
+                                            const VkPipelineCreationFeedbackEXT* from,
+                                            VkPipelineCreationFeedbackEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkPipelineCreationFeedbackCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineCreationFeedbackCreateInfoEXT* from,
-    VkPipelineCreationFeedbackCreateInfoEXT* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkPipelineCreationFeedbackCreateInfoEXT* from,
+    VkPipelineCreationFeedbackCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pPipelineCreationFeedback = nullptr;
-    if (from->pPipelineCreationFeedback)
-    {
-        to->pPipelineCreationFeedback = (VkPipelineCreationFeedbackEXT*)alloc->alloc(sizeof(VkPipelineCreationFeedbackEXT));
-        deepcopy_VkPipelineCreationFeedbackEXT(alloc, rootType, from->pPipelineCreationFeedback, (VkPipelineCreationFeedbackEXT*)(to->pPipelineCreationFeedback));
+    if (from->pPipelineCreationFeedback) {
+        to->pPipelineCreationFeedback =
+            (VkPipelineCreationFeedbackEXT*)alloc->alloc(sizeof(VkPipelineCreationFeedbackEXT));
+        deepcopy_VkPipelineCreationFeedbackEXT(
+            alloc, rootType, from->pPipelineCreationFeedback,
+            (VkPipelineCreationFeedbackEXT*)(to->pPipelineCreationFeedback));
     }
-    if (from)
-    {
+    if (from) {
         to->pPipelineStageCreationFeedbacks = nullptr;
-        if (from->pPipelineStageCreationFeedbacks)
-        {
-            to->pPipelineStageCreationFeedbacks = (VkPipelineCreationFeedbackEXT*)alloc->alloc(from->pipelineStageCreationFeedbackCount * sizeof(VkPipelineCreationFeedbackEXT));
+        if (from->pPipelineStageCreationFeedbacks) {
+            to->pPipelineStageCreationFeedbacks = (VkPipelineCreationFeedbackEXT*)alloc->alloc(
+                from->pipelineStageCreationFeedbackCount * sizeof(VkPipelineCreationFeedbackEXT));
             to->pipelineStageCreationFeedbackCount = from->pipelineStageCreationFeedbackCount;
-            for (uint32_t i = 0; i < (uint32_t)from->pipelineStageCreationFeedbackCount; ++i)
-            {
-                deepcopy_VkPipelineCreationFeedbackEXT(alloc, rootType, from->pPipelineStageCreationFeedbacks + i, (VkPipelineCreationFeedbackEXT*)(to->pPipelineStageCreationFeedbacks + i));
+            for (uint32_t i = 0; i < (uint32_t)from->pipelineStageCreationFeedbackCount; ++i) {
+                deepcopy_VkPipelineCreationFeedbackEXT(
+                    alloc, rootType, from->pPipelineStageCreationFeedbacks + i,
+                    (VkPipelineCreationFeedbackEXT*)(to->pPipelineStageCreationFeedbacks + i));
             }
         }
     }
@@ -16299,28 +13401,23 @@
 #endif
 #ifdef VK_NV_compute_shader_derivatives
 void deepcopy_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* from,
-    VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* to)
-{
+    VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -16328,57 +13425,45 @@
 
 #endif
 #ifdef VK_NV_mesh_shader
-void deepcopy_VkPhysicalDeviceMeshShaderFeaturesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceMeshShaderFeaturesNV* from,
-    VkPhysicalDeviceMeshShaderFeaturesNV* to)
-{
+void deepcopy_VkPhysicalDeviceMeshShaderFeaturesNV(Allocator* alloc, VkStructureType rootType,
+                                                   const VkPhysicalDeviceMeshShaderFeaturesNV* from,
+                                                   VkPhysicalDeviceMeshShaderFeaturesNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceMeshShaderPropertiesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceMeshShaderPropertiesNV* from,
-    VkPhysicalDeviceMeshShaderPropertiesNV* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDeviceMeshShaderPropertiesNV* from,
+    VkPhysicalDeviceMeshShaderPropertiesNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -16386,12 +13471,9 @@
     memcpy(to->maxMeshWorkGroupSize, from->maxMeshWorkGroupSize, 3 * sizeof(uint32_t));
 }
 
-void deepcopy_VkDrawMeshTasksIndirectCommandNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDrawMeshTasksIndirectCommandNV* from,
-    VkDrawMeshTasksIndirectCommandNV* to)
-{
+void deepcopy_VkDrawMeshTasksIndirectCommandNV(Allocator* alloc, VkStructureType rootType,
+                                               const VkDrawMeshTasksIndirectCommandNV* from,
+                                               VkDrawMeshTasksIndirectCommandNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
@@ -16400,28 +13482,23 @@
 #endif
 #ifdef VK_NV_fragment_shader_barycentric
 void deepcopy_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* from,
-    VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* to)
-{
+    VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -16430,28 +13507,23 @@
 #endif
 #ifdef VK_NV_shader_image_footprint
 void deepcopy_VkPhysicalDeviceShaderImageFootprintFeaturesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShaderImageFootprintFeaturesNV* from,
-    VkPhysicalDeviceShaderImageFootprintFeaturesNV* to)
-{
+    VkPhysicalDeviceShaderImageFootprintFeaturesNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -16460,69 +13532,58 @@
 #endif
 #ifdef VK_NV_scissor_exclusive
 void deepcopy_VkPipelineViewportExclusiveScissorStateCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineViewportExclusiveScissorStateCreateInfoNV* from,
-    VkPipelineViewportExclusiveScissorStateCreateInfoNV* to)
-{
+    VkPipelineViewportExclusiveScissorStateCreateInfoNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pExclusiveScissors = nullptr;
-        if (from->pExclusiveScissors)
-        {
-            to->pExclusiveScissors = (VkRect2D*)alloc->alloc(from->exclusiveScissorCount * sizeof(const VkRect2D));
+        if (from->pExclusiveScissors) {
+            to->pExclusiveScissors =
+                (VkRect2D*)alloc->alloc(from->exclusiveScissorCount * sizeof(const VkRect2D));
             to->exclusiveScissorCount = from->exclusiveScissorCount;
-            for (uint32_t i = 0; i < (uint32_t)from->exclusiveScissorCount; ++i)
-            {
-                deepcopy_VkRect2D(alloc, rootType, from->pExclusiveScissors + i, (VkRect2D*)(to->pExclusiveScissors + i));
+            for (uint32_t i = 0; i < (uint32_t)from->exclusiveScissorCount; ++i) {
+                deepcopy_VkRect2D(alloc, rootType, from->pExclusiveScissors + i,
+                                  (VkRect2D*)(to->pExclusiveScissors + i));
             }
         }
     }
 }
 
 void deepcopy_VkPhysicalDeviceExclusiveScissorFeaturesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceExclusiveScissorFeaturesNV* from,
-    VkPhysicalDeviceExclusiveScissorFeaturesNV* to)
-{
+    VkPhysicalDeviceExclusiveScissorFeaturesNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -16530,63 +13591,49 @@
 
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
-void deepcopy_VkQueueFamilyCheckpointPropertiesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkQueueFamilyCheckpointPropertiesNV* from,
-    VkQueueFamilyCheckpointPropertiesNV* to)
-{
+void deepcopy_VkQueueFamilyCheckpointPropertiesNV(Allocator* alloc, VkStructureType rootType,
+                                                  const VkQueueFamilyCheckpointPropertiesNV* from,
+                                                  VkQueueFamilyCheckpointPropertiesNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkCheckpointDataNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCheckpointDataNV* from,
-    VkCheckpointDataNV* to)
-{
+void deepcopy_VkCheckpointDataNV(Allocator* alloc, VkStructureType rootType,
+                                 const VkCheckpointDataNV* from, VkCheckpointDataNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pCheckpointMarker = nullptr;
-    if (from->pCheckpointMarker)
-    {
+    if (from->pCheckpointMarker) {
         to->pCheckpointMarker = (void*)alloc->dupArray(from->pCheckpointMarker, sizeof(uint8_t));
     }
 }
@@ -16594,28 +13641,23 @@
 #endif
 #ifdef VK_INTEL_shader_integer_functions2
 void deepcopy_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* from,
-    VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* to)
-{
+    VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -16623,202 +13665,161 @@
 
 #endif
 #ifdef VK_INTEL_performance_query
-void deepcopy_VkPerformanceValueDataINTEL(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPerformanceValueDataINTEL* from,
-    VkPerformanceValueDataINTEL* to)
-{
+void deepcopy_VkPerformanceValueDataINTEL(Allocator* alloc, VkStructureType rootType,
+                                          const VkPerformanceValueDataINTEL* from,
+                                          VkPerformanceValueDataINTEL* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
     to->valueString = nullptr;
-    if (from->valueString)
-    {
+    if (from->valueString) {
         to->valueString = alloc->strDup(from->valueString);
     }
 }
 
-void deepcopy_VkPerformanceValueINTEL(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPerformanceValueINTEL* from,
-    VkPerformanceValueINTEL* to)
-{
+void deepcopy_VkPerformanceValueINTEL(Allocator* alloc, VkStructureType rootType,
+                                      const VkPerformanceValueINTEL* from,
+                                      VkPerformanceValueINTEL* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    deepcopy_VkPerformanceValueDataINTEL(alloc, rootType, &from->data, (VkPerformanceValueDataINTEL*)(&to->data));
+    deepcopy_VkPerformanceValueDataINTEL(alloc, rootType, &from->data,
+                                         (VkPerformanceValueDataINTEL*)(&to->data));
 }
 
-void deepcopy_VkInitializePerformanceApiInfoINTEL(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkInitializePerformanceApiInfoINTEL* from,
-    VkInitializePerformanceApiInfoINTEL* to)
-{
+void deepcopy_VkInitializePerformanceApiInfoINTEL(Allocator* alloc, VkStructureType rootType,
+                                                  const VkInitializePerformanceApiInfoINTEL* from,
+                                                  VkInitializePerformanceApiInfoINTEL* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pUserData = nullptr;
-    if (from->pUserData)
-    {
+    if (from->pUserData) {
         to->pUserData = (void*)alloc->dupArray(from->pUserData, sizeof(uint8_t));
     }
 }
 
 void deepcopy_VkQueryPoolPerformanceQueryCreateInfoINTEL(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkQueryPoolPerformanceQueryCreateInfoINTEL* from,
-    VkQueryPoolPerformanceQueryCreateInfoINTEL* to)
-{
+    VkQueryPoolPerformanceQueryCreateInfoINTEL* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkPerformanceMarkerInfoINTEL(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPerformanceMarkerInfoINTEL* from,
-    VkPerformanceMarkerInfoINTEL* to)
-{
+void deepcopy_VkPerformanceMarkerInfoINTEL(Allocator* alloc, VkStructureType rootType,
+                                           const VkPerformanceMarkerInfoINTEL* from,
+                                           VkPerformanceMarkerInfoINTEL* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkPerformanceStreamMarkerInfoINTEL(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPerformanceStreamMarkerInfoINTEL* from,
-    VkPerformanceStreamMarkerInfoINTEL* to)
-{
+void deepcopy_VkPerformanceStreamMarkerInfoINTEL(Allocator* alloc, VkStructureType rootType,
+                                                 const VkPerformanceStreamMarkerInfoINTEL* from,
+                                                 VkPerformanceStreamMarkerInfoINTEL* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkPerformanceOverrideInfoINTEL(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPerformanceOverrideInfoINTEL* from,
-    VkPerformanceOverrideInfoINTEL* to)
-{
+void deepcopy_VkPerformanceOverrideInfoINTEL(Allocator* alloc, VkStructureType rootType,
+                                             const VkPerformanceOverrideInfoINTEL* from,
+                                             VkPerformanceOverrideInfoINTEL* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPerformanceConfigurationAcquireInfoINTEL(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPerformanceConfigurationAcquireInfoINTEL* from,
-    VkPerformanceConfigurationAcquireInfoINTEL* to)
-{
+    VkPerformanceConfigurationAcquireInfoINTEL* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -16827,28 +13828,22 @@
 #endif
 #ifdef VK_EXT_pci_bus_info
 void deepcopy_VkPhysicalDevicePCIBusInfoPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDevicePCIBusInfoPropertiesEXT* from,
-    VkPhysicalDevicePCIBusInfoPropertiesEXT* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDevicePCIBusInfoPropertiesEXT* from,
+    VkPhysicalDevicePCIBusInfoPropertiesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -16857,56 +13852,46 @@
 #endif
 #ifdef VK_AMD_display_native_hdr
 void deepcopy_VkDisplayNativeHdrSurfaceCapabilitiesAMD(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkDisplayNativeHdrSurfaceCapabilitiesAMD* from,
-    VkDisplayNativeHdrSurfaceCapabilitiesAMD* to)
-{
+    VkDisplayNativeHdrSurfaceCapabilitiesAMD* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkSwapchainDisplayNativeHdrCreateInfoAMD(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkSwapchainDisplayNativeHdrCreateInfoAMD* from,
-    VkSwapchainDisplayNativeHdrCreateInfoAMD* to)
-{
+    VkSwapchainDisplayNativeHdrCreateInfoAMD* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -16914,29 +13899,23 @@
 
 #endif
 #ifdef VK_FUCHSIA_imagepipe_surface
-void deepcopy_VkImagePipeSurfaceCreateInfoFUCHSIA(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImagePipeSurfaceCreateInfoFUCHSIA* from,
-    VkImagePipeSurfaceCreateInfoFUCHSIA* to)
-{
+void deepcopy_VkImagePipeSurfaceCreateInfoFUCHSIA(Allocator* alloc, VkStructureType rootType,
+                                                  const VkImagePipeSurfaceCreateInfoFUCHSIA* from,
+                                                  VkImagePipeSurfaceCreateInfoFUCHSIA* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -16944,35 +13923,28 @@
 
 #endif
 #ifdef VK_EXT_metal_surface
-void deepcopy_VkMetalSurfaceCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMetalSurfaceCreateInfoEXT* from,
-    VkMetalSurfaceCreateInfoEXT* to)
-{
+void deepcopy_VkMetalSurfaceCreateInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                          const VkMetalSurfaceCreateInfoEXT* from,
+                                          VkMetalSurfaceCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pLayer = nullptr;
-    if (from->pLayer)
-    {
+    if (from->pLayer) {
         to->pLayer = (CAMetalLayer*)alloc->dupArray(from->pLayer, sizeof(const CAMetalLayer));
     }
 }
@@ -16980,90 +13952,78 @@
 #endif
 #ifdef VK_EXT_fragment_density_map
 void deepcopy_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceFragmentDensityMapFeaturesEXT* from,
-    VkPhysicalDeviceFragmentDensityMapFeaturesEXT* to)
-{
+    VkPhysicalDeviceFragmentDensityMapFeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceFragmentDensityMapPropertiesEXT* from,
-    VkPhysicalDeviceFragmentDensityMapPropertiesEXT* to)
-{
+    VkPhysicalDeviceFragmentDensityMapPropertiesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    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->minFragmentDensityTexelSize, (VkExtent2D*)(&to->minFragmentDensityTexelSize));
-    deepcopy_VkExtent2D(alloc, rootType, &from->maxFragmentDensityTexelSize, (VkExtent2D*)(&to->maxFragmentDensityTexelSize));
+    deepcopy_VkExtent2D(alloc, rootType, &from->minFragmentDensityTexelSize,
+                        (VkExtent2D*)(&to->minFragmentDensityTexelSize));
+    deepcopy_VkExtent2D(alloc, rootType, &from->maxFragmentDensityTexelSize,
+                        (VkExtent2D*)(&to->maxFragmentDensityTexelSize));
 }
 
 void deepcopy_VkRenderPassFragmentDensityMapCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkRenderPassFragmentDensityMapCreateInfoEXT* from,
-    VkRenderPassFragmentDensityMapCreateInfoEXT* to)
-{
+    VkRenderPassFragmentDensityMapCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkAttachmentReference(alloc, rootType, &from->fragmentDensityMapAttachment, (VkAttachmentReference*)(&to->fragmentDensityMapAttachment));
+    deepcopy_VkAttachmentReference(alloc, rootType, &from->fragmentDensityMapAttachment,
+                                   (VkAttachmentReference*)(&to->fragmentDensityMapAttachment));
 }
 
 #endif
@@ -17075,84 +14035,69 @@
 #endif
 #ifdef VK_EXT_subgroup_size_control
 void deepcopy_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* from,
-    VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* to)
-{
+    VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* from,
-    VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* to)
-{
+    VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* from,
-    VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* to)
-{
+    VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -17161,28 +14106,23 @@
 #endif
 #ifdef VK_AMD_shader_core_properties2
 void deepcopy_VkPhysicalDeviceShaderCoreProperties2AMD(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShaderCoreProperties2AMD* from,
-    VkPhysicalDeviceShaderCoreProperties2AMD* to)
-{
+    VkPhysicalDeviceShaderCoreProperties2AMD* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -17191,28 +14131,23 @@
 #endif
 #ifdef VK_AMD_device_coherent_memory
 void deepcopy_VkPhysicalDeviceCoherentMemoryFeaturesAMD(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceCoherentMemoryFeaturesAMD* from,
-    VkPhysicalDeviceCoherentMemoryFeaturesAMD* to)
-{
+    VkPhysicalDeviceCoherentMemoryFeaturesAMD* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -17221,28 +14156,23 @@
 #endif
 #ifdef VK_EXT_shader_image_atomic_int64
 void deepcopy_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* from,
-    VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* to)
-{
+    VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -17251,28 +14181,23 @@
 #endif
 #ifdef VK_EXT_memory_budget
 void deepcopy_VkPhysicalDeviceMemoryBudgetPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceMemoryBudgetPropertiesEXT* from,
-    VkPhysicalDeviceMemoryBudgetPropertiesEXT* to)
-{
+    VkPhysicalDeviceMemoryBudgetPropertiesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -17283,56 +14208,45 @@
 #endif
 #ifdef VK_EXT_memory_priority
 void deepcopy_VkPhysicalDeviceMemoryPriorityFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceMemoryPriorityFeaturesEXT* from,
-    VkPhysicalDeviceMemoryPriorityFeaturesEXT* to)
-{
+    VkPhysicalDeviceMemoryPriorityFeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkMemoryPriorityAllocateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryPriorityAllocateInfoEXT* from,
-    VkMemoryPriorityAllocateInfoEXT* to)
-{
+void deepcopy_VkMemoryPriorityAllocateInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                              const VkMemoryPriorityAllocateInfoEXT* from,
+                                              VkMemoryPriorityAllocateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -17341,28 +14255,23 @@
 #endif
 #ifdef VK_NV_dedicated_allocation_image_aliasing
 void deepcopy_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* from,
-    VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* to)
-{
+    VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -17371,56 +14280,45 @@
 #endif
 #ifdef VK_EXT_buffer_device_address
 void deepcopy_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* from,
-    VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* to)
-{
+    VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkBufferDeviceAddressCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBufferDeviceAddressCreateInfoEXT* from,
-    VkBufferDeviceAddressCreateInfoEXT* to)
-{
+void deepcopy_VkBufferDeviceAddressCreateInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                                 const VkBufferDeviceAddressCreateInfoEXT* from,
+                                                 VkBufferDeviceAddressCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -17428,29 +14326,23 @@
 
 #endif
 #ifdef VK_EXT_tooling_info
-void deepcopy_VkPhysicalDeviceToolPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceToolPropertiesEXT* from,
-    VkPhysicalDeviceToolPropertiesEXT* to)
-{
+void deepcopy_VkPhysicalDeviceToolPropertiesEXT(Allocator* alloc, VkStructureType rootType,
+                                                const VkPhysicalDeviceToolPropertiesEXT* from,
+                                                VkPhysicalDeviceToolPropertiesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -17464,125 +14356,105 @@
 #ifdef VK_EXT_separate_stencil_usage
 #endif
 #ifdef VK_EXT_validation_features
-void deepcopy_VkValidationFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkValidationFeaturesEXT* from,
-    VkValidationFeaturesEXT* to)
-{
+void deepcopy_VkValidationFeaturesEXT(Allocator* alloc, VkStructureType rootType,
+                                      const VkValidationFeaturesEXT* from,
+                                      VkValidationFeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pEnabledValidationFeatures = nullptr;
-    if (from->pEnabledValidationFeatures)
-    {
-        to->pEnabledValidationFeatures = (VkValidationFeatureEnableEXT*)alloc->dupArray(from->pEnabledValidationFeatures, from->enabledValidationFeatureCount * sizeof(const VkValidationFeatureEnableEXT));
+    if (from->pEnabledValidationFeatures) {
+        to->pEnabledValidationFeatures = (VkValidationFeatureEnableEXT*)alloc->dupArray(
+            from->pEnabledValidationFeatures,
+            from->enabledValidationFeatureCount * sizeof(const VkValidationFeatureEnableEXT));
     }
     to->pDisabledValidationFeatures = nullptr;
-    if (from->pDisabledValidationFeatures)
-    {
-        to->pDisabledValidationFeatures = (VkValidationFeatureDisableEXT*)alloc->dupArray(from->pDisabledValidationFeatures, from->disabledValidationFeatureCount * sizeof(const VkValidationFeatureDisableEXT));
+    if (from->pDisabledValidationFeatures) {
+        to->pDisabledValidationFeatures = (VkValidationFeatureDisableEXT*)alloc->dupArray(
+            from->pDisabledValidationFeatures,
+            from->disabledValidationFeatureCount * sizeof(const VkValidationFeatureDisableEXT));
     }
 }
 
 #endif
 #ifdef VK_NV_cooperative_matrix
-void deepcopy_VkCooperativeMatrixPropertiesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCooperativeMatrixPropertiesNV* from,
-    VkCooperativeMatrixPropertiesNV* to)
-{
+void deepcopy_VkCooperativeMatrixPropertiesNV(Allocator* alloc, VkStructureType rootType,
+                                              const VkCooperativeMatrixPropertiesNV* from,
+                                              VkCooperativeMatrixPropertiesNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceCooperativeMatrixFeaturesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceCooperativeMatrixFeaturesNV* from,
-    VkPhysicalDeviceCooperativeMatrixFeaturesNV* to)
-{
+    VkPhysicalDeviceCooperativeMatrixFeaturesNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceCooperativeMatrixPropertiesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceCooperativeMatrixPropertiesNV* from,
-    VkPhysicalDeviceCooperativeMatrixPropertiesNV* to)
-{
+    VkPhysicalDeviceCooperativeMatrixPropertiesNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -17591,84 +14463,68 @@
 #endif
 #ifdef VK_NV_coverage_reduction_mode
 void deepcopy_VkPhysicalDeviceCoverageReductionModeFeaturesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceCoverageReductionModeFeaturesNV* from,
-    VkPhysicalDeviceCoverageReductionModeFeaturesNV* to)
-{
+    VkPhysicalDeviceCoverageReductionModeFeaturesNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPipelineCoverageReductionStateCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineCoverageReductionStateCreateInfoNV* from,
-    VkPipelineCoverageReductionStateCreateInfoNV* to)
-{
+    VkPipelineCoverageReductionStateCreateInfoNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkFramebufferMixedSamplesCombinationNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkFramebufferMixedSamplesCombinationNV* from,
-    VkFramebufferMixedSamplesCombinationNV* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkFramebufferMixedSamplesCombinationNV* from,
+    VkFramebufferMixedSamplesCombinationNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -17677,28 +14533,23 @@
 #endif
 #ifdef VK_EXT_fragment_shader_interlock
 void deepcopy_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* from,
-    VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* to)
-{
+    VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -17707,28 +14558,23 @@
 #endif
 #ifdef VK_EXT_ycbcr_image_arrays
 void deepcopy_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* from,
-    VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* to)
-{
+    VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -17737,84 +14583,69 @@
 #endif
 #ifdef VK_EXT_provoking_vertex
 void deepcopy_VkPhysicalDeviceProvokingVertexFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceProvokingVertexFeaturesEXT* from,
-    VkPhysicalDeviceProvokingVertexFeaturesEXT* to)
-{
+    VkPhysicalDeviceProvokingVertexFeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceProvokingVertexPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceProvokingVertexPropertiesEXT* from,
-    VkPhysicalDeviceProvokingVertexPropertiesEXT* to)
-{
+    VkPhysicalDeviceProvokingVertexPropertiesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineRasterizationProvokingVertexStateCreateInfoEXT* from,
-    VkPipelineRasterizationProvokingVertexStateCreateInfoEXT* to)
-{
+    VkPipelineRasterizationProvokingVertexStateCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -17822,85 +14653,69 @@
 
 #endif
 #ifdef VK_EXT_full_screen_exclusive
-void deepcopy_VkSurfaceFullScreenExclusiveInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSurfaceFullScreenExclusiveInfoEXT* from,
-    VkSurfaceFullScreenExclusiveInfoEXT* to)
-{
+void deepcopy_VkSurfaceFullScreenExclusiveInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                                  const VkSurfaceFullScreenExclusiveInfoEXT* from,
+                                                  VkSurfaceFullScreenExclusiveInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkSurfaceCapabilitiesFullScreenExclusiveEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkSurfaceCapabilitiesFullScreenExclusiveEXT* from,
-    VkSurfaceCapabilitiesFullScreenExclusiveEXT* to)
-{
+    VkSurfaceCapabilitiesFullScreenExclusiveEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkSurfaceFullScreenExclusiveWin32InfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkSurfaceFullScreenExclusiveWin32InfoEXT* from,
-    VkSurfaceFullScreenExclusiveWin32InfoEXT* to)
-{
+    VkSurfaceFullScreenExclusiveWin32InfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -17908,29 +14723,23 @@
 
 #endif
 #ifdef VK_EXT_headless_surface
-void deepcopy_VkHeadlessSurfaceCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkHeadlessSurfaceCreateInfoEXT* from,
-    VkHeadlessSurfaceCreateInfoEXT* to)
-{
+void deepcopy_VkHeadlessSurfaceCreateInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                             const VkHeadlessSurfaceCreateInfoEXT* from,
+                                             VkHeadlessSurfaceCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -17939,84 +14748,69 @@
 #endif
 #ifdef VK_EXT_line_rasterization
 void deepcopy_VkPhysicalDeviceLineRasterizationFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceLineRasterizationFeaturesEXT* from,
-    VkPhysicalDeviceLineRasterizationFeaturesEXT* to)
-{
+    VkPhysicalDeviceLineRasterizationFeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceLineRasterizationPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceLineRasterizationPropertiesEXT* from,
-    VkPhysicalDeviceLineRasterizationPropertiesEXT* to)
-{
+    VkPhysicalDeviceLineRasterizationPropertiesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPipelineRasterizationLineStateCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineRasterizationLineStateCreateInfoEXT* from,
-    VkPipelineRasterizationLineStateCreateInfoEXT* to)
-{
+    VkPipelineRasterizationLineStateCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -18025,28 +14819,23 @@
 #endif
 #ifdef VK_EXT_shader_atomic_float
 void deepcopy_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* from,
-    VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* to)
-{
+    VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -18057,28 +14846,23 @@
 #endif
 #ifdef VK_EXT_index_type_uint8
 void deepcopy_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceIndexTypeUint8FeaturesEXT* from,
-    VkPhysicalDeviceIndexTypeUint8FeaturesEXT* to)
-{
+    VkPhysicalDeviceIndexTypeUint8FeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -18087,28 +14871,23 @@
 #endif
 #ifdef VK_EXT_extended_dynamic_state
 void deepcopy_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* from,
-    VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* to)
-{
+    VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -18117,28 +14896,23 @@
 #endif
 #ifdef VK_EXT_shader_atomic_float2
 void deepcopy_VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT* from,
-    VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT* to)
-{
+    VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -18147,28 +14921,23 @@
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
 void deepcopy_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* from,
-    VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* to)
-{
+    VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -18177,363 +14946,308 @@
 #endif
 #ifdef VK_NV_device_generated_commands
 void deepcopy_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* from,
-    VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* to)
-{
+    VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* from,
-    VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* to)
-{
+    VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkGraphicsShaderGroupCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkGraphicsShaderGroupCreateInfoNV* from,
-    VkGraphicsShaderGroupCreateInfoNV* to)
-{
+void deepcopy_VkGraphicsShaderGroupCreateInfoNV(Allocator* alloc, VkStructureType rootType,
+                                                const VkGraphicsShaderGroupCreateInfoNV* from,
+                                                VkGraphicsShaderGroupCreateInfoNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pStages = nullptr;
-        if (from->pStages)
-        {
-            to->pStages = (VkPipelineShaderStageCreateInfo*)alloc->alloc(from->stageCount * sizeof(const VkPipelineShaderStageCreateInfo));
+        if (from->pStages) {
+            to->pStages = (VkPipelineShaderStageCreateInfo*)alloc->alloc(
+                from->stageCount * sizeof(const VkPipelineShaderStageCreateInfo));
             to->stageCount = from->stageCount;
-            for (uint32_t i = 0; i < (uint32_t)from->stageCount; ++i)
-            {
-                deepcopy_VkPipelineShaderStageCreateInfo(alloc, rootType, from->pStages + i, (VkPipelineShaderStageCreateInfo*)(to->pStages + i));
+            for (uint32_t i = 0; i < (uint32_t)from->stageCount; ++i) {
+                deepcopy_VkPipelineShaderStageCreateInfo(
+                    alloc, rootType, from->pStages + i,
+                    (VkPipelineShaderStageCreateInfo*)(to->pStages + i));
             }
         }
     }
     to->pVertexInputState = nullptr;
-    if (from->pVertexInputState)
-    {
-        to->pVertexInputState = (VkPipelineVertexInputStateCreateInfo*)alloc->alloc(sizeof(const VkPipelineVertexInputStateCreateInfo));
-        deepcopy_VkPipelineVertexInputStateCreateInfo(alloc, rootType, from->pVertexInputState, (VkPipelineVertexInputStateCreateInfo*)(to->pVertexInputState));
+    if (from->pVertexInputState) {
+        to->pVertexInputState = (VkPipelineVertexInputStateCreateInfo*)alloc->alloc(
+            sizeof(const VkPipelineVertexInputStateCreateInfo));
+        deepcopy_VkPipelineVertexInputStateCreateInfo(
+            alloc, rootType, from->pVertexInputState,
+            (VkPipelineVertexInputStateCreateInfo*)(to->pVertexInputState));
     }
     to->pTessellationState = nullptr;
-    if (from->pTessellationState)
-    {
-        to->pTessellationState = (VkPipelineTessellationStateCreateInfo*)alloc->alloc(sizeof(const VkPipelineTessellationStateCreateInfo));
-        deepcopy_VkPipelineTessellationStateCreateInfo(alloc, rootType, from->pTessellationState, (VkPipelineTessellationStateCreateInfo*)(to->pTessellationState));
+    if (from->pTessellationState) {
+        to->pTessellationState = (VkPipelineTessellationStateCreateInfo*)alloc->alloc(
+            sizeof(const VkPipelineTessellationStateCreateInfo));
+        deepcopy_VkPipelineTessellationStateCreateInfo(
+            alloc, rootType, from->pTessellationState,
+            (VkPipelineTessellationStateCreateInfo*)(to->pTessellationState));
     }
 }
 
 void deepcopy_VkGraphicsPipelineShaderGroupsCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkGraphicsPipelineShaderGroupsCreateInfoNV* from,
-    VkGraphicsPipelineShaderGroupsCreateInfoNV* to)
-{
+    VkGraphicsPipelineShaderGroupsCreateInfoNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pGroups = nullptr;
-        if (from->pGroups)
-        {
-            to->pGroups = (VkGraphicsShaderGroupCreateInfoNV*)alloc->alloc(from->groupCount * sizeof(const VkGraphicsShaderGroupCreateInfoNV));
+        if (from->pGroups) {
+            to->pGroups = (VkGraphicsShaderGroupCreateInfoNV*)alloc->alloc(
+                from->groupCount * sizeof(const VkGraphicsShaderGroupCreateInfoNV));
             to->groupCount = from->groupCount;
-            for (uint32_t i = 0; i < (uint32_t)from->groupCount; ++i)
-            {
-                deepcopy_VkGraphicsShaderGroupCreateInfoNV(alloc, rootType, from->pGroups + i, (VkGraphicsShaderGroupCreateInfoNV*)(to->pGroups + i));
+            for (uint32_t i = 0; i < (uint32_t)from->groupCount; ++i) {
+                deepcopy_VkGraphicsShaderGroupCreateInfoNV(
+                    alloc, rootType, from->pGroups + i,
+                    (VkGraphicsShaderGroupCreateInfoNV*)(to->pGroups + i));
             }
         }
     }
     to->pPipelines = nullptr;
-    if (from->pPipelines)
-    {
-        to->pPipelines = (VkPipeline*)alloc->dupArray(from->pPipelines, from->pipelineCount * sizeof(const VkPipeline));
+    if (from->pPipelines) {
+        to->pPipelines = (VkPipeline*)alloc->dupArray(
+            from->pPipelines, from->pipelineCount * sizeof(const VkPipeline));
     }
 }
 
-void deepcopy_VkBindShaderGroupIndirectCommandNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBindShaderGroupIndirectCommandNV* from,
-    VkBindShaderGroupIndirectCommandNV* to)
-{
+void deepcopy_VkBindShaderGroupIndirectCommandNV(Allocator* alloc, VkStructureType rootType,
+                                                 const VkBindShaderGroupIndirectCommandNV* from,
+                                                 VkBindShaderGroupIndirectCommandNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkBindIndexBufferIndirectCommandNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBindIndexBufferIndirectCommandNV* from,
-    VkBindIndexBufferIndirectCommandNV* to)
-{
+void deepcopy_VkBindIndexBufferIndirectCommandNV(Allocator* alloc, VkStructureType rootType,
+                                                 const VkBindIndexBufferIndirectCommandNV* from,
+                                                 VkBindIndexBufferIndirectCommandNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkBindVertexBufferIndirectCommandNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBindVertexBufferIndirectCommandNV* from,
-    VkBindVertexBufferIndirectCommandNV* to)
-{
+void deepcopy_VkBindVertexBufferIndirectCommandNV(Allocator* alloc, VkStructureType rootType,
+                                                  const VkBindVertexBufferIndirectCommandNV* from,
+                                                  VkBindVertexBufferIndirectCommandNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkSetStateFlagsIndirectCommandNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSetStateFlagsIndirectCommandNV* from,
-    VkSetStateFlagsIndirectCommandNV* to)
-{
+void deepcopy_VkSetStateFlagsIndirectCommandNV(Allocator* alloc, VkStructureType rootType,
+                                               const VkSetStateFlagsIndirectCommandNV* from,
+                                               VkSetStateFlagsIndirectCommandNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkIndirectCommandsStreamNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkIndirectCommandsStreamNV* from,
-    VkIndirectCommandsStreamNV* to)
-{
+void deepcopy_VkIndirectCommandsStreamNV(Allocator* alloc, VkStructureType rootType,
+                                         const VkIndirectCommandsStreamNV* from,
+                                         VkIndirectCommandsStreamNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkIndirectCommandsLayoutTokenNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkIndirectCommandsLayoutTokenNV* from,
-    VkIndirectCommandsLayoutTokenNV* to)
-{
+void deepcopy_VkIndirectCommandsLayoutTokenNV(Allocator* alloc, VkStructureType rootType,
+                                              const VkIndirectCommandsLayoutTokenNV* from,
+                                              VkIndirectCommandsLayoutTokenNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pIndexTypes = nullptr;
-    if (from->pIndexTypes)
-    {
-        to->pIndexTypes = (VkIndexType*)alloc->dupArray(from->pIndexTypes, from->indexTypeCount * sizeof(const VkIndexType));
+    if (from->pIndexTypes) {
+        to->pIndexTypes = (VkIndexType*)alloc->dupArray(
+            from->pIndexTypes, from->indexTypeCount * sizeof(const VkIndexType));
     }
     to->pIndexTypeValues = nullptr;
-    if (from->pIndexTypeValues)
-    {
-        to->pIndexTypeValues = (uint32_t*)alloc->dupArray(from->pIndexTypeValues, from->indexTypeCount * sizeof(const uint32_t));
+    if (from->pIndexTypeValues) {
+        to->pIndexTypeValues = (uint32_t*)alloc->dupArray(
+            from->pIndexTypeValues, from->indexTypeCount * sizeof(const uint32_t));
     }
 }
 
-void deepcopy_VkIndirectCommandsLayoutCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkIndirectCommandsLayoutCreateInfoNV* from,
-    VkIndirectCommandsLayoutCreateInfoNV* to)
-{
+void deepcopy_VkIndirectCommandsLayoutCreateInfoNV(Allocator* alloc, VkStructureType rootType,
+                                                   const VkIndirectCommandsLayoutCreateInfoNV* from,
+                                                   VkIndirectCommandsLayoutCreateInfoNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pTokens = nullptr;
-        if (from->pTokens)
-        {
-            to->pTokens = (VkIndirectCommandsLayoutTokenNV*)alloc->alloc(from->tokenCount * sizeof(const VkIndirectCommandsLayoutTokenNV));
+        if (from->pTokens) {
+            to->pTokens = (VkIndirectCommandsLayoutTokenNV*)alloc->alloc(
+                from->tokenCount * sizeof(const VkIndirectCommandsLayoutTokenNV));
             to->tokenCount = from->tokenCount;
-            for (uint32_t i = 0; i < (uint32_t)from->tokenCount; ++i)
-            {
-                deepcopy_VkIndirectCommandsLayoutTokenNV(alloc, rootType, from->pTokens + i, (VkIndirectCommandsLayoutTokenNV*)(to->pTokens + i));
+            for (uint32_t i = 0; i < (uint32_t)from->tokenCount; ++i) {
+                deepcopy_VkIndirectCommandsLayoutTokenNV(
+                    alloc, rootType, from->pTokens + i,
+                    (VkIndirectCommandsLayoutTokenNV*)(to->pTokens + i));
             }
         }
     }
     to->pStreamStrides = nullptr;
-    if (from->pStreamStrides)
-    {
-        to->pStreamStrides = (uint32_t*)alloc->dupArray(from->pStreamStrides, from->streamCount * sizeof(const uint32_t));
+    if (from->pStreamStrides) {
+        to->pStreamStrides = (uint32_t*)alloc->dupArray(from->pStreamStrides,
+                                                        from->streamCount * sizeof(const uint32_t));
     }
 }
 
-void deepcopy_VkGeneratedCommandsInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkGeneratedCommandsInfoNV* from,
-    VkGeneratedCommandsInfoNV* to)
-{
+void deepcopy_VkGeneratedCommandsInfoNV(Allocator* alloc, VkStructureType rootType,
+                                        const VkGeneratedCommandsInfoNV* from,
+                                        VkGeneratedCommandsInfoNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pStreams = nullptr;
-        if (from->pStreams)
-        {
-            to->pStreams = (VkIndirectCommandsStreamNV*)alloc->alloc(from->streamCount * sizeof(const VkIndirectCommandsStreamNV));
+        if (from->pStreams) {
+            to->pStreams = (VkIndirectCommandsStreamNV*)alloc->alloc(
+                from->streamCount * sizeof(const VkIndirectCommandsStreamNV));
             to->streamCount = from->streamCount;
-            for (uint32_t i = 0; i < (uint32_t)from->streamCount; ++i)
-            {
-                deepcopy_VkIndirectCommandsStreamNV(alloc, rootType, from->pStreams + i, (VkIndirectCommandsStreamNV*)(to->pStreams + i));
+            for (uint32_t i = 0; i < (uint32_t)from->streamCount; ++i) {
+                deepcopy_VkIndirectCommandsStreamNV(
+                    alloc, rootType, from->pStreams + i,
+                    (VkIndirectCommandsStreamNV*)(to->pStreams + i));
             }
         }
     }
 }
 
 void deepcopy_VkGeneratedCommandsMemoryRequirementsInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkGeneratedCommandsMemoryRequirementsInfoNV* from,
-    VkGeneratedCommandsMemoryRequirementsInfoNV* to)
-{
+    VkGeneratedCommandsMemoryRequirementsInfoNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -18542,120 +15256,100 @@
 #endif
 #ifdef VK_NV_inherited_viewport_scissor
 void deepcopy_VkPhysicalDeviceInheritedViewportScissorFeaturesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceInheritedViewportScissorFeaturesNV* from,
-    VkPhysicalDeviceInheritedViewportScissorFeaturesNV* to)
-{
+    VkPhysicalDeviceInheritedViewportScissorFeaturesNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkCommandBufferInheritanceViewportScissorInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkCommandBufferInheritanceViewportScissorInfoNV* from,
-    VkCommandBufferInheritanceViewportScissorInfoNV* to)
-{
+    VkCommandBufferInheritanceViewportScissorInfoNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pViewportDepths = nullptr;
-    if (from->pViewportDepths)
-    {
+    if (from->pViewportDepths) {
         to->pViewportDepths = (VkViewport*)alloc->alloc(sizeof(const VkViewport));
-        deepcopy_VkViewport(alloc, rootType, from->pViewportDepths, (VkViewport*)(to->pViewportDepths));
+        deepcopy_VkViewport(alloc, rootType, from->pViewportDepths,
+                            (VkViewport*)(to->pViewportDepths));
     }
 }
 
 #endif
 #ifdef VK_EXT_texel_buffer_alignment
 void deepcopy_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* from,
-    VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* to)
-{
+    VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* from,
-    VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* to)
-{
+    VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -18663,57 +15357,46 @@
 
 #endif
 #ifdef VK_QCOM_render_pass_transform
-void deepcopy_VkRenderPassTransformBeginInfoQCOM(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkRenderPassTransformBeginInfoQCOM* from,
-    VkRenderPassTransformBeginInfoQCOM* to)
-{
+void deepcopy_VkRenderPassTransformBeginInfoQCOM(Allocator* alloc, VkStructureType rootType,
+                                                 const VkRenderPassTransformBeginInfoQCOM* from,
+                                                 VkRenderPassTransformBeginInfoQCOM* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkCommandBufferInheritanceRenderPassTransformInfoQCOM* from,
-    VkCommandBufferInheritanceRenderPassTransformInfoQCOM* to)
-{
+    VkCommandBufferInheritanceRenderPassTransformInfoQCOM* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -18723,90 +15406,72 @@
 #endif
 #ifdef VK_EXT_device_memory_report
 void deepcopy_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* from,
-    VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* to)
-{
+    VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkDeviceMemoryReportCallbackDataEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDeviceMemoryReportCallbackDataEXT* from,
-    VkDeviceMemoryReportCallbackDataEXT* to)
-{
+void deepcopy_VkDeviceMemoryReportCallbackDataEXT(Allocator* alloc, VkStructureType rootType,
+                                                  const VkDeviceMemoryReportCallbackDataEXT* from,
+                                                  VkDeviceMemoryReportCallbackDataEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkDeviceDeviceMemoryReportCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDeviceDeviceMemoryReportCreateInfoEXT* from,
-    VkDeviceDeviceMemoryReportCreateInfoEXT* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkDeviceDeviceMemoryReportCreateInfoEXT* from,
+    VkDeviceDeviceMemoryReportCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pUserData = nullptr;
-    if (from->pUserData)
-    {
+    if (from->pUserData) {
         to->pUserData = (void*)alloc->dupArray(from->pUserData, sizeof(uint8_t));
     }
 }
@@ -18816,56 +15481,45 @@
 #endif
 #ifdef VK_EXT_robustness2
 void deepcopy_VkPhysicalDeviceRobustness2FeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceRobustness2FeaturesEXT* from,
-    VkPhysicalDeviceRobustness2FeaturesEXT* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDeviceRobustness2FeaturesEXT* from,
+    VkPhysicalDeviceRobustness2FeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceRobustness2PropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceRobustness2PropertiesEXT* from,
-    VkPhysicalDeviceRobustness2PropertiesEXT* to)
-{
+    VkPhysicalDeviceRobustness2PropertiesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -18874,85 +15528,70 @@
 #endif
 #ifdef VK_EXT_custom_border_color
 void deepcopy_VkSamplerCustomBorderColorCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSamplerCustomBorderColorCreateInfoEXT* from,
-    VkSamplerCustomBorderColorCreateInfoEXT* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkSamplerCustomBorderColorCreateInfoEXT* from,
+    VkSamplerCustomBorderColorCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkClearColorValue(alloc, rootType, &from->customBorderColor, (VkClearColorValue*)(&to->customBorderColor));
+    deepcopy_VkClearColorValue(alloc, rootType, &from->customBorderColor,
+                               (VkClearColorValue*)(&to->customBorderColor));
 }
 
 void deepcopy_VkPhysicalDeviceCustomBorderColorPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceCustomBorderColorPropertiesEXT* from,
-    VkPhysicalDeviceCustomBorderColorPropertiesEXT* to)
-{
+    VkPhysicalDeviceCustomBorderColorPropertiesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceCustomBorderColorFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceCustomBorderColorFeaturesEXT* from,
-    VkPhysicalDeviceCustomBorderColorFeaturesEXT* to)
-{
+    VkPhysicalDeviceCustomBorderColorFeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -18963,84 +15602,66 @@
 #endif
 #ifdef VK_EXT_private_data
 void deepcopy_VkPhysicalDevicePrivateDataFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDevicePrivateDataFeaturesEXT* from,
-    VkPhysicalDevicePrivateDataFeaturesEXT* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDevicePrivateDataFeaturesEXT* from,
+    VkPhysicalDevicePrivateDataFeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkDevicePrivateDataCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDevicePrivateDataCreateInfoEXT* from,
-    VkDevicePrivateDataCreateInfoEXT* to)
-{
+void deepcopy_VkDevicePrivateDataCreateInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                               const VkDevicePrivateDataCreateInfoEXT* from,
+                                               VkDevicePrivateDataCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkPrivateDataSlotCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPrivateDataSlotCreateInfoEXT* from,
-    VkPrivateDataSlotCreateInfoEXT* to)
-{
+void deepcopy_VkPrivateDataSlotCreateInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                             const VkPrivateDataSlotCreateInfoEXT* from,
+                                             VkPrivateDataSlotCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -19049,28 +15670,23 @@
 #endif
 #ifdef VK_EXT_pipeline_creation_cache_control
 void deepcopy_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* from,
-    VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* to)
-{
+    VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -19079,56 +15695,45 @@
 #endif
 #ifdef VK_NV_device_diagnostics_config
 void deepcopy_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceDiagnosticsConfigFeaturesNV* from,
-    VkPhysicalDeviceDiagnosticsConfigFeaturesNV* to)
-{
+    VkPhysicalDeviceDiagnosticsConfigFeaturesNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkDeviceDiagnosticsConfigCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDeviceDiagnosticsConfigCreateInfoNV* from,
-    VkDeviceDiagnosticsConfigCreateInfoNV* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkDeviceDiagnosticsConfigCreateInfoNV* from,
+    VkDeviceDiagnosticsConfigCreateInfoNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -19139,84 +15744,69 @@
 #endif
 #ifdef VK_NV_fragment_shading_rate_enums
 void deepcopy_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* from,
-    VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* to)
-{
+    VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* from,
-    VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* to)
-{
+    VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineFragmentShadingRateEnumStateCreateInfoNV* from,
-    VkPipelineFragmentShadingRateEnumStateCreateInfoNV* to)
-{
+    VkPipelineFragmentShadingRateEnumStateCreateInfoNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -19225,109 +15815,89 @@
 
 #endif
 #ifdef VK_NV_ray_tracing_motion_blur
-void deepcopy_VkDeviceOrHostAddressConstKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDeviceOrHostAddressConstKHR* from,
-    VkDeviceOrHostAddressConstKHR* to)
-{
+void deepcopy_VkDeviceOrHostAddressConstKHR(Allocator* alloc, VkStructureType rootType,
+                                            const VkDeviceOrHostAddressConstKHR* from,
+                                            VkDeviceOrHostAddressConstKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
     to->hostAddress = nullptr;
-    if (from->hostAddress)
-    {
+    if (from->hostAddress) {
         to->hostAddress = (void*)alloc->dupArray(from->hostAddress, sizeof(const uint8_t));
     }
 }
 
 void deepcopy_VkAccelerationStructureGeometryMotionTrianglesDataNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkAccelerationStructureGeometryMotionTrianglesDataNV* from,
-    VkAccelerationStructureGeometryMotionTrianglesDataNV* to)
-{
+    VkAccelerationStructureGeometryMotionTrianglesDataNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkDeviceOrHostAddressConstKHR(alloc, rootType, &from->vertexData, (VkDeviceOrHostAddressConstKHR*)(&to->vertexData));
+    deepcopy_VkDeviceOrHostAddressConstKHR(alloc, rootType, &from->vertexData,
+                                           (VkDeviceOrHostAddressConstKHR*)(&to->vertexData));
 }
 
-void deepcopy_VkAccelerationStructureMotionInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAccelerationStructureMotionInfoNV* from,
-    VkAccelerationStructureMotionInfoNV* to)
-{
+void deepcopy_VkAccelerationStructureMotionInfoNV(Allocator* alloc, VkStructureType rootType,
+                                                  const VkAccelerationStructureMotionInfoNV* from,
+                                                  VkAccelerationStructureMotionInfoNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkAccelerationStructureMatrixMotionInstanceNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkAccelerationStructureMatrixMotionInstanceNV* from,
-    VkAccelerationStructureMatrixMotionInstanceNV* to)
-{
+    VkAccelerationStructureMatrixMotionInstanceNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    deepcopy_VkTransformMatrixKHR(alloc, rootType, &from->transformT0, (VkTransformMatrixKHR*)(&to->transformT0));
-    deepcopy_VkTransformMatrixKHR(alloc, rootType, &from->transformT1, (VkTransformMatrixKHR*)(&to->transformT1));
+    deepcopy_VkTransformMatrixKHR(alloc, rootType, &from->transformT0,
+                                  (VkTransformMatrixKHR*)(&to->transformT0));
+    deepcopy_VkTransformMatrixKHR(alloc, rootType, &from->transformT1,
+                                  (VkTransformMatrixKHR*)(&to->transformT1));
 }
 
-void deepcopy_VkSRTDataNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSRTDataNV* from,
-    VkSRTDataNV* to)
-{
+void deepcopy_VkSRTDataNV(Allocator* alloc, VkStructureType rootType, const VkSRTDataNV* from,
+                          VkSRTDataNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkAccelerationStructureSRTMotionInstanceNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkAccelerationStructureSRTMotionInstanceNV* from,
-    VkAccelerationStructureSRTMotionInstanceNV* to)
-{
+    VkAccelerationStructureSRTMotionInstanceNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
@@ -19336,54 +15906,51 @@
 }
 
 void deepcopy_VkAccelerationStructureMotionInstanceDataNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkAccelerationStructureMotionInstanceDataNV* from,
-    VkAccelerationStructureMotionInstanceDataNV* to)
-{
+    VkAccelerationStructureMotionInstanceDataNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    deepcopy_VkAccelerationStructureInstanceKHR(alloc, rootType, &from->staticInstance, (VkAccelerationStructureInstanceKHR*)(&to->staticInstance));
-    deepcopy_VkAccelerationStructureMatrixMotionInstanceNV(alloc, rootType, &from->matrixMotionInstance, (VkAccelerationStructureMatrixMotionInstanceNV*)(&to->matrixMotionInstance));
-    deepcopy_VkAccelerationStructureSRTMotionInstanceNV(alloc, rootType, &from->srtMotionInstance, (VkAccelerationStructureSRTMotionInstanceNV*)(&to->srtMotionInstance));
+    deepcopy_VkAccelerationStructureInstanceKHR(
+        alloc, rootType, &from->staticInstance,
+        (VkAccelerationStructureInstanceKHR*)(&to->staticInstance));
+    deepcopy_VkAccelerationStructureMatrixMotionInstanceNV(
+        alloc, rootType, &from->matrixMotionInstance,
+        (VkAccelerationStructureMatrixMotionInstanceNV*)(&to->matrixMotionInstance));
+    deepcopy_VkAccelerationStructureSRTMotionInstanceNV(
+        alloc, rootType, &from->srtMotionInstance,
+        (VkAccelerationStructureSRTMotionInstanceNV*)(&to->srtMotionInstance));
 }
 
 void deepcopy_VkAccelerationStructureMotionInstanceNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAccelerationStructureMotionInstanceNV* from,
-    VkAccelerationStructureMotionInstanceNV* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkAccelerationStructureMotionInstanceNV* from,
+    VkAccelerationStructureMotionInstanceNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    deepcopy_VkAccelerationStructureMotionInstanceDataNV(alloc, rootType, &from->data, (VkAccelerationStructureMotionInstanceDataNV*)(&to->data));
+    deepcopy_VkAccelerationStructureMotionInstanceDataNV(
+        alloc, rootType, &from->data, (VkAccelerationStructureMotionInstanceDataNV*)(&to->data));
 }
 
 void deepcopy_VkPhysicalDeviceRayTracingMotionBlurFeaturesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceRayTracingMotionBlurFeaturesNV* from,
-    VkPhysicalDeviceRayTracingMotionBlurFeaturesNV* to)
-{
+    VkPhysicalDeviceRayTracingMotionBlurFeaturesNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -19392,28 +15959,23 @@
 #endif
 #ifdef VK_EXT_ycbcr_2plane_444_formats
 void deepcopy_VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT* from,
-    VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT* to)
-{
+    VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -19422,56 +15984,46 @@
 #endif
 #ifdef VK_EXT_fragment_density_map2
 void deepcopy_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* from,
-    VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* to)
-{
+    VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* from,
-    VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* to)
-{
+    VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -19479,29 +16031,23 @@
 
 #endif
 #ifdef VK_QCOM_rotated_copy_commands
-void deepcopy_VkCopyCommandTransformInfoQCOM(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCopyCommandTransformInfoQCOM* from,
-    VkCopyCommandTransformInfoQCOM* to)
-{
+void deepcopy_VkCopyCommandTransformInfoQCOM(Allocator* alloc, VkStructureType rootType,
+                                             const VkCopyCommandTransformInfoQCOM* from,
+                                             VkCopyCommandTransformInfoQCOM* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -19510,28 +16056,23 @@
 #endif
 #ifdef VK_EXT_image_robustness
 void deepcopy_VkPhysicalDeviceImageRobustnessFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceImageRobustnessFeaturesEXT* from,
-    VkPhysicalDeviceImageRobustnessFeaturesEXT* to)
-{
+    VkPhysicalDeviceImageRobustnessFeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -19540,28 +16081,22 @@
 #endif
 #ifdef VK_EXT_4444_formats
 void deepcopy_VkPhysicalDevice4444FormatsFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDevice4444FormatsFeaturesEXT* from,
-    VkPhysicalDevice4444FormatsFeaturesEXT* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDevice4444FormatsFeaturesEXT* from,
+    VkPhysicalDevice4444FormatsFeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -19570,28 +16105,23 @@
 #endif
 #ifdef VK_EXT_rgba10x6_formats
 void deepcopy_VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT* from,
-    VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT* to)
-{
+    VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -19601,40 +16131,32 @@
 #ifdef VK_NV_acquire_winrt_display
 #endif
 #ifdef VK_EXT_directfb_surface
-void deepcopy_VkDirectFBSurfaceCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDirectFBSurfaceCreateInfoEXT* from,
-    VkDirectFBSurfaceCreateInfoEXT* to)
-{
+void deepcopy_VkDirectFBSurfaceCreateInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                             const VkDirectFBSurfaceCreateInfoEXT* from,
+                                             VkDirectFBSurfaceCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->dfb = nullptr;
-    if (from->dfb)
-    {
+    if (from->dfb) {
         to->dfb = (IDirectFB*)alloc->dupArray(from->dfb, sizeof(IDirectFB));
     }
     to->surface = nullptr;
-    if (from->surface)
-    {
+    if (from->surface) {
         to->surface = (IDirectFBSurface*)alloc->dupArray(from->surface, sizeof(IDirectFBSurface));
     }
 }
@@ -19642,85 +16164,72 @@
 #endif
 #ifdef VK_VALVE_mutable_descriptor_type
 void deepcopy_VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE* from,
-    VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE* to)
-{
+    VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkMutableDescriptorTypeListVALVE(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMutableDescriptorTypeListVALVE* from,
-    VkMutableDescriptorTypeListVALVE* to)
-{
+void deepcopy_VkMutableDescriptorTypeListVALVE(Allocator* alloc, VkStructureType rootType,
+                                               const VkMutableDescriptorTypeListVALVE* from,
+                                               VkMutableDescriptorTypeListVALVE* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
     to->pDescriptorTypes = nullptr;
-    if (from->pDescriptorTypes)
-    {
-        to->pDescriptorTypes = (VkDescriptorType*)alloc->dupArray(from->pDescriptorTypes, from->descriptorTypeCount * sizeof(const VkDescriptorType));
+    if (from->pDescriptorTypes) {
+        to->pDescriptorTypes = (VkDescriptorType*)alloc->dupArray(
+            from->pDescriptorTypes, from->descriptorTypeCount * sizeof(const VkDescriptorType));
     }
 }
 
 void deepcopy_VkMutableDescriptorTypeCreateInfoVALVE(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMutableDescriptorTypeCreateInfoVALVE* from,
-    VkMutableDescriptorTypeCreateInfoVALVE* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkMutableDescriptorTypeCreateInfoVALVE* from,
+    VkMutableDescriptorTypeCreateInfoVALVE* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pMutableDescriptorTypeLists = nullptr;
-        if (from->pMutableDescriptorTypeLists)
-        {
-            to->pMutableDescriptorTypeLists = (VkMutableDescriptorTypeListVALVE*)alloc->alloc(from->mutableDescriptorTypeListCount * sizeof(const VkMutableDescriptorTypeListVALVE));
+        if (from->pMutableDescriptorTypeLists) {
+            to->pMutableDescriptorTypeLists = (VkMutableDescriptorTypeListVALVE*)alloc->alloc(
+                from->mutableDescriptorTypeListCount *
+                sizeof(const VkMutableDescriptorTypeListVALVE));
             to->mutableDescriptorTypeListCount = from->mutableDescriptorTypeListCount;
-            for (uint32_t i = 0; i < (uint32_t)from->mutableDescriptorTypeListCount; ++i)
-            {
-                deepcopy_VkMutableDescriptorTypeListVALVE(alloc, rootType, from->pMutableDescriptorTypeLists + i, (VkMutableDescriptorTypeListVALVE*)(to->pMutableDescriptorTypeLists + i));
+            for (uint32_t i = 0; i < (uint32_t)from->mutableDescriptorTypeListCount; ++i) {
+                deepcopy_VkMutableDescriptorTypeListVALVE(
+                    alloc, rootType, from->pMutableDescriptorTypeLists + i,
+                    (VkMutableDescriptorTypeListVALVE*)(to->pMutableDescriptorTypeLists + i));
             }
         }
     }
@@ -19729,84 +16238,67 @@
 #endif
 #ifdef VK_EXT_vertex_input_dynamic_state
 void deepcopy_VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT* from,
-    VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT* to)
-{
+    VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkVertexInputBindingDescription2EXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVertexInputBindingDescription2EXT* from,
-    VkVertexInputBindingDescription2EXT* to)
-{
+void deepcopy_VkVertexInputBindingDescription2EXT(Allocator* alloc, VkStructureType rootType,
+                                                  const VkVertexInputBindingDescription2EXT* from,
+                                                  VkVertexInputBindingDescription2EXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkVertexInputAttributeDescription2EXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVertexInputAttributeDescription2EXT* from,
-    VkVertexInputAttributeDescription2EXT* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkVertexInputAttributeDescription2EXT* from,
+    VkVertexInputAttributeDescription2EXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -19814,29 +16306,23 @@
 
 #endif
 #ifdef VK_EXT_physical_device_drm
-void deepcopy_VkPhysicalDeviceDrmPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceDrmPropertiesEXT* from,
-    VkPhysicalDeviceDrmPropertiesEXT* to)
-{
+void deepcopy_VkPhysicalDeviceDrmPropertiesEXT(Allocator* alloc, VkStructureType rootType,
+                                               const VkPhysicalDeviceDrmPropertiesEXT* from,
+                                               VkPhysicalDeviceDrmPropertiesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -19845,28 +16331,23 @@
 #endif
 #ifdef VK_EXT_primitive_topology_list_restart
 void deepcopy_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT* from,
-    VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT* to)
-{
+    VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -19875,84 +16356,66 @@
 #endif
 #ifdef VK_FUCHSIA_external_memory
 void deepcopy_VkImportMemoryZirconHandleInfoFUCHSIA(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImportMemoryZirconHandleInfoFUCHSIA* from,
-    VkImportMemoryZirconHandleInfoFUCHSIA* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkImportMemoryZirconHandleInfoFUCHSIA* from,
+    VkImportMemoryZirconHandleInfoFUCHSIA* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkMemoryZirconHandlePropertiesFUCHSIA(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryZirconHandlePropertiesFUCHSIA* from,
-    VkMemoryZirconHandlePropertiesFUCHSIA* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkMemoryZirconHandlePropertiesFUCHSIA* from,
+    VkMemoryZirconHandlePropertiesFUCHSIA* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkMemoryGetZirconHandleInfoFUCHSIA(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryGetZirconHandleInfoFUCHSIA* from,
-    VkMemoryGetZirconHandleInfoFUCHSIA* to)
-{
+void deepcopy_VkMemoryGetZirconHandleInfoFUCHSIA(Allocator* alloc, VkStructureType rootType,
+                                                 const VkMemoryGetZirconHandleInfoFUCHSIA* from,
+                                                 VkMemoryGetZirconHandleInfoFUCHSIA* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -19961,56 +16424,45 @@
 #endif
 #ifdef VK_FUCHSIA_external_semaphore
 void deepcopy_VkImportSemaphoreZirconHandleInfoFUCHSIA(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkImportSemaphoreZirconHandleInfoFUCHSIA* from,
-    VkImportSemaphoreZirconHandleInfoFUCHSIA* to)
-{
+    VkImportSemaphoreZirconHandleInfoFUCHSIA* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkSemaphoreGetZirconHandleInfoFUCHSIA(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSemaphoreGetZirconHandleInfoFUCHSIA* from,
-    VkSemaphoreGetZirconHandleInfoFUCHSIA* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkSemaphoreGetZirconHandleInfoFUCHSIA* from,
+    VkSemaphoreGetZirconHandleInfoFUCHSIA* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -20018,392 +16470,329 @@
 
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
-void deepcopy_VkBufferCollectionCreateInfoFUCHSIA(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBufferCollectionCreateInfoFUCHSIA* from,
-    VkBufferCollectionCreateInfoFUCHSIA* to)
-{
+void deepcopy_VkBufferCollectionCreateInfoFUCHSIA(Allocator* alloc, VkStructureType rootType,
+                                                  const VkBufferCollectionCreateInfoFUCHSIA* from,
+                                                  VkBufferCollectionCreateInfoFUCHSIA* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkImportMemoryBufferCollectionFUCHSIA(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImportMemoryBufferCollectionFUCHSIA* from,
-    VkImportMemoryBufferCollectionFUCHSIA* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkImportMemoryBufferCollectionFUCHSIA* from,
+    VkImportMemoryBufferCollectionFUCHSIA* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkBufferCollectionImageCreateInfoFUCHSIA(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkBufferCollectionImageCreateInfoFUCHSIA* from,
-    VkBufferCollectionImageCreateInfoFUCHSIA* to)
-{
+    VkBufferCollectionImageCreateInfoFUCHSIA* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkBufferCollectionConstraintsInfoFUCHSIA(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkBufferCollectionConstraintsInfoFUCHSIA* from,
-    VkBufferCollectionConstraintsInfoFUCHSIA* to)
-{
+    VkBufferCollectionConstraintsInfoFUCHSIA* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkBufferConstraintsInfoFUCHSIA(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBufferConstraintsInfoFUCHSIA* from,
-    VkBufferConstraintsInfoFUCHSIA* to)
-{
+void deepcopy_VkBufferConstraintsInfoFUCHSIA(Allocator* alloc, VkStructureType rootType,
+                                             const VkBufferConstraintsInfoFUCHSIA* from,
+                                             VkBufferConstraintsInfoFUCHSIA* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkBufferCreateInfo(alloc, rootType, &from->createInfo, (VkBufferCreateInfo*)(&to->createInfo));
-    deepcopy_VkBufferCollectionConstraintsInfoFUCHSIA(alloc, rootType, &from->bufferCollectionConstraints, (VkBufferCollectionConstraintsInfoFUCHSIA*)(&to->bufferCollectionConstraints));
+    deepcopy_VkBufferCreateInfo(alloc, rootType, &from->createInfo,
+                                (VkBufferCreateInfo*)(&to->createInfo));
+    deepcopy_VkBufferCollectionConstraintsInfoFUCHSIA(
+        alloc, rootType, &from->bufferCollectionConstraints,
+        (VkBufferCollectionConstraintsInfoFUCHSIA*)(&to->bufferCollectionConstraints));
 }
 
 void deepcopy_VkBufferCollectionBufferCreateInfoFUCHSIA(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkBufferCollectionBufferCreateInfoFUCHSIA* from,
-    VkBufferCollectionBufferCreateInfoFUCHSIA* to)
-{
+    VkBufferCollectionBufferCreateInfoFUCHSIA* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkSysmemColorSpaceFUCHSIA(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSysmemColorSpaceFUCHSIA* from,
-    VkSysmemColorSpaceFUCHSIA* to)
-{
+void deepcopy_VkSysmemColorSpaceFUCHSIA(Allocator* alloc, VkStructureType rootType,
+                                        const VkSysmemColorSpaceFUCHSIA* from,
+                                        VkSysmemColorSpaceFUCHSIA* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkBufferCollectionPropertiesFUCHSIA(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBufferCollectionPropertiesFUCHSIA* from,
-    VkBufferCollectionPropertiesFUCHSIA* to)
-{
+void deepcopy_VkBufferCollectionPropertiesFUCHSIA(Allocator* alloc, VkStructureType rootType,
+                                                  const VkBufferCollectionPropertiesFUCHSIA* from,
+                                                  VkBufferCollectionPropertiesFUCHSIA* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkSysmemColorSpaceFUCHSIA(alloc, rootType, &from->sysmemColorSpaceIndex, (VkSysmemColorSpaceFUCHSIA*)(&to->sysmemColorSpaceIndex));
-    deepcopy_VkComponentMapping(alloc, rootType, &from->samplerYcbcrConversionComponents, (VkComponentMapping*)(&to->samplerYcbcrConversionComponents));
+    deepcopy_VkSysmemColorSpaceFUCHSIA(alloc, rootType, &from->sysmemColorSpaceIndex,
+                                       (VkSysmemColorSpaceFUCHSIA*)(&to->sysmemColorSpaceIndex));
+    deepcopy_VkComponentMapping(alloc, rootType, &from->samplerYcbcrConversionComponents,
+                                (VkComponentMapping*)(&to->samplerYcbcrConversionComponents));
 }
 
-void deepcopy_VkImageFormatConstraintsInfoFUCHSIA(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageFormatConstraintsInfoFUCHSIA* from,
-    VkImageFormatConstraintsInfoFUCHSIA* to)
-{
+void deepcopy_VkImageFormatConstraintsInfoFUCHSIA(Allocator* alloc, VkStructureType rootType,
+                                                  const VkImageFormatConstraintsInfoFUCHSIA* from,
+                                                  VkImageFormatConstraintsInfoFUCHSIA* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkImageCreateInfo(alloc, rootType, &from->imageCreateInfo, (VkImageCreateInfo*)(&to->imageCreateInfo));
+    deepcopy_VkImageCreateInfo(alloc, rootType, &from->imageCreateInfo,
+                               (VkImageCreateInfo*)(&to->imageCreateInfo));
     to->pColorSpaces = nullptr;
-    if (from->pColorSpaces)
-    {
-        to->pColorSpaces = (VkSysmemColorSpaceFUCHSIA*)alloc->alloc(sizeof(const VkSysmemColorSpaceFUCHSIA));
-        deepcopy_VkSysmemColorSpaceFUCHSIA(alloc, rootType, from->pColorSpaces, (VkSysmemColorSpaceFUCHSIA*)(to->pColorSpaces));
+    if (from->pColorSpaces) {
+        to->pColorSpaces =
+            (VkSysmemColorSpaceFUCHSIA*)alloc->alloc(sizeof(const VkSysmemColorSpaceFUCHSIA));
+        deepcopy_VkSysmemColorSpaceFUCHSIA(alloc, rootType, from->pColorSpaces,
+                                           (VkSysmemColorSpaceFUCHSIA*)(to->pColorSpaces));
     }
 }
 
-void deepcopy_VkImageConstraintsInfoFUCHSIA(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageConstraintsInfoFUCHSIA* from,
-    VkImageConstraintsInfoFUCHSIA* to)
-{
+void deepcopy_VkImageConstraintsInfoFUCHSIA(Allocator* alloc, VkStructureType rootType,
+                                            const VkImageConstraintsInfoFUCHSIA* from,
+                                            VkImageConstraintsInfoFUCHSIA* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pFormatConstraints = nullptr;
-        if (from->pFormatConstraints)
-        {
-            to->pFormatConstraints = (VkImageFormatConstraintsInfoFUCHSIA*)alloc->alloc(from->formatConstraintsCount * sizeof(const VkImageFormatConstraintsInfoFUCHSIA));
+        if (from->pFormatConstraints) {
+            to->pFormatConstraints = (VkImageFormatConstraintsInfoFUCHSIA*)alloc->alloc(
+                from->formatConstraintsCount * sizeof(const VkImageFormatConstraintsInfoFUCHSIA));
             to->formatConstraintsCount = from->formatConstraintsCount;
-            for (uint32_t i = 0; i < (uint32_t)from->formatConstraintsCount; ++i)
-            {
-                deepcopy_VkImageFormatConstraintsInfoFUCHSIA(alloc, rootType, from->pFormatConstraints + i, (VkImageFormatConstraintsInfoFUCHSIA*)(to->pFormatConstraints + i));
+            for (uint32_t i = 0; i < (uint32_t)from->formatConstraintsCount; ++i) {
+                deepcopy_VkImageFormatConstraintsInfoFUCHSIA(
+                    alloc, rootType, from->pFormatConstraints + i,
+                    (VkImageFormatConstraintsInfoFUCHSIA*)(to->pFormatConstraints + i));
             }
         }
     }
-    deepcopy_VkBufferCollectionConstraintsInfoFUCHSIA(alloc, rootType, &from->bufferCollectionConstraints, (VkBufferCollectionConstraintsInfoFUCHSIA*)(&to->bufferCollectionConstraints));
+    deepcopy_VkBufferCollectionConstraintsInfoFUCHSIA(
+        alloc, rootType, &from->bufferCollectionConstraints,
+        (VkBufferCollectionConstraintsInfoFUCHSIA*)(&to->bufferCollectionConstraints));
 }
 
 #endif
 #ifdef VK_HUAWEI_subpass_shading
 void deepcopy_VkSubpassShadingPipelineCreateInfoHUAWEI(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkSubpassShadingPipelineCreateInfoHUAWEI* from,
-    VkSubpassShadingPipelineCreateInfoHUAWEI* to)
-{
+    VkSubpassShadingPipelineCreateInfoHUAWEI* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceSubpassShadingFeaturesHUAWEI(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceSubpassShadingFeaturesHUAWEI* from,
-    VkPhysicalDeviceSubpassShadingFeaturesHUAWEI* to)
-{
+    VkPhysicalDeviceSubpassShadingFeaturesHUAWEI* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceSubpassShadingPropertiesHUAWEI(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceSubpassShadingPropertiesHUAWEI* from,
-    VkPhysicalDeviceSubpassShadingPropertiesHUAWEI* to)
-{
+    VkPhysicalDeviceSubpassShadingPropertiesHUAWEI* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -20412,28 +16801,23 @@
 #endif
 #ifdef VK_HUAWEI_invocation_mask
 void deepcopy_VkPhysicalDeviceInvocationMaskFeaturesHUAWEI(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceInvocationMaskFeaturesHUAWEI* from,
-    VkPhysicalDeviceInvocationMaskFeaturesHUAWEI* to)
-{
+    VkPhysicalDeviceInvocationMaskFeaturesHUAWEI* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -20441,57 +16825,46 @@
 
 #endif
 #ifdef VK_NV_external_memory_rdma
-void deepcopy_VkMemoryGetRemoteAddressInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryGetRemoteAddressInfoNV* from,
-    VkMemoryGetRemoteAddressInfoNV* to)
-{
+void deepcopy_VkMemoryGetRemoteAddressInfoNV(Allocator* alloc, VkStructureType rootType,
+                                             const VkMemoryGetRemoteAddressInfoNV* from,
+                                             VkMemoryGetRemoteAddressInfoNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceExternalMemoryRDMAFeaturesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceExternalMemoryRDMAFeaturesNV* from,
-    VkPhysicalDeviceExternalMemoryRDMAFeaturesNV* to)
-{
+    VkPhysicalDeviceExternalMemoryRDMAFeaturesNV* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -20500,28 +16873,23 @@
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
 void deepcopy_VkPhysicalDeviceExtendedDynamicState2FeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceExtendedDynamicState2FeaturesEXT* from,
-    VkPhysicalDeviceExtendedDynamicState2FeaturesEXT* to)
-{
+    VkPhysicalDeviceExtendedDynamicState2FeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -20529,40 +16897,32 @@
 
 #endif
 #ifdef VK_QNX_screen_surface
-void deepcopy_VkScreenSurfaceCreateInfoQNX(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkScreenSurfaceCreateInfoQNX* from,
-    VkScreenSurfaceCreateInfoQNX* to)
-{
+void deepcopy_VkScreenSurfaceCreateInfoQNX(Allocator* alloc, VkStructureType rootType,
+                                           const VkScreenSurfaceCreateInfoQNX* from,
+                                           VkScreenSurfaceCreateInfoQNX* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->context = nullptr;
-    if (from->context)
-    {
+    if (from->context) {
         to->context = (_screen_context*)alloc->dupArray(from->context, sizeof(_screen_context));
     }
     to->window = nullptr;
-    if (from->window)
-    {
+    if (from->window) {
         to->window = (_screen_window*)alloc->dupArray(from->window, sizeof(_screen_window));
     }
 }
@@ -20570,147 +16930,117 @@
 #endif
 #ifdef VK_EXT_color_write_enable
 void deepcopy_VkPhysicalDeviceColorWriteEnableFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceColorWriteEnableFeaturesEXT* from,
-    VkPhysicalDeviceColorWriteEnableFeaturesEXT* to)
-{
+    VkPhysicalDeviceColorWriteEnableFeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkPipelineColorWriteCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineColorWriteCreateInfoEXT* from,
-    VkPipelineColorWriteCreateInfoEXT* to)
-{
+void deepcopy_VkPipelineColorWriteCreateInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                                const VkPipelineColorWriteCreateInfoEXT* from,
+                                                VkPipelineColorWriteCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pColorWriteEnables = nullptr;
-    if (from->pColorWriteEnables)
-    {
-        to->pColorWriteEnables = (VkBool32*)alloc->dupArray(from->pColorWriteEnables, from->attachmentCount * sizeof(const VkBool32));
+    if (from->pColorWriteEnables) {
+        to->pColorWriteEnables = (VkBool32*)alloc->dupArray(
+            from->pColorWriteEnables, from->attachmentCount * sizeof(const VkBool32));
     }
 }
 
 #endif
 #ifdef VK_GOOGLE_gfxstream
-void deepcopy_VkImportColorBufferGOOGLE(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImportColorBufferGOOGLE* from,
-    VkImportColorBufferGOOGLE* to)
-{
+void deepcopy_VkImportColorBufferGOOGLE(Allocator* alloc, VkStructureType rootType,
+                                        const VkImportColorBufferGOOGLE* from,
+                                        VkImportColorBufferGOOGLE* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkImportBufferGOOGLE(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImportBufferGOOGLE* from,
-    VkImportBufferGOOGLE* to)
-{
+void deepcopy_VkImportBufferGOOGLE(Allocator* alloc, VkStructureType rootType,
+                                   const VkImportBufferGOOGLE* from, VkImportBufferGOOGLE* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkImportPhysicalAddressGOOGLE(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImportPhysicalAddressGOOGLE* from,
-    VkImportPhysicalAddressGOOGLE* to)
-{
+void deepcopy_VkImportPhysicalAddressGOOGLE(Allocator* alloc, VkStructureType rootType,
+                                            const VkImportPhysicalAddressGOOGLE* from,
+                                            VkImportPhysicalAddressGOOGLE* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -20719,137 +17049,109 @@
 #endif
 #ifdef VK_EXT_global_priority_query
 void deepcopy_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT* from,
-    VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT* to)
-{
+    VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkQueueFamilyGlobalPriorityPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkQueueFamilyGlobalPriorityPropertiesEXT* from,
-    VkQueueFamilyGlobalPriorityPropertiesEXT* to)
-{
+    VkQueueFamilyGlobalPriorityPropertiesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    memcpy(to->priorities, from->priorities, VK_MAX_GLOBAL_PRIORITY_SIZE_EXT * sizeof(VkQueueGlobalPriorityEXT));
+    memcpy(to->priorities, from->priorities,
+           VK_MAX_GLOBAL_PRIORITY_SIZE_EXT * sizeof(VkQueueGlobalPriorityEXT));
 }
 
 #endif
 #ifdef VK_EXT_multi_draw
-void deepcopy_VkPhysicalDeviceMultiDrawFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceMultiDrawFeaturesEXT* from,
-    VkPhysicalDeviceMultiDrawFeaturesEXT* to)
-{
+void deepcopy_VkPhysicalDeviceMultiDrawFeaturesEXT(Allocator* alloc, VkStructureType rootType,
+                                                   const VkPhysicalDeviceMultiDrawFeaturesEXT* from,
+                                                   VkPhysicalDeviceMultiDrawFeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceMultiDrawPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceMultiDrawPropertiesEXT* from,
-    VkPhysicalDeviceMultiDrawPropertiesEXT* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDeviceMultiDrawPropertiesEXT* from,
+    VkPhysicalDeviceMultiDrawPropertiesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkMultiDrawInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMultiDrawInfoEXT* from,
-    VkMultiDrawInfoEXT* to)
-{
+void deepcopy_VkMultiDrawInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                 const VkMultiDrawInfoEXT* from, VkMultiDrawInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkMultiDrawIndexedInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMultiDrawIndexedInfoEXT* from,
-    VkMultiDrawIndexedInfoEXT* to)
-{
+void deepcopy_VkMultiDrawIndexedInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                        const VkMultiDrawIndexedInfoEXT* from,
+                                        VkMultiDrawIndexedInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
@@ -20860,87 +17162,73 @@
 #endif
 #ifdef VK_EXT_border_color_swizzle
 void deepcopy_VkPhysicalDeviceBorderColorSwizzleFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceBorderColorSwizzleFeaturesEXT* from,
-    VkPhysicalDeviceBorderColorSwizzleFeaturesEXT* to)
-{
+    VkPhysicalDeviceBorderColorSwizzleFeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkSamplerBorderColorComponentMappingCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkSamplerBorderColorComponentMappingCreateInfoEXT* from,
-    VkSamplerBorderColorComponentMappingCreateInfoEXT* to)
-{
+    VkSamplerBorderColorComponentMappingCreateInfoEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkComponentMapping(alloc, rootType, &from->components, (VkComponentMapping*)(&to->components));
+    deepcopy_VkComponentMapping(alloc, rootType, &from->components,
+                                (VkComponentMapping*)(&to->components));
 }
 
 #endif
 #ifdef VK_EXT_pageable_device_local_memory
 void deepcopy_VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT* from,
-    VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT* to)
-{
+    VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -20948,494 +17236,421 @@
 
 #endif
 #ifdef VK_KHR_acceleration_structure
-void deepcopy_VkDeviceOrHostAddressKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDeviceOrHostAddressKHR* from,
-    VkDeviceOrHostAddressKHR* to)
-{
+void deepcopy_VkDeviceOrHostAddressKHR(Allocator* alloc, VkStructureType rootType,
+                                       const VkDeviceOrHostAddressKHR* from,
+                                       VkDeviceOrHostAddressKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
     to->hostAddress = nullptr;
-    if (from->hostAddress)
-    {
+    if (from->hostAddress) {
         to->hostAddress = (void*)alloc->dupArray(from->hostAddress, sizeof(uint8_t));
     }
 }
 
 void deepcopy_VkAccelerationStructureBuildRangeInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkAccelerationStructureBuildRangeInfoKHR* from,
-    VkAccelerationStructureBuildRangeInfoKHR* to)
-{
+    VkAccelerationStructureBuildRangeInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
 void deepcopy_VkAccelerationStructureGeometryTrianglesDataKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkAccelerationStructureGeometryTrianglesDataKHR* from,
-    VkAccelerationStructureGeometryTrianglesDataKHR* to)
-{
+    VkAccelerationStructureGeometryTrianglesDataKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkDeviceOrHostAddressConstKHR(alloc, rootType, &from->vertexData, (VkDeviceOrHostAddressConstKHR*)(&to->vertexData));
-    deepcopy_VkDeviceOrHostAddressConstKHR(alloc, rootType, &from->indexData, (VkDeviceOrHostAddressConstKHR*)(&to->indexData));
-    deepcopy_VkDeviceOrHostAddressConstKHR(alloc, rootType, &from->transformData, (VkDeviceOrHostAddressConstKHR*)(&to->transformData));
+    deepcopy_VkDeviceOrHostAddressConstKHR(alloc, rootType, &from->vertexData,
+                                           (VkDeviceOrHostAddressConstKHR*)(&to->vertexData));
+    deepcopy_VkDeviceOrHostAddressConstKHR(alloc, rootType, &from->indexData,
+                                           (VkDeviceOrHostAddressConstKHR*)(&to->indexData));
+    deepcopy_VkDeviceOrHostAddressConstKHR(alloc, rootType, &from->transformData,
+                                           (VkDeviceOrHostAddressConstKHR*)(&to->transformData));
 }
 
 void deepcopy_VkAccelerationStructureGeometryAabbsDataKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkAccelerationStructureGeometryAabbsDataKHR* from,
-    VkAccelerationStructureGeometryAabbsDataKHR* to)
-{
+    VkAccelerationStructureGeometryAabbsDataKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkDeviceOrHostAddressConstKHR(alloc, rootType, &from->data, (VkDeviceOrHostAddressConstKHR*)(&to->data));
+    deepcopy_VkDeviceOrHostAddressConstKHR(alloc, rootType, &from->data,
+                                           (VkDeviceOrHostAddressConstKHR*)(&to->data));
 }
 
 void deepcopy_VkAccelerationStructureGeometryInstancesDataKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkAccelerationStructureGeometryInstancesDataKHR* from,
-    VkAccelerationStructureGeometryInstancesDataKHR* to)
-{
+    VkAccelerationStructureGeometryInstancesDataKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkDeviceOrHostAddressConstKHR(alloc, rootType, &from->data, (VkDeviceOrHostAddressConstKHR*)(&to->data));
+    deepcopy_VkDeviceOrHostAddressConstKHR(alloc, rootType, &from->data,
+                                           (VkDeviceOrHostAddressConstKHR*)(&to->data));
 }
 
 void deepcopy_VkAccelerationStructureGeometryDataKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAccelerationStructureGeometryDataKHR* from,
-    VkAccelerationStructureGeometryDataKHR* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkAccelerationStructureGeometryDataKHR* from,
+    VkAccelerationStructureGeometryDataKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    deepcopy_VkAccelerationStructureGeometryTrianglesDataKHR(alloc, rootType, &from->triangles, (VkAccelerationStructureGeometryTrianglesDataKHR*)(&to->triangles));
-    deepcopy_VkAccelerationStructureGeometryAabbsDataKHR(alloc, rootType, &from->aabbs, (VkAccelerationStructureGeometryAabbsDataKHR*)(&to->aabbs));
-    deepcopy_VkAccelerationStructureGeometryInstancesDataKHR(alloc, rootType, &from->instances, (VkAccelerationStructureGeometryInstancesDataKHR*)(&to->instances));
+    deepcopy_VkAccelerationStructureGeometryTrianglesDataKHR(
+        alloc, rootType, &from->triangles,
+        (VkAccelerationStructureGeometryTrianglesDataKHR*)(&to->triangles));
+    deepcopy_VkAccelerationStructureGeometryAabbsDataKHR(
+        alloc, rootType, &from->aabbs, (VkAccelerationStructureGeometryAabbsDataKHR*)(&to->aabbs));
+    deepcopy_VkAccelerationStructureGeometryInstancesDataKHR(
+        alloc, rootType, &from->instances,
+        (VkAccelerationStructureGeometryInstancesDataKHR*)(&to->instances));
 }
 
-void deepcopy_VkAccelerationStructureGeometryKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAccelerationStructureGeometryKHR* from,
-    VkAccelerationStructureGeometryKHR* to)
-{
+void deepcopy_VkAccelerationStructureGeometryKHR(Allocator* alloc, VkStructureType rootType,
+                                                 const VkAccelerationStructureGeometryKHR* from,
+                                                 VkAccelerationStructureGeometryKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkAccelerationStructureGeometryDataKHR(alloc, rootType, &from->geometry, (VkAccelerationStructureGeometryDataKHR*)(&to->geometry));
+    deepcopy_VkAccelerationStructureGeometryDataKHR(
+        alloc, rootType, &from->geometry, (VkAccelerationStructureGeometryDataKHR*)(&to->geometry));
 }
 
 void deepcopy_VkAccelerationStructureBuildGeometryInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkAccelerationStructureBuildGeometryInfoKHR* from,
-    VkAccelerationStructureBuildGeometryInfoKHR* to)
-{
+    VkAccelerationStructureBuildGeometryInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pGeometries = nullptr;
-        if (from->pGeometries)
-        {
-            to->pGeometries = (VkAccelerationStructureGeometryKHR*)alloc->alloc(from->geometryCount * sizeof(const VkAccelerationStructureGeometryKHR));
+        if (from->pGeometries) {
+            to->pGeometries = (VkAccelerationStructureGeometryKHR*)alloc->alloc(
+                from->geometryCount * sizeof(const VkAccelerationStructureGeometryKHR));
             to->geometryCount = from->geometryCount;
-            for (uint32_t i = 0; i < (uint32_t)from->geometryCount; ++i)
-            {
-                deepcopy_VkAccelerationStructureGeometryKHR(alloc, rootType, from->pGeometries + i, (VkAccelerationStructureGeometryKHR*)(to->pGeometries + i));
+            for (uint32_t i = 0; i < (uint32_t)from->geometryCount; ++i) {
+                deepcopy_VkAccelerationStructureGeometryKHR(
+                    alloc, rootType, from->pGeometries + i,
+                    (VkAccelerationStructureGeometryKHR*)(to->pGeometries + i));
             }
         }
     }
-    deepcopy_VkDeviceOrHostAddressKHR(alloc, rootType, &from->scratchData, (VkDeviceOrHostAddressKHR*)(&to->scratchData));
+    deepcopy_VkDeviceOrHostAddressKHR(alloc, rootType, &from->scratchData,
+                                      (VkDeviceOrHostAddressKHR*)(&to->scratchData));
 }
 
-void deepcopy_VkAccelerationStructureCreateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAccelerationStructureCreateInfoKHR* from,
-    VkAccelerationStructureCreateInfoKHR* to)
-{
+void deepcopy_VkAccelerationStructureCreateInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                                   const VkAccelerationStructureCreateInfoKHR* from,
+                                                   VkAccelerationStructureCreateInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkWriteDescriptorSetAccelerationStructureKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkWriteDescriptorSetAccelerationStructureKHR* from,
-    VkWriteDescriptorSetAccelerationStructureKHR* to)
-{
+    VkWriteDescriptorSetAccelerationStructureKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pAccelerationStructures = nullptr;
-    if (from->pAccelerationStructures)
-    {
-        to->pAccelerationStructures = (VkAccelerationStructureKHR*)alloc->dupArray(from->pAccelerationStructures, from->accelerationStructureCount * sizeof(const VkAccelerationStructureKHR));
+    if (from->pAccelerationStructures) {
+        to->pAccelerationStructures = (VkAccelerationStructureKHR*)alloc->dupArray(
+            from->pAccelerationStructures,
+            from->accelerationStructureCount * sizeof(const VkAccelerationStructureKHR));
     }
 }
 
 void deepcopy_VkPhysicalDeviceAccelerationStructureFeaturesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceAccelerationStructureFeaturesKHR* from,
-    VkPhysicalDeviceAccelerationStructureFeaturesKHR* to)
-{
+    VkPhysicalDeviceAccelerationStructureFeaturesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceAccelerationStructurePropertiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceAccelerationStructurePropertiesKHR* from,
-    VkPhysicalDeviceAccelerationStructurePropertiesKHR* to)
-{
+    VkPhysicalDeviceAccelerationStructurePropertiesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkAccelerationStructureDeviceAddressInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkAccelerationStructureDeviceAddressInfoKHR* from,
-    VkAccelerationStructureDeviceAddressInfoKHR* to)
-{
+    VkAccelerationStructureDeviceAddressInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkAccelerationStructureVersionInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAccelerationStructureVersionInfoKHR* from,
-    VkAccelerationStructureVersionInfoKHR* to)
-{
+    Allocator* alloc, VkStructureType rootType, const VkAccelerationStructureVersionInfoKHR* from,
+    VkAccelerationStructureVersionInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pVersionData = nullptr;
-    if (from->pVersionData)
-    {
-        to->pVersionData = (uint8_t*)alloc->dupArray(from->pVersionData, 2*VK_UUID_SIZE * sizeof(const uint8_t));
+    if (from->pVersionData) {
+        to->pVersionData =
+            (uint8_t*)alloc->dupArray(from->pVersionData, 2 * VK_UUID_SIZE * sizeof(const uint8_t));
     }
 }
 
 void deepcopy_VkCopyAccelerationStructureToMemoryInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkCopyAccelerationStructureToMemoryInfoKHR* from,
-    VkCopyAccelerationStructureToMemoryInfoKHR* to)
-{
+    VkCopyAccelerationStructureToMemoryInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkDeviceOrHostAddressKHR(alloc, rootType, &from->dst, (VkDeviceOrHostAddressKHR*)(&to->dst));
+    deepcopy_VkDeviceOrHostAddressKHR(alloc, rootType, &from->dst,
+                                      (VkDeviceOrHostAddressKHR*)(&to->dst));
 }
 
 void deepcopy_VkCopyMemoryToAccelerationStructureInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkCopyMemoryToAccelerationStructureInfoKHR* from,
-    VkCopyMemoryToAccelerationStructureInfoKHR* to)
-{
+    VkCopyMemoryToAccelerationStructureInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    deepcopy_VkDeviceOrHostAddressConstKHR(alloc, rootType, &from->src, (VkDeviceOrHostAddressConstKHR*)(&to->src));
+    deepcopy_VkDeviceOrHostAddressConstKHR(alloc, rootType, &from->src,
+                                           (VkDeviceOrHostAddressConstKHR*)(&to->src));
 }
 
-void deepcopy_VkCopyAccelerationStructureInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCopyAccelerationStructureInfoKHR* from,
-    VkCopyAccelerationStructureInfoKHR* to)
-{
+void deepcopy_VkCopyAccelerationStructureInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                                 const VkCopyAccelerationStructureInfoKHR* from,
+                                                 VkCopyAccelerationStructureInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkAccelerationStructureBuildSizesInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkAccelerationStructureBuildSizesInfoKHR* from,
-    VkAccelerationStructureBuildSizesInfoKHR* to)
-{
+    VkAccelerationStructureBuildSizesInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
@@ -21443,212 +17658,185 @@
 
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
-void deepcopy_VkRayTracingShaderGroupCreateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkRayTracingShaderGroupCreateInfoKHR* from,
-    VkRayTracingShaderGroupCreateInfoKHR* to)
-{
+void deepcopy_VkRayTracingShaderGroupCreateInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                                   const VkRayTracingShaderGroupCreateInfoKHR* from,
+                                                   VkRayTracingShaderGroupCreateInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
     to->pShaderGroupCaptureReplayHandle = nullptr;
-    if (from->pShaderGroupCaptureReplayHandle)
-    {
-        to->pShaderGroupCaptureReplayHandle = (void*)alloc->dupArray(from->pShaderGroupCaptureReplayHandle, sizeof(const uint8_t));
+    if (from->pShaderGroupCaptureReplayHandle) {
+        to->pShaderGroupCaptureReplayHandle =
+            (void*)alloc->dupArray(from->pShaderGroupCaptureReplayHandle, sizeof(const uint8_t));
     }
 }
 
 void deepcopy_VkRayTracingPipelineInterfaceCreateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkRayTracingPipelineInterfaceCreateInfoKHR* from,
-    VkRayTracingPipelineInterfaceCreateInfoKHR* to)
-{
+    VkRayTracingPipelineInterfaceCreateInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkRayTracingPipelineCreateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkRayTracingPipelineCreateInfoKHR* from,
-    VkRayTracingPipelineCreateInfoKHR* to)
-{
+void deepcopy_VkRayTracingPipelineCreateInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                                const VkRayTracingPipelineCreateInfoKHR* from,
+                                                VkRayTracingPipelineCreateInfoKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
-    if (from)
-    {
+    if (from) {
         to->pStages = nullptr;
-        if (from->pStages)
-        {
-            to->pStages = (VkPipelineShaderStageCreateInfo*)alloc->alloc(from->stageCount * sizeof(const VkPipelineShaderStageCreateInfo));
+        if (from->pStages) {
+            to->pStages = (VkPipelineShaderStageCreateInfo*)alloc->alloc(
+                from->stageCount * sizeof(const VkPipelineShaderStageCreateInfo));
             to->stageCount = from->stageCount;
-            for (uint32_t i = 0; i < (uint32_t)from->stageCount; ++i)
-            {
-                deepcopy_VkPipelineShaderStageCreateInfo(alloc, rootType, from->pStages + i, (VkPipelineShaderStageCreateInfo*)(to->pStages + i));
+            for (uint32_t i = 0; i < (uint32_t)from->stageCount; ++i) {
+                deepcopy_VkPipelineShaderStageCreateInfo(
+                    alloc, rootType, from->pStages + i,
+                    (VkPipelineShaderStageCreateInfo*)(to->pStages + i));
             }
         }
     }
-    if (from)
-    {
+    if (from) {
         to->pGroups = nullptr;
-        if (from->pGroups)
-        {
-            to->pGroups = (VkRayTracingShaderGroupCreateInfoKHR*)alloc->alloc(from->groupCount * sizeof(const VkRayTracingShaderGroupCreateInfoKHR));
+        if (from->pGroups) {
+            to->pGroups = (VkRayTracingShaderGroupCreateInfoKHR*)alloc->alloc(
+                from->groupCount * sizeof(const VkRayTracingShaderGroupCreateInfoKHR));
             to->groupCount = from->groupCount;
-            for (uint32_t i = 0; i < (uint32_t)from->groupCount; ++i)
-            {
-                deepcopy_VkRayTracingShaderGroupCreateInfoKHR(alloc, rootType, from->pGroups + i, (VkRayTracingShaderGroupCreateInfoKHR*)(to->pGroups + i));
+            for (uint32_t i = 0; i < (uint32_t)from->groupCount; ++i) {
+                deepcopy_VkRayTracingShaderGroupCreateInfoKHR(
+                    alloc, rootType, from->pGroups + i,
+                    (VkRayTracingShaderGroupCreateInfoKHR*)(to->pGroups + i));
             }
         }
     }
     to->pLibraryInfo = nullptr;
-    if (from->pLibraryInfo)
-    {
-        to->pLibraryInfo = (VkPipelineLibraryCreateInfoKHR*)alloc->alloc(sizeof(const VkPipelineLibraryCreateInfoKHR));
-        deepcopy_VkPipelineLibraryCreateInfoKHR(alloc, rootType, from->pLibraryInfo, (VkPipelineLibraryCreateInfoKHR*)(to->pLibraryInfo));
+    if (from->pLibraryInfo) {
+        to->pLibraryInfo = (VkPipelineLibraryCreateInfoKHR*)alloc->alloc(
+            sizeof(const VkPipelineLibraryCreateInfoKHR));
+        deepcopy_VkPipelineLibraryCreateInfoKHR(
+            alloc, rootType, from->pLibraryInfo,
+            (VkPipelineLibraryCreateInfoKHR*)(to->pLibraryInfo));
     }
     to->pLibraryInterface = nullptr;
-    if (from->pLibraryInterface)
-    {
-        to->pLibraryInterface = (VkRayTracingPipelineInterfaceCreateInfoKHR*)alloc->alloc(sizeof(const VkRayTracingPipelineInterfaceCreateInfoKHR));
-        deepcopy_VkRayTracingPipelineInterfaceCreateInfoKHR(alloc, rootType, from->pLibraryInterface, (VkRayTracingPipelineInterfaceCreateInfoKHR*)(to->pLibraryInterface));
+    if (from->pLibraryInterface) {
+        to->pLibraryInterface = (VkRayTracingPipelineInterfaceCreateInfoKHR*)alloc->alloc(
+            sizeof(const VkRayTracingPipelineInterfaceCreateInfoKHR));
+        deepcopy_VkRayTracingPipelineInterfaceCreateInfoKHR(
+            alloc, rootType, from->pLibraryInterface,
+            (VkRayTracingPipelineInterfaceCreateInfoKHR*)(to->pLibraryInterface));
     }
     to->pDynamicState = nullptr;
-    if (from->pDynamicState)
-    {
-        to->pDynamicState = (VkPipelineDynamicStateCreateInfo*)alloc->alloc(sizeof(const VkPipelineDynamicStateCreateInfo));
-        deepcopy_VkPipelineDynamicStateCreateInfo(alloc, rootType, from->pDynamicState, (VkPipelineDynamicStateCreateInfo*)(to->pDynamicState));
+    if (from->pDynamicState) {
+        to->pDynamicState = (VkPipelineDynamicStateCreateInfo*)alloc->alloc(
+            sizeof(const VkPipelineDynamicStateCreateInfo));
+        deepcopy_VkPipelineDynamicStateCreateInfo(
+            alloc, rootType, from->pDynamicState,
+            (VkPipelineDynamicStateCreateInfo*)(to->pDynamicState));
     }
 }
 
 void deepcopy_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceRayTracingPipelineFeaturesKHR* from,
-    VkPhysicalDeviceRayTracingPipelineFeaturesKHR* to)
-{
+    VkPhysicalDeviceRayTracingPipelineFeaturesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 void deepcopy_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceRayTracingPipelinePropertiesKHR* from,
-    VkPhysicalDeviceRayTracingPipelinePropertiesKHR* to)
-{
+    VkPhysicalDeviceRayTracingPipelinePropertiesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
-void deepcopy_VkStridedDeviceAddressRegionKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkStridedDeviceAddressRegionKHR* from,
-    VkStridedDeviceAddressRegionKHR* to)
-{
+void deepcopy_VkStridedDeviceAddressRegionKHR(Allocator* alloc, VkStructureType rootType,
+                                              const VkStridedDeviceAddressRegionKHR* from,
+                                              VkStridedDeviceAddressRegionKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
 }
 
-void deepcopy_VkTraceRaysIndirectCommandKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkTraceRaysIndirectCommandKHR* from,
-    VkTraceRaysIndirectCommandKHR* to)
-{
+void deepcopy_VkTraceRaysIndirectCommandKHR(Allocator* alloc, VkStructureType rootType,
+                                            const VkTraceRaysIndirectCommandKHR* from,
+                                            VkTraceRaysIndirectCommandKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
@@ -21656,1568 +17844,2269 @@
 
 #endif
 #ifdef VK_KHR_ray_query
-void deepcopy_VkPhysicalDeviceRayQueryFeaturesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceRayQueryFeaturesKHR* from,
-    VkPhysicalDeviceRayQueryFeaturesKHR* to)
-{
+void deepcopy_VkPhysicalDeviceRayQueryFeaturesKHR(Allocator* alloc, VkStructureType rootType,
+                                                  const VkPhysicalDeviceRayQueryFeaturesKHR* from,
+                                                  VkPhysicalDeviceRayQueryFeaturesKHR* to) {
     (void)alloc;
     (void)rootType;
     *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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)
-    {
+    if (pNext_size) {
         to->pNext = (void*)alloc->alloc(pNext_size);
         deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
     }
 }
 
 #endif
-void deepcopy_extension_struct(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const void* structExtension,
-    void* structExtension_out)
-{
-    if (!structExtension)
-    {
+void deepcopy_extension_struct(Allocator* alloc, VkStructureType rootType,
+                               const void* structExtension, void* structExtension_out) {
+    if (!structExtension) {
         return;
     }
     uint32_t structType = (uint32_t)goldfish_vk_struct_type(structExtension);
-    switch(structType)
-    {
+    switch (structType) {
 #ifdef VK_VERSION_1_1
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES:
-        {
-            deepcopy_VkPhysicalDeviceSubgroupProperties(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceSubgroupProperties*>(structExtension), reinterpret_cast<VkPhysicalDeviceSubgroupProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES: {
+            deepcopy_VkPhysicalDeviceSubgroupProperties(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceSubgroupProperties*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceSubgroupProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES:
-        {
-            deepcopy_VkPhysicalDevice16BitStorageFeatures(alloc, rootType, reinterpret_cast<const VkPhysicalDevice16BitStorageFeatures*>(structExtension), reinterpret_cast<VkPhysicalDevice16BitStorageFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES: {
+            deepcopy_VkPhysicalDevice16BitStorageFeatures(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDevice16BitStorageFeatures*>(structExtension),
+                reinterpret_cast<VkPhysicalDevice16BitStorageFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS:
-        {
-            deepcopy_VkMemoryDedicatedRequirements(alloc, rootType, reinterpret_cast<const VkMemoryDedicatedRequirements*>(structExtension), reinterpret_cast<VkMemoryDedicatedRequirements*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS: {
+            deepcopy_VkMemoryDedicatedRequirements(
+                alloc, rootType,
+                reinterpret_cast<const VkMemoryDedicatedRequirements*>(structExtension),
+                reinterpret_cast<VkMemoryDedicatedRequirements*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO:
-        {
-            deepcopy_VkMemoryDedicatedAllocateInfo(alloc, rootType, reinterpret_cast<const VkMemoryDedicatedAllocateInfo*>(structExtension), reinterpret_cast<VkMemoryDedicatedAllocateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO: {
+            deepcopy_VkMemoryDedicatedAllocateInfo(
+                alloc, rootType,
+                reinterpret_cast<const VkMemoryDedicatedAllocateInfo*>(structExtension),
+                reinterpret_cast<VkMemoryDedicatedAllocateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO:
-        {
-            deepcopy_VkMemoryAllocateFlagsInfo(alloc, rootType, reinterpret_cast<const VkMemoryAllocateFlagsInfo*>(structExtension), reinterpret_cast<VkMemoryAllocateFlagsInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO: {
+            deepcopy_VkMemoryAllocateFlagsInfo(
+                alloc, rootType,
+                reinterpret_cast<const VkMemoryAllocateFlagsInfo*>(structExtension),
+                reinterpret_cast<VkMemoryAllocateFlagsInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO:
-        {
-            deepcopy_VkDeviceGroupRenderPassBeginInfo(alloc, rootType, reinterpret_cast<const VkDeviceGroupRenderPassBeginInfo*>(structExtension), reinterpret_cast<VkDeviceGroupRenderPassBeginInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO: {
+            deepcopy_VkDeviceGroupRenderPassBeginInfo(
+                alloc, rootType,
+                reinterpret_cast<const VkDeviceGroupRenderPassBeginInfo*>(structExtension),
+                reinterpret_cast<VkDeviceGroupRenderPassBeginInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO:
-        {
-            deepcopy_VkDeviceGroupCommandBufferBeginInfo(alloc, rootType, reinterpret_cast<const VkDeviceGroupCommandBufferBeginInfo*>(structExtension), reinterpret_cast<VkDeviceGroupCommandBufferBeginInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO: {
+            deepcopy_VkDeviceGroupCommandBufferBeginInfo(
+                alloc, rootType,
+                reinterpret_cast<const VkDeviceGroupCommandBufferBeginInfo*>(structExtension),
+                reinterpret_cast<VkDeviceGroupCommandBufferBeginInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO:
-        {
-            deepcopy_VkDeviceGroupSubmitInfo(alloc, rootType, reinterpret_cast<const VkDeviceGroupSubmitInfo*>(structExtension), reinterpret_cast<VkDeviceGroupSubmitInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO: {
+            deepcopy_VkDeviceGroupSubmitInfo(
+                alloc, rootType, reinterpret_cast<const VkDeviceGroupSubmitInfo*>(structExtension),
+                reinterpret_cast<VkDeviceGroupSubmitInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO:
-        {
-            deepcopy_VkDeviceGroupBindSparseInfo(alloc, rootType, reinterpret_cast<const VkDeviceGroupBindSparseInfo*>(structExtension), reinterpret_cast<VkDeviceGroupBindSparseInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO: {
+            deepcopy_VkDeviceGroupBindSparseInfo(
+                alloc, rootType,
+                reinterpret_cast<const VkDeviceGroupBindSparseInfo*>(structExtension),
+                reinterpret_cast<VkDeviceGroupBindSparseInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO:
-        {
-            deepcopy_VkBindBufferMemoryDeviceGroupInfo(alloc, rootType, reinterpret_cast<const VkBindBufferMemoryDeviceGroupInfo*>(structExtension), reinterpret_cast<VkBindBufferMemoryDeviceGroupInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO: {
+            deepcopy_VkBindBufferMemoryDeviceGroupInfo(
+                alloc, rootType,
+                reinterpret_cast<const VkBindBufferMemoryDeviceGroupInfo*>(structExtension),
+                reinterpret_cast<VkBindBufferMemoryDeviceGroupInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO:
-        {
-            deepcopy_VkBindImageMemoryDeviceGroupInfo(alloc, rootType, reinterpret_cast<const VkBindImageMemoryDeviceGroupInfo*>(structExtension), reinterpret_cast<VkBindImageMemoryDeviceGroupInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO: {
+            deepcopy_VkBindImageMemoryDeviceGroupInfo(
+                alloc, rootType,
+                reinterpret_cast<const VkBindImageMemoryDeviceGroupInfo*>(structExtension),
+                reinterpret_cast<VkBindImageMemoryDeviceGroupInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO:
-        {
-            deepcopy_VkDeviceGroupDeviceCreateInfo(alloc, rootType, reinterpret_cast<const VkDeviceGroupDeviceCreateInfo*>(structExtension), reinterpret_cast<VkDeviceGroupDeviceCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO: {
+            deepcopy_VkDeviceGroupDeviceCreateInfo(
+                alloc, rootType,
+                reinterpret_cast<const VkDeviceGroupDeviceCreateInfo*>(structExtension),
+                reinterpret_cast<VkDeviceGroupDeviceCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2:
-        {
-            deepcopy_VkPhysicalDeviceFeatures2(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceFeatures2*>(structExtension), reinterpret_cast<VkPhysicalDeviceFeatures2*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2: {
+            deepcopy_VkPhysicalDeviceFeatures2(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceFeatures2*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceFeatures2*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES:
-        {
-            deepcopy_VkPhysicalDevicePointClippingProperties(alloc, rootType, reinterpret_cast<const VkPhysicalDevicePointClippingProperties*>(structExtension), reinterpret_cast<VkPhysicalDevicePointClippingProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES: {
+            deepcopy_VkPhysicalDevicePointClippingProperties(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDevicePointClippingProperties*>(structExtension),
+                reinterpret_cast<VkPhysicalDevicePointClippingProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO:
-        {
-            deepcopy_VkRenderPassInputAttachmentAspectCreateInfo(alloc, rootType, reinterpret_cast<const VkRenderPassInputAttachmentAspectCreateInfo*>(structExtension), reinterpret_cast<VkRenderPassInputAttachmentAspectCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO: {
+            deepcopy_VkRenderPassInputAttachmentAspectCreateInfo(
+                alloc, rootType,
+                reinterpret_cast<const VkRenderPassInputAttachmentAspectCreateInfo*>(
+                    structExtension),
+                reinterpret_cast<VkRenderPassInputAttachmentAspectCreateInfo*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO:
-        {
-            deepcopy_VkImageViewUsageCreateInfo(alloc, rootType, reinterpret_cast<const VkImageViewUsageCreateInfo*>(structExtension), reinterpret_cast<VkImageViewUsageCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO: {
+            deepcopy_VkImageViewUsageCreateInfo(
+                alloc, rootType,
+                reinterpret_cast<const VkImageViewUsageCreateInfo*>(structExtension),
+                reinterpret_cast<VkImageViewUsageCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO:
-        {
-            deepcopy_VkPipelineTessellationDomainOriginStateCreateInfo(alloc, rootType, reinterpret_cast<const VkPipelineTessellationDomainOriginStateCreateInfo*>(structExtension), reinterpret_cast<VkPipelineTessellationDomainOriginStateCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO: {
+            deepcopy_VkPipelineTessellationDomainOriginStateCreateInfo(
+                alloc, rootType,
+                reinterpret_cast<const VkPipelineTessellationDomainOriginStateCreateInfo*>(
+                    structExtension),
+                reinterpret_cast<VkPipelineTessellationDomainOriginStateCreateInfo*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO:
-        {
-            deepcopy_VkRenderPassMultiviewCreateInfo(alloc, rootType, reinterpret_cast<const VkRenderPassMultiviewCreateInfo*>(structExtension), reinterpret_cast<VkRenderPassMultiviewCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO: {
+            deepcopy_VkRenderPassMultiviewCreateInfo(
+                alloc, rootType,
+                reinterpret_cast<const VkRenderPassMultiviewCreateInfo*>(structExtension),
+                reinterpret_cast<VkRenderPassMultiviewCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES:
-        {
-            deepcopy_VkPhysicalDeviceMultiviewFeatures(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceMultiviewFeatures*>(structExtension), reinterpret_cast<VkPhysicalDeviceMultiviewFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES: {
+            deepcopy_VkPhysicalDeviceMultiviewFeatures(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceMultiviewFeatures*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceMultiviewFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES:
-        {
-            deepcopy_VkPhysicalDeviceMultiviewProperties(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceMultiviewProperties*>(structExtension), reinterpret_cast<VkPhysicalDeviceMultiviewProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES: {
+            deepcopy_VkPhysicalDeviceMultiviewProperties(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceMultiviewProperties*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceMultiviewProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES:
-        {
-            deepcopy_VkPhysicalDeviceVariablePointersFeatures(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceVariablePointersFeatures*>(structExtension), reinterpret_cast<VkPhysicalDeviceVariablePointersFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES: {
+            deepcopy_VkPhysicalDeviceVariablePointersFeatures(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceVariablePointersFeatures*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceVariablePointersFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES:
-        {
-            deepcopy_VkPhysicalDeviceProtectedMemoryFeatures(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceProtectedMemoryFeatures*>(structExtension), reinterpret_cast<VkPhysicalDeviceProtectedMemoryFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES: {
+            deepcopy_VkPhysicalDeviceProtectedMemoryFeatures(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceProtectedMemoryFeatures*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceProtectedMemoryFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES:
-        {
-            deepcopy_VkPhysicalDeviceProtectedMemoryProperties(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceProtectedMemoryProperties*>(structExtension), reinterpret_cast<VkPhysicalDeviceProtectedMemoryProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES: {
+            deepcopy_VkPhysicalDeviceProtectedMemoryProperties(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceProtectedMemoryProperties*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceProtectedMemoryProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO:
-        {
-            deepcopy_VkProtectedSubmitInfo(alloc, rootType, reinterpret_cast<const VkProtectedSubmitInfo*>(structExtension), reinterpret_cast<VkProtectedSubmitInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO: {
+            deepcopy_VkProtectedSubmitInfo(
+                alloc, rootType, reinterpret_cast<const VkProtectedSubmitInfo*>(structExtension),
+                reinterpret_cast<VkProtectedSubmitInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO:
-        {
-            deepcopy_VkSamplerYcbcrConversionInfo(alloc, rootType, reinterpret_cast<const VkSamplerYcbcrConversionInfo*>(structExtension), reinterpret_cast<VkSamplerYcbcrConversionInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO: {
+            deepcopy_VkSamplerYcbcrConversionInfo(
+                alloc, rootType,
+                reinterpret_cast<const VkSamplerYcbcrConversionInfo*>(structExtension),
+                reinterpret_cast<VkSamplerYcbcrConversionInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO:
-        {
-            deepcopy_VkBindImagePlaneMemoryInfo(alloc, rootType, reinterpret_cast<const VkBindImagePlaneMemoryInfo*>(structExtension), reinterpret_cast<VkBindImagePlaneMemoryInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO: {
+            deepcopy_VkBindImagePlaneMemoryInfo(
+                alloc, rootType,
+                reinterpret_cast<const VkBindImagePlaneMemoryInfo*>(structExtension),
+                reinterpret_cast<VkBindImagePlaneMemoryInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO:
-        {
-            deepcopy_VkImagePlaneMemoryRequirementsInfo(alloc, rootType, reinterpret_cast<const VkImagePlaneMemoryRequirementsInfo*>(structExtension), reinterpret_cast<VkImagePlaneMemoryRequirementsInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO: {
+            deepcopy_VkImagePlaneMemoryRequirementsInfo(
+                alloc, rootType,
+                reinterpret_cast<const VkImagePlaneMemoryRequirementsInfo*>(structExtension),
+                reinterpret_cast<VkImagePlaneMemoryRequirementsInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES:
-        {
-            deepcopy_VkPhysicalDeviceSamplerYcbcrConversionFeatures(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(structExtension), reinterpret_cast<VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES: {
+            deepcopy_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES:
-        {
-            deepcopy_VkSamplerYcbcrConversionImageFormatProperties(alloc, rootType, reinterpret_cast<const VkSamplerYcbcrConversionImageFormatProperties*>(structExtension), reinterpret_cast<VkSamplerYcbcrConversionImageFormatProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES: {
+            deepcopy_VkSamplerYcbcrConversionImageFormatProperties(
+                alloc, rootType,
+                reinterpret_cast<const VkSamplerYcbcrConversionImageFormatProperties*>(
+                    structExtension),
+                reinterpret_cast<VkSamplerYcbcrConversionImageFormatProperties*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO:
-        {
-            deepcopy_VkPhysicalDeviceExternalImageFormatInfo(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceExternalImageFormatInfo*>(structExtension), reinterpret_cast<VkPhysicalDeviceExternalImageFormatInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO: {
+            deepcopy_VkPhysicalDeviceExternalImageFormatInfo(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceExternalImageFormatInfo*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceExternalImageFormatInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES:
-        {
-            deepcopy_VkExternalImageFormatProperties(alloc, rootType, reinterpret_cast<const VkExternalImageFormatProperties*>(structExtension), reinterpret_cast<VkExternalImageFormatProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES: {
+            deepcopy_VkExternalImageFormatProperties(
+                alloc, rootType,
+                reinterpret_cast<const VkExternalImageFormatProperties*>(structExtension),
+                reinterpret_cast<VkExternalImageFormatProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES:
-        {
-            deepcopy_VkPhysicalDeviceIDProperties(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceIDProperties*>(structExtension), reinterpret_cast<VkPhysicalDeviceIDProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES: {
+            deepcopy_VkPhysicalDeviceIDProperties(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceIDProperties*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceIDProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO:
-        {
-            deepcopy_VkExternalMemoryImageCreateInfo(alloc, rootType, reinterpret_cast<const VkExternalMemoryImageCreateInfo*>(structExtension), reinterpret_cast<VkExternalMemoryImageCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO: {
+            deepcopy_VkExternalMemoryImageCreateInfo(
+                alloc, rootType,
+                reinterpret_cast<const VkExternalMemoryImageCreateInfo*>(structExtension),
+                reinterpret_cast<VkExternalMemoryImageCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO:
-        {
-            deepcopy_VkExternalMemoryBufferCreateInfo(alloc, rootType, reinterpret_cast<const VkExternalMemoryBufferCreateInfo*>(structExtension), reinterpret_cast<VkExternalMemoryBufferCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO: {
+            deepcopy_VkExternalMemoryBufferCreateInfo(
+                alloc, rootType,
+                reinterpret_cast<const VkExternalMemoryBufferCreateInfo*>(structExtension),
+                reinterpret_cast<VkExternalMemoryBufferCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO:
-        {
-            deepcopy_VkExportMemoryAllocateInfo(alloc, rootType, reinterpret_cast<const VkExportMemoryAllocateInfo*>(structExtension), reinterpret_cast<VkExportMemoryAllocateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO: {
+            deepcopy_VkExportMemoryAllocateInfo(
+                alloc, rootType,
+                reinterpret_cast<const VkExportMemoryAllocateInfo*>(structExtension),
+                reinterpret_cast<VkExportMemoryAllocateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO:
-        {
-            deepcopy_VkExportFenceCreateInfo(alloc, rootType, reinterpret_cast<const VkExportFenceCreateInfo*>(structExtension), reinterpret_cast<VkExportFenceCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO: {
+            deepcopy_VkExportFenceCreateInfo(
+                alloc, rootType, reinterpret_cast<const VkExportFenceCreateInfo*>(structExtension),
+                reinterpret_cast<VkExportFenceCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO:
-        {
-            deepcopy_VkExportSemaphoreCreateInfo(alloc, rootType, reinterpret_cast<const VkExportSemaphoreCreateInfo*>(structExtension), reinterpret_cast<VkExportSemaphoreCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO: {
+            deepcopy_VkExportSemaphoreCreateInfo(
+                alloc, rootType,
+                reinterpret_cast<const VkExportSemaphoreCreateInfo*>(structExtension),
+                reinterpret_cast<VkExportSemaphoreCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES:
-        {
-            deepcopy_VkPhysicalDeviceMaintenance3Properties(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceMaintenance3Properties*>(structExtension), reinterpret_cast<VkPhysicalDeviceMaintenance3Properties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES: {
+            deepcopy_VkPhysicalDeviceMaintenance3Properties(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceMaintenance3Properties*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceMaintenance3Properties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES:
-        {
-            deepcopy_VkPhysicalDeviceShaderDrawParametersFeatures(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceShaderDrawParametersFeatures*>(structExtension), reinterpret_cast<VkPhysicalDeviceShaderDrawParametersFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES: {
+            deepcopy_VkPhysicalDeviceShaderDrawParametersFeatures(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShaderDrawParametersFeatures*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceShaderDrawParametersFeatures*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_VERSION_1_2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES:
-        {
-            deepcopy_VkPhysicalDeviceVulkan11Features(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceVulkan11Features*>(structExtension), reinterpret_cast<VkPhysicalDeviceVulkan11Features*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: {
+            deepcopy_VkPhysicalDeviceVulkan11Features(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceVulkan11Features*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceVulkan11Features*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES:
-        {
-            deepcopy_VkPhysicalDeviceVulkan11Properties(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceVulkan11Properties*>(structExtension), reinterpret_cast<VkPhysicalDeviceVulkan11Properties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: {
+            deepcopy_VkPhysicalDeviceVulkan11Properties(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceVulkan11Properties*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceVulkan11Properties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES:
-        {
-            deepcopy_VkPhysicalDeviceVulkan12Features(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceVulkan12Features*>(structExtension), reinterpret_cast<VkPhysicalDeviceVulkan12Features*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: {
+            deepcopy_VkPhysicalDeviceVulkan12Features(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceVulkan12Features*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceVulkan12Features*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES:
-        {
-            deepcopy_VkPhysicalDeviceVulkan12Properties(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceVulkan12Properties*>(structExtension), reinterpret_cast<VkPhysicalDeviceVulkan12Properties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: {
+            deepcopy_VkPhysicalDeviceVulkan12Properties(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceVulkan12Properties*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceVulkan12Properties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO:
-        {
-            deepcopy_VkImageFormatListCreateInfo(alloc, rootType, reinterpret_cast<const VkImageFormatListCreateInfo*>(structExtension), reinterpret_cast<VkImageFormatListCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO: {
+            deepcopy_VkImageFormatListCreateInfo(
+                alloc, rootType,
+                reinterpret_cast<const VkImageFormatListCreateInfo*>(structExtension),
+                reinterpret_cast<VkImageFormatListCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES:
-        {
-            deepcopy_VkPhysicalDevice8BitStorageFeatures(alloc, rootType, reinterpret_cast<const VkPhysicalDevice8BitStorageFeatures*>(structExtension), reinterpret_cast<VkPhysicalDevice8BitStorageFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES: {
+            deepcopy_VkPhysicalDevice8BitStorageFeatures(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDevice8BitStorageFeatures*>(structExtension),
+                reinterpret_cast<VkPhysicalDevice8BitStorageFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES:
-        {
-            deepcopy_VkPhysicalDeviceDriverProperties(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceDriverProperties*>(structExtension), reinterpret_cast<VkPhysicalDeviceDriverProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES: {
+            deepcopy_VkPhysicalDeviceDriverProperties(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceDriverProperties*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceDriverProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES:
-        {
-            deepcopy_VkPhysicalDeviceShaderAtomicInt64Features(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceShaderAtomicInt64Features*>(structExtension), reinterpret_cast<VkPhysicalDeviceShaderAtomicInt64Features*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES: {
+            deepcopy_VkPhysicalDeviceShaderAtomicInt64Features(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShaderAtomicInt64Features*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceShaderAtomicInt64Features*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES:
-        {
-            deepcopy_VkPhysicalDeviceShaderFloat16Int8Features(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceShaderFloat16Int8Features*>(structExtension), reinterpret_cast<VkPhysicalDeviceShaderFloat16Int8Features*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES: {
+            deepcopy_VkPhysicalDeviceShaderFloat16Int8Features(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShaderFloat16Int8Features*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceShaderFloat16Int8Features*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES:
-        {
-            deepcopy_VkPhysicalDeviceFloatControlsProperties(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceFloatControlsProperties*>(structExtension), reinterpret_cast<VkPhysicalDeviceFloatControlsProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES: {
+            deepcopy_VkPhysicalDeviceFloatControlsProperties(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceFloatControlsProperties*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceFloatControlsProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO:
-        {
-            deepcopy_VkDescriptorSetLayoutBindingFlagsCreateInfo(alloc, rootType, reinterpret_cast<const VkDescriptorSetLayoutBindingFlagsCreateInfo*>(structExtension), reinterpret_cast<VkDescriptorSetLayoutBindingFlagsCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO: {
+            deepcopy_VkDescriptorSetLayoutBindingFlagsCreateInfo(
+                alloc, rootType,
+                reinterpret_cast<const VkDescriptorSetLayoutBindingFlagsCreateInfo*>(
+                    structExtension),
+                reinterpret_cast<VkDescriptorSetLayoutBindingFlagsCreateInfo*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES:
-        {
-            deepcopy_VkPhysicalDeviceDescriptorIndexingFeatures(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingFeatures*>(structExtension), reinterpret_cast<VkPhysicalDeviceDescriptorIndexingFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES: {
+            deepcopy_VkPhysicalDeviceDescriptorIndexingFeatures(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingFeatures*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceDescriptorIndexingFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES:
-        {
-            deepcopy_VkPhysicalDeviceDescriptorIndexingProperties(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingProperties*>(structExtension), reinterpret_cast<VkPhysicalDeviceDescriptorIndexingProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES: {
+            deepcopy_VkPhysicalDeviceDescriptorIndexingProperties(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingProperties*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceDescriptorIndexingProperties*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO:
-        {
-            deepcopy_VkDescriptorSetVariableDescriptorCountAllocateInfo(alloc, rootType, reinterpret_cast<const VkDescriptorSetVariableDescriptorCountAllocateInfo*>(structExtension), reinterpret_cast<VkDescriptorSetVariableDescriptorCountAllocateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO: {
+            deepcopy_VkDescriptorSetVariableDescriptorCountAllocateInfo(
+                alloc, rootType,
+                reinterpret_cast<const VkDescriptorSetVariableDescriptorCountAllocateInfo*>(
+                    structExtension),
+                reinterpret_cast<VkDescriptorSetVariableDescriptorCountAllocateInfo*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT:
-        {
-            deepcopy_VkDescriptorSetVariableDescriptorCountLayoutSupport(alloc, rootType, reinterpret_cast<const VkDescriptorSetVariableDescriptorCountLayoutSupport*>(structExtension), reinterpret_cast<VkDescriptorSetVariableDescriptorCountLayoutSupport*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT: {
+            deepcopy_VkDescriptorSetVariableDescriptorCountLayoutSupport(
+                alloc, rootType,
+                reinterpret_cast<const VkDescriptorSetVariableDescriptorCountLayoutSupport*>(
+                    structExtension),
+                reinterpret_cast<VkDescriptorSetVariableDescriptorCountLayoutSupport*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE:
-        {
-            deepcopy_VkSubpassDescriptionDepthStencilResolve(alloc, rootType, reinterpret_cast<const VkSubpassDescriptionDepthStencilResolve*>(structExtension), reinterpret_cast<VkSubpassDescriptionDepthStencilResolve*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE: {
+            deepcopy_VkSubpassDescriptionDepthStencilResolve(
+                alloc, rootType,
+                reinterpret_cast<const VkSubpassDescriptionDepthStencilResolve*>(structExtension),
+                reinterpret_cast<VkSubpassDescriptionDepthStencilResolve*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES:
-        {
-            deepcopy_VkPhysicalDeviceDepthStencilResolveProperties(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceDepthStencilResolveProperties*>(structExtension), reinterpret_cast<VkPhysicalDeviceDepthStencilResolveProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES: {
+            deepcopy_VkPhysicalDeviceDepthStencilResolveProperties(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceDepthStencilResolveProperties*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceDepthStencilResolveProperties*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES:
-        {
-            deepcopy_VkPhysicalDeviceScalarBlockLayoutFeatures(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceScalarBlockLayoutFeatures*>(structExtension), reinterpret_cast<VkPhysicalDeviceScalarBlockLayoutFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES: {
+            deepcopy_VkPhysicalDeviceScalarBlockLayoutFeatures(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceScalarBlockLayoutFeatures*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceScalarBlockLayoutFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO:
-        {
-            deepcopy_VkImageStencilUsageCreateInfo(alloc, rootType, reinterpret_cast<const VkImageStencilUsageCreateInfo*>(structExtension), reinterpret_cast<VkImageStencilUsageCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO: {
+            deepcopy_VkImageStencilUsageCreateInfo(
+                alloc, rootType,
+                reinterpret_cast<const VkImageStencilUsageCreateInfo*>(structExtension),
+                reinterpret_cast<VkImageStencilUsageCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO:
-        {
-            deepcopy_VkSamplerReductionModeCreateInfo(alloc, rootType, reinterpret_cast<const VkSamplerReductionModeCreateInfo*>(structExtension), reinterpret_cast<VkSamplerReductionModeCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO: {
+            deepcopy_VkSamplerReductionModeCreateInfo(
+                alloc, rootType,
+                reinterpret_cast<const VkSamplerReductionModeCreateInfo*>(structExtension),
+                reinterpret_cast<VkSamplerReductionModeCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES:
-        {
-            deepcopy_VkPhysicalDeviceSamplerFilterMinmaxProperties(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceSamplerFilterMinmaxProperties*>(structExtension), reinterpret_cast<VkPhysicalDeviceSamplerFilterMinmaxProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES: {
+            deepcopy_VkPhysicalDeviceSamplerFilterMinmaxProperties(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceSamplerFilterMinmaxProperties*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceSamplerFilterMinmaxProperties*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES:
-        {
-            deepcopy_VkPhysicalDeviceVulkanMemoryModelFeatures(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceVulkanMemoryModelFeatures*>(structExtension), reinterpret_cast<VkPhysicalDeviceVulkanMemoryModelFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES: {
+            deepcopy_VkPhysicalDeviceVulkanMemoryModelFeatures(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceVulkanMemoryModelFeatures*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceVulkanMemoryModelFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES:
-        {
-            deepcopy_VkPhysicalDeviceImagelessFramebufferFeatures(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceImagelessFramebufferFeatures*>(structExtension), reinterpret_cast<VkPhysicalDeviceImagelessFramebufferFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES: {
+            deepcopy_VkPhysicalDeviceImagelessFramebufferFeatures(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceImagelessFramebufferFeatures*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceImagelessFramebufferFeatures*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO:
-        {
-            deepcopy_VkFramebufferAttachmentsCreateInfo(alloc, rootType, reinterpret_cast<const VkFramebufferAttachmentsCreateInfo*>(structExtension), reinterpret_cast<VkFramebufferAttachmentsCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO: {
+            deepcopy_VkFramebufferAttachmentsCreateInfo(
+                alloc, rootType,
+                reinterpret_cast<const VkFramebufferAttachmentsCreateInfo*>(structExtension),
+                reinterpret_cast<VkFramebufferAttachmentsCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO:
-        {
-            deepcopy_VkRenderPassAttachmentBeginInfo(alloc, rootType, reinterpret_cast<const VkRenderPassAttachmentBeginInfo*>(structExtension), reinterpret_cast<VkRenderPassAttachmentBeginInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO: {
+            deepcopy_VkRenderPassAttachmentBeginInfo(
+                alloc, rootType,
+                reinterpret_cast<const VkRenderPassAttachmentBeginInfo*>(structExtension),
+                reinterpret_cast<VkRenderPassAttachmentBeginInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES:
-        {
-            deepcopy_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceUniformBufferStandardLayoutFeatures*>(structExtension), reinterpret_cast<VkPhysicalDeviceUniformBufferStandardLayoutFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES: {
+            deepcopy_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceUniformBufferStandardLayoutFeatures*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceUniformBufferStandardLayoutFeatures*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES:
-        {
-            deepcopy_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures*>(structExtension), reinterpret_cast<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES: {
+            deepcopy_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES:
-        {
-            deepcopy_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures*>(structExtension), reinterpret_cast<VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES: {
+            deepcopy_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT:
-        {
-            deepcopy_VkAttachmentReferenceStencilLayout(alloc, rootType, reinterpret_cast<const VkAttachmentReferenceStencilLayout*>(structExtension), reinterpret_cast<VkAttachmentReferenceStencilLayout*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT: {
+            deepcopy_VkAttachmentReferenceStencilLayout(
+                alloc, rootType,
+                reinterpret_cast<const VkAttachmentReferenceStencilLayout*>(structExtension),
+                reinterpret_cast<VkAttachmentReferenceStencilLayout*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT:
-        {
-            deepcopy_VkAttachmentDescriptionStencilLayout(alloc, rootType, reinterpret_cast<const VkAttachmentDescriptionStencilLayout*>(structExtension), reinterpret_cast<VkAttachmentDescriptionStencilLayout*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT: {
+            deepcopy_VkAttachmentDescriptionStencilLayout(
+                alloc, rootType,
+                reinterpret_cast<const VkAttachmentDescriptionStencilLayout*>(structExtension),
+                reinterpret_cast<VkAttachmentDescriptionStencilLayout*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES:
-        {
-            deepcopy_VkPhysicalDeviceHostQueryResetFeatures(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceHostQueryResetFeatures*>(structExtension), reinterpret_cast<VkPhysicalDeviceHostQueryResetFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES: {
+            deepcopy_VkPhysicalDeviceHostQueryResetFeatures(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceHostQueryResetFeatures*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceHostQueryResetFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES:
-        {
-            deepcopy_VkPhysicalDeviceTimelineSemaphoreFeatures(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceTimelineSemaphoreFeatures*>(structExtension), reinterpret_cast<VkPhysicalDeviceTimelineSemaphoreFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES: {
+            deepcopy_VkPhysicalDeviceTimelineSemaphoreFeatures(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceTimelineSemaphoreFeatures*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceTimelineSemaphoreFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES:
-        {
-            deepcopy_VkPhysicalDeviceTimelineSemaphoreProperties(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceTimelineSemaphoreProperties*>(structExtension), reinterpret_cast<VkPhysicalDeviceTimelineSemaphoreProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES: {
+            deepcopy_VkPhysicalDeviceTimelineSemaphoreProperties(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceTimelineSemaphoreProperties*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceTimelineSemaphoreProperties*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO:
-        {
-            deepcopy_VkSemaphoreTypeCreateInfo(alloc, rootType, reinterpret_cast<const VkSemaphoreTypeCreateInfo*>(structExtension), reinterpret_cast<VkSemaphoreTypeCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO: {
+            deepcopy_VkSemaphoreTypeCreateInfo(
+                alloc, rootType,
+                reinterpret_cast<const VkSemaphoreTypeCreateInfo*>(structExtension),
+                reinterpret_cast<VkSemaphoreTypeCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO:
-        {
-            deepcopy_VkTimelineSemaphoreSubmitInfo(alloc, rootType, reinterpret_cast<const VkTimelineSemaphoreSubmitInfo*>(structExtension), reinterpret_cast<VkTimelineSemaphoreSubmitInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO: {
+            deepcopy_VkTimelineSemaphoreSubmitInfo(
+                alloc, rootType,
+                reinterpret_cast<const VkTimelineSemaphoreSubmitInfo*>(structExtension),
+                reinterpret_cast<VkTimelineSemaphoreSubmitInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES:
-        {
-            deepcopy_VkPhysicalDeviceBufferDeviceAddressFeatures(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceBufferDeviceAddressFeatures*>(structExtension), reinterpret_cast<VkPhysicalDeviceBufferDeviceAddressFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES: {
+            deepcopy_VkPhysicalDeviceBufferDeviceAddressFeatures(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceBufferDeviceAddressFeatures*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceBufferDeviceAddressFeatures*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO:
-        {
-            deepcopy_VkBufferOpaqueCaptureAddressCreateInfo(alloc, rootType, reinterpret_cast<const VkBufferOpaqueCaptureAddressCreateInfo*>(structExtension), reinterpret_cast<VkBufferOpaqueCaptureAddressCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO: {
+            deepcopy_VkBufferOpaqueCaptureAddressCreateInfo(
+                alloc, rootType,
+                reinterpret_cast<const VkBufferOpaqueCaptureAddressCreateInfo*>(structExtension),
+                reinterpret_cast<VkBufferOpaqueCaptureAddressCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO:
-        {
-            deepcopy_VkMemoryOpaqueCaptureAddressAllocateInfo(alloc, rootType, reinterpret_cast<const VkMemoryOpaqueCaptureAddressAllocateInfo*>(structExtension), reinterpret_cast<VkMemoryOpaqueCaptureAddressAllocateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO: {
+            deepcopy_VkMemoryOpaqueCaptureAddressAllocateInfo(
+                alloc, rootType,
+                reinterpret_cast<const VkMemoryOpaqueCaptureAddressAllocateInfo*>(structExtension),
+                reinterpret_cast<VkMemoryOpaqueCaptureAddressAllocateInfo*>(structExtension_out));
             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));
+        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));
+        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));
+        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));
+        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_display_swapchain
-        case VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR:
-        {
-            deepcopy_VkDisplayPresentInfoKHR(alloc, rootType, reinterpret_cast<const VkDisplayPresentInfoKHR*>(structExtension), reinterpret_cast<VkDisplayPresentInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR: {
+            deepcopy_VkDisplayPresentInfoKHR(
+                alloc, rootType, reinterpret_cast<const VkDisplayPresentInfoKHR*>(structExtension),
+                reinterpret_cast<VkDisplayPresentInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_video_queue
-        case VK_STRUCTURE_TYPE_VIDEO_QUEUE_FAMILY_PROPERTIES_2_KHR:
-        {
-            deepcopy_VkVideoQueueFamilyProperties2KHR(alloc, rootType, reinterpret_cast<const VkVideoQueueFamilyProperties2KHR*>(structExtension), reinterpret_cast<VkVideoQueueFamilyProperties2KHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_QUEUE_FAMILY_PROPERTIES_2_KHR: {
+            deepcopy_VkVideoQueueFamilyProperties2KHR(
+                alloc, rootType,
+                reinterpret_cast<const VkVideoQueueFamilyProperties2KHR*>(structExtension),
+                reinterpret_cast<VkVideoQueueFamilyProperties2KHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_PROFILE_KHR:
-        {
-            deepcopy_VkVideoProfileKHR(alloc, rootType, reinterpret_cast<const VkVideoProfileKHR*>(structExtension), reinterpret_cast<VkVideoProfileKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_PROFILE_KHR: {
+            deepcopy_VkVideoProfileKHR(alloc, rootType,
+                                       reinterpret_cast<const VkVideoProfileKHR*>(structExtension),
+                                       reinterpret_cast<VkVideoProfileKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_PROFILES_KHR:
-        {
-            deepcopy_VkVideoProfilesKHR(alloc, rootType, reinterpret_cast<const VkVideoProfilesKHR*>(structExtension), reinterpret_cast<VkVideoProfilesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_PROFILES_KHR: {
+            deepcopy_VkVideoProfilesKHR(
+                alloc, rootType, reinterpret_cast<const VkVideoProfilesKHR*>(structExtension),
+                reinterpret_cast<VkVideoProfilesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_dynamic_rendering
-        case VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR:
-        {
-            deepcopy_VkPipelineRenderingCreateInfoKHR(alloc, rootType, reinterpret_cast<const VkPipelineRenderingCreateInfoKHR*>(structExtension), reinterpret_cast<VkPipelineRenderingCreateInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR: {
+            deepcopy_VkPipelineRenderingCreateInfoKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkPipelineRenderingCreateInfoKHR*>(structExtension),
+                reinterpret_cast<VkPipelineRenderingCreateInfoKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES_KHR:
-        {
-            deepcopy_VkPhysicalDeviceDynamicRenderingFeaturesKHR(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceDynamicRenderingFeaturesKHR*>(structExtension), reinterpret_cast<VkPhysicalDeviceDynamicRenderingFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES_KHR: {
+            deepcopy_VkPhysicalDeviceDynamicRenderingFeaturesKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceDynamicRenderingFeaturesKHR*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceDynamicRenderingFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR:
-        {
-            deepcopy_VkCommandBufferInheritanceRenderingInfoKHR(alloc, rootType, reinterpret_cast<const VkCommandBufferInheritanceRenderingInfoKHR*>(structExtension), reinterpret_cast<VkCommandBufferInheritanceRenderingInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR: {
+            deepcopy_VkCommandBufferInheritanceRenderingInfoKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkCommandBufferInheritanceRenderingInfoKHR*>(
+                    structExtension),
+                reinterpret_cast<VkCommandBufferInheritanceRenderingInfoKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR:
-        {
-            deepcopy_VkRenderingFragmentShadingRateAttachmentInfoKHR(alloc, rootType, reinterpret_cast<const VkRenderingFragmentShadingRateAttachmentInfoKHR*>(structExtension), reinterpret_cast<VkRenderingFragmentShadingRateAttachmentInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR: {
+            deepcopy_VkRenderingFragmentShadingRateAttachmentInfoKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkRenderingFragmentShadingRateAttachmentInfoKHR*>(
+                    structExtension),
+                reinterpret_cast<VkRenderingFragmentShadingRateAttachmentInfoKHR*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_INFO_EXT:
-        {
-            deepcopy_VkRenderingFragmentDensityMapAttachmentInfoEXT(alloc, rootType, reinterpret_cast<const VkRenderingFragmentDensityMapAttachmentInfoEXT*>(structExtension), reinterpret_cast<VkRenderingFragmentDensityMapAttachmentInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_INFO_EXT: {
+            deepcopy_VkRenderingFragmentDensityMapAttachmentInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkRenderingFragmentDensityMapAttachmentInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<VkRenderingFragmentDensityMapAttachmentInfoEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_ATTACHMENT_SAMPLE_COUNT_INFO_AMD:
-        {
-            deepcopy_VkAttachmentSampleCountInfoAMD(alloc, rootType, reinterpret_cast<const VkAttachmentSampleCountInfoAMD*>(structExtension), reinterpret_cast<VkAttachmentSampleCountInfoAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ATTACHMENT_SAMPLE_COUNT_INFO_AMD: {
+            deepcopy_VkAttachmentSampleCountInfoAMD(
+                alloc, rootType,
+                reinterpret_cast<const VkAttachmentSampleCountInfoAMD*>(structExtension),
+                reinterpret_cast<VkAttachmentSampleCountInfoAMD*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_MULTIVIEW_PER_VIEW_ATTRIBUTES_INFO_NVX:
-        {
-            deepcopy_VkMultiviewPerViewAttributesInfoNVX(alloc, rootType, reinterpret_cast<const VkMultiviewPerViewAttributesInfoNVX*>(structExtension), reinterpret_cast<VkMultiviewPerViewAttributesInfoNVX*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MULTIVIEW_PER_VIEW_ATTRIBUTES_INFO_NVX: {
+            deepcopy_VkMultiviewPerViewAttributesInfoNVX(
+                alloc, rootType,
+                reinterpret_cast<const VkMultiviewPerViewAttributesInfoNVX*>(structExtension),
+                reinterpret_cast<VkMultiviewPerViewAttributesInfoNVX*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_external_memory_win32
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
-        {
-            deepcopy_VkImportMemoryWin32HandleInfoKHR(alloc, rootType, reinterpret_cast<const VkImportMemoryWin32HandleInfoKHR*>(structExtension), reinterpret_cast<VkImportMemoryWin32HandleInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR: {
+            deepcopy_VkImportMemoryWin32HandleInfoKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkImportMemoryWin32HandleInfoKHR*>(structExtension),
+                reinterpret_cast<VkImportMemoryWin32HandleInfoKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
-        {
-            deepcopy_VkExportMemoryWin32HandleInfoKHR(alloc, rootType, reinterpret_cast<const VkExportMemoryWin32HandleInfoKHR*>(structExtension), reinterpret_cast<VkExportMemoryWin32HandleInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR: {
+            deepcopy_VkExportMemoryWin32HandleInfoKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkExportMemoryWin32HandleInfoKHR*>(structExtension),
+                reinterpret_cast<VkExportMemoryWin32HandleInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_external_memory_fd
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR:
-        {
-            deepcopy_VkImportMemoryFdInfoKHR(alloc, rootType, reinterpret_cast<const VkImportMemoryFdInfoKHR*>(structExtension), reinterpret_cast<VkImportMemoryFdInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR: {
+            deepcopy_VkImportMemoryFdInfoKHR(
+                alloc, rootType, reinterpret_cast<const VkImportMemoryFdInfoKHR*>(structExtension),
+                reinterpret_cast<VkImportMemoryFdInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_win32_keyed_mutex
-        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR:
-        {
-            deepcopy_VkWin32KeyedMutexAcquireReleaseInfoKHR(alloc, rootType, reinterpret_cast<const VkWin32KeyedMutexAcquireReleaseInfoKHR*>(structExtension), reinterpret_cast<VkWin32KeyedMutexAcquireReleaseInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR: {
+            deepcopy_VkWin32KeyedMutexAcquireReleaseInfoKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkWin32KeyedMutexAcquireReleaseInfoKHR*>(structExtension),
+                reinterpret_cast<VkWin32KeyedMutexAcquireReleaseInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_external_semaphore_win32
-        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR:
-        {
-            deepcopy_VkExportSemaphoreWin32HandleInfoKHR(alloc, rootType, reinterpret_cast<const VkExportSemaphoreWin32HandleInfoKHR*>(structExtension), reinterpret_cast<VkExportSemaphoreWin32HandleInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR: {
+            deepcopy_VkExportSemaphoreWin32HandleInfoKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkExportSemaphoreWin32HandleInfoKHR*>(structExtension),
+                reinterpret_cast<VkExportSemaphoreWin32HandleInfoKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR:
-        {
-            deepcopy_VkD3D12FenceSubmitInfoKHR(alloc, rootType, reinterpret_cast<const VkD3D12FenceSubmitInfoKHR*>(structExtension), reinterpret_cast<VkD3D12FenceSubmitInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR: {
+            deepcopy_VkD3D12FenceSubmitInfoKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkD3D12FenceSubmitInfoKHR*>(structExtension),
+                reinterpret_cast<VkD3D12FenceSubmitInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_push_descriptor
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR:
-        {
-            deepcopy_VkPhysicalDevicePushDescriptorPropertiesKHR(alloc, rootType, reinterpret_cast<const VkPhysicalDevicePushDescriptorPropertiesKHR*>(structExtension), reinterpret_cast<VkPhysicalDevicePushDescriptorPropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR: {
+            deepcopy_VkPhysicalDevicePushDescriptorPropertiesKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDevicePushDescriptorPropertiesKHR*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDevicePushDescriptorPropertiesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_incremental_present
-        case VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR:
-        {
-            deepcopy_VkPresentRegionsKHR(alloc, rootType, reinterpret_cast<const VkPresentRegionsKHR*>(structExtension), reinterpret_cast<VkPresentRegionsKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR: {
+            deepcopy_VkPresentRegionsKHR(
+                alloc, rootType, reinterpret_cast<const VkPresentRegionsKHR*>(structExtension),
+                reinterpret_cast<VkPresentRegionsKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_shared_presentable_image
-        case VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR:
-        {
-            deepcopy_VkSharedPresentSurfaceCapabilitiesKHR(alloc, rootType, reinterpret_cast<const VkSharedPresentSurfaceCapabilitiesKHR*>(structExtension), reinterpret_cast<VkSharedPresentSurfaceCapabilitiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR: {
+            deepcopy_VkSharedPresentSurfaceCapabilitiesKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkSharedPresentSurfaceCapabilitiesKHR*>(structExtension),
+                reinterpret_cast<VkSharedPresentSurfaceCapabilitiesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_external_fence_win32
-        case VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR:
-        {
-            deepcopy_VkExportFenceWin32HandleInfoKHR(alloc, rootType, reinterpret_cast<const VkExportFenceWin32HandleInfoKHR*>(structExtension), reinterpret_cast<VkExportFenceWin32HandleInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR: {
+            deepcopy_VkExportFenceWin32HandleInfoKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkExportFenceWin32HandleInfoKHR*>(structExtension),
+                reinterpret_cast<VkExportFenceWin32HandleInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_performance_query
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR:
-        {
-            deepcopy_VkPhysicalDevicePerformanceQueryFeaturesKHR(alloc, rootType, reinterpret_cast<const VkPhysicalDevicePerformanceQueryFeaturesKHR*>(structExtension), reinterpret_cast<VkPhysicalDevicePerformanceQueryFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR: {
+            deepcopy_VkPhysicalDevicePerformanceQueryFeaturesKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDevicePerformanceQueryFeaturesKHR*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDevicePerformanceQueryFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR:
-        {
-            deepcopy_VkPhysicalDevicePerformanceQueryPropertiesKHR(alloc, rootType, reinterpret_cast<const VkPhysicalDevicePerformanceQueryPropertiesKHR*>(structExtension), reinterpret_cast<VkPhysicalDevicePerformanceQueryPropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR: {
+            deepcopy_VkPhysicalDevicePerformanceQueryPropertiesKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDevicePerformanceQueryPropertiesKHR*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDevicePerformanceQueryPropertiesKHR*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR:
-        {
-            deepcopy_VkQueryPoolPerformanceCreateInfoKHR(alloc, rootType, reinterpret_cast<const VkQueryPoolPerformanceCreateInfoKHR*>(structExtension), reinterpret_cast<VkQueryPoolPerformanceCreateInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR: {
+            deepcopy_VkQueryPoolPerformanceCreateInfoKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkQueryPoolPerformanceCreateInfoKHR*>(structExtension),
+                reinterpret_cast<VkQueryPoolPerformanceCreateInfoKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR:
-        {
-            deepcopy_VkPerformanceQuerySubmitInfoKHR(alloc, rootType, reinterpret_cast<const VkPerformanceQuerySubmitInfoKHR*>(structExtension), reinterpret_cast<VkPerformanceQuerySubmitInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR: {
+            deepcopy_VkPerformanceQuerySubmitInfoKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkPerformanceQuerySubmitInfoKHR*>(structExtension),
+                reinterpret_cast<VkPerformanceQuerySubmitInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_portability_subset
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR:
-        {
-            deepcopy_VkPhysicalDevicePortabilitySubsetFeaturesKHR(alloc, rootType, reinterpret_cast<const VkPhysicalDevicePortabilitySubsetFeaturesKHR*>(structExtension), reinterpret_cast<VkPhysicalDevicePortabilitySubsetFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR: {
+            deepcopy_VkPhysicalDevicePortabilitySubsetFeaturesKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDevicePortabilitySubsetFeaturesKHR*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDevicePortabilitySubsetFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR:
-        {
-            deepcopy_VkPhysicalDevicePortabilitySubsetPropertiesKHR(alloc, rootType, reinterpret_cast<const VkPhysicalDevicePortabilitySubsetPropertiesKHR*>(structExtension), reinterpret_cast<VkPhysicalDevicePortabilitySubsetPropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR: {
+            deepcopy_VkPhysicalDevicePortabilitySubsetPropertiesKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDevicePortabilitySubsetPropertiesKHR*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDevicePortabilitySubsetPropertiesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_shader_clock
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR:
-        {
-            deepcopy_VkPhysicalDeviceShaderClockFeaturesKHR(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceShaderClockFeaturesKHR*>(structExtension), reinterpret_cast<VkPhysicalDeviceShaderClockFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR: {
+            deepcopy_VkPhysicalDeviceShaderClockFeaturesKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShaderClockFeaturesKHR*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceShaderClockFeaturesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_shader_terminate_invocation
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR:
-        {
-            deepcopy_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR*>(structExtension), reinterpret_cast<VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR: {
+            deepcopy_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_fragment_shading_rate
-        case VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR:
-        {
-            deepcopy_VkFragmentShadingRateAttachmentInfoKHR(alloc, rootType, reinterpret_cast<const VkFragmentShadingRateAttachmentInfoKHR*>(structExtension), reinterpret_cast<VkFragmentShadingRateAttachmentInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR: {
+            deepcopy_VkFragmentShadingRateAttachmentInfoKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkFragmentShadingRateAttachmentInfoKHR*>(structExtension),
+                reinterpret_cast<VkFragmentShadingRateAttachmentInfoKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR:
-        {
-            deepcopy_VkPipelineFragmentShadingRateStateCreateInfoKHR(alloc, rootType, reinterpret_cast<const VkPipelineFragmentShadingRateStateCreateInfoKHR*>(structExtension), reinterpret_cast<VkPipelineFragmentShadingRateStateCreateInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR: {
+            deepcopy_VkPipelineFragmentShadingRateStateCreateInfoKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkPipelineFragmentShadingRateStateCreateInfoKHR*>(
+                    structExtension),
+                reinterpret_cast<VkPipelineFragmentShadingRateStateCreateInfoKHR*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR:
-        {
-            deepcopy_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateFeaturesKHR*>(structExtension), reinterpret_cast<VkPhysicalDeviceFragmentShadingRateFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR: {
+            deepcopy_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateFeaturesKHR*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceFragmentShadingRateFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR:
-        {
-            deepcopy_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentShadingRatePropertiesKHR*>(structExtension), reinterpret_cast<VkPhysicalDeviceFragmentShadingRatePropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR: {
+            deepcopy_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceFragmentShadingRatePropertiesKHR*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceFragmentShadingRatePropertiesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_surface_protected_capabilities
-        case VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR:
-        {
-            deepcopy_VkSurfaceProtectedCapabilitiesKHR(alloc, rootType, reinterpret_cast<const VkSurfaceProtectedCapabilitiesKHR*>(structExtension), reinterpret_cast<VkSurfaceProtectedCapabilitiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR: {
+            deepcopy_VkSurfaceProtectedCapabilitiesKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkSurfaceProtectedCapabilitiesKHR*>(structExtension),
+                reinterpret_cast<VkSurfaceProtectedCapabilitiesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_present_wait
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR:
-        {
-            deepcopy_VkPhysicalDevicePresentWaitFeaturesKHR(alloc, rootType, reinterpret_cast<const VkPhysicalDevicePresentWaitFeaturesKHR*>(structExtension), reinterpret_cast<VkPhysicalDevicePresentWaitFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR: {
+            deepcopy_VkPhysicalDevicePresentWaitFeaturesKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDevicePresentWaitFeaturesKHR*>(structExtension),
+                reinterpret_cast<VkPhysicalDevicePresentWaitFeaturesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_pipeline_executable_properties
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR:
-        {
-            deepcopy_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(alloc, rootType, reinterpret_cast<const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR*>(structExtension), reinterpret_cast<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR: {
+            deepcopy_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_shader_integer_dot_product
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR:
-        {
-            deepcopy_VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR*>(structExtension), reinterpret_cast<VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR: {
+            deepcopy_VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES_KHR:
-        {
-            deepcopy_VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR*>(structExtension), reinterpret_cast<VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES_KHR: {
+            deepcopy_VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_present_id
-        case VK_STRUCTURE_TYPE_PRESENT_ID_KHR:
-        {
-            deepcopy_VkPresentIdKHR(alloc, rootType, reinterpret_cast<const VkPresentIdKHR*>(structExtension), reinterpret_cast<VkPresentIdKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PRESENT_ID_KHR: {
+            deepcopy_VkPresentIdKHR(alloc, rootType,
+                                    reinterpret_cast<const VkPresentIdKHR*>(structExtension),
+                                    reinterpret_cast<VkPresentIdKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR:
-        {
-            deepcopy_VkPhysicalDevicePresentIdFeaturesKHR(alloc, rootType, reinterpret_cast<const VkPhysicalDevicePresentIdFeaturesKHR*>(structExtension), reinterpret_cast<VkPhysicalDevicePresentIdFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR: {
+            deepcopy_VkPhysicalDevicePresentIdFeaturesKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDevicePresentIdFeaturesKHR*>(structExtension),
+                reinterpret_cast<VkPhysicalDevicePresentIdFeaturesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_video_encode_queue
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_INFO_KHR:
-        {
-            deepcopy_VkVideoEncodeRateControlInfoKHR(alloc, rootType, reinterpret_cast<const VkVideoEncodeRateControlInfoKHR*>(structExtension), reinterpret_cast<VkVideoEncodeRateControlInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_INFO_KHR: {
+            deepcopy_VkVideoEncodeRateControlInfoKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkVideoEncodeRateControlInfoKHR*>(structExtension),
+                reinterpret_cast<VkVideoEncodeRateControlInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_synchronization2
-        case VK_STRUCTURE_TYPE_MEMORY_BARRIER_2_KHR:
-        {
-            deepcopy_VkMemoryBarrier2KHR(alloc, rootType, reinterpret_cast<const VkMemoryBarrier2KHR*>(structExtension), reinterpret_cast<VkMemoryBarrier2KHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MEMORY_BARRIER_2_KHR: {
+            deepcopy_VkMemoryBarrier2KHR(
+                alloc, rootType, reinterpret_cast<const VkMemoryBarrier2KHR*>(structExtension),
+                reinterpret_cast<VkMemoryBarrier2KHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR:
-        {
-            deepcopy_VkPhysicalDeviceSynchronization2FeaturesKHR(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceSynchronization2FeaturesKHR*>(structExtension), reinterpret_cast<VkPhysicalDeviceSynchronization2FeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR: {
+            deepcopy_VkPhysicalDeviceSynchronization2FeaturesKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceSynchronization2FeaturesKHR*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceSynchronization2FeaturesKHR*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_2_NV:
-        {
-            deepcopy_VkQueueFamilyCheckpointProperties2NV(alloc, rootType, reinterpret_cast<const VkQueueFamilyCheckpointProperties2NV*>(structExtension), reinterpret_cast<VkQueueFamilyCheckpointProperties2NV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_2_NV: {
+            deepcopy_VkQueueFamilyCheckpointProperties2NV(
+                alloc, rootType,
+                reinterpret_cast<const VkQueueFamilyCheckpointProperties2NV*>(structExtension),
+                reinterpret_cast<VkQueueFamilyCheckpointProperties2NV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_shader_subgroup_uniform_control_flow
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR:
-        {
-            deepcopy_VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR*>(structExtension), reinterpret_cast<VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR: {
+            deepcopy_VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR(
+                alloc, rootType,
+                reinterpret_cast<
+                    const VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_zero_initialize_workgroup_memory
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR:
-        {
-            deepcopy_VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR*>(structExtension), reinterpret_cast<VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR: {
+            deepcopy_VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_workgroup_memory_explicit_layout
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR:
-        {
-            deepcopy_VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR*>(structExtension), reinterpret_cast<VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR: {
+            deepcopy_VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_format_feature_flags2
-        case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR:
-        {
-            deepcopy_VkFormatProperties3KHR(alloc, rootType, reinterpret_cast<const VkFormatProperties3KHR*>(structExtension), reinterpret_cast<VkFormatProperties3KHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR: {
+            deepcopy_VkFormatProperties3KHR(
+                alloc, rootType, reinterpret_cast<const VkFormatProperties3KHR*>(structExtension),
+                reinterpret_cast<VkFormatProperties3KHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_maintenance4
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES_KHR:
-        {
-            deepcopy_VkPhysicalDeviceMaintenance4FeaturesKHR(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceMaintenance4FeaturesKHR*>(structExtension), reinterpret_cast<VkPhysicalDeviceMaintenance4FeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES_KHR: {
+            deepcopy_VkPhysicalDeviceMaintenance4FeaturesKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceMaintenance4FeaturesKHR*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceMaintenance4FeaturesKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES_KHR:
-        {
-            deepcopy_VkPhysicalDeviceMaintenance4PropertiesKHR(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceMaintenance4PropertiesKHR*>(structExtension), reinterpret_cast<VkPhysicalDeviceMaintenance4PropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES_KHR: {
+            deepcopy_VkPhysicalDeviceMaintenance4PropertiesKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceMaintenance4PropertiesKHR*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceMaintenance4PropertiesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_ANDROID_native_buffer
-        case VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID:
-        {
-            deepcopy_VkNativeBufferANDROID(alloc, rootType, reinterpret_cast<const VkNativeBufferANDROID*>(structExtension), reinterpret_cast<VkNativeBufferANDROID*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID: {
+            deepcopy_VkNativeBufferANDROID(
+                alloc, rootType, reinterpret_cast<const VkNativeBufferANDROID*>(structExtension),
+                reinterpret_cast<VkNativeBufferANDROID*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_debug_report
-        case VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT:
-        {
-            deepcopy_VkDebugReportCallbackCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkDebugReportCallbackCreateInfoEXT*>(structExtension), reinterpret_cast<VkDebugReportCallbackCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT: {
+            deepcopy_VkDebugReportCallbackCreateInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkDebugReportCallbackCreateInfoEXT*>(structExtension),
+                reinterpret_cast<VkDebugReportCallbackCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_rasterization_order
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD:
-        {
-            deepcopy_VkPipelineRasterizationStateRasterizationOrderAMD(alloc, rootType, reinterpret_cast<const VkPipelineRasterizationStateRasterizationOrderAMD*>(structExtension), reinterpret_cast<VkPipelineRasterizationStateRasterizationOrderAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD: {
+            deepcopy_VkPipelineRasterizationStateRasterizationOrderAMD(
+                alloc, rootType,
+                reinterpret_cast<const VkPipelineRasterizationStateRasterizationOrderAMD*>(
+                    structExtension),
+                reinterpret_cast<VkPipelineRasterizationStateRasterizationOrderAMD*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_dedicated_allocation
-        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV:
-        {
-            deepcopy_VkDedicatedAllocationImageCreateInfoNV(alloc, rootType, reinterpret_cast<const VkDedicatedAllocationImageCreateInfoNV*>(structExtension), reinterpret_cast<VkDedicatedAllocationImageCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV: {
+            deepcopy_VkDedicatedAllocationImageCreateInfoNV(
+                alloc, rootType,
+                reinterpret_cast<const VkDedicatedAllocationImageCreateInfoNV*>(structExtension),
+                reinterpret_cast<VkDedicatedAllocationImageCreateInfoNV*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV:
-        {
-            deepcopy_VkDedicatedAllocationBufferCreateInfoNV(alloc, rootType, reinterpret_cast<const VkDedicatedAllocationBufferCreateInfoNV*>(structExtension), reinterpret_cast<VkDedicatedAllocationBufferCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV: {
+            deepcopy_VkDedicatedAllocationBufferCreateInfoNV(
+                alloc, rootType,
+                reinterpret_cast<const VkDedicatedAllocationBufferCreateInfoNV*>(structExtension),
+                reinterpret_cast<VkDedicatedAllocationBufferCreateInfoNV*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV:
-        {
-            deepcopy_VkDedicatedAllocationMemoryAllocateInfoNV(alloc, rootType, reinterpret_cast<const VkDedicatedAllocationMemoryAllocateInfoNV*>(structExtension), reinterpret_cast<VkDedicatedAllocationMemoryAllocateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV: {
+            deepcopy_VkDedicatedAllocationMemoryAllocateInfoNV(
+                alloc, rootType,
+                reinterpret_cast<const VkDedicatedAllocationMemoryAllocateInfoNV*>(structExtension),
+                reinterpret_cast<VkDedicatedAllocationMemoryAllocateInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_transform_feedback
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceTransformFeedbackFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceTransformFeedbackFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceTransformFeedbackFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT: {
+            deepcopy_VkPhysicalDeviceTransformFeedbackFeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceTransformFeedbackFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceTransformFeedbackFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceTransformFeedbackPropertiesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceTransformFeedbackPropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceTransformFeedbackPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT: {
+            deepcopy_VkPhysicalDeviceTransformFeedbackPropertiesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceTransformFeedbackPropertiesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceTransformFeedbackPropertiesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT:
-        {
-            deepcopy_VkPipelineRasterizationStateStreamCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkPipelineRasterizationStateStreamCreateInfoEXT*>(structExtension), reinterpret_cast<VkPipelineRasterizationStateStreamCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT: {
+            deepcopy_VkPipelineRasterizationStateStreamCreateInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPipelineRasterizationStateStreamCreateInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPipelineRasterizationStateStreamCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_video_encode_h264
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_EXT:
-        {
-            deepcopy_VkVideoEncodeH264CapabilitiesEXT(alloc, rootType, reinterpret_cast<const VkVideoEncodeH264CapabilitiesEXT*>(structExtension), reinterpret_cast<VkVideoEncodeH264CapabilitiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_EXT: {
+            deepcopy_VkVideoEncodeH264CapabilitiesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkVideoEncodeH264CapabilitiesEXT*>(structExtension),
+                reinterpret_cast<VkVideoEncodeH264CapabilitiesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_CREATE_INFO_EXT:
-        {
-            deepcopy_VkVideoEncodeH264SessionCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkVideoEncodeH264SessionCreateInfoEXT*>(structExtension), reinterpret_cast<VkVideoEncodeH264SessionCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_CREATE_INFO_EXT: {
+            deepcopy_VkVideoEncodeH264SessionCreateInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkVideoEncodeH264SessionCreateInfoEXT*>(structExtension),
+                reinterpret_cast<VkVideoEncodeH264SessionCreateInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
-            deepcopy_VkVideoEncodeH264SessionParametersAddInfoEXT(alloc, rootType, reinterpret_cast<const VkVideoEncodeH264SessionParametersAddInfoEXT*>(structExtension), reinterpret_cast<VkVideoEncodeH264SessionParametersAddInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT: {
+            deepcopy_VkVideoEncodeH264SessionParametersAddInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkVideoEncodeH264SessionParametersAddInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<VkVideoEncodeH264SessionParametersAddInfoEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
-            deepcopy_VkVideoEncodeH264SessionParametersCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkVideoEncodeH264SessionParametersCreateInfoEXT*>(structExtension), reinterpret_cast<VkVideoEncodeH264SessionParametersCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT: {
+            deepcopy_VkVideoEncodeH264SessionParametersCreateInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkVideoEncodeH264SessionParametersCreateInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<VkVideoEncodeH264SessionParametersCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_VCL_FRAME_INFO_EXT:
-        {
-            deepcopy_VkVideoEncodeH264VclFrameInfoEXT(alloc, rootType, reinterpret_cast<const VkVideoEncodeH264VclFrameInfoEXT*>(structExtension), reinterpret_cast<VkVideoEncodeH264VclFrameInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_VCL_FRAME_INFO_EXT: {
+            deepcopy_VkVideoEncodeH264VclFrameInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkVideoEncodeH264VclFrameInfoEXT*>(structExtension),
+                reinterpret_cast<VkVideoEncodeH264VclFrameInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_EMIT_PICTURE_PARAMETERS_EXT:
-        {
-            deepcopy_VkVideoEncodeH264EmitPictureParametersEXT(alloc, rootType, reinterpret_cast<const VkVideoEncodeH264EmitPictureParametersEXT*>(structExtension), reinterpret_cast<VkVideoEncodeH264EmitPictureParametersEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_EMIT_PICTURE_PARAMETERS_EXT: {
+            deepcopy_VkVideoEncodeH264EmitPictureParametersEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkVideoEncodeH264EmitPictureParametersEXT*>(structExtension),
+                reinterpret_cast<VkVideoEncodeH264EmitPictureParametersEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_EXT:
-        {
-            deepcopy_VkVideoEncodeH264ProfileEXT(alloc, rootType, reinterpret_cast<const VkVideoEncodeH264ProfileEXT*>(structExtension), reinterpret_cast<VkVideoEncodeH264ProfileEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_EXT: {
+            deepcopy_VkVideoEncodeH264ProfileEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkVideoEncodeH264ProfileEXT*>(structExtension),
+                reinterpret_cast<VkVideoEncodeH264ProfileEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_video_encode_h265
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_EXT:
-        {
-            deepcopy_VkVideoEncodeH265CapabilitiesEXT(alloc, rootType, reinterpret_cast<const VkVideoEncodeH265CapabilitiesEXT*>(structExtension), reinterpret_cast<VkVideoEncodeH265CapabilitiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_EXT: {
+            deepcopy_VkVideoEncodeH265CapabilitiesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkVideoEncodeH265CapabilitiesEXT*>(structExtension),
+                reinterpret_cast<VkVideoEncodeH265CapabilitiesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_CREATE_INFO_EXT:
-        {
-            deepcopy_VkVideoEncodeH265SessionCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkVideoEncodeH265SessionCreateInfoEXT*>(structExtension), reinterpret_cast<VkVideoEncodeH265SessionCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_CREATE_INFO_EXT: {
+            deepcopy_VkVideoEncodeH265SessionCreateInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkVideoEncodeH265SessionCreateInfoEXT*>(structExtension),
+                reinterpret_cast<VkVideoEncodeH265SessionCreateInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
-            deepcopy_VkVideoEncodeH265SessionParametersAddInfoEXT(alloc, rootType, reinterpret_cast<const VkVideoEncodeH265SessionParametersAddInfoEXT*>(structExtension), reinterpret_cast<VkVideoEncodeH265SessionParametersAddInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT: {
+            deepcopy_VkVideoEncodeH265SessionParametersAddInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkVideoEncodeH265SessionParametersAddInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<VkVideoEncodeH265SessionParametersAddInfoEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
-            deepcopy_VkVideoEncodeH265SessionParametersCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkVideoEncodeH265SessionParametersCreateInfoEXT*>(structExtension), reinterpret_cast<VkVideoEncodeH265SessionParametersCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT: {
+            deepcopy_VkVideoEncodeH265SessionParametersCreateInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkVideoEncodeH265SessionParametersCreateInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<VkVideoEncodeH265SessionParametersCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_VCL_FRAME_INFO_EXT:
-        {
-            deepcopy_VkVideoEncodeH265VclFrameInfoEXT(alloc, rootType, reinterpret_cast<const VkVideoEncodeH265VclFrameInfoEXT*>(structExtension), reinterpret_cast<VkVideoEncodeH265VclFrameInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_VCL_FRAME_INFO_EXT: {
+            deepcopy_VkVideoEncodeH265VclFrameInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkVideoEncodeH265VclFrameInfoEXT*>(structExtension),
+                reinterpret_cast<VkVideoEncodeH265VclFrameInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_EMIT_PICTURE_PARAMETERS_EXT:
-        {
-            deepcopy_VkVideoEncodeH265EmitPictureParametersEXT(alloc, rootType, reinterpret_cast<const VkVideoEncodeH265EmitPictureParametersEXT*>(structExtension), reinterpret_cast<VkVideoEncodeH265EmitPictureParametersEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_EMIT_PICTURE_PARAMETERS_EXT: {
+            deepcopy_VkVideoEncodeH265EmitPictureParametersEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkVideoEncodeH265EmitPictureParametersEXT*>(structExtension),
+                reinterpret_cast<VkVideoEncodeH265EmitPictureParametersEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_EXT:
-        {
-            deepcopy_VkVideoEncodeH265ProfileEXT(alloc, rootType, reinterpret_cast<const VkVideoEncodeH265ProfileEXT*>(structExtension), reinterpret_cast<VkVideoEncodeH265ProfileEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_EXT: {
+            deepcopy_VkVideoEncodeH265ProfileEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkVideoEncodeH265ProfileEXT*>(structExtension),
+                reinterpret_cast<VkVideoEncodeH265ProfileEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_video_decode_h264
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_EXT:
-        {
-            deepcopy_VkVideoDecodeH264ProfileEXT(alloc, rootType, reinterpret_cast<const VkVideoDecodeH264ProfileEXT*>(structExtension), reinterpret_cast<VkVideoDecodeH264ProfileEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_EXT: {
+            deepcopy_VkVideoDecodeH264ProfileEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkVideoDecodeH264ProfileEXT*>(structExtension),
+                reinterpret_cast<VkVideoDecodeH264ProfileEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT:
-        {
-            deepcopy_VkVideoDecodeH264CapabilitiesEXT(alloc, rootType, reinterpret_cast<const VkVideoDecodeH264CapabilitiesEXT*>(structExtension), reinterpret_cast<VkVideoDecodeH264CapabilitiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT: {
+            deepcopy_VkVideoDecodeH264CapabilitiesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkVideoDecodeH264CapabilitiesEXT*>(structExtension),
+                reinterpret_cast<VkVideoDecodeH264CapabilitiesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_CREATE_INFO_EXT:
-        {
-            deepcopy_VkVideoDecodeH264SessionCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkVideoDecodeH264SessionCreateInfoEXT*>(structExtension), reinterpret_cast<VkVideoDecodeH264SessionCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_CREATE_INFO_EXT: {
+            deepcopy_VkVideoDecodeH264SessionCreateInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkVideoDecodeH264SessionCreateInfoEXT*>(structExtension),
+                reinterpret_cast<VkVideoDecodeH264SessionCreateInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
-            deepcopy_VkVideoDecodeH264SessionParametersAddInfoEXT(alloc, rootType, reinterpret_cast<const VkVideoDecodeH264SessionParametersAddInfoEXT*>(structExtension), reinterpret_cast<VkVideoDecodeH264SessionParametersAddInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT: {
+            deepcopy_VkVideoDecodeH264SessionParametersAddInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkVideoDecodeH264SessionParametersAddInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<VkVideoDecodeH264SessionParametersAddInfoEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
-            deepcopy_VkVideoDecodeH264SessionParametersCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkVideoDecodeH264SessionParametersCreateInfoEXT*>(structExtension), reinterpret_cast<VkVideoDecodeH264SessionParametersCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT: {
+            deepcopy_VkVideoDecodeH264SessionParametersCreateInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkVideoDecodeH264SessionParametersCreateInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<VkVideoDecodeH264SessionParametersCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT:
-        {
-            deepcopy_VkVideoDecodeH264PictureInfoEXT(alloc, rootType, reinterpret_cast<const VkVideoDecodeH264PictureInfoEXT*>(structExtension), reinterpret_cast<VkVideoDecodeH264PictureInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT: {
+            deepcopy_VkVideoDecodeH264PictureInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkVideoDecodeH264PictureInfoEXT*>(structExtension),
+                reinterpret_cast<VkVideoDecodeH264PictureInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_MVC_EXT:
-        {
-            deepcopy_VkVideoDecodeH264MvcEXT(alloc, rootType, reinterpret_cast<const VkVideoDecodeH264MvcEXT*>(structExtension), reinterpret_cast<VkVideoDecodeH264MvcEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_MVC_EXT: {
+            deepcopy_VkVideoDecodeH264MvcEXT(
+                alloc, rootType, reinterpret_cast<const VkVideoDecodeH264MvcEXT*>(structExtension),
+                reinterpret_cast<VkVideoDecodeH264MvcEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT:
-        {
-            deepcopy_VkVideoDecodeH264DpbSlotInfoEXT(alloc, rootType, reinterpret_cast<const VkVideoDecodeH264DpbSlotInfoEXT*>(structExtension), reinterpret_cast<VkVideoDecodeH264DpbSlotInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT: {
+            deepcopy_VkVideoDecodeH264DpbSlotInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkVideoDecodeH264DpbSlotInfoEXT*>(structExtension),
+                reinterpret_cast<VkVideoDecodeH264DpbSlotInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_texture_gather_bias_lod
-        case VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD:
-        {
-            deepcopy_VkTextureLODGatherFormatPropertiesAMD(alloc, rootType, reinterpret_cast<const VkTextureLODGatherFormatPropertiesAMD*>(structExtension), reinterpret_cast<VkTextureLODGatherFormatPropertiesAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD: {
+            deepcopy_VkTextureLODGatherFormatPropertiesAMD(
+                alloc, rootType,
+                reinterpret_cast<const VkTextureLODGatherFormatPropertiesAMD*>(structExtension),
+                reinterpret_cast<VkTextureLODGatherFormatPropertiesAMD*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_corner_sampled_image
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV:
-        {
-            deepcopy_VkPhysicalDeviceCornerSampledImageFeaturesNV(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceCornerSampledImageFeaturesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceCornerSampledImageFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV: {
+            deepcopy_VkPhysicalDeviceCornerSampledImageFeaturesNV(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceCornerSampledImageFeaturesNV*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceCornerSampledImageFeaturesNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_external_memory
-        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV:
-        {
-            deepcopy_VkExternalMemoryImageCreateInfoNV(alloc, rootType, reinterpret_cast<const VkExternalMemoryImageCreateInfoNV*>(structExtension), reinterpret_cast<VkExternalMemoryImageCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV: {
+            deepcopy_VkExternalMemoryImageCreateInfoNV(
+                alloc, rootType,
+                reinterpret_cast<const VkExternalMemoryImageCreateInfoNV*>(structExtension),
+                reinterpret_cast<VkExternalMemoryImageCreateInfoNV*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV:
-        {
-            deepcopy_VkExportMemoryAllocateInfoNV(alloc, rootType, reinterpret_cast<const VkExportMemoryAllocateInfoNV*>(structExtension), reinterpret_cast<VkExportMemoryAllocateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV: {
+            deepcopy_VkExportMemoryAllocateInfoNV(
+                alloc, rootType,
+                reinterpret_cast<const VkExportMemoryAllocateInfoNV*>(structExtension),
+                reinterpret_cast<VkExportMemoryAllocateInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_external_memory_win32
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV:
-        {
-            deepcopy_VkImportMemoryWin32HandleInfoNV(alloc, rootType, reinterpret_cast<const VkImportMemoryWin32HandleInfoNV*>(structExtension), reinterpret_cast<VkImportMemoryWin32HandleInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV: {
+            deepcopy_VkImportMemoryWin32HandleInfoNV(
+                alloc, rootType,
+                reinterpret_cast<const VkImportMemoryWin32HandleInfoNV*>(structExtension),
+                reinterpret_cast<VkImportMemoryWin32HandleInfoNV*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV:
-        {
-            deepcopy_VkExportMemoryWin32HandleInfoNV(alloc, rootType, reinterpret_cast<const VkExportMemoryWin32HandleInfoNV*>(structExtension), reinterpret_cast<VkExportMemoryWin32HandleInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV: {
+            deepcopy_VkExportMemoryWin32HandleInfoNV(
+                alloc, rootType,
+                reinterpret_cast<const VkExportMemoryWin32HandleInfoNV*>(structExtension),
+                reinterpret_cast<VkExportMemoryWin32HandleInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_win32_keyed_mutex
-        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV:
-        {
-            deepcopy_VkWin32KeyedMutexAcquireReleaseInfoNV(alloc, rootType, reinterpret_cast<const VkWin32KeyedMutexAcquireReleaseInfoNV*>(structExtension), reinterpret_cast<VkWin32KeyedMutexAcquireReleaseInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV: {
+            deepcopy_VkWin32KeyedMutexAcquireReleaseInfoNV(
+                alloc, rootType,
+                reinterpret_cast<const VkWin32KeyedMutexAcquireReleaseInfoNV*>(structExtension),
+                reinterpret_cast<VkWin32KeyedMutexAcquireReleaseInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_validation_flags
-        case VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT:
-        {
-            deepcopy_VkValidationFlagsEXT(alloc, rootType, reinterpret_cast<const VkValidationFlagsEXT*>(structExtension), reinterpret_cast<VkValidationFlagsEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT: {
+            deepcopy_VkValidationFlagsEXT(
+                alloc, rootType, reinterpret_cast<const VkValidationFlagsEXT*>(structExtension),
+                reinterpret_cast<VkValidationFlagsEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_texture_compression_astc_hdr
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT: {
+            deepcopy_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_astc_decode_mode
-        case VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT:
-        {
-            deepcopy_VkImageViewASTCDecodeModeEXT(alloc, rootType, reinterpret_cast<const VkImageViewASTCDecodeModeEXT*>(structExtension), reinterpret_cast<VkImageViewASTCDecodeModeEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT: {
+            deepcopy_VkImageViewASTCDecodeModeEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkImageViewASTCDecodeModeEXT*>(structExtension),
+                reinterpret_cast<VkImageViewASTCDecodeModeEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceASTCDecodeFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceASTCDecodeFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceASTCDecodeFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT: {
+            deepcopy_VkPhysicalDeviceASTCDecodeFeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceASTCDecodeFeaturesEXT*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceASTCDecodeFeaturesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_conditional_rendering
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceConditionalRenderingFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceConditionalRenderingFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceConditionalRenderingFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT: {
+            deepcopy_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceConditionalRenderingFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceConditionalRenderingFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT:
-        {
-            deepcopy_VkCommandBufferInheritanceConditionalRenderingInfoEXT(alloc, rootType, reinterpret_cast<const VkCommandBufferInheritanceConditionalRenderingInfoEXT*>(structExtension), reinterpret_cast<VkCommandBufferInheritanceConditionalRenderingInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT: {
+            deepcopy_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkCommandBufferInheritanceConditionalRenderingInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<VkCommandBufferInheritanceConditionalRenderingInfoEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_clip_space_w_scaling
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV:
-        {
-            deepcopy_VkPipelineViewportWScalingStateCreateInfoNV(alloc, rootType, reinterpret_cast<const VkPipelineViewportWScalingStateCreateInfoNV*>(structExtension), reinterpret_cast<VkPipelineViewportWScalingStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV: {
+            deepcopy_VkPipelineViewportWScalingStateCreateInfoNV(
+                alloc, rootType,
+                reinterpret_cast<const VkPipelineViewportWScalingStateCreateInfoNV*>(
+                    structExtension),
+                reinterpret_cast<VkPipelineViewportWScalingStateCreateInfoNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_display_control
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT:
-        {
-            deepcopy_VkSwapchainCounterCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkSwapchainCounterCreateInfoEXT*>(structExtension), reinterpret_cast<VkSwapchainCounterCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT: {
+            deepcopy_VkSwapchainCounterCreateInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkSwapchainCounterCreateInfoEXT*>(structExtension),
+                reinterpret_cast<VkSwapchainCounterCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_GOOGLE_display_timing
-        case VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE:
-        {
-            deepcopy_VkPresentTimesInfoGOOGLE(alloc, rootType, reinterpret_cast<const VkPresentTimesInfoGOOGLE*>(structExtension), reinterpret_cast<VkPresentTimesInfoGOOGLE*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE: {
+            deepcopy_VkPresentTimesInfoGOOGLE(
+                alloc, rootType, reinterpret_cast<const VkPresentTimesInfoGOOGLE*>(structExtension),
+                reinterpret_cast<VkPresentTimesInfoGOOGLE*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NVX_multiview_per_view_attributes
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX:
-        {
-            deepcopy_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX*>(structExtension), reinterpret_cast<VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX: {
+            deepcopy_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_viewport_swizzle
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV:
-        {
-            deepcopy_VkPipelineViewportSwizzleStateCreateInfoNV(alloc, rootType, reinterpret_cast<const VkPipelineViewportSwizzleStateCreateInfoNV*>(structExtension), reinterpret_cast<VkPipelineViewportSwizzleStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV: {
+            deepcopy_VkPipelineViewportSwizzleStateCreateInfoNV(
+                alloc, rootType,
+                reinterpret_cast<const VkPipelineViewportSwizzleStateCreateInfoNV*>(
+                    structExtension),
+                reinterpret_cast<VkPipelineViewportSwizzleStateCreateInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_discard_rectangles
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceDiscardRectanglePropertiesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceDiscardRectanglePropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceDiscardRectanglePropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT: {
+            deepcopy_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceDiscardRectanglePropertiesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceDiscardRectanglePropertiesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT:
-        {
-            deepcopy_VkPipelineDiscardRectangleStateCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkPipelineDiscardRectangleStateCreateInfoEXT*>(structExtension), reinterpret_cast<VkPipelineDiscardRectangleStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT: {
+            deepcopy_VkPipelineDiscardRectangleStateCreateInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPipelineDiscardRectangleStateCreateInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPipelineDiscardRectangleStateCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_conservative_rasterization
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceConservativeRasterizationPropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceConservativeRasterizationPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT: {
+            deepcopy_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceConservativeRasterizationPropertiesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceConservativeRasterizationPropertiesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT:
-        {
-            deepcopy_VkPipelineRasterizationConservativeStateCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkPipelineRasterizationConservativeStateCreateInfoEXT*>(structExtension), reinterpret_cast<VkPipelineRasterizationConservativeStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT: {
+            deepcopy_VkPipelineRasterizationConservativeStateCreateInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPipelineRasterizationConservativeStateCreateInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPipelineRasterizationConservativeStateCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_depth_clip_enable
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceDepthClipEnableFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceDepthClipEnableFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceDepthClipEnableFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT: {
+            deepcopy_VkPhysicalDeviceDepthClipEnableFeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceDepthClipEnableFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceDepthClipEnableFeaturesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT:
-        {
-            deepcopy_VkPipelineRasterizationDepthClipStateCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkPipelineRasterizationDepthClipStateCreateInfoEXT*>(structExtension), reinterpret_cast<VkPipelineRasterizationDepthClipStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT: {
+            deepcopy_VkPipelineRasterizationDepthClipStateCreateInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPipelineRasterizationDepthClipStateCreateInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPipelineRasterizationDepthClipStateCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_debug_utils
-        case VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT:
-        {
-            deepcopy_VkDebugUtilsMessengerCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkDebugUtilsMessengerCreateInfoEXT*>(structExtension), reinterpret_cast<VkDebugUtilsMessengerCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT: {
+            deepcopy_VkDebugUtilsMessengerCreateInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkDebugUtilsMessengerCreateInfoEXT*>(structExtension),
+                reinterpret_cast<VkDebugUtilsMessengerCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
-        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID:
-        {
-            deepcopy_VkAndroidHardwareBufferUsageANDROID(alloc, rootType, reinterpret_cast<const VkAndroidHardwareBufferUsageANDROID*>(structExtension), reinterpret_cast<VkAndroidHardwareBufferUsageANDROID*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID: {
+            deepcopy_VkAndroidHardwareBufferUsageANDROID(
+                alloc, rootType,
+                reinterpret_cast<const VkAndroidHardwareBufferUsageANDROID*>(structExtension),
+                reinterpret_cast<VkAndroidHardwareBufferUsageANDROID*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID:
-        {
-            deepcopy_VkAndroidHardwareBufferFormatPropertiesANDROID(alloc, rootType, reinterpret_cast<const VkAndroidHardwareBufferFormatPropertiesANDROID*>(structExtension), reinterpret_cast<VkAndroidHardwareBufferFormatPropertiesANDROID*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID: {
+            deepcopy_VkAndroidHardwareBufferFormatPropertiesANDROID(
+                alloc, rootType,
+                reinterpret_cast<const VkAndroidHardwareBufferFormatPropertiesANDROID*>(
+                    structExtension),
+                reinterpret_cast<VkAndroidHardwareBufferFormatPropertiesANDROID*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID:
-        {
-            deepcopy_VkImportAndroidHardwareBufferInfoANDROID(alloc, rootType, reinterpret_cast<const VkImportAndroidHardwareBufferInfoANDROID*>(structExtension), reinterpret_cast<VkImportAndroidHardwareBufferInfoANDROID*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID: {
+            deepcopy_VkImportAndroidHardwareBufferInfoANDROID(
+                alloc, rootType,
+                reinterpret_cast<const VkImportAndroidHardwareBufferInfoANDROID*>(structExtension),
+                reinterpret_cast<VkImportAndroidHardwareBufferInfoANDROID*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID:
-        {
-            deepcopy_VkExternalFormatANDROID(alloc, rootType, reinterpret_cast<const VkExternalFormatANDROID*>(structExtension), reinterpret_cast<VkExternalFormatANDROID*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID: {
+            deepcopy_VkExternalFormatANDROID(
+                alloc, rootType, reinterpret_cast<const VkExternalFormatANDROID*>(structExtension),
+                reinterpret_cast<VkExternalFormatANDROID*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_2_ANDROID:
-        {
-            deepcopy_VkAndroidHardwareBufferFormatProperties2ANDROID(alloc, rootType, reinterpret_cast<const VkAndroidHardwareBufferFormatProperties2ANDROID*>(structExtension), reinterpret_cast<VkAndroidHardwareBufferFormatProperties2ANDROID*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_2_ANDROID: {
+            deepcopy_VkAndroidHardwareBufferFormatProperties2ANDROID(
+                alloc, rootType,
+                reinterpret_cast<const VkAndroidHardwareBufferFormatProperties2ANDROID*>(
+                    structExtension),
+                reinterpret_cast<VkAndroidHardwareBufferFormatProperties2ANDROID*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_inline_uniform_block
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceInlineUniformBlockFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceInlineUniformBlockFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT: {
+            deepcopy_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceInlineUniformBlockFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceInlineUniformBlockFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceInlineUniformBlockPropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceInlineUniformBlockPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT: {
+            deepcopy_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceInlineUniformBlockPropertiesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceInlineUniformBlockPropertiesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT:
-        {
-            deepcopy_VkWriteDescriptorSetInlineUniformBlockEXT(alloc, rootType, reinterpret_cast<const VkWriteDescriptorSetInlineUniformBlockEXT*>(structExtension), reinterpret_cast<VkWriteDescriptorSetInlineUniformBlockEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT: {
+            deepcopy_VkWriteDescriptorSetInlineUniformBlockEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkWriteDescriptorSetInlineUniformBlockEXT*>(structExtension),
+                reinterpret_cast<VkWriteDescriptorSetInlineUniformBlockEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT:
-        {
-            deepcopy_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkDescriptorPoolInlineUniformBlockCreateInfoEXT*>(structExtension), reinterpret_cast<VkDescriptorPoolInlineUniformBlockCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT: {
+            deepcopy_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkDescriptorPoolInlineUniformBlockCreateInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<VkDescriptorPoolInlineUniformBlockCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_sample_locations
-        case VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT:
-        {
-            deepcopy_VkSampleLocationsInfoEXT(alloc, rootType, reinterpret_cast<const VkSampleLocationsInfoEXT*>(structExtension), reinterpret_cast<VkSampleLocationsInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT: {
+            deepcopy_VkSampleLocationsInfoEXT(
+                alloc, rootType, reinterpret_cast<const VkSampleLocationsInfoEXT*>(structExtension),
+                reinterpret_cast<VkSampleLocationsInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT:
-        {
-            deepcopy_VkRenderPassSampleLocationsBeginInfoEXT(alloc, rootType, reinterpret_cast<const VkRenderPassSampleLocationsBeginInfoEXT*>(structExtension), reinterpret_cast<VkRenderPassSampleLocationsBeginInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT: {
+            deepcopy_VkRenderPassSampleLocationsBeginInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkRenderPassSampleLocationsBeginInfoEXT*>(structExtension),
+                reinterpret_cast<VkRenderPassSampleLocationsBeginInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT:
-        {
-            deepcopy_VkPipelineSampleLocationsStateCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkPipelineSampleLocationsStateCreateInfoEXT*>(structExtension), reinterpret_cast<VkPipelineSampleLocationsStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT: {
+            deepcopy_VkPipelineSampleLocationsStateCreateInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPipelineSampleLocationsStateCreateInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPipelineSampleLocationsStateCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceSampleLocationsPropertiesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceSampleLocationsPropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceSampleLocationsPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT: {
+            deepcopy_VkPhysicalDeviceSampleLocationsPropertiesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceSampleLocationsPropertiesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceSampleLocationsPropertiesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_blend_operation_advanced
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT: {
+            deepcopy_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT: {
+            deepcopy_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT:
-        {
-            deepcopy_VkPipelineColorBlendAdvancedStateCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkPipelineColorBlendAdvancedStateCreateInfoEXT*>(structExtension), reinterpret_cast<VkPipelineColorBlendAdvancedStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT: {
+            deepcopy_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPipelineColorBlendAdvancedStateCreateInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPipelineColorBlendAdvancedStateCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_fragment_coverage_to_color
-        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV:
-        {
-            deepcopy_VkPipelineCoverageToColorStateCreateInfoNV(alloc, rootType, reinterpret_cast<const VkPipelineCoverageToColorStateCreateInfoNV*>(structExtension), reinterpret_cast<VkPipelineCoverageToColorStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV: {
+            deepcopy_VkPipelineCoverageToColorStateCreateInfoNV(
+                alloc, rootType,
+                reinterpret_cast<const VkPipelineCoverageToColorStateCreateInfoNV*>(
+                    structExtension),
+                reinterpret_cast<VkPipelineCoverageToColorStateCreateInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_framebuffer_mixed_samples
-        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV:
-        {
-            deepcopy_VkPipelineCoverageModulationStateCreateInfoNV(alloc, rootType, reinterpret_cast<const VkPipelineCoverageModulationStateCreateInfoNV*>(structExtension), reinterpret_cast<VkPipelineCoverageModulationStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV: {
+            deepcopy_VkPipelineCoverageModulationStateCreateInfoNV(
+                alloc, rootType,
+                reinterpret_cast<const VkPipelineCoverageModulationStateCreateInfoNV*>(
+                    structExtension),
+                reinterpret_cast<VkPipelineCoverageModulationStateCreateInfoNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_shader_sm_builtins
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV:
-        {
-            deepcopy_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceShaderSMBuiltinsPropertiesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceShaderSMBuiltinsPropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV: {
+            deepcopy_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShaderSMBuiltinsPropertiesNV*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceShaderSMBuiltinsPropertiesNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV:
-        {
-            deepcopy_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceShaderSMBuiltinsFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV: {
+            deepcopy_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceShaderSMBuiltinsFeaturesNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_image_drm_format_modifier
-        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT:
-        {
-            deepcopy_VkDrmFormatModifierPropertiesListEXT(alloc, rootType, reinterpret_cast<const VkDrmFormatModifierPropertiesListEXT*>(structExtension), reinterpret_cast<VkDrmFormatModifierPropertiesListEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT: {
+            deepcopy_VkDrmFormatModifierPropertiesListEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkDrmFormatModifierPropertiesListEXT*>(structExtension),
+                reinterpret_cast<VkDrmFormatModifierPropertiesListEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT:
-        {
-            deepcopy_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceImageDrmFormatModifierInfoEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceImageDrmFormatModifierInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT: {
+            deepcopy_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceImageDrmFormatModifierInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceImageDrmFormatModifierInfoEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT:
-        {
-            deepcopy_VkImageDrmFormatModifierListCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkImageDrmFormatModifierListCreateInfoEXT*>(structExtension), reinterpret_cast<VkImageDrmFormatModifierListCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT: {
+            deepcopy_VkImageDrmFormatModifierListCreateInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkImageDrmFormatModifierListCreateInfoEXT*>(structExtension),
+                reinterpret_cast<VkImageDrmFormatModifierListCreateInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT:
-        {
-            deepcopy_VkImageDrmFormatModifierExplicitCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkImageDrmFormatModifierExplicitCreateInfoEXT*>(structExtension), reinterpret_cast<VkImageDrmFormatModifierExplicitCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT: {
+            deepcopy_VkImageDrmFormatModifierExplicitCreateInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkImageDrmFormatModifierExplicitCreateInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<VkImageDrmFormatModifierExplicitCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_2_EXT:
-        {
-            deepcopy_VkDrmFormatModifierPropertiesList2EXT(alloc, rootType, reinterpret_cast<const VkDrmFormatModifierPropertiesList2EXT*>(structExtension), reinterpret_cast<VkDrmFormatModifierPropertiesList2EXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_2_EXT: {
+            deepcopy_VkDrmFormatModifierPropertiesList2EXT(
+                alloc, rootType,
+                reinterpret_cast<const VkDrmFormatModifierPropertiesList2EXT*>(structExtension),
+                reinterpret_cast<VkDrmFormatModifierPropertiesList2EXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_validation_cache
-        case VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT:
-        {
-            deepcopy_VkShaderModuleValidationCacheCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkShaderModuleValidationCacheCreateInfoEXT*>(structExtension), reinterpret_cast<VkShaderModuleValidationCacheCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT: {
+            deepcopy_VkShaderModuleValidationCacheCreateInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkShaderModuleValidationCacheCreateInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<VkShaderModuleValidationCacheCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_shading_rate_image
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV:
-        {
-            deepcopy_VkPipelineViewportShadingRateImageStateCreateInfoNV(alloc, rootType, reinterpret_cast<const VkPipelineViewportShadingRateImageStateCreateInfoNV*>(structExtension), reinterpret_cast<VkPipelineViewportShadingRateImageStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV: {
+            deepcopy_VkPipelineViewportShadingRateImageStateCreateInfoNV(
+                alloc, rootType,
+                reinterpret_cast<const VkPipelineViewportShadingRateImageStateCreateInfoNV*>(
+                    structExtension),
+                reinterpret_cast<VkPipelineViewportShadingRateImageStateCreateInfoNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV:
-        {
-            deepcopy_VkPhysicalDeviceShadingRateImageFeaturesNV(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceShadingRateImageFeaturesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceShadingRateImageFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV: {
+            deepcopy_VkPhysicalDeviceShadingRateImageFeaturesNV(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShadingRateImageFeaturesNV*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceShadingRateImageFeaturesNV*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV:
-        {
-            deepcopy_VkPhysicalDeviceShadingRateImagePropertiesNV(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceShadingRateImagePropertiesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceShadingRateImagePropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV: {
+            deepcopy_VkPhysicalDeviceShadingRateImagePropertiesNV(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShadingRateImagePropertiesNV*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceShadingRateImagePropertiesNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV:
-        {
-            deepcopy_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(alloc, rootType, reinterpret_cast<const VkPipelineViewportCoarseSampleOrderStateCreateInfoNV*>(structExtension), reinterpret_cast<VkPipelineViewportCoarseSampleOrderStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV: {
+            deepcopy_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(
+                alloc, rootType,
+                reinterpret_cast<const VkPipelineViewportCoarseSampleOrderStateCreateInfoNV*>(
+                    structExtension),
+                reinterpret_cast<VkPipelineViewportCoarseSampleOrderStateCreateInfoNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_ray_tracing
-        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV:
-        {
-            deepcopy_VkWriteDescriptorSetAccelerationStructureNV(alloc, rootType, reinterpret_cast<const VkWriteDescriptorSetAccelerationStructureNV*>(structExtension), reinterpret_cast<VkWriteDescriptorSetAccelerationStructureNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV: {
+            deepcopy_VkWriteDescriptorSetAccelerationStructureNV(
+                alloc, rootType,
+                reinterpret_cast<const VkWriteDescriptorSetAccelerationStructureNV*>(
+                    structExtension),
+                reinterpret_cast<VkWriteDescriptorSetAccelerationStructureNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV:
-        {
-            deepcopy_VkPhysicalDeviceRayTracingPropertiesNV(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceRayTracingPropertiesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceRayTracingPropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV: {
+            deepcopy_VkPhysicalDeviceRayTracingPropertiesNV(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceRayTracingPropertiesNV*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceRayTracingPropertiesNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_representative_fragment_test
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV:
-        {
-            deepcopy_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV: {
+            deepcopy_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV:
-        {
-            deepcopy_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(alloc, rootType, reinterpret_cast<const VkPipelineRepresentativeFragmentTestStateCreateInfoNV*>(structExtension), reinterpret_cast<VkPipelineRepresentativeFragmentTestStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV: {
+            deepcopy_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(
+                alloc, rootType,
+                reinterpret_cast<const VkPipelineRepresentativeFragmentTestStateCreateInfoNV*>(
+                    structExtension),
+                reinterpret_cast<VkPipelineRepresentativeFragmentTestStateCreateInfoNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_filter_cubic
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT:
-        {
-            deepcopy_VkPhysicalDeviceImageViewImageFormatInfoEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceImageViewImageFormatInfoEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceImageViewImageFormatInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT: {
+            deepcopy_VkPhysicalDeviceImageViewImageFormatInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceImageViewImageFormatInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceImageViewImageFormatInfoEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT:
-        {
-            deepcopy_VkFilterCubicImageViewImageFormatPropertiesEXT(alloc, rootType, reinterpret_cast<const VkFilterCubicImageViewImageFormatPropertiesEXT*>(structExtension), reinterpret_cast<VkFilterCubicImageViewImageFormatPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT: {
+            deepcopy_VkFilterCubicImageViewImageFormatPropertiesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkFilterCubicImageViewImageFormatPropertiesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkFilterCubicImageViewImageFormatPropertiesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_global_priority
-        case VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT:
-        {
-            deepcopy_VkDeviceQueueGlobalPriorityCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkDeviceQueueGlobalPriorityCreateInfoEXT*>(structExtension), reinterpret_cast<VkDeviceQueueGlobalPriorityCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT: {
+            deepcopy_VkDeviceQueueGlobalPriorityCreateInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkDeviceQueueGlobalPriorityCreateInfoEXT*>(structExtension),
+                reinterpret_cast<VkDeviceQueueGlobalPriorityCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_external_memory_host
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT:
-        {
-            deepcopy_VkImportMemoryHostPointerInfoEXT(alloc, rootType, reinterpret_cast<const VkImportMemoryHostPointerInfoEXT*>(structExtension), reinterpret_cast<VkImportMemoryHostPointerInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT: {
+            deepcopy_VkImportMemoryHostPointerInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkImportMemoryHostPointerInfoEXT*>(structExtension),
+                reinterpret_cast<VkImportMemoryHostPointerInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceExternalMemoryHostPropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceExternalMemoryHostPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT: {
+            deepcopy_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceExternalMemoryHostPropertiesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceExternalMemoryHostPropertiesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_pipeline_compiler_control
-        case VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD:
-        {
-            deepcopy_VkPipelineCompilerControlCreateInfoAMD(alloc, rootType, reinterpret_cast<const VkPipelineCompilerControlCreateInfoAMD*>(structExtension), reinterpret_cast<VkPipelineCompilerControlCreateInfoAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD: {
+            deepcopy_VkPipelineCompilerControlCreateInfoAMD(
+                alloc, rootType,
+                reinterpret_cast<const VkPipelineCompilerControlCreateInfoAMD*>(structExtension),
+                reinterpret_cast<VkPipelineCompilerControlCreateInfoAMD*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_shader_core_properties
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD:
-        {
-            deepcopy_VkPhysicalDeviceShaderCorePropertiesAMD(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceShaderCorePropertiesAMD*>(structExtension), reinterpret_cast<VkPhysicalDeviceShaderCorePropertiesAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD: {
+            deepcopy_VkPhysicalDeviceShaderCorePropertiesAMD(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShaderCorePropertiesAMD*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceShaderCorePropertiesAMD*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_video_decode_h265
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_EXT:
-        {
-            deepcopy_VkVideoDecodeH265ProfileEXT(alloc, rootType, reinterpret_cast<const VkVideoDecodeH265ProfileEXT*>(structExtension), reinterpret_cast<VkVideoDecodeH265ProfileEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_EXT: {
+            deepcopy_VkVideoDecodeH265ProfileEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkVideoDecodeH265ProfileEXT*>(structExtension),
+                reinterpret_cast<VkVideoDecodeH265ProfileEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT:
-        {
-            deepcopy_VkVideoDecodeH265CapabilitiesEXT(alloc, rootType, reinterpret_cast<const VkVideoDecodeH265CapabilitiesEXT*>(structExtension), reinterpret_cast<VkVideoDecodeH265CapabilitiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT: {
+            deepcopy_VkVideoDecodeH265CapabilitiesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkVideoDecodeH265CapabilitiesEXT*>(structExtension),
+                reinterpret_cast<VkVideoDecodeH265CapabilitiesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_CREATE_INFO_EXT:
-        {
-            deepcopy_VkVideoDecodeH265SessionCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkVideoDecodeH265SessionCreateInfoEXT*>(structExtension), reinterpret_cast<VkVideoDecodeH265SessionCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_CREATE_INFO_EXT: {
+            deepcopy_VkVideoDecodeH265SessionCreateInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkVideoDecodeH265SessionCreateInfoEXT*>(structExtension),
+                reinterpret_cast<VkVideoDecodeH265SessionCreateInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
-            deepcopy_VkVideoDecodeH265SessionParametersAddInfoEXT(alloc, rootType, reinterpret_cast<const VkVideoDecodeH265SessionParametersAddInfoEXT*>(structExtension), reinterpret_cast<VkVideoDecodeH265SessionParametersAddInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT: {
+            deepcopy_VkVideoDecodeH265SessionParametersAddInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkVideoDecodeH265SessionParametersAddInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<VkVideoDecodeH265SessionParametersAddInfoEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
-            deepcopy_VkVideoDecodeH265SessionParametersCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkVideoDecodeH265SessionParametersCreateInfoEXT*>(structExtension), reinterpret_cast<VkVideoDecodeH265SessionParametersCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT: {
+            deepcopy_VkVideoDecodeH265SessionParametersCreateInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkVideoDecodeH265SessionParametersCreateInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<VkVideoDecodeH265SessionParametersCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT:
-        {
-            deepcopy_VkVideoDecodeH265PictureInfoEXT(alloc, rootType, reinterpret_cast<const VkVideoDecodeH265PictureInfoEXT*>(structExtension), reinterpret_cast<VkVideoDecodeH265PictureInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT: {
+            deepcopy_VkVideoDecodeH265PictureInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkVideoDecodeH265PictureInfoEXT*>(structExtension),
+                reinterpret_cast<VkVideoDecodeH265PictureInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT:
-        {
-            deepcopy_VkVideoDecodeH265DpbSlotInfoEXT(alloc, rootType, reinterpret_cast<const VkVideoDecodeH265DpbSlotInfoEXT*>(structExtension), reinterpret_cast<VkVideoDecodeH265DpbSlotInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT: {
+            deepcopy_VkVideoDecodeH265DpbSlotInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkVideoDecodeH265DpbSlotInfoEXT*>(structExtension),
+                reinterpret_cast<VkVideoDecodeH265DpbSlotInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_memory_overallocation_behavior
-        case VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD:
-        {
-            deepcopy_VkDeviceMemoryOverallocationCreateInfoAMD(alloc, rootType, reinterpret_cast<const VkDeviceMemoryOverallocationCreateInfoAMD*>(structExtension), reinterpret_cast<VkDeviceMemoryOverallocationCreateInfoAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD: {
+            deepcopy_VkDeviceMemoryOverallocationCreateInfoAMD(
+                alloc, rootType,
+                reinterpret_cast<const VkDeviceMemoryOverallocationCreateInfoAMD*>(structExtension),
+                reinterpret_cast<VkDeviceMemoryOverallocationCreateInfoAMD*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_vertex_attribute_divisor
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT: {
+            deepcopy_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT:
-        {
-            deepcopy_VkPipelineVertexInputDivisorStateCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkPipelineVertexInputDivisorStateCreateInfoEXT*>(structExtension), reinterpret_cast<VkPipelineVertexInputDivisorStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT: {
+            deepcopy_VkPipelineVertexInputDivisorStateCreateInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPipelineVertexInputDivisorStateCreateInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPipelineVertexInputDivisorStateCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: {
+            deepcopy_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_GGP_frame_token
-        case VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP:
-        {
-            deepcopy_VkPresentFrameTokenGGP(alloc, rootType, reinterpret_cast<const VkPresentFrameTokenGGP*>(structExtension), reinterpret_cast<VkPresentFrameTokenGGP*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP: {
+            deepcopy_VkPresentFrameTokenGGP(
+                alloc, rootType, reinterpret_cast<const VkPresentFrameTokenGGP*>(structExtension),
+                reinterpret_cast<VkPresentFrameTokenGGP*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_pipeline_creation_feedback
-        case VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT:
-        {
-            deepcopy_VkPipelineCreationFeedbackCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkPipelineCreationFeedbackCreateInfoEXT*>(structExtension), reinterpret_cast<VkPipelineCreationFeedbackCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT: {
+            deepcopy_VkPipelineCreationFeedbackCreateInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPipelineCreationFeedbackCreateInfoEXT*>(structExtension),
+                reinterpret_cast<VkPipelineCreationFeedbackCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_compute_shader_derivatives
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV:
-        {
-            deepcopy_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceComputeShaderDerivativesFeaturesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceComputeShaderDerivativesFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV: {
+            deepcopy_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceComputeShaderDerivativesFeaturesNV*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceComputeShaderDerivativesFeaturesNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_mesh_shader
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV:
-        {
-            deepcopy_VkPhysicalDeviceMeshShaderFeaturesNV(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceMeshShaderFeaturesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceMeshShaderFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV: {
+            deepcopy_VkPhysicalDeviceMeshShaderFeaturesNV(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceMeshShaderFeaturesNV*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceMeshShaderFeaturesNV*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV:
-        {
-            deepcopy_VkPhysicalDeviceMeshShaderPropertiesNV(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceMeshShaderPropertiesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceMeshShaderPropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV: {
+            deepcopy_VkPhysicalDeviceMeshShaderPropertiesNV(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceMeshShaderPropertiesNV*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceMeshShaderPropertiesNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_fragment_shader_barycentric
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV:
-        {
-            deepcopy_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV: {
+            deepcopy_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_shader_image_footprint
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV:
-        {
-            deepcopy_VkPhysicalDeviceShaderImageFootprintFeaturesNV(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceShaderImageFootprintFeaturesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceShaderImageFootprintFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV: {
+            deepcopy_VkPhysicalDeviceShaderImageFootprintFeaturesNV(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShaderImageFootprintFeaturesNV*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceShaderImageFootprintFeaturesNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_scissor_exclusive
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV:
-        {
-            deepcopy_VkPipelineViewportExclusiveScissorStateCreateInfoNV(alloc, rootType, reinterpret_cast<const VkPipelineViewportExclusiveScissorStateCreateInfoNV*>(structExtension), reinterpret_cast<VkPipelineViewportExclusiveScissorStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV: {
+            deepcopy_VkPipelineViewportExclusiveScissorStateCreateInfoNV(
+                alloc, rootType,
+                reinterpret_cast<const VkPipelineViewportExclusiveScissorStateCreateInfoNV*>(
+                    structExtension),
+                reinterpret_cast<VkPipelineViewportExclusiveScissorStateCreateInfoNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV:
-        {
-            deepcopy_VkPhysicalDeviceExclusiveScissorFeaturesNV(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceExclusiveScissorFeaturesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceExclusiveScissorFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV: {
+            deepcopy_VkPhysicalDeviceExclusiveScissorFeaturesNV(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceExclusiveScissorFeaturesNV*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceExclusiveScissorFeaturesNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
-        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV:
-        {
-            deepcopy_VkQueueFamilyCheckpointPropertiesNV(alloc, rootType, reinterpret_cast<const VkQueueFamilyCheckpointPropertiesNV*>(structExtension), reinterpret_cast<VkQueueFamilyCheckpointPropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV: {
+            deepcopy_VkQueueFamilyCheckpointPropertiesNV(
+                alloc, rootType,
+                reinterpret_cast<const VkQueueFamilyCheckpointPropertiesNV*>(structExtension),
+                reinterpret_cast<VkQueueFamilyCheckpointPropertiesNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_INTEL_shader_integer_functions2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL:
-        {
-            deepcopy_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL*>(structExtension), reinterpret_cast<VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL: {
+            deepcopy_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_INTEL_performance_query
-        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL:
-        {
-            deepcopy_VkQueryPoolPerformanceQueryCreateInfoINTEL(alloc, rootType, reinterpret_cast<const VkQueryPoolPerformanceQueryCreateInfoINTEL*>(structExtension), reinterpret_cast<VkQueryPoolPerformanceQueryCreateInfoINTEL*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL: {
+            deepcopy_VkQueryPoolPerformanceQueryCreateInfoINTEL(
+                alloc, rootType,
+                reinterpret_cast<const VkQueryPoolPerformanceQueryCreateInfoINTEL*>(
+                    structExtension),
+                reinterpret_cast<VkQueryPoolPerformanceQueryCreateInfoINTEL*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_pci_bus_info
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT:
-        {
-            deepcopy_VkPhysicalDevicePCIBusInfoPropertiesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDevicePCIBusInfoPropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDevicePCIBusInfoPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT: {
+            deepcopy_VkPhysicalDevicePCIBusInfoPropertiesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDevicePCIBusInfoPropertiesEXT*>(structExtension),
+                reinterpret_cast<VkPhysicalDevicePCIBusInfoPropertiesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_display_native_hdr
-        case VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD:
-        {
-            deepcopy_VkDisplayNativeHdrSurfaceCapabilitiesAMD(alloc, rootType, reinterpret_cast<const VkDisplayNativeHdrSurfaceCapabilitiesAMD*>(structExtension), reinterpret_cast<VkDisplayNativeHdrSurfaceCapabilitiesAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD: {
+            deepcopy_VkDisplayNativeHdrSurfaceCapabilitiesAMD(
+                alloc, rootType,
+                reinterpret_cast<const VkDisplayNativeHdrSurfaceCapabilitiesAMD*>(structExtension),
+                reinterpret_cast<VkDisplayNativeHdrSurfaceCapabilitiesAMD*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD:
-        {
-            deepcopy_VkSwapchainDisplayNativeHdrCreateInfoAMD(alloc, rootType, reinterpret_cast<const VkSwapchainDisplayNativeHdrCreateInfoAMD*>(structExtension), reinterpret_cast<VkSwapchainDisplayNativeHdrCreateInfoAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD: {
+            deepcopy_VkSwapchainDisplayNativeHdrCreateInfoAMD(
+                alloc, rootType,
+                reinterpret_cast<const VkSwapchainDisplayNativeHdrCreateInfoAMD*>(structExtension),
+                reinterpret_cast<VkSwapchainDisplayNativeHdrCreateInfoAMD*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_fragment_density_map
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT:
-        {
-            switch(rootType)
-            {
-                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2:
-                {
-                    deepcopy_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT: {
+            switch (rootType) {
+                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2: {
+                    deepcopy_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
+                        alloc, rootType,
+                        reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(
+                            structExtension),
+                        reinterpret_cast<VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(
+                            structExtension_out));
                     break;
                 }
-                case VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO:
-                {
-                    deepcopy_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(structExtension_out));
+                case VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO: {
+                    deepcopy_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
+                        alloc, rootType,
+                        reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(
+                            structExtension),
+                        reinterpret_cast<VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(
+                            structExtension_out));
                     break;
                 }
-                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO:
-                {
-                    deepcopy_VkImportColorBufferGOOGLE(alloc, rootType, reinterpret_cast<const VkImportColorBufferGOOGLE*>(structExtension), reinterpret_cast<VkImportColorBufferGOOGLE*>(structExtension_out));
+                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO: {
+                    deepcopy_VkImportColorBufferGOOGLE(
+                        alloc, rootType,
+                        reinterpret_cast<const VkImportColorBufferGOOGLE*>(structExtension),
+                        reinterpret_cast<VkImportColorBufferGOOGLE*>(structExtension_out));
                     break;
                 }
-                default:
-                {
-                    deepcopy_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(structExtension_out));
+                default: {
+                    deepcopy_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
+                        alloc, rootType,
+                        reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(
+                            structExtension),
+                        reinterpret_cast<VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(
+                            structExtension_out));
                     break;
                 }
             }
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT:
-        {
-            switch(rootType)
-            {
-                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2:
-                {
-                    deepcopy_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT: {
+            switch (rootType) {
+                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2: {
+                    deepcopy_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
+                        alloc, rootType,
+                        reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(
+                            structExtension),
+                        reinterpret_cast<VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(
+                            structExtension_out));
                     break;
                 }
-                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO:
-                {
-                    deepcopy_VkImportPhysicalAddressGOOGLE(alloc, rootType, reinterpret_cast<const VkImportPhysicalAddressGOOGLE*>(structExtension), reinterpret_cast<VkImportPhysicalAddressGOOGLE*>(structExtension_out));
+                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO: {
+                    deepcopy_VkImportPhysicalAddressGOOGLE(
+                        alloc, rootType,
+                        reinterpret_cast<const VkImportPhysicalAddressGOOGLE*>(structExtension),
+                        reinterpret_cast<VkImportPhysicalAddressGOOGLE*>(structExtension_out));
                     break;
                 }
-                default:
-                {
-                    deepcopy_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(structExtension_out));
+                default: {
+                    deepcopy_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
+                        alloc, rootType,
+                        reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(
+                            structExtension),
+                        reinterpret_cast<VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(
+                            structExtension_out));
                     break;
                 }
             }
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT:
-        {
-            switch(rootType)
-            {
-                case VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO:
-                {
-                    deepcopy_VkRenderPassFragmentDensityMapCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkRenderPassFragmentDensityMapCreateInfoEXT*>(structExtension), reinterpret_cast<VkRenderPassFragmentDensityMapCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT: {
+            switch (rootType) {
+                case VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO: {
+                    deepcopy_VkRenderPassFragmentDensityMapCreateInfoEXT(
+                        alloc, rootType,
+                        reinterpret_cast<const VkRenderPassFragmentDensityMapCreateInfoEXT*>(
+                            structExtension),
+                        reinterpret_cast<VkRenderPassFragmentDensityMapCreateInfoEXT*>(
+                            structExtension_out));
                     break;
                 }
-                case VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2:
-                {
-                    deepcopy_VkRenderPassFragmentDensityMapCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkRenderPassFragmentDensityMapCreateInfoEXT*>(structExtension), reinterpret_cast<VkRenderPassFragmentDensityMapCreateInfoEXT*>(structExtension_out));
+                case VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2: {
+                    deepcopy_VkRenderPassFragmentDensityMapCreateInfoEXT(
+                        alloc, rootType,
+                        reinterpret_cast<const VkRenderPassFragmentDensityMapCreateInfoEXT*>(
+                            structExtension),
+                        reinterpret_cast<VkRenderPassFragmentDensityMapCreateInfoEXT*>(
+                            structExtension_out));
                     break;
                 }
-                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO:
-                {
-                    deepcopy_VkImportBufferGOOGLE(alloc, rootType, reinterpret_cast<const VkImportBufferGOOGLE*>(structExtension), reinterpret_cast<VkImportBufferGOOGLE*>(structExtension_out));
+                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO: {
+                    deepcopy_VkImportBufferGOOGLE(
+                        alloc, rootType,
+                        reinterpret_cast<const VkImportBufferGOOGLE*>(structExtension),
+                        reinterpret_cast<VkImportBufferGOOGLE*>(structExtension_out));
                     break;
                 }
-                default:
-                {
-                    deepcopy_VkRenderPassFragmentDensityMapCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkRenderPassFragmentDensityMapCreateInfoEXT*>(structExtension), reinterpret_cast<VkRenderPassFragmentDensityMapCreateInfoEXT*>(structExtension_out));
+                default: {
+                    deepcopy_VkRenderPassFragmentDensityMapCreateInfoEXT(
+                        alloc, rootType,
+                        reinterpret_cast<const VkRenderPassFragmentDensityMapCreateInfoEXT*>(
+                            structExtension),
+                        reinterpret_cast<VkRenderPassFragmentDensityMapCreateInfoEXT*>(
+                            structExtension_out));
                     break;
                 }
             }
@@ -23225,627 +20114,947 @@
         }
 #endif
 #ifdef VK_EXT_subgroup_size_control
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceSubgroupSizeControlFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT: {
+            deepcopy_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceSubgroupSizeControlFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceSubgroupSizeControlPropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceSubgroupSizeControlPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT: {
+            deepcopy_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceSubgroupSizeControlPropertiesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceSubgroupSizeControlPropertiesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT:
-        {
-            deepcopy_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT*>(structExtension), reinterpret_cast<VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT: {
+            deepcopy_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_shader_core_properties2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD:
-        {
-            deepcopy_VkPhysicalDeviceShaderCoreProperties2AMD(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceShaderCoreProperties2AMD*>(structExtension), reinterpret_cast<VkPhysicalDeviceShaderCoreProperties2AMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD: {
+            deepcopy_VkPhysicalDeviceShaderCoreProperties2AMD(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShaderCoreProperties2AMD*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceShaderCoreProperties2AMD*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_device_coherent_memory
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD:
-        {
-            deepcopy_VkPhysicalDeviceCoherentMemoryFeaturesAMD(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceCoherentMemoryFeaturesAMD*>(structExtension), reinterpret_cast<VkPhysicalDeviceCoherentMemoryFeaturesAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD: {
+            deepcopy_VkPhysicalDeviceCoherentMemoryFeaturesAMD(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceCoherentMemoryFeaturesAMD*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceCoherentMemoryFeaturesAMD*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_shader_image_atomic_int64
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT: {
+            deepcopy_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_memory_budget
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceMemoryBudgetPropertiesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceMemoryBudgetPropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceMemoryBudgetPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT: {
+            deepcopy_VkPhysicalDeviceMemoryBudgetPropertiesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceMemoryBudgetPropertiesEXT*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceMemoryBudgetPropertiesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_memory_priority
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceMemoryPriorityFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceMemoryPriorityFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceMemoryPriorityFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT: {
+            deepcopy_VkPhysicalDeviceMemoryPriorityFeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceMemoryPriorityFeaturesEXT*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceMemoryPriorityFeaturesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT:
-        {
-            deepcopy_VkMemoryPriorityAllocateInfoEXT(alloc, rootType, reinterpret_cast<const VkMemoryPriorityAllocateInfoEXT*>(structExtension), reinterpret_cast<VkMemoryPriorityAllocateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT: {
+            deepcopy_VkMemoryPriorityAllocateInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkMemoryPriorityAllocateInfoEXT*>(structExtension),
+                reinterpret_cast<VkMemoryPriorityAllocateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_dedicated_allocation_image_aliasing
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV:
-        {
-            deepcopy_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV: {
+            deepcopy_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_buffer_device_address
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceBufferDeviceAddressFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT: {
+            deepcopy_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceBufferDeviceAddressFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT:
-        {
-            deepcopy_VkBufferDeviceAddressCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkBufferDeviceAddressCreateInfoEXT*>(structExtension), reinterpret_cast<VkBufferDeviceAddressCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT: {
+            deepcopy_VkBufferDeviceAddressCreateInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkBufferDeviceAddressCreateInfoEXT*>(structExtension),
+                reinterpret_cast<VkBufferDeviceAddressCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_validation_features
-        case VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT:
-        {
-            deepcopy_VkValidationFeaturesEXT(alloc, rootType, reinterpret_cast<const VkValidationFeaturesEXT*>(structExtension), reinterpret_cast<VkValidationFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT: {
+            deepcopy_VkValidationFeaturesEXT(
+                alloc, rootType, reinterpret_cast<const VkValidationFeaturesEXT*>(structExtension),
+                reinterpret_cast<VkValidationFeaturesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_cooperative_matrix
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV:
-        {
-            deepcopy_VkPhysicalDeviceCooperativeMatrixFeaturesNV(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceCooperativeMatrixFeaturesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceCooperativeMatrixFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV: {
+            deepcopy_VkPhysicalDeviceCooperativeMatrixFeaturesNV(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceCooperativeMatrixFeaturesNV*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceCooperativeMatrixFeaturesNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV:
-        {
-            deepcopy_VkPhysicalDeviceCooperativeMatrixPropertiesNV(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceCooperativeMatrixPropertiesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceCooperativeMatrixPropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV: {
+            deepcopy_VkPhysicalDeviceCooperativeMatrixPropertiesNV(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceCooperativeMatrixPropertiesNV*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceCooperativeMatrixPropertiesNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_coverage_reduction_mode
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV:
-        {
-            deepcopy_VkPhysicalDeviceCoverageReductionModeFeaturesNV(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceCoverageReductionModeFeaturesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceCoverageReductionModeFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV: {
+            deepcopy_VkPhysicalDeviceCoverageReductionModeFeaturesNV(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceCoverageReductionModeFeaturesNV*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceCoverageReductionModeFeaturesNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV:
-        {
-            deepcopy_VkPipelineCoverageReductionStateCreateInfoNV(alloc, rootType, reinterpret_cast<const VkPipelineCoverageReductionStateCreateInfoNV*>(structExtension), reinterpret_cast<VkPipelineCoverageReductionStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV: {
+            deepcopy_VkPipelineCoverageReductionStateCreateInfoNV(
+                alloc, rootType,
+                reinterpret_cast<const VkPipelineCoverageReductionStateCreateInfoNV*>(
+                    structExtension),
+                reinterpret_cast<VkPipelineCoverageReductionStateCreateInfoNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_fragment_shader_interlock
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT: {
+            deepcopy_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_ycbcr_image_arrays
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT: {
+            deepcopy_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_provoking_vertex
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceProvokingVertexFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceProvokingVertexFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceProvokingVertexFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT: {
+            deepcopy_VkPhysicalDeviceProvokingVertexFeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceProvokingVertexFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceProvokingVertexFeaturesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_PROPERTIES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceProvokingVertexPropertiesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceProvokingVertexPropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceProvokingVertexPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_PROPERTIES_EXT: {
+            deepcopy_VkPhysicalDeviceProvokingVertexPropertiesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceProvokingVertexPropertiesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceProvokingVertexPropertiesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT:
-        {
-            deepcopy_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkPipelineRasterizationProvokingVertexStateCreateInfoEXT*>(structExtension), reinterpret_cast<VkPipelineRasterizationProvokingVertexStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT: {
+            deepcopy_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPipelineRasterizationProvokingVertexStateCreateInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPipelineRasterizationProvokingVertexStateCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_full_screen_exclusive
-        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT:
-        {
-            deepcopy_VkSurfaceFullScreenExclusiveInfoEXT(alloc, rootType, reinterpret_cast<const VkSurfaceFullScreenExclusiveInfoEXT*>(structExtension), reinterpret_cast<VkSurfaceFullScreenExclusiveInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT: {
+            deepcopy_VkSurfaceFullScreenExclusiveInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkSurfaceFullScreenExclusiveInfoEXT*>(structExtension),
+                reinterpret_cast<VkSurfaceFullScreenExclusiveInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT:
-        {
-            deepcopy_VkSurfaceCapabilitiesFullScreenExclusiveEXT(alloc, rootType, reinterpret_cast<const VkSurfaceCapabilitiesFullScreenExclusiveEXT*>(structExtension), reinterpret_cast<VkSurfaceCapabilitiesFullScreenExclusiveEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT: {
+            deepcopy_VkSurfaceCapabilitiesFullScreenExclusiveEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkSurfaceCapabilitiesFullScreenExclusiveEXT*>(
+                    structExtension),
+                reinterpret_cast<VkSurfaceCapabilitiesFullScreenExclusiveEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT:
-        {
-            deepcopy_VkSurfaceFullScreenExclusiveWin32InfoEXT(alloc, rootType, reinterpret_cast<const VkSurfaceFullScreenExclusiveWin32InfoEXT*>(structExtension), reinterpret_cast<VkSurfaceFullScreenExclusiveWin32InfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT: {
+            deepcopy_VkSurfaceFullScreenExclusiveWin32InfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkSurfaceFullScreenExclusiveWin32InfoEXT*>(structExtension),
+                reinterpret_cast<VkSurfaceFullScreenExclusiveWin32InfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_line_rasterization
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceLineRasterizationFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceLineRasterizationFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceLineRasterizationFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT: {
+            deepcopy_VkPhysicalDeviceLineRasterizationFeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceLineRasterizationFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceLineRasterizationFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceLineRasterizationPropertiesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceLineRasterizationPropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceLineRasterizationPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT: {
+            deepcopy_VkPhysicalDeviceLineRasterizationPropertiesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceLineRasterizationPropertiesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceLineRasterizationPropertiesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT:
-        {
-            deepcopy_VkPipelineRasterizationLineStateCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkPipelineRasterizationLineStateCreateInfoEXT*>(structExtension), reinterpret_cast<VkPipelineRasterizationLineStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT: {
+            deepcopy_VkPipelineRasterizationLineStateCreateInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPipelineRasterizationLineStateCreateInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPipelineRasterizationLineStateCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_shader_atomic_float
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT: {
+            deepcopy_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_index_type_uint8
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceIndexTypeUint8FeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceIndexTypeUint8FeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT: {
+            deepcopy_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceIndexTypeUint8FeaturesEXT*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceIndexTypeUint8FeaturesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT: {
+            deepcopy_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_shader_atomic_float2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT: {
+            deepcopy_VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT: {
+            deepcopy_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_device_generated_commands
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV:
-        {
-            deepcopy_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV: {
+            deepcopy_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV:
-        {
-            deepcopy_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV: {
+            deepcopy_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV:
-        {
-            deepcopy_VkGraphicsPipelineShaderGroupsCreateInfoNV(alloc, rootType, reinterpret_cast<const VkGraphicsPipelineShaderGroupsCreateInfoNV*>(structExtension), reinterpret_cast<VkGraphicsPipelineShaderGroupsCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV: {
+            deepcopy_VkGraphicsPipelineShaderGroupsCreateInfoNV(
+                alloc, rootType,
+                reinterpret_cast<const VkGraphicsPipelineShaderGroupsCreateInfoNV*>(
+                    structExtension),
+                reinterpret_cast<VkGraphicsPipelineShaderGroupsCreateInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_inherited_viewport_scissor
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV:
-        {
-            deepcopy_VkPhysicalDeviceInheritedViewportScissorFeaturesNV(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceInheritedViewportScissorFeaturesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceInheritedViewportScissorFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV: {
+            deepcopy_VkPhysicalDeviceInheritedViewportScissorFeaturesNV(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceInheritedViewportScissorFeaturesNV*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceInheritedViewportScissorFeaturesNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_VIEWPORT_SCISSOR_INFO_NV:
-        {
-            deepcopy_VkCommandBufferInheritanceViewportScissorInfoNV(alloc, rootType, reinterpret_cast<const VkCommandBufferInheritanceViewportScissorInfoNV*>(structExtension), reinterpret_cast<VkCommandBufferInheritanceViewportScissorInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_VIEWPORT_SCISSOR_INFO_NV: {
+            deepcopy_VkCommandBufferInheritanceViewportScissorInfoNV(
+                alloc, rootType,
+                reinterpret_cast<const VkCommandBufferInheritanceViewportScissorInfoNV*>(
+                    structExtension),
+                reinterpret_cast<VkCommandBufferInheritanceViewportScissorInfoNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_texel_buffer_alignment
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: {
+            deepcopy_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT: {
+            deepcopy_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_QCOM_render_pass_transform
-        case VK_STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM:
-        {
-            deepcopy_VkRenderPassTransformBeginInfoQCOM(alloc, rootType, reinterpret_cast<const VkRenderPassTransformBeginInfoQCOM*>(structExtension), reinterpret_cast<VkRenderPassTransformBeginInfoQCOM*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM: {
+            deepcopy_VkRenderPassTransformBeginInfoQCOM(
+                alloc, rootType,
+                reinterpret_cast<const VkRenderPassTransformBeginInfoQCOM*>(structExtension),
+                reinterpret_cast<VkRenderPassTransformBeginInfoQCOM*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM:
-        {
-            deepcopy_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(alloc, rootType, reinterpret_cast<const VkCommandBufferInheritanceRenderPassTransformInfoQCOM*>(structExtension), reinterpret_cast<VkCommandBufferInheritanceRenderPassTransformInfoQCOM*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM: {
+            deepcopy_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(
+                alloc, rootType,
+                reinterpret_cast<const VkCommandBufferInheritanceRenderPassTransformInfoQCOM*>(
+                    structExtension),
+                reinterpret_cast<VkCommandBufferInheritanceRenderPassTransformInfoQCOM*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_device_memory_report
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceDeviceMemoryReportFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT: {
+            deepcopy_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceDeviceMemoryReportFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT:
-        {
-            deepcopy_VkDeviceDeviceMemoryReportCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkDeviceDeviceMemoryReportCreateInfoEXT*>(structExtension), reinterpret_cast<VkDeviceDeviceMemoryReportCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT: {
+            deepcopy_VkDeviceDeviceMemoryReportCreateInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkDeviceDeviceMemoryReportCreateInfoEXT*>(structExtension),
+                reinterpret_cast<VkDeviceDeviceMemoryReportCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_robustness2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceRobustness2FeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceRobustness2FeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceRobustness2FeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT: {
+            deepcopy_VkPhysicalDeviceRobustness2FeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceRobustness2FeaturesEXT*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceRobustness2FeaturesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceRobustness2PropertiesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceRobustness2PropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceRobustness2PropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT: {
+            deepcopy_VkPhysicalDeviceRobustness2PropertiesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceRobustness2PropertiesEXT*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceRobustness2PropertiesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_custom_border_color
-        case VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT:
-        {
-            deepcopy_VkSamplerCustomBorderColorCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkSamplerCustomBorderColorCreateInfoEXT*>(structExtension), reinterpret_cast<VkSamplerCustomBorderColorCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT: {
+            deepcopy_VkSamplerCustomBorderColorCreateInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkSamplerCustomBorderColorCreateInfoEXT*>(structExtension),
+                reinterpret_cast<VkSamplerCustomBorderColorCreateInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceCustomBorderColorPropertiesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceCustomBorderColorPropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceCustomBorderColorPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT: {
+            deepcopy_VkPhysicalDeviceCustomBorderColorPropertiesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceCustomBorderColorPropertiesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceCustomBorderColorPropertiesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceCustomBorderColorFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceCustomBorderColorFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceCustomBorderColorFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT: {
+            deepcopy_VkPhysicalDeviceCustomBorderColorFeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceCustomBorderColorFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceCustomBorderColorFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_private_data
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDevicePrivateDataFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDevicePrivateDataFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDevicePrivateDataFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT: {
+            deepcopy_VkPhysicalDevicePrivateDataFeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDevicePrivateDataFeaturesEXT*>(structExtension),
+                reinterpret_cast<VkPhysicalDevicePrivateDataFeaturesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT:
-        {
-            deepcopy_VkDevicePrivateDataCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkDevicePrivateDataCreateInfoEXT*>(structExtension), reinterpret_cast<VkDevicePrivateDataCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT: {
+            deepcopy_VkDevicePrivateDataCreateInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkDevicePrivateDataCreateInfoEXT*>(structExtension),
+                reinterpret_cast<VkDevicePrivateDataCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_pipeline_creation_cache_control
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT: {
+            deepcopy_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_device_diagnostics_config
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV:
-        {
-            deepcopy_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceDiagnosticsConfigFeaturesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceDiagnosticsConfigFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV: {
+            deepcopy_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceDiagnosticsConfigFeaturesNV*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceDiagnosticsConfigFeaturesNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV:
-        {
-            deepcopy_VkDeviceDiagnosticsConfigCreateInfoNV(alloc, rootType, reinterpret_cast<const VkDeviceDiagnosticsConfigCreateInfoNV*>(structExtension), reinterpret_cast<VkDeviceDiagnosticsConfigCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV: {
+            deepcopy_VkDeviceDiagnosticsConfigCreateInfoNV(
+                alloc, rootType,
+                reinterpret_cast<const VkDeviceDiagnosticsConfigCreateInfoNV*>(structExtension),
+                reinterpret_cast<VkDeviceDiagnosticsConfigCreateInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_fragment_shading_rate_enums
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV:
-        {
-            deepcopy_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV: {
+            deepcopy_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV:
-        {
-            deepcopy_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV: {
+            deepcopy_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV:
-        {
-            deepcopy_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(alloc, rootType, reinterpret_cast<const VkPipelineFragmentShadingRateEnumStateCreateInfoNV*>(structExtension), reinterpret_cast<VkPipelineFragmentShadingRateEnumStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV: {
+            deepcopy_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(
+                alloc, rootType,
+                reinterpret_cast<const VkPipelineFragmentShadingRateEnumStateCreateInfoNV*>(
+                    structExtension),
+                reinterpret_cast<VkPipelineFragmentShadingRateEnumStateCreateInfoNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_ray_tracing_motion_blur
-        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_MOTION_TRIANGLES_DATA_NV:
-        {
-            deepcopy_VkAccelerationStructureGeometryMotionTrianglesDataNV(alloc, rootType, reinterpret_cast<const VkAccelerationStructureGeometryMotionTrianglesDataNV*>(structExtension), reinterpret_cast<VkAccelerationStructureGeometryMotionTrianglesDataNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_MOTION_TRIANGLES_DATA_NV: {
+            deepcopy_VkAccelerationStructureGeometryMotionTrianglesDataNV(
+                alloc, rootType,
+                reinterpret_cast<const VkAccelerationStructureGeometryMotionTrianglesDataNV*>(
+                    structExtension),
+                reinterpret_cast<VkAccelerationStructureGeometryMotionTrianglesDataNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MOTION_INFO_NV:
-        {
-            deepcopy_VkAccelerationStructureMotionInfoNV(alloc, rootType, reinterpret_cast<const VkAccelerationStructureMotionInfoNV*>(structExtension), reinterpret_cast<VkAccelerationStructureMotionInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MOTION_INFO_NV: {
+            deepcopy_VkAccelerationStructureMotionInfoNV(
+                alloc, rootType,
+                reinterpret_cast<const VkAccelerationStructureMotionInfoNV*>(structExtension),
+                reinterpret_cast<VkAccelerationStructureMotionInfoNV*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV:
-        {
-            deepcopy_VkPhysicalDeviceRayTracingMotionBlurFeaturesNV(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceRayTracingMotionBlurFeaturesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceRayTracingMotionBlurFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV: {
+            deepcopy_VkPhysicalDeviceRayTracingMotionBlurFeaturesNV(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceRayTracingMotionBlurFeaturesNV*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceRayTracingMotionBlurFeaturesNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_ycbcr_2plane_444_formats
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT: {
+            deepcopy_VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_fragment_density_map2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2FeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT: {
+            deepcopy_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2FeaturesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2PropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT: {
+            deepcopy_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2PropertiesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_QCOM_rotated_copy_commands
-        case VK_STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM:
-        {
-            deepcopy_VkCopyCommandTransformInfoQCOM(alloc, rootType, reinterpret_cast<const VkCopyCommandTransformInfoQCOM*>(structExtension), reinterpret_cast<VkCopyCommandTransformInfoQCOM*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM: {
+            deepcopy_VkCopyCommandTransformInfoQCOM(
+                alloc, rootType,
+                reinterpret_cast<const VkCopyCommandTransformInfoQCOM*>(structExtension),
+                reinterpret_cast<VkCopyCommandTransformInfoQCOM*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_image_robustness
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceImageRobustnessFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceImageRobustnessFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceImageRobustnessFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT: {
+            deepcopy_VkPhysicalDeviceImageRobustnessFeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceImageRobustnessFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceImageRobustnessFeaturesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_4444_formats
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDevice4444FormatsFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDevice4444FormatsFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDevice4444FormatsFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT: {
+            deepcopy_VkPhysicalDevice4444FormatsFeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDevice4444FormatsFeaturesEXT*>(structExtension),
+                reinterpret_cast<VkPhysicalDevice4444FormatsFeaturesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_rgba10x6_formats
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT: {
+            deepcopy_VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_VALVE_mutable_descriptor_type
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE:
-        {
-            deepcopy_VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE*>(structExtension), reinterpret_cast<VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE: {
+            deepcopy_VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE:
-        {
-            deepcopy_VkMutableDescriptorTypeCreateInfoVALVE(alloc, rootType, reinterpret_cast<const VkMutableDescriptorTypeCreateInfoVALVE*>(structExtension), reinterpret_cast<VkMutableDescriptorTypeCreateInfoVALVE*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE: {
+            deepcopy_VkMutableDescriptorTypeCreateInfoVALVE(
+                alloc, rootType,
+                reinterpret_cast<const VkMutableDescriptorTypeCreateInfoVALVE*>(structExtension),
+                reinterpret_cast<VkMutableDescriptorTypeCreateInfoVALVE*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_vertex_input_dynamic_state
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT: {
+            deepcopy_VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_physical_device_drm
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRM_PROPERTIES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceDrmPropertiesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceDrmPropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceDrmPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRM_PROPERTIES_EXT: {
+            deepcopy_VkPhysicalDeviceDrmPropertiesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceDrmPropertiesEXT*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceDrmPropertiesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_primitive_topology_list_restart
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT: {
+            deepcopy_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_FUCHSIA_external_memory
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA:
-        {
-            deepcopy_VkImportMemoryZirconHandleInfoFUCHSIA(alloc, rootType, reinterpret_cast<const VkImportMemoryZirconHandleInfoFUCHSIA*>(structExtension), reinterpret_cast<VkImportMemoryZirconHandleInfoFUCHSIA*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA: {
+            deepcopy_VkImportMemoryZirconHandleInfoFUCHSIA(
+                alloc, rootType,
+                reinterpret_cast<const VkImportMemoryZirconHandleInfoFUCHSIA*>(structExtension),
+                reinterpret_cast<VkImportMemoryZirconHandleInfoFUCHSIA*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA:
-        {
-            deepcopy_VkImportMemoryBufferCollectionFUCHSIA(alloc, rootType, reinterpret_cast<const VkImportMemoryBufferCollectionFUCHSIA*>(structExtension), reinterpret_cast<VkImportMemoryBufferCollectionFUCHSIA*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA: {
+            deepcopy_VkImportMemoryBufferCollectionFUCHSIA(
+                alloc, rootType,
+                reinterpret_cast<const VkImportMemoryBufferCollectionFUCHSIA*>(structExtension),
+                reinterpret_cast<VkImportMemoryBufferCollectionFUCHSIA*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA:
-        {
-            deepcopy_VkBufferCollectionImageCreateInfoFUCHSIA(alloc, rootType, reinterpret_cast<const VkBufferCollectionImageCreateInfoFUCHSIA*>(structExtension), reinterpret_cast<VkBufferCollectionImageCreateInfoFUCHSIA*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA: {
+            deepcopy_VkBufferCollectionImageCreateInfoFUCHSIA(
+                alloc, rootType,
+                reinterpret_cast<const VkBufferCollectionImageCreateInfoFUCHSIA*>(structExtension),
+                reinterpret_cast<VkBufferCollectionImageCreateInfoFUCHSIA*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_BUFFER_CREATE_INFO_FUCHSIA:
-        {
-            deepcopy_VkBufferCollectionBufferCreateInfoFUCHSIA(alloc, rootType, reinterpret_cast<const VkBufferCollectionBufferCreateInfoFUCHSIA*>(structExtension), reinterpret_cast<VkBufferCollectionBufferCreateInfoFUCHSIA*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_BUFFER_CREATE_INFO_FUCHSIA: {
+            deepcopy_VkBufferCollectionBufferCreateInfoFUCHSIA(
+                alloc, rootType,
+                reinterpret_cast<const VkBufferCollectionBufferCreateInfoFUCHSIA*>(structExtension),
+                reinterpret_cast<VkBufferCollectionBufferCreateInfoFUCHSIA*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_HUAWEI_subpass_shading
-        case VK_STRUCTURE_TYPE_SUBPASS_SHADING_PIPELINE_CREATE_INFO_HUAWEI:
-        {
-            deepcopy_VkSubpassShadingPipelineCreateInfoHUAWEI(alloc, rootType, reinterpret_cast<const VkSubpassShadingPipelineCreateInfoHUAWEI*>(structExtension), reinterpret_cast<VkSubpassShadingPipelineCreateInfoHUAWEI*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SUBPASS_SHADING_PIPELINE_CREATE_INFO_HUAWEI: {
+            deepcopy_VkSubpassShadingPipelineCreateInfoHUAWEI(
+                alloc, rootType,
+                reinterpret_cast<const VkSubpassShadingPipelineCreateInfoHUAWEI*>(structExtension),
+                reinterpret_cast<VkSubpassShadingPipelineCreateInfoHUAWEI*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI:
-        {
-            deepcopy_VkPhysicalDeviceSubpassShadingFeaturesHUAWEI(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceSubpassShadingFeaturesHUAWEI*>(structExtension), reinterpret_cast<VkPhysicalDeviceSubpassShadingFeaturesHUAWEI*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI: {
+            deepcopy_VkPhysicalDeviceSubpassShadingFeaturesHUAWEI(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceSubpassShadingFeaturesHUAWEI*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceSubpassShadingFeaturesHUAWEI*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_PROPERTIES_HUAWEI:
-        {
-            deepcopy_VkPhysicalDeviceSubpassShadingPropertiesHUAWEI(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceSubpassShadingPropertiesHUAWEI*>(structExtension), reinterpret_cast<VkPhysicalDeviceSubpassShadingPropertiesHUAWEI*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_PROPERTIES_HUAWEI: {
+            deepcopy_VkPhysicalDeviceSubpassShadingPropertiesHUAWEI(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceSubpassShadingPropertiesHUAWEI*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceSubpassShadingPropertiesHUAWEI*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_HUAWEI_invocation_mask
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI:
-        {
-            deepcopy_VkPhysicalDeviceInvocationMaskFeaturesHUAWEI(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceInvocationMaskFeaturesHUAWEI*>(structExtension), reinterpret_cast<VkPhysicalDeviceInvocationMaskFeaturesHUAWEI*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI: {
+            deepcopy_VkPhysicalDeviceInvocationMaskFeaturesHUAWEI(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceInvocationMaskFeaturesHUAWEI*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceInvocationMaskFeaturesHUAWEI*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_external_memory_rdma
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV:
-        {
-            deepcopy_VkPhysicalDeviceExternalMemoryRDMAFeaturesNV(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceExternalMemoryRDMAFeaturesNV*>(structExtension), reinterpret_cast<VkPhysicalDeviceExternalMemoryRDMAFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV: {
+            deepcopy_VkPhysicalDeviceExternalMemoryRDMAFeaturesNV(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceExternalMemoryRDMAFeaturesNV*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceExternalMemoryRDMAFeaturesNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceExtendedDynamicState2FeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceExtendedDynamicState2FeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceExtendedDynamicState2FeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT: {
+            deepcopy_VkPhysicalDeviceExtendedDynamicState2FeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceExtendedDynamicState2FeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceExtendedDynamicState2FeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_color_write_enable
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceColorWriteEnableFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceColorWriteEnableFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceColorWriteEnableFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT: {
+            deepcopy_VkPhysicalDeviceColorWriteEnableFeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceColorWriteEnableFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceColorWriteEnableFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_WRITE_CREATE_INFO_EXT:
-        {
-            deepcopy_VkPipelineColorWriteCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkPipelineColorWriteCreateInfoEXT*>(structExtension), reinterpret_cast<VkPipelineColorWriteCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_WRITE_CREATE_INFO_EXT: {
+            deepcopy_VkPipelineColorWriteCreateInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPipelineColorWriteCreateInfoEXT*>(structExtension),
+                reinterpret_cast<VkPipelineColorWriteCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_GOOGLE_gfxstream
-        case VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE:
-        {
-            deepcopy_VkImportColorBufferGOOGLE(alloc, rootType, reinterpret_cast<const VkImportColorBufferGOOGLE*>(structExtension), reinterpret_cast<VkImportColorBufferGOOGLE*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE: {
+            deepcopy_VkImportColorBufferGOOGLE(
+                alloc, rootType,
+                reinterpret_cast<const VkImportColorBufferGOOGLE*>(structExtension),
+                reinterpret_cast<VkImportColorBufferGOOGLE*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE:
-        {
-            deepcopy_VkImportBufferGOOGLE(alloc, rootType, reinterpret_cast<const VkImportBufferGOOGLE*>(structExtension), reinterpret_cast<VkImportBufferGOOGLE*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE: {
+            deepcopy_VkImportBufferGOOGLE(
+                alloc, rootType, reinterpret_cast<const VkImportBufferGOOGLE*>(structExtension),
+                reinterpret_cast<VkImportBufferGOOGLE*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE:
-        {
-            deepcopy_VkImportPhysicalAddressGOOGLE(alloc, rootType, reinterpret_cast<const VkImportPhysicalAddressGOOGLE*>(structExtension), reinterpret_cast<VkImportPhysicalAddressGOOGLE*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE: {
+            deepcopy_VkImportPhysicalAddressGOOGLE(
+                alloc, rootType,
+                reinterpret_cast<const VkImportPhysicalAddressGOOGLE*>(structExtension),
+                reinterpret_cast<VkImportPhysicalAddressGOOGLE*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_global_priority_query
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT: {
+            deepcopy_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_EXT:
-        {
-            deepcopy_VkQueueFamilyGlobalPriorityPropertiesEXT(alloc, rootType, reinterpret_cast<const VkQueueFamilyGlobalPriorityPropertiesEXT*>(structExtension), reinterpret_cast<VkQueueFamilyGlobalPriorityPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_EXT: {
+            deepcopy_VkQueueFamilyGlobalPriorityPropertiesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkQueueFamilyGlobalPriorityPropertiesEXT*>(structExtension),
+                reinterpret_cast<VkQueueFamilyGlobalPriorityPropertiesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_multi_draw
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceMultiDrawFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceMultiDrawFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceMultiDrawFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT: {
+            deepcopy_VkPhysicalDeviceMultiDrawFeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceMultiDrawFeaturesEXT*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceMultiDrawFeaturesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceMultiDrawPropertiesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceMultiDrawPropertiesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceMultiDrawPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT: {
+            deepcopy_VkPhysicalDeviceMultiDrawPropertiesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceMultiDrawPropertiesEXT*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceMultiDrawPropertiesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_border_color_swizzle
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDeviceBorderColorSwizzleFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceBorderColorSwizzleFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDeviceBorderColorSwizzleFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT: {
+            deepcopy_VkPhysicalDeviceBorderColorSwizzleFeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceBorderColorSwizzleFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceBorderColorSwizzleFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_BORDER_COLOR_COMPONENT_MAPPING_CREATE_INFO_EXT:
-        {
-            deepcopy_VkSamplerBorderColorComponentMappingCreateInfoEXT(alloc, rootType, reinterpret_cast<const VkSamplerBorderColorComponentMappingCreateInfoEXT*>(structExtension), reinterpret_cast<VkSamplerBorderColorComponentMappingCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SAMPLER_BORDER_COLOR_COMPONENT_MAPPING_CREATE_INFO_EXT: {
+            deepcopy_VkSamplerBorderColorComponentMappingCreateInfoEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkSamplerBorderColorComponentMappingCreateInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<VkSamplerBorderColorComponentMappingCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_pageable_device_local_memory
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT:
-        {
-            deepcopy_VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT(alloc, rootType, reinterpret_cast<const VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT*>(structExtension), reinterpret_cast<VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT: {
+            deepcopy_VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_acceleration_structure
-        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR:
-        {
-            deepcopy_VkWriteDescriptorSetAccelerationStructureKHR(alloc, rootType, reinterpret_cast<const VkWriteDescriptorSetAccelerationStructureKHR*>(structExtension), reinterpret_cast<VkWriteDescriptorSetAccelerationStructureKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR: {
+            deepcopy_VkWriteDescriptorSetAccelerationStructureKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkWriteDescriptorSetAccelerationStructureKHR*>(
+                    structExtension),
+                reinterpret_cast<VkWriteDescriptorSetAccelerationStructureKHR*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR:
-        {
-            deepcopy_VkPhysicalDeviceAccelerationStructureFeaturesKHR(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceAccelerationStructureFeaturesKHR*>(structExtension), reinterpret_cast<VkPhysicalDeviceAccelerationStructureFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR: {
+            deepcopy_VkPhysicalDeviceAccelerationStructureFeaturesKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceAccelerationStructureFeaturesKHR*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceAccelerationStructureFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR:
-        {
-            deepcopy_VkPhysicalDeviceAccelerationStructurePropertiesKHR(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceAccelerationStructurePropertiesKHR*>(structExtension), reinterpret_cast<VkPhysicalDeviceAccelerationStructurePropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR: {
+            deepcopy_VkPhysicalDeviceAccelerationStructurePropertiesKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceAccelerationStructurePropertiesKHR*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceAccelerationStructurePropertiesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR:
-        {
-            deepcopy_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceRayTracingPipelineFeaturesKHR*>(structExtension), reinterpret_cast<VkPhysicalDeviceRayTracingPipelineFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR: {
+            deepcopy_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceRayTracingPipelineFeaturesKHR*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceRayTracingPipelineFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR:
-        {
-            deepcopy_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceRayTracingPipelinePropertiesKHR*>(structExtension), reinterpret_cast<VkPhysicalDeviceRayTracingPipelinePropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR: {
+            deepcopy_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceRayTracingPipelinePropertiesKHR*>(
+                    structExtension),
+                reinterpret_cast<VkPhysicalDeviceRayTracingPipelinePropertiesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_ray_query
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR:
-        {
-            deepcopy_VkPhysicalDeviceRayQueryFeaturesKHR(alloc, rootType, reinterpret_cast<const VkPhysicalDeviceRayQueryFeaturesKHR*>(structExtension), reinterpret_cast<VkPhysicalDeviceRayQueryFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR: {
+            deepcopy_VkPhysicalDeviceRayQueryFeaturesKHR(
+                alloc, rootType,
+                reinterpret_cast<const VkPhysicalDeviceRayQueryFeaturesKHR*>(structExtension),
+                reinterpret_cast<VkPhysicalDeviceRayQueryFeaturesKHR*>(structExtension_out));
             break;
         }
 #endif
-        default:
-        {
+        default: {
             return;
         }
     }
 }
 
-
-} // namespace goldfish_vk
+}  // namespace goldfish_vk
diff --git a/stream-servers/vulkan/cereal/common/goldfish_vk_deepcopy.h b/stream-servers/vulkan/cereal/common/goldfish_vk_deepcopy.h
index 8af3274..b3139de 100644
--- a/stream-servers/vulkan/cereal/common/goldfish_vk_deepcopy.h
+++ b/stream-servers/vulkan/cereal/common/goldfish_vk_deepcopy.h
@@ -14,1736 +14,1145 @@
 // limitations under the License.
 
 // Autogenerated module goldfish_vk_deepcopy
-// (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
+// (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml
+// cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
 // VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
 // VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+//
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o
+// $CEREAL_OUTPUT_DIR
+//
 #pragma once
 #include <vulkan/vulkan.h>
-#include "vulkan_gfxstream.h"
 
-#include "goldfish_vk_private_defs.h"
 #include "base/BumpPool.h"
+#include "goldfish_vk_private_defs.h"
+#include "vulkan_gfxstream.h"
 using android::base::Allocator;
 using android::base::BumpPool;
 
 namespace goldfish_vk {
 #ifdef VK_VERSION_1_0
-void deepcopy_VkExtent2D(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExtent2D* from,
-    VkExtent2D* to);
+void deepcopy_VkExtent2D(Allocator* alloc, VkStructureType rootType, const VkExtent2D* from,
+                         VkExtent2D* to);
 
-void deepcopy_VkExtent3D(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExtent3D* from,
-    VkExtent3D* to);
+void deepcopy_VkExtent3D(Allocator* alloc, VkStructureType rootType, const VkExtent3D* from,
+                         VkExtent3D* to);
 
-void deepcopy_VkOffset2D(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkOffset2D* from,
-    VkOffset2D* to);
+void deepcopy_VkOffset2D(Allocator* alloc, VkStructureType rootType, const VkOffset2D* from,
+                         VkOffset2D* to);
 
-void deepcopy_VkOffset3D(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkOffset3D* from,
-    VkOffset3D* to);
+void deepcopy_VkOffset3D(Allocator* alloc, VkStructureType rootType, const VkOffset3D* from,
+                         VkOffset3D* to);
 
-void deepcopy_VkRect2D(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkRect2D* from,
-    VkRect2D* to);
+void deepcopy_VkRect2D(Allocator* alloc, VkStructureType rootType, const VkRect2D* from,
+                       VkRect2D* to);
 
-void deepcopy_VkBaseInStructure(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBaseInStructure* from,
-    VkBaseInStructure* to);
+void deepcopy_VkBaseInStructure(Allocator* alloc, VkStructureType rootType,
+                                const VkBaseInStructure* from, VkBaseInStructure* to);
 
-void deepcopy_VkBaseOutStructure(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBaseOutStructure* from,
-    VkBaseOutStructure* to);
+void deepcopy_VkBaseOutStructure(Allocator* alloc, VkStructureType rootType,
+                                 const VkBaseOutStructure* from, VkBaseOutStructure* to);
 
-void deepcopy_VkBufferMemoryBarrier(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBufferMemoryBarrier* from,
-    VkBufferMemoryBarrier* to);
+void deepcopy_VkBufferMemoryBarrier(Allocator* alloc, VkStructureType rootType,
+                                    const VkBufferMemoryBarrier* from, VkBufferMemoryBarrier* to);
 
-void deepcopy_VkDispatchIndirectCommand(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDispatchIndirectCommand* from,
-    VkDispatchIndirectCommand* to);
+void deepcopy_VkDispatchIndirectCommand(Allocator* alloc, VkStructureType rootType,
+                                        const VkDispatchIndirectCommand* from,
+                                        VkDispatchIndirectCommand* to);
 
-void deepcopy_VkDrawIndexedIndirectCommand(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDrawIndexedIndirectCommand* from,
-    VkDrawIndexedIndirectCommand* to);
+void deepcopy_VkDrawIndexedIndirectCommand(Allocator* alloc, VkStructureType rootType,
+                                           const VkDrawIndexedIndirectCommand* from,
+                                           VkDrawIndexedIndirectCommand* to);
 
-void deepcopy_VkDrawIndirectCommand(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDrawIndirectCommand* from,
-    VkDrawIndirectCommand* to);
+void deepcopy_VkDrawIndirectCommand(Allocator* alloc, VkStructureType rootType,
+                                    const VkDrawIndirectCommand* from, VkDrawIndirectCommand* to);
 
-void deepcopy_VkImageSubresourceRange(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageSubresourceRange* from,
-    VkImageSubresourceRange* to);
+void deepcopy_VkImageSubresourceRange(Allocator* alloc, VkStructureType rootType,
+                                      const VkImageSubresourceRange* from,
+                                      VkImageSubresourceRange* to);
 
-void deepcopy_VkImageMemoryBarrier(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageMemoryBarrier* from,
-    VkImageMemoryBarrier* to);
+void deepcopy_VkImageMemoryBarrier(Allocator* alloc, VkStructureType rootType,
+                                   const VkImageMemoryBarrier* from, VkImageMemoryBarrier* to);
 
-void deepcopy_VkMemoryBarrier(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryBarrier* from,
-    VkMemoryBarrier* to);
+void deepcopy_VkMemoryBarrier(Allocator* alloc, VkStructureType rootType,
+                              const VkMemoryBarrier* from, VkMemoryBarrier* to);
 
-void deepcopy_VkPipelineCacheHeaderVersionOne(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineCacheHeaderVersionOne* from,
-    VkPipelineCacheHeaderVersionOne* to);
+void deepcopy_VkPipelineCacheHeaderVersionOne(Allocator* alloc, VkStructureType rootType,
+                                              const VkPipelineCacheHeaderVersionOne* from,
+                                              VkPipelineCacheHeaderVersionOne* to);
 
-void deepcopy_VkAllocationCallbacks(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAllocationCallbacks* from,
-    VkAllocationCallbacks* to);
+void deepcopy_VkAllocationCallbacks(Allocator* alloc, VkStructureType rootType,
+                                    const VkAllocationCallbacks* from, VkAllocationCallbacks* to);
 
-void deepcopy_VkApplicationInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkApplicationInfo* from,
-    VkApplicationInfo* to);
+void deepcopy_VkApplicationInfo(Allocator* alloc, VkStructureType rootType,
+                                const VkApplicationInfo* from, VkApplicationInfo* to);
 
-void deepcopy_VkFormatProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkFormatProperties* from,
-    VkFormatProperties* to);
+void deepcopy_VkFormatProperties(Allocator* alloc, VkStructureType rootType,
+                                 const VkFormatProperties* from, VkFormatProperties* to);
 
-void deepcopy_VkImageFormatProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageFormatProperties* from,
-    VkImageFormatProperties* to);
+void deepcopy_VkImageFormatProperties(Allocator* alloc, VkStructureType rootType,
+                                      const VkImageFormatProperties* from,
+                                      VkImageFormatProperties* to);
 
-void deepcopy_VkInstanceCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkInstanceCreateInfo* from,
-    VkInstanceCreateInfo* to);
+void deepcopy_VkInstanceCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                   const VkInstanceCreateInfo* from, VkInstanceCreateInfo* to);
 
-void deepcopy_VkMemoryHeap(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryHeap* from,
-    VkMemoryHeap* to);
+void deepcopy_VkMemoryHeap(Allocator* alloc, VkStructureType rootType, const VkMemoryHeap* from,
+                           VkMemoryHeap* to);
 
-void deepcopy_VkMemoryType(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryType* from,
-    VkMemoryType* to);
+void deepcopy_VkMemoryType(Allocator* alloc, VkStructureType rootType, const VkMemoryType* from,
+                           VkMemoryType* to);
 
-void deepcopy_VkPhysicalDeviceFeatures(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceFeatures* from,
-    VkPhysicalDeviceFeatures* to);
+void deepcopy_VkPhysicalDeviceFeatures(Allocator* alloc, VkStructureType rootType,
+                                       const VkPhysicalDeviceFeatures* from,
+                                       VkPhysicalDeviceFeatures* to);
 
-void deepcopy_VkPhysicalDeviceLimits(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceLimits* from,
-    VkPhysicalDeviceLimits* to);
+void deepcopy_VkPhysicalDeviceLimits(Allocator* alloc, VkStructureType rootType,
+                                     const VkPhysicalDeviceLimits* from,
+                                     VkPhysicalDeviceLimits* to);
 
-void deepcopy_VkPhysicalDeviceMemoryProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceMemoryProperties* from,
-    VkPhysicalDeviceMemoryProperties* to);
+void deepcopy_VkPhysicalDeviceMemoryProperties(Allocator* alloc, VkStructureType rootType,
+                                               const VkPhysicalDeviceMemoryProperties* from,
+                                               VkPhysicalDeviceMemoryProperties* to);
 
-void deepcopy_VkPhysicalDeviceSparseProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceSparseProperties* from,
-    VkPhysicalDeviceSparseProperties* to);
+void deepcopy_VkPhysicalDeviceSparseProperties(Allocator* alloc, VkStructureType rootType,
+                                               const VkPhysicalDeviceSparseProperties* from,
+                                               VkPhysicalDeviceSparseProperties* to);
 
-void deepcopy_VkPhysicalDeviceProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceProperties* from,
-    VkPhysicalDeviceProperties* to);
+void deepcopy_VkPhysicalDeviceProperties(Allocator* alloc, VkStructureType rootType,
+                                         const VkPhysicalDeviceProperties* from,
+                                         VkPhysicalDeviceProperties* to);
 
-void deepcopy_VkQueueFamilyProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkQueueFamilyProperties* from,
-    VkQueueFamilyProperties* to);
+void deepcopy_VkQueueFamilyProperties(Allocator* alloc, VkStructureType rootType,
+                                      const VkQueueFamilyProperties* from,
+                                      VkQueueFamilyProperties* to);
 
-void deepcopy_VkDeviceQueueCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDeviceQueueCreateInfo* from,
-    VkDeviceQueueCreateInfo* to);
+void deepcopy_VkDeviceQueueCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                      const VkDeviceQueueCreateInfo* from,
+                                      VkDeviceQueueCreateInfo* to);
 
-void deepcopy_VkDeviceCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDeviceCreateInfo* from,
-    VkDeviceCreateInfo* to);
+void deepcopy_VkDeviceCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                 const VkDeviceCreateInfo* from, VkDeviceCreateInfo* to);
 
-void deepcopy_VkExtensionProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExtensionProperties* from,
-    VkExtensionProperties* to);
+void deepcopy_VkExtensionProperties(Allocator* alloc, VkStructureType rootType,
+                                    const VkExtensionProperties* from, VkExtensionProperties* to);
 
-void deepcopy_VkLayerProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkLayerProperties* from,
-    VkLayerProperties* to);
+void deepcopy_VkLayerProperties(Allocator* alloc, VkStructureType rootType,
+                                const VkLayerProperties* from, VkLayerProperties* to);
 
-void deepcopy_VkSubmitInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSubmitInfo* from,
-    VkSubmitInfo* to);
+void deepcopy_VkSubmitInfo(Allocator* alloc, VkStructureType rootType, const VkSubmitInfo* from,
+                           VkSubmitInfo* to);
 
-void deepcopy_VkMappedMemoryRange(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMappedMemoryRange* from,
-    VkMappedMemoryRange* to);
+void deepcopy_VkMappedMemoryRange(Allocator* alloc, VkStructureType rootType,
+                                  const VkMappedMemoryRange* from, VkMappedMemoryRange* to);
 
-void deepcopy_VkMemoryAllocateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryAllocateInfo* from,
-    VkMemoryAllocateInfo* to);
+void deepcopy_VkMemoryAllocateInfo(Allocator* alloc, VkStructureType rootType,
+                                   const VkMemoryAllocateInfo* from, VkMemoryAllocateInfo* to);
 
-void deepcopy_VkMemoryRequirements(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryRequirements* from,
-    VkMemoryRequirements* to);
+void deepcopy_VkMemoryRequirements(Allocator* alloc, VkStructureType rootType,
+                                   const VkMemoryRequirements* from, VkMemoryRequirements* to);
 
-void deepcopy_VkSparseMemoryBind(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSparseMemoryBind* from,
-    VkSparseMemoryBind* to);
+void deepcopy_VkSparseMemoryBind(Allocator* alloc, VkStructureType rootType,
+                                 const VkSparseMemoryBind* from, VkSparseMemoryBind* to);
 
-void deepcopy_VkSparseBufferMemoryBindInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSparseBufferMemoryBindInfo* from,
-    VkSparseBufferMemoryBindInfo* to);
+void deepcopy_VkSparseBufferMemoryBindInfo(Allocator* alloc, VkStructureType rootType,
+                                           const VkSparseBufferMemoryBindInfo* from,
+                                           VkSparseBufferMemoryBindInfo* to);
 
-void deepcopy_VkSparseImageOpaqueMemoryBindInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSparseImageOpaqueMemoryBindInfo* from,
-    VkSparseImageOpaqueMemoryBindInfo* to);
+void deepcopy_VkSparseImageOpaqueMemoryBindInfo(Allocator* alloc, VkStructureType rootType,
+                                                const VkSparseImageOpaqueMemoryBindInfo* from,
+                                                VkSparseImageOpaqueMemoryBindInfo* to);
 
-void deepcopy_VkImageSubresource(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageSubresource* from,
-    VkImageSubresource* to);
+void deepcopy_VkImageSubresource(Allocator* alloc, VkStructureType rootType,
+                                 const VkImageSubresource* from, VkImageSubresource* to);
 
-void deepcopy_VkSparseImageMemoryBind(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSparseImageMemoryBind* from,
-    VkSparseImageMemoryBind* to);
+void deepcopy_VkSparseImageMemoryBind(Allocator* alloc, VkStructureType rootType,
+                                      const VkSparseImageMemoryBind* from,
+                                      VkSparseImageMemoryBind* to);
 
-void deepcopy_VkSparseImageMemoryBindInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSparseImageMemoryBindInfo* from,
-    VkSparseImageMemoryBindInfo* to);
+void deepcopy_VkSparseImageMemoryBindInfo(Allocator* alloc, VkStructureType rootType,
+                                          const VkSparseImageMemoryBindInfo* from,
+                                          VkSparseImageMemoryBindInfo* to);
 
-void deepcopy_VkBindSparseInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBindSparseInfo* from,
-    VkBindSparseInfo* to);
+void deepcopy_VkBindSparseInfo(Allocator* alloc, VkStructureType rootType,
+                               const VkBindSparseInfo* from, VkBindSparseInfo* to);
 
-void deepcopy_VkSparseImageFormatProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSparseImageFormatProperties* from,
-    VkSparseImageFormatProperties* to);
+void deepcopy_VkSparseImageFormatProperties(Allocator* alloc, VkStructureType rootType,
+                                            const VkSparseImageFormatProperties* from,
+                                            VkSparseImageFormatProperties* to);
 
-void deepcopy_VkSparseImageMemoryRequirements(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSparseImageMemoryRequirements* from,
-    VkSparseImageMemoryRequirements* to);
+void deepcopy_VkSparseImageMemoryRequirements(Allocator* alloc, VkStructureType rootType,
+                                              const VkSparseImageMemoryRequirements* from,
+                                              VkSparseImageMemoryRequirements* to);
 
-void deepcopy_VkFenceCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkFenceCreateInfo* from,
-    VkFenceCreateInfo* to);
+void deepcopy_VkFenceCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                const VkFenceCreateInfo* from, VkFenceCreateInfo* to);
 
-void deepcopy_VkSemaphoreCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSemaphoreCreateInfo* from,
-    VkSemaphoreCreateInfo* to);
+void deepcopy_VkSemaphoreCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                    const VkSemaphoreCreateInfo* from, VkSemaphoreCreateInfo* to);
 
-void deepcopy_VkEventCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkEventCreateInfo* from,
-    VkEventCreateInfo* to);
+void deepcopy_VkEventCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                const VkEventCreateInfo* from, VkEventCreateInfo* to);
 
-void deepcopy_VkQueryPoolCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkQueryPoolCreateInfo* from,
-    VkQueryPoolCreateInfo* to);
+void deepcopy_VkQueryPoolCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                    const VkQueryPoolCreateInfo* from, VkQueryPoolCreateInfo* to);
 
-void deepcopy_VkBufferCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBufferCreateInfo* from,
-    VkBufferCreateInfo* to);
+void deepcopy_VkBufferCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                 const VkBufferCreateInfo* from, VkBufferCreateInfo* to);
 
-void deepcopy_VkBufferViewCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBufferViewCreateInfo* from,
-    VkBufferViewCreateInfo* to);
+void deepcopy_VkBufferViewCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                     const VkBufferViewCreateInfo* from,
+                                     VkBufferViewCreateInfo* to);
 
-void deepcopy_VkImageCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageCreateInfo* from,
-    VkImageCreateInfo* to);
+void deepcopy_VkImageCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                const VkImageCreateInfo* from, VkImageCreateInfo* to);
 
-void deepcopy_VkSubresourceLayout(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSubresourceLayout* from,
-    VkSubresourceLayout* to);
+void deepcopy_VkSubresourceLayout(Allocator* alloc, VkStructureType rootType,
+                                  const VkSubresourceLayout* from, VkSubresourceLayout* to);
 
-void deepcopy_VkComponentMapping(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkComponentMapping* from,
-    VkComponentMapping* to);
+void deepcopy_VkComponentMapping(Allocator* alloc, VkStructureType rootType,
+                                 const VkComponentMapping* from, VkComponentMapping* to);
 
-void deepcopy_VkImageViewCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageViewCreateInfo* from,
-    VkImageViewCreateInfo* to);
+void deepcopy_VkImageViewCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                    const VkImageViewCreateInfo* from, VkImageViewCreateInfo* to);
 
-void deepcopy_VkShaderModuleCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkShaderModuleCreateInfo* from,
-    VkShaderModuleCreateInfo* to);
+void deepcopy_VkShaderModuleCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                       const VkShaderModuleCreateInfo* from,
+                                       VkShaderModuleCreateInfo* to);
 
-void deepcopy_VkPipelineCacheCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineCacheCreateInfo* from,
-    VkPipelineCacheCreateInfo* to);
+void deepcopy_VkPipelineCacheCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                        const VkPipelineCacheCreateInfo* from,
+                                        VkPipelineCacheCreateInfo* to);
 
-void deepcopy_VkSpecializationMapEntry(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSpecializationMapEntry* from,
-    VkSpecializationMapEntry* to);
+void deepcopy_VkSpecializationMapEntry(Allocator* alloc, VkStructureType rootType,
+                                       const VkSpecializationMapEntry* from,
+                                       VkSpecializationMapEntry* to);
 
-void deepcopy_VkSpecializationInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSpecializationInfo* from,
-    VkSpecializationInfo* to);
+void deepcopy_VkSpecializationInfo(Allocator* alloc, VkStructureType rootType,
+                                   const VkSpecializationInfo* from, VkSpecializationInfo* to);
 
-void deepcopy_VkPipelineShaderStageCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineShaderStageCreateInfo* from,
-    VkPipelineShaderStageCreateInfo* to);
+void deepcopy_VkPipelineShaderStageCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                              const VkPipelineShaderStageCreateInfo* from,
+                                              VkPipelineShaderStageCreateInfo* to);
 
-void deepcopy_VkComputePipelineCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkComputePipelineCreateInfo* from,
-    VkComputePipelineCreateInfo* to);
+void deepcopy_VkComputePipelineCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                          const VkComputePipelineCreateInfo* from,
+                                          VkComputePipelineCreateInfo* to);
 
-void deepcopy_VkVertexInputBindingDescription(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVertexInputBindingDescription* from,
-    VkVertexInputBindingDescription* to);
+void deepcopy_VkVertexInputBindingDescription(Allocator* alloc, VkStructureType rootType,
+                                              const VkVertexInputBindingDescription* from,
+                                              VkVertexInputBindingDescription* to);
 
-void deepcopy_VkVertexInputAttributeDescription(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVertexInputAttributeDescription* from,
-    VkVertexInputAttributeDescription* to);
+void deepcopy_VkVertexInputAttributeDescription(Allocator* alloc, VkStructureType rootType,
+                                                const VkVertexInputAttributeDescription* from,
+                                                VkVertexInputAttributeDescription* to);
 
-void deepcopy_VkPipelineVertexInputStateCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineVertexInputStateCreateInfo* from,
-    VkPipelineVertexInputStateCreateInfo* to);
+void deepcopy_VkPipelineVertexInputStateCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                                   const VkPipelineVertexInputStateCreateInfo* from,
+                                                   VkPipelineVertexInputStateCreateInfo* to);
 
 void deepcopy_VkPipelineInputAssemblyStateCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineInputAssemblyStateCreateInfo* from,
+    Allocator* alloc, VkStructureType rootType, const VkPipelineInputAssemblyStateCreateInfo* from,
     VkPipelineInputAssemblyStateCreateInfo* to);
 
 void deepcopy_VkPipelineTessellationStateCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineTessellationStateCreateInfo* from,
+    Allocator* alloc, VkStructureType rootType, const VkPipelineTessellationStateCreateInfo* from,
     VkPipelineTessellationStateCreateInfo* to);
 
-void deepcopy_VkViewport(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkViewport* from,
-    VkViewport* to);
+void deepcopy_VkViewport(Allocator* alloc, VkStructureType rootType, const VkViewport* from,
+                         VkViewport* to);
 
-void deepcopy_VkPipelineViewportStateCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineViewportStateCreateInfo* from,
-    VkPipelineViewportStateCreateInfo* to);
+void deepcopy_VkPipelineViewportStateCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                                const VkPipelineViewportStateCreateInfo* from,
+                                                VkPipelineViewportStateCreateInfo* to);
 
 void deepcopy_VkPipelineRasterizationStateCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineRasterizationStateCreateInfo* from,
+    Allocator* alloc, VkStructureType rootType, const VkPipelineRasterizationStateCreateInfo* from,
     VkPipelineRasterizationStateCreateInfo* to);
 
-void deepcopy_VkPipelineMultisampleStateCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineMultisampleStateCreateInfo* from,
-    VkPipelineMultisampleStateCreateInfo* to);
+void deepcopy_VkPipelineMultisampleStateCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                                   const VkPipelineMultisampleStateCreateInfo* from,
+                                                   VkPipelineMultisampleStateCreateInfo* to);
 
-void deepcopy_VkStencilOpState(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkStencilOpState* from,
-    VkStencilOpState* to);
+void deepcopy_VkStencilOpState(Allocator* alloc, VkStructureType rootType,
+                               const VkStencilOpState* from, VkStencilOpState* to);
 
 void deepcopy_VkPipelineDepthStencilStateCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineDepthStencilStateCreateInfo* from,
+    Allocator* alloc, VkStructureType rootType, const VkPipelineDepthStencilStateCreateInfo* from,
     VkPipelineDepthStencilStateCreateInfo* to);
 
-void deepcopy_VkPipelineColorBlendAttachmentState(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineColorBlendAttachmentState* from,
-    VkPipelineColorBlendAttachmentState* to);
+void deepcopy_VkPipelineColorBlendAttachmentState(Allocator* alloc, VkStructureType rootType,
+                                                  const VkPipelineColorBlendAttachmentState* from,
+                                                  VkPipelineColorBlendAttachmentState* to);
 
-void deepcopy_VkPipelineColorBlendStateCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineColorBlendStateCreateInfo* from,
-    VkPipelineColorBlendStateCreateInfo* to);
+void deepcopy_VkPipelineColorBlendStateCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                                  const VkPipelineColorBlendStateCreateInfo* from,
+                                                  VkPipelineColorBlendStateCreateInfo* to);
 
-void deepcopy_VkPipelineDynamicStateCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineDynamicStateCreateInfo* from,
-    VkPipelineDynamicStateCreateInfo* to);
+void deepcopy_VkPipelineDynamicStateCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                               const VkPipelineDynamicStateCreateInfo* from,
+                                               VkPipelineDynamicStateCreateInfo* to);
 
-void deepcopy_VkGraphicsPipelineCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkGraphicsPipelineCreateInfo* from,
-    VkGraphicsPipelineCreateInfo* to);
+void deepcopy_VkGraphicsPipelineCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                           const VkGraphicsPipelineCreateInfo* from,
+                                           VkGraphicsPipelineCreateInfo* to);
 
-void deepcopy_VkPushConstantRange(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPushConstantRange* from,
-    VkPushConstantRange* to);
+void deepcopy_VkPushConstantRange(Allocator* alloc, VkStructureType rootType,
+                                  const VkPushConstantRange* from, VkPushConstantRange* to);
 
-void deepcopy_VkPipelineLayoutCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineLayoutCreateInfo* from,
-    VkPipelineLayoutCreateInfo* to);
+void deepcopy_VkPipelineLayoutCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                         const VkPipelineLayoutCreateInfo* from,
+                                         VkPipelineLayoutCreateInfo* to);
 
-void deepcopy_VkSamplerCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSamplerCreateInfo* from,
-    VkSamplerCreateInfo* to);
+void deepcopy_VkSamplerCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                  const VkSamplerCreateInfo* from, VkSamplerCreateInfo* to);
 
-void deepcopy_VkCopyDescriptorSet(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCopyDescriptorSet* from,
-    VkCopyDescriptorSet* to);
+void deepcopy_VkCopyDescriptorSet(Allocator* alloc, VkStructureType rootType,
+                                  const VkCopyDescriptorSet* from, VkCopyDescriptorSet* to);
 
-void deepcopy_VkDescriptorBufferInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDescriptorBufferInfo* from,
-    VkDescriptorBufferInfo* to);
+void deepcopy_VkDescriptorBufferInfo(Allocator* alloc, VkStructureType rootType,
+                                     const VkDescriptorBufferInfo* from,
+                                     VkDescriptorBufferInfo* to);
 
-void deepcopy_VkDescriptorImageInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDescriptorImageInfo* from,
-    VkDescriptorImageInfo* to);
+void deepcopy_VkDescriptorImageInfo(Allocator* alloc, VkStructureType rootType,
+                                    const VkDescriptorImageInfo* from, VkDescriptorImageInfo* to);
 
-void deepcopy_VkDescriptorPoolSize(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDescriptorPoolSize* from,
-    VkDescriptorPoolSize* to);
+void deepcopy_VkDescriptorPoolSize(Allocator* alloc, VkStructureType rootType,
+                                   const VkDescriptorPoolSize* from, VkDescriptorPoolSize* to);
 
-void deepcopy_VkDescriptorPoolCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDescriptorPoolCreateInfo* from,
-    VkDescriptorPoolCreateInfo* to);
+void deepcopy_VkDescriptorPoolCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                         const VkDescriptorPoolCreateInfo* from,
+                                         VkDescriptorPoolCreateInfo* to);
 
-void deepcopy_VkDescriptorSetAllocateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDescriptorSetAllocateInfo* from,
-    VkDescriptorSetAllocateInfo* to);
+void deepcopy_VkDescriptorSetAllocateInfo(Allocator* alloc, VkStructureType rootType,
+                                          const VkDescriptorSetAllocateInfo* from,
+                                          VkDescriptorSetAllocateInfo* to);
 
-void deepcopy_VkDescriptorSetLayoutBinding(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDescriptorSetLayoutBinding* from,
-    VkDescriptorSetLayoutBinding* to);
+void deepcopy_VkDescriptorSetLayoutBinding(Allocator* alloc, VkStructureType rootType,
+                                           const VkDescriptorSetLayoutBinding* from,
+                                           VkDescriptorSetLayoutBinding* to);
 
-void deepcopy_VkDescriptorSetLayoutCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDescriptorSetLayoutCreateInfo* from,
-    VkDescriptorSetLayoutCreateInfo* to);
+void deepcopy_VkDescriptorSetLayoutCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                              const VkDescriptorSetLayoutCreateInfo* from,
+                                              VkDescriptorSetLayoutCreateInfo* to);
 
-void deepcopy_VkWriteDescriptorSet(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkWriteDescriptorSet* from,
-    VkWriteDescriptorSet* to);
+void deepcopy_VkWriteDescriptorSet(Allocator* alloc, VkStructureType rootType,
+                                   const VkWriteDescriptorSet* from, VkWriteDescriptorSet* to);
 
-void deepcopy_VkAttachmentDescription(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAttachmentDescription* from,
-    VkAttachmentDescription* to);
+void deepcopy_VkAttachmentDescription(Allocator* alloc, VkStructureType rootType,
+                                      const VkAttachmentDescription* from,
+                                      VkAttachmentDescription* to);
 
-void deepcopy_VkAttachmentReference(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAttachmentReference* from,
-    VkAttachmentReference* to);
+void deepcopy_VkAttachmentReference(Allocator* alloc, VkStructureType rootType,
+                                    const VkAttachmentReference* from, VkAttachmentReference* to);
 
-void deepcopy_VkFramebufferCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkFramebufferCreateInfo* from,
-    VkFramebufferCreateInfo* to);
+void deepcopy_VkFramebufferCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                      const VkFramebufferCreateInfo* from,
+                                      VkFramebufferCreateInfo* to);
 
-void deepcopy_VkSubpassDescription(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSubpassDescription* from,
-    VkSubpassDescription* to);
+void deepcopy_VkSubpassDescription(Allocator* alloc, VkStructureType rootType,
+                                   const VkSubpassDescription* from, VkSubpassDescription* to);
 
-void deepcopy_VkSubpassDependency(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSubpassDependency* from,
-    VkSubpassDependency* to);
+void deepcopy_VkSubpassDependency(Allocator* alloc, VkStructureType rootType,
+                                  const VkSubpassDependency* from, VkSubpassDependency* to);
 
-void deepcopy_VkRenderPassCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkRenderPassCreateInfo* from,
-    VkRenderPassCreateInfo* to);
+void deepcopy_VkRenderPassCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                     const VkRenderPassCreateInfo* from,
+                                     VkRenderPassCreateInfo* to);
 
-void deepcopy_VkCommandPoolCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCommandPoolCreateInfo* from,
-    VkCommandPoolCreateInfo* to);
+void deepcopy_VkCommandPoolCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                      const VkCommandPoolCreateInfo* from,
+                                      VkCommandPoolCreateInfo* to);
 
-void deepcopy_VkCommandBufferAllocateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCommandBufferAllocateInfo* from,
-    VkCommandBufferAllocateInfo* to);
+void deepcopy_VkCommandBufferAllocateInfo(Allocator* alloc, VkStructureType rootType,
+                                          const VkCommandBufferAllocateInfo* from,
+                                          VkCommandBufferAllocateInfo* to);
 
-void deepcopy_VkCommandBufferInheritanceInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCommandBufferInheritanceInfo* from,
-    VkCommandBufferInheritanceInfo* to);
+void deepcopy_VkCommandBufferInheritanceInfo(Allocator* alloc, VkStructureType rootType,
+                                             const VkCommandBufferInheritanceInfo* from,
+                                             VkCommandBufferInheritanceInfo* to);
 
-void deepcopy_VkCommandBufferBeginInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCommandBufferBeginInfo* from,
-    VkCommandBufferBeginInfo* to);
+void deepcopy_VkCommandBufferBeginInfo(Allocator* alloc, VkStructureType rootType,
+                                       const VkCommandBufferBeginInfo* from,
+                                       VkCommandBufferBeginInfo* to);
 
-void deepcopy_VkBufferCopy(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBufferCopy* from,
-    VkBufferCopy* to);
+void deepcopy_VkBufferCopy(Allocator* alloc, VkStructureType rootType, const VkBufferCopy* from,
+                           VkBufferCopy* to);
 
-void deepcopy_VkImageSubresourceLayers(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageSubresourceLayers* from,
-    VkImageSubresourceLayers* to);
+void deepcopy_VkImageSubresourceLayers(Allocator* alloc, VkStructureType rootType,
+                                       const VkImageSubresourceLayers* from,
+                                       VkImageSubresourceLayers* to);
 
-void deepcopy_VkBufferImageCopy(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBufferImageCopy* from,
-    VkBufferImageCopy* to);
+void deepcopy_VkBufferImageCopy(Allocator* alloc, VkStructureType rootType,
+                                const VkBufferImageCopy* from, VkBufferImageCopy* to);
 
-void deepcopy_VkClearColorValue(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkClearColorValue* from,
-    VkClearColorValue* to);
+void deepcopy_VkClearColorValue(Allocator* alloc, VkStructureType rootType,
+                                const VkClearColorValue* from, VkClearColorValue* to);
 
-void deepcopy_VkClearDepthStencilValue(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkClearDepthStencilValue* from,
-    VkClearDepthStencilValue* to);
+void deepcopy_VkClearDepthStencilValue(Allocator* alloc, VkStructureType rootType,
+                                       const VkClearDepthStencilValue* from,
+                                       VkClearDepthStencilValue* to);
 
-void deepcopy_VkClearValue(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkClearValue* from,
-    VkClearValue* to);
+void deepcopy_VkClearValue(Allocator* alloc, VkStructureType rootType, const VkClearValue* from,
+                           VkClearValue* to);
 
-void deepcopy_VkClearAttachment(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkClearAttachment* from,
-    VkClearAttachment* to);
+void deepcopy_VkClearAttachment(Allocator* alloc, VkStructureType rootType,
+                                const VkClearAttachment* from, VkClearAttachment* to);
 
-void deepcopy_VkClearRect(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkClearRect* from,
-    VkClearRect* to);
+void deepcopy_VkClearRect(Allocator* alloc, VkStructureType rootType, const VkClearRect* from,
+                          VkClearRect* to);
 
-void deepcopy_VkImageBlit(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageBlit* from,
-    VkImageBlit* to);
+void deepcopy_VkImageBlit(Allocator* alloc, VkStructureType rootType, const VkImageBlit* from,
+                          VkImageBlit* to);
 
-void deepcopy_VkImageCopy(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageCopy* from,
-    VkImageCopy* to);
+void deepcopy_VkImageCopy(Allocator* alloc, VkStructureType rootType, const VkImageCopy* from,
+                          VkImageCopy* to);
 
-void deepcopy_VkImageResolve(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageResolve* from,
-    VkImageResolve* to);
+void deepcopy_VkImageResolve(Allocator* alloc, VkStructureType rootType, const VkImageResolve* from,
+                             VkImageResolve* to);
 
-void deepcopy_VkRenderPassBeginInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkRenderPassBeginInfo* from,
-    VkRenderPassBeginInfo* to);
+void deepcopy_VkRenderPassBeginInfo(Allocator* alloc, VkStructureType rootType,
+                                    const VkRenderPassBeginInfo* from, VkRenderPassBeginInfo* to);
 
 #endif
 #ifdef VK_VERSION_1_1
-void deepcopy_VkPhysicalDeviceSubgroupProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceSubgroupProperties* from,
-    VkPhysicalDeviceSubgroupProperties* to);
+void deepcopy_VkPhysicalDeviceSubgroupProperties(Allocator* alloc, VkStructureType rootType,
+                                                 const VkPhysicalDeviceSubgroupProperties* from,
+                                                 VkPhysicalDeviceSubgroupProperties* to);
 
-void deepcopy_VkBindBufferMemoryInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBindBufferMemoryInfo* from,
-    VkBindBufferMemoryInfo* to);
+void deepcopy_VkBindBufferMemoryInfo(Allocator* alloc, VkStructureType rootType,
+                                     const VkBindBufferMemoryInfo* from,
+                                     VkBindBufferMemoryInfo* to);
 
-void deepcopy_VkBindImageMemoryInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBindImageMemoryInfo* from,
-    VkBindImageMemoryInfo* to);
+void deepcopy_VkBindImageMemoryInfo(Allocator* alloc, VkStructureType rootType,
+                                    const VkBindImageMemoryInfo* from, VkBindImageMemoryInfo* to);
 
-void deepcopy_VkPhysicalDevice16BitStorageFeatures(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDevice16BitStorageFeatures* from,
-    VkPhysicalDevice16BitStorageFeatures* to);
+void deepcopy_VkPhysicalDevice16BitStorageFeatures(Allocator* alloc, VkStructureType rootType,
+                                                   const VkPhysicalDevice16BitStorageFeatures* from,
+                                                   VkPhysicalDevice16BitStorageFeatures* to);
 
-void deepcopy_VkMemoryDedicatedRequirements(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryDedicatedRequirements* from,
-    VkMemoryDedicatedRequirements* to);
+void deepcopy_VkMemoryDedicatedRequirements(Allocator* alloc, VkStructureType rootType,
+                                            const VkMemoryDedicatedRequirements* from,
+                                            VkMemoryDedicatedRequirements* to);
 
-void deepcopy_VkMemoryDedicatedAllocateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryDedicatedAllocateInfo* from,
-    VkMemoryDedicatedAllocateInfo* to);
+void deepcopy_VkMemoryDedicatedAllocateInfo(Allocator* alloc, VkStructureType rootType,
+                                            const VkMemoryDedicatedAllocateInfo* from,
+                                            VkMemoryDedicatedAllocateInfo* to);
 
-void deepcopy_VkMemoryAllocateFlagsInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryAllocateFlagsInfo* from,
-    VkMemoryAllocateFlagsInfo* to);
+void deepcopy_VkMemoryAllocateFlagsInfo(Allocator* alloc, VkStructureType rootType,
+                                        const VkMemoryAllocateFlagsInfo* from,
+                                        VkMemoryAllocateFlagsInfo* to);
 
-void deepcopy_VkDeviceGroupRenderPassBeginInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDeviceGroupRenderPassBeginInfo* from,
-    VkDeviceGroupRenderPassBeginInfo* to);
+void deepcopy_VkDeviceGroupRenderPassBeginInfo(Allocator* alloc, VkStructureType rootType,
+                                               const VkDeviceGroupRenderPassBeginInfo* from,
+                                               VkDeviceGroupRenderPassBeginInfo* to);
 
-void deepcopy_VkDeviceGroupCommandBufferBeginInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDeviceGroupCommandBufferBeginInfo* from,
-    VkDeviceGroupCommandBufferBeginInfo* to);
+void deepcopy_VkDeviceGroupCommandBufferBeginInfo(Allocator* alloc, VkStructureType rootType,
+                                                  const VkDeviceGroupCommandBufferBeginInfo* from,
+                                                  VkDeviceGroupCommandBufferBeginInfo* to);
 
-void deepcopy_VkDeviceGroupSubmitInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDeviceGroupSubmitInfo* from,
-    VkDeviceGroupSubmitInfo* to);
+void deepcopy_VkDeviceGroupSubmitInfo(Allocator* alloc, VkStructureType rootType,
+                                      const VkDeviceGroupSubmitInfo* from,
+                                      VkDeviceGroupSubmitInfo* to);
 
-void deepcopy_VkDeviceGroupBindSparseInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDeviceGroupBindSparseInfo* from,
-    VkDeviceGroupBindSparseInfo* to);
+void deepcopy_VkDeviceGroupBindSparseInfo(Allocator* alloc, VkStructureType rootType,
+                                          const VkDeviceGroupBindSparseInfo* from,
+                                          VkDeviceGroupBindSparseInfo* to);
 
-void deepcopy_VkBindBufferMemoryDeviceGroupInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBindBufferMemoryDeviceGroupInfo* from,
-    VkBindBufferMemoryDeviceGroupInfo* to);
+void deepcopy_VkBindBufferMemoryDeviceGroupInfo(Allocator* alloc, VkStructureType rootType,
+                                                const VkBindBufferMemoryDeviceGroupInfo* from,
+                                                VkBindBufferMemoryDeviceGroupInfo* to);
 
-void deepcopy_VkBindImageMemoryDeviceGroupInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBindImageMemoryDeviceGroupInfo* from,
-    VkBindImageMemoryDeviceGroupInfo* to);
+void deepcopy_VkBindImageMemoryDeviceGroupInfo(Allocator* alloc, VkStructureType rootType,
+                                               const VkBindImageMemoryDeviceGroupInfo* from,
+                                               VkBindImageMemoryDeviceGroupInfo* to);
 
-void deepcopy_VkPhysicalDeviceGroupProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceGroupProperties* from,
-    VkPhysicalDeviceGroupProperties* to);
+void deepcopy_VkPhysicalDeviceGroupProperties(Allocator* alloc, VkStructureType rootType,
+                                              const VkPhysicalDeviceGroupProperties* from,
+                                              VkPhysicalDeviceGroupProperties* to);
 
-void deepcopy_VkDeviceGroupDeviceCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDeviceGroupDeviceCreateInfo* from,
-    VkDeviceGroupDeviceCreateInfo* to);
+void deepcopy_VkDeviceGroupDeviceCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                            const VkDeviceGroupDeviceCreateInfo* from,
+                                            VkDeviceGroupDeviceCreateInfo* to);
 
-void deepcopy_VkBufferMemoryRequirementsInfo2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBufferMemoryRequirementsInfo2* from,
-    VkBufferMemoryRequirementsInfo2* to);
+void deepcopy_VkBufferMemoryRequirementsInfo2(Allocator* alloc, VkStructureType rootType,
+                                              const VkBufferMemoryRequirementsInfo2* from,
+                                              VkBufferMemoryRequirementsInfo2* to);
 
-void deepcopy_VkImageMemoryRequirementsInfo2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageMemoryRequirementsInfo2* from,
-    VkImageMemoryRequirementsInfo2* to);
+void deepcopy_VkImageMemoryRequirementsInfo2(Allocator* alloc, VkStructureType rootType,
+                                             const VkImageMemoryRequirementsInfo2* from,
+                                             VkImageMemoryRequirementsInfo2* to);
 
-void deepcopy_VkImageSparseMemoryRequirementsInfo2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageSparseMemoryRequirementsInfo2* from,
-    VkImageSparseMemoryRequirementsInfo2* to);
+void deepcopy_VkImageSparseMemoryRequirementsInfo2(Allocator* alloc, VkStructureType rootType,
+                                                   const VkImageSparseMemoryRequirementsInfo2* from,
+                                                   VkImageSparseMemoryRequirementsInfo2* to);
 
-void deepcopy_VkMemoryRequirements2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryRequirements2* from,
-    VkMemoryRequirements2* to);
+void deepcopy_VkMemoryRequirements2(Allocator* alloc, VkStructureType rootType,
+                                    const VkMemoryRequirements2* from, VkMemoryRequirements2* to);
 
-void deepcopy_VkSparseImageMemoryRequirements2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSparseImageMemoryRequirements2* from,
-    VkSparseImageMemoryRequirements2* to);
+void deepcopy_VkSparseImageMemoryRequirements2(Allocator* alloc, VkStructureType rootType,
+                                               const VkSparseImageMemoryRequirements2* from,
+                                               VkSparseImageMemoryRequirements2* to);
 
-void deepcopy_VkPhysicalDeviceFeatures2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceFeatures2* from,
-    VkPhysicalDeviceFeatures2* to);
+void deepcopy_VkPhysicalDeviceFeatures2(Allocator* alloc, VkStructureType rootType,
+                                        const VkPhysicalDeviceFeatures2* from,
+                                        VkPhysicalDeviceFeatures2* to);
 
-void deepcopy_VkPhysicalDeviceProperties2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceProperties2* from,
-    VkPhysicalDeviceProperties2* to);
+void deepcopy_VkPhysicalDeviceProperties2(Allocator* alloc, VkStructureType rootType,
+                                          const VkPhysicalDeviceProperties2* from,
+                                          VkPhysicalDeviceProperties2* to);
 
-void deepcopy_VkFormatProperties2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkFormatProperties2* from,
-    VkFormatProperties2* to);
+void deepcopy_VkFormatProperties2(Allocator* alloc, VkStructureType rootType,
+                                  const VkFormatProperties2* from, VkFormatProperties2* to);
 
-void deepcopy_VkImageFormatProperties2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageFormatProperties2* from,
-    VkImageFormatProperties2* to);
+void deepcopy_VkImageFormatProperties2(Allocator* alloc, VkStructureType rootType,
+                                       const VkImageFormatProperties2* from,
+                                       VkImageFormatProperties2* to);
 
-void deepcopy_VkPhysicalDeviceImageFormatInfo2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceImageFormatInfo2* from,
-    VkPhysicalDeviceImageFormatInfo2* to);
+void deepcopy_VkPhysicalDeviceImageFormatInfo2(Allocator* alloc, VkStructureType rootType,
+                                               const VkPhysicalDeviceImageFormatInfo2* from,
+                                               VkPhysicalDeviceImageFormatInfo2* to);
 
-void deepcopy_VkQueueFamilyProperties2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkQueueFamilyProperties2* from,
-    VkQueueFamilyProperties2* to);
+void deepcopy_VkQueueFamilyProperties2(Allocator* alloc, VkStructureType rootType,
+                                       const VkQueueFamilyProperties2* from,
+                                       VkQueueFamilyProperties2* to);
 
-void deepcopy_VkPhysicalDeviceMemoryProperties2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceMemoryProperties2* from,
-    VkPhysicalDeviceMemoryProperties2* to);
+void deepcopy_VkPhysicalDeviceMemoryProperties2(Allocator* alloc, VkStructureType rootType,
+                                                const VkPhysicalDeviceMemoryProperties2* from,
+                                                VkPhysicalDeviceMemoryProperties2* to);
 
-void deepcopy_VkSparseImageFormatProperties2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSparseImageFormatProperties2* from,
-    VkSparseImageFormatProperties2* to);
+void deepcopy_VkSparseImageFormatProperties2(Allocator* alloc, VkStructureType rootType,
+                                             const VkSparseImageFormatProperties2* from,
+                                             VkSparseImageFormatProperties2* to);
 
 void deepcopy_VkPhysicalDeviceSparseImageFormatInfo2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceSparseImageFormatInfo2* from,
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDeviceSparseImageFormatInfo2* from,
     VkPhysicalDeviceSparseImageFormatInfo2* to);
 
 void deepcopy_VkPhysicalDevicePointClippingProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDevicePointClippingProperties* from,
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDevicePointClippingProperties* from,
     VkPhysicalDevicePointClippingProperties* to);
 
-void deepcopy_VkInputAttachmentAspectReference(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkInputAttachmentAspectReference* from,
-    VkInputAttachmentAspectReference* to);
+void deepcopy_VkInputAttachmentAspectReference(Allocator* alloc, VkStructureType rootType,
+                                               const VkInputAttachmentAspectReference* from,
+                                               VkInputAttachmentAspectReference* to);
 
 void deepcopy_VkRenderPassInputAttachmentAspectCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkRenderPassInputAttachmentAspectCreateInfo* from,
     VkRenderPassInputAttachmentAspectCreateInfo* to);
 
-void deepcopy_VkImageViewUsageCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageViewUsageCreateInfo* from,
-    VkImageViewUsageCreateInfo* to);
+void deepcopy_VkImageViewUsageCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                         const VkImageViewUsageCreateInfo* from,
+                                         VkImageViewUsageCreateInfo* to);
 
 void deepcopy_VkPipelineTessellationDomainOriginStateCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineTessellationDomainOriginStateCreateInfo* from,
     VkPipelineTessellationDomainOriginStateCreateInfo* to);
 
-void deepcopy_VkRenderPassMultiviewCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkRenderPassMultiviewCreateInfo* from,
-    VkRenderPassMultiviewCreateInfo* to);
+void deepcopy_VkRenderPassMultiviewCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                              const VkRenderPassMultiviewCreateInfo* from,
+                                              VkRenderPassMultiviewCreateInfo* to);
 
-void deepcopy_VkPhysicalDeviceMultiviewFeatures(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceMultiviewFeatures* from,
-    VkPhysicalDeviceMultiviewFeatures* to);
+void deepcopy_VkPhysicalDeviceMultiviewFeatures(Allocator* alloc, VkStructureType rootType,
+                                                const VkPhysicalDeviceMultiviewFeatures* from,
+                                                VkPhysicalDeviceMultiviewFeatures* to);
 
-void deepcopy_VkPhysicalDeviceMultiviewProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceMultiviewProperties* from,
-    VkPhysicalDeviceMultiviewProperties* to);
+void deepcopy_VkPhysicalDeviceMultiviewProperties(Allocator* alloc, VkStructureType rootType,
+                                                  const VkPhysicalDeviceMultiviewProperties* from,
+                                                  VkPhysicalDeviceMultiviewProperties* to);
 
 void deepcopy_VkPhysicalDeviceVariablePointersFeatures(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceVariablePointersFeatures* from,
     VkPhysicalDeviceVariablePointersFeatures* to);
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceVariablePointersFeatures, deepcopy_VkPhysicalDeviceVariablePointerFeatures)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceVariablePointersFeatures,
+                      deepcopy_VkPhysicalDeviceVariablePointerFeatures)
 
 void deepcopy_VkPhysicalDeviceProtectedMemoryFeatures(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceProtectedMemoryFeatures* from,
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDeviceProtectedMemoryFeatures* from,
     VkPhysicalDeviceProtectedMemoryFeatures* to);
 
 void deepcopy_VkPhysicalDeviceProtectedMemoryProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceProtectedMemoryProperties* from,
     VkPhysicalDeviceProtectedMemoryProperties* to);
 
-void deepcopy_VkDeviceQueueInfo2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDeviceQueueInfo2* from,
-    VkDeviceQueueInfo2* to);
+void deepcopy_VkDeviceQueueInfo2(Allocator* alloc, VkStructureType rootType,
+                                 const VkDeviceQueueInfo2* from, VkDeviceQueueInfo2* to);
 
-void deepcopy_VkProtectedSubmitInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkProtectedSubmitInfo* from,
-    VkProtectedSubmitInfo* to);
+void deepcopy_VkProtectedSubmitInfo(Allocator* alloc, VkStructureType rootType,
+                                    const VkProtectedSubmitInfo* from, VkProtectedSubmitInfo* to);
 
-void deepcopy_VkSamplerYcbcrConversionCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSamplerYcbcrConversionCreateInfo* from,
-    VkSamplerYcbcrConversionCreateInfo* to);
+void deepcopy_VkSamplerYcbcrConversionCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                                 const VkSamplerYcbcrConversionCreateInfo* from,
+                                                 VkSamplerYcbcrConversionCreateInfo* to);
 
-void deepcopy_VkSamplerYcbcrConversionInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSamplerYcbcrConversionInfo* from,
-    VkSamplerYcbcrConversionInfo* to);
+void deepcopy_VkSamplerYcbcrConversionInfo(Allocator* alloc, VkStructureType rootType,
+                                           const VkSamplerYcbcrConversionInfo* from,
+                                           VkSamplerYcbcrConversionInfo* to);
 
-void deepcopy_VkBindImagePlaneMemoryInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBindImagePlaneMemoryInfo* from,
-    VkBindImagePlaneMemoryInfo* to);
+void deepcopy_VkBindImagePlaneMemoryInfo(Allocator* alloc, VkStructureType rootType,
+                                         const VkBindImagePlaneMemoryInfo* from,
+                                         VkBindImagePlaneMemoryInfo* to);
 
-void deepcopy_VkImagePlaneMemoryRequirementsInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImagePlaneMemoryRequirementsInfo* from,
-    VkImagePlaneMemoryRequirementsInfo* to);
+void deepcopy_VkImagePlaneMemoryRequirementsInfo(Allocator* alloc, VkStructureType rootType,
+                                                 const VkImagePlaneMemoryRequirementsInfo* from,
+                                                 VkImagePlaneMemoryRequirementsInfo* to);
 
 void deepcopy_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceSamplerYcbcrConversionFeatures* from,
     VkPhysicalDeviceSamplerYcbcrConversionFeatures* to);
 
 void deepcopy_VkSamplerYcbcrConversionImageFormatProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkSamplerYcbcrConversionImageFormatProperties* from,
     VkSamplerYcbcrConversionImageFormatProperties* to);
 
-void deepcopy_VkDescriptorUpdateTemplateEntry(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDescriptorUpdateTemplateEntry* from,
-    VkDescriptorUpdateTemplateEntry* to);
+void deepcopy_VkDescriptorUpdateTemplateEntry(Allocator* alloc, VkStructureType rootType,
+                                              const VkDescriptorUpdateTemplateEntry* from,
+                                              VkDescriptorUpdateTemplateEntry* to);
 
-void deepcopy_VkDescriptorUpdateTemplateCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDescriptorUpdateTemplateCreateInfo* from,
-    VkDescriptorUpdateTemplateCreateInfo* to);
+void deepcopy_VkDescriptorUpdateTemplateCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                                   const VkDescriptorUpdateTemplateCreateInfo* from,
+                                                   VkDescriptorUpdateTemplateCreateInfo* to);
 
-void deepcopy_VkExternalMemoryProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExternalMemoryProperties* from,
-    VkExternalMemoryProperties* to);
+void deepcopy_VkExternalMemoryProperties(Allocator* alloc, VkStructureType rootType,
+                                         const VkExternalMemoryProperties* from,
+                                         VkExternalMemoryProperties* to);
 
 void deepcopy_VkPhysicalDeviceExternalImageFormatInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceExternalImageFormatInfo* from,
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDeviceExternalImageFormatInfo* from,
     VkPhysicalDeviceExternalImageFormatInfo* to);
 
-void deepcopy_VkExternalImageFormatProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExternalImageFormatProperties* from,
-    VkExternalImageFormatProperties* to);
+void deepcopy_VkExternalImageFormatProperties(Allocator* alloc, VkStructureType rootType,
+                                              const VkExternalImageFormatProperties* from,
+                                              VkExternalImageFormatProperties* to);
 
-void deepcopy_VkPhysicalDeviceExternalBufferInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceExternalBufferInfo* from,
-    VkPhysicalDeviceExternalBufferInfo* to);
+void deepcopy_VkPhysicalDeviceExternalBufferInfo(Allocator* alloc, VkStructureType rootType,
+                                                 const VkPhysicalDeviceExternalBufferInfo* from,
+                                                 VkPhysicalDeviceExternalBufferInfo* to);
 
-void deepcopy_VkExternalBufferProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExternalBufferProperties* from,
-    VkExternalBufferProperties* to);
+void deepcopy_VkExternalBufferProperties(Allocator* alloc, VkStructureType rootType,
+                                         const VkExternalBufferProperties* from,
+                                         VkExternalBufferProperties* to);
 
-void deepcopy_VkPhysicalDeviceIDProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceIDProperties* from,
-    VkPhysicalDeviceIDProperties* to);
+void deepcopy_VkPhysicalDeviceIDProperties(Allocator* alloc, VkStructureType rootType,
+                                           const VkPhysicalDeviceIDProperties* from,
+                                           VkPhysicalDeviceIDProperties* to);
 
-void deepcopy_VkExternalMemoryImageCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExternalMemoryImageCreateInfo* from,
-    VkExternalMemoryImageCreateInfo* to);
+void deepcopy_VkExternalMemoryImageCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                              const VkExternalMemoryImageCreateInfo* from,
+                                              VkExternalMemoryImageCreateInfo* to);
 
-void deepcopy_VkExternalMemoryBufferCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExternalMemoryBufferCreateInfo* from,
-    VkExternalMemoryBufferCreateInfo* to);
+void deepcopy_VkExternalMemoryBufferCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                               const VkExternalMemoryBufferCreateInfo* from,
+                                               VkExternalMemoryBufferCreateInfo* to);
 
-void deepcopy_VkExportMemoryAllocateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExportMemoryAllocateInfo* from,
-    VkExportMemoryAllocateInfo* to);
+void deepcopy_VkExportMemoryAllocateInfo(Allocator* alloc, VkStructureType rootType,
+                                         const VkExportMemoryAllocateInfo* from,
+                                         VkExportMemoryAllocateInfo* to);
 
-void deepcopy_VkPhysicalDeviceExternalFenceInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceExternalFenceInfo* from,
-    VkPhysicalDeviceExternalFenceInfo* to);
+void deepcopy_VkPhysicalDeviceExternalFenceInfo(Allocator* alloc, VkStructureType rootType,
+                                                const VkPhysicalDeviceExternalFenceInfo* from,
+                                                VkPhysicalDeviceExternalFenceInfo* to);
 
-void deepcopy_VkExternalFenceProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExternalFenceProperties* from,
-    VkExternalFenceProperties* to);
+void deepcopy_VkExternalFenceProperties(Allocator* alloc, VkStructureType rootType,
+                                        const VkExternalFenceProperties* from,
+                                        VkExternalFenceProperties* to);
 
-void deepcopy_VkExportFenceCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExportFenceCreateInfo* from,
-    VkExportFenceCreateInfo* to);
+void deepcopy_VkExportFenceCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                      const VkExportFenceCreateInfo* from,
+                                      VkExportFenceCreateInfo* to);
 
-void deepcopy_VkExportSemaphoreCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExportSemaphoreCreateInfo* from,
-    VkExportSemaphoreCreateInfo* to);
+void deepcopy_VkExportSemaphoreCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                          const VkExportSemaphoreCreateInfo* from,
+                                          VkExportSemaphoreCreateInfo* to);
 
 void deepcopy_VkPhysicalDeviceExternalSemaphoreInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceExternalSemaphoreInfo* from,
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDeviceExternalSemaphoreInfo* from,
     VkPhysicalDeviceExternalSemaphoreInfo* to);
 
-void deepcopy_VkExternalSemaphoreProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExternalSemaphoreProperties* from,
-    VkExternalSemaphoreProperties* to);
+void deepcopy_VkExternalSemaphoreProperties(Allocator* alloc, VkStructureType rootType,
+                                            const VkExternalSemaphoreProperties* from,
+                                            VkExternalSemaphoreProperties* to);
 
 void deepcopy_VkPhysicalDeviceMaintenance3Properties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceMaintenance3Properties* from,
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDeviceMaintenance3Properties* from,
     VkPhysicalDeviceMaintenance3Properties* to);
 
-void deepcopy_VkDescriptorSetLayoutSupport(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDescriptorSetLayoutSupport* from,
-    VkDescriptorSetLayoutSupport* to);
+void deepcopy_VkDescriptorSetLayoutSupport(Allocator* alloc, VkStructureType rootType,
+                                           const VkDescriptorSetLayoutSupport* from,
+                                           VkDescriptorSetLayoutSupport* to);
 
 void deepcopy_VkPhysicalDeviceShaderDrawParametersFeatures(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShaderDrawParametersFeatures* from,
     VkPhysicalDeviceShaderDrawParametersFeatures* to);
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceShaderDrawParametersFeatures, deepcopy_VkPhysicalDeviceShaderDrawParameterFeatures)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceShaderDrawParametersFeatures,
+                      deepcopy_VkPhysicalDeviceShaderDrawParameterFeatures)
 
 #endif
 #ifdef VK_VERSION_1_2
-void deepcopy_VkPhysicalDeviceVulkan11Features(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceVulkan11Features* from,
-    VkPhysicalDeviceVulkan11Features* to);
+void deepcopy_VkPhysicalDeviceVulkan11Features(Allocator* alloc, VkStructureType rootType,
+                                               const VkPhysicalDeviceVulkan11Features* from,
+                                               VkPhysicalDeviceVulkan11Features* to);
 
-void deepcopy_VkPhysicalDeviceVulkan11Properties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceVulkan11Properties* from,
-    VkPhysicalDeviceVulkan11Properties* to);
+void deepcopy_VkPhysicalDeviceVulkan11Properties(Allocator* alloc, VkStructureType rootType,
+                                                 const VkPhysicalDeviceVulkan11Properties* from,
+                                                 VkPhysicalDeviceVulkan11Properties* to);
 
-void deepcopy_VkPhysicalDeviceVulkan12Features(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceVulkan12Features* from,
-    VkPhysicalDeviceVulkan12Features* to);
+void deepcopy_VkPhysicalDeviceVulkan12Features(Allocator* alloc, VkStructureType rootType,
+                                               const VkPhysicalDeviceVulkan12Features* from,
+                                               VkPhysicalDeviceVulkan12Features* to);
 
-void deepcopy_VkConformanceVersion(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkConformanceVersion* from,
-    VkConformanceVersion* to);
+void deepcopy_VkConformanceVersion(Allocator* alloc, VkStructureType rootType,
+                                   const VkConformanceVersion* from, VkConformanceVersion* to);
 
-void deepcopy_VkPhysicalDeviceVulkan12Properties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceVulkan12Properties* from,
-    VkPhysicalDeviceVulkan12Properties* to);
+void deepcopy_VkPhysicalDeviceVulkan12Properties(Allocator* alloc, VkStructureType rootType,
+                                                 const VkPhysicalDeviceVulkan12Properties* from,
+                                                 VkPhysicalDeviceVulkan12Properties* to);
 
-void deepcopy_VkImageFormatListCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageFormatListCreateInfo* from,
-    VkImageFormatListCreateInfo* to);
+void deepcopy_VkImageFormatListCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                          const VkImageFormatListCreateInfo* from,
+                                          VkImageFormatListCreateInfo* to);
 
-void deepcopy_VkAttachmentDescription2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAttachmentDescription2* from,
-    VkAttachmentDescription2* to);
+void deepcopy_VkAttachmentDescription2(Allocator* alloc, VkStructureType rootType,
+                                       const VkAttachmentDescription2* from,
+                                       VkAttachmentDescription2* to);
 
-void deepcopy_VkAttachmentReference2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAttachmentReference2* from,
-    VkAttachmentReference2* to);
+void deepcopy_VkAttachmentReference2(Allocator* alloc, VkStructureType rootType,
+                                     const VkAttachmentReference2* from,
+                                     VkAttachmentReference2* to);
 
-void deepcopy_VkSubpassDescription2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSubpassDescription2* from,
-    VkSubpassDescription2* to);
+void deepcopy_VkSubpassDescription2(Allocator* alloc, VkStructureType rootType,
+                                    const VkSubpassDescription2* from, VkSubpassDescription2* to);
 
-void deepcopy_VkSubpassDependency2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSubpassDependency2* from,
-    VkSubpassDependency2* to);
+void deepcopy_VkSubpassDependency2(Allocator* alloc, VkStructureType rootType,
+                                   const VkSubpassDependency2* from, VkSubpassDependency2* to);
 
-void deepcopy_VkRenderPassCreateInfo2(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkRenderPassCreateInfo2* from,
-    VkRenderPassCreateInfo2* to);
+void deepcopy_VkRenderPassCreateInfo2(Allocator* alloc, VkStructureType rootType,
+                                      const VkRenderPassCreateInfo2* from,
+                                      VkRenderPassCreateInfo2* to);
 
-void deepcopy_VkSubpassBeginInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSubpassBeginInfo* from,
-    VkSubpassBeginInfo* to);
+void deepcopy_VkSubpassBeginInfo(Allocator* alloc, VkStructureType rootType,
+                                 const VkSubpassBeginInfo* from, VkSubpassBeginInfo* to);
 
-void deepcopy_VkSubpassEndInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSubpassEndInfo* from,
-    VkSubpassEndInfo* to);
+void deepcopy_VkSubpassEndInfo(Allocator* alloc, VkStructureType rootType,
+                               const VkSubpassEndInfo* from, VkSubpassEndInfo* to);
 
-void deepcopy_VkPhysicalDevice8BitStorageFeatures(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDevice8BitStorageFeatures* from,
-    VkPhysicalDevice8BitStorageFeatures* to);
+void deepcopy_VkPhysicalDevice8BitStorageFeatures(Allocator* alloc, VkStructureType rootType,
+                                                  const VkPhysicalDevice8BitStorageFeatures* from,
+                                                  VkPhysicalDevice8BitStorageFeatures* to);
 
-void deepcopy_VkPhysicalDeviceDriverProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceDriverProperties* from,
-    VkPhysicalDeviceDriverProperties* to);
+void deepcopy_VkPhysicalDeviceDriverProperties(Allocator* alloc, VkStructureType rootType,
+                                               const VkPhysicalDeviceDriverProperties* from,
+                                               VkPhysicalDeviceDriverProperties* to);
 
 void deepcopy_VkPhysicalDeviceShaderAtomicInt64Features(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShaderAtomicInt64Features* from,
     VkPhysicalDeviceShaderAtomicInt64Features* to);
 
 void deepcopy_VkPhysicalDeviceShaderFloat16Int8Features(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShaderFloat16Int8Features* from,
     VkPhysicalDeviceShaderFloat16Int8Features* to);
 
 void deepcopy_VkPhysicalDeviceFloatControlsProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceFloatControlsProperties* from,
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDeviceFloatControlsProperties* from,
     VkPhysicalDeviceFloatControlsProperties* to);
 
 void deepcopy_VkDescriptorSetLayoutBindingFlagsCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkDescriptorSetLayoutBindingFlagsCreateInfo* from,
     VkDescriptorSetLayoutBindingFlagsCreateInfo* to);
 
 void deepcopy_VkPhysicalDeviceDescriptorIndexingFeatures(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceDescriptorIndexingFeatures* from,
     VkPhysicalDeviceDescriptorIndexingFeatures* to);
 
 void deepcopy_VkPhysicalDeviceDescriptorIndexingProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceDescriptorIndexingProperties* from,
     VkPhysicalDeviceDescriptorIndexingProperties* to);
 
 void deepcopy_VkDescriptorSetVariableDescriptorCountAllocateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkDescriptorSetVariableDescriptorCountAllocateInfo* from,
     VkDescriptorSetVariableDescriptorCountAllocateInfo* to);
 
 void deepcopy_VkDescriptorSetVariableDescriptorCountLayoutSupport(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkDescriptorSetVariableDescriptorCountLayoutSupport* from,
     VkDescriptorSetVariableDescriptorCountLayoutSupport* to);
 
 void deepcopy_VkSubpassDescriptionDepthStencilResolve(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSubpassDescriptionDepthStencilResolve* from,
+    Allocator* alloc, VkStructureType rootType, const VkSubpassDescriptionDepthStencilResolve* from,
     VkSubpassDescriptionDepthStencilResolve* to);
 
 void deepcopy_VkPhysicalDeviceDepthStencilResolveProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceDepthStencilResolveProperties* from,
     VkPhysicalDeviceDepthStencilResolveProperties* to);
 
 void deepcopy_VkPhysicalDeviceScalarBlockLayoutFeatures(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceScalarBlockLayoutFeatures* from,
     VkPhysicalDeviceScalarBlockLayoutFeatures* to);
 
-void deepcopy_VkImageStencilUsageCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageStencilUsageCreateInfo* from,
-    VkImageStencilUsageCreateInfo* to);
+void deepcopy_VkImageStencilUsageCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                            const VkImageStencilUsageCreateInfo* from,
+                                            VkImageStencilUsageCreateInfo* to);
 
-void deepcopy_VkSamplerReductionModeCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSamplerReductionModeCreateInfo* from,
-    VkSamplerReductionModeCreateInfo* to);
+void deepcopy_VkSamplerReductionModeCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                               const VkSamplerReductionModeCreateInfo* from,
+                                               VkSamplerReductionModeCreateInfo* to);
 
 void deepcopy_VkPhysicalDeviceSamplerFilterMinmaxProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceSamplerFilterMinmaxProperties* from,
     VkPhysicalDeviceSamplerFilterMinmaxProperties* to);
 
 void deepcopy_VkPhysicalDeviceVulkanMemoryModelFeatures(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceVulkanMemoryModelFeatures* from,
     VkPhysicalDeviceVulkanMemoryModelFeatures* to);
 
 void deepcopy_VkPhysicalDeviceImagelessFramebufferFeatures(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceImagelessFramebufferFeatures* from,
     VkPhysicalDeviceImagelessFramebufferFeatures* to);
 
-void deepcopy_VkFramebufferAttachmentImageInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkFramebufferAttachmentImageInfo* from,
-    VkFramebufferAttachmentImageInfo* to);
+void deepcopy_VkFramebufferAttachmentImageInfo(Allocator* alloc, VkStructureType rootType,
+                                               const VkFramebufferAttachmentImageInfo* from,
+                                               VkFramebufferAttachmentImageInfo* to);
 
-void deepcopy_VkFramebufferAttachmentsCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkFramebufferAttachmentsCreateInfo* from,
-    VkFramebufferAttachmentsCreateInfo* to);
+void deepcopy_VkFramebufferAttachmentsCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                                 const VkFramebufferAttachmentsCreateInfo* from,
+                                                 VkFramebufferAttachmentsCreateInfo* to);
 
-void deepcopy_VkRenderPassAttachmentBeginInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkRenderPassAttachmentBeginInfo* from,
-    VkRenderPassAttachmentBeginInfo* to);
+void deepcopy_VkRenderPassAttachmentBeginInfo(Allocator* alloc, VkStructureType rootType,
+                                              const VkRenderPassAttachmentBeginInfo* from,
+                                              VkRenderPassAttachmentBeginInfo* to);
 
 void deepcopy_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceUniformBufferStandardLayoutFeatures* from,
     VkPhysicalDeviceUniformBufferStandardLayoutFeatures* to);
 
 void deepcopy_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* from,
     VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* to);
 
 void deepcopy_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* from,
     VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* to);
 
-void deepcopy_VkAttachmentReferenceStencilLayout(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAttachmentReferenceStencilLayout* from,
-    VkAttachmentReferenceStencilLayout* to);
+void deepcopy_VkAttachmentReferenceStencilLayout(Allocator* alloc, VkStructureType rootType,
+                                                 const VkAttachmentReferenceStencilLayout* from,
+                                                 VkAttachmentReferenceStencilLayout* to);
 
-void deepcopy_VkAttachmentDescriptionStencilLayout(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAttachmentDescriptionStencilLayout* from,
-    VkAttachmentDescriptionStencilLayout* to);
+void deepcopy_VkAttachmentDescriptionStencilLayout(Allocator* alloc, VkStructureType rootType,
+                                                   const VkAttachmentDescriptionStencilLayout* from,
+                                                   VkAttachmentDescriptionStencilLayout* to);
 
 void deepcopy_VkPhysicalDeviceHostQueryResetFeatures(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceHostQueryResetFeatures* from,
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDeviceHostQueryResetFeatures* from,
     VkPhysicalDeviceHostQueryResetFeatures* to);
 
 void deepcopy_VkPhysicalDeviceTimelineSemaphoreFeatures(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceTimelineSemaphoreFeatures* from,
     VkPhysicalDeviceTimelineSemaphoreFeatures* to);
 
 void deepcopy_VkPhysicalDeviceTimelineSemaphoreProperties(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceTimelineSemaphoreProperties* from,
     VkPhysicalDeviceTimelineSemaphoreProperties* to);
 
-void deepcopy_VkSemaphoreTypeCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSemaphoreTypeCreateInfo* from,
-    VkSemaphoreTypeCreateInfo* to);
+void deepcopy_VkSemaphoreTypeCreateInfo(Allocator* alloc, VkStructureType rootType,
+                                        const VkSemaphoreTypeCreateInfo* from,
+                                        VkSemaphoreTypeCreateInfo* to);
 
-void deepcopy_VkTimelineSemaphoreSubmitInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkTimelineSemaphoreSubmitInfo* from,
-    VkTimelineSemaphoreSubmitInfo* to);
+void deepcopy_VkTimelineSemaphoreSubmitInfo(Allocator* alloc, VkStructureType rootType,
+                                            const VkTimelineSemaphoreSubmitInfo* from,
+                                            VkTimelineSemaphoreSubmitInfo* to);
 
-void deepcopy_VkSemaphoreWaitInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSemaphoreWaitInfo* from,
-    VkSemaphoreWaitInfo* to);
+void deepcopy_VkSemaphoreWaitInfo(Allocator* alloc, VkStructureType rootType,
+                                  const VkSemaphoreWaitInfo* from, VkSemaphoreWaitInfo* to);
 
-void deepcopy_VkSemaphoreSignalInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSemaphoreSignalInfo* from,
-    VkSemaphoreSignalInfo* to);
+void deepcopy_VkSemaphoreSignalInfo(Allocator* alloc, VkStructureType rootType,
+                                    const VkSemaphoreSignalInfo* from, VkSemaphoreSignalInfo* to);
 
 void deepcopy_VkPhysicalDeviceBufferDeviceAddressFeatures(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceBufferDeviceAddressFeatures* from,
     VkPhysicalDeviceBufferDeviceAddressFeatures* to);
 
-void deepcopy_VkBufferDeviceAddressInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBufferDeviceAddressInfo* from,
-    VkBufferDeviceAddressInfo* to);
+void deepcopy_VkBufferDeviceAddressInfo(Allocator* alloc, VkStructureType rootType,
+                                        const VkBufferDeviceAddressInfo* from,
+                                        VkBufferDeviceAddressInfo* to);
 
 void deepcopy_VkBufferOpaqueCaptureAddressCreateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBufferOpaqueCaptureAddressCreateInfo* from,
+    Allocator* alloc, VkStructureType rootType, const VkBufferOpaqueCaptureAddressCreateInfo* from,
     VkBufferOpaqueCaptureAddressCreateInfo* to);
 
 void deepcopy_VkMemoryOpaqueCaptureAddressAllocateInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkMemoryOpaqueCaptureAddressAllocateInfo* from,
     VkMemoryOpaqueCaptureAddressAllocateInfo* to);
 
 void deepcopy_VkDeviceMemoryOpaqueCaptureAddressInfo(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDeviceMemoryOpaqueCaptureAddressInfo* from,
+    Allocator* alloc, VkStructureType rootType, const VkDeviceMemoryOpaqueCaptureAddressInfo* from,
     VkDeviceMemoryOpaqueCaptureAddressInfo* to);
 
 #endif
 #ifdef VK_KHR_surface
-void deepcopy_VkSurfaceCapabilitiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSurfaceCapabilitiesKHR* from,
-    VkSurfaceCapabilitiesKHR* to);
+void deepcopy_VkSurfaceCapabilitiesKHR(Allocator* alloc, VkStructureType rootType,
+                                       const VkSurfaceCapabilitiesKHR* from,
+                                       VkSurfaceCapabilitiesKHR* to);
 
-void deepcopy_VkSurfaceFormatKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSurfaceFormatKHR* from,
-    VkSurfaceFormatKHR* to);
+void deepcopy_VkSurfaceFormatKHR(Allocator* alloc, VkStructureType rootType,
+                                 const VkSurfaceFormatKHR* from, VkSurfaceFormatKHR* to);
 
 #endif
 #ifdef VK_KHR_swapchain
-void deepcopy_VkSwapchainCreateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSwapchainCreateInfoKHR* from,
-    VkSwapchainCreateInfoKHR* to);
+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_VkPresentInfoKHR(Allocator* alloc, VkStructureType rootType,
+                               const VkPresentInfoKHR* from, VkPresentInfoKHR* to);
 
-void deepcopy_VkImageSwapchainCreateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageSwapchainCreateInfoKHR* from,
-    VkImageSwapchainCreateInfoKHR* 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_VkBindImageMemorySwapchainInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                                const VkBindImageMemorySwapchainInfoKHR* from,
+                                                VkBindImageMemorySwapchainInfoKHR* to);
 
-void deepcopy_VkAcquireNextImageInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAcquireNextImageInfoKHR* from,
-    VkAcquireNextImageInfoKHR* 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_VkDeviceGroupPresentCapabilitiesKHR(Allocator* alloc, VkStructureType rootType,
+                                                  const VkDeviceGroupPresentCapabilitiesKHR* from,
+                                                  VkDeviceGroupPresentCapabilitiesKHR* to);
 
-void deepcopy_VkDeviceGroupPresentInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDeviceGroupPresentInfoKHR* from,
-    VkDeviceGroupPresentInfoKHR* 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);
+void deepcopy_VkDeviceGroupSwapchainCreateInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                                  const VkDeviceGroupSwapchainCreateInfoKHR* from,
+                                                  VkDeviceGroupSwapchainCreateInfoKHR* to);
 
 #endif
 #ifdef VK_KHR_display
-void deepcopy_VkDisplayModeParametersKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDisplayModeParametersKHR* from,
-    VkDisplayModeParametersKHR* to);
+void deepcopy_VkDisplayModeParametersKHR(Allocator* alloc, VkStructureType rootType,
+                                         const VkDisplayModeParametersKHR* from,
+                                         VkDisplayModeParametersKHR* to);
 
-void deepcopy_VkDisplayModeCreateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDisplayModeCreateInfoKHR* from,
-    VkDisplayModeCreateInfoKHR* to);
+void deepcopy_VkDisplayModeCreateInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                         const VkDisplayModeCreateInfoKHR* from,
+                                         VkDisplayModeCreateInfoKHR* to);
 
-void deepcopy_VkDisplayModePropertiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDisplayModePropertiesKHR* from,
-    VkDisplayModePropertiesKHR* to);
+void deepcopy_VkDisplayModePropertiesKHR(Allocator* alloc, VkStructureType rootType,
+                                         const VkDisplayModePropertiesKHR* from,
+                                         VkDisplayModePropertiesKHR* to);
 
-void deepcopy_VkDisplayPlaneCapabilitiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDisplayPlaneCapabilitiesKHR* from,
-    VkDisplayPlaneCapabilitiesKHR* to);
+void deepcopy_VkDisplayPlaneCapabilitiesKHR(Allocator* alloc, VkStructureType rootType,
+                                            const VkDisplayPlaneCapabilitiesKHR* from,
+                                            VkDisplayPlaneCapabilitiesKHR* to);
 
-void deepcopy_VkDisplayPlanePropertiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDisplayPlanePropertiesKHR* from,
-    VkDisplayPlanePropertiesKHR* to);
+void deepcopy_VkDisplayPlanePropertiesKHR(Allocator* alloc, VkStructureType rootType,
+                                          const VkDisplayPlanePropertiesKHR* from,
+                                          VkDisplayPlanePropertiesKHR* to);
 
-void deepcopy_VkDisplayPropertiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDisplayPropertiesKHR* from,
-    VkDisplayPropertiesKHR* to);
+void deepcopy_VkDisplayPropertiesKHR(Allocator* alloc, VkStructureType rootType,
+                                     const VkDisplayPropertiesKHR* from,
+                                     VkDisplayPropertiesKHR* to);
 
-void deepcopy_VkDisplaySurfaceCreateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDisplaySurfaceCreateInfoKHR* from,
-    VkDisplaySurfaceCreateInfoKHR* to);
+void deepcopy_VkDisplaySurfaceCreateInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                            const VkDisplaySurfaceCreateInfoKHR* from,
+                                            VkDisplaySurfaceCreateInfoKHR* to);
 
 #endif
 #ifdef VK_KHR_display_swapchain
-void deepcopy_VkDisplayPresentInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDisplayPresentInfoKHR* from,
-    VkDisplayPresentInfoKHR* to);
+void deepcopy_VkDisplayPresentInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                      const VkDisplayPresentInfoKHR* from,
+                                      VkDisplayPresentInfoKHR* to);
 
 #endif
 #ifdef VK_KHR_xlib_surface
-void deepcopy_VkXlibSurfaceCreateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkXlibSurfaceCreateInfoKHR* from,
-    VkXlibSurfaceCreateInfoKHR* to);
+void deepcopy_VkXlibSurfaceCreateInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                         const VkXlibSurfaceCreateInfoKHR* from,
+                                         VkXlibSurfaceCreateInfoKHR* to);
 
 #endif
 #ifdef VK_KHR_xcb_surface
-void deepcopy_VkXcbSurfaceCreateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkXcbSurfaceCreateInfoKHR* from,
-    VkXcbSurfaceCreateInfoKHR* to);
+void deepcopy_VkXcbSurfaceCreateInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                        const VkXcbSurfaceCreateInfoKHR* from,
+                                        VkXcbSurfaceCreateInfoKHR* to);
 
 #endif
 #ifdef VK_KHR_wayland_surface
-void deepcopy_VkWaylandSurfaceCreateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkWaylandSurfaceCreateInfoKHR* from,
-    VkWaylandSurfaceCreateInfoKHR* to);
+void deepcopy_VkWaylandSurfaceCreateInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                            const VkWaylandSurfaceCreateInfoKHR* from,
+                                            VkWaylandSurfaceCreateInfoKHR* to);
 
 #endif
 #ifdef VK_KHR_android_surface
-void deepcopy_VkAndroidSurfaceCreateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAndroidSurfaceCreateInfoKHR* from,
-    VkAndroidSurfaceCreateInfoKHR* to);
+void deepcopy_VkAndroidSurfaceCreateInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                            const VkAndroidSurfaceCreateInfoKHR* from,
+                                            VkAndroidSurfaceCreateInfoKHR* to);
 
 #endif
 #ifdef VK_KHR_win32_surface
-void deepcopy_VkWin32SurfaceCreateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkWin32SurfaceCreateInfoKHR* from,
-    VkWin32SurfaceCreateInfoKHR* to);
+void deepcopy_VkWin32SurfaceCreateInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                          const VkWin32SurfaceCreateInfoKHR* from,
+                                          VkWin32SurfaceCreateInfoKHR* to);
 
 #endif
 #ifdef VK_KHR_sampler_mirror_clamp_to_edge
 #endif
 #ifdef VK_KHR_video_queue
-void deepcopy_VkVideoQueueFamilyProperties2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoQueueFamilyProperties2KHR* from,
-    VkVideoQueueFamilyProperties2KHR* to);
+void deepcopy_VkVideoQueueFamilyProperties2KHR(Allocator* alloc, VkStructureType rootType,
+                                               const VkVideoQueueFamilyProperties2KHR* from,
+                                               VkVideoQueueFamilyProperties2KHR* to);
 
-void deepcopy_VkVideoProfileKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoProfileKHR* from,
-    VkVideoProfileKHR* to);
+void deepcopy_VkVideoProfileKHR(Allocator* alloc, VkStructureType rootType,
+                                const VkVideoProfileKHR* from, VkVideoProfileKHR* to);
 
-void deepcopy_VkVideoProfilesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoProfilesKHR* from,
-    VkVideoProfilesKHR* to);
+void deepcopy_VkVideoProfilesKHR(Allocator* alloc, VkStructureType rootType,
+                                 const VkVideoProfilesKHR* from, VkVideoProfilesKHR* to);
 
-void deepcopy_VkVideoCapabilitiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoCapabilitiesKHR* from,
-    VkVideoCapabilitiesKHR* to);
+void deepcopy_VkVideoCapabilitiesKHR(Allocator* alloc, VkStructureType rootType,
+                                     const VkVideoCapabilitiesKHR* from,
+                                     VkVideoCapabilitiesKHR* to);
 
-void deepcopy_VkPhysicalDeviceVideoFormatInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceVideoFormatInfoKHR* from,
-    VkPhysicalDeviceVideoFormatInfoKHR* to);
+void deepcopy_VkPhysicalDeviceVideoFormatInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                                 const VkPhysicalDeviceVideoFormatInfoKHR* from,
+                                                 VkPhysicalDeviceVideoFormatInfoKHR* to);
 
-void deepcopy_VkVideoFormatPropertiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoFormatPropertiesKHR* from,
-    VkVideoFormatPropertiesKHR* to);
+void deepcopy_VkVideoFormatPropertiesKHR(Allocator* alloc, VkStructureType rootType,
+                                         const VkVideoFormatPropertiesKHR* from,
+                                         VkVideoFormatPropertiesKHR* to);
 
-void deepcopy_VkVideoPictureResourceKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoPictureResourceKHR* from,
-    VkVideoPictureResourceKHR* to);
+void deepcopy_VkVideoPictureResourceKHR(Allocator* alloc, VkStructureType rootType,
+                                        const VkVideoPictureResourceKHR* from,
+                                        VkVideoPictureResourceKHR* to);
 
-void deepcopy_VkVideoReferenceSlotKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoReferenceSlotKHR* from,
-    VkVideoReferenceSlotKHR* to);
+void deepcopy_VkVideoReferenceSlotKHR(Allocator* alloc, VkStructureType rootType,
+                                      const VkVideoReferenceSlotKHR* from,
+                                      VkVideoReferenceSlotKHR* to);
 
-void deepcopy_VkVideoGetMemoryPropertiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoGetMemoryPropertiesKHR* from,
-    VkVideoGetMemoryPropertiesKHR* to);
+void deepcopy_VkVideoGetMemoryPropertiesKHR(Allocator* alloc, VkStructureType rootType,
+                                            const VkVideoGetMemoryPropertiesKHR* from,
+                                            VkVideoGetMemoryPropertiesKHR* to);
 
-void deepcopy_VkVideoBindMemoryKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoBindMemoryKHR* from,
-    VkVideoBindMemoryKHR* to);
+void deepcopy_VkVideoBindMemoryKHR(Allocator* alloc, VkStructureType rootType,
+                                   const VkVideoBindMemoryKHR* from, VkVideoBindMemoryKHR* to);
 
-void deepcopy_VkVideoSessionCreateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoSessionCreateInfoKHR* from,
-    VkVideoSessionCreateInfoKHR* to);
+void deepcopy_VkVideoSessionCreateInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                          const VkVideoSessionCreateInfoKHR* from,
+                                          VkVideoSessionCreateInfoKHR* to);
 
 void deepcopy_VkVideoSessionParametersCreateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoSessionParametersCreateInfoKHR* from,
+    Allocator* alloc, VkStructureType rootType, const VkVideoSessionParametersCreateInfoKHR* from,
     VkVideoSessionParametersCreateInfoKHR* to);
 
 void deepcopy_VkVideoSessionParametersUpdateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoSessionParametersUpdateInfoKHR* from,
+    Allocator* alloc, VkStructureType rootType, const VkVideoSessionParametersUpdateInfoKHR* from,
     VkVideoSessionParametersUpdateInfoKHR* to);
 
-void deepcopy_VkVideoBeginCodingInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoBeginCodingInfoKHR* from,
-    VkVideoBeginCodingInfoKHR* to);
+void deepcopy_VkVideoBeginCodingInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                        const VkVideoBeginCodingInfoKHR* from,
+                                        VkVideoBeginCodingInfoKHR* to);
 
-void deepcopy_VkVideoEndCodingInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoEndCodingInfoKHR* from,
-    VkVideoEndCodingInfoKHR* to);
+void deepcopy_VkVideoEndCodingInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                      const VkVideoEndCodingInfoKHR* from,
+                                      VkVideoEndCodingInfoKHR* to);
 
-void deepcopy_VkVideoCodingControlInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoCodingControlInfoKHR* from,
-    VkVideoCodingControlInfoKHR* to);
+void deepcopy_VkVideoCodingControlInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                          const VkVideoCodingControlInfoKHR* from,
+                                          VkVideoCodingControlInfoKHR* to);
 
 #endif
 #ifdef VK_KHR_video_decode_queue
-void deepcopy_VkVideoDecodeInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoDecodeInfoKHR* from,
-    VkVideoDecodeInfoKHR* to);
+void deepcopy_VkVideoDecodeInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                   const VkVideoDecodeInfoKHR* from, VkVideoDecodeInfoKHR* to);
 
 #endif
 #ifdef VK_KHR_dynamic_rendering
-void deepcopy_VkRenderingAttachmentInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkRenderingAttachmentInfoKHR* from,
-    VkRenderingAttachmentInfoKHR* to);
+void deepcopy_VkRenderingAttachmentInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                           const VkRenderingAttachmentInfoKHR* from,
+                                           VkRenderingAttachmentInfoKHR* to);
 
-void deepcopy_VkRenderingInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkRenderingInfoKHR* from,
-    VkRenderingInfoKHR* to);
+void deepcopy_VkRenderingInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                 const VkRenderingInfoKHR* from, VkRenderingInfoKHR* to);
 
-void deepcopy_VkPipelineRenderingCreateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineRenderingCreateInfoKHR* from,
-    VkPipelineRenderingCreateInfoKHR* to);
+void deepcopy_VkPipelineRenderingCreateInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                               const VkPipelineRenderingCreateInfoKHR* from,
+                                               VkPipelineRenderingCreateInfoKHR* to);
 
 void deepcopy_VkPhysicalDeviceDynamicRenderingFeaturesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceDynamicRenderingFeaturesKHR* from,
     VkPhysicalDeviceDynamicRenderingFeaturesKHR* to);
 
 void deepcopy_VkCommandBufferInheritanceRenderingInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkCommandBufferInheritanceRenderingInfoKHR* from,
     VkCommandBufferInheritanceRenderingInfoKHR* to);
 
 void deepcopy_VkRenderingFragmentShadingRateAttachmentInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkRenderingFragmentShadingRateAttachmentInfoKHR* from,
     VkRenderingFragmentShadingRateAttachmentInfoKHR* to);
 
 void deepcopy_VkRenderingFragmentDensityMapAttachmentInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkRenderingFragmentDensityMapAttachmentInfoEXT* from,
     VkRenderingFragmentDensityMapAttachmentInfoEXT* to);
 
-void deepcopy_VkAttachmentSampleCountInfoAMD(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAttachmentSampleCountInfoAMD* from,
-    VkAttachmentSampleCountInfoAMD* to);
+void deepcopy_VkAttachmentSampleCountInfoAMD(Allocator* alloc, VkStructureType rootType,
+                                             const VkAttachmentSampleCountInfoAMD* from,
+                                             VkAttachmentSampleCountInfoAMD* to);
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkAttachmentSampleCountInfoAMD, deepcopy_VkAttachmentSampleCountInfoNV)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkAttachmentSampleCountInfoAMD,
+                      deepcopy_VkAttachmentSampleCountInfoNV)
 
-void deepcopy_VkMultiviewPerViewAttributesInfoNVX(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMultiviewPerViewAttributesInfoNVX* from,
-    VkMultiviewPerViewAttributesInfoNVX* to);
+void deepcopy_VkMultiviewPerViewAttributesInfoNVX(Allocator* alloc, VkStructureType rootType,
+                                                  const VkMultiviewPerViewAttributesInfoNVX* from,
+                                                  VkMultiviewPerViewAttributesInfoNVX* to);
 
 #endif
 #ifdef VK_KHR_multiview
-DEFINE_ALIAS_FUNCTION(deepcopy_VkRenderPassMultiviewCreateInfo, deepcopy_VkRenderPassMultiviewCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkRenderPassMultiviewCreateInfo,
+                      deepcopy_VkRenderPassMultiviewCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceMultiviewFeatures, deepcopy_VkPhysicalDeviceMultiviewFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceMultiviewFeatures,
+                      deepcopy_VkPhysicalDeviceMultiviewFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceMultiviewProperties, deepcopy_VkPhysicalDeviceMultiviewPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceMultiviewProperties,
+                      deepcopy_VkPhysicalDeviceMultiviewPropertiesKHR)
 
 #endif
 #ifdef VK_KHR_get_physical_device_properties2
@@ -1755,31 +1164,39 @@
 
 DEFINE_ALIAS_FUNCTION(deepcopy_VkImageFormatProperties2, deepcopy_VkImageFormatProperties2KHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceImageFormatInfo2, deepcopy_VkPhysicalDeviceImageFormatInfo2KHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceImageFormatInfo2,
+                      deepcopy_VkPhysicalDeviceImageFormatInfo2KHR)
 
 DEFINE_ALIAS_FUNCTION(deepcopy_VkQueueFamilyProperties2, deepcopy_VkQueueFamilyProperties2KHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceMemoryProperties2, deepcopy_VkPhysicalDeviceMemoryProperties2KHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceMemoryProperties2,
+                      deepcopy_VkPhysicalDeviceMemoryProperties2KHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkSparseImageFormatProperties2, deepcopy_VkSparseImageFormatProperties2KHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkSparseImageFormatProperties2,
+                      deepcopy_VkSparseImageFormatProperties2KHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceSparseImageFormatInfo2, deepcopy_VkPhysicalDeviceSparseImageFormatInfo2KHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceSparseImageFormatInfo2,
+                      deepcopy_VkPhysicalDeviceSparseImageFormatInfo2KHR)
 
 #endif
 #ifdef VK_KHR_device_group
 DEFINE_ALIAS_FUNCTION(deepcopy_VkMemoryAllocateFlagsInfo, deepcopy_VkMemoryAllocateFlagsInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkDeviceGroupRenderPassBeginInfo, deepcopy_VkDeviceGroupRenderPassBeginInfoKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkDeviceGroupRenderPassBeginInfo,
+                      deepcopy_VkDeviceGroupRenderPassBeginInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkDeviceGroupCommandBufferBeginInfo, deepcopy_VkDeviceGroupCommandBufferBeginInfoKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkDeviceGroupCommandBufferBeginInfo,
+                      deepcopy_VkDeviceGroupCommandBufferBeginInfoKHR)
 
 DEFINE_ALIAS_FUNCTION(deepcopy_VkDeviceGroupSubmitInfo, deepcopy_VkDeviceGroupSubmitInfoKHR)
 
 DEFINE_ALIAS_FUNCTION(deepcopy_VkDeviceGroupBindSparseInfo, deepcopy_VkDeviceGroupBindSparseInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkBindBufferMemoryDeviceGroupInfo, deepcopy_VkBindBufferMemoryDeviceGroupInfoKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkBindBufferMemoryDeviceGroupInfo,
+                      deepcopy_VkBindBufferMemoryDeviceGroupInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkBindImageMemoryDeviceGroupInfo, deepcopy_VkBindImageMemoryDeviceGroupInfoKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkBindImageMemoryDeviceGroupInfo,
+                      deepcopy_VkBindImageMemoryDeviceGroupInfoKHR)
 
 #endif
 #ifdef VK_KHR_shader_draw_parameters
@@ -1787,91 +1204,84 @@
 #ifdef VK_KHR_maintenance1
 #endif
 #ifdef VK_KHR_device_group_creation
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceGroupProperties, deepcopy_VkPhysicalDeviceGroupPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceGroupProperties,
+                      deepcopy_VkPhysicalDeviceGroupPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkDeviceGroupDeviceCreateInfo, deepcopy_VkDeviceGroupDeviceCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkDeviceGroupDeviceCreateInfo,
+                      deepcopy_VkDeviceGroupDeviceCreateInfoKHR)
 
 #endif
 #ifdef VK_KHR_external_memory_capabilities
 DEFINE_ALIAS_FUNCTION(deepcopy_VkExternalMemoryProperties, deepcopy_VkExternalMemoryPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceExternalImageFormatInfo, deepcopy_VkPhysicalDeviceExternalImageFormatInfoKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceExternalImageFormatInfo,
+                      deepcopy_VkPhysicalDeviceExternalImageFormatInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkExternalImageFormatProperties, deepcopy_VkExternalImageFormatPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkExternalImageFormatProperties,
+                      deepcopy_VkExternalImageFormatPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceExternalBufferInfo, deepcopy_VkPhysicalDeviceExternalBufferInfoKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceExternalBufferInfo,
+                      deepcopy_VkPhysicalDeviceExternalBufferInfoKHR)
 
 DEFINE_ALIAS_FUNCTION(deepcopy_VkExternalBufferProperties, deepcopy_VkExternalBufferPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceIDProperties, deepcopy_VkPhysicalDeviceIDPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceIDProperties,
+                      deepcopy_VkPhysicalDeviceIDPropertiesKHR)
 
 #endif
 #ifdef VK_KHR_external_memory
-DEFINE_ALIAS_FUNCTION(deepcopy_VkExternalMemoryImageCreateInfo, deepcopy_VkExternalMemoryImageCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkExternalMemoryImageCreateInfo,
+                      deepcopy_VkExternalMemoryImageCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkExternalMemoryBufferCreateInfo, deepcopy_VkExternalMemoryBufferCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkExternalMemoryBufferCreateInfo,
+                      deepcopy_VkExternalMemoryBufferCreateInfoKHR)
 
 DEFINE_ALIAS_FUNCTION(deepcopy_VkExportMemoryAllocateInfo, deepcopy_VkExportMemoryAllocateInfoKHR)
 
 #endif
 #ifdef VK_KHR_external_memory_win32
-void deepcopy_VkImportMemoryWin32HandleInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImportMemoryWin32HandleInfoKHR* from,
-    VkImportMemoryWin32HandleInfoKHR* to);
+void deepcopy_VkImportMemoryWin32HandleInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                               const VkImportMemoryWin32HandleInfoKHR* from,
+                                               VkImportMemoryWin32HandleInfoKHR* to);
 
-void deepcopy_VkExportMemoryWin32HandleInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExportMemoryWin32HandleInfoKHR* from,
-    VkExportMemoryWin32HandleInfoKHR* to);
+void deepcopy_VkExportMemoryWin32HandleInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                               const VkExportMemoryWin32HandleInfoKHR* from,
+                                               VkExportMemoryWin32HandleInfoKHR* to);
 
-void deepcopy_VkMemoryWin32HandlePropertiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryWin32HandlePropertiesKHR* from,
-    VkMemoryWin32HandlePropertiesKHR* to);
+void deepcopy_VkMemoryWin32HandlePropertiesKHR(Allocator* alloc, VkStructureType rootType,
+                                               const VkMemoryWin32HandlePropertiesKHR* from,
+                                               VkMemoryWin32HandlePropertiesKHR* to);
 
-void deepcopy_VkMemoryGetWin32HandleInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryGetWin32HandleInfoKHR* from,
-    VkMemoryGetWin32HandleInfoKHR* to);
+void deepcopy_VkMemoryGetWin32HandleInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                            const VkMemoryGetWin32HandleInfoKHR* from,
+                                            VkMemoryGetWin32HandleInfoKHR* to);
 
 #endif
 #ifdef VK_KHR_external_memory_fd
-void deepcopy_VkImportMemoryFdInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImportMemoryFdInfoKHR* from,
-    VkImportMemoryFdInfoKHR* to);
+void deepcopy_VkImportMemoryFdInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                      const VkImportMemoryFdInfoKHR* from,
+                                      VkImportMemoryFdInfoKHR* to);
 
-void deepcopy_VkMemoryFdPropertiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryFdPropertiesKHR* from,
-    VkMemoryFdPropertiesKHR* to);
+void deepcopy_VkMemoryFdPropertiesKHR(Allocator* alloc, VkStructureType rootType,
+                                      const VkMemoryFdPropertiesKHR* from,
+                                      VkMemoryFdPropertiesKHR* to);
 
-void deepcopy_VkMemoryGetFdInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryGetFdInfoKHR* from,
-    VkMemoryGetFdInfoKHR* to);
+void deepcopy_VkMemoryGetFdInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                   const VkMemoryGetFdInfoKHR* from, VkMemoryGetFdInfoKHR* to);
 
 #endif
 #ifdef VK_KHR_win32_keyed_mutex
 void deepcopy_VkWin32KeyedMutexAcquireReleaseInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkWin32KeyedMutexAcquireReleaseInfoKHR* from,
+    Allocator* alloc, VkStructureType rootType, const VkWin32KeyedMutexAcquireReleaseInfoKHR* from,
     VkWin32KeyedMutexAcquireReleaseInfoKHR* to);
 
 #endif
 #ifdef VK_KHR_external_semaphore_capabilities
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceExternalSemaphoreInfo, deepcopy_VkPhysicalDeviceExternalSemaphoreInfoKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceExternalSemaphoreInfo,
+                      deepcopy_VkPhysicalDeviceExternalSemaphoreInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkExternalSemaphoreProperties, deepcopy_VkExternalSemaphorePropertiesKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkExternalSemaphoreProperties,
+                      deepcopy_VkExternalSemaphorePropertiesKHR)
 
 #endif
 #ifdef VK_KHR_external_semaphore
@@ -1879,97 +1289,84 @@
 
 #endif
 #ifdef VK_KHR_external_semaphore_win32
-void deepcopy_VkImportSemaphoreWin32HandleInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImportSemaphoreWin32HandleInfoKHR* from,
-    VkImportSemaphoreWin32HandleInfoKHR* to);
+void deepcopy_VkImportSemaphoreWin32HandleInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                                  const VkImportSemaphoreWin32HandleInfoKHR* from,
+                                                  VkImportSemaphoreWin32HandleInfoKHR* to);
 
-void deepcopy_VkExportSemaphoreWin32HandleInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExportSemaphoreWin32HandleInfoKHR* from,
-    VkExportSemaphoreWin32HandleInfoKHR* to);
+void deepcopy_VkExportSemaphoreWin32HandleInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                                  const VkExportSemaphoreWin32HandleInfoKHR* from,
+                                                  VkExportSemaphoreWin32HandleInfoKHR* to);
 
-void deepcopy_VkD3D12FenceSubmitInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkD3D12FenceSubmitInfoKHR* from,
-    VkD3D12FenceSubmitInfoKHR* to);
+void deepcopy_VkD3D12FenceSubmitInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                        const VkD3D12FenceSubmitInfoKHR* from,
+                                        VkD3D12FenceSubmitInfoKHR* to);
 
-void deepcopy_VkSemaphoreGetWin32HandleInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSemaphoreGetWin32HandleInfoKHR* from,
-    VkSemaphoreGetWin32HandleInfoKHR* to);
+void deepcopy_VkSemaphoreGetWin32HandleInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                               const VkSemaphoreGetWin32HandleInfoKHR* from,
+                                               VkSemaphoreGetWin32HandleInfoKHR* to);
 
 #endif
 #ifdef VK_KHR_external_semaphore_fd
-void deepcopy_VkImportSemaphoreFdInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImportSemaphoreFdInfoKHR* from,
-    VkImportSemaphoreFdInfoKHR* to);
+void deepcopy_VkImportSemaphoreFdInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                         const VkImportSemaphoreFdInfoKHR* from,
+                                         VkImportSemaphoreFdInfoKHR* to);
 
-void deepcopy_VkSemaphoreGetFdInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSemaphoreGetFdInfoKHR* from,
-    VkSemaphoreGetFdInfoKHR* to);
+void deepcopy_VkSemaphoreGetFdInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                      const VkSemaphoreGetFdInfoKHR* from,
+                                      VkSemaphoreGetFdInfoKHR* to);
 
 #endif
 #ifdef VK_KHR_push_descriptor
 void deepcopy_VkPhysicalDevicePushDescriptorPropertiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDevicePushDescriptorPropertiesKHR* from,
     VkPhysicalDevicePushDescriptorPropertiesKHR* to);
 
 #endif
 #ifdef VK_KHR_shader_float16_int8
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceShaderFloat16Int8Features, deepcopy_VkPhysicalDeviceShaderFloat16Int8FeaturesKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceShaderFloat16Int8Features,
+                      deepcopy_VkPhysicalDeviceShaderFloat16Int8FeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceShaderFloat16Int8Features, deepcopy_VkPhysicalDeviceFloat16Int8FeaturesKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceShaderFloat16Int8Features,
+                      deepcopy_VkPhysicalDeviceFloat16Int8FeaturesKHR)
 
 #endif
 #ifdef VK_KHR_16bit_storage
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDevice16BitStorageFeatures, deepcopy_VkPhysicalDevice16BitStorageFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDevice16BitStorageFeatures,
+                      deepcopy_VkPhysicalDevice16BitStorageFeaturesKHR)
 
 #endif
 #ifdef VK_KHR_incremental_present
-void deepcopy_VkRectLayerKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkRectLayerKHR* from,
-    VkRectLayerKHR* to);
+void deepcopy_VkRectLayerKHR(Allocator* alloc, VkStructureType rootType, const VkRectLayerKHR* from,
+                             VkRectLayerKHR* to);
 
-void deepcopy_VkPresentRegionKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPresentRegionKHR* from,
-    VkPresentRegionKHR* to);
+void deepcopy_VkPresentRegionKHR(Allocator* alloc, VkStructureType rootType,
+                                 const VkPresentRegionKHR* from, VkPresentRegionKHR* to);
 
-void deepcopy_VkPresentRegionsKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPresentRegionsKHR* from,
-    VkPresentRegionsKHR* to);
+void deepcopy_VkPresentRegionsKHR(Allocator* alloc, VkStructureType rootType,
+                                  const VkPresentRegionsKHR* from, VkPresentRegionsKHR* to);
 
 #endif
 #ifdef VK_KHR_descriptor_update_template
-DEFINE_ALIAS_FUNCTION(deepcopy_VkDescriptorUpdateTemplateEntry, deepcopy_VkDescriptorUpdateTemplateEntryKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkDescriptorUpdateTemplateEntry,
+                      deepcopy_VkDescriptorUpdateTemplateEntryKHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkDescriptorUpdateTemplateCreateInfo, deepcopy_VkDescriptorUpdateTemplateCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkDescriptorUpdateTemplateCreateInfo,
+                      deepcopy_VkDescriptorUpdateTemplateCreateInfoKHR)
 
 #endif
 #ifdef VK_KHR_imageless_framebuffer
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceImagelessFramebufferFeatures, deepcopy_VkPhysicalDeviceImagelessFramebufferFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceImagelessFramebufferFeatures,
+                      deepcopy_VkPhysicalDeviceImagelessFramebufferFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkFramebufferAttachmentsCreateInfo, deepcopy_VkFramebufferAttachmentsCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkFramebufferAttachmentsCreateInfo,
+                      deepcopy_VkFramebufferAttachmentsCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkFramebufferAttachmentImageInfo, deepcopy_VkFramebufferAttachmentImageInfoKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkFramebufferAttachmentImageInfo,
+                      deepcopy_VkFramebufferAttachmentImageInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkRenderPassAttachmentBeginInfo, deepcopy_VkRenderPassAttachmentBeginInfoKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkRenderPassAttachmentBeginInfo,
+                      deepcopy_VkRenderPassAttachmentBeginInfoKHR)
 
 #endif
 #ifdef VK_KHR_create_renderpass2
@@ -1990,14 +1387,13 @@
 #endif
 #ifdef VK_KHR_shared_presentable_image
 void deepcopy_VkSharedPresentSurfaceCapabilitiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSharedPresentSurfaceCapabilitiesKHR* from,
+    Allocator* alloc, VkStructureType rootType, const VkSharedPresentSurfaceCapabilitiesKHR* from,
     VkSharedPresentSurfaceCapabilitiesKHR* to);
 
 #endif
 #ifdef VK_KHR_external_fence_capabilities
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceExternalFenceInfo, deepcopy_VkPhysicalDeviceExternalFenceInfoKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceExternalFenceInfo,
+                      deepcopy_VkPhysicalDeviceExternalFenceInfoKHR)
 
 DEFINE_ALIAS_FUNCTION(deepcopy_VkExternalFenceProperties, deepcopy_VkExternalFencePropertiesKHR)
 
@@ -2007,163 +1403,129 @@
 
 #endif
 #ifdef VK_KHR_external_fence_win32
-void deepcopy_VkImportFenceWin32HandleInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImportFenceWin32HandleInfoKHR* from,
-    VkImportFenceWin32HandleInfoKHR* to);
+void deepcopy_VkImportFenceWin32HandleInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                              const VkImportFenceWin32HandleInfoKHR* from,
+                                              VkImportFenceWin32HandleInfoKHR* to);
 
-void deepcopy_VkExportFenceWin32HandleInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExportFenceWin32HandleInfoKHR* from,
-    VkExportFenceWin32HandleInfoKHR* to);
+void deepcopy_VkExportFenceWin32HandleInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                              const VkExportFenceWin32HandleInfoKHR* from,
+                                              VkExportFenceWin32HandleInfoKHR* to);
 
-void deepcopy_VkFenceGetWin32HandleInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkFenceGetWin32HandleInfoKHR* from,
-    VkFenceGetWin32HandleInfoKHR* to);
+void deepcopy_VkFenceGetWin32HandleInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                           const VkFenceGetWin32HandleInfoKHR* from,
+                                           VkFenceGetWin32HandleInfoKHR* to);
 
 #endif
 #ifdef VK_KHR_external_fence_fd
-void deepcopy_VkImportFenceFdInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImportFenceFdInfoKHR* from,
-    VkImportFenceFdInfoKHR* to);
+void deepcopy_VkImportFenceFdInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                     const VkImportFenceFdInfoKHR* from,
+                                     VkImportFenceFdInfoKHR* to);
 
-void deepcopy_VkFenceGetFdInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkFenceGetFdInfoKHR* from,
-    VkFenceGetFdInfoKHR* to);
+void deepcopy_VkFenceGetFdInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                  const VkFenceGetFdInfoKHR* from, VkFenceGetFdInfoKHR* to);
 
 #endif
 #ifdef VK_KHR_performance_query
 void deepcopy_VkPhysicalDevicePerformanceQueryFeaturesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDevicePerformanceQueryFeaturesKHR* from,
     VkPhysicalDevicePerformanceQueryFeaturesKHR* to);
 
 void deepcopy_VkPhysicalDevicePerformanceQueryPropertiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDevicePerformanceQueryPropertiesKHR* from,
     VkPhysicalDevicePerformanceQueryPropertiesKHR* to);
 
-void deepcopy_VkPerformanceCounterKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPerformanceCounterKHR* from,
-    VkPerformanceCounterKHR* to);
+void deepcopy_VkPerformanceCounterKHR(Allocator* alloc, VkStructureType rootType,
+                                      const VkPerformanceCounterKHR* from,
+                                      VkPerformanceCounterKHR* to);
 
-void deepcopy_VkPerformanceCounterDescriptionKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPerformanceCounterDescriptionKHR* from,
-    VkPerformanceCounterDescriptionKHR* to);
+void deepcopy_VkPerformanceCounterDescriptionKHR(Allocator* alloc, VkStructureType rootType,
+                                                 const VkPerformanceCounterDescriptionKHR* from,
+                                                 VkPerformanceCounterDescriptionKHR* to);
 
-void deepcopy_VkQueryPoolPerformanceCreateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkQueryPoolPerformanceCreateInfoKHR* from,
-    VkQueryPoolPerformanceCreateInfoKHR* to);
+void deepcopy_VkQueryPoolPerformanceCreateInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                                  const VkQueryPoolPerformanceCreateInfoKHR* from,
+                                                  VkQueryPoolPerformanceCreateInfoKHR* to);
 
-void deepcopy_VkPerformanceCounterResultKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPerformanceCounterResultKHR* from,
-    VkPerformanceCounterResultKHR* to);
+void deepcopy_VkPerformanceCounterResultKHR(Allocator* alloc, VkStructureType rootType,
+                                            const VkPerformanceCounterResultKHR* from,
+                                            VkPerformanceCounterResultKHR* to);
 
-void deepcopy_VkAcquireProfilingLockInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAcquireProfilingLockInfoKHR* from,
-    VkAcquireProfilingLockInfoKHR* to);
+void deepcopy_VkAcquireProfilingLockInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                            const VkAcquireProfilingLockInfoKHR* from,
+                                            VkAcquireProfilingLockInfoKHR* to);
 
-void deepcopy_VkPerformanceQuerySubmitInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPerformanceQuerySubmitInfoKHR* from,
-    VkPerformanceQuerySubmitInfoKHR* to);
+void deepcopy_VkPerformanceQuerySubmitInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                              const VkPerformanceQuerySubmitInfoKHR* from,
+                                              VkPerformanceQuerySubmitInfoKHR* to);
 
 #endif
 #ifdef VK_KHR_maintenance2
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDevicePointClippingProperties, deepcopy_VkPhysicalDevicePointClippingPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDevicePointClippingProperties,
+                      deepcopy_VkPhysicalDevicePointClippingPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkRenderPassInputAttachmentAspectCreateInfo, deepcopy_VkRenderPassInputAttachmentAspectCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkRenderPassInputAttachmentAspectCreateInfo,
+                      deepcopy_VkRenderPassInputAttachmentAspectCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkInputAttachmentAspectReference, deepcopy_VkInputAttachmentAspectReferenceKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkInputAttachmentAspectReference,
+                      deepcopy_VkInputAttachmentAspectReferenceKHR)
 
 DEFINE_ALIAS_FUNCTION(deepcopy_VkImageViewUsageCreateInfo, deepcopy_VkImageViewUsageCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPipelineTessellationDomainOriginStateCreateInfo, deepcopy_VkPipelineTessellationDomainOriginStateCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPipelineTessellationDomainOriginStateCreateInfo,
+                      deepcopy_VkPipelineTessellationDomainOriginStateCreateInfoKHR)
 
 #endif
 #ifdef VK_KHR_get_surface_capabilities2
-void deepcopy_VkPhysicalDeviceSurfaceInfo2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceSurfaceInfo2KHR* from,
-    VkPhysicalDeviceSurfaceInfo2KHR* to);
+void deepcopy_VkPhysicalDeviceSurfaceInfo2KHR(Allocator* alloc, VkStructureType rootType,
+                                              const VkPhysicalDeviceSurfaceInfo2KHR* from,
+                                              VkPhysicalDeviceSurfaceInfo2KHR* to);
 
-void deepcopy_VkSurfaceCapabilities2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSurfaceCapabilities2KHR* from,
-    VkSurfaceCapabilities2KHR* to);
+void deepcopy_VkSurfaceCapabilities2KHR(Allocator* alloc, VkStructureType rootType,
+                                        const VkSurfaceCapabilities2KHR* from,
+                                        VkSurfaceCapabilities2KHR* to);
 
-void deepcopy_VkSurfaceFormat2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSurfaceFormat2KHR* from,
-    VkSurfaceFormat2KHR* to);
+void deepcopy_VkSurfaceFormat2KHR(Allocator* alloc, VkStructureType rootType,
+                                  const VkSurfaceFormat2KHR* from, VkSurfaceFormat2KHR* to);
 
 #endif
 #ifdef VK_KHR_variable_pointers
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceVariablePointersFeatures, deepcopy_VkPhysicalDeviceVariablePointerFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceVariablePointersFeatures,
+                      deepcopy_VkPhysicalDeviceVariablePointerFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceVariablePointersFeatures, deepcopy_VkPhysicalDeviceVariablePointersFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceVariablePointersFeatures,
+                      deepcopy_VkPhysicalDeviceVariablePointersFeaturesKHR)
 
 #endif
 #ifdef VK_KHR_get_display_properties2
-void deepcopy_VkDisplayProperties2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDisplayProperties2KHR* from,
-    VkDisplayProperties2KHR* to);
+void deepcopy_VkDisplayProperties2KHR(Allocator* alloc, VkStructureType rootType,
+                                      const VkDisplayProperties2KHR* from,
+                                      VkDisplayProperties2KHR* to);
 
-void deepcopy_VkDisplayPlaneProperties2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDisplayPlaneProperties2KHR* from,
-    VkDisplayPlaneProperties2KHR* to);
+void deepcopy_VkDisplayPlaneProperties2KHR(Allocator* alloc, VkStructureType rootType,
+                                           const VkDisplayPlaneProperties2KHR* from,
+                                           VkDisplayPlaneProperties2KHR* to);
 
-void deepcopy_VkDisplayModeProperties2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDisplayModeProperties2KHR* from,
-    VkDisplayModeProperties2KHR* to);
+void deepcopy_VkDisplayModeProperties2KHR(Allocator* alloc, VkStructureType rootType,
+                                          const VkDisplayModeProperties2KHR* from,
+                                          VkDisplayModeProperties2KHR* to);
 
-void deepcopy_VkDisplayPlaneInfo2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDisplayPlaneInfo2KHR* from,
-    VkDisplayPlaneInfo2KHR* to);
+void deepcopy_VkDisplayPlaneInfo2KHR(Allocator* alloc, VkStructureType rootType,
+                                     const VkDisplayPlaneInfo2KHR* from,
+                                     VkDisplayPlaneInfo2KHR* to);
 
-void deepcopy_VkDisplayPlaneCapabilities2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDisplayPlaneCapabilities2KHR* from,
-    VkDisplayPlaneCapabilities2KHR* to);
+void deepcopy_VkDisplayPlaneCapabilities2KHR(Allocator* alloc, VkStructureType rootType,
+                                             const VkDisplayPlaneCapabilities2KHR* from,
+                                             VkDisplayPlaneCapabilities2KHR* to);
 
 #endif
 #ifdef VK_KHR_dedicated_allocation
-DEFINE_ALIAS_FUNCTION(deepcopy_VkMemoryDedicatedRequirements, deepcopy_VkMemoryDedicatedRequirementsKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkMemoryDedicatedRequirements,
+                      deepcopy_VkMemoryDedicatedRequirementsKHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkMemoryDedicatedAllocateInfo, deepcopy_VkMemoryDedicatedAllocateInfoKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkMemoryDedicatedAllocateInfo,
+                      deepcopy_VkMemoryDedicatedAllocateInfoKHR)
 
 #endif
 #ifdef VK_KHR_storage_buffer_storage_class
@@ -2171,15 +1533,19 @@
 #ifdef VK_KHR_relaxed_block_layout
 #endif
 #ifdef VK_KHR_get_memory_requirements2
-DEFINE_ALIAS_FUNCTION(deepcopy_VkBufferMemoryRequirementsInfo2, deepcopy_VkBufferMemoryRequirementsInfo2KHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkBufferMemoryRequirementsInfo2,
+                      deepcopy_VkBufferMemoryRequirementsInfo2KHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkImageMemoryRequirementsInfo2, deepcopy_VkImageMemoryRequirementsInfo2KHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkImageMemoryRequirementsInfo2,
+                      deepcopy_VkImageMemoryRequirementsInfo2KHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkImageSparseMemoryRequirementsInfo2, deepcopy_VkImageSparseMemoryRequirementsInfo2KHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkImageSparseMemoryRequirementsInfo2,
+                      deepcopy_VkImageSparseMemoryRequirementsInfo2KHR)
 
 DEFINE_ALIAS_FUNCTION(deepcopy_VkMemoryRequirements2, deepcopy_VkMemoryRequirements2KHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkSparseImageMemoryRequirements2, deepcopy_VkSparseImageMemoryRequirements2KHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkSparseImageMemoryRequirements2,
+                      deepcopy_VkSparseImageMemoryRequirements2KHR)
 
 #endif
 #ifdef VK_KHR_image_format_list
@@ -2187,17 +1553,22 @@
 
 #endif
 #ifdef VK_KHR_sampler_ycbcr_conversion
-DEFINE_ALIAS_FUNCTION(deepcopy_VkSamplerYcbcrConversionCreateInfo, deepcopy_VkSamplerYcbcrConversionCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkSamplerYcbcrConversionCreateInfo,
+                      deepcopy_VkSamplerYcbcrConversionCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkSamplerYcbcrConversionInfo, deepcopy_VkSamplerYcbcrConversionInfoKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkSamplerYcbcrConversionInfo,
+                      deepcopy_VkSamplerYcbcrConversionInfoKHR)
 
 DEFINE_ALIAS_FUNCTION(deepcopy_VkBindImagePlaneMemoryInfo, deepcopy_VkBindImagePlaneMemoryInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkImagePlaneMemoryRequirementsInfo, deepcopy_VkImagePlaneMemoryRequirementsInfoKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkImagePlaneMemoryRequirementsInfo,
+                      deepcopy_VkImagePlaneMemoryRequirementsInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceSamplerYcbcrConversionFeatures, deepcopy_VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceSamplerYcbcrConversionFeatures,
+                      deepcopy_VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkSamplerYcbcrConversionImageFormatProperties, deepcopy_VkSamplerYcbcrConversionImageFormatPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkSamplerYcbcrConversionImageFormatProperties,
+                      deepcopy_VkSamplerYcbcrConversionImageFormatPropertiesKHR)
 
 #endif
 #ifdef VK_KHR_bind_memory2
@@ -2208,72 +1579,80 @@
 #endif
 #ifdef VK_KHR_portability_subset
 void deepcopy_VkPhysicalDevicePortabilitySubsetFeaturesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDevicePortabilitySubsetFeaturesKHR* from,
     VkPhysicalDevicePortabilitySubsetFeaturesKHR* to);
 
 void deepcopy_VkPhysicalDevicePortabilitySubsetPropertiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDevicePortabilitySubsetPropertiesKHR* from,
     VkPhysicalDevicePortabilitySubsetPropertiesKHR* to);
 
 #endif
 #ifdef VK_KHR_maintenance3
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceMaintenance3Properties, deepcopy_VkPhysicalDeviceMaintenance3PropertiesKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceMaintenance3Properties,
+                      deepcopy_VkPhysicalDeviceMaintenance3PropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkDescriptorSetLayoutSupport, deepcopy_VkDescriptorSetLayoutSupportKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkDescriptorSetLayoutSupport,
+                      deepcopy_VkDescriptorSetLayoutSupportKHR)
 
 #endif
 #ifdef VK_KHR_draw_indirect_count
 #endif
 #ifdef VK_KHR_shader_subgroup_extended_types
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures, deepcopy_VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures,
+                      deepcopy_VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR)
 
 #endif
 #ifdef VK_KHR_8bit_storage
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDevice8BitStorageFeatures, deepcopy_VkPhysicalDevice8BitStorageFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDevice8BitStorageFeatures,
+                      deepcopy_VkPhysicalDevice8BitStorageFeaturesKHR)
 
 #endif
 #ifdef VK_KHR_shader_atomic_int64
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceShaderAtomicInt64Features, deepcopy_VkPhysicalDeviceShaderAtomicInt64FeaturesKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceShaderAtomicInt64Features,
+                      deepcopy_VkPhysicalDeviceShaderAtomicInt64FeaturesKHR)
 
 #endif
 #ifdef VK_KHR_shader_clock
 void deepcopy_VkPhysicalDeviceShaderClockFeaturesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceShaderClockFeaturesKHR* from,
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDeviceShaderClockFeaturesKHR* from,
     VkPhysicalDeviceShaderClockFeaturesKHR* to);
 
 #endif
 #ifdef VK_KHR_driver_properties
 DEFINE_ALIAS_FUNCTION(deepcopy_VkConformanceVersion, deepcopy_VkConformanceVersionKHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceDriverProperties, deepcopy_VkPhysicalDeviceDriverPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceDriverProperties,
+                      deepcopy_VkPhysicalDeviceDriverPropertiesKHR)
 
 #endif
 #ifdef VK_KHR_shader_float_controls
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceFloatControlsProperties, deepcopy_VkPhysicalDeviceFloatControlsPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceFloatControlsProperties,
+                      deepcopy_VkPhysicalDeviceFloatControlsPropertiesKHR)
 
 #endif
 #ifdef VK_KHR_depth_stencil_resolve
-DEFINE_ALIAS_FUNCTION(deepcopy_VkSubpassDescriptionDepthStencilResolve, deepcopy_VkSubpassDescriptionDepthStencilResolveKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkSubpassDescriptionDepthStencilResolve,
+                      deepcopy_VkSubpassDescriptionDepthStencilResolveKHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceDepthStencilResolveProperties, deepcopy_VkPhysicalDeviceDepthStencilResolvePropertiesKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceDepthStencilResolveProperties,
+                      deepcopy_VkPhysicalDeviceDepthStencilResolvePropertiesKHR)
 
 #endif
 #ifdef VK_KHR_swapchain_mutable_format
 #endif
 #ifdef VK_KHR_timeline_semaphore
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceTimelineSemaphoreFeatures, deepcopy_VkPhysicalDeviceTimelineSemaphoreFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceTimelineSemaphoreFeatures,
+                      deepcopy_VkPhysicalDeviceTimelineSemaphoreFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceTimelineSemaphoreProperties, deepcopy_VkPhysicalDeviceTimelineSemaphorePropertiesKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceTimelineSemaphoreProperties,
+                      deepcopy_VkPhysicalDeviceTimelineSemaphorePropertiesKHR)
 
 DEFINE_ALIAS_FUNCTION(deepcopy_VkSemaphoreTypeCreateInfo, deepcopy_VkSemaphoreTypeCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkTimelineSemaphoreSubmitInfo, deepcopy_VkTimelineSemaphoreSubmitInfoKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkTimelineSemaphoreSubmitInfo,
+                      deepcopy_VkTimelineSemaphoreSubmitInfoKHR)
 
 DEFINE_ALIAS_FUNCTION(deepcopy_VkSemaphoreWaitInfo, deepcopy_VkSemaphoreWaitInfoKHR)
 
@@ -2281,391 +1660,291 @@
 
 #endif
 #ifdef VK_KHR_vulkan_memory_model
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceVulkanMemoryModelFeatures, deepcopy_VkPhysicalDeviceVulkanMemoryModelFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceVulkanMemoryModelFeatures,
+                      deepcopy_VkPhysicalDeviceVulkanMemoryModelFeaturesKHR)
 
 #endif
 #ifdef VK_KHR_shader_terminate_invocation
 void deepcopy_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* from,
     VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* to);
 
 #endif
 #ifdef VK_KHR_fragment_shading_rate
 void deepcopy_VkFragmentShadingRateAttachmentInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkFragmentShadingRateAttachmentInfoKHR* from,
+    Allocator* alloc, VkStructureType rootType, const VkFragmentShadingRateAttachmentInfoKHR* from,
     VkFragmentShadingRateAttachmentInfoKHR* to);
 
 void deepcopy_VkPipelineFragmentShadingRateStateCreateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineFragmentShadingRateStateCreateInfoKHR* from,
     VkPipelineFragmentShadingRateStateCreateInfoKHR* to);
 
 void deepcopy_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateFeaturesKHR* from,
     VkPhysicalDeviceFragmentShadingRateFeaturesKHR* to);
 
 void deepcopy_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRatePropertiesKHR* from,
     VkPhysicalDeviceFragmentShadingRatePropertiesKHR* to);
 
 void deepcopy_VkPhysicalDeviceFragmentShadingRateKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceFragmentShadingRateKHR* from,
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDeviceFragmentShadingRateKHR* from,
     VkPhysicalDeviceFragmentShadingRateKHR* to);
 
 #endif
 #ifdef VK_KHR_spirv_1_4
 #endif
 #ifdef VK_KHR_surface_protected_capabilities
-void deepcopy_VkSurfaceProtectedCapabilitiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSurfaceProtectedCapabilitiesKHR* from,
-    VkSurfaceProtectedCapabilitiesKHR* to);
+void deepcopy_VkSurfaceProtectedCapabilitiesKHR(Allocator* alloc, VkStructureType rootType,
+                                                const VkSurfaceProtectedCapabilitiesKHR* from,
+                                                VkSurfaceProtectedCapabilitiesKHR* to);
 
 #endif
 #ifdef VK_KHR_separate_depth_stencil_layouts
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures, deepcopy_VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures,
+                      deepcopy_VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkAttachmentReferenceStencilLayout, deepcopy_VkAttachmentReferenceStencilLayoutKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkAttachmentReferenceStencilLayout,
+                      deepcopy_VkAttachmentReferenceStencilLayoutKHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkAttachmentDescriptionStencilLayout, deepcopy_VkAttachmentDescriptionStencilLayoutKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkAttachmentDescriptionStencilLayout,
+                      deepcopy_VkAttachmentDescriptionStencilLayoutKHR)
 
 #endif
 #ifdef VK_KHR_present_wait
 void deepcopy_VkPhysicalDevicePresentWaitFeaturesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDevicePresentWaitFeaturesKHR* from,
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDevicePresentWaitFeaturesKHR* from,
     VkPhysicalDevicePresentWaitFeaturesKHR* to);
 
 #endif
 #ifdef VK_KHR_uniform_buffer_standard_layout
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceUniformBufferStandardLayoutFeatures, deepcopy_VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceUniformBufferStandardLayoutFeatures,
+                      deepcopy_VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR)
 
 #endif
 #ifdef VK_KHR_buffer_device_address
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceBufferDeviceAddressFeatures, deepcopy_VkPhysicalDeviceBufferDeviceAddressFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceBufferDeviceAddressFeatures,
+                      deepcopy_VkPhysicalDeviceBufferDeviceAddressFeaturesKHR)
 
 DEFINE_ALIAS_FUNCTION(deepcopy_VkBufferDeviceAddressInfo, deepcopy_VkBufferDeviceAddressInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkBufferOpaqueCaptureAddressCreateInfo, deepcopy_VkBufferOpaqueCaptureAddressCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkBufferOpaqueCaptureAddressCreateInfo,
+                      deepcopy_VkBufferOpaqueCaptureAddressCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkMemoryOpaqueCaptureAddressAllocateInfo, deepcopy_VkMemoryOpaqueCaptureAddressAllocateInfoKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkMemoryOpaqueCaptureAddressAllocateInfo,
+                      deepcopy_VkMemoryOpaqueCaptureAddressAllocateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkDeviceMemoryOpaqueCaptureAddressInfo, deepcopy_VkDeviceMemoryOpaqueCaptureAddressInfoKHR)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkDeviceMemoryOpaqueCaptureAddressInfo,
+                      deepcopy_VkDeviceMemoryOpaqueCaptureAddressInfoKHR)
 
 #endif
 #ifdef VK_KHR_deferred_host_operations
 #endif
 #ifdef VK_KHR_pipeline_executable_properties
 void deepcopy_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* from,
     VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* to);
 
-void deepcopy_VkPipelineInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineInfoKHR* from,
-    VkPipelineInfoKHR* to);
+void deepcopy_VkPipelineInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                const VkPipelineInfoKHR* from, VkPipelineInfoKHR* to);
 
-void deepcopy_VkPipelineExecutablePropertiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineExecutablePropertiesKHR* from,
-    VkPipelineExecutablePropertiesKHR* to);
+void deepcopy_VkPipelineExecutablePropertiesKHR(Allocator* alloc, VkStructureType rootType,
+                                                const VkPipelineExecutablePropertiesKHR* from,
+                                                VkPipelineExecutablePropertiesKHR* to);
 
-void deepcopy_VkPipelineExecutableInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineExecutableInfoKHR* from,
-    VkPipelineExecutableInfoKHR* to);
+void deepcopy_VkPipelineExecutableInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                          const VkPipelineExecutableInfoKHR* from,
+                                          VkPipelineExecutableInfoKHR* to);
 
 void deepcopy_VkPipelineExecutableStatisticValueKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineExecutableStatisticValueKHR* from,
+    Allocator* alloc, VkStructureType rootType, const VkPipelineExecutableStatisticValueKHR* from,
     VkPipelineExecutableStatisticValueKHR* to);
 
-void deepcopy_VkPipelineExecutableStatisticKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineExecutableStatisticKHR* from,
-    VkPipelineExecutableStatisticKHR* to);
+void deepcopy_VkPipelineExecutableStatisticKHR(Allocator* alloc, VkStructureType rootType,
+                                               const VkPipelineExecutableStatisticKHR* from,
+                                               VkPipelineExecutableStatisticKHR* to);
 
 void deepcopy_VkPipelineExecutableInternalRepresentationKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineExecutableInternalRepresentationKHR* from,
     VkPipelineExecutableInternalRepresentationKHR* to);
 
 #endif
 #ifdef VK_KHR_shader_integer_dot_product
 void deepcopy_VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR* from,
     VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR* to);
 
 void deepcopy_VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR* from,
     VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR* to);
 
 #endif
 #ifdef VK_KHR_pipeline_library
-void deepcopy_VkPipelineLibraryCreateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineLibraryCreateInfoKHR* from,
-    VkPipelineLibraryCreateInfoKHR* to);
+void deepcopy_VkPipelineLibraryCreateInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                             const VkPipelineLibraryCreateInfoKHR* from,
+                                             VkPipelineLibraryCreateInfoKHR* to);
 
 #endif
 #ifdef VK_KHR_shader_non_semantic_info
 #endif
 #ifdef VK_KHR_present_id
-void deepcopy_VkPresentIdKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPresentIdKHR* from,
-    VkPresentIdKHR* to);
+void deepcopy_VkPresentIdKHR(Allocator* alloc, VkStructureType rootType, const VkPresentIdKHR* from,
+                             VkPresentIdKHR* to);
 
-void deepcopy_VkPhysicalDevicePresentIdFeaturesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDevicePresentIdFeaturesKHR* from,
-    VkPhysicalDevicePresentIdFeaturesKHR* to);
+void deepcopy_VkPhysicalDevicePresentIdFeaturesKHR(Allocator* alloc, VkStructureType rootType,
+                                                   const VkPhysicalDevicePresentIdFeaturesKHR* from,
+                                                   VkPhysicalDevicePresentIdFeaturesKHR* to);
 
 #endif
 #ifdef VK_KHR_video_encode_queue
-void deepcopy_VkVideoEncodeInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoEncodeInfoKHR* from,
-    VkVideoEncodeInfoKHR* to);
+void deepcopy_VkVideoEncodeInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                   const VkVideoEncodeInfoKHR* from, VkVideoEncodeInfoKHR* to);
 
-void deepcopy_VkVideoEncodeRateControlInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoEncodeRateControlInfoKHR* from,
-    VkVideoEncodeRateControlInfoKHR* to);
+void deepcopy_VkVideoEncodeRateControlInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                              const VkVideoEncodeRateControlInfoKHR* from,
+                                              VkVideoEncodeRateControlInfoKHR* to);
 
 #endif
 #ifdef VK_KHR_synchronization2
-void deepcopy_VkMemoryBarrier2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryBarrier2KHR* from,
-    VkMemoryBarrier2KHR* to);
+void deepcopy_VkMemoryBarrier2KHR(Allocator* alloc, VkStructureType rootType,
+                                  const VkMemoryBarrier2KHR* from, VkMemoryBarrier2KHR* to);
 
-void deepcopy_VkBufferMemoryBarrier2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBufferMemoryBarrier2KHR* from,
-    VkBufferMemoryBarrier2KHR* to);
+void deepcopy_VkBufferMemoryBarrier2KHR(Allocator* alloc, VkStructureType rootType,
+                                        const VkBufferMemoryBarrier2KHR* from,
+                                        VkBufferMemoryBarrier2KHR* to);
 
-void deepcopy_VkImageMemoryBarrier2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageMemoryBarrier2KHR* from,
-    VkImageMemoryBarrier2KHR* to);
+void deepcopy_VkImageMemoryBarrier2KHR(Allocator* alloc, VkStructureType rootType,
+                                       const VkImageMemoryBarrier2KHR* from,
+                                       VkImageMemoryBarrier2KHR* to);
 
-void deepcopy_VkDependencyInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDependencyInfoKHR* from,
-    VkDependencyInfoKHR* to);
+void deepcopy_VkDependencyInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                  const VkDependencyInfoKHR* from, VkDependencyInfoKHR* to);
 
-void deepcopy_VkSemaphoreSubmitInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSemaphoreSubmitInfoKHR* from,
-    VkSemaphoreSubmitInfoKHR* to);
+void deepcopy_VkSemaphoreSubmitInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                       const VkSemaphoreSubmitInfoKHR* from,
+                                       VkSemaphoreSubmitInfoKHR* to);
 
-void deepcopy_VkCommandBufferSubmitInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCommandBufferSubmitInfoKHR* from,
-    VkCommandBufferSubmitInfoKHR* to);
+void deepcopy_VkCommandBufferSubmitInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                           const VkCommandBufferSubmitInfoKHR* from,
+                                           VkCommandBufferSubmitInfoKHR* to);
 
-void deepcopy_VkSubmitInfo2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSubmitInfo2KHR* from,
-    VkSubmitInfo2KHR* to);
+void deepcopy_VkSubmitInfo2KHR(Allocator* alloc, VkStructureType rootType,
+                               const VkSubmitInfo2KHR* from, VkSubmitInfo2KHR* to);
 
 void deepcopy_VkPhysicalDeviceSynchronization2FeaturesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceSynchronization2FeaturesKHR* from,
     VkPhysicalDeviceSynchronization2FeaturesKHR* to);
 
-void deepcopy_VkQueueFamilyCheckpointProperties2NV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkQueueFamilyCheckpointProperties2NV* from,
-    VkQueueFamilyCheckpointProperties2NV* to);
+void deepcopy_VkQueueFamilyCheckpointProperties2NV(Allocator* alloc, VkStructureType rootType,
+                                                   const VkQueueFamilyCheckpointProperties2NV* from,
+                                                   VkQueueFamilyCheckpointProperties2NV* to);
 
-void deepcopy_VkCheckpointData2NV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCheckpointData2NV* from,
-    VkCheckpointData2NV* to);
+void deepcopy_VkCheckpointData2NV(Allocator* alloc, VkStructureType rootType,
+                                  const VkCheckpointData2NV* from, VkCheckpointData2NV* to);
 
 #endif
 #ifdef VK_KHR_shader_subgroup_uniform_control_flow
 void deepcopy_VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR* from,
     VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR* to);
 
 #endif
 #ifdef VK_KHR_zero_initialize_workgroup_memory
 void deepcopy_VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR* from,
     VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR* to);
 
 #endif
 #ifdef VK_KHR_workgroup_memory_explicit_layout
 void deepcopy_VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR* from,
     VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR* to);
 
 #endif
 #ifdef VK_KHR_copy_commands2
-void deepcopy_VkBufferCopy2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBufferCopy2KHR* from,
-    VkBufferCopy2KHR* to);
+void deepcopy_VkBufferCopy2KHR(Allocator* alloc, VkStructureType rootType,
+                               const VkBufferCopy2KHR* from, VkBufferCopy2KHR* to);
 
-void deepcopy_VkCopyBufferInfo2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCopyBufferInfo2KHR* from,
-    VkCopyBufferInfo2KHR* to);
+void deepcopy_VkCopyBufferInfo2KHR(Allocator* alloc, VkStructureType rootType,
+                                   const VkCopyBufferInfo2KHR* from, VkCopyBufferInfo2KHR* to);
 
-void deepcopy_VkImageCopy2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageCopy2KHR* from,
-    VkImageCopy2KHR* to);
+void deepcopy_VkImageCopy2KHR(Allocator* alloc, VkStructureType rootType,
+                              const VkImageCopy2KHR* from, VkImageCopy2KHR* to);
 
-void deepcopy_VkCopyImageInfo2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCopyImageInfo2KHR* from,
-    VkCopyImageInfo2KHR* to);
+void deepcopy_VkCopyImageInfo2KHR(Allocator* alloc, VkStructureType rootType,
+                                  const VkCopyImageInfo2KHR* from, VkCopyImageInfo2KHR* to);
 
-void deepcopy_VkBufferImageCopy2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBufferImageCopy2KHR* from,
-    VkBufferImageCopy2KHR* to);
+void deepcopy_VkBufferImageCopy2KHR(Allocator* alloc, VkStructureType rootType,
+                                    const VkBufferImageCopy2KHR* from, VkBufferImageCopy2KHR* to);
 
-void deepcopy_VkCopyBufferToImageInfo2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCopyBufferToImageInfo2KHR* from,
-    VkCopyBufferToImageInfo2KHR* to);
+void deepcopy_VkCopyBufferToImageInfo2KHR(Allocator* alloc, VkStructureType rootType,
+                                          const VkCopyBufferToImageInfo2KHR* from,
+                                          VkCopyBufferToImageInfo2KHR* to);
 
-void deepcopy_VkCopyImageToBufferInfo2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCopyImageToBufferInfo2KHR* from,
-    VkCopyImageToBufferInfo2KHR* to);
+void deepcopy_VkCopyImageToBufferInfo2KHR(Allocator* alloc, VkStructureType rootType,
+                                          const VkCopyImageToBufferInfo2KHR* from,
+                                          VkCopyImageToBufferInfo2KHR* to);
 
-void deepcopy_VkImageBlit2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageBlit2KHR* from,
-    VkImageBlit2KHR* to);
+void deepcopy_VkImageBlit2KHR(Allocator* alloc, VkStructureType rootType,
+                              const VkImageBlit2KHR* from, VkImageBlit2KHR* to);
 
-void deepcopy_VkBlitImageInfo2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBlitImageInfo2KHR* from,
-    VkBlitImageInfo2KHR* to);
+void deepcopy_VkBlitImageInfo2KHR(Allocator* alloc, VkStructureType rootType,
+                                  const VkBlitImageInfo2KHR* from, VkBlitImageInfo2KHR* to);
 
-void deepcopy_VkImageResolve2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageResolve2KHR* from,
-    VkImageResolve2KHR* to);
+void deepcopy_VkImageResolve2KHR(Allocator* alloc, VkStructureType rootType,
+                                 const VkImageResolve2KHR* from, VkImageResolve2KHR* to);
 
-void deepcopy_VkResolveImageInfo2KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkResolveImageInfo2KHR* from,
-    VkResolveImageInfo2KHR* to);
+void deepcopy_VkResolveImageInfo2KHR(Allocator* alloc, VkStructureType rootType,
+                                     const VkResolveImageInfo2KHR* from,
+                                     VkResolveImageInfo2KHR* to);
 
 #endif
 #ifdef VK_KHR_format_feature_flags2
-void deepcopy_VkFormatProperties3KHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkFormatProperties3KHR* from,
-    VkFormatProperties3KHR* to);
+void deepcopy_VkFormatProperties3KHR(Allocator* alloc, VkStructureType rootType,
+                                     const VkFormatProperties3KHR* from,
+                                     VkFormatProperties3KHR* to);
 
 #endif
 #ifdef VK_KHR_maintenance4
 void deepcopy_VkPhysicalDeviceMaintenance4FeaturesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceMaintenance4FeaturesKHR* from,
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDeviceMaintenance4FeaturesKHR* from,
     VkPhysicalDeviceMaintenance4FeaturesKHR* to);
 
 void deepcopy_VkPhysicalDeviceMaintenance4PropertiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceMaintenance4PropertiesKHR* from,
     VkPhysicalDeviceMaintenance4PropertiesKHR* to);
 
-void deepcopy_VkDeviceBufferMemoryRequirementsKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDeviceBufferMemoryRequirementsKHR* from,
-    VkDeviceBufferMemoryRequirementsKHR* to);
+void deepcopy_VkDeviceBufferMemoryRequirementsKHR(Allocator* alloc, VkStructureType rootType,
+                                                  const VkDeviceBufferMemoryRequirementsKHR* from,
+                                                  VkDeviceBufferMemoryRequirementsKHR* to);
 
-void deepcopy_VkDeviceImageMemoryRequirementsKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDeviceImageMemoryRequirementsKHR* from,
-    VkDeviceImageMemoryRequirementsKHR* to);
+void deepcopy_VkDeviceImageMemoryRequirementsKHR(Allocator* alloc, VkStructureType rootType,
+                                                 const VkDeviceImageMemoryRequirementsKHR* from,
+                                                 VkDeviceImageMemoryRequirementsKHR* to);
 
 #endif
 #ifdef VK_ANDROID_native_buffer
-void deepcopy_VkNativeBufferANDROID(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkNativeBufferANDROID* from,
-    VkNativeBufferANDROID* to);
+void deepcopy_VkNativeBufferANDROID(Allocator* alloc, VkStructureType rootType,
+                                    const VkNativeBufferANDROID* from, VkNativeBufferANDROID* to);
 
 #endif
 #ifdef VK_EXT_debug_report
-void deepcopy_VkDebugReportCallbackCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDebugReportCallbackCreateInfoEXT* from,
-    VkDebugReportCallbackCreateInfoEXT* to);
+void deepcopy_VkDebugReportCallbackCreateInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                                 const VkDebugReportCallbackCreateInfoEXT* from,
+                                                 VkDebugReportCallbackCreateInfoEXT* to);
 
 #endif
 #ifdef VK_NV_glsl_shader
@@ -2676,8 +1955,7 @@
 #endif
 #ifdef VK_AMD_rasterization_order
 void deepcopy_VkPipelineRasterizationStateRasterizationOrderAMD(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineRasterizationStateRasterizationOrderAMD* from,
     VkPipelineRasterizationStateRasterizationOrderAMD* to);
 
@@ -2687,99 +1965,74 @@
 #ifdef VK_AMD_shader_explicit_vertex_parameter
 #endif
 #ifdef VK_EXT_debug_marker
-void deepcopy_VkDebugMarkerObjectNameInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDebugMarkerObjectNameInfoEXT* from,
-    VkDebugMarkerObjectNameInfoEXT* to);
+void deepcopy_VkDebugMarkerObjectNameInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                             const VkDebugMarkerObjectNameInfoEXT* from,
+                                             VkDebugMarkerObjectNameInfoEXT* to);
 
-void deepcopy_VkDebugMarkerObjectTagInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDebugMarkerObjectTagInfoEXT* from,
-    VkDebugMarkerObjectTagInfoEXT* to);
+void deepcopy_VkDebugMarkerObjectTagInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                            const VkDebugMarkerObjectTagInfoEXT* from,
+                                            VkDebugMarkerObjectTagInfoEXT* to);
 
-void deepcopy_VkDebugMarkerMarkerInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDebugMarkerMarkerInfoEXT* from,
-    VkDebugMarkerMarkerInfoEXT* to);
+void deepcopy_VkDebugMarkerMarkerInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                         const VkDebugMarkerMarkerInfoEXT* from,
+                                         VkDebugMarkerMarkerInfoEXT* to);
 
 #endif
 #ifdef VK_AMD_gcn_shader
 #endif
 #ifdef VK_NV_dedicated_allocation
 void deepcopy_VkDedicatedAllocationImageCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDedicatedAllocationImageCreateInfoNV* from,
+    Allocator* alloc, VkStructureType rootType, const VkDedicatedAllocationImageCreateInfoNV* from,
     VkDedicatedAllocationImageCreateInfoNV* to);
 
 void deepcopy_VkDedicatedAllocationBufferCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDedicatedAllocationBufferCreateInfoNV* from,
+    Allocator* alloc, VkStructureType rootType, const VkDedicatedAllocationBufferCreateInfoNV* from,
     VkDedicatedAllocationBufferCreateInfoNV* to);
 
 void deepcopy_VkDedicatedAllocationMemoryAllocateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkDedicatedAllocationMemoryAllocateInfoNV* from,
     VkDedicatedAllocationMemoryAllocateInfoNV* to);
 
 #endif
 #ifdef VK_EXT_transform_feedback
 void deepcopy_VkPhysicalDeviceTransformFeedbackFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceTransformFeedbackFeaturesEXT* from,
     VkPhysicalDeviceTransformFeedbackFeaturesEXT* to);
 
 void deepcopy_VkPhysicalDeviceTransformFeedbackPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceTransformFeedbackPropertiesEXT* from,
     VkPhysicalDeviceTransformFeedbackPropertiesEXT* to);
 
 void deepcopy_VkPipelineRasterizationStateStreamCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineRasterizationStateStreamCreateInfoEXT* from,
     VkPipelineRasterizationStateStreamCreateInfoEXT* to);
 
 #endif
 #ifdef VK_NVX_binary_import
-void deepcopy_VkCuModuleCreateInfoNVX(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCuModuleCreateInfoNVX* from,
-    VkCuModuleCreateInfoNVX* to);
+void deepcopy_VkCuModuleCreateInfoNVX(Allocator* alloc, VkStructureType rootType,
+                                      const VkCuModuleCreateInfoNVX* from,
+                                      VkCuModuleCreateInfoNVX* to);
 
-void deepcopy_VkCuFunctionCreateInfoNVX(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCuFunctionCreateInfoNVX* from,
-    VkCuFunctionCreateInfoNVX* to);
+void deepcopy_VkCuFunctionCreateInfoNVX(Allocator* alloc, VkStructureType rootType,
+                                        const VkCuFunctionCreateInfoNVX* from,
+                                        VkCuFunctionCreateInfoNVX* to);
 
-void deepcopy_VkCuLaunchInfoNVX(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCuLaunchInfoNVX* from,
-    VkCuLaunchInfoNVX* to);
+void deepcopy_VkCuLaunchInfoNVX(Allocator* alloc, VkStructureType rootType,
+                                const VkCuLaunchInfoNVX* from, VkCuLaunchInfoNVX* to);
 
 #endif
 #ifdef VK_NVX_image_view_handle
-void deepcopy_VkImageViewHandleInfoNVX(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageViewHandleInfoNVX* from,
-    VkImageViewHandleInfoNVX* to);
+void deepcopy_VkImageViewHandleInfoNVX(Allocator* alloc, VkStructureType rootType,
+                                       const VkImageViewHandleInfoNVX* from,
+                                       VkImageViewHandleInfoNVX* to);
 
-void deepcopy_VkImageViewAddressPropertiesNVX(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageViewAddressPropertiesNVX* from,
-    VkImageViewAddressPropertiesNVX* to);
+void deepcopy_VkImageViewAddressPropertiesNVX(Allocator* alloc, VkStructureType rootType,
+                                              const VkImageViewAddressPropertiesNVX* from,
+                                              VkImageViewAddressPropertiesNVX* to);
 
 #endif
 #ifdef VK_AMD_draw_indirect_count
@@ -2791,209 +2044,154 @@
 #ifdef VK_AMD_shader_ballot
 #endif
 #ifdef VK_EXT_video_encode_h264
-void deepcopy_VkVideoEncodeH264CapabilitiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoEncodeH264CapabilitiesEXT* from,
-    VkVideoEncodeH264CapabilitiesEXT* to);
+void deepcopy_VkVideoEncodeH264CapabilitiesEXT(Allocator* alloc, VkStructureType rootType,
+                                               const VkVideoEncodeH264CapabilitiesEXT* from,
+                                               VkVideoEncodeH264CapabilitiesEXT* to);
 
 void deepcopy_VkVideoEncodeH264SessionCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoEncodeH264SessionCreateInfoEXT* from,
+    Allocator* alloc, VkStructureType rootType, const VkVideoEncodeH264SessionCreateInfoEXT* from,
     VkVideoEncodeH264SessionCreateInfoEXT* to);
 
 void deepcopy_VkVideoEncodeH264SessionParametersAddInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkVideoEncodeH264SessionParametersAddInfoEXT* from,
     VkVideoEncodeH264SessionParametersAddInfoEXT* to);
 
 void deepcopy_VkVideoEncodeH264SessionParametersCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkVideoEncodeH264SessionParametersCreateInfoEXT* from,
     VkVideoEncodeH264SessionParametersCreateInfoEXT* to);
 
-void deepcopy_VkVideoEncodeH264DpbSlotInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoEncodeH264DpbSlotInfoEXT* from,
-    VkVideoEncodeH264DpbSlotInfoEXT* to);
+void deepcopy_VkVideoEncodeH264DpbSlotInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                              const VkVideoEncodeH264DpbSlotInfoEXT* from,
+                                              VkVideoEncodeH264DpbSlotInfoEXT* to);
 
-void deepcopy_VkVideoEncodeH264NaluSliceEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoEncodeH264NaluSliceEXT* from,
-    VkVideoEncodeH264NaluSliceEXT* to);
+void deepcopy_VkVideoEncodeH264NaluSliceEXT(Allocator* alloc, VkStructureType rootType,
+                                            const VkVideoEncodeH264NaluSliceEXT* from,
+                                            VkVideoEncodeH264NaluSliceEXT* to);
 
-void deepcopy_VkVideoEncodeH264VclFrameInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoEncodeH264VclFrameInfoEXT* from,
-    VkVideoEncodeH264VclFrameInfoEXT* to);
+void deepcopy_VkVideoEncodeH264VclFrameInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                               const VkVideoEncodeH264VclFrameInfoEXT* from,
+                                               VkVideoEncodeH264VclFrameInfoEXT* to);
 
 void deepcopy_VkVideoEncodeH264EmitPictureParametersEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkVideoEncodeH264EmitPictureParametersEXT* from,
     VkVideoEncodeH264EmitPictureParametersEXT* to);
 
-void deepcopy_VkVideoEncodeH264ProfileEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoEncodeH264ProfileEXT* from,
-    VkVideoEncodeH264ProfileEXT* to);
+void deepcopy_VkVideoEncodeH264ProfileEXT(Allocator* alloc, VkStructureType rootType,
+                                          const VkVideoEncodeH264ProfileEXT* from,
+                                          VkVideoEncodeH264ProfileEXT* to);
 
 #endif
 #ifdef VK_EXT_video_encode_h265
-void deepcopy_VkVideoEncodeH265CapabilitiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoEncodeH265CapabilitiesEXT* from,
-    VkVideoEncodeH265CapabilitiesEXT* to);
+void deepcopy_VkVideoEncodeH265CapabilitiesEXT(Allocator* alloc, VkStructureType rootType,
+                                               const VkVideoEncodeH265CapabilitiesEXT* from,
+                                               VkVideoEncodeH265CapabilitiesEXT* to);
 
 void deepcopy_VkVideoEncodeH265SessionCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoEncodeH265SessionCreateInfoEXT* from,
+    Allocator* alloc, VkStructureType rootType, const VkVideoEncodeH265SessionCreateInfoEXT* from,
     VkVideoEncodeH265SessionCreateInfoEXT* to);
 
 void deepcopy_VkVideoEncodeH265SessionParametersAddInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkVideoEncodeH265SessionParametersAddInfoEXT* from,
     VkVideoEncodeH265SessionParametersAddInfoEXT* to);
 
 void deepcopy_VkVideoEncodeH265SessionParametersCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkVideoEncodeH265SessionParametersCreateInfoEXT* from,
     VkVideoEncodeH265SessionParametersCreateInfoEXT* to);
 
-void deepcopy_VkVideoEncodeH265DpbSlotInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoEncodeH265DpbSlotInfoEXT* from,
-    VkVideoEncodeH265DpbSlotInfoEXT* to);
+void deepcopy_VkVideoEncodeH265DpbSlotInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                              const VkVideoEncodeH265DpbSlotInfoEXT* from,
+                                              VkVideoEncodeH265DpbSlotInfoEXT* to);
 
-void deepcopy_VkVideoEncodeH265ReferenceListsEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoEncodeH265ReferenceListsEXT* from,
-    VkVideoEncodeH265ReferenceListsEXT* to);
+void deepcopy_VkVideoEncodeH265ReferenceListsEXT(Allocator* alloc, VkStructureType rootType,
+                                                 const VkVideoEncodeH265ReferenceListsEXT* from,
+                                                 VkVideoEncodeH265ReferenceListsEXT* to);
 
-void deepcopy_VkVideoEncodeH265NaluSliceEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoEncodeH265NaluSliceEXT* from,
-    VkVideoEncodeH265NaluSliceEXT* to);
+void deepcopy_VkVideoEncodeH265NaluSliceEXT(Allocator* alloc, VkStructureType rootType,
+                                            const VkVideoEncodeH265NaluSliceEXT* from,
+                                            VkVideoEncodeH265NaluSliceEXT* to);
 
-void deepcopy_VkVideoEncodeH265VclFrameInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoEncodeH265VclFrameInfoEXT* from,
-    VkVideoEncodeH265VclFrameInfoEXT* to);
+void deepcopy_VkVideoEncodeH265VclFrameInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                               const VkVideoEncodeH265VclFrameInfoEXT* from,
+                                               VkVideoEncodeH265VclFrameInfoEXT* to);
 
 void deepcopy_VkVideoEncodeH265EmitPictureParametersEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkVideoEncodeH265EmitPictureParametersEXT* from,
     VkVideoEncodeH265EmitPictureParametersEXT* to);
 
-void deepcopy_VkVideoEncodeH265ProfileEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoEncodeH265ProfileEXT* from,
-    VkVideoEncodeH265ProfileEXT* to);
+void deepcopy_VkVideoEncodeH265ProfileEXT(Allocator* alloc, VkStructureType rootType,
+                                          const VkVideoEncodeH265ProfileEXT* from,
+                                          VkVideoEncodeH265ProfileEXT* to);
 
 #endif
 #ifdef VK_EXT_video_decode_h264
-void deepcopy_VkVideoDecodeH264ProfileEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoDecodeH264ProfileEXT* from,
-    VkVideoDecodeH264ProfileEXT* to);
+void deepcopy_VkVideoDecodeH264ProfileEXT(Allocator* alloc, VkStructureType rootType,
+                                          const VkVideoDecodeH264ProfileEXT* from,
+                                          VkVideoDecodeH264ProfileEXT* to);
 
-void deepcopy_VkVideoDecodeH264CapabilitiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoDecodeH264CapabilitiesEXT* from,
-    VkVideoDecodeH264CapabilitiesEXT* to);
+void deepcopy_VkVideoDecodeH264CapabilitiesEXT(Allocator* alloc, VkStructureType rootType,
+                                               const VkVideoDecodeH264CapabilitiesEXT* from,
+                                               VkVideoDecodeH264CapabilitiesEXT* to);
 
 void deepcopy_VkVideoDecodeH264SessionCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoDecodeH264SessionCreateInfoEXT* from,
+    Allocator* alloc, VkStructureType rootType, const VkVideoDecodeH264SessionCreateInfoEXT* from,
     VkVideoDecodeH264SessionCreateInfoEXT* to);
 
 void deepcopy_VkVideoDecodeH264SessionParametersAddInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkVideoDecodeH264SessionParametersAddInfoEXT* from,
     VkVideoDecodeH264SessionParametersAddInfoEXT* to);
 
 void deepcopy_VkVideoDecodeH264SessionParametersCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkVideoDecodeH264SessionParametersCreateInfoEXT* from,
     VkVideoDecodeH264SessionParametersCreateInfoEXT* to);
 
-void deepcopy_VkVideoDecodeH264PictureInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoDecodeH264PictureInfoEXT* from,
-    VkVideoDecodeH264PictureInfoEXT* to);
+void deepcopy_VkVideoDecodeH264PictureInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                              const VkVideoDecodeH264PictureInfoEXT* from,
+                                              VkVideoDecodeH264PictureInfoEXT* to);
 
-void deepcopy_VkVideoDecodeH264MvcEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoDecodeH264MvcEXT* from,
-    VkVideoDecodeH264MvcEXT* to);
+void deepcopy_VkVideoDecodeH264MvcEXT(Allocator* alloc, VkStructureType rootType,
+                                      const VkVideoDecodeH264MvcEXT* from,
+                                      VkVideoDecodeH264MvcEXT* to);
 
-void deepcopy_VkVideoDecodeH264DpbSlotInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoDecodeH264DpbSlotInfoEXT* from,
-    VkVideoDecodeH264DpbSlotInfoEXT* to);
+void deepcopy_VkVideoDecodeH264DpbSlotInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                              const VkVideoDecodeH264DpbSlotInfoEXT* from,
+                                              VkVideoDecodeH264DpbSlotInfoEXT* to);
 
 #endif
 #ifdef VK_AMD_texture_gather_bias_lod
 void deepcopy_VkTextureLODGatherFormatPropertiesAMD(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkTextureLODGatherFormatPropertiesAMD* from,
+    Allocator* alloc, VkStructureType rootType, const VkTextureLODGatherFormatPropertiesAMD* from,
     VkTextureLODGatherFormatPropertiesAMD* to);
 
 #endif
 #ifdef VK_AMD_shader_info
-void deepcopy_VkShaderResourceUsageAMD(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkShaderResourceUsageAMD* from,
-    VkShaderResourceUsageAMD* to);
+void deepcopy_VkShaderResourceUsageAMD(Allocator* alloc, VkStructureType rootType,
+                                       const VkShaderResourceUsageAMD* from,
+                                       VkShaderResourceUsageAMD* to);
 
-void deepcopy_VkShaderStatisticsInfoAMD(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkShaderStatisticsInfoAMD* from,
-    VkShaderStatisticsInfoAMD* to);
+void deepcopy_VkShaderStatisticsInfoAMD(Allocator* alloc, VkStructureType rootType,
+                                        const VkShaderStatisticsInfoAMD* from,
+                                        VkShaderStatisticsInfoAMD* to);
 
 #endif
 #ifdef VK_AMD_shader_image_load_store_lod
 #endif
 #ifdef VK_GGP_stream_descriptor_surface
 void deepcopy_VkStreamDescriptorSurfaceCreateInfoGGP(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkStreamDescriptorSurfaceCreateInfoGGP* from,
+    Allocator* alloc, VkStructureType rootType, const VkStreamDescriptorSurfaceCreateInfoGGP* from,
     VkStreamDescriptorSurfaceCreateInfoGGP* to);
 
 #endif
 #ifdef VK_NV_corner_sampled_image
 void deepcopy_VkPhysicalDeviceCornerSampledImageFeaturesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceCornerSampledImageFeaturesNV* from,
     VkPhysicalDeviceCornerSampledImageFeaturesNV* to);
 
@@ -3001,63 +2199,46 @@
 #ifdef VK_IMG_format_pvrtc
 #endif
 #ifdef VK_NV_external_memory_capabilities
-void deepcopy_VkExternalImageFormatPropertiesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExternalImageFormatPropertiesNV* from,
-    VkExternalImageFormatPropertiesNV* to);
+void deepcopy_VkExternalImageFormatPropertiesNV(Allocator* alloc, VkStructureType rootType,
+                                                const VkExternalImageFormatPropertiesNV* from,
+                                                VkExternalImageFormatPropertiesNV* to);
 
 #endif
 #ifdef VK_NV_external_memory
-void deepcopy_VkExternalMemoryImageCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExternalMemoryImageCreateInfoNV* from,
-    VkExternalMemoryImageCreateInfoNV* to);
+void deepcopy_VkExternalMemoryImageCreateInfoNV(Allocator* alloc, VkStructureType rootType,
+                                                const VkExternalMemoryImageCreateInfoNV* from,
+                                                VkExternalMemoryImageCreateInfoNV* to);
 
-void deepcopy_VkExportMemoryAllocateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExportMemoryAllocateInfoNV* from,
-    VkExportMemoryAllocateInfoNV* to);
+void deepcopy_VkExportMemoryAllocateInfoNV(Allocator* alloc, VkStructureType rootType,
+                                           const VkExportMemoryAllocateInfoNV* from,
+                                           VkExportMemoryAllocateInfoNV* to);
 
 #endif
 #ifdef VK_NV_external_memory_win32
-void deepcopy_VkImportMemoryWin32HandleInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImportMemoryWin32HandleInfoNV* from,
-    VkImportMemoryWin32HandleInfoNV* to);
+void deepcopy_VkImportMemoryWin32HandleInfoNV(Allocator* alloc, VkStructureType rootType,
+                                              const VkImportMemoryWin32HandleInfoNV* from,
+                                              VkImportMemoryWin32HandleInfoNV* to);
 
-void deepcopy_VkExportMemoryWin32HandleInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExportMemoryWin32HandleInfoNV* from,
-    VkExportMemoryWin32HandleInfoNV* to);
+void deepcopy_VkExportMemoryWin32HandleInfoNV(Allocator* alloc, VkStructureType rootType,
+                                              const VkExportMemoryWin32HandleInfoNV* from,
+                                              VkExportMemoryWin32HandleInfoNV* to);
 
 #endif
 #ifdef VK_NV_win32_keyed_mutex
 void deepcopy_VkWin32KeyedMutexAcquireReleaseInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkWin32KeyedMutexAcquireReleaseInfoNV* from,
+    Allocator* alloc, VkStructureType rootType, const VkWin32KeyedMutexAcquireReleaseInfoNV* from,
     VkWin32KeyedMutexAcquireReleaseInfoNV* to);
 
 #endif
 #ifdef VK_EXT_validation_flags
-void deepcopy_VkValidationFlagsEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkValidationFlagsEXT* from,
-    VkValidationFlagsEXT* to);
+void deepcopy_VkValidationFlagsEXT(Allocator* alloc, VkStructureType rootType,
+                                   const VkValidationFlagsEXT* from, VkValidationFlagsEXT* to);
 
 #endif
 #ifdef VK_NN_vi_surface
-void deepcopy_VkViSurfaceCreateInfoNN(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkViSurfaceCreateInfoNN* from,
-    VkViSurfaceCreateInfoNN* to);
+void deepcopy_VkViSurfaceCreateInfoNN(Allocator* alloc, VkStructureType rootType,
+                                      const VkViSurfaceCreateInfoNN* from,
+                                      VkViSurfaceCreateInfoNN* to);
 
 #endif
 #ifdef VK_EXT_shader_subgroup_ballot
@@ -3066,56 +2247,43 @@
 #endif
 #ifdef VK_EXT_texture_compression_astc_hdr
 void deepcopy_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* from,
     VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* to);
 
 #endif
 #ifdef VK_EXT_astc_decode_mode
-void deepcopy_VkImageViewASTCDecodeModeEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageViewASTCDecodeModeEXT* from,
-    VkImageViewASTCDecodeModeEXT* to);
+void deepcopy_VkImageViewASTCDecodeModeEXT(Allocator* alloc, VkStructureType rootType,
+                                           const VkImageViewASTCDecodeModeEXT* from,
+                                           VkImageViewASTCDecodeModeEXT* to);
 
 void deepcopy_VkPhysicalDeviceASTCDecodeFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceASTCDecodeFeaturesEXT* from,
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDeviceASTCDecodeFeaturesEXT* from,
     VkPhysicalDeviceASTCDecodeFeaturesEXT* to);
 
 #endif
 #ifdef VK_EXT_conditional_rendering
-void deepcopy_VkConditionalRenderingBeginInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkConditionalRenderingBeginInfoEXT* from,
-    VkConditionalRenderingBeginInfoEXT* to);
+void deepcopy_VkConditionalRenderingBeginInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                                 const VkConditionalRenderingBeginInfoEXT* from,
+                                                 VkConditionalRenderingBeginInfoEXT* to);
 
 void deepcopy_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceConditionalRenderingFeaturesEXT* from,
     VkPhysicalDeviceConditionalRenderingFeaturesEXT* to);
 
 void deepcopy_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkCommandBufferInheritanceConditionalRenderingInfoEXT* from,
     VkCommandBufferInheritanceConditionalRenderingInfoEXT* to);
 
 #endif
 #ifdef VK_NV_clip_space_w_scaling
-void deepcopy_VkViewportWScalingNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkViewportWScalingNV* from,
-    VkViewportWScalingNV* to);
+void deepcopy_VkViewportWScalingNV(Allocator* alloc, VkStructureType rootType,
+                                   const VkViewportWScalingNV* from, VkViewportWScalingNV* to);
 
 void deepcopy_VkPipelineViewportWScalingStateCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineViewportWScalingStateCreateInfoNV* from,
     VkPipelineViewportWScalingStateCreateInfoNV* to);
 
@@ -3125,63 +2293,41 @@
 #ifdef VK_EXT_acquire_xlib_display
 #endif
 #ifdef VK_EXT_display_surface_counter
-void deepcopy_VkSurfaceCapabilities2EXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSurfaceCapabilities2EXT* from,
-    VkSurfaceCapabilities2EXT* to);
+void deepcopy_VkSurfaceCapabilities2EXT(Allocator* alloc, VkStructureType rootType,
+                                        const VkSurfaceCapabilities2EXT* from,
+                                        VkSurfaceCapabilities2EXT* to);
 
 #endif
 #ifdef VK_EXT_display_control
-void deepcopy_VkDisplayPowerInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDisplayPowerInfoEXT* from,
-    VkDisplayPowerInfoEXT* to);
+void deepcopy_VkDisplayPowerInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                    const VkDisplayPowerInfoEXT* from, VkDisplayPowerInfoEXT* to);
 
-void deepcopy_VkDeviceEventInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDeviceEventInfoEXT* from,
-    VkDeviceEventInfoEXT* to);
+void deepcopy_VkDeviceEventInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                   const VkDeviceEventInfoEXT* from, VkDeviceEventInfoEXT* to);
 
-void deepcopy_VkDisplayEventInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDisplayEventInfoEXT* from,
-    VkDisplayEventInfoEXT* to);
+void deepcopy_VkDisplayEventInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                    const VkDisplayEventInfoEXT* from, VkDisplayEventInfoEXT* to);
 
-void deepcopy_VkSwapchainCounterCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSwapchainCounterCreateInfoEXT* from,
-    VkSwapchainCounterCreateInfoEXT* to);
+void deepcopy_VkSwapchainCounterCreateInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                              const VkSwapchainCounterCreateInfoEXT* from,
+                                              VkSwapchainCounterCreateInfoEXT* to);
 
 #endif
 #ifdef VK_GOOGLE_display_timing
-void deepcopy_VkRefreshCycleDurationGOOGLE(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkRefreshCycleDurationGOOGLE* from,
-    VkRefreshCycleDurationGOOGLE* to);
+void deepcopy_VkRefreshCycleDurationGOOGLE(Allocator* alloc, VkStructureType rootType,
+                                           const VkRefreshCycleDurationGOOGLE* from,
+                                           VkRefreshCycleDurationGOOGLE* to);
 
-void deepcopy_VkPastPresentationTimingGOOGLE(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPastPresentationTimingGOOGLE* from,
-    VkPastPresentationTimingGOOGLE* to);
+void deepcopy_VkPastPresentationTimingGOOGLE(Allocator* alloc, VkStructureType rootType,
+                                             const VkPastPresentationTimingGOOGLE* from,
+                                             VkPastPresentationTimingGOOGLE* to);
 
-void deepcopy_VkPresentTimeGOOGLE(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPresentTimeGOOGLE* from,
-    VkPresentTimeGOOGLE* to);
+void deepcopy_VkPresentTimeGOOGLE(Allocator* alloc, VkStructureType rootType,
+                                  const VkPresentTimeGOOGLE* from, VkPresentTimeGOOGLE* to);
 
-void deepcopy_VkPresentTimesInfoGOOGLE(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPresentTimesInfoGOOGLE* from,
-    VkPresentTimesInfoGOOGLE* to);
+void deepcopy_VkPresentTimesInfoGOOGLE(Allocator* alloc, VkStructureType rootType,
+                                       const VkPresentTimesInfoGOOGLE* from,
+                                       VkPresentTimesInfoGOOGLE* to);
 
 #endif
 #ifdef VK_NV_sample_mask_override_coverage
@@ -3192,64 +2338,53 @@
 #endif
 #ifdef VK_NVX_multiview_per_view_attributes
 void deepcopy_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* from,
     VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* to);
 
 #endif
 #ifdef VK_NV_viewport_swizzle
-void deepcopy_VkViewportSwizzleNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkViewportSwizzleNV* from,
-    VkViewportSwizzleNV* to);
+void deepcopy_VkViewportSwizzleNV(Allocator* alloc, VkStructureType rootType,
+                                  const VkViewportSwizzleNV* from, VkViewportSwizzleNV* to);
 
 void deepcopy_VkPipelineViewportSwizzleStateCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineViewportSwizzleStateCreateInfoNV* from,
     VkPipelineViewportSwizzleStateCreateInfoNV* to);
 
 #endif
 #ifdef VK_EXT_discard_rectangles
 void deepcopy_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceDiscardRectanglePropertiesEXT* from,
     VkPhysicalDeviceDiscardRectanglePropertiesEXT* to);
 
 void deepcopy_VkPipelineDiscardRectangleStateCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineDiscardRectangleStateCreateInfoEXT* from,
     VkPipelineDiscardRectangleStateCreateInfoEXT* to);
 
 #endif
 #ifdef VK_EXT_conservative_rasterization
 void deepcopy_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceConservativeRasterizationPropertiesEXT* from,
     VkPhysicalDeviceConservativeRasterizationPropertiesEXT* to);
 
 void deepcopy_VkPipelineRasterizationConservativeStateCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineRasterizationConservativeStateCreateInfoEXT* from,
     VkPipelineRasterizationConservativeStateCreateInfoEXT* to);
 
 #endif
 #ifdef VK_EXT_depth_clip_enable
 void deepcopy_VkPhysicalDeviceDepthClipEnableFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceDepthClipEnableFeaturesEXT* from,
     VkPhysicalDeviceDepthClipEnableFeaturesEXT* to);
 
 void deepcopy_VkPipelineRasterizationDepthClipStateCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineRasterizationDepthClipStateCreateInfoEXT* from,
     VkPipelineRasterizationDepthClipStateCreateInfoEXT* to);
 
@@ -3257,33 +2392,23 @@
 #ifdef VK_EXT_swapchain_colorspace
 #endif
 #ifdef VK_EXT_hdr_metadata
-void deepcopy_VkXYColorEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkXYColorEXT* from,
-    VkXYColorEXT* to);
+void deepcopy_VkXYColorEXT(Allocator* alloc, VkStructureType rootType, const VkXYColorEXT* from,
+                           VkXYColorEXT* to);
 
-void deepcopy_VkHdrMetadataEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkHdrMetadataEXT* from,
-    VkHdrMetadataEXT* to);
+void deepcopy_VkHdrMetadataEXT(Allocator* alloc, VkStructureType rootType,
+                               const VkHdrMetadataEXT* from, VkHdrMetadataEXT* to);
 
 #endif
 #ifdef VK_MVK_ios_surface
-void deepcopy_VkIOSSurfaceCreateInfoMVK(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkIOSSurfaceCreateInfoMVK* from,
-    VkIOSSurfaceCreateInfoMVK* to);
+void deepcopy_VkIOSSurfaceCreateInfoMVK(Allocator* alloc, VkStructureType rootType,
+                                        const VkIOSSurfaceCreateInfoMVK* from,
+                                        VkIOSSurfaceCreateInfoMVK* to);
 
 #endif
 #ifdef VK_MVK_macos_surface
-void deepcopy_VkMacOSSurfaceCreateInfoMVK(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMacOSSurfaceCreateInfoMVK* from,
-    VkMacOSSurfaceCreateInfoMVK* to);
+void deepcopy_VkMacOSSurfaceCreateInfoMVK(Allocator* alloc, VkStructureType rootType,
+                                          const VkMacOSSurfaceCreateInfoMVK* from,
+                                          VkMacOSSurfaceCreateInfoMVK* to);
 
 #endif
 #ifdef VK_MVK_moltenvk
@@ -3293,85 +2418,67 @@
 #ifdef VK_EXT_queue_family_foreign
 #endif
 #ifdef VK_EXT_debug_utils
-void deepcopy_VkDebugUtilsLabelEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDebugUtilsLabelEXT* from,
-    VkDebugUtilsLabelEXT* to);
+void deepcopy_VkDebugUtilsLabelEXT(Allocator* alloc, VkStructureType rootType,
+                                   const VkDebugUtilsLabelEXT* from, VkDebugUtilsLabelEXT* to);
 
-void deepcopy_VkDebugUtilsObjectNameInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDebugUtilsObjectNameInfoEXT* from,
-    VkDebugUtilsObjectNameInfoEXT* to);
+void deepcopy_VkDebugUtilsObjectNameInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                            const VkDebugUtilsObjectNameInfoEXT* from,
+                                            VkDebugUtilsObjectNameInfoEXT* to);
 
-void deepcopy_VkDebugUtilsMessengerCallbackDataEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDebugUtilsMessengerCallbackDataEXT* from,
-    VkDebugUtilsMessengerCallbackDataEXT* to);
+void deepcopy_VkDebugUtilsMessengerCallbackDataEXT(Allocator* alloc, VkStructureType rootType,
+                                                   const VkDebugUtilsMessengerCallbackDataEXT* from,
+                                                   VkDebugUtilsMessengerCallbackDataEXT* to);
 
-void deepcopy_VkDebugUtilsMessengerCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDebugUtilsMessengerCreateInfoEXT* from,
-    VkDebugUtilsMessengerCreateInfoEXT* to);
+void deepcopy_VkDebugUtilsMessengerCreateInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                                 const VkDebugUtilsMessengerCreateInfoEXT* from,
+                                                 VkDebugUtilsMessengerCreateInfoEXT* to);
 
-void deepcopy_VkDebugUtilsObjectTagInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDebugUtilsObjectTagInfoEXT* from,
-    VkDebugUtilsObjectTagInfoEXT* to);
+void deepcopy_VkDebugUtilsObjectTagInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                           const VkDebugUtilsObjectTagInfoEXT* from,
+                                           VkDebugUtilsObjectTagInfoEXT* to);
 
 #endif
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
-void deepcopy_VkAndroidHardwareBufferUsageANDROID(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAndroidHardwareBufferUsageANDROID* from,
-    VkAndroidHardwareBufferUsageANDROID* to);
+void deepcopy_VkAndroidHardwareBufferUsageANDROID(Allocator* alloc, VkStructureType rootType,
+                                                  const VkAndroidHardwareBufferUsageANDROID* from,
+                                                  VkAndroidHardwareBufferUsageANDROID* to);
 
 void deepcopy_VkAndroidHardwareBufferPropertiesANDROID(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkAndroidHardwareBufferPropertiesANDROID* from,
     VkAndroidHardwareBufferPropertiesANDROID* to);
 
 void deepcopy_VkAndroidHardwareBufferFormatPropertiesANDROID(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkAndroidHardwareBufferFormatPropertiesANDROID* from,
     VkAndroidHardwareBufferFormatPropertiesANDROID* to);
 
 void deepcopy_VkImportAndroidHardwareBufferInfoANDROID(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkImportAndroidHardwareBufferInfoANDROID* from,
     VkImportAndroidHardwareBufferInfoANDROID* to);
 
 void deepcopy_VkMemoryGetAndroidHardwareBufferInfoANDROID(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkMemoryGetAndroidHardwareBufferInfoANDROID* from,
     VkMemoryGetAndroidHardwareBufferInfoANDROID* to);
 
-void deepcopy_VkExternalFormatANDROID(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkExternalFormatANDROID* from,
-    VkExternalFormatANDROID* to);
+void deepcopy_VkExternalFormatANDROID(Allocator* alloc, VkStructureType rootType,
+                                      const VkExternalFormatANDROID* from,
+                                      VkExternalFormatANDROID* to);
 
 void deepcopy_VkAndroidHardwareBufferFormatProperties2ANDROID(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkAndroidHardwareBufferFormatProperties2ANDROID* from,
     VkAndroidHardwareBufferFormatProperties2ANDROID* to);
 
 #endif
 #ifdef VK_EXT_sampler_filter_minmax
-DEFINE_ALIAS_FUNCTION(deepcopy_VkSamplerReductionModeCreateInfo, deepcopy_VkSamplerReductionModeCreateInfoEXT)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkSamplerReductionModeCreateInfo,
+                      deepcopy_VkSamplerReductionModeCreateInfoEXT)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceSamplerFilterMinmaxProperties, deepcopy_VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceSamplerFilterMinmaxProperties,
+                      deepcopy_VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT)
 
 #endif
 #ifdef VK_AMD_gpu_shader_int16
@@ -3382,26 +2489,22 @@
 #endif
 #ifdef VK_EXT_inline_uniform_block
 void deepcopy_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceInlineUniformBlockFeaturesEXT* from,
     VkPhysicalDeviceInlineUniformBlockFeaturesEXT* to);
 
 void deepcopy_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceInlineUniformBlockPropertiesEXT* from,
     VkPhysicalDeviceInlineUniformBlockPropertiesEXT* to);
 
 void deepcopy_VkWriteDescriptorSetInlineUniformBlockEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkWriteDescriptorSetInlineUniformBlockEXT* from,
     VkWriteDescriptorSetInlineUniformBlockEXT* to);
 
 void deepcopy_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkDescriptorPoolInlineUniformBlockCreateInfoEXT* from,
     VkDescriptorPoolInlineUniformBlockCreateInfoEXT* to);
 
@@ -3409,87 +2512,67 @@
 #ifdef VK_EXT_shader_stencil_export
 #endif
 #ifdef VK_EXT_sample_locations
-void deepcopy_VkSampleLocationEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSampleLocationEXT* from,
-    VkSampleLocationEXT* to);
+void deepcopy_VkSampleLocationEXT(Allocator* alloc, VkStructureType rootType,
+                                  const VkSampleLocationEXT* from, VkSampleLocationEXT* to);
 
-void deepcopy_VkSampleLocationsInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSampleLocationsInfoEXT* from,
-    VkSampleLocationsInfoEXT* to);
+void deepcopy_VkSampleLocationsInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                       const VkSampleLocationsInfoEXT* from,
+                                       VkSampleLocationsInfoEXT* to);
 
-void deepcopy_VkAttachmentSampleLocationsEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAttachmentSampleLocationsEXT* from,
-    VkAttachmentSampleLocationsEXT* to);
+void deepcopy_VkAttachmentSampleLocationsEXT(Allocator* alloc, VkStructureType rootType,
+                                             const VkAttachmentSampleLocationsEXT* from,
+                                             VkAttachmentSampleLocationsEXT* to);
 
-void deepcopy_VkSubpassSampleLocationsEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSubpassSampleLocationsEXT* from,
-    VkSubpassSampleLocationsEXT* to);
+void deepcopy_VkSubpassSampleLocationsEXT(Allocator* alloc, VkStructureType rootType,
+                                          const VkSubpassSampleLocationsEXT* from,
+                                          VkSubpassSampleLocationsEXT* to);
 
 void deepcopy_VkRenderPassSampleLocationsBeginInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkRenderPassSampleLocationsBeginInfoEXT* from,
+    Allocator* alloc, VkStructureType rootType, const VkRenderPassSampleLocationsBeginInfoEXT* from,
     VkRenderPassSampleLocationsBeginInfoEXT* to);
 
 void deepcopy_VkPipelineSampleLocationsStateCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineSampleLocationsStateCreateInfoEXT* from,
     VkPipelineSampleLocationsStateCreateInfoEXT* to);
 
 void deepcopy_VkPhysicalDeviceSampleLocationsPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceSampleLocationsPropertiesEXT* from,
     VkPhysicalDeviceSampleLocationsPropertiesEXT* to);
 
-void deepcopy_VkMultisamplePropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMultisamplePropertiesEXT* from,
-    VkMultisamplePropertiesEXT* to);
+void deepcopy_VkMultisamplePropertiesEXT(Allocator* alloc, VkStructureType rootType,
+                                         const VkMultisamplePropertiesEXT* from,
+                                         VkMultisamplePropertiesEXT* to);
 
 #endif
 #ifdef VK_EXT_blend_operation_advanced
 void deepcopy_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* from,
     VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* to);
 
 void deepcopy_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* from,
     VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* to);
 
 void deepcopy_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineColorBlendAdvancedStateCreateInfoEXT* from,
     VkPipelineColorBlendAdvancedStateCreateInfoEXT* to);
 
 #endif
 #ifdef VK_NV_fragment_coverage_to_color
 void deepcopy_VkPipelineCoverageToColorStateCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineCoverageToColorStateCreateInfoNV* from,
     VkPipelineCoverageToColorStateCreateInfoNV* to);
 
 #endif
 #ifdef VK_NV_framebuffer_mixed_samples
 void deepcopy_VkPipelineCoverageModulationStateCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineCoverageModulationStateCreateInfoNV* from,
     VkPipelineCoverageModulationStateCreateInfoNV* to);
 
@@ -3498,14 +2581,12 @@
 #endif
 #ifdef VK_NV_shader_sm_builtins
 void deepcopy_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* from,
     VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* to);
 
 void deepcopy_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* from,
     VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* to);
 
@@ -3513,249 +2594,191 @@
 #ifdef VK_EXT_post_depth_coverage
 #endif
 #ifdef VK_EXT_image_drm_format_modifier
-void deepcopy_VkDrmFormatModifierPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDrmFormatModifierPropertiesEXT* from,
-    VkDrmFormatModifierPropertiesEXT* to);
+void deepcopy_VkDrmFormatModifierPropertiesEXT(Allocator* alloc, VkStructureType rootType,
+                                               const VkDrmFormatModifierPropertiesEXT* from,
+                                               VkDrmFormatModifierPropertiesEXT* to);
 
-void deepcopy_VkDrmFormatModifierPropertiesListEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDrmFormatModifierPropertiesListEXT* from,
-    VkDrmFormatModifierPropertiesListEXT* to);
+void deepcopy_VkDrmFormatModifierPropertiesListEXT(Allocator* alloc, VkStructureType rootType,
+                                                   const VkDrmFormatModifierPropertiesListEXT* from,
+                                                   VkDrmFormatModifierPropertiesListEXT* to);
 
 void deepcopy_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceImageDrmFormatModifierInfoEXT* from,
     VkPhysicalDeviceImageDrmFormatModifierInfoEXT* to);
 
 void deepcopy_VkImageDrmFormatModifierListCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkImageDrmFormatModifierListCreateInfoEXT* from,
     VkImageDrmFormatModifierListCreateInfoEXT* to);
 
 void deepcopy_VkImageDrmFormatModifierExplicitCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkImageDrmFormatModifierExplicitCreateInfoEXT* from,
     VkImageDrmFormatModifierExplicitCreateInfoEXT* to);
 
 void deepcopy_VkImageDrmFormatModifierPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageDrmFormatModifierPropertiesEXT* from,
+    Allocator* alloc, VkStructureType rootType, const VkImageDrmFormatModifierPropertiesEXT* from,
     VkImageDrmFormatModifierPropertiesEXT* to);
 
-void deepcopy_VkDrmFormatModifierProperties2EXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDrmFormatModifierProperties2EXT* from,
-    VkDrmFormatModifierProperties2EXT* to);
+void deepcopy_VkDrmFormatModifierProperties2EXT(Allocator* alloc, VkStructureType rootType,
+                                                const VkDrmFormatModifierProperties2EXT* from,
+                                                VkDrmFormatModifierProperties2EXT* to);
 
 void deepcopy_VkDrmFormatModifierPropertiesList2EXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDrmFormatModifierPropertiesList2EXT* from,
+    Allocator* alloc, VkStructureType rootType, const VkDrmFormatModifierPropertiesList2EXT* from,
     VkDrmFormatModifierPropertiesList2EXT* to);
 
 #endif
 #ifdef VK_EXT_validation_cache
-void deepcopy_VkValidationCacheCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkValidationCacheCreateInfoEXT* from,
-    VkValidationCacheCreateInfoEXT* to);
+void deepcopy_VkValidationCacheCreateInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                             const VkValidationCacheCreateInfoEXT* from,
+                                             VkValidationCacheCreateInfoEXT* to);
 
 void deepcopy_VkShaderModuleValidationCacheCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkShaderModuleValidationCacheCreateInfoEXT* from,
     VkShaderModuleValidationCacheCreateInfoEXT* to);
 
 #endif
 #ifdef VK_EXT_descriptor_indexing
-DEFINE_ALIAS_FUNCTION(deepcopy_VkDescriptorSetLayoutBindingFlagsCreateInfo, deepcopy_VkDescriptorSetLayoutBindingFlagsCreateInfoEXT)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkDescriptorSetLayoutBindingFlagsCreateInfo,
+                      deepcopy_VkDescriptorSetLayoutBindingFlagsCreateInfoEXT)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceDescriptorIndexingFeatures, deepcopy_VkPhysicalDeviceDescriptorIndexingFeaturesEXT)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceDescriptorIndexingFeatures,
+                      deepcopy_VkPhysicalDeviceDescriptorIndexingFeaturesEXT)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceDescriptorIndexingProperties, deepcopy_VkPhysicalDeviceDescriptorIndexingPropertiesEXT)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceDescriptorIndexingProperties,
+                      deepcopy_VkPhysicalDeviceDescriptorIndexingPropertiesEXT)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkDescriptorSetVariableDescriptorCountAllocateInfo, deepcopy_VkDescriptorSetVariableDescriptorCountAllocateInfoEXT)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkDescriptorSetVariableDescriptorCountAllocateInfo,
+                      deepcopy_VkDescriptorSetVariableDescriptorCountAllocateInfoEXT)
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkDescriptorSetVariableDescriptorCountLayoutSupport, deepcopy_VkDescriptorSetVariableDescriptorCountLayoutSupportEXT)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkDescriptorSetVariableDescriptorCountLayoutSupport,
+                      deepcopy_VkDescriptorSetVariableDescriptorCountLayoutSupportEXT)
 
 #endif
 #ifdef VK_EXT_shader_viewport_index_layer
 #endif
 #ifdef VK_NV_shading_rate_image
-void deepcopy_VkShadingRatePaletteNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkShadingRatePaletteNV* from,
-    VkShadingRatePaletteNV* to);
+void deepcopy_VkShadingRatePaletteNV(Allocator* alloc, VkStructureType rootType,
+                                     const VkShadingRatePaletteNV* from,
+                                     VkShadingRatePaletteNV* to);
 
 void deepcopy_VkPipelineViewportShadingRateImageStateCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineViewportShadingRateImageStateCreateInfoNV* from,
     VkPipelineViewportShadingRateImageStateCreateInfoNV* to);
 
 void deepcopy_VkPhysicalDeviceShadingRateImageFeaturesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShadingRateImageFeaturesNV* from,
     VkPhysicalDeviceShadingRateImageFeaturesNV* to);
 
 void deepcopy_VkPhysicalDeviceShadingRateImagePropertiesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShadingRateImagePropertiesNV* from,
     VkPhysicalDeviceShadingRateImagePropertiesNV* to);
 
-void deepcopy_VkCoarseSampleLocationNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCoarseSampleLocationNV* from,
-    VkCoarseSampleLocationNV* to);
+void deepcopy_VkCoarseSampleLocationNV(Allocator* alloc, VkStructureType rootType,
+                                       const VkCoarseSampleLocationNV* from,
+                                       VkCoarseSampleLocationNV* to);
 
-void deepcopy_VkCoarseSampleOrderCustomNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCoarseSampleOrderCustomNV* from,
-    VkCoarseSampleOrderCustomNV* to);
+void deepcopy_VkCoarseSampleOrderCustomNV(Allocator* alloc, VkStructureType rootType,
+                                          const VkCoarseSampleOrderCustomNV* from,
+                                          VkCoarseSampleOrderCustomNV* to);
 
 void deepcopy_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* from,
     VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* to);
 
 #endif
 #ifdef VK_NV_ray_tracing
-void deepcopy_VkRayTracingShaderGroupCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkRayTracingShaderGroupCreateInfoNV* from,
-    VkRayTracingShaderGroupCreateInfoNV* to);
+void deepcopy_VkRayTracingShaderGroupCreateInfoNV(Allocator* alloc, VkStructureType rootType,
+                                                  const VkRayTracingShaderGroupCreateInfoNV* from,
+                                                  VkRayTracingShaderGroupCreateInfoNV* to);
 
-void deepcopy_VkRayTracingPipelineCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkRayTracingPipelineCreateInfoNV* from,
-    VkRayTracingPipelineCreateInfoNV* to);
+void deepcopy_VkRayTracingPipelineCreateInfoNV(Allocator* alloc, VkStructureType rootType,
+                                               const VkRayTracingPipelineCreateInfoNV* from,
+                                               VkRayTracingPipelineCreateInfoNV* to);
 
-void deepcopy_VkGeometryTrianglesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkGeometryTrianglesNV* from,
-    VkGeometryTrianglesNV* to);
+void deepcopy_VkGeometryTrianglesNV(Allocator* alloc, VkStructureType rootType,
+                                    const VkGeometryTrianglesNV* from, VkGeometryTrianglesNV* to);
 
-void deepcopy_VkGeometryAABBNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkGeometryAABBNV* from,
-    VkGeometryAABBNV* to);
+void deepcopy_VkGeometryAABBNV(Allocator* alloc, VkStructureType rootType,
+                               const VkGeometryAABBNV* from, VkGeometryAABBNV* to);
 
-void deepcopy_VkGeometryDataNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkGeometryDataNV* from,
-    VkGeometryDataNV* to);
+void deepcopy_VkGeometryDataNV(Allocator* alloc, VkStructureType rootType,
+                               const VkGeometryDataNV* from, VkGeometryDataNV* to);
 
-void deepcopy_VkGeometryNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkGeometryNV* from,
-    VkGeometryNV* to);
+void deepcopy_VkGeometryNV(Allocator* alloc, VkStructureType rootType, const VkGeometryNV* from,
+                           VkGeometryNV* to);
 
-void deepcopy_VkAccelerationStructureInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAccelerationStructureInfoNV* from,
-    VkAccelerationStructureInfoNV* to);
+void deepcopy_VkAccelerationStructureInfoNV(Allocator* alloc, VkStructureType rootType,
+                                            const VkAccelerationStructureInfoNV* from,
+                                            VkAccelerationStructureInfoNV* to);
 
-void deepcopy_VkAccelerationStructureCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAccelerationStructureCreateInfoNV* from,
-    VkAccelerationStructureCreateInfoNV* to);
+void deepcopy_VkAccelerationStructureCreateInfoNV(Allocator* alloc, VkStructureType rootType,
+                                                  const VkAccelerationStructureCreateInfoNV* from,
+                                                  VkAccelerationStructureCreateInfoNV* to);
 
 void deepcopy_VkBindAccelerationStructureMemoryInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBindAccelerationStructureMemoryInfoNV* from,
+    Allocator* alloc, VkStructureType rootType, const VkBindAccelerationStructureMemoryInfoNV* from,
     VkBindAccelerationStructureMemoryInfoNV* to);
 
 void deepcopy_VkWriteDescriptorSetAccelerationStructureNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkWriteDescriptorSetAccelerationStructureNV* from,
     VkWriteDescriptorSetAccelerationStructureNV* to);
 
 void deepcopy_VkAccelerationStructureMemoryRequirementsInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkAccelerationStructureMemoryRequirementsInfoNV* from,
     VkAccelerationStructureMemoryRequirementsInfoNV* to);
 
 void deepcopy_VkPhysicalDeviceRayTracingPropertiesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceRayTracingPropertiesNV* from,
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDeviceRayTracingPropertiesNV* from,
     VkPhysicalDeviceRayTracingPropertiesNV* to);
 
-void deepcopy_VkTransformMatrixKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkTransformMatrixKHR* from,
-    VkTransformMatrixKHR* to);
+void deepcopy_VkTransformMatrixKHR(Allocator* alloc, VkStructureType rootType,
+                                   const VkTransformMatrixKHR* from, VkTransformMatrixKHR* to);
 
 DEFINE_ALIAS_FUNCTION(deepcopy_VkTransformMatrixKHR, deepcopy_VkTransformMatrixNV)
 
-void deepcopy_VkAabbPositionsKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAabbPositionsKHR* from,
-    VkAabbPositionsKHR* to);
+void deepcopy_VkAabbPositionsKHR(Allocator* alloc, VkStructureType rootType,
+                                 const VkAabbPositionsKHR* from, VkAabbPositionsKHR* to);
 
 DEFINE_ALIAS_FUNCTION(deepcopy_VkAabbPositionsKHR, deepcopy_VkAabbPositionsNV)
 
-void deepcopy_VkAccelerationStructureInstanceKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAccelerationStructureInstanceKHR* from,
-    VkAccelerationStructureInstanceKHR* to);
+void deepcopy_VkAccelerationStructureInstanceKHR(Allocator* alloc, VkStructureType rootType,
+                                                 const VkAccelerationStructureInstanceKHR* from,
+                                                 VkAccelerationStructureInstanceKHR* to);
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkAccelerationStructureInstanceKHR, deepcopy_VkAccelerationStructureInstanceNV)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkAccelerationStructureInstanceKHR,
+                      deepcopy_VkAccelerationStructureInstanceNV)
 
 #endif
 #ifdef VK_NV_representative_fragment_test
 void deepcopy_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* from,
     VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* to);
 
 void deepcopy_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineRepresentativeFragmentTestStateCreateInfoNV* from,
     VkPipelineRepresentativeFragmentTestStateCreateInfoNV* to);
 
 #endif
 #ifdef VK_EXT_filter_cubic
 void deepcopy_VkPhysicalDeviceImageViewImageFormatInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceImageViewImageFormatInfoEXT* from,
     VkPhysicalDeviceImageViewImageFormatInfoEXT* to);
 
 void deepcopy_VkFilterCubicImageViewImageFormatPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkFilterCubicImageViewImageFormatPropertiesEXT* from,
     VkFilterCubicImageViewImageFormatPropertiesEXT* to);
 
@@ -3764,28 +2787,22 @@
 #endif
 #ifdef VK_EXT_global_priority
 void deepcopy_VkDeviceQueueGlobalPriorityCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkDeviceQueueGlobalPriorityCreateInfoEXT* from,
     VkDeviceQueueGlobalPriorityCreateInfoEXT* to);
 
 #endif
 #ifdef VK_EXT_external_memory_host
-void deepcopy_VkImportMemoryHostPointerInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImportMemoryHostPointerInfoEXT* from,
-    VkImportMemoryHostPointerInfoEXT* to);
+void deepcopy_VkImportMemoryHostPointerInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                               const VkImportMemoryHostPointerInfoEXT* from,
+                                               VkImportMemoryHostPointerInfoEXT* to);
 
-void deepcopy_VkMemoryHostPointerPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryHostPointerPropertiesEXT* from,
-    VkMemoryHostPointerPropertiesEXT* to);
+void deepcopy_VkMemoryHostPointerPropertiesEXT(Allocator* alloc, VkStructureType rootType,
+                                               const VkMemoryHostPointerPropertiesEXT* from,
+                                               VkMemoryHostPointerPropertiesEXT* to);
 
 void deepcopy_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceExternalMemoryHostPropertiesEXT* from,
     VkPhysicalDeviceExternalMemoryHostPropertiesEXT* to);
 
@@ -3794,125 +2811,96 @@
 #endif
 #ifdef VK_AMD_pipeline_compiler_control
 void deepcopy_VkPipelineCompilerControlCreateInfoAMD(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineCompilerControlCreateInfoAMD* from,
+    Allocator* alloc, VkStructureType rootType, const VkPipelineCompilerControlCreateInfoAMD* from,
     VkPipelineCompilerControlCreateInfoAMD* to);
 
 #endif
 #ifdef VK_EXT_calibrated_timestamps
-void deepcopy_VkCalibratedTimestampInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCalibratedTimestampInfoEXT* from,
-    VkCalibratedTimestampInfoEXT* to);
+void deepcopy_VkCalibratedTimestampInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                           const VkCalibratedTimestampInfoEXT* from,
+                                           VkCalibratedTimestampInfoEXT* to);
 
 #endif
 #ifdef VK_AMD_shader_core_properties
 void deepcopy_VkPhysicalDeviceShaderCorePropertiesAMD(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceShaderCorePropertiesAMD* from,
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDeviceShaderCorePropertiesAMD* from,
     VkPhysicalDeviceShaderCorePropertiesAMD* to);
 
 #endif
 #ifdef VK_EXT_video_decode_h265
-void deepcopy_VkVideoDecodeH265ProfileEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoDecodeH265ProfileEXT* from,
-    VkVideoDecodeH265ProfileEXT* to);
+void deepcopy_VkVideoDecodeH265ProfileEXT(Allocator* alloc, VkStructureType rootType,
+                                          const VkVideoDecodeH265ProfileEXT* from,
+                                          VkVideoDecodeH265ProfileEXT* to);
 
-void deepcopy_VkVideoDecodeH265CapabilitiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoDecodeH265CapabilitiesEXT* from,
-    VkVideoDecodeH265CapabilitiesEXT* to);
+void deepcopy_VkVideoDecodeH265CapabilitiesEXT(Allocator* alloc, VkStructureType rootType,
+                                               const VkVideoDecodeH265CapabilitiesEXT* from,
+                                               VkVideoDecodeH265CapabilitiesEXT* to);
 
 void deepcopy_VkVideoDecodeH265SessionCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoDecodeH265SessionCreateInfoEXT* from,
+    Allocator* alloc, VkStructureType rootType, const VkVideoDecodeH265SessionCreateInfoEXT* from,
     VkVideoDecodeH265SessionCreateInfoEXT* to);
 
 void deepcopy_VkVideoDecodeH265SessionParametersAddInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkVideoDecodeH265SessionParametersAddInfoEXT* from,
     VkVideoDecodeH265SessionParametersAddInfoEXT* to);
 
 void deepcopy_VkVideoDecodeH265SessionParametersCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkVideoDecodeH265SessionParametersCreateInfoEXT* from,
     VkVideoDecodeH265SessionParametersCreateInfoEXT* to);
 
-void deepcopy_VkVideoDecodeH265PictureInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoDecodeH265PictureInfoEXT* from,
-    VkVideoDecodeH265PictureInfoEXT* to);
+void deepcopy_VkVideoDecodeH265PictureInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                              const VkVideoDecodeH265PictureInfoEXT* from,
+                                              VkVideoDecodeH265PictureInfoEXT* to);
 
-void deepcopy_VkVideoDecodeH265DpbSlotInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVideoDecodeH265DpbSlotInfoEXT* from,
-    VkVideoDecodeH265DpbSlotInfoEXT* to);
+void deepcopy_VkVideoDecodeH265DpbSlotInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                              const VkVideoDecodeH265DpbSlotInfoEXT* from,
+                                              VkVideoDecodeH265DpbSlotInfoEXT* to);
 
 #endif
 #ifdef VK_AMD_memory_overallocation_behavior
 void deepcopy_VkDeviceMemoryOverallocationCreateInfoAMD(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkDeviceMemoryOverallocationCreateInfoAMD* from,
     VkDeviceMemoryOverallocationCreateInfoAMD* to);
 
 #endif
 #ifdef VK_EXT_vertex_attribute_divisor
 void deepcopy_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* from,
     VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* to);
 
 void deepcopy_VkVertexInputBindingDivisorDescriptionEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkVertexInputBindingDivisorDescriptionEXT* from,
     VkVertexInputBindingDivisorDescriptionEXT* to);
 
 void deepcopy_VkPipelineVertexInputDivisorStateCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineVertexInputDivisorStateCreateInfoEXT* from,
     VkPipelineVertexInputDivisorStateCreateInfoEXT* to);
 
 void deepcopy_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* from,
     VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* to);
 
 #endif
 #ifdef VK_GGP_frame_token
-void deepcopy_VkPresentFrameTokenGGP(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPresentFrameTokenGGP* from,
-    VkPresentFrameTokenGGP* to);
+void deepcopy_VkPresentFrameTokenGGP(Allocator* alloc, VkStructureType rootType,
+                                     const VkPresentFrameTokenGGP* from,
+                                     VkPresentFrameTokenGGP* to);
 
 #endif
 #ifdef VK_EXT_pipeline_creation_feedback
-void deepcopy_VkPipelineCreationFeedbackEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineCreationFeedbackEXT* from,
-    VkPipelineCreationFeedbackEXT* to);
+void deepcopy_VkPipelineCreationFeedbackEXT(Allocator* alloc, VkStructureType rootType,
+                                            const VkPipelineCreationFeedbackEXT* from,
+                                            VkPipelineCreationFeedbackEXT* to);
 
 void deepcopy_VkPipelineCreationFeedbackCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineCreationFeedbackCreateInfoEXT* from,
+    Allocator* alloc, VkStructureType rootType, const VkPipelineCreationFeedbackCreateInfoEXT* from,
     VkPipelineCreationFeedbackCreateInfoEXT* to);
 
 #endif
@@ -3920,196 +2908,156 @@
 #endif
 #ifdef VK_NV_compute_shader_derivatives
 void deepcopy_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* from,
     VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* to);
 
 #endif
 #ifdef VK_NV_mesh_shader
-void deepcopy_VkPhysicalDeviceMeshShaderFeaturesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceMeshShaderFeaturesNV* from,
-    VkPhysicalDeviceMeshShaderFeaturesNV* to);
+void deepcopy_VkPhysicalDeviceMeshShaderFeaturesNV(Allocator* alloc, VkStructureType rootType,
+                                                   const VkPhysicalDeviceMeshShaderFeaturesNV* from,
+                                                   VkPhysicalDeviceMeshShaderFeaturesNV* to);
 
 void deepcopy_VkPhysicalDeviceMeshShaderPropertiesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceMeshShaderPropertiesNV* from,
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDeviceMeshShaderPropertiesNV* from,
     VkPhysicalDeviceMeshShaderPropertiesNV* to);
 
-void deepcopy_VkDrawMeshTasksIndirectCommandNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDrawMeshTasksIndirectCommandNV* from,
-    VkDrawMeshTasksIndirectCommandNV* to);
+void deepcopy_VkDrawMeshTasksIndirectCommandNV(Allocator* alloc, VkStructureType rootType,
+                                               const VkDrawMeshTasksIndirectCommandNV* from,
+                                               VkDrawMeshTasksIndirectCommandNV* to);
 
 #endif
 #ifdef VK_NV_fragment_shader_barycentric
 void deepcopy_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* from,
     VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* to);
 
 #endif
 #ifdef VK_NV_shader_image_footprint
 void deepcopy_VkPhysicalDeviceShaderImageFootprintFeaturesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShaderImageFootprintFeaturesNV* from,
     VkPhysicalDeviceShaderImageFootprintFeaturesNV* to);
 
 #endif
 #ifdef VK_NV_scissor_exclusive
 void deepcopy_VkPipelineViewportExclusiveScissorStateCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineViewportExclusiveScissorStateCreateInfoNV* from,
     VkPipelineViewportExclusiveScissorStateCreateInfoNV* to);
 
 void deepcopy_VkPhysicalDeviceExclusiveScissorFeaturesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceExclusiveScissorFeaturesNV* from,
     VkPhysicalDeviceExclusiveScissorFeaturesNV* to);
 
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
-void deepcopy_VkQueueFamilyCheckpointPropertiesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkQueueFamilyCheckpointPropertiesNV* from,
-    VkQueueFamilyCheckpointPropertiesNV* to);
+void deepcopy_VkQueueFamilyCheckpointPropertiesNV(Allocator* alloc, VkStructureType rootType,
+                                                  const VkQueueFamilyCheckpointPropertiesNV* from,
+                                                  VkQueueFamilyCheckpointPropertiesNV* to);
 
-void deepcopy_VkCheckpointDataNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCheckpointDataNV* from,
-    VkCheckpointDataNV* to);
+void deepcopy_VkCheckpointDataNV(Allocator* alloc, VkStructureType rootType,
+                                 const VkCheckpointDataNV* from, VkCheckpointDataNV* to);
 
 #endif
 #ifdef VK_INTEL_shader_integer_functions2
 void deepcopy_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* from,
     VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* to);
 
 #endif
 #ifdef VK_INTEL_performance_query
-void deepcopy_VkPerformanceValueDataINTEL(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPerformanceValueDataINTEL* from,
-    VkPerformanceValueDataINTEL* to);
+void deepcopy_VkPerformanceValueDataINTEL(Allocator* alloc, VkStructureType rootType,
+                                          const VkPerformanceValueDataINTEL* from,
+                                          VkPerformanceValueDataINTEL* to);
 
-void deepcopy_VkPerformanceValueINTEL(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPerformanceValueINTEL* from,
-    VkPerformanceValueINTEL* to);
+void deepcopy_VkPerformanceValueINTEL(Allocator* alloc, VkStructureType rootType,
+                                      const VkPerformanceValueINTEL* from,
+                                      VkPerformanceValueINTEL* to);
 
-void deepcopy_VkInitializePerformanceApiInfoINTEL(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkInitializePerformanceApiInfoINTEL* from,
-    VkInitializePerformanceApiInfoINTEL* to);
+void deepcopy_VkInitializePerformanceApiInfoINTEL(Allocator* alloc, VkStructureType rootType,
+                                                  const VkInitializePerformanceApiInfoINTEL* from,
+                                                  VkInitializePerformanceApiInfoINTEL* to);
 
 void deepcopy_VkQueryPoolPerformanceQueryCreateInfoINTEL(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkQueryPoolPerformanceQueryCreateInfoINTEL* from,
     VkQueryPoolPerformanceQueryCreateInfoINTEL* to);
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkQueryPoolPerformanceQueryCreateInfoINTEL, deepcopy_VkQueryPoolCreateInfoINTEL)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkQueryPoolPerformanceQueryCreateInfoINTEL,
+                      deepcopy_VkQueryPoolCreateInfoINTEL)
 
-void deepcopy_VkPerformanceMarkerInfoINTEL(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPerformanceMarkerInfoINTEL* from,
-    VkPerformanceMarkerInfoINTEL* to);
+void deepcopy_VkPerformanceMarkerInfoINTEL(Allocator* alloc, VkStructureType rootType,
+                                           const VkPerformanceMarkerInfoINTEL* from,
+                                           VkPerformanceMarkerInfoINTEL* to);
 
-void deepcopy_VkPerformanceStreamMarkerInfoINTEL(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPerformanceStreamMarkerInfoINTEL* from,
-    VkPerformanceStreamMarkerInfoINTEL* to);
+void deepcopy_VkPerformanceStreamMarkerInfoINTEL(Allocator* alloc, VkStructureType rootType,
+                                                 const VkPerformanceStreamMarkerInfoINTEL* from,
+                                                 VkPerformanceStreamMarkerInfoINTEL* to);
 
-void deepcopy_VkPerformanceOverrideInfoINTEL(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPerformanceOverrideInfoINTEL* from,
-    VkPerformanceOverrideInfoINTEL* to);
+void deepcopy_VkPerformanceOverrideInfoINTEL(Allocator* alloc, VkStructureType rootType,
+                                             const VkPerformanceOverrideInfoINTEL* from,
+                                             VkPerformanceOverrideInfoINTEL* to);
 
 void deepcopy_VkPerformanceConfigurationAcquireInfoINTEL(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPerformanceConfigurationAcquireInfoINTEL* from,
     VkPerformanceConfigurationAcquireInfoINTEL* to);
 
 #endif
 #ifdef VK_EXT_pci_bus_info
 void deepcopy_VkPhysicalDevicePCIBusInfoPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDevicePCIBusInfoPropertiesEXT* from,
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDevicePCIBusInfoPropertiesEXT* from,
     VkPhysicalDevicePCIBusInfoPropertiesEXT* to);
 
 #endif
 #ifdef VK_AMD_display_native_hdr
 void deepcopy_VkDisplayNativeHdrSurfaceCapabilitiesAMD(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkDisplayNativeHdrSurfaceCapabilitiesAMD* from,
     VkDisplayNativeHdrSurfaceCapabilitiesAMD* to);
 
 void deepcopy_VkSwapchainDisplayNativeHdrCreateInfoAMD(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkSwapchainDisplayNativeHdrCreateInfoAMD* from,
     VkSwapchainDisplayNativeHdrCreateInfoAMD* to);
 
 #endif
 #ifdef VK_FUCHSIA_imagepipe_surface
-void deepcopy_VkImagePipeSurfaceCreateInfoFUCHSIA(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImagePipeSurfaceCreateInfoFUCHSIA* from,
-    VkImagePipeSurfaceCreateInfoFUCHSIA* to);
+void deepcopy_VkImagePipeSurfaceCreateInfoFUCHSIA(Allocator* alloc, VkStructureType rootType,
+                                                  const VkImagePipeSurfaceCreateInfoFUCHSIA* from,
+                                                  VkImagePipeSurfaceCreateInfoFUCHSIA* to);
 
 #endif
 #ifdef VK_EXT_metal_surface
-void deepcopy_VkMetalSurfaceCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMetalSurfaceCreateInfoEXT* from,
-    VkMetalSurfaceCreateInfoEXT* to);
+void deepcopy_VkMetalSurfaceCreateInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                          const VkMetalSurfaceCreateInfoEXT* from,
+                                          VkMetalSurfaceCreateInfoEXT* to);
 
 #endif
 #ifdef VK_EXT_fragment_density_map
 void deepcopy_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceFragmentDensityMapFeaturesEXT* from,
     VkPhysicalDeviceFragmentDensityMapFeaturesEXT* to);
 
 void deepcopy_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceFragmentDensityMapPropertiesEXT* from,
     VkPhysicalDeviceFragmentDensityMapPropertiesEXT* to);
 
 void deepcopy_VkRenderPassFragmentDensityMapCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkRenderPassFragmentDensityMapCreateInfoEXT* from,
     VkRenderPassFragmentDensityMapCreateInfoEXT* to);
 
 #endif
 #ifdef VK_EXT_scalar_block_layout
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceScalarBlockLayoutFeatures, deepcopy_VkPhysicalDeviceScalarBlockLayoutFeaturesEXT)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceScalarBlockLayoutFeatures,
+                      deepcopy_VkPhysicalDeviceScalarBlockLayoutFeaturesEXT)
 
 #endif
 #ifdef VK_GOOGLE_hlsl_functionality1
@@ -4118,423 +3066,347 @@
 #endif
 #ifdef VK_EXT_subgroup_size_control
 void deepcopy_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* from,
     VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* to);
 
 void deepcopy_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* from,
     VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* to);
 
 void deepcopy_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* from,
     VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* to);
 
 #endif
 #ifdef VK_AMD_shader_core_properties2
 void deepcopy_VkPhysicalDeviceShaderCoreProperties2AMD(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShaderCoreProperties2AMD* from,
     VkPhysicalDeviceShaderCoreProperties2AMD* to);
 
 #endif
 #ifdef VK_AMD_device_coherent_memory
 void deepcopy_VkPhysicalDeviceCoherentMemoryFeaturesAMD(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceCoherentMemoryFeaturesAMD* from,
     VkPhysicalDeviceCoherentMemoryFeaturesAMD* to);
 
 #endif
 #ifdef VK_EXT_shader_image_atomic_int64
 void deepcopy_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* from,
     VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* to);
 
 #endif
 #ifdef VK_EXT_memory_budget
 void deepcopy_VkPhysicalDeviceMemoryBudgetPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceMemoryBudgetPropertiesEXT* from,
     VkPhysicalDeviceMemoryBudgetPropertiesEXT* to);
 
 #endif
 #ifdef VK_EXT_memory_priority
 void deepcopy_VkPhysicalDeviceMemoryPriorityFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceMemoryPriorityFeaturesEXT* from,
     VkPhysicalDeviceMemoryPriorityFeaturesEXT* to);
 
-void deepcopy_VkMemoryPriorityAllocateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryPriorityAllocateInfoEXT* from,
-    VkMemoryPriorityAllocateInfoEXT* to);
+void deepcopy_VkMemoryPriorityAllocateInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                              const VkMemoryPriorityAllocateInfoEXT* from,
+                                              VkMemoryPriorityAllocateInfoEXT* to);
 
 #endif
 #ifdef VK_NV_dedicated_allocation_image_aliasing
 void deepcopy_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* from,
     VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* to);
 
 #endif
 #ifdef VK_EXT_buffer_device_address
 void deepcopy_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* from,
     VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* to);
 
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT, deepcopy_VkPhysicalDeviceBufferAddressFeaturesEXT)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT,
+                      deepcopy_VkPhysicalDeviceBufferAddressFeaturesEXT)
 
 DEFINE_ALIAS_FUNCTION(deepcopy_VkBufferDeviceAddressInfo, deepcopy_VkBufferDeviceAddressInfoEXT)
 
-void deepcopy_VkBufferDeviceAddressCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBufferDeviceAddressCreateInfoEXT* from,
-    VkBufferDeviceAddressCreateInfoEXT* to);
+void deepcopy_VkBufferDeviceAddressCreateInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                                 const VkBufferDeviceAddressCreateInfoEXT* from,
+                                                 VkBufferDeviceAddressCreateInfoEXT* to);
 
 #endif
 #ifdef VK_EXT_tooling_info
-void deepcopy_VkPhysicalDeviceToolPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceToolPropertiesEXT* from,
-    VkPhysicalDeviceToolPropertiesEXT* to);
+void deepcopy_VkPhysicalDeviceToolPropertiesEXT(Allocator* alloc, VkStructureType rootType,
+                                                const VkPhysicalDeviceToolPropertiesEXT* from,
+                                                VkPhysicalDeviceToolPropertiesEXT* to);
 
 #endif
 #ifdef VK_EXT_separate_stencil_usage
-DEFINE_ALIAS_FUNCTION(deepcopy_VkImageStencilUsageCreateInfo, deepcopy_VkImageStencilUsageCreateInfoEXT)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkImageStencilUsageCreateInfo,
+                      deepcopy_VkImageStencilUsageCreateInfoEXT)
 
 #endif
 #ifdef VK_EXT_validation_features
-void deepcopy_VkValidationFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkValidationFeaturesEXT* from,
-    VkValidationFeaturesEXT* to);
+void deepcopy_VkValidationFeaturesEXT(Allocator* alloc, VkStructureType rootType,
+                                      const VkValidationFeaturesEXT* from,
+                                      VkValidationFeaturesEXT* to);
 
 #endif
 #ifdef VK_NV_cooperative_matrix
-void deepcopy_VkCooperativeMatrixPropertiesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCooperativeMatrixPropertiesNV* from,
-    VkCooperativeMatrixPropertiesNV* to);
+void deepcopy_VkCooperativeMatrixPropertiesNV(Allocator* alloc, VkStructureType rootType,
+                                              const VkCooperativeMatrixPropertiesNV* from,
+                                              VkCooperativeMatrixPropertiesNV* to);
 
 void deepcopy_VkPhysicalDeviceCooperativeMatrixFeaturesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceCooperativeMatrixFeaturesNV* from,
     VkPhysicalDeviceCooperativeMatrixFeaturesNV* to);
 
 void deepcopy_VkPhysicalDeviceCooperativeMatrixPropertiesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceCooperativeMatrixPropertiesNV* from,
     VkPhysicalDeviceCooperativeMatrixPropertiesNV* to);
 
 #endif
 #ifdef VK_NV_coverage_reduction_mode
 void deepcopy_VkPhysicalDeviceCoverageReductionModeFeaturesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceCoverageReductionModeFeaturesNV* from,
     VkPhysicalDeviceCoverageReductionModeFeaturesNV* to);
 
 void deepcopy_VkPipelineCoverageReductionStateCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineCoverageReductionStateCreateInfoNV* from,
     VkPipelineCoverageReductionStateCreateInfoNV* to);
 
 void deepcopy_VkFramebufferMixedSamplesCombinationNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkFramebufferMixedSamplesCombinationNV* from,
+    Allocator* alloc, VkStructureType rootType, const VkFramebufferMixedSamplesCombinationNV* from,
     VkFramebufferMixedSamplesCombinationNV* to);
 
 #endif
 #ifdef VK_EXT_fragment_shader_interlock
 void deepcopy_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* from,
     VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* to);
 
 #endif
 #ifdef VK_EXT_ycbcr_image_arrays
 void deepcopy_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* from,
     VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* to);
 
 #endif
 #ifdef VK_EXT_provoking_vertex
 void deepcopy_VkPhysicalDeviceProvokingVertexFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceProvokingVertexFeaturesEXT* from,
     VkPhysicalDeviceProvokingVertexFeaturesEXT* to);
 
 void deepcopy_VkPhysicalDeviceProvokingVertexPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceProvokingVertexPropertiesEXT* from,
     VkPhysicalDeviceProvokingVertexPropertiesEXT* to);
 
 void deepcopy_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineRasterizationProvokingVertexStateCreateInfoEXT* from,
     VkPipelineRasterizationProvokingVertexStateCreateInfoEXT* to);
 
 #endif
 #ifdef VK_EXT_full_screen_exclusive
-void deepcopy_VkSurfaceFullScreenExclusiveInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSurfaceFullScreenExclusiveInfoEXT* from,
-    VkSurfaceFullScreenExclusiveInfoEXT* to);
+void deepcopy_VkSurfaceFullScreenExclusiveInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                                  const VkSurfaceFullScreenExclusiveInfoEXT* from,
+                                                  VkSurfaceFullScreenExclusiveInfoEXT* to);
 
 void deepcopy_VkSurfaceCapabilitiesFullScreenExclusiveEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkSurfaceCapabilitiesFullScreenExclusiveEXT* from,
     VkSurfaceCapabilitiesFullScreenExclusiveEXT* to);
 
 void deepcopy_VkSurfaceFullScreenExclusiveWin32InfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkSurfaceFullScreenExclusiveWin32InfoEXT* from,
     VkSurfaceFullScreenExclusiveWin32InfoEXT* to);
 
 #endif
 #ifdef VK_EXT_headless_surface
-void deepcopy_VkHeadlessSurfaceCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkHeadlessSurfaceCreateInfoEXT* from,
-    VkHeadlessSurfaceCreateInfoEXT* to);
+void deepcopy_VkHeadlessSurfaceCreateInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                             const VkHeadlessSurfaceCreateInfoEXT* from,
+                                             VkHeadlessSurfaceCreateInfoEXT* to);
 
 #endif
 #ifdef VK_EXT_line_rasterization
 void deepcopy_VkPhysicalDeviceLineRasterizationFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceLineRasterizationFeaturesEXT* from,
     VkPhysicalDeviceLineRasterizationFeaturesEXT* to);
 
 void deepcopy_VkPhysicalDeviceLineRasterizationPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceLineRasterizationPropertiesEXT* from,
     VkPhysicalDeviceLineRasterizationPropertiesEXT* to);
 
 void deepcopy_VkPipelineRasterizationLineStateCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineRasterizationLineStateCreateInfoEXT* from,
     VkPipelineRasterizationLineStateCreateInfoEXT* to);
 
 #endif
 #ifdef VK_EXT_shader_atomic_float
 void deepcopy_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* from,
     VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* to);
 
 #endif
 #ifdef VK_EXT_host_query_reset
-DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceHostQueryResetFeatures, deepcopy_VkPhysicalDeviceHostQueryResetFeaturesEXT)
+DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceHostQueryResetFeatures,
+                      deepcopy_VkPhysicalDeviceHostQueryResetFeaturesEXT)
 
 #endif
 #ifdef VK_EXT_index_type_uint8
 void deepcopy_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceIndexTypeUint8FeaturesEXT* from,
     VkPhysicalDeviceIndexTypeUint8FeaturesEXT* to);
 
 #endif
 #ifdef VK_EXT_extended_dynamic_state
 void deepcopy_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* from,
     VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* to);
 
 #endif
 #ifdef VK_EXT_shader_atomic_float2
 void deepcopy_VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT* from,
     VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT* to);
 
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
 void deepcopy_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* from,
     VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* to);
 
 #endif
 #ifdef VK_NV_device_generated_commands
 void deepcopy_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* from,
     VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* to);
 
 void deepcopy_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* from,
     VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* to);
 
-void deepcopy_VkGraphicsShaderGroupCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkGraphicsShaderGroupCreateInfoNV* from,
-    VkGraphicsShaderGroupCreateInfoNV* to);
+void deepcopy_VkGraphicsShaderGroupCreateInfoNV(Allocator* alloc, VkStructureType rootType,
+                                                const VkGraphicsShaderGroupCreateInfoNV* from,
+                                                VkGraphicsShaderGroupCreateInfoNV* to);
 
 void deepcopy_VkGraphicsPipelineShaderGroupsCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkGraphicsPipelineShaderGroupsCreateInfoNV* from,
     VkGraphicsPipelineShaderGroupsCreateInfoNV* to);
 
-void deepcopy_VkBindShaderGroupIndirectCommandNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBindShaderGroupIndirectCommandNV* from,
-    VkBindShaderGroupIndirectCommandNV* to);
+void deepcopy_VkBindShaderGroupIndirectCommandNV(Allocator* alloc, VkStructureType rootType,
+                                                 const VkBindShaderGroupIndirectCommandNV* from,
+                                                 VkBindShaderGroupIndirectCommandNV* to);
 
-void deepcopy_VkBindIndexBufferIndirectCommandNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBindIndexBufferIndirectCommandNV* from,
-    VkBindIndexBufferIndirectCommandNV* to);
+void deepcopy_VkBindIndexBufferIndirectCommandNV(Allocator* alloc, VkStructureType rootType,
+                                                 const VkBindIndexBufferIndirectCommandNV* from,
+                                                 VkBindIndexBufferIndirectCommandNV* to);
 
-void deepcopy_VkBindVertexBufferIndirectCommandNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBindVertexBufferIndirectCommandNV* from,
-    VkBindVertexBufferIndirectCommandNV* to);
+void deepcopy_VkBindVertexBufferIndirectCommandNV(Allocator* alloc, VkStructureType rootType,
+                                                  const VkBindVertexBufferIndirectCommandNV* from,
+                                                  VkBindVertexBufferIndirectCommandNV* to);
 
-void deepcopy_VkSetStateFlagsIndirectCommandNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSetStateFlagsIndirectCommandNV* from,
-    VkSetStateFlagsIndirectCommandNV* to);
+void deepcopy_VkSetStateFlagsIndirectCommandNV(Allocator* alloc, VkStructureType rootType,
+                                               const VkSetStateFlagsIndirectCommandNV* from,
+                                               VkSetStateFlagsIndirectCommandNV* to);
 
-void deepcopy_VkIndirectCommandsStreamNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkIndirectCommandsStreamNV* from,
-    VkIndirectCommandsStreamNV* to);
+void deepcopy_VkIndirectCommandsStreamNV(Allocator* alloc, VkStructureType rootType,
+                                         const VkIndirectCommandsStreamNV* from,
+                                         VkIndirectCommandsStreamNV* to);
 
-void deepcopy_VkIndirectCommandsLayoutTokenNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkIndirectCommandsLayoutTokenNV* from,
-    VkIndirectCommandsLayoutTokenNV* to);
+void deepcopy_VkIndirectCommandsLayoutTokenNV(Allocator* alloc, VkStructureType rootType,
+                                              const VkIndirectCommandsLayoutTokenNV* from,
+                                              VkIndirectCommandsLayoutTokenNV* to);
 
-void deepcopy_VkIndirectCommandsLayoutCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkIndirectCommandsLayoutCreateInfoNV* from,
-    VkIndirectCommandsLayoutCreateInfoNV* to);
+void deepcopy_VkIndirectCommandsLayoutCreateInfoNV(Allocator* alloc, VkStructureType rootType,
+                                                   const VkIndirectCommandsLayoutCreateInfoNV* from,
+                                                   VkIndirectCommandsLayoutCreateInfoNV* to);
 
-void deepcopy_VkGeneratedCommandsInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkGeneratedCommandsInfoNV* from,
-    VkGeneratedCommandsInfoNV* to);
+void deepcopy_VkGeneratedCommandsInfoNV(Allocator* alloc, VkStructureType rootType,
+                                        const VkGeneratedCommandsInfoNV* from,
+                                        VkGeneratedCommandsInfoNV* to);
 
 void deepcopy_VkGeneratedCommandsMemoryRequirementsInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkGeneratedCommandsMemoryRequirementsInfoNV* from,
     VkGeneratedCommandsMemoryRequirementsInfoNV* to);
 
 #endif
 #ifdef VK_NV_inherited_viewport_scissor
 void deepcopy_VkPhysicalDeviceInheritedViewportScissorFeaturesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceInheritedViewportScissorFeaturesNV* from,
     VkPhysicalDeviceInheritedViewportScissorFeaturesNV* to);
 
 void deepcopy_VkCommandBufferInheritanceViewportScissorInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkCommandBufferInheritanceViewportScissorInfoNV* from,
     VkCommandBufferInheritanceViewportScissorInfoNV* to);
 
 #endif
 #ifdef VK_EXT_texel_buffer_alignment
 void deepcopy_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* from,
     VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* to);
 
 void deepcopy_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* from,
     VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* to);
 
 #endif
 #ifdef VK_QCOM_render_pass_transform
-void deepcopy_VkRenderPassTransformBeginInfoQCOM(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkRenderPassTransformBeginInfoQCOM* from,
-    VkRenderPassTransformBeginInfoQCOM* to);
+void deepcopy_VkRenderPassTransformBeginInfoQCOM(Allocator* alloc, VkStructureType rootType,
+                                                 const VkRenderPassTransformBeginInfoQCOM* from,
+                                                 VkRenderPassTransformBeginInfoQCOM* to);
 
 void deepcopy_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkCommandBufferInheritanceRenderPassTransformInfoQCOM* from,
     VkCommandBufferInheritanceRenderPassTransformInfoQCOM* to);
 
 #endif
 #ifdef VK_EXT_device_memory_report
 void deepcopy_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* from,
     VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* to);
 
-void deepcopy_VkDeviceMemoryReportCallbackDataEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDeviceMemoryReportCallbackDataEXT* from,
-    VkDeviceMemoryReportCallbackDataEXT* to);
+void deepcopy_VkDeviceMemoryReportCallbackDataEXT(Allocator* alloc, VkStructureType rootType,
+                                                  const VkDeviceMemoryReportCallbackDataEXT* from,
+                                                  VkDeviceMemoryReportCallbackDataEXT* to);
 
 void deepcopy_VkDeviceDeviceMemoryReportCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDeviceDeviceMemoryReportCreateInfoEXT* from,
+    Allocator* alloc, VkStructureType rootType, const VkDeviceDeviceMemoryReportCreateInfoEXT* from,
     VkDeviceDeviceMemoryReportCreateInfoEXT* to);
 
 #endif
@@ -4542,34 +3414,27 @@
 #endif
 #ifdef VK_EXT_robustness2
 void deepcopy_VkPhysicalDeviceRobustness2FeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceRobustness2FeaturesEXT* from,
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDeviceRobustness2FeaturesEXT* from,
     VkPhysicalDeviceRobustness2FeaturesEXT* to);
 
 void deepcopy_VkPhysicalDeviceRobustness2PropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceRobustness2PropertiesEXT* from,
     VkPhysicalDeviceRobustness2PropertiesEXT* to);
 
 #endif
 #ifdef VK_EXT_custom_border_color
 void deepcopy_VkSamplerCustomBorderColorCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSamplerCustomBorderColorCreateInfoEXT* from,
+    Allocator* alloc, VkStructureType rootType, const VkSamplerCustomBorderColorCreateInfoEXT* from,
     VkSamplerCustomBorderColorCreateInfoEXT* to);
 
 void deepcopy_VkPhysicalDeviceCustomBorderColorPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceCustomBorderColorPropertiesEXT* from,
     VkPhysicalDeviceCustomBorderColorPropertiesEXT* to);
 
 void deepcopy_VkPhysicalDeviceCustomBorderColorFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceCustomBorderColorFeaturesEXT* from,
     VkPhysicalDeviceCustomBorderColorFeaturesEXT* to);
 
@@ -4578,43 +3443,33 @@
 #endif
 #ifdef VK_EXT_private_data
 void deepcopy_VkPhysicalDevicePrivateDataFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDevicePrivateDataFeaturesEXT* from,
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDevicePrivateDataFeaturesEXT* from,
     VkPhysicalDevicePrivateDataFeaturesEXT* to);
 
-void deepcopy_VkDevicePrivateDataCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDevicePrivateDataCreateInfoEXT* from,
-    VkDevicePrivateDataCreateInfoEXT* to);
+void deepcopy_VkDevicePrivateDataCreateInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                               const VkDevicePrivateDataCreateInfoEXT* from,
+                                               VkDevicePrivateDataCreateInfoEXT* to);
 
-void deepcopy_VkPrivateDataSlotCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPrivateDataSlotCreateInfoEXT* from,
-    VkPrivateDataSlotCreateInfoEXT* to);
+void deepcopy_VkPrivateDataSlotCreateInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                             const VkPrivateDataSlotCreateInfoEXT* from,
+                                             VkPrivateDataSlotCreateInfoEXT* to);
 
 #endif
 #ifdef VK_EXT_pipeline_creation_cache_control
 void deepcopy_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* from,
     VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* to);
 
 #endif
 #ifdef VK_NV_device_diagnostics_config
 void deepcopy_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceDiagnosticsConfigFeaturesNV* from,
     VkPhysicalDeviceDiagnosticsConfigFeaturesNV* to);
 
 void deepcopy_VkDeviceDiagnosticsConfigCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDeviceDiagnosticsConfigCreateInfoNV* from,
+    Allocator* alloc, VkStructureType rootType, const VkDeviceDiagnosticsConfigCreateInfoNV* from,
     VkDeviceDiagnosticsConfigCreateInfoNV* to);
 
 #endif
@@ -4622,130 +3477,104 @@
 #endif
 #ifdef VK_NV_fragment_shading_rate_enums
 void deepcopy_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* from,
     VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* to);
 
 void deepcopy_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* from,
     VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* to);
 
 void deepcopy_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPipelineFragmentShadingRateEnumStateCreateInfoNV* from,
     VkPipelineFragmentShadingRateEnumStateCreateInfoNV* to);
 
 #endif
 #ifdef VK_NV_ray_tracing_motion_blur
-void deepcopy_VkDeviceOrHostAddressConstKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDeviceOrHostAddressConstKHR* from,
-    VkDeviceOrHostAddressConstKHR* to);
+void deepcopy_VkDeviceOrHostAddressConstKHR(Allocator* alloc, VkStructureType rootType,
+                                            const VkDeviceOrHostAddressConstKHR* from,
+                                            VkDeviceOrHostAddressConstKHR* to);
 
 void deepcopy_VkAccelerationStructureGeometryMotionTrianglesDataNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkAccelerationStructureGeometryMotionTrianglesDataNV* from,
     VkAccelerationStructureGeometryMotionTrianglesDataNV* to);
 
-void deepcopy_VkAccelerationStructureMotionInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAccelerationStructureMotionInfoNV* from,
-    VkAccelerationStructureMotionInfoNV* to);
+void deepcopy_VkAccelerationStructureMotionInfoNV(Allocator* alloc, VkStructureType rootType,
+                                                  const VkAccelerationStructureMotionInfoNV* from,
+                                                  VkAccelerationStructureMotionInfoNV* to);
 
 void deepcopy_VkAccelerationStructureMatrixMotionInstanceNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkAccelerationStructureMatrixMotionInstanceNV* from,
     VkAccelerationStructureMatrixMotionInstanceNV* to);
 
-void deepcopy_VkSRTDataNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSRTDataNV* from,
-    VkSRTDataNV* to);
+void deepcopy_VkSRTDataNV(Allocator* alloc, VkStructureType rootType, const VkSRTDataNV* from,
+                          VkSRTDataNV* to);
 
 void deepcopy_VkAccelerationStructureSRTMotionInstanceNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkAccelerationStructureSRTMotionInstanceNV* from,
     VkAccelerationStructureSRTMotionInstanceNV* to);
 
 void deepcopy_VkAccelerationStructureMotionInstanceDataNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkAccelerationStructureMotionInstanceDataNV* from,
     VkAccelerationStructureMotionInstanceDataNV* to);
 
 void deepcopy_VkAccelerationStructureMotionInstanceNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAccelerationStructureMotionInstanceNV* from,
+    Allocator* alloc, VkStructureType rootType, const VkAccelerationStructureMotionInstanceNV* from,
     VkAccelerationStructureMotionInstanceNV* to);
 
 void deepcopy_VkPhysicalDeviceRayTracingMotionBlurFeaturesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceRayTracingMotionBlurFeaturesNV* from,
     VkPhysicalDeviceRayTracingMotionBlurFeaturesNV* to);
 
 #endif
 #ifdef VK_EXT_ycbcr_2plane_444_formats
 void deepcopy_VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT* from,
     VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT* to);
 
 #endif
 #ifdef VK_EXT_fragment_density_map2
 void deepcopy_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* from,
     VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* to);
 
 void deepcopy_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* from,
     VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* to);
 
 #endif
 #ifdef VK_QCOM_rotated_copy_commands
-void deepcopy_VkCopyCommandTransformInfoQCOM(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCopyCommandTransformInfoQCOM* from,
-    VkCopyCommandTransformInfoQCOM* to);
+void deepcopy_VkCopyCommandTransformInfoQCOM(Allocator* alloc, VkStructureType rootType,
+                                             const VkCopyCommandTransformInfoQCOM* from,
+                                             VkCopyCommandTransformInfoQCOM* to);
 
 #endif
 #ifdef VK_EXT_image_robustness
 void deepcopy_VkPhysicalDeviceImageRobustnessFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceImageRobustnessFeaturesEXT* from,
     VkPhysicalDeviceImageRobustnessFeaturesEXT* to);
 
 #endif
 #ifdef VK_EXT_4444_formats
 void deepcopy_VkPhysicalDevice4444FormatsFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDevice4444FormatsFeaturesEXT* from,
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDevice4444FormatsFeaturesEXT* from,
     VkPhysicalDevice4444FormatsFeaturesEXT* to);
 
 #endif
 #ifdef VK_EXT_rgba10x6_formats
 void deepcopy_VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT* from,
     VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT* to);
 
@@ -4753,482 +3582,370 @@
 #ifdef VK_NV_acquire_winrt_display
 #endif
 #ifdef VK_EXT_directfb_surface
-void deepcopy_VkDirectFBSurfaceCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDirectFBSurfaceCreateInfoEXT* from,
-    VkDirectFBSurfaceCreateInfoEXT* to);
+void deepcopy_VkDirectFBSurfaceCreateInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                             const VkDirectFBSurfaceCreateInfoEXT* from,
+                                             VkDirectFBSurfaceCreateInfoEXT* to);
 
 #endif
 #ifdef VK_VALVE_mutable_descriptor_type
 void deepcopy_VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE* from,
     VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE* to);
 
-void deepcopy_VkMutableDescriptorTypeListVALVE(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMutableDescriptorTypeListVALVE* from,
-    VkMutableDescriptorTypeListVALVE* to);
+void deepcopy_VkMutableDescriptorTypeListVALVE(Allocator* alloc, VkStructureType rootType,
+                                               const VkMutableDescriptorTypeListVALVE* from,
+                                               VkMutableDescriptorTypeListVALVE* to);
 
 void deepcopy_VkMutableDescriptorTypeCreateInfoVALVE(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMutableDescriptorTypeCreateInfoVALVE* from,
+    Allocator* alloc, VkStructureType rootType, const VkMutableDescriptorTypeCreateInfoVALVE* from,
     VkMutableDescriptorTypeCreateInfoVALVE* to);
 
 #endif
 #ifdef VK_EXT_vertex_input_dynamic_state
 void deepcopy_VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT* from,
     VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT* to);
 
-void deepcopy_VkVertexInputBindingDescription2EXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVertexInputBindingDescription2EXT* from,
-    VkVertexInputBindingDescription2EXT* to);
+void deepcopy_VkVertexInputBindingDescription2EXT(Allocator* alloc, VkStructureType rootType,
+                                                  const VkVertexInputBindingDescription2EXT* from,
+                                                  VkVertexInputBindingDescription2EXT* to);
 
 void deepcopy_VkVertexInputAttributeDescription2EXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkVertexInputAttributeDescription2EXT* from,
+    Allocator* alloc, VkStructureType rootType, const VkVertexInputAttributeDescription2EXT* from,
     VkVertexInputAttributeDescription2EXT* to);
 
 #endif
 #ifdef VK_EXT_physical_device_drm
-void deepcopy_VkPhysicalDeviceDrmPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceDrmPropertiesEXT* from,
-    VkPhysicalDeviceDrmPropertiesEXT* to);
+void deepcopy_VkPhysicalDeviceDrmPropertiesEXT(Allocator* alloc, VkStructureType rootType,
+                                               const VkPhysicalDeviceDrmPropertiesEXT* from,
+                                               VkPhysicalDeviceDrmPropertiesEXT* to);
 
 #endif
 #ifdef VK_EXT_primitive_topology_list_restart
 void deepcopy_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT* from,
     VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT* to);
 
 #endif
 #ifdef VK_FUCHSIA_external_memory
 void deepcopy_VkImportMemoryZirconHandleInfoFUCHSIA(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImportMemoryZirconHandleInfoFUCHSIA* from,
+    Allocator* alloc, VkStructureType rootType, const VkImportMemoryZirconHandleInfoFUCHSIA* from,
     VkImportMemoryZirconHandleInfoFUCHSIA* to);
 
 void deepcopy_VkMemoryZirconHandlePropertiesFUCHSIA(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryZirconHandlePropertiesFUCHSIA* from,
+    Allocator* alloc, VkStructureType rootType, const VkMemoryZirconHandlePropertiesFUCHSIA* from,
     VkMemoryZirconHandlePropertiesFUCHSIA* to);
 
-void deepcopy_VkMemoryGetZirconHandleInfoFUCHSIA(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryGetZirconHandleInfoFUCHSIA* from,
-    VkMemoryGetZirconHandleInfoFUCHSIA* to);
+void deepcopy_VkMemoryGetZirconHandleInfoFUCHSIA(Allocator* alloc, VkStructureType rootType,
+                                                 const VkMemoryGetZirconHandleInfoFUCHSIA* from,
+                                                 VkMemoryGetZirconHandleInfoFUCHSIA* to);
 
 #endif
 #ifdef VK_FUCHSIA_external_semaphore
 void deepcopy_VkImportSemaphoreZirconHandleInfoFUCHSIA(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkImportSemaphoreZirconHandleInfoFUCHSIA* from,
     VkImportSemaphoreZirconHandleInfoFUCHSIA* to);
 
 void deepcopy_VkSemaphoreGetZirconHandleInfoFUCHSIA(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSemaphoreGetZirconHandleInfoFUCHSIA* from,
+    Allocator* alloc, VkStructureType rootType, const VkSemaphoreGetZirconHandleInfoFUCHSIA* from,
     VkSemaphoreGetZirconHandleInfoFUCHSIA* to);
 
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
-void deepcopy_VkBufferCollectionCreateInfoFUCHSIA(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBufferCollectionCreateInfoFUCHSIA* from,
-    VkBufferCollectionCreateInfoFUCHSIA* to);
+void deepcopy_VkBufferCollectionCreateInfoFUCHSIA(Allocator* alloc, VkStructureType rootType,
+                                                  const VkBufferCollectionCreateInfoFUCHSIA* from,
+                                                  VkBufferCollectionCreateInfoFUCHSIA* to);
 
 void deepcopy_VkImportMemoryBufferCollectionFUCHSIA(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImportMemoryBufferCollectionFUCHSIA* from,
+    Allocator* alloc, VkStructureType rootType, const VkImportMemoryBufferCollectionFUCHSIA* from,
     VkImportMemoryBufferCollectionFUCHSIA* to);
 
 void deepcopy_VkBufferCollectionImageCreateInfoFUCHSIA(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkBufferCollectionImageCreateInfoFUCHSIA* from,
     VkBufferCollectionImageCreateInfoFUCHSIA* to);
 
 void deepcopy_VkBufferCollectionConstraintsInfoFUCHSIA(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkBufferCollectionConstraintsInfoFUCHSIA* from,
     VkBufferCollectionConstraintsInfoFUCHSIA* to);
 
-void deepcopy_VkBufferConstraintsInfoFUCHSIA(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBufferConstraintsInfoFUCHSIA* from,
-    VkBufferConstraintsInfoFUCHSIA* to);
+void deepcopy_VkBufferConstraintsInfoFUCHSIA(Allocator* alloc, VkStructureType rootType,
+                                             const VkBufferConstraintsInfoFUCHSIA* from,
+                                             VkBufferConstraintsInfoFUCHSIA* to);
 
 void deepcopy_VkBufferCollectionBufferCreateInfoFUCHSIA(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkBufferCollectionBufferCreateInfoFUCHSIA* from,
     VkBufferCollectionBufferCreateInfoFUCHSIA* to);
 
-void deepcopy_VkSysmemColorSpaceFUCHSIA(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkSysmemColorSpaceFUCHSIA* from,
-    VkSysmemColorSpaceFUCHSIA* to);
+void deepcopy_VkSysmemColorSpaceFUCHSIA(Allocator* alloc, VkStructureType rootType,
+                                        const VkSysmemColorSpaceFUCHSIA* from,
+                                        VkSysmemColorSpaceFUCHSIA* to);
 
-void deepcopy_VkBufferCollectionPropertiesFUCHSIA(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkBufferCollectionPropertiesFUCHSIA* from,
-    VkBufferCollectionPropertiesFUCHSIA* to);
+void deepcopy_VkBufferCollectionPropertiesFUCHSIA(Allocator* alloc, VkStructureType rootType,
+                                                  const VkBufferCollectionPropertiesFUCHSIA* from,
+                                                  VkBufferCollectionPropertiesFUCHSIA* to);
 
-void deepcopy_VkImageFormatConstraintsInfoFUCHSIA(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageFormatConstraintsInfoFUCHSIA* from,
-    VkImageFormatConstraintsInfoFUCHSIA* to);
+void deepcopy_VkImageFormatConstraintsInfoFUCHSIA(Allocator* alloc, VkStructureType rootType,
+                                                  const VkImageFormatConstraintsInfoFUCHSIA* from,
+                                                  VkImageFormatConstraintsInfoFUCHSIA* to);
 
-void deepcopy_VkImageConstraintsInfoFUCHSIA(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImageConstraintsInfoFUCHSIA* from,
-    VkImageConstraintsInfoFUCHSIA* to);
+void deepcopy_VkImageConstraintsInfoFUCHSIA(Allocator* alloc, VkStructureType rootType,
+                                            const VkImageConstraintsInfoFUCHSIA* from,
+                                            VkImageConstraintsInfoFUCHSIA* to);
 
 #endif
 #ifdef VK_HUAWEI_subpass_shading
 void deepcopy_VkSubpassShadingPipelineCreateInfoHUAWEI(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkSubpassShadingPipelineCreateInfoHUAWEI* from,
     VkSubpassShadingPipelineCreateInfoHUAWEI* to);
 
 void deepcopy_VkPhysicalDeviceSubpassShadingFeaturesHUAWEI(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceSubpassShadingFeaturesHUAWEI* from,
     VkPhysicalDeviceSubpassShadingFeaturesHUAWEI* to);
 
 void deepcopy_VkPhysicalDeviceSubpassShadingPropertiesHUAWEI(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceSubpassShadingPropertiesHUAWEI* from,
     VkPhysicalDeviceSubpassShadingPropertiesHUAWEI* to);
 
 #endif
 #ifdef VK_HUAWEI_invocation_mask
 void deepcopy_VkPhysicalDeviceInvocationMaskFeaturesHUAWEI(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceInvocationMaskFeaturesHUAWEI* from,
     VkPhysicalDeviceInvocationMaskFeaturesHUAWEI* to);
 
 #endif
 #ifdef VK_NV_external_memory_rdma
-void deepcopy_VkMemoryGetRemoteAddressInfoNV(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMemoryGetRemoteAddressInfoNV* from,
-    VkMemoryGetRemoteAddressInfoNV* to);
+void deepcopy_VkMemoryGetRemoteAddressInfoNV(Allocator* alloc, VkStructureType rootType,
+                                             const VkMemoryGetRemoteAddressInfoNV* from,
+                                             VkMemoryGetRemoteAddressInfoNV* to);
 
 void deepcopy_VkPhysicalDeviceExternalMemoryRDMAFeaturesNV(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceExternalMemoryRDMAFeaturesNV* from,
     VkPhysicalDeviceExternalMemoryRDMAFeaturesNV* to);
 
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
 void deepcopy_VkPhysicalDeviceExtendedDynamicState2FeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceExtendedDynamicState2FeaturesEXT* from,
     VkPhysicalDeviceExtendedDynamicState2FeaturesEXT* to);
 
 #endif
 #ifdef VK_QNX_screen_surface
-void deepcopy_VkScreenSurfaceCreateInfoQNX(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkScreenSurfaceCreateInfoQNX* from,
-    VkScreenSurfaceCreateInfoQNX* to);
+void deepcopy_VkScreenSurfaceCreateInfoQNX(Allocator* alloc, VkStructureType rootType,
+                                           const VkScreenSurfaceCreateInfoQNX* from,
+                                           VkScreenSurfaceCreateInfoQNX* to);
 
 #endif
 #ifdef VK_EXT_color_write_enable
 void deepcopy_VkPhysicalDeviceColorWriteEnableFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceColorWriteEnableFeaturesEXT* from,
     VkPhysicalDeviceColorWriteEnableFeaturesEXT* to);
 
-void deepcopy_VkPipelineColorWriteCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPipelineColorWriteCreateInfoEXT* from,
-    VkPipelineColorWriteCreateInfoEXT* to);
+void deepcopy_VkPipelineColorWriteCreateInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                                const VkPipelineColorWriteCreateInfoEXT* from,
+                                                VkPipelineColorWriteCreateInfoEXT* to);
 
 #endif
 #ifdef VK_GOOGLE_gfxstream
-void deepcopy_VkImportColorBufferGOOGLE(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImportColorBufferGOOGLE* from,
-    VkImportColorBufferGOOGLE* to);
+void deepcopy_VkImportColorBufferGOOGLE(Allocator* alloc, VkStructureType rootType,
+                                        const VkImportColorBufferGOOGLE* from,
+                                        VkImportColorBufferGOOGLE* to);
 
-void deepcopy_VkImportBufferGOOGLE(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImportBufferGOOGLE* from,
-    VkImportBufferGOOGLE* to);
+void deepcopy_VkImportBufferGOOGLE(Allocator* alloc, VkStructureType rootType,
+                                   const VkImportBufferGOOGLE* from, VkImportBufferGOOGLE* to);
 
-void deepcopy_VkImportPhysicalAddressGOOGLE(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkImportPhysicalAddressGOOGLE* from,
-    VkImportPhysicalAddressGOOGLE* to);
+void deepcopy_VkImportPhysicalAddressGOOGLE(Allocator* alloc, VkStructureType rootType,
+                                            const VkImportPhysicalAddressGOOGLE* from,
+                                            VkImportPhysicalAddressGOOGLE* to);
 
 #endif
 #ifdef VK_EXT_global_priority_query
 void deepcopy_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT* from,
     VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT* to);
 
 void deepcopy_VkQueueFamilyGlobalPriorityPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkQueueFamilyGlobalPriorityPropertiesEXT* from,
     VkQueueFamilyGlobalPriorityPropertiesEXT* to);
 
 #endif
 #ifdef VK_EXT_multi_draw
-void deepcopy_VkPhysicalDeviceMultiDrawFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceMultiDrawFeaturesEXT* from,
-    VkPhysicalDeviceMultiDrawFeaturesEXT* to);
+void deepcopy_VkPhysicalDeviceMultiDrawFeaturesEXT(Allocator* alloc, VkStructureType rootType,
+                                                   const VkPhysicalDeviceMultiDrawFeaturesEXT* from,
+                                                   VkPhysicalDeviceMultiDrawFeaturesEXT* to);
 
 void deepcopy_VkPhysicalDeviceMultiDrawPropertiesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceMultiDrawPropertiesEXT* from,
+    Allocator* alloc, VkStructureType rootType, const VkPhysicalDeviceMultiDrawPropertiesEXT* from,
     VkPhysicalDeviceMultiDrawPropertiesEXT* to);
 
-void deepcopy_VkMultiDrawInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMultiDrawInfoEXT* from,
-    VkMultiDrawInfoEXT* to);
+void deepcopy_VkMultiDrawInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                 const VkMultiDrawInfoEXT* from, VkMultiDrawInfoEXT* to);
 
-void deepcopy_VkMultiDrawIndexedInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkMultiDrawIndexedInfoEXT* from,
-    VkMultiDrawIndexedInfoEXT* to);
+void deepcopy_VkMultiDrawIndexedInfoEXT(Allocator* alloc, VkStructureType rootType,
+                                        const VkMultiDrawIndexedInfoEXT* from,
+                                        VkMultiDrawIndexedInfoEXT* to);
 
 #endif
 #ifdef VK_EXT_load_store_op_none
 #endif
 #ifdef VK_EXT_border_color_swizzle
 void deepcopy_VkPhysicalDeviceBorderColorSwizzleFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceBorderColorSwizzleFeaturesEXT* from,
     VkPhysicalDeviceBorderColorSwizzleFeaturesEXT* to);
 
 void deepcopy_VkSamplerBorderColorComponentMappingCreateInfoEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkSamplerBorderColorComponentMappingCreateInfoEXT* from,
     VkSamplerBorderColorComponentMappingCreateInfoEXT* to);
 
 #endif
 #ifdef VK_EXT_pageable_device_local_memory
 void deepcopy_VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT* from,
     VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT* to);
 
 #endif
 #ifdef VK_KHR_acceleration_structure
-void deepcopy_VkDeviceOrHostAddressKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkDeviceOrHostAddressKHR* from,
-    VkDeviceOrHostAddressKHR* to);
+void deepcopy_VkDeviceOrHostAddressKHR(Allocator* alloc, VkStructureType rootType,
+                                       const VkDeviceOrHostAddressKHR* from,
+                                       VkDeviceOrHostAddressKHR* to);
 
 void deepcopy_VkAccelerationStructureBuildRangeInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkAccelerationStructureBuildRangeInfoKHR* from,
     VkAccelerationStructureBuildRangeInfoKHR* to);
 
 void deepcopy_VkAccelerationStructureGeometryTrianglesDataKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkAccelerationStructureGeometryTrianglesDataKHR* from,
     VkAccelerationStructureGeometryTrianglesDataKHR* to);
 
 void deepcopy_VkAccelerationStructureGeometryAabbsDataKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkAccelerationStructureGeometryAabbsDataKHR* from,
     VkAccelerationStructureGeometryAabbsDataKHR* to);
 
 void deepcopy_VkAccelerationStructureGeometryInstancesDataKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkAccelerationStructureGeometryInstancesDataKHR* from,
     VkAccelerationStructureGeometryInstancesDataKHR* to);
 
 void deepcopy_VkAccelerationStructureGeometryDataKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAccelerationStructureGeometryDataKHR* from,
+    Allocator* alloc, VkStructureType rootType, const VkAccelerationStructureGeometryDataKHR* from,
     VkAccelerationStructureGeometryDataKHR* to);
 
-void deepcopy_VkAccelerationStructureGeometryKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAccelerationStructureGeometryKHR* from,
-    VkAccelerationStructureGeometryKHR* to);
+void deepcopy_VkAccelerationStructureGeometryKHR(Allocator* alloc, VkStructureType rootType,
+                                                 const VkAccelerationStructureGeometryKHR* from,
+                                                 VkAccelerationStructureGeometryKHR* to);
 
 void deepcopy_VkAccelerationStructureBuildGeometryInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkAccelerationStructureBuildGeometryInfoKHR* from,
     VkAccelerationStructureBuildGeometryInfoKHR* to);
 
-void deepcopy_VkAccelerationStructureCreateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAccelerationStructureCreateInfoKHR* from,
-    VkAccelerationStructureCreateInfoKHR* to);
+void deepcopy_VkAccelerationStructureCreateInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                                   const VkAccelerationStructureCreateInfoKHR* from,
+                                                   VkAccelerationStructureCreateInfoKHR* to);
 
 void deepcopy_VkWriteDescriptorSetAccelerationStructureKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkWriteDescriptorSetAccelerationStructureKHR* from,
     VkWriteDescriptorSetAccelerationStructureKHR* to);
 
 void deepcopy_VkPhysicalDeviceAccelerationStructureFeaturesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceAccelerationStructureFeaturesKHR* from,
     VkPhysicalDeviceAccelerationStructureFeaturesKHR* to);
 
 void deepcopy_VkPhysicalDeviceAccelerationStructurePropertiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceAccelerationStructurePropertiesKHR* from,
     VkPhysicalDeviceAccelerationStructurePropertiesKHR* to);
 
 void deepcopy_VkAccelerationStructureDeviceAddressInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkAccelerationStructureDeviceAddressInfoKHR* from,
     VkAccelerationStructureDeviceAddressInfoKHR* to);
 
 void deepcopy_VkAccelerationStructureVersionInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkAccelerationStructureVersionInfoKHR* from,
+    Allocator* alloc, VkStructureType rootType, const VkAccelerationStructureVersionInfoKHR* from,
     VkAccelerationStructureVersionInfoKHR* to);
 
 void deepcopy_VkCopyAccelerationStructureToMemoryInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkCopyAccelerationStructureToMemoryInfoKHR* from,
     VkCopyAccelerationStructureToMemoryInfoKHR* to);
 
 void deepcopy_VkCopyMemoryToAccelerationStructureInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkCopyMemoryToAccelerationStructureInfoKHR* from,
     VkCopyMemoryToAccelerationStructureInfoKHR* to);
 
-void deepcopy_VkCopyAccelerationStructureInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkCopyAccelerationStructureInfoKHR* from,
-    VkCopyAccelerationStructureInfoKHR* to);
+void deepcopy_VkCopyAccelerationStructureInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                                 const VkCopyAccelerationStructureInfoKHR* from,
+                                                 VkCopyAccelerationStructureInfoKHR* to);
 
 void deepcopy_VkAccelerationStructureBuildSizesInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkAccelerationStructureBuildSizesInfoKHR* from,
     VkAccelerationStructureBuildSizesInfoKHR* to);
 
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
-void deepcopy_VkRayTracingShaderGroupCreateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkRayTracingShaderGroupCreateInfoKHR* from,
-    VkRayTracingShaderGroupCreateInfoKHR* to);
+void deepcopy_VkRayTracingShaderGroupCreateInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                                   const VkRayTracingShaderGroupCreateInfoKHR* from,
+                                                   VkRayTracingShaderGroupCreateInfoKHR* to);
 
 void deepcopy_VkRayTracingPipelineInterfaceCreateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkRayTracingPipelineInterfaceCreateInfoKHR* from,
     VkRayTracingPipelineInterfaceCreateInfoKHR* to);
 
-void deepcopy_VkRayTracingPipelineCreateInfoKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkRayTracingPipelineCreateInfoKHR* from,
-    VkRayTracingPipelineCreateInfoKHR* to);
+void deepcopy_VkRayTracingPipelineCreateInfoKHR(Allocator* alloc, VkStructureType rootType,
+                                                const VkRayTracingPipelineCreateInfoKHR* from,
+                                                VkRayTracingPipelineCreateInfoKHR* to);
 
 void deepcopy_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceRayTracingPipelineFeaturesKHR* from,
     VkPhysicalDeviceRayTracingPipelineFeaturesKHR* to);
 
 void deepcopy_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
+    Allocator* alloc, VkStructureType rootType,
     const VkPhysicalDeviceRayTracingPipelinePropertiesKHR* from,
     VkPhysicalDeviceRayTracingPipelinePropertiesKHR* to);
 
-void deepcopy_VkStridedDeviceAddressRegionKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkStridedDeviceAddressRegionKHR* from,
-    VkStridedDeviceAddressRegionKHR* to);
+void deepcopy_VkStridedDeviceAddressRegionKHR(Allocator* alloc, VkStructureType rootType,
+                                              const VkStridedDeviceAddressRegionKHR* from,
+                                              VkStridedDeviceAddressRegionKHR* to);
 
-void deepcopy_VkTraceRaysIndirectCommandKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkTraceRaysIndirectCommandKHR* from,
-    VkTraceRaysIndirectCommandKHR* to);
+void deepcopy_VkTraceRaysIndirectCommandKHR(Allocator* alloc, VkStructureType rootType,
+                                            const VkTraceRaysIndirectCommandKHR* from,
+                                            VkTraceRaysIndirectCommandKHR* to);
 
 #endif
 #ifdef VK_KHR_ray_query
-void deepcopy_VkPhysicalDeviceRayQueryFeaturesKHR(
-    Allocator* alloc,
-    VkStructureType rootType,
-    const VkPhysicalDeviceRayQueryFeaturesKHR* from,
-    VkPhysicalDeviceRayQueryFeaturesKHR* to);
+void deepcopy_VkPhysicalDeviceRayQueryFeaturesKHR(Allocator* alloc, VkStructureType rootType,
+                                                  const VkPhysicalDeviceRayQueryFeaturesKHR* from,
+                                                  VkPhysicalDeviceRayQueryFeaturesKHR* to);
 
 #endif
 
-} // namespace goldfish_vk
+}  // namespace goldfish_vk
diff --git a/stream-servers/vulkan/cereal/common/goldfish_vk_dispatch.cpp b/stream-servers/vulkan/cereal/common/goldfish_vk_dispatch.cpp
index 4c14d4a..fa66dac 100644
--- a/stream-servers/vulkan/cereal/common/goldfish_vk_dispatch.cpp
+++ b/stream-servers/vulkan/cereal/common/goldfish_vk_dispatch.cpp
@@ -14,23 +14,27 @@
 // limitations under the License.
 
 // Autogenerated module goldfish_vk_dispatch
-// (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
+// (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal
+// -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
 // VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
 // VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+//
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o
+// $CEREAL_OUTPUT_DIR
+//
 
 #include "goldfish_vk_dispatch.h"
 
-
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 
-
 namespace goldfish_vk {
 
 #ifdef VK_VERSION_1_0
@@ -576,47 +580,78 @@
 #ifdef VK_KHR_ray_query
 #endif
 
-void init_vulkan_dispatch_from_system_loader(
-    DlOpenFunc dlOpenFunc,
-    DlSymFunc dlSymFunc,
-    VulkanDispatch* out)
-{
+void init_vulkan_dispatch_from_system_loader(DlOpenFunc dlOpenFunc, DlSymFunc dlSymFunc,
+                                             VulkanDispatch* out) {
     memset(out, 0x0, sizeof(VulkanDispatch));
     void* lib = dlOpenFunc();
     if (!lib) return;
 #ifdef VK_VERSION_1_0
     out->vkDestroyInstance = (PFN_vkDestroyInstance)dlSymFunc(lib, "vkDestroyInstance");
-    out->vkEnumeratePhysicalDevices = (PFN_vkEnumeratePhysicalDevices)dlSymFunc(lib, "vkEnumeratePhysicalDevices");
-    out->vkGetPhysicalDeviceFeatures = (PFN_vkGetPhysicalDeviceFeatures)dlSymFunc(lib, "vkGetPhysicalDeviceFeatures");
-    out->vkGetPhysicalDeviceFormatProperties = (PFN_vkGetPhysicalDeviceFormatProperties)dlSymFunc(lib, "vkGetPhysicalDeviceFormatProperties");
-    out->vkGetPhysicalDeviceImageFormatProperties = (PFN_vkGetPhysicalDeviceImageFormatProperties)dlSymFunc(lib, "vkGetPhysicalDeviceImageFormatProperties");
-    out->vkGetPhysicalDeviceProperties = (PFN_vkGetPhysicalDeviceProperties)dlSymFunc(lib, "vkGetPhysicalDeviceProperties");
-    out->vkGetPhysicalDeviceQueueFamilyProperties = (PFN_vkGetPhysicalDeviceQueueFamilyProperties)dlSymFunc(lib, "vkGetPhysicalDeviceQueueFamilyProperties");
-    out->vkGetPhysicalDeviceMemoryProperties = (PFN_vkGetPhysicalDeviceMemoryProperties)dlSymFunc(lib, "vkGetPhysicalDeviceMemoryProperties");
+    out->vkEnumeratePhysicalDevices =
+        (PFN_vkEnumeratePhysicalDevices)dlSymFunc(lib, "vkEnumeratePhysicalDevices");
+    out->vkGetPhysicalDeviceFeatures =
+        (PFN_vkGetPhysicalDeviceFeatures)dlSymFunc(lib, "vkGetPhysicalDeviceFeatures");
+    out->vkGetPhysicalDeviceFormatProperties = (PFN_vkGetPhysicalDeviceFormatProperties)dlSymFunc(
+        lib, "vkGetPhysicalDeviceFormatProperties");
+    out->vkGetPhysicalDeviceImageFormatProperties =
+        (PFN_vkGetPhysicalDeviceImageFormatProperties)dlSymFunc(
+            lib, "vkGetPhysicalDeviceImageFormatProperties");
+    out->vkGetPhysicalDeviceProperties =
+        (PFN_vkGetPhysicalDeviceProperties)dlSymFunc(lib, "vkGetPhysicalDeviceProperties");
+    out->vkGetPhysicalDeviceQueueFamilyProperties =
+        (PFN_vkGetPhysicalDeviceQueueFamilyProperties)dlSymFunc(
+            lib, "vkGetPhysicalDeviceQueueFamilyProperties");
+    out->vkGetPhysicalDeviceMemoryProperties = (PFN_vkGetPhysicalDeviceMemoryProperties)dlSymFunc(
+        lib, "vkGetPhysicalDeviceMemoryProperties");
     out->vkGetInstanceProcAddr = (PFN_vkGetInstanceProcAddr)dlSymFunc(lib, "vkGetInstanceProcAddr");
     out->vkCreateDevice = (PFN_vkCreateDevice)dlSymFunc(lib, "vkCreateDevice");
     out->vkDestroyDevice = (PFN_vkDestroyDevice)dlSymFunc(lib, "vkDestroyDevice");
-    out->vkEnumerateDeviceExtensionProperties = (PFN_vkEnumerateDeviceExtensionProperties)dlSymFunc(lib, "vkEnumerateDeviceExtensionProperties");
-    out->vkEnumerateDeviceLayerProperties = (PFN_vkEnumerateDeviceLayerProperties)dlSymFunc(lib, "vkEnumerateDeviceLayerProperties");
+    out->vkEnumerateDeviceExtensionProperties = (PFN_vkEnumerateDeviceExtensionProperties)dlSymFunc(
+        lib, "vkEnumerateDeviceExtensionProperties");
+    out->vkEnumerateDeviceLayerProperties =
+        (PFN_vkEnumerateDeviceLayerProperties)dlSymFunc(lib, "vkEnumerateDeviceLayerProperties");
     out->vkCreateInstance = (PFN_vkCreateInstance)dlSymFunc(lib, "vkCreateInstance");
-    out->vkEnumerateInstanceExtensionProperties = (PFN_vkEnumerateInstanceExtensionProperties)dlSymFunc(lib, "vkEnumerateInstanceExtensionProperties");
-    out->vkEnumerateInstanceLayerProperties = (PFN_vkEnumerateInstanceLayerProperties)dlSymFunc(lib, "vkEnumerateInstanceLayerProperties");
+    out->vkEnumerateInstanceExtensionProperties =
+        (PFN_vkEnumerateInstanceExtensionProperties)dlSymFunc(
+            lib, "vkEnumerateInstanceExtensionProperties");
+    out->vkEnumerateInstanceLayerProperties = (PFN_vkEnumerateInstanceLayerProperties)dlSymFunc(
+        lib, "vkEnumerateInstanceLayerProperties");
     out->vkGetDeviceProcAddr = (PFN_vkGetDeviceProcAddr)dlSymFunc(lib, "vkGetDeviceProcAddr");
-    out->vkGetPhysicalDeviceSparseImageFormatProperties = (PFN_vkGetPhysicalDeviceSparseImageFormatProperties)dlSymFunc(lib, "vkGetPhysicalDeviceSparseImageFormatProperties");
+    out->vkGetPhysicalDeviceSparseImageFormatProperties =
+        (PFN_vkGetPhysicalDeviceSparseImageFormatProperties)dlSymFunc(
+            lib, "vkGetPhysicalDeviceSparseImageFormatProperties");
 #endif
 #ifdef VK_VERSION_1_1
-    out->vkEnumerateInstanceVersion = (PFN_vkEnumerateInstanceVersion)dlSymFunc(lib, "vkEnumerateInstanceVersion");
-    out->vkEnumeratePhysicalDeviceGroups = (PFN_vkEnumeratePhysicalDeviceGroups)dlSymFunc(lib, "vkEnumeratePhysicalDeviceGroups");
-    out->vkGetPhysicalDeviceFeatures2 = (PFN_vkGetPhysicalDeviceFeatures2)dlSymFunc(lib, "vkGetPhysicalDeviceFeatures2");
-    out->vkGetPhysicalDeviceProperties2 = (PFN_vkGetPhysicalDeviceProperties2)dlSymFunc(lib, "vkGetPhysicalDeviceProperties2");
-    out->vkGetPhysicalDeviceFormatProperties2 = (PFN_vkGetPhysicalDeviceFormatProperties2)dlSymFunc(lib, "vkGetPhysicalDeviceFormatProperties2");
-    out->vkGetPhysicalDeviceImageFormatProperties2 = (PFN_vkGetPhysicalDeviceImageFormatProperties2)dlSymFunc(lib, "vkGetPhysicalDeviceImageFormatProperties2");
-    out->vkGetPhysicalDeviceQueueFamilyProperties2 = (PFN_vkGetPhysicalDeviceQueueFamilyProperties2)dlSymFunc(lib, "vkGetPhysicalDeviceQueueFamilyProperties2");
-    out->vkGetPhysicalDeviceMemoryProperties2 = (PFN_vkGetPhysicalDeviceMemoryProperties2)dlSymFunc(lib, "vkGetPhysicalDeviceMemoryProperties2");
-    out->vkGetPhysicalDeviceSparseImageFormatProperties2 = (PFN_vkGetPhysicalDeviceSparseImageFormatProperties2)dlSymFunc(lib, "vkGetPhysicalDeviceSparseImageFormatProperties2");
-    out->vkGetPhysicalDeviceExternalBufferProperties = (PFN_vkGetPhysicalDeviceExternalBufferProperties)dlSymFunc(lib, "vkGetPhysicalDeviceExternalBufferProperties");
-    out->vkGetPhysicalDeviceExternalFenceProperties = (PFN_vkGetPhysicalDeviceExternalFenceProperties)dlSymFunc(lib, "vkGetPhysicalDeviceExternalFenceProperties");
-    out->vkGetPhysicalDeviceExternalSemaphoreProperties = (PFN_vkGetPhysicalDeviceExternalSemaphoreProperties)dlSymFunc(lib, "vkGetPhysicalDeviceExternalSemaphoreProperties");
+    out->vkEnumerateInstanceVersion =
+        (PFN_vkEnumerateInstanceVersion)dlSymFunc(lib, "vkEnumerateInstanceVersion");
+    out->vkEnumeratePhysicalDeviceGroups =
+        (PFN_vkEnumeratePhysicalDeviceGroups)dlSymFunc(lib, "vkEnumeratePhysicalDeviceGroups");
+    out->vkGetPhysicalDeviceFeatures2 =
+        (PFN_vkGetPhysicalDeviceFeatures2)dlSymFunc(lib, "vkGetPhysicalDeviceFeatures2");
+    out->vkGetPhysicalDeviceProperties2 =
+        (PFN_vkGetPhysicalDeviceProperties2)dlSymFunc(lib, "vkGetPhysicalDeviceProperties2");
+    out->vkGetPhysicalDeviceFormatProperties2 = (PFN_vkGetPhysicalDeviceFormatProperties2)dlSymFunc(
+        lib, "vkGetPhysicalDeviceFormatProperties2");
+    out->vkGetPhysicalDeviceImageFormatProperties2 =
+        (PFN_vkGetPhysicalDeviceImageFormatProperties2)dlSymFunc(
+            lib, "vkGetPhysicalDeviceImageFormatProperties2");
+    out->vkGetPhysicalDeviceQueueFamilyProperties2 =
+        (PFN_vkGetPhysicalDeviceQueueFamilyProperties2)dlSymFunc(
+            lib, "vkGetPhysicalDeviceQueueFamilyProperties2");
+    out->vkGetPhysicalDeviceMemoryProperties2 = (PFN_vkGetPhysicalDeviceMemoryProperties2)dlSymFunc(
+        lib, "vkGetPhysicalDeviceMemoryProperties2");
+    out->vkGetPhysicalDeviceSparseImageFormatProperties2 =
+        (PFN_vkGetPhysicalDeviceSparseImageFormatProperties2)dlSymFunc(
+            lib, "vkGetPhysicalDeviceSparseImageFormatProperties2");
+    out->vkGetPhysicalDeviceExternalBufferProperties =
+        (PFN_vkGetPhysicalDeviceExternalBufferProperties)dlSymFunc(
+            lib, "vkGetPhysicalDeviceExternalBufferProperties");
+    out->vkGetPhysicalDeviceExternalFenceProperties =
+        (PFN_vkGetPhysicalDeviceExternalFenceProperties)dlSymFunc(
+            lib, "vkGetPhysicalDeviceExternalFenceProperties");
+    out->vkGetPhysicalDeviceExternalSemaphoreProperties =
+        (PFN_vkGetPhysicalDeviceExternalSemaphoreProperties)dlSymFunc(
+            lib, "vkGetPhysicalDeviceExternalSemaphoreProperties");
 #endif
 #ifdef VK_KHR_surface
     out->vkDestroySurfaceKHR = (PFN_vkDestroySurfaceKHR)dlSymFunc(lib, "vkDestroySurfaceKHR");
@@ -624,41 +659,58 @@
 #ifdef VK_KHR_swapchain
     out->vkCreateSwapchainKHR = (PFN_vkCreateSwapchainKHR)dlSymFunc(lib, "vkCreateSwapchainKHR");
     out->vkDestroySwapchainKHR = (PFN_vkDestroySwapchainKHR)dlSymFunc(lib, "vkDestroySwapchainKHR");
-    out->vkGetSwapchainImagesKHR = (PFN_vkGetSwapchainImagesKHR)dlSymFunc(lib, "vkGetSwapchainImagesKHR");
+    out->vkGetSwapchainImagesKHR =
+        (PFN_vkGetSwapchainImagesKHR)dlSymFunc(lib, "vkGetSwapchainImagesKHR");
     out->vkAcquireNextImageKHR = (PFN_vkAcquireNextImageKHR)dlSymFunc(lib, "vkAcquireNextImageKHR");
     out->vkQueuePresentKHR = (PFN_vkQueuePresentKHR)dlSymFunc(lib, "vkQueuePresentKHR");
 #endif
 #ifdef VK_KHR_display
-    out->vkCreateDisplayPlaneSurfaceKHR = (PFN_vkCreateDisplayPlaneSurfaceKHR)dlSymFunc(lib, "vkCreateDisplayPlaneSurfaceKHR");
+    out->vkCreateDisplayPlaneSurfaceKHR =
+        (PFN_vkCreateDisplayPlaneSurfaceKHR)dlSymFunc(lib, "vkCreateDisplayPlaneSurfaceKHR");
 #endif
 #ifdef VK_KHR_xlib_surface
-    out->vkCreateXlibSurfaceKHR = (PFN_vkCreateXlibSurfaceKHR)dlSymFunc(lib, "vkCreateXlibSurfaceKHR");
-    out->vkGetPhysicalDeviceXlibPresentationSupportKHR = (PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR)dlSymFunc(lib, "vkGetPhysicalDeviceXlibPresentationSupportKHR");
+    out->vkCreateXlibSurfaceKHR =
+        (PFN_vkCreateXlibSurfaceKHR)dlSymFunc(lib, "vkCreateXlibSurfaceKHR");
+    out->vkGetPhysicalDeviceXlibPresentationSupportKHR =
+        (PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR)dlSymFunc(
+            lib, "vkGetPhysicalDeviceXlibPresentationSupportKHR");
 #endif
 #ifdef VK_KHR_xcb_surface
     out->vkCreateXcbSurfaceKHR = (PFN_vkCreateXcbSurfaceKHR)dlSymFunc(lib, "vkCreateXcbSurfaceKHR");
-    out->vkGetPhysicalDeviceXcbPresentationSupportKHR = (PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR)dlSymFunc(lib, "vkGetPhysicalDeviceXcbPresentationSupportKHR");
+    out->vkGetPhysicalDeviceXcbPresentationSupportKHR =
+        (PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR)dlSymFunc(
+            lib, "vkGetPhysicalDeviceXcbPresentationSupportKHR");
 #endif
 #ifdef VK_KHR_wayland_surface
-    out->vkCreateWaylandSurfaceKHR = (PFN_vkCreateWaylandSurfaceKHR)dlSymFunc(lib, "vkCreateWaylandSurfaceKHR");
+    out->vkCreateWaylandSurfaceKHR =
+        (PFN_vkCreateWaylandSurfaceKHR)dlSymFunc(lib, "vkCreateWaylandSurfaceKHR");
 #endif
 #ifdef VK_KHR_android_surface
-    out->vkCreateAndroidSurfaceKHR = (PFN_vkCreateAndroidSurfaceKHR)dlSymFunc(lib, "vkCreateAndroidSurfaceKHR");
+    out->vkCreateAndroidSurfaceKHR =
+        (PFN_vkCreateAndroidSurfaceKHR)dlSymFunc(lib, "vkCreateAndroidSurfaceKHR");
 #endif
 #ifdef VK_KHR_win32_surface
-    out->vkCreateWin32SurfaceKHR = (PFN_vkCreateWin32SurfaceKHR)dlSymFunc(lib, "vkCreateWin32SurfaceKHR");
-    out->vkGetPhysicalDeviceWin32PresentationSupportKHR = (PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)dlSymFunc(lib, "vkGetPhysicalDeviceWin32PresentationSupportKHR");
+    out->vkCreateWin32SurfaceKHR =
+        (PFN_vkCreateWin32SurfaceKHR)dlSymFunc(lib, "vkCreateWin32SurfaceKHR");
+    out->vkGetPhysicalDeviceWin32PresentationSupportKHR =
+        (PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)dlSymFunc(
+            lib, "vkGetPhysicalDeviceWin32PresentationSupportKHR");
 #endif
 #ifdef VK_KHR_device_group_creation
-    out->vkEnumeratePhysicalDeviceGroupsKHR = (PFN_vkEnumeratePhysicalDeviceGroupsKHR)dlSymFunc(lib, "vkEnumeratePhysicalDeviceGroupsKHR");
+    out->vkEnumeratePhysicalDeviceGroupsKHR = (PFN_vkEnumeratePhysicalDeviceGroupsKHR)dlSymFunc(
+        lib, "vkEnumeratePhysicalDeviceGroupsKHR");
 #endif
 #ifdef VK_EXT_debug_report
-    out->vkCreateDebugReportCallbackEXT = (PFN_vkCreateDebugReportCallbackEXT)dlSymFunc(lib, "vkCreateDebugReportCallbackEXT");
-    out->vkDestroyDebugReportCallbackEXT = (PFN_vkDestroyDebugReportCallbackEXT)dlSymFunc(lib, "vkDestroyDebugReportCallbackEXT");
-    out->vkDebugReportMessageEXT = (PFN_vkDebugReportMessageEXT)dlSymFunc(lib, "vkDebugReportMessageEXT");
+    out->vkCreateDebugReportCallbackEXT =
+        (PFN_vkCreateDebugReportCallbackEXT)dlSymFunc(lib, "vkCreateDebugReportCallbackEXT");
+    out->vkDestroyDebugReportCallbackEXT =
+        (PFN_vkDestroyDebugReportCallbackEXT)dlSymFunc(lib, "vkDestroyDebugReportCallbackEXT");
+    out->vkDebugReportMessageEXT =
+        (PFN_vkDebugReportMessageEXT)dlSymFunc(lib, "vkDebugReportMessageEXT");
 #endif
 #ifdef VK_GGP_stream_descriptor_surface
-    out->vkCreateStreamDescriptorSurfaceGGP = (PFN_vkCreateStreamDescriptorSurfaceGGP)dlSymFunc(lib, "vkCreateStreamDescriptorSurfaceGGP");
+    out->vkCreateStreamDescriptorSurfaceGGP = (PFN_vkCreateStreamDescriptorSurfaceGGP)dlSymFunc(
+        lib, "vkCreateStreamDescriptorSurfaceGGP");
 #endif
 #ifdef VK_NN_vi_surface
     out->vkCreateViSurfaceNN = (PFN_vkCreateViSurfaceNN)dlSymFunc(lib, "vkCreateViSurfaceNN");
@@ -667,27 +719,36 @@
     out->vkCreateIOSSurfaceMVK = (PFN_vkCreateIOSSurfaceMVK)dlSymFunc(lib, "vkCreateIOSSurfaceMVK");
 #endif
 #ifdef VK_MVK_macos_surface
-    out->vkCreateMacOSSurfaceMVK = (PFN_vkCreateMacOSSurfaceMVK)dlSymFunc(lib, "vkCreateMacOSSurfaceMVK");
+    out->vkCreateMacOSSurfaceMVK =
+        (PFN_vkCreateMacOSSurfaceMVK)dlSymFunc(lib, "vkCreateMacOSSurfaceMVK");
 #endif
 #ifdef VK_EXT_debug_utils
-    out->vkCreateDebugUtilsMessengerEXT = (PFN_vkCreateDebugUtilsMessengerEXT)dlSymFunc(lib, "vkCreateDebugUtilsMessengerEXT");
-    out->vkDestroyDebugUtilsMessengerEXT = (PFN_vkDestroyDebugUtilsMessengerEXT)dlSymFunc(lib, "vkDestroyDebugUtilsMessengerEXT");
-    out->vkSubmitDebugUtilsMessageEXT = (PFN_vkSubmitDebugUtilsMessageEXT)dlSymFunc(lib, "vkSubmitDebugUtilsMessageEXT");
+    out->vkCreateDebugUtilsMessengerEXT =
+        (PFN_vkCreateDebugUtilsMessengerEXT)dlSymFunc(lib, "vkCreateDebugUtilsMessengerEXT");
+    out->vkDestroyDebugUtilsMessengerEXT =
+        (PFN_vkDestroyDebugUtilsMessengerEXT)dlSymFunc(lib, "vkDestroyDebugUtilsMessengerEXT");
+    out->vkSubmitDebugUtilsMessageEXT =
+        (PFN_vkSubmitDebugUtilsMessageEXT)dlSymFunc(lib, "vkSubmitDebugUtilsMessageEXT");
 #endif
 #ifdef VK_FUCHSIA_imagepipe_surface
-    out->vkCreateImagePipeSurfaceFUCHSIA = (PFN_vkCreateImagePipeSurfaceFUCHSIA)dlSymFunc(lib, "vkCreateImagePipeSurfaceFUCHSIA");
+    out->vkCreateImagePipeSurfaceFUCHSIA =
+        (PFN_vkCreateImagePipeSurfaceFUCHSIA)dlSymFunc(lib, "vkCreateImagePipeSurfaceFUCHSIA");
 #endif
 #ifdef VK_EXT_metal_surface
-    out->vkCreateMetalSurfaceEXT = (PFN_vkCreateMetalSurfaceEXT)dlSymFunc(lib, "vkCreateMetalSurfaceEXT");
+    out->vkCreateMetalSurfaceEXT =
+        (PFN_vkCreateMetalSurfaceEXT)dlSymFunc(lib, "vkCreateMetalSurfaceEXT");
 #endif
 #ifdef VK_EXT_headless_surface
-    out->vkCreateHeadlessSurfaceEXT = (PFN_vkCreateHeadlessSurfaceEXT)dlSymFunc(lib, "vkCreateHeadlessSurfaceEXT");
+    out->vkCreateHeadlessSurfaceEXT =
+        (PFN_vkCreateHeadlessSurfaceEXT)dlSymFunc(lib, "vkCreateHeadlessSurfaceEXT");
 #endif
 #ifdef VK_EXT_directfb_surface
-    out->vkCreateDirectFBSurfaceEXT = (PFN_vkCreateDirectFBSurfaceEXT)dlSymFunc(lib, "vkCreateDirectFBSurfaceEXT");
+    out->vkCreateDirectFBSurfaceEXT =
+        (PFN_vkCreateDirectFBSurfaceEXT)dlSymFunc(lib, "vkCreateDirectFBSurfaceEXT");
 #endif
 #ifdef VK_QNX_screen_surface
-    out->vkCreateScreenSurfaceQNX = (PFN_vkCreateScreenSurfaceQNX)dlSymFunc(lib, "vkCreateScreenSurfaceQNX");
+    out->vkCreateScreenSurfaceQNX =
+        (PFN_vkCreateScreenSurfaceQNX)dlSymFunc(lib, "vkCreateScreenSurfaceQNX");
 #endif
 #ifdef VK_VERSION_1_0
     out->vkGetDeviceQueue = (PFN_vkGetDeviceQueue)dlSymFunc(lib, "vkGetDeviceQueue");
@@ -698,14 +759,20 @@
     out->vkFreeMemory = (PFN_vkFreeMemory)dlSymFunc(lib, "vkFreeMemory");
     out->vkMapMemory = (PFN_vkMapMemory)dlSymFunc(lib, "vkMapMemory");
     out->vkUnmapMemory = (PFN_vkUnmapMemory)dlSymFunc(lib, "vkUnmapMemory");
-    out->vkFlushMappedMemoryRanges = (PFN_vkFlushMappedMemoryRanges)dlSymFunc(lib, "vkFlushMappedMemoryRanges");
-    out->vkInvalidateMappedMemoryRanges = (PFN_vkInvalidateMappedMemoryRanges)dlSymFunc(lib, "vkInvalidateMappedMemoryRanges");
-    out->vkGetDeviceMemoryCommitment = (PFN_vkGetDeviceMemoryCommitment)dlSymFunc(lib, "vkGetDeviceMemoryCommitment");
+    out->vkFlushMappedMemoryRanges =
+        (PFN_vkFlushMappedMemoryRanges)dlSymFunc(lib, "vkFlushMappedMemoryRanges");
+    out->vkInvalidateMappedMemoryRanges =
+        (PFN_vkInvalidateMappedMemoryRanges)dlSymFunc(lib, "vkInvalidateMappedMemoryRanges");
+    out->vkGetDeviceMemoryCommitment =
+        (PFN_vkGetDeviceMemoryCommitment)dlSymFunc(lib, "vkGetDeviceMemoryCommitment");
     out->vkBindBufferMemory = (PFN_vkBindBufferMemory)dlSymFunc(lib, "vkBindBufferMemory");
     out->vkBindImageMemory = (PFN_vkBindImageMemory)dlSymFunc(lib, "vkBindImageMemory");
-    out->vkGetBufferMemoryRequirements = (PFN_vkGetBufferMemoryRequirements)dlSymFunc(lib, "vkGetBufferMemoryRequirements");
-    out->vkGetImageMemoryRequirements = (PFN_vkGetImageMemoryRequirements)dlSymFunc(lib, "vkGetImageMemoryRequirements");
-    out->vkGetImageSparseMemoryRequirements = (PFN_vkGetImageSparseMemoryRequirements)dlSymFunc(lib, "vkGetImageSparseMemoryRequirements");
+    out->vkGetBufferMemoryRequirements =
+        (PFN_vkGetBufferMemoryRequirements)dlSymFunc(lib, "vkGetBufferMemoryRequirements");
+    out->vkGetImageMemoryRequirements =
+        (PFN_vkGetImageMemoryRequirements)dlSymFunc(lib, "vkGetImageMemoryRequirements");
+    out->vkGetImageSparseMemoryRequirements = (PFN_vkGetImageSparseMemoryRequirements)dlSymFunc(
+        lib, "vkGetImageSparseMemoryRequirements");
     out->vkQueueBindSparse = (PFN_vkQueueBindSparse)dlSymFunc(lib, "vkQueueBindSparse");
     out->vkCreateFence = (PFN_vkCreateFence)dlSymFunc(lib, "vkCreateFence");
     out->vkDestroyFence = (PFN_vkDestroyFence)dlSymFunc(lib, "vkDestroyFence");
@@ -728,39 +795,54 @@
     out->vkDestroyBufferView = (PFN_vkDestroyBufferView)dlSymFunc(lib, "vkDestroyBufferView");
     out->vkCreateImage = (PFN_vkCreateImage)dlSymFunc(lib, "vkCreateImage");
     out->vkDestroyImage = (PFN_vkDestroyImage)dlSymFunc(lib, "vkDestroyImage");
-    out->vkGetImageSubresourceLayout = (PFN_vkGetImageSubresourceLayout)dlSymFunc(lib, "vkGetImageSubresourceLayout");
+    out->vkGetImageSubresourceLayout =
+        (PFN_vkGetImageSubresourceLayout)dlSymFunc(lib, "vkGetImageSubresourceLayout");
     out->vkCreateImageView = (PFN_vkCreateImageView)dlSymFunc(lib, "vkCreateImageView");
     out->vkDestroyImageView = (PFN_vkDestroyImageView)dlSymFunc(lib, "vkDestroyImageView");
     out->vkCreateShaderModule = (PFN_vkCreateShaderModule)dlSymFunc(lib, "vkCreateShaderModule");
     out->vkDestroyShaderModule = (PFN_vkDestroyShaderModule)dlSymFunc(lib, "vkDestroyShaderModule");
     out->vkCreatePipelineCache = (PFN_vkCreatePipelineCache)dlSymFunc(lib, "vkCreatePipelineCache");
-    out->vkDestroyPipelineCache = (PFN_vkDestroyPipelineCache)dlSymFunc(lib, "vkDestroyPipelineCache");
-    out->vkGetPipelineCacheData = (PFN_vkGetPipelineCacheData)dlSymFunc(lib, "vkGetPipelineCacheData");
+    out->vkDestroyPipelineCache =
+        (PFN_vkDestroyPipelineCache)dlSymFunc(lib, "vkDestroyPipelineCache");
+    out->vkGetPipelineCacheData =
+        (PFN_vkGetPipelineCacheData)dlSymFunc(lib, "vkGetPipelineCacheData");
     out->vkMergePipelineCaches = (PFN_vkMergePipelineCaches)dlSymFunc(lib, "vkMergePipelineCaches");
-    out->vkCreateGraphicsPipelines = (PFN_vkCreateGraphicsPipelines)dlSymFunc(lib, "vkCreateGraphicsPipelines");
-    out->vkCreateComputePipelines = (PFN_vkCreateComputePipelines)dlSymFunc(lib, "vkCreateComputePipelines");
+    out->vkCreateGraphicsPipelines =
+        (PFN_vkCreateGraphicsPipelines)dlSymFunc(lib, "vkCreateGraphicsPipelines");
+    out->vkCreateComputePipelines =
+        (PFN_vkCreateComputePipelines)dlSymFunc(lib, "vkCreateComputePipelines");
     out->vkDestroyPipeline = (PFN_vkDestroyPipeline)dlSymFunc(lib, "vkDestroyPipeline");
-    out->vkCreatePipelineLayout = (PFN_vkCreatePipelineLayout)dlSymFunc(lib, "vkCreatePipelineLayout");
-    out->vkDestroyPipelineLayout = (PFN_vkDestroyPipelineLayout)dlSymFunc(lib, "vkDestroyPipelineLayout");
+    out->vkCreatePipelineLayout =
+        (PFN_vkCreatePipelineLayout)dlSymFunc(lib, "vkCreatePipelineLayout");
+    out->vkDestroyPipelineLayout =
+        (PFN_vkDestroyPipelineLayout)dlSymFunc(lib, "vkDestroyPipelineLayout");
     out->vkCreateSampler = (PFN_vkCreateSampler)dlSymFunc(lib, "vkCreateSampler");
     out->vkDestroySampler = (PFN_vkDestroySampler)dlSymFunc(lib, "vkDestroySampler");
-    out->vkCreateDescriptorSetLayout = (PFN_vkCreateDescriptorSetLayout)dlSymFunc(lib, "vkCreateDescriptorSetLayout");
-    out->vkDestroyDescriptorSetLayout = (PFN_vkDestroyDescriptorSetLayout)dlSymFunc(lib, "vkDestroyDescriptorSetLayout");
-    out->vkCreateDescriptorPool = (PFN_vkCreateDescriptorPool)dlSymFunc(lib, "vkCreateDescriptorPool");
-    out->vkDestroyDescriptorPool = (PFN_vkDestroyDescriptorPool)dlSymFunc(lib, "vkDestroyDescriptorPool");
+    out->vkCreateDescriptorSetLayout =
+        (PFN_vkCreateDescriptorSetLayout)dlSymFunc(lib, "vkCreateDescriptorSetLayout");
+    out->vkDestroyDescriptorSetLayout =
+        (PFN_vkDestroyDescriptorSetLayout)dlSymFunc(lib, "vkDestroyDescriptorSetLayout");
+    out->vkCreateDescriptorPool =
+        (PFN_vkCreateDescriptorPool)dlSymFunc(lib, "vkCreateDescriptorPool");
+    out->vkDestroyDescriptorPool =
+        (PFN_vkDestroyDescriptorPool)dlSymFunc(lib, "vkDestroyDescriptorPool");
     out->vkResetDescriptorPool = (PFN_vkResetDescriptorPool)dlSymFunc(lib, "vkResetDescriptorPool");
-    out->vkAllocateDescriptorSets = (PFN_vkAllocateDescriptorSets)dlSymFunc(lib, "vkAllocateDescriptorSets");
+    out->vkAllocateDescriptorSets =
+        (PFN_vkAllocateDescriptorSets)dlSymFunc(lib, "vkAllocateDescriptorSets");
     out->vkFreeDescriptorSets = (PFN_vkFreeDescriptorSets)dlSymFunc(lib, "vkFreeDescriptorSets");
-    out->vkUpdateDescriptorSets = (PFN_vkUpdateDescriptorSets)dlSymFunc(lib, "vkUpdateDescriptorSets");
+    out->vkUpdateDescriptorSets =
+        (PFN_vkUpdateDescriptorSets)dlSymFunc(lib, "vkUpdateDescriptorSets");
     out->vkCreateFramebuffer = (PFN_vkCreateFramebuffer)dlSymFunc(lib, "vkCreateFramebuffer");
     out->vkDestroyFramebuffer = (PFN_vkDestroyFramebuffer)dlSymFunc(lib, "vkDestroyFramebuffer");
     out->vkCreateRenderPass = (PFN_vkCreateRenderPass)dlSymFunc(lib, "vkCreateRenderPass");
     out->vkDestroyRenderPass = (PFN_vkDestroyRenderPass)dlSymFunc(lib, "vkDestroyRenderPass");
-    out->vkGetRenderAreaGranularity = (PFN_vkGetRenderAreaGranularity)dlSymFunc(lib, "vkGetRenderAreaGranularity");
+    out->vkGetRenderAreaGranularity =
+        (PFN_vkGetRenderAreaGranularity)dlSymFunc(lib, "vkGetRenderAreaGranularity");
     out->vkCreateCommandPool = (PFN_vkCreateCommandPool)dlSymFunc(lib, "vkCreateCommandPool");
     out->vkDestroyCommandPool = (PFN_vkDestroyCommandPool)dlSymFunc(lib, "vkDestroyCommandPool");
     out->vkResetCommandPool = (PFN_vkResetCommandPool)dlSymFunc(lib, "vkResetCommandPool");
-    out->vkAllocateCommandBuffers = (PFN_vkAllocateCommandBuffers)dlSymFunc(lib, "vkAllocateCommandBuffers");
+    out->vkAllocateCommandBuffers =
+        (PFN_vkAllocateCommandBuffers)dlSymFunc(lib, "vkAllocateCommandBuffers");
     out->vkFreeCommandBuffers = (PFN_vkFreeCommandBuffers)dlSymFunc(lib, "vkFreeCommandBuffers");
     out->vkBeginCommandBuffer = (PFN_vkBeginCommandBuffer)dlSymFunc(lib, "vkBeginCommandBuffer");
     out->vkEndCommandBuffer = (PFN_vkEndCommandBuffer)dlSymFunc(lib, "vkEndCommandBuffer");
@@ -770,29 +852,39 @@
     out->vkCmdSetScissor = (PFN_vkCmdSetScissor)dlSymFunc(lib, "vkCmdSetScissor");
     out->vkCmdSetLineWidth = (PFN_vkCmdSetLineWidth)dlSymFunc(lib, "vkCmdSetLineWidth");
     out->vkCmdSetDepthBias = (PFN_vkCmdSetDepthBias)dlSymFunc(lib, "vkCmdSetDepthBias");
-    out->vkCmdSetBlendConstants = (PFN_vkCmdSetBlendConstants)dlSymFunc(lib, "vkCmdSetBlendConstants");
+    out->vkCmdSetBlendConstants =
+        (PFN_vkCmdSetBlendConstants)dlSymFunc(lib, "vkCmdSetBlendConstants");
     out->vkCmdSetDepthBounds = (PFN_vkCmdSetDepthBounds)dlSymFunc(lib, "vkCmdSetDepthBounds");
-    out->vkCmdSetStencilCompareMask = (PFN_vkCmdSetStencilCompareMask)dlSymFunc(lib, "vkCmdSetStencilCompareMask");
-    out->vkCmdSetStencilWriteMask = (PFN_vkCmdSetStencilWriteMask)dlSymFunc(lib, "vkCmdSetStencilWriteMask");
-    out->vkCmdSetStencilReference = (PFN_vkCmdSetStencilReference)dlSymFunc(lib, "vkCmdSetStencilReference");
-    out->vkCmdBindDescriptorSets = (PFN_vkCmdBindDescriptorSets)dlSymFunc(lib, "vkCmdBindDescriptorSets");
+    out->vkCmdSetStencilCompareMask =
+        (PFN_vkCmdSetStencilCompareMask)dlSymFunc(lib, "vkCmdSetStencilCompareMask");
+    out->vkCmdSetStencilWriteMask =
+        (PFN_vkCmdSetStencilWriteMask)dlSymFunc(lib, "vkCmdSetStencilWriteMask");
+    out->vkCmdSetStencilReference =
+        (PFN_vkCmdSetStencilReference)dlSymFunc(lib, "vkCmdSetStencilReference");
+    out->vkCmdBindDescriptorSets =
+        (PFN_vkCmdBindDescriptorSets)dlSymFunc(lib, "vkCmdBindDescriptorSets");
     out->vkCmdBindIndexBuffer = (PFN_vkCmdBindIndexBuffer)dlSymFunc(lib, "vkCmdBindIndexBuffer");
-    out->vkCmdBindVertexBuffers = (PFN_vkCmdBindVertexBuffers)dlSymFunc(lib, "vkCmdBindVertexBuffers");
+    out->vkCmdBindVertexBuffers =
+        (PFN_vkCmdBindVertexBuffers)dlSymFunc(lib, "vkCmdBindVertexBuffers");
     out->vkCmdDraw = (PFN_vkCmdDraw)dlSymFunc(lib, "vkCmdDraw");
     out->vkCmdDrawIndexed = (PFN_vkCmdDrawIndexed)dlSymFunc(lib, "vkCmdDrawIndexed");
     out->vkCmdDrawIndirect = (PFN_vkCmdDrawIndirect)dlSymFunc(lib, "vkCmdDrawIndirect");
-    out->vkCmdDrawIndexedIndirect = (PFN_vkCmdDrawIndexedIndirect)dlSymFunc(lib, "vkCmdDrawIndexedIndirect");
+    out->vkCmdDrawIndexedIndirect =
+        (PFN_vkCmdDrawIndexedIndirect)dlSymFunc(lib, "vkCmdDrawIndexedIndirect");
     out->vkCmdDispatch = (PFN_vkCmdDispatch)dlSymFunc(lib, "vkCmdDispatch");
     out->vkCmdDispatchIndirect = (PFN_vkCmdDispatchIndirect)dlSymFunc(lib, "vkCmdDispatchIndirect");
     out->vkCmdCopyBuffer = (PFN_vkCmdCopyBuffer)dlSymFunc(lib, "vkCmdCopyBuffer");
     out->vkCmdCopyImage = (PFN_vkCmdCopyImage)dlSymFunc(lib, "vkCmdCopyImage");
     out->vkCmdBlitImage = (PFN_vkCmdBlitImage)dlSymFunc(lib, "vkCmdBlitImage");
-    out->vkCmdCopyBufferToImage = (PFN_vkCmdCopyBufferToImage)dlSymFunc(lib, "vkCmdCopyBufferToImage");
-    out->vkCmdCopyImageToBuffer = (PFN_vkCmdCopyImageToBuffer)dlSymFunc(lib, "vkCmdCopyImageToBuffer");
+    out->vkCmdCopyBufferToImage =
+        (PFN_vkCmdCopyBufferToImage)dlSymFunc(lib, "vkCmdCopyBufferToImage");
+    out->vkCmdCopyImageToBuffer =
+        (PFN_vkCmdCopyImageToBuffer)dlSymFunc(lib, "vkCmdCopyImageToBuffer");
     out->vkCmdUpdateBuffer = (PFN_vkCmdUpdateBuffer)dlSymFunc(lib, "vkCmdUpdateBuffer");
     out->vkCmdFillBuffer = (PFN_vkCmdFillBuffer)dlSymFunc(lib, "vkCmdFillBuffer");
     out->vkCmdClearColorImage = (PFN_vkCmdClearColorImage)dlSymFunc(lib, "vkCmdClearColorImage");
-    out->vkCmdClearDepthStencilImage = (PFN_vkCmdClearDepthStencilImage)dlSymFunc(lib, "vkCmdClearDepthStencilImage");
+    out->vkCmdClearDepthStencilImage =
+        (PFN_vkCmdClearDepthStencilImage)dlSymFunc(lib, "vkCmdClearDepthStencilImage");
     out->vkCmdClearAttachments = (PFN_vkCmdClearAttachments)dlSymFunc(lib, "vkCmdClearAttachments");
     out->vkCmdResolveImage = (PFN_vkCmdResolveImage)dlSymFunc(lib, "vkCmdResolveImage");
     out->vkCmdSetEvent = (PFN_vkCmdSetEvent)dlSymFunc(lib, "vkCmdSetEvent");
@@ -803,7 +895,8 @@
     out->vkCmdEndQuery = (PFN_vkCmdEndQuery)dlSymFunc(lib, "vkCmdEndQuery");
     out->vkCmdResetQueryPool = (PFN_vkCmdResetQueryPool)dlSymFunc(lib, "vkCmdResetQueryPool");
     out->vkCmdWriteTimestamp = (PFN_vkCmdWriteTimestamp)dlSymFunc(lib, "vkCmdWriteTimestamp");
-    out->vkCmdCopyQueryPoolResults = (PFN_vkCmdCopyQueryPoolResults)dlSymFunc(lib, "vkCmdCopyQueryPoolResults");
+    out->vkCmdCopyQueryPoolResults =
+        (PFN_vkCmdCopyQueryPoolResults)dlSymFunc(lib, "vkCmdCopyQueryPoolResults");
     out->vkCmdPushConstants = (PFN_vkCmdPushConstants)dlSymFunc(lib, "vkCmdPushConstants");
     out->vkCmdBeginRenderPass = (PFN_vkCmdBeginRenderPass)dlSymFunc(lib, "vkCmdBeginRenderPass");
     out->vkCmdNextSubpass = (PFN_vkCmdNextSubpass)dlSymFunc(lib, "vkCmdNextSubpass");
@@ -813,94 +906,166 @@
 #ifdef VK_VERSION_1_1
     out->vkBindBufferMemory2 = (PFN_vkBindBufferMemory2)dlSymFunc(lib, "vkBindBufferMemory2");
     out->vkBindImageMemory2 = (PFN_vkBindImageMemory2)dlSymFunc(lib, "vkBindImageMemory2");
-    out->vkGetDeviceGroupPeerMemoryFeatures = (PFN_vkGetDeviceGroupPeerMemoryFeatures)dlSymFunc(lib, "vkGetDeviceGroupPeerMemoryFeatures");
+    out->vkGetDeviceGroupPeerMemoryFeatures = (PFN_vkGetDeviceGroupPeerMemoryFeatures)dlSymFunc(
+        lib, "vkGetDeviceGroupPeerMemoryFeatures");
     out->vkCmdSetDeviceMask = (PFN_vkCmdSetDeviceMask)dlSymFunc(lib, "vkCmdSetDeviceMask");
     out->vkCmdDispatchBase = (PFN_vkCmdDispatchBase)dlSymFunc(lib, "vkCmdDispatchBase");
-    out->vkGetImageMemoryRequirements2 = (PFN_vkGetImageMemoryRequirements2)dlSymFunc(lib, "vkGetImageMemoryRequirements2");
-    out->vkGetBufferMemoryRequirements2 = (PFN_vkGetBufferMemoryRequirements2)dlSymFunc(lib, "vkGetBufferMemoryRequirements2");
-    out->vkGetImageSparseMemoryRequirements2 = (PFN_vkGetImageSparseMemoryRequirements2)dlSymFunc(lib, "vkGetImageSparseMemoryRequirements2");
+    out->vkGetImageMemoryRequirements2 =
+        (PFN_vkGetImageMemoryRequirements2)dlSymFunc(lib, "vkGetImageMemoryRequirements2");
+    out->vkGetBufferMemoryRequirements2 =
+        (PFN_vkGetBufferMemoryRequirements2)dlSymFunc(lib, "vkGetBufferMemoryRequirements2");
+    out->vkGetImageSparseMemoryRequirements2 = (PFN_vkGetImageSparseMemoryRequirements2)dlSymFunc(
+        lib, "vkGetImageSparseMemoryRequirements2");
     out->vkTrimCommandPool = (PFN_vkTrimCommandPool)dlSymFunc(lib, "vkTrimCommandPool");
     out->vkGetDeviceQueue2 = (PFN_vkGetDeviceQueue2)dlSymFunc(lib, "vkGetDeviceQueue2");
-    out->vkCreateSamplerYcbcrConversion = (PFN_vkCreateSamplerYcbcrConversion)dlSymFunc(lib, "vkCreateSamplerYcbcrConversion");
-    out->vkDestroySamplerYcbcrConversion = (PFN_vkDestroySamplerYcbcrConversion)dlSymFunc(lib, "vkDestroySamplerYcbcrConversion");
-    out->vkCreateDescriptorUpdateTemplate = (PFN_vkCreateDescriptorUpdateTemplate)dlSymFunc(lib, "vkCreateDescriptorUpdateTemplate");
-    out->vkDestroyDescriptorUpdateTemplate = (PFN_vkDestroyDescriptorUpdateTemplate)dlSymFunc(lib, "vkDestroyDescriptorUpdateTemplate");
-    out->vkUpdateDescriptorSetWithTemplate = (PFN_vkUpdateDescriptorSetWithTemplate)dlSymFunc(lib, "vkUpdateDescriptorSetWithTemplate");
-    out->vkGetDescriptorSetLayoutSupport = (PFN_vkGetDescriptorSetLayoutSupport)dlSymFunc(lib, "vkGetDescriptorSetLayoutSupport");
+    out->vkCreateSamplerYcbcrConversion =
+        (PFN_vkCreateSamplerYcbcrConversion)dlSymFunc(lib, "vkCreateSamplerYcbcrConversion");
+    out->vkDestroySamplerYcbcrConversion =
+        (PFN_vkDestroySamplerYcbcrConversion)dlSymFunc(lib, "vkDestroySamplerYcbcrConversion");
+    out->vkCreateDescriptorUpdateTemplate =
+        (PFN_vkCreateDescriptorUpdateTemplate)dlSymFunc(lib, "vkCreateDescriptorUpdateTemplate");
+    out->vkDestroyDescriptorUpdateTemplate =
+        (PFN_vkDestroyDescriptorUpdateTemplate)dlSymFunc(lib, "vkDestroyDescriptorUpdateTemplate");
+    out->vkUpdateDescriptorSetWithTemplate =
+        (PFN_vkUpdateDescriptorSetWithTemplate)dlSymFunc(lib, "vkUpdateDescriptorSetWithTemplate");
+    out->vkGetDescriptorSetLayoutSupport =
+        (PFN_vkGetDescriptorSetLayoutSupport)dlSymFunc(lib, "vkGetDescriptorSetLayoutSupport");
 #endif
 #ifdef VK_VERSION_1_2
-    out->vkCmdDrawIndirectCount = (PFN_vkCmdDrawIndirectCount)dlSymFunc(lib, "vkCmdDrawIndirectCount");
-    out->vkCmdDrawIndexedIndirectCount = (PFN_vkCmdDrawIndexedIndirectCount)dlSymFunc(lib, "vkCmdDrawIndexedIndirectCount");
+    out->vkCmdDrawIndirectCount =
+        (PFN_vkCmdDrawIndirectCount)dlSymFunc(lib, "vkCmdDrawIndirectCount");
+    out->vkCmdDrawIndexedIndirectCount =
+        (PFN_vkCmdDrawIndexedIndirectCount)dlSymFunc(lib, "vkCmdDrawIndexedIndirectCount");
     out->vkCreateRenderPass2 = (PFN_vkCreateRenderPass2)dlSymFunc(lib, "vkCreateRenderPass2");
     out->vkCmdBeginRenderPass2 = (PFN_vkCmdBeginRenderPass2)dlSymFunc(lib, "vkCmdBeginRenderPass2");
     out->vkCmdNextSubpass2 = (PFN_vkCmdNextSubpass2)dlSymFunc(lib, "vkCmdNextSubpass2");
     out->vkCmdEndRenderPass2 = (PFN_vkCmdEndRenderPass2)dlSymFunc(lib, "vkCmdEndRenderPass2");
     out->vkResetQueryPool = (PFN_vkResetQueryPool)dlSymFunc(lib, "vkResetQueryPool");
-    out->vkGetSemaphoreCounterValue = (PFN_vkGetSemaphoreCounterValue)dlSymFunc(lib, "vkGetSemaphoreCounterValue");
+    out->vkGetSemaphoreCounterValue =
+        (PFN_vkGetSemaphoreCounterValue)dlSymFunc(lib, "vkGetSemaphoreCounterValue");
     out->vkWaitSemaphores = (PFN_vkWaitSemaphores)dlSymFunc(lib, "vkWaitSemaphores");
     out->vkSignalSemaphore = (PFN_vkSignalSemaphore)dlSymFunc(lib, "vkSignalSemaphore");
-    out->vkGetBufferDeviceAddress = (PFN_vkGetBufferDeviceAddress)dlSymFunc(lib, "vkGetBufferDeviceAddress");
-    out->vkGetBufferOpaqueCaptureAddress = (PFN_vkGetBufferOpaqueCaptureAddress)dlSymFunc(lib, "vkGetBufferOpaqueCaptureAddress");
-    out->vkGetDeviceMemoryOpaqueCaptureAddress = (PFN_vkGetDeviceMemoryOpaqueCaptureAddress)dlSymFunc(lib, "vkGetDeviceMemoryOpaqueCaptureAddress");
+    out->vkGetBufferDeviceAddress =
+        (PFN_vkGetBufferDeviceAddress)dlSymFunc(lib, "vkGetBufferDeviceAddress");
+    out->vkGetBufferOpaqueCaptureAddress =
+        (PFN_vkGetBufferOpaqueCaptureAddress)dlSymFunc(lib, "vkGetBufferOpaqueCaptureAddress");
+    out->vkGetDeviceMemoryOpaqueCaptureAddress =
+        (PFN_vkGetDeviceMemoryOpaqueCaptureAddress)dlSymFunc(
+            lib, "vkGetDeviceMemoryOpaqueCaptureAddress");
 #endif
 #ifdef VK_KHR_surface
-    out->vkGetPhysicalDeviceSurfaceSupportKHR = (PFN_vkGetPhysicalDeviceSurfaceSupportKHR)dlSymFunc(lib, "vkGetPhysicalDeviceSurfaceSupportKHR");
-    out->vkGetPhysicalDeviceSurfaceCapabilitiesKHR = (PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR)dlSymFunc(lib, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR");
-    out->vkGetPhysicalDeviceSurfaceFormatsKHR = (PFN_vkGetPhysicalDeviceSurfaceFormatsKHR)dlSymFunc(lib, "vkGetPhysicalDeviceSurfaceFormatsKHR");
-    out->vkGetPhysicalDeviceSurfacePresentModesKHR = (PFN_vkGetPhysicalDeviceSurfacePresentModesKHR)dlSymFunc(lib, "vkGetPhysicalDeviceSurfacePresentModesKHR");
+    out->vkGetPhysicalDeviceSurfaceSupportKHR = (PFN_vkGetPhysicalDeviceSurfaceSupportKHR)dlSymFunc(
+        lib, "vkGetPhysicalDeviceSurfaceSupportKHR");
+    out->vkGetPhysicalDeviceSurfaceCapabilitiesKHR =
+        (PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR)dlSymFunc(
+            lib, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR");
+    out->vkGetPhysicalDeviceSurfaceFormatsKHR = (PFN_vkGetPhysicalDeviceSurfaceFormatsKHR)dlSymFunc(
+        lib, "vkGetPhysicalDeviceSurfaceFormatsKHR");
+    out->vkGetPhysicalDeviceSurfacePresentModesKHR =
+        (PFN_vkGetPhysicalDeviceSurfacePresentModesKHR)dlSymFunc(
+            lib, "vkGetPhysicalDeviceSurfacePresentModesKHR");
 #endif
 #ifdef VK_KHR_swapchain
-    out->vkGetDeviceGroupPresentCapabilitiesKHR = (PFN_vkGetDeviceGroupPresentCapabilitiesKHR)dlSymFunc(lib, "vkGetDeviceGroupPresentCapabilitiesKHR");
-    out->vkGetDeviceGroupSurfacePresentModesKHR = (PFN_vkGetDeviceGroupSurfacePresentModesKHR)dlSymFunc(lib, "vkGetDeviceGroupSurfacePresentModesKHR");
-    out->vkGetPhysicalDevicePresentRectanglesKHR = (PFN_vkGetPhysicalDevicePresentRectanglesKHR)dlSymFunc(lib, "vkGetPhysicalDevicePresentRectanglesKHR");
-    out->vkAcquireNextImage2KHR = (PFN_vkAcquireNextImage2KHR)dlSymFunc(lib, "vkAcquireNextImage2KHR");
+    out->vkGetDeviceGroupPresentCapabilitiesKHR =
+        (PFN_vkGetDeviceGroupPresentCapabilitiesKHR)dlSymFunc(
+            lib, "vkGetDeviceGroupPresentCapabilitiesKHR");
+    out->vkGetDeviceGroupSurfacePresentModesKHR =
+        (PFN_vkGetDeviceGroupSurfacePresentModesKHR)dlSymFunc(
+            lib, "vkGetDeviceGroupSurfacePresentModesKHR");
+    out->vkGetPhysicalDevicePresentRectanglesKHR =
+        (PFN_vkGetPhysicalDevicePresentRectanglesKHR)dlSymFunc(
+            lib, "vkGetPhysicalDevicePresentRectanglesKHR");
+    out->vkAcquireNextImage2KHR =
+        (PFN_vkAcquireNextImage2KHR)dlSymFunc(lib, "vkAcquireNextImage2KHR");
 #endif
 #ifdef VK_KHR_display
-    out->vkGetPhysicalDeviceDisplayPropertiesKHR = (PFN_vkGetPhysicalDeviceDisplayPropertiesKHR)dlSymFunc(lib, "vkGetPhysicalDeviceDisplayPropertiesKHR");
-    out->vkGetPhysicalDeviceDisplayPlanePropertiesKHR = (PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR)dlSymFunc(lib, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR");
-    out->vkGetDisplayPlaneSupportedDisplaysKHR = (PFN_vkGetDisplayPlaneSupportedDisplaysKHR)dlSymFunc(lib, "vkGetDisplayPlaneSupportedDisplaysKHR");
-    out->vkGetDisplayModePropertiesKHR = (PFN_vkGetDisplayModePropertiesKHR)dlSymFunc(lib, "vkGetDisplayModePropertiesKHR");
-    out->vkCreateDisplayModeKHR = (PFN_vkCreateDisplayModeKHR)dlSymFunc(lib, "vkCreateDisplayModeKHR");
-    out->vkGetDisplayPlaneCapabilitiesKHR = (PFN_vkGetDisplayPlaneCapabilitiesKHR)dlSymFunc(lib, "vkGetDisplayPlaneCapabilitiesKHR");
+    out->vkGetPhysicalDeviceDisplayPropertiesKHR =
+        (PFN_vkGetPhysicalDeviceDisplayPropertiesKHR)dlSymFunc(
+            lib, "vkGetPhysicalDeviceDisplayPropertiesKHR");
+    out->vkGetPhysicalDeviceDisplayPlanePropertiesKHR =
+        (PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR)dlSymFunc(
+            lib, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR");
+    out->vkGetDisplayPlaneSupportedDisplaysKHR =
+        (PFN_vkGetDisplayPlaneSupportedDisplaysKHR)dlSymFunc(
+            lib, "vkGetDisplayPlaneSupportedDisplaysKHR");
+    out->vkGetDisplayModePropertiesKHR =
+        (PFN_vkGetDisplayModePropertiesKHR)dlSymFunc(lib, "vkGetDisplayModePropertiesKHR");
+    out->vkCreateDisplayModeKHR =
+        (PFN_vkCreateDisplayModeKHR)dlSymFunc(lib, "vkCreateDisplayModeKHR");
+    out->vkGetDisplayPlaneCapabilitiesKHR =
+        (PFN_vkGetDisplayPlaneCapabilitiesKHR)dlSymFunc(lib, "vkGetDisplayPlaneCapabilitiesKHR");
 #endif
 #ifdef VK_KHR_display_swapchain
-    out->vkCreateSharedSwapchainsKHR = (PFN_vkCreateSharedSwapchainsKHR)dlSymFunc(lib, "vkCreateSharedSwapchainsKHR");
+    out->vkCreateSharedSwapchainsKHR =
+        (PFN_vkCreateSharedSwapchainsKHR)dlSymFunc(lib, "vkCreateSharedSwapchainsKHR");
 #endif
 #ifdef VK_KHR_wayland_surface
-    out->vkGetPhysicalDeviceWaylandPresentationSupportKHR = (PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR)dlSymFunc(lib, "vkGetPhysicalDeviceWaylandPresentationSupportKHR");
+    out->vkGetPhysicalDeviceWaylandPresentationSupportKHR =
+        (PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR)dlSymFunc(
+            lib, "vkGetPhysicalDeviceWaylandPresentationSupportKHR");
 #endif
 #ifdef VK_KHR_video_queue
-    out->vkGetPhysicalDeviceVideoCapabilitiesKHR = (PFN_vkGetPhysicalDeviceVideoCapabilitiesKHR)dlSymFunc(lib, "vkGetPhysicalDeviceVideoCapabilitiesKHR");
-    out->vkGetPhysicalDeviceVideoFormatPropertiesKHR = (PFN_vkGetPhysicalDeviceVideoFormatPropertiesKHR)dlSymFunc(lib, "vkGetPhysicalDeviceVideoFormatPropertiesKHR");
-    out->vkCreateVideoSessionKHR = (PFN_vkCreateVideoSessionKHR)dlSymFunc(lib, "vkCreateVideoSessionKHR");
-    out->vkDestroyVideoSessionKHR = (PFN_vkDestroyVideoSessionKHR)dlSymFunc(lib, "vkDestroyVideoSessionKHR");
-    out->vkGetVideoSessionMemoryRequirementsKHR = (PFN_vkGetVideoSessionMemoryRequirementsKHR)dlSymFunc(lib, "vkGetVideoSessionMemoryRequirementsKHR");
-    out->vkBindVideoSessionMemoryKHR = (PFN_vkBindVideoSessionMemoryKHR)dlSymFunc(lib, "vkBindVideoSessionMemoryKHR");
-    out->vkCreateVideoSessionParametersKHR = (PFN_vkCreateVideoSessionParametersKHR)dlSymFunc(lib, "vkCreateVideoSessionParametersKHR");
-    out->vkUpdateVideoSessionParametersKHR = (PFN_vkUpdateVideoSessionParametersKHR)dlSymFunc(lib, "vkUpdateVideoSessionParametersKHR");
-    out->vkDestroyVideoSessionParametersKHR = (PFN_vkDestroyVideoSessionParametersKHR)dlSymFunc(lib, "vkDestroyVideoSessionParametersKHR");
-    out->vkCmdBeginVideoCodingKHR = (PFN_vkCmdBeginVideoCodingKHR)dlSymFunc(lib, "vkCmdBeginVideoCodingKHR");
-    out->vkCmdEndVideoCodingKHR = (PFN_vkCmdEndVideoCodingKHR)dlSymFunc(lib, "vkCmdEndVideoCodingKHR");
-    out->vkCmdControlVideoCodingKHR = (PFN_vkCmdControlVideoCodingKHR)dlSymFunc(lib, "vkCmdControlVideoCodingKHR");
+    out->vkGetPhysicalDeviceVideoCapabilitiesKHR =
+        (PFN_vkGetPhysicalDeviceVideoCapabilitiesKHR)dlSymFunc(
+            lib, "vkGetPhysicalDeviceVideoCapabilitiesKHR");
+    out->vkGetPhysicalDeviceVideoFormatPropertiesKHR =
+        (PFN_vkGetPhysicalDeviceVideoFormatPropertiesKHR)dlSymFunc(
+            lib, "vkGetPhysicalDeviceVideoFormatPropertiesKHR");
+    out->vkCreateVideoSessionKHR =
+        (PFN_vkCreateVideoSessionKHR)dlSymFunc(lib, "vkCreateVideoSessionKHR");
+    out->vkDestroyVideoSessionKHR =
+        (PFN_vkDestroyVideoSessionKHR)dlSymFunc(lib, "vkDestroyVideoSessionKHR");
+    out->vkGetVideoSessionMemoryRequirementsKHR =
+        (PFN_vkGetVideoSessionMemoryRequirementsKHR)dlSymFunc(
+            lib, "vkGetVideoSessionMemoryRequirementsKHR");
+    out->vkBindVideoSessionMemoryKHR =
+        (PFN_vkBindVideoSessionMemoryKHR)dlSymFunc(lib, "vkBindVideoSessionMemoryKHR");
+    out->vkCreateVideoSessionParametersKHR =
+        (PFN_vkCreateVideoSessionParametersKHR)dlSymFunc(lib, "vkCreateVideoSessionParametersKHR");
+    out->vkUpdateVideoSessionParametersKHR =
+        (PFN_vkUpdateVideoSessionParametersKHR)dlSymFunc(lib, "vkUpdateVideoSessionParametersKHR");
+    out->vkDestroyVideoSessionParametersKHR = (PFN_vkDestroyVideoSessionParametersKHR)dlSymFunc(
+        lib, "vkDestroyVideoSessionParametersKHR");
+    out->vkCmdBeginVideoCodingKHR =
+        (PFN_vkCmdBeginVideoCodingKHR)dlSymFunc(lib, "vkCmdBeginVideoCodingKHR");
+    out->vkCmdEndVideoCodingKHR =
+        (PFN_vkCmdEndVideoCodingKHR)dlSymFunc(lib, "vkCmdEndVideoCodingKHR");
+    out->vkCmdControlVideoCodingKHR =
+        (PFN_vkCmdControlVideoCodingKHR)dlSymFunc(lib, "vkCmdControlVideoCodingKHR");
 #endif
 #ifdef VK_KHR_video_decode_queue
     out->vkCmdDecodeVideoKHR = (PFN_vkCmdDecodeVideoKHR)dlSymFunc(lib, "vkCmdDecodeVideoKHR");
 #endif
 #ifdef VK_KHR_dynamic_rendering
-    out->vkCmdBeginRenderingKHR = (PFN_vkCmdBeginRenderingKHR)dlSymFunc(lib, "vkCmdBeginRenderingKHR");
+    out->vkCmdBeginRenderingKHR =
+        (PFN_vkCmdBeginRenderingKHR)dlSymFunc(lib, "vkCmdBeginRenderingKHR");
     out->vkCmdEndRenderingKHR = (PFN_vkCmdEndRenderingKHR)dlSymFunc(lib, "vkCmdEndRenderingKHR");
 #endif
 #ifdef VK_KHR_get_physical_device_properties2
-    out->vkGetPhysicalDeviceFeatures2KHR = (PFN_vkGetPhysicalDeviceFeatures2KHR)dlSymFunc(lib, "vkGetPhysicalDeviceFeatures2KHR");
-    out->vkGetPhysicalDeviceProperties2KHR = (PFN_vkGetPhysicalDeviceProperties2KHR)dlSymFunc(lib, "vkGetPhysicalDeviceProperties2KHR");
-    out->vkGetPhysicalDeviceFormatProperties2KHR = (PFN_vkGetPhysicalDeviceFormatProperties2KHR)dlSymFunc(lib, "vkGetPhysicalDeviceFormatProperties2KHR");
-    out->vkGetPhysicalDeviceImageFormatProperties2KHR = (PFN_vkGetPhysicalDeviceImageFormatProperties2KHR)dlSymFunc(lib, "vkGetPhysicalDeviceImageFormatProperties2KHR");
-    out->vkGetPhysicalDeviceQueueFamilyProperties2KHR = (PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR)dlSymFunc(lib, "vkGetPhysicalDeviceQueueFamilyProperties2KHR");
-    out->vkGetPhysicalDeviceMemoryProperties2KHR = (PFN_vkGetPhysicalDeviceMemoryProperties2KHR)dlSymFunc(lib, "vkGetPhysicalDeviceMemoryProperties2KHR");
-    out->vkGetPhysicalDeviceSparseImageFormatProperties2KHR = (PFN_vkGetPhysicalDeviceSparseImageFormatProperties2KHR)dlSymFunc(lib, "vkGetPhysicalDeviceSparseImageFormatProperties2KHR");
+    out->vkGetPhysicalDeviceFeatures2KHR =
+        (PFN_vkGetPhysicalDeviceFeatures2KHR)dlSymFunc(lib, "vkGetPhysicalDeviceFeatures2KHR");
+    out->vkGetPhysicalDeviceProperties2KHR =
+        (PFN_vkGetPhysicalDeviceProperties2KHR)dlSymFunc(lib, "vkGetPhysicalDeviceProperties2KHR");
+    out->vkGetPhysicalDeviceFormatProperties2KHR =
+        (PFN_vkGetPhysicalDeviceFormatProperties2KHR)dlSymFunc(
+            lib, "vkGetPhysicalDeviceFormatProperties2KHR");
+    out->vkGetPhysicalDeviceImageFormatProperties2KHR =
+        (PFN_vkGetPhysicalDeviceImageFormatProperties2KHR)dlSymFunc(
+            lib, "vkGetPhysicalDeviceImageFormatProperties2KHR");
+    out->vkGetPhysicalDeviceQueueFamilyProperties2KHR =
+        (PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR)dlSymFunc(
+            lib, "vkGetPhysicalDeviceQueueFamilyProperties2KHR");
+    out->vkGetPhysicalDeviceMemoryProperties2KHR =
+        (PFN_vkGetPhysicalDeviceMemoryProperties2KHR)dlSymFunc(
+            lib, "vkGetPhysicalDeviceMemoryProperties2KHR");
+    out->vkGetPhysicalDeviceSparseImageFormatProperties2KHR =
+        (PFN_vkGetPhysicalDeviceSparseImageFormatProperties2KHR)dlSymFunc(
+            lib, "vkGetPhysicalDeviceSparseImageFormatProperties2KHR");
 #endif
 #ifdef VK_KHR_device_group
-    out->vkGetDeviceGroupPeerMemoryFeaturesKHR = (PFN_vkGetDeviceGroupPeerMemoryFeaturesKHR)dlSymFunc(lib, "vkGetDeviceGroupPeerMemoryFeaturesKHR");
+    out->vkGetDeviceGroupPeerMemoryFeaturesKHR =
+        (PFN_vkGetDeviceGroupPeerMemoryFeaturesKHR)dlSymFunc(
+            lib, "vkGetDeviceGroupPeerMemoryFeaturesKHR");
     out->vkCmdSetDeviceMaskKHR = (PFN_vkCmdSetDeviceMaskKHR)dlSymFunc(lib, "vkCmdSetDeviceMaskKHR");
     out->vkCmdDispatchBaseKHR = (PFN_vkCmdDispatchBaseKHR)dlSymFunc(lib, "vkCmdDispatchBaseKHR");
 #endif
@@ -908,120 +1073,188 @@
     out->vkTrimCommandPoolKHR = (PFN_vkTrimCommandPoolKHR)dlSymFunc(lib, "vkTrimCommandPoolKHR");
 #endif
 #ifdef VK_KHR_external_memory_capabilities
-    out->vkGetPhysicalDeviceExternalBufferPropertiesKHR = (PFN_vkGetPhysicalDeviceExternalBufferPropertiesKHR)dlSymFunc(lib, "vkGetPhysicalDeviceExternalBufferPropertiesKHR");
+    out->vkGetPhysicalDeviceExternalBufferPropertiesKHR =
+        (PFN_vkGetPhysicalDeviceExternalBufferPropertiesKHR)dlSymFunc(
+            lib, "vkGetPhysicalDeviceExternalBufferPropertiesKHR");
 #endif
 #ifdef VK_KHR_external_memory_win32
-    out->vkGetMemoryWin32HandleKHR = (PFN_vkGetMemoryWin32HandleKHR)dlSymFunc(lib, "vkGetMemoryWin32HandleKHR");
-    out->vkGetMemoryWin32HandlePropertiesKHR = (PFN_vkGetMemoryWin32HandlePropertiesKHR)dlSymFunc(lib, "vkGetMemoryWin32HandlePropertiesKHR");
+    out->vkGetMemoryWin32HandleKHR =
+        (PFN_vkGetMemoryWin32HandleKHR)dlSymFunc(lib, "vkGetMemoryWin32HandleKHR");
+    out->vkGetMemoryWin32HandlePropertiesKHR = (PFN_vkGetMemoryWin32HandlePropertiesKHR)dlSymFunc(
+        lib, "vkGetMemoryWin32HandlePropertiesKHR");
 #endif
 #ifdef VK_KHR_external_memory_fd
     out->vkGetMemoryFdKHR = (PFN_vkGetMemoryFdKHR)dlSymFunc(lib, "vkGetMemoryFdKHR");
-    out->vkGetMemoryFdPropertiesKHR = (PFN_vkGetMemoryFdPropertiesKHR)dlSymFunc(lib, "vkGetMemoryFdPropertiesKHR");
+    out->vkGetMemoryFdPropertiesKHR =
+        (PFN_vkGetMemoryFdPropertiesKHR)dlSymFunc(lib, "vkGetMemoryFdPropertiesKHR");
 #endif
 #ifdef VK_KHR_external_semaphore_capabilities
-    out->vkGetPhysicalDeviceExternalSemaphorePropertiesKHR = (PFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR)dlSymFunc(lib, "vkGetPhysicalDeviceExternalSemaphorePropertiesKHR");
+    out->vkGetPhysicalDeviceExternalSemaphorePropertiesKHR =
+        (PFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR)dlSymFunc(
+            lib, "vkGetPhysicalDeviceExternalSemaphorePropertiesKHR");
 #endif
 #ifdef VK_KHR_external_semaphore_win32
-    out->vkImportSemaphoreWin32HandleKHR = (PFN_vkImportSemaphoreWin32HandleKHR)dlSymFunc(lib, "vkImportSemaphoreWin32HandleKHR");
-    out->vkGetSemaphoreWin32HandleKHR = (PFN_vkGetSemaphoreWin32HandleKHR)dlSymFunc(lib, "vkGetSemaphoreWin32HandleKHR");
+    out->vkImportSemaphoreWin32HandleKHR =
+        (PFN_vkImportSemaphoreWin32HandleKHR)dlSymFunc(lib, "vkImportSemaphoreWin32HandleKHR");
+    out->vkGetSemaphoreWin32HandleKHR =
+        (PFN_vkGetSemaphoreWin32HandleKHR)dlSymFunc(lib, "vkGetSemaphoreWin32HandleKHR");
 #endif
 #ifdef VK_KHR_external_semaphore_fd
-    out->vkImportSemaphoreFdKHR = (PFN_vkImportSemaphoreFdKHR)dlSymFunc(lib, "vkImportSemaphoreFdKHR");
+    out->vkImportSemaphoreFdKHR =
+        (PFN_vkImportSemaphoreFdKHR)dlSymFunc(lib, "vkImportSemaphoreFdKHR");
     out->vkGetSemaphoreFdKHR = (PFN_vkGetSemaphoreFdKHR)dlSymFunc(lib, "vkGetSemaphoreFdKHR");
 #endif
 #ifdef VK_KHR_push_descriptor
-    out->vkCmdPushDescriptorSetKHR = (PFN_vkCmdPushDescriptorSetKHR)dlSymFunc(lib, "vkCmdPushDescriptorSetKHR");
-    out->vkCmdPushDescriptorSetWithTemplateKHR = (PFN_vkCmdPushDescriptorSetWithTemplateKHR)dlSymFunc(lib, "vkCmdPushDescriptorSetWithTemplateKHR");
+    out->vkCmdPushDescriptorSetKHR =
+        (PFN_vkCmdPushDescriptorSetKHR)dlSymFunc(lib, "vkCmdPushDescriptorSetKHR");
+    out->vkCmdPushDescriptorSetWithTemplateKHR =
+        (PFN_vkCmdPushDescriptorSetWithTemplateKHR)dlSymFunc(
+            lib, "vkCmdPushDescriptorSetWithTemplateKHR");
 #endif
 #ifdef VK_KHR_descriptor_update_template
-    out->vkCreateDescriptorUpdateTemplateKHR = (PFN_vkCreateDescriptorUpdateTemplateKHR)dlSymFunc(lib, "vkCreateDescriptorUpdateTemplateKHR");
-    out->vkDestroyDescriptorUpdateTemplateKHR = (PFN_vkDestroyDescriptorUpdateTemplateKHR)dlSymFunc(lib, "vkDestroyDescriptorUpdateTemplateKHR");
-    out->vkUpdateDescriptorSetWithTemplateKHR = (PFN_vkUpdateDescriptorSetWithTemplateKHR)dlSymFunc(lib, "vkUpdateDescriptorSetWithTemplateKHR");
+    out->vkCreateDescriptorUpdateTemplateKHR = (PFN_vkCreateDescriptorUpdateTemplateKHR)dlSymFunc(
+        lib, "vkCreateDescriptorUpdateTemplateKHR");
+    out->vkDestroyDescriptorUpdateTemplateKHR = (PFN_vkDestroyDescriptorUpdateTemplateKHR)dlSymFunc(
+        lib, "vkDestroyDescriptorUpdateTemplateKHR");
+    out->vkUpdateDescriptorSetWithTemplateKHR = (PFN_vkUpdateDescriptorSetWithTemplateKHR)dlSymFunc(
+        lib, "vkUpdateDescriptorSetWithTemplateKHR");
 #endif
 #ifdef VK_KHR_create_renderpass2
-    out->vkCreateRenderPass2KHR = (PFN_vkCreateRenderPass2KHR)dlSymFunc(lib, "vkCreateRenderPass2KHR");
-    out->vkCmdBeginRenderPass2KHR = (PFN_vkCmdBeginRenderPass2KHR)dlSymFunc(lib, "vkCmdBeginRenderPass2KHR");
+    out->vkCreateRenderPass2KHR =
+        (PFN_vkCreateRenderPass2KHR)dlSymFunc(lib, "vkCreateRenderPass2KHR");
+    out->vkCmdBeginRenderPass2KHR =
+        (PFN_vkCmdBeginRenderPass2KHR)dlSymFunc(lib, "vkCmdBeginRenderPass2KHR");
     out->vkCmdNextSubpass2KHR = (PFN_vkCmdNextSubpass2KHR)dlSymFunc(lib, "vkCmdNextSubpass2KHR");
-    out->vkCmdEndRenderPass2KHR = (PFN_vkCmdEndRenderPass2KHR)dlSymFunc(lib, "vkCmdEndRenderPass2KHR");
+    out->vkCmdEndRenderPass2KHR =
+        (PFN_vkCmdEndRenderPass2KHR)dlSymFunc(lib, "vkCmdEndRenderPass2KHR");
 #endif
 #ifdef VK_KHR_shared_presentable_image
-    out->vkGetSwapchainStatusKHR = (PFN_vkGetSwapchainStatusKHR)dlSymFunc(lib, "vkGetSwapchainStatusKHR");
+    out->vkGetSwapchainStatusKHR =
+        (PFN_vkGetSwapchainStatusKHR)dlSymFunc(lib, "vkGetSwapchainStatusKHR");
 #endif
 #ifdef VK_KHR_external_fence_capabilities
-    out->vkGetPhysicalDeviceExternalFencePropertiesKHR = (PFN_vkGetPhysicalDeviceExternalFencePropertiesKHR)dlSymFunc(lib, "vkGetPhysicalDeviceExternalFencePropertiesKHR");
+    out->vkGetPhysicalDeviceExternalFencePropertiesKHR =
+        (PFN_vkGetPhysicalDeviceExternalFencePropertiesKHR)dlSymFunc(
+            lib, "vkGetPhysicalDeviceExternalFencePropertiesKHR");
 #endif
 #ifdef VK_KHR_external_fence_win32
-    out->vkImportFenceWin32HandleKHR = (PFN_vkImportFenceWin32HandleKHR)dlSymFunc(lib, "vkImportFenceWin32HandleKHR");
-    out->vkGetFenceWin32HandleKHR = (PFN_vkGetFenceWin32HandleKHR)dlSymFunc(lib, "vkGetFenceWin32HandleKHR");
+    out->vkImportFenceWin32HandleKHR =
+        (PFN_vkImportFenceWin32HandleKHR)dlSymFunc(lib, "vkImportFenceWin32HandleKHR");
+    out->vkGetFenceWin32HandleKHR =
+        (PFN_vkGetFenceWin32HandleKHR)dlSymFunc(lib, "vkGetFenceWin32HandleKHR");
 #endif
 #ifdef VK_KHR_external_fence_fd
     out->vkImportFenceFdKHR = (PFN_vkImportFenceFdKHR)dlSymFunc(lib, "vkImportFenceFdKHR");
     out->vkGetFenceFdKHR = (PFN_vkGetFenceFdKHR)dlSymFunc(lib, "vkGetFenceFdKHR");
 #endif
 #ifdef VK_KHR_performance_query
-    out->vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR = (PFN_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR)dlSymFunc(lib, "vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR");
-    out->vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR = (PFN_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR)dlSymFunc(lib, "vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR");
-    out->vkAcquireProfilingLockKHR = (PFN_vkAcquireProfilingLockKHR)dlSymFunc(lib, "vkAcquireProfilingLockKHR");
-    out->vkReleaseProfilingLockKHR = (PFN_vkReleaseProfilingLockKHR)dlSymFunc(lib, "vkReleaseProfilingLockKHR");
+    out->vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR =
+        (PFN_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR)dlSymFunc(
+            lib, "vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR");
+    out->vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR =
+        (PFN_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR)dlSymFunc(
+            lib, "vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR");
+    out->vkAcquireProfilingLockKHR =
+        (PFN_vkAcquireProfilingLockKHR)dlSymFunc(lib, "vkAcquireProfilingLockKHR");
+    out->vkReleaseProfilingLockKHR =
+        (PFN_vkReleaseProfilingLockKHR)dlSymFunc(lib, "vkReleaseProfilingLockKHR");
 #endif
 #ifdef VK_KHR_get_surface_capabilities2
-    out->vkGetPhysicalDeviceSurfaceCapabilities2KHR = (PFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR)dlSymFunc(lib, "vkGetPhysicalDeviceSurfaceCapabilities2KHR");
-    out->vkGetPhysicalDeviceSurfaceFormats2KHR = (PFN_vkGetPhysicalDeviceSurfaceFormats2KHR)dlSymFunc(lib, "vkGetPhysicalDeviceSurfaceFormats2KHR");
+    out->vkGetPhysicalDeviceSurfaceCapabilities2KHR =
+        (PFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR)dlSymFunc(
+            lib, "vkGetPhysicalDeviceSurfaceCapabilities2KHR");
+    out->vkGetPhysicalDeviceSurfaceFormats2KHR =
+        (PFN_vkGetPhysicalDeviceSurfaceFormats2KHR)dlSymFunc(
+            lib, "vkGetPhysicalDeviceSurfaceFormats2KHR");
 #endif
 #ifdef VK_KHR_get_display_properties2
-    out->vkGetPhysicalDeviceDisplayProperties2KHR = (PFN_vkGetPhysicalDeviceDisplayProperties2KHR)dlSymFunc(lib, "vkGetPhysicalDeviceDisplayProperties2KHR");
-    out->vkGetPhysicalDeviceDisplayPlaneProperties2KHR = (PFN_vkGetPhysicalDeviceDisplayPlaneProperties2KHR)dlSymFunc(lib, "vkGetPhysicalDeviceDisplayPlaneProperties2KHR");
-    out->vkGetDisplayModeProperties2KHR = (PFN_vkGetDisplayModeProperties2KHR)dlSymFunc(lib, "vkGetDisplayModeProperties2KHR");
-    out->vkGetDisplayPlaneCapabilities2KHR = (PFN_vkGetDisplayPlaneCapabilities2KHR)dlSymFunc(lib, "vkGetDisplayPlaneCapabilities2KHR");
+    out->vkGetPhysicalDeviceDisplayProperties2KHR =
+        (PFN_vkGetPhysicalDeviceDisplayProperties2KHR)dlSymFunc(
+            lib, "vkGetPhysicalDeviceDisplayProperties2KHR");
+    out->vkGetPhysicalDeviceDisplayPlaneProperties2KHR =
+        (PFN_vkGetPhysicalDeviceDisplayPlaneProperties2KHR)dlSymFunc(
+            lib, "vkGetPhysicalDeviceDisplayPlaneProperties2KHR");
+    out->vkGetDisplayModeProperties2KHR =
+        (PFN_vkGetDisplayModeProperties2KHR)dlSymFunc(lib, "vkGetDisplayModeProperties2KHR");
+    out->vkGetDisplayPlaneCapabilities2KHR =
+        (PFN_vkGetDisplayPlaneCapabilities2KHR)dlSymFunc(lib, "vkGetDisplayPlaneCapabilities2KHR");
 #endif
 #ifdef VK_KHR_get_memory_requirements2
-    out->vkGetImageMemoryRequirements2KHR = (PFN_vkGetImageMemoryRequirements2KHR)dlSymFunc(lib, "vkGetImageMemoryRequirements2KHR");
-    out->vkGetBufferMemoryRequirements2KHR = (PFN_vkGetBufferMemoryRequirements2KHR)dlSymFunc(lib, "vkGetBufferMemoryRequirements2KHR");
-    out->vkGetImageSparseMemoryRequirements2KHR = (PFN_vkGetImageSparseMemoryRequirements2KHR)dlSymFunc(lib, "vkGetImageSparseMemoryRequirements2KHR");
+    out->vkGetImageMemoryRequirements2KHR =
+        (PFN_vkGetImageMemoryRequirements2KHR)dlSymFunc(lib, "vkGetImageMemoryRequirements2KHR");
+    out->vkGetBufferMemoryRequirements2KHR =
+        (PFN_vkGetBufferMemoryRequirements2KHR)dlSymFunc(lib, "vkGetBufferMemoryRequirements2KHR");
+    out->vkGetImageSparseMemoryRequirements2KHR =
+        (PFN_vkGetImageSparseMemoryRequirements2KHR)dlSymFunc(
+            lib, "vkGetImageSparseMemoryRequirements2KHR");
 #endif
 #ifdef VK_KHR_sampler_ycbcr_conversion
-    out->vkCreateSamplerYcbcrConversionKHR = (PFN_vkCreateSamplerYcbcrConversionKHR)dlSymFunc(lib, "vkCreateSamplerYcbcrConversionKHR");
-    out->vkDestroySamplerYcbcrConversionKHR = (PFN_vkDestroySamplerYcbcrConversionKHR)dlSymFunc(lib, "vkDestroySamplerYcbcrConversionKHR");
+    out->vkCreateSamplerYcbcrConversionKHR =
+        (PFN_vkCreateSamplerYcbcrConversionKHR)dlSymFunc(lib, "vkCreateSamplerYcbcrConversionKHR");
+    out->vkDestroySamplerYcbcrConversionKHR = (PFN_vkDestroySamplerYcbcrConversionKHR)dlSymFunc(
+        lib, "vkDestroySamplerYcbcrConversionKHR");
 #endif
 #ifdef VK_KHR_bind_memory2
-    out->vkBindBufferMemory2KHR = (PFN_vkBindBufferMemory2KHR)dlSymFunc(lib, "vkBindBufferMemory2KHR");
+    out->vkBindBufferMemory2KHR =
+        (PFN_vkBindBufferMemory2KHR)dlSymFunc(lib, "vkBindBufferMemory2KHR");
     out->vkBindImageMemory2KHR = (PFN_vkBindImageMemory2KHR)dlSymFunc(lib, "vkBindImageMemory2KHR");
 #endif
 #ifdef VK_KHR_maintenance3
-    out->vkGetDescriptorSetLayoutSupportKHR = (PFN_vkGetDescriptorSetLayoutSupportKHR)dlSymFunc(lib, "vkGetDescriptorSetLayoutSupportKHR");
+    out->vkGetDescriptorSetLayoutSupportKHR = (PFN_vkGetDescriptorSetLayoutSupportKHR)dlSymFunc(
+        lib, "vkGetDescriptorSetLayoutSupportKHR");
 #endif
 #ifdef VK_KHR_draw_indirect_count
-    out->vkCmdDrawIndirectCountKHR = (PFN_vkCmdDrawIndirectCountKHR)dlSymFunc(lib, "vkCmdDrawIndirectCountKHR");
-    out->vkCmdDrawIndexedIndirectCountKHR = (PFN_vkCmdDrawIndexedIndirectCountKHR)dlSymFunc(lib, "vkCmdDrawIndexedIndirectCountKHR");
+    out->vkCmdDrawIndirectCountKHR =
+        (PFN_vkCmdDrawIndirectCountKHR)dlSymFunc(lib, "vkCmdDrawIndirectCountKHR");
+    out->vkCmdDrawIndexedIndirectCountKHR =
+        (PFN_vkCmdDrawIndexedIndirectCountKHR)dlSymFunc(lib, "vkCmdDrawIndexedIndirectCountKHR");
 #endif
 #ifdef VK_KHR_timeline_semaphore
-    out->vkGetSemaphoreCounterValueKHR = (PFN_vkGetSemaphoreCounterValueKHR)dlSymFunc(lib, "vkGetSemaphoreCounterValueKHR");
+    out->vkGetSemaphoreCounterValueKHR =
+        (PFN_vkGetSemaphoreCounterValueKHR)dlSymFunc(lib, "vkGetSemaphoreCounterValueKHR");
     out->vkWaitSemaphoresKHR = (PFN_vkWaitSemaphoresKHR)dlSymFunc(lib, "vkWaitSemaphoresKHR");
     out->vkSignalSemaphoreKHR = (PFN_vkSignalSemaphoreKHR)dlSymFunc(lib, "vkSignalSemaphoreKHR");
 #endif
 #ifdef VK_KHR_fragment_shading_rate
-    out->vkGetPhysicalDeviceFragmentShadingRatesKHR = (PFN_vkGetPhysicalDeviceFragmentShadingRatesKHR)dlSymFunc(lib, "vkGetPhysicalDeviceFragmentShadingRatesKHR");
-    out->vkCmdSetFragmentShadingRateKHR = (PFN_vkCmdSetFragmentShadingRateKHR)dlSymFunc(lib, "vkCmdSetFragmentShadingRateKHR");
+    out->vkGetPhysicalDeviceFragmentShadingRatesKHR =
+        (PFN_vkGetPhysicalDeviceFragmentShadingRatesKHR)dlSymFunc(
+            lib, "vkGetPhysicalDeviceFragmentShadingRatesKHR");
+    out->vkCmdSetFragmentShadingRateKHR =
+        (PFN_vkCmdSetFragmentShadingRateKHR)dlSymFunc(lib, "vkCmdSetFragmentShadingRateKHR");
 #endif
 #ifdef VK_KHR_present_wait
     out->vkWaitForPresentKHR = (PFN_vkWaitForPresentKHR)dlSymFunc(lib, "vkWaitForPresentKHR");
 #endif
 #ifdef VK_KHR_buffer_device_address
-    out->vkGetBufferDeviceAddressKHR = (PFN_vkGetBufferDeviceAddressKHR)dlSymFunc(lib, "vkGetBufferDeviceAddressKHR");
-    out->vkGetBufferOpaqueCaptureAddressKHR = (PFN_vkGetBufferOpaqueCaptureAddressKHR)dlSymFunc(lib, "vkGetBufferOpaqueCaptureAddressKHR");
-    out->vkGetDeviceMemoryOpaqueCaptureAddressKHR = (PFN_vkGetDeviceMemoryOpaqueCaptureAddressKHR)dlSymFunc(lib, "vkGetDeviceMemoryOpaqueCaptureAddressKHR");
+    out->vkGetBufferDeviceAddressKHR =
+        (PFN_vkGetBufferDeviceAddressKHR)dlSymFunc(lib, "vkGetBufferDeviceAddressKHR");
+    out->vkGetBufferOpaqueCaptureAddressKHR = (PFN_vkGetBufferOpaqueCaptureAddressKHR)dlSymFunc(
+        lib, "vkGetBufferOpaqueCaptureAddressKHR");
+    out->vkGetDeviceMemoryOpaqueCaptureAddressKHR =
+        (PFN_vkGetDeviceMemoryOpaqueCaptureAddressKHR)dlSymFunc(
+            lib, "vkGetDeviceMemoryOpaqueCaptureAddressKHR");
 #endif
 #ifdef VK_KHR_deferred_host_operations
-    out->vkCreateDeferredOperationKHR = (PFN_vkCreateDeferredOperationKHR)dlSymFunc(lib, "vkCreateDeferredOperationKHR");
-    out->vkDestroyDeferredOperationKHR = (PFN_vkDestroyDeferredOperationKHR)dlSymFunc(lib, "vkDestroyDeferredOperationKHR");
-    out->vkGetDeferredOperationMaxConcurrencyKHR = (PFN_vkGetDeferredOperationMaxConcurrencyKHR)dlSymFunc(lib, "vkGetDeferredOperationMaxConcurrencyKHR");
-    out->vkGetDeferredOperationResultKHR = (PFN_vkGetDeferredOperationResultKHR)dlSymFunc(lib, "vkGetDeferredOperationResultKHR");
-    out->vkDeferredOperationJoinKHR = (PFN_vkDeferredOperationJoinKHR)dlSymFunc(lib, "vkDeferredOperationJoinKHR");
+    out->vkCreateDeferredOperationKHR =
+        (PFN_vkCreateDeferredOperationKHR)dlSymFunc(lib, "vkCreateDeferredOperationKHR");
+    out->vkDestroyDeferredOperationKHR =
+        (PFN_vkDestroyDeferredOperationKHR)dlSymFunc(lib, "vkDestroyDeferredOperationKHR");
+    out->vkGetDeferredOperationMaxConcurrencyKHR =
+        (PFN_vkGetDeferredOperationMaxConcurrencyKHR)dlSymFunc(
+            lib, "vkGetDeferredOperationMaxConcurrencyKHR");
+    out->vkGetDeferredOperationResultKHR =
+        (PFN_vkGetDeferredOperationResultKHR)dlSymFunc(lib, "vkGetDeferredOperationResultKHR");
+    out->vkDeferredOperationJoinKHR =
+        (PFN_vkDeferredOperationJoinKHR)dlSymFunc(lib, "vkDeferredOperationJoinKHR");
 #endif
 #ifdef VK_KHR_pipeline_executable_properties
-    out->vkGetPipelineExecutablePropertiesKHR = (PFN_vkGetPipelineExecutablePropertiesKHR)dlSymFunc(lib, "vkGetPipelineExecutablePropertiesKHR");
-    out->vkGetPipelineExecutableStatisticsKHR = (PFN_vkGetPipelineExecutableStatisticsKHR)dlSymFunc(lib, "vkGetPipelineExecutableStatisticsKHR");
-    out->vkGetPipelineExecutableInternalRepresentationsKHR = (PFN_vkGetPipelineExecutableInternalRepresentationsKHR)dlSymFunc(lib, "vkGetPipelineExecutableInternalRepresentationsKHR");
+    out->vkGetPipelineExecutablePropertiesKHR = (PFN_vkGetPipelineExecutablePropertiesKHR)dlSymFunc(
+        lib, "vkGetPipelineExecutablePropertiesKHR");
+    out->vkGetPipelineExecutableStatisticsKHR = (PFN_vkGetPipelineExecutableStatisticsKHR)dlSymFunc(
+        lib, "vkGetPipelineExecutableStatisticsKHR");
+    out->vkGetPipelineExecutableInternalRepresentationsKHR =
+        (PFN_vkGetPipelineExecutableInternalRepresentationsKHR)dlSymFunc(
+            lib, "vkGetPipelineExecutableInternalRepresentationsKHR");
 #endif
 #ifdef VK_KHR_video_encode_queue
     out->vkCmdEncodeVideoKHR = (PFN_vkCmdEncodeVideoKHR)dlSymFunc(lib, "vkCmdEncodeVideoKHR");
@@ -1030,205 +1263,324 @@
     out->vkCmdSetEvent2KHR = (PFN_vkCmdSetEvent2KHR)dlSymFunc(lib, "vkCmdSetEvent2KHR");
     out->vkCmdResetEvent2KHR = (PFN_vkCmdResetEvent2KHR)dlSymFunc(lib, "vkCmdResetEvent2KHR");
     out->vkCmdWaitEvents2KHR = (PFN_vkCmdWaitEvents2KHR)dlSymFunc(lib, "vkCmdWaitEvents2KHR");
-    out->vkCmdPipelineBarrier2KHR = (PFN_vkCmdPipelineBarrier2KHR)dlSymFunc(lib, "vkCmdPipelineBarrier2KHR");
-    out->vkCmdWriteTimestamp2KHR = (PFN_vkCmdWriteTimestamp2KHR)dlSymFunc(lib, "vkCmdWriteTimestamp2KHR");
+    out->vkCmdPipelineBarrier2KHR =
+        (PFN_vkCmdPipelineBarrier2KHR)dlSymFunc(lib, "vkCmdPipelineBarrier2KHR");
+    out->vkCmdWriteTimestamp2KHR =
+        (PFN_vkCmdWriteTimestamp2KHR)dlSymFunc(lib, "vkCmdWriteTimestamp2KHR");
     out->vkQueueSubmit2KHR = (PFN_vkQueueSubmit2KHR)dlSymFunc(lib, "vkQueueSubmit2KHR");
-    out->vkCmdWriteBufferMarker2AMD = (PFN_vkCmdWriteBufferMarker2AMD)dlSymFunc(lib, "vkCmdWriteBufferMarker2AMD");
-    out->vkGetQueueCheckpointData2NV = (PFN_vkGetQueueCheckpointData2NV)dlSymFunc(lib, "vkGetQueueCheckpointData2NV");
+    out->vkCmdWriteBufferMarker2AMD =
+        (PFN_vkCmdWriteBufferMarker2AMD)dlSymFunc(lib, "vkCmdWriteBufferMarker2AMD");
+    out->vkGetQueueCheckpointData2NV =
+        (PFN_vkGetQueueCheckpointData2NV)dlSymFunc(lib, "vkGetQueueCheckpointData2NV");
 #endif
 #ifdef VK_KHR_copy_commands2
     out->vkCmdCopyBuffer2KHR = (PFN_vkCmdCopyBuffer2KHR)dlSymFunc(lib, "vkCmdCopyBuffer2KHR");
     out->vkCmdCopyImage2KHR = (PFN_vkCmdCopyImage2KHR)dlSymFunc(lib, "vkCmdCopyImage2KHR");
-    out->vkCmdCopyBufferToImage2KHR = (PFN_vkCmdCopyBufferToImage2KHR)dlSymFunc(lib, "vkCmdCopyBufferToImage2KHR");
-    out->vkCmdCopyImageToBuffer2KHR = (PFN_vkCmdCopyImageToBuffer2KHR)dlSymFunc(lib, "vkCmdCopyImageToBuffer2KHR");
+    out->vkCmdCopyBufferToImage2KHR =
+        (PFN_vkCmdCopyBufferToImage2KHR)dlSymFunc(lib, "vkCmdCopyBufferToImage2KHR");
+    out->vkCmdCopyImageToBuffer2KHR =
+        (PFN_vkCmdCopyImageToBuffer2KHR)dlSymFunc(lib, "vkCmdCopyImageToBuffer2KHR");
     out->vkCmdBlitImage2KHR = (PFN_vkCmdBlitImage2KHR)dlSymFunc(lib, "vkCmdBlitImage2KHR");
     out->vkCmdResolveImage2KHR = (PFN_vkCmdResolveImage2KHR)dlSymFunc(lib, "vkCmdResolveImage2KHR");
 #endif
 #ifdef VK_KHR_maintenance4
-    out->vkGetDeviceBufferMemoryRequirementsKHR = (PFN_vkGetDeviceBufferMemoryRequirementsKHR)dlSymFunc(lib, "vkGetDeviceBufferMemoryRequirementsKHR");
-    out->vkGetDeviceImageMemoryRequirementsKHR = (PFN_vkGetDeviceImageMemoryRequirementsKHR)dlSymFunc(lib, "vkGetDeviceImageMemoryRequirementsKHR");
-    out->vkGetDeviceImageSparseMemoryRequirementsKHR = (PFN_vkGetDeviceImageSparseMemoryRequirementsKHR)dlSymFunc(lib, "vkGetDeviceImageSparseMemoryRequirementsKHR");
+    out->vkGetDeviceBufferMemoryRequirementsKHR =
+        (PFN_vkGetDeviceBufferMemoryRequirementsKHR)dlSymFunc(
+            lib, "vkGetDeviceBufferMemoryRequirementsKHR");
+    out->vkGetDeviceImageMemoryRequirementsKHR =
+        (PFN_vkGetDeviceImageMemoryRequirementsKHR)dlSymFunc(
+            lib, "vkGetDeviceImageMemoryRequirementsKHR");
+    out->vkGetDeviceImageSparseMemoryRequirementsKHR =
+        (PFN_vkGetDeviceImageSparseMemoryRequirementsKHR)dlSymFunc(
+            lib, "vkGetDeviceImageSparseMemoryRequirementsKHR");
 #endif
 #ifdef VK_ANDROID_native_buffer
-    out->vkGetSwapchainGrallocUsageANDROID = (PFN_vkGetSwapchainGrallocUsageANDROID)dlSymFunc(lib, "vkGetSwapchainGrallocUsageANDROID");
+    out->vkGetSwapchainGrallocUsageANDROID =
+        (PFN_vkGetSwapchainGrallocUsageANDROID)dlSymFunc(lib, "vkGetSwapchainGrallocUsageANDROID");
     out->vkAcquireImageANDROID = (PFN_vkAcquireImageANDROID)dlSymFunc(lib, "vkAcquireImageANDROID");
-    out->vkQueueSignalReleaseImageANDROID = (PFN_vkQueueSignalReleaseImageANDROID)dlSymFunc(lib, "vkQueueSignalReleaseImageANDROID");
+    out->vkQueueSignalReleaseImageANDROID =
+        (PFN_vkQueueSignalReleaseImageANDROID)dlSymFunc(lib, "vkQueueSignalReleaseImageANDROID");
 #endif
 #ifdef VK_EXT_debug_marker
-    out->vkDebugMarkerSetObjectTagEXT = (PFN_vkDebugMarkerSetObjectTagEXT)dlSymFunc(lib, "vkDebugMarkerSetObjectTagEXT");
-    out->vkDebugMarkerSetObjectNameEXT = (PFN_vkDebugMarkerSetObjectNameEXT)dlSymFunc(lib, "vkDebugMarkerSetObjectNameEXT");
-    out->vkCmdDebugMarkerBeginEXT = (PFN_vkCmdDebugMarkerBeginEXT)dlSymFunc(lib, "vkCmdDebugMarkerBeginEXT");
-    out->vkCmdDebugMarkerEndEXT = (PFN_vkCmdDebugMarkerEndEXT)dlSymFunc(lib, "vkCmdDebugMarkerEndEXT");
-    out->vkCmdDebugMarkerInsertEXT = (PFN_vkCmdDebugMarkerInsertEXT)dlSymFunc(lib, "vkCmdDebugMarkerInsertEXT");
+    out->vkDebugMarkerSetObjectTagEXT =
+        (PFN_vkDebugMarkerSetObjectTagEXT)dlSymFunc(lib, "vkDebugMarkerSetObjectTagEXT");
+    out->vkDebugMarkerSetObjectNameEXT =
+        (PFN_vkDebugMarkerSetObjectNameEXT)dlSymFunc(lib, "vkDebugMarkerSetObjectNameEXT");
+    out->vkCmdDebugMarkerBeginEXT =
+        (PFN_vkCmdDebugMarkerBeginEXT)dlSymFunc(lib, "vkCmdDebugMarkerBeginEXT");
+    out->vkCmdDebugMarkerEndEXT =
+        (PFN_vkCmdDebugMarkerEndEXT)dlSymFunc(lib, "vkCmdDebugMarkerEndEXT");
+    out->vkCmdDebugMarkerInsertEXT =
+        (PFN_vkCmdDebugMarkerInsertEXT)dlSymFunc(lib, "vkCmdDebugMarkerInsertEXT");
 #endif
 #ifdef VK_EXT_transform_feedback
-    out->vkCmdBindTransformFeedbackBuffersEXT = (PFN_vkCmdBindTransformFeedbackBuffersEXT)dlSymFunc(lib, "vkCmdBindTransformFeedbackBuffersEXT");
-    out->vkCmdBeginTransformFeedbackEXT = (PFN_vkCmdBeginTransformFeedbackEXT)dlSymFunc(lib, "vkCmdBeginTransformFeedbackEXT");
-    out->vkCmdEndTransformFeedbackEXT = (PFN_vkCmdEndTransformFeedbackEXT)dlSymFunc(lib, "vkCmdEndTransformFeedbackEXT");
-    out->vkCmdBeginQueryIndexedEXT = (PFN_vkCmdBeginQueryIndexedEXT)dlSymFunc(lib, "vkCmdBeginQueryIndexedEXT");
-    out->vkCmdEndQueryIndexedEXT = (PFN_vkCmdEndQueryIndexedEXT)dlSymFunc(lib, "vkCmdEndQueryIndexedEXT");
-    out->vkCmdDrawIndirectByteCountEXT = (PFN_vkCmdDrawIndirectByteCountEXT)dlSymFunc(lib, "vkCmdDrawIndirectByteCountEXT");
+    out->vkCmdBindTransformFeedbackBuffersEXT = (PFN_vkCmdBindTransformFeedbackBuffersEXT)dlSymFunc(
+        lib, "vkCmdBindTransformFeedbackBuffersEXT");
+    out->vkCmdBeginTransformFeedbackEXT =
+        (PFN_vkCmdBeginTransformFeedbackEXT)dlSymFunc(lib, "vkCmdBeginTransformFeedbackEXT");
+    out->vkCmdEndTransformFeedbackEXT =
+        (PFN_vkCmdEndTransformFeedbackEXT)dlSymFunc(lib, "vkCmdEndTransformFeedbackEXT");
+    out->vkCmdBeginQueryIndexedEXT =
+        (PFN_vkCmdBeginQueryIndexedEXT)dlSymFunc(lib, "vkCmdBeginQueryIndexedEXT");
+    out->vkCmdEndQueryIndexedEXT =
+        (PFN_vkCmdEndQueryIndexedEXT)dlSymFunc(lib, "vkCmdEndQueryIndexedEXT");
+    out->vkCmdDrawIndirectByteCountEXT =
+        (PFN_vkCmdDrawIndirectByteCountEXT)dlSymFunc(lib, "vkCmdDrawIndirectByteCountEXT");
 #endif
 #ifdef VK_NVX_binary_import
     out->vkCreateCuModuleNVX = (PFN_vkCreateCuModuleNVX)dlSymFunc(lib, "vkCreateCuModuleNVX");
     out->vkCreateCuFunctionNVX = (PFN_vkCreateCuFunctionNVX)dlSymFunc(lib, "vkCreateCuFunctionNVX");
     out->vkDestroyCuModuleNVX = (PFN_vkDestroyCuModuleNVX)dlSymFunc(lib, "vkDestroyCuModuleNVX");
-    out->vkDestroyCuFunctionNVX = (PFN_vkDestroyCuFunctionNVX)dlSymFunc(lib, "vkDestroyCuFunctionNVX");
-    out->vkCmdCuLaunchKernelNVX = (PFN_vkCmdCuLaunchKernelNVX)dlSymFunc(lib, "vkCmdCuLaunchKernelNVX");
+    out->vkDestroyCuFunctionNVX =
+        (PFN_vkDestroyCuFunctionNVX)dlSymFunc(lib, "vkDestroyCuFunctionNVX");
+    out->vkCmdCuLaunchKernelNVX =
+        (PFN_vkCmdCuLaunchKernelNVX)dlSymFunc(lib, "vkCmdCuLaunchKernelNVX");
 #endif
 #ifdef VK_NVX_image_view_handle
-    out->vkGetImageViewHandleNVX = (PFN_vkGetImageViewHandleNVX)dlSymFunc(lib, "vkGetImageViewHandleNVX");
-    out->vkGetImageViewAddressNVX = (PFN_vkGetImageViewAddressNVX)dlSymFunc(lib, "vkGetImageViewAddressNVX");
+    out->vkGetImageViewHandleNVX =
+        (PFN_vkGetImageViewHandleNVX)dlSymFunc(lib, "vkGetImageViewHandleNVX");
+    out->vkGetImageViewAddressNVX =
+        (PFN_vkGetImageViewAddressNVX)dlSymFunc(lib, "vkGetImageViewAddressNVX");
 #endif
 #ifdef VK_AMD_draw_indirect_count
-    out->vkCmdDrawIndirectCountAMD = (PFN_vkCmdDrawIndirectCountAMD)dlSymFunc(lib, "vkCmdDrawIndirectCountAMD");
-    out->vkCmdDrawIndexedIndirectCountAMD = (PFN_vkCmdDrawIndexedIndirectCountAMD)dlSymFunc(lib, "vkCmdDrawIndexedIndirectCountAMD");
+    out->vkCmdDrawIndirectCountAMD =
+        (PFN_vkCmdDrawIndirectCountAMD)dlSymFunc(lib, "vkCmdDrawIndirectCountAMD");
+    out->vkCmdDrawIndexedIndirectCountAMD =
+        (PFN_vkCmdDrawIndexedIndirectCountAMD)dlSymFunc(lib, "vkCmdDrawIndexedIndirectCountAMD");
 #endif
 #ifdef VK_AMD_shader_info
     out->vkGetShaderInfoAMD = (PFN_vkGetShaderInfoAMD)dlSymFunc(lib, "vkGetShaderInfoAMD");
 #endif
 #ifdef VK_NV_external_memory_capabilities
-    out->vkGetPhysicalDeviceExternalImageFormatPropertiesNV = (PFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV)dlSymFunc(lib, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV");
+    out->vkGetPhysicalDeviceExternalImageFormatPropertiesNV =
+        (PFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV)dlSymFunc(
+            lib, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV");
 #endif
 #ifdef VK_NV_external_memory_win32
-    out->vkGetMemoryWin32HandleNV = (PFN_vkGetMemoryWin32HandleNV)dlSymFunc(lib, "vkGetMemoryWin32HandleNV");
+    out->vkGetMemoryWin32HandleNV =
+        (PFN_vkGetMemoryWin32HandleNV)dlSymFunc(lib, "vkGetMemoryWin32HandleNV");
 #endif
 #ifdef VK_EXT_conditional_rendering
-    out->vkCmdBeginConditionalRenderingEXT = (PFN_vkCmdBeginConditionalRenderingEXT)dlSymFunc(lib, "vkCmdBeginConditionalRenderingEXT");
-    out->vkCmdEndConditionalRenderingEXT = (PFN_vkCmdEndConditionalRenderingEXT)dlSymFunc(lib, "vkCmdEndConditionalRenderingEXT");
+    out->vkCmdBeginConditionalRenderingEXT =
+        (PFN_vkCmdBeginConditionalRenderingEXT)dlSymFunc(lib, "vkCmdBeginConditionalRenderingEXT");
+    out->vkCmdEndConditionalRenderingEXT =
+        (PFN_vkCmdEndConditionalRenderingEXT)dlSymFunc(lib, "vkCmdEndConditionalRenderingEXT");
 #endif
 #ifdef VK_NV_clip_space_w_scaling
-    out->vkCmdSetViewportWScalingNV = (PFN_vkCmdSetViewportWScalingNV)dlSymFunc(lib, "vkCmdSetViewportWScalingNV");
+    out->vkCmdSetViewportWScalingNV =
+        (PFN_vkCmdSetViewportWScalingNV)dlSymFunc(lib, "vkCmdSetViewportWScalingNV");
 #endif
 #ifdef VK_EXT_direct_mode_display
     out->vkReleaseDisplayEXT = (PFN_vkReleaseDisplayEXT)dlSymFunc(lib, "vkReleaseDisplayEXT");
 #endif
 #ifdef VK_EXT_acquire_xlib_display
-    out->vkAcquireXlibDisplayEXT = (PFN_vkAcquireXlibDisplayEXT)dlSymFunc(lib, "vkAcquireXlibDisplayEXT");
-    out->vkGetRandROutputDisplayEXT = (PFN_vkGetRandROutputDisplayEXT)dlSymFunc(lib, "vkGetRandROutputDisplayEXT");
+    out->vkAcquireXlibDisplayEXT =
+        (PFN_vkAcquireXlibDisplayEXT)dlSymFunc(lib, "vkAcquireXlibDisplayEXT");
+    out->vkGetRandROutputDisplayEXT =
+        (PFN_vkGetRandROutputDisplayEXT)dlSymFunc(lib, "vkGetRandROutputDisplayEXT");
 #endif
 #ifdef VK_EXT_display_surface_counter
-    out->vkGetPhysicalDeviceSurfaceCapabilities2EXT = (PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT)dlSymFunc(lib, "vkGetPhysicalDeviceSurfaceCapabilities2EXT");
+    out->vkGetPhysicalDeviceSurfaceCapabilities2EXT =
+        (PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT)dlSymFunc(
+            lib, "vkGetPhysicalDeviceSurfaceCapabilities2EXT");
 #endif
 #ifdef VK_EXT_display_control
-    out->vkDisplayPowerControlEXT = (PFN_vkDisplayPowerControlEXT)dlSymFunc(lib, "vkDisplayPowerControlEXT");
-    out->vkRegisterDeviceEventEXT = (PFN_vkRegisterDeviceEventEXT)dlSymFunc(lib, "vkRegisterDeviceEventEXT");
-    out->vkRegisterDisplayEventEXT = (PFN_vkRegisterDisplayEventEXT)dlSymFunc(lib, "vkRegisterDisplayEventEXT");
-    out->vkGetSwapchainCounterEXT = (PFN_vkGetSwapchainCounterEXT)dlSymFunc(lib, "vkGetSwapchainCounterEXT");
+    out->vkDisplayPowerControlEXT =
+        (PFN_vkDisplayPowerControlEXT)dlSymFunc(lib, "vkDisplayPowerControlEXT");
+    out->vkRegisterDeviceEventEXT =
+        (PFN_vkRegisterDeviceEventEXT)dlSymFunc(lib, "vkRegisterDeviceEventEXT");
+    out->vkRegisterDisplayEventEXT =
+        (PFN_vkRegisterDisplayEventEXT)dlSymFunc(lib, "vkRegisterDisplayEventEXT");
+    out->vkGetSwapchainCounterEXT =
+        (PFN_vkGetSwapchainCounterEXT)dlSymFunc(lib, "vkGetSwapchainCounterEXT");
 #endif
 #ifdef VK_GOOGLE_display_timing
-    out->vkGetRefreshCycleDurationGOOGLE = (PFN_vkGetRefreshCycleDurationGOOGLE)dlSymFunc(lib, "vkGetRefreshCycleDurationGOOGLE");
-    out->vkGetPastPresentationTimingGOOGLE = (PFN_vkGetPastPresentationTimingGOOGLE)dlSymFunc(lib, "vkGetPastPresentationTimingGOOGLE");
+    out->vkGetRefreshCycleDurationGOOGLE =
+        (PFN_vkGetRefreshCycleDurationGOOGLE)dlSymFunc(lib, "vkGetRefreshCycleDurationGOOGLE");
+    out->vkGetPastPresentationTimingGOOGLE =
+        (PFN_vkGetPastPresentationTimingGOOGLE)dlSymFunc(lib, "vkGetPastPresentationTimingGOOGLE");
 #endif
 #ifdef VK_EXT_discard_rectangles
-    out->vkCmdSetDiscardRectangleEXT = (PFN_vkCmdSetDiscardRectangleEXT)dlSymFunc(lib, "vkCmdSetDiscardRectangleEXT");
+    out->vkCmdSetDiscardRectangleEXT =
+        (PFN_vkCmdSetDiscardRectangleEXT)dlSymFunc(lib, "vkCmdSetDiscardRectangleEXT");
 #endif
 #ifdef VK_EXT_hdr_metadata
     out->vkSetHdrMetadataEXT = (PFN_vkSetHdrMetadataEXT)dlSymFunc(lib, "vkSetHdrMetadataEXT");
 #endif
 #ifdef VK_EXT_debug_utils
-    out->vkSetDebugUtilsObjectNameEXT = (PFN_vkSetDebugUtilsObjectNameEXT)dlSymFunc(lib, "vkSetDebugUtilsObjectNameEXT");
-    out->vkSetDebugUtilsObjectTagEXT = (PFN_vkSetDebugUtilsObjectTagEXT)dlSymFunc(lib, "vkSetDebugUtilsObjectTagEXT");
-    out->vkQueueBeginDebugUtilsLabelEXT = (PFN_vkQueueBeginDebugUtilsLabelEXT)dlSymFunc(lib, "vkQueueBeginDebugUtilsLabelEXT");
-    out->vkQueueEndDebugUtilsLabelEXT = (PFN_vkQueueEndDebugUtilsLabelEXT)dlSymFunc(lib, "vkQueueEndDebugUtilsLabelEXT");
-    out->vkQueueInsertDebugUtilsLabelEXT = (PFN_vkQueueInsertDebugUtilsLabelEXT)dlSymFunc(lib, "vkQueueInsertDebugUtilsLabelEXT");
-    out->vkCmdBeginDebugUtilsLabelEXT = (PFN_vkCmdBeginDebugUtilsLabelEXT)dlSymFunc(lib, "vkCmdBeginDebugUtilsLabelEXT");
-    out->vkCmdEndDebugUtilsLabelEXT = (PFN_vkCmdEndDebugUtilsLabelEXT)dlSymFunc(lib, "vkCmdEndDebugUtilsLabelEXT");
-    out->vkCmdInsertDebugUtilsLabelEXT = (PFN_vkCmdInsertDebugUtilsLabelEXT)dlSymFunc(lib, "vkCmdInsertDebugUtilsLabelEXT");
+    out->vkSetDebugUtilsObjectNameEXT =
+        (PFN_vkSetDebugUtilsObjectNameEXT)dlSymFunc(lib, "vkSetDebugUtilsObjectNameEXT");
+    out->vkSetDebugUtilsObjectTagEXT =
+        (PFN_vkSetDebugUtilsObjectTagEXT)dlSymFunc(lib, "vkSetDebugUtilsObjectTagEXT");
+    out->vkQueueBeginDebugUtilsLabelEXT =
+        (PFN_vkQueueBeginDebugUtilsLabelEXT)dlSymFunc(lib, "vkQueueBeginDebugUtilsLabelEXT");
+    out->vkQueueEndDebugUtilsLabelEXT =
+        (PFN_vkQueueEndDebugUtilsLabelEXT)dlSymFunc(lib, "vkQueueEndDebugUtilsLabelEXT");
+    out->vkQueueInsertDebugUtilsLabelEXT =
+        (PFN_vkQueueInsertDebugUtilsLabelEXT)dlSymFunc(lib, "vkQueueInsertDebugUtilsLabelEXT");
+    out->vkCmdBeginDebugUtilsLabelEXT =
+        (PFN_vkCmdBeginDebugUtilsLabelEXT)dlSymFunc(lib, "vkCmdBeginDebugUtilsLabelEXT");
+    out->vkCmdEndDebugUtilsLabelEXT =
+        (PFN_vkCmdEndDebugUtilsLabelEXT)dlSymFunc(lib, "vkCmdEndDebugUtilsLabelEXT");
+    out->vkCmdInsertDebugUtilsLabelEXT =
+        (PFN_vkCmdInsertDebugUtilsLabelEXT)dlSymFunc(lib, "vkCmdInsertDebugUtilsLabelEXT");
 #endif
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
-    out->vkGetAndroidHardwareBufferPropertiesANDROID = (PFN_vkGetAndroidHardwareBufferPropertiesANDROID)dlSymFunc(lib, "vkGetAndroidHardwareBufferPropertiesANDROID");
-    out->vkGetMemoryAndroidHardwareBufferANDROID = (PFN_vkGetMemoryAndroidHardwareBufferANDROID)dlSymFunc(lib, "vkGetMemoryAndroidHardwareBufferANDROID");
+    out->vkGetAndroidHardwareBufferPropertiesANDROID =
+        (PFN_vkGetAndroidHardwareBufferPropertiesANDROID)dlSymFunc(
+            lib, "vkGetAndroidHardwareBufferPropertiesANDROID");
+    out->vkGetMemoryAndroidHardwareBufferANDROID =
+        (PFN_vkGetMemoryAndroidHardwareBufferANDROID)dlSymFunc(
+            lib, "vkGetMemoryAndroidHardwareBufferANDROID");
 #endif
 #ifdef VK_EXT_sample_locations
-    out->vkCmdSetSampleLocationsEXT = (PFN_vkCmdSetSampleLocationsEXT)dlSymFunc(lib, "vkCmdSetSampleLocationsEXT");
-    out->vkGetPhysicalDeviceMultisamplePropertiesEXT = (PFN_vkGetPhysicalDeviceMultisamplePropertiesEXT)dlSymFunc(lib, "vkGetPhysicalDeviceMultisamplePropertiesEXT");
+    out->vkCmdSetSampleLocationsEXT =
+        (PFN_vkCmdSetSampleLocationsEXT)dlSymFunc(lib, "vkCmdSetSampleLocationsEXT");
+    out->vkGetPhysicalDeviceMultisamplePropertiesEXT =
+        (PFN_vkGetPhysicalDeviceMultisamplePropertiesEXT)dlSymFunc(
+            lib, "vkGetPhysicalDeviceMultisamplePropertiesEXT");
 #endif
 #ifdef VK_EXT_image_drm_format_modifier
-    out->vkGetImageDrmFormatModifierPropertiesEXT = (PFN_vkGetImageDrmFormatModifierPropertiesEXT)dlSymFunc(lib, "vkGetImageDrmFormatModifierPropertiesEXT");
+    out->vkGetImageDrmFormatModifierPropertiesEXT =
+        (PFN_vkGetImageDrmFormatModifierPropertiesEXT)dlSymFunc(
+            lib, "vkGetImageDrmFormatModifierPropertiesEXT");
 #endif
 #ifdef VK_EXT_validation_cache
-    out->vkCreateValidationCacheEXT = (PFN_vkCreateValidationCacheEXT)dlSymFunc(lib, "vkCreateValidationCacheEXT");
-    out->vkDestroyValidationCacheEXT = (PFN_vkDestroyValidationCacheEXT)dlSymFunc(lib, "vkDestroyValidationCacheEXT");
-    out->vkMergeValidationCachesEXT = (PFN_vkMergeValidationCachesEXT)dlSymFunc(lib, "vkMergeValidationCachesEXT");
-    out->vkGetValidationCacheDataEXT = (PFN_vkGetValidationCacheDataEXT)dlSymFunc(lib, "vkGetValidationCacheDataEXT");
+    out->vkCreateValidationCacheEXT =
+        (PFN_vkCreateValidationCacheEXT)dlSymFunc(lib, "vkCreateValidationCacheEXT");
+    out->vkDestroyValidationCacheEXT =
+        (PFN_vkDestroyValidationCacheEXT)dlSymFunc(lib, "vkDestroyValidationCacheEXT");
+    out->vkMergeValidationCachesEXT =
+        (PFN_vkMergeValidationCachesEXT)dlSymFunc(lib, "vkMergeValidationCachesEXT");
+    out->vkGetValidationCacheDataEXT =
+        (PFN_vkGetValidationCacheDataEXT)dlSymFunc(lib, "vkGetValidationCacheDataEXT");
 #endif
 #ifdef VK_NV_shading_rate_image
-    out->vkCmdBindShadingRateImageNV = (PFN_vkCmdBindShadingRateImageNV)dlSymFunc(lib, "vkCmdBindShadingRateImageNV");
-    out->vkCmdSetViewportShadingRatePaletteNV = (PFN_vkCmdSetViewportShadingRatePaletteNV)dlSymFunc(lib, "vkCmdSetViewportShadingRatePaletteNV");
-    out->vkCmdSetCoarseSampleOrderNV = (PFN_vkCmdSetCoarseSampleOrderNV)dlSymFunc(lib, "vkCmdSetCoarseSampleOrderNV");
+    out->vkCmdBindShadingRateImageNV =
+        (PFN_vkCmdBindShadingRateImageNV)dlSymFunc(lib, "vkCmdBindShadingRateImageNV");
+    out->vkCmdSetViewportShadingRatePaletteNV = (PFN_vkCmdSetViewportShadingRatePaletteNV)dlSymFunc(
+        lib, "vkCmdSetViewportShadingRatePaletteNV");
+    out->vkCmdSetCoarseSampleOrderNV =
+        (PFN_vkCmdSetCoarseSampleOrderNV)dlSymFunc(lib, "vkCmdSetCoarseSampleOrderNV");
 #endif
 #ifdef VK_NV_ray_tracing
-    out->vkCreateAccelerationStructureNV = (PFN_vkCreateAccelerationStructureNV)dlSymFunc(lib, "vkCreateAccelerationStructureNV");
-    out->vkDestroyAccelerationStructureNV = (PFN_vkDestroyAccelerationStructureNV)dlSymFunc(lib, "vkDestroyAccelerationStructureNV");
-    out->vkGetAccelerationStructureMemoryRequirementsNV = (PFN_vkGetAccelerationStructureMemoryRequirementsNV)dlSymFunc(lib, "vkGetAccelerationStructureMemoryRequirementsNV");
-    out->vkBindAccelerationStructureMemoryNV = (PFN_vkBindAccelerationStructureMemoryNV)dlSymFunc(lib, "vkBindAccelerationStructureMemoryNV");
-    out->vkCmdBuildAccelerationStructureNV = (PFN_vkCmdBuildAccelerationStructureNV)dlSymFunc(lib, "vkCmdBuildAccelerationStructureNV");
-    out->vkCmdCopyAccelerationStructureNV = (PFN_vkCmdCopyAccelerationStructureNV)dlSymFunc(lib, "vkCmdCopyAccelerationStructureNV");
+    out->vkCreateAccelerationStructureNV =
+        (PFN_vkCreateAccelerationStructureNV)dlSymFunc(lib, "vkCreateAccelerationStructureNV");
+    out->vkDestroyAccelerationStructureNV =
+        (PFN_vkDestroyAccelerationStructureNV)dlSymFunc(lib, "vkDestroyAccelerationStructureNV");
+    out->vkGetAccelerationStructureMemoryRequirementsNV =
+        (PFN_vkGetAccelerationStructureMemoryRequirementsNV)dlSymFunc(
+            lib, "vkGetAccelerationStructureMemoryRequirementsNV");
+    out->vkBindAccelerationStructureMemoryNV = (PFN_vkBindAccelerationStructureMemoryNV)dlSymFunc(
+        lib, "vkBindAccelerationStructureMemoryNV");
+    out->vkCmdBuildAccelerationStructureNV =
+        (PFN_vkCmdBuildAccelerationStructureNV)dlSymFunc(lib, "vkCmdBuildAccelerationStructureNV");
+    out->vkCmdCopyAccelerationStructureNV =
+        (PFN_vkCmdCopyAccelerationStructureNV)dlSymFunc(lib, "vkCmdCopyAccelerationStructureNV");
     out->vkCmdTraceRaysNV = (PFN_vkCmdTraceRaysNV)dlSymFunc(lib, "vkCmdTraceRaysNV");
-    out->vkCreateRayTracingPipelinesNV = (PFN_vkCreateRayTracingPipelinesNV)dlSymFunc(lib, "vkCreateRayTracingPipelinesNV");
-    out->vkGetRayTracingShaderGroupHandlesKHR = (PFN_vkGetRayTracingShaderGroupHandlesKHR)dlSymFunc(lib, "vkGetRayTracingShaderGroupHandlesKHR");
-    out->vkGetRayTracingShaderGroupHandlesNV = (PFN_vkGetRayTracingShaderGroupHandlesNV)dlSymFunc(lib, "vkGetRayTracingShaderGroupHandlesNV");
-    out->vkGetAccelerationStructureHandleNV = (PFN_vkGetAccelerationStructureHandleNV)dlSymFunc(lib, "vkGetAccelerationStructureHandleNV");
-    out->vkCmdWriteAccelerationStructuresPropertiesNV = (PFN_vkCmdWriteAccelerationStructuresPropertiesNV)dlSymFunc(lib, "vkCmdWriteAccelerationStructuresPropertiesNV");
+    out->vkCreateRayTracingPipelinesNV =
+        (PFN_vkCreateRayTracingPipelinesNV)dlSymFunc(lib, "vkCreateRayTracingPipelinesNV");
+    out->vkGetRayTracingShaderGroupHandlesKHR = (PFN_vkGetRayTracingShaderGroupHandlesKHR)dlSymFunc(
+        lib, "vkGetRayTracingShaderGroupHandlesKHR");
+    out->vkGetRayTracingShaderGroupHandlesNV = (PFN_vkGetRayTracingShaderGroupHandlesNV)dlSymFunc(
+        lib, "vkGetRayTracingShaderGroupHandlesNV");
+    out->vkGetAccelerationStructureHandleNV = (PFN_vkGetAccelerationStructureHandleNV)dlSymFunc(
+        lib, "vkGetAccelerationStructureHandleNV");
+    out->vkCmdWriteAccelerationStructuresPropertiesNV =
+        (PFN_vkCmdWriteAccelerationStructuresPropertiesNV)dlSymFunc(
+            lib, "vkCmdWriteAccelerationStructuresPropertiesNV");
     out->vkCompileDeferredNV = (PFN_vkCompileDeferredNV)dlSymFunc(lib, "vkCompileDeferredNV");
 #endif
 #ifdef VK_EXT_external_memory_host
-    out->vkGetMemoryHostPointerPropertiesEXT = (PFN_vkGetMemoryHostPointerPropertiesEXT)dlSymFunc(lib, "vkGetMemoryHostPointerPropertiesEXT");
+    out->vkGetMemoryHostPointerPropertiesEXT = (PFN_vkGetMemoryHostPointerPropertiesEXT)dlSymFunc(
+        lib, "vkGetMemoryHostPointerPropertiesEXT");
 #endif
 #ifdef VK_AMD_buffer_marker
-    out->vkCmdWriteBufferMarkerAMD = (PFN_vkCmdWriteBufferMarkerAMD)dlSymFunc(lib, "vkCmdWriteBufferMarkerAMD");
+    out->vkCmdWriteBufferMarkerAMD =
+        (PFN_vkCmdWriteBufferMarkerAMD)dlSymFunc(lib, "vkCmdWriteBufferMarkerAMD");
 #endif
 #ifdef VK_EXT_calibrated_timestamps
-    out->vkGetPhysicalDeviceCalibrateableTimeDomainsEXT = (PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT)dlSymFunc(lib, "vkGetPhysicalDeviceCalibrateableTimeDomainsEXT");
-    out->vkGetCalibratedTimestampsEXT = (PFN_vkGetCalibratedTimestampsEXT)dlSymFunc(lib, "vkGetCalibratedTimestampsEXT");
+    out->vkGetPhysicalDeviceCalibrateableTimeDomainsEXT =
+        (PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT)dlSymFunc(
+            lib, "vkGetPhysicalDeviceCalibrateableTimeDomainsEXT");
+    out->vkGetCalibratedTimestampsEXT =
+        (PFN_vkGetCalibratedTimestampsEXT)dlSymFunc(lib, "vkGetCalibratedTimestampsEXT");
 #endif
 #ifdef VK_NV_mesh_shader
     out->vkCmdDrawMeshTasksNV = (PFN_vkCmdDrawMeshTasksNV)dlSymFunc(lib, "vkCmdDrawMeshTasksNV");
-    out->vkCmdDrawMeshTasksIndirectNV = (PFN_vkCmdDrawMeshTasksIndirectNV)dlSymFunc(lib, "vkCmdDrawMeshTasksIndirectNV");
-    out->vkCmdDrawMeshTasksIndirectCountNV = (PFN_vkCmdDrawMeshTasksIndirectCountNV)dlSymFunc(lib, "vkCmdDrawMeshTasksIndirectCountNV");
+    out->vkCmdDrawMeshTasksIndirectNV =
+        (PFN_vkCmdDrawMeshTasksIndirectNV)dlSymFunc(lib, "vkCmdDrawMeshTasksIndirectNV");
+    out->vkCmdDrawMeshTasksIndirectCountNV =
+        (PFN_vkCmdDrawMeshTasksIndirectCountNV)dlSymFunc(lib, "vkCmdDrawMeshTasksIndirectCountNV");
 #endif
 #ifdef VK_NV_scissor_exclusive
-    out->vkCmdSetExclusiveScissorNV = (PFN_vkCmdSetExclusiveScissorNV)dlSymFunc(lib, "vkCmdSetExclusiveScissorNV");
+    out->vkCmdSetExclusiveScissorNV =
+        (PFN_vkCmdSetExclusiveScissorNV)dlSymFunc(lib, "vkCmdSetExclusiveScissorNV");
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
     out->vkCmdSetCheckpointNV = (PFN_vkCmdSetCheckpointNV)dlSymFunc(lib, "vkCmdSetCheckpointNV");
-    out->vkGetQueueCheckpointDataNV = (PFN_vkGetQueueCheckpointDataNV)dlSymFunc(lib, "vkGetQueueCheckpointDataNV");
+    out->vkGetQueueCheckpointDataNV =
+        (PFN_vkGetQueueCheckpointDataNV)dlSymFunc(lib, "vkGetQueueCheckpointDataNV");
 #endif
 #ifdef VK_INTEL_performance_query
-    out->vkInitializePerformanceApiINTEL = (PFN_vkInitializePerformanceApiINTEL)dlSymFunc(lib, "vkInitializePerformanceApiINTEL");
-    out->vkUninitializePerformanceApiINTEL = (PFN_vkUninitializePerformanceApiINTEL)dlSymFunc(lib, "vkUninitializePerformanceApiINTEL");
-    out->vkCmdSetPerformanceMarkerINTEL = (PFN_vkCmdSetPerformanceMarkerINTEL)dlSymFunc(lib, "vkCmdSetPerformanceMarkerINTEL");
-    out->vkCmdSetPerformanceStreamMarkerINTEL = (PFN_vkCmdSetPerformanceStreamMarkerINTEL)dlSymFunc(lib, "vkCmdSetPerformanceStreamMarkerINTEL");
-    out->vkCmdSetPerformanceOverrideINTEL = (PFN_vkCmdSetPerformanceOverrideINTEL)dlSymFunc(lib, "vkCmdSetPerformanceOverrideINTEL");
-    out->vkAcquirePerformanceConfigurationINTEL = (PFN_vkAcquirePerformanceConfigurationINTEL)dlSymFunc(lib, "vkAcquirePerformanceConfigurationINTEL");
-    out->vkReleasePerformanceConfigurationINTEL = (PFN_vkReleasePerformanceConfigurationINTEL)dlSymFunc(lib, "vkReleasePerformanceConfigurationINTEL");
-    out->vkQueueSetPerformanceConfigurationINTEL = (PFN_vkQueueSetPerformanceConfigurationINTEL)dlSymFunc(lib, "vkQueueSetPerformanceConfigurationINTEL");
-    out->vkGetPerformanceParameterINTEL = (PFN_vkGetPerformanceParameterINTEL)dlSymFunc(lib, "vkGetPerformanceParameterINTEL");
+    out->vkInitializePerformanceApiINTEL =
+        (PFN_vkInitializePerformanceApiINTEL)dlSymFunc(lib, "vkInitializePerformanceApiINTEL");
+    out->vkUninitializePerformanceApiINTEL =
+        (PFN_vkUninitializePerformanceApiINTEL)dlSymFunc(lib, "vkUninitializePerformanceApiINTEL");
+    out->vkCmdSetPerformanceMarkerINTEL =
+        (PFN_vkCmdSetPerformanceMarkerINTEL)dlSymFunc(lib, "vkCmdSetPerformanceMarkerINTEL");
+    out->vkCmdSetPerformanceStreamMarkerINTEL = (PFN_vkCmdSetPerformanceStreamMarkerINTEL)dlSymFunc(
+        lib, "vkCmdSetPerformanceStreamMarkerINTEL");
+    out->vkCmdSetPerformanceOverrideINTEL =
+        (PFN_vkCmdSetPerformanceOverrideINTEL)dlSymFunc(lib, "vkCmdSetPerformanceOverrideINTEL");
+    out->vkAcquirePerformanceConfigurationINTEL =
+        (PFN_vkAcquirePerformanceConfigurationINTEL)dlSymFunc(
+            lib, "vkAcquirePerformanceConfigurationINTEL");
+    out->vkReleasePerformanceConfigurationINTEL =
+        (PFN_vkReleasePerformanceConfigurationINTEL)dlSymFunc(
+            lib, "vkReleasePerformanceConfigurationINTEL");
+    out->vkQueueSetPerformanceConfigurationINTEL =
+        (PFN_vkQueueSetPerformanceConfigurationINTEL)dlSymFunc(
+            lib, "vkQueueSetPerformanceConfigurationINTEL");
+    out->vkGetPerformanceParameterINTEL =
+        (PFN_vkGetPerformanceParameterINTEL)dlSymFunc(lib, "vkGetPerformanceParameterINTEL");
 #endif
 #ifdef VK_AMD_display_native_hdr
     out->vkSetLocalDimmingAMD = (PFN_vkSetLocalDimmingAMD)dlSymFunc(lib, "vkSetLocalDimmingAMD");
 #endif
 #ifdef VK_EXT_buffer_device_address
-    out->vkGetBufferDeviceAddressEXT = (PFN_vkGetBufferDeviceAddressEXT)dlSymFunc(lib, "vkGetBufferDeviceAddressEXT");
+    out->vkGetBufferDeviceAddressEXT =
+        (PFN_vkGetBufferDeviceAddressEXT)dlSymFunc(lib, "vkGetBufferDeviceAddressEXT");
 #endif
 #ifdef VK_EXT_tooling_info
-    out->vkGetPhysicalDeviceToolPropertiesEXT = (PFN_vkGetPhysicalDeviceToolPropertiesEXT)dlSymFunc(lib, "vkGetPhysicalDeviceToolPropertiesEXT");
+    out->vkGetPhysicalDeviceToolPropertiesEXT = (PFN_vkGetPhysicalDeviceToolPropertiesEXT)dlSymFunc(
+        lib, "vkGetPhysicalDeviceToolPropertiesEXT");
 #endif
 #ifdef VK_NV_cooperative_matrix
-    out->vkGetPhysicalDeviceCooperativeMatrixPropertiesNV = (PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV)dlSymFunc(lib, "vkGetPhysicalDeviceCooperativeMatrixPropertiesNV");
+    out->vkGetPhysicalDeviceCooperativeMatrixPropertiesNV =
+        (PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV)dlSymFunc(
+            lib, "vkGetPhysicalDeviceCooperativeMatrixPropertiesNV");
 #endif
 #ifdef VK_NV_coverage_reduction_mode
-    out->vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV = (PFN_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV)dlSymFunc(lib, "vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV");
+    out->vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV =
+        (PFN_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV)dlSymFunc(
+            lib, "vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV");
 #endif
 #ifdef VK_EXT_full_screen_exclusive
-    out->vkGetPhysicalDeviceSurfacePresentModes2EXT = (PFN_vkGetPhysicalDeviceSurfacePresentModes2EXT)dlSymFunc(lib, "vkGetPhysicalDeviceSurfacePresentModes2EXT");
-    out->vkAcquireFullScreenExclusiveModeEXT = (PFN_vkAcquireFullScreenExclusiveModeEXT)dlSymFunc(lib, "vkAcquireFullScreenExclusiveModeEXT");
-    out->vkReleaseFullScreenExclusiveModeEXT = (PFN_vkReleaseFullScreenExclusiveModeEXT)dlSymFunc(lib, "vkReleaseFullScreenExclusiveModeEXT");
-    out->vkGetDeviceGroupSurfacePresentModes2EXT = (PFN_vkGetDeviceGroupSurfacePresentModes2EXT)dlSymFunc(lib, "vkGetDeviceGroupSurfacePresentModes2EXT");
+    out->vkGetPhysicalDeviceSurfacePresentModes2EXT =
+        (PFN_vkGetPhysicalDeviceSurfacePresentModes2EXT)dlSymFunc(
+            lib, "vkGetPhysicalDeviceSurfacePresentModes2EXT");
+    out->vkAcquireFullScreenExclusiveModeEXT = (PFN_vkAcquireFullScreenExclusiveModeEXT)dlSymFunc(
+        lib, "vkAcquireFullScreenExclusiveModeEXT");
+    out->vkReleaseFullScreenExclusiveModeEXT = (PFN_vkReleaseFullScreenExclusiveModeEXT)dlSymFunc(
+        lib, "vkReleaseFullScreenExclusiveModeEXT");
+    out->vkGetDeviceGroupSurfacePresentModes2EXT =
+        (PFN_vkGetDeviceGroupSurfacePresentModes2EXT)dlSymFunc(
+            lib, "vkGetDeviceGroupSurfacePresentModes2EXT");
 #endif
 #ifdef VK_EXT_line_rasterization
-    out->vkCmdSetLineStippleEXT = (PFN_vkCmdSetLineStippleEXT)dlSymFunc(lib, "vkCmdSetLineStippleEXT");
+    out->vkCmdSetLineStippleEXT =
+        (PFN_vkCmdSetLineStippleEXT)dlSymFunc(lib, "vkCmdSetLineStippleEXT");
 #endif
 #ifdef VK_EXT_host_query_reset
     out->vkResetQueryPoolEXT = (PFN_vkResetQueryPoolEXT)dlSymFunc(lib, "vkResetQueryPoolEXT");
@@ -1236,142 +1588,251 @@
 #ifdef VK_EXT_extended_dynamic_state
     out->vkCmdSetCullModeEXT = (PFN_vkCmdSetCullModeEXT)dlSymFunc(lib, "vkCmdSetCullModeEXT");
     out->vkCmdSetFrontFaceEXT = (PFN_vkCmdSetFrontFaceEXT)dlSymFunc(lib, "vkCmdSetFrontFaceEXT");
-    out->vkCmdSetPrimitiveTopologyEXT = (PFN_vkCmdSetPrimitiveTopologyEXT)dlSymFunc(lib, "vkCmdSetPrimitiveTopologyEXT");
-    out->vkCmdSetViewportWithCountEXT = (PFN_vkCmdSetViewportWithCountEXT)dlSymFunc(lib, "vkCmdSetViewportWithCountEXT");
-    out->vkCmdSetScissorWithCountEXT = (PFN_vkCmdSetScissorWithCountEXT)dlSymFunc(lib, "vkCmdSetScissorWithCountEXT");
-    out->vkCmdBindVertexBuffers2EXT = (PFN_vkCmdBindVertexBuffers2EXT)dlSymFunc(lib, "vkCmdBindVertexBuffers2EXT");
-    out->vkCmdSetDepthTestEnableEXT = (PFN_vkCmdSetDepthTestEnableEXT)dlSymFunc(lib, "vkCmdSetDepthTestEnableEXT");
-    out->vkCmdSetDepthWriteEnableEXT = (PFN_vkCmdSetDepthWriteEnableEXT)dlSymFunc(lib, "vkCmdSetDepthWriteEnableEXT");
-    out->vkCmdSetDepthCompareOpEXT = (PFN_vkCmdSetDepthCompareOpEXT)dlSymFunc(lib, "vkCmdSetDepthCompareOpEXT");
-    out->vkCmdSetDepthBoundsTestEnableEXT = (PFN_vkCmdSetDepthBoundsTestEnableEXT)dlSymFunc(lib, "vkCmdSetDepthBoundsTestEnableEXT");
-    out->vkCmdSetStencilTestEnableEXT = (PFN_vkCmdSetStencilTestEnableEXT)dlSymFunc(lib, "vkCmdSetStencilTestEnableEXT");
+    out->vkCmdSetPrimitiveTopologyEXT =
+        (PFN_vkCmdSetPrimitiveTopologyEXT)dlSymFunc(lib, "vkCmdSetPrimitiveTopologyEXT");
+    out->vkCmdSetViewportWithCountEXT =
+        (PFN_vkCmdSetViewportWithCountEXT)dlSymFunc(lib, "vkCmdSetViewportWithCountEXT");
+    out->vkCmdSetScissorWithCountEXT =
+        (PFN_vkCmdSetScissorWithCountEXT)dlSymFunc(lib, "vkCmdSetScissorWithCountEXT");
+    out->vkCmdBindVertexBuffers2EXT =
+        (PFN_vkCmdBindVertexBuffers2EXT)dlSymFunc(lib, "vkCmdBindVertexBuffers2EXT");
+    out->vkCmdSetDepthTestEnableEXT =
+        (PFN_vkCmdSetDepthTestEnableEXT)dlSymFunc(lib, "vkCmdSetDepthTestEnableEXT");
+    out->vkCmdSetDepthWriteEnableEXT =
+        (PFN_vkCmdSetDepthWriteEnableEXT)dlSymFunc(lib, "vkCmdSetDepthWriteEnableEXT");
+    out->vkCmdSetDepthCompareOpEXT =
+        (PFN_vkCmdSetDepthCompareOpEXT)dlSymFunc(lib, "vkCmdSetDepthCompareOpEXT");
+    out->vkCmdSetDepthBoundsTestEnableEXT =
+        (PFN_vkCmdSetDepthBoundsTestEnableEXT)dlSymFunc(lib, "vkCmdSetDepthBoundsTestEnableEXT");
+    out->vkCmdSetStencilTestEnableEXT =
+        (PFN_vkCmdSetStencilTestEnableEXT)dlSymFunc(lib, "vkCmdSetStencilTestEnableEXT");
     out->vkCmdSetStencilOpEXT = (PFN_vkCmdSetStencilOpEXT)dlSymFunc(lib, "vkCmdSetStencilOpEXT");
 #endif
 #ifdef VK_NV_device_generated_commands
-    out->vkGetGeneratedCommandsMemoryRequirementsNV = (PFN_vkGetGeneratedCommandsMemoryRequirementsNV)dlSymFunc(lib, "vkGetGeneratedCommandsMemoryRequirementsNV");
-    out->vkCmdPreprocessGeneratedCommandsNV = (PFN_vkCmdPreprocessGeneratedCommandsNV)dlSymFunc(lib, "vkCmdPreprocessGeneratedCommandsNV");
-    out->vkCmdExecuteGeneratedCommandsNV = (PFN_vkCmdExecuteGeneratedCommandsNV)dlSymFunc(lib, "vkCmdExecuteGeneratedCommandsNV");
-    out->vkCmdBindPipelineShaderGroupNV = (PFN_vkCmdBindPipelineShaderGroupNV)dlSymFunc(lib, "vkCmdBindPipelineShaderGroupNV");
-    out->vkCreateIndirectCommandsLayoutNV = (PFN_vkCreateIndirectCommandsLayoutNV)dlSymFunc(lib, "vkCreateIndirectCommandsLayoutNV");
-    out->vkDestroyIndirectCommandsLayoutNV = (PFN_vkDestroyIndirectCommandsLayoutNV)dlSymFunc(lib, "vkDestroyIndirectCommandsLayoutNV");
+    out->vkGetGeneratedCommandsMemoryRequirementsNV =
+        (PFN_vkGetGeneratedCommandsMemoryRequirementsNV)dlSymFunc(
+            lib, "vkGetGeneratedCommandsMemoryRequirementsNV");
+    out->vkCmdPreprocessGeneratedCommandsNV = (PFN_vkCmdPreprocessGeneratedCommandsNV)dlSymFunc(
+        lib, "vkCmdPreprocessGeneratedCommandsNV");
+    out->vkCmdExecuteGeneratedCommandsNV =
+        (PFN_vkCmdExecuteGeneratedCommandsNV)dlSymFunc(lib, "vkCmdExecuteGeneratedCommandsNV");
+    out->vkCmdBindPipelineShaderGroupNV =
+        (PFN_vkCmdBindPipelineShaderGroupNV)dlSymFunc(lib, "vkCmdBindPipelineShaderGroupNV");
+    out->vkCreateIndirectCommandsLayoutNV =
+        (PFN_vkCreateIndirectCommandsLayoutNV)dlSymFunc(lib, "vkCreateIndirectCommandsLayoutNV");
+    out->vkDestroyIndirectCommandsLayoutNV =
+        (PFN_vkDestroyIndirectCommandsLayoutNV)dlSymFunc(lib, "vkDestroyIndirectCommandsLayoutNV");
 #endif
 #ifdef VK_EXT_acquire_drm_display
-    out->vkAcquireDrmDisplayEXT = (PFN_vkAcquireDrmDisplayEXT)dlSymFunc(lib, "vkAcquireDrmDisplayEXT");
+    out->vkAcquireDrmDisplayEXT =
+        (PFN_vkAcquireDrmDisplayEXT)dlSymFunc(lib, "vkAcquireDrmDisplayEXT");
     out->vkGetDrmDisplayEXT = (PFN_vkGetDrmDisplayEXT)dlSymFunc(lib, "vkGetDrmDisplayEXT");
 #endif
 #ifdef VK_EXT_private_data
-    out->vkCreatePrivateDataSlotEXT = (PFN_vkCreatePrivateDataSlotEXT)dlSymFunc(lib, "vkCreatePrivateDataSlotEXT");
-    out->vkDestroyPrivateDataSlotEXT = (PFN_vkDestroyPrivateDataSlotEXT)dlSymFunc(lib, "vkDestroyPrivateDataSlotEXT");
+    out->vkCreatePrivateDataSlotEXT =
+        (PFN_vkCreatePrivateDataSlotEXT)dlSymFunc(lib, "vkCreatePrivateDataSlotEXT");
+    out->vkDestroyPrivateDataSlotEXT =
+        (PFN_vkDestroyPrivateDataSlotEXT)dlSymFunc(lib, "vkDestroyPrivateDataSlotEXT");
     out->vkSetPrivateDataEXT = (PFN_vkSetPrivateDataEXT)dlSymFunc(lib, "vkSetPrivateDataEXT");
     out->vkGetPrivateDataEXT = (PFN_vkGetPrivateDataEXT)dlSymFunc(lib, "vkGetPrivateDataEXT");
 #endif
 #ifdef VK_NV_fragment_shading_rate_enums
-    out->vkCmdSetFragmentShadingRateEnumNV = (PFN_vkCmdSetFragmentShadingRateEnumNV)dlSymFunc(lib, "vkCmdSetFragmentShadingRateEnumNV");
+    out->vkCmdSetFragmentShadingRateEnumNV =
+        (PFN_vkCmdSetFragmentShadingRateEnumNV)dlSymFunc(lib, "vkCmdSetFragmentShadingRateEnumNV");
 #endif
 #ifdef VK_NV_acquire_winrt_display
-    out->vkAcquireWinrtDisplayNV = (PFN_vkAcquireWinrtDisplayNV)dlSymFunc(lib, "vkAcquireWinrtDisplayNV");
+    out->vkAcquireWinrtDisplayNV =
+        (PFN_vkAcquireWinrtDisplayNV)dlSymFunc(lib, "vkAcquireWinrtDisplayNV");
     out->vkGetWinrtDisplayNV = (PFN_vkGetWinrtDisplayNV)dlSymFunc(lib, "vkGetWinrtDisplayNV");
 #endif
 #ifdef VK_EXT_directfb_surface
-    out->vkGetPhysicalDeviceDirectFBPresentationSupportEXT = (PFN_vkGetPhysicalDeviceDirectFBPresentationSupportEXT)dlSymFunc(lib, "vkGetPhysicalDeviceDirectFBPresentationSupportEXT");
+    out->vkGetPhysicalDeviceDirectFBPresentationSupportEXT =
+        (PFN_vkGetPhysicalDeviceDirectFBPresentationSupportEXT)dlSymFunc(
+            lib, "vkGetPhysicalDeviceDirectFBPresentationSupportEXT");
 #endif
 #ifdef VK_EXT_vertex_input_dynamic_state
-    out->vkCmdSetVertexInputEXT = (PFN_vkCmdSetVertexInputEXT)dlSymFunc(lib, "vkCmdSetVertexInputEXT");
+    out->vkCmdSetVertexInputEXT =
+        (PFN_vkCmdSetVertexInputEXT)dlSymFunc(lib, "vkCmdSetVertexInputEXT");
 #endif
 #ifdef VK_FUCHSIA_external_memory
-    out->vkGetMemoryZirconHandleFUCHSIA = (PFN_vkGetMemoryZirconHandleFUCHSIA)dlSymFunc(lib, "vkGetMemoryZirconHandleFUCHSIA");
-    out->vkGetMemoryZirconHandlePropertiesFUCHSIA = (PFN_vkGetMemoryZirconHandlePropertiesFUCHSIA)dlSymFunc(lib, "vkGetMemoryZirconHandlePropertiesFUCHSIA");
+    out->vkGetMemoryZirconHandleFUCHSIA =
+        (PFN_vkGetMemoryZirconHandleFUCHSIA)dlSymFunc(lib, "vkGetMemoryZirconHandleFUCHSIA");
+    out->vkGetMemoryZirconHandlePropertiesFUCHSIA =
+        (PFN_vkGetMemoryZirconHandlePropertiesFUCHSIA)dlSymFunc(
+            lib, "vkGetMemoryZirconHandlePropertiesFUCHSIA");
 #endif
 #ifdef VK_FUCHSIA_external_semaphore
-    out->vkImportSemaphoreZirconHandleFUCHSIA = (PFN_vkImportSemaphoreZirconHandleFUCHSIA)dlSymFunc(lib, "vkImportSemaphoreZirconHandleFUCHSIA");
-    out->vkGetSemaphoreZirconHandleFUCHSIA = (PFN_vkGetSemaphoreZirconHandleFUCHSIA)dlSymFunc(lib, "vkGetSemaphoreZirconHandleFUCHSIA");
+    out->vkImportSemaphoreZirconHandleFUCHSIA = (PFN_vkImportSemaphoreZirconHandleFUCHSIA)dlSymFunc(
+        lib, "vkImportSemaphoreZirconHandleFUCHSIA");
+    out->vkGetSemaphoreZirconHandleFUCHSIA =
+        (PFN_vkGetSemaphoreZirconHandleFUCHSIA)dlSymFunc(lib, "vkGetSemaphoreZirconHandleFUCHSIA");
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
-    out->vkCreateBufferCollectionFUCHSIA = (PFN_vkCreateBufferCollectionFUCHSIA)dlSymFunc(lib, "vkCreateBufferCollectionFUCHSIA");
-    out->vkSetBufferCollectionImageConstraintsFUCHSIA = (PFN_vkSetBufferCollectionImageConstraintsFUCHSIA)dlSymFunc(lib, "vkSetBufferCollectionImageConstraintsFUCHSIA");
-    out->vkSetBufferCollectionBufferConstraintsFUCHSIA = (PFN_vkSetBufferCollectionBufferConstraintsFUCHSIA)dlSymFunc(lib, "vkSetBufferCollectionBufferConstraintsFUCHSIA");
-    out->vkDestroyBufferCollectionFUCHSIA = (PFN_vkDestroyBufferCollectionFUCHSIA)dlSymFunc(lib, "vkDestroyBufferCollectionFUCHSIA");
-    out->vkGetBufferCollectionPropertiesFUCHSIA = (PFN_vkGetBufferCollectionPropertiesFUCHSIA)dlSymFunc(lib, "vkGetBufferCollectionPropertiesFUCHSIA");
+    out->vkCreateBufferCollectionFUCHSIA =
+        (PFN_vkCreateBufferCollectionFUCHSIA)dlSymFunc(lib, "vkCreateBufferCollectionFUCHSIA");
+    out->vkSetBufferCollectionImageConstraintsFUCHSIA =
+        (PFN_vkSetBufferCollectionImageConstraintsFUCHSIA)dlSymFunc(
+            lib, "vkSetBufferCollectionImageConstraintsFUCHSIA");
+    out->vkSetBufferCollectionBufferConstraintsFUCHSIA =
+        (PFN_vkSetBufferCollectionBufferConstraintsFUCHSIA)dlSymFunc(
+            lib, "vkSetBufferCollectionBufferConstraintsFUCHSIA");
+    out->vkDestroyBufferCollectionFUCHSIA =
+        (PFN_vkDestroyBufferCollectionFUCHSIA)dlSymFunc(lib, "vkDestroyBufferCollectionFUCHSIA");
+    out->vkGetBufferCollectionPropertiesFUCHSIA =
+        (PFN_vkGetBufferCollectionPropertiesFUCHSIA)dlSymFunc(
+            lib, "vkGetBufferCollectionPropertiesFUCHSIA");
 #endif
 #ifdef VK_HUAWEI_subpass_shading
-    out->vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI = (PFN_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI)dlSymFunc(lib, "vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI");
-    out->vkCmdSubpassShadingHUAWEI = (PFN_vkCmdSubpassShadingHUAWEI)dlSymFunc(lib, "vkCmdSubpassShadingHUAWEI");
+    out->vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI =
+        (PFN_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI)dlSymFunc(
+            lib, "vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI");
+    out->vkCmdSubpassShadingHUAWEI =
+        (PFN_vkCmdSubpassShadingHUAWEI)dlSymFunc(lib, "vkCmdSubpassShadingHUAWEI");
 #endif
 #ifdef VK_HUAWEI_invocation_mask
-    out->vkCmdBindInvocationMaskHUAWEI = (PFN_vkCmdBindInvocationMaskHUAWEI)dlSymFunc(lib, "vkCmdBindInvocationMaskHUAWEI");
+    out->vkCmdBindInvocationMaskHUAWEI =
+        (PFN_vkCmdBindInvocationMaskHUAWEI)dlSymFunc(lib, "vkCmdBindInvocationMaskHUAWEI");
 #endif
 #ifdef VK_NV_external_memory_rdma
-    out->vkGetMemoryRemoteAddressNV = (PFN_vkGetMemoryRemoteAddressNV)dlSymFunc(lib, "vkGetMemoryRemoteAddressNV");
+    out->vkGetMemoryRemoteAddressNV =
+        (PFN_vkGetMemoryRemoteAddressNV)dlSymFunc(lib, "vkGetMemoryRemoteAddressNV");
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
-    out->vkCmdSetPatchControlPointsEXT = (PFN_vkCmdSetPatchControlPointsEXT)dlSymFunc(lib, "vkCmdSetPatchControlPointsEXT");
-    out->vkCmdSetRasterizerDiscardEnableEXT = (PFN_vkCmdSetRasterizerDiscardEnableEXT)dlSymFunc(lib, "vkCmdSetRasterizerDiscardEnableEXT");
-    out->vkCmdSetDepthBiasEnableEXT = (PFN_vkCmdSetDepthBiasEnableEXT)dlSymFunc(lib, "vkCmdSetDepthBiasEnableEXT");
+    out->vkCmdSetPatchControlPointsEXT =
+        (PFN_vkCmdSetPatchControlPointsEXT)dlSymFunc(lib, "vkCmdSetPatchControlPointsEXT");
+    out->vkCmdSetRasterizerDiscardEnableEXT = (PFN_vkCmdSetRasterizerDiscardEnableEXT)dlSymFunc(
+        lib, "vkCmdSetRasterizerDiscardEnableEXT");
+    out->vkCmdSetDepthBiasEnableEXT =
+        (PFN_vkCmdSetDepthBiasEnableEXT)dlSymFunc(lib, "vkCmdSetDepthBiasEnableEXT");
     out->vkCmdSetLogicOpEXT = (PFN_vkCmdSetLogicOpEXT)dlSymFunc(lib, "vkCmdSetLogicOpEXT");
-    out->vkCmdSetPrimitiveRestartEnableEXT = (PFN_vkCmdSetPrimitiveRestartEnableEXT)dlSymFunc(lib, "vkCmdSetPrimitiveRestartEnableEXT");
+    out->vkCmdSetPrimitiveRestartEnableEXT =
+        (PFN_vkCmdSetPrimitiveRestartEnableEXT)dlSymFunc(lib, "vkCmdSetPrimitiveRestartEnableEXT");
 #endif
 #ifdef VK_QNX_screen_surface
-    out->vkGetPhysicalDeviceScreenPresentationSupportQNX = (PFN_vkGetPhysicalDeviceScreenPresentationSupportQNX)dlSymFunc(lib, "vkGetPhysicalDeviceScreenPresentationSupportQNX");
+    out->vkGetPhysicalDeviceScreenPresentationSupportQNX =
+        (PFN_vkGetPhysicalDeviceScreenPresentationSupportQNX)dlSymFunc(
+            lib, "vkGetPhysicalDeviceScreenPresentationSupportQNX");
 #endif
 #ifdef VK_EXT_color_write_enable
-    out->vkCmdSetColorWriteEnableEXT = (PFN_vkCmdSetColorWriteEnableEXT)dlSymFunc(lib, "vkCmdSetColorWriteEnableEXT");
+    out->vkCmdSetColorWriteEnableEXT =
+        (PFN_vkCmdSetColorWriteEnableEXT)dlSymFunc(lib, "vkCmdSetColorWriteEnableEXT");
 #endif
 #ifdef VK_GOOGLE_gfxstream
-    out->vkRegisterImageColorBufferGOOGLE = (PFN_vkRegisterImageColorBufferGOOGLE)dlSymFunc(lib, "vkRegisterImageColorBufferGOOGLE");
-    out->vkRegisterBufferColorBufferGOOGLE = (PFN_vkRegisterBufferColorBufferGOOGLE)dlSymFunc(lib, "vkRegisterBufferColorBufferGOOGLE");
-    out->vkMapMemoryIntoAddressSpaceGOOGLE = (PFN_vkMapMemoryIntoAddressSpaceGOOGLE)dlSymFunc(lib, "vkMapMemoryIntoAddressSpaceGOOGLE");
-    out->vkUpdateDescriptorSetWithTemplateSizedGOOGLE = (PFN_vkUpdateDescriptorSetWithTemplateSizedGOOGLE)dlSymFunc(lib, "vkUpdateDescriptorSetWithTemplateSizedGOOGLE");
-    out->vkBeginCommandBufferAsyncGOOGLE = (PFN_vkBeginCommandBufferAsyncGOOGLE)dlSymFunc(lib, "vkBeginCommandBufferAsyncGOOGLE");
-    out->vkEndCommandBufferAsyncGOOGLE = (PFN_vkEndCommandBufferAsyncGOOGLE)dlSymFunc(lib, "vkEndCommandBufferAsyncGOOGLE");
-    out->vkResetCommandBufferAsyncGOOGLE = (PFN_vkResetCommandBufferAsyncGOOGLE)dlSymFunc(lib, "vkResetCommandBufferAsyncGOOGLE");
-    out->vkCommandBufferHostSyncGOOGLE = (PFN_vkCommandBufferHostSyncGOOGLE)dlSymFunc(lib, "vkCommandBufferHostSyncGOOGLE");
-    out->vkCreateImageWithRequirementsGOOGLE = (PFN_vkCreateImageWithRequirementsGOOGLE)dlSymFunc(lib, "vkCreateImageWithRequirementsGOOGLE");
-    out->vkCreateBufferWithRequirementsGOOGLE = (PFN_vkCreateBufferWithRequirementsGOOGLE)dlSymFunc(lib, "vkCreateBufferWithRequirementsGOOGLE");
-    out->vkGetMemoryHostAddressInfoGOOGLE = (PFN_vkGetMemoryHostAddressInfoGOOGLE)dlSymFunc(lib, "vkGetMemoryHostAddressInfoGOOGLE");
-    out->vkFreeMemorySyncGOOGLE = (PFN_vkFreeMemorySyncGOOGLE)dlSymFunc(lib, "vkFreeMemorySyncGOOGLE");
+    out->vkRegisterImageColorBufferGOOGLE =
+        (PFN_vkRegisterImageColorBufferGOOGLE)dlSymFunc(lib, "vkRegisterImageColorBufferGOOGLE");
+    out->vkRegisterBufferColorBufferGOOGLE =
+        (PFN_vkRegisterBufferColorBufferGOOGLE)dlSymFunc(lib, "vkRegisterBufferColorBufferGOOGLE");
+    out->vkMapMemoryIntoAddressSpaceGOOGLE =
+        (PFN_vkMapMemoryIntoAddressSpaceGOOGLE)dlSymFunc(lib, "vkMapMemoryIntoAddressSpaceGOOGLE");
+    out->vkUpdateDescriptorSetWithTemplateSizedGOOGLE =
+        (PFN_vkUpdateDescriptorSetWithTemplateSizedGOOGLE)dlSymFunc(
+            lib, "vkUpdateDescriptorSetWithTemplateSizedGOOGLE");
+    out->vkBeginCommandBufferAsyncGOOGLE =
+        (PFN_vkBeginCommandBufferAsyncGOOGLE)dlSymFunc(lib, "vkBeginCommandBufferAsyncGOOGLE");
+    out->vkEndCommandBufferAsyncGOOGLE =
+        (PFN_vkEndCommandBufferAsyncGOOGLE)dlSymFunc(lib, "vkEndCommandBufferAsyncGOOGLE");
+    out->vkResetCommandBufferAsyncGOOGLE =
+        (PFN_vkResetCommandBufferAsyncGOOGLE)dlSymFunc(lib, "vkResetCommandBufferAsyncGOOGLE");
+    out->vkCommandBufferHostSyncGOOGLE =
+        (PFN_vkCommandBufferHostSyncGOOGLE)dlSymFunc(lib, "vkCommandBufferHostSyncGOOGLE");
+    out->vkCreateImageWithRequirementsGOOGLE = (PFN_vkCreateImageWithRequirementsGOOGLE)dlSymFunc(
+        lib, "vkCreateImageWithRequirementsGOOGLE");
+    out->vkCreateBufferWithRequirementsGOOGLE = (PFN_vkCreateBufferWithRequirementsGOOGLE)dlSymFunc(
+        lib, "vkCreateBufferWithRequirementsGOOGLE");
+    out->vkGetMemoryHostAddressInfoGOOGLE =
+        (PFN_vkGetMemoryHostAddressInfoGOOGLE)dlSymFunc(lib, "vkGetMemoryHostAddressInfoGOOGLE");
+    out->vkFreeMemorySyncGOOGLE =
+        (PFN_vkFreeMemorySyncGOOGLE)dlSymFunc(lib, "vkFreeMemorySyncGOOGLE");
     out->vkQueueHostSyncGOOGLE = (PFN_vkQueueHostSyncGOOGLE)dlSymFunc(lib, "vkQueueHostSyncGOOGLE");
-    out->vkQueueSubmitAsyncGOOGLE = (PFN_vkQueueSubmitAsyncGOOGLE)dlSymFunc(lib, "vkQueueSubmitAsyncGOOGLE");
-    out->vkQueueWaitIdleAsyncGOOGLE = (PFN_vkQueueWaitIdleAsyncGOOGLE)dlSymFunc(lib, "vkQueueWaitIdleAsyncGOOGLE");
-    out->vkQueueBindSparseAsyncGOOGLE = (PFN_vkQueueBindSparseAsyncGOOGLE)dlSymFunc(lib, "vkQueueBindSparseAsyncGOOGLE");
-    out->vkGetLinearImageLayoutGOOGLE = (PFN_vkGetLinearImageLayoutGOOGLE)dlSymFunc(lib, "vkGetLinearImageLayoutGOOGLE");
-    out->vkGetLinearImageLayout2GOOGLE = (PFN_vkGetLinearImageLayout2GOOGLE)dlSymFunc(lib, "vkGetLinearImageLayout2GOOGLE");
-    out->vkQueueFlushCommandsGOOGLE = (PFN_vkQueueFlushCommandsGOOGLE)dlSymFunc(lib, "vkQueueFlushCommandsGOOGLE");
-    out->vkQueueCommitDescriptorSetUpdatesGOOGLE = (PFN_vkQueueCommitDescriptorSetUpdatesGOOGLE)dlSymFunc(lib, "vkQueueCommitDescriptorSetUpdatesGOOGLE");
-    out->vkCollectDescriptorPoolIdsGOOGLE = (PFN_vkCollectDescriptorPoolIdsGOOGLE)dlSymFunc(lib, "vkCollectDescriptorPoolIdsGOOGLE");
-    out->vkQueueSignalReleaseImageANDROIDAsyncGOOGLE = (PFN_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE)dlSymFunc(lib, "vkQueueSignalReleaseImageANDROIDAsyncGOOGLE");
+    out->vkQueueSubmitAsyncGOOGLE =
+        (PFN_vkQueueSubmitAsyncGOOGLE)dlSymFunc(lib, "vkQueueSubmitAsyncGOOGLE");
+    out->vkQueueWaitIdleAsyncGOOGLE =
+        (PFN_vkQueueWaitIdleAsyncGOOGLE)dlSymFunc(lib, "vkQueueWaitIdleAsyncGOOGLE");
+    out->vkQueueBindSparseAsyncGOOGLE =
+        (PFN_vkQueueBindSparseAsyncGOOGLE)dlSymFunc(lib, "vkQueueBindSparseAsyncGOOGLE");
+    out->vkGetLinearImageLayoutGOOGLE =
+        (PFN_vkGetLinearImageLayoutGOOGLE)dlSymFunc(lib, "vkGetLinearImageLayoutGOOGLE");
+    out->vkGetLinearImageLayout2GOOGLE =
+        (PFN_vkGetLinearImageLayout2GOOGLE)dlSymFunc(lib, "vkGetLinearImageLayout2GOOGLE");
+    out->vkQueueFlushCommandsGOOGLE =
+        (PFN_vkQueueFlushCommandsGOOGLE)dlSymFunc(lib, "vkQueueFlushCommandsGOOGLE");
+    out->vkQueueCommitDescriptorSetUpdatesGOOGLE =
+        (PFN_vkQueueCommitDescriptorSetUpdatesGOOGLE)dlSymFunc(
+            lib, "vkQueueCommitDescriptorSetUpdatesGOOGLE");
+    out->vkCollectDescriptorPoolIdsGOOGLE =
+        (PFN_vkCollectDescriptorPoolIdsGOOGLE)dlSymFunc(lib, "vkCollectDescriptorPoolIdsGOOGLE");
+    out->vkQueueSignalReleaseImageANDROIDAsyncGOOGLE =
+        (PFN_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE)dlSymFunc(
+            lib, "vkQueueSignalReleaseImageANDROIDAsyncGOOGLE");
 #endif
 #ifdef VK_EXT_multi_draw
     out->vkCmdDrawMultiEXT = (PFN_vkCmdDrawMultiEXT)dlSymFunc(lib, "vkCmdDrawMultiEXT");
-    out->vkCmdDrawMultiIndexedEXT = (PFN_vkCmdDrawMultiIndexedEXT)dlSymFunc(lib, "vkCmdDrawMultiIndexedEXT");
+    out->vkCmdDrawMultiIndexedEXT =
+        (PFN_vkCmdDrawMultiIndexedEXT)dlSymFunc(lib, "vkCmdDrawMultiIndexedEXT");
 #endif
 #ifdef VK_EXT_pageable_device_local_memory
-    out->vkSetDeviceMemoryPriorityEXT = (PFN_vkSetDeviceMemoryPriorityEXT)dlSymFunc(lib, "vkSetDeviceMemoryPriorityEXT");
+    out->vkSetDeviceMemoryPriorityEXT =
+        (PFN_vkSetDeviceMemoryPriorityEXT)dlSymFunc(lib, "vkSetDeviceMemoryPriorityEXT");
 #endif
 #ifdef VK_KHR_acceleration_structure
-    out->vkCreateAccelerationStructureKHR = (PFN_vkCreateAccelerationStructureKHR)dlSymFunc(lib, "vkCreateAccelerationStructureKHR");
-    out->vkDestroyAccelerationStructureKHR = (PFN_vkDestroyAccelerationStructureKHR)dlSymFunc(lib, "vkDestroyAccelerationStructureKHR");
-    out->vkCmdBuildAccelerationStructuresKHR = (PFN_vkCmdBuildAccelerationStructuresKHR)dlSymFunc(lib, "vkCmdBuildAccelerationStructuresKHR");
-    out->vkCmdBuildAccelerationStructuresIndirectKHR = (PFN_vkCmdBuildAccelerationStructuresIndirectKHR)dlSymFunc(lib, "vkCmdBuildAccelerationStructuresIndirectKHR");
-    out->vkBuildAccelerationStructuresKHR = (PFN_vkBuildAccelerationStructuresKHR)dlSymFunc(lib, "vkBuildAccelerationStructuresKHR");
-    out->vkCopyAccelerationStructureKHR = (PFN_vkCopyAccelerationStructureKHR)dlSymFunc(lib, "vkCopyAccelerationStructureKHR");
-    out->vkCopyAccelerationStructureToMemoryKHR = (PFN_vkCopyAccelerationStructureToMemoryKHR)dlSymFunc(lib, "vkCopyAccelerationStructureToMemoryKHR");
-    out->vkCopyMemoryToAccelerationStructureKHR = (PFN_vkCopyMemoryToAccelerationStructureKHR)dlSymFunc(lib, "vkCopyMemoryToAccelerationStructureKHR");
-    out->vkWriteAccelerationStructuresPropertiesKHR = (PFN_vkWriteAccelerationStructuresPropertiesKHR)dlSymFunc(lib, "vkWriteAccelerationStructuresPropertiesKHR");
-    out->vkCmdCopyAccelerationStructureKHR = (PFN_vkCmdCopyAccelerationStructureKHR)dlSymFunc(lib, "vkCmdCopyAccelerationStructureKHR");
-    out->vkCmdCopyAccelerationStructureToMemoryKHR = (PFN_vkCmdCopyAccelerationStructureToMemoryKHR)dlSymFunc(lib, "vkCmdCopyAccelerationStructureToMemoryKHR");
-    out->vkCmdCopyMemoryToAccelerationStructureKHR = (PFN_vkCmdCopyMemoryToAccelerationStructureKHR)dlSymFunc(lib, "vkCmdCopyMemoryToAccelerationStructureKHR");
-    out->vkGetAccelerationStructureDeviceAddressKHR = (PFN_vkGetAccelerationStructureDeviceAddressKHR)dlSymFunc(lib, "vkGetAccelerationStructureDeviceAddressKHR");
-    out->vkCmdWriteAccelerationStructuresPropertiesKHR = (PFN_vkCmdWriteAccelerationStructuresPropertiesKHR)dlSymFunc(lib, "vkCmdWriteAccelerationStructuresPropertiesKHR");
-    out->vkGetDeviceAccelerationStructureCompatibilityKHR = (PFN_vkGetDeviceAccelerationStructureCompatibilityKHR)dlSymFunc(lib, "vkGetDeviceAccelerationStructureCompatibilityKHR");
-    out->vkGetAccelerationStructureBuildSizesKHR = (PFN_vkGetAccelerationStructureBuildSizesKHR)dlSymFunc(lib, "vkGetAccelerationStructureBuildSizesKHR");
+    out->vkCreateAccelerationStructureKHR =
+        (PFN_vkCreateAccelerationStructureKHR)dlSymFunc(lib, "vkCreateAccelerationStructureKHR");
+    out->vkDestroyAccelerationStructureKHR =
+        (PFN_vkDestroyAccelerationStructureKHR)dlSymFunc(lib, "vkDestroyAccelerationStructureKHR");
+    out->vkCmdBuildAccelerationStructuresKHR = (PFN_vkCmdBuildAccelerationStructuresKHR)dlSymFunc(
+        lib, "vkCmdBuildAccelerationStructuresKHR");
+    out->vkCmdBuildAccelerationStructuresIndirectKHR =
+        (PFN_vkCmdBuildAccelerationStructuresIndirectKHR)dlSymFunc(
+            lib, "vkCmdBuildAccelerationStructuresIndirectKHR");
+    out->vkBuildAccelerationStructuresKHR =
+        (PFN_vkBuildAccelerationStructuresKHR)dlSymFunc(lib, "vkBuildAccelerationStructuresKHR");
+    out->vkCopyAccelerationStructureKHR =
+        (PFN_vkCopyAccelerationStructureKHR)dlSymFunc(lib, "vkCopyAccelerationStructureKHR");
+    out->vkCopyAccelerationStructureToMemoryKHR =
+        (PFN_vkCopyAccelerationStructureToMemoryKHR)dlSymFunc(
+            lib, "vkCopyAccelerationStructureToMemoryKHR");
+    out->vkCopyMemoryToAccelerationStructureKHR =
+        (PFN_vkCopyMemoryToAccelerationStructureKHR)dlSymFunc(
+            lib, "vkCopyMemoryToAccelerationStructureKHR");
+    out->vkWriteAccelerationStructuresPropertiesKHR =
+        (PFN_vkWriteAccelerationStructuresPropertiesKHR)dlSymFunc(
+            lib, "vkWriteAccelerationStructuresPropertiesKHR");
+    out->vkCmdCopyAccelerationStructureKHR =
+        (PFN_vkCmdCopyAccelerationStructureKHR)dlSymFunc(lib, "vkCmdCopyAccelerationStructureKHR");
+    out->vkCmdCopyAccelerationStructureToMemoryKHR =
+        (PFN_vkCmdCopyAccelerationStructureToMemoryKHR)dlSymFunc(
+            lib, "vkCmdCopyAccelerationStructureToMemoryKHR");
+    out->vkCmdCopyMemoryToAccelerationStructureKHR =
+        (PFN_vkCmdCopyMemoryToAccelerationStructureKHR)dlSymFunc(
+            lib, "vkCmdCopyMemoryToAccelerationStructureKHR");
+    out->vkGetAccelerationStructureDeviceAddressKHR =
+        (PFN_vkGetAccelerationStructureDeviceAddressKHR)dlSymFunc(
+            lib, "vkGetAccelerationStructureDeviceAddressKHR");
+    out->vkCmdWriteAccelerationStructuresPropertiesKHR =
+        (PFN_vkCmdWriteAccelerationStructuresPropertiesKHR)dlSymFunc(
+            lib, "vkCmdWriteAccelerationStructuresPropertiesKHR");
+    out->vkGetDeviceAccelerationStructureCompatibilityKHR =
+        (PFN_vkGetDeviceAccelerationStructureCompatibilityKHR)dlSymFunc(
+            lib, "vkGetDeviceAccelerationStructureCompatibilityKHR");
+    out->vkGetAccelerationStructureBuildSizesKHR =
+        (PFN_vkGetAccelerationStructureBuildSizesKHR)dlSymFunc(
+            lib, "vkGetAccelerationStructureBuildSizesKHR");
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
     out->vkCmdTraceRaysKHR = (PFN_vkCmdTraceRaysKHR)dlSymFunc(lib, "vkCmdTraceRaysKHR");
-    out->vkCreateRayTracingPipelinesKHR = (PFN_vkCreateRayTracingPipelinesKHR)dlSymFunc(lib, "vkCreateRayTracingPipelinesKHR");
-    out->vkGetRayTracingCaptureReplayShaderGroupHandlesKHR = (PFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR)dlSymFunc(lib, "vkGetRayTracingCaptureReplayShaderGroupHandlesKHR");
-    out->vkCmdTraceRaysIndirectKHR = (PFN_vkCmdTraceRaysIndirectKHR)dlSymFunc(lib, "vkCmdTraceRaysIndirectKHR");
-    out->vkGetRayTracingShaderGroupStackSizeKHR = (PFN_vkGetRayTracingShaderGroupStackSizeKHR)dlSymFunc(lib, "vkGetRayTracingShaderGroupStackSizeKHR");
-    out->vkCmdSetRayTracingPipelineStackSizeKHR = (PFN_vkCmdSetRayTracingPipelineStackSizeKHR)dlSymFunc(lib, "vkCmdSetRayTracingPipelineStackSizeKHR");
+    out->vkCreateRayTracingPipelinesKHR =
+        (PFN_vkCreateRayTracingPipelinesKHR)dlSymFunc(lib, "vkCreateRayTracingPipelinesKHR");
+    out->vkGetRayTracingCaptureReplayShaderGroupHandlesKHR =
+        (PFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR)dlSymFunc(
+            lib, "vkGetRayTracingCaptureReplayShaderGroupHandlesKHR");
+    out->vkCmdTraceRaysIndirectKHR =
+        (PFN_vkCmdTraceRaysIndirectKHR)dlSymFunc(lib, "vkCmdTraceRaysIndirectKHR");
+    out->vkGetRayTracingShaderGroupStackSizeKHR =
+        (PFN_vkGetRayTracingShaderGroupStackSizeKHR)dlSymFunc(
+            lib, "vkGetRayTracingShaderGroupStackSizeKHR");
+    out->vkCmdSetRayTracingPipelineStackSizeKHR =
+        (PFN_vkCmdSetRayTracingPipelineStackSizeKHR)dlSymFunc(
+            lib, "vkCmdSetRayTracingPipelineStackSizeKHR");
 #endif
 #ifdef VK_MVK_moltenvk
     out->vkGetMTLDeviceMVK = (PFN_vkGetMTLDeviceMVK)dlSymFunc(lib, "vkGetMTLDeviceMVK");
@@ -1383,2390 +1844,3691 @@
 #endif
 }
 
-void init_vulkan_dispatch_from_instance(
-    VulkanDispatch* vk,
-    VkInstance instance,
-    VulkanDispatch* out)
-{
+void init_vulkan_dispatch_from_instance(VulkanDispatch* vk, VkInstance instance,
+                                        VulkanDispatch* out) {
     memset(out, 0x0, sizeof(VulkanDispatch));
 #ifdef VK_VERSION_1_0
-    out->vkDestroyInstance = (PFN_vkDestroyInstance)vk->vkGetInstanceProcAddr(instance, "vkDestroyInstance");
-    out->vkEnumeratePhysicalDevices = (PFN_vkEnumeratePhysicalDevices)vk->vkGetInstanceProcAddr(instance, "vkEnumeratePhysicalDevices");
-    out->vkGetPhysicalDeviceFeatures = (PFN_vkGetPhysicalDeviceFeatures)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFeatures");
-    out->vkGetPhysicalDeviceFormatProperties = (PFN_vkGetPhysicalDeviceFormatProperties)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFormatProperties");
-    out->vkGetPhysicalDeviceImageFormatProperties = (PFN_vkGetPhysicalDeviceImageFormatProperties)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceImageFormatProperties");
-    out->vkGetPhysicalDeviceProperties = (PFN_vkGetPhysicalDeviceProperties)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceProperties");
-    out->vkGetPhysicalDeviceQueueFamilyProperties = (PFN_vkGetPhysicalDeviceQueueFamilyProperties)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceQueueFamilyProperties");
-    out->vkGetPhysicalDeviceMemoryProperties = (PFN_vkGetPhysicalDeviceMemoryProperties)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceMemoryProperties");
-    out->vkGetInstanceProcAddr = (PFN_vkGetInstanceProcAddr)vk->vkGetInstanceProcAddr(instance, "vkGetInstanceProcAddr");
+    out->vkDestroyInstance =
+        (PFN_vkDestroyInstance)vk->vkGetInstanceProcAddr(instance, "vkDestroyInstance");
+    out->vkEnumeratePhysicalDevices = (PFN_vkEnumeratePhysicalDevices)vk->vkGetInstanceProcAddr(
+        instance, "vkEnumeratePhysicalDevices");
+    out->vkGetPhysicalDeviceFeatures = (PFN_vkGetPhysicalDeviceFeatures)vk->vkGetInstanceProcAddr(
+        instance, "vkGetPhysicalDeviceFeatures");
+    out->vkGetPhysicalDeviceFormatProperties =
+        (PFN_vkGetPhysicalDeviceFormatProperties)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceFormatProperties");
+    out->vkGetPhysicalDeviceImageFormatProperties =
+        (PFN_vkGetPhysicalDeviceImageFormatProperties)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceImageFormatProperties");
+    out->vkGetPhysicalDeviceProperties =
+        (PFN_vkGetPhysicalDeviceProperties)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceProperties");
+    out->vkGetPhysicalDeviceQueueFamilyProperties =
+        (PFN_vkGetPhysicalDeviceQueueFamilyProperties)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceQueueFamilyProperties");
+    out->vkGetPhysicalDeviceMemoryProperties =
+        (PFN_vkGetPhysicalDeviceMemoryProperties)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceMemoryProperties");
+    out->vkGetInstanceProcAddr =
+        (PFN_vkGetInstanceProcAddr)vk->vkGetInstanceProcAddr(instance, "vkGetInstanceProcAddr");
     out->vkCreateDevice = (PFN_vkCreateDevice)vk->vkGetInstanceProcAddr(instance, "vkCreateDevice");
-    out->vkDestroyDevice = (PFN_vkDestroyDevice)vk->vkGetInstanceProcAddr(instance, "vkDestroyDevice");
-    out->vkEnumerateDeviceExtensionProperties = (PFN_vkEnumerateDeviceExtensionProperties)vk->vkGetInstanceProcAddr(instance, "vkEnumerateDeviceExtensionProperties");
-    out->vkEnumerateDeviceLayerProperties = (PFN_vkEnumerateDeviceLayerProperties)vk->vkGetInstanceProcAddr(instance, "vkEnumerateDeviceLayerProperties");
-    out->vkCreateInstance = (PFN_vkCreateInstance)vk->vkGetInstanceProcAddr(instance, "vkCreateInstance");
-    out->vkEnumerateInstanceExtensionProperties = (PFN_vkEnumerateInstanceExtensionProperties)vk->vkGetInstanceProcAddr(instance, "vkEnumerateInstanceExtensionProperties");
-    out->vkEnumerateInstanceLayerProperties = (PFN_vkEnumerateInstanceLayerProperties)vk->vkGetInstanceProcAddr(instance, "vkEnumerateInstanceLayerProperties");
-    out->vkGetDeviceProcAddr = (PFN_vkGetDeviceProcAddr)vk->vkGetInstanceProcAddr(instance, "vkGetDeviceProcAddr");
-    out->vkGetPhysicalDeviceSparseImageFormatProperties = (PFN_vkGetPhysicalDeviceSparseImageFormatProperties)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSparseImageFormatProperties");
+    out->vkDestroyDevice =
+        (PFN_vkDestroyDevice)vk->vkGetInstanceProcAddr(instance, "vkDestroyDevice");
+    out->vkEnumerateDeviceExtensionProperties =
+        (PFN_vkEnumerateDeviceExtensionProperties)vk->vkGetInstanceProcAddr(
+            instance, "vkEnumerateDeviceExtensionProperties");
+    out->vkEnumerateDeviceLayerProperties =
+        (PFN_vkEnumerateDeviceLayerProperties)vk->vkGetInstanceProcAddr(
+            instance, "vkEnumerateDeviceLayerProperties");
+    out->vkCreateInstance =
+        (PFN_vkCreateInstance)vk->vkGetInstanceProcAddr(instance, "vkCreateInstance");
+    out->vkEnumerateInstanceExtensionProperties =
+        (PFN_vkEnumerateInstanceExtensionProperties)vk->vkGetInstanceProcAddr(
+            instance, "vkEnumerateInstanceExtensionProperties");
+    out->vkEnumerateInstanceLayerProperties =
+        (PFN_vkEnumerateInstanceLayerProperties)vk->vkGetInstanceProcAddr(
+            instance, "vkEnumerateInstanceLayerProperties");
+    out->vkGetDeviceProcAddr =
+        (PFN_vkGetDeviceProcAddr)vk->vkGetInstanceProcAddr(instance, "vkGetDeviceProcAddr");
+    out->vkGetPhysicalDeviceSparseImageFormatProperties =
+        (PFN_vkGetPhysicalDeviceSparseImageFormatProperties)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceSparseImageFormatProperties");
 #endif
 #ifdef VK_VERSION_1_1
-    out->vkEnumerateInstanceVersion = (PFN_vkEnumerateInstanceVersion)vk->vkGetInstanceProcAddr(instance, "vkEnumerateInstanceVersion");
-    out->vkEnumeratePhysicalDeviceGroups = (PFN_vkEnumeratePhysicalDeviceGroups)vk->vkGetInstanceProcAddr(instance, "vkEnumeratePhysicalDeviceGroups");
-    out->vkGetPhysicalDeviceFeatures2 = (PFN_vkGetPhysicalDeviceFeatures2)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFeatures2");
-    out->vkGetPhysicalDeviceProperties2 = (PFN_vkGetPhysicalDeviceProperties2)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceProperties2");
-    out->vkGetPhysicalDeviceFormatProperties2 = (PFN_vkGetPhysicalDeviceFormatProperties2)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFormatProperties2");
-    out->vkGetPhysicalDeviceImageFormatProperties2 = (PFN_vkGetPhysicalDeviceImageFormatProperties2)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceImageFormatProperties2");
-    out->vkGetPhysicalDeviceQueueFamilyProperties2 = (PFN_vkGetPhysicalDeviceQueueFamilyProperties2)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceQueueFamilyProperties2");
-    out->vkGetPhysicalDeviceMemoryProperties2 = (PFN_vkGetPhysicalDeviceMemoryProperties2)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceMemoryProperties2");
-    out->vkGetPhysicalDeviceSparseImageFormatProperties2 = (PFN_vkGetPhysicalDeviceSparseImageFormatProperties2)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSparseImageFormatProperties2");
-    out->vkGetPhysicalDeviceExternalBufferProperties = (PFN_vkGetPhysicalDeviceExternalBufferProperties)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalBufferProperties");
-    out->vkGetPhysicalDeviceExternalFenceProperties = (PFN_vkGetPhysicalDeviceExternalFenceProperties)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalFenceProperties");
-    out->vkGetPhysicalDeviceExternalSemaphoreProperties = (PFN_vkGetPhysicalDeviceExternalSemaphoreProperties)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalSemaphoreProperties");
+    out->vkEnumerateInstanceVersion = (PFN_vkEnumerateInstanceVersion)vk->vkGetInstanceProcAddr(
+        instance, "vkEnumerateInstanceVersion");
+    out->vkEnumeratePhysicalDeviceGroups =
+        (PFN_vkEnumeratePhysicalDeviceGroups)vk->vkGetInstanceProcAddr(
+            instance, "vkEnumeratePhysicalDeviceGroups");
+    out->vkGetPhysicalDeviceFeatures2 = (PFN_vkGetPhysicalDeviceFeatures2)vk->vkGetInstanceProcAddr(
+        instance, "vkGetPhysicalDeviceFeatures2");
+    out->vkGetPhysicalDeviceProperties2 =
+        (PFN_vkGetPhysicalDeviceProperties2)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceProperties2");
+    out->vkGetPhysicalDeviceFormatProperties2 =
+        (PFN_vkGetPhysicalDeviceFormatProperties2)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceFormatProperties2");
+    out->vkGetPhysicalDeviceImageFormatProperties2 =
+        (PFN_vkGetPhysicalDeviceImageFormatProperties2)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceImageFormatProperties2");
+    out->vkGetPhysicalDeviceQueueFamilyProperties2 =
+        (PFN_vkGetPhysicalDeviceQueueFamilyProperties2)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceQueueFamilyProperties2");
+    out->vkGetPhysicalDeviceMemoryProperties2 =
+        (PFN_vkGetPhysicalDeviceMemoryProperties2)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceMemoryProperties2");
+    out->vkGetPhysicalDeviceSparseImageFormatProperties2 =
+        (PFN_vkGetPhysicalDeviceSparseImageFormatProperties2)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceSparseImageFormatProperties2");
+    out->vkGetPhysicalDeviceExternalBufferProperties =
+        (PFN_vkGetPhysicalDeviceExternalBufferProperties)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceExternalBufferProperties");
+    out->vkGetPhysicalDeviceExternalFenceProperties =
+        (PFN_vkGetPhysicalDeviceExternalFenceProperties)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceExternalFenceProperties");
+    out->vkGetPhysicalDeviceExternalSemaphoreProperties =
+        (PFN_vkGetPhysicalDeviceExternalSemaphoreProperties)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceExternalSemaphoreProperties");
 #endif
 #ifdef VK_KHR_surface
-    out->vkDestroySurfaceKHR = (PFN_vkDestroySurfaceKHR)vk->vkGetInstanceProcAddr(instance, "vkDestroySurfaceKHR");
+    out->vkDestroySurfaceKHR =
+        (PFN_vkDestroySurfaceKHR)vk->vkGetInstanceProcAddr(instance, "vkDestroySurfaceKHR");
 #endif
 #ifdef VK_KHR_swapchain
-    out->vkCreateSwapchainKHR = (PFN_vkCreateSwapchainKHR)vk->vkGetInstanceProcAddr(instance, "vkCreateSwapchainKHR");
-    out->vkDestroySwapchainKHR = (PFN_vkDestroySwapchainKHR)vk->vkGetInstanceProcAddr(instance, "vkDestroySwapchainKHR");
-    out->vkGetSwapchainImagesKHR = (PFN_vkGetSwapchainImagesKHR)vk->vkGetInstanceProcAddr(instance, "vkGetSwapchainImagesKHR");
-    out->vkAcquireNextImageKHR = (PFN_vkAcquireNextImageKHR)vk->vkGetInstanceProcAddr(instance, "vkAcquireNextImageKHR");
-    out->vkQueuePresentKHR = (PFN_vkQueuePresentKHR)vk->vkGetInstanceProcAddr(instance, "vkQueuePresentKHR");
+    out->vkCreateSwapchainKHR =
+        (PFN_vkCreateSwapchainKHR)vk->vkGetInstanceProcAddr(instance, "vkCreateSwapchainKHR");
+    out->vkDestroySwapchainKHR =
+        (PFN_vkDestroySwapchainKHR)vk->vkGetInstanceProcAddr(instance, "vkDestroySwapchainKHR");
+    out->vkGetSwapchainImagesKHR =
+        (PFN_vkGetSwapchainImagesKHR)vk->vkGetInstanceProcAddr(instance, "vkGetSwapchainImagesKHR");
+    out->vkAcquireNextImageKHR =
+        (PFN_vkAcquireNextImageKHR)vk->vkGetInstanceProcAddr(instance, "vkAcquireNextImageKHR");
+    out->vkQueuePresentKHR =
+        (PFN_vkQueuePresentKHR)vk->vkGetInstanceProcAddr(instance, "vkQueuePresentKHR");
 #endif
 #ifdef VK_KHR_display
-    out->vkCreateDisplayPlaneSurfaceKHR = (PFN_vkCreateDisplayPlaneSurfaceKHR)vk->vkGetInstanceProcAddr(instance, "vkCreateDisplayPlaneSurfaceKHR");
+    out->vkCreateDisplayPlaneSurfaceKHR =
+        (PFN_vkCreateDisplayPlaneSurfaceKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkCreateDisplayPlaneSurfaceKHR");
 #endif
 #ifdef VK_KHR_xlib_surface
-    out->vkCreateXlibSurfaceKHR = (PFN_vkCreateXlibSurfaceKHR)vk->vkGetInstanceProcAddr(instance, "vkCreateXlibSurfaceKHR");
-    out->vkGetPhysicalDeviceXlibPresentationSupportKHR = (PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceXlibPresentationSupportKHR");
+    out->vkCreateXlibSurfaceKHR =
+        (PFN_vkCreateXlibSurfaceKHR)vk->vkGetInstanceProcAddr(instance, "vkCreateXlibSurfaceKHR");
+    out->vkGetPhysicalDeviceXlibPresentationSupportKHR =
+        (PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceXlibPresentationSupportKHR");
 #endif
 #ifdef VK_KHR_xcb_surface
-    out->vkCreateXcbSurfaceKHR = (PFN_vkCreateXcbSurfaceKHR)vk->vkGetInstanceProcAddr(instance, "vkCreateXcbSurfaceKHR");
-    out->vkGetPhysicalDeviceXcbPresentationSupportKHR = (PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceXcbPresentationSupportKHR");
+    out->vkCreateXcbSurfaceKHR =
+        (PFN_vkCreateXcbSurfaceKHR)vk->vkGetInstanceProcAddr(instance, "vkCreateXcbSurfaceKHR");
+    out->vkGetPhysicalDeviceXcbPresentationSupportKHR =
+        (PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceXcbPresentationSupportKHR");
 #endif
 #ifdef VK_KHR_wayland_surface
-    out->vkCreateWaylandSurfaceKHR = (PFN_vkCreateWaylandSurfaceKHR)vk->vkGetInstanceProcAddr(instance, "vkCreateWaylandSurfaceKHR");
+    out->vkCreateWaylandSurfaceKHR = (PFN_vkCreateWaylandSurfaceKHR)vk->vkGetInstanceProcAddr(
+        instance, "vkCreateWaylandSurfaceKHR");
 #endif
 #ifdef VK_KHR_android_surface
-    out->vkCreateAndroidSurfaceKHR = (PFN_vkCreateAndroidSurfaceKHR)vk->vkGetInstanceProcAddr(instance, "vkCreateAndroidSurfaceKHR");
+    out->vkCreateAndroidSurfaceKHR = (PFN_vkCreateAndroidSurfaceKHR)vk->vkGetInstanceProcAddr(
+        instance, "vkCreateAndroidSurfaceKHR");
 #endif
 #ifdef VK_KHR_win32_surface
-    out->vkCreateWin32SurfaceKHR = (PFN_vkCreateWin32SurfaceKHR)vk->vkGetInstanceProcAddr(instance, "vkCreateWin32SurfaceKHR");
-    out->vkGetPhysicalDeviceWin32PresentationSupportKHR = (PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceWin32PresentationSupportKHR");
+    out->vkCreateWin32SurfaceKHR =
+        (PFN_vkCreateWin32SurfaceKHR)vk->vkGetInstanceProcAddr(instance, "vkCreateWin32SurfaceKHR");
+    out->vkGetPhysicalDeviceWin32PresentationSupportKHR =
+        (PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceWin32PresentationSupportKHR");
 #endif
 #ifdef VK_KHR_device_group_creation
-    out->vkEnumeratePhysicalDeviceGroupsKHR = (PFN_vkEnumeratePhysicalDeviceGroupsKHR)vk->vkGetInstanceProcAddr(instance, "vkEnumeratePhysicalDeviceGroupsKHR");
+    out->vkEnumeratePhysicalDeviceGroupsKHR =
+        (PFN_vkEnumeratePhysicalDeviceGroupsKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkEnumeratePhysicalDeviceGroupsKHR");
 #endif
 #ifdef VK_EXT_debug_report
-    out->vkCreateDebugReportCallbackEXT = (PFN_vkCreateDebugReportCallbackEXT)vk->vkGetInstanceProcAddr(instance, "vkCreateDebugReportCallbackEXT");
-    out->vkDestroyDebugReportCallbackEXT = (PFN_vkDestroyDebugReportCallbackEXT)vk->vkGetInstanceProcAddr(instance, "vkDestroyDebugReportCallbackEXT");
-    out->vkDebugReportMessageEXT = (PFN_vkDebugReportMessageEXT)vk->vkGetInstanceProcAddr(instance, "vkDebugReportMessageEXT");
+    out->vkCreateDebugReportCallbackEXT =
+        (PFN_vkCreateDebugReportCallbackEXT)vk->vkGetInstanceProcAddr(
+            instance, "vkCreateDebugReportCallbackEXT");
+    out->vkDestroyDebugReportCallbackEXT =
+        (PFN_vkDestroyDebugReportCallbackEXT)vk->vkGetInstanceProcAddr(
+            instance, "vkDestroyDebugReportCallbackEXT");
+    out->vkDebugReportMessageEXT =
+        (PFN_vkDebugReportMessageEXT)vk->vkGetInstanceProcAddr(instance, "vkDebugReportMessageEXT");
 #endif
 #ifdef VK_GGP_stream_descriptor_surface
-    out->vkCreateStreamDescriptorSurfaceGGP = (PFN_vkCreateStreamDescriptorSurfaceGGP)vk->vkGetInstanceProcAddr(instance, "vkCreateStreamDescriptorSurfaceGGP");
+    out->vkCreateStreamDescriptorSurfaceGGP =
+        (PFN_vkCreateStreamDescriptorSurfaceGGP)vk->vkGetInstanceProcAddr(
+            instance, "vkCreateStreamDescriptorSurfaceGGP");
 #endif
 #ifdef VK_NN_vi_surface
-    out->vkCreateViSurfaceNN = (PFN_vkCreateViSurfaceNN)vk->vkGetInstanceProcAddr(instance, "vkCreateViSurfaceNN");
+    out->vkCreateViSurfaceNN =
+        (PFN_vkCreateViSurfaceNN)vk->vkGetInstanceProcAddr(instance, "vkCreateViSurfaceNN");
 #endif
 #ifdef VK_MVK_ios_surface
-    out->vkCreateIOSSurfaceMVK = (PFN_vkCreateIOSSurfaceMVK)vk->vkGetInstanceProcAddr(instance, "vkCreateIOSSurfaceMVK");
+    out->vkCreateIOSSurfaceMVK =
+        (PFN_vkCreateIOSSurfaceMVK)vk->vkGetInstanceProcAddr(instance, "vkCreateIOSSurfaceMVK");
 #endif
 #ifdef VK_MVK_macos_surface
-    out->vkCreateMacOSSurfaceMVK = (PFN_vkCreateMacOSSurfaceMVK)vk->vkGetInstanceProcAddr(instance, "vkCreateMacOSSurfaceMVK");
+    out->vkCreateMacOSSurfaceMVK =
+        (PFN_vkCreateMacOSSurfaceMVK)vk->vkGetInstanceProcAddr(instance, "vkCreateMacOSSurfaceMVK");
 #endif
 #ifdef VK_EXT_debug_utils
-    out->vkCreateDebugUtilsMessengerEXT = (PFN_vkCreateDebugUtilsMessengerEXT)vk->vkGetInstanceProcAddr(instance, "vkCreateDebugUtilsMessengerEXT");
-    out->vkDestroyDebugUtilsMessengerEXT = (PFN_vkDestroyDebugUtilsMessengerEXT)vk->vkGetInstanceProcAddr(instance, "vkDestroyDebugUtilsMessengerEXT");
-    out->vkSubmitDebugUtilsMessageEXT = (PFN_vkSubmitDebugUtilsMessageEXT)vk->vkGetInstanceProcAddr(instance, "vkSubmitDebugUtilsMessageEXT");
+    out->vkCreateDebugUtilsMessengerEXT =
+        (PFN_vkCreateDebugUtilsMessengerEXT)vk->vkGetInstanceProcAddr(
+            instance, "vkCreateDebugUtilsMessengerEXT");
+    out->vkDestroyDebugUtilsMessengerEXT =
+        (PFN_vkDestroyDebugUtilsMessengerEXT)vk->vkGetInstanceProcAddr(
+            instance, "vkDestroyDebugUtilsMessengerEXT");
+    out->vkSubmitDebugUtilsMessageEXT = (PFN_vkSubmitDebugUtilsMessageEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkSubmitDebugUtilsMessageEXT");
 #endif
 #ifdef VK_FUCHSIA_imagepipe_surface
-    out->vkCreateImagePipeSurfaceFUCHSIA = (PFN_vkCreateImagePipeSurfaceFUCHSIA)vk->vkGetInstanceProcAddr(instance, "vkCreateImagePipeSurfaceFUCHSIA");
+    out->vkCreateImagePipeSurfaceFUCHSIA =
+        (PFN_vkCreateImagePipeSurfaceFUCHSIA)vk->vkGetInstanceProcAddr(
+            instance, "vkCreateImagePipeSurfaceFUCHSIA");
 #endif
 #ifdef VK_EXT_metal_surface
-    out->vkCreateMetalSurfaceEXT = (PFN_vkCreateMetalSurfaceEXT)vk->vkGetInstanceProcAddr(instance, "vkCreateMetalSurfaceEXT");
+    out->vkCreateMetalSurfaceEXT =
+        (PFN_vkCreateMetalSurfaceEXT)vk->vkGetInstanceProcAddr(instance, "vkCreateMetalSurfaceEXT");
 #endif
 #ifdef VK_EXT_headless_surface
-    out->vkCreateHeadlessSurfaceEXT = (PFN_vkCreateHeadlessSurfaceEXT)vk->vkGetInstanceProcAddr(instance, "vkCreateHeadlessSurfaceEXT");
+    out->vkCreateHeadlessSurfaceEXT = (PFN_vkCreateHeadlessSurfaceEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkCreateHeadlessSurfaceEXT");
 #endif
 #ifdef VK_EXT_directfb_surface
-    out->vkCreateDirectFBSurfaceEXT = (PFN_vkCreateDirectFBSurfaceEXT)vk->vkGetInstanceProcAddr(instance, "vkCreateDirectFBSurfaceEXT");
+    out->vkCreateDirectFBSurfaceEXT = (PFN_vkCreateDirectFBSurfaceEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkCreateDirectFBSurfaceEXT");
 #endif
 #ifdef VK_QNX_screen_surface
-    out->vkCreateScreenSurfaceQNX = (PFN_vkCreateScreenSurfaceQNX)vk->vkGetInstanceProcAddr(instance, "vkCreateScreenSurfaceQNX");
+    out->vkCreateScreenSurfaceQNX = (PFN_vkCreateScreenSurfaceQNX)vk->vkGetInstanceProcAddr(
+        instance, "vkCreateScreenSurfaceQNX");
 #endif
 #ifdef VK_VERSION_1_0
-    out->vkGetDeviceQueue = (PFN_vkGetDeviceQueue)vk->vkGetInstanceProcAddr(instance, "vkGetDeviceQueue");
+    out->vkGetDeviceQueue =
+        (PFN_vkGetDeviceQueue)vk->vkGetInstanceProcAddr(instance, "vkGetDeviceQueue");
     out->vkQueueSubmit = (PFN_vkQueueSubmit)vk->vkGetInstanceProcAddr(instance, "vkQueueSubmit");
-    out->vkQueueWaitIdle = (PFN_vkQueueWaitIdle)vk->vkGetInstanceProcAddr(instance, "vkQueueWaitIdle");
-    out->vkDeviceWaitIdle = (PFN_vkDeviceWaitIdle)vk->vkGetInstanceProcAddr(instance, "vkDeviceWaitIdle");
-    out->vkAllocateMemory = (PFN_vkAllocateMemory)vk->vkGetInstanceProcAddr(instance, "vkAllocateMemory");
+    out->vkQueueWaitIdle =
+        (PFN_vkQueueWaitIdle)vk->vkGetInstanceProcAddr(instance, "vkQueueWaitIdle");
+    out->vkDeviceWaitIdle =
+        (PFN_vkDeviceWaitIdle)vk->vkGetInstanceProcAddr(instance, "vkDeviceWaitIdle");
+    out->vkAllocateMemory =
+        (PFN_vkAllocateMemory)vk->vkGetInstanceProcAddr(instance, "vkAllocateMemory");
     out->vkFreeMemory = (PFN_vkFreeMemory)vk->vkGetInstanceProcAddr(instance, "vkFreeMemory");
     out->vkMapMemory = (PFN_vkMapMemory)vk->vkGetInstanceProcAddr(instance, "vkMapMemory");
     out->vkUnmapMemory = (PFN_vkUnmapMemory)vk->vkGetInstanceProcAddr(instance, "vkUnmapMemory");
-    out->vkFlushMappedMemoryRanges = (PFN_vkFlushMappedMemoryRanges)vk->vkGetInstanceProcAddr(instance, "vkFlushMappedMemoryRanges");
-    out->vkInvalidateMappedMemoryRanges = (PFN_vkInvalidateMappedMemoryRanges)vk->vkGetInstanceProcAddr(instance, "vkInvalidateMappedMemoryRanges");
-    out->vkGetDeviceMemoryCommitment = (PFN_vkGetDeviceMemoryCommitment)vk->vkGetInstanceProcAddr(instance, "vkGetDeviceMemoryCommitment");
-    out->vkBindBufferMemory = (PFN_vkBindBufferMemory)vk->vkGetInstanceProcAddr(instance, "vkBindBufferMemory");
-    out->vkBindImageMemory = (PFN_vkBindImageMemory)vk->vkGetInstanceProcAddr(instance, "vkBindImageMemory");
-    out->vkGetBufferMemoryRequirements = (PFN_vkGetBufferMemoryRequirements)vk->vkGetInstanceProcAddr(instance, "vkGetBufferMemoryRequirements");
-    out->vkGetImageMemoryRequirements = (PFN_vkGetImageMemoryRequirements)vk->vkGetInstanceProcAddr(instance, "vkGetImageMemoryRequirements");
-    out->vkGetImageSparseMemoryRequirements = (PFN_vkGetImageSparseMemoryRequirements)vk->vkGetInstanceProcAddr(instance, "vkGetImageSparseMemoryRequirements");
-    out->vkQueueBindSparse = (PFN_vkQueueBindSparse)vk->vkGetInstanceProcAddr(instance, "vkQueueBindSparse");
+    out->vkFlushMappedMemoryRanges = (PFN_vkFlushMappedMemoryRanges)vk->vkGetInstanceProcAddr(
+        instance, "vkFlushMappedMemoryRanges");
+    out->vkInvalidateMappedMemoryRanges =
+        (PFN_vkInvalidateMappedMemoryRanges)vk->vkGetInstanceProcAddr(
+            instance, "vkInvalidateMappedMemoryRanges");
+    out->vkGetDeviceMemoryCommitment = (PFN_vkGetDeviceMemoryCommitment)vk->vkGetInstanceProcAddr(
+        instance, "vkGetDeviceMemoryCommitment");
+    out->vkBindBufferMemory =
+        (PFN_vkBindBufferMemory)vk->vkGetInstanceProcAddr(instance, "vkBindBufferMemory");
+    out->vkBindImageMemory =
+        (PFN_vkBindImageMemory)vk->vkGetInstanceProcAddr(instance, "vkBindImageMemory");
+    out->vkGetBufferMemoryRequirements =
+        (PFN_vkGetBufferMemoryRequirements)vk->vkGetInstanceProcAddr(
+            instance, "vkGetBufferMemoryRequirements");
+    out->vkGetImageMemoryRequirements = (PFN_vkGetImageMemoryRequirements)vk->vkGetInstanceProcAddr(
+        instance, "vkGetImageMemoryRequirements");
+    out->vkGetImageSparseMemoryRequirements =
+        (PFN_vkGetImageSparseMemoryRequirements)vk->vkGetInstanceProcAddr(
+            instance, "vkGetImageSparseMemoryRequirements");
+    out->vkQueueBindSparse =
+        (PFN_vkQueueBindSparse)vk->vkGetInstanceProcAddr(instance, "vkQueueBindSparse");
     out->vkCreateFence = (PFN_vkCreateFence)vk->vkGetInstanceProcAddr(instance, "vkCreateFence");
     out->vkDestroyFence = (PFN_vkDestroyFence)vk->vkGetInstanceProcAddr(instance, "vkDestroyFence");
     out->vkResetFences = (PFN_vkResetFences)vk->vkGetInstanceProcAddr(instance, "vkResetFences");
-    out->vkGetFenceStatus = (PFN_vkGetFenceStatus)vk->vkGetInstanceProcAddr(instance, "vkGetFenceStatus");
-    out->vkWaitForFences = (PFN_vkWaitForFences)vk->vkGetInstanceProcAddr(instance, "vkWaitForFences");
-    out->vkCreateSemaphore = (PFN_vkCreateSemaphore)vk->vkGetInstanceProcAddr(instance, "vkCreateSemaphore");
-    out->vkDestroySemaphore = (PFN_vkDestroySemaphore)vk->vkGetInstanceProcAddr(instance, "vkDestroySemaphore");
+    out->vkGetFenceStatus =
+        (PFN_vkGetFenceStatus)vk->vkGetInstanceProcAddr(instance, "vkGetFenceStatus");
+    out->vkWaitForFences =
+        (PFN_vkWaitForFences)vk->vkGetInstanceProcAddr(instance, "vkWaitForFences");
+    out->vkCreateSemaphore =
+        (PFN_vkCreateSemaphore)vk->vkGetInstanceProcAddr(instance, "vkCreateSemaphore");
+    out->vkDestroySemaphore =
+        (PFN_vkDestroySemaphore)vk->vkGetInstanceProcAddr(instance, "vkDestroySemaphore");
     out->vkCreateEvent = (PFN_vkCreateEvent)vk->vkGetInstanceProcAddr(instance, "vkCreateEvent");
     out->vkDestroyEvent = (PFN_vkDestroyEvent)vk->vkGetInstanceProcAddr(instance, "vkDestroyEvent");
-    out->vkGetEventStatus = (PFN_vkGetEventStatus)vk->vkGetInstanceProcAddr(instance, "vkGetEventStatus");
+    out->vkGetEventStatus =
+        (PFN_vkGetEventStatus)vk->vkGetInstanceProcAddr(instance, "vkGetEventStatus");
     out->vkSetEvent = (PFN_vkSetEvent)vk->vkGetInstanceProcAddr(instance, "vkSetEvent");
     out->vkResetEvent = (PFN_vkResetEvent)vk->vkGetInstanceProcAddr(instance, "vkResetEvent");
-    out->vkCreateQueryPool = (PFN_vkCreateQueryPool)vk->vkGetInstanceProcAddr(instance, "vkCreateQueryPool");
-    out->vkDestroyQueryPool = (PFN_vkDestroyQueryPool)vk->vkGetInstanceProcAddr(instance, "vkDestroyQueryPool");
-    out->vkGetQueryPoolResults = (PFN_vkGetQueryPoolResults)vk->vkGetInstanceProcAddr(instance, "vkGetQueryPoolResults");
+    out->vkCreateQueryPool =
+        (PFN_vkCreateQueryPool)vk->vkGetInstanceProcAddr(instance, "vkCreateQueryPool");
+    out->vkDestroyQueryPool =
+        (PFN_vkDestroyQueryPool)vk->vkGetInstanceProcAddr(instance, "vkDestroyQueryPool");
+    out->vkGetQueryPoolResults =
+        (PFN_vkGetQueryPoolResults)vk->vkGetInstanceProcAddr(instance, "vkGetQueryPoolResults");
     out->vkCreateBuffer = (PFN_vkCreateBuffer)vk->vkGetInstanceProcAddr(instance, "vkCreateBuffer");
-    out->vkDestroyBuffer = (PFN_vkDestroyBuffer)vk->vkGetInstanceProcAddr(instance, "vkDestroyBuffer");
-    out->vkCreateBufferView = (PFN_vkCreateBufferView)vk->vkGetInstanceProcAddr(instance, "vkCreateBufferView");
-    out->vkDestroyBufferView = (PFN_vkDestroyBufferView)vk->vkGetInstanceProcAddr(instance, "vkDestroyBufferView");
+    out->vkDestroyBuffer =
+        (PFN_vkDestroyBuffer)vk->vkGetInstanceProcAddr(instance, "vkDestroyBuffer");
+    out->vkCreateBufferView =
+        (PFN_vkCreateBufferView)vk->vkGetInstanceProcAddr(instance, "vkCreateBufferView");
+    out->vkDestroyBufferView =
+        (PFN_vkDestroyBufferView)vk->vkGetInstanceProcAddr(instance, "vkDestroyBufferView");
     out->vkCreateImage = (PFN_vkCreateImage)vk->vkGetInstanceProcAddr(instance, "vkCreateImage");
     out->vkDestroyImage = (PFN_vkDestroyImage)vk->vkGetInstanceProcAddr(instance, "vkDestroyImage");
-    out->vkGetImageSubresourceLayout = (PFN_vkGetImageSubresourceLayout)vk->vkGetInstanceProcAddr(instance, "vkGetImageSubresourceLayout");
-    out->vkCreateImageView = (PFN_vkCreateImageView)vk->vkGetInstanceProcAddr(instance, "vkCreateImageView");
-    out->vkDestroyImageView = (PFN_vkDestroyImageView)vk->vkGetInstanceProcAddr(instance, "vkDestroyImageView");
-    out->vkCreateShaderModule = (PFN_vkCreateShaderModule)vk->vkGetInstanceProcAddr(instance, "vkCreateShaderModule");
-    out->vkDestroyShaderModule = (PFN_vkDestroyShaderModule)vk->vkGetInstanceProcAddr(instance, "vkDestroyShaderModule");
-    out->vkCreatePipelineCache = (PFN_vkCreatePipelineCache)vk->vkGetInstanceProcAddr(instance, "vkCreatePipelineCache");
-    out->vkDestroyPipelineCache = (PFN_vkDestroyPipelineCache)vk->vkGetInstanceProcAddr(instance, "vkDestroyPipelineCache");
-    out->vkGetPipelineCacheData = (PFN_vkGetPipelineCacheData)vk->vkGetInstanceProcAddr(instance, "vkGetPipelineCacheData");
-    out->vkMergePipelineCaches = (PFN_vkMergePipelineCaches)vk->vkGetInstanceProcAddr(instance, "vkMergePipelineCaches");
-    out->vkCreateGraphicsPipelines = (PFN_vkCreateGraphicsPipelines)vk->vkGetInstanceProcAddr(instance, "vkCreateGraphicsPipelines");
-    out->vkCreateComputePipelines = (PFN_vkCreateComputePipelines)vk->vkGetInstanceProcAddr(instance, "vkCreateComputePipelines");
-    out->vkDestroyPipeline = (PFN_vkDestroyPipeline)vk->vkGetInstanceProcAddr(instance, "vkDestroyPipeline");
-    out->vkCreatePipelineLayout = (PFN_vkCreatePipelineLayout)vk->vkGetInstanceProcAddr(instance, "vkCreatePipelineLayout");
-    out->vkDestroyPipelineLayout = (PFN_vkDestroyPipelineLayout)vk->vkGetInstanceProcAddr(instance, "vkDestroyPipelineLayout");
-    out->vkCreateSampler = (PFN_vkCreateSampler)vk->vkGetInstanceProcAddr(instance, "vkCreateSampler");
-    out->vkDestroySampler = (PFN_vkDestroySampler)vk->vkGetInstanceProcAddr(instance, "vkDestroySampler");
-    out->vkCreateDescriptorSetLayout = (PFN_vkCreateDescriptorSetLayout)vk->vkGetInstanceProcAddr(instance, "vkCreateDescriptorSetLayout");
-    out->vkDestroyDescriptorSetLayout = (PFN_vkDestroyDescriptorSetLayout)vk->vkGetInstanceProcAddr(instance, "vkDestroyDescriptorSetLayout");
-    out->vkCreateDescriptorPool = (PFN_vkCreateDescriptorPool)vk->vkGetInstanceProcAddr(instance, "vkCreateDescriptorPool");
-    out->vkDestroyDescriptorPool = (PFN_vkDestroyDescriptorPool)vk->vkGetInstanceProcAddr(instance, "vkDestroyDescriptorPool");
-    out->vkResetDescriptorPool = (PFN_vkResetDescriptorPool)vk->vkGetInstanceProcAddr(instance, "vkResetDescriptorPool");
-    out->vkAllocateDescriptorSets = (PFN_vkAllocateDescriptorSets)vk->vkGetInstanceProcAddr(instance, "vkAllocateDescriptorSets");
-    out->vkFreeDescriptorSets = (PFN_vkFreeDescriptorSets)vk->vkGetInstanceProcAddr(instance, "vkFreeDescriptorSets");
-    out->vkUpdateDescriptorSets = (PFN_vkUpdateDescriptorSets)vk->vkGetInstanceProcAddr(instance, "vkUpdateDescriptorSets");
-    out->vkCreateFramebuffer = (PFN_vkCreateFramebuffer)vk->vkGetInstanceProcAddr(instance, "vkCreateFramebuffer");
-    out->vkDestroyFramebuffer = (PFN_vkDestroyFramebuffer)vk->vkGetInstanceProcAddr(instance, "vkDestroyFramebuffer");
-    out->vkCreateRenderPass = (PFN_vkCreateRenderPass)vk->vkGetInstanceProcAddr(instance, "vkCreateRenderPass");
-    out->vkDestroyRenderPass = (PFN_vkDestroyRenderPass)vk->vkGetInstanceProcAddr(instance, "vkDestroyRenderPass");
-    out->vkGetRenderAreaGranularity = (PFN_vkGetRenderAreaGranularity)vk->vkGetInstanceProcAddr(instance, "vkGetRenderAreaGranularity");
-    out->vkCreateCommandPool = (PFN_vkCreateCommandPool)vk->vkGetInstanceProcAddr(instance, "vkCreateCommandPool");
-    out->vkDestroyCommandPool = (PFN_vkDestroyCommandPool)vk->vkGetInstanceProcAddr(instance, "vkDestroyCommandPool");
-    out->vkResetCommandPool = (PFN_vkResetCommandPool)vk->vkGetInstanceProcAddr(instance, "vkResetCommandPool");
-    out->vkAllocateCommandBuffers = (PFN_vkAllocateCommandBuffers)vk->vkGetInstanceProcAddr(instance, "vkAllocateCommandBuffers");
-    out->vkFreeCommandBuffers = (PFN_vkFreeCommandBuffers)vk->vkGetInstanceProcAddr(instance, "vkFreeCommandBuffers");
-    out->vkBeginCommandBuffer = (PFN_vkBeginCommandBuffer)vk->vkGetInstanceProcAddr(instance, "vkBeginCommandBuffer");
-    out->vkEndCommandBuffer = (PFN_vkEndCommandBuffer)vk->vkGetInstanceProcAddr(instance, "vkEndCommandBuffer");
-    out->vkResetCommandBuffer = (PFN_vkResetCommandBuffer)vk->vkGetInstanceProcAddr(instance, "vkResetCommandBuffer");
-    out->vkCmdBindPipeline = (PFN_vkCmdBindPipeline)vk->vkGetInstanceProcAddr(instance, "vkCmdBindPipeline");
-    out->vkCmdSetViewport = (PFN_vkCmdSetViewport)vk->vkGetInstanceProcAddr(instance, "vkCmdSetViewport");
-    out->vkCmdSetScissor = (PFN_vkCmdSetScissor)vk->vkGetInstanceProcAddr(instance, "vkCmdSetScissor");
-    out->vkCmdSetLineWidth = (PFN_vkCmdSetLineWidth)vk->vkGetInstanceProcAddr(instance, "vkCmdSetLineWidth");
-    out->vkCmdSetDepthBias = (PFN_vkCmdSetDepthBias)vk->vkGetInstanceProcAddr(instance, "vkCmdSetDepthBias");
-    out->vkCmdSetBlendConstants = (PFN_vkCmdSetBlendConstants)vk->vkGetInstanceProcAddr(instance, "vkCmdSetBlendConstants");
-    out->vkCmdSetDepthBounds = (PFN_vkCmdSetDepthBounds)vk->vkGetInstanceProcAddr(instance, "vkCmdSetDepthBounds");
-    out->vkCmdSetStencilCompareMask = (PFN_vkCmdSetStencilCompareMask)vk->vkGetInstanceProcAddr(instance, "vkCmdSetStencilCompareMask");
-    out->vkCmdSetStencilWriteMask = (PFN_vkCmdSetStencilWriteMask)vk->vkGetInstanceProcAddr(instance, "vkCmdSetStencilWriteMask");
-    out->vkCmdSetStencilReference = (PFN_vkCmdSetStencilReference)vk->vkGetInstanceProcAddr(instance, "vkCmdSetStencilReference");
-    out->vkCmdBindDescriptorSets = (PFN_vkCmdBindDescriptorSets)vk->vkGetInstanceProcAddr(instance, "vkCmdBindDescriptorSets");
-    out->vkCmdBindIndexBuffer = (PFN_vkCmdBindIndexBuffer)vk->vkGetInstanceProcAddr(instance, "vkCmdBindIndexBuffer");
-    out->vkCmdBindVertexBuffers = (PFN_vkCmdBindVertexBuffers)vk->vkGetInstanceProcAddr(instance, "vkCmdBindVertexBuffers");
+    out->vkGetImageSubresourceLayout = (PFN_vkGetImageSubresourceLayout)vk->vkGetInstanceProcAddr(
+        instance, "vkGetImageSubresourceLayout");
+    out->vkCreateImageView =
+        (PFN_vkCreateImageView)vk->vkGetInstanceProcAddr(instance, "vkCreateImageView");
+    out->vkDestroyImageView =
+        (PFN_vkDestroyImageView)vk->vkGetInstanceProcAddr(instance, "vkDestroyImageView");
+    out->vkCreateShaderModule =
+        (PFN_vkCreateShaderModule)vk->vkGetInstanceProcAddr(instance, "vkCreateShaderModule");
+    out->vkDestroyShaderModule =
+        (PFN_vkDestroyShaderModule)vk->vkGetInstanceProcAddr(instance, "vkDestroyShaderModule");
+    out->vkCreatePipelineCache =
+        (PFN_vkCreatePipelineCache)vk->vkGetInstanceProcAddr(instance, "vkCreatePipelineCache");
+    out->vkDestroyPipelineCache =
+        (PFN_vkDestroyPipelineCache)vk->vkGetInstanceProcAddr(instance, "vkDestroyPipelineCache");
+    out->vkGetPipelineCacheData =
+        (PFN_vkGetPipelineCacheData)vk->vkGetInstanceProcAddr(instance, "vkGetPipelineCacheData");
+    out->vkMergePipelineCaches =
+        (PFN_vkMergePipelineCaches)vk->vkGetInstanceProcAddr(instance, "vkMergePipelineCaches");
+    out->vkCreateGraphicsPipelines = (PFN_vkCreateGraphicsPipelines)vk->vkGetInstanceProcAddr(
+        instance, "vkCreateGraphicsPipelines");
+    out->vkCreateComputePipelines = (PFN_vkCreateComputePipelines)vk->vkGetInstanceProcAddr(
+        instance, "vkCreateComputePipelines");
+    out->vkDestroyPipeline =
+        (PFN_vkDestroyPipeline)vk->vkGetInstanceProcAddr(instance, "vkDestroyPipeline");
+    out->vkCreatePipelineLayout =
+        (PFN_vkCreatePipelineLayout)vk->vkGetInstanceProcAddr(instance, "vkCreatePipelineLayout");
+    out->vkDestroyPipelineLayout =
+        (PFN_vkDestroyPipelineLayout)vk->vkGetInstanceProcAddr(instance, "vkDestroyPipelineLayout");
+    out->vkCreateSampler =
+        (PFN_vkCreateSampler)vk->vkGetInstanceProcAddr(instance, "vkCreateSampler");
+    out->vkDestroySampler =
+        (PFN_vkDestroySampler)vk->vkGetInstanceProcAddr(instance, "vkDestroySampler");
+    out->vkCreateDescriptorSetLayout = (PFN_vkCreateDescriptorSetLayout)vk->vkGetInstanceProcAddr(
+        instance, "vkCreateDescriptorSetLayout");
+    out->vkDestroyDescriptorSetLayout = (PFN_vkDestroyDescriptorSetLayout)vk->vkGetInstanceProcAddr(
+        instance, "vkDestroyDescriptorSetLayout");
+    out->vkCreateDescriptorPool =
+        (PFN_vkCreateDescriptorPool)vk->vkGetInstanceProcAddr(instance, "vkCreateDescriptorPool");
+    out->vkDestroyDescriptorPool =
+        (PFN_vkDestroyDescriptorPool)vk->vkGetInstanceProcAddr(instance, "vkDestroyDescriptorPool");
+    out->vkResetDescriptorPool =
+        (PFN_vkResetDescriptorPool)vk->vkGetInstanceProcAddr(instance, "vkResetDescriptorPool");
+    out->vkAllocateDescriptorSets = (PFN_vkAllocateDescriptorSets)vk->vkGetInstanceProcAddr(
+        instance, "vkAllocateDescriptorSets");
+    out->vkFreeDescriptorSets =
+        (PFN_vkFreeDescriptorSets)vk->vkGetInstanceProcAddr(instance, "vkFreeDescriptorSets");
+    out->vkUpdateDescriptorSets =
+        (PFN_vkUpdateDescriptorSets)vk->vkGetInstanceProcAddr(instance, "vkUpdateDescriptorSets");
+    out->vkCreateFramebuffer =
+        (PFN_vkCreateFramebuffer)vk->vkGetInstanceProcAddr(instance, "vkCreateFramebuffer");
+    out->vkDestroyFramebuffer =
+        (PFN_vkDestroyFramebuffer)vk->vkGetInstanceProcAddr(instance, "vkDestroyFramebuffer");
+    out->vkCreateRenderPass =
+        (PFN_vkCreateRenderPass)vk->vkGetInstanceProcAddr(instance, "vkCreateRenderPass");
+    out->vkDestroyRenderPass =
+        (PFN_vkDestroyRenderPass)vk->vkGetInstanceProcAddr(instance, "vkDestroyRenderPass");
+    out->vkGetRenderAreaGranularity = (PFN_vkGetRenderAreaGranularity)vk->vkGetInstanceProcAddr(
+        instance, "vkGetRenderAreaGranularity");
+    out->vkCreateCommandPool =
+        (PFN_vkCreateCommandPool)vk->vkGetInstanceProcAddr(instance, "vkCreateCommandPool");
+    out->vkDestroyCommandPool =
+        (PFN_vkDestroyCommandPool)vk->vkGetInstanceProcAddr(instance, "vkDestroyCommandPool");
+    out->vkResetCommandPool =
+        (PFN_vkResetCommandPool)vk->vkGetInstanceProcAddr(instance, "vkResetCommandPool");
+    out->vkAllocateCommandBuffers = (PFN_vkAllocateCommandBuffers)vk->vkGetInstanceProcAddr(
+        instance, "vkAllocateCommandBuffers");
+    out->vkFreeCommandBuffers =
+        (PFN_vkFreeCommandBuffers)vk->vkGetInstanceProcAddr(instance, "vkFreeCommandBuffers");
+    out->vkBeginCommandBuffer =
+        (PFN_vkBeginCommandBuffer)vk->vkGetInstanceProcAddr(instance, "vkBeginCommandBuffer");
+    out->vkEndCommandBuffer =
+        (PFN_vkEndCommandBuffer)vk->vkGetInstanceProcAddr(instance, "vkEndCommandBuffer");
+    out->vkResetCommandBuffer =
+        (PFN_vkResetCommandBuffer)vk->vkGetInstanceProcAddr(instance, "vkResetCommandBuffer");
+    out->vkCmdBindPipeline =
+        (PFN_vkCmdBindPipeline)vk->vkGetInstanceProcAddr(instance, "vkCmdBindPipeline");
+    out->vkCmdSetViewport =
+        (PFN_vkCmdSetViewport)vk->vkGetInstanceProcAddr(instance, "vkCmdSetViewport");
+    out->vkCmdSetScissor =
+        (PFN_vkCmdSetScissor)vk->vkGetInstanceProcAddr(instance, "vkCmdSetScissor");
+    out->vkCmdSetLineWidth =
+        (PFN_vkCmdSetLineWidth)vk->vkGetInstanceProcAddr(instance, "vkCmdSetLineWidth");
+    out->vkCmdSetDepthBias =
+        (PFN_vkCmdSetDepthBias)vk->vkGetInstanceProcAddr(instance, "vkCmdSetDepthBias");
+    out->vkCmdSetBlendConstants =
+        (PFN_vkCmdSetBlendConstants)vk->vkGetInstanceProcAddr(instance, "vkCmdSetBlendConstants");
+    out->vkCmdSetDepthBounds =
+        (PFN_vkCmdSetDepthBounds)vk->vkGetInstanceProcAddr(instance, "vkCmdSetDepthBounds");
+    out->vkCmdSetStencilCompareMask = (PFN_vkCmdSetStencilCompareMask)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdSetStencilCompareMask");
+    out->vkCmdSetStencilWriteMask = (PFN_vkCmdSetStencilWriteMask)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdSetStencilWriteMask");
+    out->vkCmdSetStencilReference = (PFN_vkCmdSetStencilReference)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdSetStencilReference");
+    out->vkCmdBindDescriptorSets =
+        (PFN_vkCmdBindDescriptorSets)vk->vkGetInstanceProcAddr(instance, "vkCmdBindDescriptorSets");
+    out->vkCmdBindIndexBuffer =
+        (PFN_vkCmdBindIndexBuffer)vk->vkGetInstanceProcAddr(instance, "vkCmdBindIndexBuffer");
+    out->vkCmdBindVertexBuffers =
+        (PFN_vkCmdBindVertexBuffers)vk->vkGetInstanceProcAddr(instance, "vkCmdBindVertexBuffers");
     out->vkCmdDraw = (PFN_vkCmdDraw)vk->vkGetInstanceProcAddr(instance, "vkCmdDraw");
-    out->vkCmdDrawIndexed = (PFN_vkCmdDrawIndexed)vk->vkGetInstanceProcAddr(instance, "vkCmdDrawIndexed");
-    out->vkCmdDrawIndirect = (PFN_vkCmdDrawIndirect)vk->vkGetInstanceProcAddr(instance, "vkCmdDrawIndirect");
-    out->vkCmdDrawIndexedIndirect = (PFN_vkCmdDrawIndexedIndirect)vk->vkGetInstanceProcAddr(instance, "vkCmdDrawIndexedIndirect");
+    out->vkCmdDrawIndexed =
+        (PFN_vkCmdDrawIndexed)vk->vkGetInstanceProcAddr(instance, "vkCmdDrawIndexed");
+    out->vkCmdDrawIndirect =
+        (PFN_vkCmdDrawIndirect)vk->vkGetInstanceProcAddr(instance, "vkCmdDrawIndirect");
+    out->vkCmdDrawIndexedIndirect = (PFN_vkCmdDrawIndexedIndirect)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdDrawIndexedIndirect");
     out->vkCmdDispatch = (PFN_vkCmdDispatch)vk->vkGetInstanceProcAddr(instance, "vkCmdDispatch");
-    out->vkCmdDispatchIndirect = (PFN_vkCmdDispatchIndirect)vk->vkGetInstanceProcAddr(instance, "vkCmdDispatchIndirect");
-    out->vkCmdCopyBuffer = (PFN_vkCmdCopyBuffer)vk->vkGetInstanceProcAddr(instance, "vkCmdCopyBuffer");
+    out->vkCmdDispatchIndirect =
+        (PFN_vkCmdDispatchIndirect)vk->vkGetInstanceProcAddr(instance, "vkCmdDispatchIndirect");
+    out->vkCmdCopyBuffer =
+        (PFN_vkCmdCopyBuffer)vk->vkGetInstanceProcAddr(instance, "vkCmdCopyBuffer");
     out->vkCmdCopyImage = (PFN_vkCmdCopyImage)vk->vkGetInstanceProcAddr(instance, "vkCmdCopyImage");
     out->vkCmdBlitImage = (PFN_vkCmdBlitImage)vk->vkGetInstanceProcAddr(instance, "vkCmdBlitImage");
-    out->vkCmdCopyBufferToImage = (PFN_vkCmdCopyBufferToImage)vk->vkGetInstanceProcAddr(instance, "vkCmdCopyBufferToImage");
-    out->vkCmdCopyImageToBuffer = (PFN_vkCmdCopyImageToBuffer)vk->vkGetInstanceProcAddr(instance, "vkCmdCopyImageToBuffer");
-    out->vkCmdUpdateBuffer = (PFN_vkCmdUpdateBuffer)vk->vkGetInstanceProcAddr(instance, "vkCmdUpdateBuffer");
-    out->vkCmdFillBuffer = (PFN_vkCmdFillBuffer)vk->vkGetInstanceProcAddr(instance, "vkCmdFillBuffer");
-    out->vkCmdClearColorImage = (PFN_vkCmdClearColorImage)vk->vkGetInstanceProcAddr(instance, "vkCmdClearColorImage");
-    out->vkCmdClearDepthStencilImage = (PFN_vkCmdClearDepthStencilImage)vk->vkGetInstanceProcAddr(instance, "vkCmdClearDepthStencilImage");
-    out->vkCmdClearAttachments = (PFN_vkCmdClearAttachments)vk->vkGetInstanceProcAddr(instance, "vkCmdClearAttachments");
-    out->vkCmdResolveImage = (PFN_vkCmdResolveImage)vk->vkGetInstanceProcAddr(instance, "vkCmdResolveImage");
+    out->vkCmdCopyBufferToImage =
+        (PFN_vkCmdCopyBufferToImage)vk->vkGetInstanceProcAddr(instance, "vkCmdCopyBufferToImage");
+    out->vkCmdCopyImageToBuffer =
+        (PFN_vkCmdCopyImageToBuffer)vk->vkGetInstanceProcAddr(instance, "vkCmdCopyImageToBuffer");
+    out->vkCmdUpdateBuffer =
+        (PFN_vkCmdUpdateBuffer)vk->vkGetInstanceProcAddr(instance, "vkCmdUpdateBuffer");
+    out->vkCmdFillBuffer =
+        (PFN_vkCmdFillBuffer)vk->vkGetInstanceProcAddr(instance, "vkCmdFillBuffer");
+    out->vkCmdClearColorImage =
+        (PFN_vkCmdClearColorImage)vk->vkGetInstanceProcAddr(instance, "vkCmdClearColorImage");
+    out->vkCmdClearDepthStencilImage = (PFN_vkCmdClearDepthStencilImage)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdClearDepthStencilImage");
+    out->vkCmdClearAttachments =
+        (PFN_vkCmdClearAttachments)vk->vkGetInstanceProcAddr(instance, "vkCmdClearAttachments");
+    out->vkCmdResolveImage =
+        (PFN_vkCmdResolveImage)vk->vkGetInstanceProcAddr(instance, "vkCmdResolveImage");
     out->vkCmdSetEvent = (PFN_vkCmdSetEvent)vk->vkGetInstanceProcAddr(instance, "vkCmdSetEvent");
-    out->vkCmdResetEvent = (PFN_vkCmdResetEvent)vk->vkGetInstanceProcAddr(instance, "vkCmdResetEvent");
-    out->vkCmdWaitEvents = (PFN_vkCmdWaitEvents)vk->vkGetInstanceProcAddr(instance, "vkCmdWaitEvents");
-    out->vkCmdPipelineBarrier = (PFN_vkCmdPipelineBarrier)vk->vkGetInstanceProcAddr(instance, "vkCmdPipelineBarrier");
-    out->vkCmdBeginQuery = (PFN_vkCmdBeginQuery)vk->vkGetInstanceProcAddr(instance, "vkCmdBeginQuery");
+    out->vkCmdResetEvent =
+        (PFN_vkCmdResetEvent)vk->vkGetInstanceProcAddr(instance, "vkCmdResetEvent");
+    out->vkCmdWaitEvents =
+        (PFN_vkCmdWaitEvents)vk->vkGetInstanceProcAddr(instance, "vkCmdWaitEvents");
+    out->vkCmdPipelineBarrier =
+        (PFN_vkCmdPipelineBarrier)vk->vkGetInstanceProcAddr(instance, "vkCmdPipelineBarrier");
+    out->vkCmdBeginQuery =
+        (PFN_vkCmdBeginQuery)vk->vkGetInstanceProcAddr(instance, "vkCmdBeginQuery");
     out->vkCmdEndQuery = (PFN_vkCmdEndQuery)vk->vkGetInstanceProcAddr(instance, "vkCmdEndQuery");
-    out->vkCmdResetQueryPool = (PFN_vkCmdResetQueryPool)vk->vkGetInstanceProcAddr(instance, "vkCmdResetQueryPool");
-    out->vkCmdWriteTimestamp = (PFN_vkCmdWriteTimestamp)vk->vkGetInstanceProcAddr(instance, "vkCmdWriteTimestamp");
-    out->vkCmdCopyQueryPoolResults = (PFN_vkCmdCopyQueryPoolResults)vk->vkGetInstanceProcAddr(instance, "vkCmdCopyQueryPoolResults");
-    out->vkCmdPushConstants = (PFN_vkCmdPushConstants)vk->vkGetInstanceProcAddr(instance, "vkCmdPushConstants");
-    out->vkCmdBeginRenderPass = (PFN_vkCmdBeginRenderPass)vk->vkGetInstanceProcAddr(instance, "vkCmdBeginRenderPass");
-    out->vkCmdNextSubpass = (PFN_vkCmdNextSubpass)vk->vkGetInstanceProcAddr(instance, "vkCmdNextSubpass");
-    out->vkCmdEndRenderPass = (PFN_vkCmdEndRenderPass)vk->vkGetInstanceProcAddr(instance, "vkCmdEndRenderPass");
-    out->vkCmdExecuteCommands = (PFN_vkCmdExecuteCommands)vk->vkGetInstanceProcAddr(instance, "vkCmdExecuteCommands");
+    out->vkCmdResetQueryPool =
+        (PFN_vkCmdResetQueryPool)vk->vkGetInstanceProcAddr(instance, "vkCmdResetQueryPool");
+    out->vkCmdWriteTimestamp =
+        (PFN_vkCmdWriteTimestamp)vk->vkGetInstanceProcAddr(instance, "vkCmdWriteTimestamp");
+    out->vkCmdCopyQueryPoolResults = (PFN_vkCmdCopyQueryPoolResults)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdCopyQueryPoolResults");
+    out->vkCmdPushConstants =
+        (PFN_vkCmdPushConstants)vk->vkGetInstanceProcAddr(instance, "vkCmdPushConstants");
+    out->vkCmdBeginRenderPass =
+        (PFN_vkCmdBeginRenderPass)vk->vkGetInstanceProcAddr(instance, "vkCmdBeginRenderPass");
+    out->vkCmdNextSubpass =
+        (PFN_vkCmdNextSubpass)vk->vkGetInstanceProcAddr(instance, "vkCmdNextSubpass");
+    out->vkCmdEndRenderPass =
+        (PFN_vkCmdEndRenderPass)vk->vkGetInstanceProcAddr(instance, "vkCmdEndRenderPass");
+    out->vkCmdExecuteCommands =
+        (PFN_vkCmdExecuteCommands)vk->vkGetInstanceProcAddr(instance, "vkCmdExecuteCommands");
 #endif
 #ifdef VK_VERSION_1_1
-    out->vkBindBufferMemory2 = (PFN_vkBindBufferMemory2)vk->vkGetInstanceProcAddr(instance, "vkBindBufferMemory2");
-    out->vkBindImageMemory2 = (PFN_vkBindImageMemory2)vk->vkGetInstanceProcAddr(instance, "vkBindImageMemory2");
-    out->vkGetDeviceGroupPeerMemoryFeatures = (PFN_vkGetDeviceGroupPeerMemoryFeatures)vk->vkGetInstanceProcAddr(instance, "vkGetDeviceGroupPeerMemoryFeatures");
-    out->vkCmdSetDeviceMask = (PFN_vkCmdSetDeviceMask)vk->vkGetInstanceProcAddr(instance, "vkCmdSetDeviceMask");
-    out->vkCmdDispatchBase = (PFN_vkCmdDispatchBase)vk->vkGetInstanceProcAddr(instance, "vkCmdDispatchBase");
-    out->vkGetImageMemoryRequirements2 = (PFN_vkGetImageMemoryRequirements2)vk->vkGetInstanceProcAddr(instance, "vkGetImageMemoryRequirements2");
-    out->vkGetBufferMemoryRequirements2 = (PFN_vkGetBufferMemoryRequirements2)vk->vkGetInstanceProcAddr(instance, "vkGetBufferMemoryRequirements2");
-    out->vkGetImageSparseMemoryRequirements2 = (PFN_vkGetImageSparseMemoryRequirements2)vk->vkGetInstanceProcAddr(instance, "vkGetImageSparseMemoryRequirements2");
-    out->vkTrimCommandPool = (PFN_vkTrimCommandPool)vk->vkGetInstanceProcAddr(instance, "vkTrimCommandPool");
-    out->vkGetDeviceQueue2 = (PFN_vkGetDeviceQueue2)vk->vkGetInstanceProcAddr(instance, "vkGetDeviceQueue2");
-    out->vkCreateSamplerYcbcrConversion = (PFN_vkCreateSamplerYcbcrConversion)vk->vkGetInstanceProcAddr(instance, "vkCreateSamplerYcbcrConversion");
-    out->vkDestroySamplerYcbcrConversion = (PFN_vkDestroySamplerYcbcrConversion)vk->vkGetInstanceProcAddr(instance, "vkDestroySamplerYcbcrConversion");
-    out->vkCreateDescriptorUpdateTemplate = (PFN_vkCreateDescriptorUpdateTemplate)vk->vkGetInstanceProcAddr(instance, "vkCreateDescriptorUpdateTemplate");
-    out->vkDestroyDescriptorUpdateTemplate = (PFN_vkDestroyDescriptorUpdateTemplate)vk->vkGetInstanceProcAddr(instance, "vkDestroyDescriptorUpdateTemplate");
-    out->vkUpdateDescriptorSetWithTemplate = (PFN_vkUpdateDescriptorSetWithTemplate)vk->vkGetInstanceProcAddr(instance, "vkUpdateDescriptorSetWithTemplate");
-    out->vkGetDescriptorSetLayoutSupport = (PFN_vkGetDescriptorSetLayoutSupport)vk->vkGetInstanceProcAddr(instance, "vkGetDescriptorSetLayoutSupport");
+    out->vkBindBufferMemory2 =
+        (PFN_vkBindBufferMemory2)vk->vkGetInstanceProcAddr(instance, "vkBindBufferMemory2");
+    out->vkBindImageMemory2 =
+        (PFN_vkBindImageMemory2)vk->vkGetInstanceProcAddr(instance, "vkBindImageMemory2");
+    out->vkGetDeviceGroupPeerMemoryFeatures =
+        (PFN_vkGetDeviceGroupPeerMemoryFeatures)vk->vkGetInstanceProcAddr(
+            instance, "vkGetDeviceGroupPeerMemoryFeatures");
+    out->vkCmdSetDeviceMask =
+        (PFN_vkCmdSetDeviceMask)vk->vkGetInstanceProcAddr(instance, "vkCmdSetDeviceMask");
+    out->vkCmdDispatchBase =
+        (PFN_vkCmdDispatchBase)vk->vkGetInstanceProcAddr(instance, "vkCmdDispatchBase");
+    out->vkGetImageMemoryRequirements2 =
+        (PFN_vkGetImageMemoryRequirements2)vk->vkGetInstanceProcAddr(
+            instance, "vkGetImageMemoryRequirements2");
+    out->vkGetBufferMemoryRequirements2 =
+        (PFN_vkGetBufferMemoryRequirements2)vk->vkGetInstanceProcAddr(
+            instance, "vkGetBufferMemoryRequirements2");
+    out->vkGetImageSparseMemoryRequirements2 =
+        (PFN_vkGetImageSparseMemoryRequirements2)vk->vkGetInstanceProcAddr(
+            instance, "vkGetImageSparseMemoryRequirements2");
+    out->vkTrimCommandPool =
+        (PFN_vkTrimCommandPool)vk->vkGetInstanceProcAddr(instance, "vkTrimCommandPool");
+    out->vkGetDeviceQueue2 =
+        (PFN_vkGetDeviceQueue2)vk->vkGetInstanceProcAddr(instance, "vkGetDeviceQueue2");
+    out->vkCreateSamplerYcbcrConversion =
+        (PFN_vkCreateSamplerYcbcrConversion)vk->vkGetInstanceProcAddr(
+            instance, "vkCreateSamplerYcbcrConversion");
+    out->vkDestroySamplerYcbcrConversion =
+        (PFN_vkDestroySamplerYcbcrConversion)vk->vkGetInstanceProcAddr(
+            instance, "vkDestroySamplerYcbcrConversion");
+    out->vkCreateDescriptorUpdateTemplate =
+        (PFN_vkCreateDescriptorUpdateTemplate)vk->vkGetInstanceProcAddr(
+            instance, "vkCreateDescriptorUpdateTemplate");
+    out->vkDestroyDescriptorUpdateTemplate =
+        (PFN_vkDestroyDescriptorUpdateTemplate)vk->vkGetInstanceProcAddr(
+            instance, "vkDestroyDescriptorUpdateTemplate");
+    out->vkUpdateDescriptorSetWithTemplate =
+        (PFN_vkUpdateDescriptorSetWithTemplate)vk->vkGetInstanceProcAddr(
+            instance, "vkUpdateDescriptorSetWithTemplate");
+    out->vkGetDescriptorSetLayoutSupport =
+        (PFN_vkGetDescriptorSetLayoutSupport)vk->vkGetInstanceProcAddr(
+            instance, "vkGetDescriptorSetLayoutSupport");
 #endif
 #ifdef VK_VERSION_1_2
-    out->vkCmdDrawIndirectCount = (PFN_vkCmdDrawIndirectCount)vk->vkGetInstanceProcAddr(instance, "vkCmdDrawIndirectCount");
-    out->vkCmdDrawIndexedIndirectCount = (PFN_vkCmdDrawIndexedIndirectCount)vk->vkGetInstanceProcAddr(instance, "vkCmdDrawIndexedIndirectCount");
-    out->vkCreateRenderPass2 = (PFN_vkCreateRenderPass2)vk->vkGetInstanceProcAddr(instance, "vkCreateRenderPass2");
-    out->vkCmdBeginRenderPass2 = (PFN_vkCmdBeginRenderPass2)vk->vkGetInstanceProcAddr(instance, "vkCmdBeginRenderPass2");
-    out->vkCmdNextSubpass2 = (PFN_vkCmdNextSubpass2)vk->vkGetInstanceProcAddr(instance, "vkCmdNextSubpass2");
-    out->vkCmdEndRenderPass2 = (PFN_vkCmdEndRenderPass2)vk->vkGetInstanceProcAddr(instance, "vkCmdEndRenderPass2");
-    out->vkResetQueryPool = (PFN_vkResetQueryPool)vk->vkGetInstanceProcAddr(instance, "vkResetQueryPool");
-    out->vkGetSemaphoreCounterValue = (PFN_vkGetSemaphoreCounterValue)vk->vkGetInstanceProcAddr(instance, "vkGetSemaphoreCounterValue");
-    out->vkWaitSemaphores = (PFN_vkWaitSemaphores)vk->vkGetInstanceProcAddr(instance, "vkWaitSemaphores");
-    out->vkSignalSemaphore = (PFN_vkSignalSemaphore)vk->vkGetInstanceProcAddr(instance, "vkSignalSemaphore");
-    out->vkGetBufferDeviceAddress = (PFN_vkGetBufferDeviceAddress)vk->vkGetInstanceProcAddr(instance, "vkGetBufferDeviceAddress");
-    out->vkGetBufferOpaqueCaptureAddress = (PFN_vkGetBufferOpaqueCaptureAddress)vk->vkGetInstanceProcAddr(instance, "vkGetBufferOpaqueCaptureAddress");
-    out->vkGetDeviceMemoryOpaqueCaptureAddress = (PFN_vkGetDeviceMemoryOpaqueCaptureAddress)vk->vkGetInstanceProcAddr(instance, "vkGetDeviceMemoryOpaqueCaptureAddress");
+    out->vkCmdDrawIndirectCount =
+        (PFN_vkCmdDrawIndirectCount)vk->vkGetInstanceProcAddr(instance, "vkCmdDrawIndirectCount");
+    out->vkCmdDrawIndexedIndirectCount =
+        (PFN_vkCmdDrawIndexedIndirectCount)vk->vkGetInstanceProcAddr(
+            instance, "vkCmdDrawIndexedIndirectCount");
+    out->vkCreateRenderPass2 =
+        (PFN_vkCreateRenderPass2)vk->vkGetInstanceProcAddr(instance, "vkCreateRenderPass2");
+    out->vkCmdBeginRenderPass2 =
+        (PFN_vkCmdBeginRenderPass2)vk->vkGetInstanceProcAddr(instance, "vkCmdBeginRenderPass2");
+    out->vkCmdNextSubpass2 =
+        (PFN_vkCmdNextSubpass2)vk->vkGetInstanceProcAddr(instance, "vkCmdNextSubpass2");
+    out->vkCmdEndRenderPass2 =
+        (PFN_vkCmdEndRenderPass2)vk->vkGetInstanceProcAddr(instance, "vkCmdEndRenderPass2");
+    out->vkResetQueryPool =
+        (PFN_vkResetQueryPool)vk->vkGetInstanceProcAddr(instance, "vkResetQueryPool");
+    out->vkGetSemaphoreCounterValue = (PFN_vkGetSemaphoreCounterValue)vk->vkGetInstanceProcAddr(
+        instance, "vkGetSemaphoreCounterValue");
+    out->vkWaitSemaphores =
+        (PFN_vkWaitSemaphores)vk->vkGetInstanceProcAddr(instance, "vkWaitSemaphores");
+    out->vkSignalSemaphore =
+        (PFN_vkSignalSemaphore)vk->vkGetInstanceProcAddr(instance, "vkSignalSemaphore");
+    out->vkGetBufferDeviceAddress = (PFN_vkGetBufferDeviceAddress)vk->vkGetInstanceProcAddr(
+        instance, "vkGetBufferDeviceAddress");
+    out->vkGetBufferOpaqueCaptureAddress =
+        (PFN_vkGetBufferOpaqueCaptureAddress)vk->vkGetInstanceProcAddr(
+            instance, "vkGetBufferOpaqueCaptureAddress");
+    out->vkGetDeviceMemoryOpaqueCaptureAddress =
+        (PFN_vkGetDeviceMemoryOpaqueCaptureAddress)vk->vkGetInstanceProcAddr(
+            instance, "vkGetDeviceMemoryOpaqueCaptureAddress");
 #endif
 #ifdef VK_KHR_surface
-    out->vkGetPhysicalDeviceSurfaceSupportKHR = (PFN_vkGetPhysicalDeviceSurfaceSupportKHR)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceSupportKHR");
-    out->vkGetPhysicalDeviceSurfaceCapabilitiesKHR = (PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR");
-    out->vkGetPhysicalDeviceSurfaceFormatsKHR = (PFN_vkGetPhysicalDeviceSurfaceFormatsKHR)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceFormatsKHR");
-    out->vkGetPhysicalDeviceSurfacePresentModesKHR = (PFN_vkGetPhysicalDeviceSurfacePresentModesKHR)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfacePresentModesKHR");
+    out->vkGetPhysicalDeviceSurfaceSupportKHR =
+        (PFN_vkGetPhysicalDeviceSurfaceSupportKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceSurfaceSupportKHR");
+    out->vkGetPhysicalDeviceSurfaceCapabilitiesKHR =
+        (PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR");
+    out->vkGetPhysicalDeviceSurfaceFormatsKHR =
+        (PFN_vkGetPhysicalDeviceSurfaceFormatsKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceSurfaceFormatsKHR");
+    out->vkGetPhysicalDeviceSurfacePresentModesKHR =
+        (PFN_vkGetPhysicalDeviceSurfacePresentModesKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceSurfacePresentModesKHR");
 #endif
 #ifdef VK_KHR_swapchain
-    out->vkGetDeviceGroupPresentCapabilitiesKHR = (PFN_vkGetDeviceGroupPresentCapabilitiesKHR)vk->vkGetInstanceProcAddr(instance, "vkGetDeviceGroupPresentCapabilitiesKHR");
-    out->vkGetDeviceGroupSurfacePresentModesKHR = (PFN_vkGetDeviceGroupSurfacePresentModesKHR)vk->vkGetInstanceProcAddr(instance, "vkGetDeviceGroupSurfacePresentModesKHR");
-    out->vkGetPhysicalDevicePresentRectanglesKHR = (PFN_vkGetPhysicalDevicePresentRectanglesKHR)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDevicePresentRectanglesKHR");
-    out->vkAcquireNextImage2KHR = (PFN_vkAcquireNextImage2KHR)vk->vkGetInstanceProcAddr(instance, "vkAcquireNextImage2KHR");
+    out->vkGetDeviceGroupPresentCapabilitiesKHR =
+        (PFN_vkGetDeviceGroupPresentCapabilitiesKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetDeviceGroupPresentCapabilitiesKHR");
+    out->vkGetDeviceGroupSurfacePresentModesKHR =
+        (PFN_vkGetDeviceGroupSurfacePresentModesKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetDeviceGroupSurfacePresentModesKHR");
+    out->vkGetPhysicalDevicePresentRectanglesKHR =
+        (PFN_vkGetPhysicalDevicePresentRectanglesKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDevicePresentRectanglesKHR");
+    out->vkAcquireNextImage2KHR =
+        (PFN_vkAcquireNextImage2KHR)vk->vkGetInstanceProcAddr(instance, "vkAcquireNextImage2KHR");
 #endif
 #ifdef VK_KHR_display
-    out->vkGetPhysicalDeviceDisplayPropertiesKHR = (PFN_vkGetPhysicalDeviceDisplayPropertiesKHR)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceDisplayPropertiesKHR");
-    out->vkGetPhysicalDeviceDisplayPlanePropertiesKHR = (PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR");
-    out->vkGetDisplayPlaneSupportedDisplaysKHR = (PFN_vkGetDisplayPlaneSupportedDisplaysKHR)vk->vkGetInstanceProcAddr(instance, "vkGetDisplayPlaneSupportedDisplaysKHR");
-    out->vkGetDisplayModePropertiesKHR = (PFN_vkGetDisplayModePropertiesKHR)vk->vkGetInstanceProcAddr(instance, "vkGetDisplayModePropertiesKHR");
-    out->vkCreateDisplayModeKHR = (PFN_vkCreateDisplayModeKHR)vk->vkGetInstanceProcAddr(instance, "vkCreateDisplayModeKHR");
-    out->vkGetDisplayPlaneCapabilitiesKHR = (PFN_vkGetDisplayPlaneCapabilitiesKHR)vk->vkGetInstanceProcAddr(instance, "vkGetDisplayPlaneCapabilitiesKHR");
+    out->vkGetPhysicalDeviceDisplayPropertiesKHR =
+        (PFN_vkGetPhysicalDeviceDisplayPropertiesKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceDisplayPropertiesKHR");
+    out->vkGetPhysicalDeviceDisplayPlanePropertiesKHR =
+        (PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR");
+    out->vkGetDisplayPlaneSupportedDisplaysKHR =
+        (PFN_vkGetDisplayPlaneSupportedDisplaysKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetDisplayPlaneSupportedDisplaysKHR");
+    out->vkGetDisplayModePropertiesKHR =
+        (PFN_vkGetDisplayModePropertiesKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetDisplayModePropertiesKHR");
+    out->vkCreateDisplayModeKHR =
+        (PFN_vkCreateDisplayModeKHR)vk->vkGetInstanceProcAddr(instance, "vkCreateDisplayModeKHR");
+    out->vkGetDisplayPlaneCapabilitiesKHR =
+        (PFN_vkGetDisplayPlaneCapabilitiesKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetDisplayPlaneCapabilitiesKHR");
 #endif
 #ifdef VK_KHR_display_swapchain
-    out->vkCreateSharedSwapchainsKHR = (PFN_vkCreateSharedSwapchainsKHR)vk->vkGetInstanceProcAddr(instance, "vkCreateSharedSwapchainsKHR");
+    out->vkCreateSharedSwapchainsKHR = (PFN_vkCreateSharedSwapchainsKHR)vk->vkGetInstanceProcAddr(
+        instance, "vkCreateSharedSwapchainsKHR");
 #endif
 #ifdef VK_KHR_wayland_surface
-    out->vkGetPhysicalDeviceWaylandPresentationSupportKHR = (PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceWaylandPresentationSupportKHR");
+    out->vkGetPhysicalDeviceWaylandPresentationSupportKHR =
+        (PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceWaylandPresentationSupportKHR");
 #endif
 #ifdef VK_KHR_video_queue
-    out->vkGetPhysicalDeviceVideoCapabilitiesKHR = (PFN_vkGetPhysicalDeviceVideoCapabilitiesKHR)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceVideoCapabilitiesKHR");
-    out->vkGetPhysicalDeviceVideoFormatPropertiesKHR = (PFN_vkGetPhysicalDeviceVideoFormatPropertiesKHR)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceVideoFormatPropertiesKHR");
-    out->vkCreateVideoSessionKHR = (PFN_vkCreateVideoSessionKHR)vk->vkGetInstanceProcAddr(instance, "vkCreateVideoSessionKHR");
-    out->vkDestroyVideoSessionKHR = (PFN_vkDestroyVideoSessionKHR)vk->vkGetInstanceProcAddr(instance, "vkDestroyVideoSessionKHR");
-    out->vkGetVideoSessionMemoryRequirementsKHR = (PFN_vkGetVideoSessionMemoryRequirementsKHR)vk->vkGetInstanceProcAddr(instance, "vkGetVideoSessionMemoryRequirementsKHR");
-    out->vkBindVideoSessionMemoryKHR = (PFN_vkBindVideoSessionMemoryKHR)vk->vkGetInstanceProcAddr(instance, "vkBindVideoSessionMemoryKHR");
-    out->vkCreateVideoSessionParametersKHR = (PFN_vkCreateVideoSessionParametersKHR)vk->vkGetInstanceProcAddr(instance, "vkCreateVideoSessionParametersKHR");
-    out->vkUpdateVideoSessionParametersKHR = (PFN_vkUpdateVideoSessionParametersKHR)vk->vkGetInstanceProcAddr(instance, "vkUpdateVideoSessionParametersKHR");
-    out->vkDestroyVideoSessionParametersKHR = (PFN_vkDestroyVideoSessionParametersKHR)vk->vkGetInstanceProcAddr(instance, "vkDestroyVideoSessionParametersKHR");
-    out->vkCmdBeginVideoCodingKHR = (PFN_vkCmdBeginVideoCodingKHR)vk->vkGetInstanceProcAddr(instance, "vkCmdBeginVideoCodingKHR");
-    out->vkCmdEndVideoCodingKHR = (PFN_vkCmdEndVideoCodingKHR)vk->vkGetInstanceProcAddr(instance, "vkCmdEndVideoCodingKHR");
-    out->vkCmdControlVideoCodingKHR = (PFN_vkCmdControlVideoCodingKHR)vk->vkGetInstanceProcAddr(instance, "vkCmdControlVideoCodingKHR");
+    out->vkGetPhysicalDeviceVideoCapabilitiesKHR =
+        (PFN_vkGetPhysicalDeviceVideoCapabilitiesKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceVideoCapabilitiesKHR");
+    out->vkGetPhysicalDeviceVideoFormatPropertiesKHR =
+        (PFN_vkGetPhysicalDeviceVideoFormatPropertiesKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceVideoFormatPropertiesKHR");
+    out->vkCreateVideoSessionKHR =
+        (PFN_vkCreateVideoSessionKHR)vk->vkGetInstanceProcAddr(instance, "vkCreateVideoSessionKHR");
+    out->vkDestroyVideoSessionKHR = (PFN_vkDestroyVideoSessionKHR)vk->vkGetInstanceProcAddr(
+        instance, "vkDestroyVideoSessionKHR");
+    out->vkGetVideoSessionMemoryRequirementsKHR =
+        (PFN_vkGetVideoSessionMemoryRequirementsKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetVideoSessionMemoryRequirementsKHR");
+    out->vkBindVideoSessionMemoryKHR = (PFN_vkBindVideoSessionMemoryKHR)vk->vkGetInstanceProcAddr(
+        instance, "vkBindVideoSessionMemoryKHR");
+    out->vkCreateVideoSessionParametersKHR =
+        (PFN_vkCreateVideoSessionParametersKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkCreateVideoSessionParametersKHR");
+    out->vkUpdateVideoSessionParametersKHR =
+        (PFN_vkUpdateVideoSessionParametersKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkUpdateVideoSessionParametersKHR");
+    out->vkDestroyVideoSessionParametersKHR =
+        (PFN_vkDestroyVideoSessionParametersKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkDestroyVideoSessionParametersKHR");
+    out->vkCmdBeginVideoCodingKHR = (PFN_vkCmdBeginVideoCodingKHR)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdBeginVideoCodingKHR");
+    out->vkCmdEndVideoCodingKHR =
+        (PFN_vkCmdEndVideoCodingKHR)vk->vkGetInstanceProcAddr(instance, "vkCmdEndVideoCodingKHR");
+    out->vkCmdControlVideoCodingKHR = (PFN_vkCmdControlVideoCodingKHR)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdControlVideoCodingKHR");
 #endif
 #ifdef VK_KHR_video_decode_queue
-    out->vkCmdDecodeVideoKHR = (PFN_vkCmdDecodeVideoKHR)vk->vkGetInstanceProcAddr(instance, "vkCmdDecodeVideoKHR");
+    out->vkCmdDecodeVideoKHR =
+        (PFN_vkCmdDecodeVideoKHR)vk->vkGetInstanceProcAddr(instance, "vkCmdDecodeVideoKHR");
 #endif
 #ifdef VK_KHR_dynamic_rendering
-    out->vkCmdBeginRenderingKHR = (PFN_vkCmdBeginRenderingKHR)vk->vkGetInstanceProcAddr(instance, "vkCmdBeginRenderingKHR");
-    out->vkCmdEndRenderingKHR = (PFN_vkCmdEndRenderingKHR)vk->vkGetInstanceProcAddr(instance, "vkCmdEndRenderingKHR");
+    out->vkCmdBeginRenderingKHR =
+        (PFN_vkCmdBeginRenderingKHR)vk->vkGetInstanceProcAddr(instance, "vkCmdBeginRenderingKHR");
+    out->vkCmdEndRenderingKHR =
+        (PFN_vkCmdEndRenderingKHR)vk->vkGetInstanceProcAddr(instance, "vkCmdEndRenderingKHR");
 #endif
 #ifdef VK_KHR_get_physical_device_properties2
-    out->vkGetPhysicalDeviceFeatures2KHR = (PFN_vkGetPhysicalDeviceFeatures2KHR)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFeatures2KHR");
-    out->vkGetPhysicalDeviceProperties2KHR = (PFN_vkGetPhysicalDeviceProperties2KHR)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceProperties2KHR");
-    out->vkGetPhysicalDeviceFormatProperties2KHR = (PFN_vkGetPhysicalDeviceFormatProperties2KHR)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFormatProperties2KHR");
-    out->vkGetPhysicalDeviceImageFormatProperties2KHR = (PFN_vkGetPhysicalDeviceImageFormatProperties2KHR)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceImageFormatProperties2KHR");
-    out->vkGetPhysicalDeviceQueueFamilyProperties2KHR = (PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceQueueFamilyProperties2KHR");
-    out->vkGetPhysicalDeviceMemoryProperties2KHR = (PFN_vkGetPhysicalDeviceMemoryProperties2KHR)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceMemoryProperties2KHR");
-    out->vkGetPhysicalDeviceSparseImageFormatProperties2KHR = (PFN_vkGetPhysicalDeviceSparseImageFormatProperties2KHR)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSparseImageFormatProperties2KHR");
+    out->vkGetPhysicalDeviceFeatures2KHR =
+        (PFN_vkGetPhysicalDeviceFeatures2KHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceFeatures2KHR");
+    out->vkGetPhysicalDeviceProperties2KHR =
+        (PFN_vkGetPhysicalDeviceProperties2KHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceProperties2KHR");
+    out->vkGetPhysicalDeviceFormatProperties2KHR =
+        (PFN_vkGetPhysicalDeviceFormatProperties2KHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceFormatProperties2KHR");
+    out->vkGetPhysicalDeviceImageFormatProperties2KHR =
+        (PFN_vkGetPhysicalDeviceImageFormatProperties2KHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceImageFormatProperties2KHR");
+    out->vkGetPhysicalDeviceQueueFamilyProperties2KHR =
+        (PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceQueueFamilyProperties2KHR");
+    out->vkGetPhysicalDeviceMemoryProperties2KHR =
+        (PFN_vkGetPhysicalDeviceMemoryProperties2KHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceMemoryProperties2KHR");
+    out->vkGetPhysicalDeviceSparseImageFormatProperties2KHR =
+        (PFN_vkGetPhysicalDeviceSparseImageFormatProperties2KHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceSparseImageFormatProperties2KHR");
 #endif
 #ifdef VK_KHR_device_group
-    out->vkGetDeviceGroupPeerMemoryFeaturesKHR = (PFN_vkGetDeviceGroupPeerMemoryFeaturesKHR)vk->vkGetInstanceProcAddr(instance, "vkGetDeviceGroupPeerMemoryFeaturesKHR");
-    out->vkCmdSetDeviceMaskKHR = (PFN_vkCmdSetDeviceMaskKHR)vk->vkGetInstanceProcAddr(instance, "vkCmdSetDeviceMaskKHR");
-    out->vkCmdDispatchBaseKHR = (PFN_vkCmdDispatchBaseKHR)vk->vkGetInstanceProcAddr(instance, "vkCmdDispatchBaseKHR");
+    out->vkGetDeviceGroupPeerMemoryFeaturesKHR =
+        (PFN_vkGetDeviceGroupPeerMemoryFeaturesKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetDeviceGroupPeerMemoryFeaturesKHR");
+    out->vkCmdSetDeviceMaskKHR =
+        (PFN_vkCmdSetDeviceMaskKHR)vk->vkGetInstanceProcAddr(instance, "vkCmdSetDeviceMaskKHR");
+    out->vkCmdDispatchBaseKHR =
+        (PFN_vkCmdDispatchBaseKHR)vk->vkGetInstanceProcAddr(instance, "vkCmdDispatchBaseKHR");
 #endif
 #ifdef VK_KHR_maintenance1
-    out->vkTrimCommandPoolKHR = (PFN_vkTrimCommandPoolKHR)vk->vkGetInstanceProcAddr(instance, "vkTrimCommandPoolKHR");
+    out->vkTrimCommandPoolKHR =
+        (PFN_vkTrimCommandPoolKHR)vk->vkGetInstanceProcAddr(instance, "vkTrimCommandPoolKHR");
 #endif
 #ifdef VK_KHR_external_memory_capabilities
-    out->vkGetPhysicalDeviceExternalBufferPropertiesKHR = (PFN_vkGetPhysicalDeviceExternalBufferPropertiesKHR)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalBufferPropertiesKHR");
+    out->vkGetPhysicalDeviceExternalBufferPropertiesKHR =
+        (PFN_vkGetPhysicalDeviceExternalBufferPropertiesKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceExternalBufferPropertiesKHR");
 #endif
 #ifdef VK_KHR_external_memory_win32
-    out->vkGetMemoryWin32HandleKHR = (PFN_vkGetMemoryWin32HandleKHR)vk->vkGetInstanceProcAddr(instance, "vkGetMemoryWin32HandleKHR");
-    out->vkGetMemoryWin32HandlePropertiesKHR = (PFN_vkGetMemoryWin32HandlePropertiesKHR)vk->vkGetInstanceProcAddr(instance, "vkGetMemoryWin32HandlePropertiesKHR");
+    out->vkGetMemoryWin32HandleKHR = (PFN_vkGetMemoryWin32HandleKHR)vk->vkGetInstanceProcAddr(
+        instance, "vkGetMemoryWin32HandleKHR");
+    out->vkGetMemoryWin32HandlePropertiesKHR =
+        (PFN_vkGetMemoryWin32HandlePropertiesKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetMemoryWin32HandlePropertiesKHR");
 #endif
 #ifdef VK_KHR_external_memory_fd
-    out->vkGetMemoryFdKHR = (PFN_vkGetMemoryFdKHR)vk->vkGetInstanceProcAddr(instance, "vkGetMemoryFdKHR");
-    out->vkGetMemoryFdPropertiesKHR = (PFN_vkGetMemoryFdPropertiesKHR)vk->vkGetInstanceProcAddr(instance, "vkGetMemoryFdPropertiesKHR");
+    out->vkGetMemoryFdKHR =
+        (PFN_vkGetMemoryFdKHR)vk->vkGetInstanceProcAddr(instance, "vkGetMemoryFdKHR");
+    out->vkGetMemoryFdPropertiesKHR = (PFN_vkGetMemoryFdPropertiesKHR)vk->vkGetInstanceProcAddr(
+        instance, "vkGetMemoryFdPropertiesKHR");
 #endif
 #ifdef VK_KHR_external_semaphore_capabilities
-    out->vkGetPhysicalDeviceExternalSemaphorePropertiesKHR = (PFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalSemaphorePropertiesKHR");
+    out->vkGetPhysicalDeviceExternalSemaphorePropertiesKHR =
+        (PFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceExternalSemaphorePropertiesKHR");
 #endif
 #ifdef VK_KHR_external_semaphore_win32
-    out->vkImportSemaphoreWin32HandleKHR = (PFN_vkImportSemaphoreWin32HandleKHR)vk->vkGetInstanceProcAddr(instance, "vkImportSemaphoreWin32HandleKHR");
-    out->vkGetSemaphoreWin32HandleKHR = (PFN_vkGetSemaphoreWin32HandleKHR)vk->vkGetInstanceProcAddr(instance, "vkGetSemaphoreWin32HandleKHR");
+    out->vkImportSemaphoreWin32HandleKHR =
+        (PFN_vkImportSemaphoreWin32HandleKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkImportSemaphoreWin32HandleKHR");
+    out->vkGetSemaphoreWin32HandleKHR = (PFN_vkGetSemaphoreWin32HandleKHR)vk->vkGetInstanceProcAddr(
+        instance, "vkGetSemaphoreWin32HandleKHR");
 #endif
 #ifdef VK_KHR_external_semaphore_fd
-    out->vkImportSemaphoreFdKHR = (PFN_vkImportSemaphoreFdKHR)vk->vkGetInstanceProcAddr(instance, "vkImportSemaphoreFdKHR");
-    out->vkGetSemaphoreFdKHR = (PFN_vkGetSemaphoreFdKHR)vk->vkGetInstanceProcAddr(instance, "vkGetSemaphoreFdKHR");
+    out->vkImportSemaphoreFdKHR =
+        (PFN_vkImportSemaphoreFdKHR)vk->vkGetInstanceProcAddr(instance, "vkImportSemaphoreFdKHR");
+    out->vkGetSemaphoreFdKHR =
+        (PFN_vkGetSemaphoreFdKHR)vk->vkGetInstanceProcAddr(instance, "vkGetSemaphoreFdKHR");
 #endif
 #ifdef VK_KHR_push_descriptor
-    out->vkCmdPushDescriptorSetKHR = (PFN_vkCmdPushDescriptorSetKHR)vk->vkGetInstanceProcAddr(instance, "vkCmdPushDescriptorSetKHR");
-    out->vkCmdPushDescriptorSetWithTemplateKHR = (PFN_vkCmdPushDescriptorSetWithTemplateKHR)vk->vkGetInstanceProcAddr(instance, "vkCmdPushDescriptorSetWithTemplateKHR");
+    out->vkCmdPushDescriptorSetKHR = (PFN_vkCmdPushDescriptorSetKHR)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdPushDescriptorSetKHR");
+    out->vkCmdPushDescriptorSetWithTemplateKHR =
+        (PFN_vkCmdPushDescriptorSetWithTemplateKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkCmdPushDescriptorSetWithTemplateKHR");
 #endif
 #ifdef VK_KHR_descriptor_update_template
-    out->vkCreateDescriptorUpdateTemplateKHR = (PFN_vkCreateDescriptorUpdateTemplateKHR)vk->vkGetInstanceProcAddr(instance, "vkCreateDescriptorUpdateTemplateKHR");
-    out->vkDestroyDescriptorUpdateTemplateKHR = (PFN_vkDestroyDescriptorUpdateTemplateKHR)vk->vkGetInstanceProcAddr(instance, "vkDestroyDescriptorUpdateTemplateKHR");
-    out->vkUpdateDescriptorSetWithTemplateKHR = (PFN_vkUpdateDescriptorSetWithTemplateKHR)vk->vkGetInstanceProcAddr(instance, "vkUpdateDescriptorSetWithTemplateKHR");
+    out->vkCreateDescriptorUpdateTemplateKHR =
+        (PFN_vkCreateDescriptorUpdateTemplateKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkCreateDescriptorUpdateTemplateKHR");
+    out->vkDestroyDescriptorUpdateTemplateKHR =
+        (PFN_vkDestroyDescriptorUpdateTemplateKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkDestroyDescriptorUpdateTemplateKHR");
+    out->vkUpdateDescriptorSetWithTemplateKHR =
+        (PFN_vkUpdateDescriptorSetWithTemplateKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkUpdateDescriptorSetWithTemplateKHR");
 #endif
 #ifdef VK_KHR_create_renderpass2
-    out->vkCreateRenderPass2KHR = (PFN_vkCreateRenderPass2KHR)vk->vkGetInstanceProcAddr(instance, "vkCreateRenderPass2KHR");
-    out->vkCmdBeginRenderPass2KHR = (PFN_vkCmdBeginRenderPass2KHR)vk->vkGetInstanceProcAddr(instance, "vkCmdBeginRenderPass2KHR");
-    out->vkCmdNextSubpass2KHR = (PFN_vkCmdNextSubpass2KHR)vk->vkGetInstanceProcAddr(instance, "vkCmdNextSubpass2KHR");
-    out->vkCmdEndRenderPass2KHR = (PFN_vkCmdEndRenderPass2KHR)vk->vkGetInstanceProcAddr(instance, "vkCmdEndRenderPass2KHR");
+    out->vkCreateRenderPass2KHR =
+        (PFN_vkCreateRenderPass2KHR)vk->vkGetInstanceProcAddr(instance, "vkCreateRenderPass2KHR");
+    out->vkCmdBeginRenderPass2KHR = (PFN_vkCmdBeginRenderPass2KHR)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdBeginRenderPass2KHR");
+    out->vkCmdNextSubpass2KHR =
+        (PFN_vkCmdNextSubpass2KHR)vk->vkGetInstanceProcAddr(instance, "vkCmdNextSubpass2KHR");
+    out->vkCmdEndRenderPass2KHR =
+        (PFN_vkCmdEndRenderPass2KHR)vk->vkGetInstanceProcAddr(instance, "vkCmdEndRenderPass2KHR");
 #endif
 #ifdef VK_KHR_shared_presentable_image
-    out->vkGetSwapchainStatusKHR = (PFN_vkGetSwapchainStatusKHR)vk->vkGetInstanceProcAddr(instance, "vkGetSwapchainStatusKHR");
+    out->vkGetSwapchainStatusKHR =
+        (PFN_vkGetSwapchainStatusKHR)vk->vkGetInstanceProcAddr(instance, "vkGetSwapchainStatusKHR");
 #endif
 #ifdef VK_KHR_external_fence_capabilities
-    out->vkGetPhysicalDeviceExternalFencePropertiesKHR = (PFN_vkGetPhysicalDeviceExternalFencePropertiesKHR)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalFencePropertiesKHR");
+    out->vkGetPhysicalDeviceExternalFencePropertiesKHR =
+        (PFN_vkGetPhysicalDeviceExternalFencePropertiesKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceExternalFencePropertiesKHR");
 #endif
 #ifdef VK_KHR_external_fence_win32
-    out->vkImportFenceWin32HandleKHR = (PFN_vkImportFenceWin32HandleKHR)vk->vkGetInstanceProcAddr(instance, "vkImportFenceWin32HandleKHR");
-    out->vkGetFenceWin32HandleKHR = (PFN_vkGetFenceWin32HandleKHR)vk->vkGetInstanceProcAddr(instance, "vkGetFenceWin32HandleKHR");
+    out->vkImportFenceWin32HandleKHR = (PFN_vkImportFenceWin32HandleKHR)vk->vkGetInstanceProcAddr(
+        instance, "vkImportFenceWin32HandleKHR");
+    out->vkGetFenceWin32HandleKHR = (PFN_vkGetFenceWin32HandleKHR)vk->vkGetInstanceProcAddr(
+        instance, "vkGetFenceWin32HandleKHR");
 #endif
 #ifdef VK_KHR_external_fence_fd
-    out->vkImportFenceFdKHR = (PFN_vkImportFenceFdKHR)vk->vkGetInstanceProcAddr(instance, "vkImportFenceFdKHR");
-    out->vkGetFenceFdKHR = (PFN_vkGetFenceFdKHR)vk->vkGetInstanceProcAddr(instance, "vkGetFenceFdKHR");
+    out->vkImportFenceFdKHR =
+        (PFN_vkImportFenceFdKHR)vk->vkGetInstanceProcAddr(instance, "vkImportFenceFdKHR");
+    out->vkGetFenceFdKHR =
+        (PFN_vkGetFenceFdKHR)vk->vkGetInstanceProcAddr(instance, "vkGetFenceFdKHR");
 #endif
 #ifdef VK_KHR_performance_query
-    out->vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR = (PFN_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR)vk->vkGetInstanceProcAddr(instance, "vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR");
-    out->vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR = (PFN_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR");
-    out->vkAcquireProfilingLockKHR = (PFN_vkAcquireProfilingLockKHR)vk->vkGetInstanceProcAddr(instance, "vkAcquireProfilingLockKHR");
-    out->vkReleaseProfilingLockKHR = (PFN_vkReleaseProfilingLockKHR)vk->vkGetInstanceProcAddr(instance, "vkReleaseProfilingLockKHR");
+    out->vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR =
+        (PFN_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR)
+            vk->vkGetInstanceProcAddr(
+                instance, "vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR");
+    out->vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR =
+        (PFN_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR");
+    out->vkAcquireProfilingLockKHR = (PFN_vkAcquireProfilingLockKHR)vk->vkGetInstanceProcAddr(
+        instance, "vkAcquireProfilingLockKHR");
+    out->vkReleaseProfilingLockKHR = (PFN_vkReleaseProfilingLockKHR)vk->vkGetInstanceProcAddr(
+        instance, "vkReleaseProfilingLockKHR");
 #endif
 #ifdef VK_KHR_get_surface_capabilities2
-    out->vkGetPhysicalDeviceSurfaceCapabilities2KHR = (PFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceCapabilities2KHR");
-    out->vkGetPhysicalDeviceSurfaceFormats2KHR = (PFN_vkGetPhysicalDeviceSurfaceFormats2KHR)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceFormats2KHR");
+    out->vkGetPhysicalDeviceSurfaceCapabilities2KHR =
+        (PFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceSurfaceCapabilities2KHR");
+    out->vkGetPhysicalDeviceSurfaceFormats2KHR =
+        (PFN_vkGetPhysicalDeviceSurfaceFormats2KHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceSurfaceFormats2KHR");
 #endif
 #ifdef VK_KHR_get_display_properties2
-    out->vkGetPhysicalDeviceDisplayProperties2KHR = (PFN_vkGetPhysicalDeviceDisplayProperties2KHR)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceDisplayProperties2KHR");
-    out->vkGetPhysicalDeviceDisplayPlaneProperties2KHR = (PFN_vkGetPhysicalDeviceDisplayPlaneProperties2KHR)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceDisplayPlaneProperties2KHR");
-    out->vkGetDisplayModeProperties2KHR = (PFN_vkGetDisplayModeProperties2KHR)vk->vkGetInstanceProcAddr(instance, "vkGetDisplayModeProperties2KHR");
-    out->vkGetDisplayPlaneCapabilities2KHR = (PFN_vkGetDisplayPlaneCapabilities2KHR)vk->vkGetInstanceProcAddr(instance, "vkGetDisplayPlaneCapabilities2KHR");
+    out->vkGetPhysicalDeviceDisplayProperties2KHR =
+        (PFN_vkGetPhysicalDeviceDisplayProperties2KHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceDisplayProperties2KHR");
+    out->vkGetPhysicalDeviceDisplayPlaneProperties2KHR =
+        (PFN_vkGetPhysicalDeviceDisplayPlaneProperties2KHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceDisplayPlaneProperties2KHR");
+    out->vkGetDisplayModeProperties2KHR =
+        (PFN_vkGetDisplayModeProperties2KHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetDisplayModeProperties2KHR");
+    out->vkGetDisplayPlaneCapabilities2KHR =
+        (PFN_vkGetDisplayPlaneCapabilities2KHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetDisplayPlaneCapabilities2KHR");
 #endif
 #ifdef VK_KHR_get_memory_requirements2
-    out->vkGetImageMemoryRequirements2KHR = (PFN_vkGetImageMemoryRequirements2KHR)vk->vkGetInstanceProcAddr(instance, "vkGetImageMemoryRequirements2KHR");
-    out->vkGetBufferMemoryRequirements2KHR = (PFN_vkGetBufferMemoryRequirements2KHR)vk->vkGetInstanceProcAddr(instance, "vkGetBufferMemoryRequirements2KHR");
-    out->vkGetImageSparseMemoryRequirements2KHR = (PFN_vkGetImageSparseMemoryRequirements2KHR)vk->vkGetInstanceProcAddr(instance, "vkGetImageSparseMemoryRequirements2KHR");
+    out->vkGetImageMemoryRequirements2KHR =
+        (PFN_vkGetImageMemoryRequirements2KHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetImageMemoryRequirements2KHR");
+    out->vkGetBufferMemoryRequirements2KHR =
+        (PFN_vkGetBufferMemoryRequirements2KHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetBufferMemoryRequirements2KHR");
+    out->vkGetImageSparseMemoryRequirements2KHR =
+        (PFN_vkGetImageSparseMemoryRequirements2KHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetImageSparseMemoryRequirements2KHR");
 #endif
 #ifdef VK_KHR_sampler_ycbcr_conversion
-    out->vkCreateSamplerYcbcrConversionKHR = (PFN_vkCreateSamplerYcbcrConversionKHR)vk->vkGetInstanceProcAddr(instance, "vkCreateSamplerYcbcrConversionKHR");
-    out->vkDestroySamplerYcbcrConversionKHR = (PFN_vkDestroySamplerYcbcrConversionKHR)vk->vkGetInstanceProcAddr(instance, "vkDestroySamplerYcbcrConversionKHR");
+    out->vkCreateSamplerYcbcrConversionKHR =
+        (PFN_vkCreateSamplerYcbcrConversionKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkCreateSamplerYcbcrConversionKHR");
+    out->vkDestroySamplerYcbcrConversionKHR =
+        (PFN_vkDestroySamplerYcbcrConversionKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkDestroySamplerYcbcrConversionKHR");
 #endif
 #ifdef VK_KHR_bind_memory2
-    out->vkBindBufferMemory2KHR = (PFN_vkBindBufferMemory2KHR)vk->vkGetInstanceProcAddr(instance, "vkBindBufferMemory2KHR");
-    out->vkBindImageMemory2KHR = (PFN_vkBindImageMemory2KHR)vk->vkGetInstanceProcAddr(instance, "vkBindImageMemory2KHR");
+    out->vkBindBufferMemory2KHR =
+        (PFN_vkBindBufferMemory2KHR)vk->vkGetInstanceProcAddr(instance, "vkBindBufferMemory2KHR");
+    out->vkBindImageMemory2KHR =
+        (PFN_vkBindImageMemory2KHR)vk->vkGetInstanceProcAddr(instance, "vkBindImageMemory2KHR");
 #endif
 #ifdef VK_KHR_maintenance3
-    out->vkGetDescriptorSetLayoutSupportKHR = (PFN_vkGetDescriptorSetLayoutSupportKHR)vk->vkGetInstanceProcAddr(instance, "vkGetDescriptorSetLayoutSupportKHR");
+    out->vkGetDescriptorSetLayoutSupportKHR =
+        (PFN_vkGetDescriptorSetLayoutSupportKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetDescriptorSetLayoutSupportKHR");
 #endif
 #ifdef VK_KHR_draw_indirect_count
-    out->vkCmdDrawIndirectCountKHR = (PFN_vkCmdDrawIndirectCountKHR)vk->vkGetInstanceProcAddr(instance, "vkCmdDrawIndirectCountKHR");
-    out->vkCmdDrawIndexedIndirectCountKHR = (PFN_vkCmdDrawIndexedIndirectCountKHR)vk->vkGetInstanceProcAddr(instance, "vkCmdDrawIndexedIndirectCountKHR");
+    out->vkCmdDrawIndirectCountKHR = (PFN_vkCmdDrawIndirectCountKHR)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdDrawIndirectCountKHR");
+    out->vkCmdDrawIndexedIndirectCountKHR =
+        (PFN_vkCmdDrawIndexedIndirectCountKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkCmdDrawIndexedIndirectCountKHR");
 #endif
 #ifdef VK_KHR_timeline_semaphore
-    out->vkGetSemaphoreCounterValueKHR = (PFN_vkGetSemaphoreCounterValueKHR)vk->vkGetInstanceProcAddr(instance, "vkGetSemaphoreCounterValueKHR");
-    out->vkWaitSemaphoresKHR = (PFN_vkWaitSemaphoresKHR)vk->vkGetInstanceProcAddr(instance, "vkWaitSemaphoresKHR");
-    out->vkSignalSemaphoreKHR = (PFN_vkSignalSemaphoreKHR)vk->vkGetInstanceProcAddr(instance, "vkSignalSemaphoreKHR");
+    out->vkGetSemaphoreCounterValueKHR =
+        (PFN_vkGetSemaphoreCounterValueKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetSemaphoreCounterValueKHR");
+    out->vkWaitSemaphoresKHR =
+        (PFN_vkWaitSemaphoresKHR)vk->vkGetInstanceProcAddr(instance, "vkWaitSemaphoresKHR");
+    out->vkSignalSemaphoreKHR =
+        (PFN_vkSignalSemaphoreKHR)vk->vkGetInstanceProcAddr(instance, "vkSignalSemaphoreKHR");
 #endif
 #ifdef VK_KHR_fragment_shading_rate
-    out->vkGetPhysicalDeviceFragmentShadingRatesKHR = (PFN_vkGetPhysicalDeviceFragmentShadingRatesKHR)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFragmentShadingRatesKHR");
-    out->vkCmdSetFragmentShadingRateKHR = (PFN_vkCmdSetFragmentShadingRateKHR)vk->vkGetInstanceProcAddr(instance, "vkCmdSetFragmentShadingRateKHR");
+    out->vkGetPhysicalDeviceFragmentShadingRatesKHR =
+        (PFN_vkGetPhysicalDeviceFragmentShadingRatesKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceFragmentShadingRatesKHR");
+    out->vkCmdSetFragmentShadingRateKHR =
+        (PFN_vkCmdSetFragmentShadingRateKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkCmdSetFragmentShadingRateKHR");
 #endif
 #ifdef VK_KHR_present_wait
-    out->vkWaitForPresentKHR = (PFN_vkWaitForPresentKHR)vk->vkGetInstanceProcAddr(instance, "vkWaitForPresentKHR");
+    out->vkWaitForPresentKHR =
+        (PFN_vkWaitForPresentKHR)vk->vkGetInstanceProcAddr(instance, "vkWaitForPresentKHR");
 #endif
 #ifdef VK_KHR_buffer_device_address
-    out->vkGetBufferDeviceAddressKHR = (PFN_vkGetBufferDeviceAddressKHR)vk->vkGetInstanceProcAddr(instance, "vkGetBufferDeviceAddressKHR");
-    out->vkGetBufferOpaqueCaptureAddressKHR = (PFN_vkGetBufferOpaqueCaptureAddressKHR)vk->vkGetInstanceProcAddr(instance, "vkGetBufferOpaqueCaptureAddressKHR");
-    out->vkGetDeviceMemoryOpaqueCaptureAddressKHR = (PFN_vkGetDeviceMemoryOpaqueCaptureAddressKHR)vk->vkGetInstanceProcAddr(instance, "vkGetDeviceMemoryOpaqueCaptureAddressKHR");
+    out->vkGetBufferDeviceAddressKHR = (PFN_vkGetBufferDeviceAddressKHR)vk->vkGetInstanceProcAddr(
+        instance, "vkGetBufferDeviceAddressKHR");
+    out->vkGetBufferOpaqueCaptureAddressKHR =
+        (PFN_vkGetBufferOpaqueCaptureAddressKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetBufferOpaqueCaptureAddressKHR");
+    out->vkGetDeviceMemoryOpaqueCaptureAddressKHR =
+        (PFN_vkGetDeviceMemoryOpaqueCaptureAddressKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetDeviceMemoryOpaqueCaptureAddressKHR");
 #endif
 #ifdef VK_KHR_deferred_host_operations
-    out->vkCreateDeferredOperationKHR = (PFN_vkCreateDeferredOperationKHR)vk->vkGetInstanceProcAddr(instance, "vkCreateDeferredOperationKHR");
-    out->vkDestroyDeferredOperationKHR = (PFN_vkDestroyDeferredOperationKHR)vk->vkGetInstanceProcAddr(instance, "vkDestroyDeferredOperationKHR");
-    out->vkGetDeferredOperationMaxConcurrencyKHR = (PFN_vkGetDeferredOperationMaxConcurrencyKHR)vk->vkGetInstanceProcAddr(instance, "vkGetDeferredOperationMaxConcurrencyKHR");
-    out->vkGetDeferredOperationResultKHR = (PFN_vkGetDeferredOperationResultKHR)vk->vkGetInstanceProcAddr(instance, "vkGetDeferredOperationResultKHR");
-    out->vkDeferredOperationJoinKHR = (PFN_vkDeferredOperationJoinKHR)vk->vkGetInstanceProcAddr(instance, "vkDeferredOperationJoinKHR");
+    out->vkCreateDeferredOperationKHR = (PFN_vkCreateDeferredOperationKHR)vk->vkGetInstanceProcAddr(
+        instance, "vkCreateDeferredOperationKHR");
+    out->vkDestroyDeferredOperationKHR =
+        (PFN_vkDestroyDeferredOperationKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkDestroyDeferredOperationKHR");
+    out->vkGetDeferredOperationMaxConcurrencyKHR =
+        (PFN_vkGetDeferredOperationMaxConcurrencyKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetDeferredOperationMaxConcurrencyKHR");
+    out->vkGetDeferredOperationResultKHR =
+        (PFN_vkGetDeferredOperationResultKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetDeferredOperationResultKHR");
+    out->vkDeferredOperationJoinKHR = (PFN_vkDeferredOperationJoinKHR)vk->vkGetInstanceProcAddr(
+        instance, "vkDeferredOperationJoinKHR");
 #endif
 #ifdef VK_KHR_pipeline_executable_properties
-    out->vkGetPipelineExecutablePropertiesKHR = (PFN_vkGetPipelineExecutablePropertiesKHR)vk->vkGetInstanceProcAddr(instance, "vkGetPipelineExecutablePropertiesKHR");
-    out->vkGetPipelineExecutableStatisticsKHR = (PFN_vkGetPipelineExecutableStatisticsKHR)vk->vkGetInstanceProcAddr(instance, "vkGetPipelineExecutableStatisticsKHR");
-    out->vkGetPipelineExecutableInternalRepresentationsKHR = (PFN_vkGetPipelineExecutableInternalRepresentationsKHR)vk->vkGetInstanceProcAddr(instance, "vkGetPipelineExecutableInternalRepresentationsKHR");
+    out->vkGetPipelineExecutablePropertiesKHR =
+        (PFN_vkGetPipelineExecutablePropertiesKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPipelineExecutablePropertiesKHR");
+    out->vkGetPipelineExecutableStatisticsKHR =
+        (PFN_vkGetPipelineExecutableStatisticsKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPipelineExecutableStatisticsKHR");
+    out->vkGetPipelineExecutableInternalRepresentationsKHR =
+        (PFN_vkGetPipelineExecutableInternalRepresentationsKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPipelineExecutableInternalRepresentationsKHR");
 #endif
 #ifdef VK_KHR_video_encode_queue
-    out->vkCmdEncodeVideoKHR = (PFN_vkCmdEncodeVideoKHR)vk->vkGetInstanceProcAddr(instance, "vkCmdEncodeVideoKHR");
+    out->vkCmdEncodeVideoKHR =
+        (PFN_vkCmdEncodeVideoKHR)vk->vkGetInstanceProcAddr(instance, "vkCmdEncodeVideoKHR");
 #endif
 #ifdef VK_KHR_synchronization2
-    out->vkCmdSetEvent2KHR = (PFN_vkCmdSetEvent2KHR)vk->vkGetInstanceProcAddr(instance, "vkCmdSetEvent2KHR");
-    out->vkCmdResetEvent2KHR = (PFN_vkCmdResetEvent2KHR)vk->vkGetInstanceProcAddr(instance, "vkCmdResetEvent2KHR");
-    out->vkCmdWaitEvents2KHR = (PFN_vkCmdWaitEvents2KHR)vk->vkGetInstanceProcAddr(instance, "vkCmdWaitEvents2KHR");
-    out->vkCmdPipelineBarrier2KHR = (PFN_vkCmdPipelineBarrier2KHR)vk->vkGetInstanceProcAddr(instance, "vkCmdPipelineBarrier2KHR");
-    out->vkCmdWriteTimestamp2KHR = (PFN_vkCmdWriteTimestamp2KHR)vk->vkGetInstanceProcAddr(instance, "vkCmdWriteTimestamp2KHR");
-    out->vkQueueSubmit2KHR = (PFN_vkQueueSubmit2KHR)vk->vkGetInstanceProcAddr(instance, "vkQueueSubmit2KHR");
-    out->vkCmdWriteBufferMarker2AMD = (PFN_vkCmdWriteBufferMarker2AMD)vk->vkGetInstanceProcAddr(instance, "vkCmdWriteBufferMarker2AMD");
-    out->vkGetQueueCheckpointData2NV = (PFN_vkGetQueueCheckpointData2NV)vk->vkGetInstanceProcAddr(instance, "vkGetQueueCheckpointData2NV");
+    out->vkCmdSetEvent2KHR =
+        (PFN_vkCmdSetEvent2KHR)vk->vkGetInstanceProcAddr(instance, "vkCmdSetEvent2KHR");
+    out->vkCmdResetEvent2KHR =
+        (PFN_vkCmdResetEvent2KHR)vk->vkGetInstanceProcAddr(instance, "vkCmdResetEvent2KHR");
+    out->vkCmdWaitEvents2KHR =
+        (PFN_vkCmdWaitEvents2KHR)vk->vkGetInstanceProcAddr(instance, "vkCmdWaitEvents2KHR");
+    out->vkCmdPipelineBarrier2KHR = (PFN_vkCmdPipelineBarrier2KHR)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdPipelineBarrier2KHR");
+    out->vkCmdWriteTimestamp2KHR =
+        (PFN_vkCmdWriteTimestamp2KHR)vk->vkGetInstanceProcAddr(instance, "vkCmdWriteTimestamp2KHR");
+    out->vkQueueSubmit2KHR =
+        (PFN_vkQueueSubmit2KHR)vk->vkGetInstanceProcAddr(instance, "vkQueueSubmit2KHR");
+    out->vkCmdWriteBufferMarker2AMD = (PFN_vkCmdWriteBufferMarker2AMD)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdWriteBufferMarker2AMD");
+    out->vkGetQueueCheckpointData2NV = (PFN_vkGetQueueCheckpointData2NV)vk->vkGetInstanceProcAddr(
+        instance, "vkGetQueueCheckpointData2NV");
 #endif
 #ifdef VK_KHR_copy_commands2
-    out->vkCmdCopyBuffer2KHR = (PFN_vkCmdCopyBuffer2KHR)vk->vkGetInstanceProcAddr(instance, "vkCmdCopyBuffer2KHR");
-    out->vkCmdCopyImage2KHR = (PFN_vkCmdCopyImage2KHR)vk->vkGetInstanceProcAddr(instance, "vkCmdCopyImage2KHR");
-    out->vkCmdCopyBufferToImage2KHR = (PFN_vkCmdCopyBufferToImage2KHR)vk->vkGetInstanceProcAddr(instance, "vkCmdCopyBufferToImage2KHR");
-    out->vkCmdCopyImageToBuffer2KHR = (PFN_vkCmdCopyImageToBuffer2KHR)vk->vkGetInstanceProcAddr(instance, "vkCmdCopyImageToBuffer2KHR");
-    out->vkCmdBlitImage2KHR = (PFN_vkCmdBlitImage2KHR)vk->vkGetInstanceProcAddr(instance, "vkCmdBlitImage2KHR");
-    out->vkCmdResolveImage2KHR = (PFN_vkCmdResolveImage2KHR)vk->vkGetInstanceProcAddr(instance, "vkCmdResolveImage2KHR");
+    out->vkCmdCopyBuffer2KHR =
+        (PFN_vkCmdCopyBuffer2KHR)vk->vkGetInstanceProcAddr(instance, "vkCmdCopyBuffer2KHR");
+    out->vkCmdCopyImage2KHR =
+        (PFN_vkCmdCopyImage2KHR)vk->vkGetInstanceProcAddr(instance, "vkCmdCopyImage2KHR");
+    out->vkCmdCopyBufferToImage2KHR = (PFN_vkCmdCopyBufferToImage2KHR)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdCopyBufferToImage2KHR");
+    out->vkCmdCopyImageToBuffer2KHR = (PFN_vkCmdCopyImageToBuffer2KHR)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdCopyImageToBuffer2KHR");
+    out->vkCmdBlitImage2KHR =
+        (PFN_vkCmdBlitImage2KHR)vk->vkGetInstanceProcAddr(instance, "vkCmdBlitImage2KHR");
+    out->vkCmdResolveImage2KHR =
+        (PFN_vkCmdResolveImage2KHR)vk->vkGetInstanceProcAddr(instance, "vkCmdResolveImage2KHR");
 #endif
 #ifdef VK_KHR_maintenance4
-    out->vkGetDeviceBufferMemoryRequirementsKHR = (PFN_vkGetDeviceBufferMemoryRequirementsKHR)vk->vkGetInstanceProcAddr(instance, "vkGetDeviceBufferMemoryRequirementsKHR");
-    out->vkGetDeviceImageMemoryRequirementsKHR = (PFN_vkGetDeviceImageMemoryRequirementsKHR)vk->vkGetInstanceProcAddr(instance, "vkGetDeviceImageMemoryRequirementsKHR");
-    out->vkGetDeviceImageSparseMemoryRequirementsKHR = (PFN_vkGetDeviceImageSparseMemoryRequirementsKHR)vk->vkGetInstanceProcAddr(instance, "vkGetDeviceImageSparseMemoryRequirementsKHR");
+    out->vkGetDeviceBufferMemoryRequirementsKHR =
+        (PFN_vkGetDeviceBufferMemoryRequirementsKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetDeviceBufferMemoryRequirementsKHR");
+    out->vkGetDeviceImageMemoryRequirementsKHR =
+        (PFN_vkGetDeviceImageMemoryRequirementsKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetDeviceImageMemoryRequirementsKHR");
+    out->vkGetDeviceImageSparseMemoryRequirementsKHR =
+        (PFN_vkGetDeviceImageSparseMemoryRequirementsKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetDeviceImageSparseMemoryRequirementsKHR");
 #endif
 #ifdef VK_ANDROID_native_buffer
-    out->vkGetSwapchainGrallocUsageANDROID = (PFN_vkGetSwapchainGrallocUsageANDROID)vk->vkGetInstanceProcAddr(instance, "vkGetSwapchainGrallocUsageANDROID");
-    out->vkAcquireImageANDROID = (PFN_vkAcquireImageANDROID)vk->vkGetInstanceProcAddr(instance, "vkAcquireImageANDROID");
-    out->vkQueueSignalReleaseImageANDROID = (PFN_vkQueueSignalReleaseImageANDROID)vk->vkGetInstanceProcAddr(instance, "vkQueueSignalReleaseImageANDROID");
+    out->vkGetSwapchainGrallocUsageANDROID =
+        (PFN_vkGetSwapchainGrallocUsageANDROID)vk->vkGetInstanceProcAddr(
+            instance, "vkGetSwapchainGrallocUsageANDROID");
+    out->vkAcquireImageANDROID =
+        (PFN_vkAcquireImageANDROID)vk->vkGetInstanceProcAddr(instance, "vkAcquireImageANDROID");
+    out->vkQueueSignalReleaseImageANDROID =
+        (PFN_vkQueueSignalReleaseImageANDROID)vk->vkGetInstanceProcAddr(
+            instance, "vkQueueSignalReleaseImageANDROID");
 #endif
 #ifdef VK_EXT_debug_marker
-    out->vkDebugMarkerSetObjectTagEXT = (PFN_vkDebugMarkerSetObjectTagEXT)vk->vkGetInstanceProcAddr(instance, "vkDebugMarkerSetObjectTagEXT");
-    out->vkDebugMarkerSetObjectNameEXT = (PFN_vkDebugMarkerSetObjectNameEXT)vk->vkGetInstanceProcAddr(instance, "vkDebugMarkerSetObjectNameEXT");
-    out->vkCmdDebugMarkerBeginEXT = (PFN_vkCmdDebugMarkerBeginEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdDebugMarkerBeginEXT");
-    out->vkCmdDebugMarkerEndEXT = (PFN_vkCmdDebugMarkerEndEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdDebugMarkerEndEXT");
-    out->vkCmdDebugMarkerInsertEXT = (PFN_vkCmdDebugMarkerInsertEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdDebugMarkerInsertEXT");
+    out->vkDebugMarkerSetObjectTagEXT = (PFN_vkDebugMarkerSetObjectTagEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkDebugMarkerSetObjectTagEXT");
+    out->vkDebugMarkerSetObjectNameEXT =
+        (PFN_vkDebugMarkerSetObjectNameEXT)vk->vkGetInstanceProcAddr(
+            instance, "vkDebugMarkerSetObjectNameEXT");
+    out->vkCmdDebugMarkerBeginEXT = (PFN_vkCmdDebugMarkerBeginEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdDebugMarkerBeginEXT");
+    out->vkCmdDebugMarkerEndEXT =
+        (PFN_vkCmdDebugMarkerEndEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdDebugMarkerEndEXT");
+    out->vkCmdDebugMarkerInsertEXT = (PFN_vkCmdDebugMarkerInsertEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdDebugMarkerInsertEXT");
 #endif
 #ifdef VK_EXT_transform_feedback
-    out->vkCmdBindTransformFeedbackBuffersEXT = (PFN_vkCmdBindTransformFeedbackBuffersEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdBindTransformFeedbackBuffersEXT");
-    out->vkCmdBeginTransformFeedbackEXT = (PFN_vkCmdBeginTransformFeedbackEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdBeginTransformFeedbackEXT");
-    out->vkCmdEndTransformFeedbackEXT = (PFN_vkCmdEndTransformFeedbackEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdEndTransformFeedbackEXT");
-    out->vkCmdBeginQueryIndexedEXT = (PFN_vkCmdBeginQueryIndexedEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdBeginQueryIndexedEXT");
-    out->vkCmdEndQueryIndexedEXT = (PFN_vkCmdEndQueryIndexedEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdEndQueryIndexedEXT");
-    out->vkCmdDrawIndirectByteCountEXT = (PFN_vkCmdDrawIndirectByteCountEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdDrawIndirectByteCountEXT");
+    out->vkCmdBindTransformFeedbackBuffersEXT =
+        (PFN_vkCmdBindTransformFeedbackBuffersEXT)vk->vkGetInstanceProcAddr(
+            instance, "vkCmdBindTransformFeedbackBuffersEXT");
+    out->vkCmdBeginTransformFeedbackEXT =
+        (PFN_vkCmdBeginTransformFeedbackEXT)vk->vkGetInstanceProcAddr(
+            instance, "vkCmdBeginTransformFeedbackEXT");
+    out->vkCmdEndTransformFeedbackEXT = (PFN_vkCmdEndTransformFeedbackEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdEndTransformFeedbackEXT");
+    out->vkCmdBeginQueryIndexedEXT = (PFN_vkCmdBeginQueryIndexedEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdBeginQueryIndexedEXT");
+    out->vkCmdEndQueryIndexedEXT =
+        (PFN_vkCmdEndQueryIndexedEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdEndQueryIndexedEXT");
+    out->vkCmdDrawIndirectByteCountEXT =
+        (PFN_vkCmdDrawIndirectByteCountEXT)vk->vkGetInstanceProcAddr(
+            instance, "vkCmdDrawIndirectByteCountEXT");
 #endif
 #ifdef VK_NVX_binary_import
-    out->vkCreateCuModuleNVX = (PFN_vkCreateCuModuleNVX)vk->vkGetInstanceProcAddr(instance, "vkCreateCuModuleNVX");
-    out->vkCreateCuFunctionNVX = (PFN_vkCreateCuFunctionNVX)vk->vkGetInstanceProcAddr(instance, "vkCreateCuFunctionNVX");
-    out->vkDestroyCuModuleNVX = (PFN_vkDestroyCuModuleNVX)vk->vkGetInstanceProcAddr(instance, "vkDestroyCuModuleNVX");
-    out->vkDestroyCuFunctionNVX = (PFN_vkDestroyCuFunctionNVX)vk->vkGetInstanceProcAddr(instance, "vkDestroyCuFunctionNVX");
-    out->vkCmdCuLaunchKernelNVX = (PFN_vkCmdCuLaunchKernelNVX)vk->vkGetInstanceProcAddr(instance, "vkCmdCuLaunchKernelNVX");
+    out->vkCreateCuModuleNVX =
+        (PFN_vkCreateCuModuleNVX)vk->vkGetInstanceProcAddr(instance, "vkCreateCuModuleNVX");
+    out->vkCreateCuFunctionNVX =
+        (PFN_vkCreateCuFunctionNVX)vk->vkGetInstanceProcAddr(instance, "vkCreateCuFunctionNVX");
+    out->vkDestroyCuModuleNVX =
+        (PFN_vkDestroyCuModuleNVX)vk->vkGetInstanceProcAddr(instance, "vkDestroyCuModuleNVX");
+    out->vkDestroyCuFunctionNVX =
+        (PFN_vkDestroyCuFunctionNVX)vk->vkGetInstanceProcAddr(instance, "vkDestroyCuFunctionNVX");
+    out->vkCmdCuLaunchKernelNVX =
+        (PFN_vkCmdCuLaunchKernelNVX)vk->vkGetInstanceProcAddr(instance, "vkCmdCuLaunchKernelNVX");
 #endif
 #ifdef VK_NVX_image_view_handle
-    out->vkGetImageViewHandleNVX = (PFN_vkGetImageViewHandleNVX)vk->vkGetInstanceProcAddr(instance, "vkGetImageViewHandleNVX");
-    out->vkGetImageViewAddressNVX = (PFN_vkGetImageViewAddressNVX)vk->vkGetInstanceProcAddr(instance, "vkGetImageViewAddressNVX");
+    out->vkGetImageViewHandleNVX =
+        (PFN_vkGetImageViewHandleNVX)vk->vkGetInstanceProcAddr(instance, "vkGetImageViewHandleNVX");
+    out->vkGetImageViewAddressNVX = (PFN_vkGetImageViewAddressNVX)vk->vkGetInstanceProcAddr(
+        instance, "vkGetImageViewAddressNVX");
 #endif
 #ifdef VK_AMD_draw_indirect_count
-    out->vkCmdDrawIndirectCountAMD = (PFN_vkCmdDrawIndirectCountAMD)vk->vkGetInstanceProcAddr(instance, "vkCmdDrawIndirectCountAMD");
-    out->vkCmdDrawIndexedIndirectCountAMD = (PFN_vkCmdDrawIndexedIndirectCountAMD)vk->vkGetInstanceProcAddr(instance, "vkCmdDrawIndexedIndirectCountAMD");
+    out->vkCmdDrawIndirectCountAMD = (PFN_vkCmdDrawIndirectCountAMD)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdDrawIndirectCountAMD");
+    out->vkCmdDrawIndexedIndirectCountAMD =
+        (PFN_vkCmdDrawIndexedIndirectCountAMD)vk->vkGetInstanceProcAddr(
+            instance, "vkCmdDrawIndexedIndirectCountAMD");
 #endif
 #ifdef VK_AMD_shader_info
-    out->vkGetShaderInfoAMD = (PFN_vkGetShaderInfoAMD)vk->vkGetInstanceProcAddr(instance, "vkGetShaderInfoAMD");
+    out->vkGetShaderInfoAMD =
+        (PFN_vkGetShaderInfoAMD)vk->vkGetInstanceProcAddr(instance, "vkGetShaderInfoAMD");
 #endif
 #ifdef VK_NV_external_memory_capabilities
-    out->vkGetPhysicalDeviceExternalImageFormatPropertiesNV = (PFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV");
+    out->vkGetPhysicalDeviceExternalImageFormatPropertiesNV =
+        (PFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV");
 #endif
 #ifdef VK_NV_external_memory_win32
-    out->vkGetMemoryWin32HandleNV = (PFN_vkGetMemoryWin32HandleNV)vk->vkGetInstanceProcAddr(instance, "vkGetMemoryWin32HandleNV");
+    out->vkGetMemoryWin32HandleNV = (PFN_vkGetMemoryWin32HandleNV)vk->vkGetInstanceProcAddr(
+        instance, "vkGetMemoryWin32HandleNV");
 #endif
 #ifdef VK_EXT_conditional_rendering
-    out->vkCmdBeginConditionalRenderingEXT = (PFN_vkCmdBeginConditionalRenderingEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdBeginConditionalRenderingEXT");
-    out->vkCmdEndConditionalRenderingEXT = (PFN_vkCmdEndConditionalRenderingEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdEndConditionalRenderingEXT");
+    out->vkCmdBeginConditionalRenderingEXT =
+        (PFN_vkCmdBeginConditionalRenderingEXT)vk->vkGetInstanceProcAddr(
+            instance, "vkCmdBeginConditionalRenderingEXT");
+    out->vkCmdEndConditionalRenderingEXT =
+        (PFN_vkCmdEndConditionalRenderingEXT)vk->vkGetInstanceProcAddr(
+            instance, "vkCmdEndConditionalRenderingEXT");
 #endif
 #ifdef VK_NV_clip_space_w_scaling
-    out->vkCmdSetViewportWScalingNV = (PFN_vkCmdSetViewportWScalingNV)vk->vkGetInstanceProcAddr(instance, "vkCmdSetViewportWScalingNV");
+    out->vkCmdSetViewportWScalingNV = (PFN_vkCmdSetViewportWScalingNV)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdSetViewportWScalingNV");
 #endif
 #ifdef VK_EXT_direct_mode_display
-    out->vkReleaseDisplayEXT = (PFN_vkReleaseDisplayEXT)vk->vkGetInstanceProcAddr(instance, "vkReleaseDisplayEXT");
+    out->vkReleaseDisplayEXT =
+        (PFN_vkReleaseDisplayEXT)vk->vkGetInstanceProcAddr(instance, "vkReleaseDisplayEXT");
 #endif
 #ifdef VK_EXT_acquire_xlib_display
-    out->vkAcquireXlibDisplayEXT = (PFN_vkAcquireXlibDisplayEXT)vk->vkGetInstanceProcAddr(instance, "vkAcquireXlibDisplayEXT");
-    out->vkGetRandROutputDisplayEXT = (PFN_vkGetRandROutputDisplayEXT)vk->vkGetInstanceProcAddr(instance, "vkGetRandROutputDisplayEXT");
+    out->vkAcquireXlibDisplayEXT =
+        (PFN_vkAcquireXlibDisplayEXT)vk->vkGetInstanceProcAddr(instance, "vkAcquireXlibDisplayEXT");
+    out->vkGetRandROutputDisplayEXT = (PFN_vkGetRandROutputDisplayEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkGetRandROutputDisplayEXT");
 #endif
 #ifdef VK_EXT_display_surface_counter
-    out->vkGetPhysicalDeviceSurfaceCapabilities2EXT = (PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceCapabilities2EXT");
+    out->vkGetPhysicalDeviceSurfaceCapabilities2EXT =
+        (PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceSurfaceCapabilities2EXT");
 #endif
 #ifdef VK_EXT_display_control
-    out->vkDisplayPowerControlEXT = (PFN_vkDisplayPowerControlEXT)vk->vkGetInstanceProcAddr(instance, "vkDisplayPowerControlEXT");
-    out->vkRegisterDeviceEventEXT = (PFN_vkRegisterDeviceEventEXT)vk->vkGetInstanceProcAddr(instance, "vkRegisterDeviceEventEXT");
-    out->vkRegisterDisplayEventEXT = (PFN_vkRegisterDisplayEventEXT)vk->vkGetInstanceProcAddr(instance, "vkRegisterDisplayEventEXT");
-    out->vkGetSwapchainCounterEXT = (PFN_vkGetSwapchainCounterEXT)vk->vkGetInstanceProcAddr(instance, "vkGetSwapchainCounterEXT");
+    out->vkDisplayPowerControlEXT = (PFN_vkDisplayPowerControlEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkDisplayPowerControlEXT");
+    out->vkRegisterDeviceEventEXT = (PFN_vkRegisterDeviceEventEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkRegisterDeviceEventEXT");
+    out->vkRegisterDisplayEventEXT = (PFN_vkRegisterDisplayEventEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkRegisterDisplayEventEXT");
+    out->vkGetSwapchainCounterEXT = (PFN_vkGetSwapchainCounterEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkGetSwapchainCounterEXT");
 #endif
 #ifdef VK_GOOGLE_display_timing
-    out->vkGetRefreshCycleDurationGOOGLE = (PFN_vkGetRefreshCycleDurationGOOGLE)vk->vkGetInstanceProcAddr(instance, "vkGetRefreshCycleDurationGOOGLE");
-    out->vkGetPastPresentationTimingGOOGLE = (PFN_vkGetPastPresentationTimingGOOGLE)vk->vkGetInstanceProcAddr(instance, "vkGetPastPresentationTimingGOOGLE");
+    out->vkGetRefreshCycleDurationGOOGLE =
+        (PFN_vkGetRefreshCycleDurationGOOGLE)vk->vkGetInstanceProcAddr(
+            instance, "vkGetRefreshCycleDurationGOOGLE");
+    out->vkGetPastPresentationTimingGOOGLE =
+        (PFN_vkGetPastPresentationTimingGOOGLE)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPastPresentationTimingGOOGLE");
 #endif
 #ifdef VK_EXT_discard_rectangles
-    out->vkCmdSetDiscardRectangleEXT = (PFN_vkCmdSetDiscardRectangleEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdSetDiscardRectangleEXT");
+    out->vkCmdSetDiscardRectangleEXT = (PFN_vkCmdSetDiscardRectangleEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdSetDiscardRectangleEXT");
 #endif
 #ifdef VK_EXT_hdr_metadata
-    out->vkSetHdrMetadataEXT = (PFN_vkSetHdrMetadataEXT)vk->vkGetInstanceProcAddr(instance, "vkSetHdrMetadataEXT");
+    out->vkSetHdrMetadataEXT =
+        (PFN_vkSetHdrMetadataEXT)vk->vkGetInstanceProcAddr(instance, "vkSetHdrMetadataEXT");
 #endif
 #ifdef VK_EXT_debug_utils
-    out->vkSetDebugUtilsObjectNameEXT = (PFN_vkSetDebugUtilsObjectNameEXT)vk->vkGetInstanceProcAddr(instance, "vkSetDebugUtilsObjectNameEXT");
-    out->vkSetDebugUtilsObjectTagEXT = (PFN_vkSetDebugUtilsObjectTagEXT)vk->vkGetInstanceProcAddr(instance, "vkSetDebugUtilsObjectTagEXT");
-    out->vkQueueBeginDebugUtilsLabelEXT = (PFN_vkQueueBeginDebugUtilsLabelEXT)vk->vkGetInstanceProcAddr(instance, "vkQueueBeginDebugUtilsLabelEXT");
-    out->vkQueueEndDebugUtilsLabelEXT = (PFN_vkQueueEndDebugUtilsLabelEXT)vk->vkGetInstanceProcAddr(instance, "vkQueueEndDebugUtilsLabelEXT");
-    out->vkQueueInsertDebugUtilsLabelEXT = (PFN_vkQueueInsertDebugUtilsLabelEXT)vk->vkGetInstanceProcAddr(instance, "vkQueueInsertDebugUtilsLabelEXT");
-    out->vkCmdBeginDebugUtilsLabelEXT = (PFN_vkCmdBeginDebugUtilsLabelEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdBeginDebugUtilsLabelEXT");
-    out->vkCmdEndDebugUtilsLabelEXT = (PFN_vkCmdEndDebugUtilsLabelEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdEndDebugUtilsLabelEXT");
-    out->vkCmdInsertDebugUtilsLabelEXT = (PFN_vkCmdInsertDebugUtilsLabelEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdInsertDebugUtilsLabelEXT");
+    out->vkSetDebugUtilsObjectNameEXT = (PFN_vkSetDebugUtilsObjectNameEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkSetDebugUtilsObjectNameEXT");
+    out->vkSetDebugUtilsObjectTagEXT = (PFN_vkSetDebugUtilsObjectTagEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkSetDebugUtilsObjectTagEXT");
+    out->vkQueueBeginDebugUtilsLabelEXT =
+        (PFN_vkQueueBeginDebugUtilsLabelEXT)vk->vkGetInstanceProcAddr(
+            instance, "vkQueueBeginDebugUtilsLabelEXT");
+    out->vkQueueEndDebugUtilsLabelEXT = (PFN_vkQueueEndDebugUtilsLabelEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkQueueEndDebugUtilsLabelEXT");
+    out->vkQueueInsertDebugUtilsLabelEXT =
+        (PFN_vkQueueInsertDebugUtilsLabelEXT)vk->vkGetInstanceProcAddr(
+            instance, "vkQueueInsertDebugUtilsLabelEXT");
+    out->vkCmdBeginDebugUtilsLabelEXT = (PFN_vkCmdBeginDebugUtilsLabelEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdBeginDebugUtilsLabelEXT");
+    out->vkCmdEndDebugUtilsLabelEXT = (PFN_vkCmdEndDebugUtilsLabelEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdEndDebugUtilsLabelEXT");
+    out->vkCmdInsertDebugUtilsLabelEXT =
+        (PFN_vkCmdInsertDebugUtilsLabelEXT)vk->vkGetInstanceProcAddr(
+            instance, "vkCmdInsertDebugUtilsLabelEXT");
 #endif
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
-    out->vkGetAndroidHardwareBufferPropertiesANDROID = (PFN_vkGetAndroidHardwareBufferPropertiesANDROID)vk->vkGetInstanceProcAddr(instance, "vkGetAndroidHardwareBufferPropertiesANDROID");
-    out->vkGetMemoryAndroidHardwareBufferANDROID = (PFN_vkGetMemoryAndroidHardwareBufferANDROID)vk->vkGetInstanceProcAddr(instance, "vkGetMemoryAndroidHardwareBufferANDROID");
+    out->vkGetAndroidHardwareBufferPropertiesANDROID =
+        (PFN_vkGetAndroidHardwareBufferPropertiesANDROID)vk->vkGetInstanceProcAddr(
+            instance, "vkGetAndroidHardwareBufferPropertiesANDROID");
+    out->vkGetMemoryAndroidHardwareBufferANDROID =
+        (PFN_vkGetMemoryAndroidHardwareBufferANDROID)vk->vkGetInstanceProcAddr(
+            instance, "vkGetMemoryAndroidHardwareBufferANDROID");
 #endif
 #ifdef VK_EXT_sample_locations
-    out->vkCmdSetSampleLocationsEXT = (PFN_vkCmdSetSampleLocationsEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdSetSampleLocationsEXT");
-    out->vkGetPhysicalDeviceMultisamplePropertiesEXT = (PFN_vkGetPhysicalDeviceMultisamplePropertiesEXT)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceMultisamplePropertiesEXT");
+    out->vkCmdSetSampleLocationsEXT = (PFN_vkCmdSetSampleLocationsEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdSetSampleLocationsEXT");
+    out->vkGetPhysicalDeviceMultisamplePropertiesEXT =
+        (PFN_vkGetPhysicalDeviceMultisamplePropertiesEXT)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceMultisamplePropertiesEXT");
 #endif
 #ifdef VK_EXT_image_drm_format_modifier
-    out->vkGetImageDrmFormatModifierPropertiesEXT = (PFN_vkGetImageDrmFormatModifierPropertiesEXT)vk->vkGetInstanceProcAddr(instance, "vkGetImageDrmFormatModifierPropertiesEXT");
+    out->vkGetImageDrmFormatModifierPropertiesEXT =
+        (PFN_vkGetImageDrmFormatModifierPropertiesEXT)vk->vkGetInstanceProcAddr(
+            instance, "vkGetImageDrmFormatModifierPropertiesEXT");
 #endif
 #ifdef VK_EXT_validation_cache
-    out->vkCreateValidationCacheEXT = (PFN_vkCreateValidationCacheEXT)vk->vkGetInstanceProcAddr(instance, "vkCreateValidationCacheEXT");
-    out->vkDestroyValidationCacheEXT = (PFN_vkDestroyValidationCacheEXT)vk->vkGetInstanceProcAddr(instance, "vkDestroyValidationCacheEXT");
-    out->vkMergeValidationCachesEXT = (PFN_vkMergeValidationCachesEXT)vk->vkGetInstanceProcAddr(instance, "vkMergeValidationCachesEXT");
-    out->vkGetValidationCacheDataEXT = (PFN_vkGetValidationCacheDataEXT)vk->vkGetInstanceProcAddr(instance, "vkGetValidationCacheDataEXT");
+    out->vkCreateValidationCacheEXT = (PFN_vkCreateValidationCacheEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkCreateValidationCacheEXT");
+    out->vkDestroyValidationCacheEXT = (PFN_vkDestroyValidationCacheEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkDestroyValidationCacheEXT");
+    out->vkMergeValidationCachesEXT = (PFN_vkMergeValidationCachesEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkMergeValidationCachesEXT");
+    out->vkGetValidationCacheDataEXT = (PFN_vkGetValidationCacheDataEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkGetValidationCacheDataEXT");
 #endif
 #ifdef VK_NV_shading_rate_image
-    out->vkCmdBindShadingRateImageNV = (PFN_vkCmdBindShadingRateImageNV)vk->vkGetInstanceProcAddr(instance, "vkCmdBindShadingRateImageNV");
-    out->vkCmdSetViewportShadingRatePaletteNV = (PFN_vkCmdSetViewportShadingRatePaletteNV)vk->vkGetInstanceProcAddr(instance, "vkCmdSetViewportShadingRatePaletteNV");
-    out->vkCmdSetCoarseSampleOrderNV = (PFN_vkCmdSetCoarseSampleOrderNV)vk->vkGetInstanceProcAddr(instance, "vkCmdSetCoarseSampleOrderNV");
+    out->vkCmdBindShadingRateImageNV = (PFN_vkCmdBindShadingRateImageNV)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdBindShadingRateImageNV");
+    out->vkCmdSetViewportShadingRatePaletteNV =
+        (PFN_vkCmdSetViewportShadingRatePaletteNV)vk->vkGetInstanceProcAddr(
+            instance, "vkCmdSetViewportShadingRatePaletteNV");
+    out->vkCmdSetCoarseSampleOrderNV = (PFN_vkCmdSetCoarseSampleOrderNV)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdSetCoarseSampleOrderNV");
 #endif
 #ifdef VK_NV_ray_tracing
-    out->vkCreateAccelerationStructureNV = (PFN_vkCreateAccelerationStructureNV)vk->vkGetInstanceProcAddr(instance, "vkCreateAccelerationStructureNV");
-    out->vkDestroyAccelerationStructureNV = (PFN_vkDestroyAccelerationStructureNV)vk->vkGetInstanceProcAddr(instance, "vkDestroyAccelerationStructureNV");
-    out->vkGetAccelerationStructureMemoryRequirementsNV = (PFN_vkGetAccelerationStructureMemoryRequirementsNV)vk->vkGetInstanceProcAddr(instance, "vkGetAccelerationStructureMemoryRequirementsNV");
-    out->vkBindAccelerationStructureMemoryNV = (PFN_vkBindAccelerationStructureMemoryNV)vk->vkGetInstanceProcAddr(instance, "vkBindAccelerationStructureMemoryNV");
-    out->vkCmdBuildAccelerationStructureNV = (PFN_vkCmdBuildAccelerationStructureNV)vk->vkGetInstanceProcAddr(instance, "vkCmdBuildAccelerationStructureNV");
-    out->vkCmdCopyAccelerationStructureNV = (PFN_vkCmdCopyAccelerationStructureNV)vk->vkGetInstanceProcAddr(instance, "vkCmdCopyAccelerationStructureNV");
-    out->vkCmdTraceRaysNV = (PFN_vkCmdTraceRaysNV)vk->vkGetInstanceProcAddr(instance, "vkCmdTraceRaysNV");
-    out->vkCreateRayTracingPipelinesNV = (PFN_vkCreateRayTracingPipelinesNV)vk->vkGetInstanceProcAddr(instance, "vkCreateRayTracingPipelinesNV");
-    out->vkGetRayTracingShaderGroupHandlesKHR = (PFN_vkGetRayTracingShaderGroupHandlesKHR)vk->vkGetInstanceProcAddr(instance, "vkGetRayTracingShaderGroupHandlesKHR");
-    out->vkGetRayTracingShaderGroupHandlesNV = (PFN_vkGetRayTracingShaderGroupHandlesNV)vk->vkGetInstanceProcAddr(instance, "vkGetRayTracingShaderGroupHandlesNV");
-    out->vkGetAccelerationStructureHandleNV = (PFN_vkGetAccelerationStructureHandleNV)vk->vkGetInstanceProcAddr(instance, "vkGetAccelerationStructureHandleNV");
-    out->vkCmdWriteAccelerationStructuresPropertiesNV = (PFN_vkCmdWriteAccelerationStructuresPropertiesNV)vk->vkGetInstanceProcAddr(instance, "vkCmdWriteAccelerationStructuresPropertiesNV");
-    out->vkCompileDeferredNV = (PFN_vkCompileDeferredNV)vk->vkGetInstanceProcAddr(instance, "vkCompileDeferredNV");
+    out->vkCreateAccelerationStructureNV =
+        (PFN_vkCreateAccelerationStructureNV)vk->vkGetInstanceProcAddr(
+            instance, "vkCreateAccelerationStructureNV");
+    out->vkDestroyAccelerationStructureNV =
+        (PFN_vkDestroyAccelerationStructureNV)vk->vkGetInstanceProcAddr(
+            instance, "vkDestroyAccelerationStructureNV");
+    out->vkGetAccelerationStructureMemoryRequirementsNV =
+        (PFN_vkGetAccelerationStructureMemoryRequirementsNV)vk->vkGetInstanceProcAddr(
+            instance, "vkGetAccelerationStructureMemoryRequirementsNV");
+    out->vkBindAccelerationStructureMemoryNV =
+        (PFN_vkBindAccelerationStructureMemoryNV)vk->vkGetInstanceProcAddr(
+            instance, "vkBindAccelerationStructureMemoryNV");
+    out->vkCmdBuildAccelerationStructureNV =
+        (PFN_vkCmdBuildAccelerationStructureNV)vk->vkGetInstanceProcAddr(
+            instance, "vkCmdBuildAccelerationStructureNV");
+    out->vkCmdCopyAccelerationStructureNV =
+        (PFN_vkCmdCopyAccelerationStructureNV)vk->vkGetInstanceProcAddr(
+            instance, "vkCmdCopyAccelerationStructureNV");
+    out->vkCmdTraceRaysNV =
+        (PFN_vkCmdTraceRaysNV)vk->vkGetInstanceProcAddr(instance, "vkCmdTraceRaysNV");
+    out->vkCreateRayTracingPipelinesNV =
+        (PFN_vkCreateRayTracingPipelinesNV)vk->vkGetInstanceProcAddr(
+            instance, "vkCreateRayTracingPipelinesNV");
+    out->vkGetRayTracingShaderGroupHandlesKHR =
+        (PFN_vkGetRayTracingShaderGroupHandlesKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetRayTracingShaderGroupHandlesKHR");
+    out->vkGetRayTracingShaderGroupHandlesNV =
+        (PFN_vkGetRayTracingShaderGroupHandlesNV)vk->vkGetInstanceProcAddr(
+            instance, "vkGetRayTracingShaderGroupHandlesNV");
+    out->vkGetAccelerationStructureHandleNV =
+        (PFN_vkGetAccelerationStructureHandleNV)vk->vkGetInstanceProcAddr(
+            instance, "vkGetAccelerationStructureHandleNV");
+    out->vkCmdWriteAccelerationStructuresPropertiesNV =
+        (PFN_vkCmdWriteAccelerationStructuresPropertiesNV)vk->vkGetInstanceProcAddr(
+            instance, "vkCmdWriteAccelerationStructuresPropertiesNV");
+    out->vkCompileDeferredNV =
+        (PFN_vkCompileDeferredNV)vk->vkGetInstanceProcAddr(instance, "vkCompileDeferredNV");
 #endif
 #ifdef VK_EXT_external_memory_host
-    out->vkGetMemoryHostPointerPropertiesEXT = (PFN_vkGetMemoryHostPointerPropertiesEXT)vk->vkGetInstanceProcAddr(instance, "vkGetMemoryHostPointerPropertiesEXT");
+    out->vkGetMemoryHostPointerPropertiesEXT =
+        (PFN_vkGetMemoryHostPointerPropertiesEXT)vk->vkGetInstanceProcAddr(
+            instance, "vkGetMemoryHostPointerPropertiesEXT");
 #endif
 #ifdef VK_AMD_buffer_marker
-    out->vkCmdWriteBufferMarkerAMD = (PFN_vkCmdWriteBufferMarkerAMD)vk->vkGetInstanceProcAddr(instance, "vkCmdWriteBufferMarkerAMD");
+    out->vkCmdWriteBufferMarkerAMD = (PFN_vkCmdWriteBufferMarkerAMD)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdWriteBufferMarkerAMD");
 #endif
 #ifdef VK_EXT_calibrated_timestamps
-    out->vkGetPhysicalDeviceCalibrateableTimeDomainsEXT = (PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceCalibrateableTimeDomainsEXT");
-    out->vkGetCalibratedTimestampsEXT = (PFN_vkGetCalibratedTimestampsEXT)vk->vkGetInstanceProcAddr(instance, "vkGetCalibratedTimestampsEXT");
+    out->vkGetPhysicalDeviceCalibrateableTimeDomainsEXT =
+        (PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceCalibrateableTimeDomainsEXT");
+    out->vkGetCalibratedTimestampsEXT = (PFN_vkGetCalibratedTimestampsEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkGetCalibratedTimestampsEXT");
 #endif
 #ifdef VK_NV_mesh_shader
-    out->vkCmdDrawMeshTasksNV = (PFN_vkCmdDrawMeshTasksNV)vk->vkGetInstanceProcAddr(instance, "vkCmdDrawMeshTasksNV");
-    out->vkCmdDrawMeshTasksIndirectNV = (PFN_vkCmdDrawMeshTasksIndirectNV)vk->vkGetInstanceProcAddr(instance, "vkCmdDrawMeshTasksIndirectNV");
-    out->vkCmdDrawMeshTasksIndirectCountNV = (PFN_vkCmdDrawMeshTasksIndirectCountNV)vk->vkGetInstanceProcAddr(instance, "vkCmdDrawMeshTasksIndirectCountNV");
+    out->vkCmdDrawMeshTasksNV =
+        (PFN_vkCmdDrawMeshTasksNV)vk->vkGetInstanceProcAddr(instance, "vkCmdDrawMeshTasksNV");
+    out->vkCmdDrawMeshTasksIndirectNV = (PFN_vkCmdDrawMeshTasksIndirectNV)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdDrawMeshTasksIndirectNV");
+    out->vkCmdDrawMeshTasksIndirectCountNV =
+        (PFN_vkCmdDrawMeshTasksIndirectCountNV)vk->vkGetInstanceProcAddr(
+            instance, "vkCmdDrawMeshTasksIndirectCountNV");
 #endif
 #ifdef VK_NV_scissor_exclusive
-    out->vkCmdSetExclusiveScissorNV = (PFN_vkCmdSetExclusiveScissorNV)vk->vkGetInstanceProcAddr(instance, "vkCmdSetExclusiveScissorNV");
+    out->vkCmdSetExclusiveScissorNV = (PFN_vkCmdSetExclusiveScissorNV)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdSetExclusiveScissorNV");
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
-    out->vkCmdSetCheckpointNV = (PFN_vkCmdSetCheckpointNV)vk->vkGetInstanceProcAddr(instance, "vkCmdSetCheckpointNV");
-    out->vkGetQueueCheckpointDataNV = (PFN_vkGetQueueCheckpointDataNV)vk->vkGetInstanceProcAddr(instance, "vkGetQueueCheckpointDataNV");
+    out->vkCmdSetCheckpointNV =
+        (PFN_vkCmdSetCheckpointNV)vk->vkGetInstanceProcAddr(instance, "vkCmdSetCheckpointNV");
+    out->vkGetQueueCheckpointDataNV = (PFN_vkGetQueueCheckpointDataNV)vk->vkGetInstanceProcAddr(
+        instance, "vkGetQueueCheckpointDataNV");
 #endif
 #ifdef VK_INTEL_performance_query
-    out->vkInitializePerformanceApiINTEL = (PFN_vkInitializePerformanceApiINTEL)vk->vkGetInstanceProcAddr(instance, "vkInitializePerformanceApiINTEL");
-    out->vkUninitializePerformanceApiINTEL = (PFN_vkUninitializePerformanceApiINTEL)vk->vkGetInstanceProcAddr(instance, "vkUninitializePerformanceApiINTEL");
-    out->vkCmdSetPerformanceMarkerINTEL = (PFN_vkCmdSetPerformanceMarkerINTEL)vk->vkGetInstanceProcAddr(instance, "vkCmdSetPerformanceMarkerINTEL");
-    out->vkCmdSetPerformanceStreamMarkerINTEL = (PFN_vkCmdSetPerformanceStreamMarkerINTEL)vk->vkGetInstanceProcAddr(instance, "vkCmdSetPerformanceStreamMarkerINTEL");
-    out->vkCmdSetPerformanceOverrideINTEL = (PFN_vkCmdSetPerformanceOverrideINTEL)vk->vkGetInstanceProcAddr(instance, "vkCmdSetPerformanceOverrideINTEL");
-    out->vkAcquirePerformanceConfigurationINTEL = (PFN_vkAcquirePerformanceConfigurationINTEL)vk->vkGetInstanceProcAddr(instance, "vkAcquirePerformanceConfigurationINTEL");
-    out->vkReleasePerformanceConfigurationINTEL = (PFN_vkReleasePerformanceConfigurationINTEL)vk->vkGetInstanceProcAddr(instance, "vkReleasePerformanceConfigurationINTEL");
-    out->vkQueueSetPerformanceConfigurationINTEL = (PFN_vkQueueSetPerformanceConfigurationINTEL)vk->vkGetInstanceProcAddr(instance, "vkQueueSetPerformanceConfigurationINTEL");
-    out->vkGetPerformanceParameterINTEL = (PFN_vkGetPerformanceParameterINTEL)vk->vkGetInstanceProcAddr(instance, "vkGetPerformanceParameterINTEL");
+    out->vkInitializePerformanceApiINTEL =
+        (PFN_vkInitializePerformanceApiINTEL)vk->vkGetInstanceProcAddr(
+            instance, "vkInitializePerformanceApiINTEL");
+    out->vkUninitializePerformanceApiINTEL =
+        (PFN_vkUninitializePerformanceApiINTEL)vk->vkGetInstanceProcAddr(
+            instance, "vkUninitializePerformanceApiINTEL");
+    out->vkCmdSetPerformanceMarkerINTEL =
+        (PFN_vkCmdSetPerformanceMarkerINTEL)vk->vkGetInstanceProcAddr(
+            instance, "vkCmdSetPerformanceMarkerINTEL");
+    out->vkCmdSetPerformanceStreamMarkerINTEL =
+        (PFN_vkCmdSetPerformanceStreamMarkerINTEL)vk->vkGetInstanceProcAddr(
+            instance, "vkCmdSetPerformanceStreamMarkerINTEL");
+    out->vkCmdSetPerformanceOverrideINTEL =
+        (PFN_vkCmdSetPerformanceOverrideINTEL)vk->vkGetInstanceProcAddr(
+            instance, "vkCmdSetPerformanceOverrideINTEL");
+    out->vkAcquirePerformanceConfigurationINTEL =
+        (PFN_vkAcquirePerformanceConfigurationINTEL)vk->vkGetInstanceProcAddr(
+            instance, "vkAcquirePerformanceConfigurationINTEL");
+    out->vkReleasePerformanceConfigurationINTEL =
+        (PFN_vkReleasePerformanceConfigurationINTEL)vk->vkGetInstanceProcAddr(
+            instance, "vkReleasePerformanceConfigurationINTEL");
+    out->vkQueueSetPerformanceConfigurationINTEL =
+        (PFN_vkQueueSetPerformanceConfigurationINTEL)vk->vkGetInstanceProcAddr(
+            instance, "vkQueueSetPerformanceConfigurationINTEL");
+    out->vkGetPerformanceParameterINTEL =
+        (PFN_vkGetPerformanceParameterINTEL)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPerformanceParameterINTEL");
 #endif
 #ifdef VK_AMD_display_native_hdr
-    out->vkSetLocalDimmingAMD = (PFN_vkSetLocalDimmingAMD)vk->vkGetInstanceProcAddr(instance, "vkSetLocalDimmingAMD");
+    out->vkSetLocalDimmingAMD =
+        (PFN_vkSetLocalDimmingAMD)vk->vkGetInstanceProcAddr(instance, "vkSetLocalDimmingAMD");
 #endif
 #ifdef VK_EXT_buffer_device_address
-    out->vkGetBufferDeviceAddressEXT = (PFN_vkGetBufferDeviceAddressEXT)vk->vkGetInstanceProcAddr(instance, "vkGetBufferDeviceAddressEXT");
+    out->vkGetBufferDeviceAddressEXT = (PFN_vkGetBufferDeviceAddressEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkGetBufferDeviceAddressEXT");
 #endif
 #ifdef VK_EXT_tooling_info
-    out->vkGetPhysicalDeviceToolPropertiesEXT = (PFN_vkGetPhysicalDeviceToolPropertiesEXT)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceToolPropertiesEXT");
+    out->vkGetPhysicalDeviceToolPropertiesEXT =
+        (PFN_vkGetPhysicalDeviceToolPropertiesEXT)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceToolPropertiesEXT");
 #endif
 #ifdef VK_NV_cooperative_matrix
-    out->vkGetPhysicalDeviceCooperativeMatrixPropertiesNV = (PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceCooperativeMatrixPropertiesNV");
+    out->vkGetPhysicalDeviceCooperativeMatrixPropertiesNV =
+        (PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceCooperativeMatrixPropertiesNV");
 #endif
 #ifdef VK_NV_coverage_reduction_mode
-    out->vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV = (PFN_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV");
+    out->vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV =
+        (PFN_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV)
+            vk->vkGetInstanceProcAddr(
+                instance, "vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV");
 #endif
 #ifdef VK_EXT_full_screen_exclusive
-    out->vkGetPhysicalDeviceSurfacePresentModes2EXT = (PFN_vkGetPhysicalDeviceSurfacePresentModes2EXT)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfacePresentModes2EXT");
-    out->vkAcquireFullScreenExclusiveModeEXT = (PFN_vkAcquireFullScreenExclusiveModeEXT)vk->vkGetInstanceProcAddr(instance, "vkAcquireFullScreenExclusiveModeEXT");
-    out->vkReleaseFullScreenExclusiveModeEXT = (PFN_vkReleaseFullScreenExclusiveModeEXT)vk->vkGetInstanceProcAddr(instance, "vkReleaseFullScreenExclusiveModeEXT");
-    out->vkGetDeviceGroupSurfacePresentModes2EXT = (PFN_vkGetDeviceGroupSurfacePresentModes2EXT)vk->vkGetInstanceProcAddr(instance, "vkGetDeviceGroupSurfacePresentModes2EXT");
+    out->vkGetPhysicalDeviceSurfacePresentModes2EXT =
+        (PFN_vkGetPhysicalDeviceSurfacePresentModes2EXT)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceSurfacePresentModes2EXT");
+    out->vkAcquireFullScreenExclusiveModeEXT =
+        (PFN_vkAcquireFullScreenExclusiveModeEXT)vk->vkGetInstanceProcAddr(
+            instance, "vkAcquireFullScreenExclusiveModeEXT");
+    out->vkReleaseFullScreenExclusiveModeEXT =
+        (PFN_vkReleaseFullScreenExclusiveModeEXT)vk->vkGetInstanceProcAddr(
+            instance, "vkReleaseFullScreenExclusiveModeEXT");
+    out->vkGetDeviceGroupSurfacePresentModes2EXT =
+        (PFN_vkGetDeviceGroupSurfacePresentModes2EXT)vk->vkGetInstanceProcAddr(
+            instance, "vkGetDeviceGroupSurfacePresentModes2EXT");
 #endif
 #ifdef VK_EXT_line_rasterization
-    out->vkCmdSetLineStippleEXT = (PFN_vkCmdSetLineStippleEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdSetLineStippleEXT");
+    out->vkCmdSetLineStippleEXT =
+        (PFN_vkCmdSetLineStippleEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdSetLineStippleEXT");
 #endif
 #ifdef VK_EXT_host_query_reset
-    out->vkResetQueryPoolEXT = (PFN_vkResetQueryPoolEXT)vk->vkGetInstanceProcAddr(instance, "vkResetQueryPoolEXT");
+    out->vkResetQueryPoolEXT =
+        (PFN_vkResetQueryPoolEXT)vk->vkGetInstanceProcAddr(instance, "vkResetQueryPoolEXT");
 #endif
 #ifdef VK_EXT_extended_dynamic_state
-    out->vkCmdSetCullModeEXT = (PFN_vkCmdSetCullModeEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdSetCullModeEXT");
-    out->vkCmdSetFrontFaceEXT = (PFN_vkCmdSetFrontFaceEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdSetFrontFaceEXT");
-    out->vkCmdSetPrimitiveTopologyEXT = (PFN_vkCmdSetPrimitiveTopologyEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdSetPrimitiveTopologyEXT");
-    out->vkCmdSetViewportWithCountEXT = (PFN_vkCmdSetViewportWithCountEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdSetViewportWithCountEXT");
-    out->vkCmdSetScissorWithCountEXT = (PFN_vkCmdSetScissorWithCountEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdSetScissorWithCountEXT");
-    out->vkCmdBindVertexBuffers2EXT = (PFN_vkCmdBindVertexBuffers2EXT)vk->vkGetInstanceProcAddr(instance, "vkCmdBindVertexBuffers2EXT");
-    out->vkCmdSetDepthTestEnableEXT = (PFN_vkCmdSetDepthTestEnableEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdSetDepthTestEnableEXT");
-    out->vkCmdSetDepthWriteEnableEXT = (PFN_vkCmdSetDepthWriteEnableEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdSetDepthWriteEnableEXT");
-    out->vkCmdSetDepthCompareOpEXT = (PFN_vkCmdSetDepthCompareOpEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdSetDepthCompareOpEXT");
-    out->vkCmdSetDepthBoundsTestEnableEXT = (PFN_vkCmdSetDepthBoundsTestEnableEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdSetDepthBoundsTestEnableEXT");
-    out->vkCmdSetStencilTestEnableEXT = (PFN_vkCmdSetStencilTestEnableEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdSetStencilTestEnableEXT");
-    out->vkCmdSetStencilOpEXT = (PFN_vkCmdSetStencilOpEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdSetStencilOpEXT");
+    out->vkCmdSetCullModeEXT =
+        (PFN_vkCmdSetCullModeEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdSetCullModeEXT");
+    out->vkCmdSetFrontFaceEXT =
+        (PFN_vkCmdSetFrontFaceEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdSetFrontFaceEXT");
+    out->vkCmdSetPrimitiveTopologyEXT = (PFN_vkCmdSetPrimitiveTopologyEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdSetPrimitiveTopologyEXT");
+    out->vkCmdSetViewportWithCountEXT = (PFN_vkCmdSetViewportWithCountEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdSetViewportWithCountEXT");
+    out->vkCmdSetScissorWithCountEXT = (PFN_vkCmdSetScissorWithCountEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdSetScissorWithCountEXT");
+    out->vkCmdBindVertexBuffers2EXT = (PFN_vkCmdBindVertexBuffers2EXT)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdBindVertexBuffers2EXT");
+    out->vkCmdSetDepthTestEnableEXT = (PFN_vkCmdSetDepthTestEnableEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdSetDepthTestEnableEXT");
+    out->vkCmdSetDepthWriteEnableEXT = (PFN_vkCmdSetDepthWriteEnableEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdSetDepthWriteEnableEXT");
+    out->vkCmdSetDepthCompareOpEXT = (PFN_vkCmdSetDepthCompareOpEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdSetDepthCompareOpEXT");
+    out->vkCmdSetDepthBoundsTestEnableEXT =
+        (PFN_vkCmdSetDepthBoundsTestEnableEXT)vk->vkGetInstanceProcAddr(
+            instance, "vkCmdSetDepthBoundsTestEnableEXT");
+    out->vkCmdSetStencilTestEnableEXT = (PFN_vkCmdSetStencilTestEnableEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdSetStencilTestEnableEXT");
+    out->vkCmdSetStencilOpEXT =
+        (PFN_vkCmdSetStencilOpEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdSetStencilOpEXT");
 #endif
 #ifdef VK_NV_device_generated_commands
-    out->vkGetGeneratedCommandsMemoryRequirementsNV = (PFN_vkGetGeneratedCommandsMemoryRequirementsNV)vk->vkGetInstanceProcAddr(instance, "vkGetGeneratedCommandsMemoryRequirementsNV");
-    out->vkCmdPreprocessGeneratedCommandsNV = (PFN_vkCmdPreprocessGeneratedCommandsNV)vk->vkGetInstanceProcAddr(instance, "vkCmdPreprocessGeneratedCommandsNV");
-    out->vkCmdExecuteGeneratedCommandsNV = (PFN_vkCmdExecuteGeneratedCommandsNV)vk->vkGetInstanceProcAddr(instance, "vkCmdExecuteGeneratedCommandsNV");
-    out->vkCmdBindPipelineShaderGroupNV = (PFN_vkCmdBindPipelineShaderGroupNV)vk->vkGetInstanceProcAddr(instance, "vkCmdBindPipelineShaderGroupNV");
-    out->vkCreateIndirectCommandsLayoutNV = (PFN_vkCreateIndirectCommandsLayoutNV)vk->vkGetInstanceProcAddr(instance, "vkCreateIndirectCommandsLayoutNV");
-    out->vkDestroyIndirectCommandsLayoutNV = (PFN_vkDestroyIndirectCommandsLayoutNV)vk->vkGetInstanceProcAddr(instance, "vkDestroyIndirectCommandsLayoutNV");
+    out->vkGetGeneratedCommandsMemoryRequirementsNV =
+        (PFN_vkGetGeneratedCommandsMemoryRequirementsNV)vk->vkGetInstanceProcAddr(
+            instance, "vkGetGeneratedCommandsMemoryRequirementsNV");
+    out->vkCmdPreprocessGeneratedCommandsNV =
+        (PFN_vkCmdPreprocessGeneratedCommandsNV)vk->vkGetInstanceProcAddr(
+            instance, "vkCmdPreprocessGeneratedCommandsNV");
+    out->vkCmdExecuteGeneratedCommandsNV =
+        (PFN_vkCmdExecuteGeneratedCommandsNV)vk->vkGetInstanceProcAddr(
+            instance, "vkCmdExecuteGeneratedCommandsNV");
+    out->vkCmdBindPipelineShaderGroupNV =
+        (PFN_vkCmdBindPipelineShaderGroupNV)vk->vkGetInstanceProcAddr(
+            instance, "vkCmdBindPipelineShaderGroupNV");
+    out->vkCreateIndirectCommandsLayoutNV =
+        (PFN_vkCreateIndirectCommandsLayoutNV)vk->vkGetInstanceProcAddr(
+            instance, "vkCreateIndirectCommandsLayoutNV");
+    out->vkDestroyIndirectCommandsLayoutNV =
+        (PFN_vkDestroyIndirectCommandsLayoutNV)vk->vkGetInstanceProcAddr(
+            instance, "vkDestroyIndirectCommandsLayoutNV");
 #endif
 #ifdef VK_EXT_acquire_drm_display
-    out->vkAcquireDrmDisplayEXT = (PFN_vkAcquireDrmDisplayEXT)vk->vkGetInstanceProcAddr(instance, "vkAcquireDrmDisplayEXT");
-    out->vkGetDrmDisplayEXT = (PFN_vkGetDrmDisplayEXT)vk->vkGetInstanceProcAddr(instance, "vkGetDrmDisplayEXT");
+    out->vkAcquireDrmDisplayEXT =
+        (PFN_vkAcquireDrmDisplayEXT)vk->vkGetInstanceProcAddr(instance, "vkAcquireDrmDisplayEXT");
+    out->vkGetDrmDisplayEXT =
+        (PFN_vkGetDrmDisplayEXT)vk->vkGetInstanceProcAddr(instance, "vkGetDrmDisplayEXT");
 #endif
 #ifdef VK_EXT_private_data
-    out->vkCreatePrivateDataSlotEXT = (PFN_vkCreatePrivateDataSlotEXT)vk->vkGetInstanceProcAddr(instance, "vkCreatePrivateDataSlotEXT");
-    out->vkDestroyPrivateDataSlotEXT = (PFN_vkDestroyPrivateDataSlotEXT)vk->vkGetInstanceProcAddr(instance, "vkDestroyPrivateDataSlotEXT");
-    out->vkSetPrivateDataEXT = (PFN_vkSetPrivateDataEXT)vk->vkGetInstanceProcAddr(instance, "vkSetPrivateDataEXT");
-    out->vkGetPrivateDataEXT = (PFN_vkGetPrivateDataEXT)vk->vkGetInstanceProcAddr(instance, "vkGetPrivateDataEXT");
+    out->vkCreatePrivateDataSlotEXT = (PFN_vkCreatePrivateDataSlotEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkCreatePrivateDataSlotEXT");
+    out->vkDestroyPrivateDataSlotEXT = (PFN_vkDestroyPrivateDataSlotEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkDestroyPrivateDataSlotEXT");
+    out->vkSetPrivateDataEXT =
+        (PFN_vkSetPrivateDataEXT)vk->vkGetInstanceProcAddr(instance, "vkSetPrivateDataEXT");
+    out->vkGetPrivateDataEXT =
+        (PFN_vkGetPrivateDataEXT)vk->vkGetInstanceProcAddr(instance, "vkGetPrivateDataEXT");
 #endif
 #ifdef VK_NV_fragment_shading_rate_enums
-    out->vkCmdSetFragmentShadingRateEnumNV = (PFN_vkCmdSetFragmentShadingRateEnumNV)vk->vkGetInstanceProcAddr(instance, "vkCmdSetFragmentShadingRateEnumNV");
+    out->vkCmdSetFragmentShadingRateEnumNV =
+        (PFN_vkCmdSetFragmentShadingRateEnumNV)vk->vkGetInstanceProcAddr(
+            instance, "vkCmdSetFragmentShadingRateEnumNV");
 #endif
 #ifdef VK_NV_acquire_winrt_display
-    out->vkAcquireWinrtDisplayNV = (PFN_vkAcquireWinrtDisplayNV)vk->vkGetInstanceProcAddr(instance, "vkAcquireWinrtDisplayNV");
-    out->vkGetWinrtDisplayNV = (PFN_vkGetWinrtDisplayNV)vk->vkGetInstanceProcAddr(instance, "vkGetWinrtDisplayNV");
+    out->vkAcquireWinrtDisplayNV =
+        (PFN_vkAcquireWinrtDisplayNV)vk->vkGetInstanceProcAddr(instance, "vkAcquireWinrtDisplayNV");
+    out->vkGetWinrtDisplayNV =
+        (PFN_vkGetWinrtDisplayNV)vk->vkGetInstanceProcAddr(instance, "vkGetWinrtDisplayNV");
 #endif
 #ifdef VK_EXT_directfb_surface
-    out->vkGetPhysicalDeviceDirectFBPresentationSupportEXT = (PFN_vkGetPhysicalDeviceDirectFBPresentationSupportEXT)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceDirectFBPresentationSupportEXT");
+    out->vkGetPhysicalDeviceDirectFBPresentationSupportEXT =
+        (PFN_vkGetPhysicalDeviceDirectFBPresentationSupportEXT)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceDirectFBPresentationSupportEXT");
 #endif
 #ifdef VK_EXT_vertex_input_dynamic_state
-    out->vkCmdSetVertexInputEXT = (PFN_vkCmdSetVertexInputEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdSetVertexInputEXT");
+    out->vkCmdSetVertexInputEXT =
+        (PFN_vkCmdSetVertexInputEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdSetVertexInputEXT");
 #endif
 #ifdef VK_FUCHSIA_external_memory
-    out->vkGetMemoryZirconHandleFUCHSIA = (PFN_vkGetMemoryZirconHandleFUCHSIA)vk->vkGetInstanceProcAddr(instance, "vkGetMemoryZirconHandleFUCHSIA");
-    out->vkGetMemoryZirconHandlePropertiesFUCHSIA = (PFN_vkGetMemoryZirconHandlePropertiesFUCHSIA)vk->vkGetInstanceProcAddr(instance, "vkGetMemoryZirconHandlePropertiesFUCHSIA");
+    out->vkGetMemoryZirconHandleFUCHSIA =
+        (PFN_vkGetMemoryZirconHandleFUCHSIA)vk->vkGetInstanceProcAddr(
+            instance, "vkGetMemoryZirconHandleFUCHSIA");
+    out->vkGetMemoryZirconHandlePropertiesFUCHSIA =
+        (PFN_vkGetMemoryZirconHandlePropertiesFUCHSIA)vk->vkGetInstanceProcAddr(
+            instance, "vkGetMemoryZirconHandlePropertiesFUCHSIA");
 #endif
 #ifdef VK_FUCHSIA_external_semaphore
-    out->vkImportSemaphoreZirconHandleFUCHSIA = (PFN_vkImportSemaphoreZirconHandleFUCHSIA)vk->vkGetInstanceProcAddr(instance, "vkImportSemaphoreZirconHandleFUCHSIA");
-    out->vkGetSemaphoreZirconHandleFUCHSIA = (PFN_vkGetSemaphoreZirconHandleFUCHSIA)vk->vkGetInstanceProcAddr(instance, "vkGetSemaphoreZirconHandleFUCHSIA");
+    out->vkImportSemaphoreZirconHandleFUCHSIA =
+        (PFN_vkImportSemaphoreZirconHandleFUCHSIA)vk->vkGetInstanceProcAddr(
+            instance, "vkImportSemaphoreZirconHandleFUCHSIA");
+    out->vkGetSemaphoreZirconHandleFUCHSIA =
+        (PFN_vkGetSemaphoreZirconHandleFUCHSIA)vk->vkGetInstanceProcAddr(
+            instance, "vkGetSemaphoreZirconHandleFUCHSIA");
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
-    out->vkCreateBufferCollectionFUCHSIA = (PFN_vkCreateBufferCollectionFUCHSIA)vk->vkGetInstanceProcAddr(instance, "vkCreateBufferCollectionFUCHSIA");
-    out->vkSetBufferCollectionImageConstraintsFUCHSIA = (PFN_vkSetBufferCollectionImageConstraintsFUCHSIA)vk->vkGetInstanceProcAddr(instance, "vkSetBufferCollectionImageConstraintsFUCHSIA");
-    out->vkSetBufferCollectionBufferConstraintsFUCHSIA = (PFN_vkSetBufferCollectionBufferConstraintsFUCHSIA)vk->vkGetInstanceProcAddr(instance, "vkSetBufferCollectionBufferConstraintsFUCHSIA");
-    out->vkDestroyBufferCollectionFUCHSIA = (PFN_vkDestroyBufferCollectionFUCHSIA)vk->vkGetInstanceProcAddr(instance, "vkDestroyBufferCollectionFUCHSIA");
-    out->vkGetBufferCollectionPropertiesFUCHSIA = (PFN_vkGetBufferCollectionPropertiesFUCHSIA)vk->vkGetInstanceProcAddr(instance, "vkGetBufferCollectionPropertiesFUCHSIA");
+    out->vkCreateBufferCollectionFUCHSIA =
+        (PFN_vkCreateBufferCollectionFUCHSIA)vk->vkGetInstanceProcAddr(
+            instance, "vkCreateBufferCollectionFUCHSIA");
+    out->vkSetBufferCollectionImageConstraintsFUCHSIA =
+        (PFN_vkSetBufferCollectionImageConstraintsFUCHSIA)vk->vkGetInstanceProcAddr(
+            instance, "vkSetBufferCollectionImageConstraintsFUCHSIA");
+    out->vkSetBufferCollectionBufferConstraintsFUCHSIA =
+        (PFN_vkSetBufferCollectionBufferConstraintsFUCHSIA)vk->vkGetInstanceProcAddr(
+            instance, "vkSetBufferCollectionBufferConstraintsFUCHSIA");
+    out->vkDestroyBufferCollectionFUCHSIA =
+        (PFN_vkDestroyBufferCollectionFUCHSIA)vk->vkGetInstanceProcAddr(
+            instance, "vkDestroyBufferCollectionFUCHSIA");
+    out->vkGetBufferCollectionPropertiesFUCHSIA =
+        (PFN_vkGetBufferCollectionPropertiesFUCHSIA)vk->vkGetInstanceProcAddr(
+            instance, "vkGetBufferCollectionPropertiesFUCHSIA");
 #endif
 #ifdef VK_HUAWEI_subpass_shading
-    out->vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI = (PFN_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI)vk->vkGetInstanceProcAddr(instance, "vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI");
-    out->vkCmdSubpassShadingHUAWEI = (PFN_vkCmdSubpassShadingHUAWEI)vk->vkGetInstanceProcAddr(instance, "vkCmdSubpassShadingHUAWEI");
+    out->vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI =
+        (PFN_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI)vk->vkGetInstanceProcAddr(
+            instance, "vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI");
+    out->vkCmdSubpassShadingHUAWEI = (PFN_vkCmdSubpassShadingHUAWEI)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdSubpassShadingHUAWEI");
 #endif
 #ifdef VK_HUAWEI_invocation_mask
-    out->vkCmdBindInvocationMaskHUAWEI = (PFN_vkCmdBindInvocationMaskHUAWEI)vk->vkGetInstanceProcAddr(instance, "vkCmdBindInvocationMaskHUAWEI");
+    out->vkCmdBindInvocationMaskHUAWEI =
+        (PFN_vkCmdBindInvocationMaskHUAWEI)vk->vkGetInstanceProcAddr(
+            instance, "vkCmdBindInvocationMaskHUAWEI");
 #endif
 #ifdef VK_NV_external_memory_rdma
-    out->vkGetMemoryRemoteAddressNV = (PFN_vkGetMemoryRemoteAddressNV)vk->vkGetInstanceProcAddr(instance, "vkGetMemoryRemoteAddressNV");
+    out->vkGetMemoryRemoteAddressNV = (PFN_vkGetMemoryRemoteAddressNV)vk->vkGetInstanceProcAddr(
+        instance, "vkGetMemoryRemoteAddressNV");
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
-    out->vkCmdSetPatchControlPointsEXT = (PFN_vkCmdSetPatchControlPointsEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdSetPatchControlPointsEXT");
-    out->vkCmdSetRasterizerDiscardEnableEXT = (PFN_vkCmdSetRasterizerDiscardEnableEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdSetRasterizerDiscardEnableEXT");
-    out->vkCmdSetDepthBiasEnableEXT = (PFN_vkCmdSetDepthBiasEnableEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdSetDepthBiasEnableEXT");
-    out->vkCmdSetLogicOpEXT = (PFN_vkCmdSetLogicOpEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdSetLogicOpEXT");
-    out->vkCmdSetPrimitiveRestartEnableEXT = (PFN_vkCmdSetPrimitiveRestartEnableEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdSetPrimitiveRestartEnableEXT");
+    out->vkCmdSetPatchControlPointsEXT =
+        (PFN_vkCmdSetPatchControlPointsEXT)vk->vkGetInstanceProcAddr(
+            instance, "vkCmdSetPatchControlPointsEXT");
+    out->vkCmdSetRasterizerDiscardEnableEXT =
+        (PFN_vkCmdSetRasterizerDiscardEnableEXT)vk->vkGetInstanceProcAddr(
+            instance, "vkCmdSetRasterizerDiscardEnableEXT");
+    out->vkCmdSetDepthBiasEnableEXT = (PFN_vkCmdSetDepthBiasEnableEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdSetDepthBiasEnableEXT");
+    out->vkCmdSetLogicOpEXT =
+        (PFN_vkCmdSetLogicOpEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdSetLogicOpEXT");
+    out->vkCmdSetPrimitiveRestartEnableEXT =
+        (PFN_vkCmdSetPrimitiveRestartEnableEXT)vk->vkGetInstanceProcAddr(
+            instance, "vkCmdSetPrimitiveRestartEnableEXT");
 #endif
 #ifdef VK_QNX_screen_surface
-    out->vkGetPhysicalDeviceScreenPresentationSupportQNX = (PFN_vkGetPhysicalDeviceScreenPresentationSupportQNX)vk->vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceScreenPresentationSupportQNX");
+    out->vkGetPhysicalDeviceScreenPresentationSupportQNX =
+        (PFN_vkGetPhysicalDeviceScreenPresentationSupportQNX)vk->vkGetInstanceProcAddr(
+            instance, "vkGetPhysicalDeviceScreenPresentationSupportQNX");
 #endif
 #ifdef VK_EXT_color_write_enable
-    out->vkCmdSetColorWriteEnableEXT = (PFN_vkCmdSetColorWriteEnableEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdSetColorWriteEnableEXT");
+    out->vkCmdSetColorWriteEnableEXT = (PFN_vkCmdSetColorWriteEnableEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdSetColorWriteEnableEXT");
 #endif
 #ifdef VK_GOOGLE_gfxstream
-    out->vkRegisterImageColorBufferGOOGLE = (PFN_vkRegisterImageColorBufferGOOGLE)vk->vkGetInstanceProcAddr(instance, "vkRegisterImageColorBufferGOOGLE");
-    out->vkRegisterBufferColorBufferGOOGLE = (PFN_vkRegisterBufferColorBufferGOOGLE)vk->vkGetInstanceProcAddr(instance, "vkRegisterBufferColorBufferGOOGLE");
-    out->vkMapMemoryIntoAddressSpaceGOOGLE = (PFN_vkMapMemoryIntoAddressSpaceGOOGLE)vk->vkGetInstanceProcAddr(instance, "vkMapMemoryIntoAddressSpaceGOOGLE");
-    out->vkUpdateDescriptorSetWithTemplateSizedGOOGLE = (PFN_vkUpdateDescriptorSetWithTemplateSizedGOOGLE)vk->vkGetInstanceProcAddr(instance, "vkUpdateDescriptorSetWithTemplateSizedGOOGLE");
-    out->vkBeginCommandBufferAsyncGOOGLE = (PFN_vkBeginCommandBufferAsyncGOOGLE)vk->vkGetInstanceProcAddr(instance, "vkBeginCommandBufferAsyncGOOGLE");
-    out->vkEndCommandBufferAsyncGOOGLE = (PFN_vkEndCommandBufferAsyncGOOGLE)vk->vkGetInstanceProcAddr(instance, "vkEndCommandBufferAsyncGOOGLE");
-    out->vkResetCommandBufferAsyncGOOGLE = (PFN_vkResetCommandBufferAsyncGOOGLE)vk->vkGetInstanceProcAddr(instance, "vkResetCommandBufferAsyncGOOGLE");
-    out->vkCommandBufferHostSyncGOOGLE = (PFN_vkCommandBufferHostSyncGOOGLE)vk->vkGetInstanceProcAddr(instance, "vkCommandBufferHostSyncGOOGLE");
-    out->vkCreateImageWithRequirementsGOOGLE = (PFN_vkCreateImageWithRequirementsGOOGLE)vk->vkGetInstanceProcAddr(instance, "vkCreateImageWithRequirementsGOOGLE");
-    out->vkCreateBufferWithRequirementsGOOGLE = (PFN_vkCreateBufferWithRequirementsGOOGLE)vk->vkGetInstanceProcAddr(instance, "vkCreateBufferWithRequirementsGOOGLE");
-    out->vkGetMemoryHostAddressInfoGOOGLE = (PFN_vkGetMemoryHostAddressInfoGOOGLE)vk->vkGetInstanceProcAddr(instance, "vkGetMemoryHostAddressInfoGOOGLE");
-    out->vkFreeMemorySyncGOOGLE = (PFN_vkFreeMemorySyncGOOGLE)vk->vkGetInstanceProcAddr(instance, "vkFreeMemorySyncGOOGLE");
-    out->vkQueueHostSyncGOOGLE = (PFN_vkQueueHostSyncGOOGLE)vk->vkGetInstanceProcAddr(instance, "vkQueueHostSyncGOOGLE");
-    out->vkQueueSubmitAsyncGOOGLE = (PFN_vkQueueSubmitAsyncGOOGLE)vk->vkGetInstanceProcAddr(instance, "vkQueueSubmitAsyncGOOGLE");
-    out->vkQueueWaitIdleAsyncGOOGLE = (PFN_vkQueueWaitIdleAsyncGOOGLE)vk->vkGetInstanceProcAddr(instance, "vkQueueWaitIdleAsyncGOOGLE");
-    out->vkQueueBindSparseAsyncGOOGLE = (PFN_vkQueueBindSparseAsyncGOOGLE)vk->vkGetInstanceProcAddr(instance, "vkQueueBindSparseAsyncGOOGLE");
-    out->vkGetLinearImageLayoutGOOGLE = (PFN_vkGetLinearImageLayoutGOOGLE)vk->vkGetInstanceProcAddr(instance, "vkGetLinearImageLayoutGOOGLE");
-    out->vkGetLinearImageLayout2GOOGLE = (PFN_vkGetLinearImageLayout2GOOGLE)vk->vkGetInstanceProcAddr(instance, "vkGetLinearImageLayout2GOOGLE");
-    out->vkQueueFlushCommandsGOOGLE = (PFN_vkQueueFlushCommandsGOOGLE)vk->vkGetInstanceProcAddr(instance, "vkQueueFlushCommandsGOOGLE");
-    out->vkQueueCommitDescriptorSetUpdatesGOOGLE = (PFN_vkQueueCommitDescriptorSetUpdatesGOOGLE)vk->vkGetInstanceProcAddr(instance, "vkQueueCommitDescriptorSetUpdatesGOOGLE");
-    out->vkCollectDescriptorPoolIdsGOOGLE = (PFN_vkCollectDescriptorPoolIdsGOOGLE)vk->vkGetInstanceProcAddr(instance, "vkCollectDescriptorPoolIdsGOOGLE");
-    out->vkQueueSignalReleaseImageANDROIDAsyncGOOGLE = (PFN_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE)vk->vkGetInstanceProcAddr(instance, "vkQueueSignalReleaseImageANDROIDAsyncGOOGLE");
+    out->vkRegisterImageColorBufferGOOGLE =
+        (PFN_vkRegisterImageColorBufferGOOGLE)vk->vkGetInstanceProcAddr(
+            instance, "vkRegisterImageColorBufferGOOGLE");
+    out->vkRegisterBufferColorBufferGOOGLE =
+        (PFN_vkRegisterBufferColorBufferGOOGLE)vk->vkGetInstanceProcAddr(
+            instance, "vkRegisterBufferColorBufferGOOGLE");
+    out->vkMapMemoryIntoAddressSpaceGOOGLE =
+        (PFN_vkMapMemoryIntoAddressSpaceGOOGLE)vk->vkGetInstanceProcAddr(
+            instance, "vkMapMemoryIntoAddressSpaceGOOGLE");
+    out->vkUpdateDescriptorSetWithTemplateSizedGOOGLE =
+        (PFN_vkUpdateDescriptorSetWithTemplateSizedGOOGLE)vk->vkGetInstanceProcAddr(
+            instance, "vkUpdateDescriptorSetWithTemplateSizedGOOGLE");
+    out->vkBeginCommandBufferAsyncGOOGLE =
+        (PFN_vkBeginCommandBufferAsyncGOOGLE)vk->vkGetInstanceProcAddr(
+            instance, "vkBeginCommandBufferAsyncGOOGLE");
+    out->vkEndCommandBufferAsyncGOOGLE =
+        (PFN_vkEndCommandBufferAsyncGOOGLE)vk->vkGetInstanceProcAddr(
+            instance, "vkEndCommandBufferAsyncGOOGLE");
+    out->vkResetCommandBufferAsyncGOOGLE =
+        (PFN_vkResetCommandBufferAsyncGOOGLE)vk->vkGetInstanceProcAddr(
+            instance, "vkResetCommandBufferAsyncGOOGLE");
+    out->vkCommandBufferHostSyncGOOGLE =
+        (PFN_vkCommandBufferHostSyncGOOGLE)vk->vkGetInstanceProcAddr(
+            instance, "vkCommandBufferHostSyncGOOGLE");
+    out->vkCreateImageWithRequirementsGOOGLE =
+        (PFN_vkCreateImageWithRequirementsGOOGLE)vk->vkGetInstanceProcAddr(
+            instance, "vkCreateImageWithRequirementsGOOGLE");
+    out->vkCreateBufferWithRequirementsGOOGLE =
+        (PFN_vkCreateBufferWithRequirementsGOOGLE)vk->vkGetInstanceProcAddr(
+            instance, "vkCreateBufferWithRequirementsGOOGLE");
+    out->vkGetMemoryHostAddressInfoGOOGLE =
+        (PFN_vkGetMemoryHostAddressInfoGOOGLE)vk->vkGetInstanceProcAddr(
+            instance, "vkGetMemoryHostAddressInfoGOOGLE");
+    out->vkFreeMemorySyncGOOGLE =
+        (PFN_vkFreeMemorySyncGOOGLE)vk->vkGetInstanceProcAddr(instance, "vkFreeMemorySyncGOOGLE");
+    out->vkQueueHostSyncGOOGLE =
+        (PFN_vkQueueHostSyncGOOGLE)vk->vkGetInstanceProcAddr(instance, "vkQueueHostSyncGOOGLE");
+    out->vkQueueSubmitAsyncGOOGLE = (PFN_vkQueueSubmitAsyncGOOGLE)vk->vkGetInstanceProcAddr(
+        instance, "vkQueueSubmitAsyncGOOGLE");
+    out->vkQueueWaitIdleAsyncGOOGLE = (PFN_vkQueueWaitIdleAsyncGOOGLE)vk->vkGetInstanceProcAddr(
+        instance, "vkQueueWaitIdleAsyncGOOGLE");
+    out->vkQueueBindSparseAsyncGOOGLE = (PFN_vkQueueBindSparseAsyncGOOGLE)vk->vkGetInstanceProcAddr(
+        instance, "vkQueueBindSparseAsyncGOOGLE");
+    out->vkGetLinearImageLayoutGOOGLE = (PFN_vkGetLinearImageLayoutGOOGLE)vk->vkGetInstanceProcAddr(
+        instance, "vkGetLinearImageLayoutGOOGLE");
+    out->vkGetLinearImageLayout2GOOGLE =
+        (PFN_vkGetLinearImageLayout2GOOGLE)vk->vkGetInstanceProcAddr(
+            instance, "vkGetLinearImageLayout2GOOGLE");
+    out->vkQueueFlushCommandsGOOGLE = (PFN_vkQueueFlushCommandsGOOGLE)vk->vkGetInstanceProcAddr(
+        instance, "vkQueueFlushCommandsGOOGLE");
+    out->vkQueueCommitDescriptorSetUpdatesGOOGLE =
+        (PFN_vkQueueCommitDescriptorSetUpdatesGOOGLE)vk->vkGetInstanceProcAddr(
+            instance, "vkQueueCommitDescriptorSetUpdatesGOOGLE");
+    out->vkCollectDescriptorPoolIdsGOOGLE =
+        (PFN_vkCollectDescriptorPoolIdsGOOGLE)vk->vkGetInstanceProcAddr(
+            instance, "vkCollectDescriptorPoolIdsGOOGLE");
+    out->vkQueueSignalReleaseImageANDROIDAsyncGOOGLE =
+        (PFN_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE)vk->vkGetInstanceProcAddr(
+            instance, "vkQueueSignalReleaseImageANDROIDAsyncGOOGLE");
 #endif
 #ifdef VK_EXT_multi_draw
-    out->vkCmdDrawMultiEXT = (PFN_vkCmdDrawMultiEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdDrawMultiEXT");
-    out->vkCmdDrawMultiIndexedEXT = (PFN_vkCmdDrawMultiIndexedEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdDrawMultiIndexedEXT");
+    out->vkCmdDrawMultiEXT =
+        (PFN_vkCmdDrawMultiEXT)vk->vkGetInstanceProcAddr(instance, "vkCmdDrawMultiEXT");
+    out->vkCmdDrawMultiIndexedEXT = (PFN_vkCmdDrawMultiIndexedEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdDrawMultiIndexedEXT");
 #endif
 #ifdef VK_EXT_pageable_device_local_memory
-    out->vkSetDeviceMemoryPriorityEXT = (PFN_vkSetDeviceMemoryPriorityEXT)vk->vkGetInstanceProcAddr(instance, "vkSetDeviceMemoryPriorityEXT");
+    out->vkSetDeviceMemoryPriorityEXT = (PFN_vkSetDeviceMemoryPriorityEXT)vk->vkGetInstanceProcAddr(
+        instance, "vkSetDeviceMemoryPriorityEXT");
 #endif
 #ifdef VK_KHR_acceleration_structure
-    out->vkCreateAccelerationStructureKHR = (PFN_vkCreateAccelerationStructureKHR)vk->vkGetInstanceProcAddr(instance, "vkCreateAccelerationStructureKHR");
-    out->vkDestroyAccelerationStructureKHR = (PFN_vkDestroyAccelerationStructureKHR)vk->vkGetInstanceProcAddr(instance, "vkDestroyAccelerationStructureKHR");
-    out->vkCmdBuildAccelerationStructuresKHR = (PFN_vkCmdBuildAccelerationStructuresKHR)vk->vkGetInstanceProcAddr(instance, "vkCmdBuildAccelerationStructuresKHR");
-    out->vkCmdBuildAccelerationStructuresIndirectKHR = (PFN_vkCmdBuildAccelerationStructuresIndirectKHR)vk->vkGetInstanceProcAddr(instance, "vkCmdBuildAccelerationStructuresIndirectKHR");
-    out->vkBuildAccelerationStructuresKHR = (PFN_vkBuildAccelerationStructuresKHR)vk->vkGetInstanceProcAddr(instance, "vkBuildAccelerationStructuresKHR");
-    out->vkCopyAccelerationStructureKHR = (PFN_vkCopyAccelerationStructureKHR)vk->vkGetInstanceProcAddr(instance, "vkCopyAccelerationStructureKHR");
-    out->vkCopyAccelerationStructureToMemoryKHR = (PFN_vkCopyAccelerationStructureToMemoryKHR)vk->vkGetInstanceProcAddr(instance, "vkCopyAccelerationStructureToMemoryKHR");
-    out->vkCopyMemoryToAccelerationStructureKHR = (PFN_vkCopyMemoryToAccelerationStructureKHR)vk->vkGetInstanceProcAddr(instance, "vkCopyMemoryToAccelerationStructureKHR");
-    out->vkWriteAccelerationStructuresPropertiesKHR = (PFN_vkWriteAccelerationStructuresPropertiesKHR)vk->vkGetInstanceProcAddr(instance, "vkWriteAccelerationStructuresPropertiesKHR");
-    out->vkCmdCopyAccelerationStructureKHR = (PFN_vkCmdCopyAccelerationStructureKHR)vk->vkGetInstanceProcAddr(instance, "vkCmdCopyAccelerationStructureKHR");
-    out->vkCmdCopyAccelerationStructureToMemoryKHR = (PFN_vkCmdCopyAccelerationStructureToMemoryKHR)vk->vkGetInstanceProcAddr(instance, "vkCmdCopyAccelerationStructureToMemoryKHR");
-    out->vkCmdCopyMemoryToAccelerationStructureKHR = (PFN_vkCmdCopyMemoryToAccelerationStructureKHR)vk->vkGetInstanceProcAddr(instance, "vkCmdCopyMemoryToAccelerationStructureKHR");
-    out->vkGetAccelerationStructureDeviceAddressKHR = (PFN_vkGetAccelerationStructureDeviceAddressKHR)vk->vkGetInstanceProcAddr(instance, "vkGetAccelerationStructureDeviceAddressKHR");
-    out->vkCmdWriteAccelerationStructuresPropertiesKHR = (PFN_vkCmdWriteAccelerationStructuresPropertiesKHR)vk->vkGetInstanceProcAddr(instance, "vkCmdWriteAccelerationStructuresPropertiesKHR");
-    out->vkGetDeviceAccelerationStructureCompatibilityKHR = (PFN_vkGetDeviceAccelerationStructureCompatibilityKHR)vk->vkGetInstanceProcAddr(instance, "vkGetDeviceAccelerationStructureCompatibilityKHR");
-    out->vkGetAccelerationStructureBuildSizesKHR = (PFN_vkGetAccelerationStructureBuildSizesKHR)vk->vkGetInstanceProcAddr(instance, "vkGetAccelerationStructureBuildSizesKHR");
+    out->vkCreateAccelerationStructureKHR =
+        (PFN_vkCreateAccelerationStructureKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkCreateAccelerationStructureKHR");
+    out->vkDestroyAccelerationStructureKHR =
+        (PFN_vkDestroyAccelerationStructureKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkDestroyAccelerationStructureKHR");
+    out->vkCmdBuildAccelerationStructuresKHR =
+        (PFN_vkCmdBuildAccelerationStructuresKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkCmdBuildAccelerationStructuresKHR");
+    out->vkCmdBuildAccelerationStructuresIndirectKHR =
+        (PFN_vkCmdBuildAccelerationStructuresIndirectKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkCmdBuildAccelerationStructuresIndirectKHR");
+    out->vkBuildAccelerationStructuresKHR =
+        (PFN_vkBuildAccelerationStructuresKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkBuildAccelerationStructuresKHR");
+    out->vkCopyAccelerationStructureKHR =
+        (PFN_vkCopyAccelerationStructureKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkCopyAccelerationStructureKHR");
+    out->vkCopyAccelerationStructureToMemoryKHR =
+        (PFN_vkCopyAccelerationStructureToMemoryKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkCopyAccelerationStructureToMemoryKHR");
+    out->vkCopyMemoryToAccelerationStructureKHR =
+        (PFN_vkCopyMemoryToAccelerationStructureKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkCopyMemoryToAccelerationStructureKHR");
+    out->vkWriteAccelerationStructuresPropertiesKHR =
+        (PFN_vkWriteAccelerationStructuresPropertiesKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkWriteAccelerationStructuresPropertiesKHR");
+    out->vkCmdCopyAccelerationStructureKHR =
+        (PFN_vkCmdCopyAccelerationStructureKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkCmdCopyAccelerationStructureKHR");
+    out->vkCmdCopyAccelerationStructureToMemoryKHR =
+        (PFN_vkCmdCopyAccelerationStructureToMemoryKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkCmdCopyAccelerationStructureToMemoryKHR");
+    out->vkCmdCopyMemoryToAccelerationStructureKHR =
+        (PFN_vkCmdCopyMemoryToAccelerationStructureKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkCmdCopyMemoryToAccelerationStructureKHR");
+    out->vkGetAccelerationStructureDeviceAddressKHR =
+        (PFN_vkGetAccelerationStructureDeviceAddressKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetAccelerationStructureDeviceAddressKHR");
+    out->vkCmdWriteAccelerationStructuresPropertiesKHR =
+        (PFN_vkCmdWriteAccelerationStructuresPropertiesKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkCmdWriteAccelerationStructuresPropertiesKHR");
+    out->vkGetDeviceAccelerationStructureCompatibilityKHR =
+        (PFN_vkGetDeviceAccelerationStructureCompatibilityKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetDeviceAccelerationStructureCompatibilityKHR");
+    out->vkGetAccelerationStructureBuildSizesKHR =
+        (PFN_vkGetAccelerationStructureBuildSizesKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetAccelerationStructureBuildSizesKHR");
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
-    out->vkCmdTraceRaysKHR = (PFN_vkCmdTraceRaysKHR)vk->vkGetInstanceProcAddr(instance, "vkCmdTraceRaysKHR");
-    out->vkCreateRayTracingPipelinesKHR = (PFN_vkCreateRayTracingPipelinesKHR)vk->vkGetInstanceProcAddr(instance, "vkCreateRayTracingPipelinesKHR");
-    out->vkGetRayTracingCaptureReplayShaderGroupHandlesKHR = (PFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR)vk->vkGetInstanceProcAddr(instance, "vkGetRayTracingCaptureReplayShaderGroupHandlesKHR");
-    out->vkCmdTraceRaysIndirectKHR = (PFN_vkCmdTraceRaysIndirectKHR)vk->vkGetInstanceProcAddr(instance, "vkCmdTraceRaysIndirectKHR");
-    out->vkGetRayTracingShaderGroupStackSizeKHR = (PFN_vkGetRayTracingShaderGroupStackSizeKHR)vk->vkGetInstanceProcAddr(instance, "vkGetRayTracingShaderGroupStackSizeKHR");
-    out->vkCmdSetRayTracingPipelineStackSizeKHR = (PFN_vkCmdSetRayTracingPipelineStackSizeKHR)vk->vkGetInstanceProcAddr(instance, "vkCmdSetRayTracingPipelineStackSizeKHR");
+    out->vkCmdTraceRaysKHR =
+        (PFN_vkCmdTraceRaysKHR)vk->vkGetInstanceProcAddr(instance, "vkCmdTraceRaysKHR");
+    out->vkCreateRayTracingPipelinesKHR =
+        (PFN_vkCreateRayTracingPipelinesKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkCreateRayTracingPipelinesKHR");
+    out->vkGetRayTracingCaptureReplayShaderGroupHandlesKHR =
+        (PFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetRayTracingCaptureReplayShaderGroupHandlesKHR");
+    out->vkCmdTraceRaysIndirectKHR = (PFN_vkCmdTraceRaysIndirectKHR)vk->vkGetInstanceProcAddr(
+        instance, "vkCmdTraceRaysIndirectKHR");
+    out->vkGetRayTracingShaderGroupStackSizeKHR =
+        (PFN_vkGetRayTracingShaderGroupStackSizeKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkGetRayTracingShaderGroupStackSizeKHR");
+    out->vkCmdSetRayTracingPipelineStackSizeKHR =
+        (PFN_vkCmdSetRayTracingPipelineStackSizeKHR)vk->vkGetInstanceProcAddr(
+            instance, "vkCmdSetRayTracingPipelineStackSizeKHR");
 #endif
 }
 
-void init_vulkan_dispatch_from_device(
-    VulkanDispatch* vk,
-    VkDevice device,
-    VulkanDispatch* out)
-{
+void init_vulkan_dispatch_from_device(VulkanDispatch* vk, VkDevice device, VulkanDispatch* out) {
     memset(out, 0x0, sizeof(VulkanDispatch));
 #ifdef VK_VERSION_1_0
-    out->vkDestroyInstance = (PFN_vkDestroyInstance)vk->vkGetDeviceProcAddr(device, "vkDestroyInstance");
-    out->vkEnumeratePhysicalDevices = (PFN_vkEnumeratePhysicalDevices)vk->vkGetDeviceProcAddr(device, "vkEnumeratePhysicalDevices");
-    out->vkGetPhysicalDeviceFeatures = (PFN_vkGetPhysicalDeviceFeatures)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceFeatures");
-    out->vkGetPhysicalDeviceFormatProperties = (PFN_vkGetPhysicalDeviceFormatProperties)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceFormatProperties");
-    out->vkGetPhysicalDeviceImageFormatProperties = (PFN_vkGetPhysicalDeviceImageFormatProperties)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceImageFormatProperties");
-    out->vkGetPhysicalDeviceProperties = (PFN_vkGetPhysicalDeviceProperties)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceProperties");
-    out->vkGetPhysicalDeviceQueueFamilyProperties = (PFN_vkGetPhysicalDeviceQueueFamilyProperties)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceQueueFamilyProperties");
-    out->vkGetPhysicalDeviceMemoryProperties = (PFN_vkGetPhysicalDeviceMemoryProperties)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceMemoryProperties");
-    out->vkGetInstanceProcAddr = (PFN_vkGetInstanceProcAddr)vk->vkGetDeviceProcAddr(device, "vkGetInstanceProcAddr");
+    out->vkDestroyInstance =
+        (PFN_vkDestroyInstance)vk->vkGetDeviceProcAddr(device, "vkDestroyInstance");
+    out->vkEnumeratePhysicalDevices = (PFN_vkEnumeratePhysicalDevices)vk->vkGetDeviceProcAddr(
+        device, "vkEnumeratePhysicalDevices");
+    out->vkGetPhysicalDeviceFeatures = (PFN_vkGetPhysicalDeviceFeatures)vk->vkGetDeviceProcAddr(
+        device, "vkGetPhysicalDeviceFeatures");
+    out->vkGetPhysicalDeviceFormatProperties =
+        (PFN_vkGetPhysicalDeviceFormatProperties)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceFormatProperties");
+    out->vkGetPhysicalDeviceImageFormatProperties =
+        (PFN_vkGetPhysicalDeviceImageFormatProperties)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceImageFormatProperties");
+    out->vkGetPhysicalDeviceProperties = (PFN_vkGetPhysicalDeviceProperties)vk->vkGetDeviceProcAddr(
+        device, "vkGetPhysicalDeviceProperties");
+    out->vkGetPhysicalDeviceQueueFamilyProperties =
+        (PFN_vkGetPhysicalDeviceQueueFamilyProperties)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceQueueFamilyProperties");
+    out->vkGetPhysicalDeviceMemoryProperties =
+        (PFN_vkGetPhysicalDeviceMemoryProperties)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceMemoryProperties");
+    out->vkGetInstanceProcAddr =
+        (PFN_vkGetInstanceProcAddr)vk->vkGetDeviceProcAddr(device, "vkGetInstanceProcAddr");
     out->vkCreateDevice = (PFN_vkCreateDevice)vk->vkGetDeviceProcAddr(device, "vkCreateDevice");
     out->vkDestroyDevice = (PFN_vkDestroyDevice)vk->vkGetDeviceProcAddr(device, "vkDestroyDevice");
-    out->vkEnumerateDeviceExtensionProperties = (PFN_vkEnumerateDeviceExtensionProperties)vk->vkGetDeviceProcAddr(device, "vkEnumerateDeviceExtensionProperties");
-    out->vkEnumerateDeviceLayerProperties = (PFN_vkEnumerateDeviceLayerProperties)vk->vkGetDeviceProcAddr(device, "vkEnumerateDeviceLayerProperties");
-    out->vkCreateInstance = (PFN_vkCreateInstance)vk->vkGetDeviceProcAddr(device, "vkCreateInstance");
-    out->vkEnumerateInstanceExtensionProperties = (PFN_vkEnumerateInstanceExtensionProperties)vk->vkGetDeviceProcAddr(device, "vkEnumerateInstanceExtensionProperties");
-    out->vkEnumerateInstanceLayerProperties = (PFN_vkEnumerateInstanceLayerProperties)vk->vkGetDeviceProcAddr(device, "vkEnumerateInstanceLayerProperties");
-    out->vkGetDeviceProcAddr = (PFN_vkGetDeviceProcAddr)vk->vkGetDeviceProcAddr(device, "vkGetDeviceProcAddr");
-    out->vkGetPhysicalDeviceSparseImageFormatProperties = (PFN_vkGetPhysicalDeviceSparseImageFormatProperties)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceSparseImageFormatProperties");
+    out->vkEnumerateDeviceExtensionProperties =
+        (PFN_vkEnumerateDeviceExtensionProperties)vk->vkGetDeviceProcAddr(
+            device, "vkEnumerateDeviceExtensionProperties");
+    out->vkEnumerateDeviceLayerProperties =
+        (PFN_vkEnumerateDeviceLayerProperties)vk->vkGetDeviceProcAddr(
+            device, "vkEnumerateDeviceLayerProperties");
+    out->vkCreateInstance =
+        (PFN_vkCreateInstance)vk->vkGetDeviceProcAddr(device, "vkCreateInstance");
+    out->vkEnumerateInstanceExtensionProperties =
+        (PFN_vkEnumerateInstanceExtensionProperties)vk->vkGetDeviceProcAddr(
+            device, "vkEnumerateInstanceExtensionProperties");
+    out->vkEnumerateInstanceLayerProperties =
+        (PFN_vkEnumerateInstanceLayerProperties)vk->vkGetDeviceProcAddr(
+            device, "vkEnumerateInstanceLayerProperties");
+    out->vkGetDeviceProcAddr =
+        (PFN_vkGetDeviceProcAddr)vk->vkGetDeviceProcAddr(device, "vkGetDeviceProcAddr");
+    out->vkGetPhysicalDeviceSparseImageFormatProperties =
+        (PFN_vkGetPhysicalDeviceSparseImageFormatProperties)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceSparseImageFormatProperties");
 #endif
 #ifdef VK_VERSION_1_1
-    out->vkEnumerateInstanceVersion = (PFN_vkEnumerateInstanceVersion)vk->vkGetDeviceProcAddr(device, "vkEnumerateInstanceVersion");
-    out->vkEnumeratePhysicalDeviceGroups = (PFN_vkEnumeratePhysicalDeviceGroups)vk->vkGetDeviceProcAddr(device, "vkEnumeratePhysicalDeviceGroups");
-    out->vkGetPhysicalDeviceFeatures2 = (PFN_vkGetPhysicalDeviceFeatures2)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceFeatures2");
-    out->vkGetPhysicalDeviceProperties2 = (PFN_vkGetPhysicalDeviceProperties2)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceProperties2");
-    out->vkGetPhysicalDeviceFormatProperties2 = (PFN_vkGetPhysicalDeviceFormatProperties2)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceFormatProperties2");
-    out->vkGetPhysicalDeviceImageFormatProperties2 = (PFN_vkGetPhysicalDeviceImageFormatProperties2)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceImageFormatProperties2");
-    out->vkGetPhysicalDeviceQueueFamilyProperties2 = (PFN_vkGetPhysicalDeviceQueueFamilyProperties2)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceQueueFamilyProperties2");
-    out->vkGetPhysicalDeviceMemoryProperties2 = (PFN_vkGetPhysicalDeviceMemoryProperties2)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceMemoryProperties2");
-    out->vkGetPhysicalDeviceSparseImageFormatProperties2 = (PFN_vkGetPhysicalDeviceSparseImageFormatProperties2)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceSparseImageFormatProperties2");
-    out->vkGetPhysicalDeviceExternalBufferProperties = (PFN_vkGetPhysicalDeviceExternalBufferProperties)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceExternalBufferProperties");
-    out->vkGetPhysicalDeviceExternalFenceProperties = (PFN_vkGetPhysicalDeviceExternalFenceProperties)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceExternalFenceProperties");
-    out->vkGetPhysicalDeviceExternalSemaphoreProperties = (PFN_vkGetPhysicalDeviceExternalSemaphoreProperties)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceExternalSemaphoreProperties");
+    out->vkEnumerateInstanceVersion = (PFN_vkEnumerateInstanceVersion)vk->vkGetDeviceProcAddr(
+        device, "vkEnumerateInstanceVersion");
+    out->vkEnumeratePhysicalDeviceGroups =
+        (PFN_vkEnumeratePhysicalDeviceGroups)vk->vkGetDeviceProcAddr(
+            device, "vkEnumeratePhysicalDeviceGroups");
+    out->vkGetPhysicalDeviceFeatures2 = (PFN_vkGetPhysicalDeviceFeatures2)vk->vkGetDeviceProcAddr(
+        device, "vkGetPhysicalDeviceFeatures2");
+    out->vkGetPhysicalDeviceProperties2 =
+        (PFN_vkGetPhysicalDeviceProperties2)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceProperties2");
+    out->vkGetPhysicalDeviceFormatProperties2 =
+        (PFN_vkGetPhysicalDeviceFormatProperties2)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceFormatProperties2");
+    out->vkGetPhysicalDeviceImageFormatProperties2 =
+        (PFN_vkGetPhysicalDeviceImageFormatProperties2)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceImageFormatProperties2");
+    out->vkGetPhysicalDeviceQueueFamilyProperties2 =
+        (PFN_vkGetPhysicalDeviceQueueFamilyProperties2)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceQueueFamilyProperties2");
+    out->vkGetPhysicalDeviceMemoryProperties2 =
+        (PFN_vkGetPhysicalDeviceMemoryProperties2)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceMemoryProperties2");
+    out->vkGetPhysicalDeviceSparseImageFormatProperties2 =
+        (PFN_vkGetPhysicalDeviceSparseImageFormatProperties2)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceSparseImageFormatProperties2");
+    out->vkGetPhysicalDeviceExternalBufferProperties =
+        (PFN_vkGetPhysicalDeviceExternalBufferProperties)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceExternalBufferProperties");
+    out->vkGetPhysicalDeviceExternalFenceProperties =
+        (PFN_vkGetPhysicalDeviceExternalFenceProperties)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceExternalFenceProperties");
+    out->vkGetPhysicalDeviceExternalSemaphoreProperties =
+        (PFN_vkGetPhysicalDeviceExternalSemaphoreProperties)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceExternalSemaphoreProperties");
 #endif
 #ifdef VK_KHR_surface
-    out->vkDestroySurfaceKHR = (PFN_vkDestroySurfaceKHR)vk->vkGetDeviceProcAddr(device, "vkDestroySurfaceKHR");
+    out->vkDestroySurfaceKHR =
+        (PFN_vkDestroySurfaceKHR)vk->vkGetDeviceProcAddr(device, "vkDestroySurfaceKHR");
 #endif
 #ifdef VK_KHR_swapchain
-    out->vkCreateSwapchainKHR = (PFN_vkCreateSwapchainKHR)vk->vkGetDeviceProcAddr(device, "vkCreateSwapchainKHR");
-    out->vkDestroySwapchainKHR = (PFN_vkDestroySwapchainKHR)vk->vkGetDeviceProcAddr(device, "vkDestroySwapchainKHR");
-    out->vkGetSwapchainImagesKHR = (PFN_vkGetSwapchainImagesKHR)vk->vkGetDeviceProcAddr(device, "vkGetSwapchainImagesKHR");
-    out->vkAcquireNextImageKHR = (PFN_vkAcquireNextImageKHR)vk->vkGetDeviceProcAddr(device, "vkAcquireNextImageKHR");
-    out->vkQueuePresentKHR = (PFN_vkQueuePresentKHR)vk->vkGetDeviceProcAddr(device, "vkQueuePresentKHR");
+    out->vkCreateSwapchainKHR =
+        (PFN_vkCreateSwapchainKHR)vk->vkGetDeviceProcAddr(device, "vkCreateSwapchainKHR");
+    out->vkDestroySwapchainKHR =
+        (PFN_vkDestroySwapchainKHR)vk->vkGetDeviceProcAddr(device, "vkDestroySwapchainKHR");
+    out->vkGetSwapchainImagesKHR =
+        (PFN_vkGetSwapchainImagesKHR)vk->vkGetDeviceProcAddr(device, "vkGetSwapchainImagesKHR");
+    out->vkAcquireNextImageKHR =
+        (PFN_vkAcquireNextImageKHR)vk->vkGetDeviceProcAddr(device, "vkAcquireNextImageKHR");
+    out->vkQueuePresentKHR =
+        (PFN_vkQueuePresentKHR)vk->vkGetDeviceProcAddr(device, "vkQueuePresentKHR");
 #endif
 #ifdef VK_KHR_display
-    out->vkCreateDisplayPlaneSurfaceKHR = (PFN_vkCreateDisplayPlaneSurfaceKHR)vk->vkGetDeviceProcAddr(device, "vkCreateDisplayPlaneSurfaceKHR");
+    out->vkCreateDisplayPlaneSurfaceKHR =
+        (PFN_vkCreateDisplayPlaneSurfaceKHR)vk->vkGetDeviceProcAddr(
+            device, "vkCreateDisplayPlaneSurfaceKHR");
 #endif
 #ifdef VK_KHR_xlib_surface
-    out->vkCreateXlibSurfaceKHR = (PFN_vkCreateXlibSurfaceKHR)vk->vkGetDeviceProcAddr(device, "vkCreateXlibSurfaceKHR");
-    out->vkGetPhysicalDeviceXlibPresentationSupportKHR = (PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceXlibPresentationSupportKHR");
+    out->vkCreateXlibSurfaceKHR =
+        (PFN_vkCreateXlibSurfaceKHR)vk->vkGetDeviceProcAddr(device, "vkCreateXlibSurfaceKHR");
+    out->vkGetPhysicalDeviceXlibPresentationSupportKHR =
+        (PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceXlibPresentationSupportKHR");
 #endif
 #ifdef VK_KHR_xcb_surface
-    out->vkCreateXcbSurfaceKHR = (PFN_vkCreateXcbSurfaceKHR)vk->vkGetDeviceProcAddr(device, "vkCreateXcbSurfaceKHR");
-    out->vkGetPhysicalDeviceXcbPresentationSupportKHR = (PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceXcbPresentationSupportKHR");
+    out->vkCreateXcbSurfaceKHR =
+        (PFN_vkCreateXcbSurfaceKHR)vk->vkGetDeviceProcAddr(device, "vkCreateXcbSurfaceKHR");
+    out->vkGetPhysicalDeviceXcbPresentationSupportKHR =
+        (PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceXcbPresentationSupportKHR");
 #endif
 #ifdef VK_KHR_wayland_surface
-    out->vkCreateWaylandSurfaceKHR = (PFN_vkCreateWaylandSurfaceKHR)vk->vkGetDeviceProcAddr(device, "vkCreateWaylandSurfaceKHR");
+    out->vkCreateWaylandSurfaceKHR =
+        (PFN_vkCreateWaylandSurfaceKHR)vk->vkGetDeviceProcAddr(device, "vkCreateWaylandSurfaceKHR");
 #endif
 #ifdef VK_KHR_android_surface
-    out->vkCreateAndroidSurfaceKHR = (PFN_vkCreateAndroidSurfaceKHR)vk->vkGetDeviceProcAddr(device, "vkCreateAndroidSurfaceKHR");
+    out->vkCreateAndroidSurfaceKHR =
+        (PFN_vkCreateAndroidSurfaceKHR)vk->vkGetDeviceProcAddr(device, "vkCreateAndroidSurfaceKHR");
 #endif
 #ifdef VK_KHR_win32_surface
-    out->vkCreateWin32SurfaceKHR = (PFN_vkCreateWin32SurfaceKHR)vk->vkGetDeviceProcAddr(device, "vkCreateWin32SurfaceKHR");
-    out->vkGetPhysicalDeviceWin32PresentationSupportKHR = (PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceWin32PresentationSupportKHR");
+    out->vkCreateWin32SurfaceKHR =
+        (PFN_vkCreateWin32SurfaceKHR)vk->vkGetDeviceProcAddr(device, "vkCreateWin32SurfaceKHR");
+    out->vkGetPhysicalDeviceWin32PresentationSupportKHR =
+        (PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceWin32PresentationSupportKHR");
 #endif
 #ifdef VK_KHR_device_group_creation
-    out->vkEnumeratePhysicalDeviceGroupsKHR = (PFN_vkEnumeratePhysicalDeviceGroupsKHR)vk->vkGetDeviceProcAddr(device, "vkEnumeratePhysicalDeviceGroupsKHR");
+    out->vkEnumeratePhysicalDeviceGroupsKHR =
+        (PFN_vkEnumeratePhysicalDeviceGroupsKHR)vk->vkGetDeviceProcAddr(
+            device, "vkEnumeratePhysicalDeviceGroupsKHR");
 #endif
 #ifdef VK_EXT_debug_report
-    out->vkCreateDebugReportCallbackEXT = (PFN_vkCreateDebugReportCallbackEXT)vk->vkGetDeviceProcAddr(device, "vkCreateDebugReportCallbackEXT");
-    out->vkDestroyDebugReportCallbackEXT = (PFN_vkDestroyDebugReportCallbackEXT)vk->vkGetDeviceProcAddr(device, "vkDestroyDebugReportCallbackEXT");
-    out->vkDebugReportMessageEXT = (PFN_vkDebugReportMessageEXT)vk->vkGetDeviceProcAddr(device, "vkDebugReportMessageEXT");
+    out->vkCreateDebugReportCallbackEXT =
+        (PFN_vkCreateDebugReportCallbackEXT)vk->vkGetDeviceProcAddr(
+            device, "vkCreateDebugReportCallbackEXT");
+    out->vkDestroyDebugReportCallbackEXT =
+        (PFN_vkDestroyDebugReportCallbackEXT)vk->vkGetDeviceProcAddr(
+            device, "vkDestroyDebugReportCallbackEXT");
+    out->vkDebugReportMessageEXT =
+        (PFN_vkDebugReportMessageEXT)vk->vkGetDeviceProcAddr(device, "vkDebugReportMessageEXT");
 #endif
 #ifdef VK_GGP_stream_descriptor_surface
-    out->vkCreateStreamDescriptorSurfaceGGP = (PFN_vkCreateStreamDescriptorSurfaceGGP)vk->vkGetDeviceProcAddr(device, "vkCreateStreamDescriptorSurfaceGGP");
+    out->vkCreateStreamDescriptorSurfaceGGP =
+        (PFN_vkCreateStreamDescriptorSurfaceGGP)vk->vkGetDeviceProcAddr(
+            device, "vkCreateStreamDescriptorSurfaceGGP");
 #endif
 #ifdef VK_NN_vi_surface
-    out->vkCreateViSurfaceNN = (PFN_vkCreateViSurfaceNN)vk->vkGetDeviceProcAddr(device, "vkCreateViSurfaceNN");
+    out->vkCreateViSurfaceNN =
+        (PFN_vkCreateViSurfaceNN)vk->vkGetDeviceProcAddr(device, "vkCreateViSurfaceNN");
 #endif
 #ifdef VK_MVK_ios_surface
-    out->vkCreateIOSSurfaceMVK = (PFN_vkCreateIOSSurfaceMVK)vk->vkGetDeviceProcAddr(device, "vkCreateIOSSurfaceMVK");
+    out->vkCreateIOSSurfaceMVK =
+        (PFN_vkCreateIOSSurfaceMVK)vk->vkGetDeviceProcAddr(device, "vkCreateIOSSurfaceMVK");
 #endif
 #ifdef VK_MVK_macos_surface
-    out->vkCreateMacOSSurfaceMVK = (PFN_vkCreateMacOSSurfaceMVK)vk->vkGetDeviceProcAddr(device, "vkCreateMacOSSurfaceMVK");
+    out->vkCreateMacOSSurfaceMVK =
+        (PFN_vkCreateMacOSSurfaceMVK)vk->vkGetDeviceProcAddr(device, "vkCreateMacOSSurfaceMVK");
 #endif
 #ifdef VK_EXT_debug_utils
-    out->vkCreateDebugUtilsMessengerEXT = (PFN_vkCreateDebugUtilsMessengerEXT)vk->vkGetDeviceProcAddr(device, "vkCreateDebugUtilsMessengerEXT");
-    out->vkDestroyDebugUtilsMessengerEXT = (PFN_vkDestroyDebugUtilsMessengerEXT)vk->vkGetDeviceProcAddr(device, "vkDestroyDebugUtilsMessengerEXT");
-    out->vkSubmitDebugUtilsMessageEXT = (PFN_vkSubmitDebugUtilsMessageEXT)vk->vkGetDeviceProcAddr(device, "vkSubmitDebugUtilsMessageEXT");
+    out->vkCreateDebugUtilsMessengerEXT =
+        (PFN_vkCreateDebugUtilsMessengerEXT)vk->vkGetDeviceProcAddr(
+            device, "vkCreateDebugUtilsMessengerEXT");
+    out->vkDestroyDebugUtilsMessengerEXT =
+        (PFN_vkDestroyDebugUtilsMessengerEXT)vk->vkGetDeviceProcAddr(
+            device, "vkDestroyDebugUtilsMessengerEXT");
+    out->vkSubmitDebugUtilsMessageEXT = (PFN_vkSubmitDebugUtilsMessageEXT)vk->vkGetDeviceProcAddr(
+        device, "vkSubmitDebugUtilsMessageEXT");
 #endif
 #ifdef VK_FUCHSIA_imagepipe_surface
-    out->vkCreateImagePipeSurfaceFUCHSIA = (PFN_vkCreateImagePipeSurfaceFUCHSIA)vk->vkGetDeviceProcAddr(device, "vkCreateImagePipeSurfaceFUCHSIA");
+    out->vkCreateImagePipeSurfaceFUCHSIA =
+        (PFN_vkCreateImagePipeSurfaceFUCHSIA)vk->vkGetDeviceProcAddr(
+            device, "vkCreateImagePipeSurfaceFUCHSIA");
 #endif
 #ifdef VK_EXT_metal_surface
-    out->vkCreateMetalSurfaceEXT = (PFN_vkCreateMetalSurfaceEXT)vk->vkGetDeviceProcAddr(device, "vkCreateMetalSurfaceEXT");
+    out->vkCreateMetalSurfaceEXT =
+        (PFN_vkCreateMetalSurfaceEXT)vk->vkGetDeviceProcAddr(device, "vkCreateMetalSurfaceEXT");
 #endif
 #ifdef VK_EXT_headless_surface
-    out->vkCreateHeadlessSurfaceEXT = (PFN_vkCreateHeadlessSurfaceEXT)vk->vkGetDeviceProcAddr(device, "vkCreateHeadlessSurfaceEXT");
+    out->vkCreateHeadlessSurfaceEXT = (PFN_vkCreateHeadlessSurfaceEXT)vk->vkGetDeviceProcAddr(
+        device, "vkCreateHeadlessSurfaceEXT");
 #endif
 #ifdef VK_EXT_directfb_surface
-    out->vkCreateDirectFBSurfaceEXT = (PFN_vkCreateDirectFBSurfaceEXT)vk->vkGetDeviceProcAddr(device, "vkCreateDirectFBSurfaceEXT");
+    out->vkCreateDirectFBSurfaceEXT = (PFN_vkCreateDirectFBSurfaceEXT)vk->vkGetDeviceProcAddr(
+        device, "vkCreateDirectFBSurfaceEXT");
 #endif
 #ifdef VK_QNX_screen_surface
-    out->vkCreateScreenSurfaceQNX = (PFN_vkCreateScreenSurfaceQNX)vk->vkGetDeviceProcAddr(device, "vkCreateScreenSurfaceQNX");
+    out->vkCreateScreenSurfaceQNX =
+        (PFN_vkCreateScreenSurfaceQNX)vk->vkGetDeviceProcAddr(device, "vkCreateScreenSurfaceQNX");
 #endif
 #ifdef VK_VERSION_1_0
-    out->vkGetDeviceQueue = (PFN_vkGetDeviceQueue)vk->vkGetDeviceProcAddr(device, "vkGetDeviceQueue");
+    out->vkGetDeviceQueue =
+        (PFN_vkGetDeviceQueue)vk->vkGetDeviceProcAddr(device, "vkGetDeviceQueue");
     out->vkQueueSubmit = (PFN_vkQueueSubmit)vk->vkGetDeviceProcAddr(device, "vkQueueSubmit");
     out->vkQueueWaitIdle = (PFN_vkQueueWaitIdle)vk->vkGetDeviceProcAddr(device, "vkQueueWaitIdle");
-    out->vkDeviceWaitIdle = (PFN_vkDeviceWaitIdle)vk->vkGetDeviceProcAddr(device, "vkDeviceWaitIdle");
-    out->vkAllocateMemory = (PFN_vkAllocateMemory)vk->vkGetDeviceProcAddr(device, "vkAllocateMemory");
+    out->vkDeviceWaitIdle =
+        (PFN_vkDeviceWaitIdle)vk->vkGetDeviceProcAddr(device, "vkDeviceWaitIdle");
+    out->vkAllocateMemory =
+        (PFN_vkAllocateMemory)vk->vkGetDeviceProcAddr(device, "vkAllocateMemory");
     out->vkFreeMemory = (PFN_vkFreeMemory)vk->vkGetDeviceProcAddr(device, "vkFreeMemory");
     out->vkMapMemory = (PFN_vkMapMemory)vk->vkGetDeviceProcAddr(device, "vkMapMemory");
     out->vkUnmapMemory = (PFN_vkUnmapMemory)vk->vkGetDeviceProcAddr(device, "vkUnmapMemory");
-    out->vkFlushMappedMemoryRanges = (PFN_vkFlushMappedMemoryRanges)vk->vkGetDeviceProcAddr(device, "vkFlushMappedMemoryRanges");
-    out->vkInvalidateMappedMemoryRanges = (PFN_vkInvalidateMappedMemoryRanges)vk->vkGetDeviceProcAddr(device, "vkInvalidateMappedMemoryRanges");
-    out->vkGetDeviceMemoryCommitment = (PFN_vkGetDeviceMemoryCommitment)vk->vkGetDeviceProcAddr(device, "vkGetDeviceMemoryCommitment");
-    out->vkBindBufferMemory = (PFN_vkBindBufferMemory)vk->vkGetDeviceProcAddr(device, "vkBindBufferMemory");
-    out->vkBindImageMemory = (PFN_vkBindImageMemory)vk->vkGetDeviceProcAddr(device, "vkBindImageMemory");
-    out->vkGetBufferMemoryRequirements = (PFN_vkGetBufferMemoryRequirements)vk->vkGetDeviceProcAddr(device, "vkGetBufferMemoryRequirements");
-    out->vkGetImageMemoryRequirements = (PFN_vkGetImageMemoryRequirements)vk->vkGetDeviceProcAddr(device, "vkGetImageMemoryRequirements");
-    out->vkGetImageSparseMemoryRequirements = (PFN_vkGetImageSparseMemoryRequirements)vk->vkGetDeviceProcAddr(device, "vkGetImageSparseMemoryRequirements");
-    out->vkQueueBindSparse = (PFN_vkQueueBindSparse)vk->vkGetDeviceProcAddr(device, "vkQueueBindSparse");
+    out->vkFlushMappedMemoryRanges =
+        (PFN_vkFlushMappedMemoryRanges)vk->vkGetDeviceProcAddr(device, "vkFlushMappedMemoryRanges");
+    out->vkInvalidateMappedMemoryRanges =
+        (PFN_vkInvalidateMappedMemoryRanges)vk->vkGetDeviceProcAddr(
+            device, "vkInvalidateMappedMemoryRanges");
+    out->vkGetDeviceMemoryCommitment = (PFN_vkGetDeviceMemoryCommitment)vk->vkGetDeviceProcAddr(
+        device, "vkGetDeviceMemoryCommitment");
+    out->vkBindBufferMemory =
+        (PFN_vkBindBufferMemory)vk->vkGetDeviceProcAddr(device, "vkBindBufferMemory");
+    out->vkBindImageMemory =
+        (PFN_vkBindImageMemory)vk->vkGetDeviceProcAddr(device, "vkBindImageMemory");
+    out->vkGetBufferMemoryRequirements = (PFN_vkGetBufferMemoryRequirements)vk->vkGetDeviceProcAddr(
+        device, "vkGetBufferMemoryRequirements");
+    out->vkGetImageMemoryRequirements = (PFN_vkGetImageMemoryRequirements)vk->vkGetDeviceProcAddr(
+        device, "vkGetImageMemoryRequirements");
+    out->vkGetImageSparseMemoryRequirements =
+        (PFN_vkGetImageSparseMemoryRequirements)vk->vkGetDeviceProcAddr(
+            device, "vkGetImageSparseMemoryRequirements");
+    out->vkQueueBindSparse =
+        (PFN_vkQueueBindSparse)vk->vkGetDeviceProcAddr(device, "vkQueueBindSparse");
     out->vkCreateFence = (PFN_vkCreateFence)vk->vkGetDeviceProcAddr(device, "vkCreateFence");
     out->vkDestroyFence = (PFN_vkDestroyFence)vk->vkGetDeviceProcAddr(device, "vkDestroyFence");
     out->vkResetFences = (PFN_vkResetFences)vk->vkGetDeviceProcAddr(device, "vkResetFences");
-    out->vkGetFenceStatus = (PFN_vkGetFenceStatus)vk->vkGetDeviceProcAddr(device, "vkGetFenceStatus");
+    out->vkGetFenceStatus =
+        (PFN_vkGetFenceStatus)vk->vkGetDeviceProcAddr(device, "vkGetFenceStatus");
     out->vkWaitForFences = (PFN_vkWaitForFences)vk->vkGetDeviceProcAddr(device, "vkWaitForFences");
-    out->vkCreateSemaphore = (PFN_vkCreateSemaphore)vk->vkGetDeviceProcAddr(device, "vkCreateSemaphore");
-    out->vkDestroySemaphore = (PFN_vkDestroySemaphore)vk->vkGetDeviceProcAddr(device, "vkDestroySemaphore");
+    out->vkCreateSemaphore =
+        (PFN_vkCreateSemaphore)vk->vkGetDeviceProcAddr(device, "vkCreateSemaphore");
+    out->vkDestroySemaphore =
+        (PFN_vkDestroySemaphore)vk->vkGetDeviceProcAddr(device, "vkDestroySemaphore");
     out->vkCreateEvent = (PFN_vkCreateEvent)vk->vkGetDeviceProcAddr(device, "vkCreateEvent");
     out->vkDestroyEvent = (PFN_vkDestroyEvent)vk->vkGetDeviceProcAddr(device, "vkDestroyEvent");
-    out->vkGetEventStatus = (PFN_vkGetEventStatus)vk->vkGetDeviceProcAddr(device, "vkGetEventStatus");
+    out->vkGetEventStatus =
+        (PFN_vkGetEventStatus)vk->vkGetDeviceProcAddr(device, "vkGetEventStatus");
     out->vkSetEvent = (PFN_vkSetEvent)vk->vkGetDeviceProcAddr(device, "vkSetEvent");
     out->vkResetEvent = (PFN_vkResetEvent)vk->vkGetDeviceProcAddr(device, "vkResetEvent");
-    out->vkCreateQueryPool = (PFN_vkCreateQueryPool)vk->vkGetDeviceProcAddr(device, "vkCreateQueryPool");
-    out->vkDestroyQueryPool = (PFN_vkDestroyQueryPool)vk->vkGetDeviceProcAddr(device, "vkDestroyQueryPool");
-    out->vkGetQueryPoolResults = (PFN_vkGetQueryPoolResults)vk->vkGetDeviceProcAddr(device, "vkGetQueryPoolResults");
+    out->vkCreateQueryPool =
+        (PFN_vkCreateQueryPool)vk->vkGetDeviceProcAddr(device, "vkCreateQueryPool");
+    out->vkDestroyQueryPool =
+        (PFN_vkDestroyQueryPool)vk->vkGetDeviceProcAddr(device, "vkDestroyQueryPool");
+    out->vkGetQueryPoolResults =
+        (PFN_vkGetQueryPoolResults)vk->vkGetDeviceProcAddr(device, "vkGetQueryPoolResults");
     out->vkCreateBuffer = (PFN_vkCreateBuffer)vk->vkGetDeviceProcAddr(device, "vkCreateBuffer");
     out->vkDestroyBuffer = (PFN_vkDestroyBuffer)vk->vkGetDeviceProcAddr(device, "vkDestroyBuffer");
-    out->vkCreateBufferView = (PFN_vkCreateBufferView)vk->vkGetDeviceProcAddr(device, "vkCreateBufferView");
-    out->vkDestroyBufferView = (PFN_vkDestroyBufferView)vk->vkGetDeviceProcAddr(device, "vkDestroyBufferView");
+    out->vkCreateBufferView =
+        (PFN_vkCreateBufferView)vk->vkGetDeviceProcAddr(device, "vkCreateBufferView");
+    out->vkDestroyBufferView =
+        (PFN_vkDestroyBufferView)vk->vkGetDeviceProcAddr(device, "vkDestroyBufferView");
     out->vkCreateImage = (PFN_vkCreateImage)vk->vkGetDeviceProcAddr(device, "vkCreateImage");
     out->vkDestroyImage = (PFN_vkDestroyImage)vk->vkGetDeviceProcAddr(device, "vkDestroyImage");
-    out->vkGetImageSubresourceLayout = (PFN_vkGetImageSubresourceLayout)vk->vkGetDeviceProcAddr(device, "vkGetImageSubresourceLayout");
-    out->vkCreateImageView = (PFN_vkCreateImageView)vk->vkGetDeviceProcAddr(device, "vkCreateImageView");
-    out->vkDestroyImageView = (PFN_vkDestroyImageView)vk->vkGetDeviceProcAddr(device, "vkDestroyImageView");
-    out->vkCreateShaderModule = (PFN_vkCreateShaderModule)vk->vkGetDeviceProcAddr(device, "vkCreateShaderModule");
-    out->vkDestroyShaderModule = (PFN_vkDestroyShaderModule)vk->vkGetDeviceProcAddr(device, "vkDestroyShaderModule");
-    out->vkCreatePipelineCache = (PFN_vkCreatePipelineCache)vk->vkGetDeviceProcAddr(device, "vkCreatePipelineCache");
-    out->vkDestroyPipelineCache = (PFN_vkDestroyPipelineCache)vk->vkGetDeviceProcAddr(device, "vkDestroyPipelineCache");
-    out->vkGetPipelineCacheData = (PFN_vkGetPipelineCacheData)vk->vkGetDeviceProcAddr(device, "vkGetPipelineCacheData");
-    out->vkMergePipelineCaches = (PFN_vkMergePipelineCaches)vk->vkGetDeviceProcAddr(device, "vkMergePipelineCaches");
-    out->vkCreateGraphicsPipelines = (PFN_vkCreateGraphicsPipelines)vk->vkGetDeviceProcAddr(device, "vkCreateGraphicsPipelines");
-    out->vkCreateComputePipelines = (PFN_vkCreateComputePipelines)vk->vkGetDeviceProcAddr(device, "vkCreateComputePipelines");
-    out->vkDestroyPipeline = (PFN_vkDestroyPipeline)vk->vkGetDeviceProcAddr(device, "vkDestroyPipeline");
-    out->vkCreatePipelineLayout = (PFN_vkCreatePipelineLayout)vk->vkGetDeviceProcAddr(device, "vkCreatePipelineLayout");
-    out->vkDestroyPipelineLayout = (PFN_vkDestroyPipelineLayout)vk->vkGetDeviceProcAddr(device, "vkDestroyPipelineLayout");
+    out->vkGetImageSubresourceLayout = (PFN_vkGetImageSubresourceLayout)vk->vkGetDeviceProcAddr(
+        device, "vkGetImageSubresourceLayout");
+    out->vkCreateImageView =
+        (PFN_vkCreateImageView)vk->vkGetDeviceProcAddr(device, "vkCreateImageView");
+    out->vkDestroyImageView =
+        (PFN_vkDestroyImageView)vk->vkGetDeviceProcAddr(device, "vkDestroyImageView");
+    out->vkCreateShaderModule =
+        (PFN_vkCreateShaderModule)vk->vkGetDeviceProcAddr(device, "vkCreateShaderModule");
+    out->vkDestroyShaderModule =
+        (PFN_vkDestroyShaderModule)vk->vkGetDeviceProcAddr(device, "vkDestroyShaderModule");
+    out->vkCreatePipelineCache =
+        (PFN_vkCreatePipelineCache)vk->vkGetDeviceProcAddr(device, "vkCreatePipelineCache");
+    out->vkDestroyPipelineCache =
+        (PFN_vkDestroyPipelineCache)vk->vkGetDeviceProcAddr(device, "vkDestroyPipelineCache");
+    out->vkGetPipelineCacheData =
+        (PFN_vkGetPipelineCacheData)vk->vkGetDeviceProcAddr(device, "vkGetPipelineCacheData");
+    out->vkMergePipelineCaches =
+        (PFN_vkMergePipelineCaches)vk->vkGetDeviceProcAddr(device, "vkMergePipelineCaches");
+    out->vkCreateGraphicsPipelines =
+        (PFN_vkCreateGraphicsPipelines)vk->vkGetDeviceProcAddr(device, "vkCreateGraphicsPipelines");
+    out->vkCreateComputePipelines =
+        (PFN_vkCreateComputePipelines)vk->vkGetDeviceProcAddr(device, "vkCreateComputePipelines");
+    out->vkDestroyPipeline =
+        (PFN_vkDestroyPipeline)vk->vkGetDeviceProcAddr(device, "vkDestroyPipeline");
+    out->vkCreatePipelineLayout =
+        (PFN_vkCreatePipelineLayout)vk->vkGetDeviceProcAddr(device, "vkCreatePipelineLayout");
+    out->vkDestroyPipelineLayout =
+        (PFN_vkDestroyPipelineLayout)vk->vkGetDeviceProcAddr(device, "vkDestroyPipelineLayout");
     out->vkCreateSampler = (PFN_vkCreateSampler)vk->vkGetDeviceProcAddr(device, "vkCreateSampler");
-    out->vkDestroySampler = (PFN_vkDestroySampler)vk->vkGetDeviceProcAddr(device, "vkDestroySampler");
-    out->vkCreateDescriptorSetLayout = (PFN_vkCreateDescriptorSetLayout)vk->vkGetDeviceProcAddr(device, "vkCreateDescriptorSetLayout");
-    out->vkDestroyDescriptorSetLayout = (PFN_vkDestroyDescriptorSetLayout)vk->vkGetDeviceProcAddr(device, "vkDestroyDescriptorSetLayout");
-    out->vkCreateDescriptorPool = (PFN_vkCreateDescriptorPool)vk->vkGetDeviceProcAddr(device, "vkCreateDescriptorPool");
-    out->vkDestroyDescriptorPool = (PFN_vkDestroyDescriptorPool)vk->vkGetDeviceProcAddr(device, "vkDestroyDescriptorPool");
-    out->vkResetDescriptorPool = (PFN_vkResetDescriptorPool)vk->vkGetDeviceProcAddr(device, "vkResetDescriptorPool");
-    out->vkAllocateDescriptorSets = (PFN_vkAllocateDescriptorSets)vk->vkGetDeviceProcAddr(device, "vkAllocateDescriptorSets");
-    out->vkFreeDescriptorSets = (PFN_vkFreeDescriptorSets)vk->vkGetDeviceProcAddr(device, "vkFreeDescriptorSets");
-    out->vkUpdateDescriptorSets = (PFN_vkUpdateDescriptorSets)vk->vkGetDeviceProcAddr(device, "vkUpdateDescriptorSets");
-    out->vkCreateFramebuffer = (PFN_vkCreateFramebuffer)vk->vkGetDeviceProcAddr(device, "vkCreateFramebuffer");
-    out->vkDestroyFramebuffer = (PFN_vkDestroyFramebuffer)vk->vkGetDeviceProcAddr(device, "vkDestroyFramebuffer");
-    out->vkCreateRenderPass = (PFN_vkCreateRenderPass)vk->vkGetDeviceProcAddr(device, "vkCreateRenderPass");
-    out->vkDestroyRenderPass = (PFN_vkDestroyRenderPass)vk->vkGetDeviceProcAddr(device, "vkDestroyRenderPass");
-    out->vkGetRenderAreaGranularity = (PFN_vkGetRenderAreaGranularity)vk->vkGetDeviceProcAddr(device, "vkGetRenderAreaGranularity");
-    out->vkCreateCommandPool = (PFN_vkCreateCommandPool)vk->vkGetDeviceProcAddr(device, "vkCreateCommandPool");
-    out->vkDestroyCommandPool = (PFN_vkDestroyCommandPool)vk->vkGetDeviceProcAddr(device, "vkDestroyCommandPool");
-    out->vkResetCommandPool = (PFN_vkResetCommandPool)vk->vkGetDeviceProcAddr(device, "vkResetCommandPool");
-    out->vkAllocateCommandBuffers = (PFN_vkAllocateCommandBuffers)vk->vkGetDeviceProcAddr(device, "vkAllocateCommandBuffers");
-    out->vkFreeCommandBuffers = (PFN_vkFreeCommandBuffers)vk->vkGetDeviceProcAddr(device, "vkFreeCommandBuffers");
-    out->vkBeginCommandBuffer = (PFN_vkBeginCommandBuffer)vk->vkGetDeviceProcAddr(device, "vkBeginCommandBuffer");
-    out->vkEndCommandBuffer = (PFN_vkEndCommandBuffer)vk->vkGetDeviceProcAddr(device, "vkEndCommandBuffer");
-    out->vkResetCommandBuffer = (PFN_vkResetCommandBuffer)vk->vkGetDeviceProcAddr(device, "vkResetCommandBuffer");
-    out->vkCmdBindPipeline = (PFN_vkCmdBindPipeline)vk->vkGetDeviceProcAddr(device, "vkCmdBindPipeline");
-    out->vkCmdSetViewport = (PFN_vkCmdSetViewport)vk->vkGetDeviceProcAddr(device, "vkCmdSetViewport");
+    out->vkDestroySampler =
+        (PFN_vkDestroySampler)vk->vkGetDeviceProcAddr(device, "vkDestroySampler");
+    out->vkCreateDescriptorSetLayout = (PFN_vkCreateDescriptorSetLayout)vk->vkGetDeviceProcAddr(
+        device, "vkCreateDescriptorSetLayout");
+    out->vkDestroyDescriptorSetLayout = (PFN_vkDestroyDescriptorSetLayout)vk->vkGetDeviceProcAddr(
+        device, "vkDestroyDescriptorSetLayout");
+    out->vkCreateDescriptorPool =
+        (PFN_vkCreateDescriptorPool)vk->vkGetDeviceProcAddr(device, "vkCreateDescriptorPool");
+    out->vkDestroyDescriptorPool =
+        (PFN_vkDestroyDescriptorPool)vk->vkGetDeviceProcAddr(device, "vkDestroyDescriptorPool");
+    out->vkResetDescriptorPool =
+        (PFN_vkResetDescriptorPool)vk->vkGetDeviceProcAddr(device, "vkResetDescriptorPool");
+    out->vkAllocateDescriptorSets =
+        (PFN_vkAllocateDescriptorSets)vk->vkGetDeviceProcAddr(device, "vkAllocateDescriptorSets");
+    out->vkFreeDescriptorSets =
+        (PFN_vkFreeDescriptorSets)vk->vkGetDeviceProcAddr(device, "vkFreeDescriptorSets");
+    out->vkUpdateDescriptorSets =
+        (PFN_vkUpdateDescriptorSets)vk->vkGetDeviceProcAddr(device, "vkUpdateDescriptorSets");
+    out->vkCreateFramebuffer =
+        (PFN_vkCreateFramebuffer)vk->vkGetDeviceProcAddr(device, "vkCreateFramebuffer");
+    out->vkDestroyFramebuffer =
+        (PFN_vkDestroyFramebuffer)vk->vkGetDeviceProcAddr(device, "vkDestroyFramebuffer");
+    out->vkCreateRenderPass =
+        (PFN_vkCreateRenderPass)vk->vkGetDeviceProcAddr(device, "vkCreateRenderPass");
+    out->vkDestroyRenderPass =
+        (PFN_vkDestroyRenderPass)vk->vkGetDeviceProcAddr(device, "vkDestroyRenderPass");
+    out->vkGetRenderAreaGranularity = (PFN_vkGetRenderAreaGranularity)vk->vkGetDeviceProcAddr(
+        device, "vkGetRenderAreaGranularity");
+    out->vkCreateCommandPool =
+        (PFN_vkCreateCommandPool)vk->vkGetDeviceProcAddr(device, "vkCreateCommandPool");
+    out->vkDestroyCommandPool =
+        (PFN_vkDestroyCommandPool)vk->vkGetDeviceProcAddr(device, "vkDestroyCommandPool");
+    out->vkResetCommandPool =
+        (PFN_vkResetCommandPool)vk->vkGetDeviceProcAddr(device, "vkResetCommandPool");
+    out->vkAllocateCommandBuffers =
+        (PFN_vkAllocateCommandBuffers)vk->vkGetDeviceProcAddr(device, "vkAllocateCommandBuffers");
+    out->vkFreeCommandBuffers =
+        (PFN_vkFreeCommandBuffers)vk->vkGetDeviceProcAddr(device, "vkFreeCommandBuffers");
+    out->vkBeginCommandBuffer =
+        (PFN_vkBeginCommandBuffer)vk->vkGetDeviceProcAddr(device, "vkBeginCommandBuffer");
+    out->vkEndCommandBuffer =
+        (PFN_vkEndCommandBuffer)vk->vkGetDeviceProcAddr(device, "vkEndCommandBuffer");
+    out->vkResetCommandBuffer =
+        (PFN_vkResetCommandBuffer)vk->vkGetDeviceProcAddr(device, "vkResetCommandBuffer");
+    out->vkCmdBindPipeline =
+        (PFN_vkCmdBindPipeline)vk->vkGetDeviceProcAddr(device, "vkCmdBindPipeline");
+    out->vkCmdSetViewport =
+        (PFN_vkCmdSetViewport)vk->vkGetDeviceProcAddr(device, "vkCmdSetViewport");
     out->vkCmdSetScissor = (PFN_vkCmdSetScissor)vk->vkGetDeviceProcAddr(device, "vkCmdSetScissor");
-    out->vkCmdSetLineWidth = (PFN_vkCmdSetLineWidth)vk->vkGetDeviceProcAddr(device, "vkCmdSetLineWidth");
-    out->vkCmdSetDepthBias = (PFN_vkCmdSetDepthBias)vk->vkGetDeviceProcAddr(device, "vkCmdSetDepthBias");
-    out->vkCmdSetBlendConstants = (PFN_vkCmdSetBlendConstants)vk->vkGetDeviceProcAddr(device, "vkCmdSetBlendConstants");
-    out->vkCmdSetDepthBounds = (PFN_vkCmdSetDepthBounds)vk->vkGetDeviceProcAddr(device, "vkCmdSetDepthBounds");
-    out->vkCmdSetStencilCompareMask = (PFN_vkCmdSetStencilCompareMask)vk->vkGetDeviceProcAddr(device, "vkCmdSetStencilCompareMask");
-    out->vkCmdSetStencilWriteMask = (PFN_vkCmdSetStencilWriteMask)vk->vkGetDeviceProcAddr(device, "vkCmdSetStencilWriteMask");
-    out->vkCmdSetStencilReference = (PFN_vkCmdSetStencilReference)vk->vkGetDeviceProcAddr(device, "vkCmdSetStencilReference");
-    out->vkCmdBindDescriptorSets = (PFN_vkCmdBindDescriptorSets)vk->vkGetDeviceProcAddr(device, "vkCmdBindDescriptorSets");
-    out->vkCmdBindIndexBuffer = (PFN_vkCmdBindIndexBuffer)vk->vkGetDeviceProcAddr(device, "vkCmdBindIndexBuffer");
-    out->vkCmdBindVertexBuffers = (PFN_vkCmdBindVertexBuffers)vk->vkGetDeviceProcAddr(device, "vkCmdBindVertexBuffers");
+    out->vkCmdSetLineWidth =
+        (PFN_vkCmdSetLineWidth)vk->vkGetDeviceProcAddr(device, "vkCmdSetLineWidth");
+    out->vkCmdSetDepthBias =
+        (PFN_vkCmdSetDepthBias)vk->vkGetDeviceProcAddr(device, "vkCmdSetDepthBias");
+    out->vkCmdSetBlendConstants =
+        (PFN_vkCmdSetBlendConstants)vk->vkGetDeviceProcAddr(device, "vkCmdSetBlendConstants");
+    out->vkCmdSetDepthBounds =
+        (PFN_vkCmdSetDepthBounds)vk->vkGetDeviceProcAddr(device, "vkCmdSetDepthBounds");
+    out->vkCmdSetStencilCompareMask = (PFN_vkCmdSetStencilCompareMask)vk->vkGetDeviceProcAddr(
+        device, "vkCmdSetStencilCompareMask");
+    out->vkCmdSetStencilWriteMask =
+        (PFN_vkCmdSetStencilWriteMask)vk->vkGetDeviceProcAddr(device, "vkCmdSetStencilWriteMask");
+    out->vkCmdSetStencilReference =
+        (PFN_vkCmdSetStencilReference)vk->vkGetDeviceProcAddr(device, "vkCmdSetStencilReference");
+    out->vkCmdBindDescriptorSets =
+        (PFN_vkCmdBindDescriptorSets)vk->vkGetDeviceProcAddr(device, "vkCmdBindDescriptorSets");
+    out->vkCmdBindIndexBuffer =
+        (PFN_vkCmdBindIndexBuffer)vk->vkGetDeviceProcAddr(device, "vkCmdBindIndexBuffer");
+    out->vkCmdBindVertexBuffers =
+        (PFN_vkCmdBindVertexBuffers)vk->vkGetDeviceProcAddr(device, "vkCmdBindVertexBuffers");
     out->vkCmdDraw = (PFN_vkCmdDraw)vk->vkGetDeviceProcAddr(device, "vkCmdDraw");
-    out->vkCmdDrawIndexed = (PFN_vkCmdDrawIndexed)vk->vkGetDeviceProcAddr(device, "vkCmdDrawIndexed");
-    out->vkCmdDrawIndirect = (PFN_vkCmdDrawIndirect)vk->vkGetDeviceProcAddr(device, "vkCmdDrawIndirect");
-    out->vkCmdDrawIndexedIndirect = (PFN_vkCmdDrawIndexedIndirect)vk->vkGetDeviceProcAddr(device, "vkCmdDrawIndexedIndirect");
+    out->vkCmdDrawIndexed =
+        (PFN_vkCmdDrawIndexed)vk->vkGetDeviceProcAddr(device, "vkCmdDrawIndexed");
+    out->vkCmdDrawIndirect =
+        (PFN_vkCmdDrawIndirect)vk->vkGetDeviceProcAddr(device, "vkCmdDrawIndirect");
+    out->vkCmdDrawIndexedIndirect =
+        (PFN_vkCmdDrawIndexedIndirect)vk->vkGetDeviceProcAddr(device, "vkCmdDrawIndexedIndirect");
     out->vkCmdDispatch = (PFN_vkCmdDispatch)vk->vkGetDeviceProcAddr(device, "vkCmdDispatch");
-    out->vkCmdDispatchIndirect = (PFN_vkCmdDispatchIndirect)vk->vkGetDeviceProcAddr(device, "vkCmdDispatchIndirect");
+    out->vkCmdDispatchIndirect =
+        (PFN_vkCmdDispatchIndirect)vk->vkGetDeviceProcAddr(device, "vkCmdDispatchIndirect");
     out->vkCmdCopyBuffer = (PFN_vkCmdCopyBuffer)vk->vkGetDeviceProcAddr(device, "vkCmdCopyBuffer");
     out->vkCmdCopyImage = (PFN_vkCmdCopyImage)vk->vkGetDeviceProcAddr(device, "vkCmdCopyImage");
     out->vkCmdBlitImage = (PFN_vkCmdBlitImage)vk->vkGetDeviceProcAddr(device, "vkCmdBlitImage");
-    out->vkCmdCopyBufferToImage = (PFN_vkCmdCopyBufferToImage)vk->vkGetDeviceProcAddr(device, "vkCmdCopyBufferToImage");
-    out->vkCmdCopyImageToBuffer = (PFN_vkCmdCopyImageToBuffer)vk->vkGetDeviceProcAddr(device, "vkCmdCopyImageToBuffer");
-    out->vkCmdUpdateBuffer = (PFN_vkCmdUpdateBuffer)vk->vkGetDeviceProcAddr(device, "vkCmdUpdateBuffer");
+    out->vkCmdCopyBufferToImage =
+        (PFN_vkCmdCopyBufferToImage)vk->vkGetDeviceProcAddr(device, "vkCmdCopyBufferToImage");
+    out->vkCmdCopyImageToBuffer =
+        (PFN_vkCmdCopyImageToBuffer)vk->vkGetDeviceProcAddr(device, "vkCmdCopyImageToBuffer");
+    out->vkCmdUpdateBuffer =
+        (PFN_vkCmdUpdateBuffer)vk->vkGetDeviceProcAddr(device, "vkCmdUpdateBuffer");
     out->vkCmdFillBuffer = (PFN_vkCmdFillBuffer)vk->vkGetDeviceProcAddr(device, "vkCmdFillBuffer");
-    out->vkCmdClearColorImage = (PFN_vkCmdClearColorImage)vk->vkGetDeviceProcAddr(device, "vkCmdClearColorImage");
-    out->vkCmdClearDepthStencilImage = (PFN_vkCmdClearDepthStencilImage)vk->vkGetDeviceProcAddr(device, "vkCmdClearDepthStencilImage");
-    out->vkCmdClearAttachments = (PFN_vkCmdClearAttachments)vk->vkGetDeviceProcAddr(device, "vkCmdClearAttachments");
-    out->vkCmdResolveImage = (PFN_vkCmdResolveImage)vk->vkGetDeviceProcAddr(device, "vkCmdResolveImage");
+    out->vkCmdClearColorImage =
+        (PFN_vkCmdClearColorImage)vk->vkGetDeviceProcAddr(device, "vkCmdClearColorImage");
+    out->vkCmdClearDepthStencilImage = (PFN_vkCmdClearDepthStencilImage)vk->vkGetDeviceProcAddr(
+        device, "vkCmdClearDepthStencilImage");
+    out->vkCmdClearAttachments =
+        (PFN_vkCmdClearAttachments)vk->vkGetDeviceProcAddr(device, "vkCmdClearAttachments");
+    out->vkCmdResolveImage =
+        (PFN_vkCmdResolveImage)vk->vkGetDeviceProcAddr(device, "vkCmdResolveImage");
     out->vkCmdSetEvent = (PFN_vkCmdSetEvent)vk->vkGetDeviceProcAddr(device, "vkCmdSetEvent");
     out->vkCmdResetEvent = (PFN_vkCmdResetEvent)vk->vkGetDeviceProcAddr(device, "vkCmdResetEvent");
     out->vkCmdWaitEvents = (PFN_vkCmdWaitEvents)vk->vkGetDeviceProcAddr(device, "vkCmdWaitEvents");
-    out->vkCmdPipelineBarrier = (PFN_vkCmdPipelineBarrier)vk->vkGetDeviceProcAddr(device, "vkCmdPipelineBarrier");
+    out->vkCmdPipelineBarrier =
+        (PFN_vkCmdPipelineBarrier)vk->vkGetDeviceProcAddr(device, "vkCmdPipelineBarrier");
     out->vkCmdBeginQuery = (PFN_vkCmdBeginQuery)vk->vkGetDeviceProcAddr(device, "vkCmdBeginQuery");
     out->vkCmdEndQuery = (PFN_vkCmdEndQuery)vk->vkGetDeviceProcAddr(device, "vkCmdEndQuery");
-    out->vkCmdResetQueryPool = (PFN_vkCmdResetQueryPool)vk->vkGetDeviceProcAddr(device, "vkCmdResetQueryPool");
-    out->vkCmdWriteTimestamp = (PFN_vkCmdWriteTimestamp)vk->vkGetDeviceProcAddr(device, "vkCmdWriteTimestamp");
-    out->vkCmdCopyQueryPoolResults = (PFN_vkCmdCopyQueryPoolResults)vk->vkGetDeviceProcAddr(device, "vkCmdCopyQueryPoolResults");
-    out->vkCmdPushConstants = (PFN_vkCmdPushConstants)vk->vkGetDeviceProcAddr(device, "vkCmdPushConstants");
-    out->vkCmdBeginRenderPass = (PFN_vkCmdBeginRenderPass)vk->vkGetDeviceProcAddr(device, "vkCmdBeginRenderPass");
-    out->vkCmdNextSubpass = (PFN_vkCmdNextSubpass)vk->vkGetDeviceProcAddr(device, "vkCmdNextSubpass");
-    out->vkCmdEndRenderPass = (PFN_vkCmdEndRenderPass)vk->vkGetDeviceProcAddr(device, "vkCmdEndRenderPass");
-    out->vkCmdExecuteCommands = (PFN_vkCmdExecuteCommands)vk->vkGetDeviceProcAddr(device, "vkCmdExecuteCommands");
+    out->vkCmdResetQueryPool =
+        (PFN_vkCmdResetQueryPool)vk->vkGetDeviceProcAddr(device, "vkCmdResetQueryPool");
+    out->vkCmdWriteTimestamp =
+        (PFN_vkCmdWriteTimestamp)vk->vkGetDeviceProcAddr(device, "vkCmdWriteTimestamp");
+    out->vkCmdCopyQueryPoolResults =
+        (PFN_vkCmdCopyQueryPoolResults)vk->vkGetDeviceProcAddr(device, "vkCmdCopyQueryPoolResults");
+    out->vkCmdPushConstants =
+        (PFN_vkCmdPushConstants)vk->vkGetDeviceProcAddr(device, "vkCmdPushConstants");
+    out->vkCmdBeginRenderPass =
+        (PFN_vkCmdBeginRenderPass)vk->vkGetDeviceProcAddr(device, "vkCmdBeginRenderPass");
+    out->vkCmdNextSubpass =
+        (PFN_vkCmdNextSubpass)vk->vkGetDeviceProcAddr(device, "vkCmdNextSubpass");
+    out->vkCmdEndRenderPass =
+        (PFN_vkCmdEndRenderPass)vk->vkGetDeviceProcAddr(device, "vkCmdEndRenderPass");
+    out->vkCmdExecuteCommands =
+        (PFN_vkCmdExecuteCommands)vk->vkGetDeviceProcAddr(device, "vkCmdExecuteCommands");
 #endif
 #ifdef VK_VERSION_1_1
-    out->vkBindBufferMemory2 = (PFN_vkBindBufferMemory2)vk->vkGetDeviceProcAddr(device, "vkBindBufferMemory2");
-    out->vkBindImageMemory2 = (PFN_vkBindImageMemory2)vk->vkGetDeviceProcAddr(device, "vkBindImageMemory2");
-    out->vkGetDeviceGroupPeerMemoryFeatures = (PFN_vkGetDeviceGroupPeerMemoryFeatures)vk->vkGetDeviceProcAddr(device, "vkGetDeviceGroupPeerMemoryFeatures");
-    out->vkCmdSetDeviceMask = (PFN_vkCmdSetDeviceMask)vk->vkGetDeviceProcAddr(device, "vkCmdSetDeviceMask");
-    out->vkCmdDispatchBase = (PFN_vkCmdDispatchBase)vk->vkGetDeviceProcAddr(device, "vkCmdDispatchBase");
-    out->vkGetImageMemoryRequirements2 = (PFN_vkGetImageMemoryRequirements2)vk->vkGetDeviceProcAddr(device, "vkGetImageMemoryRequirements2");
-    out->vkGetBufferMemoryRequirements2 = (PFN_vkGetBufferMemoryRequirements2)vk->vkGetDeviceProcAddr(device, "vkGetBufferMemoryRequirements2");
-    out->vkGetImageSparseMemoryRequirements2 = (PFN_vkGetImageSparseMemoryRequirements2)vk->vkGetDeviceProcAddr(device, "vkGetImageSparseMemoryRequirements2");
-    out->vkTrimCommandPool = (PFN_vkTrimCommandPool)vk->vkGetDeviceProcAddr(device, "vkTrimCommandPool");
-    out->vkGetDeviceQueue2 = (PFN_vkGetDeviceQueue2)vk->vkGetDeviceProcAddr(device, "vkGetDeviceQueue2");
-    out->vkCreateSamplerYcbcrConversion = (PFN_vkCreateSamplerYcbcrConversion)vk->vkGetDeviceProcAddr(device, "vkCreateSamplerYcbcrConversion");
-    out->vkDestroySamplerYcbcrConversion = (PFN_vkDestroySamplerYcbcrConversion)vk->vkGetDeviceProcAddr(device, "vkDestroySamplerYcbcrConversion");
-    out->vkCreateDescriptorUpdateTemplate = (PFN_vkCreateDescriptorUpdateTemplate)vk->vkGetDeviceProcAddr(device, "vkCreateDescriptorUpdateTemplate");
-    out->vkDestroyDescriptorUpdateTemplate = (PFN_vkDestroyDescriptorUpdateTemplate)vk->vkGetDeviceProcAddr(device, "vkDestroyDescriptorUpdateTemplate");
-    out->vkUpdateDescriptorSetWithTemplate = (PFN_vkUpdateDescriptorSetWithTemplate)vk->vkGetDeviceProcAddr(device, "vkUpdateDescriptorSetWithTemplate");
-    out->vkGetDescriptorSetLayoutSupport = (PFN_vkGetDescriptorSetLayoutSupport)vk->vkGetDeviceProcAddr(device, "vkGetDescriptorSetLayoutSupport");
+    out->vkBindBufferMemory2 =
+        (PFN_vkBindBufferMemory2)vk->vkGetDeviceProcAddr(device, "vkBindBufferMemory2");
+    out->vkBindImageMemory2 =
+        (PFN_vkBindImageMemory2)vk->vkGetDeviceProcAddr(device, "vkBindImageMemory2");
+    out->vkGetDeviceGroupPeerMemoryFeatures =
+        (PFN_vkGetDeviceGroupPeerMemoryFeatures)vk->vkGetDeviceProcAddr(
+            device, "vkGetDeviceGroupPeerMemoryFeatures");
+    out->vkCmdSetDeviceMask =
+        (PFN_vkCmdSetDeviceMask)vk->vkGetDeviceProcAddr(device, "vkCmdSetDeviceMask");
+    out->vkCmdDispatchBase =
+        (PFN_vkCmdDispatchBase)vk->vkGetDeviceProcAddr(device, "vkCmdDispatchBase");
+    out->vkGetImageMemoryRequirements2 = (PFN_vkGetImageMemoryRequirements2)vk->vkGetDeviceProcAddr(
+        device, "vkGetImageMemoryRequirements2");
+    out->vkGetBufferMemoryRequirements2 =
+        (PFN_vkGetBufferMemoryRequirements2)vk->vkGetDeviceProcAddr(
+            device, "vkGetBufferMemoryRequirements2");
+    out->vkGetImageSparseMemoryRequirements2 =
+        (PFN_vkGetImageSparseMemoryRequirements2)vk->vkGetDeviceProcAddr(
+            device, "vkGetImageSparseMemoryRequirements2");
+    out->vkTrimCommandPool =
+        (PFN_vkTrimCommandPool)vk->vkGetDeviceProcAddr(device, "vkTrimCommandPool");
+    out->vkGetDeviceQueue2 =
+        (PFN_vkGetDeviceQueue2)vk->vkGetDeviceProcAddr(device, "vkGetDeviceQueue2");
+    out->vkCreateSamplerYcbcrConversion =
+        (PFN_vkCreateSamplerYcbcrConversion)vk->vkGetDeviceProcAddr(
+            device, "vkCreateSamplerYcbcrConversion");
+    out->vkDestroySamplerYcbcrConversion =
+        (PFN_vkDestroySamplerYcbcrConversion)vk->vkGetDeviceProcAddr(
+            device, "vkDestroySamplerYcbcrConversion");
+    out->vkCreateDescriptorUpdateTemplate =
+        (PFN_vkCreateDescriptorUpdateTemplate)vk->vkGetDeviceProcAddr(
+            device, "vkCreateDescriptorUpdateTemplate");
+    out->vkDestroyDescriptorUpdateTemplate =
+        (PFN_vkDestroyDescriptorUpdateTemplate)vk->vkGetDeviceProcAddr(
+            device, "vkDestroyDescriptorUpdateTemplate");
+    out->vkUpdateDescriptorSetWithTemplate =
+        (PFN_vkUpdateDescriptorSetWithTemplate)vk->vkGetDeviceProcAddr(
+            device, "vkUpdateDescriptorSetWithTemplate");
+    out->vkGetDescriptorSetLayoutSupport =
+        (PFN_vkGetDescriptorSetLayoutSupport)vk->vkGetDeviceProcAddr(
+            device, "vkGetDescriptorSetLayoutSupport");
 #endif
 #ifdef VK_VERSION_1_2
-    out->vkCmdDrawIndirectCount = (PFN_vkCmdDrawIndirectCount)vk->vkGetDeviceProcAddr(device, "vkCmdDrawIndirectCount");
-    out->vkCmdDrawIndexedIndirectCount = (PFN_vkCmdDrawIndexedIndirectCount)vk->vkGetDeviceProcAddr(device, "vkCmdDrawIndexedIndirectCount");
-    out->vkCreateRenderPass2 = (PFN_vkCreateRenderPass2)vk->vkGetDeviceProcAddr(device, "vkCreateRenderPass2");
-    out->vkCmdBeginRenderPass2 = (PFN_vkCmdBeginRenderPass2)vk->vkGetDeviceProcAddr(device, "vkCmdBeginRenderPass2");
-    out->vkCmdNextSubpass2 = (PFN_vkCmdNextSubpass2)vk->vkGetDeviceProcAddr(device, "vkCmdNextSubpass2");
-    out->vkCmdEndRenderPass2 = (PFN_vkCmdEndRenderPass2)vk->vkGetDeviceProcAddr(device, "vkCmdEndRenderPass2");
-    out->vkResetQueryPool = (PFN_vkResetQueryPool)vk->vkGetDeviceProcAddr(device, "vkResetQueryPool");
-    out->vkGetSemaphoreCounterValue = (PFN_vkGetSemaphoreCounterValue)vk->vkGetDeviceProcAddr(device, "vkGetSemaphoreCounterValue");
-    out->vkWaitSemaphores = (PFN_vkWaitSemaphores)vk->vkGetDeviceProcAddr(device, "vkWaitSemaphores");
-    out->vkSignalSemaphore = (PFN_vkSignalSemaphore)vk->vkGetDeviceProcAddr(device, "vkSignalSemaphore");
-    out->vkGetBufferDeviceAddress = (PFN_vkGetBufferDeviceAddress)vk->vkGetDeviceProcAddr(device, "vkGetBufferDeviceAddress");
-    out->vkGetBufferOpaqueCaptureAddress = (PFN_vkGetBufferOpaqueCaptureAddress)vk->vkGetDeviceProcAddr(device, "vkGetBufferOpaqueCaptureAddress");
-    out->vkGetDeviceMemoryOpaqueCaptureAddress = (PFN_vkGetDeviceMemoryOpaqueCaptureAddress)vk->vkGetDeviceProcAddr(device, "vkGetDeviceMemoryOpaqueCaptureAddress");
+    out->vkCmdDrawIndirectCount =
+        (PFN_vkCmdDrawIndirectCount)vk->vkGetDeviceProcAddr(device, "vkCmdDrawIndirectCount");
+    out->vkCmdDrawIndexedIndirectCount = (PFN_vkCmdDrawIndexedIndirectCount)vk->vkGetDeviceProcAddr(
+        device, "vkCmdDrawIndexedIndirectCount");
+    out->vkCreateRenderPass2 =
+        (PFN_vkCreateRenderPass2)vk->vkGetDeviceProcAddr(device, "vkCreateRenderPass2");
+    out->vkCmdBeginRenderPass2 =
+        (PFN_vkCmdBeginRenderPass2)vk->vkGetDeviceProcAddr(device, "vkCmdBeginRenderPass2");
+    out->vkCmdNextSubpass2 =
+        (PFN_vkCmdNextSubpass2)vk->vkGetDeviceProcAddr(device, "vkCmdNextSubpass2");
+    out->vkCmdEndRenderPass2 =
+        (PFN_vkCmdEndRenderPass2)vk->vkGetDeviceProcAddr(device, "vkCmdEndRenderPass2");
+    out->vkResetQueryPool =
+        (PFN_vkResetQueryPool)vk->vkGetDeviceProcAddr(device, "vkResetQueryPool");
+    out->vkGetSemaphoreCounterValue = (PFN_vkGetSemaphoreCounterValue)vk->vkGetDeviceProcAddr(
+        device, "vkGetSemaphoreCounterValue");
+    out->vkWaitSemaphores =
+        (PFN_vkWaitSemaphores)vk->vkGetDeviceProcAddr(device, "vkWaitSemaphores");
+    out->vkSignalSemaphore =
+        (PFN_vkSignalSemaphore)vk->vkGetDeviceProcAddr(device, "vkSignalSemaphore");
+    out->vkGetBufferDeviceAddress =
+        (PFN_vkGetBufferDeviceAddress)vk->vkGetDeviceProcAddr(device, "vkGetBufferDeviceAddress");
+    out->vkGetBufferOpaqueCaptureAddress =
+        (PFN_vkGetBufferOpaqueCaptureAddress)vk->vkGetDeviceProcAddr(
+            device, "vkGetBufferOpaqueCaptureAddress");
+    out->vkGetDeviceMemoryOpaqueCaptureAddress =
+        (PFN_vkGetDeviceMemoryOpaqueCaptureAddress)vk->vkGetDeviceProcAddr(
+            device, "vkGetDeviceMemoryOpaqueCaptureAddress");
 #endif
 #ifdef VK_KHR_surface
-    out->vkGetPhysicalDeviceSurfaceSupportKHR = (PFN_vkGetPhysicalDeviceSurfaceSupportKHR)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceSurfaceSupportKHR");
-    out->vkGetPhysicalDeviceSurfaceCapabilitiesKHR = (PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR");
-    out->vkGetPhysicalDeviceSurfaceFormatsKHR = (PFN_vkGetPhysicalDeviceSurfaceFormatsKHR)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceSurfaceFormatsKHR");
-    out->vkGetPhysicalDeviceSurfacePresentModesKHR = (PFN_vkGetPhysicalDeviceSurfacePresentModesKHR)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceSurfacePresentModesKHR");
+    out->vkGetPhysicalDeviceSurfaceSupportKHR =
+        (PFN_vkGetPhysicalDeviceSurfaceSupportKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceSurfaceSupportKHR");
+    out->vkGetPhysicalDeviceSurfaceCapabilitiesKHR =
+        (PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR");
+    out->vkGetPhysicalDeviceSurfaceFormatsKHR =
+        (PFN_vkGetPhysicalDeviceSurfaceFormatsKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceSurfaceFormatsKHR");
+    out->vkGetPhysicalDeviceSurfacePresentModesKHR =
+        (PFN_vkGetPhysicalDeviceSurfacePresentModesKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceSurfacePresentModesKHR");
 #endif
 #ifdef VK_KHR_swapchain
-    out->vkGetDeviceGroupPresentCapabilitiesKHR = (PFN_vkGetDeviceGroupPresentCapabilitiesKHR)vk->vkGetDeviceProcAddr(device, "vkGetDeviceGroupPresentCapabilitiesKHR");
-    out->vkGetDeviceGroupSurfacePresentModesKHR = (PFN_vkGetDeviceGroupSurfacePresentModesKHR)vk->vkGetDeviceProcAddr(device, "vkGetDeviceGroupSurfacePresentModesKHR");
-    out->vkGetPhysicalDevicePresentRectanglesKHR = (PFN_vkGetPhysicalDevicePresentRectanglesKHR)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDevicePresentRectanglesKHR");
-    out->vkAcquireNextImage2KHR = (PFN_vkAcquireNextImage2KHR)vk->vkGetDeviceProcAddr(device, "vkAcquireNextImage2KHR");
+    out->vkGetDeviceGroupPresentCapabilitiesKHR =
+        (PFN_vkGetDeviceGroupPresentCapabilitiesKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetDeviceGroupPresentCapabilitiesKHR");
+    out->vkGetDeviceGroupSurfacePresentModesKHR =
+        (PFN_vkGetDeviceGroupSurfacePresentModesKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetDeviceGroupSurfacePresentModesKHR");
+    out->vkGetPhysicalDevicePresentRectanglesKHR =
+        (PFN_vkGetPhysicalDevicePresentRectanglesKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDevicePresentRectanglesKHR");
+    out->vkAcquireNextImage2KHR =
+        (PFN_vkAcquireNextImage2KHR)vk->vkGetDeviceProcAddr(device, "vkAcquireNextImage2KHR");
 #endif
 #ifdef VK_KHR_display
-    out->vkGetPhysicalDeviceDisplayPropertiesKHR = (PFN_vkGetPhysicalDeviceDisplayPropertiesKHR)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceDisplayPropertiesKHR");
-    out->vkGetPhysicalDeviceDisplayPlanePropertiesKHR = (PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR");
-    out->vkGetDisplayPlaneSupportedDisplaysKHR = (PFN_vkGetDisplayPlaneSupportedDisplaysKHR)vk->vkGetDeviceProcAddr(device, "vkGetDisplayPlaneSupportedDisplaysKHR");
-    out->vkGetDisplayModePropertiesKHR = (PFN_vkGetDisplayModePropertiesKHR)vk->vkGetDeviceProcAddr(device, "vkGetDisplayModePropertiesKHR");
-    out->vkCreateDisplayModeKHR = (PFN_vkCreateDisplayModeKHR)vk->vkGetDeviceProcAddr(device, "vkCreateDisplayModeKHR");
-    out->vkGetDisplayPlaneCapabilitiesKHR = (PFN_vkGetDisplayPlaneCapabilitiesKHR)vk->vkGetDeviceProcAddr(device, "vkGetDisplayPlaneCapabilitiesKHR");
+    out->vkGetPhysicalDeviceDisplayPropertiesKHR =
+        (PFN_vkGetPhysicalDeviceDisplayPropertiesKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceDisplayPropertiesKHR");
+    out->vkGetPhysicalDeviceDisplayPlanePropertiesKHR =
+        (PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR");
+    out->vkGetDisplayPlaneSupportedDisplaysKHR =
+        (PFN_vkGetDisplayPlaneSupportedDisplaysKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetDisplayPlaneSupportedDisplaysKHR");
+    out->vkGetDisplayModePropertiesKHR = (PFN_vkGetDisplayModePropertiesKHR)vk->vkGetDeviceProcAddr(
+        device, "vkGetDisplayModePropertiesKHR");
+    out->vkCreateDisplayModeKHR =
+        (PFN_vkCreateDisplayModeKHR)vk->vkGetDeviceProcAddr(device, "vkCreateDisplayModeKHR");
+    out->vkGetDisplayPlaneCapabilitiesKHR =
+        (PFN_vkGetDisplayPlaneCapabilitiesKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetDisplayPlaneCapabilitiesKHR");
 #endif
 #ifdef VK_KHR_display_swapchain
-    out->vkCreateSharedSwapchainsKHR = (PFN_vkCreateSharedSwapchainsKHR)vk->vkGetDeviceProcAddr(device, "vkCreateSharedSwapchainsKHR");
+    out->vkCreateSharedSwapchainsKHR = (PFN_vkCreateSharedSwapchainsKHR)vk->vkGetDeviceProcAddr(
+        device, "vkCreateSharedSwapchainsKHR");
 #endif
 #ifdef VK_KHR_wayland_surface
-    out->vkGetPhysicalDeviceWaylandPresentationSupportKHR = (PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceWaylandPresentationSupportKHR");
+    out->vkGetPhysicalDeviceWaylandPresentationSupportKHR =
+        (PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceWaylandPresentationSupportKHR");
 #endif
 #ifdef VK_KHR_video_queue
-    out->vkGetPhysicalDeviceVideoCapabilitiesKHR = (PFN_vkGetPhysicalDeviceVideoCapabilitiesKHR)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceVideoCapabilitiesKHR");
-    out->vkGetPhysicalDeviceVideoFormatPropertiesKHR = (PFN_vkGetPhysicalDeviceVideoFormatPropertiesKHR)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceVideoFormatPropertiesKHR");
-    out->vkCreateVideoSessionKHR = (PFN_vkCreateVideoSessionKHR)vk->vkGetDeviceProcAddr(device, "vkCreateVideoSessionKHR");
-    out->vkDestroyVideoSessionKHR = (PFN_vkDestroyVideoSessionKHR)vk->vkGetDeviceProcAddr(device, "vkDestroyVideoSessionKHR");
-    out->vkGetVideoSessionMemoryRequirementsKHR = (PFN_vkGetVideoSessionMemoryRequirementsKHR)vk->vkGetDeviceProcAddr(device, "vkGetVideoSessionMemoryRequirementsKHR");
-    out->vkBindVideoSessionMemoryKHR = (PFN_vkBindVideoSessionMemoryKHR)vk->vkGetDeviceProcAddr(device, "vkBindVideoSessionMemoryKHR");
-    out->vkCreateVideoSessionParametersKHR = (PFN_vkCreateVideoSessionParametersKHR)vk->vkGetDeviceProcAddr(device, "vkCreateVideoSessionParametersKHR");
-    out->vkUpdateVideoSessionParametersKHR = (PFN_vkUpdateVideoSessionParametersKHR)vk->vkGetDeviceProcAddr(device, "vkUpdateVideoSessionParametersKHR");
-    out->vkDestroyVideoSessionParametersKHR = (PFN_vkDestroyVideoSessionParametersKHR)vk->vkGetDeviceProcAddr(device, "vkDestroyVideoSessionParametersKHR");
-    out->vkCmdBeginVideoCodingKHR = (PFN_vkCmdBeginVideoCodingKHR)vk->vkGetDeviceProcAddr(device, "vkCmdBeginVideoCodingKHR");
-    out->vkCmdEndVideoCodingKHR = (PFN_vkCmdEndVideoCodingKHR)vk->vkGetDeviceProcAddr(device, "vkCmdEndVideoCodingKHR");
-    out->vkCmdControlVideoCodingKHR = (PFN_vkCmdControlVideoCodingKHR)vk->vkGetDeviceProcAddr(device, "vkCmdControlVideoCodingKHR");
+    out->vkGetPhysicalDeviceVideoCapabilitiesKHR =
+        (PFN_vkGetPhysicalDeviceVideoCapabilitiesKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceVideoCapabilitiesKHR");
+    out->vkGetPhysicalDeviceVideoFormatPropertiesKHR =
+        (PFN_vkGetPhysicalDeviceVideoFormatPropertiesKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceVideoFormatPropertiesKHR");
+    out->vkCreateVideoSessionKHR =
+        (PFN_vkCreateVideoSessionKHR)vk->vkGetDeviceProcAddr(device, "vkCreateVideoSessionKHR");
+    out->vkDestroyVideoSessionKHR =
+        (PFN_vkDestroyVideoSessionKHR)vk->vkGetDeviceProcAddr(device, "vkDestroyVideoSessionKHR");
+    out->vkGetVideoSessionMemoryRequirementsKHR =
+        (PFN_vkGetVideoSessionMemoryRequirementsKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetVideoSessionMemoryRequirementsKHR");
+    out->vkBindVideoSessionMemoryKHR = (PFN_vkBindVideoSessionMemoryKHR)vk->vkGetDeviceProcAddr(
+        device, "vkBindVideoSessionMemoryKHR");
+    out->vkCreateVideoSessionParametersKHR =
+        (PFN_vkCreateVideoSessionParametersKHR)vk->vkGetDeviceProcAddr(
+            device, "vkCreateVideoSessionParametersKHR");
+    out->vkUpdateVideoSessionParametersKHR =
+        (PFN_vkUpdateVideoSessionParametersKHR)vk->vkGetDeviceProcAddr(
+            device, "vkUpdateVideoSessionParametersKHR");
+    out->vkDestroyVideoSessionParametersKHR =
+        (PFN_vkDestroyVideoSessionParametersKHR)vk->vkGetDeviceProcAddr(
+            device, "vkDestroyVideoSessionParametersKHR");
+    out->vkCmdBeginVideoCodingKHR =
+        (PFN_vkCmdBeginVideoCodingKHR)vk->vkGetDeviceProcAddr(device, "vkCmdBeginVideoCodingKHR");
+    out->vkCmdEndVideoCodingKHR =
+        (PFN_vkCmdEndVideoCodingKHR)vk->vkGetDeviceProcAddr(device, "vkCmdEndVideoCodingKHR");
+    out->vkCmdControlVideoCodingKHR = (PFN_vkCmdControlVideoCodingKHR)vk->vkGetDeviceProcAddr(
+        device, "vkCmdControlVideoCodingKHR");
 #endif
 #ifdef VK_KHR_video_decode_queue
-    out->vkCmdDecodeVideoKHR = (PFN_vkCmdDecodeVideoKHR)vk->vkGetDeviceProcAddr(device, "vkCmdDecodeVideoKHR");
+    out->vkCmdDecodeVideoKHR =
+        (PFN_vkCmdDecodeVideoKHR)vk->vkGetDeviceProcAddr(device, "vkCmdDecodeVideoKHR");
 #endif
 #ifdef VK_KHR_dynamic_rendering
-    out->vkCmdBeginRenderingKHR = (PFN_vkCmdBeginRenderingKHR)vk->vkGetDeviceProcAddr(device, "vkCmdBeginRenderingKHR");
-    out->vkCmdEndRenderingKHR = (PFN_vkCmdEndRenderingKHR)vk->vkGetDeviceProcAddr(device, "vkCmdEndRenderingKHR");
+    out->vkCmdBeginRenderingKHR =
+        (PFN_vkCmdBeginRenderingKHR)vk->vkGetDeviceProcAddr(device, "vkCmdBeginRenderingKHR");
+    out->vkCmdEndRenderingKHR =
+        (PFN_vkCmdEndRenderingKHR)vk->vkGetDeviceProcAddr(device, "vkCmdEndRenderingKHR");
 #endif
 #ifdef VK_KHR_get_physical_device_properties2
-    out->vkGetPhysicalDeviceFeatures2KHR = (PFN_vkGetPhysicalDeviceFeatures2KHR)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceFeatures2KHR");
-    out->vkGetPhysicalDeviceProperties2KHR = (PFN_vkGetPhysicalDeviceProperties2KHR)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceProperties2KHR");
-    out->vkGetPhysicalDeviceFormatProperties2KHR = (PFN_vkGetPhysicalDeviceFormatProperties2KHR)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceFormatProperties2KHR");
-    out->vkGetPhysicalDeviceImageFormatProperties2KHR = (PFN_vkGetPhysicalDeviceImageFormatProperties2KHR)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceImageFormatProperties2KHR");
-    out->vkGetPhysicalDeviceQueueFamilyProperties2KHR = (PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceQueueFamilyProperties2KHR");
-    out->vkGetPhysicalDeviceMemoryProperties2KHR = (PFN_vkGetPhysicalDeviceMemoryProperties2KHR)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceMemoryProperties2KHR");
-    out->vkGetPhysicalDeviceSparseImageFormatProperties2KHR = (PFN_vkGetPhysicalDeviceSparseImageFormatProperties2KHR)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceSparseImageFormatProperties2KHR");
+    out->vkGetPhysicalDeviceFeatures2KHR =
+        (PFN_vkGetPhysicalDeviceFeatures2KHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceFeatures2KHR");
+    out->vkGetPhysicalDeviceProperties2KHR =
+        (PFN_vkGetPhysicalDeviceProperties2KHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceProperties2KHR");
+    out->vkGetPhysicalDeviceFormatProperties2KHR =
+        (PFN_vkGetPhysicalDeviceFormatProperties2KHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceFormatProperties2KHR");
+    out->vkGetPhysicalDeviceImageFormatProperties2KHR =
+        (PFN_vkGetPhysicalDeviceImageFormatProperties2KHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceImageFormatProperties2KHR");
+    out->vkGetPhysicalDeviceQueueFamilyProperties2KHR =
+        (PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceQueueFamilyProperties2KHR");
+    out->vkGetPhysicalDeviceMemoryProperties2KHR =
+        (PFN_vkGetPhysicalDeviceMemoryProperties2KHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceMemoryProperties2KHR");
+    out->vkGetPhysicalDeviceSparseImageFormatProperties2KHR =
+        (PFN_vkGetPhysicalDeviceSparseImageFormatProperties2KHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceSparseImageFormatProperties2KHR");
 #endif
 #ifdef VK_KHR_device_group
-    out->vkGetDeviceGroupPeerMemoryFeaturesKHR = (PFN_vkGetDeviceGroupPeerMemoryFeaturesKHR)vk->vkGetDeviceProcAddr(device, "vkGetDeviceGroupPeerMemoryFeaturesKHR");
-    out->vkCmdSetDeviceMaskKHR = (PFN_vkCmdSetDeviceMaskKHR)vk->vkGetDeviceProcAddr(device, "vkCmdSetDeviceMaskKHR");
-    out->vkCmdDispatchBaseKHR = (PFN_vkCmdDispatchBaseKHR)vk->vkGetDeviceProcAddr(device, "vkCmdDispatchBaseKHR");
+    out->vkGetDeviceGroupPeerMemoryFeaturesKHR =
+        (PFN_vkGetDeviceGroupPeerMemoryFeaturesKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetDeviceGroupPeerMemoryFeaturesKHR");
+    out->vkCmdSetDeviceMaskKHR =
+        (PFN_vkCmdSetDeviceMaskKHR)vk->vkGetDeviceProcAddr(device, "vkCmdSetDeviceMaskKHR");
+    out->vkCmdDispatchBaseKHR =
+        (PFN_vkCmdDispatchBaseKHR)vk->vkGetDeviceProcAddr(device, "vkCmdDispatchBaseKHR");
 #endif
 #ifdef VK_KHR_maintenance1
-    out->vkTrimCommandPoolKHR = (PFN_vkTrimCommandPoolKHR)vk->vkGetDeviceProcAddr(device, "vkTrimCommandPoolKHR");
+    out->vkTrimCommandPoolKHR =
+        (PFN_vkTrimCommandPoolKHR)vk->vkGetDeviceProcAddr(device, "vkTrimCommandPoolKHR");
 #endif
 #ifdef VK_KHR_external_memory_capabilities
-    out->vkGetPhysicalDeviceExternalBufferPropertiesKHR = (PFN_vkGetPhysicalDeviceExternalBufferPropertiesKHR)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceExternalBufferPropertiesKHR");
+    out->vkGetPhysicalDeviceExternalBufferPropertiesKHR =
+        (PFN_vkGetPhysicalDeviceExternalBufferPropertiesKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceExternalBufferPropertiesKHR");
 #endif
 #ifdef VK_KHR_external_memory_win32
-    out->vkGetMemoryWin32HandleKHR = (PFN_vkGetMemoryWin32HandleKHR)vk->vkGetDeviceProcAddr(device, "vkGetMemoryWin32HandleKHR");
-    out->vkGetMemoryWin32HandlePropertiesKHR = (PFN_vkGetMemoryWin32HandlePropertiesKHR)vk->vkGetDeviceProcAddr(device, "vkGetMemoryWin32HandlePropertiesKHR");
+    out->vkGetMemoryWin32HandleKHR =
+        (PFN_vkGetMemoryWin32HandleKHR)vk->vkGetDeviceProcAddr(device, "vkGetMemoryWin32HandleKHR");
+    out->vkGetMemoryWin32HandlePropertiesKHR =
+        (PFN_vkGetMemoryWin32HandlePropertiesKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetMemoryWin32HandlePropertiesKHR");
 #endif
 #ifdef VK_KHR_external_memory_fd
-    out->vkGetMemoryFdKHR = (PFN_vkGetMemoryFdKHR)vk->vkGetDeviceProcAddr(device, "vkGetMemoryFdKHR");
-    out->vkGetMemoryFdPropertiesKHR = (PFN_vkGetMemoryFdPropertiesKHR)vk->vkGetDeviceProcAddr(device, "vkGetMemoryFdPropertiesKHR");
+    out->vkGetMemoryFdKHR =
+        (PFN_vkGetMemoryFdKHR)vk->vkGetDeviceProcAddr(device, "vkGetMemoryFdKHR");
+    out->vkGetMemoryFdPropertiesKHR = (PFN_vkGetMemoryFdPropertiesKHR)vk->vkGetDeviceProcAddr(
+        device, "vkGetMemoryFdPropertiesKHR");
 #endif
 #ifdef VK_KHR_external_semaphore_capabilities
-    out->vkGetPhysicalDeviceExternalSemaphorePropertiesKHR = (PFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceExternalSemaphorePropertiesKHR");
+    out->vkGetPhysicalDeviceExternalSemaphorePropertiesKHR =
+        (PFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceExternalSemaphorePropertiesKHR");
 #endif
 #ifdef VK_KHR_external_semaphore_win32
-    out->vkImportSemaphoreWin32HandleKHR = (PFN_vkImportSemaphoreWin32HandleKHR)vk->vkGetDeviceProcAddr(device, "vkImportSemaphoreWin32HandleKHR");
-    out->vkGetSemaphoreWin32HandleKHR = (PFN_vkGetSemaphoreWin32HandleKHR)vk->vkGetDeviceProcAddr(device, "vkGetSemaphoreWin32HandleKHR");
+    out->vkImportSemaphoreWin32HandleKHR =
+        (PFN_vkImportSemaphoreWin32HandleKHR)vk->vkGetDeviceProcAddr(
+            device, "vkImportSemaphoreWin32HandleKHR");
+    out->vkGetSemaphoreWin32HandleKHR = (PFN_vkGetSemaphoreWin32HandleKHR)vk->vkGetDeviceProcAddr(
+        device, "vkGetSemaphoreWin32HandleKHR");
 #endif
 #ifdef VK_KHR_external_semaphore_fd
-    out->vkImportSemaphoreFdKHR = (PFN_vkImportSemaphoreFdKHR)vk->vkGetDeviceProcAddr(device, "vkImportSemaphoreFdKHR");
-    out->vkGetSemaphoreFdKHR = (PFN_vkGetSemaphoreFdKHR)vk->vkGetDeviceProcAddr(device, "vkGetSemaphoreFdKHR");
+    out->vkImportSemaphoreFdKHR =
+        (PFN_vkImportSemaphoreFdKHR)vk->vkGetDeviceProcAddr(device, "vkImportSemaphoreFdKHR");
+    out->vkGetSemaphoreFdKHR =
+        (PFN_vkGetSemaphoreFdKHR)vk->vkGetDeviceProcAddr(device, "vkGetSemaphoreFdKHR");
 #endif
 #ifdef VK_KHR_push_descriptor
-    out->vkCmdPushDescriptorSetKHR = (PFN_vkCmdPushDescriptorSetKHR)vk->vkGetDeviceProcAddr(device, "vkCmdPushDescriptorSetKHR");
-    out->vkCmdPushDescriptorSetWithTemplateKHR = (PFN_vkCmdPushDescriptorSetWithTemplateKHR)vk->vkGetDeviceProcAddr(device, "vkCmdPushDescriptorSetWithTemplateKHR");
+    out->vkCmdPushDescriptorSetKHR =
+        (PFN_vkCmdPushDescriptorSetKHR)vk->vkGetDeviceProcAddr(device, "vkCmdPushDescriptorSetKHR");
+    out->vkCmdPushDescriptorSetWithTemplateKHR =
+        (PFN_vkCmdPushDescriptorSetWithTemplateKHR)vk->vkGetDeviceProcAddr(
+            device, "vkCmdPushDescriptorSetWithTemplateKHR");
 #endif
 #ifdef VK_KHR_descriptor_update_template
-    out->vkCreateDescriptorUpdateTemplateKHR = (PFN_vkCreateDescriptorUpdateTemplateKHR)vk->vkGetDeviceProcAddr(device, "vkCreateDescriptorUpdateTemplateKHR");
-    out->vkDestroyDescriptorUpdateTemplateKHR = (PFN_vkDestroyDescriptorUpdateTemplateKHR)vk->vkGetDeviceProcAddr(device, "vkDestroyDescriptorUpdateTemplateKHR");
-    out->vkUpdateDescriptorSetWithTemplateKHR = (PFN_vkUpdateDescriptorSetWithTemplateKHR)vk->vkGetDeviceProcAddr(device, "vkUpdateDescriptorSetWithTemplateKHR");
+    out->vkCreateDescriptorUpdateTemplateKHR =
+        (PFN_vkCreateDescriptorUpdateTemplateKHR)vk->vkGetDeviceProcAddr(
+            device, "vkCreateDescriptorUpdateTemplateKHR");
+    out->vkDestroyDescriptorUpdateTemplateKHR =
+        (PFN_vkDestroyDescriptorUpdateTemplateKHR)vk->vkGetDeviceProcAddr(
+            device, "vkDestroyDescriptorUpdateTemplateKHR");
+    out->vkUpdateDescriptorSetWithTemplateKHR =
+        (PFN_vkUpdateDescriptorSetWithTemplateKHR)vk->vkGetDeviceProcAddr(
+            device, "vkUpdateDescriptorSetWithTemplateKHR");
 #endif
 #ifdef VK_KHR_create_renderpass2
-    out->vkCreateRenderPass2KHR = (PFN_vkCreateRenderPass2KHR)vk->vkGetDeviceProcAddr(device, "vkCreateRenderPass2KHR");
-    out->vkCmdBeginRenderPass2KHR = (PFN_vkCmdBeginRenderPass2KHR)vk->vkGetDeviceProcAddr(device, "vkCmdBeginRenderPass2KHR");
-    out->vkCmdNextSubpass2KHR = (PFN_vkCmdNextSubpass2KHR)vk->vkGetDeviceProcAddr(device, "vkCmdNextSubpass2KHR");
-    out->vkCmdEndRenderPass2KHR = (PFN_vkCmdEndRenderPass2KHR)vk->vkGetDeviceProcAddr(device, "vkCmdEndRenderPass2KHR");
+    out->vkCreateRenderPass2KHR =
+        (PFN_vkCreateRenderPass2KHR)vk->vkGetDeviceProcAddr(device, "vkCreateRenderPass2KHR");
+    out->vkCmdBeginRenderPass2KHR =
+        (PFN_vkCmdBeginRenderPass2KHR)vk->vkGetDeviceProcAddr(device, "vkCmdBeginRenderPass2KHR");
+    out->vkCmdNextSubpass2KHR =
+        (PFN_vkCmdNextSubpass2KHR)vk->vkGetDeviceProcAddr(device, "vkCmdNextSubpass2KHR");
+    out->vkCmdEndRenderPass2KHR =
+        (PFN_vkCmdEndRenderPass2KHR)vk->vkGetDeviceProcAddr(device, "vkCmdEndRenderPass2KHR");
 #endif
 #ifdef VK_KHR_shared_presentable_image
-    out->vkGetSwapchainStatusKHR = (PFN_vkGetSwapchainStatusKHR)vk->vkGetDeviceProcAddr(device, "vkGetSwapchainStatusKHR");
+    out->vkGetSwapchainStatusKHR =
+        (PFN_vkGetSwapchainStatusKHR)vk->vkGetDeviceProcAddr(device, "vkGetSwapchainStatusKHR");
 #endif
 #ifdef VK_KHR_external_fence_capabilities
-    out->vkGetPhysicalDeviceExternalFencePropertiesKHR = (PFN_vkGetPhysicalDeviceExternalFencePropertiesKHR)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceExternalFencePropertiesKHR");
+    out->vkGetPhysicalDeviceExternalFencePropertiesKHR =
+        (PFN_vkGetPhysicalDeviceExternalFencePropertiesKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceExternalFencePropertiesKHR");
 #endif
 #ifdef VK_KHR_external_fence_win32
-    out->vkImportFenceWin32HandleKHR = (PFN_vkImportFenceWin32HandleKHR)vk->vkGetDeviceProcAddr(device, "vkImportFenceWin32HandleKHR");
-    out->vkGetFenceWin32HandleKHR = (PFN_vkGetFenceWin32HandleKHR)vk->vkGetDeviceProcAddr(device, "vkGetFenceWin32HandleKHR");
+    out->vkImportFenceWin32HandleKHR = (PFN_vkImportFenceWin32HandleKHR)vk->vkGetDeviceProcAddr(
+        device, "vkImportFenceWin32HandleKHR");
+    out->vkGetFenceWin32HandleKHR =
+        (PFN_vkGetFenceWin32HandleKHR)vk->vkGetDeviceProcAddr(device, "vkGetFenceWin32HandleKHR");
 #endif
 #ifdef VK_KHR_external_fence_fd
-    out->vkImportFenceFdKHR = (PFN_vkImportFenceFdKHR)vk->vkGetDeviceProcAddr(device, "vkImportFenceFdKHR");
+    out->vkImportFenceFdKHR =
+        (PFN_vkImportFenceFdKHR)vk->vkGetDeviceProcAddr(device, "vkImportFenceFdKHR");
     out->vkGetFenceFdKHR = (PFN_vkGetFenceFdKHR)vk->vkGetDeviceProcAddr(device, "vkGetFenceFdKHR");
 #endif
 #ifdef VK_KHR_performance_query
-    out->vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR = (PFN_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR)vk->vkGetDeviceProcAddr(device, "vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR");
-    out->vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR = (PFN_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR");
-    out->vkAcquireProfilingLockKHR = (PFN_vkAcquireProfilingLockKHR)vk->vkGetDeviceProcAddr(device, "vkAcquireProfilingLockKHR");
-    out->vkReleaseProfilingLockKHR = (PFN_vkReleaseProfilingLockKHR)vk->vkGetDeviceProcAddr(device, "vkReleaseProfilingLockKHR");
+    out->vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR =
+        (PFN_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR)
+            vk->vkGetDeviceProcAddr(
+                device, "vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR");
+    out->vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR =
+        (PFN_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR");
+    out->vkAcquireProfilingLockKHR =
+        (PFN_vkAcquireProfilingLockKHR)vk->vkGetDeviceProcAddr(device, "vkAcquireProfilingLockKHR");
+    out->vkReleaseProfilingLockKHR =
+        (PFN_vkReleaseProfilingLockKHR)vk->vkGetDeviceProcAddr(device, "vkReleaseProfilingLockKHR");
 #endif
 #ifdef VK_KHR_get_surface_capabilities2
-    out->vkGetPhysicalDeviceSurfaceCapabilities2KHR = (PFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceSurfaceCapabilities2KHR");
-    out->vkGetPhysicalDeviceSurfaceFormats2KHR = (PFN_vkGetPhysicalDeviceSurfaceFormats2KHR)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceSurfaceFormats2KHR");
+    out->vkGetPhysicalDeviceSurfaceCapabilities2KHR =
+        (PFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceSurfaceCapabilities2KHR");
+    out->vkGetPhysicalDeviceSurfaceFormats2KHR =
+        (PFN_vkGetPhysicalDeviceSurfaceFormats2KHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceSurfaceFormats2KHR");
 #endif
 #ifdef VK_KHR_get_display_properties2
-    out->vkGetPhysicalDeviceDisplayProperties2KHR = (PFN_vkGetPhysicalDeviceDisplayProperties2KHR)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceDisplayProperties2KHR");
-    out->vkGetPhysicalDeviceDisplayPlaneProperties2KHR = (PFN_vkGetPhysicalDeviceDisplayPlaneProperties2KHR)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceDisplayPlaneProperties2KHR");
-    out->vkGetDisplayModeProperties2KHR = (PFN_vkGetDisplayModeProperties2KHR)vk->vkGetDeviceProcAddr(device, "vkGetDisplayModeProperties2KHR");
-    out->vkGetDisplayPlaneCapabilities2KHR = (PFN_vkGetDisplayPlaneCapabilities2KHR)vk->vkGetDeviceProcAddr(device, "vkGetDisplayPlaneCapabilities2KHR");
+    out->vkGetPhysicalDeviceDisplayProperties2KHR =
+        (PFN_vkGetPhysicalDeviceDisplayProperties2KHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceDisplayProperties2KHR");
+    out->vkGetPhysicalDeviceDisplayPlaneProperties2KHR =
+        (PFN_vkGetPhysicalDeviceDisplayPlaneProperties2KHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceDisplayPlaneProperties2KHR");
+    out->vkGetDisplayModeProperties2KHR =
+        (PFN_vkGetDisplayModeProperties2KHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetDisplayModeProperties2KHR");
+    out->vkGetDisplayPlaneCapabilities2KHR =
+        (PFN_vkGetDisplayPlaneCapabilities2KHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetDisplayPlaneCapabilities2KHR");
 #endif
 #ifdef VK_KHR_get_memory_requirements2
-    out->vkGetImageMemoryRequirements2KHR = (PFN_vkGetImageMemoryRequirements2KHR)vk->vkGetDeviceProcAddr(device, "vkGetImageMemoryRequirements2KHR");
-    out->vkGetBufferMemoryRequirements2KHR = (PFN_vkGetBufferMemoryRequirements2KHR)vk->vkGetDeviceProcAddr(device, "vkGetBufferMemoryRequirements2KHR");
-    out->vkGetImageSparseMemoryRequirements2KHR = (PFN_vkGetImageSparseMemoryRequirements2KHR)vk->vkGetDeviceProcAddr(device, "vkGetImageSparseMemoryRequirements2KHR");
+    out->vkGetImageMemoryRequirements2KHR =
+        (PFN_vkGetImageMemoryRequirements2KHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetImageMemoryRequirements2KHR");
+    out->vkGetBufferMemoryRequirements2KHR =
+        (PFN_vkGetBufferMemoryRequirements2KHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetBufferMemoryRequirements2KHR");
+    out->vkGetImageSparseMemoryRequirements2KHR =
+        (PFN_vkGetImageSparseMemoryRequirements2KHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetImageSparseMemoryRequirements2KHR");
 #endif
 #ifdef VK_KHR_sampler_ycbcr_conversion
-    out->vkCreateSamplerYcbcrConversionKHR = (PFN_vkCreateSamplerYcbcrConversionKHR)vk->vkGetDeviceProcAddr(device, "vkCreateSamplerYcbcrConversionKHR");
-    out->vkDestroySamplerYcbcrConversionKHR = (PFN_vkDestroySamplerYcbcrConversionKHR)vk->vkGetDeviceProcAddr(device, "vkDestroySamplerYcbcrConversionKHR");
+    out->vkCreateSamplerYcbcrConversionKHR =
+        (PFN_vkCreateSamplerYcbcrConversionKHR)vk->vkGetDeviceProcAddr(
+            device, "vkCreateSamplerYcbcrConversionKHR");
+    out->vkDestroySamplerYcbcrConversionKHR =
+        (PFN_vkDestroySamplerYcbcrConversionKHR)vk->vkGetDeviceProcAddr(
+            device, "vkDestroySamplerYcbcrConversionKHR");
 #endif
 #ifdef VK_KHR_bind_memory2
-    out->vkBindBufferMemory2KHR = (PFN_vkBindBufferMemory2KHR)vk->vkGetDeviceProcAddr(device, "vkBindBufferMemory2KHR");
-    out->vkBindImageMemory2KHR = (PFN_vkBindImageMemory2KHR)vk->vkGetDeviceProcAddr(device, "vkBindImageMemory2KHR");
+    out->vkBindBufferMemory2KHR =
+        (PFN_vkBindBufferMemory2KHR)vk->vkGetDeviceProcAddr(device, "vkBindBufferMemory2KHR");
+    out->vkBindImageMemory2KHR =
+        (PFN_vkBindImageMemory2KHR)vk->vkGetDeviceProcAddr(device, "vkBindImageMemory2KHR");
 #endif
 #ifdef VK_KHR_maintenance3
-    out->vkGetDescriptorSetLayoutSupportKHR = (PFN_vkGetDescriptorSetLayoutSupportKHR)vk->vkGetDeviceProcAddr(device, "vkGetDescriptorSetLayoutSupportKHR");
+    out->vkGetDescriptorSetLayoutSupportKHR =
+        (PFN_vkGetDescriptorSetLayoutSupportKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetDescriptorSetLayoutSupportKHR");
 #endif
 #ifdef VK_KHR_draw_indirect_count
-    out->vkCmdDrawIndirectCountKHR = (PFN_vkCmdDrawIndirectCountKHR)vk->vkGetDeviceProcAddr(device, "vkCmdDrawIndirectCountKHR");
-    out->vkCmdDrawIndexedIndirectCountKHR = (PFN_vkCmdDrawIndexedIndirectCountKHR)vk->vkGetDeviceProcAddr(device, "vkCmdDrawIndexedIndirectCountKHR");
+    out->vkCmdDrawIndirectCountKHR =
+        (PFN_vkCmdDrawIndirectCountKHR)vk->vkGetDeviceProcAddr(device, "vkCmdDrawIndirectCountKHR");
+    out->vkCmdDrawIndexedIndirectCountKHR =
+        (PFN_vkCmdDrawIndexedIndirectCountKHR)vk->vkGetDeviceProcAddr(
+            device, "vkCmdDrawIndexedIndirectCountKHR");
 #endif
 #ifdef VK_KHR_timeline_semaphore
-    out->vkGetSemaphoreCounterValueKHR = (PFN_vkGetSemaphoreCounterValueKHR)vk->vkGetDeviceProcAddr(device, "vkGetSemaphoreCounterValueKHR");
-    out->vkWaitSemaphoresKHR = (PFN_vkWaitSemaphoresKHR)vk->vkGetDeviceProcAddr(device, "vkWaitSemaphoresKHR");
-    out->vkSignalSemaphoreKHR = (PFN_vkSignalSemaphoreKHR)vk->vkGetDeviceProcAddr(device, "vkSignalSemaphoreKHR");
+    out->vkGetSemaphoreCounterValueKHR = (PFN_vkGetSemaphoreCounterValueKHR)vk->vkGetDeviceProcAddr(
+        device, "vkGetSemaphoreCounterValueKHR");
+    out->vkWaitSemaphoresKHR =
+        (PFN_vkWaitSemaphoresKHR)vk->vkGetDeviceProcAddr(device, "vkWaitSemaphoresKHR");
+    out->vkSignalSemaphoreKHR =
+        (PFN_vkSignalSemaphoreKHR)vk->vkGetDeviceProcAddr(device, "vkSignalSemaphoreKHR");
 #endif
 #ifdef VK_KHR_fragment_shading_rate
-    out->vkGetPhysicalDeviceFragmentShadingRatesKHR = (PFN_vkGetPhysicalDeviceFragmentShadingRatesKHR)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceFragmentShadingRatesKHR");
-    out->vkCmdSetFragmentShadingRateKHR = (PFN_vkCmdSetFragmentShadingRateKHR)vk->vkGetDeviceProcAddr(device, "vkCmdSetFragmentShadingRateKHR");
+    out->vkGetPhysicalDeviceFragmentShadingRatesKHR =
+        (PFN_vkGetPhysicalDeviceFragmentShadingRatesKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceFragmentShadingRatesKHR");
+    out->vkCmdSetFragmentShadingRateKHR =
+        (PFN_vkCmdSetFragmentShadingRateKHR)vk->vkGetDeviceProcAddr(
+            device, "vkCmdSetFragmentShadingRateKHR");
 #endif
 #ifdef VK_KHR_present_wait
-    out->vkWaitForPresentKHR = (PFN_vkWaitForPresentKHR)vk->vkGetDeviceProcAddr(device, "vkWaitForPresentKHR");
+    out->vkWaitForPresentKHR =
+        (PFN_vkWaitForPresentKHR)vk->vkGetDeviceProcAddr(device, "vkWaitForPresentKHR");
 #endif
 #ifdef VK_KHR_buffer_device_address
-    out->vkGetBufferDeviceAddressKHR = (PFN_vkGetBufferDeviceAddressKHR)vk->vkGetDeviceProcAddr(device, "vkGetBufferDeviceAddressKHR");
-    out->vkGetBufferOpaqueCaptureAddressKHR = (PFN_vkGetBufferOpaqueCaptureAddressKHR)vk->vkGetDeviceProcAddr(device, "vkGetBufferOpaqueCaptureAddressKHR");
-    out->vkGetDeviceMemoryOpaqueCaptureAddressKHR = (PFN_vkGetDeviceMemoryOpaqueCaptureAddressKHR)vk->vkGetDeviceProcAddr(device, "vkGetDeviceMemoryOpaqueCaptureAddressKHR");
+    out->vkGetBufferDeviceAddressKHR = (PFN_vkGetBufferDeviceAddressKHR)vk->vkGetDeviceProcAddr(
+        device, "vkGetBufferDeviceAddressKHR");
+    out->vkGetBufferOpaqueCaptureAddressKHR =
+        (PFN_vkGetBufferOpaqueCaptureAddressKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetBufferOpaqueCaptureAddressKHR");
+    out->vkGetDeviceMemoryOpaqueCaptureAddressKHR =
+        (PFN_vkGetDeviceMemoryOpaqueCaptureAddressKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetDeviceMemoryOpaqueCaptureAddressKHR");
 #endif
 #ifdef VK_KHR_deferred_host_operations
-    out->vkCreateDeferredOperationKHR = (PFN_vkCreateDeferredOperationKHR)vk->vkGetDeviceProcAddr(device, "vkCreateDeferredOperationKHR");
-    out->vkDestroyDeferredOperationKHR = (PFN_vkDestroyDeferredOperationKHR)vk->vkGetDeviceProcAddr(device, "vkDestroyDeferredOperationKHR");
-    out->vkGetDeferredOperationMaxConcurrencyKHR = (PFN_vkGetDeferredOperationMaxConcurrencyKHR)vk->vkGetDeviceProcAddr(device, "vkGetDeferredOperationMaxConcurrencyKHR");
-    out->vkGetDeferredOperationResultKHR = (PFN_vkGetDeferredOperationResultKHR)vk->vkGetDeviceProcAddr(device, "vkGetDeferredOperationResultKHR");
-    out->vkDeferredOperationJoinKHR = (PFN_vkDeferredOperationJoinKHR)vk->vkGetDeviceProcAddr(device, "vkDeferredOperationJoinKHR");
+    out->vkCreateDeferredOperationKHR = (PFN_vkCreateDeferredOperationKHR)vk->vkGetDeviceProcAddr(
+        device, "vkCreateDeferredOperationKHR");
+    out->vkDestroyDeferredOperationKHR = (PFN_vkDestroyDeferredOperationKHR)vk->vkGetDeviceProcAddr(
+        device, "vkDestroyDeferredOperationKHR");
+    out->vkGetDeferredOperationMaxConcurrencyKHR =
+        (PFN_vkGetDeferredOperationMaxConcurrencyKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetDeferredOperationMaxConcurrencyKHR");
+    out->vkGetDeferredOperationResultKHR =
+        (PFN_vkGetDeferredOperationResultKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetDeferredOperationResultKHR");
+    out->vkDeferredOperationJoinKHR = (PFN_vkDeferredOperationJoinKHR)vk->vkGetDeviceProcAddr(
+        device, "vkDeferredOperationJoinKHR");
 #endif
 #ifdef VK_KHR_pipeline_executable_properties
-    out->vkGetPipelineExecutablePropertiesKHR = (PFN_vkGetPipelineExecutablePropertiesKHR)vk->vkGetDeviceProcAddr(device, "vkGetPipelineExecutablePropertiesKHR");
-    out->vkGetPipelineExecutableStatisticsKHR = (PFN_vkGetPipelineExecutableStatisticsKHR)vk->vkGetDeviceProcAddr(device, "vkGetPipelineExecutableStatisticsKHR");
-    out->vkGetPipelineExecutableInternalRepresentationsKHR = (PFN_vkGetPipelineExecutableInternalRepresentationsKHR)vk->vkGetDeviceProcAddr(device, "vkGetPipelineExecutableInternalRepresentationsKHR");
+    out->vkGetPipelineExecutablePropertiesKHR =
+        (PFN_vkGetPipelineExecutablePropertiesKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetPipelineExecutablePropertiesKHR");
+    out->vkGetPipelineExecutableStatisticsKHR =
+        (PFN_vkGetPipelineExecutableStatisticsKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetPipelineExecutableStatisticsKHR");
+    out->vkGetPipelineExecutableInternalRepresentationsKHR =
+        (PFN_vkGetPipelineExecutableInternalRepresentationsKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetPipelineExecutableInternalRepresentationsKHR");
 #endif
 #ifdef VK_KHR_video_encode_queue
-    out->vkCmdEncodeVideoKHR = (PFN_vkCmdEncodeVideoKHR)vk->vkGetDeviceProcAddr(device, "vkCmdEncodeVideoKHR");
+    out->vkCmdEncodeVideoKHR =
+        (PFN_vkCmdEncodeVideoKHR)vk->vkGetDeviceProcAddr(device, "vkCmdEncodeVideoKHR");
 #endif
 #ifdef VK_KHR_synchronization2
-    out->vkCmdSetEvent2KHR = (PFN_vkCmdSetEvent2KHR)vk->vkGetDeviceProcAddr(device, "vkCmdSetEvent2KHR");
-    out->vkCmdResetEvent2KHR = (PFN_vkCmdResetEvent2KHR)vk->vkGetDeviceProcAddr(device, "vkCmdResetEvent2KHR");
-    out->vkCmdWaitEvents2KHR = (PFN_vkCmdWaitEvents2KHR)vk->vkGetDeviceProcAddr(device, "vkCmdWaitEvents2KHR");
-    out->vkCmdPipelineBarrier2KHR = (PFN_vkCmdPipelineBarrier2KHR)vk->vkGetDeviceProcAddr(device, "vkCmdPipelineBarrier2KHR");
-    out->vkCmdWriteTimestamp2KHR = (PFN_vkCmdWriteTimestamp2KHR)vk->vkGetDeviceProcAddr(device, "vkCmdWriteTimestamp2KHR");
-    out->vkQueueSubmit2KHR = (PFN_vkQueueSubmit2KHR)vk->vkGetDeviceProcAddr(device, "vkQueueSubmit2KHR");
-    out->vkCmdWriteBufferMarker2AMD = (PFN_vkCmdWriteBufferMarker2AMD)vk->vkGetDeviceProcAddr(device, "vkCmdWriteBufferMarker2AMD");
-    out->vkGetQueueCheckpointData2NV = (PFN_vkGetQueueCheckpointData2NV)vk->vkGetDeviceProcAddr(device, "vkGetQueueCheckpointData2NV");
+    out->vkCmdSetEvent2KHR =
+        (PFN_vkCmdSetEvent2KHR)vk->vkGetDeviceProcAddr(device, "vkCmdSetEvent2KHR");
+    out->vkCmdResetEvent2KHR =
+        (PFN_vkCmdResetEvent2KHR)vk->vkGetDeviceProcAddr(device, "vkCmdResetEvent2KHR");
+    out->vkCmdWaitEvents2KHR =
+        (PFN_vkCmdWaitEvents2KHR)vk->vkGetDeviceProcAddr(device, "vkCmdWaitEvents2KHR");
+    out->vkCmdPipelineBarrier2KHR =
+        (PFN_vkCmdPipelineBarrier2KHR)vk->vkGetDeviceProcAddr(device, "vkCmdPipelineBarrier2KHR");
+    out->vkCmdWriteTimestamp2KHR =
+        (PFN_vkCmdWriteTimestamp2KHR)vk->vkGetDeviceProcAddr(device, "vkCmdWriteTimestamp2KHR");
+    out->vkQueueSubmit2KHR =
+        (PFN_vkQueueSubmit2KHR)vk->vkGetDeviceProcAddr(device, "vkQueueSubmit2KHR");
+    out->vkCmdWriteBufferMarker2AMD = (PFN_vkCmdWriteBufferMarker2AMD)vk->vkGetDeviceProcAddr(
+        device, "vkCmdWriteBufferMarker2AMD");
+    out->vkGetQueueCheckpointData2NV = (PFN_vkGetQueueCheckpointData2NV)vk->vkGetDeviceProcAddr(
+        device, "vkGetQueueCheckpointData2NV");
 #endif
 #ifdef VK_KHR_copy_commands2
-    out->vkCmdCopyBuffer2KHR = (PFN_vkCmdCopyBuffer2KHR)vk->vkGetDeviceProcAddr(device, "vkCmdCopyBuffer2KHR");
-    out->vkCmdCopyImage2KHR = (PFN_vkCmdCopyImage2KHR)vk->vkGetDeviceProcAddr(device, "vkCmdCopyImage2KHR");
-    out->vkCmdCopyBufferToImage2KHR = (PFN_vkCmdCopyBufferToImage2KHR)vk->vkGetDeviceProcAddr(device, "vkCmdCopyBufferToImage2KHR");
-    out->vkCmdCopyImageToBuffer2KHR = (PFN_vkCmdCopyImageToBuffer2KHR)vk->vkGetDeviceProcAddr(device, "vkCmdCopyImageToBuffer2KHR");
-    out->vkCmdBlitImage2KHR = (PFN_vkCmdBlitImage2KHR)vk->vkGetDeviceProcAddr(device, "vkCmdBlitImage2KHR");
-    out->vkCmdResolveImage2KHR = (PFN_vkCmdResolveImage2KHR)vk->vkGetDeviceProcAddr(device, "vkCmdResolveImage2KHR");
+    out->vkCmdCopyBuffer2KHR =
+        (PFN_vkCmdCopyBuffer2KHR)vk->vkGetDeviceProcAddr(device, "vkCmdCopyBuffer2KHR");
+    out->vkCmdCopyImage2KHR =
+        (PFN_vkCmdCopyImage2KHR)vk->vkGetDeviceProcAddr(device, "vkCmdCopyImage2KHR");
+    out->vkCmdCopyBufferToImage2KHR = (PFN_vkCmdCopyBufferToImage2KHR)vk->vkGetDeviceProcAddr(
+        device, "vkCmdCopyBufferToImage2KHR");
+    out->vkCmdCopyImageToBuffer2KHR = (PFN_vkCmdCopyImageToBuffer2KHR)vk->vkGetDeviceProcAddr(
+        device, "vkCmdCopyImageToBuffer2KHR");
+    out->vkCmdBlitImage2KHR =
+        (PFN_vkCmdBlitImage2KHR)vk->vkGetDeviceProcAddr(device, "vkCmdBlitImage2KHR");
+    out->vkCmdResolveImage2KHR =
+        (PFN_vkCmdResolveImage2KHR)vk->vkGetDeviceProcAddr(device, "vkCmdResolveImage2KHR");
 #endif
 #ifdef VK_KHR_maintenance4
-    out->vkGetDeviceBufferMemoryRequirementsKHR = (PFN_vkGetDeviceBufferMemoryRequirementsKHR)vk->vkGetDeviceProcAddr(device, "vkGetDeviceBufferMemoryRequirementsKHR");
-    out->vkGetDeviceImageMemoryRequirementsKHR = (PFN_vkGetDeviceImageMemoryRequirementsKHR)vk->vkGetDeviceProcAddr(device, "vkGetDeviceImageMemoryRequirementsKHR");
-    out->vkGetDeviceImageSparseMemoryRequirementsKHR = (PFN_vkGetDeviceImageSparseMemoryRequirementsKHR)vk->vkGetDeviceProcAddr(device, "vkGetDeviceImageSparseMemoryRequirementsKHR");
+    out->vkGetDeviceBufferMemoryRequirementsKHR =
+        (PFN_vkGetDeviceBufferMemoryRequirementsKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetDeviceBufferMemoryRequirementsKHR");
+    out->vkGetDeviceImageMemoryRequirementsKHR =
+        (PFN_vkGetDeviceImageMemoryRequirementsKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetDeviceImageMemoryRequirementsKHR");
+    out->vkGetDeviceImageSparseMemoryRequirementsKHR =
+        (PFN_vkGetDeviceImageSparseMemoryRequirementsKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetDeviceImageSparseMemoryRequirementsKHR");
 #endif
 #ifdef VK_ANDROID_native_buffer
-    out->vkGetSwapchainGrallocUsageANDROID = (PFN_vkGetSwapchainGrallocUsageANDROID)vk->vkGetDeviceProcAddr(device, "vkGetSwapchainGrallocUsageANDROID");
-    out->vkAcquireImageANDROID = (PFN_vkAcquireImageANDROID)vk->vkGetDeviceProcAddr(device, "vkAcquireImageANDROID");
-    out->vkQueueSignalReleaseImageANDROID = (PFN_vkQueueSignalReleaseImageANDROID)vk->vkGetDeviceProcAddr(device, "vkQueueSignalReleaseImageANDROID");
+    out->vkGetSwapchainGrallocUsageANDROID =
+        (PFN_vkGetSwapchainGrallocUsageANDROID)vk->vkGetDeviceProcAddr(
+            device, "vkGetSwapchainGrallocUsageANDROID");
+    out->vkAcquireImageANDROID =
+        (PFN_vkAcquireImageANDROID)vk->vkGetDeviceProcAddr(device, "vkAcquireImageANDROID");
+    out->vkQueueSignalReleaseImageANDROID =
+        (PFN_vkQueueSignalReleaseImageANDROID)vk->vkGetDeviceProcAddr(
+            device, "vkQueueSignalReleaseImageANDROID");
 #endif
 #ifdef VK_EXT_debug_marker
-    out->vkDebugMarkerSetObjectTagEXT = (PFN_vkDebugMarkerSetObjectTagEXT)vk->vkGetDeviceProcAddr(device, "vkDebugMarkerSetObjectTagEXT");
-    out->vkDebugMarkerSetObjectNameEXT = (PFN_vkDebugMarkerSetObjectNameEXT)vk->vkGetDeviceProcAddr(device, "vkDebugMarkerSetObjectNameEXT");
-    out->vkCmdDebugMarkerBeginEXT = (PFN_vkCmdDebugMarkerBeginEXT)vk->vkGetDeviceProcAddr(device, "vkCmdDebugMarkerBeginEXT");
-    out->vkCmdDebugMarkerEndEXT = (PFN_vkCmdDebugMarkerEndEXT)vk->vkGetDeviceProcAddr(device, "vkCmdDebugMarkerEndEXT");
-    out->vkCmdDebugMarkerInsertEXT = (PFN_vkCmdDebugMarkerInsertEXT)vk->vkGetDeviceProcAddr(device, "vkCmdDebugMarkerInsertEXT");
+    out->vkDebugMarkerSetObjectTagEXT = (PFN_vkDebugMarkerSetObjectTagEXT)vk->vkGetDeviceProcAddr(
+        device, "vkDebugMarkerSetObjectTagEXT");
+    out->vkDebugMarkerSetObjectNameEXT = (PFN_vkDebugMarkerSetObjectNameEXT)vk->vkGetDeviceProcAddr(
+        device, "vkDebugMarkerSetObjectNameEXT");
+    out->vkCmdDebugMarkerBeginEXT =
+        (PFN_vkCmdDebugMarkerBeginEXT)vk->vkGetDeviceProcAddr(device, "vkCmdDebugMarkerBeginEXT");
+    out->vkCmdDebugMarkerEndEXT =
+        (PFN_vkCmdDebugMarkerEndEXT)vk->vkGetDeviceProcAddr(device, "vkCmdDebugMarkerEndEXT");
+    out->vkCmdDebugMarkerInsertEXT =
+        (PFN_vkCmdDebugMarkerInsertEXT)vk->vkGetDeviceProcAddr(device, "vkCmdDebugMarkerInsertEXT");
 #endif
 #ifdef VK_EXT_transform_feedback
-    out->vkCmdBindTransformFeedbackBuffersEXT = (PFN_vkCmdBindTransformFeedbackBuffersEXT)vk->vkGetDeviceProcAddr(device, "vkCmdBindTransformFeedbackBuffersEXT");
-    out->vkCmdBeginTransformFeedbackEXT = (PFN_vkCmdBeginTransformFeedbackEXT)vk->vkGetDeviceProcAddr(device, "vkCmdBeginTransformFeedbackEXT");
-    out->vkCmdEndTransformFeedbackEXT = (PFN_vkCmdEndTransformFeedbackEXT)vk->vkGetDeviceProcAddr(device, "vkCmdEndTransformFeedbackEXT");
-    out->vkCmdBeginQueryIndexedEXT = (PFN_vkCmdBeginQueryIndexedEXT)vk->vkGetDeviceProcAddr(device, "vkCmdBeginQueryIndexedEXT");
-    out->vkCmdEndQueryIndexedEXT = (PFN_vkCmdEndQueryIndexedEXT)vk->vkGetDeviceProcAddr(device, "vkCmdEndQueryIndexedEXT");
-    out->vkCmdDrawIndirectByteCountEXT = (PFN_vkCmdDrawIndirectByteCountEXT)vk->vkGetDeviceProcAddr(device, "vkCmdDrawIndirectByteCountEXT");
+    out->vkCmdBindTransformFeedbackBuffersEXT =
+        (PFN_vkCmdBindTransformFeedbackBuffersEXT)vk->vkGetDeviceProcAddr(
+            device, "vkCmdBindTransformFeedbackBuffersEXT");
+    out->vkCmdBeginTransformFeedbackEXT =
+        (PFN_vkCmdBeginTransformFeedbackEXT)vk->vkGetDeviceProcAddr(
+            device, "vkCmdBeginTransformFeedbackEXT");
+    out->vkCmdEndTransformFeedbackEXT = (PFN_vkCmdEndTransformFeedbackEXT)vk->vkGetDeviceProcAddr(
+        device, "vkCmdEndTransformFeedbackEXT");
+    out->vkCmdBeginQueryIndexedEXT =
+        (PFN_vkCmdBeginQueryIndexedEXT)vk->vkGetDeviceProcAddr(device, "vkCmdBeginQueryIndexedEXT");
+    out->vkCmdEndQueryIndexedEXT =
+        (PFN_vkCmdEndQueryIndexedEXT)vk->vkGetDeviceProcAddr(device, "vkCmdEndQueryIndexedEXT");
+    out->vkCmdDrawIndirectByteCountEXT = (PFN_vkCmdDrawIndirectByteCountEXT)vk->vkGetDeviceProcAddr(
+        device, "vkCmdDrawIndirectByteCountEXT");
 #endif
 #ifdef VK_NVX_binary_import
-    out->vkCreateCuModuleNVX = (PFN_vkCreateCuModuleNVX)vk->vkGetDeviceProcAddr(device, "vkCreateCuModuleNVX");
-    out->vkCreateCuFunctionNVX = (PFN_vkCreateCuFunctionNVX)vk->vkGetDeviceProcAddr(device, "vkCreateCuFunctionNVX");
-    out->vkDestroyCuModuleNVX = (PFN_vkDestroyCuModuleNVX)vk->vkGetDeviceProcAddr(device, "vkDestroyCuModuleNVX");
-    out->vkDestroyCuFunctionNVX = (PFN_vkDestroyCuFunctionNVX)vk->vkGetDeviceProcAddr(device, "vkDestroyCuFunctionNVX");
-    out->vkCmdCuLaunchKernelNVX = (PFN_vkCmdCuLaunchKernelNVX)vk->vkGetDeviceProcAddr(device, "vkCmdCuLaunchKernelNVX");
+    out->vkCreateCuModuleNVX =
+        (PFN_vkCreateCuModuleNVX)vk->vkGetDeviceProcAddr(device, "vkCreateCuModuleNVX");
+    out->vkCreateCuFunctionNVX =
+        (PFN_vkCreateCuFunctionNVX)vk->vkGetDeviceProcAddr(device, "vkCreateCuFunctionNVX");
+    out->vkDestroyCuModuleNVX =
+        (PFN_vkDestroyCuModuleNVX)vk->vkGetDeviceProcAddr(device, "vkDestroyCuModuleNVX");
+    out->vkDestroyCuFunctionNVX =
+        (PFN_vkDestroyCuFunctionNVX)vk->vkGetDeviceProcAddr(device, "vkDestroyCuFunctionNVX");
+    out->vkCmdCuLaunchKernelNVX =
+        (PFN_vkCmdCuLaunchKernelNVX)vk->vkGetDeviceProcAddr(device, "vkCmdCuLaunchKernelNVX");
 #endif
 #ifdef VK_NVX_image_view_handle
-    out->vkGetImageViewHandleNVX = (PFN_vkGetImageViewHandleNVX)vk->vkGetDeviceProcAddr(device, "vkGetImageViewHandleNVX");
-    out->vkGetImageViewAddressNVX = (PFN_vkGetImageViewAddressNVX)vk->vkGetDeviceProcAddr(device, "vkGetImageViewAddressNVX");
+    out->vkGetImageViewHandleNVX =
+        (PFN_vkGetImageViewHandleNVX)vk->vkGetDeviceProcAddr(device, "vkGetImageViewHandleNVX");
+    out->vkGetImageViewAddressNVX =
+        (PFN_vkGetImageViewAddressNVX)vk->vkGetDeviceProcAddr(device, "vkGetImageViewAddressNVX");
 #endif
 #ifdef VK_AMD_draw_indirect_count
-    out->vkCmdDrawIndirectCountAMD = (PFN_vkCmdDrawIndirectCountAMD)vk->vkGetDeviceProcAddr(device, "vkCmdDrawIndirectCountAMD");
-    out->vkCmdDrawIndexedIndirectCountAMD = (PFN_vkCmdDrawIndexedIndirectCountAMD)vk->vkGetDeviceProcAddr(device, "vkCmdDrawIndexedIndirectCountAMD");
+    out->vkCmdDrawIndirectCountAMD =
+        (PFN_vkCmdDrawIndirectCountAMD)vk->vkGetDeviceProcAddr(device, "vkCmdDrawIndirectCountAMD");
+    out->vkCmdDrawIndexedIndirectCountAMD =
+        (PFN_vkCmdDrawIndexedIndirectCountAMD)vk->vkGetDeviceProcAddr(
+            device, "vkCmdDrawIndexedIndirectCountAMD");
 #endif
 #ifdef VK_AMD_shader_info
-    out->vkGetShaderInfoAMD = (PFN_vkGetShaderInfoAMD)vk->vkGetDeviceProcAddr(device, "vkGetShaderInfoAMD");
+    out->vkGetShaderInfoAMD =
+        (PFN_vkGetShaderInfoAMD)vk->vkGetDeviceProcAddr(device, "vkGetShaderInfoAMD");
 #endif
 #ifdef VK_NV_external_memory_capabilities
-    out->vkGetPhysicalDeviceExternalImageFormatPropertiesNV = (PFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV");
+    out->vkGetPhysicalDeviceExternalImageFormatPropertiesNV =
+        (PFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV");
 #endif
 #ifdef VK_NV_external_memory_win32
-    out->vkGetMemoryWin32HandleNV = (PFN_vkGetMemoryWin32HandleNV)vk->vkGetDeviceProcAddr(device, "vkGetMemoryWin32HandleNV");
+    out->vkGetMemoryWin32HandleNV =
+        (PFN_vkGetMemoryWin32HandleNV)vk->vkGetDeviceProcAddr(device, "vkGetMemoryWin32HandleNV");
 #endif
 #ifdef VK_EXT_conditional_rendering
-    out->vkCmdBeginConditionalRenderingEXT = (PFN_vkCmdBeginConditionalRenderingEXT)vk->vkGetDeviceProcAddr(device, "vkCmdBeginConditionalRenderingEXT");
-    out->vkCmdEndConditionalRenderingEXT = (PFN_vkCmdEndConditionalRenderingEXT)vk->vkGetDeviceProcAddr(device, "vkCmdEndConditionalRenderingEXT");
+    out->vkCmdBeginConditionalRenderingEXT =
+        (PFN_vkCmdBeginConditionalRenderingEXT)vk->vkGetDeviceProcAddr(
+            device, "vkCmdBeginConditionalRenderingEXT");
+    out->vkCmdEndConditionalRenderingEXT =
+        (PFN_vkCmdEndConditionalRenderingEXT)vk->vkGetDeviceProcAddr(
+            device, "vkCmdEndConditionalRenderingEXT");
 #endif
 #ifdef VK_NV_clip_space_w_scaling
-    out->vkCmdSetViewportWScalingNV = (PFN_vkCmdSetViewportWScalingNV)vk->vkGetDeviceProcAddr(device, "vkCmdSetViewportWScalingNV");
+    out->vkCmdSetViewportWScalingNV = (PFN_vkCmdSetViewportWScalingNV)vk->vkGetDeviceProcAddr(
+        device, "vkCmdSetViewportWScalingNV");
 #endif
 #ifdef VK_EXT_direct_mode_display
-    out->vkReleaseDisplayEXT = (PFN_vkReleaseDisplayEXT)vk->vkGetDeviceProcAddr(device, "vkReleaseDisplayEXT");
+    out->vkReleaseDisplayEXT =
+        (PFN_vkReleaseDisplayEXT)vk->vkGetDeviceProcAddr(device, "vkReleaseDisplayEXT");
 #endif
 #ifdef VK_EXT_acquire_xlib_display
-    out->vkAcquireXlibDisplayEXT = (PFN_vkAcquireXlibDisplayEXT)vk->vkGetDeviceProcAddr(device, "vkAcquireXlibDisplayEXT");
-    out->vkGetRandROutputDisplayEXT = (PFN_vkGetRandROutputDisplayEXT)vk->vkGetDeviceProcAddr(device, "vkGetRandROutputDisplayEXT");
+    out->vkAcquireXlibDisplayEXT =
+        (PFN_vkAcquireXlibDisplayEXT)vk->vkGetDeviceProcAddr(device, "vkAcquireXlibDisplayEXT");
+    out->vkGetRandROutputDisplayEXT = (PFN_vkGetRandROutputDisplayEXT)vk->vkGetDeviceProcAddr(
+        device, "vkGetRandROutputDisplayEXT");
 #endif
 #ifdef VK_EXT_display_surface_counter
-    out->vkGetPhysicalDeviceSurfaceCapabilities2EXT = (PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceSurfaceCapabilities2EXT");
+    out->vkGetPhysicalDeviceSurfaceCapabilities2EXT =
+        (PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceSurfaceCapabilities2EXT");
 #endif
 #ifdef VK_EXT_display_control
-    out->vkDisplayPowerControlEXT = (PFN_vkDisplayPowerControlEXT)vk->vkGetDeviceProcAddr(device, "vkDisplayPowerControlEXT");
-    out->vkRegisterDeviceEventEXT = (PFN_vkRegisterDeviceEventEXT)vk->vkGetDeviceProcAddr(device, "vkRegisterDeviceEventEXT");
-    out->vkRegisterDisplayEventEXT = (PFN_vkRegisterDisplayEventEXT)vk->vkGetDeviceProcAddr(device, "vkRegisterDisplayEventEXT");
-    out->vkGetSwapchainCounterEXT = (PFN_vkGetSwapchainCounterEXT)vk->vkGetDeviceProcAddr(device, "vkGetSwapchainCounterEXT");
+    out->vkDisplayPowerControlEXT =
+        (PFN_vkDisplayPowerControlEXT)vk->vkGetDeviceProcAddr(device, "vkDisplayPowerControlEXT");
+    out->vkRegisterDeviceEventEXT =
+        (PFN_vkRegisterDeviceEventEXT)vk->vkGetDeviceProcAddr(device, "vkRegisterDeviceEventEXT");
+    out->vkRegisterDisplayEventEXT =
+        (PFN_vkRegisterDisplayEventEXT)vk->vkGetDeviceProcAddr(device, "vkRegisterDisplayEventEXT");
+    out->vkGetSwapchainCounterEXT =
+        (PFN_vkGetSwapchainCounterEXT)vk->vkGetDeviceProcAddr(device, "vkGetSwapchainCounterEXT");
 #endif
 #ifdef VK_GOOGLE_display_timing
-    out->vkGetRefreshCycleDurationGOOGLE = (PFN_vkGetRefreshCycleDurationGOOGLE)vk->vkGetDeviceProcAddr(device, "vkGetRefreshCycleDurationGOOGLE");
-    out->vkGetPastPresentationTimingGOOGLE = (PFN_vkGetPastPresentationTimingGOOGLE)vk->vkGetDeviceProcAddr(device, "vkGetPastPresentationTimingGOOGLE");
+    out->vkGetRefreshCycleDurationGOOGLE =
+        (PFN_vkGetRefreshCycleDurationGOOGLE)vk->vkGetDeviceProcAddr(
+            device, "vkGetRefreshCycleDurationGOOGLE");
+    out->vkGetPastPresentationTimingGOOGLE =
+        (PFN_vkGetPastPresentationTimingGOOGLE)vk->vkGetDeviceProcAddr(
+            device, "vkGetPastPresentationTimingGOOGLE");
 #endif
 #ifdef VK_EXT_discard_rectangles
-    out->vkCmdSetDiscardRectangleEXT = (PFN_vkCmdSetDiscardRectangleEXT)vk->vkGetDeviceProcAddr(device, "vkCmdSetDiscardRectangleEXT");
+    out->vkCmdSetDiscardRectangleEXT = (PFN_vkCmdSetDiscardRectangleEXT)vk->vkGetDeviceProcAddr(
+        device, "vkCmdSetDiscardRectangleEXT");
 #endif
 #ifdef VK_EXT_hdr_metadata
-    out->vkSetHdrMetadataEXT = (PFN_vkSetHdrMetadataEXT)vk->vkGetDeviceProcAddr(device, "vkSetHdrMetadataEXT");
+    out->vkSetHdrMetadataEXT =
+        (PFN_vkSetHdrMetadataEXT)vk->vkGetDeviceProcAddr(device, "vkSetHdrMetadataEXT");
 #endif
 #ifdef VK_EXT_debug_utils
-    out->vkSetDebugUtilsObjectNameEXT = (PFN_vkSetDebugUtilsObjectNameEXT)vk->vkGetDeviceProcAddr(device, "vkSetDebugUtilsObjectNameEXT");
-    out->vkSetDebugUtilsObjectTagEXT = (PFN_vkSetDebugUtilsObjectTagEXT)vk->vkGetDeviceProcAddr(device, "vkSetDebugUtilsObjectTagEXT");
-    out->vkQueueBeginDebugUtilsLabelEXT = (PFN_vkQueueBeginDebugUtilsLabelEXT)vk->vkGetDeviceProcAddr(device, "vkQueueBeginDebugUtilsLabelEXT");
-    out->vkQueueEndDebugUtilsLabelEXT = (PFN_vkQueueEndDebugUtilsLabelEXT)vk->vkGetDeviceProcAddr(device, "vkQueueEndDebugUtilsLabelEXT");
-    out->vkQueueInsertDebugUtilsLabelEXT = (PFN_vkQueueInsertDebugUtilsLabelEXT)vk->vkGetDeviceProcAddr(device, "vkQueueInsertDebugUtilsLabelEXT");
-    out->vkCmdBeginDebugUtilsLabelEXT = (PFN_vkCmdBeginDebugUtilsLabelEXT)vk->vkGetDeviceProcAddr(device, "vkCmdBeginDebugUtilsLabelEXT");
-    out->vkCmdEndDebugUtilsLabelEXT = (PFN_vkCmdEndDebugUtilsLabelEXT)vk->vkGetDeviceProcAddr(device, "vkCmdEndDebugUtilsLabelEXT");
-    out->vkCmdInsertDebugUtilsLabelEXT = (PFN_vkCmdInsertDebugUtilsLabelEXT)vk->vkGetDeviceProcAddr(device, "vkCmdInsertDebugUtilsLabelEXT");
+    out->vkSetDebugUtilsObjectNameEXT = (PFN_vkSetDebugUtilsObjectNameEXT)vk->vkGetDeviceProcAddr(
+        device, "vkSetDebugUtilsObjectNameEXT");
+    out->vkSetDebugUtilsObjectTagEXT = (PFN_vkSetDebugUtilsObjectTagEXT)vk->vkGetDeviceProcAddr(
+        device, "vkSetDebugUtilsObjectTagEXT");
+    out->vkQueueBeginDebugUtilsLabelEXT =
+        (PFN_vkQueueBeginDebugUtilsLabelEXT)vk->vkGetDeviceProcAddr(
+            device, "vkQueueBeginDebugUtilsLabelEXT");
+    out->vkQueueEndDebugUtilsLabelEXT = (PFN_vkQueueEndDebugUtilsLabelEXT)vk->vkGetDeviceProcAddr(
+        device, "vkQueueEndDebugUtilsLabelEXT");
+    out->vkQueueInsertDebugUtilsLabelEXT =
+        (PFN_vkQueueInsertDebugUtilsLabelEXT)vk->vkGetDeviceProcAddr(
+            device, "vkQueueInsertDebugUtilsLabelEXT");
+    out->vkCmdBeginDebugUtilsLabelEXT = (PFN_vkCmdBeginDebugUtilsLabelEXT)vk->vkGetDeviceProcAddr(
+        device, "vkCmdBeginDebugUtilsLabelEXT");
+    out->vkCmdEndDebugUtilsLabelEXT = (PFN_vkCmdEndDebugUtilsLabelEXT)vk->vkGetDeviceProcAddr(
+        device, "vkCmdEndDebugUtilsLabelEXT");
+    out->vkCmdInsertDebugUtilsLabelEXT = (PFN_vkCmdInsertDebugUtilsLabelEXT)vk->vkGetDeviceProcAddr(
+        device, "vkCmdInsertDebugUtilsLabelEXT");
 #endif
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
-    out->vkGetAndroidHardwareBufferPropertiesANDROID = (PFN_vkGetAndroidHardwareBufferPropertiesANDROID)vk->vkGetDeviceProcAddr(device, "vkGetAndroidHardwareBufferPropertiesANDROID");
-    out->vkGetMemoryAndroidHardwareBufferANDROID = (PFN_vkGetMemoryAndroidHardwareBufferANDROID)vk->vkGetDeviceProcAddr(device, "vkGetMemoryAndroidHardwareBufferANDROID");
+    out->vkGetAndroidHardwareBufferPropertiesANDROID =
+        (PFN_vkGetAndroidHardwareBufferPropertiesANDROID)vk->vkGetDeviceProcAddr(
+            device, "vkGetAndroidHardwareBufferPropertiesANDROID");
+    out->vkGetMemoryAndroidHardwareBufferANDROID =
+        (PFN_vkGetMemoryAndroidHardwareBufferANDROID)vk->vkGetDeviceProcAddr(
+            device, "vkGetMemoryAndroidHardwareBufferANDROID");
 #endif
 #ifdef VK_EXT_sample_locations
-    out->vkCmdSetSampleLocationsEXT = (PFN_vkCmdSetSampleLocationsEXT)vk->vkGetDeviceProcAddr(device, "vkCmdSetSampleLocationsEXT");
-    out->vkGetPhysicalDeviceMultisamplePropertiesEXT = (PFN_vkGetPhysicalDeviceMultisamplePropertiesEXT)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceMultisamplePropertiesEXT");
+    out->vkCmdSetSampleLocationsEXT = (PFN_vkCmdSetSampleLocationsEXT)vk->vkGetDeviceProcAddr(
+        device, "vkCmdSetSampleLocationsEXT");
+    out->vkGetPhysicalDeviceMultisamplePropertiesEXT =
+        (PFN_vkGetPhysicalDeviceMultisamplePropertiesEXT)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceMultisamplePropertiesEXT");
 #endif
 #ifdef VK_EXT_image_drm_format_modifier
-    out->vkGetImageDrmFormatModifierPropertiesEXT = (PFN_vkGetImageDrmFormatModifierPropertiesEXT)vk->vkGetDeviceProcAddr(device, "vkGetImageDrmFormatModifierPropertiesEXT");
+    out->vkGetImageDrmFormatModifierPropertiesEXT =
+        (PFN_vkGetImageDrmFormatModifierPropertiesEXT)vk->vkGetDeviceProcAddr(
+            device, "vkGetImageDrmFormatModifierPropertiesEXT");
 #endif
 #ifdef VK_EXT_validation_cache
-    out->vkCreateValidationCacheEXT = (PFN_vkCreateValidationCacheEXT)vk->vkGetDeviceProcAddr(device, "vkCreateValidationCacheEXT");
-    out->vkDestroyValidationCacheEXT = (PFN_vkDestroyValidationCacheEXT)vk->vkGetDeviceProcAddr(device, "vkDestroyValidationCacheEXT");
-    out->vkMergeValidationCachesEXT = (PFN_vkMergeValidationCachesEXT)vk->vkGetDeviceProcAddr(device, "vkMergeValidationCachesEXT");
-    out->vkGetValidationCacheDataEXT = (PFN_vkGetValidationCacheDataEXT)vk->vkGetDeviceProcAddr(device, "vkGetValidationCacheDataEXT");
+    out->vkCreateValidationCacheEXT = (PFN_vkCreateValidationCacheEXT)vk->vkGetDeviceProcAddr(
+        device, "vkCreateValidationCacheEXT");
+    out->vkDestroyValidationCacheEXT = (PFN_vkDestroyValidationCacheEXT)vk->vkGetDeviceProcAddr(
+        device, "vkDestroyValidationCacheEXT");
+    out->vkMergeValidationCachesEXT = (PFN_vkMergeValidationCachesEXT)vk->vkGetDeviceProcAddr(
+        device, "vkMergeValidationCachesEXT");
+    out->vkGetValidationCacheDataEXT = (PFN_vkGetValidationCacheDataEXT)vk->vkGetDeviceProcAddr(
+        device, "vkGetValidationCacheDataEXT");
 #endif
 #ifdef VK_NV_shading_rate_image
-    out->vkCmdBindShadingRateImageNV = (PFN_vkCmdBindShadingRateImageNV)vk->vkGetDeviceProcAddr(device, "vkCmdBindShadingRateImageNV");
-    out->vkCmdSetViewportShadingRatePaletteNV = (PFN_vkCmdSetViewportShadingRatePaletteNV)vk->vkGetDeviceProcAddr(device, "vkCmdSetViewportShadingRatePaletteNV");
-    out->vkCmdSetCoarseSampleOrderNV = (PFN_vkCmdSetCoarseSampleOrderNV)vk->vkGetDeviceProcAddr(device, "vkCmdSetCoarseSampleOrderNV");
+    out->vkCmdBindShadingRateImageNV = (PFN_vkCmdBindShadingRateImageNV)vk->vkGetDeviceProcAddr(
+        device, "vkCmdBindShadingRateImageNV");
+    out->vkCmdSetViewportShadingRatePaletteNV =
+        (PFN_vkCmdSetViewportShadingRatePaletteNV)vk->vkGetDeviceProcAddr(
+            device, "vkCmdSetViewportShadingRatePaletteNV");
+    out->vkCmdSetCoarseSampleOrderNV = (PFN_vkCmdSetCoarseSampleOrderNV)vk->vkGetDeviceProcAddr(
+        device, "vkCmdSetCoarseSampleOrderNV");
 #endif
 #ifdef VK_NV_ray_tracing
-    out->vkCreateAccelerationStructureNV = (PFN_vkCreateAccelerationStructureNV)vk->vkGetDeviceProcAddr(device, "vkCreateAccelerationStructureNV");
-    out->vkDestroyAccelerationStructureNV = (PFN_vkDestroyAccelerationStructureNV)vk->vkGetDeviceProcAddr(device, "vkDestroyAccelerationStructureNV");
-    out->vkGetAccelerationStructureMemoryRequirementsNV = (PFN_vkGetAccelerationStructureMemoryRequirementsNV)vk->vkGetDeviceProcAddr(device, "vkGetAccelerationStructureMemoryRequirementsNV");
-    out->vkBindAccelerationStructureMemoryNV = (PFN_vkBindAccelerationStructureMemoryNV)vk->vkGetDeviceProcAddr(device, "vkBindAccelerationStructureMemoryNV");
-    out->vkCmdBuildAccelerationStructureNV = (PFN_vkCmdBuildAccelerationStructureNV)vk->vkGetDeviceProcAddr(device, "vkCmdBuildAccelerationStructureNV");
-    out->vkCmdCopyAccelerationStructureNV = (PFN_vkCmdCopyAccelerationStructureNV)vk->vkGetDeviceProcAddr(device, "vkCmdCopyAccelerationStructureNV");
-    out->vkCmdTraceRaysNV = (PFN_vkCmdTraceRaysNV)vk->vkGetDeviceProcAddr(device, "vkCmdTraceRaysNV");
-    out->vkCreateRayTracingPipelinesNV = (PFN_vkCreateRayTracingPipelinesNV)vk->vkGetDeviceProcAddr(device, "vkCreateRayTracingPipelinesNV");
-    out->vkGetRayTracingShaderGroupHandlesKHR = (PFN_vkGetRayTracingShaderGroupHandlesKHR)vk->vkGetDeviceProcAddr(device, "vkGetRayTracingShaderGroupHandlesKHR");
-    out->vkGetRayTracingShaderGroupHandlesNV = (PFN_vkGetRayTracingShaderGroupHandlesNV)vk->vkGetDeviceProcAddr(device, "vkGetRayTracingShaderGroupHandlesNV");
-    out->vkGetAccelerationStructureHandleNV = (PFN_vkGetAccelerationStructureHandleNV)vk->vkGetDeviceProcAddr(device, "vkGetAccelerationStructureHandleNV");
-    out->vkCmdWriteAccelerationStructuresPropertiesNV = (PFN_vkCmdWriteAccelerationStructuresPropertiesNV)vk->vkGetDeviceProcAddr(device, "vkCmdWriteAccelerationStructuresPropertiesNV");
-    out->vkCompileDeferredNV = (PFN_vkCompileDeferredNV)vk->vkGetDeviceProcAddr(device, "vkCompileDeferredNV");
+    out->vkCreateAccelerationStructureNV =
+        (PFN_vkCreateAccelerationStructureNV)vk->vkGetDeviceProcAddr(
+            device, "vkCreateAccelerationStructureNV");
+    out->vkDestroyAccelerationStructureNV =
+        (PFN_vkDestroyAccelerationStructureNV)vk->vkGetDeviceProcAddr(
+            device, "vkDestroyAccelerationStructureNV");
+    out->vkGetAccelerationStructureMemoryRequirementsNV =
+        (PFN_vkGetAccelerationStructureMemoryRequirementsNV)vk->vkGetDeviceProcAddr(
+            device, "vkGetAccelerationStructureMemoryRequirementsNV");
+    out->vkBindAccelerationStructureMemoryNV =
+        (PFN_vkBindAccelerationStructureMemoryNV)vk->vkGetDeviceProcAddr(
+            device, "vkBindAccelerationStructureMemoryNV");
+    out->vkCmdBuildAccelerationStructureNV =
+        (PFN_vkCmdBuildAccelerationStructureNV)vk->vkGetDeviceProcAddr(
+            device, "vkCmdBuildAccelerationStructureNV");
+    out->vkCmdCopyAccelerationStructureNV =
+        (PFN_vkCmdCopyAccelerationStructureNV)vk->vkGetDeviceProcAddr(
+            device, "vkCmdCopyAccelerationStructureNV");
+    out->vkCmdTraceRaysNV =
+        (PFN_vkCmdTraceRaysNV)vk->vkGetDeviceProcAddr(device, "vkCmdTraceRaysNV");
+    out->vkCreateRayTracingPipelinesNV = (PFN_vkCreateRayTracingPipelinesNV)vk->vkGetDeviceProcAddr(
+        device, "vkCreateRayTracingPipelinesNV");
+    out->vkGetRayTracingShaderGroupHandlesKHR =
+        (PFN_vkGetRayTracingShaderGroupHandlesKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetRayTracingShaderGroupHandlesKHR");
+    out->vkGetRayTracingShaderGroupHandlesNV =
+        (PFN_vkGetRayTracingShaderGroupHandlesNV)vk->vkGetDeviceProcAddr(
+            device, "vkGetRayTracingShaderGroupHandlesNV");
+    out->vkGetAccelerationStructureHandleNV =
+        (PFN_vkGetAccelerationStructureHandleNV)vk->vkGetDeviceProcAddr(
+            device, "vkGetAccelerationStructureHandleNV");
+    out->vkCmdWriteAccelerationStructuresPropertiesNV =
+        (PFN_vkCmdWriteAccelerationStructuresPropertiesNV)vk->vkGetDeviceProcAddr(
+            device, "vkCmdWriteAccelerationStructuresPropertiesNV");
+    out->vkCompileDeferredNV =
+        (PFN_vkCompileDeferredNV)vk->vkGetDeviceProcAddr(device, "vkCompileDeferredNV");
 #endif
 #ifdef VK_EXT_external_memory_host
-    out->vkGetMemoryHostPointerPropertiesEXT = (PFN_vkGetMemoryHostPointerPropertiesEXT)vk->vkGetDeviceProcAddr(device, "vkGetMemoryHostPointerPropertiesEXT");
+    out->vkGetMemoryHostPointerPropertiesEXT =
+        (PFN_vkGetMemoryHostPointerPropertiesEXT)vk->vkGetDeviceProcAddr(
+            device, "vkGetMemoryHostPointerPropertiesEXT");
 #endif
 #ifdef VK_AMD_buffer_marker
-    out->vkCmdWriteBufferMarkerAMD = (PFN_vkCmdWriteBufferMarkerAMD)vk->vkGetDeviceProcAddr(device, "vkCmdWriteBufferMarkerAMD");
+    out->vkCmdWriteBufferMarkerAMD =
+        (PFN_vkCmdWriteBufferMarkerAMD)vk->vkGetDeviceProcAddr(device, "vkCmdWriteBufferMarkerAMD");
 #endif
 #ifdef VK_EXT_calibrated_timestamps
-    out->vkGetPhysicalDeviceCalibrateableTimeDomainsEXT = (PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceCalibrateableTimeDomainsEXT");
-    out->vkGetCalibratedTimestampsEXT = (PFN_vkGetCalibratedTimestampsEXT)vk->vkGetDeviceProcAddr(device, "vkGetCalibratedTimestampsEXT");
+    out->vkGetPhysicalDeviceCalibrateableTimeDomainsEXT =
+        (PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceCalibrateableTimeDomainsEXT");
+    out->vkGetCalibratedTimestampsEXT = (PFN_vkGetCalibratedTimestampsEXT)vk->vkGetDeviceProcAddr(
+        device, "vkGetCalibratedTimestampsEXT");
 #endif
 #ifdef VK_NV_mesh_shader
-    out->vkCmdDrawMeshTasksNV = (PFN_vkCmdDrawMeshTasksNV)vk->vkGetDeviceProcAddr(device, "vkCmdDrawMeshTasksNV");
-    out->vkCmdDrawMeshTasksIndirectNV = (PFN_vkCmdDrawMeshTasksIndirectNV)vk->vkGetDeviceProcAddr(device, "vkCmdDrawMeshTasksIndirectNV");
-    out->vkCmdDrawMeshTasksIndirectCountNV = (PFN_vkCmdDrawMeshTasksIndirectCountNV)vk->vkGetDeviceProcAddr(device, "vkCmdDrawMeshTasksIndirectCountNV");
+    out->vkCmdDrawMeshTasksNV =
+        (PFN_vkCmdDrawMeshTasksNV)vk->vkGetDeviceProcAddr(device, "vkCmdDrawMeshTasksNV");
+    out->vkCmdDrawMeshTasksIndirectNV = (PFN_vkCmdDrawMeshTasksIndirectNV)vk->vkGetDeviceProcAddr(
+        device, "vkCmdDrawMeshTasksIndirectNV");
+    out->vkCmdDrawMeshTasksIndirectCountNV =
+        (PFN_vkCmdDrawMeshTasksIndirectCountNV)vk->vkGetDeviceProcAddr(
+            device, "vkCmdDrawMeshTasksIndirectCountNV");
 #endif
 #ifdef VK_NV_scissor_exclusive
-    out->vkCmdSetExclusiveScissorNV = (PFN_vkCmdSetExclusiveScissorNV)vk->vkGetDeviceProcAddr(device, "vkCmdSetExclusiveScissorNV");
+    out->vkCmdSetExclusiveScissorNV = (PFN_vkCmdSetExclusiveScissorNV)vk->vkGetDeviceProcAddr(
+        device, "vkCmdSetExclusiveScissorNV");
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
-    out->vkCmdSetCheckpointNV = (PFN_vkCmdSetCheckpointNV)vk->vkGetDeviceProcAddr(device, "vkCmdSetCheckpointNV");
-    out->vkGetQueueCheckpointDataNV = (PFN_vkGetQueueCheckpointDataNV)vk->vkGetDeviceProcAddr(device, "vkGetQueueCheckpointDataNV");
+    out->vkCmdSetCheckpointNV =
+        (PFN_vkCmdSetCheckpointNV)vk->vkGetDeviceProcAddr(device, "vkCmdSetCheckpointNV");
+    out->vkGetQueueCheckpointDataNV = (PFN_vkGetQueueCheckpointDataNV)vk->vkGetDeviceProcAddr(
+        device, "vkGetQueueCheckpointDataNV");
 #endif
 #ifdef VK_INTEL_performance_query
-    out->vkInitializePerformanceApiINTEL = (PFN_vkInitializePerformanceApiINTEL)vk->vkGetDeviceProcAddr(device, "vkInitializePerformanceApiINTEL");
-    out->vkUninitializePerformanceApiINTEL = (PFN_vkUninitializePerformanceApiINTEL)vk->vkGetDeviceProcAddr(device, "vkUninitializePerformanceApiINTEL");
-    out->vkCmdSetPerformanceMarkerINTEL = (PFN_vkCmdSetPerformanceMarkerINTEL)vk->vkGetDeviceProcAddr(device, "vkCmdSetPerformanceMarkerINTEL");
-    out->vkCmdSetPerformanceStreamMarkerINTEL = (PFN_vkCmdSetPerformanceStreamMarkerINTEL)vk->vkGetDeviceProcAddr(device, "vkCmdSetPerformanceStreamMarkerINTEL");
-    out->vkCmdSetPerformanceOverrideINTEL = (PFN_vkCmdSetPerformanceOverrideINTEL)vk->vkGetDeviceProcAddr(device, "vkCmdSetPerformanceOverrideINTEL");
-    out->vkAcquirePerformanceConfigurationINTEL = (PFN_vkAcquirePerformanceConfigurationINTEL)vk->vkGetDeviceProcAddr(device, "vkAcquirePerformanceConfigurationINTEL");
-    out->vkReleasePerformanceConfigurationINTEL = (PFN_vkReleasePerformanceConfigurationINTEL)vk->vkGetDeviceProcAddr(device, "vkReleasePerformanceConfigurationINTEL");
-    out->vkQueueSetPerformanceConfigurationINTEL = (PFN_vkQueueSetPerformanceConfigurationINTEL)vk->vkGetDeviceProcAddr(device, "vkQueueSetPerformanceConfigurationINTEL");
-    out->vkGetPerformanceParameterINTEL = (PFN_vkGetPerformanceParameterINTEL)vk->vkGetDeviceProcAddr(device, "vkGetPerformanceParameterINTEL");
+    out->vkInitializePerformanceApiINTEL =
+        (PFN_vkInitializePerformanceApiINTEL)vk->vkGetDeviceProcAddr(
+            device, "vkInitializePerformanceApiINTEL");
+    out->vkUninitializePerformanceApiINTEL =
+        (PFN_vkUninitializePerformanceApiINTEL)vk->vkGetDeviceProcAddr(
+            device, "vkUninitializePerformanceApiINTEL");
+    out->vkCmdSetPerformanceMarkerINTEL =
+        (PFN_vkCmdSetPerformanceMarkerINTEL)vk->vkGetDeviceProcAddr(
+            device, "vkCmdSetPerformanceMarkerINTEL");
+    out->vkCmdSetPerformanceStreamMarkerINTEL =
+        (PFN_vkCmdSetPerformanceStreamMarkerINTEL)vk->vkGetDeviceProcAddr(
+            device, "vkCmdSetPerformanceStreamMarkerINTEL");
+    out->vkCmdSetPerformanceOverrideINTEL =
+        (PFN_vkCmdSetPerformanceOverrideINTEL)vk->vkGetDeviceProcAddr(
+            device, "vkCmdSetPerformanceOverrideINTEL");
+    out->vkAcquirePerformanceConfigurationINTEL =
+        (PFN_vkAcquirePerformanceConfigurationINTEL)vk->vkGetDeviceProcAddr(
+            device, "vkAcquirePerformanceConfigurationINTEL");
+    out->vkReleasePerformanceConfigurationINTEL =
+        (PFN_vkReleasePerformanceConfigurationINTEL)vk->vkGetDeviceProcAddr(
+            device, "vkReleasePerformanceConfigurationINTEL");
+    out->vkQueueSetPerformanceConfigurationINTEL =
+        (PFN_vkQueueSetPerformanceConfigurationINTEL)vk->vkGetDeviceProcAddr(
+            device, "vkQueueSetPerformanceConfigurationINTEL");
+    out->vkGetPerformanceParameterINTEL =
+        (PFN_vkGetPerformanceParameterINTEL)vk->vkGetDeviceProcAddr(
+            device, "vkGetPerformanceParameterINTEL");
 #endif
 #ifdef VK_AMD_display_native_hdr
-    out->vkSetLocalDimmingAMD = (PFN_vkSetLocalDimmingAMD)vk->vkGetDeviceProcAddr(device, "vkSetLocalDimmingAMD");
+    out->vkSetLocalDimmingAMD =
+        (PFN_vkSetLocalDimmingAMD)vk->vkGetDeviceProcAddr(device, "vkSetLocalDimmingAMD");
 #endif
 #ifdef VK_EXT_buffer_device_address
-    out->vkGetBufferDeviceAddressEXT = (PFN_vkGetBufferDeviceAddressEXT)vk->vkGetDeviceProcAddr(device, "vkGetBufferDeviceAddressEXT");
+    out->vkGetBufferDeviceAddressEXT = (PFN_vkGetBufferDeviceAddressEXT)vk->vkGetDeviceProcAddr(
+        device, "vkGetBufferDeviceAddressEXT");
 #endif
 #ifdef VK_EXT_tooling_info
-    out->vkGetPhysicalDeviceToolPropertiesEXT = (PFN_vkGetPhysicalDeviceToolPropertiesEXT)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceToolPropertiesEXT");
+    out->vkGetPhysicalDeviceToolPropertiesEXT =
+        (PFN_vkGetPhysicalDeviceToolPropertiesEXT)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceToolPropertiesEXT");
 #endif
 #ifdef VK_NV_cooperative_matrix
-    out->vkGetPhysicalDeviceCooperativeMatrixPropertiesNV = (PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceCooperativeMatrixPropertiesNV");
+    out->vkGetPhysicalDeviceCooperativeMatrixPropertiesNV =
+        (PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceCooperativeMatrixPropertiesNV");
 #endif
 #ifdef VK_NV_coverage_reduction_mode
-    out->vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV = (PFN_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV");
+    out->vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV =
+        (PFN_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV)
+            vk->vkGetDeviceProcAddr(
+                device, "vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV");
 #endif
 #ifdef VK_EXT_full_screen_exclusive
-    out->vkGetPhysicalDeviceSurfacePresentModes2EXT = (PFN_vkGetPhysicalDeviceSurfacePresentModes2EXT)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceSurfacePresentModes2EXT");
-    out->vkAcquireFullScreenExclusiveModeEXT = (PFN_vkAcquireFullScreenExclusiveModeEXT)vk->vkGetDeviceProcAddr(device, "vkAcquireFullScreenExclusiveModeEXT");
-    out->vkReleaseFullScreenExclusiveModeEXT = (PFN_vkReleaseFullScreenExclusiveModeEXT)vk->vkGetDeviceProcAddr(device, "vkReleaseFullScreenExclusiveModeEXT");
-    out->vkGetDeviceGroupSurfacePresentModes2EXT = (PFN_vkGetDeviceGroupSurfacePresentModes2EXT)vk->vkGetDeviceProcAddr(device, "vkGetDeviceGroupSurfacePresentModes2EXT");
+    out->vkGetPhysicalDeviceSurfacePresentModes2EXT =
+        (PFN_vkGetPhysicalDeviceSurfacePresentModes2EXT)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceSurfacePresentModes2EXT");
+    out->vkAcquireFullScreenExclusiveModeEXT =
+        (PFN_vkAcquireFullScreenExclusiveModeEXT)vk->vkGetDeviceProcAddr(
+            device, "vkAcquireFullScreenExclusiveModeEXT");
+    out->vkReleaseFullScreenExclusiveModeEXT =
+        (PFN_vkReleaseFullScreenExclusiveModeEXT)vk->vkGetDeviceProcAddr(
+            device, "vkReleaseFullScreenExclusiveModeEXT");
+    out->vkGetDeviceGroupSurfacePresentModes2EXT =
+        (PFN_vkGetDeviceGroupSurfacePresentModes2EXT)vk->vkGetDeviceProcAddr(
+            device, "vkGetDeviceGroupSurfacePresentModes2EXT");
 #endif
 #ifdef VK_EXT_line_rasterization
-    out->vkCmdSetLineStippleEXT = (PFN_vkCmdSetLineStippleEXT)vk->vkGetDeviceProcAddr(device, "vkCmdSetLineStippleEXT");
+    out->vkCmdSetLineStippleEXT =
+        (PFN_vkCmdSetLineStippleEXT)vk->vkGetDeviceProcAddr(device, "vkCmdSetLineStippleEXT");
 #endif
 #ifdef VK_EXT_host_query_reset
-    out->vkResetQueryPoolEXT = (PFN_vkResetQueryPoolEXT)vk->vkGetDeviceProcAddr(device, "vkResetQueryPoolEXT");
+    out->vkResetQueryPoolEXT =
+        (PFN_vkResetQueryPoolEXT)vk->vkGetDeviceProcAddr(device, "vkResetQueryPoolEXT");
 #endif
 #ifdef VK_EXT_extended_dynamic_state
-    out->vkCmdSetCullModeEXT = (PFN_vkCmdSetCullModeEXT)vk->vkGetDeviceProcAddr(device, "vkCmdSetCullModeEXT");
-    out->vkCmdSetFrontFaceEXT = (PFN_vkCmdSetFrontFaceEXT)vk->vkGetDeviceProcAddr(device, "vkCmdSetFrontFaceEXT");
-    out->vkCmdSetPrimitiveTopologyEXT = (PFN_vkCmdSetPrimitiveTopologyEXT)vk->vkGetDeviceProcAddr(device, "vkCmdSetPrimitiveTopologyEXT");
-    out->vkCmdSetViewportWithCountEXT = (PFN_vkCmdSetViewportWithCountEXT)vk->vkGetDeviceProcAddr(device, "vkCmdSetViewportWithCountEXT");
-    out->vkCmdSetScissorWithCountEXT = (PFN_vkCmdSetScissorWithCountEXT)vk->vkGetDeviceProcAddr(device, "vkCmdSetScissorWithCountEXT");
-    out->vkCmdBindVertexBuffers2EXT = (PFN_vkCmdBindVertexBuffers2EXT)vk->vkGetDeviceProcAddr(device, "vkCmdBindVertexBuffers2EXT");
-    out->vkCmdSetDepthTestEnableEXT = (PFN_vkCmdSetDepthTestEnableEXT)vk->vkGetDeviceProcAddr(device, "vkCmdSetDepthTestEnableEXT");
-    out->vkCmdSetDepthWriteEnableEXT = (PFN_vkCmdSetDepthWriteEnableEXT)vk->vkGetDeviceProcAddr(device, "vkCmdSetDepthWriteEnableEXT");
-    out->vkCmdSetDepthCompareOpEXT = (PFN_vkCmdSetDepthCompareOpEXT)vk->vkGetDeviceProcAddr(device, "vkCmdSetDepthCompareOpEXT");
-    out->vkCmdSetDepthBoundsTestEnableEXT = (PFN_vkCmdSetDepthBoundsTestEnableEXT)vk->vkGetDeviceProcAddr(device, "vkCmdSetDepthBoundsTestEnableEXT");
-    out->vkCmdSetStencilTestEnableEXT = (PFN_vkCmdSetStencilTestEnableEXT)vk->vkGetDeviceProcAddr(device, "vkCmdSetStencilTestEnableEXT");
-    out->vkCmdSetStencilOpEXT = (PFN_vkCmdSetStencilOpEXT)vk->vkGetDeviceProcAddr(device, "vkCmdSetStencilOpEXT");
+    out->vkCmdSetCullModeEXT =
+        (PFN_vkCmdSetCullModeEXT)vk->vkGetDeviceProcAddr(device, "vkCmdSetCullModeEXT");
+    out->vkCmdSetFrontFaceEXT =
+        (PFN_vkCmdSetFrontFaceEXT)vk->vkGetDeviceProcAddr(device, "vkCmdSetFrontFaceEXT");
+    out->vkCmdSetPrimitiveTopologyEXT = (PFN_vkCmdSetPrimitiveTopologyEXT)vk->vkGetDeviceProcAddr(
+        device, "vkCmdSetPrimitiveTopologyEXT");
+    out->vkCmdSetViewportWithCountEXT = (PFN_vkCmdSetViewportWithCountEXT)vk->vkGetDeviceProcAddr(
+        device, "vkCmdSetViewportWithCountEXT");
+    out->vkCmdSetScissorWithCountEXT = (PFN_vkCmdSetScissorWithCountEXT)vk->vkGetDeviceProcAddr(
+        device, "vkCmdSetScissorWithCountEXT");
+    out->vkCmdBindVertexBuffers2EXT = (PFN_vkCmdBindVertexBuffers2EXT)vk->vkGetDeviceProcAddr(
+        device, "vkCmdBindVertexBuffers2EXT");
+    out->vkCmdSetDepthTestEnableEXT = (PFN_vkCmdSetDepthTestEnableEXT)vk->vkGetDeviceProcAddr(
+        device, "vkCmdSetDepthTestEnableEXT");
+    out->vkCmdSetDepthWriteEnableEXT = (PFN_vkCmdSetDepthWriteEnableEXT)vk->vkGetDeviceProcAddr(
+        device, "vkCmdSetDepthWriteEnableEXT");
+    out->vkCmdSetDepthCompareOpEXT =
+        (PFN_vkCmdSetDepthCompareOpEXT)vk->vkGetDeviceProcAddr(device, "vkCmdSetDepthCompareOpEXT");
+    out->vkCmdSetDepthBoundsTestEnableEXT =
+        (PFN_vkCmdSetDepthBoundsTestEnableEXT)vk->vkGetDeviceProcAddr(
+            device, "vkCmdSetDepthBoundsTestEnableEXT");
+    out->vkCmdSetStencilTestEnableEXT = (PFN_vkCmdSetStencilTestEnableEXT)vk->vkGetDeviceProcAddr(
+        device, "vkCmdSetStencilTestEnableEXT");
+    out->vkCmdSetStencilOpEXT =
+        (PFN_vkCmdSetStencilOpEXT)vk->vkGetDeviceProcAddr(device, "vkCmdSetStencilOpEXT");
 #endif
 #ifdef VK_NV_device_generated_commands
-    out->vkGetGeneratedCommandsMemoryRequirementsNV = (PFN_vkGetGeneratedCommandsMemoryRequirementsNV)vk->vkGetDeviceProcAddr(device, "vkGetGeneratedCommandsMemoryRequirementsNV");
-    out->vkCmdPreprocessGeneratedCommandsNV = (PFN_vkCmdPreprocessGeneratedCommandsNV)vk->vkGetDeviceProcAddr(device, "vkCmdPreprocessGeneratedCommandsNV");
-    out->vkCmdExecuteGeneratedCommandsNV = (PFN_vkCmdExecuteGeneratedCommandsNV)vk->vkGetDeviceProcAddr(device, "vkCmdExecuteGeneratedCommandsNV");
-    out->vkCmdBindPipelineShaderGroupNV = (PFN_vkCmdBindPipelineShaderGroupNV)vk->vkGetDeviceProcAddr(device, "vkCmdBindPipelineShaderGroupNV");
-    out->vkCreateIndirectCommandsLayoutNV = (PFN_vkCreateIndirectCommandsLayoutNV)vk->vkGetDeviceProcAddr(device, "vkCreateIndirectCommandsLayoutNV");
-    out->vkDestroyIndirectCommandsLayoutNV = (PFN_vkDestroyIndirectCommandsLayoutNV)vk->vkGetDeviceProcAddr(device, "vkDestroyIndirectCommandsLayoutNV");
+    out->vkGetGeneratedCommandsMemoryRequirementsNV =
+        (PFN_vkGetGeneratedCommandsMemoryRequirementsNV)vk->vkGetDeviceProcAddr(
+            device, "vkGetGeneratedCommandsMemoryRequirementsNV");
+    out->vkCmdPreprocessGeneratedCommandsNV =
+        (PFN_vkCmdPreprocessGeneratedCommandsNV)vk->vkGetDeviceProcAddr(
+            device, "vkCmdPreprocessGeneratedCommandsNV");
+    out->vkCmdExecuteGeneratedCommandsNV =
+        (PFN_vkCmdExecuteGeneratedCommandsNV)vk->vkGetDeviceProcAddr(
+            device, "vkCmdExecuteGeneratedCommandsNV");
+    out->vkCmdBindPipelineShaderGroupNV =
+        (PFN_vkCmdBindPipelineShaderGroupNV)vk->vkGetDeviceProcAddr(
+            device, "vkCmdBindPipelineShaderGroupNV");
+    out->vkCreateIndirectCommandsLayoutNV =
+        (PFN_vkCreateIndirectCommandsLayoutNV)vk->vkGetDeviceProcAddr(
+            device, "vkCreateIndirectCommandsLayoutNV");
+    out->vkDestroyIndirectCommandsLayoutNV =
+        (PFN_vkDestroyIndirectCommandsLayoutNV)vk->vkGetDeviceProcAddr(
+            device, "vkDestroyIndirectCommandsLayoutNV");
 #endif
 #ifdef VK_EXT_acquire_drm_display
-    out->vkAcquireDrmDisplayEXT = (PFN_vkAcquireDrmDisplayEXT)vk->vkGetDeviceProcAddr(device, "vkAcquireDrmDisplayEXT");
-    out->vkGetDrmDisplayEXT = (PFN_vkGetDrmDisplayEXT)vk->vkGetDeviceProcAddr(device, "vkGetDrmDisplayEXT");
+    out->vkAcquireDrmDisplayEXT =
+        (PFN_vkAcquireDrmDisplayEXT)vk->vkGetDeviceProcAddr(device, "vkAcquireDrmDisplayEXT");
+    out->vkGetDrmDisplayEXT =
+        (PFN_vkGetDrmDisplayEXT)vk->vkGetDeviceProcAddr(device, "vkGetDrmDisplayEXT");
 #endif
 #ifdef VK_EXT_private_data
-    out->vkCreatePrivateDataSlotEXT = (PFN_vkCreatePrivateDataSlotEXT)vk->vkGetDeviceProcAddr(device, "vkCreatePrivateDataSlotEXT");
-    out->vkDestroyPrivateDataSlotEXT = (PFN_vkDestroyPrivateDataSlotEXT)vk->vkGetDeviceProcAddr(device, "vkDestroyPrivateDataSlotEXT");
-    out->vkSetPrivateDataEXT = (PFN_vkSetPrivateDataEXT)vk->vkGetDeviceProcAddr(device, "vkSetPrivateDataEXT");
-    out->vkGetPrivateDataEXT = (PFN_vkGetPrivateDataEXT)vk->vkGetDeviceProcAddr(device, "vkGetPrivateDataEXT");
+    out->vkCreatePrivateDataSlotEXT = (PFN_vkCreatePrivateDataSlotEXT)vk->vkGetDeviceProcAddr(
+        device, "vkCreatePrivateDataSlotEXT");
+    out->vkDestroyPrivateDataSlotEXT = (PFN_vkDestroyPrivateDataSlotEXT)vk->vkGetDeviceProcAddr(
+        device, "vkDestroyPrivateDataSlotEXT");
+    out->vkSetPrivateDataEXT =
+        (PFN_vkSetPrivateDataEXT)vk->vkGetDeviceProcAddr(device, "vkSetPrivateDataEXT");
+    out->vkGetPrivateDataEXT =
+        (PFN_vkGetPrivateDataEXT)vk->vkGetDeviceProcAddr(device, "vkGetPrivateDataEXT");
 #endif
 #ifdef VK_NV_fragment_shading_rate_enums
-    out->vkCmdSetFragmentShadingRateEnumNV = (PFN_vkCmdSetFragmentShadingRateEnumNV)vk->vkGetDeviceProcAddr(device, "vkCmdSetFragmentShadingRateEnumNV");
+    out->vkCmdSetFragmentShadingRateEnumNV =
+        (PFN_vkCmdSetFragmentShadingRateEnumNV)vk->vkGetDeviceProcAddr(
+            device, "vkCmdSetFragmentShadingRateEnumNV");
 #endif
 #ifdef VK_NV_acquire_winrt_display
-    out->vkAcquireWinrtDisplayNV = (PFN_vkAcquireWinrtDisplayNV)vk->vkGetDeviceProcAddr(device, "vkAcquireWinrtDisplayNV");
-    out->vkGetWinrtDisplayNV = (PFN_vkGetWinrtDisplayNV)vk->vkGetDeviceProcAddr(device, "vkGetWinrtDisplayNV");
+    out->vkAcquireWinrtDisplayNV =
+        (PFN_vkAcquireWinrtDisplayNV)vk->vkGetDeviceProcAddr(device, "vkAcquireWinrtDisplayNV");
+    out->vkGetWinrtDisplayNV =
+        (PFN_vkGetWinrtDisplayNV)vk->vkGetDeviceProcAddr(device, "vkGetWinrtDisplayNV");
 #endif
 #ifdef VK_EXT_directfb_surface
-    out->vkGetPhysicalDeviceDirectFBPresentationSupportEXT = (PFN_vkGetPhysicalDeviceDirectFBPresentationSupportEXT)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceDirectFBPresentationSupportEXT");
+    out->vkGetPhysicalDeviceDirectFBPresentationSupportEXT =
+        (PFN_vkGetPhysicalDeviceDirectFBPresentationSupportEXT)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceDirectFBPresentationSupportEXT");
 #endif
 #ifdef VK_EXT_vertex_input_dynamic_state
-    out->vkCmdSetVertexInputEXT = (PFN_vkCmdSetVertexInputEXT)vk->vkGetDeviceProcAddr(device, "vkCmdSetVertexInputEXT");
+    out->vkCmdSetVertexInputEXT =
+        (PFN_vkCmdSetVertexInputEXT)vk->vkGetDeviceProcAddr(device, "vkCmdSetVertexInputEXT");
 #endif
 #ifdef VK_FUCHSIA_external_memory
-    out->vkGetMemoryZirconHandleFUCHSIA = (PFN_vkGetMemoryZirconHandleFUCHSIA)vk->vkGetDeviceProcAddr(device, "vkGetMemoryZirconHandleFUCHSIA");
-    out->vkGetMemoryZirconHandlePropertiesFUCHSIA = (PFN_vkGetMemoryZirconHandlePropertiesFUCHSIA)vk->vkGetDeviceProcAddr(device, "vkGetMemoryZirconHandlePropertiesFUCHSIA");
+    out->vkGetMemoryZirconHandleFUCHSIA =
+        (PFN_vkGetMemoryZirconHandleFUCHSIA)vk->vkGetDeviceProcAddr(
+            device, "vkGetMemoryZirconHandleFUCHSIA");
+    out->vkGetMemoryZirconHandlePropertiesFUCHSIA =
+        (PFN_vkGetMemoryZirconHandlePropertiesFUCHSIA)vk->vkGetDeviceProcAddr(
+            device, "vkGetMemoryZirconHandlePropertiesFUCHSIA");
 #endif
 #ifdef VK_FUCHSIA_external_semaphore
-    out->vkImportSemaphoreZirconHandleFUCHSIA = (PFN_vkImportSemaphoreZirconHandleFUCHSIA)vk->vkGetDeviceProcAddr(device, "vkImportSemaphoreZirconHandleFUCHSIA");
-    out->vkGetSemaphoreZirconHandleFUCHSIA = (PFN_vkGetSemaphoreZirconHandleFUCHSIA)vk->vkGetDeviceProcAddr(device, "vkGetSemaphoreZirconHandleFUCHSIA");
+    out->vkImportSemaphoreZirconHandleFUCHSIA =
+        (PFN_vkImportSemaphoreZirconHandleFUCHSIA)vk->vkGetDeviceProcAddr(
+            device, "vkImportSemaphoreZirconHandleFUCHSIA");
+    out->vkGetSemaphoreZirconHandleFUCHSIA =
+        (PFN_vkGetSemaphoreZirconHandleFUCHSIA)vk->vkGetDeviceProcAddr(
+            device, "vkGetSemaphoreZirconHandleFUCHSIA");
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
-    out->vkCreateBufferCollectionFUCHSIA = (PFN_vkCreateBufferCollectionFUCHSIA)vk->vkGetDeviceProcAddr(device, "vkCreateBufferCollectionFUCHSIA");
-    out->vkSetBufferCollectionImageConstraintsFUCHSIA = (PFN_vkSetBufferCollectionImageConstraintsFUCHSIA)vk->vkGetDeviceProcAddr(device, "vkSetBufferCollectionImageConstraintsFUCHSIA");
-    out->vkSetBufferCollectionBufferConstraintsFUCHSIA = (PFN_vkSetBufferCollectionBufferConstraintsFUCHSIA)vk->vkGetDeviceProcAddr(device, "vkSetBufferCollectionBufferConstraintsFUCHSIA");
-    out->vkDestroyBufferCollectionFUCHSIA = (PFN_vkDestroyBufferCollectionFUCHSIA)vk->vkGetDeviceProcAddr(device, "vkDestroyBufferCollectionFUCHSIA");
-    out->vkGetBufferCollectionPropertiesFUCHSIA = (PFN_vkGetBufferCollectionPropertiesFUCHSIA)vk->vkGetDeviceProcAddr(device, "vkGetBufferCollectionPropertiesFUCHSIA");
+    out->vkCreateBufferCollectionFUCHSIA =
+        (PFN_vkCreateBufferCollectionFUCHSIA)vk->vkGetDeviceProcAddr(
+            device, "vkCreateBufferCollectionFUCHSIA");
+    out->vkSetBufferCollectionImageConstraintsFUCHSIA =
+        (PFN_vkSetBufferCollectionImageConstraintsFUCHSIA)vk->vkGetDeviceProcAddr(
+            device, "vkSetBufferCollectionImageConstraintsFUCHSIA");
+    out->vkSetBufferCollectionBufferConstraintsFUCHSIA =
+        (PFN_vkSetBufferCollectionBufferConstraintsFUCHSIA)vk->vkGetDeviceProcAddr(
+            device, "vkSetBufferCollectionBufferConstraintsFUCHSIA");
+    out->vkDestroyBufferCollectionFUCHSIA =
+        (PFN_vkDestroyBufferCollectionFUCHSIA)vk->vkGetDeviceProcAddr(
+            device, "vkDestroyBufferCollectionFUCHSIA");
+    out->vkGetBufferCollectionPropertiesFUCHSIA =
+        (PFN_vkGetBufferCollectionPropertiesFUCHSIA)vk->vkGetDeviceProcAddr(
+            device, "vkGetBufferCollectionPropertiesFUCHSIA");
 #endif
 #ifdef VK_HUAWEI_subpass_shading
-    out->vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI = (PFN_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI)vk->vkGetDeviceProcAddr(device, "vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI");
-    out->vkCmdSubpassShadingHUAWEI = (PFN_vkCmdSubpassShadingHUAWEI)vk->vkGetDeviceProcAddr(device, "vkCmdSubpassShadingHUAWEI");
+    out->vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI =
+        (PFN_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI)vk->vkGetDeviceProcAddr(
+            device, "vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI");
+    out->vkCmdSubpassShadingHUAWEI =
+        (PFN_vkCmdSubpassShadingHUAWEI)vk->vkGetDeviceProcAddr(device, "vkCmdSubpassShadingHUAWEI");
 #endif
 #ifdef VK_HUAWEI_invocation_mask
-    out->vkCmdBindInvocationMaskHUAWEI = (PFN_vkCmdBindInvocationMaskHUAWEI)vk->vkGetDeviceProcAddr(device, "vkCmdBindInvocationMaskHUAWEI");
+    out->vkCmdBindInvocationMaskHUAWEI = (PFN_vkCmdBindInvocationMaskHUAWEI)vk->vkGetDeviceProcAddr(
+        device, "vkCmdBindInvocationMaskHUAWEI");
 #endif
 #ifdef VK_NV_external_memory_rdma
-    out->vkGetMemoryRemoteAddressNV = (PFN_vkGetMemoryRemoteAddressNV)vk->vkGetDeviceProcAddr(device, "vkGetMemoryRemoteAddressNV");
+    out->vkGetMemoryRemoteAddressNV = (PFN_vkGetMemoryRemoteAddressNV)vk->vkGetDeviceProcAddr(
+        device, "vkGetMemoryRemoteAddressNV");
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
-    out->vkCmdSetPatchControlPointsEXT = (PFN_vkCmdSetPatchControlPointsEXT)vk->vkGetDeviceProcAddr(device, "vkCmdSetPatchControlPointsEXT");
-    out->vkCmdSetRasterizerDiscardEnableEXT = (PFN_vkCmdSetRasterizerDiscardEnableEXT)vk->vkGetDeviceProcAddr(device, "vkCmdSetRasterizerDiscardEnableEXT");
-    out->vkCmdSetDepthBiasEnableEXT = (PFN_vkCmdSetDepthBiasEnableEXT)vk->vkGetDeviceProcAddr(device, "vkCmdSetDepthBiasEnableEXT");
-    out->vkCmdSetLogicOpEXT = (PFN_vkCmdSetLogicOpEXT)vk->vkGetDeviceProcAddr(device, "vkCmdSetLogicOpEXT");
-    out->vkCmdSetPrimitiveRestartEnableEXT = (PFN_vkCmdSetPrimitiveRestartEnableEXT)vk->vkGetDeviceProcAddr(device, "vkCmdSetPrimitiveRestartEnableEXT");
+    out->vkCmdSetPatchControlPointsEXT = (PFN_vkCmdSetPatchControlPointsEXT)vk->vkGetDeviceProcAddr(
+        device, "vkCmdSetPatchControlPointsEXT");
+    out->vkCmdSetRasterizerDiscardEnableEXT =
+        (PFN_vkCmdSetRasterizerDiscardEnableEXT)vk->vkGetDeviceProcAddr(
+            device, "vkCmdSetRasterizerDiscardEnableEXT");
+    out->vkCmdSetDepthBiasEnableEXT = (PFN_vkCmdSetDepthBiasEnableEXT)vk->vkGetDeviceProcAddr(
+        device, "vkCmdSetDepthBiasEnableEXT");
+    out->vkCmdSetLogicOpEXT =
+        (PFN_vkCmdSetLogicOpEXT)vk->vkGetDeviceProcAddr(device, "vkCmdSetLogicOpEXT");
+    out->vkCmdSetPrimitiveRestartEnableEXT =
+        (PFN_vkCmdSetPrimitiveRestartEnableEXT)vk->vkGetDeviceProcAddr(
+            device, "vkCmdSetPrimitiveRestartEnableEXT");
 #endif
 #ifdef VK_QNX_screen_surface
-    out->vkGetPhysicalDeviceScreenPresentationSupportQNX = (PFN_vkGetPhysicalDeviceScreenPresentationSupportQNX)vk->vkGetDeviceProcAddr(device, "vkGetPhysicalDeviceScreenPresentationSupportQNX");
+    out->vkGetPhysicalDeviceScreenPresentationSupportQNX =
+        (PFN_vkGetPhysicalDeviceScreenPresentationSupportQNX)vk->vkGetDeviceProcAddr(
+            device, "vkGetPhysicalDeviceScreenPresentationSupportQNX");
 #endif
 #ifdef VK_EXT_color_write_enable
-    out->vkCmdSetColorWriteEnableEXT = (PFN_vkCmdSetColorWriteEnableEXT)vk->vkGetDeviceProcAddr(device, "vkCmdSetColorWriteEnableEXT");
+    out->vkCmdSetColorWriteEnableEXT = (PFN_vkCmdSetColorWriteEnableEXT)vk->vkGetDeviceProcAddr(
+        device, "vkCmdSetColorWriteEnableEXT");
 #endif
 #ifdef VK_GOOGLE_gfxstream
-    out->vkRegisterImageColorBufferGOOGLE = (PFN_vkRegisterImageColorBufferGOOGLE)vk->vkGetDeviceProcAddr(device, "vkRegisterImageColorBufferGOOGLE");
-    out->vkRegisterBufferColorBufferGOOGLE = (PFN_vkRegisterBufferColorBufferGOOGLE)vk->vkGetDeviceProcAddr(device, "vkRegisterBufferColorBufferGOOGLE");
-    out->vkMapMemoryIntoAddressSpaceGOOGLE = (PFN_vkMapMemoryIntoAddressSpaceGOOGLE)vk->vkGetDeviceProcAddr(device, "vkMapMemoryIntoAddressSpaceGOOGLE");
-    out->vkUpdateDescriptorSetWithTemplateSizedGOOGLE = (PFN_vkUpdateDescriptorSetWithTemplateSizedGOOGLE)vk->vkGetDeviceProcAddr(device, "vkUpdateDescriptorSetWithTemplateSizedGOOGLE");
-    out->vkBeginCommandBufferAsyncGOOGLE = (PFN_vkBeginCommandBufferAsyncGOOGLE)vk->vkGetDeviceProcAddr(device, "vkBeginCommandBufferAsyncGOOGLE");
-    out->vkEndCommandBufferAsyncGOOGLE = (PFN_vkEndCommandBufferAsyncGOOGLE)vk->vkGetDeviceProcAddr(device, "vkEndCommandBufferAsyncGOOGLE");
-    out->vkResetCommandBufferAsyncGOOGLE = (PFN_vkResetCommandBufferAsyncGOOGLE)vk->vkGetDeviceProcAddr(device, "vkResetCommandBufferAsyncGOOGLE");
-    out->vkCommandBufferHostSyncGOOGLE = (PFN_vkCommandBufferHostSyncGOOGLE)vk->vkGetDeviceProcAddr(device, "vkCommandBufferHostSyncGOOGLE");
-    out->vkCreateImageWithRequirementsGOOGLE = (PFN_vkCreateImageWithRequirementsGOOGLE)vk->vkGetDeviceProcAddr(device, "vkCreateImageWithRequirementsGOOGLE");
-    out->vkCreateBufferWithRequirementsGOOGLE = (PFN_vkCreateBufferWithRequirementsGOOGLE)vk->vkGetDeviceProcAddr(device, "vkCreateBufferWithRequirementsGOOGLE");
-    out->vkGetMemoryHostAddressInfoGOOGLE = (PFN_vkGetMemoryHostAddressInfoGOOGLE)vk->vkGetDeviceProcAddr(device, "vkGetMemoryHostAddressInfoGOOGLE");
-    out->vkFreeMemorySyncGOOGLE = (PFN_vkFreeMemorySyncGOOGLE)vk->vkGetDeviceProcAddr(device, "vkFreeMemorySyncGOOGLE");
-    out->vkQueueHostSyncGOOGLE = (PFN_vkQueueHostSyncGOOGLE)vk->vkGetDeviceProcAddr(device, "vkQueueHostSyncGOOGLE");
-    out->vkQueueSubmitAsyncGOOGLE = (PFN_vkQueueSubmitAsyncGOOGLE)vk->vkGetDeviceProcAddr(device, "vkQueueSubmitAsyncGOOGLE");
-    out->vkQueueWaitIdleAsyncGOOGLE = (PFN_vkQueueWaitIdleAsyncGOOGLE)vk->vkGetDeviceProcAddr(device, "vkQueueWaitIdleAsyncGOOGLE");
-    out->vkQueueBindSparseAsyncGOOGLE = (PFN_vkQueueBindSparseAsyncGOOGLE)vk->vkGetDeviceProcAddr(device, "vkQueueBindSparseAsyncGOOGLE");
-    out->vkGetLinearImageLayoutGOOGLE = (PFN_vkGetLinearImageLayoutGOOGLE)vk->vkGetDeviceProcAddr(device, "vkGetLinearImageLayoutGOOGLE");
-    out->vkGetLinearImageLayout2GOOGLE = (PFN_vkGetLinearImageLayout2GOOGLE)vk->vkGetDeviceProcAddr(device, "vkGetLinearImageLayout2GOOGLE");
-    out->vkQueueFlushCommandsGOOGLE = (PFN_vkQueueFlushCommandsGOOGLE)vk->vkGetDeviceProcAddr(device, "vkQueueFlushCommandsGOOGLE");
-    out->vkQueueCommitDescriptorSetUpdatesGOOGLE = (PFN_vkQueueCommitDescriptorSetUpdatesGOOGLE)vk->vkGetDeviceProcAddr(device, "vkQueueCommitDescriptorSetUpdatesGOOGLE");
-    out->vkCollectDescriptorPoolIdsGOOGLE = (PFN_vkCollectDescriptorPoolIdsGOOGLE)vk->vkGetDeviceProcAddr(device, "vkCollectDescriptorPoolIdsGOOGLE");
-    out->vkQueueSignalReleaseImageANDROIDAsyncGOOGLE = (PFN_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE)vk->vkGetDeviceProcAddr(device, "vkQueueSignalReleaseImageANDROIDAsyncGOOGLE");
+    out->vkRegisterImageColorBufferGOOGLE =
+        (PFN_vkRegisterImageColorBufferGOOGLE)vk->vkGetDeviceProcAddr(
+            device, "vkRegisterImageColorBufferGOOGLE");
+    out->vkRegisterBufferColorBufferGOOGLE =
+        (PFN_vkRegisterBufferColorBufferGOOGLE)vk->vkGetDeviceProcAddr(
+            device, "vkRegisterBufferColorBufferGOOGLE");
+    out->vkMapMemoryIntoAddressSpaceGOOGLE =
+        (PFN_vkMapMemoryIntoAddressSpaceGOOGLE)vk->vkGetDeviceProcAddr(
+            device, "vkMapMemoryIntoAddressSpaceGOOGLE");
+    out->vkUpdateDescriptorSetWithTemplateSizedGOOGLE =
+        (PFN_vkUpdateDescriptorSetWithTemplateSizedGOOGLE)vk->vkGetDeviceProcAddr(
+            device, "vkUpdateDescriptorSetWithTemplateSizedGOOGLE");
+    out->vkBeginCommandBufferAsyncGOOGLE =
+        (PFN_vkBeginCommandBufferAsyncGOOGLE)vk->vkGetDeviceProcAddr(
+            device, "vkBeginCommandBufferAsyncGOOGLE");
+    out->vkEndCommandBufferAsyncGOOGLE = (PFN_vkEndCommandBufferAsyncGOOGLE)vk->vkGetDeviceProcAddr(
+        device, "vkEndCommandBufferAsyncGOOGLE");
+    out->vkResetCommandBufferAsyncGOOGLE =
+        (PFN_vkResetCommandBufferAsyncGOOGLE)vk->vkGetDeviceProcAddr(
+            device, "vkResetCommandBufferAsyncGOOGLE");
+    out->vkCommandBufferHostSyncGOOGLE = (PFN_vkCommandBufferHostSyncGOOGLE)vk->vkGetDeviceProcAddr(
+        device, "vkCommandBufferHostSyncGOOGLE");
+    out->vkCreateImageWithRequirementsGOOGLE =
+        (PFN_vkCreateImageWithRequirementsGOOGLE)vk->vkGetDeviceProcAddr(
+            device, "vkCreateImageWithRequirementsGOOGLE");
+    out->vkCreateBufferWithRequirementsGOOGLE =
+        (PFN_vkCreateBufferWithRequirementsGOOGLE)vk->vkGetDeviceProcAddr(
+            device, "vkCreateBufferWithRequirementsGOOGLE");
+    out->vkGetMemoryHostAddressInfoGOOGLE =
+        (PFN_vkGetMemoryHostAddressInfoGOOGLE)vk->vkGetDeviceProcAddr(
+            device, "vkGetMemoryHostAddressInfoGOOGLE");
+    out->vkFreeMemorySyncGOOGLE =
+        (PFN_vkFreeMemorySyncGOOGLE)vk->vkGetDeviceProcAddr(device, "vkFreeMemorySyncGOOGLE");
+    out->vkQueueHostSyncGOOGLE =
+        (PFN_vkQueueHostSyncGOOGLE)vk->vkGetDeviceProcAddr(device, "vkQueueHostSyncGOOGLE");
+    out->vkQueueSubmitAsyncGOOGLE =
+        (PFN_vkQueueSubmitAsyncGOOGLE)vk->vkGetDeviceProcAddr(device, "vkQueueSubmitAsyncGOOGLE");
+    out->vkQueueWaitIdleAsyncGOOGLE = (PFN_vkQueueWaitIdleAsyncGOOGLE)vk->vkGetDeviceProcAddr(
+        device, "vkQueueWaitIdleAsyncGOOGLE");
+    out->vkQueueBindSparseAsyncGOOGLE = (PFN_vkQueueBindSparseAsyncGOOGLE)vk->vkGetDeviceProcAddr(
+        device, "vkQueueBindSparseAsyncGOOGLE");
+    out->vkGetLinearImageLayoutGOOGLE = (PFN_vkGetLinearImageLayoutGOOGLE)vk->vkGetDeviceProcAddr(
+        device, "vkGetLinearImageLayoutGOOGLE");
+    out->vkGetLinearImageLayout2GOOGLE = (PFN_vkGetLinearImageLayout2GOOGLE)vk->vkGetDeviceProcAddr(
+        device, "vkGetLinearImageLayout2GOOGLE");
+    out->vkQueueFlushCommandsGOOGLE = (PFN_vkQueueFlushCommandsGOOGLE)vk->vkGetDeviceProcAddr(
+        device, "vkQueueFlushCommandsGOOGLE");
+    out->vkQueueCommitDescriptorSetUpdatesGOOGLE =
+        (PFN_vkQueueCommitDescriptorSetUpdatesGOOGLE)vk->vkGetDeviceProcAddr(
+            device, "vkQueueCommitDescriptorSetUpdatesGOOGLE");
+    out->vkCollectDescriptorPoolIdsGOOGLE =
+        (PFN_vkCollectDescriptorPoolIdsGOOGLE)vk->vkGetDeviceProcAddr(
+            device, "vkCollectDescriptorPoolIdsGOOGLE");
+    out->vkQueueSignalReleaseImageANDROIDAsyncGOOGLE =
+        (PFN_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE)vk->vkGetDeviceProcAddr(
+            device, "vkQueueSignalReleaseImageANDROIDAsyncGOOGLE");
 #endif
 #ifdef VK_EXT_multi_draw
-    out->vkCmdDrawMultiEXT = (PFN_vkCmdDrawMultiEXT)vk->vkGetDeviceProcAddr(device, "vkCmdDrawMultiEXT");
-    out->vkCmdDrawMultiIndexedEXT = (PFN_vkCmdDrawMultiIndexedEXT)vk->vkGetDeviceProcAddr(device, "vkCmdDrawMultiIndexedEXT");
+    out->vkCmdDrawMultiEXT =
+        (PFN_vkCmdDrawMultiEXT)vk->vkGetDeviceProcAddr(device, "vkCmdDrawMultiEXT");
+    out->vkCmdDrawMultiIndexedEXT =
+        (PFN_vkCmdDrawMultiIndexedEXT)vk->vkGetDeviceProcAddr(device, "vkCmdDrawMultiIndexedEXT");
 #endif
 #ifdef VK_EXT_pageable_device_local_memory
-    out->vkSetDeviceMemoryPriorityEXT = (PFN_vkSetDeviceMemoryPriorityEXT)vk->vkGetDeviceProcAddr(device, "vkSetDeviceMemoryPriorityEXT");
+    out->vkSetDeviceMemoryPriorityEXT = (PFN_vkSetDeviceMemoryPriorityEXT)vk->vkGetDeviceProcAddr(
+        device, "vkSetDeviceMemoryPriorityEXT");
 #endif
 #ifdef VK_KHR_acceleration_structure
-    out->vkCreateAccelerationStructureKHR = (PFN_vkCreateAccelerationStructureKHR)vk->vkGetDeviceProcAddr(device, "vkCreateAccelerationStructureKHR");
-    out->vkDestroyAccelerationStructureKHR = (PFN_vkDestroyAccelerationStructureKHR)vk->vkGetDeviceProcAddr(device, "vkDestroyAccelerationStructureKHR");
-    out->vkCmdBuildAccelerationStructuresKHR = (PFN_vkCmdBuildAccelerationStructuresKHR)vk->vkGetDeviceProcAddr(device, "vkCmdBuildAccelerationStructuresKHR");
-    out->vkCmdBuildAccelerationStructuresIndirectKHR = (PFN_vkCmdBuildAccelerationStructuresIndirectKHR)vk->vkGetDeviceProcAddr(device, "vkCmdBuildAccelerationStructuresIndirectKHR");
-    out->vkBuildAccelerationStructuresKHR = (PFN_vkBuildAccelerationStructuresKHR)vk->vkGetDeviceProcAddr(device, "vkBuildAccelerationStructuresKHR");
-    out->vkCopyAccelerationStructureKHR = (PFN_vkCopyAccelerationStructureKHR)vk->vkGetDeviceProcAddr(device, "vkCopyAccelerationStructureKHR");
-    out->vkCopyAccelerationStructureToMemoryKHR = (PFN_vkCopyAccelerationStructureToMemoryKHR)vk->vkGetDeviceProcAddr(device, "vkCopyAccelerationStructureToMemoryKHR");
-    out->vkCopyMemoryToAccelerationStructureKHR = (PFN_vkCopyMemoryToAccelerationStructureKHR)vk->vkGetDeviceProcAddr(device, "vkCopyMemoryToAccelerationStructureKHR");
-    out->vkWriteAccelerationStructuresPropertiesKHR = (PFN_vkWriteAccelerationStructuresPropertiesKHR)vk->vkGetDeviceProcAddr(device, "vkWriteAccelerationStructuresPropertiesKHR");
-    out->vkCmdCopyAccelerationStructureKHR = (PFN_vkCmdCopyAccelerationStructureKHR)vk->vkGetDeviceProcAddr(device, "vkCmdCopyAccelerationStructureKHR");
-    out->vkCmdCopyAccelerationStructureToMemoryKHR = (PFN_vkCmdCopyAccelerationStructureToMemoryKHR)vk->vkGetDeviceProcAddr(device, "vkCmdCopyAccelerationStructureToMemoryKHR");
-    out->vkCmdCopyMemoryToAccelerationStructureKHR = (PFN_vkCmdCopyMemoryToAccelerationStructureKHR)vk->vkGetDeviceProcAddr(device, "vkCmdCopyMemoryToAccelerationStructureKHR");
-    out->vkGetAccelerationStructureDeviceAddressKHR = (PFN_vkGetAccelerationStructureDeviceAddressKHR)vk->vkGetDeviceProcAddr(device, "vkGetAccelerationStructureDeviceAddressKHR");
-    out->vkCmdWriteAccelerationStructuresPropertiesKHR = (PFN_vkCmdWriteAccelerationStructuresPropertiesKHR)vk->vkGetDeviceProcAddr(device, "vkCmdWriteAccelerationStructuresPropertiesKHR");
-    out->vkGetDeviceAccelerationStructureCompatibilityKHR = (PFN_vkGetDeviceAccelerationStructureCompatibilityKHR)vk->vkGetDeviceProcAddr(device, "vkGetDeviceAccelerationStructureCompatibilityKHR");
-    out->vkGetAccelerationStructureBuildSizesKHR = (PFN_vkGetAccelerationStructureBuildSizesKHR)vk->vkGetDeviceProcAddr(device, "vkGetAccelerationStructureBuildSizesKHR");
+    out->vkCreateAccelerationStructureKHR =
+        (PFN_vkCreateAccelerationStructureKHR)vk->vkGetDeviceProcAddr(
+            device, "vkCreateAccelerationStructureKHR");
+    out->vkDestroyAccelerationStructureKHR =
+        (PFN_vkDestroyAccelerationStructureKHR)vk->vkGetDeviceProcAddr(
+            device, "vkDestroyAccelerationStructureKHR");
+    out->vkCmdBuildAccelerationStructuresKHR =
+        (PFN_vkCmdBuildAccelerationStructuresKHR)vk->vkGetDeviceProcAddr(
+            device, "vkCmdBuildAccelerationStructuresKHR");
+    out->vkCmdBuildAccelerationStructuresIndirectKHR =
+        (PFN_vkCmdBuildAccelerationStructuresIndirectKHR)vk->vkGetDeviceProcAddr(
+            device, "vkCmdBuildAccelerationStructuresIndirectKHR");
+    out->vkBuildAccelerationStructuresKHR =
+        (PFN_vkBuildAccelerationStructuresKHR)vk->vkGetDeviceProcAddr(
+            device, "vkBuildAccelerationStructuresKHR");
+    out->vkCopyAccelerationStructureKHR =
+        (PFN_vkCopyAccelerationStructureKHR)vk->vkGetDeviceProcAddr(
+            device, "vkCopyAccelerationStructureKHR");
+    out->vkCopyAccelerationStructureToMemoryKHR =
+        (PFN_vkCopyAccelerationStructureToMemoryKHR)vk->vkGetDeviceProcAddr(
+            device, "vkCopyAccelerationStructureToMemoryKHR");
+    out->vkCopyMemoryToAccelerationStructureKHR =
+        (PFN_vkCopyMemoryToAccelerationStructureKHR)vk->vkGetDeviceProcAddr(
+            device, "vkCopyMemoryToAccelerationStructureKHR");
+    out->vkWriteAccelerationStructuresPropertiesKHR =
+        (PFN_vkWriteAccelerationStructuresPropertiesKHR)vk->vkGetDeviceProcAddr(
+            device, "vkWriteAccelerationStructuresPropertiesKHR");
+    out->vkCmdCopyAccelerationStructureKHR =
+        (PFN_vkCmdCopyAccelerationStructureKHR)vk->vkGetDeviceProcAddr(
+            device, "vkCmdCopyAccelerationStructureKHR");
+    out->vkCmdCopyAccelerationStructureToMemoryKHR =
+        (PFN_vkCmdCopyAccelerationStructureToMemoryKHR)vk->vkGetDeviceProcAddr(
+            device, "vkCmdCopyAccelerationStructureToMemoryKHR");
+    out->vkCmdCopyMemoryToAccelerationStructureKHR =
+        (PFN_vkCmdCopyMemoryToAccelerationStructureKHR)vk->vkGetDeviceProcAddr(
+            device, "vkCmdCopyMemoryToAccelerationStructureKHR");
+    out->vkGetAccelerationStructureDeviceAddressKHR =
+        (PFN_vkGetAccelerationStructureDeviceAddressKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetAccelerationStructureDeviceAddressKHR");
+    out->vkCmdWriteAccelerationStructuresPropertiesKHR =
+        (PFN_vkCmdWriteAccelerationStructuresPropertiesKHR)vk->vkGetDeviceProcAddr(
+            device, "vkCmdWriteAccelerationStructuresPropertiesKHR");
+    out->vkGetDeviceAccelerationStructureCompatibilityKHR =
+        (PFN_vkGetDeviceAccelerationStructureCompatibilityKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetDeviceAccelerationStructureCompatibilityKHR");
+    out->vkGetAccelerationStructureBuildSizesKHR =
+        (PFN_vkGetAccelerationStructureBuildSizesKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetAccelerationStructureBuildSizesKHR");
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
-    out->vkCmdTraceRaysKHR = (PFN_vkCmdTraceRaysKHR)vk->vkGetDeviceProcAddr(device, "vkCmdTraceRaysKHR");
-    out->vkCreateRayTracingPipelinesKHR = (PFN_vkCreateRayTracingPipelinesKHR)vk->vkGetDeviceProcAddr(device, "vkCreateRayTracingPipelinesKHR");
-    out->vkGetRayTracingCaptureReplayShaderGroupHandlesKHR = (PFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR)vk->vkGetDeviceProcAddr(device, "vkGetRayTracingCaptureReplayShaderGroupHandlesKHR");
-    out->vkCmdTraceRaysIndirectKHR = (PFN_vkCmdTraceRaysIndirectKHR)vk->vkGetDeviceProcAddr(device, "vkCmdTraceRaysIndirectKHR");
-    out->vkGetRayTracingShaderGroupStackSizeKHR = (PFN_vkGetRayTracingShaderGroupStackSizeKHR)vk->vkGetDeviceProcAddr(device, "vkGetRayTracingShaderGroupStackSizeKHR");
-    out->vkCmdSetRayTracingPipelineStackSizeKHR = (PFN_vkCmdSetRayTracingPipelineStackSizeKHR)vk->vkGetDeviceProcAddr(device, "vkCmdSetRayTracingPipelineStackSizeKHR");
+    out->vkCmdTraceRaysKHR =
+        (PFN_vkCmdTraceRaysKHR)vk->vkGetDeviceProcAddr(device, "vkCmdTraceRaysKHR");
+    out->vkCreateRayTracingPipelinesKHR =
+        (PFN_vkCreateRayTracingPipelinesKHR)vk->vkGetDeviceProcAddr(
+            device, "vkCreateRayTracingPipelinesKHR");
+    out->vkGetRayTracingCaptureReplayShaderGroupHandlesKHR =
+        (PFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetRayTracingCaptureReplayShaderGroupHandlesKHR");
+    out->vkCmdTraceRaysIndirectKHR =
+        (PFN_vkCmdTraceRaysIndirectKHR)vk->vkGetDeviceProcAddr(device, "vkCmdTraceRaysIndirectKHR");
+    out->vkGetRayTracingShaderGroupStackSizeKHR =
+        (PFN_vkGetRayTracingShaderGroupStackSizeKHR)vk->vkGetDeviceProcAddr(
+            device, "vkGetRayTracingShaderGroupStackSizeKHR");
+    out->vkCmdSetRayTracingPipelineStackSizeKHR =
+        (PFN_vkCmdSetRayTracingPipelineStackSizeKHR)vk->vkGetDeviceProcAddr(
+            device, "vkCmdSetRayTracingPipelineStackSizeKHR");
 #endif
 }
 
-bool vulkan_dispatch_check_instance_VK_VERSION_1_0(
-    const VulkanDispatch* vk)
+bool vulkan_dispatch_check_instance_VK_VERSION_1_0(const VulkanDispatch* vk)
 
 {
     bool good = true;
-    if (!vk->vkCreateInstance)
-    {
+    if (!vk->vkCreateInstance) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCreateInstance not found\n");
         good = false;
     }
-    if (!vk->vkEnumerateInstanceExtensionProperties)
-    {
-        fprintf(stderr, "VK_VERSION_1_0 check failed: vkEnumerateInstanceExtensionProperties not found\n");
+    if (!vk->vkEnumerateInstanceExtensionProperties) {
+        fprintf(stderr,
+                "VK_VERSION_1_0 check failed: vkEnumerateInstanceExtensionProperties not found\n");
         good = false;
     }
-    if (!vk->vkEnumerateInstanceLayerProperties)
-    {
-        fprintf(stderr, "VK_VERSION_1_0 check failed: vkEnumerateInstanceLayerProperties not found\n");
+    if (!vk->vkEnumerateInstanceLayerProperties) {
+        fprintf(stderr,
+                "VK_VERSION_1_0 check failed: vkEnumerateInstanceLayerProperties not found\n");
         good = false;
     }
-    if (!vk->vkGetDeviceProcAddr)
-    {
+    if (!vk->vkGetDeviceProcAddr) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkGetDeviceProcAddr not found\n");
         good = false;
     }
-    if (!vk->vkGetPhysicalDeviceSparseImageFormatProperties)
-    {
-        fprintf(stderr, "VK_VERSION_1_0 check failed: vkGetPhysicalDeviceSparseImageFormatProperties not found\n");
+    if (!vk->vkGetPhysicalDeviceSparseImageFormatProperties) {
+        fprintf(stderr,
+                "VK_VERSION_1_0 check failed: vkGetPhysicalDeviceSparseImageFormatProperties not "
+                "found\n");
         good = false;
     }
     return good;
 }
 
-bool vulkan_dispatch_check_instance_VK_VERSION_1_1(
-    const VulkanDispatch* vk)
+bool vulkan_dispatch_check_instance_VK_VERSION_1_1(const VulkanDispatch* vk)
 
 {
     bool good = true;
-    if (!vk->vkEnumerateInstanceVersion)
-    {
+    if (!vk->vkEnumerateInstanceVersion) {
         fprintf(stderr, "VK_VERSION_1_1 check failed: vkEnumerateInstanceVersion not found\n");
         good = false;
     }
-    if (!vk->vkEnumeratePhysicalDeviceGroups)
-    {
+    if (!vk->vkEnumeratePhysicalDeviceGroups) {
         fprintf(stderr, "VK_VERSION_1_1 check failed: vkEnumeratePhysicalDeviceGroups not found\n");
         good = false;
     }
-    if (!vk->vkGetPhysicalDeviceFeatures2)
-    {
+    if (!vk->vkGetPhysicalDeviceFeatures2) {
         fprintf(stderr, "VK_VERSION_1_1 check failed: vkGetPhysicalDeviceFeatures2 not found\n");
         good = false;
     }
-    if (!vk->vkGetPhysicalDeviceProperties2)
-    {
+    if (!vk->vkGetPhysicalDeviceProperties2) {
         fprintf(stderr, "VK_VERSION_1_1 check failed: vkGetPhysicalDeviceProperties2 not found\n");
         good = false;
     }
-    if (!vk->vkGetPhysicalDeviceFormatProperties2)
-    {
-        fprintf(stderr, "VK_VERSION_1_1 check failed: vkGetPhysicalDeviceFormatProperties2 not found\n");
+    if (!vk->vkGetPhysicalDeviceFormatProperties2) {
+        fprintf(stderr,
+                "VK_VERSION_1_1 check failed: vkGetPhysicalDeviceFormatProperties2 not found\n");
         good = false;
     }
-    if (!vk->vkGetPhysicalDeviceImageFormatProperties2)
-    {
-        fprintf(stderr, "VK_VERSION_1_1 check failed: vkGetPhysicalDeviceImageFormatProperties2 not found\n");
+    if (!vk->vkGetPhysicalDeviceImageFormatProperties2) {
+        fprintf(
+            stderr,
+            "VK_VERSION_1_1 check failed: vkGetPhysicalDeviceImageFormatProperties2 not found\n");
         good = false;
     }
-    if (!vk->vkGetPhysicalDeviceQueueFamilyProperties2)
-    {
-        fprintf(stderr, "VK_VERSION_1_1 check failed: vkGetPhysicalDeviceQueueFamilyProperties2 not found\n");
+    if (!vk->vkGetPhysicalDeviceQueueFamilyProperties2) {
+        fprintf(
+            stderr,
+            "VK_VERSION_1_1 check failed: vkGetPhysicalDeviceQueueFamilyProperties2 not found\n");
         good = false;
     }
-    if (!vk->vkGetPhysicalDeviceMemoryProperties2)
-    {
-        fprintf(stderr, "VK_VERSION_1_1 check failed: vkGetPhysicalDeviceMemoryProperties2 not found\n");
+    if (!vk->vkGetPhysicalDeviceMemoryProperties2) {
+        fprintf(stderr,
+                "VK_VERSION_1_1 check failed: vkGetPhysicalDeviceMemoryProperties2 not found\n");
         good = false;
     }
-    if (!vk->vkGetPhysicalDeviceSparseImageFormatProperties2)
-    {
-        fprintf(stderr, "VK_VERSION_1_1 check failed: vkGetPhysicalDeviceSparseImageFormatProperties2 not found\n");
+    if (!vk->vkGetPhysicalDeviceSparseImageFormatProperties2) {
+        fprintf(stderr,
+                "VK_VERSION_1_1 check failed: vkGetPhysicalDeviceSparseImageFormatProperties2 not "
+                "found\n");
         good = false;
     }
-    if (!vk->vkGetPhysicalDeviceExternalBufferProperties)
-    {
-        fprintf(stderr, "VK_VERSION_1_1 check failed: vkGetPhysicalDeviceExternalBufferProperties not found\n");
+    if (!vk->vkGetPhysicalDeviceExternalBufferProperties) {
+        fprintf(
+            stderr,
+            "VK_VERSION_1_1 check failed: vkGetPhysicalDeviceExternalBufferProperties not found\n");
         good = false;
     }
-    if (!vk->vkGetPhysicalDeviceExternalFenceProperties)
-    {
-        fprintf(stderr, "VK_VERSION_1_1 check failed: vkGetPhysicalDeviceExternalFenceProperties not found\n");
+    if (!vk->vkGetPhysicalDeviceExternalFenceProperties) {
+        fprintf(
+            stderr,
+            "VK_VERSION_1_1 check failed: vkGetPhysicalDeviceExternalFenceProperties not found\n");
         good = false;
     }
-    if (!vk->vkGetPhysicalDeviceExternalSemaphoreProperties)
-    {
-        fprintf(stderr, "VK_VERSION_1_1 check failed: vkGetPhysicalDeviceExternalSemaphoreProperties not found\n");
+    if (!vk->vkGetPhysicalDeviceExternalSemaphoreProperties) {
+        fprintf(stderr,
+                "VK_VERSION_1_1 check failed: vkGetPhysicalDeviceExternalSemaphoreProperties not "
+                "found\n");
         good = false;
     }
     return good;
 }
 
-bool vulkan_dispatch_check_device_VK_VERSION_1_0(
-    const VulkanDispatch* vk)
+bool vulkan_dispatch_check_device_VK_VERSION_1_0(const VulkanDispatch* vk)
 
 {
     bool good = true;
-    if (!vk->vkGetDeviceQueue)
-    {
+    if (!vk->vkGetDeviceQueue) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkGetDeviceQueue not found\n");
         good = false;
     }
-    if (!vk->vkQueueSubmit)
-    {
+    if (!vk->vkQueueSubmit) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkQueueSubmit not found\n");
         good = false;
     }
-    if (!vk->vkQueueWaitIdle)
-    {
+    if (!vk->vkQueueWaitIdle) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkQueueWaitIdle not found\n");
         good = false;
     }
-    if (!vk->vkDeviceWaitIdle)
-    {
+    if (!vk->vkDeviceWaitIdle) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkDeviceWaitIdle not found\n");
         good = false;
     }
-    if (!vk->vkAllocateMemory)
-    {
+    if (!vk->vkAllocateMemory) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkAllocateMemory not found\n");
         good = false;
     }
-    if (!vk->vkFreeMemory)
-    {
+    if (!vk->vkFreeMemory) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkFreeMemory not found\n");
         good = false;
     }
-    if (!vk->vkMapMemory)
-    {
+    if (!vk->vkMapMemory) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkMapMemory not found\n");
         good = false;
     }
-    if (!vk->vkUnmapMemory)
-    {
+    if (!vk->vkUnmapMemory) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkUnmapMemory not found\n");
         good = false;
     }
-    if (!vk->vkFlushMappedMemoryRanges)
-    {
+    if (!vk->vkFlushMappedMemoryRanges) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkFlushMappedMemoryRanges not found\n");
         good = false;
     }
-    if (!vk->vkInvalidateMappedMemoryRanges)
-    {
+    if (!vk->vkInvalidateMappedMemoryRanges) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkInvalidateMappedMemoryRanges not found\n");
         good = false;
     }
-    if (!vk->vkGetDeviceMemoryCommitment)
-    {
+    if (!vk->vkGetDeviceMemoryCommitment) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkGetDeviceMemoryCommitment not found\n");
         good = false;
     }
-    if (!vk->vkBindBufferMemory)
-    {
+    if (!vk->vkBindBufferMemory) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkBindBufferMemory not found\n");
         good = false;
     }
-    if (!vk->vkBindImageMemory)
-    {
+    if (!vk->vkBindImageMemory) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkBindImageMemory not found\n");
         good = false;
     }
-    if (!vk->vkGetBufferMemoryRequirements)
-    {
+    if (!vk->vkGetBufferMemoryRequirements) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkGetBufferMemoryRequirements not found\n");
         good = false;
     }
-    if (!vk->vkGetImageMemoryRequirements)
-    {
+    if (!vk->vkGetImageMemoryRequirements) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkGetImageMemoryRequirements not found\n");
         good = false;
     }
-    if (!vk->vkGetImageSparseMemoryRequirements)
-    {
-        fprintf(stderr, "VK_VERSION_1_0 check failed: vkGetImageSparseMemoryRequirements not found\n");
+    if (!vk->vkGetImageSparseMemoryRequirements) {
+        fprintf(stderr,
+                "VK_VERSION_1_0 check failed: vkGetImageSparseMemoryRequirements not found\n");
         good = false;
     }
-    if (!vk->vkQueueBindSparse)
-    {
+    if (!vk->vkQueueBindSparse) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkQueueBindSparse not found\n");
         good = false;
     }
-    if (!vk->vkCreateFence)
-    {
+    if (!vk->vkCreateFence) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCreateFence not found\n");
         good = false;
     }
-    if (!vk->vkDestroyFence)
-    {
+    if (!vk->vkDestroyFence) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkDestroyFence not found\n");
         good = false;
     }
-    if (!vk->vkResetFences)
-    {
+    if (!vk->vkResetFences) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkResetFences not found\n");
         good = false;
     }
-    if (!vk->vkGetFenceStatus)
-    {
+    if (!vk->vkGetFenceStatus) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkGetFenceStatus not found\n");
         good = false;
     }
-    if (!vk->vkWaitForFences)
-    {
+    if (!vk->vkWaitForFences) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkWaitForFences not found\n");
         good = false;
     }
-    if (!vk->vkCreateSemaphore)
-    {
+    if (!vk->vkCreateSemaphore) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCreateSemaphore not found\n");
         good = false;
     }
-    if (!vk->vkDestroySemaphore)
-    {
+    if (!vk->vkDestroySemaphore) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkDestroySemaphore not found\n");
         good = false;
     }
-    if (!vk->vkCreateEvent)
-    {
+    if (!vk->vkCreateEvent) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCreateEvent not found\n");
         good = false;
     }
-    if (!vk->vkDestroyEvent)
-    {
+    if (!vk->vkDestroyEvent) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkDestroyEvent not found\n");
         good = false;
     }
-    if (!vk->vkGetEventStatus)
-    {
+    if (!vk->vkGetEventStatus) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkGetEventStatus not found\n");
         good = false;
     }
-    if (!vk->vkSetEvent)
-    {
+    if (!vk->vkSetEvent) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkSetEvent not found\n");
         good = false;
     }
-    if (!vk->vkResetEvent)
-    {
+    if (!vk->vkResetEvent) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkResetEvent not found\n");
         good = false;
     }
-    if (!vk->vkCreateQueryPool)
-    {
+    if (!vk->vkCreateQueryPool) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCreateQueryPool not found\n");
         good = false;
     }
-    if (!vk->vkDestroyQueryPool)
-    {
+    if (!vk->vkDestroyQueryPool) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkDestroyQueryPool not found\n");
         good = false;
     }
-    if (!vk->vkGetQueryPoolResults)
-    {
+    if (!vk->vkGetQueryPoolResults) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkGetQueryPoolResults not found\n");
         good = false;
     }
-    if (!vk->vkCreateBuffer)
-    {
+    if (!vk->vkCreateBuffer) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCreateBuffer not found\n");
         good = false;
     }
-    if (!vk->vkDestroyBuffer)
-    {
+    if (!vk->vkDestroyBuffer) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkDestroyBuffer not found\n");
         good = false;
     }
-    if (!vk->vkCreateBufferView)
-    {
+    if (!vk->vkCreateBufferView) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCreateBufferView not found\n");
         good = false;
     }
-    if (!vk->vkDestroyBufferView)
-    {
+    if (!vk->vkDestroyBufferView) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkDestroyBufferView not found\n");
         good = false;
     }
-    if (!vk->vkCreateImage)
-    {
+    if (!vk->vkCreateImage) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCreateImage not found\n");
         good = false;
     }
-    if (!vk->vkDestroyImage)
-    {
+    if (!vk->vkDestroyImage) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkDestroyImage not found\n");
         good = false;
     }
-    if (!vk->vkGetImageSubresourceLayout)
-    {
+    if (!vk->vkGetImageSubresourceLayout) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkGetImageSubresourceLayout not found\n");
         good = false;
     }
-    if (!vk->vkCreateImageView)
-    {
+    if (!vk->vkCreateImageView) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCreateImageView not found\n");
         good = false;
     }
-    if (!vk->vkDestroyImageView)
-    {
+    if (!vk->vkDestroyImageView) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkDestroyImageView not found\n");
         good = false;
     }
-    if (!vk->vkCreateShaderModule)
-    {
+    if (!vk->vkCreateShaderModule) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCreateShaderModule not found\n");
         good = false;
     }
-    if (!vk->vkDestroyShaderModule)
-    {
+    if (!vk->vkDestroyShaderModule) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkDestroyShaderModule not found\n");
         good = false;
     }
-    if (!vk->vkCreatePipelineCache)
-    {
+    if (!vk->vkCreatePipelineCache) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCreatePipelineCache not found\n");
         good = false;
     }
-    if (!vk->vkDestroyPipelineCache)
-    {
+    if (!vk->vkDestroyPipelineCache) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkDestroyPipelineCache not found\n");
         good = false;
     }
-    if (!vk->vkGetPipelineCacheData)
-    {
+    if (!vk->vkGetPipelineCacheData) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkGetPipelineCacheData not found\n");
         good = false;
     }
-    if (!vk->vkMergePipelineCaches)
-    {
+    if (!vk->vkMergePipelineCaches) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkMergePipelineCaches not found\n");
         good = false;
     }
-    if (!vk->vkCreateGraphicsPipelines)
-    {
+    if (!vk->vkCreateGraphicsPipelines) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCreateGraphicsPipelines not found\n");
         good = false;
     }
-    if (!vk->vkCreateComputePipelines)
-    {
+    if (!vk->vkCreateComputePipelines) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCreateComputePipelines not found\n");
         good = false;
     }
-    if (!vk->vkDestroyPipeline)
-    {
+    if (!vk->vkDestroyPipeline) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkDestroyPipeline not found\n");
         good = false;
     }
-    if (!vk->vkCreatePipelineLayout)
-    {
+    if (!vk->vkCreatePipelineLayout) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCreatePipelineLayout not found\n");
         good = false;
     }
-    if (!vk->vkDestroyPipelineLayout)
-    {
+    if (!vk->vkDestroyPipelineLayout) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkDestroyPipelineLayout not found\n");
         good = false;
     }
-    if (!vk->vkCreateSampler)
-    {
+    if (!vk->vkCreateSampler) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCreateSampler not found\n");
         good = false;
     }
-    if (!vk->vkDestroySampler)
-    {
+    if (!vk->vkDestroySampler) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkDestroySampler not found\n");
         good = false;
     }
-    if (!vk->vkCreateDescriptorSetLayout)
-    {
+    if (!vk->vkCreateDescriptorSetLayout) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCreateDescriptorSetLayout not found\n");
         good = false;
     }
-    if (!vk->vkDestroyDescriptorSetLayout)
-    {
+    if (!vk->vkDestroyDescriptorSetLayout) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkDestroyDescriptorSetLayout not found\n");
         good = false;
     }
-    if (!vk->vkCreateDescriptorPool)
-    {
+    if (!vk->vkCreateDescriptorPool) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCreateDescriptorPool not found\n");
         good = false;
     }
-    if (!vk->vkDestroyDescriptorPool)
-    {
+    if (!vk->vkDestroyDescriptorPool) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkDestroyDescriptorPool not found\n");
         good = false;
     }
-    if (!vk->vkResetDescriptorPool)
-    {
+    if (!vk->vkResetDescriptorPool) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkResetDescriptorPool not found\n");
         good = false;
     }
-    if (!vk->vkAllocateDescriptorSets)
-    {
+    if (!vk->vkAllocateDescriptorSets) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkAllocateDescriptorSets not found\n");
         good = false;
     }
-    if (!vk->vkFreeDescriptorSets)
-    {
+    if (!vk->vkFreeDescriptorSets) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkFreeDescriptorSets not found\n");
         good = false;
     }
-    if (!vk->vkUpdateDescriptorSets)
-    {
+    if (!vk->vkUpdateDescriptorSets) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkUpdateDescriptorSets not found\n");
         good = false;
     }
-    if (!vk->vkCreateFramebuffer)
-    {
+    if (!vk->vkCreateFramebuffer) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCreateFramebuffer not found\n");
         good = false;
     }
-    if (!vk->vkDestroyFramebuffer)
-    {
+    if (!vk->vkDestroyFramebuffer) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkDestroyFramebuffer not found\n");
         good = false;
     }
-    if (!vk->vkCreateRenderPass)
-    {
+    if (!vk->vkCreateRenderPass) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCreateRenderPass not found\n");
         good = false;
     }
-    if (!vk->vkDestroyRenderPass)
-    {
+    if (!vk->vkDestroyRenderPass) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkDestroyRenderPass not found\n");
         good = false;
     }
-    if (!vk->vkGetRenderAreaGranularity)
-    {
+    if (!vk->vkGetRenderAreaGranularity) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkGetRenderAreaGranularity not found\n");
         good = false;
     }
-    if (!vk->vkCreateCommandPool)
-    {
+    if (!vk->vkCreateCommandPool) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCreateCommandPool not found\n");
         good = false;
     }
-    if (!vk->vkDestroyCommandPool)
-    {
+    if (!vk->vkDestroyCommandPool) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkDestroyCommandPool not found\n");
         good = false;
     }
-    if (!vk->vkResetCommandPool)
-    {
+    if (!vk->vkResetCommandPool) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkResetCommandPool not found\n");
         good = false;
     }
-    if (!vk->vkAllocateCommandBuffers)
-    {
+    if (!vk->vkAllocateCommandBuffers) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkAllocateCommandBuffers not found\n");
         good = false;
     }
-    if (!vk->vkFreeCommandBuffers)
-    {
+    if (!vk->vkFreeCommandBuffers) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkFreeCommandBuffers not found\n");
         good = false;
     }
-    if (!vk->vkBeginCommandBuffer)
-    {
+    if (!vk->vkBeginCommandBuffer) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkBeginCommandBuffer not found\n");
         good = false;
     }
-    if (!vk->vkEndCommandBuffer)
-    {
+    if (!vk->vkEndCommandBuffer) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkEndCommandBuffer not found\n");
         good = false;
     }
-    if (!vk->vkResetCommandBuffer)
-    {
+    if (!vk->vkResetCommandBuffer) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkResetCommandBuffer not found\n");
         good = false;
     }
-    if (!vk->vkCmdBindPipeline)
-    {
+    if (!vk->vkCmdBindPipeline) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdBindPipeline not found\n");
         good = false;
     }
-    if (!vk->vkCmdSetViewport)
-    {
+    if (!vk->vkCmdSetViewport) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdSetViewport not found\n");
         good = false;
     }
-    if (!vk->vkCmdSetScissor)
-    {
+    if (!vk->vkCmdSetScissor) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdSetScissor not found\n");
         good = false;
     }
-    if (!vk->vkCmdSetLineWidth)
-    {
+    if (!vk->vkCmdSetLineWidth) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdSetLineWidth not found\n");
         good = false;
     }
-    if (!vk->vkCmdSetDepthBias)
-    {
+    if (!vk->vkCmdSetDepthBias) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdSetDepthBias not found\n");
         good = false;
     }
-    if (!vk->vkCmdSetBlendConstants)
-    {
+    if (!vk->vkCmdSetBlendConstants) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdSetBlendConstants not found\n");
         good = false;
     }
-    if (!vk->vkCmdSetDepthBounds)
-    {
+    if (!vk->vkCmdSetDepthBounds) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdSetDepthBounds not found\n");
         good = false;
     }
-    if (!vk->vkCmdSetStencilCompareMask)
-    {
+    if (!vk->vkCmdSetStencilCompareMask) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdSetStencilCompareMask not found\n");
         good = false;
     }
-    if (!vk->vkCmdSetStencilWriteMask)
-    {
+    if (!vk->vkCmdSetStencilWriteMask) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdSetStencilWriteMask not found\n");
         good = false;
     }
-    if (!vk->vkCmdSetStencilReference)
-    {
+    if (!vk->vkCmdSetStencilReference) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdSetStencilReference not found\n");
         good = false;
     }
-    if (!vk->vkCmdBindDescriptorSets)
-    {
+    if (!vk->vkCmdBindDescriptorSets) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdBindDescriptorSets not found\n");
         good = false;
     }
-    if (!vk->vkCmdBindIndexBuffer)
-    {
+    if (!vk->vkCmdBindIndexBuffer) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdBindIndexBuffer not found\n");
         good = false;
     }
-    if (!vk->vkCmdBindVertexBuffers)
-    {
+    if (!vk->vkCmdBindVertexBuffers) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdBindVertexBuffers not found\n");
         good = false;
     }
-    if (!vk->vkCmdDraw)
-    {
+    if (!vk->vkCmdDraw) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdDraw not found\n");
         good = false;
     }
-    if (!vk->vkCmdDrawIndexed)
-    {
+    if (!vk->vkCmdDrawIndexed) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdDrawIndexed not found\n");
         good = false;
     }
-    if (!vk->vkCmdDrawIndirect)
-    {
+    if (!vk->vkCmdDrawIndirect) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdDrawIndirect not found\n");
         good = false;
     }
-    if (!vk->vkCmdDrawIndexedIndirect)
-    {
+    if (!vk->vkCmdDrawIndexedIndirect) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdDrawIndexedIndirect not found\n");
         good = false;
     }
-    if (!vk->vkCmdDispatch)
-    {
+    if (!vk->vkCmdDispatch) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdDispatch not found\n");
         good = false;
     }
-    if (!vk->vkCmdDispatchIndirect)
-    {
+    if (!vk->vkCmdDispatchIndirect) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdDispatchIndirect not found\n");
         good = false;
     }
-    if (!vk->vkCmdCopyBuffer)
-    {
+    if (!vk->vkCmdCopyBuffer) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdCopyBuffer not found\n");
         good = false;
     }
-    if (!vk->vkCmdCopyImage)
-    {
+    if (!vk->vkCmdCopyImage) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdCopyImage not found\n");
         good = false;
     }
-    if (!vk->vkCmdBlitImage)
-    {
+    if (!vk->vkCmdBlitImage) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdBlitImage not found\n");
         good = false;
     }
-    if (!vk->vkCmdCopyBufferToImage)
-    {
+    if (!vk->vkCmdCopyBufferToImage) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdCopyBufferToImage not found\n");
         good = false;
     }
-    if (!vk->vkCmdCopyImageToBuffer)
-    {
+    if (!vk->vkCmdCopyImageToBuffer) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdCopyImageToBuffer not found\n");
         good = false;
     }
-    if (!vk->vkCmdUpdateBuffer)
-    {
+    if (!vk->vkCmdUpdateBuffer) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdUpdateBuffer not found\n");
         good = false;
     }
-    if (!vk->vkCmdFillBuffer)
-    {
+    if (!vk->vkCmdFillBuffer) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdFillBuffer not found\n");
         good = false;
     }
-    if (!vk->vkCmdClearColorImage)
-    {
+    if (!vk->vkCmdClearColorImage) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdClearColorImage not found\n");
         good = false;
     }
-    if (!vk->vkCmdClearDepthStencilImage)
-    {
+    if (!vk->vkCmdClearDepthStencilImage) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdClearDepthStencilImage not found\n");
         good = false;
     }
-    if (!vk->vkCmdClearAttachments)
-    {
+    if (!vk->vkCmdClearAttachments) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdClearAttachments not found\n");
         good = false;
     }
-    if (!vk->vkCmdResolveImage)
-    {
+    if (!vk->vkCmdResolveImage) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdResolveImage not found\n");
         good = false;
     }
-    if (!vk->vkCmdSetEvent)
-    {
+    if (!vk->vkCmdSetEvent) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdSetEvent not found\n");
         good = false;
     }
-    if (!vk->vkCmdResetEvent)
-    {
+    if (!vk->vkCmdResetEvent) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdResetEvent not found\n");
         good = false;
     }
-    if (!vk->vkCmdWaitEvents)
-    {
+    if (!vk->vkCmdWaitEvents) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdWaitEvents not found\n");
         good = false;
     }
-    if (!vk->vkCmdPipelineBarrier)
-    {
+    if (!vk->vkCmdPipelineBarrier) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdPipelineBarrier not found\n");
         good = false;
     }
-    if (!vk->vkCmdBeginQuery)
-    {
+    if (!vk->vkCmdBeginQuery) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdBeginQuery not found\n");
         good = false;
     }
-    if (!vk->vkCmdEndQuery)
-    {
+    if (!vk->vkCmdEndQuery) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdEndQuery not found\n");
         good = false;
     }
-    if (!vk->vkCmdResetQueryPool)
-    {
+    if (!vk->vkCmdResetQueryPool) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdResetQueryPool not found\n");
         good = false;
     }
-    if (!vk->vkCmdWriteTimestamp)
-    {
+    if (!vk->vkCmdWriteTimestamp) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdWriteTimestamp not found\n");
         good = false;
     }
-    if (!vk->vkCmdCopyQueryPoolResults)
-    {
+    if (!vk->vkCmdCopyQueryPoolResults) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdCopyQueryPoolResults not found\n");
         good = false;
     }
-    if (!vk->vkCmdPushConstants)
-    {
+    if (!vk->vkCmdPushConstants) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdPushConstants not found\n");
         good = false;
     }
-    if (!vk->vkCmdBeginRenderPass)
-    {
+    if (!vk->vkCmdBeginRenderPass) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdBeginRenderPass not found\n");
         good = false;
     }
-    if (!vk->vkCmdNextSubpass)
-    {
+    if (!vk->vkCmdNextSubpass) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdNextSubpass not found\n");
         good = false;
     }
-    if (!vk->vkCmdEndRenderPass)
-    {
+    if (!vk->vkCmdEndRenderPass) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdEndRenderPass not found\n");
         good = false;
     }
-    if (!vk->vkCmdExecuteCommands)
-    {
+    if (!vk->vkCmdExecuteCommands) {
         fprintf(stderr, "VK_VERSION_1_0 check failed: vkCmdExecuteCommands not found\n");
         good = false;
     }
     return good;
 }
 
-bool vulkan_dispatch_check_device_VK_VERSION_1_1(
-    const VulkanDispatch* vk)
+bool vulkan_dispatch_check_device_VK_VERSION_1_1(const VulkanDispatch* vk)
 
 {
     bool good = true;
-    if (!vk->vkBindBufferMemory2)
-    {
+    if (!vk->vkBindBufferMemory2) {
         fprintf(stderr, "VK_VERSION_1_1 check failed: vkBindBufferMemory2 not found\n");
         good = false;
     }
-    if (!vk->vkBindImageMemory2)
-    {
+    if (!vk->vkBindImageMemory2) {
         fprintf(stderr, "VK_VERSION_1_1 check failed: vkBindImageMemory2 not found\n");
         good = false;
     }
-    if (!vk->vkGetDeviceGroupPeerMemoryFeatures)
-    {
-        fprintf(stderr, "VK_VERSION_1_1 check failed: vkGetDeviceGroupPeerMemoryFeatures not found\n");
+    if (!vk->vkGetDeviceGroupPeerMemoryFeatures) {
+        fprintf(stderr,
+                "VK_VERSION_1_1 check failed: vkGetDeviceGroupPeerMemoryFeatures not found\n");
         good = false;
     }
-    if (!vk->vkCmdSetDeviceMask)
-    {
+    if (!vk->vkCmdSetDeviceMask) {
         fprintf(stderr, "VK_VERSION_1_1 check failed: vkCmdSetDeviceMask not found\n");
         good = false;
     }
-    if (!vk->vkCmdDispatchBase)
-    {
+    if (!vk->vkCmdDispatchBase) {
         fprintf(stderr, "VK_VERSION_1_1 check failed: vkCmdDispatchBase not found\n");
         good = false;
     }
-    if (!vk->vkGetImageMemoryRequirements2)
-    {
+    if (!vk->vkGetImageMemoryRequirements2) {
         fprintf(stderr, "VK_VERSION_1_1 check failed: vkGetImageMemoryRequirements2 not found\n");
         good = false;
     }
-    if (!vk->vkGetBufferMemoryRequirements2)
-    {
+    if (!vk->vkGetBufferMemoryRequirements2) {
         fprintf(stderr, "VK_VERSION_1_1 check failed: vkGetBufferMemoryRequirements2 not found\n");
         good = false;
     }
-    if (!vk->vkGetImageSparseMemoryRequirements2)
-    {
-        fprintf(stderr, "VK_VERSION_1_1 check failed: vkGetImageSparseMemoryRequirements2 not found\n");
+    if (!vk->vkGetImageSparseMemoryRequirements2) {
+        fprintf(stderr,
+                "VK_VERSION_1_1 check failed: vkGetImageSparseMemoryRequirements2 not found\n");
         good = false;
     }
-    if (!vk->vkTrimCommandPool)
-    {
+    if (!vk->vkTrimCommandPool) {
         fprintf(stderr, "VK_VERSION_1_1 check failed: vkTrimCommandPool not found\n");
         good = false;
     }
-    if (!vk->vkGetDeviceQueue2)
-    {
+    if (!vk->vkGetDeviceQueue2) {
         fprintf(stderr, "VK_VERSION_1_1 check failed: vkGetDeviceQueue2 not found\n");
         good = false;
     }
-    if (!vk->vkCreateSamplerYcbcrConversion)
-    {
+    if (!vk->vkCreateSamplerYcbcrConversion) {
         fprintf(stderr, "VK_VERSION_1_1 check failed: vkCreateSamplerYcbcrConversion not found\n");
         good = false;
     }
-    if (!vk->vkDestroySamplerYcbcrConversion)
-    {
+    if (!vk->vkDestroySamplerYcbcrConversion) {
         fprintf(stderr, "VK_VERSION_1_1 check failed: vkDestroySamplerYcbcrConversion not found\n");
         good = false;
     }
-    if (!vk->vkCreateDescriptorUpdateTemplate)
-    {
-        fprintf(stderr, "VK_VERSION_1_1 check failed: vkCreateDescriptorUpdateTemplate not found\n");
+    if (!vk->vkCreateDescriptorUpdateTemplate) {
+        fprintf(stderr,
+                "VK_VERSION_1_1 check failed: vkCreateDescriptorUpdateTemplate not found\n");
         good = false;
     }
-    if (!vk->vkDestroyDescriptorUpdateTemplate)
-    {
-        fprintf(stderr, "VK_VERSION_1_1 check failed: vkDestroyDescriptorUpdateTemplate not found\n");
+    if (!vk->vkDestroyDescriptorUpdateTemplate) {
+        fprintf(stderr,
+                "VK_VERSION_1_1 check failed: vkDestroyDescriptorUpdateTemplate not found\n");
         good = false;
     }
-    if (!vk->vkUpdateDescriptorSetWithTemplate)
-    {
-        fprintf(stderr, "VK_VERSION_1_1 check failed: vkUpdateDescriptorSetWithTemplate not found\n");
+    if (!vk->vkUpdateDescriptorSetWithTemplate) {
+        fprintf(stderr,
+                "VK_VERSION_1_1 check failed: vkUpdateDescriptorSetWithTemplate not found\n");
         good = false;
     }
-    if (!vk->vkGetDescriptorSetLayoutSupport)
-    {
+    if (!vk->vkGetDescriptorSetLayoutSupport) {
         fprintf(stderr, "VK_VERSION_1_1 check failed: vkGetDescriptorSetLayoutSupport not found\n");
         good = false;
     }
     return good;
 }
 
-} // namespace goldfish_vk
+}  // namespace goldfish_vk
diff --git a/stream-servers/vulkan/cereal/common/goldfish_vk_dispatch.h b/stream-servers/vulkan/cereal/common/goldfish_vk_dispatch.h
index b0cfca2..6cbaa02 100644
--- a/stream-servers/vulkan/cereal/common/goldfish_vk_dispatch.h
+++ b/stream-servers/vulkan/cereal/common/goldfish_vk_dispatch.h
@@ -14,374 +14,372 @@
 // limitations under the License.
 
 // Autogenerated module goldfish_vk_dispatch
-// (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
+// (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml
+// cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
 // VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
 // VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+//
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o
+// $CEREAL_OUTPUT_DIR
+//
 #pragma once
 #include <vulkan/vulkan.h>
-#include "vulkan_gfxstream.h"
 
 #include "goldfish_vk_private_defs.h"
+#include "vulkan_gfxstream.h"
 namespace goldfish_vk {
 
 struct VulkanDispatch;
 
-} // namespace goldfish_vk
-using DlOpenFunc = void* (void);
-using DlSymFunc = void* (void*, const char*);
+}  // namespace goldfish_vk
+using DlOpenFunc = void*(void);
+using DlSymFunc = void*(void*, const char*);
 
 namespace goldfish_vk {
 
-void init_vulkan_dispatch_from_system_loader(
-    DlOpenFunc dlOpenFunc,
-    DlSymFunc dlSymFunc,
-    VulkanDispatch* dispatch_out);
+void init_vulkan_dispatch_from_system_loader(DlOpenFunc dlOpenFunc, DlSymFunc dlSymFunc,
+                                             VulkanDispatch* dispatch_out);
 
+void init_vulkan_dispatch_from_instance(VulkanDispatch* vk, VkInstance instance,
+                                        VulkanDispatch* dispatch_out);
 
-void init_vulkan_dispatch_from_instance(
-    VulkanDispatch* vk,
-    VkInstance instance,
-    VulkanDispatch* dispatch_out);
+void init_vulkan_dispatch_from_device(VulkanDispatch* vk, VkDevice device,
+                                      VulkanDispatch* dispatch_out);
 
+bool vulkan_dispatch_check_instance_VK_VERSION_1_0(const VulkanDispatch* vk);
 
-void init_vulkan_dispatch_from_device(
-    VulkanDispatch* vk,
-    VkDevice device,
-    VulkanDispatch* dispatch_out);
+bool vulkan_dispatch_check_instance_VK_VERSION_1_1(const VulkanDispatch* vk);
 
+bool vulkan_dispatch_check_device_VK_VERSION_1_0(const VulkanDispatch* vk);
 
-bool vulkan_dispatch_check_instance_VK_VERSION_1_0(
-    const VulkanDispatch* vk);
-
-
-bool vulkan_dispatch_check_instance_VK_VERSION_1_1(
-    const VulkanDispatch* vk);
-
-
-bool vulkan_dispatch_check_device_VK_VERSION_1_0(
-    const VulkanDispatch* vk);
-
-
-bool vulkan_dispatch_check_device_VK_VERSION_1_1(
-    const VulkanDispatch* vk);
+bool vulkan_dispatch_check_device_VK_VERSION_1_1(const VulkanDispatch* vk);
 
 struct VulkanDispatch {
 #ifdef VK_VERSION_1_0
-PFN_vkCreateInstance vkCreateInstance;
-PFN_vkDestroyInstance vkDestroyInstance;
-PFN_vkEnumeratePhysicalDevices vkEnumeratePhysicalDevices;
-PFN_vkGetPhysicalDeviceFeatures vkGetPhysicalDeviceFeatures;
-PFN_vkGetPhysicalDeviceFormatProperties vkGetPhysicalDeviceFormatProperties;
-PFN_vkGetPhysicalDeviceImageFormatProperties vkGetPhysicalDeviceImageFormatProperties;
-PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties;
-PFN_vkGetPhysicalDeviceQueueFamilyProperties vkGetPhysicalDeviceQueueFamilyProperties;
-PFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties;
-PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr;
-PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr;
-PFN_vkCreateDevice vkCreateDevice;
-PFN_vkDestroyDevice vkDestroyDevice;
-PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties;
-PFN_vkEnumerateDeviceExtensionProperties vkEnumerateDeviceExtensionProperties;
-PFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties;
-PFN_vkEnumerateDeviceLayerProperties vkEnumerateDeviceLayerProperties;
-PFN_vkGetDeviceQueue vkGetDeviceQueue;
-PFN_vkQueueSubmit vkQueueSubmit;
-PFN_vkQueueWaitIdle vkQueueWaitIdle;
-PFN_vkDeviceWaitIdle vkDeviceWaitIdle;
-PFN_vkAllocateMemory vkAllocateMemory;
-PFN_vkFreeMemory vkFreeMemory;
-PFN_vkMapMemory vkMapMemory;
-PFN_vkUnmapMemory vkUnmapMemory;
-PFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges;
-PFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges;
-PFN_vkGetDeviceMemoryCommitment vkGetDeviceMemoryCommitment;
-PFN_vkBindBufferMemory vkBindBufferMemory;
-PFN_vkBindImageMemory vkBindImageMemory;
-PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements;
-PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements;
-PFN_vkGetImageSparseMemoryRequirements vkGetImageSparseMemoryRequirements;
-PFN_vkGetPhysicalDeviceSparseImageFormatProperties vkGetPhysicalDeviceSparseImageFormatProperties;
-PFN_vkQueueBindSparse vkQueueBindSparse;
-PFN_vkCreateFence vkCreateFence;
-PFN_vkDestroyFence vkDestroyFence;
-PFN_vkResetFences vkResetFences;
-PFN_vkGetFenceStatus vkGetFenceStatus;
-PFN_vkWaitForFences vkWaitForFences;
-PFN_vkCreateSemaphore vkCreateSemaphore;
-PFN_vkDestroySemaphore vkDestroySemaphore;
-PFN_vkCreateEvent vkCreateEvent;
-PFN_vkDestroyEvent vkDestroyEvent;
-PFN_vkGetEventStatus vkGetEventStatus;
-PFN_vkSetEvent vkSetEvent;
-PFN_vkResetEvent vkResetEvent;
-PFN_vkCreateQueryPool vkCreateQueryPool;
-PFN_vkDestroyQueryPool vkDestroyQueryPool;
-PFN_vkGetQueryPoolResults vkGetQueryPoolResults;
-PFN_vkCreateBuffer vkCreateBuffer;
-PFN_vkDestroyBuffer vkDestroyBuffer;
-PFN_vkCreateBufferView vkCreateBufferView;
-PFN_vkDestroyBufferView vkDestroyBufferView;
-PFN_vkCreateImage vkCreateImage;
-PFN_vkDestroyImage vkDestroyImage;
-PFN_vkGetImageSubresourceLayout vkGetImageSubresourceLayout;
-PFN_vkCreateImageView vkCreateImageView;
-PFN_vkDestroyImageView vkDestroyImageView;
-PFN_vkCreateShaderModule vkCreateShaderModule;
-PFN_vkDestroyShaderModule vkDestroyShaderModule;
-PFN_vkCreatePipelineCache vkCreatePipelineCache;
-PFN_vkDestroyPipelineCache vkDestroyPipelineCache;
-PFN_vkGetPipelineCacheData vkGetPipelineCacheData;
-PFN_vkMergePipelineCaches vkMergePipelineCaches;
-PFN_vkCreateGraphicsPipelines vkCreateGraphicsPipelines;
-PFN_vkCreateComputePipelines vkCreateComputePipelines;
-PFN_vkDestroyPipeline vkDestroyPipeline;
-PFN_vkCreatePipelineLayout vkCreatePipelineLayout;
-PFN_vkDestroyPipelineLayout vkDestroyPipelineLayout;
-PFN_vkCreateSampler vkCreateSampler;
-PFN_vkDestroySampler vkDestroySampler;
-PFN_vkCreateDescriptorSetLayout vkCreateDescriptorSetLayout;
-PFN_vkDestroyDescriptorSetLayout vkDestroyDescriptorSetLayout;
-PFN_vkCreateDescriptorPool vkCreateDescriptorPool;
-PFN_vkDestroyDescriptorPool vkDestroyDescriptorPool;
-PFN_vkResetDescriptorPool vkResetDescriptorPool;
-PFN_vkAllocateDescriptorSets vkAllocateDescriptorSets;
-PFN_vkFreeDescriptorSets vkFreeDescriptorSets;
-PFN_vkUpdateDescriptorSets vkUpdateDescriptorSets;
-PFN_vkCreateFramebuffer vkCreateFramebuffer;
-PFN_vkDestroyFramebuffer vkDestroyFramebuffer;
-PFN_vkCreateRenderPass vkCreateRenderPass;
-PFN_vkDestroyRenderPass vkDestroyRenderPass;
-PFN_vkGetRenderAreaGranularity vkGetRenderAreaGranularity;
-PFN_vkCreateCommandPool vkCreateCommandPool;
-PFN_vkDestroyCommandPool vkDestroyCommandPool;
-PFN_vkResetCommandPool vkResetCommandPool;
-PFN_vkAllocateCommandBuffers vkAllocateCommandBuffers;
-PFN_vkFreeCommandBuffers vkFreeCommandBuffers;
-PFN_vkBeginCommandBuffer vkBeginCommandBuffer;
-PFN_vkEndCommandBuffer vkEndCommandBuffer;
-PFN_vkResetCommandBuffer vkResetCommandBuffer;
-PFN_vkCmdBindPipeline vkCmdBindPipeline;
-PFN_vkCmdSetViewport vkCmdSetViewport;
-PFN_vkCmdSetScissor vkCmdSetScissor;
-PFN_vkCmdSetLineWidth vkCmdSetLineWidth;
-PFN_vkCmdSetDepthBias vkCmdSetDepthBias;
-PFN_vkCmdSetBlendConstants vkCmdSetBlendConstants;
-PFN_vkCmdSetDepthBounds vkCmdSetDepthBounds;
-PFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask;
-PFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask;
-PFN_vkCmdSetStencilReference vkCmdSetStencilReference;
-PFN_vkCmdBindDescriptorSets vkCmdBindDescriptorSets;
-PFN_vkCmdBindIndexBuffer vkCmdBindIndexBuffer;
-PFN_vkCmdBindVertexBuffers vkCmdBindVertexBuffers;
-PFN_vkCmdDraw vkCmdDraw;
-PFN_vkCmdDrawIndexed vkCmdDrawIndexed;
-PFN_vkCmdDrawIndirect vkCmdDrawIndirect;
-PFN_vkCmdDrawIndexedIndirect vkCmdDrawIndexedIndirect;
-PFN_vkCmdDispatch vkCmdDispatch;
-PFN_vkCmdDispatchIndirect vkCmdDispatchIndirect;
-PFN_vkCmdCopyBuffer vkCmdCopyBuffer;
-PFN_vkCmdCopyImage vkCmdCopyImage;
-PFN_vkCmdBlitImage vkCmdBlitImage;
-PFN_vkCmdCopyBufferToImage vkCmdCopyBufferToImage;
-PFN_vkCmdCopyImageToBuffer vkCmdCopyImageToBuffer;
-PFN_vkCmdUpdateBuffer vkCmdUpdateBuffer;
-PFN_vkCmdFillBuffer vkCmdFillBuffer;
-PFN_vkCmdClearColorImage vkCmdClearColorImage;
-PFN_vkCmdClearDepthStencilImage vkCmdClearDepthStencilImage;
-PFN_vkCmdClearAttachments vkCmdClearAttachments;
-PFN_vkCmdResolveImage vkCmdResolveImage;
-PFN_vkCmdSetEvent vkCmdSetEvent;
-PFN_vkCmdResetEvent vkCmdResetEvent;
-PFN_vkCmdWaitEvents vkCmdWaitEvents;
-PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier;
-PFN_vkCmdBeginQuery vkCmdBeginQuery;
-PFN_vkCmdEndQuery vkCmdEndQuery;
-PFN_vkCmdResetQueryPool vkCmdResetQueryPool;
-PFN_vkCmdWriteTimestamp vkCmdWriteTimestamp;
-PFN_vkCmdCopyQueryPoolResults vkCmdCopyQueryPoolResults;
-PFN_vkCmdPushConstants vkCmdPushConstants;
-PFN_vkCmdBeginRenderPass vkCmdBeginRenderPass;
-PFN_vkCmdNextSubpass vkCmdNextSubpass;
-PFN_vkCmdEndRenderPass vkCmdEndRenderPass;
-PFN_vkCmdExecuteCommands vkCmdExecuteCommands;
+    PFN_vkCreateInstance vkCreateInstance;
+    PFN_vkDestroyInstance vkDestroyInstance;
+    PFN_vkEnumeratePhysicalDevices vkEnumeratePhysicalDevices;
+    PFN_vkGetPhysicalDeviceFeatures vkGetPhysicalDeviceFeatures;
+    PFN_vkGetPhysicalDeviceFormatProperties vkGetPhysicalDeviceFormatProperties;
+    PFN_vkGetPhysicalDeviceImageFormatProperties vkGetPhysicalDeviceImageFormatProperties;
+    PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties;
+    PFN_vkGetPhysicalDeviceQueueFamilyProperties vkGetPhysicalDeviceQueueFamilyProperties;
+    PFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties;
+    PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr;
+    PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr;
+    PFN_vkCreateDevice vkCreateDevice;
+    PFN_vkDestroyDevice vkDestroyDevice;
+    PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties;
+    PFN_vkEnumerateDeviceExtensionProperties vkEnumerateDeviceExtensionProperties;
+    PFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties;
+    PFN_vkEnumerateDeviceLayerProperties vkEnumerateDeviceLayerProperties;
+    PFN_vkGetDeviceQueue vkGetDeviceQueue;
+    PFN_vkQueueSubmit vkQueueSubmit;
+    PFN_vkQueueWaitIdle vkQueueWaitIdle;
+    PFN_vkDeviceWaitIdle vkDeviceWaitIdle;
+    PFN_vkAllocateMemory vkAllocateMemory;
+    PFN_vkFreeMemory vkFreeMemory;
+    PFN_vkMapMemory vkMapMemory;
+    PFN_vkUnmapMemory vkUnmapMemory;
+    PFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges;
+    PFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges;
+    PFN_vkGetDeviceMemoryCommitment vkGetDeviceMemoryCommitment;
+    PFN_vkBindBufferMemory vkBindBufferMemory;
+    PFN_vkBindImageMemory vkBindImageMemory;
+    PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements;
+    PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements;
+    PFN_vkGetImageSparseMemoryRequirements vkGetImageSparseMemoryRequirements;
+    PFN_vkGetPhysicalDeviceSparseImageFormatProperties
+        vkGetPhysicalDeviceSparseImageFormatProperties;
+    PFN_vkQueueBindSparse vkQueueBindSparse;
+    PFN_vkCreateFence vkCreateFence;
+    PFN_vkDestroyFence vkDestroyFence;
+    PFN_vkResetFences vkResetFences;
+    PFN_vkGetFenceStatus vkGetFenceStatus;
+    PFN_vkWaitForFences vkWaitForFences;
+    PFN_vkCreateSemaphore vkCreateSemaphore;
+    PFN_vkDestroySemaphore vkDestroySemaphore;
+    PFN_vkCreateEvent vkCreateEvent;
+    PFN_vkDestroyEvent vkDestroyEvent;
+    PFN_vkGetEventStatus vkGetEventStatus;
+    PFN_vkSetEvent vkSetEvent;
+    PFN_vkResetEvent vkResetEvent;
+    PFN_vkCreateQueryPool vkCreateQueryPool;
+    PFN_vkDestroyQueryPool vkDestroyQueryPool;
+    PFN_vkGetQueryPoolResults vkGetQueryPoolResults;
+    PFN_vkCreateBuffer vkCreateBuffer;
+    PFN_vkDestroyBuffer vkDestroyBuffer;
+    PFN_vkCreateBufferView vkCreateBufferView;
+    PFN_vkDestroyBufferView vkDestroyBufferView;
+    PFN_vkCreateImage vkCreateImage;
+    PFN_vkDestroyImage vkDestroyImage;
+    PFN_vkGetImageSubresourceLayout vkGetImageSubresourceLayout;
+    PFN_vkCreateImageView vkCreateImageView;
+    PFN_vkDestroyImageView vkDestroyImageView;
+    PFN_vkCreateShaderModule vkCreateShaderModule;
+    PFN_vkDestroyShaderModule vkDestroyShaderModule;
+    PFN_vkCreatePipelineCache vkCreatePipelineCache;
+    PFN_vkDestroyPipelineCache vkDestroyPipelineCache;
+    PFN_vkGetPipelineCacheData vkGetPipelineCacheData;
+    PFN_vkMergePipelineCaches vkMergePipelineCaches;
+    PFN_vkCreateGraphicsPipelines vkCreateGraphicsPipelines;
+    PFN_vkCreateComputePipelines vkCreateComputePipelines;
+    PFN_vkDestroyPipeline vkDestroyPipeline;
+    PFN_vkCreatePipelineLayout vkCreatePipelineLayout;
+    PFN_vkDestroyPipelineLayout vkDestroyPipelineLayout;
+    PFN_vkCreateSampler vkCreateSampler;
+    PFN_vkDestroySampler vkDestroySampler;
+    PFN_vkCreateDescriptorSetLayout vkCreateDescriptorSetLayout;
+    PFN_vkDestroyDescriptorSetLayout vkDestroyDescriptorSetLayout;
+    PFN_vkCreateDescriptorPool vkCreateDescriptorPool;
+    PFN_vkDestroyDescriptorPool vkDestroyDescriptorPool;
+    PFN_vkResetDescriptorPool vkResetDescriptorPool;
+    PFN_vkAllocateDescriptorSets vkAllocateDescriptorSets;
+    PFN_vkFreeDescriptorSets vkFreeDescriptorSets;
+    PFN_vkUpdateDescriptorSets vkUpdateDescriptorSets;
+    PFN_vkCreateFramebuffer vkCreateFramebuffer;
+    PFN_vkDestroyFramebuffer vkDestroyFramebuffer;
+    PFN_vkCreateRenderPass vkCreateRenderPass;
+    PFN_vkDestroyRenderPass vkDestroyRenderPass;
+    PFN_vkGetRenderAreaGranularity vkGetRenderAreaGranularity;
+    PFN_vkCreateCommandPool vkCreateCommandPool;
+    PFN_vkDestroyCommandPool vkDestroyCommandPool;
+    PFN_vkResetCommandPool vkResetCommandPool;
+    PFN_vkAllocateCommandBuffers vkAllocateCommandBuffers;
+    PFN_vkFreeCommandBuffers vkFreeCommandBuffers;
+    PFN_vkBeginCommandBuffer vkBeginCommandBuffer;
+    PFN_vkEndCommandBuffer vkEndCommandBuffer;
+    PFN_vkResetCommandBuffer vkResetCommandBuffer;
+    PFN_vkCmdBindPipeline vkCmdBindPipeline;
+    PFN_vkCmdSetViewport vkCmdSetViewport;
+    PFN_vkCmdSetScissor vkCmdSetScissor;
+    PFN_vkCmdSetLineWidth vkCmdSetLineWidth;
+    PFN_vkCmdSetDepthBias vkCmdSetDepthBias;
+    PFN_vkCmdSetBlendConstants vkCmdSetBlendConstants;
+    PFN_vkCmdSetDepthBounds vkCmdSetDepthBounds;
+    PFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask;
+    PFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask;
+    PFN_vkCmdSetStencilReference vkCmdSetStencilReference;
+    PFN_vkCmdBindDescriptorSets vkCmdBindDescriptorSets;
+    PFN_vkCmdBindIndexBuffer vkCmdBindIndexBuffer;
+    PFN_vkCmdBindVertexBuffers vkCmdBindVertexBuffers;
+    PFN_vkCmdDraw vkCmdDraw;
+    PFN_vkCmdDrawIndexed vkCmdDrawIndexed;
+    PFN_vkCmdDrawIndirect vkCmdDrawIndirect;
+    PFN_vkCmdDrawIndexedIndirect vkCmdDrawIndexedIndirect;
+    PFN_vkCmdDispatch vkCmdDispatch;
+    PFN_vkCmdDispatchIndirect vkCmdDispatchIndirect;
+    PFN_vkCmdCopyBuffer vkCmdCopyBuffer;
+    PFN_vkCmdCopyImage vkCmdCopyImage;
+    PFN_vkCmdBlitImage vkCmdBlitImage;
+    PFN_vkCmdCopyBufferToImage vkCmdCopyBufferToImage;
+    PFN_vkCmdCopyImageToBuffer vkCmdCopyImageToBuffer;
+    PFN_vkCmdUpdateBuffer vkCmdUpdateBuffer;
+    PFN_vkCmdFillBuffer vkCmdFillBuffer;
+    PFN_vkCmdClearColorImage vkCmdClearColorImage;
+    PFN_vkCmdClearDepthStencilImage vkCmdClearDepthStencilImage;
+    PFN_vkCmdClearAttachments vkCmdClearAttachments;
+    PFN_vkCmdResolveImage vkCmdResolveImage;
+    PFN_vkCmdSetEvent vkCmdSetEvent;
+    PFN_vkCmdResetEvent vkCmdResetEvent;
+    PFN_vkCmdWaitEvents vkCmdWaitEvents;
+    PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier;
+    PFN_vkCmdBeginQuery vkCmdBeginQuery;
+    PFN_vkCmdEndQuery vkCmdEndQuery;
+    PFN_vkCmdResetQueryPool vkCmdResetQueryPool;
+    PFN_vkCmdWriteTimestamp vkCmdWriteTimestamp;
+    PFN_vkCmdCopyQueryPoolResults vkCmdCopyQueryPoolResults;
+    PFN_vkCmdPushConstants vkCmdPushConstants;
+    PFN_vkCmdBeginRenderPass vkCmdBeginRenderPass;
+    PFN_vkCmdNextSubpass vkCmdNextSubpass;
+    PFN_vkCmdEndRenderPass vkCmdEndRenderPass;
+    PFN_vkCmdExecuteCommands vkCmdExecuteCommands;
 #endif
 #ifdef VK_VERSION_1_1
-PFN_vkEnumerateInstanceVersion vkEnumerateInstanceVersion;
-PFN_vkBindBufferMemory2 vkBindBufferMemory2;
-PFN_vkBindImageMemory2 vkBindImageMemory2;
-PFN_vkGetDeviceGroupPeerMemoryFeatures vkGetDeviceGroupPeerMemoryFeatures;
-PFN_vkCmdSetDeviceMask vkCmdSetDeviceMask;
-PFN_vkCmdDispatchBase vkCmdDispatchBase;
-PFN_vkEnumeratePhysicalDeviceGroups vkEnumeratePhysicalDeviceGroups;
-PFN_vkGetImageMemoryRequirements2 vkGetImageMemoryRequirements2;
-PFN_vkGetBufferMemoryRequirements2 vkGetBufferMemoryRequirements2;
-PFN_vkGetImageSparseMemoryRequirements2 vkGetImageSparseMemoryRequirements2;
-PFN_vkGetPhysicalDeviceFeatures2 vkGetPhysicalDeviceFeatures2;
-PFN_vkGetPhysicalDeviceProperties2 vkGetPhysicalDeviceProperties2;
-PFN_vkGetPhysicalDeviceFormatProperties2 vkGetPhysicalDeviceFormatProperties2;
-PFN_vkGetPhysicalDeviceImageFormatProperties2 vkGetPhysicalDeviceImageFormatProperties2;
-PFN_vkGetPhysicalDeviceQueueFamilyProperties2 vkGetPhysicalDeviceQueueFamilyProperties2;
-PFN_vkGetPhysicalDeviceMemoryProperties2 vkGetPhysicalDeviceMemoryProperties2;
-PFN_vkGetPhysicalDeviceSparseImageFormatProperties2 vkGetPhysicalDeviceSparseImageFormatProperties2;
-PFN_vkTrimCommandPool vkTrimCommandPool;
-PFN_vkGetDeviceQueue2 vkGetDeviceQueue2;
-PFN_vkCreateSamplerYcbcrConversion vkCreateSamplerYcbcrConversion;
-PFN_vkDestroySamplerYcbcrConversion vkDestroySamplerYcbcrConversion;
-PFN_vkCreateDescriptorUpdateTemplate vkCreateDescriptorUpdateTemplate;
-PFN_vkDestroyDescriptorUpdateTemplate vkDestroyDescriptorUpdateTemplate;
-PFN_vkUpdateDescriptorSetWithTemplate vkUpdateDescriptorSetWithTemplate;
-PFN_vkGetPhysicalDeviceExternalBufferProperties vkGetPhysicalDeviceExternalBufferProperties;
-PFN_vkGetPhysicalDeviceExternalFenceProperties vkGetPhysicalDeviceExternalFenceProperties;
-PFN_vkGetPhysicalDeviceExternalSemaphoreProperties vkGetPhysicalDeviceExternalSemaphoreProperties;
-PFN_vkGetDescriptorSetLayoutSupport vkGetDescriptorSetLayoutSupport;
+    PFN_vkEnumerateInstanceVersion vkEnumerateInstanceVersion;
+    PFN_vkBindBufferMemory2 vkBindBufferMemory2;
+    PFN_vkBindImageMemory2 vkBindImageMemory2;
+    PFN_vkGetDeviceGroupPeerMemoryFeatures vkGetDeviceGroupPeerMemoryFeatures;
+    PFN_vkCmdSetDeviceMask vkCmdSetDeviceMask;
+    PFN_vkCmdDispatchBase vkCmdDispatchBase;
+    PFN_vkEnumeratePhysicalDeviceGroups vkEnumeratePhysicalDeviceGroups;
+    PFN_vkGetImageMemoryRequirements2 vkGetImageMemoryRequirements2;
+    PFN_vkGetBufferMemoryRequirements2 vkGetBufferMemoryRequirements2;
+    PFN_vkGetImageSparseMemoryRequirements2 vkGetImageSparseMemoryRequirements2;
+    PFN_vkGetPhysicalDeviceFeatures2 vkGetPhysicalDeviceFeatures2;
+    PFN_vkGetPhysicalDeviceProperties2 vkGetPhysicalDeviceProperties2;
+    PFN_vkGetPhysicalDeviceFormatProperties2 vkGetPhysicalDeviceFormatProperties2;
+    PFN_vkGetPhysicalDeviceImageFormatProperties2 vkGetPhysicalDeviceImageFormatProperties2;
+    PFN_vkGetPhysicalDeviceQueueFamilyProperties2 vkGetPhysicalDeviceQueueFamilyProperties2;
+    PFN_vkGetPhysicalDeviceMemoryProperties2 vkGetPhysicalDeviceMemoryProperties2;
+    PFN_vkGetPhysicalDeviceSparseImageFormatProperties2
+        vkGetPhysicalDeviceSparseImageFormatProperties2;
+    PFN_vkTrimCommandPool vkTrimCommandPool;
+    PFN_vkGetDeviceQueue2 vkGetDeviceQueue2;
+    PFN_vkCreateSamplerYcbcrConversion vkCreateSamplerYcbcrConversion;
+    PFN_vkDestroySamplerYcbcrConversion vkDestroySamplerYcbcrConversion;
+    PFN_vkCreateDescriptorUpdateTemplate vkCreateDescriptorUpdateTemplate;
+    PFN_vkDestroyDescriptorUpdateTemplate vkDestroyDescriptorUpdateTemplate;
+    PFN_vkUpdateDescriptorSetWithTemplate vkUpdateDescriptorSetWithTemplate;
+    PFN_vkGetPhysicalDeviceExternalBufferProperties vkGetPhysicalDeviceExternalBufferProperties;
+    PFN_vkGetPhysicalDeviceExternalFenceProperties vkGetPhysicalDeviceExternalFenceProperties;
+    PFN_vkGetPhysicalDeviceExternalSemaphoreProperties
+        vkGetPhysicalDeviceExternalSemaphoreProperties;
+    PFN_vkGetDescriptorSetLayoutSupport vkGetDescriptorSetLayoutSupport;
 #endif
 #ifdef VK_VERSION_1_2
-PFN_vkCmdDrawIndirectCount vkCmdDrawIndirectCount;
-PFN_vkCmdDrawIndexedIndirectCount vkCmdDrawIndexedIndirectCount;
-PFN_vkCreateRenderPass2 vkCreateRenderPass2;
-PFN_vkCmdBeginRenderPass2 vkCmdBeginRenderPass2;
-PFN_vkCmdNextSubpass2 vkCmdNextSubpass2;
-PFN_vkCmdEndRenderPass2 vkCmdEndRenderPass2;
-PFN_vkResetQueryPool vkResetQueryPool;
-PFN_vkGetSemaphoreCounterValue vkGetSemaphoreCounterValue;
-PFN_vkWaitSemaphores vkWaitSemaphores;
-PFN_vkSignalSemaphore vkSignalSemaphore;
-PFN_vkGetBufferDeviceAddress vkGetBufferDeviceAddress;
-PFN_vkGetBufferOpaqueCaptureAddress vkGetBufferOpaqueCaptureAddress;
-PFN_vkGetDeviceMemoryOpaqueCaptureAddress vkGetDeviceMemoryOpaqueCaptureAddress;
+    PFN_vkCmdDrawIndirectCount vkCmdDrawIndirectCount;
+    PFN_vkCmdDrawIndexedIndirectCount vkCmdDrawIndexedIndirectCount;
+    PFN_vkCreateRenderPass2 vkCreateRenderPass2;
+    PFN_vkCmdBeginRenderPass2 vkCmdBeginRenderPass2;
+    PFN_vkCmdNextSubpass2 vkCmdNextSubpass2;
+    PFN_vkCmdEndRenderPass2 vkCmdEndRenderPass2;
+    PFN_vkResetQueryPool vkResetQueryPool;
+    PFN_vkGetSemaphoreCounterValue vkGetSemaphoreCounterValue;
+    PFN_vkWaitSemaphores vkWaitSemaphores;
+    PFN_vkSignalSemaphore vkSignalSemaphore;
+    PFN_vkGetBufferDeviceAddress vkGetBufferDeviceAddress;
+    PFN_vkGetBufferOpaqueCaptureAddress vkGetBufferOpaqueCaptureAddress;
+    PFN_vkGetDeviceMemoryOpaqueCaptureAddress vkGetDeviceMemoryOpaqueCaptureAddress;
 #endif
 #ifdef VK_KHR_surface
-PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR;
-PFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHR;
-PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR;
-PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR;
-PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR;
+    PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR;
+    PFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHR;
+    PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR;
+    PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR;
+    PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR;
 #endif
 #ifdef VK_KHR_swapchain
-PFN_vkCreateSwapchainKHR vkCreateSwapchainKHR;
-PFN_vkDestroySwapchainKHR vkDestroySwapchainKHR;
-PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR;
-PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR;
-PFN_vkQueuePresentKHR vkQueuePresentKHR;
-PFN_vkGetDeviceGroupPresentCapabilitiesKHR vkGetDeviceGroupPresentCapabilitiesKHR;
-PFN_vkGetDeviceGroupSurfacePresentModesKHR vkGetDeviceGroupSurfacePresentModesKHR;
-PFN_vkGetPhysicalDevicePresentRectanglesKHR vkGetPhysicalDevicePresentRectanglesKHR;
-PFN_vkAcquireNextImage2KHR vkAcquireNextImage2KHR;
+    PFN_vkCreateSwapchainKHR vkCreateSwapchainKHR;
+    PFN_vkDestroySwapchainKHR vkDestroySwapchainKHR;
+    PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR;
+    PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR;
+    PFN_vkQueuePresentKHR vkQueuePresentKHR;
+    PFN_vkGetDeviceGroupPresentCapabilitiesKHR vkGetDeviceGroupPresentCapabilitiesKHR;
+    PFN_vkGetDeviceGroupSurfacePresentModesKHR vkGetDeviceGroupSurfacePresentModesKHR;
+    PFN_vkGetPhysicalDevicePresentRectanglesKHR vkGetPhysicalDevicePresentRectanglesKHR;
+    PFN_vkAcquireNextImage2KHR vkAcquireNextImage2KHR;
 #endif
 #ifdef VK_KHR_display
-PFN_vkGetPhysicalDeviceDisplayPropertiesKHR vkGetPhysicalDeviceDisplayPropertiesKHR;
-PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR vkGetPhysicalDeviceDisplayPlanePropertiesKHR;
-PFN_vkGetDisplayPlaneSupportedDisplaysKHR vkGetDisplayPlaneSupportedDisplaysKHR;
-PFN_vkGetDisplayModePropertiesKHR vkGetDisplayModePropertiesKHR;
-PFN_vkCreateDisplayModeKHR vkCreateDisplayModeKHR;
-PFN_vkGetDisplayPlaneCapabilitiesKHR vkGetDisplayPlaneCapabilitiesKHR;
-PFN_vkCreateDisplayPlaneSurfaceKHR vkCreateDisplayPlaneSurfaceKHR;
+    PFN_vkGetPhysicalDeviceDisplayPropertiesKHR vkGetPhysicalDeviceDisplayPropertiesKHR;
+    PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR vkGetPhysicalDeviceDisplayPlanePropertiesKHR;
+    PFN_vkGetDisplayPlaneSupportedDisplaysKHR vkGetDisplayPlaneSupportedDisplaysKHR;
+    PFN_vkGetDisplayModePropertiesKHR vkGetDisplayModePropertiesKHR;
+    PFN_vkCreateDisplayModeKHR vkCreateDisplayModeKHR;
+    PFN_vkGetDisplayPlaneCapabilitiesKHR vkGetDisplayPlaneCapabilitiesKHR;
+    PFN_vkCreateDisplayPlaneSurfaceKHR vkCreateDisplayPlaneSurfaceKHR;
 #endif
 #ifdef VK_KHR_display_swapchain
-PFN_vkCreateSharedSwapchainsKHR vkCreateSharedSwapchainsKHR;
+    PFN_vkCreateSharedSwapchainsKHR vkCreateSharedSwapchainsKHR;
 #endif
 #ifdef VK_KHR_xlib_surface
-PFN_vkCreateXlibSurfaceKHR vkCreateXlibSurfaceKHR;
-PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR vkGetPhysicalDeviceXlibPresentationSupportKHR;
+    PFN_vkCreateXlibSurfaceKHR vkCreateXlibSurfaceKHR;
+    PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR vkGetPhysicalDeviceXlibPresentationSupportKHR;
 #endif
 #ifdef VK_KHR_xcb_surface
-PFN_vkCreateXcbSurfaceKHR vkCreateXcbSurfaceKHR;
-PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR vkGetPhysicalDeviceXcbPresentationSupportKHR;
+    PFN_vkCreateXcbSurfaceKHR vkCreateXcbSurfaceKHR;
+    PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR vkGetPhysicalDeviceXcbPresentationSupportKHR;
 #endif
 #ifdef VK_KHR_wayland_surface
-PFN_vkCreateWaylandSurfaceKHR vkCreateWaylandSurfaceKHR;
-PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR vkGetPhysicalDeviceWaylandPresentationSupportKHR;
+    PFN_vkCreateWaylandSurfaceKHR vkCreateWaylandSurfaceKHR;
+    PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR
+        vkGetPhysicalDeviceWaylandPresentationSupportKHR;
 #endif
 #ifdef VK_KHR_android_surface
-PFN_vkCreateAndroidSurfaceKHR vkCreateAndroidSurfaceKHR;
+    PFN_vkCreateAndroidSurfaceKHR vkCreateAndroidSurfaceKHR;
 #endif
 #ifdef VK_KHR_win32_surface
-PFN_vkCreateWin32SurfaceKHR vkCreateWin32SurfaceKHR;
-PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR vkGetPhysicalDeviceWin32PresentationSupportKHR;
+    PFN_vkCreateWin32SurfaceKHR vkCreateWin32SurfaceKHR;
+    PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR
+        vkGetPhysicalDeviceWin32PresentationSupportKHR;
 #endif
 #ifdef VK_KHR_sampler_mirror_clamp_to_edge
 #endif
 #ifdef VK_KHR_video_queue
-PFN_vkGetPhysicalDeviceVideoCapabilitiesKHR vkGetPhysicalDeviceVideoCapabilitiesKHR;
-PFN_vkGetPhysicalDeviceVideoFormatPropertiesKHR vkGetPhysicalDeviceVideoFormatPropertiesKHR;
-PFN_vkCreateVideoSessionKHR vkCreateVideoSessionKHR;
-PFN_vkDestroyVideoSessionKHR vkDestroyVideoSessionKHR;
-PFN_vkGetVideoSessionMemoryRequirementsKHR vkGetVideoSessionMemoryRequirementsKHR;
-PFN_vkBindVideoSessionMemoryKHR vkBindVideoSessionMemoryKHR;
-PFN_vkCreateVideoSessionParametersKHR vkCreateVideoSessionParametersKHR;
-PFN_vkUpdateVideoSessionParametersKHR vkUpdateVideoSessionParametersKHR;
-PFN_vkDestroyVideoSessionParametersKHR vkDestroyVideoSessionParametersKHR;
-PFN_vkCmdBeginVideoCodingKHR vkCmdBeginVideoCodingKHR;
-PFN_vkCmdEndVideoCodingKHR vkCmdEndVideoCodingKHR;
-PFN_vkCmdControlVideoCodingKHR vkCmdControlVideoCodingKHR;
+    PFN_vkGetPhysicalDeviceVideoCapabilitiesKHR vkGetPhysicalDeviceVideoCapabilitiesKHR;
+    PFN_vkGetPhysicalDeviceVideoFormatPropertiesKHR vkGetPhysicalDeviceVideoFormatPropertiesKHR;
+    PFN_vkCreateVideoSessionKHR vkCreateVideoSessionKHR;
+    PFN_vkDestroyVideoSessionKHR vkDestroyVideoSessionKHR;
+    PFN_vkGetVideoSessionMemoryRequirementsKHR vkGetVideoSessionMemoryRequirementsKHR;
+    PFN_vkBindVideoSessionMemoryKHR vkBindVideoSessionMemoryKHR;
+    PFN_vkCreateVideoSessionParametersKHR vkCreateVideoSessionParametersKHR;
+    PFN_vkUpdateVideoSessionParametersKHR vkUpdateVideoSessionParametersKHR;
+    PFN_vkDestroyVideoSessionParametersKHR vkDestroyVideoSessionParametersKHR;
+    PFN_vkCmdBeginVideoCodingKHR vkCmdBeginVideoCodingKHR;
+    PFN_vkCmdEndVideoCodingKHR vkCmdEndVideoCodingKHR;
+    PFN_vkCmdControlVideoCodingKHR vkCmdControlVideoCodingKHR;
 #endif
 #ifdef VK_KHR_video_decode_queue
-PFN_vkCmdDecodeVideoKHR vkCmdDecodeVideoKHR;
+    PFN_vkCmdDecodeVideoKHR vkCmdDecodeVideoKHR;
 #endif
 #ifdef VK_KHR_dynamic_rendering
-PFN_vkCmdBeginRenderingKHR vkCmdBeginRenderingKHR;
-PFN_vkCmdEndRenderingKHR vkCmdEndRenderingKHR;
+    PFN_vkCmdBeginRenderingKHR vkCmdBeginRenderingKHR;
+    PFN_vkCmdEndRenderingKHR vkCmdEndRenderingKHR;
 #endif
 #ifdef VK_KHR_multiview
 #endif
 #ifdef VK_KHR_get_physical_device_properties2
-PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR;
-PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR;
-PFN_vkGetPhysicalDeviceFormatProperties2KHR vkGetPhysicalDeviceFormatProperties2KHR;
-PFN_vkGetPhysicalDeviceImageFormatProperties2KHR vkGetPhysicalDeviceImageFormatProperties2KHR;
-PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR vkGetPhysicalDeviceQueueFamilyProperties2KHR;
-PFN_vkGetPhysicalDeviceMemoryProperties2KHR vkGetPhysicalDeviceMemoryProperties2KHR;
-PFN_vkGetPhysicalDeviceSparseImageFormatProperties2KHR vkGetPhysicalDeviceSparseImageFormatProperties2KHR;
+    PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR;
+    PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR;
+    PFN_vkGetPhysicalDeviceFormatProperties2KHR vkGetPhysicalDeviceFormatProperties2KHR;
+    PFN_vkGetPhysicalDeviceImageFormatProperties2KHR vkGetPhysicalDeviceImageFormatProperties2KHR;
+    PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR vkGetPhysicalDeviceQueueFamilyProperties2KHR;
+    PFN_vkGetPhysicalDeviceMemoryProperties2KHR vkGetPhysicalDeviceMemoryProperties2KHR;
+    PFN_vkGetPhysicalDeviceSparseImageFormatProperties2KHR
+        vkGetPhysicalDeviceSparseImageFormatProperties2KHR;
 #endif
 #ifdef VK_KHR_device_group
-PFN_vkGetDeviceGroupPeerMemoryFeaturesKHR vkGetDeviceGroupPeerMemoryFeaturesKHR;
-PFN_vkCmdSetDeviceMaskKHR vkCmdSetDeviceMaskKHR;
-PFN_vkCmdDispatchBaseKHR vkCmdDispatchBaseKHR;
+    PFN_vkGetDeviceGroupPeerMemoryFeaturesKHR vkGetDeviceGroupPeerMemoryFeaturesKHR;
+    PFN_vkCmdSetDeviceMaskKHR vkCmdSetDeviceMaskKHR;
+    PFN_vkCmdDispatchBaseKHR vkCmdDispatchBaseKHR;
 #endif
 #ifdef VK_KHR_shader_draw_parameters
 #endif
 #ifdef VK_KHR_maintenance1
-PFN_vkTrimCommandPoolKHR vkTrimCommandPoolKHR;
+    PFN_vkTrimCommandPoolKHR vkTrimCommandPoolKHR;
 #endif
 #ifdef VK_KHR_device_group_creation
-PFN_vkEnumeratePhysicalDeviceGroupsKHR vkEnumeratePhysicalDeviceGroupsKHR;
+    PFN_vkEnumeratePhysicalDeviceGroupsKHR vkEnumeratePhysicalDeviceGroupsKHR;
 #endif
 #ifdef VK_KHR_external_memory_capabilities
-PFN_vkGetPhysicalDeviceExternalBufferPropertiesKHR vkGetPhysicalDeviceExternalBufferPropertiesKHR;
+    PFN_vkGetPhysicalDeviceExternalBufferPropertiesKHR
+        vkGetPhysicalDeviceExternalBufferPropertiesKHR;
 #endif
 #ifdef VK_KHR_external_memory
 #endif
 #ifdef VK_KHR_external_memory_win32
-PFN_vkGetMemoryWin32HandleKHR vkGetMemoryWin32HandleKHR;
-PFN_vkGetMemoryWin32HandlePropertiesKHR vkGetMemoryWin32HandlePropertiesKHR;
+    PFN_vkGetMemoryWin32HandleKHR vkGetMemoryWin32HandleKHR;
+    PFN_vkGetMemoryWin32HandlePropertiesKHR vkGetMemoryWin32HandlePropertiesKHR;
 #endif
 #ifdef VK_KHR_external_memory_fd
-PFN_vkGetMemoryFdKHR vkGetMemoryFdKHR;
-PFN_vkGetMemoryFdPropertiesKHR vkGetMemoryFdPropertiesKHR;
+    PFN_vkGetMemoryFdKHR vkGetMemoryFdKHR;
+    PFN_vkGetMemoryFdPropertiesKHR vkGetMemoryFdPropertiesKHR;
 #endif
 #ifdef VK_KHR_win32_keyed_mutex
 #endif
 #ifdef VK_KHR_external_semaphore_capabilities
-PFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR vkGetPhysicalDeviceExternalSemaphorePropertiesKHR;
+    PFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR
+        vkGetPhysicalDeviceExternalSemaphorePropertiesKHR;
 #endif
 #ifdef VK_KHR_external_semaphore
 #endif
 #ifdef VK_KHR_external_semaphore_win32
-PFN_vkImportSemaphoreWin32HandleKHR vkImportSemaphoreWin32HandleKHR;
-PFN_vkGetSemaphoreWin32HandleKHR vkGetSemaphoreWin32HandleKHR;
+    PFN_vkImportSemaphoreWin32HandleKHR vkImportSemaphoreWin32HandleKHR;
+    PFN_vkGetSemaphoreWin32HandleKHR vkGetSemaphoreWin32HandleKHR;
 #endif
 #ifdef VK_KHR_external_semaphore_fd
-PFN_vkImportSemaphoreFdKHR vkImportSemaphoreFdKHR;
-PFN_vkGetSemaphoreFdKHR vkGetSemaphoreFdKHR;
+    PFN_vkImportSemaphoreFdKHR vkImportSemaphoreFdKHR;
+    PFN_vkGetSemaphoreFdKHR vkGetSemaphoreFdKHR;
 #endif
 #ifdef VK_KHR_push_descriptor
-PFN_vkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHR;
-PFN_vkCmdPushDescriptorSetWithTemplateKHR vkCmdPushDescriptorSetWithTemplateKHR;
+    PFN_vkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHR;
+    PFN_vkCmdPushDescriptorSetWithTemplateKHR vkCmdPushDescriptorSetWithTemplateKHR;
 #endif
 #ifdef VK_KHR_shader_float16_int8
 #endif
@@ -390,53 +388,55 @@
 #ifdef VK_KHR_incremental_present
 #endif
 #ifdef VK_KHR_descriptor_update_template
-PFN_vkCreateDescriptorUpdateTemplateKHR vkCreateDescriptorUpdateTemplateKHR;
-PFN_vkDestroyDescriptorUpdateTemplateKHR vkDestroyDescriptorUpdateTemplateKHR;
-PFN_vkUpdateDescriptorSetWithTemplateKHR vkUpdateDescriptorSetWithTemplateKHR;
+    PFN_vkCreateDescriptorUpdateTemplateKHR vkCreateDescriptorUpdateTemplateKHR;
+    PFN_vkDestroyDescriptorUpdateTemplateKHR vkDestroyDescriptorUpdateTemplateKHR;
+    PFN_vkUpdateDescriptorSetWithTemplateKHR vkUpdateDescriptorSetWithTemplateKHR;
 #endif
 #ifdef VK_KHR_imageless_framebuffer
 #endif
 #ifdef VK_KHR_create_renderpass2
-PFN_vkCreateRenderPass2KHR vkCreateRenderPass2KHR;
-PFN_vkCmdBeginRenderPass2KHR vkCmdBeginRenderPass2KHR;
-PFN_vkCmdNextSubpass2KHR vkCmdNextSubpass2KHR;
-PFN_vkCmdEndRenderPass2KHR vkCmdEndRenderPass2KHR;
+    PFN_vkCreateRenderPass2KHR vkCreateRenderPass2KHR;
+    PFN_vkCmdBeginRenderPass2KHR vkCmdBeginRenderPass2KHR;
+    PFN_vkCmdNextSubpass2KHR vkCmdNextSubpass2KHR;
+    PFN_vkCmdEndRenderPass2KHR vkCmdEndRenderPass2KHR;
 #endif
 #ifdef VK_KHR_shared_presentable_image
-PFN_vkGetSwapchainStatusKHR vkGetSwapchainStatusKHR;
+    PFN_vkGetSwapchainStatusKHR vkGetSwapchainStatusKHR;
 #endif
 #ifdef VK_KHR_external_fence_capabilities
-PFN_vkGetPhysicalDeviceExternalFencePropertiesKHR vkGetPhysicalDeviceExternalFencePropertiesKHR;
+    PFN_vkGetPhysicalDeviceExternalFencePropertiesKHR vkGetPhysicalDeviceExternalFencePropertiesKHR;
 #endif
 #ifdef VK_KHR_external_fence
 #endif
 #ifdef VK_KHR_external_fence_win32
-PFN_vkImportFenceWin32HandleKHR vkImportFenceWin32HandleKHR;
-PFN_vkGetFenceWin32HandleKHR vkGetFenceWin32HandleKHR;
+    PFN_vkImportFenceWin32HandleKHR vkImportFenceWin32HandleKHR;
+    PFN_vkGetFenceWin32HandleKHR vkGetFenceWin32HandleKHR;
 #endif
 #ifdef VK_KHR_external_fence_fd
-PFN_vkImportFenceFdKHR vkImportFenceFdKHR;
-PFN_vkGetFenceFdKHR vkGetFenceFdKHR;
+    PFN_vkImportFenceFdKHR vkImportFenceFdKHR;
+    PFN_vkGetFenceFdKHR vkGetFenceFdKHR;
 #endif
 #ifdef VK_KHR_performance_query
-PFN_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR;
-PFN_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR;
-PFN_vkAcquireProfilingLockKHR vkAcquireProfilingLockKHR;
-PFN_vkReleaseProfilingLockKHR vkReleaseProfilingLockKHR;
+    PFN_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR
+        vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR;
+    PFN_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR
+        vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR;
+    PFN_vkAcquireProfilingLockKHR vkAcquireProfilingLockKHR;
+    PFN_vkReleaseProfilingLockKHR vkReleaseProfilingLockKHR;
 #endif
 #ifdef VK_KHR_maintenance2
 #endif
 #ifdef VK_KHR_get_surface_capabilities2
-PFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR vkGetPhysicalDeviceSurfaceCapabilities2KHR;
-PFN_vkGetPhysicalDeviceSurfaceFormats2KHR vkGetPhysicalDeviceSurfaceFormats2KHR;
+    PFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR vkGetPhysicalDeviceSurfaceCapabilities2KHR;
+    PFN_vkGetPhysicalDeviceSurfaceFormats2KHR vkGetPhysicalDeviceSurfaceFormats2KHR;
 #endif
 #ifdef VK_KHR_variable_pointers
 #endif
 #ifdef VK_KHR_get_display_properties2
-PFN_vkGetPhysicalDeviceDisplayProperties2KHR vkGetPhysicalDeviceDisplayProperties2KHR;
-PFN_vkGetPhysicalDeviceDisplayPlaneProperties2KHR vkGetPhysicalDeviceDisplayPlaneProperties2KHR;
-PFN_vkGetDisplayModeProperties2KHR vkGetDisplayModeProperties2KHR;
-PFN_vkGetDisplayPlaneCapabilities2KHR vkGetDisplayPlaneCapabilities2KHR;
+    PFN_vkGetPhysicalDeviceDisplayProperties2KHR vkGetPhysicalDeviceDisplayProperties2KHR;
+    PFN_vkGetPhysicalDeviceDisplayPlaneProperties2KHR vkGetPhysicalDeviceDisplayPlaneProperties2KHR;
+    PFN_vkGetDisplayModeProperties2KHR vkGetDisplayModeProperties2KHR;
+    PFN_vkGetDisplayPlaneCapabilities2KHR vkGetDisplayPlaneCapabilities2KHR;
 #endif
 #ifdef VK_KHR_dedicated_allocation
 #endif
@@ -445,28 +445,28 @@
 #ifdef VK_KHR_relaxed_block_layout
 #endif
 #ifdef VK_KHR_get_memory_requirements2
-PFN_vkGetImageMemoryRequirements2KHR vkGetImageMemoryRequirements2KHR;
-PFN_vkGetBufferMemoryRequirements2KHR vkGetBufferMemoryRequirements2KHR;
-PFN_vkGetImageSparseMemoryRequirements2KHR vkGetImageSparseMemoryRequirements2KHR;
+    PFN_vkGetImageMemoryRequirements2KHR vkGetImageMemoryRequirements2KHR;
+    PFN_vkGetBufferMemoryRequirements2KHR vkGetBufferMemoryRequirements2KHR;
+    PFN_vkGetImageSparseMemoryRequirements2KHR vkGetImageSparseMemoryRequirements2KHR;
 #endif
 #ifdef VK_KHR_image_format_list
 #endif
 #ifdef VK_KHR_sampler_ycbcr_conversion
-PFN_vkCreateSamplerYcbcrConversionKHR vkCreateSamplerYcbcrConversionKHR;
-PFN_vkDestroySamplerYcbcrConversionKHR vkDestroySamplerYcbcrConversionKHR;
+    PFN_vkCreateSamplerYcbcrConversionKHR vkCreateSamplerYcbcrConversionKHR;
+    PFN_vkDestroySamplerYcbcrConversionKHR vkDestroySamplerYcbcrConversionKHR;
 #endif
 #ifdef VK_KHR_bind_memory2
-PFN_vkBindBufferMemory2KHR vkBindBufferMemory2KHR;
-PFN_vkBindImageMemory2KHR vkBindImageMemory2KHR;
+    PFN_vkBindBufferMemory2KHR vkBindBufferMemory2KHR;
+    PFN_vkBindImageMemory2KHR vkBindImageMemory2KHR;
 #endif
 #ifdef VK_KHR_portability_subset
 #endif
 #ifdef VK_KHR_maintenance3
-PFN_vkGetDescriptorSetLayoutSupportKHR vkGetDescriptorSetLayoutSupportKHR;
+    PFN_vkGetDescriptorSetLayoutSupportKHR vkGetDescriptorSetLayoutSupportKHR;
 #endif
 #ifdef VK_KHR_draw_indirect_count
-PFN_vkCmdDrawIndirectCountKHR vkCmdDrawIndirectCountKHR;
-PFN_vkCmdDrawIndexedIndirectCountKHR vkCmdDrawIndexedIndirectCountKHR;
+    PFN_vkCmdDrawIndirectCountKHR vkCmdDrawIndirectCountKHR;
+    PFN_vkCmdDrawIndexedIndirectCountKHR vkCmdDrawIndexedIndirectCountKHR;
 #endif
 #ifdef VK_KHR_shader_subgroup_extended_types
 #endif
@@ -485,17 +485,17 @@
 #ifdef VK_KHR_swapchain_mutable_format
 #endif
 #ifdef VK_KHR_timeline_semaphore
-PFN_vkGetSemaphoreCounterValueKHR vkGetSemaphoreCounterValueKHR;
-PFN_vkWaitSemaphoresKHR vkWaitSemaphoresKHR;
-PFN_vkSignalSemaphoreKHR vkSignalSemaphoreKHR;
+    PFN_vkGetSemaphoreCounterValueKHR vkGetSemaphoreCounterValueKHR;
+    PFN_vkWaitSemaphoresKHR vkWaitSemaphoresKHR;
+    PFN_vkSignalSemaphoreKHR vkSignalSemaphoreKHR;
 #endif
 #ifdef VK_KHR_vulkan_memory_model
 #endif
 #ifdef VK_KHR_shader_terminate_invocation
 #endif
 #ifdef VK_KHR_fragment_shading_rate
-PFN_vkGetPhysicalDeviceFragmentShadingRatesKHR vkGetPhysicalDeviceFragmentShadingRatesKHR;
-PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR;
+    PFN_vkGetPhysicalDeviceFragmentShadingRatesKHR vkGetPhysicalDeviceFragmentShadingRatesKHR;
+    PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR;
 #endif
 #ifdef VK_KHR_spirv_1_4
 #endif
@@ -504,26 +504,27 @@
 #ifdef VK_KHR_separate_depth_stencil_layouts
 #endif
 #ifdef VK_KHR_present_wait
-PFN_vkWaitForPresentKHR vkWaitForPresentKHR;
+    PFN_vkWaitForPresentKHR vkWaitForPresentKHR;
 #endif
 #ifdef VK_KHR_uniform_buffer_standard_layout
 #endif
 #ifdef VK_KHR_buffer_device_address
-PFN_vkGetBufferDeviceAddressKHR vkGetBufferDeviceAddressKHR;
-PFN_vkGetBufferOpaqueCaptureAddressKHR vkGetBufferOpaqueCaptureAddressKHR;
-PFN_vkGetDeviceMemoryOpaqueCaptureAddressKHR vkGetDeviceMemoryOpaqueCaptureAddressKHR;
+    PFN_vkGetBufferDeviceAddressKHR vkGetBufferDeviceAddressKHR;
+    PFN_vkGetBufferOpaqueCaptureAddressKHR vkGetBufferOpaqueCaptureAddressKHR;
+    PFN_vkGetDeviceMemoryOpaqueCaptureAddressKHR vkGetDeviceMemoryOpaqueCaptureAddressKHR;
 #endif
 #ifdef VK_KHR_deferred_host_operations
-PFN_vkCreateDeferredOperationKHR vkCreateDeferredOperationKHR;
-PFN_vkDestroyDeferredOperationKHR vkDestroyDeferredOperationKHR;
-PFN_vkGetDeferredOperationMaxConcurrencyKHR vkGetDeferredOperationMaxConcurrencyKHR;
-PFN_vkGetDeferredOperationResultKHR vkGetDeferredOperationResultKHR;
-PFN_vkDeferredOperationJoinKHR vkDeferredOperationJoinKHR;
+    PFN_vkCreateDeferredOperationKHR vkCreateDeferredOperationKHR;
+    PFN_vkDestroyDeferredOperationKHR vkDestroyDeferredOperationKHR;
+    PFN_vkGetDeferredOperationMaxConcurrencyKHR vkGetDeferredOperationMaxConcurrencyKHR;
+    PFN_vkGetDeferredOperationResultKHR vkGetDeferredOperationResultKHR;
+    PFN_vkDeferredOperationJoinKHR vkDeferredOperationJoinKHR;
 #endif
 #ifdef VK_KHR_pipeline_executable_properties
-PFN_vkGetPipelineExecutablePropertiesKHR vkGetPipelineExecutablePropertiesKHR;
-PFN_vkGetPipelineExecutableStatisticsKHR vkGetPipelineExecutableStatisticsKHR;
-PFN_vkGetPipelineExecutableInternalRepresentationsKHR vkGetPipelineExecutableInternalRepresentationsKHR;
+    PFN_vkGetPipelineExecutablePropertiesKHR vkGetPipelineExecutablePropertiesKHR;
+    PFN_vkGetPipelineExecutableStatisticsKHR vkGetPipelineExecutableStatisticsKHR;
+    PFN_vkGetPipelineExecutableInternalRepresentationsKHR
+        vkGetPipelineExecutableInternalRepresentationsKHR;
 #endif
 #ifdef VK_KHR_shader_integer_dot_product
 #endif
@@ -534,17 +535,17 @@
 #ifdef VK_KHR_present_id
 #endif
 #ifdef VK_KHR_video_encode_queue
-PFN_vkCmdEncodeVideoKHR vkCmdEncodeVideoKHR;
+    PFN_vkCmdEncodeVideoKHR vkCmdEncodeVideoKHR;
 #endif
 #ifdef VK_KHR_synchronization2
-PFN_vkCmdSetEvent2KHR vkCmdSetEvent2KHR;
-PFN_vkCmdResetEvent2KHR vkCmdResetEvent2KHR;
-PFN_vkCmdWaitEvents2KHR vkCmdWaitEvents2KHR;
-PFN_vkCmdPipelineBarrier2KHR vkCmdPipelineBarrier2KHR;
-PFN_vkCmdWriteTimestamp2KHR vkCmdWriteTimestamp2KHR;
-PFN_vkQueueSubmit2KHR vkQueueSubmit2KHR;
-PFN_vkCmdWriteBufferMarker2AMD vkCmdWriteBufferMarker2AMD;
-PFN_vkGetQueueCheckpointData2NV vkGetQueueCheckpointData2NV;
+    PFN_vkCmdSetEvent2KHR vkCmdSetEvent2KHR;
+    PFN_vkCmdResetEvent2KHR vkCmdResetEvent2KHR;
+    PFN_vkCmdWaitEvents2KHR vkCmdWaitEvents2KHR;
+    PFN_vkCmdPipelineBarrier2KHR vkCmdPipelineBarrier2KHR;
+    PFN_vkCmdWriteTimestamp2KHR vkCmdWriteTimestamp2KHR;
+    PFN_vkQueueSubmit2KHR vkQueueSubmit2KHR;
+    PFN_vkCmdWriteBufferMarker2AMD vkCmdWriteBufferMarker2AMD;
+    PFN_vkGetQueueCheckpointData2NV vkGetQueueCheckpointData2NV;
 #endif
 #ifdef VK_KHR_shader_subgroup_uniform_control_flow
 #endif
@@ -553,29 +554,29 @@
 #ifdef VK_KHR_workgroup_memory_explicit_layout
 #endif
 #ifdef VK_KHR_copy_commands2
-PFN_vkCmdCopyBuffer2KHR vkCmdCopyBuffer2KHR;
-PFN_vkCmdCopyImage2KHR vkCmdCopyImage2KHR;
-PFN_vkCmdCopyBufferToImage2KHR vkCmdCopyBufferToImage2KHR;
-PFN_vkCmdCopyImageToBuffer2KHR vkCmdCopyImageToBuffer2KHR;
-PFN_vkCmdBlitImage2KHR vkCmdBlitImage2KHR;
-PFN_vkCmdResolveImage2KHR vkCmdResolveImage2KHR;
+    PFN_vkCmdCopyBuffer2KHR vkCmdCopyBuffer2KHR;
+    PFN_vkCmdCopyImage2KHR vkCmdCopyImage2KHR;
+    PFN_vkCmdCopyBufferToImage2KHR vkCmdCopyBufferToImage2KHR;
+    PFN_vkCmdCopyImageToBuffer2KHR vkCmdCopyImageToBuffer2KHR;
+    PFN_vkCmdBlitImage2KHR vkCmdBlitImage2KHR;
+    PFN_vkCmdResolveImage2KHR vkCmdResolveImage2KHR;
 #endif
 #ifdef VK_KHR_format_feature_flags2
 #endif
 #ifdef VK_KHR_maintenance4
-PFN_vkGetDeviceBufferMemoryRequirementsKHR vkGetDeviceBufferMemoryRequirementsKHR;
-PFN_vkGetDeviceImageMemoryRequirementsKHR vkGetDeviceImageMemoryRequirementsKHR;
-PFN_vkGetDeviceImageSparseMemoryRequirementsKHR vkGetDeviceImageSparseMemoryRequirementsKHR;
+    PFN_vkGetDeviceBufferMemoryRequirementsKHR vkGetDeviceBufferMemoryRequirementsKHR;
+    PFN_vkGetDeviceImageMemoryRequirementsKHR vkGetDeviceImageMemoryRequirementsKHR;
+    PFN_vkGetDeviceImageSparseMemoryRequirementsKHR vkGetDeviceImageSparseMemoryRequirementsKHR;
 #endif
 #ifdef VK_ANDROID_native_buffer
-PFN_vkGetSwapchainGrallocUsageANDROID vkGetSwapchainGrallocUsageANDROID;
-PFN_vkAcquireImageANDROID vkAcquireImageANDROID;
-PFN_vkQueueSignalReleaseImageANDROID vkQueueSignalReleaseImageANDROID;
+    PFN_vkGetSwapchainGrallocUsageANDROID vkGetSwapchainGrallocUsageANDROID;
+    PFN_vkAcquireImageANDROID vkAcquireImageANDROID;
+    PFN_vkQueueSignalReleaseImageANDROID vkQueueSignalReleaseImageANDROID;
 #endif
 #ifdef VK_EXT_debug_report
-PFN_vkCreateDebugReportCallbackEXT vkCreateDebugReportCallbackEXT;
-PFN_vkDestroyDebugReportCallbackEXT vkDestroyDebugReportCallbackEXT;
-PFN_vkDebugReportMessageEXT vkDebugReportMessageEXT;
+    PFN_vkCreateDebugReportCallbackEXT vkCreateDebugReportCallbackEXT;
+    PFN_vkDestroyDebugReportCallbackEXT vkDestroyDebugReportCallbackEXT;
+    PFN_vkDebugReportMessageEXT vkDebugReportMessageEXT;
 #endif
 #ifdef VK_NV_glsl_shader
 #endif
@@ -590,38 +591,38 @@
 #ifdef VK_AMD_shader_explicit_vertex_parameter
 #endif
 #ifdef VK_EXT_debug_marker
-PFN_vkDebugMarkerSetObjectTagEXT vkDebugMarkerSetObjectTagEXT;
-PFN_vkDebugMarkerSetObjectNameEXT vkDebugMarkerSetObjectNameEXT;
-PFN_vkCmdDebugMarkerBeginEXT vkCmdDebugMarkerBeginEXT;
-PFN_vkCmdDebugMarkerEndEXT vkCmdDebugMarkerEndEXT;
-PFN_vkCmdDebugMarkerInsertEXT vkCmdDebugMarkerInsertEXT;
+    PFN_vkDebugMarkerSetObjectTagEXT vkDebugMarkerSetObjectTagEXT;
+    PFN_vkDebugMarkerSetObjectNameEXT vkDebugMarkerSetObjectNameEXT;
+    PFN_vkCmdDebugMarkerBeginEXT vkCmdDebugMarkerBeginEXT;
+    PFN_vkCmdDebugMarkerEndEXT vkCmdDebugMarkerEndEXT;
+    PFN_vkCmdDebugMarkerInsertEXT vkCmdDebugMarkerInsertEXT;
 #endif
 #ifdef VK_AMD_gcn_shader
 #endif
 #ifdef VK_NV_dedicated_allocation
 #endif
 #ifdef VK_EXT_transform_feedback
-PFN_vkCmdBindTransformFeedbackBuffersEXT vkCmdBindTransformFeedbackBuffersEXT;
-PFN_vkCmdBeginTransformFeedbackEXT vkCmdBeginTransformFeedbackEXT;
-PFN_vkCmdEndTransformFeedbackEXT vkCmdEndTransformFeedbackEXT;
-PFN_vkCmdBeginQueryIndexedEXT vkCmdBeginQueryIndexedEXT;
-PFN_vkCmdEndQueryIndexedEXT vkCmdEndQueryIndexedEXT;
-PFN_vkCmdDrawIndirectByteCountEXT vkCmdDrawIndirectByteCountEXT;
+    PFN_vkCmdBindTransformFeedbackBuffersEXT vkCmdBindTransformFeedbackBuffersEXT;
+    PFN_vkCmdBeginTransformFeedbackEXT vkCmdBeginTransformFeedbackEXT;
+    PFN_vkCmdEndTransformFeedbackEXT vkCmdEndTransformFeedbackEXT;
+    PFN_vkCmdBeginQueryIndexedEXT vkCmdBeginQueryIndexedEXT;
+    PFN_vkCmdEndQueryIndexedEXT vkCmdEndQueryIndexedEXT;
+    PFN_vkCmdDrawIndirectByteCountEXT vkCmdDrawIndirectByteCountEXT;
 #endif
 #ifdef VK_NVX_binary_import
-PFN_vkCreateCuModuleNVX vkCreateCuModuleNVX;
-PFN_vkCreateCuFunctionNVX vkCreateCuFunctionNVX;
-PFN_vkDestroyCuModuleNVX vkDestroyCuModuleNVX;
-PFN_vkDestroyCuFunctionNVX vkDestroyCuFunctionNVX;
-PFN_vkCmdCuLaunchKernelNVX vkCmdCuLaunchKernelNVX;
+    PFN_vkCreateCuModuleNVX vkCreateCuModuleNVX;
+    PFN_vkCreateCuFunctionNVX vkCreateCuFunctionNVX;
+    PFN_vkDestroyCuModuleNVX vkDestroyCuModuleNVX;
+    PFN_vkDestroyCuFunctionNVX vkDestroyCuFunctionNVX;
+    PFN_vkCmdCuLaunchKernelNVX vkCmdCuLaunchKernelNVX;
 #endif
 #ifdef VK_NVX_image_view_handle
-PFN_vkGetImageViewHandleNVX vkGetImageViewHandleNVX;
-PFN_vkGetImageViewAddressNVX vkGetImageViewAddressNVX;
+    PFN_vkGetImageViewHandleNVX vkGetImageViewHandleNVX;
+    PFN_vkGetImageViewAddressNVX vkGetImageViewAddressNVX;
 #endif
 #ifdef VK_AMD_draw_indirect_count
-PFN_vkCmdDrawIndirectCountAMD vkCmdDrawIndirectCountAMD;
-PFN_vkCmdDrawIndexedIndirectCountAMD vkCmdDrawIndexedIndirectCountAMD;
+    PFN_vkCmdDrawIndirectCountAMD vkCmdDrawIndirectCountAMD;
+    PFN_vkCmdDrawIndexedIndirectCountAMD vkCmdDrawIndexedIndirectCountAMD;
 #endif
 #ifdef VK_AMD_negative_viewport_height
 #endif
@@ -638,31 +639,32 @@
 #ifdef VK_AMD_texture_gather_bias_lod
 #endif
 #ifdef VK_AMD_shader_info
-PFN_vkGetShaderInfoAMD vkGetShaderInfoAMD;
+    PFN_vkGetShaderInfoAMD vkGetShaderInfoAMD;
 #endif
 #ifdef VK_AMD_shader_image_load_store_lod
 #endif
 #ifdef VK_GGP_stream_descriptor_surface
-PFN_vkCreateStreamDescriptorSurfaceGGP vkCreateStreamDescriptorSurfaceGGP;
+    PFN_vkCreateStreamDescriptorSurfaceGGP vkCreateStreamDescriptorSurfaceGGP;
 #endif
 #ifdef VK_NV_corner_sampled_image
 #endif
 #ifdef VK_IMG_format_pvrtc
 #endif
 #ifdef VK_NV_external_memory_capabilities
-PFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV vkGetPhysicalDeviceExternalImageFormatPropertiesNV;
+    PFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV
+        vkGetPhysicalDeviceExternalImageFormatPropertiesNV;
 #endif
 #ifdef VK_NV_external_memory
 #endif
 #ifdef VK_NV_external_memory_win32
-PFN_vkGetMemoryWin32HandleNV vkGetMemoryWin32HandleNV;
+    PFN_vkGetMemoryWin32HandleNV vkGetMemoryWin32HandleNV;
 #endif
 #ifdef VK_NV_win32_keyed_mutex
 #endif
 #ifdef VK_EXT_validation_flags
 #endif
 #ifdef VK_NN_vi_surface
-PFN_vkCreateViSurfaceNN vkCreateViSurfaceNN;
+    PFN_vkCreateViSurfaceNN vkCreateViSurfaceNN;
 #endif
 #ifdef VK_EXT_shader_subgroup_ballot
 #endif
@@ -673,31 +675,31 @@
 #ifdef VK_EXT_astc_decode_mode
 #endif
 #ifdef VK_EXT_conditional_rendering
-PFN_vkCmdBeginConditionalRenderingEXT vkCmdBeginConditionalRenderingEXT;
-PFN_vkCmdEndConditionalRenderingEXT vkCmdEndConditionalRenderingEXT;
+    PFN_vkCmdBeginConditionalRenderingEXT vkCmdBeginConditionalRenderingEXT;
+    PFN_vkCmdEndConditionalRenderingEXT vkCmdEndConditionalRenderingEXT;
 #endif
 #ifdef VK_NV_clip_space_w_scaling
-PFN_vkCmdSetViewportWScalingNV vkCmdSetViewportWScalingNV;
+    PFN_vkCmdSetViewportWScalingNV vkCmdSetViewportWScalingNV;
 #endif
 #ifdef VK_EXT_direct_mode_display
-PFN_vkReleaseDisplayEXT vkReleaseDisplayEXT;
+    PFN_vkReleaseDisplayEXT vkReleaseDisplayEXT;
 #endif
 #ifdef VK_EXT_acquire_xlib_display
-PFN_vkAcquireXlibDisplayEXT vkAcquireXlibDisplayEXT;
-PFN_vkGetRandROutputDisplayEXT vkGetRandROutputDisplayEXT;
+    PFN_vkAcquireXlibDisplayEXT vkAcquireXlibDisplayEXT;
+    PFN_vkGetRandROutputDisplayEXT vkGetRandROutputDisplayEXT;
 #endif
 #ifdef VK_EXT_display_surface_counter
-PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT vkGetPhysicalDeviceSurfaceCapabilities2EXT;
+    PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT vkGetPhysicalDeviceSurfaceCapabilities2EXT;
 #endif
 #ifdef VK_EXT_display_control
-PFN_vkDisplayPowerControlEXT vkDisplayPowerControlEXT;
-PFN_vkRegisterDeviceEventEXT vkRegisterDeviceEventEXT;
-PFN_vkRegisterDisplayEventEXT vkRegisterDisplayEventEXT;
-PFN_vkGetSwapchainCounterEXT vkGetSwapchainCounterEXT;
+    PFN_vkDisplayPowerControlEXT vkDisplayPowerControlEXT;
+    PFN_vkRegisterDeviceEventEXT vkRegisterDeviceEventEXT;
+    PFN_vkRegisterDisplayEventEXT vkRegisterDisplayEventEXT;
+    PFN_vkGetSwapchainCounterEXT vkGetSwapchainCounterEXT;
 #endif
 #ifdef VK_GOOGLE_display_timing
-PFN_vkGetRefreshCycleDurationGOOGLE vkGetRefreshCycleDurationGOOGLE;
-PFN_vkGetPastPresentationTimingGOOGLE vkGetPastPresentationTimingGOOGLE;
+    PFN_vkGetRefreshCycleDurationGOOGLE vkGetRefreshCycleDurationGOOGLE;
+    PFN_vkGetPastPresentationTimingGOOGLE vkGetPastPresentationTimingGOOGLE;
 #endif
 #ifdef VK_NV_sample_mask_override_coverage
 #endif
@@ -710,7 +712,7 @@
 #ifdef VK_NV_viewport_swizzle
 #endif
 #ifdef VK_EXT_discard_rectangles
-PFN_vkCmdSetDiscardRectangleEXT vkCmdSetDiscardRectangleEXT;
+    PFN_vkCmdSetDiscardRectangleEXT vkCmdSetDiscardRectangleEXT;
 #endif
 #ifdef VK_EXT_conservative_rasterization
 #endif
@@ -719,42 +721,42 @@
 #ifdef VK_EXT_swapchain_colorspace
 #endif
 #ifdef VK_EXT_hdr_metadata
-PFN_vkSetHdrMetadataEXT vkSetHdrMetadataEXT;
+    PFN_vkSetHdrMetadataEXT vkSetHdrMetadataEXT;
 #endif
 #ifdef VK_MVK_ios_surface
-PFN_vkCreateIOSSurfaceMVK vkCreateIOSSurfaceMVK;
+    PFN_vkCreateIOSSurfaceMVK vkCreateIOSSurfaceMVK;
 #endif
 #ifdef VK_MVK_macos_surface
-PFN_vkCreateMacOSSurfaceMVK vkCreateMacOSSurfaceMVK;
+    PFN_vkCreateMacOSSurfaceMVK vkCreateMacOSSurfaceMVK;
 #endif
 #ifdef VK_MVK_moltenvk
-PFN_vkGetMTLDeviceMVK vkGetMTLDeviceMVK;
-PFN_vkSetMTLTextureMVK vkSetMTLTextureMVK;
-PFN_vkGetMTLTextureMVK vkGetMTLTextureMVK;
-PFN_vkGetMTLBufferMVK vkGetMTLBufferMVK;
-PFN_vkUseIOSurfaceMVK vkUseIOSurfaceMVK;
-PFN_vkGetIOSurfaceMVK vkGetIOSurfaceMVK;
+    PFN_vkGetMTLDeviceMVK vkGetMTLDeviceMVK;
+    PFN_vkSetMTLTextureMVK vkSetMTLTextureMVK;
+    PFN_vkGetMTLTextureMVK vkGetMTLTextureMVK;
+    PFN_vkGetMTLBufferMVK vkGetMTLBufferMVK;
+    PFN_vkUseIOSurfaceMVK vkUseIOSurfaceMVK;
+    PFN_vkGetIOSurfaceMVK vkGetIOSurfaceMVK;
 #endif
 #ifdef VK_EXT_external_memory_dma_buf
 #endif
 #ifdef VK_EXT_queue_family_foreign
 #endif
 #ifdef VK_EXT_debug_utils
-PFN_vkSetDebugUtilsObjectNameEXT vkSetDebugUtilsObjectNameEXT;
-PFN_vkSetDebugUtilsObjectTagEXT vkSetDebugUtilsObjectTagEXT;
-PFN_vkQueueBeginDebugUtilsLabelEXT vkQueueBeginDebugUtilsLabelEXT;
-PFN_vkQueueEndDebugUtilsLabelEXT vkQueueEndDebugUtilsLabelEXT;
-PFN_vkQueueInsertDebugUtilsLabelEXT vkQueueInsertDebugUtilsLabelEXT;
-PFN_vkCmdBeginDebugUtilsLabelEXT vkCmdBeginDebugUtilsLabelEXT;
-PFN_vkCmdEndDebugUtilsLabelEXT vkCmdEndDebugUtilsLabelEXT;
-PFN_vkCmdInsertDebugUtilsLabelEXT vkCmdInsertDebugUtilsLabelEXT;
-PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessengerEXT;
-PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT;
-PFN_vkSubmitDebugUtilsMessageEXT vkSubmitDebugUtilsMessageEXT;
+    PFN_vkSetDebugUtilsObjectNameEXT vkSetDebugUtilsObjectNameEXT;
+    PFN_vkSetDebugUtilsObjectTagEXT vkSetDebugUtilsObjectTagEXT;
+    PFN_vkQueueBeginDebugUtilsLabelEXT vkQueueBeginDebugUtilsLabelEXT;
+    PFN_vkQueueEndDebugUtilsLabelEXT vkQueueEndDebugUtilsLabelEXT;
+    PFN_vkQueueInsertDebugUtilsLabelEXT vkQueueInsertDebugUtilsLabelEXT;
+    PFN_vkCmdBeginDebugUtilsLabelEXT vkCmdBeginDebugUtilsLabelEXT;
+    PFN_vkCmdEndDebugUtilsLabelEXT vkCmdEndDebugUtilsLabelEXT;
+    PFN_vkCmdInsertDebugUtilsLabelEXT vkCmdInsertDebugUtilsLabelEXT;
+    PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessengerEXT;
+    PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT;
+    PFN_vkSubmitDebugUtilsMessageEXT vkSubmitDebugUtilsMessageEXT;
 #endif
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
-PFN_vkGetAndroidHardwareBufferPropertiesANDROID vkGetAndroidHardwareBufferPropertiesANDROID;
-PFN_vkGetMemoryAndroidHardwareBufferANDROID vkGetMemoryAndroidHardwareBufferANDROID;
+    PFN_vkGetAndroidHardwareBufferPropertiesANDROID vkGetAndroidHardwareBufferPropertiesANDROID;
+    PFN_vkGetMemoryAndroidHardwareBufferANDROID vkGetMemoryAndroidHardwareBufferANDROID;
 #endif
 #ifdef VK_EXT_sampler_filter_minmax
 #endif
@@ -769,8 +771,8 @@
 #ifdef VK_EXT_shader_stencil_export
 #endif
 #ifdef VK_EXT_sample_locations
-PFN_vkCmdSetSampleLocationsEXT vkCmdSetSampleLocationsEXT;
-PFN_vkGetPhysicalDeviceMultisamplePropertiesEXT vkGetPhysicalDeviceMultisamplePropertiesEXT;
+    PFN_vkCmdSetSampleLocationsEXT vkCmdSetSampleLocationsEXT;
+    PFN_vkGetPhysicalDeviceMultisamplePropertiesEXT vkGetPhysicalDeviceMultisamplePropertiesEXT;
 #endif
 #ifdef VK_EXT_blend_operation_advanced
 #endif
@@ -785,37 +787,38 @@
 #ifdef VK_EXT_post_depth_coverage
 #endif
 #ifdef VK_EXT_image_drm_format_modifier
-PFN_vkGetImageDrmFormatModifierPropertiesEXT vkGetImageDrmFormatModifierPropertiesEXT;
+    PFN_vkGetImageDrmFormatModifierPropertiesEXT vkGetImageDrmFormatModifierPropertiesEXT;
 #endif
 #ifdef VK_EXT_validation_cache
-PFN_vkCreateValidationCacheEXT vkCreateValidationCacheEXT;
-PFN_vkDestroyValidationCacheEXT vkDestroyValidationCacheEXT;
-PFN_vkMergeValidationCachesEXT vkMergeValidationCachesEXT;
-PFN_vkGetValidationCacheDataEXT vkGetValidationCacheDataEXT;
+    PFN_vkCreateValidationCacheEXT vkCreateValidationCacheEXT;
+    PFN_vkDestroyValidationCacheEXT vkDestroyValidationCacheEXT;
+    PFN_vkMergeValidationCachesEXT vkMergeValidationCachesEXT;
+    PFN_vkGetValidationCacheDataEXT vkGetValidationCacheDataEXT;
 #endif
 #ifdef VK_EXT_descriptor_indexing
 #endif
 #ifdef VK_EXT_shader_viewport_index_layer
 #endif
 #ifdef VK_NV_shading_rate_image
-PFN_vkCmdBindShadingRateImageNV vkCmdBindShadingRateImageNV;
-PFN_vkCmdSetViewportShadingRatePaletteNV vkCmdSetViewportShadingRatePaletteNV;
-PFN_vkCmdSetCoarseSampleOrderNV vkCmdSetCoarseSampleOrderNV;
+    PFN_vkCmdBindShadingRateImageNV vkCmdBindShadingRateImageNV;
+    PFN_vkCmdSetViewportShadingRatePaletteNV vkCmdSetViewportShadingRatePaletteNV;
+    PFN_vkCmdSetCoarseSampleOrderNV vkCmdSetCoarseSampleOrderNV;
 #endif
 #ifdef VK_NV_ray_tracing
-PFN_vkCreateAccelerationStructureNV vkCreateAccelerationStructureNV;
-PFN_vkDestroyAccelerationStructureNV vkDestroyAccelerationStructureNV;
-PFN_vkGetAccelerationStructureMemoryRequirementsNV vkGetAccelerationStructureMemoryRequirementsNV;
-PFN_vkBindAccelerationStructureMemoryNV vkBindAccelerationStructureMemoryNV;
-PFN_vkCmdBuildAccelerationStructureNV vkCmdBuildAccelerationStructureNV;
-PFN_vkCmdCopyAccelerationStructureNV vkCmdCopyAccelerationStructureNV;
-PFN_vkCmdTraceRaysNV vkCmdTraceRaysNV;
-PFN_vkCreateRayTracingPipelinesNV vkCreateRayTracingPipelinesNV;
-PFN_vkGetRayTracingShaderGroupHandlesKHR vkGetRayTracingShaderGroupHandlesKHR;
-PFN_vkGetRayTracingShaderGroupHandlesNV vkGetRayTracingShaderGroupHandlesNV;
-PFN_vkGetAccelerationStructureHandleNV vkGetAccelerationStructureHandleNV;
-PFN_vkCmdWriteAccelerationStructuresPropertiesNV vkCmdWriteAccelerationStructuresPropertiesNV;
-PFN_vkCompileDeferredNV vkCompileDeferredNV;
+    PFN_vkCreateAccelerationStructureNV vkCreateAccelerationStructureNV;
+    PFN_vkDestroyAccelerationStructureNV vkDestroyAccelerationStructureNV;
+    PFN_vkGetAccelerationStructureMemoryRequirementsNV
+        vkGetAccelerationStructureMemoryRequirementsNV;
+    PFN_vkBindAccelerationStructureMemoryNV vkBindAccelerationStructureMemoryNV;
+    PFN_vkCmdBuildAccelerationStructureNV vkCmdBuildAccelerationStructureNV;
+    PFN_vkCmdCopyAccelerationStructureNV vkCmdCopyAccelerationStructureNV;
+    PFN_vkCmdTraceRaysNV vkCmdTraceRaysNV;
+    PFN_vkCreateRayTracingPipelinesNV vkCreateRayTracingPipelinesNV;
+    PFN_vkGetRayTracingShaderGroupHandlesKHR vkGetRayTracingShaderGroupHandlesKHR;
+    PFN_vkGetRayTracingShaderGroupHandlesNV vkGetRayTracingShaderGroupHandlesNV;
+    PFN_vkGetAccelerationStructureHandleNV vkGetAccelerationStructureHandleNV;
+    PFN_vkCmdWriteAccelerationStructuresPropertiesNV vkCmdWriteAccelerationStructuresPropertiesNV;
+    PFN_vkCompileDeferredNV vkCompileDeferredNV;
 #endif
 #ifdef VK_NV_representative_fragment_test
 #endif
@@ -826,16 +829,17 @@
 #ifdef VK_EXT_global_priority
 #endif
 #ifdef VK_EXT_external_memory_host
-PFN_vkGetMemoryHostPointerPropertiesEXT vkGetMemoryHostPointerPropertiesEXT;
+    PFN_vkGetMemoryHostPointerPropertiesEXT vkGetMemoryHostPointerPropertiesEXT;
 #endif
 #ifdef VK_AMD_buffer_marker
-PFN_vkCmdWriteBufferMarkerAMD vkCmdWriteBufferMarkerAMD;
+    PFN_vkCmdWriteBufferMarkerAMD vkCmdWriteBufferMarkerAMD;
 #endif
 #ifdef VK_AMD_pipeline_compiler_control
 #endif
 #ifdef VK_EXT_calibrated_timestamps
-PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT vkGetPhysicalDeviceCalibrateableTimeDomainsEXT;
-PFN_vkGetCalibratedTimestampsEXT vkGetCalibratedTimestampsEXT;
+    PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT
+        vkGetPhysicalDeviceCalibrateableTimeDomainsEXT;
+    PFN_vkGetCalibratedTimestampsEXT vkGetCalibratedTimestampsEXT;
 #endif
 #ifdef VK_AMD_shader_core_properties
 #endif
@@ -854,44 +858,44 @@
 #ifdef VK_NV_compute_shader_derivatives
 #endif
 #ifdef VK_NV_mesh_shader
-PFN_vkCmdDrawMeshTasksNV vkCmdDrawMeshTasksNV;
-PFN_vkCmdDrawMeshTasksIndirectNV vkCmdDrawMeshTasksIndirectNV;
-PFN_vkCmdDrawMeshTasksIndirectCountNV vkCmdDrawMeshTasksIndirectCountNV;
+    PFN_vkCmdDrawMeshTasksNV vkCmdDrawMeshTasksNV;
+    PFN_vkCmdDrawMeshTasksIndirectNV vkCmdDrawMeshTasksIndirectNV;
+    PFN_vkCmdDrawMeshTasksIndirectCountNV vkCmdDrawMeshTasksIndirectCountNV;
 #endif
 #ifdef VK_NV_fragment_shader_barycentric
 #endif
 #ifdef VK_NV_shader_image_footprint
 #endif
 #ifdef VK_NV_scissor_exclusive
-PFN_vkCmdSetExclusiveScissorNV vkCmdSetExclusiveScissorNV;
+    PFN_vkCmdSetExclusiveScissorNV vkCmdSetExclusiveScissorNV;
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
-PFN_vkCmdSetCheckpointNV vkCmdSetCheckpointNV;
-PFN_vkGetQueueCheckpointDataNV vkGetQueueCheckpointDataNV;
+    PFN_vkCmdSetCheckpointNV vkCmdSetCheckpointNV;
+    PFN_vkGetQueueCheckpointDataNV vkGetQueueCheckpointDataNV;
 #endif
 #ifdef VK_INTEL_shader_integer_functions2
 #endif
 #ifdef VK_INTEL_performance_query
-PFN_vkInitializePerformanceApiINTEL vkInitializePerformanceApiINTEL;
-PFN_vkUninitializePerformanceApiINTEL vkUninitializePerformanceApiINTEL;
-PFN_vkCmdSetPerformanceMarkerINTEL vkCmdSetPerformanceMarkerINTEL;
-PFN_vkCmdSetPerformanceStreamMarkerINTEL vkCmdSetPerformanceStreamMarkerINTEL;
-PFN_vkCmdSetPerformanceOverrideINTEL vkCmdSetPerformanceOverrideINTEL;
-PFN_vkAcquirePerformanceConfigurationINTEL vkAcquirePerformanceConfigurationINTEL;
-PFN_vkReleasePerformanceConfigurationINTEL vkReleasePerformanceConfigurationINTEL;
-PFN_vkQueueSetPerformanceConfigurationINTEL vkQueueSetPerformanceConfigurationINTEL;
-PFN_vkGetPerformanceParameterINTEL vkGetPerformanceParameterINTEL;
+    PFN_vkInitializePerformanceApiINTEL vkInitializePerformanceApiINTEL;
+    PFN_vkUninitializePerformanceApiINTEL vkUninitializePerformanceApiINTEL;
+    PFN_vkCmdSetPerformanceMarkerINTEL vkCmdSetPerformanceMarkerINTEL;
+    PFN_vkCmdSetPerformanceStreamMarkerINTEL vkCmdSetPerformanceStreamMarkerINTEL;
+    PFN_vkCmdSetPerformanceOverrideINTEL vkCmdSetPerformanceOverrideINTEL;
+    PFN_vkAcquirePerformanceConfigurationINTEL vkAcquirePerformanceConfigurationINTEL;
+    PFN_vkReleasePerformanceConfigurationINTEL vkReleasePerformanceConfigurationINTEL;
+    PFN_vkQueueSetPerformanceConfigurationINTEL vkQueueSetPerformanceConfigurationINTEL;
+    PFN_vkGetPerformanceParameterINTEL vkGetPerformanceParameterINTEL;
 #endif
 #ifdef VK_EXT_pci_bus_info
 #endif
 #ifdef VK_AMD_display_native_hdr
-PFN_vkSetLocalDimmingAMD vkSetLocalDimmingAMD;
+    PFN_vkSetLocalDimmingAMD vkSetLocalDimmingAMD;
 #endif
 #ifdef VK_FUCHSIA_imagepipe_surface
-PFN_vkCreateImagePipeSurfaceFUCHSIA vkCreateImagePipeSurfaceFUCHSIA;
+    PFN_vkCreateImagePipeSurfaceFUCHSIA vkCreateImagePipeSurfaceFUCHSIA;
 #endif
 #ifdef VK_EXT_metal_surface
-PFN_vkCreateMetalSurfaceEXT vkCreateMetalSurfaceEXT;
+    PFN_vkCreateMetalSurfaceEXT vkCreateMetalSurfaceEXT;
 #endif
 #ifdef VK_EXT_fragment_density_map
 #endif
@@ -916,20 +920,22 @@
 #ifdef VK_NV_dedicated_allocation_image_aliasing
 #endif
 #ifdef VK_EXT_buffer_device_address
-PFN_vkGetBufferDeviceAddressEXT vkGetBufferDeviceAddressEXT;
+    PFN_vkGetBufferDeviceAddressEXT vkGetBufferDeviceAddressEXT;
 #endif
 #ifdef VK_EXT_tooling_info
-PFN_vkGetPhysicalDeviceToolPropertiesEXT vkGetPhysicalDeviceToolPropertiesEXT;
+    PFN_vkGetPhysicalDeviceToolPropertiesEXT vkGetPhysicalDeviceToolPropertiesEXT;
 #endif
 #ifdef VK_EXT_separate_stencil_usage
 #endif
 #ifdef VK_EXT_validation_features
 #endif
 #ifdef VK_NV_cooperative_matrix
-PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV vkGetPhysicalDeviceCooperativeMatrixPropertiesNV;
+    PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV
+        vkGetPhysicalDeviceCooperativeMatrixPropertiesNV;
 #endif
 #ifdef VK_NV_coverage_reduction_mode
-PFN_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV;
+    PFN_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV
+        vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV;
 #endif
 #ifdef VK_EXT_fragment_shader_interlock
 #endif
@@ -938,49 +944,49 @@
 #ifdef VK_EXT_provoking_vertex
 #endif
 #ifdef VK_EXT_full_screen_exclusive
-PFN_vkGetPhysicalDeviceSurfacePresentModes2EXT vkGetPhysicalDeviceSurfacePresentModes2EXT;
-PFN_vkAcquireFullScreenExclusiveModeEXT vkAcquireFullScreenExclusiveModeEXT;
-PFN_vkReleaseFullScreenExclusiveModeEXT vkReleaseFullScreenExclusiveModeEXT;
-PFN_vkGetDeviceGroupSurfacePresentModes2EXT vkGetDeviceGroupSurfacePresentModes2EXT;
+    PFN_vkGetPhysicalDeviceSurfacePresentModes2EXT vkGetPhysicalDeviceSurfacePresentModes2EXT;
+    PFN_vkAcquireFullScreenExclusiveModeEXT vkAcquireFullScreenExclusiveModeEXT;
+    PFN_vkReleaseFullScreenExclusiveModeEXT vkReleaseFullScreenExclusiveModeEXT;
+    PFN_vkGetDeviceGroupSurfacePresentModes2EXT vkGetDeviceGroupSurfacePresentModes2EXT;
 #endif
 #ifdef VK_EXT_headless_surface
-PFN_vkCreateHeadlessSurfaceEXT vkCreateHeadlessSurfaceEXT;
+    PFN_vkCreateHeadlessSurfaceEXT vkCreateHeadlessSurfaceEXT;
 #endif
 #ifdef VK_EXT_line_rasterization
-PFN_vkCmdSetLineStippleEXT vkCmdSetLineStippleEXT;
+    PFN_vkCmdSetLineStippleEXT vkCmdSetLineStippleEXT;
 #endif
 #ifdef VK_EXT_shader_atomic_float
 #endif
 #ifdef VK_EXT_host_query_reset
-PFN_vkResetQueryPoolEXT vkResetQueryPoolEXT;
+    PFN_vkResetQueryPoolEXT vkResetQueryPoolEXT;
 #endif
 #ifdef VK_EXT_index_type_uint8
 #endif
 #ifdef VK_EXT_extended_dynamic_state
-PFN_vkCmdSetCullModeEXT vkCmdSetCullModeEXT;
-PFN_vkCmdSetFrontFaceEXT vkCmdSetFrontFaceEXT;
-PFN_vkCmdSetPrimitiveTopologyEXT vkCmdSetPrimitiveTopologyEXT;
-PFN_vkCmdSetViewportWithCountEXT vkCmdSetViewportWithCountEXT;
-PFN_vkCmdSetScissorWithCountEXT vkCmdSetScissorWithCountEXT;
-PFN_vkCmdBindVertexBuffers2EXT vkCmdBindVertexBuffers2EXT;
-PFN_vkCmdSetDepthTestEnableEXT vkCmdSetDepthTestEnableEXT;
-PFN_vkCmdSetDepthWriteEnableEXT vkCmdSetDepthWriteEnableEXT;
-PFN_vkCmdSetDepthCompareOpEXT vkCmdSetDepthCompareOpEXT;
-PFN_vkCmdSetDepthBoundsTestEnableEXT vkCmdSetDepthBoundsTestEnableEXT;
-PFN_vkCmdSetStencilTestEnableEXT vkCmdSetStencilTestEnableEXT;
-PFN_vkCmdSetStencilOpEXT vkCmdSetStencilOpEXT;
+    PFN_vkCmdSetCullModeEXT vkCmdSetCullModeEXT;
+    PFN_vkCmdSetFrontFaceEXT vkCmdSetFrontFaceEXT;
+    PFN_vkCmdSetPrimitiveTopologyEXT vkCmdSetPrimitiveTopologyEXT;
+    PFN_vkCmdSetViewportWithCountEXT vkCmdSetViewportWithCountEXT;
+    PFN_vkCmdSetScissorWithCountEXT vkCmdSetScissorWithCountEXT;
+    PFN_vkCmdBindVertexBuffers2EXT vkCmdBindVertexBuffers2EXT;
+    PFN_vkCmdSetDepthTestEnableEXT vkCmdSetDepthTestEnableEXT;
+    PFN_vkCmdSetDepthWriteEnableEXT vkCmdSetDepthWriteEnableEXT;
+    PFN_vkCmdSetDepthCompareOpEXT vkCmdSetDepthCompareOpEXT;
+    PFN_vkCmdSetDepthBoundsTestEnableEXT vkCmdSetDepthBoundsTestEnableEXT;
+    PFN_vkCmdSetStencilTestEnableEXT vkCmdSetStencilTestEnableEXT;
+    PFN_vkCmdSetStencilOpEXT vkCmdSetStencilOpEXT;
 #endif
 #ifdef VK_EXT_shader_atomic_float2
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
 #endif
 #ifdef VK_NV_device_generated_commands
-PFN_vkGetGeneratedCommandsMemoryRequirementsNV vkGetGeneratedCommandsMemoryRequirementsNV;
-PFN_vkCmdPreprocessGeneratedCommandsNV vkCmdPreprocessGeneratedCommandsNV;
-PFN_vkCmdExecuteGeneratedCommandsNV vkCmdExecuteGeneratedCommandsNV;
-PFN_vkCmdBindPipelineShaderGroupNV vkCmdBindPipelineShaderGroupNV;
-PFN_vkCreateIndirectCommandsLayoutNV vkCreateIndirectCommandsLayoutNV;
-PFN_vkDestroyIndirectCommandsLayoutNV vkDestroyIndirectCommandsLayoutNV;
+    PFN_vkGetGeneratedCommandsMemoryRequirementsNV vkGetGeneratedCommandsMemoryRequirementsNV;
+    PFN_vkCmdPreprocessGeneratedCommandsNV vkCmdPreprocessGeneratedCommandsNV;
+    PFN_vkCmdExecuteGeneratedCommandsNV vkCmdExecuteGeneratedCommandsNV;
+    PFN_vkCmdBindPipelineShaderGroupNV vkCmdBindPipelineShaderGroupNV;
+    PFN_vkCreateIndirectCommandsLayoutNV vkCreateIndirectCommandsLayoutNV;
+    PFN_vkDestroyIndirectCommandsLayoutNV vkDestroyIndirectCommandsLayoutNV;
 #endif
 #ifdef VK_NV_inherited_viewport_scissor
 #endif
@@ -991,8 +997,8 @@
 #ifdef VK_EXT_device_memory_report
 #endif
 #ifdef VK_EXT_acquire_drm_display
-PFN_vkAcquireDrmDisplayEXT vkAcquireDrmDisplayEXT;
-PFN_vkGetDrmDisplayEXT vkGetDrmDisplayEXT;
+    PFN_vkAcquireDrmDisplayEXT vkAcquireDrmDisplayEXT;
+    PFN_vkGetDrmDisplayEXT vkGetDrmDisplayEXT;
 #endif
 #ifdef VK_EXT_robustness2
 #endif
@@ -1001,10 +1007,10 @@
 #ifdef VK_GOOGLE_user_type
 #endif
 #ifdef VK_EXT_private_data
-PFN_vkCreatePrivateDataSlotEXT vkCreatePrivateDataSlotEXT;
-PFN_vkDestroyPrivateDataSlotEXT vkDestroyPrivateDataSlotEXT;
-PFN_vkSetPrivateDataEXT vkSetPrivateDataEXT;
-PFN_vkGetPrivateDataEXT vkGetPrivateDataEXT;
+    PFN_vkCreatePrivateDataSlotEXT vkCreatePrivateDataSlotEXT;
+    PFN_vkDestroyPrivateDataSlotEXT vkDestroyPrivateDataSlotEXT;
+    PFN_vkSetPrivateDataEXT vkSetPrivateDataEXT;
+    PFN_vkGetPrivateDataEXT vkGetPrivateDataEXT;
 #endif
 #ifdef VK_EXT_pipeline_creation_cache_control
 #endif
@@ -1013,7 +1019,7 @@
 #ifdef VK_QCOM_render_pass_store_ops
 #endif
 #ifdef VK_NV_fragment_shading_rate_enums
-PFN_vkCmdSetFragmentShadingRateEnumNV vkCmdSetFragmentShadingRateEnumNV;
+    PFN_vkCmdSetFragmentShadingRateEnumNV vkCmdSetFragmentShadingRateEnumNV;
 #endif
 #ifdef VK_NV_ray_tracing_motion_blur
 #endif
@@ -1030,126 +1036,131 @@
 #ifdef VK_EXT_rgba10x6_formats
 #endif
 #ifdef VK_NV_acquire_winrt_display
-PFN_vkAcquireWinrtDisplayNV vkAcquireWinrtDisplayNV;
-PFN_vkGetWinrtDisplayNV vkGetWinrtDisplayNV;
+    PFN_vkAcquireWinrtDisplayNV vkAcquireWinrtDisplayNV;
+    PFN_vkGetWinrtDisplayNV vkGetWinrtDisplayNV;
 #endif
 #ifdef VK_EXT_directfb_surface
-PFN_vkCreateDirectFBSurfaceEXT vkCreateDirectFBSurfaceEXT;
-PFN_vkGetPhysicalDeviceDirectFBPresentationSupportEXT vkGetPhysicalDeviceDirectFBPresentationSupportEXT;
+    PFN_vkCreateDirectFBSurfaceEXT vkCreateDirectFBSurfaceEXT;
+    PFN_vkGetPhysicalDeviceDirectFBPresentationSupportEXT
+        vkGetPhysicalDeviceDirectFBPresentationSupportEXT;
 #endif
 #ifdef VK_VALVE_mutable_descriptor_type
 #endif
 #ifdef VK_EXT_vertex_input_dynamic_state
-PFN_vkCmdSetVertexInputEXT vkCmdSetVertexInputEXT;
+    PFN_vkCmdSetVertexInputEXT vkCmdSetVertexInputEXT;
 #endif
 #ifdef VK_EXT_physical_device_drm
 #endif
 #ifdef VK_EXT_primitive_topology_list_restart
 #endif
 #ifdef VK_FUCHSIA_external_memory
-PFN_vkGetMemoryZirconHandleFUCHSIA vkGetMemoryZirconHandleFUCHSIA;
-PFN_vkGetMemoryZirconHandlePropertiesFUCHSIA vkGetMemoryZirconHandlePropertiesFUCHSIA;
+    PFN_vkGetMemoryZirconHandleFUCHSIA vkGetMemoryZirconHandleFUCHSIA;
+    PFN_vkGetMemoryZirconHandlePropertiesFUCHSIA vkGetMemoryZirconHandlePropertiesFUCHSIA;
 #endif
 #ifdef VK_FUCHSIA_external_semaphore
-PFN_vkImportSemaphoreZirconHandleFUCHSIA vkImportSemaphoreZirconHandleFUCHSIA;
-PFN_vkGetSemaphoreZirconHandleFUCHSIA vkGetSemaphoreZirconHandleFUCHSIA;
+    PFN_vkImportSemaphoreZirconHandleFUCHSIA vkImportSemaphoreZirconHandleFUCHSIA;
+    PFN_vkGetSemaphoreZirconHandleFUCHSIA vkGetSemaphoreZirconHandleFUCHSIA;
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
-PFN_vkCreateBufferCollectionFUCHSIA vkCreateBufferCollectionFUCHSIA;
-PFN_vkSetBufferCollectionImageConstraintsFUCHSIA vkSetBufferCollectionImageConstraintsFUCHSIA;
-PFN_vkSetBufferCollectionBufferConstraintsFUCHSIA vkSetBufferCollectionBufferConstraintsFUCHSIA;
-PFN_vkDestroyBufferCollectionFUCHSIA vkDestroyBufferCollectionFUCHSIA;
-PFN_vkGetBufferCollectionPropertiesFUCHSIA vkGetBufferCollectionPropertiesFUCHSIA;
+    PFN_vkCreateBufferCollectionFUCHSIA vkCreateBufferCollectionFUCHSIA;
+    PFN_vkSetBufferCollectionImageConstraintsFUCHSIA vkSetBufferCollectionImageConstraintsFUCHSIA;
+    PFN_vkSetBufferCollectionBufferConstraintsFUCHSIA vkSetBufferCollectionBufferConstraintsFUCHSIA;
+    PFN_vkDestroyBufferCollectionFUCHSIA vkDestroyBufferCollectionFUCHSIA;
+    PFN_vkGetBufferCollectionPropertiesFUCHSIA vkGetBufferCollectionPropertiesFUCHSIA;
 #endif
 #ifdef VK_HUAWEI_subpass_shading
-PFN_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI;
-PFN_vkCmdSubpassShadingHUAWEI vkCmdSubpassShadingHUAWEI;
+    PFN_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI
+        vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI;
+    PFN_vkCmdSubpassShadingHUAWEI vkCmdSubpassShadingHUAWEI;
 #endif
 #ifdef VK_HUAWEI_invocation_mask
-PFN_vkCmdBindInvocationMaskHUAWEI vkCmdBindInvocationMaskHUAWEI;
+    PFN_vkCmdBindInvocationMaskHUAWEI vkCmdBindInvocationMaskHUAWEI;
 #endif
 #ifdef VK_NV_external_memory_rdma
-PFN_vkGetMemoryRemoteAddressNV vkGetMemoryRemoteAddressNV;
+    PFN_vkGetMemoryRemoteAddressNV vkGetMemoryRemoteAddressNV;
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
-PFN_vkCmdSetPatchControlPointsEXT vkCmdSetPatchControlPointsEXT;
-PFN_vkCmdSetRasterizerDiscardEnableEXT vkCmdSetRasterizerDiscardEnableEXT;
-PFN_vkCmdSetDepthBiasEnableEXT vkCmdSetDepthBiasEnableEXT;
-PFN_vkCmdSetLogicOpEXT vkCmdSetLogicOpEXT;
-PFN_vkCmdSetPrimitiveRestartEnableEXT vkCmdSetPrimitiveRestartEnableEXT;
+    PFN_vkCmdSetPatchControlPointsEXT vkCmdSetPatchControlPointsEXT;
+    PFN_vkCmdSetRasterizerDiscardEnableEXT vkCmdSetRasterizerDiscardEnableEXT;
+    PFN_vkCmdSetDepthBiasEnableEXT vkCmdSetDepthBiasEnableEXT;
+    PFN_vkCmdSetLogicOpEXT vkCmdSetLogicOpEXT;
+    PFN_vkCmdSetPrimitiveRestartEnableEXT vkCmdSetPrimitiveRestartEnableEXT;
 #endif
 #ifdef VK_QNX_screen_surface
-PFN_vkCreateScreenSurfaceQNX vkCreateScreenSurfaceQNX;
-PFN_vkGetPhysicalDeviceScreenPresentationSupportQNX vkGetPhysicalDeviceScreenPresentationSupportQNX;
+    PFN_vkCreateScreenSurfaceQNX vkCreateScreenSurfaceQNX;
+    PFN_vkGetPhysicalDeviceScreenPresentationSupportQNX
+        vkGetPhysicalDeviceScreenPresentationSupportQNX;
 #endif
 #ifdef VK_EXT_color_write_enable
-PFN_vkCmdSetColorWriteEnableEXT vkCmdSetColorWriteEnableEXT;
+    PFN_vkCmdSetColorWriteEnableEXT vkCmdSetColorWriteEnableEXT;
 #endif
 #ifdef VK_GOOGLE_gfxstream
-PFN_vkRegisterImageColorBufferGOOGLE vkRegisterImageColorBufferGOOGLE;
-PFN_vkRegisterBufferColorBufferGOOGLE vkRegisterBufferColorBufferGOOGLE;
-PFN_vkMapMemoryIntoAddressSpaceGOOGLE vkMapMemoryIntoAddressSpaceGOOGLE;
-PFN_vkUpdateDescriptorSetWithTemplateSizedGOOGLE vkUpdateDescriptorSetWithTemplateSizedGOOGLE;
-PFN_vkBeginCommandBufferAsyncGOOGLE vkBeginCommandBufferAsyncGOOGLE;
-PFN_vkEndCommandBufferAsyncGOOGLE vkEndCommandBufferAsyncGOOGLE;
-PFN_vkResetCommandBufferAsyncGOOGLE vkResetCommandBufferAsyncGOOGLE;
-PFN_vkCommandBufferHostSyncGOOGLE vkCommandBufferHostSyncGOOGLE;
-PFN_vkCreateImageWithRequirementsGOOGLE vkCreateImageWithRequirementsGOOGLE;
-PFN_vkCreateBufferWithRequirementsGOOGLE vkCreateBufferWithRequirementsGOOGLE;
-PFN_vkGetMemoryHostAddressInfoGOOGLE vkGetMemoryHostAddressInfoGOOGLE;
-PFN_vkFreeMemorySyncGOOGLE vkFreeMemorySyncGOOGLE;
-PFN_vkQueueHostSyncGOOGLE vkQueueHostSyncGOOGLE;
-PFN_vkQueueSubmitAsyncGOOGLE vkQueueSubmitAsyncGOOGLE;
-PFN_vkQueueWaitIdleAsyncGOOGLE vkQueueWaitIdleAsyncGOOGLE;
-PFN_vkQueueBindSparseAsyncGOOGLE vkQueueBindSparseAsyncGOOGLE;
-PFN_vkGetLinearImageLayoutGOOGLE vkGetLinearImageLayoutGOOGLE;
-PFN_vkGetLinearImageLayout2GOOGLE vkGetLinearImageLayout2GOOGLE;
-PFN_vkQueueFlushCommandsGOOGLE vkQueueFlushCommandsGOOGLE;
-PFN_vkQueueCommitDescriptorSetUpdatesGOOGLE vkQueueCommitDescriptorSetUpdatesGOOGLE;
-PFN_vkCollectDescriptorPoolIdsGOOGLE vkCollectDescriptorPoolIdsGOOGLE;
-PFN_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE vkQueueSignalReleaseImageANDROIDAsyncGOOGLE;
+    PFN_vkRegisterImageColorBufferGOOGLE vkRegisterImageColorBufferGOOGLE;
+    PFN_vkRegisterBufferColorBufferGOOGLE vkRegisterBufferColorBufferGOOGLE;
+    PFN_vkMapMemoryIntoAddressSpaceGOOGLE vkMapMemoryIntoAddressSpaceGOOGLE;
+    PFN_vkUpdateDescriptorSetWithTemplateSizedGOOGLE vkUpdateDescriptorSetWithTemplateSizedGOOGLE;
+    PFN_vkBeginCommandBufferAsyncGOOGLE vkBeginCommandBufferAsyncGOOGLE;
+    PFN_vkEndCommandBufferAsyncGOOGLE vkEndCommandBufferAsyncGOOGLE;
+    PFN_vkResetCommandBufferAsyncGOOGLE vkResetCommandBufferAsyncGOOGLE;
+    PFN_vkCommandBufferHostSyncGOOGLE vkCommandBufferHostSyncGOOGLE;
+    PFN_vkCreateImageWithRequirementsGOOGLE vkCreateImageWithRequirementsGOOGLE;
+    PFN_vkCreateBufferWithRequirementsGOOGLE vkCreateBufferWithRequirementsGOOGLE;
+    PFN_vkGetMemoryHostAddressInfoGOOGLE vkGetMemoryHostAddressInfoGOOGLE;
+    PFN_vkFreeMemorySyncGOOGLE vkFreeMemorySyncGOOGLE;
+    PFN_vkQueueHostSyncGOOGLE vkQueueHostSyncGOOGLE;
+    PFN_vkQueueSubmitAsyncGOOGLE vkQueueSubmitAsyncGOOGLE;
+    PFN_vkQueueWaitIdleAsyncGOOGLE vkQueueWaitIdleAsyncGOOGLE;
+    PFN_vkQueueBindSparseAsyncGOOGLE vkQueueBindSparseAsyncGOOGLE;
+    PFN_vkGetLinearImageLayoutGOOGLE vkGetLinearImageLayoutGOOGLE;
+    PFN_vkGetLinearImageLayout2GOOGLE vkGetLinearImageLayout2GOOGLE;
+    PFN_vkQueueFlushCommandsGOOGLE vkQueueFlushCommandsGOOGLE;
+    PFN_vkQueueCommitDescriptorSetUpdatesGOOGLE vkQueueCommitDescriptorSetUpdatesGOOGLE;
+    PFN_vkCollectDescriptorPoolIdsGOOGLE vkCollectDescriptorPoolIdsGOOGLE;
+    PFN_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE vkQueueSignalReleaseImageANDROIDAsyncGOOGLE;
 #endif
 #ifdef VK_EXT_global_priority_query
 #endif
 #ifdef VK_EXT_multi_draw
-PFN_vkCmdDrawMultiEXT vkCmdDrawMultiEXT;
-PFN_vkCmdDrawMultiIndexedEXT vkCmdDrawMultiIndexedEXT;
+    PFN_vkCmdDrawMultiEXT vkCmdDrawMultiEXT;
+    PFN_vkCmdDrawMultiIndexedEXT vkCmdDrawMultiIndexedEXT;
 #endif
 #ifdef VK_EXT_load_store_op_none
 #endif
 #ifdef VK_EXT_border_color_swizzle
 #endif
 #ifdef VK_EXT_pageable_device_local_memory
-PFN_vkSetDeviceMemoryPriorityEXT vkSetDeviceMemoryPriorityEXT;
+    PFN_vkSetDeviceMemoryPriorityEXT vkSetDeviceMemoryPriorityEXT;
 #endif
 #ifdef VK_KHR_acceleration_structure
-PFN_vkCreateAccelerationStructureKHR vkCreateAccelerationStructureKHR;
-PFN_vkDestroyAccelerationStructureKHR vkDestroyAccelerationStructureKHR;
-PFN_vkCmdBuildAccelerationStructuresKHR vkCmdBuildAccelerationStructuresKHR;
-PFN_vkCmdBuildAccelerationStructuresIndirectKHR vkCmdBuildAccelerationStructuresIndirectKHR;
-PFN_vkBuildAccelerationStructuresKHR vkBuildAccelerationStructuresKHR;
-PFN_vkCopyAccelerationStructureKHR vkCopyAccelerationStructureKHR;
-PFN_vkCopyAccelerationStructureToMemoryKHR vkCopyAccelerationStructureToMemoryKHR;
-PFN_vkCopyMemoryToAccelerationStructureKHR vkCopyMemoryToAccelerationStructureKHR;
-PFN_vkWriteAccelerationStructuresPropertiesKHR vkWriteAccelerationStructuresPropertiesKHR;
-PFN_vkCmdCopyAccelerationStructureKHR vkCmdCopyAccelerationStructureKHR;
-PFN_vkCmdCopyAccelerationStructureToMemoryKHR vkCmdCopyAccelerationStructureToMemoryKHR;
-PFN_vkCmdCopyMemoryToAccelerationStructureKHR vkCmdCopyMemoryToAccelerationStructureKHR;
-PFN_vkGetAccelerationStructureDeviceAddressKHR vkGetAccelerationStructureDeviceAddressKHR;
-PFN_vkCmdWriteAccelerationStructuresPropertiesKHR vkCmdWriteAccelerationStructuresPropertiesKHR;
-PFN_vkGetDeviceAccelerationStructureCompatibilityKHR vkGetDeviceAccelerationStructureCompatibilityKHR;
-PFN_vkGetAccelerationStructureBuildSizesKHR vkGetAccelerationStructureBuildSizesKHR;
+    PFN_vkCreateAccelerationStructureKHR vkCreateAccelerationStructureKHR;
+    PFN_vkDestroyAccelerationStructureKHR vkDestroyAccelerationStructureKHR;
+    PFN_vkCmdBuildAccelerationStructuresKHR vkCmdBuildAccelerationStructuresKHR;
+    PFN_vkCmdBuildAccelerationStructuresIndirectKHR vkCmdBuildAccelerationStructuresIndirectKHR;
+    PFN_vkBuildAccelerationStructuresKHR vkBuildAccelerationStructuresKHR;
+    PFN_vkCopyAccelerationStructureKHR vkCopyAccelerationStructureKHR;
+    PFN_vkCopyAccelerationStructureToMemoryKHR vkCopyAccelerationStructureToMemoryKHR;
+    PFN_vkCopyMemoryToAccelerationStructureKHR vkCopyMemoryToAccelerationStructureKHR;
+    PFN_vkWriteAccelerationStructuresPropertiesKHR vkWriteAccelerationStructuresPropertiesKHR;
+    PFN_vkCmdCopyAccelerationStructureKHR vkCmdCopyAccelerationStructureKHR;
+    PFN_vkCmdCopyAccelerationStructureToMemoryKHR vkCmdCopyAccelerationStructureToMemoryKHR;
+    PFN_vkCmdCopyMemoryToAccelerationStructureKHR vkCmdCopyMemoryToAccelerationStructureKHR;
+    PFN_vkGetAccelerationStructureDeviceAddressKHR vkGetAccelerationStructureDeviceAddressKHR;
+    PFN_vkCmdWriteAccelerationStructuresPropertiesKHR vkCmdWriteAccelerationStructuresPropertiesKHR;
+    PFN_vkGetDeviceAccelerationStructureCompatibilityKHR
+        vkGetDeviceAccelerationStructureCompatibilityKHR;
+    PFN_vkGetAccelerationStructureBuildSizesKHR vkGetAccelerationStructureBuildSizesKHR;
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
-PFN_vkCmdTraceRaysKHR vkCmdTraceRaysKHR;
-PFN_vkCreateRayTracingPipelinesKHR vkCreateRayTracingPipelinesKHR;
-PFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR vkGetRayTracingCaptureReplayShaderGroupHandlesKHR;
-PFN_vkCmdTraceRaysIndirectKHR vkCmdTraceRaysIndirectKHR;
-PFN_vkGetRayTracingShaderGroupStackSizeKHR vkGetRayTracingShaderGroupStackSizeKHR;
-PFN_vkCmdSetRayTracingPipelineStackSizeKHR vkCmdSetRayTracingPipelineStackSizeKHR;
+    PFN_vkCmdTraceRaysKHR vkCmdTraceRaysKHR;
+    PFN_vkCreateRayTracingPipelinesKHR vkCreateRayTracingPipelinesKHR;
+    PFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR
+        vkGetRayTracingCaptureReplayShaderGroupHandlesKHR;
+    PFN_vkCmdTraceRaysIndirectKHR vkCmdTraceRaysIndirectKHR;
+    PFN_vkGetRayTracingShaderGroupStackSizeKHR vkGetRayTracingShaderGroupStackSizeKHR;
+    PFN_vkCmdSetRayTracingPipelineStackSizeKHR vkCmdSetRayTracingPipelineStackSizeKHR;
 #endif
 #ifdef VK_KHR_ray_query
 #endif
 };
 
-} // namespace goldfish_vk
+}  // namespace goldfish_vk
diff --git a/stream-servers/vulkan/cereal/common/goldfish_vk_extension_structs.cpp b/stream-servers/vulkan/cereal/common/goldfish_vk_extension_structs.cpp
index b95a321..0a8de20 100644
--- a/stream-servers/vulkan/cereal/common/goldfish_vk_extension_structs.cpp
+++ b/stream-servers/vulkan/cereal/common/goldfish_vk_extension_structs.cpp
@@ -14,19 +14,23 @@
 // limitations under the License.
 
 // Autogenerated module goldfish_vk_extension_structs
-// (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
+// (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal
+// -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
 // VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
 // VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+//
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o
+// $CEREAL_OUTPUT_DIR
+//
 
 #include "goldfish_vk_extension_structs.h"
 
-
-
 namespace goldfish_vk {
 
 #ifdef VK_VERSION_1_0
@@ -571,1287 +575,1009 @@
 #endif
 #ifdef VK_KHR_ray_query
 #endif
-uint32_t goldfish_vk_struct_type(
-    const void* structExtension)
-{
+uint32_t goldfish_vk_struct_type(const void* structExtension) {
     const uint32_t asStructType = *(reinterpret_cast<const uint32_t*>(structExtension));
     return asStructType;
 }
 
-size_t goldfish_vk_extension_struct_size(
-    VkStructureType rootType,
-    const void* structExtension)
-{
-    if (!structExtension)
-    {
+size_t goldfish_vk_extension_struct_size(VkStructureType rootType, const void* structExtension) {
+    if (!structExtension) {
         return (size_t)0;
     }
     uint32_t structType = (uint32_t)goldfish_vk_struct_type(structExtension);
-    switch(structType)
-    {
+    switch (structType) {
 #ifdef VK_VERSION_1_1
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES: {
             return sizeof(VkPhysicalDeviceSubgroupProperties);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES: {
             return sizeof(VkPhysicalDevice16BitStorageFeatures);
         }
-        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS:
-        {
+        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS: {
             return sizeof(VkMemoryDedicatedRequirements);
         }
-        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO: {
             return sizeof(VkMemoryDedicatedAllocateInfo);
         }
-        case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO:
-        {
+        case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO: {
             return sizeof(VkMemoryAllocateFlagsInfo);
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO:
-        {
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO: {
             return sizeof(VkDeviceGroupRenderPassBeginInfo);
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO:
-        {
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO: {
             return sizeof(VkDeviceGroupCommandBufferBeginInfo);
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO:
-        {
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO: {
             return sizeof(VkDeviceGroupSubmitInfo);
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO: {
             return sizeof(VkDeviceGroupBindSparseInfo);
         }
-        case VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO:
-        {
+        case VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO: {
             return sizeof(VkBindBufferMemoryDeviceGroupInfo);
         }
-        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO:
-        {
+        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO: {
             return sizeof(VkBindImageMemoryDeviceGroupInfo);
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO: {
             return sizeof(VkDeviceGroupDeviceCreateInfo);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2: {
             return sizeof(VkPhysicalDeviceFeatures2);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES: {
             return sizeof(VkPhysicalDevicePointClippingProperties);
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO: {
             return sizeof(VkRenderPassInputAttachmentAspectCreateInfo);
         }
-        case VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO: {
             return sizeof(VkImageViewUsageCreateInfo);
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO: {
             return sizeof(VkPipelineTessellationDomainOriginStateCreateInfo);
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO: {
             return sizeof(VkRenderPassMultiviewCreateInfo);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES: {
             return sizeof(VkPhysicalDeviceMultiviewFeatures);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES: {
             return sizeof(VkPhysicalDeviceMultiviewProperties);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES: {
             return sizeof(VkPhysicalDeviceVariablePointersFeatures);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES: {
             return sizeof(VkPhysicalDeviceProtectedMemoryFeatures);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES: {
             return sizeof(VkPhysicalDeviceProtectedMemoryProperties);
         }
-        case VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO:
-        {
+        case VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO: {
             return sizeof(VkProtectedSubmitInfo);
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO:
-        {
+        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO: {
             return sizeof(VkSamplerYcbcrConversionInfo);
         }
-        case VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO:
-        {
+        case VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO: {
             return sizeof(VkBindImagePlaneMemoryInfo);
         }
-        case VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO:
-        {
+        case VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO: {
             return sizeof(VkImagePlaneMemoryRequirementsInfo);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES: {
             return sizeof(VkPhysicalDeviceSamplerYcbcrConversionFeatures);
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES:
-        {
+        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES: {
             return sizeof(VkSamplerYcbcrConversionImageFormatProperties);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO: {
             return sizeof(VkPhysicalDeviceExternalImageFormatInfo);
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES:
-        {
+        case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES: {
             return sizeof(VkExternalImageFormatProperties);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES: {
             return sizeof(VkPhysicalDeviceIDProperties);
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO: {
             return sizeof(VkExternalMemoryImageCreateInfo);
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO: {
             return sizeof(VkExternalMemoryBufferCreateInfo);
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO: {
             return sizeof(VkExportMemoryAllocateInfo);
         }
-        case VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO: {
             return sizeof(VkExportFenceCreateInfo);
         }
-        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO: {
             return sizeof(VkExportSemaphoreCreateInfo);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES: {
             return sizeof(VkPhysicalDeviceMaintenance3Properties);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES: {
             return sizeof(VkPhysicalDeviceShaderDrawParametersFeatures);
         }
 #endif
 #ifdef VK_VERSION_1_2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: {
             return sizeof(VkPhysicalDeviceVulkan11Features);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: {
             return sizeof(VkPhysicalDeviceVulkan11Properties);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: {
             return sizeof(VkPhysicalDeviceVulkan12Features);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: {
             return sizeof(VkPhysicalDeviceVulkan12Properties);
         }
-        case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO: {
             return sizeof(VkImageFormatListCreateInfo);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES: {
             return sizeof(VkPhysicalDevice8BitStorageFeatures);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES: {
             return sizeof(VkPhysicalDeviceDriverProperties);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES: {
             return sizeof(VkPhysicalDeviceShaderAtomicInt64Features);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES: {
             return sizeof(VkPhysicalDeviceShaderFloat16Int8Features);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES: {
             return sizeof(VkPhysicalDeviceFloatControlsProperties);
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO: {
             return sizeof(VkDescriptorSetLayoutBindingFlagsCreateInfo);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES: {
             return sizeof(VkPhysicalDeviceDescriptorIndexingFeatures);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES: {
             return sizeof(VkPhysicalDeviceDescriptorIndexingProperties);
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO: {
             return sizeof(VkDescriptorSetVariableDescriptorCountAllocateInfo);
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT:
-        {
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT: {
             return sizeof(VkDescriptorSetVariableDescriptorCountLayoutSupport);
         }
-        case VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE:
-        {
+        case VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE: {
             return sizeof(VkSubpassDescriptionDepthStencilResolve);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES: {
             return sizeof(VkPhysicalDeviceDepthStencilResolveProperties);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES: {
             return sizeof(VkPhysicalDeviceScalarBlockLayoutFeatures);
         }
-        case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO: {
             return sizeof(VkImageStencilUsageCreateInfo);
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO: {
             return sizeof(VkSamplerReductionModeCreateInfo);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES: {
             return sizeof(VkPhysicalDeviceSamplerFilterMinmaxProperties);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES: {
             return sizeof(VkPhysicalDeviceVulkanMemoryModelFeatures);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES: {
             return sizeof(VkPhysicalDeviceImagelessFramebufferFeatures);
         }
-        case VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO: {
             return sizeof(VkFramebufferAttachmentsCreateInfo);
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO:
-        {
+        case VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO: {
             return sizeof(VkRenderPassAttachmentBeginInfo);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES: {
             return sizeof(VkPhysicalDeviceUniformBufferStandardLayoutFeatures);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES: {
             return sizeof(VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES: {
             return sizeof(VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures);
         }
-        case VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT:
-        {
+        case VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT: {
             return sizeof(VkAttachmentReferenceStencilLayout);
         }
-        case VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT:
-        {
+        case VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT: {
             return sizeof(VkAttachmentDescriptionStencilLayout);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES: {
             return sizeof(VkPhysicalDeviceHostQueryResetFeatures);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES: {
             return sizeof(VkPhysicalDeviceTimelineSemaphoreFeatures);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES: {
             return sizeof(VkPhysicalDeviceTimelineSemaphoreProperties);
         }
-        case VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO: {
             return sizeof(VkSemaphoreTypeCreateInfo);
         }
-        case VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO:
-        {
+        case VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO: {
             return sizeof(VkTimelineSemaphoreSubmitInfo);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES: {
             return sizeof(VkPhysicalDeviceBufferDeviceAddressFeatures);
         }
-        case VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO: {
             return sizeof(VkBufferOpaqueCaptureAddressCreateInfo);
         }
-        case VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO: {
             return sizeof(VkMemoryOpaqueCaptureAddressAllocateInfo);
         }
 #endif
 #ifdef VK_KHR_swapchain
-        case VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR: {
             return sizeof(VkImageSwapchainCreateInfoKHR);
         }
-        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR: {
             return sizeof(VkBindImageMemorySwapchainInfoKHR);
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR: {
             return sizeof(VkDeviceGroupPresentInfoKHR);
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR: {
             return sizeof(VkDeviceGroupSwapchainCreateInfoKHR);
         }
 #endif
 #ifdef VK_KHR_display_swapchain
-        case VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR: {
             return sizeof(VkDisplayPresentInfoKHR);
         }
 #endif
 #ifdef VK_KHR_video_queue
-        case VK_STRUCTURE_TYPE_VIDEO_QUEUE_FAMILY_PROPERTIES_2_KHR:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_QUEUE_FAMILY_PROPERTIES_2_KHR: {
             return sizeof(VkVideoQueueFamilyProperties2KHR);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_PROFILE_KHR:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_PROFILE_KHR: {
             return sizeof(VkVideoProfileKHR);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_PROFILES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_PROFILES_KHR: {
             return sizeof(VkVideoProfilesKHR);
         }
 #endif
 #ifdef VK_KHR_dynamic_rendering
-        case VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR: {
             return sizeof(VkPipelineRenderingCreateInfoKHR);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES_KHR: {
             return sizeof(VkPhysicalDeviceDynamicRenderingFeaturesKHR);
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR: {
             return sizeof(VkCommandBufferInheritanceRenderingInfoKHR);
         }
-        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR: {
             return sizeof(VkRenderingFragmentShadingRateAttachmentInfoKHR);
         }
-        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_INFO_EXT: {
             return sizeof(VkRenderingFragmentDensityMapAttachmentInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_ATTACHMENT_SAMPLE_COUNT_INFO_AMD:
-        {
+        case VK_STRUCTURE_TYPE_ATTACHMENT_SAMPLE_COUNT_INFO_AMD: {
             return sizeof(VkAttachmentSampleCountInfoAMD);
         }
-        case VK_STRUCTURE_TYPE_MULTIVIEW_PER_VIEW_ATTRIBUTES_INFO_NVX:
-        {
+        case VK_STRUCTURE_TYPE_MULTIVIEW_PER_VIEW_ATTRIBUTES_INFO_NVX: {
             return sizeof(VkMultiviewPerViewAttributesInfoNVX);
         }
 #endif
 #ifdef VK_KHR_external_memory_win32
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR: {
             return sizeof(VkImportMemoryWin32HandleInfoKHR);
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR: {
             return sizeof(VkExportMemoryWin32HandleInfoKHR);
         }
 #endif
 #ifdef VK_KHR_external_memory_fd
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR: {
             return sizeof(VkImportMemoryFdInfoKHR);
         }
 #endif
 #ifdef VK_KHR_win32_keyed_mutex
-        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR: {
             return sizeof(VkWin32KeyedMutexAcquireReleaseInfoKHR);
         }
 #endif
 #ifdef VK_KHR_external_semaphore_win32
-        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR: {
             return sizeof(VkExportSemaphoreWin32HandleInfoKHR);
         }
-        case VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR: {
             return sizeof(VkD3D12FenceSubmitInfoKHR);
         }
 #endif
 #ifdef VK_KHR_push_descriptor
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR: {
             return sizeof(VkPhysicalDevicePushDescriptorPropertiesKHR);
         }
 #endif
 #ifdef VK_KHR_incremental_present
-        case VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR: {
             return sizeof(VkPresentRegionsKHR);
         }
 #endif
 #ifdef VK_KHR_shared_presentable_image
-        case VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR: {
             return sizeof(VkSharedPresentSurfaceCapabilitiesKHR);
         }
 #endif
 #ifdef VK_KHR_external_fence_win32
-        case VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR: {
             return sizeof(VkExportFenceWin32HandleInfoKHR);
         }
 #endif
 #ifdef VK_KHR_performance_query
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR: {
             return sizeof(VkPhysicalDevicePerformanceQueryFeaturesKHR);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR: {
             return sizeof(VkPhysicalDevicePerformanceQueryPropertiesKHR);
         }
-        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR: {
             return sizeof(VkQueryPoolPerformanceCreateInfoKHR);
         }
-        case VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR: {
             return sizeof(VkPerformanceQuerySubmitInfoKHR);
         }
 #endif
 #ifdef VK_KHR_portability_subset
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR: {
             return sizeof(VkPhysicalDevicePortabilitySubsetFeaturesKHR);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR: {
             return sizeof(VkPhysicalDevicePortabilitySubsetPropertiesKHR);
         }
 #endif
 #ifdef VK_KHR_shader_clock
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR: {
             return sizeof(VkPhysicalDeviceShaderClockFeaturesKHR);
         }
 #endif
 #ifdef VK_KHR_shader_terminate_invocation
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR: {
             return sizeof(VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR);
         }
 #endif
 #ifdef VK_KHR_fragment_shading_rate
-        case VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR: {
             return sizeof(VkFragmentShadingRateAttachmentInfoKHR);
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR: {
             return sizeof(VkPipelineFragmentShadingRateStateCreateInfoKHR);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR: {
             return sizeof(VkPhysicalDeviceFragmentShadingRateFeaturesKHR);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR: {
             return sizeof(VkPhysicalDeviceFragmentShadingRatePropertiesKHR);
         }
 #endif
 #ifdef VK_KHR_surface_protected_capabilities
-        case VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR: {
             return sizeof(VkSurfaceProtectedCapabilitiesKHR);
         }
 #endif
 #ifdef VK_KHR_present_wait
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR: {
             return sizeof(VkPhysicalDevicePresentWaitFeaturesKHR);
         }
 #endif
 #ifdef VK_KHR_pipeline_executable_properties
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR: {
             return sizeof(VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR);
         }
 #endif
 #ifdef VK_KHR_shader_integer_dot_product
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR: {
             return sizeof(VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES_KHR: {
             return sizeof(VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR);
         }
 #endif
 #ifdef VK_KHR_present_id
-        case VK_STRUCTURE_TYPE_PRESENT_ID_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PRESENT_ID_KHR: {
             return sizeof(VkPresentIdKHR);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR: {
             return sizeof(VkPhysicalDevicePresentIdFeaturesKHR);
         }
 #endif
 #ifdef VK_KHR_video_encode_queue
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_INFO_KHR: {
             return sizeof(VkVideoEncodeRateControlInfoKHR);
         }
 #endif
 #ifdef VK_KHR_synchronization2
-        case VK_STRUCTURE_TYPE_MEMORY_BARRIER_2_KHR:
-        {
+        case VK_STRUCTURE_TYPE_MEMORY_BARRIER_2_KHR: {
             return sizeof(VkMemoryBarrier2KHR);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR: {
             return sizeof(VkPhysicalDeviceSynchronization2FeaturesKHR);
         }
-        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_2_NV:
-        {
+        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_2_NV: {
             return sizeof(VkQueueFamilyCheckpointProperties2NV);
         }
 #endif
 #ifdef VK_KHR_shader_subgroup_uniform_control_flow
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR: {
             return sizeof(VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR);
         }
 #endif
 #ifdef VK_KHR_zero_initialize_workgroup_memory
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR: {
             return sizeof(VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR);
         }
 #endif
 #ifdef VK_KHR_workgroup_memory_explicit_layout
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR: {
             return sizeof(VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR);
         }
 #endif
 #ifdef VK_KHR_format_feature_flags2
-        case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR:
-        {
+        case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR: {
             return sizeof(VkFormatProperties3KHR);
         }
 #endif
 #ifdef VK_KHR_maintenance4
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES_KHR: {
             return sizeof(VkPhysicalDeviceMaintenance4FeaturesKHR);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES_KHR: {
             return sizeof(VkPhysicalDeviceMaintenance4PropertiesKHR);
         }
 #endif
 #ifdef VK_ANDROID_native_buffer
-        case VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID:
-        {
+        case VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID: {
             return sizeof(VkNativeBufferANDROID);
         }
 #endif
 #ifdef VK_EXT_debug_report
-        case VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT: {
             return sizeof(VkDebugReportCallbackCreateInfoEXT);
         }
 #endif
 #ifdef VK_AMD_rasterization_order
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD: {
             return sizeof(VkPipelineRasterizationStateRasterizationOrderAMD);
         }
 #endif
 #ifdef VK_NV_dedicated_allocation
-        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV: {
             return sizeof(VkDedicatedAllocationImageCreateInfoNV);
         }
-        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV: {
             return sizeof(VkDedicatedAllocationBufferCreateInfoNV);
         }
-        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV: {
             return sizeof(VkDedicatedAllocationMemoryAllocateInfoNV);
         }
 #endif
 #ifdef VK_EXT_transform_feedback
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceTransformFeedbackFeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDeviceTransformFeedbackPropertiesEXT);
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT: {
             return sizeof(VkPipelineRasterizationStateStreamCreateInfoEXT);
         }
 #endif
 #ifdef VK_EXT_video_encode_h264
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_EXT: {
             return sizeof(VkVideoEncodeH264CapabilitiesEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_CREATE_INFO_EXT: {
             return sizeof(VkVideoEncodeH264SessionCreateInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT: {
             return sizeof(VkVideoEncodeH264SessionParametersAddInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT: {
             return sizeof(VkVideoEncodeH264SessionParametersCreateInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_VCL_FRAME_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_VCL_FRAME_INFO_EXT: {
             return sizeof(VkVideoEncodeH264VclFrameInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_EMIT_PICTURE_PARAMETERS_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_EMIT_PICTURE_PARAMETERS_EXT: {
             return sizeof(VkVideoEncodeH264EmitPictureParametersEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_EXT: {
             return sizeof(VkVideoEncodeH264ProfileEXT);
         }
 #endif
 #ifdef VK_EXT_video_encode_h265
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_EXT: {
             return sizeof(VkVideoEncodeH265CapabilitiesEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_CREATE_INFO_EXT: {
             return sizeof(VkVideoEncodeH265SessionCreateInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT: {
             return sizeof(VkVideoEncodeH265SessionParametersAddInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT: {
             return sizeof(VkVideoEncodeH265SessionParametersCreateInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_VCL_FRAME_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_VCL_FRAME_INFO_EXT: {
             return sizeof(VkVideoEncodeH265VclFrameInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_EMIT_PICTURE_PARAMETERS_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_EMIT_PICTURE_PARAMETERS_EXT: {
             return sizeof(VkVideoEncodeH265EmitPictureParametersEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_EXT: {
             return sizeof(VkVideoEncodeH265ProfileEXT);
         }
 #endif
 #ifdef VK_EXT_video_decode_h264
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_EXT: {
             return sizeof(VkVideoDecodeH264ProfileEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT: {
             return sizeof(VkVideoDecodeH264CapabilitiesEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_CREATE_INFO_EXT: {
             return sizeof(VkVideoDecodeH264SessionCreateInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT: {
             return sizeof(VkVideoDecodeH264SessionParametersAddInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT: {
             return sizeof(VkVideoDecodeH264SessionParametersCreateInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT: {
             return sizeof(VkVideoDecodeH264PictureInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_MVC_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_MVC_EXT: {
             return sizeof(VkVideoDecodeH264MvcEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT: {
             return sizeof(VkVideoDecodeH264DpbSlotInfoEXT);
         }
 #endif
 #ifdef VK_AMD_texture_gather_bias_lod
-        case VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD:
-        {
+        case VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD: {
             return sizeof(VkTextureLODGatherFormatPropertiesAMD);
         }
 #endif
 #ifdef VK_NV_corner_sampled_image
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV: {
             return sizeof(VkPhysicalDeviceCornerSampledImageFeaturesNV);
         }
 #endif
 #ifdef VK_NV_external_memory
-        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV: {
             return sizeof(VkExternalMemoryImageCreateInfoNV);
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV: {
             return sizeof(VkExportMemoryAllocateInfoNV);
         }
 #endif
 #ifdef VK_NV_external_memory_win32
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV: {
             return sizeof(VkImportMemoryWin32HandleInfoNV);
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV: {
             return sizeof(VkExportMemoryWin32HandleInfoNV);
         }
 #endif
 #ifdef VK_NV_win32_keyed_mutex
-        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV: {
             return sizeof(VkWin32KeyedMutexAcquireReleaseInfoNV);
         }
 #endif
 #ifdef VK_EXT_validation_flags
-        case VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT: {
             return sizeof(VkValidationFlagsEXT);
         }
 #endif
 #ifdef VK_EXT_texture_compression_astc_hdr
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT);
         }
 #endif
 #ifdef VK_EXT_astc_decode_mode
-        case VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT:
-        {
+        case VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT: {
             return sizeof(VkImageViewASTCDecodeModeEXT);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceASTCDecodeFeaturesEXT);
         }
 #endif
 #ifdef VK_EXT_conditional_rendering
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceConditionalRenderingFeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT: {
             return sizeof(VkCommandBufferInheritanceConditionalRenderingInfoEXT);
         }
 #endif
 #ifdef VK_NV_clip_space_w_scaling
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV: {
             return sizeof(VkPipelineViewportWScalingStateCreateInfoNV);
         }
 #endif
 #ifdef VK_EXT_display_control
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT: {
             return sizeof(VkSwapchainCounterCreateInfoEXT);
         }
 #endif
 #ifdef VK_GOOGLE_display_timing
-        case VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE:
-        {
+        case VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE: {
             return sizeof(VkPresentTimesInfoGOOGLE);
         }
 #endif
 #ifdef VK_NVX_multiview_per_view_attributes
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX: {
             return sizeof(VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX);
         }
 #endif
 #ifdef VK_NV_viewport_swizzle
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV: {
             return sizeof(VkPipelineViewportSwizzleStateCreateInfoNV);
         }
 #endif
 #ifdef VK_EXT_discard_rectangles
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDeviceDiscardRectanglePropertiesEXT);
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT: {
             return sizeof(VkPipelineDiscardRectangleStateCreateInfoEXT);
         }
 #endif
 #ifdef VK_EXT_conservative_rasterization
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDeviceConservativeRasterizationPropertiesEXT);
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT: {
             return sizeof(VkPipelineRasterizationConservativeStateCreateInfoEXT);
         }
 #endif
 #ifdef VK_EXT_depth_clip_enable
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceDepthClipEnableFeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT: {
             return sizeof(VkPipelineRasterizationDepthClipStateCreateInfoEXT);
         }
 #endif
 #ifdef VK_EXT_debug_utils
-        case VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT: {
             return sizeof(VkDebugUtilsMessengerCreateInfoEXT);
         }
 #endif
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
-        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID:
-        {
+        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID: {
             return sizeof(VkAndroidHardwareBufferUsageANDROID);
         }
-        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID:
-        {
+        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID: {
             return sizeof(VkAndroidHardwareBufferFormatPropertiesANDROID);
         }
-        case VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID:
-        {
+        case VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID: {
             return sizeof(VkImportAndroidHardwareBufferInfoANDROID);
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID:
-        {
+        case VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID: {
             return sizeof(VkExternalFormatANDROID);
         }
-        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_2_ANDROID:
-        {
+        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_2_ANDROID: {
             return sizeof(VkAndroidHardwareBufferFormatProperties2ANDROID);
         }
 #endif
 #ifdef VK_EXT_inline_uniform_block
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceInlineUniformBlockFeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDeviceInlineUniformBlockPropertiesEXT);
         }
-        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT:
-        {
+        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT: {
             return sizeof(VkWriteDescriptorSetInlineUniformBlockEXT);
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT: {
             return sizeof(VkDescriptorPoolInlineUniformBlockCreateInfoEXT);
         }
 #endif
 #ifdef VK_EXT_sample_locations
-        case VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT: {
             return sizeof(VkSampleLocationsInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT: {
             return sizeof(VkRenderPassSampleLocationsBeginInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT: {
             return sizeof(VkPipelineSampleLocationsStateCreateInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDeviceSampleLocationsPropertiesEXT);
         }
 #endif
 #ifdef VK_EXT_blend_operation_advanced
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT);
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT: {
             return sizeof(VkPipelineColorBlendAdvancedStateCreateInfoEXT);
         }
 #endif
 #ifdef VK_NV_fragment_coverage_to_color
-        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV: {
             return sizeof(VkPipelineCoverageToColorStateCreateInfoNV);
         }
 #endif
 #ifdef VK_NV_framebuffer_mixed_samples
-        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV: {
             return sizeof(VkPipelineCoverageModulationStateCreateInfoNV);
         }
 #endif
 #ifdef VK_NV_shader_sm_builtins
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV: {
             return sizeof(VkPhysicalDeviceShaderSMBuiltinsPropertiesNV);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV: {
             return sizeof(VkPhysicalDeviceShaderSMBuiltinsFeaturesNV);
         }
 #endif
 #ifdef VK_EXT_image_drm_format_modifier
-        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT:
-        {
+        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT: {
             return sizeof(VkDrmFormatModifierPropertiesListEXT);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT: {
             return sizeof(VkPhysicalDeviceImageDrmFormatModifierInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT: {
             return sizeof(VkImageDrmFormatModifierListCreateInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT: {
             return sizeof(VkImageDrmFormatModifierExplicitCreateInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_2_EXT:
-        {
+        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_2_EXT: {
             return sizeof(VkDrmFormatModifierPropertiesList2EXT);
         }
 #endif
 #ifdef VK_EXT_validation_cache
-        case VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT: {
             return sizeof(VkShaderModuleValidationCacheCreateInfoEXT);
         }
 #endif
 #ifdef VK_NV_shading_rate_image
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV: {
             return sizeof(VkPipelineViewportShadingRateImageStateCreateInfoNV);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV: {
             return sizeof(VkPhysicalDeviceShadingRateImageFeaturesNV);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV: {
             return sizeof(VkPhysicalDeviceShadingRateImagePropertiesNV);
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV: {
             return sizeof(VkPipelineViewportCoarseSampleOrderStateCreateInfoNV);
         }
 #endif
 #ifdef VK_NV_ray_tracing
-        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV:
-        {
+        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV: {
             return sizeof(VkWriteDescriptorSetAccelerationStructureNV);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV: {
             return sizeof(VkPhysicalDeviceRayTracingPropertiesNV);
         }
 #endif
 #ifdef VK_NV_representative_fragment_test
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV: {
             return sizeof(VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV);
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV: {
             return sizeof(VkPipelineRepresentativeFragmentTestStateCreateInfoNV);
         }
 #endif
 #ifdef VK_EXT_filter_cubic
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT: {
             return sizeof(VkPhysicalDeviceImageViewImageFormatInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT: {
             return sizeof(VkFilterCubicImageViewImageFormatPropertiesEXT);
         }
 #endif
 #ifdef VK_EXT_global_priority
-        case VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT: {
             return sizeof(VkDeviceQueueGlobalPriorityCreateInfoEXT);
         }
 #endif
 #ifdef VK_EXT_external_memory_host
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT: {
             return sizeof(VkImportMemoryHostPointerInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDeviceExternalMemoryHostPropertiesEXT);
         }
 #endif
 #ifdef VK_AMD_pipeline_compiler_control
-        case VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD: {
             return sizeof(VkPipelineCompilerControlCreateInfoAMD);
         }
 #endif
 #ifdef VK_AMD_shader_core_properties
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD: {
             return sizeof(VkPhysicalDeviceShaderCorePropertiesAMD);
         }
 #endif
 #ifdef VK_EXT_video_decode_h265
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_EXT: {
             return sizeof(VkVideoDecodeH265ProfileEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT: {
             return sizeof(VkVideoDecodeH265CapabilitiesEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_CREATE_INFO_EXT: {
             return sizeof(VkVideoDecodeH265SessionCreateInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT: {
             return sizeof(VkVideoDecodeH265SessionParametersAddInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT: {
             return sizeof(VkVideoDecodeH265SessionParametersCreateInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT: {
             return sizeof(VkVideoDecodeH265PictureInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT: {
             return sizeof(VkVideoDecodeH265DpbSlotInfoEXT);
         }
 #endif
 #ifdef VK_AMD_memory_overallocation_behavior
-        case VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD:
-        {
+        case VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD: {
             return sizeof(VkDeviceMemoryOverallocationCreateInfoAMD);
         }
 #endif
 #ifdef VK_EXT_vertex_attribute_divisor
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT);
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT: {
             return sizeof(VkPipelineVertexInputDivisorStateCreateInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT);
         }
 #endif
 #ifdef VK_GGP_frame_token
-        case VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP:
-        {
+        case VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP: {
             return sizeof(VkPresentFrameTokenGGP);
         }
 #endif
 #ifdef VK_EXT_pipeline_creation_feedback
-        case VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT: {
             return sizeof(VkPipelineCreationFeedbackCreateInfoEXT);
         }
 #endif
 #ifdef VK_NV_compute_shader_derivatives
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV: {
             return sizeof(VkPhysicalDeviceComputeShaderDerivativesFeaturesNV);
         }
 #endif
 #ifdef VK_NV_mesh_shader
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV: {
             return sizeof(VkPhysicalDeviceMeshShaderFeaturesNV);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV: {
             return sizeof(VkPhysicalDeviceMeshShaderPropertiesNV);
         }
 #endif
 #ifdef VK_NV_fragment_shader_barycentric
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV: {
             return sizeof(VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV);
         }
 #endif
 #ifdef VK_NV_shader_image_footprint
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV: {
             return sizeof(VkPhysicalDeviceShaderImageFootprintFeaturesNV);
         }
 #endif
 #ifdef VK_NV_scissor_exclusive
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV: {
             return sizeof(VkPipelineViewportExclusiveScissorStateCreateInfoNV);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV: {
             return sizeof(VkPhysicalDeviceExclusiveScissorFeaturesNV);
         }
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
-        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV:
-        {
+        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV: {
             return sizeof(VkQueueFamilyCheckpointPropertiesNV);
         }
 #endif
 #ifdef VK_INTEL_shader_integer_functions2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL: {
             return sizeof(VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL);
         }
 #endif
 #ifdef VK_INTEL_performance_query
-        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL:
-        {
+        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL: {
             return sizeof(VkQueryPoolPerformanceQueryCreateInfoINTEL);
         }
 #endif
 #ifdef VK_EXT_pci_bus_info
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDevicePCIBusInfoPropertiesEXT);
         }
 #endif
 #ifdef VK_AMD_display_native_hdr
-        case VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD:
-        {
+        case VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD: {
             return sizeof(VkDisplayNativeHdrSurfaceCapabilitiesAMD);
         }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD:
-        {
+        case VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD: {
             return sizeof(VkSwapchainDisplayNativeHdrCreateInfoAMD);
         }
 #endif
 #ifdef VK_EXT_fragment_density_map
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT:
-        {
-            switch(rootType)
-            {
-                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2:
-                {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT: {
+            switch (rootType) {
+                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2: {
                     return sizeof(VkPhysicalDeviceFragmentDensityMapFeaturesEXT);
                     break;
                 }
-                case VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO:
-                {
+                case VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO: {
                     return sizeof(VkPhysicalDeviceFragmentDensityMapFeaturesEXT);
                     break;
                 }
-                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO:
-                {
+                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO: {
                     return sizeof(VkImportColorBufferGOOGLE);
                     break;
                 }
-                default:
-                {
+                default: {
                     return sizeof(VkPhysicalDeviceFragmentDensityMapFeaturesEXT);
                     break;
                 }
             }
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT:
-        {
-            switch(rootType)
-            {
-                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2:
-                {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT: {
+            switch (rootType) {
+                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2: {
                     return sizeof(VkPhysicalDeviceFragmentDensityMapPropertiesEXT);
                     break;
                 }
-                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO:
-                {
+                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO: {
                     return sizeof(VkImportPhysicalAddressGOOGLE);
                     break;
                 }
-                default:
-                {
+                default: {
                     return sizeof(VkPhysicalDeviceFragmentDensityMapPropertiesEXT);
                     break;
                 }
             }
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT:
-        {
-            switch(rootType)
-            {
-                case VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO:
-                {
+        case VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT: {
+            switch (rootType) {
+                case VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO: {
                     return sizeof(VkRenderPassFragmentDensityMapCreateInfoEXT);
                     break;
                 }
-                case VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2:
-                {
+                case VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2: {
                     return sizeof(VkRenderPassFragmentDensityMapCreateInfoEXT);
                     break;
                 }
-                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO:
-                {
+                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO: {
                     return sizeof(VkImportBufferGOOGLE);
                     break;
                 }
-                default:
-                {
+                default: {
                     return sizeof(VkRenderPassFragmentDensityMapCreateInfoEXT);
                     break;
                 }
@@ -1859,1810 +1585,1431 @@
         }
 #endif
 #ifdef VK_EXT_subgroup_size_control
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceSubgroupSizeControlFeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDeviceSubgroupSizeControlPropertiesEXT);
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT: {
             return sizeof(VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT);
         }
 #endif
 #ifdef VK_AMD_shader_core_properties2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD: {
             return sizeof(VkPhysicalDeviceShaderCoreProperties2AMD);
         }
 #endif
 #ifdef VK_AMD_device_coherent_memory
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD: {
             return sizeof(VkPhysicalDeviceCoherentMemoryFeaturesAMD);
         }
 #endif
 #ifdef VK_EXT_shader_image_atomic_int64
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT);
         }
 #endif
 #ifdef VK_EXT_memory_budget
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDeviceMemoryBudgetPropertiesEXT);
         }
 #endif
 #ifdef VK_EXT_memory_priority
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceMemoryPriorityFeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT: {
             return sizeof(VkMemoryPriorityAllocateInfoEXT);
         }
 #endif
 #ifdef VK_NV_dedicated_allocation_image_aliasing
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV: {
             return sizeof(VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV);
         }
 #endif
 #ifdef VK_EXT_buffer_device_address
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceBufferDeviceAddressFeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT: {
             return sizeof(VkBufferDeviceAddressCreateInfoEXT);
         }
 #endif
 #ifdef VK_EXT_validation_features
-        case VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT: {
             return sizeof(VkValidationFeaturesEXT);
         }
 #endif
 #ifdef VK_NV_cooperative_matrix
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV: {
             return sizeof(VkPhysicalDeviceCooperativeMatrixFeaturesNV);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV: {
             return sizeof(VkPhysicalDeviceCooperativeMatrixPropertiesNV);
         }
 #endif
 #ifdef VK_NV_coverage_reduction_mode
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV: {
             return sizeof(VkPhysicalDeviceCoverageReductionModeFeaturesNV);
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV: {
             return sizeof(VkPipelineCoverageReductionStateCreateInfoNV);
         }
 #endif
 #ifdef VK_EXT_fragment_shader_interlock
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT);
         }
 #endif
 #ifdef VK_EXT_ycbcr_image_arrays
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceYcbcrImageArraysFeaturesEXT);
         }
 #endif
 #ifdef VK_EXT_provoking_vertex
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceProvokingVertexFeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDeviceProvokingVertexPropertiesEXT);
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT: {
             return sizeof(VkPipelineRasterizationProvokingVertexStateCreateInfoEXT);
         }
 #endif
 #ifdef VK_EXT_full_screen_exclusive
-        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT: {
             return sizeof(VkSurfaceFullScreenExclusiveInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT:
-        {
+        case VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT: {
             return sizeof(VkSurfaceCapabilitiesFullScreenExclusiveEXT);
         }
-        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT: {
             return sizeof(VkSurfaceFullScreenExclusiveWin32InfoEXT);
         }
 #endif
 #ifdef VK_EXT_line_rasterization
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceLineRasterizationFeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDeviceLineRasterizationPropertiesEXT);
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT: {
             return sizeof(VkPipelineRasterizationLineStateCreateInfoEXT);
         }
 #endif
 #ifdef VK_EXT_shader_atomic_float
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceShaderAtomicFloatFeaturesEXT);
         }
 #endif
 #ifdef VK_EXT_index_type_uint8
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceIndexTypeUint8FeaturesEXT);
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceExtendedDynamicStateFeaturesEXT);
         }
 #endif
 #ifdef VK_EXT_shader_atomic_float2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT);
         }
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT);
         }
 #endif
 #ifdef VK_NV_device_generated_commands
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV: {
             return sizeof(VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV: {
             return sizeof(VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV);
         }
-        case VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV: {
             return sizeof(VkGraphicsPipelineShaderGroupsCreateInfoNV);
         }
 #endif
 #ifdef VK_NV_inherited_viewport_scissor
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV: {
             return sizeof(VkPhysicalDeviceInheritedViewportScissorFeaturesNV);
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_VIEWPORT_SCISSOR_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_VIEWPORT_SCISSOR_INFO_NV: {
             return sizeof(VkCommandBufferInheritanceViewportScissorInfoNV);
         }
 #endif
 #ifdef VK_EXT_texel_buffer_alignment
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT);
         }
 #endif
 #ifdef VK_QCOM_render_pass_transform
-        case VK_STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM:
-        {
+        case VK_STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM: {
             return sizeof(VkRenderPassTransformBeginInfoQCOM);
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM:
-        {
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM: {
             return sizeof(VkCommandBufferInheritanceRenderPassTransformInfoQCOM);
         }
 #endif
 #ifdef VK_EXT_device_memory_report
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceDeviceMemoryReportFeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT: {
             return sizeof(VkDeviceDeviceMemoryReportCreateInfoEXT);
         }
 #endif
 #ifdef VK_EXT_robustness2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceRobustness2FeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDeviceRobustness2PropertiesEXT);
         }
 #endif
 #ifdef VK_EXT_custom_border_color
-        case VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT: {
             return sizeof(VkSamplerCustomBorderColorCreateInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDeviceCustomBorderColorPropertiesEXT);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceCustomBorderColorFeaturesEXT);
         }
 #endif
 #ifdef VK_EXT_private_data
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT: {
             return sizeof(VkPhysicalDevicePrivateDataFeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT: {
             return sizeof(VkDevicePrivateDataCreateInfoEXT);
         }
 #endif
 #ifdef VK_EXT_pipeline_creation_cache_control
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT: {
             return sizeof(VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT);
         }
 #endif
 #ifdef VK_NV_device_diagnostics_config
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV: {
             return sizeof(VkPhysicalDeviceDiagnosticsConfigFeaturesNV);
         }
-        case VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV: {
             return sizeof(VkDeviceDiagnosticsConfigCreateInfoNV);
         }
 #endif
 #ifdef VK_NV_fragment_shading_rate_enums
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV: {
             return sizeof(VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV: {
             return sizeof(VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV);
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV: {
             return sizeof(VkPipelineFragmentShadingRateEnumStateCreateInfoNV);
         }
 #endif
 #ifdef VK_NV_ray_tracing_motion_blur
-        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_MOTION_TRIANGLES_DATA_NV:
-        {
+        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_MOTION_TRIANGLES_DATA_NV: {
             return sizeof(VkAccelerationStructureGeometryMotionTrianglesDataNV);
         }
-        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MOTION_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MOTION_INFO_NV: {
             return sizeof(VkAccelerationStructureMotionInfoNV);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV: {
             return sizeof(VkPhysicalDeviceRayTracingMotionBlurFeaturesNV);
         }
 #endif
 #ifdef VK_EXT_ycbcr_2plane_444_formats
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT);
         }
 #endif
 #ifdef VK_EXT_fragment_density_map2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceFragmentDensityMap2FeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDeviceFragmentDensityMap2PropertiesEXT);
         }
 #endif
 #ifdef VK_QCOM_rotated_copy_commands
-        case VK_STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM:
-        {
+        case VK_STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM: {
             return sizeof(VkCopyCommandTransformInfoQCOM);
         }
 #endif
 #ifdef VK_EXT_image_robustness
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceImageRobustnessFeaturesEXT);
         }
 #endif
 #ifdef VK_EXT_4444_formats
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT: {
             return sizeof(VkPhysicalDevice4444FormatsFeaturesEXT);
         }
 #endif
 #ifdef VK_EXT_rgba10x6_formats
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT);
         }
 #endif
 #ifdef VK_VALVE_mutable_descriptor_type
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE: {
             return sizeof(VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE);
         }
-        case VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE:
-        {
+        case VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE: {
             return sizeof(VkMutableDescriptorTypeCreateInfoVALVE);
         }
 #endif
 #ifdef VK_EXT_vertex_input_dynamic_state
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT);
         }
 #endif
 #ifdef VK_EXT_physical_device_drm
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRM_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRM_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDeviceDrmPropertiesEXT);
         }
 #endif
 #ifdef VK_EXT_primitive_topology_list_restart
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT: {
             return sizeof(VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT);
         }
 #endif
 #ifdef VK_FUCHSIA_external_memory
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA:
-        {
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA: {
             return sizeof(VkImportMemoryZirconHandleInfoFUCHSIA);
         }
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA:
-        {
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA: {
             return sizeof(VkImportMemoryBufferCollectionFUCHSIA);
         }
-        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA:
-        {
+        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA: {
             return sizeof(VkBufferCollectionImageCreateInfoFUCHSIA);
         }
-        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_BUFFER_CREATE_INFO_FUCHSIA:
-        {
+        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_BUFFER_CREATE_INFO_FUCHSIA: {
             return sizeof(VkBufferCollectionBufferCreateInfoFUCHSIA);
         }
 #endif
 #ifdef VK_HUAWEI_subpass_shading
-        case VK_STRUCTURE_TYPE_SUBPASS_SHADING_PIPELINE_CREATE_INFO_HUAWEI:
-        {
+        case VK_STRUCTURE_TYPE_SUBPASS_SHADING_PIPELINE_CREATE_INFO_HUAWEI: {
             return sizeof(VkSubpassShadingPipelineCreateInfoHUAWEI);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI: {
             return sizeof(VkPhysicalDeviceSubpassShadingFeaturesHUAWEI);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_PROPERTIES_HUAWEI:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_PROPERTIES_HUAWEI: {
             return sizeof(VkPhysicalDeviceSubpassShadingPropertiesHUAWEI);
         }
 #endif
 #ifdef VK_HUAWEI_invocation_mask
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI: {
             return sizeof(VkPhysicalDeviceInvocationMaskFeaturesHUAWEI);
         }
 #endif
 #ifdef VK_NV_external_memory_rdma
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV: {
             return sizeof(VkPhysicalDeviceExternalMemoryRDMAFeaturesNV);
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceExtendedDynamicState2FeaturesEXT);
         }
 #endif
 #ifdef VK_EXT_color_write_enable
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceColorWriteEnableFeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_WRITE_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_WRITE_CREATE_INFO_EXT: {
             return sizeof(VkPipelineColorWriteCreateInfoEXT);
         }
 #endif
 #ifdef VK_GOOGLE_gfxstream
-        case VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE:
-        {
+        case VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE: {
             return sizeof(VkImportColorBufferGOOGLE);
         }
-        case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE:
-        {
+        case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE: {
             return sizeof(VkImportBufferGOOGLE);
         }
-        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE:
-        {
+        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE: {
             return sizeof(VkImportPhysicalAddressGOOGLE);
         }
 #endif
 #ifdef VK_EXT_global_priority_query
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_EXT: {
             return sizeof(VkQueueFamilyGlobalPriorityPropertiesEXT);
         }
 #endif
 #ifdef VK_EXT_multi_draw
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceMultiDrawFeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDeviceMultiDrawPropertiesEXT);
         }
 #endif
 #ifdef VK_EXT_border_color_swizzle
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceBorderColorSwizzleFeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_BORDER_COLOR_COMPONENT_MAPPING_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_SAMPLER_BORDER_COLOR_COMPONENT_MAPPING_CREATE_INFO_EXT: {
             return sizeof(VkSamplerBorderColorComponentMappingCreateInfoEXT);
         }
 #endif
 #ifdef VK_EXT_pageable_device_local_memory
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT: {
             return sizeof(VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT);
         }
 #endif
 #ifdef VK_KHR_acceleration_structure
-        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR:
-        {
+        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR: {
             return sizeof(VkWriteDescriptorSetAccelerationStructureKHR);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR: {
             return sizeof(VkPhysicalDeviceAccelerationStructureFeaturesKHR);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR: {
             return sizeof(VkPhysicalDeviceAccelerationStructurePropertiesKHR);
         }
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR: {
             return sizeof(VkPhysicalDeviceRayTracingPipelineFeaturesKHR);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR: {
             return sizeof(VkPhysicalDeviceRayTracingPipelinePropertiesKHR);
         }
 #endif
 #ifdef VK_KHR_ray_query
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR: {
             return sizeof(VkPhysicalDeviceRayQueryFeaturesKHR);
         }
 #endif
-        default:
-        {
+        default: {
             return (size_t)0;
         }
     }
 }
 
-size_t goldfish_vk_extension_struct_size_with_stream_features(
-    uint32_t streamFeatures,
-    VkStructureType rootType,
-    const void* structExtension)
-{
-    if (!structExtension)
-    {
+size_t goldfish_vk_extension_struct_size_with_stream_features(uint32_t streamFeatures,
+                                                              VkStructureType rootType,
+                                                              const void* structExtension) {
+    if (!structExtension) {
         return (size_t)0;
     }
     uint32_t structType = (uint32_t)goldfish_vk_struct_type(structExtension);
-    switch(structType)
-    {
+    switch (structType) {
 #ifdef VK_VERSION_1_1
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES: {
             return sizeof(VkPhysicalDeviceSubgroupProperties);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES: {
             return sizeof(VkPhysicalDevice16BitStorageFeatures);
         }
-        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS:
-        {
+        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS: {
             return sizeof(VkMemoryDedicatedRequirements);
         }
-        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO: {
             return sizeof(VkMemoryDedicatedAllocateInfo);
         }
-        case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO:
-        {
+        case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO: {
             return sizeof(VkMemoryAllocateFlagsInfo);
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO:
-        {
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO: {
             return sizeof(VkDeviceGroupRenderPassBeginInfo);
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO:
-        {
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO: {
             return sizeof(VkDeviceGroupCommandBufferBeginInfo);
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO:
-        {
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO: {
             return sizeof(VkDeviceGroupSubmitInfo);
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO: {
             return sizeof(VkDeviceGroupBindSparseInfo);
         }
-        case VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO:
-        {
+        case VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO: {
             return sizeof(VkBindBufferMemoryDeviceGroupInfo);
         }
-        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO:
-        {
+        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO: {
             return sizeof(VkBindImageMemoryDeviceGroupInfo);
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO: {
             return sizeof(VkDeviceGroupDeviceCreateInfo);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2: {
             return sizeof(VkPhysicalDeviceFeatures2);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES: {
             return sizeof(VkPhysicalDevicePointClippingProperties);
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO: {
             return sizeof(VkRenderPassInputAttachmentAspectCreateInfo);
         }
-        case VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO: {
             return sizeof(VkImageViewUsageCreateInfo);
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO: {
             return sizeof(VkPipelineTessellationDomainOriginStateCreateInfo);
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO: {
             return sizeof(VkRenderPassMultiviewCreateInfo);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES: {
             return sizeof(VkPhysicalDeviceMultiviewFeatures);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES: {
             return sizeof(VkPhysicalDeviceMultiviewProperties);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES: {
             return sizeof(VkPhysicalDeviceVariablePointersFeatures);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES: {
             return sizeof(VkPhysicalDeviceProtectedMemoryFeatures);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES: {
             return sizeof(VkPhysicalDeviceProtectedMemoryProperties);
         }
-        case VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO:
-        {
+        case VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO: {
             return sizeof(VkProtectedSubmitInfo);
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO:
-        {
+        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO: {
             return sizeof(VkSamplerYcbcrConversionInfo);
         }
-        case VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO:
-        {
+        case VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO: {
             return sizeof(VkBindImagePlaneMemoryInfo);
         }
-        case VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO:
-        {
+        case VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO: {
             return sizeof(VkImagePlaneMemoryRequirementsInfo);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES: {
             return sizeof(VkPhysicalDeviceSamplerYcbcrConversionFeatures);
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES:
-        {
+        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES: {
             return sizeof(VkSamplerYcbcrConversionImageFormatProperties);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO: {
             return sizeof(VkPhysicalDeviceExternalImageFormatInfo);
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES:
-        {
+        case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES: {
             return sizeof(VkExternalImageFormatProperties);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES: {
             return sizeof(VkPhysicalDeviceIDProperties);
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO: {
             return sizeof(VkExternalMemoryImageCreateInfo);
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO: {
             return sizeof(VkExternalMemoryBufferCreateInfo);
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO: {
             return sizeof(VkExportMemoryAllocateInfo);
         }
-        case VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO: {
             return sizeof(VkExportFenceCreateInfo);
         }
-        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO: {
             return sizeof(VkExportSemaphoreCreateInfo);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES: {
             return sizeof(VkPhysicalDeviceMaintenance3Properties);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES: {
             return sizeof(VkPhysicalDeviceShaderDrawParametersFeatures);
         }
 #endif
 #ifdef VK_VERSION_1_2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: {
             return sizeof(VkPhysicalDeviceVulkan11Features);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: {
             return sizeof(VkPhysicalDeviceVulkan11Properties);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: {
             return sizeof(VkPhysicalDeviceVulkan12Features);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: {
             return sizeof(VkPhysicalDeviceVulkan12Properties);
         }
-        case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO: {
             return sizeof(VkImageFormatListCreateInfo);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES: {
             return sizeof(VkPhysicalDevice8BitStorageFeatures);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES: {
             return sizeof(VkPhysicalDeviceDriverProperties);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES: {
             return sizeof(VkPhysicalDeviceShaderAtomicInt64Features);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES:
-        {
-            if (streamFeatures & VULKAN_STREAM_FEATURE_SHADER_FLOAT16_INT8_BIT)
-            {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES: {
+            if (streamFeatures & VULKAN_STREAM_FEATURE_SHADER_FLOAT16_INT8_BIT) {
                 return sizeof(VkPhysicalDeviceShaderFloat16Int8Features);
-            }
-            else
-            {
+            } else {
                 return 0;
             }
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES: {
             return sizeof(VkPhysicalDeviceFloatControlsProperties);
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO: {
             return sizeof(VkDescriptorSetLayoutBindingFlagsCreateInfo);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES: {
             return sizeof(VkPhysicalDeviceDescriptorIndexingFeatures);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES: {
             return sizeof(VkPhysicalDeviceDescriptorIndexingProperties);
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO: {
             return sizeof(VkDescriptorSetVariableDescriptorCountAllocateInfo);
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT:
-        {
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT: {
             return sizeof(VkDescriptorSetVariableDescriptorCountLayoutSupport);
         }
-        case VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE:
-        {
+        case VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE: {
             return sizeof(VkSubpassDescriptionDepthStencilResolve);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES: {
             return sizeof(VkPhysicalDeviceDepthStencilResolveProperties);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES: {
             return sizeof(VkPhysicalDeviceScalarBlockLayoutFeatures);
         }
-        case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO: {
             return sizeof(VkImageStencilUsageCreateInfo);
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO: {
             return sizeof(VkSamplerReductionModeCreateInfo);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES: {
             return sizeof(VkPhysicalDeviceSamplerFilterMinmaxProperties);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES: {
             return sizeof(VkPhysicalDeviceVulkanMemoryModelFeatures);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES: {
             return sizeof(VkPhysicalDeviceImagelessFramebufferFeatures);
         }
-        case VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO: {
             return sizeof(VkFramebufferAttachmentsCreateInfo);
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO:
-        {
+        case VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO: {
             return sizeof(VkRenderPassAttachmentBeginInfo);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES: {
             return sizeof(VkPhysicalDeviceUniformBufferStandardLayoutFeatures);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES: {
             return sizeof(VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES: {
             return sizeof(VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures);
         }
-        case VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT:
-        {
+        case VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT: {
             return sizeof(VkAttachmentReferenceStencilLayout);
         }
-        case VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT:
-        {
+        case VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT: {
             return sizeof(VkAttachmentDescriptionStencilLayout);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES: {
             return sizeof(VkPhysicalDeviceHostQueryResetFeatures);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES: {
             return sizeof(VkPhysicalDeviceTimelineSemaphoreFeatures);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES: {
             return sizeof(VkPhysicalDeviceTimelineSemaphoreProperties);
         }
-        case VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO: {
             return sizeof(VkSemaphoreTypeCreateInfo);
         }
-        case VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO:
-        {
+        case VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO: {
             return sizeof(VkTimelineSemaphoreSubmitInfo);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES: {
             return sizeof(VkPhysicalDeviceBufferDeviceAddressFeatures);
         }
-        case VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO: {
             return sizeof(VkBufferOpaqueCaptureAddressCreateInfo);
         }
-        case VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO:
-        {
+        case VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO: {
             return sizeof(VkMemoryOpaqueCaptureAddressAllocateInfo);
         }
 #endif
 #ifdef VK_KHR_swapchain
-        case VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR: {
             return sizeof(VkImageSwapchainCreateInfoKHR);
         }
-        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR: {
             return sizeof(VkBindImageMemorySwapchainInfoKHR);
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR: {
             return sizeof(VkDeviceGroupPresentInfoKHR);
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR: {
             return sizeof(VkDeviceGroupSwapchainCreateInfoKHR);
         }
 #endif
 #ifdef VK_KHR_display_swapchain
-        case VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR: {
             return sizeof(VkDisplayPresentInfoKHR);
         }
 #endif
 #ifdef VK_KHR_video_queue
-        case VK_STRUCTURE_TYPE_VIDEO_QUEUE_FAMILY_PROPERTIES_2_KHR:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_QUEUE_FAMILY_PROPERTIES_2_KHR: {
             return sizeof(VkVideoQueueFamilyProperties2KHR);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_PROFILE_KHR:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_PROFILE_KHR: {
             return sizeof(VkVideoProfileKHR);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_PROFILES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_PROFILES_KHR: {
             return sizeof(VkVideoProfilesKHR);
         }
 #endif
 #ifdef VK_KHR_dynamic_rendering
-        case VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR: {
             return sizeof(VkPipelineRenderingCreateInfoKHR);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES_KHR: {
             return sizeof(VkPhysicalDeviceDynamicRenderingFeaturesKHR);
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR: {
             return sizeof(VkCommandBufferInheritanceRenderingInfoKHR);
         }
-        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR: {
             return sizeof(VkRenderingFragmentShadingRateAttachmentInfoKHR);
         }
-        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_INFO_EXT: {
             return sizeof(VkRenderingFragmentDensityMapAttachmentInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_ATTACHMENT_SAMPLE_COUNT_INFO_AMD:
-        {
+        case VK_STRUCTURE_TYPE_ATTACHMENT_SAMPLE_COUNT_INFO_AMD: {
             return sizeof(VkAttachmentSampleCountInfoAMD);
         }
-        case VK_STRUCTURE_TYPE_MULTIVIEW_PER_VIEW_ATTRIBUTES_INFO_NVX:
-        {
+        case VK_STRUCTURE_TYPE_MULTIVIEW_PER_VIEW_ATTRIBUTES_INFO_NVX: {
             return sizeof(VkMultiviewPerViewAttributesInfoNVX);
         }
 #endif
 #ifdef VK_KHR_external_memory_win32
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR: {
             return sizeof(VkImportMemoryWin32HandleInfoKHR);
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR: {
             return sizeof(VkExportMemoryWin32HandleInfoKHR);
         }
 #endif
 #ifdef VK_KHR_external_memory_fd
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR: {
             return sizeof(VkImportMemoryFdInfoKHR);
         }
 #endif
 #ifdef VK_KHR_win32_keyed_mutex
-        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR: {
             return sizeof(VkWin32KeyedMutexAcquireReleaseInfoKHR);
         }
 #endif
 #ifdef VK_KHR_external_semaphore_win32
-        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR: {
             return sizeof(VkExportSemaphoreWin32HandleInfoKHR);
         }
-        case VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR: {
             return sizeof(VkD3D12FenceSubmitInfoKHR);
         }
 #endif
 #ifdef VK_KHR_push_descriptor
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR: {
             return sizeof(VkPhysicalDevicePushDescriptorPropertiesKHR);
         }
 #endif
 #ifdef VK_KHR_incremental_present
-        case VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR: {
             return sizeof(VkPresentRegionsKHR);
         }
 #endif
 #ifdef VK_KHR_shared_presentable_image
-        case VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR: {
             return sizeof(VkSharedPresentSurfaceCapabilitiesKHR);
         }
 #endif
 #ifdef VK_KHR_external_fence_win32
-        case VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR: {
             return sizeof(VkExportFenceWin32HandleInfoKHR);
         }
 #endif
 #ifdef VK_KHR_performance_query
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR: {
             return sizeof(VkPhysicalDevicePerformanceQueryFeaturesKHR);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR: {
             return sizeof(VkPhysicalDevicePerformanceQueryPropertiesKHR);
         }
-        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR: {
             return sizeof(VkQueryPoolPerformanceCreateInfoKHR);
         }
-        case VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR: {
             return sizeof(VkPerformanceQuerySubmitInfoKHR);
         }
 #endif
 #ifdef VK_KHR_portability_subset
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR: {
             return sizeof(VkPhysicalDevicePortabilitySubsetFeaturesKHR);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR: {
             return sizeof(VkPhysicalDevicePortabilitySubsetPropertiesKHR);
         }
 #endif
 #ifdef VK_KHR_shader_clock
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR: {
             return sizeof(VkPhysicalDeviceShaderClockFeaturesKHR);
         }
 #endif
 #ifdef VK_KHR_shader_terminate_invocation
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR: {
             return sizeof(VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR);
         }
 #endif
 #ifdef VK_KHR_fragment_shading_rate
-        case VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR: {
             return sizeof(VkFragmentShadingRateAttachmentInfoKHR);
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR: {
             return sizeof(VkPipelineFragmentShadingRateStateCreateInfoKHR);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR: {
             return sizeof(VkPhysicalDeviceFragmentShadingRateFeaturesKHR);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR: {
             return sizeof(VkPhysicalDeviceFragmentShadingRatePropertiesKHR);
         }
 #endif
 #ifdef VK_KHR_surface_protected_capabilities
-        case VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR: {
             return sizeof(VkSurfaceProtectedCapabilitiesKHR);
         }
 #endif
 #ifdef VK_KHR_present_wait
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR: {
             return sizeof(VkPhysicalDevicePresentWaitFeaturesKHR);
         }
 #endif
 #ifdef VK_KHR_pipeline_executable_properties
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR: {
             return sizeof(VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR);
         }
 #endif
 #ifdef VK_KHR_shader_integer_dot_product
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR: {
             return sizeof(VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES_KHR: {
             return sizeof(VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR);
         }
 #endif
 #ifdef VK_KHR_present_id
-        case VK_STRUCTURE_TYPE_PRESENT_ID_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PRESENT_ID_KHR: {
             return sizeof(VkPresentIdKHR);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR: {
             return sizeof(VkPhysicalDevicePresentIdFeaturesKHR);
         }
 #endif
 #ifdef VK_KHR_video_encode_queue
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_INFO_KHR:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_INFO_KHR: {
             return sizeof(VkVideoEncodeRateControlInfoKHR);
         }
 #endif
 #ifdef VK_KHR_synchronization2
-        case VK_STRUCTURE_TYPE_MEMORY_BARRIER_2_KHR:
-        {
+        case VK_STRUCTURE_TYPE_MEMORY_BARRIER_2_KHR: {
             return sizeof(VkMemoryBarrier2KHR);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR: {
             return sizeof(VkPhysicalDeviceSynchronization2FeaturesKHR);
         }
-        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_2_NV:
-        {
+        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_2_NV: {
             return sizeof(VkQueueFamilyCheckpointProperties2NV);
         }
 #endif
 #ifdef VK_KHR_shader_subgroup_uniform_control_flow
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR: {
             return sizeof(VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR);
         }
 #endif
 #ifdef VK_KHR_zero_initialize_workgroup_memory
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR: {
             return sizeof(VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR);
         }
 #endif
 #ifdef VK_KHR_workgroup_memory_explicit_layout
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR: {
             return sizeof(VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR);
         }
 #endif
 #ifdef VK_KHR_format_feature_flags2
-        case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR:
-        {
+        case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR: {
             return sizeof(VkFormatProperties3KHR);
         }
 #endif
 #ifdef VK_KHR_maintenance4
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES_KHR: {
             return sizeof(VkPhysicalDeviceMaintenance4FeaturesKHR);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES_KHR: {
             return sizeof(VkPhysicalDeviceMaintenance4PropertiesKHR);
         }
 #endif
 #ifdef VK_ANDROID_native_buffer
-        case VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID:
-        {
+        case VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID: {
             return sizeof(VkNativeBufferANDROID);
         }
 #endif
 #ifdef VK_EXT_debug_report
-        case VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT: {
             return sizeof(VkDebugReportCallbackCreateInfoEXT);
         }
 #endif
 #ifdef VK_AMD_rasterization_order
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD: {
             return sizeof(VkPipelineRasterizationStateRasterizationOrderAMD);
         }
 #endif
 #ifdef VK_NV_dedicated_allocation
-        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV: {
             return sizeof(VkDedicatedAllocationImageCreateInfoNV);
         }
-        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV: {
             return sizeof(VkDedicatedAllocationBufferCreateInfoNV);
         }
-        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV: {
             return sizeof(VkDedicatedAllocationMemoryAllocateInfoNV);
         }
 #endif
 #ifdef VK_EXT_transform_feedback
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceTransformFeedbackFeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDeviceTransformFeedbackPropertiesEXT);
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT: {
             return sizeof(VkPipelineRasterizationStateStreamCreateInfoEXT);
         }
 #endif
 #ifdef VK_EXT_video_encode_h264
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_EXT: {
             return sizeof(VkVideoEncodeH264CapabilitiesEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_CREATE_INFO_EXT: {
             return sizeof(VkVideoEncodeH264SessionCreateInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT: {
             return sizeof(VkVideoEncodeH264SessionParametersAddInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT: {
             return sizeof(VkVideoEncodeH264SessionParametersCreateInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_VCL_FRAME_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_VCL_FRAME_INFO_EXT: {
             return sizeof(VkVideoEncodeH264VclFrameInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_EMIT_PICTURE_PARAMETERS_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_EMIT_PICTURE_PARAMETERS_EXT: {
             return sizeof(VkVideoEncodeH264EmitPictureParametersEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_EXT: {
             return sizeof(VkVideoEncodeH264ProfileEXT);
         }
 #endif
 #ifdef VK_EXT_video_encode_h265
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_EXT: {
             return sizeof(VkVideoEncodeH265CapabilitiesEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_CREATE_INFO_EXT: {
             return sizeof(VkVideoEncodeH265SessionCreateInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT: {
             return sizeof(VkVideoEncodeH265SessionParametersAddInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT: {
             return sizeof(VkVideoEncodeH265SessionParametersCreateInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_VCL_FRAME_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_VCL_FRAME_INFO_EXT: {
             return sizeof(VkVideoEncodeH265VclFrameInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_EMIT_PICTURE_PARAMETERS_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_EMIT_PICTURE_PARAMETERS_EXT: {
             return sizeof(VkVideoEncodeH265EmitPictureParametersEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_EXT: {
             return sizeof(VkVideoEncodeH265ProfileEXT);
         }
 #endif
 #ifdef VK_EXT_video_decode_h264
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_EXT: {
             return sizeof(VkVideoDecodeH264ProfileEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT: {
             return sizeof(VkVideoDecodeH264CapabilitiesEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_CREATE_INFO_EXT: {
             return sizeof(VkVideoDecodeH264SessionCreateInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT: {
             return sizeof(VkVideoDecodeH264SessionParametersAddInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT: {
             return sizeof(VkVideoDecodeH264SessionParametersCreateInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT: {
             return sizeof(VkVideoDecodeH264PictureInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_MVC_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_MVC_EXT: {
             return sizeof(VkVideoDecodeH264MvcEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT: {
             return sizeof(VkVideoDecodeH264DpbSlotInfoEXT);
         }
 #endif
 #ifdef VK_AMD_texture_gather_bias_lod
-        case VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD:
-        {
+        case VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD: {
             return sizeof(VkTextureLODGatherFormatPropertiesAMD);
         }
 #endif
 #ifdef VK_NV_corner_sampled_image
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV: {
             return sizeof(VkPhysicalDeviceCornerSampledImageFeaturesNV);
         }
 #endif
 #ifdef VK_NV_external_memory
-        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV: {
             return sizeof(VkExternalMemoryImageCreateInfoNV);
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV: {
             return sizeof(VkExportMemoryAllocateInfoNV);
         }
 #endif
 #ifdef VK_NV_external_memory_win32
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV: {
             return sizeof(VkImportMemoryWin32HandleInfoNV);
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV: {
             return sizeof(VkExportMemoryWin32HandleInfoNV);
         }
 #endif
 #ifdef VK_NV_win32_keyed_mutex
-        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV: {
             return sizeof(VkWin32KeyedMutexAcquireReleaseInfoNV);
         }
 #endif
 #ifdef VK_EXT_validation_flags
-        case VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT: {
             return sizeof(VkValidationFlagsEXT);
         }
 #endif
 #ifdef VK_EXT_texture_compression_astc_hdr
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT);
         }
 #endif
 #ifdef VK_EXT_astc_decode_mode
-        case VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT:
-        {
+        case VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT: {
             return sizeof(VkImageViewASTCDecodeModeEXT);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceASTCDecodeFeaturesEXT);
         }
 #endif
 #ifdef VK_EXT_conditional_rendering
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceConditionalRenderingFeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT: {
             return sizeof(VkCommandBufferInheritanceConditionalRenderingInfoEXT);
         }
 #endif
 #ifdef VK_NV_clip_space_w_scaling
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV: {
             return sizeof(VkPipelineViewportWScalingStateCreateInfoNV);
         }
 #endif
 #ifdef VK_EXT_display_control
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT: {
             return sizeof(VkSwapchainCounterCreateInfoEXT);
         }
 #endif
 #ifdef VK_GOOGLE_display_timing
-        case VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE:
-        {
+        case VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE: {
             return sizeof(VkPresentTimesInfoGOOGLE);
         }
 #endif
 #ifdef VK_NVX_multiview_per_view_attributes
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX: {
             return sizeof(VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX);
         }
 #endif
 #ifdef VK_NV_viewport_swizzle
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV: {
             return sizeof(VkPipelineViewportSwizzleStateCreateInfoNV);
         }
 #endif
 #ifdef VK_EXT_discard_rectangles
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDeviceDiscardRectanglePropertiesEXT);
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT: {
             return sizeof(VkPipelineDiscardRectangleStateCreateInfoEXT);
         }
 #endif
 #ifdef VK_EXT_conservative_rasterization
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDeviceConservativeRasterizationPropertiesEXT);
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT: {
             return sizeof(VkPipelineRasterizationConservativeStateCreateInfoEXT);
         }
 #endif
 #ifdef VK_EXT_depth_clip_enable
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceDepthClipEnableFeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT: {
             return sizeof(VkPipelineRasterizationDepthClipStateCreateInfoEXT);
         }
 #endif
 #ifdef VK_EXT_debug_utils
-        case VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT: {
             return sizeof(VkDebugUtilsMessengerCreateInfoEXT);
         }
 #endif
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
-        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID:
-        {
+        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID: {
             return sizeof(VkAndroidHardwareBufferUsageANDROID);
         }
-        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID:
-        {
+        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID: {
             return sizeof(VkAndroidHardwareBufferFormatPropertiesANDROID);
         }
-        case VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID:
-        {
+        case VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID: {
             return sizeof(VkImportAndroidHardwareBufferInfoANDROID);
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID:
-        {
+        case VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID: {
             return sizeof(VkExternalFormatANDROID);
         }
-        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_2_ANDROID:
-        {
+        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_2_ANDROID: {
             return sizeof(VkAndroidHardwareBufferFormatProperties2ANDROID);
         }
 #endif
 #ifdef VK_EXT_inline_uniform_block
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceInlineUniformBlockFeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDeviceInlineUniformBlockPropertiesEXT);
         }
-        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT:
-        {
+        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT: {
             return sizeof(VkWriteDescriptorSetInlineUniformBlockEXT);
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT: {
             return sizeof(VkDescriptorPoolInlineUniformBlockCreateInfoEXT);
         }
 #endif
 #ifdef VK_EXT_sample_locations
-        case VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT: {
             return sizeof(VkSampleLocationsInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT: {
             return sizeof(VkRenderPassSampleLocationsBeginInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT: {
             return sizeof(VkPipelineSampleLocationsStateCreateInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDeviceSampleLocationsPropertiesEXT);
         }
 #endif
 #ifdef VK_EXT_blend_operation_advanced
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT);
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT: {
             return sizeof(VkPipelineColorBlendAdvancedStateCreateInfoEXT);
         }
 #endif
 #ifdef VK_NV_fragment_coverage_to_color
-        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV: {
             return sizeof(VkPipelineCoverageToColorStateCreateInfoNV);
         }
 #endif
 #ifdef VK_NV_framebuffer_mixed_samples
-        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV: {
             return sizeof(VkPipelineCoverageModulationStateCreateInfoNV);
         }
 #endif
 #ifdef VK_NV_shader_sm_builtins
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV: {
             return sizeof(VkPhysicalDeviceShaderSMBuiltinsPropertiesNV);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV: {
             return sizeof(VkPhysicalDeviceShaderSMBuiltinsFeaturesNV);
         }
 #endif
 #ifdef VK_EXT_image_drm_format_modifier
-        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT:
-        {
+        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT: {
             return sizeof(VkDrmFormatModifierPropertiesListEXT);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT: {
             return sizeof(VkPhysicalDeviceImageDrmFormatModifierInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT: {
             return sizeof(VkImageDrmFormatModifierListCreateInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT: {
             return sizeof(VkImageDrmFormatModifierExplicitCreateInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_2_EXT:
-        {
+        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_2_EXT: {
             return sizeof(VkDrmFormatModifierPropertiesList2EXT);
         }
 #endif
 #ifdef VK_EXT_validation_cache
-        case VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT: {
             return sizeof(VkShaderModuleValidationCacheCreateInfoEXT);
         }
 #endif
 #ifdef VK_NV_shading_rate_image
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV: {
             return sizeof(VkPipelineViewportShadingRateImageStateCreateInfoNV);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV: {
             return sizeof(VkPhysicalDeviceShadingRateImageFeaturesNV);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV: {
             return sizeof(VkPhysicalDeviceShadingRateImagePropertiesNV);
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV: {
             return sizeof(VkPipelineViewportCoarseSampleOrderStateCreateInfoNV);
         }
 #endif
 #ifdef VK_NV_ray_tracing
-        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV:
-        {
+        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV: {
             return sizeof(VkWriteDescriptorSetAccelerationStructureNV);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV: {
             return sizeof(VkPhysicalDeviceRayTracingPropertiesNV);
         }
 #endif
 #ifdef VK_NV_representative_fragment_test
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV: {
             return sizeof(VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV);
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV: {
             return sizeof(VkPipelineRepresentativeFragmentTestStateCreateInfoNV);
         }
 #endif
 #ifdef VK_EXT_filter_cubic
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT: {
             return sizeof(VkPhysicalDeviceImageViewImageFormatInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT: {
             return sizeof(VkFilterCubicImageViewImageFormatPropertiesEXT);
         }
 #endif
 #ifdef VK_EXT_global_priority
-        case VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT: {
             return sizeof(VkDeviceQueueGlobalPriorityCreateInfoEXT);
         }
 #endif
 #ifdef VK_EXT_external_memory_host
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT: {
             return sizeof(VkImportMemoryHostPointerInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDeviceExternalMemoryHostPropertiesEXT);
         }
 #endif
 #ifdef VK_AMD_pipeline_compiler_control
-        case VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD: {
             return sizeof(VkPipelineCompilerControlCreateInfoAMD);
         }
 #endif
 #ifdef VK_AMD_shader_core_properties
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD: {
             return sizeof(VkPhysicalDeviceShaderCorePropertiesAMD);
         }
 #endif
 #ifdef VK_EXT_video_decode_h265
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_EXT: {
             return sizeof(VkVideoDecodeH265ProfileEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT: {
             return sizeof(VkVideoDecodeH265CapabilitiesEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_CREATE_INFO_EXT: {
             return sizeof(VkVideoDecodeH265SessionCreateInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT: {
             return sizeof(VkVideoDecodeH265SessionParametersAddInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT: {
             return sizeof(VkVideoDecodeH265SessionParametersCreateInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT: {
             return sizeof(VkVideoDecodeH265PictureInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT: {
             return sizeof(VkVideoDecodeH265DpbSlotInfoEXT);
         }
 #endif
 #ifdef VK_AMD_memory_overallocation_behavior
-        case VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD:
-        {
+        case VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD: {
             return sizeof(VkDeviceMemoryOverallocationCreateInfoAMD);
         }
 #endif
 #ifdef VK_EXT_vertex_attribute_divisor
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT);
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT: {
             return sizeof(VkPipelineVertexInputDivisorStateCreateInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT);
         }
 #endif
 #ifdef VK_GGP_frame_token
-        case VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP:
-        {
+        case VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP: {
             return sizeof(VkPresentFrameTokenGGP);
         }
 #endif
 #ifdef VK_EXT_pipeline_creation_feedback
-        case VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT: {
             return sizeof(VkPipelineCreationFeedbackCreateInfoEXT);
         }
 #endif
 #ifdef VK_NV_compute_shader_derivatives
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV: {
             return sizeof(VkPhysicalDeviceComputeShaderDerivativesFeaturesNV);
         }
 #endif
 #ifdef VK_NV_mesh_shader
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV: {
             return sizeof(VkPhysicalDeviceMeshShaderFeaturesNV);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV: {
             return sizeof(VkPhysicalDeviceMeshShaderPropertiesNV);
         }
 #endif
 #ifdef VK_NV_fragment_shader_barycentric
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV: {
             return sizeof(VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV);
         }
 #endif
 #ifdef VK_NV_shader_image_footprint
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV: {
             return sizeof(VkPhysicalDeviceShaderImageFootprintFeaturesNV);
         }
 #endif
 #ifdef VK_NV_scissor_exclusive
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV: {
             return sizeof(VkPipelineViewportExclusiveScissorStateCreateInfoNV);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV: {
             return sizeof(VkPhysicalDeviceExclusiveScissorFeaturesNV);
         }
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
-        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV:
-        {
+        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV: {
             return sizeof(VkQueueFamilyCheckpointPropertiesNV);
         }
 #endif
 #ifdef VK_INTEL_shader_integer_functions2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL: {
             return sizeof(VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL);
         }
 #endif
 #ifdef VK_INTEL_performance_query
-        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL:
-        {
+        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL: {
             return sizeof(VkQueryPoolPerformanceQueryCreateInfoINTEL);
         }
 #endif
 #ifdef VK_EXT_pci_bus_info
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDevicePCIBusInfoPropertiesEXT);
         }
 #endif
 #ifdef VK_AMD_display_native_hdr
-        case VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD:
-        {
+        case VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD: {
             return sizeof(VkDisplayNativeHdrSurfaceCapabilitiesAMD);
         }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD:
-        {
+        case VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD: {
             return sizeof(VkSwapchainDisplayNativeHdrCreateInfoAMD);
         }
 #endif
 #ifdef VK_EXT_fragment_density_map
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT:
-        {
-            switch(rootType)
-            {
-                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2:
-                {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT: {
+            switch (rootType) {
+                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2: {
                     return sizeof(VkPhysicalDeviceFragmentDensityMapFeaturesEXT);
                     break;
                 }
-                case VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO:
-                {
+                case VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO: {
                     return sizeof(VkPhysicalDeviceFragmentDensityMapFeaturesEXT);
                     break;
                 }
-                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO:
-                {
+                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO: {
                     return sizeof(VkImportColorBufferGOOGLE);
                     break;
                 }
-                default:
-                {
+                default: {
                     return sizeof(VkPhysicalDeviceFragmentDensityMapFeaturesEXT);
                     break;
                 }
             }
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT:
-        {
-            switch(rootType)
-            {
-                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2:
-                {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT: {
+            switch (rootType) {
+                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2: {
                     return sizeof(VkPhysicalDeviceFragmentDensityMapPropertiesEXT);
                     break;
                 }
-                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO:
-                {
+                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO: {
                     return sizeof(VkImportPhysicalAddressGOOGLE);
                     break;
                 }
-                default:
-                {
+                default: {
                     return sizeof(VkPhysicalDeviceFragmentDensityMapPropertiesEXT);
                     break;
                 }
             }
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT:
-        {
-            switch(rootType)
-            {
-                case VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO:
-                {
+        case VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT: {
+            switch (rootType) {
+                case VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO: {
                     return sizeof(VkRenderPassFragmentDensityMapCreateInfoEXT);
                     break;
                 }
-                case VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2:
-                {
+                case VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2: {
                     return sizeof(VkRenderPassFragmentDensityMapCreateInfoEXT);
                     break;
                 }
-                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO:
-                {
+                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO: {
                     return sizeof(VkImportBufferGOOGLE);
                     break;
                 }
-                default:
-                {
+                default: {
                     return sizeof(VkRenderPassFragmentDensityMapCreateInfoEXT);
                     break;
                 }
@@ -3670,527 +3017,425 @@
         }
 #endif
 #ifdef VK_EXT_subgroup_size_control
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceSubgroupSizeControlFeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDeviceSubgroupSizeControlPropertiesEXT);
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT: {
             return sizeof(VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT);
         }
 #endif
 #ifdef VK_AMD_shader_core_properties2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD: {
             return sizeof(VkPhysicalDeviceShaderCoreProperties2AMD);
         }
 #endif
 #ifdef VK_AMD_device_coherent_memory
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD: {
             return sizeof(VkPhysicalDeviceCoherentMemoryFeaturesAMD);
         }
 #endif
 #ifdef VK_EXT_shader_image_atomic_int64
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT);
         }
 #endif
 #ifdef VK_EXT_memory_budget
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDeviceMemoryBudgetPropertiesEXT);
         }
 #endif
 #ifdef VK_EXT_memory_priority
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceMemoryPriorityFeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT: {
             return sizeof(VkMemoryPriorityAllocateInfoEXT);
         }
 #endif
 #ifdef VK_NV_dedicated_allocation_image_aliasing
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV: {
             return sizeof(VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV);
         }
 #endif
 #ifdef VK_EXT_buffer_device_address
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceBufferDeviceAddressFeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT: {
             return sizeof(VkBufferDeviceAddressCreateInfoEXT);
         }
 #endif
 #ifdef VK_EXT_validation_features
-        case VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT: {
             return sizeof(VkValidationFeaturesEXT);
         }
 #endif
 #ifdef VK_NV_cooperative_matrix
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV: {
             return sizeof(VkPhysicalDeviceCooperativeMatrixFeaturesNV);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV: {
             return sizeof(VkPhysicalDeviceCooperativeMatrixPropertiesNV);
         }
 #endif
 #ifdef VK_NV_coverage_reduction_mode
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV: {
             return sizeof(VkPhysicalDeviceCoverageReductionModeFeaturesNV);
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV: {
             return sizeof(VkPipelineCoverageReductionStateCreateInfoNV);
         }
 #endif
 #ifdef VK_EXT_fragment_shader_interlock
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT);
         }
 #endif
 #ifdef VK_EXT_ycbcr_image_arrays
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceYcbcrImageArraysFeaturesEXT);
         }
 #endif
 #ifdef VK_EXT_provoking_vertex
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceProvokingVertexFeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDeviceProvokingVertexPropertiesEXT);
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT: {
             return sizeof(VkPipelineRasterizationProvokingVertexStateCreateInfoEXT);
         }
 #endif
 #ifdef VK_EXT_full_screen_exclusive
-        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT: {
             return sizeof(VkSurfaceFullScreenExclusiveInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT:
-        {
+        case VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT: {
             return sizeof(VkSurfaceCapabilitiesFullScreenExclusiveEXT);
         }
-        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT: {
             return sizeof(VkSurfaceFullScreenExclusiveWin32InfoEXT);
         }
 #endif
 #ifdef VK_EXT_line_rasterization
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceLineRasterizationFeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDeviceLineRasterizationPropertiesEXT);
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT: {
             return sizeof(VkPipelineRasterizationLineStateCreateInfoEXT);
         }
 #endif
 #ifdef VK_EXT_shader_atomic_float
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceShaderAtomicFloatFeaturesEXT);
         }
 #endif
 #ifdef VK_EXT_index_type_uint8
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceIndexTypeUint8FeaturesEXT);
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceExtendedDynamicStateFeaturesEXT);
         }
 #endif
 #ifdef VK_EXT_shader_atomic_float2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT);
         }
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT);
         }
 #endif
 #ifdef VK_NV_device_generated_commands
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV: {
             return sizeof(VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV: {
             return sizeof(VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV);
         }
-        case VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV: {
             return sizeof(VkGraphicsPipelineShaderGroupsCreateInfoNV);
         }
 #endif
 #ifdef VK_NV_inherited_viewport_scissor
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV: {
             return sizeof(VkPhysicalDeviceInheritedViewportScissorFeaturesNV);
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_VIEWPORT_SCISSOR_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_VIEWPORT_SCISSOR_INFO_NV: {
             return sizeof(VkCommandBufferInheritanceViewportScissorInfoNV);
         }
 #endif
 #ifdef VK_EXT_texel_buffer_alignment
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT);
         }
 #endif
 #ifdef VK_QCOM_render_pass_transform
-        case VK_STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM:
-        {
+        case VK_STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM: {
             return sizeof(VkRenderPassTransformBeginInfoQCOM);
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM:
-        {
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM: {
             return sizeof(VkCommandBufferInheritanceRenderPassTransformInfoQCOM);
         }
 #endif
 #ifdef VK_EXT_device_memory_report
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceDeviceMemoryReportFeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT: {
             return sizeof(VkDeviceDeviceMemoryReportCreateInfoEXT);
         }
 #endif
 #ifdef VK_EXT_robustness2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceRobustness2FeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDeviceRobustness2PropertiesEXT);
         }
 #endif
 #ifdef VK_EXT_custom_border_color
-        case VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT: {
             return sizeof(VkSamplerCustomBorderColorCreateInfoEXT);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDeviceCustomBorderColorPropertiesEXT);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceCustomBorderColorFeaturesEXT);
         }
 #endif
 #ifdef VK_EXT_private_data
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT: {
             return sizeof(VkPhysicalDevicePrivateDataFeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT: {
             return sizeof(VkDevicePrivateDataCreateInfoEXT);
         }
 #endif
 #ifdef VK_EXT_pipeline_creation_cache_control
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT: {
             return sizeof(VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT);
         }
 #endif
 #ifdef VK_NV_device_diagnostics_config
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV: {
             return sizeof(VkPhysicalDeviceDiagnosticsConfigFeaturesNV);
         }
-        case VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV: {
             return sizeof(VkDeviceDiagnosticsConfigCreateInfoNV);
         }
 #endif
 #ifdef VK_NV_fragment_shading_rate_enums
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV: {
             return sizeof(VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV: {
             return sizeof(VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV);
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV: {
             return sizeof(VkPipelineFragmentShadingRateEnumStateCreateInfoNV);
         }
 #endif
 #ifdef VK_NV_ray_tracing_motion_blur
-        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_MOTION_TRIANGLES_DATA_NV:
-        {
+        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_MOTION_TRIANGLES_DATA_NV: {
             return sizeof(VkAccelerationStructureGeometryMotionTrianglesDataNV);
         }
-        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MOTION_INFO_NV:
-        {
+        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MOTION_INFO_NV: {
             return sizeof(VkAccelerationStructureMotionInfoNV);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV: {
             return sizeof(VkPhysicalDeviceRayTracingMotionBlurFeaturesNV);
         }
 #endif
 #ifdef VK_EXT_ycbcr_2plane_444_formats
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT);
         }
 #endif
 #ifdef VK_EXT_fragment_density_map2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceFragmentDensityMap2FeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDeviceFragmentDensityMap2PropertiesEXT);
         }
 #endif
 #ifdef VK_QCOM_rotated_copy_commands
-        case VK_STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM:
-        {
+        case VK_STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM: {
             return sizeof(VkCopyCommandTransformInfoQCOM);
         }
 #endif
 #ifdef VK_EXT_image_robustness
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceImageRobustnessFeaturesEXT);
         }
 #endif
 #ifdef VK_EXT_4444_formats
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT: {
             return sizeof(VkPhysicalDevice4444FormatsFeaturesEXT);
         }
 #endif
 #ifdef VK_EXT_rgba10x6_formats
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT);
         }
 #endif
 #ifdef VK_VALVE_mutable_descriptor_type
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE: {
             return sizeof(VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE);
         }
-        case VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE:
-        {
+        case VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE: {
             return sizeof(VkMutableDescriptorTypeCreateInfoVALVE);
         }
 #endif
 #ifdef VK_EXT_vertex_input_dynamic_state
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT);
         }
 #endif
 #ifdef VK_EXT_physical_device_drm
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRM_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRM_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDeviceDrmPropertiesEXT);
         }
 #endif
 #ifdef VK_EXT_primitive_topology_list_restart
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT: {
             return sizeof(VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT);
         }
 #endif
 #ifdef VK_FUCHSIA_external_memory
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA:
-        {
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA: {
             return sizeof(VkImportMemoryZirconHandleInfoFUCHSIA);
         }
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA:
-        {
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA: {
             return sizeof(VkImportMemoryBufferCollectionFUCHSIA);
         }
-        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA:
-        {
+        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA: {
             return sizeof(VkBufferCollectionImageCreateInfoFUCHSIA);
         }
-        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_BUFFER_CREATE_INFO_FUCHSIA:
-        {
+        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_BUFFER_CREATE_INFO_FUCHSIA: {
             return sizeof(VkBufferCollectionBufferCreateInfoFUCHSIA);
         }
 #endif
 #ifdef VK_HUAWEI_subpass_shading
-        case VK_STRUCTURE_TYPE_SUBPASS_SHADING_PIPELINE_CREATE_INFO_HUAWEI:
-        {
+        case VK_STRUCTURE_TYPE_SUBPASS_SHADING_PIPELINE_CREATE_INFO_HUAWEI: {
             return sizeof(VkSubpassShadingPipelineCreateInfoHUAWEI);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI: {
             return sizeof(VkPhysicalDeviceSubpassShadingFeaturesHUAWEI);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_PROPERTIES_HUAWEI:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_PROPERTIES_HUAWEI: {
             return sizeof(VkPhysicalDeviceSubpassShadingPropertiesHUAWEI);
         }
 #endif
 #ifdef VK_HUAWEI_invocation_mask
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI: {
             return sizeof(VkPhysicalDeviceInvocationMaskFeaturesHUAWEI);
         }
 #endif
 #ifdef VK_NV_external_memory_rdma
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV: {
             return sizeof(VkPhysicalDeviceExternalMemoryRDMAFeaturesNV);
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceExtendedDynamicState2FeaturesEXT);
         }
 #endif
 #ifdef VK_EXT_color_write_enable
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceColorWriteEnableFeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_WRITE_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_WRITE_CREATE_INFO_EXT: {
             return sizeof(VkPipelineColorWriteCreateInfoEXT);
         }
 #endif
 #ifdef VK_GOOGLE_gfxstream
-        case VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE:
-        {
+        case VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE: {
             return sizeof(VkImportColorBufferGOOGLE);
         }
-        case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE:
-        {
+        case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE: {
             return sizeof(VkImportBufferGOOGLE);
         }
-        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE:
-        {
+        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE: {
             return sizeof(VkImportPhysicalAddressGOOGLE);
         }
 #endif
 #ifdef VK_EXT_global_priority_query
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_EXT: {
             return sizeof(VkQueueFamilyGlobalPriorityPropertiesEXT);
         }
 #endif
 #ifdef VK_EXT_multi_draw
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceMultiDrawFeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT: {
             return sizeof(VkPhysicalDeviceMultiDrawPropertiesEXT);
         }
 #endif
 #ifdef VK_EXT_border_color_swizzle
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceBorderColorSwizzleFeaturesEXT);
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_BORDER_COLOR_COMPONENT_MAPPING_CREATE_INFO_EXT:
-        {
+        case VK_STRUCTURE_TYPE_SAMPLER_BORDER_COLOR_COMPONENT_MAPPING_CREATE_INFO_EXT: {
             return sizeof(VkSamplerBorderColorComponentMappingCreateInfoEXT);
         }
 #endif
 #ifdef VK_EXT_pageable_device_local_memory
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT: {
             return sizeof(VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT);
         }
 #endif
 #ifdef VK_KHR_acceleration_structure
-        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR:
-        {
+        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR: {
             return sizeof(VkWriteDescriptorSetAccelerationStructureKHR);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR: {
             return sizeof(VkPhysicalDeviceAccelerationStructureFeaturesKHR);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR: {
             return sizeof(VkPhysicalDeviceAccelerationStructurePropertiesKHR);
         }
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR: {
             return sizeof(VkPhysicalDeviceRayTracingPipelineFeaturesKHR);
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR: {
             return sizeof(VkPhysicalDeviceRayTracingPipelinePropertiesKHR);
         }
 #endif
 #ifdef VK_KHR_ray_query
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR:
-        {
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR: {
             return sizeof(VkPhysicalDeviceRayQueryFeaturesKHR);
         }
 #endif
-        default:
-        {
+        default: {
             return (size_t)0;
         }
     }
 }
 
-
-} // namespace goldfish_vk
+}  // namespace goldfish_vk
diff --git a/stream-servers/vulkan/cereal/common/goldfish_vk_extension_structs.h b/stream-servers/vulkan/cereal/common/goldfish_vk_extension_structs.h
index a3d3571..a3f7aea 100644
--- a/stream-servers/vulkan/cereal/common/goldfish_vk_extension_structs.h
+++ b/stream-servers/vulkan/cereal/common/goldfish_vk_extension_structs.h
@@ -14,32 +14,34 @@
 // limitations under the License.
 
 // Autogenerated module goldfish_vk_extension_structs
-// (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
+// (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml
+// cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
 // VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
 // VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+//
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o
+// $CEREAL_OUTPUT_DIR
+//
 #pragma once
 #include <vulkan/vulkan.h>
-#include "vulkan_gfxstream.h"
 
 #include "goldfish_vk_private_defs.h"
+#include "vulkan_gfxstream.h"
 
 namespace goldfish_vk {
-uint32_t goldfish_vk_struct_type(
-    const void* structExtension);
+uint32_t goldfish_vk_struct_type(const void* structExtension);
 
-size_t goldfish_vk_extension_struct_size(
-    VkStructureType rootType,
-    const void* structExtension);
+size_t goldfish_vk_extension_struct_size(VkStructureType rootType, const void* structExtension);
 
-size_t goldfish_vk_extension_struct_size_with_stream_features(
-    uint32_t streamFeatures,
-    VkStructureType rootType,
-    const void* structExtension);
+size_t goldfish_vk_extension_struct_size_with_stream_features(uint32_t streamFeatures,
+                                                              VkStructureType rootType,
+                                                              const void* structExtension);
 
 #ifdef VK_VERSION_1_0
 #endif
@@ -584,4 +586,4 @@
 #ifdef VK_KHR_ray_query
 #endif
 
-} // namespace goldfish_vk
+}  // namespace goldfish_vk
diff --git a/stream-servers/vulkan/cereal/common/goldfish_vk_handlemap.cpp b/stream-servers/vulkan/cereal/common/goldfish_vk_handlemap.cpp
index ea17d9d..7aa4b31 100644
--- a/stream-servers/vulkan/cereal/common/goldfish_vk_handlemap.cpp
+++ b/stream-servers/vulkan/cereal/common/goldfish_vk_handlemap.cpp
@@ -14,473 +14,347 @@
 // limitations under the License.
 
 // Autogenerated module goldfish_vk_handlemap
-// (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
+// (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal
+// -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
 // VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
 // VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+//
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o
+// $CEREAL_OUTPUT_DIR
+//
 
 #include "goldfish_vk_handlemap.h"
 
+#include <string.h>
 
 #include "goldfish_vk_extension_structs.h"
 #include "goldfish_vk_private_defs.h"
-#include <string.h>
-
 
 namespace goldfish_vk {
 
-void handlemap_extension_struct(
-    VulkanHandleMapping* handlemap,
-    void* structExtension_out);
+void handlemap_extension_struct(VulkanHandleMapping* handlemap, void* structExtension_out);
 
 #ifdef VK_VERSION_1_0
-void handlemap_VkExtent2D(
-    VulkanHandleMapping* handlemap,
-    VkExtent2D* toMap)
-{
+void handlemap_VkExtent2D(VulkanHandleMapping* handlemap, VkExtent2D* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkExtent3D(
-    VulkanHandleMapping* handlemap,
-    VkExtent3D* toMap)
-{
+void handlemap_VkExtent3D(VulkanHandleMapping* handlemap, VkExtent3D* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkOffset2D(
-    VulkanHandleMapping* handlemap,
-    VkOffset2D* toMap)
-{
+void handlemap_VkOffset2D(VulkanHandleMapping* handlemap, VkOffset2D* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkOffset3D(
-    VulkanHandleMapping* handlemap,
-    VkOffset3D* toMap)
-{
+void handlemap_VkOffset3D(VulkanHandleMapping* handlemap, VkOffset3D* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkRect2D(
-    VulkanHandleMapping* handlemap,
-    VkRect2D* toMap)
-{
+void handlemap_VkRect2D(VulkanHandleMapping* handlemap, VkRect2D* toMap) {
     (void)handlemap;
     (void)toMap;
     handlemap_VkOffset2D(handlemap, (VkOffset2D*)(&toMap->offset));
     handlemap_VkExtent2D(handlemap, (VkExtent2D*)(&toMap->extent));
 }
 
-void handlemap_VkBaseInStructure(
-    VulkanHandleMapping* handlemap,
-    VkBaseInStructure* toMap)
-{
+void handlemap_VkBaseInStructure(VulkanHandleMapping* handlemap, VkBaseInStructure* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkBaseOutStructure(
-    VulkanHandleMapping* handlemap,
-    VkBaseOutStructure* toMap)
-{
+void handlemap_VkBaseOutStructure(VulkanHandleMapping* handlemap, VkBaseOutStructure* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkBufferMemoryBarrier(
-    VulkanHandleMapping* handlemap,
-    VkBufferMemoryBarrier* toMap)
-{
+void handlemap_VkBufferMemoryBarrier(VulkanHandleMapping* handlemap, VkBufferMemoryBarrier* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkBuffer((VkBuffer*)&toMap->buffer);
 }
 
-void handlemap_VkDispatchIndirectCommand(
-    VulkanHandleMapping* handlemap,
-    VkDispatchIndirectCommand* toMap)
-{
+void handlemap_VkDispatchIndirectCommand(VulkanHandleMapping* handlemap,
+                                         VkDispatchIndirectCommand* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkDrawIndexedIndirectCommand(
-    VulkanHandleMapping* handlemap,
-    VkDrawIndexedIndirectCommand* toMap)
-{
+void handlemap_VkDrawIndexedIndirectCommand(VulkanHandleMapping* handlemap,
+                                            VkDrawIndexedIndirectCommand* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkDrawIndirectCommand(
-    VulkanHandleMapping* handlemap,
-    VkDrawIndirectCommand* toMap)
-{
+void handlemap_VkDrawIndirectCommand(VulkanHandleMapping* handlemap, VkDrawIndirectCommand* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkImageSubresourceRange(
-    VulkanHandleMapping* handlemap,
-    VkImageSubresourceRange* toMap)
-{
+void handlemap_VkImageSubresourceRange(VulkanHandleMapping* handlemap,
+                                       VkImageSubresourceRange* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkImageMemoryBarrier(
-    VulkanHandleMapping* handlemap,
-    VkImageMemoryBarrier* toMap)
-{
+void handlemap_VkImageMemoryBarrier(VulkanHandleMapping* handlemap, VkImageMemoryBarrier* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkImage((VkImage*)&toMap->image);
-    handlemap_VkImageSubresourceRange(handlemap, (VkImageSubresourceRange*)(&toMap->subresourceRange));
+    handlemap_VkImageSubresourceRange(handlemap,
+                                      (VkImageSubresourceRange*)(&toMap->subresourceRange));
 }
 
-void handlemap_VkMemoryBarrier(
-    VulkanHandleMapping* handlemap,
-    VkMemoryBarrier* toMap)
-{
+void handlemap_VkMemoryBarrier(VulkanHandleMapping* handlemap, VkMemoryBarrier* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkPipelineCacheHeaderVersionOne(
-    VulkanHandleMapping* handlemap,
-    VkPipelineCacheHeaderVersionOne* toMap)
-{
+void handlemap_VkPipelineCacheHeaderVersionOne(VulkanHandleMapping* handlemap,
+                                               VkPipelineCacheHeaderVersionOne* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkAllocationCallbacks(
-    VulkanHandleMapping* handlemap,
-    VkAllocationCallbacks* toMap)
-{
+void handlemap_VkAllocationCallbacks(VulkanHandleMapping* handlemap, VkAllocationCallbacks* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkApplicationInfo(
-    VulkanHandleMapping* handlemap,
-    VkApplicationInfo* toMap)
-{
+void handlemap_VkApplicationInfo(VulkanHandleMapping* handlemap, VkApplicationInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkFormatProperties(
-    VulkanHandleMapping* handlemap,
-    VkFormatProperties* toMap)
-{
+void handlemap_VkFormatProperties(VulkanHandleMapping* handlemap, VkFormatProperties* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkImageFormatProperties(
-    VulkanHandleMapping* handlemap,
-    VkImageFormatProperties* toMap)
-{
+void handlemap_VkImageFormatProperties(VulkanHandleMapping* handlemap,
+                                       VkImageFormatProperties* toMap) {
     (void)handlemap;
     (void)toMap;
     handlemap_VkExtent3D(handlemap, (VkExtent3D*)(&toMap->maxExtent));
 }
 
-void handlemap_VkInstanceCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkInstanceCreateInfo* toMap)
-{
+void handlemap_VkInstanceCreateInfo(VulkanHandleMapping* handlemap, VkInstanceCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap->pApplicationInfo)
-    {
+    if (toMap->pApplicationInfo) {
         handlemap_VkApplicationInfo(handlemap, (VkApplicationInfo*)(toMap->pApplicationInfo));
     }
 }
 
-void handlemap_VkMemoryHeap(
-    VulkanHandleMapping* handlemap,
-    VkMemoryHeap* toMap)
-{
+void handlemap_VkMemoryHeap(VulkanHandleMapping* handlemap, VkMemoryHeap* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkMemoryType(
-    VulkanHandleMapping* handlemap,
-    VkMemoryType* toMap)
-{
+void handlemap_VkMemoryType(VulkanHandleMapping* handlemap, VkMemoryType* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkPhysicalDeviceFeatures(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceFeatures* toMap)
-{
+void handlemap_VkPhysicalDeviceFeatures(VulkanHandleMapping* handlemap,
+                                        VkPhysicalDeviceFeatures* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkPhysicalDeviceLimits(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceLimits* toMap)
-{
+void handlemap_VkPhysicalDeviceLimits(VulkanHandleMapping* handlemap,
+                                      VkPhysicalDeviceLimits* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkPhysicalDeviceMemoryProperties(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceMemoryProperties* toMap)
-{
+void handlemap_VkPhysicalDeviceMemoryProperties(VulkanHandleMapping* handlemap,
+                                                VkPhysicalDeviceMemoryProperties* toMap) {
     (void)handlemap;
     (void)toMap;
-    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_TYPES; ++i)
-    {
+    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_TYPES; ++i) {
         handlemap_VkMemoryType(handlemap, (VkMemoryType*)(toMap->memoryTypes + i));
     }
-    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_HEAPS; ++i)
-    {
+    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_HEAPS; ++i) {
         handlemap_VkMemoryHeap(handlemap, (VkMemoryHeap*)(toMap->memoryHeaps + i));
     }
 }
 
-void handlemap_VkPhysicalDeviceSparseProperties(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceSparseProperties* toMap)
-{
+void handlemap_VkPhysicalDeviceSparseProperties(VulkanHandleMapping* handlemap,
+                                                VkPhysicalDeviceSparseProperties* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkPhysicalDeviceProperties(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceProperties* toMap)
-{
+void handlemap_VkPhysicalDeviceProperties(VulkanHandleMapping* handlemap,
+                                          VkPhysicalDeviceProperties* toMap) {
     (void)handlemap;
     (void)toMap;
     handlemap_VkPhysicalDeviceLimits(handlemap, (VkPhysicalDeviceLimits*)(&toMap->limits));
-    handlemap_VkPhysicalDeviceSparseProperties(handlemap, (VkPhysicalDeviceSparseProperties*)(&toMap->sparseProperties));
+    handlemap_VkPhysicalDeviceSparseProperties(
+        handlemap, (VkPhysicalDeviceSparseProperties*)(&toMap->sparseProperties));
 }
 
-void handlemap_VkQueueFamilyProperties(
-    VulkanHandleMapping* handlemap,
-    VkQueueFamilyProperties* toMap)
-{
+void handlemap_VkQueueFamilyProperties(VulkanHandleMapping* handlemap,
+                                       VkQueueFamilyProperties* toMap) {
     (void)handlemap;
     (void)toMap;
     handlemap_VkExtent3D(handlemap, (VkExtent3D*)(&toMap->minImageTransferGranularity));
 }
 
-void handlemap_VkDeviceQueueCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkDeviceQueueCreateInfo* toMap)
-{
+void handlemap_VkDeviceQueueCreateInfo(VulkanHandleMapping* handlemap,
+                                       VkDeviceQueueCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkDeviceCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkDeviceCreateInfo* toMap)
-{
+void handlemap_VkDeviceCreateInfo(VulkanHandleMapping* handlemap, VkDeviceCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pQueueCreateInfos)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->queueCreateInfoCount; ++i)
-            {
-                handlemap_VkDeviceQueueCreateInfo(handlemap, (VkDeviceQueueCreateInfo*)(toMap->pQueueCreateInfos + i));
+    if (toMap) {
+        if (toMap->pQueueCreateInfos) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->queueCreateInfoCount; ++i) {
+                handlemap_VkDeviceQueueCreateInfo(
+                    handlemap, (VkDeviceQueueCreateInfo*)(toMap->pQueueCreateInfos + i));
             }
         }
     }
-    if (toMap->pEnabledFeatures)
-    {
-        handlemap_VkPhysicalDeviceFeatures(handlemap, (VkPhysicalDeviceFeatures*)(toMap->pEnabledFeatures));
+    if (toMap->pEnabledFeatures) {
+        handlemap_VkPhysicalDeviceFeatures(handlemap,
+                                           (VkPhysicalDeviceFeatures*)(toMap->pEnabledFeatures));
     }
 }
 
-void handlemap_VkExtensionProperties(
-    VulkanHandleMapping* handlemap,
-    VkExtensionProperties* toMap)
-{
+void handlemap_VkExtensionProperties(VulkanHandleMapping* handlemap, VkExtensionProperties* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkLayerProperties(
-    VulkanHandleMapping* handlemap,
-    VkLayerProperties* toMap)
-{
+void handlemap_VkLayerProperties(VulkanHandleMapping* handlemap, VkLayerProperties* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkSubmitInfo(
-    VulkanHandleMapping* handlemap,
-    VkSubmitInfo* toMap)
-{
+void handlemap_VkSubmitInfo(VulkanHandleMapping* handlemap, VkSubmitInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap->pWaitSemaphores)
-    {
-        handlemap->mapHandles_VkSemaphore((VkSemaphore*)toMap->pWaitSemaphores, toMap->waitSemaphoreCount);
+    if (toMap->pWaitSemaphores) {
+        handlemap->mapHandles_VkSemaphore((VkSemaphore*)toMap->pWaitSemaphores,
+                                          toMap->waitSemaphoreCount);
     }
-    if (toMap->pCommandBuffers)
-    {
-        handlemap->mapHandles_VkCommandBuffer((VkCommandBuffer*)toMap->pCommandBuffers, toMap->commandBufferCount);
+    if (toMap->pCommandBuffers) {
+        handlemap->mapHandles_VkCommandBuffer((VkCommandBuffer*)toMap->pCommandBuffers,
+                                              toMap->commandBufferCount);
     }
-    if (toMap->pSignalSemaphores)
-    {
-        handlemap->mapHandles_VkSemaphore((VkSemaphore*)toMap->pSignalSemaphores, toMap->signalSemaphoreCount);
+    if (toMap->pSignalSemaphores) {
+        handlemap->mapHandles_VkSemaphore((VkSemaphore*)toMap->pSignalSemaphores,
+                                          toMap->signalSemaphoreCount);
     }
 }
 
-void handlemap_VkMappedMemoryRange(
-    VulkanHandleMapping* handlemap,
-    VkMappedMemoryRange* toMap)
-{
+void handlemap_VkMappedMemoryRange(VulkanHandleMapping* handlemap, VkMappedMemoryRange* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkDeviceMemory((VkDeviceMemory*)&toMap->memory);
 }
 
-void handlemap_VkMemoryAllocateInfo(
-    VulkanHandleMapping* handlemap,
-    VkMemoryAllocateInfo* toMap)
-{
+void handlemap_VkMemoryAllocateInfo(VulkanHandleMapping* handlemap, VkMemoryAllocateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkMemoryRequirements(
-    VulkanHandleMapping* handlemap,
-    VkMemoryRequirements* toMap)
-{
+void handlemap_VkMemoryRequirements(VulkanHandleMapping* handlemap, VkMemoryRequirements* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkSparseMemoryBind(
-    VulkanHandleMapping* handlemap,
-    VkSparseMemoryBind* toMap)
-{
+void handlemap_VkSparseMemoryBind(VulkanHandleMapping* handlemap, VkSparseMemoryBind* toMap) {
     (void)handlemap;
     (void)toMap;
     handlemap->mapHandles_VkDeviceMemory((VkDeviceMemory*)&toMap->memory);
 }
 
-void handlemap_VkSparseBufferMemoryBindInfo(
-    VulkanHandleMapping* handlemap,
-    VkSparseBufferMemoryBindInfo* toMap)
-{
+void handlemap_VkSparseBufferMemoryBindInfo(VulkanHandleMapping* handlemap,
+                                            VkSparseBufferMemoryBindInfo* toMap) {
     (void)handlemap;
     (void)toMap;
     handlemap->mapHandles_VkBuffer((VkBuffer*)&toMap->buffer);
-    if (toMap)
-    {
-        if (toMap->pBinds)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->bindCount; ++i)
-            {
+    if (toMap) {
+        if (toMap->pBinds) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->bindCount; ++i) {
                 handlemap_VkSparseMemoryBind(handlemap, (VkSparseMemoryBind*)(toMap->pBinds + i));
             }
         }
     }
 }
 
-void handlemap_VkSparseImageOpaqueMemoryBindInfo(
-    VulkanHandleMapping* handlemap,
-    VkSparseImageOpaqueMemoryBindInfo* toMap)
-{
+void handlemap_VkSparseImageOpaqueMemoryBindInfo(VulkanHandleMapping* handlemap,
+                                                 VkSparseImageOpaqueMemoryBindInfo* toMap) {
     (void)handlemap;
     (void)toMap;
     handlemap->mapHandles_VkImage((VkImage*)&toMap->image);
-    if (toMap)
-    {
-        if (toMap->pBinds)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->bindCount; ++i)
-            {
+    if (toMap) {
+        if (toMap->pBinds) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->bindCount; ++i) {
                 handlemap_VkSparseMemoryBind(handlemap, (VkSparseMemoryBind*)(toMap->pBinds + i));
             }
         }
     }
 }
 
-void handlemap_VkImageSubresource(
-    VulkanHandleMapping* handlemap,
-    VkImageSubresource* toMap)
-{
+void handlemap_VkImageSubresource(VulkanHandleMapping* handlemap, VkImageSubresource* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkSparseImageMemoryBind(
-    VulkanHandleMapping* handlemap,
-    VkSparseImageMemoryBind* toMap)
-{
+void handlemap_VkSparseImageMemoryBind(VulkanHandleMapping* handlemap,
+                                       VkSparseImageMemoryBind* toMap) {
     (void)handlemap;
     (void)toMap;
     handlemap_VkImageSubresource(handlemap, (VkImageSubresource*)(&toMap->subresource));
@@ -489,398 +363,300 @@
     handlemap->mapHandles_VkDeviceMemory((VkDeviceMemory*)&toMap->memory);
 }
 
-void handlemap_VkSparseImageMemoryBindInfo(
-    VulkanHandleMapping* handlemap,
-    VkSparseImageMemoryBindInfo* toMap)
-{
+void handlemap_VkSparseImageMemoryBindInfo(VulkanHandleMapping* handlemap,
+                                           VkSparseImageMemoryBindInfo* toMap) {
     (void)handlemap;
     (void)toMap;
     handlemap->mapHandles_VkImage((VkImage*)&toMap->image);
-    if (toMap)
-    {
-        if (toMap->pBinds)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->bindCount; ++i)
-            {
-                handlemap_VkSparseImageMemoryBind(handlemap, (VkSparseImageMemoryBind*)(toMap->pBinds + i));
+    if (toMap) {
+        if (toMap->pBinds) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->bindCount; ++i) {
+                handlemap_VkSparseImageMemoryBind(handlemap,
+                                                  (VkSparseImageMemoryBind*)(toMap->pBinds + i));
             }
         }
     }
 }
 
-void handlemap_VkBindSparseInfo(
-    VulkanHandleMapping* handlemap,
-    VkBindSparseInfo* toMap)
-{
+void handlemap_VkBindSparseInfo(VulkanHandleMapping* handlemap, VkBindSparseInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap->pWaitSemaphores)
-    {
-        handlemap->mapHandles_VkSemaphore((VkSemaphore*)toMap->pWaitSemaphores, toMap->waitSemaphoreCount);
+    if (toMap->pWaitSemaphores) {
+        handlemap->mapHandles_VkSemaphore((VkSemaphore*)toMap->pWaitSemaphores,
+                                          toMap->waitSemaphoreCount);
     }
-    if (toMap)
-    {
-        if (toMap->pBufferBinds)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->bufferBindCount; ++i)
-            {
-                handlemap_VkSparseBufferMemoryBindInfo(handlemap, (VkSparseBufferMemoryBindInfo*)(toMap->pBufferBinds + i));
+    if (toMap) {
+        if (toMap->pBufferBinds) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->bufferBindCount; ++i) {
+                handlemap_VkSparseBufferMemoryBindInfo(
+                    handlemap, (VkSparseBufferMemoryBindInfo*)(toMap->pBufferBinds + i));
             }
         }
     }
-    if (toMap)
-    {
-        if (toMap->pImageOpaqueBinds)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->imageOpaqueBindCount; ++i)
-            {
-                handlemap_VkSparseImageOpaqueMemoryBindInfo(handlemap, (VkSparseImageOpaqueMemoryBindInfo*)(toMap->pImageOpaqueBinds + i));
+    if (toMap) {
+        if (toMap->pImageOpaqueBinds) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->imageOpaqueBindCount; ++i) {
+                handlemap_VkSparseImageOpaqueMemoryBindInfo(
+                    handlemap, (VkSparseImageOpaqueMemoryBindInfo*)(toMap->pImageOpaqueBinds + i));
             }
         }
     }
-    if (toMap)
-    {
-        if (toMap->pImageBinds)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->imageBindCount; ++i)
-            {
-                handlemap_VkSparseImageMemoryBindInfo(handlemap, (VkSparseImageMemoryBindInfo*)(toMap->pImageBinds + i));
+    if (toMap) {
+        if (toMap->pImageBinds) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->imageBindCount; ++i) {
+                handlemap_VkSparseImageMemoryBindInfo(
+                    handlemap, (VkSparseImageMemoryBindInfo*)(toMap->pImageBinds + i));
             }
         }
     }
-    if (toMap->pSignalSemaphores)
-    {
-        handlemap->mapHandles_VkSemaphore((VkSemaphore*)toMap->pSignalSemaphores, toMap->signalSemaphoreCount);
+    if (toMap->pSignalSemaphores) {
+        handlemap->mapHandles_VkSemaphore((VkSemaphore*)toMap->pSignalSemaphores,
+                                          toMap->signalSemaphoreCount);
     }
 }
 
-void handlemap_VkSparseImageFormatProperties(
-    VulkanHandleMapping* handlemap,
-    VkSparseImageFormatProperties* toMap)
-{
+void handlemap_VkSparseImageFormatProperties(VulkanHandleMapping* handlemap,
+                                             VkSparseImageFormatProperties* toMap) {
     (void)handlemap;
     (void)toMap;
     handlemap_VkExtent3D(handlemap, (VkExtent3D*)(&toMap->imageGranularity));
 }
 
-void handlemap_VkSparseImageMemoryRequirements(
-    VulkanHandleMapping* handlemap,
-    VkSparseImageMemoryRequirements* toMap)
-{
+void handlemap_VkSparseImageMemoryRequirements(VulkanHandleMapping* handlemap,
+                                               VkSparseImageMemoryRequirements* toMap) {
     (void)handlemap;
     (void)toMap;
-    handlemap_VkSparseImageFormatProperties(handlemap, (VkSparseImageFormatProperties*)(&toMap->formatProperties));
+    handlemap_VkSparseImageFormatProperties(
+        handlemap, (VkSparseImageFormatProperties*)(&toMap->formatProperties));
 }
 
-void handlemap_VkFenceCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkFenceCreateInfo* toMap)
-{
+void handlemap_VkFenceCreateInfo(VulkanHandleMapping* handlemap, VkFenceCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkSemaphoreCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkSemaphoreCreateInfo* toMap)
-{
+void handlemap_VkSemaphoreCreateInfo(VulkanHandleMapping* handlemap, VkSemaphoreCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkEventCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkEventCreateInfo* toMap)
-{
+void handlemap_VkEventCreateInfo(VulkanHandleMapping* handlemap, VkEventCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkQueryPoolCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkQueryPoolCreateInfo* toMap)
-{
+void handlemap_VkQueryPoolCreateInfo(VulkanHandleMapping* handlemap, VkQueryPoolCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkBufferCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkBufferCreateInfo* toMap)
-{
+void handlemap_VkBufferCreateInfo(VulkanHandleMapping* handlemap, VkBufferCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkBufferViewCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkBufferViewCreateInfo* toMap)
-{
+void handlemap_VkBufferViewCreateInfo(VulkanHandleMapping* handlemap,
+                                      VkBufferViewCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkBuffer((VkBuffer*)&toMap->buffer);
 }
 
-void handlemap_VkImageCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkImageCreateInfo* toMap)
-{
+void handlemap_VkImageCreateInfo(VulkanHandleMapping* handlemap, VkImageCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap_VkExtent3D(handlemap, (VkExtent3D*)(&toMap->extent));
 }
 
-void handlemap_VkSubresourceLayout(
-    VulkanHandleMapping* handlemap,
-    VkSubresourceLayout* toMap)
-{
+void handlemap_VkSubresourceLayout(VulkanHandleMapping* handlemap, VkSubresourceLayout* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkComponentMapping(
-    VulkanHandleMapping* handlemap,
-    VkComponentMapping* toMap)
-{
+void handlemap_VkComponentMapping(VulkanHandleMapping* handlemap, VkComponentMapping* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkImageViewCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkImageViewCreateInfo* toMap)
-{
+void handlemap_VkImageViewCreateInfo(VulkanHandleMapping* handlemap, VkImageViewCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkImage((VkImage*)&toMap->image);
     handlemap_VkComponentMapping(handlemap, (VkComponentMapping*)(&toMap->components));
-    handlemap_VkImageSubresourceRange(handlemap, (VkImageSubresourceRange*)(&toMap->subresourceRange));
+    handlemap_VkImageSubresourceRange(handlemap,
+                                      (VkImageSubresourceRange*)(&toMap->subresourceRange));
 }
 
-void handlemap_VkShaderModuleCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkShaderModuleCreateInfo* toMap)
-{
+void handlemap_VkShaderModuleCreateInfo(VulkanHandleMapping* handlemap,
+                                        VkShaderModuleCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkPipelineCacheCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkPipelineCacheCreateInfo* toMap)
-{
+void handlemap_VkPipelineCacheCreateInfo(VulkanHandleMapping* handlemap,
+                                         VkPipelineCacheCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkSpecializationMapEntry(
-    VulkanHandleMapping* handlemap,
-    VkSpecializationMapEntry* toMap)
-{
+void handlemap_VkSpecializationMapEntry(VulkanHandleMapping* handlemap,
+                                        VkSpecializationMapEntry* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkSpecializationInfo(
-    VulkanHandleMapping* handlemap,
-    VkSpecializationInfo* toMap)
-{
+void handlemap_VkSpecializationInfo(VulkanHandleMapping* handlemap, VkSpecializationInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap)
-    {
-        if (toMap->pMapEntries)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->mapEntryCount; ++i)
-            {
-                handlemap_VkSpecializationMapEntry(handlemap, (VkSpecializationMapEntry*)(toMap->pMapEntries + i));
+    if (toMap) {
+        if (toMap->pMapEntries) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->mapEntryCount; ++i) {
+                handlemap_VkSpecializationMapEntry(
+                    handlemap, (VkSpecializationMapEntry*)(toMap->pMapEntries + i));
             }
         }
     }
 }
 
-void handlemap_VkPipelineShaderStageCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkPipelineShaderStageCreateInfo* toMap)
-{
+void handlemap_VkPipelineShaderStageCreateInfo(VulkanHandleMapping* handlemap,
+                                               VkPipelineShaderStageCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkShaderModule((VkShaderModule*)&toMap->module);
-    if (toMap->pSpecializationInfo)
-    {
-        handlemap_VkSpecializationInfo(handlemap, (VkSpecializationInfo*)(toMap->pSpecializationInfo));
+    if (toMap->pSpecializationInfo) {
+        handlemap_VkSpecializationInfo(handlemap,
+                                       (VkSpecializationInfo*)(toMap->pSpecializationInfo));
     }
 }
 
-void handlemap_VkComputePipelineCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkComputePipelineCreateInfo* toMap)
-{
+void handlemap_VkComputePipelineCreateInfo(VulkanHandleMapping* handlemap,
+                                           VkComputePipelineCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap_VkPipelineShaderStageCreateInfo(handlemap, (VkPipelineShaderStageCreateInfo*)(&toMap->stage));
+    handlemap_VkPipelineShaderStageCreateInfo(handlemap,
+                                              (VkPipelineShaderStageCreateInfo*)(&toMap->stage));
     handlemap->mapHandles_VkPipelineLayout((VkPipelineLayout*)&toMap->layout);
     handlemap->mapHandles_VkPipeline((VkPipeline*)&toMap->basePipelineHandle);
 }
 
-void handlemap_VkVertexInputBindingDescription(
-    VulkanHandleMapping* handlemap,
-    VkVertexInputBindingDescription* toMap)
-{
+void handlemap_VkVertexInputBindingDescription(VulkanHandleMapping* handlemap,
+                                               VkVertexInputBindingDescription* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkVertexInputAttributeDescription(
-    VulkanHandleMapping* handlemap,
-    VkVertexInputAttributeDescription* toMap)
-{
+void handlemap_VkVertexInputAttributeDescription(VulkanHandleMapping* handlemap,
+                                                 VkVertexInputAttributeDescription* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkPipelineVertexInputStateCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkPipelineVertexInputStateCreateInfo* toMap)
-{
+void handlemap_VkPipelineVertexInputStateCreateInfo(VulkanHandleMapping* handlemap,
+                                                    VkPipelineVertexInputStateCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pVertexBindingDescriptions)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->vertexBindingDescriptionCount; ++i)
-            {
-                handlemap_VkVertexInputBindingDescription(handlemap, (VkVertexInputBindingDescription*)(toMap->pVertexBindingDescriptions + i));
+    if (toMap) {
+        if (toMap->pVertexBindingDescriptions) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->vertexBindingDescriptionCount; ++i) {
+                handlemap_VkVertexInputBindingDescription(
+                    handlemap,
+                    (VkVertexInputBindingDescription*)(toMap->pVertexBindingDescriptions + i));
             }
         }
     }
-    if (toMap)
-    {
-        if (toMap->pVertexAttributeDescriptions)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->vertexAttributeDescriptionCount; ++i)
-            {
-                handlemap_VkVertexInputAttributeDescription(handlemap, (VkVertexInputAttributeDescription*)(toMap->pVertexAttributeDescriptions + i));
+    if (toMap) {
+        if (toMap->pVertexAttributeDescriptions) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->vertexAttributeDescriptionCount; ++i) {
+                handlemap_VkVertexInputAttributeDescription(
+                    handlemap,
+                    (VkVertexInputAttributeDescription*)(toMap->pVertexAttributeDescriptions + i));
             }
         }
     }
 }
 
 void handlemap_VkPipelineInputAssemblyStateCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkPipelineInputAssemblyStateCreateInfo* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPipelineInputAssemblyStateCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkPipelineTessellationStateCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkPipelineTessellationStateCreateInfo* toMap)
-{
+void handlemap_VkPipelineTessellationStateCreateInfo(VulkanHandleMapping* handlemap,
+                                                     VkPipelineTessellationStateCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkViewport(
-    VulkanHandleMapping* handlemap,
-    VkViewport* toMap)
-{
+void handlemap_VkViewport(VulkanHandleMapping* handlemap, VkViewport* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkPipelineViewportStateCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkPipelineViewportStateCreateInfo* toMap)
-{
+void handlemap_VkPipelineViewportStateCreateInfo(VulkanHandleMapping* handlemap,
+                                                 VkPipelineViewportStateCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pViewports)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->viewportCount; ++i)
-            {
+    if (toMap) {
+        if (toMap->pViewports) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->viewportCount; ++i) {
                 handlemap_VkViewport(handlemap, (VkViewport*)(toMap->pViewports + i));
             }
         }
     }
-    if (toMap)
-    {
-        if (toMap->pScissors)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->scissorCount; ++i)
-            {
+    if (toMap) {
+        if (toMap->pScissors) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->scissorCount; ++i) {
                 handlemap_VkRect2D(handlemap, (VkRect2D*)(toMap->pScissors + i));
             }
         }
@@ -888,665 +664,518 @@
 }
 
 void handlemap_VkPipelineRasterizationStateCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkPipelineRasterizationStateCreateInfo* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPipelineRasterizationStateCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkPipelineMultisampleStateCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkPipelineMultisampleStateCreateInfo* toMap)
-{
+void handlemap_VkPipelineMultisampleStateCreateInfo(VulkanHandleMapping* handlemap,
+                                                    VkPipelineMultisampleStateCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkStencilOpState(
-    VulkanHandleMapping* handlemap,
-    VkStencilOpState* toMap)
-{
+void handlemap_VkStencilOpState(VulkanHandleMapping* handlemap, VkStencilOpState* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkPipelineDepthStencilStateCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkPipelineDepthStencilStateCreateInfo* toMap)
-{
+void handlemap_VkPipelineDepthStencilStateCreateInfo(VulkanHandleMapping* handlemap,
+                                                     VkPipelineDepthStencilStateCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap_VkStencilOpState(handlemap, (VkStencilOpState*)(&toMap->front));
     handlemap_VkStencilOpState(handlemap, (VkStencilOpState*)(&toMap->back));
 }
 
-void handlemap_VkPipelineColorBlendAttachmentState(
-    VulkanHandleMapping* handlemap,
-    VkPipelineColorBlendAttachmentState* toMap)
-{
+void handlemap_VkPipelineColorBlendAttachmentState(VulkanHandleMapping* handlemap,
+                                                   VkPipelineColorBlendAttachmentState* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkPipelineColorBlendStateCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkPipelineColorBlendStateCreateInfo* toMap)
-{
+void handlemap_VkPipelineColorBlendStateCreateInfo(VulkanHandleMapping* handlemap,
+                                                   VkPipelineColorBlendStateCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pAttachments)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->attachmentCount; ++i)
-            {
-                handlemap_VkPipelineColorBlendAttachmentState(handlemap, (VkPipelineColorBlendAttachmentState*)(toMap->pAttachments + i));
+    if (toMap) {
+        if (toMap->pAttachments) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->attachmentCount; ++i) {
+                handlemap_VkPipelineColorBlendAttachmentState(
+                    handlemap, (VkPipelineColorBlendAttachmentState*)(toMap->pAttachments + i));
             }
         }
     }
 }
 
-void handlemap_VkPipelineDynamicStateCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkPipelineDynamicStateCreateInfo* toMap)
-{
+void handlemap_VkPipelineDynamicStateCreateInfo(VulkanHandleMapping* handlemap,
+                                                VkPipelineDynamicStateCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkGraphicsPipelineCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkGraphicsPipelineCreateInfo* toMap)
-{
+void handlemap_VkGraphicsPipelineCreateInfo(VulkanHandleMapping* handlemap,
+                                            VkGraphicsPipelineCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pStages)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->stageCount; ++i)
-            {
-                handlemap_VkPipelineShaderStageCreateInfo(handlemap, (VkPipelineShaderStageCreateInfo*)(toMap->pStages + i));
+    if (toMap) {
+        if (toMap->pStages) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->stageCount; ++i) {
+                handlemap_VkPipelineShaderStageCreateInfo(
+                    handlemap, (VkPipelineShaderStageCreateInfo*)(toMap->pStages + i));
             }
         }
     }
-    if (toMap->pVertexInputState)
-    {
-        handlemap_VkPipelineVertexInputStateCreateInfo(handlemap, (VkPipelineVertexInputStateCreateInfo*)(toMap->pVertexInputState));
+    if (toMap->pVertexInputState) {
+        handlemap_VkPipelineVertexInputStateCreateInfo(
+            handlemap, (VkPipelineVertexInputStateCreateInfo*)(toMap->pVertexInputState));
     }
-    if (toMap->pInputAssemblyState)
-    {
-        handlemap_VkPipelineInputAssemblyStateCreateInfo(handlemap, (VkPipelineInputAssemblyStateCreateInfo*)(toMap->pInputAssemblyState));
+    if (toMap->pInputAssemblyState) {
+        handlemap_VkPipelineInputAssemblyStateCreateInfo(
+            handlemap, (VkPipelineInputAssemblyStateCreateInfo*)(toMap->pInputAssemblyState));
     }
-    if (toMap->pTessellationState)
-    {
-        handlemap_VkPipelineTessellationStateCreateInfo(handlemap, (VkPipelineTessellationStateCreateInfo*)(toMap->pTessellationState));
+    if (toMap->pTessellationState) {
+        handlemap_VkPipelineTessellationStateCreateInfo(
+            handlemap, (VkPipelineTessellationStateCreateInfo*)(toMap->pTessellationState));
     }
-    if (toMap->pViewportState)
-    {
-        handlemap_VkPipelineViewportStateCreateInfo(handlemap, (VkPipelineViewportStateCreateInfo*)(toMap->pViewportState));
+    if (toMap->pViewportState) {
+        handlemap_VkPipelineViewportStateCreateInfo(
+            handlemap, (VkPipelineViewportStateCreateInfo*)(toMap->pViewportState));
     }
-    if (toMap->pRasterizationState)
-    {
-        handlemap_VkPipelineRasterizationStateCreateInfo(handlemap, (VkPipelineRasterizationStateCreateInfo*)(toMap->pRasterizationState));
+    if (toMap->pRasterizationState) {
+        handlemap_VkPipelineRasterizationStateCreateInfo(
+            handlemap, (VkPipelineRasterizationStateCreateInfo*)(toMap->pRasterizationState));
     }
-    if (toMap->pMultisampleState)
-    {
-        handlemap_VkPipelineMultisampleStateCreateInfo(handlemap, (VkPipelineMultisampleStateCreateInfo*)(toMap->pMultisampleState));
+    if (toMap->pMultisampleState) {
+        handlemap_VkPipelineMultisampleStateCreateInfo(
+            handlemap, (VkPipelineMultisampleStateCreateInfo*)(toMap->pMultisampleState));
     }
-    if (toMap->pDepthStencilState)
-    {
-        handlemap_VkPipelineDepthStencilStateCreateInfo(handlemap, (VkPipelineDepthStencilStateCreateInfo*)(toMap->pDepthStencilState));
+    if (toMap->pDepthStencilState) {
+        handlemap_VkPipelineDepthStencilStateCreateInfo(
+            handlemap, (VkPipelineDepthStencilStateCreateInfo*)(toMap->pDepthStencilState));
     }
-    if (toMap->pColorBlendState)
-    {
-        handlemap_VkPipelineColorBlendStateCreateInfo(handlemap, (VkPipelineColorBlendStateCreateInfo*)(toMap->pColorBlendState));
+    if (toMap->pColorBlendState) {
+        handlemap_VkPipelineColorBlendStateCreateInfo(
+            handlemap, (VkPipelineColorBlendStateCreateInfo*)(toMap->pColorBlendState));
     }
-    if (toMap->pDynamicState)
-    {
-        handlemap_VkPipelineDynamicStateCreateInfo(handlemap, (VkPipelineDynamicStateCreateInfo*)(toMap->pDynamicState));
+    if (toMap->pDynamicState) {
+        handlemap_VkPipelineDynamicStateCreateInfo(
+            handlemap, (VkPipelineDynamicStateCreateInfo*)(toMap->pDynamicState));
     }
     handlemap->mapHandles_VkPipelineLayout((VkPipelineLayout*)&toMap->layout);
     handlemap->mapHandles_VkRenderPass((VkRenderPass*)&toMap->renderPass);
     handlemap->mapHandles_VkPipeline((VkPipeline*)&toMap->basePipelineHandle);
 }
 
-void handlemap_VkPushConstantRange(
-    VulkanHandleMapping* handlemap,
-    VkPushConstantRange* toMap)
-{
+void handlemap_VkPushConstantRange(VulkanHandleMapping* handlemap, VkPushConstantRange* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkPipelineLayoutCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkPipelineLayoutCreateInfo* toMap)
-{
+void handlemap_VkPipelineLayoutCreateInfo(VulkanHandleMapping* handlemap,
+                                          VkPipelineLayoutCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap->pSetLayouts)
-    {
-        handlemap->mapHandles_VkDescriptorSetLayout((VkDescriptorSetLayout*)toMap->pSetLayouts, toMap->setLayoutCount);
+    if (toMap->pSetLayouts) {
+        handlemap->mapHandles_VkDescriptorSetLayout((VkDescriptorSetLayout*)toMap->pSetLayouts,
+                                                    toMap->setLayoutCount);
     }
-    if (toMap)
-    {
-        if (toMap->pPushConstantRanges)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->pushConstantRangeCount; ++i)
-            {
-                handlemap_VkPushConstantRange(handlemap, (VkPushConstantRange*)(toMap->pPushConstantRanges + i));
+    if (toMap) {
+        if (toMap->pPushConstantRanges) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->pushConstantRangeCount; ++i) {
+                handlemap_VkPushConstantRange(
+                    handlemap, (VkPushConstantRange*)(toMap->pPushConstantRanges + i));
             }
         }
     }
 }
 
-void handlemap_VkSamplerCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkSamplerCreateInfo* toMap)
-{
+void handlemap_VkSamplerCreateInfo(VulkanHandleMapping* handlemap, VkSamplerCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkCopyDescriptorSet(
-    VulkanHandleMapping* handlemap,
-    VkCopyDescriptorSet* toMap)
-{
+void handlemap_VkCopyDescriptorSet(VulkanHandleMapping* handlemap, VkCopyDescriptorSet* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkDescriptorSet((VkDescriptorSet*)&toMap->srcSet);
     handlemap->mapHandles_VkDescriptorSet((VkDescriptorSet*)&toMap->dstSet);
 }
 
-void handlemap_VkDescriptorBufferInfo(
-    VulkanHandleMapping* handlemap,
-    VkDescriptorBufferInfo* toMap)
-{
+void handlemap_VkDescriptorBufferInfo(VulkanHandleMapping* handlemap,
+                                      VkDescriptorBufferInfo* toMap) {
     (void)handlemap;
     (void)toMap;
     handlemap->mapHandles_VkBuffer((VkBuffer*)&toMap->buffer);
 }
 
-void handlemap_VkDescriptorImageInfo(
-    VulkanHandleMapping* handlemap,
-    VkDescriptorImageInfo* toMap)
-{
+void handlemap_VkDescriptorImageInfo(VulkanHandleMapping* handlemap, VkDescriptorImageInfo* toMap) {
     (void)handlemap;
     (void)toMap;
     handlemap->mapHandles_VkSampler((VkSampler*)&toMap->sampler);
     handlemap->mapHandles_VkImageView((VkImageView*)&toMap->imageView);
 }
 
-void handlemap_VkDescriptorPoolSize(
-    VulkanHandleMapping* handlemap,
-    VkDescriptorPoolSize* toMap)
-{
+void handlemap_VkDescriptorPoolSize(VulkanHandleMapping* handlemap, VkDescriptorPoolSize* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkDescriptorPoolCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkDescriptorPoolCreateInfo* toMap)
-{
+void handlemap_VkDescriptorPoolCreateInfo(VulkanHandleMapping* handlemap,
+                                          VkDescriptorPoolCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pPoolSizes)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->poolSizeCount; ++i)
-            {
-                handlemap_VkDescriptorPoolSize(handlemap, (VkDescriptorPoolSize*)(toMap->pPoolSizes + i));
+    if (toMap) {
+        if (toMap->pPoolSizes) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->poolSizeCount; ++i) {
+                handlemap_VkDescriptorPoolSize(handlemap,
+                                               (VkDescriptorPoolSize*)(toMap->pPoolSizes + i));
             }
         }
     }
 }
 
-void handlemap_VkDescriptorSetAllocateInfo(
-    VulkanHandleMapping* handlemap,
-    VkDescriptorSetAllocateInfo* toMap)
-{
+void handlemap_VkDescriptorSetAllocateInfo(VulkanHandleMapping* handlemap,
+                                           VkDescriptorSetAllocateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkDescriptorPool((VkDescriptorPool*)&toMap->descriptorPool);
-    if (toMap->pSetLayouts)
-    {
-        handlemap->mapHandles_VkDescriptorSetLayout((VkDescriptorSetLayout*)toMap->pSetLayouts, toMap->descriptorSetCount);
+    if (toMap->pSetLayouts) {
+        handlemap->mapHandles_VkDescriptorSetLayout((VkDescriptorSetLayout*)toMap->pSetLayouts,
+                                                    toMap->descriptorSetCount);
     }
 }
 
-void handlemap_VkDescriptorSetLayoutBinding(
-    VulkanHandleMapping* handlemap,
-    VkDescriptorSetLayoutBinding* toMap)
-{
+void handlemap_VkDescriptorSetLayoutBinding(VulkanHandleMapping* handlemap,
+                                            VkDescriptorSetLayoutBinding* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pImmutableSamplers)
-    {
-        handlemap->mapHandles_VkSampler((VkSampler*)toMap->pImmutableSamplers, toMap->descriptorCount);
+    if (toMap->pImmutableSamplers) {
+        handlemap->mapHandles_VkSampler((VkSampler*)toMap->pImmutableSamplers,
+                                        toMap->descriptorCount);
     }
 }
 
-void handlemap_VkDescriptorSetLayoutCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkDescriptorSetLayoutCreateInfo* toMap)
-{
+void handlemap_VkDescriptorSetLayoutCreateInfo(VulkanHandleMapping* handlemap,
+                                               VkDescriptorSetLayoutCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pBindings)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->bindingCount; ++i)
-            {
-                handlemap_VkDescriptorSetLayoutBinding(handlemap, (VkDescriptorSetLayoutBinding*)(toMap->pBindings + i));
+    if (toMap) {
+        if (toMap->pBindings) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->bindingCount; ++i) {
+                handlemap_VkDescriptorSetLayoutBinding(
+                    handlemap, (VkDescriptorSetLayoutBinding*)(toMap->pBindings + i));
             }
         }
     }
 }
 
-void handlemap_VkWriteDescriptorSet(
-    VulkanHandleMapping* handlemap,
-    VkWriteDescriptorSet* toMap)
-{
+void handlemap_VkWriteDescriptorSet(VulkanHandleMapping* handlemap, VkWriteDescriptorSet* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkDescriptorSet((VkDescriptorSet*)&toMap->dstSet);
-    if (toMap)
-    {
-        if (toMap->pImageInfo)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->descriptorCount; ++i)
-            {
-                handlemap_VkDescriptorImageInfo(handlemap, (VkDescriptorImageInfo*)(toMap->pImageInfo + i));
+    if (toMap) {
+        if (toMap->pImageInfo) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->descriptorCount; ++i) {
+                handlemap_VkDescriptorImageInfo(handlemap,
+                                                (VkDescriptorImageInfo*)(toMap->pImageInfo + i));
             }
         }
     }
-    if (toMap)
-    {
-        if (toMap->pBufferInfo)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->descriptorCount; ++i)
-            {
-                handlemap_VkDescriptorBufferInfo(handlemap, (VkDescriptorBufferInfo*)(toMap->pBufferInfo + i));
+    if (toMap) {
+        if (toMap->pBufferInfo) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->descriptorCount; ++i) {
+                handlemap_VkDescriptorBufferInfo(handlemap,
+                                                 (VkDescriptorBufferInfo*)(toMap->pBufferInfo + i));
             }
         }
     }
-    if (toMap->pTexelBufferView)
-    {
-        handlemap->mapHandles_VkBufferView((VkBufferView*)toMap->pTexelBufferView, toMap->descriptorCount);
+    if (toMap->pTexelBufferView) {
+        handlemap->mapHandles_VkBufferView((VkBufferView*)toMap->pTexelBufferView,
+                                           toMap->descriptorCount);
     }
 }
 
-void handlemap_VkAttachmentDescription(
-    VulkanHandleMapping* handlemap,
-    VkAttachmentDescription* toMap)
-{
+void handlemap_VkAttachmentDescription(VulkanHandleMapping* handlemap,
+                                       VkAttachmentDescription* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkAttachmentReference(
-    VulkanHandleMapping* handlemap,
-    VkAttachmentReference* toMap)
-{
+void handlemap_VkAttachmentReference(VulkanHandleMapping* handlemap, VkAttachmentReference* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkFramebufferCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkFramebufferCreateInfo* toMap)
-{
+void handlemap_VkFramebufferCreateInfo(VulkanHandleMapping* handlemap,
+                                       VkFramebufferCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkRenderPass((VkRenderPass*)&toMap->renderPass);
-    if (toMap->pAttachments)
-    {
-        handlemap->mapHandles_VkImageView((VkImageView*)toMap->pAttachments, toMap->attachmentCount);
+    if (toMap->pAttachments) {
+        handlemap->mapHandles_VkImageView((VkImageView*)toMap->pAttachments,
+                                          toMap->attachmentCount);
     }
 }
 
-void handlemap_VkSubpassDescription(
-    VulkanHandleMapping* handlemap,
-    VkSubpassDescription* toMap)
-{
+void handlemap_VkSubpassDescription(VulkanHandleMapping* handlemap, VkSubpassDescription* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap)
-    {
-        if (toMap->pInputAttachments)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->inputAttachmentCount; ++i)
-            {
-                handlemap_VkAttachmentReference(handlemap, (VkAttachmentReference*)(toMap->pInputAttachments + i));
+    if (toMap) {
+        if (toMap->pInputAttachments) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->inputAttachmentCount; ++i) {
+                handlemap_VkAttachmentReference(
+                    handlemap, (VkAttachmentReference*)(toMap->pInputAttachments + i));
             }
         }
     }
-    if (toMap)
-    {
-        if (toMap->pColorAttachments)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->colorAttachmentCount; ++i)
-            {
-                handlemap_VkAttachmentReference(handlemap, (VkAttachmentReference*)(toMap->pColorAttachments + i));
+    if (toMap) {
+        if (toMap->pColorAttachments) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->colorAttachmentCount; ++i) {
+                handlemap_VkAttachmentReference(
+                    handlemap, (VkAttachmentReference*)(toMap->pColorAttachments + i));
             }
         }
     }
-    if (toMap)
-    {
-        if (toMap->pResolveAttachments)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->colorAttachmentCount; ++i)
-            {
-                handlemap_VkAttachmentReference(handlemap, (VkAttachmentReference*)(toMap->pResolveAttachments + i));
+    if (toMap) {
+        if (toMap->pResolveAttachments) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->colorAttachmentCount; ++i) {
+                handlemap_VkAttachmentReference(
+                    handlemap, (VkAttachmentReference*)(toMap->pResolveAttachments + i));
             }
         }
     }
-    if (toMap->pDepthStencilAttachment)
-    {
-        handlemap_VkAttachmentReference(handlemap, (VkAttachmentReference*)(toMap->pDepthStencilAttachment));
+    if (toMap->pDepthStencilAttachment) {
+        handlemap_VkAttachmentReference(handlemap,
+                                        (VkAttachmentReference*)(toMap->pDepthStencilAttachment));
     }
 }
 
-void handlemap_VkSubpassDependency(
-    VulkanHandleMapping* handlemap,
-    VkSubpassDependency* toMap)
-{
+void handlemap_VkSubpassDependency(VulkanHandleMapping* handlemap, VkSubpassDependency* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkRenderPassCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkRenderPassCreateInfo* toMap)
-{
+void handlemap_VkRenderPassCreateInfo(VulkanHandleMapping* handlemap,
+                                      VkRenderPassCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pAttachments)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->attachmentCount; ++i)
-            {
-                handlemap_VkAttachmentDescription(handlemap, (VkAttachmentDescription*)(toMap->pAttachments + i));
+    if (toMap) {
+        if (toMap->pAttachments) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->attachmentCount; ++i) {
+                handlemap_VkAttachmentDescription(
+                    handlemap, (VkAttachmentDescription*)(toMap->pAttachments + i));
             }
         }
     }
-    if (toMap)
-    {
-        if (toMap->pSubpasses)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->subpassCount; ++i)
-            {
-                handlemap_VkSubpassDescription(handlemap, (VkSubpassDescription*)(toMap->pSubpasses + i));
+    if (toMap) {
+        if (toMap->pSubpasses) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->subpassCount; ++i) {
+                handlemap_VkSubpassDescription(handlemap,
+                                               (VkSubpassDescription*)(toMap->pSubpasses + i));
             }
         }
     }
-    if (toMap)
-    {
-        if (toMap->pDependencies)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->dependencyCount; ++i)
-            {
-                handlemap_VkSubpassDependency(handlemap, (VkSubpassDependency*)(toMap->pDependencies + i));
+    if (toMap) {
+        if (toMap->pDependencies) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->dependencyCount; ++i) {
+                handlemap_VkSubpassDependency(handlemap,
+                                              (VkSubpassDependency*)(toMap->pDependencies + i));
             }
         }
     }
 }
 
-void handlemap_VkCommandPoolCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkCommandPoolCreateInfo* toMap)
-{
+void handlemap_VkCommandPoolCreateInfo(VulkanHandleMapping* handlemap,
+                                       VkCommandPoolCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkCommandBufferAllocateInfo(
-    VulkanHandleMapping* handlemap,
-    VkCommandBufferAllocateInfo* toMap)
-{
+void handlemap_VkCommandBufferAllocateInfo(VulkanHandleMapping* handlemap,
+                                           VkCommandBufferAllocateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkCommandPool((VkCommandPool*)&toMap->commandPool);
 }
 
-void handlemap_VkCommandBufferInheritanceInfo(
-    VulkanHandleMapping* handlemap,
-    VkCommandBufferInheritanceInfo* toMap)
-{
+void handlemap_VkCommandBufferInheritanceInfo(VulkanHandleMapping* handlemap,
+                                              VkCommandBufferInheritanceInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkRenderPass((VkRenderPass*)&toMap->renderPass);
     handlemap->mapHandles_VkFramebuffer((VkFramebuffer*)&toMap->framebuffer);
 }
 
-void handlemap_VkCommandBufferBeginInfo(
-    VulkanHandleMapping* handlemap,
-    VkCommandBufferBeginInfo* toMap)
-{
+void handlemap_VkCommandBufferBeginInfo(VulkanHandleMapping* handlemap,
+                                        VkCommandBufferBeginInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap->pInheritanceInfo)
-    {
-        handlemap_VkCommandBufferInheritanceInfo(handlemap, (VkCommandBufferInheritanceInfo*)(toMap->pInheritanceInfo));
+    if (toMap->pInheritanceInfo) {
+        handlemap_VkCommandBufferInheritanceInfo(
+            handlemap, (VkCommandBufferInheritanceInfo*)(toMap->pInheritanceInfo));
     }
 }
 
-void handlemap_VkBufferCopy(
-    VulkanHandleMapping* handlemap,
-    VkBufferCopy* toMap)
-{
+void handlemap_VkBufferCopy(VulkanHandleMapping* handlemap, VkBufferCopy* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkImageSubresourceLayers(
-    VulkanHandleMapping* handlemap,
-    VkImageSubresourceLayers* toMap)
-{
+void handlemap_VkImageSubresourceLayers(VulkanHandleMapping* handlemap,
+                                        VkImageSubresourceLayers* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkBufferImageCopy(
-    VulkanHandleMapping* handlemap,
-    VkBufferImageCopy* toMap)
-{
+void handlemap_VkBufferImageCopy(VulkanHandleMapping* handlemap, VkBufferImageCopy* toMap) {
     (void)handlemap;
     (void)toMap;
-    handlemap_VkImageSubresourceLayers(handlemap, (VkImageSubresourceLayers*)(&toMap->imageSubresource));
+    handlemap_VkImageSubresourceLayers(handlemap,
+                                       (VkImageSubresourceLayers*)(&toMap->imageSubresource));
     handlemap_VkOffset3D(handlemap, (VkOffset3D*)(&toMap->imageOffset));
     handlemap_VkExtent3D(handlemap, (VkExtent3D*)(&toMap->imageExtent));
 }
 
-void handlemap_VkClearColorValue(
-    VulkanHandleMapping* handlemap,
-    VkClearColorValue* toMap)
-{
+void handlemap_VkClearColorValue(VulkanHandleMapping* handlemap, VkClearColorValue* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkClearDepthStencilValue(
-    VulkanHandleMapping* handlemap,
-    VkClearDepthStencilValue* toMap)
-{
+void handlemap_VkClearDepthStencilValue(VulkanHandleMapping* handlemap,
+                                        VkClearDepthStencilValue* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkClearValue(
-    VulkanHandleMapping* handlemap,
-    VkClearValue* toMap)
-{
+void handlemap_VkClearValue(VulkanHandleMapping* handlemap, VkClearValue* toMap) {
     (void)handlemap;
     (void)toMap;
     handlemap_VkClearColorValue(handlemap, (VkClearColorValue*)(&toMap->color));
-    handlemap_VkClearDepthStencilValue(handlemap, (VkClearDepthStencilValue*)(&toMap->depthStencil));
+    handlemap_VkClearDepthStencilValue(handlemap,
+                                       (VkClearDepthStencilValue*)(&toMap->depthStencil));
 }
 
-void handlemap_VkClearAttachment(
-    VulkanHandleMapping* handlemap,
-    VkClearAttachment* toMap)
-{
+void handlemap_VkClearAttachment(VulkanHandleMapping* handlemap, VkClearAttachment* toMap) {
     (void)handlemap;
     (void)toMap;
     handlemap_VkClearValue(handlemap, (VkClearValue*)(&toMap->clearValue));
 }
 
-void handlemap_VkClearRect(
-    VulkanHandleMapping* handlemap,
-    VkClearRect* toMap)
-{
+void handlemap_VkClearRect(VulkanHandleMapping* handlemap, VkClearRect* toMap) {
     (void)handlemap;
     (void)toMap;
     handlemap_VkRect2D(handlemap, (VkRect2D*)(&toMap->rect));
 }
 
-void handlemap_VkImageBlit(
-    VulkanHandleMapping* handlemap,
-    VkImageBlit* toMap)
-{
+void handlemap_VkImageBlit(VulkanHandleMapping* handlemap, VkImageBlit* toMap) {
     (void)handlemap;
     (void)toMap;
-    handlemap_VkImageSubresourceLayers(handlemap, (VkImageSubresourceLayers*)(&toMap->srcSubresource));
-    for (uint32_t i = 0; i < (uint32_t)2; ++i)
-    {
+    handlemap_VkImageSubresourceLayers(handlemap,
+                                       (VkImageSubresourceLayers*)(&toMap->srcSubresource));
+    for (uint32_t i = 0; i < (uint32_t)2; ++i) {
         handlemap_VkOffset3D(handlemap, (VkOffset3D*)(toMap->srcOffsets + i));
     }
-    handlemap_VkImageSubresourceLayers(handlemap, (VkImageSubresourceLayers*)(&toMap->dstSubresource));
-    for (uint32_t i = 0; i < (uint32_t)2; ++i)
-    {
+    handlemap_VkImageSubresourceLayers(handlemap,
+                                       (VkImageSubresourceLayers*)(&toMap->dstSubresource));
+    for (uint32_t i = 0; i < (uint32_t)2; ++i) {
         handlemap_VkOffset3D(handlemap, (VkOffset3D*)(toMap->dstOffsets + i));
     }
 }
 
-void handlemap_VkImageCopy(
-    VulkanHandleMapping* handlemap,
-    VkImageCopy* toMap)
-{
+void handlemap_VkImageCopy(VulkanHandleMapping* handlemap, VkImageCopy* toMap) {
     (void)handlemap;
     (void)toMap;
-    handlemap_VkImageSubresourceLayers(handlemap, (VkImageSubresourceLayers*)(&toMap->srcSubresource));
+    handlemap_VkImageSubresourceLayers(handlemap,
+                                       (VkImageSubresourceLayers*)(&toMap->srcSubresource));
     handlemap_VkOffset3D(handlemap, (VkOffset3D*)(&toMap->srcOffset));
-    handlemap_VkImageSubresourceLayers(handlemap, (VkImageSubresourceLayers*)(&toMap->dstSubresource));
+    handlemap_VkImageSubresourceLayers(handlemap,
+                                       (VkImageSubresourceLayers*)(&toMap->dstSubresource));
     handlemap_VkOffset3D(handlemap, (VkOffset3D*)(&toMap->dstOffset));
     handlemap_VkExtent3D(handlemap, (VkExtent3D*)(&toMap->extent));
 }
 
-void handlemap_VkImageResolve(
-    VulkanHandleMapping* handlemap,
-    VkImageResolve* toMap)
-{
+void handlemap_VkImageResolve(VulkanHandleMapping* handlemap, VkImageResolve* toMap) {
     (void)handlemap;
     (void)toMap;
-    handlemap_VkImageSubresourceLayers(handlemap, (VkImageSubresourceLayers*)(&toMap->srcSubresource));
+    handlemap_VkImageSubresourceLayers(handlemap,
+                                       (VkImageSubresourceLayers*)(&toMap->srcSubresource));
     handlemap_VkOffset3D(handlemap, (VkOffset3D*)(&toMap->srcOffset));
-    handlemap_VkImageSubresourceLayers(handlemap, (VkImageSubresourceLayers*)(&toMap->dstSubresource));
+    handlemap_VkImageSubresourceLayers(handlemap,
+                                       (VkImageSubresourceLayers*)(&toMap->dstSubresource));
     handlemap_VkOffset3D(handlemap, (VkOffset3D*)(&toMap->dstOffset));
     handlemap_VkExtent3D(handlemap, (VkExtent3D*)(&toMap->extent));
 }
 
-void handlemap_VkRenderPassBeginInfo(
-    VulkanHandleMapping* handlemap,
-    VkRenderPassBeginInfo* toMap)
-{
+void handlemap_VkRenderPassBeginInfo(VulkanHandleMapping* handlemap, VkRenderPassBeginInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkRenderPass((VkRenderPass*)&toMap->renderPass);
     handlemap->mapHandles_VkFramebuffer((VkFramebuffer*)&toMap->framebuffer);
     handlemap_VkRect2D(handlemap, (VkRect2D*)(&toMap->renderArea));
-    if (toMap)
-    {
-        if (toMap->pClearValues)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->clearValueCount; ++i)
-            {
+    if (toMap) {
+        if (toMap->pClearValues) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->clearValueCount; ++i) {
                 handlemap_VkClearValue(handlemap, (VkClearValue*)(toMap->pClearValues + i));
             }
         }
@@ -1555,1575 +1184,1197 @@
 
 #endif
 #ifdef VK_VERSION_1_1
-void handlemap_VkPhysicalDeviceSubgroupProperties(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceSubgroupProperties* toMap)
-{
+void handlemap_VkPhysicalDeviceSubgroupProperties(VulkanHandleMapping* handlemap,
+                                                  VkPhysicalDeviceSubgroupProperties* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkBindBufferMemoryInfo(
-    VulkanHandleMapping* handlemap,
-    VkBindBufferMemoryInfo* toMap)
-{
+void handlemap_VkBindBufferMemoryInfo(VulkanHandleMapping* handlemap,
+                                      VkBindBufferMemoryInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkBuffer((VkBuffer*)&toMap->buffer);
     handlemap->mapHandles_VkDeviceMemory((VkDeviceMemory*)&toMap->memory);
 }
 
-void handlemap_VkBindImageMemoryInfo(
-    VulkanHandleMapping* handlemap,
-    VkBindImageMemoryInfo* toMap)
-{
+void handlemap_VkBindImageMemoryInfo(VulkanHandleMapping* handlemap, VkBindImageMemoryInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkImage((VkImage*)&toMap->image);
     handlemap->mapHandles_VkDeviceMemory((VkDeviceMemory*)&toMap->memory);
 }
 
-void handlemap_VkPhysicalDevice16BitStorageFeatures(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDevice16BitStorageFeatures* toMap)
-{
+void handlemap_VkPhysicalDevice16BitStorageFeatures(VulkanHandleMapping* handlemap,
+                                                    VkPhysicalDevice16BitStorageFeatures* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkMemoryDedicatedRequirements(
-    VulkanHandleMapping* handlemap,
-    VkMemoryDedicatedRequirements* toMap)
-{
+void handlemap_VkMemoryDedicatedRequirements(VulkanHandleMapping* handlemap,
+                                             VkMemoryDedicatedRequirements* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkMemoryDedicatedAllocateInfo(
-    VulkanHandleMapping* handlemap,
-    VkMemoryDedicatedAllocateInfo* toMap)
-{
+void handlemap_VkMemoryDedicatedAllocateInfo(VulkanHandleMapping* handlemap,
+                                             VkMemoryDedicatedAllocateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkImage((VkImage*)&toMap->image);
     handlemap->mapHandles_VkBuffer((VkBuffer*)&toMap->buffer);
 }
 
-void handlemap_VkMemoryAllocateFlagsInfo(
-    VulkanHandleMapping* handlemap,
-    VkMemoryAllocateFlagsInfo* toMap)
-{
+void handlemap_VkMemoryAllocateFlagsInfo(VulkanHandleMapping* handlemap,
+                                         VkMemoryAllocateFlagsInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkDeviceGroupRenderPassBeginInfo(
-    VulkanHandleMapping* handlemap,
-    VkDeviceGroupRenderPassBeginInfo* toMap)
-{
+void handlemap_VkDeviceGroupRenderPassBeginInfo(VulkanHandleMapping* handlemap,
+                                                VkDeviceGroupRenderPassBeginInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pDeviceRenderAreas)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->deviceRenderAreaCount; ++i)
-            {
+    if (toMap) {
+        if (toMap->pDeviceRenderAreas) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->deviceRenderAreaCount; ++i) {
                 handlemap_VkRect2D(handlemap, (VkRect2D*)(toMap->pDeviceRenderAreas + i));
             }
         }
     }
 }
 
-void handlemap_VkDeviceGroupCommandBufferBeginInfo(
-    VulkanHandleMapping* handlemap,
-    VkDeviceGroupCommandBufferBeginInfo* toMap)
-{
+void handlemap_VkDeviceGroupCommandBufferBeginInfo(VulkanHandleMapping* handlemap,
+                                                   VkDeviceGroupCommandBufferBeginInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkDeviceGroupSubmitInfo(
-    VulkanHandleMapping* handlemap,
-    VkDeviceGroupSubmitInfo* toMap)
-{
+void handlemap_VkDeviceGroupSubmitInfo(VulkanHandleMapping* handlemap,
+                                       VkDeviceGroupSubmitInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkDeviceGroupBindSparseInfo(
-    VulkanHandleMapping* handlemap,
-    VkDeviceGroupBindSparseInfo* toMap)
-{
+void handlemap_VkDeviceGroupBindSparseInfo(VulkanHandleMapping* handlemap,
+                                           VkDeviceGroupBindSparseInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkBindBufferMemoryDeviceGroupInfo(
-    VulkanHandleMapping* handlemap,
-    VkBindBufferMemoryDeviceGroupInfo* toMap)
-{
+void handlemap_VkBindBufferMemoryDeviceGroupInfo(VulkanHandleMapping* handlemap,
+                                                 VkBindBufferMemoryDeviceGroupInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkBindImageMemoryDeviceGroupInfo(
-    VulkanHandleMapping* handlemap,
-    VkBindImageMemoryDeviceGroupInfo* toMap)
-{
+void handlemap_VkBindImageMemoryDeviceGroupInfo(VulkanHandleMapping* handlemap,
+                                                VkBindImageMemoryDeviceGroupInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pSplitInstanceBindRegions)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->splitInstanceBindRegionCount; ++i)
-            {
+    if (toMap) {
+        if (toMap->pSplitInstanceBindRegions) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->splitInstanceBindRegionCount; ++i) {
                 handlemap_VkRect2D(handlemap, (VkRect2D*)(toMap->pSplitInstanceBindRegions + i));
             }
         }
     }
 }
 
-void handlemap_VkPhysicalDeviceGroupProperties(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceGroupProperties* toMap)
-{
+void handlemap_VkPhysicalDeviceGroupProperties(VulkanHandleMapping* handlemap,
+                                               VkPhysicalDeviceGroupProperties* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap->mapHandles_VkPhysicalDevice((VkPhysicalDevice*)toMap->physicalDevices, VK_MAX_DEVICE_GROUP_SIZE);
+    handlemap->mapHandles_VkPhysicalDevice((VkPhysicalDevice*)toMap->physicalDevices,
+                                           VK_MAX_DEVICE_GROUP_SIZE);
 }
 
-void handlemap_VkDeviceGroupDeviceCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkDeviceGroupDeviceCreateInfo* toMap)
-{
+void handlemap_VkDeviceGroupDeviceCreateInfo(VulkanHandleMapping* handlemap,
+                                             VkDeviceGroupDeviceCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap->pPhysicalDevices)
-    {
-        handlemap->mapHandles_VkPhysicalDevice((VkPhysicalDevice*)toMap->pPhysicalDevices, toMap->physicalDeviceCount);
+    if (toMap->pPhysicalDevices) {
+        handlemap->mapHandles_VkPhysicalDevice((VkPhysicalDevice*)toMap->pPhysicalDevices,
+                                               toMap->physicalDeviceCount);
     }
 }
 
-void handlemap_VkBufferMemoryRequirementsInfo2(
-    VulkanHandleMapping* handlemap,
-    VkBufferMemoryRequirementsInfo2* toMap)
-{
+void handlemap_VkBufferMemoryRequirementsInfo2(VulkanHandleMapping* handlemap,
+                                               VkBufferMemoryRequirementsInfo2* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkBuffer((VkBuffer*)&toMap->buffer);
 }
 
-void handlemap_VkImageMemoryRequirementsInfo2(
-    VulkanHandleMapping* handlemap,
-    VkImageMemoryRequirementsInfo2* toMap)
-{
+void handlemap_VkImageMemoryRequirementsInfo2(VulkanHandleMapping* handlemap,
+                                              VkImageMemoryRequirementsInfo2* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkImage((VkImage*)&toMap->image);
 }
 
-void handlemap_VkImageSparseMemoryRequirementsInfo2(
-    VulkanHandleMapping* handlemap,
-    VkImageSparseMemoryRequirementsInfo2* toMap)
-{
+void handlemap_VkImageSparseMemoryRequirementsInfo2(VulkanHandleMapping* handlemap,
+                                                    VkImageSparseMemoryRequirementsInfo2* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkImage((VkImage*)&toMap->image);
 }
 
-void handlemap_VkMemoryRequirements2(
-    VulkanHandleMapping* handlemap,
-    VkMemoryRequirements2* toMap)
-{
+void handlemap_VkMemoryRequirements2(VulkanHandleMapping* handlemap, VkMemoryRequirements2* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap_VkMemoryRequirements(handlemap, (VkMemoryRequirements*)(&toMap->memoryRequirements));
 }
 
-void handlemap_VkSparseImageMemoryRequirements2(
-    VulkanHandleMapping* handlemap,
-    VkSparseImageMemoryRequirements2* toMap)
-{
+void handlemap_VkSparseImageMemoryRequirements2(VulkanHandleMapping* handlemap,
+                                                VkSparseImageMemoryRequirements2* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap_VkSparseImageMemoryRequirements(handlemap, (VkSparseImageMemoryRequirements*)(&toMap->memoryRequirements));
+    handlemap_VkSparseImageMemoryRequirements(
+        handlemap, (VkSparseImageMemoryRequirements*)(&toMap->memoryRequirements));
 }
 
-void handlemap_VkPhysicalDeviceFeatures2(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceFeatures2* toMap)
-{
+void handlemap_VkPhysicalDeviceFeatures2(VulkanHandleMapping* handlemap,
+                                         VkPhysicalDeviceFeatures2* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap_VkPhysicalDeviceFeatures(handlemap, (VkPhysicalDeviceFeatures*)(&toMap->features));
 }
 
-void handlemap_VkPhysicalDeviceProperties2(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceProperties2* toMap)
-{
+void handlemap_VkPhysicalDeviceProperties2(VulkanHandleMapping* handlemap,
+                                           VkPhysicalDeviceProperties2* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap_VkPhysicalDeviceProperties(handlemap, (VkPhysicalDeviceProperties*)(&toMap->properties));
+    handlemap_VkPhysicalDeviceProperties(handlemap,
+                                         (VkPhysicalDeviceProperties*)(&toMap->properties));
 }
 
-void handlemap_VkFormatProperties2(
-    VulkanHandleMapping* handlemap,
-    VkFormatProperties2* toMap)
-{
+void handlemap_VkFormatProperties2(VulkanHandleMapping* handlemap, VkFormatProperties2* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap_VkFormatProperties(handlemap, (VkFormatProperties*)(&toMap->formatProperties));
 }
 
-void handlemap_VkImageFormatProperties2(
-    VulkanHandleMapping* handlemap,
-    VkImageFormatProperties2* toMap)
-{
+void handlemap_VkImageFormatProperties2(VulkanHandleMapping* handlemap,
+                                        VkImageFormatProperties2* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap_VkImageFormatProperties(handlemap, (VkImageFormatProperties*)(&toMap->imageFormatProperties));
+    handlemap_VkImageFormatProperties(handlemap,
+                                      (VkImageFormatProperties*)(&toMap->imageFormatProperties));
 }
 
-void handlemap_VkPhysicalDeviceImageFormatInfo2(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceImageFormatInfo2* toMap)
-{
+void handlemap_VkPhysicalDeviceImageFormatInfo2(VulkanHandleMapping* handlemap,
+                                                VkPhysicalDeviceImageFormatInfo2* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkQueueFamilyProperties2(
-    VulkanHandleMapping* handlemap,
-    VkQueueFamilyProperties2* toMap)
-{
+void handlemap_VkQueueFamilyProperties2(VulkanHandleMapping* handlemap,
+                                        VkQueueFamilyProperties2* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap_VkQueueFamilyProperties(handlemap, (VkQueueFamilyProperties*)(&toMap->queueFamilyProperties));
+    handlemap_VkQueueFamilyProperties(handlemap,
+                                      (VkQueueFamilyProperties*)(&toMap->queueFamilyProperties));
 }
 
-void handlemap_VkPhysicalDeviceMemoryProperties2(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceMemoryProperties2* toMap)
-{
+void handlemap_VkPhysicalDeviceMemoryProperties2(VulkanHandleMapping* handlemap,
+                                                 VkPhysicalDeviceMemoryProperties2* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap_VkPhysicalDeviceMemoryProperties(handlemap, (VkPhysicalDeviceMemoryProperties*)(&toMap->memoryProperties));
+    handlemap_VkPhysicalDeviceMemoryProperties(
+        handlemap, (VkPhysicalDeviceMemoryProperties*)(&toMap->memoryProperties));
 }
 
-void handlemap_VkSparseImageFormatProperties2(
-    VulkanHandleMapping* handlemap,
-    VkSparseImageFormatProperties2* toMap)
-{
+void handlemap_VkSparseImageFormatProperties2(VulkanHandleMapping* handlemap,
+                                              VkSparseImageFormatProperties2* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap_VkSparseImageFormatProperties(handlemap, (VkSparseImageFormatProperties*)(&toMap->properties));
+    handlemap_VkSparseImageFormatProperties(handlemap,
+                                            (VkSparseImageFormatProperties*)(&toMap->properties));
 }
 
 void handlemap_VkPhysicalDeviceSparseImageFormatInfo2(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceSparseImageFormatInfo2* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceSparseImageFormatInfo2* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDevicePointClippingProperties(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDevicePointClippingProperties* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDevicePointClippingProperties* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkInputAttachmentAspectReference(
-    VulkanHandleMapping* handlemap,
-    VkInputAttachmentAspectReference* toMap)
-{
+void handlemap_VkInputAttachmentAspectReference(VulkanHandleMapping* handlemap,
+                                                VkInputAttachmentAspectReference* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
 void handlemap_VkRenderPassInputAttachmentAspectCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkRenderPassInputAttachmentAspectCreateInfo* toMap)
-{
+    VulkanHandleMapping* handlemap, VkRenderPassInputAttachmentAspectCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pAspectReferences)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->aspectReferenceCount; ++i)
-            {
-                handlemap_VkInputAttachmentAspectReference(handlemap, (VkInputAttachmentAspectReference*)(toMap->pAspectReferences + i));
+    if (toMap) {
+        if (toMap->pAspectReferences) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->aspectReferenceCount; ++i) {
+                handlemap_VkInputAttachmentAspectReference(
+                    handlemap, (VkInputAttachmentAspectReference*)(toMap->pAspectReferences + i));
             }
         }
     }
 }
 
-void handlemap_VkImageViewUsageCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkImageViewUsageCreateInfo* toMap)
-{
+void handlemap_VkImageViewUsageCreateInfo(VulkanHandleMapping* handlemap,
+                                          VkImageViewUsageCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPipelineTessellationDomainOriginStateCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkPipelineTessellationDomainOriginStateCreateInfo* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPipelineTessellationDomainOriginStateCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkRenderPassMultiviewCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkRenderPassMultiviewCreateInfo* toMap)
-{
+void handlemap_VkRenderPassMultiviewCreateInfo(VulkanHandleMapping* handlemap,
+                                               VkRenderPassMultiviewCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkPhysicalDeviceMultiviewFeatures(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceMultiviewFeatures* toMap)
-{
+void handlemap_VkPhysicalDeviceMultiviewFeatures(VulkanHandleMapping* handlemap,
+                                                 VkPhysicalDeviceMultiviewFeatures* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkPhysicalDeviceMultiviewProperties(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceMultiviewProperties* toMap)
-{
+void handlemap_VkPhysicalDeviceMultiviewProperties(VulkanHandleMapping* handlemap,
+                                                   VkPhysicalDeviceMultiviewProperties* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceVariablePointersFeatures(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceVariablePointersFeatures* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceVariablePointersFeatures* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceProtectedMemoryFeatures(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceProtectedMemoryFeatures* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceProtectedMemoryFeatures* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceProtectedMemoryProperties(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceProtectedMemoryProperties* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceProtectedMemoryProperties* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkDeviceQueueInfo2(
-    VulkanHandleMapping* handlemap,
-    VkDeviceQueueInfo2* toMap)
-{
+void handlemap_VkDeviceQueueInfo2(VulkanHandleMapping* handlemap, VkDeviceQueueInfo2* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkProtectedSubmitInfo(
-    VulkanHandleMapping* handlemap,
-    VkProtectedSubmitInfo* toMap)
-{
+void handlemap_VkProtectedSubmitInfo(VulkanHandleMapping* handlemap, VkProtectedSubmitInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkSamplerYcbcrConversionCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkSamplerYcbcrConversionCreateInfo* toMap)
-{
+void handlemap_VkSamplerYcbcrConversionCreateInfo(VulkanHandleMapping* handlemap,
+                                                  VkSamplerYcbcrConversionCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap_VkComponentMapping(handlemap, (VkComponentMapping*)(&toMap->components));
 }
 
-void handlemap_VkSamplerYcbcrConversionInfo(
-    VulkanHandleMapping* handlemap,
-    VkSamplerYcbcrConversionInfo* toMap)
-{
+void handlemap_VkSamplerYcbcrConversionInfo(VulkanHandleMapping* handlemap,
+                                            VkSamplerYcbcrConversionInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkSamplerYcbcrConversion((VkSamplerYcbcrConversion*)&toMap->conversion);
 }
 
-void handlemap_VkBindImagePlaneMemoryInfo(
-    VulkanHandleMapping* handlemap,
-    VkBindImagePlaneMemoryInfo* toMap)
-{
+void handlemap_VkBindImagePlaneMemoryInfo(VulkanHandleMapping* handlemap,
+                                          VkBindImagePlaneMemoryInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkImagePlaneMemoryRequirementsInfo(
-    VulkanHandleMapping* handlemap,
-    VkImagePlaneMemoryRequirementsInfo* toMap)
-{
+void handlemap_VkImagePlaneMemoryRequirementsInfo(VulkanHandleMapping* handlemap,
+                                                  VkImagePlaneMemoryRequirementsInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceSamplerYcbcrConversionFeatures* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceSamplerYcbcrConversionFeatures* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkSamplerYcbcrConversionImageFormatProperties(
-    VulkanHandleMapping* handlemap,
-    VkSamplerYcbcrConversionImageFormatProperties* toMap)
-{
+    VulkanHandleMapping* handlemap, VkSamplerYcbcrConversionImageFormatProperties* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkDescriptorUpdateTemplateEntry(
-    VulkanHandleMapping* handlemap,
-    VkDescriptorUpdateTemplateEntry* toMap)
-{
+void handlemap_VkDescriptorUpdateTemplateEntry(VulkanHandleMapping* handlemap,
+                                               VkDescriptorUpdateTemplateEntry* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkDescriptorUpdateTemplateCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkDescriptorUpdateTemplateCreateInfo* toMap)
-{
+void handlemap_VkDescriptorUpdateTemplateCreateInfo(VulkanHandleMapping* handlemap,
+                                                    VkDescriptorUpdateTemplateCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pDescriptorUpdateEntries)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->descriptorUpdateEntryCount; ++i)
-            {
-                handlemap_VkDescriptorUpdateTemplateEntry(handlemap, (VkDescriptorUpdateTemplateEntry*)(toMap->pDescriptorUpdateEntries + i));
+    if (toMap) {
+        if (toMap->pDescriptorUpdateEntries) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->descriptorUpdateEntryCount; ++i) {
+                handlemap_VkDescriptorUpdateTemplateEntry(
+                    handlemap,
+                    (VkDescriptorUpdateTemplateEntry*)(toMap->pDescriptorUpdateEntries + i));
             }
         }
     }
-    handlemap->mapHandles_VkDescriptorSetLayout((VkDescriptorSetLayout*)&toMap->descriptorSetLayout);
+    handlemap->mapHandles_VkDescriptorSetLayout(
+        (VkDescriptorSetLayout*)&toMap->descriptorSetLayout);
     handlemap->mapHandles_VkPipelineLayout((VkPipelineLayout*)&toMap->pipelineLayout);
 }
 
-void handlemap_VkExternalMemoryProperties(
-    VulkanHandleMapping* handlemap,
-    VkExternalMemoryProperties* toMap)
-{
+void handlemap_VkExternalMemoryProperties(VulkanHandleMapping* handlemap,
+                                          VkExternalMemoryProperties* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
 void handlemap_VkPhysicalDeviceExternalImageFormatInfo(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceExternalImageFormatInfo* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceExternalImageFormatInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkExternalImageFormatProperties(
-    VulkanHandleMapping* handlemap,
-    VkExternalImageFormatProperties* toMap)
-{
+void handlemap_VkExternalImageFormatProperties(VulkanHandleMapping* handlemap,
+                                               VkExternalImageFormatProperties* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap_VkExternalMemoryProperties(handlemap, (VkExternalMemoryProperties*)(&toMap->externalMemoryProperties));
+    handlemap_VkExternalMemoryProperties(
+        handlemap, (VkExternalMemoryProperties*)(&toMap->externalMemoryProperties));
 }
 
-void handlemap_VkPhysicalDeviceExternalBufferInfo(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceExternalBufferInfo* toMap)
-{
+void handlemap_VkPhysicalDeviceExternalBufferInfo(VulkanHandleMapping* handlemap,
+                                                  VkPhysicalDeviceExternalBufferInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkExternalBufferProperties(
-    VulkanHandleMapping* handlemap,
-    VkExternalBufferProperties* toMap)
-{
+void handlemap_VkExternalBufferProperties(VulkanHandleMapping* handlemap,
+                                          VkExternalBufferProperties* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap_VkExternalMemoryProperties(handlemap, (VkExternalMemoryProperties*)(&toMap->externalMemoryProperties));
+    handlemap_VkExternalMemoryProperties(
+        handlemap, (VkExternalMemoryProperties*)(&toMap->externalMemoryProperties));
 }
 
-void handlemap_VkPhysicalDeviceIDProperties(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceIDProperties* toMap)
-{
+void handlemap_VkPhysicalDeviceIDProperties(VulkanHandleMapping* handlemap,
+                                            VkPhysicalDeviceIDProperties* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkExternalMemoryImageCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkExternalMemoryImageCreateInfo* toMap)
-{
+void handlemap_VkExternalMemoryImageCreateInfo(VulkanHandleMapping* handlemap,
+                                               VkExternalMemoryImageCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkExternalMemoryBufferCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkExternalMemoryBufferCreateInfo* toMap)
-{
+void handlemap_VkExternalMemoryBufferCreateInfo(VulkanHandleMapping* handlemap,
+                                                VkExternalMemoryBufferCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkExportMemoryAllocateInfo(
-    VulkanHandleMapping* handlemap,
-    VkExportMemoryAllocateInfo* toMap)
-{
+void handlemap_VkExportMemoryAllocateInfo(VulkanHandleMapping* handlemap,
+                                          VkExportMemoryAllocateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkPhysicalDeviceExternalFenceInfo(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceExternalFenceInfo* toMap)
-{
+void handlemap_VkPhysicalDeviceExternalFenceInfo(VulkanHandleMapping* handlemap,
+                                                 VkPhysicalDeviceExternalFenceInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkExternalFenceProperties(
-    VulkanHandleMapping* handlemap,
-    VkExternalFenceProperties* toMap)
-{
+void handlemap_VkExternalFenceProperties(VulkanHandleMapping* handlemap,
+                                         VkExternalFenceProperties* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkExportFenceCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkExportFenceCreateInfo* toMap)
-{
+void handlemap_VkExportFenceCreateInfo(VulkanHandleMapping* handlemap,
+                                       VkExportFenceCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkExportSemaphoreCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkExportSemaphoreCreateInfo* toMap)
-{
+void handlemap_VkExportSemaphoreCreateInfo(VulkanHandleMapping* handlemap,
+                                           VkExportSemaphoreCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkPhysicalDeviceExternalSemaphoreInfo(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceExternalSemaphoreInfo* toMap)
-{
+void handlemap_VkPhysicalDeviceExternalSemaphoreInfo(VulkanHandleMapping* handlemap,
+                                                     VkPhysicalDeviceExternalSemaphoreInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkExternalSemaphoreProperties(
-    VulkanHandleMapping* handlemap,
-    VkExternalSemaphoreProperties* toMap)
-{
+void handlemap_VkExternalSemaphoreProperties(VulkanHandleMapping* handlemap,
+                                             VkExternalSemaphoreProperties* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceMaintenance3Properties(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceMaintenance3Properties* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceMaintenance3Properties* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkDescriptorSetLayoutSupport(
-    VulkanHandleMapping* handlemap,
-    VkDescriptorSetLayoutSupport* toMap)
-{
+void handlemap_VkDescriptorSetLayoutSupport(VulkanHandleMapping* handlemap,
+                                            VkDescriptorSetLayoutSupport* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceShaderDrawParametersFeatures(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShaderDrawParametersFeatures* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShaderDrawParametersFeatures* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_VERSION_1_2
-void handlemap_VkPhysicalDeviceVulkan11Features(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceVulkan11Features* toMap)
-{
+void handlemap_VkPhysicalDeviceVulkan11Features(VulkanHandleMapping* handlemap,
+                                                VkPhysicalDeviceVulkan11Features* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkPhysicalDeviceVulkan11Properties(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceVulkan11Properties* toMap)
-{
+void handlemap_VkPhysicalDeviceVulkan11Properties(VulkanHandleMapping* handlemap,
+                                                  VkPhysicalDeviceVulkan11Properties* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkPhysicalDeviceVulkan12Features(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceVulkan12Features* toMap)
-{
+void handlemap_VkPhysicalDeviceVulkan12Features(VulkanHandleMapping* handlemap,
+                                                VkPhysicalDeviceVulkan12Features* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkConformanceVersion(
-    VulkanHandleMapping* handlemap,
-    VkConformanceVersion* toMap)
-{
+void handlemap_VkConformanceVersion(VulkanHandleMapping* handlemap, VkConformanceVersion* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkPhysicalDeviceVulkan12Properties(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceVulkan12Properties* toMap)
-{
+void handlemap_VkPhysicalDeviceVulkan12Properties(VulkanHandleMapping* handlemap,
+                                                  VkPhysicalDeviceVulkan12Properties* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap_VkConformanceVersion(handlemap, (VkConformanceVersion*)(&toMap->conformanceVersion));
 }
 
-void handlemap_VkImageFormatListCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkImageFormatListCreateInfo* toMap)
-{
+void handlemap_VkImageFormatListCreateInfo(VulkanHandleMapping* handlemap,
+                                           VkImageFormatListCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkAttachmentDescription2(
-    VulkanHandleMapping* handlemap,
-    VkAttachmentDescription2* toMap)
-{
+void handlemap_VkAttachmentDescription2(VulkanHandleMapping* handlemap,
+                                        VkAttachmentDescription2* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkAttachmentReference2(
-    VulkanHandleMapping* handlemap,
-    VkAttachmentReference2* toMap)
-{
+void handlemap_VkAttachmentReference2(VulkanHandleMapping* handlemap,
+                                      VkAttachmentReference2* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkSubpassDescription2(
-    VulkanHandleMapping* handlemap,
-    VkSubpassDescription2* toMap)
-{
+void handlemap_VkSubpassDescription2(VulkanHandleMapping* handlemap, VkSubpassDescription2* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pInputAttachments)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->inputAttachmentCount; ++i)
-            {
-                handlemap_VkAttachmentReference2(handlemap, (VkAttachmentReference2*)(toMap->pInputAttachments + i));
+    if (toMap) {
+        if (toMap->pInputAttachments) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->inputAttachmentCount; ++i) {
+                handlemap_VkAttachmentReference2(
+                    handlemap, (VkAttachmentReference2*)(toMap->pInputAttachments + i));
             }
         }
     }
-    if (toMap)
-    {
-        if (toMap->pColorAttachments)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->colorAttachmentCount; ++i)
-            {
-                handlemap_VkAttachmentReference2(handlemap, (VkAttachmentReference2*)(toMap->pColorAttachments + i));
+    if (toMap) {
+        if (toMap->pColorAttachments) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->colorAttachmentCount; ++i) {
+                handlemap_VkAttachmentReference2(
+                    handlemap, (VkAttachmentReference2*)(toMap->pColorAttachments + i));
             }
         }
     }
-    if (toMap)
-    {
-        if (toMap->pResolveAttachments)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->colorAttachmentCount; ++i)
-            {
-                handlemap_VkAttachmentReference2(handlemap, (VkAttachmentReference2*)(toMap->pResolveAttachments + i));
+    if (toMap) {
+        if (toMap->pResolveAttachments) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->colorAttachmentCount; ++i) {
+                handlemap_VkAttachmentReference2(
+                    handlemap, (VkAttachmentReference2*)(toMap->pResolveAttachments + i));
             }
         }
     }
-    if (toMap->pDepthStencilAttachment)
-    {
-        handlemap_VkAttachmentReference2(handlemap, (VkAttachmentReference2*)(toMap->pDepthStencilAttachment));
+    if (toMap->pDepthStencilAttachment) {
+        handlemap_VkAttachmentReference2(handlemap,
+                                         (VkAttachmentReference2*)(toMap->pDepthStencilAttachment));
     }
 }
 
-void handlemap_VkSubpassDependency2(
-    VulkanHandleMapping* handlemap,
-    VkSubpassDependency2* toMap)
-{
+void handlemap_VkSubpassDependency2(VulkanHandleMapping* handlemap, VkSubpassDependency2* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkRenderPassCreateInfo2(
-    VulkanHandleMapping* handlemap,
-    VkRenderPassCreateInfo2* toMap)
-{
+void handlemap_VkRenderPassCreateInfo2(VulkanHandleMapping* handlemap,
+                                       VkRenderPassCreateInfo2* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pAttachments)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->attachmentCount; ++i)
-            {
-                handlemap_VkAttachmentDescription2(handlemap, (VkAttachmentDescription2*)(toMap->pAttachments + i));
+    if (toMap) {
+        if (toMap->pAttachments) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->attachmentCount; ++i) {
+                handlemap_VkAttachmentDescription2(
+                    handlemap, (VkAttachmentDescription2*)(toMap->pAttachments + i));
             }
         }
     }
-    if (toMap)
-    {
-        if (toMap->pSubpasses)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->subpassCount; ++i)
-            {
-                handlemap_VkSubpassDescription2(handlemap, (VkSubpassDescription2*)(toMap->pSubpasses + i));
+    if (toMap) {
+        if (toMap->pSubpasses) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->subpassCount; ++i) {
+                handlemap_VkSubpassDescription2(handlemap,
+                                                (VkSubpassDescription2*)(toMap->pSubpasses + i));
             }
         }
     }
-    if (toMap)
-    {
-        if (toMap->pDependencies)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->dependencyCount; ++i)
-            {
-                handlemap_VkSubpassDependency2(handlemap, (VkSubpassDependency2*)(toMap->pDependencies + i));
+    if (toMap) {
+        if (toMap->pDependencies) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->dependencyCount; ++i) {
+                handlemap_VkSubpassDependency2(handlemap,
+                                               (VkSubpassDependency2*)(toMap->pDependencies + i));
             }
         }
     }
 }
 
-void handlemap_VkSubpassBeginInfo(
-    VulkanHandleMapping* handlemap,
-    VkSubpassBeginInfo* toMap)
-{
+void handlemap_VkSubpassBeginInfo(VulkanHandleMapping* handlemap, VkSubpassBeginInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkSubpassEndInfo(
-    VulkanHandleMapping* handlemap,
-    VkSubpassEndInfo* toMap)
-{
+void handlemap_VkSubpassEndInfo(VulkanHandleMapping* handlemap, VkSubpassEndInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkPhysicalDevice8BitStorageFeatures(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDevice8BitStorageFeatures* toMap)
-{
+void handlemap_VkPhysicalDevice8BitStorageFeatures(VulkanHandleMapping* handlemap,
+                                                   VkPhysicalDevice8BitStorageFeatures* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkPhysicalDeviceDriverProperties(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceDriverProperties* toMap)
-{
+void handlemap_VkPhysicalDeviceDriverProperties(VulkanHandleMapping* handlemap,
+                                                VkPhysicalDeviceDriverProperties* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap_VkConformanceVersion(handlemap, (VkConformanceVersion*)(&toMap->conformanceVersion));
 }
 
 void handlemap_VkPhysicalDeviceShaderAtomicInt64Features(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShaderAtomicInt64Features* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShaderAtomicInt64Features* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceShaderFloat16Int8Features(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShaderFloat16Int8Features* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShaderFloat16Int8Features* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceFloatControlsProperties(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceFloatControlsProperties* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceFloatControlsProperties* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkDescriptorSetLayoutBindingFlagsCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkDescriptorSetLayoutBindingFlagsCreateInfo* toMap)
-{
+    VulkanHandleMapping* handlemap, VkDescriptorSetLayoutBindingFlagsCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceDescriptorIndexingFeatures(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceDescriptorIndexingFeatures* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceDescriptorIndexingFeatures* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceDescriptorIndexingProperties(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceDescriptorIndexingProperties* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceDescriptorIndexingProperties* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkDescriptorSetVariableDescriptorCountAllocateInfo(
-    VulkanHandleMapping* handlemap,
-    VkDescriptorSetVariableDescriptorCountAllocateInfo* toMap)
-{
+    VulkanHandleMapping* handlemap, VkDescriptorSetVariableDescriptorCountAllocateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkDescriptorSetVariableDescriptorCountLayoutSupport(
-    VulkanHandleMapping* handlemap,
-    VkDescriptorSetVariableDescriptorCountLayoutSupport* toMap)
-{
+    VulkanHandleMapping* handlemap, VkDescriptorSetVariableDescriptorCountLayoutSupport* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkSubpassDescriptionDepthStencilResolve(
-    VulkanHandleMapping* handlemap,
-    VkSubpassDescriptionDepthStencilResolve* toMap)
-{
+    VulkanHandleMapping* handlemap, VkSubpassDescriptionDepthStencilResolve* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap->pDepthStencilResolveAttachment)
-    {
-        handlemap_VkAttachmentReference2(handlemap, (VkAttachmentReference2*)(toMap->pDepthStencilResolveAttachment));
+    if (toMap->pDepthStencilResolveAttachment) {
+        handlemap_VkAttachmentReference2(
+            handlemap, (VkAttachmentReference2*)(toMap->pDepthStencilResolveAttachment));
     }
 }
 
 void handlemap_VkPhysicalDeviceDepthStencilResolveProperties(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceDepthStencilResolveProperties* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceDepthStencilResolveProperties* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceScalarBlockLayoutFeatures(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceScalarBlockLayoutFeatures* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceScalarBlockLayoutFeatures* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkImageStencilUsageCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkImageStencilUsageCreateInfo* toMap)
-{
+void handlemap_VkImageStencilUsageCreateInfo(VulkanHandleMapping* handlemap,
+                                             VkImageStencilUsageCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkSamplerReductionModeCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkSamplerReductionModeCreateInfo* toMap)
-{
+void handlemap_VkSamplerReductionModeCreateInfo(VulkanHandleMapping* handlemap,
+                                                VkSamplerReductionModeCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceSamplerFilterMinmaxProperties(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceSamplerFilterMinmaxProperties* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceSamplerFilterMinmaxProperties* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceVulkanMemoryModelFeatures(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceVulkanMemoryModelFeatures* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceVulkanMemoryModelFeatures* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceImagelessFramebufferFeatures(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceImagelessFramebufferFeatures* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceImagelessFramebufferFeatures* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkFramebufferAttachmentImageInfo(
-    VulkanHandleMapping* handlemap,
-    VkFramebufferAttachmentImageInfo* toMap)
-{
+void handlemap_VkFramebufferAttachmentImageInfo(VulkanHandleMapping* handlemap,
+                                                VkFramebufferAttachmentImageInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkFramebufferAttachmentsCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkFramebufferAttachmentsCreateInfo* toMap)
-{
+void handlemap_VkFramebufferAttachmentsCreateInfo(VulkanHandleMapping* handlemap,
+                                                  VkFramebufferAttachmentsCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pAttachmentImageInfos)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->attachmentImageInfoCount; ++i)
-            {
-                handlemap_VkFramebufferAttachmentImageInfo(handlemap, (VkFramebufferAttachmentImageInfo*)(toMap->pAttachmentImageInfos + i));
+    if (toMap) {
+        if (toMap->pAttachmentImageInfos) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->attachmentImageInfoCount; ++i) {
+                handlemap_VkFramebufferAttachmentImageInfo(
+                    handlemap,
+                    (VkFramebufferAttachmentImageInfo*)(toMap->pAttachmentImageInfos + i));
             }
         }
     }
 }
 
-void handlemap_VkRenderPassAttachmentBeginInfo(
-    VulkanHandleMapping* handlemap,
-    VkRenderPassAttachmentBeginInfo* toMap)
-{
+void handlemap_VkRenderPassAttachmentBeginInfo(VulkanHandleMapping* handlemap,
+                                               VkRenderPassAttachmentBeginInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap->pAttachments)
-    {
-        handlemap->mapHandles_VkImageView((VkImageView*)toMap->pAttachments, toMap->attachmentCount);
+    if (toMap->pAttachments) {
+        handlemap->mapHandles_VkImageView((VkImageView*)toMap->pAttachments,
+                                          toMap->attachmentCount);
     }
 }
 
 void handlemap_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceUniformBufferStandardLayoutFeatures* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceUniformBufferStandardLayoutFeatures* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkAttachmentReferenceStencilLayout(
-    VulkanHandleMapping* handlemap,
-    VkAttachmentReferenceStencilLayout* toMap)
-{
+void handlemap_VkAttachmentReferenceStencilLayout(VulkanHandleMapping* handlemap,
+                                                  VkAttachmentReferenceStencilLayout* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkAttachmentDescriptionStencilLayout(
-    VulkanHandleMapping* handlemap,
-    VkAttachmentDescriptionStencilLayout* toMap)
-{
+void handlemap_VkAttachmentDescriptionStencilLayout(VulkanHandleMapping* handlemap,
+                                                    VkAttachmentDescriptionStencilLayout* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceHostQueryResetFeatures(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceHostQueryResetFeatures* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceHostQueryResetFeatures* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceTimelineSemaphoreFeatures(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceTimelineSemaphoreFeatures* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceTimelineSemaphoreFeatures* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceTimelineSemaphoreProperties(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceTimelineSemaphoreProperties* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceTimelineSemaphoreProperties* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkSemaphoreTypeCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkSemaphoreTypeCreateInfo* toMap)
-{
+void handlemap_VkSemaphoreTypeCreateInfo(VulkanHandleMapping* handlemap,
+                                         VkSemaphoreTypeCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkTimelineSemaphoreSubmitInfo(
-    VulkanHandleMapping* handlemap,
-    VkTimelineSemaphoreSubmitInfo* toMap)
-{
+void handlemap_VkTimelineSemaphoreSubmitInfo(VulkanHandleMapping* handlemap,
+                                             VkTimelineSemaphoreSubmitInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkSemaphoreWaitInfo(
-    VulkanHandleMapping* handlemap,
-    VkSemaphoreWaitInfo* toMap)
-{
+void handlemap_VkSemaphoreWaitInfo(VulkanHandleMapping* handlemap, VkSemaphoreWaitInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap->pSemaphores)
-    {
+    if (toMap->pSemaphores) {
         handlemap->mapHandles_VkSemaphore((VkSemaphore*)toMap->pSemaphores, toMap->semaphoreCount);
     }
 }
 
-void handlemap_VkSemaphoreSignalInfo(
-    VulkanHandleMapping* handlemap,
-    VkSemaphoreSignalInfo* toMap)
-{
+void handlemap_VkSemaphoreSignalInfo(VulkanHandleMapping* handlemap, VkSemaphoreSignalInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkSemaphore((VkSemaphore*)&toMap->semaphore);
 }
 
 void handlemap_VkPhysicalDeviceBufferDeviceAddressFeatures(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceBufferDeviceAddressFeatures* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceBufferDeviceAddressFeatures* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkBufferDeviceAddressInfo(
-    VulkanHandleMapping* handlemap,
-    VkBufferDeviceAddressInfo* toMap)
-{
+void handlemap_VkBufferDeviceAddressInfo(VulkanHandleMapping* handlemap,
+                                         VkBufferDeviceAddressInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkBuffer((VkBuffer*)&toMap->buffer);
 }
 
 void handlemap_VkBufferOpaqueCaptureAddressCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkBufferOpaqueCaptureAddressCreateInfo* toMap)
-{
+    VulkanHandleMapping* handlemap, VkBufferOpaqueCaptureAddressCreateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkMemoryOpaqueCaptureAddressAllocateInfo(
-    VulkanHandleMapping* handlemap,
-    VkMemoryOpaqueCaptureAddressAllocateInfo* toMap)
-{
+    VulkanHandleMapping* handlemap, VkMemoryOpaqueCaptureAddressAllocateInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkDeviceMemoryOpaqueCaptureAddressInfo(
-    VulkanHandleMapping* handlemap,
-    VkDeviceMemoryOpaqueCaptureAddressInfo* toMap)
-{
+    VulkanHandleMapping* handlemap, VkDeviceMemoryOpaqueCaptureAddressInfo* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkDeviceMemory((VkDeviceMemory*)&toMap->memory);
@@ -3131,10 +2382,8 @@
 
 #endif
 #ifdef VK_KHR_surface
-void handlemap_VkSurfaceCapabilitiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkSurfaceCapabilitiesKHR* toMap)
-{
+void handlemap_VkSurfaceCapabilitiesKHR(VulkanHandleMapping* handlemap,
+                                        VkSurfaceCapabilitiesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
     handlemap_VkExtent2D(handlemap, (VkExtent2D*)(&toMap->currentExtent));
@@ -3142,24 +2391,18 @@
     handlemap_VkExtent2D(handlemap, (VkExtent2D*)(&toMap->maxImageExtent));
 }
 
-void handlemap_VkSurfaceFormatKHR(
-    VulkanHandleMapping* handlemap,
-    VkSurfaceFormatKHR* toMap)
-{
+void handlemap_VkSurfaceFormatKHR(VulkanHandleMapping* handlemap, VkSurfaceFormatKHR* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
 #endif
 #ifdef VK_KHR_swapchain
-void handlemap_VkSwapchainCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkSwapchainCreateInfoKHR* toMap)
-{
+void handlemap_VkSwapchainCreateInfoKHR(VulkanHandleMapping* handlemap,
+                                        VkSwapchainCreateInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkSurfaceKHR((VkSurfaceKHR*)&toMap->surface);
@@ -3167,60 +2410,47 @@
     handlemap->mapHandles_VkSwapchainKHR((VkSwapchainKHR*)&toMap->oldSwapchain);
 }
 
-void handlemap_VkPresentInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkPresentInfoKHR* toMap)
-{
+void handlemap_VkPresentInfoKHR(VulkanHandleMapping* handlemap, VkPresentInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap->pWaitSemaphores)
-    {
-        handlemap->mapHandles_VkSemaphore((VkSemaphore*)toMap->pWaitSemaphores, toMap->waitSemaphoreCount);
+    if (toMap->pWaitSemaphores) {
+        handlemap->mapHandles_VkSemaphore((VkSemaphore*)toMap->pWaitSemaphores,
+                                          toMap->waitSemaphoreCount);
     }
-    if (toMap->pSwapchains)
-    {
-        handlemap->mapHandles_VkSwapchainKHR((VkSwapchainKHR*)toMap->pSwapchains, toMap->swapchainCount);
+    if (toMap->pSwapchains) {
+        handlemap->mapHandles_VkSwapchainKHR((VkSwapchainKHR*)toMap->pSwapchains,
+                                             toMap->swapchainCount);
     }
 }
 
-void handlemap_VkImageSwapchainCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkImageSwapchainCreateInfoKHR* toMap)
-{
+void handlemap_VkImageSwapchainCreateInfoKHR(VulkanHandleMapping* handlemap,
+                                             VkImageSwapchainCreateInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkSwapchainKHR((VkSwapchainKHR*)&toMap->swapchain);
 }
 
-void handlemap_VkBindImageMemorySwapchainInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkBindImageMemorySwapchainInfoKHR* toMap)
-{
+void handlemap_VkBindImageMemorySwapchainInfoKHR(VulkanHandleMapping* handlemap,
+                                                 VkBindImageMemorySwapchainInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkSwapchainKHR((VkSwapchainKHR*)&toMap->swapchain);
 }
 
-void handlemap_VkAcquireNextImageInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkAcquireNextImageInfoKHR* toMap)
-{
+void handlemap_VkAcquireNextImageInfoKHR(VulkanHandleMapping* handlemap,
+                                         VkAcquireNextImageInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkSwapchainKHR((VkSwapchainKHR*)&toMap->swapchain);
@@ -3228,80 +2458,64 @@
     handlemap->mapHandles_VkFence((VkFence*)&toMap->fence);
 }
 
-void handlemap_VkDeviceGroupPresentCapabilitiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkDeviceGroupPresentCapabilitiesKHR* toMap)
-{
+void handlemap_VkDeviceGroupPresentCapabilitiesKHR(VulkanHandleMapping* handlemap,
+                                                   VkDeviceGroupPresentCapabilitiesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkDeviceGroupPresentInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkDeviceGroupPresentInfoKHR* toMap)
-{
+void handlemap_VkDeviceGroupPresentInfoKHR(VulkanHandleMapping* handlemap,
+                                           VkDeviceGroupPresentInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkDeviceGroupSwapchainCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkDeviceGroupSwapchainCreateInfoKHR* toMap)
-{
+void handlemap_VkDeviceGroupSwapchainCreateInfoKHR(VulkanHandleMapping* handlemap,
+                                                   VkDeviceGroupSwapchainCreateInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_KHR_display
-void handlemap_VkDisplayModeParametersKHR(
-    VulkanHandleMapping* handlemap,
-    VkDisplayModeParametersKHR* toMap)
-{
+void handlemap_VkDisplayModeParametersKHR(VulkanHandleMapping* handlemap,
+                                          VkDisplayModeParametersKHR* toMap) {
     (void)handlemap;
     (void)toMap;
     handlemap_VkExtent2D(handlemap, (VkExtent2D*)(&toMap->visibleRegion));
 }
 
-void handlemap_VkDisplayModeCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkDisplayModeCreateInfoKHR* toMap)
-{
+void handlemap_VkDisplayModeCreateInfoKHR(VulkanHandleMapping* handlemap,
+                                          VkDisplayModeCreateInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap_VkDisplayModeParametersKHR(handlemap, (VkDisplayModeParametersKHR*)(&toMap->parameters));
+    handlemap_VkDisplayModeParametersKHR(handlemap,
+                                         (VkDisplayModeParametersKHR*)(&toMap->parameters));
 }
 
-void handlemap_VkDisplayModePropertiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkDisplayModePropertiesKHR* toMap)
-{
+void handlemap_VkDisplayModePropertiesKHR(VulkanHandleMapping* handlemap,
+                                          VkDisplayModePropertiesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
     handlemap->mapHandles_VkDisplayModeKHR((VkDisplayModeKHR*)&toMap->displayMode);
-    handlemap_VkDisplayModeParametersKHR(handlemap, (VkDisplayModeParametersKHR*)(&toMap->parameters));
+    handlemap_VkDisplayModeParametersKHR(handlemap,
+                                         (VkDisplayModeParametersKHR*)(&toMap->parameters));
 }
 
-void handlemap_VkDisplayPlaneCapabilitiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkDisplayPlaneCapabilitiesKHR* toMap)
-{
+void handlemap_VkDisplayPlaneCapabilitiesKHR(VulkanHandleMapping* handlemap,
+                                             VkDisplayPlaneCapabilitiesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
     handlemap_VkOffset2D(handlemap, (VkOffset2D*)(&toMap->minSrcPosition));
@@ -3314,19 +2528,15 @@
     handlemap_VkExtent2D(handlemap, (VkExtent2D*)(&toMap->maxDstExtent));
 }
 
-void handlemap_VkDisplayPlanePropertiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkDisplayPlanePropertiesKHR* toMap)
-{
+void handlemap_VkDisplayPlanePropertiesKHR(VulkanHandleMapping* handlemap,
+                                           VkDisplayPlanePropertiesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
     handlemap->mapHandles_VkDisplayKHR((VkDisplayKHR*)&toMap->currentDisplay);
 }
 
-void handlemap_VkDisplayPropertiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkDisplayPropertiesKHR* toMap)
-{
+void handlemap_VkDisplayPropertiesKHR(VulkanHandleMapping* handlemap,
+                                      VkDisplayPropertiesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
     handlemap->mapHandles_VkDisplayKHR((VkDisplayKHR*)&toMap->display);
@@ -3334,14 +2544,11 @@
     handlemap_VkExtent2D(handlemap, (VkExtent2D*)(&toMap->physicalResolution));
 }
 
-void handlemap_VkDisplaySurfaceCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkDisplaySurfaceCreateInfoKHR* toMap)
-{
+void handlemap_VkDisplaySurfaceCreateInfoKHR(VulkanHandleMapping* handlemap,
+                                             VkDisplaySurfaceCreateInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkDisplayModeKHR((VkDisplayModeKHR*)&toMap->displayMode);
@@ -3350,14 +2557,11 @@
 
 #endif
 #ifdef VK_KHR_display_swapchain
-void handlemap_VkDisplayPresentInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkDisplayPresentInfoKHR* toMap)
-{
+void handlemap_VkDisplayPresentInfoKHR(VulkanHandleMapping* handlemap,
+                                       VkDisplayPresentInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap_VkRect2D(handlemap, (VkRect2D*)(&toMap->srcRect));
@@ -3366,70 +2570,55 @@
 
 #endif
 #ifdef VK_KHR_xlib_surface
-void handlemap_VkXlibSurfaceCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkXlibSurfaceCreateInfoKHR* toMap)
-{
+void handlemap_VkXlibSurfaceCreateInfoKHR(VulkanHandleMapping* handlemap,
+                                          VkXlibSurfaceCreateInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_KHR_xcb_surface
-void handlemap_VkXcbSurfaceCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkXcbSurfaceCreateInfoKHR* toMap)
-{
+void handlemap_VkXcbSurfaceCreateInfoKHR(VulkanHandleMapping* handlemap,
+                                         VkXcbSurfaceCreateInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_KHR_wayland_surface
-void handlemap_VkWaylandSurfaceCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkWaylandSurfaceCreateInfoKHR* toMap)
-{
+void handlemap_VkWaylandSurfaceCreateInfoKHR(VulkanHandleMapping* handlemap,
+                                             VkWaylandSurfaceCreateInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_KHR_android_surface
-void handlemap_VkAndroidSurfaceCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkAndroidSurfaceCreateInfoKHR* toMap)
-{
+void handlemap_VkAndroidSurfaceCreateInfoKHR(VulkanHandleMapping* handlemap,
+                                             VkAndroidSurfaceCreateInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_KHR_win32_surface
-void handlemap_VkWin32SurfaceCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkWin32SurfaceCreateInfoKHR* toMap)
-{
+void handlemap_VkWin32SurfaceCreateInfoKHR(VulkanHandleMapping* handlemap,
+                                           VkWin32SurfaceCreateInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -3438,54 +2627,39 @@
 #ifdef VK_KHR_sampler_mirror_clamp_to_edge
 #endif
 #ifdef VK_KHR_video_queue
-void handlemap_VkVideoQueueFamilyProperties2KHR(
-    VulkanHandleMapping* handlemap,
-    VkVideoQueueFamilyProperties2KHR* toMap)
-{
+void handlemap_VkVideoQueueFamilyProperties2KHR(VulkanHandleMapping* handlemap,
+                                                VkVideoQueueFamilyProperties2KHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkVideoProfileKHR(
-    VulkanHandleMapping* handlemap,
-    VkVideoProfileKHR* toMap)
-{
+void handlemap_VkVideoProfileKHR(VulkanHandleMapping* handlemap, VkVideoProfileKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkVideoProfilesKHR(
-    VulkanHandleMapping* handlemap,
-    VkVideoProfilesKHR* toMap)
-{
+void handlemap_VkVideoProfilesKHR(VulkanHandleMapping* handlemap, VkVideoProfilesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap->pProfiles)
-    {
+    if (toMap->pProfiles) {
         handlemap_VkVideoProfileKHR(handlemap, (VkVideoProfileKHR*)(toMap->pProfiles));
     }
 }
 
-void handlemap_VkVideoCapabilitiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkVideoCapabilitiesKHR* toMap)
-{
+void handlemap_VkVideoCapabilitiesKHR(VulkanHandleMapping* handlemap,
+                                      VkVideoCapabilitiesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap_VkExtent2D(handlemap, (VkExtent2D*)(&toMap->videoPictureExtentGranularity));
@@ -3493,42 +2667,32 @@
     handlemap_VkExtent2D(handlemap, (VkExtent2D*)(&toMap->maxExtent));
 }
 
-void handlemap_VkPhysicalDeviceVideoFormatInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceVideoFormatInfoKHR* toMap)
-{
+void handlemap_VkPhysicalDeviceVideoFormatInfoKHR(VulkanHandleMapping* handlemap,
+                                                  VkPhysicalDeviceVideoFormatInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap->pVideoProfiles)
-    {
+    if (toMap->pVideoProfiles) {
         handlemap_VkVideoProfilesKHR(handlemap, (VkVideoProfilesKHR*)(toMap->pVideoProfiles));
     }
 }
 
-void handlemap_VkVideoFormatPropertiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkVideoFormatPropertiesKHR* toMap)
-{
+void handlemap_VkVideoFormatPropertiesKHR(VulkanHandleMapping* handlemap,
+                                          VkVideoFormatPropertiesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkVideoPictureResourceKHR(
-    VulkanHandleMapping* handlemap,
-    VkVideoPictureResourceKHR* toMap)
-{
+void handlemap_VkVideoPictureResourceKHR(VulkanHandleMapping* handlemap,
+                                         VkVideoPictureResourceKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap_VkOffset2D(handlemap, (VkOffset2D*)(&toMap->codedOffset));
@@ -3536,169 +2700,135 @@
     handlemap->mapHandles_VkImageView((VkImageView*)&toMap->imageViewBinding);
 }
 
-void handlemap_VkVideoReferenceSlotKHR(
-    VulkanHandleMapping* handlemap,
-    VkVideoReferenceSlotKHR* toMap)
-{
+void handlemap_VkVideoReferenceSlotKHR(VulkanHandleMapping* handlemap,
+                                       VkVideoReferenceSlotKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap->pPictureResource)
-    {
-        handlemap_VkVideoPictureResourceKHR(handlemap, (VkVideoPictureResourceKHR*)(toMap->pPictureResource));
+    if (toMap->pPictureResource) {
+        handlemap_VkVideoPictureResourceKHR(handlemap,
+                                            (VkVideoPictureResourceKHR*)(toMap->pPictureResource));
     }
 }
 
-void handlemap_VkVideoGetMemoryPropertiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkVideoGetMemoryPropertiesKHR* toMap)
-{
+void handlemap_VkVideoGetMemoryPropertiesKHR(VulkanHandleMapping* handlemap,
+                                             VkVideoGetMemoryPropertiesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap->pMemoryRequirements)
-    {
-        handlemap_VkMemoryRequirements2(handlemap, (VkMemoryRequirements2*)(toMap->pMemoryRequirements));
+    if (toMap->pMemoryRequirements) {
+        handlemap_VkMemoryRequirements2(handlemap,
+                                        (VkMemoryRequirements2*)(toMap->pMemoryRequirements));
     }
 }
 
-void handlemap_VkVideoBindMemoryKHR(
-    VulkanHandleMapping* handlemap,
-    VkVideoBindMemoryKHR* toMap)
-{
+void handlemap_VkVideoBindMemoryKHR(VulkanHandleMapping* handlemap, VkVideoBindMemoryKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkDeviceMemory((VkDeviceMemory*)&toMap->memory);
 }
 
-void handlemap_VkVideoSessionCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkVideoSessionCreateInfoKHR* toMap)
-{
+void handlemap_VkVideoSessionCreateInfoKHR(VulkanHandleMapping* handlemap,
+                                           VkVideoSessionCreateInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap->pVideoProfile)
-    {
+    if (toMap->pVideoProfile) {
         handlemap_VkVideoProfileKHR(handlemap, (VkVideoProfileKHR*)(toMap->pVideoProfile));
     }
     handlemap_VkExtent2D(handlemap, (VkExtent2D*)(&toMap->maxCodedExtent));
 }
 
-void handlemap_VkVideoSessionParametersCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkVideoSessionParametersCreateInfoKHR* toMap)
-{
+void handlemap_VkVideoSessionParametersCreateInfoKHR(VulkanHandleMapping* handlemap,
+                                                     VkVideoSessionParametersCreateInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap->mapHandles_VkVideoSessionParametersKHR((VkVideoSessionParametersKHR*)&toMap->videoSessionParametersTemplate);
+    handlemap->mapHandles_VkVideoSessionParametersKHR(
+        (VkVideoSessionParametersKHR*)&toMap->videoSessionParametersTemplate);
     handlemap->mapHandles_VkVideoSessionKHR((VkVideoSessionKHR*)&toMap->videoSession);
 }
 
-void handlemap_VkVideoSessionParametersUpdateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkVideoSessionParametersUpdateInfoKHR* toMap)
-{
+void handlemap_VkVideoSessionParametersUpdateInfoKHR(VulkanHandleMapping* handlemap,
+                                                     VkVideoSessionParametersUpdateInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkVideoBeginCodingInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkVideoBeginCodingInfoKHR* toMap)
-{
+void handlemap_VkVideoBeginCodingInfoKHR(VulkanHandleMapping* handlemap,
+                                         VkVideoBeginCodingInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkVideoSessionKHR((VkVideoSessionKHR*)&toMap->videoSession);
-    handlemap->mapHandles_VkVideoSessionParametersKHR((VkVideoSessionParametersKHR*)&toMap->videoSessionParameters);
-    if (toMap)
-    {
-        if (toMap->pReferenceSlots)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->referenceSlotCount; ++i)
-            {
-                handlemap_VkVideoReferenceSlotKHR(handlemap, (VkVideoReferenceSlotKHR*)(toMap->pReferenceSlots + i));
+    handlemap->mapHandles_VkVideoSessionParametersKHR(
+        (VkVideoSessionParametersKHR*)&toMap->videoSessionParameters);
+    if (toMap) {
+        if (toMap->pReferenceSlots) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->referenceSlotCount; ++i) {
+                handlemap_VkVideoReferenceSlotKHR(
+                    handlemap, (VkVideoReferenceSlotKHR*)(toMap->pReferenceSlots + i));
             }
         }
     }
 }
 
-void handlemap_VkVideoEndCodingInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkVideoEndCodingInfoKHR* toMap)
-{
+void handlemap_VkVideoEndCodingInfoKHR(VulkanHandleMapping* handlemap,
+                                       VkVideoEndCodingInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkVideoCodingControlInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkVideoCodingControlInfoKHR* toMap)
-{
+void handlemap_VkVideoCodingControlInfoKHR(VulkanHandleMapping* handlemap,
+                                           VkVideoCodingControlInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_KHR_video_decode_queue
-void handlemap_VkVideoDecodeInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkVideoDecodeInfoKHR* toMap)
-{
+void handlemap_VkVideoDecodeInfoKHR(VulkanHandleMapping* handlemap, VkVideoDecodeInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap_VkOffset2D(handlemap, (VkOffset2D*)(&toMap->codedOffset));
     handlemap_VkExtent2D(handlemap, (VkExtent2D*)(&toMap->codedExtent));
     handlemap->mapHandles_VkBuffer((VkBuffer*)&toMap->srcBuffer);
-    handlemap_VkVideoPictureResourceKHR(handlemap, (VkVideoPictureResourceKHR*)(&toMap->dstPictureResource));
-    if (toMap->pSetupReferenceSlot)
-    {
-        handlemap_VkVideoReferenceSlotKHR(handlemap, (VkVideoReferenceSlotKHR*)(toMap->pSetupReferenceSlot));
+    handlemap_VkVideoPictureResourceKHR(handlemap,
+                                        (VkVideoPictureResourceKHR*)(&toMap->dstPictureResource));
+    if (toMap->pSetupReferenceSlot) {
+        handlemap_VkVideoReferenceSlotKHR(handlemap,
+                                          (VkVideoReferenceSlotKHR*)(toMap->pSetupReferenceSlot));
     }
-    if (toMap)
-    {
-        if (toMap->pReferenceSlots)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->referenceSlotCount; ++i)
-            {
-                handlemap_VkVideoReferenceSlotKHR(handlemap, (VkVideoReferenceSlotKHR*)(toMap->pReferenceSlots + i));
+    if (toMap) {
+        if (toMap->pReferenceSlots) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->referenceSlotCount; ++i) {
+                handlemap_VkVideoReferenceSlotKHR(
+                    handlemap, (VkVideoReferenceSlotKHR*)(toMap->pReferenceSlots + i));
             }
         }
     }
@@ -3706,14 +2836,11 @@
 
 #endif
 #ifdef VK_KHR_dynamic_rendering
-void handlemap_VkRenderingAttachmentInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkRenderingAttachmentInfoKHR* toMap)
-{
+void handlemap_VkRenderingAttachmentInfoKHR(VulkanHandleMapping* handlemap,
+                                            VkRenderingAttachmentInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkImageView((VkImageView*)&toMap->imageView);
@@ -3721,81 +2848,63 @@
     handlemap_VkClearValue(handlemap, (VkClearValue*)(&toMap->clearValue));
 }
 
-void handlemap_VkRenderingInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkRenderingInfoKHR* toMap)
-{
+void handlemap_VkRenderingInfoKHR(VulkanHandleMapping* handlemap, VkRenderingInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap_VkRect2D(handlemap, (VkRect2D*)(&toMap->renderArea));
-    if (toMap)
-    {
-        if (toMap->pColorAttachments)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->colorAttachmentCount; ++i)
-            {
-                handlemap_VkRenderingAttachmentInfoKHR(handlemap, (VkRenderingAttachmentInfoKHR*)(toMap->pColorAttachments + i));
+    if (toMap) {
+        if (toMap->pColorAttachments) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->colorAttachmentCount; ++i) {
+                handlemap_VkRenderingAttachmentInfoKHR(
+                    handlemap, (VkRenderingAttachmentInfoKHR*)(toMap->pColorAttachments + i));
             }
         }
     }
-    if (toMap->pDepthAttachment)
-    {
-        handlemap_VkRenderingAttachmentInfoKHR(handlemap, (VkRenderingAttachmentInfoKHR*)(toMap->pDepthAttachment));
+    if (toMap->pDepthAttachment) {
+        handlemap_VkRenderingAttachmentInfoKHR(
+            handlemap, (VkRenderingAttachmentInfoKHR*)(toMap->pDepthAttachment));
     }
-    if (toMap->pStencilAttachment)
-    {
-        handlemap_VkRenderingAttachmentInfoKHR(handlemap, (VkRenderingAttachmentInfoKHR*)(toMap->pStencilAttachment));
+    if (toMap->pStencilAttachment) {
+        handlemap_VkRenderingAttachmentInfoKHR(
+            handlemap, (VkRenderingAttachmentInfoKHR*)(toMap->pStencilAttachment));
     }
 }
 
-void handlemap_VkPipelineRenderingCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkPipelineRenderingCreateInfoKHR* toMap)
-{
+void handlemap_VkPipelineRenderingCreateInfoKHR(VulkanHandleMapping* handlemap,
+                                                VkPipelineRenderingCreateInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceDynamicRenderingFeaturesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceDynamicRenderingFeaturesKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceDynamicRenderingFeaturesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkCommandBufferInheritanceRenderingInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkCommandBufferInheritanceRenderingInfoKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkCommandBufferInheritanceRenderingInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkRenderingFragmentShadingRateAttachmentInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkRenderingFragmentShadingRateAttachmentInfoKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkRenderingFragmentShadingRateAttachmentInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkImageView((VkImageView*)&toMap->imageView);
@@ -3803,38 +2912,29 @@
 }
 
 void handlemap_VkRenderingFragmentDensityMapAttachmentInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkRenderingFragmentDensityMapAttachmentInfoEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkRenderingFragmentDensityMapAttachmentInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkImageView((VkImageView*)&toMap->imageView);
 }
 
-void handlemap_VkAttachmentSampleCountInfoAMD(
-    VulkanHandleMapping* handlemap,
-    VkAttachmentSampleCountInfoAMD* toMap)
-{
+void handlemap_VkAttachmentSampleCountInfoAMD(VulkanHandleMapping* handlemap,
+                                              VkAttachmentSampleCountInfoAMD* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkMultiviewPerViewAttributesInfoNVX(
-    VulkanHandleMapping* handlemap,
-    VkMultiviewPerViewAttributesInfoNVX* toMap)
-{
+void handlemap_VkMultiviewPerViewAttributesInfoNVX(VulkanHandleMapping* handlemap,
+                                                   VkMultiviewPerViewAttributesInfoNVX* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -3857,50 +2957,38 @@
 #ifdef VK_KHR_external_memory
 #endif
 #ifdef VK_KHR_external_memory_win32
-void handlemap_VkImportMemoryWin32HandleInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkImportMemoryWin32HandleInfoKHR* toMap)
-{
+void handlemap_VkImportMemoryWin32HandleInfoKHR(VulkanHandleMapping* handlemap,
+                                                VkImportMemoryWin32HandleInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkExportMemoryWin32HandleInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkExportMemoryWin32HandleInfoKHR* toMap)
-{
+void handlemap_VkExportMemoryWin32HandleInfoKHR(VulkanHandleMapping* handlemap,
+                                                VkExportMemoryWin32HandleInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkMemoryWin32HandlePropertiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkMemoryWin32HandlePropertiesKHR* toMap)
-{
+void handlemap_VkMemoryWin32HandlePropertiesKHR(VulkanHandleMapping* handlemap,
+                                                VkMemoryWin32HandlePropertiesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkMemoryGetWin32HandleInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkMemoryGetWin32HandleInfoKHR* toMap)
-{
+void handlemap_VkMemoryGetWin32HandleInfoKHR(VulkanHandleMapping* handlemap,
+                                             VkMemoryGetWin32HandleInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkDeviceMemory((VkDeviceMemory*)&toMap->memory);
@@ -3908,38 +2996,28 @@
 
 #endif
 #ifdef VK_KHR_external_memory_fd
-void handlemap_VkImportMemoryFdInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkImportMemoryFdInfoKHR* toMap)
-{
+void handlemap_VkImportMemoryFdInfoKHR(VulkanHandleMapping* handlemap,
+                                       VkImportMemoryFdInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkMemoryFdPropertiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkMemoryFdPropertiesKHR* toMap)
-{
+void handlemap_VkMemoryFdPropertiesKHR(VulkanHandleMapping* handlemap,
+                                       VkMemoryFdPropertiesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkMemoryGetFdInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkMemoryGetFdInfoKHR* toMap)
-{
+void handlemap_VkMemoryGetFdInfoKHR(VulkanHandleMapping* handlemap, VkMemoryGetFdInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkDeviceMemory((VkDeviceMemory*)&toMap->memory);
@@ -3948,22 +3026,19 @@
 #endif
 #ifdef VK_KHR_win32_keyed_mutex
 void handlemap_VkWin32KeyedMutexAcquireReleaseInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkWin32KeyedMutexAcquireReleaseInfoKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkWin32KeyedMutexAcquireReleaseInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap->pAcquireSyncs)
-    {
-        handlemap->mapHandles_VkDeviceMemory((VkDeviceMemory*)toMap->pAcquireSyncs, toMap->acquireCount);
+    if (toMap->pAcquireSyncs) {
+        handlemap->mapHandles_VkDeviceMemory((VkDeviceMemory*)toMap->pAcquireSyncs,
+                                             toMap->acquireCount);
     }
-    if (toMap->pReleaseSyncs)
-    {
-        handlemap->mapHandles_VkDeviceMemory((VkDeviceMemory*)toMap->pReleaseSyncs, toMap->releaseCount);
+    if (toMap->pReleaseSyncs) {
+        handlemap->mapHandles_VkDeviceMemory((VkDeviceMemory*)toMap->pReleaseSyncs,
+                                             toMap->releaseCount);
     }
 }
 
@@ -3973,51 +3048,39 @@
 #ifdef VK_KHR_external_semaphore
 #endif
 #ifdef VK_KHR_external_semaphore_win32
-void handlemap_VkImportSemaphoreWin32HandleInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkImportSemaphoreWin32HandleInfoKHR* toMap)
-{
+void handlemap_VkImportSemaphoreWin32HandleInfoKHR(VulkanHandleMapping* handlemap,
+                                                   VkImportSemaphoreWin32HandleInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkSemaphore((VkSemaphore*)&toMap->semaphore);
 }
 
-void handlemap_VkExportSemaphoreWin32HandleInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkExportSemaphoreWin32HandleInfoKHR* toMap)
-{
+void handlemap_VkExportSemaphoreWin32HandleInfoKHR(VulkanHandleMapping* handlemap,
+                                                   VkExportSemaphoreWin32HandleInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkD3D12FenceSubmitInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkD3D12FenceSubmitInfoKHR* toMap)
-{
+void handlemap_VkD3D12FenceSubmitInfoKHR(VulkanHandleMapping* handlemap,
+                                         VkD3D12FenceSubmitInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkSemaphoreGetWin32HandleInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkSemaphoreGetWin32HandleInfoKHR* toMap)
-{
+void handlemap_VkSemaphoreGetWin32HandleInfoKHR(VulkanHandleMapping* handlemap,
+                                                VkSemaphoreGetWin32HandleInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkSemaphore((VkSemaphore*)&toMap->semaphore);
@@ -4025,27 +3088,21 @@
 
 #endif
 #ifdef VK_KHR_external_semaphore_fd
-void handlemap_VkImportSemaphoreFdInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkImportSemaphoreFdInfoKHR* toMap)
-{
+void handlemap_VkImportSemaphoreFdInfoKHR(VulkanHandleMapping* handlemap,
+                                          VkImportSemaphoreFdInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkSemaphore((VkSemaphore*)&toMap->semaphore);
 }
 
-void handlemap_VkSemaphoreGetFdInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkSemaphoreGetFdInfoKHR* toMap)
-{
+void handlemap_VkSemaphoreGetFdInfoKHR(VulkanHandleMapping* handlemap,
+                                       VkSemaphoreGetFdInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkSemaphore((VkSemaphore*)&toMap->semaphore);
@@ -4054,13 +3111,10 @@
 #endif
 #ifdef VK_KHR_push_descriptor
 void handlemap_VkPhysicalDevicePushDescriptorPropertiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDevicePushDescriptorPropertiesKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDevicePushDescriptorPropertiesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -4071,50 +3125,34 @@
 #ifdef VK_KHR_16bit_storage
 #endif
 #ifdef VK_KHR_incremental_present
-void handlemap_VkRectLayerKHR(
-    VulkanHandleMapping* handlemap,
-    VkRectLayerKHR* toMap)
-{
+void handlemap_VkRectLayerKHR(VulkanHandleMapping* handlemap, VkRectLayerKHR* toMap) {
     (void)handlemap;
     (void)toMap;
     handlemap_VkOffset2D(handlemap, (VkOffset2D*)(&toMap->offset));
     handlemap_VkExtent2D(handlemap, (VkExtent2D*)(&toMap->extent));
 }
 
-void handlemap_VkPresentRegionKHR(
-    VulkanHandleMapping* handlemap,
-    VkPresentRegionKHR* toMap)
-{
+void handlemap_VkPresentRegionKHR(VulkanHandleMapping* handlemap, VkPresentRegionKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap)
-    {
-        if (toMap->pRectangles)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->rectangleCount; ++i)
-            {
+    if (toMap) {
+        if (toMap->pRectangles) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->rectangleCount; ++i) {
                 handlemap_VkRectLayerKHR(handlemap, (VkRectLayerKHR*)(toMap->pRectangles + i));
             }
         }
     }
 }
 
-void handlemap_VkPresentRegionsKHR(
-    VulkanHandleMapping* handlemap,
-    VkPresentRegionsKHR* toMap)
-{
+void handlemap_VkPresentRegionsKHR(VulkanHandleMapping* handlemap, VkPresentRegionsKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pRegions)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->swapchainCount; ++i)
-            {
+    if (toMap) {
+        if (toMap->pRegions) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->swapchainCount; ++i) {
                 handlemap_VkPresentRegionKHR(handlemap, (VkPresentRegionKHR*)(toMap->pRegions + i));
             }
         }
@@ -4129,14 +3167,11 @@
 #ifdef VK_KHR_create_renderpass2
 #endif
 #ifdef VK_KHR_shared_presentable_image
-void handlemap_VkSharedPresentSurfaceCapabilitiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkSharedPresentSurfaceCapabilitiesKHR* toMap)
-{
+void handlemap_VkSharedPresentSurfaceCapabilitiesKHR(VulkanHandleMapping* handlemap,
+                                                     VkSharedPresentSurfaceCapabilitiesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -4147,39 +3182,30 @@
 #ifdef VK_KHR_external_fence
 #endif
 #ifdef VK_KHR_external_fence_win32
-void handlemap_VkImportFenceWin32HandleInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkImportFenceWin32HandleInfoKHR* toMap)
-{
+void handlemap_VkImportFenceWin32HandleInfoKHR(VulkanHandleMapping* handlemap,
+                                               VkImportFenceWin32HandleInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkFence((VkFence*)&toMap->fence);
 }
 
-void handlemap_VkExportFenceWin32HandleInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkExportFenceWin32HandleInfoKHR* toMap)
-{
+void handlemap_VkExportFenceWin32HandleInfoKHR(VulkanHandleMapping* handlemap,
+                                               VkExportFenceWin32HandleInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkFenceGetWin32HandleInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkFenceGetWin32HandleInfoKHR* toMap)
-{
+void handlemap_VkFenceGetWin32HandleInfoKHR(VulkanHandleMapping* handlemap,
+                                            VkFenceGetWin32HandleInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkFence((VkFence*)&toMap->fence);
@@ -4187,27 +3213,20 @@
 
 #endif
 #ifdef VK_KHR_external_fence_fd
-void handlemap_VkImportFenceFdInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkImportFenceFdInfoKHR* toMap)
-{
+void handlemap_VkImportFenceFdInfoKHR(VulkanHandleMapping* handlemap,
+                                      VkImportFenceFdInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkFence((VkFence*)&toMap->fence);
 }
 
-void handlemap_VkFenceGetFdInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkFenceGetFdInfoKHR* toMap)
-{
+void handlemap_VkFenceGetFdInfoKHR(VulkanHandleMapping* handlemap, VkFenceGetFdInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkFence((VkFence*)&toMap->fence);
@@ -4216,93 +3235,70 @@
 #endif
 #ifdef VK_KHR_performance_query
 void handlemap_VkPhysicalDevicePerformanceQueryFeaturesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDevicePerformanceQueryFeaturesKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDevicePerformanceQueryFeaturesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDevicePerformanceQueryPropertiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDevicePerformanceQueryPropertiesKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDevicePerformanceQueryPropertiesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkPerformanceCounterKHR(
-    VulkanHandleMapping* handlemap,
-    VkPerformanceCounterKHR* toMap)
-{
+void handlemap_VkPerformanceCounterKHR(VulkanHandleMapping* handlemap,
+                                       VkPerformanceCounterKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkPerformanceCounterDescriptionKHR(
-    VulkanHandleMapping* handlemap,
-    VkPerformanceCounterDescriptionKHR* toMap)
-{
+void handlemap_VkPerformanceCounterDescriptionKHR(VulkanHandleMapping* handlemap,
+                                                  VkPerformanceCounterDescriptionKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkQueryPoolPerformanceCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkQueryPoolPerformanceCreateInfoKHR* toMap)
-{
+void handlemap_VkQueryPoolPerformanceCreateInfoKHR(VulkanHandleMapping* handlemap,
+                                                   VkQueryPoolPerformanceCreateInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkPerformanceCounterResultKHR(
-    VulkanHandleMapping* handlemap,
-    VkPerformanceCounterResultKHR* toMap)
-{
+void handlemap_VkPerformanceCounterResultKHR(VulkanHandleMapping* handlemap,
+                                             VkPerformanceCounterResultKHR* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkAcquireProfilingLockInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkAcquireProfilingLockInfoKHR* toMap)
-{
+void handlemap_VkAcquireProfilingLockInfoKHR(VulkanHandleMapping* handlemap,
+                                             VkAcquireProfilingLockInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkPerformanceQuerySubmitInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkPerformanceQuerySubmitInfoKHR* toMap)
-{
+void handlemap_VkPerformanceQuerySubmitInfoKHR(VulkanHandleMapping* handlemap,
+                                               VkPerformanceQuerySubmitInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -4311,40 +3307,31 @@
 #ifdef VK_KHR_maintenance2
 #endif
 #ifdef VK_KHR_get_surface_capabilities2
-void handlemap_VkPhysicalDeviceSurfaceInfo2KHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceSurfaceInfo2KHR* toMap)
-{
+void handlemap_VkPhysicalDeviceSurfaceInfo2KHR(VulkanHandleMapping* handlemap,
+                                               VkPhysicalDeviceSurfaceInfo2KHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkSurfaceKHR((VkSurfaceKHR*)&toMap->surface);
 }
 
-void handlemap_VkSurfaceCapabilities2KHR(
-    VulkanHandleMapping* handlemap,
-    VkSurfaceCapabilities2KHR* toMap)
-{
+void handlemap_VkSurfaceCapabilities2KHR(VulkanHandleMapping* handlemap,
+                                         VkSurfaceCapabilities2KHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap_VkSurfaceCapabilitiesKHR(handlemap, (VkSurfaceCapabilitiesKHR*)(&toMap->surfaceCapabilities));
+    handlemap_VkSurfaceCapabilitiesKHR(handlemap,
+                                       (VkSurfaceCapabilitiesKHR*)(&toMap->surfaceCapabilities));
 }
 
-void handlemap_VkSurfaceFormat2KHR(
-    VulkanHandleMapping* handlemap,
-    VkSurfaceFormat2KHR* toMap)
-{
+void handlemap_VkSurfaceFormat2KHR(VulkanHandleMapping* handlemap, VkSurfaceFormat2KHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap_VkSurfaceFormatKHR(handlemap, (VkSurfaceFormatKHR*)(&toMap->surfaceFormat));
@@ -4354,69 +3341,58 @@
 #ifdef VK_KHR_variable_pointers
 #endif
 #ifdef VK_KHR_get_display_properties2
-void handlemap_VkDisplayProperties2KHR(
-    VulkanHandleMapping* handlemap,
-    VkDisplayProperties2KHR* toMap)
-{
+void handlemap_VkDisplayProperties2KHR(VulkanHandleMapping* handlemap,
+                                       VkDisplayProperties2KHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap_VkDisplayPropertiesKHR(handlemap, (VkDisplayPropertiesKHR*)(&toMap->displayProperties));
+    handlemap_VkDisplayPropertiesKHR(handlemap,
+                                     (VkDisplayPropertiesKHR*)(&toMap->displayProperties));
 }
 
-void handlemap_VkDisplayPlaneProperties2KHR(
-    VulkanHandleMapping* handlemap,
-    VkDisplayPlaneProperties2KHR* toMap)
-{
+void handlemap_VkDisplayPlaneProperties2KHR(VulkanHandleMapping* handlemap,
+                                            VkDisplayPlaneProperties2KHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap_VkDisplayPlanePropertiesKHR(handlemap, (VkDisplayPlanePropertiesKHR*)(&toMap->displayPlaneProperties));
+    handlemap_VkDisplayPlanePropertiesKHR(
+        handlemap, (VkDisplayPlanePropertiesKHR*)(&toMap->displayPlaneProperties));
 }
 
-void handlemap_VkDisplayModeProperties2KHR(
-    VulkanHandleMapping* handlemap,
-    VkDisplayModeProperties2KHR* toMap)
-{
+void handlemap_VkDisplayModeProperties2KHR(VulkanHandleMapping* handlemap,
+                                           VkDisplayModeProperties2KHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap_VkDisplayModePropertiesKHR(handlemap, (VkDisplayModePropertiesKHR*)(&toMap->displayModeProperties));
+    handlemap_VkDisplayModePropertiesKHR(
+        handlemap, (VkDisplayModePropertiesKHR*)(&toMap->displayModeProperties));
 }
 
-void handlemap_VkDisplayPlaneInfo2KHR(
-    VulkanHandleMapping* handlemap,
-    VkDisplayPlaneInfo2KHR* toMap)
-{
+void handlemap_VkDisplayPlaneInfo2KHR(VulkanHandleMapping* handlemap,
+                                      VkDisplayPlaneInfo2KHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkDisplayModeKHR((VkDisplayModeKHR*)&toMap->mode);
 }
 
-void handlemap_VkDisplayPlaneCapabilities2KHR(
-    VulkanHandleMapping* handlemap,
-    VkDisplayPlaneCapabilities2KHR* toMap)
-{
+void handlemap_VkDisplayPlaneCapabilities2KHR(VulkanHandleMapping* handlemap,
+                                              VkDisplayPlaneCapabilities2KHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap_VkDisplayPlaneCapabilitiesKHR(handlemap, (VkDisplayPlaneCapabilitiesKHR*)(&toMap->capabilities));
+    handlemap_VkDisplayPlaneCapabilitiesKHR(handlemap,
+                                            (VkDisplayPlaneCapabilitiesKHR*)(&toMap->capabilities));
 }
 
 #endif
@@ -4436,25 +3412,19 @@
 #endif
 #ifdef VK_KHR_portability_subset
 void handlemap_VkPhysicalDevicePortabilitySubsetFeaturesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDevicePortabilitySubsetFeaturesKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDevicePortabilitySubsetFeaturesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDevicePortabilitySubsetPropertiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDevicePortabilitySubsetPropertiesKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDevicePortabilitySubsetPropertiesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -4472,13 +3442,10 @@
 #endif
 #ifdef VK_KHR_shader_clock
 void handlemap_VkPhysicalDeviceShaderClockFeaturesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShaderClockFeaturesKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShaderClockFeaturesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -4498,13 +3465,10 @@
 #endif
 #ifdef VK_KHR_shader_terminate_invocation
 void handlemap_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -4512,70 +3476,57 @@
 #endif
 #ifdef VK_KHR_fragment_shading_rate
 void handlemap_VkFragmentShadingRateAttachmentInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkFragmentShadingRateAttachmentInfoKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkFragmentShadingRateAttachmentInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap->pFragmentShadingRateAttachment)
-    {
-        handlemap_VkAttachmentReference2(handlemap, (VkAttachmentReference2*)(toMap->pFragmentShadingRateAttachment));
+    if (toMap->pFragmentShadingRateAttachment) {
+        handlemap_VkAttachmentReference2(
+            handlemap, (VkAttachmentReference2*)(toMap->pFragmentShadingRateAttachment));
     }
     handlemap_VkExtent2D(handlemap, (VkExtent2D*)(&toMap->shadingRateAttachmentTexelSize));
 }
 
 void handlemap_VkPipelineFragmentShadingRateStateCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkPipelineFragmentShadingRateStateCreateInfoKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPipelineFragmentShadingRateStateCreateInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap_VkExtent2D(handlemap, (VkExtent2D*)(&toMap->fragmentSize));
 }
 
 void handlemap_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceFragmentShadingRateFeaturesKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceFragmentShadingRateFeaturesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceFragmentShadingRatePropertiesKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceFragmentShadingRatePropertiesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap_VkExtent2D(handlemap, (VkExtent2D*)(&toMap->minFragmentShadingRateAttachmentTexelSize));
-    handlemap_VkExtent2D(handlemap, (VkExtent2D*)(&toMap->maxFragmentShadingRateAttachmentTexelSize));
+    handlemap_VkExtent2D(handlemap,
+                         (VkExtent2D*)(&toMap->minFragmentShadingRateAttachmentTexelSize));
+    handlemap_VkExtent2D(handlemap,
+                         (VkExtent2D*)(&toMap->maxFragmentShadingRateAttachmentTexelSize));
     handlemap_VkExtent2D(handlemap, (VkExtent2D*)(&toMap->maxFragmentSize));
 }
 
 void handlemap_VkPhysicalDeviceFragmentShadingRateKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceFragmentShadingRateKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceFragmentShadingRateKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap_VkExtent2D(handlemap, (VkExtent2D*)(&toMap->fragmentSize));
@@ -4585,14 +3536,11 @@
 #ifdef VK_KHR_spirv_1_4
 #endif
 #ifdef VK_KHR_surface_protected_capabilities
-void handlemap_VkSurfaceProtectedCapabilitiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkSurfaceProtectedCapabilitiesKHR* toMap)
-{
+void handlemap_VkSurfaceProtectedCapabilitiesKHR(VulkanHandleMapping* handlemap,
+                                                 VkSurfaceProtectedCapabilitiesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -4602,13 +3550,10 @@
 #endif
 #ifdef VK_KHR_present_wait
 void handlemap_VkPhysicalDevicePresentWaitFeaturesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDevicePresentWaitFeaturesKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDevicePresentWaitFeaturesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -4623,83 +3568,64 @@
 #ifdef VK_KHR_pipeline_executable_properties
 void handlemap_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(
     VulkanHandleMapping* handlemap,
-    VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* toMap)
-{
+    VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkPipelineInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkPipelineInfoKHR* toMap)
-{
+void handlemap_VkPipelineInfoKHR(VulkanHandleMapping* handlemap, VkPipelineInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkPipeline((VkPipeline*)&toMap->pipeline);
 }
 
-void handlemap_VkPipelineExecutablePropertiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPipelineExecutablePropertiesKHR* toMap)
-{
+void handlemap_VkPipelineExecutablePropertiesKHR(VulkanHandleMapping* handlemap,
+                                                 VkPipelineExecutablePropertiesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkPipelineExecutableInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkPipelineExecutableInfoKHR* toMap)
-{
+void handlemap_VkPipelineExecutableInfoKHR(VulkanHandleMapping* handlemap,
+                                           VkPipelineExecutableInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkPipeline((VkPipeline*)&toMap->pipeline);
 }
 
-void handlemap_VkPipelineExecutableStatisticValueKHR(
-    VulkanHandleMapping* handlemap,
-    VkPipelineExecutableStatisticValueKHR* toMap)
-{
+void handlemap_VkPipelineExecutableStatisticValueKHR(VulkanHandleMapping* handlemap,
+                                                     VkPipelineExecutableStatisticValueKHR* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkPipelineExecutableStatisticKHR(
-    VulkanHandleMapping* handlemap,
-    VkPipelineExecutableStatisticKHR* toMap)
-{
+void handlemap_VkPipelineExecutableStatisticKHR(VulkanHandleMapping* handlemap,
+                                                VkPipelineExecutableStatisticKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap_VkPipelineExecutableStatisticValueKHR(handlemap, (VkPipelineExecutableStatisticValueKHR*)(&toMap->value));
+    handlemap_VkPipelineExecutableStatisticValueKHR(
+        handlemap, (VkPipelineExecutableStatisticValueKHR*)(&toMap->value));
 }
 
 void handlemap_VkPipelineExecutableInternalRepresentationKHR(
-    VulkanHandleMapping* handlemap,
-    VkPipelineExecutableInternalRepresentationKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPipelineExecutableInternalRepresentationKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -4707,43 +3633,33 @@
 #endif
 #ifdef VK_KHR_shader_integer_dot_product
 void handlemap_VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_KHR_pipeline_library
-void handlemap_VkPipelineLibraryCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkPipelineLibraryCreateInfoKHR* toMap)
-{
+void handlemap_VkPipelineLibraryCreateInfoKHR(VulkanHandleMapping* handlemap,
+                                              VkPipelineLibraryCreateInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap->pLibraries)
-    {
+    if (toMap->pLibraries) {
         handlemap->mapHandles_VkPipeline((VkPipeline*)toMap->pLibraries, toMap->libraryCount);
     }
 }
@@ -4752,256 +3668,196 @@
 #ifdef VK_KHR_shader_non_semantic_info
 #endif
 #ifdef VK_KHR_present_id
-void handlemap_VkPresentIdKHR(
-    VulkanHandleMapping* handlemap,
-    VkPresentIdKHR* toMap)
-{
+void handlemap_VkPresentIdKHR(VulkanHandleMapping* handlemap, VkPresentIdKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkPhysicalDevicePresentIdFeaturesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDevicePresentIdFeaturesKHR* toMap)
-{
+void handlemap_VkPhysicalDevicePresentIdFeaturesKHR(VulkanHandleMapping* handlemap,
+                                                    VkPhysicalDevicePresentIdFeaturesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_KHR_video_encode_queue
-void handlemap_VkVideoEncodeInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeInfoKHR* toMap)
-{
+void handlemap_VkVideoEncodeInfoKHR(VulkanHandleMapping* handlemap, VkVideoEncodeInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap_VkExtent2D(handlemap, (VkExtent2D*)(&toMap->codedExtent));
     handlemap->mapHandles_VkBuffer((VkBuffer*)&toMap->dstBitstreamBuffer);
-    handlemap_VkVideoPictureResourceKHR(handlemap, (VkVideoPictureResourceKHR*)(&toMap->srcPictureResource));
-    if (toMap->pSetupReferenceSlot)
-    {
-        handlemap_VkVideoReferenceSlotKHR(handlemap, (VkVideoReferenceSlotKHR*)(toMap->pSetupReferenceSlot));
+    handlemap_VkVideoPictureResourceKHR(handlemap,
+                                        (VkVideoPictureResourceKHR*)(&toMap->srcPictureResource));
+    if (toMap->pSetupReferenceSlot) {
+        handlemap_VkVideoReferenceSlotKHR(handlemap,
+                                          (VkVideoReferenceSlotKHR*)(toMap->pSetupReferenceSlot));
     }
-    if (toMap)
-    {
-        if (toMap->pReferenceSlots)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->referenceSlotCount; ++i)
-            {
-                handlemap_VkVideoReferenceSlotKHR(handlemap, (VkVideoReferenceSlotKHR*)(toMap->pReferenceSlots + i));
+    if (toMap) {
+        if (toMap->pReferenceSlots) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->referenceSlotCount; ++i) {
+                handlemap_VkVideoReferenceSlotKHR(
+                    handlemap, (VkVideoReferenceSlotKHR*)(toMap->pReferenceSlots + i));
             }
         }
     }
 }
 
-void handlemap_VkVideoEncodeRateControlInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeRateControlInfoKHR* toMap)
-{
+void handlemap_VkVideoEncodeRateControlInfoKHR(VulkanHandleMapping* handlemap,
+                                               VkVideoEncodeRateControlInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_KHR_synchronization2
-void handlemap_VkMemoryBarrier2KHR(
-    VulkanHandleMapping* handlemap,
-    VkMemoryBarrier2KHR* toMap)
-{
+void handlemap_VkMemoryBarrier2KHR(VulkanHandleMapping* handlemap, VkMemoryBarrier2KHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkBufferMemoryBarrier2KHR(
-    VulkanHandleMapping* handlemap,
-    VkBufferMemoryBarrier2KHR* toMap)
-{
+void handlemap_VkBufferMemoryBarrier2KHR(VulkanHandleMapping* handlemap,
+                                         VkBufferMemoryBarrier2KHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkBuffer((VkBuffer*)&toMap->buffer);
 }
 
-void handlemap_VkImageMemoryBarrier2KHR(
-    VulkanHandleMapping* handlemap,
-    VkImageMemoryBarrier2KHR* toMap)
-{
+void handlemap_VkImageMemoryBarrier2KHR(VulkanHandleMapping* handlemap,
+                                        VkImageMemoryBarrier2KHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkImage((VkImage*)&toMap->image);
-    handlemap_VkImageSubresourceRange(handlemap, (VkImageSubresourceRange*)(&toMap->subresourceRange));
+    handlemap_VkImageSubresourceRange(handlemap,
+                                      (VkImageSubresourceRange*)(&toMap->subresourceRange));
 }
 
-void handlemap_VkDependencyInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkDependencyInfoKHR* toMap)
-{
+void handlemap_VkDependencyInfoKHR(VulkanHandleMapping* handlemap, VkDependencyInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pMemoryBarriers)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->memoryBarrierCount; ++i)
-            {
-                handlemap_VkMemoryBarrier2KHR(handlemap, (VkMemoryBarrier2KHR*)(toMap->pMemoryBarriers + i));
+    if (toMap) {
+        if (toMap->pMemoryBarriers) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->memoryBarrierCount; ++i) {
+                handlemap_VkMemoryBarrier2KHR(handlemap,
+                                              (VkMemoryBarrier2KHR*)(toMap->pMemoryBarriers + i));
             }
         }
     }
-    if (toMap)
-    {
-        if (toMap->pBufferMemoryBarriers)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->bufferMemoryBarrierCount; ++i)
-            {
-                handlemap_VkBufferMemoryBarrier2KHR(handlemap, (VkBufferMemoryBarrier2KHR*)(toMap->pBufferMemoryBarriers + i));
+    if (toMap) {
+        if (toMap->pBufferMemoryBarriers) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->bufferMemoryBarrierCount; ++i) {
+                handlemap_VkBufferMemoryBarrier2KHR(
+                    handlemap, (VkBufferMemoryBarrier2KHR*)(toMap->pBufferMemoryBarriers + i));
             }
         }
     }
-    if (toMap)
-    {
-        if (toMap->pImageMemoryBarriers)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->imageMemoryBarrierCount; ++i)
-            {
-                handlemap_VkImageMemoryBarrier2KHR(handlemap, (VkImageMemoryBarrier2KHR*)(toMap->pImageMemoryBarriers + i));
+    if (toMap) {
+        if (toMap->pImageMemoryBarriers) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->imageMemoryBarrierCount; ++i) {
+                handlemap_VkImageMemoryBarrier2KHR(
+                    handlemap, (VkImageMemoryBarrier2KHR*)(toMap->pImageMemoryBarriers + i));
             }
         }
     }
 }
 
-void handlemap_VkSemaphoreSubmitInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkSemaphoreSubmitInfoKHR* toMap)
-{
+void handlemap_VkSemaphoreSubmitInfoKHR(VulkanHandleMapping* handlemap,
+                                        VkSemaphoreSubmitInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkSemaphore((VkSemaphore*)&toMap->semaphore);
 }
 
-void handlemap_VkCommandBufferSubmitInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkCommandBufferSubmitInfoKHR* toMap)
-{
+void handlemap_VkCommandBufferSubmitInfoKHR(VulkanHandleMapping* handlemap,
+                                            VkCommandBufferSubmitInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkCommandBuffer((VkCommandBuffer*)&toMap->commandBuffer);
 }
 
-void handlemap_VkSubmitInfo2KHR(
-    VulkanHandleMapping* handlemap,
-    VkSubmitInfo2KHR* toMap)
-{
+void handlemap_VkSubmitInfo2KHR(VulkanHandleMapping* handlemap, VkSubmitInfo2KHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pWaitSemaphoreInfos)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->waitSemaphoreInfoCount; ++i)
-            {
-                handlemap_VkSemaphoreSubmitInfoKHR(handlemap, (VkSemaphoreSubmitInfoKHR*)(toMap->pWaitSemaphoreInfos + i));
+    if (toMap) {
+        if (toMap->pWaitSemaphoreInfos) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->waitSemaphoreInfoCount; ++i) {
+                handlemap_VkSemaphoreSubmitInfoKHR(
+                    handlemap, (VkSemaphoreSubmitInfoKHR*)(toMap->pWaitSemaphoreInfos + i));
             }
         }
     }
-    if (toMap)
-    {
-        if (toMap->pCommandBufferInfos)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->commandBufferInfoCount; ++i)
-            {
-                handlemap_VkCommandBufferSubmitInfoKHR(handlemap, (VkCommandBufferSubmitInfoKHR*)(toMap->pCommandBufferInfos + i));
+    if (toMap) {
+        if (toMap->pCommandBufferInfos) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->commandBufferInfoCount; ++i) {
+                handlemap_VkCommandBufferSubmitInfoKHR(
+                    handlemap, (VkCommandBufferSubmitInfoKHR*)(toMap->pCommandBufferInfos + i));
             }
         }
     }
-    if (toMap)
-    {
-        if (toMap->pSignalSemaphoreInfos)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->signalSemaphoreInfoCount; ++i)
-            {
-                handlemap_VkSemaphoreSubmitInfoKHR(handlemap, (VkSemaphoreSubmitInfoKHR*)(toMap->pSignalSemaphoreInfos + i));
+    if (toMap) {
+        if (toMap->pSignalSemaphoreInfos) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->signalSemaphoreInfoCount; ++i) {
+                handlemap_VkSemaphoreSubmitInfoKHR(
+                    handlemap, (VkSemaphoreSubmitInfoKHR*)(toMap->pSignalSemaphoreInfos + i));
             }
         }
     }
 }
 
 void handlemap_VkPhysicalDeviceSynchronization2FeaturesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceSynchronization2FeaturesKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceSynchronization2FeaturesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkQueueFamilyCheckpointProperties2NV(
-    VulkanHandleMapping* handlemap,
-    VkQueueFamilyCheckpointProperties2NV* toMap)
-{
+void handlemap_VkQueueFamilyCheckpointProperties2NV(VulkanHandleMapping* handlemap,
+                                                    VkQueueFamilyCheckpointProperties2NV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkCheckpointData2NV(
-    VulkanHandleMapping* handlemap,
-    VkCheckpointData2NV* toMap)
-{
+void handlemap_VkCheckpointData2NV(VulkanHandleMapping* handlemap, VkCheckpointData2NV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -5010,12 +3866,10 @@
 #ifdef VK_KHR_shader_subgroup_uniform_control_flow
 void handlemap_VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR(
     VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR* toMap)
-{
+    VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -5024,12 +3878,10 @@
 #ifdef VK_KHR_zero_initialize_workgroup_memory
 void handlemap_VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR(
     VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR* toMap)
-{
+    VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -5038,239 +3890,185 @@
 #ifdef VK_KHR_workgroup_memory_explicit_layout
 void handlemap_VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR(
     VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR* toMap)
-{
+    VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_KHR_copy_commands2
-void handlemap_VkBufferCopy2KHR(
-    VulkanHandleMapping* handlemap,
-    VkBufferCopy2KHR* toMap)
-{
+void handlemap_VkBufferCopy2KHR(VulkanHandleMapping* handlemap, VkBufferCopy2KHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkCopyBufferInfo2KHR(
-    VulkanHandleMapping* handlemap,
-    VkCopyBufferInfo2KHR* toMap)
-{
+void handlemap_VkCopyBufferInfo2KHR(VulkanHandleMapping* handlemap, VkCopyBufferInfo2KHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkBuffer((VkBuffer*)&toMap->srcBuffer);
     handlemap->mapHandles_VkBuffer((VkBuffer*)&toMap->dstBuffer);
-    if (toMap)
-    {
-        if (toMap->pRegions)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->regionCount; ++i)
-            {
+    if (toMap) {
+        if (toMap->pRegions) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->regionCount; ++i) {
                 handlemap_VkBufferCopy2KHR(handlemap, (VkBufferCopy2KHR*)(toMap->pRegions + i));
             }
         }
     }
 }
 
-void handlemap_VkImageCopy2KHR(
-    VulkanHandleMapping* handlemap,
-    VkImageCopy2KHR* toMap)
-{
+void handlemap_VkImageCopy2KHR(VulkanHandleMapping* handlemap, VkImageCopy2KHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap_VkImageSubresourceLayers(handlemap, (VkImageSubresourceLayers*)(&toMap->srcSubresource));
+    handlemap_VkImageSubresourceLayers(handlemap,
+                                       (VkImageSubresourceLayers*)(&toMap->srcSubresource));
     handlemap_VkOffset3D(handlemap, (VkOffset3D*)(&toMap->srcOffset));
-    handlemap_VkImageSubresourceLayers(handlemap, (VkImageSubresourceLayers*)(&toMap->dstSubresource));
+    handlemap_VkImageSubresourceLayers(handlemap,
+                                       (VkImageSubresourceLayers*)(&toMap->dstSubresource));
     handlemap_VkOffset3D(handlemap, (VkOffset3D*)(&toMap->dstOffset));
     handlemap_VkExtent3D(handlemap, (VkExtent3D*)(&toMap->extent));
 }
 
-void handlemap_VkCopyImageInfo2KHR(
-    VulkanHandleMapping* handlemap,
-    VkCopyImageInfo2KHR* toMap)
-{
+void handlemap_VkCopyImageInfo2KHR(VulkanHandleMapping* handlemap, VkCopyImageInfo2KHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkImage((VkImage*)&toMap->srcImage);
     handlemap->mapHandles_VkImage((VkImage*)&toMap->dstImage);
-    if (toMap)
-    {
-        if (toMap->pRegions)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->regionCount; ++i)
-            {
+    if (toMap) {
+        if (toMap->pRegions) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->regionCount; ++i) {
                 handlemap_VkImageCopy2KHR(handlemap, (VkImageCopy2KHR*)(toMap->pRegions + i));
             }
         }
     }
 }
 
-void handlemap_VkBufferImageCopy2KHR(
-    VulkanHandleMapping* handlemap,
-    VkBufferImageCopy2KHR* toMap)
-{
+void handlemap_VkBufferImageCopy2KHR(VulkanHandleMapping* handlemap, VkBufferImageCopy2KHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap_VkImageSubresourceLayers(handlemap, (VkImageSubresourceLayers*)(&toMap->imageSubresource));
+    handlemap_VkImageSubresourceLayers(handlemap,
+                                       (VkImageSubresourceLayers*)(&toMap->imageSubresource));
     handlemap_VkOffset3D(handlemap, (VkOffset3D*)(&toMap->imageOffset));
     handlemap_VkExtent3D(handlemap, (VkExtent3D*)(&toMap->imageExtent));
 }
 
-void handlemap_VkCopyBufferToImageInfo2KHR(
-    VulkanHandleMapping* handlemap,
-    VkCopyBufferToImageInfo2KHR* toMap)
-{
+void handlemap_VkCopyBufferToImageInfo2KHR(VulkanHandleMapping* handlemap,
+                                           VkCopyBufferToImageInfo2KHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkBuffer((VkBuffer*)&toMap->srcBuffer);
     handlemap->mapHandles_VkImage((VkImage*)&toMap->dstImage);
-    if (toMap)
-    {
-        if (toMap->pRegions)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->regionCount; ++i)
-            {
-                handlemap_VkBufferImageCopy2KHR(handlemap, (VkBufferImageCopy2KHR*)(toMap->pRegions + i));
+    if (toMap) {
+        if (toMap->pRegions) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->regionCount; ++i) {
+                handlemap_VkBufferImageCopy2KHR(handlemap,
+                                                (VkBufferImageCopy2KHR*)(toMap->pRegions + i));
             }
         }
     }
 }
 
-void handlemap_VkCopyImageToBufferInfo2KHR(
-    VulkanHandleMapping* handlemap,
-    VkCopyImageToBufferInfo2KHR* toMap)
-{
+void handlemap_VkCopyImageToBufferInfo2KHR(VulkanHandleMapping* handlemap,
+                                           VkCopyImageToBufferInfo2KHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkImage((VkImage*)&toMap->srcImage);
     handlemap->mapHandles_VkBuffer((VkBuffer*)&toMap->dstBuffer);
-    if (toMap)
-    {
-        if (toMap->pRegions)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->regionCount; ++i)
-            {
-                handlemap_VkBufferImageCopy2KHR(handlemap, (VkBufferImageCopy2KHR*)(toMap->pRegions + i));
+    if (toMap) {
+        if (toMap->pRegions) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->regionCount; ++i) {
+                handlemap_VkBufferImageCopy2KHR(handlemap,
+                                                (VkBufferImageCopy2KHR*)(toMap->pRegions + i));
             }
         }
     }
 }
 
-void handlemap_VkImageBlit2KHR(
-    VulkanHandleMapping* handlemap,
-    VkImageBlit2KHR* toMap)
-{
+void handlemap_VkImageBlit2KHR(VulkanHandleMapping* handlemap, VkImageBlit2KHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap_VkImageSubresourceLayers(handlemap, (VkImageSubresourceLayers*)(&toMap->srcSubresource));
-    for (uint32_t i = 0; i < (uint32_t)2; ++i)
-    {
+    handlemap_VkImageSubresourceLayers(handlemap,
+                                       (VkImageSubresourceLayers*)(&toMap->srcSubresource));
+    for (uint32_t i = 0; i < (uint32_t)2; ++i) {
         handlemap_VkOffset3D(handlemap, (VkOffset3D*)(toMap->srcOffsets + i));
     }
-    handlemap_VkImageSubresourceLayers(handlemap, (VkImageSubresourceLayers*)(&toMap->dstSubresource));
-    for (uint32_t i = 0; i < (uint32_t)2; ++i)
-    {
+    handlemap_VkImageSubresourceLayers(handlemap,
+                                       (VkImageSubresourceLayers*)(&toMap->dstSubresource));
+    for (uint32_t i = 0; i < (uint32_t)2; ++i) {
         handlemap_VkOffset3D(handlemap, (VkOffset3D*)(toMap->dstOffsets + i));
     }
 }
 
-void handlemap_VkBlitImageInfo2KHR(
-    VulkanHandleMapping* handlemap,
-    VkBlitImageInfo2KHR* toMap)
-{
+void handlemap_VkBlitImageInfo2KHR(VulkanHandleMapping* handlemap, VkBlitImageInfo2KHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkImage((VkImage*)&toMap->srcImage);
     handlemap->mapHandles_VkImage((VkImage*)&toMap->dstImage);
-    if (toMap)
-    {
-        if (toMap->pRegions)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->regionCount; ++i)
-            {
+    if (toMap) {
+        if (toMap->pRegions) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->regionCount; ++i) {
                 handlemap_VkImageBlit2KHR(handlemap, (VkImageBlit2KHR*)(toMap->pRegions + i));
             }
         }
     }
 }
 
-void handlemap_VkImageResolve2KHR(
-    VulkanHandleMapping* handlemap,
-    VkImageResolve2KHR* toMap)
-{
+void handlemap_VkImageResolve2KHR(VulkanHandleMapping* handlemap, VkImageResolve2KHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap_VkImageSubresourceLayers(handlemap, (VkImageSubresourceLayers*)(&toMap->srcSubresource));
+    handlemap_VkImageSubresourceLayers(handlemap,
+                                       (VkImageSubresourceLayers*)(&toMap->srcSubresource));
     handlemap_VkOffset3D(handlemap, (VkOffset3D*)(&toMap->srcOffset));
-    handlemap_VkImageSubresourceLayers(handlemap, (VkImageSubresourceLayers*)(&toMap->dstSubresource));
+    handlemap_VkImageSubresourceLayers(handlemap,
+                                       (VkImageSubresourceLayers*)(&toMap->dstSubresource));
     handlemap_VkOffset3D(handlemap, (VkOffset3D*)(&toMap->dstOffset));
     handlemap_VkExtent3D(handlemap, (VkExtent3D*)(&toMap->extent));
 }
 
-void handlemap_VkResolveImageInfo2KHR(
-    VulkanHandleMapping* handlemap,
-    VkResolveImageInfo2KHR* toMap)
-{
+void handlemap_VkResolveImageInfo2KHR(VulkanHandleMapping* handlemap,
+                                      VkResolveImageInfo2KHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkImage((VkImage*)&toMap->srcImage);
     handlemap->mapHandles_VkImage((VkImage*)&toMap->dstImage);
-    if (toMap)
-    {
-        if (toMap->pRegions)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->regionCount; ++i)
-            {
+    if (toMap) {
+        if (toMap->pRegions) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->regionCount; ++i) {
                 handlemap_VkImageResolve2KHR(handlemap, (VkImageResolve2KHR*)(toMap->pRegions + i));
             }
         }
@@ -5279,14 +4077,11 @@
 
 #endif
 #ifdef VK_KHR_format_feature_flags2
-void handlemap_VkFormatProperties3KHR(
-    VulkanHandleMapping* handlemap,
-    VkFormatProperties3KHR* toMap)
-{
+void handlemap_VkFormatProperties3KHR(VulkanHandleMapping* handlemap,
+                                      VkFormatProperties3KHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -5294,85 +4089,64 @@
 #endif
 #ifdef VK_KHR_maintenance4
 void handlemap_VkPhysicalDeviceMaintenance4FeaturesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceMaintenance4FeaturesKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceMaintenance4FeaturesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceMaintenance4PropertiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceMaintenance4PropertiesKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceMaintenance4PropertiesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkDeviceBufferMemoryRequirementsKHR(
-    VulkanHandleMapping* handlemap,
-    VkDeviceBufferMemoryRequirementsKHR* toMap)
-{
+void handlemap_VkDeviceBufferMemoryRequirementsKHR(VulkanHandleMapping* handlemap,
+                                                   VkDeviceBufferMemoryRequirementsKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap->pCreateInfo)
-    {
+    if (toMap->pCreateInfo) {
         handlemap_VkBufferCreateInfo(handlemap, (VkBufferCreateInfo*)(toMap->pCreateInfo));
     }
 }
 
-void handlemap_VkDeviceImageMemoryRequirementsKHR(
-    VulkanHandleMapping* handlemap,
-    VkDeviceImageMemoryRequirementsKHR* toMap)
-{
+void handlemap_VkDeviceImageMemoryRequirementsKHR(VulkanHandleMapping* handlemap,
+                                                  VkDeviceImageMemoryRequirementsKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap->pCreateInfo)
-    {
+    if (toMap->pCreateInfo) {
         handlemap_VkImageCreateInfo(handlemap, (VkImageCreateInfo*)(toMap->pCreateInfo));
     }
 }
 
 #endif
 #ifdef VK_ANDROID_native_buffer
-void handlemap_VkNativeBufferANDROID(
-    VulkanHandleMapping* handlemap,
-    VkNativeBufferANDROID* toMap)
-{
+void handlemap_VkNativeBufferANDROID(VulkanHandleMapping* handlemap, VkNativeBufferANDROID* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_debug_report
-void handlemap_VkDebugReportCallbackCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkDebugReportCallbackCreateInfoEXT* toMap)
-{
+void handlemap_VkDebugReportCallbackCreateInfoEXT(VulkanHandleMapping* handlemap,
+                                                  VkDebugReportCallbackCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -5386,13 +4160,10 @@
 #endif
 #ifdef VK_AMD_rasterization_order
 void handlemap_VkPipelineRasterizationStateRasterizationOrderAMD(
-    VulkanHandleMapping* handlemap,
-    VkPipelineRasterizationStateRasterizationOrderAMD* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPipelineRasterizationStateRasterizationOrderAMD* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -5403,38 +4174,29 @@
 #ifdef VK_AMD_shader_explicit_vertex_parameter
 #endif
 #ifdef VK_EXT_debug_marker
-void handlemap_VkDebugMarkerObjectNameInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkDebugMarkerObjectNameInfoEXT* toMap)
-{
+void handlemap_VkDebugMarkerObjectNameInfoEXT(VulkanHandleMapping* handlemap,
+                                              VkDebugMarkerObjectNameInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkDebugMarkerObjectTagInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkDebugMarkerObjectTagInfoEXT* toMap)
-{
+void handlemap_VkDebugMarkerObjectTagInfoEXT(VulkanHandleMapping* handlemap,
+                                             VkDebugMarkerObjectTagInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkDebugMarkerMarkerInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkDebugMarkerMarkerInfoEXT* toMap)
-{
+void handlemap_VkDebugMarkerMarkerInfoEXT(VulkanHandleMapping* handlemap,
+                                          VkDebugMarkerMarkerInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -5444,37 +4206,28 @@
 #endif
 #ifdef VK_NV_dedicated_allocation
 void handlemap_VkDedicatedAllocationImageCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkDedicatedAllocationImageCreateInfoNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkDedicatedAllocationImageCreateInfoNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkDedicatedAllocationBufferCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkDedicatedAllocationBufferCreateInfoNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkDedicatedAllocationBufferCreateInfoNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkDedicatedAllocationMemoryAllocateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkDedicatedAllocationMemoryAllocateInfoNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkDedicatedAllocationMemoryAllocateInfoNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkImage((VkImage*)&toMap->image);
@@ -5484,76 +4237,57 @@
 #endif
 #ifdef VK_EXT_transform_feedback
 void handlemap_VkPhysicalDeviceTransformFeedbackFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceTransformFeedbackFeaturesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceTransformFeedbackFeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceTransformFeedbackPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceTransformFeedbackPropertiesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceTransformFeedbackPropertiesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPipelineRasterizationStateStreamCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkPipelineRasterizationStateStreamCreateInfoEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPipelineRasterizationStateStreamCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_NVX_binary_import
-void handlemap_VkCuModuleCreateInfoNVX(
-    VulkanHandleMapping* handlemap,
-    VkCuModuleCreateInfoNVX* toMap)
-{
+void handlemap_VkCuModuleCreateInfoNVX(VulkanHandleMapping* handlemap,
+                                       VkCuModuleCreateInfoNVX* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkCuFunctionCreateInfoNVX(
-    VulkanHandleMapping* handlemap,
-    VkCuFunctionCreateInfoNVX* toMap)
-{
+void handlemap_VkCuFunctionCreateInfoNVX(VulkanHandleMapping* handlemap,
+                                         VkCuFunctionCreateInfoNVX* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkCuModuleNVX((VkCuModuleNVX*)&toMap->module);
 }
 
-void handlemap_VkCuLaunchInfoNVX(
-    VulkanHandleMapping* handlemap,
-    VkCuLaunchInfoNVX* toMap)
-{
+void handlemap_VkCuLaunchInfoNVX(VulkanHandleMapping* handlemap, VkCuLaunchInfoNVX* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkCuFunctionNVX((VkCuFunctionNVX*)&toMap->function);
@@ -5561,28 +4295,22 @@
 
 #endif
 #ifdef VK_NVX_image_view_handle
-void handlemap_VkImageViewHandleInfoNVX(
-    VulkanHandleMapping* handlemap,
-    VkImageViewHandleInfoNVX* toMap)
-{
+void handlemap_VkImageViewHandleInfoNVX(VulkanHandleMapping* handlemap,
+                                        VkImageViewHandleInfoNVX* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkImageView((VkImageView*)&toMap->imageView);
     handlemap->mapHandles_VkSampler((VkSampler*)&toMap->sampler);
 }
 
-void handlemap_VkImageViewAddressPropertiesNVX(
-    VulkanHandleMapping* handlemap,
-    VkImageViewAddressPropertiesNVX* toMap)
-{
+void handlemap_VkImageViewAddressPropertiesNVX(VulkanHandleMapping* handlemap,
+                                               VkImageViewAddressPropertiesNVX* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -5597,490 +4325,396 @@
 #ifdef VK_AMD_shader_ballot
 #endif
 #ifdef VK_EXT_video_encode_h264
-void handlemap_VkVideoEncodeH264CapabilitiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH264CapabilitiesEXT* toMap)
-{
+void handlemap_VkVideoEncodeH264CapabilitiesEXT(VulkanHandleMapping* handlemap,
+                                                VkVideoEncodeH264CapabilitiesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap_VkExtent2D(handlemap, (VkExtent2D*)(&toMap->minPictureSizeInMbs));
     handlemap_VkExtent2D(handlemap, (VkExtent2D*)(&toMap->maxPictureSizeInMbs));
     handlemap_VkExtent2D(handlemap, (VkExtent2D*)(&toMap->inputImageDataAlignment));
-    handlemap_VkExtensionProperties(handlemap, (VkExtensionProperties*)(&toMap->stdExtensionVersion));
+    handlemap_VkExtensionProperties(handlemap,
+                                    (VkExtensionProperties*)(&toMap->stdExtensionVersion));
 }
 
-void handlemap_VkVideoEncodeH264SessionCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH264SessionCreateInfoEXT* toMap)
-{
+void handlemap_VkVideoEncodeH264SessionCreateInfoEXT(VulkanHandleMapping* handlemap,
+                                                     VkVideoEncodeH264SessionCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap_VkExtent2D(handlemap, (VkExtent2D*)(&toMap->maxPictureSizeInMbs));
-    if (toMap->pStdExtensionVersion)
-    {
-        handlemap_VkExtensionProperties(handlemap, (VkExtensionProperties*)(toMap->pStdExtensionVersion));
+    if (toMap->pStdExtensionVersion) {
+        handlemap_VkExtensionProperties(handlemap,
+                                        (VkExtensionProperties*)(toMap->pStdExtensionVersion));
     }
 }
 
 void handlemap_VkVideoEncodeH264SessionParametersAddInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH264SessionParametersAddInfoEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkVideoEncodeH264SessionParametersAddInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkVideoEncodeH264SessionParametersCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH264SessionParametersCreateInfoEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkVideoEncodeH264SessionParametersCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap->pParametersAddInfo)
-    {
-        handlemap_VkVideoEncodeH264SessionParametersAddInfoEXT(handlemap, (VkVideoEncodeH264SessionParametersAddInfoEXT*)(toMap->pParametersAddInfo));
+    if (toMap->pParametersAddInfo) {
+        handlemap_VkVideoEncodeH264SessionParametersAddInfoEXT(
+            handlemap, (VkVideoEncodeH264SessionParametersAddInfoEXT*)(toMap->pParametersAddInfo));
     }
 }
 
-void handlemap_VkVideoEncodeH264DpbSlotInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH264DpbSlotInfoEXT* toMap)
-{
+void handlemap_VkVideoEncodeH264DpbSlotInfoEXT(VulkanHandleMapping* handlemap,
+                                               VkVideoEncodeH264DpbSlotInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkVideoEncodeH264NaluSliceEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH264NaluSliceEXT* toMap)
-{
+void handlemap_VkVideoEncodeH264NaluSliceEXT(VulkanHandleMapping* handlemap,
+                                             VkVideoEncodeH264NaluSliceEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pRefFinalList0Entries)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->refFinalList0EntryCount; ++i)
-            {
-                handlemap_VkVideoEncodeH264DpbSlotInfoEXT(handlemap, (VkVideoEncodeH264DpbSlotInfoEXT*)(toMap->pRefFinalList0Entries + i));
+    if (toMap) {
+        if (toMap->pRefFinalList0Entries) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->refFinalList0EntryCount; ++i) {
+                handlemap_VkVideoEncodeH264DpbSlotInfoEXT(
+                    handlemap,
+                    (VkVideoEncodeH264DpbSlotInfoEXT*)(toMap->pRefFinalList0Entries + i));
             }
         }
     }
-    if (toMap)
-    {
-        if (toMap->pRefFinalList1Entries)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->refFinalList1EntryCount; ++i)
-            {
-                handlemap_VkVideoEncodeH264DpbSlotInfoEXT(handlemap, (VkVideoEncodeH264DpbSlotInfoEXT*)(toMap->pRefFinalList1Entries + i));
+    if (toMap) {
+        if (toMap->pRefFinalList1Entries) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->refFinalList1EntryCount; ++i) {
+                handlemap_VkVideoEncodeH264DpbSlotInfoEXT(
+                    handlemap,
+                    (VkVideoEncodeH264DpbSlotInfoEXT*)(toMap->pRefFinalList1Entries + i));
             }
         }
     }
 }
 
-void handlemap_VkVideoEncodeH264VclFrameInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH264VclFrameInfoEXT* toMap)
-{
+void handlemap_VkVideoEncodeH264VclFrameInfoEXT(VulkanHandleMapping* handlemap,
+                                                VkVideoEncodeH264VclFrameInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pRefDefaultFinalList0Entries)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->refDefaultFinalList0EntryCount; ++i)
-            {
-                handlemap_VkVideoEncodeH264DpbSlotInfoEXT(handlemap, (VkVideoEncodeH264DpbSlotInfoEXT*)(toMap->pRefDefaultFinalList0Entries + i));
+    if (toMap) {
+        if (toMap->pRefDefaultFinalList0Entries) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->refDefaultFinalList0EntryCount; ++i) {
+                handlemap_VkVideoEncodeH264DpbSlotInfoEXT(
+                    handlemap,
+                    (VkVideoEncodeH264DpbSlotInfoEXT*)(toMap->pRefDefaultFinalList0Entries + i));
             }
         }
     }
-    if (toMap)
-    {
-        if (toMap->pRefDefaultFinalList1Entries)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->refDefaultFinalList1EntryCount; ++i)
-            {
-                handlemap_VkVideoEncodeH264DpbSlotInfoEXT(handlemap, (VkVideoEncodeH264DpbSlotInfoEXT*)(toMap->pRefDefaultFinalList1Entries + i));
+    if (toMap) {
+        if (toMap->pRefDefaultFinalList1Entries) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->refDefaultFinalList1EntryCount; ++i) {
+                handlemap_VkVideoEncodeH264DpbSlotInfoEXT(
+                    handlemap,
+                    (VkVideoEncodeH264DpbSlotInfoEXT*)(toMap->pRefDefaultFinalList1Entries + i));
             }
         }
     }
-    if (toMap)
-    {
-        if (toMap->pNaluSliceEntries)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->naluSliceEntryCount; ++i)
-            {
-                handlemap_VkVideoEncodeH264NaluSliceEXT(handlemap, (VkVideoEncodeH264NaluSliceEXT*)(toMap->pNaluSliceEntries + i));
+    if (toMap) {
+        if (toMap->pNaluSliceEntries) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->naluSliceEntryCount; ++i) {
+                handlemap_VkVideoEncodeH264NaluSliceEXT(
+                    handlemap, (VkVideoEncodeH264NaluSliceEXT*)(toMap->pNaluSliceEntries + i));
             }
         }
     }
-    if (toMap->pCurrentPictureInfo)
-    {
-        handlemap_VkVideoEncodeH264DpbSlotInfoEXT(handlemap, (VkVideoEncodeH264DpbSlotInfoEXT*)(toMap->pCurrentPictureInfo));
+    if (toMap->pCurrentPictureInfo) {
+        handlemap_VkVideoEncodeH264DpbSlotInfoEXT(
+            handlemap, (VkVideoEncodeH264DpbSlotInfoEXT*)(toMap->pCurrentPictureInfo));
     }
 }
 
 void handlemap_VkVideoEncodeH264EmitPictureParametersEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH264EmitPictureParametersEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkVideoEncodeH264EmitPictureParametersEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkVideoEncodeH264ProfileEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH264ProfileEXT* toMap)
-{
+void handlemap_VkVideoEncodeH264ProfileEXT(VulkanHandleMapping* handlemap,
+                                           VkVideoEncodeH264ProfileEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_video_encode_h265
-void handlemap_VkVideoEncodeH265CapabilitiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH265CapabilitiesEXT* toMap)
-{
+void handlemap_VkVideoEncodeH265CapabilitiesEXT(VulkanHandleMapping* handlemap,
+                                                VkVideoEncodeH265CapabilitiesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap_VkExtent2D(handlemap, (VkExtent2D*)(&toMap->inputImageDataAlignment));
-    handlemap_VkExtensionProperties(handlemap, (VkExtensionProperties*)(&toMap->stdExtensionVersion));
+    handlemap_VkExtensionProperties(handlemap,
+                                    (VkExtensionProperties*)(&toMap->stdExtensionVersion));
 }
 
-void handlemap_VkVideoEncodeH265SessionCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH265SessionCreateInfoEXT* toMap)
-{
+void handlemap_VkVideoEncodeH265SessionCreateInfoEXT(VulkanHandleMapping* handlemap,
+                                                     VkVideoEncodeH265SessionCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap->pStdExtensionVersion)
-    {
-        handlemap_VkExtensionProperties(handlemap, (VkExtensionProperties*)(toMap->pStdExtensionVersion));
+    if (toMap->pStdExtensionVersion) {
+        handlemap_VkExtensionProperties(handlemap,
+                                        (VkExtensionProperties*)(toMap->pStdExtensionVersion));
     }
 }
 
 void handlemap_VkVideoEncodeH265SessionParametersAddInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH265SessionParametersAddInfoEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkVideoEncodeH265SessionParametersAddInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkVideoEncodeH265SessionParametersCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH265SessionParametersCreateInfoEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkVideoEncodeH265SessionParametersCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap->pParametersAddInfo)
-    {
-        handlemap_VkVideoEncodeH265SessionParametersAddInfoEXT(handlemap, (VkVideoEncodeH265SessionParametersAddInfoEXT*)(toMap->pParametersAddInfo));
+    if (toMap->pParametersAddInfo) {
+        handlemap_VkVideoEncodeH265SessionParametersAddInfoEXT(
+            handlemap, (VkVideoEncodeH265SessionParametersAddInfoEXT*)(toMap->pParametersAddInfo));
     }
 }
 
-void handlemap_VkVideoEncodeH265DpbSlotInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH265DpbSlotInfoEXT* toMap)
-{
+void handlemap_VkVideoEncodeH265DpbSlotInfoEXT(VulkanHandleMapping* handlemap,
+                                               VkVideoEncodeH265DpbSlotInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkVideoEncodeH265ReferenceListsEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH265ReferenceListsEXT* toMap)
-{
+void handlemap_VkVideoEncodeH265ReferenceListsEXT(VulkanHandleMapping* handlemap,
+                                                  VkVideoEncodeH265ReferenceListsEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pReferenceList0Entries)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->referenceList0EntryCount; ++i)
-            {
-                handlemap_VkVideoEncodeH265DpbSlotInfoEXT(handlemap, (VkVideoEncodeH265DpbSlotInfoEXT*)(toMap->pReferenceList0Entries + i));
+    if (toMap) {
+        if (toMap->pReferenceList0Entries) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->referenceList0EntryCount; ++i) {
+                handlemap_VkVideoEncodeH265DpbSlotInfoEXT(
+                    handlemap,
+                    (VkVideoEncodeH265DpbSlotInfoEXT*)(toMap->pReferenceList0Entries + i));
             }
         }
     }
-    if (toMap)
-    {
-        if (toMap->pReferenceList1Entries)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->referenceList1EntryCount; ++i)
-            {
-                handlemap_VkVideoEncodeH265DpbSlotInfoEXT(handlemap, (VkVideoEncodeH265DpbSlotInfoEXT*)(toMap->pReferenceList1Entries + i));
+    if (toMap) {
+        if (toMap->pReferenceList1Entries) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->referenceList1EntryCount; ++i) {
+                handlemap_VkVideoEncodeH265DpbSlotInfoEXT(
+                    handlemap,
+                    (VkVideoEncodeH265DpbSlotInfoEXT*)(toMap->pReferenceList1Entries + i));
             }
         }
     }
 }
 
-void handlemap_VkVideoEncodeH265NaluSliceEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH265NaluSliceEXT* toMap)
-{
+void handlemap_VkVideoEncodeH265NaluSliceEXT(VulkanHandleMapping* handlemap,
+                                             VkVideoEncodeH265NaluSliceEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap->pReferenceFinalLists)
-    {
-        handlemap_VkVideoEncodeH265ReferenceListsEXT(handlemap, (VkVideoEncodeH265ReferenceListsEXT*)(toMap->pReferenceFinalLists));
+    if (toMap->pReferenceFinalLists) {
+        handlemap_VkVideoEncodeH265ReferenceListsEXT(
+            handlemap, (VkVideoEncodeH265ReferenceListsEXT*)(toMap->pReferenceFinalLists));
     }
 }
 
-void handlemap_VkVideoEncodeH265VclFrameInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH265VclFrameInfoEXT* toMap)
-{
+void handlemap_VkVideoEncodeH265VclFrameInfoEXT(VulkanHandleMapping* handlemap,
+                                                VkVideoEncodeH265VclFrameInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap->pReferenceFinalLists)
-    {
-        handlemap_VkVideoEncodeH265ReferenceListsEXT(handlemap, (VkVideoEncodeH265ReferenceListsEXT*)(toMap->pReferenceFinalLists));
+    if (toMap->pReferenceFinalLists) {
+        handlemap_VkVideoEncodeH265ReferenceListsEXT(
+            handlemap, (VkVideoEncodeH265ReferenceListsEXT*)(toMap->pReferenceFinalLists));
     }
-    if (toMap)
-    {
-        if (toMap->pNaluSliceEntries)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->naluSliceEntryCount; ++i)
-            {
-                handlemap_VkVideoEncodeH265NaluSliceEXT(handlemap, (VkVideoEncodeH265NaluSliceEXT*)(toMap->pNaluSliceEntries + i));
+    if (toMap) {
+        if (toMap->pNaluSliceEntries) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->naluSliceEntryCount; ++i) {
+                handlemap_VkVideoEncodeH265NaluSliceEXT(
+                    handlemap, (VkVideoEncodeH265NaluSliceEXT*)(toMap->pNaluSliceEntries + i));
             }
         }
     }
 }
 
 void handlemap_VkVideoEncodeH265EmitPictureParametersEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH265EmitPictureParametersEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkVideoEncodeH265EmitPictureParametersEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkVideoEncodeH265ProfileEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH265ProfileEXT* toMap)
-{
+void handlemap_VkVideoEncodeH265ProfileEXT(VulkanHandleMapping* handlemap,
+                                           VkVideoEncodeH265ProfileEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_video_decode_h264
-void handlemap_VkVideoDecodeH264ProfileEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoDecodeH264ProfileEXT* toMap)
-{
+void handlemap_VkVideoDecodeH264ProfileEXT(VulkanHandleMapping* handlemap,
+                                           VkVideoDecodeH264ProfileEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkVideoDecodeH264CapabilitiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoDecodeH264CapabilitiesEXT* toMap)
-{
+void handlemap_VkVideoDecodeH264CapabilitiesEXT(VulkanHandleMapping* handlemap,
+                                                VkVideoDecodeH264CapabilitiesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap_VkOffset2D(handlemap, (VkOffset2D*)(&toMap->fieldOffsetGranularity));
-    handlemap_VkExtensionProperties(handlemap, (VkExtensionProperties*)(&toMap->stdExtensionVersion));
+    handlemap_VkExtensionProperties(handlemap,
+                                    (VkExtensionProperties*)(&toMap->stdExtensionVersion));
 }
 
-void handlemap_VkVideoDecodeH264SessionCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoDecodeH264SessionCreateInfoEXT* toMap)
-{
+void handlemap_VkVideoDecodeH264SessionCreateInfoEXT(VulkanHandleMapping* handlemap,
+                                                     VkVideoDecodeH264SessionCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap->pStdExtensionVersion)
-    {
-        handlemap_VkExtensionProperties(handlemap, (VkExtensionProperties*)(toMap->pStdExtensionVersion));
+    if (toMap->pStdExtensionVersion) {
+        handlemap_VkExtensionProperties(handlemap,
+                                        (VkExtensionProperties*)(toMap->pStdExtensionVersion));
     }
 }
 
 void handlemap_VkVideoDecodeH264SessionParametersAddInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoDecodeH264SessionParametersAddInfoEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkVideoDecodeH264SessionParametersAddInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkVideoDecodeH264SessionParametersCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoDecodeH264SessionParametersCreateInfoEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkVideoDecodeH264SessionParametersCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap->pParametersAddInfo)
-    {
-        handlemap_VkVideoDecodeH264SessionParametersAddInfoEXT(handlemap, (VkVideoDecodeH264SessionParametersAddInfoEXT*)(toMap->pParametersAddInfo));
+    if (toMap->pParametersAddInfo) {
+        handlemap_VkVideoDecodeH264SessionParametersAddInfoEXT(
+            handlemap, (VkVideoDecodeH264SessionParametersAddInfoEXT*)(toMap->pParametersAddInfo));
     }
 }
 
-void handlemap_VkVideoDecodeH264PictureInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoDecodeH264PictureInfoEXT* toMap)
-{
+void handlemap_VkVideoDecodeH264PictureInfoEXT(VulkanHandleMapping* handlemap,
+                                               VkVideoDecodeH264PictureInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkVideoDecodeH264MvcEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoDecodeH264MvcEXT* toMap)
-{
+void handlemap_VkVideoDecodeH264MvcEXT(VulkanHandleMapping* handlemap,
+                                       VkVideoDecodeH264MvcEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkVideoDecodeH264DpbSlotInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoDecodeH264DpbSlotInfoEXT* toMap)
-{
+void handlemap_VkVideoDecodeH264DpbSlotInfoEXT(VulkanHandleMapping* handlemap,
+                                               VkVideoDecodeH264DpbSlotInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_AMD_texture_gather_bias_lod
-void handlemap_VkTextureLODGatherFormatPropertiesAMD(
-    VulkanHandleMapping* handlemap,
-    VkTextureLODGatherFormatPropertiesAMD* toMap)
-{
+void handlemap_VkTextureLODGatherFormatPropertiesAMD(VulkanHandleMapping* handlemap,
+                                                     VkTextureLODGatherFormatPropertiesAMD* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_AMD_shader_info
-void handlemap_VkShaderResourceUsageAMD(
-    VulkanHandleMapping* handlemap,
-    VkShaderResourceUsageAMD* toMap)
-{
+void handlemap_VkShaderResourceUsageAMD(VulkanHandleMapping* handlemap,
+                                        VkShaderResourceUsageAMD* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkShaderStatisticsInfoAMD(
-    VulkanHandleMapping* handlemap,
-    VkShaderStatisticsInfoAMD* toMap)
-{
+void handlemap_VkShaderStatisticsInfoAMD(VulkanHandleMapping* handlemap,
+                                         VkShaderStatisticsInfoAMD* toMap) {
     (void)handlemap;
     (void)toMap;
-    handlemap_VkShaderResourceUsageAMD(handlemap, (VkShaderResourceUsageAMD*)(&toMap->resourceUsage));
+    handlemap_VkShaderResourceUsageAMD(handlemap,
+                                       (VkShaderResourceUsageAMD*)(&toMap->resourceUsage));
 }
 
 #endif
@@ -6088,13 +4722,10 @@
 #endif
 #ifdef VK_GGP_stream_descriptor_surface
 void handlemap_VkStreamDescriptorSurfaceCreateInfoGGP(
-    VulkanHandleMapping* handlemap,
-    VkStreamDescriptorSurfaceCreateInfoGGP* toMap)
-{
+    VulkanHandleMapping* handlemap, VkStreamDescriptorSurfaceCreateInfoGGP* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -6102,13 +4733,10 @@
 #endif
 #ifdef VK_NV_corner_sampled_image
 void handlemap_VkPhysicalDeviceCornerSampledImageFeaturesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceCornerSampledImageFeaturesNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceCornerSampledImageFeaturesNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -6117,113 +4745,90 @@
 #ifdef VK_IMG_format_pvrtc
 #endif
 #ifdef VK_NV_external_memory_capabilities
-void handlemap_VkExternalImageFormatPropertiesNV(
-    VulkanHandleMapping* handlemap,
-    VkExternalImageFormatPropertiesNV* toMap)
-{
+void handlemap_VkExternalImageFormatPropertiesNV(VulkanHandleMapping* handlemap,
+                                                 VkExternalImageFormatPropertiesNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    handlemap_VkImageFormatProperties(handlemap, (VkImageFormatProperties*)(&toMap->imageFormatProperties));
+    handlemap_VkImageFormatProperties(handlemap,
+                                      (VkImageFormatProperties*)(&toMap->imageFormatProperties));
 }
 
 #endif
 #ifdef VK_NV_external_memory
-void handlemap_VkExternalMemoryImageCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkExternalMemoryImageCreateInfoNV* toMap)
-{
+void handlemap_VkExternalMemoryImageCreateInfoNV(VulkanHandleMapping* handlemap,
+                                                 VkExternalMemoryImageCreateInfoNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkExportMemoryAllocateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkExportMemoryAllocateInfoNV* toMap)
-{
+void handlemap_VkExportMemoryAllocateInfoNV(VulkanHandleMapping* handlemap,
+                                            VkExportMemoryAllocateInfoNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_NV_external_memory_win32
-void handlemap_VkImportMemoryWin32HandleInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkImportMemoryWin32HandleInfoNV* toMap)
-{
+void handlemap_VkImportMemoryWin32HandleInfoNV(VulkanHandleMapping* handlemap,
+                                               VkImportMemoryWin32HandleInfoNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkExportMemoryWin32HandleInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkExportMemoryWin32HandleInfoNV* toMap)
-{
+void handlemap_VkExportMemoryWin32HandleInfoNV(VulkanHandleMapping* handlemap,
+                                               VkExportMemoryWin32HandleInfoNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_NV_win32_keyed_mutex
-void handlemap_VkWin32KeyedMutexAcquireReleaseInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkWin32KeyedMutexAcquireReleaseInfoNV* toMap)
-{
+void handlemap_VkWin32KeyedMutexAcquireReleaseInfoNV(VulkanHandleMapping* handlemap,
+                                                     VkWin32KeyedMutexAcquireReleaseInfoNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap->pAcquireSyncs)
-    {
-        handlemap->mapHandles_VkDeviceMemory((VkDeviceMemory*)toMap->pAcquireSyncs, toMap->acquireCount);
+    if (toMap->pAcquireSyncs) {
+        handlemap->mapHandles_VkDeviceMemory((VkDeviceMemory*)toMap->pAcquireSyncs,
+                                             toMap->acquireCount);
     }
-    if (toMap->pReleaseSyncs)
-    {
-        handlemap->mapHandles_VkDeviceMemory((VkDeviceMemory*)toMap->pReleaseSyncs, toMap->releaseCount);
+    if (toMap->pReleaseSyncs) {
+        handlemap->mapHandles_VkDeviceMemory((VkDeviceMemory*)toMap->pReleaseSyncs,
+                                             toMap->releaseCount);
     }
 }
 
 #endif
 #ifdef VK_EXT_validation_flags
-void handlemap_VkValidationFlagsEXT(
-    VulkanHandleMapping* handlemap,
-    VkValidationFlagsEXT* toMap)
-{
+void handlemap_VkValidationFlagsEXT(VulkanHandleMapping* handlemap, VkValidationFlagsEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_NN_vi_surface
-void handlemap_VkViSurfaceCreateInfoNN(
-    VulkanHandleMapping* handlemap,
-    VkViSurfaceCreateInfoNN* toMap)
-{
+void handlemap_VkViSurfaceCreateInfoNN(VulkanHandleMapping* handlemap,
+                                       VkViSurfaceCreateInfoNN* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -6235,109 +4840,83 @@
 #endif
 #ifdef VK_EXT_texture_compression_astc_hdr
 void handlemap_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_astc_decode_mode
-void handlemap_VkImageViewASTCDecodeModeEXT(
-    VulkanHandleMapping* handlemap,
-    VkImageViewASTCDecodeModeEXT* toMap)
-{
+void handlemap_VkImageViewASTCDecodeModeEXT(VulkanHandleMapping* handlemap,
+                                            VkImageViewASTCDecodeModeEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkPhysicalDeviceASTCDecodeFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceASTCDecodeFeaturesEXT* toMap)
-{
+void handlemap_VkPhysicalDeviceASTCDecodeFeaturesEXT(VulkanHandleMapping* handlemap,
+                                                     VkPhysicalDeviceASTCDecodeFeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_conditional_rendering
-void handlemap_VkConditionalRenderingBeginInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkConditionalRenderingBeginInfoEXT* toMap)
-{
+void handlemap_VkConditionalRenderingBeginInfoEXT(VulkanHandleMapping* handlemap,
+                                                  VkConditionalRenderingBeginInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkBuffer((VkBuffer*)&toMap->buffer);
 }
 
 void handlemap_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceConditionalRenderingFeaturesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceConditionalRenderingFeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkCommandBufferInheritanceConditionalRenderingInfoEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkCommandBufferInheritanceConditionalRenderingInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_NV_clip_space_w_scaling
-void handlemap_VkViewportWScalingNV(
-    VulkanHandleMapping* handlemap,
-    VkViewportWScalingNV* toMap)
-{
+void handlemap_VkViewportWScalingNV(VulkanHandleMapping* handlemap, VkViewportWScalingNV* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
 void handlemap_VkPipelineViewportWScalingStateCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkPipelineViewportWScalingStateCreateInfoNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPipelineViewportWScalingStateCreateInfoNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pViewportWScalings)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->viewportCount; ++i)
-            {
-                handlemap_VkViewportWScalingNV(handlemap, (VkViewportWScalingNV*)(toMap->pViewportWScalings + i));
+    if (toMap) {
+        if (toMap->pViewportWScalings) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->viewportCount; ++i) {
+                handlemap_VkViewportWScalingNV(
+                    handlemap, (VkViewportWScalingNV*)(toMap->pViewportWScalings + i));
             }
         }
     }
@@ -6349,14 +4928,11 @@
 #ifdef VK_EXT_acquire_xlib_display
 #endif
 #ifdef VK_EXT_display_surface_counter
-void handlemap_VkSurfaceCapabilities2EXT(
-    VulkanHandleMapping* handlemap,
-    VkSurfaceCapabilities2EXT* toMap)
-{
+void handlemap_VkSurfaceCapabilities2EXT(VulkanHandleMapping* handlemap,
+                                         VkSurfaceCapabilities2EXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap_VkExtent2D(handlemap, (VkExtent2D*)(&toMap->currentExtent));
@@ -6366,96 +4942,68 @@
 
 #endif
 #ifdef VK_EXT_display_control
-void handlemap_VkDisplayPowerInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkDisplayPowerInfoEXT* toMap)
-{
+void handlemap_VkDisplayPowerInfoEXT(VulkanHandleMapping* handlemap, VkDisplayPowerInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkDeviceEventInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkDeviceEventInfoEXT* toMap)
-{
+void handlemap_VkDeviceEventInfoEXT(VulkanHandleMapping* handlemap, VkDeviceEventInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkDisplayEventInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkDisplayEventInfoEXT* toMap)
-{
+void handlemap_VkDisplayEventInfoEXT(VulkanHandleMapping* handlemap, VkDisplayEventInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkSwapchainCounterCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkSwapchainCounterCreateInfoEXT* toMap)
-{
+void handlemap_VkSwapchainCounterCreateInfoEXT(VulkanHandleMapping* handlemap,
+                                               VkSwapchainCounterCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_GOOGLE_display_timing
-void handlemap_VkRefreshCycleDurationGOOGLE(
-    VulkanHandleMapping* handlemap,
-    VkRefreshCycleDurationGOOGLE* toMap)
-{
+void handlemap_VkRefreshCycleDurationGOOGLE(VulkanHandleMapping* handlemap,
+                                            VkRefreshCycleDurationGOOGLE* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkPastPresentationTimingGOOGLE(
-    VulkanHandleMapping* handlemap,
-    VkPastPresentationTimingGOOGLE* toMap)
-{
+void handlemap_VkPastPresentationTimingGOOGLE(VulkanHandleMapping* handlemap,
+                                              VkPastPresentationTimingGOOGLE* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkPresentTimeGOOGLE(
-    VulkanHandleMapping* handlemap,
-    VkPresentTimeGOOGLE* toMap)
-{
+void handlemap_VkPresentTimeGOOGLE(VulkanHandleMapping* handlemap, VkPresentTimeGOOGLE* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkPresentTimesInfoGOOGLE(
-    VulkanHandleMapping* handlemap,
-    VkPresentTimesInfoGOOGLE* toMap)
-{
+void handlemap_VkPresentTimesInfoGOOGLE(VulkanHandleMapping* handlemap,
+                                        VkPresentTimesInfoGOOGLE* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pTimes)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->swapchainCount; ++i)
-            {
+    if (toMap) {
+        if (toMap->pTimes) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->swapchainCount; ++i) {
                 handlemap_VkPresentTimeGOOGLE(handlemap, (VkPresentTimeGOOGLE*)(toMap->pTimes + i));
             }
         }
@@ -6472,43 +5020,33 @@
 #ifdef VK_NVX_multiview_per_view_attributes
 void handlemap_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
     VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* toMap)
-{
+    VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_NV_viewport_swizzle
-void handlemap_VkViewportSwizzleNV(
-    VulkanHandleMapping* handlemap,
-    VkViewportSwizzleNV* toMap)
-{
+void handlemap_VkViewportSwizzleNV(VulkanHandleMapping* handlemap, VkViewportSwizzleNV* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
 void handlemap_VkPipelineViewportSwizzleStateCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkPipelineViewportSwizzleStateCreateInfoNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPipelineViewportSwizzleStateCreateInfoNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pViewportSwizzles)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->viewportCount; ++i)
-            {
-                handlemap_VkViewportSwizzleNV(handlemap, (VkViewportSwizzleNV*)(toMap->pViewportSwizzles + i));
+    if (toMap) {
+        if (toMap->pViewportSwizzles) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->viewportCount; ++i) {
+                handlemap_VkViewportSwizzleNV(handlemap,
+                                              (VkViewportSwizzleNV*)(toMap->pViewportSwizzles + i));
             }
         }
     }
@@ -6517,33 +5055,24 @@
 #endif
 #ifdef VK_EXT_discard_rectangles
 void handlemap_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceDiscardRectanglePropertiesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceDiscardRectanglePropertiesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPipelineDiscardRectangleStateCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkPipelineDiscardRectangleStateCreateInfoEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPipelineDiscardRectangleStateCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pDiscardRectangles)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->discardRectangleCount; ++i)
-            {
+    if (toMap) {
+        if (toMap->pDiscardRectangles) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->discardRectangleCount; ++i) {
                 handlemap_VkRect2D(handlemap, (VkRect2D*)(toMap->pDiscardRectangles + i));
             }
         }
@@ -6553,25 +5082,19 @@
 #endif
 #ifdef VK_EXT_conservative_rasterization
 void handlemap_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceConservativeRasterizationPropertiesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceConservativeRasterizationPropertiesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPipelineRasterizationConservativeStateCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkPipelineRasterizationConservativeStateCreateInfoEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPipelineRasterizationConservativeStateCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -6579,25 +5102,19 @@
 #endif
 #ifdef VK_EXT_depth_clip_enable
 void handlemap_VkPhysicalDeviceDepthClipEnableFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceDepthClipEnableFeaturesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceDepthClipEnableFeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPipelineRasterizationDepthClipStateCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkPipelineRasterizationDepthClipStateCreateInfoEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPipelineRasterizationDepthClipStateCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -6606,22 +5123,15 @@
 #ifdef VK_EXT_swapchain_colorspace
 #endif
 #ifdef VK_EXT_hdr_metadata
-void handlemap_VkXYColorEXT(
-    VulkanHandleMapping* handlemap,
-    VkXYColorEXT* toMap)
-{
+void handlemap_VkXYColorEXT(VulkanHandleMapping* handlemap, VkXYColorEXT* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkHdrMetadataEXT(
-    VulkanHandleMapping* handlemap,
-    VkHdrMetadataEXT* toMap)
-{
+void handlemap_VkHdrMetadataEXT(VulkanHandleMapping* handlemap, VkHdrMetadataEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap_VkXYColorEXT(handlemap, (VkXYColorEXT*)(&toMap->displayPrimaryRed));
@@ -6632,28 +5142,22 @@
 
 #endif
 #ifdef VK_MVK_ios_surface
-void handlemap_VkIOSSurfaceCreateInfoMVK(
-    VulkanHandleMapping* handlemap,
-    VkIOSSurfaceCreateInfoMVK* toMap)
-{
+void handlemap_VkIOSSurfaceCreateInfoMVK(VulkanHandleMapping* handlemap,
+                                         VkIOSSurfaceCreateInfoMVK* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_MVK_macos_surface
-void handlemap_VkMacOSSurfaceCreateInfoMVK(
-    VulkanHandleMapping* handlemap,
-    VkMacOSSurfaceCreateInfoMVK* toMap)
-{
+void handlemap_VkMacOSSurfaceCreateInfoMVK(VulkanHandleMapping* handlemap,
+                                           VkMacOSSurfaceCreateInfoMVK* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -6666,183 +5170,142 @@
 #ifdef VK_EXT_queue_family_foreign
 #endif
 #ifdef VK_EXT_debug_utils
-void handlemap_VkDebugUtilsLabelEXT(
-    VulkanHandleMapping* handlemap,
-    VkDebugUtilsLabelEXT* toMap)
-{
+void handlemap_VkDebugUtilsLabelEXT(VulkanHandleMapping* handlemap, VkDebugUtilsLabelEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkDebugUtilsObjectNameInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkDebugUtilsObjectNameInfoEXT* toMap)
-{
+void handlemap_VkDebugUtilsObjectNameInfoEXT(VulkanHandleMapping* handlemap,
+                                             VkDebugUtilsObjectNameInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkDebugUtilsMessengerCallbackDataEXT(
-    VulkanHandleMapping* handlemap,
-    VkDebugUtilsMessengerCallbackDataEXT* toMap)
-{
+void handlemap_VkDebugUtilsMessengerCallbackDataEXT(VulkanHandleMapping* handlemap,
+                                                    VkDebugUtilsMessengerCallbackDataEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pQueueLabels)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->queueLabelCount; ++i)
-            {
-                handlemap_VkDebugUtilsLabelEXT(handlemap, (VkDebugUtilsLabelEXT*)(toMap->pQueueLabels + i));
+    if (toMap) {
+        if (toMap->pQueueLabels) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->queueLabelCount; ++i) {
+                handlemap_VkDebugUtilsLabelEXT(handlemap,
+                                               (VkDebugUtilsLabelEXT*)(toMap->pQueueLabels + i));
             }
         }
     }
-    if (toMap)
-    {
-        if (toMap->pCmdBufLabels)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->cmdBufLabelCount; ++i)
-            {
-                handlemap_VkDebugUtilsLabelEXT(handlemap, (VkDebugUtilsLabelEXT*)(toMap->pCmdBufLabels + i));
+    if (toMap) {
+        if (toMap->pCmdBufLabels) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->cmdBufLabelCount; ++i) {
+                handlemap_VkDebugUtilsLabelEXT(handlemap,
+                                               (VkDebugUtilsLabelEXT*)(toMap->pCmdBufLabels + i));
             }
         }
     }
-    if (toMap)
-    {
-        if (toMap->pObjects)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->objectCount; ++i)
-            {
-                handlemap_VkDebugUtilsObjectNameInfoEXT(handlemap, (VkDebugUtilsObjectNameInfoEXT*)(toMap->pObjects + i));
+    if (toMap) {
+        if (toMap->pObjects) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->objectCount; ++i) {
+                handlemap_VkDebugUtilsObjectNameInfoEXT(
+                    handlemap, (VkDebugUtilsObjectNameInfoEXT*)(toMap->pObjects + i));
             }
         }
     }
 }
 
-void handlemap_VkDebugUtilsMessengerCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkDebugUtilsMessengerCreateInfoEXT* toMap)
-{
+void handlemap_VkDebugUtilsMessengerCreateInfoEXT(VulkanHandleMapping* handlemap,
+                                                  VkDebugUtilsMessengerCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkDebugUtilsObjectTagInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkDebugUtilsObjectTagInfoEXT* toMap)
-{
+void handlemap_VkDebugUtilsObjectTagInfoEXT(VulkanHandleMapping* handlemap,
+                                            VkDebugUtilsObjectTagInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
-void handlemap_VkAndroidHardwareBufferUsageANDROID(
-    VulkanHandleMapping* handlemap,
-    VkAndroidHardwareBufferUsageANDROID* toMap)
-{
+void handlemap_VkAndroidHardwareBufferUsageANDROID(VulkanHandleMapping* handlemap,
+                                                   VkAndroidHardwareBufferUsageANDROID* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkAndroidHardwareBufferPropertiesANDROID(
-    VulkanHandleMapping* handlemap,
-    VkAndroidHardwareBufferPropertiesANDROID* toMap)
-{
+    VulkanHandleMapping* handlemap, VkAndroidHardwareBufferPropertiesANDROID* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkAndroidHardwareBufferFormatPropertiesANDROID(
-    VulkanHandleMapping* handlemap,
-    VkAndroidHardwareBufferFormatPropertiesANDROID* toMap)
-{
+    VulkanHandleMapping* handlemap, VkAndroidHardwareBufferFormatPropertiesANDROID* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap_VkComponentMapping(handlemap, (VkComponentMapping*)(&toMap->samplerYcbcrConversionComponents));
+    handlemap_VkComponentMapping(handlemap,
+                                 (VkComponentMapping*)(&toMap->samplerYcbcrConversionComponents));
 }
 
 void handlemap_VkImportAndroidHardwareBufferInfoANDROID(
-    VulkanHandleMapping* handlemap,
-    VkImportAndroidHardwareBufferInfoANDROID* toMap)
-{
+    VulkanHandleMapping* handlemap, VkImportAndroidHardwareBufferInfoANDROID* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkMemoryGetAndroidHardwareBufferInfoANDROID(
-    VulkanHandleMapping* handlemap,
-    VkMemoryGetAndroidHardwareBufferInfoANDROID* toMap)
-{
+    VulkanHandleMapping* handlemap, VkMemoryGetAndroidHardwareBufferInfoANDROID* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkDeviceMemory((VkDeviceMemory*)&toMap->memory);
 }
 
-void handlemap_VkExternalFormatANDROID(
-    VulkanHandleMapping* handlemap,
-    VkExternalFormatANDROID* toMap)
-{
+void handlemap_VkExternalFormatANDROID(VulkanHandleMapping* handlemap,
+                                       VkExternalFormatANDROID* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkAndroidHardwareBufferFormatProperties2ANDROID(
-    VulkanHandleMapping* handlemap,
-    VkAndroidHardwareBufferFormatProperties2ANDROID* toMap)
-{
+    VulkanHandleMapping* handlemap, VkAndroidHardwareBufferFormatProperties2ANDROID* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap_VkComponentMapping(handlemap, (VkComponentMapping*)(&toMap->samplerYcbcrConversionComponents));
+    handlemap_VkComponentMapping(handlemap,
+                                 (VkComponentMapping*)(&toMap->samplerYcbcrConversionComponents));
 }
 
 #endif
@@ -6856,49 +5319,37 @@
 #endif
 #ifdef VK_EXT_inline_uniform_block
 void handlemap_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceInlineUniformBlockFeaturesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceInlineUniformBlockFeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceInlineUniformBlockPropertiesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceInlineUniformBlockPropertiesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkWriteDescriptorSetInlineUniformBlockEXT(
-    VulkanHandleMapping* handlemap,
-    VkWriteDescriptorSetInlineUniformBlockEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkWriteDescriptorSetInlineUniformBlockEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkDescriptorPoolInlineUniformBlockCreateInfoEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkDescriptorPoolInlineUniformBlockCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -6907,121 +5358,99 @@
 #ifdef VK_EXT_shader_stencil_export
 #endif
 #ifdef VK_EXT_sample_locations
-void handlemap_VkSampleLocationEXT(
-    VulkanHandleMapping* handlemap,
-    VkSampleLocationEXT* toMap)
-{
+void handlemap_VkSampleLocationEXT(VulkanHandleMapping* handlemap, VkSampleLocationEXT* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkSampleLocationsInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkSampleLocationsInfoEXT* toMap)
-{
+void handlemap_VkSampleLocationsInfoEXT(VulkanHandleMapping* handlemap,
+                                        VkSampleLocationsInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap_VkExtent2D(handlemap, (VkExtent2D*)(&toMap->sampleLocationGridSize));
-    if (toMap)
-    {
-        if (toMap->pSampleLocations)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->sampleLocationsCount; ++i)
-            {
-                handlemap_VkSampleLocationEXT(handlemap, (VkSampleLocationEXT*)(toMap->pSampleLocations + i));
+    if (toMap) {
+        if (toMap->pSampleLocations) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->sampleLocationsCount; ++i) {
+                handlemap_VkSampleLocationEXT(handlemap,
+                                              (VkSampleLocationEXT*)(toMap->pSampleLocations + i));
             }
         }
     }
 }
 
-void handlemap_VkAttachmentSampleLocationsEXT(
-    VulkanHandleMapping* handlemap,
-    VkAttachmentSampleLocationsEXT* toMap)
-{
+void handlemap_VkAttachmentSampleLocationsEXT(VulkanHandleMapping* handlemap,
+                                              VkAttachmentSampleLocationsEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    handlemap_VkSampleLocationsInfoEXT(handlemap, (VkSampleLocationsInfoEXT*)(&toMap->sampleLocationsInfo));
+    handlemap_VkSampleLocationsInfoEXT(handlemap,
+                                       (VkSampleLocationsInfoEXT*)(&toMap->sampleLocationsInfo));
 }
 
-void handlemap_VkSubpassSampleLocationsEXT(
-    VulkanHandleMapping* handlemap,
-    VkSubpassSampleLocationsEXT* toMap)
-{
+void handlemap_VkSubpassSampleLocationsEXT(VulkanHandleMapping* handlemap,
+                                           VkSubpassSampleLocationsEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    handlemap_VkSampleLocationsInfoEXT(handlemap, (VkSampleLocationsInfoEXT*)(&toMap->sampleLocationsInfo));
+    handlemap_VkSampleLocationsInfoEXT(handlemap,
+                                       (VkSampleLocationsInfoEXT*)(&toMap->sampleLocationsInfo));
 }
 
 void handlemap_VkRenderPassSampleLocationsBeginInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkRenderPassSampleLocationsBeginInfoEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkRenderPassSampleLocationsBeginInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pAttachmentInitialSampleLocations)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->attachmentInitialSampleLocationsCount; ++i)
-            {
-                handlemap_VkAttachmentSampleLocationsEXT(handlemap, (VkAttachmentSampleLocationsEXT*)(toMap->pAttachmentInitialSampleLocations + i));
+    if (toMap) {
+        if (toMap->pAttachmentInitialSampleLocations) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->attachmentInitialSampleLocationsCount; ++i) {
+                handlemap_VkAttachmentSampleLocationsEXT(
+                    handlemap,
+                    (VkAttachmentSampleLocationsEXT*)(toMap->pAttachmentInitialSampleLocations +
+                                                      i));
             }
         }
     }
-    if (toMap)
-    {
-        if (toMap->pPostSubpassSampleLocations)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->postSubpassSampleLocationsCount; ++i)
-            {
-                handlemap_VkSubpassSampleLocationsEXT(handlemap, (VkSubpassSampleLocationsEXT*)(toMap->pPostSubpassSampleLocations + i));
+    if (toMap) {
+        if (toMap->pPostSubpassSampleLocations) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->postSubpassSampleLocationsCount; ++i) {
+                handlemap_VkSubpassSampleLocationsEXT(
+                    handlemap,
+                    (VkSubpassSampleLocationsEXT*)(toMap->pPostSubpassSampleLocations + i));
             }
         }
     }
 }
 
 void handlemap_VkPipelineSampleLocationsStateCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkPipelineSampleLocationsStateCreateInfoEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPipelineSampleLocationsStateCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap_VkSampleLocationsInfoEXT(handlemap, (VkSampleLocationsInfoEXT*)(&toMap->sampleLocationsInfo));
+    handlemap_VkSampleLocationsInfoEXT(handlemap,
+                                       (VkSampleLocationsInfoEXT*)(&toMap->sampleLocationsInfo));
 }
 
 void handlemap_VkPhysicalDeviceSampleLocationsPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceSampleLocationsPropertiesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceSampleLocationsPropertiesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap_VkExtent2D(handlemap, (VkExtent2D*)(&toMap->maxSampleLocationGridSize));
 }
 
-void handlemap_VkMultisamplePropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkMultisamplePropertiesEXT* toMap)
-{
+void handlemap_VkMultisamplePropertiesEXT(VulkanHandleMapping* handlemap,
+                                          VkMultisamplePropertiesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap_VkExtent2D(handlemap, (VkExtent2D*)(&toMap->maxSampleLocationGridSize));
@@ -7030,37 +5459,28 @@
 #endif
 #ifdef VK_EXT_blend_operation_advanced
 void handlemap_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkPipelineColorBlendAdvancedStateCreateInfoEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPipelineColorBlendAdvancedStateCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -7068,13 +5488,10 @@
 #endif
 #ifdef VK_NV_fragment_coverage_to_color
 void handlemap_VkPipelineCoverageToColorStateCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkPipelineCoverageToColorStateCreateInfoNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPipelineCoverageToColorStateCreateInfoNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -7082,13 +5499,10 @@
 #endif
 #ifdef VK_NV_framebuffer_mixed_samples
 void handlemap_VkPipelineCoverageModulationStateCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkPipelineCoverageModulationStateCreateInfoNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPipelineCoverageModulationStateCreateInfoNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -7098,25 +5512,19 @@
 #endif
 #ifdef VK_NV_shader_sm_builtins
 void handlemap_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -7125,119 +5533,93 @@
 #ifdef VK_EXT_post_depth_coverage
 #endif
 #ifdef VK_EXT_image_drm_format_modifier
-void handlemap_VkDrmFormatModifierPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkDrmFormatModifierPropertiesEXT* toMap)
-{
+void handlemap_VkDrmFormatModifierPropertiesEXT(VulkanHandleMapping* handlemap,
+                                                VkDrmFormatModifierPropertiesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkDrmFormatModifierPropertiesListEXT(
-    VulkanHandleMapping* handlemap,
-    VkDrmFormatModifierPropertiesListEXT* toMap)
-{
+void handlemap_VkDrmFormatModifierPropertiesListEXT(VulkanHandleMapping* handlemap,
+                                                    VkDrmFormatModifierPropertiesListEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pDrmFormatModifierProperties)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->drmFormatModifierCount; ++i)
-            {
-                handlemap_VkDrmFormatModifierPropertiesEXT(handlemap, (VkDrmFormatModifierPropertiesEXT*)(toMap->pDrmFormatModifierProperties + i));
+    if (toMap) {
+        if (toMap->pDrmFormatModifierProperties) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->drmFormatModifierCount; ++i) {
+                handlemap_VkDrmFormatModifierPropertiesEXT(
+                    handlemap,
+                    (VkDrmFormatModifierPropertiesEXT*)(toMap->pDrmFormatModifierProperties + i));
             }
         }
     }
 }
 
 void handlemap_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceImageDrmFormatModifierInfoEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceImageDrmFormatModifierInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkImageDrmFormatModifierListCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkImageDrmFormatModifierListCreateInfoEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkImageDrmFormatModifierListCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkImageDrmFormatModifierExplicitCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkImageDrmFormatModifierExplicitCreateInfoEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkImageDrmFormatModifierExplicitCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pPlaneLayouts)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->drmFormatModifierPlaneCount; ++i)
-            {
-                handlemap_VkSubresourceLayout(handlemap, (VkSubresourceLayout*)(toMap->pPlaneLayouts + i));
+    if (toMap) {
+        if (toMap->pPlaneLayouts) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->drmFormatModifierPlaneCount; ++i) {
+                handlemap_VkSubresourceLayout(handlemap,
+                                              (VkSubresourceLayout*)(toMap->pPlaneLayouts + i));
             }
         }
     }
 }
 
-void handlemap_VkImageDrmFormatModifierPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkImageDrmFormatModifierPropertiesEXT* toMap)
-{
+void handlemap_VkImageDrmFormatModifierPropertiesEXT(VulkanHandleMapping* handlemap,
+                                                     VkImageDrmFormatModifierPropertiesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkDrmFormatModifierProperties2EXT(
-    VulkanHandleMapping* handlemap,
-    VkDrmFormatModifierProperties2EXT* toMap)
-{
+void handlemap_VkDrmFormatModifierProperties2EXT(VulkanHandleMapping* handlemap,
+                                                 VkDrmFormatModifierProperties2EXT* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkDrmFormatModifierPropertiesList2EXT(
-    VulkanHandleMapping* handlemap,
-    VkDrmFormatModifierPropertiesList2EXT* toMap)
-{
+void handlemap_VkDrmFormatModifierPropertiesList2EXT(VulkanHandleMapping* handlemap,
+                                                     VkDrmFormatModifierPropertiesList2EXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pDrmFormatModifierProperties)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->drmFormatModifierCount; ++i)
-            {
-                handlemap_VkDrmFormatModifierProperties2EXT(handlemap, (VkDrmFormatModifierProperties2EXT*)(toMap->pDrmFormatModifierProperties + i));
+    if (toMap) {
+        if (toMap->pDrmFormatModifierProperties) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->drmFormatModifierCount; ++i) {
+                handlemap_VkDrmFormatModifierProperties2EXT(
+                    handlemap,
+                    (VkDrmFormatModifierProperties2EXT*)(toMap->pDrmFormatModifierProperties + i));
             }
         }
     }
@@ -7245,26 +5627,20 @@
 
 #endif
 #ifdef VK_EXT_validation_cache
-void handlemap_VkValidationCacheCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkValidationCacheCreateInfoEXT* toMap)
-{
+void handlemap_VkValidationCacheCreateInfoEXT(VulkanHandleMapping* handlemap,
+                                              VkValidationCacheCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkShaderModuleValidationCacheCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkShaderModuleValidationCacheCreateInfoEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkShaderModuleValidationCacheCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkValidationCacheEXT((VkValidationCacheEXT*)&toMap->validationCache);
@@ -7276,104 +5652,80 @@
 #ifdef VK_EXT_shader_viewport_index_layer
 #endif
 #ifdef VK_NV_shading_rate_image
-void handlemap_VkShadingRatePaletteNV(
-    VulkanHandleMapping* handlemap,
-    VkShadingRatePaletteNV* toMap)
-{
+void handlemap_VkShadingRatePaletteNV(VulkanHandleMapping* handlemap,
+                                      VkShadingRatePaletteNV* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
 void handlemap_VkPipelineViewportShadingRateImageStateCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkPipelineViewportShadingRateImageStateCreateInfoNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPipelineViewportShadingRateImageStateCreateInfoNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pShadingRatePalettes)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->viewportCount; ++i)
-            {
-                handlemap_VkShadingRatePaletteNV(handlemap, (VkShadingRatePaletteNV*)(toMap->pShadingRatePalettes + i));
+    if (toMap) {
+        if (toMap->pShadingRatePalettes) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->viewportCount; ++i) {
+                handlemap_VkShadingRatePaletteNV(
+                    handlemap, (VkShadingRatePaletteNV*)(toMap->pShadingRatePalettes + i));
             }
         }
     }
 }
 
 void handlemap_VkPhysicalDeviceShadingRateImageFeaturesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShadingRateImageFeaturesNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShadingRateImageFeaturesNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceShadingRateImagePropertiesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShadingRateImagePropertiesNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShadingRateImagePropertiesNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap_VkExtent2D(handlemap, (VkExtent2D*)(&toMap->shadingRateTexelSize));
 }
 
-void handlemap_VkCoarseSampleLocationNV(
-    VulkanHandleMapping* handlemap,
-    VkCoarseSampleLocationNV* toMap)
-{
+void handlemap_VkCoarseSampleLocationNV(VulkanHandleMapping* handlemap,
+                                        VkCoarseSampleLocationNV* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkCoarseSampleOrderCustomNV(
-    VulkanHandleMapping* handlemap,
-    VkCoarseSampleOrderCustomNV* toMap)
-{
+void handlemap_VkCoarseSampleOrderCustomNV(VulkanHandleMapping* handlemap,
+                                           VkCoarseSampleOrderCustomNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap)
-    {
-        if (toMap->pSampleLocations)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->sampleLocationCount; ++i)
-            {
-                handlemap_VkCoarseSampleLocationNV(handlemap, (VkCoarseSampleLocationNV*)(toMap->pSampleLocations + i));
+    if (toMap) {
+        if (toMap->pSampleLocations) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->sampleLocationCount; ++i) {
+                handlemap_VkCoarseSampleLocationNV(
+                    handlemap, (VkCoarseSampleLocationNV*)(toMap->pSampleLocations + i));
             }
         }
     }
 }
 
 void handlemap_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pCustomSampleOrders)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->customSampleOrderCount; ++i)
-            {
-                handlemap_VkCoarseSampleOrderCustomNV(handlemap, (VkCoarseSampleOrderCustomNV*)(toMap->pCustomSampleOrders + i));
+    if (toMap) {
+        if (toMap->pCustomSampleOrders) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->customSampleOrderCount; ++i) {
+                handlemap_VkCoarseSampleOrderCustomNV(
+                    handlemap, (VkCoarseSampleOrderCustomNV*)(toMap->pCustomSampleOrders + i));
             }
         }
     }
@@ -7381,45 +5733,35 @@
 
 #endif
 #ifdef VK_NV_ray_tracing
-void handlemap_VkRayTracingShaderGroupCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkRayTracingShaderGroupCreateInfoNV* toMap)
-{
+void handlemap_VkRayTracingShaderGroupCreateInfoNV(VulkanHandleMapping* handlemap,
+                                                   VkRayTracingShaderGroupCreateInfoNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkRayTracingPipelineCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkRayTracingPipelineCreateInfoNV* toMap)
-{
+void handlemap_VkRayTracingPipelineCreateInfoNV(VulkanHandleMapping* handlemap,
+                                                VkRayTracingPipelineCreateInfoNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pStages)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->stageCount; ++i)
-            {
-                handlemap_VkPipelineShaderStageCreateInfo(handlemap, (VkPipelineShaderStageCreateInfo*)(toMap->pStages + i));
+    if (toMap) {
+        if (toMap->pStages) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->stageCount; ++i) {
+                handlemap_VkPipelineShaderStageCreateInfo(
+                    handlemap, (VkPipelineShaderStageCreateInfo*)(toMap->pStages + i));
             }
         }
     }
-    if (toMap)
-    {
-        if (toMap->pGroups)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->groupCount; ++i)
-            {
-                handlemap_VkRayTracingShaderGroupCreateInfoNV(handlemap, (VkRayTracingShaderGroupCreateInfoNV*)(toMap->pGroups + i));
+    if (toMap) {
+        if (toMap->pGroups) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->groupCount; ++i) {
+                handlemap_VkRayTracingShaderGroupCreateInfoNV(
+                    handlemap, (VkRayTracingShaderGroupCreateInfoNV*)(toMap->pGroups + i));
             }
         }
     }
@@ -7427,14 +5769,10 @@
     handlemap->mapHandles_VkPipeline((VkPipeline*)&toMap->basePipelineHandle);
 }
 
-void handlemap_VkGeometryTrianglesNV(
-    VulkanHandleMapping* handlemap,
-    VkGeometryTrianglesNV* toMap)
-{
+void handlemap_VkGeometryTrianglesNV(VulkanHandleMapping* handlemap, VkGeometryTrianglesNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkBuffer((VkBuffer*)&toMap->vertexData);
@@ -7442,152 +5780,116 @@
     handlemap->mapHandles_VkBuffer((VkBuffer*)&toMap->transformData);
 }
 
-void handlemap_VkGeometryAABBNV(
-    VulkanHandleMapping* handlemap,
-    VkGeometryAABBNV* toMap)
-{
+void handlemap_VkGeometryAABBNV(VulkanHandleMapping* handlemap, VkGeometryAABBNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkBuffer((VkBuffer*)&toMap->aabbData);
 }
 
-void handlemap_VkGeometryDataNV(
-    VulkanHandleMapping* handlemap,
-    VkGeometryDataNV* toMap)
-{
+void handlemap_VkGeometryDataNV(VulkanHandleMapping* handlemap, VkGeometryDataNV* toMap) {
     (void)handlemap;
     (void)toMap;
     handlemap_VkGeometryTrianglesNV(handlemap, (VkGeometryTrianglesNV*)(&toMap->triangles));
     handlemap_VkGeometryAABBNV(handlemap, (VkGeometryAABBNV*)(&toMap->aabbs));
 }
 
-void handlemap_VkGeometryNV(
-    VulkanHandleMapping* handlemap,
-    VkGeometryNV* toMap)
-{
+void handlemap_VkGeometryNV(VulkanHandleMapping* handlemap, VkGeometryNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap_VkGeometryDataNV(handlemap, (VkGeometryDataNV*)(&toMap->geometry));
 }
 
-void handlemap_VkAccelerationStructureInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureInfoNV* toMap)
-{
+void handlemap_VkAccelerationStructureInfoNV(VulkanHandleMapping* handlemap,
+                                             VkAccelerationStructureInfoNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pGeometries)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->geometryCount; ++i)
-            {
+    if (toMap) {
+        if (toMap->pGeometries) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->geometryCount; ++i) {
                 handlemap_VkGeometryNV(handlemap, (VkGeometryNV*)(toMap->pGeometries + i));
             }
         }
     }
 }
 
-void handlemap_VkAccelerationStructureCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureCreateInfoNV* toMap)
-{
+void handlemap_VkAccelerationStructureCreateInfoNV(VulkanHandleMapping* handlemap,
+                                                   VkAccelerationStructureCreateInfoNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap_VkAccelerationStructureInfoNV(handlemap, (VkAccelerationStructureInfoNV*)(&toMap->info));
+    handlemap_VkAccelerationStructureInfoNV(handlemap,
+                                            (VkAccelerationStructureInfoNV*)(&toMap->info));
 }
 
 void handlemap_VkBindAccelerationStructureMemoryInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkBindAccelerationStructureMemoryInfoNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkBindAccelerationStructureMemoryInfoNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap->mapHandles_VkAccelerationStructureNV((VkAccelerationStructureNV*)&toMap->accelerationStructure);
+    handlemap->mapHandles_VkAccelerationStructureNV(
+        (VkAccelerationStructureNV*)&toMap->accelerationStructure);
     handlemap->mapHandles_VkDeviceMemory((VkDeviceMemory*)&toMap->memory);
 }
 
 void handlemap_VkWriteDescriptorSetAccelerationStructureNV(
-    VulkanHandleMapping* handlemap,
-    VkWriteDescriptorSetAccelerationStructureNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkWriteDescriptorSetAccelerationStructureNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap->pAccelerationStructures)
-    {
-        handlemap->mapHandles_VkAccelerationStructureNV((VkAccelerationStructureNV*)toMap->pAccelerationStructures, toMap->accelerationStructureCount);
+    if (toMap->pAccelerationStructures) {
+        handlemap->mapHandles_VkAccelerationStructureNV(
+            (VkAccelerationStructureNV*)toMap->pAccelerationStructures,
+            toMap->accelerationStructureCount);
     }
 }
 
 void handlemap_VkAccelerationStructureMemoryRequirementsInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureMemoryRequirementsInfoNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkAccelerationStructureMemoryRequirementsInfoNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap->mapHandles_VkAccelerationStructureNV((VkAccelerationStructureNV*)&toMap->accelerationStructure);
+    handlemap->mapHandles_VkAccelerationStructureNV(
+        (VkAccelerationStructureNV*)&toMap->accelerationStructure);
 }
 
 void handlemap_VkPhysicalDeviceRayTracingPropertiesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceRayTracingPropertiesNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceRayTracingPropertiesNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkTransformMatrixKHR(
-    VulkanHandleMapping* handlemap,
-    VkTransformMatrixKHR* toMap)
-{
+void handlemap_VkTransformMatrixKHR(VulkanHandleMapping* handlemap, VkTransformMatrixKHR* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkAabbPositionsKHR(
-    VulkanHandleMapping* handlemap,
-    VkAabbPositionsKHR* toMap)
-{
+void handlemap_VkAabbPositionsKHR(VulkanHandleMapping* handlemap, VkAabbPositionsKHR* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkAccelerationStructureInstanceKHR(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureInstanceKHR* toMap)
-{
+void handlemap_VkAccelerationStructureInstanceKHR(VulkanHandleMapping* handlemap,
+                                                  VkAccelerationStructureInstanceKHR* toMap) {
     (void)handlemap;
     (void)toMap;
     handlemap_VkTransformMatrixKHR(handlemap, (VkTransformMatrixKHR*)(&toMap->transform));
@@ -7596,25 +5898,19 @@
 #endif
 #ifdef VK_NV_representative_fragment_test
 void handlemap_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkPipelineRepresentativeFragmentTestStateCreateInfoNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPipelineRepresentativeFragmentTestStateCreateInfoNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -7622,25 +5918,19 @@
 #endif
 #ifdef VK_EXT_filter_cubic
 void handlemap_VkPhysicalDeviceImageViewImageFormatInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceImageViewImageFormatInfoEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceImageViewImageFormatInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkFilterCubicImageViewImageFormatPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkFilterCubicImageViewImageFormatPropertiesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkFilterCubicImageViewImageFormatPropertiesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -7650,51 +5940,39 @@
 #endif
 #ifdef VK_EXT_global_priority
 void handlemap_VkDeviceQueueGlobalPriorityCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkDeviceQueueGlobalPriorityCreateInfoEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkDeviceQueueGlobalPriorityCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_external_memory_host
-void handlemap_VkImportMemoryHostPointerInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkImportMemoryHostPointerInfoEXT* toMap)
-{
+void handlemap_VkImportMemoryHostPointerInfoEXT(VulkanHandleMapping* handlemap,
+                                                VkImportMemoryHostPointerInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkMemoryHostPointerPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkMemoryHostPointerPropertiesEXT* toMap)
-{
+void handlemap_VkMemoryHostPointerPropertiesEXT(VulkanHandleMapping* handlemap,
+                                                VkMemoryHostPointerPropertiesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceExternalMemoryHostPropertiesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceExternalMemoryHostPropertiesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -7704,27 +5982,21 @@
 #endif
 #ifdef VK_AMD_pipeline_compiler_control
 void handlemap_VkPipelineCompilerControlCreateInfoAMD(
-    VulkanHandleMapping* handlemap,
-    VkPipelineCompilerControlCreateInfoAMD* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPipelineCompilerControlCreateInfoAMD* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_calibrated_timestamps
-void handlemap_VkCalibratedTimestampInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkCalibratedTimestampInfoEXT* toMap)
-{
+void handlemap_VkCalibratedTimestampInfoEXT(VulkanHandleMapping* handlemap,
+                                            VkCalibratedTimestampInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -7732,108 +6004,85 @@
 #endif
 #ifdef VK_AMD_shader_core_properties
 void handlemap_VkPhysicalDeviceShaderCorePropertiesAMD(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShaderCorePropertiesAMD* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShaderCorePropertiesAMD* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_video_decode_h265
-void handlemap_VkVideoDecodeH265ProfileEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoDecodeH265ProfileEXT* toMap)
-{
+void handlemap_VkVideoDecodeH265ProfileEXT(VulkanHandleMapping* handlemap,
+                                           VkVideoDecodeH265ProfileEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkVideoDecodeH265CapabilitiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoDecodeH265CapabilitiesEXT* toMap)
-{
+void handlemap_VkVideoDecodeH265CapabilitiesEXT(VulkanHandleMapping* handlemap,
+                                                VkVideoDecodeH265CapabilitiesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap_VkExtensionProperties(handlemap, (VkExtensionProperties*)(&toMap->stdExtensionVersion));
+    handlemap_VkExtensionProperties(handlemap,
+                                    (VkExtensionProperties*)(&toMap->stdExtensionVersion));
 }
 
-void handlemap_VkVideoDecodeH265SessionCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoDecodeH265SessionCreateInfoEXT* toMap)
-{
+void handlemap_VkVideoDecodeH265SessionCreateInfoEXT(VulkanHandleMapping* handlemap,
+                                                     VkVideoDecodeH265SessionCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap->pStdExtensionVersion)
-    {
-        handlemap_VkExtensionProperties(handlemap, (VkExtensionProperties*)(toMap->pStdExtensionVersion));
+    if (toMap->pStdExtensionVersion) {
+        handlemap_VkExtensionProperties(handlemap,
+                                        (VkExtensionProperties*)(toMap->pStdExtensionVersion));
     }
 }
 
 void handlemap_VkVideoDecodeH265SessionParametersAddInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoDecodeH265SessionParametersAddInfoEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkVideoDecodeH265SessionParametersAddInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkVideoDecodeH265SessionParametersCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoDecodeH265SessionParametersCreateInfoEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkVideoDecodeH265SessionParametersCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap->pParametersAddInfo)
-    {
-        handlemap_VkVideoDecodeH265SessionParametersAddInfoEXT(handlemap, (VkVideoDecodeH265SessionParametersAddInfoEXT*)(toMap->pParametersAddInfo));
+    if (toMap->pParametersAddInfo) {
+        handlemap_VkVideoDecodeH265SessionParametersAddInfoEXT(
+            handlemap, (VkVideoDecodeH265SessionParametersAddInfoEXT*)(toMap->pParametersAddInfo));
     }
 }
 
-void handlemap_VkVideoDecodeH265PictureInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoDecodeH265PictureInfoEXT* toMap)
-{
+void handlemap_VkVideoDecodeH265PictureInfoEXT(VulkanHandleMapping* handlemap,
+                                               VkVideoDecodeH265PictureInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkVideoDecodeH265DpbSlotInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoDecodeH265DpbSlotInfoEXT* toMap)
-{
+void handlemap_VkVideoDecodeH265DpbSlotInfoEXT(VulkanHandleMapping* handlemap,
+                                               VkVideoDecodeH265DpbSlotInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -7841,13 +6090,10 @@
 #endif
 #ifdef VK_AMD_memory_overallocation_behavior
 void handlemap_VkDeviceMemoryOverallocationCreateInfoAMD(
-    VulkanHandleMapping* handlemap,
-    VkDeviceMemoryOverallocationCreateInfoAMD* toMap)
-{
+    VulkanHandleMapping* handlemap, VkDeviceMemoryOverallocationCreateInfoAMD* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -7855,104 +6101,84 @@
 #endif
 #ifdef VK_EXT_vertex_attribute_divisor
 void handlemap_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkVertexInputBindingDivisorDescriptionEXT(
-    VulkanHandleMapping* handlemap,
-    VkVertexInputBindingDivisorDescriptionEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkVertexInputBindingDivisorDescriptionEXT* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
 void handlemap_VkPipelineVertexInputDivisorStateCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkPipelineVertexInputDivisorStateCreateInfoEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPipelineVertexInputDivisorStateCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pVertexBindingDivisors)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->vertexBindingDivisorCount; ++i)
-            {
-                handlemap_VkVertexInputBindingDivisorDescriptionEXT(handlemap, (VkVertexInputBindingDivisorDescriptionEXT*)(toMap->pVertexBindingDivisors + i));
+    if (toMap) {
+        if (toMap->pVertexBindingDivisors) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->vertexBindingDivisorCount; ++i) {
+                handlemap_VkVertexInputBindingDivisorDescriptionEXT(
+                    handlemap,
+                    (VkVertexInputBindingDivisorDescriptionEXT*)(toMap->pVertexBindingDivisors +
+                                                                 i));
             }
         }
     }
 }
 
 void handlemap_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_GGP_frame_token
-void handlemap_VkPresentFrameTokenGGP(
-    VulkanHandleMapping* handlemap,
-    VkPresentFrameTokenGGP* toMap)
-{
+void handlemap_VkPresentFrameTokenGGP(VulkanHandleMapping* handlemap,
+                                      VkPresentFrameTokenGGP* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_pipeline_creation_feedback
-void handlemap_VkPipelineCreationFeedbackEXT(
-    VulkanHandleMapping* handlemap,
-    VkPipelineCreationFeedbackEXT* toMap)
-{
+void handlemap_VkPipelineCreationFeedbackEXT(VulkanHandleMapping* handlemap,
+                                             VkPipelineCreationFeedbackEXT* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
 void handlemap_VkPipelineCreationFeedbackCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkPipelineCreationFeedbackCreateInfoEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPipelineCreationFeedbackCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap->pPipelineCreationFeedback)
-    {
-        handlemap_VkPipelineCreationFeedbackEXT(handlemap, (VkPipelineCreationFeedbackEXT*)(toMap->pPipelineCreationFeedback));
+    if (toMap->pPipelineCreationFeedback) {
+        handlemap_VkPipelineCreationFeedbackEXT(
+            handlemap, (VkPipelineCreationFeedbackEXT*)(toMap->pPipelineCreationFeedback));
     }
-    if (toMap)
-    {
-        if (toMap->pPipelineStageCreationFeedbacks)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->pipelineStageCreationFeedbackCount; ++i)
-            {
-                handlemap_VkPipelineCreationFeedbackEXT(handlemap, (VkPipelineCreationFeedbackEXT*)(toMap->pPipelineStageCreationFeedbacks + i));
+    if (toMap) {
+        if (toMap->pPipelineStageCreationFeedbacks) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->pipelineStageCreationFeedbackCount; ++i) {
+                handlemap_VkPipelineCreationFeedbackEXT(
+                    handlemap,
+                    (VkPipelineCreationFeedbackEXT*)(toMap->pPipelineStageCreationFeedbacks + i));
             }
         }
     }
@@ -7963,47 +6189,36 @@
 #endif
 #ifdef VK_NV_compute_shader_derivatives
 void handlemap_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_NV_mesh_shader
-void handlemap_VkPhysicalDeviceMeshShaderFeaturesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceMeshShaderFeaturesNV* toMap)
-{
+void handlemap_VkPhysicalDeviceMeshShaderFeaturesNV(VulkanHandleMapping* handlemap,
+                                                    VkPhysicalDeviceMeshShaderFeaturesNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceMeshShaderPropertiesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceMeshShaderPropertiesNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceMeshShaderPropertiesNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkDrawMeshTasksIndirectCommandNV(
-    VulkanHandleMapping* handlemap,
-    VkDrawMeshTasksIndirectCommandNV* toMap)
-{
+void handlemap_VkDrawMeshTasksIndirectCommandNV(VulkanHandleMapping* handlemap,
+                                                VkDrawMeshTasksIndirectCommandNV* toMap) {
     (void)handlemap;
     (void)toMap;
 }
@@ -8011,13 +6226,10 @@
 #endif
 #ifdef VK_NV_fragment_shader_barycentric
 void handlemap_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -8025,13 +6237,10 @@
 #endif
 #ifdef VK_NV_shader_image_footprint
 void handlemap_VkPhysicalDeviceShaderImageFootprintFeaturesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShaderImageFootprintFeaturesNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShaderImageFootprintFeaturesNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -8039,21 +6248,15 @@
 #endif
 #ifdef VK_NV_scissor_exclusive
 void handlemap_VkPipelineViewportExclusiveScissorStateCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkPipelineViewportExclusiveScissorStateCreateInfoNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPipelineViewportExclusiveScissorStateCreateInfoNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pExclusiveScissors)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->exclusiveScissorCount; ++i)
-            {
+    if (toMap) {
+        if (toMap->pExclusiveScissors) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->exclusiveScissorCount; ++i) {
                 handlemap_VkRect2D(handlemap, (VkRect2D*)(toMap->pExclusiveScissors + i));
             }
         }
@@ -8061,39 +6264,29 @@
 }
 
 void handlemap_VkPhysicalDeviceExclusiveScissorFeaturesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceExclusiveScissorFeaturesNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceExclusiveScissorFeaturesNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
-void handlemap_VkQueueFamilyCheckpointPropertiesNV(
-    VulkanHandleMapping* handlemap,
-    VkQueueFamilyCheckpointPropertiesNV* toMap)
-{
+void handlemap_VkQueueFamilyCheckpointPropertiesNV(VulkanHandleMapping* handlemap,
+                                                   VkQueueFamilyCheckpointPropertiesNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkCheckpointDataNV(
-    VulkanHandleMapping* handlemap,
-    VkCheckpointDataNV* toMap)
-{
+void handlemap_VkCheckpointDataNV(VulkanHandleMapping* handlemap, VkCheckpointDataNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -8101,104 +6294,79 @@
 #endif
 #ifdef VK_INTEL_shader_integer_functions2
 void handlemap_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_INTEL_performance_query
-void handlemap_VkPerformanceValueDataINTEL(
-    VulkanHandleMapping* handlemap,
-    VkPerformanceValueDataINTEL* toMap)
-{
+void handlemap_VkPerformanceValueDataINTEL(VulkanHandleMapping* handlemap,
+                                           VkPerformanceValueDataINTEL* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkPerformanceValueINTEL(
-    VulkanHandleMapping* handlemap,
-    VkPerformanceValueINTEL* toMap)
-{
+void handlemap_VkPerformanceValueINTEL(VulkanHandleMapping* handlemap,
+                                       VkPerformanceValueINTEL* toMap) {
     (void)handlemap;
     (void)toMap;
     handlemap_VkPerformanceValueDataINTEL(handlemap, (VkPerformanceValueDataINTEL*)(&toMap->data));
 }
 
-void handlemap_VkInitializePerformanceApiInfoINTEL(
-    VulkanHandleMapping* handlemap,
-    VkInitializePerformanceApiInfoINTEL* toMap)
-{
+void handlemap_VkInitializePerformanceApiInfoINTEL(VulkanHandleMapping* handlemap,
+                                                   VkInitializePerformanceApiInfoINTEL* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkQueryPoolPerformanceQueryCreateInfoINTEL(
-    VulkanHandleMapping* handlemap,
-    VkQueryPoolPerformanceQueryCreateInfoINTEL* toMap)
-{
+    VulkanHandleMapping* handlemap, VkQueryPoolPerformanceQueryCreateInfoINTEL* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkPerformanceMarkerInfoINTEL(
-    VulkanHandleMapping* handlemap,
-    VkPerformanceMarkerInfoINTEL* toMap)
-{
+void handlemap_VkPerformanceMarkerInfoINTEL(VulkanHandleMapping* handlemap,
+                                            VkPerformanceMarkerInfoINTEL* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkPerformanceStreamMarkerInfoINTEL(
-    VulkanHandleMapping* handlemap,
-    VkPerformanceStreamMarkerInfoINTEL* toMap)
-{
+void handlemap_VkPerformanceStreamMarkerInfoINTEL(VulkanHandleMapping* handlemap,
+                                                  VkPerformanceStreamMarkerInfoINTEL* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkPerformanceOverrideInfoINTEL(
-    VulkanHandleMapping* handlemap,
-    VkPerformanceOverrideInfoINTEL* toMap)
-{
+void handlemap_VkPerformanceOverrideInfoINTEL(VulkanHandleMapping* handlemap,
+                                              VkPerformanceOverrideInfoINTEL* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPerformanceConfigurationAcquireInfoINTEL(
-    VulkanHandleMapping* handlemap,
-    VkPerformanceConfigurationAcquireInfoINTEL* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPerformanceConfigurationAcquireInfoINTEL* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -8206,13 +6374,10 @@
 #endif
 #ifdef VK_EXT_pci_bus_info
 void handlemap_VkPhysicalDevicePCIBusInfoPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDevicePCIBusInfoPropertiesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDevicePCIBusInfoPropertiesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -8220,53 +6385,41 @@
 #endif
 #ifdef VK_AMD_display_native_hdr
 void handlemap_VkDisplayNativeHdrSurfaceCapabilitiesAMD(
-    VulkanHandleMapping* handlemap,
-    VkDisplayNativeHdrSurfaceCapabilitiesAMD* toMap)
-{
+    VulkanHandleMapping* handlemap, VkDisplayNativeHdrSurfaceCapabilitiesAMD* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkSwapchainDisplayNativeHdrCreateInfoAMD(
-    VulkanHandleMapping* handlemap,
-    VkSwapchainDisplayNativeHdrCreateInfoAMD* toMap)
-{
+    VulkanHandleMapping* handlemap, VkSwapchainDisplayNativeHdrCreateInfoAMD* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_FUCHSIA_imagepipe_surface
-void handlemap_VkImagePipeSurfaceCreateInfoFUCHSIA(
-    VulkanHandleMapping* handlemap,
-    VkImagePipeSurfaceCreateInfoFUCHSIA* toMap)
-{
+void handlemap_VkImagePipeSurfaceCreateInfoFUCHSIA(VulkanHandleMapping* handlemap,
+                                                   VkImagePipeSurfaceCreateInfoFUCHSIA* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_metal_surface
-void handlemap_VkMetalSurfaceCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkMetalSurfaceCreateInfoEXT* toMap)
-{
+void handlemap_VkMetalSurfaceCreateInfoEXT(VulkanHandleMapping* handlemap,
+                                           VkMetalSurfaceCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -8274,25 +6427,19 @@
 #endif
 #ifdef VK_EXT_fragment_density_map
 void handlemap_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceFragmentDensityMapFeaturesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceFragmentDensityMapFeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceFragmentDensityMapPropertiesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceFragmentDensityMapPropertiesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap_VkExtent2D(handlemap, (VkExtent2D*)(&toMap->minFragmentDensityTexelSize));
@@ -8300,16 +6447,14 @@
 }
 
 void handlemap_VkRenderPassFragmentDensityMapCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkRenderPassFragmentDensityMapCreateInfoEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkRenderPassFragmentDensityMapCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap_VkAttachmentReference(handlemap, (VkAttachmentReference*)(&toMap->fragmentDensityMapAttachment));
+    handlemap_VkAttachmentReference(handlemap,
+                                    (VkAttachmentReference*)(&toMap->fragmentDensityMapAttachment));
 }
 
 #endif
@@ -8321,37 +6466,28 @@
 #endif
 #ifdef VK_EXT_subgroup_size_control
 void handlemap_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -8359,13 +6495,10 @@
 #endif
 #ifdef VK_AMD_shader_core_properties2
 void handlemap_VkPhysicalDeviceShaderCoreProperties2AMD(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShaderCoreProperties2AMD* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShaderCoreProperties2AMD* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -8373,13 +6506,10 @@
 #endif
 #ifdef VK_AMD_device_coherent_memory
 void handlemap_VkPhysicalDeviceCoherentMemoryFeaturesAMD(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceCoherentMemoryFeaturesAMD* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceCoherentMemoryFeaturesAMD* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -8387,13 +6517,10 @@
 #endif
 #ifdef VK_EXT_shader_image_atomic_int64
 void handlemap_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -8401,13 +6528,10 @@
 #endif
 #ifdef VK_EXT_memory_budget
 void handlemap_VkPhysicalDeviceMemoryBudgetPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceMemoryBudgetPropertiesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceMemoryBudgetPropertiesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -8415,25 +6539,19 @@
 #endif
 #ifdef VK_EXT_memory_priority
 void handlemap_VkPhysicalDeviceMemoryPriorityFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceMemoryPriorityFeaturesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceMemoryPriorityFeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkMemoryPriorityAllocateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkMemoryPriorityAllocateInfoEXT* toMap)
-{
+void handlemap_VkMemoryPriorityAllocateInfoEXT(VulkanHandleMapping* handlemap,
+                                               VkMemoryPriorityAllocateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -8442,12 +6560,10 @@
 #ifdef VK_NV_dedicated_allocation_image_aliasing
 void handlemap_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(
     VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* toMap)
-{
+    VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -8455,39 +6571,30 @@
 #endif
 #ifdef VK_EXT_buffer_device_address
 void handlemap_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkBufferDeviceAddressCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkBufferDeviceAddressCreateInfoEXT* toMap)
-{
+void handlemap_VkBufferDeviceAddressCreateInfoEXT(VulkanHandleMapping* handlemap,
+                                                  VkBufferDeviceAddressCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_tooling_info
-void handlemap_VkPhysicalDeviceToolPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceToolPropertiesEXT* toMap)
-{
+void handlemap_VkPhysicalDeviceToolPropertiesEXT(VulkanHandleMapping* handlemap,
+                                                 VkPhysicalDeviceToolPropertiesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -8496,52 +6603,40 @@
 #ifdef VK_EXT_separate_stencil_usage
 #endif
 #ifdef VK_EXT_validation_features
-void handlemap_VkValidationFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkValidationFeaturesEXT* toMap)
-{
+void handlemap_VkValidationFeaturesEXT(VulkanHandleMapping* handlemap,
+                                       VkValidationFeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_NV_cooperative_matrix
-void handlemap_VkCooperativeMatrixPropertiesNV(
-    VulkanHandleMapping* handlemap,
-    VkCooperativeMatrixPropertiesNV* toMap)
-{
+void handlemap_VkCooperativeMatrixPropertiesNV(VulkanHandleMapping* handlemap,
+                                               VkCooperativeMatrixPropertiesNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceCooperativeMatrixFeaturesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceCooperativeMatrixFeaturesNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceCooperativeMatrixFeaturesNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceCooperativeMatrixPropertiesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceCooperativeMatrixPropertiesNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceCooperativeMatrixPropertiesNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -8549,37 +6644,28 @@
 #endif
 #ifdef VK_NV_coverage_reduction_mode
 void handlemap_VkPhysicalDeviceCoverageReductionModeFeaturesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceCoverageReductionModeFeaturesNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceCoverageReductionModeFeaturesNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPipelineCoverageReductionStateCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkPipelineCoverageReductionStateCreateInfoNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPipelineCoverageReductionStateCreateInfoNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkFramebufferMixedSamplesCombinationNV(
-    VulkanHandleMapping* handlemap,
-    VkFramebufferMixedSamplesCombinationNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkFramebufferMixedSamplesCombinationNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -8587,13 +6673,10 @@
 #endif
 #ifdef VK_EXT_fragment_shader_interlock
 void handlemap_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -8601,13 +6684,10 @@
 #endif
 #ifdef VK_EXT_ycbcr_image_arrays
 void handlemap_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -8615,89 +6695,69 @@
 #endif
 #ifdef VK_EXT_provoking_vertex
 void handlemap_VkPhysicalDeviceProvokingVertexFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceProvokingVertexFeaturesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceProvokingVertexFeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceProvokingVertexPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceProvokingVertexPropertiesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceProvokingVertexPropertiesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT(
     VulkanHandleMapping* handlemap,
-    VkPipelineRasterizationProvokingVertexStateCreateInfoEXT* toMap)
-{
+    VkPipelineRasterizationProvokingVertexStateCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_full_screen_exclusive
-void handlemap_VkSurfaceFullScreenExclusiveInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkSurfaceFullScreenExclusiveInfoEXT* toMap)
-{
+void handlemap_VkSurfaceFullScreenExclusiveInfoEXT(VulkanHandleMapping* handlemap,
+                                                   VkSurfaceFullScreenExclusiveInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkSurfaceCapabilitiesFullScreenExclusiveEXT(
-    VulkanHandleMapping* handlemap,
-    VkSurfaceCapabilitiesFullScreenExclusiveEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkSurfaceCapabilitiesFullScreenExclusiveEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkSurfaceFullScreenExclusiveWin32InfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkSurfaceFullScreenExclusiveWin32InfoEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkSurfaceFullScreenExclusiveWin32InfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_headless_surface
-void handlemap_VkHeadlessSurfaceCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkHeadlessSurfaceCreateInfoEXT* toMap)
-{
+void handlemap_VkHeadlessSurfaceCreateInfoEXT(VulkanHandleMapping* handlemap,
+                                              VkHeadlessSurfaceCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -8705,37 +6765,28 @@
 #endif
 #ifdef VK_EXT_line_rasterization
 void handlemap_VkPhysicalDeviceLineRasterizationFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceLineRasterizationFeaturesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceLineRasterizationFeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceLineRasterizationPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceLineRasterizationPropertiesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceLineRasterizationPropertiesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPipelineRasterizationLineStateCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkPipelineRasterizationLineStateCreateInfoEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPipelineRasterizationLineStateCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -8743,13 +6794,10 @@
 #endif
 #ifdef VK_EXT_shader_atomic_float
 void handlemap_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -8759,13 +6807,10 @@
 #endif
 #ifdef VK_EXT_index_type_uint8
 void handlemap_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceIndexTypeUint8FeaturesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceIndexTypeUint8FeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -8773,13 +6818,10 @@
 #endif
 #ifdef VK_EXT_extended_dynamic_state
 void handlemap_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -8787,13 +6829,10 @@
 #endif
 #ifdef VK_EXT_shader_atomic_float2
 void handlemap_VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -8802,12 +6841,10 @@
 #ifdef VK_EXT_shader_demote_to_helper_invocation
 void handlemap_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(
     VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* toMap)
-{
+    VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -8815,180 +6852,141 @@
 #endif
 #ifdef VK_NV_device_generated_commands
 void handlemap_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkGraphicsShaderGroupCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkGraphicsShaderGroupCreateInfoNV* toMap)
-{
+void handlemap_VkGraphicsShaderGroupCreateInfoNV(VulkanHandleMapping* handlemap,
+                                                 VkGraphicsShaderGroupCreateInfoNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pStages)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->stageCount; ++i)
-            {
-                handlemap_VkPipelineShaderStageCreateInfo(handlemap, (VkPipelineShaderStageCreateInfo*)(toMap->pStages + i));
+    if (toMap) {
+        if (toMap->pStages) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->stageCount; ++i) {
+                handlemap_VkPipelineShaderStageCreateInfo(
+                    handlemap, (VkPipelineShaderStageCreateInfo*)(toMap->pStages + i));
             }
         }
     }
-    if (toMap->pVertexInputState)
-    {
-        handlemap_VkPipelineVertexInputStateCreateInfo(handlemap, (VkPipelineVertexInputStateCreateInfo*)(toMap->pVertexInputState));
+    if (toMap->pVertexInputState) {
+        handlemap_VkPipelineVertexInputStateCreateInfo(
+            handlemap, (VkPipelineVertexInputStateCreateInfo*)(toMap->pVertexInputState));
     }
-    if (toMap->pTessellationState)
-    {
-        handlemap_VkPipelineTessellationStateCreateInfo(handlemap, (VkPipelineTessellationStateCreateInfo*)(toMap->pTessellationState));
+    if (toMap->pTessellationState) {
+        handlemap_VkPipelineTessellationStateCreateInfo(
+            handlemap, (VkPipelineTessellationStateCreateInfo*)(toMap->pTessellationState));
     }
 }
 
 void handlemap_VkGraphicsPipelineShaderGroupsCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkGraphicsPipelineShaderGroupsCreateInfoNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkGraphicsPipelineShaderGroupsCreateInfoNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pGroups)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->groupCount; ++i)
-            {
-                handlemap_VkGraphicsShaderGroupCreateInfoNV(handlemap, (VkGraphicsShaderGroupCreateInfoNV*)(toMap->pGroups + i));
+    if (toMap) {
+        if (toMap->pGroups) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->groupCount; ++i) {
+                handlemap_VkGraphicsShaderGroupCreateInfoNV(
+                    handlemap, (VkGraphicsShaderGroupCreateInfoNV*)(toMap->pGroups + i));
             }
         }
     }
-    if (toMap->pPipelines)
-    {
+    if (toMap->pPipelines) {
         handlemap->mapHandles_VkPipeline((VkPipeline*)toMap->pPipelines, toMap->pipelineCount);
     }
 }
 
-void handlemap_VkBindShaderGroupIndirectCommandNV(
-    VulkanHandleMapping* handlemap,
-    VkBindShaderGroupIndirectCommandNV* toMap)
-{
+void handlemap_VkBindShaderGroupIndirectCommandNV(VulkanHandleMapping* handlemap,
+                                                  VkBindShaderGroupIndirectCommandNV* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkBindIndexBufferIndirectCommandNV(
-    VulkanHandleMapping* handlemap,
-    VkBindIndexBufferIndirectCommandNV* toMap)
-{
+void handlemap_VkBindIndexBufferIndirectCommandNV(VulkanHandleMapping* handlemap,
+                                                  VkBindIndexBufferIndirectCommandNV* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkBindVertexBufferIndirectCommandNV(
-    VulkanHandleMapping* handlemap,
-    VkBindVertexBufferIndirectCommandNV* toMap)
-{
+void handlemap_VkBindVertexBufferIndirectCommandNV(VulkanHandleMapping* handlemap,
+                                                   VkBindVertexBufferIndirectCommandNV* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkSetStateFlagsIndirectCommandNV(
-    VulkanHandleMapping* handlemap,
-    VkSetStateFlagsIndirectCommandNV* toMap)
-{
+void handlemap_VkSetStateFlagsIndirectCommandNV(VulkanHandleMapping* handlemap,
+                                                VkSetStateFlagsIndirectCommandNV* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkIndirectCommandsStreamNV(
-    VulkanHandleMapping* handlemap,
-    VkIndirectCommandsStreamNV* toMap)
-{
+void handlemap_VkIndirectCommandsStreamNV(VulkanHandleMapping* handlemap,
+                                          VkIndirectCommandsStreamNV* toMap) {
     (void)handlemap;
     (void)toMap;
     handlemap->mapHandles_VkBuffer((VkBuffer*)&toMap->buffer);
 }
 
-void handlemap_VkIndirectCommandsLayoutTokenNV(
-    VulkanHandleMapping* handlemap,
-    VkIndirectCommandsLayoutTokenNV* toMap)
-{
+void handlemap_VkIndirectCommandsLayoutTokenNV(VulkanHandleMapping* handlemap,
+                                               VkIndirectCommandsLayoutTokenNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkPipelineLayout((VkPipelineLayout*)&toMap->pushconstantPipelineLayout);
 }
 
-void handlemap_VkIndirectCommandsLayoutCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkIndirectCommandsLayoutCreateInfoNV* toMap)
-{
+void handlemap_VkIndirectCommandsLayoutCreateInfoNV(VulkanHandleMapping* handlemap,
+                                                    VkIndirectCommandsLayoutCreateInfoNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pTokens)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->tokenCount; ++i)
-            {
-                handlemap_VkIndirectCommandsLayoutTokenNV(handlemap, (VkIndirectCommandsLayoutTokenNV*)(toMap->pTokens + i));
+    if (toMap) {
+        if (toMap->pTokens) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->tokenCount; ++i) {
+                handlemap_VkIndirectCommandsLayoutTokenNV(
+                    handlemap, (VkIndirectCommandsLayoutTokenNV*)(toMap->pTokens + i));
             }
         }
     }
 }
 
-void handlemap_VkGeneratedCommandsInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkGeneratedCommandsInfoNV* toMap)
-{
+void handlemap_VkGeneratedCommandsInfoNV(VulkanHandleMapping* handlemap,
+                                         VkGeneratedCommandsInfoNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkPipeline((VkPipeline*)&toMap->pipeline);
-    handlemap->mapHandles_VkIndirectCommandsLayoutNV((VkIndirectCommandsLayoutNV*)&toMap->indirectCommandsLayout);
-    if (toMap)
-    {
-        if (toMap->pStreams)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->streamCount; ++i)
-            {
-                handlemap_VkIndirectCommandsStreamNV(handlemap, (VkIndirectCommandsStreamNV*)(toMap->pStreams + i));
+    handlemap->mapHandles_VkIndirectCommandsLayoutNV(
+        (VkIndirectCommandsLayoutNV*)&toMap->indirectCommandsLayout);
+    if (toMap) {
+        if (toMap->pStreams) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->streamCount; ++i) {
+                handlemap_VkIndirectCommandsStreamNV(
+                    handlemap, (VkIndirectCommandsStreamNV*)(toMap->pStreams + i));
             }
         }
     }
@@ -8998,45 +6996,36 @@
 }
 
 void handlemap_VkGeneratedCommandsMemoryRequirementsInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkGeneratedCommandsMemoryRequirementsInfoNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkGeneratedCommandsMemoryRequirementsInfoNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkPipeline((VkPipeline*)&toMap->pipeline);
-    handlemap->mapHandles_VkIndirectCommandsLayoutNV((VkIndirectCommandsLayoutNV*)&toMap->indirectCommandsLayout);
+    handlemap->mapHandles_VkIndirectCommandsLayoutNV(
+        (VkIndirectCommandsLayoutNV*)&toMap->indirectCommandsLayout);
 }
 
 #endif
 #ifdef VK_NV_inherited_viewport_scissor
 void handlemap_VkPhysicalDeviceInheritedViewportScissorFeaturesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceInheritedViewportScissorFeaturesNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceInheritedViewportScissorFeaturesNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkCommandBufferInheritanceViewportScissorInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkCommandBufferInheritanceViewportScissorInfoNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkCommandBufferInheritanceViewportScissorInfoNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap->pViewportDepths)
-    {
+    if (toMap->pViewportDepths) {
         handlemap_VkViewport(handlemap, (VkViewport*)(toMap->pViewportDepths));
     }
 }
@@ -9044,51 +7033,39 @@
 #endif
 #ifdef VK_EXT_texel_buffer_alignment
 void handlemap_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_QCOM_render_pass_transform
-void handlemap_VkRenderPassTransformBeginInfoQCOM(
-    VulkanHandleMapping* handlemap,
-    VkRenderPassTransformBeginInfoQCOM* toMap)
-{
+void handlemap_VkRenderPassTransformBeginInfoQCOM(VulkanHandleMapping* handlemap,
+                                                  VkRenderPassTransformBeginInfoQCOM* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(
-    VulkanHandleMapping* handlemap,
-    VkCommandBufferInheritanceRenderPassTransformInfoQCOM* toMap)
-{
+    VulkanHandleMapping* handlemap, VkCommandBufferInheritanceRenderPassTransformInfoQCOM* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap_VkRect2D(handlemap, (VkRect2D*)(&toMap->renderArea));
@@ -9097,37 +7074,28 @@
 #endif
 #ifdef VK_EXT_device_memory_report
 void handlemap_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkDeviceMemoryReportCallbackDataEXT(
-    VulkanHandleMapping* handlemap,
-    VkDeviceMemoryReportCallbackDataEXT* toMap)
-{
+void handlemap_VkDeviceMemoryReportCallbackDataEXT(VulkanHandleMapping* handlemap,
+                                                   VkDeviceMemoryReportCallbackDataEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkDeviceDeviceMemoryReportCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkDeviceDeviceMemoryReportCreateInfoEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkDeviceDeviceMemoryReportCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -9137,25 +7105,19 @@
 #endif
 #ifdef VK_EXT_robustness2
 void handlemap_VkPhysicalDeviceRobustness2FeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceRobustness2FeaturesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceRobustness2FeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceRobustness2PropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceRobustness2PropertiesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceRobustness2PropertiesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -9163,38 +7125,29 @@
 #endif
 #ifdef VK_EXT_custom_border_color
 void handlemap_VkSamplerCustomBorderColorCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkSamplerCustomBorderColorCreateInfoEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkSamplerCustomBorderColorCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap_VkClearColorValue(handlemap, (VkClearColorValue*)(&toMap->customBorderColor));
 }
 
 void handlemap_VkPhysicalDeviceCustomBorderColorPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceCustomBorderColorPropertiesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceCustomBorderColorPropertiesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceCustomBorderColorFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceCustomBorderColorFeaturesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceCustomBorderColorFeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -9204,37 +7157,28 @@
 #endif
 #ifdef VK_EXT_private_data
 void handlemap_VkPhysicalDevicePrivateDataFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDevicePrivateDataFeaturesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDevicePrivateDataFeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkDevicePrivateDataCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkDevicePrivateDataCreateInfoEXT* toMap)
-{
+void handlemap_VkDevicePrivateDataCreateInfoEXT(VulkanHandleMapping* handlemap,
+                                                VkDevicePrivateDataCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkPrivateDataSlotCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkPrivateDataSlotCreateInfoEXT* toMap)
-{
+void handlemap_VkPrivateDataSlotCreateInfoEXT(VulkanHandleMapping* handlemap,
+                                              VkPrivateDataSlotCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -9243,12 +7187,10 @@
 #ifdef VK_EXT_pipeline_creation_cache_control
 void handlemap_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(
     VulkanHandleMapping* handlemap,
-    VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* toMap)
-{
+    VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -9256,25 +7198,19 @@
 #endif
 #ifdef VK_NV_device_diagnostics_config
 void handlemap_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceDiagnosticsConfigFeaturesNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceDiagnosticsConfigFeaturesNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkDeviceDiagnosticsConfigCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkDeviceDiagnosticsConfigCreateInfoNV* toMap)
-{
+void handlemap_VkDeviceDiagnosticsConfigCreateInfoNV(VulkanHandleMapping* handlemap,
+                                                     VkDeviceDiagnosticsConfigCreateInfoNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -9284,98 +7220,75 @@
 #endif
 #ifdef VK_NV_fragment_shading_rate_enums
 void handlemap_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkPipelineFragmentShadingRateEnumStateCreateInfoNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPipelineFragmentShadingRateEnumStateCreateInfoNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_NV_ray_tracing_motion_blur
-void handlemap_VkDeviceOrHostAddressConstKHR(
-    VulkanHandleMapping* handlemap,
-    VkDeviceOrHostAddressConstKHR* toMap)
-{
+void handlemap_VkDeviceOrHostAddressConstKHR(VulkanHandleMapping* handlemap,
+                                             VkDeviceOrHostAddressConstKHR* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
 void handlemap_VkAccelerationStructureGeometryMotionTrianglesDataNV(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureGeometryMotionTrianglesDataNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkAccelerationStructureGeometryMotionTrianglesDataNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap_VkDeviceOrHostAddressConstKHR(handlemap, (VkDeviceOrHostAddressConstKHR*)(&toMap->vertexData));
+    handlemap_VkDeviceOrHostAddressConstKHR(handlemap,
+                                            (VkDeviceOrHostAddressConstKHR*)(&toMap->vertexData));
 }
 
-void handlemap_VkAccelerationStructureMotionInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureMotionInfoNV* toMap)
-{
+void handlemap_VkAccelerationStructureMotionInfoNV(VulkanHandleMapping* handlemap,
+                                                   VkAccelerationStructureMotionInfoNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkAccelerationStructureMatrixMotionInstanceNV(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureMatrixMotionInstanceNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkAccelerationStructureMatrixMotionInstanceNV* toMap) {
     (void)handlemap;
     (void)toMap;
     handlemap_VkTransformMatrixKHR(handlemap, (VkTransformMatrixKHR*)(&toMap->transformT0));
     handlemap_VkTransformMatrixKHR(handlemap, (VkTransformMatrixKHR*)(&toMap->transformT1));
 }
 
-void handlemap_VkSRTDataNV(
-    VulkanHandleMapping* handlemap,
-    VkSRTDataNV* toMap)
-{
+void handlemap_VkSRTDataNV(VulkanHandleMapping* handlemap, VkSRTDataNV* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
 void handlemap_VkAccelerationStructureSRTMotionInstanceNV(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureSRTMotionInstanceNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkAccelerationStructureSRTMotionInstanceNV* toMap) {
     (void)handlemap;
     (void)toMap;
     handlemap_VkSRTDataNV(handlemap, (VkSRTDataNV*)(&toMap->transformT0));
@@ -9383,33 +7296,30 @@
 }
 
 void handlemap_VkAccelerationStructureMotionInstanceDataNV(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureMotionInstanceDataNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkAccelerationStructureMotionInstanceDataNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    handlemap_VkAccelerationStructureInstanceKHR(handlemap, (VkAccelerationStructureInstanceKHR*)(&toMap->staticInstance));
-    handlemap_VkAccelerationStructureMatrixMotionInstanceNV(handlemap, (VkAccelerationStructureMatrixMotionInstanceNV*)(&toMap->matrixMotionInstance));
-    handlemap_VkAccelerationStructureSRTMotionInstanceNV(handlemap, (VkAccelerationStructureSRTMotionInstanceNV*)(&toMap->srtMotionInstance));
+    handlemap_VkAccelerationStructureInstanceKHR(
+        handlemap, (VkAccelerationStructureInstanceKHR*)(&toMap->staticInstance));
+    handlemap_VkAccelerationStructureMatrixMotionInstanceNV(
+        handlemap, (VkAccelerationStructureMatrixMotionInstanceNV*)(&toMap->matrixMotionInstance));
+    handlemap_VkAccelerationStructureSRTMotionInstanceNV(
+        handlemap, (VkAccelerationStructureSRTMotionInstanceNV*)(&toMap->srtMotionInstance));
 }
 
 void handlemap_VkAccelerationStructureMotionInstanceNV(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureMotionInstanceNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkAccelerationStructureMotionInstanceNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    handlemap_VkAccelerationStructureMotionInstanceDataNV(handlemap, (VkAccelerationStructureMotionInstanceDataNV*)(&toMap->data));
+    handlemap_VkAccelerationStructureMotionInstanceDataNV(
+        handlemap, (VkAccelerationStructureMotionInstanceDataNV*)(&toMap->data));
 }
 
 void handlemap_VkPhysicalDeviceRayTracingMotionBlurFeaturesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceRayTracingMotionBlurFeaturesNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceRayTracingMotionBlurFeaturesNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -9417,13 +7327,10 @@
 #endif
 #ifdef VK_EXT_ycbcr_2plane_444_formats
 void handlemap_VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -9431,39 +7338,30 @@
 #endif
 #ifdef VK_EXT_fragment_density_map2
 void handlemap_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_QCOM_rotated_copy_commands
-void handlemap_VkCopyCommandTransformInfoQCOM(
-    VulkanHandleMapping* handlemap,
-    VkCopyCommandTransformInfoQCOM* toMap)
-{
+void handlemap_VkCopyCommandTransformInfoQCOM(VulkanHandleMapping* handlemap,
+                                              VkCopyCommandTransformInfoQCOM* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -9471,13 +7369,10 @@
 #endif
 #ifdef VK_EXT_image_robustness
 void handlemap_VkPhysicalDeviceImageRobustnessFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceImageRobustnessFeaturesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceImageRobustnessFeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -9485,13 +7380,10 @@
 #endif
 #ifdef VK_EXT_4444_formats
 void handlemap_VkPhysicalDevice4444FormatsFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDevice4444FormatsFeaturesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDevice4444FormatsFeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -9499,13 +7391,10 @@
 #endif
 #ifdef VK_EXT_rgba10x6_formats
 void handlemap_VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -9514,14 +7403,11 @@
 #ifdef VK_NV_acquire_winrt_display
 #endif
 #ifdef VK_EXT_directfb_surface
-void handlemap_VkDirectFBSurfaceCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkDirectFBSurfaceCreateInfoEXT* toMap)
-{
+void handlemap_VkDirectFBSurfaceCreateInfoEXT(VulkanHandleMapping* handlemap,
+                                              VkDirectFBSurfaceCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -9529,42 +7415,33 @@
 #endif
 #ifdef VK_VALVE_mutable_descriptor_type
 void handlemap_VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkMutableDescriptorTypeListVALVE(
-    VulkanHandleMapping* handlemap,
-    VkMutableDescriptorTypeListVALVE* toMap)
-{
+void handlemap_VkMutableDescriptorTypeListVALVE(VulkanHandleMapping* handlemap,
+                                                VkMutableDescriptorTypeListVALVE* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
 void handlemap_VkMutableDescriptorTypeCreateInfoVALVE(
-    VulkanHandleMapping* handlemap,
-    VkMutableDescriptorTypeCreateInfoVALVE* toMap)
-{
+    VulkanHandleMapping* handlemap, VkMutableDescriptorTypeCreateInfoVALVE* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pMutableDescriptorTypeLists)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->mutableDescriptorTypeListCount; ++i)
-            {
-                handlemap_VkMutableDescriptorTypeListVALVE(handlemap, (VkMutableDescriptorTypeListVALVE*)(toMap->pMutableDescriptorTypeLists + i));
+    if (toMap) {
+        if (toMap->pMutableDescriptorTypeLists) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->mutableDescriptorTypeListCount; ++i) {
+                handlemap_VkMutableDescriptorTypeListVALVE(
+                    handlemap,
+                    (VkMutableDescriptorTypeListVALVE*)(toMap->pMutableDescriptorTypeLists + i));
             }
         }
     }
@@ -9573,51 +7450,39 @@
 #endif
 #ifdef VK_EXT_vertex_input_dynamic_state
 void handlemap_VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkVertexInputBindingDescription2EXT(
-    VulkanHandleMapping* handlemap,
-    VkVertexInputBindingDescription2EXT* toMap)
-{
+void handlemap_VkVertexInputBindingDescription2EXT(VulkanHandleMapping* handlemap,
+                                                   VkVertexInputBindingDescription2EXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkVertexInputAttributeDescription2EXT(
-    VulkanHandleMapping* handlemap,
-    VkVertexInputAttributeDescription2EXT* toMap)
-{
+void handlemap_VkVertexInputAttributeDescription2EXT(VulkanHandleMapping* handlemap,
+                                                     VkVertexInputAttributeDescription2EXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_physical_device_drm
-void handlemap_VkPhysicalDeviceDrmPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceDrmPropertiesEXT* toMap)
-{
+void handlemap_VkPhysicalDeviceDrmPropertiesEXT(VulkanHandleMapping* handlemap,
+                                                VkPhysicalDeviceDrmPropertiesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -9626,50 +7491,39 @@
 #ifdef VK_EXT_primitive_topology_list_restart
 void handlemap_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT(
     VulkanHandleMapping* handlemap,
-    VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT* toMap)
-{
+    VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_FUCHSIA_external_memory
-void handlemap_VkImportMemoryZirconHandleInfoFUCHSIA(
-    VulkanHandleMapping* handlemap,
-    VkImportMemoryZirconHandleInfoFUCHSIA* toMap)
-{
+void handlemap_VkImportMemoryZirconHandleInfoFUCHSIA(VulkanHandleMapping* handlemap,
+                                                     VkImportMemoryZirconHandleInfoFUCHSIA* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkMemoryZirconHandlePropertiesFUCHSIA(
-    VulkanHandleMapping* handlemap,
-    VkMemoryZirconHandlePropertiesFUCHSIA* toMap)
-{
+void handlemap_VkMemoryZirconHandlePropertiesFUCHSIA(VulkanHandleMapping* handlemap,
+                                                     VkMemoryZirconHandlePropertiesFUCHSIA* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkMemoryGetZirconHandleInfoFUCHSIA(
-    VulkanHandleMapping* handlemap,
-    VkMemoryGetZirconHandleInfoFUCHSIA* toMap)
-{
+void handlemap_VkMemoryGetZirconHandleInfoFUCHSIA(VulkanHandleMapping* handlemap,
+                                                  VkMemoryGetZirconHandleInfoFUCHSIA* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkDeviceMemory((VkDeviceMemory*)&toMap->memory);
@@ -9678,26 +7532,20 @@
 #endif
 #ifdef VK_FUCHSIA_external_semaphore
 void handlemap_VkImportSemaphoreZirconHandleInfoFUCHSIA(
-    VulkanHandleMapping* handlemap,
-    VkImportSemaphoreZirconHandleInfoFUCHSIA* toMap)
-{
+    VulkanHandleMapping* handlemap, VkImportSemaphoreZirconHandleInfoFUCHSIA* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkSemaphore((VkSemaphore*)&toMap->semaphore);
 }
 
-void handlemap_VkSemaphoreGetZirconHandleInfoFUCHSIA(
-    VulkanHandleMapping* handlemap,
-    VkSemaphoreGetZirconHandleInfoFUCHSIA* toMap)
-{
+void handlemap_VkSemaphoreGetZirconHandleInfoFUCHSIA(VulkanHandleMapping* handlemap,
+                                                     VkSemaphoreGetZirconHandleInfoFUCHSIA* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkSemaphore((VkSemaphore*)&toMap->semaphore);
@@ -9705,184 +7553,150 @@
 
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
-void handlemap_VkBufferCollectionCreateInfoFUCHSIA(
-    VulkanHandleMapping* handlemap,
-    VkBufferCollectionCreateInfoFUCHSIA* toMap)
-{
+void handlemap_VkBufferCollectionCreateInfoFUCHSIA(VulkanHandleMapping* handlemap,
+                                                   VkBufferCollectionCreateInfoFUCHSIA* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkImportMemoryBufferCollectionFUCHSIA(
-    VulkanHandleMapping* handlemap,
-    VkImportMemoryBufferCollectionFUCHSIA* toMap)
-{
+void handlemap_VkImportMemoryBufferCollectionFUCHSIA(VulkanHandleMapping* handlemap,
+                                                     VkImportMemoryBufferCollectionFUCHSIA* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkBufferCollectionFUCHSIA((VkBufferCollectionFUCHSIA*)&toMap->collection);
 }
 
 void handlemap_VkBufferCollectionImageCreateInfoFUCHSIA(
-    VulkanHandleMapping* handlemap,
-    VkBufferCollectionImageCreateInfoFUCHSIA* toMap)
-{
+    VulkanHandleMapping* handlemap, VkBufferCollectionImageCreateInfoFUCHSIA* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkBufferCollectionFUCHSIA((VkBufferCollectionFUCHSIA*)&toMap->collection);
 }
 
 void handlemap_VkBufferCollectionConstraintsInfoFUCHSIA(
-    VulkanHandleMapping* handlemap,
-    VkBufferCollectionConstraintsInfoFUCHSIA* toMap)
-{
+    VulkanHandleMapping* handlemap, VkBufferCollectionConstraintsInfoFUCHSIA* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkBufferConstraintsInfoFUCHSIA(
-    VulkanHandleMapping* handlemap,
-    VkBufferConstraintsInfoFUCHSIA* toMap)
-{
+void handlemap_VkBufferConstraintsInfoFUCHSIA(VulkanHandleMapping* handlemap,
+                                              VkBufferConstraintsInfoFUCHSIA* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap_VkBufferCreateInfo(handlemap, (VkBufferCreateInfo*)(&toMap->createInfo));
-    handlemap_VkBufferCollectionConstraintsInfoFUCHSIA(handlemap, (VkBufferCollectionConstraintsInfoFUCHSIA*)(&toMap->bufferCollectionConstraints));
+    handlemap_VkBufferCollectionConstraintsInfoFUCHSIA(
+        handlemap,
+        (VkBufferCollectionConstraintsInfoFUCHSIA*)(&toMap->bufferCollectionConstraints));
 }
 
 void handlemap_VkBufferCollectionBufferCreateInfoFUCHSIA(
-    VulkanHandleMapping* handlemap,
-    VkBufferCollectionBufferCreateInfoFUCHSIA* toMap)
-{
+    VulkanHandleMapping* handlemap, VkBufferCollectionBufferCreateInfoFUCHSIA* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkBufferCollectionFUCHSIA((VkBufferCollectionFUCHSIA*)&toMap->collection);
 }
 
-void handlemap_VkSysmemColorSpaceFUCHSIA(
-    VulkanHandleMapping* handlemap,
-    VkSysmemColorSpaceFUCHSIA* toMap)
-{
+void handlemap_VkSysmemColorSpaceFUCHSIA(VulkanHandleMapping* handlemap,
+                                         VkSysmemColorSpaceFUCHSIA* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkBufferCollectionPropertiesFUCHSIA(
-    VulkanHandleMapping* handlemap,
-    VkBufferCollectionPropertiesFUCHSIA* toMap)
-{
+void handlemap_VkBufferCollectionPropertiesFUCHSIA(VulkanHandleMapping* handlemap,
+                                                   VkBufferCollectionPropertiesFUCHSIA* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap_VkSysmemColorSpaceFUCHSIA(handlemap, (VkSysmemColorSpaceFUCHSIA*)(&toMap->sysmemColorSpaceIndex));
-    handlemap_VkComponentMapping(handlemap, (VkComponentMapping*)(&toMap->samplerYcbcrConversionComponents));
+    handlemap_VkSysmemColorSpaceFUCHSIA(
+        handlemap, (VkSysmemColorSpaceFUCHSIA*)(&toMap->sysmemColorSpaceIndex));
+    handlemap_VkComponentMapping(handlemap,
+                                 (VkComponentMapping*)(&toMap->samplerYcbcrConversionComponents));
 }
 
-void handlemap_VkImageFormatConstraintsInfoFUCHSIA(
-    VulkanHandleMapping* handlemap,
-    VkImageFormatConstraintsInfoFUCHSIA* toMap)
-{
+void handlemap_VkImageFormatConstraintsInfoFUCHSIA(VulkanHandleMapping* handlemap,
+                                                   VkImageFormatConstraintsInfoFUCHSIA* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap_VkImageCreateInfo(handlemap, (VkImageCreateInfo*)(&toMap->imageCreateInfo));
-    if (toMap->pColorSpaces)
-    {
-        handlemap_VkSysmemColorSpaceFUCHSIA(handlemap, (VkSysmemColorSpaceFUCHSIA*)(toMap->pColorSpaces));
+    if (toMap->pColorSpaces) {
+        handlemap_VkSysmemColorSpaceFUCHSIA(handlemap,
+                                            (VkSysmemColorSpaceFUCHSIA*)(toMap->pColorSpaces));
     }
 }
 
-void handlemap_VkImageConstraintsInfoFUCHSIA(
-    VulkanHandleMapping* handlemap,
-    VkImageConstraintsInfoFUCHSIA* toMap)
-{
+void handlemap_VkImageConstraintsInfoFUCHSIA(VulkanHandleMapping* handlemap,
+                                             VkImageConstraintsInfoFUCHSIA* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pFormatConstraints)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->formatConstraintsCount; ++i)
-            {
-                handlemap_VkImageFormatConstraintsInfoFUCHSIA(handlemap, (VkImageFormatConstraintsInfoFUCHSIA*)(toMap->pFormatConstraints + i));
+    if (toMap) {
+        if (toMap->pFormatConstraints) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->formatConstraintsCount; ++i) {
+                handlemap_VkImageFormatConstraintsInfoFUCHSIA(
+                    handlemap,
+                    (VkImageFormatConstraintsInfoFUCHSIA*)(toMap->pFormatConstraints + i));
             }
         }
     }
-    handlemap_VkBufferCollectionConstraintsInfoFUCHSIA(handlemap, (VkBufferCollectionConstraintsInfoFUCHSIA*)(&toMap->bufferCollectionConstraints));
+    handlemap_VkBufferCollectionConstraintsInfoFUCHSIA(
+        handlemap,
+        (VkBufferCollectionConstraintsInfoFUCHSIA*)(&toMap->bufferCollectionConstraints));
 }
 
 #endif
 #ifdef VK_HUAWEI_subpass_shading
 void handlemap_VkSubpassShadingPipelineCreateInfoHUAWEI(
-    VulkanHandleMapping* handlemap,
-    VkSubpassShadingPipelineCreateInfoHUAWEI* toMap)
-{
+    VulkanHandleMapping* handlemap, VkSubpassShadingPipelineCreateInfoHUAWEI* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkRenderPass((VkRenderPass*)&toMap->renderPass);
 }
 
 void handlemap_VkPhysicalDeviceSubpassShadingFeaturesHUAWEI(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceSubpassShadingFeaturesHUAWEI* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceSubpassShadingFeaturesHUAWEI* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceSubpassShadingPropertiesHUAWEI(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceSubpassShadingPropertiesHUAWEI* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceSubpassShadingPropertiesHUAWEI* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -9890,40 +7704,31 @@
 #endif
 #ifdef VK_HUAWEI_invocation_mask
 void handlemap_VkPhysicalDeviceInvocationMaskFeaturesHUAWEI(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceInvocationMaskFeaturesHUAWEI* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceInvocationMaskFeaturesHUAWEI* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_NV_external_memory_rdma
-void handlemap_VkMemoryGetRemoteAddressInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkMemoryGetRemoteAddressInfoNV* toMap)
-{
+void handlemap_VkMemoryGetRemoteAddressInfoNV(VulkanHandleMapping* handlemap,
+                                              VkMemoryGetRemoteAddressInfoNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkDeviceMemory((VkDeviceMemory*)&toMap->memory);
 }
 
 void handlemap_VkPhysicalDeviceExternalMemoryRDMAFeaturesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceExternalMemoryRDMAFeaturesNV* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceExternalMemoryRDMAFeaturesNV* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -9931,27 +7736,21 @@
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
 void handlemap_VkPhysicalDeviceExtendedDynamicState2FeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceExtendedDynamicState2FeaturesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceExtendedDynamicState2FeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_QNX_screen_surface
-void handlemap_VkScreenSurfaceCreateInfoQNX(
-    VulkanHandleMapping* handlemap,
-    VkScreenSurfaceCreateInfoQNX* toMap)
-{
+void handlemap_VkScreenSurfaceCreateInfoQNX(VulkanHandleMapping* handlemap,
+                                            VkScreenSurfaceCreateInfoQNX* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -9959,63 +7758,47 @@
 #endif
 #ifdef VK_EXT_color_write_enable
 void handlemap_VkPhysicalDeviceColorWriteEnableFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceColorWriteEnableFeaturesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceColorWriteEnableFeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkPipelineColorWriteCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkPipelineColorWriteCreateInfoEXT* toMap)
-{
+void handlemap_VkPipelineColorWriteCreateInfoEXT(VulkanHandleMapping* handlemap,
+                                                 VkPipelineColorWriteCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_GOOGLE_gfxstream
-void handlemap_VkImportColorBufferGOOGLE(
-    VulkanHandleMapping* handlemap,
-    VkImportColorBufferGOOGLE* toMap)
-{
+void handlemap_VkImportColorBufferGOOGLE(VulkanHandleMapping* handlemap,
+                                         VkImportColorBufferGOOGLE* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkImportBufferGOOGLE(
-    VulkanHandleMapping* handlemap,
-    VkImportBufferGOOGLE* toMap)
-{
+void handlemap_VkImportBufferGOOGLE(VulkanHandleMapping* handlemap, VkImportBufferGOOGLE* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkImportPhysicalAddressGOOGLE(
-    VulkanHandleMapping* handlemap,
-    VkImportPhysicalAddressGOOGLE* toMap)
-{
+void handlemap_VkImportPhysicalAddressGOOGLE(VulkanHandleMapping* handlemap,
+                                             VkImportPhysicalAddressGOOGLE* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
@@ -10023,67 +7806,50 @@
 #endif
 #ifdef VK_EXT_global_priority_query
 void handlemap_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkQueueFamilyGlobalPriorityPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkQueueFamilyGlobalPriorityPropertiesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkQueueFamilyGlobalPriorityPropertiesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_multi_draw
-void handlemap_VkPhysicalDeviceMultiDrawFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceMultiDrawFeaturesEXT* toMap)
-{
+void handlemap_VkPhysicalDeviceMultiDrawFeaturesEXT(VulkanHandleMapping* handlemap,
+                                                    VkPhysicalDeviceMultiDrawFeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceMultiDrawPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceMultiDrawPropertiesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceMultiDrawPropertiesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkMultiDrawInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkMultiDrawInfoEXT* toMap)
-{
+void handlemap_VkMultiDrawInfoEXT(VulkanHandleMapping* handlemap, VkMultiDrawInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkMultiDrawIndexedInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkMultiDrawIndexedInfoEXT* toMap)
-{
+void handlemap_VkMultiDrawIndexedInfoEXT(VulkanHandleMapping* handlemap,
+                                         VkMultiDrawIndexedInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
 }
@@ -10093,25 +7859,19 @@
 #endif
 #ifdef VK_EXT_border_color_swizzle
 void handlemap_VkPhysicalDeviceBorderColorSwizzleFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceBorderColorSwizzleFeaturesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceBorderColorSwizzleFeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkSamplerBorderColorComponentMappingCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkSamplerBorderColorComponentMappingCreateInfoEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkSamplerBorderColorComponentMappingCreateInfoEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap_VkComponentMapping(handlemap, (VkComponentMapping*)(&toMap->components));
@@ -10120,211 +7880,177 @@
 #endif
 #ifdef VK_EXT_pageable_device_local_memory
 void handlemap_VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_KHR_acceleration_structure
-void handlemap_VkDeviceOrHostAddressKHR(
-    VulkanHandleMapping* handlemap,
-    VkDeviceOrHostAddressKHR* toMap)
-{
+void handlemap_VkDeviceOrHostAddressKHR(VulkanHandleMapping* handlemap,
+                                        VkDeviceOrHostAddressKHR* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
 void handlemap_VkAccelerationStructureBuildRangeInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureBuildRangeInfoKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkAccelerationStructureBuildRangeInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
 void handlemap_VkAccelerationStructureGeometryTrianglesDataKHR(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureGeometryTrianglesDataKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkAccelerationStructureGeometryTrianglesDataKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap_VkDeviceOrHostAddressConstKHR(handlemap, (VkDeviceOrHostAddressConstKHR*)(&toMap->vertexData));
-    handlemap_VkDeviceOrHostAddressConstKHR(handlemap, (VkDeviceOrHostAddressConstKHR*)(&toMap->indexData));
-    handlemap_VkDeviceOrHostAddressConstKHR(handlemap, (VkDeviceOrHostAddressConstKHR*)(&toMap->transformData));
+    handlemap_VkDeviceOrHostAddressConstKHR(handlemap,
+                                            (VkDeviceOrHostAddressConstKHR*)(&toMap->vertexData));
+    handlemap_VkDeviceOrHostAddressConstKHR(handlemap,
+                                            (VkDeviceOrHostAddressConstKHR*)(&toMap->indexData));
+    handlemap_VkDeviceOrHostAddressConstKHR(
+        handlemap, (VkDeviceOrHostAddressConstKHR*)(&toMap->transformData));
 }
 
 void handlemap_VkAccelerationStructureGeometryAabbsDataKHR(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureGeometryAabbsDataKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkAccelerationStructureGeometryAabbsDataKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap_VkDeviceOrHostAddressConstKHR(handlemap, (VkDeviceOrHostAddressConstKHR*)(&toMap->data));
+    handlemap_VkDeviceOrHostAddressConstKHR(handlemap,
+                                            (VkDeviceOrHostAddressConstKHR*)(&toMap->data));
 }
 
 void handlemap_VkAccelerationStructureGeometryInstancesDataKHR(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureGeometryInstancesDataKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkAccelerationStructureGeometryInstancesDataKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap_VkDeviceOrHostAddressConstKHR(handlemap, (VkDeviceOrHostAddressConstKHR*)(&toMap->data));
+    handlemap_VkDeviceOrHostAddressConstKHR(handlemap,
+                                            (VkDeviceOrHostAddressConstKHR*)(&toMap->data));
 }
 
 void handlemap_VkAccelerationStructureGeometryDataKHR(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureGeometryDataKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkAccelerationStructureGeometryDataKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    handlemap_VkAccelerationStructureGeometryTrianglesDataKHR(handlemap, (VkAccelerationStructureGeometryTrianglesDataKHR*)(&toMap->triangles));
-    handlemap_VkAccelerationStructureGeometryAabbsDataKHR(handlemap, (VkAccelerationStructureGeometryAabbsDataKHR*)(&toMap->aabbs));
-    handlemap_VkAccelerationStructureGeometryInstancesDataKHR(handlemap, (VkAccelerationStructureGeometryInstancesDataKHR*)(&toMap->instances));
+    handlemap_VkAccelerationStructureGeometryTrianglesDataKHR(
+        handlemap, (VkAccelerationStructureGeometryTrianglesDataKHR*)(&toMap->triangles));
+    handlemap_VkAccelerationStructureGeometryAabbsDataKHR(
+        handlemap, (VkAccelerationStructureGeometryAabbsDataKHR*)(&toMap->aabbs));
+    handlemap_VkAccelerationStructureGeometryInstancesDataKHR(
+        handlemap, (VkAccelerationStructureGeometryInstancesDataKHR*)(&toMap->instances));
 }
 
-void handlemap_VkAccelerationStructureGeometryKHR(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureGeometryKHR* toMap)
-{
+void handlemap_VkAccelerationStructureGeometryKHR(VulkanHandleMapping* handlemap,
+                                                  VkAccelerationStructureGeometryKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap_VkAccelerationStructureGeometryDataKHR(handlemap, (VkAccelerationStructureGeometryDataKHR*)(&toMap->geometry));
+    handlemap_VkAccelerationStructureGeometryDataKHR(
+        handlemap, (VkAccelerationStructureGeometryDataKHR*)(&toMap->geometry));
 }
 
 void handlemap_VkAccelerationStructureBuildGeometryInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureBuildGeometryInfoKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkAccelerationStructureBuildGeometryInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap->mapHandles_VkAccelerationStructureKHR((VkAccelerationStructureKHR*)&toMap->srcAccelerationStructure);
-    handlemap->mapHandles_VkAccelerationStructureKHR((VkAccelerationStructureKHR*)&toMap->dstAccelerationStructure);
-    if (toMap)
-    {
-        if (toMap->pGeometries)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->geometryCount; ++i)
-            {
-                handlemap_VkAccelerationStructureGeometryKHR(handlemap, (VkAccelerationStructureGeometryKHR*)(toMap->pGeometries + i));
+    handlemap->mapHandles_VkAccelerationStructureKHR(
+        (VkAccelerationStructureKHR*)&toMap->srcAccelerationStructure);
+    handlemap->mapHandles_VkAccelerationStructureKHR(
+        (VkAccelerationStructureKHR*)&toMap->dstAccelerationStructure);
+    if (toMap) {
+        if (toMap->pGeometries) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->geometryCount; ++i) {
+                handlemap_VkAccelerationStructureGeometryKHR(
+                    handlemap, (VkAccelerationStructureGeometryKHR*)(toMap->pGeometries + i));
             }
         }
     }
     handlemap_VkDeviceOrHostAddressKHR(handlemap, (VkDeviceOrHostAddressKHR*)(&toMap->scratchData));
 }
 
-void handlemap_VkAccelerationStructureCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureCreateInfoKHR* toMap)
-{
+void handlemap_VkAccelerationStructureCreateInfoKHR(VulkanHandleMapping* handlemap,
+                                                    VkAccelerationStructureCreateInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkBuffer((VkBuffer*)&toMap->buffer);
 }
 
 void handlemap_VkWriteDescriptorSetAccelerationStructureKHR(
-    VulkanHandleMapping* handlemap,
-    VkWriteDescriptorSetAccelerationStructureKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkWriteDescriptorSetAccelerationStructureKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap->pAccelerationStructures)
-    {
-        handlemap->mapHandles_VkAccelerationStructureKHR((VkAccelerationStructureKHR*)toMap->pAccelerationStructures, toMap->accelerationStructureCount);
+    if (toMap->pAccelerationStructures) {
+        handlemap->mapHandles_VkAccelerationStructureKHR(
+            (VkAccelerationStructureKHR*)toMap->pAccelerationStructures,
+            toMap->accelerationStructureCount);
     }
 }
 
 void handlemap_VkPhysicalDeviceAccelerationStructureFeaturesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceAccelerationStructureFeaturesKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceAccelerationStructureFeaturesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceAccelerationStructurePropertiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceAccelerationStructurePropertiesKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceAccelerationStructurePropertiesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkAccelerationStructureDeviceAddressInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureDeviceAddressInfoKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkAccelerationStructureDeviceAddressInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap->mapHandles_VkAccelerationStructureKHR((VkAccelerationStructureKHR*)&toMap->accelerationStructure);
+    handlemap->mapHandles_VkAccelerationStructureKHR(
+        (VkAccelerationStructureKHR*)&toMap->accelerationStructure);
 }
 
-void handlemap_VkAccelerationStructureVersionInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureVersionInfoKHR* toMap)
-{
+void handlemap_VkAccelerationStructureVersionInfoKHR(VulkanHandleMapping* handlemap,
+                                                     VkAccelerationStructureVersionInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkCopyAccelerationStructureToMemoryInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkCopyAccelerationStructureToMemoryInfoKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkCopyAccelerationStructureToMemoryInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkAccelerationStructureKHR((VkAccelerationStructureKHR*)&toMap->src);
@@ -10332,27 +8058,22 @@
 }
 
 void handlemap_VkCopyMemoryToAccelerationStructureInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkCopyMemoryToAccelerationStructureInfoKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkCopyMemoryToAccelerationStructureInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    handlemap_VkDeviceOrHostAddressConstKHR(handlemap, (VkDeviceOrHostAddressConstKHR*)(&toMap->src));
+    handlemap_VkDeviceOrHostAddressConstKHR(handlemap,
+                                            (VkDeviceOrHostAddressConstKHR*)(&toMap->src));
     handlemap->mapHandles_VkAccelerationStructureKHR((VkAccelerationStructureKHR*)&toMap->dst);
 }
 
-void handlemap_VkCopyAccelerationStructureInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkCopyAccelerationStructureInfoKHR* toMap)
-{
+void handlemap_VkCopyAccelerationStructureInfoKHR(VulkanHandleMapping* handlemap,
+                                                  VkCopyAccelerationStructureInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
     handlemap->mapHandles_VkAccelerationStructureKHR((VkAccelerationStructureKHR*)&toMap->src);
@@ -10360,2242 +8081,2511 @@
 }
 
 void handlemap_VkAccelerationStructureBuildSizesInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureBuildSizesInfoKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkAccelerationStructureBuildSizesInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
-void handlemap_VkRayTracingShaderGroupCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkRayTracingShaderGroupCreateInfoKHR* toMap)
-{
+void handlemap_VkRayTracingShaderGroupCreateInfoKHR(VulkanHandleMapping* handlemap,
+                                                    VkRayTracingShaderGroupCreateInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkRayTracingPipelineInterfaceCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkRayTracingPipelineInterfaceCreateInfoKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkRayTracingPipelineInterfaceCreateInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkRayTracingPipelineCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkRayTracingPipelineCreateInfoKHR* toMap)
-{
+void handlemap_VkRayTracingPipelineCreateInfoKHR(VulkanHandleMapping* handlemap,
+                                                 VkRayTracingPipelineCreateInfoKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
-    if (toMap)
-    {
-        if (toMap->pStages)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->stageCount; ++i)
-            {
-                handlemap_VkPipelineShaderStageCreateInfo(handlemap, (VkPipelineShaderStageCreateInfo*)(toMap->pStages + i));
+    if (toMap) {
+        if (toMap->pStages) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->stageCount; ++i) {
+                handlemap_VkPipelineShaderStageCreateInfo(
+                    handlemap, (VkPipelineShaderStageCreateInfo*)(toMap->pStages + i));
             }
         }
     }
-    if (toMap)
-    {
-        if (toMap->pGroups)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toMap->groupCount; ++i)
-            {
-                handlemap_VkRayTracingShaderGroupCreateInfoKHR(handlemap, (VkRayTracingShaderGroupCreateInfoKHR*)(toMap->pGroups + i));
+    if (toMap) {
+        if (toMap->pGroups) {
+            for (uint32_t i = 0; i < (uint32_t)toMap->groupCount; ++i) {
+                handlemap_VkRayTracingShaderGroupCreateInfoKHR(
+                    handlemap, (VkRayTracingShaderGroupCreateInfoKHR*)(toMap->pGroups + i));
             }
         }
     }
-    if (toMap->pLibraryInfo)
-    {
-        handlemap_VkPipelineLibraryCreateInfoKHR(handlemap, (VkPipelineLibraryCreateInfoKHR*)(toMap->pLibraryInfo));
+    if (toMap->pLibraryInfo) {
+        handlemap_VkPipelineLibraryCreateInfoKHR(
+            handlemap, (VkPipelineLibraryCreateInfoKHR*)(toMap->pLibraryInfo));
     }
-    if (toMap->pLibraryInterface)
-    {
-        handlemap_VkRayTracingPipelineInterfaceCreateInfoKHR(handlemap, (VkRayTracingPipelineInterfaceCreateInfoKHR*)(toMap->pLibraryInterface));
+    if (toMap->pLibraryInterface) {
+        handlemap_VkRayTracingPipelineInterfaceCreateInfoKHR(
+            handlemap, (VkRayTracingPipelineInterfaceCreateInfoKHR*)(toMap->pLibraryInterface));
     }
-    if (toMap->pDynamicState)
-    {
-        handlemap_VkPipelineDynamicStateCreateInfo(handlemap, (VkPipelineDynamicStateCreateInfo*)(toMap->pDynamicState));
+    if (toMap->pDynamicState) {
+        handlemap_VkPipelineDynamicStateCreateInfo(
+            handlemap, (VkPipelineDynamicStateCreateInfo*)(toMap->pDynamicState));
     }
     handlemap->mapHandles_VkPipelineLayout((VkPipelineLayout*)&toMap->layout);
     handlemap->mapHandles_VkPipeline((VkPipeline*)&toMap->basePipelineHandle);
 }
 
 void handlemap_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceRayTracingPipelineFeaturesKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceRayTracingPipelineFeaturesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 void handlemap_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceRayTracingPipelinePropertiesKHR* toMap)
-{
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceRayTracingPipelinePropertiesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
-void handlemap_VkStridedDeviceAddressRegionKHR(
-    VulkanHandleMapping* handlemap,
-    VkStridedDeviceAddressRegionKHR* toMap)
-{
+void handlemap_VkStridedDeviceAddressRegionKHR(VulkanHandleMapping* handlemap,
+                                               VkStridedDeviceAddressRegionKHR* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
-void handlemap_VkTraceRaysIndirectCommandKHR(
-    VulkanHandleMapping* handlemap,
-    VkTraceRaysIndirectCommandKHR* toMap)
-{
+void handlemap_VkTraceRaysIndirectCommandKHR(VulkanHandleMapping* handlemap,
+                                             VkTraceRaysIndirectCommandKHR* toMap) {
     (void)handlemap;
     (void)toMap;
 }
 
 #endif
 #ifdef VK_KHR_ray_query
-void handlemap_VkPhysicalDeviceRayQueryFeaturesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceRayQueryFeaturesKHR* toMap)
-{
+void handlemap_VkPhysicalDeviceRayQueryFeaturesKHR(VulkanHandleMapping* handlemap,
+                                                   VkPhysicalDeviceRayQueryFeaturesKHR* toMap) {
     (void)handlemap;
     (void)toMap;
-    if (toMap->pNext)
-    {
+    if (toMap->pNext) {
         handlemap_extension_struct(handlemap, (void*)(toMap->pNext));
     }
 }
 
 #endif
-void handlemap_extension_struct(
-    VulkanHandleMapping* handlemap,
-    void* structExtension_out)
-{
-    if (!structExtension_out)
-    {
+void handlemap_extension_struct(VulkanHandleMapping* handlemap, void* structExtension_out) {
+    if (!structExtension_out) {
         return;
     }
     uint32_t structType = (uint32_t)goldfish_vk_struct_type(structExtension_out);
-    switch(structType)
-    {
+    switch (structType) {
 #ifdef VK_VERSION_1_1
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES:
-        {
-            handlemap_VkPhysicalDeviceSubgroupProperties(handlemap, reinterpret_cast<VkPhysicalDeviceSubgroupProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES: {
+            handlemap_VkPhysicalDeviceSubgroupProperties(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceSubgroupProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES:
-        {
-            handlemap_VkPhysicalDevice16BitStorageFeatures(handlemap, reinterpret_cast<VkPhysicalDevice16BitStorageFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES: {
+            handlemap_VkPhysicalDevice16BitStorageFeatures(
+                handlemap,
+                reinterpret_cast<VkPhysicalDevice16BitStorageFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS:
-        {
-            handlemap_VkMemoryDedicatedRequirements(handlemap, reinterpret_cast<VkMemoryDedicatedRequirements*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS: {
+            handlemap_VkMemoryDedicatedRequirements(
+                handlemap, reinterpret_cast<VkMemoryDedicatedRequirements*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO:
-        {
-            handlemap_VkMemoryDedicatedAllocateInfo(handlemap, reinterpret_cast<VkMemoryDedicatedAllocateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO: {
+            handlemap_VkMemoryDedicatedAllocateInfo(
+                handlemap, reinterpret_cast<VkMemoryDedicatedAllocateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO:
-        {
-            handlemap_VkMemoryAllocateFlagsInfo(handlemap, reinterpret_cast<VkMemoryAllocateFlagsInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO: {
+            handlemap_VkMemoryAllocateFlagsInfo(
+                handlemap, reinterpret_cast<VkMemoryAllocateFlagsInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO:
-        {
-            handlemap_VkDeviceGroupRenderPassBeginInfo(handlemap, reinterpret_cast<VkDeviceGroupRenderPassBeginInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO: {
+            handlemap_VkDeviceGroupRenderPassBeginInfo(
+                handlemap,
+                reinterpret_cast<VkDeviceGroupRenderPassBeginInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO:
-        {
-            handlemap_VkDeviceGroupCommandBufferBeginInfo(handlemap, reinterpret_cast<VkDeviceGroupCommandBufferBeginInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO: {
+            handlemap_VkDeviceGroupCommandBufferBeginInfo(
+                handlemap,
+                reinterpret_cast<VkDeviceGroupCommandBufferBeginInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO:
-        {
-            handlemap_VkDeviceGroupSubmitInfo(handlemap, reinterpret_cast<VkDeviceGroupSubmitInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO: {
+            handlemap_VkDeviceGroupSubmitInfo(
+                handlemap, reinterpret_cast<VkDeviceGroupSubmitInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO:
-        {
-            handlemap_VkDeviceGroupBindSparseInfo(handlemap, reinterpret_cast<VkDeviceGroupBindSparseInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO: {
+            handlemap_VkDeviceGroupBindSparseInfo(
+                handlemap, reinterpret_cast<VkDeviceGroupBindSparseInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO:
-        {
-            handlemap_VkBindBufferMemoryDeviceGroupInfo(handlemap, reinterpret_cast<VkBindBufferMemoryDeviceGroupInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO: {
+            handlemap_VkBindBufferMemoryDeviceGroupInfo(
+                handlemap,
+                reinterpret_cast<VkBindBufferMemoryDeviceGroupInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO:
-        {
-            handlemap_VkBindImageMemoryDeviceGroupInfo(handlemap, reinterpret_cast<VkBindImageMemoryDeviceGroupInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO: {
+            handlemap_VkBindImageMemoryDeviceGroupInfo(
+                handlemap,
+                reinterpret_cast<VkBindImageMemoryDeviceGroupInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO:
-        {
-            handlemap_VkDeviceGroupDeviceCreateInfo(handlemap, reinterpret_cast<VkDeviceGroupDeviceCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO: {
+            handlemap_VkDeviceGroupDeviceCreateInfo(
+                handlemap, reinterpret_cast<VkDeviceGroupDeviceCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2:
-        {
-            handlemap_VkPhysicalDeviceFeatures2(handlemap, reinterpret_cast<VkPhysicalDeviceFeatures2*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2: {
+            handlemap_VkPhysicalDeviceFeatures2(
+                handlemap, reinterpret_cast<VkPhysicalDeviceFeatures2*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES:
-        {
-            handlemap_VkPhysicalDevicePointClippingProperties(handlemap, reinterpret_cast<VkPhysicalDevicePointClippingProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES: {
+            handlemap_VkPhysicalDevicePointClippingProperties(
+                handlemap,
+                reinterpret_cast<VkPhysicalDevicePointClippingProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO:
-        {
-            handlemap_VkRenderPassInputAttachmentAspectCreateInfo(handlemap, reinterpret_cast<VkRenderPassInputAttachmentAspectCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO: {
+            handlemap_VkRenderPassInputAttachmentAspectCreateInfo(
+                handlemap, reinterpret_cast<VkRenderPassInputAttachmentAspectCreateInfo*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO:
-        {
-            handlemap_VkImageViewUsageCreateInfo(handlemap, reinterpret_cast<VkImageViewUsageCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO: {
+            handlemap_VkImageViewUsageCreateInfo(
+                handlemap, reinterpret_cast<VkImageViewUsageCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO:
-        {
-            handlemap_VkPipelineTessellationDomainOriginStateCreateInfo(handlemap, reinterpret_cast<VkPipelineTessellationDomainOriginStateCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO: {
+            handlemap_VkPipelineTessellationDomainOriginStateCreateInfo(
+                handlemap, reinterpret_cast<VkPipelineTessellationDomainOriginStateCreateInfo*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO:
-        {
-            handlemap_VkRenderPassMultiviewCreateInfo(handlemap, reinterpret_cast<VkRenderPassMultiviewCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO: {
+            handlemap_VkRenderPassMultiviewCreateInfo(
+                handlemap, reinterpret_cast<VkRenderPassMultiviewCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES:
-        {
-            handlemap_VkPhysicalDeviceMultiviewFeatures(handlemap, reinterpret_cast<VkPhysicalDeviceMultiviewFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES: {
+            handlemap_VkPhysicalDeviceMultiviewFeatures(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceMultiviewFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES:
-        {
-            handlemap_VkPhysicalDeviceMultiviewProperties(handlemap, reinterpret_cast<VkPhysicalDeviceMultiviewProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES: {
+            handlemap_VkPhysicalDeviceMultiviewProperties(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceMultiviewProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES:
-        {
-            handlemap_VkPhysicalDeviceVariablePointersFeatures(handlemap, reinterpret_cast<VkPhysicalDeviceVariablePointersFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES: {
+            handlemap_VkPhysicalDeviceVariablePointersFeatures(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceVariablePointersFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES:
-        {
-            handlemap_VkPhysicalDeviceProtectedMemoryFeatures(handlemap, reinterpret_cast<VkPhysicalDeviceProtectedMemoryFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES: {
+            handlemap_VkPhysicalDeviceProtectedMemoryFeatures(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceProtectedMemoryFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES:
-        {
-            handlemap_VkPhysicalDeviceProtectedMemoryProperties(handlemap, reinterpret_cast<VkPhysicalDeviceProtectedMemoryProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES: {
+            handlemap_VkPhysicalDeviceProtectedMemoryProperties(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceProtectedMemoryProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO:
-        {
-            handlemap_VkProtectedSubmitInfo(handlemap, reinterpret_cast<VkProtectedSubmitInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO: {
+            handlemap_VkProtectedSubmitInfo(
+                handlemap, reinterpret_cast<VkProtectedSubmitInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO:
-        {
-            handlemap_VkSamplerYcbcrConversionInfo(handlemap, reinterpret_cast<VkSamplerYcbcrConversionInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO: {
+            handlemap_VkSamplerYcbcrConversionInfo(
+                handlemap, reinterpret_cast<VkSamplerYcbcrConversionInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO:
-        {
-            handlemap_VkBindImagePlaneMemoryInfo(handlemap, reinterpret_cast<VkBindImagePlaneMemoryInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO: {
+            handlemap_VkBindImagePlaneMemoryInfo(
+                handlemap, reinterpret_cast<VkBindImagePlaneMemoryInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO:
-        {
-            handlemap_VkImagePlaneMemoryRequirementsInfo(handlemap, reinterpret_cast<VkImagePlaneMemoryRequirementsInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO: {
+            handlemap_VkImagePlaneMemoryRequirementsInfo(
+                handlemap,
+                reinterpret_cast<VkImagePlaneMemoryRequirementsInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES:
-        {
-            handlemap_VkPhysicalDeviceSamplerYcbcrConversionFeatures(handlemap, reinterpret_cast<VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES: {
+            handlemap_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
+                handlemap, reinterpret_cast<VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES:
-        {
-            handlemap_VkSamplerYcbcrConversionImageFormatProperties(handlemap, reinterpret_cast<VkSamplerYcbcrConversionImageFormatProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES: {
+            handlemap_VkSamplerYcbcrConversionImageFormatProperties(
+                handlemap, reinterpret_cast<VkSamplerYcbcrConversionImageFormatProperties*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO:
-        {
-            handlemap_VkPhysicalDeviceExternalImageFormatInfo(handlemap, reinterpret_cast<VkPhysicalDeviceExternalImageFormatInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO: {
+            handlemap_VkPhysicalDeviceExternalImageFormatInfo(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceExternalImageFormatInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES:
-        {
-            handlemap_VkExternalImageFormatProperties(handlemap, reinterpret_cast<VkExternalImageFormatProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES: {
+            handlemap_VkExternalImageFormatProperties(
+                handlemap, reinterpret_cast<VkExternalImageFormatProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES:
-        {
-            handlemap_VkPhysicalDeviceIDProperties(handlemap, reinterpret_cast<VkPhysicalDeviceIDProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES: {
+            handlemap_VkPhysicalDeviceIDProperties(
+                handlemap, reinterpret_cast<VkPhysicalDeviceIDProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO:
-        {
-            handlemap_VkExternalMemoryImageCreateInfo(handlemap, reinterpret_cast<VkExternalMemoryImageCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO: {
+            handlemap_VkExternalMemoryImageCreateInfo(
+                handlemap, reinterpret_cast<VkExternalMemoryImageCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO:
-        {
-            handlemap_VkExternalMemoryBufferCreateInfo(handlemap, reinterpret_cast<VkExternalMemoryBufferCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO: {
+            handlemap_VkExternalMemoryBufferCreateInfo(
+                handlemap,
+                reinterpret_cast<VkExternalMemoryBufferCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO:
-        {
-            handlemap_VkExportMemoryAllocateInfo(handlemap, reinterpret_cast<VkExportMemoryAllocateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO: {
+            handlemap_VkExportMemoryAllocateInfo(
+                handlemap, reinterpret_cast<VkExportMemoryAllocateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO:
-        {
-            handlemap_VkExportFenceCreateInfo(handlemap, reinterpret_cast<VkExportFenceCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO: {
+            handlemap_VkExportFenceCreateInfo(
+                handlemap, reinterpret_cast<VkExportFenceCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO:
-        {
-            handlemap_VkExportSemaphoreCreateInfo(handlemap, reinterpret_cast<VkExportSemaphoreCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO: {
+            handlemap_VkExportSemaphoreCreateInfo(
+                handlemap, reinterpret_cast<VkExportSemaphoreCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES:
-        {
-            handlemap_VkPhysicalDeviceMaintenance3Properties(handlemap, reinterpret_cast<VkPhysicalDeviceMaintenance3Properties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES: {
+            handlemap_VkPhysicalDeviceMaintenance3Properties(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceMaintenance3Properties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES:
-        {
-            handlemap_VkPhysicalDeviceShaderDrawParametersFeatures(handlemap, reinterpret_cast<VkPhysicalDeviceShaderDrawParametersFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES: {
+            handlemap_VkPhysicalDeviceShaderDrawParametersFeatures(
+                handlemap, reinterpret_cast<VkPhysicalDeviceShaderDrawParametersFeatures*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_VERSION_1_2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES:
-        {
-            handlemap_VkPhysicalDeviceVulkan11Features(handlemap, reinterpret_cast<VkPhysicalDeviceVulkan11Features*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: {
+            handlemap_VkPhysicalDeviceVulkan11Features(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceVulkan11Features*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES:
-        {
-            handlemap_VkPhysicalDeviceVulkan11Properties(handlemap, reinterpret_cast<VkPhysicalDeviceVulkan11Properties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: {
+            handlemap_VkPhysicalDeviceVulkan11Properties(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceVulkan11Properties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES:
-        {
-            handlemap_VkPhysicalDeviceVulkan12Features(handlemap, reinterpret_cast<VkPhysicalDeviceVulkan12Features*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: {
+            handlemap_VkPhysicalDeviceVulkan12Features(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceVulkan12Features*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES:
-        {
-            handlemap_VkPhysicalDeviceVulkan12Properties(handlemap, reinterpret_cast<VkPhysicalDeviceVulkan12Properties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: {
+            handlemap_VkPhysicalDeviceVulkan12Properties(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceVulkan12Properties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO:
-        {
-            handlemap_VkImageFormatListCreateInfo(handlemap, reinterpret_cast<VkImageFormatListCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO: {
+            handlemap_VkImageFormatListCreateInfo(
+                handlemap, reinterpret_cast<VkImageFormatListCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES:
-        {
-            handlemap_VkPhysicalDevice8BitStorageFeatures(handlemap, reinterpret_cast<VkPhysicalDevice8BitStorageFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES: {
+            handlemap_VkPhysicalDevice8BitStorageFeatures(
+                handlemap,
+                reinterpret_cast<VkPhysicalDevice8BitStorageFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES:
-        {
-            handlemap_VkPhysicalDeviceDriverProperties(handlemap, reinterpret_cast<VkPhysicalDeviceDriverProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES: {
+            handlemap_VkPhysicalDeviceDriverProperties(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceDriverProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES:
-        {
-            handlemap_VkPhysicalDeviceShaderAtomicInt64Features(handlemap, reinterpret_cast<VkPhysicalDeviceShaderAtomicInt64Features*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES: {
+            handlemap_VkPhysicalDeviceShaderAtomicInt64Features(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceShaderAtomicInt64Features*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES:
-        {
-            handlemap_VkPhysicalDeviceShaderFloat16Int8Features(handlemap, reinterpret_cast<VkPhysicalDeviceShaderFloat16Int8Features*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES: {
+            handlemap_VkPhysicalDeviceShaderFloat16Int8Features(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceShaderFloat16Int8Features*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES:
-        {
-            handlemap_VkPhysicalDeviceFloatControlsProperties(handlemap, reinterpret_cast<VkPhysicalDeviceFloatControlsProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES: {
+            handlemap_VkPhysicalDeviceFloatControlsProperties(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceFloatControlsProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO:
-        {
-            handlemap_VkDescriptorSetLayoutBindingFlagsCreateInfo(handlemap, reinterpret_cast<VkDescriptorSetLayoutBindingFlagsCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO: {
+            handlemap_VkDescriptorSetLayoutBindingFlagsCreateInfo(
+                handlemap, reinterpret_cast<VkDescriptorSetLayoutBindingFlagsCreateInfo*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES:
-        {
-            handlemap_VkPhysicalDeviceDescriptorIndexingFeatures(handlemap, reinterpret_cast<VkPhysicalDeviceDescriptorIndexingFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES: {
+            handlemap_VkPhysicalDeviceDescriptorIndexingFeatures(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceDescriptorIndexingFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES:
-        {
-            handlemap_VkPhysicalDeviceDescriptorIndexingProperties(handlemap, reinterpret_cast<VkPhysicalDeviceDescriptorIndexingProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES: {
+            handlemap_VkPhysicalDeviceDescriptorIndexingProperties(
+                handlemap, reinterpret_cast<VkPhysicalDeviceDescriptorIndexingProperties*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO:
-        {
-            handlemap_VkDescriptorSetVariableDescriptorCountAllocateInfo(handlemap, reinterpret_cast<VkDescriptorSetVariableDescriptorCountAllocateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO: {
+            handlemap_VkDescriptorSetVariableDescriptorCountAllocateInfo(
+                handlemap, reinterpret_cast<VkDescriptorSetVariableDescriptorCountAllocateInfo*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT:
-        {
-            handlemap_VkDescriptorSetVariableDescriptorCountLayoutSupport(handlemap, reinterpret_cast<VkDescriptorSetVariableDescriptorCountLayoutSupport*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT: {
+            handlemap_VkDescriptorSetVariableDescriptorCountLayoutSupport(
+                handlemap, reinterpret_cast<VkDescriptorSetVariableDescriptorCountLayoutSupport*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE:
-        {
-            handlemap_VkSubpassDescriptionDepthStencilResolve(handlemap, reinterpret_cast<VkSubpassDescriptionDepthStencilResolve*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE: {
+            handlemap_VkSubpassDescriptionDepthStencilResolve(
+                handlemap,
+                reinterpret_cast<VkSubpassDescriptionDepthStencilResolve*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES:
-        {
-            handlemap_VkPhysicalDeviceDepthStencilResolveProperties(handlemap, reinterpret_cast<VkPhysicalDeviceDepthStencilResolveProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES: {
+            handlemap_VkPhysicalDeviceDepthStencilResolveProperties(
+                handlemap, reinterpret_cast<VkPhysicalDeviceDepthStencilResolveProperties*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES:
-        {
-            handlemap_VkPhysicalDeviceScalarBlockLayoutFeatures(handlemap, reinterpret_cast<VkPhysicalDeviceScalarBlockLayoutFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES: {
+            handlemap_VkPhysicalDeviceScalarBlockLayoutFeatures(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceScalarBlockLayoutFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO:
-        {
-            handlemap_VkImageStencilUsageCreateInfo(handlemap, reinterpret_cast<VkImageStencilUsageCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO: {
+            handlemap_VkImageStencilUsageCreateInfo(
+                handlemap, reinterpret_cast<VkImageStencilUsageCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO:
-        {
-            handlemap_VkSamplerReductionModeCreateInfo(handlemap, reinterpret_cast<VkSamplerReductionModeCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO: {
+            handlemap_VkSamplerReductionModeCreateInfo(
+                handlemap,
+                reinterpret_cast<VkSamplerReductionModeCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES:
-        {
-            handlemap_VkPhysicalDeviceSamplerFilterMinmaxProperties(handlemap, reinterpret_cast<VkPhysicalDeviceSamplerFilterMinmaxProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES: {
+            handlemap_VkPhysicalDeviceSamplerFilterMinmaxProperties(
+                handlemap, reinterpret_cast<VkPhysicalDeviceSamplerFilterMinmaxProperties*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES:
-        {
-            handlemap_VkPhysicalDeviceVulkanMemoryModelFeatures(handlemap, reinterpret_cast<VkPhysicalDeviceVulkanMemoryModelFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES: {
+            handlemap_VkPhysicalDeviceVulkanMemoryModelFeatures(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceVulkanMemoryModelFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES:
-        {
-            handlemap_VkPhysicalDeviceImagelessFramebufferFeatures(handlemap, reinterpret_cast<VkPhysicalDeviceImagelessFramebufferFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES: {
+            handlemap_VkPhysicalDeviceImagelessFramebufferFeatures(
+                handlemap, reinterpret_cast<VkPhysicalDeviceImagelessFramebufferFeatures*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO:
-        {
-            handlemap_VkFramebufferAttachmentsCreateInfo(handlemap, reinterpret_cast<VkFramebufferAttachmentsCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO: {
+            handlemap_VkFramebufferAttachmentsCreateInfo(
+                handlemap,
+                reinterpret_cast<VkFramebufferAttachmentsCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO:
-        {
-            handlemap_VkRenderPassAttachmentBeginInfo(handlemap, reinterpret_cast<VkRenderPassAttachmentBeginInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO: {
+            handlemap_VkRenderPassAttachmentBeginInfo(
+                handlemap, reinterpret_cast<VkRenderPassAttachmentBeginInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES:
-        {
-            handlemap_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(handlemap, reinterpret_cast<VkPhysicalDeviceUniformBufferStandardLayoutFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES: {
+            handlemap_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(
+                handlemap, reinterpret_cast<VkPhysicalDeviceUniformBufferStandardLayoutFeatures*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES:
-        {
-            handlemap_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(handlemap, reinterpret_cast<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES: {
+            handlemap_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(
+                handlemap, reinterpret_cast<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES:
-        {
-            handlemap_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(handlemap, reinterpret_cast<VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES: {
+            handlemap_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(
+                handlemap, reinterpret_cast<VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT:
-        {
-            handlemap_VkAttachmentReferenceStencilLayout(handlemap, reinterpret_cast<VkAttachmentReferenceStencilLayout*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT: {
+            handlemap_VkAttachmentReferenceStencilLayout(
+                handlemap,
+                reinterpret_cast<VkAttachmentReferenceStencilLayout*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT:
-        {
-            handlemap_VkAttachmentDescriptionStencilLayout(handlemap, reinterpret_cast<VkAttachmentDescriptionStencilLayout*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT: {
+            handlemap_VkAttachmentDescriptionStencilLayout(
+                handlemap,
+                reinterpret_cast<VkAttachmentDescriptionStencilLayout*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES:
-        {
-            handlemap_VkPhysicalDeviceHostQueryResetFeatures(handlemap, reinterpret_cast<VkPhysicalDeviceHostQueryResetFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES: {
+            handlemap_VkPhysicalDeviceHostQueryResetFeatures(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceHostQueryResetFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES:
-        {
-            handlemap_VkPhysicalDeviceTimelineSemaphoreFeatures(handlemap, reinterpret_cast<VkPhysicalDeviceTimelineSemaphoreFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES: {
+            handlemap_VkPhysicalDeviceTimelineSemaphoreFeatures(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceTimelineSemaphoreFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES:
-        {
-            handlemap_VkPhysicalDeviceTimelineSemaphoreProperties(handlemap, reinterpret_cast<VkPhysicalDeviceTimelineSemaphoreProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES: {
+            handlemap_VkPhysicalDeviceTimelineSemaphoreProperties(
+                handlemap, reinterpret_cast<VkPhysicalDeviceTimelineSemaphoreProperties*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO:
-        {
-            handlemap_VkSemaphoreTypeCreateInfo(handlemap, reinterpret_cast<VkSemaphoreTypeCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO: {
+            handlemap_VkSemaphoreTypeCreateInfo(
+                handlemap, reinterpret_cast<VkSemaphoreTypeCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO:
-        {
-            handlemap_VkTimelineSemaphoreSubmitInfo(handlemap, reinterpret_cast<VkTimelineSemaphoreSubmitInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO: {
+            handlemap_VkTimelineSemaphoreSubmitInfo(
+                handlemap, reinterpret_cast<VkTimelineSemaphoreSubmitInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES:
-        {
-            handlemap_VkPhysicalDeviceBufferDeviceAddressFeatures(handlemap, reinterpret_cast<VkPhysicalDeviceBufferDeviceAddressFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES: {
+            handlemap_VkPhysicalDeviceBufferDeviceAddressFeatures(
+                handlemap, reinterpret_cast<VkPhysicalDeviceBufferDeviceAddressFeatures*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO:
-        {
-            handlemap_VkBufferOpaqueCaptureAddressCreateInfo(handlemap, reinterpret_cast<VkBufferOpaqueCaptureAddressCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO: {
+            handlemap_VkBufferOpaqueCaptureAddressCreateInfo(
+                handlemap,
+                reinterpret_cast<VkBufferOpaqueCaptureAddressCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO:
-        {
-            handlemap_VkMemoryOpaqueCaptureAddressAllocateInfo(handlemap, reinterpret_cast<VkMemoryOpaqueCaptureAddressAllocateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO: {
+            handlemap_VkMemoryOpaqueCaptureAddressAllocateInfo(
+                handlemap,
+                reinterpret_cast<VkMemoryOpaqueCaptureAddressAllocateInfo*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_swapchain
-        case VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR:
-        {
-            handlemap_VkImageSwapchainCreateInfoKHR(handlemap, reinterpret_cast<VkImageSwapchainCreateInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR: {
+            handlemap_VkImageSwapchainCreateInfoKHR(
+                handlemap, reinterpret_cast<VkImageSwapchainCreateInfoKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR:
-        {
-            handlemap_VkBindImageMemorySwapchainInfoKHR(handlemap, reinterpret_cast<VkBindImageMemorySwapchainInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR: {
+            handlemap_VkBindImageMemorySwapchainInfoKHR(
+                handlemap,
+                reinterpret_cast<VkBindImageMemorySwapchainInfoKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR:
-        {
-            handlemap_VkDeviceGroupPresentInfoKHR(handlemap, reinterpret_cast<VkDeviceGroupPresentInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR: {
+            handlemap_VkDeviceGroupPresentInfoKHR(
+                handlemap, reinterpret_cast<VkDeviceGroupPresentInfoKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR:
-        {
-            handlemap_VkDeviceGroupSwapchainCreateInfoKHR(handlemap, reinterpret_cast<VkDeviceGroupSwapchainCreateInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR: {
+            handlemap_VkDeviceGroupSwapchainCreateInfoKHR(
+                handlemap,
+                reinterpret_cast<VkDeviceGroupSwapchainCreateInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_display_swapchain
-        case VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR:
-        {
-            handlemap_VkDisplayPresentInfoKHR(handlemap, reinterpret_cast<VkDisplayPresentInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR: {
+            handlemap_VkDisplayPresentInfoKHR(
+                handlemap, reinterpret_cast<VkDisplayPresentInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_video_queue
-        case VK_STRUCTURE_TYPE_VIDEO_QUEUE_FAMILY_PROPERTIES_2_KHR:
-        {
-            handlemap_VkVideoQueueFamilyProperties2KHR(handlemap, reinterpret_cast<VkVideoQueueFamilyProperties2KHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_QUEUE_FAMILY_PROPERTIES_2_KHR: {
+            handlemap_VkVideoQueueFamilyProperties2KHR(
+                handlemap,
+                reinterpret_cast<VkVideoQueueFamilyProperties2KHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_PROFILE_KHR:
-        {
-            handlemap_VkVideoProfileKHR(handlemap, reinterpret_cast<VkVideoProfileKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_PROFILE_KHR: {
+            handlemap_VkVideoProfileKHR(handlemap,
+                                        reinterpret_cast<VkVideoProfileKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_PROFILES_KHR:
-        {
-            handlemap_VkVideoProfilesKHR(handlemap, reinterpret_cast<VkVideoProfilesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_PROFILES_KHR: {
+            handlemap_VkVideoProfilesKHR(
+                handlemap, reinterpret_cast<VkVideoProfilesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_dynamic_rendering
-        case VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR:
-        {
-            handlemap_VkPipelineRenderingCreateInfoKHR(handlemap, reinterpret_cast<VkPipelineRenderingCreateInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR: {
+            handlemap_VkPipelineRenderingCreateInfoKHR(
+                handlemap,
+                reinterpret_cast<VkPipelineRenderingCreateInfoKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES_KHR:
-        {
-            handlemap_VkPhysicalDeviceDynamicRenderingFeaturesKHR(handlemap, reinterpret_cast<VkPhysicalDeviceDynamicRenderingFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES_KHR: {
+            handlemap_VkPhysicalDeviceDynamicRenderingFeaturesKHR(
+                handlemap, reinterpret_cast<VkPhysicalDeviceDynamicRenderingFeaturesKHR*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR:
-        {
-            handlemap_VkCommandBufferInheritanceRenderingInfoKHR(handlemap, reinterpret_cast<VkCommandBufferInheritanceRenderingInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR: {
+            handlemap_VkCommandBufferInheritanceRenderingInfoKHR(
+                handlemap,
+                reinterpret_cast<VkCommandBufferInheritanceRenderingInfoKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR:
-        {
-            handlemap_VkRenderingFragmentShadingRateAttachmentInfoKHR(handlemap, reinterpret_cast<VkRenderingFragmentShadingRateAttachmentInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR: {
+            handlemap_VkRenderingFragmentShadingRateAttachmentInfoKHR(
+                handlemap, reinterpret_cast<VkRenderingFragmentShadingRateAttachmentInfoKHR*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_INFO_EXT:
-        {
-            handlemap_VkRenderingFragmentDensityMapAttachmentInfoEXT(handlemap, reinterpret_cast<VkRenderingFragmentDensityMapAttachmentInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_INFO_EXT: {
+            handlemap_VkRenderingFragmentDensityMapAttachmentInfoEXT(
+                handlemap, reinterpret_cast<VkRenderingFragmentDensityMapAttachmentInfoEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_ATTACHMENT_SAMPLE_COUNT_INFO_AMD:
-        {
-            handlemap_VkAttachmentSampleCountInfoAMD(handlemap, reinterpret_cast<VkAttachmentSampleCountInfoAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ATTACHMENT_SAMPLE_COUNT_INFO_AMD: {
+            handlemap_VkAttachmentSampleCountInfoAMD(
+                handlemap, reinterpret_cast<VkAttachmentSampleCountInfoAMD*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_MULTIVIEW_PER_VIEW_ATTRIBUTES_INFO_NVX:
-        {
-            handlemap_VkMultiviewPerViewAttributesInfoNVX(handlemap, reinterpret_cast<VkMultiviewPerViewAttributesInfoNVX*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MULTIVIEW_PER_VIEW_ATTRIBUTES_INFO_NVX: {
+            handlemap_VkMultiviewPerViewAttributesInfoNVX(
+                handlemap,
+                reinterpret_cast<VkMultiviewPerViewAttributesInfoNVX*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_external_memory_win32
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
-        {
-            handlemap_VkImportMemoryWin32HandleInfoKHR(handlemap, reinterpret_cast<VkImportMemoryWin32HandleInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR: {
+            handlemap_VkImportMemoryWin32HandleInfoKHR(
+                handlemap,
+                reinterpret_cast<VkImportMemoryWin32HandleInfoKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
-        {
-            handlemap_VkExportMemoryWin32HandleInfoKHR(handlemap, reinterpret_cast<VkExportMemoryWin32HandleInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR: {
+            handlemap_VkExportMemoryWin32HandleInfoKHR(
+                handlemap,
+                reinterpret_cast<VkExportMemoryWin32HandleInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_external_memory_fd
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR:
-        {
-            handlemap_VkImportMemoryFdInfoKHR(handlemap, reinterpret_cast<VkImportMemoryFdInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR: {
+            handlemap_VkImportMemoryFdInfoKHR(
+                handlemap, reinterpret_cast<VkImportMemoryFdInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_win32_keyed_mutex
-        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR:
-        {
-            handlemap_VkWin32KeyedMutexAcquireReleaseInfoKHR(handlemap, reinterpret_cast<VkWin32KeyedMutexAcquireReleaseInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR: {
+            handlemap_VkWin32KeyedMutexAcquireReleaseInfoKHR(
+                handlemap,
+                reinterpret_cast<VkWin32KeyedMutexAcquireReleaseInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_external_semaphore_win32
-        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR:
-        {
-            handlemap_VkExportSemaphoreWin32HandleInfoKHR(handlemap, reinterpret_cast<VkExportSemaphoreWin32HandleInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR: {
+            handlemap_VkExportSemaphoreWin32HandleInfoKHR(
+                handlemap,
+                reinterpret_cast<VkExportSemaphoreWin32HandleInfoKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR:
-        {
-            handlemap_VkD3D12FenceSubmitInfoKHR(handlemap, reinterpret_cast<VkD3D12FenceSubmitInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR: {
+            handlemap_VkD3D12FenceSubmitInfoKHR(
+                handlemap, reinterpret_cast<VkD3D12FenceSubmitInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_push_descriptor
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR:
-        {
-            handlemap_VkPhysicalDevicePushDescriptorPropertiesKHR(handlemap, reinterpret_cast<VkPhysicalDevicePushDescriptorPropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR: {
+            handlemap_VkPhysicalDevicePushDescriptorPropertiesKHR(
+                handlemap, reinterpret_cast<VkPhysicalDevicePushDescriptorPropertiesKHR*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_incremental_present
-        case VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR:
-        {
-            handlemap_VkPresentRegionsKHR(handlemap, reinterpret_cast<VkPresentRegionsKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR: {
+            handlemap_VkPresentRegionsKHR(
+                handlemap, reinterpret_cast<VkPresentRegionsKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_shared_presentable_image
-        case VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR:
-        {
-            handlemap_VkSharedPresentSurfaceCapabilitiesKHR(handlemap, reinterpret_cast<VkSharedPresentSurfaceCapabilitiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR: {
+            handlemap_VkSharedPresentSurfaceCapabilitiesKHR(
+                handlemap,
+                reinterpret_cast<VkSharedPresentSurfaceCapabilitiesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_external_fence_win32
-        case VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR:
-        {
-            handlemap_VkExportFenceWin32HandleInfoKHR(handlemap, reinterpret_cast<VkExportFenceWin32HandleInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR: {
+            handlemap_VkExportFenceWin32HandleInfoKHR(
+                handlemap, reinterpret_cast<VkExportFenceWin32HandleInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_performance_query
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR:
-        {
-            handlemap_VkPhysicalDevicePerformanceQueryFeaturesKHR(handlemap, reinterpret_cast<VkPhysicalDevicePerformanceQueryFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR: {
+            handlemap_VkPhysicalDevicePerformanceQueryFeaturesKHR(
+                handlemap, reinterpret_cast<VkPhysicalDevicePerformanceQueryFeaturesKHR*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR:
-        {
-            handlemap_VkPhysicalDevicePerformanceQueryPropertiesKHR(handlemap, reinterpret_cast<VkPhysicalDevicePerformanceQueryPropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR: {
+            handlemap_VkPhysicalDevicePerformanceQueryPropertiesKHR(
+                handlemap, reinterpret_cast<VkPhysicalDevicePerformanceQueryPropertiesKHR*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR:
-        {
-            handlemap_VkQueryPoolPerformanceCreateInfoKHR(handlemap, reinterpret_cast<VkQueryPoolPerformanceCreateInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR: {
+            handlemap_VkQueryPoolPerformanceCreateInfoKHR(
+                handlemap,
+                reinterpret_cast<VkQueryPoolPerformanceCreateInfoKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR:
-        {
-            handlemap_VkPerformanceQuerySubmitInfoKHR(handlemap, reinterpret_cast<VkPerformanceQuerySubmitInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR: {
+            handlemap_VkPerformanceQuerySubmitInfoKHR(
+                handlemap, reinterpret_cast<VkPerformanceQuerySubmitInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_portability_subset
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR:
-        {
-            handlemap_VkPhysicalDevicePortabilitySubsetFeaturesKHR(handlemap, reinterpret_cast<VkPhysicalDevicePortabilitySubsetFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR: {
+            handlemap_VkPhysicalDevicePortabilitySubsetFeaturesKHR(
+                handlemap, reinterpret_cast<VkPhysicalDevicePortabilitySubsetFeaturesKHR*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR:
-        {
-            handlemap_VkPhysicalDevicePortabilitySubsetPropertiesKHR(handlemap, reinterpret_cast<VkPhysicalDevicePortabilitySubsetPropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR: {
+            handlemap_VkPhysicalDevicePortabilitySubsetPropertiesKHR(
+                handlemap, reinterpret_cast<VkPhysicalDevicePortabilitySubsetPropertiesKHR*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_shader_clock
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR:
-        {
-            handlemap_VkPhysicalDeviceShaderClockFeaturesKHR(handlemap, reinterpret_cast<VkPhysicalDeviceShaderClockFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR: {
+            handlemap_VkPhysicalDeviceShaderClockFeaturesKHR(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceShaderClockFeaturesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_shader_terminate_invocation
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR:
-        {
-            handlemap_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(handlemap, reinterpret_cast<VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR: {
+            handlemap_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(
+                handlemap, reinterpret_cast<VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_fragment_shading_rate
-        case VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR:
-        {
-            handlemap_VkFragmentShadingRateAttachmentInfoKHR(handlemap, reinterpret_cast<VkFragmentShadingRateAttachmentInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR: {
+            handlemap_VkFragmentShadingRateAttachmentInfoKHR(
+                handlemap,
+                reinterpret_cast<VkFragmentShadingRateAttachmentInfoKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR:
-        {
-            handlemap_VkPipelineFragmentShadingRateStateCreateInfoKHR(handlemap, reinterpret_cast<VkPipelineFragmentShadingRateStateCreateInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR: {
+            handlemap_VkPipelineFragmentShadingRateStateCreateInfoKHR(
+                handlemap, reinterpret_cast<VkPipelineFragmentShadingRateStateCreateInfoKHR*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR:
-        {
-            handlemap_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(handlemap, reinterpret_cast<VkPhysicalDeviceFragmentShadingRateFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR: {
+            handlemap_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(
+                handlemap, reinterpret_cast<VkPhysicalDeviceFragmentShadingRateFeaturesKHR*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR:
-        {
-            handlemap_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(handlemap, reinterpret_cast<VkPhysicalDeviceFragmentShadingRatePropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR: {
+            handlemap_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(
+                handlemap, reinterpret_cast<VkPhysicalDeviceFragmentShadingRatePropertiesKHR*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_surface_protected_capabilities
-        case VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR:
-        {
-            handlemap_VkSurfaceProtectedCapabilitiesKHR(handlemap, reinterpret_cast<VkSurfaceProtectedCapabilitiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR: {
+            handlemap_VkSurfaceProtectedCapabilitiesKHR(
+                handlemap,
+                reinterpret_cast<VkSurfaceProtectedCapabilitiesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_present_wait
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR:
-        {
-            handlemap_VkPhysicalDevicePresentWaitFeaturesKHR(handlemap, reinterpret_cast<VkPhysicalDevicePresentWaitFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR: {
+            handlemap_VkPhysicalDevicePresentWaitFeaturesKHR(
+                handlemap,
+                reinterpret_cast<VkPhysicalDevicePresentWaitFeaturesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_pipeline_executable_properties
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR:
-        {
-            handlemap_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(handlemap, reinterpret_cast<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR: {
+            handlemap_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(
+                handlemap,
+                reinterpret_cast<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_shader_integer_dot_product
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR:
-        {
-            handlemap_VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR(handlemap, reinterpret_cast<VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR: {
+            handlemap_VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR(
+                handlemap, reinterpret_cast<VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES_KHR:
-        {
-            handlemap_VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR(handlemap, reinterpret_cast<VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES_KHR: {
+            handlemap_VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR(
+                handlemap, reinterpret_cast<VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_present_id
-        case VK_STRUCTURE_TYPE_PRESENT_ID_KHR:
-        {
-            handlemap_VkPresentIdKHR(handlemap, reinterpret_cast<VkPresentIdKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PRESENT_ID_KHR: {
+            handlemap_VkPresentIdKHR(handlemap,
+                                     reinterpret_cast<VkPresentIdKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR:
-        {
-            handlemap_VkPhysicalDevicePresentIdFeaturesKHR(handlemap, reinterpret_cast<VkPhysicalDevicePresentIdFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR: {
+            handlemap_VkPhysicalDevicePresentIdFeaturesKHR(
+                handlemap,
+                reinterpret_cast<VkPhysicalDevicePresentIdFeaturesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_video_encode_queue
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_INFO_KHR:
-        {
-            handlemap_VkVideoEncodeRateControlInfoKHR(handlemap, reinterpret_cast<VkVideoEncodeRateControlInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_INFO_KHR: {
+            handlemap_VkVideoEncodeRateControlInfoKHR(
+                handlemap, reinterpret_cast<VkVideoEncodeRateControlInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_synchronization2
-        case VK_STRUCTURE_TYPE_MEMORY_BARRIER_2_KHR:
-        {
-            handlemap_VkMemoryBarrier2KHR(handlemap, reinterpret_cast<VkMemoryBarrier2KHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MEMORY_BARRIER_2_KHR: {
+            handlemap_VkMemoryBarrier2KHR(
+                handlemap, reinterpret_cast<VkMemoryBarrier2KHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR:
-        {
-            handlemap_VkPhysicalDeviceSynchronization2FeaturesKHR(handlemap, reinterpret_cast<VkPhysicalDeviceSynchronization2FeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR: {
+            handlemap_VkPhysicalDeviceSynchronization2FeaturesKHR(
+                handlemap, reinterpret_cast<VkPhysicalDeviceSynchronization2FeaturesKHR*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_2_NV:
-        {
-            handlemap_VkQueueFamilyCheckpointProperties2NV(handlemap, reinterpret_cast<VkQueueFamilyCheckpointProperties2NV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_2_NV: {
+            handlemap_VkQueueFamilyCheckpointProperties2NV(
+                handlemap,
+                reinterpret_cast<VkQueueFamilyCheckpointProperties2NV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_shader_subgroup_uniform_control_flow
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR:
-        {
-            handlemap_VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR(handlemap, reinterpret_cast<VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR: {
+            handlemap_VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_zero_initialize_workgroup_memory
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR:
-        {
-            handlemap_VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR(handlemap, reinterpret_cast<VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR: {
+            handlemap_VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_workgroup_memory_explicit_layout
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR:
-        {
-            handlemap_VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR(handlemap, reinterpret_cast<VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR: {
+            handlemap_VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_format_feature_flags2
-        case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR:
-        {
-            handlemap_VkFormatProperties3KHR(handlemap, reinterpret_cast<VkFormatProperties3KHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR: {
+            handlemap_VkFormatProperties3KHR(
+                handlemap, reinterpret_cast<VkFormatProperties3KHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_maintenance4
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES_KHR:
-        {
-            handlemap_VkPhysicalDeviceMaintenance4FeaturesKHR(handlemap, reinterpret_cast<VkPhysicalDeviceMaintenance4FeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES_KHR: {
+            handlemap_VkPhysicalDeviceMaintenance4FeaturesKHR(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceMaintenance4FeaturesKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES_KHR:
-        {
-            handlemap_VkPhysicalDeviceMaintenance4PropertiesKHR(handlemap, reinterpret_cast<VkPhysicalDeviceMaintenance4PropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES_KHR: {
+            handlemap_VkPhysicalDeviceMaintenance4PropertiesKHR(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceMaintenance4PropertiesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_ANDROID_native_buffer
-        case VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID:
-        {
-            handlemap_VkNativeBufferANDROID(handlemap, reinterpret_cast<VkNativeBufferANDROID*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID: {
+            handlemap_VkNativeBufferANDROID(
+                handlemap, reinterpret_cast<VkNativeBufferANDROID*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_debug_report
-        case VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT:
-        {
-            handlemap_VkDebugReportCallbackCreateInfoEXT(handlemap, reinterpret_cast<VkDebugReportCallbackCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT: {
+            handlemap_VkDebugReportCallbackCreateInfoEXT(
+                handlemap,
+                reinterpret_cast<VkDebugReportCallbackCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_rasterization_order
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD:
-        {
-            handlemap_VkPipelineRasterizationStateRasterizationOrderAMD(handlemap, reinterpret_cast<VkPipelineRasterizationStateRasterizationOrderAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD: {
+            handlemap_VkPipelineRasterizationStateRasterizationOrderAMD(
+                handlemap, reinterpret_cast<VkPipelineRasterizationStateRasterizationOrderAMD*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_dedicated_allocation
-        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV:
-        {
-            handlemap_VkDedicatedAllocationImageCreateInfoNV(handlemap, reinterpret_cast<VkDedicatedAllocationImageCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV: {
+            handlemap_VkDedicatedAllocationImageCreateInfoNV(
+                handlemap,
+                reinterpret_cast<VkDedicatedAllocationImageCreateInfoNV*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV:
-        {
-            handlemap_VkDedicatedAllocationBufferCreateInfoNV(handlemap, reinterpret_cast<VkDedicatedAllocationBufferCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV: {
+            handlemap_VkDedicatedAllocationBufferCreateInfoNV(
+                handlemap,
+                reinterpret_cast<VkDedicatedAllocationBufferCreateInfoNV*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV:
-        {
-            handlemap_VkDedicatedAllocationMemoryAllocateInfoNV(handlemap, reinterpret_cast<VkDedicatedAllocationMemoryAllocateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV: {
+            handlemap_VkDedicatedAllocationMemoryAllocateInfoNV(
+                handlemap,
+                reinterpret_cast<VkDedicatedAllocationMemoryAllocateInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_transform_feedback
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDeviceTransformFeedbackFeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceTransformFeedbackFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT: {
+            handlemap_VkPhysicalDeviceTransformFeedbackFeaturesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceTransformFeedbackFeaturesEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT:
-        {
-            handlemap_VkPhysicalDeviceTransformFeedbackPropertiesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceTransformFeedbackPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT: {
+            handlemap_VkPhysicalDeviceTransformFeedbackPropertiesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceTransformFeedbackPropertiesEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT:
-        {
-            handlemap_VkPipelineRasterizationStateStreamCreateInfoEXT(handlemap, reinterpret_cast<VkPipelineRasterizationStateStreamCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT: {
+            handlemap_VkPipelineRasterizationStateStreamCreateInfoEXT(
+                handlemap, reinterpret_cast<VkPipelineRasterizationStateStreamCreateInfoEXT*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_video_encode_h264
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_EXT:
-        {
-            handlemap_VkVideoEncodeH264CapabilitiesEXT(handlemap, reinterpret_cast<VkVideoEncodeH264CapabilitiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_EXT: {
+            handlemap_VkVideoEncodeH264CapabilitiesEXT(
+                handlemap,
+                reinterpret_cast<VkVideoEncodeH264CapabilitiesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_CREATE_INFO_EXT:
-        {
-            handlemap_VkVideoEncodeH264SessionCreateInfoEXT(handlemap, reinterpret_cast<VkVideoEncodeH264SessionCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_CREATE_INFO_EXT: {
+            handlemap_VkVideoEncodeH264SessionCreateInfoEXT(
+                handlemap,
+                reinterpret_cast<VkVideoEncodeH264SessionCreateInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
-            handlemap_VkVideoEncodeH264SessionParametersAddInfoEXT(handlemap, reinterpret_cast<VkVideoEncodeH264SessionParametersAddInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT: {
+            handlemap_VkVideoEncodeH264SessionParametersAddInfoEXT(
+                handlemap, reinterpret_cast<VkVideoEncodeH264SessionParametersAddInfoEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
-            handlemap_VkVideoEncodeH264SessionParametersCreateInfoEXT(handlemap, reinterpret_cast<VkVideoEncodeH264SessionParametersCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT: {
+            handlemap_VkVideoEncodeH264SessionParametersCreateInfoEXT(
+                handlemap, reinterpret_cast<VkVideoEncodeH264SessionParametersCreateInfoEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_VCL_FRAME_INFO_EXT:
-        {
-            handlemap_VkVideoEncodeH264VclFrameInfoEXT(handlemap, reinterpret_cast<VkVideoEncodeH264VclFrameInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_VCL_FRAME_INFO_EXT: {
+            handlemap_VkVideoEncodeH264VclFrameInfoEXT(
+                handlemap,
+                reinterpret_cast<VkVideoEncodeH264VclFrameInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_EMIT_PICTURE_PARAMETERS_EXT:
-        {
-            handlemap_VkVideoEncodeH264EmitPictureParametersEXT(handlemap, reinterpret_cast<VkVideoEncodeH264EmitPictureParametersEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_EMIT_PICTURE_PARAMETERS_EXT: {
+            handlemap_VkVideoEncodeH264EmitPictureParametersEXT(
+                handlemap,
+                reinterpret_cast<VkVideoEncodeH264EmitPictureParametersEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_EXT:
-        {
-            handlemap_VkVideoEncodeH264ProfileEXT(handlemap, reinterpret_cast<VkVideoEncodeH264ProfileEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_EXT: {
+            handlemap_VkVideoEncodeH264ProfileEXT(
+                handlemap, reinterpret_cast<VkVideoEncodeH264ProfileEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_video_encode_h265
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_EXT:
-        {
-            handlemap_VkVideoEncodeH265CapabilitiesEXT(handlemap, reinterpret_cast<VkVideoEncodeH265CapabilitiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_EXT: {
+            handlemap_VkVideoEncodeH265CapabilitiesEXT(
+                handlemap,
+                reinterpret_cast<VkVideoEncodeH265CapabilitiesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_CREATE_INFO_EXT:
-        {
-            handlemap_VkVideoEncodeH265SessionCreateInfoEXT(handlemap, reinterpret_cast<VkVideoEncodeH265SessionCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_CREATE_INFO_EXT: {
+            handlemap_VkVideoEncodeH265SessionCreateInfoEXT(
+                handlemap,
+                reinterpret_cast<VkVideoEncodeH265SessionCreateInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
-            handlemap_VkVideoEncodeH265SessionParametersAddInfoEXT(handlemap, reinterpret_cast<VkVideoEncodeH265SessionParametersAddInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT: {
+            handlemap_VkVideoEncodeH265SessionParametersAddInfoEXT(
+                handlemap, reinterpret_cast<VkVideoEncodeH265SessionParametersAddInfoEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
-            handlemap_VkVideoEncodeH265SessionParametersCreateInfoEXT(handlemap, reinterpret_cast<VkVideoEncodeH265SessionParametersCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT: {
+            handlemap_VkVideoEncodeH265SessionParametersCreateInfoEXT(
+                handlemap, reinterpret_cast<VkVideoEncodeH265SessionParametersCreateInfoEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_VCL_FRAME_INFO_EXT:
-        {
-            handlemap_VkVideoEncodeH265VclFrameInfoEXT(handlemap, reinterpret_cast<VkVideoEncodeH265VclFrameInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_VCL_FRAME_INFO_EXT: {
+            handlemap_VkVideoEncodeH265VclFrameInfoEXT(
+                handlemap,
+                reinterpret_cast<VkVideoEncodeH265VclFrameInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_EMIT_PICTURE_PARAMETERS_EXT:
-        {
-            handlemap_VkVideoEncodeH265EmitPictureParametersEXT(handlemap, reinterpret_cast<VkVideoEncodeH265EmitPictureParametersEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_EMIT_PICTURE_PARAMETERS_EXT: {
+            handlemap_VkVideoEncodeH265EmitPictureParametersEXT(
+                handlemap,
+                reinterpret_cast<VkVideoEncodeH265EmitPictureParametersEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_EXT:
-        {
-            handlemap_VkVideoEncodeH265ProfileEXT(handlemap, reinterpret_cast<VkVideoEncodeH265ProfileEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_EXT: {
+            handlemap_VkVideoEncodeH265ProfileEXT(
+                handlemap, reinterpret_cast<VkVideoEncodeH265ProfileEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_video_decode_h264
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_EXT:
-        {
-            handlemap_VkVideoDecodeH264ProfileEXT(handlemap, reinterpret_cast<VkVideoDecodeH264ProfileEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_EXT: {
+            handlemap_VkVideoDecodeH264ProfileEXT(
+                handlemap, reinterpret_cast<VkVideoDecodeH264ProfileEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT:
-        {
-            handlemap_VkVideoDecodeH264CapabilitiesEXT(handlemap, reinterpret_cast<VkVideoDecodeH264CapabilitiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT: {
+            handlemap_VkVideoDecodeH264CapabilitiesEXT(
+                handlemap,
+                reinterpret_cast<VkVideoDecodeH264CapabilitiesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_CREATE_INFO_EXT:
-        {
-            handlemap_VkVideoDecodeH264SessionCreateInfoEXT(handlemap, reinterpret_cast<VkVideoDecodeH264SessionCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_CREATE_INFO_EXT: {
+            handlemap_VkVideoDecodeH264SessionCreateInfoEXT(
+                handlemap,
+                reinterpret_cast<VkVideoDecodeH264SessionCreateInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
-            handlemap_VkVideoDecodeH264SessionParametersAddInfoEXT(handlemap, reinterpret_cast<VkVideoDecodeH264SessionParametersAddInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT: {
+            handlemap_VkVideoDecodeH264SessionParametersAddInfoEXT(
+                handlemap, reinterpret_cast<VkVideoDecodeH264SessionParametersAddInfoEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
-            handlemap_VkVideoDecodeH264SessionParametersCreateInfoEXT(handlemap, reinterpret_cast<VkVideoDecodeH264SessionParametersCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT: {
+            handlemap_VkVideoDecodeH264SessionParametersCreateInfoEXT(
+                handlemap, reinterpret_cast<VkVideoDecodeH264SessionParametersCreateInfoEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT:
-        {
-            handlemap_VkVideoDecodeH264PictureInfoEXT(handlemap, reinterpret_cast<VkVideoDecodeH264PictureInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT: {
+            handlemap_VkVideoDecodeH264PictureInfoEXT(
+                handlemap, reinterpret_cast<VkVideoDecodeH264PictureInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_MVC_EXT:
-        {
-            handlemap_VkVideoDecodeH264MvcEXT(handlemap, reinterpret_cast<VkVideoDecodeH264MvcEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_MVC_EXT: {
+            handlemap_VkVideoDecodeH264MvcEXT(
+                handlemap, reinterpret_cast<VkVideoDecodeH264MvcEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT:
-        {
-            handlemap_VkVideoDecodeH264DpbSlotInfoEXT(handlemap, reinterpret_cast<VkVideoDecodeH264DpbSlotInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT: {
+            handlemap_VkVideoDecodeH264DpbSlotInfoEXT(
+                handlemap, reinterpret_cast<VkVideoDecodeH264DpbSlotInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_texture_gather_bias_lod
-        case VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD:
-        {
-            handlemap_VkTextureLODGatherFormatPropertiesAMD(handlemap, reinterpret_cast<VkTextureLODGatherFormatPropertiesAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD: {
+            handlemap_VkTextureLODGatherFormatPropertiesAMD(
+                handlemap,
+                reinterpret_cast<VkTextureLODGatherFormatPropertiesAMD*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_corner_sampled_image
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV:
-        {
-            handlemap_VkPhysicalDeviceCornerSampledImageFeaturesNV(handlemap, reinterpret_cast<VkPhysicalDeviceCornerSampledImageFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV: {
+            handlemap_VkPhysicalDeviceCornerSampledImageFeaturesNV(
+                handlemap, reinterpret_cast<VkPhysicalDeviceCornerSampledImageFeaturesNV*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_external_memory
-        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV:
-        {
-            handlemap_VkExternalMemoryImageCreateInfoNV(handlemap, reinterpret_cast<VkExternalMemoryImageCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV: {
+            handlemap_VkExternalMemoryImageCreateInfoNV(
+                handlemap,
+                reinterpret_cast<VkExternalMemoryImageCreateInfoNV*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV:
-        {
-            handlemap_VkExportMemoryAllocateInfoNV(handlemap, reinterpret_cast<VkExportMemoryAllocateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV: {
+            handlemap_VkExportMemoryAllocateInfoNV(
+                handlemap, reinterpret_cast<VkExportMemoryAllocateInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_external_memory_win32
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV:
-        {
-            handlemap_VkImportMemoryWin32HandleInfoNV(handlemap, reinterpret_cast<VkImportMemoryWin32HandleInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV: {
+            handlemap_VkImportMemoryWin32HandleInfoNV(
+                handlemap, reinterpret_cast<VkImportMemoryWin32HandleInfoNV*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV:
-        {
-            handlemap_VkExportMemoryWin32HandleInfoNV(handlemap, reinterpret_cast<VkExportMemoryWin32HandleInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV: {
+            handlemap_VkExportMemoryWin32HandleInfoNV(
+                handlemap, reinterpret_cast<VkExportMemoryWin32HandleInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_win32_keyed_mutex
-        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV:
-        {
-            handlemap_VkWin32KeyedMutexAcquireReleaseInfoNV(handlemap, reinterpret_cast<VkWin32KeyedMutexAcquireReleaseInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV: {
+            handlemap_VkWin32KeyedMutexAcquireReleaseInfoNV(
+                handlemap,
+                reinterpret_cast<VkWin32KeyedMutexAcquireReleaseInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_validation_flags
-        case VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT:
-        {
-            handlemap_VkValidationFlagsEXT(handlemap, reinterpret_cast<VkValidationFlagsEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT: {
+            handlemap_VkValidationFlagsEXT(
+                handlemap, reinterpret_cast<VkValidationFlagsEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_texture_compression_astc_hdr
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT: {
+            handlemap_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_astc_decode_mode
-        case VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT:
-        {
-            handlemap_VkImageViewASTCDecodeModeEXT(handlemap, reinterpret_cast<VkImageViewASTCDecodeModeEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT: {
+            handlemap_VkImageViewASTCDecodeModeEXT(
+                handlemap, reinterpret_cast<VkImageViewASTCDecodeModeEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDeviceASTCDecodeFeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceASTCDecodeFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT: {
+            handlemap_VkPhysicalDeviceASTCDecodeFeaturesEXT(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceASTCDecodeFeaturesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_conditional_rendering
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDeviceConditionalRenderingFeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceConditionalRenderingFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT: {
+            handlemap_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceConditionalRenderingFeaturesEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT:
-        {
-            handlemap_VkCommandBufferInheritanceConditionalRenderingInfoEXT(handlemap, reinterpret_cast<VkCommandBufferInheritanceConditionalRenderingInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT: {
+            handlemap_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
+                handlemap, reinterpret_cast<VkCommandBufferInheritanceConditionalRenderingInfoEXT*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_clip_space_w_scaling
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV:
-        {
-            handlemap_VkPipelineViewportWScalingStateCreateInfoNV(handlemap, reinterpret_cast<VkPipelineViewportWScalingStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV: {
+            handlemap_VkPipelineViewportWScalingStateCreateInfoNV(
+                handlemap, reinterpret_cast<VkPipelineViewportWScalingStateCreateInfoNV*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_display_control
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT:
-        {
-            handlemap_VkSwapchainCounterCreateInfoEXT(handlemap, reinterpret_cast<VkSwapchainCounterCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT: {
+            handlemap_VkSwapchainCounterCreateInfoEXT(
+                handlemap, reinterpret_cast<VkSwapchainCounterCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_GOOGLE_display_timing
-        case VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE:
-        {
-            handlemap_VkPresentTimesInfoGOOGLE(handlemap, reinterpret_cast<VkPresentTimesInfoGOOGLE*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE: {
+            handlemap_VkPresentTimesInfoGOOGLE(
+                handlemap, reinterpret_cast<VkPresentTimesInfoGOOGLE*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NVX_multiview_per_view_attributes
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX:
-        {
-            handlemap_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(handlemap, reinterpret_cast<VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX: {
+            handlemap_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_viewport_swizzle
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV:
-        {
-            handlemap_VkPipelineViewportSwizzleStateCreateInfoNV(handlemap, reinterpret_cast<VkPipelineViewportSwizzleStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV: {
+            handlemap_VkPipelineViewportSwizzleStateCreateInfoNV(
+                handlemap,
+                reinterpret_cast<VkPipelineViewportSwizzleStateCreateInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_discard_rectangles
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT:
-        {
-            handlemap_VkPhysicalDeviceDiscardRectanglePropertiesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceDiscardRectanglePropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT: {
+            handlemap_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceDiscardRectanglePropertiesEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT:
-        {
-            handlemap_VkPipelineDiscardRectangleStateCreateInfoEXT(handlemap, reinterpret_cast<VkPipelineDiscardRectangleStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT: {
+            handlemap_VkPipelineDiscardRectangleStateCreateInfoEXT(
+                handlemap, reinterpret_cast<VkPipelineDiscardRectangleStateCreateInfoEXT*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_conservative_rasterization
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT:
-        {
-            handlemap_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceConservativeRasterizationPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT: {
+            handlemap_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceConservativeRasterizationPropertiesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT:
-        {
-            handlemap_VkPipelineRasterizationConservativeStateCreateInfoEXT(handlemap, reinterpret_cast<VkPipelineRasterizationConservativeStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT: {
+            handlemap_VkPipelineRasterizationConservativeStateCreateInfoEXT(
+                handlemap, reinterpret_cast<VkPipelineRasterizationConservativeStateCreateInfoEXT*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_depth_clip_enable
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDeviceDepthClipEnableFeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceDepthClipEnableFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT: {
+            handlemap_VkPhysicalDeviceDepthClipEnableFeaturesEXT(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceDepthClipEnableFeaturesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT:
-        {
-            handlemap_VkPipelineRasterizationDepthClipStateCreateInfoEXT(handlemap, reinterpret_cast<VkPipelineRasterizationDepthClipStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT: {
+            handlemap_VkPipelineRasterizationDepthClipStateCreateInfoEXT(
+                handlemap, reinterpret_cast<VkPipelineRasterizationDepthClipStateCreateInfoEXT*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_debug_utils
-        case VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT:
-        {
-            handlemap_VkDebugUtilsMessengerCreateInfoEXT(handlemap, reinterpret_cast<VkDebugUtilsMessengerCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT: {
+            handlemap_VkDebugUtilsMessengerCreateInfoEXT(
+                handlemap,
+                reinterpret_cast<VkDebugUtilsMessengerCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
-        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID:
-        {
-            handlemap_VkAndroidHardwareBufferUsageANDROID(handlemap, reinterpret_cast<VkAndroidHardwareBufferUsageANDROID*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID: {
+            handlemap_VkAndroidHardwareBufferUsageANDROID(
+                handlemap,
+                reinterpret_cast<VkAndroidHardwareBufferUsageANDROID*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID:
-        {
-            handlemap_VkAndroidHardwareBufferFormatPropertiesANDROID(handlemap, reinterpret_cast<VkAndroidHardwareBufferFormatPropertiesANDROID*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID: {
+            handlemap_VkAndroidHardwareBufferFormatPropertiesANDROID(
+                handlemap, reinterpret_cast<VkAndroidHardwareBufferFormatPropertiesANDROID*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID:
-        {
-            handlemap_VkImportAndroidHardwareBufferInfoANDROID(handlemap, reinterpret_cast<VkImportAndroidHardwareBufferInfoANDROID*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID: {
+            handlemap_VkImportAndroidHardwareBufferInfoANDROID(
+                handlemap,
+                reinterpret_cast<VkImportAndroidHardwareBufferInfoANDROID*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID:
-        {
-            handlemap_VkExternalFormatANDROID(handlemap, reinterpret_cast<VkExternalFormatANDROID*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID: {
+            handlemap_VkExternalFormatANDROID(
+                handlemap, reinterpret_cast<VkExternalFormatANDROID*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_2_ANDROID:
-        {
-            handlemap_VkAndroidHardwareBufferFormatProperties2ANDROID(handlemap, reinterpret_cast<VkAndroidHardwareBufferFormatProperties2ANDROID*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_2_ANDROID: {
+            handlemap_VkAndroidHardwareBufferFormatProperties2ANDROID(
+                handlemap, reinterpret_cast<VkAndroidHardwareBufferFormatProperties2ANDROID*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_inline_uniform_block
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceInlineUniformBlockFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT: {
+            handlemap_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceInlineUniformBlockFeaturesEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT:
-        {
-            handlemap_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceInlineUniformBlockPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT: {
+            handlemap_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceInlineUniformBlockPropertiesEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT:
-        {
-            handlemap_VkWriteDescriptorSetInlineUniformBlockEXT(handlemap, reinterpret_cast<VkWriteDescriptorSetInlineUniformBlockEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT: {
+            handlemap_VkWriteDescriptorSetInlineUniformBlockEXT(
+                handlemap,
+                reinterpret_cast<VkWriteDescriptorSetInlineUniformBlockEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT:
-        {
-            handlemap_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(handlemap, reinterpret_cast<VkDescriptorPoolInlineUniformBlockCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT: {
+            handlemap_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(
+                handlemap, reinterpret_cast<VkDescriptorPoolInlineUniformBlockCreateInfoEXT*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_sample_locations
-        case VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT:
-        {
-            handlemap_VkSampleLocationsInfoEXT(handlemap, reinterpret_cast<VkSampleLocationsInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT: {
+            handlemap_VkSampleLocationsInfoEXT(
+                handlemap, reinterpret_cast<VkSampleLocationsInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT:
-        {
-            handlemap_VkRenderPassSampleLocationsBeginInfoEXT(handlemap, reinterpret_cast<VkRenderPassSampleLocationsBeginInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT: {
+            handlemap_VkRenderPassSampleLocationsBeginInfoEXT(
+                handlemap,
+                reinterpret_cast<VkRenderPassSampleLocationsBeginInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT:
-        {
-            handlemap_VkPipelineSampleLocationsStateCreateInfoEXT(handlemap, reinterpret_cast<VkPipelineSampleLocationsStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT: {
+            handlemap_VkPipelineSampleLocationsStateCreateInfoEXT(
+                handlemap, reinterpret_cast<VkPipelineSampleLocationsStateCreateInfoEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT:
-        {
-            handlemap_VkPhysicalDeviceSampleLocationsPropertiesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceSampleLocationsPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT: {
+            handlemap_VkPhysicalDeviceSampleLocationsPropertiesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceSampleLocationsPropertiesEXT*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_blend_operation_advanced
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT: {
+            handlemap_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT:
-        {
-            handlemap_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT: {
+            handlemap_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT:
-        {
-            handlemap_VkPipelineColorBlendAdvancedStateCreateInfoEXT(handlemap, reinterpret_cast<VkPipelineColorBlendAdvancedStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT: {
+            handlemap_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
+                handlemap, reinterpret_cast<VkPipelineColorBlendAdvancedStateCreateInfoEXT*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_fragment_coverage_to_color
-        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV:
-        {
-            handlemap_VkPipelineCoverageToColorStateCreateInfoNV(handlemap, reinterpret_cast<VkPipelineCoverageToColorStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV: {
+            handlemap_VkPipelineCoverageToColorStateCreateInfoNV(
+                handlemap,
+                reinterpret_cast<VkPipelineCoverageToColorStateCreateInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_framebuffer_mixed_samples
-        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV:
-        {
-            handlemap_VkPipelineCoverageModulationStateCreateInfoNV(handlemap, reinterpret_cast<VkPipelineCoverageModulationStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV: {
+            handlemap_VkPipelineCoverageModulationStateCreateInfoNV(
+                handlemap, reinterpret_cast<VkPipelineCoverageModulationStateCreateInfoNV*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_shader_sm_builtins
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV:
-        {
-            handlemap_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(handlemap, reinterpret_cast<VkPhysicalDeviceShaderSMBuiltinsPropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV: {
+            handlemap_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(
+                handlemap, reinterpret_cast<VkPhysicalDeviceShaderSMBuiltinsPropertiesNV*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV:
-        {
-            handlemap_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(handlemap, reinterpret_cast<VkPhysicalDeviceShaderSMBuiltinsFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV: {
+            handlemap_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceShaderSMBuiltinsFeaturesNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_image_drm_format_modifier
-        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT:
-        {
-            handlemap_VkDrmFormatModifierPropertiesListEXT(handlemap, reinterpret_cast<VkDrmFormatModifierPropertiesListEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT: {
+            handlemap_VkDrmFormatModifierPropertiesListEXT(
+                handlemap,
+                reinterpret_cast<VkDrmFormatModifierPropertiesListEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT:
-        {
-            handlemap_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(handlemap, reinterpret_cast<VkPhysicalDeviceImageDrmFormatModifierInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT: {
+            handlemap_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceImageDrmFormatModifierInfoEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT:
-        {
-            handlemap_VkImageDrmFormatModifierListCreateInfoEXT(handlemap, reinterpret_cast<VkImageDrmFormatModifierListCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT: {
+            handlemap_VkImageDrmFormatModifierListCreateInfoEXT(
+                handlemap,
+                reinterpret_cast<VkImageDrmFormatModifierListCreateInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT:
-        {
-            handlemap_VkImageDrmFormatModifierExplicitCreateInfoEXT(handlemap, reinterpret_cast<VkImageDrmFormatModifierExplicitCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT: {
+            handlemap_VkImageDrmFormatModifierExplicitCreateInfoEXT(
+                handlemap, reinterpret_cast<VkImageDrmFormatModifierExplicitCreateInfoEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_2_EXT:
-        {
-            handlemap_VkDrmFormatModifierPropertiesList2EXT(handlemap, reinterpret_cast<VkDrmFormatModifierPropertiesList2EXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_2_EXT: {
+            handlemap_VkDrmFormatModifierPropertiesList2EXT(
+                handlemap,
+                reinterpret_cast<VkDrmFormatModifierPropertiesList2EXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_validation_cache
-        case VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT:
-        {
-            handlemap_VkShaderModuleValidationCacheCreateInfoEXT(handlemap, reinterpret_cast<VkShaderModuleValidationCacheCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT: {
+            handlemap_VkShaderModuleValidationCacheCreateInfoEXT(
+                handlemap,
+                reinterpret_cast<VkShaderModuleValidationCacheCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_shading_rate_image
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV:
-        {
-            handlemap_VkPipelineViewportShadingRateImageStateCreateInfoNV(handlemap, reinterpret_cast<VkPipelineViewportShadingRateImageStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV: {
+            handlemap_VkPipelineViewportShadingRateImageStateCreateInfoNV(
+                handlemap, reinterpret_cast<VkPipelineViewportShadingRateImageStateCreateInfoNV*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV:
-        {
-            handlemap_VkPhysicalDeviceShadingRateImageFeaturesNV(handlemap, reinterpret_cast<VkPhysicalDeviceShadingRateImageFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV: {
+            handlemap_VkPhysicalDeviceShadingRateImageFeaturesNV(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceShadingRateImageFeaturesNV*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV:
-        {
-            handlemap_VkPhysicalDeviceShadingRateImagePropertiesNV(handlemap, reinterpret_cast<VkPhysicalDeviceShadingRateImagePropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV: {
+            handlemap_VkPhysicalDeviceShadingRateImagePropertiesNV(
+                handlemap, reinterpret_cast<VkPhysicalDeviceShadingRateImagePropertiesNV*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV:
-        {
-            handlemap_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(handlemap, reinterpret_cast<VkPipelineViewportCoarseSampleOrderStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV: {
+            handlemap_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(
+                handlemap, reinterpret_cast<VkPipelineViewportCoarseSampleOrderStateCreateInfoNV*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_ray_tracing
-        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV:
-        {
-            handlemap_VkWriteDescriptorSetAccelerationStructureNV(handlemap, reinterpret_cast<VkWriteDescriptorSetAccelerationStructureNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV: {
+            handlemap_VkWriteDescriptorSetAccelerationStructureNV(
+                handlemap, reinterpret_cast<VkWriteDescriptorSetAccelerationStructureNV*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV:
-        {
-            handlemap_VkPhysicalDeviceRayTracingPropertiesNV(handlemap, reinterpret_cast<VkPhysicalDeviceRayTracingPropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV: {
+            handlemap_VkPhysicalDeviceRayTracingPropertiesNV(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceRayTracingPropertiesNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_representative_fragment_test
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV:
-        {
-            handlemap_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(handlemap, reinterpret_cast<VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV: {
+            handlemap_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(
+                handlemap, reinterpret_cast<VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV:
-        {
-            handlemap_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(handlemap, reinterpret_cast<VkPipelineRepresentativeFragmentTestStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV: {
+            handlemap_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(
+                handlemap, reinterpret_cast<VkPipelineRepresentativeFragmentTestStateCreateInfoNV*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_filter_cubic
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT:
-        {
-            handlemap_VkPhysicalDeviceImageViewImageFormatInfoEXT(handlemap, reinterpret_cast<VkPhysicalDeviceImageViewImageFormatInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT: {
+            handlemap_VkPhysicalDeviceImageViewImageFormatInfoEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceImageViewImageFormatInfoEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT:
-        {
-            handlemap_VkFilterCubicImageViewImageFormatPropertiesEXT(handlemap, reinterpret_cast<VkFilterCubicImageViewImageFormatPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT: {
+            handlemap_VkFilterCubicImageViewImageFormatPropertiesEXT(
+                handlemap, reinterpret_cast<VkFilterCubicImageViewImageFormatPropertiesEXT*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_global_priority
-        case VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT:
-        {
-            handlemap_VkDeviceQueueGlobalPriorityCreateInfoEXT(handlemap, reinterpret_cast<VkDeviceQueueGlobalPriorityCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT: {
+            handlemap_VkDeviceQueueGlobalPriorityCreateInfoEXT(
+                handlemap,
+                reinterpret_cast<VkDeviceQueueGlobalPriorityCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_external_memory_host
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT:
-        {
-            handlemap_VkImportMemoryHostPointerInfoEXT(handlemap, reinterpret_cast<VkImportMemoryHostPointerInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT: {
+            handlemap_VkImportMemoryHostPointerInfoEXT(
+                handlemap,
+                reinterpret_cast<VkImportMemoryHostPointerInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT:
-        {
-            handlemap_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceExternalMemoryHostPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT: {
+            handlemap_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceExternalMemoryHostPropertiesEXT*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_pipeline_compiler_control
-        case VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD:
-        {
-            handlemap_VkPipelineCompilerControlCreateInfoAMD(handlemap, reinterpret_cast<VkPipelineCompilerControlCreateInfoAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD: {
+            handlemap_VkPipelineCompilerControlCreateInfoAMD(
+                handlemap,
+                reinterpret_cast<VkPipelineCompilerControlCreateInfoAMD*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_shader_core_properties
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD:
-        {
-            handlemap_VkPhysicalDeviceShaderCorePropertiesAMD(handlemap, reinterpret_cast<VkPhysicalDeviceShaderCorePropertiesAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD: {
+            handlemap_VkPhysicalDeviceShaderCorePropertiesAMD(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceShaderCorePropertiesAMD*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_video_decode_h265
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_EXT:
-        {
-            handlemap_VkVideoDecodeH265ProfileEXT(handlemap, reinterpret_cast<VkVideoDecodeH265ProfileEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_EXT: {
+            handlemap_VkVideoDecodeH265ProfileEXT(
+                handlemap, reinterpret_cast<VkVideoDecodeH265ProfileEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT:
-        {
-            handlemap_VkVideoDecodeH265CapabilitiesEXT(handlemap, reinterpret_cast<VkVideoDecodeH265CapabilitiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT: {
+            handlemap_VkVideoDecodeH265CapabilitiesEXT(
+                handlemap,
+                reinterpret_cast<VkVideoDecodeH265CapabilitiesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_CREATE_INFO_EXT:
-        {
-            handlemap_VkVideoDecodeH265SessionCreateInfoEXT(handlemap, reinterpret_cast<VkVideoDecodeH265SessionCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_CREATE_INFO_EXT: {
+            handlemap_VkVideoDecodeH265SessionCreateInfoEXT(
+                handlemap,
+                reinterpret_cast<VkVideoDecodeH265SessionCreateInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
-            handlemap_VkVideoDecodeH265SessionParametersAddInfoEXT(handlemap, reinterpret_cast<VkVideoDecodeH265SessionParametersAddInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT: {
+            handlemap_VkVideoDecodeH265SessionParametersAddInfoEXT(
+                handlemap, reinterpret_cast<VkVideoDecodeH265SessionParametersAddInfoEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
-            handlemap_VkVideoDecodeH265SessionParametersCreateInfoEXT(handlemap, reinterpret_cast<VkVideoDecodeH265SessionParametersCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT: {
+            handlemap_VkVideoDecodeH265SessionParametersCreateInfoEXT(
+                handlemap, reinterpret_cast<VkVideoDecodeH265SessionParametersCreateInfoEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT:
-        {
-            handlemap_VkVideoDecodeH265PictureInfoEXT(handlemap, reinterpret_cast<VkVideoDecodeH265PictureInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT: {
+            handlemap_VkVideoDecodeH265PictureInfoEXT(
+                handlemap, reinterpret_cast<VkVideoDecodeH265PictureInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT:
-        {
-            handlemap_VkVideoDecodeH265DpbSlotInfoEXT(handlemap, reinterpret_cast<VkVideoDecodeH265DpbSlotInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT: {
+            handlemap_VkVideoDecodeH265DpbSlotInfoEXT(
+                handlemap, reinterpret_cast<VkVideoDecodeH265DpbSlotInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_memory_overallocation_behavior
-        case VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD:
-        {
-            handlemap_VkDeviceMemoryOverallocationCreateInfoAMD(handlemap, reinterpret_cast<VkDeviceMemoryOverallocationCreateInfoAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD: {
+            handlemap_VkDeviceMemoryOverallocationCreateInfoAMD(
+                handlemap,
+                reinterpret_cast<VkDeviceMemoryOverallocationCreateInfoAMD*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_vertex_attribute_divisor
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT:
-        {
-            handlemap_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT: {
+            handlemap_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT:
-        {
-            handlemap_VkPipelineVertexInputDivisorStateCreateInfoEXT(handlemap, reinterpret_cast<VkPipelineVertexInputDivisorStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT: {
+            handlemap_VkPipelineVertexInputDivisorStateCreateInfoEXT(
+                handlemap, reinterpret_cast<VkPipelineVertexInputDivisorStateCreateInfoEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: {
+            handlemap_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_GGP_frame_token
-        case VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP:
-        {
-            handlemap_VkPresentFrameTokenGGP(handlemap, reinterpret_cast<VkPresentFrameTokenGGP*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP: {
+            handlemap_VkPresentFrameTokenGGP(
+                handlemap, reinterpret_cast<VkPresentFrameTokenGGP*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_pipeline_creation_feedback
-        case VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT:
-        {
-            handlemap_VkPipelineCreationFeedbackCreateInfoEXT(handlemap, reinterpret_cast<VkPipelineCreationFeedbackCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT: {
+            handlemap_VkPipelineCreationFeedbackCreateInfoEXT(
+                handlemap,
+                reinterpret_cast<VkPipelineCreationFeedbackCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_compute_shader_derivatives
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV:
-        {
-            handlemap_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(handlemap, reinterpret_cast<VkPhysicalDeviceComputeShaderDerivativesFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV: {
+            handlemap_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(
+                handlemap, reinterpret_cast<VkPhysicalDeviceComputeShaderDerivativesFeaturesNV*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_mesh_shader
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV:
-        {
-            handlemap_VkPhysicalDeviceMeshShaderFeaturesNV(handlemap, reinterpret_cast<VkPhysicalDeviceMeshShaderFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV: {
+            handlemap_VkPhysicalDeviceMeshShaderFeaturesNV(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceMeshShaderFeaturesNV*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV:
-        {
-            handlemap_VkPhysicalDeviceMeshShaderPropertiesNV(handlemap, reinterpret_cast<VkPhysicalDeviceMeshShaderPropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV: {
+            handlemap_VkPhysicalDeviceMeshShaderPropertiesNV(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceMeshShaderPropertiesNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_fragment_shader_barycentric
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV:
-        {
-            handlemap_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(handlemap, reinterpret_cast<VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV: {
+            handlemap_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(
+                handlemap, reinterpret_cast<VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_shader_image_footprint
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV:
-        {
-            handlemap_VkPhysicalDeviceShaderImageFootprintFeaturesNV(handlemap, reinterpret_cast<VkPhysicalDeviceShaderImageFootprintFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV: {
+            handlemap_VkPhysicalDeviceShaderImageFootprintFeaturesNV(
+                handlemap, reinterpret_cast<VkPhysicalDeviceShaderImageFootprintFeaturesNV*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_scissor_exclusive
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV:
-        {
-            handlemap_VkPipelineViewportExclusiveScissorStateCreateInfoNV(handlemap, reinterpret_cast<VkPipelineViewportExclusiveScissorStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV: {
+            handlemap_VkPipelineViewportExclusiveScissorStateCreateInfoNV(
+                handlemap, reinterpret_cast<VkPipelineViewportExclusiveScissorStateCreateInfoNV*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV:
-        {
-            handlemap_VkPhysicalDeviceExclusiveScissorFeaturesNV(handlemap, reinterpret_cast<VkPhysicalDeviceExclusiveScissorFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV: {
+            handlemap_VkPhysicalDeviceExclusiveScissorFeaturesNV(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceExclusiveScissorFeaturesNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
-        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV:
-        {
-            handlemap_VkQueueFamilyCheckpointPropertiesNV(handlemap, reinterpret_cast<VkQueueFamilyCheckpointPropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV: {
+            handlemap_VkQueueFamilyCheckpointPropertiesNV(
+                handlemap,
+                reinterpret_cast<VkQueueFamilyCheckpointPropertiesNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_INTEL_shader_integer_functions2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL:
-        {
-            handlemap_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(handlemap, reinterpret_cast<VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL: {
+            handlemap_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(
+                handlemap, reinterpret_cast<VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_INTEL_performance_query
-        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL:
-        {
-            handlemap_VkQueryPoolPerformanceQueryCreateInfoINTEL(handlemap, reinterpret_cast<VkQueryPoolPerformanceQueryCreateInfoINTEL*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL: {
+            handlemap_VkQueryPoolPerformanceQueryCreateInfoINTEL(
+                handlemap,
+                reinterpret_cast<VkQueryPoolPerformanceQueryCreateInfoINTEL*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_pci_bus_info
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT:
-        {
-            handlemap_VkPhysicalDevicePCIBusInfoPropertiesEXT(handlemap, reinterpret_cast<VkPhysicalDevicePCIBusInfoPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT: {
+            handlemap_VkPhysicalDevicePCIBusInfoPropertiesEXT(
+                handlemap,
+                reinterpret_cast<VkPhysicalDevicePCIBusInfoPropertiesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_display_native_hdr
-        case VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD:
-        {
-            handlemap_VkDisplayNativeHdrSurfaceCapabilitiesAMD(handlemap, reinterpret_cast<VkDisplayNativeHdrSurfaceCapabilitiesAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD: {
+            handlemap_VkDisplayNativeHdrSurfaceCapabilitiesAMD(
+                handlemap,
+                reinterpret_cast<VkDisplayNativeHdrSurfaceCapabilitiesAMD*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD:
-        {
-            handlemap_VkSwapchainDisplayNativeHdrCreateInfoAMD(handlemap, reinterpret_cast<VkSwapchainDisplayNativeHdrCreateInfoAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD: {
+            handlemap_VkSwapchainDisplayNativeHdrCreateInfoAMD(
+                handlemap,
+                reinterpret_cast<VkSwapchainDisplayNativeHdrCreateInfoAMD*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_fragment_density_map
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT: {
+            handlemap_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT:
-        {
-            handlemap_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT: {
+            handlemap_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT:
-        {
-            handlemap_VkRenderPassFragmentDensityMapCreateInfoEXT(handlemap, reinterpret_cast<VkRenderPassFragmentDensityMapCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT: {
+            handlemap_VkRenderPassFragmentDensityMapCreateInfoEXT(
+                handlemap, reinterpret_cast<VkRenderPassFragmentDensityMapCreateInfoEXT*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_subgroup_size_control
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceSubgroupSizeControlFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT: {
+            handlemap_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceSubgroupSizeControlFeaturesEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT:
-        {
-            handlemap_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceSubgroupSizeControlPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT: {
+            handlemap_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceSubgroupSizeControlPropertiesEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT:
-        {
-            handlemap_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(handlemap, reinterpret_cast<VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT: {
+            handlemap_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(
+                handlemap,
+                reinterpret_cast<VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_shader_core_properties2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD:
-        {
-            handlemap_VkPhysicalDeviceShaderCoreProperties2AMD(handlemap, reinterpret_cast<VkPhysicalDeviceShaderCoreProperties2AMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD: {
+            handlemap_VkPhysicalDeviceShaderCoreProperties2AMD(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceShaderCoreProperties2AMD*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_device_coherent_memory
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD:
-        {
-            handlemap_VkPhysicalDeviceCoherentMemoryFeaturesAMD(handlemap, reinterpret_cast<VkPhysicalDeviceCoherentMemoryFeaturesAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD: {
+            handlemap_VkPhysicalDeviceCoherentMemoryFeaturesAMD(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceCoherentMemoryFeaturesAMD*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_shader_image_atomic_int64
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT: {
+            handlemap_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_memory_budget
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT:
-        {
-            handlemap_VkPhysicalDeviceMemoryBudgetPropertiesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceMemoryBudgetPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT: {
+            handlemap_VkPhysicalDeviceMemoryBudgetPropertiesEXT(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceMemoryBudgetPropertiesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_memory_priority
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDeviceMemoryPriorityFeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceMemoryPriorityFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT: {
+            handlemap_VkPhysicalDeviceMemoryPriorityFeaturesEXT(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceMemoryPriorityFeaturesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT:
-        {
-            handlemap_VkMemoryPriorityAllocateInfoEXT(handlemap, reinterpret_cast<VkMemoryPriorityAllocateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT: {
+            handlemap_VkMemoryPriorityAllocateInfoEXT(
+                handlemap, reinterpret_cast<VkMemoryPriorityAllocateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_dedicated_allocation_image_aliasing
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV:
-        {
-            handlemap_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(handlemap, reinterpret_cast<VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV: {
+            handlemap_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_buffer_device_address
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceBufferDeviceAddressFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT: {
+            handlemap_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceBufferDeviceAddressFeaturesEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT:
-        {
-            handlemap_VkBufferDeviceAddressCreateInfoEXT(handlemap, reinterpret_cast<VkBufferDeviceAddressCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT: {
+            handlemap_VkBufferDeviceAddressCreateInfoEXT(
+                handlemap,
+                reinterpret_cast<VkBufferDeviceAddressCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_validation_features
-        case VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT:
-        {
-            handlemap_VkValidationFeaturesEXT(handlemap, reinterpret_cast<VkValidationFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT: {
+            handlemap_VkValidationFeaturesEXT(
+                handlemap, reinterpret_cast<VkValidationFeaturesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_cooperative_matrix
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV:
-        {
-            handlemap_VkPhysicalDeviceCooperativeMatrixFeaturesNV(handlemap, reinterpret_cast<VkPhysicalDeviceCooperativeMatrixFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV: {
+            handlemap_VkPhysicalDeviceCooperativeMatrixFeaturesNV(
+                handlemap, reinterpret_cast<VkPhysicalDeviceCooperativeMatrixFeaturesNV*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV:
-        {
-            handlemap_VkPhysicalDeviceCooperativeMatrixPropertiesNV(handlemap, reinterpret_cast<VkPhysicalDeviceCooperativeMatrixPropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV: {
+            handlemap_VkPhysicalDeviceCooperativeMatrixPropertiesNV(
+                handlemap, reinterpret_cast<VkPhysicalDeviceCooperativeMatrixPropertiesNV*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_coverage_reduction_mode
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV:
-        {
-            handlemap_VkPhysicalDeviceCoverageReductionModeFeaturesNV(handlemap, reinterpret_cast<VkPhysicalDeviceCoverageReductionModeFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV: {
+            handlemap_VkPhysicalDeviceCoverageReductionModeFeaturesNV(
+                handlemap, reinterpret_cast<VkPhysicalDeviceCoverageReductionModeFeaturesNV*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV:
-        {
-            handlemap_VkPipelineCoverageReductionStateCreateInfoNV(handlemap, reinterpret_cast<VkPipelineCoverageReductionStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV: {
+            handlemap_VkPipelineCoverageReductionStateCreateInfoNV(
+                handlemap, reinterpret_cast<VkPipelineCoverageReductionStateCreateInfoNV*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_fragment_shader_interlock
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT: {
+            handlemap_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_ycbcr_image_arrays
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT: {
+            handlemap_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_provoking_vertex
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDeviceProvokingVertexFeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceProvokingVertexFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT: {
+            handlemap_VkPhysicalDeviceProvokingVertexFeaturesEXT(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceProvokingVertexFeaturesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_PROPERTIES_EXT:
-        {
-            handlemap_VkPhysicalDeviceProvokingVertexPropertiesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceProvokingVertexPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_PROPERTIES_EXT: {
+            handlemap_VkPhysicalDeviceProvokingVertexPropertiesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceProvokingVertexPropertiesEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT:
-        {
-            handlemap_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT(handlemap, reinterpret_cast<VkPipelineRasterizationProvokingVertexStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT: {
+            handlemap_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT(
+                handlemap,
+                reinterpret_cast<VkPipelineRasterizationProvokingVertexStateCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_full_screen_exclusive
-        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT:
-        {
-            handlemap_VkSurfaceFullScreenExclusiveInfoEXT(handlemap, reinterpret_cast<VkSurfaceFullScreenExclusiveInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT: {
+            handlemap_VkSurfaceFullScreenExclusiveInfoEXT(
+                handlemap,
+                reinterpret_cast<VkSurfaceFullScreenExclusiveInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT:
-        {
-            handlemap_VkSurfaceCapabilitiesFullScreenExclusiveEXT(handlemap, reinterpret_cast<VkSurfaceCapabilitiesFullScreenExclusiveEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT: {
+            handlemap_VkSurfaceCapabilitiesFullScreenExclusiveEXT(
+                handlemap, reinterpret_cast<VkSurfaceCapabilitiesFullScreenExclusiveEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT:
-        {
-            handlemap_VkSurfaceFullScreenExclusiveWin32InfoEXT(handlemap, reinterpret_cast<VkSurfaceFullScreenExclusiveWin32InfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT: {
+            handlemap_VkSurfaceFullScreenExclusiveWin32InfoEXT(
+                handlemap,
+                reinterpret_cast<VkSurfaceFullScreenExclusiveWin32InfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_line_rasterization
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDeviceLineRasterizationFeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceLineRasterizationFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT: {
+            handlemap_VkPhysicalDeviceLineRasterizationFeaturesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceLineRasterizationFeaturesEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT:
-        {
-            handlemap_VkPhysicalDeviceLineRasterizationPropertiesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceLineRasterizationPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT: {
+            handlemap_VkPhysicalDeviceLineRasterizationPropertiesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceLineRasterizationPropertiesEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT:
-        {
-            handlemap_VkPipelineRasterizationLineStateCreateInfoEXT(handlemap, reinterpret_cast<VkPipelineRasterizationLineStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT: {
+            handlemap_VkPipelineRasterizationLineStateCreateInfoEXT(
+                handlemap, reinterpret_cast<VkPipelineRasterizationLineStateCreateInfoEXT*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_shader_atomic_float
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT: {
+            handlemap_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_index_type_uint8
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceIndexTypeUint8FeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT: {
+            handlemap_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceIndexTypeUint8FeaturesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT: {
+            handlemap_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_shader_atomic_float2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT: {
+            handlemap_VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT: {
+            handlemap_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_device_generated_commands
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV:
-        {
-            handlemap_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(handlemap, reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV: {
+            handlemap_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(
+                handlemap, reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV:
-        {
-            handlemap_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(handlemap, reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV: {
+            handlemap_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(
+                handlemap, reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV:
-        {
-            handlemap_VkGraphicsPipelineShaderGroupsCreateInfoNV(handlemap, reinterpret_cast<VkGraphicsPipelineShaderGroupsCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV: {
+            handlemap_VkGraphicsPipelineShaderGroupsCreateInfoNV(
+                handlemap,
+                reinterpret_cast<VkGraphicsPipelineShaderGroupsCreateInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_inherited_viewport_scissor
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV:
-        {
-            handlemap_VkPhysicalDeviceInheritedViewportScissorFeaturesNV(handlemap, reinterpret_cast<VkPhysicalDeviceInheritedViewportScissorFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV: {
+            handlemap_VkPhysicalDeviceInheritedViewportScissorFeaturesNV(
+                handlemap, reinterpret_cast<VkPhysicalDeviceInheritedViewportScissorFeaturesNV*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_VIEWPORT_SCISSOR_INFO_NV:
-        {
-            handlemap_VkCommandBufferInheritanceViewportScissorInfoNV(handlemap, reinterpret_cast<VkCommandBufferInheritanceViewportScissorInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_VIEWPORT_SCISSOR_INFO_NV: {
+            handlemap_VkCommandBufferInheritanceViewportScissorInfoNV(
+                handlemap, reinterpret_cast<VkCommandBufferInheritanceViewportScissorInfoNV*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_texel_buffer_alignment
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: {
+            handlemap_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT:
-        {
-            handlemap_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT: {
+            handlemap_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_QCOM_render_pass_transform
-        case VK_STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM:
-        {
-            handlemap_VkRenderPassTransformBeginInfoQCOM(handlemap, reinterpret_cast<VkRenderPassTransformBeginInfoQCOM*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM: {
+            handlemap_VkRenderPassTransformBeginInfoQCOM(
+                handlemap,
+                reinterpret_cast<VkRenderPassTransformBeginInfoQCOM*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM:
-        {
-            handlemap_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(handlemap, reinterpret_cast<VkCommandBufferInheritanceRenderPassTransformInfoQCOM*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM: {
+            handlemap_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(
+                handlemap, reinterpret_cast<VkCommandBufferInheritanceRenderPassTransformInfoQCOM*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_device_memory_report
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceDeviceMemoryReportFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT: {
+            handlemap_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceDeviceMemoryReportFeaturesEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT:
-        {
-            handlemap_VkDeviceDeviceMemoryReportCreateInfoEXT(handlemap, reinterpret_cast<VkDeviceDeviceMemoryReportCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT: {
+            handlemap_VkDeviceDeviceMemoryReportCreateInfoEXT(
+                handlemap,
+                reinterpret_cast<VkDeviceDeviceMemoryReportCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_robustness2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDeviceRobustness2FeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceRobustness2FeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT: {
+            handlemap_VkPhysicalDeviceRobustness2FeaturesEXT(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceRobustness2FeaturesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT:
-        {
-            handlemap_VkPhysicalDeviceRobustness2PropertiesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceRobustness2PropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT: {
+            handlemap_VkPhysicalDeviceRobustness2PropertiesEXT(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceRobustness2PropertiesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_custom_border_color
-        case VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT:
-        {
-            handlemap_VkSamplerCustomBorderColorCreateInfoEXT(handlemap, reinterpret_cast<VkSamplerCustomBorderColorCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT: {
+            handlemap_VkSamplerCustomBorderColorCreateInfoEXT(
+                handlemap,
+                reinterpret_cast<VkSamplerCustomBorderColorCreateInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT:
-        {
-            handlemap_VkPhysicalDeviceCustomBorderColorPropertiesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceCustomBorderColorPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT: {
+            handlemap_VkPhysicalDeviceCustomBorderColorPropertiesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceCustomBorderColorPropertiesEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDeviceCustomBorderColorFeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceCustomBorderColorFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT: {
+            handlemap_VkPhysicalDeviceCustomBorderColorFeaturesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceCustomBorderColorFeaturesEXT*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_private_data
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDevicePrivateDataFeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDevicePrivateDataFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT: {
+            handlemap_VkPhysicalDevicePrivateDataFeaturesEXT(
+                handlemap,
+                reinterpret_cast<VkPhysicalDevicePrivateDataFeaturesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT:
-        {
-            handlemap_VkDevicePrivateDataCreateInfoEXT(handlemap, reinterpret_cast<VkDevicePrivateDataCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT: {
+            handlemap_VkDevicePrivateDataCreateInfoEXT(
+                handlemap,
+                reinterpret_cast<VkDevicePrivateDataCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_pipeline_creation_cache_control
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT: {
+            handlemap_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(
+                handlemap,
+                reinterpret_cast<VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_device_diagnostics_config
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV:
-        {
-            handlemap_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(handlemap, reinterpret_cast<VkPhysicalDeviceDiagnosticsConfigFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV: {
+            handlemap_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(
+                handlemap, reinterpret_cast<VkPhysicalDeviceDiagnosticsConfigFeaturesNV*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV:
-        {
-            handlemap_VkDeviceDiagnosticsConfigCreateInfoNV(handlemap, reinterpret_cast<VkDeviceDiagnosticsConfigCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV: {
+            handlemap_VkDeviceDiagnosticsConfigCreateInfoNV(
+                handlemap,
+                reinterpret_cast<VkDeviceDiagnosticsConfigCreateInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_fragment_shading_rate_enums
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV:
-        {
-            handlemap_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(handlemap, reinterpret_cast<VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV: {
+            handlemap_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(
+                handlemap, reinterpret_cast<VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV:
-        {
-            handlemap_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(handlemap, reinterpret_cast<VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV: {
+            handlemap_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(
+                handlemap, reinterpret_cast<VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV:
-        {
-            handlemap_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(handlemap, reinterpret_cast<VkPipelineFragmentShadingRateEnumStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV: {
+            handlemap_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(
+                handlemap, reinterpret_cast<VkPipelineFragmentShadingRateEnumStateCreateInfoNV*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_ray_tracing_motion_blur
-        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_MOTION_TRIANGLES_DATA_NV:
-        {
-            handlemap_VkAccelerationStructureGeometryMotionTrianglesDataNV(handlemap, reinterpret_cast<VkAccelerationStructureGeometryMotionTrianglesDataNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_MOTION_TRIANGLES_DATA_NV: {
+            handlemap_VkAccelerationStructureGeometryMotionTrianglesDataNV(
+                handlemap, reinterpret_cast<VkAccelerationStructureGeometryMotionTrianglesDataNV*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MOTION_INFO_NV:
-        {
-            handlemap_VkAccelerationStructureMotionInfoNV(handlemap, reinterpret_cast<VkAccelerationStructureMotionInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MOTION_INFO_NV: {
+            handlemap_VkAccelerationStructureMotionInfoNV(
+                handlemap,
+                reinterpret_cast<VkAccelerationStructureMotionInfoNV*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV:
-        {
-            handlemap_VkPhysicalDeviceRayTracingMotionBlurFeaturesNV(handlemap, reinterpret_cast<VkPhysicalDeviceRayTracingMotionBlurFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV: {
+            handlemap_VkPhysicalDeviceRayTracingMotionBlurFeaturesNV(
+                handlemap, reinterpret_cast<VkPhysicalDeviceRayTracingMotionBlurFeaturesNV*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_ycbcr_2plane_444_formats
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT: {
+            handlemap_VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_fragment_density_map2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2FeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT: {
+            handlemap_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2FeaturesEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT:
-        {
-            handlemap_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2PropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT: {
+            handlemap_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2PropertiesEXT*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_QCOM_rotated_copy_commands
-        case VK_STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM:
-        {
-            handlemap_VkCopyCommandTransformInfoQCOM(handlemap, reinterpret_cast<VkCopyCommandTransformInfoQCOM*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM: {
+            handlemap_VkCopyCommandTransformInfoQCOM(
+                handlemap, reinterpret_cast<VkCopyCommandTransformInfoQCOM*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_image_robustness
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDeviceImageRobustnessFeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceImageRobustnessFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT: {
+            handlemap_VkPhysicalDeviceImageRobustnessFeaturesEXT(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceImageRobustnessFeaturesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_4444_formats
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDevice4444FormatsFeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDevice4444FormatsFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT: {
+            handlemap_VkPhysicalDevice4444FormatsFeaturesEXT(
+                handlemap,
+                reinterpret_cast<VkPhysicalDevice4444FormatsFeaturesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_rgba10x6_formats
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT: {
+            handlemap_VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_VALVE_mutable_descriptor_type
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE:
-        {
-            handlemap_VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE(handlemap, reinterpret_cast<VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE: {
+            handlemap_VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE(
+                handlemap, reinterpret_cast<VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE:
-        {
-            handlemap_VkMutableDescriptorTypeCreateInfoVALVE(handlemap, reinterpret_cast<VkMutableDescriptorTypeCreateInfoVALVE*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE: {
+            handlemap_VkMutableDescriptorTypeCreateInfoVALVE(
+                handlemap,
+                reinterpret_cast<VkMutableDescriptorTypeCreateInfoVALVE*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_vertex_input_dynamic_state
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT: {
+            handlemap_VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_physical_device_drm
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRM_PROPERTIES_EXT:
-        {
-            handlemap_VkPhysicalDeviceDrmPropertiesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceDrmPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRM_PROPERTIES_EXT: {
+            handlemap_VkPhysicalDeviceDrmPropertiesEXT(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceDrmPropertiesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_primitive_topology_list_restart
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT: {
+            handlemap_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT(
+                handlemap,
+                reinterpret_cast<VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_FUCHSIA_external_memory
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA:
-        {
-            handlemap_VkImportMemoryZirconHandleInfoFUCHSIA(handlemap, reinterpret_cast<VkImportMemoryZirconHandleInfoFUCHSIA*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA: {
+            handlemap_VkImportMemoryZirconHandleInfoFUCHSIA(
+                handlemap,
+                reinterpret_cast<VkImportMemoryZirconHandleInfoFUCHSIA*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA:
-        {
-            handlemap_VkImportMemoryBufferCollectionFUCHSIA(handlemap, reinterpret_cast<VkImportMemoryBufferCollectionFUCHSIA*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA: {
+            handlemap_VkImportMemoryBufferCollectionFUCHSIA(
+                handlemap,
+                reinterpret_cast<VkImportMemoryBufferCollectionFUCHSIA*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA:
-        {
-            handlemap_VkBufferCollectionImageCreateInfoFUCHSIA(handlemap, reinterpret_cast<VkBufferCollectionImageCreateInfoFUCHSIA*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA: {
+            handlemap_VkBufferCollectionImageCreateInfoFUCHSIA(
+                handlemap,
+                reinterpret_cast<VkBufferCollectionImageCreateInfoFUCHSIA*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_BUFFER_CREATE_INFO_FUCHSIA:
-        {
-            handlemap_VkBufferCollectionBufferCreateInfoFUCHSIA(handlemap, reinterpret_cast<VkBufferCollectionBufferCreateInfoFUCHSIA*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_BUFFER_CREATE_INFO_FUCHSIA: {
+            handlemap_VkBufferCollectionBufferCreateInfoFUCHSIA(
+                handlemap,
+                reinterpret_cast<VkBufferCollectionBufferCreateInfoFUCHSIA*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_HUAWEI_subpass_shading
-        case VK_STRUCTURE_TYPE_SUBPASS_SHADING_PIPELINE_CREATE_INFO_HUAWEI:
-        {
-            handlemap_VkSubpassShadingPipelineCreateInfoHUAWEI(handlemap, reinterpret_cast<VkSubpassShadingPipelineCreateInfoHUAWEI*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SUBPASS_SHADING_PIPELINE_CREATE_INFO_HUAWEI: {
+            handlemap_VkSubpassShadingPipelineCreateInfoHUAWEI(
+                handlemap,
+                reinterpret_cast<VkSubpassShadingPipelineCreateInfoHUAWEI*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI:
-        {
-            handlemap_VkPhysicalDeviceSubpassShadingFeaturesHUAWEI(handlemap, reinterpret_cast<VkPhysicalDeviceSubpassShadingFeaturesHUAWEI*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI: {
+            handlemap_VkPhysicalDeviceSubpassShadingFeaturesHUAWEI(
+                handlemap, reinterpret_cast<VkPhysicalDeviceSubpassShadingFeaturesHUAWEI*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_PROPERTIES_HUAWEI:
-        {
-            handlemap_VkPhysicalDeviceSubpassShadingPropertiesHUAWEI(handlemap, reinterpret_cast<VkPhysicalDeviceSubpassShadingPropertiesHUAWEI*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_PROPERTIES_HUAWEI: {
+            handlemap_VkPhysicalDeviceSubpassShadingPropertiesHUAWEI(
+                handlemap, reinterpret_cast<VkPhysicalDeviceSubpassShadingPropertiesHUAWEI*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_HUAWEI_invocation_mask
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI:
-        {
-            handlemap_VkPhysicalDeviceInvocationMaskFeaturesHUAWEI(handlemap, reinterpret_cast<VkPhysicalDeviceInvocationMaskFeaturesHUAWEI*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI: {
+            handlemap_VkPhysicalDeviceInvocationMaskFeaturesHUAWEI(
+                handlemap, reinterpret_cast<VkPhysicalDeviceInvocationMaskFeaturesHUAWEI*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_external_memory_rdma
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV:
-        {
-            handlemap_VkPhysicalDeviceExternalMemoryRDMAFeaturesNV(handlemap, reinterpret_cast<VkPhysicalDeviceExternalMemoryRDMAFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV: {
+            handlemap_VkPhysicalDeviceExternalMemoryRDMAFeaturesNV(
+                handlemap, reinterpret_cast<VkPhysicalDeviceExternalMemoryRDMAFeaturesNV*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDeviceExtendedDynamicState2FeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceExtendedDynamicState2FeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT: {
+            handlemap_VkPhysicalDeviceExtendedDynamicState2FeaturesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceExtendedDynamicState2FeaturesEXT*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_color_write_enable
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDeviceColorWriteEnableFeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceColorWriteEnableFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT: {
+            handlemap_VkPhysicalDeviceColorWriteEnableFeaturesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceColorWriteEnableFeaturesEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_WRITE_CREATE_INFO_EXT:
-        {
-            handlemap_VkPipelineColorWriteCreateInfoEXT(handlemap, reinterpret_cast<VkPipelineColorWriteCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_WRITE_CREATE_INFO_EXT: {
+            handlemap_VkPipelineColorWriteCreateInfoEXT(
+                handlemap,
+                reinterpret_cast<VkPipelineColorWriteCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_GOOGLE_gfxstream
-        case VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE:
-        {
-            handlemap_VkImportColorBufferGOOGLE(handlemap, reinterpret_cast<VkImportColorBufferGOOGLE*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE: {
+            handlemap_VkImportColorBufferGOOGLE(
+                handlemap, reinterpret_cast<VkImportColorBufferGOOGLE*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE:
-        {
-            handlemap_VkImportBufferGOOGLE(handlemap, reinterpret_cast<VkImportBufferGOOGLE*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE: {
+            handlemap_VkImportBufferGOOGLE(
+                handlemap, reinterpret_cast<VkImportBufferGOOGLE*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE:
-        {
-            handlemap_VkImportPhysicalAddressGOOGLE(handlemap, reinterpret_cast<VkImportPhysicalAddressGOOGLE*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE: {
+            handlemap_VkImportPhysicalAddressGOOGLE(
+                handlemap, reinterpret_cast<VkImportPhysicalAddressGOOGLE*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_global_priority_query
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT: {
+            handlemap_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_EXT:
-        {
-            handlemap_VkQueueFamilyGlobalPriorityPropertiesEXT(handlemap, reinterpret_cast<VkQueueFamilyGlobalPriorityPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_EXT: {
+            handlemap_VkQueueFamilyGlobalPriorityPropertiesEXT(
+                handlemap,
+                reinterpret_cast<VkQueueFamilyGlobalPriorityPropertiesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_multi_draw
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDeviceMultiDrawFeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceMultiDrawFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT: {
+            handlemap_VkPhysicalDeviceMultiDrawFeaturesEXT(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceMultiDrawFeaturesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT:
-        {
-            handlemap_VkPhysicalDeviceMultiDrawPropertiesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceMultiDrawPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT: {
+            handlemap_VkPhysicalDeviceMultiDrawPropertiesEXT(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceMultiDrawPropertiesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_border_color_swizzle
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDeviceBorderColorSwizzleFeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDeviceBorderColorSwizzleFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT: {
+            handlemap_VkPhysicalDeviceBorderColorSwizzleFeaturesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDeviceBorderColorSwizzleFeaturesEXT*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_BORDER_COLOR_COMPONENT_MAPPING_CREATE_INFO_EXT:
-        {
-            handlemap_VkSamplerBorderColorComponentMappingCreateInfoEXT(handlemap, reinterpret_cast<VkSamplerBorderColorComponentMappingCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SAMPLER_BORDER_COLOR_COMPONENT_MAPPING_CREATE_INFO_EXT: {
+            handlemap_VkSamplerBorderColorComponentMappingCreateInfoEXT(
+                handlemap, reinterpret_cast<VkSamplerBorderColorComponentMappingCreateInfoEXT*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_pageable_device_local_memory
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT:
-        {
-            handlemap_VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT(handlemap, reinterpret_cast<VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT: {
+            handlemap_VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT(
+                handlemap, reinterpret_cast<VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_acceleration_structure
-        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR:
-        {
-            handlemap_VkWriteDescriptorSetAccelerationStructureKHR(handlemap, reinterpret_cast<VkWriteDescriptorSetAccelerationStructureKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR: {
+            handlemap_VkWriteDescriptorSetAccelerationStructureKHR(
+                handlemap, reinterpret_cast<VkWriteDescriptorSetAccelerationStructureKHR*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR:
-        {
-            handlemap_VkPhysicalDeviceAccelerationStructureFeaturesKHR(handlemap, reinterpret_cast<VkPhysicalDeviceAccelerationStructureFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR: {
+            handlemap_VkPhysicalDeviceAccelerationStructureFeaturesKHR(
+                handlemap, reinterpret_cast<VkPhysicalDeviceAccelerationStructureFeaturesKHR*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR:
-        {
-            handlemap_VkPhysicalDeviceAccelerationStructurePropertiesKHR(handlemap, reinterpret_cast<VkPhysicalDeviceAccelerationStructurePropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR: {
+            handlemap_VkPhysicalDeviceAccelerationStructurePropertiesKHR(
+                handlemap, reinterpret_cast<VkPhysicalDeviceAccelerationStructurePropertiesKHR*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR:
-        {
-            handlemap_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(handlemap, reinterpret_cast<VkPhysicalDeviceRayTracingPipelineFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR: {
+            handlemap_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(
+                handlemap, reinterpret_cast<VkPhysicalDeviceRayTracingPipelineFeaturesKHR*>(
+                               structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR:
-        {
-            handlemap_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(handlemap, reinterpret_cast<VkPhysicalDeviceRayTracingPipelinePropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR: {
+            handlemap_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(
+                handlemap, reinterpret_cast<VkPhysicalDeviceRayTracingPipelinePropertiesKHR*>(
+                               structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_ray_query
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR:
-        {
-            handlemap_VkPhysicalDeviceRayQueryFeaturesKHR(handlemap, reinterpret_cast<VkPhysicalDeviceRayQueryFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR: {
+            handlemap_VkPhysicalDeviceRayQueryFeaturesKHR(
+                handlemap,
+                reinterpret_cast<VkPhysicalDeviceRayQueryFeaturesKHR*>(structExtension_out));
             break;
         }
 #endif
-        default:
-        {
+        default: {
             return;
         }
     }
 }
 
-
-} // namespace goldfish_vk
+}  // namespace goldfish_vk
diff --git a/stream-servers/vulkan/cereal/common/goldfish_vk_handlemap.h b/stream-servers/vulkan/cereal/common/goldfish_vk_handlemap.h
index 8aefb33..6d062a6 100644
--- a/stream-servers/vulkan/cereal/common/goldfish_vk_handlemap.h
+++ b/stream-servers/vulkan/cereal/common/goldfish_vk_handlemap.h
@@ -14,1214 +14,881 @@
 // limitations under the License.
 
 // Autogenerated module goldfish_vk_handlemap
-// (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
+// (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml
+// cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
 // VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
 // VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+//
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o
+// $CEREAL_OUTPUT_DIR
+//
 #pragma once
 #include <vulkan/vulkan.h>
-#include "vulkan_gfxstream.h"
 
-#include "goldfish_vk_private_defs.h"
 #include "VulkanHandleMapping.h"
+#include "goldfish_vk_private_defs.h"
+#include "vulkan_gfxstream.h"
 
 namespace goldfish_vk {
 #ifdef VK_VERSION_1_0
-void handlemap_VkExtent2D(
-    VulkanHandleMapping* handlemap,
-    VkExtent2D* toMap);
+void handlemap_VkExtent2D(VulkanHandleMapping* handlemap, VkExtent2D* toMap);
 
-void handlemap_VkExtent3D(
-    VulkanHandleMapping* handlemap,
-    VkExtent3D* toMap);
+void handlemap_VkExtent3D(VulkanHandleMapping* handlemap, VkExtent3D* toMap);
 
-void handlemap_VkOffset2D(
-    VulkanHandleMapping* handlemap,
-    VkOffset2D* toMap);
+void handlemap_VkOffset2D(VulkanHandleMapping* handlemap, VkOffset2D* toMap);
 
-void handlemap_VkOffset3D(
-    VulkanHandleMapping* handlemap,
-    VkOffset3D* toMap);
+void handlemap_VkOffset3D(VulkanHandleMapping* handlemap, VkOffset3D* toMap);
 
-void handlemap_VkRect2D(
-    VulkanHandleMapping* handlemap,
-    VkRect2D* toMap);
+void handlemap_VkRect2D(VulkanHandleMapping* handlemap, VkRect2D* toMap);
 
-void handlemap_VkBaseInStructure(
-    VulkanHandleMapping* handlemap,
-    VkBaseInStructure* toMap);
+void handlemap_VkBaseInStructure(VulkanHandleMapping* handlemap, VkBaseInStructure* toMap);
 
-void handlemap_VkBaseOutStructure(
-    VulkanHandleMapping* handlemap,
-    VkBaseOutStructure* toMap);
+void handlemap_VkBaseOutStructure(VulkanHandleMapping* handlemap, VkBaseOutStructure* toMap);
 
-void handlemap_VkBufferMemoryBarrier(
-    VulkanHandleMapping* handlemap,
-    VkBufferMemoryBarrier* toMap);
+void handlemap_VkBufferMemoryBarrier(VulkanHandleMapping* handlemap, VkBufferMemoryBarrier* toMap);
 
-void handlemap_VkDispatchIndirectCommand(
-    VulkanHandleMapping* handlemap,
-    VkDispatchIndirectCommand* toMap);
+void handlemap_VkDispatchIndirectCommand(VulkanHandleMapping* handlemap,
+                                         VkDispatchIndirectCommand* toMap);
 
-void handlemap_VkDrawIndexedIndirectCommand(
-    VulkanHandleMapping* handlemap,
-    VkDrawIndexedIndirectCommand* toMap);
+void handlemap_VkDrawIndexedIndirectCommand(VulkanHandleMapping* handlemap,
+                                            VkDrawIndexedIndirectCommand* toMap);
 
-void handlemap_VkDrawIndirectCommand(
-    VulkanHandleMapping* handlemap,
-    VkDrawIndirectCommand* toMap);
+void handlemap_VkDrawIndirectCommand(VulkanHandleMapping* handlemap, VkDrawIndirectCommand* toMap);
 
-void handlemap_VkImageSubresourceRange(
-    VulkanHandleMapping* handlemap,
-    VkImageSubresourceRange* toMap);
+void handlemap_VkImageSubresourceRange(VulkanHandleMapping* handlemap,
+                                       VkImageSubresourceRange* toMap);
 
-void handlemap_VkImageMemoryBarrier(
-    VulkanHandleMapping* handlemap,
-    VkImageMemoryBarrier* toMap);
+void handlemap_VkImageMemoryBarrier(VulkanHandleMapping* handlemap, VkImageMemoryBarrier* toMap);
 
-void handlemap_VkMemoryBarrier(
-    VulkanHandleMapping* handlemap,
-    VkMemoryBarrier* toMap);
+void handlemap_VkMemoryBarrier(VulkanHandleMapping* handlemap, VkMemoryBarrier* toMap);
 
-void handlemap_VkPipelineCacheHeaderVersionOne(
-    VulkanHandleMapping* handlemap,
-    VkPipelineCacheHeaderVersionOne* toMap);
+void handlemap_VkPipelineCacheHeaderVersionOne(VulkanHandleMapping* handlemap,
+                                               VkPipelineCacheHeaderVersionOne* toMap);
 
-void handlemap_VkAllocationCallbacks(
-    VulkanHandleMapping* handlemap,
-    VkAllocationCallbacks* toMap);
+void handlemap_VkAllocationCallbacks(VulkanHandleMapping* handlemap, VkAllocationCallbacks* toMap);
 
-void handlemap_VkApplicationInfo(
-    VulkanHandleMapping* handlemap,
-    VkApplicationInfo* toMap);
+void handlemap_VkApplicationInfo(VulkanHandleMapping* handlemap, VkApplicationInfo* toMap);
 
-void handlemap_VkFormatProperties(
-    VulkanHandleMapping* handlemap,
-    VkFormatProperties* toMap);
+void handlemap_VkFormatProperties(VulkanHandleMapping* handlemap, VkFormatProperties* toMap);
 
-void handlemap_VkImageFormatProperties(
-    VulkanHandleMapping* handlemap,
-    VkImageFormatProperties* toMap);
+void handlemap_VkImageFormatProperties(VulkanHandleMapping* handlemap,
+                                       VkImageFormatProperties* toMap);
 
-void handlemap_VkInstanceCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkInstanceCreateInfo* toMap);
+void handlemap_VkInstanceCreateInfo(VulkanHandleMapping* handlemap, VkInstanceCreateInfo* toMap);
 
-void handlemap_VkMemoryHeap(
-    VulkanHandleMapping* handlemap,
-    VkMemoryHeap* toMap);
+void handlemap_VkMemoryHeap(VulkanHandleMapping* handlemap, VkMemoryHeap* toMap);
 
-void handlemap_VkMemoryType(
-    VulkanHandleMapping* handlemap,
-    VkMemoryType* toMap);
+void handlemap_VkMemoryType(VulkanHandleMapping* handlemap, VkMemoryType* toMap);
 
-void handlemap_VkPhysicalDeviceFeatures(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceFeatures* toMap);
+void handlemap_VkPhysicalDeviceFeatures(VulkanHandleMapping* handlemap,
+                                        VkPhysicalDeviceFeatures* toMap);
 
-void handlemap_VkPhysicalDeviceLimits(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceLimits* toMap);
+void handlemap_VkPhysicalDeviceLimits(VulkanHandleMapping* handlemap,
+                                      VkPhysicalDeviceLimits* toMap);
 
-void handlemap_VkPhysicalDeviceMemoryProperties(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceMemoryProperties* toMap);
+void handlemap_VkPhysicalDeviceMemoryProperties(VulkanHandleMapping* handlemap,
+                                                VkPhysicalDeviceMemoryProperties* toMap);
 
-void handlemap_VkPhysicalDeviceSparseProperties(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceSparseProperties* toMap);
+void handlemap_VkPhysicalDeviceSparseProperties(VulkanHandleMapping* handlemap,
+                                                VkPhysicalDeviceSparseProperties* toMap);
 
-void handlemap_VkPhysicalDeviceProperties(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceProperties* toMap);
+void handlemap_VkPhysicalDeviceProperties(VulkanHandleMapping* handlemap,
+                                          VkPhysicalDeviceProperties* toMap);
 
-void handlemap_VkQueueFamilyProperties(
-    VulkanHandleMapping* handlemap,
-    VkQueueFamilyProperties* toMap);
+void handlemap_VkQueueFamilyProperties(VulkanHandleMapping* handlemap,
+                                       VkQueueFamilyProperties* toMap);
 
-void handlemap_VkDeviceQueueCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkDeviceQueueCreateInfo* toMap);
+void handlemap_VkDeviceQueueCreateInfo(VulkanHandleMapping* handlemap,
+                                       VkDeviceQueueCreateInfo* toMap);
 
-void handlemap_VkDeviceCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkDeviceCreateInfo* toMap);
+void handlemap_VkDeviceCreateInfo(VulkanHandleMapping* handlemap, VkDeviceCreateInfo* toMap);
 
-void handlemap_VkExtensionProperties(
-    VulkanHandleMapping* handlemap,
-    VkExtensionProperties* toMap);
+void handlemap_VkExtensionProperties(VulkanHandleMapping* handlemap, VkExtensionProperties* toMap);
 
-void handlemap_VkLayerProperties(
-    VulkanHandleMapping* handlemap,
-    VkLayerProperties* toMap);
+void handlemap_VkLayerProperties(VulkanHandleMapping* handlemap, VkLayerProperties* toMap);
 
-void handlemap_VkSubmitInfo(
-    VulkanHandleMapping* handlemap,
-    VkSubmitInfo* toMap);
+void handlemap_VkSubmitInfo(VulkanHandleMapping* handlemap, VkSubmitInfo* toMap);
 
-void handlemap_VkMappedMemoryRange(
-    VulkanHandleMapping* handlemap,
-    VkMappedMemoryRange* toMap);
+void handlemap_VkMappedMemoryRange(VulkanHandleMapping* handlemap, VkMappedMemoryRange* toMap);
 
-void handlemap_VkMemoryAllocateInfo(
-    VulkanHandleMapping* handlemap,
-    VkMemoryAllocateInfo* toMap);
+void handlemap_VkMemoryAllocateInfo(VulkanHandleMapping* handlemap, VkMemoryAllocateInfo* toMap);
 
-void handlemap_VkMemoryRequirements(
-    VulkanHandleMapping* handlemap,
-    VkMemoryRequirements* toMap);
+void handlemap_VkMemoryRequirements(VulkanHandleMapping* handlemap, VkMemoryRequirements* toMap);
 
-void handlemap_VkSparseMemoryBind(
-    VulkanHandleMapping* handlemap,
-    VkSparseMemoryBind* toMap);
+void handlemap_VkSparseMemoryBind(VulkanHandleMapping* handlemap, VkSparseMemoryBind* toMap);
 
-void handlemap_VkSparseBufferMemoryBindInfo(
-    VulkanHandleMapping* handlemap,
-    VkSparseBufferMemoryBindInfo* toMap);
+void handlemap_VkSparseBufferMemoryBindInfo(VulkanHandleMapping* handlemap,
+                                            VkSparseBufferMemoryBindInfo* toMap);
 
-void handlemap_VkSparseImageOpaqueMemoryBindInfo(
-    VulkanHandleMapping* handlemap,
-    VkSparseImageOpaqueMemoryBindInfo* toMap);
+void handlemap_VkSparseImageOpaqueMemoryBindInfo(VulkanHandleMapping* handlemap,
+                                                 VkSparseImageOpaqueMemoryBindInfo* toMap);
 
-void handlemap_VkImageSubresource(
-    VulkanHandleMapping* handlemap,
-    VkImageSubresource* toMap);
+void handlemap_VkImageSubresource(VulkanHandleMapping* handlemap, VkImageSubresource* toMap);
 
-void handlemap_VkSparseImageMemoryBind(
-    VulkanHandleMapping* handlemap,
-    VkSparseImageMemoryBind* toMap);
+void handlemap_VkSparseImageMemoryBind(VulkanHandleMapping* handlemap,
+                                       VkSparseImageMemoryBind* toMap);
 
-void handlemap_VkSparseImageMemoryBindInfo(
-    VulkanHandleMapping* handlemap,
-    VkSparseImageMemoryBindInfo* toMap);
+void handlemap_VkSparseImageMemoryBindInfo(VulkanHandleMapping* handlemap,
+                                           VkSparseImageMemoryBindInfo* toMap);
 
-void handlemap_VkBindSparseInfo(
-    VulkanHandleMapping* handlemap,
-    VkBindSparseInfo* toMap);
+void handlemap_VkBindSparseInfo(VulkanHandleMapping* handlemap, VkBindSparseInfo* toMap);
 
-void handlemap_VkSparseImageFormatProperties(
-    VulkanHandleMapping* handlemap,
-    VkSparseImageFormatProperties* toMap);
+void handlemap_VkSparseImageFormatProperties(VulkanHandleMapping* handlemap,
+                                             VkSparseImageFormatProperties* toMap);
 
-void handlemap_VkSparseImageMemoryRequirements(
-    VulkanHandleMapping* handlemap,
-    VkSparseImageMemoryRequirements* toMap);
+void handlemap_VkSparseImageMemoryRequirements(VulkanHandleMapping* handlemap,
+                                               VkSparseImageMemoryRequirements* toMap);
 
-void handlemap_VkFenceCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkFenceCreateInfo* toMap);
+void handlemap_VkFenceCreateInfo(VulkanHandleMapping* handlemap, VkFenceCreateInfo* toMap);
 
-void handlemap_VkSemaphoreCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkSemaphoreCreateInfo* toMap);
+void handlemap_VkSemaphoreCreateInfo(VulkanHandleMapping* handlemap, VkSemaphoreCreateInfo* toMap);
 
-void handlemap_VkEventCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkEventCreateInfo* toMap);
+void handlemap_VkEventCreateInfo(VulkanHandleMapping* handlemap, VkEventCreateInfo* toMap);
 
-void handlemap_VkQueryPoolCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkQueryPoolCreateInfo* toMap);
+void handlemap_VkQueryPoolCreateInfo(VulkanHandleMapping* handlemap, VkQueryPoolCreateInfo* toMap);
 
-void handlemap_VkBufferCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkBufferCreateInfo* toMap);
+void handlemap_VkBufferCreateInfo(VulkanHandleMapping* handlemap, VkBufferCreateInfo* toMap);
 
-void handlemap_VkBufferViewCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkBufferViewCreateInfo* toMap);
+void handlemap_VkBufferViewCreateInfo(VulkanHandleMapping* handlemap,
+                                      VkBufferViewCreateInfo* toMap);
 
-void handlemap_VkImageCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkImageCreateInfo* toMap);
+void handlemap_VkImageCreateInfo(VulkanHandleMapping* handlemap, VkImageCreateInfo* toMap);
 
-void handlemap_VkSubresourceLayout(
-    VulkanHandleMapping* handlemap,
-    VkSubresourceLayout* toMap);
+void handlemap_VkSubresourceLayout(VulkanHandleMapping* handlemap, VkSubresourceLayout* toMap);
 
-void handlemap_VkComponentMapping(
-    VulkanHandleMapping* handlemap,
-    VkComponentMapping* toMap);
+void handlemap_VkComponentMapping(VulkanHandleMapping* handlemap, VkComponentMapping* toMap);
 
-void handlemap_VkImageViewCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkImageViewCreateInfo* toMap);
+void handlemap_VkImageViewCreateInfo(VulkanHandleMapping* handlemap, VkImageViewCreateInfo* toMap);
 
-void handlemap_VkShaderModuleCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkShaderModuleCreateInfo* toMap);
+void handlemap_VkShaderModuleCreateInfo(VulkanHandleMapping* handlemap,
+                                        VkShaderModuleCreateInfo* toMap);
 
-void handlemap_VkPipelineCacheCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkPipelineCacheCreateInfo* toMap);
+void handlemap_VkPipelineCacheCreateInfo(VulkanHandleMapping* handlemap,
+                                         VkPipelineCacheCreateInfo* toMap);
 
-void handlemap_VkSpecializationMapEntry(
-    VulkanHandleMapping* handlemap,
-    VkSpecializationMapEntry* toMap);
+void handlemap_VkSpecializationMapEntry(VulkanHandleMapping* handlemap,
+                                        VkSpecializationMapEntry* toMap);
 
-void handlemap_VkSpecializationInfo(
-    VulkanHandleMapping* handlemap,
-    VkSpecializationInfo* toMap);
+void handlemap_VkSpecializationInfo(VulkanHandleMapping* handlemap, VkSpecializationInfo* toMap);
 
-void handlemap_VkPipelineShaderStageCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkPipelineShaderStageCreateInfo* toMap);
+void handlemap_VkPipelineShaderStageCreateInfo(VulkanHandleMapping* handlemap,
+                                               VkPipelineShaderStageCreateInfo* toMap);
 
-void handlemap_VkComputePipelineCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkComputePipelineCreateInfo* toMap);
+void handlemap_VkComputePipelineCreateInfo(VulkanHandleMapping* handlemap,
+                                           VkComputePipelineCreateInfo* toMap);
 
-void handlemap_VkVertexInputBindingDescription(
-    VulkanHandleMapping* handlemap,
-    VkVertexInputBindingDescription* toMap);
+void handlemap_VkVertexInputBindingDescription(VulkanHandleMapping* handlemap,
+                                               VkVertexInputBindingDescription* toMap);
 
-void handlemap_VkVertexInputAttributeDescription(
-    VulkanHandleMapping* handlemap,
-    VkVertexInputAttributeDescription* toMap);
+void handlemap_VkVertexInputAttributeDescription(VulkanHandleMapping* handlemap,
+                                                 VkVertexInputAttributeDescription* toMap);
 
-void handlemap_VkPipelineVertexInputStateCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkPipelineVertexInputStateCreateInfo* toMap);
+void handlemap_VkPipelineVertexInputStateCreateInfo(VulkanHandleMapping* handlemap,
+                                                    VkPipelineVertexInputStateCreateInfo* toMap);
 
 void handlemap_VkPipelineInputAssemblyStateCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkPipelineInputAssemblyStateCreateInfo* toMap);
+    VulkanHandleMapping* handlemap, VkPipelineInputAssemblyStateCreateInfo* toMap);
 
-void handlemap_VkPipelineTessellationStateCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkPipelineTessellationStateCreateInfo* toMap);
+void handlemap_VkPipelineTessellationStateCreateInfo(VulkanHandleMapping* handlemap,
+                                                     VkPipelineTessellationStateCreateInfo* toMap);
 
-void handlemap_VkViewport(
-    VulkanHandleMapping* handlemap,
-    VkViewport* toMap);
+void handlemap_VkViewport(VulkanHandleMapping* handlemap, VkViewport* toMap);
 
-void handlemap_VkPipelineViewportStateCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkPipelineViewportStateCreateInfo* toMap);
+void handlemap_VkPipelineViewportStateCreateInfo(VulkanHandleMapping* handlemap,
+                                                 VkPipelineViewportStateCreateInfo* toMap);
 
 void handlemap_VkPipelineRasterizationStateCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkPipelineRasterizationStateCreateInfo* toMap);
+    VulkanHandleMapping* handlemap, VkPipelineRasterizationStateCreateInfo* toMap);
 
-void handlemap_VkPipelineMultisampleStateCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkPipelineMultisampleStateCreateInfo* toMap);
+void handlemap_VkPipelineMultisampleStateCreateInfo(VulkanHandleMapping* handlemap,
+                                                    VkPipelineMultisampleStateCreateInfo* toMap);
 
-void handlemap_VkStencilOpState(
-    VulkanHandleMapping* handlemap,
-    VkStencilOpState* toMap);
+void handlemap_VkStencilOpState(VulkanHandleMapping* handlemap, VkStencilOpState* toMap);
 
-void handlemap_VkPipelineDepthStencilStateCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkPipelineDepthStencilStateCreateInfo* toMap);
+void handlemap_VkPipelineDepthStencilStateCreateInfo(VulkanHandleMapping* handlemap,
+                                                     VkPipelineDepthStencilStateCreateInfo* toMap);
 
-void handlemap_VkPipelineColorBlendAttachmentState(
-    VulkanHandleMapping* handlemap,
-    VkPipelineColorBlendAttachmentState* toMap);
+void handlemap_VkPipelineColorBlendAttachmentState(VulkanHandleMapping* handlemap,
+                                                   VkPipelineColorBlendAttachmentState* toMap);
 
-void handlemap_VkPipelineColorBlendStateCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkPipelineColorBlendStateCreateInfo* toMap);
+void handlemap_VkPipelineColorBlendStateCreateInfo(VulkanHandleMapping* handlemap,
+                                                   VkPipelineColorBlendStateCreateInfo* toMap);
 
-void handlemap_VkPipelineDynamicStateCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkPipelineDynamicStateCreateInfo* toMap);
+void handlemap_VkPipelineDynamicStateCreateInfo(VulkanHandleMapping* handlemap,
+                                                VkPipelineDynamicStateCreateInfo* toMap);
 
-void handlemap_VkGraphicsPipelineCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkGraphicsPipelineCreateInfo* toMap);
+void handlemap_VkGraphicsPipelineCreateInfo(VulkanHandleMapping* handlemap,
+                                            VkGraphicsPipelineCreateInfo* toMap);
 
-void handlemap_VkPushConstantRange(
-    VulkanHandleMapping* handlemap,
-    VkPushConstantRange* toMap);
+void handlemap_VkPushConstantRange(VulkanHandleMapping* handlemap, VkPushConstantRange* toMap);
 
-void handlemap_VkPipelineLayoutCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkPipelineLayoutCreateInfo* toMap);
+void handlemap_VkPipelineLayoutCreateInfo(VulkanHandleMapping* handlemap,
+                                          VkPipelineLayoutCreateInfo* toMap);
 
-void handlemap_VkSamplerCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkSamplerCreateInfo* toMap);
+void handlemap_VkSamplerCreateInfo(VulkanHandleMapping* handlemap, VkSamplerCreateInfo* toMap);
 
-void handlemap_VkCopyDescriptorSet(
-    VulkanHandleMapping* handlemap,
-    VkCopyDescriptorSet* toMap);
+void handlemap_VkCopyDescriptorSet(VulkanHandleMapping* handlemap, VkCopyDescriptorSet* toMap);
 
-void handlemap_VkDescriptorBufferInfo(
-    VulkanHandleMapping* handlemap,
-    VkDescriptorBufferInfo* toMap);
+void handlemap_VkDescriptorBufferInfo(VulkanHandleMapping* handlemap,
+                                      VkDescriptorBufferInfo* toMap);
 
-void handlemap_VkDescriptorImageInfo(
-    VulkanHandleMapping* handlemap,
-    VkDescriptorImageInfo* toMap);
+void handlemap_VkDescriptorImageInfo(VulkanHandleMapping* handlemap, VkDescriptorImageInfo* toMap);
 
-void handlemap_VkDescriptorPoolSize(
-    VulkanHandleMapping* handlemap,
-    VkDescriptorPoolSize* toMap);
+void handlemap_VkDescriptorPoolSize(VulkanHandleMapping* handlemap, VkDescriptorPoolSize* toMap);
 
-void handlemap_VkDescriptorPoolCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkDescriptorPoolCreateInfo* toMap);
+void handlemap_VkDescriptorPoolCreateInfo(VulkanHandleMapping* handlemap,
+                                          VkDescriptorPoolCreateInfo* toMap);
 
-void handlemap_VkDescriptorSetAllocateInfo(
-    VulkanHandleMapping* handlemap,
-    VkDescriptorSetAllocateInfo* toMap);
+void handlemap_VkDescriptorSetAllocateInfo(VulkanHandleMapping* handlemap,
+                                           VkDescriptorSetAllocateInfo* toMap);
 
-void handlemap_VkDescriptorSetLayoutBinding(
-    VulkanHandleMapping* handlemap,
-    VkDescriptorSetLayoutBinding* toMap);
+void handlemap_VkDescriptorSetLayoutBinding(VulkanHandleMapping* handlemap,
+                                            VkDescriptorSetLayoutBinding* toMap);
 
-void handlemap_VkDescriptorSetLayoutCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkDescriptorSetLayoutCreateInfo* toMap);
+void handlemap_VkDescriptorSetLayoutCreateInfo(VulkanHandleMapping* handlemap,
+                                               VkDescriptorSetLayoutCreateInfo* toMap);
 
-void handlemap_VkWriteDescriptorSet(
-    VulkanHandleMapping* handlemap,
-    VkWriteDescriptorSet* toMap);
+void handlemap_VkWriteDescriptorSet(VulkanHandleMapping* handlemap, VkWriteDescriptorSet* toMap);
 
-void handlemap_VkAttachmentDescription(
-    VulkanHandleMapping* handlemap,
-    VkAttachmentDescription* toMap);
+void handlemap_VkAttachmentDescription(VulkanHandleMapping* handlemap,
+                                       VkAttachmentDescription* toMap);
 
-void handlemap_VkAttachmentReference(
-    VulkanHandleMapping* handlemap,
-    VkAttachmentReference* toMap);
+void handlemap_VkAttachmentReference(VulkanHandleMapping* handlemap, VkAttachmentReference* toMap);
 
-void handlemap_VkFramebufferCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkFramebufferCreateInfo* toMap);
+void handlemap_VkFramebufferCreateInfo(VulkanHandleMapping* handlemap,
+                                       VkFramebufferCreateInfo* toMap);
 
-void handlemap_VkSubpassDescription(
-    VulkanHandleMapping* handlemap,
-    VkSubpassDescription* toMap);
+void handlemap_VkSubpassDescription(VulkanHandleMapping* handlemap, VkSubpassDescription* toMap);
 
-void handlemap_VkSubpassDependency(
-    VulkanHandleMapping* handlemap,
-    VkSubpassDependency* toMap);
+void handlemap_VkSubpassDependency(VulkanHandleMapping* handlemap, VkSubpassDependency* toMap);
 
-void handlemap_VkRenderPassCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkRenderPassCreateInfo* toMap);
+void handlemap_VkRenderPassCreateInfo(VulkanHandleMapping* handlemap,
+                                      VkRenderPassCreateInfo* toMap);
 
-void handlemap_VkCommandPoolCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkCommandPoolCreateInfo* toMap);
+void handlemap_VkCommandPoolCreateInfo(VulkanHandleMapping* handlemap,
+                                       VkCommandPoolCreateInfo* toMap);
 
-void handlemap_VkCommandBufferAllocateInfo(
-    VulkanHandleMapping* handlemap,
-    VkCommandBufferAllocateInfo* toMap);
+void handlemap_VkCommandBufferAllocateInfo(VulkanHandleMapping* handlemap,
+                                           VkCommandBufferAllocateInfo* toMap);
 
-void handlemap_VkCommandBufferInheritanceInfo(
-    VulkanHandleMapping* handlemap,
-    VkCommandBufferInheritanceInfo* toMap);
+void handlemap_VkCommandBufferInheritanceInfo(VulkanHandleMapping* handlemap,
+                                              VkCommandBufferInheritanceInfo* toMap);
 
-void handlemap_VkCommandBufferBeginInfo(
-    VulkanHandleMapping* handlemap,
-    VkCommandBufferBeginInfo* toMap);
+void handlemap_VkCommandBufferBeginInfo(VulkanHandleMapping* handlemap,
+                                        VkCommandBufferBeginInfo* toMap);
 
-void handlemap_VkBufferCopy(
-    VulkanHandleMapping* handlemap,
-    VkBufferCopy* toMap);
+void handlemap_VkBufferCopy(VulkanHandleMapping* handlemap, VkBufferCopy* toMap);
 
-void handlemap_VkImageSubresourceLayers(
-    VulkanHandleMapping* handlemap,
-    VkImageSubresourceLayers* toMap);
+void handlemap_VkImageSubresourceLayers(VulkanHandleMapping* handlemap,
+                                        VkImageSubresourceLayers* toMap);
 
-void handlemap_VkBufferImageCopy(
-    VulkanHandleMapping* handlemap,
-    VkBufferImageCopy* toMap);
+void handlemap_VkBufferImageCopy(VulkanHandleMapping* handlemap, VkBufferImageCopy* toMap);
 
-void handlemap_VkClearColorValue(
-    VulkanHandleMapping* handlemap,
-    VkClearColorValue* toMap);
+void handlemap_VkClearColorValue(VulkanHandleMapping* handlemap, VkClearColorValue* toMap);
 
-void handlemap_VkClearDepthStencilValue(
-    VulkanHandleMapping* handlemap,
-    VkClearDepthStencilValue* toMap);
+void handlemap_VkClearDepthStencilValue(VulkanHandleMapping* handlemap,
+                                        VkClearDepthStencilValue* toMap);
 
-void handlemap_VkClearValue(
-    VulkanHandleMapping* handlemap,
-    VkClearValue* toMap);
+void handlemap_VkClearValue(VulkanHandleMapping* handlemap, VkClearValue* toMap);
 
-void handlemap_VkClearAttachment(
-    VulkanHandleMapping* handlemap,
-    VkClearAttachment* toMap);
+void handlemap_VkClearAttachment(VulkanHandleMapping* handlemap, VkClearAttachment* toMap);
 
-void handlemap_VkClearRect(
-    VulkanHandleMapping* handlemap,
-    VkClearRect* toMap);
+void handlemap_VkClearRect(VulkanHandleMapping* handlemap, VkClearRect* toMap);
 
-void handlemap_VkImageBlit(
-    VulkanHandleMapping* handlemap,
-    VkImageBlit* toMap);
+void handlemap_VkImageBlit(VulkanHandleMapping* handlemap, VkImageBlit* toMap);
 
-void handlemap_VkImageCopy(
-    VulkanHandleMapping* handlemap,
-    VkImageCopy* toMap);
+void handlemap_VkImageCopy(VulkanHandleMapping* handlemap, VkImageCopy* toMap);
 
-void handlemap_VkImageResolve(
-    VulkanHandleMapping* handlemap,
-    VkImageResolve* toMap);
+void handlemap_VkImageResolve(VulkanHandleMapping* handlemap, VkImageResolve* toMap);
 
-void handlemap_VkRenderPassBeginInfo(
-    VulkanHandleMapping* handlemap,
-    VkRenderPassBeginInfo* toMap);
+void handlemap_VkRenderPassBeginInfo(VulkanHandleMapping* handlemap, VkRenderPassBeginInfo* toMap);
 
 #endif
 #ifdef VK_VERSION_1_1
-void handlemap_VkPhysicalDeviceSubgroupProperties(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceSubgroupProperties* toMap);
+void handlemap_VkPhysicalDeviceSubgroupProperties(VulkanHandleMapping* handlemap,
+                                                  VkPhysicalDeviceSubgroupProperties* toMap);
 
-void handlemap_VkBindBufferMemoryInfo(
-    VulkanHandleMapping* handlemap,
-    VkBindBufferMemoryInfo* toMap);
+void handlemap_VkBindBufferMemoryInfo(VulkanHandleMapping* handlemap,
+                                      VkBindBufferMemoryInfo* toMap);
 
-void handlemap_VkBindImageMemoryInfo(
-    VulkanHandleMapping* handlemap,
-    VkBindImageMemoryInfo* toMap);
+void handlemap_VkBindImageMemoryInfo(VulkanHandleMapping* handlemap, VkBindImageMemoryInfo* toMap);
 
-void handlemap_VkPhysicalDevice16BitStorageFeatures(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDevice16BitStorageFeatures* toMap);
+void handlemap_VkPhysicalDevice16BitStorageFeatures(VulkanHandleMapping* handlemap,
+                                                    VkPhysicalDevice16BitStorageFeatures* toMap);
 
-void handlemap_VkMemoryDedicatedRequirements(
-    VulkanHandleMapping* handlemap,
-    VkMemoryDedicatedRequirements* toMap);
+void handlemap_VkMemoryDedicatedRequirements(VulkanHandleMapping* handlemap,
+                                             VkMemoryDedicatedRequirements* toMap);
 
-void handlemap_VkMemoryDedicatedAllocateInfo(
-    VulkanHandleMapping* handlemap,
-    VkMemoryDedicatedAllocateInfo* toMap);
+void handlemap_VkMemoryDedicatedAllocateInfo(VulkanHandleMapping* handlemap,
+                                             VkMemoryDedicatedAllocateInfo* toMap);
 
-void handlemap_VkMemoryAllocateFlagsInfo(
-    VulkanHandleMapping* handlemap,
-    VkMemoryAllocateFlagsInfo* toMap);
+void handlemap_VkMemoryAllocateFlagsInfo(VulkanHandleMapping* handlemap,
+                                         VkMemoryAllocateFlagsInfo* toMap);
 
-void handlemap_VkDeviceGroupRenderPassBeginInfo(
-    VulkanHandleMapping* handlemap,
-    VkDeviceGroupRenderPassBeginInfo* toMap);
+void handlemap_VkDeviceGroupRenderPassBeginInfo(VulkanHandleMapping* handlemap,
+                                                VkDeviceGroupRenderPassBeginInfo* toMap);
 
-void handlemap_VkDeviceGroupCommandBufferBeginInfo(
-    VulkanHandleMapping* handlemap,
-    VkDeviceGroupCommandBufferBeginInfo* toMap);
+void handlemap_VkDeviceGroupCommandBufferBeginInfo(VulkanHandleMapping* handlemap,
+                                                   VkDeviceGroupCommandBufferBeginInfo* toMap);
 
-void handlemap_VkDeviceGroupSubmitInfo(
-    VulkanHandleMapping* handlemap,
-    VkDeviceGroupSubmitInfo* toMap);
+void handlemap_VkDeviceGroupSubmitInfo(VulkanHandleMapping* handlemap,
+                                       VkDeviceGroupSubmitInfo* toMap);
 
-void handlemap_VkDeviceGroupBindSparseInfo(
-    VulkanHandleMapping* handlemap,
-    VkDeviceGroupBindSparseInfo* toMap);
+void handlemap_VkDeviceGroupBindSparseInfo(VulkanHandleMapping* handlemap,
+                                           VkDeviceGroupBindSparseInfo* toMap);
 
-void handlemap_VkBindBufferMemoryDeviceGroupInfo(
-    VulkanHandleMapping* handlemap,
-    VkBindBufferMemoryDeviceGroupInfo* toMap);
+void handlemap_VkBindBufferMemoryDeviceGroupInfo(VulkanHandleMapping* handlemap,
+                                                 VkBindBufferMemoryDeviceGroupInfo* toMap);
 
-void handlemap_VkBindImageMemoryDeviceGroupInfo(
-    VulkanHandleMapping* handlemap,
-    VkBindImageMemoryDeviceGroupInfo* toMap);
+void handlemap_VkBindImageMemoryDeviceGroupInfo(VulkanHandleMapping* handlemap,
+                                                VkBindImageMemoryDeviceGroupInfo* toMap);
 
-void handlemap_VkPhysicalDeviceGroupProperties(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceGroupProperties* toMap);
+void handlemap_VkPhysicalDeviceGroupProperties(VulkanHandleMapping* handlemap,
+                                               VkPhysicalDeviceGroupProperties* toMap);
 
-void handlemap_VkDeviceGroupDeviceCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkDeviceGroupDeviceCreateInfo* toMap);
+void handlemap_VkDeviceGroupDeviceCreateInfo(VulkanHandleMapping* handlemap,
+                                             VkDeviceGroupDeviceCreateInfo* toMap);
 
-void handlemap_VkBufferMemoryRequirementsInfo2(
-    VulkanHandleMapping* handlemap,
-    VkBufferMemoryRequirementsInfo2* toMap);
+void handlemap_VkBufferMemoryRequirementsInfo2(VulkanHandleMapping* handlemap,
+                                               VkBufferMemoryRequirementsInfo2* toMap);
 
-void handlemap_VkImageMemoryRequirementsInfo2(
-    VulkanHandleMapping* handlemap,
-    VkImageMemoryRequirementsInfo2* toMap);
+void handlemap_VkImageMemoryRequirementsInfo2(VulkanHandleMapping* handlemap,
+                                              VkImageMemoryRequirementsInfo2* toMap);
 
-void handlemap_VkImageSparseMemoryRequirementsInfo2(
-    VulkanHandleMapping* handlemap,
-    VkImageSparseMemoryRequirementsInfo2* toMap);
+void handlemap_VkImageSparseMemoryRequirementsInfo2(VulkanHandleMapping* handlemap,
+                                                    VkImageSparseMemoryRequirementsInfo2* toMap);
 
-void handlemap_VkMemoryRequirements2(
-    VulkanHandleMapping* handlemap,
-    VkMemoryRequirements2* toMap);
+void handlemap_VkMemoryRequirements2(VulkanHandleMapping* handlemap, VkMemoryRequirements2* toMap);
 
-void handlemap_VkSparseImageMemoryRequirements2(
-    VulkanHandleMapping* handlemap,
-    VkSparseImageMemoryRequirements2* toMap);
+void handlemap_VkSparseImageMemoryRequirements2(VulkanHandleMapping* handlemap,
+                                                VkSparseImageMemoryRequirements2* toMap);
 
-void handlemap_VkPhysicalDeviceFeatures2(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceFeatures2* toMap);
+void handlemap_VkPhysicalDeviceFeatures2(VulkanHandleMapping* handlemap,
+                                         VkPhysicalDeviceFeatures2* toMap);
 
-void handlemap_VkPhysicalDeviceProperties2(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceProperties2* toMap);
+void handlemap_VkPhysicalDeviceProperties2(VulkanHandleMapping* handlemap,
+                                           VkPhysicalDeviceProperties2* toMap);
 
-void handlemap_VkFormatProperties2(
-    VulkanHandleMapping* handlemap,
-    VkFormatProperties2* toMap);
+void handlemap_VkFormatProperties2(VulkanHandleMapping* handlemap, VkFormatProperties2* toMap);
 
-void handlemap_VkImageFormatProperties2(
-    VulkanHandleMapping* handlemap,
-    VkImageFormatProperties2* toMap);
+void handlemap_VkImageFormatProperties2(VulkanHandleMapping* handlemap,
+                                        VkImageFormatProperties2* toMap);
 
-void handlemap_VkPhysicalDeviceImageFormatInfo2(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceImageFormatInfo2* toMap);
+void handlemap_VkPhysicalDeviceImageFormatInfo2(VulkanHandleMapping* handlemap,
+                                                VkPhysicalDeviceImageFormatInfo2* toMap);
 
-void handlemap_VkQueueFamilyProperties2(
-    VulkanHandleMapping* handlemap,
-    VkQueueFamilyProperties2* toMap);
+void handlemap_VkQueueFamilyProperties2(VulkanHandleMapping* handlemap,
+                                        VkQueueFamilyProperties2* toMap);
 
-void handlemap_VkPhysicalDeviceMemoryProperties2(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceMemoryProperties2* toMap);
+void handlemap_VkPhysicalDeviceMemoryProperties2(VulkanHandleMapping* handlemap,
+                                                 VkPhysicalDeviceMemoryProperties2* toMap);
 
-void handlemap_VkSparseImageFormatProperties2(
-    VulkanHandleMapping* handlemap,
-    VkSparseImageFormatProperties2* toMap);
+void handlemap_VkSparseImageFormatProperties2(VulkanHandleMapping* handlemap,
+                                              VkSparseImageFormatProperties2* toMap);
 
 void handlemap_VkPhysicalDeviceSparseImageFormatInfo2(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceSparseImageFormatInfo2* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceSparseImageFormatInfo2* toMap);
 
 void handlemap_VkPhysicalDevicePointClippingProperties(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDevicePointClippingProperties* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDevicePointClippingProperties* toMap);
 
-void handlemap_VkInputAttachmentAspectReference(
-    VulkanHandleMapping* handlemap,
-    VkInputAttachmentAspectReference* toMap);
+void handlemap_VkInputAttachmentAspectReference(VulkanHandleMapping* handlemap,
+                                                VkInputAttachmentAspectReference* toMap);
 
 void handlemap_VkRenderPassInputAttachmentAspectCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkRenderPassInputAttachmentAspectCreateInfo* toMap);
+    VulkanHandleMapping* handlemap, VkRenderPassInputAttachmentAspectCreateInfo* toMap);
 
-void handlemap_VkImageViewUsageCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkImageViewUsageCreateInfo* toMap);
+void handlemap_VkImageViewUsageCreateInfo(VulkanHandleMapping* handlemap,
+                                          VkImageViewUsageCreateInfo* toMap);
 
 void handlemap_VkPipelineTessellationDomainOriginStateCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkPipelineTessellationDomainOriginStateCreateInfo* toMap);
+    VulkanHandleMapping* handlemap, VkPipelineTessellationDomainOriginStateCreateInfo* toMap);
 
-void handlemap_VkRenderPassMultiviewCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkRenderPassMultiviewCreateInfo* toMap);
+void handlemap_VkRenderPassMultiviewCreateInfo(VulkanHandleMapping* handlemap,
+                                               VkRenderPassMultiviewCreateInfo* toMap);
 
-void handlemap_VkPhysicalDeviceMultiviewFeatures(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceMultiviewFeatures* toMap);
+void handlemap_VkPhysicalDeviceMultiviewFeatures(VulkanHandleMapping* handlemap,
+                                                 VkPhysicalDeviceMultiviewFeatures* toMap);
 
-void handlemap_VkPhysicalDeviceMultiviewProperties(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceMultiviewProperties* toMap);
+void handlemap_VkPhysicalDeviceMultiviewProperties(VulkanHandleMapping* handlemap,
+                                                   VkPhysicalDeviceMultiviewProperties* toMap);
 
 void handlemap_VkPhysicalDeviceVariablePointersFeatures(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceVariablePointersFeatures* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceVariablePointersFeatures* toMap);
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceVariablePointersFeatures, handlemap_VkPhysicalDeviceVariablePointerFeatures)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceVariablePointersFeatures,
+                      handlemap_VkPhysicalDeviceVariablePointerFeatures)
 
 void handlemap_VkPhysicalDeviceProtectedMemoryFeatures(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceProtectedMemoryFeatures* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceProtectedMemoryFeatures* toMap);
 
 void handlemap_VkPhysicalDeviceProtectedMemoryProperties(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceProtectedMemoryProperties* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceProtectedMemoryProperties* toMap);
 
-void handlemap_VkDeviceQueueInfo2(
-    VulkanHandleMapping* handlemap,
-    VkDeviceQueueInfo2* toMap);
+void handlemap_VkDeviceQueueInfo2(VulkanHandleMapping* handlemap, VkDeviceQueueInfo2* toMap);
 
-void handlemap_VkProtectedSubmitInfo(
-    VulkanHandleMapping* handlemap,
-    VkProtectedSubmitInfo* toMap);
+void handlemap_VkProtectedSubmitInfo(VulkanHandleMapping* handlemap, VkProtectedSubmitInfo* toMap);
 
-void handlemap_VkSamplerYcbcrConversionCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkSamplerYcbcrConversionCreateInfo* toMap);
+void handlemap_VkSamplerYcbcrConversionCreateInfo(VulkanHandleMapping* handlemap,
+                                                  VkSamplerYcbcrConversionCreateInfo* toMap);
 
-void handlemap_VkSamplerYcbcrConversionInfo(
-    VulkanHandleMapping* handlemap,
-    VkSamplerYcbcrConversionInfo* toMap);
+void handlemap_VkSamplerYcbcrConversionInfo(VulkanHandleMapping* handlemap,
+                                            VkSamplerYcbcrConversionInfo* toMap);
 
-void handlemap_VkBindImagePlaneMemoryInfo(
-    VulkanHandleMapping* handlemap,
-    VkBindImagePlaneMemoryInfo* toMap);
+void handlemap_VkBindImagePlaneMemoryInfo(VulkanHandleMapping* handlemap,
+                                          VkBindImagePlaneMemoryInfo* toMap);
 
-void handlemap_VkImagePlaneMemoryRequirementsInfo(
-    VulkanHandleMapping* handlemap,
-    VkImagePlaneMemoryRequirementsInfo* toMap);
+void handlemap_VkImagePlaneMemoryRequirementsInfo(VulkanHandleMapping* handlemap,
+                                                  VkImagePlaneMemoryRequirementsInfo* toMap);
 
 void handlemap_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceSamplerYcbcrConversionFeatures* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceSamplerYcbcrConversionFeatures* toMap);
 
 void handlemap_VkSamplerYcbcrConversionImageFormatProperties(
-    VulkanHandleMapping* handlemap,
-    VkSamplerYcbcrConversionImageFormatProperties* toMap);
+    VulkanHandleMapping* handlemap, VkSamplerYcbcrConversionImageFormatProperties* toMap);
 
-void handlemap_VkDescriptorUpdateTemplateEntry(
-    VulkanHandleMapping* handlemap,
-    VkDescriptorUpdateTemplateEntry* toMap);
+void handlemap_VkDescriptorUpdateTemplateEntry(VulkanHandleMapping* handlemap,
+                                               VkDescriptorUpdateTemplateEntry* toMap);
 
-void handlemap_VkDescriptorUpdateTemplateCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkDescriptorUpdateTemplateCreateInfo* toMap);
+void handlemap_VkDescriptorUpdateTemplateCreateInfo(VulkanHandleMapping* handlemap,
+                                                    VkDescriptorUpdateTemplateCreateInfo* toMap);
 
-void handlemap_VkExternalMemoryProperties(
-    VulkanHandleMapping* handlemap,
-    VkExternalMemoryProperties* toMap);
+void handlemap_VkExternalMemoryProperties(VulkanHandleMapping* handlemap,
+                                          VkExternalMemoryProperties* toMap);
 
 void handlemap_VkPhysicalDeviceExternalImageFormatInfo(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceExternalImageFormatInfo* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceExternalImageFormatInfo* toMap);
 
-void handlemap_VkExternalImageFormatProperties(
-    VulkanHandleMapping* handlemap,
-    VkExternalImageFormatProperties* toMap);
+void handlemap_VkExternalImageFormatProperties(VulkanHandleMapping* handlemap,
+                                               VkExternalImageFormatProperties* toMap);
 
-void handlemap_VkPhysicalDeviceExternalBufferInfo(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceExternalBufferInfo* toMap);
+void handlemap_VkPhysicalDeviceExternalBufferInfo(VulkanHandleMapping* handlemap,
+                                                  VkPhysicalDeviceExternalBufferInfo* toMap);
 
-void handlemap_VkExternalBufferProperties(
-    VulkanHandleMapping* handlemap,
-    VkExternalBufferProperties* toMap);
+void handlemap_VkExternalBufferProperties(VulkanHandleMapping* handlemap,
+                                          VkExternalBufferProperties* toMap);
 
-void handlemap_VkPhysicalDeviceIDProperties(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceIDProperties* toMap);
+void handlemap_VkPhysicalDeviceIDProperties(VulkanHandleMapping* handlemap,
+                                            VkPhysicalDeviceIDProperties* toMap);
 
-void handlemap_VkExternalMemoryImageCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkExternalMemoryImageCreateInfo* toMap);
+void handlemap_VkExternalMemoryImageCreateInfo(VulkanHandleMapping* handlemap,
+                                               VkExternalMemoryImageCreateInfo* toMap);
 
-void handlemap_VkExternalMemoryBufferCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkExternalMemoryBufferCreateInfo* toMap);
+void handlemap_VkExternalMemoryBufferCreateInfo(VulkanHandleMapping* handlemap,
+                                                VkExternalMemoryBufferCreateInfo* toMap);
 
-void handlemap_VkExportMemoryAllocateInfo(
-    VulkanHandleMapping* handlemap,
-    VkExportMemoryAllocateInfo* toMap);
+void handlemap_VkExportMemoryAllocateInfo(VulkanHandleMapping* handlemap,
+                                          VkExportMemoryAllocateInfo* toMap);
 
-void handlemap_VkPhysicalDeviceExternalFenceInfo(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceExternalFenceInfo* toMap);
+void handlemap_VkPhysicalDeviceExternalFenceInfo(VulkanHandleMapping* handlemap,
+                                                 VkPhysicalDeviceExternalFenceInfo* toMap);
 
-void handlemap_VkExternalFenceProperties(
-    VulkanHandleMapping* handlemap,
-    VkExternalFenceProperties* toMap);
+void handlemap_VkExternalFenceProperties(VulkanHandleMapping* handlemap,
+                                         VkExternalFenceProperties* toMap);
 
-void handlemap_VkExportFenceCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkExportFenceCreateInfo* toMap);
+void handlemap_VkExportFenceCreateInfo(VulkanHandleMapping* handlemap,
+                                       VkExportFenceCreateInfo* toMap);
 
-void handlemap_VkExportSemaphoreCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkExportSemaphoreCreateInfo* toMap);
+void handlemap_VkExportSemaphoreCreateInfo(VulkanHandleMapping* handlemap,
+                                           VkExportSemaphoreCreateInfo* toMap);
 
-void handlemap_VkPhysicalDeviceExternalSemaphoreInfo(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceExternalSemaphoreInfo* toMap);
+void handlemap_VkPhysicalDeviceExternalSemaphoreInfo(VulkanHandleMapping* handlemap,
+                                                     VkPhysicalDeviceExternalSemaphoreInfo* toMap);
 
-void handlemap_VkExternalSemaphoreProperties(
-    VulkanHandleMapping* handlemap,
-    VkExternalSemaphoreProperties* toMap);
+void handlemap_VkExternalSemaphoreProperties(VulkanHandleMapping* handlemap,
+                                             VkExternalSemaphoreProperties* toMap);
 
 void handlemap_VkPhysicalDeviceMaintenance3Properties(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceMaintenance3Properties* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceMaintenance3Properties* toMap);
 
-void handlemap_VkDescriptorSetLayoutSupport(
-    VulkanHandleMapping* handlemap,
-    VkDescriptorSetLayoutSupport* toMap);
+void handlemap_VkDescriptorSetLayoutSupport(VulkanHandleMapping* handlemap,
+                                            VkDescriptorSetLayoutSupport* toMap);
 
 void handlemap_VkPhysicalDeviceShaderDrawParametersFeatures(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShaderDrawParametersFeatures* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShaderDrawParametersFeatures* toMap);
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceShaderDrawParametersFeatures, handlemap_VkPhysicalDeviceShaderDrawParameterFeatures)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceShaderDrawParametersFeatures,
+                      handlemap_VkPhysicalDeviceShaderDrawParameterFeatures)
 
 #endif
 #ifdef VK_VERSION_1_2
-void handlemap_VkPhysicalDeviceVulkan11Features(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceVulkan11Features* toMap);
+void handlemap_VkPhysicalDeviceVulkan11Features(VulkanHandleMapping* handlemap,
+                                                VkPhysicalDeviceVulkan11Features* toMap);
 
-void handlemap_VkPhysicalDeviceVulkan11Properties(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceVulkan11Properties* toMap);
+void handlemap_VkPhysicalDeviceVulkan11Properties(VulkanHandleMapping* handlemap,
+                                                  VkPhysicalDeviceVulkan11Properties* toMap);
 
-void handlemap_VkPhysicalDeviceVulkan12Features(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceVulkan12Features* toMap);
+void handlemap_VkPhysicalDeviceVulkan12Features(VulkanHandleMapping* handlemap,
+                                                VkPhysicalDeviceVulkan12Features* toMap);
 
-void handlemap_VkConformanceVersion(
-    VulkanHandleMapping* handlemap,
-    VkConformanceVersion* toMap);
+void handlemap_VkConformanceVersion(VulkanHandleMapping* handlemap, VkConformanceVersion* toMap);
 
-void handlemap_VkPhysicalDeviceVulkan12Properties(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceVulkan12Properties* toMap);
+void handlemap_VkPhysicalDeviceVulkan12Properties(VulkanHandleMapping* handlemap,
+                                                  VkPhysicalDeviceVulkan12Properties* toMap);
 
-void handlemap_VkImageFormatListCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkImageFormatListCreateInfo* toMap);
+void handlemap_VkImageFormatListCreateInfo(VulkanHandleMapping* handlemap,
+                                           VkImageFormatListCreateInfo* toMap);
 
-void handlemap_VkAttachmentDescription2(
-    VulkanHandleMapping* handlemap,
-    VkAttachmentDescription2* toMap);
+void handlemap_VkAttachmentDescription2(VulkanHandleMapping* handlemap,
+                                        VkAttachmentDescription2* toMap);
 
-void handlemap_VkAttachmentReference2(
-    VulkanHandleMapping* handlemap,
-    VkAttachmentReference2* toMap);
+void handlemap_VkAttachmentReference2(VulkanHandleMapping* handlemap,
+                                      VkAttachmentReference2* toMap);
 
-void handlemap_VkSubpassDescription2(
-    VulkanHandleMapping* handlemap,
-    VkSubpassDescription2* toMap);
+void handlemap_VkSubpassDescription2(VulkanHandleMapping* handlemap, VkSubpassDescription2* toMap);
 
-void handlemap_VkSubpassDependency2(
-    VulkanHandleMapping* handlemap,
-    VkSubpassDependency2* toMap);
+void handlemap_VkSubpassDependency2(VulkanHandleMapping* handlemap, VkSubpassDependency2* toMap);
 
-void handlemap_VkRenderPassCreateInfo2(
-    VulkanHandleMapping* handlemap,
-    VkRenderPassCreateInfo2* toMap);
+void handlemap_VkRenderPassCreateInfo2(VulkanHandleMapping* handlemap,
+                                       VkRenderPassCreateInfo2* toMap);
 
-void handlemap_VkSubpassBeginInfo(
-    VulkanHandleMapping* handlemap,
-    VkSubpassBeginInfo* toMap);
+void handlemap_VkSubpassBeginInfo(VulkanHandleMapping* handlemap, VkSubpassBeginInfo* toMap);
 
-void handlemap_VkSubpassEndInfo(
-    VulkanHandleMapping* handlemap,
-    VkSubpassEndInfo* toMap);
+void handlemap_VkSubpassEndInfo(VulkanHandleMapping* handlemap, VkSubpassEndInfo* toMap);
 
-void handlemap_VkPhysicalDevice8BitStorageFeatures(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDevice8BitStorageFeatures* toMap);
+void handlemap_VkPhysicalDevice8BitStorageFeatures(VulkanHandleMapping* handlemap,
+                                                   VkPhysicalDevice8BitStorageFeatures* toMap);
 
-void handlemap_VkPhysicalDeviceDriverProperties(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceDriverProperties* toMap);
+void handlemap_VkPhysicalDeviceDriverProperties(VulkanHandleMapping* handlemap,
+                                                VkPhysicalDeviceDriverProperties* toMap);
 
 void handlemap_VkPhysicalDeviceShaderAtomicInt64Features(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShaderAtomicInt64Features* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShaderAtomicInt64Features* toMap);
 
 void handlemap_VkPhysicalDeviceShaderFloat16Int8Features(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShaderFloat16Int8Features* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShaderFloat16Int8Features* toMap);
 
 void handlemap_VkPhysicalDeviceFloatControlsProperties(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceFloatControlsProperties* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceFloatControlsProperties* toMap);
 
 void handlemap_VkDescriptorSetLayoutBindingFlagsCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkDescriptorSetLayoutBindingFlagsCreateInfo* toMap);
+    VulkanHandleMapping* handlemap, VkDescriptorSetLayoutBindingFlagsCreateInfo* toMap);
 
 void handlemap_VkPhysicalDeviceDescriptorIndexingFeatures(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceDescriptorIndexingFeatures* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceDescriptorIndexingFeatures* toMap);
 
 void handlemap_VkPhysicalDeviceDescriptorIndexingProperties(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceDescriptorIndexingProperties* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceDescriptorIndexingProperties* toMap);
 
 void handlemap_VkDescriptorSetVariableDescriptorCountAllocateInfo(
-    VulkanHandleMapping* handlemap,
-    VkDescriptorSetVariableDescriptorCountAllocateInfo* toMap);
+    VulkanHandleMapping* handlemap, VkDescriptorSetVariableDescriptorCountAllocateInfo* toMap);
 
 void handlemap_VkDescriptorSetVariableDescriptorCountLayoutSupport(
-    VulkanHandleMapping* handlemap,
-    VkDescriptorSetVariableDescriptorCountLayoutSupport* toMap);
+    VulkanHandleMapping* handlemap, VkDescriptorSetVariableDescriptorCountLayoutSupport* toMap);
 
 void handlemap_VkSubpassDescriptionDepthStencilResolve(
-    VulkanHandleMapping* handlemap,
-    VkSubpassDescriptionDepthStencilResolve* toMap);
+    VulkanHandleMapping* handlemap, VkSubpassDescriptionDepthStencilResolve* toMap);
 
 void handlemap_VkPhysicalDeviceDepthStencilResolveProperties(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceDepthStencilResolveProperties* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceDepthStencilResolveProperties* toMap);
 
 void handlemap_VkPhysicalDeviceScalarBlockLayoutFeatures(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceScalarBlockLayoutFeatures* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceScalarBlockLayoutFeatures* toMap);
 
-void handlemap_VkImageStencilUsageCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkImageStencilUsageCreateInfo* toMap);
+void handlemap_VkImageStencilUsageCreateInfo(VulkanHandleMapping* handlemap,
+                                             VkImageStencilUsageCreateInfo* toMap);
 
-void handlemap_VkSamplerReductionModeCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkSamplerReductionModeCreateInfo* toMap);
+void handlemap_VkSamplerReductionModeCreateInfo(VulkanHandleMapping* handlemap,
+                                                VkSamplerReductionModeCreateInfo* toMap);
 
 void handlemap_VkPhysicalDeviceSamplerFilterMinmaxProperties(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceSamplerFilterMinmaxProperties* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceSamplerFilterMinmaxProperties* toMap);
 
 void handlemap_VkPhysicalDeviceVulkanMemoryModelFeatures(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceVulkanMemoryModelFeatures* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceVulkanMemoryModelFeatures* toMap);
 
 void handlemap_VkPhysicalDeviceImagelessFramebufferFeatures(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceImagelessFramebufferFeatures* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceImagelessFramebufferFeatures* toMap);
 
-void handlemap_VkFramebufferAttachmentImageInfo(
-    VulkanHandleMapping* handlemap,
-    VkFramebufferAttachmentImageInfo* toMap);
+void handlemap_VkFramebufferAttachmentImageInfo(VulkanHandleMapping* handlemap,
+                                                VkFramebufferAttachmentImageInfo* toMap);
 
-void handlemap_VkFramebufferAttachmentsCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkFramebufferAttachmentsCreateInfo* toMap);
+void handlemap_VkFramebufferAttachmentsCreateInfo(VulkanHandleMapping* handlemap,
+                                                  VkFramebufferAttachmentsCreateInfo* toMap);
 
-void handlemap_VkRenderPassAttachmentBeginInfo(
-    VulkanHandleMapping* handlemap,
-    VkRenderPassAttachmentBeginInfo* toMap);
+void handlemap_VkRenderPassAttachmentBeginInfo(VulkanHandleMapping* handlemap,
+                                               VkRenderPassAttachmentBeginInfo* toMap);
 
 void handlemap_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceUniformBufferStandardLayoutFeatures* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceUniformBufferStandardLayoutFeatures* toMap);
 
 void handlemap_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* toMap);
 
 void handlemap_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* toMap);
 
-void handlemap_VkAttachmentReferenceStencilLayout(
-    VulkanHandleMapping* handlemap,
-    VkAttachmentReferenceStencilLayout* toMap);
+void handlemap_VkAttachmentReferenceStencilLayout(VulkanHandleMapping* handlemap,
+                                                  VkAttachmentReferenceStencilLayout* toMap);
 
-void handlemap_VkAttachmentDescriptionStencilLayout(
-    VulkanHandleMapping* handlemap,
-    VkAttachmentDescriptionStencilLayout* toMap);
+void handlemap_VkAttachmentDescriptionStencilLayout(VulkanHandleMapping* handlemap,
+                                                    VkAttachmentDescriptionStencilLayout* toMap);
 
 void handlemap_VkPhysicalDeviceHostQueryResetFeatures(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceHostQueryResetFeatures* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceHostQueryResetFeatures* toMap);
 
 void handlemap_VkPhysicalDeviceTimelineSemaphoreFeatures(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceTimelineSemaphoreFeatures* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceTimelineSemaphoreFeatures* toMap);
 
 void handlemap_VkPhysicalDeviceTimelineSemaphoreProperties(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceTimelineSemaphoreProperties* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceTimelineSemaphoreProperties* toMap);
 
-void handlemap_VkSemaphoreTypeCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkSemaphoreTypeCreateInfo* toMap);
+void handlemap_VkSemaphoreTypeCreateInfo(VulkanHandleMapping* handlemap,
+                                         VkSemaphoreTypeCreateInfo* toMap);
 
-void handlemap_VkTimelineSemaphoreSubmitInfo(
-    VulkanHandleMapping* handlemap,
-    VkTimelineSemaphoreSubmitInfo* toMap);
+void handlemap_VkTimelineSemaphoreSubmitInfo(VulkanHandleMapping* handlemap,
+                                             VkTimelineSemaphoreSubmitInfo* toMap);
 
-void handlemap_VkSemaphoreWaitInfo(
-    VulkanHandleMapping* handlemap,
-    VkSemaphoreWaitInfo* toMap);
+void handlemap_VkSemaphoreWaitInfo(VulkanHandleMapping* handlemap, VkSemaphoreWaitInfo* toMap);
 
-void handlemap_VkSemaphoreSignalInfo(
-    VulkanHandleMapping* handlemap,
-    VkSemaphoreSignalInfo* toMap);
+void handlemap_VkSemaphoreSignalInfo(VulkanHandleMapping* handlemap, VkSemaphoreSignalInfo* toMap);
 
 void handlemap_VkPhysicalDeviceBufferDeviceAddressFeatures(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceBufferDeviceAddressFeatures* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceBufferDeviceAddressFeatures* toMap);
 
-void handlemap_VkBufferDeviceAddressInfo(
-    VulkanHandleMapping* handlemap,
-    VkBufferDeviceAddressInfo* toMap);
+void handlemap_VkBufferDeviceAddressInfo(VulkanHandleMapping* handlemap,
+                                         VkBufferDeviceAddressInfo* toMap);
 
 void handlemap_VkBufferOpaqueCaptureAddressCreateInfo(
-    VulkanHandleMapping* handlemap,
-    VkBufferOpaqueCaptureAddressCreateInfo* toMap);
+    VulkanHandleMapping* handlemap, VkBufferOpaqueCaptureAddressCreateInfo* toMap);
 
 void handlemap_VkMemoryOpaqueCaptureAddressAllocateInfo(
-    VulkanHandleMapping* handlemap,
-    VkMemoryOpaqueCaptureAddressAllocateInfo* toMap);
+    VulkanHandleMapping* handlemap, VkMemoryOpaqueCaptureAddressAllocateInfo* toMap);
 
 void handlemap_VkDeviceMemoryOpaqueCaptureAddressInfo(
-    VulkanHandleMapping* handlemap,
-    VkDeviceMemoryOpaqueCaptureAddressInfo* toMap);
+    VulkanHandleMapping* handlemap, VkDeviceMemoryOpaqueCaptureAddressInfo* toMap);
 
 #endif
 #ifdef VK_KHR_surface
-void handlemap_VkSurfaceCapabilitiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkSurfaceCapabilitiesKHR* toMap);
+void handlemap_VkSurfaceCapabilitiesKHR(VulkanHandleMapping* handlemap,
+                                        VkSurfaceCapabilitiesKHR* toMap);
 
-void handlemap_VkSurfaceFormatKHR(
-    VulkanHandleMapping* handlemap,
-    VkSurfaceFormatKHR* toMap);
+void handlemap_VkSurfaceFormatKHR(VulkanHandleMapping* handlemap, VkSurfaceFormatKHR* toMap);
 
 #endif
 #ifdef VK_KHR_swapchain
-void handlemap_VkSwapchainCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkSwapchainCreateInfoKHR* toMap);
+void handlemap_VkSwapchainCreateInfoKHR(VulkanHandleMapping* handlemap,
+                                        VkSwapchainCreateInfoKHR* toMap);
 
-void handlemap_VkPresentInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkPresentInfoKHR* toMap);
+void handlemap_VkPresentInfoKHR(VulkanHandleMapping* handlemap, VkPresentInfoKHR* toMap);
 
-void handlemap_VkImageSwapchainCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkImageSwapchainCreateInfoKHR* toMap);
+void handlemap_VkImageSwapchainCreateInfoKHR(VulkanHandleMapping* handlemap,
+                                             VkImageSwapchainCreateInfoKHR* toMap);
 
-void handlemap_VkBindImageMemorySwapchainInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkBindImageMemorySwapchainInfoKHR* toMap);
+void handlemap_VkBindImageMemorySwapchainInfoKHR(VulkanHandleMapping* handlemap,
+                                                 VkBindImageMemorySwapchainInfoKHR* toMap);
 
-void handlemap_VkAcquireNextImageInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkAcquireNextImageInfoKHR* toMap);
+void handlemap_VkAcquireNextImageInfoKHR(VulkanHandleMapping* handlemap,
+                                         VkAcquireNextImageInfoKHR* toMap);
 
-void handlemap_VkDeviceGroupPresentCapabilitiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkDeviceGroupPresentCapabilitiesKHR* toMap);
+void handlemap_VkDeviceGroupPresentCapabilitiesKHR(VulkanHandleMapping* handlemap,
+                                                   VkDeviceGroupPresentCapabilitiesKHR* toMap);
 
-void handlemap_VkDeviceGroupPresentInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkDeviceGroupPresentInfoKHR* toMap);
+void handlemap_VkDeviceGroupPresentInfoKHR(VulkanHandleMapping* handlemap,
+                                           VkDeviceGroupPresentInfoKHR* toMap);
 
-void handlemap_VkDeviceGroupSwapchainCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkDeviceGroupSwapchainCreateInfoKHR* toMap);
+void handlemap_VkDeviceGroupSwapchainCreateInfoKHR(VulkanHandleMapping* handlemap,
+                                                   VkDeviceGroupSwapchainCreateInfoKHR* toMap);
 
 #endif
 #ifdef VK_KHR_display
-void handlemap_VkDisplayModeParametersKHR(
-    VulkanHandleMapping* handlemap,
-    VkDisplayModeParametersKHR* toMap);
+void handlemap_VkDisplayModeParametersKHR(VulkanHandleMapping* handlemap,
+                                          VkDisplayModeParametersKHR* toMap);
 
-void handlemap_VkDisplayModeCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkDisplayModeCreateInfoKHR* toMap);
+void handlemap_VkDisplayModeCreateInfoKHR(VulkanHandleMapping* handlemap,
+                                          VkDisplayModeCreateInfoKHR* toMap);
 
-void handlemap_VkDisplayModePropertiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkDisplayModePropertiesKHR* toMap);
+void handlemap_VkDisplayModePropertiesKHR(VulkanHandleMapping* handlemap,
+                                          VkDisplayModePropertiesKHR* toMap);
 
-void handlemap_VkDisplayPlaneCapabilitiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkDisplayPlaneCapabilitiesKHR* toMap);
+void handlemap_VkDisplayPlaneCapabilitiesKHR(VulkanHandleMapping* handlemap,
+                                             VkDisplayPlaneCapabilitiesKHR* toMap);
 
-void handlemap_VkDisplayPlanePropertiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkDisplayPlanePropertiesKHR* toMap);
+void handlemap_VkDisplayPlanePropertiesKHR(VulkanHandleMapping* handlemap,
+                                           VkDisplayPlanePropertiesKHR* toMap);
 
-void handlemap_VkDisplayPropertiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkDisplayPropertiesKHR* toMap);
+void handlemap_VkDisplayPropertiesKHR(VulkanHandleMapping* handlemap,
+                                      VkDisplayPropertiesKHR* toMap);
 
-void handlemap_VkDisplaySurfaceCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkDisplaySurfaceCreateInfoKHR* toMap);
+void handlemap_VkDisplaySurfaceCreateInfoKHR(VulkanHandleMapping* handlemap,
+                                             VkDisplaySurfaceCreateInfoKHR* toMap);
 
 #endif
 #ifdef VK_KHR_display_swapchain
-void handlemap_VkDisplayPresentInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkDisplayPresentInfoKHR* toMap);
+void handlemap_VkDisplayPresentInfoKHR(VulkanHandleMapping* handlemap,
+                                       VkDisplayPresentInfoKHR* toMap);
 
 #endif
 #ifdef VK_KHR_xlib_surface
-void handlemap_VkXlibSurfaceCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkXlibSurfaceCreateInfoKHR* toMap);
+void handlemap_VkXlibSurfaceCreateInfoKHR(VulkanHandleMapping* handlemap,
+                                          VkXlibSurfaceCreateInfoKHR* toMap);
 
 #endif
 #ifdef VK_KHR_xcb_surface
-void handlemap_VkXcbSurfaceCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkXcbSurfaceCreateInfoKHR* toMap);
+void handlemap_VkXcbSurfaceCreateInfoKHR(VulkanHandleMapping* handlemap,
+                                         VkXcbSurfaceCreateInfoKHR* toMap);
 
 #endif
 #ifdef VK_KHR_wayland_surface
-void handlemap_VkWaylandSurfaceCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkWaylandSurfaceCreateInfoKHR* toMap);
+void handlemap_VkWaylandSurfaceCreateInfoKHR(VulkanHandleMapping* handlemap,
+                                             VkWaylandSurfaceCreateInfoKHR* toMap);
 
 #endif
 #ifdef VK_KHR_android_surface
-void handlemap_VkAndroidSurfaceCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkAndroidSurfaceCreateInfoKHR* toMap);
+void handlemap_VkAndroidSurfaceCreateInfoKHR(VulkanHandleMapping* handlemap,
+                                             VkAndroidSurfaceCreateInfoKHR* toMap);
 
 #endif
 #ifdef VK_KHR_win32_surface
-void handlemap_VkWin32SurfaceCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkWin32SurfaceCreateInfoKHR* toMap);
+void handlemap_VkWin32SurfaceCreateInfoKHR(VulkanHandleMapping* handlemap,
+                                           VkWin32SurfaceCreateInfoKHR* toMap);
 
 #endif
 #ifdef VK_KHR_sampler_mirror_clamp_to_edge
 #endif
 #ifdef VK_KHR_video_queue
-void handlemap_VkVideoQueueFamilyProperties2KHR(
-    VulkanHandleMapping* handlemap,
-    VkVideoQueueFamilyProperties2KHR* toMap);
+void handlemap_VkVideoQueueFamilyProperties2KHR(VulkanHandleMapping* handlemap,
+                                                VkVideoQueueFamilyProperties2KHR* toMap);
 
-void handlemap_VkVideoProfileKHR(
-    VulkanHandleMapping* handlemap,
-    VkVideoProfileKHR* toMap);
+void handlemap_VkVideoProfileKHR(VulkanHandleMapping* handlemap, VkVideoProfileKHR* toMap);
 
-void handlemap_VkVideoProfilesKHR(
-    VulkanHandleMapping* handlemap,
-    VkVideoProfilesKHR* toMap);
+void handlemap_VkVideoProfilesKHR(VulkanHandleMapping* handlemap, VkVideoProfilesKHR* toMap);
 
-void handlemap_VkVideoCapabilitiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkVideoCapabilitiesKHR* toMap);
+void handlemap_VkVideoCapabilitiesKHR(VulkanHandleMapping* handlemap,
+                                      VkVideoCapabilitiesKHR* toMap);
 
-void handlemap_VkPhysicalDeviceVideoFormatInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceVideoFormatInfoKHR* toMap);
+void handlemap_VkPhysicalDeviceVideoFormatInfoKHR(VulkanHandleMapping* handlemap,
+                                                  VkPhysicalDeviceVideoFormatInfoKHR* toMap);
 
-void handlemap_VkVideoFormatPropertiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkVideoFormatPropertiesKHR* toMap);
+void handlemap_VkVideoFormatPropertiesKHR(VulkanHandleMapping* handlemap,
+                                          VkVideoFormatPropertiesKHR* toMap);
 
-void handlemap_VkVideoPictureResourceKHR(
-    VulkanHandleMapping* handlemap,
-    VkVideoPictureResourceKHR* toMap);
+void handlemap_VkVideoPictureResourceKHR(VulkanHandleMapping* handlemap,
+                                         VkVideoPictureResourceKHR* toMap);
 
-void handlemap_VkVideoReferenceSlotKHR(
-    VulkanHandleMapping* handlemap,
-    VkVideoReferenceSlotKHR* toMap);
+void handlemap_VkVideoReferenceSlotKHR(VulkanHandleMapping* handlemap,
+                                       VkVideoReferenceSlotKHR* toMap);
 
-void handlemap_VkVideoGetMemoryPropertiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkVideoGetMemoryPropertiesKHR* toMap);
+void handlemap_VkVideoGetMemoryPropertiesKHR(VulkanHandleMapping* handlemap,
+                                             VkVideoGetMemoryPropertiesKHR* toMap);
 
-void handlemap_VkVideoBindMemoryKHR(
-    VulkanHandleMapping* handlemap,
-    VkVideoBindMemoryKHR* toMap);
+void handlemap_VkVideoBindMemoryKHR(VulkanHandleMapping* handlemap, VkVideoBindMemoryKHR* toMap);
 
-void handlemap_VkVideoSessionCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkVideoSessionCreateInfoKHR* toMap);
+void handlemap_VkVideoSessionCreateInfoKHR(VulkanHandleMapping* handlemap,
+                                           VkVideoSessionCreateInfoKHR* toMap);
 
-void handlemap_VkVideoSessionParametersCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkVideoSessionParametersCreateInfoKHR* toMap);
+void handlemap_VkVideoSessionParametersCreateInfoKHR(VulkanHandleMapping* handlemap,
+                                                     VkVideoSessionParametersCreateInfoKHR* toMap);
 
-void handlemap_VkVideoSessionParametersUpdateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkVideoSessionParametersUpdateInfoKHR* toMap);
+void handlemap_VkVideoSessionParametersUpdateInfoKHR(VulkanHandleMapping* handlemap,
+                                                     VkVideoSessionParametersUpdateInfoKHR* toMap);
 
-void handlemap_VkVideoBeginCodingInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkVideoBeginCodingInfoKHR* toMap);
+void handlemap_VkVideoBeginCodingInfoKHR(VulkanHandleMapping* handlemap,
+                                         VkVideoBeginCodingInfoKHR* toMap);
 
-void handlemap_VkVideoEndCodingInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkVideoEndCodingInfoKHR* toMap);
+void handlemap_VkVideoEndCodingInfoKHR(VulkanHandleMapping* handlemap,
+                                       VkVideoEndCodingInfoKHR* toMap);
 
-void handlemap_VkVideoCodingControlInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkVideoCodingControlInfoKHR* toMap);
+void handlemap_VkVideoCodingControlInfoKHR(VulkanHandleMapping* handlemap,
+                                           VkVideoCodingControlInfoKHR* toMap);
 
 #endif
 #ifdef VK_KHR_video_decode_queue
-void handlemap_VkVideoDecodeInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkVideoDecodeInfoKHR* toMap);
+void handlemap_VkVideoDecodeInfoKHR(VulkanHandleMapping* handlemap, VkVideoDecodeInfoKHR* toMap);
 
 #endif
 #ifdef VK_KHR_dynamic_rendering
-void handlemap_VkRenderingAttachmentInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkRenderingAttachmentInfoKHR* toMap);
+void handlemap_VkRenderingAttachmentInfoKHR(VulkanHandleMapping* handlemap,
+                                            VkRenderingAttachmentInfoKHR* toMap);
 
-void handlemap_VkRenderingInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkRenderingInfoKHR* toMap);
+void handlemap_VkRenderingInfoKHR(VulkanHandleMapping* handlemap, VkRenderingInfoKHR* toMap);
 
-void handlemap_VkPipelineRenderingCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkPipelineRenderingCreateInfoKHR* toMap);
+void handlemap_VkPipelineRenderingCreateInfoKHR(VulkanHandleMapping* handlemap,
+                                                VkPipelineRenderingCreateInfoKHR* toMap);
 
 void handlemap_VkPhysicalDeviceDynamicRenderingFeaturesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceDynamicRenderingFeaturesKHR* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceDynamicRenderingFeaturesKHR* toMap);
 
 void handlemap_VkCommandBufferInheritanceRenderingInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkCommandBufferInheritanceRenderingInfoKHR* toMap);
+    VulkanHandleMapping* handlemap, VkCommandBufferInheritanceRenderingInfoKHR* toMap);
 
 void handlemap_VkRenderingFragmentShadingRateAttachmentInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkRenderingFragmentShadingRateAttachmentInfoKHR* toMap);
+    VulkanHandleMapping* handlemap, VkRenderingFragmentShadingRateAttachmentInfoKHR* toMap);
 
 void handlemap_VkRenderingFragmentDensityMapAttachmentInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkRenderingFragmentDensityMapAttachmentInfoEXT* toMap);
+    VulkanHandleMapping* handlemap, VkRenderingFragmentDensityMapAttachmentInfoEXT* toMap);
 
-void handlemap_VkAttachmentSampleCountInfoAMD(
-    VulkanHandleMapping* handlemap,
-    VkAttachmentSampleCountInfoAMD* toMap);
+void handlemap_VkAttachmentSampleCountInfoAMD(VulkanHandleMapping* handlemap,
+                                              VkAttachmentSampleCountInfoAMD* toMap);
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkAttachmentSampleCountInfoAMD, handlemap_VkAttachmentSampleCountInfoNV)
+DEFINE_ALIAS_FUNCTION(handlemap_VkAttachmentSampleCountInfoAMD,
+                      handlemap_VkAttachmentSampleCountInfoNV)
 
-void handlemap_VkMultiviewPerViewAttributesInfoNVX(
-    VulkanHandleMapping* handlemap,
-    VkMultiviewPerViewAttributesInfoNVX* toMap);
+void handlemap_VkMultiviewPerViewAttributesInfoNVX(VulkanHandleMapping* handlemap,
+                                                   VkMultiviewPerViewAttributesInfoNVX* toMap);
 
 #endif
 #ifdef VK_KHR_multiview
-DEFINE_ALIAS_FUNCTION(handlemap_VkRenderPassMultiviewCreateInfo, handlemap_VkRenderPassMultiviewCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkRenderPassMultiviewCreateInfo,
+                      handlemap_VkRenderPassMultiviewCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceMultiviewFeatures, handlemap_VkPhysicalDeviceMultiviewFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceMultiviewFeatures,
+                      handlemap_VkPhysicalDeviceMultiviewFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceMultiviewProperties, handlemap_VkPhysicalDeviceMultiviewPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceMultiviewProperties,
+                      handlemap_VkPhysicalDeviceMultiviewPropertiesKHR)
 
 #endif
 #ifdef VK_KHR_get_physical_device_properties2
 DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceFeatures2, handlemap_VkPhysicalDeviceFeatures2KHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceProperties2, handlemap_VkPhysicalDeviceProperties2KHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceProperties2,
+                      handlemap_VkPhysicalDeviceProperties2KHR)
 
 DEFINE_ALIAS_FUNCTION(handlemap_VkFormatProperties2, handlemap_VkFormatProperties2KHR)
 
 DEFINE_ALIAS_FUNCTION(handlemap_VkImageFormatProperties2, handlemap_VkImageFormatProperties2KHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceImageFormatInfo2, handlemap_VkPhysicalDeviceImageFormatInfo2KHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceImageFormatInfo2,
+                      handlemap_VkPhysicalDeviceImageFormatInfo2KHR)
 
 DEFINE_ALIAS_FUNCTION(handlemap_VkQueueFamilyProperties2, handlemap_VkQueueFamilyProperties2KHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceMemoryProperties2, handlemap_VkPhysicalDeviceMemoryProperties2KHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceMemoryProperties2,
+                      handlemap_VkPhysicalDeviceMemoryProperties2KHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkSparseImageFormatProperties2, handlemap_VkSparseImageFormatProperties2KHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkSparseImageFormatProperties2,
+                      handlemap_VkSparseImageFormatProperties2KHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceSparseImageFormatInfo2, handlemap_VkPhysicalDeviceSparseImageFormatInfo2KHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceSparseImageFormatInfo2,
+                      handlemap_VkPhysicalDeviceSparseImageFormatInfo2KHR)
 
 #endif
 #ifdef VK_KHR_device_group
 DEFINE_ALIAS_FUNCTION(handlemap_VkMemoryAllocateFlagsInfo, handlemap_VkMemoryAllocateFlagsInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkDeviceGroupRenderPassBeginInfo, handlemap_VkDeviceGroupRenderPassBeginInfoKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkDeviceGroupRenderPassBeginInfo,
+                      handlemap_VkDeviceGroupRenderPassBeginInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkDeviceGroupCommandBufferBeginInfo, handlemap_VkDeviceGroupCommandBufferBeginInfoKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkDeviceGroupCommandBufferBeginInfo,
+                      handlemap_VkDeviceGroupCommandBufferBeginInfoKHR)
 
 DEFINE_ALIAS_FUNCTION(handlemap_VkDeviceGroupSubmitInfo, handlemap_VkDeviceGroupSubmitInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkDeviceGroupBindSparseInfo, handlemap_VkDeviceGroupBindSparseInfoKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkDeviceGroupBindSparseInfo,
+                      handlemap_VkDeviceGroupBindSparseInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkBindBufferMemoryDeviceGroupInfo, handlemap_VkBindBufferMemoryDeviceGroupInfoKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkBindBufferMemoryDeviceGroupInfo,
+                      handlemap_VkBindBufferMemoryDeviceGroupInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkBindImageMemoryDeviceGroupInfo, handlemap_VkBindImageMemoryDeviceGroupInfoKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkBindImageMemoryDeviceGroupInfo,
+                      handlemap_VkBindImageMemoryDeviceGroupInfoKHR)
 
 #endif
 #ifdef VK_KHR_shader_draw_parameters
@@ -1229,153 +896,151 @@
 #ifdef VK_KHR_maintenance1
 #endif
 #ifdef VK_KHR_device_group_creation
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceGroupProperties, handlemap_VkPhysicalDeviceGroupPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceGroupProperties,
+                      handlemap_VkPhysicalDeviceGroupPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkDeviceGroupDeviceCreateInfo, handlemap_VkDeviceGroupDeviceCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkDeviceGroupDeviceCreateInfo,
+                      handlemap_VkDeviceGroupDeviceCreateInfoKHR)
 
 #endif
 #ifdef VK_KHR_external_memory_capabilities
 DEFINE_ALIAS_FUNCTION(handlemap_VkExternalMemoryProperties, handlemap_VkExternalMemoryPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceExternalImageFormatInfo, handlemap_VkPhysicalDeviceExternalImageFormatInfoKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceExternalImageFormatInfo,
+                      handlemap_VkPhysicalDeviceExternalImageFormatInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkExternalImageFormatProperties, handlemap_VkExternalImageFormatPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkExternalImageFormatProperties,
+                      handlemap_VkExternalImageFormatPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceExternalBufferInfo, handlemap_VkPhysicalDeviceExternalBufferInfoKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceExternalBufferInfo,
+                      handlemap_VkPhysicalDeviceExternalBufferInfoKHR)
 
 DEFINE_ALIAS_FUNCTION(handlemap_VkExternalBufferProperties, handlemap_VkExternalBufferPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceIDProperties, handlemap_VkPhysicalDeviceIDPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceIDProperties,
+                      handlemap_VkPhysicalDeviceIDPropertiesKHR)
 
 #endif
 #ifdef VK_KHR_external_memory
-DEFINE_ALIAS_FUNCTION(handlemap_VkExternalMemoryImageCreateInfo, handlemap_VkExternalMemoryImageCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkExternalMemoryImageCreateInfo,
+                      handlemap_VkExternalMemoryImageCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkExternalMemoryBufferCreateInfo, handlemap_VkExternalMemoryBufferCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkExternalMemoryBufferCreateInfo,
+                      handlemap_VkExternalMemoryBufferCreateInfoKHR)
 
 DEFINE_ALIAS_FUNCTION(handlemap_VkExportMemoryAllocateInfo, handlemap_VkExportMemoryAllocateInfoKHR)
 
 #endif
 #ifdef VK_KHR_external_memory_win32
-void handlemap_VkImportMemoryWin32HandleInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkImportMemoryWin32HandleInfoKHR* toMap);
+void handlemap_VkImportMemoryWin32HandleInfoKHR(VulkanHandleMapping* handlemap,
+                                                VkImportMemoryWin32HandleInfoKHR* toMap);
 
-void handlemap_VkExportMemoryWin32HandleInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkExportMemoryWin32HandleInfoKHR* toMap);
+void handlemap_VkExportMemoryWin32HandleInfoKHR(VulkanHandleMapping* handlemap,
+                                                VkExportMemoryWin32HandleInfoKHR* toMap);
 
-void handlemap_VkMemoryWin32HandlePropertiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkMemoryWin32HandlePropertiesKHR* toMap);
+void handlemap_VkMemoryWin32HandlePropertiesKHR(VulkanHandleMapping* handlemap,
+                                                VkMemoryWin32HandlePropertiesKHR* toMap);
 
-void handlemap_VkMemoryGetWin32HandleInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkMemoryGetWin32HandleInfoKHR* toMap);
+void handlemap_VkMemoryGetWin32HandleInfoKHR(VulkanHandleMapping* handlemap,
+                                             VkMemoryGetWin32HandleInfoKHR* toMap);
 
 #endif
 #ifdef VK_KHR_external_memory_fd
-void handlemap_VkImportMemoryFdInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkImportMemoryFdInfoKHR* toMap);
+void handlemap_VkImportMemoryFdInfoKHR(VulkanHandleMapping* handlemap,
+                                       VkImportMemoryFdInfoKHR* toMap);
 
-void handlemap_VkMemoryFdPropertiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkMemoryFdPropertiesKHR* toMap);
+void handlemap_VkMemoryFdPropertiesKHR(VulkanHandleMapping* handlemap,
+                                       VkMemoryFdPropertiesKHR* toMap);
 
-void handlemap_VkMemoryGetFdInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkMemoryGetFdInfoKHR* toMap);
+void handlemap_VkMemoryGetFdInfoKHR(VulkanHandleMapping* handlemap, VkMemoryGetFdInfoKHR* toMap);
 
 #endif
 #ifdef VK_KHR_win32_keyed_mutex
 void handlemap_VkWin32KeyedMutexAcquireReleaseInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkWin32KeyedMutexAcquireReleaseInfoKHR* toMap);
+    VulkanHandleMapping* handlemap, VkWin32KeyedMutexAcquireReleaseInfoKHR* toMap);
 
 #endif
 #ifdef VK_KHR_external_semaphore_capabilities
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceExternalSemaphoreInfo, handlemap_VkPhysicalDeviceExternalSemaphoreInfoKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceExternalSemaphoreInfo,
+                      handlemap_VkPhysicalDeviceExternalSemaphoreInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkExternalSemaphoreProperties, handlemap_VkExternalSemaphorePropertiesKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkExternalSemaphoreProperties,
+                      handlemap_VkExternalSemaphorePropertiesKHR)
 
 #endif
 #ifdef VK_KHR_external_semaphore
-DEFINE_ALIAS_FUNCTION(handlemap_VkExportSemaphoreCreateInfo, handlemap_VkExportSemaphoreCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkExportSemaphoreCreateInfo,
+                      handlemap_VkExportSemaphoreCreateInfoKHR)
 
 #endif
 #ifdef VK_KHR_external_semaphore_win32
-void handlemap_VkImportSemaphoreWin32HandleInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkImportSemaphoreWin32HandleInfoKHR* toMap);
+void handlemap_VkImportSemaphoreWin32HandleInfoKHR(VulkanHandleMapping* handlemap,
+                                                   VkImportSemaphoreWin32HandleInfoKHR* toMap);
 
-void handlemap_VkExportSemaphoreWin32HandleInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkExportSemaphoreWin32HandleInfoKHR* toMap);
+void handlemap_VkExportSemaphoreWin32HandleInfoKHR(VulkanHandleMapping* handlemap,
+                                                   VkExportSemaphoreWin32HandleInfoKHR* toMap);
 
-void handlemap_VkD3D12FenceSubmitInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkD3D12FenceSubmitInfoKHR* toMap);
+void handlemap_VkD3D12FenceSubmitInfoKHR(VulkanHandleMapping* handlemap,
+                                         VkD3D12FenceSubmitInfoKHR* toMap);
 
-void handlemap_VkSemaphoreGetWin32HandleInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkSemaphoreGetWin32HandleInfoKHR* toMap);
+void handlemap_VkSemaphoreGetWin32HandleInfoKHR(VulkanHandleMapping* handlemap,
+                                                VkSemaphoreGetWin32HandleInfoKHR* toMap);
 
 #endif
 #ifdef VK_KHR_external_semaphore_fd
-void handlemap_VkImportSemaphoreFdInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkImportSemaphoreFdInfoKHR* toMap);
+void handlemap_VkImportSemaphoreFdInfoKHR(VulkanHandleMapping* handlemap,
+                                          VkImportSemaphoreFdInfoKHR* toMap);
 
-void handlemap_VkSemaphoreGetFdInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkSemaphoreGetFdInfoKHR* toMap);
+void handlemap_VkSemaphoreGetFdInfoKHR(VulkanHandleMapping* handlemap,
+                                       VkSemaphoreGetFdInfoKHR* toMap);
 
 #endif
 #ifdef VK_KHR_push_descriptor
 void handlemap_VkPhysicalDevicePushDescriptorPropertiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDevicePushDescriptorPropertiesKHR* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDevicePushDescriptorPropertiesKHR* toMap);
 
 #endif
 #ifdef VK_KHR_shader_float16_int8
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceShaderFloat16Int8Features, handlemap_VkPhysicalDeviceShaderFloat16Int8FeaturesKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceShaderFloat16Int8Features,
+                      handlemap_VkPhysicalDeviceShaderFloat16Int8FeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceShaderFloat16Int8Features, handlemap_VkPhysicalDeviceFloat16Int8FeaturesKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceShaderFloat16Int8Features,
+                      handlemap_VkPhysicalDeviceFloat16Int8FeaturesKHR)
 
 #endif
 #ifdef VK_KHR_16bit_storage
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDevice16BitStorageFeatures, handlemap_VkPhysicalDevice16BitStorageFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDevice16BitStorageFeatures,
+                      handlemap_VkPhysicalDevice16BitStorageFeaturesKHR)
 
 #endif
 #ifdef VK_KHR_incremental_present
-void handlemap_VkRectLayerKHR(
-    VulkanHandleMapping* handlemap,
-    VkRectLayerKHR* toMap);
+void handlemap_VkRectLayerKHR(VulkanHandleMapping* handlemap, VkRectLayerKHR* toMap);
 
-void handlemap_VkPresentRegionKHR(
-    VulkanHandleMapping* handlemap,
-    VkPresentRegionKHR* toMap);
+void handlemap_VkPresentRegionKHR(VulkanHandleMapping* handlemap, VkPresentRegionKHR* toMap);
 
-void handlemap_VkPresentRegionsKHR(
-    VulkanHandleMapping* handlemap,
-    VkPresentRegionsKHR* toMap);
+void handlemap_VkPresentRegionsKHR(VulkanHandleMapping* handlemap, VkPresentRegionsKHR* toMap);
 
 #endif
 #ifdef VK_KHR_descriptor_update_template
-DEFINE_ALIAS_FUNCTION(handlemap_VkDescriptorUpdateTemplateEntry, handlemap_VkDescriptorUpdateTemplateEntryKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkDescriptorUpdateTemplateEntry,
+                      handlemap_VkDescriptorUpdateTemplateEntryKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkDescriptorUpdateTemplateCreateInfo, handlemap_VkDescriptorUpdateTemplateCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkDescriptorUpdateTemplateCreateInfo,
+                      handlemap_VkDescriptorUpdateTemplateCreateInfoKHR)
 
 #endif
 #ifdef VK_KHR_imageless_framebuffer
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceImagelessFramebufferFeatures, handlemap_VkPhysicalDeviceImagelessFramebufferFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceImagelessFramebufferFeatures,
+                      handlemap_VkPhysicalDeviceImagelessFramebufferFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkFramebufferAttachmentsCreateInfo, handlemap_VkFramebufferAttachmentsCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkFramebufferAttachmentsCreateInfo,
+                      handlemap_VkFramebufferAttachmentsCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkFramebufferAttachmentImageInfo, handlemap_VkFramebufferAttachmentImageInfoKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkFramebufferAttachmentImageInfo,
+                      handlemap_VkFramebufferAttachmentImageInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkRenderPassAttachmentBeginInfo, handlemap_VkRenderPassAttachmentBeginInfoKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkRenderPassAttachmentBeginInfo,
+                      handlemap_VkRenderPassAttachmentBeginInfoKHR)
 
 #endif
 #ifdef VK_KHR_create_renderpass2
@@ -1395,13 +1060,13 @@
 
 #endif
 #ifdef VK_KHR_shared_presentable_image
-void handlemap_VkSharedPresentSurfaceCapabilitiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkSharedPresentSurfaceCapabilitiesKHR* toMap);
+void handlemap_VkSharedPresentSurfaceCapabilitiesKHR(VulkanHandleMapping* handlemap,
+                                                     VkSharedPresentSurfaceCapabilitiesKHR* toMap);
 
 #endif
 #ifdef VK_KHR_external_fence_capabilities
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceExternalFenceInfo, handlemap_VkPhysicalDeviceExternalFenceInfoKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceExternalFenceInfo,
+                      handlemap_VkPhysicalDeviceExternalFenceInfoKHR)
 
 DEFINE_ALIAS_FUNCTION(handlemap_VkExternalFenceProperties, handlemap_VkExternalFencePropertiesKHR)
 
@@ -1411,121 +1076,106 @@
 
 #endif
 #ifdef VK_KHR_external_fence_win32
-void handlemap_VkImportFenceWin32HandleInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkImportFenceWin32HandleInfoKHR* toMap);
+void handlemap_VkImportFenceWin32HandleInfoKHR(VulkanHandleMapping* handlemap,
+                                               VkImportFenceWin32HandleInfoKHR* toMap);
 
-void handlemap_VkExportFenceWin32HandleInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkExportFenceWin32HandleInfoKHR* toMap);
+void handlemap_VkExportFenceWin32HandleInfoKHR(VulkanHandleMapping* handlemap,
+                                               VkExportFenceWin32HandleInfoKHR* toMap);
 
-void handlemap_VkFenceGetWin32HandleInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkFenceGetWin32HandleInfoKHR* toMap);
+void handlemap_VkFenceGetWin32HandleInfoKHR(VulkanHandleMapping* handlemap,
+                                            VkFenceGetWin32HandleInfoKHR* toMap);
 
 #endif
 #ifdef VK_KHR_external_fence_fd
-void handlemap_VkImportFenceFdInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkImportFenceFdInfoKHR* toMap);
+void handlemap_VkImportFenceFdInfoKHR(VulkanHandleMapping* handlemap,
+                                      VkImportFenceFdInfoKHR* toMap);
 
-void handlemap_VkFenceGetFdInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkFenceGetFdInfoKHR* toMap);
+void handlemap_VkFenceGetFdInfoKHR(VulkanHandleMapping* handlemap, VkFenceGetFdInfoKHR* toMap);
 
 #endif
 #ifdef VK_KHR_performance_query
 void handlemap_VkPhysicalDevicePerformanceQueryFeaturesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDevicePerformanceQueryFeaturesKHR* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDevicePerformanceQueryFeaturesKHR* toMap);
 
 void handlemap_VkPhysicalDevicePerformanceQueryPropertiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDevicePerformanceQueryPropertiesKHR* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDevicePerformanceQueryPropertiesKHR* toMap);
 
-void handlemap_VkPerformanceCounterKHR(
-    VulkanHandleMapping* handlemap,
-    VkPerformanceCounterKHR* toMap);
+void handlemap_VkPerformanceCounterKHR(VulkanHandleMapping* handlemap,
+                                       VkPerformanceCounterKHR* toMap);
 
-void handlemap_VkPerformanceCounterDescriptionKHR(
-    VulkanHandleMapping* handlemap,
-    VkPerformanceCounterDescriptionKHR* toMap);
+void handlemap_VkPerformanceCounterDescriptionKHR(VulkanHandleMapping* handlemap,
+                                                  VkPerformanceCounterDescriptionKHR* toMap);
 
-void handlemap_VkQueryPoolPerformanceCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkQueryPoolPerformanceCreateInfoKHR* toMap);
+void handlemap_VkQueryPoolPerformanceCreateInfoKHR(VulkanHandleMapping* handlemap,
+                                                   VkQueryPoolPerformanceCreateInfoKHR* toMap);
 
-void handlemap_VkPerformanceCounterResultKHR(
-    VulkanHandleMapping* handlemap,
-    VkPerformanceCounterResultKHR* toMap);
+void handlemap_VkPerformanceCounterResultKHR(VulkanHandleMapping* handlemap,
+                                             VkPerformanceCounterResultKHR* toMap);
 
-void handlemap_VkAcquireProfilingLockInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkAcquireProfilingLockInfoKHR* toMap);
+void handlemap_VkAcquireProfilingLockInfoKHR(VulkanHandleMapping* handlemap,
+                                             VkAcquireProfilingLockInfoKHR* toMap);
 
-void handlemap_VkPerformanceQuerySubmitInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkPerformanceQuerySubmitInfoKHR* toMap);
+void handlemap_VkPerformanceQuerySubmitInfoKHR(VulkanHandleMapping* handlemap,
+                                               VkPerformanceQuerySubmitInfoKHR* toMap);
 
 #endif
 #ifdef VK_KHR_maintenance2
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDevicePointClippingProperties, handlemap_VkPhysicalDevicePointClippingPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDevicePointClippingProperties,
+                      handlemap_VkPhysicalDevicePointClippingPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkRenderPassInputAttachmentAspectCreateInfo, handlemap_VkRenderPassInputAttachmentAspectCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkRenderPassInputAttachmentAspectCreateInfo,
+                      handlemap_VkRenderPassInputAttachmentAspectCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkInputAttachmentAspectReference, handlemap_VkInputAttachmentAspectReferenceKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkInputAttachmentAspectReference,
+                      handlemap_VkInputAttachmentAspectReferenceKHR)
 
 DEFINE_ALIAS_FUNCTION(handlemap_VkImageViewUsageCreateInfo, handlemap_VkImageViewUsageCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkPipelineTessellationDomainOriginStateCreateInfo, handlemap_VkPipelineTessellationDomainOriginStateCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPipelineTessellationDomainOriginStateCreateInfo,
+                      handlemap_VkPipelineTessellationDomainOriginStateCreateInfoKHR)
 
 #endif
 #ifdef VK_KHR_get_surface_capabilities2
-void handlemap_VkPhysicalDeviceSurfaceInfo2KHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceSurfaceInfo2KHR* toMap);
+void handlemap_VkPhysicalDeviceSurfaceInfo2KHR(VulkanHandleMapping* handlemap,
+                                               VkPhysicalDeviceSurfaceInfo2KHR* toMap);
 
-void handlemap_VkSurfaceCapabilities2KHR(
-    VulkanHandleMapping* handlemap,
-    VkSurfaceCapabilities2KHR* toMap);
+void handlemap_VkSurfaceCapabilities2KHR(VulkanHandleMapping* handlemap,
+                                         VkSurfaceCapabilities2KHR* toMap);
 
-void handlemap_VkSurfaceFormat2KHR(
-    VulkanHandleMapping* handlemap,
-    VkSurfaceFormat2KHR* toMap);
+void handlemap_VkSurfaceFormat2KHR(VulkanHandleMapping* handlemap, VkSurfaceFormat2KHR* toMap);
 
 #endif
 #ifdef VK_KHR_variable_pointers
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceVariablePointersFeatures, handlemap_VkPhysicalDeviceVariablePointerFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceVariablePointersFeatures,
+                      handlemap_VkPhysicalDeviceVariablePointerFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceVariablePointersFeatures, handlemap_VkPhysicalDeviceVariablePointersFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceVariablePointersFeatures,
+                      handlemap_VkPhysicalDeviceVariablePointersFeaturesKHR)
 
 #endif
 #ifdef VK_KHR_get_display_properties2
-void handlemap_VkDisplayProperties2KHR(
-    VulkanHandleMapping* handlemap,
-    VkDisplayProperties2KHR* toMap);
+void handlemap_VkDisplayProperties2KHR(VulkanHandleMapping* handlemap,
+                                       VkDisplayProperties2KHR* toMap);
 
-void handlemap_VkDisplayPlaneProperties2KHR(
-    VulkanHandleMapping* handlemap,
-    VkDisplayPlaneProperties2KHR* toMap);
+void handlemap_VkDisplayPlaneProperties2KHR(VulkanHandleMapping* handlemap,
+                                            VkDisplayPlaneProperties2KHR* toMap);
 
-void handlemap_VkDisplayModeProperties2KHR(
-    VulkanHandleMapping* handlemap,
-    VkDisplayModeProperties2KHR* toMap);
+void handlemap_VkDisplayModeProperties2KHR(VulkanHandleMapping* handlemap,
+                                           VkDisplayModeProperties2KHR* toMap);
 
-void handlemap_VkDisplayPlaneInfo2KHR(
-    VulkanHandleMapping* handlemap,
-    VkDisplayPlaneInfo2KHR* toMap);
+void handlemap_VkDisplayPlaneInfo2KHR(VulkanHandleMapping* handlemap,
+                                      VkDisplayPlaneInfo2KHR* toMap);
 
-void handlemap_VkDisplayPlaneCapabilities2KHR(
-    VulkanHandleMapping* handlemap,
-    VkDisplayPlaneCapabilities2KHR* toMap);
+void handlemap_VkDisplayPlaneCapabilities2KHR(VulkanHandleMapping* handlemap,
+                                              VkDisplayPlaneCapabilities2KHR* toMap);
 
 #endif
 #ifdef VK_KHR_dedicated_allocation
-DEFINE_ALIAS_FUNCTION(handlemap_VkMemoryDedicatedRequirements, handlemap_VkMemoryDedicatedRequirementsKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkMemoryDedicatedRequirements,
+                      handlemap_VkMemoryDedicatedRequirementsKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkMemoryDedicatedAllocateInfo, handlemap_VkMemoryDedicatedAllocateInfoKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkMemoryDedicatedAllocateInfo,
+                      handlemap_VkMemoryDedicatedAllocateInfoKHR)
 
 #endif
 #ifdef VK_KHR_storage_buffer_storage_class
@@ -1533,33 +1183,43 @@
 #ifdef VK_KHR_relaxed_block_layout
 #endif
 #ifdef VK_KHR_get_memory_requirements2
-DEFINE_ALIAS_FUNCTION(handlemap_VkBufferMemoryRequirementsInfo2, handlemap_VkBufferMemoryRequirementsInfo2KHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkBufferMemoryRequirementsInfo2,
+                      handlemap_VkBufferMemoryRequirementsInfo2KHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkImageMemoryRequirementsInfo2, handlemap_VkImageMemoryRequirementsInfo2KHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkImageMemoryRequirementsInfo2,
+                      handlemap_VkImageMemoryRequirementsInfo2KHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkImageSparseMemoryRequirementsInfo2, handlemap_VkImageSparseMemoryRequirementsInfo2KHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkImageSparseMemoryRequirementsInfo2,
+                      handlemap_VkImageSparseMemoryRequirementsInfo2KHR)
 
 DEFINE_ALIAS_FUNCTION(handlemap_VkMemoryRequirements2, handlemap_VkMemoryRequirements2KHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkSparseImageMemoryRequirements2, handlemap_VkSparseImageMemoryRequirements2KHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkSparseImageMemoryRequirements2,
+                      handlemap_VkSparseImageMemoryRequirements2KHR)
 
 #endif
 #ifdef VK_KHR_image_format_list
-DEFINE_ALIAS_FUNCTION(handlemap_VkImageFormatListCreateInfo, handlemap_VkImageFormatListCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkImageFormatListCreateInfo,
+                      handlemap_VkImageFormatListCreateInfoKHR)
 
 #endif
 #ifdef VK_KHR_sampler_ycbcr_conversion
-DEFINE_ALIAS_FUNCTION(handlemap_VkSamplerYcbcrConversionCreateInfo, handlemap_VkSamplerYcbcrConversionCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkSamplerYcbcrConversionCreateInfo,
+                      handlemap_VkSamplerYcbcrConversionCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkSamplerYcbcrConversionInfo, handlemap_VkSamplerYcbcrConversionInfoKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkSamplerYcbcrConversionInfo,
+                      handlemap_VkSamplerYcbcrConversionInfoKHR)
 
 DEFINE_ALIAS_FUNCTION(handlemap_VkBindImagePlaneMemoryInfo, handlemap_VkBindImagePlaneMemoryInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkImagePlaneMemoryRequirementsInfo, handlemap_VkImagePlaneMemoryRequirementsInfoKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkImagePlaneMemoryRequirementsInfo,
+                      handlemap_VkImagePlaneMemoryRequirementsInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceSamplerYcbcrConversionFeatures, handlemap_VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceSamplerYcbcrConversionFeatures,
+                      handlemap_VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkSamplerYcbcrConversionImageFormatProperties, handlemap_VkSamplerYcbcrConversionImageFormatPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkSamplerYcbcrConversionImageFormatProperties,
+                      handlemap_VkSamplerYcbcrConversionImageFormatPropertiesKHR)
 
 #endif
 #ifdef VK_KHR_bind_memory2
@@ -1570,66 +1230,75 @@
 #endif
 #ifdef VK_KHR_portability_subset
 void handlemap_VkPhysicalDevicePortabilitySubsetFeaturesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDevicePortabilitySubsetFeaturesKHR* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDevicePortabilitySubsetFeaturesKHR* toMap);
 
 void handlemap_VkPhysicalDevicePortabilitySubsetPropertiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDevicePortabilitySubsetPropertiesKHR* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDevicePortabilitySubsetPropertiesKHR* toMap);
 
 #endif
 #ifdef VK_KHR_maintenance3
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceMaintenance3Properties, handlemap_VkPhysicalDeviceMaintenance3PropertiesKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceMaintenance3Properties,
+                      handlemap_VkPhysicalDeviceMaintenance3PropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkDescriptorSetLayoutSupport, handlemap_VkDescriptorSetLayoutSupportKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkDescriptorSetLayoutSupport,
+                      handlemap_VkDescriptorSetLayoutSupportKHR)
 
 #endif
 #ifdef VK_KHR_draw_indirect_count
 #endif
 #ifdef VK_KHR_shader_subgroup_extended_types
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures, handlemap_VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures,
+                      handlemap_VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR)
 
 #endif
 #ifdef VK_KHR_8bit_storage
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDevice8BitStorageFeatures, handlemap_VkPhysicalDevice8BitStorageFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDevice8BitStorageFeatures,
+                      handlemap_VkPhysicalDevice8BitStorageFeaturesKHR)
 
 #endif
 #ifdef VK_KHR_shader_atomic_int64
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceShaderAtomicInt64Features, handlemap_VkPhysicalDeviceShaderAtomicInt64FeaturesKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceShaderAtomicInt64Features,
+                      handlemap_VkPhysicalDeviceShaderAtomicInt64FeaturesKHR)
 
 #endif
 #ifdef VK_KHR_shader_clock
 void handlemap_VkPhysicalDeviceShaderClockFeaturesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShaderClockFeaturesKHR* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShaderClockFeaturesKHR* toMap);
 
 #endif
 #ifdef VK_KHR_driver_properties
 DEFINE_ALIAS_FUNCTION(handlemap_VkConformanceVersion, handlemap_VkConformanceVersionKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceDriverProperties, handlemap_VkPhysicalDeviceDriverPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceDriverProperties,
+                      handlemap_VkPhysicalDeviceDriverPropertiesKHR)
 
 #endif
 #ifdef VK_KHR_shader_float_controls
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceFloatControlsProperties, handlemap_VkPhysicalDeviceFloatControlsPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceFloatControlsProperties,
+                      handlemap_VkPhysicalDeviceFloatControlsPropertiesKHR)
 
 #endif
 #ifdef VK_KHR_depth_stencil_resolve
-DEFINE_ALIAS_FUNCTION(handlemap_VkSubpassDescriptionDepthStencilResolve, handlemap_VkSubpassDescriptionDepthStencilResolveKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkSubpassDescriptionDepthStencilResolve,
+                      handlemap_VkSubpassDescriptionDepthStencilResolveKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceDepthStencilResolveProperties, handlemap_VkPhysicalDeviceDepthStencilResolvePropertiesKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceDepthStencilResolveProperties,
+                      handlemap_VkPhysicalDeviceDepthStencilResolvePropertiesKHR)
 
 #endif
 #ifdef VK_KHR_swapchain_mutable_format
 #endif
 #ifdef VK_KHR_timeline_semaphore
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceTimelineSemaphoreFeatures, handlemap_VkPhysicalDeviceTimelineSemaphoreFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceTimelineSemaphoreFeatures,
+                      handlemap_VkPhysicalDeviceTimelineSemaphoreFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceTimelineSemaphoreProperties, handlemap_VkPhysicalDeviceTimelineSemaphorePropertiesKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceTimelineSemaphoreProperties,
+                      handlemap_VkPhysicalDeviceTimelineSemaphorePropertiesKHR)
 
 DEFINE_ALIAS_FUNCTION(handlemap_VkSemaphoreTypeCreateInfo, handlemap_VkSemaphoreTypeCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkTimelineSemaphoreSubmitInfo, handlemap_VkTimelineSemaphoreSubmitInfoKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkTimelineSemaphoreSubmitInfo,
+                      handlemap_VkTimelineSemaphoreSubmitInfoKHR)
 
 DEFINE_ALIAS_FUNCTION(handlemap_VkSemaphoreWaitInfo, handlemap_VkSemaphoreWaitInfoKHR)
 
@@ -1637,185 +1306,155 @@
 
 #endif
 #ifdef VK_KHR_vulkan_memory_model
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceVulkanMemoryModelFeatures, handlemap_VkPhysicalDeviceVulkanMemoryModelFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceVulkanMemoryModelFeatures,
+                      handlemap_VkPhysicalDeviceVulkanMemoryModelFeaturesKHR)
 
 #endif
 #ifdef VK_KHR_shader_terminate_invocation
 void handlemap_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* toMap);
 
 #endif
 #ifdef VK_KHR_fragment_shading_rate
 void handlemap_VkFragmentShadingRateAttachmentInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkFragmentShadingRateAttachmentInfoKHR* toMap);
+    VulkanHandleMapping* handlemap, VkFragmentShadingRateAttachmentInfoKHR* toMap);
 
 void handlemap_VkPipelineFragmentShadingRateStateCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkPipelineFragmentShadingRateStateCreateInfoKHR* toMap);
+    VulkanHandleMapping* handlemap, VkPipelineFragmentShadingRateStateCreateInfoKHR* toMap);
 
 void handlemap_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceFragmentShadingRateFeaturesKHR* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceFragmentShadingRateFeaturesKHR* toMap);
 
 void handlemap_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceFragmentShadingRatePropertiesKHR* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceFragmentShadingRatePropertiesKHR* toMap);
 
 void handlemap_VkPhysicalDeviceFragmentShadingRateKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceFragmentShadingRateKHR* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceFragmentShadingRateKHR* toMap);
 
 #endif
 #ifdef VK_KHR_spirv_1_4
 #endif
 #ifdef VK_KHR_surface_protected_capabilities
-void handlemap_VkSurfaceProtectedCapabilitiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkSurfaceProtectedCapabilitiesKHR* toMap);
+void handlemap_VkSurfaceProtectedCapabilitiesKHR(VulkanHandleMapping* handlemap,
+                                                 VkSurfaceProtectedCapabilitiesKHR* toMap);
 
 #endif
 #ifdef VK_KHR_separate_depth_stencil_layouts
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures, handlemap_VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures,
+                      handlemap_VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkAttachmentReferenceStencilLayout, handlemap_VkAttachmentReferenceStencilLayoutKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkAttachmentReferenceStencilLayout,
+                      handlemap_VkAttachmentReferenceStencilLayoutKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkAttachmentDescriptionStencilLayout, handlemap_VkAttachmentDescriptionStencilLayoutKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkAttachmentDescriptionStencilLayout,
+                      handlemap_VkAttachmentDescriptionStencilLayoutKHR)
 
 #endif
 #ifdef VK_KHR_present_wait
 void handlemap_VkPhysicalDevicePresentWaitFeaturesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDevicePresentWaitFeaturesKHR* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDevicePresentWaitFeaturesKHR* toMap);
 
 #endif
 #ifdef VK_KHR_uniform_buffer_standard_layout
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceUniformBufferStandardLayoutFeatures, handlemap_VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceUniformBufferStandardLayoutFeatures,
+                      handlemap_VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR)
 
 #endif
 #ifdef VK_KHR_buffer_device_address
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceBufferDeviceAddressFeatures, handlemap_VkPhysicalDeviceBufferDeviceAddressFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceBufferDeviceAddressFeatures,
+                      handlemap_VkPhysicalDeviceBufferDeviceAddressFeaturesKHR)
 
 DEFINE_ALIAS_FUNCTION(handlemap_VkBufferDeviceAddressInfo, handlemap_VkBufferDeviceAddressInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkBufferOpaqueCaptureAddressCreateInfo, handlemap_VkBufferOpaqueCaptureAddressCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkBufferOpaqueCaptureAddressCreateInfo,
+                      handlemap_VkBufferOpaqueCaptureAddressCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkMemoryOpaqueCaptureAddressAllocateInfo, handlemap_VkMemoryOpaqueCaptureAddressAllocateInfoKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkMemoryOpaqueCaptureAddressAllocateInfo,
+                      handlemap_VkMemoryOpaqueCaptureAddressAllocateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkDeviceMemoryOpaqueCaptureAddressInfo, handlemap_VkDeviceMemoryOpaqueCaptureAddressInfoKHR)
+DEFINE_ALIAS_FUNCTION(handlemap_VkDeviceMemoryOpaqueCaptureAddressInfo,
+                      handlemap_VkDeviceMemoryOpaqueCaptureAddressInfoKHR)
 
 #endif
 #ifdef VK_KHR_deferred_host_operations
 #endif
 #ifdef VK_KHR_pipeline_executable_properties
 void handlemap_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* toMap);
 
-void handlemap_VkPipelineInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkPipelineInfoKHR* toMap);
+void handlemap_VkPipelineInfoKHR(VulkanHandleMapping* handlemap, VkPipelineInfoKHR* toMap);
 
-void handlemap_VkPipelineExecutablePropertiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPipelineExecutablePropertiesKHR* toMap);
+void handlemap_VkPipelineExecutablePropertiesKHR(VulkanHandleMapping* handlemap,
+                                                 VkPipelineExecutablePropertiesKHR* toMap);
 
-void handlemap_VkPipelineExecutableInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkPipelineExecutableInfoKHR* toMap);
+void handlemap_VkPipelineExecutableInfoKHR(VulkanHandleMapping* handlemap,
+                                           VkPipelineExecutableInfoKHR* toMap);
 
-void handlemap_VkPipelineExecutableStatisticValueKHR(
-    VulkanHandleMapping* handlemap,
-    VkPipelineExecutableStatisticValueKHR* toMap);
+void handlemap_VkPipelineExecutableStatisticValueKHR(VulkanHandleMapping* handlemap,
+                                                     VkPipelineExecutableStatisticValueKHR* toMap);
 
-void handlemap_VkPipelineExecutableStatisticKHR(
-    VulkanHandleMapping* handlemap,
-    VkPipelineExecutableStatisticKHR* toMap);
+void handlemap_VkPipelineExecutableStatisticKHR(VulkanHandleMapping* handlemap,
+                                                VkPipelineExecutableStatisticKHR* toMap);
 
 void handlemap_VkPipelineExecutableInternalRepresentationKHR(
-    VulkanHandleMapping* handlemap,
-    VkPipelineExecutableInternalRepresentationKHR* toMap);
+    VulkanHandleMapping* handlemap, VkPipelineExecutableInternalRepresentationKHR* toMap);
 
 #endif
 #ifdef VK_KHR_shader_integer_dot_product
 void handlemap_VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR* toMap);
 
 void handlemap_VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR* toMap);
 
 #endif
 #ifdef VK_KHR_pipeline_library
-void handlemap_VkPipelineLibraryCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkPipelineLibraryCreateInfoKHR* toMap);
+void handlemap_VkPipelineLibraryCreateInfoKHR(VulkanHandleMapping* handlemap,
+                                              VkPipelineLibraryCreateInfoKHR* toMap);
 
 #endif
 #ifdef VK_KHR_shader_non_semantic_info
 #endif
 #ifdef VK_KHR_present_id
-void handlemap_VkPresentIdKHR(
-    VulkanHandleMapping* handlemap,
-    VkPresentIdKHR* toMap);
+void handlemap_VkPresentIdKHR(VulkanHandleMapping* handlemap, VkPresentIdKHR* toMap);
 
-void handlemap_VkPhysicalDevicePresentIdFeaturesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDevicePresentIdFeaturesKHR* toMap);
+void handlemap_VkPhysicalDevicePresentIdFeaturesKHR(VulkanHandleMapping* handlemap,
+                                                    VkPhysicalDevicePresentIdFeaturesKHR* toMap);
 
 #endif
 #ifdef VK_KHR_video_encode_queue
-void handlemap_VkVideoEncodeInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeInfoKHR* toMap);
+void handlemap_VkVideoEncodeInfoKHR(VulkanHandleMapping* handlemap, VkVideoEncodeInfoKHR* toMap);
 
-void handlemap_VkVideoEncodeRateControlInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeRateControlInfoKHR* toMap);
+void handlemap_VkVideoEncodeRateControlInfoKHR(VulkanHandleMapping* handlemap,
+                                               VkVideoEncodeRateControlInfoKHR* toMap);
 
 #endif
 #ifdef VK_KHR_synchronization2
-void handlemap_VkMemoryBarrier2KHR(
-    VulkanHandleMapping* handlemap,
-    VkMemoryBarrier2KHR* toMap);
+void handlemap_VkMemoryBarrier2KHR(VulkanHandleMapping* handlemap, VkMemoryBarrier2KHR* toMap);
 
-void handlemap_VkBufferMemoryBarrier2KHR(
-    VulkanHandleMapping* handlemap,
-    VkBufferMemoryBarrier2KHR* toMap);
+void handlemap_VkBufferMemoryBarrier2KHR(VulkanHandleMapping* handlemap,
+                                         VkBufferMemoryBarrier2KHR* toMap);
 
-void handlemap_VkImageMemoryBarrier2KHR(
-    VulkanHandleMapping* handlemap,
-    VkImageMemoryBarrier2KHR* toMap);
+void handlemap_VkImageMemoryBarrier2KHR(VulkanHandleMapping* handlemap,
+                                        VkImageMemoryBarrier2KHR* toMap);
 
-void handlemap_VkDependencyInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkDependencyInfoKHR* toMap);
+void handlemap_VkDependencyInfoKHR(VulkanHandleMapping* handlemap, VkDependencyInfoKHR* toMap);
 
-void handlemap_VkSemaphoreSubmitInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkSemaphoreSubmitInfoKHR* toMap);
+void handlemap_VkSemaphoreSubmitInfoKHR(VulkanHandleMapping* handlemap,
+                                        VkSemaphoreSubmitInfoKHR* toMap);
 
-void handlemap_VkCommandBufferSubmitInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkCommandBufferSubmitInfoKHR* toMap);
+void handlemap_VkCommandBufferSubmitInfoKHR(VulkanHandleMapping* handlemap,
+                                            VkCommandBufferSubmitInfoKHR* toMap);
 
-void handlemap_VkSubmitInfo2KHR(
-    VulkanHandleMapping* handlemap,
-    VkSubmitInfo2KHR* toMap);
+void handlemap_VkSubmitInfo2KHR(VulkanHandleMapping* handlemap, VkSubmitInfo2KHR* toMap);
 
 void handlemap_VkPhysicalDeviceSynchronization2FeaturesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceSynchronization2FeaturesKHR* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceSynchronization2FeaturesKHR* toMap);
 
-void handlemap_VkQueueFamilyCheckpointProperties2NV(
-    VulkanHandleMapping* handlemap,
-    VkQueueFamilyCheckpointProperties2NV* toMap);
+void handlemap_VkQueueFamilyCheckpointProperties2NV(VulkanHandleMapping* handlemap,
+                                                    VkQueueFamilyCheckpointProperties2NV* toMap);
 
-void handlemap_VkCheckpointData2NV(
-    VulkanHandleMapping* handlemap,
-    VkCheckpointData2NV* toMap);
+void handlemap_VkCheckpointData2NV(VulkanHandleMapping* handlemap, VkCheckpointData2NV* toMap);
 
 #endif
 #ifdef VK_KHR_shader_subgroup_uniform_control_flow
@@ -1837,85 +1476,58 @@
 
 #endif
 #ifdef VK_KHR_copy_commands2
-void handlemap_VkBufferCopy2KHR(
-    VulkanHandleMapping* handlemap,
-    VkBufferCopy2KHR* toMap);
+void handlemap_VkBufferCopy2KHR(VulkanHandleMapping* handlemap, VkBufferCopy2KHR* toMap);
 
-void handlemap_VkCopyBufferInfo2KHR(
-    VulkanHandleMapping* handlemap,
-    VkCopyBufferInfo2KHR* toMap);
+void handlemap_VkCopyBufferInfo2KHR(VulkanHandleMapping* handlemap, VkCopyBufferInfo2KHR* toMap);
 
-void handlemap_VkImageCopy2KHR(
-    VulkanHandleMapping* handlemap,
-    VkImageCopy2KHR* toMap);
+void handlemap_VkImageCopy2KHR(VulkanHandleMapping* handlemap, VkImageCopy2KHR* toMap);
 
-void handlemap_VkCopyImageInfo2KHR(
-    VulkanHandleMapping* handlemap,
-    VkCopyImageInfo2KHR* toMap);
+void handlemap_VkCopyImageInfo2KHR(VulkanHandleMapping* handlemap, VkCopyImageInfo2KHR* toMap);
 
-void handlemap_VkBufferImageCopy2KHR(
-    VulkanHandleMapping* handlemap,
-    VkBufferImageCopy2KHR* toMap);
+void handlemap_VkBufferImageCopy2KHR(VulkanHandleMapping* handlemap, VkBufferImageCopy2KHR* toMap);
 
-void handlemap_VkCopyBufferToImageInfo2KHR(
-    VulkanHandleMapping* handlemap,
-    VkCopyBufferToImageInfo2KHR* toMap);
+void handlemap_VkCopyBufferToImageInfo2KHR(VulkanHandleMapping* handlemap,
+                                           VkCopyBufferToImageInfo2KHR* toMap);
 
-void handlemap_VkCopyImageToBufferInfo2KHR(
-    VulkanHandleMapping* handlemap,
-    VkCopyImageToBufferInfo2KHR* toMap);
+void handlemap_VkCopyImageToBufferInfo2KHR(VulkanHandleMapping* handlemap,
+                                           VkCopyImageToBufferInfo2KHR* toMap);
 
-void handlemap_VkImageBlit2KHR(
-    VulkanHandleMapping* handlemap,
-    VkImageBlit2KHR* toMap);
+void handlemap_VkImageBlit2KHR(VulkanHandleMapping* handlemap, VkImageBlit2KHR* toMap);
 
-void handlemap_VkBlitImageInfo2KHR(
-    VulkanHandleMapping* handlemap,
-    VkBlitImageInfo2KHR* toMap);
+void handlemap_VkBlitImageInfo2KHR(VulkanHandleMapping* handlemap, VkBlitImageInfo2KHR* toMap);
 
-void handlemap_VkImageResolve2KHR(
-    VulkanHandleMapping* handlemap,
-    VkImageResolve2KHR* toMap);
+void handlemap_VkImageResolve2KHR(VulkanHandleMapping* handlemap, VkImageResolve2KHR* toMap);
 
-void handlemap_VkResolveImageInfo2KHR(
-    VulkanHandleMapping* handlemap,
-    VkResolveImageInfo2KHR* toMap);
+void handlemap_VkResolveImageInfo2KHR(VulkanHandleMapping* handlemap,
+                                      VkResolveImageInfo2KHR* toMap);
 
 #endif
 #ifdef VK_KHR_format_feature_flags2
-void handlemap_VkFormatProperties3KHR(
-    VulkanHandleMapping* handlemap,
-    VkFormatProperties3KHR* toMap);
+void handlemap_VkFormatProperties3KHR(VulkanHandleMapping* handlemap,
+                                      VkFormatProperties3KHR* toMap);
 
 #endif
 #ifdef VK_KHR_maintenance4
 void handlemap_VkPhysicalDeviceMaintenance4FeaturesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceMaintenance4FeaturesKHR* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceMaintenance4FeaturesKHR* toMap);
 
 void handlemap_VkPhysicalDeviceMaintenance4PropertiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceMaintenance4PropertiesKHR* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceMaintenance4PropertiesKHR* toMap);
 
-void handlemap_VkDeviceBufferMemoryRequirementsKHR(
-    VulkanHandleMapping* handlemap,
-    VkDeviceBufferMemoryRequirementsKHR* toMap);
+void handlemap_VkDeviceBufferMemoryRequirementsKHR(VulkanHandleMapping* handlemap,
+                                                   VkDeviceBufferMemoryRequirementsKHR* toMap);
 
-void handlemap_VkDeviceImageMemoryRequirementsKHR(
-    VulkanHandleMapping* handlemap,
-    VkDeviceImageMemoryRequirementsKHR* toMap);
+void handlemap_VkDeviceImageMemoryRequirementsKHR(VulkanHandleMapping* handlemap,
+                                                  VkDeviceImageMemoryRequirementsKHR* toMap);
 
 #endif
 #ifdef VK_ANDROID_native_buffer
-void handlemap_VkNativeBufferANDROID(
-    VulkanHandleMapping* handlemap,
-    VkNativeBufferANDROID* toMap);
+void handlemap_VkNativeBufferANDROID(VulkanHandleMapping* handlemap, VkNativeBufferANDROID* toMap);
 
 #endif
 #ifdef VK_EXT_debug_report
-void handlemap_VkDebugReportCallbackCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkDebugReportCallbackCreateInfoEXT* toMap);
+void handlemap_VkDebugReportCallbackCreateInfoEXT(VulkanHandleMapping* handlemap,
+                                                  VkDebugReportCallbackCreateInfoEXT* toMap);
 
 #endif
 #ifdef VK_NV_glsl_shader
@@ -1926,8 +1538,7 @@
 #endif
 #ifdef VK_AMD_rasterization_order
 void handlemap_VkPipelineRasterizationStateRasterizationOrderAMD(
-    VulkanHandleMapping* handlemap,
-    VkPipelineRasterizationStateRasterizationOrderAMD* toMap);
+    VulkanHandleMapping* handlemap, VkPipelineRasterizationStateRasterizationOrderAMD* toMap);
 
 #endif
 #ifdef VK_AMD_shader_trinary_minmax
@@ -1935,71 +1546,56 @@
 #ifdef VK_AMD_shader_explicit_vertex_parameter
 #endif
 #ifdef VK_EXT_debug_marker
-void handlemap_VkDebugMarkerObjectNameInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkDebugMarkerObjectNameInfoEXT* toMap);
+void handlemap_VkDebugMarkerObjectNameInfoEXT(VulkanHandleMapping* handlemap,
+                                              VkDebugMarkerObjectNameInfoEXT* toMap);
 
-void handlemap_VkDebugMarkerObjectTagInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkDebugMarkerObjectTagInfoEXT* toMap);
+void handlemap_VkDebugMarkerObjectTagInfoEXT(VulkanHandleMapping* handlemap,
+                                             VkDebugMarkerObjectTagInfoEXT* toMap);
 
-void handlemap_VkDebugMarkerMarkerInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkDebugMarkerMarkerInfoEXT* toMap);
+void handlemap_VkDebugMarkerMarkerInfoEXT(VulkanHandleMapping* handlemap,
+                                          VkDebugMarkerMarkerInfoEXT* toMap);
 
 #endif
 #ifdef VK_AMD_gcn_shader
 #endif
 #ifdef VK_NV_dedicated_allocation
 void handlemap_VkDedicatedAllocationImageCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkDedicatedAllocationImageCreateInfoNV* toMap);
+    VulkanHandleMapping* handlemap, VkDedicatedAllocationImageCreateInfoNV* toMap);
 
 void handlemap_VkDedicatedAllocationBufferCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkDedicatedAllocationBufferCreateInfoNV* toMap);
+    VulkanHandleMapping* handlemap, VkDedicatedAllocationBufferCreateInfoNV* toMap);
 
 void handlemap_VkDedicatedAllocationMemoryAllocateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkDedicatedAllocationMemoryAllocateInfoNV* toMap);
+    VulkanHandleMapping* handlemap, VkDedicatedAllocationMemoryAllocateInfoNV* toMap);
 
 #endif
 #ifdef VK_EXT_transform_feedback
 void handlemap_VkPhysicalDeviceTransformFeedbackFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceTransformFeedbackFeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceTransformFeedbackFeaturesEXT* toMap);
 
 void handlemap_VkPhysicalDeviceTransformFeedbackPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceTransformFeedbackPropertiesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceTransformFeedbackPropertiesEXT* toMap);
 
 void handlemap_VkPipelineRasterizationStateStreamCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkPipelineRasterizationStateStreamCreateInfoEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPipelineRasterizationStateStreamCreateInfoEXT* toMap);
 
 #endif
 #ifdef VK_NVX_binary_import
-void handlemap_VkCuModuleCreateInfoNVX(
-    VulkanHandleMapping* handlemap,
-    VkCuModuleCreateInfoNVX* toMap);
+void handlemap_VkCuModuleCreateInfoNVX(VulkanHandleMapping* handlemap,
+                                       VkCuModuleCreateInfoNVX* toMap);
 
-void handlemap_VkCuFunctionCreateInfoNVX(
-    VulkanHandleMapping* handlemap,
-    VkCuFunctionCreateInfoNVX* toMap);
+void handlemap_VkCuFunctionCreateInfoNVX(VulkanHandleMapping* handlemap,
+                                         VkCuFunctionCreateInfoNVX* toMap);
 
-void handlemap_VkCuLaunchInfoNVX(
-    VulkanHandleMapping* handlemap,
-    VkCuLaunchInfoNVX* toMap);
+void handlemap_VkCuLaunchInfoNVX(VulkanHandleMapping* handlemap, VkCuLaunchInfoNVX* toMap);
 
 #endif
 #ifdef VK_NVX_image_view_handle
-void handlemap_VkImageViewHandleInfoNVX(
-    VulkanHandleMapping* handlemap,
-    VkImageViewHandleInfoNVX* toMap);
+void handlemap_VkImageViewHandleInfoNVX(VulkanHandleMapping* handlemap,
+                                        VkImageViewHandleInfoNVX* toMap);
 
-void handlemap_VkImageViewAddressPropertiesNVX(
-    VulkanHandleMapping* handlemap,
-    VkImageViewAddressPropertiesNVX* toMap);
+void handlemap_VkImageViewAddressPropertiesNVX(VulkanHandleMapping* handlemap,
+                                               VkImageViewAddressPropertiesNVX* toMap);
 
 #endif
 #ifdef VK_AMD_draw_indirect_count
@@ -2011,193 +1607,152 @@
 #ifdef VK_AMD_shader_ballot
 #endif
 #ifdef VK_EXT_video_encode_h264
-void handlemap_VkVideoEncodeH264CapabilitiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH264CapabilitiesEXT* toMap);
+void handlemap_VkVideoEncodeH264CapabilitiesEXT(VulkanHandleMapping* handlemap,
+                                                VkVideoEncodeH264CapabilitiesEXT* toMap);
 
-void handlemap_VkVideoEncodeH264SessionCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH264SessionCreateInfoEXT* toMap);
+void handlemap_VkVideoEncodeH264SessionCreateInfoEXT(VulkanHandleMapping* handlemap,
+                                                     VkVideoEncodeH264SessionCreateInfoEXT* toMap);
 
 void handlemap_VkVideoEncodeH264SessionParametersAddInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH264SessionParametersAddInfoEXT* toMap);
+    VulkanHandleMapping* handlemap, VkVideoEncodeH264SessionParametersAddInfoEXT* toMap);
 
 void handlemap_VkVideoEncodeH264SessionParametersCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH264SessionParametersCreateInfoEXT* toMap);
+    VulkanHandleMapping* handlemap, VkVideoEncodeH264SessionParametersCreateInfoEXT* toMap);
 
-void handlemap_VkVideoEncodeH264DpbSlotInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH264DpbSlotInfoEXT* toMap);
+void handlemap_VkVideoEncodeH264DpbSlotInfoEXT(VulkanHandleMapping* handlemap,
+                                               VkVideoEncodeH264DpbSlotInfoEXT* toMap);
 
-void handlemap_VkVideoEncodeH264NaluSliceEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH264NaluSliceEXT* toMap);
+void handlemap_VkVideoEncodeH264NaluSliceEXT(VulkanHandleMapping* handlemap,
+                                             VkVideoEncodeH264NaluSliceEXT* toMap);
 
-void handlemap_VkVideoEncodeH264VclFrameInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH264VclFrameInfoEXT* toMap);
+void handlemap_VkVideoEncodeH264VclFrameInfoEXT(VulkanHandleMapping* handlemap,
+                                                VkVideoEncodeH264VclFrameInfoEXT* toMap);
 
 void handlemap_VkVideoEncodeH264EmitPictureParametersEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH264EmitPictureParametersEXT* toMap);
+    VulkanHandleMapping* handlemap, VkVideoEncodeH264EmitPictureParametersEXT* toMap);
 
-void handlemap_VkVideoEncodeH264ProfileEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH264ProfileEXT* toMap);
+void handlemap_VkVideoEncodeH264ProfileEXT(VulkanHandleMapping* handlemap,
+                                           VkVideoEncodeH264ProfileEXT* toMap);
 
 #endif
 #ifdef VK_EXT_video_encode_h265
-void handlemap_VkVideoEncodeH265CapabilitiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH265CapabilitiesEXT* toMap);
+void handlemap_VkVideoEncodeH265CapabilitiesEXT(VulkanHandleMapping* handlemap,
+                                                VkVideoEncodeH265CapabilitiesEXT* toMap);
 
-void handlemap_VkVideoEncodeH265SessionCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH265SessionCreateInfoEXT* toMap);
+void handlemap_VkVideoEncodeH265SessionCreateInfoEXT(VulkanHandleMapping* handlemap,
+                                                     VkVideoEncodeH265SessionCreateInfoEXT* toMap);
 
 void handlemap_VkVideoEncodeH265SessionParametersAddInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH265SessionParametersAddInfoEXT* toMap);
+    VulkanHandleMapping* handlemap, VkVideoEncodeH265SessionParametersAddInfoEXT* toMap);
 
 void handlemap_VkVideoEncodeH265SessionParametersCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH265SessionParametersCreateInfoEXT* toMap);
+    VulkanHandleMapping* handlemap, VkVideoEncodeH265SessionParametersCreateInfoEXT* toMap);
 
-void handlemap_VkVideoEncodeH265DpbSlotInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH265DpbSlotInfoEXT* toMap);
+void handlemap_VkVideoEncodeH265DpbSlotInfoEXT(VulkanHandleMapping* handlemap,
+                                               VkVideoEncodeH265DpbSlotInfoEXT* toMap);
 
-void handlemap_VkVideoEncodeH265ReferenceListsEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH265ReferenceListsEXT* toMap);
+void handlemap_VkVideoEncodeH265ReferenceListsEXT(VulkanHandleMapping* handlemap,
+                                                  VkVideoEncodeH265ReferenceListsEXT* toMap);
 
-void handlemap_VkVideoEncodeH265NaluSliceEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH265NaluSliceEXT* toMap);
+void handlemap_VkVideoEncodeH265NaluSliceEXT(VulkanHandleMapping* handlemap,
+                                             VkVideoEncodeH265NaluSliceEXT* toMap);
 
-void handlemap_VkVideoEncodeH265VclFrameInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH265VclFrameInfoEXT* toMap);
+void handlemap_VkVideoEncodeH265VclFrameInfoEXT(VulkanHandleMapping* handlemap,
+                                                VkVideoEncodeH265VclFrameInfoEXT* toMap);
 
 void handlemap_VkVideoEncodeH265EmitPictureParametersEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH265EmitPictureParametersEXT* toMap);
+    VulkanHandleMapping* handlemap, VkVideoEncodeH265EmitPictureParametersEXT* toMap);
 
-void handlemap_VkVideoEncodeH265ProfileEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoEncodeH265ProfileEXT* toMap);
+void handlemap_VkVideoEncodeH265ProfileEXT(VulkanHandleMapping* handlemap,
+                                           VkVideoEncodeH265ProfileEXT* toMap);
 
 #endif
 #ifdef VK_EXT_video_decode_h264
-void handlemap_VkVideoDecodeH264ProfileEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoDecodeH264ProfileEXT* toMap);
+void handlemap_VkVideoDecodeH264ProfileEXT(VulkanHandleMapping* handlemap,
+                                           VkVideoDecodeH264ProfileEXT* toMap);
 
-void handlemap_VkVideoDecodeH264CapabilitiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoDecodeH264CapabilitiesEXT* toMap);
+void handlemap_VkVideoDecodeH264CapabilitiesEXT(VulkanHandleMapping* handlemap,
+                                                VkVideoDecodeH264CapabilitiesEXT* toMap);
 
-void handlemap_VkVideoDecodeH264SessionCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoDecodeH264SessionCreateInfoEXT* toMap);
+void handlemap_VkVideoDecodeH264SessionCreateInfoEXT(VulkanHandleMapping* handlemap,
+                                                     VkVideoDecodeH264SessionCreateInfoEXT* toMap);
 
 void handlemap_VkVideoDecodeH264SessionParametersAddInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoDecodeH264SessionParametersAddInfoEXT* toMap);
+    VulkanHandleMapping* handlemap, VkVideoDecodeH264SessionParametersAddInfoEXT* toMap);
 
 void handlemap_VkVideoDecodeH264SessionParametersCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoDecodeH264SessionParametersCreateInfoEXT* toMap);
+    VulkanHandleMapping* handlemap, VkVideoDecodeH264SessionParametersCreateInfoEXT* toMap);
 
-void handlemap_VkVideoDecodeH264PictureInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoDecodeH264PictureInfoEXT* toMap);
+void handlemap_VkVideoDecodeH264PictureInfoEXT(VulkanHandleMapping* handlemap,
+                                               VkVideoDecodeH264PictureInfoEXT* toMap);
 
-void handlemap_VkVideoDecodeH264MvcEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoDecodeH264MvcEXT* toMap);
+void handlemap_VkVideoDecodeH264MvcEXT(VulkanHandleMapping* handlemap,
+                                       VkVideoDecodeH264MvcEXT* toMap);
 
-void handlemap_VkVideoDecodeH264DpbSlotInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoDecodeH264DpbSlotInfoEXT* toMap);
+void handlemap_VkVideoDecodeH264DpbSlotInfoEXT(VulkanHandleMapping* handlemap,
+                                               VkVideoDecodeH264DpbSlotInfoEXT* toMap);
 
 #endif
 #ifdef VK_AMD_texture_gather_bias_lod
-void handlemap_VkTextureLODGatherFormatPropertiesAMD(
-    VulkanHandleMapping* handlemap,
-    VkTextureLODGatherFormatPropertiesAMD* toMap);
+void handlemap_VkTextureLODGatherFormatPropertiesAMD(VulkanHandleMapping* handlemap,
+                                                     VkTextureLODGatherFormatPropertiesAMD* toMap);
 
 #endif
 #ifdef VK_AMD_shader_info
-void handlemap_VkShaderResourceUsageAMD(
-    VulkanHandleMapping* handlemap,
-    VkShaderResourceUsageAMD* toMap);
+void handlemap_VkShaderResourceUsageAMD(VulkanHandleMapping* handlemap,
+                                        VkShaderResourceUsageAMD* toMap);
 
-void handlemap_VkShaderStatisticsInfoAMD(
-    VulkanHandleMapping* handlemap,
-    VkShaderStatisticsInfoAMD* toMap);
+void handlemap_VkShaderStatisticsInfoAMD(VulkanHandleMapping* handlemap,
+                                         VkShaderStatisticsInfoAMD* toMap);
 
 #endif
 #ifdef VK_AMD_shader_image_load_store_lod
 #endif
 #ifdef VK_GGP_stream_descriptor_surface
 void handlemap_VkStreamDescriptorSurfaceCreateInfoGGP(
-    VulkanHandleMapping* handlemap,
-    VkStreamDescriptorSurfaceCreateInfoGGP* toMap);
+    VulkanHandleMapping* handlemap, VkStreamDescriptorSurfaceCreateInfoGGP* toMap);
 
 #endif
 #ifdef VK_NV_corner_sampled_image
 void handlemap_VkPhysicalDeviceCornerSampledImageFeaturesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceCornerSampledImageFeaturesNV* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceCornerSampledImageFeaturesNV* toMap);
 
 #endif
 #ifdef VK_IMG_format_pvrtc
 #endif
 #ifdef VK_NV_external_memory_capabilities
-void handlemap_VkExternalImageFormatPropertiesNV(
-    VulkanHandleMapping* handlemap,
-    VkExternalImageFormatPropertiesNV* toMap);
+void handlemap_VkExternalImageFormatPropertiesNV(VulkanHandleMapping* handlemap,
+                                                 VkExternalImageFormatPropertiesNV* toMap);
 
 #endif
 #ifdef VK_NV_external_memory
-void handlemap_VkExternalMemoryImageCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkExternalMemoryImageCreateInfoNV* toMap);
+void handlemap_VkExternalMemoryImageCreateInfoNV(VulkanHandleMapping* handlemap,
+                                                 VkExternalMemoryImageCreateInfoNV* toMap);
 
-void handlemap_VkExportMemoryAllocateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkExportMemoryAllocateInfoNV* toMap);
+void handlemap_VkExportMemoryAllocateInfoNV(VulkanHandleMapping* handlemap,
+                                            VkExportMemoryAllocateInfoNV* toMap);
 
 #endif
 #ifdef VK_NV_external_memory_win32
-void handlemap_VkImportMemoryWin32HandleInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkImportMemoryWin32HandleInfoNV* toMap);
+void handlemap_VkImportMemoryWin32HandleInfoNV(VulkanHandleMapping* handlemap,
+                                               VkImportMemoryWin32HandleInfoNV* toMap);
 
-void handlemap_VkExportMemoryWin32HandleInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkExportMemoryWin32HandleInfoNV* toMap);
+void handlemap_VkExportMemoryWin32HandleInfoNV(VulkanHandleMapping* handlemap,
+                                               VkExportMemoryWin32HandleInfoNV* toMap);
 
 #endif
 #ifdef VK_NV_win32_keyed_mutex
-void handlemap_VkWin32KeyedMutexAcquireReleaseInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkWin32KeyedMutexAcquireReleaseInfoNV* toMap);
+void handlemap_VkWin32KeyedMutexAcquireReleaseInfoNV(VulkanHandleMapping* handlemap,
+                                                     VkWin32KeyedMutexAcquireReleaseInfoNV* toMap);
 
 #endif
 #ifdef VK_EXT_validation_flags
-void handlemap_VkValidationFlagsEXT(
-    VulkanHandleMapping* handlemap,
-    VkValidationFlagsEXT* toMap);
+void handlemap_VkValidationFlagsEXT(VulkanHandleMapping* handlemap, VkValidationFlagsEXT* toMap);
 
 #endif
 #ifdef VK_NN_vi_surface
-void handlemap_VkViSurfaceCreateInfoNN(
-    VulkanHandleMapping* handlemap,
-    VkViSurfaceCreateInfoNN* toMap);
+void handlemap_VkViSurfaceCreateInfoNN(VulkanHandleMapping* handlemap,
+                                       VkViSurfaceCreateInfoNN* toMap);
 
 #endif
 #ifdef VK_EXT_shader_subgroup_ballot
@@ -2206,42 +1761,33 @@
 #endif
 #ifdef VK_EXT_texture_compression_astc_hdr
 void handlemap_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* toMap);
 
 #endif
 #ifdef VK_EXT_astc_decode_mode
-void handlemap_VkImageViewASTCDecodeModeEXT(
-    VulkanHandleMapping* handlemap,
-    VkImageViewASTCDecodeModeEXT* toMap);
+void handlemap_VkImageViewASTCDecodeModeEXT(VulkanHandleMapping* handlemap,
+                                            VkImageViewASTCDecodeModeEXT* toMap);
 
-void handlemap_VkPhysicalDeviceASTCDecodeFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceASTCDecodeFeaturesEXT* toMap);
+void handlemap_VkPhysicalDeviceASTCDecodeFeaturesEXT(VulkanHandleMapping* handlemap,
+                                                     VkPhysicalDeviceASTCDecodeFeaturesEXT* toMap);
 
 #endif
 #ifdef VK_EXT_conditional_rendering
-void handlemap_VkConditionalRenderingBeginInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkConditionalRenderingBeginInfoEXT* toMap);
+void handlemap_VkConditionalRenderingBeginInfoEXT(VulkanHandleMapping* handlemap,
+                                                  VkConditionalRenderingBeginInfoEXT* toMap);
 
 void handlemap_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceConditionalRenderingFeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceConditionalRenderingFeaturesEXT* toMap);
 
 void handlemap_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkCommandBufferInheritanceConditionalRenderingInfoEXT* toMap);
+    VulkanHandleMapping* handlemap, VkCommandBufferInheritanceConditionalRenderingInfoEXT* toMap);
 
 #endif
 #ifdef VK_NV_clip_space_w_scaling
-void handlemap_VkViewportWScalingNV(
-    VulkanHandleMapping* handlemap,
-    VkViewportWScalingNV* toMap);
+void handlemap_VkViewportWScalingNV(VulkanHandleMapping* handlemap, VkViewportWScalingNV* toMap);
 
 void handlemap_VkPipelineViewportWScalingStateCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkPipelineViewportWScalingStateCreateInfoNV* toMap);
+    VulkanHandleMapping* handlemap, VkPipelineViewportWScalingStateCreateInfoNV* toMap);
 
 #endif
 #ifdef VK_EXT_direct_mode_display
@@ -2249,45 +1795,32 @@
 #ifdef VK_EXT_acquire_xlib_display
 #endif
 #ifdef VK_EXT_display_surface_counter
-void handlemap_VkSurfaceCapabilities2EXT(
-    VulkanHandleMapping* handlemap,
-    VkSurfaceCapabilities2EXT* toMap);
+void handlemap_VkSurfaceCapabilities2EXT(VulkanHandleMapping* handlemap,
+                                         VkSurfaceCapabilities2EXT* toMap);
 
 #endif
 #ifdef VK_EXT_display_control
-void handlemap_VkDisplayPowerInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkDisplayPowerInfoEXT* toMap);
+void handlemap_VkDisplayPowerInfoEXT(VulkanHandleMapping* handlemap, VkDisplayPowerInfoEXT* toMap);
 
-void handlemap_VkDeviceEventInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkDeviceEventInfoEXT* toMap);
+void handlemap_VkDeviceEventInfoEXT(VulkanHandleMapping* handlemap, VkDeviceEventInfoEXT* toMap);
 
-void handlemap_VkDisplayEventInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkDisplayEventInfoEXT* toMap);
+void handlemap_VkDisplayEventInfoEXT(VulkanHandleMapping* handlemap, VkDisplayEventInfoEXT* toMap);
 
-void handlemap_VkSwapchainCounterCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkSwapchainCounterCreateInfoEXT* toMap);
+void handlemap_VkSwapchainCounterCreateInfoEXT(VulkanHandleMapping* handlemap,
+                                               VkSwapchainCounterCreateInfoEXT* toMap);
 
 #endif
 #ifdef VK_GOOGLE_display_timing
-void handlemap_VkRefreshCycleDurationGOOGLE(
-    VulkanHandleMapping* handlemap,
-    VkRefreshCycleDurationGOOGLE* toMap);
+void handlemap_VkRefreshCycleDurationGOOGLE(VulkanHandleMapping* handlemap,
+                                            VkRefreshCycleDurationGOOGLE* toMap);
 
-void handlemap_VkPastPresentationTimingGOOGLE(
-    VulkanHandleMapping* handlemap,
-    VkPastPresentationTimingGOOGLE* toMap);
+void handlemap_VkPastPresentationTimingGOOGLE(VulkanHandleMapping* handlemap,
+                                              VkPastPresentationTimingGOOGLE* toMap);
 
-void handlemap_VkPresentTimeGOOGLE(
-    VulkanHandleMapping* handlemap,
-    VkPresentTimeGOOGLE* toMap);
+void handlemap_VkPresentTimeGOOGLE(VulkanHandleMapping* handlemap, VkPresentTimeGOOGLE* toMap);
 
-void handlemap_VkPresentTimesInfoGOOGLE(
-    VulkanHandleMapping* handlemap,
-    VkPresentTimesInfoGOOGLE* toMap);
+void handlemap_VkPresentTimesInfoGOOGLE(VulkanHandleMapping* handlemap,
+                                        VkPresentTimesInfoGOOGLE* toMap);
 
 #endif
 #ifdef VK_NV_sample_mask_override_coverage
@@ -2298,72 +1831,56 @@
 #endif
 #ifdef VK_NVX_multiview_per_view_attributes
 void handlemap_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* toMap);
 
 #endif
 #ifdef VK_NV_viewport_swizzle
-void handlemap_VkViewportSwizzleNV(
-    VulkanHandleMapping* handlemap,
-    VkViewportSwizzleNV* toMap);
+void handlemap_VkViewportSwizzleNV(VulkanHandleMapping* handlemap, VkViewportSwizzleNV* toMap);
 
 void handlemap_VkPipelineViewportSwizzleStateCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkPipelineViewportSwizzleStateCreateInfoNV* toMap);
+    VulkanHandleMapping* handlemap, VkPipelineViewportSwizzleStateCreateInfoNV* toMap);
 
 #endif
 #ifdef VK_EXT_discard_rectangles
 void handlemap_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceDiscardRectanglePropertiesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceDiscardRectanglePropertiesEXT* toMap);
 
 void handlemap_VkPipelineDiscardRectangleStateCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkPipelineDiscardRectangleStateCreateInfoEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPipelineDiscardRectangleStateCreateInfoEXT* toMap);
 
 #endif
 #ifdef VK_EXT_conservative_rasterization
 void handlemap_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceConservativeRasterizationPropertiesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceConservativeRasterizationPropertiesEXT* toMap);
 
 void handlemap_VkPipelineRasterizationConservativeStateCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkPipelineRasterizationConservativeStateCreateInfoEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPipelineRasterizationConservativeStateCreateInfoEXT* toMap);
 
 #endif
 #ifdef VK_EXT_depth_clip_enable
 void handlemap_VkPhysicalDeviceDepthClipEnableFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceDepthClipEnableFeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceDepthClipEnableFeaturesEXT* toMap);
 
 void handlemap_VkPipelineRasterizationDepthClipStateCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkPipelineRasterizationDepthClipStateCreateInfoEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPipelineRasterizationDepthClipStateCreateInfoEXT* toMap);
 
 #endif
 #ifdef VK_EXT_swapchain_colorspace
 #endif
 #ifdef VK_EXT_hdr_metadata
-void handlemap_VkXYColorEXT(
-    VulkanHandleMapping* handlemap,
-    VkXYColorEXT* toMap);
+void handlemap_VkXYColorEXT(VulkanHandleMapping* handlemap, VkXYColorEXT* toMap);
 
-void handlemap_VkHdrMetadataEXT(
-    VulkanHandleMapping* handlemap,
-    VkHdrMetadataEXT* toMap);
+void handlemap_VkHdrMetadataEXT(VulkanHandleMapping* handlemap, VkHdrMetadataEXT* toMap);
 
 #endif
 #ifdef VK_MVK_ios_surface
-void handlemap_VkIOSSurfaceCreateInfoMVK(
-    VulkanHandleMapping* handlemap,
-    VkIOSSurfaceCreateInfoMVK* toMap);
+void handlemap_VkIOSSurfaceCreateInfoMVK(VulkanHandleMapping* handlemap,
+                                         VkIOSSurfaceCreateInfoMVK* toMap);
 
 #endif
 #ifdef VK_MVK_macos_surface
-void handlemap_VkMacOSSurfaceCreateInfoMVK(
-    VulkanHandleMapping* handlemap,
-    VkMacOSSurfaceCreateInfoMVK* toMap);
+void handlemap_VkMacOSSurfaceCreateInfoMVK(VulkanHandleMapping* handlemap,
+                                           VkMacOSSurfaceCreateInfoMVK* toMap);
 
 #endif
 #ifdef VK_MVK_moltenvk
@@ -2373,61 +1890,50 @@
 #ifdef VK_EXT_queue_family_foreign
 #endif
 #ifdef VK_EXT_debug_utils
-void handlemap_VkDebugUtilsLabelEXT(
-    VulkanHandleMapping* handlemap,
-    VkDebugUtilsLabelEXT* toMap);
+void handlemap_VkDebugUtilsLabelEXT(VulkanHandleMapping* handlemap, VkDebugUtilsLabelEXT* toMap);
 
-void handlemap_VkDebugUtilsObjectNameInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkDebugUtilsObjectNameInfoEXT* toMap);
+void handlemap_VkDebugUtilsObjectNameInfoEXT(VulkanHandleMapping* handlemap,
+                                             VkDebugUtilsObjectNameInfoEXT* toMap);
 
-void handlemap_VkDebugUtilsMessengerCallbackDataEXT(
-    VulkanHandleMapping* handlemap,
-    VkDebugUtilsMessengerCallbackDataEXT* toMap);
+void handlemap_VkDebugUtilsMessengerCallbackDataEXT(VulkanHandleMapping* handlemap,
+                                                    VkDebugUtilsMessengerCallbackDataEXT* toMap);
 
-void handlemap_VkDebugUtilsMessengerCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkDebugUtilsMessengerCreateInfoEXT* toMap);
+void handlemap_VkDebugUtilsMessengerCreateInfoEXT(VulkanHandleMapping* handlemap,
+                                                  VkDebugUtilsMessengerCreateInfoEXT* toMap);
 
-void handlemap_VkDebugUtilsObjectTagInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkDebugUtilsObjectTagInfoEXT* toMap);
+void handlemap_VkDebugUtilsObjectTagInfoEXT(VulkanHandleMapping* handlemap,
+                                            VkDebugUtilsObjectTagInfoEXT* toMap);
 
 #endif
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
-void handlemap_VkAndroidHardwareBufferUsageANDROID(
-    VulkanHandleMapping* handlemap,
-    VkAndroidHardwareBufferUsageANDROID* toMap);
+void handlemap_VkAndroidHardwareBufferUsageANDROID(VulkanHandleMapping* handlemap,
+                                                   VkAndroidHardwareBufferUsageANDROID* toMap);
 
 void handlemap_VkAndroidHardwareBufferPropertiesANDROID(
-    VulkanHandleMapping* handlemap,
-    VkAndroidHardwareBufferPropertiesANDROID* toMap);
+    VulkanHandleMapping* handlemap, VkAndroidHardwareBufferPropertiesANDROID* toMap);
 
 void handlemap_VkAndroidHardwareBufferFormatPropertiesANDROID(
-    VulkanHandleMapping* handlemap,
-    VkAndroidHardwareBufferFormatPropertiesANDROID* toMap);
+    VulkanHandleMapping* handlemap, VkAndroidHardwareBufferFormatPropertiesANDROID* toMap);
 
 void handlemap_VkImportAndroidHardwareBufferInfoANDROID(
-    VulkanHandleMapping* handlemap,
-    VkImportAndroidHardwareBufferInfoANDROID* toMap);
+    VulkanHandleMapping* handlemap, VkImportAndroidHardwareBufferInfoANDROID* toMap);
 
 void handlemap_VkMemoryGetAndroidHardwareBufferInfoANDROID(
-    VulkanHandleMapping* handlemap,
-    VkMemoryGetAndroidHardwareBufferInfoANDROID* toMap);
+    VulkanHandleMapping* handlemap, VkMemoryGetAndroidHardwareBufferInfoANDROID* toMap);
 
-void handlemap_VkExternalFormatANDROID(
-    VulkanHandleMapping* handlemap,
-    VkExternalFormatANDROID* toMap);
+void handlemap_VkExternalFormatANDROID(VulkanHandleMapping* handlemap,
+                                       VkExternalFormatANDROID* toMap);
 
 void handlemap_VkAndroidHardwareBufferFormatProperties2ANDROID(
-    VulkanHandleMapping* handlemap,
-    VkAndroidHardwareBufferFormatProperties2ANDROID* toMap);
+    VulkanHandleMapping* handlemap, VkAndroidHardwareBufferFormatProperties2ANDROID* toMap);
 
 #endif
 #ifdef VK_EXT_sampler_filter_minmax
-DEFINE_ALIAS_FUNCTION(handlemap_VkSamplerReductionModeCreateInfo, handlemap_VkSamplerReductionModeCreateInfoEXT)
+DEFINE_ALIAS_FUNCTION(handlemap_VkSamplerReductionModeCreateInfo,
+                      handlemap_VkSamplerReductionModeCreateInfoEXT)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceSamplerFilterMinmaxProperties, handlemap_VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceSamplerFilterMinmaxProperties,
+                      handlemap_VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT)
 
 #endif
 #ifdef VK_AMD_gpu_shader_int16
@@ -2438,526 +1944,422 @@
 #endif
 #ifdef VK_EXT_inline_uniform_block
 void handlemap_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceInlineUniformBlockFeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceInlineUniformBlockFeaturesEXT* toMap);
 
 void handlemap_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceInlineUniformBlockPropertiesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceInlineUniformBlockPropertiesEXT* toMap);
 
 void handlemap_VkWriteDescriptorSetInlineUniformBlockEXT(
-    VulkanHandleMapping* handlemap,
-    VkWriteDescriptorSetInlineUniformBlockEXT* toMap);
+    VulkanHandleMapping* handlemap, VkWriteDescriptorSetInlineUniformBlockEXT* toMap);
 
 void handlemap_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkDescriptorPoolInlineUniformBlockCreateInfoEXT* toMap);
+    VulkanHandleMapping* handlemap, VkDescriptorPoolInlineUniformBlockCreateInfoEXT* toMap);
 
 #endif
 #ifdef VK_EXT_shader_stencil_export
 #endif
 #ifdef VK_EXT_sample_locations
-void handlemap_VkSampleLocationEXT(
-    VulkanHandleMapping* handlemap,
-    VkSampleLocationEXT* toMap);
+void handlemap_VkSampleLocationEXT(VulkanHandleMapping* handlemap, VkSampleLocationEXT* toMap);
 
-void handlemap_VkSampleLocationsInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkSampleLocationsInfoEXT* toMap);
+void handlemap_VkSampleLocationsInfoEXT(VulkanHandleMapping* handlemap,
+                                        VkSampleLocationsInfoEXT* toMap);
 
-void handlemap_VkAttachmentSampleLocationsEXT(
-    VulkanHandleMapping* handlemap,
-    VkAttachmentSampleLocationsEXT* toMap);
+void handlemap_VkAttachmentSampleLocationsEXT(VulkanHandleMapping* handlemap,
+                                              VkAttachmentSampleLocationsEXT* toMap);
 
-void handlemap_VkSubpassSampleLocationsEXT(
-    VulkanHandleMapping* handlemap,
-    VkSubpassSampleLocationsEXT* toMap);
+void handlemap_VkSubpassSampleLocationsEXT(VulkanHandleMapping* handlemap,
+                                           VkSubpassSampleLocationsEXT* toMap);
 
 void handlemap_VkRenderPassSampleLocationsBeginInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkRenderPassSampleLocationsBeginInfoEXT* toMap);
+    VulkanHandleMapping* handlemap, VkRenderPassSampleLocationsBeginInfoEXT* toMap);
 
 void handlemap_VkPipelineSampleLocationsStateCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkPipelineSampleLocationsStateCreateInfoEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPipelineSampleLocationsStateCreateInfoEXT* toMap);
 
 void handlemap_VkPhysicalDeviceSampleLocationsPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceSampleLocationsPropertiesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceSampleLocationsPropertiesEXT* toMap);
 
-void handlemap_VkMultisamplePropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkMultisamplePropertiesEXT* toMap);
+void handlemap_VkMultisamplePropertiesEXT(VulkanHandleMapping* handlemap,
+                                          VkMultisamplePropertiesEXT* toMap);
 
 #endif
 #ifdef VK_EXT_blend_operation_advanced
 void handlemap_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* toMap);
 
 void handlemap_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* toMap);
 
 void handlemap_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkPipelineColorBlendAdvancedStateCreateInfoEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPipelineColorBlendAdvancedStateCreateInfoEXT* toMap);
 
 #endif
 #ifdef VK_NV_fragment_coverage_to_color
 void handlemap_VkPipelineCoverageToColorStateCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkPipelineCoverageToColorStateCreateInfoNV* toMap);
+    VulkanHandleMapping* handlemap, VkPipelineCoverageToColorStateCreateInfoNV* toMap);
 
 #endif
 #ifdef VK_NV_framebuffer_mixed_samples
 void handlemap_VkPipelineCoverageModulationStateCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkPipelineCoverageModulationStateCreateInfoNV* toMap);
+    VulkanHandleMapping* handlemap, VkPipelineCoverageModulationStateCreateInfoNV* toMap);
 
 #endif
 #ifdef VK_NV_fill_rectangle
 #endif
 #ifdef VK_NV_shader_sm_builtins
 void handlemap_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* toMap);
 
 void handlemap_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* toMap);
 
 #endif
 #ifdef VK_EXT_post_depth_coverage
 #endif
 #ifdef VK_EXT_image_drm_format_modifier
-void handlemap_VkDrmFormatModifierPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkDrmFormatModifierPropertiesEXT* toMap);
+void handlemap_VkDrmFormatModifierPropertiesEXT(VulkanHandleMapping* handlemap,
+                                                VkDrmFormatModifierPropertiesEXT* toMap);
 
-void handlemap_VkDrmFormatModifierPropertiesListEXT(
-    VulkanHandleMapping* handlemap,
-    VkDrmFormatModifierPropertiesListEXT* toMap);
+void handlemap_VkDrmFormatModifierPropertiesListEXT(VulkanHandleMapping* handlemap,
+                                                    VkDrmFormatModifierPropertiesListEXT* toMap);
 
 void handlemap_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceImageDrmFormatModifierInfoEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceImageDrmFormatModifierInfoEXT* toMap);
 
 void handlemap_VkImageDrmFormatModifierListCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkImageDrmFormatModifierListCreateInfoEXT* toMap);
+    VulkanHandleMapping* handlemap, VkImageDrmFormatModifierListCreateInfoEXT* toMap);
 
 void handlemap_VkImageDrmFormatModifierExplicitCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkImageDrmFormatModifierExplicitCreateInfoEXT* toMap);
+    VulkanHandleMapping* handlemap, VkImageDrmFormatModifierExplicitCreateInfoEXT* toMap);
 
-void handlemap_VkImageDrmFormatModifierPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkImageDrmFormatModifierPropertiesEXT* toMap);
+void handlemap_VkImageDrmFormatModifierPropertiesEXT(VulkanHandleMapping* handlemap,
+                                                     VkImageDrmFormatModifierPropertiesEXT* toMap);
 
-void handlemap_VkDrmFormatModifierProperties2EXT(
-    VulkanHandleMapping* handlemap,
-    VkDrmFormatModifierProperties2EXT* toMap);
+void handlemap_VkDrmFormatModifierProperties2EXT(VulkanHandleMapping* handlemap,
+                                                 VkDrmFormatModifierProperties2EXT* toMap);
 
-void handlemap_VkDrmFormatModifierPropertiesList2EXT(
-    VulkanHandleMapping* handlemap,
-    VkDrmFormatModifierPropertiesList2EXT* toMap);
+void handlemap_VkDrmFormatModifierPropertiesList2EXT(VulkanHandleMapping* handlemap,
+                                                     VkDrmFormatModifierPropertiesList2EXT* toMap);
 
 #endif
 #ifdef VK_EXT_validation_cache
-void handlemap_VkValidationCacheCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkValidationCacheCreateInfoEXT* toMap);
+void handlemap_VkValidationCacheCreateInfoEXT(VulkanHandleMapping* handlemap,
+                                              VkValidationCacheCreateInfoEXT* toMap);
 
 void handlemap_VkShaderModuleValidationCacheCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkShaderModuleValidationCacheCreateInfoEXT* toMap);
+    VulkanHandleMapping* handlemap, VkShaderModuleValidationCacheCreateInfoEXT* toMap);
 
 #endif
 #ifdef VK_EXT_descriptor_indexing
-DEFINE_ALIAS_FUNCTION(handlemap_VkDescriptorSetLayoutBindingFlagsCreateInfo, handlemap_VkDescriptorSetLayoutBindingFlagsCreateInfoEXT)
+DEFINE_ALIAS_FUNCTION(handlemap_VkDescriptorSetLayoutBindingFlagsCreateInfo,
+                      handlemap_VkDescriptorSetLayoutBindingFlagsCreateInfoEXT)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceDescriptorIndexingFeatures, handlemap_VkPhysicalDeviceDescriptorIndexingFeaturesEXT)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceDescriptorIndexingFeatures,
+                      handlemap_VkPhysicalDeviceDescriptorIndexingFeaturesEXT)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceDescriptorIndexingProperties, handlemap_VkPhysicalDeviceDescriptorIndexingPropertiesEXT)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceDescriptorIndexingProperties,
+                      handlemap_VkPhysicalDeviceDescriptorIndexingPropertiesEXT)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkDescriptorSetVariableDescriptorCountAllocateInfo, handlemap_VkDescriptorSetVariableDescriptorCountAllocateInfoEXT)
+DEFINE_ALIAS_FUNCTION(handlemap_VkDescriptorSetVariableDescriptorCountAllocateInfo,
+                      handlemap_VkDescriptorSetVariableDescriptorCountAllocateInfoEXT)
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkDescriptorSetVariableDescriptorCountLayoutSupport, handlemap_VkDescriptorSetVariableDescriptorCountLayoutSupportEXT)
+DEFINE_ALIAS_FUNCTION(handlemap_VkDescriptorSetVariableDescriptorCountLayoutSupport,
+                      handlemap_VkDescriptorSetVariableDescriptorCountLayoutSupportEXT)
 
 #endif
 #ifdef VK_EXT_shader_viewport_index_layer
 #endif
 #ifdef VK_NV_shading_rate_image
-void handlemap_VkShadingRatePaletteNV(
-    VulkanHandleMapping* handlemap,
-    VkShadingRatePaletteNV* toMap);
+void handlemap_VkShadingRatePaletteNV(VulkanHandleMapping* handlemap,
+                                      VkShadingRatePaletteNV* toMap);
 
 void handlemap_VkPipelineViewportShadingRateImageStateCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkPipelineViewportShadingRateImageStateCreateInfoNV* toMap);
+    VulkanHandleMapping* handlemap, VkPipelineViewportShadingRateImageStateCreateInfoNV* toMap);
 
 void handlemap_VkPhysicalDeviceShadingRateImageFeaturesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShadingRateImageFeaturesNV* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShadingRateImageFeaturesNV* toMap);
 
 void handlemap_VkPhysicalDeviceShadingRateImagePropertiesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShadingRateImagePropertiesNV* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShadingRateImagePropertiesNV* toMap);
 
-void handlemap_VkCoarseSampleLocationNV(
-    VulkanHandleMapping* handlemap,
-    VkCoarseSampleLocationNV* toMap);
+void handlemap_VkCoarseSampleLocationNV(VulkanHandleMapping* handlemap,
+                                        VkCoarseSampleLocationNV* toMap);
 
-void handlemap_VkCoarseSampleOrderCustomNV(
-    VulkanHandleMapping* handlemap,
-    VkCoarseSampleOrderCustomNV* toMap);
+void handlemap_VkCoarseSampleOrderCustomNV(VulkanHandleMapping* handlemap,
+                                           VkCoarseSampleOrderCustomNV* toMap);
 
 void handlemap_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* toMap);
+    VulkanHandleMapping* handlemap, VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* toMap);
 
 #endif
 #ifdef VK_NV_ray_tracing
-void handlemap_VkRayTracingShaderGroupCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkRayTracingShaderGroupCreateInfoNV* toMap);
+void handlemap_VkRayTracingShaderGroupCreateInfoNV(VulkanHandleMapping* handlemap,
+                                                   VkRayTracingShaderGroupCreateInfoNV* toMap);
 
-void handlemap_VkRayTracingPipelineCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkRayTracingPipelineCreateInfoNV* toMap);
+void handlemap_VkRayTracingPipelineCreateInfoNV(VulkanHandleMapping* handlemap,
+                                                VkRayTracingPipelineCreateInfoNV* toMap);
 
-void handlemap_VkGeometryTrianglesNV(
-    VulkanHandleMapping* handlemap,
-    VkGeometryTrianglesNV* toMap);
+void handlemap_VkGeometryTrianglesNV(VulkanHandleMapping* handlemap, VkGeometryTrianglesNV* toMap);
 
-void handlemap_VkGeometryAABBNV(
-    VulkanHandleMapping* handlemap,
-    VkGeometryAABBNV* toMap);
+void handlemap_VkGeometryAABBNV(VulkanHandleMapping* handlemap, VkGeometryAABBNV* toMap);
 
-void handlemap_VkGeometryDataNV(
-    VulkanHandleMapping* handlemap,
-    VkGeometryDataNV* toMap);
+void handlemap_VkGeometryDataNV(VulkanHandleMapping* handlemap, VkGeometryDataNV* toMap);
 
-void handlemap_VkGeometryNV(
-    VulkanHandleMapping* handlemap,
-    VkGeometryNV* toMap);
+void handlemap_VkGeometryNV(VulkanHandleMapping* handlemap, VkGeometryNV* toMap);
 
-void handlemap_VkAccelerationStructureInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureInfoNV* toMap);
+void handlemap_VkAccelerationStructureInfoNV(VulkanHandleMapping* handlemap,
+                                             VkAccelerationStructureInfoNV* toMap);
 
-void handlemap_VkAccelerationStructureCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureCreateInfoNV* toMap);
+void handlemap_VkAccelerationStructureCreateInfoNV(VulkanHandleMapping* handlemap,
+                                                   VkAccelerationStructureCreateInfoNV* toMap);
 
 void handlemap_VkBindAccelerationStructureMemoryInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkBindAccelerationStructureMemoryInfoNV* toMap);
+    VulkanHandleMapping* handlemap, VkBindAccelerationStructureMemoryInfoNV* toMap);
 
 void handlemap_VkWriteDescriptorSetAccelerationStructureNV(
-    VulkanHandleMapping* handlemap,
-    VkWriteDescriptorSetAccelerationStructureNV* toMap);
+    VulkanHandleMapping* handlemap, VkWriteDescriptorSetAccelerationStructureNV* toMap);
 
 void handlemap_VkAccelerationStructureMemoryRequirementsInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureMemoryRequirementsInfoNV* toMap);
+    VulkanHandleMapping* handlemap, VkAccelerationStructureMemoryRequirementsInfoNV* toMap);
 
 void handlemap_VkPhysicalDeviceRayTracingPropertiesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceRayTracingPropertiesNV* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceRayTracingPropertiesNV* toMap);
 
-void handlemap_VkTransformMatrixKHR(
-    VulkanHandleMapping* handlemap,
-    VkTransformMatrixKHR* toMap);
+void handlemap_VkTransformMatrixKHR(VulkanHandleMapping* handlemap, VkTransformMatrixKHR* toMap);
 
 DEFINE_ALIAS_FUNCTION(handlemap_VkTransformMatrixKHR, handlemap_VkTransformMatrixNV)
 
-void handlemap_VkAabbPositionsKHR(
-    VulkanHandleMapping* handlemap,
-    VkAabbPositionsKHR* toMap);
+void handlemap_VkAabbPositionsKHR(VulkanHandleMapping* handlemap, VkAabbPositionsKHR* toMap);
 
 DEFINE_ALIAS_FUNCTION(handlemap_VkAabbPositionsKHR, handlemap_VkAabbPositionsNV)
 
-void handlemap_VkAccelerationStructureInstanceKHR(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureInstanceKHR* toMap);
+void handlemap_VkAccelerationStructureInstanceKHR(VulkanHandleMapping* handlemap,
+                                                  VkAccelerationStructureInstanceKHR* toMap);
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkAccelerationStructureInstanceKHR, handlemap_VkAccelerationStructureInstanceNV)
+DEFINE_ALIAS_FUNCTION(handlemap_VkAccelerationStructureInstanceKHR,
+                      handlemap_VkAccelerationStructureInstanceNV)
 
 #endif
 #ifdef VK_NV_representative_fragment_test
 void handlemap_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* toMap);
 
 void handlemap_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkPipelineRepresentativeFragmentTestStateCreateInfoNV* toMap);
+    VulkanHandleMapping* handlemap, VkPipelineRepresentativeFragmentTestStateCreateInfoNV* toMap);
 
 #endif
 #ifdef VK_EXT_filter_cubic
 void handlemap_VkPhysicalDeviceImageViewImageFormatInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceImageViewImageFormatInfoEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceImageViewImageFormatInfoEXT* toMap);
 
 void handlemap_VkFilterCubicImageViewImageFormatPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkFilterCubicImageViewImageFormatPropertiesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkFilterCubicImageViewImageFormatPropertiesEXT* toMap);
 
 #endif
 #ifdef VK_QCOM_render_pass_shader_resolve
 #endif
 #ifdef VK_EXT_global_priority
 void handlemap_VkDeviceQueueGlobalPriorityCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkDeviceQueueGlobalPriorityCreateInfoEXT* toMap);
+    VulkanHandleMapping* handlemap, VkDeviceQueueGlobalPriorityCreateInfoEXT* toMap);
 
 #endif
 #ifdef VK_EXT_external_memory_host
-void handlemap_VkImportMemoryHostPointerInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkImportMemoryHostPointerInfoEXT* toMap);
+void handlemap_VkImportMemoryHostPointerInfoEXT(VulkanHandleMapping* handlemap,
+                                                VkImportMemoryHostPointerInfoEXT* toMap);
 
-void handlemap_VkMemoryHostPointerPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkMemoryHostPointerPropertiesEXT* toMap);
+void handlemap_VkMemoryHostPointerPropertiesEXT(VulkanHandleMapping* handlemap,
+                                                VkMemoryHostPointerPropertiesEXT* toMap);
 
 void handlemap_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceExternalMemoryHostPropertiesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceExternalMemoryHostPropertiesEXT* toMap);
 
 #endif
 #ifdef VK_AMD_buffer_marker
 #endif
 #ifdef VK_AMD_pipeline_compiler_control
 void handlemap_VkPipelineCompilerControlCreateInfoAMD(
-    VulkanHandleMapping* handlemap,
-    VkPipelineCompilerControlCreateInfoAMD* toMap);
+    VulkanHandleMapping* handlemap, VkPipelineCompilerControlCreateInfoAMD* toMap);
 
 #endif
 #ifdef VK_EXT_calibrated_timestamps
-void handlemap_VkCalibratedTimestampInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkCalibratedTimestampInfoEXT* toMap);
+void handlemap_VkCalibratedTimestampInfoEXT(VulkanHandleMapping* handlemap,
+                                            VkCalibratedTimestampInfoEXT* toMap);
 
 #endif
 #ifdef VK_AMD_shader_core_properties
 void handlemap_VkPhysicalDeviceShaderCorePropertiesAMD(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShaderCorePropertiesAMD* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShaderCorePropertiesAMD* toMap);
 
 #endif
 #ifdef VK_EXT_video_decode_h265
-void handlemap_VkVideoDecodeH265ProfileEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoDecodeH265ProfileEXT* toMap);
+void handlemap_VkVideoDecodeH265ProfileEXT(VulkanHandleMapping* handlemap,
+                                           VkVideoDecodeH265ProfileEXT* toMap);
 
-void handlemap_VkVideoDecodeH265CapabilitiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoDecodeH265CapabilitiesEXT* toMap);
+void handlemap_VkVideoDecodeH265CapabilitiesEXT(VulkanHandleMapping* handlemap,
+                                                VkVideoDecodeH265CapabilitiesEXT* toMap);
 
-void handlemap_VkVideoDecodeH265SessionCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoDecodeH265SessionCreateInfoEXT* toMap);
+void handlemap_VkVideoDecodeH265SessionCreateInfoEXT(VulkanHandleMapping* handlemap,
+                                                     VkVideoDecodeH265SessionCreateInfoEXT* toMap);
 
 void handlemap_VkVideoDecodeH265SessionParametersAddInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoDecodeH265SessionParametersAddInfoEXT* toMap);
+    VulkanHandleMapping* handlemap, VkVideoDecodeH265SessionParametersAddInfoEXT* toMap);
 
 void handlemap_VkVideoDecodeH265SessionParametersCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoDecodeH265SessionParametersCreateInfoEXT* toMap);
+    VulkanHandleMapping* handlemap, VkVideoDecodeH265SessionParametersCreateInfoEXT* toMap);
 
-void handlemap_VkVideoDecodeH265PictureInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoDecodeH265PictureInfoEXT* toMap);
+void handlemap_VkVideoDecodeH265PictureInfoEXT(VulkanHandleMapping* handlemap,
+                                               VkVideoDecodeH265PictureInfoEXT* toMap);
 
-void handlemap_VkVideoDecodeH265DpbSlotInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkVideoDecodeH265DpbSlotInfoEXT* toMap);
+void handlemap_VkVideoDecodeH265DpbSlotInfoEXT(VulkanHandleMapping* handlemap,
+                                               VkVideoDecodeH265DpbSlotInfoEXT* toMap);
 
 #endif
 #ifdef VK_AMD_memory_overallocation_behavior
 void handlemap_VkDeviceMemoryOverallocationCreateInfoAMD(
-    VulkanHandleMapping* handlemap,
-    VkDeviceMemoryOverallocationCreateInfoAMD* toMap);
+    VulkanHandleMapping* handlemap, VkDeviceMemoryOverallocationCreateInfoAMD* toMap);
 
 #endif
 #ifdef VK_EXT_vertex_attribute_divisor
 void handlemap_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* toMap);
 
 void handlemap_VkVertexInputBindingDivisorDescriptionEXT(
-    VulkanHandleMapping* handlemap,
-    VkVertexInputBindingDivisorDescriptionEXT* toMap);
+    VulkanHandleMapping* handlemap, VkVertexInputBindingDivisorDescriptionEXT* toMap);
 
 void handlemap_VkPipelineVertexInputDivisorStateCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkPipelineVertexInputDivisorStateCreateInfoEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPipelineVertexInputDivisorStateCreateInfoEXT* toMap);
 
 void handlemap_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* toMap);
 
 #endif
 #ifdef VK_GGP_frame_token
-void handlemap_VkPresentFrameTokenGGP(
-    VulkanHandleMapping* handlemap,
-    VkPresentFrameTokenGGP* toMap);
+void handlemap_VkPresentFrameTokenGGP(VulkanHandleMapping* handlemap,
+                                      VkPresentFrameTokenGGP* toMap);
 
 #endif
 #ifdef VK_EXT_pipeline_creation_feedback
-void handlemap_VkPipelineCreationFeedbackEXT(
-    VulkanHandleMapping* handlemap,
-    VkPipelineCreationFeedbackEXT* toMap);
+void handlemap_VkPipelineCreationFeedbackEXT(VulkanHandleMapping* handlemap,
+                                             VkPipelineCreationFeedbackEXT* toMap);
 
 void handlemap_VkPipelineCreationFeedbackCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkPipelineCreationFeedbackCreateInfoEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPipelineCreationFeedbackCreateInfoEXT* toMap);
 
 #endif
 #ifdef VK_NV_shader_subgroup_partitioned
 #endif
 #ifdef VK_NV_compute_shader_derivatives
 void handlemap_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* toMap);
 
 #endif
 #ifdef VK_NV_mesh_shader
-void handlemap_VkPhysicalDeviceMeshShaderFeaturesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceMeshShaderFeaturesNV* toMap);
+void handlemap_VkPhysicalDeviceMeshShaderFeaturesNV(VulkanHandleMapping* handlemap,
+                                                    VkPhysicalDeviceMeshShaderFeaturesNV* toMap);
 
 void handlemap_VkPhysicalDeviceMeshShaderPropertiesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceMeshShaderPropertiesNV* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceMeshShaderPropertiesNV* toMap);
 
-void handlemap_VkDrawMeshTasksIndirectCommandNV(
-    VulkanHandleMapping* handlemap,
-    VkDrawMeshTasksIndirectCommandNV* toMap);
+void handlemap_VkDrawMeshTasksIndirectCommandNV(VulkanHandleMapping* handlemap,
+                                                VkDrawMeshTasksIndirectCommandNV* toMap);
 
 #endif
 #ifdef VK_NV_fragment_shader_barycentric
 void handlemap_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* toMap);
 
 #endif
 #ifdef VK_NV_shader_image_footprint
 void handlemap_VkPhysicalDeviceShaderImageFootprintFeaturesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShaderImageFootprintFeaturesNV* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShaderImageFootprintFeaturesNV* toMap);
 
 #endif
 #ifdef VK_NV_scissor_exclusive
 void handlemap_VkPipelineViewportExclusiveScissorStateCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkPipelineViewportExclusiveScissorStateCreateInfoNV* toMap);
+    VulkanHandleMapping* handlemap, VkPipelineViewportExclusiveScissorStateCreateInfoNV* toMap);
 
 void handlemap_VkPhysicalDeviceExclusiveScissorFeaturesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceExclusiveScissorFeaturesNV* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceExclusiveScissorFeaturesNV* toMap);
 
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
-void handlemap_VkQueueFamilyCheckpointPropertiesNV(
-    VulkanHandleMapping* handlemap,
-    VkQueueFamilyCheckpointPropertiesNV* toMap);
+void handlemap_VkQueueFamilyCheckpointPropertiesNV(VulkanHandleMapping* handlemap,
+                                                   VkQueueFamilyCheckpointPropertiesNV* toMap);
 
-void handlemap_VkCheckpointDataNV(
-    VulkanHandleMapping* handlemap,
-    VkCheckpointDataNV* toMap);
+void handlemap_VkCheckpointDataNV(VulkanHandleMapping* handlemap, VkCheckpointDataNV* toMap);
 
 #endif
 #ifdef VK_INTEL_shader_integer_functions2
 void handlemap_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* toMap);
 
 #endif
 #ifdef VK_INTEL_performance_query
-void handlemap_VkPerformanceValueDataINTEL(
-    VulkanHandleMapping* handlemap,
-    VkPerformanceValueDataINTEL* toMap);
+void handlemap_VkPerformanceValueDataINTEL(VulkanHandleMapping* handlemap,
+                                           VkPerformanceValueDataINTEL* toMap);
 
-void handlemap_VkPerformanceValueINTEL(
-    VulkanHandleMapping* handlemap,
-    VkPerformanceValueINTEL* toMap);
+void handlemap_VkPerformanceValueINTEL(VulkanHandleMapping* handlemap,
+                                       VkPerformanceValueINTEL* toMap);
 
-void handlemap_VkInitializePerformanceApiInfoINTEL(
-    VulkanHandleMapping* handlemap,
-    VkInitializePerformanceApiInfoINTEL* toMap);
+void handlemap_VkInitializePerformanceApiInfoINTEL(VulkanHandleMapping* handlemap,
+                                                   VkInitializePerformanceApiInfoINTEL* toMap);
 
 void handlemap_VkQueryPoolPerformanceQueryCreateInfoINTEL(
-    VulkanHandleMapping* handlemap,
-    VkQueryPoolPerformanceQueryCreateInfoINTEL* toMap);
+    VulkanHandleMapping* handlemap, VkQueryPoolPerformanceQueryCreateInfoINTEL* toMap);
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkQueryPoolPerformanceQueryCreateInfoINTEL, handlemap_VkQueryPoolCreateInfoINTEL)
+DEFINE_ALIAS_FUNCTION(handlemap_VkQueryPoolPerformanceQueryCreateInfoINTEL,
+                      handlemap_VkQueryPoolCreateInfoINTEL)
 
-void handlemap_VkPerformanceMarkerInfoINTEL(
-    VulkanHandleMapping* handlemap,
-    VkPerformanceMarkerInfoINTEL* toMap);
+void handlemap_VkPerformanceMarkerInfoINTEL(VulkanHandleMapping* handlemap,
+                                            VkPerformanceMarkerInfoINTEL* toMap);
 
-void handlemap_VkPerformanceStreamMarkerInfoINTEL(
-    VulkanHandleMapping* handlemap,
-    VkPerformanceStreamMarkerInfoINTEL* toMap);
+void handlemap_VkPerformanceStreamMarkerInfoINTEL(VulkanHandleMapping* handlemap,
+                                                  VkPerformanceStreamMarkerInfoINTEL* toMap);
 
-void handlemap_VkPerformanceOverrideInfoINTEL(
-    VulkanHandleMapping* handlemap,
-    VkPerformanceOverrideInfoINTEL* toMap);
+void handlemap_VkPerformanceOverrideInfoINTEL(VulkanHandleMapping* handlemap,
+                                              VkPerformanceOverrideInfoINTEL* toMap);
 
 void handlemap_VkPerformanceConfigurationAcquireInfoINTEL(
-    VulkanHandleMapping* handlemap,
-    VkPerformanceConfigurationAcquireInfoINTEL* toMap);
+    VulkanHandleMapping* handlemap, VkPerformanceConfigurationAcquireInfoINTEL* toMap);
 
 #endif
 #ifdef VK_EXT_pci_bus_info
 void handlemap_VkPhysicalDevicePCIBusInfoPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDevicePCIBusInfoPropertiesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDevicePCIBusInfoPropertiesEXT* toMap);
 
 #endif
 #ifdef VK_AMD_display_native_hdr
 void handlemap_VkDisplayNativeHdrSurfaceCapabilitiesAMD(
-    VulkanHandleMapping* handlemap,
-    VkDisplayNativeHdrSurfaceCapabilitiesAMD* toMap);
+    VulkanHandleMapping* handlemap, VkDisplayNativeHdrSurfaceCapabilitiesAMD* toMap);
 
 void handlemap_VkSwapchainDisplayNativeHdrCreateInfoAMD(
-    VulkanHandleMapping* handlemap,
-    VkSwapchainDisplayNativeHdrCreateInfoAMD* toMap);
+    VulkanHandleMapping* handlemap, VkSwapchainDisplayNativeHdrCreateInfoAMD* toMap);
 
 #endif
 #ifdef VK_FUCHSIA_imagepipe_surface
-void handlemap_VkImagePipeSurfaceCreateInfoFUCHSIA(
-    VulkanHandleMapping* handlemap,
-    VkImagePipeSurfaceCreateInfoFUCHSIA* toMap);
+void handlemap_VkImagePipeSurfaceCreateInfoFUCHSIA(VulkanHandleMapping* handlemap,
+                                                   VkImagePipeSurfaceCreateInfoFUCHSIA* toMap);
 
 #endif
 #ifdef VK_EXT_metal_surface
-void handlemap_VkMetalSurfaceCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkMetalSurfaceCreateInfoEXT* toMap);
+void handlemap_VkMetalSurfaceCreateInfoEXT(VulkanHandleMapping* handlemap,
+                                           VkMetalSurfaceCreateInfoEXT* toMap);
 
 #endif
 #ifdef VK_EXT_fragment_density_map
 void handlemap_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceFragmentDensityMapFeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceFragmentDensityMapFeaturesEXT* toMap);
 
 void handlemap_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceFragmentDensityMapPropertiesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceFragmentDensityMapPropertiesEXT* toMap);
 
 void handlemap_VkRenderPassFragmentDensityMapCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkRenderPassFragmentDensityMapCreateInfoEXT* toMap);
+    VulkanHandleMapping* handlemap, VkRenderPassFragmentDensityMapCreateInfoEXT* toMap);
 
 #endif
 #ifdef VK_EXT_scalar_block_layout
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceScalarBlockLayoutFeatures, handlemap_VkPhysicalDeviceScalarBlockLayoutFeaturesEXT)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceScalarBlockLayoutFeatures,
+                      handlemap_VkPhysicalDeviceScalarBlockLayoutFeaturesEXT)
 
 #endif
 #ifdef VK_GOOGLE_hlsl_functionality1
@@ -2966,50 +2368,41 @@
 #endif
 #ifdef VK_EXT_subgroup_size_control
 void handlemap_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* toMap);
 
 void handlemap_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* toMap);
 
 void handlemap_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* toMap);
 
 #endif
 #ifdef VK_AMD_shader_core_properties2
 void handlemap_VkPhysicalDeviceShaderCoreProperties2AMD(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShaderCoreProperties2AMD* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShaderCoreProperties2AMD* toMap);
 
 #endif
 #ifdef VK_AMD_device_coherent_memory
 void handlemap_VkPhysicalDeviceCoherentMemoryFeaturesAMD(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceCoherentMemoryFeaturesAMD* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceCoherentMemoryFeaturesAMD* toMap);
 
 #endif
 #ifdef VK_EXT_shader_image_atomic_int64
 void handlemap_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* toMap);
 
 #endif
 #ifdef VK_EXT_memory_budget
 void handlemap_VkPhysicalDeviceMemoryBudgetPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceMemoryBudgetPropertiesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceMemoryBudgetPropertiesEXT* toMap);
 
 #endif
 #ifdef VK_EXT_memory_priority
 void handlemap_VkPhysicalDeviceMemoryPriorityFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceMemoryPriorityFeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceMemoryPriorityFeaturesEXT* toMap);
 
-void handlemap_VkMemoryPriorityAllocateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkMemoryPriorityAllocateInfoEXT* toMap);
+void handlemap_VkMemoryPriorityAllocateInfoEXT(VulkanHandleMapping* handlemap,
+                                               VkMemoryPriorityAllocateInfoEXT* toMap);
 
 #endif
 #ifdef VK_NV_dedicated_allocation_image_aliasing
@@ -3020,82 +2413,70 @@
 #endif
 #ifdef VK_EXT_buffer_device_address
 void handlemap_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* toMap);
 
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT, handlemap_VkPhysicalDeviceBufferAddressFeaturesEXT)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT,
+                      handlemap_VkPhysicalDeviceBufferAddressFeaturesEXT)
 
 DEFINE_ALIAS_FUNCTION(handlemap_VkBufferDeviceAddressInfo, handlemap_VkBufferDeviceAddressInfoEXT)
 
-void handlemap_VkBufferDeviceAddressCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkBufferDeviceAddressCreateInfoEXT* toMap);
+void handlemap_VkBufferDeviceAddressCreateInfoEXT(VulkanHandleMapping* handlemap,
+                                                  VkBufferDeviceAddressCreateInfoEXT* toMap);
 
 #endif
 #ifdef VK_EXT_tooling_info
-void handlemap_VkPhysicalDeviceToolPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceToolPropertiesEXT* toMap);
+void handlemap_VkPhysicalDeviceToolPropertiesEXT(VulkanHandleMapping* handlemap,
+                                                 VkPhysicalDeviceToolPropertiesEXT* toMap);
 
 #endif
 #ifdef VK_EXT_separate_stencil_usage
-DEFINE_ALIAS_FUNCTION(handlemap_VkImageStencilUsageCreateInfo, handlemap_VkImageStencilUsageCreateInfoEXT)
+DEFINE_ALIAS_FUNCTION(handlemap_VkImageStencilUsageCreateInfo,
+                      handlemap_VkImageStencilUsageCreateInfoEXT)
 
 #endif
 #ifdef VK_EXT_validation_features
-void handlemap_VkValidationFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkValidationFeaturesEXT* toMap);
+void handlemap_VkValidationFeaturesEXT(VulkanHandleMapping* handlemap,
+                                       VkValidationFeaturesEXT* toMap);
 
 #endif
 #ifdef VK_NV_cooperative_matrix
-void handlemap_VkCooperativeMatrixPropertiesNV(
-    VulkanHandleMapping* handlemap,
-    VkCooperativeMatrixPropertiesNV* toMap);
+void handlemap_VkCooperativeMatrixPropertiesNV(VulkanHandleMapping* handlemap,
+                                               VkCooperativeMatrixPropertiesNV* toMap);
 
 void handlemap_VkPhysicalDeviceCooperativeMatrixFeaturesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceCooperativeMatrixFeaturesNV* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceCooperativeMatrixFeaturesNV* toMap);
 
 void handlemap_VkPhysicalDeviceCooperativeMatrixPropertiesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceCooperativeMatrixPropertiesNV* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceCooperativeMatrixPropertiesNV* toMap);
 
 #endif
 #ifdef VK_NV_coverage_reduction_mode
 void handlemap_VkPhysicalDeviceCoverageReductionModeFeaturesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceCoverageReductionModeFeaturesNV* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceCoverageReductionModeFeaturesNV* toMap);
 
 void handlemap_VkPipelineCoverageReductionStateCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkPipelineCoverageReductionStateCreateInfoNV* toMap);
+    VulkanHandleMapping* handlemap, VkPipelineCoverageReductionStateCreateInfoNV* toMap);
 
 void handlemap_VkFramebufferMixedSamplesCombinationNV(
-    VulkanHandleMapping* handlemap,
-    VkFramebufferMixedSamplesCombinationNV* toMap);
+    VulkanHandleMapping* handlemap, VkFramebufferMixedSamplesCombinationNV* toMap);
 
 #endif
 #ifdef VK_EXT_fragment_shader_interlock
 void handlemap_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* toMap);
 
 #endif
 #ifdef VK_EXT_ycbcr_image_arrays
 void handlemap_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* toMap);
 
 #endif
 #ifdef VK_EXT_provoking_vertex
 void handlemap_VkPhysicalDeviceProvokingVertexFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceProvokingVertexFeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceProvokingVertexFeaturesEXT* toMap);
 
 void handlemap_VkPhysicalDeviceProvokingVertexPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceProvokingVertexPropertiesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceProvokingVertexPropertiesEXT* toMap);
 
 void handlemap_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT(
     VulkanHandleMapping* handlemap,
@@ -3103,65 +2484,55 @@
 
 #endif
 #ifdef VK_EXT_full_screen_exclusive
-void handlemap_VkSurfaceFullScreenExclusiveInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkSurfaceFullScreenExclusiveInfoEXT* toMap);
+void handlemap_VkSurfaceFullScreenExclusiveInfoEXT(VulkanHandleMapping* handlemap,
+                                                   VkSurfaceFullScreenExclusiveInfoEXT* toMap);
 
 void handlemap_VkSurfaceCapabilitiesFullScreenExclusiveEXT(
-    VulkanHandleMapping* handlemap,
-    VkSurfaceCapabilitiesFullScreenExclusiveEXT* toMap);
+    VulkanHandleMapping* handlemap, VkSurfaceCapabilitiesFullScreenExclusiveEXT* toMap);
 
 void handlemap_VkSurfaceFullScreenExclusiveWin32InfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkSurfaceFullScreenExclusiveWin32InfoEXT* toMap);
+    VulkanHandleMapping* handlemap, VkSurfaceFullScreenExclusiveWin32InfoEXT* toMap);
 
 #endif
 #ifdef VK_EXT_headless_surface
-void handlemap_VkHeadlessSurfaceCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkHeadlessSurfaceCreateInfoEXT* toMap);
+void handlemap_VkHeadlessSurfaceCreateInfoEXT(VulkanHandleMapping* handlemap,
+                                              VkHeadlessSurfaceCreateInfoEXT* toMap);
 
 #endif
 #ifdef VK_EXT_line_rasterization
 void handlemap_VkPhysicalDeviceLineRasterizationFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceLineRasterizationFeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceLineRasterizationFeaturesEXT* toMap);
 
 void handlemap_VkPhysicalDeviceLineRasterizationPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceLineRasterizationPropertiesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceLineRasterizationPropertiesEXT* toMap);
 
 void handlemap_VkPipelineRasterizationLineStateCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkPipelineRasterizationLineStateCreateInfoEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPipelineRasterizationLineStateCreateInfoEXT* toMap);
 
 #endif
 #ifdef VK_EXT_shader_atomic_float
 void handlemap_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* toMap);
 
 #endif
 #ifdef VK_EXT_host_query_reset
-DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceHostQueryResetFeatures, handlemap_VkPhysicalDeviceHostQueryResetFeaturesEXT)
+DEFINE_ALIAS_FUNCTION(handlemap_VkPhysicalDeviceHostQueryResetFeatures,
+                      handlemap_VkPhysicalDeviceHostQueryResetFeaturesEXT)
 
 #endif
 #ifdef VK_EXT_index_type_uint8
 void handlemap_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceIndexTypeUint8FeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceIndexTypeUint8FeaturesEXT* toMap);
 
 #endif
 #ifdef VK_EXT_extended_dynamic_state
 void handlemap_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* toMap);
 
 #endif
 #ifdef VK_EXT_shader_atomic_float2
 void handlemap_VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT* toMap);
 
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
@@ -3172,589 +2543,462 @@
 #endif
 #ifdef VK_NV_device_generated_commands
 void handlemap_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* toMap);
 
 void handlemap_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* toMap);
 
-void handlemap_VkGraphicsShaderGroupCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkGraphicsShaderGroupCreateInfoNV* toMap);
+void handlemap_VkGraphicsShaderGroupCreateInfoNV(VulkanHandleMapping* handlemap,
+                                                 VkGraphicsShaderGroupCreateInfoNV* toMap);
 
 void handlemap_VkGraphicsPipelineShaderGroupsCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkGraphicsPipelineShaderGroupsCreateInfoNV* toMap);
+    VulkanHandleMapping* handlemap, VkGraphicsPipelineShaderGroupsCreateInfoNV* toMap);
 
-void handlemap_VkBindShaderGroupIndirectCommandNV(
-    VulkanHandleMapping* handlemap,
-    VkBindShaderGroupIndirectCommandNV* toMap);
+void handlemap_VkBindShaderGroupIndirectCommandNV(VulkanHandleMapping* handlemap,
+                                                  VkBindShaderGroupIndirectCommandNV* toMap);
 
-void handlemap_VkBindIndexBufferIndirectCommandNV(
-    VulkanHandleMapping* handlemap,
-    VkBindIndexBufferIndirectCommandNV* toMap);
+void handlemap_VkBindIndexBufferIndirectCommandNV(VulkanHandleMapping* handlemap,
+                                                  VkBindIndexBufferIndirectCommandNV* toMap);
 
-void handlemap_VkBindVertexBufferIndirectCommandNV(
-    VulkanHandleMapping* handlemap,
-    VkBindVertexBufferIndirectCommandNV* toMap);
+void handlemap_VkBindVertexBufferIndirectCommandNV(VulkanHandleMapping* handlemap,
+                                                   VkBindVertexBufferIndirectCommandNV* toMap);
 
-void handlemap_VkSetStateFlagsIndirectCommandNV(
-    VulkanHandleMapping* handlemap,
-    VkSetStateFlagsIndirectCommandNV* toMap);
+void handlemap_VkSetStateFlagsIndirectCommandNV(VulkanHandleMapping* handlemap,
+                                                VkSetStateFlagsIndirectCommandNV* toMap);
 
-void handlemap_VkIndirectCommandsStreamNV(
-    VulkanHandleMapping* handlemap,
-    VkIndirectCommandsStreamNV* toMap);
+void handlemap_VkIndirectCommandsStreamNV(VulkanHandleMapping* handlemap,
+                                          VkIndirectCommandsStreamNV* toMap);
 
-void handlemap_VkIndirectCommandsLayoutTokenNV(
-    VulkanHandleMapping* handlemap,
-    VkIndirectCommandsLayoutTokenNV* toMap);
+void handlemap_VkIndirectCommandsLayoutTokenNV(VulkanHandleMapping* handlemap,
+                                               VkIndirectCommandsLayoutTokenNV* toMap);
 
-void handlemap_VkIndirectCommandsLayoutCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkIndirectCommandsLayoutCreateInfoNV* toMap);
+void handlemap_VkIndirectCommandsLayoutCreateInfoNV(VulkanHandleMapping* handlemap,
+                                                    VkIndirectCommandsLayoutCreateInfoNV* toMap);
 
-void handlemap_VkGeneratedCommandsInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkGeneratedCommandsInfoNV* toMap);
+void handlemap_VkGeneratedCommandsInfoNV(VulkanHandleMapping* handlemap,
+                                         VkGeneratedCommandsInfoNV* toMap);
 
 void handlemap_VkGeneratedCommandsMemoryRequirementsInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkGeneratedCommandsMemoryRequirementsInfoNV* toMap);
+    VulkanHandleMapping* handlemap, VkGeneratedCommandsMemoryRequirementsInfoNV* toMap);
 
 #endif
 #ifdef VK_NV_inherited_viewport_scissor
 void handlemap_VkPhysicalDeviceInheritedViewportScissorFeaturesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceInheritedViewportScissorFeaturesNV* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceInheritedViewportScissorFeaturesNV* toMap);
 
 void handlemap_VkCommandBufferInheritanceViewportScissorInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkCommandBufferInheritanceViewportScissorInfoNV* toMap);
+    VulkanHandleMapping* handlemap, VkCommandBufferInheritanceViewportScissorInfoNV* toMap);
 
 #endif
 #ifdef VK_EXT_texel_buffer_alignment
 void handlemap_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* toMap);
 
 void handlemap_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* toMap);
 
 #endif
 #ifdef VK_QCOM_render_pass_transform
-void handlemap_VkRenderPassTransformBeginInfoQCOM(
-    VulkanHandleMapping* handlemap,
-    VkRenderPassTransformBeginInfoQCOM* toMap);
+void handlemap_VkRenderPassTransformBeginInfoQCOM(VulkanHandleMapping* handlemap,
+                                                  VkRenderPassTransformBeginInfoQCOM* toMap);
 
 void handlemap_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(
-    VulkanHandleMapping* handlemap,
-    VkCommandBufferInheritanceRenderPassTransformInfoQCOM* toMap);
+    VulkanHandleMapping* handlemap, VkCommandBufferInheritanceRenderPassTransformInfoQCOM* toMap);
 
 #endif
 #ifdef VK_EXT_device_memory_report
 void handlemap_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* toMap);
 
-void handlemap_VkDeviceMemoryReportCallbackDataEXT(
-    VulkanHandleMapping* handlemap,
-    VkDeviceMemoryReportCallbackDataEXT* toMap);
+void handlemap_VkDeviceMemoryReportCallbackDataEXT(VulkanHandleMapping* handlemap,
+                                                   VkDeviceMemoryReportCallbackDataEXT* toMap);
 
 void handlemap_VkDeviceDeviceMemoryReportCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkDeviceDeviceMemoryReportCreateInfoEXT* toMap);
+    VulkanHandleMapping* handlemap, VkDeviceDeviceMemoryReportCreateInfoEXT* toMap);
 
 #endif
 #ifdef VK_EXT_acquire_drm_display
 #endif
 #ifdef VK_EXT_robustness2
 void handlemap_VkPhysicalDeviceRobustness2FeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceRobustness2FeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceRobustness2FeaturesEXT* toMap);
 
 void handlemap_VkPhysicalDeviceRobustness2PropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceRobustness2PropertiesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceRobustness2PropertiesEXT* toMap);
 
 #endif
 #ifdef VK_EXT_custom_border_color
 void handlemap_VkSamplerCustomBorderColorCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkSamplerCustomBorderColorCreateInfoEXT* toMap);
+    VulkanHandleMapping* handlemap, VkSamplerCustomBorderColorCreateInfoEXT* toMap);
 
 void handlemap_VkPhysicalDeviceCustomBorderColorPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceCustomBorderColorPropertiesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceCustomBorderColorPropertiesEXT* toMap);
 
 void handlemap_VkPhysicalDeviceCustomBorderColorFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceCustomBorderColorFeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceCustomBorderColorFeaturesEXT* toMap);
 
 #endif
 #ifdef VK_GOOGLE_user_type
 #endif
 #ifdef VK_EXT_private_data
 void handlemap_VkPhysicalDevicePrivateDataFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDevicePrivateDataFeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDevicePrivateDataFeaturesEXT* toMap);
 
-void handlemap_VkDevicePrivateDataCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkDevicePrivateDataCreateInfoEXT* toMap);
+void handlemap_VkDevicePrivateDataCreateInfoEXT(VulkanHandleMapping* handlemap,
+                                                VkDevicePrivateDataCreateInfoEXT* toMap);
 
-void handlemap_VkPrivateDataSlotCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkPrivateDataSlotCreateInfoEXT* toMap);
+void handlemap_VkPrivateDataSlotCreateInfoEXT(VulkanHandleMapping* handlemap,
+                                              VkPrivateDataSlotCreateInfoEXT* toMap);
 
 #endif
 #ifdef VK_EXT_pipeline_creation_cache_control
 void handlemap_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* toMap);
 
 #endif
 #ifdef VK_NV_device_diagnostics_config
 void handlemap_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceDiagnosticsConfigFeaturesNV* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceDiagnosticsConfigFeaturesNV* toMap);
 
-void handlemap_VkDeviceDiagnosticsConfigCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkDeviceDiagnosticsConfigCreateInfoNV* toMap);
+void handlemap_VkDeviceDiagnosticsConfigCreateInfoNV(VulkanHandleMapping* handlemap,
+                                                     VkDeviceDiagnosticsConfigCreateInfoNV* toMap);
 
 #endif
 #ifdef VK_QCOM_render_pass_store_ops
 #endif
 #ifdef VK_NV_fragment_shading_rate_enums
 void handlemap_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* toMap);
 
 void handlemap_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* toMap);
 
 void handlemap_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkPipelineFragmentShadingRateEnumStateCreateInfoNV* toMap);
+    VulkanHandleMapping* handlemap, VkPipelineFragmentShadingRateEnumStateCreateInfoNV* toMap);
 
 #endif
 #ifdef VK_NV_ray_tracing_motion_blur
-void handlemap_VkDeviceOrHostAddressConstKHR(
-    VulkanHandleMapping* handlemap,
-    VkDeviceOrHostAddressConstKHR* toMap);
+void handlemap_VkDeviceOrHostAddressConstKHR(VulkanHandleMapping* handlemap,
+                                             VkDeviceOrHostAddressConstKHR* toMap);
 
 void handlemap_VkAccelerationStructureGeometryMotionTrianglesDataNV(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureGeometryMotionTrianglesDataNV* toMap);
+    VulkanHandleMapping* handlemap, VkAccelerationStructureGeometryMotionTrianglesDataNV* toMap);
 
-void handlemap_VkAccelerationStructureMotionInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureMotionInfoNV* toMap);
+void handlemap_VkAccelerationStructureMotionInfoNV(VulkanHandleMapping* handlemap,
+                                                   VkAccelerationStructureMotionInfoNV* toMap);
 
 void handlemap_VkAccelerationStructureMatrixMotionInstanceNV(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureMatrixMotionInstanceNV* toMap);
+    VulkanHandleMapping* handlemap, VkAccelerationStructureMatrixMotionInstanceNV* toMap);
 
-void handlemap_VkSRTDataNV(
-    VulkanHandleMapping* handlemap,
-    VkSRTDataNV* toMap);
+void handlemap_VkSRTDataNV(VulkanHandleMapping* handlemap, VkSRTDataNV* toMap);
 
 void handlemap_VkAccelerationStructureSRTMotionInstanceNV(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureSRTMotionInstanceNV* toMap);
+    VulkanHandleMapping* handlemap, VkAccelerationStructureSRTMotionInstanceNV* toMap);
 
 void handlemap_VkAccelerationStructureMotionInstanceDataNV(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureMotionInstanceDataNV* toMap);
+    VulkanHandleMapping* handlemap, VkAccelerationStructureMotionInstanceDataNV* toMap);
 
 void handlemap_VkAccelerationStructureMotionInstanceNV(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureMotionInstanceNV* toMap);
+    VulkanHandleMapping* handlemap, VkAccelerationStructureMotionInstanceNV* toMap);
 
 void handlemap_VkPhysicalDeviceRayTracingMotionBlurFeaturesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceRayTracingMotionBlurFeaturesNV* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceRayTracingMotionBlurFeaturesNV* toMap);
 
 #endif
 #ifdef VK_EXT_ycbcr_2plane_444_formats
 void handlemap_VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT* toMap);
 
 #endif
 #ifdef VK_EXT_fragment_density_map2
 void handlemap_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* toMap);
 
 void handlemap_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* toMap);
 
 #endif
 #ifdef VK_QCOM_rotated_copy_commands
-void handlemap_VkCopyCommandTransformInfoQCOM(
-    VulkanHandleMapping* handlemap,
-    VkCopyCommandTransformInfoQCOM* toMap);
+void handlemap_VkCopyCommandTransformInfoQCOM(VulkanHandleMapping* handlemap,
+                                              VkCopyCommandTransformInfoQCOM* toMap);
 
 #endif
 #ifdef VK_EXT_image_robustness
 void handlemap_VkPhysicalDeviceImageRobustnessFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceImageRobustnessFeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceImageRobustnessFeaturesEXT* toMap);
 
 #endif
 #ifdef VK_EXT_4444_formats
 void handlemap_VkPhysicalDevice4444FormatsFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDevice4444FormatsFeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDevice4444FormatsFeaturesEXT* toMap);
 
 #endif
 #ifdef VK_EXT_rgba10x6_formats
 void handlemap_VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT* toMap);
 
 #endif
 #ifdef VK_NV_acquire_winrt_display
 #endif
 #ifdef VK_EXT_directfb_surface
-void handlemap_VkDirectFBSurfaceCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkDirectFBSurfaceCreateInfoEXT* toMap);
+void handlemap_VkDirectFBSurfaceCreateInfoEXT(VulkanHandleMapping* handlemap,
+                                              VkDirectFBSurfaceCreateInfoEXT* toMap);
 
 #endif
 #ifdef VK_VALVE_mutable_descriptor_type
 void handlemap_VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE* toMap);
 
-void handlemap_VkMutableDescriptorTypeListVALVE(
-    VulkanHandleMapping* handlemap,
-    VkMutableDescriptorTypeListVALVE* toMap);
+void handlemap_VkMutableDescriptorTypeListVALVE(VulkanHandleMapping* handlemap,
+                                                VkMutableDescriptorTypeListVALVE* toMap);
 
 void handlemap_VkMutableDescriptorTypeCreateInfoVALVE(
-    VulkanHandleMapping* handlemap,
-    VkMutableDescriptorTypeCreateInfoVALVE* toMap);
+    VulkanHandleMapping* handlemap, VkMutableDescriptorTypeCreateInfoVALVE* toMap);
 
 #endif
 #ifdef VK_EXT_vertex_input_dynamic_state
 void handlemap_VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT* toMap);
 
-void handlemap_VkVertexInputBindingDescription2EXT(
-    VulkanHandleMapping* handlemap,
-    VkVertexInputBindingDescription2EXT* toMap);
+void handlemap_VkVertexInputBindingDescription2EXT(VulkanHandleMapping* handlemap,
+                                                   VkVertexInputBindingDescription2EXT* toMap);
 
-void handlemap_VkVertexInputAttributeDescription2EXT(
-    VulkanHandleMapping* handlemap,
-    VkVertexInputAttributeDescription2EXT* toMap);
+void handlemap_VkVertexInputAttributeDescription2EXT(VulkanHandleMapping* handlemap,
+                                                     VkVertexInputAttributeDescription2EXT* toMap);
 
 #endif
 #ifdef VK_EXT_physical_device_drm
-void handlemap_VkPhysicalDeviceDrmPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceDrmPropertiesEXT* toMap);
+void handlemap_VkPhysicalDeviceDrmPropertiesEXT(VulkanHandleMapping* handlemap,
+                                                VkPhysicalDeviceDrmPropertiesEXT* toMap);
 
 #endif
 #ifdef VK_EXT_primitive_topology_list_restart
 void handlemap_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT* toMap);
 
 #endif
 #ifdef VK_FUCHSIA_external_memory
-void handlemap_VkImportMemoryZirconHandleInfoFUCHSIA(
-    VulkanHandleMapping* handlemap,
-    VkImportMemoryZirconHandleInfoFUCHSIA* toMap);
+void handlemap_VkImportMemoryZirconHandleInfoFUCHSIA(VulkanHandleMapping* handlemap,
+                                                     VkImportMemoryZirconHandleInfoFUCHSIA* toMap);
 
-void handlemap_VkMemoryZirconHandlePropertiesFUCHSIA(
-    VulkanHandleMapping* handlemap,
-    VkMemoryZirconHandlePropertiesFUCHSIA* toMap);
+void handlemap_VkMemoryZirconHandlePropertiesFUCHSIA(VulkanHandleMapping* handlemap,
+                                                     VkMemoryZirconHandlePropertiesFUCHSIA* toMap);
 
-void handlemap_VkMemoryGetZirconHandleInfoFUCHSIA(
-    VulkanHandleMapping* handlemap,
-    VkMemoryGetZirconHandleInfoFUCHSIA* toMap);
+void handlemap_VkMemoryGetZirconHandleInfoFUCHSIA(VulkanHandleMapping* handlemap,
+                                                  VkMemoryGetZirconHandleInfoFUCHSIA* toMap);
 
 #endif
 #ifdef VK_FUCHSIA_external_semaphore
 void handlemap_VkImportSemaphoreZirconHandleInfoFUCHSIA(
-    VulkanHandleMapping* handlemap,
-    VkImportSemaphoreZirconHandleInfoFUCHSIA* toMap);
+    VulkanHandleMapping* handlemap, VkImportSemaphoreZirconHandleInfoFUCHSIA* toMap);
 
-void handlemap_VkSemaphoreGetZirconHandleInfoFUCHSIA(
-    VulkanHandleMapping* handlemap,
-    VkSemaphoreGetZirconHandleInfoFUCHSIA* toMap);
+void handlemap_VkSemaphoreGetZirconHandleInfoFUCHSIA(VulkanHandleMapping* handlemap,
+                                                     VkSemaphoreGetZirconHandleInfoFUCHSIA* toMap);
 
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
-void handlemap_VkBufferCollectionCreateInfoFUCHSIA(
-    VulkanHandleMapping* handlemap,
-    VkBufferCollectionCreateInfoFUCHSIA* toMap);
+void handlemap_VkBufferCollectionCreateInfoFUCHSIA(VulkanHandleMapping* handlemap,
+                                                   VkBufferCollectionCreateInfoFUCHSIA* toMap);
 
-void handlemap_VkImportMemoryBufferCollectionFUCHSIA(
-    VulkanHandleMapping* handlemap,
-    VkImportMemoryBufferCollectionFUCHSIA* toMap);
+void handlemap_VkImportMemoryBufferCollectionFUCHSIA(VulkanHandleMapping* handlemap,
+                                                     VkImportMemoryBufferCollectionFUCHSIA* toMap);
 
 void handlemap_VkBufferCollectionImageCreateInfoFUCHSIA(
-    VulkanHandleMapping* handlemap,
-    VkBufferCollectionImageCreateInfoFUCHSIA* toMap);
+    VulkanHandleMapping* handlemap, VkBufferCollectionImageCreateInfoFUCHSIA* toMap);
 
 void handlemap_VkBufferCollectionConstraintsInfoFUCHSIA(
-    VulkanHandleMapping* handlemap,
-    VkBufferCollectionConstraintsInfoFUCHSIA* toMap);
+    VulkanHandleMapping* handlemap, VkBufferCollectionConstraintsInfoFUCHSIA* toMap);
 
-void handlemap_VkBufferConstraintsInfoFUCHSIA(
-    VulkanHandleMapping* handlemap,
-    VkBufferConstraintsInfoFUCHSIA* toMap);
+void handlemap_VkBufferConstraintsInfoFUCHSIA(VulkanHandleMapping* handlemap,
+                                              VkBufferConstraintsInfoFUCHSIA* toMap);
 
 void handlemap_VkBufferCollectionBufferCreateInfoFUCHSIA(
-    VulkanHandleMapping* handlemap,
-    VkBufferCollectionBufferCreateInfoFUCHSIA* toMap);
+    VulkanHandleMapping* handlemap, VkBufferCollectionBufferCreateInfoFUCHSIA* toMap);
 
-void handlemap_VkSysmemColorSpaceFUCHSIA(
-    VulkanHandleMapping* handlemap,
-    VkSysmemColorSpaceFUCHSIA* toMap);
+void handlemap_VkSysmemColorSpaceFUCHSIA(VulkanHandleMapping* handlemap,
+                                         VkSysmemColorSpaceFUCHSIA* toMap);
 
-void handlemap_VkBufferCollectionPropertiesFUCHSIA(
-    VulkanHandleMapping* handlemap,
-    VkBufferCollectionPropertiesFUCHSIA* toMap);
+void handlemap_VkBufferCollectionPropertiesFUCHSIA(VulkanHandleMapping* handlemap,
+                                                   VkBufferCollectionPropertiesFUCHSIA* toMap);
 
-void handlemap_VkImageFormatConstraintsInfoFUCHSIA(
-    VulkanHandleMapping* handlemap,
-    VkImageFormatConstraintsInfoFUCHSIA* toMap);
+void handlemap_VkImageFormatConstraintsInfoFUCHSIA(VulkanHandleMapping* handlemap,
+                                                   VkImageFormatConstraintsInfoFUCHSIA* toMap);
 
-void handlemap_VkImageConstraintsInfoFUCHSIA(
-    VulkanHandleMapping* handlemap,
-    VkImageConstraintsInfoFUCHSIA* toMap);
+void handlemap_VkImageConstraintsInfoFUCHSIA(VulkanHandleMapping* handlemap,
+                                             VkImageConstraintsInfoFUCHSIA* toMap);
 
 #endif
 #ifdef VK_HUAWEI_subpass_shading
 void handlemap_VkSubpassShadingPipelineCreateInfoHUAWEI(
-    VulkanHandleMapping* handlemap,
-    VkSubpassShadingPipelineCreateInfoHUAWEI* toMap);
+    VulkanHandleMapping* handlemap, VkSubpassShadingPipelineCreateInfoHUAWEI* toMap);
 
 void handlemap_VkPhysicalDeviceSubpassShadingFeaturesHUAWEI(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceSubpassShadingFeaturesHUAWEI* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceSubpassShadingFeaturesHUAWEI* toMap);
 
 void handlemap_VkPhysicalDeviceSubpassShadingPropertiesHUAWEI(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceSubpassShadingPropertiesHUAWEI* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceSubpassShadingPropertiesHUAWEI* toMap);
 
 #endif
 #ifdef VK_HUAWEI_invocation_mask
 void handlemap_VkPhysicalDeviceInvocationMaskFeaturesHUAWEI(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceInvocationMaskFeaturesHUAWEI* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceInvocationMaskFeaturesHUAWEI* toMap);
 
 #endif
 #ifdef VK_NV_external_memory_rdma
-void handlemap_VkMemoryGetRemoteAddressInfoNV(
-    VulkanHandleMapping* handlemap,
-    VkMemoryGetRemoteAddressInfoNV* toMap);
+void handlemap_VkMemoryGetRemoteAddressInfoNV(VulkanHandleMapping* handlemap,
+                                              VkMemoryGetRemoteAddressInfoNV* toMap);
 
 void handlemap_VkPhysicalDeviceExternalMemoryRDMAFeaturesNV(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceExternalMemoryRDMAFeaturesNV* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceExternalMemoryRDMAFeaturesNV* toMap);
 
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
 void handlemap_VkPhysicalDeviceExtendedDynamicState2FeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceExtendedDynamicState2FeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceExtendedDynamicState2FeaturesEXT* toMap);
 
 #endif
 #ifdef VK_QNX_screen_surface
-void handlemap_VkScreenSurfaceCreateInfoQNX(
-    VulkanHandleMapping* handlemap,
-    VkScreenSurfaceCreateInfoQNX* toMap);
+void handlemap_VkScreenSurfaceCreateInfoQNX(VulkanHandleMapping* handlemap,
+                                            VkScreenSurfaceCreateInfoQNX* toMap);
 
 #endif
 #ifdef VK_EXT_color_write_enable
 void handlemap_VkPhysicalDeviceColorWriteEnableFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceColorWriteEnableFeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceColorWriteEnableFeaturesEXT* toMap);
 
-void handlemap_VkPipelineColorWriteCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkPipelineColorWriteCreateInfoEXT* toMap);
+void handlemap_VkPipelineColorWriteCreateInfoEXT(VulkanHandleMapping* handlemap,
+                                                 VkPipelineColorWriteCreateInfoEXT* toMap);
 
 #endif
 #ifdef VK_GOOGLE_gfxstream
-void handlemap_VkImportColorBufferGOOGLE(
-    VulkanHandleMapping* handlemap,
-    VkImportColorBufferGOOGLE* toMap);
+void handlemap_VkImportColorBufferGOOGLE(VulkanHandleMapping* handlemap,
+                                         VkImportColorBufferGOOGLE* toMap);
 
-void handlemap_VkImportBufferGOOGLE(
-    VulkanHandleMapping* handlemap,
-    VkImportBufferGOOGLE* toMap);
+void handlemap_VkImportBufferGOOGLE(VulkanHandleMapping* handlemap, VkImportBufferGOOGLE* toMap);
 
-void handlemap_VkImportPhysicalAddressGOOGLE(
-    VulkanHandleMapping* handlemap,
-    VkImportPhysicalAddressGOOGLE* toMap);
+void handlemap_VkImportPhysicalAddressGOOGLE(VulkanHandleMapping* handlemap,
+                                             VkImportPhysicalAddressGOOGLE* toMap);
 
 #endif
 #ifdef VK_EXT_global_priority_query
 void handlemap_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT* toMap);
 
 void handlemap_VkQueueFamilyGlobalPriorityPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkQueueFamilyGlobalPriorityPropertiesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkQueueFamilyGlobalPriorityPropertiesEXT* toMap);
 
 #endif
 #ifdef VK_EXT_multi_draw
-void handlemap_VkPhysicalDeviceMultiDrawFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceMultiDrawFeaturesEXT* toMap);
+void handlemap_VkPhysicalDeviceMultiDrawFeaturesEXT(VulkanHandleMapping* handlemap,
+                                                    VkPhysicalDeviceMultiDrawFeaturesEXT* toMap);
 
 void handlemap_VkPhysicalDeviceMultiDrawPropertiesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceMultiDrawPropertiesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceMultiDrawPropertiesEXT* toMap);
 
-void handlemap_VkMultiDrawInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkMultiDrawInfoEXT* toMap);
+void handlemap_VkMultiDrawInfoEXT(VulkanHandleMapping* handlemap, VkMultiDrawInfoEXT* toMap);
 
-void handlemap_VkMultiDrawIndexedInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkMultiDrawIndexedInfoEXT* toMap);
+void handlemap_VkMultiDrawIndexedInfoEXT(VulkanHandleMapping* handlemap,
+                                         VkMultiDrawIndexedInfoEXT* toMap);
 
 #endif
 #ifdef VK_EXT_load_store_op_none
 #endif
 #ifdef VK_EXT_border_color_swizzle
 void handlemap_VkPhysicalDeviceBorderColorSwizzleFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceBorderColorSwizzleFeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceBorderColorSwizzleFeaturesEXT* toMap);
 
 void handlemap_VkSamplerBorderColorComponentMappingCreateInfoEXT(
-    VulkanHandleMapping* handlemap,
-    VkSamplerBorderColorComponentMappingCreateInfoEXT* toMap);
+    VulkanHandleMapping* handlemap, VkSamplerBorderColorComponentMappingCreateInfoEXT* toMap);
 
 #endif
 #ifdef VK_EXT_pageable_device_local_memory
 void handlemap_VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT* toMap);
 
 #endif
 #ifdef VK_KHR_acceleration_structure
-void handlemap_VkDeviceOrHostAddressKHR(
-    VulkanHandleMapping* handlemap,
-    VkDeviceOrHostAddressKHR* toMap);
+void handlemap_VkDeviceOrHostAddressKHR(VulkanHandleMapping* handlemap,
+                                        VkDeviceOrHostAddressKHR* toMap);
 
 void handlemap_VkAccelerationStructureBuildRangeInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureBuildRangeInfoKHR* toMap);
+    VulkanHandleMapping* handlemap, VkAccelerationStructureBuildRangeInfoKHR* toMap);
 
 void handlemap_VkAccelerationStructureGeometryTrianglesDataKHR(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureGeometryTrianglesDataKHR* toMap);
+    VulkanHandleMapping* handlemap, VkAccelerationStructureGeometryTrianglesDataKHR* toMap);
 
 void handlemap_VkAccelerationStructureGeometryAabbsDataKHR(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureGeometryAabbsDataKHR* toMap);
+    VulkanHandleMapping* handlemap, VkAccelerationStructureGeometryAabbsDataKHR* toMap);
 
 void handlemap_VkAccelerationStructureGeometryInstancesDataKHR(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureGeometryInstancesDataKHR* toMap);
+    VulkanHandleMapping* handlemap, VkAccelerationStructureGeometryInstancesDataKHR* toMap);
 
 void handlemap_VkAccelerationStructureGeometryDataKHR(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureGeometryDataKHR* toMap);
+    VulkanHandleMapping* handlemap, VkAccelerationStructureGeometryDataKHR* toMap);
 
-void handlemap_VkAccelerationStructureGeometryKHR(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureGeometryKHR* toMap);
+void handlemap_VkAccelerationStructureGeometryKHR(VulkanHandleMapping* handlemap,
+                                                  VkAccelerationStructureGeometryKHR* toMap);
 
 void handlemap_VkAccelerationStructureBuildGeometryInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureBuildGeometryInfoKHR* toMap);
+    VulkanHandleMapping* handlemap, VkAccelerationStructureBuildGeometryInfoKHR* toMap);
 
-void handlemap_VkAccelerationStructureCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureCreateInfoKHR* toMap);
+void handlemap_VkAccelerationStructureCreateInfoKHR(VulkanHandleMapping* handlemap,
+                                                    VkAccelerationStructureCreateInfoKHR* toMap);
 
 void handlemap_VkWriteDescriptorSetAccelerationStructureKHR(
-    VulkanHandleMapping* handlemap,
-    VkWriteDescriptorSetAccelerationStructureKHR* toMap);
+    VulkanHandleMapping* handlemap, VkWriteDescriptorSetAccelerationStructureKHR* toMap);
 
 void handlemap_VkPhysicalDeviceAccelerationStructureFeaturesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceAccelerationStructureFeaturesKHR* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceAccelerationStructureFeaturesKHR* toMap);
 
 void handlemap_VkPhysicalDeviceAccelerationStructurePropertiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceAccelerationStructurePropertiesKHR* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceAccelerationStructurePropertiesKHR* toMap);
 
 void handlemap_VkAccelerationStructureDeviceAddressInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureDeviceAddressInfoKHR* toMap);
+    VulkanHandleMapping* handlemap, VkAccelerationStructureDeviceAddressInfoKHR* toMap);
 
-void handlemap_VkAccelerationStructureVersionInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureVersionInfoKHR* toMap);
+void handlemap_VkAccelerationStructureVersionInfoKHR(VulkanHandleMapping* handlemap,
+                                                     VkAccelerationStructureVersionInfoKHR* toMap);
 
 void handlemap_VkCopyAccelerationStructureToMemoryInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkCopyAccelerationStructureToMemoryInfoKHR* toMap);
+    VulkanHandleMapping* handlemap, VkCopyAccelerationStructureToMemoryInfoKHR* toMap);
 
 void handlemap_VkCopyMemoryToAccelerationStructureInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkCopyMemoryToAccelerationStructureInfoKHR* toMap);
+    VulkanHandleMapping* handlemap, VkCopyMemoryToAccelerationStructureInfoKHR* toMap);
 
-void handlemap_VkCopyAccelerationStructureInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkCopyAccelerationStructureInfoKHR* toMap);
+void handlemap_VkCopyAccelerationStructureInfoKHR(VulkanHandleMapping* handlemap,
+                                                  VkCopyAccelerationStructureInfoKHR* toMap);
 
 void handlemap_VkAccelerationStructureBuildSizesInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkAccelerationStructureBuildSizesInfoKHR* toMap);
+    VulkanHandleMapping* handlemap, VkAccelerationStructureBuildSizesInfoKHR* toMap);
 
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
-void handlemap_VkRayTracingShaderGroupCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkRayTracingShaderGroupCreateInfoKHR* toMap);
+void handlemap_VkRayTracingShaderGroupCreateInfoKHR(VulkanHandleMapping* handlemap,
+                                                    VkRayTracingShaderGroupCreateInfoKHR* toMap);
 
 void handlemap_VkRayTracingPipelineInterfaceCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkRayTracingPipelineInterfaceCreateInfoKHR* toMap);
+    VulkanHandleMapping* handlemap, VkRayTracingPipelineInterfaceCreateInfoKHR* toMap);
 
-void handlemap_VkRayTracingPipelineCreateInfoKHR(
-    VulkanHandleMapping* handlemap,
-    VkRayTracingPipelineCreateInfoKHR* toMap);
+void handlemap_VkRayTracingPipelineCreateInfoKHR(VulkanHandleMapping* handlemap,
+                                                 VkRayTracingPipelineCreateInfoKHR* toMap);
 
 void handlemap_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceRayTracingPipelineFeaturesKHR* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceRayTracingPipelineFeaturesKHR* toMap);
 
 void handlemap_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceRayTracingPipelinePropertiesKHR* toMap);
+    VulkanHandleMapping* handlemap, VkPhysicalDeviceRayTracingPipelinePropertiesKHR* toMap);
 
-void handlemap_VkStridedDeviceAddressRegionKHR(
-    VulkanHandleMapping* handlemap,
-    VkStridedDeviceAddressRegionKHR* toMap);
+void handlemap_VkStridedDeviceAddressRegionKHR(VulkanHandleMapping* handlemap,
+                                               VkStridedDeviceAddressRegionKHR* toMap);
 
-void handlemap_VkTraceRaysIndirectCommandKHR(
-    VulkanHandleMapping* handlemap,
-    VkTraceRaysIndirectCommandKHR* toMap);
+void handlemap_VkTraceRaysIndirectCommandKHR(VulkanHandleMapping* handlemap,
+                                             VkTraceRaysIndirectCommandKHR* toMap);
 
 #endif
 #ifdef VK_KHR_ray_query
-void handlemap_VkPhysicalDeviceRayQueryFeaturesKHR(
-    VulkanHandleMapping* handlemap,
-    VkPhysicalDeviceRayQueryFeaturesKHR* toMap);
+void handlemap_VkPhysicalDeviceRayQueryFeaturesKHR(VulkanHandleMapping* handlemap,
+                                                   VkPhysicalDeviceRayQueryFeaturesKHR* toMap);
 
 #endif
 
-} // namespace goldfish_vk
+}  // namespace goldfish_vk
diff --git a/stream-servers/vulkan/cereal/common/goldfish_vk_marshaling.cpp b/stream-servers/vulkan/cereal/common/goldfish_vk_marshaling.cpp
index 4fa9f89..85db7c0 100644
--- a/stream-servers/vulkan/cereal/common/goldfish_vk_marshaling.cpp
+++ b/stream-servers/vulkan/cereal/common/goldfish_vk_marshaling.cpp
@@ -14,227 +14,180 @@
 // limitations under the License.
 
 // Autogenerated module goldfish_vk_marshaling
-// (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
+// (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal
+// -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
 // VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
 // VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+//
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o
+// $CEREAL_OUTPUT_DIR
+//
 
 #include "goldfish_vk_marshaling.h"
 
+#include <string.h>
 
 #include "goldfish_vk_extension_structs.h"
 #include "goldfish_vk_private_defs.h"
-#include <string.h>
-
 
 namespace goldfish_vk {
 
-void marshal_extension_struct(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const void* structExtension);
+void marshal_extension_struct(VulkanStream* vkStream, VkStructureType rootType,
+                              const void* structExtension);
 
-void unmarshal_extension_struct(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    void* structExtension_out);
+void unmarshal_extension_struct(VulkanStream* vkStream, VkStructureType rootType,
+                                void* structExtension_out);
 
 #ifdef VK_VERSION_1_0
-void marshal_VkExtent2D(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkExtent2D* forMarshaling)
-{
+void marshal_VkExtent2D(VulkanStream* vkStream, VkStructureType rootType,
+                        const VkExtent2D* forMarshaling) {
     (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->width, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->height, sizeof(uint32_t));
 }
 
-void unmarshal_VkExtent2D(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExtent2D* forUnmarshaling)
-{
+void unmarshal_VkExtent2D(VulkanStream* vkStream, VkStructureType rootType,
+                          VkExtent2D* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->width, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->height, sizeof(uint32_t));
 }
 
-void marshal_VkExtent3D(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkExtent3D* forMarshaling)
-{
+void marshal_VkExtent3D(VulkanStream* vkStream, VkStructureType rootType,
+                        const VkExtent3D* forMarshaling) {
     (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->width, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->height, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->depth, sizeof(uint32_t));
 }
 
-void unmarshal_VkExtent3D(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExtent3D* forUnmarshaling)
-{
+void unmarshal_VkExtent3D(VulkanStream* vkStream, VkStructureType rootType,
+                          VkExtent3D* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->width, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->height, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->depth, sizeof(uint32_t));
 }
 
-void marshal_VkOffset2D(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkOffset2D* forMarshaling)
-{
+void marshal_VkOffset2D(VulkanStream* vkStream, VkStructureType rootType,
+                        const VkOffset2D* forMarshaling) {
     (void)rootType;
     vkStream->write((int32_t*)&forMarshaling->x, sizeof(int32_t));
     vkStream->write((int32_t*)&forMarshaling->y, sizeof(int32_t));
 }
 
-void unmarshal_VkOffset2D(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkOffset2D* forUnmarshaling)
-{
+void unmarshal_VkOffset2D(VulkanStream* vkStream, VkStructureType rootType,
+                          VkOffset2D* forUnmarshaling) {
     (void)rootType;
     vkStream->read((int32_t*)&forUnmarshaling->x, sizeof(int32_t));
     vkStream->read((int32_t*)&forUnmarshaling->y, sizeof(int32_t));
 }
 
-void marshal_VkOffset3D(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkOffset3D* forMarshaling)
-{
+void marshal_VkOffset3D(VulkanStream* vkStream, VkStructureType rootType,
+                        const VkOffset3D* forMarshaling) {
     (void)rootType;
     vkStream->write((int32_t*)&forMarshaling->x, sizeof(int32_t));
     vkStream->write((int32_t*)&forMarshaling->y, sizeof(int32_t));
     vkStream->write((int32_t*)&forMarshaling->z, sizeof(int32_t));
 }
 
-void unmarshal_VkOffset3D(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkOffset3D* forUnmarshaling)
-{
+void unmarshal_VkOffset3D(VulkanStream* vkStream, VkStructureType rootType,
+                          VkOffset3D* forUnmarshaling) {
     (void)rootType;
     vkStream->read((int32_t*)&forUnmarshaling->x, sizeof(int32_t));
     vkStream->read((int32_t*)&forUnmarshaling->y, sizeof(int32_t));
     vkStream->read((int32_t*)&forUnmarshaling->z, sizeof(int32_t));
 }
 
-void marshal_VkRect2D(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkRect2D* forMarshaling)
-{
+void marshal_VkRect2D(VulkanStream* vkStream, VkStructureType rootType,
+                      const VkRect2D* forMarshaling) {
     (void)rootType;
     marshal_VkOffset2D(vkStream, rootType, (VkOffset2D*)(&forMarshaling->offset));
     marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->extent));
 }
 
-void unmarshal_VkRect2D(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRect2D* forUnmarshaling)
-{
+void unmarshal_VkRect2D(VulkanStream* vkStream, VkStructureType rootType,
+                        VkRect2D* forUnmarshaling) {
     (void)rootType;
     unmarshal_VkOffset2D(vkStream, rootType, (VkOffset2D*)(&forUnmarshaling->offset));
     unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->extent));
 }
 
-void marshal_VkBaseInStructure(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBaseInStructure* forMarshaling)
-{
+void marshal_VkBaseInStructure(VulkanStream* vkStream, VkStructureType rootType,
+                               const VkBaseInStructure* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
 }
 
-void unmarshal_VkBaseInStructure(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBaseInStructure* forUnmarshaling)
-{
+void unmarshal_VkBaseInStructure(VulkanStream* vkStream, VkStructureType rootType,
+                                 VkBaseInStructure* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((VkBaseInStructure*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
 }
 
-void marshal_VkBaseOutStructure(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBaseOutStructure* forMarshaling)
-{
+void marshal_VkBaseOutStructure(VulkanStream* vkStream, VkStructureType rootType,
+                                const VkBaseOutStructure* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
 }
 
-void unmarshal_VkBaseOutStructure(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBaseOutStructure* forUnmarshaling)
-{
+void unmarshal_VkBaseOutStructure(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkBaseOutStructure* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((VkBaseOutStructure*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
 }
 
-void marshal_VkBufferMemoryBarrier(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBufferMemoryBarrier* forMarshaling)
-{
+void marshal_VkBufferMemoryBarrier(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkBufferMemoryBarrier* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -249,26 +202,23 @@
     vkStream->write((VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
 }
 
-void unmarshal_VkBufferMemoryBarrier(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferMemoryBarrier* forUnmarshaling)
-{
+void unmarshal_VkBufferMemoryBarrier(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkBufferMemoryBarrier* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -278,38 +228,30 @@
     vkStream->read((uint32_t*)&forUnmarshaling->dstQueueFamilyIndex, sizeof(uint32_t));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_0, (VkBuffer*)&forUnmarshaling->buffer, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_0,
+                                                       (VkBuffer*)&forUnmarshaling->buffer, 1);
     vkStream->read((VkDeviceSize*)&forUnmarshaling->offset, sizeof(VkDeviceSize));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->size, sizeof(VkDeviceSize));
 }
 
-void marshal_VkDispatchIndirectCommand(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDispatchIndirectCommand* forMarshaling)
-{
+void marshal_VkDispatchIndirectCommand(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkDispatchIndirectCommand* forMarshaling) {
     (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->x, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->y, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->z, sizeof(uint32_t));
 }
 
-void unmarshal_VkDispatchIndirectCommand(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDispatchIndirectCommand* forUnmarshaling)
-{
+void unmarshal_VkDispatchIndirectCommand(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkDispatchIndirectCommand* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->x, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->y, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->z, sizeof(uint32_t));
 }
 
-void marshal_VkDrawIndexedIndirectCommand(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDrawIndexedIndirectCommand* forMarshaling)
-{
+void marshal_VkDrawIndexedIndirectCommand(VulkanStream* vkStream, VkStructureType rootType,
+                                          const VkDrawIndexedIndirectCommand* forMarshaling) {
     (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->indexCount, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->instanceCount, sizeof(uint32_t));
@@ -318,11 +260,8 @@
     vkStream->write((uint32_t*)&forMarshaling->firstInstance, sizeof(uint32_t));
 }
 
-void unmarshal_VkDrawIndexedIndirectCommand(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDrawIndexedIndirectCommand* forUnmarshaling)
-{
+void unmarshal_VkDrawIndexedIndirectCommand(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkDrawIndexedIndirectCommand* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->indexCount, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->instanceCount, sizeof(uint32_t));
@@ -331,11 +270,8 @@
     vkStream->read((uint32_t*)&forUnmarshaling->firstInstance, sizeof(uint32_t));
 }
 
-void marshal_VkDrawIndirectCommand(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDrawIndirectCommand* forMarshaling)
-{
+void marshal_VkDrawIndirectCommand(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkDrawIndirectCommand* forMarshaling) {
     (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->vertexCount, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->instanceCount, sizeof(uint32_t));
@@ -343,11 +279,8 @@
     vkStream->write((uint32_t*)&forMarshaling->firstInstance, sizeof(uint32_t));
 }
 
-void unmarshal_VkDrawIndirectCommand(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDrawIndirectCommand* forUnmarshaling)
-{
+void unmarshal_VkDrawIndirectCommand(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkDrawIndirectCommand* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->vertexCount, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->instanceCount, sizeof(uint32_t));
@@ -355,11 +288,8 @@
     vkStream->read((uint32_t*)&forUnmarshaling->firstInstance, sizeof(uint32_t));
 }
 
-void marshal_VkImageSubresourceRange(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageSubresourceRange* forMarshaling)
-{
+void marshal_VkImageSubresourceRange(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkImageSubresourceRange* forMarshaling) {
     (void)rootType;
     vkStream->write((VkImageAspectFlags*)&forMarshaling->aspectMask, sizeof(VkImageAspectFlags));
     vkStream->write((uint32_t*)&forMarshaling->baseMipLevel, sizeof(uint32_t));
@@ -368,11 +298,8 @@
     vkStream->write((uint32_t*)&forMarshaling->layerCount, sizeof(uint32_t));
 }
 
-void unmarshal_VkImageSubresourceRange(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageSubresourceRange* forUnmarshaling)
-{
+void unmarshal_VkImageSubresourceRange(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkImageSubresourceRange* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkImageAspectFlags*)&forUnmarshaling->aspectMask, sizeof(VkImageAspectFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->baseMipLevel, sizeof(uint32_t));
@@ -381,15 +308,11 @@
     vkStream->read((uint32_t*)&forUnmarshaling->layerCount, sizeof(uint32_t));
 }
 
-void marshal_VkImageMemoryBarrier(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageMemoryBarrier* forMarshaling)
-{
+void marshal_VkImageMemoryBarrier(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkImageMemoryBarrier* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -402,29 +325,27 @@
     uint64_t cgen_var_0;
     vkStream->handleMapping()->mapHandles_VkImage_u64(&forMarshaling->image, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
-    marshal_VkImageSubresourceRange(vkStream, rootType, (VkImageSubresourceRange*)(&forMarshaling->subresourceRange));
+    marshal_VkImageSubresourceRange(vkStream, rootType,
+                                    (VkImageSubresourceRange*)(&forMarshaling->subresourceRange));
 }
 
-void unmarshal_VkImageMemoryBarrier(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageMemoryBarrier* forUnmarshaling)
-{
+void unmarshal_VkImageMemoryBarrier(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkImageMemoryBarrier* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -436,19 +357,17 @@
     vkStream->read((uint32_t*)&forUnmarshaling->dstQueueFamilyIndex, sizeof(uint32_t));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_0, (VkImage*)&forUnmarshaling->image, 1);
-    unmarshal_VkImageSubresourceRange(vkStream, rootType, (VkImageSubresourceRange*)(&forUnmarshaling->subresourceRange));
+    vkStream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_0,
+                                                      (VkImage*)&forUnmarshaling->image, 1);
+    unmarshal_VkImageSubresourceRange(
+        vkStream, rootType, (VkImageSubresourceRange*)(&forUnmarshaling->subresourceRange));
 }
 
-void marshal_VkMemoryBarrier(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMemoryBarrier* forMarshaling)
-{
+void marshal_VkMemoryBarrier(VulkanStream* vkStream, VkStructureType rootType,
+                             const VkMemoryBarrier* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -456,26 +375,23 @@
     vkStream->write((VkAccessFlags*)&forMarshaling->dstAccessMask, sizeof(VkAccessFlags));
 }
 
-void unmarshal_VkMemoryBarrier(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryBarrier* forUnmarshaling)
-{
+void unmarshal_VkMemoryBarrier(VulkanStream* vkStream, VkStructureType rootType,
+                               VkMemoryBarrier* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -483,43 +399,35 @@
     vkStream->read((VkAccessFlags*)&forUnmarshaling->dstAccessMask, sizeof(VkAccessFlags));
 }
 
-void marshal_VkPipelineCacheHeaderVersionOne(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineCacheHeaderVersionOne* forMarshaling)
-{
+void marshal_VkPipelineCacheHeaderVersionOne(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkPipelineCacheHeaderVersionOne* forMarshaling) {
     (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->headerSize, sizeof(uint32_t));
-    vkStream->write((VkPipelineCacheHeaderVersion*)&forMarshaling->headerVersion, sizeof(VkPipelineCacheHeaderVersion));
+    vkStream->write((VkPipelineCacheHeaderVersion*)&forMarshaling->headerVersion,
+                    sizeof(VkPipelineCacheHeaderVersion));
     vkStream->write((uint32_t*)&forMarshaling->vendorID, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->deviceID, sizeof(uint32_t));
     vkStream->write((uint8_t*)forMarshaling->pipelineCacheUUID, VK_UUID_SIZE * sizeof(uint8_t));
 }
 
-void unmarshal_VkPipelineCacheHeaderVersionOne(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineCacheHeaderVersionOne* forUnmarshaling)
-{
+void unmarshal_VkPipelineCacheHeaderVersionOne(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkPipelineCacheHeaderVersionOne* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->headerSize, sizeof(uint32_t));
-    vkStream->read((VkPipelineCacheHeaderVersion*)&forUnmarshaling->headerVersion, sizeof(VkPipelineCacheHeaderVersion));
+    vkStream->read((VkPipelineCacheHeaderVersion*)&forUnmarshaling->headerVersion,
+                   sizeof(VkPipelineCacheHeaderVersion));
     vkStream->read((uint32_t*)&forUnmarshaling->vendorID, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->deviceID, sizeof(uint32_t));
     vkStream->read((uint8_t*)forUnmarshaling->pipelineCacheUUID, VK_UUID_SIZE * sizeof(uint8_t));
 }
 
-void marshal_VkAllocationCallbacks(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAllocationCallbacks* forMarshaling)
-{
+void marshal_VkAllocationCallbacks(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkAllocationCallbacks* forMarshaling) {
     (void)rootType;
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pUserData;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pUserData)
-    {
+    if (forMarshaling->pUserData) {
         vkStream->write((void*)forMarshaling->pUserData, sizeof(uint8_t));
     }
     uint64_t cgen_var_1 = (uint64_t)forMarshaling->pfnAllocation;
@@ -534,152 +442,123 @@
     vkStream->putBe64(cgen_var_5);
 }
 
-void unmarshal_VkAllocationCallbacks(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAllocationCallbacks* forUnmarshaling)
-{
+void unmarshal_VkAllocationCallbacks(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkAllocationCallbacks* forUnmarshaling) {
     (void)rootType;
     // WARNING PTR CHECK
     forUnmarshaling->pUserData = (void*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pUserData)
-    {
+    if (forUnmarshaling->pUserData) {
         vkStream->alloc((void**)&forUnmarshaling->pUserData, sizeof(uint8_t));
         vkStream->read((void*)forUnmarshaling->pUserData, sizeof(uint8_t));
     }
     forUnmarshaling->pfnAllocation = (PFN_vkAllocationFunction)vkStream->getBe64();
     forUnmarshaling->pfnReallocation = (PFN_vkReallocationFunction)vkStream->getBe64();
     forUnmarshaling->pfnFree = (PFN_vkFreeFunction)vkStream->getBe64();
-    forUnmarshaling->pfnInternalAllocation = (PFN_vkInternalAllocationNotification)vkStream->getBe64();
+    forUnmarshaling->pfnInternalAllocation =
+        (PFN_vkInternalAllocationNotification)vkStream->getBe64();
     forUnmarshaling->pfnInternalFree = (PFN_vkInternalFreeNotification)vkStream->getBe64();
 }
 
-void marshal_VkApplicationInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkApplicationInfo* forMarshaling)
-{
+void marshal_VkApplicationInfo(VulkanStream* vkStream, VkStructureType rootType,
+                               const VkApplicationInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
-    {
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT) {
         // WARNING PTR CHECK
         uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pApplicationName;
         vkStream->putBe64(cgen_var_0);
-        if (forMarshaling->pApplicationName)
-        {
+        if (forMarshaling->pApplicationName) {
             vkStream->putString(forMarshaling->pApplicationName);
         }
-    }
-    else
-    {
+    } else {
         vkStream->putString(forMarshaling->pApplicationName);
     }
     vkStream->write((uint32_t*)&forMarshaling->applicationVersion, sizeof(uint32_t));
-    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
-    {
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT) {
         // WARNING PTR CHECK
         uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pEngineName;
         vkStream->putBe64(cgen_var_0);
-        if (forMarshaling->pEngineName)
-        {
+        if (forMarshaling->pEngineName) {
             vkStream->putString(forMarshaling->pEngineName);
         }
-    }
-    else
-    {
+    } else {
         vkStream->putString(forMarshaling->pEngineName);
     }
     vkStream->write((uint32_t*)&forMarshaling->engineVersion, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->apiVersion, sizeof(uint32_t));
 }
 
-void unmarshal_VkApplicationInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkApplicationInfo* forUnmarshaling)
-{
+void unmarshal_VkApplicationInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                 VkApplicationInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
-    {
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT) {
         // WARNING PTR CHECK
         forUnmarshaling->pApplicationName = (const char*)(uintptr_t)vkStream->getBe64();
-        if (forUnmarshaling->pApplicationName)
-        {
+        if (forUnmarshaling->pApplicationName) {
             vkStream->loadStringInPlace((char**)&forUnmarshaling->pApplicationName);
         }
-    }
-    else
-    {
+    } else {
         vkStream->loadStringInPlace((char**)&forUnmarshaling->pApplicationName);
     }
     vkStream->read((uint32_t*)&forUnmarshaling->applicationVersion, sizeof(uint32_t));
-    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
-    {
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT) {
         // WARNING PTR CHECK
         forUnmarshaling->pEngineName = (const char*)(uintptr_t)vkStream->getBe64();
-        if (forUnmarshaling->pEngineName)
-        {
+        if (forUnmarshaling->pEngineName) {
             vkStream->loadStringInPlace((char**)&forUnmarshaling->pEngineName);
         }
-    }
-    else
-    {
+    } else {
         vkStream->loadStringInPlace((char**)&forUnmarshaling->pEngineName);
     }
     vkStream->read((uint32_t*)&forUnmarshaling->engineVersion, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->apiVersion, sizeof(uint32_t));
 }
 
-void marshal_VkFormatProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkFormatProperties* forMarshaling)
-{
+void marshal_VkFormatProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                const VkFormatProperties* forMarshaling) {
     (void)rootType;
-    vkStream->write((VkFormatFeatureFlags*)&forMarshaling->linearTilingFeatures, sizeof(VkFormatFeatureFlags));
-    vkStream->write((VkFormatFeatureFlags*)&forMarshaling->optimalTilingFeatures, sizeof(VkFormatFeatureFlags));
-    vkStream->write((VkFormatFeatureFlags*)&forMarshaling->bufferFeatures, sizeof(VkFormatFeatureFlags));
+    vkStream->write((VkFormatFeatureFlags*)&forMarshaling->linearTilingFeatures,
+                    sizeof(VkFormatFeatureFlags));
+    vkStream->write((VkFormatFeatureFlags*)&forMarshaling->optimalTilingFeatures,
+                    sizeof(VkFormatFeatureFlags));
+    vkStream->write((VkFormatFeatureFlags*)&forMarshaling->bufferFeatures,
+                    sizeof(VkFormatFeatureFlags));
 }
 
-void unmarshal_VkFormatProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFormatProperties* forUnmarshaling)
-{
+void unmarshal_VkFormatProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkFormatProperties* forUnmarshaling) {
     (void)rootType;
-    vkStream->read((VkFormatFeatureFlags*)&forUnmarshaling->linearTilingFeatures, sizeof(VkFormatFeatureFlags));
-    vkStream->read((VkFormatFeatureFlags*)&forUnmarshaling->optimalTilingFeatures, sizeof(VkFormatFeatureFlags));
-    vkStream->read((VkFormatFeatureFlags*)&forUnmarshaling->bufferFeatures, sizeof(VkFormatFeatureFlags));
+    vkStream->read((VkFormatFeatureFlags*)&forUnmarshaling->linearTilingFeatures,
+                   sizeof(VkFormatFeatureFlags));
+    vkStream->read((VkFormatFeatureFlags*)&forUnmarshaling->optimalTilingFeatures,
+                   sizeof(VkFormatFeatureFlags));
+    vkStream->read((VkFormatFeatureFlags*)&forUnmarshaling->bufferFeatures,
+                   sizeof(VkFormatFeatureFlags));
 }
 
-void marshal_VkImageFormatProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageFormatProperties* forMarshaling)
-{
+void marshal_VkImageFormatProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkImageFormatProperties* forMarshaling) {
     (void)rootType;
     marshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forMarshaling->maxExtent));
     vkStream->write((uint32_t*)&forMarshaling->maxMipLevels, sizeof(uint32_t));
@@ -688,11 +567,8 @@
     vkStream->write((VkDeviceSize*)&forMarshaling->maxResourceSize, sizeof(VkDeviceSize));
 }
 
-void unmarshal_VkImageFormatProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageFormatProperties* forUnmarshaling)
-{
+void unmarshal_VkImageFormatProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkImageFormatProperties* forUnmarshaling) {
     (void)rootType;
     unmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forUnmarshaling->maxExtent));
     vkStream->read((uint32_t*)&forUnmarshaling->maxMipLevels, sizeof(uint32_t));
@@ -701,15 +577,11 @@
     vkStream->read((VkDeviceSize*)&forUnmarshaling->maxResourceSize, sizeof(VkDeviceSize));
 }
 
-void marshal_VkInstanceCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkInstanceCreateInfo* forMarshaling)
-{
+void marshal_VkInstanceCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkInstanceCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -717,46 +589,45 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pApplicationInfo;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pApplicationInfo)
-    {
-        marshal_VkApplicationInfo(vkStream, rootType, (const VkApplicationInfo*)(forMarshaling->pApplicationInfo));
+    if (forMarshaling->pApplicationInfo) {
+        marshal_VkApplicationInfo(vkStream, rootType,
+                                  (const VkApplicationInfo*)(forMarshaling->pApplicationInfo));
     }
     vkStream->write((uint32_t*)&forMarshaling->enabledLayerCount, sizeof(uint32_t));
     saveStringArray(vkStream, forMarshaling->ppEnabledLayerNames, forMarshaling->enabledLayerCount);
     vkStream->write((uint32_t*)&forMarshaling->enabledExtensionCount, sizeof(uint32_t));
-    saveStringArray(vkStream, forMarshaling->ppEnabledExtensionNames, forMarshaling->enabledExtensionCount);
+    saveStringArray(vkStream, forMarshaling->ppEnabledExtensionNames,
+                    forMarshaling->enabledExtensionCount);
 }
 
-void unmarshal_VkInstanceCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkInstanceCreateInfo* forUnmarshaling)
-{
+void unmarshal_VkInstanceCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkInstanceCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkInstanceCreateFlags*)&forUnmarshaling->flags, sizeof(VkInstanceCreateFlags));
     // WARNING PTR CHECK
     forUnmarshaling->pApplicationInfo = (const VkApplicationInfo*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pApplicationInfo)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pApplicationInfo, sizeof(const VkApplicationInfo));
-        unmarshal_VkApplicationInfo(vkStream, rootType, (VkApplicationInfo*)(forUnmarshaling->pApplicationInfo));
+    if (forUnmarshaling->pApplicationInfo) {
+        vkStream->alloc((void**)&forUnmarshaling->pApplicationInfo,
+                        sizeof(const VkApplicationInfo));
+        unmarshal_VkApplicationInfo(vkStream, rootType,
+                                    (VkApplicationInfo*)(forUnmarshaling->pApplicationInfo));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->enabledLayerCount, sizeof(uint32_t));
     vkStream->loadStringArrayInPlace((char***)&forUnmarshaling->ppEnabledLayerNames);
@@ -764,51 +635,38 @@
     vkStream->loadStringArrayInPlace((char***)&forUnmarshaling->ppEnabledExtensionNames);
 }
 
-void marshal_VkMemoryHeap(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMemoryHeap* forMarshaling)
-{
+void marshal_VkMemoryHeap(VulkanStream* vkStream, VkStructureType rootType,
+                          const VkMemoryHeap* forMarshaling) {
     (void)rootType;
     vkStream->write((VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
     vkStream->write((VkMemoryHeapFlags*)&forMarshaling->flags, sizeof(VkMemoryHeapFlags));
 }
 
-void unmarshal_VkMemoryHeap(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryHeap* forUnmarshaling)
-{
+void unmarshal_VkMemoryHeap(VulkanStream* vkStream, VkStructureType rootType,
+                            VkMemoryHeap* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkDeviceSize*)&forUnmarshaling->size, sizeof(VkDeviceSize));
     vkStream->read((VkMemoryHeapFlags*)&forUnmarshaling->flags, sizeof(VkMemoryHeapFlags));
 }
 
-void marshal_VkMemoryType(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMemoryType* forMarshaling)
-{
+void marshal_VkMemoryType(VulkanStream* vkStream, VkStructureType rootType,
+                          const VkMemoryType* forMarshaling) {
     (void)rootType;
-    vkStream->write((VkMemoryPropertyFlags*)&forMarshaling->propertyFlags, sizeof(VkMemoryPropertyFlags));
+    vkStream->write((VkMemoryPropertyFlags*)&forMarshaling->propertyFlags,
+                    sizeof(VkMemoryPropertyFlags));
     vkStream->write((uint32_t*)&forMarshaling->heapIndex, sizeof(uint32_t));
 }
 
-void unmarshal_VkMemoryType(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryType* forUnmarshaling)
-{
+void unmarshal_VkMemoryType(VulkanStream* vkStream, VkStructureType rootType,
+                            VkMemoryType* forUnmarshaling) {
     (void)rootType;
-    vkStream->read((VkMemoryPropertyFlags*)&forUnmarshaling->propertyFlags, sizeof(VkMemoryPropertyFlags));
+    vkStream->read((VkMemoryPropertyFlags*)&forUnmarshaling->propertyFlags,
+                   sizeof(VkMemoryPropertyFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->heapIndex, sizeof(uint32_t));
 }
 
-void marshal_VkPhysicalDeviceFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceFeatures* forMarshaling)
-{
+void marshal_VkPhysicalDeviceFeatures(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkPhysicalDeviceFeatures* forMarshaling) {
     (void)rootType;
     vkStream->write((VkBool32*)&forMarshaling->robustBufferAccess, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->fullDrawIndexUint32, sizeof(VkBool32));
@@ -837,16 +695,23 @@
     vkStream->write((VkBool32*)&forMarshaling->pipelineStatisticsQuery, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->vertexPipelineStoresAndAtomics, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->fragmentStoresAndAtomics, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderTessellationAndGeometryPointSize, sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderTessellationAndGeometryPointSize,
+                    sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->shaderImageGatherExtended, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->shaderStorageImageExtendedFormats, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->shaderStorageImageMultisample, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderStorageImageReadWithoutFormat, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderStorageImageWriteWithoutFormat, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderUniformBufferArrayDynamicIndexing, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderSampledImageArrayDynamicIndexing, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderStorageBufferArrayDynamicIndexing, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderStorageImageArrayDynamicIndexing, sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderStorageImageReadWithoutFormat,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderStorageImageWriteWithoutFormat,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderUniformBufferArrayDynamicIndexing,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderSampledImageArrayDynamicIndexing,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderStorageBufferArrayDynamicIndexing,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderStorageImageArrayDynamicIndexing,
+                    sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->shaderClipDistance, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->shaderCullDistance, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->shaderFloat64, sizeof(VkBool32));
@@ -867,11 +732,8 @@
     vkStream->write((VkBool32*)&forMarshaling->inheritedQueries, sizeof(VkBool32));
 }
 
-void unmarshal_VkPhysicalDeviceFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFeatures* forUnmarshaling)
-{
+void unmarshal_VkPhysicalDeviceFeatures(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkPhysicalDeviceFeatures* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkBool32*)&forUnmarshaling->robustBufferAccess, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->fullDrawIndexUint32, sizeof(VkBool32));
@@ -900,16 +762,24 @@
     vkStream->read((VkBool32*)&forUnmarshaling->pipelineStatisticsQuery, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->vertexPipelineStoresAndAtomics, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->fragmentStoresAndAtomics, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderTessellationAndGeometryPointSize, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderTessellationAndGeometryPointSize,
+                   sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->shaderImageGatherExtended, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderStorageImageExtendedFormats, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderStorageImageExtendedFormats,
+                   sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->shaderStorageImageMultisample, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderStorageImageReadWithoutFormat, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderStorageImageWriteWithoutFormat, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderUniformBufferArrayDynamicIndexing, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderSampledImageArrayDynamicIndexing, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderStorageBufferArrayDynamicIndexing, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderStorageImageArrayDynamicIndexing, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderStorageImageReadWithoutFormat,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderStorageImageWriteWithoutFormat,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderUniformBufferArrayDynamicIndexing,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderSampledImageArrayDynamicIndexing,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderStorageBufferArrayDynamicIndexing,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderStorageImageArrayDynamicIndexing,
+                   sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->shaderClipDistance, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->shaderCullDistance, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->shaderFloat64, sizeof(VkBool32));
@@ -930,11 +800,8 @@
     vkStream->read((VkBool32*)&forUnmarshaling->inheritedQueries, sizeof(VkBool32));
 }
 
-void marshal_VkPhysicalDeviceLimits(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceLimits* forMarshaling)
-{
+void marshal_VkPhysicalDeviceLimits(VulkanStream* vkStream, VkStructureType rootType,
+                                    const VkPhysicalDeviceLimits* forMarshaling) {
     (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->maxImageDimension1D, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxImageDimension2D, sizeof(uint32_t));
@@ -951,17 +818,24 @@
     vkStream->write((VkDeviceSize*)&forMarshaling->sparseAddressSpaceSize, sizeof(VkDeviceSize));
     vkStream->write((uint32_t*)&forMarshaling->maxBoundDescriptorSets, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorSamplers, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorUniformBuffers, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorStorageBuffers, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorSampledImages, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorStorageImages, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorInputAttachments, sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorUniformBuffers,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorStorageBuffers,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorSampledImages,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorStorageImages,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorInputAttachments,
+                    sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxPerStageResources, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetSamplers, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUniformBuffers, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUniformBuffersDynamic, sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUniformBuffersDynamic,
+                    sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetStorageBuffers, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetStorageBuffersDynamic, sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetStorageBuffersDynamic,
+                    sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetSampledImages, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetStorageImages, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetInputAttachments, sizeof(uint32_t));
@@ -972,12 +846,18 @@
     vkStream->write((uint32_t*)&forMarshaling->maxVertexOutputComponents, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxTessellationGenerationLevel, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxTessellationPatchSize, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxTessellationControlPerVertexInputComponents, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxTessellationControlPerVertexOutputComponents, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxTessellationControlPerPatchOutputComponents, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxTessellationControlTotalOutputComponents, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxTessellationEvaluationInputComponents, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxTessellationEvaluationOutputComponents, sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxTessellationControlPerVertexInputComponents,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxTessellationControlPerVertexOutputComponents,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxTessellationControlPerPatchOutputComponents,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxTessellationControlTotalOutputComponents,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxTessellationEvaluationInputComponents,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxTessellationEvaluationOutputComponents,
+                    sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxGeometryShaderInvocations, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxGeometryInputComponents, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxGeometryOutputComponents, sizeof(uint32_t));
@@ -986,7 +866,8 @@
     vkStream->write((uint32_t*)&forMarshaling->maxFragmentInputComponents, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxFragmentOutputAttachments, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxFragmentDualSrcAttachments, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxFragmentCombinedOutputResources, sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxFragmentCombinedOutputResources,
+                    sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxComputeSharedMemorySize, sizeof(uint32_t));
     vkStream->write((uint32_t*)forMarshaling->maxComputeWorkGroupCount, 3 * sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxComputeWorkGroupInvocations, sizeof(uint32_t));
@@ -1004,9 +885,12 @@
     vkStream->write((uint32_t*)&forMarshaling->viewportSubPixelBits, sizeof(uint32_t));
     uint64_t cgen_var_0 = (uint64_t)forMarshaling->minMemoryMapAlignment;
     vkStream->putBe64(cgen_var_0);
-    vkStream->write((VkDeviceSize*)&forMarshaling->minTexelBufferOffsetAlignment, sizeof(VkDeviceSize));
-    vkStream->write((VkDeviceSize*)&forMarshaling->minUniformBufferOffsetAlignment, sizeof(VkDeviceSize));
-    vkStream->write((VkDeviceSize*)&forMarshaling->minStorageBufferOffsetAlignment, sizeof(VkDeviceSize));
+    vkStream->write((VkDeviceSize*)&forMarshaling->minTexelBufferOffsetAlignment,
+                    sizeof(VkDeviceSize));
+    vkStream->write((VkDeviceSize*)&forMarshaling->minUniformBufferOffsetAlignment,
+                    sizeof(VkDeviceSize));
+    vkStream->write((VkDeviceSize*)&forMarshaling->minStorageBufferOffsetAlignment,
+                    sizeof(VkDeviceSize));
     vkStream->write((int32_t*)&forMarshaling->minTexelOffset, sizeof(int32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxTexelOffset, sizeof(uint32_t));
     vkStream->write((int32_t*)&forMarshaling->minTexelGatherOffset, sizeof(int32_t));
@@ -1017,16 +901,25 @@
     vkStream->write((uint32_t*)&forMarshaling->maxFramebufferWidth, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxFramebufferHeight, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxFramebufferLayers, sizeof(uint32_t));
-    vkStream->write((VkSampleCountFlags*)&forMarshaling->framebufferColorSampleCounts, sizeof(VkSampleCountFlags));
-    vkStream->write((VkSampleCountFlags*)&forMarshaling->framebufferDepthSampleCounts, sizeof(VkSampleCountFlags));
-    vkStream->write((VkSampleCountFlags*)&forMarshaling->framebufferStencilSampleCounts, sizeof(VkSampleCountFlags));
-    vkStream->write((VkSampleCountFlags*)&forMarshaling->framebufferNoAttachmentsSampleCounts, sizeof(VkSampleCountFlags));
+    vkStream->write((VkSampleCountFlags*)&forMarshaling->framebufferColorSampleCounts,
+                    sizeof(VkSampleCountFlags));
+    vkStream->write((VkSampleCountFlags*)&forMarshaling->framebufferDepthSampleCounts,
+                    sizeof(VkSampleCountFlags));
+    vkStream->write((VkSampleCountFlags*)&forMarshaling->framebufferStencilSampleCounts,
+                    sizeof(VkSampleCountFlags));
+    vkStream->write((VkSampleCountFlags*)&forMarshaling->framebufferNoAttachmentsSampleCounts,
+                    sizeof(VkSampleCountFlags));
     vkStream->write((uint32_t*)&forMarshaling->maxColorAttachments, sizeof(uint32_t));
-    vkStream->write((VkSampleCountFlags*)&forMarshaling->sampledImageColorSampleCounts, sizeof(VkSampleCountFlags));
-    vkStream->write((VkSampleCountFlags*)&forMarshaling->sampledImageIntegerSampleCounts, sizeof(VkSampleCountFlags));
-    vkStream->write((VkSampleCountFlags*)&forMarshaling->sampledImageDepthSampleCounts, sizeof(VkSampleCountFlags));
-    vkStream->write((VkSampleCountFlags*)&forMarshaling->sampledImageStencilSampleCounts, sizeof(VkSampleCountFlags));
-    vkStream->write((VkSampleCountFlags*)&forMarshaling->storageImageSampleCounts, sizeof(VkSampleCountFlags));
+    vkStream->write((VkSampleCountFlags*)&forMarshaling->sampledImageColorSampleCounts,
+                    sizeof(VkSampleCountFlags));
+    vkStream->write((VkSampleCountFlags*)&forMarshaling->sampledImageIntegerSampleCounts,
+                    sizeof(VkSampleCountFlags));
+    vkStream->write((VkSampleCountFlags*)&forMarshaling->sampledImageDepthSampleCounts,
+                    sizeof(VkSampleCountFlags));
+    vkStream->write((VkSampleCountFlags*)&forMarshaling->sampledImageStencilSampleCounts,
+                    sizeof(VkSampleCountFlags));
+    vkStream->write((VkSampleCountFlags*)&forMarshaling->storageImageSampleCounts,
+                    sizeof(VkSampleCountFlags));
     vkStream->write((uint32_t*)&forMarshaling->maxSampleMaskWords, sizeof(uint32_t));
     vkStream->write((VkBool32*)&forMarshaling->timestampComputeAndGraphics, sizeof(VkBool32));
     vkStream->write((float*)&forMarshaling->timestampPeriod, sizeof(float));
@@ -1040,16 +933,15 @@
     vkStream->write((float*)&forMarshaling->lineWidthGranularity, sizeof(float));
     vkStream->write((VkBool32*)&forMarshaling->strictLines, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->standardSampleLocations, sizeof(VkBool32));
-    vkStream->write((VkDeviceSize*)&forMarshaling->optimalBufferCopyOffsetAlignment, sizeof(VkDeviceSize));
-    vkStream->write((VkDeviceSize*)&forMarshaling->optimalBufferCopyRowPitchAlignment, sizeof(VkDeviceSize));
+    vkStream->write((VkDeviceSize*)&forMarshaling->optimalBufferCopyOffsetAlignment,
+                    sizeof(VkDeviceSize));
+    vkStream->write((VkDeviceSize*)&forMarshaling->optimalBufferCopyRowPitchAlignment,
+                    sizeof(VkDeviceSize));
     vkStream->write((VkDeviceSize*)&forMarshaling->nonCoherentAtomSize, sizeof(VkDeviceSize));
 }
 
-void unmarshal_VkPhysicalDeviceLimits(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceLimits* forUnmarshaling)
-{
+void unmarshal_VkPhysicalDeviceLimits(VulkanStream* vkStream, VkStructureType rootType,
+                                      VkPhysicalDeviceLimits* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->maxImageDimension1D, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxImageDimension2D, sizeof(uint32_t));
@@ -1066,17 +958,24 @@
     vkStream->read((VkDeviceSize*)&forUnmarshaling->sparseAddressSpaceSize, sizeof(VkDeviceSize));
     vkStream->read((uint32_t*)&forUnmarshaling->maxBoundDescriptorSets, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorSamplers, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUniformBuffers, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorStorageBuffers, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorSampledImages, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorStorageImages, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorInputAttachments, sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUniformBuffers,
+                   sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorStorageBuffers,
+                   sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorSampledImages,
+                   sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorStorageImages,
+                   sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorInputAttachments,
+                   sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageResources, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetSamplers, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetUniformBuffers, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetUniformBuffersDynamic, sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetUniformBuffersDynamic,
+                   sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetStorageBuffers, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetStorageBuffersDynamic, sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetStorageBuffersDynamic,
+                   sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetSampledImages, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetStorageImages, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetInputAttachments, sizeof(uint32_t));
@@ -1087,12 +986,18 @@
     vkStream->read((uint32_t*)&forUnmarshaling->maxVertexOutputComponents, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxTessellationGenerationLevel, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxTessellationPatchSize, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxTessellationControlPerVertexInputComponents, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxTessellationControlPerVertexOutputComponents, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxTessellationControlPerPatchOutputComponents, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxTessellationControlTotalOutputComponents, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxTessellationEvaluationInputComponents, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxTessellationEvaluationOutputComponents, sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxTessellationControlPerVertexInputComponents,
+                   sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxTessellationControlPerVertexOutputComponents,
+                   sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxTessellationControlPerPatchOutputComponents,
+                   sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxTessellationControlTotalOutputComponents,
+                   sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxTessellationEvaluationInputComponents,
+                   sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxTessellationEvaluationOutputComponents,
+                   sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxGeometryShaderInvocations, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxGeometryInputComponents, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxGeometryOutputComponents, sizeof(uint32_t));
@@ -1101,7 +1006,8 @@
     vkStream->read((uint32_t*)&forUnmarshaling->maxFragmentInputComponents, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxFragmentOutputAttachments, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxFragmentDualSrcAttachments, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxFragmentCombinedOutputResources, sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxFragmentCombinedOutputResources,
+                   sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxComputeSharedMemorySize, sizeof(uint32_t));
     vkStream->read((uint32_t*)forUnmarshaling->maxComputeWorkGroupCount, 3 * sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxComputeWorkGroupInvocations, sizeof(uint32_t));
@@ -1118,9 +1024,12 @@
     vkStream->read((float*)forUnmarshaling->viewportBoundsRange, 2 * sizeof(float));
     vkStream->read((uint32_t*)&forUnmarshaling->viewportSubPixelBits, sizeof(uint32_t));
     forUnmarshaling->minMemoryMapAlignment = (size_t)vkStream->getBe64();
-    vkStream->read((VkDeviceSize*)&forUnmarshaling->minTexelBufferOffsetAlignment, sizeof(VkDeviceSize));
-    vkStream->read((VkDeviceSize*)&forUnmarshaling->minUniformBufferOffsetAlignment, sizeof(VkDeviceSize));
-    vkStream->read((VkDeviceSize*)&forUnmarshaling->minStorageBufferOffsetAlignment, sizeof(VkDeviceSize));
+    vkStream->read((VkDeviceSize*)&forUnmarshaling->minTexelBufferOffsetAlignment,
+                   sizeof(VkDeviceSize));
+    vkStream->read((VkDeviceSize*)&forUnmarshaling->minUniformBufferOffsetAlignment,
+                   sizeof(VkDeviceSize));
+    vkStream->read((VkDeviceSize*)&forUnmarshaling->minStorageBufferOffsetAlignment,
+                   sizeof(VkDeviceSize));
     vkStream->read((int32_t*)&forUnmarshaling->minTexelOffset, sizeof(int32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxTexelOffset, sizeof(uint32_t));
     vkStream->read((int32_t*)&forUnmarshaling->minTexelGatherOffset, sizeof(int32_t));
@@ -1131,16 +1040,25 @@
     vkStream->read((uint32_t*)&forUnmarshaling->maxFramebufferWidth, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxFramebufferHeight, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxFramebufferLayers, sizeof(uint32_t));
-    vkStream->read((VkSampleCountFlags*)&forUnmarshaling->framebufferColorSampleCounts, sizeof(VkSampleCountFlags));
-    vkStream->read((VkSampleCountFlags*)&forUnmarshaling->framebufferDepthSampleCounts, sizeof(VkSampleCountFlags));
-    vkStream->read((VkSampleCountFlags*)&forUnmarshaling->framebufferStencilSampleCounts, sizeof(VkSampleCountFlags));
-    vkStream->read((VkSampleCountFlags*)&forUnmarshaling->framebufferNoAttachmentsSampleCounts, sizeof(VkSampleCountFlags));
+    vkStream->read((VkSampleCountFlags*)&forUnmarshaling->framebufferColorSampleCounts,
+                   sizeof(VkSampleCountFlags));
+    vkStream->read((VkSampleCountFlags*)&forUnmarshaling->framebufferDepthSampleCounts,
+                   sizeof(VkSampleCountFlags));
+    vkStream->read((VkSampleCountFlags*)&forUnmarshaling->framebufferStencilSampleCounts,
+                   sizeof(VkSampleCountFlags));
+    vkStream->read((VkSampleCountFlags*)&forUnmarshaling->framebufferNoAttachmentsSampleCounts,
+                   sizeof(VkSampleCountFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->maxColorAttachments, sizeof(uint32_t));
-    vkStream->read((VkSampleCountFlags*)&forUnmarshaling->sampledImageColorSampleCounts, sizeof(VkSampleCountFlags));
-    vkStream->read((VkSampleCountFlags*)&forUnmarshaling->sampledImageIntegerSampleCounts, sizeof(VkSampleCountFlags));
-    vkStream->read((VkSampleCountFlags*)&forUnmarshaling->sampledImageDepthSampleCounts, sizeof(VkSampleCountFlags));
-    vkStream->read((VkSampleCountFlags*)&forUnmarshaling->sampledImageStencilSampleCounts, sizeof(VkSampleCountFlags));
-    vkStream->read((VkSampleCountFlags*)&forUnmarshaling->storageImageSampleCounts, sizeof(VkSampleCountFlags));
+    vkStream->read((VkSampleCountFlags*)&forUnmarshaling->sampledImageColorSampleCounts,
+                   sizeof(VkSampleCountFlags));
+    vkStream->read((VkSampleCountFlags*)&forUnmarshaling->sampledImageIntegerSampleCounts,
+                   sizeof(VkSampleCountFlags));
+    vkStream->read((VkSampleCountFlags*)&forUnmarshaling->sampledImageDepthSampleCounts,
+                   sizeof(VkSampleCountFlags));
+    vkStream->read((VkSampleCountFlags*)&forUnmarshaling->sampledImageStencilSampleCounts,
+                   sizeof(VkSampleCountFlags));
+    vkStream->read((VkSampleCountFlags*)&forUnmarshaling->storageImageSampleCounts,
+                   sizeof(VkSampleCountFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->maxSampleMaskWords, sizeof(uint32_t));
     vkStream->read((VkBool32*)&forUnmarshaling->timestampComputeAndGraphics, sizeof(VkBool32));
     vkStream->read((float*)&forUnmarshaling->timestampPeriod, sizeof(float));
@@ -1154,244 +1072,228 @@
     vkStream->read((float*)&forUnmarshaling->lineWidthGranularity, sizeof(float));
     vkStream->read((VkBool32*)&forUnmarshaling->strictLines, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->standardSampleLocations, sizeof(VkBool32));
-    vkStream->read((VkDeviceSize*)&forUnmarshaling->optimalBufferCopyOffsetAlignment, sizeof(VkDeviceSize));
-    vkStream->read((VkDeviceSize*)&forUnmarshaling->optimalBufferCopyRowPitchAlignment, sizeof(VkDeviceSize));
+    vkStream->read((VkDeviceSize*)&forUnmarshaling->optimalBufferCopyOffsetAlignment,
+                   sizeof(VkDeviceSize));
+    vkStream->read((VkDeviceSize*)&forUnmarshaling->optimalBufferCopyRowPitchAlignment,
+                   sizeof(VkDeviceSize));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->nonCoherentAtomSize, sizeof(VkDeviceSize));
 }
 
 void marshal_VkPhysicalDeviceMemoryProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceMemoryProperties* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceMemoryProperties* forMarshaling) {
     (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->memoryTypeCount, sizeof(uint32_t));
-    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_TYPES; ++i)
-    {
+    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_TYPES; ++i) {
         marshal_VkMemoryType(vkStream, rootType, (VkMemoryType*)(forMarshaling->memoryTypes + i));
     }
     vkStream->write((uint32_t*)&forMarshaling->memoryHeapCount, sizeof(uint32_t));
-    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_HEAPS; ++i)
-    {
+    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_HEAPS; ++i) {
         marshal_VkMemoryHeap(vkStream, rootType, (VkMemoryHeap*)(forMarshaling->memoryHeaps + i));
     }
 }
 
-void unmarshal_VkPhysicalDeviceMemoryProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMemoryProperties* forUnmarshaling)
-{
+void unmarshal_VkPhysicalDeviceMemoryProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkPhysicalDeviceMemoryProperties* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->memoryTypeCount, sizeof(uint32_t));
-    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_TYPES; ++i)
-    {
-        unmarshal_VkMemoryType(vkStream, rootType, (VkMemoryType*)(forUnmarshaling->memoryTypes + i));
+    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_TYPES; ++i) {
+        unmarshal_VkMemoryType(vkStream, rootType,
+                               (VkMemoryType*)(forUnmarshaling->memoryTypes + i));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->memoryHeapCount, sizeof(uint32_t));
-    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_HEAPS; ++i)
-    {
-        unmarshal_VkMemoryHeap(vkStream, rootType, (VkMemoryHeap*)(forUnmarshaling->memoryHeaps + i));
+    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_HEAPS; ++i) {
+        unmarshal_VkMemoryHeap(vkStream, rootType,
+                               (VkMemoryHeap*)(forUnmarshaling->memoryHeaps + i));
     }
 }
 
 void marshal_VkPhysicalDeviceSparseProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceSparseProperties* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceSparseProperties* forMarshaling) {
     (void)rootType;
     vkStream->write((VkBool32*)&forMarshaling->residencyStandard2DBlockShape, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->residencyStandard2DMultisampleBlockShape, sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->residencyStandard2DMultisampleBlockShape,
+                    sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->residencyStandard3DBlockShape, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->residencyAlignedMipSize, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->residencyNonResidentStrict, sizeof(VkBool32));
 }
 
-void unmarshal_VkPhysicalDeviceSparseProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSparseProperties* forUnmarshaling)
-{
+void unmarshal_VkPhysicalDeviceSparseProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkPhysicalDeviceSparseProperties* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkBool32*)&forUnmarshaling->residencyStandard2DBlockShape, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->residencyStandard2DMultisampleBlockShape, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->residencyStandard2DMultisampleBlockShape,
+                   sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->residencyStandard3DBlockShape, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->residencyAlignedMipSize, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->residencyNonResidentStrict, sizeof(VkBool32));
 }
 
-void marshal_VkPhysicalDeviceProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceProperties* forMarshaling)
-{
+void marshal_VkPhysicalDeviceProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                        const VkPhysicalDeviceProperties* forMarshaling) {
     (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->apiVersion, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->driverVersion, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->vendorID, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->deviceID, sizeof(uint32_t));
-    vkStream->write((VkPhysicalDeviceType*)&forMarshaling->deviceType, sizeof(VkPhysicalDeviceType));
-    vkStream->write((char*)forMarshaling->deviceName, VK_MAX_PHYSICAL_DEVICE_NAME_SIZE * sizeof(char));
+    vkStream->write((VkPhysicalDeviceType*)&forMarshaling->deviceType,
+                    sizeof(VkPhysicalDeviceType));
+    vkStream->write((char*)forMarshaling->deviceName,
+                    VK_MAX_PHYSICAL_DEVICE_NAME_SIZE * sizeof(char));
     vkStream->write((uint8_t*)forMarshaling->pipelineCacheUUID, VK_UUID_SIZE * sizeof(uint8_t));
-    marshal_VkPhysicalDeviceLimits(vkStream, rootType, (VkPhysicalDeviceLimits*)(&forMarshaling->limits));
-    marshal_VkPhysicalDeviceSparseProperties(vkStream, rootType, (VkPhysicalDeviceSparseProperties*)(&forMarshaling->sparseProperties));
+    marshal_VkPhysicalDeviceLimits(vkStream, rootType,
+                                   (VkPhysicalDeviceLimits*)(&forMarshaling->limits));
+    marshal_VkPhysicalDeviceSparseProperties(
+        vkStream, rootType, (VkPhysicalDeviceSparseProperties*)(&forMarshaling->sparseProperties));
 }
 
-void unmarshal_VkPhysicalDeviceProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceProperties* forUnmarshaling)
-{
+void unmarshal_VkPhysicalDeviceProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkPhysicalDeviceProperties* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->apiVersion, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->driverVersion, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->vendorID, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->deviceID, sizeof(uint32_t));
-    vkStream->read((VkPhysicalDeviceType*)&forUnmarshaling->deviceType, sizeof(VkPhysicalDeviceType));
-    vkStream->read((char*)forUnmarshaling->deviceName, VK_MAX_PHYSICAL_DEVICE_NAME_SIZE * sizeof(char));
+    vkStream->read((VkPhysicalDeviceType*)&forUnmarshaling->deviceType,
+                   sizeof(VkPhysicalDeviceType));
+    vkStream->read((char*)forUnmarshaling->deviceName,
+                   VK_MAX_PHYSICAL_DEVICE_NAME_SIZE * sizeof(char));
     vkStream->read((uint8_t*)forUnmarshaling->pipelineCacheUUID, VK_UUID_SIZE * sizeof(uint8_t));
-    unmarshal_VkPhysicalDeviceLimits(vkStream, rootType, (VkPhysicalDeviceLimits*)(&forUnmarshaling->limits));
-    unmarshal_VkPhysicalDeviceSparseProperties(vkStream, rootType, (VkPhysicalDeviceSparseProperties*)(&forUnmarshaling->sparseProperties));
+    unmarshal_VkPhysicalDeviceLimits(vkStream, rootType,
+                                     (VkPhysicalDeviceLimits*)(&forUnmarshaling->limits));
+    unmarshal_VkPhysicalDeviceSparseProperties(
+        vkStream, rootType,
+        (VkPhysicalDeviceSparseProperties*)(&forUnmarshaling->sparseProperties));
 }
 
-void marshal_VkQueueFamilyProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkQueueFamilyProperties* forMarshaling)
-{
+void marshal_VkQueueFamilyProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkQueueFamilyProperties* forMarshaling) {
     (void)rootType;
     vkStream->write((VkQueueFlags*)&forMarshaling->queueFlags, sizeof(VkQueueFlags));
     vkStream->write((uint32_t*)&forMarshaling->queueCount, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->timestampValidBits, sizeof(uint32_t));
-    marshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forMarshaling->minImageTransferGranularity));
+    marshal_VkExtent3D(vkStream, rootType,
+                       (VkExtent3D*)(&forMarshaling->minImageTransferGranularity));
 }
 
-void unmarshal_VkQueueFamilyProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkQueueFamilyProperties* forUnmarshaling)
-{
+void unmarshal_VkQueueFamilyProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkQueueFamilyProperties* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkQueueFlags*)&forUnmarshaling->queueFlags, sizeof(VkQueueFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->queueCount, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->timestampValidBits, sizeof(uint32_t));
-    unmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forUnmarshaling->minImageTransferGranularity));
+    unmarshal_VkExtent3D(vkStream, rootType,
+                         (VkExtent3D*)(&forUnmarshaling->minImageTransferGranularity));
 }
 
-void marshal_VkDeviceQueueCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDeviceQueueCreateInfo* forMarshaling)
-{
+void marshal_VkDeviceQueueCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkDeviceQueueCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkDeviceQueueCreateFlags*)&forMarshaling->flags, sizeof(VkDeviceQueueCreateFlags));
+    vkStream->write((VkDeviceQueueCreateFlags*)&forMarshaling->flags,
+                    sizeof(VkDeviceQueueCreateFlags));
     vkStream->write((uint32_t*)&forMarshaling->queueFamilyIndex, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->queueCount, sizeof(uint32_t));
-    vkStream->write((const float*)forMarshaling->pQueuePriorities, forMarshaling->queueCount * sizeof(const float));
+    vkStream->write((const float*)forMarshaling->pQueuePriorities,
+                    forMarshaling->queueCount * sizeof(const float));
 }
 
-void unmarshal_VkDeviceQueueCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceQueueCreateInfo* forUnmarshaling)
-{
+void unmarshal_VkDeviceQueueCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkDeviceQueueCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkDeviceQueueCreateFlags*)&forUnmarshaling->flags, sizeof(VkDeviceQueueCreateFlags));
+    vkStream->read((VkDeviceQueueCreateFlags*)&forUnmarshaling->flags,
+                   sizeof(VkDeviceQueueCreateFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->queueFamilyIndex, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->queueCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pQueuePriorities, forUnmarshaling->queueCount * sizeof(const float));
-    vkStream->read((float*)forUnmarshaling->pQueuePriorities, forUnmarshaling->queueCount * sizeof(const float));
+    vkStream->alloc((void**)&forUnmarshaling->pQueuePriorities,
+                    forUnmarshaling->queueCount * sizeof(const float));
+    vkStream->read((float*)forUnmarshaling->pQueuePriorities,
+                   forUnmarshaling->queueCount * sizeof(const float));
 }
 
-void marshal_VkDeviceCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDeviceCreateInfo* forMarshaling)
-{
+void marshal_VkDeviceCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                const VkDeviceCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkDeviceCreateFlags*)&forMarshaling->flags, sizeof(VkDeviceCreateFlags));
     vkStream->write((uint32_t*)&forMarshaling->queueCreateInfoCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->queueCreateInfoCount; ++i)
-        {
-            marshal_VkDeviceQueueCreateInfo(vkStream, rootType, (const VkDeviceQueueCreateInfo*)(forMarshaling->pQueueCreateInfos + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->queueCreateInfoCount; ++i) {
+            marshal_VkDeviceQueueCreateInfo(
+                vkStream, rootType,
+                (const VkDeviceQueueCreateInfo*)(forMarshaling->pQueueCreateInfos + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->enabledLayerCount, sizeof(uint32_t));
     saveStringArray(vkStream, forMarshaling->ppEnabledLayerNames, forMarshaling->enabledLayerCount);
     vkStream->write((uint32_t*)&forMarshaling->enabledExtensionCount, sizeof(uint32_t));
-    saveStringArray(vkStream, forMarshaling->ppEnabledExtensionNames, forMarshaling->enabledExtensionCount);
+    saveStringArray(vkStream, forMarshaling->ppEnabledExtensionNames,
+                    forMarshaling->enabledExtensionCount);
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pEnabledFeatures;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pEnabledFeatures)
-    {
-        marshal_VkPhysicalDeviceFeatures(vkStream, rootType, (const VkPhysicalDeviceFeatures*)(forMarshaling->pEnabledFeatures));
+    if (forMarshaling->pEnabledFeatures) {
+        marshal_VkPhysicalDeviceFeatures(
+            vkStream, rootType, (const VkPhysicalDeviceFeatures*)(forMarshaling->pEnabledFeatures));
     }
 }
 
-void unmarshal_VkDeviceCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceCreateInfo* forUnmarshaling)
-{
+void unmarshal_VkDeviceCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkDeviceCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkDeviceCreateFlags*)&forUnmarshaling->flags, sizeof(VkDeviceCreateFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->queueCreateInfoCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pQueueCreateInfos, forUnmarshaling->queueCreateInfoCount * sizeof(const VkDeviceQueueCreateInfo));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->queueCreateInfoCount; ++i)
-        {
-            unmarshal_VkDeviceQueueCreateInfo(vkStream, rootType, (VkDeviceQueueCreateInfo*)(forUnmarshaling->pQueueCreateInfos + i));
+    vkStream->alloc((void**)&forUnmarshaling->pQueueCreateInfos,
+                    forUnmarshaling->queueCreateInfoCount * sizeof(const VkDeviceQueueCreateInfo));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->queueCreateInfoCount; ++i) {
+            unmarshal_VkDeviceQueueCreateInfo(
+                vkStream, rootType,
+                (VkDeviceQueueCreateInfo*)(forUnmarshaling->pQueueCreateInfos + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->enabledLayerCount, sizeof(uint32_t));
@@ -1399,39 +1301,33 @@
     vkStream->read((uint32_t*)&forUnmarshaling->enabledExtensionCount, sizeof(uint32_t));
     vkStream->loadStringArrayInPlace((char***)&forUnmarshaling->ppEnabledExtensionNames);
     // WARNING PTR CHECK
-    forUnmarshaling->pEnabledFeatures = (const VkPhysicalDeviceFeatures*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pEnabledFeatures)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pEnabledFeatures, sizeof(const VkPhysicalDeviceFeatures));
-        unmarshal_VkPhysicalDeviceFeatures(vkStream, rootType, (VkPhysicalDeviceFeatures*)(forUnmarshaling->pEnabledFeatures));
+    forUnmarshaling->pEnabledFeatures =
+        (const VkPhysicalDeviceFeatures*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pEnabledFeatures) {
+        vkStream->alloc((void**)&forUnmarshaling->pEnabledFeatures,
+                        sizeof(const VkPhysicalDeviceFeatures));
+        unmarshal_VkPhysicalDeviceFeatures(
+            vkStream, rootType, (VkPhysicalDeviceFeatures*)(forUnmarshaling->pEnabledFeatures));
     }
 }
 
-void marshal_VkExtensionProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkExtensionProperties* forMarshaling)
-{
+void marshal_VkExtensionProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkExtensionProperties* forMarshaling) {
     (void)rootType;
     vkStream->write((char*)forMarshaling->extensionName, VK_MAX_EXTENSION_NAME_SIZE * sizeof(char));
     vkStream->write((uint32_t*)&forMarshaling->specVersion, sizeof(uint32_t));
 }
 
-void unmarshal_VkExtensionProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExtensionProperties* forUnmarshaling)
-{
+void unmarshal_VkExtensionProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkExtensionProperties* forUnmarshaling) {
     (void)rootType;
-    vkStream->read((char*)forUnmarshaling->extensionName, VK_MAX_EXTENSION_NAME_SIZE * sizeof(char));
+    vkStream->read((char*)forUnmarshaling->extensionName,
+                   VK_MAX_EXTENSION_NAME_SIZE * sizeof(char));
     vkStream->read((uint32_t*)&forUnmarshaling->specVersion, sizeof(uint32_t));
 }
 
-void marshal_VkLayerProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkLayerProperties* forMarshaling)
-{
+void marshal_VkLayerProperties(VulkanStream* vkStream, VkStructureType rootType,
+                               const VkLayerProperties* forMarshaling) {
     (void)rootType;
     vkStream->write((char*)forMarshaling->layerName, VK_MAX_EXTENSION_NAME_SIZE * sizeof(char));
     vkStream->write((uint32_t*)&forMarshaling->specVersion, sizeof(uint32_t));
@@ -1439,11 +1335,8 @@
     vkStream->write((char*)forMarshaling->description, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
 }
 
-void unmarshal_VkLayerProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkLayerProperties* forUnmarshaling)
-{
+void unmarshal_VkLayerProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                 VkLayerProperties* forUnmarshaling) {
     (void)rootType;
     vkStream->read((char*)forUnmarshaling->layerName, VK_MAX_EXTENSION_NAME_SIZE * sizeof(char));
     vkStream->read((uint32_t*)&forUnmarshaling->specVersion, sizeof(uint32_t));
@@ -1451,157 +1344,150 @@
     vkStream->read((char*)forUnmarshaling->description, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
 }
 
-void marshal_VkSubmitInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSubmitInfo* forMarshaling)
-{
+void marshal_VkSubmitInfo(VulkanStream* vkStream, VkStructureType rootType,
+                          const VkSubmitInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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->handleMapping()->mapHandles_VkSemaphore_u64(
+            forMarshaling->pWaitSemaphores, cgen_var_0, forMarshaling->waitSemaphoreCount);
         vkStream->write((uint64_t*)cgen_var_0, forMarshaling->waitSemaphoreCount * 8);
     }
-    vkStream->write((const VkPipelineStageFlags*)forMarshaling->pWaitDstStageMask, forMarshaling->waitSemaphoreCount * sizeof(const VkPipelineStageFlags));
+    vkStream->write((const VkPipelineStageFlags*)forMarshaling->pWaitDstStageMask,
+                    forMarshaling->waitSemaphoreCount * sizeof(const VkPipelineStageFlags));
     vkStream->write((uint32_t*)&forMarshaling->commandBufferCount, sizeof(uint32_t));
-    if (forMarshaling->commandBufferCount)
-    {
+    if (forMarshaling->commandBufferCount) {
         uint64_t* cgen_var_1;
         vkStream->alloc((void**)&cgen_var_1, forMarshaling->commandBufferCount * 8);
-        vkStream->handleMapping()->mapHandles_VkCommandBuffer_u64(forMarshaling->pCommandBuffers, cgen_var_1, forMarshaling->commandBufferCount);
+        vkStream->handleMapping()->mapHandles_VkCommandBuffer_u64(
+            forMarshaling->pCommandBuffers, cgen_var_1, forMarshaling->commandBufferCount);
         vkStream->write((uint64_t*)cgen_var_1, forMarshaling->commandBufferCount * 8);
     }
     vkStream->write((uint32_t*)&forMarshaling->signalSemaphoreCount, sizeof(uint32_t));
-    if (forMarshaling->signalSemaphoreCount)
-    {
+    if (forMarshaling->signalSemaphoreCount) {
         uint64_t* cgen_var_2;
         vkStream->alloc((void**)&cgen_var_2, forMarshaling->signalSemaphoreCount * 8);
-        vkStream->handleMapping()->mapHandles_VkSemaphore_u64(forMarshaling->pSignalSemaphores, cgen_var_2, forMarshaling->signalSemaphoreCount);
+        vkStream->handleMapping()->mapHandles_VkSemaphore_u64(
+            forMarshaling->pSignalSemaphores, cgen_var_2, forMarshaling->signalSemaphoreCount);
         vkStream->write((uint64_t*)cgen_var_2, forMarshaling->signalSemaphoreCount * 8);
     }
 }
 
-void unmarshal_VkSubmitInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubmitInfo* forUnmarshaling)
-{
+void unmarshal_VkSubmitInfo(VulkanStream* vkStream, VkStructureType rootType,
+                            VkSubmitInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->waitSemaphoreCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pWaitSemaphores, forUnmarshaling->waitSemaphoreCount * sizeof(const VkSemaphore));
-    if (forUnmarshaling->waitSemaphoreCount)
-    {
+    vkStream->alloc((void**)&forUnmarshaling->pWaitSemaphores,
+                    forUnmarshaling->waitSemaphoreCount * sizeof(const VkSemaphore));
+    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->handleMapping()->mapHandles_u64_VkSemaphore(
+            cgen_var_0, (VkSemaphore*)forUnmarshaling->pWaitSemaphores,
+            forUnmarshaling->waitSemaphoreCount);
     }
-    vkStream->alloc((void**)&forUnmarshaling->pWaitDstStageMask, forUnmarshaling->waitSemaphoreCount * sizeof(const VkPipelineStageFlags));
-    vkStream->read((VkPipelineStageFlags*)forUnmarshaling->pWaitDstStageMask, forUnmarshaling->waitSemaphoreCount * sizeof(const VkPipelineStageFlags));
+    vkStream->alloc((void**)&forUnmarshaling->pWaitDstStageMask,
+                    forUnmarshaling->waitSemaphoreCount * sizeof(const VkPipelineStageFlags));
+    vkStream->read((VkPipelineStageFlags*)forUnmarshaling->pWaitDstStageMask,
+                   forUnmarshaling->waitSemaphoreCount * sizeof(const VkPipelineStageFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->commandBufferCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pCommandBuffers, forUnmarshaling->commandBufferCount * sizeof(const VkCommandBuffer));
-    if (forUnmarshaling->commandBufferCount)
-    {
+    vkStream->alloc((void**)&forUnmarshaling->pCommandBuffers,
+                    forUnmarshaling->commandBufferCount * sizeof(const VkCommandBuffer));
+    if (forUnmarshaling->commandBufferCount) {
         uint64_t* cgen_var_1;
         vkStream->alloc((void**)&cgen_var_1, forUnmarshaling->commandBufferCount * 8);
         vkStream->read((uint64_t*)cgen_var_1, forUnmarshaling->commandBufferCount * 8);
-        vkStream->handleMapping()->mapHandles_u64_VkCommandBuffer(cgen_var_1, (VkCommandBuffer*)forUnmarshaling->pCommandBuffers, forUnmarshaling->commandBufferCount);
+        vkStream->handleMapping()->mapHandles_u64_VkCommandBuffer(
+            cgen_var_1, (VkCommandBuffer*)forUnmarshaling->pCommandBuffers,
+            forUnmarshaling->commandBufferCount);
     }
     vkStream->read((uint32_t*)&forUnmarshaling->signalSemaphoreCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pSignalSemaphores, forUnmarshaling->signalSemaphoreCount * sizeof(const VkSemaphore));
-    if (forUnmarshaling->signalSemaphoreCount)
-    {
+    vkStream->alloc((void**)&forUnmarshaling->pSignalSemaphores,
+                    forUnmarshaling->signalSemaphoreCount * sizeof(const VkSemaphore));
+    if (forUnmarshaling->signalSemaphoreCount) {
         uint64_t* cgen_var_2;
         vkStream->alloc((void**)&cgen_var_2, forUnmarshaling->signalSemaphoreCount * 8);
         vkStream->read((uint64_t*)cgen_var_2, forUnmarshaling->signalSemaphoreCount * 8);
-        vkStream->handleMapping()->mapHandles_u64_VkSemaphore(cgen_var_2, (VkSemaphore*)forUnmarshaling->pSignalSemaphores, forUnmarshaling->signalSemaphoreCount);
+        vkStream->handleMapping()->mapHandles_u64_VkSemaphore(
+            cgen_var_2, (VkSemaphore*)forUnmarshaling->pSignalSemaphores,
+            forUnmarshaling->signalSemaphoreCount);
     }
 }
 
-void marshal_VkMappedMemoryRange(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMappedMemoryRange* forMarshaling)
-{
+void marshal_VkMappedMemoryRange(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkMappedMemoryRange* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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_VkDeviceMemory_u64(&forMarshaling->memory, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkDeviceMemory_u64(&forMarshaling->memory, &cgen_var_0,
+                                                             1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->write((VkDeviceSize*)&forMarshaling->offset, sizeof(VkDeviceSize));
     vkStream->write((VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
 }
 
-void unmarshal_VkMappedMemoryRange(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMappedMemoryRange* forUnmarshaling)
-{
+void unmarshal_VkMappedMemoryRange(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkMappedMemoryRange* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkDeviceMemory(&cgen_var_0, (VkDeviceMemory*)&forUnmarshaling->memory, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkDeviceMemory(
+        &cgen_var_0, (VkDeviceMemory*)&forUnmarshaling->memory, 1);
     vkStream->read((VkDeviceSize*)&forUnmarshaling->offset, sizeof(VkDeviceSize));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->size, sizeof(VkDeviceSize));
 }
 
-void marshal_VkMemoryAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMemoryAllocateInfo* forMarshaling)
-{
+void marshal_VkMemoryAllocateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkMemoryAllocateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -1609,26 +1495,23 @@
     vkStream->write((uint32_t*)&forMarshaling->memoryTypeIndex, sizeof(uint32_t));
 }
 
-void unmarshal_VkMemoryAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryAllocateInfo* forUnmarshaling)
-{
+void unmarshal_VkMemoryAllocateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkMemoryAllocateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -1636,580 +1519,515 @@
     vkStream->read((uint32_t*)&forUnmarshaling->memoryTypeIndex, sizeof(uint32_t));
 }
 
-void marshal_VkMemoryRequirements(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMemoryRequirements* forMarshaling)
-{
+void marshal_VkMemoryRequirements(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkMemoryRequirements* forMarshaling) {
     (void)rootType;
     vkStream->write((VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
     vkStream->write((VkDeviceSize*)&forMarshaling->alignment, sizeof(VkDeviceSize));
     vkStream->write((uint32_t*)&forMarshaling->memoryTypeBits, sizeof(uint32_t));
 }
 
-void unmarshal_VkMemoryRequirements(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryRequirements* forUnmarshaling)
-{
+void unmarshal_VkMemoryRequirements(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkMemoryRequirements* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkDeviceSize*)&forUnmarshaling->size, sizeof(VkDeviceSize));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->alignment, sizeof(VkDeviceSize));
     vkStream->read((uint32_t*)&forUnmarshaling->memoryTypeBits, sizeof(uint32_t));
 }
 
-void marshal_VkSparseMemoryBind(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSparseMemoryBind* forMarshaling)
-{
+void marshal_VkSparseMemoryBind(VulkanStream* vkStream, VkStructureType rootType,
+                                const VkSparseMemoryBind* forMarshaling) {
     (void)rootType;
     vkStream->write((VkDeviceSize*)&forMarshaling->resourceOffset, sizeof(VkDeviceSize));
     vkStream->write((VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
     uint64_t cgen_var_0;
-    vkStream->handleMapping()->mapHandles_VkDeviceMemory_u64(&forMarshaling->memory, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkDeviceMemory_u64(&forMarshaling->memory, &cgen_var_0,
+                                                             1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->write((VkDeviceSize*)&forMarshaling->memoryOffset, sizeof(VkDeviceSize));
-    vkStream->write((VkSparseMemoryBindFlags*)&forMarshaling->flags, sizeof(VkSparseMemoryBindFlags));
+    vkStream->write((VkSparseMemoryBindFlags*)&forMarshaling->flags,
+                    sizeof(VkSparseMemoryBindFlags));
 }
 
-void unmarshal_VkSparseMemoryBind(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSparseMemoryBind* forUnmarshaling)
-{
+void unmarshal_VkSparseMemoryBind(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkSparseMemoryBind* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkDeviceSize*)&forUnmarshaling->resourceOffset, sizeof(VkDeviceSize));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->size, sizeof(VkDeviceSize));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkDeviceMemory(&cgen_var_0, (VkDeviceMemory*)&forUnmarshaling->memory, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkDeviceMemory(
+        &cgen_var_0, (VkDeviceMemory*)&forUnmarshaling->memory, 1);
     vkStream->read((VkDeviceSize*)&forUnmarshaling->memoryOffset, sizeof(VkDeviceSize));
-    vkStream->read((VkSparseMemoryBindFlags*)&forUnmarshaling->flags, sizeof(VkSparseMemoryBindFlags));
+    vkStream->read((VkSparseMemoryBindFlags*)&forUnmarshaling->flags,
+                   sizeof(VkSparseMemoryBindFlags));
 }
 
-void marshal_VkSparseBufferMemoryBindInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSparseBufferMemoryBindInfo* forMarshaling)
-{
+void marshal_VkSparseBufferMemoryBindInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                          const VkSparseBufferMemoryBindInfo* forMarshaling) {
     (void)rootType;
     uint64_t cgen_var_0;
     vkStream->handleMapping()->mapHandles_VkBuffer_u64(&forMarshaling->buffer, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->write((uint32_t*)&forMarshaling->bindCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->bindCount; ++i)
-        {
-            marshal_VkSparseMemoryBind(vkStream, rootType, (const VkSparseMemoryBind*)(forMarshaling->pBinds + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->bindCount; ++i) {
+            marshal_VkSparseMemoryBind(vkStream, rootType,
+                                       (const VkSparseMemoryBind*)(forMarshaling->pBinds + i));
         }
     }
 }
 
-void unmarshal_VkSparseBufferMemoryBindInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSparseBufferMemoryBindInfo* forUnmarshaling)
-{
+void unmarshal_VkSparseBufferMemoryBindInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkSparseBufferMemoryBindInfo* forUnmarshaling) {
     (void)rootType;
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_0, (VkBuffer*)&forUnmarshaling->buffer, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_0,
+                                                       (VkBuffer*)&forUnmarshaling->buffer, 1);
     vkStream->read((uint32_t*)&forUnmarshaling->bindCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pBinds, forUnmarshaling->bindCount * sizeof(const VkSparseMemoryBind));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->bindCount; ++i)
-        {
-            unmarshal_VkSparseMemoryBind(vkStream, rootType, (VkSparseMemoryBind*)(forUnmarshaling->pBinds + i));
+    vkStream->alloc((void**)&forUnmarshaling->pBinds,
+                    forUnmarshaling->bindCount * sizeof(const VkSparseMemoryBind));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->bindCount; ++i) {
+            unmarshal_VkSparseMemoryBind(vkStream, rootType,
+                                         (VkSparseMemoryBind*)(forUnmarshaling->pBinds + i));
         }
     }
 }
 
 void marshal_VkSparseImageOpaqueMemoryBindInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSparseImageOpaqueMemoryBindInfo* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkSparseImageOpaqueMemoryBindInfo* forMarshaling) {
     (void)rootType;
     uint64_t cgen_var_0;
     vkStream->handleMapping()->mapHandles_VkImage_u64(&forMarshaling->image, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->write((uint32_t*)&forMarshaling->bindCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->bindCount; ++i)
-        {
-            marshal_VkSparseMemoryBind(vkStream, rootType, (const VkSparseMemoryBind*)(forMarshaling->pBinds + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->bindCount; ++i) {
+            marshal_VkSparseMemoryBind(vkStream, rootType,
+                                       (const VkSparseMemoryBind*)(forMarshaling->pBinds + i));
         }
     }
 }
 
 void unmarshal_VkSparseImageOpaqueMemoryBindInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSparseImageOpaqueMemoryBindInfo* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSparseImageOpaqueMemoryBindInfo* forUnmarshaling) {
     (void)rootType;
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_0, (VkImage*)&forUnmarshaling->image, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_0,
+                                                      (VkImage*)&forUnmarshaling->image, 1);
     vkStream->read((uint32_t*)&forUnmarshaling->bindCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pBinds, forUnmarshaling->bindCount * sizeof(const VkSparseMemoryBind));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->bindCount; ++i)
-        {
-            unmarshal_VkSparseMemoryBind(vkStream, rootType, (VkSparseMemoryBind*)(forUnmarshaling->pBinds + i));
+    vkStream->alloc((void**)&forUnmarshaling->pBinds,
+                    forUnmarshaling->bindCount * sizeof(const VkSparseMemoryBind));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->bindCount; ++i) {
+            unmarshal_VkSparseMemoryBind(vkStream, rootType,
+                                         (VkSparseMemoryBind*)(forUnmarshaling->pBinds + i));
         }
     }
 }
 
-void marshal_VkImageSubresource(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageSubresource* forMarshaling)
-{
+void marshal_VkImageSubresource(VulkanStream* vkStream, VkStructureType rootType,
+                                const VkImageSubresource* forMarshaling) {
     (void)rootType;
     vkStream->write((VkImageAspectFlags*)&forMarshaling->aspectMask, sizeof(VkImageAspectFlags));
     vkStream->write((uint32_t*)&forMarshaling->mipLevel, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->arrayLayer, sizeof(uint32_t));
 }
 
-void unmarshal_VkImageSubresource(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageSubresource* forUnmarshaling)
-{
+void unmarshal_VkImageSubresource(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkImageSubresource* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkImageAspectFlags*)&forUnmarshaling->aspectMask, sizeof(VkImageAspectFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->mipLevel, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->arrayLayer, sizeof(uint32_t));
 }
 
-void marshal_VkSparseImageMemoryBind(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSparseImageMemoryBind* forMarshaling)
-{
+void marshal_VkSparseImageMemoryBind(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkSparseImageMemoryBind* forMarshaling) {
     (void)rootType;
-    marshal_VkImageSubresource(vkStream, rootType, (VkImageSubresource*)(&forMarshaling->subresource));
+    marshal_VkImageSubresource(vkStream, rootType,
+                               (VkImageSubresource*)(&forMarshaling->subresource));
     marshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forMarshaling->offset));
     marshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forMarshaling->extent));
     uint64_t cgen_var_0;
-    vkStream->handleMapping()->mapHandles_VkDeviceMemory_u64(&forMarshaling->memory, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkDeviceMemory_u64(&forMarshaling->memory, &cgen_var_0,
+                                                             1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->write((VkDeviceSize*)&forMarshaling->memoryOffset, sizeof(VkDeviceSize));
-    vkStream->write((VkSparseMemoryBindFlags*)&forMarshaling->flags, sizeof(VkSparseMemoryBindFlags));
+    vkStream->write((VkSparseMemoryBindFlags*)&forMarshaling->flags,
+                    sizeof(VkSparseMemoryBindFlags));
 }
 
-void unmarshal_VkSparseImageMemoryBind(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSparseImageMemoryBind* forUnmarshaling)
-{
+void unmarshal_VkSparseImageMemoryBind(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkSparseImageMemoryBind* forUnmarshaling) {
     (void)rootType;
-    unmarshal_VkImageSubresource(vkStream, rootType, (VkImageSubresource*)(&forUnmarshaling->subresource));
+    unmarshal_VkImageSubresource(vkStream, rootType,
+                                 (VkImageSubresource*)(&forUnmarshaling->subresource));
     unmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->offset));
     unmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forUnmarshaling->extent));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkDeviceMemory(&cgen_var_0, (VkDeviceMemory*)&forUnmarshaling->memory, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkDeviceMemory(
+        &cgen_var_0, (VkDeviceMemory*)&forUnmarshaling->memory, 1);
     vkStream->read((VkDeviceSize*)&forUnmarshaling->memoryOffset, sizeof(VkDeviceSize));
-    vkStream->read((VkSparseMemoryBindFlags*)&forUnmarshaling->flags, sizeof(VkSparseMemoryBindFlags));
+    vkStream->read((VkSparseMemoryBindFlags*)&forUnmarshaling->flags,
+                   sizeof(VkSparseMemoryBindFlags));
 }
 
-void marshal_VkSparseImageMemoryBindInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSparseImageMemoryBindInfo* forMarshaling)
-{
+void marshal_VkSparseImageMemoryBindInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkSparseImageMemoryBindInfo* forMarshaling) {
     (void)rootType;
     uint64_t cgen_var_0;
     vkStream->handleMapping()->mapHandles_VkImage_u64(&forMarshaling->image, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->write((uint32_t*)&forMarshaling->bindCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->bindCount; ++i)
-        {
-            marshal_VkSparseImageMemoryBind(vkStream, rootType, (const VkSparseImageMemoryBind*)(forMarshaling->pBinds + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->bindCount; ++i) {
+            marshal_VkSparseImageMemoryBind(
+                vkStream, rootType, (const VkSparseImageMemoryBind*)(forMarshaling->pBinds + i));
         }
     }
 }
 
-void unmarshal_VkSparseImageMemoryBindInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSparseImageMemoryBindInfo* forUnmarshaling)
-{
+void unmarshal_VkSparseImageMemoryBindInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkSparseImageMemoryBindInfo* forUnmarshaling) {
     (void)rootType;
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_0, (VkImage*)&forUnmarshaling->image, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_0,
+                                                      (VkImage*)&forUnmarshaling->image, 1);
     vkStream->read((uint32_t*)&forUnmarshaling->bindCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pBinds, forUnmarshaling->bindCount * sizeof(const VkSparseImageMemoryBind));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->bindCount; ++i)
-        {
-            unmarshal_VkSparseImageMemoryBind(vkStream, rootType, (VkSparseImageMemoryBind*)(forUnmarshaling->pBinds + i));
+    vkStream->alloc((void**)&forUnmarshaling->pBinds,
+                    forUnmarshaling->bindCount * sizeof(const VkSparseImageMemoryBind));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->bindCount; ++i) {
+            unmarshal_VkSparseImageMemoryBind(
+                vkStream, rootType, (VkSparseImageMemoryBind*)(forUnmarshaling->pBinds + i));
         }
     }
 }
 
-void marshal_VkBindSparseInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBindSparseInfo* forMarshaling)
-{
+void marshal_VkBindSparseInfo(VulkanStream* vkStream, VkStructureType rootType,
+                              const VkBindSparseInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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->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->bufferBindCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->bufferBindCount; ++i)
-        {
-            marshal_VkSparseBufferMemoryBindInfo(vkStream, rootType, (const VkSparseBufferMemoryBindInfo*)(forMarshaling->pBufferBinds + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->bufferBindCount; ++i) {
+            marshal_VkSparseBufferMemoryBindInfo(
+                vkStream, rootType,
+                (const VkSparseBufferMemoryBindInfo*)(forMarshaling->pBufferBinds + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->imageOpaqueBindCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->imageOpaqueBindCount; ++i)
-        {
-            marshal_VkSparseImageOpaqueMemoryBindInfo(vkStream, rootType, (const VkSparseImageOpaqueMemoryBindInfo*)(forMarshaling->pImageOpaqueBinds + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->imageOpaqueBindCount; ++i) {
+            marshal_VkSparseImageOpaqueMemoryBindInfo(
+                vkStream, rootType,
+                (const VkSparseImageOpaqueMemoryBindInfo*)(forMarshaling->pImageOpaqueBinds + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->imageBindCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->imageBindCount; ++i)
-        {
-            marshal_VkSparseImageMemoryBindInfo(vkStream, rootType, (const VkSparseImageMemoryBindInfo*)(forMarshaling->pImageBinds + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->imageBindCount; ++i) {
+            marshal_VkSparseImageMemoryBindInfo(
+                vkStream, rootType,
+                (const VkSparseImageMemoryBindInfo*)(forMarshaling->pImageBinds + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->signalSemaphoreCount, sizeof(uint32_t));
-    if (forMarshaling->signalSemaphoreCount)
-    {
+    if (forMarshaling->signalSemaphoreCount) {
         uint64_t* cgen_var_1;
         vkStream->alloc((void**)&cgen_var_1, forMarshaling->signalSemaphoreCount * 8);
-        vkStream->handleMapping()->mapHandles_VkSemaphore_u64(forMarshaling->pSignalSemaphores, cgen_var_1, forMarshaling->signalSemaphoreCount);
+        vkStream->handleMapping()->mapHandles_VkSemaphore_u64(
+            forMarshaling->pSignalSemaphores, cgen_var_1, forMarshaling->signalSemaphoreCount);
         vkStream->write((uint64_t*)cgen_var_1, forMarshaling->signalSemaphoreCount * 8);
     }
 }
 
-void unmarshal_VkBindSparseInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindSparseInfo* forUnmarshaling)
-{
+void unmarshal_VkBindSparseInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                VkBindSparseInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->waitSemaphoreCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pWaitSemaphores, forUnmarshaling->waitSemaphoreCount * sizeof(const VkSemaphore));
-    if (forUnmarshaling->waitSemaphoreCount)
-    {
+    vkStream->alloc((void**)&forUnmarshaling->pWaitSemaphores,
+                    forUnmarshaling->waitSemaphoreCount * sizeof(const VkSemaphore));
+    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->handleMapping()->mapHandles_u64_VkSemaphore(
+            cgen_var_0, (VkSemaphore*)forUnmarshaling->pWaitSemaphores,
+            forUnmarshaling->waitSemaphoreCount);
     }
     vkStream->read((uint32_t*)&forUnmarshaling->bufferBindCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pBufferBinds, forUnmarshaling->bufferBindCount * sizeof(const VkSparseBufferMemoryBindInfo));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->bufferBindCount; ++i)
-        {
-            unmarshal_VkSparseBufferMemoryBindInfo(vkStream, rootType, (VkSparseBufferMemoryBindInfo*)(forUnmarshaling->pBufferBinds + i));
+    vkStream->alloc((void**)&forUnmarshaling->pBufferBinds,
+                    forUnmarshaling->bufferBindCount * sizeof(const VkSparseBufferMemoryBindInfo));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->bufferBindCount; ++i) {
+            unmarshal_VkSparseBufferMemoryBindInfo(
+                vkStream, rootType,
+                (VkSparseBufferMemoryBindInfo*)(forUnmarshaling->pBufferBinds + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->imageOpaqueBindCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pImageOpaqueBinds, forUnmarshaling->imageOpaqueBindCount * sizeof(const VkSparseImageOpaqueMemoryBindInfo));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->imageOpaqueBindCount; ++i)
-        {
-            unmarshal_VkSparseImageOpaqueMemoryBindInfo(vkStream, rootType, (VkSparseImageOpaqueMemoryBindInfo*)(forUnmarshaling->pImageOpaqueBinds + i));
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pImageOpaqueBinds,
+        forUnmarshaling->imageOpaqueBindCount * sizeof(const VkSparseImageOpaqueMemoryBindInfo));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->imageOpaqueBindCount; ++i) {
+            unmarshal_VkSparseImageOpaqueMemoryBindInfo(
+                vkStream, rootType,
+                (VkSparseImageOpaqueMemoryBindInfo*)(forUnmarshaling->pImageOpaqueBinds + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->imageBindCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pImageBinds, forUnmarshaling->imageBindCount * sizeof(const VkSparseImageMemoryBindInfo));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->imageBindCount; ++i)
-        {
-            unmarshal_VkSparseImageMemoryBindInfo(vkStream, rootType, (VkSparseImageMemoryBindInfo*)(forUnmarshaling->pImageBinds + i));
+    vkStream->alloc((void**)&forUnmarshaling->pImageBinds,
+                    forUnmarshaling->imageBindCount * sizeof(const VkSparseImageMemoryBindInfo));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->imageBindCount; ++i) {
+            unmarshal_VkSparseImageMemoryBindInfo(
+                vkStream, rootType,
+                (VkSparseImageMemoryBindInfo*)(forUnmarshaling->pImageBinds + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->signalSemaphoreCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pSignalSemaphores, forUnmarshaling->signalSemaphoreCount * sizeof(const VkSemaphore));
-    if (forUnmarshaling->signalSemaphoreCount)
-    {
+    vkStream->alloc((void**)&forUnmarshaling->pSignalSemaphores,
+                    forUnmarshaling->signalSemaphoreCount * sizeof(const VkSemaphore));
+    if (forUnmarshaling->signalSemaphoreCount) {
         uint64_t* cgen_var_1;
         vkStream->alloc((void**)&cgen_var_1, forUnmarshaling->signalSemaphoreCount * 8);
         vkStream->read((uint64_t*)cgen_var_1, forUnmarshaling->signalSemaphoreCount * 8);
-        vkStream->handleMapping()->mapHandles_u64_VkSemaphore(cgen_var_1, (VkSemaphore*)forUnmarshaling->pSignalSemaphores, forUnmarshaling->signalSemaphoreCount);
+        vkStream->handleMapping()->mapHandles_u64_VkSemaphore(
+            cgen_var_1, (VkSemaphore*)forUnmarshaling->pSignalSemaphores,
+            forUnmarshaling->signalSemaphoreCount);
     }
 }
 
-void marshal_VkSparseImageFormatProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSparseImageFormatProperties* forMarshaling)
-{
+void marshal_VkSparseImageFormatProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkSparseImageFormatProperties* forMarshaling) {
     (void)rootType;
     vkStream->write((VkImageAspectFlags*)&forMarshaling->aspectMask, sizeof(VkImageAspectFlags));
     marshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forMarshaling->imageGranularity));
-    vkStream->write((VkSparseImageFormatFlags*)&forMarshaling->flags, sizeof(VkSparseImageFormatFlags));
+    vkStream->write((VkSparseImageFormatFlags*)&forMarshaling->flags,
+                    sizeof(VkSparseImageFormatFlags));
 }
 
-void unmarshal_VkSparseImageFormatProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSparseImageFormatProperties* forUnmarshaling)
-{
+void unmarshal_VkSparseImageFormatProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkSparseImageFormatProperties* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkImageAspectFlags*)&forUnmarshaling->aspectMask, sizeof(VkImageAspectFlags));
     unmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forUnmarshaling->imageGranularity));
-    vkStream->read((VkSparseImageFormatFlags*)&forUnmarshaling->flags, sizeof(VkSparseImageFormatFlags));
+    vkStream->read((VkSparseImageFormatFlags*)&forUnmarshaling->flags,
+                   sizeof(VkSparseImageFormatFlags));
 }
 
-void marshal_VkSparseImageMemoryRequirements(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSparseImageMemoryRequirements* forMarshaling)
-{
+void marshal_VkSparseImageMemoryRequirements(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkSparseImageMemoryRequirements* forMarshaling) {
     (void)rootType;
-    marshal_VkSparseImageFormatProperties(vkStream, rootType, (VkSparseImageFormatProperties*)(&forMarshaling->formatProperties));
+    marshal_VkSparseImageFormatProperties(
+        vkStream, rootType, (VkSparseImageFormatProperties*)(&forMarshaling->formatProperties));
     vkStream->write((uint32_t*)&forMarshaling->imageMipTailFirstLod, sizeof(uint32_t));
     vkStream->write((VkDeviceSize*)&forMarshaling->imageMipTailSize, sizeof(VkDeviceSize));
     vkStream->write((VkDeviceSize*)&forMarshaling->imageMipTailOffset, sizeof(VkDeviceSize));
     vkStream->write((VkDeviceSize*)&forMarshaling->imageMipTailStride, sizeof(VkDeviceSize));
 }
 
-void unmarshal_VkSparseImageMemoryRequirements(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSparseImageMemoryRequirements* forUnmarshaling)
-{
+void unmarshal_VkSparseImageMemoryRequirements(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkSparseImageMemoryRequirements* forUnmarshaling) {
     (void)rootType;
-    unmarshal_VkSparseImageFormatProperties(vkStream, rootType, (VkSparseImageFormatProperties*)(&forUnmarshaling->formatProperties));
+    unmarshal_VkSparseImageFormatProperties(
+        vkStream, rootType, (VkSparseImageFormatProperties*)(&forUnmarshaling->formatProperties));
     vkStream->read((uint32_t*)&forUnmarshaling->imageMipTailFirstLod, sizeof(uint32_t));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->imageMipTailSize, sizeof(VkDeviceSize));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->imageMipTailOffset, sizeof(VkDeviceSize));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->imageMipTailStride, sizeof(VkDeviceSize));
 }
 
-void marshal_VkFenceCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkFenceCreateInfo* forMarshaling)
-{
+void marshal_VkFenceCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                               const VkFenceCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkFenceCreateFlags*)&forMarshaling->flags, sizeof(VkFenceCreateFlags));
 }
 
-void unmarshal_VkFenceCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFenceCreateInfo* forUnmarshaling)
-{
+void unmarshal_VkFenceCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                 VkFenceCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkFenceCreateFlags*)&forUnmarshaling->flags, sizeof(VkFenceCreateFlags));
 }
 
-void marshal_VkSemaphoreCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSemaphoreCreateInfo* forMarshaling)
-{
+void marshal_VkSemaphoreCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkSemaphoreCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkSemaphoreCreateFlags*)&forMarshaling->flags, sizeof(VkSemaphoreCreateFlags));
 }
 
-void unmarshal_VkSemaphoreCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSemaphoreCreateInfo* forUnmarshaling)
-{
+void unmarshal_VkSemaphoreCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkSemaphoreCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkSemaphoreCreateFlags*)&forUnmarshaling->flags, sizeof(VkSemaphoreCreateFlags));
+    vkStream->read((VkSemaphoreCreateFlags*)&forUnmarshaling->flags,
+                   sizeof(VkSemaphoreCreateFlags));
 }
 
-void marshal_VkEventCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkEventCreateInfo* forMarshaling)
-{
+void marshal_VkEventCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                               const VkEventCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkEventCreateFlags*)&forMarshaling->flags, sizeof(VkEventCreateFlags));
 }
 
-void unmarshal_VkEventCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkEventCreateInfo* forUnmarshaling)
-{
+void unmarshal_VkEventCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                 VkEventCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkEventCreateFlags*)&forUnmarshaling->flags, sizeof(VkEventCreateFlags));
 }
 
-void marshal_VkQueryPoolCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkQueryPoolCreateInfo* forMarshaling)
-{
+void marshal_VkQueryPoolCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkQueryPoolCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkQueryPoolCreateFlags*)&forMarshaling->flags, sizeof(VkQueryPoolCreateFlags));
     vkStream->write((VkQueryType*)&forMarshaling->queryType, sizeof(VkQueryType));
     vkStream->write((uint32_t*)&forMarshaling->queryCount, sizeof(uint32_t));
-    vkStream->write((VkQueryPipelineStatisticFlags*)&forMarshaling->pipelineStatistics, sizeof(VkQueryPipelineStatisticFlags));
+    vkStream->write((VkQueryPipelineStatisticFlags*)&forMarshaling->pipelineStatistics,
+                    sizeof(VkQueryPipelineStatisticFlags));
 }
 
-void unmarshal_VkQueryPoolCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkQueryPoolCreateInfo* forUnmarshaling)
-{
+void unmarshal_VkQueryPoolCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkQueryPoolCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkQueryPoolCreateFlags*)&forUnmarshaling->flags, sizeof(VkQueryPoolCreateFlags));
+    vkStream->read((VkQueryPoolCreateFlags*)&forUnmarshaling->flags,
+                   sizeof(VkQueryPoolCreateFlags));
     vkStream->read((VkQueryType*)&forUnmarshaling->queryType, sizeof(VkQueryType));
     vkStream->read((uint32_t*)&forUnmarshaling->queryCount, sizeof(uint32_t));
-    vkStream->read((VkQueryPipelineStatisticFlags*)&forUnmarshaling->pipelineStatistics, sizeof(VkQueryPipelineStatisticFlags));
+    vkStream->read((VkQueryPipelineStatisticFlags*)&forUnmarshaling->pipelineStatistics,
+                   sizeof(VkQueryPipelineStatisticFlags));
 }
 
-void marshal_VkBufferCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBufferCreateInfo* forMarshaling)
-{
+void marshal_VkBufferCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                const VkBufferCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -2221,32 +2039,29 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pQueueFamilyIndices;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pQueueFamilyIndices)
-    {
-        vkStream->write((const uint32_t*)forMarshaling->pQueueFamilyIndices, forMarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
+    if (forMarshaling->pQueueFamilyIndices) {
+        vkStream->write((const uint32_t*)forMarshaling->pQueueFamilyIndices,
+                        forMarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
     }
 }
 
-void unmarshal_VkBufferCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferCreateInfo* forUnmarshaling)
-{
+void unmarshal_VkBufferCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkBufferCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -2257,26 +2072,24 @@
     vkStream->read((uint32_t*)&forUnmarshaling->queueFamilyIndexCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     forUnmarshaling->pQueueFamilyIndices = (const uint32_t*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pQueueFamilyIndices)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pQueueFamilyIndices, forUnmarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
-        vkStream->read((uint32_t*)forUnmarshaling->pQueueFamilyIndices, forUnmarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
+    if (forUnmarshaling->pQueueFamilyIndices) {
+        vkStream->alloc((void**)&forUnmarshaling->pQueueFamilyIndices,
+                        forUnmarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
+        vkStream->read((uint32_t*)forUnmarshaling->pQueueFamilyIndices,
+                       forUnmarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
     }
 }
 
-void marshal_VkBufferViewCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBufferViewCreateInfo* forMarshaling)
-{
+void marshal_VkBufferViewCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                    const VkBufferViewCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkBufferViewCreateFlags*)&forMarshaling->flags, sizeof(VkBufferViewCreateFlags));
+    vkStream->write((VkBufferViewCreateFlags*)&forMarshaling->flags,
+                    sizeof(VkBufferViewCreateFlags));
     uint64_t cgen_var_0;
     vkStream->handleMapping()->mapHandles_VkBuffer_u64(&forMarshaling->buffer, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
@@ -2285,47 +2098,42 @@
     vkStream->write((VkDeviceSize*)&forMarshaling->range, sizeof(VkDeviceSize));
 }
 
-void unmarshal_VkBufferViewCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferViewCreateInfo* forUnmarshaling)
-{
+void unmarshal_VkBufferViewCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                      VkBufferViewCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkBufferViewCreateFlags*)&forUnmarshaling->flags, sizeof(VkBufferViewCreateFlags));
+    vkStream->read((VkBufferViewCreateFlags*)&forUnmarshaling->flags,
+                   sizeof(VkBufferViewCreateFlags));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_0, (VkBuffer*)&forUnmarshaling->buffer, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_0,
+                                                       (VkBuffer*)&forUnmarshaling->buffer, 1);
     vkStream->read((VkFormat*)&forUnmarshaling->format, sizeof(VkFormat));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->offset, sizeof(VkDeviceSize));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->range, sizeof(VkDeviceSize));
 }
 
-void marshal_VkImageCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageCreateInfo* forMarshaling)
-{
+void marshal_VkImageCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                               const VkImageCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -2343,33 +2151,30 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pQueueFamilyIndices;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pQueueFamilyIndices)
-    {
-        vkStream->write((const uint32_t*)forMarshaling->pQueueFamilyIndices, forMarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
+    if (forMarshaling->pQueueFamilyIndices) {
+        vkStream->write((const uint32_t*)forMarshaling->pQueueFamilyIndices,
+                        forMarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
     }
     vkStream->write((VkImageLayout*)&forMarshaling->initialLayout, sizeof(VkImageLayout));
 }
 
-void unmarshal_VkImageCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageCreateInfo* forUnmarshaling)
-{
+void unmarshal_VkImageCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                 VkImageCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -2379,26 +2184,25 @@
     unmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forUnmarshaling->extent));
     vkStream->read((uint32_t*)&forUnmarshaling->mipLevels, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->arrayLayers, sizeof(uint32_t));
-    vkStream->read((VkSampleCountFlagBits*)&forUnmarshaling->samples, sizeof(VkSampleCountFlagBits));
+    vkStream->read((VkSampleCountFlagBits*)&forUnmarshaling->samples,
+                   sizeof(VkSampleCountFlagBits));
     vkStream->read((VkImageTiling*)&forUnmarshaling->tiling, sizeof(VkImageTiling));
     vkStream->read((VkImageUsageFlags*)&forUnmarshaling->usage, sizeof(VkImageUsageFlags));
     vkStream->read((VkSharingMode*)&forUnmarshaling->sharingMode, sizeof(VkSharingMode));
     vkStream->read((uint32_t*)&forUnmarshaling->queueFamilyIndexCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     forUnmarshaling->pQueueFamilyIndices = (const uint32_t*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pQueueFamilyIndices)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pQueueFamilyIndices, forUnmarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
-        vkStream->read((uint32_t*)forUnmarshaling->pQueueFamilyIndices, forUnmarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
+    if (forUnmarshaling->pQueueFamilyIndices) {
+        vkStream->alloc((void**)&forUnmarshaling->pQueueFamilyIndices,
+                        forUnmarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
+        vkStream->read((uint32_t*)forUnmarshaling->pQueueFamilyIndices,
+                       forUnmarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
     }
     vkStream->read((VkImageLayout*)&forUnmarshaling->initialLayout, sizeof(VkImageLayout));
 }
 
-void marshal_VkSubresourceLayout(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSubresourceLayout* forMarshaling)
-{
+void marshal_VkSubresourceLayout(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkSubresourceLayout* forMarshaling) {
     (void)rootType;
     vkStream->write((VkDeviceSize*)&forMarshaling->offset, sizeof(VkDeviceSize));
     vkStream->write((VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
@@ -2407,11 +2211,8 @@
     vkStream->write((VkDeviceSize*)&forMarshaling->depthPitch, sizeof(VkDeviceSize));
 }
 
-void unmarshal_VkSubresourceLayout(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubresourceLayout* forUnmarshaling)
-{
+void unmarshal_VkSubresourceLayout(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkSubresourceLayout* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkDeviceSize*)&forUnmarshaling->offset, sizeof(VkDeviceSize));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->size, sizeof(VkDeviceSize));
@@ -2420,11 +2221,8 @@
     vkStream->read((VkDeviceSize*)&forUnmarshaling->depthPitch, sizeof(VkDeviceSize));
 }
 
-void marshal_VkComponentMapping(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkComponentMapping* forMarshaling)
-{
+void marshal_VkComponentMapping(VulkanStream* vkStream, VkStructureType rootType,
+                                const VkComponentMapping* forMarshaling) {
     (void)rootType;
     vkStream->write((VkComponentSwizzle*)&forMarshaling->r, sizeof(VkComponentSwizzle));
     vkStream->write((VkComponentSwizzle*)&forMarshaling->g, sizeof(VkComponentSwizzle));
@@ -2432,11 +2230,8 @@
     vkStream->write((VkComponentSwizzle*)&forMarshaling->a, sizeof(VkComponentSwizzle));
 }
 
-void unmarshal_VkComponentMapping(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkComponentMapping* forUnmarshaling)
-{
+void unmarshal_VkComponentMapping(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkComponentMapping* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkComponentSwizzle*)&forUnmarshaling->r, sizeof(VkComponentSwizzle));
     vkStream->read((VkComponentSwizzle*)&forUnmarshaling->g, sizeof(VkComponentSwizzle));
@@ -2444,15 +2239,11 @@
     vkStream->read((VkComponentSwizzle*)&forUnmarshaling->a, sizeof(VkComponentSwizzle));
 }
 
-void marshal_VkImageViewCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageViewCreateInfo* forMarshaling)
-{
+void marshal_VkImageViewCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkImageViewCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -2462,142 +2253,138 @@
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->write((VkImageViewType*)&forMarshaling->viewType, sizeof(VkImageViewType));
     vkStream->write((VkFormat*)&forMarshaling->format, sizeof(VkFormat));
-    marshal_VkComponentMapping(vkStream, rootType, (VkComponentMapping*)(&forMarshaling->components));
-    marshal_VkImageSubresourceRange(vkStream, rootType, (VkImageSubresourceRange*)(&forMarshaling->subresourceRange));
+    marshal_VkComponentMapping(vkStream, rootType,
+                               (VkComponentMapping*)(&forMarshaling->components));
+    marshal_VkImageSubresourceRange(vkStream, rootType,
+                                    (VkImageSubresourceRange*)(&forMarshaling->subresourceRange));
 }
 
-void unmarshal_VkImageViewCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageViewCreateInfo* forUnmarshaling)
-{
+void unmarshal_VkImageViewCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkImageViewCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkImageViewCreateFlags*)&forUnmarshaling->flags, sizeof(VkImageViewCreateFlags));
+    vkStream->read((VkImageViewCreateFlags*)&forUnmarshaling->flags,
+                   sizeof(VkImageViewCreateFlags));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_0, (VkImage*)&forUnmarshaling->image, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_0,
+                                                      (VkImage*)&forUnmarshaling->image, 1);
     vkStream->read((VkImageViewType*)&forUnmarshaling->viewType, sizeof(VkImageViewType));
     vkStream->read((VkFormat*)&forUnmarshaling->format, sizeof(VkFormat));
-    unmarshal_VkComponentMapping(vkStream, rootType, (VkComponentMapping*)(&forUnmarshaling->components));
-    unmarshal_VkImageSubresourceRange(vkStream, rootType, (VkImageSubresourceRange*)(&forUnmarshaling->subresourceRange));
+    unmarshal_VkComponentMapping(vkStream, rootType,
+                                 (VkComponentMapping*)(&forUnmarshaling->components));
+    unmarshal_VkImageSubresourceRange(
+        vkStream, rootType, (VkImageSubresourceRange*)(&forUnmarshaling->subresourceRange));
 }
 
-void marshal_VkShaderModuleCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkShaderModuleCreateInfo* forMarshaling)
-{
+void marshal_VkShaderModuleCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkShaderModuleCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkShaderModuleCreateFlags*)&forMarshaling->flags, sizeof(VkShaderModuleCreateFlags));
+    vkStream->write((VkShaderModuleCreateFlags*)&forMarshaling->flags,
+                    sizeof(VkShaderModuleCreateFlags));
     uint64_t cgen_var_0 = (uint64_t)forMarshaling->codeSize;
     vkStream->putBe64(cgen_var_0);
-    vkStream->write((const uint32_t*)forMarshaling->pCode, (forMarshaling->codeSize / 4) * sizeof(const uint32_t));
+    vkStream->write((const uint32_t*)forMarshaling->pCode,
+                    (forMarshaling->codeSize / 4) * sizeof(const uint32_t));
 }
 
-void unmarshal_VkShaderModuleCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkShaderModuleCreateInfo* forUnmarshaling)
-{
+void unmarshal_VkShaderModuleCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkShaderModuleCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkShaderModuleCreateFlags*)&forUnmarshaling->flags, sizeof(VkShaderModuleCreateFlags));
+    vkStream->read((VkShaderModuleCreateFlags*)&forUnmarshaling->flags,
+                   sizeof(VkShaderModuleCreateFlags));
     forUnmarshaling->codeSize = (size_t)vkStream->getBe64();
-    vkStream->alloc((void**)&forUnmarshaling->pCode, (forUnmarshaling->codeSize / 4) * sizeof(const uint32_t));
-    vkStream->read((uint32_t*)forUnmarshaling->pCode, (forUnmarshaling->codeSize / 4) * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pCode,
+                    (forUnmarshaling->codeSize / 4) * sizeof(const uint32_t));
+    vkStream->read((uint32_t*)forUnmarshaling->pCode,
+                   (forUnmarshaling->codeSize / 4) * sizeof(const uint32_t));
 }
 
-void marshal_VkPipelineCacheCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineCacheCreateInfo* forMarshaling)
-{
+void marshal_VkPipelineCacheCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkPipelineCacheCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkPipelineCacheCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineCacheCreateFlags));
+    vkStream->write((VkPipelineCacheCreateFlags*)&forMarshaling->flags,
+                    sizeof(VkPipelineCacheCreateFlags));
     uint64_t cgen_var_0 = (uint64_t)forMarshaling->initialDataSize;
     vkStream->putBe64(cgen_var_0);
-    vkStream->write((const void*)forMarshaling->pInitialData, forMarshaling->initialDataSize * sizeof(const uint8_t));
+    vkStream->write((const void*)forMarshaling->pInitialData,
+                    forMarshaling->initialDataSize * sizeof(const uint8_t));
 }
 
-void unmarshal_VkPipelineCacheCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineCacheCreateInfo* forUnmarshaling)
-{
+void unmarshal_VkPipelineCacheCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkPipelineCacheCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkPipelineCacheCreateFlags*)&forUnmarshaling->flags, sizeof(VkPipelineCacheCreateFlags));
+    vkStream->read((VkPipelineCacheCreateFlags*)&forUnmarshaling->flags,
+                   sizeof(VkPipelineCacheCreateFlags));
     forUnmarshaling->initialDataSize = (size_t)vkStream->getBe64();
-    vkStream->alloc((void**)&forUnmarshaling->pInitialData, forUnmarshaling->initialDataSize * sizeof(const uint8_t));
-    vkStream->read((void*)forUnmarshaling->pInitialData, forUnmarshaling->initialDataSize * sizeof(const uint8_t));
+    vkStream->alloc((void**)&forUnmarshaling->pInitialData,
+                    forUnmarshaling->initialDataSize * sizeof(const uint8_t));
+    vkStream->read((void*)forUnmarshaling->pInitialData,
+                   forUnmarshaling->initialDataSize * sizeof(const uint8_t));
 }
 
-void marshal_VkSpecializationMapEntry(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSpecializationMapEntry* forMarshaling)
-{
+void marshal_VkSpecializationMapEntry(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkSpecializationMapEntry* forMarshaling) {
     (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->constantID, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->offset, sizeof(uint32_t));
@@ -2605,194 +2392,180 @@
     vkStream->putBe64(cgen_var_0);
 }
 
-void unmarshal_VkSpecializationMapEntry(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSpecializationMapEntry* forUnmarshaling)
-{
+void unmarshal_VkSpecializationMapEntry(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkSpecializationMapEntry* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->constantID, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->offset, sizeof(uint32_t));
     forUnmarshaling->size = (size_t)vkStream->getBe64();
 }
 
-void marshal_VkSpecializationInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSpecializationInfo* forMarshaling)
-{
+void marshal_VkSpecializationInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkSpecializationInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->mapEntryCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->mapEntryCount; ++i)
-        {
-            marshal_VkSpecializationMapEntry(vkStream, rootType, (const VkSpecializationMapEntry*)(forMarshaling->pMapEntries + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->mapEntryCount; ++i) {
+            marshal_VkSpecializationMapEntry(
+                vkStream, rootType,
+                (const VkSpecializationMapEntry*)(forMarshaling->pMapEntries + i));
         }
     }
     uint64_t cgen_var_0 = (uint64_t)forMarshaling->dataSize;
     vkStream->putBe64(cgen_var_0);
-    vkStream->write((const void*)forMarshaling->pData, forMarshaling->dataSize * sizeof(const uint8_t));
+    vkStream->write((const void*)forMarshaling->pData,
+                    forMarshaling->dataSize * sizeof(const uint8_t));
 }
 
-void unmarshal_VkSpecializationInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSpecializationInfo* forUnmarshaling)
-{
+void unmarshal_VkSpecializationInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkSpecializationInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->mapEntryCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pMapEntries, forUnmarshaling->mapEntryCount * sizeof(const VkSpecializationMapEntry));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->mapEntryCount; ++i)
-        {
-            unmarshal_VkSpecializationMapEntry(vkStream, rootType, (VkSpecializationMapEntry*)(forUnmarshaling->pMapEntries + i));
+    vkStream->alloc((void**)&forUnmarshaling->pMapEntries,
+                    forUnmarshaling->mapEntryCount * sizeof(const VkSpecializationMapEntry));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->mapEntryCount; ++i) {
+            unmarshal_VkSpecializationMapEntry(
+                vkStream, rootType, (VkSpecializationMapEntry*)(forUnmarshaling->pMapEntries + i));
         }
     }
     forUnmarshaling->dataSize = (size_t)vkStream->getBe64();
-    vkStream->alloc((void**)&forUnmarshaling->pData, forUnmarshaling->dataSize * sizeof(const uint8_t));
-    vkStream->read((void*)forUnmarshaling->pData, forUnmarshaling->dataSize * sizeof(const uint8_t));
+    vkStream->alloc((void**)&forUnmarshaling->pData,
+                    forUnmarshaling->dataSize * sizeof(const uint8_t));
+    vkStream->read((void*)forUnmarshaling->pData,
+                   forUnmarshaling->dataSize * sizeof(const uint8_t));
 }
 
-void marshal_VkPipelineShaderStageCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineShaderStageCreateInfo* forMarshaling)
-{
+void marshal_VkPipelineShaderStageCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkPipelineShaderStageCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkPipelineShaderStageCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineShaderStageCreateFlags));
+    vkStream->write((VkPipelineShaderStageCreateFlags*)&forMarshaling->flags,
+                    sizeof(VkPipelineShaderStageCreateFlags));
     vkStream->write((VkShaderStageFlagBits*)&forMarshaling->stage, sizeof(VkShaderStageFlagBits));
     uint64_t cgen_var_0;
-    vkStream->handleMapping()->mapHandles_VkShaderModule_u64(&forMarshaling->module, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkShaderModule_u64(&forMarshaling->module, &cgen_var_0,
+                                                             1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->putString(forMarshaling->pName);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)forMarshaling->pSpecializationInfo;
     vkStream->putBe64(cgen_var_1);
-    if (forMarshaling->pSpecializationInfo)
-    {
-        marshal_VkSpecializationInfo(vkStream, rootType, (const VkSpecializationInfo*)(forMarshaling->pSpecializationInfo));
+    if (forMarshaling->pSpecializationInfo) {
+        marshal_VkSpecializationInfo(
+            vkStream, rootType, (const VkSpecializationInfo*)(forMarshaling->pSpecializationInfo));
     }
 }
 
-void unmarshal_VkPipelineShaderStageCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineShaderStageCreateInfo* forUnmarshaling)
-{
+void unmarshal_VkPipelineShaderStageCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkPipelineShaderStageCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkPipelineShaderStageCreateFlags*)&forUnmarshaling->flags, sizeof(VkPipelineShaderStageCreateFlags));
+    vkStream->read((VkPipelineShaderStageCreateFlags*)&forUnmarshaling->flags,
+                   sizeof(VkPipelineShaderStageCreateFlags));
     vkStream->read((VkShaderStageFlagBits*)&forUnmarshaling->stage, sizeof(VkShaderStageFlagBits));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkShaderModule(&cgen_var_0, (VkShaderModule*)&forUnmarshaling->module, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkShaderModule(
+        &cgen_var_0, (VkShaderModule*)&forUnmarshaling->module, 1);
     vkStream->loadStringInPlace((char**)&forUnmarshaling->pName);
     // WARNING PTR CHECK
-    forUnmarshaling->pSpecializationInfo = (const VkSpecializationInfo*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pSpecializationInfo)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pSpecializationInfo, sizeof(const VkSpecializationInfo));
-        unmarshal_VkSpecializationInfo(vkStream, rootType, (VkSpecializationInfo*)(forUnmarshaling->pSpecializationInfo));
+    forUnmarshaling->pSpecializationInfo =
+        (const VkSpecializationInfo*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pSpecializationInfo) {
+        vkStream->alloc((void**)&forUnmarshaling->pSpecializationInfo,
+                        sizeof(const VkSpecializationInfo));
+        unmarshal_VkSpecializationInfo(
+            vkStream, rootType, (VkSpecializationInfo*)(forUnmarshaling->pSpecializationInfo));
     }
 }
 
-void marshal_VkComputePipelineCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkComputePipelineCreateInfo* forMarshaling)
-{
+void marshal_VkComputePipelineCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkComputePipelineCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkPipelineCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineCreateFlags));
-    marshal_VkPipelineShaderStageCreateInfo(vkStream, rootType, (VkPipelineShaderStageCreateInfo*)(&forMarshaling->stage));
+    marshal_VkPipelineShaderStageCreateInfo(
+        vkStream, rootType, (VkPipelineShaderStageCreateInfo*)(&forMarshaling->stage));
     uint64_t cgen_var_0;
-    vkStream->handleMapping()->mapHandles_VkPipelineLayout_u64(&forMarshaling->layout, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkPipelineLayout_u64(&forMarshaling->layout, &cgen_var_0,
+                                                               1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     uint64_t cgen_var_1;
-    vkStream->handleMapping()->mapHandles_VkPipeline_u64(&forMarshaling->basePipelineHandle, &cgen_var_1, 1);
+    vkStream->handleMapping()->mapHandles_VkPipeline_u64(&forMarshaling->basePipelineHandle,
+                                                         &cgen_var_1, 1);
     vkStream->write((uint64_t*)&cgen_var_1, 1 * 8);
     vkStream->write((int32_t*)&forMarshaling->basePipelineIndex, sizeof(int32_t));
 }
 
-void unmarshal_VkComputePipelineCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkComputePipelineCreateInfo* forUnmarshaling)
-{
+void unmarshal_VkComputePipelineCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkComputePipelineCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkPipelineCreateFlags*)&forUnmarshaling->flags, sizeof(VkPipelineCreateFlags));
-    unmarshal_VkPipelineShaderStageCreateInfo(vkStream, rootType, (VkPipelineShaderStageCreateInfo*)(&forUnmarshaling->stage));
+    unmarshal_VkPipelineShaderStageCreateInfo(
+        vkStream, rootType, (VkPipelineShaderStageCreateInfo*)(&forUnmarshaling->stage));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkPipelineLayout(&cgen_var_0, (VkPipelineLayout*)&forUnmarshaling->layout, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkPipelineLayout(
+        &cgen_var_0, (VkPipelineLayout*)&forUnmarshaling->layout, 1);
     uint64_t cgen_var_1;
     vkStream->read((uint64_t*)&cgen_var_1, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkPipeline(&cgen_var_1, (VkPipeline*)&forUnmarshaling->basePipelineHandle, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkPipeline(
+        &cgen_var_1, (VkPipeline*)&forUnmarshaling->basePipelineHandle, 1);
     vkStream->read((int32_t*)&forUnmarshaling->basePipelineIndex, sizeof(int32_t));
 }
 
-void marshal_VkVertexInputBindingDescription(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVertexInputBindingDescription* forMarshaling)
-{
+void marshal_VkVertexInputBindingDescription(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkVertexInputBindingDescription* forMarshaling) {
     (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->binding, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->stride, sizeof(uint32_t));
     vkStream->write((VkVertexInputRate*)&forMarshaling->inputRate, sizeof(VkVertexInputRate));
 }
 
-void unmarshal_VkVertexInputBindingDescription(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVertexInputBindingDescription* forUnmarshaling)
-{
+void unmarshal_VkVertexInputBindingDescription(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkVertexInputBindingDescription* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->binding, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->stride, sizeof(uint32_t));
@@ -2800,10 +2573,8 @@
 }
 
 void marshal_VkVertexInputAttributeDescription(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVertexInputAttributeDescription* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkVertexInputAttributeDescription* forMarshaling) {
     (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->location, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->binding, sizeof(uint32_t));
@@ -2812,10 +2583,8 @@
 }
 
 void unmarshal_VkVertexInputAttributeDescription(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVertexInputAttributeDescription* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVertexInputAttributeDescription* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->location, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->binding, sizeof(uint32_t));
@@ -2824,173 +2593,170 @@
 }
 
 void marshal_VkPipelineVertexInputStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineVertexInputStateCreateInfo* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineVertexInputStateCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkPipelineVertexInputStateCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineVertexInputStateCreateFlags));
+    vkStream->write((VkPipelineVertexInputStateCreateFlags*)&forMarshaling->flags,
+                    sizeof(VkPipelineVertexInputStateCreateFlags));
     vkStream->write((uint32_t*)&forMarshaling->vertexBindingDescriptionCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->vertexBindingDescriptionCount; ++i)
-        {
-            marshal_VkVertexInputBindingDescription(vkStream, rootType, (const VkVertexInputBindingDescription*)(forMarshaling->pVertexBindingDescriptions + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->vertexBindingDescriptionCount; ++i) {
+            marshal_VkVertexInputBindingDescription(
+                vkStream, rootType,
+                (const VkVertexInputBindingDescription*)(forMarshaling->pVertexBindingDescriptions +
+                                                         i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->vertexAttributeDescriptionCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->vertexAttributeDescriptionCount; ++i)
-        {
-            marshal_VkVertexInputAttributeDescription(vkStream, rootType, (const VkVertexInputAttributeDescription*)(forMarshaling->pVertexAttributeDescriptions + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->vertexAttributeDescriptionCount; ++i) {
+            marshal_VkVertexInputAttributeDescription(
+                vkStream, rootType,
+                (const VkVertexInputAttributeDescription*)(forMarshaling
+                                                               ->pVertexAttributeDescriptions +
+                                                           i));
         }
     }
 }
 
 void unmarshal_VkPipelineVertexInputStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineVertexInputStateCreateInfo* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineVertexInputStateCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkPipelineVertexInputStateCreateFlags*)&forUnmarshaling->flags, sizeof(VkPipelineVertexInputStateCreateFlags));
+    vkStream->read((VkPipelineVertexInputStateCreateFlags*)&forUnmarshaling->flags,
+                   sizeof(VkPipelineVertexInputStateCreateFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->vertexBindingDescriptionCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pVertexBindingDescriptions, forUnmarshaling->vertexBindingDescriptionCount * sizeof(const VkVertexInputBindingDescription));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->vertexBindingDescriptionCount; ++i)
-        {
-            unmarshal_VkVertexInputBindingDescription(vkStream, rootType, (VkVertexInputBindingDescription*)(forUnmarshaling->pVertexBindingDescriptions + i));
+    vkStream->alloc((void**)&forUnmarshaling->pVertexBindingDescriptions,
+                    forUnmarshaling->vertexBindingDescriptionCount *
+                        sizeof(const VkVertexInputBindingDescription));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->vertexBindingDescriptionCount; ++i) {
+            unmarshal_VkVertexInputBindingDescription(
+                vkStream, rootType,
+                (VkVertexInputBindingDescription*)(forUnmarshaling->pVertexBindingDescriptions +
+                                                   i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->vertexAttributeDescriptionCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pVertexAttributeDescriptions, forUnmarshaling->vertexAttributeDescriptionCount * sizeof(const VkVertexInputAttributeDescription));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->vertexAttributeDescriptionCount; ++i)
-        {
-            unmarshal_VkVertexInputAttributeDescription(vkStream, rootType, (VkVertexInputAttributeDescription*)(forUnmarshaling->pVertexAttributeDescriptions + i));
+    vkStream->alloc((void**)&forUnmarshaling->pVertexAttributeDescriptions,
+                    forUnmarshaling->vertexAttributeDescriptionCount *
+                        sizeof(const VkVertexInputAttributeDescription));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->vertexAttributeDescriptionCount; ++i) {
+            unmarshal_VkVertexInputAttributeDescription(
+                vkStream, rootType,
+                (VkVertexInputAttributeDescription*)(forUnmarshaling->pVertexAttributeDescriptions +
+                                                     i));
         }
     }
 }
 
 void marshal_VkPipelineInputAssemblyStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineInputAssemblyStateCreateInfo* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineInputAssemblyStateCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkPipelineInputAssemblyStateCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineInputAssemblyStateCreateFlags));
+    vkStream->write((VkPipelineInputAssemblyStateCreateFlags*)&forMarshaling->flags,
+                    sizeof(VkPipelineInputAssemblyStateCreateFlags));
     vkStream->write((VkPrimitiveTopology*)&forMarshaling->topology, sizeof(VkPrimitiveTopology));
     vkStream->write((VkBool32*)&forMarshaling->primitiveRestartEnable, sizeof(VkBool32));
 }
 
 void unmarshal_VkPipelineInputAssemblyStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineInputAssemblyStateCreateInfo* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineInputAssemblyStateCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkPipelineInputAssemblyStateCreateFlags*)&forUnmarshaling->flags, sizeof(VkPipelineInputAssemblyStateCreateFlags));
+    vkStream->read((VkPipelineInputAssemblyStateCreateFlags*)&forUnmarshaling->flags,
+                   sizeof(VkPipelineInputAssemblyStateCreateFlags));
     vkStream->read((VkPrimitiveTopology*)&forUnmarshaling->topology, sizeof(VkPrimitiveTopology));
     vkStream->read((VkBool32*)&forUnmarshaling->primitiveRestartEnable, sizeof(VkBool32));
 }
 
 void marshal_VkPipelineTessellationStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineTessellationStateCreateInfo* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineTessellationStateCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkPipelineTessellationStateCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineTessellationStateCreateFlags));
+    vkStream->write((VkPipelineTessellationStateCreateFlags*)&forMarshaling->flags,
+                    sizeof(VkPipelineTessellationStateCreateFlags));
     vkStream->write((uint32_t*)&forMarshaling->patchControlPoints, sizeof(uint32_t));
 }
 
 void unmarshal_VkPipelineTessellationStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineTessellationStateCreateInfo* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineTessellationStateCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkPipelineTessellationStateCreateFlags*)&forUnmarshaling->flags, sizeof(VkPipelineTessellationStateCreateFlags));
+    vkStream->read((VkPipelineTessellationStateCreateFlags*)&forUnmarshaling->flags,
+                   sizeof(VkPipelineTessellationStateCreateFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->patchControlPoints, sizeof(uint32_t));
 }
 
-void marshal_VkViewport(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkViewport* forMarshaling)
-{
+void marshal_VkViewport(VulkanStream* vkStream, VkStructureType rootType,
+                        const VkViewport* forMarshaling) {
     (void)rootType;
     vkStream->write((float*)&forMarshaling->x, sizeof(float));
     vkStream->write((float*)&forMarshaling->y, sizeof(float));
@@ -3000,11 +2766,8 @@
     vkStream->write((float*)&forMarshaling->maxDepth, sizeof(float));
 }
 
-void unmarshal_VkViewport(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkViewport* forUnmarshaling)
-{
+void unmarshal_VkViewport(VulkanStream* vkStream, VkStructureType rootType,
+                          VkViewport* forUnmarshaling) {
     (void)rootType;
     vkStream->read((float*)&forUnmarshaling->x, sizeof(float));
     vkStream->read((float*)&forUnmarshaling->y, sizeof(float));
@@ -3015,29 +2778,25 @@
 }
 
 void marshal_VkPipelineViewportStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineViewportStateCreateInfo* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineViewportStateCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkPipelineViewportStateCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineViewportStateCreateFlags));
+    vkStream->write((VkPipelineViewportStateCreateFlags*)&forMarshaling->flags,
+                    sizeof(VkPipelineViewportStateCreateFlags));
     vkStream->write((uint32_t*)&forMarshaling->viewportCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pViewports;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pViewports)
-    {
-        if (forMarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forMarshaling->viewportCount; ++i)
-            {
-                marshal_VkViewport(vkStream, rootType, (const VkViewport*)(forMarshaling->pViewports + i));
+    if (forMarshaling->pViewports) {
+        if (forMarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forMarshaling->viewportCount; ++i) {
+                marshal_VkViewport(vkStream, rootType,
+                                   (const VkViewport*)(forMarshaling->pViewports + i));
             }
         }
     }
@@ -3045,66 +2804,60 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)forMarshaling->pScissors;
     vkStream->putBe64(cgen_var_1);
-    if (forMarshaling->pScissors)
-    {
-        if (forMarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forMarshaling->scissorCount; ++i)
-            {
-                marshal_VkRect2D(vkStream, rootType, (const VkRect2D*)(forMarshaling->pScissors + i));
+    if (forMarshaling->pScissors) {
+        if (forMarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forMarshaling->scissorCount; ++i) {
+                marshal_VkRect2D(vkStream, rootType,
+                                 (const VkRect2D*)(forMarshaling->pScissors + i));
             }
         }
     }
 }
 
 void unmarshal_VkPipelineViewportStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineViewportStateCreateInfo* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineViewportStateCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkPipelineViewportStateCreateFlags*)&forUnmarshaling->flags, sizeof(VkPipelineViewportStateCreateFlags));
+    vkStream->read((VkPipelineViewportStateCreateFlags*)&forUnmarshaling->flags,
+                   sizeof(VkPipelineViewportStateCreateFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->viewportCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     forUnmarshaling->pViewports = (const VkViewport*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pViewports)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pViewports, forUnmarshaling->viewportCount * sizeof(const VkViewport));
-        if (forUnmarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->viewportCount; ++i)
-            {
-                unmarshal_VkViewport(vkStream, rootType, (VkViewport*)(forUnmarshaling->pViewports + i));
+    if (forUnmarshaling->pViewports) {
+        vkStream->alloc((void**)&forUnmarshaling->pViewports,
+                        forUnmarshaling->viewportCount * sizeof(const VkViewport));
+        if (forUnmarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->viewportCount; ++i) {
+                unmarshal_VkViewport(vkStream, rootType,
+                                     (VkViewport*)(forUnmarshaling->pViewports + i));
             }
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->scissorCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     forUnmarshaling->pScissors = (const VkRect2D*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pScissors)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pScissors, forUnmarshaling->scissorCount * sizeof(const VkRect2D));
-        if (forUnmarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->scissorCount; ++i)
-            {
+    if (forUnmarshaling->pScissors) {
+        vkStream->alloc((void**)&forUnmarshaling->pScissors,
+                        forUnmarshaling->scissorCount * sizeof(const VkRect2D));
+        if (forUnmarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->scissorCount; ++i) {
                 unmarshal_VkRect2D(vkStream, rootType, (VkRect2D*)(forUnmarshaling->pScissors + i));
             }
         }
@@ -3112,18 +2865,16 @@
 }
 
 void marshal_VkPipelineRasterizationStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineRasterizationStateCreateInfo* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineRasterizationStateCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkPipelineRasterizationStateCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineRasterizationStateCreateFlags));
+    vkStream->write((VkPipelineRasterizationStateCreateFlags*)&forMarshaling->flags,
+                    sizeof(VkPipelineRasterizationStateCreateFlags));
     vkStream->write((VkBool32*)&forMarshaling->depthClampEnable, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->rasterizerDiscardEnable, sizeof(VkBool32));
     vkStream->write((VkPolygonMode*)&forMarshaling->polygonMode, sizeof(VkPolygonMode));
@@ -3137,29 +2888,28 @@
 }
 
 void unmarshal_VkPipelineRasterizationStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineRasterizationStateCreateInfo* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineRasterizationStateCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkPipelineRasterizationStateCreateFlags*)&forUnmarshaling->flags, sizeof(VkPipelineRasterizationStateCreateFlags));
+    vkStream->read((VkPipelineRasterizationStateCreateFlags*)&forUnmarshaling->flags,
+                   sizeof(VkPipelineRasterizationStateCreateFlags));
     vkStream->read((VkBool32*)&forUnmarshaling->depthClampEnable, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->rasterizerDiscardEnable, sizeof(VkBool32));
     vkStream->read((VkPolygonMode*)&forUnmarshaling->polygonMode, sizeof(VkPolygonMode));
@@ -3173,75 +2923,75 @@
 }
 
 void marshal_VkPipelineMultisampleStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineMultisampleStateCreateInfo* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineMultisampleStateCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkPipelineMultisampleStateCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineMultisampleStateCreateFlags));
-    vkStream->write((VkSampleCountFlagBits*)&forMarshaling->rasterizationSamples, sizeof(VkSampleCountFlagBits));
+    vkStream->write((VkPipelineMultisampleStateCreateFlags*)&forMarshaling->flags,
+                    sizeof(VkPipelineMultisampleStateCreateFlags));
+    vkStream->write((VkSampleCountFlagBits*)&forMarshaling->rasterizationSamples,
+                    sizeof(VkSampleCountFlagBits));
     vkStream->write((VkBool32*)&forMarshaling->sampleShadingEnable, sizeof(VkBool32));
     vkStream->write((float*)&forMarshaling->minSampleShading, sizeof(float));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pSampleMask;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pSampleMask)
-    {
-        vkStream->write((const VkSampleMask*)forMarshaling->pSampleMask, (((forMarshaling->rasterizationSamples) + 31) / 32) * sizeof(const VkSampleMask));
+    if (forMarshaling->pSampleMask) {
+        vkStream->write(
+            (const VkSampleMask*)forMarshaling->pSampleMask,
+            (((forMarshaling->rasterizationSamples) + 31) / 32) * sizeof(const VkSampleMask));
     }
     vkStream->write((VkBool32*)&forMarshaling->alphaToCoverageEnable, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->alphaToOneEnable, sizeof(VkBool32));
 }
 
 void unmarshal_VkPipelineMultisampleStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineMultisampleStateCreateInfo* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineMultisampleStateCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkPipelineMultisampleStateCreateFlags*)&forUnmarshaling->flags, sizeof(VkPipelineMultisampleStateCreateFlags));
-    vkStream->read((VkSampleCountFlagBits*)&forUnmarshaling->rasterizationSamples, sizeof(VkSampleCountFlagBits));
+    vkStream->read((VkPipelineMultisampleStateCreateFlags*)&forUnmarshaling->flags,
+                   sizeof(VkPipelineMultisampleStateCreateFlags));
+    vkStream->read((VkSampleCountFlagBits*)&forUnmarshaling->rasterizationSamples,
+                   sizeof(VkSampleCountFlagBits));
     vkStream->read((VkBool32*)&forUnmarshaling->sampleShadingEnable, sizeof(VkBool32));
     vkStream->read((float*)&forUnmarshaling->minSampleShading, sizeof(float));
     // WARNING PTR CHECK
     forUnmarshaling->pSampleMask = (const VkSampleMask*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pSampleMask)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pSampleMask, (((forUnmarshaling->rasterizationSamples) + 31) / 32) * sizeof(const VkSampleMask));
-        vkStream->read((VkSampleMask*)forUnmarshaling->pSampleMask, (((forUnmarshaling->rasterizationSamples) + 31) / 32) * sizeof(const VkSampleMask));
+    if (forUnmarshaling->pSampleMask) {
+        vkStream->alloc(
+            (void**)&forUnmarshaling->pSampleMask,
+            (((forUnmarshaling->rasterizationSamples) + 31) / 32) * sizeof(const VkSampleMask));
+        vkStream->read(
+            (VkSampleMask*)forUnmarshaling->pSampleMask,
+            (((forUnmarshaling->rasterizationSamples) + 31) / 32) * sizeof(const VkSampleMask));
     }
     vkStream->read((VkBool32*)&forUnmarshaling->alphaToCoverageEnable, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->alphaToOneEnable, sizeof(VkBool32));
 }
 
-void marshal_VkStencilOpState(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkStencilOpState* forMarshaling)
-{
+void marshal_VkStencilOpState(VulkanStream* vkStream, VkStructureType rootType,
+                              const VkStencilOpState* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStencilOp*)&forMarshaling->failOp, sizeof(VkStencilOp));
     vkStream->write((VkStencilOp*)&forMarshaling->passOp, sizeof(VkStencilOp));
@@ -3252,11 +3002,8 @@
     vkStream->write((uint32_t*)&forMarshaling->reference, sizeof(uint32_t));
 }
 
-void unmarshal_VkStencilOpState(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkStencilOpState* forUnmarshaling)
-{
+void unmarshal_VkStencilOpState(VulkanStream* vkStream, VkStructureType rootType,
+                                VkStencilOpState* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStencilOp*)&forUnmarshaling->failOp, sizeof(VkStencilOp));
     vkStream->read((VkStencilOp*)&forUnmarshaling->passOp, sizeof(VkStencilOp));
@@ -3268,18 +3015,16 @@
 }
 
 void marshal_VkPipelineDepthStencilStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineDepthStencilStateCreateInfo* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineDepthStencilStateCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkPipelineDepthStencilStateCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineDepthStencilStateCreateFlags));
+    vkStream->write((VkPipelineDepthStencilStateCreateFlags*)&forMarshaling->flags,
+                    sizeof(VkPipelineDepthStencilStateCreateFlags));
     vkStream->write((VkBool32*)&forMarshaling->depthTestEnable, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->depthWriteEnable, sizeof(VkBool32));
     vkStream->write((VkCompareOp*)&forMarshaling->depthCompareOp, sizeof(VkCompareOp));
@@ -3292,29 +3037,28 @@
 }
 
 void unmarshal_VkPipelineDepthStencilStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineDepthStencilStateCreateInfo* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineDepthStencilStateCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkPipelineDepthStencilStateCreateFlags*)&forUnmarshaling->flags, sizeof(VkPipelineDepthStencilStateCreateFlags));
+    vkStream->read((VkPipelineDepthStencilStateCreateFlags*)&forUnmarshaling->flags,
+                   sizeof(VkPipelineDepthStencilStateCreateFlags));
     vkStream->read((VkBool32*)&forUnmarshaling->depthTestEnable, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->depthWriteEnable, sizeof(VkBool32));
     vkStream->read((VkCompareOp*)&forUnmarshaling->depthCompareOp, sizeof(VkCompareOp));
@@ -3327,10 +3071,8 @@
 }
 
 void marshal_VkPipelineColorBlendAttachmentState(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineColorBlendAttachmentState* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineColorBlendAttachmentState* forMarshaling) {
     (void)rootType;
     vkStream->write((VkBool32*)&forMarshaling->blendEnable, sizeof(VkBool32));
     vkStream->write((VkBlendFactor*)&forMarshaling->srcColorBlendFactor, sizeof(VkBlendFactor));
@@ -3339,14 +3081,13 @@
     vkStream->write((VkBlendFactor*)&forMarshaling->srcAlphaBlendFactor, sizeof(VkBlendFactor));
     vkStream->write((VkBlendFactor*)&forMarshaling->dstAlphaBlendFactor, sizeof(VkBlendFactor));
     vkStream->write((VkBlendOp*)&forMarshaling->alphaBlendOp, sizeof(VkBlendOp));
-    vkStream->write((VkColorComponentFlags*)&forMarshaling->colorWriteMask, sizeof(VkColorComponentFlags));
+    vkStream->write((VkColorComponentFlags*)&forMarshaling->colorWriteMask,
+                    sizeof(VkColorComponentFlags));
 }
 
 void unmarshal_VkPipelineColorBlendAttachmentState(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineColorBlendAttachmentState* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineColorBlendAttachmentState* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkBool32*)&forUnmarshaling->blendEnable, sizeof(VkBool32));
     vkStream->read((VkBlendFactor*)&forUnmarshaling->srcColorBlendFactor, sizeof(VkBlendFactor));
@@ -3355,523 +3096,530 @@
     vkStream->read((VkBlendFactor*)&forUnmarshaling->srcAlphaBlendFactor, sizeof(VkBlendFactor));
     vkStream->read((VkBlendFactor*)&forUnmarshaling->dstAlphaBlendFactor, sizeof(VkBlendFactor));
     vkStream->read((VkBlendOp*)&forUnmarshaling->alphaBlendOp, sizeof(VkBlendOp));
-    vkStream->read((VkColorComponentFlags*)&forUnmarshaling->colorWriteMask, sizeof(VkColorComponentFlags));
+    vkStream->read((VkColorComponentFlags*)&forUnmarshaling->colorWriteMask,
+                   sizeof(VkColorComponentFlags));
 }
 
 void marshal_VkPipelineColorBlendStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineColorBlendStateCreateInfo* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineColorBlendStateCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkPipelineColorBlendStateCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineColorBlendStateCreateFlags));
+    vkStream->write((VkPipelineColorBlendStateCreateFlags*)&forMarshaling->flags,
+                    sizeof(VkPipelineColorBlendStateCreateFlags));
     vkStream->write((VkBool32*)&forMarshaling->logicOpEnable, sizeof(VkBool32));
     vkStream->write((VkLogicOp*)&forMarshaling->logicOp, sizeof(VkLogicOp));
     vkStream->write((uint32_t*)&forMarshaling->attachmentCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->attachmentCount; ++i)
-        {
-            marshal_VkPipelineColorBlendAttachmentState(vkStream, rootType, (const VkPipelineColorBlendAttachmentState*)(forMarshaling->pAttachments + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->attachmentCount; ++i) {
+            marshal_VkPipelineColorBlendAttachmentState(
+                vkStream, rootType,
+                (const VkPipelineColorBlendAttachmentState*)(forMarshaling->pAttachments + i));
         }
     }
     vkStream->write((float*)forMarshaling->blendConstants, 4 * sizeof(float));
 }
 
 void unmarshal_VkPipelineColorBlendStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineColorBlendStateCreateInfo* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineColorBlendStateCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkPipelineColorBlendStateCreateFlags*)&forUnmarshaling->flags, sizeof(VkPipelineColorBlendStateCreateFlags));
+    vkStream->read((VkPipelineColorBlendStateCreateFlags*)&forUnmarshaling->flags,
+                   sizeof(VkPipelineColorBlendStateCreateFlags));
     vkStream->read((VkBool32*)&forUnmarshaling->logicOpEnable, sizeof(VkBool32));
     vkStream->read((VkLogicOp*)&forUnmarshaling->logicOp, sizeof(VkLogicOp));
     vkStream->read((uint32_t*)&forUnmarshaling->attachmentCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pAttachments, forUnmarshaling->attachmentCount * sizeof(const VkPipelineColorBlendAttachmentState));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->attachmentCount; ++i)
-        {
-            unmarshal_VkPipelineColorBlendAttachmentState(vkStream, rootType, (VkPipelineColorBlendAttachmentState*)(forUnmarshaling->pAttachments + i));
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pAttachments,
+        forUnmarshaling->attachmentCount * sizeof(const VkPipelineColorBlendAttachmentState));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->attachmentCount; ++i) {
+            unmarshal_VkPipelineColorBlendAttachmentState(
+                vkStream, rootType,
+                (VkPipelineColorBlendAttachmentState*)(forUnmarshaling->pAttachments + i));
         }
     }
     vkStream->read((float*)forUnmarshaling->blendConstants, 4 * sizeof(float));
 }
 
 void marshal_VkPipelineDynamicStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineDynamicStateCreateInfo* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineDynamicStateCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkPipelineDynamicStateCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineDynamicStateCreateFlags));
+    vkStream->write((VkPipelineDynamicStateCreateFlags*)&forMarshaling->flags,
+                    sizeof(VkPipelineDynamicStateCreateFlags));
     vkStream->write((uint32_t*)&forMarshaling->dynamicStateCount, sizeof(uint32_t));
-    vkStream->write((const VkDynamicState*)forMarshaling->pDynamicStates, forMarshaling->dynamicStateCount * sizeof(const VkDynamicState));
+    vkStream->write((const VkDynamicState*)forMarshaling->pDynamicStates,
+                    forMarshaling->dynamicStateCount * sizeof(const VkDynamicState));
 }
 
-void unmarshal_VkPipelineDynamicStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineDynamicStateCreateInfo* forUnmarshaling)
-{
+void unmarshal_VkPipelineDynamicStateCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkPipelineDynamicStateCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkPipelineDynamicStateCreateFlags*)&forUnmarshaling->flags, sizeof(VkPipelineDynamicStateCreateFlags));
+    vkStream->read((VkPipelineDynamicStateCreateFlags*)&forUnmarshaling->flags,
+                   sizeof(VkPipelineDynamicStateCreateFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->dynamicStateCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pDynamicStates, forUnmarshaling->dynamicStateCount * sizeof(const VkDynamicState));
-    vkStream->read((VkDynamicState*)forUnmarshaling->pDynamicStates, forUnmarshaling->dynamicStateCount * sizeof(const VkDynamicState));
+    vkStream->alloc((void**)&forUnmarshaling->pDynamicStates,
+                    forUnmarshaling->dynamicStateCount * sizeof(const VkDynamicState));
+    vkStream->read((VkDynamicState*)forUnmarshaling->pDynamicStates,
+                   forUnmarshaling->dynamicStateCount * sizeof(const VkDynamicState));
 }
 
-void marshal_VkGraphicsPipelineCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkGraphicsPipelineCreateInfo* forMarshaling)
-{
+void marshal_VkGraphicsPipelineCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                          const VkGraphicsPipelineCreateInfo* forMarshaling) {
     (void)rootType;
     uint32_t hasRasterization = 1;
-    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT)
-    {
-        hasRasterization = (((0 == forMarshaling->pRasterizationState)) ? (0) : (!((*(forMarshaling->pRasterizationState)).rasterizerDiscardEnable)));
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) {
+        hasRasterization =
+            (((0 == forMarshaling->pRasterizationState))
+                 ? (0)
+                 : (!((*(forMarshaling->pRasterizationState)).rasterizerDiscardEnable)));
         uint32_t cgen_var_0 = (uint32_t)hasRasterization;
         vkStream->putBe32(cgen_var_0);
     }
     uint32_t hasTessellation = 1;
-    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT)
-    {
-        hasTessellation = arrayany(forMarshaling->pStages, 0, forMarshaling->stageCount, [](VkPipelineShaderStageCreateInfo s) { return ((s.stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) || (s.stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT)); });
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) {
+        hasTessellation =
+            arrayany(forMarshaling->pStages, 0, forMarshaling->stageCount,
+                     [](VkPipelineShaderStageCreateInfo s) {
+                         return ((s.stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) ||
+                                 (s.stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT));
+                     });
         uint32_t cgen_var_0 = (uint32_t)hasTessellation;
         vkStream->putBe32(cgen_var_0);
     }
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkPipelineCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineCreateFlags));
     vkStream->write((uint32_t*)&forMarshaling->stageCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->stageCount; ++i)
-        {
-            marshal_VkPipelineShaderStageCreateInfo(vkStream, rootType, (const VkPipelineShaderStageCreateInfo*)(forMarshaling->pStages + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->stageCount; ++i) {
+            marshal_VkPipelineShaderStageCreateInfo(
+                vkStream, rootType,
+                (const VkPipelineShaderStageCreateInfo*)(forMarshaling->pStages + i));
         }
     }
     // WARNING PTR CHECK
-    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT)
-    {
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) {
         uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pVertexInputState;
         vkStream->putBe64(cgen_var_0);
     }
-    if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || forMarshaling->pVertexInputState))
-    {
-        marshal_VkPipelineVertexInputStateCreateInfo(vkStream, rootType, (const VkPipelineVertexInputStateCreateInfo*)(forMarshaling->pVertexInputState));
+    if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) ||
+         forMarshaling->pVertexInputState)) {
+        marshal_VkPipelineVertexInputStateCreateInfo(
+            vkStream, rootType,
+            (const VkPipelineVertexInputStateCreateInfo*)(forMarshaling->pVertexInputState));
     }
     // WARNING PTR CHECK
-    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT)
-    {
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) {
         uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pInputAssemblyState;
         vkStream->putBe64(cgen_var_0);
     }
-    if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || forMarshaling->pInputAssemblyState))
-    {
-        marshal_VkPipelineInputAssemblyStateCreateInfo(vkStream, rootType, (const VkPipelineInputAssemblyStateCreateInfo*)(forMarshaling->pInputAssemblyState));
+    if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) ||
+         forMarshaling->pInputAssemblyState)) {
+        marshal_VkPipelineInputAssemblyStateCreateInfo(
+            vkStream, rootType,
+            (const VkPipelineInputAssemblyStateCreateInfo*)(forMarshaling->pInputAssemblyState));
     }
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pTessellationState;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pTessellationState)
-    {
-        if (hasTessellation)
-        {
-            marshal_VkPipelineTessellationStateCreateInfo(vkStream, rootType, (const VkPipelineTessellationStateCreateInfo*)(forMarshaling->pTessellationState));
+    if (forMarshaling->pTessellationState) {
+        if (hasTessellation) {
+            marshal_VkPipelineTessellationStateCreateInfo(
+                vkStream, rootType,
+                (const VkPipelineTessellationStateCreateInfo*)(forMarshaling->pTessellationState));
         }
     }
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)forMarshaling->pViewportState;
     vkStream->putBe64(cgen_var_1);
-    if (forMarshaling->pViewportState)
-    {
-        if (hasRasterization)
-        {
-            marshal_VkPipelineViewportStateCreateInfo(vkStream, rootType, (const VkPipelineViewportStateCreateInfo*)(forMarshaling->pViewportState));
+    if (forMarshaling->pViewportState) {
+        if (hasRasterization) {
+            marshal_VkPipelineViewportStateCreateInfo(
+                vkStream, rootType,
+                (const VkPipelineViewportStateCreateInfo*)(forMarshaling->pViewportState));
         }
     }
     // WARNING PTR CHECK
-    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT)
-    {
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) {
         uint64_t cgen_var_1_0 = (uint64_t)(uintptr_t)forMarshaling->pRasterizationState;
         vkStream->putBe64(cgen_var_1_0);
     }
-    if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || forMarshaling->pRasterizationState))
-    {
-        marshal_VkPipelineRasterizationStateCreateInfo(vkStream, rootType, (const VkPipelineRasterizationStateCreateInfo*)(forMarshaling->pRasterizationState));
+    if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) ||
+         forMarshaling->pRasterizationState)) {
+        marshal_VkPipelineRasterizationStateCreateInfo(
+            vkStream, rootType,
+            (const VkPipelineRasterizationStateCreateInfo*)(forMarshaling->pRasterizationState));
     }
     // WARNING PTR CHECK
     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)forMarshaling->pMultisampleState;
     vkStream->putBe64(cgen_var_2);
-    if (forMarshaling->pMultisampleState)
-    {
-        if (hasRasterization)
-        {
-            marshal_VkPipelineMultisampleStateCreateInfo(vkStream, rootType, (const VkPipelineMultisampleStateCreateInfo*)(forMarshaling->pMultisampleState));
+    if (forMarshaling->pMultisampleState) {
+        if (hasRasterization) {
+            marshal_VkPipelineMultisampleStateCreateInfo(
+                vkStream, rootType,
+                (const VkPipelineMultisampleStateCreateInfo*)(forMarshaling->pMultisampleState));
         }
     }
     // WARNING PTR CHECK
     uint64_t cgen_var_3 = (uint64_t)(uintptr_t)forMarshaling->pDepthStencilState;
     vkStream->putBe64(cgen_var_3);
-    if (forMarshaling->pDepthStencilState)
-    {
-        if (hasRasterization)
-        {
-            marshal_VkPipelineDepthStencilStateCreateInfo(vkStream, rootType, (const VkPipelineDepthStencilStateCreateInfo*)(forMarshaling->pDepthStencilState));
+    if (forMarshaling->pDepthStencilState) {
+        if (hasRasterization) {
+            marshal_VkPipelineDepthStencilStateCreateInfo(
+                vkStream, rootType,
+                (const VkPipelineDepthStencilStateCreateInfo*)(forMarshaling->pDepthStencilState));
         }
     }
     // WARNING PTR CHECK
     uint64_t cgen_var_4 = (uint64_t)(uintptr_t)forMarshaling->pColorBlendState;
     vkStream->putBe64(cgen_var_4);
-    if (forMarshaling->pColorBlendState)
-    {
-        if (hasRasterization)
-        {
-            marshal_VkPipelineColorBlendStateCreateInfo(vkStream, rootType, (const VkPipelineColorBlendStateCreateInfo*)(forMarshaling->pColorBlendState));
+    if (forMarshaling->pColorBlendState) {
+        if (hasRasterization) {
+            marshal_VkPipelineColorBlendStateCreateInfo(
+                vkStream, rootType,
+                (const VkPipelineColorBlendStateCreateInfo*)(forMarshaling->pColorBlendState));
         }
     }
     // WARNING PTR CHECK
     uint64_t cgen_var_5 = (uint64_t)(uintptr_t)forMarshaling->pDynamicState;
     vkStream->putBe64(cgen_var_5);
-    if (forMarshaling->pDynamicState)
-    {
-        marshal_VkPipelineDynamicStateCreateInfo(vkStream, rootType, (const VkPipelineDynamicStateCreateInfo*)(forMarshaling->pDynamicState));
+    if (forMarshaling->pDynamicState) {
+        marshal_VkPipelineDynamicStateCreateInfo(
+            vkStream, rootType,
+            (const VkPipelineDynamicStateCreateInfo*)(forMarshaling->pDynamicState));
     }
     uint64_t cgen_var_6;
-    vkStream->handleMapping()->mapHandles_VkPipelineLayout_u64(&forMarshaling->layout, &cgen_var_6, 1);
+    vkStream->handleMapping()->mapHandles_VkPipelineLayout_u64(&forMarshaling->layout, &cgen_var_6,
+                                                               1);
     vkStream->write((uint64_t*)&cgen_var_6, 1 * 8);
     uint64_t cgen_var_7;
-    vkStream->handleMapping()->mapHandles_VkRenderPass_u64(&forMarshaling->renderPass, &cgen_var_7, 1);
+    vkStream->handleMapping()->mapHandles_VkRenderPass_u64(&forMarshaling->renderPass, &cgen_var_7,
+                                                           1);
     vkStream->write((uint64_t*)&cgen_var_7, 1 * 8);
     vkStream->write((uint32_t*)&forMarshaling->subpass, sizeof(uint32_t));
     uint64_t cgen_var_8;
-    vkStream->handleMapping()->mapHandles_VkPipeline_u64(&forMarshaling->basePipelineHandle, &cgen_var_8, 1);
+    vkStream->handleMapping()->mapHandles_VkPipeline_u64(&forMarshaling->basePipelineHandle,
+                                                         &cgen_var_8, 1);
     vkStream->write((uint64_t*)&cgen_var_8, 1 * 8);
     vkStream->write((int32_t*)&forMarshaling->basePipelineIndex, sizeof(int32_t));
 }
 
-void unmarshal_VkGraphicsPipelineCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkGraphicsPipelineCreateInfo* forUnmarshaling)
-{
+void unmarshal_VkGraphicsPipelineCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkGraphicsPipelineCreateInfo* forUnmarshaling) {
     (void)rootType;
     uint32_t hasRasterization = 1;
-    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT)
-    {
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) {
         hasRasterization = (const uint32_t)vkStream->getBe32();
     }
     uint32_t hasTessellation = 1;
-    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT)
-    {
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) {
         hasTessellation = (const uint32_t)vkStream->getBe32();
     }
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkPipelineCreateFlags*)&forUnmarshaling->flags, sizeof(VkPipelineCreateFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->stageCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pStages, forUnmarshaling->stageCount * sizeof(const VkPipelineShaderStageCreateInfo));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->stageCount; ++i)
-        {
-            unmarshal_VkPipelineShaderStageCreateInfo(vkStream, rootType, (VkPipelineShaderStageCreateInfo*)(forUnmarshaling->pStages + i));
+    vkStream->alloc((void**)&forUnmarshaling->pStages,
+                    forUnmarshaling->stageCount * sizeof(const VkPipelineShaderStageCreateInfo));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->stageCount; ++i) {
+            unmarshal_VkPipelineShaderStageCreateInfo(
+                vkStream, rootType,
+                (VkPipelineShaderStageCreateInfo*)(forUnmarshaling->pStages + i));
         }
     }
     // WARNING PTR CHECK
-    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT)
-    {
-        forUnmarshaling->pVertexInputState = (const VkPipelineVertexInputStateCreateInfo*)(uintptr_t)vkStream->getBe64();
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) {
+        forUnmarshaling->pVertexInputState =
+            (const VkPipelineVertexInputStateCreateInfo*)(uintptr_t)vkStream->getBe64();
     }
-    if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || forUnmarshaling->pVertexInputState))
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pVertexInputState, sizeof(const VkPipelineVertexInputStateCreateInfo));
-        unmarshal_VkPipelineVertexInputStateCreateInfo(vkStream, rootType, (VkPipelineVertexInputStateCreateInfo*)(forUnmarshaling->pVertexInputState));
+    if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) ||
+         forUnmarshaling->pVertexInputState)) {
+        vkStream->alloc((void**)&forUnmarshaling->pVertexInputState,
+                        sizeof(const VkPipelineVertexInputStateCreateInfo));
+        unmarshal_VkPipelineVertexInputStateCreateInfo(
+            vkStream, rootType,
+            (VkPipelineVertexInputStateCreateInfo*)(forUnmarshaling->pVertexInputState));
     }
     // WARNING PTR CHECK
-    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT)
-    {
-        forUnmarshaling->pInputAssemblyState = (const VkPipelineInputAssemblyStateCreateInfo*)(uintptr_t)vkStream->getBe64();
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) {
+        forUnmarshaling->pInputAssemblyState =
+            (const VkPipelineInputAssemblyStateCreateInfo*)(uintptr_t)vkStream->getBe64();
     }
-    if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || forUnmarshaling->pInputAssemblyState))
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pInputAssemblyState, sizeof(const VkPipelineInputAssemblyStateCreateInfo));
-        unmarshal_VkPipelineInputAssemblyStateCreateInfo(vkStream, rootType, (VkPipelineInputAssemblyStateCreateInfo*)(forUnmarshaling->pInputAssemblyState));
+    if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) ||
+         forUnmarshaling->pInputAssemblyState)) {
+        vkStream->alloc((void**)&forUnmarshaling->pInputAssemblyState,
+                        sizeof(const VkPipelineInputAssemblyStateCreateInfo));
+        unmarshal_VkPipelineInputAssemblyStateCreateInfo(
+            vkStream, rootType,
+            (VkPipelineInputAssemblyStateCreateInfo*)(forUnmarshaling->pInputAssemblyState));
     }
     // WARNING PTR CHECK
-    forUnmarshaling->pTessellationState = (const VkPipelineTessellationStateCreateInfo*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pTessellationState)
-    {
-        if (hasTessellation)
-        {
-            vkStream->alloc((void**)&forUnmarshaling->pTessellationState, sizeof(const VkPipelineTessellationStateCreateInfo));
-            unmarshal_VkPipelineTessellationStateCreateInfo(vkStream, rootType, (VkPipelineTessellationStateCreateInfo*)(forUnmarshaling->pTessellationState));
-        }
-        else
-        {
+    forUnmarshaling->pTessellationState =
+        (const VkPipelineTessellationStateCreateInfo*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pTessellationState) {
+        if (hasTessellation) {
+            vkStream->alloc((void**)&forUnmarshaling->pTessellationState,
+                            sizeof(const VkPipelineTessellationStateCreateInfo));
+            unmarshal_VkPipelineTessellationStateCreateInfo(
+                vkStream, rootType,
+                (VkPipelineTessellationStateCreateInfo*)(forUnmarshaling->pTessellationState));
+        } else {
             forUnmarshaling->pTessellationState = 0;
         }
     }
     // WARNING PTR CHECK
-    forUnmarshaling->pViewportState = (const VkPipelineViewportStateCreateInfo*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pViewportState)
-    {
-        if (hasRasterization)
-        {
-            vkStream->alloc((void**)&forUnmarshaling->pViewportState, sizeof(const VkPipelineViewportStateCreateInfo));
-            unmarshal_VkPipelineViewportStateCreateInfo(vkStream, rootType, (VkPipelineViewportStateCreateInfo*)(forUnmarshaling->pViewportState));
-        }
-        else
-        {
+    forUnmarshaling->pViewportState =
+        (const VkPipelineViewportStateCreateInfo*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pViewportState) {
+        if (hasRasterization) {
+            vkStream->alloc((void**)&forUnmarshaling->pViewportState,
+                            sizeof(const VkPipelineViewportStateCreateInfo));
+            unmarshal_VkPipelineViewportStateCreateInfo(
+                vkStream, rootType,
+                (VkPipelineViewportStateCreateInfo*)(forUnmarshaling->pViewportState));
+        } else {
             forUnmarshaling->pViewportState = 0;
         }
     }
     // WARNING PTR CHECK
-    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT)
-    {
-        forUnmarshaling->pRasterizationState = (const VkPipelineRasterizationStateCreateInfo*)(uintptr_t)vkStream->getBe64();
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) {
+        forUnmarshaling->pRasterizationState =
+            (const VkPipelineRasterizationStateCreateInfo*)(uintptr_t)vkStream->getBe64();
     }
-    if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || forUnmarshaling->pRasterizationState))
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pRasterizationState, sizeof(const VkPipelineRasterizationStateCreateInfo));
-        unmarshal_VkPipelineRasterizationStateCreateInfo(vkStream, rootType, (VkPipelineRasterizationStateCreateInfo*)(forUnmarshaling->pRasterizationState));
+    if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) ||
+         forUnmarshaling->pRasterizationState)) {
+        vkStream->alloc((void**)&forUnmarshaling->pRasterizationState,
+                        sizeof(const VkPipelineRasterizationStateCreateInfo));
+        unmarshal_VkPipelineRasterizationStateCreateInfo(
+            vkStream, rootType,
+            (VkPipelineRasterizationStateCreateInfo*)(forUnmarshaling->pRasterizationState));
     }
     // WARNING PTR CHECK
-    forUnmarshaling->pMultisampleState = (const VkPipelineMultisampleStateCreateInfo*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pMultisampleState)
-    {
-        if (hasRasterization)
-        {
-            vkStream->alloc((void**)&forUnmarshaling->pMultisampleState, sizeof(const VkPipelineMultisampleStateCreateInfo));
-            unmarshal_VkPipelineMultisampleStateCreateInfo(vkStream, rootType, (VkPipelineMultisampleStateCreateInfo*)(forUnmarshaling->pMultisampleState));
-        }
-        else
-        {
+    forUnmarshaling->pMultisampleState =
+        (const VkPipelineMultisampleStateCreateInfo*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pMultisampleState) {
+        if (hasRasterization) {
+            vkStream->alloc((void**)&forUnmarshaling->pMultisampleState,
+                            sizeof(const VkPipelineMultisampleStateCreateInfo));
+            unmarshal_VkPipelineMultisampleStateCreateInfo(
+                vkStream, rootType,
+                (VkPipelineMultisampleStateCreateInfo*)(forUnmarshaling->pMultisampleState));
+        } else {
             forUnmarshaling->pMultisampleState = 0;
         }
     }
     // WARNING PTR CHECK
-    forUnmarshaling->pDepthStencilState = (const VkPipelineDepthStencilStateCreateInfo*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pDepthStencilState)
-    {
-        if (hasRasterization)
-        {
-            vkStream->alloc((void**)&forUnmarshaling->pDepthStencilState, sizeof(const VkPipelineDepthStencilStateCreateInfo));
-            unmarshal_VkPipelineDepthStencilStateCreateInfo(vkStream, rootType, (VkPipelineDepthStencilStateCreateInfo*)(forUnmarshaling->pDepthStencilState));
-        }
-        else
-        {
+    forUnmarshaling->pDepthStencilState =
+        (const VkPipelineDepthStencilStateCreateInfo*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pDepthStencilState) {
+        if (hasRasterization) {
+            vkStream->alloc((void**)&forUnmarshaling->pDepthStencilState,
+                            sizeof(const VkPipelineDepthStencilStateCreateInfo));
+            unmarshal_VkPipelineDepthStencilStateCreateInfo(
+                vkStream, rootType,
+                (VkPipelineDepthStencilStateCreateInfo*)(forUnmarshaling->pDepthStencilState));
+        } else {
             forUnmarshaling->pDepthStencilState = 0;
         }
     }
     // WARNING PTR CHECK
-    forUnmarshaling->pColorBlendState = (const VkPipelineColorBlendStateCreateInfo*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pColorBlendState)
-    {
-        if (hasRasterization)
-        {
-            vkStream->alloc((void**)&forUnmarshaling->pColorBlendState, sizeof(const VkPipelineColorBlendStateCreateInfo));
-            unmarshal_VkPipelineColorBlendStateCreateInfo(vkStream, rootType, (VkPipelineColorBlendStateCreateInfo*)(forUnmarshaling->pColorBlendState));
-        }
-        else
-        {
+    forUnmarshaling->pColorBlendState =
+        (const VkPipelineColorBlendStateCreateInfo*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pColorBlendState) {
+        if (hasRasterization) {
+            vkStream->alloc((void**)&forUnmarshaling->pColorBlendState,
+                            sizeof(const VkPipelineColorBlendStateCreateInfo));
+            unmarshal_VkPipelineColorBlendStateCreateInfo(
+                vkStream, rootType,
+                (VkPipelineColorBlendStateCreateInfo*)(forUnmarshaling->pColorBlendState));
+        } else {
             forUnmarshaling->pColorBlendState = 0;
         }
     }
     // WARNING PTR CHECK
-    forUnmarshaling->pDynamicState = (const VkPipelineDynamicStateCreateInfo*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pDynamicState)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pDynamicState, sizeof(const VkPipelineDynamicStateCreateInfo));
-        unmarshal_VkPipelineDynamicStateCreateInfo(vkStream, rootType, (VkPipelineDynamicStateCreateInfo*)(forUnmarshaling->pDynamicState));
+    forUnmarshaling->pDynamicState =
+        (const VkPipelineDynamicStateCreateInfo*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pDynamicState) {
+        vkStream->alloc((void**)&forUnmarshaling->pDynamicState,
+                        sizeof(const VkPipelineDynamicStateCreateInfo));
+        unmarshal_VkPipelineDynamicStateCreateInfo(
+            vkStream, rootType,
+            (VkPipelineDynamicStateCreateInfo*)(forUnmarshaling->pDynamicState));
     }
     uint64_t cgen_var_6;
     vkStream->read((uint64_t*)&cgen_var_6, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkPipelineLayout(&cgen_var_6, (VkPipelineLayout*)&forUnmarshaling->layout, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkPipelineLayout(
+        &cgen_var_6, (VkPipelineLayout*)&forUnmarshaling->layout, 1);
     uint64_t cgen_var_7;
     vkStream->read((uint64_t*)&cgen_var_7, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkRenderPass(&cgen_var_7, (VkRenderPass*)&forUnmarshaling->renderPass, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkRenderPass(
+        &cgen_var_7, (VkRenderPass*)&forUnmarshaling->renderPass, 1);
     vkStream->read((uint32_t*)&forUnmarshaling->subpass, sizeof(uint32_t));
     uint64_t cgen_var_8;
     vkStream->read((uint64_t*)&cgen_var_8, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkPipeline(&cgen_var_8, (VkPipeline*)&forUnmarshaling->basePipelineHandle, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkPipeline(
+        &cgen_var_8, (VkPipeline*)&forUnmarshaling->basePipelineHandle, 1);
     vkStream->read((int32_t*)&forUnmarshaling->basePipelineIndex, sizeof(int32_t));
 }
 
-void marshal_VkPushConstantRange(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPushConstantRange* forMarshaling)
-{
+void marshal_VkPushConstantRange(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkPushConstantRange* forMarshaling) {
     (void)rootType;
     vkStream->write((VkShaderStageFlags*)&forMarshaling->stageFlags, sizeof(VkShaderStageFlags));
     vkStream->write((uint32_t*)&forMarshaling->offset, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->size, sizeof(uint32_t));
 }
 
-void unmarshal_VkPushConstantRange(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPushConstantRange* forUnmarshaling)
-{
+void unmarshal_VkPushConstantRange(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkPushConstantRange* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkShaderStageFlags*)&forUnmarshaling->stageFlags, sizeof(VkShaderStageFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->offset, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->size, sizeof(uint32_t));
 }
 
-void marshal_VkPipelineLayoutCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineLayoutCreateInfo* forMarshaling)
-{
+void marshal_VkPipelineLayoutCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                        const VkPipelineLayoutCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkPipelineLayoutCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineLayoutCreateFlags));
+    vkStream->write((VkPipelineLayoutCreateFlags*)&forMarshaling->flags,
+                    sizeof(VkPipelineLayoutCreateFlags));
     vkStream->write((uint32_t*)&forMarshaling->setLayoutCount, sizeof(uint32_t));
-    if (forMarshaling->setLayoutCount)
-    {
+    if (forMarshaling->setLayoutCount) {
         uint64_t* cgen_var_0;
         vkStream->alloc((void**)&cgen_var_0, forMarshaling->setLayoutCount * 8);
-        vkStream->handleMapping()->mapHandles_VkDescriptorSetLayout_u64(forMarshaling->pSetLayouts, cgen_var_0, forMarshaling->setLayoutCount);
+        vkStream->handleMapping()->mapHandles_VkDescriptorSetLayout_u64(
+            forMarshaling->pSetLayouts, cgen_var_0, forMarshaling->setLayoutCount);
         vkStream->write((uint64_t*)cgen_var_0, forMarshaling->setLayoutCount * 8);
     }
     vkStream->write((uint32_t*)&forMarshaling->pushConstantRangeCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->pushConstantRangeCount; ++i)
-        {
-            marshal_VkPushConstantRange(vkStream, rootType, (const VkPushConstantRange*)(forMarshaling->pPushConstantRanges + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->pushConstantRangeCount; ++i) {
+            marshal_VkPushConstantRange(
+                vkStream, rootType,
+                (const VkPushConstantRange*)(forMarshaling->pPushConstantRanges + i));
         }
     }
 }
 
-void unmarshal_VkPipelineLayoutCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineLayoutCreateInfo* forUnmarshaling)
-{
+void unmarshal_VkPipelineLayoutCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkPipelineLayoutCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkPipelineLayoutCreateFlags*)&forUnmarshaling->flags, sizeof(VkPipelineLayoutCreateFlags));
+    vkStream->read((VkPipelineLayoutCreateFlags*)&forUnmarshaling->flags,
+                   sizeof(VkPipelineLayoutCreateFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->setLayoutCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pSetLayouts, forUnmarshaling->setLayoutCount * sizeof(const VkDescriptorSetLayout));
-    if (forUnmarshaling->setLayoutCount)
-    {
+    vkStream->alloc((void**)&forUnmarshaling->pSetLayouts,
+                    forUnmarshaling->setLayoutCount * sizeof(const VkDescriptorSetLayout));
+    if (forUnmarshaling->setLayoutCount) {
         uint64_t* cgen_var_0;
         vkStream->alloc((void**)&cgen_var_0, forUnmarshaling->setLayoutCount * 8);
         vkStream->read((uint64_t*)cgen_var_0, forUnmarshaling->setLayoutCount * 8);
-        vkStream->handleMapping()->mapHandles_u64_VkDescriptorSetLayout(cgen_var_0, (VkDescriptorSetLayout*)forUnmarshaling->pSetLayouts, forUnmarshaling->setLayoutCount);
+        vkStream->handleMapping()->mapHandles_u64_VkDescriptorSetLayout(
+            cgen_var_0, (VkDescriptorSetLayout*)forUnmarshaling->pSetLayouts,
+            forUnmarshaling->setLayoutCount);
     }
     vkStream->read((uint32_t*)&forUnmarshaling->pushConstantRangeCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pPushConstantRanges, forUnmarshaling->pushConstantRangeCount * sizeof(const VkPushConstantRange));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->pushConstantRangeCount; ++i)
-        {
-            unmarshal_VkPushConstantRange(vkStream, rootType, (VkPushConstantRange*)(forUnmarshaling->pPushConstantRanges + i));
+    vkStream->alloc((void**)&forUnmarshaling->pPushConstantRanges,
+                    forUnmarshaling->pushConstantRangeCount * sizeof(const VkPushConstantRange));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->pushConstantRangeCount; ++i) {
+            unmarshal_VkPushConstantRange(
+                vkStream, rootType,
+                (VkPushConstantRange*)(forUnmarshaling->pPushConstantRanges + i));
         }
     }
 }
 
-void marshal_VkSamplerCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSamplerCreateInfo* forMarshaling)
-{
+void marshal_VkSamplerCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkSamplerCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -3879,9 +3627,12 @@
     vkStream->write((VkFilter*)&forMarshaling->magFilter, sizeof(VkFilter));
     vkStream->write((VkFilter*)&forMarshaling->minFilter, sizeof(VkFilter));
     vkStream->write((VkSamplerMipmapMode*)&forMarshaling->mipmapMode, sizeof(VkSamplerMipmapMode));
-    vkStream->write((VkSamplerAddressMode*)&forMarshaling->addressModeU, sizeof(VkSamplerAddressMode));
-    vkStream->write((VkSamplerAddressMode*)&forMarshaling->addressModeV, sizeof(VkSamplerAddressMode));
-    vkStream->write((VkSamplerAddressMode*)&forMarshaling->addressModeW, sizeof(VkSamplerAddressMode));
+    vkStream->write((VkSamplerAddressMode*)&forMarshaling->addressModeU,
+                    sizeof(VkSamplerAddressMode));
+    vkStream->write((VkSamplerAddressMode*)&forMarshaling->addressModeV,
+                    sizeof(VkSamplerAddressMode));
+    vkStream->write((VkSamplerAddressMode*)&forMarshaling->addressModeW,
+                    sizeof(VkSamplerAddressMode));
     vkStream->write((float*)&forMarshaling->mipLodBias, sizeof(float));
     vkStream->write((VkBool32*)&forMarshaling->anisotropyEnable, sizeof(VkBool32));
     vkStream->write((float*)&forMarshaling->maxAnisotropy, sizeof(float));
@@ -3893,26 +3644,23 @@
     vkStream->write((VkBool32*)&forMarshaling->unnormalizedCoordinates, sizeof(VkBool32));
 }
 
-void unmarshal_VkSamplerCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSamplerCreateInfo* forUnmarshaling)
-{
+void unmarshal_VkSamplerCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkSamplerCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -3920,9 +3668,12 @@
     vkStream->read((VkFilter*)&forUnmarshaling->magFilter, sizeof(VkFilter));
     vkStream->read((VkFilter*)&forUnmarshaling->minFilter, sizeof(VkFilter));
     vkStream->read((VkSamplerMipmapMode*)&forUnmarshaling->mipmapMode, sizeof(VkSamplerMipmapMode));
-    vkStream->read((VkSamplerAddressMode*)&forUnmarshaling->addressModeU, sizeof(VkSamplerAddressMode));
-    vkStream->read((VkSamplerAddressMode*)&forUnmarshaling->addressModeV, sizeof(VkSamplerAddressMode));
-    vkStream->read((VkSamplerAddressMode*)&forUnmarshaling->addressModeW, sizeof(VkSamplerAddressMode));
+    vkStream->read((VkSamplerAddressMode*)&forUnmarshaling->addressModeU,
+                   sizeof(VkSamplerAddressMode));
+    vkStream->read((VkSamplerAddressMode*)&forUnmarshaling->addressModeV,
+                   sizeof(VkSamplerAddressMode));
+    vkStream->read((VkSamplerAddressMode*)&forUnmarshaling->addressModeW,
+                   sizeof(VkSamplerAddressMode));
     vkStream->read((float*)&forUnmarshaling->mipLodBias, sizeof(float));
     vkStream->read((VkBool32*)&forUnmarshaling->anisotropyEnable, sizeof(VkBool32));
     vkStream->read((float*)&forUnmarshaling->maxAnisotropy, sizeof(float));
@@ -3934,72 +3685,66 @@
     vkStream->read((VkBool32*)&forUnmarshaling->unnormalizedCoordinates, sizeof(VkBool32));
 }
 
-void marshal_VkCopyDescriptorSet(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCopyDescriptorSet* forMarshaling)
-{
+void marshal_VkCopyDescriptorSet(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkCopyDescriptorSet* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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_VkDescriptorSet_u64(&forMarshaling->srcSet, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkDescriptorSet_u64(&forMarshaling->srcSet, &cgen_var_0,
+                                                              1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->write((uint32_t*)&forMarshaling->srcBinding, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->srcArrayElement, sizeof(uint32_t));
     uint64_t cgen_var_1;
-    vkStream->handleMapping()->mapHandles_VkDescriptorSet_u64(&forMarshaling->dstSet, &cgen_var_1, 1);
+    vkStream->handleMapping()->mapHandles_VkDescriptorSet_u64(&forMarshaling->dstSet, &cgen_var_1,
+                                                              1);
     vkStream->write((uint64_t*)&cgen_var_1, 1 * 8);
     vkStream->write((uint32_t*)&forMarshaling->dstBinding, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->dstArrayElement, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->descriptorCount, sizeof(uint32_t));
 }
 
-void unmarshal_VkCopyDescriptorSet(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCopyDescriptorSet* forUnmarshaling)
-{
+void unmarshal_VkCopyDescriptorSet(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkCopyDescriptorSet* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkDescriptorSet(&cgen_var_0, (VkDescriptorSet*)&forUnmarshaling->srcSet, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkDescriptorSet(
+        &cgen_var_0, (VkDescriptorSet*)&forUnmarshaling->srcSet, 1);
     vkStream->read((uint32_t*)&forUnmarshaling->srcBinding, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->srcArrayElement, sizeof(uint32_t));
     uint64_t cgen_var_1;
     vkStream->read((uint64_t*)&cgen_var_1, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkDescriptorSet(&cgen_var_1, (VkDescriptorSet*)&forUnmarshaling->dstSet, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkDescriptorSet(
+        &cgen_var_1, (VkDescriptorSet*)&forUnmarshaling->dstSet, 1);
     vkStream->read((uint32_t*)&forUnmarshaling->dstBinding, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->dstArrayElement, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->descriptorCount, sizeof(uint32_t));
 }
 
-void marshal_VkDescriptorBufferInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDescriptorBufferInfo* forMarshaling)
-{
+void marshal_VkDescriptorBufferInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                    const VkDescriptorBufferInfo* forMarshaling) {
     (void)rootType;
     uint64_t cgen_var_0;
     vkStream->handleMapping()->mapHandles_VkBuffer_u64(&forMarshaling->buffer, &cgen_var_0, 1);
@@ -4008,196 +3753,173 @@
     vkStream->write((VkDeviceSize*)&forMarshaling->range, sizeof(VkDeviceSize));
 }
 
-void unmarshal_VkDescriptorBufferInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorBufferInfo* forUnmarshaling)
-{
+void unmarshal_VkDescriptorBufferInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                      VkDescriptorBufferInfo* forUnmarshaling) {
     (void)rootType;
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_0, (VkBuffer*)&forUnmarshaling->buffer, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_0,
+                                                       (VkBuffer*)&forUnmarshaling->buffer, 1);
     vkStream->read((VkDeviceSize*)&forUnmarshaling->offset, sizeof(VkDeviceSize));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->range, sizeof(VkDeviceSize));
 }
 
-void marshal_VkDescriptorImageInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDescriptorImageInfo* forMarshaling)
-{
+void marshal_VkDescriptorImageInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkDescriptorImageInfo* forMarshaling) {
     (void)rootType;
     uint64_t cgen_var_0;
     vkStream->handleMapping()->mapHandles_VkSampler_u64(&forMarshaling->sampler, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     uint64_t cgen_var_1;
-    vkStream->handleMapping()->mapHandles_VkImageView_u64(&forMarshaling->imageView, &cgen_var_1, 1);
+    vkStream->handleMapping()->mapHandles_VkImageView_u64(&forMarshaling->imageView, &cgen_var_1,
+                                                          1);
     vkStream->write((uint64_t*)&cgen_var_1, 1 * 8);
     vkStream->write((VkImageLayout*)&forMarshaling->imageLayout, sizeof(VkImageLayout));
 }
 
-void unmarshal_VkDescriptorImageInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorImageInfo* forUnmarshaling)
-{
+void unmarshal_VkDescriptorImageInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkDescriptorImageInfo* forUnmarshaling) {
     (void)rootType;
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkSampler(&cgen_var_0, (VkSampler*)&forUnmarshaling->sampler, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkSampler(&cgen_var_0,
+                                                        (VkSampler*)&forUnmarshaling->sampler, 1);
     uint64_t cgen_var_1;
     vkStream->read((uint64_t*)&cgen_var_1, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkImageView(&cgen_var_1, (VkImageView*)&forUnmarshaling->imageView, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkImageView(
+        &cgen_var_1, (VkImageView*)&forUnmarshaling->imageView, 1);
     vkStream->read((VkImageLayout*)&forUnmarshaling->imageLayout, sizeof(VkImageLayout));
 }
 
-void marshal_VkDescriptorPoolSize(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDescriptorPoolSize* forMarshaling)
-{
+void marshal_VkDescriptorPoolSize(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkDescriptorPoolSize* forMarshaling) {
     (void)rootType;
     vkStream->write((VkDescriptorType*)&forMarshaling->type, sizeof(VkDescriptorType));
     vkStream->write((uint32_t*)&forMarshaling->descriptorCount, sizeof(uint32_t));
 }
 
-void unmarshal_VkDescriptorPoolSize(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorPoolSize* forUnmarshaling)
-{
+void unmarshal_VkDescriptorPoolSize(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkDescriptorPoolSize* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkDescriptorType*)&forUnmarshaling->type, sizeof(VkDescriptorType));
     vkStream->read((uint32_t*)&forUnmarshaling->descriptorCount, sizeof(uint32_t));
 }
 
-void marshal_VkDescriptorPoolCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDescriptorPoolCreateInfo* forMarshaling)
-{
+void marshal_VkDescriptorPoolCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                        const VkDescriptorPoolCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkDescriptorPoolCreateFlags*)&forMarshaling->flags, sizeof(VkDescriptorPoolCreateFlags));
+    vkStream->write((VkDescriptorPoolCreateFlags*)&forMarshaling->flags,
+                    sizeof(VkDescriptorPoolCreateFlags));
     vkStream->write((uint32_t*)&forMarshaling->maxSets, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->poolSizeCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->poolSizeCount; ++i)
-        {
-            marshal_VkDescriptorPoolSize(vkStream, rootType, (const VkDescriptorPoolSize*)(forMarshaling->pPoolSizes + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->poolSizeCount; ++i) {
+            marshal_VkDescriptorPoolSize(
+                vkStream, rootType, (const VkDescriptorPoolSize*)(forMarshaling->pPoolSizes + i));
         }
     }
 }
 
-void unmarshal_VkDescriptorPoolCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorPoolCreateInfo* forUnmarshaling)
-{
+void unmarshal_VkDescriptorPoolCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkDescriptorPoolCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkDescriptorPoolCreateFlags*)&forUnmarshaling->flags, sizeof(VkDescriptorPoolCreateFlags));
+    vkStream->read((VkDescriptorPoolCreateFlags*)&forUnmarshaling->flags,
+                   sizeof(VkDescriptorPoolCreateFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->maxSets, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->poolSizeCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pPoolSizes, forUnmarshaling->poolSizeCount * sizeof(const VkDescriptorPoolSize));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->poolSizeCount; ++i)
-        {
-            unmarshal_VkDescriptorPoolSize(vkStream, rootType, (VkDescriptorPoolSize*)(forUnmarshaling->pPoolSizes + i));
+    vkStream->alloc((void**)&forUnmarshaling->pPoolSizes,
+                    forUnmarshaling->poolSizeCount * sizeof(const VkDescriptorPoolSize));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->poolSizeCount; ++i) {
+            unmarshal_VkDescriptorPoolSize(
+                vkStream, rootType, (VkDescriptorPoolSize*)(forUnmarshaling->pPoolSizes + i));
         }
     }
 }
 
-void marshal_VkDescriptorSetAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDescriptorSetAllocateInfo* forMarshaling)
-{
+void marshal_VkDescriptorSetAllocateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkDescriptorSetAllocateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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_VkDescriptorPool_u64(&forMarshaling->descriptorPool, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkDescriptorPool_u64(&forMarshaling->descriptorPool,
+                                                               &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->write((uint32_t*)&forMarshaling->descriptorSetCount, sizeof(uint32_t));
-    if (forMarshaling->descriptorSetCount)
-    {
+    if (forMarshaling->descriptorSetCount) {
         uint64_t* cgen_var_1;
         vkStream->alloc((void**)&cgen_var_1, forMarshaling->descriptorSetCount * 8);
-        vkStream->handleMapping()->mapHandles_VkDescriptorSetLayout_u64(forMarshaling->pSetLayouts, cgen_var_1, forMarshaling->descriptorSetCount);
+        vkStream->handleMapping()->mapHandles_VkDescriptorSetLayout_u64(
+            forMarshaling->pSetLayouts, cgen_var_1, forMarshaling->descriptorSetCount);
         vkStream->write((uint64_t*)cgen_var_1, forMarshaling->descriptorSetCount * 8);
     }
 }
 
-void unmarshal_VkDescriptorSetAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorSetAllocateInfo* forUnmarshaling)
-{
+void unmarshal_VkDescriptorSetAllocateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkDescriptorSetAllocateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkDescriptorPool(&cgen_var_0, (VkDescriptorPool*)&forUnmarshaling->descriptorPool, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkDescriptorPool(
+        &cgen_var_0, (VkDescriptorPool*)&forUnmarshaling->descriptorPool, 1);
     vkStream->read((uint32_t*)&forUnmarshaling->descriptorSetCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pSetLayouts, forUnmarshaling->descriptorSetCount * sizeof(const VkDescriptorSetLayout));
-    if (forUnmarshaling->descriptorSetCount)
-    {
+    vkStream->alloc((void**)&forUnmarshaling->pSetLayouts,
+                    forUnmarshaling->descriptorSetCount * sizeof(const VkDescriptorSetLayout));
+    if (forUnmarshaling->descriptorSetCount) {
         uint64_t* cgen_var_1;
         vkStream->alloc((void**)&cgen_var_1, forUnmarshaling->descriptorSetCount * 8);
         vkStream->read((uint64_t*)cgen_var_1, forUnmarshaling->descriptorSetCount * 8);
-        vkStream->handleMapping()->mapHandles_u64_VkDescriptorSetLayout(cgen_var_1, (VkDescriptorSetLayout*)forUnmarshaling->pSetLayouts, forUnmarshaling->descriptorSetCount);
+        vkStream->handleMapping()->mapHandles_u64_VkDescriptorSetLayout(
+            cgen_var_1, (VkDescriptorSetLayout*)forUnmarshaling->pSetLayouts,
+            forUnmarshaling->descriptorSetCount);
     }
 }
 
-void marshal_VkDescriptorSetLayoutBinding(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDescriptorSetLayoutBinding* forMarshaling)
-{
+void marshal_VkDescriptorSetLayoutBinding(VulkanStream* vkStream, VkStructureType rootType,
+                                          const VkDescriptorSetLayoutBinding* forMarshaling) {
     (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->binding, sizeof(uint32_t));
     vkStream->write((VkDescriptorType*)&forMarshaling->descriptorType, sizeof(VkDescriptorType));
@@ -4206,23 +3928,19 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pImmutableSamplers;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pImmutableSamplers)
-    {
-        if (forMarshaling->descriptorCount)
-        {
+    if (forMarshaling->pImmutableSamplers) {
+        if (forMarshaling->descriptorCount) {
             uint64_t* cgen_var_0_0;
             vkStream->alloc((void**)&cgen_var_0_0, forMarshaling->descriptorCount * 8);
-            vkStream->handleMapping()->mapHandles_VkSampler_u64(forMarshaling->pImmutableSamplers, cgen_var_0_0, forMarshaling->descriptorCount);
+            vkStream->handleMapping()->mapHandles_VkSampler_u64(
+                forMarshaling->pImmutableSamplers, cgen_var_0_0, forMarshaling->descriptorCount);
             vkStream->write((uint64_t*)cgen_var_0_0, forMarshaling->descriptorCount * 8);
         }
     }
 }
 
-void unmarshal_VkDescriptorSetLayoutBinding(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorSetLayoutBinding* forUnmarshaling)
-{
+void unmarshal_VkDescriptorSetLayoutBinding(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkDescriptorSetLayoutBinding* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->binding, sizeof(uint32_t));
     vkStream->read((VkDescriptorType*)&forUnmarshaling->descriptorType, sizeof(VkDescriptorType));
@@ -4230,91 +3948,85 @@
     vkStream->read((VkShaderStageFlags*)&forUnmarshaling->stageFlags, sizeof(VkShaderStageFlags));
     // WARNING PTR CHECK
     forUnmarshaling->pImmutableSamplers = (const VkSampler*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pImmutableSamplers)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pImmutableSamplers, forUnmarshaling->descriptorCount * sizeof(const VkSampler));
-        if (forUnmarshaling->descriptorCount)
-        {
+    if (forUnmarshaling->pImmutableSamplers) {
+        vkStream->alloc((void**)&forUnmarshaling->pImmutableSamplers,
+                        forUnmarshaling->descriptorCount * sizeof(const VkSampler));
+        if (forUnmarshaling->descriptorCount) {
             uint64_t* cgen_var_0_0;
             vkStream->alloc((void**)&cgen_var_0_0, forUnmarshaling->descriptorCount * 8);
             vkStream->read((uint64_t*)cgen_var_0_0, forUnmarshaling->descriptorCount * 8);
-            vkStream->handleMapping()->mapHandles_u64_VkSampler(cgen_var_0_0, (VkSampler*)forUnmarshaling->pImmutableSamplers, forUnmarshaling->descriptorCount);
+            vkStream->handleMapping()->mapHandles_u64_VkSampler(
+                cgen_var_0_0, (VkSampler*)forUnmarshaling->pImmutableSamplers,
+                forUnmarshaling->descriptorCount);
         }
     }
 }
 
-void marshal_VkDescriptorSetLayoutCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDescriptorSetLayoutCreateInfo* forMarshaling)
-{
+void marshal_VkDescriptorSetLayoutCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkDescriptorSetLayoutCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkDescriptorSetLayoutCreateFlags*)&forMarshaling->flags, sizeof(VkDescriptorSetLayoutCreateFlags));
+    vkStream->write((VkDescriptorSetLayoutCreateFlags*)&forMarshaling->flags,
+                    sizeof(VkDescriptorSetLayoutCreateFlags));
     vkStream->write((uint32_t*)&forMarshaling->bindingCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->bindingCount; ++i)
-        {
-            marshal_VkDescriptorSetLayoutBinding(vkStream, rootType, (const VkDescriptorSetLayoutBinding*)(forMarshaling->pBindings + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->bindingCount; ++i) {
+            marshal_VkDescriptorSetLayoutBinding(
+                vkStream, rootType,
+                (const VkDescriptorSetLayoutBinding*)(forMarshaling->pBindings + i));
         }
     }
 }
 
-void unmarshal_VkDescriptorSetLayoutCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorSetLayoutCreateInfo* forUnmarshaling)
-{
+void unmarshal_VkDescriptorSetLayoutCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkDescriptorSetLayoutCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkDescriptorSetLayoutCreateFlags*)&forUnmarshaling->flags, sizeof(VkDescriptorSetLayoutCreateFlags));
+    vkStream->read((VkDescriptorSetLayoutCreateFlags*)&forUnmarshaling->flags,
+                   sizeof(VkDescriptorSetLayoutCreateFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->bindingCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pBindings, forUnmarshaling->bindingCount * sizeof(const VkDescriptorSetLayoutBinding));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->bindingCount; ++i)
-        {
-            unmarshal_VkDescriptorSetLayoutBinding(vkStream, rootType, (VkDescriptorSetLayoutBinding*)(forUnmarshaling->pBindings + i));
+    vkStream->alloc((void**)&forUnmarshaling->pBindings,
+                    forUnmarshaling->bindingCount * sizeof(const VkDescriptorSetLayoutBinding));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->bindingCount; ++i) {
+            unmarshal_VkDescriptorSetLayoutBinding(
+                vkStream, rootType,
+                (VkDescriptorSetLayoutBinding*)(forUnmarshaling->pBindings + i));
         }
     }
 }
 
-void marshal_VkWriteDescriptorSet(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkWriteDescriptorSet* forMarshaling)
-{
+void marshal_VkWriteDescriptorSet(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkWriteDescriptorSet* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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_VkDescriptorSet_u64(&forMarshaling->dstSet, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkDescriptorSet_u64(&forMarshaling->dstSet, &cgen_var_0,
+                                                              1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->write((uint32_t*)&forMarshaling->dstBinding, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->dstArrayElement, sizeof(uint32_t));
@@ -4323,15 +4035,18 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)forMarshaling->pImageInfo;
     vkStream->putBe64(cgen_var_1);
-    if (forMarshaling->pImageInfo)
-    {
-        if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || ((VK_DESCRIPTOR_TYPE_SAMPLER == forMarshaling->descriptorType) || (VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER == forMarshaling->descriptorType) || (VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE == forMarshaling->descriptorType) || (VK_DESCRIPTOR_TYPE_STORAGE_IMAGE == forMarshaling->descriptorType) || (VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT == forMarshaling->descriptorType))))
-        {
-            if (forMarshaling)
-            {
-                for (uint32_t i = 0; i < (uint32_t)forMarshaling->descriptorCount; ++i)
-                {
-                    marshal_VkDescriptorImageInfo(vkStream, rootType, (const VkDescriptorImageInfo*)(forMarshaling->pImageInfo + i));
+    if (forMarshaling->pImageInfo) {
+        if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) ||
+             ((VK_DESCRIPTOR_TYPE_SAMPLER == forMarshaling->descriptorType) ||
+              (VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER == forMarshaling->descriptorType) ||
+              (VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE == forMarshaling->descriptorType) ||
+              (VK_DESCRIPTOR_TYPE_STORAGE_IMAGE == forMarshaling->descriptorType) ||
+              (VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT == forMarshaling->descriptorType)))) {
+            if (forMarshaling) {
+                for (uint32_t i = 0; i < (uint32_t)forMarshaling->descriptorCount; ++i) {
+                    marshal_VkDescriptorImageInfo(
+                        vkStream, rootType,
+                        (const VkDescriptorImageInfo*)(forMarshaling->pImageInfo + i));
                 }
             }
         }
@@ -4339,15 +4054,17 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)forMarshaling->pBufferInfo;
     vkStream->putBe64(cgen_var_2);
-    if (forMarshaling->pBufferInfo)
-    {
-        if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || ((VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER == forMarshaling->descriptorType) || (VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC == forMarshaling->descriptorType) || (VK_DESCRIPTOR_TYPE_STORAGE_BUFFER == forMarshaling->descriptorType) || (VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC == forMarshaling->descriptorType))))
-        {
-            if (forMarshaling)
-            {
-                for (uint32_t i = 0; i < (uint32_t)forMarshaling->descriptorCount; ++i)
-                {
-                    marshal_VkDescriptorBufferInfo(vkStream, rootType, (const VkDescriptorBufferInfo*)(forMarshaling->pBufferInfo + i));
+    if (forMarshaling->pBufferInfo) {
+        if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) ||
+             ((VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER == forMarshaling->descriptorType) ||
+              (VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC == forMarshaling->descriptorType) ||
+              (VK_DESCRIPTOR_TYPE_STORAGE_BUFFER == forMarshaling->descriptorType) ||
+              (VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC == forMarshaling->descriptorType)))) {
+            if (forMarshaling) {
+                for (uint32_t i = 0; i < (uint32_t)forMarshaling->descriptorCount; ++i) {
+                    marshal_VkDescriptorBufferInfo(
+                        vkStream, rootType,
+                        (const VkDescriptorBufferInfo*)(forMarshaling->pBufferInfo + i));
                 }
             }
         }
@@ -4355,191 +4072,185 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_3 = (uint64_t)(uintptr_t)forMarshaling->pTexelBufferView;
     vkStream->putBe64(cgen_var_3);
-    if (forMarshaling->pTexelBufferView)
-    {
-        if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || ((VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER == forMarshaling->descriptorType) || (VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER == forMarshaling->descriptorType))))
-        {
-            if (forMarshaling->descriptorCount)
-            {
+    if (forMarshaling->pTexelBufferView) {
+        if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) ||
+             ((VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER == forMarshaling->descriptorType) ||
+              (VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER == forMarshaling->descriptorType)))) {
+            if (forMarshaling->descriptorCount) {
                 uint64_t* cgen_var_3_0;
                 vkStream->alloc((void**)&cgen_var_3_0, forMarshaling->descriptorCount * 8);
-                vkStream->handleMapping()->mapHandles_VkBufferView_u64(forMarshaling->pTexelBufferView, cgen_var_3_0, forMarshaling->descriptorCount);
+                vkStream->handleMapping()->mapHandles_VkBufferView_u64(
+                    forMarshaling->pTexelBufferView, cgen_var_3_0, forMarshaling->descriptorCount);
                 vkStream->write((uint64_t*)cgen_var_3_0, forMarshaling->descriptorCount * 8);
             }
         }
     }
 }
 
-void unmarshal_VkWriteDescriptorSet(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkWriteDescriptorSet* forUnmarshaling)
-{
+void unmarshal_VkWriteDescriptorSet(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkWriteDescriptorSet* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkDescriptorSet(&cgen_var_0, (VkDescriptorSet*)&forUnmarshaling->dstSet, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkDescriptorSet(
+        &cgen_var_0, (VkDescriptorSet*)&forUnmarshaling->dstSet, 1);
     vkStream->read((uint32_t*)&forUnmarshaling->dstBinding, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->dstArrayElement, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->descriptorCount, sizeof(uint32_t));
     vkStream->read((VkDescriptorType*)&forUnmarshaling->descriptorType, sizeof(VkDescriptorType));
     // WARNING PTR CHECK
     forUnmarshaling->pImageInfo = (const VkDescriptorImageInfo*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pImageInfo)
-    {
-        if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || ((VK_DESCRIPTOR_TYPE_SAMPLER == forUnmarshaling->descriptorType) || (VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER == forUnmarshaling->descriptorType) || (VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE == forUnmarshaling->descriptorType) || (VK_DESCRIPTOR_TYPE_STORAGE_IMAGE == forUnmarshaling->descriptorType) || (VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT == forUnmarshaling->descriptorType))))
-        {
-            vkStream->alloc((void**)&forUnmarshaling->pImageInfo, forUnmarshaling->descriptorCount * sizeof(const VkDescriptorImageInfo));
-            if (forUnmarshaling)
-            {
-                for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->descriptorCount; ++i)
-                {
-                    unmarshal_VkDescriptorImageInfo(vkStream, rootType, (VkDescriptorImageInfo*)(forUnmarshaling->pImageInfo + i));
+    if (forUnmarshaling->pImageInfo) {
+        if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) ||
+             ((VK_DESCRIPTOR_TYPE_SAMPLER == forUnmarshaling->descriptorType) ||
+              (VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER == forUnmarshaling->descriptorType) ||
+              (VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE == forUnmarshaling->descriptorType) ||
+              (VK_DESCRIPTOR_TYPE_STORAGE_IMAGE == forUnmarshaling->descriptorType) ||
+              (VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT == forUnmarshaling->descriptorType)))) {
+            vkStream->alloc((void**)&forUnmarshaling->pImageInfo,
+                            forUnmarshaling->descriptorCount * sizeof(const VkDescriptorImageInfo));
+            if (forUnmarshaling) {
+                for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->descriptorCount; ++i) {
+                    unmarshal_VkDescriptorImageInfo(
+                        vkStream, rootType,
+                        (VkDescriptorImageInfo*)(forUnmarshaling->pImageInfo + i));
                 }
             }
-        }
-        else
-        {
+        } else {
             forUnmarshaling->pImageInfo = 0;
         }
     }
     // WARNING PTR CHECK
     forUnmarshaling->pBufferInfo = (const VkDescriptorBufferInfo*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pBufferInfo)
-    {
-        if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || ((VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER == forUnmarshaling->descriptorType) || (VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC == forUnmarshaling->descriptorType) || (VK_DESCRIPTOR_TYPE_STORAGE_BUFFER == forUnmarshaling->descriptorType) || (VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC == forUnmarshaling->descriptorType))))
-        {
-            vkStream->alloc((void**)&forUnmarshaling->pBufferInfo, forUnmarshaling->descriptorCount * sizeof(const VkDescriptorBufferInfo));
-            if (forUnmarshaling)
-            {
-                for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->descriptorCount; ++i)
-                {
-                    unmarshal_VkDescriptorBufferInfo(vkStream, rootType, (VkDescriptorBufferInfo*)(forUnmarshaling->pBufferInfo + i));
+    if (forUnmarshaling->pBufferInfo) {
+        if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) ||
+             ((VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER == forUnmarshaling->descriptorType) ||
+              (VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC == forUnmarshaling->descriptorType) ||
+              (VK_DESCRIPTOR_TYPE_STORAGE_BUFFER == forUnmarshaling->descriptorType) ||
+              (VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC == forUnmarshaling->descriptorType)))) {
+            vkStream->alloc(
+                (void**)&forUnmarshaling->pBufferInfo,
+                forUnmarshaling->descriptorCount * sizeof(const VkDescriptorBufferInfo));
+            if (forUnmarshaling) {
+                for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->descriptorCount; ++i) {
+                    unmarshal_VkDescriptorBufferInfo(
+                        vkStream, rootType,
+                        (VkDescriptorBufferInfo*)(forUnmarshaling->pBufferInfo + i));
                 }
             }
-        }
-        else
-        {
+        } else {
             forUnmarshaling->pBufferInfo = 0;
         }
     }
     // WARNING PTR CHECK
     forUnmarshaling->pTexelBufferView = (const VkBufferView*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pTexelBufferView)
-    {
-        if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || ((VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER == forUnmarshaling->descriptorType) || (VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER == forUnmarshaling->descriptorType))))
-        {
-            vkStream->alloc((void**)&forUnmarshaling->pTexelBufferView, forUnmarshaling->descriptorCount * sizeof(const VkBufferView));
-            if (forUnmarshaling->descriptorCount)
-            {
+    if (forUnmarshaling->pTexelBufferView) {
+        if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) ||
+             ((VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER == forUnmarshaling->descriptorType) ||
+              (VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER == forUnmarshaling->descriptorType)))) {
+            vkStream->alloc((void**)&forUnmarshaling->pTexelBufferView,
+                            forUnmarshaling->descriptorCount * sizeof(const VkBufferView));
+            if (forUnmarshaling->descriptorCount) {
                 uint64_t* cgen_var_3_0;
                 vkStream->alloc((void**)&cgen_var_3_0, forUnmarshaling->descriptorCount * 8);
                 vkStream->read((uint64_t*)cgen_var_3_0, forUnmarshaling->descriptorCount * 8);
-                vkStream->handleMapping()->mapHandles_u64_VkBufferView(cgen_var_3_0, (VkBufferView*)forUnmarshaling->pTexelBufferView, forUnmarshaling->descriptorCount);
+                vkStream->handleMapping()->mapHandles_u64_VkBufferView(
+                    cgen_var_3_0, (VkBufferView*)forUnmarshaling->pTexelBufferView,
+                    forUnmarshaling->descriptorCount);
             }
-        }
-        else
-        {
+        } else {
             forUnmarshaling->pTexelBufferView = 0;
         }
     }
 }
 
-void marshal_VkAttachmentDescription(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAttachmentDescription* forMarshaling)
-{
+void marshal_VkAttachmentDescription(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkAttachmentDescription* forMarshaling) {
     (void)rootType;
-    vkStream->write((VkAttachmentDescriptionFlags*)&forMarshaling->flags, sizeof(VkAttachmentDescriptionFlags));
+    vkStream->write((VkAttachmentDescriptionFlags*)&forMarshaling->flags,
+                    sizeof(VkAttachmentDescriptionFlags));
     vkStream->write((VkFormat*)&forMarshaling->format, sizeof(VkFormat));
     vkStream->write((VkSampleCountFlagBits*)&forMarshaling->samples, sizeof(VkSampleCountFlagBits));
     vkStream->write((VkAttachmentLoadOp*)&forMarshaling->loadOp, sizeof(VkAttachmentLoadOp));
     vkStream->write((VkAttachmentStoreOp*)&forMarshaling->storeOp, sizeof(VkAttachmentStoreOp));
     vkStream->write((VkAttachmentLoadOp*)&forMarshaling->stencilLoadOp, sizeof(VkAttachmentLoadOp));
-    vkStream->write((VkAttachmentStoreOp*)&forMarshaling->stencilStoreOp, sizeof(VkAttachmentStoreOp));
+    vkStream->write((VkAttachmentStoreOp*)&forMarshaling->stencilStoreOp,
+                    sizeof(VkAttachmentStoreOp));
     vkStream->write((VkImageLayout*)&forMarshaling->initialLayout, sizeof(VkImageLayout));
     vkStream->write((VkImageLayout*)&forMarshaling->finalLayout, sizeof(VkImageLayout));
 }
 
-void unmarshal_VkAttachmentDescription(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAttachmentDescription* forUnmarshaling)
-{
+void unmarshal_VkAttachmentDescription(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkAttachmentDescription* forUnmarshaling) {
     (void)rootType;
-    vkStream->read((VkAttachmentDescriptionFlags*)&forUnmarshaling->flags, sizeof(VkAttachmentDescriptionFlags));
+    vkStream->read((VkAttachmentDescriptionFlags*)&forUnmarshaling->flags,
+                   sizeof(VkAttachmentDescriptionFlags));
     vkStream->read((VkFormat*)&forUnmarshaling->format, sizeof(VkFormat));
-    vkStream->read((VkSampleCountFlagBits*)&forUnmarshaling->samples, sizeof(VkSampleCountFlagBits));
+    vkStream->read((VkSampleCountFlagBits*)&forUnmarshaling->samples,
+                   sizeof(VkSampleCountFlagBits));
     vkStream->read((VkAttachmentLoadOp*)&forUnmarshaling->loadOp, sizeof(VkAttachmentLoadOp));
     vkStream->read((VkAttachmentStoreOp*)&forUnmarshaling->storeOp, sizeof(VkAttachmentStoreOp));
-    vkStream->read((VkAttachmentLoadOp*)&forUnmarshaling->stencilLoadOp, sizeof(VkAttachmentLoadOp));
-    vkStream->read((VkAttachmentStoreOp*)&forUnmarshaling->stencilStoreOp, sizeof(VkAttachmentStoreOp));
+    vkStream->read((VkAttachmentLoadOp*)&forUnmarshaling->stencilLoadOp,
+                   sizeof(VkAttachmentLoadOp));
+    vkStream->read((VkAttachmentStoreOp*)&forUnmarshaling->stencilStoreOp,
+                   sizeof(VkAttachmentStoreOp));
     vkStream->read((VkImageLayout*)&forUnmarshaling->initialLayout, sizeof(VkImageLayout));
     vkStream->read((VkImageLayout*)&forUnmarshaling->finalLayout, sizeof(VkImageLayout));
 }
 
-void marshal_VkAttachmentReference(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAttachmentReference* forMarshaling)
-{
+void marshal_VkAttachmentReference(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkAttachmentReference* forMarshaling) {
     (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->attachment, sizeof(uint32_t));
     vkStream->write((VkImageLayout*)&forMarshaling->layout, sizeof(VkImageLayout));
 }
 
-void unmarshal_VkAttachmentReference(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAttachmentReference* forUnmarshaling)
-{
+void unmarshal_VkAttachmentReference(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkAttachmentReference* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->attachment, sizeof(uint32_t));
     vkStream->read((VkImageLayout*)&forUnmarshaling->layout, sizeof(VkImageLayout));
 }
 
-void marshal_VkFramebufferCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkFramebufferCreateInfo* forMarshaling)
-{
+void marshal_VkFramebufferCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkFramebufferCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkFramebufferCreateFlags*)&forMarshaling->flags, sizeof(VkFramebufferCreateFlags));
+    vkStream->write((VkFramebufferCreateFlags*)&forMarshaling->flags,
+                    sizeof(VkFramebufferCreateFlags));
     uint64_t cgen_var_0;
-    vkStream->handleMapping()->mapHandles_VkRenderPass_u64(&forMarshaling->renderPass, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkRenderPass_u64(&forMarshaling->renderPass, &cgen_var_0,
+                                                           1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->write((uint32_t*)&forMarshaling->attachmentCount, sizeof(uint32_t));
-    if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || (((forMarshaling->flags & VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT) == 0))))
-    {
-        if (forMarshaling->attachmentCount)
-        {
+    if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) ||
+         (((forMarshaling->flags & VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT) == 0)))) {
+        if (forMarshaling->attachmentCount) {
             uint64_t* cgen_var_0_0;
             vkStream->alloc((void**)&cgen_var_0_0, forMarshaling->attachmentCount * 8);
-            vkStream->handleMapping()->mapHandles_VkImageView_u64(forMarshaling->pAttachments, cgen_var_0_0, forMarshaling->attachmentCount);
+            vkStream->handleMapping()->mapHandles_VkImageView_u64(
+                forMarshaling->pAttachments, cgen_var_0_0, forMarshaling->attachmentCount);
             vkStream->write((uint64_t*)cgen_var_0_0, forMarshaling->attachmentCount * 8);
         }
     }
@@ -4548,47 +4259,46 @@
     vkStream->write((uint32_t*)&forMarshaling->layers, sizeof(uint32_t));
 }
 
-void unmarshal_VkFramebufferCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFramebufferCreateInfo* forUnmarshaling)
-{
+void unmarshal_VkFramebufferCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkFramebufferCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkFramebufferCreateFlags*)&forUnmarshaling->flags, sizeof(VkFramebufferCreateFlags));
+    vkStream->read((VkFramebufferCreateFlags*)&forUnmarshaling->flags,
+                   sizeof(VkFramebufferCreateFlags));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkRenderPass(&cgen_var_0, (VkRenderPass*)&forUnmarshaling->renderPass, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkRenderPass(
+        &cgen_var_0, (VkRenderPass*)&forUnmarshaling->renderPass, 1);
     vkStream->read((uint32_t*)&forUnmarshaling->attachmentCount, sizeof(uint32_t));
-    if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || (((forUnmarshaling->flags & VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT) == 0))))
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pAttachments, forUnmarshaling->attachmentCount * sizeof(const VkImageView));
-        if (forUnmarshaling->attachmentCount)
-        {
+    if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) ||
+         (((forUnmarshaling->flags & VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT) == 0)))) {
+        vkStream->alloc((void**)&forUnmarshaling->pAttachments,
+                        forUnmarshaling->attachmentCount * sizeof(const VkImageView));
+        if (forUnmarshaling->attachmentCount) {
             uint64_t* cgen_var_0_0;
             vkStream->alloc((void**)&cgen_var_0_0, forUnmarshaling->attachmentCount * 8);
             vkStream->read((uint64_t*)cgen_var_0_0, forUnmarshaling->attachmentCount * 8);
-            vkStream->handleMapping()->mapHandles_u64_VkImageView(cgen_var_0_0, (VkImageView*)forUnmarshaling->pAttachments, forUnmarshaling->attachmentCount);
+            vkStream->handleMapping()->mapHandles_u64_VkImageView(
+                cgen_var_0_0, (VkImageView*)forUnmarshaling->pAttachments,
+                forUnmarshaling->attachmentCount);
         }
-    }
-    else
-    {
+    } else {
         forUnmarshaling->pAttachments = 0;
     }
     vkStream->read((uint32_t*)&forUnmarshaling->width, sizeof(uint32_t));
@@ -4596,460 +4306,438 @@
     vkStream->read((uint32_t*)&forUnmarshaling->layers, sizeof(uint32_t));
 }
 
-void marshal_VkSubpassDescription(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSubpassDescription* forMarshaling)
-{
+void marshal_VkSubpassDescription(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkSubpassDescription* forMarshaling) {
     (void)rootType;
-    vkStream->write((VkSubpassDescriptionFlags*)&forMarshaling->flags, sizeof(VkSubpassDescriptionFlags));
-    vkStream->write((VkPipelineBindPoint*)&forMarshaling->pipelineBindPoint, sizeof(VkPipelineBindPoint));
+    vkStream->write((VkSubpassDescriptionFlags*)&forMarshaling->flags,
+                    sizeof(VkSubpassDescriptionFlags));
+    vkStream->write((VkPipelineBindPoint*)&forMarshaling->pipelineBindPoint,
+                    sizeof(VkPipelineBindPoint));
     vkStream->write((uint32_t*)&forMarshaling->inputAttachmentCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->inputAttachmentCount; ++i)
-        {
-            marshal_VkAttachmentReference(vkStream, rootType, (const VkAttachmentReference*)(forMarshaling->pInputAttachments + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->inputAttachmentCount; ++i) {
+            marshal_VkAttachmentReference(
+                vkStream, rootType,
+                (const VkAttachmentReference*)(forMarshaling->pInputAttachments + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->colorAttachmentCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->colorAttachmentCount; ++i)
-        {
-            marshal_VkAttachmentReference(vkStream, rootType, (const VkAttachmentReference*)(forMarshaling->pColorAttachments + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->colorAttachmentCount; ++i) {
+            marshal_VkAttachmentReference(
+                vkStream, rootType,
+                (const VkAttachmentReference*)(forMarshaling->pColorAttachments + i));
         }
     }
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pResolveAttachments;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pResolveAttachments)
-    {
-        if (forMarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forMarshaling->colorAttachmentCount; ++i)
-            {
-                marshal_VkAttachmentReference(vkStream, rootType, (const VkAttachmentReference*)(forMarshaling->pResolveAttachments + i));
+    if (forMarshaling->pResolveAttachments) {
+        if (forMarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forMarshaling->colorAttachmentCount; ++i) {
+                marshal_VkAttachmentReference(
+                    vkStream, rootType,
+                    (const VkAttachmentReference*)(forMarshaling->pResolveAttachments + i));
             }
         }
     }
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)forMarshaling->pDepthStencilAttachment;
     vkStream->putBe64(cgen_var_1);
-    if (forMarshaling->pDepthStencilAttachment)
-    {
-        marshal_VkAttachmentReference(vkStream, rootType, (const VkAttachmentReference*)(forMarshaling->pDepthStencilAttachment));
+    if (forMarshaling->pDepthStencilAttachment) {
+        marshal_VkAttachmentReference(
+            vkStream, rootType,
+            (const VkAttachmentReference*)(forMarshaling->pDepthStencilAttachment));
     }
     vkStream->write((uint32_t*)&forMarshaling->preserveAttachmentCount, sizeof(uint32_t));
-    vkStream->write((const uint32_t*)forMarshaling->pPreserveAttachments, forMarshaling->preserveAttachmentCount * sizeof(const uint32_t));
+    vkStream->write((const uint32_t*)forMarshaling->pPreserveAttachments,
+                    forMarshaling->preserveAttachmentCount * sizeof(const uint32_t));
 }
 
-void unmarshal_VkSubpassDescription(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubpassDescription* forUnmarshaling)
-{
+void unmarshal_VkSubpassDescription(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkSubpassDescription* forUnmarshaling) {
     (void)rootType;
-    vkStream->read((VkSubpassDescriptionFlags*)&forUnmarshaling->flags, sizeof(VkSubpassDescriptionFlags));
-    vkStream->read((VkPipelineBindPoint*)&forUnmarshaling->pipelineBindPoint, sizeof(VkPipelineBindPoint));
+    vkStream->read((VkSubpassDescriptionFlags*)&forUnmarshaling->flags,
+                   sizeof(VkSubpassDescriptionFlags));
+    vkStream->read((VkPipelineBindPoint*)&forUnmarshaling->pipelineBindPoint,
+                   sizeof(VkPipelineBindPoint));
     vkStream->read((uint32_t*)&forUnmarshaling->inputAttachmentCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pInputAttachments, forUnmarshaling->inputAttachmentCount * sizeof(const VkAttachmentReference));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->inputAttachmentCount; ++i)
-        {
-            unmarshal_VkAttachmentReference(vkStream, rootType, (VkAttachmentReference*)(forUnmarshaling->pInputAttachments + i));
+    vkStream->alloc((void**)&forUnmarshaling->pInputAttachments,
+                    forUnmarshaling->inputAttachmentCount * sizeof(const VkAttachmentReference));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->inputAttachmentCount; ++i) {
+            unmarshal_VkAttachmentReference(
+                vkStream, rootType,
+                (VkAttachmentReference*)(forUnmarshaling->pInputAttachments + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->colorAttachmentCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pColorAttachments, forUnmarshaling->colorAttachmentCount * sizeof(const VkAttachmentReference));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->colorAttachmentCount; ++i)
-        {
-            unmarshal_VkAttachmentReference(vkStream, rootType, (VkAttachmentReference*)(forUnmarshaling->pColorAttachments + i));
+    vkStream->alloc((void**)&forUnmarshaling->pColorAttachments,
+                    forUnmarshaling->colorAttachmentCount * sizeof(const VkAttachmentReference));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->colorAttachmentCount; ++i) {
+            unmarshal_VkAttachmentReference(
+                vkStream, rootType,
+                (VkAttachmentReference*)(forUnmarshaling->pColorAttachments + i));
         }
     }
     // WARNING PTR CHECK
-    forUnmarshaling->pResolveAttachments = (const VkAttachmentReference*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pResolveAttachments)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pResolveAttachments, forUnmarshaling->colorAttachmentCount * sizeof(const VkAttachmentReference));
-        if (forUnmarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->colorAttachmentCount; ++i)
-            {
-                unmarshal_VkAttachmentReference(vkStream, rootType, (VkAttachmentReference*)(forUnmarshaling->pResolveAttachments + i));
+    forUnmarshaling->pResolveAttachments =
+        (const VkAttachmentReference*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pResolveAttachments) {
+        vkStream->alloc(
+            (void**)&forUnmarshaling->pResolveAttachments,
+            forUnmarshaling->colorAttachmentCount * sizeof(const VkAttachmentReference));
+        if (forUnmarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->colorAttachmentCount; ++i) {
+                unmarshal_VkAttachmentReference(
+                    vkStream, rootType,
+                    (VkAttachmentReference*)(forUnmarshaling->pResolveAttachments + i));
             }
         }
     }
     // WARNING PTR CHECK
-    forUnmarshaling->pDepthStencilAttachment = (const VkAttachmentReference*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pDepthStencilAttachment)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pDepthStencilAttachment, sizeof(const VkAttachmentReference));
-        unmarshal_VkAttachmentReference(vkStream, rootType, (VkAttachmentReference*)(forUnmarshaling->pDepthStencilAttachment));
+    forUnmarshaling->pDepthStencilAttachment =
+        (const VkAttachmentReference*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pDepthStencilAttachment) {
+        vkStream->alloc((void**)&forUnmarshaling->pDepthStencilAttachment,
+                        sizeof(const VkAttachmentReference));
+        unmarshal_VkAttachmentReference(
+            vkStream, rootType, (VkAttachmentReference*)(forUnmarshaling->pDepthStencilAttachment));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->preserveAttachmentCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pPreserveAttachments, forUnmarshaling->preserveAttachmentCount * sizeof(const uint32_t));
-    vkStream->read((uint32_t*)forUnmarshaling->pPreserveAttachments, forUnmarshaling->preserveAttachmentCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pPreserveAttachments,
+                    forUnmarshaling->preserveAttachmentCount * sizeof(const uint32_t));
+    vkStream->read((uint32_t*)forUnmarshaling->pPreserveAttachments,
+                   forUnmarshaling->preserveAttachmentCount * sizeof(const uint32_t));
 }
 
-void marshal_VkSubpassDependency(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSubpassDependency* forMarshaling)
-{
+void marshal_VkSubpassDependency(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkSubpassDependency* forMarshaling) {
     (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->srcSubpass, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->dstSubpass, sizeof(uint32_t));
-    vkStream->write((VkPipelineStageFlags*)&forMarshaling->srcStageMask, sizeof(VkPipelineStageFlags));
-    vkStream->write((VkPipelineStageFlags*)&forMarshaling->dstStageMask, sizeof(VkPipelineStageFlags));
+    vkStream->write((VkPipelineStageFlags*)&forMarshaling->srcStageMask,
+                    sizeof(VkPipelineStageFlags));
+    vkStream->write((VkPipelineStageFlags*)&forMarshaling->dstStageMask,
+                    sizeof(VkPipelineStageFlags));
     vkStream->write((VkAccessFlags*)&forMarshaling->srcAccessMask, sizeof(VkAccessFlags));
     vkStream->write((VkAccessFlags*)&forMarshaling->dstAccessMask, sizeof(VkAccessFlags));
     vkStream->write((VkDependencyFlags*)&forMarshaling->dependencyFlags, sizeof(VkDependencyFlags));
 }
 
-void unmarshal_VkSubpassDependency(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubpassDependency* forUnmarshaling)
-{
+void unmarshal_VkSubpassDependency(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkSubpassDependency* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->srcSubpass, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->dstSubpass, sizeof(uint32_t));
-    vkStream->read((VkPipelineStageFlags*)&forUnmarshaling->srcStageMask, sizeof(VkPipelineStageFlags));
-    vkStream->read((VkPipelineStageFlags*)&forUnmarshaling->dstStageMask, sizeof(VkPipelineStageFlags));
+    vkStream->read((VkPipelineStageFlags*)&forUnmarshaling->srcStageMask,
+                   sizeof(VkPipelineStageFlags));
+    vkStream->read((VkPipelineStageFlags*)&forUnmarshaling->dstStageMask,
+                   sizeof(VkPipelineStageFlags));
     vkStream->read((VkAccessFlags*)&forUnmarshaling->srcAccessMask, sizeof(VkAccessFlags));
     vkStream->read((VkAccessFlags*)&forUnmarshaling->dstAccessMask, sizeof(VkAccessFlags));
-    vkStream->read((VkDependencyFlags*)&forUnmarshaling->dependencyFlags, sizeof(VkDependencyFlags));
+    vkStream->read((VkDependencyFlags*)&forUnmarshaling->dependencyFlags,
+                   sizeof(VkDependencyFlags));
 }
 
-void marshal_VkRenderPassCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkRenderPassCreateInfo* forMarshaling)
-{
+void marshal_VkRenderPassCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                    const VkRenderPassCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkRenderPassCreateFlags*)&forMarshaling->flags, sizeof(VkRenderPassCreateFlags));
+    vkStream->write((VkRenderPassCreateFlags*)&forMarshaling->flags,
+                    sizeof(VkRenderPassCreateFlags));
     vkStream->write((uint32_t*)&forMarshaling->attachmentCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->attachmentCount; ++i)
-        {
-            marshal_VkAttachmentDescription(vkStream, rootType, (const VkAttachmentDescription*)(forMarshaling->pAttachments + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->attachmentCount; ++i) {
+            marshal_VkAttachmentDescription(
+                vkStream, rootType,
+                (const VkAttachmentDescription*)(forMarshaling->pAttachments + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->subpassCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->subpassCount; ++i)
-        {
-            marshal_VkSubpassDescription(vkStream, rootType, (const VkSubpassDescription*)(forMarshaling->pSubpasses + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->subpassCount; ++i) {
+            marshal_VkSubpassDescription(
+                vkStream, rootType, (const VkSubpassDescription*)(forMarshaling->pSubpasses + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->dependencyCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->dependencyCount; ++i)
-        {
-            marshal_VkSubpassDependency(vkStream, rootType, (const VkSubpassDependency*)(forMarshaling->pDependencies + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->dependencyCount; ++i) {
+            marshal_VkSubpassDependency(
+                vkStream, rootType, (const VkSubpassDependency*)(forMarshaling->pDependencies + i));
         }
     }
 }
 
-void unmarshal_VkRenderPassCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderPassCreateInfo* forUnmarshaling)
-{
+void unmarshal_VkRenderPassCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                      VkRenderPassCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkRenderPassCreateFlags*)&forUnmarshaling->flags, sizeof(VkRenderPassCreateFlags));
+    vkStream->read((VkRenderPassCreateFlags*)&forUnmarshaling->flags,
+                   sizeof(VkRenderPassCreateFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->attachmentCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pAttachments, forUnmarshaling->attachmentCount * sizeof(const VkAttachmentDescription));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->attachmentCount; ++i)
-        {
-            unmarshal_VkAttachmentDescription(vkStream, rootType, (VkAttachmentDescription*)(forUnmarshaling->pAttachments + i));
+    vkStream->alloc((void**)&forUnmarshaling->pAttachments,
+                    forUnmarshaling->attachmentCount * sizeof(const VkAttachmentDescription));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->attachmentCount; ++i) {
+            unmarshal_VkAttachmentDescription(
+                vkStream, rootType, (VkAttachmentDescription*)(forUnmarshaling->pAttachments + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->subpassCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pSubpasses, forUnmarshaling->subpassCount * sizeof(const VkSubpassDescription));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->subpassCount; ++i)
-        {
-            unmarshal_VkSubpassDescription(vkStream, rootType, (VkSubpassDescription*)(forUnmarshaling->pSubpasses + i));
+    vkStream->alloc((void**)&forUnmarshaling->pSubpasses,
+                    forUnmarshaling->subpassCount * sizeof(const VkSubpassDescription));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->subpassCount; ++i) {
+            unmarshal_VkSubpassDescription(
+                vkStream, rootType, (VkSubpassDescription*)(forUnmarshaling->pSubpasses + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->dependencyCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pDependencies, forUnmarshaling->dependencyCount * sizeof(const VkSubpassDependency));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->dependencyCount; ++i)
-        {
-            unmarshal_VkSubpassDependency(vkStream, rootType, (VkSubpassDependency*)(forUnmarshaling->pDependencies + i));
+    vkStream->alloc((void**)&forUnmarshaling->pDependencies,
+                    forUnmarshaling->dependencyCount * sizeof(const VkSubpassDependency));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->dependencyCount; ++i) {
+            unmarshal_VkSubpassDependency(
+                vkStream, rootType, (VkSubpassDependency*)(forUnmarshaling->pDependencies + i));
         }
     }
 }
 
-void marshal_VkCommandPoolCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCommandPoolCreateInfo* forMarshaling)
-{
+void marshal_VkCommandPoolCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkCommandPoolCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkCommandPoolCreateFlags*)&forMarshaling->flags, sizeof(VkCommandPoolCreateFlags));
+    vkStream->write((VkCommandPoolCreateFlags*)&forMarshaling->flags,
+                    sizeof(VkCommandPoolCreateFlags));
     vkStream->write((uint32_t*)&forMarshaling->queueFamilyIndex, sizeof(uint32_t));
 }
 
-void unmarshal_VkCommandPoolCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCommandPoolCreateInfo* forUnmarshaling)
-{
+void unmarshal_VkCommandPoolCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkCommandPoolCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkCommandPoolCreateFlags*)&forUnmarshaling->flags, sizeof(VkCommandPoolCreateFlags));
+    vkStream->read((VkCommandPoolCreateFlags*)&forUnmarshaling->flags,
+                   sizeof(VkCommandPoolCreateFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->queueFamilyIndex, sizeof(uint32_t));
 }
 
-void marshal_VkCommandBufferAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCommandBufferAllocateInfo* forMarshaling)
-{
+void marshal_VkCommandBufferAllocateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkCommandBufferAllocateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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_VkCommandPool_u64(&forMarshaling->commandPool, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkCommandPool_u64(&forMarshaling->commandPool,
+                                                            &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->write((VkCommandBufferLevel*)&forMarshaling->level, sizeof(VkCommandBufferLevel));
     vkStream->write((uint32_t*)&forMarshaling->commandBufferCount, sizeof(uint32_t));
 }
 
-void unmarshal_VkCommandBufferAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCommandBufferAllocateInfo* forUnmarshaling)
-{
+void unmarshal_VkCommandBufferAllocateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkCommandBufferAllocateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkCommandPool(&cgen_var_0, (VkCommandPool*)&forUnmarshaling->commandPool, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkCommandPool(
+        &cgen_var_0, (VkCommandPool*)&forUnmarshaling->commandPool, 1);
     vkStream->read((VkCommandBufferLevel*)&forUnmarshaling->level, sizeof(VkCommandBufferLevel));
     vkStream->read((uint32_t*)&forUnmarshaling->commandBufferCount, sizeof(uint32_t));
 }
 
-void marshal_VkCommandBufferInheritanceInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCommandBufferInheritanceInfo* forMarshaling)
-{
+void marshal_VkCommandBufferInheritanceInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                            const VkCommandBufferInheritanceInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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_VkRenderPass_u64(&forMarshaling->renderPass, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkRenderPass_u64(&forMarshaling->renderPass, &cgen_var_0,
+                                                           1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->write((uint32_t*)&forMarshaling->subpass, sizeof(uint32_t));
     uint64_t cgen_var_1;
-    vkStream->handleMapping()->mapHandles_VkFramebuffer_u64(&forMarshaling->framebuffer, &cgen_var_1, 1);
+    vkStream->handleMapping()->mapHandles_VkFramebuffer_u64(&forMarshaling->framebuffer,
+                                                            &cgen_var_1, 1);
     vkStream->write((uint64_t*)&cgen_var_1, 1 * 8);
     vkStream->write((VkBool32*)&forMarshaling->occlusionQueryEnable, sizeof(VkBool32));
     vkStream->write((VkQueryControlFlags*)&forMarshaling->queryFlags, sizeof(VkQueryControlFlags));
-    vkStream->write((VkQueryPipelineStatisticFlags*)&forMarshaling->pipelineStatistics, sizeof(VkQueryPipelineStatisticFlags));
+    vkStream->write((VkQueryPipelineStatisticFlags*)&forMarshaling->pipelineStatistics,
+                    sizeof(VkQueryPipelineStatisticFlags));
 }
 
-void unmarshal_VkCommandBufferInheritanceInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCommandBufferInheritanceInfo* forUnmarshaling)
-{
+void unmarshal_VkCommandBufferInheritanceInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkCommandBufferInheritanceInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkRenderPass(&cgen_var_0, (VkRenderPass*)&forUnmarshaling->renderPass, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkRenderPass(
+        &cgen_var_0, (VkRenderPass*)&forUnmarshaling->renderPass, 1);
     vkStream->read((uint32_t*)&forUnmarshaling->subpass, sizeof(uint32_t));
     uint64_t cgen_var_1;
     vkStream->read((uint64_t*)&cgen_var_1, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkFramebuffer(&cgen_var_1, (VkFramebuffer*)&forUnmarshaling->framebuffer, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkFramebuffer(
+        &cgen_var_1, (VkFramebuffer*)&forUnmarshaling->framebuffer, 1);
     vkStream->read((VkBool32*)&forUnmarshaling->occlusionQueryEnable, sizeof(VkBool32));
     vkStream->read((VkQueryControlFlags*)&forUnmarshaling->queryFlags, sizeof(VkQueryControlFlags));
-    vkStream->read((VkQueryPipelineStatisticFlags*)&forUnmarshaling->pipelineStatistics, sizeof(VkQueryPipelineStatisticFlags));
+    vkStream->read((VkQueryPipelineStatisticFlags*)&forUnmarshaling->pipelineStatistics,
+                   sizeof(VkQueryPipelineStatisticFlags));
 }
 
-void marshal_VkCommandBufferBeginInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCommandBufferBeginInfo* forMarshaling)
-{
+void marshal_VkCommandBufferBeginInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkCommandBufferBeginInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkCommandBufferUsageFlags*)&forMarshaling->flags, sizeof(VkCommandBufferUsageFlags));
+    vkStream->write((VkCommandBufferUsageFlags*)&forMarshaling->flags,
+                    sizeof(VkCommandBufferUsageFlags));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pInheritanceInfo;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pInheritanceInfo)
-    {
-        marshal_VkCommandBufferInheritanceInfo(vkStream, rootType, (const VkCommandBufferInheritanceInfo*)(forMarshaling->pInheritanceInfo));
+    if (forMarshaling->pInheritanceInfo) {
+        marshal_VkCommandBufferInheritanceInfo(
+            vkStream, rootType,
+            (const VkCommandBufferInheritanceInfo*)(forMarshaling->pInheritanceInfo));
     }
 }
 
-void unmarshal_VkCommandBufferBeginInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCommandBufferBeginInfo* forUnmarshaling)
-{
+void unmarshal_VkCommandBufferBeginInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkCommandBufferBeginInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkCommandBufferUsageFlags*)&forUnmarshaling->flags, sizeof(VkCommandBufferUsageFlags));
+    vkStream->read((VkCommandBufferUsageFlags*)&forUnmarshaling->flags,
+                   sizeof(VkCommandBufferUsageFlags));
     // WARNING PTR CHECK
-    forUnmarshaling->pInheritanceInfo = (const VkCommandBufferInheritanceInfo*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pInheritanceInfo)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pInheritanceInfo, sizeof(const VkCommandBufferInheritanceInfo));
-        unmarshal_VkCommandBufferInheritanceInfo(vkStream, rootType, (VkCommandBufferInheritanceInfo*)(forUnmarshaling->pInheritanceInfo));
+    forUnmarshaling->pInheritanceInfo =
+        (const VkCommandBufferInheritanceInfo*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pInheritanceInfo) {
+        vkStream->alloc((void**)&forUnmarshaling->pInheritanceInfo,
+                        sizeof(const VkCommandBufferInheritanceInfo));
+        unmarshal_VkCommandBufferInheritanceInfo(
+            vkStream, rootType,
+            (VkCommandBufferInheritanceInfo*)(forUnmarshaling->pInheritanceInfo));
     }
 }
 
-void marshal_VkBufferCopy(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBufferCopy* forMarshaling)
-{
+void marshal_VkBufferCopy(VulkanStream* vkStream, VkStructureType rootType,
+                          const VkBufferCopy* forMarshaling) {
     (void)rootType;
     vkStream->write((VkDeviceSize*)&forMarshaling->srcOffset, sizeof(VkDeviceSize));
     vkStream->write((VkDeviceSize*)&forMarshaling->dstOffset, sizeof(VkDeviceSize));
     vkStream->write((VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
 }
 
-void unmarshal_VkBufferCopy(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferCopy* forUnmarshaling)
-{
+void unmarshal_VkBufferCopy(VulkanStream* vkStream, VkStructureType rootType,
+                            VkBufferCopy* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkDeviceSize*)&forUnmarshaling->srcOffset, sizeof(VkDeviceSize));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->dstOffset, sizeof(VkDeviceSize));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->size, sizeof(VkDeviceSize));
 }
 
-void marshal_VkImageSubresourceLayers(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageSubresourceLayers* forMarshaling)
-{
+void marshal_VkImageSubresourceLayers(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkImageSubresourceLayers* forMarshaling) {
     (void)rootType;
     vkStream->write((VkImageAspectFlags*)&forMarshaling->aspectMask, sizeof(VkImageAspectFlags));
     vkStream->write((uint32_t*)&forMarshaling->mipLevel, sizeof(uint32_t));
@@ -5057,11 +4745,8 @@
     vkStream->write((uint32_t*)&forMarshaling->layerCount, sizeof(uint32_t));
 }
 
-void unmarshal_VkImageSubresourceLayers(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageSubresourceLayers* forUnmarshaling)
-{
+void unmarshal_VkImageSubresourceLayers(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkImageSubresourceLayers* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkImageAspectFlags*)&forUnmarshaling->aspectMask, sizeof(VkImageAspectFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->mipLevel, sizeof(uint32_t));
@@ -5069,298 +4754,248 @@
     vkStream->read((uint32_t*)&forUnmarshaling->layerCount, sizeof(uint32_t));
 }
 
-void marshal_VkBufferImageCopy(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBufferImageCopy* forMarshaling)
-{
+void marshal_VkBufferImageCopy(VulkanStream* vkStream, VkStructureType rootType,
+                               const VkBufferImageCopy* forMarshaling) {
     (void)rootType;
     vkStream->write((VkDeviceSize*)&forMarshaling->bufferOffset, sizeof(VkDeviceSize));
     vkStream->write((uint32_t*)&forMarshaling->bufferRowLength, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->bufferImageHeight, sizeof(uint32_t));
-    marshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->imageSubresource));
+    marshal_VkImageSubresourceLayers(vkStream, rootType,
+                                     (VkImageSubresourceLayers*)(&forMarshaling->imageSubresource));
     marshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forMarshaling->imageOffset));
     marshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forMarshaling->imageExtent));
 }
 
-void unmarshal_VkBufferImageCopy(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferImageCopy* forUnmarshaling)
-{
+void unmarshal_VkBufferImageCopy(VulkanStream* vkStream, VkStructureType rootType,
+                                 VkBufferImageCopy* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkDeviceSize*)&forUnmarshaling->bufferOffset, sizeof(VkDeviceSize));
     vkStream->read((uint32_t*)&forUnmarshaling->bufferRowLength, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->bufferImageHeight, sizeof(uint32_t));
-    unmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->imageSubresource));
+    unmarshal_VkImageSubresourceLayers(
+        vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->imageSubresource));
     unmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->imageOffset));
     unmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forUnmarshaling->imageExtent));
 }
 
-void marshal_VkClearColorValue(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkClearColorValue* forMarshaling)
-{
+void marshal_VkClearColorValue(VulkanStream* vkStream, VkStructureType rootType,
+                               const VkClearColorValue* forMarshaling) {
     (void)rootType;
     vkStream->write((float*)forMarshaling->float32, 4 * sizeof(float));
 }
 
-void unmarshal_VkClearColorValue(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkClearColorValue* forUnmarshaling)
-{
+void unmarshal_VkClearColorValue(VulkanStream* vkStream, VkStructureType rootType,
+                                 VkClearColorValue* forUnmarshaling) {
     (void)rootType;
     vkStream->read((float*)forUnmarshaling->float32, 4 * sizeof(float));
 }
 
-void marshal_VkClearDepthStencilValue(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkClearDepthStencilValue* forMarshaling)
-{
+void marshal_VkClearDepthStencilValue(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkClearDepthStencilValue* forMarshaling) {
     (void)rootType;
     vkStream->write((float*)&forMarshaling->depth, sizeof(float));
     vkStream->write((uint32_t*)&forMarshaling->stencil, sizeof(uint32_t));
 }
 
-void unmarshal_VkClearDepthStencilValue(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkClearDepthStencilValue* forUnmarshaling)
-{
+void unmarshal_VkClearDepthStencilValue(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkClearDepthStencilValue* forUnmarshaling) {
     (void)rootType;
     vkStream->read((float*)&forUnmarshaling->depth, sizeof(float));
     vkStream->read((uint32_t*)&forUnmarshaling->stencil, sizeof(uint32_t));
 }
 
-void marshal_VkClearValue(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkClearValue* forMarshaling)
-{
+void marshal_VkClearValue(VulkanStream* vkStream, VkStructureType rootType,
+                          const VkClearValue* forMarshaling) {
     (void)rootType;
     marshal_VkClearColorValue(vkStream, rootType, (VkClearColorValue*)(&forMarshaling->color));
 }
 
-void unmarshal_VkClearValue(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkClearValue* forUnmarshaling)
-{
+void unmarshal_VkClearValue(VulkanStream* vkStream, VkStructureType rootType,
+                            VkClearValue* forUnmarshaling) {
     (void)rootType;
     unmarshal_VkClearColorValue(vkStream, rootType, (VkClearColorValue*)(&forUnmarshaling->color));
 }
 
-void marshal_VkClearAttachment(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkClearAttachment* forMarshaling)
-{
+void marshal_VkClearAttachment(VulkanStream* vkStream, VkStructureType rootType,
+                               const VkClearAttachment* forMarshaling) {
     (void)rootType;
     vkStream->write((VkImageAspectFlags*)&forMarshaling->aspectMask, sizeof(VkImageAspectFlags));
     vkStream->write((uint32_t*)&forMarshaling->colorAttachment, sizeof(uint32_t));
     marshal_VkClearValue(vkStream, rootType, (VkClearValue*)(&forMarshaling->clearValue));
 }
 
-void unmarshal_VkClearAttachment(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkClearAttachment* forUnmarshaling)
-{
+void unmarshal_VkClearAttachment(VulkanStream* vkStream, VkStructureType rootType,
+                                 VkClearAttachment* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkImageAspectFlags*)&forUnmarshaling->aspectMask, sizeof(VkImageAspectFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->colorAttachment, sizeof(uint32_t));
     unmarshal_VkClearValue(vkStream, rootType, (VkClearValue*)(&forUnmarshaling->clearValue));
 }
 
-void marshal_VkClearRect(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkClearRect* forMarshaling)
-{
+void marshal_VkClearRect(VulkanStream* vkStream, VkStructureType rootType,
+                         const VkClearRect* forMarshaling) {
     (void)rootType;
     marshal_VkRect2D(vkStream, rootType, (VkRect2D*)(&forMarshaling->rect));
     vkStream->write((uint32_t*)&forMarshaling->baseArrayLayer, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->layerCount, sizeof(uint32_t));
 }
 
-void unmarshal_VkClearRect(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkClearRect* forUnmarshaling)
-{
+void unmarshal_VkClearRect(VulkanStream* vkStream, VkStructureType rootType,
+                           VkClearRect* forUnmarshaling) {
     (void)rootType;
     unmarshal_VkRect2D(vkStream, rootType, (VkRect2D*)(&forUnmarshaling->rect));
     vkStream->read((uint32_t*)&forUnmarshaling->baseArrayLayer, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->layerCount, sizeof(uint32_t));
 }
 
-void marshal_VkImageBlit(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageBlit* forMarshaling)
-{
+void marshal_VkImageBlit(VulkanStream* vkStream, VkStructureType rootType,
+                         const VkImageBlit* forMarshaling) {
     (void)rootType;
-    marshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->srcSubresource));
-    for (uint32_t i = 0; i < (uint32_t)2; ++i)
-    {
+    marshal_VkImageSubresourceLayers(vkStream, rootType,
+                                     (VkImageSubresourceLayers*)(&forMarshaling->srcSubresource));
+    for (uint32_t i = 0; i < (uint32_t)2; ++i) {
         marshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(forMarshaling->srcOffsets + i));
     }
-    marshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource));
-    for (uint32_t i = 0; i < (uint32_t)2; ++i)
-    {
+    marshal_VkImageSubresourceLayers(vkStream, rootType,
+                                     (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource));
+    for (uint32_t i = 0; i < (uint32_t)2; ++i) {
         marshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(forMarshaling->dstOffsets + i));
     }
 }
 
-void unmarshal_VkImageBlit(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageBlit* forUnmarshaling)
-{
+void unmarshal_VkImageBlit(VulkanStream* vkStream, VkStructureType rootType,
+                           VkImageBlit* forUnmarshaling) {
     (void)rootType;
-    unmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->srcSubresource));
-    for (uint32_t i = 0; i < (uint32_t)2; ++i)
-    {
+    unmarshal_VkImageSubresourceLayers(
+        vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->srcSubresource));
+    for (uint32_t i = 0; i < (uint32_t)2; ++i) {
         unmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(forUnmarshaling->srcOffsets + i));
     }
-    unmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->dstSubresource));
-    for (uint32_t i = 0; i < (uint32_t)2; ++i)
-    {
+    unmarshal_VkImageSubresourceLayers(
+        vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->dstSubresource));
+    for (uint32_t i = 0; i < (uint32_t)2; ++i) {
         unmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(forUnmarshaling->dstOffsets + i));
     }
 }
 
-void marshal_VkImageCopy(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageCopy* forMarshaling)
-{
+void marshal_VkImageCopy(VulkanStream* vkStream, VkStructureType rootType,
+                         const VkImageCopy* forMarshaling) {
     (void)rootType;
-    marshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->srcSubresource));
+    marshal_VkImageSubresourceLayers(vkStream, rootType,
+                                     (VkImageSubresourceLayers*)(&forMarshaling->srcSubresource));
     marshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forMarshaling->srcOffset));
-    marshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource));
+    marshal_VkImageSubresourceLayers(vkStream, rootType,
+                                     (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource));
     marshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forMarshaling->dstOffset));
     marshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forMarshaling->extent));
 }
 
-void unmarshal_VkImageCopy(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageCopy* forUnmarshaling)
-{
+void unmarshal_VkImageCopy(VulkanStream* vkStream, VkStructureType rootType,
+                           VkImageCopy* forUnmarshaling) {
     (void)rootType;
-    unmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->srcSubresource));
+    unmarshal_VkImageSubresourceLayers(
+        vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->srcSubresource));
     unmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->srcOffset));
-    unmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->dstSubresource));
+    unmarshal_VkImageSubresourceLayers(
+        vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->dstSubresource));
     unmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->dstOffset));
     unmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forUnmarshaling->extent));
 }
 
-void marshal_VkImageResolve(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageResolve* forMarshaling)
-{
+void marshal_VkImageResolve(VulkanStream* vkStream, VkStructureType rootType,
+                            const VkImageResolve* forMarshaling) {
     (void)rootType;
-    marshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->srcSubresource));
+    marshal_VkImageSubresourceLayers(vkStream, rootType,
+                                     (VkImageSubresourceLayers*)(&forMarshaling->srcSubresource));
     marshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forMarshaling->srcOffset));
-    marshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource));
+    marshal_VkImageSubresourceLayers(vkStream, rootType,
+                                     (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource));
     marshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forMarshaling->dstOffset));
     marshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forMarshaling->extent));
 }
 
-void unmarshal_VkImageResolve(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageResolve* forUnmarshaling)
-{
+void unmarshal_VkImageResolve(VulkanStream* vkStream, VkStructureType rootType,
+                              VkImageResolve* forUnmarshaling) {
     (void)rootType;
-    unmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->srcSubresource));
+    unmarshal_VkImageSubresourceLayers(
+        vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->srcSubresource));
     unmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->srcOffset));
-    unmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->dstSubresource));
+    unmarshal_VkImageSubresourceLayers(
+        vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->dstSubresource));
     unmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->dstOffset));
     unmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forUnmarshaling->extent));
 }
 
-void marshal_VkRenderPassBeginInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkRenderPassBeginInfo* forMarshaling)
-{
+void marshal_VkRenderPassBeginInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkRenderPassBeginInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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_VkRenderPass_u64(&forMarshaling->renderPass, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkRenderPass_u64(&forMarshaling->renderPass, &cgen_var_0,
+                                                           1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     uint64_t cgen_var_1;
-    vkStream->handleMapping()->mapHandles_VkFramebuffer_u64(&forMarshaling->framebuffer, &cgen_var_1, 1);
+    vkStream->handleMapping()->mapHandles_VkFramebuffer_u64(&forMarshaling->framebuffer,
+                                                            &cgen_var_1, 1);
     vkStream->write((uint64_t*)&cgen_var_1, 1 * 8);
     marshal_VkRect2D(vkStream, rootType, (VkRect2D*)(&forMarshaling->renderArea));
     vkStream->write((uint32_t*)&forMarshaling->clearValueCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)forMarshaling->pClearValues;
     vkStream->putBe64(cgen_var_2);
-    if (forMarshaling->pClearValues)
-    {
-        if (forMarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forMarshaling->clearValueCount; ++i)
-            {
-                marshal_VkClearValue(vkStream, rootType, (const VkClearValue*)(forMarshaling->pClearValues + i));
+    if (forMarshaling->pClearValues) {
+        if (forMarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forMarshaling->clearValueCount; ++i) {
+                marshal_VkClearValue(vkStream, rootType,
+                                     (const VkClearValue*)(forMarshaling->pClearValues + i));
             }
         }
     }
 }
 
-void unmarshal_VkRenderPassBeginInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderPassBeginInfo* forUnmarshaling)
-{
+void unmarshal_VkRenderPassBeginInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkRenderPassBeginInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkRenderPass(&cgen_var_0, (VkRenderPass*)&forUnmarshaling->renderPass, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkRenderPass(
+        &cgen_var_0, (VkRenderPass*)&forUnmarshaling->renderPass, 1);
     uint64_t cgen_var_1;
     vkStream->read((uint64_t*)&cgen_var_1, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkFramebuffer(&cgen_var_1, (VkFramebuffer*)&forUnmarshaling->framebuffer, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkFramebuffer(
+        &cgen_var_1, (VkFramebuffer*)&forUnmarshaling->framebuffer, 1);
     unmarshal_VkRect2D(vkStream, rootType, (VkRect2D*)(&forUnmarshaling->renderArea));
     vkStream->read((uint32_t*)&forUnmarshaling->clearValueCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     forUnmarshaling->pClearValues = (const VkClearValue*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pClearValues)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pClearValues, forUnmarshaling->clearValueCount * sizeof(const VkClearValue));
-        if (forUnmarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->clearValueCount; ++i)
-            {
-                unmarshal_VkClearValue(vkStream, rootType, (VkClearValue*)(forUnmarshaling->pClearValues + i));
+    if (forUnmarshaling->pClearValues) {
+        vkStream->alloc((void**)&forUnmarshaling->pClearValues,
+                        forUnmarshaling->clearValueCount * sizeof(const VkClearValue));
+        if (forUnmarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->clearValueCount; ++i) {
+                unmarshal_VkClearValue(vkStream, rootType,
+                                       (VkClearValue*)(forUnmarshaling->pClearValues + i));
             }
         }
     }
@@ -5369,61 +5004,56 @@
 #endif
 #ifdef VK_VERSION_1_1
 void marshal_VkPhysicalDeviceSubgroupProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceSubgroupProperties* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceSubgroupProperties* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->subgroupSize, sizeof(uint32_t));
-    vkStream->write((VkShaderStageFlags*)&forMarshaling->supportedStages, sizeof(VkShaderStageFlags));
-    vkStream->write((VkSubgroupFeatureFlags*)&forMarshaling->supportedOperations, sizeof(VkSubgroupFeatureFlags));
+    vkStream->write((VkShaderStageFlags*)&forMarshaling->supportedStages,
+                    sizeof(VkShaderStageFlags));
+    vkStream->write((VkSubgroupFeatureFlags*)&forMarshaling->supportedOperations,
+                    sizeof(VkSubgroupFeatureFlags));
     vkStream->write((VkBool32*)&forMarshaling->quadOperationsInAllStages, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceSubgroupProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSubgroupProperties* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceSubgroupProperties* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->subgroupSize, sizeof(uint32_t));
-    vkStream->read((VkShaderStageFlags*)&forUnmarshaling->supportedStages, sizeof(VkShaderStageFlags));
-    vkStream->read((VkSubgroupFeatureFlags*)&forUnmarshaling->supportedOperations, sizeof(VkSubgroupFeatureFlags));
+    vkStream->read((VkShaderStageFlags*)&forUnmarshaling->supportedStages,
+                   sizeof(VkShaderStageFlags));
+    vkStream->read((VkSubgroupFeatureFlags*)&forUnmarshaling->supportedOperations,
+                   sizeof(VkSubgroupFeatureFlags));
     vkStream->read((VkBool32*)&forUnmarshaling->quadOperationsInAllStages, sizeof(VkBool32));
 }
 
-void marshal_VkBindBufferMemoryInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBindBufferMemoryInfo* forMarshaling)
-{
+void marshal_VkBindBufferMemoryInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                    const VkBindBufferMemoryInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -5431,52 +5061,48 @@
     vkStream->handleMapping()->mapHandles_VkBuffer_u64(&forMarshaling->buffer, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     uint64_t cgen_var_1;
-    vkStream->handleMapping()->mapHandles_VkDeviceMemory_u64(&forMarshaling->memory, &cgen_var_1, 1);
+    vkStream->handleMapping()->mapHandles_VkDeviceMemory_u64(&forMarshaling->memory, &cgen_var_1,
+                                                             1);
     vkStream->write((uint64_t*)&cgen_var_1, 1 * 8);
     vkStream->write((VkDeviceSize*)&forMarshaling->memoryOffset, sizeof(VkDeviceSize));
 }
 
-void unmarshal_VkBindBufferMemoryInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindBufferMemoryInfo* forUnmarshaling)
-{
+void unmarshal_VkBindBufferMemoryInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                      VkBindBufferMemoryInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkBuffer(&cgen_var_0, (VkBuffer*)&forUnmarshaling->buffer, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_0,
+                                                       (VkBuffer*)&forUnmarshaling->buffer, 1);
     uint64_t cgen_var_1;
     vkStream->read((uint64_t*)&cgen_var_1, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkDeviceMemory(&cgen_var_1, (VkDeviceMemory*)&forUnmarshaling->memory, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkDeviceMemory(
+        &cgen_var_1, (VkDeviceMemory*)&forUnmarshaling->memory, 1);
     vkStream->read((VkDeviceSize*)&forUnmarshaling->memoryOffset, sizeof(VkDeviceSize));
 }
 
-void marshal_VkBindImageMemoryInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBindImageMemoryInfo* forMarshaling)
-{
+void marshal_VkBindImageMemoryInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkBindImageMemoryInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -5484,99 +5110,92 @@
     vkStream->handleMapping()->mapHandles_VkImage_u64(&forMarshaling->image, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     uint64_t cgen_var_1;
-    vkStream->handleMapping()->mapHandles_VkDeviceMemory_u64(&forMarshaling->memory, &cgen_var_1, 1);
+    vkStream->handleMapping()->mapHandles_VkDeviceMemory_u64(&forMarshaling->memory, &cgen_var_1,
+                                                             1);
     vkStream->write((uint64_t*)&cgen_var_1, 1 * 8);
     vkStream->write((VkDeviceSize*)&forMarshaling->memoryOffset, sizeof(VkDeviceSize));
 }
 
-void unmarshal_VkBindImageMemoryInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindImageMemoryInfo* forUnmarshaling)
-{
+void unmarshal_VkBindImageMemoryInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkBindImageMemoryInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkImage(&cgen_var_0, (VkImage*)&forUnmarshaling->image, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_0,
+                                                      (VkImage*)&forUnmarshaling->image, 1);
     uint64_t cgen_var_1;
     vkStream->read((uint64_t*)&cgen_var_1, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkDeviceMemory(&cgen_var_1, (VkDeviceMemory*)&forUnmarshaling->memory, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkDeviceMemory(
+        &cgen_var_1, (VkDeviceMemory*)&forUnmarshaling->memory, 1);
     vkStream->read((VkDeviceSize*)&forUnmarshaling->memoryOffset, sizeof(VkDeviceSize));
 }
 
 void marshal_VkPhysicalDevice16BitStorageFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDevice16BitStorageFeatures* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDevice16BitStorageFeatures* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->storageBuffer16BitAccess, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->uniformAndStorageBuffer16BitAccess, sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->uniformAndStorageBuffer16BitAccess,
+                    sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->storagePushConstant16, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->storageInputOutput16, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDevice16BitStorageFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevice16BitStorageFeatures* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevice16BitStorageFeatures* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkBool32*)&forUnmarshaling->storageBuffer16BitAccess, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->uniformAndStorageBuffer16BitAccess, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->uniformAndStorageBuffer16BitAccess,
+                   sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->storagePushConstant16, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->storageInputOutput16, sizeof(VkBool32));
 }
 
-void marshal_VkMemoryDedicatedRequirements(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMemoryDedicatedRequirements* forMarshaling)
-{
+void marshal_VkMemoryDedicatedRequirements(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkMemoryDedicatedRequirements* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -5584,26 +5203,23 @@
     vkStream->write((VkBool32*)&forMarshaling->requiresDedicatedAllocation, sizeof(VkBool32));
 }
 
-void unmarshal_VkMemoryDedicatedRequirements(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryDedicatedRequirements* forUnmarshaling)
-{
+void unmarshal_VkMemoryDedicatedRequirements(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkMemoryDedicatedRequirements* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -5611,15 +5227,11 @@
     vkStream->read((VkBool32*)&forUnmarshaling->requiresDedicatedAllocation, sizeof(VkBool32));
 }
 
-void marshal_VkMemoryDedicatedAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMemoryDedicatedAllocateInfo* forMarshaling)
-{
+void marshal_VkMemoryDedicatedAllocateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkMemoryDedicatedAllocateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -5631,46 +5243,41 @@
     vkStream->write((uint64_t*)&cgen_var_1, 1 * 8);
 }
 
-void unmarshal_VkMemoryDedicatedAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryDedicatedAllocateInfo* forUnmarshaling)
-{
+void unmarshal_VkMemoryDedicatedAllocateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkMemoryDedicatedAllocateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkImage(&cgen_var_0, (VkImage*)&forUnmarshaling->image, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_0,
+                                                      (VkImage*)&forUnmarshaling->image, 1);
     uint64_t cgen_var_1;
     vkStream->read((uint64_t*)&cgen_var_1, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_1, (VkBuffer*)&forUnmarshaling->buffer, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_1,
+                                                       (VkBuffer*)&forUnmarshaling->buffer, 1);
 }
 
-void marshal_VkMemoryAllocateFlagsInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMemoryAllocateFlagsInfo* forMarshaling)
-{
+void marshal_VkMemoryAllocateFlagsInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkMemoryAllocateFlagsInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -5678,26 +5285,23 @@
     vkStream->write((uint32_t*)&forMarshaling->deviceMask, sizeof(uint32_t));
 }
 
-void unmarshal_VkMemoryAllocateFlagsInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryAllocateFlagsInfo* forUnmarshaling)
-{
+void unmarshal_VkMemoryAllocateFlagsInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkMemoryAllocateFlagsInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -5706,72 +5310,62 @@
 }
 
 void marshal_VkDeviceGroupRenderPassBeginInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDeviceGroupRenderPassBeginInfo* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkDeviceGroupRenderPassBeginInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->deviceMask, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->deviceRenderAreaCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->deviceRenderAreaCount; ++i)
-        {
-            marshal_VkRect2D(vkStream, rootType, (const VkRect2D*)(forMarshaling->pDeviceRenderAreas + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->deviceRenderAreaCount; ++i) {
+            marshal_VkRect2D(vkStream, rootType,
+                             (const VkRect2D*)(forMarshaling->pDeviceRenderAreas + i));
         }
     }
 }
 
-void unmarshal_VkDeviceGroupRenderPassBeginInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceGroupRenderPassBeginInfo* forUnmarshaling)
-{
+void unmarshal_VkDeviceGroupRenderPassBeginInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkDeviceGroupRenderPassBeginInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->deviceMask, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->deviceRenderAreaCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pDeviceRenderAreas, forUnmarshaling->deviceRenderAreaCount * sizeof(const VkRect2D));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->deviceRenderAreaCount; ++i)
-        {
-            unmarshal_VkRect2D(vkStream, rootType, (VkRect2D*)(forUnmarshaling->pDeviceRenderAreas + i));
+    vkStream->alloc((void**)&forUnmarshaling->pDeviceRenderAreas,
+                    forUnmarshaling->deviceRenderAreaCount * sizeof(const VkRect2D));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->deviceRenderAreaCount; ++i) {
+            unmarshal_VkRect2D(vkStream, rootType,
+                               (VkRect2D*)(forUnmarshaling->pDeviceRenderAreas + i));
         }
     }
 }
 
 void marshal_VkDeviceGroupCommandBufferBeginInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDeviceGroupCommandBufferBeginInfo* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkDeviceGroupCommandBufferBeginInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -5779,94 +5373,90 @@
 }
 
 void unmarshal_VkDeviceGroupCommandBufferBeginInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceGroupCommandBufferBeginInfo* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDeviceGroupCommandBufferBeginInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->deviceMask, sizeof(uint32_t));
 }
 
-void marshal_VkDeviceGroupSubmitInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDeviceGroupSubmitInfo* forMarshaling)
-{
+void marshal_VkDeviceGroupSubmitInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkDeviceGroupSubmitInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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));
-    vkStream->write((const uint32_t*)forMarshaling->pWaitSemaphoreDeviceIndices, forMarshaling->waitSemaphoreCount * sizeof(const uint32_t));
+    vkStream->write((const uint32_t*)forMarshaling->pWaitSemaphoreDeviceIndices,
+                    forMarshaling->waitSemaphoreCount * sizeof(const uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->commandBufferCount, sizeof(uint32_t));
-    vkStream->write((const uint32_t*)forMarshaling->pCommandBufferDeviceMasks, forMarshaling->commandBufferCount * sizeof(const uint32_t));
+    vkStream->write((const uint32_t*)forMarshaling->pCommandBufferDeviceMasks,
+                    forMarshaling->commandBufferCount * sizeof(const uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->signalSemaphoreCount, sizeof(uint32_t));
-    vkStream->write((const uint32_t*)forMarshaling->pSignalSemaphoreDeviceIndices, forMarshaling->signalSemaphoreCount * sizeof(const uint32_t));
+    vkStream->write((const uint32_t*)forMarshaling->pSignalSemaphoreDeviceIndices,
+                    forMarshaling->signalSemaphoreCount * sizeof(const uint32_t));
 }
 
-void unmarshal_VkDeviceGroupSubmitInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceGroupSubmitInfo* forUnmarshaling)
-{
+void unmarshal_VkDeviceGroupSubmitInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkDeviceGroupSubmitInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->waitSemaphoreCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pWaitSemaphoreDeviceIndices, forUnmarshaling->waitSemaphoreCount * sizeof(const uint32_t));
-    vkStream->read((uint32_t*)forUnmarshaling->pWaitSemaphoreDeviceIndices, forUnmarshaling->waitSemaphoreCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pWaitSemaphoreDeviceIndices,
+                    forUnmarshaling->waitSemaphoreCount * sizeof(const uint32_t));
+    vkStream->read((uint32_t*)forUnmarshaling->pWaitSemaphoreDeviceIndices,
+                   forUnmarshaling->waitSemaphoreCount * sizeof(const uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->commandBufferCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pCommandBufferDeviceMasks, forUnmarshaling->commandBufferCount * sizeof(const uint32_t));
-    vkStream->read((uint32_t*)forUnmarshaling->pCommandBufferDeviceMasks, forUnmarshaling->commandBufferCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pCommandBufferDeviceMasks,
+                    forUnmarshaling->commandBufferCount * sizeof(const uint32_t));
+    vkStream->read((uint32_t*)forUnmarshaling->pCommandBufferDeviceMasks,
+                   forUnmarshaling->commandBufferCount * sizeof(const uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->signalSemaphoreCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pSignalSemaphoreDeviceIndices, forUnmarshaling->signalSemaphoreCount * sizeof(const uint32_t));
-    vkStream->read((uint32_t*)forUnmarshaling->pSignalSemaphoreDeviceIndices, forUnmarshaling->signalSemaphoreCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pSignalSemaphoreDeviceIndices,
+                    forUnmarshaling->signalSemaphoreCount * sizeof(const uint32_t));
+    vkStream->read((uint32_t*)forUnmarshaling->pSignalSemaphoreDeviceIndices,
+                   forUnmarshaling->signalSemaphoreCount * sizeof(const uint32_t));
 }
 
-void marshal_VkDeviceGroupBindSparseInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDeviceGroupBindSparseInfo* forMarshaling)
-{
+void marshal_VkDeviceGroupBindSparseInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkDeviceGroupBindSparseInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -5874,26 +5464,23 @@
     vkStream->write((uint32_t*)&forMarshaling->memoryDeviceIndex, sizeof(uint32_t));
 }
 
-void unmarshal_VkDeviceGroupBindSparseInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceGroupBindSparseInfo* forUnmarshaling)
-{
+void unmarshal_VkDeviceGroupBindSparseInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkDeviceGroupBindSparseInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -5902,220 +5489,200 @@
 }
 
 void marshal_VkBindBufferMemoryDeviceGroupInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBindBufferMemoryDeviceGroupInfo* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkBindBufferMemoryDeviceGroupInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->deviceIndexCount, sizeof(uint32_t));
-    vkStream->write((const uint32_t*)forMarshaling->pDeviceIndices, forMarshaling->deviceIndexCount * sizeof(const uint32_t));
+    vkStream->write((const uint32_t*)forMarshaling->pDeviceIndices,
+                    forMarshaling->deviceIndexCount * sizeof(const uint32_t));
 }
 
 void unmarshal_VkBindBufferMemoryDeviceGroupInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindBufferMemoryDeviceGroupInfo* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBindBufferMemoryDeviceGroupInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->deviceIndexCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pDeviceIndices, forUnmarshaling->deviceIndexCount * sizeof(const uint32_t));
-    vkStream->read((uint32_t*)forUnmarshaling->pDeviceIndices, forUnmarshaling->deviceIndexCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pDeviceIndices,
+                    forUnmarshaling->deviceIndexCount * sizeof(const uint32_t));
+    vkStream->read((uint32_t*)forUnmarshaling->pDeviceIndices,
+                   forUnmarshaling->deviceIndexCount * sizeof(const uint32_t));
 }
 
 void marshal_VkBindImageMemoryDeviceGroupInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBindImageMemoryDeviceGroupInfo* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkBindImageMemoryDeviceGroupInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->deviceIndexCount, sizeof(uint32_t));
-    vkStream->write((const uint32_t*)forMarshaling->pDeviceIndices, forMarshaling->deviceIndexCount * sizeof(const uint32_t));
+    vkStream->write((const uint32_t*)forMarshaling->pDeviceIndices,
+                    forMarshaling->deviceIndexCount * sizeof(const uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->splitInstanceBindRegionCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->splitInstanceBindRegionCount; ++i)
-        {
-            marshal_VkRect2D(vkStream, rootType, (const VkRect2D*)(forMarshaling->pSplitInstanceBindRegions + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->splitInstanceBindRegionCount; ++i) {
+            marshal_VkRect2D(vkStream, rootType,
+                             (const VkRect2D*)(forMarshaling->pSplitInstanceBindRegions + i));
         }
     }
 }
 
-void unmarshal_VkBindImageMemoryDeviceGroupInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindImageMemoryDeviceGroupInfo* forUnmarshaling)
-{
+void unmarshal_VkBindImageMemoryDeviceGroupInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkBindImageMemoryDeviceGroupInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->deviceIndexCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pDeviceIndices, forUnmarshaling->deviceIndexCount * sizeof(const uint32_t));
-    vkStream->read((uint32_t*)forUnmarshaling->pDeviceIndices, forUnmarshaling->deviceIndexCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pDeviceIndices,
+                    forUnmarshaling->deviceIndexCount * sizeof(const uint32_t));
+    vkStream->read((uint32_t*)forUnmarshaling->pDeviceIndices,
+                   forUnmarshaling->deviceIndexCount * sizeof(const uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->splitInstanceBindRegionCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pSplitInstanceBindRegions, forUnmarshaling->splitInstanceBindRegionCount * sizeof(const VkRect2D));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->splitInstanceBindRegionCount; ++i)
-        {
-            unmarshal_VkRect2D(vkStream, rootType, (VkRect2D*)(forUnmarshaling->pSplitInstanceBindRegions + i));
+    vkStream->alloc((void**)&forUnmarshaling->pSplitInstanceBindRegions,
+                    forUnmarshaling->splitInstanceBindRegionCount * sizeof(const VkRect2D));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->splitInstanceBindRegionCount; ++i) {
+            unmarshal_VkRect2D(vkStream, rootType,
+                               (VkRect2D*)(forUnmarshaling->pSplitInstanceBindRegions + i));
         }
     }
 }
 
-void marshal_VkPhysicalDeviceGroupProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceGroupProperties* forMarshaling)
-{
+void marshal_VkPhysicalDeviceGroupProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkPhysicalDeviceGroupProperties* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->physicalDeviceCount, sizeof(uint32_t));
-    vkStream->write((VkPhysicalDevice*)forMarshaling->physicalDevices, VK_MAX_DEVICE_GROUP_SIZE * sizeof(VkPhysicalDevice));
+    vkStream->write((VkPhysicalDevice*)forMarshaling->physicalDevices,
+                    VK_MAX_DEVICE_GROUP_SIZE * sizeof(VkPhysicalDevice));
     vkStream->write((VkBool32*)&forMarshaling->subsetAllocation, sizeof(VkBool32));
 }
 
-void unmarshal_VkPhysicalDeviceGroupProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceGroupProperties* forUnmarshaling)
-{
+void unmarshal_VkPhysicalDeviceGroupProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkPhysicalDeviceGroupProperties* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->physicalDeviceCount, sizeof(uint32_t));
-    vkStream->read((VkPhysicalDevice*)forUnmarshaling->physicalDevices, VK_MAX_DEVICE_GROUP_SIZE * sizeof(VkPhysicalDevice));
+    vkStream->read((VkPhysicalDevice*)forUnmarshaling->physicalDevices,
+                   VK_MAX_DEVICE_GROUP_SIZE * sizeof(VkPhysicalDevice));
     vkStream->read((VkBool32*)&forUnmarshaling->subsetAllocation, sizeof(VkBool32));
 }
 
-void marshal_VkDeviceGroupDeviceCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDeviceGroupDeviceCreateInfo* forMarshaling)
-{
+void marshal_VkDeviceGroupDeviceCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkDeviceGroupDeviceCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->physicalDeviceCount, sizeof(uint32_t));
-    if (forMarshaling->physicalDeviceCount)
-    {
+    if (forMarshaling->physicalDeviceCount) {
         uint64_t* cgen_var_0;
         vkStream->alloc((void**)&cgen_var_0, forMarshaling->physicalDeviceCount * 8);
-        vkStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(forMarshaling->pPhysicalDevices, cgen_var_0, forMarshaling->physicalDeviceCount);
+        vkStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(
+            forMarshaling->pPhysicalDevices, cgen_var_0, forMarshaling->physicalDeviceCount);
         vkStream->write((uint64_t*)cgen_var_0, forMarshaling->physicalDeviceCount * 8);
     }
 }
 
-void unmarshal_VkDeviceGroupDeviceCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceGroupDeviceCreateInfo* forUnmarshaling)
-{
+void unmarshal_VkDeviceGroupDeviceCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkDeviceGroupDeviceCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->physicalDeviceCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pPhysicalDevices, forUnmarshaling->physicalDeviceCount * sizeof(const VkPhysicalDevice));
-    if (forUnmarshaling->physicalDeviceCount)
-    {
+    vkStream->alloc((void**)&forUnmarshaling->pPhysicalDevices,
+                    forUnmarshaling->physicalDeviceCount * sizeof(const VkPhysicalDevice));
+    if (forUnmarshaling->physicalDeviceCount) {
         uint64_t* cgen_var_0;
         vkStream->alloc((void**)&cgen_var_0, forUnmarshaling->physicalDeviceCount * 8);
         vkStream->read((uint64_t*)cgen_var_0, forUnmarshaling->physicalDeviceCount * 8);
-        vkStream->handleMapping()->mapHandles_u64_VkPhysicalDevice(cgen_var_0, (VkPhysicalDevice*)forUnmarshaling->pPhysicalDevices, forUnmarshaling->physicalDeviceCount);
+        vkStream->handleMapping()->mapHandles_u64_VkPhysicalDevice(
+            cgen_var_0, (VkPhysicalDevice*)forUnmarshaling->pPhysicalDevices,
+            forUnmarshaling->physicalDeviceCount);
     }
 }
 
-void marshal_VkBufferMemoryRequirementsInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBufferMemoryRequirementsInfo2* forMarshaling)
-{
+void marshal_VkBufferMemoryRequirementsInfo2(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkBufferMemoryRequirementsInfo2* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -6124,43 +5691,37 @@
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
 }
 
-void unmarshal_VkBufferMemoryRequirementsInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferMemoryRequirementsInfo2* forUnmarshaling)
-{
+void unmarshal_VkBufferMemoryRequirementsInfo2(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkBufferMemoryRequirementsInfo2* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkBuffer(&cgen_var_0, (VkBuffer*)&forUnmarshaling->buffer, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_0,
+                                                       (VkBuffer*)&forUnmarshaling->buffer, 1);
 }
 
-void marshal_VkImageMemoryRequirementsInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageMemoryRequirementsInfo2* forMarshaling)
-{
+void marshal_VkImageMemoryRequirementsInfo2(VulkanStream* vkStream, VkStructureType rootType,
+                                            const VkImageMemoryRequirementsInfo2* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -6169,43 +5730,38 @@
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
 }
 
-void unmarshal_VkImageMemoryRequirementsInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageMemoryRequirementsInfo2* forUnmarshaling)
-{
+void unmarshal_VkImageMemoryRequirementsInfo2(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkImageMemoryRequirementsInfo2* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkImage(&cgen_var_0, (VkImage*)&forUnmarshaling->image, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_0,
+                                                      (VkImage*)&forUnmarshaling->image, 1);
 }
 
 void marshal_VkImageSparseMemoryRequirementsInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageSparseMemoryRequirementsInfo2* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkImageSparseMemoryRequirementsInfo2* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -6215,288 +5771,256 @@
 }
 
 void unmarshal_VkImageSparseMemoryRequirementsInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageSparseMemoryRequirementsInfo2* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImageSparseMemoryRequirementsInfo2* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkImage(&cgen_var_0, (VkImage*)&forUnmarshaling->image, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_0,
+                                                      (VkImage*)&forUnmarshaling->image, 1);
 }
 
-void marshal_VkMemoryRequirements2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMemoryRequirements2* forMarshaling)
-{
+void marshal_VkMemoryRequirements2(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkMemoryRequirements2* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    marshal_VkMemoryRequirements(vkStream, rootType, (VkMemoryRequirements*)(&forMarshaling->memoryRequirements));
+    marshal_VkMemoryRequirements(vkStream, rootType,
+                                 (VkMemoryRequirements*)(&forMarshaling->memoryRequirements));
 }
 
-void unmarshal_VkMemoryRequirements2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryRequirements2* forUnmarshaling)
-{
+void unmarshal_VkMemoryRequirements2(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkMemoryRequirements2* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    unmarshal_VkMemoryRequirements(vkStream, rootType, (VkMemoryRequirements*)(&forUnmarshaling->memoryRequirements));
+    unmarshal_VkMemoryRequirements(vkStream, rootType,
+                                   (VkMemoryRequirements*)(&forUnmarshaling->memoryRequirements));
 }
 
 void marshal_VkSparseImageMemoryRequirements2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSparseImageMemoryRequirements2* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkSparseImageMemoryRequirements2* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    marshal_VkSparseImageMemoryRequirements(vkStream, rootType, (VkSparseImageMemoryRequirements*)(&forMarshaling->memoryRequirements));
+    marshal_VkSparseImageMemoryRequirements(
+        vkStream, rootType, (VkSparseImageMemoryRequirements*)(&forMarshaling->memoryRequirements));
 }
 
-void unmarshal_VkSparseImageMemoryRequirements2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSparseImageMemoryRequirements2* forUnmarshaling)
-{
+void unmarshal_VkSparseImageMemoryRequirements2(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkSparseImageMemoryRequirements2* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    unmarshal_VkSparseImageMemoryRequirements(vkStream, rootType, (VkSparseImageMemoryRequirements*)(&forUnmarshaling->memoryRequirements));
+    unmarshal_VkSparseImageMemoryRequirements(
+        vkStream, rootType,
+        (VkSparseImageMemoryRequirements*)(&forUnmarshaling->memoryRequirements));
 }
 
-void marshal_VkPhysicalDeviceFeatures2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceFeatures2* forMarshaling)
-{
+void marshal_VkPhysicalDeviceFeatures2(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkPhysicalDeviceFeatures2* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    marshal_VkPhysicalDeviceFeatures(vkStream, rootType, (VkPhysicalDeviceFeatures*)(&forMarshaling->features));
+    marshal_VkPhysicalDeviceFeatures(vkStream, rootType,
+                                     (VkPhysicalDeviceFeatures*)(&forMarshaling->features));
 }
 
-void unmarshal_VkPhysicalDeviceFeatures2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFeatures2* forUnmarshaling)
-{
+void unmarshal_VkPhysicalDeviceFeatures2(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkPhysicalDeviceFeatures2* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    unmarshal_VkPhysicalDeviceFeatures(vkStream, rootType, (VkPhysicalDeviceFeatures*)(&forUnmarshaling->features));
+    unmarshal_VkPhysicalDeviceFeatures(vkStream, rootType,
+                                       (VkPhysicalDeviceFeatures*)(&forUnmarshaling->features));
 }
 
-void marshal_VkPhysicalDeviceProperties2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceProperties2* forMarshaling)
-{
+void marshal_VkPhysicalDeviceProperties2(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkPhysicalDeviceProperties2* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    marshal_VkPhysicalDeviceProperties(vkStream, rootType, (VkPhysicalDeviceProperties*)(&forMarshaling->properties));
+    marshal_VkPhysicalDeviceProperties(vkStream, rootType,
+                                       (VkPhysicalDeviceProperties*)(&forMarshaling->properties));
 }
 
-void unmarshal_VkPhysicalDeviceProperties2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceProperties2* forUnmarshaling)
-{
+void unmarshal_VkPhysicalDeviceProperties2(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkPhysicalDeviceProperties2* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    unmarshal_VkPhysicalDeviceProperties(vkStream, rootType, (VkPhysicalDeviceProperties*)(&forUnmarshaling->properties));
+    unmarshal_VkPhysicalDeviceProperties(
+        vkStream, rootType, (VkPhysicalDeviceProperties*)(&forUnmarshaling->properties));
 }
 
-void marshal_VkFormatProperties2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkFormatProperties2* forMarshaling)
-{
+void marshal_VkFormatProperties2(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkFormatProperties2* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    marshal_VkFormatProperties(vkStream, rootType, (VkFormatProperties*)(&forMarshaling->formatProperties));
+    marshal_VkFormatProperties(vkStream, rootType,
+                               (VkFormatProperties*)(&forMarshaling->formatProperties));
 }
 
-void unmarshal_VkFormatProperties2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFormatProperties2* forUnmarshaling)
-{
+void unmarshal_VkFormatProperties2(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkFormatProperties2* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    unmarshal_VkFormatProperties(vkStream, rootType, (VkFormatProperties*)(&forUnmarshaling->formatProperties));
+    unmarshal_VkFormatProperties(vkStream, rootType,
+                                 (VkFormatProperties*)(&forUnmarshaling->formatProperties));
 }
 
-void marshal_VkImageFormatProperties2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageFormatProperties2* forMarshaling)
-{
+void marshal_VkImageFormatProperties2(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkImageFormatProperties2* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    marshal_VkImageFormatProperties(vkStream, rootType, (VkImageFormatProperties*)(&forMarshaling->imageFormatProperties));
+    marshal_VkImageFormatProperties(
+        vkStream, rootType, (VkImageFormatProperties*)(&forMarshaling->imageFormatProperties));
 }
 
-void unmarshal_VkImageFormatProperties2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageFormatProperties2* forUnmarshaling)
-{
+void unmarshal_VkImageFormatProperties2(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkImageFormatProperties2* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    unmarshal_VkImageFormatProperties(vkStream, rootType, (VkImageFormatProperties*)(&forUnmarshaling->imageFormatProperties));
+    unmarshal_VkImageFormatProperties(
+        vkStream, rootType, (VkImageFormatProperties*)(&forUnmarshaling->imageFormatProperties));
 }
 
 void marshal_VkPhysicalDeviceImageFormatInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceImageFormatInfo2* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceImageFormatInfo2* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -6507,26 +6031,23 @@
     vkStream->write((VkImageCreateFlags*)&forMarshaling->flags, sizeof(VkImageCreateFlags));
 }
 
-void unmarshal_VkPhysicalDeviceImageFormatInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceImageFormatInfo2* forUnmarshaling)
-{
+void unmarshal_VkPhysicalDeviceImageFormatInfo2(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkPhysicalDeviceImageFormatInfo2* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -6537,138 +6058,123 @@
     vkStream->read((VkImageCreateFlags*)&forUnmarshaling->flags, sizeof(VkImageCreateFlags));
 }
 
-void marshal_VkQueueFamilyProperties2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkQueueFamilyProperties2* forMarshaling)
-{
+void marshal_VkQueueFamilyProperties2(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkQueueFamilyProperties2* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    marshal_VkQueueFamilyProperties(vkStream, rootType, (VkQueueFamilyProperties*)(&forMarshaling->queueFamilyProperties));
+    marshal_VkQueueFamilyProperties(
+        vkStream, rootType, (VkQueueFamilyProperties*)(&forMarshaling->queueFamilyProperties));
 }
 
-void unmarshal_VkQueueFamilyProperties2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkQueueFamilyProperties2* forUnmarshaling)
-{
+void unmarshal_VkQueueFamilyProperties2(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkQueueFamilyProperties2* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    unmarshal_VkQueueFamilyProperties(vkStream, rootType, (VkQueueFamilyProperties*)(&forUnmarshaling->queueFamilyProperties));
+    unmarshal_VkQueueFamilyProperties(
+        vkStream, rootType, (VkQueueFamilyProperties*)(&forUnmarshaling->queueFamilyProperties));
 }
 
 void marshal_VkPhysicalDeviceMemoryProperties2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceMemoryProperties2* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceMemoryProperties2* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    marshal_VkPhysicalDeviceMemoryProperties(vkStream, rootType, (VkPhysicalDeviceMemoryProperties*)(&forMarshaling->memoryProperties));
+    marshal_VkPhysicalDeviceMemoryProperties(
+        vkStream, rootType, (VkPhysicalDeviceMemoryProperties*)(&forMarshaling->memoryProperties));
 }
 
 void unmarshal_VkPhysicalDeviceMemoryProperties2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMemoryProperties2* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMemoryProperties2* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    unmarshal_VkPhysicalDeviceMemoryProperties(vkStream, rootType, (VkPhysicalDeviceMemoryProperties*)(&forUnmarshaling->memoryProperties));
+    unmarshal_VkPhysicalDeviceMemoryProperties(
+        vkStream, rootType,
+        (VkPhysicalDeviceMemoryProperties*)(&forUnmarshaling->memoryProperties));
 }
 
-void marshal_VkSparseImageFormatProperties2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSparseImageFormatProperties2* forMarshaling)
-{
+void marshal_VkSparseImageFormatProperties2(VulkanStream* vkStream, VkStructureType rootType,
+                                            const VkSparseImageFormatProperties2* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    marshal_VkSparseImageFormatProperties(vkStream, rootType, (VkSparseImageFormatProperties*)(&forMarshaling->properties));
+    marshal_VkSparseImageFormatProperties(
+        vkStream, rootType, (VkSparseImageFormatProperties*)(&forMarshaling->properties));
 }
 
-void unmarshal_VkSparseImageFormatProperties2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSparseImageFormatProperties2* forUnmarshaling)
-{
+void unmarshal_VkSparseImageFormatProperties2(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkSparseImageFormatProperties2* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    unmarshal_VkSparseImageFormatProperties(vkStream, rootType, (VkSparseImageFormatProperties*)(&forUnmarshaling->properties));
+    unmarshal_VkSparseImageFormatProperties(
+        vkStream, rootType, (VkSparseImageFormatProperties*)(&forUnmarshaling->properties));
 }
 
 void marshal_VkPhysicalDeviceSparseImageFormatInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceSparseImageFormatInfo2* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceSparseImageFormatInfo2* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -6680,92 +6186,83 @@
 }
 
 void unmarshal_VkPhysicalDeviceSparseImageFormatInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSparseImageFormatInfo2* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceSparseImageFormatInfo2* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkFormat*)&forUnmarshaling->format, sizeof(VkFormat));
     vkStream->read((VkImageType*)&forUnmarshaling->type, sizeof(VkImageType));
-    vkStream->read((VkSampleCountFlagBits*)&forUnmarshaling->samples, sizeof(VkSampleCountFlagBits));
+    vkStream->read((VkSampleCountFlagBits*)&forUnmarshaling->samples,
+                   sizeof(VkSampleCountFlagBits));
     vkStream->read((VkImageUsageFlags*)&forUnmarshaling->usage, sizeof(VkImageUsageFlags));
     vkStream->read((VkImageTiling*)&forUnmarshaling->tiling, sizeof(VkImageTiling));
 }
 
 void marshal_VkPhysicalDevicePointClippingProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDevicePointClippingProperties* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDevicePointClippingProperties* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkPointClippingBehavior*)&forMarshaling->pointClippingBehavior, sizeof(VkPointClippingBehavior));
+    vkStream->write((VkPointClippingBehavior*)&forMarshaling->pointClippingBehavior,
+                    sizeof(VkPointClippingBehavior));
 }
 
 void unmarshal_VkPhysicalDevicePointClippingProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePointClippingProperties* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePointClippingProperties* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkPointClippingBehavior*)&forUnmarshaling->pointClippingBehavior, sizeof(VkPointClippingBehavior));
+    vkStream->read((VkPointClippingBehavior*)&forUnmarshaling->pointClippingBehavior,
+                   sizeof(VkPointClippingBehavior));
 }
 
 void marshal_VkInputAttachmentAspectReference(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkInputAttachmentAspectReference* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkInputAttachmentAspectReference* forMarshaling) {
     (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->subpass, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->inputAttachmentIndex, sizeof(uint32_t));
     vkStream->write((VkImageAspectFlags*)&forMarshaling->aspectMask, sizeof(VkImageAspectFlags));
 }
 
-void unmarshal_VkInputAttachmentAspectReference(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkInputAttachmentAspectReference* forUnmarshaling)
-{
+void unmarshal_VkInputAttachmentAspectReference(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkInputAttachmentAspectReference* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->subpass, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->inputAttachmentIndex, sizeof(uint32_t));
@@ -6773,96 +6270,86 @@
 }
 
 void marshal_VkRenderPassInputAttachmentAspectCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkRenderPassInputAttachmentAspectCreateInfo* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkRenderPassInputAttachmentAspectCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->aspectReferenceCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->aspectReferenceCount; ++i)
-        {
-            marshal_VkInputAttachmentAspectReference(vkStream, rootType, (const VkInputAttachmentAspectReference*)(forMarshaling->pAspectReferences + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->aspectReferenceCount; ++i) {
+            marshal_VkInputAttachmentAspectReference(
+                vkStream, rootType,
+                (const VkInputAttachmentAspectReference*)(forMarshaling->pAspectReferences + i));
         }
     }
 }
 
 void unmarshal_VkRenderPassInputAttachmentAspectCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderPassInputAttachmentAspectCreateInfo* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkRenderPassInputAttachmentAspectCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->aspectReferenceCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pAspectReferences, forUnmarshaling->aspectReferenceCount * sizeof(const VkInputAttachmentAspectReference));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->aspectReferenceCount; ++i)
-        {
-            unmarshal_VkInputAttachmentAspectReference(vkStream, rootType, (VkInputAttachmentAspectReference*)(forUnmarshaling->pAspectReferences + i));
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pAspectReferences,
+        forUnmarshaling->aspectReferenceCount * sizeof(const VkInputAttachmentAspectReference));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->aspectReferenceCount; ++i) {
+            unmarshal_VkInputAttachmentAspectReference(
+                vkStream, rootType,
+                (VkInputAttachmentAspectReference*)(forUnmarshaling->pAspectReferences + i));
         }
     }
 }
 
-void marshal_VkImageViewUsageCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageViewUsageCreateInfo* forMarshaling)
-{
+void marshal_VkImageViewUsageCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                        const VkImageViewUsageCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkImageUsageFlags*)&forMarshaling->usage, sizeof(VkImageUsageFlags));
 }
 
-void unmarshal_VkImageViewUsageCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageViewUsageCreateInfo* forUnmarshaling)
-{
+void unmarshal_VkImageViewUsageCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkImageViewUsageCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -6870,109 +6357,105 @@
 }
 
 void marshal_VkPipelineTessellationDomainOriginStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineTessellationDomainOriginStateCreateInfo* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineTessellationDomainOriginStateCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkTessellationDomainOrigin*)&forMarshaling->domainOrigin, sizeof(VkTessellationDomainOrigin));
+    vkStream->write((VkTessellationDomainOrigin*)&forMarshaling->domainOrigin,
+                    sizeof(VkTessellationDomainOrigin));
 }
 
 void unmarshal_VkPipelineTessellationDomainOriginStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineTessellationDomainOriginStateCreateInfo* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineTessellationDomainOriginStateCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkTessellationDomainOrigin*)&forUnmarshaling->domainOrigin, sizeof(VkTessellationDomainOrigin));
+    vkStream->read((VkTessellationDomainOrigin*)&forUnmarshaling->domainOrigin,
+                   sizeof(VkTessellationDomainOrigin));
 }
 
-void marshal_VkRenderPassMultiviewCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkRenderPassMultiviewCreateInfo* forMarshaling)
-{
+void marshal_VkRenderPassMultiviewCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkRenderPassMultiviewCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->subpassCount, sizeof(uint32_t));
-    vkStream->write((const uint32_t*)forMarshaling->pViewMasks, forMarshaling->subpassCount * sizeof(const uint32_t));
+    vkStream->write((const uint32_t*)forMarshaling->pViewMasks,
+                    forMarshaling->subpassCount * sizeof(const uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->dependencyCount, sizeof(uint32_t));
-    vkStream->write((const int32_t*)forMarshaling->pViewOffsets, forMarshaling->dependencyCount * sizeof(const int32_t));
+    vkStream->write((const int32_t*)forMarshaling->pViewOffsets,
+                    forMarshaling->dependencyCount * sizeof(const int32_t));
     vkStream->write((uint32_t*)&forMarshaling->correlationMaskCount, sizeof(uint32_t));
-    vkStream->write((const uint32_t*)forMarshaling->pCorrelationMasks, forMarshaling->correlationMaskCount * sizeof(const uint32_t));
+    vkStream->write((const uint32_t*)forMarshaling->pCorrelationMasks,
+                    forMarshaling->correlationMaskCount * sizeof(const uint32_t));
 }
 
-void unmarshal_VkRenderPassMultiviewCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderPassMultiviewCreateInfo* forUnmarshaling)
-{
+void unmarshal_VkRenderPassMultiviewCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkRenderPassMultiviewCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->subpassCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pViewMasks, forUnmarshaling->subpassCount * sizeof(const uint32_t));
-    vkStream->read((uint32_t*)forUnmarshaling->pViewMasks, forUnmarshaling->subpassCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pViewMasks,
+                    forUnmarshaling->subpassCount * sizeof(const uint32_t));
+    vkStream->read((uint32_t*)forUnmarshaling->pViewMasks,
+                   forUnmarshaling->subpassCount * sizeof(const uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->dependencyCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pViewOffsets, forUnmarshaling->dependencyCount * sizeof(const int32_t));
-    vkStream->read((int32_t*)forUnmarshaling->pViewOffsets, forUnmarshaling->dependencyCount * sizeof(const int32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pViewOffsets,
+                    forUnmarshaling->dependencyCount * sizeof(const int32_t));
+    vkStream->read((int32_t*)forUnmarshaling->pViewOffsets,
+                   forUnmarshaling->dependencyCount * sizeof(const int32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->correlationMaskCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pCorrelationMasks, forUnmarshaling->correlationMaskCount * sizeof(const uint32_t));
-    vkStream->read((uint32_t*)forUnmarshaling->pCorrelationMasks, forUnmarshaling->correlationMaskCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pCorrelationMasks,
+                    forUnmarshaling->correlationMaskCount * sizeof(const uint32_t));
+    vkStream->read((uint32_t*)forUnmarshaling->pCorrelationMasks,
+                   forUnmarshaling->correlationMaskCount * sizeof(const uint32_t));
 }
 
 void marshal_VkPhysicalDeviceMultiviewFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceMultiviewFeatures* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceMultiviewFeatures* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -6982,25 +6465,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceMultiviewFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMultiviewFeatures* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMultiviewFeatures* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -7010,14 +6491,11 @@
 }
 
 void marshal_VkPhysicalDeviceMultiviewProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceMultiviewProperties* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceMultiviewProperties* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -7026,25 +6504,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceMultiviewProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMultiviewProperties* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMultiviewProperties* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -7053,14 +6529,11 @@
 }
 
 void marshal_VkPhysicalDeviceVariablePointersFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceVariablePointersFeatures* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceVariablePointersFeatures* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -7069,25 +6542,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceVariablePointersFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceVariablePointersFeatures* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceVariablePointersFeatures* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -7096,14 +6567,11 @@
 }
 
 void marshal_VkPhysicalDeviceProtectedMemoryFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceProtectedMemoryFeatures* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceProtectedMemoryFeatures* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -7111,25 +6579,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceProtectedMemoryFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceProtectedMemoryFeatures* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceProtectedMemoryFeatures* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -7137,14 +6603,11 @@
 }
 
 void marshal_VkPhysicalDeviceProtectedMemoryProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceProtectedMemoryProperties* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceProtectedMemoryProperties* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -7152,111 +6615,97 @@
 }
 
 void unmarshal_VkPhysicalDeviceProtectedMemoryProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceProtectedMemoryProperties* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceProtectedMemoryProperties* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkBool32*)&forUnmarshaling->protectedNoFault, sizeof(VkBool32));
 }
 
-void marshal_VkDeviceQueueInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDeviceQueueInfo2* forMarshaling)
-{
+void marshal_VkDeviceQueueInfo2(VulkanStream* vkStream, VkStructureType rootType,
+                                const VkDeviceQueueInfo2* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkDeviceQueueCreateFlags*)&forMarshaling->flags, sizeof(VkDeviceQueueCreateFlags));
+    vkStream->write((VkDeviceQueueCreateFlags*)&forMarshaling->flags,
+                    sizeof(VkDeviceQueueCreateFlags));
     vkStream->write((uint32_t*)&forMarshaling->queueFamilyIndex, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->queueIndex, sizeof(uint32_t));
 }
 
-void unmarshal_VkDeviceQueueInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceQueueInfo2* forUnmarshaling)
-{
+void unmarshal_VkDeviceQueueInfo2(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkDeviceQueueInfo2* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkDeviceQueueCreateFlags*)&forUnmarshaling->flags, sizeof(VkDeviceQueueCreateFlags));
+    vkStream->read((VkDeviceQueueCreateFlags*)&forUnmarshaling->flags,
+                   sizeof(VkDeviceQueueCreateFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->queueFamilyIndex, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->queueIndex, sizeof(uint32_t));
 }
 
-void marshal_VkProtectedSubmitInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkProtectedSubmitInfo* forMarshaling)
-{
+void marshal_VkProtectedSubmitInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkProtectedSubmitInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->protectedSubmit, sizeof(VkBool32));
 }
 
-void unmarshal_VkProtectedSubmitInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkProtectedSubmitInfo* forUnmarshaling)
-{
+void unmarshal_VkProtectedSubmitInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkProtectedSubmitInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -7264,21 +6713,20 @@
 }
 
 void marshal_VkSamplerYcbcrConversionCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSamplerYcbcrConversionCreateInfo* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkSamplerYcbcrConversionCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkFormat*)&forMarshaling->format, sizeof(VkFormat));
-    vkStream->write((VkSamplerYcbcrModelConversion*)&forMarshaling->ycbcrModel, sizeof(VkSamplerYcbcrModelConversion));
+    vkStream->write((VkSamplerYcbcrModelConversion*)&forMarshaling->ycbcrModel,
+                    sizeof(VkSamplerYcbcrModelConversion));
     vkStream->write((VkSamplerYcbcrRange*)&forMarshaling->ycbcrRange, sizeof(VkSamplerYcbcrRange));
-    marshal_VkComponentMapping(vkStream, rootType, (VkComponentMapping*)(&forMarshaling->components));
+    marshal_VkComponentMapping(vkStream, rootType,
+                               (VkComponentMapping*)(&forMarshaling->components));
     vkStream->write((VkChromaLocation*)&forMarshaling->xChromaOffset, sizeof(VkChromaLocation));
     vkStream->write((VkChromaLocation*)&forMarshaling->yChromaOffset, sizeof(VkChromaLocation));
     vkStream->write((VkFilter*)&forMarshaling->chromaFilter, sizeof(VkFilter));
@@ -7286,174 +6734,158 @@
 }
 
 void unmarshal_VkSamplerYcbcrConversionCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSamplerYcbcrConversionCreateInfo* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSamplerYcbcrConversionCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkFormat*)&forUnmarshaling->format, sizeof(VkFormat));
-    vkStream->read((VkSamplerYcbcrModelConversion*)&forUnmarshaling->ycbcrModel, sizeof(VkSamplerYcbcrModelConversion));
+    vkStream->read((VkSamplerYcbcrModelConversion*)&forUnmarshaling->ycbcrModel,
+                   sizeof(VkSamplerYcbcrModelConversion));
     vkStream->read((VkSamplerYcbcrRange*)&forUnmarshaling->ycbcrRange, sizeof(VkSamplerYcbcrRange));
-    unmarshal_VkComponentMapping(vkStream, rootType, (VkComponentMapping*)(&forUnmarshaling->components));
+    unmarshal_VkComponentMapping(vkStream, rootType,
+                                 (VkComponentMapping*)(&forUnmarshaling->components));
     vkStream->read((VkChromaLocation*)&forUnmarshaling->xChromaOffset, sizeof(VkChromaLocation));
     vkStream->read((VkChromaLocation*)&forUnmarshaling->yChromaOffset, sizeof(VkChromaLocation));
     vkStream->read((VkFilter*)&forUnmarshaling->chromaFilter, sizeof(VkFilter));
     vkStream->read((VkBool32*)&forUnmarshaling->forceExplicitReconstruction, sizeof(VkBool32));
 }
 
-void marshal_VkSamplerYcbcrConversionInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSamplerYcbcrConversionInfo* forMarshaling)
-{
+void marshal_VkSamplerYcbcrConversionInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                          const VkSamplerYcbcrConversionInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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_VkSamplerYcbcrConversion_u64(&forMarshaling->conversion, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkSamplerYcbcrConversion_u64(&forMarshaling->conversion,
+                                                                       &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
 }
 
-void unmarshal_VkSamplerYcbcrConversionInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSamplerYcbcrConversionInfo* forUnmarshaling)
-{
+void unmarshal_VkSamplerYcbcrConversionInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkSamplerYcbcrConversionInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkSamplerYcbcrConversion(&cgen_var_0, (VkSamplerYcbcrConversion*)&forUnmarshaling->conversion, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkSamplerYcbcrConversion(
+        &cgen_var_0, (VkSamplerYcbcrConversion*)&forUnmarshaling->conversion, 1);
 }
 
-void marshal_VkBindImagePlaneMemoryInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBindImagePlaneMemoryInfo* forMarshaling)
-{
+void marshal_VkBindImagePlaneMemoryInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                        const VkBindImagePlaneMemoryInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkImageAspectFlagBits*)&forMarshaling->planeAspect, sizeof(VkImageAspectFlagBits));
+    vkStream->write((VkImageAspectFlagBits*)&forMarshaling->planeAspect,
+                    sizeof(VkImageAspectFlagBits));
 }
 
-void unmarshal_VkBindImagePlaneMemoryInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindImagePlaneMemoryInfo* forUnmarshaling)
-{
+void unmarshal_VkBindImagePlaneMemoryInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkBindImagePlaneMemoryInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkImageAspectFlagBits*)&forUnmarshaling->planeAspect, sizeof(VkImageAspectFlagBits));
+    vkStream->read((VkImageAspectFlagBits*)&forUnmarshaling->planeAspect,
+                   sizeof(VkImageAspectFlagBits));
 }
 
 void marshal_VkImagePlaneMemoryRequirementsInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImagePlaneMemoryRequirementsInfo* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkImagePlaneMemoryRequirementsInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkImageAspectFlagBits*)&forMarshaling->planeAspect, sizeof(VkImageAspectFlagBits));
+    vkStream->write((VkImageAspectFlagBits*)&forMarshaling->planeAspect,
+                    sizeof(VkImageAspectFlagBits));
 }
 
 void unmarshal_VkImagePlaneMemoryRequirementsInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImagePlaneMemoryRequirementsInfo* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImagePlaneMemoryRequirementsInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkImageAspectFlagBits*)&forUnmarshaling->planeAspect, sizeof(VkImageAspectFlagBits));
+    vkStream->read((VkImageAspectFlagBits*)&forUnmarshaling->planeAspect,
+                   sizeof(VkImageAspectFlagBits));
 }
 
 void marshal_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceSamplerYcbcrConversionFeatures* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceSamplerYcbcrConversionFeatures* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -7461,25 +6893,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSamplerYcbcrConversionFeatures* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceSamplerYcbcrConversionFeatures* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -7487,51 +6917,45 @@
 }
 
 void marshal_VkSamplerYcbcrConversionImageFormatProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSamplerYcbcrConversionImageFormatProperties* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkSamplerYcbcrConversionImageFormatProperties* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((uint32_t*)&forMarshaling->combinedImageSamplerDescriptorCount, sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->combinedImageSamplerDescriptorCount,
+                    sizeof(uint32_t));
 }
 
 void unmarshal_VkSamplerYcbcrConversionImageFormatProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSamplerYcbcrConversionImageFormatProperties* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSamplerYcbcrConversionImageFormatProperties* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((uint32_t*)&forUnmarshaling->combinedImageSamplerDescriptorCount, sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->combinedImageSamplerDescriptorCount,
+                   sizeof(uint32_t));
 }
 
-void marshal_VkDescriptorUpdateTemplateEntry(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDescriptorUpdateTemplateEntry* forMarshaling)
-{
+void marshal_VkDescriptorUpdateTemplateEntry(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkDescriptorUpdateTemplateEntry* forMarshaling) {
     (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->dstBinding, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->dstArrayElement, sizeof(uint32_t));
@@ -7543,11 +6967,8 @@
     vkStream->putBe64(cgen_var_1);
 }
 
-void unmarshal_VkDescriptorUpdateTemplateEntry(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorUpdateTemplateEntry* forUnmarshaling)
-{
+void unmarshal_VkDescriptorUpdateTemplateEntry(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkDescriptorUpdateTemplateEntry* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->dstBinding, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->dstArrayElement, sizeof(uint32_t));
@@ -7558,280 +6979,273 @@
 }
 
 void marshal_VkDescriptorUpdateTemplateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDescriptorUpdateTemplateCreateInfo* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkDescriptorUpdateTemplateCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkDescriptorUpdateTemplateCreateFlags*)&forMarshaling->flags, sizeof(VkDescriptorUpdateTemplateCreateFlags));
+    vkStream->write((VkDescriptorUpdateTemplateCreateFlags*)&forMarshaling->flags,
+                    sizeof(VkDescriptorUpdateTemplateCreateFlags));
     vkStream->write((uint32_t*)&forMarshaling->descriptorUpdateEntryCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->descriptorUpdateEntryCount; ++i)
-        {
-            marshal_VkDescriptorUpdateTemplateEntry(vkStream, rootType, (const VkDescriptorUpdateTemplateEntry*)(forMarshaling->pDescriptorUpdateEntries + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->descriptorUpdateEntryCount; ++i) {
+            marshal_VkDescriptorUpdateTemplateEntry(
+                vkStream, rootType,
+                (const VkDescriptorUpdateTemplateEntry*)(forMarshaling->pDescriptorUpdateEntries +
+                                                         i));
         }
     }
-    vkStream->write((VkDescriptorUpdateTemplateType*)&forMarshaling->templateType, sizeof(VkDescriptorUpdateTemplateType));
+    vkStream->write((VkDescriptorUpdateTemplateType*)&forMarshaling->templateType,
+                    sizeof(VkDescriptorUpdateTemplateType));
     uint64_t cgen_var_0;
-    vkStream->handleMapping()->mapHandles_VkDescriptorSetLayout_u64(&forMarshaling->descriptorSetLayout, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkDescriptorSetLayout_u64(
+        &forMarshaling->descriptorSetLayout, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->write((VkPipelineBindPoint*)&forMarshaling->pipelineBindPoint, sizeof(VkPipelineBindPoint));
+    vkStream->write((VkPipelineBindPoint*)&forMarshaling->pipelineBindPoint,
+                    sizeof(VkPipelineBindPoint));
     uint64_t cgen_var_1;
-    vkStream->handleMapping()->mapHandles_VkPipelineLayout_u64(&forMarshaling->pipelineLayout, &cgen_var_1, 1);
+    vkStream->handleMapping()->mapHandles_VkPipelineLayout_u64(&forMarshaling->pipelineLayout,
+                                                               &cgen_var_1, 1);
     vkStream->write((uint64_t*)&cgen_var_1, 1 * 8);
     vkStream->write((uint32_t*)&forMarshaling->set, sizeof(uint32_t));
 }
 
 void unmarshal_VkDescriptorUpdateTemplateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorUpdateTemplateCreateInfo* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDescriptorUpdateTemplateCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkDescriptorUpdateTemplateCreateFlags*)&forUnmarshaling->flags, sizeof(VkDescriptorUpdateTemplateCreateFlags));
+    vkStream->read((VkDescriptorUpdateTemplateCreateFlags*)&forUnmarshaling->flags,
+                   sizeof(VkDescriptorUpdateTemplateCreateFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->descriptorUpdateEntryCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pDescriptorUpdateEntries, forUnmarshaling->descriptorUpdateEntryCount * sizeof(const VkDescriptorUpdateTemplateEntry));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->descriptorUpdateEntryCount; ++i)
-        {
-            unmarshal_VkDescriptorUpdateTemplateEntry(vkStream, rootType, (VkDescriptorUpdateTemplateEntry*)(forUnmarshaling->pDescriptorUpdateEntries + i));
+    vkStream->alloc((void**)&forUnmarshaling->pDescriptorUpdateEntries,
+                    forUnmarshaling->descriptorUpdateEntryCount *
+                        sizeof(const VkDescriptorUpdateTemplateEntry));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->descriptorUpdateEntryCount; ++i) {
+            unmarshal_VkDescriptorUpdateTemplateEntry(
+                vkStream, rootType,
+                (VkDescriptorUpdateTemplateEntry*)(forUnmarshaling->pDescriptorUpdateEntries + i));
         }
     }
-    vkStream->read((VkDescriptorUpdateTemplateType*)&forUnmarshaling->templateType, sizeof(VkDescriptorUpdateTemplateType));
+    vkStream->read((VkDescriptorUpdateTemplateType*)&forUnmarshaling->templateType,
+                   sizeof(VkDescriptorUpdateTemplateType));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkDescriptorSetLayout(&cgen_var_0, (VkDescriptorSetLayout*)&forUnmarshaling->descriptorSetLayout, 1);
-    vkStream->read((VkPipelineBindPoint*)&forUnmarshaling->pipelineBindPoint, sizeof(VkPipelineBindPoint));
+    vkStream->handleMapping()->mapHandles_u64_VkDescriptorSetLayout(
+        &cgen_var_0, (VkDescriptorSetLayout*)&forUnmarshaling->descriptorSetLayout, 1);
+    vkStream->read((VkPipelineBindPoint*)&forUnmarshaling->pipelineBindPoint,
+                   sizeof(VkPipelineBindPoint));
     uint64_t cgen_var_1;
     vkStream->read((uint64_t*)&cgen_var_1, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkPipelineLayout(&cgen_var_1, (VkPipelineLayout*)&forUnmarshaling->pipelineLayout, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkPipelineLayout(
+        &cgen_var_1, (VkPipelineLayout*)&forUnmarshaling->pipelineLayout, 1);
     vkStream->read((uint32_t*)&forUnmarshaling->set, sizeof(uint32_t));
 }
 
-void marshal_VkExternalMemoryProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkExternalMemoryProperties* forMarshaling)
-{
+void marshal_VkExternalMemoryProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                        const VkExternalMemoryProperties* forMarshaling) {
     (void)rootType;
-    vkStream->write((VkExternalMemoryFeatureFlags*)&forMarshaling->externalMemoryFeatures, sizeof(VkExternalMemoryFeatureFlags));
-    vkStream->write((VkExternalMemoryHandleTypeFlags*)&forMarshaling->exportFromImportedHandleTypes, sizeof(VkExternalMemoryHandleTypeFlags));
-    vkStream->write((VkExternalMemoryHandleTypeFlags*)&forMarshaling->compatibleHandleTypes, sizeof(VkExternalMemoryHandleTypeFlags));
+    vkStream->write((VkExternalMemoryFeatureFlags*)&forMarshaling->externalMemoryFeatures,
+                    sizeof(VkExternalMemoryFeatureFlags));
+    vkStream->write((VkExternalMemoryHandleTypeFlags*)&forMarshaling->exportFromImportedHandleTypes,
+                    sizeof(VkExternalMemoryHandleTypeFlags));
+    vkStream->write((VkExternalMemoryHandleTypeFlags*)&forMarshaling->compatibleHandleTypes,
+                    sizeof(VkExternalMemoryHandleTypeFlags));
 }
 
-void unmarshal_VkExternalMemoryProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalMemoryProperties* forUnmarshaling)
-{
+void unmarshal_VkExternalMemoryProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkExternalMemoryProperties* forUnmarshaling) {
     (void)rootType;
-    vkStream->read((VkExternalMemoryFeatureFlags*)&forUnmarshaling->externalMemoryFeatures, sizeof(VkExternalMemoryFeatureFlags));
-    vkStream->read((VkExternalMemoryHandleTypeFlags*)&forUnmarshaling->exportFromImportedHandleTypes, sizeof(VkExternalMemoryHandleTypeFlags));
-    vkStream->read((VkExternalMemoryHandleTypeFlags*)&forUnmarshaling->compatibleHandleTypes, sizeof(VkExternalMemoryHandleTypeFlags));
+    vkStream->read((VkExternalMemoryFeatureFlags*)&forUnmarshaling->externalMemoryFeatures,
+                   sizeof(VkExternalMemoryFeatureFlags));
+    vkStream->read(
+        (VkExternalMemoryHandleTypeFlags*)&forUnmarshaling->exportFromImportedHandleTypes,
+        sizeof(VkExternalMemoryHandleTypeFlags));
+    vkStream->read((VkExternalMemoryHandleTypeFlags*)&forUnmarshaling->compatibleHandleTypes,
+                   sizeof(VkExternalMemoryHandleTypeFlags));
 }
 
 void marshal_VkPhysicalDeviceExternalImageFormatInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceExternalImageFormatInfo* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceExternalImageFormatInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkExternalMemoryHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    vkStream->write((VkExternalMemoryHandleTypeFlagBits*)&forMarshaling->handleType,
+                    sizeof(VkExternalMemoryHandleTypeFlagBits));
 }
 
 void unmarshal_VkPhysicalDeviceExternalImageFormatInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceExternalImageFormatInfo* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceExternalImageFormatInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    vkStream->read((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType,
+                   sizeof(VkExternalMemoryHandleTypeFlagBits));
 }
 
-void marshal_VkExternalImageFormatProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkExternalImageFormatProperties* forMarshaling)
-{
+void marshal_VkExternalImageFormatProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkExternalImageFormatProperties* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    marshal_VkExternalMemoryProperties(vkStream, rootType, (VkExternalMemoryProperties*)(&forMarshaling->externalMemoryProperties));
+    marshal_VkExternalMemoryProperties(
+        vkStream, rootType,
+        (VkExternalMemoryProperties*)(&forMarshaling->externalMemoryProperties));
 }
 
-void unmarshal_VkExternalImageFormatProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalImageFormatProperties* forUnmarshaling)
-{
+void unmarshal_VkExternalImageFormatProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkExternalImageFormatProperties* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    unmarshal_VkExternalMemoryProperties(vkStream, rootType, (VkExternalMemoryProperties*)(&forUnmarshaling->externalMemoryProperties));
+    unmarshal_VkExternalMemoryProperties(
+        vkStream, rootType,
+        (VkExternalMemoryProperties*)(&forUnmarshaling->externalMemoryProperties));
 }
 
 void marshal_VkPhysicalDeviceExternalBufferInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceExternalBufferInfo* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceExternalBufferInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBufferCreateFlags*)&forMarshaling->flags, sizeof(VkBufferCreateFlags));
     vkStream->write((VkBufferUsageFlags*)&forMarshaling->usage, sizeof(VkBufferUsageFlags));
-    vkStream->write((VkExternalMemoryHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    vkStream->write((VkExternalMemoryHandleTypeFlagBits*)&forMarshaling->handleType,
+                    sizeof(VkExternalMemoryHandleTypeFlagBits));
 }
 
 void unmarshal_VkPhysicalDeviceExternalBufferInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceExternalBufferInfo* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceExternalBufferInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkBufferCreateFlags*)&forUnmarshaling->flags, sizeof(VkBufferCreateFlags));
     vkStream->read((VkBufferUsageFlags*)&forUnmarshaling->usage, sizeof(VkBufferUsageFlags));
-    vkStream->read((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    vkStream->read((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType,
+                   sizeof(VkExternalMemoryHandleTypeFlagBits));
 }
 
-void marshal_VkExternalBufferProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkExternalBufferProperties* forMarshaling)
-{
+void marshal_VkExternalBufferProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                        const VkExternalBufferProperties* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    marshal_VkExternalMemoryProperties(vkStream, rootType, (VkExternalMemoryProperties*)(&forMarshaling->externalMemoryProperties));
+    marshal_VkExternalMemoryProperties(
+        vkStream, rootType,
+        (VkExternalMemoryProperties*)(&forMarshaling->externalMemoryProperties));
 }
 
-void unmarshal_VkExternalBufferProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalBufferProperties* forUnmarshaling)
-{
+void unmarshal_VkExternalBufferProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkExternalBufferProperties* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    unmarshal_VkExternalMemoryProperties(vkStream, rootType, (VkExternalMemoryProperties*)(&forUnmarshaling->externalMemoryProperties));
+    unmarshal_VkExternalMemoryProperties(
+        vkStream, rootType,
+        (VkExternalMemoryProperties*)(&forUnmarshaling->externalMemoryProperties));
 }
 
-void marshal_VkPhysicalDeviceIDProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceIDProperties* forMarshaling)
-{
+void marshal_VkPhysicalDeviceIDProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                          const VkPhysicalDeviceIDProperties* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -7842,26 +7256,23 @@
     vkStream->write((VkBool32*)&forMarshaling->deviceLUIDValid, sizeof(VkBool32));
 }
 
-void unmarshal_VkPhysicalDeviceIDProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceIDProperties* forUnmarshaling)
-{
+void unmarshal_VkPhysicalDeviceIDProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkPhysicalDeviceIDProperties* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -7872,392 +7283,359 @@
     vkStream->read((VkBool32*)&forUnmarshaling->deviceLUIDValid, sizeof(VkBool32));
 }
 
-void marshal_VkExternalMemoryImageCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkExternalMemoryImageCreateInfo* forMarshaling)
-{
+void marshal_VkExternalMemoryImageCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkExternalMemoryImageCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkExternalMemoryHandleTypeFlags*)&forMarshaling->handleTypes, sizeof(VkExternalMemoryHandleTypeFlags));
+    vkStream->write((VkExternalMemoryHandleTypeFlags*)&forMarshaling->handleTypes,
+                    sizeof(VkExternalMemoryHandleTypeFlags));
 }
 
-void unmarshal_VkExternalMemoryImageCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalMemoryImageCreateInfo* forUnmarshaling)
-{
+void unmarshal_VkExternalMemoryImageCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkExternalMemoryImageCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkExternalMemoryHandleTypeFlags*)&forUnmarshaling->handleTypes, sizeof(VkExternalMemoryHandleTypeFlags));
+    vkStream->read((VkExternalMemoryHandleTypeFlags*)&forUnmarshaling->handleTypes,
+                   sizeof(VkExternalMemoryHandleTypeFlags));
 }
 
 void marshal_VkExternalMemoryBufferCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkExternalMemoryBufferCreateInfo* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkExternalMemoryBufferCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkExternalMemoryHandleTypeFlags*)&forMarshaling->handleTypes, sizeof(VkExternalMemoryHandleTypeFlags));
+    vkStream->write((VkExternalMemoryHandleTypeFlags*)&forMarshaling->handleTypes,
+                    sizeof(VkExternalMemoryHandleTypeFlags));
 }
 
-void unmarshal_VkExternalMemoryBufferCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalMemoryBufferCreateInfo* forUnmarshaling)
-{
+void unmarshal_VkExternalMemoryBufferCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkExternalMemoryBufferCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkExternalMemoryHandleTypeFlags*)&forUnmarshaling->handleTypes, sizeof(VkExternalMemoryHandleTypeFlags));
+    vkStream->read((VkExternalMemoryHandleTypeFlags*)&forUnmarshaling->handleTypes,
+                   sizeof(VkExternalMemoryHandleTypeFlags));
 }
 
-void marshal_VkExportMemoryAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkExportMemoryAllocateInfo* forMarshaling)
-{
+void marshal_VkExportMemoryAllocateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                        const VkExportMemoryAllocateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkExternalMemoryHandleTypeFlags*)&forMarshaling->handleTypes, sizeof(VkExternalMemoryHandleTypeFlags));
+    vkStream->write((VkExternalMemoryHandleTypeFlags*)&forMarshaling->handleTypes,
+                    sizeof(VkExternalMemoryHandleTypeFlags));
 }
 
-void unmarshal_VkExportMemoryAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExportMemoryAllocateInfo* forUnmarshaling)
-{
+void unmarshal_VkExportMemoryAllocateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkExportMemoryAllocateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkExternalMemoryHandleTypeFlags*)&forUnmarshaling->handleTypes, sizeof(VkExternalMemoryHandleTypeFlags));
+    vkStream->read((VkExternalMemoryHandleTypeFlags*)&forUnmarshaling->handleTypes,
+                   sizeof(VkExternalMemoryHandleTypeFlags));
 }
 
 void marshal_VkPhysicalDeviceExternalFenceInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceExternalFenceInfo* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceExternalFenceInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkExternalFenceHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalFenceHandleTypeFlagBits));
+    vkStream->write((VkExternalFenceHandleTypeFlagBits*)&forMarshaling->handleType,
+                    sizeof(VkExternalFenceHandleTypeFlagBits));
 }
 
 void unmarshal_VkPhysicalDeviceExternalFenceInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceExternalFenceInfo* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceExternalFenceInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkExternalFenceHandleTypeFlagBits*)&forUnmarshaling->handleType, sizeof(VkExternalFenceHandleTypeFlagBits));
+    vkStream->read((VkExternalFenceHandleTypeFlagBits*)&forUnmarshaling->handleType,
+                   sizeof(VkExternalFenceHandleTypeFlagBits));
 }
 
-void marshal_VkExternalFenceProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkExternalFenceProperties* forMarshaling)
-{
+void marshal_VkExternalFenceProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkExternalFenceProperties* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkExternalFenceHandleTypeFlags*)&forMarshaling->exportFromImportedHandleTypes, sizeof(VkExternalFenceHandleTypeFlags));
-    vkStream->write((VkExternalFenceHandleTypeFlags*)&forMarshaling->compatibleHandleTypes, sizeof(VkExternalFenceHandleTypeFlags));
-    vkStream->write((VkExternalFenceFeatureFlags*)&forMarshaling->externalFenceFeatures, sizeof(VkExternalFenceFeatureFlags));
+    vkStream->write((VkExternalFenceHandleTypeFlags*)&forMarshaling->exportFromImportedHandleTypes,
+                    sizeof(VkExternalFenceHandleTypeFlags));
+    vkStream->write((VkExternalFenceHandleTypeFlags*)&forMarshaling->compatibleHandleTypes,
+                    sizeof(VkExternalFenceHandleTypeFlags));
+    vkStream->write((VkExternalFenceFeatureFlags*)&forMarshaling->externalFenceFeatures,
+                    sizeof(VkExternalFenceFeatureFlags));
 }
 
-void unmarshal_VkExternalFenceProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalFenceProperties* forUnmarshaling)
-{
+void unmarshal_VkExternalFenceProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkExternalFenceProperties* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkExternalFenceHandleTypeFlags*)&forUnmarshaling->exportFromImportedHandleTypes, sizeof(VkExternalFenceHandleTypeFlags));
-    vkStream->read((VkExternalFenceHandleTypeFlags*)&forUnmarshaling->compatibleHandleTypes, sizeof(VkExternalFenceHandleTypeFlags));
-    vkStream->read((VkExternalFenceFeatureFlags*)&forUnmarshaling->externalFenceFeatures, sizeof(VkExternalFenceFeatureFlags));
+    vkStream->read((VkExternalFenceHandleTypeFlags*)&forUnmarshaling->exportFromImportedHandleTypes,
+                   sizeof(VkExternalFenceHandleTypeFlags));
+    vkStream->read((VkExternalFenceHandleTypeFlags*)&forUnmarshaling->compatibleHandleTypes,
+                   sizeof(VkExternalFenceHandleTypeFlags));
+    vkStream->read((VkExternalFenceFeatureFlags*)&forUnmarshaling->externalFenceFeatures,
+                   sizeof(VkExternalFenceFeatureFlags));
 }
 
-void marshal_VkExportFenceCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkExportFenceCreateInfo* forMarshaling)
-{
+void marshal_VkExportFenceCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkExportFenceCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkExternalFenceHandleTypeFlags*)&forMarshaling->handleTypes, sizeof(VkExternalFenceHandleTypeFlags));
+    vkStream->write((VkExternalFenceHandleTypeFlags*)&forMarshaling->handleTypes,
+                    sizeof(VkExternalFenceHandleTypeFlags));
 }
 
-void unmarshal_VkExportFenceCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExportFenceCreateInfo* forUnmarshaling)
-{
+void unmarshal_VkExportFenceCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkExportFenceCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkExternalFenceHandleTypeFlags*)&forUnmarshaling->handleTypes, sizeof(VkExternalFenceHandleTypeFlags));
+    vkStream->read((VkExternalFenceHandleTypeFlags*)&forUnmarshaling->handleTypes,
+                   sizeof(VkExternalFenceHandleTypeFlags));
 }
 
-void marshal_VkExportSemaphoreCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkExportSemaphoreCreateInfo* forMarshaling)
-{
+void marshal_VkExportSemaphoreCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkExportSemaphoreCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkExternalSemaphoreHandleTypeFlags*)&forMarshaling->handleTypes, sizeof(VkExternalSemaphoreHandleTypeFlags));
+    vkStream->write((VkExternalSemaphoreHandleTypeFlags*)&forMarshaling->handleTypes,
+                    sizeof(VkExternalSemaphoreHandleTypeFlags));
 }
 
-void unmarshal_VkExportSemaphoreCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExportSemaphoreCreateInfo* forUnmarshaling)
-{
+void unmarshal_VkExportSemaphoreCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkExportSemaphoreCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkExternalSemaphoreHandleTypeFlags*)&forUnmarshaling->handleTypes, sizeof(VkExternalSemaphoreHandleTypeFlags));
+    vkStream->read((VkExternalSemaphoreHandleTypeFlags*)&forUnmarshaling->handleTypes,
+                   sizeof(VkExternalSemaphoreHandleTypeFlags));
 }
 
 void marshal_VkPhysicalDeviceExternalSemaphoreInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceExternalSemaphoreInfo* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceExternalSemaphoreInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkExternalSemaphoreHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalSemaphoreHandleTypeFlagBits));
+    vkStream->write((VkExternalSemaphoreHandleTypeFlagBits*)&forMarshaling->handleType,
+                    sizeof(VkExternalSemaphoreHandleTypeFlagBits));
 }
 
 void unmarshal_VkPhysicalDeviceExternalSemaphoreInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceExternalSemaphoreInfo* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceExternalSemaphoreInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkExternalSemaphoreHandleTypeFlagBits*)&forUnmarshaling->handleType, sizeof(VkExternalSemaphoreHandleTypeFlagBits));
+    vkStream->read((VkExternalSemaphoreHandleTypeFlagBits*)&forUnmarshaling->handleType,
+                   sizeof(VkExternalSemaphoreHandleTypeFlagBits));
 }
 
-void marshal_VkExternalSemaphoreProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkExternalSemaphoreProperties* forMarshaling)
-{
+void marshal_VkExternalSemaphoreProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkExternalSemaphoreProperties* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkExternalSemaphoreHandleTypeFlags*)&forMarshaling->exportFromImportedHandleTypes, sizeof(VkExternalSemaphoreHandleTypeFlags));
-    vkStream->write((VkExternalSemaphoreHandleTypeFlags*)&forMarshaling->compatibleHandleTypes, sizeof(VkExternalSemaphoreHandleTypeFlags));
-    vkStream->write((VkExternalSemaphoreFeatureFlags*)&forMarshaling->externalSemaphoreFeatures, sizeof(VkExternalSemaphoreFeatureFlags));
+    vkStream->write(
+        (VkExternalSemaphoreHandleTypeFlags*)&forMarshaling->exportFromImportedHandleTypes,
+        sizeof(VkExternalSemaphoreHandleTypeFlags));
+    vkStream->write((VkExternalSemaphoreHandleTypeFlags*)&forMarshaling->compatibleHandleTypes,
+                    sizeof(VkExternalSemaphoreHandleTypeFlags));
+    vkStream->write((VkExternalSemaphoreFeatureFlags*)&forMarshaling->externalSemaphoreFeatures,
+                    sizeof(VkExternalSemaphoreFeatureFlags));
 }
 
-void unmarshal_VkExternalSemaphoreProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalSemaphoreProperties* forUnmarshaling)
-{
+void unmarshal_VkExternalSemaphoreProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkExternalSemaphoreProperties* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkExternalSemaphoreHandleTypeFlags*)&forUnmarshaling->exportFromImportedHandleTypes, sizeof(VkExternalSemaphoreHandleTypeFlags));
-    vkStream->read((VkExternalSemaphoreHandleTypeFlags*)&forUnmarshaling->compatibleHandleTypes, sizeof(VkExternalSemaphoreHandleTypeFlags));
-    vkStream->read((VkExternalSemaphoreFeatureFlags*)&forUnmarshaling->externalSemaphoreFeatures, sizeof(VkExternalSemaphoreFeatureFlags));
+    vkStream->read(
+        (VkExternalSemaphoreHandleTypeFlags*)&forUnmarshaling->exportFromImportedHandleTypes,
+        sizeof(VkExternalSemaphoreHandleTypeFlags));
+    vkStream->read((VkExternalSemaphoreHandleTypeFlags*)&forUnmarshaling->compatibleHandleTypes,
+                   sizeof(VkExternalSemaphoreHandleTypeFlags));
+    vkStream->read((VkExternalSemaphoreFeatureFlags*)&forUnmarshaling->externalSemaphoreFeatures,
+                   sizeof(VkExternalSemaphoreFeatureFlags));
 }
 
 void marshal_VkPhysicalDeviceMaintenance3Properties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceMaintenance3Properties* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceMaintenance3Properties* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -8266,25 +7644,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceMaintenance3Properties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMaintenance3Properties* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMaintenance3Properties* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -8292,41 +7668,34 @@
     vkStream->read((VkDeviceSize*)&forUnmarshaling->maxMemoryAllocationSize, sizeof(VkDeviceSize));
 }
 
-void marshal_VkDescriptorSetLayoutSupport(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDescriptorSetLayoutSupport* forMarshaling)
-{
+void marshal_VkDescriptorSetLayoutSupport(VulkanStream* vkStream, VkStructureType rootType,
+                                          const VkDescriptorSetLayoutSupport* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->supported, sizeof(VkBool32));
 }
 
-void unmarshal_VkDescriptorSetLayoutSupport(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorSetLayoutSupport* forUnmarshaling)
-{
+void unmarshal_VkDescriptorSetLayoutSupport(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkDescriptorSetLayoutSupport* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -8334,14 +7703,11 @@
 }
 
 void marshal_VkPhysicalDeviceShaderDrawParametersFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceShaderDrawParametersFeatures* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceShaderDrawParametersFeatures* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -8349,25 +7715,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceShaderDrawParametersFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderDrawParametersFeatures* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderDrawParametersFeatures* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -8377,19 +7741,17 @@
 #endif
 #ifdef VK_VERSION_1_2
 void marshal_VkPhysicalDeviceVulkan11Features(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceVulkan11Features* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceVulkan11Features* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->storageBuffer16BitAccess, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->uniformAndStorageBuffer16BitAccess, sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->uniformAndStorageBuffer16BitAccess,
+                    sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->storagePushConstant16, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->storageInputOutput16, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->multiview, sizeof(VkBool32));
@@ -8402,31 +7764,29 @@
     vkStream->write((VkBool32*)&forMarshaling->shaderDrawParameters, sizeof(VkBool32));
 }
 
-void unmarshal_VkPhysicalDeviceVulkan11Features(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceVulkan11Features* forUnmarshaling)
-{
+void unmarshal_VkPhysicalDeviceVulkan11Features(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkPhysicalDeviceVulkan11Features* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkBool32*)&forUnmarshaling->storageBuffer16BitAccess, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->uniformAndStorageBuffer16BitAccess, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->uniformAndStorageBuffer16BitAccess,
+                   sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->storagePushConstant16, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->storageInputOutput16, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->multiview, sizeof(VkBool32));
@@ -8440,14 +7800,11 @@
 }
 
 void marshal_VkPhysicalDeviceVulkan11Properties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceVulkan11Properties* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceVulkan11Properties* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -8457,10 +7814,13 @@
     vkStream->write((uint32_t*)&forMarshaling->deviceNodeMask, sizeof(uint32_t));
     vkStream->write((VkBool32*)&forMarshaling->deviceLUIDValid, sizeof(VkBool32));
     vkStream->write((uint32_t*)&forMarshaling->subgroupSize, sizeof(uint32_t));
-    vkStream->write((VkShaderStageFlags*)&forMarshaling->subgroupSupportedStages, sizeof(VkShaderStageFlags));
-    vkStream->write((VkSubgroupFeatureFlags*)&forMarshaling->subgroupSupportedOperations, sizeof(VkSubgroupFeatureFlags));
+    vkStream->write((VkShaderStageFlags*)&forMarshaling->subgroupSupportedStages,
+                    sizeof(VkShaderStageFlags));
+    vkStream->write((VkSubgroupFeatureFlags*)&forMarshaling->subgroupSupportedOperations,
+                    sizeof(VkSubgroupFeatureFlags));
     vkStream->write((VkBool32*)&forMarshaling->subgroupQuadOperationsInAllStages, sizeof(VkBool32));
-    vkStream->write((VkPointClippingBehavior*)&forMarshaling->pointClippingBehavior, sizeof(VkPointClippingBehavior));
+    vkStream->write((VkPointClippingBehavior*)&forMarshaling->pointClippingBehavior,
+                    sizeof(VkPointClippingBehavior));
     vkStream->write((uint32_t*)&forMarshaling->maxMultiviewViewCount, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxMultiviewInstanceIndex, sizeof(uint32_t));
     vkStream->write((VkBool32*)&forMarshaling->protectedNoFault, sizeof(VkBool32));
@@ -8469,25 +7829,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceVulkan11Properties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceVulkan11Properties* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceVulkan11Properties* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -8497,10 +7855,14 @@
     vkStream->read((uint32_t*)&forUnmarshaling->deviceNodeMask, sizeof(uint32_t));
     vkStream->read((VkBool32*)&forUnmarshaling->deviceLUIDValid, sizeof(VkBool32));
     vkStream->read((uint32_t*)&forUnmarshaling->subgroupSize, sizeof(uint32_t));
-    vkStream->read((VkShaderStageFlags*)&forUnmarshaling->subgroupSupportedStages, sizeof(VkShaderStageFlags));
-    vkStream->read((VkSubgroupFeatureFlags*)&forUnmarshaling->subgroupSupportedOperations, sizeof(VkSubgroupFeatureFlags));
-    vkStream->read((VkBool32*)&forUnmarshaling->subgroupQuadOperationsInAllStages, sizeof(VkBool32));
-    vkStream->read((VkPointClippingBehavior*)&forUnmarshaling->pointClippingBehavior, sizeof(VkPointClippingBehavior));
+    vkStream->read((VkShaderStageFlags*)&forUnmarshaling->subgroupSupportedStages,
+                   sizeof(VkShaderStageFlags));
+    vkStream->read((VkSubgroupFeatureFlags*)&forUnmarshaling->subgroupSupportedOperations,
+                   sizeof(VkSubgroupFeatureFlags));
+    vkStream->read((VkBool32*)&forUnmarshaling->subgroupQuadOperationsInAllStages,
+                   sizeof(VkBool32));
+    vkStream->read((VkPointClippingBehavior*)&forUnmarshaling->pointClippingBehavior,
+                   sizeof(VkPointClippingBehavior));
     vkStream->read((uint32_t*)&forUnmarshaling->maxMultiviewViewCount, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxMultiviewInstanceIndex, sizeof(uint32_t));
     vkStream->read((VkBool32*)&forUnmarshaling->protectedNoFault, sizeof(VkBool32));
@@ -8509,14 +7871,11 @@
 }
 
 void marshal_VkPhysicalDeviceVulkan12Features(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceVulkan12Features* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceVulkan12Features* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -8530,25 +7889,43 @@
     vkStream->write((VkBool32*)&forMarshaling->shaderFloat16, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->shaderInt8, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->descriptorIndexing, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderInputAttachmentArrayDynamicIndexing, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderUniformTexelBufferArrayDynamicIndexing, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderStorageTexelBufferArrayDynamicIndexing, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderUniformBufferArrayNonUniformIndexing, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderSampledImageArrayNonUniformIndexing, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderStorageBufferArrayNonUniformIndexing, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderStorageImageArrayNonUniformIndexing, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderInputAttachmentArrayNonUniformIndexing, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderUniformTexelBufferArrayNonUniformIndexing, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderStorageTexelBufferArrayNonUniformIndexing, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->descriptorBindingUniformBufferUpdateAfterBind, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->descriptorBindingSampledImageUpdateAfterBind, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->descriptorBindingStorageImageUpdateAfterBind, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->descriptorBindingStorageBufferUpdateAfterBind, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->descriptorBindingUniformTexelBufferUpdateAfterBind, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->descriptorBindingStorageTexelBufferUpdateAfterBind, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->descriptorBindingUpdateUnusedWhilePending, sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderInputAttachmentArrayDynamicIndexing,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderUniformTexelBufferArrayDynamicIndexing,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderStorageTexelBufferArrayDynamicIndexing,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderUniformBufferArrayNonUniformIndexing,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderSampledImageArrayNonUniformIndexing,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderStorageBufferArrayNonUniformIndexing,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderStorageImageArrayNonUniformIndexing,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderInputAttachmentArrayNonUniformIndexing,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderUniformTexelBufferArrayNonUniformIndexing,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderStorageTexelBufferArrayNonUniformIndexing,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->descriptorBindingUniformBufferUpdateAfterBind,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->descriptorBindingSampledImageUpdateAfterBind,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->descriptorBindingStorageImageUpdateAfterBind,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->descriptorBindingStorageBufferUpdateAfterBind,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->descriptorBindingUniformTexelBufferUpdateAfterBind,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->descriptorBindingStorageTexelBufferUpdateAfterBind,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->descriptorBindingUpdateUnusedWhilePending,
+                    sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->descriptorBindingPartiallyBound, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->descriptorBindingVariableDescriptorCount, sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->descriptorBindingVariableDescriptorCount,
+                    sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->runtimeDescriptorArray, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->samplerFilterMinmax, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->scalarBlockLayout, sizeof(VkBool32));
@@ -8563,64 +7940,81 @@
     vkStream->write((VkBool32*)&forMarshaling->bufferDeviceAddressMultiDevice, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->vulkanMemoryModel, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->vulkanMemoryModelDeviceScope, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->vulkanMemoryModelAvailabilityVisibilityChains, sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->vulkanMemoryModelAvailabilityVisibilityChains,
+                    sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->shaderOutputViewportIndex, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->shaderOutputLayer, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->subgroupBroadcastDynamicId, sizeof(VkBool32));
 }
 
-void unmarshal_VkPhysicalDeviceVulkan12Features(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceVulkan12Features* forUnmarshaling)
-{
+void unmarshal_VkPhysicalDeviceVulkan12Features(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkPhysicalDeviceVulkan12Features* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkBool32*)&forUnmarshaling->samplerMirrorClampToEdge, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->drawIndirectCount, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->storageBuffer8BitAccess, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->uniformAndStorageBuffer8BitAccess, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->uniformAndStorageBuffer8BitAccess,
+                   sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->storagePushConstant8, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->shaderBufferInt64Atomics, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->shaderSharedInt64Atomics, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->shaderFloat16, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->shaderInt8, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->descriptorIndexing, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderInputAttachmentArrayDynamicIndexing, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderUniformTexelBufferArrayDynamicIndexing, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderStorageTexelBufferArrayDynamicIndexing, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderUniformBufferArrayNonUniformIndexing, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderSampledImageArrayNonUniformIndexing, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderStorageBufferArrayNonUniformIndexing, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderStorageImageArrayNonUniformIndexing, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderInputAttachmentArrayNonUniformIndexing, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderUniformTexelBufferArrayNonUniformIndexing, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderStorageTexelBufferArrayNonUniformIndexing, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingUniformBufferUpdateAfterBind, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingSampledImageUpdateAfterBind, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingStorageImageUpdateAfterBind, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingStorageBufferUpdateAfterBind, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingUniformTexelBufferUpdateAfterBind, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingStorageTexelBufferUpdateAfterBind, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingUpdateUnusedWhilePending, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderInputAttachmentArrayDynamicIndexing,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderUniformTexelBufferArrayDynamicIndexing,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderStorageTexelBufferArrayDynamicIndexing,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderUniformBufferArrayNonUniformIndexing,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderSampledImageArrayNonUniformIndexing,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderStorageBufferArrayNonUniformIndexing,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderStorageImageArrayNonUniformIndexing,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderInputAttachmentArrayNonUniformIndexing,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderUniformTexelBufferArrayNonUniformIndexing,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderStorageTexelBufferArrayNonUniformIndexing,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingUniformBufferUpdateAfterBind,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingSampledImageUpdateAfterBind,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingStorageImageUpdateAfterBind,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingStorageBufferUpdateAfterBind,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingUniformTexelBufferUpdateAfterBind,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingStorageTexelBufferUpdateAfterBind,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingUpdateUnusedWhilePending,
+                   sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingPartiallyBound, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingVariableDescriptorCount, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingVariableDescriptorCount,
+                   sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->runtimeDescriptorArray, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->samplerFilterMinmax, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->scalarBlockLayout, sizeof(VkBool32));
@@ -8635,17 +8029,15 @@
     vkStream->read((VkBool32*)&forUnmarshaling->bufferDeviceAddressMultiDevice, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->vulkanMemoryModel, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->vulkanMemoryModelDeviceScope, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->vulkanMemoryModelAvailabilityVisibilityChains, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->vulkanMemoryModelAvailabilityVisibilityChains,
+                   sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->shaderOutputViewportIndex, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->shaderOutputLayer, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->subgroupBroadcastDynamicId, sizeof(VkBool32));
 }
 
-void marshal_VkConformanceVersion(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkConformanceVersion* forMarshaling)
-{
+void marshal_VkConformanceVersion(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkConformanceVersion* forMarshaling) {
     (void)rootType;
     vkStream->write((uint8_t*)&forMarshaling->major, sizeof(uint8_t));
     vkStream->write((uint8_t*)&forMarshaling->minor, sizeof(uint8_t));
@@ -8653,11 +8045,8 @@
     vkStream->write((uint8_t*)&forMarshaling->patch, sizeof(uint8_t));
 }
 
-void unmarshal_VkConformanceVersion(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkConformanceVersion* forUnmarshaling)
-{
+void unmarshal_VkConformanceVersion(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkConformanceVersion* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint8_t*)&forUnmarshaling->major, sizeof(uint8_t));
     vkStream->read((uint8_t*)&forUnmarshaling->minor, sizeof(uint8_t));
@@ -8666,26 +8055,29 @@
 }
 
 void marshal_VkPhysicalDeviceVulkan12Properties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceVulkan12Properties* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceVulkan12Properties* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkDriverId*)&forMarshaling->driverID, sizeof(VkDriverId));
     vkStream->write((char*)forMarshaling->driverName, VK_MAX_DRIVER_NAME_SIZE * sizeof(char));
     vkStream->write((char*)forMarshaling->driverInfo, VK_MAX_DRIVER_INFO_SIZE * sizeof(char));
-    marshal_VkConformanceVersion(vkStream, rootType, (VkConformanceVersion*)(&forMarshaling->conformanceVersion));
-    vkStream->write((VkShaderFloatControlsIndependence*)&forMarshaling->denormBehaviorIndependence, sizeof(VkShaderFloatControlsIndependence));
-    vkStream->write((VkShaderFloatControlsIndependence*)&forMarshaling->roundingModeIndependence, sizeof(VkShaderFloatControlsIndependence));
-    vkStream->write((VkBool32*)&forMarshaling->shaderSignedZeroInfNanPreserveFloat16, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderSignedZeroInfNanPreserveFloat32, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderSignedZeroInfNanPreserveFloat64, sizeof(VkBool32));
+    marshal_VkConformanceVersion(vkStream, rootType,
+                                 (VkConformanceVersion*)(&forMarshaling->conformanceVersion));
+    vkStream->write((VkShaderFloatControlsIndependence*)&forMarshaling->denormBehaviorIndependence,
+                    sizeof(VkShaderFloatControlsIndependence));
+    vkStream->write((VkShaderFloatControlsIndependence*)&forMarshaling->roundingModeIndependence,
+                    sizeof(VkShaderFloatControlsIndependence));
+    vkStream->write((VkBool32*)&forMarshaling->shaderSignedZeroInfNanPreserveFloat16,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderSignedZeroInfNanPreserveFloat32,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderSignedZeroInfNanPreserveFloat64,
+                    sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->shaderDenormPreserveFloat16, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->shaderDenormPreserveFloat32, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->shaderDenormPreserveFloat64, sizeof(VkBool32));
@@ -8698,71 +8090,101 @@
     vkStream->write((VkBool32*)&forMarshaling->shaderRoundingModeRTZFloat16, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->shaderRoundingModeRTZFloat32, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->shaderRoundingModeRTZFloat64, sizeof(VkBool32));
-    vkStream->write((uint32_t*)&forMarshaling->maxUpdateAfterBindDescriptorsInAllPools, sizeof(uint32_t));
-    vkStream->write((VkBool32*)&forMarshaling->shaderUniformBufferArrayNonUniformIndexingNative, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderSampledImageArrayNonUniformIndexingNative, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderStorageBufferArrayNonUniformIndexingNative, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderStorageImageArrayNonUniformIndexingNative, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderInputAttachmentArrayNonUniformIndexingNative, sizeof(VkBool32));
+    vkStream->write((uint32_t*)&forMarshaling->maxUpdateAfterBindDescriptorsInAllPools,
+                    sizeof(uint32_t));
+    vkStream->write((VkBool32*)&forMarshaling->shaderUniformBufferArrayNonUniformIndexingNative,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderSampledImageArrayNonUniformIndexingNative,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderStorageBufferArrayNonUniformIndexingNative,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderStorageImageArrayNonUniformIndexingNative,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderInputAttachmentArrayNonUniformIndexingNative,
+                    sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->robustBufferAccessUpdateAfterBind, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->quadDivergentImplicitLod, sizeof(VkBool32));
-    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorUpdateAfterBindSamplers, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorUpdateAfterBindUniformBuffers, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorUpdateAfterBindStorageBuffers, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorUpdateAfterBindSampledImages, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorUpdateAfterBindStorageImages, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorUpdateAfterBindInputAttachments, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxPerStageUpdateAfterBindResources, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindSamplers, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindUniformBuffers, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindStorageBuffers, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindSampledImages, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindStorageImages, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindInputAttachments, sizeof(uint32_t));
-    vkStream->write((VkResolveModeFlags*)&forMarshaling->supportedDepthResolveModes, sizeof(VkResolveModeFlags));
-    vkStream->write((VkResolveModeFlags*)&forMarshaling->supportedStencilResolveModes, sizeof(VkResolveModeFlags));
+    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorUpdateAfterBindSamplers,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorUpdateAfterBindUniformBuffers,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorUpdateAfterBindStorageBuffers,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorUpdateAfterBindSampledImages,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorUpdateAfterBindStorageImages,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorUpdateAfterBindInputAttachments,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxPerStageUpdateAfterBindResources,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindSamplers,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindUniformBuffers,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindStorageBuffers,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindSampledImages,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindStorageImages,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindInputAttachments,
+                    sizeof(uint32_t));
+    vkStream->write((VkResolveModeFlags*)&forMarshaling->supportedDepthResolveModes,
+                    sizeof(VkResolveModeFlags));
+    vkStream->write((VkResolveModeFlags*)&forMarshaling->supportedStencilResolveModes,
+                    sizeof(VkResolveModeFlags));
     vkStream->write((VkBool32*)&forMarshaling->independentResolveNone, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->independentResolve, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->filterMinmaxSingleComponentFormats, sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->filterMinmaxSingleComponentFormats,
+                    sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->filterMinmaxImageComponentMapping, sizeof(VkBool32));
-    vkStream->write((uint64_t*)&forMarshaling->maxTimelineSemaphoreValueDifference, sizeof(uint64_t));
-    vkStream->write((VkSampleCountFlags*)&forMarshaling->framebufferIntegerColorSampleCounts, sizeof(VkSampleCountFlags));
+    vkStream->write((uint64_t*)&forMarshaling->maxTimelineSemaphoreValueDifference,
+                    sizeof(uint64_t));
+    vkStream->write((VkSampleCountFlags*)&forMarshaling->framebufferIntegerColorSampleCounts,
+                    sizeof(VkSampleCountFlags));
 }
 
 void unmarshal_VkPhysicalDeviceVulkan12Properties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceVulkan12Properties* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceVulkan12Properties* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkDriverId*)&forUnmarshaling->driverID, sizeof(VkDriverId));
     vkStream->read((char*)forUnmarshaling->driverName, VK_MAX_DRIVER_NAME_SIZE * sizeof(char));
     vkStream->read((char*)forUnmarshaling->driverInfo, VK_MAX_DRIVER_INFO_SIZE * sizeof(char));
-    unmarshal_VkConformanceVersion(vkStream, rootType, (VkConformanceVersion*)(&forUnmarshaling->conformanceVersion));
-    vkStream->read((VkShaderFloatControlsIndependence*)&forUnmarshaling->denormBehaviorIndependence, sizeof(VkShaderFloatControlsIndependence));
-    vkStream->read((VkShaderFloatControlsIndependence*)&forUnmarshaling->roundingModeIndependence, sizeof(VkShaderFloatControlsIndependence));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderSignedZeroInfNanPreserveFloat16, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderSignedZeroInfNanPreserveFloat32, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderSignedZeroInfNanPreserveFloat64, sizeof(VkBool32));
+    unmarshal_VkConformanceVersion(vkStream, rootType,
+                                   (VkConformanceVersion*)(&forUnmarshaling->conformanceVersion));
+    vkStream->read((VkShaderFloatControlsIndependence*)&forUnmarshaling->denormBehaviorIndependence,
+                   sizeof(VkShaderFloatControlsIndependence));
+    vkStream->read((VkShaderFloatControlsIndependence*)&forUnmarshaling->roundingModeIndependence,
+                   sizeof(VkShaderFloatControlsIndependence));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderSignedZeroInfNanPreserveFloat16,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderSignedZeroInfNanPreserveFloat32,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderSignedZeroInfNanPreserveFloat64,
+                   sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->shaderDenormPreserveFloat16, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->shaderDenormPreserveFloat32, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->shaderDenormPreserveFloat64, sizeof(VkBool32));
@@ -8775,149 +8197,171 @@
     vkStream->read((VkBool32*)&forUnmarshaling->shaderRoundingModeRTZFloat16, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->shaderRoundingModeRTZFloat32, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->shaderRoundingModeRTZFloat64, sizeof(VkBool32));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxUpdateAfterBindDescriptorsInAllPools, sizeof(uint32_t));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderUniformBufferArrayNonUniformIndexingNative, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderSampledImageArrayNonUniformIndexingNative, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderStorageBufferArrayNonUniformIndexingNative, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderStorageImageArrayNonUniformIndexingNative, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderInputAttachmentArrayNonUniformIndexingNative, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->robustBufferAccessUpdateAfterBind, sizeof(VkBool32));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxUpdateAfterBindDescriptorsInAllPools,
+                   sizeof(uint32_t));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderUniformBufferArrayNonUniformIndexingNative,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderSampledImageArrayNonUniformIndexingNative,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderStorageBufferArrayNonUniformIndexingNative,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderStorageImageArrayNonUniformIndexingNative,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderInputAttachmentArrayNonUniformIndexingNative,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->robustBufferAccessUpdateAfterBind,
+                   sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->quadDivergentImplicitLod, sizeof(VkBool32));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindSamplers, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindUniformBuffers, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindStorageBuffers, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindSampledImages, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindStorageImages, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindInputAttachments, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageUpdateAfterBindResources, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindSamplers, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindUniformBuffers, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindStorageBuffers, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindSampledImages, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindStorageImages, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindInputAttachments, sizeof(uint32_t));
-    vkStream->read((VkResolveModeFlags*)&forUnmarshaling->supportedDepthResolveModes, sizeof(VkResolveModeFlags));
-    vkStream->read((VkResolveModeFlags*)&forUnmarshaling->supportedStencilResolveModes, sizeof(VkResolveModeFlags));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindSamplers,
+                   sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindUniformBuffers,
+                   sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindStorageBuffers,
+                   sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindSampledImages,
+                   sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindStorageImages,
+                   sizeof(uint32_t));
+    vkStream->read(
+        (uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindInputAttachments,
+        sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageUpdateAfterBindResources,
+                   sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindSamplers,
+                   sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindUniformBuffers,
+                   sizeof(uint32_t));
+    vkStream->read(
+        (uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic,
+        sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindStorageBuffers,
+                   sizeof(uint32_t));
+    vkStream->read(
+        (uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic,
+        sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindSampledImages,
+                   sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindStorageImages,
+                   sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindInputAttachments,
+                   sizeof(uint32_t));
+    vkStream->read((VkResolveModeFlags*)&forUnmarshaling->supportedDepthResolveModes,
+                   sizeof(VkResolveModeFlags));
+    vkStream->read((VkResolveModeFlags*)&forUnmarshaling->supportedStencilResolveModes,
+                   sizeof(VkResolveModeFlags));
     vkStream->read((VkBool32*)&forUnmarshaling->independentResolveNone, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->independentResolve, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->filterMinmaxSingleComponentFormats, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->filterMinmaxImageComponentMapping, sizeof(VkBool32));
-    vkStream->read((uint64_t*)&forUnmarshaling->maxTimelineSemaphoreValueDifference, sizeof(uint64_t));
-    vkStream->read((VkSampleCountFlags*)&forUnmarshaling->framebufferIntegerColorSampleCounts, sizeof(VkSampleCountFlags));
+    vkStream->read((VkBool32*)&forUnmarshaling->filterMinmaxSingleComponentFormats,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->filterMinmaxImageComponentMapping,
+                   sizeof(VkBool32));
+    vkStream->read((uint64_t*)&forUnmarshaling->maxTimelineSemaphoreValueDifference,
+                   sizeof(uint64_t));
+    vkStream->read((VkSampleCountFlags*)&forUnmarshaling->framebufferIntegerColorSampleCounts,
+                   sizeof(VkSampleCountFlags));
 }
 
-void marshal_VkImageFormatListCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageFormatListCreateInfo* forMarshaling)
-{
+void marshal_VkImageFormatListCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkImageFormatListCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->viewFormatCount, sizeof(uint32_t));
-    vkStream->write((const VkFormat*)forMarshaling->pViewFormats, forMarshaling->viewFormatCount * sizeof(const VkFormat));
+    vkStream->write((const VkFormat*)forMarshaling->pViewFormats,
+                    forMarshaling->viewFormatCount * sizeof(const VkFormat));
 }
 
-void unmarshal_VkImageFormatListCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageFormatListCreateInfo* forUnmarshaling)
-{
+void unmarshal_VkImageFormatListCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkImageFormatListCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->viewFormatCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pViewFormats, forUnmarshaling->viewFormatCount * sizeof(const VkFormat));
-    vkStream->read((VkFormat*)forUnmarshaling->pViewFormats, forUnmarshaling->viewFormatCount * sizeof(const VkFormat));
+    vkStream->alloc((void**)&forUnmarshaling->pViewFormats,
+                    forUnmarshaling->viewFormatCount * sizeof(const VkFormat));
+    vkStream->read((VkFormat*)forUnmarshaling->pViewFormats,
+                   forUnmarshaling->viewFormatCount * sizeof(const VkFormat));
 }
 
-void marshal_VkAttachmentDescription2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAttachmentDescription2* forMarshaling)
-{
+void marshal_VkAttachmentDescription2(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkAttachmentDescription2* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkAttachmentDescriptionFlags*)&forMarshaling->flags, sizeof(VkAttachmentDescriptionFlags));
+    vkStream->write((VkAttachmentDescriptionFlags*)&forMarshaling->flags,
+                    sizeof(VkAttachmentDescriptionFlags));
     vkStream->write((VkFormat*)&forMarshaling->format, sizeof(VkFormat));
     vkStream->write((VkSampleCountFlagBits*)&forMarshaling->samples, sizeof(VkSampleCountFlagBits));
     vkStream->write((VkAttachmentLoadOp*)&forMarshaling->loadOp, sizeof(VkAttachmentLoadOp));
     vkStream->write((VkAttachmentStoreOp*)&forMarshaling->storeOp, sizeof(VkAttachmentStoreOp));
     vkStream->write((VkAttachmentLoadOp*)&forMarshaling->stencilLoadOp, sizeof(VkAttachmentLoadOp));
-    vkStream->write((VkAttachmentStoreOp*)&forMarshaling->stencilStoreOp, sizeof(VkAttachmentStoreOp));
+    vkStream->write((VkAttachmentStoreOp*)&forMarshaling->stencilStoreOp,
+                    sizeof(VkAttachmentStoreOp));
     vkStream->write((VkImageLayout*)&forMarshaling->initialLayout, sizeof(VkImageLayout));
     vkStream->write((VkImageLayout*)&forMarshaling->finalLayout, sizeof(VkImageLayout));
 }
 
-void unmarshal_VkAttachmentDescription2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAttachmentDescription2* forUnmarshaling)
-{
+void unmarshal_VkAttachmentDescription2(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkAttachmentDescription2* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkAttachmentDescriptionFlags*)&forUnmarshaling->flags, sizeof(VkAttachmentDescriptionFlags));
+    vkStream->read((VkAttachmentDescriptionFlags*)&forUnmarshaling->flags,
+                   sizeof(VkAttachmentDescriptionFlags));
     vkStream->read((VkFormat*)&forUnmarshaling->format, sizeof(VkFormat));
-    vkStream->read((VkSampleCountFlagBits*)&forUnmarshaling->samples, sizeof(VkSampleCountFlagBits));
+    vkStream->read((VkSampleCountFlagBits*)&forUnmarshaling->samples,
+                   sizeof(VkSampleCountFlagBits));
     vkStream->read((VkAttachmentLoadOp*)&forUnmarshaling->loadOp, sizeof(VkAttachmentLoadOp));
     vkStream->read((VkAttachmentStoreOp*)&forUnmarshaling->storeOp, sizeof(VkAttachmentStoreOp));
-    vkStream->read((VkAttachmentLoadOp*)&forUnmarshaling->stencilLoadOp, sizeof(VkAttachmentLoadOp));
-    vkStream->read((VkAttachmentStoreOp*)&forUnmarshaling->stencilStoreOp, sizeof(VkAttachmentStoreOp));
+    vkStream->read((VkAttachmentLoadOp*)&forUnmarshaling->stencilLoadOp,
+                   sizeof(VkAttachmentLoadOp));
+    vkStream->read((VkAttachmentStoreOp*)&forUnmarshaling->stencilStoreOp,
+                   sizeof(VkAttachmentStoreOp));
     vkStream->read((VkImageLayout*)&forUnmarshaling->initialLayout, sizeof(VkImageLayout));
     vkStream->read((VkImageLayout*)&forUnmarshaling->finalLayout, sizeof(VkImageLayout));
 }
 
-void marshal_VkAttachmentReference2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAttachmentReference2* forMarshaling)
-{
+void marshal_VkAttachmentReference2(VulkanStream* vkStream, VkStructureType rootType,
+                                    const VkAttachmentReference2* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -8926,26 +8370,23 @@
     vkStream->write((VkImageAspectFlags*)&forMarshaling->aspectMask, sizeof(VkImageAspectFlags));
 }
 
-void unmarshal_VkAttachmentReference2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAttachmentReference2* forUnmarshaling)
-{
+void unmarshal_VkAttachmentReference2(VulkanStream* vkStream, VkStructureType rootType,
+                                      VkAttachmentReference2* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -8954,371 +8395,356 @@
     vkStream->read((VkImageAspectFlags*)&forUnmarshaling->aspectMask, sizeof(VkImageAspectFlags));
 }
 
-void marshal_VkSubpassDescription2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSubpassDescription2* forMarshaling)
-{
+void marshal_VkSubpassDescription2(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkSubpassDescription2* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkSubpassDescriptionFlags*)&forMarshaling->flags, sizeof(VkSubpassDescriptionFlags));
-    vkStream->write((VkPipelineBindPoint*)&forMarshaling->pipelineBindPoint, sizeof(VkPipelineBindPoint));
+    vkStream->write((VkSubpassDescriptionFlags*)&forMarshaling->flags,
+                    sizeof(VkSubpassDescriptionFlags));
+    vkStream->write((VkPipelineBindPoint*)&forMarshaling->pipelineBindPoint,
+                    sizeof(VkPipelineBindPoint));
     vkStream->write((uint32_t*)&forMarshaling->viewMask, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->inputAttachmentCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->inputAttachmentCount; ++i)
-        {
-            marshal_VkAttachmentReference2(vkStream, rootType, (const VkAttachmentReference2*)(forMarshaling->pInputAttachments + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->inputAttachmentCount; ++i) {
+            marshal_VkAttachmentReference2(
+                vkStream, rootType,
+                (const VkAttachmentReference2*)(forMarshaling->pInputAttachments + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->colorAttachmentCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->colorAttachmentCount; ++i)
-        {
-            marshal_VkAttachmentReference2(vkStream, rootType, (const VkAttachmentReference2*)(forMarshaling->pColorAttachments + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->colorAttachmentCount; ++i) {
+            marshal_VkAttachmentReference2(
+                vkStream, rootType,
+                (const VkAttachmentReference2*)(forMarshaling->pColorAttachments + i));
         }
     }
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pResolveAttachments;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pResolveAttachments)
-    {
-        if (forMarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forMarshaling->colorAttachmentCount; ++i)
-            {
-                marshal_VkAttachmentReference2(vkStream, rootType, (const VkAttachmentReference2*)(forMarshaling->pResolveAttachments + i));
+    if (forMarshaling->pResolveAttachments) {
+        if (forMarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forMarshaling->colorAttachmentCount; ++i) {
+                marshal_VkAttachmentReference2(
+                    vkStream, rootType,
+                    (const VkAttachmentReference2*)(forMarshaling->pResolveAttachments + i));
             }
         }
     }
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)forMarshaling->pDepthStencilAttachment;
     vkStream->putBe64(cgen_var_1);
-    if (forMarshaling->pDepthStencilAttachment)
-    {
-        marshal_VkAttachmentReference2(vkStream, rootType, (const VkAttachmentReference2*)(forMarshaling->pDepthStencilAttachment));
+    if (forMarshaling->pDepthStencilAttachment) {
+        marshal_VkAttachmentReference2(
+            vkStream, rootType,
+            (const VkAttachmentReference2*)(forMarshaling->pDepthStencilAttachment));
     }
     vkStream->write((uint32_t*)&forMarshaling->preserveAttachmentCount, sizeof(uint32_t));
-    vkStream->write((const uint32_t*)forMarshaling->pPreserveAttachments, forMarshaling->preserveAttachmentCount * sizeof(const uint32_t));
+    vkStream->write((const uint32_t*)forMarshaling->pPreserveAttachments,
+                    forMarshaling->preserveAttachmentCount * sizeof(const uint32_t));
 }
 
-void unmarshal_VkSubpassDescription2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubpassDescription2* forUnmarshaling)
-{
+void unmarshal_VkSubpassDescription2(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkSubpassDescription2* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkSubpassDescriptionFlags*)&forUnmarshaling->flags, sizeof(VkSubpassDescriptionFlags));
-    vkStream->read((VkPipelineBindPoint*)&forUnmarshaling->pipelineBindPoint, sizeof(VkPipelineBindPoint));
+    vkStream->read((VkSubpassDescriptionFlags*)&forUnmarshaling->flags,
+                   sizeof(VkSubpassDescriptionFlags));
+    vkStream->read((VkPipelineBindPoint*)&forUnmarshaling->pipelineBindPoint,
+                   sizeof(VkPipelineBindPoint));
     vkStream->read((uint32_t*)&forUnmarshaling->viewMask, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->inputAttachmentCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pInputAttachments, forUnmarshaling->inputAttachmentCount * sizeof(const VkAttachmentReference2));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->inputAttachmentCount; ++i)
-        {
-            unmarshal_VkAttachmentReference2(vkStream, rootType, (VkAttachmentReference2*)(forUnmarshaling->pInputAttachments + i));
+    vkStream->alloc((void**)&forUnmarshaling->pInputAttachments,
+                    forUnmarshaling->inputAttachmentCount * sizeof(const VkAttachmentReference2));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->inputAttachmentCount; ++i) {
+            unmarshal_VkAttachmentReference2(
+                vkStream, rootType,
+                (VkAttachmentReference2*)(forUnmarshaling->pInputAttachments + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->colorAttachmentCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pColorAttachments, forUnmarshaling->colorAttachmentCount * sizeof(const VkAttachmentReference2));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->colorAttachmentCount; ++i)
-        {
-            unmarshal_VkAttachmentReference2(vkStream, rootType, (VkAttachmentReference2*)(forUnmarshaling->pColorAttachments + i));
+    vkStream->alloc((void**)&forUnmarshaling->pColorAttachments,
+                    forUnmarshaling->colorAttachmentCount * sizeof(const VkAttachmentReference2));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->colorAttachmentCount; ++i) {
+            unmarshal_VkAttachmentReference2(
+                vkStream, rootType,
+                (VkAttachmentReference2*)(forUnmarshaling->pColorAttachments + i));
         }
     }
     // WARNING PTR CHECK
-    forUnmarshaling->pResolveAttachments = (const VkAttachmentReference2*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pResolveAttachments)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pResolveAttachments, forUnmarshaling->colorAttachmentCount * sizeof(const VkAttachmentReference2));
-        if (forUnmarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->colorAttachmentCount; ++i)
-            {
-                unmarshal_VkAttachmentReference2(vkStream, rootType, (VkAttachmentReference2*)(forUnmarshaling->pResolveAttachments + i));
+    forUnmarshaling->pResolveAttachments =
+        (const VkAttachmentReference2*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pResolveAttachments) {
+        vkStream->alloc(
+            (void**)&forUnmarshaling->pResolveAttachments,
+            forUnmarshaling->colorAttachmentCount * sizeof(const VkAttachmentReference2));
+        if (forUnmarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->colorAttachmentCount; ++i) {
+                unmarshal_VkAttachmentReference2(
+                    vkStream, rootType,
+                    (VkAttachmentReference2*)(forUnmarshaling->pResolveAttachments + i));
             }
         }
     }
     // WARNING PTR CHECK
-    forUnmarshaling->pDepthStencilAttachment = (const VkAttachmentReference2*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pDepthStencilAttachment)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pDepthStencilAttachment, sizeof(const VkAttachmentReference2));
-        unmarshal_VkAttachmentReference2(vkStream, rootType, (VkAttachmentReference2*)(forUnmarshaling->pDepthStencilAttachment));
+    forUnmarshaling->pDepthStencilAttachment =
+        (const VkAttachmentReference2*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pDepthStencilAttachment) {
+        vkStream->alloc((void**)&forUnmarshaling->pDepthStencilAttachment,
+                        sizeof(const VkAttachmentReference2));
+        unmarshal_VkAttachmentReference2(
+            vkStream, rootType,
+            (VkAttachmentReference2*)(forUnmarshaling->pDepthStencilAttachment));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->preserveAttachmentCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pPreserveAttachments, forUnmarshaling->preserveAttachmentCount * sizeof(const uint32_t));
-    vkStream->read((uint32_t*)forUnmarshaling->pPreserveAttachments, forUnmarshaling->preserveAttachmentCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pPreserveAttachments,
+                    forUnmarshaling->preserveAttachmentCount * sizeof(const uint32_t));
+    vkStream->read((uint32_t*)forUnmarshaling->pPreserveAttachments,
+                   forUnmarshaling->preserveAttachmentCount * sizeof(const uint32_t));
 }
 
-void marshal_VkSubpassDependency2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSubpassDependency2* forMarshaling)
-{
+void marshal_VkSubpassDependency2(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkSubpassDependency2* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->srcSubpass, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->dstSubpass, sizeof(uint32_t));
-    vkStream->write((VkPipelineStageFlags*)&forMarshaling->srcStageMask, sizeof(VkPipelineStageFlags));
-    vkStream->write((VkPipelineStageFlags*)&forMarshaling->dstStageMask, sizeof(VkPipelineStageFlags));
+    vkStream->write((VkPipelineStageFlags*)&forMarshaling->srcStageMask,
+                    sizeof(VkPipelineStageFlags));
+    vkStream->write((VkPipelineStageFlags*)&forMarshaling->dstStageMask,
+                    sizeof(VkPipelineStageFlags));
     vkStream->write((VkAccessFlags*)&forMarshaling->srcAccessMask, sizeof(VkAccessFlags));
     vkStream->write((VkAccessFlags*)&forMarshaling->dstAccessMask, sizeof(VkAccessFlags));
     vkStream->write((VkDependencyFlags*)&forMarshaling->dependencyFlags, sizeof(VkDependencyFlags));
     vkStream->write((int32_t*)&forMarshaling->viewOffset, sizeof(int32_t));
 }
 
-void unmarshal_VkSubpassDependency2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubpassDependency2* forUnmarshaling)
-{
+void unmarshal_VkSubpassDependency2(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkSubpassDependency2* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->srcSubpass, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->dstSubpass, sizeof(uint32_t));
-    vkStream->read((VkPipelineStageFlags*)&forUnmarshaling->srcStageMask, sizeof(VkPipelineStageFlags));
-    vkStream->read((VkPipelineStageFlags*)&forUnmarshaling->dstStageMask, sizeof(VkPipelineStageFlags));
+    vkStream->read((VkPipelineStageFlags*)&forUnmarshaling->srcStageMask,
+                   sizeof(VkPipelineStageFlags));
+    vkStream->read((VkPipelineStageFlags*)&forUnmarshaling->dstStageMask,
+                   sizeof(VkPipelineStageFlags));
     vkStream->read((VkAccessFlags*)&forUnmarshaling->srcAccessMask, sizeof(VkAccessFlags));
     vkStream->read((VkAccessFlags*)&forUnmarshaling->dstAccessMask, sizeof(VkAccessFlags));
-    vkStream->read((VkDependencyFlags*)&forUnmarshaling->dependencyFlags, sizeof(VkDependencyFlags));
+    vkStream->read((VkDependencyFlags*)&forUnmarshaling->dependencyFlags,
+                   sizeof(VkDependencyFlags));
     vkStream->read((int32_t*)&forUnmarshaling->viewOffset, sizeof(int32_t));
 }
 
-void marshal_VkRenderPassCreateInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkRenderPassCreateInfo2* forMarshaling)
-{
+void marshal_VkRenderPassCreateInfo2(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkRenderPassCreateInfo2* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkRenderPassCreateFlags*)&forMarshaling->flags, sizeof(VkRenderPassCreateFlags));
+    vkStream->write((VkRenderPassCreateFlags*)&forMarshaling->flags,
+                    sizeof(VkRenderPassCreateFlags));
     vkStream->write((uint32_t*)&forMarshaling->attachmentCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->attachmentCount; ++i)
-        {
-            marshal_VkAttachmentDescription2(vkStream, rootType, (const VkAttachmentDescription2*)(forMarshaling->pAttachments + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->attachmentCount; ++i) {
+            marshal_VkAttachmentDescription2(
+                vkStream, rootType,
+                (const VkAttachmentDescription2*)(forMarshaling->pAttachments + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->subpassCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->subpassCount; ++i)
-        {
-            marshal_VkSubpassDescription2(vkStream, rootType, (const VkSubpassDescription2*)(forMarshaling->pSubpasses + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->subpassCount; ++i) {
+            marshal_VkSubpassDescription2(
+                vkStream, rootType, (const VkSubpassDescription2*)(forMarshaling->pSubpasses + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->dependencyCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->dependencyCount; ++i)
-        {
-            marshal_VkSubpassDependency2(vkStream, rootType, (const VkSubpassDependency2*)(forMarshaling->pDependencies + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->dependencyCount; ++i) {
+            marshal_VkSubpassDependency2(
+                vkStream, rootType,
+                (const VkSubpassDependency2*)(forMarshaling->pDependencies + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->correlatedViewMaskCount, sizeof(uint32_t));
-    vkStream->write((const uint32_t*)forMarshaling->pCorrelatedViewMasks, forMarshaling->correlatedViewMaskCount * sizeof(const uint32_t));
+    vkStream->write((const uint32_t*)forMarshaling->pCorrelatedViewMasks,
+                    forMarshaling->correlatedViewMaskCount * sizeof(const uint32_t));
 }
 
-void unmarshal_VkRenderPassCreateInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderPassCreateInfo2* forUnmarshaling)
-{
+void unmarshal_VkRenderPassCreateInfo2(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkRenderPassCreateInfo2* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkRenderPassCreateFlags*)&forUnmarshaling->flags, sizeof(VkRenderPassCreateFlags));
+    vkStream->read((VkRenderPassCreateFlags*)&forUnmarshaling->flags,
+                   sizeof(VkRenderPassCreateFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->attachmentCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pAttachments, forUnmarshaling->attachmentCount * sizeof(const VkAttachmentDescription2));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->attachmentCount; ++i)
-        {
-            unmarshal_VkAttachmentDescription2(vkStream, rootType, (VkAttachmentDescription2*)(forUnmarshaling->pAttachments + i));
+    vkStream->alloc((void**)&forUnmarshaling->pAttachments,
+                    forUnmarshaling->attachmentCount * sizeof(const VkAttachmentDescription2));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->attachmentCount; ++i) {
+            unmarshal_VkAttachmentDescription2(
+                vkStream, rootType, (VkAttachmentDescription2*)(forUnmarshaling->pAttachments + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->subpassCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pSubpasses, forUnmarshaling->subpassCount * sizeof(const VkSubpassDescription2));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->subpassCount; ++i)
-        {
-            unmarshal_VkSubpassDescription2(vkStream, rootType, (VkSubpassDescription2*)(forUnmarshaling->pSubpasses + i));
+    vkStream->alloc((void**)&forUnmarshaling->pSubpasses,
+                    forUnmarshaling->subpassCount * sizeof(const VkSubpassDescription2));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->subpassCount; ++i) {
+            unmarshal_VkSubpassDescription2(
+                vkStream, rootType, (VkSubpassDescription2*)(forUnmarshaling->pSubpasses + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->dependencyCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pDependencies, forUnmarshaling->dependencyCount * sizeof(const VkSubpassDependency2));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->dependencyCount; ++i)
-        {
-            unmarshal_VkSubpassDependency2(vkStream, rootType, (VkSubpassDependency2*)(forUnmarshaling->pDependencies + i));
+    vkStream->alloc((void**)&forUnmarshaling->pDependencies,
+                    forUnmarshaling->dependencyCount * sizeof(const VkSubpassDependency2));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->dependencyCount; ++i) {
+            unmarshal_VkSubpassDependency2(
+                vkStream, rootType, (VkSubpassDependency2*)(forUnmarshaling->pDependencies + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->correlatedViewMaskCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pCorrelatedViewMasks, forUnmarshaling->correlatedViewMaskCount * sizeof(const uint32_t));
-    vkStream->read((uint32_t*)forUnmarshaling->pCorrelatedViewMasks, forUnmarshaling->correlatedViewMaskCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pCorrelatedViewMasks,
+                    forUnmarshaling->correlatedViewMaskCount * sizeof(const uint32_t));
+    vkStream->read((uint32_t*)forUnmarshaling->pCorrelatedViewMasks,
+                   forUnmarshaling->correlatedViewMaskCount * sizeof(const uint32_t));
 }
 
-void marshal_VkSubpassBeginInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSubpassBeginInfo* forMarshaling)
-{
+void marshal_VkSubpassBeginInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                const VkSubpassBeginInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkSubpassContents*)&forMarshaling->contents, sizeof(VkSubpassContents));
 }
 
-void unmarshal_VkSubpassBeginInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubpassBeginInfo* forUnmarshaling)
-{
+void unmarshal_VkSubpassBeginInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkSubpassBeginInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkSubpassContents*)&forUnmarshaling->contents, sizeof(VkSubpassContents));
 }
 
-void marshal_VkSubpassEndInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSubpassEndInfo* forMarshaling)
-{
+void marshal_VkSubpassEndInfo(VulkanStream* vkStream, VkStructureType rootType,
+                              const VkSubpassEndInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
 }
 
-void unmarshal_VkSubpassEndInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubpassEndInfo* forUnmarshaling)
-{
+void unmarshal_VkSubpassEndInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                VkSubpassEndInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
 }
 
 void marshal_VkPhysicalDevice8BitStorageFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDevice8BitStorageFeatures* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDevice8BitStorageFeatures* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -9328,89 +8754,81 @@
 }
 
 void unmarshal_VkPhysicalDevice8BitStorageFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevice8BitStorageFeatures* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevice8BitStorageFeatures* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkBool32*)&forUnmarshaling->storageBuffer8BitAccess, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->uniformAndStorageBuffer8BitAccess, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->uniformAndStorageBuffer8BitAccess,
+                   sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->storagePushConstant8, sizeof(VkBool32));
 }
 
 void marshal_VkPhysicalDeviceDriverProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceDriverProperties* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceDriverProperties* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkDriverId*)&forMarshaling->driverID, sizeof(VkDriverId));
     vkStream->write((char*)forMarshaling->driverName, VK_MAX_DRIVER_NAME_SIZE * sizeof(char));
     vkStream->write((char*)forMarshaling->driverInfo, VK_MAX_DRIVER_INFO_SIZE * sizeof(char));
-    marshal_VkConformanceVersion(vkStream, rootType, (VkConformanceVersion*)(&forMarshaling->conformanceVersion));
+    marshal_VkConformanceVersion(vkStream, rootType,
+                                 (VkConformanceVersion*)(&forMarshaling->conformanceVersion));
 }
 
-void unmarshal_VkPhysicalDeviceDriverProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDriverProperties* forUnmarshaling)
-{
+void unmarshal_VkPhysicalDeviceDriverProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkPhysicalDeviceDriverProperties* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkDriverId*)&forUnmarshaling->driverID, sizeof(VkDriverId));
     vkStream->read((char*)forUnmarshaling->driverName, VK_MAX_DRIVER_NAME_SIZE * sizeof(char));
     vkStream->read((char*)forUnmarshaling->driverInfo, VK_MAX_DRIVER_INFO_SIZE * sizeof(char));
-    unmarshal_VkConformanceVersion(vkStream, rootType, (VkConformanceVersion*)(&forUnmarshaling->conformanceVersion));
+    unmarshal_VkConformanceVersion(vkStream, rootType,
+                                   (VkConformanceVersion*)(&forUnmarshaling->conformanceVersion));
 }
 
 void marshal_VkPhysicalDeviceShaderAtomicInt64Features(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceShaderAtomicInt64Features* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceShaderAtomicInt64Features* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -9419,25 +8837,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceShaderAtomicInt64Features(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderAtomicInt64Features* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderAtomicInt64Features* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -9446,14 +8862,11 @@
 }
 
 void marshal_VkPhysicalDeviceShaderFloat16Int8Features(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceShaderFloat16Int8Features* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceShaderFloat16Int8Features* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -9462,25 +8875,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceShaderFloat16Int8Features(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderFloat16Int8Features* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderFloat16Int8Features* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -9489,22 +8900,24 @@
 }
 
 void marshal_VkPhysicalDeviceFloatControlsProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceFloatControlsProperties* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceFloatControlsProperties* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkShaderFloatControlsIndependence*)&forMarshaling->denormBehaviorIndependence, sizeof(VkShaderFloatControlsIndependence));
-    vkStream->write((VkShaderFloatControlsIndependence*)&forMarshaling->roundingModeIndependence, sizeof(VkShaderFloatControlsIndependence));
-    vkStream->write((VkBool32*)&forMarshaling->shaderSignedZeroInfNanPreserveFloat16, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderSignedZeroInfNanPreserveFloat32, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderSignedZeroInfNanPreserveFloat64, sizeof(VkBool32));
+    vkStream->write((VkShaderFloatControlsIndependence*)&forMarshaling->denormBehaviorIndependence,
+                    sizeof(VkShaderFloatControlsIndependence));
+    vkStream->write((VkShaderFloatControlsIndependence*)&forMarshaling->roundingModeIndependence,
+                    sizeof(VkShaderFloatControlsIndependence));
+    vkStream->write((VkBool32*)&forMarshaling->shaderSignedZeroInfNanPreserveFloat16,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderSignedZeroInfNanPreserveFloat32,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderSignedZeroInfNanPreserveFloat64,
+                    sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->shaderDenormPreserveFloat16, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->shaderDenormPreserveFloat32, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->shaderDenormPreserveFloat64, sizeof(VkBool32));
@@ -9520,33 +8933,36 @@
 }
 
 void unmarshal_VkPhysicalDeviceFloatControlsProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFloatControlsProperties* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceFloatControlsProperties* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkShaderFloatControlsIndependence*)&forUnmarshaling->denormBehaviorIndependence, sizeof(VkShaderFloatControlsIndependence));
-    vkStream->read((VkShaderFloatControlsIndependence*)&forUnmarshaling->roundingModeIndependence, sizeof(VkShaderFloatControlsIndependence));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderSignedZeroInfNanPreserveFloat16, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderSignedZeroInfNanPreserveFloat32, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderSignedZeroInfNanPreserveFloat64, sizeof(VkBool32));
+    vkStream->read((VkShaderFloatControlsIndependence*)&forUnmarshaling->denormBehaviorIndependence,
+                   sizeof(VkShaderFloatControlsIndependence));
+    vkStream->read((VkShaderFloatControlsIndependence*)&forUnmarshaling->roundingModeIndependence,
+                   sizeof(VkShaderFloatControlsIndependence));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderSignedZeroInfNanPreserveFloat16,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderSignedZeroInfNanPreserveFloat32,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderSignedZeroInfNanPreserveFloat64,
+                   sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->shaderDenormPreserveFloat16, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->shaderDenormPreserveFloat32, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->shaderDenormPreserveFloat64, sizeof(VkBool32));
@@ -9562,14 +8978,11 @@
 }
 
 void marshal_VkDescriptorSetLayoutBindingFlagsCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDescriptorSetLayoutBindingFlagsCreateInfo* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkDescriptorSetLayoutBindingFlagsCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -9577,262 +8990,329 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pBindingFlags;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pBindingFlags)
-    {
-        vkStream->write((const VkDescriptorBindingFlags*)forMarshaling->pBindingFlags, forMarshaling->bindingCount * sizeof(const VkDescriptorBindingFlags));
+    if (forMarshaling->pBindingFlags) {
+        vkStream->write((const VkDescriptorBindingFlags*)forMarshaling->pBindingFlags,
+                        forMarshaling->bindingCount * sizeof(const VkDescriptorBindingFlags));
     }
 }
 
 void unmarshal_VkDescriptorSetLayoutBindingFlagsCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorSetLayoutBindingFlagsCreateInfo* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDescriptorSetLayoutBindingFlagsCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->bindingCount, sizeof(uint32_t));
     // WARNING PTR CHECK
-    forUnmarshaling->pBindingFlags = (const VkDescriptorBindingFlags*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pBindingFlags)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pBindingFlags, forUnmarshaling->bindingCount * sizeof(const VkDescriptorBindingFlags));
-        vkStream->read((VkDescriptorBindingFlags*)forUnmarshaling->pBindingFlags, forUnmarshaling->bindingCount * sizeof(const VkDescriptorBindingFlags));
+    forUnmarshaling->pBindingFlags =
+        (const VkDescriptorBindingFlags*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pBindingFlags) {
+        vkStream->alloc((void**)&forUnmarshaling->pBindingFlags,
+                        forUnmarshaling->bindingCount * sizeof(const VkDescriptorBindingFlags));
+        vkStream->read((VkDescriptorBindingFlags*)forUnmarshaling->pBindingFlags,
+                       forUnmarshaling->bindingCount * sizeof(const VkDescriptorBindingFlags));
     }
 }
 
 void marshal_VkPhysicalDeviceDescriptorIndexingFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceDescriptorIndexingFeatures* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceDescriptorIndexingFeatures* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkBool32*)&forMarshaling->shaderInputAttachmentArrayDynamicIndexing, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderUniformTexelBufferArrayDynamicIndexing, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderStorageTexelBufferArrayDynamicIndexing, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderUniformBufferArrayNonUniformIndexing, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderSampledImageArrayNonUniformIndexing, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderStorageBufferArrayNonUniformIndexing, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderStorageImageArrayNonUniformIndexing, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderInputAttachmentArrayNonUniformIndexing, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderUniformTexelBufferArrayNonUniformIndexing, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderStorageTexelBufferArrayNonUniformIndexing, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->descriptorBindingUniformBufferUpdateAfterBind, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->descriptorBindingSampledImageUpdateAfterBind, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->descriptorBindingStorageImageUpdateAfterBind, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->descriptorBindingStorageBufferUpdateAfterBind, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->descriptorBindingUniformTexelBufferUpdateAfterBind, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->descriptorBindingStorageTexelBufferUpdateAfterBind, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->descriptorBindingUpdateUnusedWhilePending, sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderInputAttachmentArrayDynamicIndexing,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderUniformTexelBufferArrayDynamicIndexing,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderStorageTexelBufferArrayDynamicIndexing,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderUniformBufferArrayNonUniformIndexing,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderSampledImageArrayNonUniformIndexing,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderStorageBufferArrayNonUniformIndexing,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderStorageImageArrayNonUniformIndexing,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderInputAttachmentArrayNonUniformIndexing,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderUniformTexelBufferArrayNonUniformIndexing,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderStorageTexelBufferArrayNonUniformIndexing,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->descriptorBindingUniformBufferUpdateAfterBind,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->descriptorBindingSampledImageUpdateAfterBind,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->descriptorBindingStorageImageUpdateAfterBind,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->descriptorBindingStorageBufferUpdateAfterBind,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->descriptorBindingUniformTexelBufferUpdateAfterBind,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->descriptorBindingStorageTexelBufferUpdateAfterBind,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->descriptorBindingUpdateUnusedWhilePending,
+                    sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->descriptorBindingPartiallyBound, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->descriptorBindingVariableDescriptorCount, sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->descriptorBindingVariableDescriptorCount,
+                    sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->runtimeDescriptorArray, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceDescriptorIndexingFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDescriptorIndexingFeatures* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceDescriptorIndexingFeatures* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderInputAttachmentArrayDynamicIndexing, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderUniformTexelBufferArrayDynamicIndexing, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderStorageTexelBufferArrayDynamicIndexing, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderUniformBufferArrayNonUniformIndexing, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderSampledImageArrayNonUniformIndexing, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderStorageBufferArrayNonUniformIndexing, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderStorageImageArrayNonUniformIndexing, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderInputAttachmentArrayNonUniformIndexing, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderUniformTexelBufferArrayNonUniformIndexing, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderStorageTexelBufferArrayNonUniformIndexing, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingUniformBufferUpdateAfterBind, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingSampledImageUpdateAfterBind, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingStorageImageUpdateAfterBind, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingStorageBufferUpdateAfterBind, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingUniformTexelBufferUpdateAfterBind, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingStorageTexelBufferUpdateAfterBind, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingUpdateUnusedWhilePending, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderInputAttachmentArrayDynamicIndexing,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderUniformTexelBufferArrayDynamicIndexing,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderStorageTexelBufferArrayDynamicIndexing,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderUniformBufferArrayNonUniformIndexing,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderSampledImageArrayNonUniformIndexing,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderStorageBufferArrayNonUniformIndexing,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderStorageImageArrayNonUniformIndexing,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderInputAttachmentArrayNonUniformIndexing,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderUniformTexelBufferArrayNonUniformIndexing,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderStorageTexelBufferArrayNonUniformIndexing,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingUniformBufferUpdateAfterBind,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingSampledImageUpdateAfterBind,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingStorageImageUpdateAfterBind,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingStorageBufferUpdateAfterBind,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingUniformTexelBufferUpdateAfterBind,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingStorageTexelBufferUpdateAfterBind,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingUpdateUnusedWhilePending,
+                   sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingPartiallyBound, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingVariableDescriptorCount, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingVariableDescriptorCount,
+                   sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->runtimeDescriptorArray, sizeof(VkBool32));
 }
 
 void marshal_VkPhysicalDeviceDescriptorIndexingProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceDescriptorIndexingProperties* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceDescriptorIndexingProperties* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((uint32_t*)&forMarshaling->maxUpdateAfterBindDescriptorsInAllPools, sizeof(uint32_t));
-    vkStream->write((VkBool32*)&forMarshaling->shaderUniformBufferArrayNonUniformIndexingNative, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderSampledImageArrayNonUniformIndexingNative, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderStorageBufferArrayNonUniformIndexingNative, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderStorageImageArrayNonUniformIndexingNative, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderInputAttachmentArrayNonUniformIndexingNative, sizeof(VkBool32));
+    vkStream->write((uint32_t*)&forMarshaling->maxUpdateAfterBindDescriptorsInAllPools,
+                    sizeof(uint32_t));
+    vkStream->write((VkBool32*)&forMarshaling->shaderUniformBufferArrayNonUniformIndexingNative,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderSampledImageArrayNonUniformIndexingNative,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderStorageBufferArrayNonUniformIndexingNative,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderStorageImageArrayNonUniformIndexingNative,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderInputAttachmentArrayNonUniformIndexingNative,
+                    sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->robustBufferAccessUpdateAfterBind, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->quadDivergentImplicitLod, sizeof(VkBool32));
-    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorUpdateAfterBindSamplers, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorUpdateAfterBindUniformBuffers, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorUpdateAfterBindStorageBuffers, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorUpdateAfterBindSampledImages, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorUpdateAfterBindStorageImages, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorUpdateAfterBindInputAttachments, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxPerStageUpdateAfterBindResources, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindSamplers, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindUniformBuffers, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindStorageBuffers, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindSampledImages, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindStorageImages, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindInputAttachments, sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorUpdateAfterBindSamplers,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorUpdateAfterBindUniformBuffers,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorUpdateAfterBindStorageBuffers,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorUpdateAfterBindSampledImages,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorUpdateAfterBindStorageImages,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorUpdateAfterBindInputAttachments,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxPerStageUpdateAfterBindResources,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindSamplers,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindUniformBuffers,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindStorageBuffers,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindSampledImages,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindStorageImages,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindInputAttachments,
+                    sizeof(uint32_t));
 }
 
 void unmarshal_VkPhysicalDeviceDescriptorIndexingProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDescriptorIndexingProperties* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceDescriptorIndexingProperties* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((uint32_t*)&forUnmarshaling->maxUpdateAfterBindDescriptorsInAllPools, sizeof(uint32_t));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderUniformBufferArrayNonUniformIndexingNative, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderSampledImageArrayNonUniformIndexingNative, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderStorageBufferArrayNonUniformIndexingNative, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderStorageImageArrayNonUniformIndexingNative, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderInputAttachmentArrayNonUniformIndexingNative, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->robustBufferAccessUpdateAfterBind, sizeof(VkBool32));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxUpdateAfterBindDescriptorsInAllPools,
+                   sizeof(uint32_t));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderUniformBufferArrayNonUniformIndexingNative,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderSampledImageArrayNonUniformIndexingNative,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderStorageBufferArrayNonUniformIndexingNative,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderStorageImageArrayNonUniformIndexingNative,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderInputAttachmentArrayNonUniformIndexingNative,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->robustBufferAccessUpdateAfterBind,
+                   sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->quadDivergentImplicitLod, sizeof(VkBool32));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindSamplers, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindUniformBuffers, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindStorageBuffers, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindSampledImages, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindStorageImages, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindInputAttachments, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageUpdateAfterBindResources, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindSamplers, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindUniformBuffers, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindStorageBuffers, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindSampledImages, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindStorageImages, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindInputAttachments, sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindSamplers,
+                   sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindUniformBuffers,
+                   sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindStorageBuffers,
+                   sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindSampledImages,
+                   sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindStorageImages,
+                   sizeof(uint32_t));
+    vkStream->read(
+        (uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindInputAttachments,
+        sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageUpdateAfterBindResources,
+                   sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindSamplers,
+                   sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindUniformBuffers,
+                   sizeof(uint32_t));
+    vkStream->read(
+        (uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic,
+        sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindStorageBuffers,
+                   sizeof(uint32_t));
+    vkStream->read(
+        (uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic,
+        sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindSampledImages,
+                   sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindStorageImages,
+                   sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindInputAttachments,
+                   sizeof(uint32_t));
 }
 
 void marshal_VkDescriptorSetVariableDescriptorCountAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDescriptorSetVariableDescriptorCountAllocateInfo* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkDescriptorSetVariableDescriptorCountAllocateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->descriptorSetCount, sizeof(uint32_t));
-    vkStream->write((const uint32_t*)forMarshaling->pDescriptorCounts, forMarshaling->descriptorSetCount * sizeof(const uint32_t));
+    vkStream->write((const uint32_t*)forMarshaling->pDescriptorCounts,
+                    forMarshaling->descriptorSetCount * sizeof(const uint32_t));
 }
 
 void unmarshal_VkDescriptorSetVariableDescriptorCountAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorSetVariableDescriptorCountAllocateInfo* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDescriptorSetVariableDescriptorCountAllocateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->descriptorSetCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pDescriptorCounts, forUnmarshaling->descriptorSetCount * sizeof(const uint32_t));
-    vkStream->read((uint32_t*)forUnmarshaling->pDescriptorCounts, forUnmarshaling->descriptorSetCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pDescriptorCounts,
+                    forUnmarshaling->descriptorSetCount * sizeof(const uint32_t));
+    vkStream->read((uint32_t*)forUnmarshaling->pDescriptorCounts,
+                   forUnmarshaling->descriptorSetCount * sizeof(const uint32_t));
 }
 
 void marshal_VkDescriptorSetVariableDescriptorCountLayoutSupport(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDescriptorSetVariableDescriptorCountLayoutSupport* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkDescriptorSetVariableDescriptorCountLayoutSupport* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -9840,25 +9320,23 @@
 }
 
 void unmarshal_VkDescriptorSetVariableDescriptorCountLayoutSupport(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorSetVariableDescriptorCountLayoutSupport* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDescriptorSetVariableDescriptorCountLayoutSupport* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -9866,118 +9344,117 @@
 }
 
 void marshal_VkSubpassDescriptionDepthStencilResolve(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSubpassDescriptionDepthStencilResolve* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkSubpassDescriptionDepthStencilResolve* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkResolveModeFlagBits*)&forMarshaling->depthResolveMode, sizeof(VkResolveModeFlagBits));
-    vkStream->write((VkResolveModeFlagBits*)&forMarshaling->stencilResolveMode, sizeof(VkResolveModeFlagBits));
+    vkStream->write((VkResolveModeFlagBits*)&forMarshaling->depthResolveMode,
+                    sizeof(VkResolveModeFlagBits));
+    vkStream->write((VkResolveModeFlagBits*)&forMarshaling->stencilResolveMode,
+                    sizeof(VkResolveModeFlagBits));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pDepthStencilResolveAttachment;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pDepthStencilResolveAttachment)
-    {
-        marshal_VkAttachmentReference2(vkStream, rootType, (const VkAttachmentReference2*)(forMarshaling->pDepthStencilResolveAttachment));
+    if (forMarshaling->pDepthStencilResolveAttachment) {
+        marshal_VkAttachmentReference2(
+            vkStream, rootType,
+            (const VkAttachmentReference2*)(forMarshaling->pDepthStencilResolveAttachment));
     }
 }
 
 void unmarshal_VkSubpassDescriptionDepthStencilResolve(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubpassDescriptionDepthStencilResolve* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSubpassDescriptionDepthStencilResolve* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkResolveModeFlagBits*)&forUnmarshaling->depthResolveMode, sizeof(VkResolveModeFlagBits));
-    vkStream->read((VkResolveModeFlagBits*)&forUnmarshaling->stencilResolveMode, sizeof(VkResolveModeFlagBits));
+    vkStream->read((VkResolveModeFlagBits*)&forUnmarshaling->depthResolveMode,
+                   sizeof(VkResolveModeFlagBits));
+    vkStream->read((VkResolveModeFlagBits*)&forUnmarshaling->stencilResolveMode,
+                   sizeof(VkResolveModeFlagBits));
     // WARNING PTR CHECK
-    forUnmarshaling->pDepthStencilResolveAttachment = (const VkAttachmentReference2*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pDepthStencilResolveAttachment)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pDepthStencilResolveAttachment, sizeof(const VkAttachmentReference2));
-        unmarshal_VkAttachmentReference2(vkStream, rootType, (VkAttachmentReference2*)(forUnmarshaling->pDepthStencilResolveAttachment));
+    forUnmarshaling->pDepthStencilResolveAttachment =
+        (const VkAttachmentReference2*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pDepthStencilResolveAttachment) {
+        vkStream->alloc((void**)&forUnmarshaling->pDepthStencilResolveAttachment,
+                        sizeof(const VkAttachmentReference2));
+        unmarshal_VkAttachmentReference2(
+            vkStream, rootType,
+            (VkAttachmentReference2*)(forUnmarshaling->pDepthStencilResolveAttachment));
     }
 }
 
 void marshal_VkPhysicalDeviceDepthStencilResolveProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceDepthStencilResolveProperties* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceDepthStencilResolveProperties* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkResolveModeFlags*)&forMarshaling->supportedDepthResolveModes, sizeof(VkResolveModeFlags));
-    vkStream->write((VkResolveModeFlags*)&forMarshaling->supportedStencilResolveModes, sizeof(VkResolveModeFlags));
+    vkStream->write((VkResolveModeFlags*)&forMarshaling->supportedDepthResolveModes,
+                    sizeof(VkResolveModeFlags));
+    vkStream->write((VkResolveModeFlags*)&forMarshaling->supportedStencilResolveModes,
+                    sizeof(VkResolveModeFlags));
     vkStream->write((VkBool32*)&forMarshaling->independentResolveNone, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->independentResolve, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceDepthStencilResolveProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDepthStencilResolveProperties* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceDepthStencilResolveProperties* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkResolveModeFlags*)&forUnmarshaling->supportedDepthResolveModes, sizeof(VkResolveModeFlags));
-    vkStream->read((VkResolveModeFlags*)&forUnmarshaling->supportedStencilResolveModes, sizeof(VkResolveModeFlags));
+    vkStream->read((VkResolveModeFlags*)&forUnmarshaling->supportedDepthResolveModes,
+                   sizeof(VkResolveModeFlags));
+    vkStream->read((VkResolveModeFlags*)&forUnmarshaling->supportedStencilResolveModes,
+                   sizeof(VkResolveModeFlags));
     vkStream->read((VkBool32*)&forUnmarshaling->independentResolveNone, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->independentResolve, sizeof(VkBool32));
 }
 
 void marshal_VkPhysicalDeviceScalarBlockLayoutFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceScalarBlockLayoutFeatures* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceScalarBlockLayoutFeatures* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -9985,66 +9462,57 @@
 }
 
 void unmarshal_VkPhysicalDeviceScalarBlockLayoutFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceScalarBlockLayoutFeatures* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceScalarBlockLayoutFeatures* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkBool32*)&forUnmarshaling->scalarBlockLayout, sizeof(VkBool32));
 }
 
-void marshal_VkImageStencilUsageCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageStencilUsageCreateInfo* forMarshaling)
-{
+void marshal_VkImageStencilUsageCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkImageStencilUsageCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkImageUsageFlags*)&forMarshaling->stencilUsage, sizeof(VkImageUsageFlags));
 }
 
-void unmarshal_VkImageStencilUsageCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageStencilUsageCreateInfo* forUnmarshaling)
-{
+void unmarshal_VkImageStencilUsageCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkImageStencilUsageCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -10052,143 +9520,131 @@
 }
 
 void marshal_VkSamplerReductionModeCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSamplerReductionModeCreateInfo* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkSamplerReductionModeCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkSamplerReductionMode*)&forMarshaling->reductionMode, sizeof(VkSamplerReductionMode));
+    vkStream->write((VkSamplerReductionMode*)&forMarshaling->reductionMode,
+                    sizeof(VkSamplerReductionMode));
 }
 
-void unmarshal_VkSamplerReductionModeCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSamplerReductionModeCreateInfo* forUnmarshaling)
-{
+void unmarshal_VkSamplerReductionModeCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkSamplerReductionModeCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkSamplerReductionMode*)&forUnmarshaling->reductionMode, sizeof(VkSamplerReductionMode));
+    vkStream->read((VkSamplerReductionMode*)&forUnmarshaling->reductionMode,
+                   sizeof(VkSamplerReductionMode));
 }
 
 void marshal_VkPhysicalDeviceSamplerFilterMinmaxProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceSamplerFilterMinmaxProperties* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceSamplerFilterMinmaxProperties* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkBool32*)&forMarshaling->filterMinmaxSingleComponentFormats, sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->filterMinmaxSingleComponentFormats,
+                    sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->filterMinmaxImageComponentMapping, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceSamplerFilterMinmaxProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSamplerFilterMinmaxProperties* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceSamplerFilterMinmaxProperties* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkBool32*)&forUnmarshaling->filterMinmaxSingleComponentFormats, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->filterMinmaxImageComponentMapping, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->filterMinmaxSingleComponentFormats,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->filterMinmaxImageComponentMapping,
+                   sizeof(VkBool32));
 }
 
 void marshal_VkPhysicalDeviceVulkanMemoryModelFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceVulkanMemoryModelFeatures* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceVulkanMemoryModelFeatures* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->vulkanMemoryModel, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->vulkanMemoryModelDeviceScope, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->vulkanMemoryModelAvailabilityVisibilityChains, sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->vulkanMemoryModelAvailabilityVisibilityChains,
+                    sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceVulkanMemoryModelFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceVulkanMemoryModelFeatures* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceVulkanMemoryModelFeatures* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkBool32*)&forUnmarshaling->vulkanMemoryModel, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->vulkanMemoryModelDeviceScope, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->vulkanMemoryModelAvailabilityVisibilityChains, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->vulkanMemoryModelAvailabilityVisibilityChains,
+                   sizeof(VkBool32));
 }
 
 void marshal_VkPhysicalDeviceImagelessFramebufferFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceImagelessFramebufferFeatures* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceImagelessFramebufferFeatures* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -10196,25 +9652,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceImagelessFramebufferFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceImagelessFramebufferFeatures* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceImagelessFramebufferFeatures* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -10222,14 +9676,11 @@
 }
 
 void marshal_VkFramebufferAttachmentImageInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkFramebufferAttachmentImageInfo* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkFramebufferAttachmentImageInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -10239,29 +9690,27 @@
     vkStream->write((uint32_t*)&forMarshaling->height, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->layerCount, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->viewFormatCount, sizeof(uint32_t));
-    vkStream->write((const VkFormat*)forMarshaling->pViewFormats, forMarshaling->viewFormatCount * sizeof(const VkFormat));
+    vkStream->write((const VkFormat*)forMarshaling->pViewFormats,
+                    forMarshaling->viewFormatCount * sizeof(const VkFormat));
 }
 
-void unmarshal_VkFramebufferAttachmentImageInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFramebufferAttachmentImageInfo* forUnmarshaling)
-{
+void unmarshal_VkFramebufferAttachmentImageInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkFramebufferAttachmentImageInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -10271,131 +9720,123 @@
     vkStream->read((uint32_t*)&forUnmarshaling->height, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->layerCount, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->viewFormatCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pViewFormats, forUnmarshaling->viewFormatCount * sizeof(const VkFormat));
-    vkStream->read((VkFormat*)forUnmarshaling->pViewFormats, forUnmarshaling->viewFormatCount * sizeof(const VkFormat));
+    vkStream->alloc((void**)&forUnmarshaling->pViewFormats,
+                    forUnmarshaling->viewFormatCount * sizeof(const VkFormat));
+    vkStream->read((VkFormat*)forUnmarshaling->pViewFormats,
+                   forUnmarshaling->viewFormatCount * sizeof(const VkFormat));
 }
 
 void marshal_VkFramebufferAttachmentsCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkFramebufferAttachmentsCreateInfo* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkFramebufferAttachmentsCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->attachmentImageInfoCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->attachmentImageInfoCount; ++i)
-        {
-            marshal_VkFramebufferAttachmentImageInfo(vkStream, rootType, (const VkFramebufferAttachmentImageInfo*)(forMarshaling->pAttachmentImageInfos + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->attachmentImageInfoCount; ++i) {
+            marshal_VkFramebufferAttachmentImageInfo(
+                vkStream, rootType,
+                (const VkFramebufferAttachmentImageInfo*)(forMarshaling->pAttachmentImageInfos +
+                                                          i));
         }
     }
 }
 
 void unmarshal_VkFramebufferAttachmentsCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFramebufferAttachmentsCreateInfo* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkFramebufferAttachmentsCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->attachmentImageInfoCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pAttachmentImageInfos, forUnmarshaling->attachmentImageInfoCount * sizeof(const VkFramebufferAttachmentImageInfo));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->attachmentImageInfoCount; ++i)
-        {
-            unmarshal_VkFramebufferAttachmentImageInfo(vkStream, rootType, (VkFramebufferAttachmentImageInfo*)(forUnmarshaling->pAttachmentImageInfos + i));
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pAttachmentImageInfos,
+        forUnmarshaling->attachmentImageInfoCount * sizeof(const VkFramebufferAttachmentImageInfo));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->attachmentImageInfoCount; ++i) {
+            unmarshal_VkFramebufferAttachmentImageInfo(
+                vkStream, rootType,
+                (VkFramebufferAttachmentImageInfo*)(forUnmarshaling->pAttachmentImageInfos + i));
         }
     }
 }
 
-void marshal_VkRenderPassAttachmentBeginInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkRenderPassAttachmentBeginInfo* forMarshaling)
-{
+void marshal_VkRenderPassAttachmentBeginInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkRenderPassAttachmentBeginInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->attachmentCount, sizeof(uint32_t));
-    if (forMarshaling->attachmentCount)
-    {
+    if (forMarshaling->attachmentCount) {
         uint64_t* cgen_var_0;
         vkStream->alloc((void**)&cgen_var_0, forMarshaling->attachmentCount * 8);
-        vkStream->handleMapping()->mapHandles_VkImageView_u64(forMarshaling->pAttachments, cgen_var_0, forMarshaling->attachmentCount);
+        vkStream->handleMapping()->mapHandles_VkImageView_u64(
+            forMarshaling->pAttachments, cgen_var_0, forMarshaling->attachmentCount);
         vkStream->write((uint64_t*)cgen_var_0, forMarshaling->attachmentCount * 8);
     }
 }
 
-void unmarshal_VkRenderPassAttachmentBeginInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderPassAttachmentBeginInfo* forUnmarshaling)
-{
+void unmarshal_VkRenderPassAttachmentBeginInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkRenderPassAttachmentBeginInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->attachmentCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pAttachments, forUnmarshaling->attachmentCount * sizeof(const VkImageView));
-    if (forUnmarshaling->attachmentCount)
-    {
+    vkStream->alloc((void**)&forUnmarshaling->pAttachments,
+                    forUnmarshaling->attachmentCount * sizeof(const VkImageView));
+    if (forUnmarshaling->attachmentCount) {
         uint64_t* cgen_var_0;
         vkStream->alloc((void**)&cgen_var_0, forUnmarshaling->attachmentCount * 8);
         vkStream->read((uint64_t*)cgen_var_0, forUnmarshaling->attachmentCount * 8);
-        vkStream->handleMapping()->mapHandles_u64_VkImageView(cgen_var_0, (VkImageView*)forUnmarshaling->pAttachments, forUnmarshaling->attachmentCount);
+        vkStream->handleMapping()->mapHandles_u64_VkImageView(
+            cgen_var_0, (VkImageView*)forUnmarshaling->pAttachments,
+            forUnmarshaling->attachmentCount);
     }
 }
 
 void marshal_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceUniformBufferStandardLayoutFeatures* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceUniformBufferStandardLayoutFeatures* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -10403,25 +9844,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceUniformBufferStandardLayoutFeatures* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceUniformBufferStandardLayoutFeatures* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -10429,14 +9868,11 @@
 }
 
 void marshal_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -10444,25 +9880,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -10470,14 +9904,11 @@
 }
 
 void marshal_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -10485,25 +9916,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -10511,14 +9940,11 @@
 }
 
 void marshal_VkAttachmentReferenceStencilLayout(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAttachmentReferenceStencilLayout* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkAttachmentReferenceStencilLayout* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -10526,25 +9952,23 @@
 }
 
 void unmarshal_VkAttachmentReferenceStencilLayout(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAttachmentReferenceStencilLayout* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAttachmentReferenceStencilLayout* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -10552,14 +9976,11 @@
 }
 
 void marshal_VkAttachmentDescriptionStencilLayout(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAttachmentDescriptionStencilLayout* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkAttachmentDescriptionStencilLayout* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -10568,25 +9989,23 @@
 }
 
 void unmarshal_VkAttachmentDescriptionStencilLayout(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAttachmentDescriptionStencilLayout* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAttachmentDescriptionStencilLayout* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -10595,14 +10014,11 @@
 }
 
 void marshal_VkPhysicalDeviceHostQueryResetFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceHostQueryResetFeatures* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceHostQueryResetFeatures* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -10610,25 +10026,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceHostQueryResetFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceHostQueryResetFeatures* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceHostQueryResetFeatures* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -10636,14 +10050,11 @@
 }
 
 void marshal_VkPhysicalDeviceTimelineSemaphoreFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceTimelineSemaphoreFeatures* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceTimelineSemaphoreFeatures* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -10651,25 +10062,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceTimelineSemaphoreFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceTimelineSemaphoreFeatures* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceTimelineSemaphoreFeatures* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -10677,55 +10086,48 @@
 }
 
 void marshal_VkPhysicalDeviceTimelineSemaphoreProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceTimelineSemaphoreProperties* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceTimelineSemaphoreProperties* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((uint64_t*)&forMarshaling->maxTimelineSemaphoreValueDifference, sizeof(uint64_t));
+    vkStream->write((uint64_t*)&forMarshaling->maxTimelineSemaphoreValueDifference,
+                    sizeof(uint64_t));
 }
 
 void unmarshal_VkPhysicalDeviceTimelineSemaphoreProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceTimelineSemaphoreProperties* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceTimelineSemaphoreProperties* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((uint64_t*)&forUnmarshaling->maxTimelineSemaphoreValueDifference, sizeof(uint64_t));
+    vkStream->read((uint64_t*)&forUnmarshaling->maxTimelineSemaphoreValueDifference,
+                   sizeof(uint64_t));
 }
 
-void marshal_VkSemaphoreTypeCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSemaphoreTypeCreateInfo* forMarshaling)
-{
+void marshal_VkSemaphoreTypeCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkSemaphoreTypeCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -10733,26 +10135,23 @@
     vkStream->write((uint64_t*)&forMarshaling->initialValue, sizeof(uint64_t));
 }
 
-void unmarshal_VkSemaphoreTypeCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSemaphoreTypeCreateInfo* forUnmarshaling)
-{
+void unmarshal_VkSemaphoreTypeCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkSemaphoreTypeCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -10760,15 +10159,11 @@
     vkStream->read((uint64_t*)&forUnmarshaling->initialValue, sizeof(uint64_t));
 }
 
-void marshal_VkTimelineSemaphoreSubmitInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkTimelineSemaphoreSubmitInfo* forMarshaling)
-{
+void marshal_VkTimelineSemaphoreSubmitInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkTimelineSemaphoreSubmitInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -10776,178 +10171,167 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pWaitSemaphoreValues;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pWaitSemaphoreValues)
-    {
-        vkStream->write((const uint64_t*)forMarshaling->pWaitSemaphoreValues, forMarshaling->waitSemaphoreValueCount * sizeof(const uint64_t));
+    if (forMarshaling->pWaitSemaphoreValues) {
+        vkStream->write((const uint64_t*)forMarshaling->pWaitSemaphoreValues,
+                        forMarshaling->waitSemaphoreValueCount * sizeof(const uint64_t));
     }
     vkStream->write((uint32_t*)&forMarshaling->signalSemaphoreValueCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)forMarshaling->pSignalSemaphoreValues;
     vkStream->putBe64(cgen_var_1);
-    if (forMarshaling->pSignalSemaphoreValues)
-    {
-        vkStream->write((const uint64_t*)forMarshaling->pSignalSemaphoreValues, forMarshaling->signalSemaphoreValueCount * sizeof(const uint64_t));
+    if (forMarshaling->pSignalSemaphoreValues) {
+        vkStream->write((const uint64_t*)forMarshaling->pSignalSemaphoreValues,
+                        forMarshaling->signalSemaphoreValueCount * sizeof(const uint64_t));
     }
 }
 
-void unmarshal_VkTimelineSemaphoreSubmitInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkTimelineSemaphoreSubmitInfo* forUnmarshaling)
-{
+void unmarshal_VkTimelineSemaphoreSubmitInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkTimelineSemaphoreSubmitInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->waitSemaphoreValueCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     forUnmarshaling->pWaitSemaphoreValues = (const uint64_t*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pWaitSemaphoreValues)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pWaitSemaphoreValues, forUnmarshaling->waitSemaphoreValueCount * sizeof(const uint64_t));
-        vkStream->read((uint64_t*)forUnmarshaling->pWaitSemaphoreValues, forUnmarshaling->waitSemaphoreValueCount * sizeof(const uint64_t));
+    if (forUnmarshaling->pWaitSemaphoreValues) {
+        vkStream->alloc((void**)&forUnmarshaling->pWaitSemaphoreValues,
+                        forUnmarshaling->waitSemaphoreValueCount * sizeof(const uint64_t));
+        vkStream->read((uint64_t*)forUnmarshaling->pWaitSemaphoreValues,
+                       forUnmarshaling->waitSemaphoreValueCount * sizeof(const uint64_t));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->signalSemaphoreValueCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     forUnmarshaling->pSignalSemaphoreValues = (const uint64_t*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pSignalSemaphoreValues)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pSignalSemaphoreValues, forUnmarshaling->signalSemaphoreValueCount * sizeof(const uint64_t));
-        vkStream->read((uint64_t*)forUnmarshaling->pSignalSemaphoreValues, forUnmarshaling->signalSemaphoreValueCount * sizeof(const uint64_t));
+    if (forUnmarshaling->pSignalSemaphoreValues) {
+        vkStream->alloc((void**)&forUnmarshaling->pSignalSemaphoreValues,
+                        forUnmarshaling->signalSemaphoreValueCount * sizeof(const uint64_t));
+        vkStream->read((uint64_t*)forUnmarshaling->pSignalSemaphoreValues,
+                       forUnmarshaling->signalSemaphoreValueCount * sizeof(const uint64_t));
     }
 }
 
-void marshal_VkSemaphoreWaitInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSemaphoreWaitInfo* forMarshaling)
-{
+void marshal_VkSemaphoreWaitInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkSemaphoreWaitInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkSemaphoreWaitFlags*)&forMarshaling->flags, sizeof(VkSemaphoreWaitFlags));
     vkStream->write((uint32_t*)&forMarshaling->semaphoreCount, sizeof(uint32_t));
-    if (forMarshaling->semaphoreCount)
-    {
+    if (forMarshaling->semaphoreCount) {
         uint64_t* cgen_var_0;
         vkStream->alloc((void**)&cgen_var_0, forMarshaling->semaphoreCount * 8);
-        vkStream->handleMapping()->mapHandles_VkSemaphore_u64(forMarshaling->pSemaphores, cgen_var_0, forMarshaling->semaphoreCount);
+        vkStream->handleMapping()->mapHandles_VkSemaphore_u64(
+            forMarshaling->pSemaphores, cgen_var_0, forMarshaling->semaphoreCount);
         vkStream->write((uint64_t*)cgen_var_0, forMarshaling->semaphoreCount * 8);
     }
-    vkStream->write((const uint64_t*)forMarshaling->pValues, forMarshaling->semaphoreCount * sizeof(const uint64_t));
+    vkStream->write((const uint64_t*)forMarshaling->pValues,
+                    forMarshaling->semaphoreCount * sizeof(const uint64_t));
 }
 
-void unmarshal_VkSemaphoreWaitInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSemaphoreWaitInfo* forUnmarshaling)
-{
+void unmarshal_VkSemaphoreWaitInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkSemaphoreWaitInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkSemaphoreWaitFlags*)&forUnmarshaling->flags, sizeof(VkSemaphoreWaitFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->semaphoreCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pSemaphores, forUnmarshaling->semaphoreCount * sizeof(const VkSemaphore));
-    if (forUnmarshaling->semaphoreCount)
-    {
+    vkStream->alloc((void**)&forUnmarshaling->pSemaphores,
+                    forUnmarshaling->semaphoreCount * sizeof(const VkSemaphore));
+    if (forUnmarshaling->semaphoreCount) {
         uint64_t* cgen_var_0;
         vkStream->alloc((void**)&cgen_var_0, forUnmarshaling->semaphoreCount * 8);
         vkStream->read((uint64_t*)cgen_var_0, forUnmarshaling->semaphoreCount * 8);
-        vkStream->handleMapping()->mapHandles_u64_VkSemaphore(cgen_var_0, (VkSemaphore*)forUnmarshaling->pSemaphores, forUnmarshaling->semaphoreCount);
+        vkStream->handleMapping()->mapHandles_u64_VkSemaphore(
+            cgen_var_0, (VkSemaphore*)forUnmarshaling->pSemaphores,
+            forUnmarshaling->semaphoreCount);
     }
-    vkStream->alloc((void**)&forUnmarshaling->pValues, forUnmarshaling->semaphoreCount * sizeof(const uint64_t));
-    vkStream->read((uint64_t*)forUnmarshaling->pValues, forUnmarshaling->semaphoreCount * sizeof(const uint64_t));
+    vkStream->alloc((void**)&forUnmarshaling->pValues,
+                    forUnmarshaling->semaphoreCount * sizeof(const uint64_t));
+    vkStream->read((uint64_t*)forUnmarshaling->pValues,
+                   forUnmarshaling->semaphoreCount * sizeof(const uint64_t));
 }
 
-void marshal_VkSemaphoreSignalInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSemaphoreSignalInfo* forMarshaling)
-{
+void marshal_VkSemaphoreSignalInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkSemaphoreSignalInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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_VkSemaphore_u64(&forMarshaling->semaphore, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkSemaphore_u64(&forMarshaling->semaphore, &cgen_var_0,
+                                                          1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->write((uint64_t*)&forMarshaling->value, sizeof(uint64_t));
 }
 
-void unmarshal_VkSemaphoreSignalInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSemaphoreSignalInfo* forUnmarshaling)
-{
+void unmarshal_VkSemaphoreSignalInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkSemaphoreSignalInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkSemaphore(&cgen_var_0, (VkSemaphore*)&forUnmarshaling->semaphore, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkSemaphore(
+        &cgen_var_0, (VkSemaphore*)&forUnmarshaling->semaphore, 1);
     vkStream->read((uint64_t*)&forUnmarshaling->value, sizeof(uint64_t));
 }
 
 void marshal_VkPhysicalDeviceBufferDeviceAddressFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceBufferDeviceAddressFeatures* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceBufferDeviceAddressFeatures* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -10957,25 +10341,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceBufferDeviceAddressFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceBufferDeviceAddressFeatures* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceBufferDeviceAddressFeatures* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -10984,15 +10366,11 @@
     vkStream->read((VkBool32*)&forUnmarshaling->bufferDeviceAddressMultiDevice, sizeof(VkBool32));
 }
 
-void marshal_VkBufferDeviceAddressInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBufferDeviceAddressInfo* forMarshaling)
-{
+void marshal_VkBufferDeviceAddressInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkBufferDeviceAddressInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -11001,43 +10379,38 @@
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
 }
 
-void unmarshal_VkBufferDeviceAddressInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferDeviceAddressInfo* forUnmarshaling)
-{
+void unmarshal_VkBufferDeviceAddressInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkBufferDeviceAddressInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkBuffer(&cgen_var_0, (VkBuffer*)&forUnmarshaling->buffer, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_0,
+                                                       (VkBuffer*)&forUnmarshaling->buffer, 1);
 }
 
 void marshal_VkBufferOpaqueCaptureAddressCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBufferOpaqueCaptureAddressCreateInfo* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkBufferOpaqueCaptureAddressCreateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -11045,25 +10418,23 @@
 }
 
 void unmarshal_VkBufferOpaqueCaptureAddressCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferOpaqueCaptureAddressCreateInfo* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBufferOpaqueCaptureAddressCreateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -11071,14 +10442,11 @@
 }
 
 void marshal_VkMemoryOpaqueCaptureAddressAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMemoryOpaqueCaptureAddressAllocateInfo* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkMemoryOpaqueCaptureAddressAllocateInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -11086,25 +10454,23 @@
 }
 
 void unmarshal_VkMemoryOpaqueCaptureAddressAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryOpaqueCaptureAddressAllocateInfo* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkMemoryOpaqueCaptureAddressAllocateInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -11112,57 +10478,51 @@
 }
 
 void marshal_VkDeviceMemoryOpaqueCaptureAddressInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDeviceMemoryOpaqueCaptureAddressInfo* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkDeviceMemoryOpaqueCaptureAddressInfo* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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_VkDeviceMemory_u64(&forMarshaling->memory, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkDeviceMemory_u64(&forMarshaling->memory, &cgen_var_0,
+                                                             1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
 }
 
 void unmarshal_VkDeviceMemoryOpaqueCaptureAddressInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceMemoryOpaqueCaptureAddressInfo* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDeviceMemoryOpaqueCaptureAddressInfo* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkDeviceMemory(&cgen_var_0, (VkDeviceMemory*)&forUnmarshaling->memory, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkDeviceMemory(
+        &cgen_var_0, (VkDeviceMemory*)&forUnmarshaling->memory, 1);
 }
 
 #endif
 #ifdef VK_KHR_surface
-void marshal_VkSurfaceCapabilitiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSurfaceCapabilitiesKHR* forMarshaling)
-{
+void marshal_VkSurfaceCapabilitiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkSurfaceCapabilitiesKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->minImageCount, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxImageCount, sizeof(uint32_t));
@@ -11170,17 +10530,18 @@
     marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->minImageExtent));
     marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->maxImageExtent));
     vkStream->write((uint32_t*)&forMarshaling->maxImageArrayLayers, sizeof(uint32_t));
-    vkStream->write((VkSurfaceTransformFlagsKHR*)&forMarshaling->supportedTransforms, sizeof(VkSurfaceTransformFlagsKHR));
-    vkStream->write((VkSurfaceTransformFlagBitsKHR*)&forMarshaling->currentTransform, sizeof(VkSurfaceTransformFlagBitsKHR));
-    vkStream->write((VkCompositeAlphaFlagsKHR*)&forMarshaling->supportedCompositeAlpha, sizeof(VkCompositeAlphaFlagsKHR));
-    vkStream->write((VkImageUsageFlags*)&forMarshaling->supportedUsageFlags, sizeof(VkImageUsageFlags));
+    vkStream->write((VkSurfaceTransformFlagsKHR*)&forMarshaling->supportedTransforms,
+                    sizeof(VkSurfaceTransformFlagsKHR));
+    vkStream->write((VkSurfaceTransformFlagBitsKHR*)&forMarshaling->currentTransform,
+                    sizeof(VkSurfaceTransformFlagBitsKHR));
+    vkStream->write((VkCompositeAlphaFlagsKHR*)&forMarshaling->supportedCompositeAlpha,
+                    sizeof(VkCompositeAlphaFlagsKHR));
+    vkStream->write((VkImageUsageFlags*)&forMarshaling->supportedUsageFlags,
+                    sizeof(VkImageUsageFlags));
 }
 
-void unmarshal_VkSurfaceCapabilitiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSurfaceCapabilitiesKHR* forUnmarshaling)
-{
+void unmarshal_VkSurfaceCapabilitiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkSurfaceCapabilitiesKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->minImageCount, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxImageCount, sizeof(uint32_t));
@@ -11188,27 +10549,25 @@
     unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->minImageExtent));
     unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->maxImageExtent));
     vkStream->read((uint32_t*)&forUnmarshaling->maxImageArrayLayers, sizeof(uint32_t));
-    vkStream->read((VkSurfaceTransformFlagsKHR*)&forUnmarshaling->supportedTransforms, sizeof(VkSurfaceTransformFlagsKHR));
-    vkStream->read((VkSurfaceTransformFlagBitsKHR*)&forUnmarshaling->currentTransform, sizeof(VkSurfaceTransformFlagBitsKHR));
-    vkStream->read((VkCompositeAlphaFlagsKHR*)&forUnmarshaling->supportedCompositeAlpha, sizeof(VkCompositeAlphaFlagsKHR));
-    vkStream->read((VkImageUsageFlags*)&forUnmarshaling->supportedUsageFlags, sizeof(VkImageUsageFlags));
+    vkStream->read((VkSurfaceTransformFlagsKHR*)&forUnmarshaling->supportedTransforms,
+                   sizeof(VkSurfaceTransformFlagsKHR));
+    vkStream->read((VkSurfaceTransformFlagBitsKHR*)&forUnmarshaling->currentTransform,
+                   sizeof(VkSurfaceTransformFlagBitsKHR));
+    vkStream->read((VkCompositeAlphaFlagsKHR*)&forUnmarshaling->supportedCompositeAlpha,
+                   sizeof(VkCompositeAlphaFlagsKHR));
+    vkStream->read((VkImageUsageFlags*)&forUnmarshaling->supportedUsageFlags,
+                   sizeof(VkImageUsageFlags));
 }
 
-void marshal_VkSurfaceFormatKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSurfaceFormatKHR* forMarshaling)
-{
+void marshal_VkSurfaceFormatKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                const VkSurfaceFormatKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkFormat*)&forMarshaling->format, sizeof(VkFormat));
     vkStream->write((VkColorSpaceKHR*)&forMarshaling->colorSpace, sizeof(VkColorSpaceKHR));
 }
 
-void unmarshal_VkSurfaceFormatKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSurfaceFormatKHR* forUnmarshaling)
-{
+void unmarshal_VkSurfaceFormatKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkSurfaceFormatKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkFormat*)&forUnmarshaling->format, sizeof(VkFormat));
     vkStream->read((VkColorSpaceKHR*)&forUnmarshaling->colorSpace, sizeof(VkColorSpaceKHR));
@@ -11216,19 +10575,16 @@
 
 #endif
 #ifdef VK_KHR_swapchain
-void marshal_VkSwapchainCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSwapchainCreateInfoKHR* forMarshaling)
-{
+void marshal_VkSwapchainCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkSwapchainCreateInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkSwapchainCreateFlagsKHR*)&forMarshaling->flags, sizeof(VkSwapchainCreateFlagsKHR));
+    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);
@@ -11243,46 +10599,48 @@
     // 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));
+    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((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->handleMapping()->mapHandles_VkSwapchainKHR_u64(&forMarshaling->oldSwapchain,
+                                                             &cgen_var_2, 1);
     vkStream->write((uint64_t*)&cgen_var_2, 1 * 8);
 }
 
-void unmarshal_VkSwapchainCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSwapchainCreateInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkSwapchainCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkSwapchainCreateInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkSwapchainCreateFlagsKHR*)&forUnmarshaling->flags, sizeof(VkSwapchainCreateFlagsKHR));
+    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->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));
@@ -11293,220 +10651,215 @@
     vkStream->read((uint32_t*)&forUnmarshaling->queueFamilyIndexCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     forUnmarshaling->pQueueFamilyIndices = (const uint32_t*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pQueueFamilyIndices)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pQueueFamilyIndices, forUnmarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
-        vkStream->read((uint32_t*)forUnmarshaling->pQueueFamilyIndices, forUnmarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
+    if (forUnmarshaling->pQueueFamilyIndices) {
+        vkStream->alloc((void**)&forUnmarshaling->pQueueFamilyIndices,
+                        forUnmarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
+        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((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);
+    vkStream->handleMapping()->mapHandles_u64_VkSwapchainKHR(
+        &cgen_var_2, (VkSwapchainKHR*)&forUnmarshaling->oldSwapchain, 1);
 }
 
-void marshal_VkPresentInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPresentInfoKHR* forMarshaling)
-{
+void marshal_VkPresentInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                              const VkPresentInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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)
-    {
+    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->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)
-    {
+    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->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));
+    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));
+    if (forMarshaling->pResults) {
+        vkStream->write((VkResult*)forMarshaling->pResults,
+                        forMarshaling->swapchainCount * sizeof(VkResult));
     }
 }
 
-void unmarshal_VkPresentInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPresentInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkPresentInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                VkPresentInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->waitSemaphoreCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pWaitSemaphores, forUnmarshaling->waitSemaphoreCount * sizeof(const VkSemaphore));
-    if (forUnmarshaling->waitSemaphoreCount)
-    {
+    vkStream->alloc((void**)&forUnmarshaling->pWaitSemaphores,
+                    forUnmarshaling->waitSemaphoreCount * sizeof(const VkSemaphore));
+    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->handleMapping()->mapHandles_u64_VkSemaphore(
+            cgen_var_0, (VkSemaphore*)forUnmarshaling->pWaitSemaphores,
+            forUnmarshaling->waitSemaphoreCount);
     }
     vkStream->read((uint32_t*)&forUnmarshaling->swapchainCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pSwapchains, forUnmarshaling->swapchainCount * sizeof(const VkSwapchainKHR));
-    if (forUnmarshaling->swapchainCount)
-    {
+    vkStream->alloc((void**)&forUnmarshaling->pSwapchains,
+                    forUnmarshaling->swapchainCount * sizeof(const VkSwapchainKHR));
+    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->handleMapping()->mapHandles_u64_VkSwapchainKHR(
+            cgen_var_1, (VkSwapchainKHR*)forUnmarshaling->pSwapchains,
+            forUnmarshaling->swapchainCount);
     }
-    vkStream->alloc((void**)&forUnmarshaling->pImageIndices, forUnmarshaling->swapchainCount * sizeof(const uint32_t));
-    vkStream->read((uint32_t*)forUnmarshaling->pImageIndices, forUnmarshaling->swapchainCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pImageIndices,
+                    forUnmarshaling->swapchainCount * sizeof(const uint32_t));
+    vkStream->read((uint32_t*)forUnmarshaling->pImageIndices,
+                   forUnmarshaling->swapchainCount * sizeof(const uint32_t));
     // WARNING PTR CHECK
     forUnmarshaling->pResults = (VkResult*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pResults)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pResults, forUnmarshaling->swapchainCount * sizeof(VkResult));
-        vkStream->read((VkResult*)forUnmarshaling->pResults, forUnmarshaling->swapchainCount * sizeof(VkResult));
+    if (forUnmarshaling->pResults) {
+        vkStream->alloc((void**)&forUnmarshaling->pResults,
+                        forUnmarshaling->swapchainCount * sizeof(VkResult));
+        vkStream->read((VkResult*)forUnmarshaling->pResults,
+                       forUnmarshaling->swapchainCount * sizeof(VkResult));
     }
 }
 
-void marshal_VkImageSwapchainCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageSwapchainCreateInfoKHR* forMarshaling)
-{
+void marshal_VkImageSwapchainCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkImageSwapchainCreateInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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->handleMapping()->mapHandles_VkSwapchainKHR_u64(&forMarshaling->swapchain, &cgen_var_0,
+                                                             1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
 }
 
-void unmarshal_VkImageSwapchainCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageSwapchainCreateInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkImageSwapchainCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkImageSwapchainCreateInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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->handleMapping()->mapHandles_u64_VkSwapchainKHR(
+        &cgen_var_0, (VkSwapchainKHR*)&forUnmarshaling->swapchain, 1);
 }
 
 void marshal_VkBindImageMemorySwapchainInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBindImageMemorySwapchainInfoKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkBindImageMemorySwapchainInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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->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(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindImageMemorySwapchainInfoKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBindImageMemorySwapchainInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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->handleMapping()->mapHandles_u64_VkSwapchainKHR(
+        &cgen_var_0, (VkSwapchainKHR*)&forUnmarshaling->swapchain, 1);
     vkStream->read((uint32_t*)&forUnmarshaling->imageIndex, sizeof(uint32_t));
 }
 
-void marshal_VkAcquireNextImageInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAcquireNextImageInfoKHR* forMarshaling)
-{
+void marshal_VkAcquireNextImageInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkAcquireNextImageInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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->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->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);
@@ -11514,268 +10867,249 @@
     vkStream->write((uint32_t*)&forMarshaling->deviceMask, sizeof(uint32_t));
 }
 
-void unmarshal_VkAcquireNextImageInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAcquireNextImageInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkAcquireNextImageInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkAcquireNextImageInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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->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);
+    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->handleMapping()->mapHandles_u64_VkFence(&cgen_var_2,
+                                                      (VkFence*)&forUnmarshaling->fence, 1);
     vkStream->read((uint32_t*)&forUnmarshaling->deviceMask, sizeof(uint32_t));
 }
 
 void marshal_VkDeviceGroupPresentCapabilitiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDeviceGroupPresentCapabilitiesKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkDeviceGroupPresentCapabilitiesKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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));
+    vkStream->write((uint32_t*)forMarshaling->presentMask,
+                    VK_MAX_DEVICE_GROUP_SIZE * sizeof(uint32_t));
+    vkStream->write((VkDeviceGroupPresentModeFlagsKHR*)&forMarshaling->modes,
+                    sizeof(VkDeviceGroupPresentModeFlagsKHR));
 }
 
 void unmarshal_VkDeviceGroupPresentCapabilitiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceGroupPresentCapabilitiesKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDeviceGroupPresentCapabilitiesKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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));
+    vkStream->read((uint32_t*)forUnmarshaling->presentMask,
+                   VK_MAX_DEVICE_GROUP_SIZE * sizeof(uint32_t));
+    vkStream->read((VkDeviceGroupPresentModeFlagsKHR*)&forUnmarshaling->modes,
+                   sizeof(VkDeviceGroupPresentModeFlagsKHR));
 }
 
-void marshal_VkDeviceGroupPresentInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDeviceGroupPresentInfoKHR* forMarshaling)
-{
+void marshal_VkDeviceGroupPresentInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkDeviceGroupPresentInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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));
+    vkStream->write((const uint32_t*)forMarshaling->pDeviceMasks,
+                    forMarshaling->swapchainCount * sizeof(const uint32_t));
+    vkStream->write((VkDeviceGroupPresentModeFlagBitsKHR*)&forMarshaling->mode,
+                    sizeof(VkDeviceGroupPresentModeFlagBitsKHR));
 }
 
-void unmarshal_VkDeviceGroupPresentInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceGroupPresentInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkDeviceGroupPresentInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkDeviceGroupPresentInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->swapchainCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pDeviceMasks, forUnmarshaling->swapchainCount * sizeof(const uint32_t));
-    vkStream->read((uint32_t*)forUnmarshaling->pDeviceMasks, forUnmarshaling->swapchainCount * sizeof(const uint32_t));
-    vkStream->read((VkDeviceGroupPresentModeFlagBitsKHR*)&forUnmarshaling->mode, sizeof(VkDeviceGroupPresentModeFlagBitsKHR));
+    vkStream->alloc((void**)&forUnmarshaling->pDeviceMasks,
+                    forUnmarshaling->swapchainCount * sizeof(const uint32_t));
+    vkStream->read((uint32_t*)forUnmarshaling->pDeviceMasks,
+                   forUnmarshaling->swapchainCount * sizeof(const uint32_t));
+    vkStream->read((VkDeviceGroupPresentModeFlagBitsKHR*)&forUnmarshaling->mode,
+                   sizeof(VkDeviceGroupPresentModeFlagBitsKHR));
 }
 
 void marshal_VkDeviceGroupSwapchainCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDeviceGroupSwapchainCreateInfoKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkDeviceGroupSwapchainCreateInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkDeviceGroupPresentModeFlagsKHR*)&forMarshaling->modes, sizeof(VkDeviceGroupPresentModeFlagsKHR));
+    vkStream->write((VkDeviceGroupPresentModeFlagsKHR*)&forMarshaling->modes,
+                    sizeof(VkDeviceGroupPresentModeFlagsKHR));
 }
 
 void unmarshal_VkDeviceGroupSwapchainCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceGroupSwapchainCreateInfoKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDeviceGroupSwapchainCreateInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkDeviceGroupPresentModeFlagsKHR*)&forUnmarshaling->modes, sizeof(VkDeviceGroupPresentModeFlagsKHR));
+    vkStream->read((VkDeviceGroupPresentModeFlagsKHR*)&forUnmarshaling->modes,
+                   sizeof(VkDeviceGroupPresentModeFlagsKHR));
 }
 
 #endif
 #ifdef VK_KHR_display
-void marshal_VkDisplayModeParametersKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDisplayModeParametersKHR* forMarshaling)
-{
+void marshal_VkDisplayModeParametersKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                        const VkDisplayModeParametersKHR* forMarshaling) {
     (void)rootType;
     marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->visibleRegion));
     vkStream->write((uint32_t*)&forMarshaling->refreshRate, sizeof(uint32_t));
 }
 
-void unmarshal_VkDisplayModeParametersKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayModeParametersKHR* forUnmarshaling)
-{
+void unmarshal_VkDisplayModeParametersKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkDisplayModeParametersKHR* forUnmarshaling) {
     (void)rootType;
     unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->visibleRegion));
     vkStream->read((uint32_t*)&forUnmarshaling->refreshRate, sizeof(uint32_t));
 }
 
-void marshal_VkDisplayModeCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDisplayModeCreateInfoKHR* forMarshaling)
-{
+void marshal_VkDisplayModeCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                        const VkDisplayModeCreateInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkDisplayModeCreateFlagsKHR*)&forMarshaling->flags, sizeof(VkDisplayModeCreateFlagsKHR));
-    marshal_VkDisplayModeParametersKHR(vkStream, rootType, (VkDisplayModeParametersKHR*)(&forMarshaling->parameters));
+    vkStream->write((VkDisplayModeCreateFlagsKHR*)&forMarshaling->flags,
+                    sizeof(VkDisplayModeCreateFlagsKHR));
+    marshal_VkDisplayModeParametersKHR(vkStream, rootType,
+                                       (VkDisplayModeParametersKHR*)(&forMarshaling->parameters));
 }
 
-void unmarshal_VkDisplayModeCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayModeCreateInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkDisplayModeCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkDisplayModeCreateInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkDisplayModeCreateFlagsKHR*)&forUnmarshaling->flags, sizeof(VkDisplayModeCreateFlagsKHR));
-    unmarshal_VkDisplayModeParametersKHR(vkStream, rootType, (VkDisplayModeParametersKHR*)(&forUnmarshaling->parameters));
+    vkStream->read((VkDisplayModeCreateFlagsKHR*)&forUnmarshaling->flags,
+                   sizeof(VkDisplayModeCreateFlagsKHR));
+    unmarshal_VkDisplayModeParametersKHR(
+        vkStream, rootType, (VkDisplayModeParametersKHR*)(&forUnmarshaling->parameters));
 }
 
-void marshal_VkDisplayModePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDisplayModePropertiesKHR* forMarshaling)
-{
+void marshal_VkDisplayModePropertiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                        const VkDisplayModePropertiesKHR* forMarshaling) {
     (void)rootType;
     uint64_t cgen_var_0;
-    vkStream->handleMapping()->mapHandles_VkDisplayModeKHR_u64(&forMarshaling->displayMode, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkDisplayModeKHR_u64(&forMarshaling->displayMode,
+                                                               &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
-    marshal_VkDisplayModeParametersKHR(vkStream, rootType, (VkDisplayModeParametersKHR*)(&forMarshaling->parameters));
+    marshal_VkDisplayModeParametersKHR(vkStream, rootType,
+                                       (VkDisplayModeParametersKHR*)(&forMarshaling->parameters));
 }
 
-void unmarshal_VkDisplayModePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayModePropertiesKHR* forUnmarshaling)
-{
+void unmarshal_VkDisplayModePropertiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkDisplayModePropertiesKHR* forUnmarshaling) {
     (void)rootType;
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkDisplayModeKHR(&cgen_var_0, (VkDisplayModeKHR*)&forUnmarshaling->displayMode, 1);
-    unmarshal_VkDisplayModeParametersKHR(vkStream, rootType, (VkDisplayModeParametersKHR*)(&forUnmarshaling->parameters));
+    vkStream->handleMapping()->mapHandles_u64_VkDisplayModeKHR(
+        &cgen_var_0, (VkDisplayModeKHR*)&forUnmarshaling->displayMode, 1);
+    unmarshal_VkDisplayModeParametersKHR(
+        vkStream, rootType, (VkDisplayModeParametersKHR*)(&forUnmarshaling->parameters));
 }
 
-void marshal_VkDisplayPlaneCapabilitiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDisplayPlaneCapabilitiesKHR* forMarshaling)
-{
+void marshal_VkDisplayPlaneCapabilitiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkDisplayPlaneCapabilitiesKHR* forMarshaling) {
     (void)rootType;
-    vkStream->write((VkDisplayPlaneAlphaFlagsKHR*)&forMarshaling->supportedAlpha, sizeof(VkDisplayPlaneAlphaFlagsKHR));
+    vkStream->write((VkDisplayPlaneAlphaFlagsKHR*)&forMarshaling->supportedAlpha,
+                    sizeof(VkDisplayPlaneAlphaFlagsKHR));
     marshal_VkOffset2D(vkStream, rootType, (VkOffset2D*)(&forMarshaling->minSrcPosition));
     marshal_VkOffset2D(vkStream, rootType, (VkOffset2D*)(&forMarshaling->maxSrcPosition));
     marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->minSrcExtent));
@@ -11786,13 +11120,11 @@
     marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->maxDstExtent));
 }
 
-void unmarshal_VkDisplayPlaneCapabilitiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayPlaneCapabilitiesKHR* forUnmarshaling)
-{
+void unmarshal_VkDisplayPlaneCapabilitiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkDisplayPlaneCapabilitiesKHR* forUnmarshaling) {
     (void)rootType;
-    vkStream->read((VkDisplayPlaneAlphaFlagsKHR*)&forUnmarshaling->supportedAlpha, sizeof(VkDisplayPlaneAlphaFlagsKHR));
+    vkStream->read((VkDisplayPlaneAlphaFlagsKHR*)&forUnmarshaling->supportedAlpha,
+                   sizeof(VkDisplayPlaneAlphaFlagsKHR));
     unmarshal_VkOffset2D(vkStream, rootType, (VkOffset2D*)(&forUnmarshaling->minSrcPosition));
     unmarshal_VkOffset2D(vkStream, rootType, (VkOffset2D*)(&forUnmarshaling->maxSrcPosition));
     unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->minSrcExtent));
@@ -11803,35 +11135,28 @@
     unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->maxDstExtent));
 }
 
-void marshal_VkDisplayPlanePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDisplayPlanePropertiesKHR* forMarshaling)
-{
+void marshal_VkDisplayPlanePropertiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkDisplayPlanePropertiesKHR* forMarshaling) {
     (void)rootType;
     uint64_t cgen_var_0;
-    vkStream->handleMapping()->mapHandles_VkDisplayKHR_u64(&forMarshaling->currentDisplay, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkDisplayKHR_u64(&forMarshaling->currentDisplay,
+                                                           &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->write((uint32_t*)&forMarshaling->currentStackIndex, sizeof(uint32_t));
 }
 
-void unmarshal_VkDisplayPlanePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayPlanePropertiesKHR* forUnmarshaling)
-{
+void unmarshal_VkDisplayPlanePropertiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkDisplayPlanePropertiesKHR* forUnmarshaling) {
     (void)rootType;
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkDisplayKHR(&cgen_var_0, (VkDisplayKHR*)&forUnmarshaling->currentDisplay, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkDisplayKHR(
+        &cgen_var_0, (VkDisplayKHR*)&forUnmarshaling->currentDisplay, 1);
     vkStream->read((uint32_t*)&forUnmarshaling->currentStackIndex, sizeof(uint32_t));
 }
 
-void marshal_VkDisplayPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDisplayPropertiesKHR* forMarshaling)
-{
+void marshal_VkDisplayPropertiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                    const VkDisplayPropertiesKHR* forMarshaling) {
     (void)rootType;
     uint64_t cgen_var_0;
     vkStream->handleMapping()->mapHandles_VkDisplayKHR_u64(&forMarshaling->display, &cgen_var_0, 1);
@@ -11839,98 +11164,95 @@
     vkStream->putString(forMarshaling->displayName);
     marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->physicalDimensions));
     marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->physicalResolution));
-    vkStream->write((VkSurfaceTransformFlagsKHR*)&forMarshaling->supportedTransforms, sizeof(VkSurfaceTransformFlagsKHR));
+    vkStream->write((VkSurfaceTransformFlagsKHR*)&forMarshaling->supportedTransforms,
+                    sizeof(VkSurfaceTransformFlagsKHR));
     vkStream->write((VkBool32*)&forMarshaling->planeReorderPossible, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->persistentContent, sizeof(VkBool32));
 }
 
-void unmarshal_VkDisplayPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayPropertiesKHR* forUnmarshaling)
-{
+void unmarshal_VkDisplayPropertiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                      VkDisplayPropertiesKHR* forUnmarshaling) {
     (void)rootType;
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkDisplayKHR(&cgen_var_0, (VkDisplayKHR*)&forUnmarshaling->display, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkDisplayKHR(
+        &cgen_var_0, (VkDisplayKHR*)&forUnmarshaling->display, 1);
     vkStream->loadStringInPlace((char**)&forUnmarshaling->displayName);
     unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->physicalDimensions));
     unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->physicalResolution));
-    vkStream->read((VkSurfaceTransformFlagsKHR*)&forUnmarshaling->supportedTransforms, sizeof(VkSurfaceTransformFlagsKHR));
+    vkStream->read((VkSurfaceTransformFlagsKHR*)&forUnmarshaling->supportedTransforms,
+                   sizeof(VkSurfaceTransformFlagsKHR));
     vkStream->read((VkBool32*)&forUnmarshaling->planeReorderPossible, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->persistentContent, sizeof(VkBool32));
 }
 
-void marshal_VkDisplaySurfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDisplaySurfaceCreateInfoKHR* forMarshaling)
-{
+void marshal_VkDisplaySurfaceCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkDisplaySurfaceCreateInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkDisplaySurfaceCreateFlagsKHR*)&forMarshaling->flags, sizeof(VkDisplaySurfaceCreateFlagsKHR));
+    vkStream->write((VkDisplaySurfaceCreateFlagsKHR*)&forMarshaling->flags,
+                    sizeof(VkDisplaySurfaceCreateFlagsKHR));
     uint64_t cgen_var_0;
-    vkStream->handleMapping()->mapHandles_VkDisplayModeKHR_u64(&forMarshaling->displayMode, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkDisplayModeKHR_u64(&forMarshaling->displayMode,
+                                                               &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->write((uint32_t*)&forMarshaling->planeIndex, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->planeStackIndex, sizeof(uint32_t));
-    vkStream->write((VkSurfaceTransformFlagBitsKHR*)&forMarshaling->transform, sizeof(VkSurfaceTransformFlagBitsKHR));
+    vkStream->write((VkSurfaceTransformFlagBitsKHR*)&forMarshaling->transform,
+                    sizeof(VkSurfaceTransformFlagBitsKHR));
     vkStream->write((float*)&forMarshaling->globalAlpha, sizeof(float));
-    vkStream->write((VkDisplayPlaneAlphaFlagBitsKHR*)&forMarshaling->alphaMode, sizeof(VkDisplayPlaneAlphaFlagBitsKHR));
+    vkStream->write((VkDisplayPlaneAlphaFlagBitsKHR*)&forMarshaling->alphaMode,
+                    sizeof(VkDisplayPlaneAlphaFlagBitsKHR));
     marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->imageExtent));
 }
 
-void unmarshal_VkDisplaySurfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplaySurfaceCreateInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkDisplaySurfaceCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkDisplaySurfaceCreateInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkDisplaySurfaceCreateFlagsKHR*)&forUnmarshaling->flags, sizeof(VkDisplaySurfaceCreateFlagsKHR));
+    vkStream->read((VkDisplaySurfaceCreateFlagsKHR*)&forUnmarshaling->flags,
+                   sizeof(VkDisplaySurfaceCreateFlagsKHR));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkDisplayModeKHR(&cgen_var_0, (VkDisplayModeKHR*)&forUnmarshaling->displayMode, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkDisplayModeKHR(
+        &cgen_var_0, (VkDisplayModeKHR*)&forUnmarshaling->displayMode, 1);
     vkStream->read((uint32_t*)&forUnmarshaling->planeIndex, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->planeStackIndex, sizeof(uint32_t));
-    vkStream->read((VkSurfaceTransformFlagBitsKHR*)&forUnmarshaling->transform, sizeof(VkSurfaceTransformFlagBitsKHR));
+    vkStream->read((VkSurfaceTransformFlagBitsKHR*)&forUnmarshaling->transform,
+                   sizeof(VkSurfaceTransformFlagBitsKHR));
     vkStream->read((float*)&forUnmarshaling->globalAlpha, sizeof(float));
-    vkStream->read((VkDisplayPlaneAlphaFlagBitsKHR*)&forUnmarshaling->alphaMode, sizeof(VkDisplayPlaneAlphaFlagBitsKHR));
+    vkStream->read((VkDisplayPlaneAlphaFlagBitsKHR*)&forUnmarshaling->alphaMode,
+                   sizeof(VkDisplayPlaneAlphaFlagBitsKHR));
     unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->imageExtent));
 }
 
 #endif
 #ifdef VK_KHR_display_swapchain
-void marshal_VkDisplayPresentInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDisplayPresentInfoKHR* forMarshaling)
-{
+void marshal_VkDisplayPresentInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkDisplayPresentInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -11939,26 +11261,23 @@
     vkStream->write((VkBool32*)&forMarshaling->persistent, sizeof(VkBool32));
 }
 
-void unmarshal_VkDisplayPresentInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayPresentInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkDisplayPresentInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkDisplayPresentInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -11969,57 +11288,50 @@
 
 #endif
 #ifdef VK_KHR_xlib_surface
-void marshal_VkXlibSurfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkXlibSurfaceCreateInfoKHR* forMarshaling)
-{
+void marshal_VkXlibSurfaceCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                        const VkXlibSurfaceCreateInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkXlibSurfaceCreateFlagsKHR*)&forMarshaling->flags, sizeof(VkXlibSurfaceCreateFlagsKHR));
+    vkStream->write((VkXlibSurfaceCreateFlagsKHR*)&forMarshaling->flags,
+                    sizeof(VkXlibSurfaceCreateFlagsKHR));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->dpy;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->dpy)
-    {
+    if (forMarshaling->dpy) {
         vkStream->write((Display*)forMarshaling->dpy, sizeof(Display));
     }
     vkStream->write((Window*)&forMarshaling->window, sizeof(Window));
 }
 
-void unmarshal_VkXlibSurfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkXlibSurfaceCreateInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkXlibSurfaceCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkXlibSurfaceCreateInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkXlibSurfaceCreateFlagsKHR*)&forUnmarshaling->flags, sizeof(VkXlibSurfaceCreateFlagsKHR));
+    vkStream->read((VkXlibSurfaceCreateFlagsKHR*)&forUnmarshaling->flags,
+                   sizeof(VkXlibSurfaceCreateFlagsKHR));
     // WARNING PTR CHECK
     forUnmarshaling->dpy = (Display*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->dpy)
-    {
+    if (forUnmarshaling->dpy) {
         vkStream->alloc((void**)&forUnmarshaling->dpy, sizeof(Display));
         vkStream->read((Display*)forUnmarshaling->dpy, sizeof(Display));
     }
@@ -12028,96 +11340,79 @@
 
 #endif
 #ifdef VK_KHR_xcb_surface
-void marshal_VkXcbSurfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkXcbSurfaceCreateInfoKHR* forMarshaling)
-{
+void marshal_VkXcbSurfaceCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkXcbSurfaceCreateInfoKHR* forMarshaling) {
     (void)rootType;
-    
+
     // This struct should never be marshaled / unmarshaled.
     __builtin_trap();
-    
 }
 
-void unmarshal_VkXcbSurfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkXcbSurfaceCreateInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkXcbSurfaceCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkXcbSurfaceCreateInfoKHR* forUnmarshaling) {
     (void)rootType;
-    
+
     // This struct should never be marshaled / unmarshaled.
     __builtin_trap();
-    
 }
 
 #endif
 #ifdef VK_KHR_wayland_surface
-void marshal_VkWaylandSurfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkWaylandSurfaceCreateInfoKHR* forMarshaling)
-{
+void marshal_VkWaylandSurfaceCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkWaylandSurfaceCreateInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkWaylandSurfaceCreateFlagsKHR*)&forMarshaling->flags, sizeof(VkWaylandSurfaceCreateFlagsKHR));
+    vkStream->write((VkWaylandSurfaceCreateFlagsKHR*)&forMarshaling->flags,
+                    sizeof(VkWaylandSurfaceCreateFlagsKHR));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->display;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->display)
-    {
+    if (forMarshaling->display) {
         vkStream->write((wl_display*)forMarshaling->display, sizeof(wl_display));
     }
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)forMarshaling->surface;
     vkStream->putBe64(cgen_var_1);
-    if (forMarshaling->surface)
-    {
+    if (forMarshaling->surface) {
         vkStream->write((wl_surface*)forMarshaling->surface, sizeof(wl_surface));
     }
 }
 
-void unmarshal_VkWaylandSurfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkWaylandSurfaceCreateInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkWaylandSurfaceCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkWaylandSurfaceCreateInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkWaylandSurfaceCreateFlagsKHR*)&forUnmarshaling->flags, sizeof(VkWaylandSurfaceCreateFlagsKHR));
+    vkStream->read((VkWaylandSurfaceCreateFlagsKHR*)&forUnmarshaling->flags,
+                   sizeof(VkWaylandSurfaceCreateFlagsKHR));
     // WARNING PTR CHECK
     forUnmarshaling->display = (wl_display*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->display)
-    {
+    if (forUnmarshaling->display) {
         vkStream->alloc((void**)&forUnmarshaling->display, sizeof(wl_display));
         vkStream->read((wl_display*)forUnmarshaling->display, sizeof(wl_display));
     }
     // WARNING PTR CHECK
     forUnmarshaling->surface = (wl_surface*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->surface)
-    {
+    if (forUnmarshaling->surface) {
         vkStream->alloc((void**)&forUnmarshaling->surface, sizeof(wl_surface));
         vkStream->read((wl_surface*)forUnmarshaling->surface, sizeof(wl_surface));
     }
@@ -12125,56 +11420,49 @@
 
 #endif
 #ifdef VK_KHR_android_surface
-void marshal_VkAndroidSurfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAndroidSurfaceCreateInfoKHR* forMarshaling)
-{
+void marshal_VkAndroidSurfaceCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkAndroidSurfaceCreateInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkAndroidSurfaceCreateFlagsKHR*)&forMarshaling->flags, sizeof(VkAndroidSurfaceCreateFlagsKHR));
+    vkStream->write((VkAndroidSurfaceCreateFlagsKHR*)&forMarshaling->flags,
+                    sizeof(VkAndroidSurfaceCreateFlagsKHR));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->window;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->window)
-    {
+    if (forMarshaling->window) {
         vkStream->write((ANativeWindow*)forMarshaling->window, sizeof(ANativeWindow));
     }
 }
 
-void unmarshal_VkAndroidSurfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAndroidSurfaceCreateInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkAndroidSurfaceCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkAndroidSurfaceCreateInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkAndroidSurfaceCreateFlagsKHR*)&forUnmarshaling->flags, sizeof(VkAndroidSurfaceCreateFlagsKHR));
+    vkStream->read((VkAndroidSurfaceCreateFlagsKHR*)&forUnmarshaling->flags,
+                   sizeof(VkAndroidSurfaceCreateFlagsKHR));
     // WARNING PTR CHECK
     forUnmarshaling->window = (ANativeWindow*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->window)
-    {
+    if (forUnmarshaling->window) {
         vkStream->alloc((void**)&forUnmarshaling->window, sizeof(ANativeWindow));
         vkStream->read((ANativeWindow*)forUnmarshaling->window, sizeof(ANativeWindow));
     }
@@ -12182,47 +11470,42 @@
 
 #endif
 #ifdef VK_KHR_win32_surface
-void marshal_VkWin32SurfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkWin32SurfaceCreateInfoKHR* forMarshaling)
-{
+void marshal_VkWin32SurfaceCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkWin32SurfaceCreateInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkWin32SurfaceCreateFlagsKHR*)&forMarshaling->flags, sizeof(VkWin32SurfaceCreateFlagsKHR));
+    vkStream->write((VkWin32SurfaceCreateFlagsKHR*)&forMarshaling->flags,
+                    sizeof(VkWin32SurfaceCreateFlagsKHR));
     vkStream->write((HINSTANCE*)&forMarshaling->hinstance, sizeof(HINSTANCE));
     vkStream->write((HWND*)&forMarshaling->hwnd, sizeof(HWND));
 }
 
-void unmarshal_VkWin32SurfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkWin32SurfaceCreateInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkWin32SurfaceCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkWin32SurfaceCreateInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkWin32SurfaceCreateFlagsKHR*)&forUnmarshaling->flags, sizeof(VkWin32SurfaceCreateFlagsKHR));
+    vkStream->read((VkWin32SurfaceCreateFlagsKHR*)&forUnmarshaling->flags,
+                   sizeof(VkWin32SurfaceCreateFlagsKHR));
     vkStream->read((HINSTANCE*)&forUnmarshaling->hinstance, sizeof(HINSTANCE));
     vkStream->read((HWND*)&forUnmarshaling->hwnd, sizeof(HWND));
 }
@@ -12232,186 +11515,179 @@
 #endif
 #ifdef VK_KHR_video_queue
 void marshal_VkVideoQueueFamilyProperties2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoQueueFamilyProperties2KHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkVideoQueueFamilyProperties2KHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkVideoCodecOperationFlagsKHR*)&forMarshaling->videoCodecOperations, sizeof(VkVideoCodecOperationFlagsKHR));
+    vkStream->write((VkVideoCodecOperationFlagsKHR*)&forMarshaling->videoCodecOperations,
+                    sizeof(VkVideoCodecOperationFlagsKHR));
 }
 
-void unmarshal_VkVideoQueueFamilyProperties2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoQueueFamilyProperties2KHR* forUnmarshaling)
-{
+void unmarshal_VkVideoQueueFamilyProperties2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkVideoQueueFamilyProperties2KHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkVideoCodecOperationFlagsKHR*)&forUnmarshaling->videoCodecOperations, sizeof(VkVideoCodecOperationFlagsKHR));
+    vkStream->read((VkVideoCodecOperationFlagsKHR*)&forUnmarshaling->videoCodecOperations,
+                   sizeof(VkVideoCodecOperationFlagsKHR));
 }
 
-void marshal_VkVideoProfileKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoProfileKHR* forMarshaling)
-{
+void marshal_VkVideoProfileKHR(VulkanStream* vkStream, VkStructureType rootType,
+                               const VkVideoProfileKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkVideoCodecOperationFlagBitsKHR*)&forMarshaling->videoCodecOperation, sizeof(VkVideoCodecOperationFlagBitsKHR));
-    vkStream->write((VkVideoChromaSubsamplingFlagsKHR*)&forMarshaling->chromaSubsampling, sizeof(VkVideoChromaSubsamplingFlagsKHR));
-    vkStream->write((VkVideoComponentBitDepthFlagsKHR*)&forMarshaling->lumaBitDepth, sizeof(VkVideoComponentBitDepthFlagsKHR));
-    vkStream->write((VkVideoComponentBitDepthFlagsKHR*)&forMarshaling->chromaBitDepth, sizeof(VkVideoComponentBitDepthFlagsKHR));
+    vkStream->write((VkVideoCodecOperationFlagBitsKHR*)&forMarshaling->videoCodecOperation,
+                    sizeof(VkVideoCodecOperationFlagBitsKHR));
+    vkStream->write((VkVideoChromaSubsamplingFlagsKHR*)&forMarshaling->chromaSubsampling,
+                    sizeof(VkVideoChromaSubsamplingFlagsKHR));
+    vkStream->write((VkVideoComponentBitDepthFlagsKHR*)&forMarshaling->lumaBitDepth,
+                    sizeof(VkVideoComponentBitDepthFlagsKHR));
+    vkStream->write((VkVideoComponentBitDepthFlagsKHR*)&forMarshaling->chromaBitDepth,
+                    sizeof(VkVideoComponentBitDepthFlagsKHR));
 }
 
-void unmarshal_VkVideoProfileKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoProfileKHR* forUnmarshaling)
-{
+void unmarshal_VkVideoProfileKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                 VkVideoProfileKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkVideoCodecOperationFlagBitsKHR*)&forUnmarshaling->videoCodecOperation, sizeof(VkVideoCodecOperationFlagBitsKHR));
-    vkStream->read((VkVideoChromaSubsamplingFlagsKHR*)&forUnmarshaling->chromaSubsampling, sizeof(VkVideoChromaSubsamplingFlagsKHR));
-    vkStream->read((VkVideoComponentBitDepthFlagsKHR*)&forUnmarshaling->lumaBitDepth, sizeof(VkVideoComponentBitDepthFlagsKHR));
-    vkStream->read((VkVideoComponentBitDepthFlagsKHR*)&forUnmarshaling->chromaBitDepth, sizeof(VkVideoComponentBitDepthFlagsKHR));
+    vkStream->read((VkVideoCodecOperationFlagBitsKHR*)&forUnmarshaling->videoCodecOperation,
+                   sizeof(VkVideoCodecOperationFlagBitsKHR));
+    vkStream->read((VkVideoChromaSubsamplingFlagsKHR*)&forUnmarshaling->chromaSubsampling,
+                   sizeof(VkVideoChromaSubsamplingFlagsKHR));
+    vkStream->read((VkVideoComponentBitDepthFlagsKHR*)&forUnmarshaling->lumaBitDepth,
+                   sizeof(VkVideoComponentBitDepthFlagsKHR));
+    vkStream->read((VkVideoComponentBitDepthFlagsKHR*)&forUnmarshaling->chromaBitDepth,
+                   sizeof(VkVideoComponentBitDepthFlagsKHR));
 }
 
-void marshal_VkVideoProfilesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoProfilesKHR* forMarshaling)
-{
+void marshal_VkVideoProfilesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                const VkVideoProfilesKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->profileCount, sizeof(uint32_t));
-    marshal_VkVideoProfileKHR(vkStream, rootType, (const VkVideoProfileKHR*)(forMarshaling->pProfiles));
+    marshal_VkVideoProfileKHR(vkStream, rootType,
+                              (const VkVideoProfileKHR*)(forMarshaling->pProfiles));
 }
 
-void unmarshal_VkVideoProfilesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoProfilesKHR* forUnmarshaling)
-{
+void unmarshal_VkVideoProfilesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkVideoProfilesKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->profileCount, sizeof(uint32_t));
     vkStream->alloc((void**)&forUnmarshaling->pProfiles, sizeof(const VkVideoProfileKHR));
-    unmarshal_VkVideoProfileKHR(vkStream, rootType, (VkVideoProfileKHR*)(forUnmarshaling->pProfiles));
+    unmarshal_VkVideoProfileKHR(vkStream, rootType,
+                                (VkVideoProfileKHR*)(forUnmarshaling->pProfiles));
 }
 
-void marshal_VkVideoCapabilitiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoCapabilitiesKHR* forMarshaling)
-{
+void marshal_VkVideoCapabilitiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                    const VkVideoCapabilitiesKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkVideoCapabilityFlagsKHR*)&forMarshaling->capabilityFlags, sizeof(VkVideoCapabilityFlagsKHR));
-    vkStream->write((VkDeviceSize*)&forMarshaling->minBitstreamBufferOffsetAlignment, sizeof(VkDeviceSize));
-    vkStream->write((VkDeviceSize*)&forMarshaling->minBitstreamBufferSizeAlignment, sizeof(VkDeviceSize));
-    marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->videoPictureExtentGranularity));
+    vkStream->write((VkVideoCapabilityFlagsKHR*)&forMarshaling->capabilityFlags,
+                    sizeof(VkVideoCapabilityFlagsKHR));
+    vkStream->write((VkDeviceSize*)&forMarshaling->minBitstreamBufferOffsetAlignment,
+                    sizeof(VkDeviceSize));
+    vkStream->write((VkDeviceSize*)&forMarshaling->minBitstreamBufferSizeAlignment,
+                    sizeof(VkDeviceSize));
+    marshal_VkExtent2D(vkStream, rootType,
+                       (VkExtent2D*)(&forMarshaling->videoPictureExtentGranularity));
     marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->minExtent));
     marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->maxExtent));
     vkStream->write((uint32_t*)&forMarshaling->maxReferencePicturesSlotsCount, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxReferencePicturesActiveCount, sizeof(uint32_t));
 }
 
-void unmarshal_VkVideoCapabilitiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoCapabilitiesKHR* forUnmarshaling)
-{
+void unmarshal_VkVideoCapabilitiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                      VkVideoCapabilitiesKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkVideoCapabilityFlagsKHR*)&forUnmarshaling->capabilityFlags, sizeof(VkVideoCapabilityFlagsKHR));
-    vkStream->read((VkDeviceSize*)&forUnmarshaling->minBitstreamBufferOffsetAlignment, sizeof(VkDeviceSize));
-    vkStream->read((VkDeviceSize*)&forUnmarshaling->minBitstreamBufferSizeAlignment, sizeof(VkDeviceSize));
-    unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->videoPictureExtentGranularity));
+    vkStream->read((VkVideoCapabilityFlagsKHR*)&forUnmarshaling->capabilityFlags,
+                   sizeof(VkVideoCapabilityFlagsKHR));
+    vkStream->read((VkDeviceSize*)&forUnmarshaling->minBitstreamBufferOffsetAlignment,
+                   sizeof(VkDeviceSize));
+    vkStream->read((VkDeviceSize*)&forUnmarshaling->minBitstreamBufferSizeAlignment,
+                   sizeof(VkDeviceSize));
+    unmarshal_VkExtent2D(vkStream, rootType,
+                         (VkExtent2D*)(&forUnmarshaling->videoPictureExtentGranularity));
     unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->minExtent));
     unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->maxExtent));
     vkStream->read((uint32_t*)&forUnmarshaling->maxReferencePicturesSlotsCount, sizeof(uint32_t));
@@ -12419,99 +11695,85 @@
 }
 
 void marshal_VkPhysicalDeviceVideoFormatInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceVideoFormatInfoKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceVideoFormatInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkImageUsageFlags*)&forMarshaling->imageUsage, sizeof(VkImageUsageFlags));
-    marshal_VkVideoProfilesKHR(vkStream, rootType, (const VkVideoProfilesKHR*)(forMarshaling->pVideoProfiles));
+    marshal_VkVideoProfilesKHR(vkStream, rootType,
+                               (const VkVideoProfilesKHR*)(forMarshaling->pVideoProfiles));
 }
 
 void unmarshal_VkPhysicalDeviceVideoFormatInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceVideoFormatInfoKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceVideoFormatInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkImageUsageFlags*)&forUnmarshaling->imageUsage, sizeof(VkImageUsageFlags));
     vkStream->alloc((void**)&forUnmarshaling->pVideoProfiles, sizeof(const VkVideoProfilesKHR));
-    unmarshal_VkVideoProfilesKHR(vkStream, rootType, (VkVideoProfilesKHR*)(forUnmarshaling->pVideoProfiles));
+    unmarshal_VkVideoProfilesKHR(vkStream, rootType,
+                                 (VkVideoProfilesKHR*)(forUnmarshaling->pVideoProfiles));
 }
 
-void marshal_VkVideoFormatPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoFormatPropertiesKHR* forMarshaling)
-{
+void marshal_VkVideoFormatPropertiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                        const VkVideoFormatPropertiesKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkFormat*)&forMarshaling->format, sizeof(VkFormat));
 }
 
-void unmarshal_VkVideoFormatPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoFormatPropertiesKHR* forUnmarshaling)
-{
+void unmarshal_VkVideoFormatPropertiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkVideoFormatPropertiesKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkFormat*)&forUnmarshaling->format, sizeof(VkFormat));
 }
 
-void marshal_VkVideoPictureResourceKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoPictureResourceKHR* forMarshaling)
-{
+void marshal_VkVideoPictureResourceKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkVideoPictureResourceKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -12519,30 +11781,28 @@
     marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->codedExtent));
     vkStream->write((uint32_t*)&forMarshaling->baseArrayLayer, sizeof(uint32_t));
     uint64_t cgen_var_0;
-    vkStream->handleMapping()->mapHandles_VkImageView_u64(&forMarshaling->imageViewBinding, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkImageView_u64(&forMarshaling->imageViewBinding,
+                                                          &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
 }
 
-void unmarshal_VkVideoPictureResourceKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoPictureResourceKHR* forUnmarshaling)
-{
+void unmarshal_VkVideoPictureResourceKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkVideoPictureResourceKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -12551,163 +11811,148 @@
     vkStream->read((uint32_t*)&forUnmarshaling->baseArrayLayer, sizeof(uint32_t));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkImageView(&cgen_var_0, (VkImageView*)&forUnmarshaling->imageViewBinding, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkImageView(
+        &cgen_var_0, (VkImageView*)&forUnmarshaling->imageViewBinding, 1);
 }
 
-void marshal_VkVideoReferenceSlotKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoReferenceSlotKHR* forMarshaling)
-{
+void marshal_VkVideoReferenceSlotKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkVideoReferenceSlotKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((int8_t*)&forMarshaling->slotIndex, sizeof(int8_t));
-    marshal_VkVideoPictureResourceKHR(vkStream, rootType, (const VkVideoPictureResourceKHR*)(forMarshaling->pPictureResource));
+    marshal_VkVideoPictureResourceKHR(
+        vkStream, rootType, (const VkVideoPictureResourceKHR*)(forMarshaling->pPictureResource));
 }
 
-void unmarshal_VkVideoReferenceSlotKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoReferenceSlotKHR* forUnmarshaling)
-{
+void unmarshal_VkVideoReferenceSlotKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkVideoReferenceSlotKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((int8_t*)&forUnmarshaling->slotIndex, sizeof(int8_t));
-    vkStream->alloc((void**)&forUnmarshaling->pPictureResource, sizeof(const VkVideoPictureResourceKHR));
-    unmarshal_VkVideoPictureResourceKHR(vkStream, rootType, (VkVideoPictureResourceKHR*)(forUnmarshaling->pPictureResource));
+    vkStream->alloc((void**)&forUnmarshaling->pPictureResource,
+                    sizeof(const VkVideoPictureResourceKHR));
+    unmarshal_VkVideoPictureResourceKHR(
+        vkStream, rootType, (VkVideoPictureResourceKHR*)(forUnmarshaling->pPictureResource));
 }
 
-void marshal_VkVideoGetMemoryPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoGetMemoryPropertiesKHR* forMarshaling)
-{
+void marshal_VkVideoGetMemoryPropertiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkVideoGetMemoryPropertiesKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->memoryBindIndex, sizeof(uint32_t));
-    marshal_VkMemoryRequirements2(vkStream, rootType, (VkMemoryRequirements2*)(forMarshaling->pMemoryRequirements));
+    marshal_VkMemoryRequirements2(vkStream, rootType,
+                                  (VkMemoryRequirements2*)(forMarshaling->pMemoryRequirements));
 }
 
-void unmarshal_VkVideoGetMemoryPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoGetMemoryPropertiesKHR* forUnmarshaling)
-{
+void unmarshal_VkVideoGetMemoryPropertiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkVideoGetMemoryPropertiesKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->memoryBindIndex, sizeof(uint32_t));
     vkStream->alloc((void**)&forUnmarshaling->pMemoryRequirements, sizeof(VkMemoryRequirements2));
-    unmarshal_VkMemoryRequirements2(vkStream, rootType, (VkMemoryRequirements2*)(forUnmarshaling->pMemoryRequirements));
+    unmarshal_VkMemoryRequirements2(vkStream, rootType,
+                                    (VkMemoryRequirements2*)(forUnmarshaling->pMemoryRequirements));
 }
 
-void marshal_VkVideoBindMemoryKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoBindMemoryKHR* forMarshaling)
-{
+void marshal_VkVideoBindMemoryKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkVideoBindMemoryKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->memoryBindIndex, sizeof(uint32_t));
     uint64_t cgen_var_0;
-    vkStream->handleMapping()->mapHandles_VkDeviceMemory_u64(&forMarshaling->memory, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkDeviceMemory_u64(&forMarshaling->memory, &cgen_var_0,
+                                                             1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->write((VkDeviceSize*)&forMarshaling->memoryOffset, sizeof(VkDeviceSize));
     vkStream->write((VkDeviceSize*)&forMarshaling->memorySize, sizeof(VkDeviceSize));
 }
 
-void unmarshal_VkVideoBindMemoryKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoBindMemoryKHR* forUnmarshaling)
-{
+void unmarshal_VkVideoBindMemoryKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkVideoBindMemoryKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->memoryBindIndex, sizeof(uint32_t));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkDeviceMemory(&cgen_var_0, (VkDeviceMemory*)&forUnmarshaling->memory, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkDeviceMemory(
+        &cgen_var_0, (VkDeviceMemory*)&forUnmarshaling->memory, 1);
     vkStream->read((VkDeviceSize*)&forUnmarshaling->memoryOffset, sizeof(VkDeviceSize));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->memorySize, sizeof(VkDeviceSize));
 }
 
-void marshal_VkVideoSessionCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoSessionCreateInfoKHR* forMarshaling)
-{
+void marshal_VkVideoSessionCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkVideoSessionCreateInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->queueFamilyIndex, sizeof(uint32_t));
-    vkStream->write((VkVideoSessionCreateFlagsKHR*)&forMarshaling->flags, sizeof(VkVideoSessionCreateFlagsKHR));
-    marshal_VkVideoProfileKHR(vkStream, rootType, (const VkVideoProfileKHR*)(forMarshaling->pVideoProfile));
+    vkStream->write((VkVideoSessionCreateFlagsKHR*)&forMarshaling->flags,
+                    sizeof(VkVideoSessionCreateFlagsKHR));
+    marshal_VkVideoProfileKHR(vkStream, rootType,
+                              (const VkVideoProfileKHR*)(forMarshaling->pVideoProfile));
     vkStream->write((VkFormat*)&forMarshaling->pictureFormat, sizeof(VkFormat));
     marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->maxCodedExtent));
     vkStream->write((VkFormat*)&forMarshaling->referencePicturesFormat, sizeof(VkFormat));
@@ -12715,33 +11960,32 @@
     vkStream->write((uint32_t*)&forMarshaling->maxReferencePicturesActiveCount, sizeof(uint32_t));
 }
 
-void unmarshal_VkVideoSessionCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoSessionCreateInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkVideoSessionCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkVideoSessionCreateInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->queueFamilyIndex, sizeof(uint32_t));
-    vkStream->read((VkVideoSessionCreateFlagsKHR*)&forUnmarshaling->flags, sizeof(VkVideoSessionCreateFlagsKHR));
+    vkStream->read((VkVideoSessionCreateFlagsKHR*)&forUnmarshaling->flags,
+                   sizeof(VkVideoSessionCreateFlagsKHR));
     vkStream->alloc((void**)&forUnmarshaling->pVideoProfile, sizeof(const VkVideoProfileKHR));
-    unmarshal_VkVideoProfileKHR(vkStream, rootType, (VkVideoProfileKHR*)(forUnmarshaling->pVideoProfile));
+    unmarshal_VkVideoProfileKHR(vkStream, rootType,
+                                (VkVideoProfileKHR*)(forUnmarshaling->pVideoProfile));
     vkStream->read((VkFormat*)&forUnmarshaling->pictureFormat, sizeof(VkFormat));
     unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->maxCodedExtent));
     vkStream->read((VkFormat*)&forUnmarshaling->referencePicturesFormat, sizeof(VkFormat));
@@ -12750,14 +11994,11 @@
 }
 
 void marshal_VkVideoSessionParametersCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoSessionParametersCreateInfoKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkVideoSessionParametersCreateInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -12768,41 +12009,37 @@
 }
 
 void unmarshal_VkVideoSessionParametersCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoSessionParametersCreateInfoKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoSessionParametersCreateInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    forUnmarshaling->videoSessionParametersTemplate = (VkVideoSessionParametersKHR)vkStream->getBe64();
+    forUnmarshaling->videoSessionParametersTemplate =
+        (VkVideoSessionParametersKHR)vkStream->getBe64();
     forUnmarshaling->videoSession = (VkVideoSessionKHR)vkStream->getBe64();
 }
 
 void marshal_VkVideoSessionParametersUpdateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoSessionParametersUpdateInfoKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkVideoSessionParametersUpdateInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -12810,190 +12047,172 @@
 }
 
 void unmarshal_VkVideoSessionParametersUpdateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoSessionParametersUpdateInfoKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoSessionParametersUpdateInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->updateSequenceCount, sizeof(uint32_t));
 }
 
-void marshal_VkVideoBeginCodingInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoBeginCodingInfoKHR* forMarshaling)
-{
+void marshal_VkVideoBeginCodingInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkVideoBeginCodingInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkVideoBeginCodingFlagsKHR*)&forMarshaling->flags, sizeof(VkVideoBeginCodingFlagsKHR));
-    vkStream->write((VkVideoCodingQualityPresetFlagsKHR*)&forMarshaling->codecQualityPreset, sizeof(VkVideoCodingQualityPresetFlagsKHR));
+    vkStream->write((VkVideoBeginCodingFlagsKHR*)&forMarshaling->flags,
+                    sizeof(VkVideoBeginCodingFlagsKHR));
+    vkStream->write((VkVideoCodingQualityPresetFlagsKHR*)&forMarshaling->codecQualityPreset,
+                    sizeof(VkVideoCodingQualityPresetFlagsKHR));
     uint64_t cgen_var_0 = (uint64_t)forMarshaling->videoSession;
     vkStream->putBe64(cgen_var_0);
     uint64_t cgen_var_1 = (uint64_t)forMarshaling->videoSessionParameters;
     vkStream->putBe64(cgen_var_1);
     vkStream->write((uint32_t*)&forMarshaling->referenceSlotCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->referenceSlotCount; ++i)
-        {
-            marshal_VkVideoReferenceSlotKHR(vkStream, rootType, (const VkVideoReferenceSlotKHR*)(forMarshaling->pReferenceSlots + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->referenceSlotCount; ++i) {
+            marshal_VkVideoReferenceSlotKHR(
+                vkStream, rootType,
+                (const VkVideoReferenceSlotKHR*)(forMarshaling->pReferenceSlots + i));
         }
     }
 }
 
-void unmarshal_VkVideoBeginCodingInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoBeginCodingInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkVideoBeginCodingInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkVideoBeginCodingInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkVideoBeginCodingFlagsKHR*)&forUnmarshaling->flags, sizeof(VkVideoBeginCodingFlagsKHR));
-    vkStream->read((VkVideoCodingQualityPresetFlagsKHR*)&forUnmarshaling->codecQualityPreset, sizeof(VkVideoCodingQualityPresetFlagsKHR));
+    vkStream->read((VkVideoBeginCodingFlagsKHR*)&forUnmarshaling->flags,
+                   sizeof(VkVideoBeginCodingFlagsKHR));
+    vkStream->read((VkVideoCodingQualityPresetFlagsKHR*)&forUnmarshaling->codecQualityPreset,
+                   sizeof(VkVideoCodingQualityPresetFlagsKHR));
     forUnmarshaling->videoSession = (VkVideoSessionKHR)vkStream->getBe64();
     forUnmarshaling->videoSessionParameters = (VkVideoSessionParametersKHR)vkStream->getBe64();
     vkStream->read((uint32_t*)&forUnmarshaling->referenceSlotCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pReferenceSlots, forUnmarshaling->referenceSlotCount * sizeof(const VkVideoReferenceSlotKHR));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->referenceSlotCount; ++i)
-        {
-            unmarshal_VkVideoReferenceSlotKHR(vkStream, rootType, (VkVideoReferenceSlotKHR*)(forUnmarshaling->pReferenceSlots + i));
+    vkStream->alloc((void**)&forUnmarshaling->pReferenceSlots,
+                    forUnmarshaling->referenceSlotCount * sizeof(const VkVideoReferenceSlotKHR));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->referenceSlotCount; ++i) {
+            unmarshal_VkVideoReferenceSlotKHR(
+                vkStream, rootType,
+                (VkVideoReferenceSlotKHR*)(forUnmarshaling->pReferenceSlots + i));
         }
     }
 }
 
-void marshal_VkVideoEndCodingInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoEndCodingInfoKHR* forMarshaling)
-{
+void marshal_VkVideoEndCodingInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkVideoEndCodingInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkVideoEndCodingFlagsKHR*)&forMarshaling->flags, sizeof(VkVideoEndCodingFlagsKHR));
+    vkStream->write((VkVideoEndCodingFlagsKHR*)&forMarshaling->flags,
+                    sizeof(VkVideoEndCodingFlagsKHR));
 }
 
-void unmarshal_VkVideoEndCodingInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEndCodingInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkVideoEndCodingInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkVideoEndCodingInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkVideoEndCodingFlagsKHR*)&forUnmarshaling->flags, sizeof(VkVideoEndCodingFlagsKHR));
+    vkStream->read((VkVideoEndCodingFlagsKHR*)&forUnmarshaling->flags,
+                   sizeof(VkVideoEndCodingFlagsKHR));
 }
 
-void marshal_VkVideoCodingControlInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoCodingControlInfoKHR* forMarshaling)
-{
+void marshal_VkVideoCodingControlInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkVideoCodingControlInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkVideoCodingControlFlagsKHR*)&forMarshaling->flags, sizeof(VkVideoCodingControlFlagsKHR));
+    vkStream->write((VkVideoCodingControlFlagsKHR*)&forMarshaling->flags,
+                    sizeof(VkVideoCodingControlFlagsKHR));
 }
 
-void unmarshal_VkVideoCodingControlInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoCodingControlInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkVideoCodingControlInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkVideoCodingControlInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkVideoCodingControlFlagsKHR*)&forUnmarshaling->flags, sizeof(VkVideoCodingControlFlagsKHR));
+    vkStream->read((VkVideoCodingControlFlagsKHR*)&forUnmarshaling->flags,
+                   sizeof(VkVideoCodingControlFlagsKHR));
 }
 
 #endif
 #ifdef VK_KHR_video_decode_queue
-void marshal_VkVideoDecodeInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoDecodeInfoKHR* forMarshaling)
-{
+void marshal_VkVideoDecodeInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkVideoDecodeInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -13005,38 +12224,37 @@
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->write((VkDeviceSize*)&forMarshaling->srcBufferOffset, sizeof(VkDeviceSize));
     vkStream->write((VkDeviceSize*)&forMarshaling->srcBufferRange, sizeof(VkDeviceSize));
-    marshal_VkVideoPictureResourceKHR(vkStream, rootType, (VkVideoPictureResourceKHR*)(&forMarshaling->dstPictureResource));
-    marshal_VkVideoReferenceSlotKHR(vkStream, rootType, (const VkVideoReferenceSlotKHR*)(forMarshaling->pSetupReferenceSlot));
+    marshal_VkVideoPictureResourceKHR(
+        vkStream, rootType, (VkVideoPictureResourceKHR*)(&forMarshaling->dstPictureResource));
+    marshal_VkVideoReferenceSlotKHR(
+        vkStream, rootType, (const VkVideoReferenceSlotKHR*)(forMarshaling->pSetupReferenceSlot));
     vkStream->write((uint32_t*)&forMarshaling->referenceSlotCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->referenceSlotCount; ++i)
-        {
-            marshal_VkVideoReferenceSlotKHR(vkStream, rootType, (const VkVideoReferenceSlotKHR*)(forMarshaling->pReferenceSlots + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->referenceSlotCount; ++i) {
+            marshal_VkVideoReferenceSlotKHR(
+                vkStream, rootType,
+                (const VkVideoReferenceSlotKHR*)(forMarshaling->pReferenceSlots + i));
         }
     }
 }
 
-void unmarshal_VkVideoDecodeInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkVideoDecodeInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkVideoDecodeInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -13045,44 +12263,48 @@
     unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->codedExtent));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_0, (VkBuffer*)&forUnmarshaling->srcBuffer, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_0,
+                                                       (VkBuffer*)&forUnmarshaling->srcBuffer, 1);
     vkStream->read((VkDeviceSize*)&forUnmarshaling->srcBufferOffset, sizeof(VkDeviceSize));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->srcBufferRange, sizeof(VkDeviceSize));
-    unmarshal_VkVideoPictureResourceKHR(vkStream, rootType, (VkVideoPictureResourceKHR*)(&forUnmarshaling->dstPictureResource));
-    vkStream->alloc((void**)&forUnmarshaling->pSetupReferenceSlot, sizeof(const VkVideoReferenceSlotKHR));
-    unmarshal_VkVideoReferenceSlotKHR(vkStream, rootType, (VkVideoReferenceSlotKHR*)(forUnmarshaling->pSetupReferenceSlot));
+    unmarshal_VkVideoPictureResourceKHR(
+        vkStream, rootType, (VkVideoPictureResourceKHR*)(&forUnmarshaling->dstPictureResource));
+    vkStream->alloc((void**)&forUnmarshaling->pSetupReferenceSlot,
+                    sizeof(const VkVideoReferenceSlotKHR));
+    unmarshal_VkVideoReferenceSlotKHR(
+        vkStream, rootType, (VkVideoReferenceSlotKHR*)(forUnmarshaling->pSetupReferenceSlot));
     vkStream->read((uint32_t*)&forUnmarshaling->referenceSlotCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pReferenceSlots, forUnmarshaling->referenceSlotCount * sizeof(const VkVideoReferenceSlotKHR));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->referenceSlotCount; ++i)
-        {
-            unmarshal_VkVideoReferenceSlotKHR(vkStream, rootType, (VkVideoReferenceSlotKHR*)(forUnmarshaling->pReferenceSlots + i));
+    vkStream->alloc((void**)&forUnmarshaling->pReferenceSlots,
+                    forUnmarshaling->referenceSlotCount * sizeof(const VkVideoReferenceSlotKHR));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->referenceSlotCount; ++i) {
+            unmarshal_VkVideoReferenceSlotKHR(
+                vkStream, rootType,
+                (VkVideoReferenceSlotKHR*)(forUnmarshaling->pReferenceSlots + i));
         }
     }
 }
 
 #endif
 #ifdef VK_KHR_dynamic_rendering
-void marshal_VkRenderingAttachmentInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkRenderingAttachmentInfoKHR* forMarshaling)
-{
+void marshal_VkRenderingAttachmentInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                          const VkRenderingAttachmentInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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_VkImageView_u64(&forMarshaling->imageView, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkImageView_u64(&forMarshaling->imageView, &cgen_var_0,
+                                                          1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->write((VkImageLayout*)&forMarshaling->imageLayout, sizeof(VkImageLayout));
-    vkStream->write((VkResolveModeFlagBits*)&forMarshaling->resolveMode, sizeof(VkResolveModeFlagBits));
+    vkStream->write((VkResolveModeFlagBits*)&forMarshaling->resolveMode,
+                    sizeof(VkResolveModeFlagBits));
     uint64_t cgen_var_1;
-    vkStream->handleMapping()->mapHandles_VkImageView_u64(&forMarshaling->resolveImageView, &cgen_var_1, 1);
+    vkStream->handleMapping()->mapHandles_VkImageView_u64(&forMarshaling->resolveImageView,
+                                                          &cgen_var_1, 1);
     vkStream->write((uint64_t*)&cgen_var_1, 1 * 8);
     vkStream->write((VkImageLayout*)&forMarshaling->resolveImageLayout, sizeof(VkImageLayout));
     vkStream->write((VkAttachmentLoadOp*)&forMarshaling->loadOp, sizeof(VkAttachmentLoadOp));
@@ -13090,52 +12312,48 @@
     marshal_VkClearValue(vkStream, rootType, (VkClearValue*)(&forMarshaling->clearValue));
 }
 
-void unmarshal_VkRenderingAttachmentInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderingAttachmentInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkRenderingAttachmentInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkRenderingAttachmentInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkImageView(&cgen_var_0, (VkImageView*)&forUnmarshaling->imageView, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkImageView(
+        &cgen_var_0, (VkImageView*)&forUnmarshaling->imageView, 1);
     vkStream->read((VkImageLayout*)&forUnmarshaling->imageLayout, sizeof(VkImageLayout));
-    vkStream->read((VkResolveModeFlagBits*)&forUnmarshaling->resolveMode, sizeof(VkResolveModeFlagBits));
+    vkStream->read((VkResolveModeFlagBits*)&forUnmarshaling->resolveMode,
+                   sizeof(VkResolveModeFlagBits));
     uint64_t cgen_var_1;
     vkStream->read((uint64_t*)&cgen_var_1, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkImageView(&cgen_var_1, (VkImageView*)&forUnmarshaling->resolveImageView, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkImageView(
+        &cgen_var_1, (VkImageView*)&forUnmarshaling->resolveImageView, 1);
     vkStream->read((VkImageLayout*)&forUnmarshaling->resolveImageLayout, sizeof(VkImageLayout));
     vkStream->read((VkAttachmentLoadOp*)&forUnmarshaling->loadOp, sizeof(VkAttachmentLoadOp));
     vkStream->read((VkAttachmentStoreOp*)&forUnmarshaling->storeOp, sizeof(VkAttachmentStoreOp));
     unmarshal_VkClearValue(vkStream, rootType, (VkClearValue*)(&forUnmarshaling->clearValue));
 }
 
-void marshal_VkRenderingInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkRenderingInfoKHR* forMarshaling)
-{
+void marshal_VkRenderingInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                const VkRenderingInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -13144,49 +12362,48 @@
     vkStream->write((uint32_t*)&forMarshaling->layerCount, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->viewMask, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->colorAttachmentCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->colorAttachmentCount; ++i)
-        {
-            marshal_VkRenderingAttachmentInfoKHR(vkStream, rootType, (const VkRenderingAttachmentInfoKHR*)(forMarshaling->pColorAttachments + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->colorAttachmentCount; ++i) {
+            marshal_VkRenderingAttachmentInfoKHR(
+                vkStream, rootType,
+                (const VkRenderingAttachmentInfoKHR*)(forMarshaling->pColorAttachments + i));
         }
     }
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pDepthAttachment;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pDepthAttachment)
-    {
-        marshal_VkRenderingAttachmentInfoKHR(vkStream, rootType, (const VkRenderingAttachmentInfoKHR*)(forMarshaling->pDepthAttachment));
+    if (forMarshaling->pDepthAttachment) {
+        marshal_VkRenderingAttachmentInfoKHR(
+            vkStream, rootType,
+            (const VkRenderingAttachmentInfoKHR*)(forMarshaling->pDepthAttachment));
     }
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)forMarshaling->pStencilAttachment;
     vkStream->putBe64(cgen_var_1);
-    if (forMarshaling->pStencilAttachment)
-    {
-        marshal_VkRenderingAttachmentInfoKHR(vkStream, rootType, (const VkRenderingAttachmentInfoKHR*)(forMarshaling->pStencilAttachment));
+    if (forMarshaling->pStencilAttachment) {
+        marshal_VkRenderingAttachmentInfoKHR(
+            vkStream, rootType,
+            (const VkRenderingAttachmentInfoKHR*)(forMarshaling->pStencilAttachment));
     }
 }
 
-void unmarshal_VkRenderingInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderingInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkRenderingInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkRenderingInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -13195,89 +12412,90 @@
     vkStream->read((uint32_t*)&forUnmarshaling->layerCount, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->viewMask, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->colorAttachmentCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pColorAttachments, forUnmarshaling->colorAttachmentCount * sizeof(const VkRenderingAttachmentInfoKHR));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->colorAttachmentCount; ++i)
-        {
-            unmarshal_VkRenderingAttachmentInfoKHR(vkStream, rootType, (VkRenderingAttachmentInfoKHR*)(forUnmarshaling->pColorAttachments + i));
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pColorAttachments,
+        forUnmarshaling->colorAttachmentCount * sizeof(const VkRenderingAttachmentInfoKHR));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->colorAttachmentCount; ++i) {
+            unmarshal_VkRenderingAttachmentInfoKHR(
+                vkStream, rootType,
+                (VkRenderingAttachmentInfoKHR*)(forUnmarshaling->pColorAttachments + i));
         }
     }
     // WARNING PTR CHECK
-    forUnmarshaling->pDepthAttachment = (const VkRenderingAttachmentInfoKHR*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pDepthAttachment)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pDepthAttachment, sizeof(const VkRenderingAttachmentInfoKHR));
-        unmarshal_VkRenderingAttachmentInfoKHR(vkStream, rootType, (VkRenderingAttachmentInfoKHR*)(forUnmarshaling->pDepthAttachment));
+    forUnmarshaling->pDepthAttachment =
+        (const VkRenderingAttachmentInfoKHR*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pDepthAttachment) {
+        vkStream->alloc((void**)&forUnmarshaling->pDepthAttachment,
+                        sizeof(const VkRenderingAttachmentInfoKHR));
+        unmarshal_VkRenderingAttachmentInfoKHR(
+            vkStream, rootType, (VkRenderingAttachmentInfoKHR*)(forUnmarshaling->pDepthAttachment));
     }
     // WARNING PTR CHECK
-    forUnmarshaling->pStencilAttachment = (const VkRenderingAttachmentInfoKHR*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pStencilAttachment)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pStencilAttachment, sizeof(const VkRenderingAttachmentInfoKHR));
-        unmarshal_VkRenderingAttachmentInfoKHR(vkStream, rootType, (VkRenderingAttachmentInfoKHR*)(forUnmarshaling->pStencilAttachment));
+    forUnmarshaling->pStencilAttachment =
+        (const VkRenderingAttachmentInfoKHR*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pStencilAttachment) {
+        vkStream->alloc((void**)&forUnmarshaling->pStencilAttachment,
+                        sizeof(const VkRenderingAttachmentInfoKHR));
+        unmarshal_VkRenderingAttachmentInfoKHR(
+            vkStream, rootType,
+            (VkRenderingAttachmentInfoKHR*)(forUnmarshaling->pStencilAttachment));
     }
 }
 
 void marshal_VkPipelineRenderingCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineRenderingCreateInfoKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineRenderingCreateInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->viewMask, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->colorAttachmentCount, sizeof(uint32_t));
-    vkStream->write((const VkFormat*)forMarshaling->pColorAttachmentFormats, forMarshaling->colorAttachmentCount * sizeof(const VkFormat));
+    vkStream->write((const VkFormat*)forMarshaling->pColorAttachmentFormats,
+                    forMarshaling->colorAttachmentCount * sizeof(const VkFormat));
     vkStream->write((VkFormat*)&forMarshaling->depthAttachmentFormat, sizeof(VkFormat));
     vkStream->write((VkFormat*)&forMarshaling->stencilAttachmentFormat, sizeof(VkFormat));
 }
 
-void unmarshal_VkPipelineRenderingCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineRenderingCreateInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkPipelineRenderingCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkPipelineRenderingCreateInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->viewMask, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->colorAttachmentCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pColorAttachmentFormats, forUnmarshaling->colorAttachmentCount * sizeof(const VkFormat));
-    vkStream->read((VkFormat*)forUnmarshaling->pColorAttachmentFormats, forUnmarshaling->colorAttachmentCount * sizeof(const VkFormat));
+    vkStream->alloc((void**)&forUnmarshaling->pColorAttachmentFormats,
+                    forUnmarshaling->colorAttachmentCount * sizeof(const VkFormat));
+    vkStream->read((VkFormat*)forUnmarshaling->pColorAttachmentFormats,
+                   forUnmarshaling->colorAttachmentCount * sizeof(const VkFormat));
     vkStream->read((VkFormat*)&forUnmarshaling->depthAttachmentFormat, sizeof(VkFormat));
     vkStream->read((VkFormat*)&forUnmarshaling->stencilAttachmentFormat, sizeof(VkFormat));
 }
 
 void marshal_VkPhysicalDeviceDynamicRenderingFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceDynamicRenderingFeaturesKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceDynamicRenderingFeaturesKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -13285,25 +12503,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceDynamicRenderingFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDynamicRenderingFeaturesKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceDynamicRenderingFeaturesKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -13311,164 +12527,156 @@
 }
 
 void marshal_VkCommandBufferInheritanceRenderingInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCommandBufferInheritanceRenderingInfoKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkCommandBufferInheritanceRenderingInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkRenderingFlagsKHR*)&forMarshaling->flags, sizeof(VkRenderingFlagsKHR));
     vkStream->write((uint32_t*)&forMarshaling->viewMask, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->colorAttachmentCount, sizeof(uint32_t));
-    vkStream->write((const VkFormat*)forMarshaling->pColorAttachmentFormats, forMarshaling->colorAttachmentCount * sizeof(const VkFormat));
+    vkStream->write((const VkFormat*)forMarshaling->pColorAttachmentFormats,
+                    forMarshaling->colorAttachmentCount * sizeof(const VkFormat));
     vkStream->write((VkFormat*)&forMarshaling->depthAttachmentFormat, sizeof(VkFormat));
     vkStream->write((VkFormat*)&forMarshaling->stencilAttachmentFormat, sizeof(VkFormat));
-    vkStream->write((VkSampleCountFlagBits*)&forMarshaling->rasterizationSamples, sizeof(VkSampleCountFlagBits));
+    vkStream->write((VkSampleCountFlagBits*)&forMarshaling->rasterizationSamples,
+                    sizeof(VkSampleCountFlagBits));
 }
 
 void unmarshal_VkCommandBufferInheritanceRenderingInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCommandBufferInheritanceRenderingInfoKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkCommandBufferInheritanceRenderingInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkRenderingFlagsKHR*)&forUnmarshaling->flags, sizeof(VkRenderingFlagsKHR));
     vkStream->read((uint32_t*)&forUnmarshaling->viewMask, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->colorAttachmentCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pColorAttachmentFormats, forUnmarshaling->colorAttachmentCount * sizeof(const VkFormat));
-    vkStream->read((VkFormat*)forUnmarshaling->pColorAttachmentFormats, forUnmarshaling->colorAttachmentCount * sizeof(const VkFormat));
+    vkStream->alloc((void**)&forUnmarshaling->pColorAttachmentFormats,
+                    forUnmarshaling->colorAttachmentCount * sizeof(const VkFormat));
+    vkStream->read((VkFormat*)forUnmarshaling->pColorAttachmentFormats,
+                   forUnmarshaling->colorAttachmentCount * sizeof(const VkFormat));
     vkStream->read((VkFormat*)&forUnmarshaling->depthAttachmentFormat, sizeof(VkFormat));
     vkStream->read((VkFormat*)&forUnmarshaling->stencilAttachmentFormat, sizeof(VkFormat));
-    vkStream->read((VkSampleCountFlagBits*)&forUnmarshaling->rasterizationSamples, sizeof(VkSampleCountFlagBits));
+    vkStream->read((VkSampleCountFlagBits*)&forUnmarshaling->rasterizationSamples,
+                   sizeof(VkSampleCountFlagBits));
 }
 
 void marshal_VkRenderingFragmentShadingRateAttachmentInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkRenderingFragmentShadingRateAttachmentInfoKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkRenderingFragmentShadingRateAttachmentInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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_VkImageView_u64(&forMarshaling->imageView, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkImageView_u64(&forMarshaling->imageView, &cgen_var_0,
+                                                          1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->write((VkImageLayout*)&forMarshaling->imageLayout, sizeof(VkImageLayout));
-    marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->shadingRateAttachmentTexelSize));
+    marshal_VkExtent2D(vkStream, rootType,
+                       (VkExtent2D*)(&forMarshaling->shadingRateAttachmentTexelSize));
 }
 
 void unmarshal_VkRenderingFragmentShadingRateAttachmentInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderingFragmentShadingRateAttachmentInfoKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkRenderingFragmentShadingRateAttachmentInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkImageView(&cgen_var_0, (VkImageView*)&forUnmarshaling->imageView, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkImageView(
+        &cgen_var_0, (VkImageView*)&forUnmarshaling->imageView, 1);
     vkStream->read((VkImageLayout*)&forUnmarshaling->imageLayout, sizeof(VkImageLayout));
-    unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->shadingRateAttachmentTexelSize));
+    unmarshal_VkExtent2D(vkStream, rootType,
+                         (VkExtent2D*)(&forUnmarshaling->shadingRateAttachmentTexelSize));
 }
 
 void marshal_VkRenderingFragmentDensityMapAttachmentInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkRenderingFragmentDensityMapAttachmentInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkRenderingFragmentDensityMapAttachmentInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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_VkImageView_u64(&forMarshaling->imageView, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkImageView_u64(&forMarshaling->imageView, &cgen_var_0,
+                                                          1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->write((VkImageLayout*)&forMarshaling->imageLayout, sizeof(VkImageLayout));
 }
 
 void unmarshal_VkRenderingFragmentDensityMapAttachmentInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderingFragmentDensityMapAttachmentInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkRenderingFragmentDensityMapAttachmentInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkImageView(&cgen_var_0, (VkImageView*)&forUnmarshaling->imageView, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkImageView(
+        &cgen_var_0, (VkImageView*)&forUnmarshaling->imageView, 1);
     vkStream->read((VkImageLayout*)&forUnmarshaling->imageLayout, sizeof(VkImageLayout));
 }
 
-void marshal_VkAttachmentSampleCountInfoAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAttachmentSampleCountInfoAMD* forMarshaling)
-{
+void marshal_VkAttachmentSampleCountInfoAMD(VulkanStream* vkStream, VkStructureType rootType,
+                                            const VkAttachmentSampleCountInfoAMD* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -13476,56 +12684,55 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pColorAttachmentSamples;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pColorAttachmentSamples)
-    {
-        vkStream->write((const VkSampleCountFlagBits*)forMarshaling->pColorAttachmentSamples, forMarshaling->colorAttachmentCount * sizeof(const VkSampleCountFlagBits));
+    if (forMarshaling->pColorAttachmentSamples) {
+        vkStream->write((const VkSampleCountFlagBits*)forMarshaling->pColorAttachmentSamples,
+                        forMarshaling->colorAttachmentCount * sizeof(const VkSampleCountFlagBits));
     }
-    vkStream->write((VkSampleCountFlagBits*)&forMarshaling->depthStencilAttachmentSamples, sizeof(VkSampleCountFlagBits));
+    vkStream->write((VkSampleCountFlagBits*)&forMarshaling->depthStencilAttachmentSamples,
+                    sizeof(VkSampleCountFlagBits));
 }
 
-void unmarshal_VkAttachmentSampleCountInfoAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAttachmentSampleCountInfoAMD* forUnmarshaling)
-{
+void unmarshal_VkAttachmentSampleCountInfoAMD(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkAttachmentSampleCountInfoAMD* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->colorAttachmentCount, sizeof(uint32_t));
     // WARNING PTR CHECK
-    forUnmarshaling->pColorAttachmentSamples = (const VkSampleCountFlagBits*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pColorAttachmentSamples)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pColorAttachmentSamples, forUnmarshaling->colorAttachmentCount * sizeof(const VkSampleCountFlagBits));
-        vkStream->read((VkSampleCountFlagBits*)forUnmarshaling->pColorAttachmentSamples, forUnmarshaling->colorAttachmentCount * sizeof(const VkSampleCountFlagBits));
+    forUnmarshaling->pColorAttachmentSamples =
+        (const VkSampleCountFlagBits*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pColorAttachmentSamples) {
+        vkStream->alloc(
+            (void**)&forUnmarshaling->pColorAttachmentSamples,
+            forUnmarshaling->colorAttachmentCount * sizeof(const VkSampleCountFlagBits));
+        vkStream->read((VkSampleCountFlagBits*)forUnmarshaling->pColorAttachmentSamples,
+                       forUnmarshaling->colorAttachmentCount * sizeof(const VkSampleCountFlagBits));
     }
-    vkStream->read((VkSampleCountFlagBits*)&forUnmarshaling->depthStencilAttachmentSamples, sizeof(VkSampleCountFlagBits));
+    vkStream->read((VkSampleCountFlagBits*)&forUnmarshaling->depthStencilAttachmentSamples,
+                   sizeof(VkSampleCountFlagBits));
 }
 
 void marshal_VkMultiviewPerViewAttributesInfoNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMultiviewPerViewAttributesInfoNVX* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkMultiviewPerViewAttributesInfoNVX* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -13534,25 +12741,23 @@
 }
 
 void unmarshal_VkMultiviewPerViewAttributesInfoNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMultiviewPerViewAttributesInfoNVX* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkMultiviewPerViewAttributesInfoNVX* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -13579,410 +12784,384 @@
 #endif
 #ifdef VK_KHR_external_memory_win32
 void marshal_VkImportMemoryWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImportMemoryWin32HandleInfoKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkImportMemoryWin32HandleInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkExternalMemoryHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    vkStream->write((VkExternalMemoryHandleTypeFlagBits*)&forMarshaling->handleType,
+                    sizeof(VkExternalMemoryHandleTypeFlagBits));
     vkStream->write((HANDLE*)&forMarshaling->handle, sizeof(HANDLE));
     vkStream->write((LPCWSTR*)&forMarshaling->name, sizeof(LPCWSTR));
 }
 
-void unmarshal_VkImportMemoryWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportMemoryWin32HandleInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkImportMemoryWin32HandleInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkImportMemoryWin32HandleInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    vkStream->read((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType,
+                   sizeof(VkExternalMemoryHandleTypeFlagBits));
     vkStream->read((HANDLE*)&forUnmarshaling->handle, sizeof(HANDLE));
     vkStream->read((LPCWSTR*)&forUnmarshaling->name, sizeof(LPCWSTR));
 }
 
 void marshal_VkExportMemoryWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkExportMemoryWin32HandleInfoKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkExportMemoryWin32HandleInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pAttributes;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pAttributes)
-    {
-        vkStream->write((const SECURITY_ATTRIBUTES*)forMarshaling->pAttributes, sizeof(const SECURITY_ATTRIBUTES));
+    if (forMarshaling->pAttributes) {
+        vkStream->write((const SECURITY_ATTRIBUTES*)forMarshaling->pAttributes,
+                        sizeof(const SECURITY_ATTRIBUTES));
     }
     vkStream->write((DWORD*)&forMarshaling->dwAccess, sizeof(DWORD));
     vkStream->write((LPCWSTR*)&forMarshaling->name, sizeof(LPCWSTR));
 }
 
-void unmarshal_VkExportMemoryWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExportMemoryWin32HandleInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkExportMemoryWin32HandleInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkExportMemoryWin32HandleInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     // WARNING PTR CHECK
     forUnmarshaling->pAttributes = (const SECURITY_ATTRIBUTES*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pAttributes)
-    {
+    if (forUnmarshaling->pAttributes) {
         vkStream->alloc((void**)&forUnmarshaling->pAttributes, sizeof(const SECURITY_ATTRIBUTES));
-        vkStream->read((SECURITY_ATTRIBUTES*)forUnmarshaling->pAttributes, sizeof(const SECURITY_ATTRIBUTES));
+        vkStream->read((SECURITY_ATTRIBUTES*)forUnmarshaling->pAttributes,
+                       sizeof(const SECURITY_ATTRIBUTES));
     }
     vkStream->read((DWORD*)&forUnmarshaling->dwAccess, sizeof(DWORD));
     vkStream->read((LPCWSTR*)&forUnmarshaling->name, sizeof(LPCWSTR));
 }
 
 void marshal_VkMemoryWin32HandlePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMemoryWin32HandlePropertiesKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkMemoryWin32HandlePropertiesKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->memoryTypeBits, sizeof(uint32_t));
 }
 
-void unmarshal_VkMemoryWin32HandlePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryWin32HandlePropertiesKHR* forUnmarshaling)
-{
+void unmarshal_VkMemoryWin32HandlePropertiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkMemoryWin32HandlePropertiesKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->memoryTypeBits, sizeof(uint32_t));
 }
 
-void marshal_VkMemoryGetWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMemoryGetWin32HandleInfoKHR* forMarshaling)
-{
+void marshal_VkMemoryGetWin32HandleInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkMemoryGetWin32HandleInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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_VkDeviceMemory_u64(&forMarshaling->memory, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkDeviceMemory_u64(&forMarshaling->memory, &cgen_var_0,
+                                                             1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->write((VkExternalMemoryHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    vkStream->write((VkExternalMemoryHandleTypeFlagBits*)&forMarshaling->handleType,
+                    sizeof(VkExternalMemoryHandleTypeFlagBits));
 }
 
-void unmarshal_VkMemoryGetWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryGetWin32HandleInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkMemoryGetWin32HandleInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkMemoryGetWin32HandleInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkDeviceMemory(&cgen_var_0, (VkDeviceMemory*)&forUnmarshaling->memory, 1);
-    vkStream->read((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    vkStream->handleMapping()->mapHandles_u64_VkDeviceMemory(
+        &cgen_var_0, (VkDeviceMemory*)&forUnmarshaling->memory, 1);
+    vkStream->read((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType,
+                   sizeof(VkExternalMemoryHandleTypeFlagBits));
 }
 
 #endif
 #ifdef VK_KHR_external_memory_fd
-void marshal_VkImportMemoryFdInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImportMemoryFdInfoKHR* forMarshaling)
-{
+void marshal_VkImportMemoryFdInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkImportMemoryFdInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkExternalMemoryHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    vkStream->write((VkExternalMemoryHandleTypeFlagBits*)&forMarshaling->handleType,
+                    sizeof(VkExternalMemoryHandleTypeFlagBits));
     vkStream->write((int*)&forMarshaling->fd, sizeof(int));
 }
 
-void unmarshal_VkImportMemoryFdInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportMemoryFdInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkImportMemoryFdInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkImportMemoryFdInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    vkStream->read((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType,
+                   sizeof(VkExternalMemoryHandleTypeFlagBits));
     vkStream->read((int*)&forUnmarshaling->fd, sizeof(int));
 }
 
-void marshal_VkMemoryFdPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMemoryFdPropertiesKHR* forMarshaling)
-{
+void marshal_VkMemoryFdPropertiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkMemoryFdPropertiesKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->memoryTypeBits, sizeof(uint32_t));
 }
 
-void unmarshal_VkMemoryFdPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryFdPropertiesKHR* forUnmarshaling)
-{
+void unmarshal_VkMemoryFdPropertiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkMemoryFdPropertiesKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->memoryTypeBits, sizeof(uint32_t));
 }
 
-void marshal_VkMemoryGetFdInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMemoryGetFdInfoKHR* forMarshaling)
-{
+void marshal_VkMemoryGetFdInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkMemoryGetFdInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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_VkDeviceMemory_u64(&forMarshaling->memory, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkDeviceMemory_u64(&forMarshaling->memory, &cgen_var_0,
+                                                             1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->write((VkExternalMemoryHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    vkStream->write((VkExternalMemoryHandleTypeFlagBits*)&forMarshaling->handleType,
+                    sizeof(VkExternalMemoryHandleTypeFlagBits));
 }
 
-void unmarshal_VkMemoryGetFdInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryGetFdInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkMemoryGetFdInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkMemoryGetFdInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkDeviceMemory(&cgen_var_0, (VkDeviceMemory*)&forUnmarshaling->memory, 1);
-    vkStream->read((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    vkStream->handleMapping()->mapHandles_u64_VkDeviceMemory(
+        &cgen_var_0, (VkDeviceMemory*)&forUnmarshaling->memory, 1);
+    vkStream->read((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType,
+                   sizeof(VkExternalMemoryHandleTypeFlagBits));
 }
 
 #endif
 #ifdef VK_KHR_win32_keyed_mutex
 void marshal_VkWin32KeyedMutexAcquireReleaseInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkWin32KeyedMutexAcquireReleaseInfoKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkWin32KeyedMutexAcquireReleaseInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->acquireCount, sizeof(uint32_t));
-    if (forMarshaling->acquireCount)
-    {
+    if (forMarshaling->acquireCount) {
         uint64_t* cgen_var_0;
         vkStream->alloc((void**)&cgen_var_0, forMarshaling->acquireCount * 8);
-        vkStream->handleMapping()->mapHandles_VkDeviceMemory_u64(forMarshaling->pAcquireSyncs, cgen_var_0, forMarshaling->acquireCount);
+        vkStream->handleMapping()->mapHandles_VkDeviceMemory_u64(
+            forMarshaling->pAcquireSyncs, cgen_var_0, forMarshaling->acquireCount);
         vkStream->write((uint64_t*)cgen_var_0, forMarshaling->acquireCount * 8);
     }
-    vkStream->write((const uint64_t*)forMarshaling->pAcquireKeys, forMarshaling->acquireCount * sizeof(const uint64_t));
-    vkStream->write((const uint32_t*)forMarshaling->pAcquireTimeouts, forMarshaling->acquireCount * sizeof(const uint32_t));
+    vkStream->write((const uint64_t*)forMarshaling->pAcquireKeys,
+                    forMarshaling->acquireCount * sizeof(const uint64_t));
+    vkStream->write((const uint32_t*)forMarshaling->pAcquireTimeouts,
+                    forMarshaling->acquireCount * sizeof(const uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->releaseCount, sizeof(uint32_t));
-    if (forMarshaling->releaseCount)
-    {
+    if (forMarshaling->releaseCount) {
         uint64_t* cgen_var_1;
         vkStream->alloc((void**)&cgen_var_1, forMarshaling->releaseCount * 8);
-        vkStream->handleMapping()->mapHandles_VkDeviceMemory_u64(forMarshaling->pReleaseSyncs, cgen_var_1, forMarshaling->releaseCount);
+        vkStream->handleMapping()->mapHandles_VkDeviceMemory_u64(
+            forMarshaling->pReleaseSyncs, cgen_var_1, forMarshaling->releaseCount);
         vkStream->write((uint64_t*)cgen_var_1, forMarshaling->releaseCount * 8);
     }
-    vkStream->write((const uint64_t*)forMarshaling->pReleaseKeys, forMarshaling->releaseCount * sizeof(const uint64_t));
+    vkStream->write((const uint64_t*)forMarshaling->pReleaseKeys,
+                    forMarshaling->releaseCount * sizeof(const uint64_t));
 }
 
 void unmarshal_VkWin32KeyedMutexAcquireReleaseInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkWin32KeyedMutexAcquireReleaseInfoKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkWin32KeyedMutexAcquireReleaseInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->acquireCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pAcquireSyncs, forUnmarshaling->acquireCount * sizeof(const VkDeviceMemory));
-    if (forUnmarshaling->acquireCount)
-    {
+    vkStream->alloc((void**)&forUnmarshaling->pAcquireSyncs,
+                    forUnmarshaling->acquireCount * sizeof(const VkDeviceMemory));
+    if (forUnmarshaling->acquireCount) {
         uint64_t* cgen_var_0;
         vkStream->alloc((void**)&cgen_var_0, forUnmarshaling->acquireCount * 8);
         vkStream->read((uint64_t*)cgen_var_0, forUnmarshaling->acquireCount * 8);
-        vkStream->handleMapping()->mapHandles_u64_VkDeviceMemory(cgen_var_0, (VkDeviceMemory*)forUnmarshaling->pAcquireSyncs, forUnmarshaling->acquireCount);
+        vkStream->handleMapping()->mapHandles_u64_VkDeviceMemory(
+            cgen_var_0, (VkDeviceMemory*)forUnmarshaling->pAcquireSyncs,
+            forUnmarshaling->acquireCount);
     }
-    vkStream->alloc((void**)&forUnmarshaling->pAcquireKeys, forUnmarshaling->acquireCount * sizeof(const uint64_t));
-    vkStream->read((uint64_t*)forUnmarshaling->pAcquireKeys, forUnmarshaling->acquireCount * sizeof(const uint64_t));
-    vkStream->alloc((void**)&forUnmarshaling->pAcquireTimeouts, forUnmarshaling->acquireCount * sizeof(const uint32_t));
-    vkStream->read((uint32_t*)forUnmarshaling->pAcquireTimeouts, forUnmarshaling->acquireCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pAcquireKeys,
+                    forUnmarshaling->acquireCount * sizeof(const uint64_t));
+    vkStream->read((uint64_t*)forUnmarshaling->pAcquireKeys,
+                   forUnmarshaling->acquireCount * sizeof(const uint64_t));
+    vkStream->alloc((void**)&forUnmarshaling->pAcquireTimeouts,
+                    forUnmarshaling->acquireCount * sizeof(const uint32_t));
+    vkStream->read((uint32_t*)forUnmarshaling->pAcquireTimeouts,
+                   forUnmarshaling->acquireCount * sizeof(const uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->releaseCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pReleaseSyncs, forUnmarshaling->releaseCount * sizeof(const VkDeviceMemory));
-    if (forUnmarshaling->releaseCount)
-    {
+    vkStream->alloc((void**)&forUnmarshaling->pReleaseSyncs,
+                    forUnmarshaling->releaseCount * sizeof(const VkDeviceMemory));
+    if (forUnmarshaling->releaseCount) {
         uint64_t* cgen_var_1;
         vkStream->alloc((void**)&cgen_var_1, forUnmarshaling->releaseCount * 8);
         vkStream->read((uint64_t*)cgen_var_1, forUnmarshaling->releaseCount * 8);
-        vkStream->handleMapping()->mapHandles_u64_VkDeviceMemory(cgen_var_1, (VkDeviceMemory*)forUnmarshaling->pReleaseSyncs, forUnmarshaling->releaseCount);
+        vkStream->handleMapping()->mapHandles_u64_VkDeviceMemory(
+            cgen_var_1, (VkDeviceMemory*)forUnmarshaling->pReleaseSyncs,
+            forUnmarshaling->releaseCount);
     }
-    vkStream->alloc((void**)&forUnmarshaling->pReleaseKeys, forUnmarshaling->releaseCount * sizeof(const uint64_t));
-    vkStream->read((uint64_t*)forUnmarshaling->pReleaseKeys, forUnmarshaling->releaseCount * sizeof(const uint64_t));
+    vkStream->alloc((void**)&forUnmarshaling->pReleaseKeys,
+                    forUnmarshaling->releaseCount * sizeof(const uint64_t));
+    vkStream->read((uint64_t*)forUnmarshaling->pReleaseKeys,
+                   forUnmarshaling->releaseCount * sizeof(const uint64_t));
 }
 
 #endif
@@ -13992,124 +13171,115 @@
 #endif
 #ifdef VK_KHR_external_semaphore_win32
 void marshal_VkImportSemaphoreWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImportSemaphoreWin32HandleInfoKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkImportSemaphoreWin32HandleInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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_VkSemaphore_u64(&forMarshaling->semaphore, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkSemaphore_u64(&forMarshaling->semaphore, &cgen_var_0,
+                                                          1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->write((VkSemaphoreImportFlags*)&forMarshaling->flags, sizeof(VkSemaphoreImportFlags));
-    vkStream->write((VkExternalSemaphoreHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalSemaphoreHandleTypeFlagBits));
+    vkStream->write((VkExternalSemaphoreHandleTypeFlagBits*)&forMarshaling->handleType,
+                    sizeof(VkExternalSemaphoreHandleTypeFlagBits));
     vkStream->write((HANDLE*)&forMarshaling->handle, sizeof(HANDLE));
     vkStream->write((LPCWSTR*)&forMarshaling->name, sizeof(LPCWSTR));
 }
 
 void unmarshal_VkImportSemaphoreWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportSemaphoreWin32HandleInfoKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImportSemaphoreWin32HandleInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkSemaphore(&cgen_var_0, (VkSemaphore*)&forUnmarshaling->semaphore, 1);
-    vkStream->read((VkSemaphoreImportFlags*)&forUnmarshaling->flags, sizeof(VkSemaphoreImportFlags));
-    vkStream->read((VkExternalSemaphoreHandleTypeFlagBits*)&forUnmarshaling->handleType, sizeof(VkExternalSemaphoreHandleTypeFlagBits));
+    vkStream->handleMapping()->mapHandles_u64_VkSemaphore(
+        &cgen_var_0, (VkSemaphore*)&forUnmarshaling->semaphore, 1);
+    vkStream->read((VkSemaphoreImportFlags*)&forUnmarshaling->flags,
+                   sizeof(VkSemaphoreImportFlags));
+    vkStream->read((VkExternalSemaphoreHandleTypeFlagBits*)&forUnmarshaling->handleType,
+                   sizeof(VkExternalSemaphoreHandleTypeFlagBits));
     vkStream->read((HANDLE*)&forUnmarshaling->handle, sizeof(HANDLE));
     vkStream->read((LPCWSTR*)&forUnmarshaling->name, sizeof(LPCWSTR));
 }
 
 void marshal_VkExportSemaphoreWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkExportSemaphoreWin32HandleInfoKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkExportSemaphoreWin32HandleInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pAttributes;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pAttributes)
-    {
-        vkStream->write((const SECURITY_ATTRIBUTES*)forMarshaling->pAttributes, sizeof(const SECURITY_ATTRIBUTES));
+    if (forMarshaling->pAttributes) {
+        vkStream->write((const SECURITY_ATTRIBUTES*)forMarshaling->pAttributes,
+                        sizeof(const SECURITY_ATTRIBUTES));
     }
     vkStream->write((DWORD*)&forMarshaling->dwAccess, sizeof(DWORD));
     vkStream->write((LPCWSTR*)&forMarshaling->name, sizeof(LPCWSTR));
 }
 
 void unmarshal_VkExportSemaphoreWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExportSemaphoreWin32HandleInfoKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkExportSemaphoreWin32HandleInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     // WARNING PTR CHECK
     forUnmarshaling->pAttributes = (const SECURITY_ATTRIBUTES*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pAttributes)
-    {
+    if (forUnmarshaling->pAttributes) {
         vkStream->alloc((void**)&forUnmarshaling->pAttributes, sizeof(const SECURITY_ATTRIBUTES));
-        vkStream->read((SECURITY_ATTRIBUTES*)forUnmarshaling->pAttributes, sizeof(const SECURITY_ATTRIBUTES));
+        vkStream->read((SECURITY_ATTRIBUTES*)forUnmarshaling->pAttributes,
+                       sizeof(const SECURITY_ATTRIBUTES));
     }
     vkStream->read((DWORD*)&forUnmarshaling->dwAccess, sizeof(DWORD));
     vkStream->read((LPCWSTR*)&forUnmarshaling->name, sizeof(LPCWSTR));
 }
 
-void marshal_VkD3D12FenceSubmitInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkD3D12FenceSubmitInfoKHR* forMarshaling)
-{
+void marshal_VkD3D12FenceSubmitInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkD3D12FenceSubmitInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -14117,219 +13287,208 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pWaitSemaphoreValues;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pWaitSemaphoreValues)
-    {
-        vkStream->write((const uint64_t*)forMarshaling->pWaitSemaphoreValues, forMarshaling->waitSemaphoreValuesCount * sizeof(const uint64_t));
+    if (forMarshaling->pWaitSemaphoreValues) {
+        vkStream->write((const uint64_t*)forMarshaling->pWaitSemaphoreValues,
+                        forMarshaling->waitSemaphoreValuesCount * sizeof(const uint64_t));
     }
     vkStream->write((uint32_t*)&forMarshaling->signalSemaphoreValuesCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)forMarshaling->pSignalSemaphoreValues;
     vkStream->putBe64(cgen_var_1);
-    if (forMarshaling->pSignalSemaphoreValues)
-    {
-        vkStream->write((const uint64_t*)forMarshaling->pSignalSemaphoreValues, forMarshaling->signalSemaphoreValuesCount * sizeof(const uint64_t));
+    if (forMarshaling->pSignalSemaphoreValues) {
+        vkStream->write((const uint64_t*)forMarshaling->pSignalSemaphoreValues,
+                        forMarshaling->signalSemaphoreValuesCount * sizeof(const uint64_t));
     }
 }
 
-void unmarshal_VkD3D12FenceSubmitInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkD3D12FenceSubmitInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkD3D12FenceSubmitInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkD3D12FenceSubmitInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->waitSemaphoreValuesCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     forUnmarshaling->pWaitSemaphoreValues = (const uint64_t*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pWaitSemaphoreValues)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pWaitSemaphoreValues, forUnmarshaling->waitSemaphoreValuesCount * sizeof(const uint64_t));
-        vkStream->read((uint64_t*)forUnmarshaling->pWaitSemaphoreValues, forUnmarshaling->waitSemaphoreValuesCount * sizeof(const uint64_t));
+    if (forUnmarshaling->pWaitSemaphoreValues) {
+        vkStream->alloc((void**)&forUnmarshaling->pWaitSemaphoreValues,
+                        forUnmarshaling->waitSemaphoreValuesCount * sizeof(const uint64_t));
+        vkStream->read((uint64_t*)forUnmarshaling->pWaitSemaphoreValues,
+                       forUnmarshaling->waitSemaphoreValuesCount * sizeof(const uint64_t));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->signalSemaphoreValuesCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     forUnmarshaling->pSignalSemaphoreValues = (const uint64_t*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pSignalSemaphoreValues)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pSignalSemaphoreValues, forUnmarshaling->signalSemaphoreValuesCount * sizeof(const uint64_t));
-        vkStream->read((uint64_t*)forUnmarshaling->pSignalSemaphoreValues, forUnmarshaling->signalSemaphoreValuesCount * sizeof(const uint64_t));
+    if (forUnmarshaling->pSignalSemaphoreValues) {
+        vkStream->alloc((void**)&forUnmarshaling->pSignalSemaphoreValues,
+                        forUnmarshaling->signalSemaphoreValuesCount * sizeof(const uint64_t));
+        vkStream->read((uint64_t*)forUnmarshaling->pSignalSemaphoreValues,
+                       forUnmarshaling->signalSemaphoreValuesCount * sizeof(const uint64_t));
     }
 }
 
 void marshal_VkSemaphoreGetWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSemaphoreGetWin32HandleInfoKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkSemaphoreGetWin32HandleInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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_VkSemaphore_u64(&forMarshaling->semaphore, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkSemaphore_u64(&forMarshaling->semaphore, &cgen_var_0,
+                                                          1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->write((VkExternalSemaphoreHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalSemaphoreHandleTypeFlagBits));
+    vkStream->write((VkExternalSemaphoreHandleTypeFlagBits*)&forMarshaling->handleType,
+                    sizeof(VkExternalSemaphoreHandleTypeFlagBits));
 }
 
-void unmarshal_VkSemaphoreGetWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSemaphoreGetWin32HandleInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkSemaphoreGetWin32HandleInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkSemaphoreGetWin32HandleInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkSemaphore(&cgen_var_0, (VkSemaphore*)&forUnmarshaling->semaphore, 1);
-    vkStream->read((VkExternalSemaphoreHandleTypeFlagBits*)&forUnmarshaling->handleType, sizeof(VkExternalSemaphoreHandleTypeFlagBits));
+    vkStream->handleMapping()->mapHandles_u64_VkSemaphore(
+        &cgen_var_0, (VkSemaphore*)&forUnmarshaling->semaphore, 1);
+    vkStream->read((VkExternalSemaphoreHandleTypeFlagBits*)&forUnmarshaling->handleType,
+                   sizeof(VkExternalSemaphoreHandleTypeFlagBits));
 }
 
 #endif
 #ifdef VK_KHR_external_semaphore_fd
-void marshal_VkImportSemaphoreFdInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImportSemaphoreFdInfoKHR* forMarshaling)
-{
+void marshal_VkImportSemaphoreFdInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                        const VkImportSemaphoreFdInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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_VkSemaphore_u64(&forMarshaling->semaphore, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkSemaphore_u64(&forMarshaling->semaphore, &cgen_var_0,
+                                                          1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->write((VkSemaphoreImportFlags*)&forMarshaling->flags, sizeof(VkSemaphoreImportFlags));
-    vkStream->write((VkExternalSemaphoreHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalSemaphoreHandleTypeFlagBits));
+    vkStream->write((VkExternalSemaphoreHandleTypeFlagBits*)&forMarshaling->handleType,
+                    sizeof(VkExternalSemaphoreHandleTypeFlagBits));
     vkStream->write((int*)&forMarshaling->fd, sizeof(int));
 }
 
-void unmarshal_VkImportSemaphoreFdInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportSemaphoreFdInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkImportSemaphoreFdInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkImportSemaphoreFdInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkSemaphore(&cgen_var_0, (VkSemaphore*)&forUnmarshaling->semaphore, 1);
-    vkStream->read((VkSemaphoreImportFlags*)&forUnmarshaling->flags, sizeof(VkSemaphoreImportFlags));
-    vkStream->read((VkExternalSemaphoreHandleTypeFlagBits*)&forUnmarshaling->handleType, sizeof(VkExternalSemaphoreHandleTypeFlagBits));
+    vkStream->handleMapping()->mapHandles_u64_VkSemaphore(
+        &cgen_var_0, (VkSemaphore*)&forUnmarshaling->semaphore, 1);
+    vkStream->read((VkSemaphoreImportFlags*)&forUnmarshaling->flags,
+                   sizeof(VkSemaphoreImportFlags));
+    vkStream->read((VkExternalSemaphoreHandleTypeFlagBits*)&forUnmarshaling->handleType,
+                   sizeof(VkExternalSemaphoreHandleTypeFlagBits));
     vkStream->read((int*)&forUnmarshaling->fd, sizeof(int));
 }
 
-void marshal_VkSemaphoreGetFdInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSemaphoreGetFdInfoKHR* forMarshaling)
-{
+void marshal_VkSemaphoreGetFdInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkSemaphoreGetFdInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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_VkSemaphore_u64(&forMarshaling->semaphore, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkSemaphore_u64(&forMarshaling->semaphore, &cgen_var_0,
+                                                          1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->write((VkExternalSemaphoreHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalSemaphoreHandleTypeFlagBits));
+    vkStream->write((VkExternalSemaphoreHandleTypeFlagBits*)&forMarshaling->handleType,
+                    sizeof(VkExternalSemaphoreHandleTypeFlagBits));
 }
 
-void unmarshal_VkSemaphoreGetFdInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSemaphoreGetFdInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkSemaphoreGetFdInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkSemaphoreGetFdInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkSemaphore(&cgen_var_0, (VkSemaphore*)&forUnmarshaling->semaphore, 1);
-    vkStream->read((VkExternalSemaphoreHandleTypeFlagBits*)&forUnmarshaling->handleType, sizeof(VkExternalSemaphoreHandleTypeFlagBits));
+    vkStream->handleMapping()->mapHandles_u64_VkSemaphore(
+        &cgen_var_0, (VkSemaphore*)&forUnmarshaling->semaphore, 1);
+    vkStream->read((VkExternalSemaphoreHandleTypeFlagBits*)&forUnmarshaling->handleType,
+                   sizeof(VkExternalSemaphoreHandleTypeFlagBits));
 }
 
 #endif
 #ifdef VK_KHR_push_descriptor
 void marshal_VkPhysicalDevicePushDescriptorPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDevicePushDescriptorPropertiesKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDevicePushDescriptorPropertiesKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -14337,25 +13496,23 @@
 }
 
 void unmarshal_VkPhysicalDevicePushDescriptorPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePushDescriptorPropertiesKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePushDescriptorPropertiesKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -14368,81 +13525,62 @@
 #ifdef VK_KHR_16bit_storage
 #endif
 #ifdef VK_KHR_incremental_present
-void marshal_VkRectLayerKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkRectLayerKHR* forMarshaling)
-{
+void marshal_VkRectLayerKHR(VulkanStream* vkStream, VkStructureType rootType,
+                            const VkRectLayerKHR* forMarshaling) {
     (void)rootType;
     marshal_VkOffset2D(vkStream, rootType, (VkOffset2D*)(&forMarshaling->offset));
     marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->extent));
     vkStream->write((uint32_t*)&forMarshaling->layer, sizeof(uint32_t));
 }
 
-void unmarshal_VkRectLayerKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRectLayerKHR* forUnmarshaling)
-{
+void unmarshal_VkRectLayerKHR(VulkanStream* vkStream, VkStructureType rootType,
+                              VkRectLayerKHR* forUnmarshaling) {
     (void)rootType;
     unmarshal_VkOffset2D(vkStream, rootType, (VkOffset2D*)(&forUnmarshaling->offset));
     unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->extent));
     vkStream->read((uint32_t*)&forUnmarshaling->layer, sizeof(uint32_t));
 }
 
-void marshal_VkPresentRegionKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPresentRegionKHR* forMarshaling)
-{
+void marshal_VkPresentRegionKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                const VkPresentRegionKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->rectangleCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pRectangles;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pRectangles)
-    {
-        if (forMarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forMarshaling->rectangleCount; ++i)
-            {
-                marshal_VkRectLayerKHR(vkStream, rootType, (const VkRectLayerKHR*)(forMarshaling->pRectangles + i));
+    if (forMarshaling->pRectangles) {
+        if (forMarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forMarshaling->rectangleCount; ++i) {
+                marshal_VkRectLayerKHR(vkStream, rootType,
+                                       (const VkRectLayerKHR*)(forMarshaling->pRectangles + i));
             }
         }
     }
 }
 
-void unmarshal_VkPresentRegionKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPresentRegionKHR* forUnmarshaling)
-{
+void unmarshal_VkPresentRegionKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkPresentRegionKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->rectangleCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     forUnmarshaling->pRectangles = (const VkRectLayerKHR*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pRectangles)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pRectangles, forUnmarshaling->rectangleCount * sizeof(const VkRectLayerKHR));
-        if (forUnmarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->rectangleCount; ++i)
-            {
-                unmarshal_VkRectLayerKHR(vkStream, rootType, (VkRectLayerKHR*)(forUnmarshaling->pRectangles + i));
+    if (forUnmarshaling->pRectangles) {
+        vkStream->alloc((void**)&forUnmarshaling->pRectangles,
+                        forUnmarshaling->rectangleCount * sizeof(const VkRectLayerKHR));
+        if (forUnmarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->rectangleCount; ++i) {
+                unmarshal_VkRectLayerKHR(vkStream, rootType,
+                                         (VkRectLayerKHR*)(forUnmarshaling->pRectangles + i));
             }
         }
     }
 }
 
-void marshal_VkPresentRegionsKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPresentRegionsKHR* forMarshaling)
-{
+void marshal_VkPresentRegionsKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkPresentRegionsKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -14450,52 +13588,46 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pRegions;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pRegions)
-    {
-        if (forMarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forMarshaling->swapchainCount; ++i)
-            {
-                marshal_VkPresentRegionKHR(vkStream, rootType, (const VkPresentRegionKHR*)(forMarshaling->pRegions + i));
+    if (forMarshaling->pRegions) {
+        if (forMarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forMarshaling->swapchainCount; ++i) {
+                marshal_VkPresentRegionKHR(
+                    vkStream, rootType, (const VkPresentRegionKHR*)(forMarshaling->pRegions + i));
             }
         }
     }
 }
 
-void unmarshal_VkPresentRegionsKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPresentRegionsKHR* forUnmarshaling)
-{
+void unmarshal_VkPresentRegionsKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkPresentRegionsKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->swapchainCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     forUnmarshaling->pRegions = (const VkPresentRegionKHR*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pRegions)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pRegions, forUnmarshaling->swapchainCount * sizeof(const VkPresentRegionKHR));
-        if (forUnmarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->swapchainCount; ++i)
-            {
-                unmarshal_VkPresentRegionKHR(vkStream, rootType, (VkPresentRegionKHR*)(forUnmarshaling->pRegions + i));
+    if (forUnmarshaling->pRegions) {
+        vkStream->alloc((void**)&forUnmarshaling->pRegions,
+                        forUnmarshaling->swapchainCount * sizeof(const VkPresentRegionKHR));
+        if (forUnmarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->swapchainCount; ++i) {
+                unmarshal_VkPresentRegionKHR(vkStream, rootType,
+                                             (VkPresentRegionKHR*)(forUnmarshaling->pRegions + i));
             }
         }
     }
@@ -14510,44 +13642,41 @@
 #endif
 #ifdef VK_KHR_shared_presentable_image
 void marshal_VkSharedPresentSurfaceCapabilitiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSharedPresentSurfaceCapabilitiesKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkSharedPresentSurfaceCapabilitiesKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkImageUsageFlags*)&forMarshaling->sharedPresentSupportedUsageFlags, sizeof(VkImageUsageFlags));
+    vkStream->write((VkImageUsageFlags*)&forMarshaling->sharedPresentSupportedUsageFlags,
+                    sizeof(VkImageUsageFlags));
 }
 
 void unmarshal_VkSharedPresentSurfaceCapabilitiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSharedPresentSurfaceCapabilitiesKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSharedPresentSurfaceCapabilitiesKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkImageUsageFlags*)&forUnmarshaling->sharedPresentSupportedUsageFlags, sizeof(VkImageUsageFlags));
+    vkStream->read((VkImageUsageFlags*)&forUnmarshaling->sharedPresentSupportedUsageFlags,
+                   sizeof(VkImageUsageFlags));
 }
 
 #endif
@@ -14556,15 +13685,11 @@
 #ifdef VK_KHR_external_fence
 #endif
 #ifdef VK_KHR_external_fence_win32
-void marshal_VkImportFenceWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImportFenceWin32HandleInfoKHR* forMarshaling)
-{
+void marshal_VkImportFenceWin32HandleInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkImportFenceWin32HandleInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -14572,158 +13697,143 @@
     vkStream->handleMapping()->mapHandles_VkFence_u64(&forMarshaling->fence, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->write((VkFenceImportFlags*)&forMarshaling->flags, sizeof(VkFenceImportFlags));
-    vkStream->write((VkExternalFenceHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalFenceHandleTypeFlagBits));
+    vkStream->write((VkExternalFenceHandleTypeFlagBits*)&forMarshaling->handleType,
+                    sizeof(VkExternalFenceHandleTypeFlagBits));
     vkStream->write((HANDLE*)&forMarshaling->handle, sizeof(HANDLE));
     vkStream->write((LPCWSTR*)&forMarshaling->name, sizeof(LPCWSTR));
 }
 
-void unmarshal_VkImportFenceWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportFenceWin32HandleInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkImportFenceWin32HandleInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkImportFenceWin32HandleInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkFence(&cgen_var_0, (VkFence*)&forUnmarshaling->fence, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkFence(&cgen_var_0,
+                                                      (VkFence*)&forUnmarshaling->fence, 1);
     vkStream->read((VkFenceImportFlags*)&forUnmarshaling->flags, sizeof(VkFenceImportFlags));
-    vkStream->read((VkExternalFenceHandleTypeFlagBits*)&forUnmarshaling->handleType, sizeof(VkExternalFenceHandleTypeFlagBits));
+    vkStream->read((VkExternalFenceHandleTypeFlagBits*)&forUnmarshaling->handleType,
+                   sizeof(VkExternalFenceHandleTypeFlagBits));
     vkStream->read((HANDLE*)&forUnmarshaling->handle, sizeof(HANDLE));
     vkStream->read((LPCWSTR*)&forUnmarshaling->name, sizeof(LPCWSTR));
 }
 
-void marshal_VkExportFenceWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkExportFenceWin32HandleInfoKHR* forMarshaling)
-{
+void marshal_VkExportFenceWin32HandleInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkExportFenceWin32HandleInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pAttributes;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pAttributes)
-    {
-        vkStream->write((const SECURITY_ATTRIBUTES*)forMarshaling->pAttributes, sizeof(const SECURITY_ATTRIBUTES));
+    if (forMarshaling->pAttributes) {
+        vkStream->write((const SECURITY_ATTRIBUTES*)forMarshaling->pAttributes,
+                        sizeof(const SECURITY_ATTRIBUTES));
     }
     vkStream->write((DWORD*)&forMarshaling->dwAccess, sizeof(DWORD));
     vkStream->write((LPCWSTR*)&forMarshaling->name, sizeof(LPCWSTR));
 }
 
-void unmarshal_VkExportFenceWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExportFenceWin32HandleInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkExportFenceWin32HandleInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkExportFenceWin32HandleInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     // WARNING PTR CHECK
     forUnmarshaling->pAttributes = (const SECURITY_ATTRIBUTES*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pAttributes)
-    {
+    if (forUnmarshaling->pAttributes) {
         vkStream->alloc((void**)&forUnmarshaling->pAttributes, sizeof(const SECURITY_ATTRIBUTES));
-        vkStream->read((SECURITY_ATTRIBUTES*)forUnmarshaling->pAttributes, sizeof(const SECURITY_ATTRIBUTES));
+        vkStream->read((SECURITY_ATTRIBUTES*)forUnmarshaling->pAttributes,
+                       sizeof(const SECURITY_ATTRIBUTES));
     }
     vkStream->read((DWORD*)&forUnmarshaling->dwAccess, sizeof(DWORD));
     vkStream->read((LPCWSTR*)&forUnmarshaling->name, sizeof(LPCWSTR));
 }
 
-void marshal_VkFenceGetWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkFenceGetWin32HandleInfoKHR* forMarshaling)
-{
+void marshal_VkFenceGetWin32HandleInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                          const VkFenceGetWin32HandleInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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_VkFence_u64(&forMarshaling->fence, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->write((VkExternalFenceHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalFenceHandleTypeFlagBits));
+    vkStream->write((VkExternalFenceHandleTypeFlagBits*)&forMarshaling->handleType,
+                    sizeof(VkExternalFenceHandleTypeFlagBits));
 }
 
-void unmarshal_VkFenceGetWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFenceGetWin32HandleInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkFenceGetWin32HandleInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkFenceGetWin32HandleInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkFence(&cgen_var_0, (VkFence*)&forUnmarshaling->fence, 1);
-    vkStream->read((VkExternalFenceHandleTypeFlagBits*)&forUnmarshaling->handleType, sizeof(VkExternalFenceHandleTypeFlagBits));
+    vkStream->handleMapping()->mapHandles_u64_VkFence(&cgen_var_0,
+                                                      (VkFence*)&forUnmarshaling->fence, 1);
+    vkStream->read((VkExternalFenceHandleTypeFlagBits*)&forUnmarshaling->handleType,
+                   sizeof(VkExternalFenceHandleTypeFlagBits));
 }
 
 #endif
 #ifdef VK_KHR_external_fence_fd
-void marshal_VkImportFenceFdInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImportFenceFdInfoKHR* forMarshaling)
-{
+void marshal_VkImportFenceFdInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                    const VkImportFenceFdInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -14731,142 +13841,132 @@
     vkStream->handleMapping()->mapHandles_VkFence_u64(&forMarshaling->fence, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->write((VkFenceImportFlags*)&forMarshaling->flags, sizeof(VkFenceImportFlags));
-    vkStream->write((VkExternalFenceHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalFenceHandleTypeFlagBits));
+    vkStream->write((VkExternalFenceHandleTypeFlagBits*)&forMarshaling->handleType,
+                    sizeof(VkExternalFenceHandleTypeFlagBits));
     vkStream->write((int*)&forMarshaling->fd, sizeof(int));
 }
 
-void unmarshal_VkImportFenceFdInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportFenceFdInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkImportFenceFdInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                      VkImportFenceFdInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkFence(&cgen_var_0, (VkFence*)&forUnmarshaling->fence, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkFence(&cgen_var_0,
+                                                      (VkFence*)&forUnmarshaling->fence, 1);
     vkStream->read((VkFenceImportFlags*)&forUnmarshaling->flags, sizeof(VkFenceImportFlags));
-    vkStream->read((VkExternalFenceHandleTypeFlagBits*)&forUnmarshaling->handleType, sizeof(VkExternalFenceHandleTypeFlagBits));
+    vkStream->read((VkExternalFenceHandleTypeFlagBits*)&forUnmarshaling->handleType,
+                   sizeof(VkExternalFenceHandleTypeFlagBits));
     vkStream->read((int*)&forUnmarshaling->fd, sizeof(int));
 }
 
-void marshal_VkFenceGetFdInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkFenceGetFdInfoKHR* forMarshaling)
-{
+void marshal_VkFenceGetFdInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkFenceGetFdInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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_VkFence_u64(&forMarshaling->fence, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->write((VkExternalFenceHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalFenceHandleTypeFlagBits));
+    vkStream->write((VkExternalFenceHandleTypeFlagBits*)&forMarshaling->handleType,
+                    sizeof(VkExternalFenceHandleTypeFlagBits));
 }
 
-void unmarshal_VkFenceGetFdInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFenceGetFdInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkFenceGetFdInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkFenceGetFdInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkFence(&cgen_var_0, (VkFence*)&forUnmarshaling->fence, 1);
-    vkStream->read((VkExternalFenceHandleTypeFlagBits*)&forUnmarshaling->handleType, sizeof(VkExternalFenceHandleTypeFlagBits));
+    vkStream->handleMapping()->mapHandles_u64_VkFence(&cgen_var_0,
+                                                      (VkFence*)&forUnmarshaling->fence, 1);
+    vkStream->read((VkExternalFenceHandleTypeFlagBits*)&forUnmarshaling->handleType,
+                   sizeof(VkExternalFenceHandleTypeFlagBits));
 }
 
 #endif
 #ifdef VK_KHR_performance_query
 void marshal_VkPhysicalDevicePerformanceQueryFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDevicePerformanceQueryFeaturesKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDevicePerformanceQueryFeaturesKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->performanceCounterQueryPools, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->performanceCounterMultipleQueryPools, sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->performanceCounterMultipleQueryPools,
+                    sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDevicePerformanceQueryFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePerformanceQueryFeaturesKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePerformanceQueryFeaturesKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkBool32*)&forUnmarshaling->performanceCounterQueryPools, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->performanceCounterMultipleQueryPools, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->performanceCounterMultipleQueryPools,
+                   sizeof(VkBool32));
 }
 
 void marshal_VkPhysicalDevicePerformanceQueryPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDevicePerformanceQueryPropertiesKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDevicePerformanceQueryPropertiesKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -14874,267 +13974,241 @@
 }
 
 void unmarshal_VkPhysicalDevicePerformanceQueryPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePerformanceQueryPropertiesKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePerformanceQueryPropertiesKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkBool32*)&forUnmarshaling->allowCommandBufferQueryCopies, sizeof(VkBool32));
 }
 
-void marshal_VkPerformanceCounterKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPerformanceCounterKHR* forMarshaling)
-{
+void marshal_VkPerformanceCounterKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkPerformanceCounterKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkPerformanceCounterUnitKHR*)&forMarshaling->unit, sizeof(VkPerformanceCounterUnitKHR));
-    vkStream->write((VkPerformanceCounterScopeKHR*)&forMarshaling->scope, sizeof(VkPerformanceCounterScopeKHR));
-    vkStream->write((VkPerformanceCounterStorageKHR*)&forMarshaling->storage, sizeof(VkPerformanceCounterStorageKHR));
+    vkStream->write((VkPerformanceCounterUnitKHR*)&forMarshaling->unit,
+                    sizeof(VkPerformanceCounterUnitKHR));
+    vkStream->write((VkPerformanceCounterScopeKHR*)&forMarshaling->scope,
+                    sizeof(VkPerformanceCounterScopeKHR));
+    vkStream->write((VkPerformanceCounterStorageKHR*)&forMarshaling->storage,
+                    sizeof(VkPerformanceCounterStorageKHR));
     vkStream->write((uint8_t*)forMarshaling->uuid, VK_UUID_SIZE * sizeof(uint8_t));
 }
 
-void unmarshal_VkPerformanceCounterKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPerformanceCounterKHR* forUnmarshaling)
-{
+void unmarshal_VkPerformanceCounterKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkPerformanceCounterKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkPerformanceCounterUnitKHR*)&forUnmarshaling->unit, sizeof(VkPerformanceCounterUnitKHR));
-    vkStream->read((VkPerformanceCounterScopeKHR*)&forUnmarshaling->scope, sizeof(VkPerformanceCounterScopeKHR));
-    vkStream->read((VkPerformanceCounterStorageKHR*)&forUnmarshaling->storage, sizeof(VkPerformanceCounterStorageKHR));
+    vkStream->read((VkPerformanceCounterUnitKHR*)&forUnmarshaling->unit,
+                   sizeof(VkPerformanceCounterUnitKHR));
+    vkStream->read((VkPerformanceCounterScopeKHR*)&forUnmarshaling->scope,
+                   sizeof(VkPerformanceCounterScopeKHR));
+    vkStream->read((VkPerformanceCounterStorageKHR*)&forUnmarshaling->storage,
+                   sizeof(VkPerformanceCounterStorageKHR));
     vkStream->read((uint8_t*)forUnmarshaling->uuid, VK_UUID_SIZE * sizeof(uint8_t));
 }
 
 void marshal_VkPerformanceCounterDescriptionKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPerformanceCounterDescriptionKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPerformanceCounterDescriptionKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkPerformanceCounterDescriptionFlagsKHR*)&forMarshaling->flags, sizeof(VkPerformanceCounterDescriptionFlagsKHR));
+    vkStream->write((VkPerformanceCounterDescriptionFlagsKHR*)&forMarshaling->flags,
+                    sizeof(VkPerformanceCounterDescriptionFlagsKHR));
     vkStream->write((char*)forMarshaling->name, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
     vkStream->write((char*)forMarshaling->category, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
     vkStream->write((char*)forMarshaling->description, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
 }
 
 void unmarshal_VkPerformanceCounterDescriptionKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPerformanceCounterDescriptionKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPerformanceCounterDescriptionKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkPerformanceCounterDescriptionFlagsKHR*)&forUnmarshaling->flags, sizeof(VkPerformanceCounterDescriptionFlagsKHR));
+    vkStream->read((VkPerformanceCounterDescriptionFlagsKHR*)&forUnmarshaling->flags,
+                   sizeof(VkPerformanceCounterDescriptionFlagsKHR));
     vkStream->read((char*)forUnmarshaling->name, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
     vkStream->read((char*)forUnmarshaling->category, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
     vkStream->read((char*)forUnmarshaling->description, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
 }
 
 void marshal_VkQueryPoolPerformanceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkQueryPoolPerformanceCreateInfoKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkQueryPoolPerformanceCreateInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->queueFamilyIndex, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->counterIndexCount, sizeof(uint32_t));
-    vkStream->write((const uint32_t*)forMarshaling->pCounterIndices, forMarshaling->counterIndexCount * sizeof(const uint32_t));
+    vkStream->write((const uint32_t*)forMarshaling->pCounterIndices,
+                    forMarshaling->counterIndexCount * sizeof(const uint32_t));
 }
 
 void unmarshal_VkQueryPoolPerformanceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkQueryPoolPerformanceCreateInfoKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkQueryPoolPerformanceCreateInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->queueFamilyIndex, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->counterIndexCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pCounterIndices, forUnmarshaling->counterIndexCount * sizeof(const uint32_t));
-    vkStream->read((uint32_t*)forUnmarshaling->pCounterIndices, forUnmarshaling->counterIndexCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pCounterIndices,
+                    forUnmarshaling->counterIndexCount * sizeof(const uint32_t));
+    vkStream->read((uint32_t*)forUnmarshaling->pCounterIndices,
+                   forUnmarshaling->counterIndexCount * sizeof(const uint32_t));
 }
 
-void marshal_VkPerformanceCounterResultKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPerformanceCounterResultKHR* forMarshaling)
-{
+void marshal_VkPerformanceCounterResultKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkPerformanceCounterResultKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((int32_t*)&forMarshaling->int32, sizeof(int32_t));
 }
 
-void unmarshal_VkPerformanceCounterResultKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPerformanceCounterResultKHR* forUnmarshaling)
-{
+void unmarshal_VkPerformanceCounterResultKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkPerformanceCounterResultKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((int32_t*)&forUnmarshaling->int32, sizeof(int32_t));
 }
 
-void marshal_VkAcquireProfilingLockInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAcquireProfilingLockInfoKHR* forMarshaling)
-{
+void marshal_VkAcquireProfilingLockInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkAcquireProfilingLockInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkAcquireProfilingLockFlagsKHR*)&forMarshaling->flags, sizeof(VkAcquireProfilingLockFlagsKHR));
+    vkStream->write((VkAcquireProfilingLockFlagsKHR*)&forMarshaling->flags,
+                    sizeof(VkAcquireProfilingLockFlagsKHR));
     vkStream->write((uint64_t*)&forMarshaling->timeout, sizeof(uint64_t));
 }
 
-void unmarshal_VkAcquireProfilingLockInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAcquireProfilingLockInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkAcquireProfilingLockInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkAcquireProfilingLockInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkAcquireProfilingLockFlagsKHR*)&forUnmarshaling->flags, sizeof(VkAcquireProfilingLockFlagsKHR));
+    vkStream->read((VkAcquireProfilingLockFlagsKHR*)&forUnmarshaling->flags,
+                   sizeof(VkAcquireProfilingLockFlagsKHR));
     vkStream->read((uint64_t*)&forUnmarshaling->timeout, sizeof(uint64_t));
 }
 
-void marshal_VkPerformanceQuerySubmitInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPerformanceQuerySubmitInfoKHR* forMarshaling)
-{
+void marshal_VkPerformanceQuerySubmitInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkPerformanceQuerySubmitInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->counterPassIndex, sizeof(uint32_t));
 }
 
-void unmarshal_VkPerformanceQuerySubmitInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPerformanceQuerySubmitInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkPerformanceQuerySubmitInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkPerformanceQuerySubmitInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -15145,15 +14219,11 @@
 #ifdef VK_KHR_maintenance2
 #endif
 #ifdef VK_KHR_get_surface_capabilities2
-void marshal_VkPhysicalDeviceSurfaceInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceSurfaceInfo2KHR* forMarshaling)
-{
+void marshal_VkPhysicalDeviceSurfaceInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkPhysicalDeviceSurfaceInfo2KHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -15162,329 +14232,293 @@
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
 }
 
-void unmarshal_VkPhysicalDeviceSurfaceInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSurfaceInfo2KHR* forUnmarshaling)
-{
+void unmarshal_VkPhysicalDeviceSurfaceInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkPhysicalDeviceSurfaceInfo2KHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkSurfaceKHR(&cgen_var_0, (VkSurfaceKHR*)&forUnmarshaling->surface, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkSurfaceKHR(
+        &cgen_var_0, (VkSurfaceKHR*)&forUnmarshaling->surface, 1);
 }
 
-void marshal_VkSurfaceCapabilities2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSurfaceCapabilities2KHR* forMarshaling)
-{
+void marshal_VkSurfaceCapabilities2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkSurfaceCapabilities2KHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    marshal_VkSurfaceCapabilitiesKHR(vkStream, rootType, (VkSurfaceCapabilitiesKHR*)(&forMarshaling->surfaceCapabilities));
+    marshal_VkSurfaceCapabilitiesKHR(
+        vkStream, rootType, (VkSurfaceCapabilitiesKHR*)(&forMarshaling->surfaceCapabilities));
 }
 
-void unmarshal_VkSurfaceCapabilities2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSurfaceCapabilities2KHR* forUnmarshaling)
-{
+void unmarshal_VkSurfaceCapabilities2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkSurfaceCapabilities2KHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    unmarshal_VkSurfaceCapabilitiesKHR(vkStream, rootType, (VkSurfaceCapabilitiesKHR*)(&forUnmarshaling->surfaceCapabilities));
+    unmarshal_VkSurfaceCapabilitiesKHR(
+        vkStream, rootType, (VkSurfaceCapabilitiesKHR*)(&forUnmarshaling->surfaceCapabilities));
 }
 
-void marshal_VkSurfaceFormat2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSurfaceFormat2KHR* forMarshaling)
-{
+void marshal_VkSurfaceFormat2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkSurfaceFormat2KHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    marshal_VkSurfaceFormatKHR(vkStream, rootType, (VkSurfaceFormatKHR*)(&forMarshaling->surfaceFormat));
+    marshal_VkSurfaceFormatKHR(vkStream, rootType,
+                               (VkSurfaceFormatKHR*)(&forMarshaling->surfaceFormat));
 }
 
-void unmarshal_VkSurfaceFormat2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSurfaceFormat2KHR* forUnmarshaling)
-{
+void unmarshal_VkSurfaceFormat2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkSurfaceFormat2KHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    unmarshal_VkSurfaceFormatKHR(vkStream, rootType, (VkSurfaceFormatKHR*)(&forUnmarshaling->surfaceFormat));
+    unmarshal_VkSurfaceFormatKHR(vkStream, rootType,
+                                 (VkSurfaceFormatKHR*)(&forUnmarshaling->surfaceFormat));
 }
 
 #endif
 #ifdef VK_KHR_variable_pointers
 #endif
 #ifdef VK_KHR_get_display_properties2
-void marshal_VkDisplayProperties2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDisplayProperties2KHR* forMarshaling)
-{
+void marshal_VkDisplayProperties2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkDisplayProperties2KHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    marshal_VkDisplayPropertiesKHR(vkStream, rootType, (VkDisplayPropertiesKHR*)(&forMarshaling->displayProperties));
+    marshal_VkDisplayPropertiesKHR(vkStream, rootType,
+                                   (VkDisplayPropertiesKHR*)(&forMarshaling->displayProperties));
 }
 
-void unmarshal_VkDisplayProperties2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayProperties2KHR* forUnmarshaling)
-{
+void unmarshal_VkDisplayProperties2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkDisplayProperties2KHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    unmarshal_VkDisplayPropertiesKHR(vkStream, rootType, (VkDisplayPropertiesKHR*)(&forUnmarshaling->displayProperties));
+    unmarshal_VkDisplayPropertiesKHR(
+        vkStream, rootType, (VkDisplayPropertiesKHR*)(&forUnmarshaling->displayProperties));
 }
 
-void marshal_VkDisplayPlaneProperties2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDisplayPlaneProperties2KHR* forMarshaling)
-{
+void marshal_VkDisplayPlaneProperties2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                          const VkDisplayPlaneProperties2KHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    marshal_VkDisplayPlanePropertiesKHR(vkStream, rootType, (VkDisplayPlanePropertiesKHR*)(&forMarshaling->displayPlaneProperties));
+    marshal_VkDisplayPlanePropertiesKHR(
+        vkStream, rootType, (VkDisplayPlanePropertiesKHR*)(&forMarshaling->displayPlaneProperties));
 }
 
-void unmarshal_VkDisplayPlaneProperties2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayPlaneProperties2KHR* forUnmarshaling)
-{
+void unmarshal_VkDisplayPlaneProperties2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkDisplayPlaneProperties2KHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    unmarshal_VkDisplayPlanePropertiesKHR(vkStream, rootType, (VkDisplayPlanePropertiesKHR*)(&forUnmarshaling->displayPlaneProperties));
+    unmarshal_VkDisplayPlanePropertiesKHR(
+        vkStream, rootType,
+        (VkDisplayPlanePropertiesKHR*)(&forUnmarshaling->displayPlaneProperties));
 }
 
-void marshal_VkDisplayModeProperties2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDisplayModeProperties2KHR* forMarshaling)
-{
+void marshal_VkDisplayModeProperties2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkDisplayModeProperties2KHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    marshal_VkDisplayModePropertiesKHR(vkStream, rootType, (VkDisplayModePropertiesKHR*)(&forMarshaling->displayModeProperties));
+    marshal_VkDisplayModePropertiesKHR(
+        vkStream, rootType, (VkDisplayModePropertiesKHR*)(&forMarshaling->displayModeProperties));
 }
 
-void unmarshal_VkDisplayModeProperties2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayModeProperties2KHR* forUnmarshaling)
-{
+void unmarshal_VkDisplayModeProperties2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkDisplayModeProperties2KHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    unmarshal_VkDisplayModePropertiesKHR(vkStream, rootType, (VkDisplayModePropertiesKHR*)(&forUnmarshaling->displayModeProperties));
+    unmarshal_VkDisplayModePropertiesKHR(
+        vkStream, rootType, (VkDisplayModePropertiesKHR*)(&forUnmarshaling->displayModeProperties));
 }
 
-void marshal_VkDisplayPlaneInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDisplayPlaneInfo2KHR* forMarshaling)
-{
+void marshal_VkDisplayPlaneInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                    const VkDisplayPlaneInfo2KHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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_VkDisplayModeKHR_u64(&forMarshaling->mode, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkDisplayModeKHR_u64(&forMarshaling->mode, &cgen_var_0,
+                                                               1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->write((uint32_t*)&forMarshaling->planeIndex, sizeof(uint32_t));
 }
 
-void unmarshal_VkDisplayPlaneInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayPlaneInfo2KHR* forUnmarshaling)
-{
+void unmarshal_VkDisplayPlaneInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                      VkDisplayPlaneInfo2KHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkDisplayModeKHR(&cgen_var_0, (VkDisplayModeKHR*)&forUnmarshaling->mode, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkDisplayModeKHR(
+        &cgen_var_0, (VkDisplayModeKHR*)&forUnmarshaling->mode, 1);
     vkStream->read((uint32_t*)&forUnmarshaling->planeIndex, sizeof(uint32_t));
 }
 
-void marshal_VkDisplayPlaneCapabilities2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDisplayPlaneCapabilities2KHR* forMarshaling)
-{
+void marshal_VkDisplayPlaneCapabilities2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                            const VkDisplayPlaneCapabilities2KHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    marshal_VkDisplayPlaneCapabilitiesKHR(vkStream, rootType, (VkDisplayPlaneCapabilitiesKHR*)(&forMarshaling->capabilities));
+    marshal_VkDisplayPlaneCapabilitiesKHR(
+        vkStream, rootType, (VkDisplayPlaneCapabilitiesKHR*)(&forMarshaling->capabilities));
 }
 
-void unmarshal_VkDisplayPlaneCapabilities2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayPlaneCapabilities2KHR* forUnmarshaling)
-{
+void unmarshal_VkDisplayPlaneCapabilities2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkDisplayPlaneCapabilities2KHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    unmarshal_VkDisplayPlaneCapabilitiesKHR(vkStream, rootType, (VkDisplayPlaneCapabilitiesKHR*)(&forUnmarshaling->capabilities));
+    unmarshal_VkDisplayPlaneCapabilitiesKHR(
+        vkStream, rootType, (VkDisplayPlaneCapabilitiesKHR*)(&forUnmarshaling->capabilities));
 }
 
 #endif
@@ -15504,14 +14538,11 @@
 #endif
 #ifdef VK_KHR_portability_subset
 void marshal_VkPhysicalDevicePortabilitySubsetFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDevicePortabilitySubsetFeaturesKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDevicePortabilitySubsetFeaturesKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -15525,7 +14556,8 @@
     vkStream->write((VkBool32*)&forMarshaling->pointPolygons, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->samplerMipLodBias, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->separateStencilMaskRef, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->shaderSampleRateInterpolationFunctions, sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderSampleRateInterpolationFunctions,
+                    sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->tessellationIsolines, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->tessellationPointMode, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->triangleFans, sizeof(VkBool32));
@@ -15533,25 +14565,23 @@
 }
 
 void unmarshal_VkPhysicalDevicePortabilitySubsetFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePortabilitySubsetFeaturesKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePortabilitySubsetFeaturesKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -15565,52 +14595,51 @@
     vkStream->read((VkBool32*)&forUnmarshaling->pointPolygons, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->samplerMipLodBias, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->separateStencilMaskRef, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderSampleRateInterpolationFunctions, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderSampleRateInterpolationFunctions,
+                   sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->tessellationIsolines, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->tessellationPointMode, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->triangleFans, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->vertexAttributeAccessBeyondStride, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->vertexAttributeAccessBeyondStride,
+                   sizeof(VkBool32));
 }
 
 void marshal_VkPhysicalDevicePortabilitySubsetPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDevicePortabilitySubsetPropertiesKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDevicePortabilitySubsetPropertiesKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((uint32_t*)&forMarshaling->minVertexInputBindingStrideAlignment, sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->minVertexInputBindingStrideAlignment,
+                    sizeof(uint32_t));
 }
 
 void unmarshal_VkPhysicalDevicePortabilitySubsetPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePortabilitySubsetPropertiesKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePortabilitySubsetPropertiesKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((uint32_t*)&forUnmarshaling->minVertexInputBindingStrideAlignment, sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->minVertexInputBindingStrideAlignment,
+                   sizeof(uint32_t));
 }
 
 #endif
@@ -15626,14 +14655,11 @@
 #endif
 #ifdef VK_KHR_shader_clock
 void marshal_VkPhysicalDeviceShaderClockFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceShaderClockFeaturesKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceShaderClockFeaturesKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -15642,25 +14668,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceShaderClockFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderClockFeaturesKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderClockFeaturesKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -15683,14 +14707,11 @@
 #endif
 #ifdef VK_KHR_shader_terminate_invocation
 void marshal_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -15698,25 +14719,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -15726,112 +14745,107 @@
 #endif
 #ifdef VK_KHR_fragment_shading_rate
 void marshal_VkFragmentShadingRateAttachmentInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkFragmentShadingRateAttachmentInfoKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkFragmentShadingRateAttachmentInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pFragmentShadingRateAttachment;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pFragmentShadingRateAttachment)
-    {
-        marshal_VkAttachmentReference2(vkStream, rootType, (const VkAttachmentReference2*)(forMarshaling->pFragmentShadingRateAttachment));
+    if (forMarshaling->pFragmentShadingRateAttachment) {
+        marshal_VkAttachmentReference2(
+            vkStream, rootType,
+            (const VkAttachmentReference2*)(forMarshaling->pFragmentShadingRateAttachment));
     }
-    marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->shadingRateAttachmentTexelSize));
+    marshal_VkExtent2D(vkStream, rootType,
+                       (VkExtent2D*)(&forMarshaling->shadingRateAttachmentTexelSize));
 }
 
 void unmarshal_VkFragmentShadingRateAttachmentInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFragmentShadingRateAttachmentInfoKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkFragmentShadingRateAttachmentInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     // WARNING PTR CHECK
-    forUnmarshaling->pFragmentShadingRateAttachment = (const VkAttachmentReference2*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pFragmentShadingRateAttachment)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pFragmentShadingRateAttachment, sizeof(const VkAttachmentReference2));
-        unmarshal_VkAttachmentReference2(vkStream, rootType, (VkAttachmentReference2*)(forUnmarshaling->pFragmentShadingRateAttachment));
+    forUnmarshaling->pFragmentShadingRateAttachment =
+        (const VkAttachmentReference2*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pFragmentShadingRateAttachment) {
+        vkStream->alloc((void**)&forUnmarshaling->pFragmentShadingRateAttachment,
+                        sizeof(const VkAttachmentReference2));
+        unmarshal_VkAttachmentReference2(
+            vkStream, rootType,
+            (VkAttachmentReference2*)(forUnmarshaling->pFragmentShadingRateAttachment));
     }
-    unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->shadingRateAttachmentTexelSize));
+    unmarshal_VkExtent2D(vkStream, rootType,
+                         (VkExtent2D*)(&forUnmarshaling->shadingRateAttachmentTexelSize));
 }
 
 void marshal_VkPipelineFragmentShadingRateStateCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineFragmentShadingRateStateCreateInfoKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineFragmentShadingRateStateCreateInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->fragmentSize));
-    vkStream->write((VkFragmentShadingRateCombinerOpKHR*)forMarshaling->combinerOps, 2 * sizeof(VkFragmentShadingRateCombinerOpKHR));
+    vkStream->write((VkFragmentShadingRateCombinerOpKHR*)forMarshaling->combinerOps,
+                    2 * sizeof(VkFragmentShadingRateCombinerOpKHR));
 }
 
 void unmarshal_VkPipelineFragmentShadingRateStateCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineFragmentShadingRateStateCreateInfoKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineFragmentShadingRateStateCreateInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->fragmentSize));
-    vkStream->read((VkFragmentShadingRateCombinerOpKHR*)forUnmarshaling->combinerOps, 2 * sizeof(VkFragmentShadingRateCombinerOpKHR));
+    vkStream->read((VkFragmentShadingRateCombinerOpKHR*)forUnmarshaling->combinerOps,
+                   2 * sizeof(VkFragmentShadingRateCombinerOpKHR));
 }
 
 void marshal_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceFragmentShadingRateFeaturesKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceFragmentShadingRateFeaturesKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -15841,25 +14855,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFragmentShadingRateFeaturesKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceFragmentShadingRateFeaturesKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -15869,87 +14881,111 @@
 }
 
 void marshal_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceFragmentShadingRatePropertiesKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceFragmentShadingRatePropertiesKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->minFragmentShadingRateAttachmentTexelSize));
-    marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->maxFragmentShadingRateAttachmentTexelSize));
-    vkStream->write((uint32_t*)&forMarshaling->maxFragmentShadingRateAttachmentTexelSizeAspectRatio, sizeof(uint32_t));
-    vkStream->write((VkBool32*)&forMarshaling->primitiveFragmentShadingRateWithMultipleViewports, sizeof(VkBool32));
+    marshal_VkExtent2D(vkStream, rootType,
+                       (VkExtent2D*)(&forMarshaling->minFragmentShadingRateAttachmentTexelSize));
+    marshal_VkExtent2D(vkStream, rootType,
+                       (VkExtent2D*)(&forMarshaling->maxFragmentShadingRateAttachmentTexelSize));
+    vkStream->write((uint32_t*)&forMarshaling->maxFragmentShadingRateAttachmentTexelSizeAspectRatio,
+                    sizeof(uint32_t));
+    vkStream->write((VkBool32*)&forMarshaling->primitiveFragmentShadingRateWithMultipleViewports,
+                    sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->layeredShadingRateAttachments, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->fragmentShadingRateNonTrivialCombinerOps, sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->fragmentShadingRateNonTrivialCombinerOps,
+                    sizeof(VkBool32));
     marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->maxFragmentSize));
     vkStream->write((uint32_t*)&forMarshaling->maxFragmentSizeAspectRatio, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxFragmentShadingRateCoverageSamples, sizeof(uint32_t));
-    vkStream->write((VkSampleCountFlagBits*)&forMarshaling->maxFragmentShadingRateRasterizationSamples, sizeof(VkSampleCountFlagBits));
-    vkStream->write((VkBool32*)&forMarshaling->fragmentShadingRateWithShaderDepthStencilWrites, sizeof(VkBool32));
+    vkStream->write((uint32_t*)&forMarshaling->maxFragmentShadingRateCoverageSamples,
+                    sizeof(uint32_t));
+    vkStream->write(
+        (VkSampleCountFlagBits*)&forMarshaling->maxFragmentShadingRateRasterizationSamples,
+        sizeof(VkSampleCountFlagBits));
+    vkStream->write((VkBool32*)&forMarshaling->fragmentShadingRateWithShaderDepthStencilWrites,
+                    sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->fragmentShadingRateWithSampleMask, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->fragmentShadingRateWithShaderSampleMask, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->fragmentShadingRateWithConservativeRasterization, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->fragmentShadingRateWithFragmentShaderInterlock, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->fragmentShadingRateWithCustomSampleLocations, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->fragmentShadingRateStrictMultiplyCombiner, sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->fragmentShadingRateWithShaderSampleMask,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->fragmentShadingRateWithConservativeRasterization,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->fragmentShadingRateWithFragmentShaderInterlock,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->fragmentShadingRateWithCustomSampleLocations,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->fragmentShadingRateStrictMultiplyCombiner,
+                    sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFragmentShadingRatePropertiesKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceFragmentShadingRatePropertiesKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->minFragmentShadingRateAttachmentTexelSize));
-    unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->maxFragmentShadingRateAttachmentTexelSize));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxFragmentShadingRateAttachmentTexelSizeAspectRatio, sizeof(uint32_t));
-    vkStream->read((VkBool32*)&forUnmarshaling->primitiveFragmentShadingRateWithMultipleViewports, sizeof(VkBool32));
+    unmarshal_VkExtent2D(
+        vkStream, rootType,
+        (VkExtent2D*)(&forUnmarshaling->minFragmentShadingRateAttachmentTexelSize));
+    unmarshal_VkExtent2D(
+        vkStream, rootType,
+        (VkExtent2D*)(&forUnmarshaling->maxFragmentShadingRateAttachmentTexelSize));
+    vkStream->read(
+        (uint32_t*)&forUnmarshaling->maxFragmentShadingRateAttachmentTexelSizeAspectRatio,
+        sizeof(uint32_t));
+    vkStream->read((VkBool32*)&forUnmarshaling->primitiveFragmentShadingRateWithMultipleViewports,
+                   sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->layeredShadingRateAttachments, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->fragmentShadingRateNonTrivialCombinerOps, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->fragmentShadingRateNonTrivialCombinerOps,
+                   sizeof(VkBool32));
     unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->maxFragmentSize));
     vkStream->read((uint32_t*)&forUnmarshaling->maxFragmentSizeAspectRatio, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxFragmentShadingRateCoverageSamples, sizeof(uint32_t));
-    vkStream->read((VkSampleCountFlagBits*)&forUnmarshaling->maxFragmentShadingRateRasterizationSamples, sizeof(VkSampleCountFlagBits));
-    vkStream->read((VkBool32*)&forUnmarshaling->fragmentShadingRateWithShaderDepthStencilWrites, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->fragmentShadingRateWithSampleMask, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->fragmentShadingRateWithShaderSampleMask, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->fragmentShadingRateWithConservativeRasterization, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->fragmentShadingRateWithFragmentShaderInterlock, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->fragmentShadingRateWithCustomSampleLocations, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->fragmentShadingRateStrictMultiplyCombiner, sizeof(VkBool32));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxFragmentShadingRateCoverageSamples,
+                   sizeof(uint32_t));
+    vkStream->read(
+        (VkSampleCountFlagBits*)&forUnmarshaling->maxFragmentShadingRateRasterizationSamples,
+        sizeof(VkSampleCountFlagBits));
+    vkStream->read((VkBool32*)&forUnmarshaling->fragmentShadingRateWithShaderDepthStencilWrites,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->fragmentShadingRateWithSampleMask,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->fragmentShadingRateWithShaderSampleMask,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->fragmentShadingRateWithConservativeRasterization,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->fragmentShadingRateWithFragmentShaderInterlock,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->fragmentShadingRateWithCustomSampleLocations,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->fragmentShadingRateStrictMultiplyCombiner,
+                   sizeof(VkBool32));
 }
 
 void marshal_VkPhysicalDeviceFragmentShadingRateKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceFragmentShadingRateKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceFragmentShadingRateKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -15958,25 +14994,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceFragmentShadingRateKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFragmentShadingRateKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceFragmentShadingRateKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -15989,14 +15023,11 @@
 #endif
 #ifdef VK_KHR_surface_protected_capabilities
 void marshal_VkSurfaceProtectedCapabilitiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSurfaceProtectedCapabilitiesKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkSurfaceProtectedCapabilitiesKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -16004,25 +15035,23 @@
 }
 
 void unmarshal_VkSurfaceProtectedCapabilitiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSurfaceProtectedCapabilitiesKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSurfaceProtectedCapabilitiesKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -16034,14 +15063,11 @@
 #endif
 #ifdef VK_KHR_present_wait
 void marshal_VkPhysicalDevicePresentWaitFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDevicePresentWaitFeaturesKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDevicePresentWaitFeaturesKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -16049,25 +15075,23 @@
 }
 
 void unmarshal_VkPhysicalDevicePresentWaitFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePresentWaitFeaturesKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePresentWaitFeaturesKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -16083,14 +15107,11 @@
 #endif
 #ifdef VK_KHR_pipeline_executable_properties
 void marshal_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -16098,40 +15119,34 @@
 }
 
 void unmarshal_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkBool32*)&forUnmarshaling->pipelineExecutableInfo, sizeof(VkBool32));
 }
 
-void marshal_VkPipelineInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineInfoKHR* forMarshaling)
-{
+void marshal_VkPipelineInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                               const VkPipelineInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -16140,43 +15155,38 @@
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
 }
 
-void unmarshal_VkPipelineInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkPipelineInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                 VkPipelineInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkPipeline(&cgen_var_0, (VkPipeline*)&forUnmarshaling->pipeline, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkPipeline(
+        &cgen_var_0, (VkPipeline*)&forUnmarshaling->pipeline, 1);
 }
 
 void marshal_VkPipelineExecutablePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineExecutablePropertiesKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineExecutablePropertiesKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -16187,25 +15197,23 @@
 }
 
 void unmarshal_VkPipelineExecutablePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineExecutablePropertiesKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineExecutablePropertiesKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -16215,15 +15223,11 @@
     vkStream->read((uint32_t*)&forUnmarshaling->subgroupSize, sizeof(uint32_t));
 }
 
-void marshal_VkPipelineExecutableInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineExecutableInfoKHR* forMarshaling)
-{
+void marshal_VkPipelineExecutableInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkPipelineExecutableInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -16233,109 +15237,98 @@
     vkStream->write((uint32_t*)&forMarshaling->executableIndex, sizeof(uint32_t));
 }
 
-void unmarshal_VkPipelineExecutableInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineExecutableInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkPipelineExecutableInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkPipelineExecutableInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkPipeline(&cgen_var_0, (VkPipeline*)&forUnmarshaling->pipeline, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkPipeline(
+        &cgen_var_0, (VkPipeline*)&forUnmarshaling->pipeline, 1);
     vkStream->read((uint32_t*)&forUnmarshaling->executableIndex, sizeof(uint32_t));
 }
 
 void marshal_VkPipelineExecutableStatisticValueKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineExecutableStatisticValueKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineExecutableStatisticValueKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkBool32*)&forMarshaling->b32, sizeof(VkBool32));
 }
 
 void unmarshal_VkPipelineExecutableStatisticValueKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineExecutableStatisticValueKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineExecutableStatisticValueKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkBool32*)&forUnmarshaling->b32, sizeof(VkBool32));
 }
 
 void marshal_VkPipelineExecutableStatisticKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineExecutableStatisticKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineExecutableStatisticKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((char*)forMarshaling->name, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
     vkStream->write((char*)forMarshaling->description, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
-    vkStream->write((VkPipelineExecutableStatisticFormatKHR*)&forMarshaling->format, sizeof(VkPipelineExecutableStatisticFormatKHR));
-    marshal_VkPipelineExecutableStatisticValueKHR(vkStream, rootType, (VkPipelineExecutableStatisticValueKHR*)(&forMarshaling->value));
+    vkStream->write((VkPipelineExecutableStatisticFormatKHR*)&forMarshaling->format,
+                    sizeof(VkPipelineExecutableStatisticFormatKHR));
+    marshal_VkPipelineExecutableStatisticValueKHR(
+        vkStream, rootType, (VkPipelineExecutableStatisticValueKHR*)(&forMarshaling->value));
 }
 
-void unmarshal_VkPipelineExecutableStatisticKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineExecutableStatisticKHR* forUnmarshaling)
-{
+void unmarshal_VkPipelineExecutableStatisticKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkPipelineExecutableStatisticKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((char*)forUnmarshaling->name, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
     vkStream->read((char*)forUnmarshaling->description, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
-    vkStream->read((VkPipelineExecutableStatisticFormatKHR*)&forUnmarshaling->format, sizeof(VkPipelineExecutableStatisticFormatKHR));
-    unmarshal_VkPipelineExecutableStatisticValueKHR(vkStream, rootType, (VkPipelineExecutableStatisticValueKHR*)(&forUnmarshaling->value));
+    vkStream->read((VkPipelineExecutableStatisticFormatKHR*)&forUnmarshaling->format,
+                   sizeof(VkPipelineExecutableStatisticFormatKHR));
+    unmarshal_VkPipelineExecutableStatisticValueKHR(
+        vkStream, rootType, (VkPipelineExecutableStatisticValueKHR*)(&forUnmarshaling->value));
 }
 
 void marshal_VkPipelineExecutableInternalRepresentationKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineExecutableInternalRepresentationKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineExecutableInternalRepresentationKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -16347,32 +15340,29 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)forMarshaling->pData;
     vkStream->putBe64(cgen_var_1);
-    if (forMarshaling->pData)
-    {
+    if (forMarshaling->pData) {
         vkStream->write((void*)forMarshaling->pData, forMarshaling->dataSize * sizeof(uint8_t));
     }
 }
 
 void unmarshal_VkPipelineExecutableInternalRepresentationKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineExecutableInternalRepresentationKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineExecutableInternalRepresentationKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -16382,9 +15372,9 @@
     forUnmarshaling->dataSize = (size_t)vkStream->getBe64();
     // WARNING PTR CHECK
     forUnmarshaling->pData = (void*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pData)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pData, forUnmarshaling->dataSize * sizeof(uint8_t));
+    if (forUnmarshaling->pData) {
+        vkStream->alloc((void**)&forUnmarshaling->pData,
+                        forUnmarshaling->dataSize * sizeof(uint8_t));
         vkStream->read((void*)forUnmarshaling->pData, forUnmarshaling->dataSize * sizeof(uint8_t));
     }
 }
@@ -16392,14 +15382,11 @@
 #endif
 #ifdef VK_KHR_shader_integer_dot_product
 void marshal_VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -16407,25 +15394,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -16433,159 +15418,242 @@
 }
 
 void marshal_VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkBool32*)&forMarshaling->integerDotProduct8BitUnsignedAccelerated, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->integerDotProduct8BitSignedAccelerated, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->integerDotProduct8BitMixedSignednessAccelerated, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->integerDotProduct4x8BitPackedUnsignedAccelerated, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->integerDotProduct4x8BitPackedSignedAccelerated, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->integerDotProduct4x8BitPackedMixedSignednessAccelerated, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->integerDotProduct16BitUnsignedAccelerated, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->integerDotProduct16BitSignedAccelerated, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->integerDotProduct16BitMixedSignednessAccelerated, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->integerDotProduct32BitUnsignedAccelerated, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->integerDotProduct32BitSignedAccelerated, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->integerDotProduct32BitMixedSignednessAccelerated, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->integerDotProduct64BitUnsignedAccelerated, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->integerDotProduct64BitSignedAccelerated, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->integerDotProduct64BitMixedSignednessAccelerated, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->integerDotProductAccumulatingSaturating8BitUnsignedAccelerated, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->integerDotProductAccumulatingSaturating8BitSignedAccelerated, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->integerDotProductAccumulatingSaturating16BitUnsignedAccelerated, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->integerDotProductAccumulatingSaturating16BitSignedAccelerated, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->integerDotProductAccumulatingSaturating32BitUnsignedAccelerated, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->integerDotProductAccumulatingSaturating32BitSignedAccelerated, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->integerDotProductAccumulatingSaturating64BitUnsignedAccelerated, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->integerDotProductAccumulatingSaturating64BitSignedAccelerated, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated, sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->integerDotProduct8BitUnsignedAccelerated,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->integerDotProduct8BitSignedAccelerated,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->integerDotProduct8BitMixedSignednessAccelerated,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->integerDotProduct4x8BitPackedUnsignedAccelerated,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->integerDotProduct4x8BitPackedSignedAccelerated,
+                    sizeof(VkBool32));
+    vkStream->write(
+        (VkBool32*)&forMarshaling->integerDotProduct4x8BitPackedMixedSignednessAccelerated,
+        sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->integerDotProduct16BitUnsignedAccelerated,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->integerDotProduct16BitSignedAccelerated,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->integerDotProduct16BitMixedSignednessAccelerated,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->integerDotProduct32BitUnsignedAccelerated,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->integerDotProduct32BitSignedAccelerated,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->integerDotProduct32BitMixedSignednessAccelerated,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->integerDotProduct64BitUnsignedAccelerated,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->integerDotProduct64BitSignedAccelerated,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->integerDotProduct64BitMixedSignednessAccelerated,
+                    sizeof(VkBool32));
+    vkStream->write(
+        (VkBool32*)&forMarshaling->integerDotProductAccumulatingSaturating8BitUnsignedAccelerated,
+        sizeof(VkBool32));
+    vkStream->write(
+        (VkBool32*)&forMarshaling->integerDotProductAccumulatingSaturating8BitSignedAccelerated,
+        sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling
+                        ->integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling
+                        ->integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling
+                        ->integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated,
+                    sizeof(VkBool32));
+    vkStream->write(
+        (VkBool32*)&forMarshaling
+            ->integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated,
+        sizeof(VkBool32));
+    vkStream->write(
+        (VkBool32*)&forMarshaling->integerDotProductAccumulatingSaturating16BitUnsignedAccelerated,
+        sizeof(VkBool32));
+    vkStream->write(
+        (VkBool32*)&forMarshaling->integerDotProductAccumulatingSaturating16BitSignedAccelerated,
+        sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling
+                        ->integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated,
+                    sizeof(VkBool32));
+    vkStream->write(
+        (VkBool32*)&forMarshaling->integerDotProductAccumulatingSaturating32BitUnsignedAccelerated,
+        sizeof(VkBool32));
+    vkStream->write(
+        (VkBool32*)&forMarshaling->integerDotProductAccumulatingSaturating32BitSignedAccelerated,
+        sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling
+                        ->integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated,
+                    sizeof(VkBool32));
+    vkStream->write(
+        (VkBool32*)&forMarshaling->integerDotProductAccumulatingSaturating64BitUnsignedAccelerated,
+        sizeof(VkBool32));
+    vkStream->write(
+        (VkBool32*)&forMarshaling->integerDotProductAccumulatingSaturating64BitSignedAccelerated,
+        sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling
+                        ->integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated,
+                    sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProduct8BitUnsignedAccelerated, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProduct8BitSignedAccelerated, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProduct8BitMixedSignednessAccelerated, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProduct4x8BitPackedUnsignedAccelerated, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProduct4x8BitPackedSignedAccelerated, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProduct4x8BitPackedMixedSignednessAccelerated, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProduct16BitUnsignedAccelerated, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProduct16BitSignedAccelerated, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProduct16BitMixedSignednessAccelerated, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProduct32BitUnsignedAccelerated, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProduct32BitSignedAccelerated, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProduct32BitMixedSignednessAccelerated, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProduct64BitUnsignedAccelerated, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProduct64BitSignedAccelerated, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProduct64BitMixedSignednessAccelerated, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating8BitUnsignedAccelerated, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating8BitSignedAccelerated, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating16BitUnsignedAccelerated, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating16BitSignedAccelerated, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating32BitUnsignedAccelerated, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating32BitSignedAccelerated, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating64BitUnsignedAccelerated, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating64BitSignedAccelerated, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProduct8BitUnsignedAccelerated,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProduct8BitSignedAccelerated,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProduct8BitMixedSignednessAccelerated,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProduct4x8BitPackedUnsignedAccelerated,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProduct4x8BitPackedSignedAccelerated,
+                   sizeof(VkBool32));
+    vkStream->read(
+        (VkBool32*)&forUnmarshaling->integerDotProduct4x8BitPackedMixedSignednessAccelerated,
+        sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProduct16BitUnsignedAccelerated,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProduct16BitSignedAccelerated,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProduct16BitMixedSignednessAccelerated,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProduct32BitUnsignedAccelerated,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProduct32BitSignedAccelerated,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProduct32BitMixedSignednessAccelerated,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProduct64BitUnsignedAccelerated,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProduct64BitSignedAccelerated,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->integerDotProduct64BitMixedSignednessAccelerated,
+                   sizeof(VkBool32));
+    vkStream->read(
+        (VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating8BitUnsignedAccelerated,
+        sizeof(VkBool32));
+    vkStream->read(
+        (VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating8BitSignedAccelerated,
+        sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling
+                       ->integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling
+                       ->integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling
+                       ->integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated,
+                   sizeof(VkBool32));
+    vkStream->read(
+        (VkBool32*)&forUnmarshaling
+            ->integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated,
+        sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling
+                       ->integerDotProductAccumulatingSaturating16BitUnsignedAccelerated,
+                   sizeof(VkBool32));
+    vkStream->read(
+        (VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating16BitSignedAccelerated,
+        sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling
+                       ->integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling
+                       ->integerDotProductAccumulatingSaturating32BitUnsignedAccelerated,
+                   sizeof(VkBool32));
+    vkStream->read(
+        (VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating32BitSignedAccelerated,
+        sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling
+                       ->integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling
+                       ->integerDotProductAccumulatingSaturating64BitUnsignedAccelerated,
+                   sizeof(VkBool32));
+    vkStream->read(
+        (VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating64BitSignedAccelerated,
+        sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling
+                       ->integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated,
+                   sizeof(VkBool32));
 }
 
 #endif
 #ifdef VK_KHR_pipeline_library
-void marshal_VkPipelineLibraryCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineLibraryCreateInfoKHR* forMarshaling)
-{
+void marshal_VkPipelineLibraryCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                            const VkPipelineLibraryCreateInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->libraryCount, sizeof(uint32_t));
-    if (forMarshaling->libraryCount)
-    {
+    if (forMarshaling->libraryCount) {
         uint64_t* cgen_var_0;
         vkStream->alloc((void**)&cgen_var_0, forMarshaling->libraryCount * 8);
-        vkStream->handleMapping()->mapHandles_VkPipeline_u64(forMarshaling->pLibraries, cgen_var_0, forMarshaling->libraryCount);
+        vkStream->handleMapping()->mapHandles_VkPipeline_u64(forMarshaling->pLibraries, cgen_var_0,
+                                                             forMarshaling->libraryCount);
         vkStream->write((uint64_t*)cgen_var_0, forMarshaling->libraryCount * 8);
     }
 }
 
-void unmarshal_VkPipelineLibraryCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineLibraryCreateInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkPipelineLibraryCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkPipelineLibraryCreateInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->libraryCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pLibraries, forUnmarshaling->libraryCount * sizeof(const VkPipeline));
-    if (forUnmarshaling->libraryCount)
-    {
+    vkStream->alloc((void**)&forUnmarshaling->pLibraries,
+                    forUnmarshaling->libraryCount * sizeof(const VkPipeline));
+    if (forUnmarshaling->libraryCount) {
         uint64_t* cgen_var_0;
         vkStream->alloc((void**)&cgen_var_0, forUnmarshaling->libraryCount * 8);
         vkStream->read((uint64_t*)cgen_var_0, forUnmarshaling->libraryCount * 8);
-        vkStream->handleMapping()->mapHandles_u64_VkPipeline(cgen_var_0, (VkPipeline*)forUnmarshaling->pLibraries, forUnmarshaling->libraryCount);
+        vkStream->handleMapping()->mapHandles_u64_VkPipeline(
+            cgen_var_0, (VkPipeline*)forUnmarshaling->pLibraries, forUnmarshaling->libraryCount);
     }
 }
 
@@ -16593,15 +15661,11 @@
 #ifdef VK_KHR_shader_non_semantic_info
 #endif
 #ifdef VK_KHR_present_id
-void marshal_VkPresentIdKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPresentIdKHR* forMarshaling)
-{
+void marshal_VkPresentIdKHR(VulkanStream* vkStream, VkStructureType rootType,
+                            const VkPresentIdKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -16609,54 +15673,49 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pPresentIds;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pPresentIds)
-    {
-        vkStream->write((const uint64_t*)forMarshaling->pPresentIds, forMarshaling->swapchainCount * sizeof(const uint64_t));
+    if (forMarshaling->pPresentIds) {
+        vkStream->write((const uint64_t*)forMarshaling->pPresentIds,
+                        forMarshaling->swapchainCount * sizeof(const uint64_t));
     }
 }
 
-void unmarshal_VkPresentIdKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPresentIdKHR* forUnmarshaling)
-{
+void unmarshal_VkPresentIdKHR(VulkanStream* vkStream, VkStructureType rootType,
+                              VkPresentIdKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->swapchainCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     forUnmarshaling->pPresentIds = (const uint64_t*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pPresentIds)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pPresentIds, forUnmarshaling->swapchainCount * sizeof(const uint64_t));
-        vkStream->read((uint64_t*)forUnmarshaling->pPresentIds, forUnmarshaling->swapchainCount * sizeof(const uint64_t));
+    if (forUnmarshaling->pPresentIds) {
+        vkStream->alloc((void**)&forUnmarshaling->pPresentIds,
+                        forUnmarshaling->swapchainCount * sizeof(const uint64_t));
+        vkStream->read((uint64_t*)forUnmarshaling->pPresentIds,
+                       forUnmarshaling->swapchainCount * sizeof(const uint64_t));
     }
 }
 
 void marshal_VkPhysicalDevicePresentIdFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDevicePresentIdFeaturesKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDevicePresentIdFeaturesKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -16664,25 +15723,23 @@
 }
 
 void unmarshal_VkPhysicalDevicePresentIdFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePresentIdFeaturesKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePresentIdFeaturesKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -16691,15 +15748,11 @@
 
 #endif
 #ifdef VK_KHR_video_encode_queue
-void marshal_VkVideoEncodeInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoEncodeInfoKHR* forMarshaling)
-{
+void marshal_VkVideoEncodeInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkVideoEncodeInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -16707,42 +15760,43 @@
     vkStream->write((uint32_t*)&forMarshaling->qualityLevel, sizeof(uint32_t));
     marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->codedExtent));
     uint64_t cgen_var_0;
-    vkStream->handleMapping()->mapHandles_VkBuffer_u64(&forMarshaling->dstBitstreamBuffer, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkBuffer_u64(&forMarshaling->dstBitstreamBuffer,
+                                                       &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->write((VkDeviceSize*)&forMarshaling->dstBitstreamBufferOffset, sizeof(VkDeviceSize));
-    vkStream->write((VkDeviceSize*)&forMarshaling->dstBitstreamBufferMaxRange, sizeof(VkDeviceSize));
-    marshal_VkVideoPictureResourceKHR(vkStream, rootType, (VkVideoPictureResourceKHR*)(&forMarshaling->srcPictureResource));
-    marshal_VkVideoReferenceSlotKHR(vkStream, rootType, (const VkVideoReferenceSlotKHR*)(forMarshaling->pSetupReferenceSlot));
+    vkStream->write((VkDeviceSize*)&forMarshaling->dstBitstreamBufferMaxRange,
+                    sizeof(VkDeviceSize));
+    marshal_VkVideoPictureResourceKHR(
+        vkStream, rootType, (VkVideoPictureResourceKHR*)(&forMarshaling->srcPictureResource));
+    marshal_VkVideoReferenceSlotKHR(
+        vkStream, rootType, (const VkVideoReferenceSlotKHR*)(forMarshaling->pSetupReferenceSlot));
     vkStream->write((uint32_t*)&forMarshaling->referenceSlotCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->referenceSlotCount; ++i)
-        {
-            marshal_VkVideoReferenceSlotKHR(vkStream, rootType, (const VkVideoReferenceSlotKHR*)(forMarshaling->pReferenceSlots + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->referenceSlotCount; ++i) {
+            marshal_VkVideoReferenceSlotKHR(
+                vkStream, rootType,
+                (const VkVideoReferenceSlotKHR*)(forMarshaling->pReferenceSlots + i));
         }
     }
 }
 
-void unmarshal_VkVideoEncodeInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkVideoEncodeInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkVideoEncodeInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -16751,37 +15805,41 @@
     unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->codedExtent));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_0, (VkBuffer*)&forUnmarshaling->dstBitstreamBuffer, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkBuffer(
+        &cgen_var_0, (VkBuffer*)&forUnmarshaling->dstBitstreamBuffer, 1);
     vkStream->read((VkDeviceSize*)&forUnmarshaling->dstBitstreamBufferOffset, sizeof(VkDeviceSize));
-    vkStream->read((VkDeviceSize*)&forUnmarshaling->dstBitstreamBufferMaxRange, sizeof(VkDeviceSize));
-    unmarshal_VkVideoPictureResourceKHR(vkStream, rootType, (VkVideoPictureResourceKHR*)(&forUnmarshaling->srcPictureResource));
-    vkStream->alloc((void**)&forUnmarshaling->pSetupReferenceSlot, sizeof(const VkVideoReferenceSlotKHR));
-    unmarshal_VkVideoReferenceSlotKHR(vkStream, rootType, (VkVideoReferenceSlotKHR*)(forUnmarshaling->pSetupReferenceSlot));
+    vkStream->read((VkDeviceSize*)&forUnmarshaling->dstBitstreamBufferMaxRange,
+                   sizeof(VkDeviceSize));
+    unmarshal_VkVideoPictureResourceKHR(
+        vkStream, rootType, (VkVideoPictureResourceKHR*)(&forUnmarshaling->srcPictureResource));
+    vkStream->alloc((void**)&forUnmarshaling->pSetupReferenceSlot,
+                    sizeof(const VkVideoReferenceSlotKHR));
+    unmarshal_VkVideoReferenceSlotKHR(
+        vkStream, rootType, (VkVideoReferenceSlotKHR*)(forUnmarshaling->pSetupReferenceSlot));
     vkStream->read((uint32_t*)&forUnmarshaling->referenceSlotCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pReferenceSlots, forUnmarshaling->referenceSlotCount * sizeof(const VkVideoReferenceSlotKHR));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->referenceSlotCount; ++i)
-        {
-            unmarshal_VkVideoReferenceSlotKHR(vkStream, rootType, (VkVideoReferenceSlotKHR*)(forUnmarshaling->pReferenceSlots + i));
+    vkStream->alloc((void**)&forUnmarshaling->pReferenceSlots,
+                    forUnmarshaling->referenceSlotCount * sizeof(const VkVideoReferenceSlotKHR));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->referenceSlotCount; ++i) {
+            unmarshal_VkVideoReferenceSlotKHR(
+                vkStream, rootType,
+                (VkVideoReferenceSlotKHR*)(forUnmarshaling->pReferenceSlots + i));
         }
     }
 }
 
-void marshal_VkVideoEncodeRateControlInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoEncodeRateControlInfoKHR* forMarshaling)
-{
+void marshal_VkVideoEncodeRateControlInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkVideoEncodeRateControlInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkVideoEncodeRateControlFlagsKHR*)&forMarshaling->flags, sizeof(VkVideoEncodeRateControlFlagsKHR));
-    vkStream->write((VkVideoEncodeRateControlModeFlagBitsKHR*)&forMarshaling->rateControlMode, sizeof(VkVideoEncodeRateControlModeFlagBitsKHR));
+    vkStream->write((VkVideoEncodeRateControlFlagsKHR*)&forMarshaling->flags,
+                    sizeof(VkVideoEncodeRateControlFlagsKHR));
+    vkStream->write((VkVideoEncodeRateControlModeFlagBitsKHR*)&forMarshaling->rateControlMode,
+                    sizeof(VkVideoEncodeRateControlModeFlagBitsKHR));
     vkStream->write((uint32_t*)&forMarshaling->averageBitrate, sizeof(uint32_t));
     vkStream->write((uint16_t*)&forMarshaling->peakToAverageBitrateRatio, sizeof(uint16_t));
     vkStream->write((uint16_t*)&forMarshaling->frameRateNumerator, sizeof(uint16_t));
@@ -16789,31 +15847,30 @@
     vkStream->write((uint32_t*)&forMarshaling->virtualBufferSizeInMs, sizeof(uint32_t));
 }
 
-void unmarshal_VkVideoEncodeRateControlInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeRateControlInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkVideoEncodeRateControlInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkVideoEncodeRateControlInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkVideoEncodeRateControlFlagsKHR*)&forUnmarshaling->flags, sizeof(VkVideoEncodeRateControlFlagsKHR));
-    vkStream->read((VkVideoEncodeRateControlModeFlagBitsKHR*)&forUnmarshaling->rateControlMode, sizeof(VkVideoEncodeRateControlModeFlagBitsKHR));
+    vkStream->read((VkVideoEncodeRateControlFlagsKHR*)&forUnmarshaling->flags,
+                   sizeof(VkVideoEncodeRateControlFlagsKHR));
+    vkStream->read((VkVideoEncodeRateControlModeFlagBitsKHR*)&forUnmarshaling->rateControlMode,
+                   sizeof(VkVideoEncodeRateControlModeFlagBitsKHR));
     vkStream->read((uint32_t*)&forUnmarshaling->averageBitrate, sizeof(uint32_t));
     vkStream->read((uint16_t*)&forUnmarshaling->peakToAverageBitrateRatio, sizeof(uint16_t));
     vkStream->read((uint16_t*)&forUnmarshaling->frameRateNumerator, sizeof(uint16_t));
@@ -16823,68 +15880,63 @@
 
 #endif
 #ifdef VK_KHR_synchronization2
-void marshal_VkMemoryBarrier2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMemoryBarrier2KHR* forMarshaling)
-{
+void marshal_VkMemoryBarrier2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkMemoryBarrier2KHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkPipelineStageFlags2KHR*)&forMarshaling->srcStageMask, sizeof(VkPipelineStageFlags2KHR));
+    vkStream->write((VkPipelineStageFlags2KHR*)&forMarshaling->srcStageMask,
+                    sizeof(VkPipelineStageFlags2KHR));
     vkStream->write((VkAccessFlags2KHR*)&forMarshaling->srcAccessMask, sizeof(VkAccessFlags2KHR));
-    vkStream->write((VkPipelineStageFlags2KHR*)&forMarshaling->dstStageMask, sizeof(VkPipelineStageFlags2KHR));
+    vkStream->write((VkPipelineStageFlags2KHR*)&forMarshaling->dstStageMask,
+                    sizeof(VkPipelineStageFlags2KHR));
     vkStream->write((VkAccessFlags2KHR*)&forMarshaling->dstAccessMask, sizeof(VkAccessFlags2KHR));
 }
 
-void unmarshal_VkMemoryBarrier2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryBarrier2KHR* forUnmarshaling)
-{
+void unmarshal_VkMemoryBarrier2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkMemoryBarrier2KHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkPipelineStageFlags2KHR*)&forUnmarshaling->srcStageMask, sizeof(VkPipelineStageFlags2KHR));
+    vkStream->read((VkPipelineStageFlags2KHR*)&forUnmarshaling->srcStageMask,
+                   sizeof(VkPipelineStageFlags2KHR));
     vkStream->read((VkAccessFlags2KHR*)&forUnmarshaling->srcAccessMask, sizeof(VkAccessFlags2KHR));
-    vkStream->read((VkPipelineStageFlags2KHR*)&forUnmarshaling->dstStageMask, sizeof(VkPipelineStageFlags2KHR));
+    vkStream->read((VkPipelineStageFlags2KHR*)&forUnmarshaling->dstStageMask,
+                   sizeof(VkPipelineStageFlags2KHR));
     vkStream->read((VkAccessFlags2KHR*)&forUnmarshaling->dstAccessMask, sizeof(VkAccessFlags2KHR));
 }
 
-void marshal_VkBufferMemoryBarrier2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBufferMemoryBarrier2KHR* forMarshaling)
-{
+void marshal_VkBufferMemoryBarrier2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkBufferMemoryBarrier2KHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkPipelineStageFlags2KHR*)&forMarshaling->srcStageMask, sizeof(VkPipelineStageFlags2KHR));
+    vkStream->write((VkPipelineStageFlags2KHR*)&forMarshaling->srcStageMask,
+                    sizeof(VkPipelineStageFlags2KHR));
     vkStream->write((VkAccessFlags2KHR*)&forMarshaling->srcAccessMask, sizeof(VkAccessFlags2KHR));
-    vkStream->write((VkPipelineStageFlags2KHR*)&forMarshaling->dstStageMask, sizeof(VkPipelineStageFlags2KHR));
+    vkStream->write((VkPipelineStageFlags2KHR*)&forMarshaling->dstStageMask,
+                    sizeof(VkPipelineStageFlags2KHR));
     vkStream->write((VkAccessFlags2KHR*)&forMarshaling->dstAccessMask, sizeof(VkAccessFlags2KHR));
     vkStream->write((uint32_t*)&forMarshaling->srcQueueFamilyIndex, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->dstQueueFamilyIndex, sizeof(uint32_t));
@@ -16895,57 +15947,55 @@
     vkStream->write((VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
 }
 
-void unmarshal_VkBufferMemoryBarrier2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferMemoryBarrier2KHR* forUnmarshaling)
-{
+void unmarshal_VkBufferMemoryBarrier2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkBufferMemoryBarrier2KHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkPipelineStageFlags2KHR*)&forUnmarshaling->srcStageMask, sizeof(VkPipelineStageFlags2KHR));
+    vkStream->read((VkPipelineStageFlags2KHR*)&forUnmarshaling->srcStageMask,
+                   sizeof(VkPipelineStageFlags2KHR));
     vkStream->read((VkAccessFlags2KHR*)&forUnmarshaling->srcAccessMask, sizeof(VkAccessFlags2KHR));
-    vkStream->read((VkPipelineStageFlags2KHR*)&forUnmarshaling->dstStageMask, sizeof(VkPipelineStageFlags2KHR));
+    vkStream->read((VkPipelineStageFlags2KHR*)&forUnmarshaling->dstStageMask,
+                   sizeof(VkPipelineStageFlags2KHR));
     vkStream->read((VkAccessFlags2KHR*)&forUnmarshaling->dstAccessMask, sizeof(VkAccessFlags2KHR));
     vkStream->read((uint32_t*)&forUnmarshaling->srcQueueFamilyIndex, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->dstQueueFamilyIndex, sizeof(uint32_t));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_0, (VkBuffer*)&forUnmarshaling->buffer, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_0,
+                                                       (VkBuffer*)&forUnmarshaling->buffer, 1);
     vkStream->read((VkDeviceSize*)&forUnmarshaling->offset, sizeof(VkDeviceSize));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->size, sizeof(VkDeviceSize));
 }
 
-void marshal_VkImageMemoryBarrier2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageMemoryBarrier2KHR* forMarshaling)
-{
+void marshal_VkImageMemoryBarrier2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkImageMemoryBarrier2KHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkPipelineStageFlags2KHR*)&forMarshaling->srcStageMask, sizeof(VkPipelineStageFlags2KHR));
+    vkStream->write((VkPipelineStageFlags2KHR*)&forMarshaling->srcStageMask,
+                    sizeof(VkPipelineStageFlags2KHR));
     vkStream->write((VkAccessFlags2KHR*)&forMarshaling->srcAccessMask, sizeof(VkAccessFlags2KHR));
-    vkStream->write((VkPipelineStageFlags2KHR*)&forMarshaling->dstStageMask, sizeof(VkPipelineStageFlags2KHR));
+    vkStream->write((VkPipelineStageFlags2KHR*)&forMarshaling->dstStageMask,
+                    sizeof(VkPipelineStageFlags2KHR));
     vkStream->write((VkAccessFlags2KHR*)&forMarshaling->dstAccessMask, sizeof(VkAccessFlags2KHR));
     vkStream->write((VkImageLayout*)&forMarshaling->oldLayout, sizeof(VkImageLayout));
     vkStream->write((VkImageLayout*)&forMarshaling->newLayout, sizeof(VkImageLayout));
@@ -16954,35 +16004,35 @@
     uint64_t cgen_var_0;
     vkStream->handleMapping()->mapHandles_VkImage_u64(&forMarshaling->image, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
-    marshal_VkImageSubresourceRange(vkStream, rootType, (VkImageSubresourceRange*)(&forMarshaling->subresourceRange));
+    marshal_VkImageSubresourceRange(vkStream, rootType,
+                                    (VkImageSubresourceRange*)(&forMarshaling->subresourceRange));
 }
 
-void unmarshal_VkImageMemoryBarrier2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageMemoryBarrier2KHR* forUnmarshaling)
-{
+void unmarshal_VkImageMemoryBarrier2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkImageMemoryBarrier2KHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkPipelineStageFlags2KHR*)&forUnmarshaling->srcStageMask, sizeof(VkPipelineStageFlags2KHR));
+    vkStream->read((VkPipelineStageFlags2KHR*)&forUnmarshaling->srcStageMask,
+                   sizeof(VkPipelineStageFlags2KHR));
     vkStream->read((VkAccessFlags2KHR*)&forUnmarshaling->srcAccessMask, sizeof(VkAccessFlags2KHR));
-    vkStream->read((VkPipelineStageFlags2KHR*)&forUnmarshaling->dstStageMask, sizeof(VkPipelineStageFlags2KHR));
+    vkStream->read((VkPipelineStageFlags2KHR*)&forUnmarshaling->dstStageMask,
+                   sizeof(VkPipelineStageFlags2KHR));
     vkStream->read((VkAccessFlags2KHR*)&forUnmarshaling->dstAccessMask, sizeof(VkAccessFlags2KHR));
     vkStream->read((VkImageLayout*)&forUnmarshaling->oldLayout, sizeof(VkImageLayout));
     vkStream->read((VkImageLayout*)&forUnmarshaling->newLayout, sizeof(VkImageLayout));
@@ -16990,301 +16040,289 @@
     vkStream->read((uint32_t*)&forUnmarshaling->dstQueueFamilyIndex, sizeof(uint32_t));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_0, (VkImage*)&forUnmarshaling->image, 1);
-    unmarshal_VkImageSubresourceRange(vkStream, rootType, (VkImageSubresourceRange*)(&forUnmarshaling->subresourceRange));
+    vkStream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_0,
+                                                      (VkImage*)&forUnmarshaling->image, 1);
+    unmarshal_VkImageSubresourceRange(
+        vkStream, rootType, (VkImageSubresourceRange*)(&forUnmarshaling->subresourceRange));
 }
 
-void marshal_VkDependencyInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDependencyInfoKHR* forMarshaling)
-{
+void marshal_VkDependencyInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkDependencyInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkDependencyFlags*)&forMarshaling->dependencyFlags, sizeof(VkDependencyFlags));
     vkStream->write((uint32_t*)&forMarshaling->memoryBarrierCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->memoryBarrierCount; ++i)
-        {
-            marshal_VkMemoryBarrier2KHR(vkStream, rootType, (const VkMemoryBarrier2KHR*)(forMarshaling->pMemoryBarriers + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->memoryBarrierCount; ++i) {
+            marshal_VkMemoryBarrier2KHR(
+                vkStream, rootType,
+                (const VkMemoryBarrier2KHR*)(forMarshaling->pMemoryBarriers + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->bufferMemoryBarrierCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->bufferMemoryBarrierCount; ++i)
-        {
-            marshal_VkBufferMemoryBarrier2KHR(vkStream, rootType, (const VkBufferMemoryBarrier2KHR*)(forMarshaling->pBufferMemoryBarriers + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->bufferMemoryBarrierCount; ++i) {
+            marshal_VkBufferMemoryBarrier2KHR(
+                vkStream, rootType,
+                (const VkBufferMemoryBarrier2KHR*)(forMarshaling->pBufferMemoryBarriers + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->imageMemoryBarrierCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->imageMemoryBarrierCount; ++i)
-        {
-            marshal_VkImageMemoryBarrier2KHR(vkStream, rootType, (const VkImageMemoryBarrier2KHR*)(forMarshaling->pImageMemoryBarriers + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->imageMemoryBarrierCount; ++i) {
+            marshal_VkImageMemoryBarrier2KHR(
+                vkStream, rootType,
+                (const VkImageMemoryBarrier2KHR*)(forMarshaling->pImageMemoryBarriers + i));
         }
     }
 }
 
-void unmarshal_VkDependencyInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDependencyInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkDependencyInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkDependencyInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkDependencyFlags*)&forUnmarshaling->dependencyFlags, sizeof(VkDependencyFlags));
+    vkStream->read((VkDependencyFlags*)&forUnmarshaling->dependencyFlags,
+                   sizeof(VkDependencyFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->memoryBarrierCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pMemoryBarriers, forUnmarshaling->memoryBarrierCount * sizeof(const VkMemoryBarrier2KHR));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->memoryBarrierCount; ++i)
-        {
-            unmarshal_VkMemoryBarrier2KHR(vkStream, rootType, (VkMemoryBarrier2KHR*)(forUnmarshaling->pMemoryBarriers + i));
+    vkStream->alloc((void**)&forUnmarshaling->pMemoryBarriers,
+                    forUnmarshaling->memoryBarrierCount * sizeof(const VkMemoryBarrier2KHR));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->memoryBarrierCount; ++i) {
+            unmarshal_VkMemoryBarrier2KHR(
+                vkStream, rootType, (VkMemoryBarrier2KHR*)(forUnmarshaling->pMemoryBarriers + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->bufferMemoryBarrierCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pBufferMemoryBarriers, forUnmarshaling->bufferMemoryBarrierCount * sizeof(const VkBufferMemoryBarrier2KHR));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->bufferMemoryBarrierCount; ++i)
-        {
-            unmarshal_VkBufferMemoryBarrier2KHR(vkStream, rootType, (VkBufferMemoryBarrier2KHR*)(forUnmarshaling->pBufferMemoryBarriers + i));
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pBufferMemoryBarriers,
+        forUnmarshaling->bufferMemoryBarrierCount * sizeof(const VkBufferMemoryBarrier2KHR));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->bufferMemoryBarrierCount; ++i) {
+            unmarshal_VkBufferMemoryBarrier2KHR(
+                vkStream, rootType,
+                (VkBufferMemoryBarrier2KHR*)(forUnmarshaling->pBufferMemoryBarriers + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->imageMemoryBarrierCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pImageMemoryBarriers, forUnmarshaling->imageMemoryBarrierCount * sizeof(const VkImageMemoryBarrier2KHR));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->imageMemoryBarrierCount; ++i)
-        {
-            unmarshal_VkImageMemoryBarrier2KHR(vkStream, rootType, (VkImageMemoryBarrier2KHR*)(forUnmarshaling->pImageMemoryBarriers + i));
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pImageMemoryBarriers,
+        forUnmarshaling->imageMemoryBarrierCount * sizeof(const VkImageMemoryBarrier2KHR));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->imageMemoryBarrierCount; ++i) {
+            unmarshal_VkImageMemoryBarrier2KHR(
+                vkStream, rootType,
+                (VkImageMemoryBarrier2KHR*)(forUnmarshaling->pImageMemoryBarriers + i));
         }
     }
 }
 
-void marshal_VkSemaphoreSubmitInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSemaphoreSubmitInfoKHR* forMarshaling)
-{
+void marshal_VkSemaphoreSubmitInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkSemaphoreSubmitInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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_VkSemaphore_u64(&forMarshaling->semaphore, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkSemaphore_u64(&forMarshaling->semaphore, &cgen_var_0,
+                                                          1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->write((uint64_t*)&forMarshaling->value, sizeof(uint64_t));
-    vkStream->write((VkPipelineStageFlags2KHR*)&forMarshaling->stageMask, sizeof(VkPipelineStageFlags2KHR));
+    vkStream->write((VkPipelineStageFlags2KHR*)&forMarshaling->stageMask,
+                    sizeof(VkPipelineStageFlags2KHR));
     vkStream->write((uint32_t*)&forMarshaling->deviceIndex, sizeof(uint32_t));
 }
 
-void unmarshal_VkSemaphoreSubmitInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSemaphoreSubmitInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkSemaphoreSubmitInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkSemaphoreSubmitInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkSemaphore(&cgen_var_0, (VkSemaphore*)&forUnmarshaling->semaphore, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkSemaphore(
+        &cgen_var_0, (VkSemaphore*)&forUnmarshaling->semaphore, 1);
     vkStream->read((uint64_t*)&forUnmarshaling->value, sizeof(uint64_t));
-    vkStream->read((VkPipelineStageFlags2KHR*)&forUnmarshaling->stageMask, sizeof(VkPipelineStageFlags2KHR));
+    vkStream->read((VkPipelineStageFlags2KHR*)&forUnmarshaling->stageMask,
+                   sizeof(VkPipelineStageFlags2KHR));
     vkStream->read((uint32_t*)&forUnmarshaling->deviceIndex, sizeof(uint32_t));
 }
 
-void marshal_VkCommandBufferSubmitInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCommandBufferSubmitInfoKHR* forMarshaling)
-{
+void marshal_VkCommandBufferSubmitInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                          const VkCommandBufferSubmitInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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_VkCommandBuffer_u64(&forMarshaling->commandBuffer, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&forMarshaling->commandBuffer,
+                                                              &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->write((uint32_t*)&forMarshaling->deviceMask, sizeof(uint32_t));
 }
 
-void unmarshal_VkCommandBufferSubmitInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCommandBufferSubmitInfoKHR* forUnmarshaling)
-{
+void unmarshal_VkCommandBufferSubmitInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkCommandBufferSubmitInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkCommandBuffer(&cgen_var_0, (VkCommandBuffer*)&forUnmarshaling->commandBuffer, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkCommandBuffer(
+        &cgen_var_0, (VkCommandBuffer*)&forUnmarshaling->commandBuffer, 1);
     vkStream->read((uint32_t*)&forUnmarshaling->deviceMask, sizeof(uint32_t));
 }
 
-void marshal_VkSubmitInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSubmitInfo2KHR* forMarshaling)
-{
+void marshal_VkSubmitInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                              const VkSubmitInfo2KHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkSubmitFlagsKHR*)&forMarshaling->flags, sizeof(VkSubmitFlagsKHR));
     vkStream->write((uint32_t*)&forMarshaling->waitSemaphoreInfoCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->waitSemaphoreInfoCount; ++i)
-        {
-            marshal_VkSemaphoreSubmitInfoKHR(vkStream, rootType, (const VkSemaphoreSubmitInfoKHR*)(forMarshaling->pWaitSemaphoreInfos + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->waitSemaphoreInfoCount; ++i) {
+            marshal_VkSemaphoreSubmitInfoKHR(
+                vkStream, rootType,
+                (const VkSemaphoreSubmitInfoKHR*)(forMarshaling->pWaitSemaphoreInfos + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->commandBufferInfoCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->commandBufferInfoCount; ++i)
-        {
-            marshal_VkCommandBufferSubmitInfoKHR(vkStream, rootType, (const VkCommandBufferSubmitInfoKHR*)(forMarshaling->pCommandBufferInfos + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->commandBufferInfoCount; ++i) {
+            marshal_VkCommandBufferSubmitInfoKHR(
+                vkStream, rootType,
+                (const VkCommandBufferSubmitInfoKHR*)(forMarshaling->pCommandBufferInfos + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->signalSemaphoreInfoCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->signalSemaphoreInfoCount; ++i)
-        {
-            marshal_VkSemaphoreSubmitInfoKHR(vkStream, rootType, (const VkSemaphoreSubmitInfoKHR*)(forMarshaling->pSignalSemaphoreInfos + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->signalSemaphoreInfoCount; ++i) {
+            marshal_VkSemaphoreSubmitInfoKHR(
+                vkStream, rootType,
+                (const VkSemaphoreSubmitInfoKHR*)(forMarshaling->pSignalSemaphoreInfos + i));
         }
     }
 }
 
-void unmarshal_VkSubmitInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubmitInfo2KHR* forUnmarshaling)
-{
+void unmarshal_VkSubmitInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                VkSubmitInfo2KHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkSubmitFlagsKHR*)&forUnmarshaling->flags, sizeof(VkSubmitFlagsKHR));
     vkStream->read((uint32_t*)&forUnmarshaling->waitSemaphoreInfoCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pWaitSemaphoreInfos, forUnmarshaling->waitSemaphoreInfoCount * sizeof(const VkSemaphoreSubmitInfoKHR));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->waitSemaphoreInfoCount; ++i)
-        {
-            unmarshal_VkSemaphoreSubmitInfoKHR(vkStream, rootType, (VkSemaphoreSubmitInfoKHR*)(forUnmarshaling->pWaitSemaphoreInfos + i));
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pWaitSemaphoreInfos,
+        forUnmarshaling->waitSemaphoreInfoCount * sizeof(const VkSemaphoreSubmitInfoKHR));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->waitSemaphoreInfoCount; ++i) {
+            unmarshal_VkSemaphoreSubmitInfoKHR(
+                vkStream, rootType,
+                (VkSemaphoreSubmitInfoKHR*)(forUnmarshaling->pWaitSemaphoreInfos + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->commandBufferInfoCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pCommandBufferInfos, forUnmarshaling->commandBufferInfoCount * sizeof(const VkCommandBufferSubmitInfoKHR));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->commandBufferInfoCount; ++i)
-        {
-            unmarshal_VkCommandBufferSubmitInfoKHR(vkStream, rootType, (VkCommandBufferSubmitInfoKHR*)(forUnmarshaling->pCommandBufferInfos + i));
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pCommandBufferInfos,
+        forUnmarshaling->commandBufferInfoCount * sizeof(const VkCommandBufferSubmitInfoKHR));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->commandBufferInfoCount; ++i) {
+            unmarshal_VkCommandBufferSubmitInfoKHR(
+                vkStream, rootType,
+                (VkCommandBufferSubmitInfoKHR*)(forUnmarshaling->pCommandBufferInfos + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->signalSemaphoreInfoCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pSignalSemaphoreInfos, forUnmarshaling->signalSemaphoreInfoCount * sizeof(const VkSemaphoreSubmitInfoKHR));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->signalSemaphoreInfoCount; ++i)
-        {
-            unmarshal_VkSemaphoreSubmitInfoKHR(vkStream, rootType, (VkSemaphoreSubmitInfoKHR*)(forUnmarshaling->pSignalSemaphoreInfos + i));
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pSignalSemaphoreInfos,
+        forUnmarshaling->signalSemaphoreInfoCount * sizeof(const VkSemaphoreSubmitInfoKHR));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->signalSemaphoreInfoCount; ++i) {
+            unmarshal_VkSemaphoreSubmitInfoKHR(
+                vkStream, rootType,
+                (VkSemaphoreSubmitInfoKHR*)(forUnmarshaling->pSignalSemaphoreInfos + i));
         }
     }
 }
 
 void marshal_VkPhysicalDeviceSynchronization2FeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceSynchronization2FeaturesKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceSynchronization2FeaturesKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -17292,25 +16330,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceSynchronization2FeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSynchronization2FeaturesKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceSynchronization2FeaturesKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -17318,96 +16354,86 @@
 }
 
 void marshal_VkQueueFamilyCheckpointProperties2NV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkQueueFamilyCheckpointProperties2NV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkQueueFamilyCheckpointProperties2NV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkPipelineStageFlags2KHR*)&forMarshaling->checkpointExecutionStageMask, sizeof(VkPipelineStageFlags2KHR));
+    vkStream->write((VkPipelineStageFlags2KHR*)&forMarshaling->checkpointExecutionStageMask,
+                    sizeof(VkPipelineStageFlags2KHR));
 }
 
 void unmarshal_VkQueueFamilyCheckpointProperties2NV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkQueueFamilyCheckpointProperties2NV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkQueueFamilyCheckpointProperties2NV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkPipelineStageFlags2KHR*)&forUnmarshaling->checkpointExecutionStageMask, sizeof(VkPipelineStageFlags2KHR));
+    vkStream->read((VkPipelineStageFlags2KHR*)&forUnmarshaling->checkpointExecutionStageMask,
+                   sizeof(VkPipelineStageFlags2KHR));
 }
 
-void marshal_VkCheckpointData2NV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCheckpointData2NV* forMarshaling)
-{
+void marshal_VkCheckpointData2NV(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkCheckpointData2NV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkPipelineStageFlags2KHR*)&forMarshaling->stage, sizeof(VkPipelineStageFlags2KHR));
+    vkStream->write((VkPipelineStageFlags2KHR*)&forMarshaling->stage,
+                    sizeof(VkPipelineStageFlags2KHR));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pCheckpointMarker;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pCheckpointMarker)
-    {
+    if (forMarshaling->pCheckpointMarker) {
         vkStream->write((void*)forMarshaling->pCheckpointMarker, sizeof(uint8_t));
     }
 }
 
-void unmarshal_VkCheckpointData2NV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCheckpointData2NV* forUnmarshaling)
-{
+void unmarshal_VkCheckpointData2NV(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkCheckpointData2NV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkPipelineStageFlags2KHR*)&forUnmarshaling->stage, sizeof(VkPipelineStageFlags2KHR));
+    vkStream->read((VkPipelineStageFlags2KHR*)&forUnmarshaling->stage,
+                   sizeof(VkPipelineStageFlags2KHR));
     // WARNING PTR CHECK
     forUnmarshaling->pCheckpointMarker = (void*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pCheckpointMarker)
-    {
+    if (forUnmarshaling->pCheckpointMarker) {
         vkStream->alloc((void**)&forUnmarshaling->pCheckpointMarker, sizeof(uint8_t));
         vkStream->read((void*)forUnmarshaling->pCheckpointMarker, sizeof(uint8_t));
     }
@@ -17416,14 +16442,11 @@
 #endif
 #ifdef VK_KHR_shader_subgroup_uniform_control_flow
 void marshal_VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -17431,25 +16454,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -17459,106 +16480,100 @@
 #endif
 #ifdef VK_KHR_zero_initialize_workgroup_memory
 void marshal_VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkBool32*)&forMarshaling->shaderZeroInitializeWorkgroupMemory, sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->shaderZeroInitializeWorkgroupMemory,
+                    sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkBool32*)&forUnmarshaling->shaderZeroInitializeWorkgroupMemory, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->shaderZeroInitializeWorkgroupMemory,
+                   sizeof(VkBool32));
 }
 
 #endif
 #ifdef VK_KHR_workgroup_memory_explicit_layout
 void marshal_VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->workgroupMemoryExplicitLayout, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->workgroupMemoryExplicitLayoutScalarBlockLayout, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->workgroupMemoryExplicitLayout8BitAccess, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->workgroupMemoryExplicitLayout16BitAccess, sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->workgroupMemoryExplicitLayoutScalarBlockLayout,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->workgroupMemoryExplicitLayout8BitAccess,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->workgroupMemoryExplicitLayout16BitAccess,
+                    sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkBool32*)&forUnmarshaling->workgroupMemoryExplicitLayout, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->workgroupMemoryExplicitLayoutScalarBlockLayout, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->workgroupMemoryExplicitLayout8BitAccess, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->workgroupMemoryExplicitLayout16BitAccess, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->workgroupMemoryExplicitLayoutScalarBlockLayout,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->workgroupMemoryExplicitLayout8BitAccess,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->workgroupMemoryExplicitLayout16BitAccess,
+                   sizeof(VkBool32));
 }
 
 #endif
 #ifdef VK_KHR_copy_commands2
-void marshal_VkBufferCopy2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBufferCopy2KHR* forMarshaling)
-{
+void marshal_VkBufferCopy2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                              const VkBufferCopy2KHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -17567,26 +16582,23 @@
     vkStream->write((VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
 }
 
-void unmarshal_VkBufferCopy2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferCopy2KHR* forUnmarshaling)
-{
+void unmarshal_VkBufferCopy2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                VkBufferCopy2KHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -17595,15 +16607,11 @@
     vkStream->read((VkDeviceSize*)&forUnmarshaling->size, sizeof(VkDeviceSize));
 }
 
-void marshal_VkCopyBufferInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCopyBufferInfo2KHR* forMarshaling)
-{
+void marshal_VkCopyBufferInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkCopyBufferInfo2KHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -17614,113 +16622,104 @@
     vkStream->handleMapping()->mapHandles_VkBuffer_u64(&forMarshaling->dstBuffer, &cgen_var_1, 1);
     vkStream->write((uint64_t*)&cgen_var_1, 1 * 8);
     vkStream->write((uint32_t*)&forMarshaling->regionCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->regionCount; ++i)
-        {
-            marshal_VkBufferCopy2KHR(vkStream, rootType, (const VkBufferCopy2KHR*)(forMarshaling->pRegions + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->regionCount; ++i) {
+            marshal_VkBufferCopy2KHR(vkStream, rootType,
+                                     (const VkBufferCopy2KHR*)(forMarshaling->pRegions + i));
         }
     }
 }
 
-void unmarshal_VkCopyBufferInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCopyBufferInfo2KHR* forUnmarshaling)
-{
+void unmarshal_VkCopyBufferInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkCopyBufferInfo2KHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkBuffer(&cgen_var_0, (VkBuffer*)&forUnmarshaling->srcBuffer, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_0,
+                                                       (VkBuffer*)&forUnmarshaling->srcBuffer, 1);
     uint64_t cgen_var_1;
     vkStream->read((uint64_t*)&cgen_var_1, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_1, (VkBuffer*)&forUnmarshaling->dstBuffer, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_1,
+                                                       (VkBuffer*)&forUnmarshaling->dstBuffer, 1);
     vkStream->read((uint32_t*)&forUnmarshaling->regionCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pRegions, forUnmarshaling->regionCount * sizeof(const VkBufferCopy2KHR));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->regionCount; ++i)
-        {
-            unmarshal_VkBufferCopy2KHR(vkStream, rootType, (VkBufferCopy2KHR*)(forUnmarshaling->pRegions + i));
+    vkStream->alloc((void**)&forUnmarshaling->pRegions,
+                    forUnmarshaling->regionCount * sizeof(const VkBufferCopy2KHR));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->regionCount; ++i) {
+            unmarshal_VkBufferCopy2KHR(vkStream, rootType,
+                                       (VkBufferCopy2KHR*)(forUnmarshaling->pRegions + i));
         }
     }
 }
 
-void marshal_VkImageCopy2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageCopy2KHR* forMarshaling)
-{
+void marshal_VkImageCopy2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                             const VkImageCopy2KHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    marshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->srcSubresource));
+    marshal_VkImageSubresourceLayers(vkStream, rootType,
+                                     (VkImageSubresourceLayers*)(&forMarshaling->srcSubresource));
     marshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forMarshaling->srcOffset));
-    marshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource));
+    marshal_VkImageSubresourceLayers(vkStream, rootType,
+                                     (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource));
     marshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forMarshaling->dstOffset));
     marshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forMarshaling->extent));
 }
 
-void unmarshal_VkImageCopy2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageCopy2KHR* forUnmarshaling)
-{
+void unmarshal_VkImageCopy2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                               VkImageCopy2KHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    unmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->srcSubresource));
+    unmarshal_VkImageSubresourceLayers(
+        vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->srcSubresource));
     unmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->srcOffset));
-    unmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->dstSubresource));
+    unmarshal_VkImageSubresourceLayers(
+        vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->dstSubresource));
     unmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->dstOffset));
     unmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forUnmarshaling->extent));
 }
 
-void marshal_VkCopyImageInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCopyImageInfo2KHR* forMarshaling)
-{
+void marshal_VkCopyImageInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkCopyImageInfo2KHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -17733,117 +16732,106 @@
     vkStream->write((uint64_t*)&cgen_var_1, 1 * 8);
     vkStream->write((VkImageLayout*)&forMarshaling->dstImageLayout, sizeof(VkImageLayout));
     vkStream->write((uint32_t*)&forMarshaling->regionCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->regionCount; ++i)
-        {
-            marshal_VkImageCopy2KHR(vkStream, rootType, (const VkImageCopy2KHR*)(forMarshaling->pRegions + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->regionCount; ++i) {
+            marshal_VkImageCopy2KHR(vkStream, rootType,
+                                    (const VkImageCopy2KHR*)(forMarshaling->pRegions + i));
         }
     }
 }
 
-void unmarshal_VkCopyImageInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCopyImageInfo2KHR* forUnmarshaling)
-{
+void unmarshal_VkCopyImageInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkCopyImageInfo2KHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkImage(&cgen_var_0, (VkImage*)&forUnmarshaling->srcImage, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_0,
+                                                      (VkImage*)&forUnmarshaling->srcImage, 1);
     vkStream->read((VkImageLayout*)&forUnmarshaling->srcImageLayout, sizeof(VkImageLayout));
     uint64_t cgen_var_1;
     vkStream->read((uint64_t*)&cgen_var_1, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_1, (VkImage*)&forUnmarshaling->dstImage, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_1,
+                                                      (VkImage*)&forUnmarshaling->dstImage, 1);
     vkStream->read((VkImageLayout*)&forUnmarshaling->dstImageLayout, sizeof(VkImageLayout));
     vkStream->read((uint32_t*)&forUnmarshaling->regionCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pRegions, forUnmarshaling->regionCount * sizeof(const VkImageCopy2KHR));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->regionCount; ++i)
-        {
-            unmarshal_VkImageCopy2KHR(vkStream, rootType, (VkImageCopy2KHR*)(forUnmarshaling->pRegions + i));
+    vkStream->alloc((void**)&forUnmarshaling->pRegions,
+                    forUnmarshaling->regionCount * sizeof(const VkImageCopy2KHR));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->regionCount; ++i) {
+            unmarshal_VkImageCopy2KHR(vkStream, rootType,
+                                      (VkImageCopy2KHR*)(forUnmarshaling->pRegions + i));
         }
     }
 }
 
-void marshal_VkBufferImageCopy2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBufferImageCopy2KHR* forMarshaling)
-{
+void marshal_VkBufferImageCopy2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkBufferImageCopy2KHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkDeviceSize*)&forMarshaling->bufferOffset, sizeof(VkDeviceSize));
     vkStream->write((uint32_t*)&forMarshaling->bufferRowLength, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->bufferImageHeight, sizeof(uint32_t));
-    marshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->imageSubresource));
+    marshal_VkImageSubresourceLayers(vkStream, rootType,
+                                     (VkImageSubresourceLayers*)(&forMarshaling->imageSubresource));
     marshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forMarshaling->imageOffset));
     marshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forMarshaling->imageExtent));
 }
 
-void unmarshal_VkBufferImageCopy2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferImageCopy2KHR* forUnmarshaling)
-{
+void unmarshal_VkBufferImageCopy2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkBufferImageCopy2KHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkDeviceSize*)&forUnmarshaling->bufferOffset, sizeof(VkDeviceSize));
     vkStream->read((uint32_t*)&forUnmarshaling->bufferRowLength, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->bufferImageHeight, sizeof(uint32_t));
-    unmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->imageSubresource));
+    unmarshal_VkImageSubresourceLayers(
+        vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->imageSubresource));
     unmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->imageOffset));
     unmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forUnmarshaling->imageExtent));
 }
 
-void marshal_VkCopyBufferToImageInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCopyBufferToImageInfo2KHR* forMarshaling)
-{
+void marshal_VkCopyBufferToImageInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkCopyBufferToImageInfo2KHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -17855,65 +16843,59 @@
     vkStream->write((uint64_t*)&cgen_var_1, 1 * 8);
     vkStream->write((VkImageLayout*)&forMarshaling->dstImageLayout, sizeof(VkImageLayout));
     vkStream->write((uint32_t*)&forMarshaling->regionCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->regionCount; ++i)
-        {
-            marshal_VkBufferImageCopy2KHR(vkStream, rootType, (const VkBufferImageCopy2KHR*)(forMarshaling->pRegions + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->regionCount; ++i) {
+            marshal_VkBufferImageCopy2KHR(
+                vkStream, rootType, (const VkBufferImageCopy2KHR*)(forMarshaling->pRegions + i));
         }
     }
 }
 
-void unmarshal_VkCopyBufferToImageInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCopyBufferToImageInfo2KHR* forUnmarshaling)
-{
+void unmarshal_VkCopyBufferToImageInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkCopyBufferToImageInfo2KHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkBuffer(&cgen_var_0, (VkBuffer*)&forUnmarshaling->srcBuffer, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_0,
+                                                       (VkBuffer*)&forUnmarshaling->srcBuffer, 1);
     uint64_t cgen_var_1;
     vkStream->read((uint64_t*)&cgen_var_1, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_1, (VkImage*)&forUnmarshaling->dstImage, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_1,
+                                                      (VkImage*)&forUnmarshaling->dstImage, 1);
     vkStream->read((VkImageLayout*)&forUnmarshaling->dstImageLayout, sizeof(VkImageLayout));
     vkStream->read((uint32_t*)&forUnmarshaling->regionCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pRegions, forUnmarshaling->regionCount * sizeof(const VkBufferImageCopy2KHR));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->regionCount; ++i)
-        {
-            unmarshal_VkBufferImageCopy2KHR(vkStream, rootType, (VkBufferImageCopy2KHR*)(forUnmarshaling->pRegions + i));
+    vkStream->alloc((void**)&forUnmarshaling->pRegions,
+                    forUnmarshaling->regionCount * sizeof(const VkBufferImageCopy2KHR));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->regionCount; ++i) {
+            unmarshal_VkBufferImageCopy2KHR(
+                vkStream, rootType, (VkBufferImageCopy2KHR*)(forUnmarshaling->pRegions + i));
         }
     }
 }
 
-void marshal_VkCopyImageToBufferInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCopyImageToBufferInfo2KHR* forMarshaling)
-{
+void marshal_VkCopyImageToBufferInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkCopyImageToBufferInfo2KHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -17925,124 +16907,111 @@
     vkStream->handleMapping()->mapHandles_VkBuffer_u64(&forMarshaling->dstBuffer, &cgen_var_1, 1);
     vkStream->write((uint64_t*)&cgen_var_1, 1 * 8);
     vkStream->write((uint32_t*)&forMarshaling->regionCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->regionCount; ++i)
-        {
-            marshal_VkBufferImageCopy2KHR(vkStream, rootType, (const VkBufferImageCopy2KHR*)(forMarshaling->pRegions + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->regionCount; ++i) {
+            marshal_VkBufferImageCopy2KHR(
+                vkStream, rootType, (const VkBufferImageCopy2KHR*)(forMarshaling->pRegions + i));
         }
     }
 }
 
-void unmarshal_VkCopyImageToBufferInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCopyImageToBufferInfo2KHR* forUnmarshaling)
-{
+void unmarshal_VkCopyImageToBufferInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkCopyImageToBufferInfo2KHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkImage(&cgen_var_0, (VkImage*)&forUnmarshaling->srcImage, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_0,
+                                                      (VkImage*)&forUnmarshaling->srcImage, 1);
     vkStream->read((VkImageLayout*)&forUnmarshaling->srcImageLayout, sizeof(VkImageLayout));
     uint64_t cgen_var_1;
     vkStream->read((uint64_t*)&cgen_var_1, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_1, (VkBuffer*)&forUnmarshaling->dstBuffer, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_1,
+                                                       (VkBuffer*)&forUnmarshaling->dstBuffer, 1);
     vkStream->read((uint32_t*)&forUnmarshaling->regionCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pRegions, forUnmarshaling->regionCount * sizeof(const VkBufferImageCopy2KHR));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->regionCount; ++i)
-        {
-            unmarshal_VkBufferImageCopy2KHR(vkStream, rootType, (VkBufferImageCopy2KHR*)(forUnmarshaling->pRegions + i));
+    vkStream->alloc((void**)&forUnmarshaling->pRegions,
+                    forUnmarshaling->regionCount * sizeof(const VkBufferImageCopy2KHR));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->regionCount; ++i) {
+            unmarshal_VkBufferImageCopy2KHR(
+                vkStream, rootType, (VkBufferImageCopy2KHR*)(forUnmarshaling->pRegions + i));
         }
     }
 }
 
-void marshal_VkImageBlit2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageBlit2KHR* forMarshaling)
-{
+void marshal_VkImageBlit2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                             const VkImageBlit2KHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    marshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->srcSubresource));
-    for (uint32_t i = 0; i < (uint32_t)2; ++i)
-    {
+    marshal_VkImageSubresourceLayers(vkStream, rootType,
+                                     (VkImageSubresourceLayers*)(&forMarshaling->srcSubresource));
+    for (uint32_t i = 0; i < (uint32_t)2; ++i) {
         marshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(forMarshaling->srcOffsets + i));
     }
-    marshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource));
-    for (uint32_t i = 0; i < (uint32_t)2; ++i)
-    {
+    marshal_VkImageSubresourceLayers(vkStream, rootType,
+                                     (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource));
+    for (uint32_t i = 0; i < (uint32_t)2; ++i) {
         marshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(forMarshaling->dstOffsets + i));
     }
 }
 
-void unmarshal_VkImageBlit2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageBlit2KHR* forUnmarshaling)
-{
+void unmarshal_VkImageBlit2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                               VkImageBlit2KHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    unmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->srcSubresource));
-    for (uint32_t i = 0; i < (uint32_t)2; ++i)
-    {
+    unmarshal_VkImageSubresourceLayers(
+        vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->srcSubresource));
+    for (uint32_t i = 0; i < (uint32_t)2; ++i) {
         unmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(forUnmarshaling->srcOffsets + i));
     }
-    unmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->dstSubresource));
-    for (uint32_t i = 0; i < (uint32_t)2; ++i)
-    {
+    unmarshal_VkImageSubresourceLayers(
+        vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->dstSubresource));
+    for (uint32_t i = 0; i < (uint32_t)2; ++i) {
         unmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(forUnmarshaling->dstOffsets + i));
     }
 }
 
-void marshal_VkBlitImageInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBlitImageInfo2KHR* forMarshaling)
-{
+void marshal_VkBlitImageInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkBlitImageInfo2KHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -18055,117 +17024,108 @@
     vkStream->write((uint64_t*)&cgen_var_1, 1 * 8);
     vkStream->write((VkImageLayout*)&forMarshaling->dstImageLayout, sizeof(VkImageLayout));
     vkStream->write((uint32_t*)&forMarshaling->regionCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->regionCount; ++i)
-        {
-            marshal_VkImageBlit2KHR(vkStream, rootType, (const VkImageBlit2KHR*)(forMarshaling->pRegions + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->regionCount; ++i) {
+            marshal_VkImageBlit2KHR(vkStream, rootType,
+                                    (const VkImageBlit2KHR*)(forMarshaling->pRegions + i));
         }
     }
     vkStream->write((VkFilter*)&forMarshaling->filter, sizeof(VkFilter));
 }
 
-void unmarshal_VkBlitImageInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBlitImageInfo2KHR* forUnmarshaling)
-{
+void unmarshal_VkBlitImageInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkBlitImageInfo2KHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkImage(&cgen_var_0, (VkImage*)&forUnmarshaling->srcImage, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_0,
+                                                      (VkImage*)&forUnmarshaling->srcImage, 1);
     vkStream->read((VkImageLayout*)&forUnmarshaling->srcImageLayout, sizeof(VkImageLayout));
     uint64_t cgen_var_1;
     vkStream->read((uint64_t*)&cgen_var_1, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_1, (VkImage*)&forUnmarshaling->dstImage, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_1,
+                                                      (VkImage*)&forUnmarshaling->dstImage, 1);
     vkStream->read((VkImageLayout*)&forUnmarshaling->dstImageLayout, sizeof(VkImageLayout));
     vkStream->read((uint32_t*)&forUnmarshaling->regionCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pRegions, forUnmarshaling->regionCount * sizeof(const VkImageBlit2KHR));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->regionCount; ++i)
-        {
-            unmarshal_VkImageBlit2KHR(vkStream, rootType, (VkImageBlit2KHR*)(forUnmarshaling->pRegions + i));
+    vkStream->alloc((void**)&forUnmarshaling->pRegions,
+                    forUnmarshaling->regionCount * sizeof(const VkImageBlit2KHR));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->regionCount; ++i) {
+            unmarshal_VkImageBlit2KHR(vkStream, rootType,
+                                      (VkImageBlit2KHR*)(forUnmarshaling->pRegions + i));
         }
     }
     vkStream->read((VkFilter*)&forUnmarshaling->filter, sizeof(VkFilter));
 }
 
-void marshal_VkImageResolve2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageResolve2KHR* forMarshaling)
-{
+void marshal_VkImageResolve2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                const VkImageResolve2KHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    marshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->srcSubresource));
+    marshal_VkImageSubresourceLayers(vkStream, rootType,
+                                     (VkImageSubresourceLayers*)(&forMarshaling->srcSubresource));
     marshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forMarshaling->srcOffset));
-    marshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource));
+    marshal_VkImageSubresourceLayers(vkStream, rootType,
+                                     (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource));
     marshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forMarshaling->dstOffset));
     marshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forMarshaling->extent));
 }
 
-void unmarshal_VkImageResolve2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageResolve2KHR* forUnmarshaling)
-{
+void unmarshal_VkImageResolve2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkImageResolve2KHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    unmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->srcSubresource));
+    unmarshal_VkImageSubresourceLayers(
+        vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->srcSubresource));
     unmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->srcOffset));
-    unmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->dstSubresource));
+    unmarshal_VkImageSubresourceLayers(
+        vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->dstSubresource));
     unmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->dstOffset));
     unmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forUnmarshaling->extent));
 }
 
-void marshal_VkResolveImageInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkResolveImageInfo2KHR* forMarshaling)
-{
+void marshal_VkResolveImageInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                    const VkResolveImageInfo2KHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -18178,115 +17138,109 @@
     vkStream->write((uint64_t*)&cgen_var_1, 1 * 8);
     vkStream->write((VkImageLayout*)&forMarshaling->dstImageLayout, sizeof(VkImageLayout));
     vkStream->write((uint32_t*)&forMarshaling->regionCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->regionCount; ++i)
-        {
-            marshal_VkImageResolve2KHR(vkStream, rootType, (const VkImageResolve2KHR*)(forMarshaling->pRegions + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->regionCount; ++i) {
+            marshal_VkImageResolve2KHR(vkStream, rootType,
+                                       (const VkImageResolve2KHR*)(forMarshaling->pRegions + i));
         }
     }
 }
 
-void unmarshal_VkResolveImageInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkResolveImageInfo2KHR* forUnmarshaling)
-{
+void unmarshal_VkResolveImageInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                      VkResolveImageInfo2KHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkImage(&cgen_var_0, (VkImage*)&forUnmarshaling->srcImage, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_0,
+                                                      (VkImage*)&forUnmarshaling->srcImage, 1);
     vkStream->read((VkImageLayout*)&forUnmarshaling->srcImageLayout, sizeof(VkImageLayout));
     uint64_t cgen_var_1;
     vkStream->read((uint64_t*)&cgen_var_1, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_1, (VkImage*)&forUnmarshaling->dstImage, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_1,
+                                                      (VkImage*)&forUnmarshaling->dstImage, 1);
     vkStream->read((VkImageLayout*)&forUnmarshaling->dstImageLayout, sizeof(VkImageLayout));
     vkStream->read((uint32_t*)&forUnmarshaling->regionCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pRegions, forUnmarshaling->regionCount * sizeof(const VkImageResolve2KHR));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->regionCount; ++i)
-        {
-            unmarshal_VkImageResolve2KHR(vkStream, rootType, (VkImageResolve2KHR*)(forUnmarshaling->pRegions + i));
+    vkStream->alloc((void**)&forUnmarshaling->pRegions,
+                    forUnmarshaling->regionCount * sizeof(const VkImageResolve2KHR));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->regionCount; ++i) {
+            unmarshal_VkImageResolve2KHR(vkStream, rootType,
+                                         (VkImageResolve2KHR*)(forUnmarshaling->pRegions + i));
         }
     }
 }
 
 #endif
 #ifdef VK_KHR_format_feature_flags2
-void marshal_VkFormatProperties3KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkFormatProperties3KHR* forMarshaling)
-{
+void marshal_VkFormatProperties3KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                    const VkFormatProperties3KHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkFormatFeatureFlags2KHR*)&forMarshaling->linearTilingFeatures, sizeof(VkFormatFeatureFlags2KHR));
-    vkStream->write((VkFormatFeatureFlags2KHR*)&forMarshaling->optimalTilingFeatures, sizeof(VkFormatFeatureFlags2KHR));
-    vkStream->write((VkFormatFeatureFlags2KHR*)&forMarshaling->bufferFeatures, sizeof(VkFormatFeatureFlags2KHR));
+    vkStream->write((VkFormatFeatureFlags2KHR*)&forMarshaling->linearTilingFeatures,
+                    sizeof(VkFormatFeatureFlags2KHR));
+    vkStream->write((VkFormatFeatureFlags2KHR*)&forMarshaling->optimalTilingFeatures,
+                    sizeof(VkFormatFeatureFlags2KHR));
+    vkStream->write((VkFormatFeatureFlags2KHR*)&forMarshaling->bufferFeatures,
+                    sizeof(VkFormatFeatureFlags2KHR));
 }
 
-void unmarshal_VkFormatProperties3KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFormatProperties3KHR* forUnmarshaling)
-{
+void unmarshal_VkFormatProperties3KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                      VkFormatProperties3KHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkFormatFeatureFlags2KHR*)&forUnmarshaling->linearTilingFeatures, sizeof(VkFormatFeatureFlags2KHR));
-    vkStream->read((VkFormatFeatureFlags2KHR*)&forUnmarshaling->optimalTilingFeatures, sizeof(VkFormatFeatureFlags2KHR));
-    vkStream->read((VkFormatFeatureFlags2KHR*)&forUnmarshaling->bufferFeatures, sizeof(VkFormatFeatureFlags2KHR));
+    vkStream->read((VkFormatFeatureFlags2KHR*)&forUnmarshaling->linearTilingFeatures,
+                   sizeof(VkFormatFeatureFlags2KHR));
+    vkStream->read((VkFormatFeatureFlags2KHR*)&forUnmarshaling->optimalTilingFeatures,
+                   sizeof(VkFormatFeatureFlags2KHR));
+    vkStream->read((VkFormatFeatureFlags2KHR*)&forUnmarshaling->bufferFeatures,
+                   sizeof(VkFormatFeatureFlags2KHR));
 }
 
 #endif
 #ifdef VK_KHR_maintenance4
 void marshal_VkPhysicalDeviceMaintenance4FeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceMaintenance4FeaturesKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceMaintenance4FeaturesKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -18294,25 +17248,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceMaintenance4FeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMaintenance4FeaturesKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMaintenance4FeaturesKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -18320,14 +17272,11 @@
 }
 
 void marshal_VkPhysicalDeviceMaintenance4PropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceMaintenance4PropertiesKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceMaintenance4PropertiesKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -18335,25 +17284,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceMaintenance4PropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMaintenance4PropertiesKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMaintenance4PropertiesKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -18361,110 +17308,101 @@
 }
 
 void marshal_VkDeviceBufferMemoryRequirementsKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDeviceBufferMemoryRequirementsKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkDeviceBufferMemoryRequirementsKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    marshal_VkBufferCreateInfo(vkStream, rootType, (const VkBufferCreateInfo*)(forMarshaling->pCreateInfo));
+    marshal_VkBufferCreateInfo(vkStream, rootType,
+                               (const VkBufferCreateInfo*)(forMarshaling->pCreateInfo));
 }
 
 void unmarshal_VkDeviceBufferMemoryRequirementsKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceBufferMemoryRequirementsKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDeviceBufferMemoryRequirementsKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->alloc((void**)&forUnmarshaling->pCreateInfo, sizeof(const VkBufferCreateInfo));
-    unmarshal_VkBufferCreateInfo(vkStream, rootType, (VkBufferCreateInfo*)(forUnmarshaling->pCreateInfo));
+    unmarshal_VkBufferCreateInfo(vkStream, rootType,
+                                 (VkBufferCreateInfo*)(forUnmarshaling->pCreateInfo));
 }
 
 void marshal_VkDeviceImageMemoryRequirementsKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDeviceImageMemoryRequirementsKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkDeviceImageMemoryRequirementsKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    marshal_VkImageCreateInfo(vkStream, rootType, (const VkImageCreateInfo*)(forMarshaling->pCreateInfo));
-    vkStream->write((VkImageAspectFlagBits*)&forMarshaling->planeAspect, sizeof(VkImageAspectFlagBits));
+    marshal_VkImageCreateInfo(vkStream, rootType,
+                              (const VkImageCreateInfo*)(forMarshaling->pCreateInfo));
+    vkStream->write((VkImageAspectFlagBits*)&forMarshaling->planeAspect,
+                    sizeof(VkImageAspectFlagBits));
 }
 
 void unmarshal_VkDeviceImageMemoryRequirementsKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceImageMemoryRequirementsKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDeviceImageMemoryRequirementsKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->alloc((void**)&forUnmarshaling->pCreateInfo, sizeof(const VkImageCreateInfo));
-    unmarshal_VkImageCreateInfo(vkStream, rootType, (VkImageCreateInfo*)(forUnmarshaling->pCreateInfo));
-    vkStream->read((VkImageAspectFlagBits*)&forUnmarshaling->planeAspect, sizeof(VkImageAspectFlagBits));
+    unmarshal_VkImageCreateInfo(vkStream, rootType,
+                                (VkImageCreateInfo*)(forUnmarshaling->pCreateInfo));
+    vkStream->read((VkImageAspectFlagBits*)&forUnmarshaling->planeAspect,
+                   sizeof(VkImageAspectFlagBits));
 }
 
 #endif
 #ifdef VK_ANDROID_native_buffer
-void marshal_VkNativeBufferANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkNativeBufferANDROID* forMarshaling)
-{
+void marshal_VkNativeBufferANDROID(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkNativeBufferANDROID* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->handle;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->handle)
-    {
+    if (forMarshaling->handle) {
         vkStream->write((const uint32_t*)forMarshaling->handle, sizeof(const uint32_t));
     }
     vkStream->write((int*)&forMarshaling->stride, sizeof(int));
@@ -18474,33 +17412,29 @@
     vkStream->write((uint64_t*)&forMarshaling->producer, sizeof(uint64_t));
 }
 
-void unmarshal_VkNativeBufferANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkNativeBufferANDROID* forUnmarshaling)
-{
+void unmarshal_VkNativeBufferANDROID(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkNativeBufferANDROID* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     // WARNING PTR CHECK
     forUnmarshaling->handle = (const uint32_t*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->handle)
-    {
+    if (forUnmarshaling->handle) {
         vkStream->alloc((void**)&forUnmarshaling->handle, sizeof(const uint32_t));
         vkStream->read((uint32_t*)forUnmarshaling->handle, sizeof(const uint32_t));
     }
@@ -18514,14 +17448,11 @@
 #endif
 #ifdef VK_EXT_debug_report
 void marshal_VkDebugReportCallbackCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDebugReportCallbackCreateInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkDebugReportCallbackCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -18531,32 +17462,29 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)forMarshaling->pUserData;
     vkStream->putBe64(cgen_var_1);
-    if (forMarshaling->pUserData)
-    {
+    if (forMarshaling->pUserData) {
         vkStream->write((void*)forMarshaling->pUserData, sizeof(uint8_t));
     }
 }
 
 void unmarshal_VkDebugReportCallbackCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDebugReportCallbackCreateInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDebugReportCallbackCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -18564,8 +17492,7 @@
     forUnmarshaling->pfnCallback = (PFN_vkDebugReportCallbackEXT)vkStream->getBe64();
     // WARNING PTR CHECK
     forUnmarshaling->pUserData = (void*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pUserData)
-    {
+    if (forUnmarshaling->pUserData) {
         vkStream->alloc((void**)&forUnmarshaling->pUserData, sizeof(uint8_t));
         vkStream->read((void*)forUnmarshaling->pUserData, sizeof(uint8_t));
     }
@@ -18580,44 +17507,41 @@
 #endif
 #ifdef VK_AMD_rasterization_order
 void marshal_VkPipelineRasterizationStateRasterizationOrderAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineRasterizationStateRasterizationOrderAMD* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineRasterizationStateRasterizationOrderAMD* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkRasterizationOrderAMD*)&forMarshaling->rasterizationOrder, sizeof(VkRasterizationOrderAMD));
+    vkStream->write((VkRasterizationOrderAMD*)&forMarshaling->rasterizationOrder,
+                    sizeof(VkRasterizationOrderAMD));
 }
 
 void unmarshal_VkPipelineRasterizationStateRasterizationOrderAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineRasterizationStateRasterizationOrderAMD* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineRasterizationStateRasterizationOrderAMD* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkRasterizationOrderAMD*)&forUnmarshaling->rasterizationOrder, sizeof(VkRasterizationOrderAMD));
+    vkStream->read((VkRasterizationOrderAMD*)&forUnmarshaling->rasterizationOrder,
+                   sizeof(VkRasterizationOrderAMD));
 }
 
 #endif
@@ -18626,111 +17550,99 @@
 #ifdef VK_AMD_shader_explicit_vertex_parameter
 #endif
 #ifdef VK_EXT_debug_marker
-void marshal_VkDebugMarkerObjectNameInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDebugMarkerObjectNameInfoEXT* forMarshaling)
-{
+void marshal_VkDebugMarkerObjectNameInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                            const VkDebugMarkerObjectNameInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkDebugReportObjectTypeEXT*)&forMarshaling->objectType, sizeof(VkDebugReportObjectTypeEXT));
+    vkStream->write((VkDebugReportObjectTypeEXT*)&forMarshaling->objectType,
+                    sizeof(VkDebugReportObjectTypeEXT));
     vkStream->write((uint64_t*)&forMarshaling->object, sizeof(uint64_t));
     vkStream->putString(forMarshaling->pObjectName);
 }
 
-void unmarshal_VkDebugMarkerObjectNameInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDebugMarkerObjectNameInfoEXT* forUnmarshaling)
-{
+void unmarshal_VkDebugMarkerObjectNameInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkDebugMarkerObjectNameInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkDebugReportObjectTypeEXT*)&forUnmarshaling->objectType, sizeof(VkDebugReportObjectTypeEXT));
+    vkStream->read((VkDebugReportObjectTypeEXT*)&forUnmarshaling->objectType,
+                   sizeof(VkDebugReportObjectTypeEXT));
     vkStream->read((uint64_t*)&forUnmarshaling->object, sizeof(uint64_t));
     vkStream->loadStringInPlace((char**)&forUnmarshaling->pObjectName);
 }
 
-void marshal_VkDebugMarkerObjectTagInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDebugMarkerObjectTagInfoEXT* forMarshaling)
-{
+void marshal_VkDebugMarkerObjectTagInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkDebugMarkerObjectTagInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkDebugReportObjectTypeEXT*)&forMarshaling->objectType, sizeof(VkDebugReportObjectTypeEXT));
+    vkStream->write((VkDebugReportObjectTypeEXT*)&forMarshaling->objectType,
+                    sizeof(VkDebugReportObjectTypeEXT));
     vkStream->write((uint64_t*)&forMarshaling->object, sizeof(uint64_t));
     vkStream->write((uint64_t*)&forMarshaling->tagName, sizeof(uint64_t));
     uint64_t cgen_var_0 = (uint64_t)forMarshaling->tagSize;
     vkStream->putBe64(cgen_var_0);
-    vkStream->write((const void*)forMarshaling->pTag, forMarshaling->tagSize * sizeof(const uint8_t));
+    vkStream->write((const void*)forMarshaling->pTag,
+                    forMarshaling->tagSize * sizeof(const uint8_t));
 }
 
-void unmarshal_VkDebugMarkerObjectTagInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDebugMarkerObjectTagInfoEXT* forUnmarshaling)
-{
+void unmarshal_VkDebugMarkerObjectTagInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkDebugMarkerObjectTagInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkDebugReportObjectTypeEXT*)&forUnmarshaling->objectType, sizeof(VkDebugReportObjectTypeEXT));
+    vkStream->read((VkDebugReportObjectTypeEXT*)&forUnmarshaling->objectType,
+                   sizeof(VkDebugReportObjectTypeEXT));
     vkStream->read((uint64_t*)&forUnmarshaling->object, sizeof(uint64_t));
     vkStream->read((uint64_t*)&forUnmarshaling->tagName, sizeof(uint64_t));
     forUnmarshaling->tagSize = (size_t)vkStream->getBe64();
-    vkStream->alloc((void**)&forUnmarshaling->pTag, forUnmarshaling->tagSize * sizeof(const uint8_t));
+    vkStream->alloc((void**)&forUnmarshaling->pTag,
+                    forUnmarshaling->tagSize * sizeof(const uint8_t));
     vkStream->read((void*)forUnmarshaling->pTag, forUnmarshaling->tagSize * sizeof(const uint8_t));
 }
 
-void marshal_VkDebugMarkerMarkerInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDebugMarkerMarkerInfoEXT* forMarshaling)
-{
+void marshal_VkDebugMarkerMarkerInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                        const VkDebugMarkerMarkerInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -18738,26 +17650,23 @@
     vkStream->write((float*)forMarshaling->color, 4 * sizeof(float));
 }
 
-void unmarshal_VkDebugMarkerMarkerInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDebugMarkerMarkerInfoEXT* forUnmarshaling)
-{
+void unmarshal_VkDebugMarkerMarkerInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkDebugMarkerMarkerInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -18770,14 +17679,11 @@
 #endif
 #ifdef VK_NV_dedicated_allocation
 void marshal_VkDedicatedAllocationImageCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDedicatedAllocationImageCreateInfoNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkDedicatedAllocationImageCreateInfoNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -18785,25 +17691,23 @@
 }
 
 void unmarshal_VkDedicatedAllocationImageCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDedicatedAllocationImageCreateInfoNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDedicatedAllocationImageCreateInfoNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -18811,14 +17715,11 @@
 }
 
 void marshal_VkDedicatedAllocationBufferCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDedicatedAllocationBufferCreateInfoNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkDedicatedAllocationBufferCreateInfoNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -18826,25 +17727,23 @@
 }
 
 void unmarshal_VkDedicatedAllocationBufferCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDedicatedAllocationBufferCreateInfoNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDedicatedAllocationBufferCreateInfoNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -18852,14 +17751,11 @@
 }
 
 void marshal_VkDedicatedAllocationMemoryAllocateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDedicatedAllocationMemoryAllocateInfoNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkDedicatedAllocationMemoryAllocateInfoNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -18872,47 +17768,44 @@
 }
 
 void unmarshal_VkDedicatedAllocationMemoryAllocateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDedicatedAllocationMemoryAllocateInfoNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDedicatedAllocationMemoryAllocateInfoNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkImage(&cgen_var_0, (VkImage*)&forUnmarshaling->image, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_0,
+                                                      (VkImage*)&forUnmarshaling->image, 1);
     uint64_t cgen_var_1;
     vkStream->read((uint64_t*)&cgen_var_1, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_1, (VkBuffer*)&forUnmarshaling->buffer, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_1,
+                                                       (VkBuffer*)&forUnmarshaling->buffer, 1);
 }
 
 #endif
 #ifdef VK_EXT_transform_feedback
 void marshal_VkPhysicalDeviceTransformFeedbackFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceTransformFeedbackFeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceTransformFeedbackFeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -18921,25 +17814,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceTransformFeedbackFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceTransformFeedbackFeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceTransformFeedbackFeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -18948,163 +17839,159 @@
 }
 
 void marshal_VkPhysicalDeviceTransformFeedbackPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceTransformFeedbackPropertiesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceTransformFeedbackPropertiesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->maxTransformFeedbackStreams, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxTransformFeedbackBuffers, sizeof(uint32_t));
-    vkStream->write((VkDeviceSize*)&forMarshaling->maxTransformFeedbackBufferSize, sizeof(VkDeviceSize));
-    vkStream->write((uint32_t*)&forMarshaling->maxTransformFeedbackStreamDataSize, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxTransformFeedbackBufferDataSize, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxTransformFeedbackBufferDataStride, sizeof(uint32_t));
+    vkStream->write((VkDeviceSize*)&forMarshaling->maxTransformFeedbackBufferSize,
+                    sizeof(VkDeviceSize));
+    vkStream->write((uint32_t*)&forMarshaling->maxTransformFeedbackStreamDataSize,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxTransformFeedbackBufferDataSize,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxTransformFeedbackBufferDataStride,
+                    sizeof(uint32_t));
     vkStream->write((VkBool32*)&forMarshaling->transformFeedbackQueries, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->transformFeedbackStreamsLinesTriangles, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->transformFeedbackRasterizationStreamSelect, sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->transformFeedbackStreamsLinesTriangles,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->transformFeedbackRasterizationStreamSelect,
+                    sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->transformFeedbackDraw, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceTransformFeedbackPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceTransformFeedbackPropertiesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceTransformFeedbackPropertiesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->maxTransformFeedbackStreams, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxTransformFeedbackBuffers, sizeof(uint32_t));
-    vkStream->read((VkDeviceSize*)&forUnmarshaling->maxTransformFeedbackBufferSize, sizeof(VkDeviceSize));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxTransformFeedbackStreamDataSize, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxTransformFeedbackBufferDataSize, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxTransformFeedbackBufferDataStride, sizeof(uint32_t));
+    vkStream->read((VkDeviceSize*)&forUnmarshaling->maxTransformFeedbackBufferSize,
+                   sizeof(VkDeviceSize));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxTransformFeedbackStreamDataSize,
+                   sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxTransformFeedbackBufferDataSize,
+                   sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxTransformFeedbackBufferDataStride,
+                   sizeof(uint32_t));
     vkStream->read((VkBool32*)&forUnmarshaling->transformFeedbackQueries, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->transformFeedbackStreamsLinesTriangles, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->transformFeedbackRasterizationStreamSelect, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->transformFeedbackStreamsLinesTriangles,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->transformFeedbackRasterizationStreamSelect,
+                   sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->transformFeedbackDraw, sizeof(VkBool32));
 }
 
 void marshal_VkPipelineRasterizationStateStreamCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineRasterizationStateStreamCreateInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineRasterizationStateStreamCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkPipelineRasterizationStateStreamCreateFlagsEXT*)&forMarshaling->flags, sizeof(VkPipelineRasterizationStateStreamCreateFlagsEXT));
+    vkStream->write((VkPipelineRasterizationStateStreamCreateFlagsEXT*)&forMarshaling->flags,
+                    sizeof(VkPipelineRasterizationStateStreamCreateFlagsEXT));
     vkStream->write((uint32_t*)&forMarshaling->rasterizationStream, sizeof(uint32_t));
 }
 
 void unmarshal_VkPipelineRasterizationStateStreamCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineRasterizationStateStreamCreateInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineRasterizationStateStreamCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkPipelineRasterizationStateStreamCreateFlagsEXT*)&forUnmarshaling->flags, sizeof(VkPipelineRasterizationStateStreamCreateFlagsEXT));
+    vkStream->read((VkPipelineRasterizationStateStreamCreateFlagsEXT*)&forUnmarshaling->flags,
+                   sizeof(VkPipelineRasterizationStateStreamCreateFlagsEXT));
     vkStream->read((uint32_t*)&forUnmarshaling->rasterizationStream, sizeof(uint32_t));
 }
 
 #endif
 #ifdef VK_NVX_binary_import
-void marshal_VkCuModuleCreateInfoNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCuModuleCreateInfoNVX* forMarshaling)
-{
+void marshal_VkCuModuleCreateInfoNVX(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkCuModuleCreateInfoNVX* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     uint64_t cgen_var_0 = (uint64_t)forMarshaling->dataSize;
     vkStream->putBe64(cgen_var_0);
-    vkStream->write((const void*)forMarshaling->pData, forMarshaling->dataSize * sizeof(const uint8_t));
+    vkStream->write((const void*)forMarshaling->pData,
+                    forMarshaling->dataSize * sizeof(const uint8_t));
 }
 
-void unmarshal_VkCuModuleCreateInfoNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCuModuleCreateInfoNVX* forUnmarshaling)
-{
+void unmarshal_VkCuModuleCreateInfoNVX(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkCuModuleCreateInfoNVX* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     forUnmarshaling->dataSize = (size_t)vkStream->getBe64();
-    vkStream->alloc((void**)&forUnmarshaling->pData, forUnmarshaling->dataSize * sizeof(const uint8_t));
-    vkStream->read((void*)forUnmarshaling->pData, forUnmarshaling->dataSize * sizeof(const uint8_t));
+    vkStream->alloc((void**)&forUnmarshaling->pData,
+                    forUnmarshaling->dataSize * sizeof(const uint8_t));
+    vkStream->read((void*)forUnmarshaling->pData,
+                   forUnmarshaling->dataSize * sizeof(const uint8_t));
 }
 
-void marshal_VkCuFunctionCreateInfoNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCuFunctionCreateInfoNVX* forMarshaling)
-{
+void marshal_VkCuFunctionCreateInfoNVX(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkCuFunctionCreateInfoNVX* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -19113,26 +18000,23 @@
     vkStream->putString(forMarshaling->pName);
 }
 
-void unmarshal_VkCuFunctionCreateInfoNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCuFunctionCreateInfoNVX* forUnmarshaling)
-{
+void unmarshal_VkCuFunctionCreateInfoNVX(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkCuFunctionCreateInfoNVX* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -19140,15 +18024,11 @@
     vkStream->loadStringInPlace((char**)&forUnmarshaling->pName);
 }
 
-void marshal_VkCuLaunchInfoNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCuLaunchInfoNVX* forMarshaling)
-{
+void marshal_VkCuLaunchInfoNVX(VulkanStream* vkStream, VkStructureType rootType,
+                               const VkCuLaunchInfoNVX* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -19167,26 +18047,23 @@
     vkStream->putBe64(cgen_var_2);
 }
 
-void unmarshal_VkCuLaunchInfoNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCuLaunchInfoNVX* forUnmarshaling)
-{
+void unmarshal_VkCuLaunchInfoNVX(VulkanStream* vkStream, VkStructureType rootType,
+                                 VkCuLaunchInfoNVX* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -19204,20 +18081,17 @@
 
 #endif
 #ifdef VK_NVX_image_view_handle
-void marshal_VkImageViewHandleInfoNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageViewHandleInfoNVX* forMarshaling)
-{
+void marshal_VkImageViewHandleInfoNVX(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkImageViewHandleInfoNVX* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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_VkImageView_u64(&forMarshaling->imageView, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkImageView_u64(&forMarshaling->imageView, &cgen_var_0,
+                                                          1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->write((VkDescriptorType*)&forMarshaling->descriptorType, sizeof(VkDescriptorType));
     uint64_t cgen_var_1;
@@ -19225,47 +18099,42 @@
     vkStream->write((uint64_t*)&cgen_var_1, 1 * 8);
 }
 
-void unmarshal_VkImageViewHandleInfoNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageViewHandleInfoNVX* forUnmarshaling)
-{
+void unmarshal_VkImageViewHandleInfoNVX(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkImageViewHandleInfoNVX* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkImageView(&cgen_var_0, (VkImageView*)&forUnmarshaling->imageView, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkImageView(
+        &cgen_var_0, (VkImageView*)&forUnmarshaling->imageView, 1);
     vkStream->read((VkDescriptorType*)&forUnmarshaling->descriptorType, sizeof(VkDescriptorType));
     uint64_t cgen_var_1;
     vkStream->read((uint64_t*)&cgen_var_1, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkSampler(&cgen_var_1, (VkSampler*)&forUnmarshaling->sampler, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkSampler(&cgen_var_1,
+                                                        (VkSampler*)&forUnmarshaling->sampler, 1);
 }
 
-void marshal_VkImageViewAddressPropertiesNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageViewAddressPropertiesNVX* forMarshaling)
-{
+void marshal_VkImageViewAddressPropertiesNVX(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkImageViewAddressPropertiesNVX* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -19273,26 +18142,23 @@
     vkStream->write((VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
 }
 
-void unmarshal_VkImageViewAddressPropertiesNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageViewAddressPropertiesNVX* forUnmarshaling)
-{
+void unmarshal_VkImageViewAddressPropertiesNVX(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkImageViewAddressPropertiesNVX* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -19311,20 +18177,20 @@
 #endif
 #ifdef VK_EXT_video_encode_h264
 void marshal_VkVideoEncodeH264CapabilitiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoEncodeH264CapabilitiesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkVideoEncodeH264CapabilitiesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkVideoEncodeH264CapabilityFlagsEXT*)&forMarshaling->flags, sizeof(VkVideoEncodeH264CapabilityFlagsEXT));
-    vkStream->write((VkVideoEncodeH264InputModeFlagsEXT*)&forMarshaling->inputModeFlags, sizeof(VkVideoEncodeH264InputModeFlagsEXT));
-    vkStream->write((VkVideoEncodeH264OutputModeFlagsEXT*)&forMarshaling->outputModeFlags, sizeof(VkVideoEncodeH264OutputModeFlagsEXT));
+    vkStream->write((VkVideoEncodeH264CapabilityFlagsEXT*)&forMarshaling->flags,
+                    sizeof(VkVideoEncodeH264CapabilityFlagsEXT));
+    vkStream->write((VkVideoEncodeH264InputModeFlagsEXT*)&forMarshaling->inputModeFlags,
+                    sizeof(VkVideoEncodeH264InputModeFlagsEXT));
+    vkStream->write((VkVideoEncodeH264OutputModeFlagsEXT*)&forMarshaling->outputModeFlags,
+                    sizeof(VkVideoEncodeH264OutputModeFlagsEXT));
     marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->minPictureSizeInMbs));
     marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->maxPictureSizeInMbs));
     marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->inputImageDataAlignment));
@@ -19332,100 +18198,100 @@
     vkStream->write((uint8_t*)&forMarshaling->maxNumL0ReferenceForB, sizeof(uint8_t));
     vkStream->write((uint8_t*)&forMarshaling->maxNumL1Reference, sizeof(uint8_t));
     vkStream->write((uint8_t*)&forMarshaling->qualityLevelCount, sizeof(uint8_t));
-    marshal_VkExtensionProperties(vkStream, rootType, (VkExtensionProperties*)(&forMarshaling->stdExtensionVersion));
+    marshal_VkExtensionProperties(vkStream, rootType,
+                                  (VkExtensionProperties*)(&forMarshaling->stdExtensionVersion));
 }
 
-void unmarshal_VkVideoEncodeH264CapabilitiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH264CapabilitiesEXT* forUnmarshaling)
-{
+void unmarshal_VkVideoEncodeH264CapabilitiesEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkVideoEncodeH264CapabilitiesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkVideoEncodeH264CapabilityFlagsEXT*)&forUnmarshaling->flags, sizeof(VkVideoEncodeH264CapabilityFlagsEXT));
-    vkStream->read((VkVideoEncodeH264InputModeFlagsEXT*)&forUnmarshaling->inputModeFlags, sizeof(VkVideoEncodeH264InputModeFlagsEXT));
-    vkStream->read((VkVideoEncodeH264OutputModeFlagsEXT*)&forUnmarshaling->outputModeFlags, sizeof(VkVideoEncodeH264OutputModeFlagsEXT));
+    vkStream->read((VkVideoEncodeH264CapabilityFlagsEXT*)&forUnmarshaling->flags,
+                   sizeof(VkVideoEncodeH264CapabilityFlagsEXT));
+    vkStream->read((VkVideoEncodeH264InputModeFlagsEXT*)&forUnmarshaling->inputModeFlags,
+                   sizeof(VkVideoEncodeH264InputModeFlagsEXT));
+    vkStream->read((VkVideoEncodeH264OutputModeFlagsEXT*)&forUnmarshaling->outputModeFlags,
+                   sizeof(VkVideoEncodeH264OutputModeFlagsEXT));
     unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->minPictureSizeInMbs));
     unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->maxPictureSizeInMbs));
-    unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->inputImageDataAlignment));
+    unmarshal_VkExtent2D(vkStream, rootType,
+                         (VkExtent2D*)(&forUnmarshaling->inputImageDataAlignment));
     vkStream->read((uint8_t*)&forUnmarshaling->maxNumL0ReferenceForP, sizeof(uint8_t));
     vkStream->read((uint8_t*)&forUnmarshaling->maxNumL0ReferenceForB, sizeof(uint8_t));
     vkStream->read((uint8_t*)&forUnmarshaling->maxNumL1Reference, sizeof(uint8_t));
     vkStream->read((uint8_t*)&forUnmarshaling->qualityLevelCount, sizeof(uint8_t));
-    unmarshal_VkExtensionProperties(vkStream, rootType, (VkExtensionProperties*)(&forUnmarshaling->stdExtensionVersion));
+    unmarshal_VkExtensionProperties(
+        vkStream, rootType, (VkExtensionProperties*)(&forUnmarshaling->stdExtensionVersion));
 }
 
 void marshal_VkVideoEncodeH264SessionCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoEncodeH264SessionCreateInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkVideoEncodeH264SessionCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkVideoEncodeH264CreateFlagsEXT*)&forMarshaling->flags, sizeof(VkVideoEncodeH264CreateFlagsEXT));
+    vkStream->write((VkVideoEncodeH264CreateFlagsEXT*)&forMarshaling->flags,
+                    sizeof(VkVideoEncodeH264CreateFlagsEXT));
     marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->maxPictureSizeInMbs));
-    marshal_VkExtensionProperties(vkStream, rootType, (const VkExtensionProperties*)(forMarshaling->pStdExtensionVersion));
+    marshal_VkExtensionProperties(
+        vkStream, rootType, (const VkExtensionProperties*)(forMarshaling->pStdExtensionVersion));
 }
 
 void unmarshal_VkVideoEncodeH264SessionCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH264SessionCreateInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH264SessionCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkVideoEncodeH264CreateFlagsEXT*)&forUnmarshaling->flags, sizeof(VkVideoEncodeH264CreateFlagsEXT));
+    vkStream->read((VkVideoEncodeH264CreateFlagsEXT*)&forUnmarshaling->flags,
+                   sizeof(VkVideoEncodeH264CreateFlagsEXT));
     unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->maxPictureSizeInMbs));
-    vkStream->alloc((void**)&forUnmarshaling->pStdExtensionVersion, sizeof(const VkExtensionProperties));
-    unmarshal_VkExtensionProperties(vkStream, rootType, (VkExtensionProperties*)(forUnmarshaling->pStdExtensionVersion));
+    vkStream->alloc((void**)&forUnmarshaling->pStdExtensionVersion,
+                    sizeof(const VkExtensionProperties));
+    unmarshal_VkExtensionProperties(
+        vkStream, rootType, (VkExtensionProperties*)(forUnmarshaling->pStdExtensionVersion));
 }
 
 void marshal_VkVideoEncodeH264SessionParametersAddInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoEncodeH264SessionParametersAddInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkVideoEncodeH264SessionParametersAddInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -19433,70 +18299,74 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pSpsStd;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pSpsStd)
-    {
-        vkStream->write((const StdVideoH264SequenceParameterSet*)forMarshaling->pSpsStd, forMarshaling->spsStdCount * sizeof(const StdVideoH264SequenceParameterSet));
+    if (forMarshaling->pSpsStd) {
+        vkStream->write(
+            (const StdVideoH264SequenceParameterSet*)forMarshaling->pSpsStd,
+            forMarshaling->spsStdCount * sizeof(const StdVideoH264SequenceParameterSet));
     }
     vkStream->write((uint32_t*)&forMarshaling->ppsStdCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)forMarshaling->pPpsStd;
     vkStream->putBe64(cgen_var_1);
-    if (forMarshaling->pPpsStd)
-    {
-        vkStream->write((const StdVideoH264PictureParameterSet*)forMarshaling->pPpsStd, forMarshaling->ppsStdCount * sizeof(const StdVideoH264PictureParameterSet));
+    if (forMarshaling->pPpsStd) {
+        vkStream->write((const StdVideoH264PictureParameterSet*)forMarshaling->pPpsStd,
+                        forMarshaling->ppsStdCount * sizeof(const StdVideoH264PictureParameterSet));
     }
 }
 
 void unmarshal_VkVideoEncodeH264SessionParametersAddInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH264SessionParametersAddInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH264SessionParametersAddInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->spsStdCount, sizeof(uint32_t));
     // WARNING PTR CHECK
-    forUnmarshaling->pSpsStd = (const StdVideoH264SequenceParameterSet*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pSpsStd)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pSpsStd, forUnmarshaling->spsStdCount * sizeof(const StdVideoH264SequenceParameterSet));
-        vkStream->read((StdVideoH264SequenceParameterSet*)forUnmarshaling->pSpsStd, forUnmarshaling->spsStdCount * sizeof(const StdVideoH264SequenceParameterSet));
+    forUnmarshaling->pSpsStd =
+        (const StdVideoH264SequenceParameterSet*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pSpsStd) {
+        vkStream->alloc(
+            (void**)&forUnmarshaling->pSpsStd,
+            forUnmarshaling->spsStdCount * sizeof(const StdVideoH264SequenceParameterSet));
+        vkStream->read(
+            (StdVideoH264SequenceParameterSet*)forUnmarshaling->pSpsStd,
+            forUnmarshaling->spsStdCount * sizeof(const StdVideoH264SequenceParameterSet));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->ppsStdCount, sizeof(uint32_t));
     // WARNING PTR CHECK
-    forUnmarshaling->pPpsStd = (const StdVideoH264PictureParameterSet*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pPpsStd)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pPpsStd, forUnmarshaling->ppsStdCount * sizeof(const StdVideoH264PictureParameterSet));
-        vkStream->read((StdVideoH264PictureParameterSet*)forUnmarshaling->pPpsStd, forUnmarshaling->ppsStdCount * sizeof(const StdVideoH264PictureParameterSet));
+    forUnmarshaling->pPpsStd =
+        (const StdVideoH264PictureParameterSet*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pPpsStd) {
+        vkStream->alloc(
+            (void**)&forUnmarshaling->pPpsStd,
+            forUnmarshaling->ppsStdCount * sizeof(const StdVideoH264PictureParameterSet));
+        vkStream->read(
+            (StdVideoH264PictureParameterSet*)forUnmarshaling->pPpsStd,
+            forUnmarshaling->ppsStdCount * sizeof(const StdVideoH264PictureParameterSet));
     }
 }
 
 void marshal_VkVideoEncodeH264SessionParametersCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoEncodeH264SessionParametersCreateInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkVideoEncodeH264SessionParametersCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -19505,118 +18375,114 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pParametersAddInfo;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pParametersAddInfo)
-    {
-        marshal_VkVideoEncodeH264SessionParametersAddInfoEXT(vkStream, rootType, (const VkVideoEncodeH264SessionParametersAddInfoEXT*)(forMarshaling->pParametersAddInfo));
+    if (forMarshaling->pParametersAddInfo) {
+        marshal_VkVideoEncodeH264SessionParametersAddInfoEXT(
+            vkStream, rootType,
+            (const VkVideoEncodeH264SessionParametersAddInfoEXT*)(forMarshaling
+                                                                      ->pParametersAddInfo));
     }
 }
 
 void unmarshal_VkVideoEncodeH264SessionParametersCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH264SessionParametersCreateInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH264SessionParametersCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->maxSpsStdCount, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxPpsStdCount, sizeof(uint32_t));
     // WARNING PTR CHECK
-    forUnmarshaling->pParametersAddInfo = (const VkVideoEncodeH264SessionParametersAddInfoEXT*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pParametersAddInfo)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pParametersAddInfo, sizeof(const VkVideoEncodeH264SessionParametersAddInfoEXT));
-        unmarshal_VkVideoEncodeH264SessionParametersAddInfoEXT(vkStream, rootType, (VkVideoEncodeH264SessionParametersAddInfoEXT*)(forUnmarshaling->pParametersAddInfo));
+    forUnmarshaling->pParametersAddInfo =
+        (const VkVideoEncodeH264SessionParametersAddInfoEXT*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pParametersAddInfo) {
+        vkStream->alloc((void**)&forUnmarshaling->pParametersAddInfo,
+                        sizeof(const VkVideoEncodeH264SessionParametersAddInfoEXT));
+        unmarshal_VkVideoEncodeH264SessionParametersAddInfoEXT(
+            vkStream, rootType,
+            (VkVideoEncodeH264SessionParametersAddInfoEXT*)(forUnmarshaling->pParametersAddInfo));
     }
 }
 
-void marshal_VkVideoEncodeH264DpbSlotInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoEncodeH264DpbSlotInfoEXT* forMarshaling)
-{
+void marshal_VkVideoEncodeH264DpbSlotInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkVideoEncodeH264DpbSlotInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((int8_t*)&forMarshaling->slotIndex, sizeof(int8_t));
-    vkStream->write((const StdVideoEncodeH264PictureInfo*)forMarshaling->pStdPictureInfo, sizeof(const StdVideoEncodeH264PictureInfo));
+    vkStream->write((const StdVideoEncodeH264PictureInfo*)forMarshaling->pStdPictureInfo,
+                    sizeof(const StdVideoEncodeH264PictureInfo));
 }
 
-void unmarshal_VkVideoEncodeH264DpbSlotInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH264DpbSlotInfoEXT* forUnmarshaling)
-{
+void unmarshal_VkVideoEncodeH264DpbSlotInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkVideoEncodeH264DpbSlotInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((int8_t*)&forUnmarshaling->slotIndex, sizeof(int8_t));
-    vkStream->alloc((void**)&forUnmarshaling->pStdPictureInfo, sizeof(const StdVideoEncodeH264PictureInfo));
-    vkStream->read((StdVideoEncodeH264PictureInfo*)forUnmarshaling->pStdPictureInfo, sizeof(const StdVideoEncodeH264PictureInfo));
+    vkStream->alloc((void**)&forUnmarshaling->pStdPictureInfo,
+                    sizeof(const StdVideoEncodeH264PictureInfo));
+    vkStream->read((StdVideoEncodeH264PictureInfo*)forUnmarshaling->pStdPictureInfo,
+                   sizeof(const StdVideoEncodeH264PictureInfo));
 }
 
-void marshal_VkVideoEncodeH264NaluSliceEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoEncodeH264NaluSliceEXT* forMarshaling)
-{
+void marshal_VkVideoEncodeH264NaluSliceEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkVideoEncodeH264NaluSliceEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((const StdVideoEncodeH264SliceHeader*)forMarshaling->pSliceHeaderStd, sizeof(const StdVideoEncodeH264SliceHeader));
+    vkStream->write((const StdVideoEncodeH264SliceHeader*)forMarshaling->pSliceHeaderStd,
+                    sizeof(const StdVideoEncodeH264SliceHeader));
     vkStream->write((uint32_t*)&forMarshaling->mbCount, sizeof(uint32_t));
     vkStream->write((uint8_t*)&forMarshaling->refFinalList0EntryCount, sizeof(uint8_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->refFinalList0EntryCount; ++i)
-        {
-            marshal_VkVideoEncodeH264DpbSlotInfoEXT(vkStream, rootType, (const VkVideoEncodeH264DpbSlotInfoEXT*)(forMarshaling->pRefFinalList0Entries + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->refFinalList0EntryCount; ++i) {
+            marshal_VkVideoEncodeH264DpbSlotInfoEXT(
+                vkStream, rootType,
+                (const VkVideoEncodeH264DpbSlotInfoEXT*)(forMarshaling->pRefFinalList0Entries + i));
         }
     }
     vkStream->write((uint8_t*)&forMarshaling->refFinalList1EntryCount, sizeof(uint8_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->refFinalList1EntryCount; ++i)
-        {
-            marshal_VkVideoEncodeH264DpbSlotInfoEXT(vkStream, rootType, (const VkVideoEncodeH264DpbSlotInfoEXT*)(forMarshaling->pRefFinalList1Entries + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->refFinalList1EntryCount; ++i) {
+            marshal_VkVideoEncodeH264DpbSlotInfoEXT(
+                vkStream, rootType,
+                (const VkVideoEncodeH264DpbSlotInfoEXT*)(forMarshaling->pRefFinalList1Entries + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->precedingNaluBytes, sizeof(uint32_t));
@@ -19624,48 +18490,51 @@
     vkStream->write((uint8_t*)&forMarshaling->maxQp, sizeof(uint8_t));
 }
 
-void unmarshal_VkVideoEncodeH264NaluSliceEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH264NaluSliceEXT* forUnmarshaling)
-{
+void unmarshal_VkVideoEncodeH264NaluSliceEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkVideoEncodeH264NaluSliceEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->alloc((void**)&forUnmarshaling->pSliceHeaderStd, sizeof(const StdVideoEncodeH264SliceHeader));
-    vkStream->read((StdVideoEncodeH264SliceHeader*)forUnmarshaling->pSliceHeaderStd, sizeof(const StdVideoEncodeH264SliceHeader));
+    vkStream->alloc((void**)&forUnmarshaling->pSliceHeaderStd,
+                    sizeof(const StdVideoEncodeH264SliceHeader));
+    vkStream->read((StdVideoEncodeH264SliceHeader*)forUnmarshaling->pSliceHeaderStd,
+                   sizeof(const StdVideoEncodeH264SliceHeader));
     vkStream->read((uint32_t*)&forUnmarshaling->mbCount, sizeof(uint32_t));
     vkStream->read((uint8_t*)&forUnmarshaling->refFinalList0EntryCount, sizeof(uint8_t));
-    vkStream->alloc((void**)&forUnmarshaling->pRefFinalList0Entries, forUnmarshaling->refFinalList0EntryCount * sizeof(const VkVideoEncodeH264DpbSlotInfoEXT));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->refFinalList0EntryCount; ++i)
-        {
-            unmarshal_VkVideoEncodeH264DpbSlotInfoEXT(vkStream, rootType, (VkVideoEncodeH264DpbSlotInfoEXT*)(forUnmarshaling->pRefFinalList0Entries + i));
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pRefFinalList0Entries,
+        forUnmarshaling->refFinalList0EntryCount * sizeof(const VkVideoEncodeH264DpbSlotInfoEXT));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->refFinalList0EntryCount; ++i) {
+            unmarshal_VkVideoEncodeH264DpbSlotInfoEXT(
+                vkStream, rootType,
+                (VkVideoEncodeH264DpbSlotInfoEXT*)(forUnmarshaling->pRefFinalList0Entries + i));
         }
     }
     vkStream->read((uint8_t*)&forUnmarshaling->refFinalList1EntryCount, sizeof(uint8_t));
-    vkStream->alloc((void**)&forUnmarshaling->pRefFinalList1Entries, forUnmarshaling->refFinalList1EntryCount * sizeof(const VkVideoEncodeH264DpbSlotInfoEXT));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->refFinalList1EntryCount; ++i)
-        {
-            unmarshal_VkVideoEncodeH264DpbSlotInfoEXT(vkStream, rootType, (VkVideoEncodeH264DpbSlotInfoEXT*)(forUnmarshaling->pRefFinalList1Entries + i));
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pRefFinalList1Entries,
+        forUnmarshaling->refFinalList1EntryCount * sizeof(const VkVideoEncodeH264DpbSlotInfoEXT));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->refFinalList1EntryCount; ++i) {
+            unmarshal_VkVideoEncodeH264DpbSlotInfoEXT(
+                vkStream, rootType,
+                (VkVideoEncodeH264DpbSlotInfoEXT*)(forUnmarshaling->pRefFinalList1Entries + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->precedingNaluBytes, sizeof(uint32_t));
@@ -19674,303 +18543,309 @@
 }
 
 void marshal_VkVideoEncodeH264VclFrameInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoEncodeH264VclFrameInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkVideoEncodeH264VclFrameInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint8_t*)&forMarshaling->refDefaultFinalList0EntryCount, sizeof(uint8_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->refDefaultFinalList0EntryCount; ++i)
-        {
-            marshal_VkVideoEncodeH264DpbSlotInfoEXT(vkStream, rootType, (const VkVideoEncodeH264DpbSlotInfoEXT*)(forMarshaling->pRefDefaultFinalList0Entries + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->refDefaultFinalList0EntryCount; ++i) {
+            marshal_VkVideoEncodeH264DpbSlotInfoEXT(
+                vkStream, rootType,
+                (const VkVideoEncodeH264DpbSlotInfoEXT*)(forMarshaling
+                                                             ->pRefDefaultFinalList0Entries +
+                                                         i));
         }
     }
     vkStream->write((uint8_t*)&forMarshaling->refDefaultFinalList1EntryCount, sizeof(uint8_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->refDefaultFinalList1EntryCount; ++i)
-        {
-            marshal_VkVideoEncodeH264DpbSlotInfoEXT(vkStream, rootType, (const VkVideoEncodeH264DpbSlotInfoEXT*)(forMarshaling->pRefDefaultFinalList1Entries + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->refDefaultFinalList1EntryCount; ++i) {
+            marshal_VkVideoEncodeH264DpbSlotInfoEXT(
+                vkStream, rootType,
+                (const VkVideoEncodeH264DpbSlotInfoEXT*)(forMarshaling
+                                                             ->pRefDefaultFinalList1Entries +
+                                                         i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->naluSliceEntryCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->naluSliceEntryCount; ++i)
-        {
-            marshal_VkVideoEncodeH264NaluSliceEXT(vkStream, rootType, (const VkVideoEncodeH264NaluSliceEXT*)(forMarshaling->pNaluSliceEntries + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->naluSliceEntryCount; ++i) {
+            marshal_VkVideoEncodeH264NaluSliceEXT(
+                vkStream, rootType,
+                (const VkVideoEncodeH264NaluSliceEXT*)(forMarshaling->pNaluSliceEntries + i));
         }
     }
-    marshal_VkVideoEncodeH264DpbSlotInfoEXT(vkStream, rootType, (const VkVideoEncodeH264DpbSlotInfoEXT*)(forMarshaling->pCurrentPictureInfo));
+    marshal_VkVideoEncodeH264DpbSlotInfoEXT(
+        vkStream, rootType,
+        (const VkVideoEncodeH264DpbSlotInfoEXT*)(forMarshaling->pCurrentPictureInfo));
 }
 
-void unmarshal_VkVideoEncodeH264VclFrameInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH264VclFrameInfoEXT* forUnmarshaling)
-{
+void unmarshal_VkVideoEncodeH264VclFrameInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkVideoEncodeH264VclFrameInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint8_t*)&forUnmarshaling->refDefaultFinalList0EntryCount, sizeof(uint8_t));
-    vkStream->alloc((void**)&forUnmarshaling->pRefDefaultFinalList0Entries, forUnmarshaling->refDefaultFinalList0EntryCount * sizeof(const VkVideoEncodeH264DpbSlotInfoEXT));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->refDefaultFinalList0EntryCount; ++i)
-        {
-            unmarshal_VkVideoEncodeH264DpbSlotInfoEXT(vkStream, rootType, (VkVideoEncodeH264DpbSlotInfoEXT*)(forUnmarshaling->pRefDefaultFinalList0Entries + i));
+    vkStream->alloc((void**)&forUnmarshaling->pRefDefaultFinalList0Entries,
+                    forUnmarshaling->refDefaultFinalList0EntryCount *
+                        sizeof(const VkVideoEncodeH264DpbSlotInfoEXT));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->refDefaultFinalList0EntryCount; ++i) {
+            unmarshal_VkVideoEncodeH264DpbSlotInfoEXT(
+                vkStream, rootType,
+                (VkVideoEncodeH264DpbSlotInfoEXT*)(forUnmarshaling->pRefDefaultFinalList0Entries +
+                                                   i));
         }
     }
     vkStream->read((uint8_t*)&forUnmarshaling->refDefaultFinalList1EntryCount, sizeof(uint8_t));
-    vkStream->alloc((void**)&forUnmarshaling->pRefDefaultFinalList1Entries, forUnmarshaling->refDefaultFinalList1EntryCount * sizeof(const VkVideoEncodeH264DpbSlotInfoEXT));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->refDefaultFinalList1EntryCount; ++i)
-        {
-            unmarshal_VkVideoEncodeH264DpbSlotInfoEXT(vkStream, rootType, (VkVideoEncodeH264DpbSlotInfoEXT*)(forUnmarshaling->pRefDefaultFinalList1Entries + i));
+    vkStream->alloc((void**)&forUnmarshaling->pRefDefaultFinalList1Entries,
+                    forUnmarshaling->refDefaultFinalList1EntryCount *
+                        sizeof(const VkVideoEncodeH264DpbSlotInfoEXT));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->refDefaultFinalList1EntryCount; ++i) {
+            unmarshal_VkVideoEncodeH264DpbSlotInfoEXT(
+                vkStream, rootType,
+                (VkVideoEncodeH264DpbSlotInfoEXT*)(forUnmarshaling->pRefDefaultFinalList1Entries +
+                                                   i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->naluSliceEntryCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pNaluSliceEntries, forUnmarshaling->naluSliceEntryCount * sizeof(const VkVideoEncodeH264NaluSliceEXT));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->naluSliceEntryCount; ++i)
-        {
-            unmarshal_VkVideoEncodeH264NaluSliceEXT(vkStream, rootType, (VkVideoEncodeH264NaluSliceEXT*)(forUnmarshaling->pNaluSliceEntries + i));
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pNaluSliceEntries,
+        forUnmarshaling->naluSliceEntryCount * sizeof(const VkVideoEncodeH264NaluSliceEXT));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->naluSliceEntryCount; ++i) {
+            unmarshal_VkVideoEncodeH264NaluSliceEXT(
+                vkStream, rootType,
+                (VkVideoEncodeH264NaluSliceEXT*)(forUnmarshaling->pNaluSliceEntries + i));
         }
     }
-    vkStream->alloc((void**)&forUnmarshaling->pCurrentPictureInfo, sizeof(const VkVideoEncodeH264DpbSlotInfoEXT));
-    unmarshal_VkVideoEncodeH264DpbSlotInfoEXT(vkStream, rootType, (VkVideoEncodeH264DpbSlotInfoEXT*)(forUnmarshaling->pCurrentPictureInfo));
+    vkStream->alloc((void**)&forUnmarshaling->pCurrentPictureInfo,
+                    sizeof(const VkVideoEncodeH264DpbSlotInfoEXT));
+    unmarshal_VkVideoEncodeH264DpbSlotInfoEXT(
+        vkStream, rootType,
+        (VkVideoEncodeH264DpbSlotInfoEXT*)(forUnmarshaling->pCurrentPictureInfo));
 }
 
 void marshal_VkVideoEncodeH264EmitPictureParametersEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoEncodeH264EmitPictureParametersEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkVideoEncodeH264EmitPictureParametersEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint8_t*)&forMarshaling->spsId, sizeof(uint8_t));
     vkStream->write((VkBool32*)&forMarshaling->emitSpsEnable, sizeof(VkBool32));
     vkStream->write((uint32_t*)&forMarshaling->ppsIdEntryCount, sizeof(uint32_t));
-    vkStream->write((const uint8_t*)forMarshaling->ppsIdEntries, forMarshaling->ppsIdEntryCount * sizeof(const uint8_t));
+    vkStream->write((const uint8_t*)forMarshaling->ppsIdEntries,
+                    forMarshaling->ppsIdEntryCount * sizeof(const uint8_t));
 }
 
 void unmarshal_VkVideoEncodeH264EmitPictureParametersEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH264EmitPictureParametersEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH264EmitPictureParametersEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint8_t*)&forUnmarshaling->spsId, sizeof(uint8_t));
     vkStream->read((VkBool32*)&forUnmarshaling->emitSpsEnable, sizeof(VkBool32));
     vkStream->read((uint32_t*)&forUnmarshaling->ppsIdEntryCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->ppsIdEntries, forUnmarshaling->ppsIdEntryCount * sizeof(const uint8_t));
-    vkStream->read((uint8_t*)forUnmarshaling->ppsIdEntries, forUnmarshaling->ppsIdEntryCount * sizeof(const uint8_t));
+    vkStream->alloc((void**)&forUnmarshaling->ppsIdEntries,
+                    forUnmarshaling->ppsIdEntryCount * sizeof(const uint8_t));
+    vkStream->read((uint8_t*)forUnmarshaling->ppsIdEntries,
+                   forUnmarshaling->ppsIdEntryCount * sizeof(const uint8_t));
 }
 
-void marshal_VkVideoEncodeH264ProfileEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoEncodeH264ProfileEXT* forMarshaling)
-{
+void marshal_VkVideoEncodeH264ProfileEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkVideoEncodeH264ProfileEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((StdVideoH264ProfileIdc*)&forMarshaling->stdProfileIdc, sizeof(StdVideoH264ProfileIdc));
+    vkStream->write((StdVideoH264ProfileIdc*)&forMarshaling->stdProfileIdc,
+                    sizeof(StdVideoH264ProfileIdc));
 }
 
-void unmarshal_VkVideoEncodeH264ProfileEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH264ProfileEXT* forUnmarshaling)
-{
+void unmarshal_VkVideoEncodeH264ProfileEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkVideoEncodeH264ProfileEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((StdVideoH264ProfileIdc*)&forUnmarshaling->stdProfileIdc, sizeof(StdVideoH264ProfileIdc));
+    vkStream->read((StdVideoH264ProfileIdc*)&forUnmarshaling->stdProfileIdc,
+                   sizeof(StdVideoH264ProfileIdc));
 }
 
 #endif
 #ifdef VK_EXT_video_encode_h265
 void marshal_VkVideoEncodeH265CapabilitiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoEncodeH265CapabilitiesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkVideoEncodeH265CapabilitiesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkVideoEncodeH265CapabilityFlagsEXT*)&forMarshaling->flags, sizeof(VkVideoEncodeH265CapabilityFlagsEXT));
-    vkStream->write((VkVideoEncodeH265InputModeFlagsEXT*)&forMarshaling->inputModeFlags, sizeof(VkVideoEncodeH265InputModeFlagsEXT));
-    vkStream->write((VkVideoEncodeH265OutputModeFlagsEXT*)&forMarshaling->outputModeFlags, sizeof(VkVideoEncodeH265OutputModeFlagsEXT));
-    vkStream->write((VkVideoEncodeH265CtbSizeFlagsEXT*)&forMarshaling->ctbSizes, sizeof(VkVideoEncodeH265CtbSizeFlagsEXT));
+    vkStream->write((VkVideoEncodeH265CapabilityFlagsEXT*)&forMarshaling->flags,
+                    sizeof(VkVideoEncodeH265CapabilityFlagsEXT));
+    vkStream->write((VkVideoEncodeH265InputModeFlagsEXT*)&forMarshaling->inputModeFlags,
+                    sizeof(VkVideoEncodeH265InputModeFlagsEXT));
+    vkStream->write((VkVideoEncodeH265OutputModeFlagsEXT*)&forMarshaling->outputModeFlags,
+                    sizeof(VkVideoEncodeH265OutputModeFlagsEXT));
+    vkStream->write((VkVideoEncodeH265CtbSizeFlagsEXT*)&forMarshaling->ctbSizes,
+                    sizeof(VkVideoEncodeH265CtbSizeFlagsEXT));
     marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->inputImageDataAlignment));
     vkStream->write((uint8_t*)&forMarshaling->maxNumL0ReferenceForP, sizeof(uint8_t));
     vkStream->write((uint8_t*)&forMarshaling->maxNumL0ReferenceForB, sizeof(uint8_t));
     vkStream->write((uint8_t*)&forMarshaling->maxNumL1Reference, sizeof(uint8_t));
     vkStream->write((uint8_t*)&forMarshaling->maxNumSubLayers, sizeof(uint8_t));
     vkStream->write((uint8_t*)&forMarshaling->qualityLevelCount, sizeof(uint8_t));
-    marshal_VkExtensionProperties(vkStream, rootType, (VkExtensionProperties*)(&forMarshaling->stdExtensionVersion));
+    marshal_VkExtensionProperties(vkStream, rootType,
+                                  (VkExtensionProperties*)(&forMarshaling->stdExtensionVersion));
 }
 
-void unmarshal_VkVideoEncodeH265CapabilitiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH265CapabilitiesEXT* forUnmarshaling)
-{
+void unmarshal_VkVideoEncodeH265CapabilitiesEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkVideoEncodeH265CapabilitiesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkVideoEncodeH265CapabilityFlagsEXT*)&forUnmarshaling->flags, sizeof(VkVideoEncodeH265CapabilityFlagsEXT));
-    vkStream->read((VkVideoEncodeH265InputModeFlagsEXT*)&forUnmarshaling->inputModeFlags, sizeof(VkVideoEncodeH265InputModeFlagsEXT));
-    vkStream->read((VkVideoEncodeH265OutputModeFlagsEXT*)&forUnmarshaling->outputModeFlags, sizeof(VkVideoEncodeH265OutputModeFlagsEXT));
-    vkStream->read((VkVideoEncodeH265CtbSizeFlagsEXT*)&forUnmarshaling->ctbSizes, sizeof(VkVideoEncodeH265CtbSizeFlagsEXT));
-    unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->inputImageDataAlignment));
+    vkStream->read((VkVideoEncodeH265CapabilityFlagsEXT*)&forUnmarshaling->flags,
+                   sizeof(VkVideoEncodeH265CapabilityFlagsEXT));
+    vkStream->read((VkVideoEncodeH265InputModeFlagsEXT*)&forUnmarshaling->inputModeFlags,
+                   sizeof(VkVideoEncodeH265InputModeFlagsEXT));
+    vkStream->read((VkVideoEncodeH265OutputModeFlagsEXT*)&forUnmarshaling->outputModeFlags,
+                   sizeof(VkVideoEncodeH265OutputModeFlagsEXT));
+    vkStream->read((VkVideoEncodeH265CtbSizeFlagsEXT*)&forUnmarshaling->ctbSizes,
+                   sizeof(VkVideoEncodeH265CtbSizeFlagsEXT));
+    unmarshal_VkExtent2D(vkStream, rootType,
+                         (VkExtent2D*)(&forUnmarshaling->inputImageDataAlignment));
     vkStream->read((uint8_t*)&forUnmarshaling->maxNumL0ReferenceForP, sizeof(uint8_t));
     vkStream->read((uint8_t*)&forUnmarshaling->maxNumL0ReferenceForB, sizeof(uint8_t));
     vkStream->read((uint8_t*)&forUnmarshaling->maxNumL1Reference, sizeof(uint8_t));
     vkStream->read((uint8_t*)&forUnmarshaling->maxNumSubLayers, sizeof(uint8_t));
     vkStream->read((uint8_t*)&forUnmarshaling->qualityLevelCount, sizeof(uint8_t));
-    unmarshal_VkExtensionProperties(vkStream, rootType, (VkExtensionProperties*)(&forUnmarshaling->stdExtensionVersion));
+    unmarshal_VkExtensionProperties(
+        vkStream, rootType, (VkExtensionProperties*)(&forUnmarshaling->stdExtensionVersion));
 }
 
 void marshal_VkVideoEncodeH265SessionCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoEncodeH265SessionCreateInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkVideoEncodeH265SessionCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkVideoEncodeH265CreateFlagsEXT*)&forMarshaling->flags, sizeof(VkVideoEncodeH265CreateFlagsEXT));
-    marshal_VkExtensionProperties(vkStream, rootType, (const VkExtensionProperties*)(forMarshaling->pStdExtensionVersion));
+    vkStream->write((VkVideoEncodeH265CreateFlagsEXT*)&forMarshaling->flags,
+                    sizeof(VkVideoEncodeH265CreateFlagsEXT));
+    marshal_VkExtensionProperties(
+        vkStream, rootType, (const VkExtensionProperties*)(forMarshaling->pStdExtensionVersion));
 }
 
 void unmarshal_VkVideoEncodeH265SessionCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH265SessionCreateInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH265SessionCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkVideoEncodeH265CreateFlagsEXT*)&forUnmarshaling->flags, sizeof(VkVideoEncodeH265CreateFlagsEXT));
-    vkStream->alloc((void**)&forUnmarshaling->pStdExtensionVersion, sizeof(const VkExtensionProperties));
-    unmarshal_VkExtensionProperties(vkStream, rootType, (VkExtensionProperties*)(forUnmarshaling->pStdExtensionVersion));
+    vkStream->read((VkVideoEncodeH265CreateFlagsEXT*)&forUnmarshaling->flags,
+                   sizeof(VkVideoEncodeH265CreateFlagsEXT));
+    vkStream->alloc((void**)&forUnmarshaling->pStdExtensionVersion,
+                    sizeof(const VkExtensionProperties));
+    unmarshal_VkExtensionProperties(
+        vkStream, rootType, (VkExtensionProperties*)(forUnmarshaling->pStdExtensionVersion));
 }
 
 void marshal_VkVideoEncodeH265SessionParametersAddInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoEncodeH265SessionParametersAddInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkVideoEncodeH265SessionParametersAddInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -19978,86 +18853,91 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pVpsStd;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pVpsStd)
-    {
-        vkStream->write((const StdVideoH265VideoParameterSet*)forMarshaling->pVpsStd, forMarshaling->vpsStdCount * sizeof(const StdVideoH265VideoParameterSet));
+    if (forMarshaling->pVpsStd) {
+        vkStream->write((const StdVideoH265VideoParameterSet*)forMarshaling->pVpsStd,
+                        forMarshaling->vpsStdCount * sizeof(const StdVideoH265VideoParameterSet));
     }
     vkStream->write((uint32_t*)&forMarshaling->spsStdCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)forMarshaling->pSpsStd;
     vkStream->putBe64(cgen_var_1);
-    if (forMarshaling->pSpsStd)
-    {
-        vkStream->write((const StdVideoH265SequenceParameterSet*)forMarshaling->pSpsStd, forMarshaling->spsStdCount * sizeof(const StdVideoH265SequenceParameterSet));
+    if (forMarshaling->pSpsStd) {
+        vkStream->write(
+            (const StdVideoH265SequenceParameterSet*)forMarshaling->pSpsStd,
+            forMarshaling->spsStdCount * sizeof(const StdVideoH265SequenceParameterSet));
     }
     vkStream->write((uint32_t*)&forMarshaling->ppsStdCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)forMarshaling->pPpsStd;
     vkStream->putBe64(cgen_var_2);
-    if (forMarshaling->pPpsStd)
-    {
-        vkStream->write((const StdVideoH265PictureParameterSet*)forMarshaling->pPpsStd, forMarshaling->ppsStdCount * sizeof(const StdVideoH265PictureParameterSet));
+    if (forMarshaling->pPpsStd) {
+        vkStream->write((const StdVideoH265PictureParameterSet*)forMarshaling->pPpsStd,
+                        forMarshaling->ppsStdCount * sizeof(const StdVideoH265PictureParameterSet));
     }
 }
 
 void unmarshal_VkVideoEncodeH265SessionParametersAddInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH265SessionParametersAddInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH265SessionParametersAddInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->vpsStdCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     forUnmarshaling->pVpsStd = (const StdVideoH265VideoParameterSet*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pVpsStd)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pVpsStd, forUnmarshaling->vpsStdCount * sizeof(const StdVideoH265VideoParameterSet));
-        vkStream->read((StdVideoH265VideoParameterSet*)forUnmarshaling->pVpsStd, forUnmarshaling->vpsStdCount * sizeof(const StdVideoH265VideoParameterSet));
+    if (forUnmarshaling->pVpsStd) {
+        vkStream->alloc((void**)&forUnmarshaling->pVpsStd,
+                        forUnmarshaling->vpsStdCount * sizeof(const StdVideoH265VideoParameterSet));
+        vkStream->read((StdVideoH265VideoParameterSet*)forUnmarshaling->pVpsStd,
+                       forUnmarshaling->vpsStdCount * sizeof(const StdVideoH265VideoParameterSet));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->spsStdCount, sizeof(uint32_t));
     // WARNING PTR CHECK
-    forUnmarshaling->pSpsStd = (const StdVideoH265SequenceParameterSet*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pSpsStd)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pSpsStd, forUnmarshaling->spsStdCount * sizeof(const StdVideoH265SequenceParameterSet));
-        vkStream->read((StdVideoH265SequenceParameterSet*)forUnmarshaling->pSpsStd, forUnmarshaling->spsStdCount * sizeof(const StdVideoH265SequenceParameterSet));
+    forUnmarshaling->pSpsStd =
+        (const StdVideoH265SequenceParameterSet*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pSpsStd) {
+        vkStream->alloc(
+            (void**)&forUnmarshaling->pSpsStd,
+            forUnmarshaling->spsStdCount * sizeof(const StdVideoH265SequenceParameterSet));
+        vkStream->read(
+            (StdVideoH265SequenceParameterSet*)forUnmarshaling->pSpsStd,
+            forUnmarshaling->spsStdCount * sizeof(const StdVideoH265SequenceParameterSet));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->ppsStdCount, sizeof(uint32_t));
     // WARNING PTR CHECK
-    forUnmarshaling->pPpsStd = (const StdVideoH265PictureParameterSet*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pPpsStd)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pPpsStd, forUnmarshaling->ppsStdCount * sizeof(const StdVideoH265PictureParameterSet));
-        vkStream->read((StdVideoH265PictureParameterSet*)forUnmarshaling->pPpsStd, forUnmarshaling->ppsStdCount * sizeof(const StdVideoH265PictureParameterSet));
+    forUnmarshaling->pPpsStd =
+        (const StdVideoH265PictureParameterSet*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pPpsStd) {
+        vkStream->alloc(
+            (void**)&forUnmarshaling->pPpsStd,
+            forUnmarshaling->ppsStdCount * sizeof(const StdVideoH265PictureParameterSet));
+        vkStream->read(
+            (StdVideoH265PictureParameterSet*)forUnmarshaling->pPpsStd,
+            forUnmarshaling->ppsStdCount * sizeof(const StdVideoH265PictureParameterSet));
     }
 }
 
 void marshal_VkVideoEncodeH265SessionParametersCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoEncodeH265SessionParametersCreateInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkVideoEncodeH265SessionParametersCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -20067,32 +18947,32 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pParametersAddInfo;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pParametersAddInfo)
-    {
-        marshal_VkVideoEncodeH265SessionParametersAddInfoEXT(vkStream, rootType, (const VkVideoEncodeH265SessionParametersAddInfoEXT*)(forMarshaling->pParametersAddInfo));
+    if (forMarshaling->pParametersAddInfo) {
+        marshal_VkVideoEncodeH265SessionParametersAddInfoEXT(
+            vkStream, rootType,
+            (const VkVideoEncodeH265SessionParametersAddInfoEXT*)(forMarshaling
+                                                                      ->pParametersAddInfo));
     }
 }
 
 void unmarshal_VkVideoEncodeH265SessionParametersCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH265SessionParametersCreateInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH265SessionParametersCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -20100,143 +18980,144 @@
     vkStream->read((uint32_t*)&forUnmarshaling->maxSpsStdCount, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxPpsStdCount, sizeof(uint32_t));
     // WARNING PTR CHECK
-    forUnmarshaling->pParametersAddInfo = (const VkVideoEncodeH265SessionParametersAddInfoEXT*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pParametersAddInfo)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pParametersAddInfo, sizeof(const VkVideoEncodeH265SessionParametersAddInfoEXT));
-        unmarshal_VkVideoEncodeH265SessionParametersAddInfoEXT(vkStream, rootType, (VkVideoEncodeH265SessionParametersAddInfoEXT*)(forUnmarshaling->pParametersAddInfo));
+    forUnmarshaling->pParametersAddInfo =
+        (const VkVideoEncodeH265SessionParametersAddInfoEXT*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pParametersAddInfo) {
+        vkStream->alloc((void**)&forUnmarshaling->pParametersAddInfo,
+                        sizeof(const VkVideoEncodeH265SessionParametersAddInfoEXT));
+        unmarshal_VkVideoEncodeH265SessionParametersAddInfoEXT(
+            vkStream, rootType,
+            (VkVideoEncodeH265SessionParametersAddInfoEXT*)(forUnmarshaling->pParametersAddInfo));
     }
 }
 
-void marshal_VkVideoEncodeH265DpbSlotInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoEncodeH265DpbSlotInfoEXT* forMarshaling)
-{
+void marshal_VkVideoEncodeH265DpbSlotInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkVideoEncodeH265DpbSlotInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((int8_t*)&forMarshaling->slotIndex, sizeof(int8_t));
-    vkStream->write((const StdVideoEncodeH265ReferenceInfo*)forMarshaling->pStdReferenceInfo, sizeof(const StdVideoEncodeH265ReferenceInfo));
+    vkStream->write((const StdVideoEncodeH265ReferenceInfo*)forMarshaling->pStdReferenceInfo,
+                    sizeof(const StdVideoEncodeH265ReferenceInfo));
 }
 
-void unmarshal_VkVideoEncodeH265DpbSlotInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH265DpbSlotInfoEXT* forUnmarshaling)
-{
+void unmarshal_VkVideoEncodeH265DpbSlotInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkVideoEncodeH265DpbSlotInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((int8_t*)&forUnmarshaling->slotIndex, sizeof(int8_t));
-    vkStream->alloc((void**)&forUnmarshaling->pStdReferenceInfo, sizeof(const StdVideoEncodeH265ReferenceInfo));
-    vkStream->read((StdVideoEncodeH265ReferenceInfo*)forUnmarshaling->pStdReferenceInfo, sizeof(const StdVideoEncodeH265ReferenceInfo));
+    vkStream->alloc((void**)&forUnmarshaling->pStdReferenceInfo,
+                    sizeof(const StdVideoEncodeH265ReferenceInfo));
+    vkStream->read((StdVideoEncodeH265ReferenceInfo*)forUnmarshaling->pStdReferenceInfo,
+                   sizeof(const StdVideoEncodeH265ReferenceInfo));
 }
 
 void marshal_VkVideoEncodeH265ReferenceListsEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoEncodeH265ReferenceListsEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkVideoEncodeH265ReferenceListsEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint8_t*)&forMarshaling->referenceList0EntryCount, sizeof(uint8_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->referenceList0EntryCount; ++i)
-        {
-            marshal_VkVideoEncodeH265DpbSlotInfoEXT(vkStream, rootType, (const VkVideoEncodeH265DpbSlotInfoEXT*)(forMarshaling->pReferenceList0Entries + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->referenceList0EntryCount; ++i) {
+            marshal_VkVideoEncodeH265DpbSlotInfoEXT(
+                vkStream, rootType,
+                (const VkVideoEncodeH265DpbSlotInfoEXT*)(forMarshaling->pReferenceList0Entries +
+                                                         i));
         }
     }
     vkStream->write((uint8_t*)&forMarshaling->referenceList1EntryCount, sizeof(uint8_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->referenceList1EntryCount; ++i)
-        {
-            marshal_VkVideoEncodeH265DpbSlotInfoEXT(vkStream, rootType, (const VkVideoEncodeH265DpbSlotInfoEXT*)(forMarshaling->pReferenceList1Entries + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->referenceList1EntryCount; ++i) {
+            marshal_VkVideoEncodeH265DpbSlotInfoEXT(
+                vkStream, rootType,
+                (const VkVideoEncodeH265DpbSlotInfoEXT*)(forMarshaling->pReferenceList1Entries +
+                                                         i));
         }
     }
-    vkStream->write((const StdVideoEncodeH265ReferenceModifications*)forMarshaling->pReferenceModifications, sizeof(const StdVideoEncodeH265ReferenceModifications));
+    vkStream->write(
+        (const StdVideoEncodeH265ReferenceModifications*)forMarshaling->pReferenceModifications,
+        sizeof(const StdVideoEncodeH265ReferenceModifications));
 }
 
 void unmarshal_VkVideoEncodeH265ReferenceListsEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH265ReferenceListsEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH265ReferenceListsEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint8_t*)&forUnmarshaling->referenceList0EntryCount, sizeof(uint8_t));
-    vkStream->alloc((void**)&forUnmarshaling->pReferenceList0Entries, forUnmarshaling->referenceList0EntryCount * sizeof(const VkVideoEncodeH265DpbSlotInfoEXT));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->referenceList0EntryCount; ++i)
-        {
-            unmarshal_VkVideoEncodeH265DpbSlotInfoEXT(vkStream, rootType, (VkVideoEncodeH265DpbSlotInfoEXT*)(forUnmarshaling->pReferenceList0Entries + i));
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pReferenceList0Entries,
+        forUnmarshaling->referenceList0EntryCount * sizeof(const VkVideoEncodeH265DpbSlotInfoEXT));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->referenceList0EntryCount; ++i) {
+            unmarshal_VkVideoEncodeH265DpbSlotInfoEXT(
+                vkStream, rootType,
+                (VkVideoEncodeH265DpbSlotInfoEXT*)(forUnmarshaling->pReferenceList0Entries + i));
         }
     }
     vkStream->read((uint8_t*)&forUnmarshaling->referenceList1EntryCount, sizeof(uint8_t));
-    vkStream->alloc((void**)&forUnmarshaling->pReferenceList1Entries, forUnmarshaling->referenceList1EntryCount * sizeof(const VkVideoEncodeH265DpbSlotInfoEXT));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->referenceList1EntryCount; ++i)
-        {
-            unmarshal_VkVideoEncodeH265DpbSlotInfoEXT(vkStream, rootType, (VkVideoEncodeH265DpbSlotInfoEXT*)(forUnmarshaling->pReferenceList1Entries + i));
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pReferenceList1Entries,
+        forUnmarshaling->referenceList1EntryCount * sizeof(const VkVideoEncodeH265DpbSlotInfoEXT));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->referenceList1EntryCount; ++i) {
+            unmarshal_VkVideoEncodeH265DpbSlotInfoEXT(
+                vkStream, rootType,
+                (VkVideoEncodeH265DpbSlotInfoEXT*)(forUnmarshaling->pReferenceList1Entries + i));
         }
     }
-    vkStream->alloc((void**)&forUnmarshaling->pReferenceModifications, sizeof(const StdVideoEncodeH265ReferenceModifications));
-    vkStream->read((StdVideoEncodeH265ReferenceModifications*)forUnmarshaling->pReferenceModifications, sizeof(const StdVideoEncodeH265ReferenceModifications));
+    vkStream->alloc((void**)&forUnmarshaling->pReferenceModifications,
+                    sizeof(const StdVideoEncodeH265ReferenceModifications));
+    vkStream->read(
+        (StdVideoEncodeH265ReferenceModifications*)forUnmarshaling->pReferenceModifications,
+        sizeof(const StdVideoEncodeH265ReferenceModifications));
 }
 
-void marshal_VkVideoEncodeH265NaluSliceEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoEncodeH265NaluSliceEXT* forMarshaling)
-{
+void marshal_VkVideoEncodeH265NaluSliceEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkVideoEncodeH265NaluSliceEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -20244,130 +19125,134 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pReferenceFinalLists;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pReferenceFinalLists)
-    {
-        marshal_VkVideoEncodeH265ReferenceListsEXT(vkStream, rootType, (const VkVideoEncodeH265ReferenceListsEXT*)(forMarshaling->pReferenceFinalLists));
+    if (forMarshaling->pReferenceFinalLists) {
+        marshal_VkVideoEncodeH265ReferenceListsEXT(
+            vkStream, rootType,
+            (const VkVideoEncodeH265ReferenceListsEXT*)(forMarshaling->pReferenceFinalLists));
     }
-    vkStream->write((const StdVideoEncodeH265SliceHeader*)forMarshaling->pSliceHeaderStd, sizeof(const StdVideoEncodeH265SliceHeader));
+    vkStream->write((const StdVideoEncodeH265SliceHeader*)forMarshaling->pSliceHeaderStd,
+                    sizeof(const StdVideoEncodeH265SliceHeader));
 }
 
-void unmarshal_VkVideoEncodeH265NaluSliceEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH265NaluSliceEXT* forUnmarshaling)
-{
+void unmarshal_VkVideoEncodeH265NaluSliceEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkVideoEncodeH265NaluSliceEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->ctbCount, sizeof(uint32_t));
     // WARNING PTR CHECK
-    forUnmarshaling->pReferenceFinalLists = (const VkVideoEncodeH265ReferenceListsEXT*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pReferenceFinalLists)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pReferenceFinalLists, sizeof(const VkVideoEncodeH265ReferenceListsEXT));
-        unmarshal_VkVideoEncodeH265ReferenceListsEXT(vkStream, rootType, (VkVideoEncodeH265ReferenceListsEXT*)(forUnmarshaling->pReferenceFinalLists));
+    forUnmarshaling->pReferenceFinalLists =
+        (const VkVideoEncodeH265ReferenceListsEXT*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pReferenceFinalLists) {
+        vkStream->alloc((void**)&forUnmarshaling->pReferenceFinalLists,
+                        sizeof(const VkVideoEncodeH265ReferenceListsEXT));
+        unmarshal_VkVideoEncodeH265ReferenceListsEXT(
+            vkStream, rootType,
+            (VkVideoEncodeH265ReferenceListsEXT*)(forUnmarshaling->pReferenceFinalLists));
     }
-    vkStream->alloc((void**)&forUnmarshaling->pSliceHeaderStd, sizeof(const StdVideoEncodeH265SliceHeader));
-    vkStream->read((StdVideoEncodeH265SliceHeader*)forUnmarshaling->pSliceHeaderStd, sizeof(const StdVideoEncodeH265SliceHeader));
+    vkStream->alloc((void**)&forUnmarshaling->pSliceHeaderStd,
+                    sizeof(const StdVideoEncodeH265SliceHeader));
+    vkStream->read((StdVideoEncodeH265SliceHeader*)forUnmarshaling->pSliceHeaderStd,
+                   sizeof(const StdVideoEncodeH265SliceHeader));
 }
 
 void marshal_VkVideoEncodeH265VclFrameInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoEncodeH265VclFrameInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkVideoEncodeH265VclFrameInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pReferenceFinalLists;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pReferenceFinalLists)
-    {
-        marshal_VkVideoEncodeH265ReferenceListsEXT(vkStream, rootType, (const VkVideoEncodeH265ReferenceListsEXT*)(forMarshaling->pReferenceFinalLists));
+    if (forMarshaling->pReferenceFinalLists) {
+        marshal_VkVideoEncodeH265ReferenceListsEXT(
+            vkStream, rootType,
+            (const VkVideoEncodeH265ReferenceListsEXT*)(forMarshaling->pReferenceFinalLists));
     }
     vkStream->write((uint32_t*)&forMarshaling->naluSliceEntryCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->naluSliceEntryCount; ++i)
-        {
-            marshal_VkVideoEncodeH265NaluSliceEXT(vkStream, rootType, (const VkVideoEncodeH265NaluSliceEXT*)(forMarshaling->pNaluSliceEntries + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->naluSliceEntryCount; ++i) {
+            marshal_VkVideoEncodeH265NaluSliceEXT(
+                vkStream, rootType,
+                (const VkVideoEncodeH265NaluSliceEXT*)(forMarshaling->pNaluSliceEntries + i));
         }
     }
-    vkStream->write((const StdVideoEncodeH265PictureInfo*)forMarshaling->pCurrentPictureInfo, sizeof(const StdVideoEncodeH265PictureInfo));
+    vkStream->write((const StdVideoEncodeH265PictureInfo*)forMarshaling->pCurrentPictureInfo,
+                    sizeof(const StdVideoEncodeH265PictureInfo));
 }
 
-void unmarshal_VkVideoEncodeH265VclFrameInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH265VclFrameInfoEXT* forUnmarshaling)
-{
+void unmarshal_VkVideoEncodeH265VclFrameInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkVideoEncodeH265VclFrameInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     // WARNING PTR CHECK
-    forUnmarshaling->pReferenceFinalLists = (const VkVideoEncodeH265ReferenceListsEXT*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pReferenceFinalLists)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pReferenceFinalLists, sizeof(const VkVideoEncodeH265ReferenceListsEXT));
-        unmarshal_VkVideoEncodeH265ReferenceListsEXT(vkStream, rootType, (VkVideoEncodeH265ReferenceListsEXT*)(forUnmarshaling->pReferenceFinalLists));
+    forUnmarshaling->pReferenceFinalLists =
+        (const VkVideoEncodeH265ReferenceListsEXT*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pReferenceFinalLists) {
+        vkStream->alloc((void**)&forUnmarshaling->pReferenceFinalLists,
+                        sizeof(const VkVideoEncodeH265ReferenceListsEXT));
+        unmarshal_VkVideoEncodeH265ReferenceListsEXT(
+            vkStream, rootType,
+            (VkVideoEncodeH265ReferenceListsEXT*)(forUnmarshaling->pReferenceFinalLists));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->naluSliceEntryCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pNaluSliceEntries, forUnmarshaling->naluSliceEntryCount * sizeof(const VkVideoEncodeH265NaluSliceEXT));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->naluSliceEntryCount; ++i)
-        {
-            unmarshal_VkVideoEncodeH265NaluSliceEXT(vkStream, rootType, (VkVideoEncodeH265NaluSliceEXT*)(forUnmarshaling->pNaluSliceEntries + i));
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pNaluSliceEntries,
+        forUnmarshaling->naluSliceEntryCount * sizeof(const VkVideoEncodeH265NaluSliceEXT));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->naluSliceEntryCount; ++i) {
+            unmarshal_VkVideoEncodeH265NaluSliceEXT(
+                vkStream, rootType,
+                (VkVideoEncodeH265NaluSliceEXT*)(forUnmarshaling->pNaluSliceEntries + i));
         }
     }
-    vkStream->alloc((void**)&forUnmarshaling->pCurrentPictureInfo, sizeof(const StdVideoEncodeH265PictureInfo));
-    vkStream->read((StdVideoEncodeH265PictureInfo*)forUnmarshaling->pCurrentPictureInfo, sizeof(const StdVideoEncodeH265PictureInfo));
+    vkStream->alloc((void**)&forUnmarshaling->pCurrentPictureInfo,
+                    sizeof(const StdVideoEncodeH265PictureInfo));
+    vkStream->read((StdVideoEncodeH265PictureInfo*)forUnmarshaling->pCurrentPictureInfo,
+                   sizeof(const StdVideoEncodeH265PictureInfo));
 }
 
 void marshal_VkVideoEncodeH265EmitPictureParametersEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoEncodeH265EmitPictureParametersEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkVideoEncodeH265EmitPictureParametersEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -20376,29 +19261,28 @@
     vkStream->write((VkBool32*)&forMarshaling->emitVpsEnable, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->emitSpsEnable, sizeof(VkBool32));
     vkStream->write((uint32_t*)&forMarshaling->ppsIdEntryCount, sizeof(uint32_t));
-    vkStream->write((const uint8_t*)forMarshaling->ppsIdEntries, forMarshaling->ppsIdEntryCount * sizeof(const uint8_t));
+    vkStream->write((const uint8_t*)forMarshaling->ppsIdEntries,
+                    forMarshaling->ppsIdEntryCount * sizeof(const uint8_t));
 }
 
 void unmarshal_VkVideoEncodeH265EmitPictureParametersEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH265EmitPictureParametersEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH265EmitPictureParametersEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -20407,194 +19291,182 @@
     vkStream->read((VkBool32*)&forUnmarshaling->emitVpsEnable, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->emitSpsEnable, sizeof(VkBool32));
     vkStream->read((uint32_t*)&forUnmarshaling->ppsIdEntryCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->ppsIdEntries, forUnmarshaling->ppsIdEntryCount * sizeof(const uint8_t));
-    vkStream->read((uint8_t*)forUnmarshaling->ppsIdEntries, forUnmarshaling->ppsIdEntryCount * sizeof(const uint8_t));
+    vkStream->alloc((void**)&forUnmarshaling->ppsIdEntries,
+                    forUnmarshaling->ppsIdEntryCount * sizeof(const uint8_t));
+    vkStream->read((uint8_t*)forUnmarshaling->ppsIdEntries,
+                   forUnmarshaling->ppsIdEntryCount * sizeof(const uint8_t));
 }
 
-void marshal_VkVideoEncodeH265ProfileEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoEncodeH265ProfileEXT* forMarshaling)
-{
+void marshal_VkVideoEncodeH265ProfileEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkVideoEncodeH265ProfileEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((StdVideoH265ProfileIdc*)&forMarshaling->stdProfileIdc, sizeof(StdVideoH265ProfileIdc));
+    vkStream->write((StdVideoH265ProfileIdc*)&forMarshaling->stdProfileIdc,
+                    sizeof(StdVideoH265ProfileIdc));
 }
 
-void unmarshal_VkVideoEncodeH265ProfileEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH265ProfileEXT* forUnmarshaling)
-{
+void unmarshal_VkVideoEncodeH265ProfileEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkVideoEncodeH265ProfileEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((StdVideoH265ProfileIdc*)&forUnmarshaling->stdProfileIdc, sizeof(StdVideoH265ProfileIdc));
+    vkStream->read((StdVideoH265ProfileIdc*)&forUnmarshaling->stdProfileIdc,
+                   sizeof(StdVideoH265ProfileIdc));
 }
 
 #endif
 #ifdef VK_EXT_video_decode_h264
-void marshal_VkVideoDecodeH264ProfileEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoDecodeH264ProfileEXT* forMarshaling)
-{
+void marshal_VkVideoDecodeH264ProfileEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkVideoDecodeH264ProfileEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((StdVideoH264ProfileIdc*)&forMarshaling->stdProfileIdc, sizeof(StdVideoH264ProfileIdc));
-    vkStream->write((VkVideoDecodeH264PictureLayoutFlagsEXT*)&forMarshaling->pictureLayout, sizeof(VkVideoDecodeH264PictureLayoutFlagsEXT));
+    vkStream->write((StdVideoH264ProfileIdc*)&forMarshaling->stdProfileIdc,
+                    sizeof(StdVideoH264ProfileIdc));
+    vkStream->write((VkVideoDecodeH264PictureLayoutFlagsEXT*)&forMarshaling->pictureLayout,
+                    sizeof(VkVideoDecodeH264PictureLayoutFlagsEXT));
 }
 
-void unmarshal_VkVideoDecodeH264ProfileEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH264ProfileEXT* forUnmarshaling)
-{
+void unmarshal_VkVideoDecodeH264ProfileEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkVideoDecodeH264ProfileEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((StdVideoH264ProfileIdc*)&forUnmarshaling->stdProfileIdc, sizeof(StdVideoH264ProfileIdc));
-    vkStream->read((VkVideoDecodeH264PictureLayoutFlagsEXT*)&forUnmarshaling->pictureLayout, sizeof(VkVideoDecodeH264PictureLayoutFlagsEXT));
+    vkStream->read((StdVideoH264ProfileIdc*)&forUnmarshaling->stdProfileIdc,
+                   sizeof(StdVideoH264ProfileIdc));
+    vkStream->read((VkVideoDecodeH264PictureLayoutFlagsEXT*)&forUnmarshaling->pictureLayout,
+                   sizeof(VkVideoDecodeH264PictureLayoutFlagsEXT));
 }
 
 void marshal_VkVideoDecodeH264CapabilitiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoDecodeH264CapabilitiesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkVideoDecodeH264CapabilitiesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->maxLevel, sizeof(uint32_t));
     marshal_VkOffset2D(vkStream, rootType, (VkOffset2D*)(&forMarshaling->fieldOffsetGranularity));
-    marshal_VkExtensionProperties(vkStream, rootType, (VkExtensionProperties*)(&forMarshaling->stdExtensionVersion));
+    marshal_VkExtensionProperties(vkStream, rootType,
+                                  (VkExtensionProperties*)(&forMarshaling->stdExtensionVersion));
 }
 
-void unmarshal_VkVideoDecodeH264CapabilitiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH264CapabilitiesEXT* forUnmarshaling)
-{
+void unmarshal_VkVideoDecodeH264CapabilitiesEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkVideoDecodeH264CapabilitiesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->maxLevel, sizeof(uint32_t));
-    unmarshal_VkOffset2D(vkStream, rootType, (VkOffset2D*)(&forUnmarshaling->fieldOffsetGranularity));
-    unmarshal_VkExtensionProperties(vkStream, rootType, (VkExtensionProperties*)(&forUnmarshaling->stdExtensionVersion));
+    unmarshal_VkOffset2D(vkStream, rootType,
+                         (VkOffset2D*)(&forUnmarshaling->fieldOffsetGranularity));
+    unmarshal_VkExtensionProperties(
+        vkStream, rootType, (VkExtensionProperties*)(&forUnmarshaling->stdExtensionVersion));
 }
 
 void marshal_VkVideoDecodeH264SessionCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoDecodeH264SessionCreateInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkVideoDecodeH264SessionCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkVideoDecodeH264CreateFlagsEXT*)&forMarshaling->flags, sizeof(VkVideoDecodeH264CreateFlagsEXT));
-    marshal_VkExtensionProperties(vkStream, rootType, (const VkExtensionProperties*)(forMarshaling->pStdExtensionVersion));
+    vkStream->write((VkVideoDecodeH264CreateFlagsEXT*)&forMarshaling->flags,
+                    sizeof(VkVideoDecodeH264CreateFlagsEXT));
+    marshal_VkExtensionProperties(
+        vkStream, rootType, (const VkExtensionProperties*)(forMarshaling->pStdExtensionVersion));
 }
 
 void unmarshal_VkVideoDecodeH264SessionCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH264SessionCreateInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoDecodeH264SessionCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkVideoDecodeH264CreateFlagsEXT*)&forUnmarshaling->flags, sizeof(VkVideoDecodeH264CreateFlagsEXT));
-    vkStream->alloc((void**)&forUnmarshaling->pStdExtensionVersion, sizeof(const VkExtensionProperties));
-    unmarshal_VkExtensionProperties(vkStream, rootType, (VkExtensionProperties*)(forUnmarshaling->pStdExtensionVersion));
+    vkStream->read((VkVideoDecodeH264CreateFlagsEXT*)&forUnmarshaling->flags,
+                   sizeof(VkVideoDecodeH264CreateFlagsEXT));
+    vkStream->alloc((void**)&forUnmarshaling->pStdExtensionVersion,
+                    sizeof(const VkExtensionProperties));
+    unmarshal_VkExtensionProperties(
+        vkStream, rootType, (VkExtensionProperties*)(forUnmarshaling->pStdExtensionVersion));
 }
 
 void marshal_VkVideoDecodeH264SessionParametersAddInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoDecodeH264SessionParametersAddInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkVideoDecodeH264SessionParametersAddInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -20602,70 +19474,74 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pSpsStd;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pSpsStd)
-    {
-        vkStream->write((const StdVideoH264SequenceParameterSet*)forMarshaling->pSpsStd, forMarshaling->spsStdCount * sizeof(const StdVideoH264SequenceParameterSet));
+    if (forMarshaling->pSpsStd) {
+        vkStream->write(
+            (const StdVideoH264SequenceParameterSet*)forMarshaling->pSpsStd,
+            forMarshaling->spsStdCount * sizeof(const StdVideoH264SequenceParameterSet));
     }
     vkStream->write((uint32_t*)&forMarshaling->ppsStdCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)forMarshaling->pPpsStd;
     vkStream->putBe64(cgen_var_1);
-    if (forMarshaling->pPpsStd)
-    {
-        vkStream->write((const StdVideoH264PictureParameterSet*)forMarshaling->pPpsStd, forMarshaling->ppsStdCount * sizeof(const StdVideoH264PictureParameterSet));
+    if (forMarshaling->pPpsStd) {
+        vkStream->write((const StdVideoH264PictureParameterSet*)forMarshaling->pPpsStd,
+                        forMarshaling->ppsStdCount * sizeof(const StdVideoH264PictureParameterSet));
     }
 }
 
 void unmarshal_VkVideoDecodeH264SessionParametersAddInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH264SessionParametersAddInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoDecodeH264SessionParametersAddInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->spsStdCount, sizeof(uint32_t));
     // WARNING PTR CHECK
-    forUnmarshaling->pSpsStd = (const StdVideoH264SequenceParameterSet*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pSpsStd)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pSpsStd, forUnmarshaling->spsStdCount * sizeof(const StdVideoH264SequenceParameterSet));
-        vkStream->read((StdVideoH264SequenceParameterSet*)forUnmarshaling->pSpsStd, forUnmarshaling->spsStdCount * sizeof(const StdVideoH264SequenceParameterSet));
+    forUnmarshaling->pSpsStd =
+        (const StdVideoH264SequenceParameterSet*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pSpsStd) {
+        vkStream->alloc(
+            (void**)&forUnmarshaling->pSpsStd,
+            forUnmarshaling->spsStdCount * sizeof(const StdVideoH264SequenceParameterSet));
+        vkStream->read(
+            (StdVideoH264SequenceParameterSet*)forUnmarshaling->pSpsStd,
+            forUnmarshaling->spsStdCount * sizeof(const StdVideoH264SequenceParameterSet));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->ppsStdCount, sizeof(uint32_t));
     // WARNING PTR CHECK
-    forUnmarshaling->pPpsStd = (const StdVideoH264PictureParameterSet*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pPpsStd)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pPpsStd, forUnmarshaling->ppsStdCount * sizeof(const StdVideoH264PictureParameterSet));
-        vkStream->read((StdVideoH264PictureParameterSet*)forUnmarshaling->pPpsStd, forUnmarshaling->ppsStdCount * sizeof(const StdVideoH264PictureParameterSet));
+    forUnmarshaling->pPpsStd =
+        (const StdVideoH264PictureParameterSet*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pPpsStd) {
+        vkStream->alloc(
+            (void**)&forUnmarshaling->pPpsStd,
+            forUnmarshaling->ppsStdCount * sizeof(const StdVideoH264PictureParameterSet));
+        vkStream->read(
+            (StdVideoH264PictureParameterSet*)forUnmarshaling->pPpsStd,
+            forUnmarshaling->ppsStdCount * sizeof(const StdVideoH264PictureParameterSet));
     }
 }
 
 void marshal_VkVideoDecodeH264SessionParametersCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoDecodeH264SessionParametersCreateInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkVideoDecodeH264SessionParametersCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -20674,188 +19550,178 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pParametersAddInfo;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pParametersAddInfo)
-    {
-        marshal_VkVideoDecodeH264SessionParametersAddInfoEXT(vkStream, rootType, (const VkVideoDecodeH264SessionParametersAddInfoEXT*)(forMarshaling->pParametersAddInfo));
+    if (forMarshaling->pParametersAddInfo) {
+        marshal_VkVideoDecodeH264SessionParametersAddInfoEXT(
+            vkStream, rootType,
+            (const VkVideoDecodeH264SessionParametersAddInfoEXT*)(forMarshaling
+                                                                      ->pParametersAddInfo));
     }
 }
 
 void unmarshal_VkVideoDecodeH264SessionParametersCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH264SessionParametersCreateInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoDecodeH264SessionParametersCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->maxSpsStdCount, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxPpsStdCount, sizeof(uint32_t));
     // WARNING PTR CHECK
-    forUnmarshaling->pParametersAddInfo = (const VkVideoDecodeH264SessionParametersAddInfoEXT*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pParametersAddInfo)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pParametersAddInfo, sizeof(const VkVideoDecodeH264SessionParametersAddInfoEXT));
-        unmarshal_VkVideoDecodeH264SessionParametersAddInfoEXT(vkStream, rootType, (VkVideoDecodeH264SessionParametersAddInfoEXT*)(forUnmarshaling->pParametersAddInfo));
+    forUnmarshaling->pParametersAddInfo =
+        (const VkVideoDecodeH264SessionParametersAddInfoEXT*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pParametersAddInfo) {
+        vkStream->alloc((void**)&forUnmarshaling->pParametersAddInfo,
+                        sizeof(const VkVideoDecodeH264SessionParametersAddInfoEXT));
+        unmarshal_VkVideoDecodeH264SessionParametersAddInfoEXT(
+            vkStream, rootType,
+            (VkVideoDecodeH264SessionParametersAddInfoEXT*)(forUnmarshaling->pParametersAddInfo));
     }
 }
 
-void marshal_VkVideoDecodeH264PictureInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoDecodeH264PictureInfoEXT* forMarshaling)
-{
+void marshal_VkVideoDecodeH264PictureInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkVideoDecodeH264PictureInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((const StdVideoDecodeH264PictureInfo*)forMarshaling->pStdPictureInfo, sizeof(const StdVideoDecodeH264PictureInfo));
+    vkStream->write((const StdVideoDecodeH264PictureInfo*)forMarshaling->pStdPictureInfo,
+                    sizeof(const StdVideoDecodeH264PictureInfo));
     vkStream->write((uint32_t*)&forMarshaling->slicesCount, sizeof(uint32_t));
-    vkStream->write((const uint32_t*)forMarshaling->pSlicesDataOffsets, forMarshaling->slicesCount * sizeof(const uint32_t));
+    vkStream->write((const uint32_t*)forMarshaling->pSlicesDataOffsets,
+                    forMarshaling->slicesCount * sizeof(const uint32_t));
 }
 
-void unmarshal_VkVideoDecodeH264PictureInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH264PictureInfoEXT* forUnmarshaling)
-{
+void unmarshal_VkVideoDecodeH264PictureInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkVideoDecodeH264PictureInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->alloc((void**)&forUnmarshaling->pStdPictureInfo, sizeof(const StdVideoDecodeH264PictureInfo));
-    vkStream->read((StdVideoDecodeH264PictureInfo*)forUnmarshaling->pStdPictureInfo, sizeof(const StdVideoDecodeH264PictureInfo));
+    vkStream->alloc((void**)&forUnmarshaling->pStdPictureInfo,
+                    sizeof(const StdVideoDecodeH264PictureInfo));
+    vkStream->read((StdVideoDecodeH264PictureInfo*)forUnmarshaling->pStdPictureInfo,
+                   sizeof(const StdVideoDecodeH264PictureInfo));
     vkStream->read((uint32_t*)&forUnmarshaling->slicesCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pSlicesDataOffsets, forUnmarshaling->slicesCount * sizeof(const uint32_t));
-    vkStream->read((uint32_t*)forUnmarshaling->pSlicesDataOffsets, forUnmarshaling->slicesCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pSlicesDataOffsets,
+                    forUnmarshaling->slicesCount * sizeof(const uint32_t));
+    vkStream->read((uint32_t*)forUnmarshaling->pSlicesDataOffsets,
+                   forUnmarshaling->slicesCount * sizeof(const uint32_t));
 }
 
-void marshal_VkVideoDecodeH264MvcEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoDecodeH264MvcEXT* forMarshaling)
-{
+void marshal_VkVideoDecodeH264MvcEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkVideoDecodeH264MvcEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((const StdVideoDecodeH264Mvc*)forMarshaling->pStdMvc, sizeof(const StdVideoDecodeH264Mvc));
+    vkStream->write((const StdVideoDecodeH264Mvc*)forMarshaling->pStdMvc,
+                    sizeof(const StdVideoDecodeH264Mvc));
 }
 
-void unmarshal_VkVideoDecodeH264MvcEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH264MvcEXT* forUnmarshaling)
-{
+void unmarshal_VkVideoDecodeH264MvcEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkVideoDecodeH264MvcEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->alloc((void**)&forUnmarshaling->pStdMvc, sizeof(const StdVideoDecodeH264Mvc));
-    vkStream->read((StdVideoDecodeH264Mvc*)forUnmarshaling->pStdMvc, sizeof(const StdVideoDecodeH264Mvc));
+    vkStream->read((StdVideoDecodeH264Mvc*)forUnmarshaling->pStdMvc,
+                   sizeof(const StdVideoDecodeH264Mvc));
 }
 
-void marshal_VkVideoDecodeH264DpbSlotInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoDecodeH264DpbSlotInfoEXT* forMarshaling)
-{
+void marshal_VkVideoDecodeH264DpbSlotInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkVideoDecodeH264DpbSlotInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((const StdVideoDecodeH264ReferenceInfo*)forMarshaling->pStdReferenceInfo, sizeof(const StdVideoDecodeH264ReferenceInfo));
+    vkStream->write((const StdVideoDecodeH264ReferenceInfo*)forMarshaling->pStdReferenceInfo,
+                    sizeof(const StdVideoDecodeH264ReferenceInfo));
 }
 
-void unmarshal_VkVideoDecodeH264DpbSlotInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH264DpbSlotInfoEXT* forUnmarshaling)
-{
+void unmarshal_VkVideoDecodeH264DpbSlotInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkVideoDecodeH264DpbSlotInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->alloc((void**)&forUnmarshaling->pStdReferenceInfo, sizeof(const StdVideoDecodeH264ReferenceInfo));
-    vkStream->read((StdVideoDecodeH264ReferenceInfo*)forUnmarshaling->pStdReferenceInfo, sizeof(const StdVideoDecodeH264ReferenceInfo));
+    vkStream->alloc((void**)&forUnmarshaling->pStdReferenceInfo,
+                    sizeof(const StdVideoDecodeH264ReferenceInfo));
+    vkStream->read((StdVideoDecodeH264ReferenceInfo*)forUnmarshaling->pStdReferenceInfo,
+                   sizeof(const StdVideoDecodeH264ReferenceInfo));
 }
 
 #endif
 #ifdef VK_AMD_texture_gather_bias_lod
 void marshal_VkTextureLODGatherFormatPropertiesAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkTextureLODGatherFormatPropertiesAMD* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkTextureLODGatherFormatPropertiesAMD* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -20863,25 +19729,23 @@
 }
 
 void unmarshal_VkTextureLODGatherFormatPropertiesAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkTextureLODGatherFormatPropertiesAMD* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkTextureLODGatherFormatPropertiesAMD* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -20890,11 +19754,8 @@
 
 #endif
 #ifdef VK_AMD_shader_info
-void marshal_VkShaderResourceUsageAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkShaderResourceUsageAMD* forMarshaling)
-{
+void marshal_VkShaderResourceUsageAMD(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkShaderResourceUsageAMD* forMarshaling) {
     (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->numUsedVgprs, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->numUsedSgprs, sizeof(uint32_t));
@@ -20905,11 +19766,8 @@
     vkStream->putBe64(cgen_var_1);
 }
 
-void unmarshal_VkShaderResourceUsageAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkShaderResourceUsageAMD* forUnmarshaling)
-{
+void unmarshal_VkShaderResourceUsageAMD(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkShaderResourceUsageAMD* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->numUsedVgprs, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->numUsedSgprs, sizeof(uint32_t));
@@ -20918,14 +19776,13 @@
     forUnmarshaling->scratchMemUsageInBytes = (size_t)vkStream->getBe64();
 }
 
-void marshal_VkShaderStatisticsInfoAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkShaderStatisticsInfoAMD* forMarshaling)
-{
+void marshal_VkShaderStatisticsInfoAMD(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkShaderStatisticsInfoAMD* forMarshaling) {
     (void)rootType;
-    vkStream->write((VkShaderStageFlags*)&forMarshaling->shaderStageMask, sizeof(VkShaderStageFlags));
-    marshal_VkShaderResourceUsageAMD(vkStream, rootType, (VkShaderResourceUsageAMD*)(&forMarshaling->resourceUsage));
+    vkStream->write((VkShaderStageFlags*)&forMarshaling->shaderStageMask,
+                    sizeof(VkShaderStageFlags));
+    marshal_VkShaderResourceUsageAMD(vkStream, rootType,
+                                     (VkShaderResourceUsageAMD*)(&forMarshaling->resourceUsage));
     vkStream->write((uint32_t*)&forMarshaling->numPhysicalVgprs, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->numPhysicalSgprs, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->numAvailableVgprs, sizeof(uint32_t));
@@ -20933,14 +19790,13 @@
     vkStream->write((uint32_t*)forMarshaling->computeWorkGroupSize, 3 * sizeof(uint32_t));
 }
 
-void unmarshal_VkShaderStatisticsInfoAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkShaderStatisticsInfoAMD* forUnmarshaling)
-{
+void unmarshal_VkShaderStatisticsInfoAMD(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkShaderStatisticsInfoAMD* forUnmarshaling) {
     (void)rootType;
-    vkStream->read((VkShaderStageFlags*)&forUnmarshaling->shaderStageMask, sizeof(VkShaderStageFlags));
-    unmarshal_VkShaderResourceUsageAMD(vkStream, rootType, (VkShaderResourceUsageAMD*)(&forUnmarshaling->resourceUsage));
+    vkStream->read((VkShaderStageFlags*)&forUnmarshaling->shaderStageMask,
+                   sizeof(VkShaderStageFlags));
+    unmarshal_VkShaderResourceUsageAMD(
+        vkStream, rootType, (VkShaderResourceUsageAMD*)(&forUnmarshaling->resourceUsage));
     vkStream->read((uint32_t*)&forUnmarshaling->numPhysicalVgprs, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->numPhysicalSgprs, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->numAvailableVgprs, sizeof(uint32_t));
@@ -20953,59 +19809,55 @@
 #endif
 #ifdef VK_GGP_stream_descriptor_surface
 void marshal_VkStreamDescriptorSurfaceCreateInfoGGP(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkStreamDescriptorSurfaceCreateInfoGGP* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkStreamDescriptorSurfaceCreateInfoGGP* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkStreamDescriptorSurfaceCreateFlagsGGP*)&forMarshaling->flags, sizeof(VkStreamDescriptorSurfaceCreateFlagsGGP));
-    vkStream->write((GgpStreamDescriptor*)&forMarshaling->streamDescriptor, sizeof(GgpStreamDescriptor));
+    vkStream->write((VkStreamDescriptorSurfaceCreateFlagsGGP*)&forMarshaling->flags,
+                    sizeof(VkStreamDescriptorSurfaceCreateFlagsGGP));
+    vkStream->write((GgpStreamDescriptor*)&forMarshaling->streamDescriptor,
+                    sizeof(GgpStreamDescriptor));
 }
 
 void unmarshal_VkStreamDescriptorSurfaceCreateInfoGGP(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkStreamDescriptorSurfaceCreateInfoGGP* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkStreamDescriptorSurfaceCreateInfoGGP* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkStreamDescriptorSurfaceCreateFlagsGGP*)&forUnmarshaling->flags, sizeof(VkStreamDescriptorSurfaceCreateFlagsGGP));
-    vkStream->read((GgpStreamDescriptor*)&forUnmarshaling->streamDescriptor, sizeof(GgpStreamDescriptor));
+    vkStream->read((VkStreamDescriptorSurfaceCreateFlagsGGP*)&forUnmarshaling->flags,
+                   sizeof(VkStreamDescriptorSurfaceCreateFlagsGGP));
+    vkStream->read((GgpStreamDescriptor*)&forUnmarshaling->streamDescriptor,
+                   sizeof(GgpStreamDescriptor));
 }
 
 #endif
 #ifdef VK_NV_corner_sampled_image
 void marshal_VkPhysicalDeviceCornerSampledImageFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceCornerSampledImageFeaturesNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceCornerSampledImageFeaturesNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -21013,25 +19865,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceCornerSampledImageFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceCornerSampledImageFeaturesNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceCornerSampledImageFeaturesNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -21043,209 +19893,195 @@
 #endif
 #ifdef VK_NV_external_memory_capabilities
 void marshal_VkExternalImageFormatPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkExternalImageFormatPropertiesNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkExternalImageFormatPropertiesNV* forMarshaling) {
     (void)rootType;
-    marshal_VkImageFormatProperties(vkStream, rootType, (VkImageFormatProperties*)(&forMarshaling->imageFormatProperties));
-    vkStream->write((VkExternalMemoryFeatureFlagsNV*)&forMarshaling->externalMemoryFeatures, sizeof(VkExternalMemoryFeatureFlagsNV));
-    vkStream->write((VkExternalMemoryHandleTypeFlagsNV*)&forMarshaling->exportFromImportedHandleTypes, sizeof(VkExternalMemoryHandleTypeFlagsNV));
-    vkStream->write((VkExternalMemoryHandleTypeFlagsNV*)&forMarshaling->compatibleHandleTypes, sizeof(VkExternalMemoryHandleTypeFlagsNV));
+    marshal_VkImageFormatProperties(
+        vkStream, rootType, (VkImageFormatProperties*)(&forMarshaling->imageFormatProperties));
+    vkStream->write((VkExternalMemoryFeatureFlagsNV*)&forMarshaling->externalMemoryFeatures,
+                    sizeof(VkExternalMemoryFeatureFlagsNV));
+    vkStream->write(
+        (VkExternalMemoryHandleTypeFlagsNV*)&forMarshaling->exportFromImportedHandleTypes,
+        sizeof(VkExternalMemoryHandleTypeFlagsNV));
+    vkStream->write((VkExternalMemoryHandleTypeFlagsNV*)&forMarshaling->compatibleHandleTypes,
+                    sizeof(VkExternalMemoryHandleTypeFlagsNV));
 }
 
 void unmarshal_VkExternalImageFormatPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalImageFormatPropertiesNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkExternalImageFormatPropertiesNV* forUnmarshaling) {
     (void)rootType;
-    unmarshal_VkImageFormatProperties(vkStream, rootType, (VkImageFormatProperties*)(&forUnmarshaling->imageFormatProperties));
-    vkStream->read((VkExternalMemoryFeatureFlagsNV*)&forUnmarshaling->externalMemoryFeatures, sizeof(VkExternalMemoryFeatureFlagsNV));
-    vkStream->read((VkExternalMemoryHandleTypeFlagsNV*)&forUnmarshaling->exportFromImportedHandleTypes, sizeof(VkExternalMemoryHandleTypeFlagsNV));
-    vkStream->read((VkExternalMemoryHandleTypeFlagsNV*)&forUnmarshaling->compatibleHandleTypes, sizeof(VkExternalMemoryHandleTypeFlagsNV));
+    unmarshal_VkImageFormatProperties(
+        vkStream, rootType, (VkImageFormatProperties*)(&forUnmarshaling->imageFormatProperties));
+    vkStream->read((VkExternalMemoryFeatureFlagsNV*)&forUnmarshaling->externalMemoryFeatures,
+                   sizeof(VkExternalMemoryFeatureFlagsNV));
+    vkStream->read(
+        (VkExternalMemoryHandleTypeFlagsNV*)&forUnmarshaling->exportFromImportedHandleTypes,
+        sizeof(VkExternalMemoryHandleTypeFlagsNV));
+    vkStream->read((VkExternalMemoryHandleTypeFlagsNV*)&forUnmarshaling->compatibleHandleTypes,
+                   sizeof(VkExternalMemoryHandleTypeFlagsNV));
 }
 
 #endif
 #ifdef VK_NV_external_memory
 void marshal_VkExternalMemoryImageCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkExternalMemoryImageCreateInfoNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkExternalMemoryImageCreateInfoNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkExternalMemoryHandleTypeFlagsNV*)&forMarshaling->handleTypes, sizeof(VkExternalMemoryHandleTypeFlagsNV));
+    vkStream->write((VkExternalMemoryHandleTypeFlagsNV*)&forMarshaling->handleTypes,
+                    sizeof(VkExternalMemoryHandleTypeFlagsNV));
 }
 
 void unmarshal_VkExternalMemoryImageCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalMemoryImageCreateInfoNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkExternalMemoryImageCreateInfoNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkExternalMemoryHandleTypeFlagsNV*)&forUnmarshaling->handleTypes, sizeof(VkExternalMemoryHandleTypeFlagsNV));
+    vkStream->read((VkExternalMemoryHandleTypeFlagsNV*)&forUnmarshaling->handleTypes,
+                   sizeof(VkExternalMemoryHandleTypeFlagsNV));
 }
 
-void marshal_VkExportMemoryAllocateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkExportMemoryAllocateInfoNV* forMarshaling)
-{
+void marshal_VkExportMemoryAllocateInfoNV(VulkanStream* vkStream, VkStructureType rootType,
+                                          const VkExportMemoryAllocateInfoNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkExternalMemoryHandleTypeFlagsNV*)&forMarshaling->handleTypes, sizeof(VkExternalMemoryHandleTypeFlagsNV));
+    vkStream->write((VkExternalMemoryHandleTypeFlagsNV*)&forMarshaling->handleTypes,
+                    sizeof(VkExternalMemoryHandleTypeFlagsNV));
 }
 
-void unmarshal_VkExportMemoryAllocateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExportMemoryAllocateInfoNV* forUnmarshaling)
-{
+void unmarshal_VkExportMemoryAllocateInfoNV(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkExportMemoryAllocateInfoNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkExternalMemoryHandleTypeFlagsNV*)&forUnmarshaling->handleTypes, sizeof(VkExternalMemoryHandleTypeFlagsNV));
+    vkStream->read((VkExternalMemoryHandleTypeFlagsNV*)&forUnmarshaling->handleTypes,
+                   sizeof(VkExternalMemoryHandleTypeFlagsNV));
 }
 
 #endif
 #ifdef VK_NV_external_memory_win32
-void marshal_VkImportMemoryWin32HandleInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImportMemoryWin32HandleInfoNV* forMarshaling)
-{
+void marshal_VkImportMemoryWin32HandleInfoNV(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkImportMemoryWin32HandleInfoNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkExternalMemoryHandleTypeFlagsNV*)&forMarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagsNV));
+    vkStream->write((VkExternalMemoryHandleTypeFlagsNV*)&forMarshaling->handleType,
+                    sizeof(VkExternalMemoryHandleTypeFlagsNV));
     vkStream->write((HANDLE*)&forMarshaling->handle, sizeof(HANDLE));
 }
 
-void unmarshal_VkImportMemoryWin32HandleInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportMemoryWin32HandleInfoNV* forUnmarshaling)
-{
+void unmarshal_VkImportMemoryWin32HandleInfoNV(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkImportMemoryWin32HandleInfoNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkExternalMemoryHandleTypeFlagsNV*)&forUnmarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagsNV));
+    vkStream->read((VkExternalMemoryHandleTypeFlagsNV*)&forUnmarshaling->handleType,
+                   sizeof(VkExternalMemoryHandleTypeFlagsNV));
     vkStream->read((HANDLE*)&forUnmarshaling->handle, sizeof(HANDLE));
 }
 
-void marshal_VkExportMemoryWin32HandleInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkExportMemoryWin32HandleInfoNV* forMarshaling)
-{
+void marshal_VkExportMemoryWin32HandleInfoNV(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkExportMemoryWin32HandleInfoNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pAttributes;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pAttributes)
-    {
-        vkStream->write((const SECURITY_ATTRIBUTES*)forMarshaling->pAttributes, sizeof(const SECURITY_ATTRIBUTES));
+    if (forMarshaling->pAttributes) {
+        vkStream->write((const SECURITY_ATTRIBUTES*)forMarshaling->pAttributes,
+                        sizeof(const SECURITY_ATTRIBUTES));
     }
     vkStream->write((DWORD*)&forMarshaling->dwAccess, sizeof(DWORD));
 }
 
-void unmarshal_VkExportMemoryWin32HandleInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExportMemoryWin32HandleInfoNV* forUnmarshaling)
-{
+void unmarshal_VkExportMemoryWin32HandleInfoNV(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkExportMemoryWin32HandleInfoNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     // WARNING PTR CHECK
     forUnmarshaling->pAttributes = (const SECURITY_ATTRIBUTES*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pAttributes)
-    {
+    if (forUnmarshaling->pAttributes) {
         vkStream->alloc((void**)&forUnmarshaling->pAttributes, sizeof(const SECURITY_ATTRIBUTES));
-        vkStream->read((SECURITY_ATTRIBUTES*)forUnmarshaling->pAttributes, sizeof(const SECURITY_ATTRIBUTES));
+        vkStream->read((SECURITY_ATTRIBUTES*)forUnmarshaling->pAttributes,
+                       sizeof(const SECURITY_ATTRIBUTES));
     }
     vkStream->read((DWORD*)&forUnmarshaling->dwAccess, sizeof(DWORD));
 }
@@ -21253,185 +20089,185 @@
 #endif
 #ifdef VK_NV_win32_keyed_mutex
 void marshal_VkWin32KeyedMutexAcquireReleaseInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkWin32KeyedMutexAcquireReleaseInfoNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkWin32KeyedMutexAcquireReleaseInfoNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->acquireCount, sizeof(uint32_t));
-    if (forMarshaling->acquireCount)
-    {
+    if (forMarshaling->acquireCount) {
         uint64_t* cgen_var_0;
         vkStream->alloc((void**)&cgen_var_0, forMarshaling->acquireCount * 8);
-        vkStream->handleMapping()->mapHandles_VkDeviceMemory_u64(forMarshaling->pAcquireSyncs, cgen_var_0, forMarshaling->acquireCount);
+        vkStream->handleMapping()->mapHandles_VkDeviceMemory_u64(
+            forMarshaling->pAcquireSyncs, cgen_var_0, forMarshaling->acquireCount);
         vkStream->write((uint64_t*)cgen_var_0, forMarshaling->acquireCount * 8);
     }
-    vkStream->write((const uint64_t*)forMarshaling->pAcquireKeys, forMarshaling->acquireCount * sizeof(const uint64_t));
-    vkStream->write((const uint32_t*)forMarshaling->pAcquireTimeoutMilliseconds, forMarshaling->acquireCount * sizeof(const uint32_t));
+    vkStream->write((const uint64_t*)forMarshaling->pAcquireKeys,
+                    forMarshaling->acquireCount * sizeof(const uint64_t));
+    vkStream->write((const uint32_t*)forMarshaling->pAcquireTimeoutMilliseconds,
+                    forMarshaling->acquireCount * sizeof(const uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->releaseCount, sizeof(uint32_t));
-    if (forMarshaling->releaseCount)
-    {
+    if (forMarshaling->releaseCount) {
         uint64_t* cgen_var_1;
         vkStream->alloc((void**)&cgen_var_1, forMarshaling->releaseCount * 8);
-        vkStream->handleMapping()->mapHandles_VkDeviceMemory_u64(forMarshaling->pReleaseSyncs, cgen_var_1, forMarshaling->releaseCount);
+        vkStream->handleMapping()->mapHandles_VkDeviceMemory_u64(
+            forMarshaling->pReleaseSyncs, cgen_var_1, forMarshaling->releaseCount);
         vkStream->write((uint64_t*)cgen_var_1, forMarshaling->releaseCount * 8);
     }
-    vkStream->write((const uint64_t*)forMarshaling->pReleaseKeys, forMarshaling->releaseCount * sizeof(const uint64_t));
+    vkStream->write((const uint64_t*)forMarshaling->pReleaseKeys,
+                    forMarshaling->releaseCount * sizeof(const uint64_t));
 }
 
 void unmarshal_VkWin32KeyedMutexAcquireReleaseInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkWin32KeyedMutexAcquireReleaseInfoNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkWin32KeyedMutexAcquireReleaseInfoNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->acquireCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pAcquireSyncs, forUnmarshaling->acquireCount * sizeof(const VkDeviceMemory));
-    if (forUnmarshaling->acquireCount)
-    {
+    vkStream->alloc((void**)&forUnmarshaling->pAcquireSyncs,
+                    forUnmarshaling->acquireCount * sizeof(const VkDeviceMemory));
+    if (forUnmarshaling->acquireCount) {
         uint64_t* cgen_var_0;
         vkStream->alloc((void**)&cgen_var_0, forUnmarshaling->acquireCount * 8);
         vkStream->read((uint64_t*)cgen_var_0, forUnmarshaling->acquireCount * 8);
-        vkStream->handleMapping()->mapHandles_u64_VkDeviceMemory(cgen_var_0, (VkDeviceMemory*)forUnmarshaling->pAcquireSyncs, forUnmarshaling->acquireCount);
+        vkStream->handleMapping()->mapHandles_u64_VkDeviceMemory(
+            cgen_var_0, (VkDeviceMemory*)forUnmarshaling->pAcquireSyncs,
+            forUnmarshaling->acquireCount);
     }
-    vkStream->alloc((void**)&forUnmarshaling->pAcquireKeys, forUnmarshaling->acquireCount * sizeof(const uint64_t));
-    vkStream->read((uint64_t*)forUnmarshaling->pAcquireKeys, forUnmarshaling->acquireCount * sizeof(const uint64_t));
-    vkStream->alloc((void**)&forUnmarshaling->pAcquireTimeoutMilliseconds, forUnmarshaling->acquireCount * sizeof(const uint32_t));
-    vkStream->read((uint32_t*)forUnmarshaling->pAcquireTimeoutMilliseconds, forUnmarshaling->acquireCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pAcquireKeys,
+                    forUnmarshaling->acquireCount * sizeof(const uint64_t));
+    vkStream->read((uint64_t*)forUnmarshaling->pAcquireKeys,
+                   forUnmarshaling->acquireCount * sizeof(const uint64_t));
+    vkStream->alloc((void**)&forUnmarshaling->pAcquireTimeoutMilliseconds,
+                    forUnmarshaling->acquireCount * sizeof(const uint32_t));
+    vkStream->read((uint32_t*)forUnmarshaling->pAcquireTimeoutMilliseconds,
+                   forUnmarshaling->acquireCount * sizeof(const uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->releaseCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pReleaseSyncs, forUnmarshaling->releaseCount * sizeof(const VkDeviceMemory));
-    if (forUnmarshaling->releaseCount)
-    {
+    vkStream->alloc((void**)&forUnmarshaling->pReleaseSyncs,
+                    forUnmarshaling->releaseCount * sizeof(const VkDeviceMemory));
+    if (forUnmarshaling->releaseCount) {
         uint64_t* cgen_var_1;
         vkStream->alloc((void**)&cgen_var_1, forUnmarshaling->releaseCount * 8);
         vkStream->read((uint64_t*)cgen_var_1, forUnmarshaling->releaseCount * 8);
-        vkStream->handleMapping()->mapHandles_u64_VkDeviceMemory(cgen_var_1, (VkDeviceMemory*)forUnmarshaling->pReleaseSyncs, forUnmarshaling->releaseCount);
+        vkStream->handleMapping()->mapHandles_u64_VkDeviceMemory(
+            cgen_var_1, (VkDeviceMemory*)forUnmarshaling->pReleaseSyncs,
+            forUnmarshaling->releaseCount);
     }
-    vkStream->alloc((void**)&forUnmarshaling->pReleaseKeys, forUnmarshaling->releaseCount * sizeof(const uint64_t));
-    vkStream->read((uint64_t*)forUnmarshaling->pReleaseKeys, forUnmarshaling->releaseCount * sizeof(const uint64_t));
+    vkStream->alloc((void**)&forUnmarshaling->pReleaseKeys,
+                    forUnmarshaling->releaseCount * sizeof(const uint64_t));
+    vkStream->read((uint64_t*)forUnmarshaling->pReleaseKeys,
+                   forUnmarshaling->releaseCount * sizeof(const uint64_t));
 }
 
 #endif
 #ifdef VK_EXT_validation_flags
-void marshal_VkValidationFlagsEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkValidationFlagsEXT* forMarshaling)
-{
+void marshal_VkValidationFlagsEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkValidationFlagsEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->disabledValidationCheckCount, sizeof(uint32_t));
-    vkStream->write((const VkValidationCheckEXT*)forMarshaling->pDisabledValidationChecks, forMarshaling->disabledValidationCheckCount * sizeof(const VkValidationCheckEXT));
+    vkStream->write(
+        (const VkValidationCheckEXT*)forMarshaling->pDisabledValidationChecks,
+        forMarshaling->disabledValidationCheckCount * sizeof(const VkValidationCheckEXT));
 }
 
-void unmarshal_VkValidationFlagsEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkValidationFlagsEXT* forUnmarshaling)
-{
+void unmarshal_VkValidationFlagsEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkValidationFlagsEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->disabledValidationCheckCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pDisabledValidationChecks, forUnmarshaling->disabledValidationCheckCount * sizeof(const VkValidationCheckEXT));
-    vkStream->read((VkValidationCheckEXT*)forUnmarshaling->pDisabledValidationChecks, forUnmarshaling->disabledValidationCheckCount * sizeof(const VkValidationCheckEXT));
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pDisabledValidationChecks,
+        forUnmarshaling->disabledValidationCheckCount * sizeof(const VkValidationCheckEXT));
+    vkStream->read(
+        (VkValidationCheckEXT*)forUnmarshaling->pDisabledValidationChecks,
+        forUnmarshaling->disabledValidationCheckCount * sizeof(const VkValidationCheckEXT));
 }
 
 #endif
 #ifdef VK_NN_vi_surface
-void marshal_VkViSurfaceCreateInfoNN(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkViSurfaceCreateInfoNN* forMarshaling)
-{
+void marshal_VkViSurfaceCreateInfoNN(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkViSurfaceCreateInfoNN* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkViSurfaceCreateFlagsNN*)&forMarshaling->flags, sizeof(VkViSurfaceCreateFlagsNN));
+    vkStream->write((VkViSurfaceCreateFlagsNN*)&forMarshaling->flags,
+                    sizeof(VkViSurfaceCreateFlagsNN));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->window;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->window)
-    {
+    if (forMarshaling->window) {
         vkStream->write((void*)forMarshaling->window, sizeof(uint8_t));
     }
 }
 
-void unmarshal_VkViSurfaceCreateInfoNN(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkViSurfaceCreateInfoNN* forUnmarshaling)
-{
+void unmarshal_VkViSurfaceCreateInfoNN(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkViSurfaceCreateInfoNN* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkViSurfaceCreateFlagsNN*)&forUnmarshaling->flags, sizeof(VkViSurfaceCreateFlagsNN));
+    vkStream->read((VkViSurfaceCreateFlagsNN*)&forUnmarshaling->flags,
+                   sizeof(VkViSurfaceCreateFlagsNN));
     // WARNING PTR CHECK
     forUnmarshaling->window = (void*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->window)
-    {
+    if (forUnmarshaling->window) {
         vkStream->alloc((void**)&forUnmarshaling->window, sizeof(uint8_t));
         vkStream->read((void*)forUnmarshaling->window, sizeof(uint8_t));
     }
@@ -21444,14 +20280,11 @@
 #endif
 #ifdef VK_EXT_texture_compression_astc_hdr
 void marshal_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -21459,25 +20292,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -21486,41 +20317,34 @@
 
 #endif
 #ifdef VK_EXT_astc_decode_mode
-void marshal_VkImageViewASTCDecodeModeEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageViewASTCDecodeModeEXT* forMarshaling)
-{
+void marshal_VkImageViewASTCDecodeModeEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                          const VkImageViewASTCDecodeModeEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkFormat*)&forMarshaling->decodeMode, sizeof(VkFormat));
 }
 
-void unmarshal_VkImageViewASTCDecodeModeEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageViewASTCDecodeModeEXT* forUnmarshaling)
-{
+void unmarshal_VkImageViewASTCDecodeModeEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkImageViewASTCDecodeModeEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -21528,14 +20352,11 @@
 }
 
 void marshal_VkPhysicalDeviceASTCDecodeFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceASTCDecodeFeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceASTCDecodeFeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -21543,25 +20364,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceASTCDecodeFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceASTCDecodeFeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceASTCDecodeFeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -21571,14 +20390,11 @@
 #endif
 #ifdef VK_EXT_conditional_rendering
 void marshal_VkConditionalRenderingBeginInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkConditionalRenderingBeginInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkConditionalRenderingBeginInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -21586,48 +20402,46 @@
     vkStream->handleMapping()->mapHandles_VkBuffer_u64(&forMarshaling->buffer, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->write((VkDeviceSize*)&forMarshaling->offset, sizeof(VkDeviceSize));
-    vkStream->write((VkConditionalRenderingFlagsEXT*)&forMarshaling->flags, sizeof(VkConditionalRenderingFlagsEXT));
+    vkStream->write((VkConditionalRenderingFlagsEXT*)&forMarshaling->flags,
+                    sizeof(VkConditionalRenderingFlagsEXT));
 }
 
 void unmarshal_VkConditionalRenderingBeginInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkConditionalRenderingBeginInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkConditionalRenderingBeginInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkBuffer(&cgen_var_0, (VkBuffer*)&forUnmarshaling->buffer, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_0,
+                                                       (VkBuffer*)&forUnmarshaling->buffer, 1);
     vkStream->read((VkDeviceSize*)&forUnmarshaling->offset, sizeof(VkDeviceSize));
-    vkStream->read((VkConditionalRenderingFlagsEXT*)&forUnmarshaling->flags, sizeof(VkConditionalRenderingFlagsEXT));
+    vkStream->read((VkConditionalRenderingFlagsEXT*)&forUnmarshaling->flags,
+                   sizeof(VkConditionalRenderingFlagsEXT));
 }
 
 void marshal_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceConditionalRenderingFeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceConditionalRenderingFeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -21636,25 +20450,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceConditionalRenderingFeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceConditionalRenderingFeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -21663,14 +20475,11 @@
 }
 
 void marshal_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCommandBufferInheritanceConditionalRenderingInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkCommandBufferInheritanceConditionalRenderingInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -21678,25 +20487,23 @@
 }
 
 void unmarshal_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCommandBufferInheritanceConditionalRenderingInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkCommandBufferInheritanceConditionalRenderingInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -21705,35 +20512,26 @@
 
 #endif
 #ifdef VK_NV_clip_space_w_scaling
-void marshal_VkViewportWScalingNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkViewportWScalingNV* forMarshaling)
-{
+void marshal_VkViewportWScalingNV(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkViewportWScalingNV* forMarshaling) {
     (void)rootType;
     vkStream->write((float*)&forMarshaling->xcoeff, sizeof(float));
     vkStream->write((float*)&forMarshaling->ycoeff, sizeof(float));
 }
 
-void unmarshal_VkViewportWScalingNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkViewportWScalingNV* forUnmarshaling)
-{
+void unmarshal_VkViewportWScalingNV(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkViewportWScalingNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((float*)&forUnmarshaling->xcoeff, sizeof(float));
     vkStream->read((float*)&forUnmarshaling->ycoeff, sizeof(float));
 }
 
 void marshal_VkPipelineViewportWScalingStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineViewportWScalingStateCreateInfoNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineViewportWScalingStateCreateInfoNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -21742,53 +20540,51 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pViewportWScalings;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pViewportWScalings)
-    {
-        if (forMarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forMarshaling->viewportCount; ++i)
-            {
-                marshal_VkViewportWScalingNV(vkStream, rootType, (const VkViewportWScalingNV*)(forMarshaling->pViewportWScalings + i));
+    if (forMarshaling->pViewportWScalings) {
+        if (forMarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forMarshaling->viewportCount; ++i) {
+                marshal_VkViewportWScalingNV(
+                    vkStream, rootType,
+                    (const VkViewportWScalingNV*)(forMarshaling->pViewportWScalings + i));
             }
         }
     }
 }
 
 void unmarshal_VkPipelineViewportWScalingStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineViewportWScalingStateCreateInfoNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineViewportWScalingStateCreateInfoNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkBool32*)&forUnmarshaling->viewportWScalingEnable, sizeof(VkBool32));
     vkStream->read((uint32_t*)&forUnmarshaling->viewportCount, sizeof(uint32_t));
     // WARNING PTR CHECK
-    forUnmarshaling->pViewportWScalings = (const VkViewportWScalingNV*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pViewportWScalings)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pViewportWScalings, forUnmarshaling->viewportCount * sizeof(const VkViewportWScalingNV));
-        if (forUnmarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->viewportCount; ++i)
-            {
-                unmarshal_VkViewportWScalingNV(vkStream, rootType, (VkViewportWScalingNV*)(forUnmarshaling->pViewportWScalings + i));
+    forUnmarshaling->pViewportWScalings =
+        (const VkViewportWScalingNV*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pViewportWScalings) {
+        vkStream->alloc((void**)&forUnmarshaling->pViewportWScalings,
+                        forUnmarshaling->viewportCount * sizeof(const VkViewportWScalingNV));
+        if (forUnmarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->viewportCount; ++i) {
+                unmarshal_VkViewportWScalingNV(
+                    vkStream, rootType,
+                    (VkViewportWScalingNV*)(forUnmarshaling->pViewportWScalings + i));
             }
         }
     }
@@ -21800,15 +20596,11 @@
 #ifdef VK_EXT_acquire_xlib_display
 #endif
 #ifdef VK_EXT_display_surface_counter
-void marshal_VkSurfaceCapabilities2EXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSurfaceCapabilities2EXT* forMarshaling)
-{
+void marshal_VkSurfaceCapabilities2EXT(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkSurfaceCapabilities2EXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -21818,33 +20610,35 @@
     marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->minImageExtent));
     marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->maxImageExtent));
     vkStream->write((uint32_t*)&forMarshaling->maxImageArrayLayers, sizeof(uint32_t));
-    vkStream->write((VkSurfaceTransformFlagsKHR*)&forMarshaling->supportedTransforms, sizeof(VkSurfaceTransformFlagsKHR));
-    vkStream->write((VkSurfaceTransformFlagBitsKHR*)&forMarshaling->currentTransform, sizeof(VkSurfaceTransformFlagBitsKHR));
-    vkStream->write((VkCompositeAlphaFlagsKHR*)&forMarshaling->supportedCompositeAlpha, sizeof(VkCompositeAlphaFlagsKHR));
-    vkStream->write((VkImageUsageFlags*)&forMarshaling->supportedUsageFlags, sizeof(VkImageUsageFlags));
-    vkStream->write((VkSurfaceCounterFlagsEXT*)&forMarshaling->supportedSurfaceCounters, sizeof(VkSurfaceCounterFlagsEXT));
+    vkStream->write((VkSurfaceTransformFlagsKHR*)&forMarshaling->supportedTransforms,
+                    sizeof(VkSurfaceTransformFlagsKHR));
+    vkStream->write((VkSurfaceTransformFlagBitsKHR*)&forMarshaling->currentTransform,
+                    sizeof(VkSurfaceTransformFlagBitsKHR));
+    vkStream->write((VkCompositeAlphaFlagsKHR*)&forMarshaling->supportedCompositeAlpha,
+                    sizeof(VkCompositeAlphaFlagsKHR));
+    vkStream->write((VkImageUsageFlags*)&forMarshaling->supportedUsageFlags,
+                    sizeof(VkImageUsageFlags));
+    vkStream->write((VkSurfaceCounterFlagsEXT*)&forMarshaling->supportedSurfaceCounters,
+                    sizeof(VkSurfaceCounterFlagsEXT));
 }
 
-void unmarshal_VkSurfaceCapabilities2EXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSurfaceCapabilities2EXT* forUnmarshaling)
-{
+void unmarshal_VkSurfaceCapabilities2EXT(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkSurfaceCapabilities2EXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -21854,204 +20648,180 @@
     unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->minImageExtent));
     unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->maxImageExtent));
     vkStream->read((uint32_t*)&forUnmarshaling->maxImageArrayLayers, sizeof(uint32_t));
-    vkStream->read((VkSurfaceTransformFlagsKHR*)&forUnmarshaling->supportedTransforms, sizeof(VkSurfaceTransformFlagsKHR));
-    vkStream->read((VkSurfaceTransformFlagBitsKHR*)&forUnmarshaling->currentTransform, sizeof(VkSurfaceTransformFlagBitsKHR));
-    vkStream->read((VkCompositeAlphaFlagsKHR*)&forUnmarshaling->supportedCompositeAlpha, sizeof(VkCompositeAlphaFlagsKHR));
-    vkStream->read((VkImageUsageFlags*)&forUnmarshaling->supportedUsageFlags, sizeof(VkImageUsageFlags));
-    vkStream->read((VkSurfaceCounterFlagsEXT*)&forUnmarshaling->supportedSurfaceCounters, sizeof(VkSurfaceCounterFlagsEXT));
+    vkStream->read((VkSurfaceTransformFlagsKHR*)&forUnmarshaling->supportedTransforms,
+                   sizeof(VkSurfaceTransformFlagsKHR));
+    vkStream->read((VkSurfaceTransformFlagBitsKHR*)&forUnmarshaling->currentTransform,
+                   sizeof(VkSurfaceTransformFlagBitsKHR));
+    vkStream->read((VkCompositeAlphaFlagsKHR*)&forUnmarshaling->supportedCompositeAlpha,
+                   sizeof(VkCompositeAlphaFlagsKHR));
+    vkStream->read((VkImageUsageFlags*)&forUnmarshaling->supportedUsageFlags,
+                   sizeof(VkImageUsageFlags));
+    vkStream->read((VkSurfaceCounterFlagsEXT*)&forUnmarshaling->supportedSurfaceCounters,
+                   sizeof(VkSurfaceCounterFlagsEXT));
 }
 
 #endif
 #ifdef VK_EXT_display_control
-void marshal_VkDisplayPowerInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDisplayPowerInfoEXT* forMarshaling)
-{
+void marshal_VkDisplayPowerInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkDisplayPowerInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkDisplayPowerStateEXT*)&forMarshaling->powerState, sizeof(VkDisplayPowerStateEXT));
+    vkStream->write((VkDisplayPowerStateEXT*)&forMarshaling->powerState,
+                    sizeof(VkDisplayPowerStateEXT));
 }
 
-void unmarshal_VkDisplayPowerInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayPowerInfoEXT* forUnmarshaling)
-{
+void unmarshal_VkDisplayPowerInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkDisplayPowerInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkDisplayPowerStateEXT*)&forUnmarshaling->powerState, sizeof(VkDisplayPowerStateEXT));
+    vkStream->read((VkDisplayPowerStateEXT*)&forUnmarshaling->powerState,
+                   sizeof(VkDisplayPowerStateEXT));
 }
 
-void marshal_VkDeviceEventInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDeviceEventInfoEXT* forMarshaling)
-{
+void marshal_VkDeviceEventInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkDeviceEventInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkDeviceEventTypeEXT*)&forMarshaling->deviceEvent, sizeof(VkDeviceEventTypeEXT));
+    vkStream->write((VkDeviceEventTypeEXT*)&forMarshaling->deviceEvent,
+                    sizeof(VkDeviceEventTypeEXT));
 }
 
-void unmarshal_VkDeviceEventInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceEventInfoEXT* forUnmarshaling)
-{
+void unmarshal_VkDeviceEventInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkDeviceEventInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkDeviceEventTypeEXT*)&forUnmarshaling->deviceEvent, sizeof(VkDeviceEventTypeEXT));
+    vkStream->read((VkDeviceEventTypeEXT*)&forUnmarshaling->deviceEvent,
+                   sizeof(VkDeviceEventTypeEXT));
 }
 
-void marshal_VkDisplayEventInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDisplayEventInfoEXT* forMarshaling)
-{
+void marshal_VkDisplayEventInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkDisplayEventInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkDisplayEventTypeEXT*)&forMarshaling->displayEvent, sizeof(VkDisplayEventTypeEXT));
+    vkStream->write((VkDisplayEventTypeEXT*)&forMarshaling->displayEvent,
+                    sizeof(VkDisplayEventTypeEXT));
 }
 
-void unmarshal_VkDisplayEventInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayEventInfoEXT* forUnmarshaling)
-{
+void unmarshal_VkDisplayEventInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkDisplayEventInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkDisplayEventTypeEXT*)&forUnmarshaling->displayEvent, sizeof(VkDisplayEventTypeEXT));
+    vkStream->read((VkDisplayEventTypeEXT*)&forUnmarshaling->displayEvent,
+                   sizeof(VkDisplayEventTypeEXT));
 }
 
-void marshal_VkSwapchainCounterCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSwapchainCounterCreateInfoEXT* forMarshaling)
-{
+void marshal_VkSwapchainCounterCreateInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkSwapchainCounterCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkSurfaceCounterFlagsEXT*)&forMarshaling->surfaceCounters, sizeof(VkSurfaceCounterFlagsEXT));
+    vkStream->write((VkSurfaceCounterFlagsEXT*)&forMarshaling->surfaceCounters,
+                    sizeof(VkSurfaceCounterFlagsEXT));
 }
 
-void unmarshal_VkSwapchainCounterCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSwapchainCounterCreateInfoEXT* forUnmarshaling)
-{
+void unmarshal_VkSwapchainCounterCreateInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkSwapchainCounterCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkSurfaceCounterFlagsEXT*)&forUnmarshaling->surfaceCounters, sizeof(VkSurfaceCounterFlagsEXT));
+    vkStream->read((VkSurfaceCounterFlagsEXT*)&forUnmarshaling->surfaceCounters,
+                   sizeof(VkSurfaceCounterFlagsEXT));
 }
 
 #endif
 #ifdef VK_GOOGLE_display_timing
-void marshal_VkRefreshCycleDurationGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkRefreshCycleDurationGOOGLE* forMarshaling)
-{
+void marshal_VkRefreshCycleDurationGOOGLE(VulkanStream* vkStream, VkStructureType rootType,
+                                          const VkRefreshCycleDurationGOOGLE* forMarshaling) {
     (void)rootType;
     vkStream->write((uint64_t*)&forMarshaling->refreshDuration, sizeof(uint64_t));
 }
 
-void unmarshal_VkRefreshCycleDurationGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRefreshCycleDurationGOOGLE* forUnmarshaling)
-{
+void unmarshal_VkRefreshCycleDurationGOOGLE(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkRefreshCycleDurationGOOGLE* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint64_t*)&forUnmarshaling->refreshDuration, sizeof(uint64_t));
 }
 
-void marshal_VkPastPresentationTimingGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPastPresentationTimingGOOGLE* forMarshaling)
-{
+void marshal_VkPastPresentationTimingGOOGLE(VulkanStream* vkStream, VkStructureType rootType,
+                                            const VkPastPresentationTimingGOOGLE* forMarshaling) {
     (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->presentID, sizeof(uint32_t));
     vkStream->write((uint64_t*)&forMarshaling->desiredPresentTime, sizeof(uint64_t));
@@ -22060,11 +20830,8 @@
     vkStream->write((uint64_t*)&forMarshaling->presentMargin, sizeof(uint64_t));
 }
 
-void unmarshal_VkPastPresentationTimingGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPastPresentationTimingGOOGLE* forUnmarshaling)
-{
+void unmarshal_VkPastPresentationTimingGOOGLE(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkPastPresentationTimingGOOGLE* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->presentID, sizeof(uint32_t));
     vkStream->read((uint64_t*)&forUnmarshaling->desiredPresentTime, sizeof(uint64_t));
@@ -22073,35 +20840,25 @@
     vkStream->read((uint64_t*)&forUnmarshaling->presentMargin, sizeof(uint64_t));
 }
 
-void marshal_VkPresentTimeGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPresentTimeGOOGLE* forMarshaling)
-{
+void marshal_VkPresentTimeGOOGLE(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkPresentTimeGOOGLE* forMarshaling) {
     (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->presentID, sizeof(uint32_t));
     vkStream->write((uint64_t*)&forMarshaling->desiredPresentTime, sizeof(uint64_t));
 }
 
-void unmarshal_VkPresentTimeGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPresentTimeGOOGLE* forUnmarshaling)
-{
+void unmarshal_VkPresentTimeGOOGLE(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkPresentTimeGOOGLE* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->presentID, sizeof(uint32_t));
     vkStream->read((uint64_t*)&forUnmarshaling->desiredPresentTime, sizeof(uint64_t));
 }
 
-void marshal_VkPresentTimesInfoGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPresentTimesInfoGOOGLE* forMarshaling)
-{
+void marshal_VkPresentTimesInfoGOOGLE(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkPresentTimesInfoGOOGLE* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -22109,52 +20866,46 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pTimes;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pTimes)
-    {
-        if (forMarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forMarshaling->swapchainCount; ++i)
-            {
-                marshal_VkPresentTimeGOOGLE(vkStream, rootType, (const VkPresentTimeGOOGLE*)(forMarshaling->pTimes + i));
+    if (forMarshaling->pTimes) {
+        if (forMarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forMarshaling->swapchainCount; ++i) {
+                marshal_VkPresentTimeGOOGLE(
+                    vkStream, rootType, (const VkPresentTimeGOOGLE*)(forMarshaling->pTimes + i));
             }
         }
     }
 }
 
-void unmarshal_VkPresentTimesInfoGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPresentTimesInfoGOOGLE* forUnmarshaling)
-{
+void unmarshal_VkPresentTimesInfoGOOGLE(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkPresentTimesInfoGOOGLE* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->swapchainCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     forUnmarshaling->pTimes = (const VkPresentTimeGOOGLE*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pTimes)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pTimes, forUnmarshaling->swapchainCount * sizeof(const VkPresentTimeGOOGLE));
-        if (forUnmarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->swapchainCount; ++i)
-            {
-                unmarshal_VkPresentTimeGOOGLE(vkStream, rootType, (VkPresentTimeGOOGLE*)(forUnmarshaling->pTimes + i));
+    if (forUnmarshaling->pTimes) {
+        vkStream->alloc((void**)&forUnmarshaling->pTimes,
+                        forUnmarshaling->swapchainCount * sizeof(const VkPresentTimeGOOGLE));
+        if (forUnmarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->swapchainCount; ++i) {
+                unmarshal_VkPresentTimeGOOGLE(vkStream, rootType,
+                                              (VkPresentTimeGOOGLE*)(forUnmarshaling->pTimes + i));
             }
         }
     }
@@ -22169,14 +20920,11 @@
 #endif
 #ifdef VK_NVX_multiview_per_view_attributes
 void marshal_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -22184,25 +20932,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -22211,94 +20957,92 @@
 
 #endif
 #ifdef VK_NV_viewport_swizzle
-void marshal_VkViewportSwizzleNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkViewportSwizzleNV* forMarshaling)
-{
+void marshal_VkViewportSwizzleNV(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkViewportSwizzleNV* forMarshaling) {
     (void)rootType;
-    vkStream->write((VkViewportCoordinateSwizzleNV*)&forMarshaling->x, sizeof(VkViewportCoordinateSwizzleNV));
-    vkStream->write((VkViewportCoordinateSwizzleNV*)&forMarshaling->y, sizeof(VkViewportCoordinateSwizzleNV));
-    vkStream->write((VkViewportCoordinateSwizzleNV*)&forMarshaling->z, sizeof(VkViewportCoordinateSwizzleNV));
-    vkStream->write((VkViewportCoordinateSwizzleNV*)&forMarshaling->w, sizeof(VkViewportCoordinateSwizzleNV));
+    vkStream->write((VkViewportCoordinateSwizzleNV*)&forMarshaling->x,
+                    sizeof(VkViewportCoordinateSwizzleNV));
+    vkStream->write((VkViewportCoordinateSwizzleNV*)&forMarshaling->y,
+                    sizeof(VkViewportCoordinateSwizzleNV));
+    vkStream->write((VkViewportCoordinateSwizzleNV*)&forMarshaling->z,
+                    sizeof(VkViewportCoordinateSwizzleNV));
+    vkStream->write((VkViewportCoordinateSwizzleNV*)&forMarshaling->w,
+                    sizeof(VkViewportCoordinateSwizzleNV));
 }
 
-void unmarshal_VkViewportSwizzleNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkViewportSwizzleNV* forUnmarshaling)
-{
+void unmarshal_VkViewportSwizzleNV(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkViewportSwizzleNV* forUnmarshaling) {
     (void)rootType;
-    vkStream->read((VkViewportCoordinateSwizzleNV*)&forUnmarshaling->x, sizeof(VkViewportCoordinateSwizzleNV));
-    vkStream->read((VkViewportCoordinateSwizzleNV*)&forUnmarshaling->y, sizeof(VkViewportCoordinateSwizzleNV));
-    vkStream->read((VkViewportCoordinateSwizzleNV*)&forUnmarshaling->z, sizeof(VkViewportCoordinateSwizzleNV));
-    vkStream->read((VkViewportCoordinateSwizzleNV*)&forUnmarshaling->w, sizeof(VkViewportCoordinateSwizzleNV));
+    vkStream->read((VkViewportCoordinateSwizzleNV*)&forUnmarshaling->x,
+                   sizeof(VkViewportCoordinateSwizzleNV));
+    vkStream->read((VkViewportCoordinateSwizzleNV*)&forUnmarshaling->y,
+                   sizeof(VkViewportCoordinateSwizzleNV));
+    vkStream->read((VkViewportCoordinateSwizzleNV*)&forUnmarshaling->z,
+                   sizeof(VkViewportCoordinateSwizzleNV));
+    vkStream->read((VkViewportCoordinateSwizzleNV*)&forUnmarshaling->w,
+                   sizeof(VkViewportCoordinateSwizzleNV));
 }
 
 void marshal_VkPipelineViewportSwizzleStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineViewportSwizzleStateCreateInfoNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineViewportSwizzleStateCreateInfoNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkPipelineViewportSwizzleStateCreateFlagsNV*)&forMarshaling->flags, sizeof(VkPipelineViewportSwizzleStateCreateFlagsNV));
+    vkStream->write((VkPipelineViewportSwizzleStateCreateFlagsNV*)&forMarshaling->flags,
+                    sizeof(VkPipelineViewportSwizzleStateCreateFlagsNV));
     vkStream->write((uint32_t*)&forMarshaling->viewportCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pViewportSwizzles;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pViewportSwizzles)
-    {
-        if (forMarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forMarshaling->viewportCount; ++i)
-            {
-                marshal_VkViewportSwizzleNV(vkStream, rootType, (const VkViewportSwizzleNV*)(forMarshaling->pViewportSwizzles + i));
+    if (forMarshaling->pViewportSwizzles) {
+        if (forMarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forMarshaling->viewportCount; ++i) {
+                marshal_VkViewportSwizzleNV(
+                    vkStream, rootType,
+                    (const VkViewportSwizzleNV*)(forMarshaling->pViewportSwizzles + i));
             }
         }
     }
 }
 
 void unmarshal_VkPipelineViewportSwizzleStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineViewportSwizzleStateCreateInfoNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineViewportSwizzleStateCreateInfoNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkPipelineViewportSwizzleStateCreateFlagsNV*)&forUnmarshaling->flags, sizeof(VkPipelineViewportSwizzleStateCreateFlagsNV));
+    vkStream->read((VkPipelineViewportSwizzleStateCreateFlagsNV*)&forUnmarshaling->flags,
+                   sizeof(VkPipelineViewportSwizzleStateCreateFlagsNV));
     vkStream->read((uint32_t*)&forUnmarshaling->viewportCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     forUnmarshaling->pViewportSwizzles = (const VkViewportSwizzleNV*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pViewportSwizzles)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pViewportSwizzles, forUnmarshaling->viewportCount * sizeof(const VkViewportSwizzleNV));
-        if (forUnmarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->viewportCount; ++i)
-            {
-                unmarshal_VkViewportSwizzleNV(vkStream, rootType, (VkViewportSwizzleNV*)(forUnmarshaling->pViewportSwizzles + i));
+    if (forUnmarshaling->pViewportSwizzles) {
+        vkStream->alloc((void**)&forUnmarshaling->pViewportSwizzles,
+                        forUnmarshaling->viewportCount * sizeof(const VkViewportSwizzleNV));
+        if (forUnmarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->viewportCount; ++i) {
+                unmarshal_VkViewportSwizzleNV(
+                    vkStream, rootType,
+                    (VkViewportSwizzleNV*)(forUnmarshaling->pViewportSwizzles + i));
             }
         }
     }
@@ -22307,14 +21051,11 @@
 #endif
 #ifdef VK_EXT_discard_rectangles
 void marshal_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceDiscardRectanglePropertiesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceDiscardRectanglePropertiesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -22322,25 +21063,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDiscardRectanglePropertiesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceDiscardRectanglePropertiesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -22348,71 +21087,67 @@
 }
 
 void marshal_VkPipelineDiscardRectangleStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineDiscardRectangleStateCreateInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineDiscardRectangleStateCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkPipelineDiscardRectangleStateCreateFlagsEXT*)&forMarshaling->flags, sizeof(VkPipelineDiscardRectangleStateCreateFlagsEXT));
-    vkStream->write((VkDiscardRectangleModeEXT*)&forMarshaling->discardRectangleMode, sizeof(VkDiscardRectangleModeEXT));
+    vkStream->write((VkPipelineDiscardRectangleStateCreateFlagsEXT*)&forMarshaling->flags,
+                    sizeof(VkPipelineDiscardRectangleStateCreateFlagsEXT));
+    vkStream->write((VkDiscardRectangleModeEXT*)&forMarshaling->discardRectangleMode,
+                    sizeof(VkDiscardRectangleModeEXT));
     vkStream->write((uint32_t*)&forMarshaling->discardRectangleCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pDiscardRectangles;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pDiscardRectangles)
-    {
-        if (forMarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forMarshaling->discardRectangleCount; ++i)
-            {
-                marshal_VkRect2D(vkStream, rootType, (const VkRect2D*)(forMarshaling->pDiscardRectangles + i));
+    if (forMarshaling->pDiscardRectangles) {
+        if (forMarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forMarshaling->discardRectangleCount; ++i) {
+                marshal_VkRect2D(vkStream, rootType,
+                                 (const VkRect2D*)(forMarshaling->pDiscardRectangles + i));
             }
         }
     }
 }
 
 void unmarshal_VkPipelineDiscardRectangleStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineDiscardRectangleStateCreateInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineDiscardRectangleStateCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkPipelineDiscardRectangleStateCreateFlagsEXT*)&forUnmarshaling->flags, sizeof(VkPipelineDiscardRectangleStateCreateFlagsEXT));
-    vkStream->read((VkDiscardRectangleModeEXT*)&forUnmarshaling->discardRectangleMode, sizeof(VkDiscardRectangleModeEXT));
+    vkStream->read((VkPipelineDiscardRectangleStateCreateFlagsEXT*)&forUnmarshaling->flags,
+                   sizeof(VkPipelineDiscardRectangleStateCreateFlagsEXT));
+    vkStream->read((VkDiscardRectangleModeEXT*)&forUnmarshaling->discardRectangleMode,
+                   sizeof(VkDiscardRectangleModeEXT));
     vkStream->read((uint32_t*)&forUnmarshaling->discardRectangleCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     forUnmarshaling->pDiscardRectangles = (const VkRect2D*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pDiscardRectangles)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pDiscardRectangles, forUnmarshaling->discardRectangleCount * sizeof(const VkRect2D));
-        if (forUnmarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->discardRectangleCount; ++i)
-            {
-                unmarshal_VkRect2D(vkStream, rootType, (VkRect2D*)(forUnmarshaling->pDiscardRectangles + i));
+    if (forUnmarshaling->pDiscardRectangles) {
+        vkStream->alloc((void**)&forUnmarshaling->pDiscardRectangles,
+                        forUnmarshaling->discardRectangleCount * sizeof(const VkRect2D));
+        if (forUnmarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->discardRectangleCount; ++i) {
+                unmarshal_VkRect2D(vkStream, rootType,
+                                   (VkRect2D*)(forUnmarshaling->pDiscardRectangles + i));
             }
         }
     }
@@ -22421,118 +21156,119 @@
 #endif
 #ifdef VK_EXT_conservative_rasterization
 void marshal_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceConservativeRasterizationPropertiesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceConservativeRasterizationPropertiesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((float*)&forMarshaling->primitiveOverestimationSize, sizeof(float));
     vkStream->write((float*)&forMarshaling->maxExtraPrimitiveOverestimationSize, sizeof(float));
-    vkStream->write((float*)&forMarshaling->extraPrimitiveOverestimationSizeGranularity, sizeof(float));
+    vkStream->write((float*)&forMarshaling->extraPrimitiveOverestimationSizeGranularity,
+                    sizeof(float));
     vkStream->write((VkBool32*)&forMarshaling->primitiveUnderestimation, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->conservativePointAndLineRasterization, sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->conservativePointAndLineRasterization,
+                    sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->degenerateTrianglesRasterized, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->degenerateLinesRasterized, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->fullyCoveredFragmentShaderInputVariable, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->conservativeRasterizationPostDepthCoverage, sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->fullyCoveredFragmentShaderInputVariable,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->conservativeRasterizationPostDepthCoverage,
+                    sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceConservativeRasterizationPropertiesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceConservativeRasterizationPropertiesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((float*)&forUnmarshaling->primitiveOverestimationSize, sizeof(float));
     vkStream->read((float*)&forUnmarshaling->maxExtraPrimitiveOverestimationSize, sizeof(float));
-    vkStream->read((float*)&forUnmarshaling->extraPrimitiveOverestimationSizeGranularity, sizeof(float));
+    vkStream->read((float*)&forUnmarshaling->extraPrimitiveOverestimationSizeGranularity,
+                   sizeof(float));
     vkStream->read((VkBool32*)&forUnmarshaling->primitiveUnderestimation, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->conservativePointAndLineRasterization, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->conservativePointAndLineRasterization,
+                   sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->degenerateTrianglesRasterized, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->degenerateLinesRasterized, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->fullyCoveredFragmentShaderInputVariable, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->conservativeRasterizationPostDepthCoverage, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->fullyCoveredFragmentShaderInputVariable,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->conservativeRasterizationPostDepthCoverage,
+                   sizeof(VkBool32));
 }
 
 void marshal_VkPipelineRasterizationConservativeStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineRasterizationConservativeStateCreateInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineRasterizationConservativeStateCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkPipelineRasterizationConservativeStateCreateFlagsEXT*)&forMarshaling->flags, sizeof(VkPipelineRasterizationConservativeStateCreateFlagsEXT));
-    vkStream->write((VkConservativeRasterizationModeEXT*)&forMarshaling->conservativeRasterizationMode, sizeof(VkConservativeRasterizationModeEXT));
+    vkStream->write((VkPipelineRasterizationConservativeStateCreateFlagsEXT*)&forMarshaling->flags,
+                    sizeof(VkPipelineRasterizationConservativeStateCreateFlagsEXT));
+    vkStream->write(
+        (VkConservativeRasterizationModeEXT*)&forMarshaling->conservativeRasterizationMode,
+        sizeof(VkConservativeRasterizationModeEXT));
     vkStream->write((float*)&forMarshaling->extraPrimitiveOverestimationSize, sizeof(float));
 }
 
 void unmarshal_VkPipelineRasterizationConservativeStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineRasterizationConservativeStateCreateInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineRasterizationConservativeStateCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkPipelineRasterizationConservativeStateCreateFlagsEXT*)&forUnmarshaling->flags, sizeof(VkPipelineRasterizationConservativeStateCreateFlagsEXT));
-    vkStream->read((VkConservativeRasterizationModeEXT*)&forUnmarshaling->conservativeRasterizationMode, sizeof(VkConservativeRasterizationModeEXT));
+    vkStream->read((VkPipelineRasterizationConservativeStateCreateFlagsEXT*)&forUnmarshaling->flags,
+                   sizeof(VkPipelineRasterizationConservativeStateCreateFlagsEXT));
+    vkStream->read(
+        (VkConservativeRasterizationModeEXT*)&forUnmarshaling->conservativeRasterizationMode,
+        sizeof(VkConservativeRasterizationModeEXT));
     vkStream->read((float*)&forUnmarshaling->extraPrimitiveOverestimationSize, sizeof(float));
 }
 
 #endif
 #ifdef VK_EXT_depth_clip_enable
 void marshal_VkPhysicalDeviceDepthClipEnableFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceDepthClipEnableFeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceDepthClipEnableFeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -22540,25 +21276,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceDepthClipEnableFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDepthClipEnableFeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceDepthClipEnableFeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -22566,45 +21300,42 @@
 }
 
 void marshal_VkPipelineRasterizationDepthClipStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineRasterizationDepthClipStateCreateInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineRasterizationDepthClipStateCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkPipelineRasterizationDepthClipStateCreateFlagsEXT*)&forMarshaling->flags, sizeof(VkPipelineRasterizationDepthClipStateCreateFlagsEXT));
+    vkStream->write((VkPipelineRasterizationDepthClipStateCreateFlagsEXT*)&forMarshaling->flags,
+                    sizeof(VkPipelineRasterizationDepthClipStateCreateFlagsEXT));
     vkStream->write((VkBool32*)&forMarshaling->depthClipEnable, sizeof(VkBool32));
 }
 
 void unmarshal_VkPipelineRasterizationDepthClipStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineRasterizationDepthClipStateCreateInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineRasterizationDepthClipStateCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkPipelineRasterizationDepthClipStateCreateFlagsEXT*)&forUnmarshaling->flags, sizeof(VkPipelineRasterizationDepthClipStateCreateFlagsEXT));
+    vkStream->read((VkPipelineRasterizationDepthClipStateCreateFlagsEXT*)&forUnmarshaling->flags,
+                   sizeof(VkPipelineRasterizationDepthClipStateCreateFlagsEXT));
     vkStream->read((VkBool32*)&forUnmarshaling->depthClipEnable, sizeof(VkBool32));
 }
 
@@ -22612,35 +21343,25 @@
 #ifdef VK_EXT_swapchain_colorspace
 #endif
 #ifdef VK_EXT_hdr_metadata
-void marshal_VkXYColorEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkXYColorEXT* forMarshaling)
-{
+void marshal_VkXYColorEXT(VulkanStream* vkStream, VkStructureType rootType,
+                          const VkXYColorEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((float*)&forMarshaling->x, sizeof(float));
     vkStream->write((float*)&forMarshaling->y, sizeof(float));
 }
 
-void unmarshal_VkXYColorEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkXYColorEXT* forUnmarshaling)
-{
+void unmarshal_VkXYColorEXT(VulkanStream* vkStream, VkStructureType rootType,
+                            VkXYColorEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((float*)&forUnmarshaling->x, sizeof(float));
     vkStream->read((float*)&forUnmarshaling->y, sizeof(float));
 }
 
-void marshal_VkHdrMetadataEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkHdrMetadataEXT* forMarshaling)
-{
+void marshal_VkHdrMetadataEXT(VulkanStream* vkStream, VkStructureType rootType,
+                              const VkHdrMetadataEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -22654,32 +21375,32 @@
     vkStream->write((float*)&forMarshaling->maxFrameAverageLightLevel, sizeof(float));
 }
 
-void unmarshal_VkHdrMetadataEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkHdrMetadataEXT* forUnmarshaling)
-{
+void unmarshal_VkHdrMetadataEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                VkHdrMetadataEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    unmarshal_VkXYColorEXT(vkStream, rootType, (VkXYColorEXT*)(&forUnmarshaling->displayPrimaryRed));
-    unmarshal_VkXYColorEXT(vkStream, rootType, (VkXYColorEXT*)(&forUnmarshaling->displayPrimaryGreen));
-    unmarshal_VkXYColorEXT(vkStream, rootType, (VkXYColorEXT*)(&forUnmarshaling->displayPrimaryBlue));
+    unmarshal_VkXYColorEXT(vkStream, rootType,
+                           (VkXYColorEXT*)(&forUnmarshaling->displayPrimaryRed));
+    unmarshal_VkXYColorEXT(vkStream, rootType,
+                           (VkXYColorEXT*)(&forUnmarshaling->displayPrimaryGreen));
+    unmarshal_VkXYColorEXT(vkStream, rootType,
+                           (VkXYColorEXT*)(&forUnmarshaling->displayPrimaryBlue));
     unmarshal_VkXYColorEXT(vkStream, rootType, (VkXYColorEXT*)(&forUnmarshaling->whitePoint));
     vkStream->read((float*)&forUnmarshaling->maxLuminance, sizeof(float));
     vkStream->read((float*)&forUnmarshaling->minLuminance, sizeof(float));
@@ -22689,56 +21410,49 @@
 
 #endif
 #ifdef VK_MVK_ios_surface
-void marshal_VkIOSSurfaceCreateInfoMVK(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkIOSSurfaceCreateInfoMVK* forMarshaling)
-{
+void marshal_VkIOSSurfaceCreateInfoMVK(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkIOSSurfaceCreateInfoMVK* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkIOSSurfaceCreateFlagsMVK*)&forMarshaling->flags, sizeof(VkIOSSurfaceCreateFlagsMVK));
+    vkStream->write((VkIOSSurfaceCreateFlagsMVK*)&forMarshaling->flags,
+                    sizeof(VkIOSSurfaceCreateFlagsMVK));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pView;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pView)
-    {
+    if (forMarshaling->pView) {
         vkStream->write((const void*)forMarshaling->pView, sizeof(const uint8_t));
     }
 }
 
-void unmarshal_VkIOSSurfaceCreateInfoMVK(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkIOSSurfaceCreateInfoMVK* forUnmarshaling)
-{
+void unmarshal_VkIOSSurfaceCreateInfoMVK(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkIOSSurfaceCreateInfoMVK* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkIOSSurfaceCreateFlagsMVK*)&forUnmarshaling->flags, sizeof(VkIOSSurfaceCreateFlagsMVK));
+    vkStream->read((VkIOSSurfaceCreateFlagsMVK*)&forUnmarshaling->flags,
+                   sizeof(VkIOSSurfaceCreateFlagsMVK));
     // WARNING PTR CHECK
     forUnmarshaling->pView = (const void*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pView)
-    {
+    if (forUnmarshaling->pView) {
         vkStream->alloc((void**)&forUnmarshaling->pView, sizeof(const uint8_t));
         vkStream->read((void*)forUnmarshaling->pView, sizeof(const uint8_t));
     }
@@ -22746,56 +21460,49 @@
 
 #endif
 #ifdef VK_MVK_macos_surface
-void marshal_VkMacOSSurfaceCreateInfoMVK(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMacOSSurfaceCreateInfoMVK* forMarshaling)
-{
+void marshal_VkMacOSSurfaceCreateInfoMVK(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkMacOSSurfaceCreateInfoMVK* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkMacOSSurfaceCreateFlagsMVK*)&forMarshaling->flags, sizeof(VkMacOSSurfaceCreateFlagsMVK));
+    vkStream->write((VkMacOSSurfaceCreateFlagsMVK*)&forMarshaling->flags,
+                    sizeof(VkMacOSSurfaceCreateFlagsMVK));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pView;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pView)
-    {
+    if (forMarshaling->pView) {
         vkStream->write((const void*)forMarshaling->pView, sizeof(const uint8_t));
     }
 }
 
-void unmarshal_VkMacOSSurfaceCreateInfoMVK(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMacOSSurfaceCreateInfoMVK* forUnmarshaling)
-{
+void unmarshal_VkMacOSSurfaceCreateInfoMVK(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkMacOSSurfaceCreateInfoMVK* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkMacOSSurfaceCreateFlagsMVK*)&forUnmarshaling->flags, sizeof(VkMacOSSurfaceCreateFlagsMVK));
+    vkStream->read((VkMacOSSurfaceCreateFlagsMVK*)&forUnmarshaling->flags,
+                   sizeof(VkMacOSSurfaceCreateFlagsMVK));
     // WARNING PTR CHECK
     forUnmarshaling->pView = (const void*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pView)
-    {
+    if (forUnmarshaling->pView) {
         vkStream->alloc((void**)&forUnmarshaling->pView, sizeof(const uint8_t));
         vkStream->read((void*)forUnmarshaling->pView, sizeof(const uint8_t));
     }
@@ -22809,15 +21516,11 @@
 #ifdef VK_EXT_queue_family_foreign
 #endif
 #ifdef VK_EXT_debug_utils
-void marshal_VkDebugUtilsLabelEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDebugUtilsLabelEXT* forMarshaling)
-{
+void marshal_VkDebugUtilsLabelEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkDebugUtilsLabelEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -22825,26 +21528,23 @@
     vkStream->write((float*)forMarshaling->color, 4 * sizeof(float));
 }
 
-void unmarshal_VkDebugUtilsLabelEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDebugUtilsLabelEXT* forUnmarshaling)
-{
+void unmarshal_VkDebugUtilsLabelEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkDebugUtilsLabelEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -22852,101 +21552,80 @@
     vkStream->read((float*)forUnmarshaling->color, 4 * sizeof(float));
 }
 
-void marshal_VkDebugUtilsObjectNameInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDebugUtilsObjectNameInfoEXT* forMarshaling)
-{
+void marshal_VkDebugUtilsObjectNameInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkDebugUtilsObjectNameInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkObjectType*)&forMarshaling->objectType, sizeof(VkObjectType));
     vkStream->write((uint64_t*)&forMarshaling->objectHandle, sizeof(uint64_t));
-    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
-    {
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT) {
         // WARNING PTR CHECK
         uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pObjectName;
         vkStream->putBe64(cgen_var_0);
-        if (forMarshaling->pObjectName)
-        {
+        if (forMarshaling->pObjectName) {
             vkStream->putString(forMarshaling->pObjectName);
         }
-    }
-    else
-    {
+    } else {
         vkStream->putString(forMarshaling->pObjectName);
     }
 }
 
-void unmarshal_VkDebugUtilsObjectNameInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDebugUtilsObjectNameInfoEXT* forUnmarshaling)
-{
+void unmarshal_VkDebugUtilsObjectNameInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkDebugUtilsObjectNameInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkObjectType*)&forUnmarshaling->objectType, sizeof(VkObjectType));
     vkStream->read((uint64_t*)&forUnmarshaling->objectHandle, sizeof(uint64_t));
-    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
-    {
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT) {
         // WARNING PTR CHECK
         forUnmarshaling->pObjectName = (const char*)(uintptr_t)vkStream->getBe64();
-        if (forUnmarshaling->pObjectName)
-        {
+        if (forUnmarshaling->pObjectName) {
             vkStream->loadStringInPlace((char**)&forUnmarshaling->pObjectName);
         }
-    }
-    else
-    {
+    } else {
         vkStream->loadStringInPlace((char**)&forUnmarshaling->pObjectName);
     }
 }
 
 void marshal_VkDebugUtilsMessengerCallbackDataEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDebugUtilsMessengerCallbackDataEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkDebugUtilsMessengerCallbackDataEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkDebugUtilsMessengerCallbackDataFlagsEXT*)&forMarshaling->flags, sizeof(VkDebugUtilsMessengerCallbackDataFlagsEXT));
-    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
-    {
+    vkStream->write((VkDebugUtilsMessengerCallbackDataFlagsEXT*)&forMarshaling->flags,
+                    sizeof(VkDebugUtilsMessengerCallbackDataFlagsEXT));
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT) {
         // WARNING PTR CHECK
         uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pMessageIdName;
         vkStream->putBe64(cgen_var_0);
-        if (forMarshaling->pMessageIdName)
-        {
+        if (forMarshaling->pMessageIdName) {
             vkStream->putString(forMarshaling->pMessageIdName);
         }
-    }
-    else
-    {
+    } else {
         vkStream->putString(forMarshaling->pMessageIdName);
     }
     vkStream->write((int32_t*)&forMarshaling->messageIdNumber, sizeof(int32_t));
@@ -22955,13 +21634,11 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pQueueLabels;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pQueueLabels)
-    {
-        if (forMarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forMarshaling->queueLabelCount; ++i)
-            {
-                marshal_VkDebugUtilsLabelEXT(vkStream, rootType, (VkDebugUtilsLabelEXT*)(forMarshaling->pQueueLabels + i));
+    if (forMarshaling->pQueueLabels) {
+        if (forMarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forMarshaling->queueLabelCount; ++i) {
+                marshal_VkDebugUtilsLabelEXT(
+                    vkStream, rootType, (VkDebugUtilsLabelEXT*)(forMarshaling->pQueueLabels + i));
             }
         }
     }
@@ -22969,13 +21646,11 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)forMarshaling->pCmdBufLabels;
     vkStream->putBe64(cgen_var_1);
-    if (forMarshaling->pCmdBufLabels)
-    {
-        if (forMarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forMarshaling->cmdBufLabelCount; ++i)
-            {
-                marshal_VkDebugUtilsLabelEXT(vkStream, rootType, (VkDebugUtilsLabelEXT*)(forMarshaling->pCmdBufLabels + i));
+    if (forMarshaling->pCmdBufLabels) {
+        if (forMarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forMarshaling->cmdBufLabelCount; ++i) {
+                marshal_VkDebugUtilsLabelEXT(
+                    vkStream, rootType, (VkDebugUtilsLabelEXT*)(forMarshaling->pCmdBufLabels + i));
             }
         }
     }
@@ -22983,53 +21658,47 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)forMarshaling->pObjects;
     vkStream->putBe64(cgen_var_2);
-    if (forMarshaling->pObjects)
-    {
-        if (forMarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forMarshaling->objectCount; ++i)
-            {
-                marshal_VkDebugUtilsObjectNameInfoEXT(vkStream, rootType, (VkDebugUtilsObjectNameInfoEXT*)(forMarshaling->pObjects + i));
+    if (forMarshaling->pObjects) {
+        if (forMarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forMarshaling->objectCount; ++i) {
+                marshal_VkDebugUtilsObjectNameInfoEXT(
+                    vkStream, rootType,
+                    (VkDebugUtilsObjectNameInfoEXT*)(forMarshaling->pObjects + i));
             }
         }
     }
 }
 
 void unmarshal_VkDebugUtilsMessengerCallbackDataEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDebugUtilsMessengerCallbackDataEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDebugUtilsMessengerCallbackDataEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkDebugUtilsMessengerCallbackDataFlagsEXT*)&forUnmarshaling->flags, sizeof(VkDebugUtilsMessengerCallbackDataFlagsEXT));
-    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
-    {
+    vkStream->read((VkDebugUtilsMessengerCallbackDataFlagsEXT*)&forUnmarshaling->flags,
+                   sizeof(VkDebugUtilsMessengerCallbackDataFlagsEXT));
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT) {
         // WARNING PTR CHECK
         forUnmarshaling->pMessageIdName = (const char*)(uintptr_t)vkStream->getBe64();
-        if (forUnmarshaling->pMessageIdName)
-        {
+        if (forUnmarshaling->pMessageIdName) {
             vkStream->loadStringInPlace((char**)&forUnmarshaling->pMessageIdName);
         }
-    }
-    else
-    {
+    } else {
         vkStream->loadStringInPlace((char**)&forUnmarshaling->pMessageIdName);
     }
     vkStream->read((int32_t*)&forUnmarshaling->messageIdNumber, sizeof(int32_t));
@@ -23037,118 +21706,112 @@
     vkStream->read((uint32_t*)&forUnmarshaling->queueLabelCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     forUnmarshaling->pQueueLabels = (VkDebugUtilsLabelEXT*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pQueueLabels)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pQueueLabels, forUnmarshaling->queueLabelCount * sizeof(VkDebugUtilsLabelEXT));
-        if (forUnmarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->queueLabelCount; ++i)
-            {
-                unmarshal_VkDebugUtilsLabelEXT(vkStream, rootType, (VkDebugUtilsLabelEXT*)(forUnmarshaling->pQueueLabels + i));
+    if (forUnmarshaling->pQueueLabels) {
+        vkStream->alloc((void**)&forUnmarshaling->pQueueLabels,
+                        forUnmarshaling->queueLabelCount * sizeof(VkDebugUtilsLabelEXT));
+        if (forUnmarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->queueLabelCount; ++i) {
+                unmarshal_VkDebugUtilsLabelEXT(
+                    vkStream, rootType, (VkDebugUtilsLabelEXT*)(forUnmarshaling->pQueueLabels + i));
             }
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->cmdBufLabelCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     forUnmarshaling->pCmdBufLabels = (VkDebugUtilsLabelEXT*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pCmdBufLabels)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pCmdBufLabels, forUnmarshaling->cmdBufLabelCount * sizeof(VkDebugUtilsLabelEXT));
-        if (forUnmarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->cmdBufLabelCount; ++i)
-            {
-                unmarshal_VkDebugUtilsLabelEXT(vkStream, rootType, (VkDebugUtilsLabelEXT*)(forUnmarshaling->pCmdBufLabels + i));
+    if (forUnmarshaling->pCmdBufLabels) {
+        vkStream->alloc((void**)&forUnmarshaling->pCmdBufLabels,
+                        forUnmarshaling->cmdBufLabelCount * sizeof(VkDebugUtilsLabelEXT));
+        if (forUnmarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->cmdBufLabelCount; ++i) {
+                unmarshal_VkDebugUtilsLabelEXT(
+                    vkStream, rootType,
+                    (VkDebugUtilsLabelEXT*)(forUnmarshaling->pCmdBufLabels + i));
             }
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->objectCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     forUnmarshaling->pObjects = (VkDebugUtilsObjectNameInfoEXT*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pObjects)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pObjects, forUnmarshaling->objectCount * sizeof(VkDebugUtilsObjectNameInfoEXT));
-        if (forUnmarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->objectCount; ++i)
-            {
-                unmarshal_VkDebugUtilsObjectNameInfoEXT(vkStream, rootType, (VkDebugUtilsObjectNameInfoEXT*)(forUnmarshaling->pObjects + i));
+    if (forUnmarshaling->pObjects) {
+        vkStream->alloc((void**)&forUnmarshaling->pObjects,
+                        forUnmarshaling->objectCount * sizeof(VkDebugUtilsObjectNameInfoEXT));
+        if (forUnmarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->objectCount; ++i) {
+                unmarshal_VkDebugUtilsObjectNameInfoEXT(
+                    vkStream, rootType,
+                    (VkDebugUtilsObjectNameInfoEXT*)(forUnmarshaling->pObjects + i));
             }
         }
     }
 }
 
 void marshal_VkDebugUtilsMessengerCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDebugUtilsMessengerCreateInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkDebugUtilsMessengerCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkDebugUtilsMessengerCreateFlagsEXT*)&forMarshaling->flags, sizeof(VkDebugUtilsMessengerCreateFlagsEXT));
-    vkStream->write((VkDebugUtilsMessageSeverityFlagsEXT*)&forMarshaling->messageSeverity, sizeof(VkDebugUtilsMessageSeverityFlagsEXT));
-    vkStream->write((VkDebugUtilsMessageTypeFlagsEXT*)&forMarshaling->messageType, sizeof(VkDebugUtilsMessageTypeFlagsEXT));
+    vkStream->write((VkDebugUtilsMessengerCreateFlagsEXT*)&forMarshaling->flags,
+                    sizeof(VkDebugUtilsMessengerCreateFlagsEXT));
+    vkStream->write((VkDebugUtilsMessageSeverityFlagsEXT*)&forMarshaling->messageSeverity,
+                    sizeof(VkDebugUtilsMessageSeverityFlagsEXT));
+    vkStream->write((VkDebugUtilsMessageTypeFlagsEXT*)&forMarshaling->messageType,
+                    sizeof(VkDebugUtilsMessageTypeFlagsEXT));
     uint64_t cgen_var_0 = (uint64_t)forMarshaling->pfnUserCallback;
     vkStream->putBe64(cgen_var_0);
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)forMarshaling->pUserData;
     vkStream->putBe64(cgen_var_1);
-    if (forMarshaling->pUserData)
-    {
+    if (forMarshaling->pUserData) {
         vkStream->write((void*)forMarshaling->pUserData, sizeof(uint8_t));
     }
 }
 
 void unmarshal_VkDebugUtilsMessengerCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDebugUtilsMessengerCreateInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDebugUtilsMessengerCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkDebugUtilsMessengerCreateFlagsEXT*)&forUnmarshaling->flags, sizeof(VkDebugUtilsMessengerCreateFlagsEXT));
-    vkStream->read((VkDebugUtilsMessageSeverityFlagsEXT*)&forUnmarshaling->messageSeverity, sizeof(VkDebugUtilsMessageSeverityFlagsEXT));
-    vkStream->read((VkDebugUtilsMessageTypeFlagsEXT*)&forUnmarshaling->messageType, sizeof(VkDebugUtilsMessageTypeFlagsEXT));
+    vkStream->read((VkDebugUtilsMessengerCreateFlagsEXT*)&forUnmarshaling->flags,
+                   sizeof(VkDebugUtilsMessengerCreateFlagsEXT));
+    vkStream->read((VkDebugUtilsMessageSeverityFlagsEXT*)&forUnmarshaling->messageSeverity,
+                   sizeof(VkDebugUtilsMessageSeverityFlagsEXT));
+    vkStream->read((VkDebugUtilsMessageTypeFlagsEXT*)&forUnmarshaling->messageType,
+                   sizeof(VkDebugUtilsMessageTypeFlagsEXT));
     forUnmarshaling->pfnUserCallback = (PFN_vkDebugUtilsMessengerCallbackEXT)vkStream->getBe64();
     // WARNING PTR CHECK
     forUnmarshaling->pUserData = (void*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pUserData)
-    {
+    if (forUnmarshaling->pUserData) {
         vkStream->alloc((void**)&forUnmarshaling->pUserData, sizeof(uint8_t));
         vkStream->read((void*)forUnmarshaling->pUserData, sizeof(uint8_t));
     }
 }
 
-void marshal_VkDebugUtilsObjectTagInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDebugUtilsObjectTagInfoEXT* forMarshaling)
-{
+void marshal_VkDebugUtilsObjectTagInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                          const VkDebugUtilsObjectTagInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -23157,29 +21820,27 @@
     vkStream->write((uint64_t*)&forMarshaling->tagName, sizeof(uint64_t));
     uint64_t cgen_var_0 = (uint64_t)forMarshaling->tagSize;
     vkStream->putBe64(cgen_var_0);
-    vkStream->write((const void*)forMarshaling->pTag, forMarshaling->tagSize * sizeof(const uint8_t));
+    vkStream->write((const void*)forMarshaling->pTag,
+                    forMarshaling->tagSize * sizeof(const uint8_t));
 }
 
-void unmarshal_VkDebugUtilsObjectTagInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDebugUtilsObjectTagInfoEXT* forUnmarshaling)
-{
+void unmarshal_VkDebugUtilsObjectTagInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkDebugUtilsObjectTagInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -23187,21 +21848,19 @@
     vkStream->read((uint64_t*)&forUnmarshaling->objectHandle, sizeof(uint64_t));
     vkStream->read((uint64_t*)&forUnmarshaling->tagName, sizeof(uint64_t));
     forUnmarshaling->tagSize = (size_t)vkStream->getBe64();
-    vkStream->alloc((void**)&forUnmarshaling->pTag, forUnmarshaling->tagSize * sizeof(const uint8_t));
+    vkStream->alloc((void**)&forUnmarshaling->pTag,
+                    forUnmarshaling->tagSize * sizeof(const uint8_t));
     vkStream->read((void*)forUnmarshaling->pTag, forUnmarshaling->tagSize * sizeof(const uint8_t));
 }
 
 #endif
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
 void marshal_VkAndroidHardwareBufferUsageANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAndroidHardwareBufferUsageANDROID* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkAndroidHardwareBufferUsageANDROID* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -23209,25 +21868,23 @@
 }
 
 void unmarshal_VkAndroidHardwareBufferUsageANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAndroidHardwareBufferUsageANDROID* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAndroidHardwareBufferUsageANDROID* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -23235,14 +21892,11 @@
 }
 
 void marshal_VkAndroidHardwareBufferPropertiesANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAndroidHardwareBufferPropertiesANDROID* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkAndroidHardwareBufferPropertiesANDROID* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -23251,25 +21905,23 @@
 }
 
 void unmarshal_VkAndroidHardwareBufferPropertiesANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAndroidHardwareBufferPropertiesANDROID* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAndroidHardwareBufferPropertiesANDROID* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -23278,69 +21930,75 @@
 }
 
 void marshal_VkAndroidHardwareBufferFormatPropertiesANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAndroidHardwareBufferFormatPropertiesANDROID* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkAndroidHardwareBufferFormatPropertiesANDROID* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkFormat*)&forMarshaling->format, sizeof(VkFormat));
     vkStream->write((uint64_t*)&forMarshaling->externalFormat, sizeof(uint64_t));
-    vkStream->write((VkFormatFeatureFlags*)&forMarshaling->formatFeatures, sizeof(VkFormatFeatureFlags));
-    marshal_VkComponentMapping(vkStream, rootType, (VkComponentMapping*)(&forMarshaling->samplerYcbcrConversionComponents));
-    vkStream->write((VkSamplerYcbcrModelConversion*)&forMarshaling->suggestedYcbcrModel, sizeof(VkSamplerYcbcrModelConversion));
-    vkStream->write((VkSamplerYcbcrRange*)&forMarshaling->suggestedYcbcrRange, sizeof(VkSamplerYcbcrRange));
-    vkStream->write((VkChromaLocation*)&forMarshaling->suggestedXChromaOffset, sizeof(VkChromaLocation));
-    vkStream->write((VkChromaLocation*)&forMarshaling->suggestedYChromaOffset, sizeof(VkChromaLocation));
+    vkStream->write((VkFormatFeatureFlags*)&forMarshaling->formatFeatures,
+                    sizeof(VkFormatFeatureFlags));
+    marshal_VkComponentMapping(
+        vkStream, rootType,
+        (VkComponentMapping*)(&forMarshaling->samplerYcbcrConversionComponents));
+    vkStream->write((VkSamplerYcbcrModelConversion*)&forMarshaling->suggestedYcbcrModel,
+                    sizeof(VkSamplerYcbcrModelConversion));
+    vkStream->write((VkSamplerYcbcrRange*)&forMarshaling->suggestedYcbcrRange,
+                    sizeof(VkSamplerYcbcrRange));
+    vkStream->write((VkChromaLocation*)&forMarshaling->suggestedXChromaOffset,
+                    sizeof(VkChromaLocation));
+    vkStream->write((VkChromaLocation*)&forMarshaling->suggestedYChromaOffset,
+                    sizeof(VkChromaLocation));
 }
 
 void unmarshal_VkAndroidHardwareBufferFormatPropertiesANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAndroidHardwareBufferFormatPropertiesANDROID* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAndroidHardwareBufferFormatPropertiesANDROID* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkFormat*)&forUnmarshaling->format, sizeof(VkFormat));
     vkStream->read((uint64_t*)&forUnmarshaling->externalFormat, sizeof(uint64_t));
-    vkStream->read((VkFormatFeatureFlags*)&forUnmarshaling->formatFeatures, sizeof(VkFormatFeatureFlags));
-    unmarshal_VkComponentMapping(vkStream, rootType, (VkComponentMapping*)(&forUnmarshaling->samplerYcbcrConversionComponents));
-    vkStream->read((VkSamplerYcbcrModelConversion*)&forUnmarshaling->suggestedYcbcrModel, sizeof(VkSamplerYcbcrModelConversion));
-    vkStream->read((VkSamplerYcbcrRange*)&forUnmarshaling->suggestedYcbcrRange, sizeof(VkSamplerYcbcrRange));
-    vkStream->read((VkChromaLocation*)&forUnmarshaling->suggestedXChromaOffset, sizeof(VkChromaLocation));
-    vkStream->read((VkChromaLocation*)&forUnmarshaling->suggestedYChromaOffset, sizeof(VkChromaLocation));
+    vkStream->read((VkFormatFeatureFlags*)&forUnmarshaling->formatFeatures,
+                   sizeof(VkFormatFeatureFlags));
+    unmarshal_VkComponentMapping(
+        vkStream, rootType,
+        (VkComponentMapping*)(&forUnmarshaling->samplerYcbcrConversionComponents));
+    vkStream->read((VkSamplerYcbcrModelConversion*)&forUnmarshaling->suggestedYcbcrModel,
+                   sizeof(VkSamplerYcbcrModelConversion));
+    vkStream->read((VkSamplerYcbcrRange*)&forUnmarshaling->suggestedYcbcrRange,
+                   sizeof(VkSamplerYcbcrRange));
+    vkStream->read((VkChromaLocation*)&forUnmarshaling->suggestedXChromaOffset,
+                   sizeof(VkChromaLocation));
+    vkStream->read((VkChromaLocation*)&forUnmarshaling->suggestedYChromaOffset,
+                   sizeof(VkChromaLocation));
 }
 
 void marshal_VkImportAndroidHardwareBufferInfoANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImportAndroidHardwareBufferInfoANDROID* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkImportAndroidHardwareBufferInfoANDROID* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -23348,25 +22006,23 @@
 }
 
 void unmarshal_VkImportAndroidHardwareBufferInfoANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportAndroidHardwareBufferInfoANDROID* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImportAndroidHardwareBufferInfoANDROID* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -23375,85 +22031,75 @@
 }
 
 void marshal_VkMemoryGetAndroidHardwareBufferInfoANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMemoryGetAndroidHardwareBufferInfoANDROID* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkMemoryGetAndroidHardwareBufferInfoANDROID* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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_VkDeviceMemory_u64(&forMarshaling->memory, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkDeviceMemory_u64(&forMarshaling->memory, &cgen_var_0,
+                                                             1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
 }
 
 void unmarshal_VkMemoryGetAndroidHardwareBufferInfoANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryGetAndroidHardwareBufferInfoANDROID* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkMemoryGetAndroidHardwareBufferInfoANDROID* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkDeviceMemory(&cgen_var_0, (VkDeviceMemory*)&forUnmarshaling->memory, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkDeviceMemory(
+        &cgen_var_0, (VkDeviceMemory*)&forUnmarshaling->memory, 1);
 }
 
-void marshal_VkExternalFormatANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkExternalFormatANDROID* forMarshaling)
-{
+void marshal_VkExternalFormatANDROID(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkExternalFormatANDROID* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint64_t*)&forMarshaling->externalFormat, sizeof(uint64_t));
 }
 
-void unmarshal_VkExternalFormatANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalFormatANDROID* forUnmarshaling)
-{
+void unmarshal_VkExternalFormatANDROID(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkExternalFormatANDROID* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -23461,58 +22107,67 @@
 }
 
 void marshal_VkAndroidHardwareBufferFormatProperties2ANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAndroidHardwareBufferFormatProperties2ANDROID* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkAndroidHardwareBufferFormatProperties2ANDROID* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkFormat*)&forMarshaling->format, sizeof(VkFormat));
     vkStream->write((uint64_t*)&forMarshaling->externalFormat, sizeof(uint64_t));
-    vkStream->write((VkFormatFeatureFlags2KHR*)&forMarshaling->formatFeatures, sizeof(VkFormatFeatureFlags2KHR));
-    marshal_VkComponentMapping(vkStream, rootType, (VkComponentMapping*)(&forMarshaling->samplerYcbcrConversionComponents));
-    vkStream->write((VkSamplerYcbcrModelConversion*)&forMarshaling->suggestedYcbcrModel, sizeof(VkSamplerYcbcrModelConversion));
-    vkStream->write((VkSamplerYcbcrRange*)&forMarshaling->suggestedYcbcrRange, sizeof(VkSamplerYcbcrRange));
-    vkStream->write((VkChromaLocation*)&forMarshaling->suggestedXChromaOffset, sizeof(VkChromaLocation));
-    vkStream->write((VkChromaLocation*)&forMarshaling->suggestedYChromaOffset, sizeof(VkChromaLocation));
+    vkStream->write((VkFormatFeatureFlags2KHR*)&forMarshaling->formatFeatures,
+                    sizeof(VkFormatFeatureFlags2KHR));
+    marshal_VkComponentMapping(
+        vkStream, rootType,
+        (VkComponentMapping*)(&forMarshaling->samplerYcbcrConversionComponents));
+    vkStream->write((VkSamplerYcbcrModelConversion*)&forMarshaling->suggestedYcbcrModel,
+                    sizeof(VkSamplerYcbcrModelConversion));
+    vkStream->write((VkSamplerYcbcrRange*)&forMarshaling->suggestedYcbcrRange,
+                    sizeof(VkSamplerYcbcrRange));
+    vkStream->write((VkChromaLocation*)&forMarshaling->suggestedXChromaOffset,
+                    sizeof(VkChromaLocation));
+    vkStream->write((VkChromaLocation*)&forMarshaling->suggestedYChromaOffset,
+                    sizeof(VkChromaLocation));
 }
 
 void unmarshal_VkAndroidHardwareBufferFormatProperties2ANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAndroidHardwareBufferFormatProperties2ANDROID* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAndroidHardwareBufferFormatProperties2ANDROID* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkFormat*)&forUnmarshaling->format, sizeof(VkFormat));
     vkStream->read((uint64_t*)&forUnmarshaling->externalFormat, sizeof(uint64_t));
-    vkStream->read((VkFormatFeatureFlags2KHR*)&forUnmarshaling->formatFeatures, sizeof(VkFormatFeatureFlags2KHR));
-    unmarshal_VkComponentMapping(vkStream, rootType, (VkComponentMapping*)(&forUnmarshaling->samplerYcbcrConversionComponents));
-    vkStream->read((VkSamplerYcbcrModelConversion*)&forUnmarshaling->suggestedYcbcrModel, sizeof(VkSamplerYcbcrModelConversion));
-    vkStream->read((VkSamplerYcbcrRange*)&forUnmarshaling->suggestedYcbcrRange, sizeof(VkSamplerYcbcrRange));
-    vkStream->read((VkChromaLocation*)&forUnmarshaling->suggestedXChromaOffset, sizeof(VkChromaLocation));
-    vkStream->read((VkChromaLocation*)&forUnmarshaling->suggestedYChromaOffset, sizeof(VkChromaLocation));
+    vkStream->read((VkFormatFeatureFlags2KHR*)&forUnmarshaling->formatFeatures,
+                   sizeof(VkFormatFeatureFlags2KHR));
+    unmarshal_VkComponentMapping(
+        vkStream, rootType,
+        (VkComponentMapping*)(&forUnmarshaling->samplerYcbcrConversionComponents));
+    vkStream->read((VkSamplerYcbcrModelConversion*)&forUnmarshaling->suggestedYcbcrModel,
+                   sizeof(VkSamplerYcbcrModelConversion));
+    vkStream->read((VkSamplerYcbcrRange*)&forUnmarshaling->suggestedYcbcrRange,
+                   sizeof(VkSamplerYcbcrRange));
+    vkStream->read((VkChromaLocation*)&forUnmarshaling->suggestedXChromaOffset,
+                   sizeof(VkChromaLocation));
+    vkStream->read((VkChromaLocation*)&forUnmarshaling->suggestedYChromaOffset,
+                   sizeof(VkChromaLocation));
 }
 
 #endif
@@ -23526,150 +22181,147 @@
 #endif
 #ifdef VK_EXT_inline_uniform_block
 void marshal_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceInlineUniformBlockFeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceInlineUniformBlockFeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->inlineUniformBlock, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->descriptorBindingInlineUniformBlockUpdateAfterBind, sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->descriptorBindingInlineUniformBlockUpdateAfterBind,
+                    sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceInlineUniformBlockFeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceInlineUniformBlockFeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkBool32*)&forUnmarshaling->inlineUniformBlock, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingInlineUniformBlockUpdateAfterBind, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingInlineUniformBlockUpdateAfterBind,
+                   sizeof(VkBool32));
 }
 
 void marshal_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceInlineUniformBlockPropertiesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceInlineUniformBlockPropertiesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->maxInlineUniformBlockSize, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorInlineUniformBlocks, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetInlineUniformBlocks, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindInlineUniformBlocks, sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorInlineUniformBlocks,
+                    sizeof(uint32_t));
+    vkStream->write(
+        (uint32_t*)&forMarshaling->maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks,
+        sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetInlineUniformBlocks,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindInlineUniformBlocks,
+                    sizeof(uint32_t));
 }
 
 void unmarshal_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceInlineUniformBlockPropertiesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceInlineUniformBlockPropertiesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->maxInlineUniformBlockSize, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorInlineUniformBlocks, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetInlineUniformBlocks, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindInlineUniformBlocks, sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorInlineUniformBlocks,
+                   sizeof(uint32_t));
+    vkStream->read(
+        (uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks,
+        sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetInlineUniformBlocks,
+                   sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindInlineUniformBlocks,
+                   sizeof(uint32_t));
 }
 
 void marshal_VkWriteDescriptorSetInlineUniformBlockEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkWriteDescriptorSetInlineUniformBlockEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkWriteDescriptorSetInlineUniformBlockEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->dataSize, sizeof(uint32_t));
-    vkStream->write((const void*)forMarshaling->pData, forMarshaling->dataSize * sizeof(const uint8_t));
+    vkStream->write((const void*)forMarshaling->pData,
+                    forMarshaling->dataSize * sizeof(const uint8_t));
 }
 
 void unmarshal_VkWriteDescriptorSetInlineUniformBlockEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkWriteDescriptorSetInlineUniformBlockEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkWriteDescriptorSetInlineUniformBlockEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->dataSize, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pData, forUnmarshaling->dataSize * sizeof(const uint8_t));
-    vkStream->read((void*)forUnmarshaling->pData, forUnmarshaling->dataSize * sizeof(const uint8_t));
+    vkStream->alloc((void**)&forUnmarshaling->pData,
+                    forUnmarshaling->dataSize * sizeof(const uint8_t));
+    vkStream->read((void*)forUnmarshaling->pData,
+                   forUnmarshaling->dataSize * sizeof(const uint8_t));
 }
 
 void marshal_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDescriptorPoolInlineUniformBlockCreateInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkDescriptorPoolInlineUniformBlockCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -23677,25 +22329,23 @@
 }
 
 void unmarshal_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorPoolInlineUniformBlockCreateInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDescriptorPoolInlineUniformBlockCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -23706,343 +22356,321 @@
 #ifdef VK_EXT_shader_stencil_export
 #endif
 #ifdef VK_EXT_sample_locations
-void marshal_VkSampleLocationEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSampleLocationEXT* forMarshaling)
-{
+void marshal_VkSampleLocationEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkSampleLocationEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((float*)&forMarshaling->x, sizeof(float));
     vkStream->write((float*)&forMarshaling->y, sizeof(float));
 }
 
-void unmarshal_VkSampleLocationEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSampleLocationEXT* forUnmarshaling)
-{
+void unmarshal_VkSampleLocationEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkSampleLocationEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((float*)&forUnmarshaling->x, sizeof(float));
     vkStream->read((float*)&forUnmarshaling->y, sizeof(float));
 }
 
-void marshal_VkSampleLocationsInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSampleLocationsInfoEXT* forMarshaling)
-{
+void marshal_VkSampleLocationsInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkSampleLocationsInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkSampleCountFlagBits*)&forMarshaling->sampleLocationsPerPixel, sizeof(VkSampleCountFlagBits));
+    vkStream->write((VkSampleCountFlagBits*)&forMarshaling->sampleLocationsPerPixel,
+                    sizeof(VkSampleCountFlagBits));
     marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->sampleLocationGridSize));
     vkStream->write((uint32_t*)&forMarshaling->sampleLocationsCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->sampleLocationsCount; ++i)
-        {
-            marshal_VkSampleLocationEXT(vkStream, rootType, (const VkSampleLocationEXT*)(forMarshaling->pSampleLocations + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->sampleLocationsCount; ++i) {
+            marshal_VkSampleLocationEXT(
+                vkStream, rootType,
+                (const VkSampleLocationEXT*)(forMarshaling->pSampleLocations + i));
         }
     }
 }
 
-void unmarshal_VkSampleLocationsInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSampleLocationsInfoEXT* forUnmarshaling)
-{
+void unmarshal_VkSampleLocationsInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkSampleLocationsInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkSampleCountFlagBits*)&forUnmarshaling->sampleLocationsPerPixel, sizeof(VkSampleCountFlagBits));
-    unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->sampleLocationGridSize));
+    vkStream->read((VkSampleCountFlagBits*)&forUnmarshaling->sampleLocationsPerPixel,
+                   sizeof(VkSampleCountFlagBits));
+    unmarshal_VkExtent2D(vkStream, rootType,
+                         (VkExtent2D*)(&forUnmarshaling->sampleLocationGridSize));
     vkStream->read((uint32_t*)&forUnmarshaling->sampleLocationsCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pSampleLocations, forUnmarshaling->sampleLocationsCount * sizeof(const VkSampleLocationEXT));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->sampleLocationsCount; ++i)
-        {
-            unmarshal_VkSampleLocationEXT(vkStream, rootType, (VkSampleLocationEXT*)(forUnmarshaling->pSampleLocations + i));
+    vkStream->alloc((void**)&forUnmarshaling->pSampleLocations,
+                    forUnmarshaling->sampleLocationsCount * sizeof(const VkSampleLocationEXT));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->sampleLocationsCount; ++i) {
+            unmarshal_VkSampleLocationEXT(
+                vkStream, rootType, (VkSampleLocationEXT*)(forUnmarshaling->pSampleLocations + i));
         }
     }
 }
 
-void marshal_VkAttachmentSampleLocationsEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAttachmentSampleLocationsEXT* forMarshaling)
-{
+void marshal_VkAttachmentSampleLocationsEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                            const VkAttachmentSampleLocationsEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->attachmentIndex, sizeof(uint32_t));
-    marshal_VkSampleLocationsInfoEXT(vkStream, rootType, (VkSampleLocationsInfoEXT*)(&forMarshaling->sampleLocationsInfo));
+    marshal_VkSampleLocationsInfoEXT(
+        vkStream, rootType, (VkSampleLocationsInfoEXT*)(&forMarshaling->sampleLocationsInfo));
 }
 
-void unmarshal_VkAttachmentSampleLocationsEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAttachmentSampleLocationsEXT* forUnmarshaling)
-{
+void unmarshal_VkAttachmentSampleLocationsEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkAttachmentSampleLocationsEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->attachmentIndex, sizeof(uint32_t));
-    unmarshal_VkSampleLocationsInfoEXT(vkStream, rootType, (VkSampleLocationsInfoEXT*)(&forUnmarshaling->sampleLocationsInfo));
+    unmarshal_VkSampleLocationsInfoEXT(
+        vkStream, rootType, (VkSampleLocationsInfoEXT*)(&forUnmarshaling->sampleLocationsInfo));
 }
 
-void marshal_VkSubpassSampleLocationsEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSubpassSampleLocationsEXT* forMarshaling)
-{
+void marshal_VkSubpassSampleLocationsEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkSubpassSampleLocationsEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->subpassIndex, sizeof(uint32_t));
-    marshal_VkSampleLocationsInfoEXT(vkStream, rootType, (VkSampleLocationsInfoEXT*)(&forMarshaling->sampleLocationsInfo));
+    marshal_VkSampleLocationsInfoEXT(
+        vkStream, rootType, (VkSampleLocationsInfoEXT*)(&forMarshaling->sampleLocationsInfo));
 }
 
-void unmarshal_VkSubpassSampleLocationsEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubpassSampleLocationsEXT* forUnmarshaling)
-{
+void unmarshal_VkSubpassSampleLocationsEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkSubpassSampleLocationsEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->subpassIndex, sizeof(uint32_t));
-    unmarshal_VkSampleLocationsInfoEXT(vkStream, rootType, (VkSampleLocationsInfoEXT*)(&forUnmarshaling->sampleLocationsInfo));
+    unmarshal_VkSampleLocationsInfoEXT(
+        vkStream, rootType, (VkSampleLocationsInfoEXT*)(&forUnmarshaling->sampleLocationsInfo));
 }
 
 void marshal_VkRenderPassSampleLocationsBeginInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkRenderPassSampleLocationsBeginInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkRenderPassSampleLocationsBeginInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((uint32_t*)&forMarshaling->attachmentInitialSampleLocationsCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->attachmentInitialSampleLocationsCount; ++i)
-        {
-            marshal_VkAttachmentSampleLocationsEXT(vkStream, rootType, (const VkAttachmentSampleLocationsEXT*)(forMarshaling->pAttachmentInitialSampleLocations + i));
+    vkStream->write((uint32_t*)&forMarshaling->attachmentInitialSampleLocationsCount,
+                    sizeof(uint32_t));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->attachmentInitialSampleLocationsCount;
+             ++i) {
+            marshal_VkAttachmentSampleLocationsEXT(
+                vkStream, rootType,
+                (const VkAttachmentSampleLocationsEXT*)(forMarshaling
+                                                            ->pAttachmentInitialSampleLocations +
+                                                        i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->postSubpassSampleLocationsCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->postSubpassSampleLocationsCount; ++i)
-        {
-            marshal_VkSubpassSampleLocationsEXT(vkStream, rootType, (const VkSubpassSampleLocationsEXT*)(forMarshaling->pPostSubpassSampleLocations + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->postSubpassSampleLocationsCount; ++i) {
+            marshal_VkSubpassSampleLocationsEXT(
+                vkStream, rootType,
+                (const VkSubpassSampleLocationsEXT*)(forMarshaling->pPostSubpassSampleLocations +
+                                                     i));
         }
     }
 }
 
 void unmarshal_VkRenderPassSampleLocationsBeginInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderPassSampleLocationsBeginInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkRenderPassSampleLocationsBeginInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((uint32_t*)&forUnmarshaling->attachmentInitialSampleLocationsCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pAttachmentInitialSampleLocations, forUnmarshaling->attachmentInitialSampleLocationsCount * sizeof(const VkAttachmentSampleLocationsEXT));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->attachmentInitialSampleLocationsCount; ++i)
-        {
-            unmarshal_VkAttachmentSampleLocationsEXT(vkStream, rootType, (VkAttachmentSampleLocationsEXT*)(forUnmarshaling->pAttachmentInitialSampleLocations + i));
+    vkStream->read((uint32_t*)&forUnmarshaling->attachmentInitialSampleLocationsCount,
+                   sizeof(uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pAttachmentInitialSampleLocations,
+                    forUnmarshaling->attachmentInitialSampleLocationsCount *
+                        sizeof(const VkAttachmentSampleLocationsEXT));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->attachmentInitialSampleLocationsCount;
+             ++i) {
+            unmarshal_VkAttachmentSampleLocationsEXT(
+                vkStream, rootType,
+                (VkAttachmentSampleLocationsEXT*)(forUnmarshaling
+                                                      ->pAttachmentInitialSampleLocations +
+                                                  i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->postSubpassSampleLocationsCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pPostSubpassSampleLocations, forUnmarshaling->postSubpassSampleLocationsCount * sizeof(const VkSubpassSampleLocationsEXT));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->postSubpassSampleLocationsCount; ++i)
-        {
-            unmarshal_VkSubpassSampleLocationsEXT(vkStream, rootType, (VkSubpassSampleLocationsEXT*)(forUnmarshaling->pPostSubpassSampleLocations + i));
+    vkStream->alloc((void**)&forUnmarshaling->pPostSubpassSampleLocations,
+                    forUnmarshaling->postSubpassSampleLocationsCount *
+                        sizeof(const VkSubpassSampleLocationsEXT));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->postSubpassSampleLocationsCount; ++i) {
+            unmarshal_VkSubpassSampleLocationsEXT(
+                vkStream, rootType,
+                (VkSubpassSampleLocationsEXT*)(forUnmarshaling->pPostSubpassSampleLocations + i));
         }
     }
 }
 
 void marshal_VkPipelineSampleLocationsStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineSampleLocationsStateCreateInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineSampleLocationsStateCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->sampleLocationsEnable, sizeof(VkBool32));
-    marshal_VkSampleLocationsInfoEXT(vkStream, rootType, (VkSampleLocationsInfoEXT*)(&forMarshaling->sampleLocationsInfo));
+    marshal_VkSampleLocationsInfoEXT(
+        vkStream, rootType, (VkSampleLocationsInfoEXT*)(&forMarshaling->sampleLocationsInfo));
 }
 
 void unmarshal_VkPipelineSampleLocationsStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineSampleLocationsStateCreateInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineSampleLocationsStateCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkBool32*)&forUnmarshaling->sampleLocationsEnable, sizeof(VkBool32));
-    unmarshal_VkSampleLocationsInfoEXT(vkStream, rootType, (VkSampleLocationsInfoEXT*)(&forUnmarshaling->sampleLocationsInfo));
+    unmarshal_VkSampleLocationsInfoEXT(
+        vkStream, rootType, (VkSampleLocationsInfoEXT*)(&forUnmarshaling->sampleLocationsInfo));
 }
 
 void marshal_VkPhysicalDeviceSampleLocationsPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceSampleLocationsPropertiesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceSampleLocationsPropertiesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkSampleCountFlags*)&forMarshaling->sampleLocationSampleCounts, sizeof(VkSampleCountFlags));
-    marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->maxSampleLocationGridSize));
+    vkStream->write((VkSampleCountFlags*)&forMarshaling->sampleLocationSampleCounts,
+                    sizeof(VkSampleCountFlags));
+    marshal_VkExtent2D(vkStream, rootType,
+                       (VkExtent2D*)(&forMarshaling->maxSampleLocationGridSize));
     vkStream->write((float*)forMarshaling->sampleLocationCoordinateRange, 2 * sizeof(float));
     vkStream->write((uint32_t*)&forMarshaling->sampleLocationSubPixelBits, sizeof(uint32_t));
     vkStream->write((VkBool32*)&forMarshaling->variableSampleLocations, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceSampleLocationsPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSampleLocationsPropertiesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceSampleLocationsPropertiesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkSampleCountFlags*)&forUnmarshaling->sampleLocationSampleCounts, sizeof(VkSampleCountFlags));
-    unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->maxSampleLocationGridSize));
+    vkStream->read((VkSampleCountFlags*)&forUnmarshaling->sampleLocationSampleCounts,
+                   sizeof(VkSampleCountFlags));
+    unmarshal_VkExtent2D(vkStream, rootType,
+                         (VkExtent2D*)(&forUnmarshaling->maxSampleLocationGridSize));
     vkStream->read((float*)forUnmarshaling->sampleLocationCoordinateRange, 2 * sizeof(float));
     vkStream->read((uint32_t*)&forUnmarshaling->sampleLocationSubPixelBits, sizeof(uint32_t));
     vkStream->read((VkBool32*)&forUnmarshaling->variableSampleLocations, sizeof(VkBool32));
 }
 
-void marshal_VkMultisamplePropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMultisamplePropertiesEXT* forMarshaling)
-{
+void marshal_VkMultisamplePropertiesEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                        const VkMultisamplePropertiesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->maxSampleLocationGridSize));
+    marshal_VkExtent2D(vkStream, rootType,
+                       (VkExtent2D*)(&forMarshaling->maxSampleLocationGridSize));
 }
 
-void unmarshal_VkMultisamplePropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMultisamplePropertiesEXT* forUnmarshaling)
-{
+void unmarshal_VkMultisamplePropertiesEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkMultisamplePropertiesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->maxSampleLocationGridSize));
+    unmarshal_VkExtent2D(vkStream, rootType,
+                         (VkExtent2D*)(&forUnmarshaling->maxSampleLocationGridSize));
 }
 
 #endif
 #ifdef VK_EXT_blend_operation_advanced
 void marshal_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -24050,25 +22678,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -24076,65 +22702,61 @@
 }
 
 void marshal_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->advancedBlendMaxColorAttachments, sizeof(uint32_t));
     vkStream->write((VkBool32*)&forMarshaling->advancedBlendIndependentBlend, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->advancedBlendNonPremultipliedSrcColor, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->advancedBlendNonPremultipliedDstColor, sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->advancedBlendNonPremultipliedSrcColor,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->advancedBlendNonPremultipliedDstColor,
+                    sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->advancedBlendCorrelatedOverlap, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->advancedBlendAllOperations, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->advancedBlendMaxColorAttachments, sizeof(uint32_t));
     vkStream->read((VkBool32*)&forUnmarshaling->advancedBlendIndependentBlend, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->advancedBlendNonPremultipliedSrcColor, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->advancedBlendNonPremultipliedDstColor, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->advancedBlendNonPremultipliedSrcColor,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->advancedBlendNonPremultipliedDstColor,
+                   sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->advancedBlendCorrelatedOverlap, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->advancedBlendAllOperations, sizeof(VkBool32));
 }
 
 void marshal_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineColorBlendAdvancedStateCreateInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineColorBlendAdvancedStateCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -24144,25 +22766,23 @@
 }
 
 void unmarshal_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineColorBlendAdvancedStateCreateInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineColorBlendAdvancedStateCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -24174,46 +22794,43 @@
 #endif
 #ifdef VK_NV_fragment_coverage_to_color
 void marshal_VkPipelineCoverageToColorStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineCoverageToColorStateCreateInfoNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineCoverageToColorStateCreateInfoNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkPipelineCoverageToColorStateCreateFlagsNV*)&forMarshaling->flags, sizeof(VkPipelineCoverageToColorStateCreateFlagsNV));
+    vkStream->write((VkPipelineCoverageToColorStateCreateFlagsNV*)&forMarshaling->flags,
+                    sizeof(VkPipelineCoverageToColorStateCreateFlagsNV));
     vkStream->write((VkBool32*)&forMarshaling->coverageToColorEnable, sizeof(VkBool32));
     vkStream->write((uint32_t*)&forMarshaling->coverageToColorLocation, sizeof(uint32_t));
 }
 
 void unmarshal_VkPipelineCoverageToColorStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineCoverageToColorStateCreateInfoNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineCoverageToColorStateCreateInfoNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkPipelineCoverageToColorStateCreateFlagsNV*)&forUnmarshaling->flags, sizeof(VkPipelineCoverageToColorStateCreateFlagsNV));
+    vkStream->read((VkPipelineCoverageToColorStateCreateFlagsNV*)&forUnmarshaling->flags,
+                   sizeof(VkPipelineCoverageToColorStateCreateFlagsNV));
     vkStream->read((VkBool32*)&forUnmarshaling->coverageToColorEnable, sizeof(VkBool32));
     vkStream->read((uint32_t*)&forUnmarshaling->coverageToColorLocation, sizeof(uint32_t));
 }
@@ -24221,63 +22838,63 @@
 #endif
 #ifdef VK_NV_framebuffer_mixed_samples
 void marshal_VkPipelineCoverageModulationStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineCoverageModulationStateCreateInfoNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineCoverageModulationStateCreateInfoNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkPipelineCoverageModulationStateCreateFlagsNV*)&forMarshaling->flags, sizeof(VkPipelineCoverageModulationStateCreateFlagsNV));
-    vkStream->write((VkCoverageModulationModeNV*)&forMarshaling->coverageModulationMode, sizeof(VkCoverageModulationModeNV));
+    vkStream->write((VkPipelineCoverageModulationStateCreateFlagsNV*)&forMarshaling->flags,
+                    sizeof(VkPipelineCoverageModulationStateCreateFlagsNV));
+    vkStream->write((VkCoverageModulationModeNV*)&forMarshaling->coverageModulationMode,
+                    sizeof(VkCoverageModulationModeNV));
     vkStream->write((VkBool32*)&forMarshaling->coverageModulationTableEnable, sizeof(VkBool32));
     vkStream->write((uint32_t*)&forMarshaling->coverageModulationTableCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pCoverageModulationTable;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pCoverageModulationTable)
-    {
-        vkStream->write((const float*)forMarshaling->pCoverageModulationTable, forMarshaling->coverageModulationTableCount * sizeof(const float));
+    if (forMarshaling->pCoverageModulationTable) {
+        vkStream->write((const float*)forMarshaling->pCoverageModulationTable,
+                        forMarshaling->coverageModulationTableCount * sizeof(const float));
     }
 }
 
 void unmarshal_VkPipelineCoverageModulationStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineCoverageModulationStateCreateInfoNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineCoverageModulationStateCreateInfoNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkPipelineCoverageModulationStateCreateFlagsNV*)&forUnmarshaling->flags, sizeof(VkPipelineCoverageModulationStateCreateFlagsNV));
-    vkStream->read((VkCoverageModulationModeNV*)&forUnmarshaling->coverageModulationMode, sizeof(VkCoverageModulationModeNV));
+    vkStream->read((VkPipelineCoverageModulationStateCreateFlagsNV*)&forUnmarshaling->flags,
+                   sizeof(VkPipelineCoverageModulationStateCreateFlagsNV));
+    vkStream->read((VkCoverageModulationModeNV*)&forUnmarshaling->coverageModulationMode,
+                   sizeof(VkCoverageModulationModeNV));
     vkStream->read((VkBool32*)&forUnmarshaling->coverageModulationTableEnable, sizeof(VkBool32));
     vkStream->read((uint32_t*)&forUnmarshaling->coverageModulationTableCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     forUnmarshaling->pCoverageModulationTable = (const float*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pCoverageModulationTable)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pCoverageModulationTable, forUnmarshaling->coverageModulationTableCount * sizeof(const float));
-        vkStream->read((float*)forUnmarshaling->pCoverageModulationTable, forUnmarshaling->coverageModulationTableCount * sizeof(const float));
+    if (forUnmarshaling->pCoverageModulationTable) {
+        vkStream->alloc((void**)&forUnmarshaling->pCoverageModulationTable,
+                        forUnmarshaling->coverageModulationTableCount * sizeof(const float));
+        vkStream->read((float*)forUnmarshaling->pCoverageModulationTable,
+                       forUnmarshaling->coverageModulationTableCount * sizeof(const float));
     }
 }
 
@@ -24286,14 +22903,11 @@
 #endif
 #ifdef VK_NV_shader_sm_builtins
 void marshal_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -24302,25 +22916,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -24329,14 +22941,11 @@
 }
 
 void marshal_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -24344,25 +22953,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -24374,36 +22981,30 @@
 #endif
 #ifdef VK_EXT_image_drm_format_modifier
 void marshal_VkDrmFormatModifierPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDrmFormatModifierPropertiesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkDrmFormatModifierPropertiesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((uint64_t*)&forMarshaling->drmFormatModifier, sizeof(uint64_t));
     vkStream->write((uint32_t*)&forMarshaling->drmFormatModifierPlaneCount, sizeof(uint32_t));
-    vkStream->write((VkFormatFeatureFlags*)&forMarshaling->drmFormatModifierTilingFeatures, sizeof(VkFormatFeatureFlags));
+    vkStream->write((VkFormatFeatureFlags*)&forMarshaling->drmFormatModifierTilingFeatures,
+                    sizeof(VkFormatFeatureFlags));
 }
 
-void unmarshal_VkDrmFormatModifierPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDrmFormatModifierPropertiesEXT* forUnmarshaling)
-{
+void unmarshal_VkDrmFormatModifierPropertiesEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkDrmFormatModifierPropertiesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint64_t*)&forUnmarshaling->drmFormatModifier, sizeof(uint64_t));
     vkStream->read((uint32_t*)&forUnmarshaling->drmFormatModifierPlaneCount, sizeof(uint32_t));
-    vkStream->read((VkFormatFeatureFlags*)&forUnmarshaling->drmFormatModifierTilingFeatures, sizeof(VkFormatFeatureFlags));
+    vkStream->read((VkFormatFeatureFlags*)&forUnmarshaling->drmFormatModifierTilingFeatures,
+                   sizeof(VkFormatFeatureFlags));
 }
 
 void marshal_VkDrmFormatModifierPropertiesListEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDrmFormatModifierPropertiesListEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkDrmFormatModifierPropertiesListEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -24411,66 +23012,66 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pDrmFormatModifierProperties;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pDrmFormatModifierProperties)
-    {
-        if (forMarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forMarshaling->drmFormatModifierCount; ++i)
-            {
-                marshal_VkDrmFormatModifierPropertiesEXT(vkStream, rootType, (VkDrmFormatModifierPropertiesEXT*)(forMarshaling->pDrmFormatModifierProperties + i));
+    if (forMarshaling->pDrmFormatModifierProperties) {
+        if (forMarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forMarshaling->drmFormatModifierCount; ++i) {
+                marshal_VkDrmFormatModifierPropertiesEXT(
+                    vkStream, rootType,
+                    (VkDrmFormatModifierPropertiesEXT*)(forMarshaling
+                                                            ->pDrmFormatModifierProperties +
+                                                        i));
             }
         }
     }
 }
 
 void unmarshal_VkDrmFormatModifierPropertiesListEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDrmFormatModifierPropertiesListEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDrmFormatModifierPropertiesListEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->drmFormatModifierCount, sizeof(uint32_t));
     // WARNING PTR CHECK
-    forUnmarshaling->pDrmFormatModifierProperties = (VkDrmFormatModifierPropertiesEXT*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pDrmFormatModifierProperties)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pDrmFormatModifierProperties, forUnmarshaling->drmFormatModifierCount * sizeof(VkDrmFormatModifierPropertiesEXT));
-        if (forUnmarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->drmFormatModifierCount; ++i)
-            {
-                unmarshal_VkDrmFormatModifierPropertiesEXT(vkStream, rootType, (VkDrmFormatModifierPropertiesEXT*)(forUnmarshaling->pDrmFormatModifierProperties + i));
+    forUnmarshaling->pDrmFormatModifierProperties =
+        (VkDrmFormatModifierPropertiesEXT*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pDrmFormatModifierProperties) {
+        vkStream->alloc(
+            (void**)&forUnmarshaling->pDrmFormatModifierProperties,
+            forUnmarshaling->drmFormatModifierCount * sizeof(VkDrmFormatModifierPropertiesEXT));
+        if (forUnmarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->drmFormatModifierCount; ++i) {
+                unmarshal_VkDrmFormatModifierPropertiesEXT(
+                    vkStream, rootType,
+                    (VkDrmFormatModifierPropertiesEXT*)(forUnmarshaling
+                                                            ->pDrmFormatModifierProperties +
+                                                        i));
             }
         }
     }
 }
 
 void marshal_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceImageDrmFormatModifierInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceImageDrmFormatModifierInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -24480,32 +23081,30 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pQueueFamilyIndices;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pQueueFamilyIndices)
-    {
-        vkStream->write((const uint32_t*)forMarshaling->pQueueFamilyIndices, forMarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
+    if (forMarshaling->pQueueFamilyIndices) {
+        vkStream->write((const uint32_t*)forMarshaling->pQueueFamilyIndices,
+                        forMarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
     }
 }
 
 void unmarshal_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceImageDrmFormatModifierInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceImageDrmFormatModifierInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -24514,124 +23113,115 @@
     vkStream->read((uint32_t*)&forUnmarshaling->queueFamilyIndexCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     forUnmarshaling->pQueueFamilyIndices = (const uint32_t*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pQueueFamilyIndices)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pQueueFamilyIndices, forUnmarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
-        vkStream->read((uint32_t*)forUnmarshaling->pQueueFamilyIndices, forUnmarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
+    if (forUnmarshaling->pQueueFamilyIndices) {
+        vkStream->alloc((void**)&forUnmarshaling->pQueueFamilyIndices,
+                        forUnmarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
+        vkStream->read((uint32_t*)forUnmarshaling->pQueueFamilyIndices,
+                       forUnmarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
     }
 }
 
 void marshal_VkImageDrmFormatModifierListCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageDrmFormatModifierListCreateInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkImageDrmFormatModifierListCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->drmFormatModifierCount, sizeof(uint32_t));
-    vkStream->write((const uint64_t*)forMarshaling->pDrmFormatModifiers, forMarshaling->drmFormatModifierCount * sizeof(const uint64_t));
+    vkStream->write((const uint64_t*)forMarshaling->pDrmFormatModifiers,
+                    forMarshaling->drmFormatModifierCount * sizeof(const uint64_t));
 }
 
 void unmarshal_VkImageDrmFormatModifierListCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageDrmFormatModifierListCreateInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImageDrmFormatModifierListCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->drmFormatModifierCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pDrmFormatModifiers, forUnmarshaling->drmFormatModifierCount * sizeof(const uint64_t));
-    vkStream->read((uint64_t*)forUnmarshaling->pDrmFormatModifiers, forUnmarshaling->drmFormatModifierCount * sizeof(const uint64_t));
+    vkStream->alloc((void**)&forUnmarshaling->pDrmFormatModifiers,
+                    forUnmarshaling->drmFormatModifierCount * sizeof(const uint64_t));
+    vkStream->read((uint64_t*)forUnmarshaling->pDrmFormatModifiers,
+                   forUnmarshaling->drmFormatModifierCount * sizeof(const uint64_t));
 }
 
 void marshal_VkImageDrmFormatModifierExplicitCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageDrmFormatModifierExplicitCreateInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkImageDrmFormatModifierExplicitCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint64_t*)&forMarshaling->drmFormatModifier, sizeof(uint64_t));
     vkStream->write((uint32_t*)&forMarshaling->drmFormatModifierPlaneCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->drmFormatModifierPlaneCount; ++i)
-        {
-            marshal_VkSubresourceLayout(vkStream, rootType, (const VkSubresourceLayout*)(forMarshaling->pPlaneLayouts + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->drmFormatModifierPlaneCount; ++i) {
+            marshal_VkSubresourceLayout(
+                vkStream, rootType, (const VkSubresourceLayout*)(forMarshaling->pPlaneLayouts + i));
         }
     }
 }
 
 void unmarshal_VkImageDrmFormatModifierExplicitCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageDrmFormatModifierExplicitCreateInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImageDrmFormatModifierExplicitCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint64_t*)&forUnmarshaling->drmFormatModifier, sizeof(uint64_t));
     vkStream->read((uint32_t*)&forUnmarshaling->drmFormatModifierPlaneCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pPlaneLayouts, forUnmarshaling->drmFormatModifierPlaneCount * sizeof(const VkSubresourceLayout));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->drmFormatModifierPlaneCount; ++i)
-        {
-            unmarshal_VkSubresourceLayout(vkStream, rootType, (VkSubresourceLayout*)(forUnmarshaling->pPlaneLayouts + i));
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pPlaneLayouts,
+        forUnmarshaling->drmFormatModifierPlaneCount * sizeof(const VkSubresourceLayout));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->drmFormatModifierPlaneCount; ++i) {
+            unmarshal_VkSubresourceLayout(
+                vkStream, rootType, (VkSubresourceLayout*)(forUnmarshaling->pPlaneLayouts + i));
         }
     }
 }
 
 void marshal_VkImageDrmFormatModifierPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageDrmFormatModifierPropertiesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkImageDrmFormatModifierPropertiesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -24639,25 +23229,23 @@
 }
 
 void unmarshal_VkImageDrmFormatModifierPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageDrmFormatModifierPropertiesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImageDrmFormatModifierPropertiesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -24665,36 +23253,31 @@
 }
 
 void marshal_VkDrmFormatModifierProperties2EXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDrmFormatModifierProperties2EXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkDrmFormatModifierProperties2EXT* forMarshaling) {
     (void)rootType;
     vkStream->write((uint64_t*)&forMarshaling->drmFormatModifier, sizeof(uint64_t));
     vkStream->write((uint32_t*)&forMarshaling->drmFormatModifierPlaneCount, sizeof(uint32_t));
-    vkStream->write((VkFormatFeatureFlags2KHR*)&forMarshaling->drmFormatModifierTilingFeatures, sizeof(VkFormatFeatureFlags2KHR));
+    vkStream->write((VkFormatFeatureFlags2KHR*)&forMarshaling->drmFormatModifierTilingFeatures,
+                    sizeof(VkFormatFeatureFlags2KHR));
 }
 
 void unmarshal_VkDrmFormatModifierProperties2EXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDrmFormatModifierProperties2EXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDrmFormatModifierProperties2EXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint64_t*)&forUnmarshaling->drmFormatModifier, sizeof(uint64_t));
     vkStream->read((uint32_t*)&forUnmarshaling->drmFormatModifierPlaneCount, sizeof(uint32_t));
-    vkStream->read((VkFormatFeatureFlags2KHR*)&forUnmarshaling->drmFormatModifierTilingFeatures, sizeof(VkFormatFeatureFlags2KHR));
+    vkStream->read((VkFormatFeatureFlags2KHR*)&forUnmarshaling->drmFormatModifierTilingFeatures,
+                   sizeof(VkFormatFeatureFlags2KHR));
 }
 
 void marshal_VkDrmFormatModifierPropertiesList2EXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDrmFormatModifierPropertiesList2EXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkDrmFormatModifierPropertiesList2EXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -24702,52 +23285,55 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pDrmFormatModifierProperties;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pDrmFormatModifierProperties)
-    {
-        if (forMarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forMarshaling->drmFormatModifierCount; ++i)
-            {
-                marshal_VkDrmFormatModifierProperties2EXT(vkStream, rootType, (VkDrmFormatModifierProperties2EXT*)(forMarshaling->pDrmFormatModifierProperties + i));
+    if (forMarshaling->pDrmFormatModifierProperties) {
+        if (forMarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forMarshaling->drmFormatModifierCount; ++i) {
+                marshal_VkDrmFormatModifierProperties2EXT(
+                    vkStream, rootType,
+                    (VkDrmFormatModifierProperties2EXT*)(forMarshaling
+                                                             ->pDrmFormatModifierProperties +
+                                                         i));
             }
         }
     }
 }
 
 void unmarshal_VkDrmFormatModifierPropertiesList2EXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDrmFormatModifierPropertiesList2EXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDrmFormatModifierPropertiesList2EXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->drmFormatModifierCount, sizeof(uint32_t));
     // WARNING PTR CHECK
-    forUnmarshaling->pDrmFormatModifierProperties = (VkDrmFormatModifierProperties2EXT*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pDrmFormatModifierProperties)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pDrmFormatModifierProperties, forUnmarshaling->drmFormatModifierCount * sizeof(VkDrmFormatModifierProperties2EXT));
-        if (forUnmarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->drmFormatModifierCount; ++i)
-            {
-                unmarshal_VkDrmFormatModifierProperties2EXT(vkStream, rootType, (VkDrmFormatModifierProperties2EXT*)(forUnmarshaling->pDrmFormatModifierProperties + i));
+    forUnmarshaling->pDrmFormatModifierProperties =
+        (VkDrmFormatModifierProperties2EXT*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pDrmFormatModifierProperties) {
+        vkStream->alloc(
+            (void**)&forUnmarshaling->pDrmFormatModifierProperties,
+            forUnmarshaling->drmFormatModifierCount * sizeof(VkDrmFormatModifierProperties2EXT));
+        if (forUnmarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->drmFormatModifierCount; ++i) {
+                unmarshal_VkDrmFormatModifierProperties2EXT(
+                    vkStream, rootType,
+                    (VkDrmFormatModifierProperties2EXT*)(forUnmarshaling
+                                                             ->pDrmFormatModifierProperties +
+                                                         i));
             }
         }
     }
@@ -24755,96 +23341,91 @@
 
 #endif
 #ifdef VK_EXT_validation_cache
-void marshal_VkValidationCacheCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkValidationCacheCreateInfoEXT* forMarshaling)
-{
+void marshal_VkValidationCacheCreateInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                            const VkValidationCacheCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkValidationCacheCreateFlagsEXT*)&forMarshaling->flags, sizeof(VkValidationCacheCreateFlagsEXT));
+    vkStream->write((VkValidationCacheCreateFlagsEXT*)&forMarshaling->flags,
+                    sizeof(VkValidationCacheCreateFlagsEXT));
     uint64_t cgen_var_0 = (uint64_t)forMarshaling->initialDataSize;
     vkStream->putBe64(cgen_var_0);
-    vkStream->write((const void*)forMarshaling->pInitialData, forMarshaling->initialDataSize * sizeof(const uint8_t));
+    vkStream->write((const void*)forMarshaling->pInitialData,
+                    forMarshaling->initialDataSize * sizeof(const uint8_t));
 }
 
-void unmarshal_VkValidationCacheCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkValidationCacheCreateInfoEXT* forUnmarshaling)
-{
+void unmarshal_VkValidationCacheCreateInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkValidationCacheCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkValidationCacheCreateFlagsEXT*)&forUnmarshaling->flags, sizeof(VkValidationCacheCreateFlagsEXT));
+    vkStream->read((VkValidationCacheCreateFlagsEXT*)&forUnmarshaling->flags,
+                   sizeof(VkValidationCacheCreateFlagsEXT));
     forUnmarshaling->initialDataSize = (size_t)vkStream->getBe64();
-    vkStream->alloc((void**)&forUnmarshaling->pInitialData, forUnmarshaling->initialDataSize * sizeof(const uint8_t));
-    vkStream->read((void*)forUnmarshaling->pInitialData, forUnmarshaling->initialDataSize * sizeof(const uint8_t));
+    vkStream->alloc((void**)&forUnmarshaling->pInitialData,
+                    forUnmarshaling->initialDataSize * sizeof(const uint8_t));
+    vkStream->read((void*)forUnmarshaling->pInitialData,
+                   forUnmarshaling->initialDataSize * sizeof(const uint8_t));
 }
 
 void marshal_VkShaderModuleValidationCacheCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkShaderModuleValidationCacheCreateInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkShaderModuleValidationCacheCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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_VkValidationCacheEXT_u64(&forMarshaling->validationCache, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkValidationCacheEXT_u64(&forMarshaling->validationCache,
+                                                                   &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
 }
 
 void unmarshal_VkShaderModuleValidationCacheCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkShaderModuleValidationCacheCreateInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkShaderModuleValidationCacheCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkValidationCacheEXT(&cgen_var_0, (VkValidationCacheEXT*)&forUnmarshaling->validationCache, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkValidationCacheEXT(
+        &cgen_var_0, (VkValidationCacheEXT*)&forUnmarshaling->validationCache, 1);
 }
 
 #endif
@@ -24853,36 +23434,33 @@
 #ifdef VK_EXT_shader_viewport_index_layer
 #endif
 #ifdef VK_NV_shading_rate_image
-void marshal_VkShadingRatePaletteNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkShadingRatePaletteNV* forMarshaling)
-{
+void marshal_VkShadingRatePaletteNV(VulkanStream* vkStream, VkStructureType rootType,
+                                    const VkShadingRatePaletteNV* forMarshaling) {
     (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->shadingRatePaletteEntryCount, sizeof(uint32_t));
-    vkStream->write((const VkShadingRatePaletteEntryNV*)forMarshaling->pShadingRatePaletteEntries, forMarshaling->shadingRatePaletteEntryCount * sizeof(const VkShadingRatePaletteEntryNV));
+    vkStream->write(
+        (const VkShadingRatePaletteEntryNV*)forMarshaling->pShadingRatePaletteEntries,
+        forMarshaling->shadingRatePaletteEntryCount * sizeof(const VkShadingRatePaletteEntryNV));
 }
 
-void unmarshal_VkShadingRatePaletteNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkShadingRatePaletteNV* forUnmarshaling)
-{
+void unmarshal_VkShadingRatePaletteNV(VulkanStream* vkStream, VkStructureType rootType,
+                                      VkShadingRatePaletteNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->shadingRatePaletteEntryCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pShadingRatePaletteEntries, forUnmarshaling->shadingRatePaletteEntryCount * sizeof(const VkShadingRatePaletteEntryNV));
-    vkStream->read((VkShadingRatePaletteEntryNV*)forUnmarshaling->pShadingRatePaletteEntries, forUnmarshaling->shadingRatePaletteEntryCount * sizeof(const VkShadingRatePaletteEntryNV));
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pShadingRatePaletteEntries,
+        forUnmarshaling->shadingRatePaletteEntryCount * sizeof(const VkShadingRatePaletteEntryNV));
+    vkStream->read(
+        (VkShadingRatePaletteEntryNV*)forUnmarshaling->pShadingRatePaletteEntries,
+        forUnmarshaling->shadingRatePaletteEntryCount * sizeof(const VkShadingRatePaletteEntryNV));
 }
 
 void marshal_VkPipelineViewportShadingRateImageStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineViewportShadingRateImageStateCreateInfoNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineViewportShadingRateImageStateCreateInfoNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -24891,67 +23469,62 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pShadingRatePalettes;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pShadingRatePalettes)
-    {
-        if (forMarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forMarshaling->viewportCount; ++i)
-            {
-                marshal_VkShadingRatePaletteNV(vkStream, rootType, (const VkShadingRatePaletteNV*)(forMarshaling->pShadingRatePalettes + i));
+    if (forMarshaling->pShadingRatePalettes) {
+        if (forMarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forMarshaling->viewportCount; ++i) {
+                marshal_VkShadingRatePaletteNV(
+                    vkStream, rootType,
+                    (const VkShadingRatePaletteNV*)(forMarshaling->pShadingRatePalettes + i));
             }
         }
     }
 }
 
 void unmarshal_VkPipelineViewportShadingRateImageStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineViewportShadingRateImageStateCreateInfoNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineViewportShadingRateImageStateCreateInfoNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkBool32*)&forUnmarshaling->shadingRateImageEnable, sizeof(VkBool32));
     vkStream->read((uint32_t*)&forUnmarshaling->viewportCount, sizeof(uint32_t));
     // WARNING PTR CHECK
-    forUnmarshaling->pShadingRatePalettes = (const VkShadingRatePaletteNV*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pShadingRatePalettes)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pShadingRatePalettes, forUnmarshaling->viewportCount * sizeof(const VkShadingRatePaletteNV));
-        if (forUnmarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->viewportCount; ++i)
-            {
-                unmarshal_VkShadingRatePaletteNV(vkStream, rootType, (VkShadingRatePaletteNV*)(forUnmarshaling->pShadingRatePalettes + i));
+    forUnmarshaling->pShadingRatePalettes =
+        (const VkShadingRatePaletteNV*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pShadingRatePalettes) {
+        vkStream->alloc((void**)&forUnmarshaling->pShadingRatePalettes,
+                        forUnmarshaling->viewportCount * sizeof(const VkShadingRatePaletteNV));
+        if (forUnmarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->viewportCount; ++i) {
+                unmarshal_VkShadingRatePaletteNV(
+                    vkStream, rootType,
+                    (VkShadingRatePaletteNV*)(forUnmarshaling->pShadingRatePalettes + i));
             }
         }
     }
 }
 
 void marshal_VkPhysicalDeviceShadingRateImageFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceShadingRateImageFeaturesNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceShadingRateImageFeaturesNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -24960,25 +23533,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceShadingRateImageFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShadingRateImageFeaturesNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShadingRateImageFeaturesNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -24987,14 +23558,11 @@
 }
 
 void marshal_VkPhysicalDeviceShadingRateImagePropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceShadingRateImagePropertiesNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceShadingRateImagePropertiesNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -25004,25 +23572,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceShadingRateImagePropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShadingRateImagePropertiesNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShadingRateImagePropertiesNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -25031,119 +23597,109 @@
     vkStream->read((uint32_t*)&forUnmarshaling->shadingRateMaxCoarseSamples, sizeof(uint32_t));
 }
 
-void marshal_VkCoarseSampleLocationNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCoarseSampleLocationNV* forMarshaling)
-{
+void marshal_VkCoarseSampleLocationNV(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkCoarseSampleLocationNV* forMarshaling) {
     (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->pixelX, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->pixelY, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->sample, sizeof(uint32_t));
 }
 
-void unmarshal_VkCoarseSampleLocationNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCoarseSampleLocationNV* forUnmarshaling)
-{
+void unmarshal_VkCoarseSampleLocationNV(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkCoarseSampleLocationNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->pixelX, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->pixelY, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->sample, sizeof(uint32_t));
 }
 
-void marshal_VkCoarseSampleOrderCustomNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCoarseSampleOrderCustomNV* forMarshaling)
-{
+void marshal_VkCoarseSampleOrderCustomNV(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkCoarseSampleOrderCustomNV* forMarshaling) {
     (void)rootType;
-    vkStream->write((VkShadingRatePaletteEntryNV*)&forMarshaling->shadingRate, sizeof(VkShadingRatePaletteEntryNV));
+    vkStream->write((VkShadingRatePaletteEntryNV*)&forMarshaling->shadingRate,
+                    sizeof(VkShadingRatePaletteEntryNV));
     vkStream->write((uint32_t*)&forMarshaling->sampleCount, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->sampleLocationCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->sampleLocationCount; ++i)
-        {
-            marshal_VkCoarseSampleLocationNV(vkStream, rootType, (const VkCoarseSampleLocationNV*)(forMarshaling->pSampleLocations + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->sampleLocationCount; ++i) {
+            marshal_VkCoarseSampleLocationNV(
+                vkStream, rootType,
+                (const VkCoarseSampleLocationNV*)(forMarshaling->pSampleLocations + i));
         }
     }
 }
 
-void unmarshal_VkCoarseSampleOrderCustomNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCoarseSampleOrderCustomNV* forUnmarshaling)
-{
+void unmarshal_VkCoarseSampleOrderCustomNV(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkCoarseSampleOrderCustomNV* forUnmarshaling) {
     (void)rootType;
-    vkStream->read((VkShadingRatePaletteEntryNV*)&forUnmarshaling->shadingRate, sizeof(VkShadingRatePaletteEntryNV));
+    vkStream->read((VkShadingRatePaletteEntryNV*)&forUnmarshaling->shadingRate,
+                   sizeof(VkShadingRatePaletteEntryNV));
     vkStream->read((uint32_t*)&forUnmarshaling->sampleCount, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->sampleLocationCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pSampleLocations, forUnmarshaling->sampleLocationCount * sizeof(const VkCoarseSampleLocationNV));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->sampleLocationCount; ++i)
-        {
-            unmarshal_VkCoarseSampleLocationNV(vkStream, rootType, (VkCoarseSampleLocationNV*)(forUnmarshaling->pSampleLocations + i));
+    vkStream->alloc((void**)&forUnmarshaling->pSampleLocations,
+                    forUnmarshaling->sampleLocationCount * sizeof(const VkCoarseSampleLocationNV));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->sampleLocationCount; ++i) {
+            unmarshal_VkCoarseSampleLocationNV(
+                vkStream, rootType,
+                (VkCoarseSampleLocationNV*)(forUnmarshaling->pSampleLocations + i));
         }
     }
 }
 
 void marshal_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkCoarseSampleOrderTypeNV*)&forMarshaling->sampleOrderType, sizeof(VkCoarseSampleOrderTypeNV));
+    vkStream->write((VkCoarseSampleOrderTypeNV*)&forMarshaling->sampleOrderType,
+                    sizeof(VkCoarseSampleOrderTypeNV));
     vkStream->write((uint32_t*)&forMarshaling->customSampleOrderCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->customSampleOrderCount; ++i)
-        {
-            marshal_VkCoarseSampleOrderCustomNV(vkStream, rootType, (const VkCoarseSampleOrderCustomNV*)(forMarshaling->pCustomSampleOrders + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->customSampleOrderCount; ++i) {
+            marshal_VkCoarseSampleOrderCustomNV(
+                vkStream, rootType,
+                (const VkCoarseSampleOrderCustomNV*)(forMarshaling->pCustomSampleOrders + i));
         }
     }
 }
 
 void unmarshal_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkCoarseSampleOrderTypeNV*)&forUnmarshaling->sampleOrderType, sizeof(VkCoarseSampleOrderTypeNV));
+    vkStream->read((VkCoarseSampleOrderTypeNV*)&forUnmarshaling->sampleOrderType,
+                   sizeof(VkCoarseSampleOrderTypeNV));
     vkStream->read((uint32_t*)&forUnmarshaling->customSampleOrderCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pCustomSampleOrders, forUnmarshaling->customSampleOrderCount * sizeof(const VkCoarseSampleOrderCustomNV));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->customSampleOrderCount; ++i)
-        {
-            unmarshal_VkCoarseSampleOrderCustomNV(vkStream, rootType, (VkCoarseSampleOrderCustomNV*)(forUnmarshaling->pCustomSampleOrders + i));
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pCustomSampleOrders,
+        forUnmarshaling->customSampleOrderCount * sizeof(const VkCoarseSampleOrderCustomNV));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->customSampleOrderCount; ++i) {
+            unmarshal_VkCoarseSampleOrderCustomNV(
+                vkStream, rootType,
+                (VkCoarseSampleOrderCustomNV*)(forUnmarshaling->pCustomSampleOrders + i));
         }
     }
 }
@@ -25151,18 +23707,16 @@
 #endif
 #ifdef VK_NV_ray_tracing
 void marshal_VkRayTracingShaderGroupCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkRayTracingShaderGroupCreateInfoNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkRayTracingShaderGroupCreateInfoNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkRayTracingShaderGroupTypeKHR*)&forMarshaling->type, sizeof(VkRayTracingShaderGroupTypeKHR));
+    vkStream->write((VkRayTracingShaderGroupTypeKHR*)&forMarshaling->type,
+                    sizeof(VkRayTracingShaderGroupTypeKHR));
     vkStream->write((uint32_t*)&forMarshaling->generalShader, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->closestHitShader, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->anyHitShader, sizeof(uint32_t));
@@ -25170,29 +23724,28 @@
 }
 
 void unmarshal_VkRayTracingShaderGroupCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRayTracingShaderGroupCreateInfoNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkRayTracingShaderGroupCreateInfoNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkRayTracingShaderGroupTypeKHR*)&forUnmarshaling->type, sizeof(VkRayTracingShaderGroupTypeKHR));
+    vkStream->read((VkRayTracingShaderGroupTypeKHR*)&forUnmarshaling->type,
+                   sizeof(VkRayTracingShaderGroupTypeKHR));
     vkStream->read((uint32_t*)&forUnmarshaling->generalShader, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->closestHitShader, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->anyHitShader, sizeof(uint32_t));
@@ -25200,105 +23753,102 @@
 }
 
 void marshal_VkRayTracingPipelineCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkRayTracingPipelineCreateInfoNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkRayTracingPipelineCreateInfoNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkPipelineCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineCreateFlags));
     vkStream->write((uint32_t*)&forMarshaling->stageCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->stageCount; ++i)
-        {
-            marshal_VkPipelineShaderStageCreateInfo(vkStream, rootType, (const VkPipelineShaderStageCreateInfo*)(forMarshaling->pStages + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->stageCount; ++i) {
+            marshal_VkPipelineShaderStageCreateInfo(
+                vkStream, rootType,
+                (const VkPipelineShaderStageCreateInfo*)(forMarshaling->pStages + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->groupCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->groupCount; ++i)
-        {
-            marshal_VkRayTracingShaderGroupCreateInfoNV(vkStream, rootType, (const VkRayTracingShaderGroupCreateInfoNV*)(forMarshaling->pGroups + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->groupCount; ++i) {
+            marshal_VkRayTracingShaderGroupCreateInfoNV(
+                vkStream, rootType,
+                (const VkRayTracingShaderGroupCreateInfoNV*)(forMarshaling->pGroups + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->maxRecursionDepth, sizeof(uint32_t));
     uint64_t cgen_var_0;
-    vkStream->handleMapping()->mapHandles_VkPipelineLayout_u64(&forMarshaling->layout, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkPipelineLayout_u64(&forMarshaling->layout, &cgen_var_0,
+                                                               1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     uint64_t cgen_var_1;
-    vkStream->handleMapping()->mapHandles_VkPipeline_u64(&forMarshaling->basePipelineHandle, &cgen_var_1, 1);
+    vkStream->handleMapping()->mapHandles_VkPipeline_u64(&forMarshaling->basePipelineHandle,
+                                                         &cgen_var_1, 1);
     vkStream->write((uint64_t*)&cgen_var_1, 1 * 8);
     vkStream->write((int32_t*)&forMarshaling->basePipelineIndex, sizeof(int32_t));
 }
 
-void unmarshal_VkRayTracingPipelineCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRayTracingPipelineCreateInfoNV* forUnmarshaling)
-{
+void unmarshal_VkRayTracingPipelineCreateInfoNV(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkRayTracingPipelineCreateInfoNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkPipelineCreateFlags*)&forUnmarshaling->flags, sizeof(VkPipelineCreateFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->stageCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pStages, forUnmarshaling->stageCount * sizeof(const VkPipelineShaderStageCreateInfo));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->stageCount; ++i)
-        {
-            unmarshal_VkPipelineShaderStageCreateInfo(vkStream, rootType, (VkPipelineShaderStageCreateInfo*)(forUnmarshaling->pStages + i));
+    vkStream->alloc((void**)&forUnmarshaling->pStages,
+                    forUnmarshaling->stageCount * sizeof(const VkPipelineShaderStageCreateInfo));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->stageCount; ++i) {
+            unmarshal_VkPipelineShaderStageCreateInfo(
+                vkStream, rootType,
+                (VkPipelineShaderStageCreateInfo*)(forUnmarshaling->pStages + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->groupCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pGroups, forUnmarshaling->groupCount * sizeof(const VkRayTracingShaderGroupCreateInfoNV));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->groupCount; ++i)
-        {
-            unmarshal_VkRayTracingShaderGroupCreateInfoNV(vkStream, rootType, (VkRayTracingShaderGroupCreateInfoNV*)(forUnmarshaling->pGroups + i));
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pGroups,
+        forUnmarshaling->groupCount * sizeof(const VkRayTracingShaderGroupCreateInfoNV));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->groupCount; ++i) {
+            unmarshal_VkRayTracingShaderGroupCreateInfoNV(
+                vkStream, rootType,
+                (VkRayTracingShaderGroupCreateInfoNV*)(forUnmarshaling->pGroups + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->maxRecursionDepth, sizeof(uint32_t));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkPipelineLayout(&cgen_var_0, (VkPipelineLayout*)&forUnmarshaling->layout, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkPipelineLayout(
+        &cgen_var_0, (VkPipelineLayout*)&forUnmarshaling->layout, 1);
     uint64_t cgen_var_1;
     vkStream->read((uint64_t*)&cgen_var_1, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkPipeline(&cgen_var_1, (VkPipeline*)&forUnmarshaling->basePipelineHandle, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkPipeline(
+        &cgen_var_1, (VkPipeline*)&forUnmarshaling->basePipelineHandle, 1);
     vkStream->read((int32_t*)&forUnmarshaling->basePipelineIndex, sizeof(int32_t));
 }
 
-void marshal_VkGeometryTrianglesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkGeometryTrianglesNV* forMarshaling)
-{
+void marshal_VkGeometryTrianglesNV(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkGeometryTrianglesNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -25316,62 +23866,59 @@
     vkStream->write((uint32_t*)&forMarshaling->indexCount, sizeof(uint32_t));
     vkStream->write((VkIndexType*)&forMarshaling->indexType, sizeof(VkIndexType));
     uint64_t cgen_var_2;
-    vkStream->handleMapping()->mapHandles_VkBuffer_u64(&forMarshaling->transformData, &cgen_var_2, 1);
+    vkStream->handleMapping()->mapHandles_VkBuffer_u64(&forMarshaling->transformData, &cgen_var_2,
+                                                       1);
     vkStream->write((uint64_t*)&cgen_var_2, 1 * 8);
     vkStream->write((VkDeviceSize*)&forMarshaling->transformOffset, sizeof(VkDeviceSize));
 }
 
-void unmarshal_VkGeometryTrianglesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkGeometryTrianglesNV* forUnmarshaling)
-{
+void unmarshal_VkGeometryTrianglesNV(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkGeometryTrianglesNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkBuffer(&cgen_var_0, (VkBuffer*)&forUnmarshaling->vertexData, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_0,
+                                                       (VkBuffer*)&forUnmarshaling->vertexData, 1);
     vkStream->read((VkDeviceSize*)&forUnmarshaling->vertexOffset, sizeof(VkDeviceSize));
     vkStream->read((uint32_t*)&forUnmarshaling->vertexCount, sizeof(uint32_t));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->vertexStride, sizeof(VkDeviceSize));
     vkStream->read((VkFormat*)&forUnmarshaling->vertexFormat, sizeof(VkFormat));
     uint64_t cgen_var_1;
     vkStream->read((uint64_t*)&cgen_var_1, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_1, (VkBuffer*)&forUnmarshaling->indexData, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_1,
+                                                       (VkBuffer*)&forUnmarshaling->indexData, 1);
     vkStream->read((VkDeviceSize*)&forUnmarshaling->indexOffset, sizeof(VkDeviceSize));
     vkStream->read((uint32_t*)&forUnmarshaling->indexCount, sizeof(uint32_t));
     vkStream->read((VkIndexType*)&forUnmarshaling->indexType, sizeof(VkIndexType));
     uint64_t cgen_var_2;
     vkStream->read((uint64_t*)&cgen_var_2, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_2, (VkBuffer*)&forUnmarshaling->transformData, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkBuffer(
+        &cgen_var_2, (VkBuffer*)&forUnmarshaling->transformData, 1);
     vkStream->read((VkDeviceSize*)&forUnmarshaling->transformOffset, sizeof(VkDeviceSize));
 }
 
-void marshal_VkGeometryAABBNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkGeometryAABBNV* forMarshaling)
-{
+void marshal_VkGeometryAABBNV(VulkanStream* vkStream, VkStructureType rootType,
+                              const VkGeometryAABBNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -25383,66 +23930,56 @@
     vkStream->write((VkDeviceSize*)&forMarshaling->offset, sizeof(VkDeviceSize));
 }
 
-void unmarshal_VkGeometryAABBNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkGeometryAABBNV* forUnmarshaling)
-{
+void unmarshal_VkGeometryAABBNV(VulkanStream* vkStream, VkStructureType rootType,
+                                VkGeometryAABBNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkBuffer(&cgen_var_0, (VkBuffer*)&forUnmarshaling->aabbData, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_0,
+                                                       (VkBuffer*)&forUnmarshaling->aabbData, 1);
     vkStream->read((uint32_t*)&forUnmarshaling->numAABBs, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->stride, sizeof(uint32_t));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->offset, sizeof(VkDeviceSize));
 }
 
-void marshal_VkGeometryDataNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkGeometryDataNV* forMarshaling)
-{
+void marshal_VkGeometryDataNV(VulkanStream* vkStream, VkStructureType rootType,
+                              const VkGeometryDataNV* forMarshaling) {
     (void)rootType;
-    marshal_VkGeometryTrianglesNV(vkStream, rootType, (VkGeometryTrianglesNV*)(&forMarshaling->triangles));
+    marshal_VkGeometryTrianglesNV(vkStream, rootType,
+                                  (VkGeometryTrianglesNV*)(&forMarshaling->triangles));
     marshal_VkGeometryAABBNV(vkStream, rootType, (VkGeometryAABBNV*)(&forMarshaling->aabbs));
 }
 
-void unmarshal_VkGeometryDataNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkGeometryDataNV* forUnmarshaling)
-{
+void unmarshal_VkGeometryDataNV(VulkanStream* vkStream, VkStructureType rootType,
+                                VkGeometryDataNV* forUnmarshaling) {
     (void)rootType;
-    unmarshal_VkGeometryTrianglesNV(vkStream, rootType, (VkGeometryTrianglesNV*)(&forUnmarshaling->triangles));
+    unmarshal_VkGeometryTrianglesNV(vkStream, rootType,
+                                    (VkGeometryTrianglesNV*)(&forUnmarshaling->triangles));
     unmarshal_VkGeometryAABBNV(vkStream, rootType, (VkGeometryAABBNV*)(&forUnmarshaling->aabbs));
 }
 
-void marshal_VkGeometryNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkGeometryNV* forMarshaling)
-{
+void marshal_VkGeometryNV(VulkanStream* vkStream, VkStructureType rootType,
+                          const VkGeometryNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -25451,26 +23988,23 @@
     vkStream->write((VkGeometryFlagsKHR*)&forMarshaling->flags, sizeof(VkGeometryFlagsKHR));
 }
 
-void unmarshal_VkGeometryNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkGeometryNV* forUnmarshaling)
-{
+void unmarshal_VkGeometryNV(VulkanStream* vkStream, VkStructureType rootType,
+                            VkGeometryNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -25479,178 +24013,170 @@
     vkStream->read((VkGeometryFlagsKHR*)&forUnmarshaling->flags, sizeof(VkGeometryFlagsKHR));
 }
 
-void marshal_VkAccelerationStructureInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAccelerationStructureInfoNV* forMarshaling)
-{
+void marshal_VkAccelerationStructureInfoNV(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkAccelerationStructureInfoNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkAccelerationStructureTypeNV*)&forMarshaling->type, sizeof(VkAccelerationStructureTypeNV));
-    vkStream->write((VkBuildAccelerationStructureFlagsNV*)&forMarshaling->flags, sizeof(VkBuildAccelerationStructureFlagsNV));
+    vkStream->write((VkAccelerationStructureTypeNV*)&forMarshaling->type,
+                    sizeof(VkAccelerationStructureTypeNV));
+    vkStream->write((VkBuildAccelerationStructureFlagsNV*)&forMarshaling->flags,
+                    sizeof(VkBuildAccelerationStructureFlagsNV));
     vkStream->write((uint32_t*)&forMarshaling->instanceCount, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->geometryCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->geometryCount; ++i)
-        {
-            marshal_VkGeometryNV(vkStream, rootType, (const VkGeometryNV*)(forMarshaling->pGeometries + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->geometryCount; ++i) {
+            marshal_VkGeometryNV(vkStream, rootType,
+                                 (const VkGeometryNV*)(forMarshaling->pGeometries + i));
         }
     }
 }
 
-void unmarshal_VkAccelerationStructureInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureInfoNV* forUnmarshaling)
-{
+void unmarshal_VkAccelerationStructureInfoNV(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkAccelerationStructureInfoNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkAccelerationStructureTypeNV*)&forUnmarshaling->type, sizeof(VkAccelerationStructureTypeNV));
-    vkStream->read((VkBuildAccelerationStructureFlagsNV*)&forUnmarshaling->flags, sizeof(VkBuildAccelerationStructureFlagsNV));
+    vkStream->read((VkAccelerationStructureTypeNV*)&forUnmarshaling->type,
+                   sizeof(VkAccelerationStructureTypeNV));
+    vkStream->read((VkBuildAccelerationStructureFlagsNV*)&forUnmarshaling->flags,
+                   sizeof(VkBuildAccelerationStructureFlagsNV));
     vkStream->read((uint32_t*)&forUnmarshaling->instanceCount, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->geometryCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pGeometries, forUnmarshaling->geometryCount * sizeof(const VkGeometryNV));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->geometryCount; ++i)
-        {
-            unmarshal_VkGeometryNV(vkStream, rootType, (VkGeometryNV*)(forUnmarshaling->pGeometries + i));
+    vkStream->alloc((void**)&forUnmarshaling->pGeometries,
+                    forUnmarshaling->geometryCount * sizeof(const VkGeometryNV));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->geometryCount; ++i) {
+            unmarshal_VkGeometryNV(vkStream, rootType,
+                                   (VkGeometryNV*)(forUnmarshaling->pGeometries + i));
         }
     }
 }
 
 void marshal_VkAccelerationStructureCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAccelerationStructureCreateInfoNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkAccelerationStructureCreateInfoNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkDeviceSize*)&forMarshaling->compactedSize, sizeof(VkDeviceSize));
-    marshal_VkAccelerationStructureInfoNV(vkStream, rootType, (VkAccelerationStructureInfoNV*)(&forMarshaling->info));
+    marshal_VkAccelerationStructureInfoNV(vkStream, rootType,
+                                          (VkAccelerationStructureInfoNV*)(&forMarshaling->info));
 }
 
 void unmarshal_VkAccelerationStructureCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureCreateInfoNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureCreateInfoNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkDeviceSize*)&forUnmarshaling->compactedSize, sizeof(VkDeviceSize));
-    unmarshal_VkAccelerationStructureInfoNV(vkStream, rootType, (VkAccelerationStructureInfoNV*)(&forUnmarshaling->info));
+    unmarshal_VkAccelerationStructureInfoNV(
+        vkStream, rootType, (VkAccelerationStructureInfoNV*)(&forUnmarshaling->info));
 }
 
 void marshal_VkBindAccelerationStructureMemoryInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBindAccelerationStructureMemoryInfoNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkBindAccelerationStructureMemoryInfoNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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_VkAccelerationStructureNV_u64(&forMarshaling->accelerationStructure, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkAccelerationStructureNV_u64(
+        &forMarshaling->accelerationStructure, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     uint64_t cgen_var_1;
-    vkStream->handleMapping()->mapHandles_VkDeviceMemory_u64(&forMarshaling->memory, &cgen_var_1, 1);
+    vkStream->handleMapping()->mapHandles_VkDeviceMemory_u64(&forMarshaling->memory, &cgen_var_1,
+                                                             1);
     vkStream->write((uint64_t*)&cgen_var_1, 1 * 8);
     vkStream->write((VkDeviceSize*)&forMarshaling->memoryOffset, sizeof(VkDeviceSize));
     vkStream->write((uint32_t*)&forMarshaling->deviceIndexCount, sizeof(uint32_t));
-    vkStream->write((const uint32_t*)forMarshaling->pDeviceIndices, forMarshaling->deviceIndexCount * sizeof(const uint32_t));
+    vkStream->write((const uint32_t*)forMarshaling->pDeviceIndices,
+                    forMarshaling->deviceIndexCount * sizeof(const uint32_t));
 }
 
 void unmarshal_VkBindAccelerationStructureMemoryInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindAccelerationStructureMemoryInfoNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBindAccelerationStructureMemoryInfoNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkAccelerationStructureNV(&cgen_var_0, (VkAccelerationStructureNV*)&forUnmarshaling->accelerationStructure, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkAccelerationStructureNV(
+        &cgen_var_0, (VkAccelerationStructureNV*)&forUnmarshaling->accelerationStructure, 1);
     uint64_t cgen_var_1;
     vkStream->read((uint64_t*)&cgen_var_1, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkDeviceMemory(&cgen_var_1, (VkDeviceMemory*)&forUnmarshaling->memory, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkDeviceMemory(
+        &cgen_var_1, (VkDeviceMemory*)&forUnmarshaling->memory, 1);
     vkStream->read((VkDeviceSize*)&forUnmarshaling->memoryOffset, sizeof(VkDeviceSize));
     vkStream->read((uint32_t*)&forUnmarshaling->deviceIndexCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pDeviceIndices, forUnmarshaling->deviceIndexCount * sizeof(const uint32_t));
-    vkStream->read((uint32_t*)forUnmarshaling->pDeviceIndices, forUnmarshaling->deviceIndexCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pDeviceIndices,
+                    forUnmarshaling->deviceIndexCount * sizeof(const uint32_t));
+    vkStream->read((uint32_t*)forUnmarshaling->pDeviceIndices,
+                   forUnmarshaling->deviceIndexCount * sizeof(const uint32_t));
 }
 
 void marshal_VkWriteDescriptorSetAccelerationStructureNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkWriteDescriptorSetAccelerationStructureNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkWriteDescriptorSetAccelerationStructureNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -25658,113 +24184,111 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pAccelerationStructures;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pAccelerationStructures)
-    {
-        if (forMarshaling->accelerationStructureCount)
-        {
+    if (forMarshaling->pAccelerationStructures) {
+        if (forMarshaling->accelerationStructureCount) {
             uint64_t* cgen_var_0_0;
             vkStream->alloc((void**)&cgen_var_0_0, forMarshaling->accelerationStructureCount * 8);
-            vkStream->handleMapping()->mapHandles_VkAccelerationStructureNV_u64(forMarshaling->pAccelerationStructures, cgen_var_0_0, forMarshaling->accelerationStructureCount);
+            vkStream->handleMapping()->mapHandles_VkAccelerationStructureNV_u64(
+                forMarshaling->pAccelerationStructures, cgen_var_0_0,
+                forMarshaling->accelerationStructureCount);
             vkStream->write((uint64_t*)cgen_var_0_0, forMarshaling->accelerationStructureCount * 8);
         }
     }
 }
 
 void unmarshal_VkWriteDescriptorSetAccelerationStructureNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkWriteDescriptorSetAccelerationStructureNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkWriteDescriptorSetAccelerationStructureNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->accelerationStructureCount, sizeof(uint32_t));
     // WARNING PTR CHECK
-    forUnmarshaling->pAccelerationStructures = (const VkAccelerationStructureNV*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pAccelerationStructures)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pAccelerationStructures, forUnmarshaling->accelerationStructureCount * sizeof(const VkAccelerationStructureNV));
-        if (forUnmarshaling->accelerationStructureCount)
-        {
+    forUnmarshaling->pAccelerationStructures =
+        (const VkAccelerationStructureNV*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pAccelerationStructures) {
+        vkStream->alloc(
+            (void**)&forUnmarshaling->pAccelerationStructures,
+            forUnmarshaling->accelerationStructureCount * sizeof(const VkAccelerationStructureNV));
+        if (forUnmarshaling->accelerationStructureCount) {
             uint64_t* cgen_var_0_0;
             vkStream->alloc((void**)&cgen_var_0_0, forUnmarshaling->accelerationStructureCount * 8);
-            vkStream->read((uint64_t*)cgen_var_0_0, forUnmarshaling->accelerationStructureCount * 8);
-            vkStream->handleMapping()->mapHandles_u64_VkAccelerationStructureNV(cgen_var_0_0, (VkAccelerationStructureNV*)forUnmarshaling->pAccelerationStructures, forUnmarshaling->accelerationStructureCount);
+            vkStream->read((uint64_t*)cgen_var_0_0,
+                           forUnmarshaling->accelerationStructureCount * 8);
+            vkStream->handleMapping()->mapHandles_u64_VkAccelerationStructureNV(
+                cgen_var_0_0, (VkAccelerationStructureNV*)forUnmarshaling->pAccelerationStructures,
+                forUnmarshaling->accelerationStructureCount);
         }
     }
 }
 
 void marshal_VkAccelerationStructureMemoryRequirementsInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAccelerationStructureMemoryRequirementsInfoNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkAccelerationStructureMemoryRequirementsInfoNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkAccelerationStructureMemoryRequirementsTypeNV*)&forMarshaling->type, sizeof(VkAccelerationStructureMemoryRequirementsTypeNV));
+    vkStream->write((VkAccelerationStructureMemoryRequirementsTypeNV*)&forMarshaling->type,
+                    sizeof(VkAccelerationStructureMemoryRequirementsTypeNV));
     uint64_t cgen_var_0;
-    vkStream->handleMapping()->mapHandles_VkAccelerationStructureNV_u64(&forMarshaling->accelerationStructure, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkAccelerationStructureNV_u64(
+        &forMarshaling->accelerationStructure, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
 }
 
 void unmarshal_VkAccelerationStructureMemoryRequirementsInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureMemoryRequirementsInfoNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureMemoryRequirementsInfoNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkAccelerationStructureMemoryRequirementsTypeNV*)&forUnmarshaling->type, sizeof(VkAccelerationStructureMemoryRequirementsTypeNV));
+    vkStream->read((VkAccelerationStructureMemoryRequirementsTypeNV*)&forUnmarshaling->type,
+                   sizeof(VkAccelerationStructureMemoryRequirementsTypeNV));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkAccelerationStructureNV(&cgen_var_0, (VkAccelerationStructureNV*)&forUnmarshaling->accelerationStructure, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkAccelerationStructureNV(
+        &cgen_var_0, (VkAccelerationStructureNV*)&forUnmarshaling->accelerationStructure, 1);
 }
 
 void marshal_VkPhysicalDeviceRayTracingPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceRayTracingPropertiesNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceRayTracingPropertiesNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -25775,29 +24299,28 @@
     vkStream->write((uint64_t*)&forMarshaling->maxGeometryCount, sizeof(uint64_t));
     vkStream->write((uint64_t*)&forMarshaling->maxInstanceCount, sizeof(uint64_t));
     vkStream->write((uint64_t*)&forMarshaling->maxTriangleCount, sizeof(uint64_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetAccelerationStructures, sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetAccelerationStructures,
+                    sizeof(uint32_t));
 }
 
 void unmarshal_VkPhysicalDeviceRayTracingPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceRayTracingPropertiesNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceRayTracingPropertiesNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -25808,32 +24331,24 @@
     vkStream->read((uint64_t*)&forUnmarshaling->maxGeometryCount, sizeof(uint64_t));
     vkStream->read((uint64_t*)&forUnmarshaling->maxInstanceCount, sizeof(uint64_t));
     vkStream->read((uint64_t*)&forUnmarshaling->maxTriangleCount, sizeof(uint64_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetAccelerationStructures, sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetAccelerationStructures,
+                   sizeof(uint32_t));
 }
 
-void marshal_VkTransformMatrixKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkTransformMatrixKHR* forMarshaling)
-{
+void marshal_VkTransformMatrixKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkTransformMatrixKHR* forMarshaling) {
     (void)rootType;
-    vkStream->write((float*)forMarshaling->matrix, ((3)*(4)) * sizeof(float));
+    vkStream->write((float*)forMarshaling->matrix, ((3) * (4)) * sizeof(float));
 }
 
-void unmarshal_VkTransformMatrixKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkTransformMatrixKHR* forUnmarshaling)
-{
+void unmarshal_VkTransformMatrixKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkTransformMatrixKHR* forUnmarshaling) {
     (void)rootType;
-    vkStream->read((float*)forUnmarshaling->matrix, ((3)*(4)) * sizeof(float));
+    vkStream->read((float*)forUnmarshaling->matrix, ((3) * (4)) * sizeof(float));
 }
 
-void marshal_VkAabbPositionsKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAabbPositionsKHR* forMarshaling)
-{
+void marshal_VkAabbPositionsKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                const VkAabbPositionsKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((float*)&forMarshaling->minX, sizeof(float));
     vkStream->write((float*)&forMarshaling->minY, sizeof(float));
@@ -25843,11 +24358,8 @@
     vkStream->write((float*)&forMarshaling->maxZ, sizeof(float));
 }
 
-void unmarshal_VkAabbPositionsKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAabbPositionsKHR* forUnmarshaling)
-{
+void unmarshal_VkAabbPositionsKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkAabbPositionsKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((float*)&forUnmarshaling->minX, sizeof(float));
     vkStream->read((float*)&forUnmarshaling->minY, sizeof(float));
@@ -25858,60 +24370,57 @@
 }
 
 void marshal_VkAccelerationStructureInstanceKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAccelerationStructureInstanceKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkAccelerationStructureInstanceKHR* forMarshaling) {
     (void)rootType;
-    
+
     typedef struct VkAccelerationStructureInstanceKHRWithoutBitFields {
-        VkTransformMatrixKHR          transform;
-        uint32_t                      dwords[2];
-        uint64_t                      accelerationStructureReference;
+        VkTransformMatrixKHR transform;
+        uint32_t dwords[2];
+        uint64_t accelerationStructureReference;
     } VkAccelerationStructureInstanceKHRWithoutBitFields;
-    
-    const VkAccelerationStructureInstanceKHRWithoutBitFields* forMarshaling_new = (const VkAccelerationStructureInstanceKHRWithoutBitFields*)(forMarshaling);
-    marshal_VkTransformMatrixKHR(vkStream, rootType, (VkTransformMatrixKHR*)(&forMarshaling_new->transform));
+
+    const VkAccelerationStructureInstanceKHRWithoutBitFields* forMarshaling_new =
+        (const VkAccelerationStructureInstanceKHRWithoutBitFields*)(forMarshaling);
+    marshal_VkTransformMatrixKHR(vkStream, rootType,
+                                 (VkTransformMatrixKHR*)(&forMarshaling_new->transform));
     for (uint32_t i = 0; i < 2; i++) {
         vkStream->write((uint32_t*)&(forMarshaling_new->dwords[i]), sizeof(uint32_t));
     }
-    vkStream->write((uint64_t*)&forMarshaling_new->accelerationStructureReference, sizeof(uint64_t));
-    
+    vkStream->write((uint64_t*)&forMarshaling_new->accelerationStructureReference,
+                    sizeof(uint64_t));
 }
 
 void unmarshal_VkAccelerationStructureInstanceKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureInstanceKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureInstanceKHR* forUnmarshaling) {
     (void)rootType;
-    
+
     typedef struct VkAccelerationStructureInstanceKHRWithoutBitFields {
-        VkTransformMatrixKHR          transform;
-        uint32_t                      dwords[2];
-        uint64_t                      accelerationStructureReference;
+        VkTransformMatrixKHR transform;
+        uint32_t dwords[2];
+        uint64_t accelerationStructureReference;
     } VkAccelerationStructureInstanceKHRWithoutBitFields;
-    
-    VkAccelerationStructureInstanceKHRWithoutBitFields* forUnmarshaling_new = (VkAccelerationStructureInstanceKHRWithoutBitFields*)(forUnmarshaling);
-    unmarshal_VkTransformMatrixKHR(vkStream, rootType, (VkTransformMatrixKHR*)(&forUnmarshaling_new->transform));
+
+    VkAccelerationStructureInstanceKHRWithoutBitFields* forUnmarshaling_new =
+        (VkAccelerationStructureInstanceKHRWithoutBitFields*)(forUnmarshaling);
+    unmarshal_VkTransformMatrixKHR(vkStream, rootType,
+                                   (VkTransformMatrixKHR*)(&forUnmarshaling_new->transform));
     for (uint32_t i = 0; i < 2; i++) {
         vkStream->read((uint32_t*)&(forUnmarshaling_new->dwords[i]), sizeof(uint32_t));
     }
-    vkStream->read((uint64_t*)&forUnmarshaling_new->accelerationStructureReference, sizeof(uint64_t));
-    
+    vkStream->read((uint64_t*)&forUnmarshaling_new->accelerationStructureReference,
+                   sizeof(uint64_t));
 }
 
 #endif
 #ifdef VK_NV_representative_fragment_test
 void marshal_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -25919,25 +24428,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -25945,14 +24452,11 @@
 }
 
 void marshal_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineRepresentativeFragmentTestStateCreateInfoNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineRepresentativeFragmentTestStateCreateInfoNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -25960,25 +24464,23 @@
 }
 
 void unmarshal_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineRepresentativeFragmentTestStateCreateInfoNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineRepresentativeFragmentTestStateCreateInfoNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -25988,14 +24490,11 @@
 #endif
 #ifdef VK_EXT_filter_cubic
 void marshal_VkPhysicalDeviceImageViewImageFormatInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceImageViewImageFormatInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceImageViewImageFormatInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -26003,25 +24502,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceImageViewImageFormatInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceImageViewImageFormatInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceImageViewImageFormatInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -26029,14 +24526,11 @@
 }
 
 void marshal_VkFilterCubicImageViewImageFormatPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkFilterCubicImageViewImageFormatPropertiesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkFilterCubicImageViewImageFormatPropertiesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -26045,25 +24539,23 @@
 }
 
 void unmarshal_VkFilterCubicImageViewImageFormatPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFilterCubicImageViewImageFormatPropertiesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkFilterCubicImageViewImageFormatPropertiesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -26076,138 +24568,123 @@
 #endif
 #ifdef VK_EXT_global_priority
 void marshal_VkDeviceQueueGlobalPriorityCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDeviceQueueGlobalPriorityCreateInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkDeviceQueueGlobalPriorityCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkQueueGlobalPriorityEXT*)&forMarshaling->globalPriority, sizeof(VkQueueGlobalPriorityEXT));
+    vkStream->write((VkQueueGlobalPriorityEXT*)&forMarshaling->globalPriority,
+                    sizeof(VkQueueGlobalPriorityEXT));
 }
 
 void unmarshal_VkDeviceQueueGlobalPriorityCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceQueueGlobalPriorityCreateInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDeviceQueueGlobalPriorityCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkQueueGlobalPriorityEXT*)&forUnmarshaling->globalPriority, sizeof(VkQueueGlobalPriorityEXT));
+    vkStream->read((VkQueueGlobalPriorityEXT*)&forUnmarshaling->globalPriority,
+                   sizeof(VkQueueGlobalPriorityEXT));
 }
 
 #endif
 #ifdef VK_EXT_external_memory_host
 void marshal_VkImportMemoryHostPointerInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImportMemoryHostPointerInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkImportMemoryHostPointerInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkExternalMemoryHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    vkStream->write((VkExternalMemoryHandleTypeFlagBits*)&forMarshaling->handleType,
+                    sizeof(VkExternalMemoryHandleTypeFlagBits));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pHostPointer;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pHostPointer)
-    {
+    if (forMarshaling->pHostPointer) {
         vkStream->write((void*)forMarshaling->pHostPointer, sizeof(uint8_t));
     }
 }
 
-void unmarshal_VkImportMemoryHostPointerInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportMemoryHostPointerInfoEXT* forUnmarshaling)
-{
+void unmarshal_VkImportMemoryHostPointerInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkImportMemoryHostPointerInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    vkStream->read((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType,
+                   sizeof(VkExternalMemoryHandleTypeFlagBits));
     // WARNING PTR CHECK
     forUnmarshaling->pHostPointer = (void*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pHostPointer)
-    {
+    if (forUnmarshaling->pHostPointer) {
         vkStream->alloc((void**)&forUnmarshaling->pHostPointer, sizeof(uint8_t));
         vkStream->read((void*)forUnmarshaling->pHostPointer, sizeof(uint8_t));
     }
 }
 
 void marshal_VkMemoryHostPointerPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMemoryHostPointerPropertiesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkMemoryHostPointerPropertiesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->memoryTypeBits, sizeof(uint32_t));
 }
 
-void unmarshal_VkMemoryHostPointerPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryHostPointerPropertiesEXT* forUnmarshaling)
-{
+void unmarshal_VkMemoryHostPointerPropertiesEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkMemoryHostPointerPropertiesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -26215,44 +24692,41 @@
 }
 
 void marshal_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceExternalMemoryHostPropertiesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceExternalMemoryHostPropertiesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkDeviceSize*)&forMarshaling->minImportedHostPointerAlignment, sizeof(VkDeviceSize));
+    vkStream->write((VkDeviceSize*)&forMarshaling->minImportedHostPointerAlignment,
+                    sizeof(VkDeviceSize));
 }
 
 void unmarshal_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceExternalMemoryHostPropertiesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceExternalMemoryHostPropertiesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkDeviceSize*)&forUnmarshaling->minImportedHostPointerAlignment, sizeof(VkDeviceSize));
+    vkStream->read((VkDeviceSize*)&forUnmarshaling->minImportedHostPointerAlignment,
+                   sizeof(VkDeviceSize));
 }
 
 #endif
@@ -26260,83 +24734,73 @@
 #endif
 #ifdef VK_AMD_pipeline_compiler_control
 void marshal_VkPipelineCompilerControlCreateInfoAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineCompilerControlCreateInfoAMD* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineCompilerControlCreateInfoAMD* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkPipelineCompilerControlFlagsAMD*)&forMarshaling->compilerControlFlags, sizeof(VkPipelineCompilerControlFlagsAMD));
+    vkStream->write((VkPipelineCompilerControlFlagsAMD*)&forMarshaling->compilerControlFlags,
+                    sizeof(VkPipelineCompilerControlFlagsAMD));
 }
 
 void unmarshal_VkPipelineCompilerControlCreateInfoAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineCompilerControlCreateInfoAMD* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineCompilerControlCreateInfoAMD* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkPipelineCompilerControlFlagsAMD*)&forUnmarshaling->compilerControlFlags, sizeof(VkPipelineCompilerControlFlagsAMD));
+    vkStream->read((VkPipelineCompilerControlFlagsAMD*)&forUnmarshaling->compilerControlFlags,
+                   sizeof(VkPipelineCompilerControlFlagsAMD));
 }
 
 #endif
 #ifdef VK_EXT_calibrated_timestamps
-void marshal_VkCalibratedTimestampInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCalibratedTimestampInfoEXT* forMarshaling)
-{
+void marshal_VkCalibratedTimestampInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                          const VkCalibratedTimestampInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkTimeDomainEXT*)&forMarshaling->timeDomain, sizeof(VkTimeDomainEXT));
 }
 
-void unmarshal_VkCalibratedTimestampInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCalibratedTimestampInfoEXT* forUnmarshaling)
-{
+void unmarshal_VkCalibratedTimestampInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkCalibratedTimestampInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -26346,14 +24810,11 @@
 #endif
 #ifdef VK_AMD_shader_core_properties
 void marshal_VkPhysicalDeviceShaderCorePropertiesAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceShaderCorePropertiesAMD* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceShaderCorePropertiesAMD* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -26374,25 +24835,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceShaderCorePropertiesAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderCorePropertiesAMD* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderCorePropertiesAMD* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -26414,143 +24873,131 @@
 
 #endif
 #ifdef VK_EXT_video_decode_h265
-void marshal_VkVideoDecodeH265ProfileEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoDecodeH265ProfileEXT* forMarshaling)
-{
+void marshal_VkVideoDecodeH265ProfileEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkVideoDecodeH265ProfileEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((StdVideoH265ProfileIdc*)&forMarshaling->stdProfileIdc, sizeof(StdVideoH265ProfileIdc));
+    vkStream->write((StdVideoH265ProfileIdc*)&forMarshaling->stdProfileIdc,
+                    sizeof(StdVideoH265ProfileIdc));
 }
 
-void unmarshal_VkVideoDecodeH265ProfileEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH265ProfileEXT* forUnmarshaling)
-{
+void unmarshal_VkVideoDecodeH265ProfileEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkVideoDecodeH265ProfileEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((StdVideoH265ProfileIdc*)&forUnmarshaling->stdProfileIdc, sizeof(StdVideoH265ProfileIdc));
+    vkStream->read((StdVideoH265ProfileIdc*)&forUnmarshaling->stdProfileIdc,
+                   sizeof(StdVideoH265ProfileIdc));
 }
 
 void marshal_VkVideoDecodeH265CapabilitiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoDecodeH265CapabilitiesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkVideoDecodeH265CapabilitiesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->maxLevel, sizeof(uint32_t));
-    marshal_VkExtensionProperties(vkStream, rootType, (VkExtensionProperties*)(&forMarshaling->stdExtensionVersion));
+    marshal_VkExtensionProperties(vkStream, rootType,
+                                  (VkExtensionProperties*)(&forMarshaling->stdExtensionVersion));
 }
 
-void unmarshal_VkVideoDecodeH265CapabilitiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH265CapabilitiesEXT* forUnmarshaling)
-{
+void unmarshal_VkVideoDecodeH265CapabilitiesEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkVideoDecodeH265CapabilitiesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->maxLevel, sizeof(uint32_t));
-    unmarshal_VkExtensionProperties(vkStream, rootType, (VkExtensionProperties*)(&forUnmarshaling->stdExtensionVersion));
+    unmarshal_VkExtensionProperties(
+        vkStream, rootType, (VkExtensionProperties*)(&forUnmarshaling->stdExtensionVersion));
 }
 
 void marshal_VkVideoDecodeH265SessionCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoDecodeH265SessionCreateInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkVideoDecodeH265SessionCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkVideoDecodeH265CreateFlagsEXT*)&forMarshaling->flags, sizeof(VkVideoDecodeH265CreateFlagsEXT));
-    marshal_VkExtensionProperties(vkStream, rootType, (const VkExtensionProperties*)(forMarshaling->pStdExtensionVersion));
+    vkStream->write((VkVideoDecodeH265CreateFlagsEXT*)&forMarshaling->flags,
+                    sizeof(VkVideoDecodeH265CreateFlagsEXT));
+    marshal_VkExtensionProperties(
+        vkStream, rootType, (const VkExtensionProperties*)(forMarshaling->pStdExtensionVersion));
 }
 
 void unmarshal_VkVideoDecodeH265SessionCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH265SessionCreateInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoDecodeH265SessionCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkVideoDecodeH265CreateFlagsEXT*)&forUnmarshaling->flags, sizeof(VkVideoDecodeH265CreateFlagsEXT));
-    vkStream->alloc((void**)&forUnmarshaling->pStdExtensionVersion, sizeof(const VkExtensionProperties));
-    unmarshal_VkExtensionProperties(vkStream, rootType, (VkExtensionProperties*)(forUnmarshaling->pStdExtensionVersion));
+    vkStream->read((VkVideoDecodeH265CreateFlagsEXT*)&forUnmarshaling->flags,
+                   sizeof(VkVideoDecodeH265CreateFlagsEXT));
+    vkStream->alloc((void**)&forUnmarshaling->pStdExtensionVersion,
+                    sizeof(const VkExtensionProperties));
+    unmarshal_VkExtensionProperties(
+        vkStream, rootType, (VkExtensionProperties*)(forUnmarshaling->pStdExtensionVersion));
 }
 
 void marshal_VkVideoDecodeH265SessionParametersAddInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoDecodeH265SessionParametersAddInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkVideoDecodeH265SessionParametersAddInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -26558,70 +25005,74 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pSpsStd;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pSpsStd)
-    {
-        vkStream->write((const StdVideoH265SequenceParameterSet*)forMarshaling->pSpsStd, forMarshaling->spsStdCount * sizeof(const StdVideoH265SequenceParameterSet));
+    if (forMarshaling->pSpsStd) {
+        vkStream->write(
+            (const StdVideoH265SequenceParameterSet*)forMarshaling->pSpsStd,
+            forMarshaling->spsStdCount * sizeof(const StdVideoH265SequenceParameterSet));
     }
     vkStream->write((uint32_t*)&forMarshaling->ppsStdCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)forMarshaling->pPpsStd;
     vkStream->putBe64(cgen_var_1);
-    if (forMarshaling->pPpsStd)
-    {
-        vkStream->write((const StdVideoH265PictureParameterSet*)forMarshaling->pPpsStd, forMarshaling->ppsStdCount * sizeof(const StdVideoH265PictureParameterSet));
+    if (forMarshaling->pPpsStd) {
+        vkStream->write((const StdVideoH265PictureParameterSet*)forMarshaling->pPpsStd,
+                        forMarshaling->ppsStdCount * sizeof(const StdVideoH265PictureParameterSet));
     }
 }
 
 void unmarshal_VkVideoDecodeH265SessionParametersAddInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH265SessionParametersAddInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoDecodeH265SessionParametersAddInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->spsStdCount, sizeof(uint32_t));
     // WARNING PTR CHECK
-    forUnmarshaling->pSpsStd = (const StdVideoH265SequenceParameterSet*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pSpsStd)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pSpsStd, forUnmarshaling->spsStdCount * sizeof(const StdVideoH265SequenceParameterSet));
-        vkStream->read((StdVideoH265SequenceParameterSet*)forUnmarshaling->pSpsStd, forUnmarshaling->spsStdCount * sizeof(const StdVideoH265SequenceParameterSet));
+    forUnmarshaling->pSpsStd =
+        (const StdVideoH265SequenceParameterSet*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pSpsStd) {
+        vkStream->alloc(
+            (void**)&forUnmarshaling->pSpsStd,
+            forUnmarshaling->spsStdCount * sizeof(const StdVideoH265SequenceParameterSet));
+        vkStream->read(
+            (StdVideoH265SequenceParameterSet*)forUnmarshaling->pSpsStd,
+            forUnmarshaling->spsStdCount * sizeof(const StdVideoH265SequenceParameterSet));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->ppsStdCount, sizeof(uint32_t));
     // WARNING PTR CHECK
-    forUnmarshaling->pPpsStd = (const StdVideoH265PictureParameterSet*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pPpsStd)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pPpsStd, forUnmarshaling->ppsStdCount * sizeof(const StdVideoH265PictureParameterSet));
-        vkStream->read((StdVideoH265PictureParameterSet*)forUnmarshaling->pPpsStd, forUnmarshaling->ppsStdCount * sizeof(const StdVideoH265PictureParameterSet));
+    forUnmarshaling->pPpsStd =
+        (const StdVideoH265PictureParameterSet*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pPpsStd) {
+        vkStream->alloc(
+            (void**)&forUnmarshaling->pPpsStd,
+            forUnmarshaling->ppsStdCount * sizeof(const StdVideoH265PictureParameterSet));
+        vkStream->read(
+            (StdVideoH265PictureParameterSet*)forUnmarshaling->pPpsStd,
+            forUnmarshaling->ppsStdCount * sizeof(const StdVideoH265PictureParameterSet));
     }
 }
 
 void marshal_VkVideoDecodeH265SessionParametersCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoDecodeH265SessionParametersCreateInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkVideoDecodeH265SessionParametersCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -26630,189 +25081,181 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pParametersAddInfo;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pParametersAddInfo)
-    {
-        marshal_VkVideoDecodeH265SessionParametersAddInfoEXT(vkStream, rootType, (const VkVideoDecodeH265SessionParametersAddInfoEXT*)(forMarshaling->pParametersAddInfo));
+    if (forMarshaling->pParametersAddInfo) {
+        marshal_VkVideoDecodeH265SessionParametersAddInfoEXT(
+            vkStream, rootType,
+            (const VkVideoDecodeH265SessionParametersAddInfoEXT*)(forMarshaling
+                                                                      ->pParametersAddInfo));
     }
 }
 
 void unmarshal_VkVideoDecodeH265SessionParametersCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH265SessionParametersCreateInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoDecodeH265SessionParametersCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->maxSpsStdCount, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxPpsStdCount, sizeof(uint32_t));
     // WARNING PTR CHECK
-    forUnmarshaling->pParametersAddInfo = (const VkVideoDecodeH265SessionParametersAddInfoEXT*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pParametersAddInfo)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pParametersAddInfo, sizeof(const VkVideoDecodeH265SessionParametersAddInfoEXT));
-        unmarshal_VkVideoDecodeH265SessionParametersAddInfoEXT(vkStream, rootType, (VkVideoDecodeH265SessionParametersAddInfoEXT*)(forUnmarshaling->pParametersAddInfo));
+    forUnmarshaling->pParametersAddInfo =
+        (const VkVideoDecodeH265SessionParametersAddInfoEXT*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pParametersAddInfo) {
+        vkStream->alloc((void**)&forUnmarshaling->pParametersAddInfo,
+                        sizeof(const VkVideoDecodeH265SessionParametersAddInfoEXT));
+        unmarshal_VkVideoDecodeH265SessionParametersAddInfoEXT(
+            vkStream, rootType,
+            (VkVideoDecodeH265SessionParametersAddInfoEXT*)(forUnmarshaling->pParametersAddInfo));
     }
 }
 
-void marshal_VkVideoDecodeH265PictureInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoDecodeH265PictureInfoEXT* forMarshaling)
-{
+void marshal_VkVideoDecodeH265PictureInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkVideoDecodeH265PictureInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((StdVideoDecodeH265PictureInfo*)forMarshaling->pStdPictureInfo, sizeof(StdVideoDecodeH265PictureInfo));
+    vkStream->write((StdVideoDecodeH265PictureInfo*)forMarshaling->pStdPictureInfo,
+                    sizeof(StdVideoDecodeH265PictureInfo));
     vkStream->write((uint32_t*)&forMarshaling->slicesCount, sizeof(uint32_t));
-    vkStream->write((const uint32_t*)forMarshaling->pSlicesDataOffsets, forMarshaling->slicesCount * sizeof(const uint32_t));
+    vkStream->write((const uint32_t*)forMarshaling->pSlicesDataOffsets,
+                    forMarshaling->slicesCount * sizeof(const uint32_t));
 }
 
-void unmarshal_VkVideoDecodeH265PictureInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH265PictureInfoEXT* forUnmarshaling)
-{
+void unmarshal_VkVideoDecodeH265PictureInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkVideoDecodeH265PictureInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->alloc((void**)&forUnmarshaling->pStdPictureInfo, sizeof(StdVideoDecodeH265PictureInfo));
-    vkStream->read((StdVideoDecodeH265PictureInfo*)forUnmarshaling->pStdPictureInfo, sizeof(StdVideoDecodeH265PictureInfo));
+    vkStream->alloc((void**)&forUnmarshaling->pStdPictureInfo,
+                    sizeof(StdVideoDecodeH265PictureInfo));
+    vkStream->read((StdVideoDecodeH265PictureInfo*)forUnmarshaling->pStdPictureInfo,
+                   sizeof(StdVideoDecodeH265PictureInfo));
     vkStream->read((uint32_t*)&forUnmarshaling->slicesCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pSlicesDataOffsets, forUnmarshaling->slicesCount * sizeof(const uint32_t));
-    vkStream->read((uint32_t*)forUnmarshaling->pSlicesDataOffsets, forUnmarshaling->slicesCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pSlicesDataOffsets,
+                    forUnmarshaling->slicesCount * sizeof(const uint32_t));
+    vkStream->read((uint32_t*)forUnmarshaling->pSlicesDataOffsets,
+                   forUnmarshaling->slicesCount * sizeof(const uint32_t));
 }
 
-void marshal_VkVideoDecodeH265DpbSlotInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoDecodeH265DpbSlotInfoEXT* forMarshaling)
-{
+void marshal_VkVideoDecodeH265DpbSlotInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkVideoDecodeH265DpbSlotInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((const StdVideoDecodeH265ReferenceInfo*)forMarshaling->pStdReferenceInfo, sizeof(const StdVideoDecodeH265ReferenceInfo));
+    vkStream->write((const StdVideoDecodeH265ReferenceInfo*)forMarshaling->pStdReferenceInfo,
+                    sizeof(const StdVideoDecodeH265ReferenceInfo));
 }
 
-void unmarshal_VkVideoDecodeH265DpbSlotInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH265DpbSlotInfoEXT* forUnmarshaling)
-{
+void unmarshal_VkVideoDecodeH265DpbSlotInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkVideoDecodeH265DpbSlotInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->alloc((void**)&forUnmarshaling->pStdReferenceInfo, sizeof(const StdVideoDecodeH265ReferenceInfo));
-    vkStream->read((StdVideoDecodeH265ReferenceInfo*)forUnmarshaling->pStdReferenceInfo, sizeof(const StdVideoDecodeH265ReferenceInfo));
+    vkStream->alloc((void**)&forUnmarshaling->pStdReferenceInfo,
+                    sizeof(const StdVideoDecodeH265ReferenceInfo));
+    vkStream->read((StdVideoDecodeH265ReferenceInfo*)forUnmarshaling->pStdReferenceInfo,
+                   sizeof(const StdVideoDecodeH265ReferenceInfo));
 }
 
 #endif
 #ifdef VK_AMD_memory_overallocation_behavior
 void marshal_VkDeviceMemoryOverallocationCreateInfoAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDeviceMemoryOverallocationCreateInfoAMD* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkDeviceMemoryOverallocationCreateInfoAMD* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkMemoryOverallocationBehaviorAMD*)&forMarshaling->overallocationBehavior, sizeof(VkMemoryOverallocationBehaviorAMD));
+    vkStream->write((VkMemoryOverallocationBehaviorAMD*)&forMarshaling->overallocationBehavior,
+                    sizeof(VkMemoryOverallocationBehaviorAMD));
 }
 
 void unmarshal_VkDeviceMemoryOverallocationCreateInfoAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceMemoryOverallocationCreateInfoAMD* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDeviceMemoryOverallocationCreateInfoAMD* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkMemoryOverallocationBehaviorAMD*)&forUnmarshaling->overallocationBehavior, sizeof(VkMemoryOverallocationBehaviorAMD));
+    vkStream->read((VkMemoryOverallocationBehaviorAMD*)&forUnmarshaling->overallocationBehavior,
+                   sizeof(VkMemoryOverallocationBehaviorAMD));
 }
 
 #endif
 #ifdef VK_EXT_vertex_attribute_divisor
 void marshal_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -26820,25 +25263,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -26846,161 +25287,150 @@
 }
 
 void marshal_VkVertexInputBindingDivisorDescriptionEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVertexInputBindingDivisorDescriptionEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkVertexInputBindingDivisorDescriptionEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->binding, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->divisor, sizeof(uint32_t));
 }
 
 void unmarshal_VkVertexInputBindingDivisorDescriptionEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVertexInputBindingDivisorDescriptionEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVertexInputBindingDivisorDescriptionEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->binding, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->divisor, sizeof(uint32_t));
 }
 
 void marshal_VkPipelineVertexInputDivisorStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineVertexInputDivisorStateCreateInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineVertexInputDivisorStateCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->vertexBindingDivisorCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->vertexBindingDivisorCount; ++i)
-        {
-            marshal_VkVertexInputBindingDivisorDescriptionEXT(vkStream, rootType, (const VkVertexInputBindingDivisorDescriptionEXT*)(forMarshaling->pVertexBindingDivisors + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->vertexBindingDivisorCount; ++i) {
+            marshal_VkVertexInputBindingDivisorDescriptionEXT(
+                vkStream, rootType,
+                (const VkVertexInputBindingDivisorDescriptionEXT*)(forMarshaling
+                                                                       ->pVertexBindingDivisors +
+                                                                   i));
         }
     }
 }
 
 void unmarshal_VkPipelineVertexInputDivisorStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineVertexInputDivisorStateCreateInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineVertexInputDivisorStateCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->vertexBindingDivisorCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pVertexBindingDivisors, forUnmarshaling->vertexBindingDivisorCount * sizeof(const VkVertexInputBindingDivisorDescriptionEXT));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->vertexBindingDivisorCount; ++i)
-        {
-            unmarshal_VkVertexInputBindingDivisorDescriptionEXT(vkStream, rootType, (VkVertexInputBindingDivisorDescriptionEXT*)(forUnmarshaling->pVertexBindingDivisors + i));
+    vkStream->alloc((void**)&forUnmarshaling->pVertexBindingDivisors,
+                    forUnmarshaling->vertexBindingDivisorCount *
+                        sizeof(const VkVertexInputBindingDivisorDescriptionEXT));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->vertexBindingDivisorCount; ++i) {
+            unmarshal_VkVertexInputBindingDivisorDescriptionEXT(
+                vkStream, rootType,
+                (VkVertexInputBindingDivisorDescriptionEXT*)(forUnmarshaling
+                                                                 ->pVertexBindingDivisors +
+                                                             i));
         }
     }
 }
 
 void marshal_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkBool32*)&forMarshaling->vertexAttributeInstanceRateDivisor, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->vertexAttributeInstanceRateZeroDivisor, sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->vertexAttributeInstanceRateDivisor,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->vertexAttributeInstanceRateZeroDivisor,
+                    sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkBool32*)&forUnmarshaling->vertexAttributeInstanceRateDivisor, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->vertexAttributeInstanceRateZeroDivisor, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->vertexAttributeInstanceRateDivisor,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->vertexAttributeInstanceRateZeroDivisor,
+                   sizeof(VkBool32));
 }
 
 #endif
 #ifdef VK_GGP_frame_token
-void marshal_VkPresentFrameTokenGGP(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPresentFrameTokenGGP* forMarshaling)
-{
+void marshal_VkPresentFrameTokenGGP(VulkanStream* vkStream, VkStructureType rootType,
+                                    const VkPresentFrameTokenGGP* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((GgpFrameToken*)&forMarshaling->frameToken, sizeof(GgpFrameToken));
 }
 
-void unmarshal_VkPresentFrameTokenGGP(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPresentFrameTokenGGP* forUnmarshaling)
-{
+void unmarshal_VkPresentFrameTokenGGP(VulkanStream* vkStream, VkStructureType rootType,
+                                      VkPresentFrameTokenGGP* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -27009,81 +25439,84 @@
 
 #endif
 #ifdef VK_EXT_pipeline_creation_feedback
-void marshal_VkPipelineCreationFeedbackEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineCreationFeedbackEXT* forMarshaling)
-{
+void marshal_VkPipelineCreationFeedbackEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkPipelineCreationFeedbackEXT* forMarshaling) {
     (void)rootType;
-    vkStream->write((VkPipelineCreationFeedbackFlagsEXT*)&forMarshaling->flags, sizeof(VkPipelineCreationFeedbackFlagsEXT));
+    vkStream->write((VkPipelineCreationFeedbackFlagsEXT*)&forMarshaling->flags,
+                    sizeof(VkPipelineCreationFeedbackFlagsEXT));
     vkStream->write((uint64_t*)&forMarshaling->duration, sizeof(uint64_t));
 }
 
-void unmarshal_VkPipelineCreationFeedbackEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineCreationFeedbackEXT* forUnmarshaling)
-{
+void unmarshal_VkPipelineCreationFeedbackEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkPipelineCreationFeedbackEXT* forUnmarshaling) {
     (void)rootType;
-    vkStream->read((VkPipelineCreationFeedbackFlagsEXT*)&forUnmarshaling->flags, sizeof(VkPipelineCreationFeedbackFlagsEXT));
+    vkStream->read((VkPipelineCreationFeedbackFlagsEXT*)&forUnmarshaling->flags,
+                   sizeof(VkPipelineCreationFeedbackFlagsEXT));
     vkStream->read((uint64_t*)&forUnmarshaling->duration, sizeof(uint64_t));
 }
 
 void marshal_VkPipelineCreationFeedbackCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineCreationFeedbackCreateInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineCreationFeedbackCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    marshal_VkPipelineCreationFeedbackEXT(vkStream, rootType, (VkPipelineCreationFeedbackEXT*)(forMarshaling->pPipelineCreationFeedback));
-    vkStream->write((uint32_t*)&forMarshaling->pipelineStageCreationFeedbackCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->pipelineStageCreationFeedbackCount; ++i)
-        {
-            marshal_VkPipelineCreationFeedbackEXT(vkStream, rootType, (VkPipelineCreationFeedbackEXT*)(forMarshaling->pPipelineStageCreationFeedbacks + i));
+    marshal_VkPipelineCreationFeedbackEXT(
+        vkStream, rootType,
+        (VkPipelineCreationFeedbackEXT*)(forMarshaling->pPipelineCreationFeedback));
+    vkStream->write((uint32_t*)&forMarshaling->pipelineStageCreationFeedbackCount,
+                    sizeof(uint32_t));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->pipelineStageCreationFeedbackCount; ++i) {
+            marshal_VkPipelineCreationFeedbackEXT(
+                vkStream, rootType,
+                (VkPipelineCreationFeedbackEXT*)(forMarshaling->pPipelineStageCreationFeedbacks +
+                                                 i));
         }
     }
 }
 
 void unmarshal_VkPipelineCreationFeedbackCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineCreationFeedbackCreateInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineCreationFeedbackCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->alloc((void**)&forUnmarshaling->pPipelineCreationFeedback, sizeof(VkPipelineCreationFeedbackEXT));
-    unmarshal_VkPipelineCreationFeedbackEXT(vkStream, rootType, (VkPipelineCreationFeedbackEXT*)(forUnmarshaling->pPipelineCreationFeedback));
-    vkStream->read((uint32_t*)&forUnmarshaling->pipelineStageCreationFeedbackCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pPipelineStageCreationFeedbacks, forUnmarshaling->pipelineStageCreationFeedbackCount * sizeof(VkPipelineCreationFeedbackEXT));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->pipelineStageCreationFeedbackCount; ++i)
-        {
-            unmarshal_VkPipelineCreationFeedbackEXT(vkStream, rootType, (VkPipelineCreationFeedbackEXT*)(forUnmarshaling->pPipelineStageCreationFeedbacks + i));
+    vkStream->alloc((void**)&forUnmarshaling->pPipelineCreationFeedback,
+                    sizeof(VkPipelineCreationFeedbackEXT));
+    unmarshal_VkPipelineCreationFeedbackEXT(
+        vkStream, rootType,
+        (VkPipelineCreationFeedbackEXT*)(forUnmarshaling->pPipelineCreationFeedback));
+    vkStream->read((uint32_t*)&forUnmarshaling->pipelineStageCreationFeedbackCount,
+                   sizeof(uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pPipelineStageCreationFeedbacks,
+                    forUnmarshaling->pipelineStageCreationFeedbackCount *
+                        sizeof(VkPipelineCreationFeedbackEXT));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->pipelineStageCreationFeedbackCount;
+             ++i) {
+            unmarshal_VkPipelineCreationFeedbackEXT(
+                vkStream, rootType,
+                (VkPipelineCreationFeedbackEXT*)(forUnmarshaling->pPipelineStageCreationFeedbacks +
+                                                 i));
         }
     }
 }
@@ -27093,14 +25526,11 @@
 #endif
 #ifdef VK_NV_compute_shader_derivatives
 void marshal_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -27109,25 +25539,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -27138,14 +25566,11 @@
 #endif
 #ifdef VK_NV_mesh_shader
 void marshal_VkPhysicalDeviceMeshShaderFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceMeshShaderFeaturesNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceMeshShaderFeaturesNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -27154,25 +25579,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceMeshShaderFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMeshShaderFeaturesNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMeshShaderFeaturesNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -27181,14 +25604,11 @@
 }
 
 void marshal_VkPhysicalDeviceMeshShaderPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceMeshShaderPropertiesNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceMeshShaderPropertiesNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -27208,25 +25628,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceMeshShaderPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMeshShaderPropertiesNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMeshShaderPropertiesNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -27242,24 +25660,20 @@
     vkStream->read((uint32_t*)&forUnmarshaling->maxMeshOutputPrimitives, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxMeshMultiviewViewCount, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->meshOutputPerVertexGranularity, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->meshOutputPerPrimitiveGranularity, sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->meshOutputPerPrimitiveGranularity,
+                   sizeof(uint32_t));
 }
 
 void marshal_VkDrawMeshTasksIndirectCommandNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDrawMeshTasksIndirectCommandNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkDrawMeshTasksIndirectCommandNV* forMarshaling) {
     (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->taskCount, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->firstTask, sizeof(uint32_t));
 }
 
-void unmarshal_VkDrawMeshTasksIndirectCommandNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDrawMeshTasksIndirectCommandNV* forUnmarshaling)
-{
+void unmarshal_VkDrawMeshTasksIndirectCommandNV(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkDrawMeshTasksIndirectCommandNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->taskCount, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->firstTask, sizeof(uint32_t));
@@ -27268,14 +25682,11 @@
 #endif
 #ifdef VK_NV_fragment_shader_barycentric
 void marshal_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -27283,25 +25694,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -27311,14 +25720,11 @@
 #endif
 #ifdef VK_NV_shader_image_footprint
 void marshal_VkPhysicalDeviceShaderImageFootprintFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceShaderImageFootprintFeaturesNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceShaderImageFootprintFeaturesNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -27326,25 +25732,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceShaderImageFootprintFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderImageFootprintFeaturesNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderImageFootprintFeaturesNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -27354,14 +25758,11 @@
 #endif
 #ifdef VK_NV_scissor_exclusive
 void marshal_VkPipelineViewportExclusiveScissorStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineViewportExclusiveScissorStateCreateInfoNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineViewportExclusiveScissorStateCreateInfoNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -27369,66 +25770,58 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pExclusiveScissors;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pExclusiveScissors)
-    {
-        if (forMarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forMarshaling->exclusiveScissorCount; ++i)
-            {
-                marshal_VkRect2D(vkStream, rootType, (const VkRect2D*)(forMarshaling->pExclusiveScissors + i));
+    if (forMarshaling->pExclusiveScissors) {
+        if (forMarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forMarshaling->exclusiveScissorCount; ++i) {
+                marshal_VkRect2D(vkStream, rootType,
+                                 (const VkRect2D*)(forMarshaling->pExclusiveScissors + i));
             }
         }
     }
 }
 
 void unmarshal_VkPipelineViewportExclusiveScissorStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineViewportExclusiveScissorStateCreateInfoNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineViewportExclusiveScissorStateCreateInfoNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->exclusiveScissorCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     forUnmarshaling->pExclusiveScissors = (const VkRect2D*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pExclusiveScissors)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pExclusiveScissors, forUnmarshaling->exclusiveScissorCount * sizeof(const VkRect2D));
-        if (forUnmarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->exclusiveScissorCount; ++i)
-            {
-                unmarshal_VkRect2D(vkStream, rootType, (VkRect2D*)(forUnmarshaling->pExclusiveScissors + i));
+    if (forUnmarshaling->pExclusiveScissors) {
+        vkStream->alloc((void**)&forUnmarshaling->pExclusiveScissors,
+                        forUnmarshaling->exclusiveScissorCount * sizeof(const VkRect2D));
+        if (forUnmarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->exclusiveScissorCount; ++i) {
+                unmarshal_VkRect2D(vkStream, rootType,
+                                   (VkRect2D*)(forUnmarshaling->pExclusiveScissors + i));
             }
         }
     }
 }
 
 void marshal_VkPhysicalDeviceExclusiveScissorFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceExclusiveScissorFeaturesNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceExclusiveScissorFeaturesNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -27436,25 +25829,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceExclusiveScissorFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceExclusiveScissorFeaturesNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceExclusiveScissorFeaturesNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -27464,96 +25855,86 @@
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
 void marshal_VkQueueFamilyCheckpointPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkQueueFamilyCheckpointPropertiesNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkQueueFamilyCheckpointPropertiesNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkPipelineStageFlags*)&forMarshaling->checkpointExecutionStageMask, sizeof(VkPipelineStageFlags));
+    vkStream->write((VkPipelineStageFlags*)&forMarshaling->checkpointExecutionStageMask,
+                    sizeof(VkPipelineStageFlags));
 }
 
 void unmarshal_VkQueueFamilyCheckpointPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkQueueFamilyCheckpointPropertiesNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkQueueFamilyCheckpointPropertiesNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkPipelineStageFlags*)&forUnmarshaling->checkpointExecutionStageMask, sizeof(VkPipelineStageFlags));
+    vkStream->read((VkPipelineStageFlags*)&forUnmarshaling->checkpointExecutionStageMask,
+                   sizeof(VkPipelineStageFlags));
 }
 
-void marshal_VkCheckpointDataNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCheckpointDataNV* forMarshaling)
-{
+void marshal_VkCheckpointDataNV(VulkanStream* vkStream, VkStructureType rootType,
+                                const VkCheckpointDataNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkPipelineStageFlagBits*)&forMarshaling->stage, sizeof(VkPipelineStageFlagBits));
+    vkStream->write((VkPipelineStageFlagBits*)&forMarshaling->stage,
+                    sizeof(VkPipelineStageFlagBits));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pCheckpointMarker;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pCheckpointMarker)
-    {
+    if (forMarshaling->pCheckpointMarker) {
         vkStream->write((void*)forMarshaling->pCheckpointMarker, sizeof(uint8_t));
     }
 }
 
-void unmarshal_VkCheckpointDataNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCheckpointDataNV* forUnmarshaling)
-{
+void unmarshal_VkCheckpointDataNV(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkCheckpointDataNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkPipelineStageFlagBits*)&forUnmarshaling->stage, sizeof(VkPipelineStageFlagBits));
+    vkStream->read((VkPipelineStageFlagBits*)&forUnmarshaling->stage,
+                   sizeof(VkPipelineStageFlagBits));
     // WARNING PTR CHECK
     forUnmarshaling->pCheckpointMarker = (void*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pCheckpointMarker)
-    {
+    if (forUnmarshaling->pCheckpointMarker) {
         vkStream->alloc((void**)&forUnmarshaling->pCheckpointMarker, sizeof(uint8_t));
         vkStream->read((void*)forUnmarshaling->pCheckpointMarker, sizeof(uint8_t));
     }
@@ -27562,14 +25943,11 @@
 #endif
 #ifdef VK_INTEL_shader_integer_functions2
 void marshal_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -27577,25 +25955,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -27604,173 +25980,148 @@
 
 #endif
 #ifdef VK_INTEL_performance_query
-void marshal_VkPerformanceValueDataINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPerformanceValueDataINTEL* forMarshaling)
-{
+void marshal_VkPerformanceValueDataINTEL(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkPerformanceValueDataINTEL* forMarshaling) {
     (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->value32, sizeof(uint32_t));
 }
 
-void unmarshal_VkPerformanceValueDataINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPerformanceValueDataINTEL* forUnmarshaling)
-{
+void unmarshal_VkPerformanceValueDataINTEL(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkPerformanceValueDataINTEL* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->value32, sizeof(uint32_t));
 }
 
-void marshal_VkPerformanceValueINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPerformanceValueINTEL* forMarshaling)
-{
+void marshal_VkPerformanceValueINTEL(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkPerformanceValueINTEL* forMarshaling) {
     (void)rootType;
-    vkStream->write((VkPerformanceValueTypeINTEL*)&forMarshaling->type, sizeof(VkPerformanceValueTypeINTEL));
-    marshal_VkPerformanceValueDataINTEL(vkStream, rootType, (VkPerformanceValueDataINTEL*)(&forMarshaling->data));
+    vkStream->write((VkPerformanceValueTypeINTEL*)&forMarshaling->type,
+                    sizeof(VkPerformanceValueTypeINTEL));
+    marshal_VkPerformanceValueDataINTEL(vkStream, rootType,
+                                        (VkPerformanceValueDataINTEL*)(&forMarshaling->data));
 }
 
-void unmarshal_VkPerformanceValueINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPerformanceValueINTEL* forUnmarshaling)
-{
+void unmarshal_VkPerformanceValueINTEL(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkPerformanceValueINTEL* forUnmarshaling) {
     (void)rootType;
-    vkStream->read((VkPerformanceValueTypeINTEL*)&forUnmarshaling->type, sizeof(VkPerformanceValueTypeINTEL));
-    unmarshal_VkPerformanceValueDataINTEL(vkStream, rootType, (VkPerformanceValueDataINTEL*)(&forUnmarshaling->data));
+    vkStream->read((VkPerformanceValueTypeINTEL*)&forUnmarshaling->type,
+                   sizeof(VkPerformanceValueTypeINTEL));
+    unmarshal_VkPerformanceValueDataINTEL(vkStream, rootType,
+                                          (VkPerformanceValueDataINTEL*)(&forUnmarshaling->data));
 }
 
 void marshal_VkInitializePerformanceApiInfoINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkInitializePerformanceApiInfoINTEL* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkInitializePerformanceApiInfoINTEL* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pUserData;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pUserData)
-    {
+    if (forMarshaling->pUserData) {
         vkStream->write((void*)forMarshaling->pUserData, sizeof(uint8_t));
     }
 }
 
 void unmarshal_VkInitializePerformanceApiInfoINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkInitializePerformanceApiInfoINTEL* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkInitializePerformanceApiInfoINTEL* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     // WARNING PTR CHECK
     forUnmarshaling->pUserData = (void*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pUserData)
-    {
+    if (forUnmarshaling->pUserData) {
         vkStream->alloc((void**)&forUnmarshaling->pUserData, sizeof(uint8_t));
         vkStream->read((void*)forUnmarshaling->pUserData, sizeof(uint8_t));
     }
 }
 
 void marshal_VkQueryPoolPerformanceQueryCreateInfoINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkQueryPoolPerformanceQueryCreateInfoINTEL* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkQueryPoolPerformanceQueryCreateInfoINTEL* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkQueryPoolSamplingModeINTEL*)&forMarshaling->performanceCountersSampling, sizeof(VkQueryPoolSamplingModeINTEL));
+    vkStream->write((VkQueryPoolSamplingModeINTEL*)&forMarshaling->performanceCountersSampling,
+                    sizeof(VkQueryPoolSamplingModeINTEL));
 }
 
 void unmarshal_VkQueryPoolPerformanceQueryCreateInfoINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkQueryPoolPerformanceQueryCreateInfoINTEL* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkQueryPoolPerformanceQueryCreateInfoINTEL* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkQueryPoolSamplingModeINTEL*)&forUnmarshaling->performanceCountersSampling, sizeof(VkQueryPoolSamplingModeINTEL));
+    vkStream->read((VkQueryPoolSamplingModeINTEL*)&forUnmarshaling->performanceCountersSampling,
+                   sizeof(VkQueryPoolSamplingModeINTEL));
 }
 
-void marshal_VkPerformanceMarkerInfoINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPerformanceMarkerInfoINTEL* forMarshaling)
-{
+void marshal_VkPerformanceMarkerInfoINTEL(VulkanStream* vkStream, VkStructureType rootType,
+                                          const VkPerformanceMarkerInfoINTEL* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint64_t*)&forMarshaling->marker, sizeof(uint64_t));
 }
 
-void unmarshal_VkPerformanceMarkerInfoINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPerformanceMarkerInfoINTEL* forUnmarshaling)
-{
+void unmarshal_VkPerformanceMarkerInfoINTEL(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkPerformanceMarkerInfoINTEL* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -27778,14 +26129,11 @@
 }
 
 void marshal_VkPerformanceStreamMarkerInfoINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPerformanceStreamMarkerInfoINTEL* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPerformanceStreamMarkerInfoINTEL* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -27793,128 +26141,115 @@
 }
 
 void unmarshal_VkPerformanceStreamMarkerInfoINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPerformanceStreamMarkerInfoINTEL* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPerformanceStreamMarkerInfoINTEL* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->marker, sizeof(uint32_t));
 }
 
-void marshal_VkPerformanceOverrideInfoINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPerformanceOverrideInfoINTEL* forMarshaling)
-{
+void marshal_VkPerformanceOverrideInfoINTEL(VulkanStream* vkStream, VkStructureType rootType,
+                                            const VkPerformanceOverrideInfoINTEL* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkPerformanceOverrideTypeINTEL*)&forMarshaling->type, sizeof(VkPerformanceOverrideTypeINTEL));
+    vkStream->write((VkPerformanceOverrideTypeINTEL*)&forMarshaling->type,
+                    sizeof(VkPerformanceOverrideTypeINTEL));
     vkStream->write((VkBool32*)&forMarshaling->enable, sizeof(VkBool32));
     vkStream->write((uint64_t*)&forMarshaling->parameter, sizeof(uint64_t));
 }
 
-void unmarshal_VkPerformanceOverrideInfoINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPerformanceOverrideInfoINTEL* forUnmarshaling)
-{
+void unmarshal_VkPerformanceOverrideInfoINTEL(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkPerformanceOverrideInfoINTEL* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkPerformanceOverrideTypeINTEL*)&forUnmarshaling->type, sizeof(VkPerformanceOverrideTypeINTEL));
+    vkStream->read((VkPerformanceOverrideTypeINTEL*)&forUnmarshaling->type,
+                   sizeof(VkPerformanceOverrideTypeINTEL));
     vkStream->read((VkBool32*)&forUnmarshaling->enable, sizeof(VkBool32));
     vkStream->read((uint64_t*)&forUnmarshaling->parameter, sizeof(uint64_t));
 }
 
 void marshal_VkPerformanceConfigurationAcquireInfoINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPerformanceConfigurationAcquireInfoINTEL* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPerformanceConfigurationAcquireInfoINTEL* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkPerformanceConfigurationTypeINTEL*)&forMarshaling->type, sizeof(VkPerformanceConfigurationTypeINTEL));
+    vkStream->write((VkPerformanceConfigurationTypeINTEL*)&forMarshaling->type,
+                    sizeof(VkPerformanceConfigurationTypeINTEL));
 }
 
 void unmarshal_VkPerformanceConfigurationAcquireInfoINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPerformanceConfigurationAcquireInfoINTEL* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPerformanceConfigurationAcquireInfoINTEL* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkPerformanceConfigurationTypeINTEL*)&forUnmarshaling->type, sizeof(VkPerformanceConfigurationTypeINTEL));
+    vkStream->read((VkPerformanceConfigurationTypeINTEL*)&forUnmarshaling->type,
+                   sizeof(VkPerformanceConfigurationTypeINTEL));
 }
 
 #endif
 #ifdef VK_EXT_pci_bus_info
 void marshal_VkPhysicalDevicePCIBusInfoPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDevicePCIBusInfoPropertiesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDevicePCIBusInfoPropertiesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -27925,25 +26260,23 @@
 }
 
 void unmarshal_VkPhysicalDevicePCIBusInfoPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePCIBusInfoPropertiesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePCIBusInfoPropertiesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -27956,14 +26289,11 @@
 #endif
 #ifdef VK_AMD_display_native_hdr
 void marshal_VkDisplayNativeHdrSurfaceCapabilitiesAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDisplayNativeHdrSurfaceCapabilitiesAMD* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkDisplayNativeHdrSurfaceCapabilitiesAMD* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -27971,25 +26301,23 @@
 }
 
 void unmarshal_VkDisplayNativeHdrSurfaceCapabilitiesAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayNativeHdrSurfaceCapabilitiesAMD* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDisplayNativeHdrSurfaceCapabilitiesAMD* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -27997,14 +26325,11 @@
 }
 
 void marshal_VkSwapchainDisplayNativeHdrCreateInfoAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSwapchainDisplayNativeHdrCreateInfoAMD* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkSwapchainDisplayNativeHdrCreateInfoAMD* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -28012,25 +26337,23 @@
 }
 
 void unmarshal_VkSwapchainDisplayNativeHdrCreateInfoAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSwapchainDisplayNativeHdrCreateInfoAMD* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSwapchainDisplayNativeHdrCreateInfoAMD* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -28040,208 +26363,191 @@
 #endif
 #ifdef VK_FUCHSIA_imagepipe_surface
 void marshal_VkImagePipeSurfaceCreateInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImagePipeSurfaceCreateInfoFUCHSIA* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkImagePipeSurfaceCreateInfoFUCHSIA* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkImagePipeSurfaceCreateFlagsFUCHSIA*)&forMarshaling->flags, sizeof(VkImagePipeSurfaceCreateFlagsFUCHSIA));
+    vkStream->write((VkImagePipeSurfaceCreateFlagsFUCHSIA*)&forMarshaling->flags,
+                    sizeof(VkImagePipeSurfaceCreateFlagsFUCHSIA));
     vkStream->write((zx_handle_t*)&forMarshaling->imagePipeHandle, sizeof(zx_handle_t));
 }
 
 void unmarshal_VkImagePipeSurfaceCreateInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImagePipeSurfaceCreateInfoFUCHSIA* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImagePipeSurfaceCreateInfoFUCHSIA* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkImagePipeSurfaceCreateFlagsFUCHSIA*)&forUnmarshaling->flags, sizeof(VkImagePipeSurfaceCreateFlagsFUCHSIA));
+    vkStream->read((VkImagePipeSurfaceCreateFlagsFUCHSIA*)&forUnmarshaling->flags,
+                   sizeof(VkImagePipeSurfaceCreateFlagsFUCHSIA));
     vkStream->read((zx_handle_t*)&forUnmarshaling->imagePipeHandle, sizeof(zx_handle_t));
 }
 
 #endif
 #ifdef VK_EXT_metal_surface
-void marshal_VkMetalSurfaceCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMetalSurfaceCreateInfoEXT* forMarshaling)
-{
+void marshal_VkMetalSurfaceCreateInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkMetalSurfaceCreateInfoEXT* forMarshaling) {
     (void)rootType;
-    
+
     // This struct should never be marshaled / unmarshaled.
     __builtin_trap();
-    
 }
 
-void unmarshal_VkMetalSurfaceCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMetalSurfaceCreateInfoEXT* forUnmarshaling)
-{
+void unmarshal_VkMetalSurfaceCreateInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkMetalSurfaceCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
-    
+
     // This struct should never be marshaled / unmarshaled.
     __builtin_trap();
-    
 }
 
 #endif
 #ifdef VK_EXT_fragment_density_map
 void marshal_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceFragmentDensityMapFeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceFragmentDensityMapFeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->fragmentDensityMap, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->fragmentDensityMapDynamic, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->fragmentDensityMapNonSubsampledImages, sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->fragmentDensityMapNonSubsampledImages,
+                    sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFragmentDensityMapFeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceFragmentDensityMapFeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
     forUnmarshaling->sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkBool32*)&forUnmarshaling->fragmentDensityMap, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->fragmentDensityMapDynamic, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->fragmentDensityMapNonSubsampledImages, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->fragmentDensityMapNonSubsampledImages,
+                   sizeof(VkBool32));
 }
 
 void marshal_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceFragmentDensityMapPropertiesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceFragmentDensityMapPropertiesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->minFragmentDensityTexelSize));
-    marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->maxFragmentDensityTexelSize));
+    marshal_VkExtent2D(vkStream, rootType,
+                       (VkExtent2D*)(&forMarshaling->minFragmentDensityTexelSize));
+    marshal_VkExtent2D(vkStream, rootType,
+                       (VkExtent2D*)(&forMarshaling->maxFragmentDensityTexelSize));
     vkStream->write((VkBool32*)&forMarshaling->fragmentDensityInvocations, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFragmentDensityMapPropertiesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceFragmentDensityMapPropertiesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
     forUnmarshaling->sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->minFragmentDensityTexelSize));
-    unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->maxFragmentDensityTexelSize));
+    unmarshal_VkExtent2D(vkStream, rootType,
+                         (VkExtent2D*)(&forUnmarshaling->minFragmentDensityTexelSize));
+    unmarshal_VkExtent2D(vkStream, rootType,
+                         (VkExtent2D*)(&forUnmarshaling->maxFragmentDensityTexelSize));
     vkStream->read((VkBool32*)&forUnmarshaling->fragmentDensityInvocations, sizeof(VkBool32));
 }
 
 void marshal_VkRenderPassFragmentDensityMapCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkRenderPassFragmentDensityMapCreateInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkRenderPassFragmentDensityMapCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    marshal_VkAttachmentReference(vkStream, rootType, (VkAttachmentReference*)(&forMarshaling->fragmentDensityMapAttachment));
+    marshal_VkAttachmentReference(
+        vkStream, rootType, (VkAttachmentReference*)(&forMarshaling->fragmentDensityMapAttachment));
 }
 
 void unmarshal_VkRenderPassFragmentDensityMapCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderPassFragmentDensityMapCreateInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkRenderPassFragmentDensityMapCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
     forUnmarshaling->sType = VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    unmarshal_VkAttachmentReference(vkStream, rootType, (VkAttachmentReference*)(&forUnmarshaling->fragmentDensityMapAttachment));
+    unmarshal_VkAttachmentReference(
+        vkStream, rootType,
+        (VkAttachmentReference*)(&forUnmarshaling->fragmentDensityMapAttachment));
 }
 
 #endif
@@ -28253,14 +26559,11 @@
 #endif
 #ifdef VK_EXT_subgroup_size_control
 void marshal_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -28269,25 +26572,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -28296,61 +26597,55 @@
 }
 
 void marshal_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->minSubgroupSize, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxSubgroupSize, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxComputeWorkgroupSubgroups, sizeof(uint32_t));
-    vkStream->write((VkShaderStageFlags*)&forMarshaling->requiredSubgroupSizeStages, sizeof(VkShaderStageFlags));
+    vkStream->write((VkShaderStageFlags*)&forMarshaling->requiredSubgroupSizeStages,
+                    sizeof(VkShaderStageFlags));
 }
 
 void unmarshal_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->minSubgroupSize, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxSubgroupSize, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxComputeWorkgroupSubgroups, sizeof(uint32_t));
-    vkStream->read((VkShaderStageFlags*)&forUnmarshaling->requiredSubgroupSizeStages, sizeof(VkShaderStageFlags));
+    vkStream->read((VkShaderStageFlags*)&forUnmarshaling->requiredSubgroupSizeStages,
+                   sizeof(VkShaderStageFlags));
 }
 
 void marshal_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -28358,25 +26653,23 @@
 }
 
 void unmarshal_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -28386,59 +26679,53 @@
 #endif
 #ifdef VK_AMD_shader_core_properties2
 void marshal_VkPhysicalDeviceShaderCoreProperties2AMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceShaderCoreProperties2AMD* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceShaderCoreProperties2AMD* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkShaderCorePropertiesFlagsAMD*)&forMarshaling->shaderCoreFeatures, sizeof(VkShaderCorePropertiesFlagsAMD));
+    vkStream->write((VkShaderCorePropertiesFlagsAMD*)&forMarshaling->shaderCoreFeatures,
+                    sizeof(VkShaderCorePropertiesFlagsAMD));
     vkStream->write((uint32_t*)&forMarshaling->activeComputeUnitCount, sizeof(uint32_t));
 }
 
 void unmarshal_VkPhysicalDeviceShaderCoreProperties2AMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderCoreProperties2AMD* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderCoreProperties2AMD* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkShaderCorePropertiesFlagsAMD*)&forUnmarshaling->shaderCoreFeatures, sizeof(VkShaderCorePropertiesFlagsAMD));
+    vkStream->read((VkShaderCorePropertiesFlagsAMD*)&forUnmarshaling->shaderCoreFeatures,
+                   sizeof(VkShaderCorePropertiesFlagsAMD));
     vkStream->read((uint32_t*)&forUnmarshaling->activeComputeUnitCount, sizeof(uint32_t));
 }
 
 #endif
 #ifdef VK_AMD_device_coherent_memory
 void marshal_VkPhysicalDeviceCoherentMemoryFeaturesAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceCoherentMemoryFeaturesAMD* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceCoherentMemoryFeaturesAMD* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -28446,25 +26733,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceCoherentMemoryFeaturesAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceCoherentMemoryFeaturesAMD* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceCoherentMemoryFeaturesAMD* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -28474,14 +26759,11 @@
 #endif
 #ifdef VK_EXT_shader_image_atomic_int64
 void marshal_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -28490,25 +26772,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -28519,59 +26799,55 @@
 #endif
 #ifdef VK_EXT_memory_budget
 void marshal_VkPhysicalDeviceMemoryBudgetPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceMemoryBudgetPropertiesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceMemoryBudgetPropertiesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkDeviceSize*)forMarshaling->heapBudget, VK_MAX_MEMORY_HEAPS * sizeof(VkDeviceSize));
-    vkStream->write((VkDeviceSize*)forMarshaling->heapUsage, VK_MAX_MEMORY_HEAPS * sizeof(VkDeviceSize));
+    vkStream->write((VkDeviceSize*)forMarshaling->heapBudget,
+                    VK_MAX_MEMORY_HEAPS * sizeof(VkDeviceSize));
+    vkStream->write((VkDeviceSize*)forMarshaling->heapUsage,
+                    VK_MAX_MEMORY_HEAPS * sizeof(VkDeviceSize));
 }
 
 void unmarshal_VkPhysicalDeviceMemoryBudgetPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMemoryBudgetPropertiesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMemoryBudgetPropertiesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkDeviceSize*)forUnmarshaling->heapBudget, VK_MAX_MEMORY_HEAPS * sizeof(VkDeviceSize));
-    vkStream->read((VkDeviceSize*)forUnmarshaling->heapUsage, VK_MAX_MEMORY_HEAPS * sizeof(VkDeviceSize));
+    vkStream->read((VkDeviceSize*)forUnmarshaling->heapBudget,
+                   VK_MAX_MEMORY_HEAPS * sizeof(VkDeviceSize));
+    vkStream->read((VkDeviceSize*)forUnmarshaling->heapUsage,
+                   VK_MAX_MEMORY_HEAPS * sizeof(VkDeviceSize));
 }
 
 #endif
 #ifdef VK_EXT_memory_priority
 void marshal_VkPhysicalDeviceMemoryPriorityFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceMemoryPriorityFeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceMemoryPriorityFeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -28579,66 +26855,57 @@
 }
 
 void unmarshal_VkPhysicalDeviceMemoryPriorityFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMemoryPriorityFeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMemoryPriorityFeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkBool32*)&forUnmarshaling->memoryPriority, sizeof(VkBool32));
 }
 
-void marshal_VkMemoryPriorityAllocateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMemoryPriorityAllocateInfoEXT* forMarshaling)
-{
+void marshal_VkMemoryPriorityAllocateInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkMemoryPriorityAllocateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((float*)&forMarshaling->priority, sizeof(float));
 }
 
-void unmarshal_VkMemoryPriorityAllocateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryPriorityAllocateInfoEXT* forUnmarshaling)
-{
+void unmarshal_VkMemoryPriorityAllocateInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkMemoryPriorityAllocateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -28648,14 +26915,11 @@
 #endif
 #ifdef VK_NV_dedicated_allocation_image_aliasing
 void marshal_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -28663,25 +26927,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -28691,14 +26953,11 @@
 #endif
 #ifdef VK_EXT_buffer_device_address
 void marshal_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -28708,25 +26967,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -28736,14 +26993,11 @@
 }
 
 void marshal_VkBufferDeviceAddressCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBufferDeviceAddressCreateInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkBufferDeviceAddressCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -28751,25 +27005,23 @@
 }
 
 void unmarshal_VkBufferDeviceAddressCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferDeviceAddressCreateInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBufferDeviceAddressCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -28779,50 +27031,47 @@
 #endif
 #ifdef VK_EXT_tooling_info
 void marshal_VkPhysicalDeviceToolPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceToolPropertiesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceToolPropertiesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((char*)forMarshaling->name, VK_MAX_EXTENSION_NAME_SIZE * sizeof(char));
     vkStream->write((char*)forMarshaling->version, VK_MAX_EXTENSION_NAME_SIZE * sizeof(char));
-    vkStream->write((VkToolPurposeFlagsEXT*)&forMarshaling->purposes, sizeof(VkToolPurposeFlagsEXT));
+    vkStream->write((VkToolPurposeFlagsEXT*)&forMarshaling->purposes,
+                    sizeof(VkToolPurposeFlagsEXT));
     vkStream->write((char*)forMarshaling->description, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
     vkStream->write((char*)forMarshaling->layer, VK_MAX_EXTENSION_NAME_SIZE * sizeof(char));
 }
 
 void unmarshal_VkPhysicalDeviceToolPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceToolPropertiesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceToolPropertiesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((char*)forUnmarshaling->name, VK_MAX_EXTENSION_NAME_SIZE * sizeof(char));
     vkStream->read((char*)forUnmarshaling->version, VK_MAX_EXTENSION_NAME_SIZE * sizeof(char));
-    vkStream->read((VkToolPurposeFlagsEXT*)&forUnmarshaling->purposes, sizeof(VkToolPurposeFlagsEXT));
+    vkStream->read((VkToolPurposeFlagsEXT*)&forUnmarshaling->purposes,
+                   sizeof(VkToolPurposeFlagsEXT));
     vkStream->read((char*)forUnmarshaling->description, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
     vkStream->read((char*)forUnmarshaling->layer, VK_MAX_EXTENSION_NAME_SIZE * sizeof(char));
 }
@@ -28831,66 +27080,68 @@
 #ifdef VK_EXT_separate_stencil_usage
 #endif
 #ifdef VK_EXT_validation_features
-void marshal_VkValidationFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkValidationFeaturesEXT* forMarshaling)
-{
+void marshal_VkValidationFeaturesEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkValidationFeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->enabledValidationFeatureCount, sizeof(uint32_t));
-    vkStream->write((const VkValidationFeatureEnableEXT*)forMarshaling->pEnabledValidationFeatures, forMarshaling->enabledValidationFeatureCount * sizeof(const VkValidationFeatureEnableEXT));
+    vkStream->write(
+        (const VkValidationFeatureEnableEXT*)forMarshaling->pEnabledValidationFeatures,
+        forMarshaling->enabledValidationFeatureCount * sizeof(const VkValidationFeatureEnableEXT));
     vkStream->write((uint32_t*)&forMarshaling->disabledValidationFeatureCount, sizeof(uint32_t));
-    vkStream->write((const VkValidationFeatureDisableEXT*)forMarshaling->pDisabledValidationFeatures, forMarshaling->disabledValidationFeatureCount * sizeof(const VkValidationFeatureDisableEXT));
+    vkStream->write(
+        (const VkValidationFeatureDisableEXT*)forMarshaling->pDisabledValidationFeatures,
+        forMarshaling->disabledValidationFeatureCount *
+            sizeof(const VkValidationFeatureDisableEXT));
 }
 
-void unmarshal_VkValidationFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkValidationFeaturesEXT* forUnmarshaling)
-{
+void unmarshal_VkValidationFeaturesEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkValidationFeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->enabledValidationFeatureCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pEnabledValidationFeatures, forUnmarshaling->enabledValidationFeatureCount * sizeof(const VkValidationFeatureEnableEXT));
-    vkStream->read((VkValidationFeatureEnableEXT*)forUnmarshaling->pEnabledValidationFeatures, forUnmarshaling->enabledValidationFeatureCount * sizeof(const VkValidationFeatureEnableEXT));
+    vkStream->alloc((void**)&forUnmarshaling->pEnabledValidationFeatures,
+                    forUnmarshaling->enabledValidationFeatureCount *
+                        sizeof(const VkValidationFeatureEnableEXT));
+    vkStream->read((VkValidationFeatureEnableEXT*)forUnmarshaling->pEnabledValidationFeatures,
+                   forUnmarshaling->enabledValidationFeatureCount *
+                       sizeof(const VkValidationFeatureEnableEXT));
     vkStream->read((uint32_t*)&forUnmarshaling->disabledValidationFeatureCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pDisabledValidationFeatures, forUnmarshaling->disabledValidationFeatureCount * sizeof(const VkValidationFeatureDisableEXT));
-    vkStream->read((VkValidationFeatureDisableEXT*)forUnmarshaling->pDisabledValidationFeatures, forUnmarshaling->disabledValidationFeatureCount * sizeof(const VkValidationFeatureDisableEXT));
+    vkStream->alloc((void**)&forUnmarshaling->pDisabledValidationFeatures,
+                    forUnmarshaling->disabledValidationFeatureCount *
+                        sizeof(const VkValidationFeatureDisableEXT));
+    vkStream->read((VkValidationFeatureDisableEXT*)forUnmarshaling->pDisabledValidationFeatures,
+                   forUnmarshaling->disabledValidationFeatureCount *
+                       sizeof(const VkValidationFeatureDisableEXT));
 }
 
 #endif
 #ifdef VK_NV_cooperative_matrix
-void marshal_VkCooperativeMatrixPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCooperativeMatrixPropertiesNV* forMarshaling)
-{
+void marshal_VkCooperativeMatrixPropertiesNV(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkCooperativeMatrixPropertiesNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -28904,26 +27155,23 @@
     vkStream->write((VkScopeNV*)&forMarshaling->scope, sizeof(VkScopeNV));
 }
 
-void unmarshal_VkCooperativeMatrixPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCooperativeMatrixPropertiesNV* forUnmarshaling)
-{
+void unmarshal_VkCooperativeMatrixPropertiesNV(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkCooperativeMatrixPropertiesNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -28938,100 +27186,91 @@
 }
 
 void marshal_VkPhysicalDeviceCooperativeMatrixFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceCooperativeMatrixFeaturesNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceCooperativeMatrixFeaturesNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->cooperativeMatrix, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->cooperativeMatrixRobustBufferAccess, sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->cooperativeMatrixRobustBufferAccess,
+                    sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceCooperativeMatrixFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceCooperativeMatrixFeaturesNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceCooperativeMatrixFeaturesNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkBool32*)&forUnmarshaling->cooperativeMatrix, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->cooperativeMatrixRobustBufferAccess, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->cooperativeMatrixRobustBufferAccess,
+                   sizeof(VkBool32));
 }
 
 void marshal_VkPhysicalDeviceCooperativeMatrixPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceCooperativeMatrixPropertiesNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceCooperativeMatrixPropertiesNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkShaderStageFlags*)&forMarshaling->cooperativeMatrixSupportedStages, sizeof(VkShaderStageFlags));
+    vkStream->write((VkShaderStageFlags*)&forMarshaling->cooperativeMatrixSupportedStages,
+                    sizeof(VkShaderStageFlags));
 }
 
 void unmarshal_VkPhysicalDeviceCooperativeMatrixPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceCooperativeMatrixPropertiesNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceCooperativeMatrixPropertiesNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkShaderStageFlags*)&forUnmarshaling->cooperativeMatrixSupportedStages, sizeof(VkShaderStageFlags));
+    vkStream->read((VkShaderStageFlags*)&forUnmarshaling->cooperativeMatrixSupportedStages,
+                   sizeof(VkShaderStageFlags));
 }
 
 #endif
 #ifdef VK_NV_coverage_reduction_mode
 void marshal_VkPhysicalDeviceCoverageReductionModeFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceCoverageReductionModeFeaturesNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceCoverageReductionModeFeaturesNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -29039,25 +27278,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceCoverageReductionModeFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceCoverageReductionModeFeaturesNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceCoverageReductionModeFeaturesNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -29065,153 +27302,147 @@
 }
 
 void marshal_VkPipelineCoverageReductionStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineCoverageReductionStateCreateInfoNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineCoverageReductionStateCreateInfoNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkPipelineCoverageReductionStateCreateFlagsNV*)&forMarshaling->flags, sizeof(VkPipelineCoverageReductionStateCreateFlagsNV));
-    vkStream->write((VkCoverageReductionModeNV*)&forMarshaling->coverageReductionMode, sizeof(VkCoverageReductionModeNV));
+    vkStream->write((VkPipelineCoverageReductionStateCreateFlagsNV*)&forMarshaling->flags,
+                    sizeof(VkPipelineCoverageReductionStateCreateFlagsNV));
+    vkStream->write((VkCoverageReductionModeNV*)&forMarshaling->coverageReductionMode,
+                    sizeof(VkCoverageReductionModeNV));
 }
 
 void unmarshal_VkPipelineCoverageReductionStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineCoverageReductionStateCreateInfoNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineCoverageReductionStateCreateInfoNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkPipelineCoverageReductionStateCreateFlagsNV*)&forUnmarshaling->flags, sizeof(VkPipelineCoverageReductionStateCreateFlagsNV));
-    vkStream->read((VkCoverageReductionModeNV*)&forUnmarshaling->coverageReductionMode, sizeof(VkCoverageReductionModeNV));
+    vkStream->read((VkPipelineCoverageReductionStateCreateFlagsNV*)&forUnmarshaling->flags,
+                   sizeof(VkPipelineCoverageReductionStateCreateFlagsNV));
+    vkStream->read((VkCoverageReductionModeNV*)&forUnmarshaling->coverageReductionMode,
+                   sizeof(VkCoverageReductionModeNV));
 }
 
 void marshal_VkFramebufferMixedSamplesCombinationNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkFramebufferMixedSamplesCombinationNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkFramebufferMixedSamplesCombinationNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkCoverageReductionModeNV*)&forMarshaling->coverageReductionMode, sizeof(VkCoverageReductionModeNV));
-    vkStream->write((VkSampleCountFlagBits*)&forMarshaling->rasterizationSamples, sizeof(VkSampleCountFlagBits));
-    vkStream->write((VkSampleCountFlags*)&forMarshaling->depthStencilSamples, sizeof(VkSampleCountFlags));
+    vkStream->write((VkCoverageReductionModeNV*)&forMarshaling->coverageReductionMode,
+                    sizeof(VkCoverageReductionModeNV));
+    vkStream->write((VkSampleCountFlagBits*)&forMarshaling->rasterizationSamples,
+                    sizeof(VkSampleCountFlagBits));
+    vkStream->write((VkSampleCountFlags*)&forMarshaling->depthStencilSamples,
+                    sizeof(VkSampleCountFlags));
     vkStream->write((VkSampleCountFlags*)&forMarshaling->colorSamples, sizeof(VkSampleCountFlags));
 }
 
 void unmarshal_VkFramebufferMixedSamplesCombinationNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFramebufferMixedSamplesCombinationNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkFramebufferMixedSamplesCombinationNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkCoverageReductionModeNV*)&forUnmarshaling->coverageReductionMode, sizeof(VkCoverageReductionModeNV));
-    vkStream->read((VkSampleCountFlagBits*)&forUnmarshaling->rasterizationSamples, sizeof(VkSampleCountFlagBits));
-    vkStream->read((VkSampleCountFlags*)&forUnmarshaling->depthStencilSamples, sizeof(VkSampleCountFlags));
+    vkStream->read((VkCoverageReductionModeNV*)&forUnmarshaling->coverageReductionMode,
+                   sizeof(VkCoverageReductionModeNV));
+    vkStream->read((VkSampleCountFlagBits*)&forUnmarshaling->rasterizationSamples,
+                   sizeof(VkSampleCountFlagBits));
+    vkStream->read((VkSampleCountFlags*)&forUnmarshaling->depthStencilSamples,
+                   sizeof(VkSampleCountFlags));
     vkStream->read((VkSampleCountFlags*)&forUnmarshaling->colorSamples, sizeof(VkSampleCountFlags));
 }
 
 #endif
 #ifdef VK_EXT_fragment_shader_interlock
 void marshal_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->fragmentShaderSampleInterlock, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->fragmentShaderPixelInterlock, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->fragmentShaderShadingRateInterlock, sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->fragmentShaderShadingRateInterlock,
+                    sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkBool32*)&forUnmarshaling->fragmentShaderSampleInterlock, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->fragmentShaderPixelInterlock, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->fragmentShaderShadingRateInterlock, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->fragmentShaderShadingRateInterlock,
+                   sizeof(VkBool32));
 }
 
 #endif
 #ifdef VK_EXT_ycbcr_image_arrays
 void marshal_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -29219,25 +27450,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -29247,184 +27476,170 @@
 #endif
 #ifdef VK_EXT_provoking_vertex
 void marshal_VkPhysicalDeviceProvokingVertexFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceProvokingVertexFeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceProvokingVertexFeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->provokingVertexLast, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->transformFeedbackPreservesProvokingVertex, sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->transformFeedbackPreservesProvokingVertex,
+                    sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceProvokingVertexFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceProvokingVertexFeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceProvokingVertexFeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkBool32*)&forUnmarshaling->provokingVertexLast, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->transformFeedbackPreservesProvokingVertex, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->transformFeedbackPreservesProvokingVertex,
+                   sizeof(VkBool32));
 }
 
 void marshal_VkPhysicalDeviceProvokingVertexPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceProvokingVertexPropertiesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceProvokingVertexPropertiesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->provokingVertexModePerPipeline, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->transformFeedbackPreservesTriangleFanProvokingVertex, sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->transformFeedbackPreservesTriangleFanProvokingVertex,
+                    sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceProvokingVertexPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceProvokingVertexPropertiesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceProvokingVertexPropertiesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkBool32*)&forUnmarshaling->provokingVertexModePerPipeline, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->transformFeedbackPreservesTriangleFanProvokingVertex, sizeof(VkBool32));
+    vkStream->read(
+        (VkBool32*)&forUnmarshaling->transformFeedbackPreservesTriangleFanProvokingVertex,
+        sizeof(VkBool32));
 }
 
 void marshal_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineRasterizationProvokingVertexStateCreateInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineRasterizationProvokingVertexStateCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkProvokingVertexModeEXT*)&forMarshaling->provokingVertexMode, sizeof(VkProvokingVertexModeEXT));
+    vkStream->write((VkProvokingVertexModeEXT*)&forMarshaling->provokingVertexMode,
+                    sizeof(VkProvokingVertexModeEXT));
 }
 
 void unmarshal_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineRasterizationProvokingVertexStateCreateInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineRasterizationProvokingVertexStateCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkProvokingVertexModeEXT*)&forUnmarshaling->provokingVertexMode, sizeof(VkProvokingVertexModeEXT));
+    vkStream->read((VkProvokingVertexModeEXT*)&forUnmarshaling->provokingVertexMode,
+                   sizeof(VkProvokingVertexModeEXT));
 }
 
 #endif
 #ifdef VK_EXT_full_screen_exclusive
 void marshal_VkSurfaceFullScreenExclusiveInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSurfaceFullScreenExclusiveInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkSurfaceFullScreenExclusiveInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkFullScreenExclusiveEXT*)&forMarshaling->fullScreenExclusive, sizeof(VkFullScreenExclusiveEXT));
+    vkStream->write((VkFullScreenExclusiveEXT*)&forMarshaling->fullScreenExclusive,
+                    sizeof(VkFullScreenExclusiveEXT));
 }
 
 void unmarshal_VkSurfaceFullScreenExclusiveInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSurfaceFullScreenExclusiveInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSurfaceFullScreenExclusiveInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkFullScreenExclusiveEXT*)&forUnmarshaling->fullScreenExclusive, sizeof(VkFullScreenExclusiveEXT));
+    vkStream->read((VkFullScreenExclusiveEXT*)&forUnmarshaling->fullScreenExclusive,
+                   sizeof(VkFullScreenExclusiveEXT));
 }
 
 void marshal_VkSurfaceCapabilitiesFullScreenExclusiveEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSurfaceCapabilitiesFullScreenExclusiveEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkSurfaceCapabilitiesFullScreenExclusiveEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -29432,25 +27647,23 @@
 }
 
 void unmarshal_VkSurfaceCapabilitiesFullScreenExclusiveEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSurfaceCapabilitiesFullScreenExclusiveEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSurfaceCapabilitiesFullScreenExclusiveEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -29458,14 +27671,11 @@
 }
 
 void marshal_VkSurfaceFullScreenExclusiveWin32InfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSurfaceFullScreenExclusiveWin32InfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkSurfaceFullScreenExclusiveWin32InfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -29473,25 +27683,23 @@
 }
 
 void unmarshal_VkSurfaceFullScreenExclusiveWin32InfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSurfaceFullScreenExclusiveWin32InfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSurfaceFullScreenExclusiveWin32InfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -29500,58 +27708,50 @@
 
 #endif
 #ifdef VK_EXT_headless_surface
-void marshal_VkHeadlessSurfaceCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkHeadlessSurfaceCreateInfoEXT* forMarshaling)
-{
+void marshal_VkHeadlessSurfaceCreateInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                            const VkHeadlessSurfaceCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkHeadlessSurfaceCreateFlagsEXT*)&forMarshaling->flags, sizeof(VkHeadlessSurfaceCreateFlagsEXT));
+    vkStream->write((VkHeadlessSurfaceCreateFlagsEXT*)&forMarshaling->flags,
+                    sizeof(VkHeadlessSurfaceCreateFlagsEXT));
 }
 
-void unmarshal_VkHeadlessSurfaceCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkHeadlessSurfaceCreateInfoEXT* forUnmarshaling)
-{
+void unmarshal_VkHeadlessSurfaceCreateInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkHeadlessSurfaceCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkHeadlessSurfaceCreateFlagsEXT*)&forUnmarshaling->flags, sizeof(VkHeadlessSurfaceCreateFlagsEXT));
+    vkStream->read((VkHeadlessSurfaceCreateFlagsEXT*)&forUnmarshaling->flags,
+                   sizeof(VkHeadlessSurfaceCreateFlagsEXT));
 }
 
 #endif
 #ifdef VK_EXT_line_rasterization
 void marshal_VkPhysicalDeviceLineRasterizationFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceLineRasterizationFeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceLineRasterizationFeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -29564,25 +27764,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceLineRasterizationFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceLineRasterizationFeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceLineRasterizationFeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -29595,14 +27793,11 @@
 }
 
 void marshal_VkPhysicalDeviceLineRasterizationPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceLineRasterizationPropertiesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceLineRasterizationPropertiesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -29610,25 +27805,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceLineRasterizationPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceLineRasterizationPropertiesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceLineRasterizationPropertiesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -29636,47 +27829,44 @@
 }
 
 void marshal_VkPipelineRasterizationLineStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineRasterizationLineStateCreateInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineRasterizationLineStateCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkLineRasterizationModeEXT*)&forMarshaling->lineRasterizationMode, sizeof(VkLineRasterizationModeEXT));
+    vkStream->write((VkLineRasterizationModeEXT*)&forMarshaling->lineRasterizationMode,
+                    sizeof(VkLineRasterizationModeEXT));
     vkStream->write((VkBool32*)&forMarshaling->stippledLineEnable, sizeof(VkBool32));
     vkStream->write((uint32_t*)&forMarshaling->lineStippleFactor, sizeof(uint32_t));
     vkStream->write((uint16_t*)&forMarshaling->lineStipplePattern, sizeof(uint16_t));
 }
 
 void unmarshal_VkPipelineRasterizationLineStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineRasterizationLineStateCreateInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineRasterizationLineStateCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkLineRasterizationModeEXT*)&forUnmarshaling->lineRasterizationMode, sizeof(VkLineRasterizationModeEXT));
+    vkStream->read((VkLineRasterizationModeEXT*)&forUnmarshaling->lineRasterizationMode,
+                   sizeof(VkLineRasterizationModeEXT));
     vkStream->read((VkBool32*)&forUnmarshaling->stippledLineEnable, sizeof(VkBool32));
     vkStream->read((uint32_t*)&forUnmarshaling->lineStippleFactor, sizeof(uint32_t));
     vkStream->read((uint16_t*)&forUnmarshaling->lineStipplePattern, sizeof(uint16_t));
@@ -29685,14 +27875,11 @@
 #endif
 #ifdef VK_EXT_shader_atomic_float
 void marshal_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -29711,25 +27898,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -29752,14 +27937,11 @@
 #endif
 #ifdef VK_EXT_index_type_uint8
 void marshal_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceIndexTypeUint8FeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceIndexTypeUint8FeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -29767,25 +27949,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceIndexTypeUint8FeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceIndexTypeUint8FeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -29795,14 +27975,11 @@
 #endif
 #ifdef VK_EXT_extended_dynamic_state
 void marshal_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -29810,25 +27987,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -29838,14 +28013,11 @@
 #endif
 #ifdef VK_EXT_shader_atomic_float2
 void marshal_VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -29864,25 +28036,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -29903,14 +28073,11 @@
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
 void marshal_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -29918,25 +28085,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -29946,14 +28111,11 @@
 #endif
 #ifdef VK_NV_device_generated_commands
 void marshal_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -29963,31 +28125,32 @@
     vkStream->write((uint32_t*)&forMarshaling->maxIndirectCommandsStreamCount, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxIndirectCommandsTokenOffset, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxIndirectCommandsStreamStride, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->minSequencesCountBufferOffsetAlignment, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->minSequencesIndexBufferOffsetAlignment, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->minIndirectCommandsBufferOffsetAlignment, sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->minSequencesCountBufferOffsetAlignment,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->minSequencesIndexBufferOffsetAlignment,
+                    sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->minIndirectCommandsBufferOffsetAlignment,
+                    sizeof(uint32_t));
 }
 
 void unmarshal_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -29997,20 +28160,20 @@
     vkStream->read((uint32_t*)&forUnmarshaling->maxIndirectCommandsStreamCount, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxIndirectCommandsTokenOffset, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxIndirectCommandsStreamStride, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->minSequencesCountBufferOffsetAlignment, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->minSequencesIndexBufferOffsetAlignment, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->minIndirectCommandsBufferOffsetAlignment, sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->minSequencesCountBufferOffsetAlignment,
+                   sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->minSequencesIndexBufferOffsetAlignment,
+                   sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->minIndirectCommandsBufferOffsetAlignment,
+                   sizeof(uint32_t));
 }
 
 void marshal_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -30018,25 +28181,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -30044,185 +28205,180 @@
 }
 
 void marshal_VkGraphicsShaderGroupCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkGraphicsShaderGroupCreateInfoNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkGraphicsShaderGroupCreateInfoNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->stageCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->stageCount; ++i)
-        {
-            marshal_VkPipelineShaderStageCreateInfo(vkStream, rootType, (const VkPipelineShaderStageCreateInfo*)(forMarshaling->pStages + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->stageCount; ++i) {
+            marshal_VkPipelineShaderStageCreateInfo(
+                vkStream, rootType,
+                (const VkPipelineShaderStageCreateInfo*)(forMarshaling->pStages + i));
         }
     }
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pVertexInputState;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pVertexInputState)
-    {
-        marshal_VkPipelineVertexInputStateCreateInfo(vkStream, rootType, (const VkPipelineVertexInputStateCreateInfo*)(forMarshaling->pVertexInputState));
+    if (forMarshaling->pVertexInputState) {
+        marshal_VkPipelineVertexInputStateCreateInfo(
+            vkStream, rootType,
+            (const VkPipelineVertexInputStateCreateInfo*)(forMarshaling->pVertexInputState));
     }
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)forMarshaling->pTessellationState;
     vkStream->putBe64(cgen_var_1);
-    if (forMarshaling->pTessellationState)
-    {
-        marshal_VkPipelineTessellationStateCreateInfo(vkStream, rootType, (const VkPipelineTessellationStateCreateInfo*)(forMarshaling->pTessellationState));
+    if (forMarshaling->pTessellationState) {
+        marshal_VkPipelineTessellationStateCreateInfo(
+            vkStream, rootType,
+            (const VkPipelineTessellationStateCreateInfo*)(forMarshaling->pTessellationState));
     }
 }
 
 void unmarshal_VkGraphicsShaderGroupCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkGraphicsShaderGroupCreateInfoNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkGraphicsShaderGroupCreateInfoNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->stageCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pStages, forUnmarshaling->stageCount * sizeof(const VkPipelineShaderStageCreateInfo));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->stageCount; ++i)
-        {
-            unmarshal_VkPipelineShaderStageCreateInfo(vkStream, rootType, (VkPipelineShaderStageCreateInfo*)(forUnmarshaling->pStages + i));
+    vkStream->alloc((void**)&forUnmarshaling->pStages,
+                    forUnmarshaling->stageCount * sizeof(const VkPipelineShaderStageCreateInfo));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->stageCount; ++i) {
+            unmarshal_VkPipelineShaderStageCreateInfo(
+                vkStream, rootType,
+                (VkPipelineShaderStageCreateInfo*)(forUnmarshaling->pStages + i));
         }
     }
     // WARNING PTR CHECK
-    forUnmarshaling->pVertexInputState = (const VkPipelineVertexInputStateCreateInfo*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pVertexInputState)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pVertexInputState, sizeof(const VkPipelineVertexInputStateCreateInfo));
-        unmarshal_VkPipelineVertexInputStateCreateInfo(vkStream, rootType, (VkPipelineVertexInputStateCreateInfo*)(forUnmarshaling->pVertexInputState));
+    forUnmarshaling->pVertexInputState =
+        (const VkPipelineVertexInputStateCreateInfo*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pVertexInputState) {
+        vkStream->alloc((void**)&forUnmarshaling->pVertexInputState,
+                        sizeof(const VkPipelineVertexInputStateCreateInfo));
+        unmarshal_VkPipelineVertexInputStateCreateInfo(
+            vkStream, rootType,
+            (VkPipelineVertexInputStateCreateInfo*)(forUnmarshaling->pVertexInputState));
     }
     // WARNING PTR CHECK
-    forUnmarshaling->pTessellationState = (const VkPipelineTessellationStateCreateInfo*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pTessellationState)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pTessellationState, sizeof(const VkPipelineTessellationStateCreateInfo));
-        unmarshal_VkPipelineTessellationStateCreateInfo(vkStream, rootType, (VkPipelineTessellationStateCreateInfo*)(forUnmarshaling->pTessellationState));
+    forUnmarshaling->pTessellationState =
+        (const VkPipelineTessellationStateCreateInfo*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pTessellationState) {
+        vkStream->alloc((void**)&forUnmarshaling->pTessellationState,
+                        sizeof(const VkPipelineTessellationStateCreateInfo));
+        unmarshal_VkPipelineTessellationStateCreateInfo(
+            vkStream, rootType,
+            (VkPipelineTessellationStateCreateInfo*)(forUnmarshaling->pTessellationState));
     }
 }
 
 void marshal_VkGraphicsPipelineShaderGroupsCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkGraphicsPipelineShaderGroupsCreateInfoNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkGraphicsPipelineShaderGroupsCreateInfoNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->groupCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->groupCount; ++i)
-        {
-            marshal_VkGraphicsShaderGroupCreateInfoNV(vkStream, rootType, (const VkGraphicsShaderGroupCreateInfoNV*)(forMarshaling->pGroups + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->groupCount; ++i) {
+            marshal_VkGraphicsShaderGroupCreateInfoNV(
+                vkStream, rootType,
+                (const VkGraphicsShaderGroupCreateInfoNV*)(forMarshaling->pGroups + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->pipelineCount, sizeof(uint32_t));
-    if (forMarshaling->pipelineCount)
-    {
+    if (forMarshaling->pipelineCount) {
         uint64_t* cgen_var_0;
         vkStream->alloc((void**)&cgen_var_0, forMarshaling->pipelineCount * 8);
-        vkStream->handleMapping()->mapHandles_VkPipeline_u64(forMarshaling->pPipelines, cgen_var_0, forMarshaling->pipelineCount);
+        vkStream->handleMapping()->mapHandles_VkPipeline_u64(forMarshaling->pPipelines, cgen_var_0,
+                                                             forMarshaling->pipelineCount);
         vkStream->write((uint64_t*)cgen_var_0, forMarshaling->pipelineCount * 8);
     }
 }
 
 void unmarshal_VkGraphicsPipelineShaderGroupsCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkGraphicsPipelineShaderGroupsCreateInfoNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkGraphicsPipelineShaderGroupsCreateInfoNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->groupCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pGroups, forUnmarshaling->groupCount * sizeof(const VkGraphicsShaderGroupCreateInfoNV));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->groupCount; ++i)
-        {
-            unmarshal_VkGraphicsShaderGroupCreateInfoNV(vkStream, rootType, (VkGraphicsShaderGroupCreateInfoNV*)(forUnmarshaling->pGroups + i));
+    vkStream->alloc((void**)&forUnmarshaling->pGroups,
+                    forUnmarshaling->groupCount * sizeof(const VkGraphicsShaderGroupCreateInfoNV));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->groupCount; ++i) {
+            unmarshal_VkGraphicsShaderGroupCreateInfoNV(
+                vkStream, rootType,
+                (VkGraphicsShaderGroupCreateInfoNV*)(forUnmarshaling->pGroups + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->pipelineCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pPipelines, forUnmarshaling->pipelineCount * sizeof(const VkPipeline));
-    if (forUnmarshaling->pipelineCount)
-    {
+    vkStream->alloc((void**)&forUnmarshaling->pPipelines,
+                    forUnmarshaling->pipelineCount * sizeof(const VkPipeline));
+    if (forUnmarshaling->pipelineCount) {
         uint64_t* cgen_var_0;
         vkStream->alloc((void**)&cgen_var_0, forUnmarshaling->pipelineCount * 8);
         vkStream->read((uint64_t*)cgen_var_0, forUnmarshaling->pipelineCount * 8);
-        vkStream->handleMapping()->mapHandles_u64_VkPipeline(cgen_var_0, (VkPipeline*)forUnmarshaling->pPipelines, forUnmarshaling->pipelineCount);
+        vkStream->handleMapping()->mapHandles_u64_VkPipeline(
+            cgen_var_0, (VkPipeline*)forUnmarshaling->pPipelines, forUnmarshaling->pipelineCount);
     }
 }
 
 void marshal_VkBindShaderGroupIndirectCommandNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBindShaderGroupIndirectCommandNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkBindShaderGroupIndirectCommandNV* forMarshaling) {
     (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->groupIndex, sizeof(uint32_t));
 }
 
 void unmarshal_VkBindShaderGroupIndirectCommandNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindShaderGroupIndirectCommandNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBindShaderGroupIndirectCommandNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->groupIndex, sizeof(uint32_t));
 }
 
 void marshal_VkBindIndexBufferIndirectCommandNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBindIndexBufferIndirectCommandNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkBindIndexBufferIndirectCommandNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkDeviceAddress*)&forMarshaling->bufferAddress, sizeof(VkDeviceAddress));
     vkStream->write((uint32_t*)&forMarshaling->size, sizeof(uint32_t));
@@ -30230,10 +28386,8 @@
 }
 
 void unmarshal_VkBindIndexBufferIndirectCommandNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindIndexBufferIndirectCommandNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBindIndexBufferIndirectCommandNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkDeviceAddress*)&forUnmarshaling->bufferAddress, sizeof(VkDeviceAddress));
     vkStream->read((uint32_t*)&forUnmarshaling->size, sizeof(uint32_t));
@@ -30241,10 +28395,8 @@
 }
 
 void marshal_VkBindVertexBufferIndirectCommandNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBindVertexBufferIndirectCommandNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkBindVertexBufferIndirectCommandNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkDeviceAddress*)&forMarshaling->bufferAddress, sizeof(VkDeviceAddress));
     vkStream->write((uint32_t*)&forMarshaling->size, sizeof(uint32_t));
@@ -30252,10 +28404,8 @@
 }
 
 void unmarshal_VkBindVertexBufferIndirectCommandNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindVertexBufferIndirectCommandNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBindVertexBufferIndirectCommandNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkDeviceAddress*)&forUnmarshaling->bufferAddress, sizeof(VkDeviceAddress));
     vkStream->read((uint32_t*)&forUnmarshaling->size, sizeof(uint32_t));
@@ -30263,28 +28413,20 @@
 }
 
 void marshal_VkSetStateFlagsIndirectCommandNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSetStateFlagsIndirectCommandNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkSetStateFlagsIndirectCommandNV* forMarshaling) {
     (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->data, sizeof(uint32_t));
 }
 
-void unmarshal_VkSetStateFlagsIndirectCommandNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSetStateFlagsIndirectCommandNV* forUnmarshaling)
-{
+void unmarshal_VkSetStateFlagsIndirectCommandNV(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkSetStateFlagsIndirectCommandNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->data, sizeof(uint32_t));
 }
 
-void marshal_VkIndirectCommandsStreamNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkIndirectCommandsStreamNV* forMarshaling)
-{
+void marshal_VkIndirectCommandsStreamNV(VulkanStream* vkStream, VkStructureType rootType,
+                                        const VkIndirectCommandsStreamNV* forMarshaling) {
     (void)rootType;
     uint64_t cgen_var_0;
     vkStream->handleMapping()->mapHandles_VkBuffer_u64(&forMarshaling->buffer, &cgen_var_0, 1);
@@ -30292,318 +28434,327 @@
     vkStream->write((VkDeviceSize*)&forMarshaling->offset, sizeof(VkDeviceSize));
 }
 
-void unmarshal_VkIndirectCommandsStreamNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkIndirectCommandsStreamNV* forUnmarshaling)
-{
+void unmarshal_VkIndirectCommandsStreamNV(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkIndirectCommandsStreamNV* forUnmarshaling) {
     (void)rootType;
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_0, (VkBuffer*)&forUnmarshaling->buffer, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_0,
+                                                       (VkBuffer*)&forUnmarshaling->buffer, 1);
     vkStream->read((VkDeviceSize*)&forUnmarshaling->offset, sizeof(VkDeviceSize));
 }
 
-void marshal_VkIndirectCommandsLayoutTokenNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkIndirectCommandsLayoutTokenNV* forMarshaling)
-{
+void marshal_VkIndirectCommandsLayoutTokenNV(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkIndirectCommandsLayoutTokenNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkIndirectCommandsTokenTypeNV*)&forMarshaling->tokenType, sizeof(VkIndirectCommandsTokenTypeNV));
+    vkStream->write((VkIndirectCommandsTokenTypeNV*)&forMarshaling->tokenType,
+                    sizeof(VkIndirectCommandsTokenTypeNV));
     vkStream->write((uint32_t*)&forMarshaling->stream, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->offset, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->vertexBindingUnit, sizeof(uint32_t));
     vkStream->write((VkBool32*)&forMarshaling->vertexDynamicStride, sizeof(VkBool32));
     uint64_t cgen_var_0;
-    vkStream->handleMapping()->mapHandles_VkPipelineLayout_u64(&forMarshaling->pushconstantPipelineLayout, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkPipelineLayout_u64(
+        &forMarshaling->pushconstantPipelineLayout, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->write((VkShaderStageFlags*)&forMarshaling->pushconstantShaderStageFlags, sizeof(VkShaderStageFlags));
+    vkStream->write((VkShaderStageFlags*)&forMarshaling->pushconstantShaderStageFlags,
+                    sizeof(VkShaderStageFlags));
     vkStream->write((uint32_t*)&forMarshaling->pushconstantOffset, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->pushconstantSize, sizeof(uint32_t));
-    vkStream->write((VkIndirectStateFlagsNV*)&forMarshaling->indirectStateFlags, sizeof(VkIndirectStateFlagsNV));
+    vkStream->write((VkIndirectStateFlagsNV*)&forMarshaling->indirectStateFlags,
+                    sizeof(VkIndirectStateFlagsNV));
     vkStream->write((uint32_t*)&forMarshaling->indexTypeCount, sizeof(uint32_t));
-    vkStream->write((const VkIndexType*)forMarshaling->pIndexTypes, forMarshaling->indexTypeCount * sizeof(const VkIndexType));
-    vkStream->write((const uint32_t*)forMarshaling->pIndexTypeValues, forMarshaling->indexTypeCount * sizeof(const uint32_t));
+    vkStream->write((const VkIndexType*)forMarshaling->pIndexTypes,
+                    forMarshaling->indexTypeCount * sizeof(const VkIndexType));
+    vkStream->write((const uint32_t*)forMarshaling->pIndexTypeValues,
+                    forMarshaling->indexTypeCount * sizeof(const uint32_t));
 }
 
-void unmarshal_VkIndirectCommandsLayoutTokenNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkIndirectCommandsLayoutTokenNV* forUnmarshaling)
-{
+void unmarshal_VkIndirectCommandsLayoutTokenNV(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkIndirectCommandsLayoutTokenNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkIndirectCommandsTokenTypeNV*)&forUnmarshaling->tokenType, sizeof(VkIndirectCommandsTokenTypeNV));
+    vkStream->read((VkIndirectCommandsTokenTypeNV*)&forUnmarshaling->tokenType,
+                   sizeof(VkIndirectCommandsTokenTypeNV));
     vkStream->read((uint32_t*)&forUnmarshaling->stream, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->offset, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->vertexBindingUnit, sizeof(uint32_t));
     vkStream->read((VkBool32*)&forUnmarshaling->vertexDynamicStride, sizeof(VkBool32));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkPipelineLayout(&cgen_var_0, (VkPipelineLayout*)&forUnmarshaling->pushconstantPipelineLayout, 1);
-    vkStream->read((VkShaderStageFlags*)&forUnmarshaling->pushconstantShaderStageFlags, sizeof(VkShaderStageFlags));
+    vkStream->handleMapping()->mapHandles_u64_VkPipelineLayout(
+        &cgen_var_0, (VkPipelineLayout*)&forUnmarshaling->pushconstantPipelineLayout, 1);
+    vkStream->read((VkShaderStageFlags*)&forUnmarshaling->pushconstantShaderStageFlags,
+                   sizeof(VkShaderStageFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->pushconstantOffset, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->pushconstantSize, sizeof(uint32_t));
-    vkStream->read((VkIndirectStateFlagsNV*)&forUnmarshaling->indirectStateFlags, sizeof(VkIndirectStateFlagsNV));
+    vkStream->read((VkIndirectStateFlagsNV*)&forUnmarshaling->indirectStateFlags,
+                   sizeof(VkIndirectStateFlagsNV));
     vkStream->read((uint32_t*)&forUnmarshaling->indexTypeCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pIndexTypes, forUnmarshaling->indexTypeCount * sizeof(const VkIndexType));
-    vkStream->read((VkIndexType*)forUnmarshaling->pIndexTypes, forUnmarshaling->indexTypeCount * sizeof(const VkIndexType));
-    vkStream->alloc((void**)&forUnmarshaling->pIndexTypeValues, forUnmarshaling->indexTypeCount * sizeof(const uint32_t));
-    vkStream->read((uint32_t*)forUnmarshaling->pIndexTypeValues, forUnmarshaling->indexTypeCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pIndexTypes,
+                    forUnmarshaling->indexTypeCount * sizeof(const VkIndexType));
+    vkStream->read((VkIndexType*)forUnmarshaling->pIndexTypes,
+                   forUnmarshaling->indexTypeCount * sizeof(const VkIndexType));
+    vkStream->alloc((void**)&forUnmarshaling->pIndexTypeValues,
+                    forUnmarshaling->indexTypeCount * sizeof(const uint32_t));
+    vkStream->read((uint32_t*)forUnmarshaling->pIndexTypeValues,
+                   forUnmarshaling->indexTypeCount * sizeof(const uint32_t));
 }
 
 void marshal_VkIndirectCommandsLayoutCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkIndirectCommandsLayoutCreateInfoNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkIndirectCommandsLayoutCreateInfoNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkIndirectCommandsLayoutUsageFlagsNV*)&forMarshaling->flags, sizeof(VkIndirectCommandsLayoutUsageFlagsNV));
-    vkStream->write((VkPipelineBindPoint*)&forMarshaling->pipelineBindPoint, sizeof(VkPipelineBindPoint));
+    vkStream->write((VkIndirectCommandsLayoutUsageFlagsNV*)&forMarshaling->flags,
+                    sizeof(VkIndirectCommandsLayoutUsageFlagsNV));
+    vkStream->write((VkPipelineBindPoint*)&forMarshaling->pipelineBindPoint,
+                    sizeof(VkPipelineBindPoint));
     vkStream->write((uint32_t*)&forMarshaling->tokenCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->tokenCount; ++i)
-        {
-            marshal_VkIndirectCommandsLayoutTokenNV(vkStream, rootType, (const VkIndirectCommandsLayoutTokenNV*)(forMarshaling->pTokens + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->tokenCount; ++i) {
+            marshal_VkIndirectCommandsLayoutTokenNV(
+                vkStream, rootType,
+                (const VkIndirectCommandsLayoutTokenNV*)(forMarshaling->pTokens + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->streamCount, sizeof(uint32_t));
-    vkStream->write((const uint32_t*)forMarshaling->pStreamStrides, forMarshaling->streamCount * sizeof(const uint32_t));
+    vkStream->write((const uint32_t*)forMarshaling->pStreamStrides,
+                    forMarshaling->streamCount * sizeof(const uint32_t));
 }
 
 void unmarshal_VkIndirectCommandsLayoutCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkIndirectCommandsLayoutCreateInfoNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkIndirectCommandsLayoutCreateInfoNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkIndirectCommandsLayoutUsageFlagsNV*)&forUnmarshaling->flags, sizeof(VkIndirectCommandsLayoutUsageFlagsNV));
-    vkStream->read((VkPipelineBindPoint*)&forUnmarshaling->pipelineBindPoint, sizeof(VkPipelineBindPoint));
+    vkStream->read((VkIndirectCommandsLayoutUsageFlagsNV*)&forUnmarshaling->flags,
+                   sizeof(VkIndirectCommandsLayoutUsageFlagsNV));
+    vkStream->read((VkPipelineBindPoint*)&forUnmarshaling->pipelineBindPoint,
+                   sizeof(VkPipelineBindPoint));
     vkStream->read((uint32_t*)&forUnmarshaling->tokenCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pTokens, forUnmarshaling->tokenCount * sizeof(const VkIndirectCommandsLayoutTokenNV));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->tokenCount; ++i)
-        {
-            unmarshal_VkIndirectCommandsLayoutTokenNV(vkStream, rootType, (VkIndirectCommandsLayoutTokenNV*)(forUnmarshaling->pTokens + i));
+    vkStream->alloc((void**)&forUnmarshaling->pTokens,
+                    forUnmarshaling->tokenCount * sizeof(const VkIndirectCommandsLayoutTokenNV));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->tokenCount; ++i) {
+            unmarshal_VkIndirectCommandsLayoutTokenNV(
+                vkStream, rootType,
+                (VkIndirectCommandsLayoutTokenNV*)(forUnmarshaling->pTokens + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->streamCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pStreamStrides, forUnmarshaling->streamCount * sizeof(const uint32_t));
-    vkStream->read((uint32_t*)forUnmarshaling->pStreamStrides, forUnmarshaling->streamCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pStreamStrides,
+                    forUnmarshaling->streamCount * sizeof(const uint32_t));
+    vkStream->read((uint32_t*)forUnmarshaling->pStreamStrides,
+                   forUnmarshaling->streamCount * sizeof(const uint32_t));
 }
 
-void marshal_VkGeneratedCommandsInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkGeneratedCommandsInfoNV* forMarshaling)
-{
+void marshal_VkGeneratedCommandsInfoNV(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkGeneratedCommandsInfoNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkPipelineBindPoint*)&forMarshaling->pipelineBindPoint, sizeof(VkPipelineBindPoint));
+    vkStream->write((VkPipelineBindPoint*)&forMarshaling->pipelineBindPoint,
+                    sizeof(VkPipelineBindPoint));
     uint64_t cgen_var_0;
     vkStream->handleMapping()->mapHandles_VkPipeline_u64(&forMarshaling->pipeline, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     uint64_t cgen_var_1;
-    vkStream->handleMapping()->mapHandles_VkIndirectCommandsLayoutNV_u64(&forMarshaling->indirectCommandsLayout, &cgen_var_1, 1);
+    vkStream->handleMapping()->mapHandles_VkIndirectCommandsLayoutNV_u64(
+        &forMarshaling->indirectCommandsLayout, &cgen_var_1, 1);
     vkStream->write((uint64_t*)&cgen_var_1, 1 * 8);
     vkStream->write((uint32_t*)&forMarshaling->streamCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->streamCount; ++i)
-        {
-            marshal_VkIndirectCommandsStreamNV(vkStream, rootType, (const VkIndirectCommandsStreamNV*)(forMarshaling->pStreams + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->streamCount; ++i) {
+            marshal_VkIndirectCommandsStreamNV(
+                vkStream, rootType,
+                (const VkIndirectCommandsStreamNV*)(forMarshaling->pStreams + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->sequencesCount, sizeof(uint32_t));
     uint64_t cgen_var_2;
-    vkStream->handleMapping()->mapHandles_VkBuffer_u64(&forMarshaling->preprocessBuffer, &cgen_var_2, 1);
+    vkStream->handleMapping()->mapHandles_VkBuffer_u64(&forMarshaling->preprocessBuffer,
+                                                       &cgen_var_2, 1);
     vkStream->write((uint64_t*)&cgen_var_2, 1 * 8);
     vkStream->write((VkDeviceSize*)&forMarshaling->preprocessOffset, sizeof(VkDeviceSize));
     vkStream->write((VkDeviceSize*)&forMarshaling->preprocessSize, sizeof(VkDeviceSize));
     uint64_t cgen_var_3;
-    vkStream->handleMapping()->mapHandles_VkBuffer_u64(&forMarshaling->sequencesCountBuffer, &cgen_var_3, 1);
+    vkStream->handleMapping()->mapHandles_VkBuffer_u64(&forMarshaling->sequencesCountBuffer,
+                                                       &cgen_var_3, 1);
     vkStream->write((uint64_t*)&cgen_var_3, 1 * 8);
     vkStream->write((VkDeviceSize*)&forMarshaling->sequencesCountOffset, sizeof(VkDeviceSize));
     uint64_t cgen_var_4;
-    vkStream->handleMapping()->mapHandles_VkBuffer_u64(&forMarshaling->sequencesIndexBuffer, &cgen_var_4, 1);
+    vkStream->handleMapping()->mapHandles_VkBuffer_u64(&forMarshaling->sequencesIndexBuffer,
+                                                       &cgen_var_4, 1);
     vkStream->write((uint64_t*)&cgen_var_4, 1 * 8);
     vkStream->write((VkDeviceSize*)&forMarshaling->sequencesIndexOffset, sizeof(VkDeviceSize));
 }
 
-void unmarshal_VkGeneratedCommandsInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkGeneratedCommandsInfoNV* forUnmarshaling)
-{
+void unmarshal_VkGeneratedCommandsInfoNV(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkGeneratedCommandsInfoNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkPipelineBindPoint*)&forUnmarshaling->pipelineBindPoint, sizeof(VkPipelineBindPoint));
+    vkStream->read((VkPipelineBindPoint*)&forUnmarshaling->pipelineBindPoint,
+                   sizeof(VkPipelineBindPoint));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkPipeline(&cgen_var_0, (VkPipeline*)&forUnmarshaling->pipeline, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkPipeline(
+        &cgen_var_0, (VkPipeline*)&forUnmarshaling->pipeline, 1);
     uint64_t cgen_var_1;
     vkStream->read((uint64_t*)&cgen_var_1, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkIndirectCommandsLayoutNV(&cgen_var_1, (VkIndirectCommandsLayoutNV*)&forUnmarshaling->indirectCommandsLayout, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkIndirectCommandsLayoutNV(
+        &cgen_var_1, (VkIndirectCommandsLayoutNV*)&forUnmarshaling->indirectCommandsLayout, 1);
     vkStream->read((uint32_t*)&forUnmarshaling->streamCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pStreams, forUnmarshaling->streamCount * sizeof(const VkIndirectCommandsStreamNV));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->streamCount; ++i)
-        {
-            unmarshal_VkIndirectCommandsStreamNV(vkStream, rootType, (VkIndirectCommandsStreamNV*)(forUnmarshaling->pStreams + i));
+    vkStream->alloc((void**)&forUnmarshaling->pStreams,
+                    forUnmarshaling->streamCount * sizeof(const VkIndirectCommandsStreamNV));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->streamCount; ++i) {
+            unmarshal_VkIndirectCommandsStreamNV(
+                vkStream, rootType, (VkIndirectCommandsStreamNV*)(forUnmarshaling->pStreams + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->sequencesCount, sizeof(uint32_t));
     uint64_t cgen_var_2;
     vkStream->read((uint64_t*)&cgen_var_2, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_2, (VkBuffer*)&forUnmarshaling->preprocessBuffer, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkBuffer(
+        &cgen_var_2, (VkBuffer*)&forUnmarshaling->preprocessBuffer, 1);
     vkStream->read((VkDeviceSize*)&forUnmarshaling->preprocessOffset, sizeof(VkDeviceSize));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->preprocessSize, sizeof(VkDeviceSize));
     uint64_t cgen_var_3;
     vkStream->read((uint64_t*)&cgen_var_3, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_3, (VkBuffer*)&forUnmarshaling->sequencesCountBuffer, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkBuffer(
+        &cgen_var_3, (VkBuffer*)&forUnmarshaling->sequencesCountBuffer, 1);
     vkStream->read((VkDeviceSize*)&forUnmarshaling->sequencesCountOffset, sizeof(VkDeviceSize));
     uint64_t cgen_var_4;
     vkStream->read((uint64_t*)&cgen_var_4, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_4, (VkBuffer*)&forUnmarshaling->sequencesIndexBuffer, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkBuffer(
+        &cgen_var_4, (VkBuffer*)&forUnmarshaling->sequencesIndexBuffer, 1);
     vkStream->read((VkDeviceSize*)&forUnmarshaling->sequencesIndexOffset, sizeof(VkDeviceSize));
 }
 
 void marshal_VkGeneratedCommandsMemoryRequirementsInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkGeneratedCommandsMemoryRequirementsInfoNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkGeneratedCommandsMemoryRequirementsInfoNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkPipelineBindPoint*)&forMarshaling->pipelineBindPoint, sizeof(VkPipelineBindPoint));
+    vkStream->write((VkPipelineBindPoint*)&forMarshaling->pipelineBindPoint,
+                    sizeof(VkPipelineBindPoint));
     uint64_t cgen_var_0;
     vkStream->handleMapping()->mapHandles_VkPipeline_u64(&forMarshaling->pipeline, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     uint64_t cgen_var_1;
-    vkStream->handleMapping()->mapHandles_VkIndirectCommandsLayoutNV_u64(&forMarshaling->indirectCommandsLayout, &cgen_var_1, 1);
+    vkStream->handleMapping()->mapHandles_VkIndirectCommandsLayoutNV_u64(
+        &forMarshaling->indirectCommandsLayout, &cgen_var_1, 1);
     vkStream->write((uint64_t*)&cgen_var_1, 1 * 8);
     vkStream->write((uint32_t*)&forMarshaling->maxSequencesCount, sizeof(uint32_t));
 }
 
 void unmarshal_VkGeneratedCommandsMemoryRequirementsInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkGeneratedCommandsMemoryRequirementsInfoNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkGeneratedCommandsMemoryRequirementsInfoNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkPipelineBindPoint*)&forUnmarshaling->pipelineBindPoint, sizeof(VkPipelineBindPoint));
+    vkStream->read((VkPipelineBindPoint*)&forUnmarshaling->pipelineBindPoint,
+                   sizeof(VkPipelineBindPoint));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkPipeline(&cgen_var_0, (VkPipeline*)&forUnmarshaling->pipeline, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkPipeline(
+        &cgen_var_0, (VkPipeline*)&forUnmarshaling->pipeline, 1);
     uint64_t cgen_var_1;
     vkStream->read((uint64_t*)&cgen_var_1, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkIndirectCommandsLayoutNV(&cgen_var_1, (VkIndirectCommandsLayoutNV*)&forUnmarshaling->indirectCommandsLayout, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkIndirectCommandsLayoutNV(
+        &cgen_var_1, (VkIndirectCommandsLayoutNV*)&forUnmarshaling->indirectCommandsLayout, 1);
     vkStream->read((uint32_t*)&forUnmarshaling->maxSequencesCount, sizeof(uint32_t));
 }
 
 #endif
 #ifdef VK_NV_inherited_viewport_scissor
 void marshal_VkPhysicalDeviceInheritedViewportScissorFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceInheritedViewportScissorFeaturesNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceInheritedViewportScissorFeaturesNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -30611,25 +28762,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceInheritedViewportScissorFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceInheritedViewportScissorFeaturesNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceInheritedViewportScissorFeaturesNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -30637,14 +28786,11 @@
 }
 
 void marshal_VkCommandBufferInheritanceViewportScissorInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCommandBufferInheritanceViewportScissorInfoNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkCommandBufferInheritanceViewportScissorInfoNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -30653,32 +28799,29 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pViewportDepths;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pViewportDepths)
-    {
+    if (forMarshaling->pViewportDepths) {
         marshal_VkViewport(vkStream, rootType, (const VkViewport*)(forMarshaling->pViewportDepths));
     }
 }
 
 void unmarshal_VkCommandBufferInheritanceViewportScissorInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCommandBufferInheritanceViewportScissorInfoNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkCommandBufferInheritanceViewportScissorInfoNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -30686,8 +28829,7 @@
     vkStream->read((uint32_t*)&forUnmarshaling->viewportDepthCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     forUnmarshaling->pViewportDepths = (const VkViewport*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pViewportDepths)
-    {
+    if (forUnmarshaling->pViewportDepths) {
         vkStream->alloc((void**)&forUnmarshaling->pViewportDepths, sizeof(const VkViewport));
         unmarshal_VkViewport(vkStream, rootType, (VkViewport*)(forUnmarshaling->pViewportDepths));
     }
@@ -30696,14 +28838,11 @@
 #endif
 #ifdef VK_EXT_texel_buffer_alignment
 void marshal_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -30711,25 +28850,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -30737,149 +28874,143 @@
 }
 
 void marshal_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkDeviceSize*)&forMarshaling->storageTexelBufferOffsetAlignmentBytes, sizeof(VkDeviceSize));
-    vkStream->write((VkBool32*)&forMarshaling->storageTexelBufferOffsetSingleTexelAlignment, sizeof(VkBool32));
-    vkStream->write((VkDeviceSize*)&forMarshaling->uniformTexelBufferOffsetAlignmentBytes, sizeof(VkDeviceSize));
-    vkStream->write((VkBool32*)&forMarshaling->uniformTexelBufferOffsetSingleTexelAlignment, sizeof(VkBool32));
+    vkStream->write((VkDeviceSize*)&forMarshaling->storageTexelBufferOffsetAlignmentBytes,
+                    sizeof(VkDeviceSize));
+    vkStream->write((VkBool32*)&forMarshaling->storageTexelBufferOffsetSingleTexelAlignment,
+                    sizeof(VkBool32));
+    vkStream->write((VkDeviceSize*)&forMarshaling->uniformTexelBufferOffsetAlignmentBytes,
+                    sizeof(VkDeviceSize));
+    vkStream->write((VkBool32*)&forMarshaling->uniformTexelBufferOffsetSingleTexelAlignment,
+                    sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkDeviceSize*)&forUnmarshaling->storageTexelBufferOffsetAlignmentBytes, sizeof(VkDeviceSize));
-    vkStream->read((VkBool32*)&forUnmarshaling->storageTexelBufferOffsetSingleTexelAlignment, sizeof(VkBool32));
-    vkStream->read((VkDeviceSize*)&forUnmarshaling->uniformTexelBufferOffsetAlignmentBytes, sizeof(VkDeviceSize));
-    vkStream->read((VkBool32*)&forUnmarshaling->uniformTexelBufferOffsetSingleTexelAlignment, sizeof(VkBool32));
+    vkStream->read((VkDeviceSize*)&forUnmarshaling->storageTexelBufferOffsetAlignmentBytes,
+                   sizeof(VkDeviceSize));
+    vkStream->read((VkBool32*)&forUnmarshaling->storageTexelBufferOffsetSingleTexelAlignment,
+                   sizeof(VkBool32));
+    vkStream->read((VkDeviceSize*)&forUnmarshaling->uniformTexelBufferOffsetAlignmentBytes,
+                   sizeof(VkDeviceSize));
+    vkStream->read((VkBool32*)&forUnmarshaling->uniformTexelBufferOffsetSingleTexelAlignment,
+                   sizeof(VkBool32));
 }
 
 #endif
 #ifdef VK_QCOM_render_pass_transform
 void marshal_VkRenderPassTransformBeginInfoQCOM(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkRenderPassTransformBeginInfoQCOM* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkRenderPassTransformBeginInfoQCOM* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkSurfaceTransformFlagBitsKHR*)&forMarshaling->transform, sizeof(VkSurfaceTransformFlagBitsKHR));
+    vkStream->write((VkSurfaceTransformFlagBitsKHR*)&forMarshaling->transform,
+                    sizeof(VkSurfaceTransformFlagBitsKHR));
 }
 
 void unmarshal_VkRenderPassTransformBeginInfoQCOM(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderPassTransformBeginInfoQCOM* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkRenderPassTransformBeginInfoQCOM* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkSurfaceTransformFlagBitsKHR*)&forUnmarshaling->transform, sizeof(VkSurfaceTransformFlagBitsKHR));
+    vkStream->read((VkSurfaceTransformFlagBitsKHR*)&forUnmarshaling->transform,
+                   sizeof(VkSurfaceTransformFlagBitsKHR));
 }
 
 void marshal_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCommandBufferInheritanceRenderPassTransformInfoQCOM* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkCommandBufferInheritanceRenderPassTransformInfoQCOM* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkSurfaceTransformFlagBitsKHR*)&forMarshaling->transform, sizeof(VkSurfaceTransformFlagBitsKHR));
+    vkStream->write((VkSurfaceTransformFlagBitsKHR*)&forMarshaling->transform,
+                    sizeof(VkSurfaceTransformFlagBitsKHR));
     marshal_VkRect2D(vkStream, rootType, (VkRect2D*)(&forMarshaling->renderArea));
 }
 
 void unmarshal_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCommandBufferInheritanceRenderPassTransformInfoQCOM* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkCommandBufferInheritanceRenderPassTransformInfoQCOM* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkSurfaceTransformFlagBitsKHR*)&forUnmarshaling->transform, sizeof(VkSurfaceTransformFlagBitsKHR));
+    vkStream->read((VkSurfaceTransformFlagBitsKHR*)&forUnmarshaling->transform,
+                   sizeof(VkSurfaceTransformFlagBitsKHR));
     unmarshal_VkRect2D(vkStream, rootType, (VkRect2D*)(&forUnmarshaling->renderArea));
 }
 
 #endif
 #ifdef VK_EXT_device_memory_report
 void marshal_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -30887,25 +29018,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -30913,19 +29042,18 @@
 }
 
 void marshal_VkDeviceMemoryReportCallbackDataEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDeviceMemoryReportCallbackDataEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkDeviceMemoryReportCallbackDataEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkDeviceMemoryReportFlagsEXT*)&forMarshaling->flags, sizeof(VkDeviceMemoryReportFlagsEXT));
-    vkStream->write((VkDeviceMemoryReportEventTypeEXT*)&forMarshaling->type, sizeof(VkDeviceMemoryReportEventTypeEXT));
+    vkStream->write((VkDeviceMemoryReportFlagsEXT*)&forMarshaling->flags,
+                    sizeof(VkDeviceMemoryReportFlagsEXT));
+    vkStream->write((VkDeviceMemoryReportEventTypeEXT*)&forMarshaling->type,
+                    sizeof(VkDeviceMemoryReportEventTypeEXT));
     vkStream->write((uint64_t*)&forMarshaling->memoryObjectId, sizeof(uint64_t));
     vkStream->write((VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
     vkStream->write((VkObjectType*)&forMarshaling->objectType, sizeof(VkObjectType));
@@ -30934,30 +29062,30 @@
 }
 
 void unmarshal_VkDeviceMemoryReportCallbackDataEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceMemoryReportCallbackDataEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDeviceMemoryReportCallbackDataEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkDeviceMemoryReportFlagsEXT*)&forUnmarshaling->flags, sizeof(VkDeviceMemoryReportFlagsEXT));
-    vkStream->read((VkDeviceMemoryReportEventTypeEXT*)&forUnmarshaling->type, sizeof(VkDeviceMemoryReportEventTypeEXT));
+    vkStream->read((VkDeviceMemoryReportFlagsEXT*)&forUnmarshaling->flags,
+                   sizeof(VkDeviceMemoryReportFlagsEXT));
+    vkStream->read((VkDeviceMemoryReportEventTypeEXT*)&forUnmarshaling->type,
+                   sizeof(VkDeviceMemoryReportEventTypeEXT));
     vkStream->read((uint64_t*)&forUnmarshaling->memoryObjectId, sizeof(uint64_t));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->size, sizeof(VkDeviceSize));
     vkStream->read((VkObjectType*)&forUnmarshaling->objectType, sizeof(VkObjectType));
@@ -30966,47 +29094,44 @@
 }
 
 void marshal_VkDeviceDeviceMemoryReportCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDeviceDeviceMemoryReportCreateInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkDeviceDeviceMemoryReportCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkDeviceMemoryReportFlagsEXT*)&forMarshaling->flags, sizeof(VkDeviceMemoryReportFlagsEXT));
+    vkStream->write((VkDeviceMemoryReportFlagsEXT*)&forMarshaling->flags,
+                    sizeof(VkDeviceMemoryReportFlagsEXT));
     uint64_t cgen_var_0 = (uint64_t)forMarshaling->pfnUserCallback;
     vkStream->putBe64(cgen_var_0);
     vkStream->write((void*)forMarshaling->pUserData, sizeof(uint8_t));
 }
 
 void unmarshal_VkDeviceDeviceMemoryReportCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceDeviceMemoryReportCreateInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDeviceDeviceMemoryReportCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkDeviceMemoryReportFlagsEXT*)&forUnmarshaling->flags, sizeof(VkDeviceMemoryReportFlagsEXT));
+    vkStream->read((VkDeviceMemoryReportFlagsEXT*)&forUnmarshaling->flags,
+                   sizeof(VkDeviceMemoryReportFlagsEXT));
     forUnmarshaling->pfnUserCallback = (PFN_vkDeviceMemoryReportCallbackEXT)vkStream->getBe64();
     vkStream->alloc((void**)&forUnmarshaling->pUserData, sizeof(uint8_t));
     vkStream->read((void*)forUnmarshaling->pUserData, sizeof(uint8_t));
@@ -31017,14 +29142,11 @@
 #endif
 #ifdef VK_EXT_robustness2
 void marshal_VkPhysicalDeviceRobustness2FeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceRobustness2FeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceRobustness2FeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -31034,25 +29156,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceRobustness2FeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceRobustness2FeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceRobustness2FeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -31062,102 +29182,95 @@
 }
 
 void marshal_VkPhysicalDeviceRobustness2PropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceRobustness2PropertiesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceRobustness2PropertiesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkDeviceSize*)&forMarshaling->robustStorageBufferAccessSizeAlignment, sizeof(VkDeviceSize));
-    vkStream->write((VkDeviceSize*)&forMarshaling->robustUniformBufferAccessSizeAlignment, sizeof(VkDeviceSize));
+    vkStream->write((VkDeviceSize*)&forMarshaling->robustStorageBufferAccessSizeAlignment,
+                    sizeof(VkDeviceSize));
+    vkStream->write((VkDeviceSize*)&forMarshaling->robustUniformBufferAccessSizeAlignment,
+                    sizeof(VkDeviceSize));
 }
 
 void unmarshal_VkPhysicalDeviceRobustness2PropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceRobustness2PropertiesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceRobustness2PropertiesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkDeviceSize*)&forUnmarshaling->robustStorageBufferAccessSizeAlignment, sizeof(VkDeviceSize));
-    vkStream->read((VkDeviceSize*)&forUnmarshaling->robustUniformBufferAccessSizeAlignment, sizeof(VkDeviceSize));
+    vkStream->read((VkDeviceSize*)&forUnmarshaling->robustStorageBufferAccessSizeAlignment,
+                   sizeof(VkDeviceSize));
+    vkStream->read((VkDeviceSize*)&forUnmarshaling->robustUniformBufferAccessSizeAlignment,
+                   sizeof(VkDeviceSize));
 }
 
 #endif
 #ifdef VK_EXT_custom_border_color
 void marshal_VkSamplerCustomBorderColorCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSamplerCustomBorderColorCreateInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkSamplerCustomBorderColorCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    marshal_VkClearColorValue(vkStream, rootType, (VkClearColorValue*)(&forMarshaling->customBorderColor));
+    marshal_VkClearColorValue(vkStream, rootType,
+                              (VkClearColorValue*)(&forMarshaling->customBorderColor));
     vkStream->write((VkFormat*)&forMarshaling->format, sizeof(VkFormat));
 }
 
 void unmarshal_VkSamplerCustomBorderColorCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSamplerCustomBorderColorCreateInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSamplerCustomBorderColorCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    unmarshal_VkClearColorValue(vkStream, rootType, (VkClearColorValue*)(&forUnmarshaling->customBorderColor));
+    unmarshal_VkClearColorValue(vkStream, rootType,
+                                (VkClearColorValue*)(&forUnmarshaling->customBorderColor));
     vkStream->read((VkFormat*)&forUnmarshaling->format, sizeof(VkFormat));
 }
 
 void marshal_VkPhysicalDeviceCustomBorderColorPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceCustomBorderColorPropertiesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceCustomBorderColorPropertiesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -31165,25 +29278,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceCustomBorderColorPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceCustomBorderColorPropertiesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceCustomBorderColorPropertiesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -31191,14 +29302,11 @@
 }
 
 void marshal_VkPhysicalDeviceCustomBorderColorFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceCustomBorderColorFeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceCustomBorderColorFeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -31207,25 +29315,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceCustomBorderColorFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceCustomBorderColorFeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceCustomBorderColorFeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -31238,14 +29344,11 @@
 #endif
 #ifdef VK_EXT_private_data
 void marshal_VkPhysicalDevicePrivateDataFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDevicePrivateDataFeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDevicePrivateDataFeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -31253,25 +29356,23 @@
 }
 
 void unmarshal_VkPhysicalDevicePrivateDataFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePrivateDataFeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePrivateDataFeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -31279,98 +29380,84 @@
 }
 
 void marshal_VkDevicePrivateDataCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDevicePrivateDataCreateInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkDevicePrivateDataCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->privateDataSlotRequestCount, sizeof(uint32_t));
 }
 
-void unmarshal_VkDevicePrivateDataCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDevicePrivateDataCreateInfoEXT* forUnmarshaling)
-{
+void unmarshal_VkDevicePrivateDataCreateInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkDevicePrivateDataCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->privateDataSlotRequestCount, sizeof(uint32_t));
 }
 
-void marshal_VkPrivateDataSlotCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPrivateDataSlotCreateInfoEXT* forMarshaling)
-{
+void marshal_VkPrivateDataSlotCreateInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                            const VkPrivateDataSlotCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkPrivateDataSlotCreateFlagsEXT*)&forMarshaling->flags, sizeof(VkPrivateDataSlotCreateFlagsEXT));
+    vkStream->write((VkPrivateDataSlotCreateFlagsEXT*)&forMarshaling->flags,
+                    sizeof(VkPrivateDataSlotCreateFlagsEXT));
 }
 
-void unmarshal_VkPrivateDataSlotCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPrivateDataSlotCreateInfoEXT* forUnmarshaling)
-{
+void unmarshal_VkPrivateDataSlotCreateInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkPrivateDataSlotCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkPrivateDataSlotCreateFlagsEXT*)&forUnmarshaling->flags, sizeof(VkPrivateDataSlotCreateFlagsEXT));
+    vkStream->read((VkPrivateDataSlotCreateFlagsEXT*)&forUnmarshaling->flags,
+                   sizeof(VkPrivateDataSlotCreateFlagsEXT));
 }
 
 #endif
 #ifdef VK_EXT_pipeline_creation_cache_control
 void marshal_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -31378,25 +29465,23 @@
 }
 
 void unmarshal_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -31406,14 +29491,11 @@
 #endif
 #ifdef VK_NV_device_diagnostics_config
 void marshal_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceDiagnosticsConfigFeaturesNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceDiagnosticsConfigFeaturesNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -31421,25 +29503,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDiagnosticsConfigFeaturesNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceDiagnosticsConfigFeaturesNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -31447,44 +29527,41 @@
 }
 
 void marshal_VkDeviceDiagnosticsConfigCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDeviceDiagnosticsConfigCreateInfoNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkDeviceDiagnosticsConfigCreateInfoNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkDeviceDiagnosticsConfigFlagsNV*)&forMarshaling->flags, sizeof(VkDeviceDiagnosticsConfigFlagsNV));
+    vkStream->write((VkDeviceDiagnosticsConfigFlagsNV*)&forMarshaling->flags,
+                    sizeof(VkDeviceDiagnosticsConfigFlagsNV));
 }
 
 void unmarshal_VkDeviceDiagnosticsConfigCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceDiagnosticsConfigCreateInfoNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDeviceDiagnosticsConfigCreateInfoNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkDeviceDiagnosticsConfigFlagsNV*)&forUnmarshaling->flags, sizeof(VkDeviceDiagnosticsConfigFlagsNV));
+    vkStream->read((VkDeviceDiagnosticsConfigFlagsNV*)&forUnmarshaling->flags,
+                   sizeof(VkDeviceDiagnosticsConfigFlagsNV));
 }
 
 #endif
@@ -31492,14 +29569,11 @@
 #endif
 #ifdef VK_NV_fragment_shading_rate_enums
 void marshal_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -31509,25 +29583,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -31537,248 +29609,233 @@
 }
 
 void marshal_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkSampleCountFlagBits*)&forMarshaling->maxFragmentShadingRateInvocationCount, sizeof(VkSampleCountFlagBits));
+    vkStream->write((VkSampleCountFlagBits*)&forMarshaling->maxFragmentShadingRateInvocationCount,
+                    sizeof(VkSampleCountFlagBits));
 }
 
 void unmarshal_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkSampleCountFlagBits*)&forUnmarshaling->maxFragmentShadingRateInvocationCount, sizeof(VkSampleCountFlagBits));
+    vkStream->read((VkSampleCountFlagBits*)&forUnmarshaling->maxFragmentShadingRateInvocationCount,
+                   sizeof(VkSampleCountFlagBits));
 }
 
 void marshal_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineFragmentShadingRateEnumStateCreateInfoNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineFragmentShadingRateEnumStateCreateInfoNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkFragmentShadingRateTypeNV*)&forMarshaling->shadingRateType, sizeof(VkFragmentShadingRateTypeNV));
-    vkStream->write((VkFragmentShadingRateNV*)&forMarshaling->shadingRate, sizeof(VkFragmentShadingRateNV));
-    vkStream->write((VkFragmentShadingRateCombinerOpKHR*)forMarshaling->combinerOps, 2 * sizeof(VkFragmentShadingRateCombinerOpKHR));
+    vkStream->write((VkFragmentShadingRateTypeNV*)&forMarshaling->shadingRateType,
+                    sizeof(VkFragmentShadingRateTypeNV));
+    vkStream->write((VkFragmentShadingRateNV*)&forMarshaling->shadingRate,
+                    sizeof(VkFragmentShadingRateNV));
+    vkStream->write((VkFragmentShadingRateCombinerOpKHR*)forMarshaling->combinerOps,
+                    2 * sizeof(VkFragmentShadingRateCombinerOpKHR));
 }
 
 void unmarshal_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineFragmentShadingRateEnumStateCreateInfoNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineFragmentShadingRateEnumStateCreateInfoNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkFragmentShadingRateTypeNV*)&forUnmarshaling->shadingRateType, sizeof(VkFragmentShadingRateTypeNV));
-    vkStream->read((VkFragmentShadingRateNV*)&forUnmarshaling->shadingRate, sizeof(VkFragmentShadingRateNV));
-    vkStream->read((VkFragmentShadingRateCombinerOpKHR*)forUnmarshaling->combinerOps, 2 * sizeof(VkFragmentShadingRateCombinerOpKHR));
+    vkStream->read((VkFragmentShadingRateTypeNV*)&forUnmarshaling->shadingRateType,
+                   sizeof(VkFragmentShadingRateTypeNV));
+    vkStream->read((VkFragmentShadingRateNV*)&forUnmarshaling->shadingRate,
+                   sizeof(VkFragmentShadingRateNV));
+    vkStream->read((VkFragmentShadingRateCombinerOpKHR*)forUnmarshaling->combinerOps,
+                   2 * sizeof(VkFragmentShadingRateCombinerOpKHR));
 }
 
 #endif
 #ifdef VK_NV_ray_tracing_motion_blur
-void marshal_VkDeviceOrHostAddressConstKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDeviceOrHostAddressConstKHR* forMarshaling)
-{
+void marshal_VkDeviceOrHostAddressConstKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkDeviceOrHostAddressConstKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkDeviceAddress*)&forMarshaling->deviceAddress, sizeof(VkDeviceAddress));
 }
 
-void unmarshal_VkDeviceOrHostAddressConstKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceOrHostAddressConstKHR* forUnmarshaling)
-{
+void unmarshal_VkDeviceOrHostAddressConstKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkDeviceOrHostAddressConstKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkDeviceAddress*)&forUnmarshaling->deviceAddress, sizeof(VkDeviceAddress));
 }
 
 void marshal_VkAccelerationStructureGeometryMotionTrianglesDataNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAccelerationStructureGeometryMotionTrianglesDataNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkAccelerationStructureGeometryMotionTrianglesDataNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    marshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forMarshaling->vertexData));
+    marshal_VkDeviceOrHostAddressConstKHR(
+        vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forMarshaling->vertexData));
 }
 
 void unmarshal_VkAccelerationStructureGeometryMotionTrianglesDataNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureGeometryMotionTrianglesDataNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureGeometryMotionTrianglesDataNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    unmarshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forUnmarshaling->vertexData));
+    unmarshal_VkDeviceOrHostAddressConstKHR(
+        vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forUnmarshaling->vertexData));
 }
 
 void marshal_VkAccelerationStructureMotionInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAccelerationStructureMotionInfoNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkAccelerationStructureMotionInfoNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->maxInstances, sizeof(uint32_t));
-    vkStream->write((VkAccelerationStructureMotionInfoFlagsNV*)&forMarshaling->flags, sizeof(VkAccelerationStructureMotionInfoFlagsNV));
+    vkStream->write((VkAccelerationStructureMotionInfoFlagsNV*)&forMarshaling->flags,
+                    sizeof(VkAccelerationStructureMotionInfoFlagsNV));
 }
 
 void unmarshal_VkAccelerationStructureMotionInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureMotionInfoNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureMotionInfoNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->maxInstances, sizeof(uint32_t));
-    vkStream->read((VkAccelerationStructureMotionInfoFlagsNV*)&forUnmarshaling->flags, sizeof(VkAccelerationStructureMotionInfoFlagsNV));
+    vkStream->read((VkAccelerationStructureMotionInfoFlagsNV*)&forUnmarshaling->flags,
+                   sizeof(VkAccelerationStructureMotionInfoFlagsNV));
 }
 
 void marshal_VkAccelerationStructureMatrixMotionInstanceNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAccelerationStructureMatrixMotionInstanceNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkAccelerationStructureMatrixMotionInstanceNV* forMarshaling) {
     (void)rootType;
-    
+
     typedef struct VkAccelerationStructureMatrixMotionInstanceNVWithoutBitFields {
-        VkTransformMatrixKHR          transformT0;
-        VkTransformMatrixKHR          transformT1;
-        uint32_t                      dwords[2];
-        uint64_t                      accelerationStructureReference;
+        VkTransformMatrixKHR transformT0;
+        VkTransformMatrixKHR transformT1;
+        uint32_t dwords[2];
+        uint64_t accelerationStructureReference;
     } VkAccelerationStructureMatrixMotionInstanceNVWithoutBitFields;
-    
-    const VkAccelerationStructureMatrixMotionInstanceNVWithoutBitFields* forMarshaling_new = (const VkAccelerationStructureMatrixMotionInstanceNVWithoutBitFields*)(forMarshaling);
-    marshal_VkTransformMatrixKHR(vkStream, rootType, (VkTransformMatrixKHR*)(&forMarshaling_new->transformT0));
-    marshal_VkTransformMatrixKHR(vkStream, rootType, (VkTransformMatrixKHR*)(&forMarshaling_new->transformT1));
+
+    const VkAccelerationStructureMatrixMotionInstanceNVWithoutBitFields* forMarshaling_new =
+        (const VkAccelerationStructureMatrixMotionInstanceNVWithoutBitFields*)(forMarshaling);
+    marshal_VkTransformMatrixKHR(vkStream, rootType,
+                                 (VkTransformMatrixKHR*)(&forMarshaling_new->transformT0));
+    marshal_VkTransformMatrixKHR(vkStream, rootType,
+                                 (VkTransformMatrixKHR*)(&forMarshaling_new->transformT1));
     for (uint32_t i = 0; i < 2; i++) {
         vkStream->write((uint32_t*)&(forMarshaling_new->dwords[i]), sizeof(uint32_t));
     }
-    vkStream->write((uint64_t*)&forMarshaling_new->accelerationStructureReference, sizeof(uint64_t));
-    
+    vkStream->write((uint64_t*)&forMarshaling_new->accelerationStructureReference,
+                    sizeof(uint64_t));
 }
 
 void unmarshal_VkAccelerationStructureMatrixMotionInstanceNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureMatrixMotionInstanceNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureMatrixMotionInstanceNV* forUnmarshaling) {
     (void)rootType;
-    
+
     typedef struct VkAccelerationStructureMatrixMotionInstanceNVWithoutBitFields {
-        VkTransformMatrixKHR          transformT0;
-        VkTransformMatrixKHR          transformT1;
-        uint32_t                      dwords[2];
-        uint64_t                      accelerationStructureReference;
+        VkTransformMatrixKHR transformT0;
+        VkTransformMatrixKHR transformT1;
+        uint32_t dwords[2];
+        uint64_t accelerationStructureReference;
     } VkAccelerationStructureMatrixMotionInstanceNVWithoutBitFields;
-    
-    VkAccelerationStructureMatrixMotionInstanceNVWithoutBitFields* forUnmarshaling_new = (VkAccelerationStructureMatrixMotionInstanceNVWithoutBitFields*)(forUnmarshaling);
-    unmarshal_VkTransformMatrixKHR(vkStream, rootType, (VkTransformMatrixKHR*)(&forUnmarshaling_new->transformT0));
-    unmarshal_VkTransformMatrixKHR(vkStream, rootType, (VkTransformMatrixKHR*)(&forUnmarshaling_new->transformT1));
+
+    VkAccelerationStructureMatrixMotionInstanceNVWithoutBitFields* forUnmarshaling_new =
+        (VkAccelerationStructureMatrixMotionInstanceNVWithoutBitFields*)(forUnmarshaling);
+    unmarshal_VkTransformMatrixKHR(vkStream, rootType,
+                                   (VkTransformMatrixKHR*)(&forUnmarshaling_new->transformT0));
+    unmarshal_VkTransformMatrixKHR(vkStream, rootType,
+                                   (VkTransformMatrixKHR*)(&forUnmarshaling_new->transformT1));
     for (uint32_t i = 0; i < 2; i++) {
         vkStream->read((uint32_t*)&(forUnmarshaling_new->dwords[i]), sizeof(uint32_t));
     }
-    vkStream->read((uint64_t*)&forUnmarshaling_new->accelerationStructureReference, sizeof(uint64_t));
-    
+    vkStream->read((uint64_t*)&forUnmarshaling_new->accelerationStructureReference,
+                   sizeof(uint64_t));
 }
 
-void marshal_VkSRTDataNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSRTDataNV* forMarshaling)
-{
+void marshal_VkSRTDataNV(VulkanStream* vkStream, VkStructureType rootType,
+                         const VkSRTDataNV* forMarshaling) {
     (void)rootType;
     vkStream->write((float*)&forMarshaling->sx, sizeof(float));
     vkStream->write((float*)&forMarshaling->a, sizeof(float));
@@ -31798,11 +29855,8 @@
     vkStream->write((float*)&forMarshaling->tz, sizeof(float));
 }
 
-void unmarshal_VkSRTDataNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSRTDataNV* forUnmarshaling)
-{
+void unmarshal_VkSRTDataNV(VulkanStream* vkStream, VkStructureType rootType,
+                           VkSRTDataNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((float*)&forUnmarshaling->sx, sizeof(float));
     vkStream->read((float*)&forUnmarshaling->a, sizeof(float));
@@ -31823,147 +29877,140 @@
 }
 
 void marshal_VkAccelerationStructureSRTMotionInstanceNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAccelerationStructureSRTMotionInstanceNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkAccelerationStructureSRTMotionInstanceNV* forMarshaling) {
     (void)rootType;
-    
+
     typedef struct VkAccelerationStructureSRTMotionInstanceNVWithoutBitFields {
-        VkSRTDataNV          transformT0;
-        VkSRTDataNV          transformT1;
-        uint32_t             dwords[2];
-        uint64_t             accelerationStructureReference;
+        VkSRTDataNV transformT0;
+        VkSRTDataNV transformT1;
+        uint32_t dwords[2];
+        uint64_t accelerationStructureReference;
     } VkAccelerationStructureSRTMotionInstanceNVWithoutBitFields;
-    
-    const VkAccelerationStructureSRTMotionInstanceNVWithoutBitFields* forMarshaling_new = (const VkAccelerationStructureSRTMotionInstanceNVWithoutBitFields*)(forMarshaling);
+
+    const VkAccelerationStructureSRTMotionInstanceNVWithoutBitFields* forMarshaling_new =
+        (const VkAccelerationStructureSRTMotionInstanceNVWithoutBitFields*)(forMarshaling);
     marshal_VkSRTDataNV(vkStream, rootType, (VkSRTDataNV*)(&forMarshaling_new->transformT0));
     marshal_VkSRTDataNV(vkStream, rootType, (VkSRTDataNV*)(&forMarshaling_new->transformT1));
     for (uint32_t i = 0; i < 2; i++) {
         vkStream->write((uint32_t*)&(forMarshaling_new->dwords[i]), sizeof(uint32_t));
     }
-    vkStream->write((uint64_t*)&forMarshaling_new->accelerationStructureReference, sizeof(uint64_t));
-    
+    vkStream->write((uint64_t*)&forMarshaling_new->accelerationStructureReference,
+                    sizeof(uint64_t));
 }
 
 void unmarshal_VkAccelerationStructureSRTMotionInstanceNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureSRTMotionInstanceNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureSRTMotionInstanceNV* forUnmarshaling) {
     (void)rootType;
-    
+
     typedef struct VkAccelerationStructureSRTMotionInstanceNVWithoutBitFields {
-        VkSRTDataNV          transformT0;
-        VkSRTDataNV          transformT1;
-        uint32_t             dwords[2];
-        uint64_t             accelerationStructureReference;
+        VkSRTDataNV transformT0;
+        VkSRTDataNV transformT1;
+        uint32_t dwords[2];
+        uint64_t accelerationStructureReference;
     } VkAccelerationStructureSRTMotionInstanceNVWithoutBitFields;
-    
-    VkAccelerationStructureSRTMotionInstanceNVWithoutBitFields* forUnmarshaling_new = (VkAccelerationStructureSRTMotionInstanceNVWithoutBitFields*)(forUnmarshaling);
+
+    VkAccelerationStructureSRTMotionInstanceNVWithoutBitFields* forUnmarshaling_new =
+        (VkAccelerationStructureSRTMotionInstanceNVWithoutBitFields*)(forUnmarshaling);
     unmarshal_VkSRTDataNV(vkStream, rootType, (VkSRTDataNV*)(&forUnmarshaling_new->transformT0));
     unmarshal_VkSRTDataNV(vkStream, rootType, (VkSRTDataNV*)(&forUnmarshaling_new->transformT1));
     for (uint32_t i = 0; i < 2; i++) {
         vkStream->read((uint32_t*)&(forUnmarshaling_new->dwords[i]), sizeof(uint32_t));
     }
-    vkStream->read((uint64_t*)&forUnmarshaling_new->accelerationStructureReference, sizeof(uint64_t));
-    
+    vkStream->read((uint64_t*)&forUnmarshaling_new->accelerationStructureReference,
+                   sizeof(uint64_t));
 }
 
 void marshal_VkAccelerationStructureMotionInstanceDataNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAccelerationStructureMotionInstanceDataNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkAccelerationStructureMotionInstanceDataNV* forMarshaling) {
     (void)rootType;
-    marshal_VkAccelerationStructureInstanceKHR(vkStream, rootType, (VkAccelerationStructureInstanceKHR*)(&forMarshaling->staticInstance));
+    marshal_VkAccelerationStructureInstanceKHR(
+        vkStream, rootType, (VkAccelerationStructureInstanceKHR*)(&forMarshaling->staticInstance));
 }
 
 void unmarshal_VkAccelerationStructureMotionInstanceDataNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureMotionInstanceDataNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureMotionInstanceDataNV* forUnmarshaling) {
     (void)rootType;
-    unmarshal_VkAccelerationStructureInstanceKHR(vkStream, rootType, (VkAccelerationStructureInstanceKHR*)(&forUnmarshaling->staticInstance));
+    unmarshal_VkAccelerationStructureInstanceKHR(
+        vkStream, rootType,
+        (VkAccelerationStructureInstanceKHR*)(&forUnmarshaling->staticInstance));
 }
 
 void marshal_VkAccelerationStructureMotionInstanceNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAccelerationStructureMotionInstanceNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkAccelerationStructureMotionInstanceNV* forMarshaling) {
     (void)rootType;
-    vkStream->write((VkAccelerationStructureMotionInstanceTypeNV*)&forMarshaling->type, sizeof(VkAccelerationStructureMotionInstanceTypeNV));
-    vkStream->write((VkAccelerationStructureMotionInstanceFlagsNV*)&forMarshaling->flags, sizeof(VkAccelerationStructureMotionInstanceFlagsNV));
-    marshal_VkAccelerationStructureMotionInstanceDataNV(vkStream, rootType, (VkAccelerationStructureMotionInstanceDataNV*)(&forMarshaling->data));
+    vkStream->write((VkAccelerationStructureMotionInstanceTypeNV*)&forMarshaling->type,
+                    sizeof(VkAccelerationStructureMotionInstanceTypeNV));
+    vkStream->write((VkAccelerationStructureMotionInstanceFlagsNV*)&forMarshaling->flags,
+                    sizeof(VkAccelerationStructureMotionInstanceFlagsNV));
+    marshal_VkAccelerationStructureMotionInstanceDataNV(
+        vkStream, rootType, (VkAccelerationStructureMotionInstanceDataNV*)(&forMarshaling->data));
 }
 
 void unmarshal_VkAccelerationStructureMotionInstanceNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureMotionInstanceNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureMotionInstanceNV* forUnmarshaling) {
     (void)rootType;
-    vkStream->read((VkAccelerationStructureMotionInstanceTypeNV*)&forUnmarshaling->type, sizeof(VkAccelerationStructureMotionInstanceTypeNV));
-    vkStream->read((VkAccelerationStructureMotionInstanceFlagsNV*)&forUnmarshaling->flags, sizeof(VkAccelerationStructureMotionInstanceFlagsNV));
-    unmarshal_VkAccelerationStructureMotionInstanceDataNV(vkStream, rootType, (VkAccelerationStructureMotionInstanceDataNV*)(&forUnmarshaling->data));
+    vkStream->read((VkAccelerationStructureMotionInstanceTypeNV*)&forUnmarshaling->type,
+                   sizeof(VkAccelerationStructureMotionInstanceTypeNV));
+    vkStream->read((VkAccelerationStructureMotionInstanceFlagsNV*)&forUnmarshaling->flags,
+                   sizeof(VkAccelerationStructureMotionInstanceFlagsNV));
+    unmarshal_VkAccelerationStructureMotionInstanceDataNV(
+        vkStream, rootType, (VkAccelerationStructureMotionInstanceDataNV*)(&forUnmarshaling->data));
 }
 
 void marshal_VkPhysicalDeviceRayTracingMotionBlurFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceRayTracingMotionBlurFeaturesNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceRayTracingMotionBlurFeaturesNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->rayTracingMotionBlur, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->rayTracingMotionBlurPipelineTraceRaysIndirect, sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->rayTracingMotionBlurPipelineTraceRaysIndirect,
+                    sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceRayTracingMotionBlurFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceRayTracingMotionBlurFeaturesNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceRayTracingMotionBlurFeaturesNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkBool32*)&forUnmarshaling->rayTracingMotionBlur, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->rayTracingMotionBlurPipelineTraceRaysIndirect, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->rayTracingMotionBlurPipelineTraceRaysIndirect,
+                   sizeof(VkBool32));
 }
 
 #endif
 #ifdef VK_EXT_ycbcr_2plane_444_formats
 void marshal_VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -31971,25 +30018,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -31999,14 +30044,11 @@
 #endif
 #ifdef VK_EXT_fragment_density_map2
 void marshal_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -32014,25 +30056,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -32040,106 +30080,97 @@
 }
 
 void marshal_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->subsampledLoads, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->subsampledCoarseReconstructionEarlyAccess, sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->subsampledCoarseReconstructionEarlyAccess,
+                    sizeof(VkBool32));
     vkStream->write((uint32_t*)&forMarshaling->maxSubsampledArrayLayers, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetSubsampledSamplers, sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetSubsampledSamplers,
+                    sizeof(uint32_t));
 }
 
 void unmarshal_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkBool32*)&forUnmarshaling->subsampledLoads, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->subsampledCoarseReconstructionEarlyAccess, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->subsampledCoarseReconstructionEarlyAccess,
+                   sizeof(VkBool32));
     vkStream->read((uint32_t*)&forUnmarshaling->maxSubsampledArrayLayers, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetSubsampledSamplers, sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetSubsampledSamplers,
+                   sizeof(uint32_t));
 }
 
 #endif
 #ifdef VK_QCOM_rotated_copy_commands
-void marshal_VkCopyCommandTransformInfoQCOM(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCopyCommandTransformInfoQCOM* forMarshaling)
-{
+void marshal_VkCopyCommandTransformInfoQCOM(VulkanStream* vkStream, VkStructureType rootType,
+                                            const VkCopyCommandTransformInfoQCOM* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkSurfaceTransformFlagBitsKHR*)&forMarshaling->transform, sizeof(VkSurfaceTransformFlagBitsKHR));
+    vkStream->write((VkSurfaceTransformFlagBitsKHR*)&forMarshaling->transform,
+                    sizeof(VkSurfaceTransformFlagBitsKHR));
 }
 
-void unmarshal_VkCopyCommandTransformInfoQCOM(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCopyCommandTransformInfoQCOM* forUnmarshaling)
-{
+void unmarshal_VkCopyCommandTransformInfoQCOM(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkCopyCommandTransformInfoQCOM* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkSurfaceTransformFlagBitsKHR*)&forUnmarshaling->transform, sizeof(VkSurfaceTransformFlagBitsKHR));
+    vkStream->read((VkSurfaceTransformFlagBitsKHR*)&forUnmarshaling->transform,
+                   sizeof(VkSurfaceTransformFlagBitsKHR));
 }
 
 #endif
 #ifdef VK_EXT_image_robustness
 void marshal_VkPhysicalDeviceImageRobustnessFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceImageRobustnessFeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceImageRobustnessFeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -32147,25 +30178,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceImageRobustnessFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceImageRobustnessFeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceImageRobustnessFeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -32175,14 +30204,11 @@
 #endif
 #ifdef VK_EXT_4444_formats
 void marshal_VkPhysicalDevice4444FormatsFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDevice4444FormatsFeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDevice4444FormatsFeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -32191,25 +30217,23 @@
 }
 
 void unmarshal_VkPhysicalDevice4444FormatsFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevice4444FormatsFeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevice4444FormatsFeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -32220,14 +30244,11 @@
 #endif
 #ifdef VK_EXT_rgba10x6_formats
 void marshal_VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -32235,99 +30256,89 @@
 }
 
 void unmarshal_VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkBool32*)&forUnmarshaling->formatRgba10x6WithoutYCbCrSampler, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->formatRgba10x6WithoutYCbCrSampler,
+                   sizeof(VkBool32));
 }
 
 #endif
 #ifdef VK_NV_acquire_winrt_display
 #endif
 #ifdef VK_EXT_directfb_surface
-void marshal_VkDirectFBSurfaceCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDirectFBSurfaceCreateInfoEXT* forMarshaling)
-{
+void marshal_VkDirectFBSurfaceCreateInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                            const VkDirectFBSurfaceCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkDirectFBSurfaceCreateFlagsEXT*)&forMarshaling->flags, sizeof(VkDirectFBSurfaceCreateFlagsEXT));
+    vkStream->write((VkDirectFBSurfaceCreateFlagsEXT*)&forMarshaling->flags,
+                    sizeof(VkDirectFBSurfaceCreateFlagsEXT));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->dfb;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->dfb)
-    {
+    if (forMarshaling->dfb) {
         vkStream->write((IDirectFB*)forMarshaling->dfb, sizeof(IDirectFB));
     }
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)forMarshaling->surface;
     vkStream->putBe64(cgen_var_1);
-    if (forMarshaling->surface)
-    {
+    if (forMarshaling->surface) {
         vkStream->write((IDirectFBSurface*)forMarshaling->surface, sizeof(IDirectFBSurface));
     }
 }
 
-void unmarshal_VkDirectFBSurfaceCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDirectFBSurfaceCreateInfoEXT* forUnmarshaling)
-{
+void unmarshal_VkDirectFBSurfaceCreateInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkDirectFBSurfaceCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkDirectFBSurfaceCreateFlagsEXT*)&forUnmarshaling->flags, sizeof(VkDirectFBSurfaceCreateFlagsEXT));
+    vkStream->read((VkDirectFBSurfaceCreateFlagsEXT*)&forUnmarshaling->flags,
+                   sizeof(VkDirectFBSurfaceCreateFlagsEXT));
     // WARNING PTR CHECK
     forUnmarshaling->dfb = (IDirectFB*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->dfb)
-    {
+    if (forUnmarshaling->dfb) {
         vkStream->alloc((void**)&forUnmarshaling->dfb, sizeof(IDirectFB));
         vkStream->read((IDirectFB*)forUnmarshaling->dfb, sizeof(IDirectFB));
     }
     // WARNING PTR CHECK
     forUnmarshaling->surface = (IDirectFBSurface*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->surface)
-    {
+    if (forUnmarshaling->surface) {
         vkStream->alloc((void**)&forUnmarshaling->surface, sizeof(IDirectFBSurface));
         vkStream->read((IDirectFBSurface*)forUnmarshaling->surface, sizeof(IDirectFBSurface));
     }
@@ -32336,14 +30347,11 @@
 #endif
 #ifdef VK_VALVE_mutable_descriptor_type
 void marshal_VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -32351,25 +30359,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -32377,78 +30383,76 @@
 }
 
 void marshal_VkMutableDescriptorTypeListVALVE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMutableDescriptorTypeListVALVE* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkMutableDescriptorTypeListVALVE* forMarshaling) {
     (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->descriptorTypeCount, sizeof(uint32_t));
-    vkStream->write((const VkDescriptorType*)forMarshaling->pDescriptorTypes, forMarshaling->descriptorTypeCount * sizeof(const VkDescriptorType));
+    vkStream->write((const VkDescriptorType*)forMarshaling->pDescriptorTypes,
+                    forMarshaling->descriptorTypeCount * sizeof(const VkDescriptorType));
 }
 
-void unmarshal_VkMutableDescriptorTypeListVALVE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMutableDescriptorTypeListVALVE* forUnmarshaling)
-{
+void unmarshal_VkMutableDescriptorTypeListVALVE(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkMutableDescriptorTypeListVALVE* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->descriptorTypeCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pDescriptorTypes, forUnmarshaling->descriptorTypeCount * sizeof(const VkDescriptorType));
-    vkStream->read((VkDescriptorType*)forUnmarshaling->pDescriptorTypes, forUnmarshaling->descriptorTypeCount * sizeof(const VkDescriptorType));
+    vkStream->alloc((void**)&forUnmarshaling->pDescriptorTypes,
+                    forUnmarshaling->descriptorTypeCount * sizeof(const VkDescriptorType));
+    vkStream->read((VkDescriptorType*)forUnmarshaling->pDescriptorTypes,
+                   forUnmarshaling->descriptorTypeCount * sizeof(const VkDescriptorType));
 }
 
 void marshal_VkMutableDescriptorTypeCreateInfoVALVE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMutableDescriptorTypeCreateInfoVALVE* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkMutableDescriptorTypeCreateInfoVALVE* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->mutableDescriptorTypeListCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->mutableDescriptorTypeListCount; ++i)
-        {
-            marshal_VkMutableDescriptorTypeListVALVE(vkStream, rootType, (const VkMutableDescriptorTypeListVALVE*)(forMarshaling->pMutableDescriptorTypeLists + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->mutableDescriptorTypeListCount; ++i) {
+            marshal_VkMutableDescriptorTypeListVALVE(
+                vkStream, rootType,
+                (const VkMutableDescriptorTypeListVALVE*)(forMarshaling
+                                                              ->pMutableDescriptorTypeLists +
+                                                          i));
         }
     }
 }
 
 void unmarshal_VkMutableDescriptorTypeCreateInfoVALVE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMutableDescriptorTypeCreateInfoVALVE* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkMutableDescriptorTypeCreateInfoVALVE* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->mutableDescriptorTypeListCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pMutableDescriptorTypeLists, forUnmarshaling->mutableDescriptorTypeListCount * sizeof(const VkMutableDescriptorTypeListVALVE));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->mutableDescriptorTypeListCount; ++i)
-        {
-            unmarshal_VkMutableDescriptorTypeListVALVE(vkStream, rootType, (VkMutableDescriptorTypeListVALVE*)(forUnmarshaling->pMutableDescriptorTypeLists + i));
+    vkStream->alloc((void**)&forUnmarshaling->pMutableDescriptorTypeLists,
+                    forUnmarshaling->mutableDescriptorTypeListCount *
+                        sizeof(const VkMutableDescriptorTypeListVALVE));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->mutableDescriptorTypeListCount; ++i) {
+            unmarshal_VkMutableDescriptorTypeListVALVE(
+                vkStream, rootType,
+                (VkMutableDescriptorTypeListVALVE*)(forUnmarshaling->pMutableDescriptorTypeLists +
+                                                    i));
         }
     }
 }
@@ -32456,14 +30460,11 @@
 #endif
 #ifdef VK_EXT_vertex_input_dynamic_state
 void marshal_VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -32471,25 +30472,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -32497,14 +30496,11 @@
 }
 
 void marshal_VkVertexInputBindingDescription2EXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVertexInputBindingDescription2EXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkVertexInputBindingDescription2EXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -32515,25 +30511,23 @@
 }
 
 void unmarshal_VkVertexInputBindingDescription2EXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVertexInputBindingDescription2EXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVertexInputBindingDescription2EXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -32544,14 +30538,11 @@
 }
 
 void marshal_VkVertexInputAttributeDescription2EXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVertexInputAttributeDescription2EXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkVertexInputAttributeDescription2EXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -32562,25 +30553,23 @@
 }
 
 void unmarshal_VkVertexInputAttributeDescription2EXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVertexInputAttributeDescription2EXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVertexInputAttributeDescription2EXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -32593,14 +30582,11 @@
 #endif
 #ifdef VK_EXT_physical_device_drm
 void marshal_VkPhysicalDeviceDrmPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceDrmPropertiesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceDrmPropertiesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -32612,26 +30598,23 @@
     vkStream->write((int64_t*)&forMarshaling->renderMinor, sizeof(int64_t));
 }
 
-void unmarshal_VkPhysicalDeviceDrmPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDrmPropertiesEXT* forUnmarshaling)
-{
+void unmarshal_VkPhysicalDeviceDrmPropertiesEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkPhysicalDeviceDrmPropertiesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -32646,14 +30629,11 @@
 #endif
 #ifdef VK_EXT_primitive_topology_list_restart
 void marshal_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -32662,86 +30642,79 @@
 }
 
 void unmarshal_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkBool32*)&forUnmarshaling->primitiveTopologyListRestart, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->primitiveTopologyPatchListRestart, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->primitiveTopologyPatchListRestart,
+                   sizeof(VkBool32));
 }
 
 #endif
 #ifdef VK_FUCHSIA_external_memory
 void marshal_VkImportMemoryZirconHandleInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImportMemoryZirconHandleInfoFUCHSIA* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkImportMemoryZirconHandleInfoFUCHSIA* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkExternalMemoryHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    vkStream->write((VkExternalMemoryHandleTypeFlagBits*)&forMarshaling->handleType,
+                    sizeof(VkExternalMemoryHandleTypeFlagBits));
     vkStream->write((zx_handle_t*)&forMarshaling->handle, sizeof(zx_handle_t));
 }
 
 void unmarshal_VkImportMemoryZirconHandleInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportMemoryZirconHandleInfoFUCHSIA* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImportMemoryZirconHandleInfoFUCHSIA* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    vkStream->read((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType,
+                   sizeof(VkExternalMemoryHandleTypeFlagBits));
     vkStream->read((zx_handle_t*)&forUnmarshaling->handle, sizeof(zx_handle_t));
 }
 
 void marshal_VkMemoryZirconHandlePropertiesFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMemoryZirconHandlePropertiesFUCHSIA* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkMemoryZirconHandlePropertiesFUCHSIA* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -32749,25 +30722,23 @@
 }
 
 void unmarshal_VkMemoryZirconHandlePropertiesFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryZirconHandlePropertiesFUCHSIA* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkMemoryZirconHandlePropertiesFUCHSIA* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -32775,163 +30746,158 @@
 }
 
 void marshal_VkMemoryGetZirconHandleInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMemoryGetZirconHandleInfoFUCHSIA* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkMemoryGetZirconHandleInfoFUCHSIA* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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_VkDeviceMemory_u64(&forMarshaling->memory, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkDeviceMemory_u64(&forMarshaling->memory, &cgen_var_0,
+                                                             1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->write((VkExternalMemoryHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    vkStream->write((VkExternalMemoryHandleTypeFlagBits*)&forMarshaling->handleType,
+                    sizeof(VkExternalMemoryHandleTypeFlagBits));
 }
 
 void unmarshal_VkMemoryGetZirconHandleInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryGetZirconHandleInfoFUCHSIA* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkMemoryGetZirconHandleInfoFUCHSIA* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkDeviceMemory(&cgen_var_0, (VkDeviceMemory*)&forUnmarshaling->memory, 1);
-    vkStream->read((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    vkStream->handleMapping()->mapHandles_u64_VkDeviceMemory(
+        &cgen_var_0, (VkDeviceMemory*)&forUnmarshaling->memory, 1);
+    vkStream->read((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType,
+                   sizeof(VkExternalMemoryHandleTypeFlagBits));
 }
 
 #endif
 #ifdef VK_FUCHSIA_external_semaphore
 void marshal_VkImportSemaphoreZirconHandleInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImportSemaphoreZirconHandleInfoFUCHSIA* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkImportSemaphoreZirconHandleInfoFUCHSIA* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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_VkSemaphore_u64(&forMarshaling->semaphore, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkSemaphore_u64(&forMarshaling->semaphore, &cgen_var_0,
+                                                          1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->write((VkSemaphoreImportFlags*)&forMarshaling->flags, sizeof(VkSemaphoreImportFlags));
-    vkStream->write((VkExternalSemaphoreHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalSemaphoreHandleTypeFlagBits));
+    vkStream->write((VkExternalSemaphoreHandleTypeFlagBits*)&forMarshaling->handleType,
+                    sizeof(VkExternalSemaphoreHandleTypeFlagBits));
     vkStream->write((zx_handle_t*)&forMarshaling->zirconHandle, sizeof(zx_handle_t));
 }
 
 void unmarshal_VkImportSemaphoreZirconHandleInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportSemaphoreZirconHandleInfoFUCHSIA* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImportSemaphoreZirconHandleInfoFUCHSIA* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkSemaphore(&cgen_var_0, (VkSemaphore*)&forUnmarshaling->semaphore, 1);
-    vkStream->read((VkSemaphoreImportFlags*)&forUnmarshaling->flags, sizeof(VkSemaphoreImportFlags));
-    vkStream->read((VkExternalSemaphoreHandleTypeFlagBits*)&forUnmarshaling->handleType, sizeof(VkExternalSemaphoreHandleTypeFlagBits));
+    vkStream->handleMapping()->mapHandles_u64_VkSemaphore(
+        &cgen_var_0, (VkSemaphore*)&forUnmarshaling->semaphore, 1);
+    vkStream->read((VkSemaphoreImportFlags*)&forUnmarshaling->flags,
+                   sizeof(VkSemaphoreImportFlags));
+    vkStream->read((VkExternalSemaphoreHandleTypeFlagBits*)&forUnmarshaling->handleType,
+                   sizeof(VkExternalSemaphoreHandleTypeFlagBits));
     vkStream->read((zx_handle_t*)&forUnmarshaling->zirconHandle, sizeof(zx_handle_t));
 }
 
 void marshal_VkSemaphoreGetZirconHandleInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSemaphoreGetZirconHandleInfoFUCHSIA* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkSemaphoreGetZirconHandleInfoFUCHSIA* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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_VkSemaphore_u64(&forMarshaling->semaphore, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkSemaphore_u64(&forMarshaling->semaphore, &cgen_var_0,
+                                                          1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->write((VkExternalSemaphoreHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalSemaphoreHandleTypeFlagBits));
+    vkStream->write((VkExternalSemaphoreHandleTypeFlagBits*)&forMarshaling->handleType,
+                    sizeof(VkExternalSemaphoreHandleTypeFlagBits));
 }
 
 void unmarshal_VkSemaphoreGetZirconHandleInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSemaphoreGetZirconHandleInfoFUCHSIA* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSemaphoreGetZirconHandleInfoFUCHSIA* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkSemaphore(&cgen_var_0, (VkSemaphore*)&forUnmarshaling->semaphore, 1);
-    vkStream->read((VkExternalSemaphoreHandleTypeFlagBits*)&forUnmarshaling->handleType, sizeof(VkExternalSemaphoreHandleTypeFlagBits));
+    vkStream->handleMapping()->mapHandles_u64_VkSemaphore(
+        &cgen_var_0, (VkSemaphore*)&forUnmarshaling->semaphore, 1);
+    vkStream->read((VkExternalSemaphoreHandleTypeFlagBits*)&forUnmarshaling->handleType,
+                   sizeof(VkExternalSemaphoreHandleTypeFlagBits));
 }
 
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
 void marshal_VkBufferCollectionCreateInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBufferCollectionCreateInfoFUCHSIA* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkBufferCollectionCreateInfoFUCHSIA* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -32939,25 +30905,23 @@
 }
 
 void unmarshal_VkBufferCollectionCreateInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferCollectionCreateInfoFUCHSIA* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBufferCollectionCreateInfoFUCHSIA* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -32965,14 +30929,11 @@
 }
 
 void marshal_VkImportMemoryBufferCollectionFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImportMemoryBufferCollectionFUCHSIA* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkImportMemoryBufferCollectionFUCHSIA* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -32982,25 +30943,23 @@
 }
 
 void unmarshal_VkImportMemoryBufferCollectionFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportMemoryBufferCollectionFUCHSIA* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImportMemoryBufferCollectionFUCHSIA* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -33009,14 +30968,11 @@
 }
 
 void marshal_VkBufferCollectionImageCreateInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBufferCollectionImageCreateInfoFUCHSIA* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkBufferCollectionImageCreateInfoFUCHSIA* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -33026,25 +30982,23 @@
 }
 
 void unmarshal_VkBufferCollectionImageCreateInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferCollectionImageCreateInfoFUCHSIA* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBufferCollectionImageCreateInfoFUCHSIA* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -33053,14 +31007,11 @@
 }
 
 void marshal_VkBufferCollectionConstraintsInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBufferCollectionConstraintsInfoFUCHSIA* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkBufferCollectionConstraintsInfoFUCHSIA* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -33072,25 +31023,23 @@
 }
 
 void unmarshal_VkBufferCollectionConstraintsInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferCollectionConstraintsInfoFUCHSIA* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBufferCollectionConstraintsInfoFUCHSIA* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -33101,60 +31050,58 @@
     vkStream->read((uint32_t*)&forUnmarshaling->minBufferCountForSharedSlack, sizeof(uint32_t));
 }
 
-void marshal_VkBufferConstraintsInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBufferConstraintsInfoFUCHSIA* forMarshaling)
-{
+void marshal_VkBufferConstraintsInfoFUCHSIA(VulkanStream* vkStream, VkStructureType rootType,
+                                            const VkBufferConstraintsInfoFUCHSIA* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    marshal_VkBufferCreateInfo(vkStream, rootType, (VkBufferCreateInfo*)(&forMarshaling->createInfo));
-    vkStream->write((VkFormatFeatureFlags*)&forMarshaling->requiredFormatFeatures, sizeof(VkFormatFeatureFlags));
-    marshal_VkBufferCollectionConstraintsInfoFUCHSIA(vkStream, rootType, (VkBufferCollectionConstraintsInfoFUCHSIA*)(&forMarshaling->bufferCollectionConstraints));
+    marshal_VkBufferCreateInfo(vkStream, rootType,
+                               (VkBufferCreateInfo*)(&forMarshaling->createInfo));
+    vkStream->write((VkFormatFeatureFlags*)&forMarshaling->requiredFormatFeatures,
+                    sizeof(VkFormatFeatureFlags));
+    marshal_VkBufferCollectionConstraintsInfoFUCHSIA(
+        vkStream, rootType,
+        (VkBufferCollectionConstraintsInfoFUCHSIA*)(&forMarshaling->bufferCollectionConstraints));
 }
 
-void unmarshal_VkBufferConstraintsInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferConstraintsInfoFUCHSIA* forUnmarshaling)
-{
+void unmarshal_VkBufferConstraintsInfoFUCHSIA(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkBufferConstraintsInfoFUCHSIA* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    unmarshal_VkBufferCreateInfo(vkStream, rootType, (VkBufferCreateInfo*)(&forUnmarshaling->createInfo));
-    vkStream->read((VkFormatFeatureFlags*)&forUnmarshaling->requiredFormatFeatures, sizeof(VkFormatFeatureFlags));
-    unmarshal_VkBufferCollectionConstraintsInfoFUCHSIA(vkStream, rootType, (VkBufferCollectionConstraintsInfoFUCHSIA*)(&forUnmarshaling->bufferCollectionConstraints));
+    unmarshal_VkBufferCreateInfo(vkStream, rootType,
+                                 (VkBufferCreateInfo*)(&forUnmarshaling->createInfo));
+    vkStream->read((VkFormatFeatureFlags*)&forUnmarshaling->requiredFormatFeatures,
+                   sizeof(VkFormatFeatureFlags));
+    unmarshal_VkBufferCollectionConstraintsInfoFUCHSIA(
+        vkStream, rootType,
+        (VkBufferCollectionConstraintsInfoFUCHSIA*)(&forUnmarshaling->bufferCollectionConstraints));
 }
 
 void marshal_VkBufferCollectionBufferCreateInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBufferCollectionBufferCreateInfoFUCHSIA* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkBufferCollectionBufferCreateInfoFUCHSIA* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -33164,25 +31111,23 @@
 }
 
 void unmarshal_VkBufferCollectionBufferCreateInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferCollectionBufferCreateInfoFUCHSIA* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBufferCollectionBufferCreateInfoFUCHSIA* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -33190,41 +31135,34 @@
     vkStream->read((uint32_t*)&forUnmarshaling->index, sizeof(uint32_t));
 }
 
-void marshal_VkSysmemColorSpaceFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSysmemColorSpaceFUCHSIA* forMarshaling)
-{
+void marshal_VkSysmemColorSpaceFUCHSIA(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkSysmemColorSpaceFUCHSIA* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->colorSpace, sizeof(uint32_t));
 }
 
-void unmarshal_VkSysmemColorSpaceFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSysmemColorSpaceFUCHSIA* forUnmarshaling)
-{
+void unmarshal_VkSysmemColorSpaceFUCHSIA(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkSysmemColorSpaceFUCHSIA* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -33232,14 +31170,11 @@
 }
 
 void marshal_VkBufferCollectionPropertiesFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBufferCollectionPropertiesFUCHSIA* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkBufferCollectionPropertiesFUCHSIA* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -33247,35 +31182,41 @@
     vkStream->write((uint32_t*)&forMarshaling->bufferCount, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->createInfoIndex, sizeof(uint32_t));
     vkStream->write((uint64_t*)&forMarshaling->sysmemPixelFormat, sizeof(uint64_t));
-    vkStream->write((VkFormatFeatureFlags*)&forMarshaling->formatFeatures, sizeof(VkFormatFeatureFlags));
-    marshal_VkSysmemColorSpaceFUCHSIA(vkStream, rootType, (VkSysmemColorSpaceFUCHSIA*)(&forMarshaling->sysmemColorSpaceIndex));
-    marshal_VkComponentMapping(vkStream, rootType, (VkComponentMapping*)(&forMarshaling->samplerYcbcrConversionComponents));
-    vkStream->write((VkSamplerYcbcrModelConversion*)&forMarshaling->suggestedYcbcrModel, sizeof(VkSamplerYcbcrModelConversion));
-    vkStream->write((VkSamplerYcbcrRange*)&forMarshaling->suggestedYcbcrRange, sizeof(VkSamplerYcbcrRange));
-    vkStream->write((VkChromaLocation*)&forMarshaling->suggestedXChromaOffset, sizeof(VkChromaLocation));
-    vkStream->write((VkChromaLocation*)&forMarshaling->suggestedYChromaOffset, sizeof(VkChromaLocation));
+    vkStream->write((VkFormatFeatureFlags*)&forMarshaling->formatFeatures,
+                    sizeof(VkFormatFeatureFlags));
+    marshal_VkSysmemColorSpaceFUCHSIA(
+        vkStream, rootType, (VkSysmemColorSpaceFUCHSIA*)(&forMarshaling->sysmemColorSpaceIndex));
+    marshal_VkComponentMapping(
+        vkStream, rootType,
+        (VkComponentMapping*)(&forMarshaling->samplerYcbcrConversionComponents));
+    vkStream->write((VkSamplerYcbcrModelConversion*)&forMarshaling->suggestedYcbcrModel,
+                    sizeof(VkSamplerYcbcrModelConversion));
+    vkStream->write((VkSamplerYcbcrRange*)&forMarshaling->suggestedYcbcrRange,
+                    sizeof(VkSamplerYcbcrRange));
+    vkStream->write((VkChromaLocation*)&forMarshaling->suggestedXChromaOffset,
+                    sizeof(VkChromaLocation));
+    vkStream->write((VkChromaLocation*)&forMarshaling->suggestedYChromaOffset,
+                    sizeof(VkChromaLocation));
 }
 
 void unmarshal_VkBufferCollectionPropertiesFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferCollectionPropertiesFUCHSIA* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBufferCollectionPropertiesFUCHSIA* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -33283,185 +31224,193 @@
     vkStream->read((uint32_t*)&forUnmarshaling->bufferCount, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->createInfoIndex, sizeof(uint32_t));
     vkStream->read((uint64_t*)&forUnmarshaling->sysmemPixelFormat, sizeof(uint64_t));
-    vkStream->read((VkFormatFeatureFlags*)&forUnmarshaling->formatFeatures, sizeof(VkFormatFeatureFlags));
-    unmarshal_VkSysmemColorSpaceFUCHSIA(vkStream, rootType, (VkSysmemColorSpaceFUCHSIA*)(&forUnmarshaling->sysmemColorSpaceIndex));
-    unmarshal_VkComponentMapping(vkStream, rootType, (VkComponentMapping*)(&forUnmarshaling->samplerYcbcrConversionComponents));
-    vkStream->read((VkSamplerYcbcrModelConversion*)&forUnmarshaling->suggestedYcbcrModel, sizeof(VkSamplerYcbcrModelConversion));
-    vkStream->read((VkSamplerYcbcrRange*)&forUnmarshaling->suggestedYcbcrRange, sizeof(VkSamplerYcbcrRange));
-    vkStream->read((VkChromaLocation*)&forUnmarshaling->suggestedXChromaOffset, sizeof(VkChromaLocation));
-    vkStream->read((VkChromaLocation*)&forUnmarshaling->suggestedYChromaOffset, sizeof(VkChromaLocation));
+    vkStream->read((VkFormatFeatureFlags*)&forUnmarshaling->formatFeatures,
+                   sizeof(VkFormatFeatureFlags));
+    unmarshal_VkSysmemColorSpaceFUCHSIA(
+        vkStream, rootType, (VkSysmemColorSpaceFUCHSIA*)(&forUnmarshaling->sysmemColorSpaceIndex));
+    unmarshal_VkComponentMapping(
+        vkStream, rootType,
+        (VkComponentMapping*)(&forUnmarshaling->samplerYcbcrConversionComponents));
+    vkStream->read((VkSamplerYcbcrModelConversion*)&forUnmarshaling->suggestedYcbcrModel,
+                   sizeof(VkSamplerYcbcrModelConversion));
+    vkStream->read((VkSamplerYcbcrRange*)&forUnmarshaling->suggestedYcbcrRange,
+                   sizeof(VkSamplerYcbcrRange));
+    vkStream->read((VkChromaLocation*)&forUnmarshaling->suggestedXChromaOffset,
+                   sizeof(VkChromaLocation));
+    vkStream->read((VkChromaLocation*)&forUnmarshaling->suggestedYChromaOffset,
+                   sizeof(VkChromaLocation));
 }
 
 void marshal_VkImageFormatConstraintsInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageFormatConstraintsInfoFUCHSIA* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkImageFormatConstraintsInfoFUCHSIA* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    marshal_VkImageCreateInfo(vkStream, rootType, (VkImageCreateInfo*)(&forMarshaling->imageCreateInfo));
-    vkStream->write((VkFormatFeatureFlags*)&forMarshaling->requiredFormatFeatures, sizeof(VkFormatFeatureFlags));
-    vkStream->write((VkImageFormatConstraintsFlagsFUCHSIA*)&forMarshaling->flags, sizeof(VkImageFormatConstraintsFlagsFUCHSIA));
+    marshal_VkImageCreateInfo(vkStream, rootType,
+                              (VkImageCreateInfo*)(&forMarshaling->imageCreateInfo));
+    vkStream->write((VkFormatFeatureFlags*)&forMarshaling->requiredFormatFeatures,
+                    sizeof(VkFormatFeatureFlags));
+    vkStream->write((VkImageFormatConstraintsFlagsFUCHSIA*)&forMarshaling->flags,
+                    sizeof(VkImageFormatConstraintsFlagsFUCHSIA));
     vkStream->write((uint64_t*)&forMarshaling->sysmemPixelFormat, sizeof(uint64_t));
     vkStream->write((uint32_t*)&forMarshaling->colorSpaceCount, sizeof(uint32_t));
-    marshal_VkSysmemColorSpaceFUCHSIA(vkStream, rootType, (const VkSysmemColorSpaceFUCHSIA*)(forMarshaling->pColorSpaces));
+    marshal_VkSysmemColorSpaceFUCHSIA(
+        vkStream, rootType, (const VkSysmemColorSpaceFUCHSIA*)(forMarshaling->pColorSpaces));
 }
 
 void unmarshal_VkImageFormatConstraintsInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageFormatConstraintsInfoFUCHSIA* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImageFormatConstraintsInfoFUCHSIA* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    unmarshal_VkImageCreateInfo(vkStream, rootType, (VkImageCreateInfo*)(&forUnmarshaling->imageCreateInfo));
-    vkStream->read((VkFormatFeatureFlags*)&forUnmarshaling->requiredFormatFeatures, sizeof(VkFormatFeatureFlags));
-    vkStream->read((VkImageFormatConstraintsFlagsFUCHSIA*)&forUnmarshaling->flags, sizeof(VkImageFormatConstraintsFlagsFUCHSIA));
+    unmarshal_VkImageCreateInfo(vkStream, rootType,
+                                (VkImageCreateInfo*)(&forUnmarshaling->imageCreateInfo));
+    vkStream->read((VkFormatFeatureFlags*)&forUnmarshaling->requiredFormatFeatures,
+                   sizeof(VkFormatFeatureFlags));
+    vkStream->read((VkImageFormatConstraintsFlagsFUCHSIA*)&forUnmarshaling->flags,
+                   sizeof(VkImageFormatConstraintsFlagsFUCHSIA));
     vkStream->read((uint64_t*)&forUnmarshaling->sysmemPixelFormat, sizeof(uint64_t));
     vkStream->read((uint32_t*)&forUnmarshaling->colorSpaceCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pColorSpaces, sizeof(const VkSysmemColorSpaceFUCHSIA));
-    unmarshal_VkSysmemColorSpaceFUCHSIA(vkStream, rootType, (VkSysmemColorSpaceFUCHSIA*)(forUnmarshaling->pColorSpaces));
+    vkStream->alloc((void**)&forUnmarshaling->pColorSpaces,
+                    sizeof(const VkSysmemColorSpaceFUCHSIA));
+    unmarshal_VkSysmemColorSpaceFUCHSIA(
+        vkStream, rootType, (VkSysmemColorSpaceFUCHSIA*)(forUnmarshaling->pColorSpaces));
 }
 
-void marshal_VkImageConstraintsInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageConstraintsInfoFUCHSIA* forMarshaling)
-{
+void marshal_VkImageConstraintsInfoFUCHSIA(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkImageConstraintsInfoFUCHSIA* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->formatConstraintsCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->formatConstraintsCount; ++i)
-        {
-            marshal_VkImageFormatConstraintsInfoFUCHSIA(vkStream, rootType, (const VkImageFormatConstraintsInfoFUCHSIA*)(forMarshaling->pFormatConstraints + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->formatConstraintsCount; ++i) {
+            marshal_VkImageFormatConstraintsInfoFUCHSIA(
+                vkStream, rootType,
+                (const VkImageFormatConstraintsInfoFUCHSIA*)(forMarshaling->pFormatConstraints +
+                                                             i));
         }
     }
-    marshal_VkBufferCollectionConstraintsInfoFUCHSIA(vkStream, rootType, (VkBufferCollectionConstraintsInfoFUCHSIA*)(&forMarshaling->bufferCollectionConstraints));
-    vkStream->write((VkImageConstraintsInfoFlagsFUCHSIA*)&forMarshaling->flags, sizeof(VkImageConstraintsInfoFlagsFUCHSIA));
+    marshal_VkBufferCollectionConstraintsInfoFUCHSIA(
+        vkStream, rootType,
+        (VkBufferCollectionConstraintsInfoFUCHSIA*)(&forMarshaling->bufferCollectionConstraints));
+    vkStream->write((VkImageConstraintsInfoFlagsFUCHSIA*)&forMarshaling->flags,
+                    sizeof(VkImageConstraintsInfoFlagsFUCHSIA));
 }
 
-void unmarshal_VkImageConstraintsInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageConstraintsInfoFUCHSIA* forUnmarshaling)
-{
+void unmarshal_VkImageConstraintsInfoFUCHSIA(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkImageConstraintsInfoFUCHSIA* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->formatConstraintsCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pFormatConstraints, forUnmarshaling->formatConstraintsCount * sizeof(const VkImageFormatConstraintsInfoFUCHSIA));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->formatConstraintsCount; ++i)
-        {
-            unmarshal_VkImageFormatConstraintsInfoFUCHSIA(vkStream, rootType, (VkImageFormatConstraintsInfoFUCHSIA*)(forUnmarshaling->pFormatConstraints + i));
+    vkStream->alloc((void**)&forUnmarshaling->pFormatConstraints,
+                    forUnmarshaling->formatConstraintsCount *
+                        sizeof(const VkImageFormatConstraintsInfoFUCHSIA));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->formatConstraintsCount; ++i) {
+            unmarshal_VkImageFormatConstraintsInfoFUCHSIA(
+                vkStream, rootType,
+                (VkImageFormatConstraintsInfoFUCHSIA*)(forUnmarshaling->pFormatConstraints + i));
         }
     }
-    unmarshal_VkBufferCollectionConstraintsInfoFUCHSIA(vkStream, rootType, (VkBufferCollectionConstraintsInfoFUCHSIA*)(&forUnmarshaling->bufferCollectionConstraints));
-    vkStream->read((VkImageConstraintsInfoFlagsFUCHSIA*)&forUnmarshaling->flags, sizeof(VkImageConstraintsInfoFlagsFUCHSIA));
+    unmarshal_VkBufferCollectionConstraintsInfoFUCHSIA(
+        vkStream, rootType,
+        (VkBufferCollectionConstraintsInfoFUCHSIA*)(&forUnmarshaling->bufferCollectionConstraints));
+    vkStream->read((VkImageConstraintsInfoFlagsFUCHSIA*)&forUnmarshaling->flags,
+                   sizeof(VkImageConstraintsInfoFlagsFUCHSIA));
 }
 
 #endif
 #ifdef VK_HUAWEI_subpass_shading
 void marshal_VkSubpassShadingPipelineCreateInfoHUAWEI(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSubpassShadingPipelineCreateInfoHUAWEI* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkSubpassShadingPipelineCreateInfoHUAWEI* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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_VkRenderPass_u64(&forMarshaling->renderPass, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkRenderPass_u64(&forMarshaling->renderPass, &cgen_var_0,
+                                                           1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->write((uint32_t*)&forMarshaling->subpass, sizeof(uint32_t));
 }
 
 void unmarshal_VkSubpassShadingPipelineCreateInfoHUAWEI(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubpassShadingPipelineCreateInfoHUAWEI* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSubpassShadingPipelineCreateInfoHUAWEI* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkRenderPass(&cgen_var_0, (VkRenderPass*)&forUnmarshaling->renderPass, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkRenderPass(
+        &cgen_var_0, (VkRenderPass*)&forUnmarshaling->renderPass, 1);
     vkStream->read((uint32_t*)&forUnmarshaling->subpass, sizeof(uint32_t));
 }
 
 void marshal_VkPhysicalDeviceSubpassShadingFeaturesHUAWEI(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceSubpassShadingFeaturesHUAWEI* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceSubpassShadingFeaturesHUAWEI* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -33469,25 +31418,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceSubpassShadingFeaturesHUAWEI(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSubpassShadingFeaturesHUAWEI* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceSubpassShadingFeaturesHUAWEI* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -33495,57 +31442,51 @@
 }
 
 void marshal_VkPhysicalDeviceSubpassShadingPropertiesHUAWEI(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceSubpassShadingPropertiesHUAWEI* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceSubpassShadingPropertiesHUAWEI* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((uint32_t*)&forMarshaling->maxSubpassShadingWorkgroupSizeAspectRatio, sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxSubpassShadingWorkgroupSizeAspectRatio,
+                    sizeof(uint32_t));
 }
 
 void unmarshal_VkPhysicalDeviceSubpassShadingPropertiesHUAWEI(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSubpassShadingPropertiesHUAWEI* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceSubpassShadingPropertiesHUAWEI* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((uint32_t*)&forUnmarshaling->maxSubpassShadingWorkgroupSizeAspectRatio, sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxSubpassShadingWorkgroupSizeAspectRatio,
+                   sizeof(uint32_t));
 }
 
 #endif
 #ifdef VK_HUAWEI_invocation_mask
 void marshal_VkPhysicalDeviceInvocationMaskFeaturesHUAWEI(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceInvocationMaskFeaturesHUAWEI* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceInvocationMaskFeaturesHUAWEI* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -33553,25 +31494,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceInvocationMaskFeaturesHUAWEI(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceInvocationMaskFeaturesHUAWEI* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceInvocationMaskFeaturesHUAWEI* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -33580,62 +31519,56 @@
 
 #endif
 #ifdef VK_NV_external_memory_rdma
-void marshal_VkMemoryGetRemoteAddressInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMemoryGetRemoteAddressInfoNV* forMarshaling)
-{
+void marshal_VkMemoryGetRemoteAddressInfoNV(VulkanStream* vkStream, VkStructureType rootType,
+                                            const VkMemoryGetRemoteAddressInfoNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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_VkDeviceMemory_u64(&forMarshaling->memory, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkDeviceMemory_u64(&forMarshaling->memory, &cgen_var_0,
+                                                             1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->write((VkExternalMemoryHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    vkStream->write((VkExternalMemoryHandleTypeFlagBits*)&forMarshaling->handleType,
+                    sizeof(VkExternalMemoryHandleTypeFlagBits));
 }
 
-void unmarshal_VkMemoryGetRemoteAddressInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryGetRemoteAddressInfoNV* forUnmarshaling)
-{
+void unmarshal_VkMemoryGetRemoteAddressInfoNV(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkMemoryGetRemoteAddressInfoNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkDeviceMemory(&cgen_var_0, (VkDeviceMemory*)&forUnmarshaling->memory, 1);
-    vkStream->read((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    vkStream->handleMapping()->mapHandles_u64_VkDeviceMemory(
+        &cgen_var_0, (VkDeviceMemory*)&forUnmarshaling->memory, 1);
+    vkStream->read((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType,
+                   sizeof(VkExternalMemoryHandleTypeFlagBits));
 }
 
 void marshal_VkPhysicalDeviceExternalMemoryRDMAFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceExternalMemoryRDMAFeaturesNV* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceExternalMemoryRDMAFeaturesNV* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -33643,25 +31576,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceExternalMemoryRDMAFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceExternalMemoryRDMAFeaturesNV* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceExternalMemoryRDMAFeaturesNV* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -33671,116 +31602,104 @@
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
 void marshal_VkPhysicalDeviceExtendedDynamicState2FeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceExtendedDynamicState2FeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceExtendedDynamicState2FeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->extendedDynamicState2, sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->extendedDynamicState2LogicOp, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->extendedDynamicState2PatchControlPoints, sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->extendedDynamicState2PatchControlPoints,
+                    sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceExtendedDynamicState2FeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceExtendedDynamicState2FeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceExtendedDynamicState2FeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkBool32*)&forUnmarshaling->extendedDynamicState2, sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->extendedDynamicState2LogicOp, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->extendedDynamicState2PatchControlPoints, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->extendedDynamicState2PatchControlPoints,
+                   sizeof(VkBool32));
 }
 
 #endif
 #ifdef VK_QNX_screen_surface
-void marshal_VkScreenSurfaceCreateInfoQNX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkScreenSurfaceCreateInfoQNX* forMarshaling)
-{
+void marshal_VkScreenSurfaceCreateInfoQNX(VulkanStream* vkStream, VkStructureType rootType,
+                                          const VkScreenSurfaceCreateInfoQNX* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkScreenSurfaceCreateFlagsQNX*)&forMarshaling->flags, sizeof(VkScreenSurfaceCreateFlagsQNX));
+    vkStream->write((VkScreenSurfaceCreateFlagsQNX*)&forMarshaling->flags,
+                    sizeof(VkScreenSurfaceCreateFlagsQNX));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->context;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->context)
-    {
+    if (forMarshaling->context) {
         vkStream->write((_screen_context*)forMarshaling->context, sizeof(_screen_context));
     }
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)forMarshaling->window;
     vkStream->putBe64(cgen_var_1);
-    if (forMarshaling->window)
-    {
+    if (forMarshaling->window) {
         vkStream->write((_screen_window*)forMarshaling->window, sizeof(_screen_window));
     }
 }
 
-void unmarshal_VkScreenSurfaceCreateInfoQNX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkScreenSurfaceCreateInfoQNX* forUnmarshaling)
-{
+void unmarshal_VkScreenSurfaceCreateInfoQNX(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkScreenSurfaceCreateInfoQNX* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkScreenSurfaceCreateFlagsQNX*)&forUnmarshaling->flags, sizeof(VkScreenSurfaceCreateFlagsQNX));
+    vkStream->read((VkScreenSurfaceCreateFlagsQNX*)&forUnmarshaling->flags,
+                   sizeof(VkScreenSurfaceCreateFlagsQNX));
     // WARNING PTR CHECK
     forUnmarshaling->context = (_screen_context*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->context)
-    {
+    if (forUnmarshaling->context) {
         vkStream->alloc((void**)&forUnmarshaling->context, sizeof(_screen_context));
         vkStream->read((_screen_context*)forUnmarshaling->context, sizeof(_screen_context));
     }
     // WARNING PTR CHECK
     forUnmarshaling->window = (_screen_window*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->window)
-    {
+    if (forUnmarshaling->window) {
         vkStream->alloc((void**)&forUnmarshaling->window, sizeof(_screen_window));
         vkStream->read((_screen_window*)forUnmarshaling->window, sizeof(_screen_window));
     }
@@ -33789,14 +31708,11 @@
 #endif
 #ifdef VK_EXT_color_write_enable
 void marshal_VkPhysicalDeviceColorWriteEnableFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceColorWriteEnableFeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceColorWriteEnableFeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -33804,25 +31720,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceColorWriteEnableFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceColorWriteEnableFeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceColorWriteEnableFeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -33830,144 +31744,124 @@
 }
 
 void marshal_VkPipelineColorWriteCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineColorWriteCreateInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPipelineColorWriteCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->attachmentCount, sizeof(uint32_t));
-    vkStream->write((const VkBool32*)forMarshaling->pColorWriteEnables, forMarshaling->attachmentCount * sizeof(const VkBool32));
+    vkStream->write((const VkBool32*)forMarshaling->pColorWriteEnables,
+                    forMarshaling->attachmentCount * sizeof(const VkBool32));
 }
 
 void unmarshal_VkPipelineColorWriteCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineColorWriteCreateInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineColorWriteCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->attachmentCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pColorWriteEnables, forUnmarshaling->attachmentCount * sizeof(const VkBool32));
-    vkStream->read((VkBool32*)forUnmarshaling->pColorWriteEnables, forUnmarshaling->attachmentCount * sizeof(const VkBool32));
+    vkStream->alloc((void**)&forUnmarshaling->pColorWriteEnables,
+                    forUnmarshaling->attachmentCount * sizeof(const VkBool32));
+    vkStream->read((VkBool32*)forUnmarshaling->pColorWriteEnables,
+                   forUnmarshaling->attachmentCount * sizeof(const VkBool32));
 }
 
 #endif
 #ifdef VK_GOOGLE_gfxstream
-void marshal_VkImportColorBufferGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImportColorBufferGOOGLE* forMarshaling)
-{
+void marshal_VkImportColorBufferGOOGLE(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkImportColorBufferGOOGLE* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->colorBuffer, sizeof(uint32_t));
 }
 
-void unmarshal_VkImportColorBufferGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportColorBufferGOOGLE* forUnmarshaling)
-{
+void unmarshal_VkImportColorBufferGOOGLE(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkImportColorBufferGOOGLE* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
     forUnmarshaling->sType = VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->colorBuffer, sizeof(uint32_t));
 }
 
-void marshal_VkImportBufferGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImportBufferGOOGLE* forMarshaling)
-{
+void marshal_VkImportBufferGOOGLE(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkImportBufferGOOGLE* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->buffer, sizeof(uint32_t));
 }
 
-void unmarshal_VkImportBufferGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportBufferGOOGLE* forUnmarshaling)
-{
+void unmarshal_VkImportBufferGOOGLE(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkImportBufferGOOGLE* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
     forUnmarshaling->sType = VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->buffer, sizeof(uint32_t));
 }
 
-void marshal_VkImportPhysicalAddressGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImportPhysicalAddressGOOGLE* forMarshaling)
-{
+void marshal_VkImportPhysicalAddressGOOGLE(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkImportPhysicalAddressGOOGLE* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -33978,27 +31872,24 @@
     vkStream->write((uint32_t*)&forMarshaling->tilingParameter, sizeof(uint32_t));
 }
 
-void unmarshal_VkImportPhysicalAddressGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportPhysicalAddressGOOGLE* forUnmarshaling)
-{
+void unmarshal_VkImportPhysicalAddressGOOGLE(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkImportPhysicalAddressGOOGLE* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
     forUnmarshaling->sType = VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -34012,14 +31903,11 @@
 #endif
 #ifdef VK_EXT_global_priority_query
 void marshal_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -34027,25 +31915,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -34053,59 +31939,53 @@
 }
 
 void marshal_VkQueueFamilyGlobalPriorityPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkQueueFamilyGlobalPriorityPropertiesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkQueueFamilyGlobalPriorityPropertiesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint32_t*)&forMarshaling->priorityCount, sizeof(uint32_t));
-    vkStream->write((VkQueueGlobalPriorityEXT*)forMarshaling->priorities, VK_MAX_GLOBAL_PRIORITY_SIZE_EXT * sizeof(VkQueueGlobalPriorityEXT));
+    vkStream->write((VkQueueGlobalPriorityEXT*)forMarshaling->priorities,
+                    VK_MAX_GLOBAL_PRIORITY_SIZE_EXT * sizeof(VkQueueGlobalPriorityEXT));
 }
 
 void unmarshal_VkQueueFamilyGlobalPriorityPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkQueueFamilyGlobalPriorityPropertiesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkQueueFamilyGlobalPriorityPropertiesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->priorityCount, sizeof(uint32_t));
-    vkStream->read((VkQueueGlobalPriorityEXT*)forUnmarshaling->priorities, VK_MAX_GLOBAL_PRIORITY_SIZE_EXT * sizeof(VkQueueGlobalPriorityEXT));
+    vkStream->read((VkQueueGlobalPriorityEXT*)forUnmarshaling->priorities,
+                   VK_MAX_GLOBAL_PRIORITY_SIZE_EXT * sizeof(VkQueueGlobalPriorityEXT));
 }
 
 #endif
 #ifdef VK_EXT_multi_draw
 void marshal_VkPhysicalDeviceMultiDrawFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceMultiDrawFeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceMultiDrawFeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -34113,25 +31993,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceMultiDrawFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMultiDrawFeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMultiDrawFeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -34139,14 +32017,11 @@
 }
 
 void marshal_VkPhysicalDeviceMultiDrawPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceMultiDrawPropertiesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceMultiDrawPropertiesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -34154,67 +32029,53 @@
 }
 
 void unmarshal_VkPhysicalDeviceMultiDrawPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMultiDrawPropertiesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMultiDrawPropertiesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->maxMultiDrawCount, sizeof(uint32_t));
 }
 
-void marshal_VkMultiDrawInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMultiDrawInfoEXT* forMarshaling)
-{
+void marshal_VkMultiDrawInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                const VkMultiDrawInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->firstVertex, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->vertexCount, sizeof(uint32_t));
 }
 
-void unmarshal_VkMultiDrawInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMultiDrawInfoEXT* forUnmarshaling)
-{
+void unmarshal_VkMultiDrawInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkMultiDrawInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->firstVertex, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->vertexCount, sizeof(uint32_t));
 }
 
-void marshal_VkMultiDrawIndexedInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMultiDrawIndexedInfoEXT* forMarshaling)
-{
+void marshal_VkMultiDrawIndexedInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkMultiDrawIndexedInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->firstIndex, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->indexCount, sizeof(uint32_t));
     vkStream->write((int32_t*)&forMarshaling->vertexOffset, sizeof(int32_t));
 }
 
-void unmarshal_VkMultiDrawIndexedInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMultiDrawIndexedInfoEXT* forUnmarshaling)
-{
+void unmarshal_VkMultiDrawIndexedInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkMultiDrawIndexedInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->firstIndex, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->indexCount, sizeof(uint32_t));
@@ -34226,14 +32087,11 @@
 #endif
 #ifdef VK_EXT_border_color_swizzle
 void marshal_VkPhysicalDeviceBorderColorSwizzleFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceBorderColorSwizzleFeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceBorderColorSwizzleFeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -34242,25 +32100,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceBorderColorSwizzleFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceBorderColorSwizzleFeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceBorderColorSwizzleFeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -34269,59 +32125,53 @@
 }
 
 void marshal_VkSamplerBorderColorComponentMappingCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSamplerBorderColorComponentMappingCreateInfoEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkSamplerBorderColorComponentMappingCreateInfoEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    marshal_VkComponentMapping(vkStream, rootType, (VkComponentMapping*)(&forMarshaling->components));
+    marshal_VkComponentMapping(vkStream, rootType,
+                               (VkComponentMapping*)(&forMarshaling->components));
     vkStream->write((VkBool32*)&forMarshaling->srgb, sizeof(VkBool32));
 }
 
 void unmarshal_VkSamplerBorderColorComponentMappingCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSamplerBorderColorComponentMappingCreateInfoEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSamplerBorderColorComponentMappingCreateInfoEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    unmarshal_VkComponentMapping(vkStream, rootType, (VkComponentMapping*)(&forUnmarshaling->components));
+    unmarshal_VkComponentMapping(vkStream, rootType,
+                                 (VkComponentMapping*)(&forUnmarshaling->components));
     vkStream->read((VkBool32*)&forUnmarshaling->srgb, sizeof(VkBool32));
 }
 
 #endif
 #ifdef VK_EXT_pageable_device_local_memory
 void marshal_VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -34329,25 +32179,23 @@
 }
 
 void unmarshal_VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -34356,29 +32204,21 @@
 
 #endif
 #ifdef VK_KHR_acceleration_structure
-void marshal_VkDeviceOrHostAddressKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDeviceOrHostAddressKHR* forMarshaling)
-{
+void marshal_VkDeviceOrHostAddressKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkDeviceOrHostAddressKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkDeviceAddress*)&forMarshaling->deviceAddress, sizeof(VkDeviceAddress));
 }
 
-void unmarshal_VkDeviceOrHostAddressKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceOrHostAddressKHR* forUnmarshaling)
-{
+void unmarshal_VkDeviceOrHostAddressKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkDeviceOrHostAddressKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkDeviceAddress*)&forUnmarshaling->deviceAddress, sizeof(VkDeviceAddress));
 }
 
 void marshal_VkAccelerationStructureBuildRangeInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAccelerationStructureBuildRangeInfoKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkAccelerationStructureBuildRangeInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->primitiveCount, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->primitiveOffset, sizeof(uint32_t));
@@ -34387,10 +32227,8 @@
 }
 
 void unmarshal_VkAccelerationStructureBuildRangeInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureBuildRangeInfoKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureBuildRangeInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->primitiveCount, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->primitiveOffset, sizeof(uint32_t));
@@ -34399,358 +32237,355 @@
 }
 
 void marshal_VkAccelerationStructureGeometryTrianglesDataKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAccelerationStructureGeometryTrianglesDataKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkAccelerationStructureGeometryTrianglesDataKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkFormat*)&forMarshaling->vertexFormat, sizeof(VkFormat));
-    marshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forMarshaling->vertexData));
+    marshal_VkDeviceOrHostAddressConstKHR(
+        vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forMarshaling->vertexData));
     vkStream->write((VkDeviceSize*)&forMarshaling->vertexStride, sizeof(VkDeviceSize));
     vkStream->write((uint32_t*)&forMarshaling->maxVertex, sizeof(uint32_t));
     vkStream->write((VkIndexType*)&forMarshaling->indexType, sizeof(VkIndexType));
-    marshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forMarshaling->indexData));
-    marshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forMarshaling->transformData));
+    marshal_VkDeviceOrHostAddressConstKHR(
+        vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forMarshaling->indexData));
+    marshal_VkDeviceOrHostAddressConstKHR(
+        vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forMarshaling->transformData));
 }
 
 void unmarshal_VkAccelerationStructureGeometryTrianglesDataKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureGeometryTrianglesDataKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureGeometryTrianglesDataKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkFormat*)&forUnmarshaling->vertexFormat, sizeof(VkFormat));
-    unmarshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forUnmarshaling->vertexData));
+    unmarshal_VkDeviceOrHostAddressConstKHR(
+        vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forUnmarshaling->vertexData));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->vertexStride, sizeof(VkDeviceSize));
     vkStream->read((uint32_t*)&forUnmarshaling->maxVertex, sizeof(uint32_t));
     vkStream->read((VkIndexType*)&forUnmarshaling->indexType, sizeof(VkIndexType));
-    unmarshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forUnmarshaling->indexData));
-    unmarshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forUnmarshaling->transformData));
+    unmarshal_VkDeviceOrHostAddressConstKHR(
+        vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forUnmarshaling->indexData));
+    unmarshal_VkDeviceOrHostAddressConstKHR(
+        vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forUnmarshaling->transformData));
 }
 
 void marshal_VkAccelerationStructureGeometryAabbsDataKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAccelerationStructureGeometryAabbsDataKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkAccelerationStructureGeometryAabbsDataKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    marshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forMarshaling->data));
+    marshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType,
+                                          (VkDeviceOrHostAddressConstKHR*)(&forMarshaling->data));
     vkStream->write((VkDeviceSize*)&forMarshaling->stride, sizeof(VkDeviceSize));
 }
 
 void unmarshal_VkAccelerationStructureGeometryAabbsDataKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureGeometryAabbsDataKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureGeometryAabbsDataKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    unmarshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forUnmarshaling->data));
+    unmarshal_VkDeviceOrHostAddressConstKHR(
+        vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forUnmarshaling->data));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->stride, sizeof(VkDeviceSize));
 }
 
 void marshal_VkAccelerationStructureGeometryInstancesDataKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAccelerationStructureGeometryInstancesDataKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkAccelerationStructureGeometryInstancesDataKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->arrayOfPointers, sizeof(VkBool32));
-    marshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forMarshaling->data));
+    marshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType,
+                                          (VkDeviceOrHostAddressConstKHR*)(&forMarshaling->data));
 }
 
 void unmarshal_VkAccelerationStructureGeometryInstancesDataKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureGeometryInstancesDataKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureGeometryInstancesDataKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkBool32*)&forUnmarshaling->arrayOfPointers, sizeof(VkBool32));
-    unmarshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forUnmarshaling->data));
+    unmarshal_VkDeviceOrHostAddressConstKHR(
+        vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forUnmarshaling->data));
 }
 
 void marshal_VkAccelerationStructureGeometryDataKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAccelerationStructureGeometryDataKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkAccelerationStructureGeometryDataKHR* forMarshaling) {
     (void)rootType;
-    marshal_VkAccelerationStructureGeometryTrianglesDataKHR(vkStream, rootType, (VkAccelerationStructureGeometryTrianglesDataKHR*)(&forMarshaling->triangles));
+    marshal_VkAccelerationStructureGeometryTrianglesDataKHR(
+        vkStream, rootType,
+        (VkAccelerationStructureGeometryTrianglesDataKHR*)(&forMarshaling->triangles));
 }
 
 void unmarshal_VkAccelerationStructureGeometryDataKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureGeometryDataKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureGeometryDataKHR* forUnmarshaling) {
     (void)rootType;
-    unmarshal_VkAccelerationStructureGeometryTrianglesDataKHR(vkStream, rootType, (VkAccelerationStructureGeometryTrianglesDataKHR*)(&forUnmarshaling->triangles));
+    unmarshal_VkAccelerationStructureGeometryTrianglesDataKHR(
+        vkStream, rootType,
+        (VkAccelerationStructureGeometryTrianglesDataKHR*)(&forUnmarshaling->triangles));
 }
 
 void marshal_VkAccelerationStructureGeometryKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAccelerationStructureGeometryKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkAccelerationStructureGeometryKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkGeometryTypeKHR*)&forMarshaling->geometryType, sizeof(VkGeometryTypeKHR));
-    marshal_VkAccelerationStructureGeometryDataKHR(vkStream, rootType, (VkAccelerationStructureGeometryDataKHR*)(&forMarshaling->geometry));
+    marshal_VkAccelerationStructureGeometryDataKHR(
+        vkStream, rootType, (VkAccelerationStructureGeometryDataKHR*)(&forMarshaling->geometry));
     vkStream->write((VkGeometryFlagsKHR*)&forMarshaling->flags, sizeof(VkGeometryFlagsKHR));
 }
 
 void unmarshal_VkAccelerationStructureGeometryKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureGeometryKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureGeometryKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkGeometryTypeKHR*)&forUnmarshaling->geometryType, sizeof(VkGeometryTypeKHR));
-    unmarshal_VkAccelerationStructureGeometryDataKHR(vkStream, rootType, (VkAccelerationStructureGeometryDataKHR*)(&forUnmarshaling->geometry));
+    unmarshal_VkAccelerationStructureGeometryDataKHR(
+        vkStream, rootType, (VkAccelerationStructureGeometryDataKHR*)(&forUnmarshaling->geometry));
     vkStream->read((VkGeometryFlagsKHR*)&forUnmarshaling->flags, sizeof(VkGeometryFlagsKHR));
 }
 
 void marshal_VkAccelerationStructureBuildGeometryInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAccelerationStructureBuildGeometryInfoKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkAccelerationStructureBuildGeometryInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkAccelerationStructureTypeKHR*)&forMarshaling->type, sizeof(VkAccelerationStructureTypeKHR));
-    vkStream->write((VkBuildAccelerationStructureFlagsKHR*)&forMarshaling->flags, sizeof(VkBuildAccelerationStructureFlagsKHR));
-    vkStream->write((VkBuildAccelerationStructureModeKHR*)&forMarshaling->mode, sizeof(VkBuildAccelerationStructureModeKHR));
+    vkStream->write((VkAccelerationStructureTypeKHR*)&forMarshaling->type,
+                    sizeof(VkAccelerationStructureTypeKHR));
+    vkStream->write((VkBuildAccelerationStructureFlagsKHR*)&forMarshaling->flags,
+                    sizeof(VkBuildAccelerationStructureFlagsKHR));
+    vkStream->write((VkBuildAccelerationStructureModeKHR*)&forMarshaling->mode,
+                    sizeof(VkBuildAccelerationStructureModeKHR));
     uint64_t cgen_var_0;
-    vkStream->handleMapping()->mapHandles_VkAccelerationStructureKHR_u64(&forMarshaling->srcAccelerationStructure, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkAccelerationStructureKHR_u64(
+        &forMarshaling->srcAccelerationStructure, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     uint64_t cgen_var_1;
-    vkStream->handleMapping()->mapHandles_VkAccelerationStructureKHR_u64(&forMarshaling->dstAccelerationStructure, &cgen_var_1, 1);
+    vkStream->handleMapping()->mapHandles_VkAccelerationStructureKHR_u64(
+        &forMarshaling->dstAccelerationStructure, &cgen_var_1, 1);
     vkStream->write((uint64_t*)&cgen_var_1, 1 * 8);
     vkStream->write((uint32_t*)&forMarshaling->geometryCount, sizeof(uint32_t));
     // WARNING PTR CHECK
     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)forMarshaling->pGeometries;
     vkStream->putBe64(cgen_var_2);
-    if (forMarshaling->pGeometries)
-    {
-        if (forMarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forMarshaling->geometryCount; ++i)
-            {
-                marshal_VkAccelerationStructureGeometryKHR(vkStream, rootType, (const VkAccelerationStructureGeometryKHR*)(forMarshaling->pGeometries + i));
+    if (forMarshaling->pGeometries) {
+        if (forMarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forMarshaling->geometryCount; ++i) {
+                marshal_VkAccelerationStructureGeometryKHR(
+                    vkStream, rootType,
+                    (const VkAccelerationStructureGeometryKHR*)(forMarshaling->pGeometries + i));
             }
         }
     }
-    marshal_VkDeviceOrHostAddressKHR(vkStream, rootType, (VkDeviceOrHostAddressKHR*)(&forMarshaling->scratchData));
+    marshal_VkDeviceOrHostAddressKHR(vkStream, rootType,
+                                     (VkDeviceOrHostAddressKHR*)(&forMarshaling->scratchData));
 }
 
 void unmarshal_VkAccelerationStructureBuildGeometryInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureBuildGeometryInfoKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureBuildGeometryInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkAccelerationStructureTypeKHR*)&forUnmarshaling->type, sizeof(VkAccelerationStructureTypeKHR));
-    vkStream->read((VkBuildAccelerationStructureFlagsKHR*)&forUnmarshaling->flags, sizeof(VkBuildAccelerationStructureFlagsKHR));
-    vkStream->read((VkBuildAccelerationStructureModeKHR*)&forUnmarshaling->mode, sizeof(VkBuildAccelerationStructureModeKHR));
+    vkStream->read((VkAccelerationStructureTypeKHR*)&forUnmarshaling->type,
+                   sizeof(VkAccelerationStructureTypeKHR));
+    vkStream->read((VkBuildAccelerationStructureFlagsKHR*)&forUnmarshaling->flags,
+                   sizeof(VkBuildAccelerationStructureFlagsKHR));
+    vkStream->read((VkBuildAccelerationStructureModeKHR*)&forUnmarshaling->mode,
+                   sizeof(VkBuildAccelerationStructureModeKHR));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkAccelerationStructureKHR(&cgen_var_0, (VkAccelerationStructureKHR*)&forUnmarshaling->srcAccelerationStructure, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkAccelerationStructureKHR(
+        &cgen_var_0, (VkAccelerationStructureKHR*)&forUnmarshaling->srcAccelerationStructure, 1);
     uint64_t cgen_var_1;
     vkStream->read((uint64_t*)&cgen_var_1, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkAccelerationStructureKHR(&cgen_var_1, (VkAccelerationStructureKHR*)&forUnmarshaling->dstAccelerationStructure, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkAccelerationStructureKHR(
+        &cgen_var_1, (VkAccelerationStructureKHR*)&forUnmarshaling->dstAccelerationStructure, 1);
     vkStream->read((uint32_t*)&forUnmarshaling->geometryCount, sizeof(uint32_t));
     // WARNING PTR CHECK
-    forUnmarshaling->pGeometries = (const VkAccelerationStructureGeometryKHR*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pGeometries)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pGeometries, forUnmarshaling->geometryCount * sizeof(const VkAccelerationStructureGeometryKHR));
-        if (forUnmarshaling)
-        {
-            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->geometryCount; ++i)
-            {
-                unmarshal_VkAccelerationStructureGeometryKHR(vkStream, rootType, (VkAccelerationStructureGeometryKHR*)(forUnmarshaling->pGeometries + i));
+    forUnmarshaling->pGeometries =
+        (const VkAccelerationStructureGeometryKHR*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pGeometries) {
+        vkStream->alloc(
+            (void**)&forUnmarshaling->pGeometries,
+            forUnmarshaling->geometryCount * sizeof(const VkAccelerationStructureGeometryKHR));
+        if (forUnmarshaling) {
+            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->geometryCount; ++i) {
+                unmarshal_VkAccelerationStructureGeometryKHR(
+                    vkStream, rootType,
+                    (VkAccelerationStructureGeometryKHR*)(forUnmarshaling->pGeometries + i));
             }
         }
     }
-    unmarshal_VkDeviceOrHostAddressKHR(vkStream, rootType, (VkDeviceOrHostAddressKHR*)(&forUnmarshaling->scratchData));
+    unmarshal_VkDeviceOrHostAddressKHR(vkStream, rootType,
+                                       (VkDeviceOrHostAddressKHR*)(&forUnmarshaling->scratchData));
 }
 
 void marshal_VkAccelerationStructureCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAccelerationStructureCreateInfoKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkAccelerationStructureCreateInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkAccelerationStructureCreateFlagsKHR*)&forMarshaling->createFlags, sizeof(VkAccelerationStructureCreateFlagsKHR));
+    vkStream->write((VkAccelerationStructureCreateFlagsKHR*)&forMarshaling->createFlags,
+                    sizeof(VkAccelerationStructureCreateFlagsKHR));
     uint64_t cgen_var_0;
     vkStream->handleMapping()->mapHandles_VkBuffer_u64(&forMarshaling->buffer, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     vkStream->write((VkDeviceSize*)&forMarshaling->offset, sizeof(VkDeviceSize));
     vkStream->write((VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
-    vkStream->write((VkAccelerationStructureTypeKHR*)&forMarshaling->type, sizeof(VkAccelerationStructureTypeKHR));
+    vkStream->write((VkAccelerationStructureTypeKHR*)&forMarshaling->type,
+                    sizeof(VkAccelerationStructureTypeKHR));
     vkStream->write((VkDeviceAddress*)&forMarshaling->deviceAddress, sizeof(VkDeviceAddress));
 }
 
 void unmarshal_VkAccelerationStructureCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureCreateInfoKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureCreateInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkAccelerationStructureCreateFlagsKHR*)&forUnmarshaling->createFlags, sizeof(VkAccelerationStructureCreateFlagsKHR));
+    vkStream->read((VkAccelerationStructureCreateFlagsKHR*)&forUnmarshaling->createFlags,
+                   sizeof(VkAccelerationStructureCreateFlagsKHR));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_0, (VkBuffer*)&forUnmarshaling->buffer, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_0,
+                                                       (VkBuffer*)&forUnmarshaling->buffer, 1);
     vkStream->read((VkDeviceSize*)&forUnmarshaling->offset, sizeof(VkDeviceSize));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->size, sizeof(VkDeviceSize));
-    vkStream->read((VkAccelerationStructureTypeKHR*)&forUnmarshaling->type, sizeof(VkAccelerationStructureTypeKHR));
+    vkStream->read((VkAccelerationStructureTypeKHR*)&forUnmarshaling->type,
+                   sizeof(VkAccelerationStructureTypeKHR));
     vkStream->read((VkDeviceAddress*)&forUnmarshaling->deviceAddress, sizeof(VkDeviceAddress));
 }
 
 void marshal_VkWriteDescriptorSetAccelerationStructureKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkWriteDescriptorSetAccelerationStructureKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkWriteDescriptorSetAccelerationStructureKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -34758,408 +32593,418 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pAccelerationStructures;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pAccelerationStructures)
-    {
-        if (forMarshaling->accelerationStructureCount)
-        {
+    if (forMarshaling->pAccelerationStructures) {
+        if (forMarshaling->accelerationStructureCount) {
             uint64_t* cgen_var_0_0;
             vkStream->alloc((void**)&cgen_var_0_0, forMarshaling->accelerationStructureCount * 8);
-            vkStream->handleMapping()->mapHandles_VkAccelerationStructureKHR_u64(forMarshaling->pAccelerationStructures, cgen_var_0_0, forMarshaling->accelerationStructureCount);
+            vkStream->handleMapping()->mapHandles_VkAccelerationStructureKHR_u64(
+                forMarshaling->pAccelerationStructures, cgen_var_0_0,
+                forMarshaling->accelerationStructureCount);
             vkStream->write((uint64_t*)cgen_var_0_0, forMarshaling->accelerationStructureCount * 8);
         }
     }
 }
 
 void unmarshal_VkWriteDescriptorSetAccelerationStructureKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkWriteDescriptorSetAccelerationStructureKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkWriteDescriptorSetAccelerationStructureKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint32_t*)&forUnmarshaling->accelerationStructureCount, sizeof(uint32_t));
     // WARNING PTR CHECK
-    forUnmarshaling->pAccelerationStructures = (const VkAccelerationStructureKHR*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pAccelerationStructures)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pAccelerationStructures, forUnmarshaling->accelerationStructureCount * sizeof(const VkAccelerationStructureKHR));
-        if (forUnmarshaling->accelerationStructureCount)
-        {
+    forUnmarshaling->pAccelerationStructures =
+        (const VkAccelerationStructureKHR*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pAccelerationStructures) {
+        vkStream->alloc(
+            (void**)&forUnmarshaling->pAccelerationStructures,
+            forUnmarshaling->accelerationStructureCount * sizeof(const VkAccelerationStructureKHR));
+        if (forUnmarshaling->accelerationStructureCount) {
             uint64_t* cgen_var_0_0;
             vkStream->alloc((void**)&cgen_var_0_0, forUnmarshaling->accelerationStructureCount * 8);
-            vkStream->read((uint64_t*)cgen_var_0_0, forUnmarshaling->accelerationStructureCount * 8);
-            vkStream->handleMapping()->mapHandles_u64_VkAccelerationStructureKHR(cgen_var_0_0, (VkAccelerationStructureKHR*)forUnmarshaling->pAccelerationStructures, forUnmarshaling->accelerationStructureCount);
+            vkStream->read((uint64_t*)cgen_var_0_0,
+                           forUnmarshaling->accelerationStructureCount * 8);
+            vkStream->handleMapping()->mapHandles_u64_VkAccelerationStructureKHR(
+                cgen_var_0_0, (VkAccelerationStructureKHR*)forUnmarshaling->pAccelerationStructures,
+                forUnmarshaling->accelerationStructureCount);
         }
     }
 }
 
 void marshal_VkPhysicalDeviceAccelerationStructureFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceAccelerationStructureFeaturesKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceAccelerationStructureFeaturesKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->accelerationStructure, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->accelerationStructureCaptureReplay, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->accelerationStructureIndirectBuild, sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->accelerationStructureCaptureReplay,
+                    sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->accelerationStructureIndirectBuild,
+                    sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->accelerationStructureHostCommands, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->descriptorBindingAccelerationStructureUpdateAfterBind, sizeof(VkBool32));
+    vkStream->write(
+        (VkBool32*)&forMarshaling->descriptorBindingAccelerationStructureUpdateAfterBind,
+        sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceAccelerationStructureFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceAccelerationStructureFeaturesKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceAccelerationStructureFeaturesKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkBool32*)&forUnmarshaling->accelerationStructure, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->accelerationStructureCaptureReplay, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->accelerationStructureIndirectBuild, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->accelerationStructureHostCommands, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->descriptorBindingAccelerationStructureUpdateAfterBind, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->accelerationStructureCaptureReplay,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->accelerationStructureIndirectBuild,
+                   sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->accelerationStructureHostCommands,
+                   sizeof(VkBool32));
+    vkStream->read(
+        (VkBool32*)&forUnmarshaling->descriptorBindingAccelerationStructureUpdateAfterBind,
+        sizeof(VkBool32));
 }
 
 void marshal_VkPhysicalDeviceAccelerationStructurePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceAccelerationStructurePropertiesKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceAccelerationStructurePropertiesKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((uint64_t*)&forMarshaling->maxGeometryCount, sizeof(uint64_t));
     vkStream->write((uint64_t*)&forMarshaling->maxInstanceCount, sizeof(uint64_t));
     vkStream->write((uint64_t*)&forMarshaling->maxPrimitiveCount, sizeof(uint64_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorAccelerationStructures, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorUpdateAfterBindAccelerationStructures, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetAccelerationStructures, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindAccelerationStructures, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->minAccelerationStructureScratchOffsetAlignment, sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxPerStageDescriptorAccelerationStructures,
+                    sizeof(uint32_t));
+    vkStream->write(
+        (uint32_t*)&forMarshaling->maxPerStageDescriptorUpdateAfterBindAccelerationStructures,
+        sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->maxDescriptorSetAccelerationStructures,
+                    sizeof(uint32_t));
+    vkStream->write(
+        (uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindAccelerationStructures,
+        sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->minAccelerationStructureScratchOffsetAlignment,
+                    sizeof(uint32_t));
 }
 
 void unmarshal_VkPhysicalDeviceAccelerationStructurePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceAccelerationStructurePropertiesKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceAccelerationStructurePropertiesKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((uint64_t*)&forUnmarshaling->maxGeometryCount, sizeof(uint64_t));
     vkStream->read((uint64_t*)&forUnmarshaling->maxInstanceCount, sizeof(uint64_t));
     vkStream->read((uint64_t*)&forUnmarshaling->maxPrimitiveCount, sizeof(uint64_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorAccelerationStructures, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindAccelerationStructures, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetAccelerationStructures, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindAccelerationStructures, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->minAccelerationStructureScratchOffsetAlignment, sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxPerStageDescriptorAccelerationStructures,
+                   sizeof(uint32_t));
+    vkStream->read(
+        (uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindAccelerationStructures,
+        sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->maxDescriptorSetAccelerationStructures,
+                   sizeof(uint32_t));
+    vkStream->read(
+        (uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindAccelerationStructures,
+        sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->minAccelerationStructureScratchOffsetAlignment,
+                   sizeof(uint32_t));
 }
 
 void marshal_VkAccelerationStructureDeviceAddressInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAccelerationStructureDeviceAddressInfoKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkAccelerationStructureDeviceAddressInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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_VkAccelerationStructureKHR_u64(&forMarshaling->accelerationStructure, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkAccelerationStructureKHR_u64(
+        &forMarshaling->accelerationStructure, &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
 }
 
 void unmarshal_VkAccelerationStructureDeviceAddressInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureDeviceAddressInfoKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureDeviceAddressInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkAccelerationStructureKHR(&cgen_var_0, (VkAccelerationStructureKHR*)&forUnmarshaling->accelerationStructure, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkAccelerationStructureKHR(
+        &cgen_var_0, (VkAccelerationStructureKHR*)&forUnmarshaling->accelerationStructure, 1);
 }
 
 void marshal_VkAccelerationStructureVersionInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAccelerationStructureVersionInfoKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkAccelerationStructureVersionInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((const uint8_t*)forMarshaling->pVersionData, 2*VK_UUID_SIZE * sizeof(const uint8_t));
+    vkStream->write((const uint8_t*)forMarshaling->pVersionData,
+                    2 * VK_UUID_SIZE * sizeof(const uint8_t));
 }
 
 void unmarshal_VkAccelerationStructureVersionInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureVersionInfoKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureVersionInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->alloc((void**)&forUnmarshaling->pVersionData, 2*VK_UUID_SIZE * sizeof(const uint8_t));
-    vkStream->read((uint8_t*)forUnmarshaling->pVersionData, 2*VK_UUID_SIZE * sizeof(const uint8_t));
+    vkStream->alloc((void**)&forUnmarshaling->pVersionData,
+                    2 * VK_UUID_SIZE * sizeof(const uint8_t));
+    vkStream->read((uint8_t*)forUnmarshaling->pVersionData,
+                   2 * VK_UUID_SIZE * sizeof(const uint8_t));
 }
 
 void marshal_VkCopyAccelerationStructureToMemoryInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCopyAccelerationStructureToMemoryInfoKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkCopyAccelerationStructureToMemoryInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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_VkAccelerationStructureKHR_u64(&forMarshaling->src, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkAccelerationStructureKHR_u64(&forMarshaling->src,
+                                                                         &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
-    marshal_VkDeviceOrHostAddressKHR(vkStream, rootType, (VkDeviceOrHostAddressKHR*)(&forMarshaling->dst));
-    vkStream->write((VkCopyAccelerationStructureModeKHR*)&forMarshaling->mode, sizeof(VkCopyAccelerationStructureModeKHR));
+    marshal_VkDeviceOrHostAddressKHR(vkStream, rootType,
+                                     (VkDeviceOrHostAddressKHR*)(&forMarshaling->dst));
+    vkStream->write((VkCopyAccelerationStructureModeKHR*)&forMarshaling->mode,
+                    sizeof(VkCopyAccelerationStructureModeKHR));
 }
 
 void unmarshal_VkCopyAccelerationStructureToMemoryInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCopyAccelerationStructureToMemoryInfoKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkCopyAccelerationStructureToMemoryInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkAccelerationStructureKHR(&cgen_var_0, (VkAccelerationStructureKHR*)&forUnmarshaling->src, 1);
-    unmarshal_VkDeviceOrHostAddressKHR(vkStream, rootType, (VkDeviceOrHostAddressKHR*)(&forUnmarshaling->dst));
-    vkStream->read((VkCopyAccelerationStructureModeKHR*)&forUnmarshaling->mode, sizeof(VkCopyAccelerationStructureModeKHR));
+    vkStream->handleMapping()->mapHandles_u64_VkAccelerationStructureKHR(
+        &cgen_var_0, (VkAccelerationStructureKHR*)&forUnmarshaling->src, 1);
+    unmarshal_VkDeviceOrHostAddressKHR(vkStream, rootType,
+                                       (VkDeviceOrHostAddressKHR*)(&forUnmarshaling->dst));
+    vkStream->read((VkCopyAccelerationStructureModeKHR*)&forUnmarshaling->mode,
+                   sizeof(VkCopyAccelerationStructureModeKHR));
 }
 
 void marshal_VkCopyMemoryToAccelerationStructureInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCopyMemoryToAccelerationStructureInfoKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkCopyMemoryToAccelerationStructureInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    marshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forMarshaling->src));
+    marshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType,
+                                          (VkDeviceOrHostAddressConstKHR*)(&forMarshaling->src));
     uint64_t cgen_var_0;
-    vkStream->handleMapping()->mapHandles_VkAccelerationStructureKHR_u64(&forMarshaling->dst, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkAccelerationStructureKHR_u64(&forMarshaling->dst,
+                                                                         &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->write((VkCopyAccelerationStructureModeKHR*)&forMarshaling->mode, sizeof(VkCopyAccelerationStructureModeKHR));
+    vkStream->write((VkCopyAccelerationStructureModeKHR*)&forMarshaling->mode,
+                    sizeof(VkCopyAccelerationStructureModeKHR));
 }
 
 void unmarshal_VkCopyMemoryToAccelerationStructureInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCopyMemoryToAccelerationStructureInfoKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkCopyMemoryToAccelerationStructureInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    unmarshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forUnmarshaling->src));
+    unmarshal_VkDeviceOrHostAddressConstKHR(
+        vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forUnmarshaling->src));
     uint64_t cgen_var_0;
     vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkAccelerationStructureKHR(&cgen_var_0, (VkAccelerationStructureKHR*)&forUnmarshaling->dst, 1);
-    vkStream->read((VkCopyAccelerationStructureModeKHR*)&forUnmarshaling->mode, sizeof(VkCopyAccelerationStructureModeKHR));
+    vkStream->handleMapping()->mapHandles_u64_VkAccelerationStructureKHR(
+        &cgen_var_0, (VkAccelerationStructureKHR*)&forUnmarshaling->dst, 1);
+    vkStream->read((VkCopyAccelerationStructureModeKHR*)&forUnmarshaling->mode,
+                   sizeof(VkCopyAccelerationStructureModeKHR));
 }
 
 void marshal_VkCopyAccelerationStructureInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCopyAccelerationStructureInfoKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkCopyAccelerationStructureInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    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_VkAccelerationStructureKHR_u64(&forMarshaling->src, &cgen_var_0, 1);
+    vkStream->handleMapping()->mapHandles_VkAccelerationStructureKHR_u64(&forMarshaling->src,
+                                                                         &cgen_var_0, 1);
     vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
     uint64_t cgen_var_1;
-    vkStream->handleMapping()->mapHandles_VkAccelerationStructureKHR_u64(&forMarshaling->dst, &cgen_var_1, 1);
+    vkStream->handleMapping()->mapHandles_VkAccelerationStructureKHR_u64(&forMarshaling->dst,
+                                                                         &cgen_var_1, 1);
     vkStream->write((uint64_t*)&cgen_var_1, 1 * 8);
-    vkStream->write((VkCopyAccelerationStructureModeKHR*)&forMarshaling->mode, sizeof(VkCopyAccelerationStructureModeKHR));
+    vkStream->write((VkCopyAccelerationStructureModeKHR*)&forMarshaling->mode,
+                    sizeof(VkCopyAccelerationStructureModeKHR));
 }
 
 void unmarshal_VkCopyAccelerationStructureInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCopyAccelerationStructureInfoKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkCopyAccelerationStructureInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         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_VkAccelerationStructureKHR(&cgen_var_0, (VkAccelerationStructureKHR*)&forUnmarshaling->src, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkAccelerationStructureKHR(
+        &cgen_var_0, (VkAccelerationStructureKHR*)&forUnmarshaling->src, 1);
     uint64_t cgen_var_1;
     vkStream->read((uint64_t*)&cgen_var_1, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkAccelerationStructureKHR(&cgen_var_1, (VkAccelerationStructureKHR*)&forUnmarshaling->dst, 1);
-    vkStream->read((VkCopyAccelerationStructureModeKHR*)&forUnmarshaling->mode, sizeof(VkCopyAccelerationStructureModeKHR));
+    vkStream->handleMapping()->mapHandles_u64_VkAccelerationStructureKHR(
+        &cgen_var_1, (VkAccelerationStructureKHR*)&forUnmarshaling->dst, 1);
+    vkStream->read((VkCopyAccelerationStructureModeKHR*)&forUnmarshaling->mode,
+                   sizeof(VkCopyAccelerationStructureModeKHR));
 }
 
 void marshal_VkAccelerationStructureBuildSizesInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAccelerationStructureBuildSizesInfoKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkAccelerationStructureBuildSizesInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -35169,29 +33014,28 @@
 }
 
 void unmarshal_VkAccelerationStructureBuildSizesInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureBuildSizesInfoKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureBuildSizesInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkDeviceSize*)&forUnmarshaling->accelerationStructureSize, sizeof(VkDeviceSize));
+    vkStream->read((VkDeviceSize*)&forUnmarshaling->accelerationStructureSize,
+                   sizeof(VkDeviceSize));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->updateScratchSize, sizeof(VkDeviceSize));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->buildScratchSize, sizeof(VkDeviceSize));
 }
@@ -35199,18 +33043,16 @@
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
 void marshal_VkRayTracingShaderGroupCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkRayTracingShaderGroupCreateInfoKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkRayTracingShaderGroupCreateInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkRayTracingShaderGroupTypeKHR*)&forMarshaling->type, sizeof(VkRayTracingShaderGroupTypeKHR));
+    vkStream->write((VkRayTracingShaderGroupTypeKHR*)&forMarshaling->type,
+                    sizeof(VkRayTracingShaderGroupTypeKHR));
     vkStream->write((uint32_t*)&forMarshaling->generalShader, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->closestHitShader, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->anyHitShader, sizeof(uint32_t));
@@ -35218,58 +33060,55 @@
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pShaderGroupCaptureReplayHandle;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pShaderGroupCaptureReplayHandle)
-    {
-        vkStream->write((const void*)forMarshaling->pShaderGroupCaptureReplayHandle, sizeof(const uint8_t));
+    if (forMarshaling->pShaderGroupCaptureReplayHandle) {
+        vkStream->write((const void*)forMarshaling->pShaderGroupCaptureReplayHandle,
+                        sizeof(const uint8_t));
     }
 }
 
 void unmarshal_VkRayTracingShaderGroupCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRayTracingShaderGroupCreateInfoKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkRayTracingShaderGroupCreateInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
-    vkStream->read((VkRayTracingShaderGroupTypeKHR*)&forUnmarshaling->type, sizeof(VkRayTracingShaderGroupTypeKHR));
+    vkStream->read((VkRayTracingShaderGroupTypeKHR*)&forUnmarshaling->type,
+                   sizeof(VkRayTracingShaderGroupTypeKHR));
     vkStream->read((uint32_t*)&forUnmarshaling->generalShader, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->closestHitShader, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->anyHitShader, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->intersectionShader, sizeof(uint32_t));
     // WARNING PTR CHECK
     forUnmarshaling->pShaderGroupCaptureReplayHandle = (const void*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pShaderGroupCaptureReplayHandle)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pShaderGroupCaptureReplayHandle, sizeof(const uint8_t));
-        vkStream->read((void*)forUnmarshaling->pShaderGroupCaptureReplayHandle, sizeof(const uint8_t));
+    if (forUnmarshaling->pShaderGroupCaptureReplayHandle) {
+        vkStream->alloc((void**)&forUnmarshaling->pShaderGroupCaptureReplayHandle,
+                        sizeof(const uint8_t));
+        vkStream->read((void*)forUnmarshaling->pShaderGroupCaptureReplayHandle,
+                       sizeof(const uint8_t));
     }
 }
 
 void marshal_VkRayTracingPipelineInterfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkRayTracingPipelineInterfaceCreateInfoKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkRayTracingPipelineInterfaceCreateInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -35278,25 +33117,23 @@
 }
 
 void unmarshal_VkRayTracingPipelineInterfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRayTracingPipelineInterfaceCreateInfoKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkRayTracingPipelineInterfaceCreateInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -35305,196 +33142,209 @@
 }
 
 void marshal_VkRayTracingPipelineCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkRayTracingPipelineCreateInfoKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkRayTracingPipelineCreateInfoKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkPipelineCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineCreateFlags));
     vkStream->write((uint32_t*)&forMarshaling->stageCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->stageCount; ++i)
-        {
-            marshal_VkPipelineShaderStageCreateInfo(vkStream, rootType, (const VkPipelineShaderStageCreateInfo*)(forMarshaling->pStages + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->stageCount; ++i) {
+            marshal_VkPipelineShaderStageCreateInfo(
+                vkStream, rootType,
+                (const VkPipelineShaderStageCreateInfo*)(forMarshaling->pStages + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->groupCount, sizeof(uint32_t));
-    if (forMarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forMarshaling->groupCount; ++i)
-        {
-            marshal_VkRayTracingShaderGroupCreateInfoKHR(vkStream, rootType, (const VkRayTracingShaderGroupCreateInfoKHR*)(forMarshaling->pGroups + i));
+    if (forMarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->groupCount; ++i) {
+            marshal_VkRayTracingShaderGroupCreateInfoKHR(
+                vkStream, rootType,
+                (const VkRayTracingShaderGroupCreateInfoKHR*)(forMarshaling->pGroups + i));
         }
     }
     vkStream->write((uint32_t*)&forMarshaling->maxPipelineRayRecursionDepth, sizeof(uint32_t));
     // WARNING PTR CHECK
     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pLibraryInfo;
     vkStream->putBe64(cgen_var_0);
-    if (forMarshaling->pLibraryInfo)
-    {
-        marshal_VkPipelineLibraryCreateInfoKHR(vkStream, rootType, (const VkPipelineLibraryCreateInfoKHR*)(forMarshaling->pLibraryInfo));
+    if (forMarshaling->pLibraryInfo) {
+        marshal_VkPipelineLibraryCreateInfoKHR(
+            vkStream, rootType,
+            (const VkPipelineLibraryCreateInfoKHR*)(forMarshaling->pLibraryInfo));
     }
     // WARNING PTR CHECK
     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)forMarshaling->pLibraryInterface;
     vkStream->putBe64(cgen_var_1);
-    if (forMarshaling->pLibraryInterface)
-    {
-        marshal_VkRayTracingPipelineInterfaceCreateInfoKHR(vkStream, rootType, (const VkRayTracingPipelineInterfaceCreateInfoKHR*)(forMarshaling->pLibraryInterface));
+    if (forMarshaling->pLibraryInterface) {
+        marshal_VkRayTracingPipelineInterfaceCreateInfoKHR(
+            vkStream, rootType,
+            (const VkRayTracingPipelineInterfaceCreateInfoKHR*)(forMarshaling->pLibraryInterface));
     }
     // WARNING PTR CHECK
     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)forMarshaling->pDynamicState;
     vkStream->putBe64(cgen_var_2);
-    if (forMarshaling->pDynamicState)
-    {
-        marshal_VkPipelineDynamicStateCreateInfo(vkStream, rootType, (const VkPipelineDynamicStateCreateInfo*)(forMarshaling->pDynamicState));
+    if (forMarshaling->pDynamicState) {
+        marshal_VkPipelineDynamicStateCreateInfo(
+            vkStream, rootType,
+            (const VkPipelineDynamicStateCreateInfo*)(forMarshaling->pDynamicState));
     }
     uint64_t cgen_var_3;
-    vkStream->handleMapping()->mapHandles_VkPipelineLayout_u64(&forMarshaling->layout, &cgen_var_3, 1);
+    vkStream->handleMapping()->mapHandles_VkPipelineLayout_u64(&forMarshaling->layout, &cgen_var_3,
+                                                               1);
     vkStream->write((uint64_t*)&cgen_var_3, 1 * 8);
     uint64_t cgen_var_4;
-    vkStream->handleMapping()->mapHandles_VkPipeline_u64(&forMarshaling->basePipelineHandle, &cgen_var_4, 1);
+    vkStream->handleMapping()->mapHandles_VkPipeline_u64(&forMarshaling->basePipelineHandle,
+                                                         &cgen_var_4, 1);
     vkStream->write((uint64_t*)&cgen_var_4, 1 * 8);
     vkStream->write((int32_t*)&forMarshaling->basePipelineIndex, sizeof(int32_t));
 }
 
 void unmarshal_VkRayTracingPipelineCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRayTracingPipelineCreateInfoKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkRayTracingPipelineCreateInfoKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkPipelineCreateFlags*)&forUnmarshaling->flags, sizeof(VkPipelineCreateFlags));
     vkStream->read((uint32_t*)&forUnmarshaling->stageCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pStages, forUnmarshaling->stageCount * sizeof(const VkPipelineShaderStageCreateInfo));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->stageCount; ++i)
-        {
-            unmarshal_VkPipelineShaderStageCreateInfo(vkStream, rootType, (VkPipelineShaderStageCreateInfo*)(forUnmarshaling->pStages + i));
+    vkStream->alloc((void**)&forUnmarshaling->pStages,
+                    forUnmarshaling->stageCount * sizeof(const VkPipelineShaderStageCreateInfo));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->stageCount; ++i) {
+            unmarshal_VkPipelineShaderStageCreateInfo(
+                vkStream, rootType,
+                (VkPipelineShaderStageCreateInfo*)(forUnmarshaling->pStages + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->groupCount, sizeof(uint32_t));
-    vkStream->alloc((void**)&forUnmarshaling->pGroups, forUnmarshaling->groupCount * sizeof(const VkRayTracingShaderGroupCreateInfoKHR));
-    if (forUnmarshaling)
-    {
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->groupCount; ++i)
-        {
-            unmarshal_VkRayTracingShaderGroupCreateInfoKHR(vkStream, rootType, (VkRayTracingShaderGroupCreateInfoKHR*)(forUnmarshaling->pGroups + i));
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pGroups,
+        forUnmarshaling->groupCount * sizeof(const VkRayTracingShaderGroupCreateInfoKHR));
+    if (forUnmarshaling) {
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->groupCount; ++i) {
+            unmarshal_VkRayTracingShaderGroupCreateInfoKHR(
+                vkStream, rootType,
+                (VkRayTracingShaderGroupCreateInfoKHR*)(forUnmarshaling->pGroups + i));
         }
     }
     vkStream->read((uint32_t*)&forUnmarshaling->maxPipelineRayRecursionDepth, sizeof(uint32_t));
     // WARNING PTR CHECK
-    forUnmarshaling->pLibraryInfo = (const VkPipelineLibraryCreateInfoKHR*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pLibraryInfo)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pLibraryInfo, sizeof(const VkPipelineLibraryCreateInfoKHR));
-        unmarshal_VkPipelineLibraryCreateInfoKHR(vkStream, rootType, (VkPipelineLibraryCreateInfoKHR*)(forUnmarshaling->pLibraryInfo));
+    forUnmarshaling->pLibraryInfo =
+        (const VkPipelineLibraryCreateInfoKHR*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pLibraryInfo) {
+        vkStream->alloc((void**)&forUnmarshaling->pLibraryInfo,
+                        sizeof(const VkPipelineLibraryCreateInfoKHR));
+        unmarshal_VkPipelineLibraryCreateInfoKHR(
+            vkStream, rootType, (VkPipelineLibraryCreateInfoKHR*)(forUnmarshaling->pLibraryInfo));
     }
     // WARNING PTR CHECK
-    forUnmarshaling->pLibraryInterface = (const VkRayTracingPipelineInterfaceCreateInfoKHR*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pLibraryInterface)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pLibraryInterface, sizeof(const VkRayTracingPipelineInterfaceCreateInfoKHR));
-        unmarshal_VkRayTracingPipelineInterfaceCreateInfoKHR(vkStream, rootType, (VkRayTracingPipelineInterfaceCreateInfoKHR*)(forUnmarshaling->pLibraryInterface));
+    forUnmarshaling->pLibraryInterface =
+        (const VkRayTracingPipelineInterfaceCreateInfoKHR*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pLibraryInterface) {
+        vkStream->alloc((void**)&forUnmarshaling->pLibraryInterface,
+                        sizeof(const VkRayTracingPipelineInterfaceCreateInfoKHR));
+        unmarshal_VkRayTracingPipelineInterfaceCreateInfoKHR(
+            vkStream, rootType,
+            (VkRayTracingPipelineInterfaceCreateInfoKHR*)(forUnmarshaling->pLibraryInterface));
     }
     // WARNING PTR CHECK
-    forUnmarshaling->pDynamicState = (const VkPipelineDynamicStateCreateInfo*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pDynamicState)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pDynamicState, sizeof(const VkPipelineDynamicStateCreateInfo));
-        unmarshal_VkPipelineDynamicStateCreateInfo(vkStream, rootType, (VkPipelineDynamicStateCreateInfo*)(forUnmarshaling->pDynamicState));
+    forUnmarshaling->pDynamicState =
+        (const VkPipelineDynamicStateCreateInfo*)(uintptr_t)vkStream->getBe64();
+    if (forUnmarshaling->pDynamicState) {
+        vkStream->alloc((void**)&forUnmarshaling->pDynamicState,
+                        sizeof(const VkPipelineDynamicStateCreateInfo));
+        unmarshal_VkPipelineDynamicStateCreateInfo(
+            vkStream, rootType,
+            (VkPipelineDynamicStateCreateInfo*)(forUnmarshaling->pDynamicState));
     }
     uint64_t cgen_var_3;
     vkStream->read((uint64_t*)&cgen_var_3, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkPipelineLayout(&cgen_var_3, (VkPipelineLayout*)&forUnmarshaling->layout, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkPipelineLayout(
+        &cgen_var_3, (VkPipelineLayout*)&forUnmarshaling->layout, 1);
     uint64_t cgen_var_4;
     vkStream->read((uint64_t*)&cgen_var_4, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkPipeline(&cgen_var_4, (VkPipeline*)&forUnmarshaling->basePipelineHandle, 1);
+    vkStream->handleMapping()->mapHandles_u64_VkPipeline(
+        &cgen_var_4, (VkPipeline*)&forUnmarshaling->basePipelineHandle, 1);
     vkStream->read((int32_t*)&forUnmarshaling->basePipelineIndex, sizeof(int32_t));
 }
 
 void marshal_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceRayTracingPipelineFeaturesKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceRayTracingPipelineFeaturesKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
     vkStream->write((VkBool32*)&forMarshaling->rayTracingPipeline, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->rayTracingPipelineShaderGroupHandleCaptureReplay, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->rayTracingPipelineShaderGroupHandleCaptureReplayMixed, sizeof(VkBool32));
-    vkStream->write((VkBool32*)&forMarshaling->rayTracingPipelineTraceRaysIndirect, sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->rayTracingPipelineShaderGroupHandleCaptureReplay,
+                    sizeof(VkBool32));
+    vkStream->write(
+        (VkBool32*)&forMarshaling->rayTracingPipelineShaderGroupHandleCaptureReplayMixed,
+        sizeof(VkBool32));
+    vkStream->write((VkBool32*)&forMarshaling->rayTracingPipelineTraceRaysIndirect,
+                    sizeof(VkBool32));
     vkStream->write((VkBool32*)&forMarshaling->rayTraversalPrimitiveCulling, sizeof(VkBool32));
 }
 
 void unmarshal_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceRayTracingPipelineFeaturesKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceRayTracingPipelineFeaturesKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
     vkStream->read((VkBool32*)&forUnmarshaling->rayTracingPipeline, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->rayTracingPipelineShaderGroupHandleCaptureReplay, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->rayTracingPipelineShaderGroupHandleCaptureReplayMixed, sizeof(VkBool32));
-    vkStream->read((VkBool32*)&forUnmarshaling->rayTracingPipelineTraceRaysIndirect, sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->rayTracingPipelineShaderGroupHandleCaptureReplay,
+                   sizeof(VkBool32));
+    vkStream->read(
+        (VkBool32*)&forUnmarshaling->rayTracingPipelineShaderGroupHandleCaptureReplayMixed,
+        sizeof(VkBool32));
+    vkStream->read((VkBool32*)&forUnmarshaling->rayTracingPipelineTraceRaysIndirect,
+                   sizeof(VkBool32));
     vkStream->read((VkBool32*)&forUnmarshaling->rayTraversalPrimitiveCulling, sizeof(VkBool32));
 }
 
 void marshal_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceRayTracingPipelinePropertiesKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceRayTracingPipelinePropertiesKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -35502,32 +33352,31 @@
     vkStream->write((uint32_t*)&forMarshaling->maxRayRecursionDepth, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxShaderGroupStride, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->shaderGroupBaseAlignment, sizeof(uint32_t));
-    vkStream->write((uint32_t*)&forMarshaling->shaderGroupHandleCaptureReplaySize, sizeof(uint32_t));
+    vkStream->write((uint32_t*)&forMarshaling->shaderGroupHandleCaptureReplaySize,
+                    sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxRayDispatchInvocationCount, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->shaderGroupHandleAlignment, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->maxRayHitAttributeSize, sizeof(uint32_t));
 }
 
 void unmarshal_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceRayTracingPipelinePropertiesKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceRayTracingPipelinePropertiesKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -35535,50 +33384,39 @@
     vkStream->read((uint32_t*)&forUnmarshaling->maxRayRecursionDepth, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxShaderGroupStride, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->shaderGroupBaseAlignment, sizeof(uint32_t));
-    vkStream->read((uint32_t*)&forUnmarshaling->shaderGroupHandleCaptureReplaySize, sizeof(uint32_t));
+    vkStream->read((uint32_t*)&forUnmarshaling->shaderGroupHandleCaptureReplaySize,
+                   sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxRayDispatchInvocationCount, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->shaderGroupHandleAlignment, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->maxRayHitAttributeSize, sizeof(uint32_t));
 }
 
-void marshal_VkStridedDeviceAddressRegionKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkStridedDeviceAddressRegionKHR* forMarshaling)
-{
+void marshal_VkStridedDeviceAddressRegionKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkStridedDeviceAddressRegionKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkDeviceAddress*)&forMarshaling->deviceAddress, sizeof(VkDeviceAddress));
     vkStream->write((VkDeviceSize*)&forMarshaling->stride, sizeof(VkDeviceSize));
     vkStream->write((VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
 }
 
-void unmarshal_VkStridedDeviceAddressRegionKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkStridedDeviceAddressRegionKHR* forUnmarshaling)
-{
+void unmarshal_VkStridedDeviceAddressRegionKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkStridedDeviceAddressRegionKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkDeviceAddress*)&forUnmarshaling->deviceAddress, sizeof(VkDeviceAddress));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->stride, sizeof(VkDeviceSize));
     vkStream->read((VkDeviceSize*)&forUnmarshaling->size, sizeof(VkDeviceSize));
 }
 
-void marshal_VkTraceRaysIndirectCommandKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkTraceRaysIndirectCommandKHR* forMarshaling)
-{
+void marshal_VkTraceRaysIndirectCommandKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkTraceRaysIndirectCommandKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((uint32_t*)&forMarshaling->width, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->height, sizeof(uint32_t));
     vkStream->write((uint32_t*)&forMarshaling->depth, sizeof(uint32_t));
 }
 
-void unmarshal_VkTraceRaysIndirectCommandKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkTraceRaysIndirectCommandKHR* forUnmarshaling)
-{
+void unmarshal_VkTraceRaysIndirectCommandKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkTraceRaysIndirectCommandKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((uint32_t*)&forUnmarshaling->width, sizeof(uint32_t));
     vkStream->read((uint32_t*)&forUnmarshaling->height, sizeof(uint32_t));
@@ -35588,14 +33426,11 @@
 #endif
 #ifdef VK_KHR_ray_query
 void marshal_VkPhysicalDeviceRayQueryFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceRayQueryFeaturesKHR* forMarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    const VkPhysicalDeviceRayQueryFeaturesKHR* forMarshaling) {
     (void)rootType;
     vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forMarshaling->sType;
     }
     marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
@@ -35603,25 +33438,23 @@
 }
 
 void unmarshal_VkPhysicalDeviceRayQueryFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceRayQueryFeaturesKHR* forUnmarshaling)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceRayQueryFeaturesKHR* forUnmarshaling) {
     (void)rootType;
     vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     size_t pNext_size;
     pNext_size = vkStream->getBe32();
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         vkStream->read((void*)forUnmarshaling->pNext, sizeof(VkStructureType));
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
         unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
     }
@@ -35629,1557 +33462,1924 @@
 }
 
 #endif
-void marshal_extension_struct(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const void* structExtension)
-{
+void marshal_extension_struct(VulkanStream* vkStream, VkStructureType rootType,
+                              const void* structExtension) {
     VkInstanceCreateInfo* structAccess = (VkInstanceCreateInfo*)(structExtension);
-    size_t currExtSize = goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, structExtension);
-    if (!currExtSize && structExtension)
-    {
+    size_t currExtSize = goldfish_vk_extension_struct_size_with_stream_features(
+        vkStream->getFeatureBits(), rootType, structExtension);
+    if (!currExtSize && structExtension) {
         // unknown struct extension; skip and call on its pNext field
         marshal_extension_struct(vkStream, rootType, (void*)structAccess->pNext);
         return;
-    }
-    else
-    {
+    } else {
         // known or null extension struct
         vkStream->putBe32(currExtSize);
-        if (!currExtSize)
-        {
+        if (!currExtSize) {
             // exit if this was a null extension struct (size == 0 in this branch)
             return;
         }
     }
     vkStream->write(structExtension, sizeof(VkStructureType));
-    if (!structExtension)
-    {
+    if (!structExtension) {
         return;
     }
     uint32_t structType = (uint32_t)goldfish_vk_struct_type(structExtension);
-    switch(structType)
-    {
+    switch (structType) {
 #ifdef VK_VERSION_1_1
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES:
-        {
-            marshal_VkPhysicalDeviceSubgroupProperties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceSubgroupProperties*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES: {
+            marshal_VkPhysicalDeviceSubgroupProperties(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceSubgroupProperties*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES:
-        {
-            marshal_VkPhysicalDevice16BitStorageFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDevice16BitStorageFeatures*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES: {
+            marshal_VkPhysicalDevice16BitStorageFeatures(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDevice16BitStorageFeatures*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS:
-        {
-            marshal_VkMemoryDedicatedRequirements(vkStream, rootType, reinterpret_cast<const VkMemoryDedicatedRequirements*>(structExtension));
+        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS: {
+            marshal_VkMemoryDedicatedRequirements(
+                vkStream, rootType,
+                reinterpret_cast<const VkMemoryDedicatedRequirements*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO:
-        {
-            marshal_VkMemoryDedicatedAllocateInfo(vkStream, rootType, reinterpret_cast<const VkMemoryDedicatedAllocateInfo*>(structExtension));
+        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO: {
+            marshal_VkMemoryDedicatedAllocateInfo(
+                vkStream, rootType,
+                reinterpret_cast<const VkMemoryDedicatedAllocateInfo*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO:
-        {
-            marshal_VkMemoryAllocateFlagsInfo(vkStream, rootType, reinterpret_cast<const VkMemoryAllocateFlagsInfo*>(structExtension));
+        case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO: {
+            marshal_VkMemoryAllocateFlagsInfo(
+                vkStream, rootType,
+                reinterpret_cast<const VkMemoryAllocateFlagsInfo*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO:
-        {
-            marshal_VkDeviceGroupRenderPassBeginInfo(vkStream, rootType, reinterpret_cast<const VkDeviceGroupRenderPassBeginInfo*>(structExtension));
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO: {
+            marshal_VkDeviceGroupRenderPassBeginInfo(
+                vkStream, rootType,
+                reinterpret_cast<const VkDeviceGroupRenderPassBeginInfo*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO:
-        {
-            marshal_VkDeviceGroupCommandBufferBeginInfo(vkStream, rootType, reinterpret_cast<const VkDeviceGroupCommandBufferBeginInfo*>(structExtension));
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO: {
+            marshal_VkDeviceGroupCommandBufferBeginInfo(
+                vkStream, rootType,
+                reinterpret_cast<const VkDeviceGroupCommandBufferBeginInfo*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO:
-        {
-            marshal_VkDeviceGroupSubmitInfo(vkStream, rootType, reinterpret_cast<const VkDeviceGroupSubmitInfo*>(structExtension));
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO: {
+            marshal_VkDeviceGroupSubmitInfo(
+                vkStream, rootType,
+                reinterpret_cast<const VkDeviceGroupSubmitInfo*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO:
-        {
-            marshal_VkDeviceGroupBindSparseInfo(vkStream, rootType, reinterpret_cast<const VkDeviceGroupBindSparseInfo*>(structExtension));
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO: {
+            marshal_VkDeviceGroupBindSparseInfo(
+                vkStream, rootType,
+                reinterpret_cast<const VkDeviceGroupBindSparseInfo*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO:
-        {
-            marshal_VkBindBufferMemoryDeviceGroupInfo(vkStream, rootType, reinterpret_cast<const VkBindBufferMemoryDeviceGroupInfo*>(structExtension));
+        case VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO: {
+            marshal_VkBindBufferMemoryDeviceGroupInfo(
+                vkStream, rootType,
+                reinterpret_cast<const VkBindBufferMemoryDeviceGroupInfo*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO:
-        {
-            marshal_VkBindImageMemoryDeviceGroupInfo(vkStream, rootType, reinterpret_cast<const VkBindImageMemoryDeviceGroupInfo*>(structExtension));
+        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO: {
+            marshal_VkBindImageMemoryDeviceGroupInfo(
+                vkStream, rootType,
+                reinterpret_cast<const VkBindImageMemoryDeviceGroupInfo*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO:
-        {
-            marshal_VkDeviceGroupDeviceCreateInfo(vkStream, rootType, reinterpret_cast<const VkDeviceGroupDeviceCreateInfo*>(structExtension));
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO: {
+            marshal_VkDeviceGroupDeviceCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<const VkDeviceGroupDeviceCreateInfo*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2:
-        {
-            marshal_VkPhysicalDeviceFeatures2(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceFeatures2*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2: {
+            marshal_VkPhysicalDeviceFeatures2(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceFeatures2*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES:
-        {
-            marshal_VkPhysicalDevicePointClippingProperties(vkStream, rootType, reinterpret_cast<const VkPhysicalDevicePointClippingProperties*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES: {
+            marshal_VkPhysicalDevicePointClippingProperties(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDevicePointClippingProperties*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO:
-        {
-            marshal_VkRenderPassInputAttachmentAspectCreateInfo(vkStream, rootType, reinterpret_cast<const VkRenderPassInputAttachmentAspectCreateInfo*>(structExtension));
+        case VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO: {
+            marshal_VkRenderPassInputAttachmentAspectCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<const VkRenderPassInputAttachmentAspectCreateInfo*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO:
-        {
-            marshal_VkImageViewUsageCreateInfo(vkStream, rootType, reinterpret_cast<const VkImageViewUsageCreateInfo*>(structExtension));
+        case VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO: {
+            marshal_VkImageViewUsageCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<const VkImageViewUsageCreateInfo*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO:
-        {
-            marshal_VkPipelineTessellationDomainOriginStateCreateInfo(vkStream, rootType, reinterpret_cast<const VkPipelineTessellationDomainOriginStateCreateInfo*>(structExtension));
+        case VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO: {
+            marshal_VkPipelineTessellationDomainOriginStateCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<const VkPipelineTessellationDomainOriginStateCreateInfo*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO:
-        {
-            marshal_VkRenderPassMultiviewCreateInfo(vkStream, rootType, reinterpret_cast<const VkRenderPassMultiviewCreateInfo*>(structExtension));
+        case VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO: {
+            marshal_VkRenderPassMultiviewCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<const VkRenderPassMultiviewCreateInfo*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES:
-        {
-            marshal_VkPhysicalDeviceMultiviewFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceMultiviewFeatures*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES: {
+            marshal_VkPhysicalDeviceMultiviewFeatures(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceMultiviewFeatures*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES:
-        {
-            marshal_VkPhysicalDeviceMultiviewProperties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceMultiviewProperties*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES: {
+            marshal_VkPhysicalDeviceMultiviewProperties(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceMultiviewProperties*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES:
-        {
-            marshal_VkPhysicalDeviceVariablePointersFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceVariablePointersFeatures*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES: {
+            marshal_VkPhysicalDeviceVariablePointersFeatures(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceVariablePointersFeatures*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES:
-        {
-            marshal_VkPhysicalDeviceProtectedMemoryFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceProtectedMemoryFeatures*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES: {
+            marshal_VkPhysicalDeviceProtectedMemoryFeatures(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceProtectedMemoryFeatures*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES:
-        {
-            marshal_VkPhysicalDeviceProtectedMemoryProperties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceProtectedMemoryProperties*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES: {
+            marshal_VkPhysicalDeviceProtectedMemoryProperties(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceProtectedMemoryProperties*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO:
-        {
-            marshal_VkProtectedSubmitInfo(vkStream, rootType, reinterpret_cast<const VkProtectedSubmitInfo*>(structExtension));
+        case VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO: {
+            marshal_VkProtectedSubmitInfo(
+                vkStream, rootType,
+                reinterpret_cast<const VkProtectedSubmitInfo*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO:
-        {
-            marshal_VkSamplerYcbcrConversionInfo(vkStream, rootType, reinterpret_cast<const VkSamplerYcbcrConversionInfo*>(structExtension));
+        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO: {
+            marshal_VkSamplerYcbcrConversionInfo(
+                vkStream, rootType,
+                reinterpret_cast<const VkSamplerYcbcrConversionInfo*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO:
-        {
-            marshal_VkBindImagePlaneMemoryInfo(vkStream, rootType, reinterpret_cast<const VkBindImagePlaneMemoryInfo*>(structExtension));
+        case VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO: {
+            marshal_VkBindImagePlaneMemoryInfo(
+                vkStream, rootType,
+                reinterpret_cast<const VkBindImagePlaneMemoryInfo*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO:
-        {
-            marshal_VkImagePlaneMemoryRequirementsInfo(vkStream, rootType, reinterpret_cast<const VkImagePlaneMemoryRequirementsInfo*>(structExtension));
+        case VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO: {
+            marshal_VkImagePlaneMemoryRequirementsInfo(
+                vkStream, rootType,
+                reinterpret_cast<const VkImagePlaneMemoryRequirementsInfo*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES:
-        {
-            marshal_VkPhysicalDeviceSamplerYcbcrConversionFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES: {
+            marshal_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES:
-        {
-            marshal_VkSamplerYcbcrConversionImageFormatProperties(vkStream, rootType, reinterpret_cast<const VkSamplerYcbcrConversionImageFormatProperties*>(structExtension));
+        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES: {
+            marshal_VkSamplerYcbcrConversionImageFormatProperties(
+                vkStream, rootType,
+                reinterpret_cast<const VkSamplerYcbcrConversionImageFormatProperties*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO:
-        {
-            marshal_VkPhysicalDeviceExternalImageFormatInfo(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceExternalImageFormatInfo*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO: {
+            marshal_VkPhysicalDeviceExternalImageFormatInfo(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceExternalImageFormatInfo*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES:
-        {
-            marshal_VkExternalImageFormatProperties(vkStream, rootType, reinterpret_cast<const VkExternalImageFormatProperties*>(structExtension));
+        case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES: {
+            marshal_VkExternalImageFormatProperties(
+                vkStream, rootType,
+                reinterpret_cast<const VkExternalImageFormatProperties*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES:
-        {
-            marshal_VkPhysicalDeviceIDProperties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceIDProperties*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES: {
+            marshal_VkPhysicalDeviceIDProperties(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceIDProperties*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO:
-        {
-            marshal_VkExternalMemoryImageCreateInfo(vkStream, rootType, reinterpret_cast<const VkExternalMemoryImageCreateInfo*>(structExtension));
+        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO: {
+            marshal_VkExternalMemoryImageCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<const VkExternalMemoryImageCreateInfo*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO:
-        {
-            marshal_VkExternalMemoryBufferCreateInfo(vkStream, rootType, reinterpret_cast<const VkExternalMemoryBufferCreateInfo*>(structExtension));
+        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO: {
+            marshal_VkExternalMemoryBufferCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<const VkExternalMemoryBufferCreateInfo*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO:
-        {
-            marshal_VkExportMemoryAllocateInfo(vkStream, rootType, reinterpret_cast<const VkExportMemoryAllocateInfo*>(structExtension));
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO: {
+            marshal_VkExportMemoryAllocateInfo(
+                vkStream, rootType,
+                reinterpret_cast<const VkExportMemoryAllocateInfo*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO:
-        {
-            marshal_VkExportFenceCreateInfo(vkStream, rootType, reinterpret_cast<const VkExportFenceCreateInfo*>(structExtension));
+        case VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO: {
+            marshal_VkExportFenceCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<const VkExportFenceCreateInfo*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO:
-        {
-            marshal_VkExportSemaphoreCreateInfo(vkStream, rootType, reinterpret_cast<const VkExportSemaphoreCreateInfo*>(structExtension));
+        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO: {
+            marshal_VkExportSemaphoreCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<const VkExportSemaphoreCreateInfo*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES:
-        {
-            marshal_VkPhysicalDeviceMaintenance3Properties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceMaintenance3Properties*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES: {
+            marshal_VkPhysicalDeviceMaintenance3Properties(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceMaintenance3Properties*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES:
-        {
-            marshal_VkPhysicalDeviceShaderDrawParametersFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderDrawParametersFeatures*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES: {
+            marshal_VkPhysicalDeviceShaderDrawParametersFeatures(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShaderDrawParametersFeatures*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_VERSION_1_2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES:
-        {
-            marshal_VkPhysicalDeviceVulkan11Features(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceVulkan11Features*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: {
+            marshal_VkPhysicalDeviceVulkan11Features(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceVulkan11Features*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES:
-        {
-            marshal_VkPhysicalDeviceVulkan11Properties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceVulkan11Properties*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: {
+            marshal_VkPhysicalDeviceVulkan11Properties(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceVulkan11Properties*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES:
-        {
-            marshal_VkPhysicalDeviceVulkan12Features(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceVulkan12Features*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: {
+            marshal_VkPhysicalDeviceVulkan12Features(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceVulkan12Features*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES:
-        {
-            marshal_VkPhysicalDeviceVulkan12Properties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceVulkan12Properties*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: {
+            marshal_VkPhysicalDeviceVulkan12Properties(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceVulkan12Properties*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO:
-        {
-            marshal_VkImageFormatListCreateInfo(vkStream, rootType, reinterpret_cast<const VkImageFormatListCreateInfo*>(structExtension));
+        case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO: {
+            marshal_VkImageFormatListCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<const VkImageFormatListCreateInfo*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES:
-        {
-            marshal_VkPhysicalDevice8BitStorageFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDevice8BitStorageFeatures*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES: {
+            marshal_VkPhysicalDevice8BitStorageFeatures(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDevice8BitStorageFeatures*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES:
-        {
-            marshal_VkPhysicalDeviceDriverProperties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceDriverProperties*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES: {
+            marshal_VkPhysicalDeviceDriverProperties(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceDriverProperties*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES:
-        {
-            marshal_VkPhysicalDeviceShaderAtomicInt64Features(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderAtomicInt64Features*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES: {
+            marshal_VkPhysicalDeviceShaderAtomicInt64Features(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShaderAtomicInt64Features*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES:
-        {
-            marshal_VkPhysicalDeviceShaderFloat16Int8Features(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderFloat16Int8Features*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES: {
+            marshal_VkPhysicalDeviceShaderFloat16Int8Features(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShaderFloat16Int8Features*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES:
-        {
-            marshal_VkPhysicalDeviceFloatControlsProperties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceFloatControlsProperties*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES: {
+            marshal_VkPhysicalDeviceFloatControlsProperties(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceFloatControlsProperties*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO:
-        {
-            marshal_VkDescriptorSetLayoutBindingFlagsCreateInfo(vkStream, rootType, reinterpret_cast<const VkDescriptorSetLayoutBindingFlagsCreateInfo*>(structExtension));
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO: {
+            marshal_VkDescriptorSetLayoutBindingFlagsCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<const VkDescriptorSetLayoutBindingFlagsCreateInfo*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES:
-        {
-            marshal_VkPhysicalDeviceDescriptorIndexingFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingFeatures*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES: {
+            marshal_VkPhysicalDeviceDescriptorIndexingFeatures(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingFeatures*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES:
-        {
-            marshal_VkPhysicalDeviceDescriptorIndexingProperties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingProperties*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES: {
+            marshal_VkPhysicalDeviceDescriptorIndexingProperties(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingProperties*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO:
-        {
-            marshal_VkDescriptorSetVariableDescriptorCountAllocateInfo(vkStream, rootType, reinterpret_cast<const VkDescriptorSetVariableDescriptorCountAllocateInfo*>(structExtension));
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO: {
+            marshal_VkDescriptorSetVariableDescriptorCountAllocateInfo(
+                vkStream, rootType,
+                reinterpret_cast<const VkDescriptorSetVariableDescriptorCountAllocateInfo*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT:
-        {
-            marshal_VkDescriptorSetVariableDescriptorCountLayoutSupport(vkStream, rootType, reinterpret_cast<const VkDescriptorSetVariableDescriptorCountLayoutSupport*>(structExtension));
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT: {
+            marshal_VkDescriptorSetVariableDescriptorCountLayoutSupport(
+                vkStream, rootType,
+                reinterpret_cast<const VkDescriptorSetVariableDescriptorCountLayoutSupport*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE:
-        {
-            marshal_VkSubpassDescriptionDepthStencilResolve(vkStream, rootType, reinterpret_cast<const VkSubpassDescriptionDepthStencilResolve*>(structExtension));
+        case VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE: {
+            marshal_VkSubpassDescriptionDepthStencilResolve(
+                vkStream, rootType,
+                reinterpret_cast<const VkSubpassDescriptionDepthStencilResolve*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES:
-        {
-            marshal_VkPhysicalDeviceDepthStencilResolveProperties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceDepthStencilResolveProperties*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES: {
+            marshal_VkPhysicalDeviceDepthStencilResolveProperties(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceDepthStencilResolveProperties*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES:
-        {
-            marshal_VkPhysicalDeviceScalarBlockLayoutFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceScalarBlockLayoutFeatures*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES: {
+            marshal_VkPhysicalDeviceScalarBlockLayoutFeatures(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceScalarBlockLayoutFeatures*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO:
-        {
-            marshal_VkImageStencilUsageCreateInfo(vkStream, rootType, reinterpret_cast<const VkImageStencilUsageCreateInfo*>(structExtension));
+        case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO: {
+            marshal_VkImageStencilUsageCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<const VkImageStencilUsageCreateInfo*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO:
-        {
-            marshal_VkSamplerReductionModeCreateInfo(vkStream, rootType, reinterpret_cast<const VkSamplerReductionModeCreateInfo*>(structExtension));
+        case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO: {
+            marshal_VkSamplerReductionModeCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<const VkSamplerReductionModeCreateInfo*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES:
-        {
-            marshal_VkPhysicalDeviceSamplerFilterMinmaxProperties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceSamplerFilterMinmaxProperties*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES: {
+            marshal_VkPhysicalDeviceSamplerFilterMinmaxProperties(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceSamplerFilterMinmaxProperties*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES:
-        {
-            marshal_VkPhysicalDeviceVulkanMemoryModelFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceVulkanMemoryModelFeatures*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES: {
+            marshal_VkPhysicalDeviceVulkanMemoryModelFeatures(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceVulkanMemoryModelFeatures*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES:
-        {
-            marshal_VkPhysicalDeviceImagelessFramebufferFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceImagelessFramebufferFeatures*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES: {
+            marshal_VkPhysicalDeviceImagelessFramebufferFeatures(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceImagelessFramebufferFeatures*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO:
-        {
-            marshal_VkFramebufferAttachmentsCreateInfo(vkStream, rootType, reinterpret_cast<const VkFramebufferAttachmentsCreateInfo*>(structExtension));
+        case VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO: {
+            marshal_VkFramebufferAttachmentsCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<const VkFramebufferAttachmentsCreateInfo*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO:
-        {
-            marshal_VkRenderPassAttachmentBeginInfo(vkStream, rootType, reinterpret_cast<const VkRenderPassAttachmentBeginInfo*>(structExtension));
+        case VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO: {
+            marshal_VkRenderPassAttachmentBeginInfo(
+                vkStream, rootType,
+                reinterpret_cast<const VkRenderPassAttachmentBeginInfo*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES:
-        {
-            marshal_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceUniformBufferStandardLayoutFeatures*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES: {
+            marshal_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceUniformBufferStandardLayoutFeatures*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES:
-        {
-            marshal_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES: {
+            marshal_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES:
-        {
-            marshal_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES: {
+            marshal_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT:
-        {
-            marshal_VkAttachmentReferenceStencilLayout(vkStream, rootType, reinterpret_cast<const VkAttachmentReferenceStencilLayout*>(structExtension));
+        case VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT: {
+            marshal_VkAttachmentReferenceStencilLayout(
+                vkStream, rootType,
+                reinterpret_cast<const VkAttachmentReferenceStencilLayout*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT:
-        {
-            marshal_VkAttachmentDescriptionStencilLayout(vkStream, rootType, reinterpret_cast<const VkAttachmentDescriptionStencilLayout*>(structExtension));
+        case VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT: {
+            marshal_VkAttachmentDescriptionStencilLayout(
+                vkStream, rootType,
+                reinterpret_cast<const VkAttachmentDescriptionStencilLayout*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES:
-        {
-            marshal_VkPhysicalDeviceHostQueryResetFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceHostQueryResetFeatures*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES: {
+            marshal_VkPhysicalDeviceHostQueryResetFeatures(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceHostQueryResetFeatures*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES:
-        {
-            marshal_VkPhysicalDeviceTimelineSemaphoreFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceTimelineSemaphoreFeatures*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES: {
+            marshal_VkPhysicalDeviceTimelineSemaphoreFeatures(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceTimelineSemaphoreFeatures*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES:
-        {
-            marshal_VkPhysicalDeviceTimelineSemaphoreProperties(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceTimelineSemaphoreProperties*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES: {
+            marshal_VkPhysicalDeviceTimelineSemaphoreProperties(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceTimelineSemaphoreProperties*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO:
-        {
-            marshal_VkSemaphoreTypeCreateInfo(vkStream, rootType, reinterpret_cast<const VkSemaphoreTypeCreateInfo*>(structExtension));
+        case VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO: {
+            marshal_VkSemaphoreTypeCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<const VkSemaphoreTypeCreateInfo*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO:
-        {
-            marshal_VkTimelineSemaphoreSubmitInfo(vkStream, rootType, reinterpret_cast<const VkTimelineSemaphoreSubmitInfo*>(structExtension));
+        case VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO: {
+            marshal_VkTimelineSemaphoreSubmitInfo(
+                vkStream, rootType,
+                reinterpret_cast<const VkTimelineSemaphoreSubmitInfo*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES:
-        {
-            marshal_VkPhysicalDeviceBufferDeviceAddressFeatures(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceBufferDeviceAddressFeatures*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES: {
+            marshal_VkPhysicalDeviceBufferDeviceAddressFeatures(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceBufferDeviceAddressFeatures*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO:
-        {
-            marshal_VkBufferOpaqueCaptureAddressCreateInfo(vkStream, rootType, reinterpret_cast<const VkBufferOpaqueCaptureAddressCreateInfo*>(structExtension));
+        case VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO: {
+            marshal_VkBufferOpaqueCaptureAddressCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<const VkBufferOpaqueCaptureAddressCreateInfo*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO:
-        {
-            marshal_VkMemoryOpaqueCaptureAddressAllocateInfo(vkStream, rootType, reinterpret_cast<const VkMemoryOpaqueCaptureAddressAllocateInfo*>(structExtension));
+        case VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO: {
+            marshal_VkMemoryOpaqueCaptureAddressAllocateInfo(
+                vkStream, rootType,
+                reinterpret_cast<const VkMemoryOpaqueCaptureAddressAllocateInfo*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_KHR_swapchain
-        case VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR:
-        {
-            marshal_VkImageSwapchainCreateInfoKHR(vkStream, rootType, reinterpret_cast<const VkImageSwapchainCreateInfoKHR*>(structExtension));
+        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));
+        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));
+        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));
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR: {
+            marshal_VkDeviceGroupSwapchainCreateInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkDeviceGroupSwapchainCreateInfoKHR*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_KHR_display_swapchain
-        case VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR:
-        {
-            marshal_VkDisplayPresentInfoKHR(vkStream, rootType, reinterpret_cast<const VkDisplayPresentInfoKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR: {
+            marshal_VkDisplayPresentInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkDisplayPresentInfoKHR*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_KHR_video_queue
-        case VK_STRUCTURE_TYPE_VIDEO_QUEUE_FAMILY_PROPERTIES_2_KHR:
-        {
-            marshal_VkVideoQueueFamilyProperties2KHR(vkStream, rootType, reinterpret_cast<const VkVideoQueueFamilyProperties2KHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_VIDEO_QUEUE_FAMILY_PROPERTIES_2_KHR: {
+            marshal_VkVideoQueueFamilyProperties2KHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkVideoQueueFamilyProperties2KHR*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_PROFILE_KHR:
-        {
-            marshal_VkVideoProfileKHR(vkStream, rootType, reinterpret_cast<const VkVideoProfileKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_VIDEO_PROFILE_KHR: {
+            marshal_VkVideoProfileKHR(vkStream, rootType,
+                                      reinterpret_cast<const VkVideoProfileKHR*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_PROFILES_KHR:
-        {
-            marshal_VkVideoProfilesKHR(vkStream, rootType, reinterpret_cast<const VkVideoProfilesKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_VIDEO_PROFILES_KHR: {
+            marshal_VkVideoProfilesKHR(
+                vkStream, rootType, reinterpret_cast<const VkVideoProfilesKHR*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_KHR_dynamic_rendering
-        case VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR:
-        {
-            marshal_VkPipelineRenderingCreateInfoKHR(vkStream, rootType, reinterpret_cast<const VkPipelineRenderingCreateInfoKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR: {
+            marshal_VkPipelineRenderingCreateInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkPipelineRenderingCreateInfoKHR*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES_KHR:
-        {
-            marshal_VkPhysicalDeviceDynamicRenderingFeaturesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceDynamicRenderingFeaturesKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES_KHR: {
+            marshal_VkPhysicalDeviceDynamicRenderingFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceDynamicRenderingFeaturesKHR*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR:
-        {
-            marshal_VkCommandBufferInheritanceRenderingInfoKHR(vkStream, rootType, reinterpret_cast<const VkCommandBufferInheritanceRenderingInfoKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR: {
+            marshal_VkCommandBufferInheritanceRenderingInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkCommandBufferInheritanceRenderingInfoKHR*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR:
-        {
-            marshal_VkRenderingFragmentShadingRateAttachmentInfoKHR(vkStream, rootType, reinterpret_cast<const VkRenderingFragmentShadingRateAttachmentInfoKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR: {
+            marshal_VkRenderingFragmentShadingRateAttachmentInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkRenderingFragmentShadingRateAttachmentInfoKHR*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_INFO_EXT:
-        {
-            marshal_VkRenderingFragmentDensityMapAttachmentInfoEXT(vkStream, rootType, reinterpret_cast<const VkRenderingFragmentDensityMapAttachmentInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_INFO_EXT: {
+            marshal_VkRenderingFragmentDensityMapAttachmentInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkRenderingFragmentDensityMapAttachmentInfoEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_ATTACHMENT_SAMPLE_COUNT_INFO_AMD:
-        {
-            marshal_VkAttachmentSampleCountInfoAMD(vkStream, rootType, reinterpret_cast<const VkAttachmentSampleCountInfoAMD*>(structExtension));
+        case VK_STRUCTURE_TYPE_ATTACHMENT_SAMPLE_COUNT_INFO_AMD: {
+            marshal_VkAttachmentSampleCountInfoAMD(
+                vkStream, rootType,
+                reinterpret_cast<const VkAttachmentSampleCountInfoAMD*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_MULTIVIEW_PER_VIEW_ATTRIBUTES_INFO_NVX:
-        {
-            marshal_VkMultiviewPerViewAttributesInfoNVX(vkStream, rootType, reinterpret_cast<const VkMultiviewPerViewAttributesInfoNVX*>(structExtension));
+        case VK_STRUCTURE_TYPE_MULTIVIEW_PER_VIEW_ATTRIBUTES_INFO_NVX: {
+            marshal_VkMultiviewPerViewAttributesInfoNVX(
+                vkStream, rootType,
+                reinterpret_cast<const VkMultiviewPerViewAttributesInfoNVX*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_KHR_external_memory_win32
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
-        {
-            marshal_VkImportMemoryWin32HandleInfoKHR(vkStream, rootType, reinterpret_cast<const VkImportMemoryWin32HandleInfoKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR: {
+            marshal_VkImportMemoryWin32HandleInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkImportMemoryWin32HandleInfoKHR*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
-        {
-            marshal_VkExportMemoryWin32HandleInfoKHR(vkStream, rootType, reinterpret_cast<const VkExportMemoryWin32HandleInfoKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR: {
+            marshal_VkExportMemoryWin32HandleInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkExportMemoryWin32HandleInfoKHR*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_KHR_external_memory_fd
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR:
-        {
-            marshal_VkImportMemoryFdInfoKHR(vkStream, rootType, reinterpret_cast<const VkImportMemoryFdInfoKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR: {
+            marshal_VkImportMemoryFdInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkImportMemoryFdInfoKHR*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_KHR_win32_keyed_mutex
-        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR:
-        {
-            marshal_VkWin32KeyedMutexAcquireReleaseInfoKHR(vkStream, rootType, reinterpret_cast<const VkWin32KeyedMutexAcquireReleaseInfoKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR: {
+            marshal_VkWin32KeyedMutexAcquireReleaseInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkWin32KeyedMutexAcquireReleaseInfoKHR*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_KHR_external_semaphore_win32
-        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR:
-        {
-            marshal_VkExportSemaphoreWin32HandleInfoKHR(vkStream, rootType, reinterpret_cast<const VkExportSemaphoreWin32HandleInfoKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR: {
+            marshal_VkExportSemaphoreWin32HandleInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkExportSemaphoreWin32HandleInfoKHR*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR:
-        {
-            marshal_VkD3D12FenceSubmitInfoKHR(vkStream, rootType, reinterpret_cast<const VkD3D12FenceSubmitInfoKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR: {
+            marshal_VkD3D12FenceSubmitInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkD3D12FenceSubmitInfoKHR*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_KHR_push_descriptor
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR:
-        {
-            marshal_VkPhysicalDevicePushDescriptorPropertiesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDevicePushDescriptorPropertiesKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR: {
+            marshal_VkPhysicalDevicePushDescriptorPropertiesKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDevicePushDescriptorPropertiesKHR*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_KHR_incremental_present
-        case VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR:
-        {
-            marshal_VkPresentRegionsKHR(vkStream, rootType, reinterpret_cast<const VkPresentRegionsKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR: {
+            marshal_VkPresentRegionsKHR(
+                vkStream, rootType, reinterpret_cast<const VkPresentRegionsKHR*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_KHR_shared_presentable_image
-        case VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR:
-        {
-            marshal_VkSharedPresentSurfaceCapabilitiesKHR(vkStream, rootType, reinterpret_cast<const VkSharedPresentSurfaceCapabilitiesKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR: {
+            marshal_VkSharedPresentSurfaceCapabilitiesKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkSharedPresentSurfaceCapabilitiesKHR*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_KHR_external_fence_win32
-        case VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR:
-        {
-            marshal_VkExportFenceWin32HandleInfoKHR(vkStream, rootType, reinterpret_cast<const VkExportFenceWin32HandleInfoKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR: {
+            marshal_VkExportFenceWin32HandleInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkExportFenceWin32HandleInfoKHR*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_KHR_performance_query
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR:
-        {
-            marshal_VkPhysicalDevicePerformanceQueryFeaturesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDevicePerformanceQueryFeaturesKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR: {
+            marshal_VkPhysicalDevicePerformanceQueryFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDevicePerformanceQueryFeaturesKHR*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR:
-        {
-            marshal_VkPhysicalDevicePerformanceQueryPropertiesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDevicePerformanceQueryPropertiesKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR: {
+            marshal_VkPhysicalDevicePerformanceQueryPropertiesKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDevicePerformanceQueryPropertiesKHR*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR:
-        {
-            marshal_VkQueryPoolPerformanceCreateInfoKHR(vkStream, rootType, reinterpret_cast<const VkQueryPoolPerformanceCreateInfoKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR: {
+            marshal_VkQueryPoolPerformanceCreateInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkQueryPoolPerformanceCreateInfoKHR*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR:
-        {
-            marshal_VkPerformanceQuerySubmitInfoKHR(vkStream, rootType, reinterpret_cast<const VkPerformanceQuerySubmitInfoKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR: {
+            marshal_VkPerformanceQuerySubmitInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkPerformanceQuerySubmitInfoKHR*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_KHR_portability_subset
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR:
-        {
-            marshal_VkPhysicalDevicePortabilitySubsetFeaturesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDevicePortabilitySubsetFeaturesKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR: {
+            marshal_VkPhysicalDevicePortabilitySubsetFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDevicePortabilitySubsetFeaturesKHR*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR:
-        {
-            marshal_VkPhysicalDevicePortabilitySubsetPropertiesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDevicePortabilitySubsetPropertiesKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR: {
+            marshal_VkPhysicalDevicePortabilitySubsetPropertiesKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDevicePortabilitySubsetPropertiesKHR*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_KHR_shader_clock
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR:
-        {
-            marshal_VkPhysicalDeviceShaderClockFeaturesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderClockFeaturesKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR: {
+            marshal_VkPhysicalDeviceShaderClockFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShaderClockFeaturesKHR*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_KHR_shader_terminate_invocation
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR:
-        {
-            marshal_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR: {
+            marshal_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_KHR_fragment_shading_rate
-        case VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR:
-        {
-            marshal_VkFragmentShadingRateAttachmentInfoKHR(vkStream, rootType, reinterpret_cast<const VkFragmentShadingRateAttachmentInfoKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR: {
+            marshal_VkFragmentShadingRateAttachmentInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkFragmentShadingRateAttachmentInfoKHR*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR:
-        {
-            marshal_VkPipelineFragmentShadingRateStateCreateInfoKHR(vkStream, rootType, reinterpret_cast<const VkPipelineFragmentShadingRateStateCreateInfoKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR: {
+            marshal_VkPipelineFragmentShadingRateStateCreateInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkPipelineFragmentShadingRateStateCreateInfoKHR*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR:
-        {
-            marshal_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateFeaturesKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR: {
+            marshal_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateFeaturesKHR*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR:
-        {
-            marshal_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentShadingRatePropertiesKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR: {
+            marshal_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceFragmentShadingRatePropertiesKHR*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_KHR_surface_protected_capabilities
-        case VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR:
-        {
-            marshal_VkSurfaceProtectedCapabilitiesKHR(vkStream, rootType, reinterpret_cast<const VkSurfaceProtectedCapabilitiesKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR: {
+            marshal_VkSurfaceProtectedCapabilitiesKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkSurfaceProtectedCapabilitiesKHR*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_KHR_present_wait
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR:
-        {
-            marshal_VkPhysicalDevicePresentWaitFeaturesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDevicePresentWaitFeaturesKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR: {
+            marshal_VkPhysicalDevicePresentWaitFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDevicePresentWaitFeaturesKHR*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_KHR_pipeline_executable_properties
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR:
-        {
-            marshal_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR: {
+            marshal_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_KHR_shader_integer_dot_product
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR:
-        {
-            marshal_VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR: {
+            marshal_VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES_KHR:
-        {
-            marshal_VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES_KHR: {
+            marshal_VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_KHR_present_id
-        case VK_STRUCTURE_TYPE_PRESENT_ID_KHR:
-        {
-            marshal_VkPresentIdKHR(vkStream, rootType, reinterpret_cast<const VkPresentIdKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_PRESENT_ID_KHR: {
+            marshal_VkPresentIdKHR(vkStream, rootType,
+                                   reinterpret_cast<const VkPresentIdKHR*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR:
-        {
-            marshal_VkPhysicalDevicePresentIdFeaturesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDevicePresentIdFeaturesKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR: {
+            marshal_VkPhysicalDevicePresentIdFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDevicePresentIdFeaturesKHR*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_KHR_video_encode_queue
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_INFO_KHR:
-        {
-            marshal_VkVideoEncodeRateControlInfoKHR(vkStream, rootType, reinterpret_cast<const VkVideoEncodeRateControlInfoKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_INFO_KHR: {
+            marshal_VkVideoEncodeRateControlInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkVideoEncodeRateControlInfoKHR*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_KHR_synchronization2
-        case VK_STRUCTURE_TYPE_MEMORY_BARRIER_2_KHR:
-        {
-            marshal_VkMemoryBarrier2KHR(vkStream, rootType, reinterpret_cast<const VkMemoryBarrier2KHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_MEMORY_BARRIER_2_KHR: {
+            marshal_VkMemoryBarrier2KHR(
+                vkStream, rootType, reinterpret_cast<const VkMemoryBarrier2KHR*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR:
-        {
-            marshal_VkPhysicalDeviceSynchronization2FeaturesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceSynchronization2FeaturesKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR: {
+            marshal_VkPhysicalDeviceSynchronization2FeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceSynchronization2FeaturesKHR*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_2_NV:
-        {
-            marshal_VkQueueFamilyCheckpointProperties2NV(vkStream, rootType, reinterpret_cast<const VkQueueFamilyCheckpointProperties2NV*>(structExtension));
+        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_2_NV: {
+            marshal_VkQueueFamilyCheckpointProperties2NV(
+                vkStream, rootType,
+                reinterpret_cast<const VkQueueFamilyCheckpointProperties2NV*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_KHR_shader_subgroup_uniform_control_flow
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR:
-        {
-            marshal_VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR: {
+            marshal_VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<
+                    const VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_KHR_zero_initialize_workgroup_memory
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR:
-        {
-            marshal_VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR: {
+            marshal_VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_KHR_workgroup_memory_explicit_layout
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR:
-        {
-            marshal_VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR: {
+            marshal_VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_KHR_format_feature_flags2
-        case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR:
-        {
-            marshal_VkFormatProperties3KHR(vkStream, rootType, reinterpret_cast<const VkFormatProperties3KHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR: {
+            marshal_VkFormatProperties3KHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkFormatProperties3KHR*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_KHR_maintenance4
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES_KHR:
-        {
-            marshal_VkPhysicalDeviceMaintenance4FeaturesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceMaintenance4FeaturesKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES_KHR: {
+            marshal_VkPhysicalDeviceMaintenance4FeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceMaintenance4FeaturesKHR*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES_KHR:
-        {
-            marshal_VkPhysicalDeviceMaintenance4PropertiesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceMaintenance4PropertiesKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES_KHR: {
+            marshal_VkPhysicalDeviceMaintenance4PropertiesKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceMaintenance4PropertiesKHR*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_ANDROID_native_buffer
-        case VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID:
-        {
-            marshal_VkNativeBufferANDROID(vkStream, rootType, reinterpret_cast<const VkNativeBufferANDROID*>(structExtension));
+        case VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID: {
+            marshal_VkNativeBufferANDROID(
+                vkStream, rootType,
+                reinterpret_cast<const VkNativeBufferANDROID*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_debug_report
-        case VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT:
-        {
-            marshal_VkDebugReportCallbackCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkDebugReportCallbackCreateInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT: {
+            marshal_VkDebugReportCallbackCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkDebugReportCallbackCreateInfoEXT*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_AMD_rasterization_order
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD:
-        {
-            marshal_VkPipelineRasterizationStateRasterizationOrderAMD(vkStream, rootType, reinterpret_cast<const VkPipelineRasterizationStateRasterizationOrderAMD*>(structExtension));
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD: {
+            marshal_VkPipelineRasterizationStateRasterizationOrderAMD(
+                vkStream, rootType,
+                reinterpret_cast<const VkPipelineRasterizationStateRasterizationOrderAMD*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_NV_dedicated_allocation
-        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV:
-        {
-            marshal_VkDedicatedAllocationImageCreateInfoNV(vkStream, rootType, reinterpret_cast<const VkDedicatedAllocationImageCreateInfoNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV: {
+            marshal_VkDedicatedAllocationImageCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkDedicatedAllocationImageCreateInfoNV*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV:
-        {
-            marshal_VkDedicatedAllocationBufferCreateInfoNV(vkStream, rootType, reinterpret_cast<const VkDedicatedAllocationBufferCreateInfoNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV: {
+            marshal_VkDedicatedAllocationBufferCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkDedicatedAllocationBufferCreateInfoNV*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV:
-        {
-            marshal_VkDedicatedAllocationMemoryAllocateInfoNV(vkStream, rootType, reinterpret_cast<const VkDedicatedAllocationMemoryAllocateInfoNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV: {
+            marshal_VkDedicatedAllocationMemoryAllocateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkDedicatedAllocationMemoryAllocateInfoNV*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_transform_feedback
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDeviceTransformFeedbackFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceTransformFeedbackFeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT: {
+            marshal_VkPhysicalDeviceTransformFeedbackFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceTransformFeedbackFeaturesEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT:
-        {
-            marshal_VkPhysicalDeviceTransformFeedbackPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceTransformFeedbackPropertiesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT: {
+            marshal_VkPhysicalDeviceTransformFeedbackPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceTransformFeedbackPropertiesEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT:
-        {
-            marshal_VkPipelineRasterizationStateStreamCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkPipelineRasterizationStateStreamCreateInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT: {
+            marshal_VkPipelineRasterizationStateStreamCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPipelineRasterizationStateStreamCreateInfoEXT*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_video_encode_h264
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_EXT:
-        {
-            marshal_VkVideoEncodeH264CapabilitiesEXT(vkStream, rootType, reinterpret_cast<const VkVideoEncodeH264CapabilitiesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_EXT: {
+            marshal_VkVideoEncodeH264CapabilitiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkVideoEncodeH264CapabilitiesEXT*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_CREATE_INFO_EXT:
-        {
-            marshal_VkVideoEncodeH264SessionCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkVideoEncodeH264SessionCreateInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_CREATE_INFO_EXT: {
+            marshal_VkVideoEncodeH264SessionCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkVideoEncodeH264SessionCreateInfoEXT*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
-            marshal_VkVideoEncodeH264SessionParametersAddInfoEXT(vkStream, rootType, reinterpret_cast<const VkVideoEncodeH264SessionParametersAddInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT: {
+            marshal_VkVideoEncodeH264SessionParametersAddInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkVideoEncodeH264SessionParametersAddInfoEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
-            marshal_VkVideoEncodeH264SessionParametersCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkVideoEncodeH264SessionParametersCreateInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT: {
+            marshal_VkVideoEncodeH264SessionParametersCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkVideoEncodeH264SessionParametersCreateInfoEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_VCL_FRAME_INFO_EXT:
-        {
-            marshal_VkVideoEncodeH264VclFrameInfoEXT(vkStream, rootType, reinterpret_cast<const VkVideoEncodeH264VclFrameInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_VCL_FRAME_INFO_EXT: {
+            marshal_VkVideoEncodeH264VclFrameInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkVideoEncodeH264VclFrameInfoEXT*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_EMIT_PICTURE_PARAMETERS_EXT:
-        {
-            marshal_VkVideoEncodeH264EmitPictureParametersEXT(vkStream, rootType, reinterpret_cast<const VkVideoEncodeH264EmitPictureParametersEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_EMIT_PICTURE_PARAMETERS_EXT: {
+            marshal_VkVideoEncodeH264EmitPictureParametersEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkVideoEncodeH264EmitPictureParametersEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_EXT:
-        {
-            marshal_VkVideoEncodeH264ProfileEXT(vkStream, rootType, reinterpret_cast<const VkVideoEncodeH264ProfileEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_EXT: {
+            marshal_VkVideoEncodeH264ProfileEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkVideoEncodeH264ProfileEXT*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_video_encode_h265
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_EXT:
-        {
-            marshal_VkVideoEncodeH265CapabilitiesEXT(vkStream, rootType, reinterpret_cast<const VkVideoEncodeH265CapabilitiesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_EXT: {
+            marshal_VkVideoEncodeH265CapabilitiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkVideoEncodeH265CapabilitiesEXT*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_CREATE_INFO_EXT:
-        {
-            marshal_VkVideoEncodeH265SessionCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkVideoEncodeH265SessionCreateInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_CREATE_INFO_EXT: {
+            marshal_VkVideoEncodeH265SessionCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkVideoEncodeH265SessionCreateInfoEXT*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
-            marshal_VkVideoEncodeH265SessionParametersAddInfoEXT(vkStream, rootType, reinterpret_cast<const VkVideoEncodeH265SessionParametersAddInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT: {
+            marshal_VkVideoEncodeH265SessionParametersAddInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkVideoEncodeH265SessionParametersAddInfoEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
-            marshal_VkVideoEncodeH265SessionParametersCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkVideoEncodeH265SessionParametersCreateInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT: {
+            marshal_VkVideoEncodeH265SessionParametersCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkVideoEncodeH265SessionParametersCreateInfoEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_VCL_FRAME_INFO_EXT:
-        {
-            marshal_VkVideoEncodeH265VclFrameInfoEXT(vkStream, rootType, reinterpret_cast<const VkVideoEncodeH265VclFrameInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_VCL_FRAME_INFO_EXT: {
+            marshal_VkVideoEncodeH265VclFrameInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkVideoEncodeH265VclFrameInfoEXT*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_EMIT_PICTURE_PARAMETERS_EXT:
-        {
-            marshal_VkVideoEncodeH265EmitPictureParametersEXT(vkStream, rootType, reinterpret_cast<const VkVideoEncodeH265EmitPictureParametersEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_EMIT_PICTURE_PARAMETERS_EXT: {
+            marshal_VkVideoEncodeH265EmitPictureParametersEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkVideoEncodeH265EmitPictureParametersEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_EXT:
-        {
-            marshal_VkVideoEncodeH265ProfileEXT(vkStream, rootType, reinterpret_cast<const VkVideoEncodeH265ProfileEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_EXT: {
+            marshal_VkVideoEncodeH265ProfileEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkVideoEncodeH265ProfileEXT*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_video_decode_h264
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_EXT:
-        {
-            marshal_VkVideoDecodeH264ProfileEXT(vkStream, rootType, reinterpret_cast<const VkVideoDecodeH264ProfileEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_EXT: {
+            marshal_VkVideoDecodeH264ProfileEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkVideoDecodeH264ProfileEXT*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT:
-        {
-            marshal_VkVideoDecodeH264CapabilitiesEXT(vkStream, rootType, reinterpret_cast<const VkVideoDecodeH264CapabilitiesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT: {
+            marshal_VkVideoDecodeH264CapabilitiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkVideoDecodeH264CapabilitiesEXT*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_CREATE_INFO_EXT:
-        {
-            marshal_VkVideoDecodeH264SessionCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkVideoDecodeH264SessionCreateInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_CREATE_INFO_EXT: {
+            marshal_VkVideoDecodeH264SessionCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkVideoDecodeH264SessionCreateInfoEXT*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
-            marshal_VkVideoDecodeH264SessionParametersAddInfoEXT(vkStream, rootType, reinterpret_cast<const VkVideoDecodeH264SessionParametersAddInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT: {
+            marshal_VkVideoDecodeH264SessionParametersAddInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkVideoDecodeH264SessionParametersAddInfoEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
-            marshal_VkVideoDecodeH264SessionParametersCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkVideoDecodeH264SessionParametersCreateInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT: {
+            marshal_VkVideoDecodeH264SessionParametersCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkVideoDecodeH264SessionParametersCreateInfoEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT:
-        {
-            marshal_VkVideoDecodeH264PictureInfoEXT(vkStream, rootType, reinterpret_cast<const VkVideoDecodeH264PictureInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT: {
+            marshal_VkVideoDecodeH264PictureInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkVideoDecodeH264PictureInfoEXT*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_MVC_EXT:
-        {
-            marshal_VkVideoDecodeH264MvcEXT(vkStream, rootType, reinterpret_cast<const VkVideoDecodeH264MvcEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_MVC_EXT: {
+            marshal_VkVideoDecodeH264MvcEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkVideoDecodeH264MvcEXT*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT:
-        {
-            marshal_VkVideoDecodeH264DpbSlotInfoEXT(vkStream, rootType, reinterpret_cast<const VkVideoDecodeH264DpbSlotInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT: {
+            marshal_VkVideoDecodeH264DpbSlotInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkVideoDecodeH264DpbSlotInfoEXT*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_AMD_texture_gather_bias_lod
-        case VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD:
-        {
-            marshal_VkTextureLODGatherFormatPropertiesAMD(vkStream, rootType, reinterpret_cast<const VkTextureLODGatherFormatPropertiesAMD*>(structExtension));
+        case VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD: {
+            marshal_VkTextureLODGatherFormatPropertiesAMD(
+                vkStream, rootType,
+                reinterpret_cast<const VkTextureLODGatherFormatPropertiesAMD*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_NV_corner_sampled_image
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV:
-        {
-            marshal_VkPhysicalDeviceCornerSampledImageFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceCornerSampledImageFeaturesNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV: {
+            marshal_VkPhysicalDeviceCornerSampledImageFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceCornerSampledImageFeaturesNV*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_NV_external_memory
-        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV:
-        {
-            marshal_VkExternalMemoryImageCreateInfoNV(vkStream, rootType, reinterpret_cast<const VkExternalMemoryImageCreateInfoNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV: {
+            marshal_VkExternalMemoryImageCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkExternalMemoryImageCreateInfoNV*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV:
-        {
-            marshal_VkExportMemoryAllocateInfoNV(vkStream, rootType, reinterpret_cast<const VkExportMemoryAllocateInfoNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV: {
+            marshal_VkExportMemoryAllocateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkExportMemoryAllocateInfoNV*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_NV_external_memory_win32
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV:
-        {
-            marshal_VkImportMemoryWin32HandleInfoNV(vkStream, rootType, reinterpret_cast<const VkImportMemoryWin32HandleInfoNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV: {
+            marshal_VkImportMemoryWin32HandleInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkImportMemoryWin32HandleInfoNV*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV:
-        {
-            marshal_VkExportMemoryWin32HandleInfoNV(vkStream, rootType, reinterpret_cast<const VkExportMemoryWin32HandleInfoNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV: {
+            marshal_VkExportMemoryWin32HandleInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkExportMemoryWin32HandleInfoNV*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_NV_win32_keyed_mutex
-        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV:
-        {
-            marshal_VkWin32KeyedMutexAcquireReleaseInfoNV(vkStream, rootType, reinterpret_cast<const VkWin32KeyedMutexAcquireReleaseInfoNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV: {
+            marshal_VkWin32KeyedMutexAcquireReleaseInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkWin32KeyedMutexAcquireReleaseInfoNV*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_validation_flags
-        case VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT:
-        {
-            marshal_VkValidationFlagsEXT(vkStream, rootType, reinterpret_cast<const VkValidationFlagsEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT: {
+            marshal_VkValidationFlagsEXT(
+                vkStream, rootType, reinterpret_cast<const VkValidationFlagsEXT*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_texture_compression_astc_hdr
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT: {
+            marshal_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_astc_decode_mode
-        case VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT:
-        {
-            marshal_VkImageViewASTCDecodeModeEXT(vkStream, rootType, reinterpret_cast<const VkImageViewASTCDecodeModeEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT: {
+            marshal_VkImageViewASTCDecodeModeEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkImageViewASTCDecodeModeEXT*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDeviceASTCDecodeFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceASTCDecodeFeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT: {
+            marshal_VkPhysicalDeviceASTCDecodeFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceASTCDecodeFeaturesEXT*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_conditional_rendering
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDeviceConditionalRenderingFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceConditionalRenderingFeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT: {
+            marshal_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceConditionalRenderingFeaturesEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT:
-        {
-            marshal_VkCommandBufferInheritanceConditionalRenderingInfoEXT(vkStream, rootType, reinterpret_cast<const VkCommandBufferInheritanceConditionalRenderingInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT: {
+            marshal_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkCommandBufferInheritanceConditionalRenderingInfoEXT*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_NV_clip_space_w_scaling
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV:
-        {
-            marshal_VkPipelineViewportWScalingStateCreateInfoNV(vkStream, rootType, reinterpret_cast<const VkPipelineViewportWScalingStateCreateInfoNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV: {
+            marshal_VkPipelineViewportWScalingStateCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkPipelineViewportWScalingStateCreateInfoNV*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_display_control
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT:
-        {
-            marshal_VkSwapchainCounterCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkSwapchainCounterCreateInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT: {
+            marshal_VkSwapchainCounterCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkSwapchainCounterCreateInfoEXT*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_GOOGLE_display_timing
-        case VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE:
-        {
-            marshal_VkPresentTimesInfoGOOGLE(vkStream, rootType, reinterpret_cast<const VkPresentTimesInfoGOOGLE*>(structExtension));
+        case VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE: {
+            marshal_VkPresentTimesInfoGOOGLE(
+                vkStream, rootType,
+                reinterpret_cast<const VkPresentTimesInfoGOOGLE*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_NVX_multiview_per_view_attributes
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX:
-        {
-            marshal_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX: {
+            marshal_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_NV_viewport_swizzle
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV:
-        {
-            marshal_VkPipelineViewportSwizzleStateCreateInfoNV(vkStream, rootType, reinterpret_cast<const VkPipelineViewportSwizzleStateCreateInfoNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV: {
+            marshal_VkPipelineViewportSwizzleStateCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkPipelineViewportSwizzleStateCreateInfoNV*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_discard_rectangles
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT:
-        {
-            marshal_VkPhysicalDeviceDiscardRectanglePropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceDiscardRectanglePropertiesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT: {
+            marshal_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceDiscardRectanglePropertiesEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT:
-        {
-            marshal_VkPipelineDiscardRectangleStateCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkPipelineDiscardRectangleStateCreateInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT: {
+            marshal_VkPipelineDiscardRectangleStateCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPipelineDiscardRectangleStateCreateInfoEXT*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_conservative_rasterization
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT:
-        {
-            marshal_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceConservativeRasterizationPropertiesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT: {
+            marshal_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceConservativeRasterizationPropertiesEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT:
-        {
-            marshal_VkPipelineRasterizationConservativeStateCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkPipelineRasterizationConservativeStateCreateInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT: {
+            marshal_VkPipelineRasterizationConservativeStateCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPipelineRasterizationConservativeStateCreateInfoEXT*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_depth_clip_enable
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDeviceDepthClipEnableFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceDepthClipEnableFeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT: {
+            marshal_VkPhysicalDeviceDepthClipEnableFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceDepthClipEnableFeaturesEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT:
-        {
-            marshal_VkPipelineRasterizationDepthClipStateCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkPipelineRasterizationDepthClipStateCreateInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT: {
+            marshal_VkPipelineRasterizationDepthClipStateCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPipelineRasterizationDepthClipStateCreateInfoEXT*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_debug_utils
-        case VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT:
-        {
-            marshal_VkDebugUtilsMessengerCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkDebugUtilsMessengerCreateInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT: {
+            marshal_VkDebugUtilsMessengerCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkDebugUtilsMessengerCreateInfoEXT*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
-        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID:
-        {
-            marshal_VkAndroidHardwareBufferUsageANDROID(vkStream, rootType, reinterpret_cast<const VkAndroidHardwareBufferUsageANDROID*>(structExtension));
+        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID: {
+            marshal_VkAndroidHardwareBufferUsageANDROID(
+                vkStream, rootType,
+                reinterpret_cast<const VkAndroidHardwareBufferUsageANDROID*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID:
-        {
-            marshal_VkAndroidHardwareBufferFormatPropertiesANDROID(vkStream, rootType, reinterpret_cast<const VkAndroidHardwareBufferFormatPropertiesANDROID*>(structExtension));
+        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID: {
+            marshal_VkAndroidHardwareBufferFormatPropertiesANDROID(
+                vkStream, rootType,
+                reinterpret_cast<const VkAndroidHardwareBufferFormatPropertiesANDROID*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID:
-        {
-            marshal_VkImportAndroidHardwareBufferInfoANDROID(vkStream, rootType, reinterpret_cast<const VkImportAndroidHardwareBufferInfoANDROID*>(structExtension));
+        case VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID: {
+            marshal_VkImportAndroidHardwareBufferInfoANDROID(
+                vkStream, rootType,
+                reinterpret_cast<const VkImportAndroidHardwareBufferInfoANDROID*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID:
-        {
-            marshal_VkExternalFormatANDROID(vkStream, rootType, reinterpret_cast<const VkExternalFormatANDROID*>(structExtension));
+        case VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID: {
+            marshal_VkExternalFormatANDROID(
+                vkStream, rootType,
+                reinterpret_cast<const VkExternalFormatANDROID*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_2_ANDROID:
-        {
-            marshal_VkAndroidHardwareBufferFormatProperties2ANDROID(vkStream, rootType, reinterpret_cast<const VkAndroidHardwareBufferFormatProperties2ANDROID*>(structExtension));
+        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_2_ANDROID: {
+            marshal_VkAndroidHardwareBufferFormatProperties2ANDROID(
+                vkStream, rootType,
+                reinterpret_cast<const VkAndroidHardwareBufferFormatProperties2ANDROID*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_inline_uniform_block
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceInlineUniformBlockFeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT: {
+            marshal_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceInlineUniformBlockFeaturesEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT:
-        {
-            marshal_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceInlineUniformBlockPropertiesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT: {
+            marshal_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceInlineUniformBlockPropertiesEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT:
-        {
-            marshal_VkWriteDescriptorSetInlineUniformBlockEXT(vkStream, rootType, reinterpret_cast<const VkWriteDescriptorSetInlineUniformBlockEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT: {
+            marshal_VkWriteDescriptorSetInlineUniformBlockEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkWriteDescriptorSetInlineUniformBlockEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT:
-        {
-            marshal_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkDescriptorPoolInlineUniformBlockCreateInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT: {
+            marshal_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkDescriptorPoolInlineUniformBlockCreateInfoEXT*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_sample_locations
-        case VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT:
-        {
-            marshal_VkSampleLocationsInfoEXT(vkStream, rootType, reinterpret_cast<const VkSampleLocationsInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT: {
+            marshal_VkSampleLocationsInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkSampleLocationsInfoEXT*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT:
-        {
-            marshal_VkRenderPassSampleLocationsBeginInfoEXT(vkStream, rootType, reinterpret_cast<const VkRenderPassSampleLocationsBeginInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT: {
+            marshal_VkRenderPassSampleLocationsBeginInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkRenderPassSampleLocationsBeginInfoEXT*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT:
-        {
-            marshal_VkPipelineSampleLocationsStateCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkPipelineSampleLocationsStateCreateInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT: {
+            marshal_VkPipelineSampleLocationsStateCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPipelineSampleLocationsStateCreateInfoEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT:
-        {
-            marshal_VkPhysicalDeviceSampleLocationsPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceSampleLocationsPropertiesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT: {
+            marshal_VkPhysicalDeviceSampleLocationsPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceSampleLocationsPropertiesEXT*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_blend_operation_advanced
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT: {
+            marshal_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT:
-        {
-            marshal_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT: {
+            marshal_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT:
-        {
-            marshal_VkPipelineColorBlendAdvancedStateCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkPipelineColorBlendAdvancedStateCreateInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT: {
+            marshal_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPipelineColorBlendAdvancedStateCreateInfoEXT*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_NV_fragment_coverage_to_color
-        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV:
-        {
-            marshal_VkPipelineCoverageToColorStateCreateInfoNV(vkStream, rootType, reinterpret_cast<const VkPipelineCoverageToColorStateCreateInfoNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV: {
+            marshal_VkPipelineCoverageToColorStateCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkPipelineCoverageToColorStateCreateInfoNV*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_NV_framebuffer_mixed_samples
-        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV:
-        {
-            marshal_VkPipelineCoverageModulationStateCreateInfoNV(vkStream, rootType, reinterpret_cast<const VkPipelineCoverageModulationStateCreateInfoNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV: {
+            marshal_VkPipelineCoverageModulationStateCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkPipelineCoverageModulationStateCreateInfoNV*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_NV_shader_sm_builtins
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV:
-        {
-            marshal_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderSMBuiltinsPropertiesNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV: {
+            marshal_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShaderSMBuiltinsPropertiesNV*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV:
-        {
-            marshal_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV: {
+            marshal_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_image_drm_format_modifier
-        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT:
-        {
-            marshal_VkDrmFormatModifierPropertiesListEXT(vkStream, rootType, reinterpret_cast<const VkDrmFormatModifierPropertiesListEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT: {
+            marshal_VkDrmFormatModifierPropertiesListEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkDrmFormatModifierPropertiesListEXT*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT:
-        {
-            marshal_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceImageDrmFormatModifierInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT: {
+            marshal_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceImageDrmFormatModifierInfoEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT:
-        {
-            marshal_VkImageDrmFormatModifierListCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkImageDrmFormatModifierListCreateInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT: {
+            marshal_VkImageDrmFormatModifierListCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkImageDrmFormatModifierListCreateInfoEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT:
-        {
-            marshal_VkImageDrmFormatModifierExplicitCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkImageDrmFormatModifierExplicitCreateInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT: {
+            marshal_VkImageDrmFormatModifierExplicitCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkImageDrmFormatModifierExplicitCreateInfoEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_2_EXT:
-        {
-            marshal_VkDrmFormatModifierPropertiesList2EXT(vkStream, rootType, reinterpret_cast<const VkDrmFormatModifierPropertiesList2EXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_2_EXT: {
+            marshal_VkDrmFormatModifierPropertiesList2EXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkDrmFormatModifierPropertiesList2EXT*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_validation_cache
-        case VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT:
-        {
-            marshal_VkShaderModuleValidationCacheCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkShaderModuleValidationCacheCreateInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT: {
+            marshal_VkShaderModuleValidationCacheCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkShaderModuleValidationCacheCreateInfoEXT*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_NV_shading_rate_image
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV:
-        {
-            marshal_VkPipelineViewportShadingRateImageStateCreateInfoNV(vkStream, rootType, reinterpret_cast<const VkPipelineViewportShadingRateImageStateCreateInfoNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV: {
+            marshal_VkPipelineViewportShadingRateImageStateCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkPipelineViewportShadingRateImageStateCreateInfoNV*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV:
-        {
-            marshal_VkPhysicalDeviceShadingRateImageFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShadingRateImageFeaturesNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV: {
+            marshal_VkPhysicalDeviceShadingRateImageFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShadingRateImageFeaturesNV*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV:
-        {
-            marshal_VkPhysicalDeviceShadingRateImagePropertiesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShadingRateImagePropertiesNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV: {
+            marshal_VkPhysicalDeviceShadingRateImagePropertiesNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShadingRateImagePropertiesNV*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV:
-        {
-            marshal_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(vkStream, rootType, reinterpret_cast<const VkPipelineViewportCoarseSampleOrderStateCreateInfoNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV: {
+            marshal_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkPipelineViewportCoarseSampleOrderStateCreateInfoNV*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_NV_ray_tracing
-        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV:
-        {
-            marshal_VkWriteDescriptorSetAccelerationStructureNV(vkStream, rootType, reinterpret_cast<const VkWriteDescriptorSetAccelerationStructureNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV: {
+            marshal_VkWriteDescriptorSetAccelerationStructureNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkWriteDescriptorSetAccelerationStructureNV*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV:
-        {
-            marshal_VkPhysicalDeviceRayTracingPropertiesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceRayTracingPropertiesNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV: {
+            marshal_VkPhysicalDeviceRayTracingPropertiesNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceRayTracingPropertiesNV*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_NV_representative_fragment_test
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV:
-        {
-            marshal_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV: {
+            marshal_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV:
-        {
-            marshal_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(vkStream, rootType, reinterpret_cast<const VkPipelineRepresentativeFragmentTestStateCreateInfoNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV: {
+            marshal_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkPipelineRepresentativeFragmentTestStateCreateInfoNV*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_filter_cubic
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT:
-        {
-            marshal_VkPhysicalDeviceImageViewImageFormatInfoEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceImageViewImageFormatInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT: {
+            marshal_VkPhysicalDeviceImageViewImageFormatInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceImageViewImageFormatInfoEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT:
-        {
-            marshal_VkFilterCubicImageViewImageFormatPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkFilterCubicImageViewImageFormatPropertiesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT: {
+            marshal_VkFilterCubicImageViewImageFormatPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkFilterCubicImageViewImageFormatPropertiesEXT*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_global_priority
-        case VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT:
-        {
-            marshal_VkDeviceQueueGlobalPriorityCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkDeviceQueueGlobalPriorityCreateInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT: {
+            marshal_VkDeviceQueueGlobalPriorityCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkDeviceQueueGlobalPriorityCreateInfoEXT*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_external_memory_host
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT:
-        {
-            marshal_VkImportMemoryHostPointerInfoEXT(vkStream, rootType, reinterpret_cast<const VkImportMemoryHostPointerInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT: {
+            marshal_VkImportMemoryHostPointerInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkImportMemoryHostPointerInfoEXT*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT:
-        {
-            marshal_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceExternalMemoryHostPropertiesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT: {
+            marshal_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceExternalMemoryHostPropertiesEXT*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_AMD_pipeline_compiler_control
-        case VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD:
-        {
-            marshal_VkPipelineCompilerControlCreateInfoAMD(vkStream, rootType, reinterpret_cast<const VkPipelineCompilerControlCreateInfoAMD*>(structExtension));
+        case VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD: {
+            marshal_VkPipelineCompilerControlCreateInfoAMD(
+                vkStream, rootType,
+                reinterpret_cast<const VkPipelineCompilerControlCreateInfoAMD*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_AMD_shader_core_properties
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD:
-        {
-            marshal_VkPhysicalDeviceShaderCorePropertiesAMD(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderCorePropertiesAMD*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD: {
+            marshal_VkPhysicalDeviceShaderCorePropertiesAMD(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShaderCorePropertiesAMD*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_video_decode_h265
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_EXT:
-        {
-            marshal_VkVideoDecodeH265ProfileEXT(vkStream, rootType, reinterpret_cast<const VkVideoDecodeH265ProfileEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_EXT: {
+            marshal_VkVideoDecodeH265ProfileEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkVideoDecodeH265ProfileEXT*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT:
-        {
-            marshal_VkVideoDecodeH265CapabilitiesEXT(vkStream, rootType, reinterpret_cast<const VkVideoDecodeH265CapabilitiesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT: {
+            marshal_VkVideoDecodeH265CapabilitiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkVideoDecodeH265CapabilitiesEXT*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_CREATE_INFO_EXT:
-        {
-            marshal_VkVideoDecodeH265SessionCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkVideoDecodeH265SessionCreateInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_CREATE_INFO_EXT: {
+            marshal_VkVideoDecodeH265SessionCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkVideoDecodeH265SessionCreateInfoEXT*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
-            marshal_VkVideoDecodeH265SessionParametersAddInfoEXT(vkStream, rootType, reinterpret_cast<const VkVideoDecodeH265SessionParametersAddInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT: {
+            marshal_VkVideoDecodeH265SessionParametersAddInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkVideoDecodeH265SessionParametersAddInfoEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
-            marshal_VkVideoDecodeH265SessionParametersCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkVideoDecodeH265SessionParametersCreateInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT: {
+            marshal_VkVideoDecodeH265SessionParametersCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkVideoDecodeH265SessionParametersCreateInfoEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT:
-        {
-            marshal_VkVideoDecodeH265PictureInfoEXT(vkStream, rootType, reinterpret_cast<const VkVideoDecodeH265PictureInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT: {
+            marshal_VkVideoDecodeH265PictureInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkVideoDecodeH265PictureInfoEXT*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT:
-        {
-            marshal_VkVideoDecodeH265DpbSlotInfoEXT(vkStream, rootType, reinterpret_cast<const VkVideoDecodeH265DpbSlotInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT: {
+            marshal_VkVideoDecodeH265DpbSlotInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkVideoDecodeH265DpbSlotInfoEXT*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_AMD_memory_overallocation_behavior
-        case VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD:
-        {
-            marshal_VkDeviceMemoryOverallocationCreateInfoAMD(vkStream, rootType, reinterpret_cast<const VkDeviceMemoryOverallocationCreateInfoAMD*>(structExtension));
+        case VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD: {
+            marshal_VkDeviceMemoryOverallocationCreateInfoAMD(
+                vkStream, rootType,
+                reinterpret_cast<const VkDeviceMemoryOverallocationCreateInfoAMD*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_vertex_attribute_divisor
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT:
-        {
-            marshal_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT: {
+            marshal_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT:
-        {
-            marshal_VkPipelineVertexInputDivisorStateCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkPipelineVertexInputDivisorStateCreateInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT: {
+            marshal_VkPipelineVertexInputDivisorStateCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPipelineVertexInputDivisorStateCreateInfoEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: {
+            marshal_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_GGP_frame_token
-        case VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP:
-        {
-            marshal_VkPresentFrameTokenGGP(vkStream, rootType, reinterpret_cast<const VkPresentFrameTokenGGP*>(structExtension));
+        case VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP: {
+            marshal_VkPresentFrameTokenGGP(
+                vkStream, rootType,
+                reinterpret_cast<const VkPresentFrameTokenGGP*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_pipeline_creation_feedback
-        case VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT:
-        {
-            marshal_VkPipelineCreationFeedbackCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkPipelineCreationFeedbackCreateInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT: {
+            marshal_VkPipelineCreationFeedbackCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPipelineCreationFeedbackCreateInfoEXT*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_NV_compute_shader_derivatives
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV:
-        {
-            marshal_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceComputeShaderDerivativesFeaturesNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV: {
+            marshal_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceComputeShaderDerivativesFeaturesNV*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_NV_mesh_shader
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV:
-        {
-            marshal_VkPhysicalDeviceMeshShaderFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceMeshShaderFeaturesNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV: {
+            marshal_VkPhysicalDeviceMeshShaderFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceMeshShaderFeaturesNV*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV:
-        {
-            marshal_VkPhysicalDeviceMeshShaderPropertiesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceMeshShaderPropertiesNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV: {
+            marshal_VkPhysicalDeviceMeshShaderPropertiesNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceMeshShaderPropertiesNV*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_NV_fragment_shader_barycentric
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV:
-        {
-            marshal_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV: {
+            marshal_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_NV_shader_image_footprint
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV:
-        {
-            marshal_VkPhysicalDeviceShaderImageFootprintFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderImageFootprintFeaturesNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV: {
+            marshal_VkPhysicalDeviceShaderImageFootprintFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShaderImageFootprintFeaturesNV*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_NV_scissor_exclusive
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV:
-        {
-            marshal_VkPipelineViewportExclusiveScissorStateCreateInfoNV(vkStream, rootType, reinterpret_cast<const VkPipelineViewportExclusiveScissorStateCreateInfoNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV: {
+            marshal_VkPipelineViewportExclusiveScissorStateCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkPipelineViewportExclusiveScissorStateCreateInfoNV*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV:
-        {
-            marshal_VkPhysicalDeviceExclusiveScissorFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceExclusiveScissorFeaturesNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV: {
+            marshal_VkPhysicalDeviceExclusiveScissorFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceExclusiveScissorFeaturesNV*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
-        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV:
-        {
-            marshal_VkQueueFamilyCheckpointPropertiesNV(vkStream, rootType, reinterpret_cast<const VkQueueFamilyCheckpointPropertiesNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV: {
+            marshal_VkQueueFamilyCheckpointPropertiesNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkQueueFamilyCheckpointPropertiesNV*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_INTEL_shader_integer_functions2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL:
-        {
-            marshal_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL: {
+            marshal_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_INTEL_performance_query
-        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL:
-        {
-            marshal_VkQueryPoolPerformanceQueryCreateInfoINTEL(vkStream, rootType, reinterpret_cast<const VkQueryPoolPerformanceQueryCreateInfoINTEL*>(structExtension));
+        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL: {
+            marshal_VkQueryPoolPerformanceQueryCreateInfoINTEL(
+                vkStream, rootType,
+                reinterpret_cast<const VkQueryPoolPerformanceQueryCreateInfoINTEL*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_pci_bus_info
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT:
-        {
-            marshal_VkPhysicalDevicePCIBusInfoPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDevicePCIBusInfoPropertiesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT: {
+            marshal_VkPhysicalDevicePCIBusInfoPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDevicePCIBusInfoPropertiesEXT*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_AMD_display_native_hdr
-        case VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD:
-        {
-            marshal_VkDisplayNativeHdrSurfaceCapabilitiesAMD(vkStream, rootType, reinterpret_cast<const VkDisplayNativeHdrSurfaceCapabilitiesAMD*>(structExtension));
+        case VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD: {
+            marshal_VkDisplayNativeHdrSurfaceCapabilitiesAMD(
+                vkStream, rootType,
+                reinterpret_cast<const VkDisplayNativeHdrSurfaceCapabilitiesAMD*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD:
-        {
-            marshal_VkSwapchainDisplayNativeHdrCreateInfoAMD(vkStream, rootType, reinterpret_cast<const VkSwapchainDisplayNativeHdrCreateInfoAMD*>(structExtension));
+        case VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD: {
+            marshal_VkSwapchainDisplayNativeHdrCreateInfoAMD(
+                vkStream, rootType,
+                reinterpret_cast<const VkSwapchainDisplayNativeHdrCreateInfoAMD*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_fragment_density_map
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT:
-        {
-            switch(rootType)
-            {
-                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2:
-                {
-                    marshal_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT: {
+            switch (rootType) {
+                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2: {
+                    marshal_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
+                        vkStream, rootType,
+                        reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(
+                            structExtension));
                     break;
                 }
-                case VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO:
-                {
-                    marshal_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(structExtension));
+                case VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO: {
+                    marshal_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
+                        vkStream, rootType,
+                        reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(
+                            structExtension));
                     break;
                 }
-                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO:
-                {
-                    marshal_VkImportColorBufferGOOGLE(vkStream, rootType, reinterpret_cast<const VkImportColorBufferGOOGLE*>(structExtension));
+                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO: {
+                    marshal_VkImportColorBufferGOOGLE(
+                        vkStream, rootType,
+                        reinterpret_cast<const VkImportColorBufferGOOGLE*>(structExtension));
                     break;
                 }
-                default:
-                {
-                    marshal_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(structExtension));
+                default: {
+                    marshal_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
+                        vkStream, rootType,
+                        reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(
+                            structExtension));
                     break;
                 }
             }
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT:
-        {
-            switch(rootType)
-            {
-                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2:
-                {
-                    marshal_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT: {
+            switch (rootType) {
+                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2: {
+                    marshal_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
+                        vkStream, rootType,
+                        reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(
+                            structExtension));
                     break;
                 }
-                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO:
-                {
-                    marshal_VkImportPhysicalAddressGOOGLE(vkStream, rootType, reinterpret_cast<const VkImportPhysicalAddressGOOGLE*>(structExtension));
+                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO: {
+                    marshal_VkImportPhysicalAddressGOOGLE(
+                        vkStream, rootType,
+                        reinterpret_cast<const VkImportPhysicalAddressGOOGLE*>(structExtension));
                     break;
                 }
-                default:
-                {
-                    marshal_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(structExtension));
+                default: {
+                    marshal_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
+                        vkStream, rootType,
+                        reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(
+                            structExtension));
                     break;
                 }
             }
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT:
-        {
-            switch(rootType)
-            {
-                case VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO:
-                {
-                    marshal_VkRenderPassFragmentDensityMapCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkRenderPassFragmentDensityMapCreateInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT: {
+            switch (rootType) {
+                case VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO: {
+                    marshal_VkRenderPassFragmentDensityMapCreateInfoEXT(
+                        vkStream, rootType,
+                        reinterpret_cast<const VkRenderPassFragmentDensityMapCreateInfoEXT*>(
+                            structExtension));
                     break;
                 }
-                case VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2:
-                {
-                    marshal_VkRenderPassFragmentDensityMapCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkRenderPassFragmentDensityMapCreateInfoEXT*>(structExtension));
+                case VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2: {
+                    marshal_VkRenderPassFragmentDensityMapCreateInfoEXT(
+                        vkStream, rootType,
+                        reinterpret_cast<const VkRenderPassFragmentDensityMapCreateInfoEXT*>(
+                            structExtension));
                     break;
                 }
-                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO:
-                {
-                    marshal_VkImportBufferGOOGLE(vkStream, rootType, reinterpret_cast<const VkImportBufferGOOGLE*>(structExtension));
+                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO: {
+                    marshal_VkImportBufferGOOGLE(
+                        vkStream, rootType,
+                        reinterpret_cast<const VkImportBufferGOOGLE*>(structExtension));
                     break;
                 }
-                default:
-                {
-                    marshal_VkRenderPassFragmentDensityMapCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkRenderPassFragmentDensityMapCreateInfoEXT*>(structExtension));
+                default: {
+                    marshal_VkRenderPassFragmentDensityMapCreateInfoEXT(
+                        vkStream, rootType,
+                        reinterpret_cast<const VkRenderPassFragmentDensityMapCreateInfoEXT*>(
+                            structExtension));
                     break;
                 }
             }
@@ -37187,2178 +35387,2684 @@
         }
 #endif
 #ifdef VK_EXT_subgroup_size_control
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT: {
+            marshal_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT:
-        {
-            marshal_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceSubgroupSizeControlPropertiesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT: {
+            marshal_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceSubgroupSizeControlPropertiesEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT:
-        {
-            marshal_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT: {
+            marshal_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_AMD_shader_core_properties2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD:
-        {
-            marshal_VkPhysicalDeviceShaderCoreProperties2AMD(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderCoreProperties2AMD*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD: {
+            marshal_VkPhysicalDeviceShaderCoreProperties2AMD(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShaderCoreProperties2AMD*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_AMD_device_coherent_memory
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD:
-        {
-            marshal_VkPhysicalDeviceCoherentMemoryFeaturesAMD(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceCoherentMemoryFeaturesAMD*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD: {
+            marshal_VkPhysicalDeviceCoherentMemoryFeaturesAMD(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceCoherentMemoryFeaturesAMD*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_shader_image_atomic_int64
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT: {
+            marshal_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_memory_budget
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT:
-        {
-            marshal_VkPhysicalDeviceMemoryBudgetPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceMemoryBudgetPropertiesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT: {
+            marshal_VkPhysicalDeviceMemoryBudgetPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceMemoryBudgetPropertiesEXT*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_memory_priority
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDeviceMemoryPriorityFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceMemoryPriorityFeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT: {
+            marshal_VkPhysicalDeviceMemoryPriorityFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceMemoryPriorityFeaturesEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT:
-        {
-            marshal_VkMemoryPriorityAllocateInfoEXT(vkStream, rootType, reinterpret_cast<const VkMemoryPriorityAllocateInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT: {
+            marshal_VkMemoryPriorityAllocateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkMemoryPriorityAllocateInfoEXT*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_NV_dedicated_allocation_image_aliasing
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV:
-        {
-            marshal_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV: {
+            marshal_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_buffer_device_address
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT: {
+            marshal_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT:
-        {
-            marshal_VkBufferDeviceAddressCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkBufferDeviceAddressCreateInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT: {
+            marshal_VkBufferDeviceAddressCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkBufferDeviceAddressCreateInfoEXT*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_validation_features
-        case VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT:
-        {
-            marshal_VkValidationFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkValidationFeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT: {
+            marshal_VkValidationFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkValidationFeaturesEXT*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_NV_cooperative_matrix
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV:
-        {
-            marshal_VkPhysicalDeviceCooperativeMatrixFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceCooperativeMatrixFeaturesNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV: {
+            marshal_VkPhysicalDeviceCooperativeMatrixFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceCooperativeMatrixFeaturesNV*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV:
-        {
-            marshal_VkPhysicalDeviceCooperativeMatrixPropertiesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceCooperativeMatrixPropertiesNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV: {
+            marshal_VkPhysicalDeviceCooperativeMatrixPropertiesNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceCooperativeMatrixPropertiesNV*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_NV_coverage_reduction_mode
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV:
-        {
-            marshal_VkPhysicalDeviceCoverageReductionModeFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceCoverageReductionModeFeaturesNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV: {
+            marshal_VkPhysicalDeviceCoverageReductionModeFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceCoverageReductionModeFeaturesNV*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV:
-        {
-            marshal_VkPipelineCoverageReductionStateCreateInfoNV(vkStream, rootType, reinterpret_cast<const VkPipelineCoverageReductionStateCreateInfoNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV: {
+            marshal_VkPipelineCoverageReductionStateCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkPipelineCoverageReductionStateCreateInfoNV*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_fragment_shader_interlock
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT: {
+            marshal_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_ycbcr_image_arrays
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT: {
+            marshal_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_provoking_vertex
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDeviceProvokingVertexFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceProvokingVertexFeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT: {
+            marshal_VkPhysicalDeviceProvokingVertexFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceProvokingVertexFeaturesEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_PROPERTIES_EXT:
-        {
-            marshal_VkPhysicalDeviceProvokingVertexPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceProvokingVertexPropertiesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_PROPERTIES_EXT: {
+            marshal_VkPhysicalDeviceProvokingVertexPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceProvokingVertexPropertiesEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT:
-        {
-            marshal_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkPipelineRasterizationProvokingVertexStateCreateInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT: {
+            marshal_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPipelineRasterizationProvokingVertexStateCreateInfoEXT*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_full_screen_exclusive
-        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT:
-        {
-            marshal_VkSurfaceFullScreenExclusiveInfoEXT(vkStream, rootType, reinterpret_cast<const VkSurfaceFullScreenExclusiveInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT: {
+            marshal_VkSurfaceFullScreenExclusiveInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkSurfaceFullScreenExclusiveInfoEXT*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT:
-        {
-            marshal_VkSurfaceCapabilitiesFullScreenExclusiveEXT(vkStream, rootType, reinterpret_cast<const VkSurfaceCapabilitiesFullScreenExclusiveEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT: {
+            marshal_VkSurfaceCapabilitiesFullScreenExclusiveEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkSurfaceCapabilitiesFullScreenExclusiveEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT:
-        {
-            marshal_VkSurfaceFullScreenExclusiveWin32InfoEXT(vkStream, rootType, reinterpret_cast<const VkSurfaceFullScreenExclusiveWin32InfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT: {
+            marshal_VkSurfaceFullScreenExclusiveWin32InfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkSurfaceFullScreenExclusiveWin32InfoEXT*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_line_rasterization
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDeviceLineRasterizationFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceLineRasterizationFeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT: {
+            marshal_VkPhysicalDeviceLineRasterizationFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceLineRasterizationFeaturesEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT:
-        {
-            marshal_VkPhysicalDeviceLineRasterizationPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceLineRasterizationPropertiesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT: {
+            marshal_VkPhysicalDeviceLineRasterizationPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceLineRasterizationPropertiesEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT:
-        {
-            marshal_VkPipelineRasterizationLineStateCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkPipelineRasterizationLineStateCreateInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT: {
+            marshal_VkPipelineRasterizationLineStateCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPipelineRasterizationLineStateCreateInfoEXT*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_shader_atomic_float
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT: {
+            marshal_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_index_type_uint8
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceIndexTypeUint8FeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT: {
+            marshal_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceIndexTypeUint8FeaturesEXT*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT: {
+            marshal_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_shader_atomic_float2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT: {
+            marshal_VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT: {
+            marshal_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_NV_device_generated_commands
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV:
-        {
-            marshal_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV: {
+            marshal_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV:
-        {
-            marshal_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV: {
+            marshal_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV:
-        {
-            marshal_VkGraphicsPipelineShaderGroupsCreateInfoNV(vkStream, rootType, reinterpret_cast<const VkGraphicsPipelineShaderGroupsCreateInfoNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV: {
+            marshal_VkGraphicsPipelineShaderGroupsCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkGraphicsPipelineShaderGroupsCreateInfoNV*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_NV_inherited_viewport_scissor
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV:
-        {
-            marshal_VkPhysicalDeviceInheritedViewportScissorFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceInheritedViewportScissorFeaturesNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV: {
+            marshal_VkPhysicalDeviceInheritedViewportScissorFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceInheritedViewportScissorFeaturesNV*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_VIEWPORT_SCISSOR_INFO_NV:
-        {
-            marshal_VkCommandBufferInheritanceViewportScissorInfoNV(vkStream, rootType, reinterpret_cast<const VkCommandBufferInheritanceViewportScissorInfoNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_VIEWPORT_SCISSOR_INFO_NV: {
+            marshal_VkCommandBufferInheritanceViewportScissorInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkCommandBufferInheritanceViewportScissorInfoNV*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_texel_buffer_alignment
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: {
+            marshal_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT:
-        {
-            marshal_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT: {
+            marshal_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_QCOM_render_pass_transform
-        case VK_STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM:
-        {
-            marshal_VkRenderPassTransformBeginInfoQCOM(vkStream, rootType, reinterpret_cast<const VkRenderPassTransformBeginInfoQCOM*>(structExtension));
+        case VK_STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM: {
+            marshal_VkRenderPassTransformBeginInfoQCOM(
+                vkStream, rootType,
+                reinterpret_cast<const VkRenderPassTransformBeginInfoQCOM*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM:
-        {
-            marshal_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(vkStream, rootType, reinterpret_cast<const VkCommandBufferInheritanceRenderPassTransformInfoQCOM*>(structExtension));
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM: {
+            marshal_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(
+                vkStream, rootType,
+                reinterpret_cast<const VkCommandBufferInheritanceRenderPassTransformInfoQCOM*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_device_memory_report
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT: {
+            marshal_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT:
-        {
-            marshal_VkDeviceDeviceMemoryReportCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkDeviceDeviceMemoryReportCreateInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT: {
+            marshal_VkDeviceDeviceMemoryReportCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkDeviceDeviceMemoryReportCreateInfoEXT*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_robustness2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDeviceRobustness2FeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceRobustness2FeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT: {
+            marshal_VkPhysicalDeviceRobustness2FeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceRobustness2FeaturesEXT*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT:
-        {
-            marshal_VkPhysicalDeviceRobustness2PropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceRobustness2PropertiesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT: {
+            marshal_VkPhysicalDeviceRobustness2PropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceRobustness2PropertiesEXT*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_custom_border_color
-        case VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT:
-        {
-            marshal_VkSamplerCustomBorderColorCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkSamplerCustomBorderColorCreateInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT: {
+            marshal_VkSamplerCustomBorderColorCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkSamplerCustomBorderColorCreateInfoEXT*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT:
-        {
-            marshal_VkPhysicalDeviceCustomBorderColorPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceCustomBorderColorPropertiesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT: {
+            marshal_VkPhysicalDeviceCustomBorderColorPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceCustomBorderColorPropertiesEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDeviceCustomBorderColorFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceCustomBorderColorFeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT: {
+            marshal_VkPhysicalDeviceCustomBorderColorFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceCustomBorderColorFeaturesEXT*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_private_data
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDevicePrivateDataFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDevicePrivateDataFeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT: {
+            marshal_VkPhysicalDevicePrivateDataFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDevicePrivateDataFeaturesEXT*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT:
-        {
-            marshal_VkDevicePrivateDataCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkDevicePrivateDataCreateInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT: {
+            marshal_VkDevicePrivateDataCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkDevicePrivateDataCreateInfoEXT*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_pipeline_creation_cache_control
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT: {
+            marshal_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_NV_device_diagnostics_config
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV:
-        {
-            marshal_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceDiagnosticsConfigFeaturesNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV: {
+            marshal_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceDiagnosticsConfigFeaturesNV*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV:
-        {
-            marshal_VkDeviceDiagnosticsConfigCreateInfoNV(vkStream, rootType, reinterpret_cast<const VkDeviceDiagnosticsConfigCreateInfoNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV: {
+            marshal_VkDeviceDiagnosticsConfigCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkDeviceDiagnosticsConfigCreateInfoNV*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_NV_fragment_shading_rate_enums
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV:
-        {
-            marshal_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV: {
+            marshal_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV:
-        {
-            marshal_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV: {
+            marshal_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV:
-        {
-            marshal_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(vkStream, rootType, reinterpret_cast<const VkPipelineFragmentShadingRateEnumStateCreateInfoNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV: {
+            marshal_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkPipelineFragmentShadingRateEnumStateCreateInfoNV*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_NV_ray_tracing_motion_blur
-        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_MOTION_TRIANGLES_DATA_NV:
-        {
-            marshal_VkAccelerationStructureGeometryMotionTrianglesDataNV(vkStream, rootType, reinterpret_cast<const VkAccelerationStructureGeometryMotionTrianglesDataNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_MOTION_TRIANGLES_DATA_NV: {
+            marshal_VkAccelerationStructureGeometryMotionTrianglesDataNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkAccelerationStructureGeometryMotionTrianglesDataNV*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MOTION_INFO_NV:
-        {
-            marshal_VkAccelerationStructureMotionInfoNV(vkStream, rootType, reinterpret_cast<const VkAccelerationStructureMotionInfoNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MOTION_INFO_NV: {
+            marshal_VkAccelerationStructureMotionInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkAccelerationStructureMotionInfoNV*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV:
-        {
-            marshal_VkPhysicalDeviceRayTracingMotionBlurFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceRayTracingMotionBlurFeaturesNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV: {
+            marshal_VkPhysicalDeviceRayTracingMotionBlurFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceRayTracingMotionBlurFeaturesNV*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_ycbcr_2plane_444_formats
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT: {
+            marshal_VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_fragment_density_map2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT: {
+            marshal_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT:
-        {
-            marshal_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT: {
+            marshal_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_QCOM_rotated_copy_commands
-        case VK_STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM:
-        {
-            marshal_VkCopyCommandTransformInfoQCOM(vkStream, rootType, reinterpret_cast<const VkCopyCommandTransformInfoQCOM*>(structExtension));
+        case VK_STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM: {
+            marshal_VkCopyCommandTransformInfoQCOM(
+                vkStream, rootType,
+                reinterpret_cast<const VkCopyCommandTransformInfoQCOM*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_image_robustness
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDeviceImageRobustnessFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceImageRobustnessFeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT: {
+            marshal_VkPhysicalDeviceImageRobustnessFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceImageRobustnessFeaturesEXT*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_4444_formats
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDevice4444FormatsFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDevice4444FormatsFeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT: {
+            marshal_VkPhysicalDevice4444FormatsFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDevice4444FormatsFeaturesEXT*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_rgba10x6_formats
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT: {
+            marshal_VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_VALVE_mutable_descriptor_type
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE:
-        {
-            marshal_VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE: {
+            marshal_VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE:
-        {
-            marshal_VkMutableDescriptorTypeCreateInfoVALVE(vkStream, rootType, reinterpret_cast<const VkMutableDescriptorTypeCreateInfoVALVE*>(structExtension));
+        case VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE: {
+            marshal_VkMutableDescriptorTypeCreateInfoVALVE(
+                vkStream, rootType,
+                reinterpret_cast<const VkMutableDescriptorTypeCreateInfoVALVE*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_vertex_input_dynamic_state
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT: {
+            marshal_VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_physical_device_drm
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRM_PROPERTIES_EXT:
-        {
-            marshal_VkPhysicalDeviceDrmPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceDrmPropertiesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRM_PROPERTIES_EXT: {
+            marshal_VkPhysicalDeviceDrmPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceDrmPropertiesEXT*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_primitive_topology_list_restart
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT: {
+            marshal_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_FUCHSIA_external_memory
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA:
-        {
-            marshal_VkImportMemoryZirconHandleInfoFUCHSIA(vkStream, rootType, reinterpret_cast<const VkImportMemoryZirconHandleInfoFUCHSIA*>(structExtension));
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA: {
+            marshal_VkImportMemoryZirconHandleInfoFUCHSIA(
+                vkStream, rootType,
+                reinterpret_cast<const VkImportMemoryZirconHandleInfoFUCHSIA*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA:
-        {
-            marshal_VkImportMemoryBufferCollectionFUCHSIA(vkStream, rootType, reinterpret_cast<const VkImportMemoryBufferCollectionFUCHSIA*>(structExtension));
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA: {
+            marshal_VkImportMemoryBufferCollectionFUCHSIA(
+                vkStream, rootType,
+                reinterpret_cast<const VkImportMemoryBufferCollectionFUCHSIA*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA:
-        {
-            marshal_VkBufferCollectionImageCreateInfoFUCHSIA(vkStream, rootType, reinterpret_cast<const VkBufferCollectionImageCreateInfoFUCHSIA*>(structExtension));
+        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA: {
+            marshal_VkBufferCollectionImageCreateInfoFUCHSIA(
+                vkStream, rootType,
+                reinterpret_cast<const VkBufferCollectionImageCreateInfoFUCHSIA*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_BUFFER_CREATE_INFO_FUCHSIA:
-        {
-            marshal_VkBufferCollectionBufferCreateInfoFUCHSIA(vkStream, rootType, reinterpret_cast<const VkBufferCollectionBufferCreateInfoFUCHSIA*>(structExtension));
+        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_BUFFER_CREATE_INFO_FUCHSIA: {
+            marshal_VkBufferCollectionBufferCreateInfoFUCHSIA(
+                vkStream, rootType,
+                reinterpret_cast<const VkBufferCollectionBufferCreateInfoFUCHSIA*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_HUAWEI_subpass_shading
-        case VK_STRUCTURE_TYPE_SUBPASS_SHADING_PIPELINE_CREATE_INFO_HUAWEI:
-        {
-            marshal_VkSubpassShadingPipelineCreateInfoHUAWEI(vkStream, rootType, reinterpret_cast<const VkSubpassShadingPipelineCreateInfoHUAWEI*>(structExtension));
+        case VK_STRUCTURE_TYPE_SUBPASS_SHADING_PIPELINE_CREATE_INFO_HUAWEI: {
+            marshal_VkSubpassShadingPipelineCreateInfoHUAWEI(
+                vkStream, rootType,
+                reinterpret_cast<const VkSubpassShadingPipelineCreateInfoHUAWEI*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI:
-        {
-            marshal_VkPhysicalDeviceSubpassShadingFeaturesHUAWEI(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceSubpassShadingFeaturesHUAWEI*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI: {
+            marshal_VkPhysicalDeviceSubpassShadingFeaturesHUAWEI(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceSubpassShadingFeaturesHUAWEI*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_PROPERTIES_HUAWEI:
-        {
-            marshal_VkPhysicalDeviceSubpassShadingPropertiesHUAWEI(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceSubpassShadingPropertiesHUAWEI*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_PROPERTIES_HUAWEI: {
+            marshal_VkPhysicalDeviceSubpassShadingPropertiesHUAWEI(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceSubpassShadingPropertiesHUAWEI*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_HUAWEI_invocation_mask
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI:
-        {
-            marshal_VkPhysicalDeviceInvocationMaskFeaturesHUAWEI(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceInvocationMaskFeaturesHUAWEI*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI: {
+            marshal_VkPhysicalDeviceInvocationMaskFeaturesHUAWEI(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceInvocationMaskFeaturesHUAWEI*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_NV_external_memory_rdma
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV:
-        {
-            marshal_VkPhysicalDeviceExternalMemoryRDMAFeaturesNV(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceExternalMemoryRDMAFeaturesNV*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV: {
+            marshal_VkPhysicalDeviceExternalMemoryRDMAFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceExternalMemoryRDMAFeaturesNV*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDeviceExtendedDynamicState2FeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceExtendedDynamicState2FeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT: {
+            marshal_VkPhysicalDeviceExtendedDynamicState2FeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceExtendedDynamicState2FeaturesEXT*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_color_write_enable
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDeviceColorWriteEnableFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceColorWriteEnableFeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT: {
+            marshal_VkPhysicalDeviceColorWriteEnableFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceColorWriteEnableFeaturesEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_WRITE_CREATE_INFO_EXT:
-        {
-            marshal_VkPipelineColorWriteCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkPipelineColorWriteCreateInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_WRITE_CREATE_INFO_EXT: {
+            marshal_VkPipelineColorWriteCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPipelineColorWriteCreateInfoEXT*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_GOOGLE_gfxstream
-        case VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE:
-        {
-            marshal_VkImportColorBufferGOOGLE(vkStream, rootType, reinterpret_cast<const VkImportColorBufferGOOGLE*>(structExtension));
+        case VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE: {
+            marshal_VkImportColorBufferGOOGLE(
+                vkStream, rootType,
+                reinterpret_cast<const VkImportColorBufferGOOGLE*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE:
-        {
-            marshal_VkImportBufferGOOGLE(vkStream, rootType, reinterpret_cast<const VkImportBufferGOOGLE*>(structExtension));
+        case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE: {
+            marshal_VkImportBufferGOOGLE(
+                vkStream, rootType, reinterpret_cast<const VkImportBufferGOOGLE*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE:
-        {
-            marshal_VkImportPhysicalAddressGOOGLE(vkStream, rootType, reinterpret_cast<const VkImportPhysicalAddressGOOGLE*>(structExtension));
+        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE: {
+            marshal_VkImportPhysicalAddressGOOGLE(
+                vkStream, rootType,
+                reinterpret_cast<const VkImportPhysicalAddressGOOGLE*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_global_priority_query
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT: {
+            marshal_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_EXT:
-        {
-            marshal_VkQueueFamilyGlobalPriorityPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkQueueFamilyGlobalPriorityPropertiesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_EXT: {
+            marshal_VkQueueFamilyGlobalPriorityPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkQueueFamilyGlobalPriorityPropertiesEXT*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_multi_draw
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDeviceMultiDrawFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceMultiDrawFeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT: {
+            marshal_VkPhysicalDeviceMultiDrawFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceMultiDrawFeaturesEXT*>(structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT:
-        {
-            marshal_VkPhysicalDeviceMultiDrawPropertiesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceMultiDrawPropertiesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT: {
+            marshal_VkPhysicalDeviceMultiDrawPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceMultiDrawPropertiesEXT*>(structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_border_color_swizzle
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDeviceBorderColorSwizzleFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceBorderColorSwizzleFeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT: {
+            marshal_VkPhysicalDeviceBorderColorSwizzleFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceBorderColorSwizzleFeaturesEXT*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_BORDER_COLOR_COMPONENT_MAPPING_CREATE_INFO_EXT:
-        {
-            marshal_VkSamplerBorderColorComponentMappingCreateInfoEXT(vkStream, rootType, reinterpret_cast<const VkSamplerBorderColorComponentMappingCreateInfoEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_SAMPLER_BORDER_COLOR_COMPONENT_MAPPING_CREATE_INFO_EXT: {
+            marshal_VkSamplerBorderColorComponentMappingCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkSamplerBorderColorComponentMappingCreateInfoEXT*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_EXT_pageable_device_local_memory
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT:
-        {
-            marshal_VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT(vkStream, rootType, reinterpret_cast<const VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT: {
+            marshal_VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_KHR_acceleration_structure
-        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR:
-        {
-            marshal_VkWriteDescriptorSetAccelerationStructureKHR(vkStream, rootType, reinterpret_cast<const VkWriteDescriptorSetAccelerationStructureKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR: {
+            marshal_VkWriteDescriptorSetAccelerationStructureKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkWriteDescriptorSetAccelerationStructureKHR*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR:
-        {
-            marshal_VkPhysicalDeviceAccelerationStructureFeaturesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceAccelerationStructureFeaturesKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR: {
+            marshal_VkPhysicalDeviceAccelerationStructureFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceAccelerationStructureFeaturesKHR*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR:
-        {
-            marshal_VkPhysicalDeviceAccelerationStructurePropertiesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceAccelerationStructurePropertiesKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR: {
+            marshal_VkPhysicalDeviceAccelerationStructurePropertiesKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceAccelerationStructurePropertiesKHR*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR:
-        {
-            marshal_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceRayTracingPipelineFeaturesKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR: {
+            marshal_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceRayTracingPipelineFeaturesKHR*>(
+                    structExtension));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR:
-        {
-            marshal_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceRayTracingPipelinePropertiesKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR: {
+            marshal_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceRayTracingPipelinePropertiesKHR*>(
+                    structExtension));
             break;
         }
 #endif
 #ifdef VK_KHR_ray_query
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR:
-        {
-            marshal_VkPhysicalDeviceRayQueryFeaturesKHR(vkStream, rootType, reinterpret_cast<const VkPhysicalDeviceRayQueryFeaturesKHR*>(structExtension));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR: {
+            marshal_VkPhysicalDeviceRayQueryFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<const VkPhysicalDeviceRayQueryFeaturesKHR*>(structExtension));
             break;
         }
 #endif
-        default:
-        {
+        default: {
             // fatal; the switch is only taken if the extension struct is known
             abort();
         }
     }
 }
 
-void unmarshal_extension_struct(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    void* structExtension_out)
-{
+void unmarshal_extension_struct(VulkanStream* vkStream, VkStructureType rootType,
+                                void* structExtension_out) {
     VkInstanceCreateInfo* structAccess = (VkInstanceCreateInfo*)(structExtension_out);
-    size_t currExtSize = goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, structExtension_out);
-    if (!currExtSize && structExtension_out)
-    {
+    size_t currExtSize = goldfish_vk_extension_struct_size_with_stream_features(
+        vkStream->getFeatureBits(), rootType, structExtension_out);
+    if (!currExtSize && structExtension_out) {
         // unknown struct extension; skip and call on its pNext field
         unmarshal_extension_struct(vkStream, rootType, (void*)structAccess->pNext);
         return;
-    }
-    else
-    {
+    } else {
         // known or null extension struct
-        if (!currExtSize)
-        {
+        if (!currExtSize) {
             // exit if this was a null extension struct (size == 0 in this branch)
             return;
         }
     }
-    if (!structExtension_out)
-    {
+    if (!structExtension_out) {
         return;
     }
     uint32_t structType = (uint32_t)goldfish_vk_struct_type(structExtension_out);
-    switch(structType)
-    {
+    switch (structType) {
 #ifdef VK_VERSION_1_1
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES:
-        {
-            unmarshal_VkPhysicalDeviceSubgroupProperties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceSubgroupProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES: {
+            unmarshal_VkPhysicalDeviceSubgroupProperties(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceSubgroupProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES:
-        {
-            unmarshal_VkPhysicalDevice16BitStorageFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDevice16BitStorageFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES: {
+            unmarshal_VkPhysicalDevice16BitStorageFeatures(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDevice16BitStorageFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS:
-        {
-            unmarshal_VkMemoryDedicatedRequirements(vkStream, rootType, reinterpret_cast<VkMemoryDedicatedRequirements*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS: {
+            unmarshal_VkMemoryDedicatedRequirements(
+                vkStream, rootType,
+                reinterpret_cast<VkMemoryDedicatedRequirements*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO:
-        {
-            unmarshal_VkMemoryDedicatedAllocateInfo(vkStream, rootType, reinterpret_cast<VkMemoryDedicatedAllocateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO: {
+            unmarshal_VkMemoryDedicatedAllocateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkMemoryDedicatedAllocateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO:
-        {
-            unmarshal_VkMemoryAllocateFlagsInfo(vkStream, rootType, reinterpret_cast<VkMemoryAllocateFlagsInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO: {
+            unmarshal_VkMemoryAllocateFlagsInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkMemoryAllocateFlagsInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO:
-        {
-            unmarshal_VkDeviceGroupRenderPassBeginInfo(vkStream, rootType, reinterpret_cast<VkDeviceGroupRenderPassBeginInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO: {
+            unmarshal_VkDeviceGroupRenderPassBeginInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkDeviceGroupRenderPassBeginInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO:
-        {
-            unmarshal_VkDeviceGroupCommandBufferBeginInfo(vkStream, rootType, reinterpret_cast<VkDeviceGroupCommandBufferBeginInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO: {
+            unmarshal_VkDeviceGroupCommandBufferBeginInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkDeviceGroupCommandBufferBeginInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO:
-        {
-            unmarshal_VkDeviceGroupSubmitInfo(vkStream, rootType, reinterpret_cast<VkDeviceGroupSubmitInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO: {
+            unmarshal_VkDeviceGroupSubmitInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkDeviceGroupSubmitInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO:
-        {
-            unmarshal_VkDeviceGroupBindSparseInfo(vkStream, rootType, reinterpret_cast<VkDeviceGroupBindSparseInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO: {
+            unmarshal_VkDeviceGroupBindSparseInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkDeviceGroupBindSparseInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO:
-        {
-            unmarshal_VkBindBufferMemoryDeviceGroupInfo(vkStream, rootType, reinterpret_cast<VkBindBufferMemoryDeviceGroupInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO: {
+            unmarshal_VkBindBufferMemoryDeviceGroupInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkBindBufferMemoryDeviceGroupInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO:
-        {
-            unmarshal_VkBindImageMemoryDeviceGroupInfo(vkStream, rootType, reinterpret_cast<VkBindImageMemoryDeviceGroupInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO: {
+            unmarshal_VkBindImageMemoryDeviceGroupInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkBindImageMemoryDeviceGroupInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO:
-        {
-            unmarshal_VkDeviceGroupDeviceCreateInfo(vkStream, rootType, reinterpret_cast<VkDeviceGroupDeviceCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO: {
+            unmarshal_VkDeviceGroupDeviceCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkDeviceGroupDeviceCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2:
-        {
-            unmarshal_VkPhysicalDeviceFeatures2(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceFeatures2*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2: {
+            unmarshal_VkPhysicalDeviceFeatures2(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceFeatures2*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES:
-        {
-            unmarshal_VkPhysicalDevicePointClippingProperties(vkStream, rootType, reinterpret_cast<VkPhysicalDevicePointClippingProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES: {
+            unmarshal_VkPhysicalDevicePointClippingProperties(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDevicePointClippingProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO:
-        {
-            unmarshal_VkRenderPassInputAttachmentAspectCreateInfo(vkStream, rootType, reinterpret_cast<VkRenderPassInputAttachmentAspectCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO: {
+            unmarshal_VkRenderPassInputAttachmentAspectCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkRenderPassInputAttachmentAspectCreateInfo*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO:
-        {
-            unmarshal_VkImageViewUsageCreateInfo(vkStream, rootType, reinterpret_cast<VkImageViewUsageCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO: {
+            unmarshal_VkImageViewUsageCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkImageViewUsageCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO:
-        {
-            unmarshal_VkPipelineTessellationDomainOriginStateCreateInfo(vkStream, rootType, reinterpret_cast<VkPipelineTessellationDomainOriginStateCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO: {
+            unmarshal_VkPipelineTessellationDomainOriginStateCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineTessellationDomainOriginStateCreateInfo*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO:
-        {
-            unmarshal_VkRenderPassMultiviewCreateInfo(vkStream, rootType, reinterpret_cast<VkRenderPassMultiviewCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO: {
+            unmarshal_VkRenderPassMultiviewCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkRenderPassMultiviewCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES:
-        {
-            unmarshal_VkPhysicalDeviceMultiviewFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceMultiviewFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES: {
+            unmarshal_VkPhysicalDeviceMultiviewFeatures(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceMultiviewFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES:
-        {
-            unmarshal_VkPhysicalDeviceMultiviewProperties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceMultiviewProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES: {
+            unmarshal_VkPhysicalDeviceMultiviewProperties(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceMultiviewProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES:
-        {
-            unmarshal_VkPhysicalDeviceVariablePointersFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceVariablePointersFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES: {
+            unmarshal_VkPhysicalDeviceVariablePointersFeatures(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceVariablePointersFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES:
-        {
-            unmarshal_VkPhysicalDeviceProtectedMemoryFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceProtectedMemoryFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES: {
+            unmarshal_VkPhysicalDeviceProtectedMemoryFeatures(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceProtectedMemoryFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES:
-        {
-            unmarshal_VkPhysicalDeviceProtectedMemoryProperties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceProtectedMemoryProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES: {
+            unmarshal_VkPhysicalDeviceProtectedMemoryProperties(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceProtectedMemoryProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO:
-        {
-            unmarshal_VkProtectedSubmitInfo(vkStream, rootType, reinterpret_cast<VkProtectedSubmitInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO: {
+            unmarshal_VkProtectedSubmitInfo(
+                vkStream, rootType, reinterpret_cast<VkProtectedSubmitInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO:
-        {
-            unmarshal_VkSamplerYcbcrConversionInfo(vkStream, rootType, reinterpret_cast<VkSamplerYcbcrConversionInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO: {
+            unmarshal_VkSamplerYcbcrConversionInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkSamplerYcbcrConversionInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO:
-        {
-            unmarshal_VkBindImagePlaneMemoryInfo(vkStream, rootType, reinterpret_cast<VkBindImagePlaneMemoryInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO: {
+            unmarshal_VkBindImagePlaneMemoryInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkBindImagePlaneMemoryInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO:
-        {
-            unmarshal_VkImagePlaneMemoryRequirementsInfo(vkStream, rootType, reinterpret_cast<VkImagePlaneMemoryRequirementsInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO: {
+            unmarshal_VkImagePlaneMemoryRequirementsInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkImagePlaneMemoryRequirementsInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES:
-        {
-            unmarshal_VkPhysicalDeviceSamplerYcbcrConversionFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES: {
+            unmarshal_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES:
-        {
-            unmarshal_VkSamplerYcbcrConversionImageFormatProperties(vkStream, rootType, reinterpret_cast<VkSamplerYcbcrConversionImageFormatProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES: {
+            unmarshal_VkSamplerYcbcrConversionImageFormatProperties(
+                vkStream, rootType,
+                reinterpret_cast<VkSamplerYcbcrConversionImageFormatProperties*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO:
-        {
-            unmarshal_VkPhysicalDeviceExternalImageFormatInfo(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceExternalImageFormatInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO: {
+            unmarshal_VkPhysicalDeviceExternalImageFormatInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceExternalImageFormatInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES:
-        {
-            unmarshal_VkExternalImageFormatProperties(vkStream, rootType, reinterpret_cast<VkExternalImageFormatProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES: {
+            unmarshal_VkExternalImageFormatProperties(
+                vkStream, rootType,
+                reinterpret_cast<VkExternalImageFormatProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES:
-        {
-            unmarshal_VkPhysicalDeviceIDProperties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceIDProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES: {
+            unmarshal_VkPhysicalDeviceIDProperties(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceIDProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO:
-        {
-            unmarshal_VkExternalMemoryImageCreateInfo(vkStream, rootType, reinterpret_cast<VkExternalMemoryImageCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO: {
+            unmarshal_VkExternalMemoryImageCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkExternalMemoryImageCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO:
-        {
-            unmarshal_VkExternalMemoryBufferCreateInfo(vkStream, rootType, reinterpret_cast<VkExternalMemoryBufferCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO: {
+            unmarshal_VkExternalMemoryBufferCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkExternalMemoryBufferCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO:
-        {
-            unmarshal_VkExportMemoryAllocateInfo(vkStream, rootType, reinterpret_cast<VkExportMemoryAllocateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO: {
+            unmarshal_VkExportMemoryAllocateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkExportMemoryAllocateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO:
-        {
-            unmarshal_VkExportFenceCreateInfo(vkStream, rootType, reinterpret_cast<VkExportFenceCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO: {
+            unmarshal_VkExportFenceCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkExportFenceCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO:
-        {
-            unmarshal_VkExportSemaphoreCreateInfo(vkStream, rootType, reinterpret_cast<VkExportSemaphoreCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO: {
+            unmarshal_VkExportSemaphoreCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkExportSemaphoreCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES:
-        {
-            unmarshal_VkPhysicalDeviceMaintenance3Properties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceMaintenance3Properties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES: {
+            unmarshal_VkPhysicalDeviceMaintenance3Properties(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceMaintenance3Properties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES:
-        {
-            unmarshal_VkPhysicalDeviceShaderDrawParametersFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderDrawParametersFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES: {
+            unmarshal_VkPhysicalDeviceShaderDrawParametersFeatures(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderDrawParametersFeatures*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_VERSION_1_2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES:
-        {
-            unmarshal_VkPhysicalDeviceVulkan11Features(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceVulkan11Features*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: {
+            unmarshal_VkPhysicalDeviceVulkan11Features(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceVulkan11Features*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES:
-        {
-            unmarshal_VkPhysicalDeviceVulkan11Properties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceVulkan11Properties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: {
+            unmarshal_VkPhysicalDeviceVulkan11Properties(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceVulkan11Properties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES:
-        {
-            unmarshal_VkPhysicalDeviceVulkan12Features(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceVulkan12Features*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: {
+            unmarshal_VkPhysicalDeviceVulkan12Features(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceVulkan12Features*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES:
-        {
-            unmarshal_VkPhysicalDeviceVulkan12Properties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceVulkan12Properties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: {
+            unmarshal_VkPhysicalDeviceVulkan12Properties(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceVulkan12Properties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO:
-        {
-            unmarshal_VkImageFormatListCreateInfo(vkStream, rootType, reinterpret_cast<VkImageFormatListCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO: {
+            unmarshal_VkImageFormatListCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkImageFormatListCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES:
-        {
-            unmarshal_VkPhysicalDevice8BitStorageFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDevice8BitStorageFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES: {
+            unmarshal_VkPhysicalDevice8BitStorageFeatures(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDevice8BitStorageFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES:
-        {
-            unmarshal_VkPhysicalDeviceDriverProperties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceDriverProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES: {
+            unmarshal_VkPhysicalDeviceDriverProperties(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceDriverProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES:
-        {
-            unmarshal_VkPhysicalDeviceShaderAtomicInt64Features(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderAtomicInt64Features*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES: {
+            unmarshal_VkPhysicalDeviceShaderAtomicInt64Features(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderAtomicInt64Features*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES:
-        {
-            unmarshal_VkPhysicalDeviceShaderFloat16Int8Features(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderFloat16Int8Features*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES: {
+            unmarshal_VkPhysicalDeviceShaderFloat16Int8Features(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderFloat16Int8Features*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES:
-        {
-            unmarshal_VkPhysicalDeviceFloatControlsProperties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceFloatControlsProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES: {
+            unmarshal_VkPhysicalDeviceFloatControlsProperties(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceFloatControlsProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO:
-        {
-            unmarshal_VkDescriptorSetLayoutBindingFlagsCreateInfo(vkStream, rootType, reinterpret_cast<VkDescriptorSetLayoutBindingFlagsCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO: {
+            unmarshal_VkDescriptorSetLayoutBindingFlagsCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkDescriptorSetLayoutBindingFlagsCreateInfo*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES:
-        {
-            unmarshal_VkPhysicalDeviceDescriptorIndexingFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceDescriptorIndexingFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES: {
+            unmarshal_VkPhysicalDeviceDescriptorIndexingFeatures(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceDescriptorIndexingFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES:
-        {
-            unmarshal_VkPhysicalDeviceDescriptorIndexingProperties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceDescriptorIndexingProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES: {
+            unmarshal_VkPhysicalDeviceDescriptorIndexingProperties(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceDescriptorIndexingProperties*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO:
-        {
-            unmarshal_VkDescriptorSetVariableDescriptorCountAllocateInfo(vkStream, rootType, reinterpret_cast<VkDescriptorSetVariableDescriptorCountAllocateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO: {
+            unmarshal_VkDescriptorSetVariableDescriptorCountAllocateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkDescriptorSetVariableDescriptorCountAllocateInfo*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT:
-        {
-            unmarshal_VkDescriptorSetVariableDescriptorCountLayoutSupport(vkStream, rootType, reinterpret_cast<VkDescriptorSetVariableDescriptorCountLayoutSupport*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT: {
+            unmarshal_VkDescriptorSetVariableDescriptorCountLayoutSupport(
+                vkStream, rootType,
+                reinterpret_cast<VkDescriptorSetVariableDescriptorCountLayoutSupport*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE:
-        {
-            unmarshal_VkSubpassDescriptionDepthStencilResolve(vkStream, rootType, reinterpret_cast<VkSubpassDescriptionDepthStencilResolve*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE: {
+            unmarshal_VkSubpassDescriptionDepthStencilResolve(
+                vkStream, rootType,
+                reinterpret_cast<VkSubpassDescriptionDepthStencilResolve*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES:
-        {
-            unmarshal_VkPhysicalDeviceDepthStencilResolveProperties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceDepthStencilResolveProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES: {
+            unmarshal_VkPhysicalDeviceDepthStencilResolveProperties(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceDepthStencilResolveProperties*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES:
-        {
-            unmarshal_VkPhysicalDeviceScalarBlockLayoutFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceScalarBlockLayoutFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES: {
+            unmarshal_VkPhysicalDeviceScalarBlockLayoutFeatures(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceScalarBlockLayoutFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO:
-        {
-            unmarshal_VkImageStencilUsageCreateInfo(vkStream, rootType, reinterpret_cast<VkImageStencilUsageCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO: {
+            unmarshal_VkImageStencilUsageCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkImageStencilUsageCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO:
-        {
-            unmarshal_VkSamplerReductionModeCreateInfo(vkStream, rootType, reinterpret_cast<VkSamplerReductionModeCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO: {
+            unmarshal_VkSamplerReductionModeCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkSamplerReductionModeCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES:
-        {
-            unmarshal_VkPhysicalDeviceSamplerFilterMinmaxProperties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceSamplerFilterMinmaxProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES: {
+            unmarshal_VkPhysicalDeviceSamplerFilterMinmaxProperties(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceSamplerFilterMinmaxProperties*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES:
-        {
-            unmarshal_VkPhysicalDeviceVulkanMemoryModelFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceVulkanMemoryModelFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES: {
+            unmarshal_VkPhysicalDeviceVulkanMemoryModelFeatures(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceVulkanMemoryModelFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES:
-        {
-            unmarshal_VkPhysicalDeviceImagelessFramebufferFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceImagelessFramebufferFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES: {
+            unmarshal_VkPhysicalDeviceImagelessFramebufferFeatures(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceImagelessFramebufferFeatures*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO:
-        {
-            unmarshal_VkFramebufferAttachmentsCreateInfo(vkStream, rootType, reinterpret_cast<VkFramebufferAttachmentsCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO: {
+            unmarshal_VkFramebufferAttachmentsCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkFramebufferAttachmentsCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO:
-        {
-            unmarshal_VkRenderPassAttachmentBeginInfo(vkStream, rootType, reinterpret_cast<VkRenderPassAttachmentBeginInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO: {
+            unmarshal_VkRenderPassAttachmentBeginInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkRenderPassAttachmentBeginInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES:
-        {
-            unmarshal_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceUniformBufferStandardLayoutFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES: {
+            unmarshal_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceUniformBufferStandardLayoutFeatures*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES:
-        {
-            unmarshal_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES: {
+            unmarshal_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES:
-        {
-            unmarshal_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES: {
+            unmarshal_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT:
-        {
-            unmarshal_VkAttachmentReferenceStencilLayout(vkStream, rootType, reinterpret_cast<VkAttachmentReferenceStencilLayout*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT: {
+            unmarshal_VkAttachmentReferenceStencilLayout(
+                vkStream, rootType,
+                reinterpret_cast<VkAttachmentReferenceStencilLayout*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT:
-        {
-            unmarshal_VkAttachmentDescriptionStencilLayout(vkStream, rootType, reinterpret_cast<VkAttachmentDescriptionStencilLayout*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT: {
+            unmarshal_VkAttachmentDescriptionStencilLayout(
+                vkStream, rootType,
+                reinterpret_cast<VkAttachmentDescriptionStencilLayout*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES:
-        {
-            unmarshal_VkPhysicalDeviceHostQueryResetFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceHostQueryResetFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES: {
+            unmarshal_VkPhysicalDeviceHostQueryResetFeatures(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceHostQueryResetFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES:
-        {
-            unmarshal_VkPhysicalDeviceTimelineSemaphoreFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceTimelineSemaphoreFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES: {
+            unmarshal_VkPhysicalDeviceTimelineSemaphoreFeatures(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceTimelineSemaphoreFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES:
-        {
-            unmarshal_VkPhysicalDeviceTimelineSemaphoreProperties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceTimelineSemaphoreProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES: {
+            unmarshal_VkPhysicalDeviceTimelineSemaphoreProperties(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceTimelineSemaphoreProperties*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO:
-        {
-            unmarshal_VkSemaphoreTypeCreateInfo(vkStream, rootType, reinterpret_cast<VkSemaphoreTypeCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO: {
+            unmarshal_VkSemaphoreTypeCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkSemaphoreTypeCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO:
-        {
-            unmarshal_VkTimelineSemaphoreSubmitInfo(vkStream, rootType, reinterpret_cast<VkTimelineSemaphoreSubmitInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO: {
+            unmarshal_VkTimelineSemaphoreSubmitInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkTimelineSemaphoreSubmitInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES:
-        {
-            unmarshal_VkPhysicalDeviceBufferDeviceAddressFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceBufferDeviceAddressFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES: {
+            unmarshal_VkPhysicalDeviceBufferDeviceAddressFeatures(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceBufferDeviceAddressFeatures*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO:
-        {
-            unmarshal_VkBufferOpaqueCaptureAddressCreateInfo(vkStream, rootType, reinterpret_cast<VkBufferOpaqueCaptureAddressCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO: {
+            unmarshal_VkBufferOpaqueCaptureAddressCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkBufferOpaqueCaptureAddressCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO:
-        {
-            unmarshal_VkMemoryOpaqueCaptureAddressAllocateInfo(vkStream, rootType, reinterpret_cast<VkMemoryOpaqueCaptureAddressAllocateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO: {
+            unmarshal_VkMemoryOpaqueCaptureAddressAllocateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkMemoryOpaqueCaptureAddressAllocateInfo*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_swapchain
-        case VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR:
-        {
-            unmarshal_VkImageSwapchainCreateInfoKHR(vkStream, rootType, reinterpret_cast<VkImageSwapchainCreateInfoKHR*>(structExtension_out));
+        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));
+        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));
+        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));
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR: {
+            unmarshal_VkDeviceGroupSwapchainCreateInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkDeviceGroupSwapchainCreateInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_display_swapchain
-        case VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR:
-        {
-            unmarshal_VkDisplayPresentInfoKHR(vkStream, rootType, reinterpret_cast<VkDisplayPresentInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR: {
+            unmarshal_VkDisplayPresentInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkDisplayPresentInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_video_queue
-        case VK_STRUCTURE_TYPE_VIDEO_QUEUE_FAMILY_PROPERTIES_2_KHR:
-        {
-            unmarshal_VkVideoQueueFamilyProperties2KHR(vkStream, rootType, reinterpret_cast<VkVideoQueueFamilyProperties2KHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_QUEUE_FAMILY_PROPERTIES_2_KHR: {
+            unmarshal_VkVideoQueueFamilyProperties2KHR(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoQueueFamilyProperties2KHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_PROFILE_KHR:
-        {
-            unmarshal_VkVideoProfileKHR(vkStream, rootType, reinterpret_cast<VkVideoProfileKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_PROFILE_KHR: {
+            unmarshal_VkVideoProfileKHR(vkStream, rootType,
+                                        reinterpret_cast<VkVideoProfileKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_PROFILES_KHR:
-        {
-            unmarshal_VkVideoProfilesKHR(vkStream, rootType, reinterpret_cast<VkVideoProfilesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_PROFILES_KHR: {
+            unmarshal_VkVideoProfilesKHR(
+                vkStream, rootType, reinterpret_cast<VkVideoProfilesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_dynamic_rendering
-        case VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR:
-        {
-            unmarshal_VkPipelineRenderingCreateInfoKHR(vkStream, rootType, reinterpret_cast<VkPipelineRenderingCreateInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR: {
+            unmarshal_VkPipelineRenderingCreateInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineRenderingCreateInfoKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES_KHR:
-        {
-            unmarshal_VkPhysicalDeviceDynamicRenderingFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceDynamicRenderingFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES_KHR: {
+            unmarshal_VkPhysicalDeviceDynamicRenderingFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceDynamicRenderingFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR:
-        {
-            unmarshal_VkCommandBufferInheritanceRenderingInfoKHR(vkStream, rootType, reinterpret_cast<VkCommandBufferInheritanceRenderingInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR: {
+            unmarshal_VkCommandBufferInheritanceRenderingInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkCommandBufferInheritanceRenderingInfoKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR:
-        {
-            unmarshal_VkRenderingFragmentShadingRateAttachmentInfoKHR(vkStream, rootType, reinterpret_cast<VkRenderingFragmentShadingRateAttachmentInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR: {
+            unmarshal_VkRenderingFragmentShadingRateAttachmentInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkRenderingFragmentShadingRateAttachmentInfoKHR*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_INFO_EXT:
-        {
-            unmarshal_VkRenderingFragmentDensityMapAttachmentInfoEXT(vkStream, rootType, reinterpret_cast<VkRenderingFragmentDensityMapAttachmentInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_INFO_EXT: {
+            unmarshal_VkRenderingFragmentDensityMapAttachmentInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkRenderingFragmentDensityMapAttachmentInfoEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_ATTACHMENT_SAMPLE_COUNT_INFO_AMD:
-        {
-            unmarshal_VkAttachmentSampleCountInfoAMD(vkStream, rootType, reinterpret_cast<VkAttachmentSampleCountInfoAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ATTACHMENT_SAMPLE_COUNT_INFO_AMD: {
+            unmarshal_VkAttachmentSampleCountInfoAMD(
+                vkStream, rootType,
+                reinterpret_cast<VkAttachmentSampleCountInfoAMD*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_MULTIVIEW_PER_VIEW_ATTRIBUTES_INFO_NVX:
-        {
-            unmarshal_VkMultiviewPerViewAttributesInfoNVX(vkStream, rootType, reinterpret_cast<VkMultiviewPerViewAttributesInfoNVX*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MULTIVIEW_PER_VIEW_ATTRIBUTES_INFO_NVX: {
+            unmarshal_VkMultiviewPerViewAttributesInfoNVX(
+                vkStream, rootType,
+                reinterpret_cast<VkMultiviewPerViewAttributesInfoNVX*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_external_memory_win32
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
-        {
-            unmarshal_VkImportMemoryWin32HandleInfoKHR(vkStream, rootType, reinterpret_cast<VkImportMemoryWin32HandleInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR: {
+            unmarshal_VkImportMemoryWin32HandleInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkImportMemoryWin32HandleInfoKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
-        {
-            unmarshal_VkExportMemoryWin32HandleInfoKHR(vkStream, rootType, reinterpret_cast<VkExportMemoryWin32HandleInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR: {
+            unmarshal_VkExportMemoryWin32HandleInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkExportMemoryWin32HandleInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_external_memory_fd
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR:
-        {
-            unmarshal_VkImportMemoryFdInfoKHR(vkStream, rootType, reinterpret_cast<VkImportMemoryFdInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR: {
+            unmarshal_VkImportMemoryFdInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkImportMemoryFdInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_win32_keyed_mutex
-        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR:
-        {
-            unmarshal_VkWin32KeyedMutexAcquireReleaseInfoKHR(vkStream, rootType, reinterpret_cast<VkWin32KeyedMutexAcquireReleaseInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR: {
+            unmarshal_VkWin32KeyedMutexAcquireReleaseInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkWin32KeyedMutexAcquireReleaseInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_external_semaphore_win32
-        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR:
-        {
-            unmarshal_VkExportSemaphoreWin32HandleInfoKHR(vkStream, rootType, reinterpret_cast<VkExportSemaphoreWin32HandleInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR: {
+            unmarshal_VkExportSemaphoreWin32HandleInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkExportSemaphoreWin32HandleInfoKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR:
-        {
-            unmarshal_VkD3D12FenceSubmitInfoKHR(vkStream, rootType, reinterpret_cast<VkD3D12FenceSubmitInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR: {
+            unmarshal_VkD3D12FenceSubmitInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkD3D12FenceSubmitInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_push_descriptor
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR:
-        {
-            unmarshal_VkPhysicalDevicePushDescriptorPropertiesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDevicePushDescriptorPropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR: {
+            unmarshal_VkPhysicalDevicePushDescriptorPropertiesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDevicePushDescriptorPropertiesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_incremental_present
-        case VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR:
-        {
-            unmarshal_VkPresentRegionsKHR(vkStream, rootType, reinterpret_cast<VkPresentRegionsKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR: {
+            unmarshal_VkPresentRegionsKHR(
+                vkStream, rootType, reinterpret_cast<VkPresentRegionsKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_shared_presentable_image
-        case VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR:
-        {
-            unmarshal_VkSharedPresentSurfaceCapabilitiesKHR(vkStream, rootType, reinterpret_cast<VkSharedPresentSurfaceCapabilitiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR: {
+            unmarshal_VkSharedPresentSurfaceCapabilitiesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkSharedPresentSurfaceCapabilitiesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_external_fence_win32
-        case VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR:
-        {
-            unmarshal_VkExportFenceWin32HandleInfoKHR(vkStream, rootType, reinterpret_cast<VkExportFenceWin32HandleInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR: {
+            unmarshal_VkExportFenceWin32HandleInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkExportFenceWin32HandleInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_performance_query
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR:
-        {
-            unmarshal_VkPhysicalDevicePerformanceQueryFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDevicePerformanceQueryFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR: {
+            unmarshal_VkPhysicalDevicePerformanceQueryFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDevicePerformanceQueryFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR:
-        {
-            unmarshal_VkPhysicalDevicePerformanceQueryPropertiesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDevicePerformanceQueryPropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR: {
+            unmarshal_VkPhysicalDevicePerformanceQueryPropertiesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDevicePerformanceQueryPropertiesKHR*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR:
-        {
-            unmarshal_VkQueryPoolPerformanceCreateInfoKHR(vkStream, rootType, reinterpret_cast<VkQueryPoolPerformanceCreateInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR: {
+            unmarshal_VkQueryPoolPerformanceCreateInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkQueryPoolPerformanceCreateInfoKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR:
-        {
-            unmarshal_VkPerformanceQuerySubmitInfoKHR(vkStream, rootType, reinterpret_cast<VkPerformanceQuerySubmitInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR: {
+            unmarshal_VkPerformanceQuerySubmitInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPerformanceQuerySubmitInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_portability_subset
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR:
-        {
-            unmarshal_VkPhysicalDevicePortabilitySubsetFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDevicePortabilitySubsetFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR: {
+            unmarshal_VkPhysicalDevicePortabilitySubsetFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDevicePortabilitySubsetFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR:
-        {
-            unmarshal_VkPhysicalDevicePortabilitySubsetPropertiesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDevicePortabilitySubsetPropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR: {
+            unmarshal_VkPhysicalDevicePortabilitySubsetPropertiesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDevicePortabilitySubsetPropertiesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_shader_clock
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR:
-        {
-            unmarshal_VkPhysicalDeviceShaderClockFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderClockFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR: {
+            unmarshal_VkPhysicalDeviceShaderClockFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderClockFeaturesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_shader_terminate_invocation
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR:
-        {
-            unmarshal_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR: {
+            unmarshal_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_fragment_shading_rate
-        case VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR:
-        {
-            unmarshal_VkFragmentShadingRateAttachmentInfoKHR(vkStream, rootType, reinterpret_cast<VkFragmentShadingRateAttachmentInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR: {
+            unmarshal_VkFragmentShadingRateAttachmentInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkFragmentShadingRateAttachmentInfoKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR:
-        {
-            unmarshal_VkPipelineFragmentShadingRateStateCreateInfoKHR(vkStream, rootType, reinterpret_cast<VkPipelineFragmentShadingRateStateCreateInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR: {
+            unmarshal_VkPipelineFragmentShadingRateStateCreateInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineFragmentShadingRateStateCreateInfoKHR*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR:
-        {
-            unmarshal_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceFragmentShadingRateFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR: {
+            unmarshal_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceFragmentShadingRateFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR:
-        {
-            unmarshal_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceFragmentShadingRatePropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR: {
+            unmarshal_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceFragmentShadingRatePropertiesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_surface_protected_capabilities
-        case VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR:
-        {
-            unmarshal_VkSurfaceProtectedCapabilitiesKHR(vkStream, rootType, reinterpret_cast<VkSurfaceProtectedCapabilitiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR: {
+            unmarshal_VkSurfaceProtectedCapabilitiesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkSurfaceProtectedCapabilitiesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_present_wait
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR:
-        {
-            unmarshal_VkPhysicalDevicePresentWaitFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDevicePresentWaitFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR: {
+            unmarshal_VkPhysicalDevicePresentWaitFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDevicePresentWaitFeaturesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_pipeline_executable_properties
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR:
-        {
-            unmarshal_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR: {
+            unmarshal_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_shader_integer_dot_product
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR:
-        {
-            unmarshal_VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR: {
+            unmarshal_VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES_KHR:
-        {
-            unmarshal_VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES_KHR: {
+            unmarshal_VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_present_id
-        case VK_STRUCTURE_TYPE_PRESENT_ID_KHR:
-        {
-            unmarshal_VkPresentIdKHR(vkStream, rootType, reinterpret_cast<VkPresentIdKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PRESENT_ID_KHR: {
+            unmarshal_VkPresentIdKHR(vkStream, rootType,
+                                     reinterpret_cast<VkPresentIdKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR:
-        {
-            unmarshal_VkPhysicalDevicePresentIdFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDevicePresentIdFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR: {
+            unmarshal_VkPhysicalDevicePresentIdFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDevicePresentIdFeaturesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_video_encode_queue
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_INFO_KHR:
-        {
-            unmarshal_VkVideoEncodeRateControlInfoKHR(vkStream, rootType, reinterpret_cast<VkVideoEncodeRateControlInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_INFO_KHR: {
+            unmarshal_VkVideoEncodeRateControlInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoEncodeRateControlInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_synchronization2
-        case VK_STRUCTURE_TYPE_MEMORY_BARRIER_2_KHR:
-        {
-            unmarshal_VkMemoryBarrier2KHR(vkStream, rootType, reinterpret_cast<VkMemoryBarrier2KHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MEMORY_BARRIER_2_KHR: {
+            unmarshal_VkMemoryBarrier2KHR(
+                vkStream, rootType, reinterpret_cast<VkMemoryBarrier2KHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR:
-        {
-            unmarshal_VkPhysicalDeviceSynchronization2FeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceSynchronization2FeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR: {
+            unmarshal_VkPhysicalDeviceSynchronization2FeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceSynchronization2FeaturesKHR*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_2_NV:
-        {
-            unmarshal_VkQueueFamilyCheckpointProperties2NV(vkStream, rootType, reinterpret_cast<VkQueueFamilyCheckpointProperties2NV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_2_NV: {
+            unmarshal_VkQueueFamilyCheckpointProperties2NV(
+                vkStream, rootType,
+                reinterpret_cast<VkQueueFamilyCheckpointProperties2NV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_shader_subgroup_uniform_control_flow
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR:
-        {
-            unmarshal_VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR: {
+            unmarshal_VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_zero_initialize_workgroup_memory
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR:
-        {
-            unmarshal_VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR: {
+            unmarshal_VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_workgroup_memory_explicit_layout
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR:
-        {
-            unmarshal_VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR: {
+            unmarshal_VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_format_feature_flags2
-        case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR:
-        {
-            unmarshal_VkFormatProperties3KHR(vkStream, rootType, reinterpret_cast<VkFormatProperties3KHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR: {
+            unmarshal_VkFormatProperties3KHR(
+                vkStream, rootType, reinterpret_cast<VkFormatProperties3KHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_maintenance4
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES_KHR:
-        {
-            unmarshal_VkPhysicalDeviceMaintenance4FeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceMaintenance4FeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES_KHR: {
+            unmarshal_VkPhysicalDeviceMaintenance4FeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceMaintenance4FeaturesKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES_KHR:
-        {
-            unmarshal_VkPhysicalDeviceMaintenance4PropertiesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceMaintenance4PropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES_KHR: {
+            unmarshal_VkPhysicalDeviceMaintenance4PropertiesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceMaintenance4PropertiesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_ANDROID_native_buffer
-        case VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID:
-        {
-            unmarshal_VkNativeBufferANDROID(vkStream, rootType, reinterpret_cast<VkNativeBufferANDROID*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID: {
+            unmarshal_VkNativeBufferANDROID(
+                vkStream, rootType, reinterpret_cast<VkNativeBufferANDROID*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_debug_report
-        case VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT:
-        {
-            unmarshal_VkDebugReportCallbackCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkDebugReportCallbackCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT: {
+            unmarshal_VkDebugReportCallbackCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkDebugReportCallbackCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_rasterization_order
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD:
-        {
-            unmarshal_VkPipelineRasterizationStateRasterizationOrderAMD(vkStream, rootType, reinterpret_cast<VkPipelineRasterizationStateRasterizationOrderAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD: {
+            unmarshal_VkPipelineRasterizationStateRasterizationOrderAMD(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineRasterizationStateRasterizationOrderAMD*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_dedicated_allocation
-        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV:
-        {
-            unmarshal_VkDedicatedAllocationImageCreateInfoNV(vkStream, rootType, reinterpret_cast<VkDedicatedAllocationImageCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV: {
+            unmarshal_VkDedicatedAllocationImageCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkDedicatedAllocationImageCreateInfoNV*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV:
-        {
-            unmarshal_VkDedicatedAllocationBufferCreateInfoNV(vkStream, rootType, reinterpret_cast<VkDedicatedAllocationBufferCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV: {
+            unmarshal_VkDedicatedAllocationBufferCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkDedicatedAllocationBufferCreateInfoNV*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV:
-        {
-            unmarshal_VkDedicatedAllocationMemoryAllocateInfoNV(vkStream, rootType, reinterpret_cast<VkDedicatedAllocationMemoryAllocateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV: {
+            unmarshal_VkDedicatedAllocationMemoryAllocateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkDedicatedAllocationMemoryAllocateInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_transform_feedback
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceTransformFeedbackFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceTransformFeedbackFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT: {
+            unmarshal_VkPhysicalDeviceTransformFeedbackFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceTransformFeedbackFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceTransformFeedbackPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceTransformFeedbackPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT: {
+            unmarshal_VkPhysicalDeviceTransformFeedbackPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceTransformFeedbackPropertiesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT:
-        {
-            unmarshal_VkPipelineRasterizationStateStreamCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkPipelineRasterizationStateStreamCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT: {
+            unmarshal_VkPipelineRasterizationStateStreamCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineRasterizationStateStreamCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_video_encode_h264
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_EXT:
-        {
-            unmarshal_VkVideoEncodeH264CapabilitiesEXT(vkStream, rootType, reinterpret_cast<VkVideoEncodeH264CapabilitiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_EXT: {
+            unmarshal_VkVideoEncodeH264CapabilitiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoEncodeH264CapabilitiesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_CREATE_INFO_EXT:
-        {
-            unmarshal_VkVideoEncodeH264SessionCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkVideoEncodeH264SessionCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_CREATE_INFO_EXT: {
+            unmarshal_VkVideoEncodeH264SessionCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoEncodeH264SessionCreateInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
-            unmarshal_VkVideoEncodeH264SessionParametersAddInfoEXT(vkStream, rootType, reinterpret_cast<VkVideoEncodeH264SessionParametersAddInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT: {
+            unmarshal_VkVideoEncodeH264SessionParametersAddInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoEncodeH264SessionParametersAddInfoEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
-            unmarshal_VkVideoEncodeH264SessionParametersCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkVideoEncodeH264SessionParametersCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT: {
+            unmarshal_VkVideoEncodeH264SessionParametersCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoEncodeH264SessionParametersCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_VCL_FRAME_INFO_EXT:
-        {
-            unmarshal_VkVideoEncodeH264VclFrameInfoEXT(vkStream, rootType, reinterpret_cast<VkVideoEncodeH264VclFrameInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_VCL_FRAME_INFO_EXT: {
+            unmarshal_VkVideoEncodeH264VclFrameInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoEncodeH264VclFrameInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_EMIT_PICTURE_PARAMETERS_EXT:
-        {
-            unmarshal_VkVideoEncodeH264EmitPictureParametersEXT(vkStream, rootType, reinterpret_cast<VkVideoEncodeH264EmitPictureParametersEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_EMIT_PICTURE_PARAMETERS_EXT: {
+            unmarshal_VkVideoEncodeH264EmitPictureParametersEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoEncodeH264EmitPictureParametersEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_EXT:
-        {
-            unmarshal_VkVideoEncodeH264ProfileEXT(vkStream, rootType, reinterpret_cast<VkVideoEncodeH264ProfileEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_EXT: {
+            unmarshal_VkVideoEncodeH264ProfileEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoEncodeH264ProfileEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_video_encode_h265
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_EXT:
-        {
-            unmarshal_VkVideoEncodeH265CapabilitiesEXT(vkStream, rootType, reinterpret_cast<VkVideoEncodeH265CapabilitiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_EXT: {
+            unmarshal_VkVideoEncodeH265CapabilitiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoEncodeH265CapabilitiesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_CREATE_INFO_EXT:
-        {
-            unmarshal_VkVideoEncodeH265SessionCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkVideoEncodeH265SessionCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_CREATE_INFO_EXT: {
+            unmarshal_VkVideoEncodeH265SessionCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoEncodeH265SessionCreateInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
-            unmarshal_VkVideoEncodeH265SessionParametersAddInfoEXT(vkStream, rootType, reinterpret_cast<VkVideoEncodeH265SessionParametersAddInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT: {
+            unmarshal_VkVideoEncodeH265SessionParametersAddInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoEncodeH265SessionParametersAddInfoEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
-            unmarshal_VkVideoEncodeH265SessionParametersCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkVideoEncodeH265SessionParametersCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT: {
+            unmarshal_VkVideoEncodeH265SessionParametersCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoEncodeH265SessionParametersCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_VCL_FRAME_INFO_EXT:
-        {
-            unmarshal_VkVideoEncodeH265VclFrameInfoEXT(vkStream, rootType, reinterpret_cast<VkVideoEncodeH265VclFrameInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_VCL_FRAME_INFO_EXT: {
+            unmarshal_VkVideoEncodeH265VclFrameInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoEncodeH265VclFrameInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_EMIT_PICTURE_PARAMETERS_EXT:
-        {
-            unmarshal_VkVideoEncodeH265EmitPictureParametersEXT(vkStream, rootType, reinterpret_cast<VkVideoEncodeH265EmitPictureParametersEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_EMIT_PICTURE_PARAMETERS_EXT: {
+            unmarshal_VkVideoEncodeH265EmitPictureParametersEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoEncodeH265EmitPictureParametersEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_EXT:
-        {
-            unmarshal_VkVideoEncodeH265ProfileEXT(vkStream, rootType, reinterpret_cast<VkVideoEncodeH265ProfileEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_EXT: {
+            unmarshal_VkVideoEncodeH265ProfileEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoEncodeH265ProfileEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_video_decode_h264
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_EXT:
-        {
-            unmarshal_VkVideoDecodeH264ProfileEXT(vkStream, rootType, reinterpret_cast<VkVideoDecodeH264ProfileEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_EXT: {
+            unmarshal_VkVideoDecodeH264ProfileEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoDecodeH264ProfileEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT:
-        {
-            unmarshal_VkVideoDecodeH264CapabilitiesEXT(vkStream, rootType, reinterpret_cast<VkVideoDecodeH264CapabilitiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT: {
+            unmarshal_VkVideoDecodeH264CapabilitiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoDecodeH264CapabilitiesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_CREATE_INFO_EXT:
-        {
-            unmarshal_VkVideoDecodeH264SessionCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkVideoDecodeH264SessionCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_CREATE_INFO_EXT: {
+            unmarshal_VkVideoDecodeH264SessionCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoDecodeH264SessionCreateInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
-            unmarshal_VkVideoDecodeH264SessionParametersAddInfoEXT(vkStream, rootType, reinterpret_cast<VkVideoDecodeH264SessionParametersAddInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT: {
+            unmarshal_VkVideoDecodeH264SessionParametersAddInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoDecodeH264SessionParametersAddInfoEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
-            unmarshal_VkVideoDecodeH264SessionParametersCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkVideoDecodeH264SessionParametersCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT: {
+            unmarshal_VkVideoDecodeH264SessionParametersCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoDecodeH264SessionParametersCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT:
-        {
-            unmarshal_VkVideoDecodeH264PictureInfoEXT(vkStream, rootType, reinterpret_cast<VkVideoDecodeH264PictureInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT: {
+            unmarshal_VkVideoDecodeH264PictureInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoDecodeH264PictureInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_MVC_EXT:
-        {
-            unmarshal_VkVideoDecodeH264MvcEXT(vkStream, rootType, reinterpret_cast<VkVideoDecodeH264MvcEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_MVC_EXT: {
+            unmarshal_VkVideoDecodeH264MvcEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoDecodeH264MvcEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT:
-        {
-            unmarshal_VkVideoDecodeH264DpbSlotInfoEXT(vkStream, rootType, reinterpret_cast<VkVideoDecodeH264DpbSlotInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT: {
+            unmarshal_VkVideoDecodeH264DpbSlotInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoDecodeH264DpbSlotInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_texture_gather_bias_lod
-        case VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD:
-        {
-            unmarshal_VkTextureLODGatherFormatPropertiesAMD(vkStream, rootType, reinterpret_cast<VkTextureLODGatherFormatPropertiesAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD: {
+            unmarshal_VkTextureLODGatherFormatPropertiesAMD(
+                vkStream, rootType,
+                reinterpret_cast<VkTextureLODGatherFormatPropertiesAMD*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_corner_sampled_image
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV:
-        {
-            unmarshal_VkPhysicalDeviceCornerSampledImageFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceCornerSampledImageFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV: {
+            unmarshal_VkPhysicalDeviceCornerSampledImageFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceCornerSampledImageFeaturesNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_external_memory
-        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV:
-        {
-            unmarshal_VkExternalMemoryImageCreateInfoNV(vkStream, rootType, reinterpret_cast<VkExternalMemoryImageCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV: {
+            unmarshal_VkExternalMemoryImageCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkExternalMemoryImageCreateInfoNV*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV:
-        {
-            unmarshal_VkExportMemoryAllocateInfoNV(vkStream, rootType, reinterpret_cast<VkExportMemoryAllocateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV: {
+            unmarshal_VkExportMemoryAllocateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkExportMemoryAllocateInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_external_memory_win32
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV:
-        {
-            unmarshal_VkImportMemoryWin32HandleInfoNV(vkStream, rootType, reinterpret_cast<VkImportMemoryWin32HandleInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV: {
+            unmarshal_VkImportMemoryWin32HandleInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkImportMemoryWin32HandleInfoNV*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV:
-        {
-            unmarshal_VkExportMemoryWin32HandleInfoNV(vkStream, rootType, reinterpret_cast<VkExportMemoryWin32HandleInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV: {
+            unmarshal_VkExportMemoryWin32HandleInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkExportMemoryWin32HandleInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_win32_keyed_mutex
-        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV:
-        {
-            unmarshal_VkWin32KeyedMutexAcquireReleaseInfoNV(vkStream, rootType, reinterpret_cast<VkWin32KeyedMutexAcquireReleaseInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV: {
+            unmarshal_VkWin32KeyedMutexAcquireReleaseInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkWin32KeyedMutexAcquireReleaseInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_validation_flags
-        case VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT:
-        {
-            unmarshal_VkValidationFlagsEXT(vkStream, rootType, reinterpret_cast<VkValidationFlagsEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT: {
+            unmarshal_VkValidationFlagsEXT(
+                vkStream, rootType, reinterpret_cast<VkValidationFlagsEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_texture_compression_astc_hdr
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT: {
+            unmarshal_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_astc_decode_mode
-        case VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT:
-        {
-            unmarshal_VkImageViewASTCDecodeModeEXT(vkStream, rootType, reinterpret_cast<VkImageViewASTCDecodeModeEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT: {
+            unmarshal_VkImageViewASTCDecodeModeEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkImageViewASTCDecodeModeEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceASTCDecodeFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceASTCDecodeFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT: {
+            unmarshal_VkPhysicalDeviceASTCDecodeFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceASTCDecodeFeaturesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_conditional_rendering
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceConditionalRenderingFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceConditionalRenderingFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT: {
+            unmarshal_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceConditionalRenderingFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT:
-        {
-            unmarshal_VkCommandBufferInheritanceConditionalRenderingInfoEXT(vkStream, rootType, reinterpret_cast<VkCommandBufferInheritanceConditionalRenderingInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT: {
+            unmarshal_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkCommandBufferInheritanceConditionalRenderingInfoEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_clip_space_w_scaling
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV:
-        {
-            unmarshal_VkPipelineViewportWScalingStateCreateInfoNV(vkStream, rootType, reinterpret_cast<VkPipelineViewportWScalingStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV: {
+            unmarshal_VkPipelineViewportWScalingStateCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineViewportWScalingStateCreateInfoNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_display_control
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT:
-        {
-            unmarshal_VkSwapchainCounterCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkSwapchainCounterCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT: {
+            unmarshal_VkSwapchainCounterCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkSwapchainCounterCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_GOOGLE_display_timing
-        case VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE:
-        {
-            unmarshal_VkPresentTimesInfoGOOGLE(vkStream, rootType, reinterpret_cast<VkPresentTimesInfoGOOGLE*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE: {
+            unmarshal_VkPresentTimesInfoGOOGLE(
+                vkStream, rootType,
+                reinterpret_cast<VkPresentTimesInfoGOOGLE*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NVX_multiview_per_view_attributes
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX:
-        {
-            unmarshal_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX: {
+            unmarshal_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_viewport_swizzle
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV:
-        {
-            unmarshal_VkPipelineViewportSwizzleStateCreateInfoNV(vkStream, rootType, reinterpret_cast<VkPipelineViewportSwizzleStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV: {
+            unmarshal_VkPipelineViewportSwizzleStateCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineViewportSwizzleStateCreateInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_discard_rectangles
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceDiscardRectanglePropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceDiscardRectanglePropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT: {
+            unmarshal_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceDiscardRectanglePropertiesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT:
-        {
-            unmarshal_VkPipelineDiscardRectangleStateCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkPipelineDiscardRectangleStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT: {
+            unmarshal_VkPipelineDiscardRectangleStateCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineDiscardRectangleStateCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_conservative_rasterization
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceConservativeRasterizationPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT: {
+            unmarshal_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceConservativeRasterizationPropertiesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT:
-        {
-            unmarshal_VkPipelineRasterizationConservativeStateCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkPipelineRasterizationConservativeStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT: {
+            unmarshal_VkPipelineRasterizationConservativeStateCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineRasterizationConservativeStateCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_depth_clip_enable
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceDepthClipEnableFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceDepthClipEnableFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT: {
+            unmarshal_VkPhysicalDeviceDepthClipEnableFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceDepthClipEnableFeaturesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT:
-        {
-            unmarshal_VkPipelineRasterizationDepthClipStateCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkPipelineRasterizationDepthClipStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT: {
+            unmarshal_VkPipelineRasterizationDepthClipStateCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineRasterizationDepthClipStateCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_debug_utils
-        case VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT:
-        {
-            unmarshal_VkDebugUtilsMessengerCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkDebugUtilsMessengerCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT: {
+            unmarshal_VkDebugUtilsMessengerCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkDebugUtilsMessengerCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
-        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID:
-        {
-            unmarshal_VkAndroidHardwareBufferUsageANDROID(vkStream, rootType, reinterpret_cast<VkAndroidHardwareBufferUsageANDROID*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID: {
+            unmarshal_VkAndroidHardwareBufferUsageANDROID(
+                vkStream, rootType,
+                reinterpret_cast<VkAndroidHardwareBufferUsageANDROID*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID:
-        {
-            unmarshal_VkAndroidHardwareBufferFormatPropertiesANDROID(vkStream, rootType, reinterpret_cast<VkAndroidHardwareBufferFormatPropertiesANDROID*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID: {
+            unmarshal_VkAndroidHardwareBufferFormatPropertiesANDROID(
+                vkStream, rootType,
+                reinterpret_cast<VkAndroidHardwareBufferFormatPropertiesANDROID*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID:
-        {
-            unmarshal_VkImportAndroidHardwareBufferInfoANDROID(vkStream, rootType, reinterpret_cast<VkImportAndroidHardwareBufferInfoANDROID*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID: {
+            unmarshal_VkImportAndroidHardwareBufferInfoANDROID(
+                vkStream, rootType,
+                reinterpret_cast<VkImportAndroidHardwareBufferInfoANDROID*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID:
-        {
-            unmarshal_VkExternalFormatANDROID(vkStream, rootType, reinterpret_cast<VkExternalFormatANDROID*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID: {
+            unmarshal_VkExternalFormatANDROID(
+                vkStream, rootType,
+                reinterpret_cast<VkExternalFormatANDROID*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_2_ANDROID:
-        {
-            unmarshal_VkAndroidHardwareBufferFormatProperties2ANDROID(vkStream, rootType, reinterpret_cast<VkAndroidHardwareBufferFormatProperties2ANDROID*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_2_ANDROID: {
+            unmarshal_VkAndroidHardwareBufferFormatProperties2ANDROID(
+                vkStream, rootType,
+                reinterpret_cast<VkAndroidHardwareBufferFormatProperties2ANDROID*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_inline_uniform_block
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceInlineUniformBlockFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT: {
+            unmarshal_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceInlineUniformBlockFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceInlineUniformBlockPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT: {
+            unmarshal_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceInlineUniformBlockPropertiesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT:
-        {
-            unmarshal_VkWriteDescriptorSetInlineUniformBlockEXT(vkStream, rootType, reinterpret_cast<VkWriteDescriptorSetInlineUniformBlockEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT: {
+            unmarshal_VkWriteDescriptorSetInlineUniformBlockEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkWriteDescriptorSetInlineUniformBlockEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT:
-        {
-            unmarshal_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkDescriptorPoolInlineUniformBlockCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT: {
+            unmarshal_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkDescriptorPoolInlineUniformBlockCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_sample_locations
-        case VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT:
-        {
-            unmarshal_VkSampleLocationsInfoEXT(vkStream, rootType, reinterpret_cast<VkSampleLocationsInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT: {
+            unmarshal_VkSampleLocationsInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkSampleLocationsInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT:
-        {
-            unmarshal_VkRenderPassSampleLocationsBeginInfoEXT(vkStream, rootType, reinterpret_cast<VkRenderPassSampleLocationsBeginInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT: {
+            unmarshal_VkRenderPassSampleLocationsBeginInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkRenderPassSampleLocationsBeginInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT:
-        {
-            unmarshal_VkPipelineSampleLocationsStateCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkPipelineSampleLocationsStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT: {
+            unmarshal_VkPipelineSampleLocationsStateCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineSampleLocationsStateCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceSampleLocationsPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceSampleLocationsPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT: {
+            unmarshal_VkPhysicalDeviceSampleLocationsPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceSampleLocationsPropertiesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_blend_operation_advanced
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT: {
+            unmarshal_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT: {
+            unmarshal_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT:
-        {
-            unmarshal_VkPipelineColorBlendAdvancedStateCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkPipelineColorBlendAdvancedStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT: {
+            unmarshal_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineColorBlendAdvancedStateCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_fragment_coverage_to_color
-        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV:
-        {
-            unmarshal_VkPipelineCoverageToColorStateCreateInfoNV(vkStream, rootType, reinterpret_cast<VkPipelineCoverageToColorStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV: {
+            unmarshal_VkPipelineCoverageToColorStateCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineCoverageToColorStateCreateInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_framebuffer_mixed_samples
-        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV:
-        {
-            unmarshal_VkPipelineCoverageModulationStateCreateInfoNV(vkStream, rootType, reinterpret_cast<VkPipelineCoverageModulationStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV: {
+            unmarshal_VkPipelineCoverageModulationStateCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineCoverageModulationStateCreateInfoNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_shader_sm_builtins
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV:
-        {
-            unmarshal_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderSMBuiltinsPropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV: {
+            unmarshal_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderSMBuiltinsPropertiesNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV:
-        {
-            unmarshal_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderSMBuiltinsFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV: {
+            unmarshal_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderSMBuiltinsFeaturesNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_image_drm_format_modifier
-        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT:
-        {
-            unmarshal_VkDrmFormatModifierPropertiesListEXT(vkStream, rootType, reinterpret_cast<VkDrmFormatModifierPropertiesListEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT: {
+            unmarshal_VkDrmFormatModifierPropertiesListEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkDrmFormatModifierPropertiesListEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT:
-        {
-            unmarshal_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceImageDrmFormatModifierInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT: {
+            unmarshal_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceImageDrmFormatModifierInfoEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT:
-        {
-            unmarshal_VkImageDrmFormatModifierListCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkImageDrmFormatModifierListCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT: {
+            unmarshal_VkImageDrmFormatModifierListCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkImageDrmFormatModifierListCreateInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT:
-        {
-            unmarshal_VkImageDrmFormatModifierExplicitCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkImageDrmFormatModifierExplicitCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT: {
+            unmarshal_VkImageDrmFormatModifierExplicitCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkImageDrmFormatModifierExplicitCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_2_EXT:
-        {
-            unmarshal_VkDrmFormatModifierPropertiesList2EXT(vkStream, rootType, reinterpret_cast<VkDrmFormatModifierPropertiesList2EXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_2_EXT: {
+            unmarshal_VkDrmFormatModifierPropertiesList2EXT(
+                vkStream, rootType,
+                reinterpret_cast<VkDrmFormatModifierPropertiesList2EXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_validation_cache
-        case VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT:
-        {
-            unmarshal_VkShaderModuleValidationCacheCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkShaderModuleValidationCacheCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT: {
+            unmarshal_VkShaderModuleValidationCacheCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkShaderModuleValidationCacheCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_shading_rate_image
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV:
-        {
-            unmarshal_VkPipelineViewportShadingRateImageStateCreateInfoNV(vkStream, rootType, reinterpret_cast<VkPipelineViewportShadingRateImageStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV: {
+            unmarshal_VkPipelineViewportShadingRateImageStateCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineViewportShadingRateImageStateCreateInfoNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV:
-        {
-            unmarshal_VkPhysicalDeviceShadingRateImageFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShadingRateImageFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV: {
+            unmarshal_VkPhysicalDeviceShadingRateImageFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShadingRateImageFeaturesNV*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV:
-        {
-            unmarshal_VkPhysicalDeviceShadingRateImagePropertiesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShadingRateImagePropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV: {
+            unmarshal_VkPhysicalDeviceShadingRateImagePropertiesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShadingRateImagePropertiesNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV:
-        {
-            unmarshal_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(vkStream, rootType, reinterpret_cast<VkPipelineViewportCoarseSampleOrderStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV: {
+            unmarshal_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineViewportCoarseSampleOrderStateCreateInfoNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_ray_tracing
-        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV:
-        {
-            unmarshal_VkWriteDescriptorSetAccelerationStructureNV(vkStream, rootType, reinterpret_cast<VkWriteDescriptorSetAccelerationStructureNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV: {
+            unmarshal_VkWriteDescriptorSetAccelerationStructureNV(
+                vkStream, rootType,
+                reinterpret_cast<VkWriteDescriptorSetAccelerationStructureNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV:
-        {
-            unmarshal_VkPhysicalDeviceRayTracingPropertiesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceRayTracingPropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV: {
+            unmarshal_VkPhysicalDeviceRayTracingPropertiesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceRayTracingPropertiesNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_representative_fragment_test
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV:
-        {
-            unmarshal_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV: {
+            unmarshal_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV:
-        {
-            unmarshal_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(vkStream, rootType, reinterpret_cast<VkPipelineRepresentativeFragmentTestStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV: {
+            unmarshal_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineRepresentativeFragmentTestStateCreateInfoNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_filter_cubic
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT:
-        {
-            unmarshal_VkPhysicalDeviceImageViewImageFormatInfoEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceImageViewImageFormatInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT: {
+            unmarshal_VkPhysicalDeviceImageViewImageFormatInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceImageViewImageFormatInfoEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT:
-        {
-            unmarshal_VkFilterCubicImageViewImageFormatPropertiesEXT(vkStream, rootType, reinterpret_cast<VkFilterCubicImageViewImageFormatPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT: {
+            unmarshal_VkFilterCubicImageViewImageFormatPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkFilterCubicImageViewImageFormatPropertiesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_global_priority
-        case VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT:
-        {
-            unmarshal_VkDeviceQueueGlobalPriorityCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkDeviceQueueGlobalPriorityCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT: {
+            unmarshal_VkDeviceQueueGlobalPriorityCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkDeviceQueueGlobalPriorityCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_external_memory_host
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT:
-        {
-            unmarshal_VkImportMemoryHostPointerInfoEXT(vkStream, rootType, reinterpret_cast<VkImportMemoryHostPointerInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT: {
+            unmarshal_VkImportMemoryHostPointerInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkImportMemoryHostPointerInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceExternalMemoryHostPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT: {
+            unmarshal_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceExternalMemoryHostPropertiesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_pipeline_compiler_control
-        case VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD:
-        {
-            unmarshal_VkPipelineCompilerControlCreateInfoAMD(vkStream, rootType, reinterpret_cast<VkPipelineCompilerControlCreateInfoAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD: {
+            unmarshal_VkPipelineCompilerControlCreateInfoAMD(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineCompilerControlCreateInfoAMD*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_shader_core_properties
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD:
-        {
-            unmarshal_VkPhysicalDeviceShaderCorePropertiesAMD(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderCorePropertiesAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD: {
+            unmarshal_VkPhysicalDeviceShaderCorePropertiesAMD(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderCorePropertiesAMD*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_video_decode_h265
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_EXT:
-        {
-            unmarshal_VkVideoDecodeH265ProfileEXT(vkStream, rootType, reinterpret_cast<VkVideoDecodeH265ProfileEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_EXT: {
+            unmarshal_VkVideoDecodeH265ProfileEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoDecodeH265ProfileEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT:
-        {
-            unmarshal_VkVideoDecodeH265CapabilitiesEXT(vkStream, rootType, reinterpret_cast<VkVideoDecodeH265CapabilitiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT: {
+            unmarshal_VkVideoDecodeH265CapabilitiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoDecodeH265CapabilitiesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_CREATE_INFO_EXT:
-        {
-            unmarshal_VkVideoDecodeH265SessionCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkVideoDecodeH265SessionCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_CREATE_INFO_EXT: {
+            unmarshal_VkVideoDecodeH265SessionCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoDecodeH265SessionCreateInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
-            unmarshal_VkVideoDecodeH265SessionParametersAddInfoEXT(vkStream, rootType, reinterpret_cast<VkVideoDecodeH265SessionParametersAddInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT: {
+            unmarshal_VkVideoDecodeH265SessionParametersAddInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoDecodeH265SessionParametersAddInfoEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
-            unmarshal_VkVideoDecodeH265SessionParametersCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkVideoDecodeH265SessionParametersCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT: {
+            unmarshal_VkVideoDecodeH265SessionParametersCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoDecodeH265SessionParametersCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT:
-        {
-            unmarshal_VkVideoDecodeH265PictureInfoEXT(vkStream, rootType, reinterpret_cast<VkVideoDecodeH265PictureInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT: {
+            unmarshal_VkVideoDecodeH265PictureInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoDecodeH265PictureInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT:
-        {
-            unmarshal_VkVideoDecodeH265DpbSlotInfoEXT(vkStream, rootType, reinterpret_cast<VkVideoDecodeH265DpbSlotInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT: {
+            unmarshal_VkVideoDecodeH265DpbSlotInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoDecodeH265DpbSlotInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_memory_overallocation_behavior
-        case VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD:
-        {
-            unmarshal_VkDeviceMemoryOverallocationCreateInfoAMD(vkStream, rootType, reinterpret_cast<VkDeviceMemoryOverallocationCreateInfoAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD: {
+            unmarshal_VkDeviceMemoryOverallocationCreateInfoAMD(
+                vkStream, rootType,
+                reinterpret_cast<VkDeviceMemoryOverallocationCreateInfoAMD*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_vertex_attribute_divisor
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT: {
+            unmarshal_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT:
-        {
-            unmarshal_VkPipelineVertexInputDivisorStateCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkPipelineVertexInputDivisorStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT: {
+            unmarshal_VkPipelineVertexInputDivisorStateCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineVertexInputDivisorStateCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: {
+            unmarshal_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_GGP_frame_token
-        case VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP:
-        {
-            unmarshal_VkPresentFrameTokenGGP(vkStream, rootType, reinterpret_cast<VkPresentFrameTokenGGP*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP: {
+            unmarshal_VkPresentFrameTokenGGP(
+                vkStream, rootType, reinterpret_cast<VkPresentFrameTokenGGP*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_pipeline_creation_feedback
-        case VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT:
-        {
-            unmarshal_VkPipelineCreationFeedbackCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkPipelineCreationFeedbackCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT: {
+            unmarshal_VkPipelineCreationFeedbackCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineCreationFeedbackCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_compute_shader_derivatives
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV:
-        {
-            unmarshal_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceComputeShaderDerivativesFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV: {
+            unmarshal_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceComputeShaderDerivativesFeaturesNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_mesh_shader
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV:
-        {
-            unmarshal_VkPhysicalDeviceMeshShaderFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceMeshShaderFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV: {
+            unmarshal_VkPhysicalDeviceMeshShaderFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceMeshShaderFeaturesNV*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV:
-        {
-            unmarshal_VkPhysicalDeviceMeshShaderPropertiesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceMeshShaderPropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV: {
+            unmarshal_VkPhysicalDeviceMeshShaderPropertiesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceMeshShaderPropertiesNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_fragment_shader_barycentric
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV:
-        {
-            unmarshal_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV: {
+            unmarshal_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_shader_image_footprint
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV:
-        {
-            unmarshal_VkPhysicalDeviceShaderImageFootprintFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderImageFootprintFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV: {
+            unmarshal_VkPhysicalDeviceShaderImageFootprintFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderImageFootprintFeaturesNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_scissor_exclusive
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV:
-        {
-            unmarshal_VkPipelineViewportExclusiveScissorStateCreateInfoNV(vkStream, rootType, reinterpret_cast<VkPipelineViewportExclusiveScissorStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV: {
+            unmarshal_VkPipelineViewportExclusiveScissorStateCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineViewportExclusiveScissorStateCreateInfoNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV:
-        {
-            unmarshal_VkPhysicalDeviceExclusiveScissorFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceExclusiveScissorFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV: {
+            unmarshal_VkPhysicalDeviceExclusiveScissorFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceExclusiveScissorFeaturesNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
-        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV:
-        {
-            unmarshal_VkQueueFamilyCheckpointPropertiesNV(vkStream, rootType, reinterpret_cast<VkQueueFamilyCheckpointPropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV: {
+            unmarshal_VkQueueFamilyCheckpointPropertiesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkQueueFamilyCheckpointPropertiesNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_INTEL_shader_integer_functions2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL:
-        {
-            unmarshal_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL: {
+            unmarshal_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_INTEL_performance_query
-        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL:
-        {
-            unmarshal_VkQueryPoolPerformanceQueryCreateInfoINTEL(vkStream, rootType, reinterpret_cast<VkQueryPoolPerformanceQueryCreateInfoINTEL*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL: {
+            unmarshal_VkQueryPoolPerformanceQueryCreateInfoINTEL(
+                vkStream, rootType,
+                reinterpret_cast<VkQueryPoolPerformanceQueryCreateInfoINTEL*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_pci_bus_info
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT:
-        {
-            unmarshal_VkPhysicalDevicePCIBusInfoPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDevicePCIBusInfoPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT: {
+            unmarshal_VkPhysicalDevicePCIBusInfoPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDevicePCIBusInfoPropertiesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_display_native_hdr
-        case VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD:
-        {
-            unmarshal_VkDisplayNativeHdrSurfaceCapabilitiesAMD(vkStream, rootType, reinterpret_cast<VkDisplayNativeHdrSurfaceCapabilitiesAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD: {
+            unmarshal_VkDisplayNativeHdrSurfaceCapabilitiesAMD(
+                vkStream, rootType,
+                reinterpret_cast<VkDisplayNativeHdrSurfaceCapabilitiesAMD*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD:
-        {
-            unmarshal_VkSwapchainDisplayNativeHdrCreateInfoAMD(vkStream, rootType, reinterpret_cast<VkSwapchainDisplayNativeHdrCreateInfoAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD: {
+            unmarshal_VkSwapchainDisplayNativeHdrCreateInfoAMD(
+                vkStream, rootType,
+                reinterpret_cast<VkSwapchainDisplayNativeHdrCreateInfoAMD*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_fragment_density_map
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT:
-        {
-            switch(rootType)
-            {
-                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2:
-                {
-                    unmarshal_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT: {
+            switch (rootType) {
+                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2: {
+                    unmarshal_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
+                        vkStream, rootType,
+                        reinterpret_cast<VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(
+                            structExtension_out));
                     break;
                 }
-                case VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO:
-                {
-                    unmarshal_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(structExtension_out));
+                case VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO: {
+                    unmarshal_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
+                        vkStream, rootType,
+                        reinterpret_cast<VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(
+                            structExtension_out));
                     break;
                 }
-                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO:
-                {
-                    unmarshal_VkImportColorBufferGOOGLE(vkStream, rootType, reinterpret_cast<VkImportColorBufferGOOGLE*>(structExtension_out));
+                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO: {
+                    unmarshal_VkImportColorBufferGOOGLE(
+                        vkStream, rootType,
+                        reinterpret_cast<VkImportColorBufferGOOGLE*>(structExtension_out));
                     break;
                 }
-                default:
-                {
-                    unmarshal_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(structExtension_out));
+                default: {
+                    unmarshal_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
+                        vkStream, rootType,
+                        reinterpret_cast<VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(
+                            structExtension_out));
                     break;
                 }
             }
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT:
-        {
-            switch(rootType)
-            {
-                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2:
-                {
-                    unmarshal_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT: {
+            switch (rootType) {
+                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2: {
+                    unmarshal_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
+                        vkStream, rootType,
+                        reinterpret_cast<VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(
+                            structExtension_out));
                     break;
                 }
-                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO:
-                {
-                    unmarshal_VkImportPhysicalAddressGOOGLE(vkStream, rootType, reinterpret_cast<VkImportPhysicalAddressGOOGLE*>(structExtension_out));
+                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO: {
+                    unmarshal_VkImportPhysicalAddressGOOGLE(
+                        vkStream, rootType,
+                        reinterpret_cast<VkImportPhysicalAddressGOOGLE*>(structExtension_out));
                     break;
                 }
-                default:
-                {
-                    unmarshal_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(structExtension_out));
+                default: {
+                    unmarshal_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
+                        vkStream, rootType,
+                        reinterpret_cast<VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(
+                            structExtension_out));
                     break;
                 }
             }
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT:
-        {
-            switch(rootType)
-            {
-                case VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO:
-                {
-                    unmarshal_VkRenderPassFragmentDensityMapCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkRenderPassFragmentDensityMapCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT: {
+            switch (rootType) {
+                case VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO: {
+                    unmarshal_VkRenderPassFragmentDensityMapCreateInfoEXT(
+                        vkStream, rootType,
+                        reinterpret_cast<VkRenderPassFragmentDensityMapCreateInfoEXT*>(
+                            structExtension_out));
                     break;
                 }
-                case VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2:
-                {
-                    unmarshal_VkRenderPassFragmentDensityMapCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkRenderPassFragmentDensityMapCreateInfoEXT*>(structExtension_out));
+                case VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2: {
+                    unmarshal_VkRenderPassFragmentDensityMapCreateInfoEXT(
+                        vkStream, rootType,
+                        reinterpret_cast<VkRenderPassFragmentDensityMapCreateInfoEXT*>(
+                            structExtension_out));
                     break;
                 }
-                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO:
-                {
-                    unmarshal_VkImportBufferGOOGLE(vkStream, rootType, reinterpret_cast<VkImportBufferGOOGLE*>(structExtension_out));
+                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO: {
+                    unmarshal_VkImportBufferGOOGLE(
+                        vkStream, rootType,
+                        reinterpret_cast<VkImportBufferGOOGLE*>(structExtension_out));
                     break;
                 }
-                default:
-                {
-                    unmarshal_VkRenderPassFragmentDensityMapCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkRenderPassFragmentDensityMapCreateInfoEXT*>(structExtension_out));
+                default: {
+                    unmarshal_VkRenderPassFragmentDensityMapCreateInfoEXT(
+                        vkStream, rootType,
+                        reinterpret_cast<VkRenderPassFragmentDensityMapCreateInfoEXT*>(
+                            structExtension_out));
                     break;
                 }
             }
@@ -39366,3326 +38072,2942 @@
         }
 #endif
 #ifdef VK_EXT_subgroup_size_control
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceSubgroupSizeControlFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT: {
+            unmarshal_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceSubgroupSizeControlFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceSubgroupSizeControlPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT: {
+            unmarshal_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceSubgroupSizeControlPropertiesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT:
-        {
-            unmarshal_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT: {
+            unmarshal_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_shader_core_properties2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD:
-        {
-            unmarshal_VkPhysicalDeviceShaderCoreProperties2AMD(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderCoreProperties2AMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD: {
+            unmarshal_VkPhysicalDeviceShaderCoreProperties2AMD(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderCoreProperties2AMD*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_device_coherent_memory
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD:
-        {
-            unmarshal_VkPhysicalDeviceCoherentMemoryFeaturesAMD(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceCoherentMemoryFeaturesAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD: {
+            unmarshal_VkPhysicalDeviceCoherentMemoryFeaturesAMD(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceCoherentMemoryFeaturesAMD*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_shader_image_atomic_int64
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT: {
+            unmarshal_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_memory_budget
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceMemoryBudgetPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceMemoryBudgetPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT: {
+            unmarshal_VkPhysicalDeviceMemoryBudgetPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceMemoryBudgetPropertiesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_memory_priority
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceMemoryPriorityFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceMemoryPriorityFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT: {
+            unmarshal_VkPhysicalDeviceMemoryPriorityFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceMemoryPriorityFeaturesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT:
-        {
-            unmarshal_VkMemoryPriorityAllocateInfoEXT(vkStream, rootType, reinterpret_cast<VkMemoryPriorityAllocateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT: {
+            unmarshal_VkMemoryPriorityAllocateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkMemoryPriorityAllocateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_dedicated_allocation_image_aliasing
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV:
-        {
-            unmarshal_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV: {
+            unmarshal_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_buffer_device_address
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceBufferDeviceAddressFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT: {
+            unmarshal_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceBufferDeviceAddressFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT:
-        {
-            unmarshal_VkBufferDeviceAddressCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkBufferDeviceAddressCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT: {
+            unmarshal_VkBufferDeviceAddressCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkBufferDeviceAddressCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_validation_features
-        case VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT:
-        {
-            unmarshal_VkValidationFeaturesEXT(vkStream, rootType, reinterpret_cast<VkValidationFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT: {
+            unmarshal_VkValidationFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkValidationFeaturesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_cooperative_matrix
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV:
-        {
-            unmarshal_VkPhysicalDeviceCooperativeMatrixFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceCooperativeMatrixFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV: {
+            unmarshal_VkPhysicalDeviceCooperativeMatrixFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceCooperativeMatrixFeaturesNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV:
-        {
-            unmarshal_VkPhysicalDeviceCooperativeMatrixPropertiesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceCooperativeMatrixPropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV: {
+            unmarshal_VkPhysicalDeviceCooperativeMatrixPropertiesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceCooperativeMatrixPropertiesNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_coverage_reduction_mode
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV:
-        {
-            unmarshal_VkPhysicalDeviceCoverageReductionModeFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceCoverageReductionModeFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV: {
+            unmarshal_VkPhysicalDeviceCoverageReductionModeFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceCoverageReductionModeFeaturesNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV:
-        {
-            unmarshal_VkPipelineCoverageReductionStateCreateInfoNV(vkStream, rootType, reinterpret_cast<VkPipelineCoverageReductionStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV: {
+            unmarshal_VkPipelineCoverageReductionStateCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineCoverageReductionStateCreateInfoNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_fragment_shader_interlock
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT: {
+            unmarshal_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_ycbcr_image_arrays
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT: {
+            unmarshal_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_provoking_vertex
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceProvokingVertexFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceProvokingVertexFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT: {
+            unmarshal_VkPhysicalDeviceProvokingVertexFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceProvokingVertexFeaturesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_PROPERTIES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceProvokingVertexPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceProvokingVertexPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_PROPERTIES_EXT: {
+            unmarshal_VkPhysicalDeviceProvokingVertexPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceProvokingVertexPropertiesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT:
-        {
-            unmarshal_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkPipelineRasterizationProvokingVertexStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT: {
+            unmarshal_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineRasterizationProvokingVertexStateCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_full_screen_exclusive
-        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT:
-        {
-            unmarshal_VkSurfaceFullScreenExclusiveInfoEXT(vkStream, rootType, reinterpret_cast<VkSurfaceFullScreenExclusiveInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT: {
+            unmarshal_VkSurfaceFullScreenExclusiveInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkSurfaceFullScreenExclusiveInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT:
-        {
-            unmarshal_VkSurfaceCapabilitiesFullScreenExclusiveEXT(vkStream, rootType, reinterpret_cast<VkSurfaceCapabilitiesFullScreenExclusiveEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT: {
+            unmarshal_VkSurfaceCapabilitiesFullScreenExclusiveEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkSurfaceCapabilitiesFullScreenExclusiveEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT:
-        {
-            unmarshal_VkSurfaceFullScreenExclusiveWin32InfoEXT(vkStream, rootType, reinterpret_cast<VkSurfaceFullScreenExclusiveWin32InfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT: {
+            unmarshal_VkSurfaceFullScreenExclusiveWin32InfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkSurfaceFullScreenExclusiveWin32InfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_line_rasterization
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceLineRasterizationFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceLineRasterizationFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT: {
+            unmarshal_VkPhysicalDeviceLineRasterizationFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceLineRasterizationFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceLineRasterizationPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceLineRasterizationPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT: {
+            unmarshal_VkPhysicalDeviceLineRasterizationPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceLineRasterizationPropertiesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT:
-        {
-            unmarshal_VkPipelineRasterizationLineStateCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkPipelineRasterizationLineStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT: {
+            unmarshal_VkPipelineRasterizationLineStateCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineRasterizationLineStateCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_shader_atomic_float
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT: {
+            unmarshal_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_index_type_uint8
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceIndexTypeUint8FeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT: {
+            unmarshal_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceIndexTypeUint8FeaturesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT: {
+            unmarshal_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_shader_atomic_float2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT: {
+            unmarshal_VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT: {
+            unmarshal_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_device_generated_commands
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV:
-        {
-            unmarshal_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV: {
+            unmarshal_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV:
-        {
-            unmarshal_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV: {
+            unmarshal_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV:
-        {
-            unmarshal_VkGraphicsPipelineShaderGroupsCreateInfoNV(vkStream, rootType, reinterpret_cast<VkGraphicsPipelineShaderGroupsCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV: {
+            unmarshal_VkGraphicsPipelineShaderGroupsCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkGraphicsPipelineShaderGroupsCreateInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_inherited_viewport_scissor
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV:
-        {
-            unmarshal_VkPhysicalDeviceInheritedViewportScissorFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceInheritedViewportScissorFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV: {
+            unmarshal_VkPhysicalDeviceInheritedViewportScissorFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceInheritedViewportScissorFeaturesNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_VIEWPORT_SCISSOR_INFO_NV:
-        {
-            unmarshal_VkCommandBufferInheritanceViewportScissorInfoNV(vkStream, rootType, reinterpret_cast<VkCommandBufferInheritanceViewportScissorInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_VIEWPORT_SCISSOR_INFO_NV: {
+            unmarshal_VkCommandBufferInheritanceViewportScissorInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkCommandBufferInheritanceViewportScissorInfoNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_texel_buffer_alignment
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: {
+            unmarshal_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT: {
+            unmarshal_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_QCOM_render_pass_transform
-        case VK_STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM:
-        {
-            unmarshal_VkRenderPassTransformBeginInfoQCOM(vkStream, rootType, reinterpret_cast<VkRenderPassTransformBeginInfoQCOM*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM: {
+            unmarshal_VkRenderPassTransformBeginInfoQCOM(
+                vkStream, rootType,
+                reinterpret_cast<VkRenderPassTransformBeginInfoQCOM*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM:
-        {
-            unmarshal_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(vkStream, rootType, reinterpret_cast<VkCommandBufferInheritanceRenderPassTransformInfoQCOM*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM: {
+            unmarshal_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(
+                vkStream, rootType,
+                reinterpret_cast<VkCommandBufferInheritanceRenderPassTransformInfoQCOM*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_device_memory_report
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceDeviceMemoryReportFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT: {
+            unmarshal_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceDeviceMemoryReportFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT:
-        {
-            unmarshal_VkDeviceDeviceMemoryReportCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkDeviceDeviceMemoryReportCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT: {
+            unmarshal_VkDeviceDeviceMemoryReportCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkDeviceDeviceMemoryReportCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_robustness2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceRobustness2FeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceRobustness2FeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT: {
+            unmarshal_VkPhysicalDeviceRobustness2FeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceRobustness2FeaturesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceRobustness2PropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceRobustness2PropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT: {
+            unmarshal_VkPhysicalDeviceRobustness2PropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceRobustness2PropertiesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_custom_border_color
-        case VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT:
-        {
-            unmarshal_VkSamplerCustomBorderColorCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkSamplerCustomBorderColorCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT: {
+            unmarshal_VkSamplerCustomBorderColorCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkSamplerCustomBorderColorCreateInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceCustomBorderColorPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceCustomBorderColorPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT: {
+            unmarshal_VkPhysicalDeviceCustomBorderColorPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceCustomBorderColorPropertiesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceCustomBorderColorFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceCustomBorderColorFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT: {
+            unmarshal_VkPhysicalDeviceCustomBorderColorFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceCustomBorderColorFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_private_data
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDevicePrivateDataFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDevicePrivateDataFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT: {
+            unmarshal_VkPhysicalDevicePrivateDataFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDevicePrivateDataFeaturesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT:
-        {
-            unmarshal_VkDevicePrivateDataCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkDevicePrivateDataCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT: {
+            unmarshal_VkDevicePrivateDataCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkDevicePrivateDataCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_pipeline_creation_cache_control
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT: {
+            unmarshal_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_device_diagnostics_config
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV:
-        {
-            unmarshal_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceDiagnosticsConfigFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV: {
+            unmarshal_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceDiagnosticsConfigFeaturesNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV:
-        {
-            unmarshal_VkDeviceDiagnosticsConfigCreateInfoNV(vkStream, rootType, reinterpret_cast<VkDeviceDiagnosticsConfigCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV: {
+            unmarshal_VkDeviceDiagnosticsConfigCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkDeviceDiagnosticsConfigCreateInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_fragment_shading_rate_enums
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV:
-        {
-            unmarshal_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV: {
+            unmarshal_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV:
-        {
-            unmarshal_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV: {
+            unmarshal_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV:
-        {
-            unmarshal_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(vkStream, rootType, reinterpret_cast<VkPipelineFragmentShadingRateEnumStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV: {
+            unmarshal_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineFragmentShadingRateEnumStateCreateInfoNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_ray_tracing_motion_blur
-        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_MOTION_TRIANGLES_DATA_NV:
-        {
-            unmarshal_VkAccelerationStructureGeometryMotionTrianglesDataNV(vkStream, rootType, reinterpret_cast<VkAccelerationStructureGeometryMotionTrianglesDataNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_MOTION_TRIANGLES_DATA_NV: {
+            unmarshal_VkAccelerationStructureGeometryMotionTrianglesDataNV(
+                vkStream, rootType,
+                reinterpret_cast<VkAccelerationStructureGeometryMotionTrianglesDataNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MOTION_INFO_NV:
-        {
-            unmarshal_VkAccelerationStructureMotionInfoNV(vkStream, rootType, reinterpret_cast<VkAccelerationStructureMotionInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MOTION_INFO_NV: {
+            unmarshal_VkAccelerationStructureMotionInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkAccelerationStructureMotionInfoNV*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV:
-        {
-            unmarshal_VkPhysicalDeviceRayTracingMotionBlurFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceRayTracingMotionBlurFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV: {
+            unmarshal_VkPhysicalDeviceRayTracingMotionBlurFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceRayTracingMotionBlurFeaturesNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_ycbcr_2plane_444_formats
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT: {
+            unmarshal_VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_fragment_density_map2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2FeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT: {
+            unmarshal_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2FeaturesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2PropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT: {
+            unmarshal_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2PropertiesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_QCOM_rotated_copy_commands
-        case VK_STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM:
-        {
-            unmarshal_VkCopyCommandTransformInfoQCOM(vkStream, rootType, reinterpret_cast<VkCopyCommandTransformInfoQCOM*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM: {
+            unmarshal_VkCopyCommandTransformInfoQCOM(
+                vkStream, rootType,
+                reinterpret_cast<VkCopyCommandTransformInfoQCOM*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_image_robustness
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceImageRobustnessFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceImageRobustnessFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT: {
+            unmarshal_VkPhysicalDeviceImageRobustnessFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceImageRobustnessFeaturesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_4444_formats
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDevice4444FormatsFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDevice4444FormatsFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT: {
+            unmarshal_VkPhysicalDevice4444FormatsFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDevice4444FormatsFeaturesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_rgba10x6_formats
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT: {
+            unmarshal_VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_VALVE_mutable_descriptor_type
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE:
-        {
-            unmarshal_VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE: {
+            unmarshal_VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE:
-        {
-            unmarshal_VkMutableDescriptorTypeCreateInfoVALVE(vkStream, rootType, reinterpret_cast<VkMutableDescriptorTypeCreateInfoVALVE*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE: {
+            unmarshal_VkMutableDescriptorTypeCreateInfoVALVE(
+                vkStream, rootType,
+                reinterpret_cast<VkMutableDescriptorTypeCreateInfoVALVE*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_vertex_input_dynamic_state
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT: {
+            unmarshal_VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_physical_device_drm
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRM_PROPERTIES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceDrmPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceDrmPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRM_PROPERTIES_EXT: {
+            unmarshal_VkPhysicalDeviceDrmPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceDrmPropertiesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_primitive_topology_list_restart
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT: {
+            unmarshal_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_FUCHSIA_external_memory
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA:
-        {
-            unmarshal_VkImportMemoryZirconHandleInfoFUCHSIA(vkStream, rootType, reinterpret_cast<VkImportMemoryZirconHandleInfoFUCHSIA*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA: {
+            unmarshal_VkImportMemoryZirconHandleInfoFUCHSIA(
+                vkStream, rootType,
+                reinterpret_cast<VkImportMemoryZirconHandleInfoFUCHSIA*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA:
-        {
-            unmarshal_VkImportMemoryBufferCollectionFUCHSIA(vkStream, rootType, reinterpret_cast<VkImportMemoryBufferCollectionFUCHSIA*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA: {
+            unmarshal_VkImportMemoryBufferCollectionFUCHSIA(
+                vkStream, rootType,
+                reinterpret_cast<VkImportMemoryBufferCollectionFUCHSIA*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA:
-        {
-            unmarshal_VkBufferCollectionImageCreateInfoFUCHSIA(vkStream, rootType, reinterpret_cast<VkBufferCollectionImageCreateInfoFUCHSIA*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA: {
+            unmarshal_VkBufferCollectionImageCreateInfoFUCHSIA(
+                vkStream, rootType,
+                reinterpret_cast<VkBufferCollectionImageCreateInfoFUCHSIA*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_BUFFER_CREATE_INFO_FUCHSIA:
-        {
-            unmarshal_VkBufferCollectionBufferCreateInfoFUCHSIA(vkStream, rootType, reinterpret_cast<VkBufferCollectionBufferCreateInfoFUCHSIA*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_BUFFER_CREATE_INFO_FUCHSIA: {
+            unmarshal_VkBufferCollectionBufferCreateInfoFUCHSIA(
+                vkStream, rootType,
+                reinterpret_cast<VkBufferCollectionBufferCreateInfoFUCHSIA*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_HUAWEI_subpass_shading
-        case VK_STRUCTURE_TYPE_SUBPASS_SHADING_PIPELINE_CREATE_INFO_HUAWEI:
-        {
-            unmarshal_VkSubpassShadingPipelineCreateInfoHUAWEI(vkStream, rootType, reinterpret_cast<VkSubpassShadingPipelineCreateInfoHUAWEI*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SUBPASS_SHADING_PIPELINE_CREATE_INFO_HUAWEI: {
+            unmarshal_VkSubpassShadingPipelineCreateInfoHUAWEI(
+                vkStream, rootType,
+                reinterpret_cast<VkSubpassShadingPipelineCreateInfoHUAWEI*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI:
-        {
-            unmarshal_VkPhysicalDeviceSubpassShadingFeaturesHUAWEI(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceSubpassShadingFeaturesHUAWEI*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI: {
+            unmarshal_VkPhysicalDeviceSubpassShadingFeaturesHUAWEI(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceSubpassShadingFeaturesHUAWEI*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_PROPERTIES_HUAWEI:
-        {
-            unmarshal_VkPhysicalDeviceSubpassShadingPropertiesHUAWEI(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceSubpassShadingPropertiesHUAWEI*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_PROPERTIES_HUAWEI: {
+            unmarshal_VkPhysicalDeviceSubpassShadingPropertiesHUAWEI(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceSubpassShadingPropertiesHUAWEI*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_HUAWEI_invocation_mask
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI:
-        {
-            unmarshal_VkPhysicalDeviceInvocationMaskFeaturesHUAWEI(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceInvocationMaskFeaturesHUAWEI*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI: {
+            unmarshal_VkPhysicalDeviceInvocationMaskFeaturesHUAWEI(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceInvocationMaskFeaturesHUAWEI*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_external_memory_rdma
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV:
-        {
-            unmarshal_VkPhysicalDeviceExternalMemoryRDMAFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceExternalMemoryRDMAFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV: {
+            unmarshal_VkPhysicalDeviceExternalMemoryRDMAFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceExternalMemoryRDMAFeaturesNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceExtendedDynamicState2FeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceExtendedDynamicState2FeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT: {
+            unmarshal_VkPhysicalDeviceExtendedDynamicState2FeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceExtendedDynamicState2FeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_color_write_enable
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceColorWriteEnableFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceColorWriteEnableFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT: {
+            unmarshal_VkPhysicalDeviceColorWriteEnableFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceColorWriteEnableFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_WRITE_CREATE_INFO_EXT:
-        {
-            unmarshal_VkPipelineColorWriteCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkPipelineColorWriteCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_WRITE_CREATE_INFO_EXT: {
+            unmarshal_VkPipelineColorWriteCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineColorWriteCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_GOOGLE_gfxstream
-        case VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE:
-        {
-            unmarshal_VkImportColorBufferGOOGLE(vkStream, rootType, reinterpret_cast<VkImportColorBufferGOOGLE*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE: {
+            unmarshal_VkImportColorBufferGOOGLE(
+                vkStream, rootType,
+                reinterpret_cast<VkImportColorBufferGOOGLE*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE:
-        {
-            unmarshal_VkImportBufferGOOGLE(vkStream, rootType, reinterpret_cast<VkImportBufferGOOGLE*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE: {
+            unmarshal_VkImportBufferGOOGLE(
+                vkStream, rootType, reinterpret_cast<VkImportBufferGOOGLE*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE:
-        {
-            unmarshal_VkImportPhysicalAddressGOOGLE(vkStream, rootType, reinterpret_cast<VkImportPhysicalAddressGOOGLE*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE: {
+            unmarshal_VkImportPhysicalAddressGOOGLE(
+                vkStream, rootType,
+                reinterpret_cast<VkImportPhysicalAddressGOOGLE*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_global_priority_query
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT: {
+            unmarshal_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_EXT:
-        {
-            unmarshal_VkQueueFamilyGlobalPriorityPropertiesEXT(vkStream, rootType, reinterpret_cast<VkQueueFamilyGlobalPriorityPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_EXT: {
+            unmarshal_VkQueueFamilyGlobalPriorityPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkQueueFamilyGlobalPriorityPropertiesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_multi_draw
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceMultiDrawFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceMultiDrawFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT: {
+            unmarshal_VkPhysicalDeviceMultiDrawFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceMultiDrawFeaturesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceMultiDrawPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceMultiDrawPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT: {
+            unmarshal_VkPhysicalDeviceMultiDrawPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceMultiDrawPropertiesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_border_color_swizzle
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDeviceBorderColorSwizzleFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceBorderColorSwizzleFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT: {
+            unmarshal_VkPhysicalDeviceBorderColorSwizzleFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceBorderColorSwizzleFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_BORDER_COLOR_COMPONENT_MAPPING_CREATE_INFO_EXT:
-        {
-            unmarshal_VkSamplerBorderColorComponentMappingCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkSamplerBorderColorComponentMappingCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SAMPLER_BORDER_COLOR_COMPONENT_MAPPING_CREATE_INFO_EXT: {
+            unmarshal_VkSamplerBorderColorComponentMappingCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkSamplerBorderColorComponentMappingCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_pageable_device_local_memory
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT:
-        {
-            unmarshal_VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT: {
+            unmarshal_VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_acceleration_structure
-        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR:
-        {
-            unmarshal_VkWriteDescriptorSetAccelerationStructureKHR(vkStream, rootType, reinterpret_cast<VkWriteDescriptorSetAccelerationStructureKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR: {
+            unmarshal_VkWriteDescriptorSetAccelerationStructureKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkWriteDescriptorSetAccelerationStructureKHR*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR:
-        {
-            unmarshal_VkPhysicalDeviceAccelerationStructureFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceAccelerationStructureFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR: {
+            unmarshal_VkPhysicalDeviceAccelerationStructureFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceAccelerationStructureFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR:
-        {
-            unmarshal_VkPhysicalDeviceAccelerationStructurePropertiesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceAccelerationStructurePropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR: {
+            unmarshal_VkPhysicalDeviceAccelerationStructurePropertiesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceAccelerationStructurePropertiesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR:
-        {
-            unmarshal_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceRayTracingPipelineFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR: {
+            unmarshal_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceRayTracingPipelineFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR:
-        {
-            unmarshal_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceRayTracingPipelinePropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR: {
+            unmarshal_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceRayTracingPipelinePropertiesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_ray_query
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR:
-        {
-            unmarshal_VkPhysicalDeviceRayQueryFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceRayQueryFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR: {
+            unmarshal_VkPhysicalDeviceRayQueryFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceRayQueryFeaturesKHR*>(structExtension_out));
             break;
         }
 #endif
-        default:
-        {
+        default: {
             // fatal; the switch is only taken if the extension struct is known
             abort();
         }
     }
 }
 
-const char* api_opcode_to_string(
-    const uint32_t opcode)
-{
-    switch(opcode)
-    {
+const char* api_opcode_to_string(const uint32_t opcode) {
+    switch (opcode) {
 #ifdef VK_VERSION_1_0
-        case OP_vkCreateInstance:
-        {
+        case OP_vkCreateInstance: {
             return "OP_vkCreateInstance";
         }
-        case OP_vkDestroyInstance:
-        {
+        case OP_vkDestroyInstance: {
             return "OP_vkDestroyInstance";
         }
-        case OP_vkEnumeratePhysicalDevices:
-        {
+        case OP_vkEnumeratePhysicalDevices: {
             return "OP_vkEnumeratePhysicalDevices";
         }
-        case OP_vkGetPhysicalDeviceFeatures:
-        {
+        case OP_vkGetPhysicalDeviceFeatures: {
             return "OP_vkGetPhysicalDeviceFeatures";
         }
-        case OP_vkGetPhysicalDeviceFormatProperties:
-        {
+        case OP_vkGetPhysicalDeviceFormatProperties: {
             return "OP_vkGetPhysicalDeviceFormatProperties";
         }
-        case OP_vkGetPhysicalDeviceImageFormatProperties:
-        {
+        case OP_vkGetPhysicalDeviceImageFormatProperties: {
             return "OP_vkGetPhysicalDeviceImageFormatProperties";
         }
-        case OP_vkGetPhysicalDeviceProperties:
-        {
+        case OP_vkGetPhysicalDeviceProperties: {
             return "OP_vkGetPhysicalDeviceProperties";
         }
-        case OP_vkGetPhysicalDeviceQueueFamilyProperties:
-        {
+        case OP_vkGetPhysicalDeviceQueueFamilyProperties: {
             return "OP_vkGetPhysicalDeviceQueueFamilyProperties";
         }
-        case OP_vkGetPhysicalDeviceMemoryProperties:
-        {
+        case OP_vkGetPhysicalDeviceMemoryProperties: {
             return "OP_vkGetPhysicalDeviceMemoryProperties";
         }
-        case OP_vkGetInstanceProcAddr:
-        {
+        case OP_vkGetInstanceProcAddr: {
             return "OP_vkGetInstanceProcAddr";
         }
-        case OP_vkGetDeviceProcAddr:
-        {
+        case OP_vkGetDeviceProcAddr: {
             return "OP_vkGetDeviceProcAddr";
         }
-        case OP_vkCreateDevice:
-        {
+        case OP_vkCreateDevice: {
             return "OP_vkCreateDevice";
         }
-        case OP_vkDestroyDevice:
-        {
+        case OP_vkDestroyDevice: {
             return "OP_vkDestroyDevice";
         }
-        case OP_vkEnumerateInstanceExtensionProperties:
-        {
+        case OP_vkEnumerateInstanceExtensionProperties: {
             return "OP_vkEnumerateInstanceExtensionProperties";
         }
-        case OP_vkEnumerateDeviceExtensionProperties:
-        {
+        case OP_vkEnumerateDeviceExtensionProperties: {
             return "OP_vkEnumerateDeviceExtensionProperties";
         }
-        case OP_vkEnumerateInstanceLayerProperties:
-        {
+        case OP_vkEnumerateInstanceLayerProperties: {
             return "OP_vkEnumerateInstanceLayerProperties";
         }
-        case OP_vkEnumerateDeviceLayerProperties:
-        {
+        case OP_vkEnumerateDeviceLayerProperties: {
             return "OP_vkEnumerateDeviceLayerProperties";
         }
-        case OP_vkGetDeviceQueue:
-        {
+        case OP_vkGetDeviceQueue: {
             return "OP_vkGetDeviceQueue";
         }
-        case OP_vkQueueSubmit:
-        {
+        case OP_vkQueueSubmit: {
             return "OP_vkQueueSubmit";
         }
-        case OP_vkQueueWaitIdle:
-        {
+        case OP_vkQueueWaitIdle: {
             return "OP_vkQueueWaitIdle";
         }
-        case OP_vkDeviceWaitIdle:
-        {
+        case OP_vkDeviceWaitIdle: {
             return "OP_vkDeviceWaitIdle";
         }
-        case OP_vkAllocateMemory:
-        {
+        case OP_vkAllocateMemory: {
             return "OP_vkAllocateMemory";
         }
-        case OP_vkFreeMemory:
-        {
+        case OP_vkFreeMemory: {
             return "OP_vkFreeMemory";
         }
-        case OP_vkMapMemory:
-        {
+        case OP_vkMapMemory: {
             return "OP_vkMapMemory";
         }
-        case OP_vkUnmapMemory:
-        {
+        case OP_vkUnmapMemory: {
             return "OP_vkUnmapMemory";
         }
-        case OP_vkFlushMappedMemoryRanges:
-        {
+        case OP_vkFlushMappedMemoryRanges: {
             return "OP_vkFlushMappedMemoryRanges";
         }
-        case OP_vkInvalidateMappedMemoryRanges:
-        {
+        case OP_vkInvalidateMappedMemoryRanges: {
             return "OP_vkInvalidateMappedMemoryRanges";
         }
-        case OP_vkGetDeviceMemoryCommitment:
-        {
+        case OP_vkGetDeviceMemoryCommitment: {
             return "OP_vkGetDeviceMemoryCommitment";
         }
-        case OP_vkBindBufferMemory:
-        {
+        case OP_vkBindBufferMemory: {
             return "OP_vkBindBufferMemory";
         }
-        case OP_vkBindImageMemory:
-        {
+        case OP_vkBindImageMemory: {
             return "OP_vkBindImageMemory";
         }
-        case OP_vkGetBufferMemoryRequirements:
-        {
+        case OP_vkGetBufferMemoryRequirements: {
             return "OP_vkGetBufferMemoryRequirements";
         }
-        case OP_vkGetImageMemoryRequirements:
-        {
+        case OP_vkGetImageMemoryRequirements: {
             return "OP_vkGetImageMemoryRequirements";
         }
-        case OP_vkGetImageSparseMemoryRequirements:
-        {
+        case OP_vkGetImageSparseMemoryRequirements: {
             return "OP_vkGetImageSparseMemoryRequirements";
         }
-        case OP_vkGetPhysicalDeviceSparseImageFormatProperties:
-        {
+        case OP_vkGetPhysicalDeviceSparseImageFormatProperties: {
             return "OP_vkGetPhysicalDeviceSparseImageFormatProperties";
         }
-        case OP_vkQueueBindSparse:
-        {
+        case OP_vkQueueBindSparse: {
             return "OP_vkQueueBindSparse";
         }
-        case OP_vkCreateFence:
-        {
+        case OP_vkCreateFence: {
             return "OP_vkCreateFence";
         }
-        case OP_vkDestroyFence:
-        {
+        case OP_vkDestroyFence: {
             return "OP_vkDestroyFence";
         }
-        case OP_vkResetFences:
-        {
+        case OP_vkResetFences: {
             return "OP_vkResetFences";
         }
-        case OP_vkGetFenceStatus:
-        {
+        case OP_vkGetFenceStatus: {
             return "OP_vkGetFenceStatus";
         }
-        case OP_vkWaitForFences:
-        {
+        case OP_vkWaitForFences: {
             return "OP_vkWaitForFences";
         }
-        case OP_vkCreateSemaphore:
-        {
+        case OP_vkCreateSemaphore: {
             return "OP_vkCreateSemaphore";
         }
-        case OP_vkDestroySemaphore:
-        {
+        case OP_vkDestroySemaphore: {
             return "OP_vkDestroySemaphore";
         }
-        case OP_vkCreateEvent:
-        {
+        case OP_vkCreateEvent: {
             return "OP_vkCreateEvent";
         }
-        case OP_vkDestroyEvent:
-        {
+        case OP_vkDestroyEvent: {
             return "OP_vkDestroyEvent";
         }
-        case OP_vkGetEventStatus:
-        {
+        case OP_vkGetEventStatus: {
             return "OP_vkGetEventStatus";
         }
-        case OP_vkSetEvent:
-        {
+        case OP_vkSetEvent: {
             return "OP_vkSetEvent";
         }
-        case OP_vkResetEvent:
-        {
+        case OP_vkResetEvent: {
             return "OP_vkResetEvent";
         }
-        case OP_vkCreateQueryPool:
-        {
+        case OP_vkCreateQueryPool: {
             return "OP_vkCreateQueryPool";
         }
-        case OP_vkDestroyQueryPool:
-        {
+        case OP_vkDestroyQueryPool: {
             return "OP_vkDestroyQueryPool";
         }
-        case OP_vkGetQueryPoolResults:
-        {
+        case OP_vkGetQueryPoolResults: {
             return "OP_vkGetQueryPoolResults";
         }
-        case OP_vkCreateBuffer:
-        {
+        case OP_vkCreateBuffer: {
             return "OP_vkCreateBuffer";
         }
-        case OP_vkDestroyBuffer:
-        {
+        case OP_vkDestroyBuffer: {
             return "OP_vkDestroyBuffer";
         }
-        case OP_vkCreateBufferView:
-        {
+        case OP_vkCreateBufferView: {
             return "OP_vkCreateBufferView";
         }
-        case OP_vkDestroyBufferView:
-        {
+        case OP_vkDestroyBufferView: {
             return "OP_vkDestroyBufferView";
         }
-        case OP_vkCreateImage:
-        {
+        case OP_vkCreateImage: {
             return "OP_vkCreateImage";
         }
-        case OP_vkDestroyImage:
-        {
+        case OP_vkDestroyImage: {
             return "OP_vkDestroyImage";
         }
-        case OP_vkGetImageSubresourceLayout:
-        {
+        case OP_vkGetImageSubresourceLayout: {
             return "OP_vkGetImageSubresourceLayout";
         }
-        case OP_vkCreateImageView:
-        {
+        case OP_vkCreateImageView: {
             return "OP_vkCreateImageView";
         }
-        case OP_vkDestroyImageView:
-        {
+        case OP_vkDestroyImageView: {
             return "OP_vkDestroyImageView";
         }
-        case OP_vkCreateShaderModule:
-        {
+        case OP_vkCreateShaderModule: {
             return "OP_vkCreateShaderModule";
         }
-        case OP_vkDestroyShaderModule:
-        {
+        case OP_vkDestroyShaderModule: {
             return "OP_vkDestroyShaderModule";
         }
-        case OP_vkCreatePipelineCache:
-        {
+        case OP_vkCreatePipelineCache: {
             return "OP_vkCreatePipelineCache";
         }
-        case OP_vkDestroyPipelineCache:
-        {
+        case OP_vkDestroyPipelineCache: {
             return "OP_vkDestroyPipelineCache";
         }
-        case OP_vkGetPipelineCacheData:
-        {
+        case OP_vkGetPipelineCacheData: {
             return "OP_vkGetPipelineCacheData";
         }
-        case OP_vkMergePipelineCaches:
-        {
+        case OP_vkMergePipelineCaches: {
             return "OP_vkMergePipelineCaches";
         }
-        case OP_vkCreateGraphicsPipelines:
-        {
+        case OP_vkCreateGraphicsPipelines: {
             return "OP_vkCreateGraphicsPipelines";
         }
-        case OP_vkCreateComputePipelines:
-        {
+        case OP_vkCreateComputePipelines: {
             return "OP_vkCreateComputePipelines";
         }
-        case OP_vkDestroyPipeline:
-        {
+        case OP_vkDestroyPipeline: {
             return "OP_vkDestroyPipeline";
         }
-        case OP_vkCreatePipelineLayout:
-        {
+        case OP_vkCreatePipelineLayout: {
             return "OP_vkCreatePipelineLayout";
         }
-        case OP_vkDestroyPipelineLayout:
-        {
+        case OP_vkDestroyPipelineLayout: {
             return "OP_vkDestroyPipelineLayout";
         }
-        case OP_vkCreateSampler:
-        {
+        case OP_vkCreateSampler: {
             return "OP_vkCreateSampler";
         }
-        case OP_vkDestroySampler:
-        {
+        case OP_vkDestroySampler: {
             return "OP_vkDestroySampler";
         }
-        case OP_vkCreateDescriptorSetLayout:
-        {
+        case OP_vkCreateDescriptorSetLayout: {
             return "OP_vkCreateDescriptorSetLayout";
         }
-        case OP_vkDestroyDescriptorSetLayout:
-        {
+        case OP_vkDestroyDescriptorSetLayout: {
             return "OP_vkDestroyDescriptorSetLayout";
         }
-        case OP_vkCreateDescriptorPool:
-        {
+        case OP_vkCreateDescriptorPool: {
             return "OP_vkCreateDescriptorPool";
         }
-        case OP_vkDestroyDescriptorPool:
-        {
+        case OP_vkDestroyDescriptorPool: {
             return "OP_vkDestroyDescriptorPool";
         }
-        case OP_vkResetDescriptorPool:
-        {
+        case OP_vkResetDescriptorPool: {
             return "OP_vkResetDescriptorPool";
         }
-        case OP_vkAllocateDescriptorSets:
-        {
+        case OP_vkAllocateDescriptorSets: {
             return "OP_vkAllocateDescriptorSets";
         }
-        case OP_vkFreeDescriptorSets:
-        {
+        case OP_vkFreeDescriptorSets: {
             return "OP_vkFreeDescriptorSets";
         }
-        case OP_vkUpdateDescriptorSets:
-        {
+        case OP_vkUpdateDescriptorSets: {
             return "OP_vkUpdateDescriptorSets";
         }
-        case OP_vkCreateFramebuffer:
-        {
+        case OP_vkCreateFramebuffer: {
             return "OP_vkCreateFramebuffer";
         }
-        case OP_vkDestroyFramebuffer:
-        {
+        case OP_vkDestroyFramebuffer: {
             return "OP_vkDestroyFramebuffer";
         }
-        case OP_vkCreateRenderPass:
-        {
+        case OP_vkCreateRenderPass: {
             return "OP_vkCreateRenderPass";
         }
-        case OP_vkDestroyRenderPass:
-        {
+        case OP_vkDestroyRenderPass: {
             return "OP_vkDestroyRenderPass";
         }
-        case OP_vkGetRenderAreaGranularity:
-        {
+        case OP_vkGetRenderAreaGranularity: {
             return "OP_vkGetRenderAreaGranularity";
         }
-        case OP_vkCreateCommandPool:
-        {
+        case OP_vkCreateCommandPool: {
             return "OP_vkCreateCommandPool";
         }
-        case OP_vkDestroyCommandPool:
-        {
+        case OP_vkDestroyCommandPool: {
             return "OP_vkDestroyCommandPool";
         }
-        case OP_vkResetCommandPool:
-        {
+        case OP_vkResetCommandPool: {
             return "OP_vkResetCommandPool";
         }
-        case OP_vkAllocateCommandBuffers:
-        {
+        case OP_vkAllocateCommandBuffers: {
             return "OP_vkAllocateCommandBuffers";
         }
-        case OP_vkFreeCommandBuffers:
-        {
+        case OP_vkFreeCommandBuffers: {
             return "OP_vkFreeCommandBuffers";
         }
-        case OP_vkBeginCommandBuffer:
-        {
+        case OP_vkBeginCommandBuffer: {
             return "OP_vkBeginCommandBuffer";
         }
-        case OP_vkEndCommandBuffer:
-        {
+        case OP_vkEndCommandBuffer: {
             return "OP_vkEndCommandBuffer";
         }
-        case OP_vkResetCommandBuffer:
-        {
+        case OP_vkResetCommandBuffer: {
             return "OP_vkResetCommandBuffer";
         }
-        case OP_vkCmdBindPipeline:
-        {
+        case OP_vkCmdBindPipeline: {
             return "OP_vkCmdBindPipeline";
         }
-        case OP_vkCmdSetViewport:
-        {
+        case OP_vkCmdSetViewport: {
             return "OP_vkCmdSetViewport";
         }
-        case OP_vkCmdSetScissor:
-        {
+        case OP_vkCmdSetScissor: {
             return "OP_vkCmdSetScissor";
         }
-        case OP_vkCmdSetLineWidth:
-        {
+        case OP_vkCmdSetLineWidth: {
             return "OP_vkCmdSetLineWidth";
         }
-        case OP_vkCmdSetDepthBias:
-        {
+        case OP_vkCmdSetDepthBias: {
             return "OP_vkCmdSetDepthBias";
         }
-        case OP_vkCmdSetBlendConstants:
-        {
+        case OP_vkCmdSetBlendConstants: {
             return "OP_vkCmdSetBlendConstants";
         }
-        case OP_vkCmdSetDepthBounds:
-        {
+        case OP_vkCmdSetDepthBounds: {
             return "OP_vkCmdSetDepthBounds";
         }
-        case OP_vkCmdSetStencilCompareMask:
-        {
+        case OP_vkCmdSetStencilCompareMask: {
             return "OP_vkCmdSetStencilCompareMask";
         }
-        case OP_vkCmdSetStencilWriteMask:
-        {
+        case OP_vkCmdSetStencilWriteMask: {
             return "OP_vkCmdSetStencilWriteMask";
         }
-        case OP_vkCmdSetStencilReference:
-        {
+        case OP_vkCmdSetStencilReference: {
             return "OP_vkCmdSetStencilReference";
         }
-        case OP_vkCmdBindDescriptorSets:
-        {
+        case OP_vkCmdBindDescriptorSets: {
             return "OP_vkCmdBindDescriptorSets";
         }
-        case OP_vkCmdBindIndexBuffer:
-        {
+        case OP_vkCmdBindIndexBuffer: {
             return "OP_vkCmdBindIndexBuffer";
         }
-        case OP_vkCmdBindVertexBuffers:
-        {
+        case OP_vkCmdBindVertexBuffers: {
             return "OP_vkCmdBindVertexBuffers";
         }
-        case OP_vkCmdDraw:
-        {
+        case OP_vkCmdDraw: {
             return "OP_vkCmdDraw";
         }
-        case OP_vkCmdDrawIndexed:
-        {
+        case OP_vkCmdDrawIndexed: {
             return "OP_vkCmdDrawIndexed";
         }
-        case OP_vkCmdDrawIndirect:
-        {
+        case OP_vkCmdDrawIndirect: {
             return "OP_vkCmdDrawIndirect";
         }
-        case OP_vkCmdDrawIndexedIndirect:
-        {
+        case OP_vkCmdDrawIndexedIndirect: {
             return "OP_vkCmdDrawIndexedIndirect";
         }
-        case OP_vkCmdDispatch:
-        {
+        case OP_vkCmdDispatch: {
             return "OP_vkCmdDispatch";
         }
-        case OP_vkCmdDispatchIndirect:
-        {
+        case OP_vkCmdDispatchIndirect: {
             return "OP_vkCmdDispatchIndirect";
         }
-        case OP_vkCmdCopyBuffer:
-        {
+        case OP_vkCmdCopyBuffer: {
             return "OP_vkCmdCopyBuffer";
         }
-        case OP_vkCmdCopyImage:
-        {
+        case OP_vkCmdCopyImage: {
             return "OP_vkCmdCopyImage";
         }
-        case OP_vkCmdBlitImage:
-        {
+        case OP_vkCmdBlitImage: {
             return "OP_vkCmdBlitImage";
         }
-        case OP_vkCmdCopyBufferToImage:
-        {
+        case OP_vkCmdCopyBufferToImage: {
             return "OP_vkCmdCopyBufferToImage";
         }
-        case OP_vkCmdCopyImageToBuffer:
-        {
+        case OP_vkCmdCopyImageToBuffer: {
             return "OP_vkCmdCopyImageToBuffer";
         }
-        case OP_vkCmdUpdateBuffer:
-        {
+        case OP_vkCmdUpdateBuffer: {
             return "OP_vkCmdUpdateBuffer";
         }
-        case OP_vkCmdFillBuffer:
-        {
+        case OP_vkCmdFillBuffer: {
             return "OP_vkCmdFillBuffer";
         }
-        case OP_vkCmdClearColorImage:
-        {
+        case OP_vkCmdClearColorImage: {
             return "OP_vkCmdClearColorImage";
         }
-        case OP_vkCmdClearDepthStencilImage:
-        {
+        case OP_vkCmdClearDepthStencilImage: {
             return "OP_vkCmdClearDepthStencilImage";
         }
-        case OP_vkCmdClearAttachments:
-        {
+        case OP_vkCmdClearAttachments: {
             return "OP_vkCmdClearAttachments";
         }
-        case OP_vkCmdResolveImage:
-        {
+        case OP_vkCmdResolveImage: {
             return "OP_vkCmdResolveImage";
         }
-        case OP_vkCmdSetEvent:
-        {
+        case OP_vkCmdSetEvent: {
             return "OP_vkCmdSetEvent";
         }
-        case OP_vkCmdResetEvent:
-        {
+        case OP_vkCmdResetEvent: {
             return "OP_vkCmdResetEvent";
         }
-        case OP_vkCmdWaitEvents:
-        {
+        case OP_vkCmdWaitEvents: {
             return "OP_vkCmdWaitEvents";
         }
-        case OP_vkCmdPipelineBarrier:
-        {
+        case OP_vkCmdPipelineBarrier: {
             return "OP_vkCmdPipelineBarrier";
         }
-        case OP_vkCmdBeginQuery:
-        {
+        case OP_vkCmdBeginQuery: {
             return "OP_vkCmdBeginQuery";
         }
-        case OP_vkCmdEndQuery:
-        {
+        case OP_vkCmdEndQuery: {
             return "OP_vkCmdEndQuery";
         }
-        case OP_vkCmdResetQueryPool:
-        {
+        case OP_vkCmdResetQueryPool: {
             return "OP_vkCmdResetQueryPool";
         }
-        case OP_vkCmdWriteTimestamp:
-        {
+        case OP_vkCmdWriteTimestamp: {
             return "OP_vkCmdWriteTimestamp";
         }
-        case OP_vkCmdCopyQueryPoolResults:
-        {
+        case OP_vkCmdCopyQueryPoolResults: {
             return "OP_vkCmdCopyQueryPoolResults";
         }
-        case OP_vkCmdPushConstants:
-        {
+        case OP_vkCmdPushConstants: {
             return "OP_vkCmdPushConstants";
         }
-        case OP_vkCmdBeginRenderPass:
-        {
+        case OP_vkCmdBeginRenderPass: {
             return "OP_vkCmdBeginRenderPass";
         }
-        case OP_vkCmdNextSubpass:
-        {
+        case OP_vkCmdNextSubpass: {
             return "OP_vkCmdNextSubpass";
         }
-        case OP_vkCmdEndRenderPass:
-        {
+        case OP_vkCmdEndRenderPass: {
             return "OP_vkCmdEndRenderPass";
         }
-        case OP_vkCmdExecuteCommands:
-        {
+        case OP_vkCmdExecuteCommands: {
             return "OP_vkCmdExecuteCommands";
         }
 #endif
 #ifdef VK_VERSION_1_1
-        case OP_vkEnumerateInstanceVersion:
-        {
+        case OP_vkEnumerateInstanceVersion: {
             return "OP_vkEnumerateInstanceVersion";
         }
-        case OP_vkBindBufferMemory2:
-        {
+        case OP_vkBindBufferMemory2: {
             return "OP_vkBindBufferMemory2";
         }
-        case OP_vkBindImageMemory2:
-        {
+        case OP_vkBindImageMemory2: {
             return "OP_vkBindImageMemory2";
         }
-        case OP_vkGetDeviceGroupPeerMemoryFeatures:
-        {
+        case OP_vkGetDeviceGroupPeerMemoryFeatures: {
             return "OP_vkGetDeviceGroupPeerMemoryFeatures";
         }
-        case OP_vkCmdSetDeviceMask:
-        {
+        case OP_vkCmdSetDeviceMask: {
             return "OP_vkCmdSetDeviceMask";
         }
-        case OP_vkCmdDispatchBase:
-        {
+        case OP_vkCmdDispatchBase: {
             return "OP_vkCmdDispatchBase";
         }
-        case OP_vkEnumeratePhysicalDeviceGroups:
-        {
+        case OP_vkEnumeratePhysicalDeviceGroups: {
             return "OP_vkEnumeratePhysicalDeviceGroups";
         }
-        case OP_vkGetImageMemoryRequirements2:
-        {
+        case OP_vkGetImageMemoryRequirements2: {
             return "OP_vkGetImageMemoryRequirements2";
         }
-        case OP_vkGetBufferMemoryRequirements2:
-        {
+        case OP_vkGetBufferMemoryRequirements2: {
             return "OP_vkGetBufferMemoryRequirements2";
         }
-        case OP_vkGetImageSparseMemoryRequirements2:
-        {
+        case OP_vkGetImageSparseMemoryRequirements2: {
             return "OP_vkGetImageSparseMemoryRequirements2";
         }
-        case OP_vkGetPhysicalDeviceFeatures2:
-        {
+        case OP_vkGetPhysicalDeviceFeatures2: {
             return "OP_vkGetPhysicalDeviceFeatures2";
         }
-        case OP_vkGetPhysicalDeviceProperties2:
-        {
+        case OP_vkGetPhysicalDeviceProperties2: {
             return "OP_vkGetPhysicalDeviceProperties2";
         }
-        case OP_vkGetPhysicalDeviceFormatProperties2:
-        {
+        case OP_vkGetPhysicalDeviceFormatProperties2: {
             return "OP_vkGetPhysicalDeviceFormatProperties2";
         }
-        case OP_vkGetPhysicalDeviceImageFormatProperties2:
-        {
+        case OP_vkGetPhysicalDeviceImageFormatProperties2: {
             return "OP_vkGetPhysicalDeviceImageFormatProperties2";
         }
-        case OP_vkGetPhysicalDeviceQueueFamilyProperties2:
-        {
+        case OP_vkGetPhysicalDeviceQueueFamilyProperties2: {
             return "OP_vkGetPhysicalDeviceQueueFamilyProperties2";
         }
-        case OP_vkGetPhysicalDeviceMemoryProperties2:
-        {
+        case OP_vkGetPhysicalDeviceMemoryProperties2: {
             return "OP_vkGetPhysicalDeviceMemoryProperties2";
         }
-        case OP_vkGetPhysicalDeviceSparseImageFormatProperties2:
-        {
+        case OP_vkGetPhysicalDeviceSparseImageFormatProperties2: {
             return "OP_vkGetPhysicalDeviceSparseImageFormatProperties2";
         }
-        case OP_vkTrimCommandPool:
-        {
+        case OP_vkTrimCommandPool: {
             return "OP_vkTrimCommandPool";
         }
-        case OP_vkGetDeviceQueue2:
-        {
+        case OP_vkGetDeviceQueue2: {
             return "OP_vkGetDeviceQueue2";
         }
-        case OP_vkCreateSamplerYcbcrConversion:
-        {
+        case OP_vkCreateSamplerYcbcrConversion: {
             return "OP_vkCreateSamplerYcbcrConversion";
         }
-        case OP_vkDestroySamplerYcbcrConversion:
-        {
+        case OP_vkDestroySamplerYcbcrConversion: {
             return "OP_vkDestroySamplerYcbcrConversion";
         }
-        case OP_vkCreateDescriptorUpdateTemplate:
-        {
+        case OP_vkCreateDescriptorUpdateTemplate: {
             return "OP_vkCreateDescriptorUpdateTemplate";
         }
-        case OP_vkDestroyDescriptorUpdateTemplate:
-        {
+        case OP_vkDestroyDescriptorUpdateTemplate: {
             return "OP_vkDestroyDescriptorUpdateTemplate";
         }
-        case OP_vkUpdateDescriptorSetWithTemplate:
-        {
+        case OP_vkUpdateDescriptorSetWithTemplate: {
             return "OP_vkUpdateDescriptorSetWithTemplate";
         }
-        case OP_vkGetPhysicalDeviceExternalBufferProperties:
-        {
+        case OP_vkGetPhysicalDeviceExternalBufferProperties: {
             return "OP_vkGetPhysicalDeviceExternalBufferProperties";
         }
-        case OP_vkGetPhysicalDeviceExternalFenceProperties:
-        {
+        case OP_vkGetPhysicalDeviceExternalFenceProperties: {
             return "OP_vkGetPhysicalDeviceExternalFenceProperties";
         }
-        case OP_vkGetPhysicalDeviceExternalSemaphoreProperties:
-        {
+        case OP_vkGetPhysicalDeviceExternalSemaphoreProperties: {
             return "OP_vkGetPhysicalDeviceExternalSemaphoreProperties";
         }
-        case OP_vkGetDescriptorSetLayoutSupport:
-        {
+        case OP_vkGetDescriptorSetLayoutSupport: {
             return "OP_vkGetDescriptorSetLayoutSupport";
         }
 #endif
 #ifdef VK_KHR_surface
-        case OP_vkDestroySurfaceKHR:
-        {
+        case OP_vkDestroySurfaceKHR: {
             return "OP_vkDestroySurfaceKHR";
         }
-        case OP_vkGetPhysicalDeviceSurfaceSupportKHR:
-        {
+        case OP_vkGetPhysicalDeviceSurfaceSupportKHR: {
             return "OP_vkGetPhysicalDeviceSurfaceSupportKHR";
         }
-        case OP_vkGetPhysicalDeviceSurfaceCapabilitiesKHR:
-        {
+        case OP_vkGetPhysicalDeviceSurfaceCapabilitiesKHR: {
             return "OP_vkGetPhysicalDeviceSurfaceCapabilitiesKHR";
         }
-        case OP_vkGetPhysicalDeviceSurfaceFormatsKHR:
-        {
+        case OP_vkGetPhysicalDeviceSurfaceFormatsKHR: {
             return "OP_vkGetPhysicalDeviceSurfaceFormatsKHR";
         }
-        case OP_vkGetPhysicalDeviceSurfacePresentModesKHR:
-        {
+        case OP_vkGetPhysicalDeviceSurfacePresentModesKHR: {
             return "OP_vkGetPhysicalDeviceSurfacePresentModesKHR";
         }
 #endif
 #ifdef VK_KHR_swapchain
-        case OP_vkCreateSwapchainKHR:
-        {
+        case OP_vkCreateSwapchainKHR: {
             return "OP_vkCreateSwapchainKHR";
         }
-        case OP_vkDestroySwapchainKHR:
-        {
+        case OP_vkDestroySwapchainKHR: {
             return "OP_vkDestroySwapchainKHR";
         }
-        case OP_vkGetSwapchainImagesKHR:
-        {
+        case OP_vkGetSwapchainImagesKHR: {
             return "OP_vkGetSwapchainImagesKHR";
         }
-        case OP_vkAcquireNextImageKHR:
-        {
+        case OP_vkAcquireNextImageKHR: {
             return "OP_vkAcquireNextImageKHR";
         }
-        case OP_vkQueuePresentKHR:
-        {
+        case OP_vkQueuePresentKHR: {
             return "OP_vkQueuePresentKHR";
         }
-        case OP_vkGetDeviceGroupPresentCapabilitiesKHR:
-        {
+        case OP_vkGetDeviceGroupPresentCapabilitiesKHR: {
             return "OP_vkGetDeviceGroupPresentCapabilitiesKHR";
         }
-        case OP_vkGetDeviceGroupSurfacePresentModesKHR:
-        {
+        case OP_vkGetDeviceGroupSurfacePresentModesKHR: {
             return "OP_vkGetDeviceGroupSurfacePresentModesKHR";
         }
-        case OP_vkGetPhysicalDevicePresentRectanglesKHR:
-        {
+        case OP_vkGetPhysicalDevicePresentRectanglesKHR: {
             return "OP_vkGetPhysicalDevicePresentRectanglesKHR";
         }
-        case OP_vkAcquireNextImage2KHR:
-        {
+        case OP_vkAcquireNextImage2KHR: {
             return "OP_vkAcquireNextImage2KHR";
         }
 #endif
 #ifdef VK_KHR_display
-        case OP_vkGetPhysicalDeviceDisplayPropertiesKHR:
-        {
+        case OP_vkGetPhysicalDeviceDisplayPropertiesKHR: {
             return "OP_vkGetPhysicalDeviceDisplayPropertiesKHR";
         }
-        case OP_vkGetPhysicalDeviceDisplayPlanePropertiesKHR:
-        {
+        case OP_vkGetPhysicalDeviceDisplayPlanePropertiesKHR: {
             return "OP_vkGetPhysicalDeviceDisplayPlanePropertiesKHR";
         }
-        case OP_vkGetDisplayPlaneSupportedDisplaysKHR:
-        {
+        case OP_vkGetDisplayPlaneSupportedDisplaysKHR: {
             return "OP_vkGetDisplayPlaneSupportedDisplaysKHR";
         }
-        case OP_vkGetDisplayModePropertiesKHR:
-        {
+        case OP_vkGetDisplayModePropertiesKHR: {
             return "OP_vkGetDisplayModePropertiesKHR";
         }
-        case OP_vkCreateDisplayModeKHR:
-        {
+        case OP_vkCreateDisplayModeKHR: {
             return "OP_vkCreateDisplayModeKHR";
         }
-        case OP_vkGetDisplayPlaneCapabilitiesKHR:
-        {
+        case OP_vkGetDisplayPlaneCapabilitiesKHR: {
             return "OP_vkGetDisplayPlaneCapabilitiesKHR";
         }
-        case OP_vkCreateDisplayPlaneSurfaceKHR:
-        {
+        case OP_vkCreateDisplayPlaneSurfaceKHR: {
             return "OP_vkCreateDisplayPlaneSurfaceKHR";
         }
 #endif
 #ifdef VK_KHR_display_swapchain
-        case OP_vkCreateSharedSwapchainsKHR:
-        {
+        case OP_vkCreateSharedSwapchainsKHR: {
             return "OP_vkCreateSharedSwapchainsKHR";
         }
 #endif
 #ifdef VK_KHR_xlib_surface
-        case OP_vkCreateXlibSurfaceKHR:
-        {
+        case OP_vkCreateXlibSurfaceKHR: {
             return "OP_vkCreateXlibSurfaceKHR";
         }
-        case OP_vkGetPhysicalDeviceXlibPresentationSupportKHR:
-        {
+        case OP_vkGetPhysicalDeviceXlibPresentationSupportKHR: {
             return "OP_vkGetPhysicalDeviceXlibPresentationSupportKHR";
         }
 #endif
 #ifdef VK_KHR_xcb_surface
-        case OP_vkCreateXcbSurfaceKHR:
-        {
+        case OP_vkCreateXcbSurfaceKHR: {
             return "OP_vkCreateXcbSurfaceKHR";
         }
-        case OP_vkGetPhysicalDeviceXcbPresentationSupportKHR:
-        {
+        case OP_vkGetPhysicalDeviceXcbPresentationSupportKHR: {
             return "OP_vkGetPhysicalDeviceXcbPresentationSupportKHR";
         }
 #endif
 #ifdef VK_KHR_wayland_surface
-        case OP_vkCreateWaylandSurfaceKHR:
-        {
+        case OP_vkCreateWaylandSurfaceKHR: {
             return "OP_vkCreateWaylandSurfaceKHR";
         }
-        case OP_vkGetPhysicalDeviceWaylandPresentationSupportKHR:
-        {
+        case OP_vkGetPhysicalDeviceWaylandPresentationSupportKHR: {
             return "OP_vkGetPhysicalDeviceWaylandPresentationSupportKHR";
         }
 #endif
 #ifdef VK_KHR_android_surface
-        case OP_vkCreateAndroidSurfaceKHR:
-        {
+        case OP_vkCreateAndroidSurfaceKHR: {
             return "OP_vkCreateAndroidSurfaceKHR";
         }
 #endif
 #ifdef VK_KHR_win32_surface
-        case OP_vkCreateWin32SurfaceKHR:
-        {
+        case OP_vkCreateWin32SurfaceKHR: {
             return "OP_vkCreateWin32SurfaceKHR";
         }
-        case OP_vkGetPhysicalDeviceWin32PresentationSupportKHR:
-        {
+        case OP_vkGetPhysicalDeviceWin32PresentationSupportKHR: {
             return "OP_vkGetPhysicalDeviceWin32PresentationSupportKHR";
         }
 #endif
 #ifdef VK_KHR_get_physical_device_properties2
-        case OP_vkGetPhysicalDeviceFeatures2KHR:
-        {
+        case OP_vkGetPhysicalDeviceFeatures2KHR: {
             return "OP_vkGetPhysicalDeviceFeatures2KHR";
         }
-        case OP_vkGetPhysicalDeviceProperties2KHR:
-        {
+        case OP_vkGetPhysicalDeviceProperties2KHR: {
             return "OP_vkGetPhysicalDeviceProperties2KHR";
         }
-        case OP_vkGetPhysicalDeviceFormatProperties2KHR:
-        {
+        case OP_vkGetPhysicalDeviceFormatProperties2KHR: {
             return "OP_vkGetPhysicalDeviceFormatProperties2KHR";
         }
-        case OP_vkGetPhysicalDeviceImageFormatProperties2KHR:
-        {
+        case OP_vkGetPhysicalDeviceImageFormatProperties2KHR: {
             return "OP_vkGetPhysicalDeviceImageFormatProperties2KHR";
         }
-        case OP_vkGetPhysicalDeviceQueueFamilyProperties2KHR:
-        {
+        case OP_vkGetPhysicalDeviceQueueFamilyProperties2KHR: {
             return "OP_vkGetPhysicalDeviceQueueFamilyProperties2KHR";
         }
-        case OP_vkGetPhysicalDeviceMemoryProperties2KHR:
-        {
+        case OP_vkGetPhysicalDeviceMemoryProperties2KHR: {
             return "OP_vkGetPhysicalDeviceMemoryProperties2KHR";
         }
-        case OP_vkGetPhysicalDeviceSparseImageFormatProperties2KHR:
-        {
+        case OP_vkGetPhysicalDeviceSparseImageFormatProperties2KHR: {
             return "OP_vkGetPhysicalDeviceSparseImageFormatProperties2KHR";
         }
 #endif
 #ifdef VK_KHR_device_group
-        case OP_vkGetDeviceGroupPeerMemoryFeaturesKHR:
-        {
+        case OP_vkGetDeviceGroupPeerMemoryFeaturesKHR: {
             return "OP_vkGetDeviceGroupPeerMemoryFeaturesKHR";
         }
-        case OP_vkCmdSetDeviceMaskKHR:
-        {
+        case OP_vkCmdSetDeviceMaskKHR: {
             return "OP_vkCmdSetDeviceMaskKHR";
         }
-        case OP_vkCmdDispatchBaseKHR:
-        {
+        case OP_vkCmdDispatchBaseKHR: {
             return "OP_vkCmdDispatchBaseKHR";
         }
 #endif
 #ifdef VK_KHR_maintenance1
-        case OP_vkTrimCommandPoolKHR:
-        {
+        case OP_vkTrimCommandPoolKHR: {
             return "OP_vkTrimCommandPoolKHR";
         }
 #endif
 #ifdef VK_KHR_device_group_creation
-        case OP_vkEnumeratePhysicalDeviceGroupsKHR:
-        {
+        case OP_vkEnumeratePhysicalDeviceGroupsKHR: {
             return "OP_vkEnumeratePhysicalDeviceGroupsKHR";
         }
 #endif
 #ifdef VK_KHR_external_memory_capabilities
-        case OP_vkGetPhysicalDeviceExternalBufferPropertiesKHR:
-        {
+        case OP_vkGetPhysicalDeviceExternalBufferPropertiesKHR: {
             return "OP_vkGetPhysicalDeviceExternalBufferPropertiesKHR";
         }
 #endif
 #ifdef VK_KHR_external_memory_win32
-        case OP_vkGetMemoryWin32HandleKHR:
-        {
+        case OP_vkGetMemoryWin32HandleKHR: {
             return "OP_vkGetMemoryWin32HandleKHR";
         }
-        case OP_vkGetMemoryWin32HandlePropertiesKHR:
-        {
+        case OP_vkGetMemoryWin32HandlePropertiesKHR: {
             return "OP_vkGetMemoryWin32HandlePropertiesKHR";
         }
 #endif
 #ifdef VK_KHR_external_memory_fd
-        case OP_vkGetMemoryFdKHR:
-        {
+        case OP_vkGetMemoryFdKHR: {
             return "OP_vkGetMemoryFdKHR";
         }
-        case OP_vkGetMemoryFdPropertiesKHR:
-        {
+        case OP_vkGetMemoryFdPropertiesKHR: {
             return "OP_vkGetMemoryFdPropertiesKHR";
         }
 #endif
 #ifdef VK_KHR_external_semaphore_capabilities
-        case OP_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR:
-        {
+        case OP_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR: {
             return "OP_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR";
         }
 #endif
 #ifdef VK_KHR_external_semaphore_win32
-        case OP_vkImportSemaphoreWin32HandleKHR:
-        {
+        case OP_vkImportSemaphoreWin32HandleKHR: {
             return "OP_vkImportSemaphoreWin32HandleKHR";
         }
-        case OP_vkGetSemaphoreWin32HandleKHR:
-        {
+        case OP_vkGetSemaphoreWin32HandleKHR: {
             return "OP_vkGetSemaphoreWin32HandleKHR";
         }
 #endif
 #ifdef VK_KHR_external_semaphore_fd
-        case OP_vkImportSemaphoreFdKHR:
-        {
+        case OP_vkImportSemaphoreFdKHR: {
             return "OP_vkImportSemaphoreFdKHR";
         }
-        case OP_vkGetSemaphoreFdKHR:
-        {
+        case OP_vkGetSemaphoreFdKHR: {
             return "OP_vkGetSemaphoreFdKHR";
         }
 #endif
 #ifdef VK_KHR_push_descriptor
-        case OP_vkCmdPushDescriptorSetKHR:
-        {
+        case OP_vkCmdPushDescriptorSetKHR: {
             return "OP_vkCmdPushDescriptorSetKHR";
         }
-        case OP_vkCmdPushDescriptorSetWithTemplateKHR:
-        {
+        case OP_vkCmdPushDescriptorSetWithTemplateKHR: {
             return "OP_vkCmdPushDescriptorSetWithTemplateKHR";
         }
 #endif
 #ifdef VK_KHR_descriptor_update_template
-        case OP_vkCreateDescriptorUpdateTemplateKHR:
-        {
+        case OP_vkCreateDescriptorUpdateTemplateKHR: {
             return "OP_vkCreateDescriptorUpdateTemplateKHR";
         }
-        case OP_vkDestroyDescriptorUpdateTemplateKHR:
-        {
+        case OP_vkDestroyDescriptorUpdateTemplateKHR: {
             return "OP_vkDestroyDescriptorUpdateTemplateKHR";
         }
-        case OP_vkUpdateDescriptorSetWithTemplateKHR:
-        {
+        case OP_vkUpdateDescriptorSetWithTemplateKHR: {
             return "OP_vkUpdateDescriptorSetWithTemplateKHR";
         }
 #endif
 #ifdef VK_KHR_create_renderpass2
-        case OP_vkCreateRenderPass2KHR:
-        {
+        case OP_vkCreateRenderPass2KHR: {
             return "OP_vkCreateRenderPass2KHR";
         }
-        case OP_vkCmdBeginRenderPass2KHR:
-        {
+        case OP_vkCmdBeginRenderPass2KHR: {
             return "OP_vkCmdBeginRenderPass2KHR";
         }
-        case OP_vkCmdNextSubpass2KHR:
-        {
+        case OP_vkCmdNextSubpass2KHR: {
             return "OP_vkCmdNextSubpass2KHR";
         }
-        case OP_vkCmdEndRenderPass2KHR:
-        {
+        case OP_vkCmdEndRenderPass2KHR: {
             return "OP_vkCmdEndRenderPass2KHR";
         }
 #endif
 #ifdef VK_KHR_shared_presentable_image
-        case OP_vkGetSwapchainStatusKHR:
-        {
+        case OP_vkGetSwapchainStatusKHR: {
             return "OP_vkGetSwapchainStatusKHR";
         }
 #endif
 #ifdef VK_KHR_external_fence_capabilities
-        case OP_vkGetPhysicalDeviceExternalFencePropertiesKHR:
-        {
+        case OP_vkGetPhysicalDeviceExternalFencePropertiesKHR: {
             return "OP_vkGetPhysicalDeviceExternalFencePropertiesKHR";
         }
 #endif
 #ifdef VK_KHR_external_fence_win32
-        case OP_vkImportFenceWin32HandleKHR:
-        {
+        case OP_vkImportFenceWin32HandleKHR: {
             return "OP_vkImportFenceWin32HandleKHR";
         }
-        case OP_vkGetFenceWin32HandleKHR:
-        {
+        case OP_vkGetFenceWin32HandleKHR: {
             return "OP_vkGetFenceWin32HandleKHR";
         }
 #endif
 #ifdef VK_KHR_external_fence_fd
-        case OP_vkImportFenceFdKHR:
-        {
+        case OP_vkImportFenceFdKHR: {
             return "OP_vkImportFenceFdKHR";
         }
-        case OP_vkGetFenceFdKHR:
-        {
+        case OP_vkGetFenceFdKHR: {
             return "OP_vkGetFenceFdKHR";
         }
 #endif
 #ifdef VK_KHR_get_surface_capabilities2
-        case OP_vkGetPhysicalDeviceSurfaceCapabilities2KHR:
-        {
+        case OP_vkGetPhysicalDeviceSurfaceCapabilities2KHR: {
             return "OP_vkGetPhysicalDeviceSurfaceCapabilities2KHR";
         }
-        case OP_vkGetPhysicalDeviceSurfaceFormats2KHR:
-        {
+        case OP_vkGetPhysicalDeviceSurfaceFormats2KHR: {
             return "OP_vkGetPhysicalDeviceSurfaceFormats2KHR";
         }
 #endif
 #ifdef VK_KHR_get_display_properties2
-        case OP_vkGetPhysicalDeviceDisplayProperties2KHR:
-        {
+        case OP_vkGetPhysicalDeviceDisplayProperties2KHR: {
             return "OP_vkGetPhysicalDeviceDisplayProperties2KHR";
         }
-        case OP_vkGetPhysicalDeviceDisplayPlaneProperties2KHR:
-        {
+        case OP_vkGetPhysicalDeviceDisplayPlaneProperties2KHR: {
             return "OP_vkGetPhysicalDeviceDisplayPlaneProperties2KHR";
         }
-        case OP_vkGetDisplayModeProperties2KHR:
-        {
+        case OP_vkGetDisplayModeProperties2KHR: {
             return "OP_vkGetDisplayModeProperties2KHR";
         }
-        case OP_vkGetDisplayPlaneCapabilities2KHR:
-        {
+        case OP_vkGetDisplayPlaneCapabilities2KHR: {
             return "OP_vkGetDisplayPlaneCapabilities2KHR";
         }
 #endif
 #ifdef VK_KHR_get_memory_requirements2
-        case OP_vkGetImageMemoryRequirements2KHR:
-        {
+        case OP_vkGetImageMemoryRequirements2KHR: {
             return "OP_vkGetImageMemoryRequirements2KHR";
         }
-        case OP_vkGetBufferMemoryRequirements2KHR:
-        {
+        case OP_vkGetBufferMemoryRequirements2KHR: {
             return "OP_vkGetBufferMemoryRequirements2KHR";
         }
-        case OP_vkGetImageSparseMemoryRequirements2KHR:
-        {
+        case OP_vkGetImageSparseMemoryRequirements2KHR: {
             return "OP_vkGetImageSparseMemoryRequirements2KHR";
         }
 #endif
 #ifdef VK_KHR_sampler_ycbcr_conversion
-        case OP_vkCreateSamplerYcbcrConversionKHR:
-        {
+        case OP_vkCreateSamplerYcbcrConversionKHR: {
             return "OP_vkCreateSamplerYcbcrConversionKHR";
         }
-        case OP_vkDestroySamplerYcbcrConversionKHR:
-        {
+        case OP_vkDestroySamplerYcbcrConversionKHR: {
             return "OP_vkDestroySamplerYcbcrConversionKHR";
         }
 #endif
 #ifdef VK_KHR_bind_memory2
-        case OP_vkBindBufferMemory2KHR:
-        {
+        case OP_vkBindBufferMemory2KHR: {
             return "OP_vkBindBufferMemory2KHR";
         }
-        case OP_vkBindImageMemory2KHR:
-        {
+        case OP_vkBindImageMemory2KHR: {
             return "OP_vkBindImageMemory2KHR";
         }
 #endif
 #ifdef VK_KHR_maintenance3
-        case OP_vkGetDescriptorSetLayoutSupportKHR:
-        {
+        case OP_vkGetDescriptorSetLayoutSupportKHR: {
             return "OP_vkGetDescriptorSetLayoutSupportKHR";
         }
 #endif
 #ifdef VK_KHR_draw_indirect_count
-        case OP_vkCmdDrawIndirectCountKHR:
-        {
+        case OP_vkCmdDrawIndirectCountKHR: {
             return "OP_vkCmdDrawIndirectCountKHR";
         }
-        case OP_vkCmdDrawIndexedIndirectCountKHR:
-        {
+        case OP_vkCmdDrawIndexedIndirectCountKHR: {
             return "OP_vkCmdDrawIndexedIndirectCountKHR";
         }
 #endif
 #ifdef VK_ANDROID_native_buffer
-        case OP_vkGetSwapchainGrallocUsageANDROID:
-        {
+        case OP_vkGetSwapchainGrallocUsageANDROID: {
             return "OP_vkGetSwapchainGrallocUsageANDROID";
         }
-        case OP_vkAcquireImageANDROID:
-        {
+        case OP_vkAcquireImageANDROID: {
             return "OP_vkAcquireImageANDROID";
         }
-        case OP_vkQueueSignalReleaseImageANDROID:
-        {
+        case OP_vkQueueSignalReleaseImageANDROID: {
             return "OP_vkQueueSignalReleaseImageANDROID";
         }
 #endif
 #ifdef VK_EXT_debug_report
-        case OP_vkCreateDebugReportCallbackEXT:
-        {
+        case OP_vkCreateDebugReportCallbackEXT: {
             return "OP_vkCreateDebugReportCallbackEXT";
         }
-        case OP_vkDestroyDebugReportCallbackEXT:
-        {
+        case OP_vkDestroyDebugReportCallbackEXT: {
             return "OP_vkDestroyDebugReportCallbackEXT";
         }
-        case OP_vkDebugReportMessageEXT:
-        {
+        case OP_vkDebugReportMessageEXT: {
             return "OP_vkDebugReportMessageEXT";
         }
 #endif
 #ifdef VK_EXT_debug_marker
-        case OP_vkDebugMarkerSetObjectTagEXT:
-        {
+        case OP_vkDebugMarkerSetObjectTagEXT: {
             return "OP_vkDebugMarkerSetObjectTagEXT";
         }
-        case OP_vkDebugMarkerSetObjectNameEXT:
-        {
+        case OP_vkDebugMarkerSetObjectNameEXT: {
             return "OP_vkDebugMarkerSetObjectNameEXT";
         }
-        case OP_vkCmdDebugMarkerBeginEXT:
-        {
+        case OP_vkCmdDebugMarkerBeginEXT: {
             return "OP_vkCmdDebugMarkerBeginEXT";
         }
-        case OP_vkCmdDebugMarkerEndEXT:
-        {
+        case OP_vkCmdDebugMarkerEndEXT: {
             return "OP_vkCmdDebugMarkerEndEXT";
         }
-        case OP_vkCmdDebugMarkerInsertEXT:
-        {
+        case OP_vkCmdDebugMarkerInsertEXT: {
             return "OP_vkCmdDebugMarkerInsertEXT";
         }
 #endif
 #ifdef VK_AMD_draw_indirect_count
-        case OP_vkCmdDrawIndirectCountAMD:
-        {
+        case OP_vkCmdDrawIndirectCountAMD: {
             return "OP_vkCmdDrawIndirectCountAMD";
         }
-        case OP_vkCmdDrawIndexedIndirectCountAMD:
-        {
+        case OP_vkCmdDrawIndexedIndirectCountAMD: {
             return "OP_vkCmdDrawIndexedIndirectCountAMD";
         }
 #endif
 #ifdef VK_AMD_shader_info
-        case OP_vkGetShaderInfoAMD:
-        {
+        case OP_vkGetShaderInfoAMD: {
             return "OP_vkGetShaderInfoAMD";
         }
 #endif
 #ifdef VK_NV_external_memory_capabilities
-        case OP_vkGetPhysicalDeviceExternalImageFormatPropertiesNV:
-        {
+        case OP_vkGetPhysicalDeviceExternalImageFormatPropertiesNV: {
             return "OP_vkGetPhysicalDeviceExternalImageFormatPropertiesNV";
         }
 #endif
 #ifdef VK_NV_external_memory_win32
-        case OP_vkGetMemoryWin32HandleNV:
-        {
+        case OP_vkGetMemoryWin32HandleNV: {
             return "OP_vkGetMemoryWin32HandleNV";
         }
 #endif
 #ifdef VK_NN_vi_surface
-        case OP_vkCreateViSurfaceNN:
-        {
+        case OP_vkCreateViSurfaceNN: {
             return "OP_vkCreateViSurfaceNN";
         }
 #endif
 #ifdef VK_EXT_conditional_rendering
-        case OP_vkCmdBeginConditionalRenderingEXT:
-        {
+        case OP_vkCmdBeginConditionalRenderingEXT: {
             return "OP_vkCmdBeginConditionalRenderingEXT";
         }
-        case OP_vkCmdEndConditionalRenderingEXT:
-        {
+        case OP_vkCmdEndConditionalRenderingEXT: {
             return "OP_vkCmdEndConditionalRenderingEXT";
         }
 #endif
 #ifdef VK_NV_clip_space_w_scaling
-        case OP_vkCmdSetViewportWScalingNV:
-        {
+        case OP_vkCmdSetViewportWScalingNV: {
             return "OP_vkCmdSetViewportWScalingNV";
         }
 #endif
 #ifdef VK_EXT_direct_mode_display
-        case OP_vkReleaseDisplayEXT:
-        {
+        case OP_vkReleaseDisplayEXT: {
             return "OP_vkReleaseDisplayEXT";
         }
 #endif
 #ifdef VK_EXT_acquire_xlib_display
-        case OP_vkAcquireXlibDisplayEXT:
-        {
+        case OP_vkAcquireXlibDisplayEXT: {
             return "OP_vkAcquireXlibDisplayEXT";
         }
-        case OP_vkGetRandROutputDisplayEXT:
-        {
+        case OP_vkGetRandROutputDisplayEXT: {
             return "OP_vkGetRandROutputDisplayEXT";
         }
 #endif
 #ifdef VK_EXT_display_surface_counter
-        case OP_vkGetPhysicalDeviceSurfaceCapabilities2EXT:
-        {
+        case OP_vkGetPhysicalDeviceSurfaceCapabilities2EXT: {
             return "OP_vkGetPhysicalDeviceSurfaceCapabilities2EXT";
         }
 #endif
 #ifdef VK_EXT_display_control
-        case OP_vkDisplayPowerControlEXT:
-        {
+        case OP_vkDisplayPowerControlEXT: {
             return "OP_vkDisplayPowerControlEXT";
         }
-        case OP_vkRegisterDeviceEventEXT:
-        {
+        case OP_vkRegisterDeviceEventEXT: {
             return "OP_vkRegisterDeviceEventEXT";
         }
-        case OP_vkRegisterDisplayEventEXT:
-        {
+        case OP_vkRegisterDisplayEventEXT: {
             return "OP_vkRegisterDisplayEventEXT";
         }
-        case OP_vkGetSwapchainCounterEXT:
-        {
+        case OP_vkGetSwapchainCounterEXT: {
             return "OP_vkGetSwapchainCounterEXT";
         }
 #endif
 #ifdef VK_GOOGLE_display_timing
-        case OP_vkGetRefreshCycleDurationGOOGLE:
-        {
+        case OP_vkGetRefreshCycleDurationGOOGLE: {
             return "OP_vkGetRefreshCycleDurationGOOGLE";
         }
-        case OP_vkGetPastPresentationTimingGOOGLE:
-        {
+        case OP_vkGetPastPresentationTimingGOOGLE: {
             return "OP_vkGetPastPresentationTimingGOOGLE";
         }
 #endif
 #ifdef VK_EXT_discard_rectangles
-        case OP_vkCmdSetDiscardRectangleEXT:
-        {
+        case OP_vkCmdSetDiscardRectangleEXT: {
             return "OP_vkCmdSetDiscardRectangleEXT";
         }
 #endif
 #ifdef VK_EXT_hdr_metadata
-        case OP_vkSetHdrMetadataEXT:
-        {
+        case OP_vkSetHdrMetadataEXT: {
             return "OP_vkSetHdrMetadataEXT";
         }
 #endif
 #ifdef VK_MVK_ios_surface
-        case OP_vkCreateIOSSurfaceMVK:
-        {
+        case OP_vkCreateIOSSurfaceMVK: {
             return "OP_vkCreateIOSSurfaceMVK";
         }
 #endif
 #ifdef VK_MVK_macos_surface
-        case OP_vkCreateMacOSSurfaceMVK:
-        {
+        case OP_vkCreateMacOSSurfaceMVK: {
             return "OP_vkCreateMacOSSurfaceMVK";
         }
 #endif
 #ifdef VK_EXT_debug_utils
-        case OP_vkSetDebugUtilsObjectNameEXT:
-        {
+        case OP_vkSetDebugUtilsObjectNameEXT: {
             return "OP_vkSetDebugUtilsObjectNameEXT";
         }
-        case OP_vkSetDebugUtilsObjectTagEXT:
-        {
+        case OP_vkSetDebugUtilsObjectTagEXT: {
             return "OP_vkSetDebugUtilsObjectTagEXT";
         }
-        case OP_vkQueueBeginDebugUtilsLabelEXT:
-        {
+        case OP_vkQueueBeginDebugUtilsLabelEXT: {
             return "OP_vkQueueBeginDebugUtilsLabelEXT";
         }
-        case OP_vkQueueEndDebugUtilsLabelEXT:
-        {
+        case OP_vkQueueEndDebugUtilsLabelEXT: {
             return "OP_vkQueueEndDebugUtilsLabelEXT";
         }
-        case OP_vkQueueInsertDebugUtilsLabelEXT:
-        {
+        case OP_vkQueueInsertDebugUtilsLabelEXT: {
             return "OP_vkQueueInsertDebugUtilsLabelEXT";
         }
-        case OP_vkCmdBeginDebugUtilsLabelEXT:
-        {
+        case OP_vkCmdBeginDebugUtilsLabelEXT: {
             return "OP_vkCmdBeginDebugUtilsLabelEXT";
         }
-        case OP_vkCmdEndDebugUtilsLabelEXT:
-        {
+        case OP_vkCmdEndDebugUtilsLabelEXT: {
             return "OP_vkCmdEndDebugUtilsLabelEXT";
         }
-        case OP_vkCmdInsertDebugUtilsLabelEXT:
-        {
+        case OP_vkCmdInsertDebugUtilsLabelEXT: {
             return "OP_vkCmdInsertDebugUtilsLabelEXT";
         }
-        case OP_vkCreateDebugUtilsMessengerEXT:
-        {
+        case OP_vkCreateDebugUtilsMessengerEXT: {
             return "OP_vkCreateDebugUtilsMessengerEXT";
         }
-        case OP_vkDestroyDebugUtilsMessengerEXT:
-        {
+        case OP_vkDestroyDebugUtilsMessengerEXT: {
             return "OP_vkDestroyDebugUtilsMessengerEXT";
         }
-        case OP_vkSubmitDebugUtilsMessageEXT:
-        {
+        case OP_vkSubmitDebugUtilsMessageEXT: {
             return "OP_vkSubmitDebugUtilsMessageEXT";
         }
 #endif
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
-        case OP_vkGetAndroidHardwareBufferPropertiesANDROID:
-        {
+        case OP_vkGetAndroidHardwareBufferPropertiesANDROID: {
             return "OP_vkGetAndroidHardwareBufferPropertiesANDROID";
         }
-        case OP_vkGetMemoryAndroidHardwareBufferANDROID:
-        {
+        case OP_vkGetMemoryAndroidHardwareBufferANDROID: {
             return "OP_vkGetMemoryAndroidHardwareBufferANDROID";
         }
 #endif
 #ifdef VK_EXT_sample_locations
-        case OP_vkCmdSetSampleLocationsEXT:
-        {
+        case OP_vkCmdSetSampleLocationsEXT: {
             return "OP_vkCmdSetSampleLocationsEXT";
         }
-        case OP_vkGetPhysicalDeviceMultisamplePropertiesEXT:
-        {
+        case OP_vkGetPhysicalDeviceMultisamplePropertiesEXT: {
             return "OP_vkGetPhysicalDeviceMultisamplePropertiesEXT";
         }
 #endif
 #ifdef VK_EXT_validation_cache
-        case OP_vkCreateValidationCacheEXT:
-        {
+        case OP_vkCreateValidationCacheEXT: {
             return "OP_vkCreateValidationCacheEXT";
         }
-        case OP_vkDestroyValidationCacheEXT:
-        {
+        case OP_vkDestroyValidationCacheEXT: {
             return "OP_vkDestroyValidationCacheEXT";
         }
-        case OP_vkMergeValidationCachesEXT:
-        {
+        case OP_vkMergeValidationCachesEXT: {
             return "OP_vkMergeValidationCachesEXT";
         }
-        case OP_vkGetValidationCacheDataEXT:
-        {
+        case OP_vkGetValidationCacheDataEXT: {
             return "OP_vkGetValidationCacheDataEXT";
         }
 #endif
 #ifdef VK_EXT_external_memory_host
-        case OP_vkGetMemoryHostPointerPropertiesEXT:
-        {
+        case OP_vkGetMemoryHostPointerPropertiesEXT: {
             return "OP_vkGetMemoryHostPointerPropertiesEXT";
         }
 #endif
 #ifdef VK_AMD_buffer_marker
-        case OP_vkCmdWriteBufferMarkerAMD:
-        {
+        case OP_vkCmdWriteBufferMarkerAMD: {
             return "OP_vkCmdWriteBufferMarkerAMD";
         }
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
-        case OP_vkCmdSetCheckpointNV:
-        {
+        case OP_vkCmdSetCheckpointNV: {
             return "OP_vkCmdSetCheckpointNV";
         }
-        case OP_vkGetQueueCheckpointDataNV:
-        {
+        case OP_vkGetQueueCheckpointDataNV: {
             return "OP_vkGetQueueCheckpointDataNV";
         }
 #endif
 #ifdef VK_GOOGLE_gfxstream
-        case OP_vkMapMemoryIntoAddressSpaceGOOGLE:
-        {
+        case OP_vkMapMemoryIntoAddressSpaceGOOGLE: {
             return "OP_vkMapMemoryIntoAddressSpaceGOOGLE";
         }
-        case OP_vkRegisterImageColorBufferGOOGLE:
-        {
+        case OP_vkRegisterImageColorBufferGOOGLE: {
             return "OP_vkRegisterImageColorBufferGOOGLE";
         }
-        case OP_vkRegisterBufferColorBufferGOOGLE:
-        {
+        case OP_vkRegisterBufferColorBufferGOOGLE: {
             return "OP_vkRegisterBufferColorBufferGOOGLE";
         }
-        case OP_vkUpdateDescriptorSetWithTemplateSizedGOOGLE:
-        {
+        case OP_vkUpdateDescriptorSetWithTemplateSizedGOOGLE: {
             return "OP_vkUpdateDescriptorSetWithTemplateSizedGOOGLE";
         }
-        case OP_vkBeginCommandBufferAsyncGOOGLE:
-        {
+        case OP_vkBeginCommandBufferAsyncGOOGLE: {
             return "OP_vkBeginCommandBufferAsyncGOOGLE";
         }
-        case OP_vkEndCommandBufferAsyncGOOGLE:
-        {
+        case OP_vkEndCommandBufferAsyncGOOGLE: {
             return "OP_vkEndCommandBufferAsyncGOOGLE";
         }
-        case OP_vkResetCommandBufferAsyncGOOGLE:
-        {
+        case OP_vkResetCommandBufferAsyncGOOGLE: {
             return "OP_vkResetCommandBufferAsyncGOOGLE";
         }
-        case OP_vkCommandBufferHostSyncGOOGLE:
-        {
+        case OP_vkCommandBufferHostSyncGOOGLE: {
             return "OP_vkCommandBufferHostSyncGOOGLE";
         }
-        case OP_vkCreateImageWithRequirementsGOOGLE:
-        {
+        case OP_vkCreateImageWithRequirementsGOOGLE: {
             return "OP_vkCreateImageWithRequirementsGOOGLE";
         }
-        case OP_vkCreateBufferWithRequirementsGOOGLE:
-        {
+        case OP_vkCreateBufferWithRequirementsGOOGLE: {
             return "OP_vkCreateBufferWithRequirementsGOOGLE";
         }
-        case OP_vkGetMemoryHostAddressInfoGOOGLE:
-        {
+        case OP_vkGetMemoryHostAddressInfoGOOGLE: {
             return "OP_vkGetMemoryHostAddressInfoGOOGLE";
         }
-        case OP_vkFreeMemorySyncGOOGLE:
-        {
+        case OP_vkFreeMemorySyncGOOGLE: {
             return "OP_vkFreeMemorySyncGOOGLE";
         }
-        case OP_vkQueueHostSyncGOOGLE:
-        {
+        case OP_vkQueueHostSyncGOOGLE: {
             return "OP_vkQueueHostSyncGOOGLE";
         }
-        case OP_vkQueueSubmitAsyncGOOGLE:
-        {
+        case OP_vkQueueSubmitAsyncGOOGLE: {
             return "OP_vkQueueSubmitAsyncGOOGLE";
         }
-        case OP_vkQueueWaitIdleAsyncGOOGLE:
-        {
+        case OP_vkQueueWaitIdleAsyncGOOGLE: {
             return "OP_vkQueueWaitIdleAsyncGOOGLE";
         }
-        case OP_vkQueueBindSparseAsyncGOOGLE:
-        {
+        case OP_vkQueueBindSparseAsyncGOOGLE: {
             return "OP_vkQueueBindSparseAsyncGOOGLE";
         }
-        case OP_vkGetLinearImageLayoutGOOGLE:
-        {
+        case OP_vkGetLinearImageLayoutGOOGLE: {
             return "OP_vkGetLinearImageLayoutGOOGLE";
         }
 #endif
 #ifdef VK_MVK_moltenvk
-        case OP_vkGetMTLDeviceMVK:
-        {
+        case OP_vkGetMTLDeviceMVK: {
             return "OP_vkGetMTLDeviceMVK";
         }
-        case OP_vkSetMTLTextureMVK:
-        {
+        case OP_vkSetMTLTextureMVK: {
             return "OP_vkSetMTLTextureMVK";
         }
-        case OP_vkGetMTLTextureMVK:
-        {
+        case OP_vkGetMTLTextureMVK: {
             return "OP_vkGetMTLTextureMVK";
         }
-        case OP_vkGetMTLBufferMVK:
-        {
+        case OP_vkGetMTLBufferMVK: {
             return "OP_vkGetMTLBufferMVK";
         }
-        case OP_vkUseIOSurfaceMVK:
-        {
+        case OP_vkUseIOSurfaceMVK: {
             return "OP_vkUseIOSurfaceMVK";
         }
-        case OP_vkGetIOSurfaceMVK:
-        {
+        case OP_vkGetIOSurfaceMVK: {
             return "OP_vkGetIOSurfaceMVK";
         }
 #endif
 #ifdef VK_GOOGLE_gfxstream
-        case OP_vkQueueFlushCommandsGOOGLE:
-        {
+        case OP_vkQueueFlushCommandsGOOGLE: {
             return "OP_vkQueueFlushCommandsGOOGLE";
         }
 #endif
 #ifdef VK_KHR_dynamic_rendering
-        case OP_vkCmdEndRenderingKHR:
-        {
+        case OP_vkCmdEndRenderingKHR: {
             return "OP_vkCmdEndRenderingKHR";
         }
 #endif
 #ifdef VK_EXT_full_screen_exclusive
-        case OP_vkAcquireFullScreenExclusiveModeEXT:
-        {
+        case OP_vkAcquireFullScreenExclusiveModeEXT: {
             return "OP_vkAcquireFullScreenExclusiveModeEXT";
         }
 #endif
 #ifdef VK_KHR_synchronization2
-        case OP_vkCmdPipelineBarrier2KHR:
-        {
+        case OP_vkCmdPipelineBarrier2KHR: {
             return "OP_vkCmdPipelineBarrier2KHR";
         }
 #endif
 #ifdef VK_KHR_maintenance4
-        case OP_vkGetDeviceBufferMemoryRequirementsKHR:
-        {
+        case OP_vkGetDeviceBufferMemoryRequirementsKHR: {
             return "OP_vkGetDeviceBufferMemoryRequirementsKHR";
         }
 #endif
 #ifdef VK_EXT_color_write_enable
-        case OP_vkCmdSetColorWriteEnableEXT:
-        {
+        case OP_vkCmdSetColorWriteEnableEXT: {
             return "OP_vkCmdSetColorWriteEnableEXT";
         }
 #endif
 #ifdef VK_NV_ray_tracing
-        case OP_vkBindAccelerationStructureMemoryNV:
-        {
+        case OP_vkBindAccelerationStructureMemoryNV: {
             return "OP_vkBindAccelerationStructureMemoryNV";
         }
 #endif
 #ifdef VK_INTEL_performance_query
-        case OP_vkInitializePerformanceApiINTEL:
-        {
+        case OP_vkInitializePerformanceApiINTEL: {
             return "OP_vkInitializePerformanceApiINTEL";
         }
 #endif
 #ifdef VK_KHR_deferred_host_operations
-        case OP_vkGetDeferredOperationMaxConcurrencyKHR:
-        {
+        case OP_vkGetDeferredOperationMaxConcurrencyKHR: {
             return "OP_vkGetDeferredOperationMaxConcurrencyKHR";
         }
 #endif
 #ifdef VK_EXT_calibrated_timestamps
-        case OP_vkGetCalibratedTimestampsEXT:
-        {
+        case OP_vkGetCalibratedTimestampsEXT: {
             return "OP_vkGetCalibratedTimestampsEXT";
         }
 #endif
 #ifdef VK_NV_ray_tracing
-        case OP_vkCreateRayTracingPipelinesNV:
-        {
+        case OP_vkCreateRayTracingPipelinesNV: {
             return "OP_vkCreateRayTracingPipelinesNV";
         }
 #endif
 #ifdef VK_KHR_acceleration_structure
-        case OP_vkCmdCopyMemoryToAccelerationStructureKHR:
-        {
+        case OP_vkCmdCopyMemoryToAccelerationStructureKHR: {
             return "OP_vkCmdCopyMemoryToAccelerationStructureKHR";
         }
 #endif
 #ifdef VK_KHR_fragment_shading_rate
-        case OP_vkCmdSetFragmentShadingRateKHR:
-        {
+        case OP_vkCmdSetFragmentShadingRateKHR: {
             return "OP_vkCmdSetFragmentShadingRateKHR";
         }
 #endif
 #ifdef VK_NVX_image_view_handle
-        case OP_vkGetImageViewHandleNVX:
-        {
+        case OP_vkGetImageViewHandleNVX: {
             return "OP_vkGetImageViewHandleNVX";
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state
-        case OP_vkCmdSetScissorWithCountEXT:
-        {
+        case OP_vkCmdSetScissorWithCountEXT: {
             return "OP_vkCmdSetScissorWithCountEXT";
         }
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
-        case OP_vkGetRayTracingShaderGroupStackSizeKHR:
-        {
+        case OP_vkGetRayTracingShaderGroupStackSizeKHR: {
             return "OP_vkGetRayTracingShaderGroupStackSizeKHR";
         }
 #endif
 #ifdef VK_EXT_full_screen_exclusive
-        case OP_vkGetDeviceGroupSurfacePresentModes2EXT:
-        {
+        case OP_vkGetDeviceGroupSurfacePresentModes2EXT: {
             return "OP_vkGetDeviceGroupSurfacePresentModes2EXT";
         }
 #endif
 #ifdef VK_NV_mesh_shader
-        case OP_vkCmdDrawMeshTasksNV:
-        {
+        case OP_vkCmdDrawMeshTasksNV: {
             return "OP_vkCmdDrawMeshTasksNV";
         }
 #endif
 #ifdef VK_NVX_binary_import
-        case OP_vkCreateCuFunctionNVX:
-        {
+        case OP_vkCreateCuFunctionNVX: {
             return "OP_vkCreateCuFunctionNVX";
         }
 #endif
 #ifdef VK_NV_ray_tracing
-        case OP_vkCmdWriteAccelerationStructuresPropertiesNV:
-        {
+        case OP_vkCmdWriteAccelerationStructuresPropertiesNV: {
             return "OP_vkCmdWriteAccelerationStructuresPropertiesNV";
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
-        case OP_vkCmdSetPatchControlPointsEXT:
-        {
+        case OP_vkCmdSetPatchControlPointsEXT: {
             return "OP_vkCmdSetPatchControlPointsEXT";
         }
 #endif
 #ifdef VK_EXT_private_data
-        case OP_vkDestroyPrivateDataSlotEXT:
-        {
+        case OP_vkDestroyPrivateDataSlotEXT: {
             return "OP_vkDestroyPrivateDataSlotEXT";
         }
 #endif
 #ifdef VK_NV_ray_tracing
-        case OP_vkCmdTraceRaysNV:
-        {
+        case OP_vkCmdTraceRaysNV: {
             return "OP_vkCmdTraceRaysNV";
         }
 #endif
 #ifdef VK_NVX_image_view_handle
-        case OP_vkGetImageViewAddressNVX:
-        {
+        case OP_vkGetImageViewAddressNVX: {
             return "OP_vkGetImageViewAddressNVX";
         }
 #endif
 #ifdef VK_NV_ray_tracing
-        case OP_vkCmdCopyAccelerationStructureNV:
-        {
+        case OP_vkCmdCopyAccelerationStructureNV: {
             return "OP_vkCmdCopyAccelerationStructureNV";
         }
 #endif
 #ifdef VK_EXT_vertex_input_dynamic_state
-        case OP_vkCmdSetVertexInputEXT:
-        {
+        case OP_vkCmdSetVertexInputEXT: {
             return "OP_vkCmdSetVertexInputEXT";
         }
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
-        case OP_vkCmdTraceRaysIndirectKHR:
-        {
+        case OP_vkCmdTraceRaysIndirectKHR: {
             return "OP_vkCmdTraceRaysIndirectKHR";
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state
-        case OP_vkCmdSetFrontFaceEXT:
-        {
+        case OP_vkCmdSetFrontFaceEXT: {
             return "OP_vkCmdSetFrontFaceEXT";
         }
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
-        case OP_vkSetBufferCollectionBufferConstraintsFUCHSIA:
-        {
+        case OP_vkSetBufferCollectionBufferConstraintsFUCHSIA: {
             return "OP_vkSetBufferCollectionBufferConstraintsFUCHSIA";
         }
 #endif
 #ifdef VK_FUCHSIA_external_memory
-        case OP_vkGetMemoryZirconHandlePropertiesFUCHSIA:
-        {
+        case OP_vkGetMemoryZirconHandlePropertiesFUCHSIA: {
             return "OP_vkGetMemoryZirconHandlePropertiesFUCHSIA";
         }
 #endif
 #ifdef VK_INTEL_performance_query
-        case OP_vkGetPerformanceParameterINTEL:
-        {
+        case OP_vkGetPerformanceParameterINTEL: {
             return "OP_vkGetPerformanceParameterINTEL";
         }
 #endif
 #ifdef VK_GOOGLE_gfxstream
-        case OP_vkCollectDescriptorPoolIdsGOOGLE:
-        {
+        case OP_vkCollectDescriptorPoolIdsGOOGLE: {
             return "OP_vkCollectDescriptorPoolIdsGOOGLE";
         }
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
-        case OP_vkCmdTraceRaysKHR:
-        {
+        case OP_vkCmdTraceRaysKHR: {
             return "OP_vkCmdTraceRaysKHR";
         }
 #endif
 #ifdef VK_FUCHSIA_external_memory
-        case OP_vkGetMemoryZirconHandleFUCHSIA:
-        {
+        case OP_vkGetMemoryZirconHandleFUCHSIA: {
             return "OP_vkGetMemoryZirconHandleFUCHSIA";
         }
 #endif
 #ifdef VK_NV_shading_rate_image
-        case OP_vkCmdSetViewportShadingRatePaletteNV:
-        {
+        case OP_vkCmdSetViewportShadingRatePaletteNV: {
             return "OP_vkCmdSetViewportShadingRatePaletteNV";
         }
 #endif
 #ifdef VK_KHR_deferred_host_operations
-        case OP_vkDestroyDeferredOperationKHR:
-        {
+        case OP_vkDestroyDeferredOperationKHR: {
             return "OP_vkDestroyDeferredOperationKHR";
         }
 #endif
 #ifdef VK_KHR_video_queue
-        case OP_vkBindVideoSessionMemoryKHR:
-        {
+        case OP_vkBindVideoSessionMemoryKHR: {
             return "OP_vkBindVideoSessionMemoryKHR";
         }
 #endif
 #ifdef VK_KHR_deferred_host_operations
-        case OP_vkDeferredOperationJoinKHR:
-        {
+        case OP_vkDeferredOperationJoinKHR: {
             return "OP_vkDeferredOperationJoinKHR";
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state
-        case OP_vkCmdSetDepthWriteEnableEXT:
-        {
+        case OP_vkCmdSetDepthWriteEnableEXT: {
             return "OP_vkCmdSetDepthWriteEnableEXT";
         }
 #endif
 #ifdef VK_KHR_buffer_device_address
-        case OP_vkGetBufferDeviceAddressKHR:
-        {
+        case OP_vkGetBufferDeviceAddressKHR: {
             return "OP_vkGetBufferDeviceAddressKHR";
         }
 #endif
 #ifdef VK_KHR_acceleration_structure
-        case OP_vkGetAccelerationStructureBuildSizesKHR:
-        {
+        case OP_vkGetAccelerationStructureBuildSizesKHR: {
             return "OP_vkGetAccelerationStructureBuildSizesKHR";
         }
 #endif
 #ifdef VK_NVX_binary_import
-        case OP_vkCmdCuLaunchKernelNVX:
-        {
+        case OP_vkCmdCuLaunchKernelNVX: {
             return "OP_vkCmdCuLaunchKernelNVX";
         }
 #endif
 #ifdef VK_NV_ray_tracing
-        case OP_vkGetAccelerationStructureMemoryRequirementsNV:
-        {
+        case OP_vkGetAccelerationStructureMemoryRequirementsNV: {
             return "OP_vkGetAccelerationStructureMemoryRequirementsNV";
         }
 #endif
 #ifdef VK_HUAWEI_subpass_shading
-        case OP_vkCmdSubpassShadingHUAWEI:
-        {
+        case OP_vkCmdSubpassShadingHUAWEI: {
             return "OP_vkCmdSubpassShadingHUAWEI";
         }
 #endif
 #ifdef VK_EXT_directfb_surface
-        case OP_vkCreateDirectFBSurfaceEXT:
-        {
+        case OP_vkCreateDirectFBSurfaceEXT: {
             return "OP_vkCreateDirectFBSurfaceEXT";
         }
 #endif
 #ifdef VK_VERSION_1_2
-        case OP_vkCmdEndRenderPass2:
-        {
+        case OP_vkCmdEndRenderPass2: {
             return "OP_vkCmdEndRenderPass2";
         }
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
-        case OP_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR:
-        {
+        case OP_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR: {
             return "OP_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR";
         }
 #endif
 #ifdef VK_VERSION_1_2
-        case OP_vkGetBufferDeviceAddress:
-        {
+        case OP_vkGetBufferDeviceAddress: {
             return "OP_vkGetBufferDeviceAddress";
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state
-        case OP_vkCmdSetDepthBoundsTestEnableEXT:
-        {
+        case OP_vkCmdSetDepthBoundsTestEnableEXT: {
             return "OP_vkCmdSetDepthBoundsTestEnableEXT";
         }
 #endif
 #ifdef VK_KHR_acceleration_structure
-        case OP_vkGetAccelerationStructureDeviceAddressKHR:
-        {
+        case OP_vkGetAccelerationStructureDeviceAddressKHR: {
             return "OP_vkGetAccelerationStructureDeviceAddressKHR";
         }
-        case OP_vkCmdCopyAccelerationStructureToMemoryKHR:
-        {
+        case OP_vkCmdCopyAccelerationStructureToMemoryKHR: {
             return "OP_vkCmdCopyAccelerationStructureToMemoryKHR";
         }
 #endif
 #ifdef VK_NV_mesh_shader
-        case OP_vkCmdDrawMeshTasksIndirectCountNV:
-        {
+        case OP_vkCmdDrawMeshTasksIndirectCountNV: {
             return "OP_vkCmdDrawMeshTasksIndirectCountNV";
         }
 #endif
 #ifdef VK_KHR_performance_query
-        case OP_vkReleaseProfilingLockKHR:
-        {
+        case OP_vkReleaseProfilingLockKHR: {
             return "OP_vkReleaseProfilingLockKHR";
         }
 #endif
 #ifdef VK_KHR_acceleration_structure
-        case OP_vkDestroyAccelerationStructureKHR:
-        {
+        case OP_vkDestroyAccelerationStructureKHR: {
             return "OP_vkDestroyAccelerationStructureKHR";
         }
 #endif
 #ifdef VK_EXT_pageable_device_local_memory
-        case OP_vkSetDeviceMemoryPriorityEXT:
-        {
+        case OP_vkSetDeviceMemoryPriorityEXT: {
             return "OP_vkSetDeviceMemoryPriorityEXT";
         }
 #endif
 #ifdef VK_EXT_buffer_device_address
-        case OP_vkGetBufferDeviceAddressEXT:
-        {
+        case OP_vkGetBufferDeviceAddressEXT: {
             return "OP_vkGetBufferDeviceAddressEXT";
         }
 #endif
 #ifdef VK_QNX_screen_surface
-        case OP_vkCreateScreenSurfaceQNX:
-        {
+        case OP_vkCreateScreenSurfaceQNX: {
             return "OP_vkCreateScreenSurfaceQNX";
         }
 #endif
 #ifdef VK_KHR_synchronization2
-        case OP_vkCmdWriteBufferMarker2AMD:
-        {
+        case OP_vkCmdWriteBufferMarker2AMD: {
             return "OP_vkCmdWriteBufferMarker2AMD";
         }
 #endif
 #ifdef VK_VERSION_1_2
-        case OP_vkWaitSemaphores:
-        {
+        case OP_vkWaitSemaphores: {
             return "OP_vkWaitSemaphores";
         }
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
-        case OP_vkDestroyBufferCollectionFUCHSIA:
-        {
+        case OP_vkDestroyBufferCollectionFUCHSIA: {
             return "OP_vkDestroyBufferCollectionFUCHSIA";
         }
 #endif
 #ifdef VK_EXT_private_data
-        case OP_vkSetPrivateDataEXT:
-        {
+        case OP_vkSetPrivateDataEXT: {
             return "OP_vkSetPrivateDataEXT";
         }
 #endif
 #ifdef VK_HUAWEI_subpass_shading
-        case OP_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI:
-        {
+        case OP_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI: {
             return "OP_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI";
         }
 #endif
 #ifdef VK_NV_scissor_exclusive
-        case OP_vkCmdSetExclusiveScissorNV:
-        {
+        case OP_vkCmdSetExclusiveScissorNV: {
             return "OP_vkCmdSetExclusiveScissorNV";
         }
 #endif
 #ifdef VK_KHR_copy_commands2
-        case OP_vkCmdCopyImage2KHR:
-        {
+        case OP_vkCmdCopyImage2KHR: {
             return "OP_vkCmdCopyImage2KHR";
         }
 #endif
 #ifdef VK_NVX_binary_import
-        case OP_vkCreateCuModuleNVX:
-        {
+        case OP_vkCreateCuModuleNVX: {
             return "OP_vkCreateCuModuleNVX";
         }
 #endif
 #ifdef VK_KHR_video_queue
-        case OP_vkCreateVideoSessionKHR:
-        {
+        case OP_vkCreateVideoSessionKHR: {
             return "OP_vkCreateVideoSessionKHR";
         }
 #endif
 #ifdef VK_KHR_timeline_semaphore
-        case OP_vkGetSemaphoreCounterValueKHR:
-        {
+        case OP_vkGetSemaphoreCounterValueKHR: {
             return "OP_vkGetSemaphoreCounterValueKHR";
         }
 #endif
 #ifdef VK_NV_ray_tracing
-        case OP_vkGetRayTracingShaderGroupHandlesNV:
-        {
+        case OP_vkGetRayTracingShaderGroupHandlesNV: {
             return "OP_vkGetRayTracingShaderGroupHandlesNV";
         }
 #endif
 #ifdef VK_VERSION_1_2
-        case OP_vkGetBufferOpaqueCaptureAddress:
-        {
+        case OP_vkGetBufferOpaqueCaptureAddress: {
             return "OP_vkGetBufferOpaqueCaptureAddress";
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state
-        case OP_vkCmdSetDepthTestEnableEXT:
-        {
+        case OP_vkCmdSetDepthTestEnableEXT: {
             return "OP_vkCmdSetDepthTestEnableEXT";
         }
 #endif
 #ifdef VK_NV_device_generated_commands
-        case OP_vkCmdExecuteGeneratedCommandsNV:
-        {
+        case OP_vkCmdExecuteGeneratedCommandsNV: {
             return "OP_vkCmdExecuteGeneratedCommandsNV";
         }
 #endif
 #ifdef VK_VERSION_1_2
-        case OP_vkCmdBeginRenderPass2:
-        {
+        case OP_vkCmdBeginRenderPass2: {
             return "OP_vkCmdBeginRenderPass2";
         }
 #endif
 #ifdef VK_EXT_private_data
-        case OP_vkCreatePrivateDataSlotEXT:
-        {
+        case OP_vkCreatePrivateDataSlotEXT: {
             return "OP_vkCreatePrivateDataSlotEXT";
         }
 #endif
 #ifdef VK_NV_shading_rate_image
-        case OP_vkCmdSetCoarseSampleOrderNV:
-        {
+        case OP_vkCmdSetCoarseSampleOrderNV: {
             return "OP_vkCmdSetCoarseSampleOrderNV";
         }
 #endif
 #ifdef VK_KHR_video_queue
-        case OP_vkDestroyVideoSessionParametersKHR:
-        {
+        case OP_vkDestroyVideoSessionParametersKHR: {
             return "OP_vkDestroyVideoSessionParametersKHR";
         }
 #endif
 #ifdef VK_NV_shading_rate_image
-        case OP_vkCmdBindShadingRateImageNV:
-        {
+        case OP_vkCmdBindShadingRateImageNV: {
             return "OP_vkCmdBindShadingRateImageNV";
         }
 #endif
 #ifdef VK_KHR_performance_query
-        case OP_vkAcquireProfilingLockKHR:
-        {
+        case OP_vkAcquireProfilingLockKHR: {
             return "OP_vkAcquireProfilingLockKHR";
         }
 #endif
 #ifdef VK_KHR_video_queue
-        case OP_vkDestroyVideoSessionKHR:
-        {
+        case OP_vkDestroyVideoSessionKHR: {
             return "OP_vkDestroyVideoSessionKHR";
         }
-        case OP_vkCmdBeginVideoCodingKHR:
-        {
+        case OP_vkCmdBeginVideoCodingKHR: {
             return "OP_vkCmdBeginVideoCodingKHR";
         }
 #endif
 #ifdef VK_KHR_acceleration_structure
-        case OP_vkCopyAccelerationStructureKHR:
-        {
+        case OP_vkCopyAccelerationStructureKHR: {
             return "OP_vkCopyAccelerationStructureKHR";
         }
 #endif
 #ifdef VK_GGP_stream_descriptor_surface
-        case OP_vkCreateStreamDescriptorSurfaceGGP:
-        {
+        case OP_vkCreateStreamDescriptorSurfaceGGP: {
             return "OP_vkCreateStreamDescriptorSurfaceGGP";
         }
 #endif
 #ifdef VK_KHR_acceleration_structure
-        case OP_vkBuildAccelerationStructuresKHR:
-        {
+        case OP_vkBuildAccelerationStructuresKHR: {
             return "OP_vkBuildAccelerationStructuresKHR";
         }
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
-        case OP_vkGetBufferCollectionPropertiesFUCHSIA:
-        {
+        case OP_vkGetBufferCollectionPropertiesFUCHSIA: {
             return "OP_vkGetBufferCollectionPropertiesFUCHSIA";
         }
 #endif
 #ifdef VK_EXT_host_query_reset
-        case OP_vkResetQueryPoolEXT:
-        {
+        case OP_vkResetQueryPoolEXT: {
             return "OP_vkResetQueryPoolEXT";
         }
 #endif
 #ifdef VK_KHR_maintenance4
-        case OP_vkGetDeviceImageMemoryRequirementsKHR:
-        {
+        case OP_vkGetDeviceImageMemoryRequirementsKHR: {
             return "OP_vkGetDeviceImageMemoryRequirementsKHR";
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state
-        case OP_vkCmdBindVertexBuffers2EXT:
-        {
+        case OP_vkCmdBindVertexBuffers2EXT: {
             return "OP_vkCmdBindVertexBuffers2EXT";
         }
 #endif
 #ifdef VK_GOOGLE_gfxstream
-        case OP_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE:
-        {
+        case OP_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE: {
             return "OP_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE";
         }
 #endif
 #ifdef VK_VERSION_1_2
-        case OP_vkCmdNextSubpass2:
-        {
+        case OP_vkCmdNextSubpass2: {
             return "OP_vkCmdNextSubpass2";
         }
 #endif
 #ifdef VK_KHR_synchronization2
-        case OP_vkCmdWaitEvents2KHR:
-        {
+        case OP_vkCmdWaitEvents2KHR: {
             return "OP_vkCmdWaitEvents2KHR";
         }
 #endif
 #ifdef VK_VERSION_1_2
-        case OP_vkCmdDrawIndexedIndirectCount:
-        {
+        case OP_vkCmdDrawIndexedIndirectCount: {
             return "OP_vkCmdDrawIndexedIndirectCount";
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
-        case OP_vkCmdSetRasterizerDiscardEnableEXT:
-        {
+        case OP_vkCmdSetRasterizerDiscardEnableEXT: {
             return "OP_vkCmdSetRasterizerDiscardEnableEXT";
         }
 #endif
 #ifdef VK_INTEL_performance_query
-        case OP_vkAcquirePerformanceConfigurationINTEL:
-        {
+        case OP_vkAcquirePerformanceConfigurationINTEL: {
             return "OP_vkAcquirePerformanceConfigurationINTEL";
         }
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
-        case OP_vkCreateRayTracingPipelinesKHR:
-        {
+        case OP_vkCreateRayTracingPipelinesKHR: {
             return "OP_vkCreateRayTracingPipelinesKHR";
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state
-        case OP_vkCmdSetDepthCompareOpEXT:
-        {
+        case OP_vkCmdSetDepthCompareOpEXT: {
             return "OP_vkCmdSetDepthCompareOpEXT";
         }
 #endif
 #ifdef VK_KHR_copy_commands2
-        case OP_vkCmdCopyBuffer2KHR:
-        {
+        case OP_vkCmdCopyBuffer2KHR: {
             return "OP_vkCmdCopyBuffer2KHR";
         }
 #endif
 #ifdef VK_KHR_video_queue
-        case OP_vkGetPhysicalDeviceVideoCapabilitiesKHR:
-        {
+        case OP_vkGetPhysicalDeviceVideoCapabilitiesKHR: {
             return "OP_vkGetPhysicalDeviceVideoCapabilitiesKHR";
         }
 #endif
 #ifdef VK_FUCHSIA_external_semaphore
-        case OP_vkGetSemaphoreZirconHandleFUCHSIA:
-        {
+        case OP_vkGetSemaphoreZirconHandleFUCHSIA: {
             return "OP_vkGetSemaphoreZirconHandleFUCHSIA";
         }
 #endif
 #ifdef VK_KHR_copy_commands2
-        case OP_vkCmdCopyBufferToImage2KHR:
-        {
+        case OP_vkCmdCopyBufferToImage2KHR: {
             return "OP_vkCmdCopyBufferToImage2KHR";
         }
 #endif
 #ifdef VK_NV_device_generated_commands
-        case OP_vkGetGeneratedCommandsMemoryRequirementsNV:
-        {
+        case OP_vkGetGeneratedCommandsMemoryRequirementsNV: {
             return "OP_vkGetGeneratedCommandsMemoryRequirementsNV";
         }
 #endif
 #ifdef VK_EXT_acquire_drm_display
-        case OP_vkAcquireDrmDisplayEXT:
-        {
+        case OP_vkAcquireDrmDisplayEXT: {
             return "OP_vkAcquireDrmDisplayEXT";
         }
 #endif
 #ifdef VK_EXT_image_drm_format_modifier
-        case OP_vkGetImageDrmFormatModifierPropertiesEXT:
-        {
+        case OP_vkGetImageDrmFormatModifierPropertiesEXT: {
             return "OP_vkGetImageDrmFormatModifierPropertiesEXT";
         }
 #endif
 #ifdef VK_INTEL_performance_query
-        case OP_vkCmdSetPerformanceOverrideINTEL:
-        {
+        case OP_vkCmdSetPerformanceOverrideINTEL: {
             return "OP_vkCmdSetPerformanceOverrideINTEL";
         }
 #endif
 #ifdef VK_VERSION_1_2
-        case OP_vkResetQueryPool:
-        {
+        case OP_vkResetQueryPool: {
             return "OP_vkResetQueryPool";
         }
 #endif
 #ifdef VK_KHR_copy_commands2
-        case OP_vkCmdCopyImageToBuffer2KHR:
-        {
+        case OP_vkCmdCopyImageToBuffer2KHR: {
             return "OP_vkCmdCopyImageToBuffer2KHR";
         }
 #endif
 #ifdef VK_KHR_synchronization2
-        case OP_vkCmdWriteTimestamp2KHR:
-        {
+        case OP_vkCmdWriteTimestamp2KHR: {
             return "OP_vkCmdWriteTimestamp2KHR";
         }
 #endif
 #ifdef VK_NV_ray_tracing
-        case OP_vkDestroyAccelerationStructureNV:
-        {
+        case OP_vkDestroyAccelerationStructureNV: {
             return "OP_vkDestroyAccelerationStructureNV";
         }
 #endif
 #ifdef VK_INTEL_performance_query
-        case OP_vkReleasePerformanceConfigurationINTEL:
-        {
+        case OP_vkReleasePerformanceConfigurationINTEL: {
             return "OP_vkReleasePerformanceConfigurationINTEL";
         }
 #endif
 #ifdef VK_KHR_video_queue
-        case OP_vkCmdControlVideoCodingKHR:
-        {
+        case OP_vkCmdControlVideoCodingKHR: {
             return "OP_vkCmdControlVideoCodingKHR";
         }
 #endif
 #ifdef VK_NVX_binary_import
-        case OP_vkDestroyCuFunctionNVX:
-        {
+        case OP_vkDestroyCuFunctionNVX: {
             return "OP_vkDestroyCuFunctionNVX";
         }
 #endif
 #ifdef VK_KHR_copy_commands2
-        case OP_vkCmdResolveImage2KHR:
-        {
+        case OP_vkCmdResolveImage2KHR: {
             return "OP_vkCmdResolveImage2KHR";
         }
 #endif
 #ifdef VK_EXT_metal_surface
-        case OP_vkCreateMetalSurfaceEXT:
-        {
+        case OP_vkCreateMetalSurfaceEXT: {
             return "OP_vkCreateMetalSurfaceEXT";
         }
 #endif
 #ifdef VK_KHR_acceleration_structure
-        case OP_vkCopyAccelerationStructureToMemoryKHR:
-        {
+        case OP_vkCopyAccelerationStructureToMemoryKHR: {
             return "OP_vkCopyAccelerationStructureToMemoryKHR";
         }
 #endif
 #ifdef VK_KHR_video_queue
-        case OP_vkGetVideoSessionMemoryRequirementsKHR:
-        {
+        case OP_vkGetVideoSessionMemoryRequirementsKHR: {
             return "OP_vkGetVideoSessionMemoryRequirementsKHR";
         }
 #endif
 #ifdef VK_NV_external_memory_rdma
-        case OP_vkGetMemoryRemoteAddressNV:
-        {
+        case OP_vkGetMemoryRemoteAddressNV: {
             return "OP_vkGetMemoryRemoteAddressNV";
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state
-        case OP_vkCmdSetViewportWithCountEXT:
-        {
+        case OP_vkCmdSetViewportWithCountEXT: {
             return "OP_vkCmdSetViewportWithCountEXT";
         }
 #endif
 #ifdef VK_EXT_full_screen_exclusive
-        case OP_vkReleaseFullScreenExclusiveModeEXT:
-        {
+        case OP_vkReleaseFullScreenExclusiveModeEXT: {
             return "OP_vkReleaseFullScreenExclusiveModeEXT";
         }
 #endif
 #ifdef VK_KHR_acceleration_structure
-        case OP_vkCmdBuildAccelerationStructuresIndirectKHR:
-        {
+        case OP_vkCmdBuildAccelerationStructuresIndirectKHR: {
             return "OP_vkCmdBuildAccelerationStructuresIndirectKHR";
         }
 #endif
 #ifdef VK_QNX_screen_surface
-        case OP_vkGetPhysicalDeviceScreenPresentationSupportQNX:
-        {
+        case OP_vkGetPhysicalDeviceScreenPresentationSupportQNX: {
             return "OP_vkGetPhysicalDeviceScreenPresentationSupportQNX";
         }
 #endif
 #ifdef VK_KHR_acceleration_structure
-        case OP_vkCreateAccelerationStructureKHR:
-        {
+        case OP_vkCreateAccelerationStructureKHR: {
             return "OP_vkCreateAccelerationStructureKHR";
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
-        case OP_vkCmdSetDepthBiasEnableEXT:
-        {
+        case OP_vkCmdSetDepthBiasEnableEXT: {
             return "OP_vkCmdSetDepthBiasEnableEXT";
         }
 #endif
 #ifdef VK_NV_ray_tracing
-        case OP_vkCreateAccelerationStructureNV:
-        {
+        case OP_vkCreateAccelerationStructureNV: {
             return "OP_vkCreateAccelerationStructureNV";
         }
 #endif
 #ifdef VK_KHR_copy_commands2
-        case OP_vkCmdBlitImage2KHR:
-        {
+        case OP_vkCmdBlitImage2KHR: {
             return "OP_vkCmdBlitImage2KHR";
         }
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
-        case OP_vkCmdSetRayTracingPipelineStackSizeKHR:
-        {
+        case OP_vkCmdSetRayTracingPipelineStackSizeKHR: {
             return "OP_vkCmdSetRayTracingPipelineStackSizeKHR";
         }
 #endif
 #ifdef VK_VERSION_1_2
-        case OP_vkGetDeviceMemoryOpaqueCaptureAddress:
-        {
+        case OP_vkGetDeviceMemoryOpaqueCaptureAddress: {
             return "OP_vkGetDeviceMemoryOpaqueCaptureAddress";
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state
-        case OP_vkCmdSetPrimitiveTopologyEXT:
-        {
+        case OP_vkCmdSetPrimitiveTopologyEXT: {
             return "OP_vkCmdSetPrimitiveTopologyEXT";
         }
 #endif
 #ifdef VK_KHR_video_queue
-        case OP_vkUpdateVideoSessionParametersKHR:
-        {
+        case OP_vkUpdateVideoSessionParametersKHR: {
             return "OP_vkUpdateVideoSessionParametersKHR";
         }
 #endif
 #ifdef VK_INTEL_performance_query
-        case OP_vkCmdSetPerformanceStreamMarkerINTEL:
-        {
+        case OP_vkCmdSetPerformanceStreamMarkerINTEL: {
             return "OP_vkCmdSetPerformanceStreamMarkerINTEL";
         }
 #endif
 #ifdef VK_KHR_acceleration_structure
-        case OP_vkCopyMemoryToAccelerationStructureKHR:
-        {
+        case OP_vkCopyMemoryToAccelerationStructureKHR: {
             return "OP_vkCopyMemoryToAccelerationStructureKHR";
         }
 #endif
 #ifdef VK_FUCHSIA_imagepipe_surface
-        case OP_vkCreateImagePipeSurfaceFUCHSIA:
-        {
+        case OP_vkCreateImagePipeSurfaceFUCHSIA: {
             return "OP_vkCreateImagePipeSurfaceFUCHSIA";
         }
 #endif
 #ifdef VK_KHR_video_queue
-        case OP_vkGetPhysicalDeviceVideoFormatPropertiesKHR:
-        {
+        case OP_vkGetPhysicalDeviceVideoFormatPropertiesKHR: {
             return "OP_vkGetPhysicalDeviceVideoFormatPropertiesKHR";
         }
 #endif
 #ifdef VK_KHR_present_wait
-        case OP_vkWaitForPresentKHR:
-        {
+        case OP_vkWaitForPresentKHR: {
             return "OP_vkWaitForPresentKHR";
         }
 #endif
 #ifdef VK_EXT_multi_draw
-        case OP_vkCmdDrawMultiEXT:
-        {
+        case OP_vkCmdDrawMultiEXT: {
             return "OP_vkCmdDrawMultiEXT";
         }
 #endif
 #ifdef VK_KHR_deferred_host_operations
-        case OP_vkGetDeferredOperationResultKHR:
-        {
+        case OP_vkGetDeferredOperationResultKHR: {
             return "OP_vkGetDeferredOperationResultKHR";
         }
 #endif
 #ifdef VK_EXT_line_rasterization
-        case OP_vkCmdSetLineStippleEXT:
-        {
+        case OP_vkCmdSetLineStippleEXT: {
             return "OP_vkCmdSetLineStippleEXT";
         }
 #endif
 #ifdef VK_KHR_timeline_semaphore
-        case OP_vkWaitSemaphoresKHR:
-        {
+        case OP_vkWaitSemaphoresKHR: {
             return "OP_vkWaitSemaphoresKHR";
         }
 #endif
 #ifdef VK_NV_fragment_shading_rate_enums
-        case OP_vkCmdSetFragmentShadingRateEnumNV:
-        {
+        case OP_vkCmdSetFragmentShadingRateEnumNV: {
             return "OP_vkCmdSetFragmentShadingRateEnumNV";
         }
 #endif
 #ifdef VK_KHR_video_queue
-        case OP_vkCreateVideoSessionParametersKHR:
-        {
+        case OP_vkCreateVideoSessionParametersKHR: {
             return "OP_vkCreateVideoSessionParametersKHR";
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state
-        case OP_vkCmdSetCullModeEXT:
-        {
+        case OP_vkCmdSetCullModeEXT: {
             return "OP_vkCmdSetCullModeEXT";
         }
 #endif
 #ifdef VK_KHR_acceleration_structure
-        case OP_vkGetDeviceAccelerationStructureCompatibilityKHR:
-        {
+        case OP_vkGetDeviceAccelerationStructureCompatibilityKHR: {
             return "OP_vkGetDeviceAccelerationStructureCompatibilityKHR";
         }
 #endif
 #ifdef VK_VERSION_1_2
-        case OP_vkGetSemaphoreCounterValue:
-        {
+        case OP_vkGetSemaphoreCounterValue: {
             return "OP_vkGetSemaphoreCounterValue";
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
-        case OP_vkCmdSetLogicOpEXT:
-        {
+        case OP_vkCmdSetLogicOpEXT: {
             return "OP_vkCmdSetLogicOpEXT";
         }
 #endif
 #ifdef VK_AMD_display_native_hdr
-        case OP_vkSetLocalDimmingAMD:
-        {
+        case OP_vkSetLocalDimmingAMD: {
             return "OP_vkSetLocalDimmingAMD";
         }
 #endif
 #ifdef VK_EXT_transform_feedback
-        case OP_vkCmdBindTransformFeedbackBuffersEXT:
-        {
+        case OP_vkCmdBindTransformFeedbackBuffersEXT: {
             return "OP_vkCmdBindTransformFeedbackBuffersEXT";
         }
 #endif
 #ifdef VK_GOOGLE_gfxstream
-        case OP_vkQueueCommitDescriptorSetUpdatesGOOGLE:
-        {
+        case OP_vkQueueCommitDescriptorSetUpdatesGOOGLE: {
             return "OP_vkQueueCommitDescriptorSetUpdatesGOOGLE";
         }
 #endif
 #ifdef VK_EXT_full_screen_exclusive
-        case OP_vkGetPhysicalDeviceSurfacePresentModes2EXT:
-        {
+        case OP_vkGetPhysicalDeviceSurfacePresentModes2EXT: {
             return "OP_vkGetPhysicalDeviceSurfacePresentModes2EXT";
         }
 #endif
 #ifdef VK_NV_ray_tracing
-        case OP_vkCmdBuildAccelerationStructureNV:
-        {
+        case OP_vkCmdBuildAccelerationStructureNV: {
             return "OP_vkCmdBuildAccelerationStructureNV";
         }
 #endif
 #ifdef VK_KHR_pipeline_executable_properties
-        case OP_vkGetPipelineExecutablePropertiesKHR:
-        {
+        case OP_vkGetPipelineExecutablePropertiesKHR: {
             return "OP_vkGetPipelineExecutablePropertiesKHR";
         }
 #endif
 #ifdef VK_NV_ray_tracing
-        case OP_vkGetAccelerationStructureHandleNV:
-        {
+        case OP_vkGetAccelerationStructureHandleNV: {
             return "OP_vkGetAccelerationStructureHandleNV";
         }
 #endif
 #ifdef VK_KHR_timeline_semaphore
-        case OP_vkSignalSemaphoreKHR:
-        {
+        case OP_vkSignalSemaphoreKHR: {
             return "OP_vkSignalSemaphoreKHR";
         }
 #endif
 #ifdef VK_INTEL_performance_query
-        case OP_vkCmdSetPerformanceMarkerINTEL:
-        {
+        case OP_vkCmdSetPerformanceMarkerINTEL: {
             return "OP_vkCmdSetPerformanceMarkerINTEL";
         }
 #endif
 #ifdef VK_NV_device_generated_commands
-        case OP_vkCmdBindPipelineShaderGroupNV:
-        {
+        case OP_vkCmdBindPipelineShaderGroupNV: {
             return "OP_vkCmdBindPipelineShaderGroupNV";
         }
 #endif
 #ifdef VK_KHR_synchronization2
-        case OP_vkCmdSetEvent2KHR:
-        {
+        case OP_vkCmdSetEvent2KHR: {
             return "OP_vkCmdSetEvent2KHR";
         }
 #endif
 #ifdef VK_VERSION_1_2
-        case OP_vkSignalSemaphore:
-        {
+        case OP_vkSignalSemaphore: {
             return "OP_vkSignalSemaphore";
         }
 #endif
 #ifdef VK_KHR_pipeline_executable_properties
-        case OP_vkGetPipelineExecutableStatisticsKHR:
-        {
+        case OP_vkGetPipelineExecutableStatisticsKHR: {
             return "OP_vkGetPipelineExecutableStatisticsKHR";
         }
 #endif
 #ifdef VK_KHR_acceleration_structure
-        case OP_vkCmdWriteAccelerationStructuresPropertiesKHR:
-        {
+        case OP_vkCmdWriteAccelerationStructuresPropertiesKHR: {
             return "OP_vkCmdWriteAccelerationStructuresPropertiesKHR";
         }
 #endif
 #ifdef VK_NV_ray_tracing
-        case OP_vkGetRayTracingShaderGroupHandlesKHR:
-        {
+        case OP_vkGetRayTracingShaderGroupHandlesKHR: {
             return "OP_vkGetRayTracingShaderGroupHandlesKHR";
         }
 #endif
 #ifdef VK_EXT_transform_feedback
-        case OP_vkCmdEndTransformFeedbackEXT:
-        {
+        case OP_vkCmdEndTransformFeedbackEXT: {
             return "OP_vkCmdEndTransformFeedbackEXT";
         }
 #endif
 #ifdef VK_KHR_acceleration_structure
-        case OP_vkCmdBuildAccelerationStructuresKHR:
-        {
+        case OP_vkCmdBuildAccelerationStructuresKHR: {
             return "OP_vkCmdBuildAccelerationStructuresKHR";
         }
 #endif
 #ifdef VK_KHR_fragment_shading_rate
-        case OP_vkGetPhysicalDeviceFragmentShadingRatesKHR:
-        {
+        case OP_vkGetPhysicalDeviceFragmentShadingRatesKHR: {
             return "OP_vkGetPhysicalDeviceFragmentShadingRatesKHR";
         }
 #endif
 #ifdef VK_NVX_binary_import
-        case OP_vkDestroyCuModuleNVX:
-        {
+        case OP_vkDestroyCuModuleNVX: {
             return "OP_vkDestroyCuModuleNVX";
         }
 #endif
 #ifdef VK_NV_mesh_shader
-        case OP_vkCmdDrawMeshTasksIndirectNV:
-        {
+        case OP_vkCmdDrawMeshTasksIndirectNV: {
             return "OP_vkCmdDrawMeshTasksIndirectNV";
         }
 #endif
 #ifdef VK_KHR_pipeline_executable_properties
-        case OP_vkGetPipelineExecutableInternalRepresentationsKHR:
-        {
+        case OP_vkGetPipelineExecutableInternalRepresentationsKHR: {
             return "OP_vkGetPipelineExecutableInternalRepresentationsKHR";
         }
 #endif
 #ifdef VK_NV_acquire_winrt_display
-        case OP_vkAcquireWinrtDisplayNV:
-        {
+        case OP_vkAcquireWinrtDisplayNV: {
             return "OP_vkAcquireWinrtDisplayNV";
         }
 #endif
 #ifdef VK_KHR_deferred_host_operations
-        case OP_vkCreateDeferredOperationKHR:
-        {
+        case OP_vkCreateDeferredOperationKHR: {
             return "OP_vkCreateDeferredOperationKHR";
         }
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
-        case OP_vkSetBufferCollectionImageConstraintsFUCHSIA:
-        {
+        case OP_vkSetBufferCollectionImageConstraintsFUCHSIA: {
             return "OP_vkSetBufferCollectionImageConstraintsFUCHSIA";
         }
 #endif
 #ifdef VK_KHR_maintenance4
-        case OP_vkGetDeviceImageSparseMemoryRequirementsKHR:
-        {
+        case OP_vkGetDeviceImageSparseMemoryRequirementsKHR: {
             return "OP_vkGetDeviceImageSparseMemoryRequirementsKHR";
         }
 #endif
 #ifdef VK_KHR_video_decode_queue
-        case OP_vkCmdDecodeVideoKHR:
-        {
+        case OP_vkCmdDecodeVideoKHR: {
             return "OP_vkCmdDecodeVideoKHR";
         }
 #endif
 #ifdef VK_EXT_transform_feedback
-        case OP_vkCmdBeginQueryIndexedEXT:
-        {
+        case OP_vkCmdBeginQueryIndexedEXT: {
             return "OP_vkCmdBeginQueryIndexedEXT";
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state
-        case OP_vkCmdSetStencilOpEXT:
-        {
+        case OP_vkCmdSetStencilOpEXT: {
             return "OP_vkCmdSetStencilOpEXT";
         }
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
-        case OP_vkCreateBufferCollectionFUCHSIA:
-        {
+        case OP_vkCreateBufferCollectionFUCHSIA: {
             return "OP_vkCreateBufferCollectionFUCHSIA";
         }
 #endif
 #ifdef VK_NV_ray_tracing
-        case OP_vkCompileDeferredNV:
-        {
+        case OP_vkCompileDeferredNV: {
             return "OP_vkCompileDeferredNV";
         }
 #endif
 #ifdef VK_KHR_acceleration_structure
-        case OP_vkCmdCopyAccelerationStructureKHR:
-        {
+        case OP_vkCmdCopyAccelerationStructureKHR: {
             return "OP_vkCmdCopyAccelerationStructureKHR";
         }
 #endif
 #ifdef VK_VERSION_1_2
-        case OP_vkCreateRenderPass2:
-        {
+        case OP_vkCreateRenderPass2: {
             return "OP_vkCreateRenderPass2";
         }
 #endif
 #ifdef VK_EXT_transform_feedback
-        case OP_vkCmdEndQueryIndexedEXT:
-        {
+        case OP_vkCmdEndQueryIndexedEXT: {
             return "OP_vkCmdEndQueryIndexedEXT";
         }
 #endif
 #ifdef VK_KHR_video_queue
-        case OP_vkCmdEndVideoCodingKHR:
-        {
+        case OP_vkCmdEndVideoCodingKHR: {
             return "OP_vkCmdEndVideoCodingKHR";
         }
 #endif
 #ifdef VK_KHR_performance_query
-        case OP_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR:
-        {
+        case OP_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR: {
             return "OP_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR";
         }
 #endif
 #ifdef VK_EXT_tooling_info
-        case OP_vkGetPhysicalDeviceToolPropertiesEXT:
-        {
+        case OP_vkGetPhysicalDeviceToolPropertiesEXT: {
             return "OP_vkGetPhysicalDeviceToolPropertiesEXT";
         }
 #endif
 #ifdef VK_GOOGLE_gfxstream
-        case OP_vkGetLinearImageLayout2GOOGLE:
-        {
+        case OP_vkGetLinearImageLayout2GOOGLE: {
             return "OP_vkGetLinearImageLayout2GOOGLE";
         }
 #endif
 #ifdef VK_EXT_acquire_drm_display
-        case OP_vkGetDrmDisplayEXT:
-        {
+        case OP_vkGetDrmDisplayEXT: {
             return "OP_vkGetDrmDisplayEXT";
         }
 #endif
 #ifdef VK_VERSION_1_2
-        case OP_vkCmdDrawIndirectCount:
-        {
+        case OP_vkCmdDrawIndirectCount: {
             return "OP_vkCmdDrawIndirectCount";
         }
 #endif
 #ifdef VK_KHR_synchronization2
-        case OP_vkCmdResetEvent2KHR:
-        {
+        case OP_vkCmdResetEvent2KHR: {
             return "OP_vkCmdResetEvent2KHR";
         }
 #endif
 #ifdef VK_EXT_multi_draw
-        case OP_vkCmdDrawMultiIndexedEXT:
-        {
+        case OP_vkCmdDrawMultiIndexedEXT: {
             return "OP_vkCmdDrawMultiIndexedEXT";
         }
 #endif
 #ifdef VK_EXT_transform_feedback
-        case OP_vkCmdDrawIndirectByteCountEXT:
-        {
+        case OP_vkCmdDrawIndirectByteCountEXT: {
             return "OP_vkCmdDrawIndirectByteCountEXT";
         }
 #endif
 #ifdef VK_NV_device_generated_commands
-        case OP_vkCreateIndirectCommandsLayoutNV:
-        {
+        case OP_vkCreateIndirectCommandsLayoutNV: {
             return "OP_vkCreateIndirectCommandsLayoutNV";
         }
 #endif
 #ifdef VK_EXT_directfb_surface
-        case OP_vkGetPhysicalDeviceDirectFBPresentationSupportEXT:
-        {
+        case OP_vkGetPhysicalDeviceDirectFBPresentationSupportEXT: {
             return "OP_vkGetPhysicalDeviceDirectFBPresentationSupportEXT";
         }
 #endif
 #ifdef VK_KHR_buffer_device_address
-        case OP_vkGetBufferOpaqueCaptureAddressKHR:
-        {
+        case OP_vkGetBufferOpaqueCaptureAddressKHR: {
             return "OP_vkGetBufferOpaqueCaptureAddressKHR";
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state
-        case OP_vkCmdSetStencilTestEnableEXT:
-        {
+        case OP_vkCmdSetStencilTestEnableEXT: {
             return "OP_vkCmdSetStencilTestEnableEXT";
         }
 #endif
 #ifdef VK_NV_cooperative_matrix
-        case OP_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV:
-        {
+        case OP_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV: {
             return "OP_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV";
         }
 #endif
 #ifdef VK_KHR_acceleration_structure
-        case OP_vkWriteAccelerationStructuresPropertiesKHR:
-        {
+        case OP_vkWriteAccelerationStructuresPropertiesKHR: {
             return "OP_vkWriteAccelerationStructuresPropertiesKHR";
         }
 #endif
 #ifdef VK_EXT_private_data
-        case OP_vkGetPrivateDataEXT:
-        {
+        case OP_vkGetPrivateDataEXT: {
             return "OP_vkGetPrivateDataEXT";
         }
 #endif
 #ifdef VK_NV_coverage_reduction_mode
-        case OP_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV:
-        {
+        case OP_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV: {
             return "OP_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV";
         }
 #endif
 #ifdef VK_KHR_synchronization2
-        case OP_vkGetQueueCheckpointData2NV:
-        {
+        case OP_vkGetQueueCheckpointData2NV: {
             return "OP_vkGetQueueCheckpointData2NV";
         }
 #endif
 #ifdef VK_NV_device_generated_commands
-        case OP_vkDestroyIndirectCommandsLayoutNV:
-        {
+        case OP_vkDestroyIndirectCommandsLayoutNV: {
             return "OP_vkDestroyIndirectCommandsLayoutNV";
         }
 #endif
 #ifdef VK_KHR_synchronization2
-        case OP_vkQueueSubmit2KHR:
-        {
+        case OP_vkQueueSubmit2KHR: {
             return "OP_vkQueueSubmit2KHR";
         }
 #endif
 #ifdef VK_NV_acquire_winrt_display
-        case OP_vkGetWinrtDisplayNV:
-        {
+        case OP_vkGetWinrtDisplayNV: {
             return "OP_vkGetWinrtDisplayNV";
         }
 #endif
 #ifdef VK_EXT_transform_feedback
-        case OP_vkCmdBeginTransformFeedbackEXT:
-        {
+        case OP_vkCmdBeginTransformFeedbackEXT: {
             return "OP_vkCmdBeginTransformFeedbackEXT";
         }
 #endif
 #ifdef VK_KHR_buffer_device_address
-        case OP_vkGetDeviceMemoryOpaqueCaptureAddressKHR:
-        {
+        case OP_vkGetDeviceMemoryOpaqueCaptureAddressKHR: {
             return "OP_vkGetDeviceMemoryOpaqueCaptureAddressKHR";
         }
 #endif
 #ifdef VK_INTEL_performance_query
-        case OP_vkQueueSetPerformanceConfigurationINTEL:
-        {
+        case OP_vkQueueSetPerformanceConfigurationINTEL: {
             return "OP_vkQueueSetPerformanceConfigurationINTEL";
         }
 #endif
 #ifdef VK_EXT_calibrated_timestamps
-        case OP_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT:
-        {
+        case OP_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT: {
             return "OP_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT";
         }
 #endif
 #ifdef VK_KHR_video_encode_queue
-        case OP_vkCmdEncodeVideoKHR:
-        {
+        case OP_vkCmdEncodeVideoKHR: {
             return "OP_vkCmdEncodeVideoKHR";
         }
 #endif
 #ifdef VK_INTEL_performance_query
-        case OP_vkUninitializePerformanceApiINTEL:
-        {
+        case OP_vkUninitializePerformanceApiINTEL: {
             return "OP_vkUninitializePerformanceApiINTEL";
         }
 #endif
 #ifdef VK_NV_device_generated_commands
-        case OP_vkCmdPreprocessGeneratedCommandsNV:
-        {
+        case OP_vkCmdPreprocessGeneratedCommandsNV: {
             return "OP_vkCmdPreprocessGeneratedCommandsNV";
         }
 #endif
 #ifdef VK_KHR_dynamic_rendering
-        case OP_vkCmdBeginRenderingKHR:
-        {
+        case OP_vkCmdBeginRenderingKHR: {
             return "OP_vkCmdBeginRenderingKHR";
         }
 #endif
 #ifdef VK_EXT_headless_surface
-        case OP_vkCreateHeadlessSurfaceEXT:
-        {
+        case OP_vkCreateHeadlessSurfaceEXT: {
             return "OP_vkCreateHeadlessSurfaceEXT";
         }
 #endif
 #ifdef VK_KHR_performance_query
-        case OP_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR:
-        {
+        case OP_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR: {
             return "OP_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR";
         }
 #endif
 #ifdef VK_HUAWEI_invocation_mask
-        case OP_vkCmdBindInvocationMaskHUAWEI:
-        {
+        case OP_vkCmdBindInvocationMaskHUAWEI: {
             return "OP_vkCmdBindInvocationMaskHUAWEI";
         }
 #endif
 #ifdef VK_FUCHSIA_external_semaphore
-        case OP_vkImportSemaphoreZirconHandleFUCHSIA:
-        {
+        case OP_vkImportSemaphoreZirconHandleFUCHSIA: {
             return "OP_vkImportSemaphoreZirconHandleFUCHSIA";
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
-        case OP_vkCmdSetPrimitiveRestartEnableEXT:
-        {
+        case OP_vkCmdSetPrimitiveRestartEnableEXT: {
             return "OP_vkCmdSetPrimitiveRestartEnableEXT";
         }
 #endif
-        default:
-        {
+        default: {
             return "OP_UNKNOWN_API_CALL";
         }
     }
 }
 
-
-} // namespace goldfish_vk
+}  // namespace goldfish_vk
diff --git a/stream-servers/vulkan/cereal/common/goldfish_vk_marshaling.h b/stream-servers/vulkan/cereal/common/goldfish_vk_marshaling.h
index 458659d..e60f12c 100644
--- a/stream-servers/vulkan/cereal/common/goldfish_vk_marshaling.h
+++ b/stream-servers/vulkan/cereal/common/goldfish_vk_marshaling.h
@@ -14,304 +14,199 @@
 // limitations under the License.
 
 // Autogenerated module goldfish_vk_marshaling
-// (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
+// (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml
+// cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
 // VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
 // VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+//
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o
+// $CEREAL_OUTPUT_DIR
+//
 #pragma once
 #include <vulkan/vulkan.h>
-#include "vulkan_gfxstream.h"
-
-#include "goldfish_vk_private_defs.h"
 
 #include "VulkanStream.h"
 #include "base/StreamSerializing.h"
+#include "goldfish_vk_private_defs.h"
+#include "vulkan_gfxstream.h"
 
 namespace goldfish_vk {
 #ifdef VK_VERSION_1_0
-void marshal_VkExtent2D(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkExtent2D* forMarshaling);
+void marshal_VkExtent2D(VulkanStream* vkStream, VkStructureType rootType,
+                        const VkExtent2D* forMarshaling);
 
-void unmarshal_VkExtent2D(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExtent2D* forUnmarshaling);
+void unmarshal_VkExtent2D(VulkanStream* vkStream, VkStructureType rootType,
+                          VkExtent2D* forUnmarshaling);
 
-void marshal_VkExtent3D(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkExtent3D* forMarshaling);
+void marshal_VkExtent3D(VulkanStream* vkStream, VkStructureType rootType,
+                        const VkExtent3D* forMarshaling);
 
-void unmarshal_VkExtent3D(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExtent3D* forUnmarshaling);
+void unmarshal_VkExtent3D(VulkanStream* vkStream, VkStructureType rootType,
+                          VkExtent3D* forUnmarshaling);
 
-void marshal_VkOffset2D(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkOffset2D* forMarshaling);
+void marshal_VkOffset2D(VulkanStream* vkStream, VkStructureType rootType,
+                        const VkOffset2D* forMarshaling);
 
-void unmarshal_VkOffset2D(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkOffset2D* forUnmarshaling);
+void unmarshal_VkOffset2D(VulkanStream* vkStream, VkStructureType rootType,
+                          VkOffset2D* forUnmarshaling);
 
-void marshal_VkOffset3D(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkOffset3D* forMarshaling);
+void marshal_VkOffset3D(VulkanStream* vkStream, VkStructureType rootType,
+                        const VkOffset3D* forMarshaling);
 
-void unmarshal_VkOffset3D(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkOffset3D* forUnmarshaling);
+void unmarshal_VkOffset3D(VulkanStream* vkStream, VkStructureType rootType,
+                          VkOffset3D* forUnmarshaling);
 
-void marshal_VkRect2D(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkRect2D* forMarshaling);
+void marshal_VkRect2D(VulkanStream* vkStream, VkStructureType rootType,
+                      const VkRect2D* forMarshaling);
 
-void unmarshal_VkRect2D(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRect2D* forUnmarshaling);
+void unmarshal_VkRect2D(VulkanStream* vkStream, VkStructureType rootType,
+                        VkRect2D* forUnmarshaling);
 
-void marshal_VkBaseInStructure(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBaseInStructure* forMarshaling);
+void marshal_VkBaseInStructure(VulkanStream* vkStream, VkStructureType rootType,
+                               const VkBaseInStructure* forMarshaling);
 
-void unmarshal_VkBaseInStructure(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBaseInStructure* forUnmarshaling);
+void unmarshal_VkBaseInStructure(VulkanStream* vkStream, VkStructureType rootType,
+                                 VkBaseInStructure* forUnmarshaling);
 
-void marshal_VkBaseOutStructure(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBaseOutStructure* forMarshaling);
+void marshal_VkBaseOutStructure(VulkanStream* vkStream, VkStructureType rootType,
+                                const VkBaseOutStructure* forMarshaling);
 
-void unmarshal_VkBaseOutStructure(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBaseOutStructure* forUnmarshaling);
+void unmarshal_VkBaseOutStructure(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkBaseOutStructure* forUnmarshaling);
 
-void marshal_VkBufferMemoryBarrier(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBufferMemoryBarrier* forMarshaling);
+void marshal_VkBufferMemoryBarrier(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkBufferMemoryBarrier* forMarshaling);
 
-void unmarshal_VkBufferMemoryBarrier(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferMemoryBarrier* forUnmarshaling);
+void unmarshal_VkBufferMemoryBarrier(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkBufferMemoryBarrier* forUnmarshaling);
 
-void marshal_VkDispatchIndirectCommand(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDispatchIndirectCommand* forMarshaling);
+void marshal_VkDispatchIndirectCommand(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkDispatchIndirectCommand* forMarshaling);
 
-void unmarshal_VkDispatchIndirectCommand(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDispatchIndirectCommand* forUnmarshaling);
+void unmarshal_VkDispatchIndirectCommand(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkDispatchIndirectCommand* forUnmarshaling);
 
-void marshal_VkDrawIndexedIndirectCommand(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDrawIndexedIndirectCommand* forMarshaling);
+void marshal_VkDrawIndexedIndirectCommand(VulkanStream* vkStream, VkStructureType rootType,
+                                          const VkDrawIndexedIndirectCommand* forMarshaling);
 
-void unmarshal_VkDrawIndexedIndirectCommand(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDrawIndexedIndirectCommand* forUnmarshaling);
+void unmarshal_VkDrawIndexedIndirectCommand(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkDrawIndexedIndirectCommand* forUnmarshaling);
 
-void marshal_VkDrawIndirectCommand(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDrawIndirectCommand* forMarshaling);
+void marshal_VkDrawIndirectCommand(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkDrawIndirectCommand* forMarshaling);
 
-void unmarshal_VkDrawIndirectCommand(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDrawIndirectCommand* forUnmarshaling);
+void unmarshal_VkDrawIndirectCommand(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkDrawIndirectCommand* forUnmarshaling);
 
-void marshal_VkImageSubresourceRange(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageSubresourceRange* forMarshaling);
+void marshal_VkImageSubresourceRange(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkImageSubresourceRange* forMarshaling);
 
-void unmarshal_VkImageSubresourceRange(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageSubresourceRange* forUnmarshaling);
+void unmarshal_VkImageSubresourceRange(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkImageSubresourceRange* forUnmarshaling);
 
-void marshal_VkImageMemoryBarrier(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageMemoryBarrier* forMarshaling);
+void marshal_VkImageMemoryBarrier(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkImageMemoryBarrier* forMarshaling);
 
-void unmarshal_VkImageMemoryBarrier(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageMemoryBarrier* forUnmarshaling);
+void unmarshal_VkImageMemoryBarrier(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkImageMemoryBarrier* forUnmarshaling);
 
-void marshal_VkMemoryBarrier(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMemoryBarrier* forMarshaling);
+void marshal_VkMemoryBarrier(VulkanStream* vkStream, VkStructureType rootType,
+                             const VkMemoryBarrier* forMarshaling);
 
-void unmarshal_VkMemoryBarrier(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryBarrier* forUnmarshaling);
+void unmarshal_VkMemoryBarrier(VulkanStream* vkStream, VkStructureType rootType,
+                               VkMemoryBarrier* forUnmarshaling);
 
-void marshal_VkPipelineCacheHeaderVersionOne(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineCacheHeaderVersionOne* forMarshaling);
+void marshal_VkPipelineCacheHeaderVersionOne(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkPipelineCacheHeaderVersionOne* forMarshaling);
 
-void unmarshal_VkPipelineCacheHeaderVersionOne(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineCacheHeaderVersionOne* forUnmarshaling);
+void unmarshal_VkPipelineCacheHeaderVersionOne(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkPipelineCacheHeaderVersionOne* forUnmarshaling);
 
-void marshal_VkAllocationCallbacks(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAllocationCallbacks* forMarshaling);
+void marshal_VkAllocationCallbacks(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkAllocationCallbacks* forMarshaling);
 
-void unmarshal_VkAllocationCallbacks(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAllocationCallbacks* forUnmarshaling);
+void unmarshal_VkAllocationCallbacks(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkAllocationCallbacks* forUnmarshaling);
 
-void marshal_VkApplicationInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkApplicationInfo* forMarshaling);
+void marshal_VkApplicationInfo(VulkanStream* vkStream, VkStructureType rootType,
+                               const VkApplicationInfo* forMarshaling);
 
-void unmarshal_VkApplicationInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkApplicationInfo* forUnmarshaling);
+void unmarshal_VkApplicationInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                 VkApplicationInfo* forUnmarshaling);
 
-void marshal_VkFormatProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkFormatProperties* forMarshaling);
+void marshal_VkFormatProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                const VkFormatProperties* forMarshaling);
 
-void unmarshal_VkFormatProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFormatProperties* forUnmarshaling);
+void unmarshal_VkFormatProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkFormatProperties* forUnmarshaling);
 
-void marshal_VkImageFormatProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageFormatProperties* forMarshaling);
+void marshal_VkImageFormatProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkImageFormatProperties* forMarshaling);
 
-void unmarshal_VkImageFormatProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageFormatProperties* forUnmarshaling);
+void unmarshal_VkImageFormatProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkImageFormatProperties* forUnmarshaling);
 
-void marshal_VkInstanceCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkInstanceCreateInfo* forMarshaling);
+void marshal_VkInstanceCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkInstanceCreateInfo* forMarshaling);
 
-void unmarshal_VkInstanceCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkInstanceCreateInfo* forUnmarshaling);
+void unmarshal_VkInstanceCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkInstanceCreateInfo* forUnmarshaling);
 
-void marshal_VkMemoryHeap(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMemoryHeap* forMarshaling);
+void marshal_VkMemoryHeap(VulkanStream* vkStream, VkStructureType rootType,
+                          const VkMemoryHeap* forMarshaling);
 
-void unmarshal_VkMemoryHeap(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryHeap* forUnmarshaling);
+void unmarshal_VkMemoryHeap(VulkanStream* vkStream, VkStructureType rootType,
+                            VkMemoryHeap* forUnmarshaling);
 
-void marshal_VkMemoryType(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMemoryType* forMarshaling);
+void marshal_VkMemoryType(VulkanStream* vkStream, VkStructureType rootType,
+                          const VkMemoryType* forMarshaling);
 
-void unmarshal_VkMemoryType(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryType* forUnmarshaling);
+void unmarshal_VkMemoryType(VulkanStream* vkStream, VkStructureType rootType,
+                            VkMemoryType* forUnmarshaling);
 
-void marshal_VkPhysicalDeviceFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceFeatures* forMarshaling);
+void marshal_VkPhysicalDeviceFeatures(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkPhysicalDeviceFeatures* forMarshaling);
 
-void unmarshal_VkPhysicalDeviceFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFeatures* forUnmarshaling);
+void unmarshal_VkPhysicalDeviceFeatures(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkPhysicalDeviceFeatures* forUnmarshaling);
 
-void marshal_VkPhysicalDeviceLimits(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceLimits* forMarshaling);
+void marshal_VkPhysicalDeviceLimits(VulkanStream* vkStream, VkStructureType rootType,
+                                    const VkPhysicalDeviceLimits* forMarshaling);
 
-void unmarshal_VkPhysicalDeviceLimits(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceLimits* forUnmarshaling);
+void unmarshal_VkPhysicalDeviceLimits(VulkanStream* vkStream, VkStructureType rootType,
+                                      VkPhysicalDeviceLimits* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceMemoryProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceMemoryProperties* forMarshaling);
 
-void unmarshal_VkPhysicalDeviceMemoryProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMemoryProperties* forUnmarshaling);
+void unmarshal_VkPhysicalDeviceMemoryProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkPhysicalDeviceMemoryProperties* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceSparseProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceSparseProperties* forMarshaling);
 
-void unmarshal_VkPhysicalDeviceSparseProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSparseProperties* forUnmarshaling);
+void unmarshal_VkPhysicalDeviceSparseProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkPhysicalDeviceSparseProperties* forUnmarshaling);
 
-void marshal_VkPhysicalDeviceProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceProperties* forMarshaling);
+void marshal_VkPhysicalDeviceProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                        const VkPhysicalDeviceProperties* forMarshaling);
 
-void unmarshal_VkPhysicalDeviceProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceProperties* forUnmarshaling);
+void unmarshal_VkPhysicalDeviceProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkPhysicalDeviceProperties* forUnmarshaling);
 
-void marshal_VkQueueFamilyProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkQueueFamilyProperties* forMarshaling);
+void marshal_VkQueueFamilyProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkQueueFamilyProperties* forMarshaling);
 
-void unmarshal_VkQueueFamilyProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkQueueFamilyProperties* forUnmarshaling);
+void unmarshal_VkQueueFamilyProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkQueueFamilyProperties* forUnmarshaling);
 
 #define OP_vkCreateInstance 20000
 #define OP_vkDestroyInstance 20001
@@ -324,85 +219,57 @@
 #define OP_vkGetPhysicalDeviceMemoryProperties 20008
 #define OP_vkGetInstanceProcAddr 20009
 #define OP_vkGetDeviceProcAddr 20010
-void marshal_VkDeviceQueueCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDeviceQueueCreateInfo* forMarshaling);
+void marshal_VkDeviceQueueCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkDeviceQueueCreateInfo* forMarshaling);
 
-void unmarshal_VkDeviceQueueCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceQueueCreateInfo* forUnmarshaling);
+void unmarshal_VkDeviceQueueCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkDeviceQueueCreateInfo* forUnmarshaling);
 
-void marshal_VkDeviceCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDeviceCreateInfo* forMarshaling);
+void marshal_VkDeviceCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                const VkDeviceCreateInfo* forMarshaling);
 
-void unmarshal_VkDeviceCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceCreateInfo* forUnmarshaling);
+void unmarshal_VkDeviceCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkDeviceCreateInfo* forUnmarshaling);
 
 #define OP_vkCreateDevice 20011
 #define OP_vkDestroyDevice 20012
-void marshal_VkExtensionProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkExtensionProperties* forMarshaling);
+void marshal_VkExtensionProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkExtensionProperties* forMarshaling);
 
-void unmarshal_VkExtensionProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExtensionProperties* forUnmarshaling);
+void unmarshal_VkExtensionProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkExtensionProperties* forUnmarshaling);
 
 #define OP_vkEnumerateInstanceExtensionProperties 20013
 #define OP_vkEnumerateDeviceExtensionProperties 20014
-void marshal_VkLayerProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkLayerProperties* forMarshaling);
+void marshal_VkLayerProperties(VulkanStream* vkStream, VkStructureType rootType,
+                               const VkLayerProperties* forMarshaling);
 
-void unmarshal_VkLayerProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkLayerProperties* forUnmarshaling);
+void unmarshal_VkLayerProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                 VkLayerProperties* forUnmarshaling);
 
 #define OP_vkEnumerateInstanceLayerProperties 20015
 #define OP_vkEnumerateDeviceLayerProperties 20016
-void marshal_VkSubmitInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSubmitInfo* forMarshaling);
+void marshal_VkSubmitInfo(VulkanStream* vkStream, VkStructureType rootType,
+                          const VkSubmitInfo* forMarshaling);
 
-void unmarshal_VkSubmitInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubmitInfo* forUnmarshaling);
+void unmarshal_VkSubmitInfo(VulkanStream* vkStream, VkStructureType rootType,
+                            VkSubmitInfo* forUnmarshaling);
 
 #define OP_vkGetDeviceQueue 20017
 #define OP_vkQueueSubmit 20018
 #define OP_vkQueueWaitIdle 20019
 #define OP_vkDeviceWaitIdle 20020
-void marshal_VkMappedMemoryRange(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMappedMemoryRange* forMarshaling);
+void marshal_VkMappedMemoryRange(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkMappedMemoryRange* forMarshaling);
 
-void unmarshal_VkMappedMemoryRange(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMappedMemoryRange* forUnmarshaling);
+void unmarshal_VkMappedMemoryRange(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkMappedMemoryRange* forUnmarshaling);
 
-void marshal_VkMemoryAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMemoryAllocateInfo* forMarshaling);
+void marshal_VkMemoryAllocateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkMemoryAllocateInfo* forMarshaling);
 
-void unmarshal_VkMemoryAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryAllocateInfo* forUnmarshaling);
+void unmarshal_VkMemoryAllocateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkMemoryAllocateInfo* forUnmarshaling);
 
 #define OP_vkAllocateMemory 20021
 #define OP_vkFreeMemory 20022
@@ -411,579 +278,390 @@
 #define OP_vkFlushMappedMemoryRanges 20025
 #define OP_vkInvalidateMappedMemoryRanges 20026
 #define OP_vkGetDeviceMemoryCommitment 20027
-void marshal_VkMemoryRequirements(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMemoryRequirements* forMarshaling);
+void marshal_VkMemoryRequirements(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkMemoryRequirements* forMarshaling);
 
-void unmarshal_VkMemoryRequirements(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryRequirements* forUnmarshaling);
+void unmarshal_VkMemoryRequirements(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkMemoryRequirements* forUnmarshaling);
 
 #define OP_vkBindBufferMemory 20028
 #define OP_vkBindImageMemory 20029
 #define OP_vkGetBufferMemoryRequirements 20030
 #define OP_vkGetImageMemoryRequirements 20031
-void marshal_VkSparseMemoryBind(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSparseMemoryBind* forMarshaling);
+void marshal_VkSparseMemoryBind(VulkanStream* vkStream, VkStructureType rootType,
+                                const VkSparseMemoryBind* forMarshaling);
 
-void unmarshal_VkSparseMemoryBind(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSparseMemoryBind* forUnmarshaling);
+void unmarshal_VkSparseMemoryBind(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkSparseMemoryBind* forUnmarshaling);
 
-void marshal_VkSparseBufferMemoryBindInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSparseBufferMemoryBindInfo* forMarshaling);
+void marshal_VkSparseBufferMemoryBindInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                          const VkSparseBufferMemoryBindInfo* forMarshaling);
 
-void unmarshal_VkSparseBufferMemoryBindInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSparseBufferMemoryBindInfo* forUnmarshaling);
+void unmarshal_VkSparseBufferMemoryBindInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkSparseBufferMemoryBindInfo* forUnmarshaling);
 
 void marshal_VkSparseImageOpaqueMemoryBindInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkSparseImageOpaqueMemoryBindInfo* forMarshaling);
 
 void unmarshal_VkSparseImageOpaqueMemoryBindInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkSparseImageOpaqueMemoryBindInfo* forUnmarshaling);
 
-void marshal_VkImageSubresource(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageSubresource* forMarshaling);
+void marshal_VkImageSubresource(VulkanStream* vkStream, VkStructureType rootType,
+                                const VkImageSubresource* forMarshaling);
 
-void unmarshal_VkImageSubresource(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageSubresource* forUnmarshaling);
+void unmarshal_VkImageSubresource(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkImageSubresource* forUnmarshaling);
 
-void marshal_VkSparseImageMemoryBind(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSparseImageMemoryBind* forMarshaling);
+void marshal_VkSparseImageMemoryBind(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkSparseImageMemoryBind* forMarshaling);
 
-void unmarshal_VkSparseImageMemoryBind(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSparseImageMemoryBind* forUnmarshaling);
+void unmarshal_VkSparseImageMemoryBind(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkSparseImageMemoryBind* forUnmarshaling);
 
-void marshal_VkSparseImageMemoryBindInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSparseImageMemoryBindInfo* forMarshaling);
+void marshal_VkSparseImageMemoryBindInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkSparseImageMemoryBindInfo* forMarshaling);
 
-void unmarshal_VkSparseImageMemoryBindInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSparseImageMemoryBindInfo* forUnmarshaling);
+void unmarshal_VkSparseImageMemoryBindInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkSparseImageMemoryBindInfo* forUnmarshaling);
 
-void marshal_VkBindSparseInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBindSparseInfo* forMarshaling);
+void marshal_VkBindSparseInfo(VulkanStream* vkStream, VkStructureType rootType,
+                              const VkBindSparseInfo* forMarshaling);
 
-void unmarshal_VkBindSparseInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindSparseInfo* forUnmarshaling);
+void unmarshal_VkBindSparseInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                VkBindSparseInfo* forUnmarshaling);
 
-void marshal_VkSparseImageFormatProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSparseImageFormatProperties* forMarshaling);
+void marshal_VkSparseImageFormatProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkSparseImageFormatProperties* forMarshaling);
 
-void unmarshal_VkSparseImageFormatProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSparseImageFormatProperties* forUnmarshaling);
+void unmarshal_VkSparseImageFormatProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkSparseImageFormatProperties* forUnmarshaling);
 
-void marshal_VkSparseImageMemoryRequirements(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSparseImageMemoryRequirements* forMarshaling);
+void marshal_VkSparseImageMemoryRequirements(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkSparseImageMemoryRequirements* forMarshaling);
 
-void unmarshal_VkSparseImageMemoryRequirements(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSparseImageMemoryRequirements* forUnmarshaling);
+void unmarshal_VkSparseImageMemoryRequirements(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkSparseImageMemoryRequirements* forUnmarshaling);
 
 #define OP_vkGetImageSparseMemoryRequirements 20032
 #define OP_vkGetPhysicalDeviceSparseImageFormatProperties 20033
 #define OP_vkQueueBindSparse 20034
-void marshal_VkFenceCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkFenceCreateInfo* forMarshaling);
+void marshal_VkFenceCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                               const VkFenceCreateInfo* forMarshaling);
 
-void unmarshal_VkFenceCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFenceCreateInfo* forUnmarshaling);
+void unmarshal_VkFenceCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                 VkFenceCreateInfo* forUnmarshaling);
 
 #define OP_vkCreateFence 20035
 #define OP_vkDestroyFence 20036
 #define OP_vkResetFences 20037
 #define OP_vkGetFenceStatus 20038
 #define OP_vkWaitForFences 20039
-void marshal_VkSemaphoreCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSemaphoreCreateInfo* forMarshaling);
+void marshal_VkSemaphoreCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkSemaphoreCreateInfo* forMarshaling);
 
-void unmarshal_VkSemaphoreCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSemaphoreCreateInfo* forUnmarshaling);
+void unmarshal_VkSemaphoreCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkSemaphoreCreateInfo* forUnmarshaling);
 
 #define OP_vkCreateSemaphore 20040
 #define OP_vkDestroySemaphore 20041
-void marshal_VkEventCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkEventCreateInfo* forMarshaling);
+void marshal_VkEventCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                               const VkEventCreateInfo* forMarshaling);
 
-void unmarshal_VkEventCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkEventCreateInfo* forUnmarshaling);
+void unmarshal_VkEventCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                 VkEventCreateInfo* forUnmarshaling);
 
 #define OP_vkCreateEvent 20042
 #define OP_vkDestroyEvent 20043
 #define OP_vkGetEventStatus 20044
 #define OP_vkSetEvent 20045
 #define OP_vkResetEvent 20046
-void marshal_VkQueryPoolCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkQueryPoolCreateInfo* forMarshaling);
+void marshal_VkQueryPoolCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkQueryPoolCreateInfo* forMarshaling);
 
-void unmarshal_VkQueryPoolCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkQueryPoolCreateInfo* forUnmarshaling);
+void unmarshal_VkQueryPoolCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkQueryPoolCreateInfo* forUnmarshaling);
 
 #define OP_vkCreateQueryPool 20047
 #define OP_vkDestroyQueryPool 20048
 #define OP_vkGetQueryPoolResults 20049
-void marshal_VkBufferCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBufferCreateInfo* forMarshaling);
+void marshal_VkBufferCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                const VkBufferCreateInfo* forMarshaling);
 
-void unmarshal_VkBufferCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferCreateInfo* forUnmarshaling);
+void unmarshal_VkBufferCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkBufferCreateInfo* forUnmarshaling);
 
 #define OP_vkCreateBuffer 20050
 #define OP_vkDestroyBuffer 20051
-void marshal_VkBufferViewCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBufferViewCreateInfo* forMarshaling);
+void marshal_VkBufferViewCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                    const VkBufferViewCreateInfo* forMarshaling);
 
-void unmarshal_VkBufferViewCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferViewCreateInfo* forUnmarshaling);
+void unmarshal_VkBufferViewCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                      VkBufferViewCreateInfo* forUnmarshaling);
 
 #define OP_vkCreateBufferView 20052
 #define OP_vkDestroyBufferView 20053
-void marshal_VkImageCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageCreateInfo* forMarshaling);
+void marshal_VkImageCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                               const VkImageCreateInfo* forMarshaling);
 
-void unmarshal_VkImageCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageCreateInfo* forUnmarshaling);
+void unmarshal_VkImageCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                 VkImageCreateInfo* forUnmarshaling);
 
-void marshal_VkSubresourceLayout(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSubresourceLayout* forMarshaling);
+void marshal_VkSubresourceLayout(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkSubresourceLayout* forMarshaling);
 
-void unmarshal_VkSubresourceLayout(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubresourceLayout* forUnmarshaling);
+void unmarshal_VkSubresourceLayout(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkSubresourceLayout* forUnmarshaling);
 
 #define OP_vkCreateImage 20054
 #define OP_vkDestroyImage 20055
 #define OP_vkGetImageSubresourceLayout 20056
-void marshal_VkComponentMapping(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkComponentMapping* forMarshaling);
+void marshal_VkComponentMapping(VulkanStream* vkStream, VkStructureType rootType,
+                                const VkComponentMapping* forMarshaling);
 
-void unmarshal_VkComponentMapping(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkComponentMapping* forUnmarshaling);
+void unmarshal_VkComponentMapping(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkComponentMapping* forUnmarshaling);
 
-void marshal_VkImageViewCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageViewCreateInfo* forMarshaling);
+void marshal_VkImageViewCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkImageViewCreateInfo* forMarshaling);
 
-void unmarshal_VkImageViewCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageViewCreateInfo* forUnmarshaling);
+void unmarshal_VkImageViewCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkImageViewCreateInfo* forUnmarshaling);
 
 #define OP_vkCreateImageView 20057
 #define OP_vkDestroyImageView 20058
-void marshal_VkShaderModuleCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkShaderModuleCreateInfo* forMarshaling);
+void marshal_VkShaderModuleCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkShaderModuleCreateInfo* forMarshaling);
 
-void unmarshal_VkShaderModuleCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkShaderModuleCreateInfo* forUnmarshaling);
+void unmarshal_VkShaderModuleCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkShaderModuleCreateInfo* forUnmarshaling);
 
 #define OP_vkCreateShaderModule 20059
 #define OP_vkDestroyShaderModule 20060
-void marshal_VkPipelineCacheCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineCacheCreateInfo* forMarshaling);
+void marshal_VkPipelineCacheCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkPipelineCacheCreateInfo* forMarshaling);
 
-void unmarshal_VkPipelineCacheCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineCacheCreateInfo* forUnmarshaling);
+void unmarshal_VkPipelineCacheCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkPipelineCacheCreateInfo* forUnmarshaling);
 
 #define OP_vkCreatePipelineCache 20061
 #define OP_vkDestroyPipelineCache 20062
 #define OP_vkGetPipelineCacheData 20063
 #define OP_vkMergePipelineCaches 20064
-void marshal_VkSpecializationMapEntry(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSpecializationMapEntry* forMarshaling);
+void marshal_VkSpecializationMapEntry(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkSpecializationMapEntry* forMarshaling);
 
-void unmarshal_VkSpecializationMapEntry(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSpecializationMapEntry* forUnmarshaling);
+void unmarshal_VkSpecializationMapEntry(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkSpecializationMapEntry* forUnmarshaling);
 
-void marshal_VkSpecializationInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSpecializationInfo* forMarshaling);
+void marshal_VkSpecializationInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkSpecializationInfo* forMarshaling);
 
-void unmarshal_VkSpecializationInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSpecializationInfo* forUnmarshaling);
+void unmarshal_VkSpecializationInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkSpecializationInfo* forUnmarshaling);
 
-void marshal_VkPipelineShaderStageCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineShaderStageCreateInfo* forMarshaling);
+void marshal_VkPipelineShaderStageCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkPipelineShaderStageCreateInfo* forMarshaling);
 
-void unmarshal_VkPipelineShaderStageCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineShaderStageCreateInfo* forUnmarshaling);
+void unmarshal_VkPipelineShaderStageCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkPipelineShaderStageCreateInfo* forUnmarshaling);
 
-void marshal_VkComputePipelineCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkComputePipelineCreateInfo* forMarshaling);
+void marshal_VkComputePipelineCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkComputePipelineCreateInfo* forMarshaling);
 
-void unmarshal_VkComputePipelineCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkComputePipelineCreateInfo* forUnmarshaling);
+void unmarshal_VkComputePipelineCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkComputePipelineCreateInfo* forUnmarshaling);
 
-void marshal_VkVertexInputBindingDescription(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVertexInputBindingDescription* forMarshaling);
+void marshal_VkVertexInputBindingDescription(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkVertexInputBindingDescription* forMarshaling);
 
-void unmarshal_VkVertexInputBindingDescription(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVertexInputBindingDescription* forUnmarshaling);
+void unmarshal_VkVertexInputBindingDescription(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkVertexInputBindingDescription* forUnmarshaling);
 
 void marshal_VkVertexInputAttributeDescription(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkVertexInputAttributeDescription* forMarshaling);
 
 void unmarshal_VkVertexInputAttributeDescription(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkVertexInputAttributeDescription* forUnmarshaling);
 
 void marshal_VkPipelineVertexInputStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineVertexInputStateCreateInfo* forMarshaling);
 
 void unmarshal_VkPipelineVertexInputStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineVertexInputStateCreateInfo* forUnmarshaling);
 
 void marshal_VkPipelineInputAssemblyStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineInputAssemblyStateCreateInfo* forMarshaling);
 
 void unmarshal_VkPipelineInputAssemblyStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineInputAssemblyStateCreateInfo* forUnmarshaling);
 
 void marshal_VkPipelineTessellationStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineTessellationStateCreateInfo* forMarshaling);
 
 void unmarshal_VkPipelineTessellationStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineTessellationStateCreateInfo* forUnmarshaling);
 
-void marshal_VkViewport(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkViewport* forMarshaling);
+void marshal_VkViewport(VulkanStream* vkStream, VkStructureType rootType,
+                        const VkViewport* forMarshaling);
 
-void unmarshal_VkViewport(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkViewport* forUnmarshaling);
+void unmarshal_VkViewport(VulkanStream* vkStream, VkStructureType rootType,
+                          VkViewport* forUnmarshaling);
 
 void marshal_VkPipelineViewportStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineViewportStateCreateInfo* forMarshaling);
 
 void unmarshal_VkPipelineViewportStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineViewportStateCreateInfo* forUnmarshaling);
 
 void marshal_VkPipelineRasterizationStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineRasterizationStateCreateInfo* forMarshaling);
 
 void unmarshal_VkPipelineRasterizationStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineRasterizationStateCreateInfo* forUnmarshaling);
 
 void marshal_VkPipelineMultisampleStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineMultisampleStateCreateInfo* forMarshaling);
 
 void unmarshal_VkPipelineMultisampleStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineMultisampleStateCreateInfo* forUnmarshaling);
 
-void marshal_VkStencilOpState(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkStencilOpState* forMarshaling);
+void marshal_VkStencilOpState(VulkanStream* vkStream, VkStructureType rootType,
+                              const VkStencilOpState* forMarshaling);
 
-void unmarshal_VkStencilOpState(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkStencilOpState* forUnmarshaling);
+void unmarshal_VkStencilOpState(VulkanStream* vkStream, VkStructureType rootType,
+                                VkStencilOpState* forUnmarshaling);
 
 void marshal_VkPipelineDepthStencilStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineDepthStencilStateCreateInfo* forMarshaling);
 
 void unmarshal_VkPipelineDepthStencilStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineDepthStencilStateCreateInfo* forUnmarshaling);
 
 void marshal_VkPipelineColorBlendAttachmentState(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineColorBlendAttachmentState* forMarshaling);
 
 void unmarshal_VkPipelineColorBlendAttachmentState(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineColorBlendAttachmentState* forUnmarshaling);
 
 void marshal_VkPipelineColorBlendStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineColorBlendStateCreateInfo* forMarshaling);
 
 void unmarshal_VkPipelineColorBlendStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineColorBlendStateCreateInfo* forUnmarshaling);
 
 void marshal_VkPipelineDynamicStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineDynamicStateCreateInfo* forMarshaling);
 
-void unmarshal_VkPipelineDynamicStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineDynamicStateCreateInfo* forUnmarshaling);
+void unmarshal_VkPipelineDynamicStateCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkPipelineDynamicStateCreateInfo* forUnmarshaling);
 
-void marshal_VkGraphicsPipelineCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkGraphicsPipelineCreateInfo* forMarshaling);
+void marshal_VkGraphicsPipelineCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                          const VkGraphicsPipelineCreateInfo* forMarshaling);
 
-void unmarshal_VkGraphicsPipelineCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkGraphicsPipelineCreateInfo* forUnmarshaling);
+void unmarshal_VkGraphicsPipelineCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkGraphicsPipelineCreateInfo* forUnmarshaling);
 
 #define OP_vkCreateGraphicsPipelines 20065
 #define OP_vkCreateComputePipelines 20066
 #define OP_vkDestroyPipeline 20067
-void marshal_VkPushConstantRange(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPushConstantRange* forMarshaling);
+void marshal_VkPushConstantRange(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkPushConstantRange* forMarshaling);
 
-void unmarshal_VkPushConstantRange(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPushConstantRange* forUnmarshaling);
+void unmarshal_VkPushConstantRange(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkPushConstantRange* forUnmarshaling);
 
-void marshal_VkPipelineLayoutCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineLayoutCreateInfo* forMarshaling);
+void marshal_VkPipelineLayoutCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                        const VkPipelineLayoutCreateInfo* forMarshaling);
 
-void unmarshal_VkPipelineLayoutCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineLayoutCreateInfo* forUnmarshaling);
+void unmarshal_VkPipelineLayoutCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkPipelineLayoutCreateInfo* forUnmarshaling);
 
 #define OP_vkCreatePipelineLayout 20068
 #define OP_vkDestroyPipelineLayout 20069
-void marshal_VkSamplerCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSamplerCreateInfo* forMarshaling);
+void marshal_VkSamplerCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkSamplerCreateInfo* forMarshaling);
 
-void unmarshal_VkSamplerCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSamplerCreateInfo* forUnmarshaling);
+void unmarshal_VkSamplerCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkSamplerCreateInfo* forUnmarshaling);
 
 #define OP_vkCreateSampler 20070
 #define OP_vkDestroySampler 20071
-void marshal_VkCopyDescriptorSet(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCopyDescriptorSet* forMarshaling);
+void marshal_VkCopyDescriptorSet(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkCopyDescriptorSet* forMarshaling);
 
-void unmarshal_VkCopyDescriptorSet(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCopyDescriptorSet* forUnmarshaling);
+void unmarshal_VkCopyDescriptorSet(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkCopyDescriptorSet* forUnmarshaling);
 
-void marshal_VkDescriptorBufferInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDescriptorBufferInfo* forMarshaling);
+void marshal_VkDescriptorBufferInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                    const VkDescriptorBufferInfo* forMarshaling);
 
-void unmarshal_VkDescriptorBufferInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorBufferInfo* forUnmarshaling);
+void unmarshal_VkDescriptorBufferInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                      VkDescriptorBufferInfo* forUnmarshaling);
 
-void marshal_VkDescriptorImageInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDescriptorImageInfo* forMarshaling);
+void marshal_VkDescriptorImageInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkDescriptorImageInfo* forMarshaling);
 
-void unmarshal_VkDescriptorImageInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorImageInfo* forUnmarshaling);
+void unmarshal_VkDescriptorImageInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkDescriptorImageInfo* forUnmarshaling);
 
-void marshal_VkDescriptorPoolSize(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDescriptorPoolSize* forMarshaling);
+void marshal_VkDescriptorPoolSize(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkDescriptorPoolSize* forMarshaling);
 
-void unmarshal_VkDescriptorPoolSize(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorPoolSize* forUnmarshaling);
+void unmarshal_VkDescriptorPoolSize(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkDescriptorPoolSize* forUnmarshaling);
 
-void marshal_VkDescriptorPoolCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDescriptorPoolCreateInfo* forMarshaling);
+void marshal_VkDescriptorPoolCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                        const VkDescriptorPoolCreateInfo* forMarshaling);
 
-void unmarshal_VkDescriptorPoolCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorPoolCreateInfo* forUnmarshaling);
+void unmarshal_VkDescriptorPoolCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkDescriptorPoolCreateInfo* forUnmarshaling);
 
-void marshal_VkDescriptorSetAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDescriptorSetAllocateInfo* forMarshaling);
+void marshal_VkDescriptorSetAllocateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkDescriptorSetAllocateInfo* forMarshaling);
 
-void unmarshal_VkDescriptorSetAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorSetAllocateInfo* forUnmarshaling);
+void unmarshal_VkDescriptorSetAllocateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkDescriptorSetAllocateInfo* forUnmarshaling);
 
-void marshal_VkDescriptorSetLayoutBinding(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDescriptorSetLayoutBinding* forMarshaling);
+void marshal_VkDescriptorSetLayoutBinding(VulkanStream* vkStream, VkStructureType rootType,
+                                          const VkDescriptorSetLayoutBinding* forMarshaling);
 
-void unmarshal_VkDescriptorSetLayoutBinding(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorSetLayoutBinding* forUnmarshaling);
+void unmarshal_VkDescriptorSetLayoutBinding(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkDescriptorSetLayoutBinding* forUnmarshaling);
 
-void marshal_VkDescriptorSetLayoutCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDescriptorSetLayoutCreateInfo* forMarshaling);
+void marshal_VkDescriptorSetLayoutCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkDescriptorSetLayoutCreateInfo* forMarshaling);
 
-void unmarshal_VkDescriptorSetLayoutCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorSetLayoutCreateInfo* forUnmarshaling);
+void unmarshal_VkDescriptorSetLayoutCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkDescriptorSetLayoutCreateInfo* forUnmarshaling);
 
-void marshal_VkWriteDescriptorSet(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkWriteDescriptorSet* forMarshaling);
+void marshal_VkWriteDescriptorSet(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkWriteDescriptorSet* forMarshaling);
 
-void unmarshal_VkWriteDescriptorSet(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkWriteDescriptorSet* forUnmarshaling);
+void unmarshal_VkWriteDescriptorSet(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkWriteDescriptorSet* forUnmarshaling);
 
 #define OP_vkCreateDescriptorSetLayout 20072
 #define OP_vkDestroyDescriptorSetLayout 20073
@@ -993,238 +671,150 @@
 #define OP_vkAllocateDescriptorSets 20077
 #define OP_vkFreeDescriptorSets 20078
 #define OP_vkUpdateDescriptorSets 20079
-void marshal_VkAttachmentDescription(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAttachmentDescription* forMarshaling);
+void marshal_VkAttachmentDescription(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkAttachmentDescription* forMarshaling);
 
-void unmarshal_VkAttachmentDescription(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAttachmentDescription* forUnmarshaling);
+void unmarshal_VkAttachmentDescription(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkAttachmentDescription* forUnmarshaling);
 
-void marshal_VkAttachmentReference(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAttachmentReference* forMarshaling);
+void marshal_VkAttachmentReference(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkAttachmentReference* forMarshaling);
 
-void unmarshal_VkAttachmentReference(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAttachmentReference* forUnmarshaling);
+void unmarshal_VkAttachmentReference(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkAttachmentReference* forUnmarshaling);
 
-void marshal_VkFramebufferCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkFramebufferCreateInfo* forMarshaling);
+void marshal_VkFramebufferCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkFramebufferCreateInfo* forMarshaling);
 
-void unmarshal_VkFramebufferCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFramebufferCreateInfo* forUnmarshaling);
+void unmarshal_VkFramebufferCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkFramebufferCreateInfo* forUnmarshaling);
 
-void marshal_VkSubpassDescription(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSubpassDescription* forMarshaling);
+void marshal_VkSubpassDescription(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkSubpassDescription* forMarshaling);
 
-void unmarshal_VkSubpassDescription(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubpassDescription* forUnmarshaling);
+void unmarshal_VkSubpassDescription(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkSubpassDescription* forUnmarshaling);
 
-void marshal_VkSubpassDependency(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSubpassDependency* forMarshaling);
+void marshal_VkSubpassDependency(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkSubpassDependency* forMarshaling);
 
-void unmarshal_VkSubpassDependency(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubpassDependency* forUnmarshaling);
+void unmarshal_VkSubpassDependency(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkSubpassDependency* forUnmarshaling);
 
-void marshal_VkRenderPassCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkRenderPassCreateInfo* forMarshaling);
+void marshal_VkRenderPassCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                    const VkRenderPassCreateInfo* forMarshaling);
 
-void unmarshal_VkRenderPassCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderPassCreateInfo* forUnmarshaling);
+void unmarshal_VkRenderPassCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                      VkRenderPassCreateInfo* forUnmarshaling);
 
 #define OP_vkCreateFramebuffer 20080
 #define OP_vkDestroyFramebuffer 20081
 #define OP_vkCreateRenderPass 20082
 #define OP_vkDestroyRenderPass 20083
 #define OP_vkGetRenderAreaGranularity 20084
-void marshal_VkCommandPoolCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCommandPoolCreateInfo* forMarshaling);
+void marshal_VkCommandPoolCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkCommandPoolCreateInfo* forMarshaling);
 
-void unmarshal_VkCommandPoolCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCommandPoolCreateInfo* forUnmarshaling);
+void unmarshal_VkCommandPoolCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkCommandPoolCreateInfo* forUnmarshaling);
 
 #define OP_vkCreateCommandPool 20085
 #define OP_vkDestroyCommandPool 20086
 #define OP_vkResetCommandPool 20087
-void marshal_VkCommandBufferAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCommandBufferAllocateInfo* forMarshaling);
+void marshal_VkCommandBufferAllocateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkCommandBufferAllocateInfo* forMarshaling);
 
-void unmarshal_VkCommandBufferAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCommandBufferAllocateInfo* forUnmarshaling);
+void unmarshal_VkCommandBufferAllocateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkCommandBufferAllocateInfo* forUnmarshaling);
 
-void marshal_VkCommandBufferInheritanceInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCommandBufferInheritanceInfo* forMarshaling);
+void marshal_VkCommandBufferInheritanceInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                            const VkCommandBufferInheritanceInfo* forMarshaling);
 
-void unmarshal_VkCommandBufferInheritanceInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCommandBufferInheritanceInfo* forUnmarshaling);
+void unmarshal_VkCommandBufferInheritanceInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkCommandBufferInheritanceInfo* forUnmarshaling);
 
-void marshal_VkCommandBufferBeginInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCommandBufferBeginInfo* forMarshaling);
+void marshal_VkCommandBufferBeginInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkCommandBufferBeginInfo* forMarshaling);
 
-void unmarshal_VkCommandBufferBeginInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCommandBufferBeginInfo* forUnmarshaling);
+void unmarshal_VkCommandBufferBeginInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkCommandBufferBeginInfo* forUnmarshaling);
 
 #define OP_vkAllocateCommandBuffers 20088
 #define OP_vkFreeCommandBuffers 20089
 #define OP_vkBeginCommandBuffer 20090
 #define OP_vkEndCommandBuffer 20091
 #define OP_vkResetCommandBuffer 20092
-void marshal_VkBufferCopy(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBufferCopy* forMarshaling);
+void marshal_VkBufferCopy(VulkanStream* vkStream, VkStructureType rootType,
+                          const VkBufferCopy* forMarshaling);
 
-void unmarshal_VkBufferCopy(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferCopy* forUnmarshaling);
+void unmarshal_VkBufferCopy(VulkanStream* vkStream, VkStructureType rootType,
+                            VkBufferCopy* forUnmarshaling);
 
-void marshal_VkImageSubresourceLayers(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageSubresourceLayers* forMarshaling);
+void marshal_VkImageSubresourceLayers(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkImageSubresourceLayers* forMarshaling);
 
-void unmarshal_VkImageSubresourceLayers(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageSubresourceLayers* forUnmarshaling);
+void unmarshal_VkImageSubresourceLayers(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkImageSubresourceLayers* forUnmarshaling);
 
-void marshal_VkBufferImageCopy(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBufferImageCopy* forMarshaling);
+void marshal_VkBufferImageCopy(VulkanStream* vkStream, VkStructureType rootType,
+                               const VkBufferImageCopy* forMarshaling);
 
-void unmarshal_VkBufferImageCopy(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferImageCopy* forUnmarshaling);
+void unmarshal_VkBufferImageCopy(VulkanStream* vkStream, VkStructureType rootType,
+                                 VkBufferImageCopy* forUnmarshaling);
 
-void marshal_VkClearColorValue(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkClearColorValue* forMarshaling);
+void marshal_VkClearColorValue(VulkanStream* vkStream, VkStructureType rootType,
+                               const VkClearColorValue* forMarshaling);
 
-void unmarshal_VkClearColorValue(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkClearColorValue* forUnmarshaling);
+void unmarshal_VkClearColorValue(VulkanStream* vkStream, VkStructureType rootType,
+                                 VkClearColorValue* forUnmarshaling);
 
-void marshal_VkClearDepthStencilValue(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkClearDepthStencilValue* forMarshaling);
+void marshal_VkClearDepthStencilValue(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkClearDepthStencilValue* forMarshaling);
 
-void unmarshal_VkClearDepthStencilValue(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkClearDepthStencilValue* forUnmarshaling);
+void unmarshal_VkClearDepthStencilValue(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkClearDepthStencilValue* forUnmarshaling);
 
-void marshal_VkClearValue(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkClearValue* forMarshaling);
+void marshal_VkClearValue(VulkanStream* vkStream, VkStructureType rootType,
+                          const VkClearValue* forMarshaling);
 
-void unmarshal_VkClearValue(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkClearValue* forUnmarshaling);
+void unmarshal_VkClearValue(VulkanStream* vkStream, VkStructureType rootType,
+                            VkClearValue* forUnmarshaling);
 
-void marshal_VkClearAttachment(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkClearAttachment* forMarshaling);
+void marshal_VkClearAttachment(VulkanStream* vkStream, VkStructureType rootType,
+                               const VkClearAttachment* forMarshaling);
 
-void unmarshal_VkClearAttachment(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkClearAttachment* forUnmarshaling);
+void unmarshal_VkClearAttachment(VulkanStream* vkStream, VkStructureType rootType,
+                                 VkClearAttachment* forUnmarshaling);
 
-void marshal_VkClearRect(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkClearRect* forMarshaling);
+void marshal_VkClearRect(VulkanStream* vkStream, VkStructureType rootType,
+                         const VkClearRect* forMarshaling);
 
-void unmarshal_VkClearRect(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkClearRect* forUnmarshaling);
+void unmarshal_VkClearRect(VulkanStream* vkStream, VkStructureType rootType,
+                           VkClearRect* forUnmarshaling);
 
-void marshal_VkImageBlit(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageBlit* forMarshaling);
+void marshal_VkImageBlit(VulkanStream* vkStream, VkStructureType rootType,
+                         const VkImageBlit* forMarshaling);
 
-void unmarshal_VkImageBlit(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageBlit* forUnmarshaling);
+void unmarshal_VkImageBlit(VulkanStream* vkStream, VkStructureType rootType,
+                           VkImageBlit* forUnmarshaling);
 
-void marshal_VkImageCopy(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageCopy* forMarshaling);
+void marshal_VkImageCopy(VulkanStream* vkStream, VkStructureType rootType,
+                         const VkImageCopy* forMarshaling);
 
-void unmarshal_VkImageCopy(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageCopy* forUnmarshaling);
+void unmarshal_VkImageCopy(VulkanStream* vkStream, VkStructureType rootType,
+                           VkImageCopy* forUnmarshaling);
 
-void marshal_VkImageResolve(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageResolve* forMarshaling);
+void marshal_VkImageResolve(VulkanStream* vkStream, VkStructureType rootType,
+                            const VkImageResolve* forMarshaling);
 
-void unmarshal_VkImageResolve(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageResolve* forUnmarshaling);
+void unmarshal_VkImageResolve(VulkanStream* vkStream, VkStructureType rootType,
+                              VkImageResolve* forUnmarshaling);
 
-void marshal_VkRenderPassBeginInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkRenderPassBeginInfo* forMarshaling);
+void marshal_VkRenderPassBeginInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkRenderPassBeginInfo* forMarshaling);
 
-void unmarshal_VkRenderPassBeginInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderPassBeginInfo* forUnmarshaling);
+void unmarshal_VkRenderPassBeginInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkRenderPassBeginInfo* forUnmarshaling);
 
 #define OP_vkCmdBindPipeline 20093
 #define OP_vkCmdSetViewport 20094
@@ -1274,302 +864,204 @@
 #ifdef VK_VERSION_1_1
 #define OP_vkEnumerateInstanceVersion 20137
 void marshal_VkPhysicalDeviceSubgroupProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceSubgroupProperties* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceSubgroupProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceSubgroupProperties* forUnmarshaling);
 
-void marshal_VkBindBufferMemoryInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBindBufferMemoryInfo* forMarshaling);
+void marshal_VkBindBufferMemoryInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                    const VkBindBufferMemoryInfo* forMarshaling);
 
-void unmarshal_VkBindBufferMemoryInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindBufferMemoryInfo* forUnmarshaling);
+void unmarshal_VkBindBufferMemoryInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                      VkBindBufferMemoryInfo* forUnmarshaling);
 
-void marshal_VkBindImageMemoryInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBindImageMemoryInfo* forMarshaling);
+void marshal_VkBindImageMemoryInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkBindImageMemoryInfo* forMarshaling);
 
-void unmarshal_VkBindImageMemoryInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindImageMemoryInfo* forUnmarshaling);
+void unmarshal_VkBindImageMemoryInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkBindImageMemoryInfo* forUnmarshaling);
 
 #define OP_vkBindBufferMemory2 20138
 #define OP_vkBindImageMemory2 20139
 void marshal_VkPhysicalDevice16BitStorageFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDevice16BitStorageFeatures* forMarshaling);
 
 void unmarshal_VkPhysicalDevice16BitStorageFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDevice16BitStorageFeatures* forUnmarshaling);
 
-void marshal_VkMemoryDedicatedRequirements(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMemoryDedicatedRequirements* forMarshaling);
+void marshal_VkMemoryDedicatedRequirements(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkMemoryDedicatedRequirements* forMarshaling);
 
-void unmarshal_VkMemoryDedicatedRequirements(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryDedicatedRequirements* forUnmarshaling);
+void unmarshal_VkMemoryDedicatedRequirements(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkMemoryDedicatedRequirements* forUnmarshaling);
 
-void marshal_VkMemoryDedicatedAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMemoryDedicatedAllocateInfo* forMarshaling);
+void marshal_VkMemoryDedicatedAllocateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkMemoryDedicatedAllocateInfo* forMarshaling);
 
-void unmarshal_VkMemoryDedicatedAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryDedicatedAllocateInfo* forUnmarshaling);
+void unmarshal_VkMemoryDedicatedAllocateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkMemoryDedicatedAllocateInfo* forUnmarshaling);
 
-void marshal_VkMemoryAllocateFlagsInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMemoryAllocateFlagsInfo* forMarshaling);
+void marshal_VkMemoryAllocateFlagsInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkMemoryAllocateFlagsInfo* forMarshaling);
 
-void unmarshal_VkMemoryAllocateFlagsInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryAllocateFlagsInfo* forUnmarshaling);
+void unmarshal_VkMemoryAllocateFlagsInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkMemoryAllocateFlagsInfo* forUnmarshaling);
 
 void marshal_VkDeviceGroupRenderPassBeginInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkDeviceGroupRenderPassBeginInfo* forMarshaling);
 
-void unmarshal_VkDeviceGroupRenderPassBeginInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceGroupRenderPassBeginInfo* forUnmarshaling);
+void unmarshal_VkDeviceGroupRenderPassBeginInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkDeviceGroupRenderPassBeginInfo* forUnmarshaling);
 
 void marshal_VkDeviceGroupCommandBufferBeginInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkDeviceGroupCommandBufferBeginInfo* forMarshaling);
 
 void unmarshal_VkDeviceGroupCommandBufferBeginInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkDeviceGroupCommandBufferBeginInfo* forUnmarshaling);
 
-void marshal_VkDeviceGroupSubmitInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDeviceGroupSubmitInfo* forMarshaling);
+void marshal_VkDeviceGroupSubmitInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkDeviceGroupSubmitInfo* forMarshaling);
 
-void unmarshal_VkDeviceGroupSubmitInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceGroupSubmitInfo* forUnmarshaling);
+void unmarshal_VkDeviceGroupSubmitInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkDeviceGroupSubmitInfo* forUnmarshaling);
 
-void marshal_VkDeviceGroupBindSparseInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDeviceGroupBindSparseInfo* forMarshaling);
+void marshal_VkDeviceGroupBindSparseInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkDeviceGroupBindSparseInfo* forMarshaling);
 
-void unmarshal_VkDeviceGroupBindSparseInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceGroupBindSparseInfo* forUnmarshaling);
+void unmarshal_VkDeviceGroupBindSparseInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkDeviceGroupBindSparseInfo* forUnmarshaling);
 
 #define OP_vkGetDeviceGroupPeerMemoryFeatures 20140
 #define OP_vkCmdSetDeviceMask 20141
 #define OP_vkCmdDispatchBase 20142
 void marshal_VkBindBufferMemoryDeviceGroupInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkBindBufferMemoryDeviceGroupInfo* forMarshaling);
 
 void unmarshal_VkBindBufferMemoryDeviceGroupInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkBindBufferMemoryDeviceGroupInfo* forUnmarshaling);
 
 void marshal_VkBindImageMemoryDeviceGroupInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkBindImageMemoryDeviceGroupInfo* forMarshaling);
 
-void unmarshal_VkBindImageMemoryDeviceGroupInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindImageMemoryDeviceGroupInfo* forUnmarshaling);
+void unmarshal_VkBindImageMemoryDeviceGroupInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkBindImageMemoryDeviceGroupInfo* forUnmarshaling);
 
-void marshal_VkPhysicalDeviceGroupProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceGroupProperties* forMarshaling);
+void marshal_VkPhysicalDeviceGroupProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkPhysicalDeviceGroupProperties* forMarshaling);
 
-void unmarshal_VkPhysicalDeviceGroupProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceGroupProperties* forUnmarshaling);
+void unmarshal_VkPhysicalDeviceGroupProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkPhysicalDeviceGroupProperties* forUnmarshaling);
 
-void marshal_VkDeviceGroupDeviceCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDeviceGroupDeviceCreateInfo* forMarshaling);
+void marshal_VkDeviceGroupDeviceCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkDeviceGroupDeviceCreateInfo* forMarshaling);
 
-void unmarshal_VkDeviceGroupDeviceCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceGroupDeviceCreateInfo* forUnmarshaling);
+void unmarshal_VkDeviceGroupDeviceCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkDeviceGroupDeviceCreateInfo* forUnmarshaling);
 
 #define OP_vkEnumeratePhysicalDeviceGroups 20143
-void marshal_VkBufferMemoryRequirementsInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBufferMemoryRequirementsInfo2* forMarshaling);
+void marshal_VkBufferMemoryRequirementsInfo2(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkBufferMemoryRequirementsInfo2* forMarshaling);
 
-void unmarshal_VkBufferMemoryRequirementsInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferMemoryRequirementsInfo2* forUnmarshaling);
+void unmarshal_VkBufferMemoryRequirementsInfo2(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkBufferMemoryRequirementsInfo2* forUnmarshaling);
 
-void marshal_VkImageMemoryRequirementsInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageMemoryRequirementsInfo2* forMarshaling);
+void marshal_VkImageMemoryRequirementsInfo2(VulkanStream* vkStream, VkStructureType rootType,
+                                            const VkImageMemoryRequirementsInfo2* forMarshaling);
 
-void unmarshal_VkImageMemoryRequirementsInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageMemoryRequirementsInfo2* forUnmarshaling);
+void unmarshal_VkImageMemoryRequirementsInfo2(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkImageMemoryRequirementsInfo2* forUnmarshaling);
 
 void marshal_VkImageSparseMemoryRequirementsInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkImageSparseMemoryRequirementsInfo2* forMarshaling);
 
 void unmarshal_VkImageSparseMemoryRequirementsInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkImageSparseMemoryRequirementsInfo2* forUnmarshaling);
 
-void marshal_VkMemoryRequirements2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMemoryRequirements2* forMarshaling);
+void marshal_VkMemoryRequirements2(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkMemoryRequirements2* forMarshaling);
 
-void unmarshal_VkMemoryRequirements2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryRequirements2* forUnmarshaling);
+void unmarshal_VkMemoryRequirements2(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkMemoryRequirements2* forUnmarshaling);
 
 void marshal_VkSparseImageMemoryRequirements2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkSparseImageMemoryRequirements2* forMarshaling);
 
-void unmarshal_VkSparseImageMemoryRequirements2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSparseImageMemoryRequirements2* forUnmarshaling);
+void unmarshal_VkSparseImageMemoryRequirements2(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkSparseImageMemoryRequirements2* forUnmarshaling);
 
 #define OP_vkGetImageMemoryRequirements2 20144
 #define OP_vkGetBufferMemoryRequirements2 20145
 #define OP_vkGetImageSparseMemoryRequirements2 20146
-void marshal_VkPhysicalDeviceFeatures2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceFeatures2* forMarshaling);
+void marshal_VkPhysicalDeviceFeatures2(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkPhysicalDeviceFeatures2* forMarshaling);
 
-void unmarshal_VkPhysicalDeviceFeatures2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFeatures2* forUnmarshaling);
+void unmarshal_VkPhysicalDeviceFeatures2(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkPhysicalDeviceFeatures2* forUnmarshaling);
 
-void marshal_VkPhysicalDeviceProperties2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceProperties2* forMarshaling);
+void marshal_VkPhysicalDeviceProperties2(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkPhysicalDeviceProperties2* forMarshaling);
 
-void unmarshal_VkPhysicalDeviceProperties2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceProperties2* forUnmarshaling);
+void unmarshal_VkPhysicalDeviceProperties2(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkPhysicalDeviceProperties2* forUnmarshaling);
 
-void marshal_VkFormatProperties2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkFormatProperties2* forMarshaling);
+void marshal_VkFormatProperties2(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkFormatProperties2* forMarshaling);
 
-void unmarshal_VkFormatProperties2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFormatProperties2* forUnmarshaling);
+void unmarshal_VkFormatProperties2(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkFormatProperties2* forUnmarshaling);
 
-void marshal_VkImageFormatProperties2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageFormatProperties2* forMarshaling);
+void marshal_VkImageFormatProperties2(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkImageFormatProperties2* forMarshaling);
 
-void unmarshal_VkImageFormatProperties2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageFormatProperties2* forUnmarshaling);
+void unmarshal_VkImageFormatProperties2(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkImageFormatProperties2* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceImageFormatInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceImageFormatInfo2* forMarshaling);
 
-void unmarshal_VkPhysicalDeviceImageFormatInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceImageFormatInfo2* forUnmarshaling);
+void unmarshal_VkPhysicalDeviceImageFormatInfo2(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkPhysicalDeviceImageFormatInfo2* forUnmarshaling);
 
-void marshal_VkQueueFamilyProperties2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkQueueFamilyProperties2* forMarshaling);
+void marshal_VkQueueFamilyProperties2(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkQueueFamilyProperties2* forMarshaling);
 
-void unmarshal_VkQueueFamilyProperties2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkQueueFamilyProperties2* forUnmarshaling);
+void unmarshal_VkQueueFamilyProperties2(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkQueueFamilyProperties2* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceMemoryProperties2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceMemoryProperties2* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceMemoryProperties2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceMemoryProperties2* forUnmarshaling);
 
-void marshal_VkSparseImageFormatProperties2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSparseImageFormatProperties2* forMarshaling);
+void marshal_VkSparseImageFormatProperties2(VulkanStream* vkStream, VkStructureType rootType,
+                                            const VkSparseImageFormatProperties2* forMarshaling);
 
-void unmarshal_VkSparseImageFormatProperties2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSparseImageFormatProperties2* forUnmarshaling);
+void unmarshal_VkSparseImageFormatProperties2(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkSparseImageFormatProperties2* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceSparseImageFormatInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceSparseImageFormatInfo2* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceSparseImageFormatInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceSparseImageFormatInfo2* forUnmarshaling);
 
 #define OP_vkGetPhysicalDeviceFeatures2 20147
@@ -1581,933 +1073,682 @@
 #define OP_vkGetPhysicalDeviceSparseImageFormatProperties2 20153
 #define OP_vkTrimCommandPool 20154
 void marshal_VkPhysicalDevicePointClippingProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDevicePointClippingProperties* forMarshaling);
 
 void unmarshal_VkPhysicalDevicePointClippingProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDevicePointClippingProperties* forUnmarshaling);
 
 void marshal_VkInputAttachmentAspectReference(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkInputAttachmentAspectReference* forMarshaling);
 
-void unmarshal_VkInputAttachmentAspectReference(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkInputAttachmentAspectReference* forUnmarshaling);
+void unmarshal_VkInputAttachmentAspectReference(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkInputAttachmentAspectReference* forUnmarshaling);
 
 void marshal_VkRenderPassInputAttachmentAspectCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkRenderPassInputAttachmentAspectCreateInfo* forMarshaling);
 
 void unmarshal_VkRenderPassInputAttachmentAspectCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkRenderPassInputAttachmentAspectCreateInfo* forUnmarshaling);
 
-void marshal_VkImageViewUsageCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageViewUsageCreateInfo* forMarshaling);
+void marshal_VkImageViewUsageCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                        const VkImageViewUsageCreateInfo* forMarshaling);
 
-void unmarshal_VkImageViewUsageCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageViewUsageCreateInfo* forUnmarshaling);
+void unmarshal_VkImageViewUsageCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkImageViewUsageCreateInfo* forUnmarshaling);
 
 void marshal_VkPipelineTessellationDomainOriginStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineTessellationDomainOriginStateCreateInfo* forMarshaling);
 
 void unmarshal_VkPipelineTessellationDomainOriginStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineTessellationDomainOriginStateCreateInfo* forUnmarshaling);
 
-void marshal_VkRenderPassMultiviewCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkRenderPassMultiviewCreateInfo* forMarshaling);
+void marshal_VkRenderPassMultiviewCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkRenderPassMultiviewCreateInfo* forMarshaling);
 
-void unmarshal_VkRenderPassMultiviewCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderPassMultiviewCreateInfo* forUnmarshaling);
+void unmarshal_VkRenderPassMultiviewCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkRenderPassMultiviewCreateInfo* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceMultiviewFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceMultiviewFeatures* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceMultiviewFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceMultiviewFeatures* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceMultiviewProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceMultiviewProperties* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceMultiviewProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceMultiviewProperties* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceVariablePointersFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceVariablePointersFeatures* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceVariablePointersFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceVariablePointersFeatures* forUnmarshaling);
 
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceVariablePointersFeatures, marshal_VkPhysicalDeviceVariablePointerFeatures)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceVariablePointersFeatures,
+                      marshal_VkPhysicalDeviceVariablePointerFeatures)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceVariablePointersFeatures, unmarshal_VkPhysicalDeviceVariablePointerFeatures)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceVariablePointersFeatures,
+                      unmarshal_VkPhysicalDeviceVariablePointerFeatures)
 
 void marshal_VkPhysicalDeviceProtectedMemoryFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceProtectedMemoryFeatures* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceProtectedMemoryFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceProtectedMemoryFeatures* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceProtectedMemoryProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceProtectedMemoryProperties* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceProtectedMemoryProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceProtectedMemoryProperties* forUnmarshaling);
 
-void marshal_VkDeviceQueueInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDeviceQueueInfo2* forMarshaling);
+void marshal_VkDeviceQueueInfo2(VulkanStream* vkStream, VkStructureType rootType,
+                                const VkDeviceQueueInfo2* forMarshaling);
 
-void unmarshal_VkDeviceQueueInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceQueueInfo2* forUnmarshaling);
+void unmarshal_VkDeviceQueueInfo2(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkDeviceQueueInfo2* forUnmarshaling);
 
-void marshal_VkProtectedSubmitInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkProtectedSubmitInfo* forMarshaling);
+void marshal_VkProtectedSubmitInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkProtectedSubmitInfo* forMarshaling);
 
-void unmarshal_VkProtectedSubmitInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkProtectedSubmitInfo* forUnmarshaling);
+void unmarshal_VkProtectedSubmitInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkProtectedSubmitInfo* forUnmarshaling);
 
 #define OP_vkGetDeviceQueue2 20155
 void marshal_VkSamplerYcbcrConversionCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkSamplerYcbcrConversionCreateInfo* forMarshaling);
 
 void unmarshal_VkSamplerYcbcrConversionCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkSamplerYcbcrConversionCreateInfo* forUnmarshaling);
 
-void marshal_VkSamplerYcbcrConversionInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSamplerYcbcrConversionInfo* forMarshaling);
+void marshal_VkSamplerYcbcrConversionInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                          const VkSamplerYcbcrConversionInfo* forMarshaling);
 
-void unmarshal_VkSamplerYcbcrConversionInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSamplerYcbcrConversionInfo* forUnmarshaling);
+void unmarshal_VkSamplerYcbcrConversionInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkSamplerYcbcrConversionInfo* forUnmarshaling);
 
-void marshal_VkBindImagePlaneMemoryInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBindImagePlaneMemoryInfo* forMarshaling);
+void marshal_VkBindImagePlaneMemoryInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                        const VkBindImagePlaneMemoryInfo* forMarshaling);
 
-void unmarshal_VkBindImagePlaneMemoryInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindImagePlaneMemoryInfo* forUnmarshaling);
+void unmarshal_VkBindImagePlaneMemoryInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkBindImagePlaneMemoryInfo* forUnmarshaling);
 
 void marshal_VkImagePlaneMemoryRequirementsInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkImagePlaneMemoryRequirementsInfo* forMarshaling);
 
 void unmarshal_VkImagePlaneMemoryRequirementsInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkImagePlaneMemoryRequirementsInfo* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceSamplerYcbcrConversionFeatures* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceSamplerYcbcrConversionFeatures* forUnmarshaling);
 
 void marshal_VkSamplerYcbcrConversionImageFormatProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkSamplerYcbcrConversionImageFormatProperties* forMarshaling);
 
 void unmarshal_VkSamplerYcbcrConversionImageFormatProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkSamplerYcbcrConversionImageFormatProperties* forUnmarshaling);
 
 #define OP_vkCreateSamplerYcbcrConversion 20156
 #define OP_vkDestroySamplerYcbcrConversion 20157
-void marshal_VkDescriptorUpdateTemplateEntry(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDescriptorUpdateTemplateEntry* forMarshaling);
+void marshal_VkDescriptorUpdateTemplateEntry(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkDescriptorUpdateTemplateEntry* forMarshaling);
 
-void unmarshal_VkDescriptorUpdateTemplateEntry(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorUpdateTemplateEntry* forUnmarshaling);
+void unmarshal_VkDescriptorUpdateTemplateEntry(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkDescriptorUpdateTemplateEntry* forUnmarshaling);
 
 void marshal_VkDescriptorUpdateTemplateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkDescriptorUpdateTemplateCreateInfo* forMarshaling);
 
 void unmarshal_VkDescriptorUpdateTemplateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkDescriptorUpdateTemplateCreateInfo* forUnmarshaling);
 
 #define OP_vkCreateDescriptorUpdateTemplate 20158
 #define OP_vkDestroyDescriptorUpdateTemplate 20159
 #define OP_vkUpdateDescriptorSetWithTemplate 20160
-void marshal_VkExternalMemoryProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkExternalMemoryProperties* forMarshaling);
+void marshal_VkExternalMemoryProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                        const VkExternalMemoryProperties* forMarshaling);
 
-void unmarshal_VkExternalMemoryProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalMemoryProperties* forUnmarshaling);
+void unmarshal_VkExternalMemoryProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkExternalMemoryProperties* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceExternalImageFormatInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceExternalImageFormatInfo* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceExternalImageFormatInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceExternalImageFormatInfo* forUnmarshaling);
 
-void marshal_VkExternalImageFormatProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkExternalImageFormatProperties* forMarshaling);
+void marshal_VkExternalImageFormatProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkExternalImageFormatProperties* forMarshaling);
 
-void unmarshal_VkExternalImageFormatProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalImageFormatProperties* forUnmarshaling);
+void unmarshal_VkExternalImageFormatProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkExternalImageFormatProperties* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceExternalBufferInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceExternalBufferInfo* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceExternalBufferInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceExternalBufferInfo* forUnmarshaling);
 
-void marshal_VkExternalBufferProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkExternalBufferProperties* forMarshaling);
+void marshal_VkExternalBufferProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                        const VkExternalBufferProperties* forMarshaling);
 
-void unmarshal_VkExternalBufferProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalBufferProperties* forUnmarshaling);
+void unmarshal_VkExternalBufferProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkExternalBufferProperties* forUnmarshaling);
 
-void marshal_VkPhysicalDeviceIDProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceIDProperties* forMarshaling);
+void marshal_VkPhysicalDeviceIDProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                          const VkPhysicalDeviceIDProperties* forMarshaling);
 
-void unmarshal_VkPhysicalDeviceIDProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceIDProperties* forUnmarshaling);
+void unmarshal_VkPhysicalDeviceIDProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkPhysicalDeviceIDProperties* forUnmarshaling);
 
 #define OP_vkGetPhysicalDeviceExternalBufferProperties 20161
-void marshal_VkExternalMemoryImageCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkExternalMemoryImageCreateInfo* forMarshaling);
+void marshal_VkExternalMemoryImageCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkExternalMemoryImageCreateInfo* forMarshaling);
 
-void unmarshal_VkExternalMemoryImageCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalMemoryImageCreateInfo* forUnmarshaling);
+void unmarshal_VkExternalMemoryImageCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkExternalMemoryImageCreateInfo* forUnmarshaling);
 
 void marshal_VkExternalMemoryBufferCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkExternalMemoryBufferCreateInfo* forMarshaling);
 
-void unmarshal_VkExternalMemoryBufferCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalMemoryBufferCreateInfo* forUnmarshaling);
+void unmarshal_VkExternalMemoryBufferCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkExternalMemoryBufferCreateInfo* forUnmarshaling);
 
-void marshal_VkExportMemoryAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkExportMemoryAllocateInfo* forMarshaling);
+void marshal_VkExportMemoryAllocateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                        const VkExportMemoryAllocateInfo* forMarshaling);
 
-void unmarshal_VkExportMemoryAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExportMemoryAllocateInfo* forUnmarshaling);
+void unmarshal_VkExportMemoryAllocateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkExportMemoryAllocateInfo* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceExternalFenceInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceExternalFenceInfo* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceExternalFenceInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceExternalFenceInfo* forUnmarshaling);
 
-void marshal_VkExternalFenceProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkExternalFenceProperties* forMarshaling);
+void marshal_VkExternalFenceProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkExternalFenceProperties* forMarshaling);
 
-void unmarshal_VkExternalFenceProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalFenceProperties* forUnmarshaling);
+void unmarshal_VkExternalFenceProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkExternalFenceProperties* forUnmarshaling);
 
 #define OP_vkGetPhysicalDeviceExternalFenceProperties 20162
-void marshal_VkExportFenceCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkExportFenceCreateInfo* forMarshaling);
+void marshal_VkExportFenceCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkExportFenceCreateInfo* forMarshaling);
 
-void unmarshal_VkExportFenceCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExportFenceCreateInfo* forUnmarshaling);
+void unmarshal_VkExportFenceCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkExportFenceCreateInfo* forUnmarshaling);
 
-void marshal_VkExportSemaphoreCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkExportSemaphoreCreateInfo* forMarshaling);
+void marshal_VkExportSemaphoreCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkExportSemaphoreCreateInfo* forMarshaling);
 
-void unmarshal_VkExportSemaphoreCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExportSemaphoreCreateInfo* forUnmarshaling);
+void unmarshal_VkExportSemaphoreCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkExportSemaphoreCreateInfo* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceExternalSemaphoreInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceExternalSemaphoreInfo* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceExternalSemaphoreInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceExternalSemaphoreInfo* forUnmarshaling);
 
-void marshal_VkExternalSemaphoreProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkExternalSemaphoreProperties* forMarshaling);
+void marshal_VkExternalSemaphoreProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkExternalSemaphoreProperties* forMarshaling);
 
-void unmarshal_VkExternalSemaphoreProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalSemaphoreProperties* forUnmarshaling);
+void unmarshal_VkExternalSemaphoreProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkExternalSemaphoreProperties* forUnmarshaling);
 
 #define OP_vkGetPhysicalDeviceExternalSemaphoreProperties 20163
 void marshal_VkPhysicalDeviceMaintenance3Properties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceMaintenance3Properties* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceMaintenance3Properties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceMaintenance3Properties* forUnmarshaling);
 
-void marshal_VkDescriptorSetLayoutSupport(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDescriptorSetLayoutSupport* forMarshaling);
+void marshal_VkDescriptorSetLayoutSupport(VulkanStream* vkStream, VkStructureType rootType,
+                                          const VkDescriptorSetLayoutSupport* forMarshaling);
 
-void unmarshal_VkDescriptorSetLayoutSupport(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorSetLayoutSupport* forUnmarshaling);
+void unmarshal_VkDescriptorSetLayoutSupport(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkDescriptorSetLayoutSupport* forUnmarshaling);
 
 #define OP_vkGetDescriptorSetLayoutSupport 20164
 void marshal_VkPhysicalDeviceShaderDrawParametersFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceShaderDrawParametersFeatures* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShaderDrawParametersFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceShaderDrawParametersFeatures* forUnmarshaling);
 
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceShaderDrawParametersFeatures, marshal_VkPhysicalDeviceShaderDrawParameterFeatures)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceShaderDrawParametersFeatures,
+                      marshal_VkPhysicalDeviceShaderDrawParameterFeatures)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceShaderDrawParametersFeatures, unmarshal_VkPhysicalDeviceShaderDrawParameterFeatures)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceShaderDrawParametersFeatures,
+                      unmarshal_VkPhysicalDeviceShaderDrawParameterFeatures)
 
 #endif
 #ifdef VK_VERSION_1_2
 void marshal_VkPhysicalDeviceVulkan11Features(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceVulkan11Features* forMarshaling);
 
-void unmarshal_VkPhysicalDeviceVulkan11Features(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceVulkan11Features* forUnmarshaling);
+void unmarshal_VkPhysicalDeviceVulkan11Features(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkPhysicalDeviceVulkan11Features* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceVulkan11Properties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceVulkan11Properties* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceVulkan11Properties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceVulkan11Properties* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceVulkan12Features(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceVulkan12Features* forMarshaling);
 
-void unmarshal_VkPhysicalDeviceVulkan12Features(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceVulkan12Features* forUnmarshaling);
+void unmarshal_VkPhysicalDeviceVulkan12Features(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkPhysicalDeviceVulkan12Features* forUnmarshaling);
 
-void marshal_VkConformanceVersion(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkConformanceVersion* forMarshaling);
+void marshal_VkConformanceVersion(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkConformanceVersion* forMarshaling);
 
-void unmarshal_VkConformanceVersion(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkConformanceVersion* forUnmarshaling);
+void unmarshal_VkConformanceVersion(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkConformanceVersion* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceVulkan12Properties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceVulkan12Properties* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceVulkan12Properties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceVulkan12Properties* forUnmarshaling);
 
-void marshal_VkImageFormatListCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageFormatListCreateInfo* forMarshaling);
+void marshal_VkImageFormatListCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkImageFormatListCreateInfo* forMarshaling);
 
-void unmarshal_VkImageFormatListCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageFormatListCreateInfo* forUnmarshaling);
+void unmarshal_VkImageFormatListCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkImageFormatListCreateInfo* forUnmarshaling);
 
 #define OP_vkCmdDrawIndirectCount 282774587
 #define OP_vkCmdDrawIndexedIndirectCount 245204359
-void marshal_VkAttachmentDescription2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAttachmentDescription2* forMarshaling);
+void marshal_VkAttachmentDescription2(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkAttachmentDescription2* forMarshaling);
 
-void unmarshal_VkAttachmentDescription2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAttachmentDescription2* forUnmarshaling);
+void unmarshal_VkAttachmentDescription2(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkAttachmentDescription2* forUnmarshaling);
 
-void marshal_VkAttachmentReference2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAttachmentReference2* forMarshaling);
+void marshal_VkAttachmentReference2(VulkanStream* vkStream, VkStructureType rootType,
+                                    const VkAttachmentReference2* forMarshaling);
 
-void unmarshal_VkAttachmentReference2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAttachmentReference2* forUnmarshaling);
+void unmarshal_VkAttachmentReference2(VulkanStream* vkStream, VkStructureType rootType,
+                                      VkAttachmentReference2* forUnmarshaling);
 
-void marshal_VkSubpassDescription2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSubpassDescription2* forMarshaling);
+void marshal_VkSubpassDescription2(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkSubpassDescription2* forMarshaling);
 
-void unmarshal_VkSubpassDescription2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubpassDescription2* forUnmarshaling);
+void unmarshal_VkSubpassDescription2(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkSubpassDescription2* forUnmarshaling);
 
-void marshal_VkSubpassDependency2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSubpassDependency2* forMarshaling);
+void marshal_VkSubpassDependency2(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkSubpassDependency2* forMarshaling);
 
-void unmarshal_VkSubpassDependency2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubpassDependency2* forUnmarshaling);
+void unmarshal_VkSubpassDependency2(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkSubpassDependency2* forUnmarshaling);
 
-void marshal_VkRenderPassCreateInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkRenderPassCreateInfo2* forMarshaling);
+void marshal_VkRenderPassCreateInfo2(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkRenderPassCreateInfo2* forMarshaling);
 
-void unmarshal_VkRenderPassCreateInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderPassCreateInfo2* forUnmarshaling);
+void unmarshal_VkRenderPassCreateInfo2(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkRenderPassCreateInfo2* forUnmarshaling);
 
-void marshal_VkSubpassBeginInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSubpassBeginInfo* forMarshaling);
+void marshal_VkSubpassBeginInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                const VkSubpassBeginInfo* forMarshaling);
 
-void unmarshal_VkSubpassBeginInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubpassBeginInfo* forUnmarshaling);
+void unmarshal_VkSubpassBeginInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkSubpassBeginInfo* forUnmarshaling);
 
-void marshal_VkSubpassEndInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSubpassEndInfo* forMarshaling);
+void marshal_VkSubpassEndInfo(VulkanStream* vkStream, VkStructureType rootType,
+                              const VkSubpassEndInfo* forMarshaling);
 
-void unmarshal_VkSubpassEndInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubpassEndInfo* forUnmarshaling);
+void unmarshal_VkSubpassEndInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                VkSubpassEndInfo* forUnmarshaling);
 
 #define OP_vkCreateRenderPass2 279590827
 #define OP_vkCmdBeginRenderPass2 235222847
 #define OP_vkCmdNextSubpass2 244873750
 #define OP_vkCmdEndRenderPass2 221297834
 void marshal_VkPhysicalDevice8BitStorageFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDevice8BitStorageFeatures* forMarshaling);
 
 void unmarshal_VkPhysicalDevice8BitStorageFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDevice8BitStorageFeatures* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceDriverProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceDriverProperties* forMarshaling);
 
-void unmarshal_VkPhysicalDeviceDriverProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDriverProperties* forUnmarshaling);
+void unmarshal_VkPhysicalDeviceDriverProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkPhysicalDeviceDriverProperties* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceShaderAtomicInt64Features(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceShaderAtomicInt64Features* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShaderAtomicInt64Features(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceShaderAtomicInt64Features* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceShaderFloat16Int8Features(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceShaderFloat16Int8Features* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShaderFloat16Int8Features(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceShaderFloat16Int8Features* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceFloatControlsProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceFloatControlsProperties* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceFloatControlsProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceFloatControlsProperties* forUnmarshaling);
 
 void marshal_VkDescriptorSetLayoutBindingFlagsCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkDescriptorSetLayoutBindingFlagsCreateInfo* forMarshaling);
 
 void unmarshal_VkDescriptorSetLayoutBindingFlagsCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkDescriptorSetLayoutBindingFlagsCreateInfo* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceDescriptorIndexingFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceDescriptorIndexingFeatures* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceDescriptorIndexingFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceDescriptorIndexingFeatures* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceDescriptorIndexingProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceDescriptorIndexingProperties* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceDescriptorIndexingProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceDescriptorIndexingProperties* forUnmarshaling);
 
 void marshal_VkDescriptorSetVariableDescriptorCountAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkDescriptorSetVariableDescriptorCountAllocateInfo* forMarshaling);
 
 void unmarshal_VkDescriptorSetVariableDescriptorCountAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkDescriptorSetVariableDescriptorCountAllocateInfo* forUnmarshaling);
 
 void marshal_VkDescriptorSetVariableDescriptorCountLayoutSupport(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkDescriptorSetVariableDescriptorCountLayoutSupport* forMarshaling);
 
 void unmarshal_VkDescriptorSetVariableDescriptorCountLayoutSupport(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkDescriptorSetVariableDescriptorCountLayoutSupport* forUnmarshaling);
 
 void marshal_VkSubpassDescriptionDepthStencilResolve(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkSubpassDescriptionDepthStencilResolve* forMarshaling);
 
 void unmarshal_VkSubpassDescriptionDepthStencilResolve(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkSubpassDescriptionDepthStencilResolve* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceDepthStencilResolveProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceDepthStencilResolveProperties* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceDepthStencilResolveProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceDepthStencilResolveProperties* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceScalarBlockLayoutFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceScalarBlockLayoutFeatures* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceScalarBlockLayoutFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceScalarBlockLayoutFeatures* forUnmarshaling);
 
-void marshal_VkImageStencilUsageCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageStencilUsageCreateInfo* forMarshaling);
+void marshal_VkImageStencilUsageCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkImageStencilUsageCreateInfo* forMarshaling);
 
-void unmarshal_VkImageStencilUsageCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageStencilUsageCreateInfo* forUnmarshaling);
+void unmarshal_VkImageStencilUsageCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkImageStencilUsageCreateInfo* forUnmarshaling);
 
 void marshal_VkSamplerReductionModeCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkSamplerReductionModeCreateInfo* forMarshaling);
 
-void unmarshal_VkSamplerReductionModeCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSamplerReductionModeCreateInfo* forUnmarshaling);
+void unmarshal_VkSamplerReductionModeCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkSamplerReductionModeCreateInfo* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceSamplerFilterMinmaxProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceSamplerFilterMinmaxProperties* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceSamplerFilterMinmaxProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceSamplerFilterMinmaxProperties* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceVulkanMemoryModelFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceVulkanMemoryModelFeatures* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceVulkanMemoryModelFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceVulkanMemoryModelFeatures* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceImagelessFramebufferFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceImagelessFramebufferFeatures* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceImagelessFramebufferFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceImagelessFramebufferFeatures* forUnmarshaling);
 
 void marshal_VkFramebufferAttachmentImageInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkFramebufferAttachmentImageInfo* forMarshaling);
 
-void unmarshal_VkFramebufferAttachmentImageInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFramebufferAttachmentImageInfo* forUnmarshaling);
+void unmarshal_VkFramebufferAttachmentImageInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkFramebufferAttachmentImageInfo* forUnmarshaling);
 
 void marshal_VkFramebufferAttachmentsCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkFramebufferAttachmentsCreateInfo* forMarshaling);
 
 void unmarshal_VkFramebufferAttachmentsCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkFramebufferAttachmentsCreateInfo* forUnmarshaling);
 
-void marshal_VkRenderPassAttachmentBeginInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkRenderPassAttachmentBeginInfo* forMarshaling);
+void marshal_VkRenderPassAttachmentBeginInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkRenderPassAttachmentBeginInfo* forMarshaling);
 
-void unmarshal_VkRenderPassAttachmentBeginInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderPassAttachmentBeginInfo* forUnmarshaling);
+void unmarshal_VkRenderPassAttachmentBeginInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkRenderPassAttachmentBeginInfo* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceUniformBufferStandardLayoutFeatures* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceUniformBufferStandardLayoutFeatures* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* forUnmarshaling);
 
 void marshal_VkAttachmentReferenceStencilLayout(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkAttachmentReferenceStencilLayout* forMarshaling);
 
 void unmarshal_VkAttachmentReferenceStencilLayout(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkAttachmentReferenceStencilLayout* forUnmarshaling);
 
 void marshal_VkAttachmentDescriptionStencilLayout(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkAttachmentDescriptionStencilLayout* forMarshaling);
 
 void unmarshal_VkAttachmentDescriptionStencilLayout(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkAttachmentDescriptionStencilLayout* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceHostQueryResetFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceHostQueryResetFeatures* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceHostQueryResetFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceHostQueryResetFeatures* forUnmarshaling);
 
 #define OP_vkResetQueryPool 252097672
 void marshal_VkPhysicalDeviceTimelineSemaphoreFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceTimelineSemaphoreFeatures* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceTimelineSemaphoreFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceTimelineSemaphoreFeatures* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceTimelineSemaphoreProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceTimelineSemaphoreProperties* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceTimelineSemaphoreProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceTimelineSemaphoreProperties* forUnmarshaling);
 
-void marshal_VkSemaphoreTypeCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSemaphoreTypeCreateInfo* forMarshaling);
+void marshal_VkSemaphoreTypeCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkSemaphoreTypeCreateInfo* forMarshaling);
 
-void unmarshal_VkSemaphoreTypeCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSemaphoreTypeCreateInfo* forUnmarshaling);
+void unmarshal_VkSemaphoreTypeCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkSemaphoreTypeCreateInfo* forUnmarshaling);
 
-void marshal_VkTimelineSemaphoreSubmitInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkTimelineSemaphoreSubmitInfo* forMarshaling);
+void marshal_VkTimelineSemaphoreSubmitInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkTimelineSemaphoreSubmitInfo* forMarshaling);
 
-void unmarshal_VkTimelineSemaphoreSubmitInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkTimelineSemaphoreSubmitInfo* forUnmarshaling);
+void unmarshal_VkTimelineSemaphoreSubmitInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkTimelineSemaphoreSubmitInfo* forUnmarshaling);
 
-void marshal_VkSemaphoreWaitInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSemaphoreWaitInfo* forMarshaling);
+void marshal_VkSemaphoreWaitInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkSemaphoreWaitInfo* forMarshaling);
 
-void unmarshal_VkSemaphoreWaitInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSemaphoreWaitInfo* forUnmarshaling);
+void unmarshal_VkSemaphoreWaitInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkSemaphoreWaitInfo* forUnmarshaling);
 
-void marshal_VkSemaphoreSignalInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSemaphoreSignalInfo* forMarshaling);
+void marshal_VkSemaphoreSignalInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkSemaphoreSignalInfo* forMarshaling);
 
-void unmarshal_VkSemaphoreSignalInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSemaphoreSignalInfo* forUnmarshaling);
+void unmarshal_VkSemaphoreSignalInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkSemaphoreSignalInfo* forUnmarshaling);
 
 #define OP_vkGetSemaphoreCounterValue 267066974
 #define OP_vkWaitSemaphores 224777382
 #define OP_vkSignalSemaphore 271024127
 void marshal_VkPhysicalDeviceBufferDeviceAddressFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceBufferDeviceAddressFeatures* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceBufferDeviceAddressFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceBufferDeviceAddressFeatures* forUnmarshaling);
 
-void marshal_VkBufferDeviceAddressInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBufferDeviceAddressInfo* forMarshaling);
+void marshal_VkBufferDeviceAddressInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkBufferDeviceAddressInfo* forMarshaling);
 
-void unmarshal_VkBufferDeviceAddressInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferDeviceAddressInfo* forUnmarshaling);
+void unmarshal_VkBufferDeviceAddressInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkBufferDeviceAddressInfo* forUnmarshaling);
 
 void marshal_VkBufferOpaqueCaptureAddressCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkBufferOpaqueCaptureAddressCreateInfo* forMarshaling);
 
 void unmarshal_VkBufferOpaqueCaptureAddressCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkBufferOpaqueCaptureAddressCreateInfo* forUnmarshaling);
 
 void marshal_VkMemoryOpaqueCaptureAddressAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkMemoryOpaqueCaptureAddressAllocateInfo* forMarshaling);
 
 void unmarshal_VkMemoryOpaqueCaptureAddressAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkMemoryOpaqueCaptureAddressAllocateInfo* forUnmarshaling);
 
 void marshal_VkDeviceMemoryOpaqueCaptureAddressInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkDeviceMemoryOpaqueCaptureAddressInfo* forMarshaling);
 
 void unmarshal_VkDeviceMemoryOpaqueCaptureAddressInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkDeviceMemoryOpaqueCaptureAddressInfo* forUnmarshaling);
 
 #define OP_vkGetBufferDeviceAddress 222632266
@@ -2515,25 +1756,17 @@
 #define OP_vkGetDeviceMemoryOpaqueCaptureAddress 260620079
 #endif
 #ifdef VK_KHR_surface
-void marshal_VkSurfaceCapabilitiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSurfaceCapabilitiesKHR* forMarshaling);
+void marshal_VkSurfaceCapabilitiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkSurfaceCapabilitiesKHR* forMarshaling);
 
-void unmarshal_VkSurfaceCapabilitiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSurfaceCapabilitiesKHR* forUnmarshaling);
+void unmarshal_VkSurfaceCapabilitiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkSurfaceCapabilitiesKHR* forUnmarshaling);
 
-void marshal_VkSurfaceFormatKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSurfaceFormatKHR* forMarshaling);
+void marshal_VkSurfaceFormatKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                const VkSurfaceFormatKHR* forMarshaling);
 
-void unmarshal_VkSurfaceFormatKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSurfaceFormatKHR* forUnmarshaling);
+void unmarshal_VkSurfaceFormatKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkSurfaceFormatKHR* forUnmarshaling);
 
 #define OP_vkDestroySurfaceKHR 20165
 #define OP_vkGetPhysicalDeviceSurfaceSupportKHR 20166
@@ -2542,89 +1775,63 @@
 #define OP_vkGetPhysicalDeviceSurfacePresentModesKHR 20169
 #endif
 #ifdef VK_KHR_swapchain
-void marshal_VkSwapchainCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSwapchainCreateInfoKHR* forMarshaling);
+void marshal_VkSwapchainCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkSwapchainCreateInfoKHR* forMarshaling);
 
-void unmarshal_VkSwapchainCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSwapchainCreateInfoKHR* forUnmarshaling);
+void unmarshal_VkSwapchainCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkSwapchainCreateInfoKHR* forUnmarshaling);
 
-void marshal_VkPresentInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPresentInfoKHR* forMarshaling);
+void marshal_VkPresentInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                              const VkPresentInfoKHR* forMarshaling);
 
-void unmarshal_VkPresentInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPresentInfoKHR* forUnmarshaling);
+void unmarshal_VkPresentInfoKHR(VulkanStream* 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(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageSwapchainCreateInfoKHR* forMarshaling);
+void marshal_VkImageSwapchainCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkImageSwapchainCreateInfoKHR* forMarshaling);
 
-void unmarshal_VkImageSwapchainCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageSwapchainCreateInfoKHR* forUnmarshaling);
+void unmarshal_VkImageSwapchainCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkImageSwapchainCreateInfoKHR* forUnmarshaling);
 
 void marshal_VkBindImageMemorySwapchainInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkBindImageMemorySwapchainInfoKHR* forMarshaling);
 
 void unmarshal_VkBindImageMemorySwapchainInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkBindImageMemorySwapchainInfoKHR* forUnmarshaling);
 
-void marshal_VkAcquireNextImageInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAcquireNextImageInfoKHR* forMarshaling);
+void marshal_VkAcquireNextImageInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkAcquireNextImageInfoKHR* forMarshaling);
 
-void unmarshal_VkAcquireNextImageInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAcquireNextImageInfoKHR* forUnmarshaling);
+void unmarshal_VkAcquireNextImageInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkAcquireNextImageInfoKHR* forUnmarshaling);
 
 void marshal_VkDeviceGroupPresentCapabilitiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkDeviceGroupPresentCapabilitiesKHR* forMarshaling);
 
 void unmarshal_VkDeviceGroupPresentCapabilitiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkDeviceGroupPresentCapabilitiesKHR* forUnmarshaling);
 
-void marshal_VkDeviceGroupPresentInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDeviceGroupPresentInfoKHR* forMarshaling);
+void marshal_VkDeviceGroupPresentInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkDeviceGroupPresentInfoKHR* forMarshaling);
 
-void unmarshal_VkDeviceGroupPresentInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceGroupPresentInfoKHR* forUnmarshaling);
+void unmarshal_VkDeviceGroupPresentInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkDeviceGroupPresentInfoKHR* forUnmarshaling);
 
 void marshal_VkDeviceGroupSwapchainCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkDeviceGroupSwapchainCreateInfoKHR* forMarshaling);
 
 void unmarshal_VkDeviceGroupSwapchainCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkDeviceGroupSwapchainCreateInfoKHR* forUnmarshaling);
 
 #define OP_vkGetDeviceGroupPresentCapabilitiesKHR 20175
@@ -2633,75 +1840,47 @@
 #define OP_vkAcquireNextImage2KHR 20178
 #endif
 #ifdef VK_KHR_display
-void marshal_VkDisplayModeParametersKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDisplayModeParametersKHR* forMarshaling);
+void marshal_VkDisplayModeParametersKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                        const VkDisplayModeParametersKHR* forMarshaling);
 
-void unmarshal_VkDisplayModeParametersKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayModeParametersKHR* forUnmarshaling);
+void unmarshal_VkDisplayModeParametersKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkDisplayModeParametersKHR* forUnmarshaling);
 
-void marshal_VkDisplayModeCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDisplayModeCreateInfoKHR* forMarshaling);
+void marshal_VkDisplayModeCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                        const VkDisplayModeCreateInfoKHR* forMarshaling);
 
-void unmarshal_VkDisplayModeCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayModeCreateInfoKHR* forUnmarshaling);
+void unmarshal_VkDisplayModeCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkDisplayModeCreateInfoKHR* forUnmarshaling);
 
-void marshal_VkDisplayModePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDisplayModePropertiesKHR* forMarshaling);
+void marshal_VkDisplayModePropertiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                        const VkDisplayModePropertiesKHR* forMarshaling);
 
-void unmarshal_VkDisplayModePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayModePropertiesKHR* forUnmarshaling);
+void unmarshal_VkDisplayModePropertiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkDisplayModePropertiesKHR* forUnmarshaling);
 
-void marshal_VkDisplayPlaneCapabilitiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDisplayPlaneCapabilitiesKHR* forMarshaling);
+void marshal_VkDisplayPlaneCapabilitiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkDisplayPlaneCapabilitiesKHR* forMarshaling);
 
-void unmarshal_VkDisplayPlaneCapabilitiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayPlaneCapabilitiesKHR* forUnmarshaling);
+void unmarshal_VkDisplayPlaneCapabilitiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkDisplayPlaneCapabilitiesKHR* forUnmarshaling);
 
-void marshal_VkDisplayPlanePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDisplayPlanePropertiesKHR* forMarshaling);
+void marshal_VkDisplayPlanePropertiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkDisplayPlanePropertiesKHR* forMarshaling);
 
-void unmarshal_VkDisplayPlanePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayPlanePropertiesKHR* forUnmarshaling);
+void unmarshal_VkDisplayPlanePropertiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkDisplayPlanePropertiesKHR* forUnmarshaling);
 
-void marshal_VkDisplayPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDisplayPropertiesKHR* forMarshaling);
+void marshal_VkDisplayPropertiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                    const VkDisplayPropertiesKHR* forMarshaling);
 
-void unmarshal_VkDisplayPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayPropertiesKHR* forUnmarshaling);
+void unmarshal_VkDisplayPropertiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                      VkDisplayPropertiesKHR* forUnmarshaling);
 
-void marshal_VkDisplaySurfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDisplaySurfaceCreateInfoKHR* forMarshaling);
+void marshal_VkDisplaySurfaceCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkDisplaySurfaceCreateInfoKHR* forMarshaling);
 
-void unmarshal_VkDisplaySurfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplaySurfaceCreateInfoKHR* forUnmarshaling);
+void unmarshal_VkDisplaySurfaceCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkDisplaySurfaceCreateInfoKHR* forUnmarshaling);
 
 #define OP_vkGetPhysicalDeviceDisplayPropertiesKHR 20179
 #define OP_vkGetPhysicalDeviceDisplayPlanePropertiesKHR 20180
@@ -2712,83 +1891,59 @@
 #define OP_vkCreateDisplayPlaneSurfaceKHR 20185
 #endif
 #ifdef VK_KHR_display_swapchain
-void marshal_VkDisplayPresentInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDisplayPresentInfoKHR* forMarshaling);
+void marshal_VkDisplayPresentInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkDisplayPresentInfoKHR* forMarshaling);
 
-void unmarshal_VkDisplayPresentInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayPresentInfoKHR* forUnmarshaling);
+void unmarshal_VkDisplayPresentInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkDisplayPresentInfoKHR* forUnmarshaling);
 
 #define OP_vkCreateSharedSwapchainsKHR 20186
 #endif
 #ifdef VK_KHR_xlib_surface
-void marshal_VkXlibSurfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkXlibSurfaceCreateInfoKHR* forMarshaling);
+void marshal_VkXlibSurfaceCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                        const VkXlibSurfaceCreateInfoKHR* forMarshaling);
 
-void unmarshal_VkXlibSurfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkXlibSurfaceCreateInfoKHR* forUnmarshaling);
+void unmarshal_VkXlibSurfaceCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkXlibSurfaceCreateInfoKHR* forUnmarshaling);
 
 #define OP_vkCreateXlibSurfaceKHR 20187
 #define OP_vkGetPhysicalDeviceXlibPresentationSupportKHR 20188
 #endif
 #ifdef VK_KHR_xcb_surface
-void marshal_VkXcbSurfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkXcbSurfaceCreateInfoKHR* forMarshaling);
+void marshal_VkXcbSurfaceCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkXcbSurfaceCreateInfoKHR* forMarshaling);
 
-void unmarshal_VkXcbSurfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkXcbSurfaceCreateInfoKHR* forUnmarshaling);
+void unmarshal_VkXcbSurfaceCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkXcbSurfaceCreateInfoKHR* forUnmarshaling);
 
 #define OP_vkCreateXcbSurfaceKHR 20189
 #define OP_vkGetPhysicalDeviceXcbPresentationSupportKHR 20190
 #endif
 #ifdef VK_KHR_wayland_surface
-void marshal_VkWaylandSurfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkWaylandSurfaceCreateInfoKHR* forMarshaling);
+void marshal_VkWaylandSurfaceCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkWaylandSurfaceCreateInfoKHR* forMarshaling);
 
-void unmarshal_VkWaylandSurfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkWaylandSurfaceCreateInfoKHR* forUnmarshaling);
+void unmarshal_VkWaylandSurfaceCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkWaylandSurfaceCreateInfoKHR* forUnmarshaling);
 
 #define OP_vkCreateWaylandSurfaceKHR 20191
 #define OP_vkGetPhysicalDeviceWaylandPresentationSupportKHR 20192
 #endif
 #ifdef VK_KHR_android_surface
-void marshal_VkAndroidSurfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAndroidSurfaceCreateInfoKHR* forMarshaling);
+void marshal_VkAndroidSurfaceCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkAndroidSurfaceCreateInfoKHR* forMarshaling);
 
-void unmarshal_VkAndroidSurfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAndroidSurfaceCreateInfoKHR* forUnmarshaling);
+void unmarshal_VkAndroidSurfaceCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkAndroidSurfaceCreateInfoKHR* forUnmarshaling);
 
 #define OP_vkCreateAndroidSurfaceKHR 20195
 #endif
 #ifdef VK_KHR_win32_surface
-void marshal_VkWin32SurfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkWin32SurfaceCreateInfoKHR* forMarshaling);
+void marshal_VkWin32SurfaceCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkWin32SurfaceCreateInfoKHR* forMarshaling);
 
-void unmarshal_VkWin32SurfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkWin32SurfaceCreateInfoKHR* forUnmarshaling);
+void unmarshal_VkWin32SurfaceCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkWin32SurfaceCreateInfoKHR* forUnmarshaling);
 
 #define OP_vkCreateWin32SurfaceKHR 20196
 #define OP_vkGetPhysicalDeviceWin32PresentationSupportKHR 20197
@@ -2797,164 +1952,107 @@
 #endif
 #ifdef VK_KHR_video_queue
 void marshal_VkVideoQueueFamilyProperties2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkVideoQueueFamilyProperties2KHR* forMarshaling);
 
-void unmarshal_VkVideoQueueFamilyProperties2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoQueueFamilyProperties2KHR* forUnmarshaling);
+void unmarshal_VkVideoQueueFamilyProperties2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkVideoQueueFamilyProperties2KHR* forUnmarshaling);
 
-void marshal_VkVideoProfileKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoProfileKHR* forMarshaling);
+void marshal_VkVideoProfileKHR(VulkanStream* vkStream, VkStructureType rootType,
+                               const VkVideoProfileKHR* forMarshaling);
 
-void unmarshal_VkVideoProfileKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoProfileKHR* forUnmarshaling);
+void unmarshal_VkVideoProfileKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                 VkVideoProfileKHR* forUnmarshaling);
 
-void marshal_VkVideoProfilesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoProfilesKHR* forMarshaling);
+void marshal_VkVideoProfilesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                const VkVideoProfilesKHR* forMarshaling);
 
-void unmarshal_VkVideoProfilesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoProfilesKHR* forUnmarshaling);
+void unmarshal_VkVideoProfilesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkVideoProfilesKHR* forUnmarshaling);
 
-void marshal_VkVideoCapabilitiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoCapabilitiesKHR* forMarshaling);
+void marshal_VkVideoCapabilitiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                    const VkVideoCapabilitiesKHR* forMarshaling);
 
-void unmarshal_VkVideoCapabilitiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoCapabilitiesKHR* forUnmarshaling);
+void unmarshal_VkVideoCapabilitiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                      VkVideoCapabilitiesKHR* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceVideoFormatInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceVideoFormatInfoKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceVideoFormatInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceVideoFormatInfoKHR* forUnmarshaling);
 
-void marshal_VkVideoFormatPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoFormatPropertiesKHR* forMarshaling);
+void marshal_VkVideoFormatPropertiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                        const VkVideoFormatPropertiesKHR* forMarshaling);
 
-void unmarshal_VkVideoFormatPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoFormatPropertiesKHR* forUnmarshaling);
+void unmarshal_VkVideoFormatPropertiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkVideoFormatPropertiesKHR* forUnmarshaling);
 
-void marshal_VkVideoPictureResourceKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoPictureResourceKHR* forMarshaling);
+void marshal_VkVideoPictureResourceKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkVideoPictureResourceKHR* forMarshaling);
 
-void unmarshal_VkVideoPictureResourceKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoPictureResourceKHR* forUnmarshaling);
+void unmarshal_VkVideoPictureResourceKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkVideoPictureResourceKHR* forUnmarshaling);
 
-void marshal_VkVideoReferenceSlotKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoReferenceSlotKHR* forMarshaling);
+void marshal_VkVideoReferenceSlotKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkVideoReferenceSlotKHR* forMarshaling);
 
-void unmarshal_VkVideoReferenceSlotKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoReferenceSlotKHR* forUnmarshaling);
+void unmarshal_VkVideoReferenceSlotKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkVideoReferenceSlotKHR* forUnmarshaling);
 
-void marshal_VkVideoGetMemoryPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoGetMemoryPropertiesKHR* forMarshaling);
+void marshal_VkVideoGetMemoryPropertiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkVideoGetMemoryPropertiesKHR* forMarshaling);
 
-void unmarshal_VkVideoGetMemoryPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoGetMemoryPropertiesKHR* forUnmarshaling);
+void unmarshal_VkVideoGetMemoryPropertiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkVideoGetMemoryPropertiesKHR* forUnmarshaling);
 
-void marshal_VkVideoBindMemoryKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoBindMemoryKHR* forMarshaling);
+void marshal_VkVideoBindMemoryKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkVideoBindMemoryKHR* forMarshaling);
 
-void unmarshal_VkVideoBindMemoryKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoBindMemoryKHR* forUnmarshaling);
+void unmarshal_VkVideoBindMemoryKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkVideoBindMemoryKHR* forUnmarshaling);
 
-void marshal_VkVideoSessionCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoSessionCreateInfoKHR* forMarshaling);
+void marshal_VkVideoSessionCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkVideoSessionCreateInfoKHR* forMarshaling);
 
-void unmarshal_VkVideoSessionCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoSessionCreateInfoKHR* forUnmarshaling);
+void unmarshal_VkVideoSessionCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkVideoSessionCreateInfoKHR* forUnmarshaling);
 
 void marshal_VkVideoSessionParametersCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkVideoSessionParametersCreateInfoKHR* forMarshaling);
 
 void unmarshal_VkVideoSessionParametersCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkVideoSessionParametersCreateInfoKHR* forUnmarshaling);
 
 void marshal_VkVideoSessionParametersUpdateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkVideoSessionParametersUpdateInfoKHR* forMarshaling);
 
 void unmarshal_VkVideoSessionParametersUpdateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkVideoSessionParametersUpdateInfoKHR* forUnmarshaling);
 
-void marshal_VkVideoBeginCodingInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoBeginCodingInfoKHR* forMarshaling);
+void marshal_VkVideoBeginCodingInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkVideoBeginCodingInfoKHR* forMarshaling);
 
-void unmarshal_VkVideoBeginCodingInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoBeginCodingInfoKHR* forUnmarshaling);
+void unmarshal_VkVideoBeginCodingInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkVideoBeginCodingInfoKHR* forUnmarshaling);
 
-void marshal_VkVideoEndCodingInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoEndCodingInfoKHR* forMarshaling);
+void marshal_VkVideoEndCodingInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkVideoEndCodingInfoKHR* forMarshaling);
 
-void unmarshal_VkVideoEndCodingInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEndCodingInfoKHR* forUnmarshaling);
+void unmarshal_VkVideoEndCodingInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkVideoEndCodingInfoKHR* forUnmarshaling);
 
-void marshal_VkVideoCodingControlInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoCodingControlInfoKHR* forMarshaling);
+void marshal_VkVideoCodingControlInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkVideoCodingControlInfoKHR* forMarshaling);
 
-void unmarshal_VkVideoCodingControlInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoCodingControlInfoKHR* forUnmarshaling);
+void unmarshal_VkVideoCodingControlInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkVideoCodingControlInfoKHR* forUnmarshaling);
 
 #define OP_vkGetPhysicalDeviceVideoCapabilitiesKHR 248113462
 #define OP_vkGetPhysicalDeviceVideoFormatPropertiesKHR 261873967
@@ -2970,128 +2068,106 @@
 #define OP_vkCmdControlVideoCodingKHR 252933003
 #endif
 #ifdef VK_KHR_video_decode_queue
-void marshal_VkVideoDecodeInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoDecodeInfoKHR* forMarshaling);
+void marshal_VkVideoDecodeInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkVideoDecodeInfoKHR* forMarshaling);
 
-void unmarshal_VkVideoDecodeInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeInfoKHR* forUnmarshaling);
+void unmarshal_VkVideoDecodeInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkVideoDecodeInfoKHR* forUnmarshaling);
 
 #define OP_vkCmdDecodeVideoKHR 275796951
 #endif
 #ifdef VK_KHR_dynamic_rendering
-void marshal_VkRenderingAttachmentInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkRenderingAttachmentInfoKHR* forMarshaling);
+void marshal_VkRenderingAttachmentInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                          const VkRenderingAttachmentInfoKHR* forMarshaling);
 
-void unmarshal_VkRenderingAttachmentInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderingAttachmentInfoKHR* forUnmarshaling);
+void unmarshal_VkRenderingAttachmentInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkRenderingAttachmentInfoKHR* forUnmarshaling);
 
-void marshal_VkRenderingInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkRenderingInfoKHR* forMarshaling);
+void marshal_VkRenderingInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                const VkRenderingInfoKHR* forMarshaling);
 
-void unmarshal_VkRenderingInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderingInfoKHR* forUnmarshaling);
+void unmarshal_VkRenderingInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkRenderingInfoKHR* forUnmarshaling);
 
 void marshal_VkPipelineRenderingCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineRenderingCreateInfoKHR* forMarshaling);
 
-void unmarshal_VkPipelineRenderingCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineRenderingCreateInfoKHR* forUnmarshaling);
+void unmarshal_VkPipelineRenderingCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkPipelineRenderingCreateInfoKHR* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceDynamicRenderingFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceDynamicRenderingFeaturesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceDynamicRenderingFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceDynamicRenderingFeaturesKHR* forUnmarshaling);
 
 void marshal_VkCommandBufferInheritanceRenderingInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkCommandBufferInheritanceRenderingInfoKHR* forMarshaling);
 
 void unmarshal_VkCommandBufferInheritanceRenderingInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkCommandBufferInheritanceRenderingInfoKHR* forUnmarshaling);
 
 #define OP_vkCmdBeginRenderingKHR 298092805
 #define OP_vkCmdEndRenderingKHR 200651584
 void marshal_VkRenderingFragmentShadingRateAttachmentInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkRenderingFragmentShadingRateAttachmentInfoKHR* forMarshaling);
 
 void unmarshal_VkRenderingFragmentShadingRateAttachmentInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkRenderingFragmentShadingRateAttachmentInfoKHR* forUnmarshaling);
 
 void marshal_VkRenderingFragmentDensityMapAttachmentInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkRenderingFragmentDensityMapAttachmentInfoEXT* forMarshaling);
 
 void unmarshal_VkRenderingFragmentDensityMapAttachmentInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkRenderingFragmentDensityMapAttachmentInfoEXT* forUnmarshaling);
 
-void marshal_VkAttachmentSampleCountInfoAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAttachmentSampleCountInfoAMD* forMarshaling);
+void marshal_VkAttachmentSampleCountInfoAMD(VulkanStream* vkStream, VkStructureType rootType,
+                                            const VkAttachmentSampleCountInfoAMD* forMarshaling);
 
-void unmarshal_VkAttachmentSampleCountInfoAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAttachmentSampleCountInfoAMD* forUnmarshaling);
+void unmarshal_VkAttachmentSampleCountInfoAMD(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkAttachmentSampleCountInfoAMD* forUnmarshaling);
 
 DEFINE_ALIAS_FUNCTION(marshal_VkAttachmentSampleCountInfoAMD, marshal_VkAttachmentSampleCountInfoNV)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkAttachmentSampleCountInfoAMD, unmarshal_VkAttachmentSampleCountInfoNV)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkAttachmentSampleCountInfoAMD,
+                      unmarshal_VkAttachmentSampleCountInfoNV)
 
 void marshal_VkMultiviewPerViewAttributesInfoNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkMultiviewPerViewAttributesInfoNVX* forMarshaling);
 
 void unmarshal_VkMultiviewPerViewAttributesInfoNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkMultiviewPerViewAttributesInfoNVX* forUnmarshaling);
 
 #endif
 #ifdef VK_KHR_multiview
-DEFINE_ALIAS_FUNCTION(marshal_VkRenderPassMultiviewCreateInfo, marshal_VkRenderPassMultiviewCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkRenderPassMultiviewCreateInfo,
+                      marshal_VkRenderPassMultiviewCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkRenderPassMultiviewCreateInfo, unmarshal_VkRenderPassMultiviewCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkRenderPassMultiviewCreateInfo,
+                      unmarshal_VkRenderPassMultiviewCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceMultiviewFeatures, marshal_VkPhysicalDeviceMultiviewFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceMultiviewFeatures,
+                      marshal_VkPhysicalDeviceMultiviewFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceMultiviewFeatures, unmarshal_VkPhysicalDeviceMultiviewFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceMultiviewFeatures,
+                      unmarshal_VkPhysicalDeviceMultiviewFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceMultiviewProperties, marshal_VkPhysicalDeviceMultiviewPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceMultiviewProperties,
+                      marshal_VkPhysicalDeviceMultiviewPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceMultiviewProperties, unmarshal_VkPhysicalDeviceMultiviewPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceMultiviewProperties,
+                      unmarshal_VkPhysicalDeviceMultiviewPropertiesKHR)
 
 #endif
 #ifdef VK_KHR_get_physical_device_properties2
@@ -3101,7 +2177,8 @@
 
 DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceProperties2, marshal_VkPhysicalDeviceProperties2KHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceProperties2, unmarshal_VkPhysicalDeviceProperties2KHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceProperties2,
+                      unmarshal_VkPhysicalDeviceProperties2KHR)
 
 DEFINE_ALIAS_FUNCTION(marshal_VkFormatProperties2, marshal_VkFormatProperties2KHR)
 
@@ -3111,25 +2188,33 @@
 
 DEFINE_ALIAS_FUNCTION(unmarshal_VkImageFormatProperties2, unmarshal_VkImageFormatProperties2KHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceImageFormatInfo2, marshal_VkPhysicalDeviceImageFormatInfo2KHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceImageFormatInfo2,
+                      marshal_VkPhysicalDeviceImageFormatInfo2KHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceImageFormatInfo2, unmarshal_VkPhysicalDeviceImageFormatInfo2KHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceImageFormatInfo2,
+                      unmarshal_VkPhysicalDeviceImageFormatInfo2KHR)
 
 DEFINE_ALIAS_FUNCTION(marshal_VkQueueFamilyProperties2, marshal_VkQueueFamilyProperties2KHR)
 
 DEFINE_ALIAS_FUNCTION(unmarshal_VkQueueFamilyProperties2, unmarshal_VkQueueFamilyProperties2KHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceMemoryProperties2, marshal_VkPhysicalDeviceMemoryProperties2KHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceMemoryProperties2,
+                      marshal_VkPhysicalDeviceMemoryProperties2KHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceMemoryProperties2, unmarshal_VkPhysicalDeviceMemoryProperties2KHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceMemoryProperties2,
+                      unmarshal_VkPhysicalDeviceMemoryProperties2KHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkSparseImageFormatProperties2, marshal_VkSparseImageFormatProperties2KHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkSparseImageFormatProperties2,
+                      marshal_VkSparseImageFormatProperties2KHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkSparseImageFormatProperties2, unmarshal_VkSparseImageFormatProperties2KHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkSparseImageFormatProperties2,
+                      unmarshal_VkSparseImageFormatProperties2KHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceSparseImageFormatInfo2, marshal_VkPhysicalDeviceSparseImageFormatInfo2KHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceSparseImageFormatInfo2,
+                      marshal_VkPhysicalDeviceSparseImageFormatInfo2KHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceSparseImageFormatInfo2, unmarshal_VkPhysicalDeviceSparseImageFormatInfo2KHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceSparseImageFormatInfo2,
+                      unmarshal_VkPhysicalDeviceSparseImageFormatInfo2KHR)
 
 #define OP_vkGetPhysicalDeviceFeatures2KHR 20198
 #define OP_vkGetPhysicalDeviceProperties2KHR 20199
@@ -3144,13 +2229,17 @@
 
 DEFINE_ALIAS_FUNCTION(unmarshal_VkMemoryAllocateFlagsInfo, unmarshal_VkMemoryAllocateFlagsInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkDeviceGroupRenderPassBeginInfo, marshal_VkDeviceGroupRenderPassBeginInfoKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkDeviceGroupRenderPassBeginInfo,
+                      marshal_VkDeviceGroupRenderPassBeginInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkDeviceGroupRenderPassBeginInfo, unmarshal_VkDeviceGroupRenderPassBeginInfoKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkDeviceGroupRenderPassBeginInfo,
+                      unmarshal_VkDeviceGroupRenderPassBeginInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkDeviceGroupCommandBufferBeginInfo, marshal_VkDeviceGroupCommandBufferBeginInfoKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkDeviceGroupCommandBufferBeginInfo,
+                      marshal_VkDeviceGroupCommandBufferBeginInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkDeviceGroupCommandBufferBeginInfo, unmarshal_VkDeviceGroupCommandBufferBeginInfoKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkDeviceGroupCommandBufferBeginInfo,
+                      unmarshal_VkDeviceGroupCommandBufferBeginInfoKHR)
 
 DEFINE_ALIAS_FUNCTION(marshal_VkDeviceGroupSubmitInfo, marshal_VkDeviceGroupSubmitInfoKHR)
 
@@ -3158,18 +2247,23 @@
 
 DEFINE_ALIAS_FUNCTION(marshal_VkDeviceGroupBindSparseInfo, marshal_VkDeviceGroupBindSparseInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkDeviceGroupBindSparseInfo, unmarshal_VkDeviceGroupBindSparseInfoKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkDeviceGroupBindSparseInfo,
+                      unmarshal_VkDeviceGroupBindSparseInfoKHR)
 
 #define OP_vkGetDeviceGroupPeerMemoryFeaturesKHR 20205
 #define OP_vkCmdSetDeviceMaskKHR 20206
 #define OP_vkCmdDispatchBaseKHR 20207
-DEFINE_ALIAS_FUNCTION(marshal_VkBindBufferMemoryDeviceGroupInfo, marshal_VkBindBufferMemoryDeviceGroupInfoKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkBindBufferMemoryDeviceGroupInfo,
+                      marshal_VkBindBufferMemoryDeviceGroupInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkBindBufferMemoryDeviceGroupInfo, unmarshal_VkBindBufferMemoryDeviceGroupInfoKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkBindBufferMemoryDeviceGroupInfo,
+                      unmarshal_VkBindBufferMemoryDeviceGroupInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkBindImageMemoryDeviceGroupInfo, marshal_VkBindImageMemoryDeviceGroupInfoKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkBindImageMemoryDeviceGroupInfo,
+                      marshal_VkBindImageMemoryDeviceGroupInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkBindImageMemoryDeviceGroupInfo, unmarshal_VkBindImageMemoryDeviceGroupInfoKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkBindImageMemoryDeviceGroupInfo,
+                      unmarshal_VkBindImageMemoryDeviceGroupInfoKHR)
 
 #endif
 #ifdef VK_KHR_shader_draw_parameters
@@ -3178,13 +2272,17 @@
 #define OP_vkTrimCommandPoolKHR 20208
 #endif
 #ifdef VK_KHR_device_group_creation
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceGroupProperties, marshal_VkPhysicalDeviceGroupPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceGroupProperties,
+                      marshal_VkPhysicalDeviceGroupPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceGroupProperties, unmarshal_VkPhysicalDeviceGroupPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceGroupProperties,
+                      unmarshal_VkPhysicalDeviceGroupPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkDeviceGroupDeviceCreateInfo, marshal_VkDeviceGroupDeviceCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkDeviceGroupDeviceCreateInfo,
+                      marshal_VkDeviceGroupDeviceCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkDeviceGroupDeviceCreateInfo, unmarshal_VkDeviceGroupDeviceCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkDeviceGroupDeviceCreateInfo,
+                      unmarshal_VkDeviceGroupDeviceCreateInfoKHR)
 
 #define OP_vkEnumeratePhysicalDeviceGroupsKHR 20209
 #endif
@@ -3193,17 +2291,23 @@
 
 DEFINE_ALIAS_FUNCTION(unmarshal_VkExternalMemoryProperties, unmarshal_VkExternalMemoryPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceExternalImageFormatInfo, marshal_VkPhysicalDeviceExternalImageFormatInfoKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceExternalImageFormatInfo,
+                      marshal_VkPhysicalDeviceExternalImageFormatInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceExternalImageFormatInfo, unmarshal_VkPhysicalDeviceExternalImageFormatInfoKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceExternalImageFormatInfo,
+                      unmarshal_VkPhysicalDeviceExternalImageFormatInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkExternalImageFormatProperties, marshal_VkExternalImageFormatPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkExternalImageFormatProperties,
+                      marshal_VkExternalImageFormatPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkExternalImageFormatProperties, unmarshal_VkExternalImageFormatPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkExternalImageFormatProperties,
+                      unmarshal_VkExternalImageFormatPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceExternalBufferInfo, marshal_VkPhysicalDeviceExternalBufferInfoKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceExternalBufferInfo,
+                      marshal_VkPhysicalDeviceExternalBufferInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceExternalBufferInfo, unmarshal_VkPhysicalDeviceExternalBufferInfoKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceExternalBufferInfo,
+                      unmarshal_VkPhysicalDeviceExternalBufferInfoKHR)
 
 DEFINE_ALIAS_FUNCTION(marshal_VkExternalBufferProperties, marshal_VkExternalBufferPropertiesKHR)
 
@@ -3211,18 +2315,23 @@
 
 DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceIDProperties, marshal_VkPhysicalDeviceIDPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceIDProperties, unmarshal_VkPhysicalDeviceIDPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceIDProperties,
+                      unmarshal_VkPhysicalDeviceIDPropertiesKHR)
 
 #define OP_vkGetPhysicalDeviceExternalBufferPropertiesKHR 20210
 #endif
 #ifdef VK_KHR_external_memory
-DEFINE_ALIAS_FUNCTION(marshal_VkExternalMemoryImageCreateInfo, marshal_VkExternalMemoryImageCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkExternalMemoryImageCreateInfo,
+                      marshal_VkExternalMemoryImageCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkExternalMemoryImageCreateInfo, unmarshal_VkExternalMemoryImageCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkExternalMemoryImageCreateInfo,
+                      unmarshal_VkExternalMemoryImageCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkExternalMemoryBufferCreateInfo, marshal_VkExternalMemoryBufferCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkExternalMemoryBufferCreateInfo,
+                      marshal_VkExternalMemoryBufferCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkExternalMemoryBufferCreateInfo, unmarshal_VkExternalMemoryBufferCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkExternalMemoryBufferCreateInfo,
+                      unmarshal_VkExternalMemoryBufferCreateInfoKHR)
 
 DEFINE_ALIAS_FUNCTION(marshal_VkExportMemoryAllocateInfo, marshal_VkExportMemoryAllocateInfoKHR)
 
@@ -3231,270 +2340,233 @@
 #endif
 #ifdef VK_KHR_external_memory_win32
 void marshal_VkImportMemoryWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkImportMemoryWin32HandleInfoKHR* forMarshaling);
 
-void unmarshal_VkImportMemoryWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportMemoryWin32HandleInfoKHR* forUnmarshaling);
+void unmarshal_VkImportMemoryWin32HandleInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkImportMemoryWin32HandleInfoKHR* forUnmarshaling);
 
 void marshal_VkExportMemoryWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkExportMemoryWin32HandleInfoKHR* forMarshaling);
 
-void unmarshal_VkExportMemoryWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExportMemoryWin32HandleInfoKHR* forUnmarshaling);
+void unmarshal_VkExportMemoryWin32HandleInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkExportMemoryWin32HandleInfoKHR* forUnmarshaling);
 
 void marshal_VkMemoryWin32HandlePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkMemoryWin32HandlePropertiesKHR* forMarshaling);
 
-void unmarshal_VkMemoryWin32HandlePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryWin32HandlePropertiesKHR* forUnmarshaling);
+void unmarshal_VkMemoryWin32HandlePropertiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkMemoryWin32HandlePropertiesKHR* forUnmarshaling);
 
-void marshal_VkMemoryGetWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMemoryGetWin32HandleInfoKHR* forMarshaling);
+void marshal_VkMemoryGetWin32HandleInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkMemoryGetWin32HandleInfoKHR* forMarshaling);
 
-void unmarshal_VkMemoryGetWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryGetWin32HandleInfoKHR* forUnmarshaling);
+void unmarshal_VkMemoryGetWin32HandleInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkMemoryGetWin32HandleInfoKHR* forUnmarshaling);
 
 #define OP_vkGetMemoryWin32HandleKHR 20211
 #define OP_vkGetMemoryWin32HandlePropertiesKHR 20212
 #endif
 #ifdef VK_KHR_external_memory_fd
-void marshal_VkImportMemoryFdInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImportMemoryFdInfoKHR* forMarshaling);
+void marshal_VkImportMemoryFdInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkImportMemoryFdInfoKHR* forMarshaling);
 
-void unmarshal_VkImportMemoryFdInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportMemoryFdInfoKHR* forUnmarshaling);
+void unmarshal_VkImportMemoryFdInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkImportMemoryFdInfoKHR* forUnmarshaling);
 
-void marshal_VkMemoryFdPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMemoryFdPropertiesKHR* forMarshaling);
+void marshal_VkMemoryFdPropertiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkMemoryFdPropertiesKHR* forMarshaling);
 
-void unmarshal_VkMemoryFdPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryFdPropertiesKHR* forUnmarshaling);
+void unmarshal_VkMemoryFdPropertiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkMemoryFdPropertiesKHR* forUnmarshaling);
 
-void marshal_VkMemoryGetFdInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMemoryGetFdInfoKHR* forMarshaling);
+void marshal_VkMemoryGetFdInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkMemoryGetFdInfoKHR* forMarshaling);
 
-void unmarshal_VkMemoryGetFdInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryGetFdInfoKHR* forUnmarshaling);
+void unmarshal_VkMemoryGetFdInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkMemoryGetFdInfoKHR* forUnmarshaling);
 
 #define OP_vkGetMemoryFdKHR 20213
 #define OP_vkGetMemoryFdPropertiesKHR 20214
 #endif
 #ifdef VK_KHR_win32_keyed_mutex
 void marshal_VkWin32KeyedMutexAcquireReleaseInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkWin32KeyedMutexAcquireReleaseInfoKHR* forMarshaling);
 
 void unmarshal_VkWin32KeyedMutexAcquireReleaseInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkWin32KeyedMutexAcquireReleaseInfoKHR* forUnmarshaling);
 
 #endif
 #ifdef VK_KHR_external_semaphore_capabilities
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceExternalSemaphoreInfo, marshal_VkPhysicalDeviceExternalSemaphoreInfoKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceExternalSemaphoreInfo,
+                      marshal_VkPhysicalDeviceExternalSemaphoreInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceExternalSemaphoreInfo, unmarshal_VkPhysicalDeviceExternalSemaphoreInfoKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceExternalSemaphoreInfo,
+                      unmarshal_VkPhysicalDeviceExternalSemaphoreInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkExternalSemaphoreProperties, marshal_VkExternalSemaphorePropertiesKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkExternalSemaphoreProperties,
+                      marshal_VkExternalSemaphorePropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkExternalSemaphoreProperties, unmarshal_VkExternalSemaphorePropertiesKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkExternalSemaphoreProperties,
+                      unmarshal_VkExternalSemaphorePropertiesKHR)
 
 #define OP_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR 20215
 #endif
 #ifdef VK_KHR_external_semaphore
 DEFINE_ALIAS_FUNCTION(marshal_VkExportSemaphoreCreateInfo, marshal_VkExportSemaphoreCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkExportSemaphoreCreateInfo, unmarshal_VkExportSemaphoreCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkExportSemaphoreCreateInfo,
+                      unmarshal_VkExportSemaphoreCreateInfoKHR)
 
 #endif
 #ifdef VK_KHR_external_semaphore_win32
 void marshal_VkImportSemaphoreWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkImportSemaphoreWin32HandleInfoKHR* forMarshaling);
 
 void unmarshal_VkImportSemaphoreWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkImportSemaphoreWin32HandleInfoKHR* forUnmarshaling);
 
 void marshal_VkExportSemaphoreWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkExportSemaphoreWin32HandleInfoKHR* forMarshaling);
 
 void unmarshal_VkExportSemaphoreWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkExportSemaphoreWin32HandleInfoKHR* forUnmarshaling);
 
-void marshal_VkD3D12FenceSubmitInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkD3D12FenceSubmitInfoKHR* forMarshaling);
+void marshal_VkD3D12FenceSubmitInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkD3D12FenceSubmitInfoKHR* forMarshaling);
 
-void unmarshal_VkD3D12FenceSubmitInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkD3D12FenceSubmitInfoKHR* forUnmarshaling);
+void unmarshal_VkD3D12FenceSubmitInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkD3D12FenceSubmitInfoKHR* forUnmarshaling);
 
 void marshal_VkSemaphoreGetWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkSemaphoreGetWin32HandleInfoKHR* forMarshaling);
 
-void unmarshal_VkSemaphoreGetWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSemaphoreGetWin32HandleInfoKHR* forUnmarshaling);
+void unmarshal_VkSemaphoreGetWin32HandleInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkSemaphoreGetWin32HandleInfoKHR* forUnmarshaling);
 
 #define OP_vkImportSemaphoreWin32HandleKHR 20216
 #define OP_vkGetSemaphoreWin32HandleKHR 20217
 #endif
 #ifdef VK_KHR_external_semaphore_fd
-void marshal_VkImportSemaphoreFdInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImportSemaphoreFdInfoKHR* forMarshaling);
+void marshal_VkImportSemaphoreFdInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                        const VkImportSemaphoreFdInfoKHR* forMarshaling);
 
-void unmarshal_VkImportSemaphoreFdInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportSemaphoreFdInfoKHR* forUnmarshaling);
+void unmarshal_VkImportSemaphoreFdInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkImportSemaphoreFdInfoKHR* forUnmarshaling);
 
-void marshal_VkSemaphoreGetFdInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSemaphoreGetFdInfoKHR* forMarshaling);
+void marshal_VkSemaphoreGetFdInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkSemaphoreGetFdInfoKHR* forMarshaling);
 
-void unmarshal_VkSemaphoreGetFdInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSemaphoreGetFdInfoKHR* forUnmarshaling);
+void unmarshal_VkSemaphoreGetFdInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkSemaphoreGetFdInfoKHR* forUnmarshaling);
 
 #define OP_vkImportSemaphoreFdKHR 20218
 #define OP_vkGetSemaphoreFdKHR 20219
 #endif
 #ifdef VK_KHR_push_descriptor
 void marshal_VkPhysicalDevicePushDescriptorPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDevicePushDescriptorPropertiesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDevicePushDescriptorPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDevicePushDescriptorPropertiesKHR* forUnmarshaling);
 
 #define OP_vkCmdPushDescriptorSetKHR 20220
 #define OP_vkCmdPushDescriptorSetWithTemplateKHR 20221
 #endif
 #ifdef VK_KHR_shader_float16_int8
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceShaderFloat16Int8Features, marshal_VkPhysicalDeviceShaderFloat16Int8FeaturesKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceShaderFloat16Int8Features,
+                      marshal_VkPhysicalDeviceShaderFloat16Int8FeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceShaderFloat16Int8Features, unmarshal_VkPhysicalDeviceShaderFloat16Int8FeaturesKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceShaderFloat16Int8Features,
+                      unmarshal_VkPhysicalDeviceShaderFloat16Int8FeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceShaderFloat16Int8Features, marshal_VkPhysicalDeviceFloat16Int8FeaturesKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceShaderFloat16Int8Features,
+                      marshal_VkPhysicalDeviceFloat16Int8FeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceShaderFloat16Int8Features, unmarshal_VkPhysicalDeviceFloat16Int8FeaturesKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceShaderFloat16Int8Features,
+                      unmarshal_VkPhysicalDeviceFloat16Int8FeaturesKHR)
 
 #endif
 #ifdef VK_KHR_16bit_storage
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDevice16BitStorageFeatures, marshal_VkPhysicalDevice16BitStorageFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDevice16BitStorageFeatures,
+                      marshal_VkPhysicalDevice16BitStorageFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDevice16BitStorageFeatures, unmarshal_VkPhysicalDevice16BitStorageFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDevice16BitStorageFeatures,
+                      unmarshal_VkPhysicalDevice16BitStorageFeaturesKHR)
 
 #endif
 #ifdef VK_KHR_incremental_present
-void marshal_VkRectLayerKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkRectLayerKHR* forMarshaling);
+void marshal_VkRectLayerKHR(VulkanStream* vkStream, VkStructureType rootType,
+                            const VkRectLayerKHR* forMarshaling);
 
-void unmarshal_VkRectLayerKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRectLayerKHR* forUnmarshaling);
+void unmarshal_VkRectLayerKHR(VulkanStream* vkStream, VkStructureType rootType,
+                              VkRectLayerKHR* forUnmarshaling);
 
-void marshal_VkPresentRegionKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPresentRegionKHR* forMarshaling);
+void marshal_VkPresentRegionKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                const VkPresentRegionKHR* forMarshaling);
 
-void unmarshal_VkPresentRegionKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPresentRegionKHR* forUnmarshaling);
+void unmarshal_VkPresentRegionKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkPresentRegionKHR* forUnmarshaling);
 
-void marshal_VkPresentRegionsKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPresentRegionsKHR* forMarshaling);
+void marshal_VkPresentRegionsKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkPresentRegionsKHR* forMarshaling);
 
-void unmarshal_VkPresentRegionsKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPresentRegionsKHR* forUnmarshaling);
+void unmarshal_VkPresentRegionsKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkPresentRegionsKHR* forUnmarshaling);
 
 #endif
 #ifdef VK_KHR_descriptor_update_template
-DEFINE_ALIAS_FUNCTION(marshal_VkDescriptorUpdateTemplateEntry, marshal_VkDescriptorUpdateTemplateEntryKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkDescriptorUpdateTemplateEntry,
+                      marshal_VkDescriptorUpdateTemplateEntryKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkDescriptorUpdateTemplateEntry, unmarshal_VkDescriptorUpdateTemplateEntryKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkDescriptorUpdateTemplateEntry,
+                      unmarshal_VkDescriptorUpdateTemplateEntryKHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkDescriptorUpdateTemplateCreateInfo, marshal_VkDescriptorUpdateTemplateCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkDescriptorUpdateTemplateCreateInfo,
+                      marshal_VkDescriptorUpdateTemplateCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkDescriptorUpdateTemplateCreateInfo, unmarshal_VkDescriptorUpdateTemplateCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkDescriptorUpdateTemplateCreateInfo,
+                      unmarshal_VkDescriptorUpdateTemplateCreateInfoKHR)
 
 #define OP_vkCreateDescriptorUpdateTemplateKHR 20222
 #define OP_vkDestroyDescriptorUpdateTemplateKHR 20223
 #define OP_vkUpdateDescriptorSetWithTemplateKHR 20224
 #endif
 #ifdef VK_KHR_imageless_framebuffer
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceImagelessFramebufferFeatures, marshal_VkPhysicalDeviceImagelessFramebufferFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceImagelessFramebufferFeatures,
+                      marshal_VkPhysicalDeviceImagelessFramebufferFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceImagelessFramebufferFeatures, unmarshal_VkPhysicalDeviceImagelessFramebufferFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceImagelessFramebufferFeatures,
+                      unmarshal_VkPhysicalDeviceImagelessFramebufferFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkFramebufferAttachmentsCreateInfo, marshal_VkFramebufferAttachmentsCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkFramebufferAttachmentsCreateInfo,
+                      marshal_VkFramebufferAttachmentsCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkFramebufferAttachmentsCreateInfo, unmarshal_VkFramebufferAttachmentsCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkFramebufferAttachmentsCreateInfo,
+                      unmarshal_VkFramebufferAttachmentsCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkFramebufferAttachmentImageInfo, marshal_VkFramebufferAttachmentImageInfoKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkFramebufferAttachmentImageInfo,
+                      marshal_VkFramebufferAttachmentImageInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkFramebufferAttachmentImageInfo, unmarshal_VkFramebufferAttachmentImageInfoKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkFramebufferAttachmentImageInfo,
+                      unmarshal_VkFramebufferAttachmentImageInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkRenderPassAttachmentBeginInfo, marshal_VkRenderPassAttachmentBeginInfoKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkRenderPassAttachmentBeginInfo,
+                      marshal_VkRenderPassAttachmentBeginInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkRenderPassAttachmentBeginInfo, unmarshal_VkRenderPassAttachmentBeginInfoKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkRenderPassAttachmentBeginInfo,
+                      unmarshal_VkRenderPassAttachmentBeginInfoKHR)
 
 #endif
 #ifdef VK_KHR_create_renderpass2
@@ -3533,21 +2605,21 @@
 #endif
 #ifdef VK_KHR_shared_presentable_image
 void marshal_VkSharedPresentSurfaceCapabilitiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkSharedPresentSurfaceCapabilitiesKHR* forMarshaling);
 
 void unmarshal_VkSharedPresentSurfaceCapabilitiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkSharedPresentSurfaceCapabilitiesKHR* forUnmarshaling);
 
 #define OP_vkGetSwapchainStatusKHR 20229
 #endif
 #ifdef VK_KHR_external_fence_capabilities
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceExternalFenceInfo, marshal_VkPhysicalDeviceExternalFenceInfoKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceExternalFenceInfo,
+                      marshal_VkPhysicalDeviceExternalFenceInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceExternalFenceInfo, unmarshal_VkPhysicalDeviceExternalFenceInfoKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceExternalFenceInfo,
+                      unmarshal_VkPhysicalDeviceExternalFenceInfoKHR)
 
 DEFINE_ALIAS_FUNCTION(marshal_VkExternalFenceProperties, marshal_VkExternalFencePropertiesKHR)
 
@@ -3562,143 +2634,99 @@
 
 #endif
 #ifdef VK_KHR_external_fence_win32
-void marshal_VkImportFenceWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImportFenceWin32HandleInfoKHR* forMarshaling);
+void marshal_VkImportFenceWin32HandleInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkImportFenceWin32HandleInfoKHR* forMarshaling);
 
-void unmarshal_VkImportFenceWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportFenceWin32HandleInfoKHR* forUnmarshaling);
+void unmarshal_VkImportFenceWin32HandleInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkImportFenceWin32HandleInfoKHR* forUnmarshaling);
 
-void marshal_VkExportFenceWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkExportFenceWin32HandleInfoKHR* forMarshaling);
+void marshal_VkExportFenceWin32HandleInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkExportFenceWin32HandleInfoKHR* forMarshaling);
 
-void unmarshal_VkExportFenceWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExportFenceWin32HandleInfoKHR* forUnmarshaling);
+void unmarshal_VkExportFenceWin32HandleInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkExportFenceWin32HandleInfoKHR* forUnmarshaling);
 
-void marshal_VkFenceGetWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkFenceGetWin32HandleInfoKHR* forMarshaling);
+void marshal_VkFenceGetWin32HandleInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                          const VkFenceGetWin32HandleInfoKHR* forMarshaling);
 
-void unmarshal_VkFenceGetWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFenceGetWin32HandleInfoKHR* forUnmarshaling);
+void unmarshal_VkFenceGetWin32HandleInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkFenceGetWin32HandleInfoKHR* forUnmarshaling);
 
 #define OP_vkImportFenceWin32HandleKHR 20231
 #define OP_vkGetFenceWin32HandleKHR 20232
 #endif
 #ifdef VK_KHR_external_fence_fd
-void marshal_VkImportFenceFdInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImportFenceFdInfoKHR* forMarshaling);
+void marshal_VkImportFenceFdInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                    const VkImportFenceFdInfoKHR* forMarshaling);
 
-void unmarshal_VkImportFenceFdInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportFenceFdInfoKHR* forUnmarshaling);
+void unmarshal_VkImportFenceFdInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                      VkImportFenceFdInfoKHR* forUnmarshaling);
 
-void marshal_VkFenceGetFdInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkFenceGetFdInfoKHR* forMarshaling);
+void marshal_VkFenceGetFdInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkFenceGetFdInfoKHR* forMarshaling);
 
-void unmarshal_VkFenceGetFdInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFenceGetFdInfoKHR* forUnmarshaling);
+void unmarshal_VkFenceGetFdInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkFenceGetFdInfoKHR* forUnmarshaling);
 
 #define OP_vkImportFenceFdKHR 20233
 #define OP_vkGetFenceFdKHR 20234
 #endif
 #ifdef VK_KHR_performance_query
 void marshal_VkPhysicalDevicePerformanceQueryFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDevicePerformanceQueryFeaturesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDevicePerformanceQueryFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDevicePerformanceQueryFeaturesKHR* forUnmarshaling);
 
 void marshal_VkPhysicalDevicePerformanceQueryPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDevicePerformanceQueryPropertiesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDevicePerformanceQueryPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDevicePerformanceQueryPropertiesKHR* forUnmarshaling);
 
-void marshal_VkPerformanceCounterKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPerformanceCounterKHR* forMarshaling);
+void marshal_VkPerformanceCounterKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkPerformanceCounterKHR* forMarshaling);
 
-void unmarshal_VkPerformanceCounterKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPerformanceCounterKHR* forUnmarshaling);
+void unmarshal_VkPerformanceCounterKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkPerformanceCounterKHR* forUnmarshaling);
 
 void marshal_VkPerformanceCounterDescriptionKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPerformanceCounterDescriptionKHR* forMarshaling);
 
 void unmarshal_VkPerformanceCounterDescriptionKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPerformanceCounterDescriptionKHR* forUnmarshaling);
 
 void marshal_VkQueryPoolPerformanceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkQueryPoolPerformanceCreateInfoKHR* forMarshaling);
 
 void unmarshal_VkQueryPoolPerformanceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkQueryPoolPerformanceCreateInfoKHR* forUnmarshaling);
 
-void marshal_VkPerformanceCounterResultKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPerformanceCounterResultKHR* forMarshaling);
+void marshal_VkPerformanceCounterResultKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkPerformanceCounterResultKHR* forMarshaling);
 
-void unmarshal_VkPerformanceCounterResultKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPerformanceCounterResultKHR* forUnmarshaling);
+void unmarshal_VkPerformanceCounterResultKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkPerformanceCounterResultKHR* forUnmarshaling);
 
-void marshal_VkAcquireProfilingLockInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAcquireProfilingLockInfoKHR* forMarshaling);
+void marshal_VkAcquireProfilingLockInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkAcquireProfilingLockInfoKHR* forMarshaling);
 
-void unmarshal_VkAcquireProfilingLockInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAcquireProfilingLockInfoKHR* forUnmarshaling);
+void unmarshal_VkAcquireProfilingLockInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkAcquireProfilingLockInfoKHR* forUnmarshaling);
 
-void marshal_VkPerformanceQuerySubmitInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPerformanceQuerySubmitInfoKHR* forMarshaling);
+void marshal_VkPerformanceQuerySubmitInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkPerformanceQuerySubmitInfoKHR* forMarshaling);
 
-void unmarshal_VkPerformanceQuerySubmitInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPerformanceQuerySubmitInfoKHR* forUnmarshaling);
+void unmarshal_VkPerformanceQuerySubmitInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkPerformanceQuerySubmitInfoKHR* forUnmarshaling);
 
 #define OP_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR 299033148
 #define OP_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR 282029987
@@ -3706,121 +2734,101 @@
 #define OP_vkReleaseProfilingLockKHR 223904011
 #endif
 #ifdef VK_KHR_maintenance2
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDevicePointClippingProperties, marshal_VkPhysicalDevicePointClippingPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDevicePointClippingProperties,
+                      marshal_VkPhysicalDevicePointClippingPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDevicePointClippingProperties, unmarshal_VkPhysicalDevicePointClippingPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDevicePointClippingProperties,
+                      unmarshal_VkPhysicalDevicePointClippingPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkRenderPassInputAttachmentAspectCreateInfo, marshal_VkRenderPassInputAttachmentAspectCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkRenderPassInputAttachmentAspectCreateInfo,
+                      marshal_VkRenderPassInputAttachmentAspectCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkRenderPassInputAttachmentAspectCreateInfo, unmarshal_VkRenderPassInputAttachmentAspectCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkRenderPassInputAttachmentAspectCreateInfo,
+                      unmarshal_VkRenderPassInputAttachmentAspectCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkInputAttachmentAspectReference, marshal_VkInputAttachmentAspectReferenceKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkInputAttachmentAspectReference,
+                      marshal_VkInputAttachmentAspectReferenceKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkInputAttachmentAspectReference, unmarshal_VkInputAttachmentAspectReferenceKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkInputAttachmentAspectReference,
+                      unmarshal_VkInputAttachmentAspectReferenceKHR)
 
 DEFINE_ALIAS_FUNCTION(marshal_VkImageViewUsageCreateInfo, marshal_VkImageViewUsageCreateInfoKHR)
 
 DEFINE_ALIAS_FUNCTION(unmarshal_VkImageViewUsageCreateInfo, unmarshal_VkImageViewUsageCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkPipelineTessellationDomainOriginStateCreateInfo, marshal_VkPipelineTessellationDomainOriginStateCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkPipelineTessellationDomainOriginStateCreateInfo,
+                      marshal_VkPipelineTessellationDomainOriginStateCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPipelineTessellationDomainOriginStateCreateInfo, unmarshal_VkPipelineTessellationDomainOriginStateCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPipelineTessellationDomainOriginStateCreateInfo,
+                      unmarshal_VkPipelineTessellationDomainOriginStateCreateInfoKHR)
 
 #endif
 #ifdef VK_KHR_get_surface_capabilities2
-void marshal_VkPhysicalDeviceSurfaceInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPhysicalDeviceSurfaceInfo2KHR* forMarshaling);
+void marshal_VkPhysicalDeviceSurfaceInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkPhysicalDeviceSurfaceInfo2KHR* forMarshaling);
 
-void unmarshal_VkPhysicalDeviceSurfaceInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSurfaceInfo2KHR* forUnmarshaling);
+void unmarshal_VkPhysicalDeviceSurfaceInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkPhysicalDeviceSurfaceInfo2KHR* forUnmarshaling);
 
-void marshal_VkSurfaceCapabilities2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSurfaceCapabilities2KHR* forMarshaling);
+void marshal_VkSurfaceCapabilities2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkSurfaceCapabilities2KHR* forMarshaling);
 
-void unmarshal_VkSurfaceCapabilities2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSurfaceCapabilities2KHR* forUnmarshaling);
+void unmarshal_VkSurfaceCapabilities2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkSurfaceCapabilities2KHR* forUnmarshaling);
 
-void marshal_VkSurfaceFormat2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSurfaceFormat2KHR* forMarshaling);
+void marshal_VkSurfaceFormat2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkSurfaceFormat2KHR* forMarshaling);
 
-void unmarshal_VkSurfaceFormat2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSurfaceFormat2KHR* forUnmarshaling);
+void unmarshal_VkSurfaceFormat2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkSurfaceFormat2KHR* forUnmarshaling);
 
 #define OP_vkGetPhysicalDeviceSurfaceCapabilities2KHR 20235
 #define OP_vkGetPhysicalDeviceSurfaceFormats2KHR 20236
 #endif
 #ifdef VK_KHR_variable_pointers
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceVariablePointersFeatures, marshal_VkPhysicalDeviceVariablePointerFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceVariablePointersFeatures,
+                      marshal_VkPhysicalDeviceVariablePointerFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceVariablePointersFeatures, unmarshal_VkPhysicalDeviceVariablePointerFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceVariablePointersFeatures,
+                      unmarshal_VkPhysicalDeviceVariablePointerFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceVariablePointersFeatures, marshal_VkPhysicalDeviceVariablePointersFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceVariablePointersFeatures,
+                      marshal_VkPhysicalDeviceVariablePointersFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceVariablePointersFeatures, unmarshal_VkPhysicalDeviceVariablePointersFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceVariablePointersFeatures,
+                      unmarshal_VkPhysicalDeviceVariablePointersFeaturesKHR)
 
 #endif
 #ifdef VK_KHR_get_display_properties2
-void marshal_VkDisplayProperties2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDisplayProperties2KHR* forMarshaling);
+void marshal_VkDisplayProperties2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkDisplayProperties2KHR* forMarshaling);
 
-void unmarshal_VkDisplayProperties2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayProperties2KHR* forUnmarshaling);
+void unmarshal_VkDisplayProperties2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkDisplayProperties2KHR* forUnmarshaling);
 
-void marshal_VkDisplayPlaneProperties2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDisplayPlaneProperties2KHR* forMarshaling);
+void marshal_VkDisplayPlaneProperties2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                          const VkDisplayPlaneProperties2KHR* forMarshaling);
 
-void unmarshal_VkDisplayPlaneProperties2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayPlaneProperties2KHR* forUnmarshaling);
+void unmarshal_VkDisplayPlaneProperties2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkDisplayPlaneProperties2KHR* forUnmarshaling);
 
-void marshal_VkDisplayModeProperties2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDisplayModeProperties2KHR* forMarshaling);
+void marshal_VkDisplayModeProperties2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkDisplayModeProperties2KHR* forMarshaling);
 
-void unmarshal_VkDisplayModeProperties2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayModeProperties2KHR* forUnmarshaling);
+void unmarshal_VkDisplayModeProperties2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkDisplayModeProperties2KHR* forUnmarshaling);
 
-void marshal_VkDisplayPlaneInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDisplayPlaneInfo2KHR* forMarshaling);
+void marshal_VkDisplayPlaneInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                    const VkDisplayPlaneInfo2KHR* forMarshaling);
 
-void unmarshal_VkDisplayPlaneInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayPlaneInfo2KHR* forUnmarshaling);
+void unmarshal_VkDisplayPlaneInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                      VkDisplayPlaneInfo2KHR* forUnmarshaling);
 
-void marshal_VkDisplayPlaneCapabilities2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDisplayPlaneCapabilities2KHR* forMarshaling);
+void marshal_VkDisplayPlaneCapabilities2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                            const VkDisplayPlaneCapabilities2KHR* forMarshaling);
 
-void unmarshal_VkDisplayPlaneCapabilities2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayPlaneCapabilities2KHR* forUnmarshaling);
+void unmarshal_VkDisplayPlaneCapabilities2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkDisplayPlaneCapabilities2KHR* forUnmarshaling);
 
 #define OP_vkGetPhysicalDeviceDisplayProperties2KHR 20237
 #define OP_vkGetPhysicalDeviceDisplayPlaneProperties2KHR 20238
@@ -3828,13 +2836,17 @@
 #define OP_vkGetDisplayPlaneCapabilities2KHR 20240
 #endif
 #ifdef VK_KHR_dedicated_allocation
-DEFINE_ALIAS_FUNCTION(marshal_VkMemoryDedicatedRequirements, marshal_VkMemoryDedicatedRequirementsKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkMemoryDedicatedRequirements,
+                      marshal_VkMemoryDedicatedRequirementsKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkMemoryDedicatedRequirements, unmarshal_VkMemoryDedicatedRequirementsKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkMemoryDedicatedRequirements,
+                      unmarshal_VkMemoryDedicatedRequirementsKHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkMemoryDedicatedAllocateInfo, marshal_VkMemoryDedicatedAllocateInfoKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkMemoryDedicatedAllocateInfo,
+                      marshal_VkMemoryDedicatedAllocateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkMemoryDedicatedAllocateInfo, unmarshal_VkMemoryDedicatedAllocateInfoKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkMemoryDedicatedAllocateInfo,
+                      unmarshal_VkMemoryDedicatedAllocateInfoKHR)
 
 #endif
 #ifdef VK_KHR_storage_buffer_storage_class
@@ -3842,25 +2854,33 @@
 #ifdef VK_KHR_relaxed_block_layout
 #endif
 #ifdef VK_KHR_get_memory_requirements2
-DEFINE_ALIAS_FUNCTION(marshal_VkBufferMemoryRequirementsInfo2, marshal_VkBufferMemoryRequirementsInfo2KHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkBufferMemoryRequirementsInfo2,
+                      marshal_VkBufferMemoryRequirementsInfo2KHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkBufferMemoryRequirementsInfo2, unmarshal_VkBufferMemoryRequirementsInfo2KHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkBufferMemoryRequirementsInfo2,
+                      unmarshal_VkBufferMemoryRequirementsInfo2KHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkImageMemoryRequirementsInfo2, marshal_VkImageMemoryRequirementsInfo2KHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkImageMemoryRequirementsInfo2,
+                      marshal_VkImageMemoryRequirementsInfo2KHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkImageMemoryRequirementsInfo2, unmarshal_VkImageMemoryRequirementsInfo2KHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkImageMemoryRequirementsInfo2,
+                      unmarshal_VkImageMemoryRequirementsInfo2KHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkImageSparseMemoryRequirementsInfo2, marshal_VkImageSparseMemoryRequirementsInfo2KHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkImageSparseMemoryRequirementsInfo2,
+                      marshal_VkImageSparseMemoryRequirementsInfo2KHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkImageSparseMemoryRequirementsInfo2, unmarshal_VkImageSparseMemoryRequirementsInfo2KHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkImageSparseMemoryRequirementsInfo2,
+                      unmarshal_VkImageSparseMemoryRequirementsInfo2KHR)
 
 DEFINE_ALIAS_FUNCTION(marshal_VkMemoryRequirements2, marshal_VkMemoryRequirements2KHR)
 
 DEFINE_ALIAS_FUNCTION(unmarshal_VkMemoryRequirements2, unmarshal_VkMemoryRequirements2KHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkSparseImageMemoryRequirements2, marshal_VkSparseImageMemoryRequirements2KHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkSparseImageMemoryRequirements2,
+                      marshal_VkSparseImageMemoryRequirements2KHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkSparseImageMemoryRequirements2, unmarshal_VkSparseImageMemoryRequirements2KHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkSparseImageMemoryRequirements2,
+                      unmarshal_VkSparseImageMemoryRequirements2KHR)
 
 #define OP_vkGetImageMemoryRequirements2KHR 20241
 #define OP_vkGetBufferMemoryRequirements2KHR 20242
@@ -3869,33 +2889,43 @@
 #ifdef VK_KHR_image_format_list
 DEFINE_ALIAS_FUNCTION(marshal_VkImageFormatListCreateInfo, marshal_VkImageFormatListCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkImageFormatListCreateInfo, unmarshal_VkImageFormatListCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkImageFormatListCreateInfo,
+                      unmarshal_VkImageFormatListCreateInfoKHR)
 
 #endif
 #ifdef VK_KHR_sampler_ycbcr_conversion
-DEFINE_ALIAS_FUNCTION(marshal_VkSamplerYcbcrConversionCreateInfo, marshal_VkSamplerYcbcrConversionCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkSamplerYcbcrConversionCreateInfo,
+                      marshal_VkSamplerYcbcrConversionCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkSamplerYcbcrConversionCreateInfo, unmarshal_VkSamplerYcbcrConversionCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkSamplerYcbcrConversionCreateInfo,
+                      unmarshal_VkSamplerYcbcrConversionCreateInfoKHR)
 
 DEFINE_ALIAS_FUNCTION(marshal_VkSamplerYcbcrConversionInfo, marshal_VkSamplerYcbcrConversionInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkSamplerYcbcrConversionInfo, unmarshal_VkSamplerYcbcrConversionInfoKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkSamplerYcbcrConversionInfo,
+                      unmarshal_VkSamplerYcbcrConversionInfoKHR)
 
 DEFINE_ALIAS_FUNCTION(marshal_VkBindImagePlaneMemoryInfo, marshal_VkBindImagePlaneMemoryInfoKHR)
 
 DEFINE_ALIAS_FUNCTION(unmarshal_VkBindImagePlaneMemoryInfo, unmarshal_VkBindImagePlaneMemoryInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkImagePlaneMemoryRequirementsInfo, marshal_VkImagePlaneMemoryRequirementsInfoKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkImagePlaneMemoryRequirementsInfo,
+                      marshal_VkImagePlaneMemoryRequirementsInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkImagePlaneMemoryRequirementsInfo, unmarshal_VkImagePlaneMemoryRequirementsInfoKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkImagePlaneMemoryRequirementsInfo,
+                      unmarshal_VkImagePlaneMemoryRequirementsInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceSamplerYcbcrConversionFeatures, marshal_VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceSamplerYcbcrConversionFeatures,
+                      marshal_VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceSamplerYcbcrConversionFeatures, unmarshal_VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceSamplerYcbcrConversionFeatures,
+                      unmarshal_VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkSamplerYcbcrConversionImageFormatProperties, marshal_VkSamplerYcbcrConversionImageFormatPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkSamplerYcbcrConversionImageFormatProperties,
+                      marshal_VkSamplerYcbcrConversionImageFormatPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkSamplerYcbcrConversionImageFormatProperties, unmarshal_VkSamplerYcbcrConversionImageFormatPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkSamplerYcbcrConversionImageFormatProperties,
+                      unmarshal_VkSamplerYcbcrConversionImageFormatPropertiesKHR)
 
 #define OP_vkCreateSamplerYcbcrConversionKHR 20244
 #define OP_vkDestroySamplerYcbcrConversionKHR 20245
@@ -3914,34 +2944,33 @@
 #endif
 #ifdef VK_KHR_portability_subset
 void marshal_VkPhysicalDevicePortabilitySubsetFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDevicePortabilitySubsetFeaturesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDevicePortabilitySubsetFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDevicePortabilitySubsetFeaturesKHR* forUnmarshaling);
 
 void marshal_VkPhysicalDevicePortabilitySubsetPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDevicePortabilitySubsetPropertiesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDevicePortabilitySubsetPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDevicePortabilitySubsetPropertiesKHR* forUnmarshaling);
 
 #endif
 #ifdef VK_KHR_maintenance3
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceMaintenance3Properties, marshal_VkPhysicalDeviceMaintenance3PropertiesKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceMaintenance3Properties,
+                      marshal_VkPhysicalDeviceMaintenance3PropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceMaintenance3Properties, unmarshal_VkPhysicalDeviceMaintenance3PropertiesKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceMaintenance3Properties,
+                      unmarshal_VkPhysicalDeviceMaintenance3PropertiesKHR)
 
 DEFINE_ALIAS_FUNCTION(marshal_VkDescriptorSetLayoutSupport, marshal_VkDescriptorSetLayoutSupportKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkDescriptorSetLayoutSupport, unmarshal_VkDescriptorSetLayoutSupportKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkDescriptorSetLayoutSupport,
+                      unmarshal_VkDescriptorSetLayoutSupportKHR)
 
 #define OP_vkGetDescriptorSetLayoutSupportKHR 20248
 #endif
@@ -3950,32 +2979,36 @@
 #define OP_vkCmdDrawIndexedIndirectCountKHR 20250
 #endif
 #ifdef VK_KHR_shader_subgroup_extended_types
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures, marshal_VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures,
+                      marshal_VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures, unmarshal_VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures,
+                      unmarshal_VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR)
 
 #endif
 #ifdef VK_KHR_8bit_storage
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDevice8BitStorageFeatures, marshal_VkPhysicalDevice8BitStorageFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDevice8BitStorageFeatures,
+                      marshal_VkPhysicalDevice8BitStorageFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDevice8BitStorageFeatures, unmarshal_VkPhysicalDevice8BitStorageFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDevice8BitStorageFeatures,
+                      unmarshal_VkPhysicalDevice8BitStorageFeaturesKHR)
 
 #endif
 #ifdef VK_KHR_shader_atomic_int64
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceShaderAtomicInt64Features, marshal_VkPhysicalDeviceShaderAtomicInt64FeaturesKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceShaderAtomicInt64Features,
+                      marshal_VkPhysicalDeviceShaderAtomicInt64FeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceShaderAtomicInt64Features, unmarshal_VkPhysicalDeviceShaderAtomicInt64FeaturesKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceShaderAtomicInt64Features,
+                      unmarshal_VkPhysicalDeviceShaderAtomicInt64FeaturesKHR)
 
 #endif
 #ifdef VK_KHR_shader_clock
 void marshal_VkPhysicalDeviceShaderClockFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceShaderClockFeaturesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShaderClockFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceShaderClockFeaturesKHR* forUnmarshaling);
 
 #endif
@@ -3984,45 +3017,59 @@
 
 DEFINE_ALIAS_FUNCTION(unmarshal_VkConformanceVersion, unmarshal_VkConformanceVersionKHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceDriverProperties, marshal_VkPhysicalDeviceDriverPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceDriverProperties,
+                      marshal_VkPhysicalDeviceDriverPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceDriverProperties, unmarshal_VkPhysicalDeviceDriverPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceDriverProperties,
+                      unmarshal_VkPhysicalDeviceDriverPropertiesKHR)
 
 #endif
 #ifdef VK_KHR_shader_float_controls
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceFloatControlsProperties, marshal_VkPhysicalDeviceFloatControlsPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceFloatControlsProperties,
+                      marshal_VkPhysicalDeviceFloatControlsPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceFloatControlsProperties, unmarshal_VkPhysicalDeviceFloatControlsPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceFloatControlsProperties,
+                      unmarshal_VkPhysicalDeviceFloatControlsPropertiesKHR)
 
 #endif
 #ifdef VK_KHR_depth_stencil_resolve
-DEFINE_ALIAS_FUNCTION(marshal_VkSubpassDescriptionDepthStencilResolve, marshal_VkSubpassDescriptionDepthStencilResolveKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkSubpassDescriptionDepthStencilResolve,
+                      marshal_VkSubpassDescriptionDepthStencilResolveKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkSubpassDescriptionDepthStencilResolve, unmarshal_VkSubpassDescriptionDepthStencilResolveKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkSubpassDescriptionDepthStencilResolve,
+                      unmarshal_VkSubpassDescriptionDepthStencilResolveKHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceDepthStencilResolveProperties, marshal_VkPhysicalDeviceDepthStencilResolvePropertiesKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceDepthStencilResolveProperties,
+                      marshal_VkPhysicalDeviceDepthStencilResolvePropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceDepthStencilResolveProperties, unmarshal_VkPhysicalDeviceDepthStencilResolvePropertiesKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceDepthStencilResolveProperties,
+                      unmarshal_VkPhysicalDeviceDepthStencilResolvePropertiesKHR)
 
 #endif
 #ifdef VK_KHR_swapchain_mutable_format
 #endif
 #ifdef VK_KHR_timeline_semaphore
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceTimelineSemaphoreFeatures, marshal_VkPhysicalDeviceTimelineSemaphoreFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceTimelineSemaphoreFeatures,
+                      marshal_VkPhysicalDeviceTimelineSemaphoreFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceTimelineSemaphoreFeatures, unmarshal_VkPhysicalDeviceTimelineSemaphoreFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceTimelineSemaphoreFeatures,
+                      unmarshal_VkPhysicalDeviceTimelineSemaphoreFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceTimelineSemaphoreProperties, marshal_VkPhysicalDeviceTimelineSemaphorePropertiesKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceTimelineSemaphoreProperties,
+                      marshal_VkPhysicalDeviceTimelineSemaphorePropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceTimelineSemaphoreProperties, unmarshal_VkPhysicalDeviceTimelineSemaphorePropertiesKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceTimelineSemaphoreProperties,
+                      unmarshal_VkPhysicalDeviceTimelineSemaphorePropertiesKHR)
 
 DEFINE_ALIAS_FUNCTION(marshal_VkSemaphoreTypeCreateInfo, marshal_VkSemaphoreTypeCreateInfoKHR)
 
 DEFINE_ALIAS_FUNCTION(unmarshal_VkSemaphoreTypeCreateInfo, unmarshal_VkSemaphoreTypeCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkTimelineSemaphoreSubmitInfo, marshal_VkTimelineSemaphoreSubmitInfoKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkTimelineSemaphoreSubmitInfo,
+                      marshal_VkTimelineSemaphoreSubmitInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkTimelineSemaphoreSubmitInfo, unmarshal_VkTimelineSemaphoreSubmitInfoKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkTimelineSemaphoreSubmitInfo,
+                      unmarshal_VkTimelineSemaphoreSubmitInfoKHR)
 
 DEFINE_ALIAS_FUNCTION(marshal_VkSemaphoreWaitInfo, marshal_VkSemaphoreWaitInfoKHR)
 
@@ -4037,72 +3084,62 @@
 #define OP_vkSignalSemaphoreKHR 269919108
 #endif
 #ifdef VK_KHR_vulkan_memory_model
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceVulkanMemoryModelFeatures, marshal_VkPhysicalDeviceVulkanMemoryModelFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceVulkanMemoryModelFeatures,
+                      marshal_VkPhysicalDeviceVulkanMemoryModelFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceVulkanMemoryModelFeatures, unmarshal_VkPhysicalDeviceVulkanMemoryModelFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceVulkanMemoryModelFeatures,
+                      unmarshal_VkPhysicalDeviceVulkanMemoryModelFeaturesKHR)
 
 #endif
 #ifdef VK_KHR_shader_terminate_invocation
 void marshal_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* forUnmarshaling);
 
 #endif
 #ifdef VK_KHR_fragment_shading_rate
 void marshal_VkFragmentShadingRateAttachmentInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkFragmentShadingRateAttachmentInfoKHR* forMarshaling);
 
 void unmarshal_VkFragmentShadingRateAttachmentInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkFragmentShadingRateAttachmentInfoKHR* forUnmarshaling);
 
 void marshal_VkPipelineFragmentShadingRateStateCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineFragmentShadingRateStateCreateInfoKHR* forMarshaling);
 
 void unmarshal_VkPipelineFragmentShadingRateStateCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineFragmentShadingRateStateCreateInfoKHR* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateFeaturesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceFragmentShadingRateFeaturesKHR* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRatePropertiesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceFragmentShadingRatePropertiesKHR* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceFragmentShadingRateKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceFragmentShadingRateKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceFragmentShadingRateKHR* forUnmarshaling);
 
 #define OP_vkGetPhysicalDeviceFragmentShadingRatesKHR 272978593
@@ -4112,69 +3149,81 @@
 #endif
 #ifdef VK_KHR_surface_protected_capabilities
 void marshal_VkSurfaceProtectedCapabilitiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkSurfaceProtectedCapabilitiesKHR* forMarshaling);
 
 void unmarshal_VkSurfaceProtectedCapabilitiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkSurfaceProtectedCapabilitiesKHR* forUnmarshaling);
 
 #endif
 #ifdef VK_KHR_separate_depth_stencil_layouts
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures, marshal_VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures,
+                      marshal_VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures, unmarshal_VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures,
+                      unmarshal_VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkAttachmentReferenceStencilLayout, marshal_VkAttachmentReferenceStencilLayoutKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkAttachmentReferenceStencilLayout,
+                      marshal_VkAttachmentReferenceStencilLayoutKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkAttachmentReferenceStencilLayout, unmarshal_VkAttachmentReferenceStencilLayoutKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkAttachmentReferenceStencilLayout,
+                      unmarshal_VkAttachmentReferenceStencilLayoutKHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkAttachmentDescriptionStencilLayout, marshal_VkAttachmentDescriptionStencilLayoutKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkAttachmentDescriptionStencilLayout,
+                      marshal_VkAttachmentDescriptionStencilLayoutKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkAttachmentDescriptionStencilLayout, unmarshal_VkAttachmentDescriptionStencilLayoutKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkAttachmentDescriptionStencilLayout,
+                      unmarshal_VkAttachmentDescriptionStencilLayoutKHR)
 
 #endif
 #ifdef VK_KHR_present_wait
 void marshal_VkPhysicalDevicePresentWaitFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDevicePresentWaitFeaturesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDevicePresentWaitFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDevicePresentWaitFeaturesKHR* forUnmarshaling);
 
 #define OP_vkWaitForPresentKHR 263215580
 #endif
 #ifdef VK_KHR_uniform_buffer_standard_layout
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceUniformBufferStandardLayoutFeatures, marshal_VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceUniformBufferStandardLayoutFeatures,
+                      marshal_VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceUniformBufferStandardLayoutFeatures, unmarshal_VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceUniformBufferStandardLayoutFeatures,
+                      unmarshal_VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR)
 
 #endif
 #ifdef VK_KHR_buffer_device_address
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceBufferDeviceAddressFeatures, marshal_VkPhysicalDeviceBufferDeviceAddressFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceBufferDeviceAddressFeatures,
+                      marshal_VkPhysicalDeviceBufferDeviceAddressFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceBufferDeviceAddressFeatures, unmarshal_VkPhysicalDeviceBufferDeviceAddressFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceBufferDeviceAddressFeatures,
+                      unmarshal_VkPhysicalDeviceBufferDeviceAddressFeaturesKHR)
 
 DEFINE_ALIAS_FUNCTION(marshal_VkBufferDeviceAddressInfo, marshal_VkBufferDeviceAddressInfoKHR)
 
 DEFINE_ALIAS_FUNCTION(unmarshal_VkBufferDeviceAddressInfo, unmarshal_VkBufferDeviceAddressInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkBufferOpaqueCaptureAddressCreateInfo, marshal_VkBufferOpaqueCaptureAddressCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkBufferOpaqueCaptureAddressCreateInfo,
+                      marshal_VkBufferOpaqueCaptureAddressCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkBufferOpaqueCaptureAddressCreateInfo, unmarshal_VkBufferOpaqueCaptureAddressCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkBufferOpaqueCaptureAddressCreateInfo,
+                      unmarshal_VkBufferOpaqueCaptureAddressCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkMemoryOpaqueCaptureAddressAllocateInfo, marshal_VkMemoryOpaqueCaptureAddressAllocateInfoKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkMemoryOpaqueCaptureAddressAllocateInfo,
+                      marshal_VkMemoryOpaqueCaptureAddressAllocateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkMemoryOpaqueCaptureAddressAllocateInfo, unmarshal_VkMemoryOpaqueCaptureAddressAllocateInfoKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkMemoryOpaqueCaptureAddressAllocateInfo,
+                      unmarshal_VkMemoryOpaqueCaptureAddressAllocateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkDeviceMemoryOpaqueCaptureAddressInfo, marshal_VkDeviceMemoryOpaqueCaptureAddressInfoKHR)
+DEFINE_ALIAS_FUNCTION(marshal_VkDeviceMemoryOpaqueCaptureAddressInfo,
+                      marshal_VkDeviceMemoryOpaqueCaptureAddressInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkDeviceMemoryOpaqueCaptureAddressInfo, unmarshal_VkDeviceMemoryOpaqueCaptureAddressInfoKHR)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkDeviceMemoryOpaqueCaptureAddressInfo,
+                      unmarshal_VkDeviceMemoryOpaqueCaptureAddressInfoKHR)
 
 #define OP_vkGetBufferDeviceAddressKHR 219261480
 #define OP_vkGetBufferOpaqueCaptureAddressKHR 285631711
@@ -4189,73 +3238,54 @@
 #endif
 #ifdef VK_KHR_pipeline_executable_properties
 void marshal_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* forUnmarshaling);
 
-void marshal_VkPipelineInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineInfoKHR* forMarshaling);
+void marshal_VkPipelineInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                               const VkPipelineInfoKHR* forMarshaling);
 
-void unmarshal_VkPipelineInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineInfoKHR* forUnmarshaling);
+void unmarshal_VkPipelineInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                 VkPipelineInfoKHR* forUnmarshaling);
 
 void marshal_VkPipelineExecutablePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineExecutablePropertiesKHR* forMarshaling);
 
 void unmarshal_VkPipelineExecutablePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineExecutablePropertiesKHR* forUnmarshaling);
 
-void marshal_VkPipelineExecutableInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineExecutableInfoKHR* forMarshaling);
+void marshal_VkPipelineExecutableInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkPipelineExecutableInfoKHR* forMarshaling);
 
-void unmarshal_VkPipelineExecutableInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineExecutableInfoKHR* forUnmarshaling);
+void unmarshal_VkPipelineExecutableInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkPipelineExecutableInfoKHR* forUnmarshaling);
 
 void marshal_VkPipelineExecutableStatisticValueKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineExecutableStatisticValueKHR* forMarshaling);
 
 void unmarshal_VkPipelineExecutableStatisticValueKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineExecutableStatisticValueKHR* forUnmarshaling);
 
 void marshal_VkPipelineExecutableStatisticKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineExecutableStatisticKHR* forMarshaling);
 
-void unmarshal_VkPipelineExecutableStatisticKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineExecutableStatisticKHR* forUnmarshaling);
+void unmarshal_VkPipelineExecutableStatisticKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkPipelineExecutableStatisticKHR* forUnmarshaling);
 
 void marshal_VkPipelineExecutableInternalRepresentationKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineExecutableInternalRepresentationKHR* forMarshaling);
 
 void unmarshal_VkPipelineExecutableInternalRepresentationKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineExecutableInternalRepresentationKHR* forUnmarshaling);
 
 #define OP_vkGetPipelineExecutablePropertiesKHR 269458798
@@ -4264,164 +3294,112 @@
 #endif
 #ifdef VK_KHR_shader_integer_dot_product
 void marshal_VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR* forUnmarshaling);
 
 #endif
 #ifdef VK_KHR_pipeline_library
-void marshal_VkPipelineLibraryCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineLibraryCreateInfoKHR* forMarshaling);
+void marshal_VkPipelineLibraryCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                            const VkPipelineLibraryCreateInfoKHR* forMarshaling);
 
-void unmarshal_VkPipelineLibraryCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineLibraryCreateInfoKHR* forUnmarshaling);
+void unmarshal_VkPipelineLibraryCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkPipelineLibraryCreateInfoKHR* forUnmarshaling);
 
 #endif
 #ifdef VK_KHR_shader_non_semantic_info
 #endif
 #ifdef VK_KHR_present_id
-void marshal_VkPresentIdKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPresentIdKHR* forMarshaling);
+void marshal_VkPresentIdKHR(VulkanStream* vkStream, VkStructureType rootType,
+                            const VkPresentIdKHR* forMarshaling);
 
-void unmarshal_VkPresentIdKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPresentIdKHR* forUnmarshaling);
+void unmarshal_VkPresentIdKHR(VulkanStream* vkStream, VkStructureType rootType,
+                              VkPresentIdKHR* forUnmarshaling);
 
 void marshal_VkPhysicalDevicePresentIdFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDevicePresentIdFeaturesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDevicePresentIdFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDevicePresentIdFeaturesKHR* forUnmarshaling);
 
 #endif
 #ifdef VK_KHR_video_encode_queue
-void marshal_VkVideoEncodeInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoEncodeInfoKHR* forMarshaling);
+void marshal_VkVideoEncodeInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkVideoEncodeInfoKHR* forMarshaling);
 
-void unmarshal_VkVideoEncodeInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeInfoKHR* forUnmarshaling);
+void unmarshal_VkVideoEncodeInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkVideoEncodeInfoKHR* forUnmarshaling);
 
-void marshal_VkVideoEncodeRateControlInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoEncodeRateControlInfoKHR* forMarshaling);
+void marshal_VkVideoEncodeRateControlInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkVideoEncodeRateControlInfoKHR* forMarshaling);
 
-void unmarshal_VkVideoEncodeRateControlInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeRateControlInfoKHR* forUnmarshaling);
+void unmarshal_VkVideoEncodeRateControlInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkVideoEncodeRateControlInfoKHR* forUnmarshaling);
 
 #define OP_vkCmdEncodeVideoKHR 295869356
 #endif
 #ifdef VK_KHR_synchronization2
-void marshal_VkMemoryBarrier2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMemoryBarrier2KHR* forMarshaling);
+void marshal_VkMemoryBarrier2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkMemoryBarrier2KHR* forMarshaling);
 
-void unmarshal_VkMemoryBarrier2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryBarrier2KHR* forUnmarshaling);
+void unmarshal_VkMemoryBarrier2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkMemoryBarrier2KHR* forUnmarshaling);
 
-void marshal_VkBufferMemoryBarrier2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBufferMemoryBarrier2KHR* forMarshaling);
+void marshal_VkBufferMemoryBarrier2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkBufferMemoryBarrier2KHR* forMarshaling);
 
-void unmarshal_VkBufferMemoryBarrier2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferMemoryBarrier2KHR* forUnmarshaling);
+void unmarshal_VkBufferMemoryBarrier2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkBufferMemoryBarrier2KHR* forUnmarshaling);
 
-void marshal_VkImageMemoryBarrier2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageMemoryBarrier2KHR* forMarshaling);
+void marshal_VkImageMemoryBarrier2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkImageMemoryBarrier2KHR* forMarshaling);
 
-void unmarshal_VkImageMemoryBarrier2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageMemoryBarrier2KHR* forUnmarshaling);
+void unmarshal_VkImageMemoryBarrier2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkImageMemoryBarrier2KHR* forUnmarshaling);
 
-void marshal_VkDependencyInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDependencyInfoKHR* forMarshaling);
+void marshal_VkDependencyInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkDependencyInfoKHR* forMarshaling);
 
-void unmarshal_VkDependencyInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDependencyInfoKHR* forUnmarshaling);
+void unmarshal_VkDependencyInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkDependencyInfoKHR* forUnmarshaling);
 
-void marshal_VkSemaphoreSubmitInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSemaphoreSubmitInfoKHR* forMarshaling);
+void marshal_VkSemaphoreSubmitInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkSemaphoreSubmitInfoKHR* forMarshaling);
 
-void unmarshal_VkSemaphoreSubmitInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSemaphoreSubmitInfoKHR* forUnmarshaling);
+void unmarshal_VkSemaphoreSubmitInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkSemaphoreSubmitInfoKHR* forUnmarshaling);
 
-void marshal_VkCommandBufferSubmitInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCommandBufferSubmitInfoKHR* forMarshaling);
+void marshal_VkCommandBufferSubmitInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                          const VkCommandBufferSubmitInfoKHR* forMarshaling);
 
-void unmarshal_VkCommandBufferSubmitInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCommandBufferSubmitInfoKHR* forUnmarshaling);
+void unmarshal_VkCommandBufferSubmitInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkCommandBufferSubmitInfoKHR* forUnmarshaling);
 
-void marshal_VkSubmitInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSubmitInfo2KHR* forMarshaling);
+void marshal_VkSubmitInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                              const VkSubmitInfo2KHR* forMarshaling);
 
-void unmarshal_VkSubmitInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubmitInfo2KHR* forUnmarshaling);
+void unmarshal_VkSubmitInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                VkSubmitInfo2KHR* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceSynchronization2FeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceSynchronization2FeaturesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceSynchronization2FeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceSynchronization2FeaturesKHR* forUnmarshaling);
 
 #define OP_vkCmdSetEvent2KHR 270411360
@@ -4432,173 +3410,117 @@
 #define OP_vkQueueSubmit2KHR 293024240
 #define OP_vkCmdWriteBufferMarker2AMD 224701394
 void marshal_VkQueueFamilyCheckpointProperties2NV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkQueueFamilyCheckpointProperties2NV* forMarshaling);
 
 void unmarshal_VkQueueFamilyCheckpointProperties2NV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkQueueFamilyCheckpointProperties2NV* forUnmarshaling);
 
-void marshal_VkCheckpointData2NV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCheckpointData2NV* forMarshaling);
+void marshal_VkCheckpointData2NV(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkCheckpointData2NV* forMarshaling);
 
-void unmarshal_VkCheckpointData2NV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCheckpointData2NV* forUnmarshaling);
+void unmarshal_VkCheckpointData2NV(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkCheckpointData2NV* forUnmarshaling);
 
 #define OP_vkGetQueueCheckpointData2NV 292063036
 #endif
 #ifdef VK_KHR_shader_subgroup_uniform_control_flow
 void marshal_VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR* forUnmarshaling);
 
 #endif
 #ifdef VK_KHR_zero_initialize_workgroup_memory
 void marshal_VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR* forUnmarshaling);
 
 #endif
 #ifdef VK_KHR_workgroup_memory_explicit_layout
 void marshal_VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR* forUnmarshaling);
 
 #endif
 #ifdef VK_KHR_copy_commands2
-void marshal_VkBufferCopy2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBufferCopy2KHR* forMarshaling);
+void marshal_VkBufferCopy2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                              const VkBufferCopy2KHR* forMarshaling);
 
-void unmarshal_VkBufferCopy2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferCopy2KHR* forUnmarshaling);
+void unmarshal_VkBufferCopy2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                VkBufferCopy2KHR* forUnmarshaling);
 
-void marshal_VkCopyBufferInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCopyBufferInfo2KHR* forMarshaling);
+void marshal_VkCopyBufferInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkCopyBufferInfo2KHR* forMarshaling);
 
-void unmarshal_VkCopyBufferInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCopyBufferInfo2KHR* forUnmarshaling);
+void unmarshal_VkCopyBufferInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkCopyBufferInfo2KHR* forUnmarshaling);
 
-void marshal_VkImageCopy2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageCopy2KHR* forMarshaling);
+void marshal_VkImageCopy2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                             const VkImageCopy2KHR* forMarshaling);
 
-void unmarshal_VkImageCopy2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageCopy2KHR* forUnmarshaling);
+void unmarshal_VkImageCopy2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                               VkImageCopy2KHR* forUnmarshaling);
 
-void marshal_VkCopyImageInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCopyImageInfo2KHR* forMarshaling);
+void marshal_VkCopyImageInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkCopyImageInfo2KHR* forMarshaling);
 
-void unmarshal_VkCopyImageInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCopyImageInfo2KHR* forUnmarshaling);
+void unmarshal_VkCopyImageInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkCopyImageInfo2KHR* forUnmarshaling);
 
-void marshal_VkBufferImageCopy2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBufferImageCopy2KHR* forMarshaling);
+void marshal_VkBufferImageCopy2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkBufferImageCopy2KHR* forMarshaling);
 
-void unmarshal_VkBufferImageCopy2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferImageCopy2KHR* forUnmarshaling);
+void unmarshal_VkBufferImageCopy2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkBufferImageCopy2KHR* forUnmarshaling);
 
-void marshal_VkCopyBufferToImageInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCopyBufferToImageInfo2KHR* forMarshaling);
+void marshal_VkCopyBufferToImageInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkCopyBufferToImageInfo2KHR* forMarshaling);
 
-void unmarshal_VkCopyBufferToImageInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCopyBufferToImageInfo2KHR* forUnmarshaling);
+void unmarshal_VkCopyBufferToImageInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkCopyBufferToImageInfo2KHR* forUnmarshaling);
 
-void marshal_VkCopyImageToBufferInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCopyImageToBufferInfo2KHR* forMarshaling);
+void marshal_VkCopyImageToBufferInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkCopyImageToBufferInfo2KHR* forMarshaling);
 
-void unmarshal_VkCopyImageToBufferInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCopyImageToBufferInfo2KHR* forUnmarshaling);
+void unmarshal_VkCopyImageToBufferInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkCopyImageToBufferInfo2KHR* forUnmarshaling);
 
-void marshal_VkImageBlit2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageBlit2KHR* forMarshaling);
+void marshal_VkImageBlit2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                             const VkImageBlit2KHR* forMarshaling);
 
-void unmarshal_VkImageBlit2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageBlit2KHR* forUnmarshaling);
+void unmarshal_VkImageBlit2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                               VkImageBlit2KHR* forUnmarshaling);
 
-void marshal_VkBlitImageInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBlitImageInfo2KHR* forMarshaling);
+void marshal_VkBlitImageInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkBlitImageInfo2KHR* forMarshaling);
 
-void unmarshal_VkBlitImageInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBlitImageInfo2KHR* forUnmarshaling);
+void unmarshal_VkBlitImageInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkBlitImageInfo2KHR* forUnmarshaling);
 
-void marshal_VkImageResolve2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageResolve2KHR* forMarshaling);
+void marshal_VkImageResolve2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                const VkImageResolve2KHR* forMarshaling);
 
-void unmarshal_VkImageResolve2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageResolve2KHR* forUnmarshaling);
+void unmarshal_VkImageResolve2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkImageResolve2KHR* forUnmarshaling);
 
-void marshal_VkResolveImageInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkResolveImageInfo2KHR* forMarshaling);
+void marshal_VkResolveImageInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                    const VkResolveImageInfo2KHR* forMarshaling);
 
-void unmarshal_VkResolveImageInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkResolveImageInfo2KHR* forUnmarshaling);
+void unmarshal_VkResolveImageInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                      VkResolveImageInfo2KHR* forUnmarshaling);
 
 #define OP_vkCmdCopyBuffer2KHR 247893766
 #define OP_vkCmdCopyImage2KHR 227008250
@@ -4608,56 +3530,44 @@
 #define OP_vkCmdResolveImage2KHR 254857232
 #endif
 #ifdef VK_KHR_format_feature_flags2
-void marshal_VkFormatProperties3KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkFormatProperties3KHR* forMarshaling);
+void marshal_VkFormatProperties3KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                    const VkFormatProperties3KHR* forMarshaling);
 
-void unmarshal_VkFormatProperties3KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFormatProperties3KHR* forUnmarshaling);
+void unmarshal_VkFormatProperties3KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                      VkFormatProperties3KHR* forUnmarshaling);
 
 #endif
 #ifdef VK_KHR_maintenance4
 void marshal_VkPhysicalDeviceMaintenance4FeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceMaintenance4FeaturesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceMaintenance4FeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceMaintenance4FeaturesKHR* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceMaintenance4PropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceMaintenance4PropertiesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceMaintenance4PropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceMaintenance4PropertiesKHR* forUnmarshaling);
 
 void marshal_VkDeviceBufferMemoryRequirementsKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkDeviceBufferMemoryRequirementsKHR* forMarshaling);
 
 void unmarshal_VkDeviceBufferMemoryRequirementsKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkDeviceBufferMemoryRequirementsKHR* forUnmarshaling);
 
 void marshal_VkDeviceImageMemoryRequirementsKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkDeviceImageMemoryRequirementsKHR* forMarshaling);
 
 void unmarshal_VkDeviceImageMemoryRequirementsKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkDeviceImageMemoryRequirementsKHR* forUnmarshaling);
 
 #define OP_vkGetDeviceBufferMemoryRequirementsKHR 201613635
@@ -4665,15 +3575,11 @@
 #define OP_vkGetDeviceImageSparseMemoryRequirementsKHR 275585477
 #endif
 #ifdef VK_ANDROID_native_buffer
-void marshal_VkNativeBufferANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkNativeBufferANDROID* forMarshaling);
+void marshal_VkNativeBufferANDROID(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkNativeBufferANDROID* forMarshaling);
 
-void unmarshal_VkNativeBufferANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkNativeBufferANDROID* forUnmarshaling);
+void unmarshal_VkNativeBufferANDROID(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkNativeBufferANDROID* forUnmarshaling);
 
 #define OP_vkGetSwapchainGrallocUsageANDROID 20251
 #define OP_vkAcquireImageANDROID 20252
@@ -4681,13 +3587,11 @@
 #endif
 #ifdef VK_EXT_debug_report
 void marshal_VkDebugReportCallbackCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkDebugReportCallbackCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkDebugReportCallbackCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkDebugReportCallbackCreateInfoEXT* forUnmarshaling);
 
 #define OP_vkCreateDebugReportCallbackEXT 20254
@@ -4702,13 +3606,11 @@
 #endif
 #ifdef VK_AMD_rasterization_order
 void marshal_VkPipelineRasterizationStateRasterizationOrderAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineRasterizationStateRasterizationOrderAMD* forMarshaling);
 
 void unmarshal_VkPipelineRasterizationStateRasterizationOrderAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineRasterizationStateRasterizationOrderAMD* forUnmarshaling);
 
 #endif
@@ -4717,35 +3619,23 @@
 #ifdef VK_AMD_shader_explicit_vertex_parameter
 #endif
 #ifdef VK_EXT_debug_marker
-void marshal_VkDebugMarkerObjectNameInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDebugMarkerObjectNameInfoEXT* forMarshaling);
+void marshal_VkDebugMarkerObjectNameInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                            const VkDebugMarkerObjectNameInfoEXT* forMarshaling);
 
-void unmarshal_VkDebugMarkerObjectNameInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDebugMarkerObjectNameInfoEXT* forUnmarshaling);
+void unmarshal_VkDebugMarkerObjectNameInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkDebugMarkerObjectNameInfoEXT* forUnmarshaling);
 
-void marshal_VkDebugMarkerObjectTagInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDebugMarkerObjectTagInfoEXT* forMarshaling);
+void marshal_VkDebugMarkerObjectTagInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkDebugMarkerObjectTagInfoEXT* forMarshaling);
 
-void unmarshal_VkDebugMarkerObjectTagInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDebugMarkerObjectTagInfoEXT* forUnmarshaling);
+void unmarshal_VkDebugMarkerObjectTagInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkDebugMarkerObjectTagInfoEXT* forUnmarshaling);
 
-void marshal_VkDebugMarkerMarkerInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDebugMarkerMarkerInfoEXT* forMarshaling);
+void marshal_VkDebugMarkerMarkerInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                        const VkDebugMarkerMarkerInfoEXT* forMarshaling);
 
-void unmarshal_VkDebugMarkerMarkerInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDebugMarkerMarkerInfoEXT* forUnmarshaling);
+void unmarshal_VkDebugMarkerMarkerInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkDebugMarkerMarkerInfoEXT* forUnmarshaling);
 
 #define OP_vkDebugMarkerSetObjectTagEXT 20257
 #define OP_vkDebugMarkerSetObjectNameEXT 20258
@@ -4757,65 +3647,53 @@
 #endif
 #ifdef VK_NV_dedicated_allocation
 void marshal_VkDedicatedAllocationImageCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkDedicatedAllocationImageCreateInfoNV* forMarshaling);
 
 void unmarshal_VkDedicatedAllocationImageCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkDedicatedAllocationImageCreateInfoNV* forUnmarshaling);
 
 void marshal_VkDedicatedAllocationBufferCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkDedicatedAllocationBufferCreateInfoNV* forMarshaling);
 
 void unmarshal_VkDedicatedAllocationBufferCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkDedicatedAllocationBufferCreateInfoNV* forUnmarshaling);
 
 void marshal_VkDedicatedAllocationMemoryAllocateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkDedicatedAllocationMemoryAllocateInfoNV* forMarshaling);
 
 void unmarshal_VkDedicatedAllocationMemoryAllocateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkDedicatedAllocationMemoryAllocateInfoNV* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_transform_feedback
 void marshal_VkPhysicalDeviceTransformFeedbackFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceTransformFeedbackFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceTransformFeedbackFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceTransformFeedbackFeaturesEXT* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceTransformFeedbackPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceTransformFeedbackPropertiesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceTransformFeedbackPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceTransformFeedbackPropertiesEXT* forUnmarshaling);
 
 void marshal_VkPipelineRasterizationStateStreamCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineRasterizationStateStreamCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkPipelineRasterizationStateStreamCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineRasterizationStateStreamCreateInfoEXT* forUnmarshaling);
 
 #define OP_vkCmdBindTransformFeedbackBuffersEXT 267779978
@@ -4826,35 +3704,23 @@
 #define OP_vkCmdDrawIndirectByteCountEXT 285235943
 #endif
 #ifdef VK_NVX_binary_import
-void marshal_VkCuModuleCreateInfoNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCuModuleCreateInfoNVX* forMarshaling);
+void marshal_VkCuModuleCreateInfoNVX(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkCuModuleCreateInfoNVX* forMarshaling);
 
-void unmarshal_VkCuModuleCreateInfoNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCuModuleCreateInfoNVX* forUnmarshaling);
+void unmarshal_VkCuModuleCreateInfoNVX(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkCuModuleCreateInfoNVX* forUnmarshaling);
 
-void marshal_VkCuFunctionCreateInfoNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCuFunctionCreateInfoNVX* forMarshaling);
+void marshal_VkCuFunctionCreateInfoNVX(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkCuFunctionCreateInfoNVX* forMarshaling);
 
-void unmarshal_VkCuFunctionCreateInfoNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCuFunctionCreateInfoNVX* forUnmarshaling);
+void unmarshal_VkCuFunctionCreateInfoNVX(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkCuFunctionCreateInfoNVX* forUnmarshaling);
 
-void marshal_VkCuLaunchInfoNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCuLaunchInfoNVX* forMarshaling);
+void marshal_VkCuLaunchInfoNVX(VulkanStream* vkStream, VkStructureType rootType,
+                               const VkCuLaunchInfoNVX* forMarshaling);
 
-void unmarshal_VkCuLaunchInfoNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCuLaunchInfoNVX* forUnmarshaling);
+void unmarshal_VkCuLaunchInfoNVX(VulkanStream* vkStream, VkStructureType rootType,
+                                 VkCuLaunchInfoNVX* forUnmarshaling);
 
 #define OP_vkCreateCuModuleNVX 227747396
 #define OP_vkCreateCuFunctionNVX 207930440
@@ -4863,25 +3729,17 @@
 #define OP_vkCmdCuLaunchKernelNVX 219961351
 #endif
 #ifdef VK_NVX_image_view_handle
-void marshal_VkImageViewHandleInfoNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageViewHandleInfoNVX* forMarshaling);
+void marshal_VkImageViewHandleInfoNVX(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkImageViewHandleInfoNVX* forMarshaling);
 
-void unmarshal_VkImageViewHandleInfoNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageViewHandleInfoNVX* forUnmarshaling);
+void unmarshal_VkImageViewHandleInfoNVX(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkImageViewHandleInfoNVX* forUnmarshaling);
 
-void marshal_VkImageViewAddressPropertiesNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageViewAddressPropertiesNVX* forMarshaling);
+void marshal_VkImageViewAddressPropertiesNVX(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkImageViewAddressPropertiesNVX* forMarshaling);
 
-void unmarshal_VkImageViewAddressPropertiesNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageViewAddressPropertiesNVX* forUnmarshaling);
+void unmarshal_VkImageViewAddressPropertiesNVX(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkImageViewAddressPropertiesNVX* forUnmarshaling);
 
 #define OP_vkGetImageViewHandleNVX 204379647
 #define OP_vkGetImageViewAddressNVX 210668576
@@ -4898,312 +3756,223 @@
 #endif
 #ifdef VK_EXT_video_encode_h264
 void marshal_VkVideoEncodeH264CapabilitiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkVideoEncodeH264CapabilitiesEXT* forMarshaling);
 
-void unmarshal_VkVideoEncodeH264CapabilitiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH264CapabilitiesEXT* forUnmarshaling);
+void unmarshal_VkVideoEncodeH264CapabilitiesEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkVideoEncodeH264CapabilitiesEXT* forUnmarshaling);
 
 void marshal_VkVideoEncodeH264SessionCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkVideoEncodeH264SessionCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkVideoEncodeH264SessionCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkVideoEncodeH264SessionCreateInfoEXT* forUnmarshaling);
 
 void marshal_VkVideoEncodeH264SessionParametersAddInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkVideoEncodeH264SessionParametersAddInfoEXT* forMarshaling);
 
 void unmarshal_VkVideoEncodeH264SessionParametersAddInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkVideoEncodeH264SessionParametersAddInfoEXT* forUnmarshaling);
 
 void marshal_VkVideoEncodeH264SessionParametersCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkVideoEncodeH264SessionParametersCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkVideoEncodeH264SessionParametersCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkVideoEncodeH264SessionParametersCreateInfoEXT* forUnmarshaling);
 
-void marshal_VkVideoEncodeH264DpbSlotInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoEncodeH264DpbSlotInfoEXT* forMarshaling);
+void marshal_VkVideoEncodeH264DpbSlotInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkVideoEncodeH264DpbSlotInfoEXT* forMarshaling);
 
-void unmarshal_VkVideoEncodeH264DpbSlotInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH264DpbSlotInfoEXT* forUnmarshaling);
+void unmarshal_VkVideoEncodeH264DpbSlotInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkVideoEncodeH264DpbSlotInfoEXT* forUnmarshaling);
 
-void marshal_VkVideoEncodeH264NaluSliceEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoEncodeH264NaluSliceEXT* forMarshaling);
+void marshal_VkVideoEncodeH264NaluSliceEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkVideoEncodeH264NaluSliceEXT* forMarshaling);
 
-void unmarshal_VkVideoEncodeH264NaluSliceEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH264NaluSliceEXT* forUnmarshaling);
+void unmarshal_VkVideoEncodeH264NaluSliceEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkVideoEncodeH264NaluSliceEXT* forUnmarshaling);
 
 void marshal_VkVideoEncodeH264VclFrameInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkVideoEncodeH264VclFrameInfoEXT* forMarshaling);
 
-void unmarshal_VkVideoEncodeH264VclFrameInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH264VclFrameInfoEXT* forUnmarshaling);
+void unmarshal_VkVideoEncodeH264VclFrameInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkVideoEncodeH264VclFrameInfoEXT* forUnmarshaling);
 
 void marshal_VkVideoEncodeH264EmitPictureParametersEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkVideoEncodeH264EmitPictureParametersEXT* forMarshaling);
 
 void unmarshal_VkVideoEncodeH264EmitPictureParametersEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkVideoEncodeH264EmitPictureParametersEXT* forUnmarshaling);
 
-void marshal_VkVideoEncodeH264ProfileEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoEncodeH264ProfileEXT* forMarshaling);
+void marshal_VkVideoEncodeH264ProfileEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkVideoEncodeH264ProfileEXT* forMarshaling);
 
-void unmarshal_VkVideoEncodeH264ProfileEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH264ProfileEXT* forUnmarshaling);
+void unmarshal_VkVideoEncodeH264ProfileEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkVideoEncodeH264ProfileEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_video_encode_h265
 void marshal_VkVideoEncodeH265CapabilitiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkVideoEncodeH265CapabilitiesEXT* forMarshaling);
 
-void unmarshal_VkVideoEncodeH265CapabilitiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH265CapabilitiesEXT* forUnmarshaling);
+void unmarshal_VkVideoEncodeH265CapabilitiesEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkVideoEncodeH265CapabilitiesEXT* forUnmarshaling);
 
 void marshal_VkVideoEncodeH265SessionCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkVideoEncodeH265SessionCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkVideoEncodeH265SessionCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkVideoEncodeH265SessionCreateInfoEXT* forUnmarshaling);
 
 void marshal_VkVideoEncodeH265SessionParametersAddInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkVideoEncodeH265SessionParametersAddInfoEXT* forMarshaling);
 
 void unmarshal_VkVideoEncodeH265SessionParametersAddInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkVideoEncodeH265SessionParametersAddInfoEXT* forUnmarshaling);
 
 void marshal_VkVideoEncodeH265SessionParametersCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkVideoEncodeH265SessionParametersCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkVideoEncodeH265SessionParametersCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkVideoEncodeH265SessionParametersCreateInfoEXT* forUnmarshaling);
 
-void marshal_VkVideoEncodeH265DpbSlotInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoEncodeH265DpbSlotInfoEXT* forMarshaling);
+void marshal_VkVideoEncodeH265DpbSlotInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkVideoEncodeH265DpbSlotInfoEXT* forMarshaling);
 
-void unmarshal_VkVideoEncodeH265DpbSlotInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH265DpbSlotInfoEXT* forUnmarshaling);
+void unmarshal_VkVideoEncodeH265DpbSlotInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkVideoEncodeH265DpbSlotInfoEXT* forUnmarshaling);
 
 void marshal_VkVideoEncodeH265ReferenceListsEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkVideoEncodeH265ReferenceListsEXT* forMarshaling);
 
 void unmarshal_VkVideoEncodeH265ReferenceListsEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkVideoEncodeH265ReferenceListsEXT* forUnmarshaling);
 
-void marshal_VkVideoEncodeH265NaluSliceEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoEncodeH265NaluSliceEXT* forMarshaling);
+void marshal_VkVideoEncodeH265NaluSliceEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkVideoEncodeH265NaluSliceEXT* forMarshaling);
 
-void unmarshal_VkVideoEncodeH265NaluSliceEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH265NaluSliceEXT* forUnmarshaling);
+void unmarshal_VkVideoEncodeH265NaluSliceEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkVideoEncodeH265NaluSliceEXT* forUnmarshaling);
 
 void marshal_VkVideoEncodeH265VclFrameInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkVideoEncodeH265VclFrameInfoEXT* forMarshaling);
 
-void unmarshal_VkVideoEncodeH265VclFrameInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH265VclFrameInfoEXT* forUnmarshaling);
+void unmarshal_VkVideoEncodeH265VclFrameInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkVideoEncodeH265VclFrameInfoEXT* forUnmarshaling);
 
 void marshal_VkVideoEncodeH265EmitPictureParametersEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkVideoEncodeH265EmitPictureParametersEXT* forMarshaling);
 
 void unmarshal_VkVideoEncodeH265EmitPictureParametersEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkVideoEncodeH265EmitPictureParametersEXT* forUnmarshaling);
 
-void marshal_VkVideoEncodeH265ProfileEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoEncodeH265ProfileEXT* forMarshaling);
+void marshal_VkVideoEncodeH265ProfileEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkVideoEncodeH265ProfileEXT* forMarshaling);
 
-void unmarshal_VkVideoEncodeH265ProfileEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH265ProfileEXT* forUnmarshaling);
+void unmarshal_VkVideoEncodeH265ProfileEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkVideoEncodeH265ProfileEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_video_decode_h264
-void marshal_VkVideoDecodeH264ProfileEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoDecodeH264ProfileEXT* forMarshaling);
+void marshal_VkVideoDecodeH264ProfileEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkVideoDecodeH264ProfileEXT* forMarshaling);
 
-void unmarshal_VkVideoDecodeH264ProfileEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH264ProfileEXT* forUnmarshaling);
+void unmarshal_VkVideoDecodeH264ProfileEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkVideoDecodeH264ProfileEXT* forUnmarshaling);
 
 void marshal_VkVideoDecodeH264CapabilitiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkVideoDecodeH264CapabilitiesEXT* forMarshaling);
 
-void unmarshal_VkVideoDecodeH264CapabilitiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH264CapabilitiesEXT* forUnmarshaling);
+void unmarshal_VkVideoDecodeH264CapabilitiesEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkVideoDecodeH264CapabilitiesEXT* forUnmarshaling);
 
 void marshal_VkVideoDecodeH264SessionCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkVideoDecodeH264SessionCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkVideoDecodeH264SessionCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkVideoDecodeH264SessionCreateInfoEXT* forUnmarshaling);
 
 void marshal_VkVideoDecodeH264SessionParametersAddInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkVideoDecodeH264SessionParametersAddInfoEXT* forMarshaling);
 
 void unmarshal_VkVideoDecodeH264SessionParametersAddInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkVideoDecodeH264SessionParametersAddInfoEXT* forUnmarshaling);
 
 void marshal_VkVideoDecodeH264SessionParametersCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkVideoDecodeH264SessionParametersCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkVideoDecodeH264SessionParametersCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkVideoDecodeH264SessionParametersCreateInfoEXT* forUnmarshaling);
 
-void marshal_VkVideoDecodeH264PictureInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoDecodeH264PictureInfoEXT* forMarshaling);
+void marshal_VkVideoDecodeH264PictureInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkVideoDecodeH264PictureInfoEXT* forMarshaling);
 
-void unmarshal_VkVideoDecodeH264PictureInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH264PictureInfoEXT* forUnmarshaling);
+void unmarshal_VkVideoDecodeH264PictureInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkVideoDecodeH264PictureInfoEXT* forUnmarshaling);
 
-void marshal_VkVideoDecodeH264MvcEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoDecodeH264MvcEXT* forMarshaling);
+void marshal_VkVideoDecodeH264MvcEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkVideoDecodeH264MvcEXT* forMarshaling);
 
-void unmarshal_VkVideoDecodeH264MvcEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH264MvcEXT* forUnmarshaling);
+void unmarshal_VkVideoDecodeH264MvcEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkVideoDecodeH264MvcEXT* forUnmarshaling);
 
-void marshal_VkVideoDecodeH264DpbSlotInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoDecodeH264DpbSlotInfoEXT* forMarshaling);
+void marshal_VkVideoDecodeH264DpbSlotInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkVideoDecodeH264DpbSlotInfoEXT* forMarshaling);
 
-void unmarshal_VkVideoDecodeH264DpbSlotInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH264DpbSlotInfoEXT* forUnmarshaling);
+void unmarshal_VkVideoDecodeH264DpbSlotInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkVideoDecodeH264DpbSlotInfoEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_AMD_texture_gather_bias_lod
 void marshal_VkTextureLODGatherFormatPropertiesAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkTextureLODGatherFormatPropertiesAMD* forMarshaling);
 
 void unmarshal_VkTextureLODGatherFormatPropertiesAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkTextureLODGatherFormatPropertiesAMD* forUnmarshaling);
 
 #endif
 #ifdef VK_AMD_shader_info
-void marshal_VkShaderResourceUsageAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkShaderResourceUsageAMD* forMarshaling);
+void marshal_VkShaderResourceUsageAMD(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkShaderResourceUsageAMD* forMarshaling);
 
-void unmarshal_VkShaderResourceUsageAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkShaderResourceUsageAMD* forUnmarshaling);
+void unmarshal_VkShaderResourceUsageAMD(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkShaderResourceUsageAMD* forUnmarshaling);
 
-void marshal_VkShaderStatisticsInfoAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkShaderStatisticsInfoAMD* forMarshaling);
+void marshal_VkShaderStatisticsInfoAMD(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkShaderStatisticsInfoAMD* forMarshaling);
 
-void unmarshal_VkShaderStatisticsInfoAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkShaderStatisticsInfoAMD* forUnmarshaling);
+void unmarshal_VkShaderStatisticsInfoAMD(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkShaderStatisticsInfoAMD* forUnmarshaling);
 
 #define OP_vkGetShaderInfoAMD 20264
 #endif
@@ -5211,26 +3980,22 @@
 #endif
 #ifdef VK_GGP_stream_descriptor_surface
 void marshal_VkStreamDescriptorSurfaceCreateInfoGGP(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkStreamDescriptorSurfaceCreateInfoGGP* forMarshaling);
 
 void unmarshal_VkStreamDescriptorSurfaceCreateInfoGGP(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkStreamDescriptorSurfaceCreateInfoGGP* forUnmarshaling);
 
 #define OP_vkCreateStreamDescriptorSurfaceGGP 241902685
 #endif
 #ifdef VK_NV_corner_sampled_image
 void marshal_VkPhysicalDeviceCornerSampledImageFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceCornerSampledImageFeaturesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceCornerSampledImageFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceCornerSampledImageFeaturesNV* forUnmarshaling);
 
 #endif
@@ -5238,96 +4003,70 @@
 #endif
 #ifdef VK_NV_external_memory_capabilities
 void marshal_VkExternalImageFormatPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkExternalImageFormatPropertiesNV* forMarshaling);
 
 void unmarshal_VkExternalImageFormatPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkExternalImageFormatPropertiesNV* forUnmarshaling);
 
 #define OP_vkGetPhysicalDeviceExternalImageFormatPropertiesNV 20265
 #endif
 #ifdef VK_NV_external_memory
 void marshal_VkExternalMemoryImageCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkExternalMemoryImageCreateInfoNV* forMarshaling);
 
 void unmarshal_VkExternalMemoryImageCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkExternalMemoryImageCreateInfoNV* forUnmarshaling);
 
-void marshal_VkExportMemoryAllocateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkExportMemoryAllocateInfoNV* forMarshaling);
+void marshal_VkExportMemoryAllocateInfoNV(VulkanStream* vkStream, VkStructureType rootType,
+                                          const VkExportMemoryAllocateInfoNV* forMarshaling);
 
-void unmarshal_VkExportMemoryAllocateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExportMemoryAllocateInfoNV* forUnmarshaling);
+void unmarshal_VkExportMemoryAllocateInfoNV(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkExportMemoryAllocateInfoNV* forUnmarshaling);
 
 #endif
 #ifdef VK_NV_external_memory_win32
-void marshal_VkImportMemoryWin32HandleInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImportMemoryWin32HandleInfoNV* forMarshaling);
+void marshal_VkImportMemoryWin32HandleInfoNV(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkImportMemoryWin32HandleInfoNV* forMarshaling);
 
-void unmarshal_VkImportMemoryWin32HandleInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportMemoryWin32HandleInfoNV* forUnmarshaling);
+void unmarshal_VkImportMemoryWin32HandleInfoNV(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkImportMemoryWin32HandleInfoNV* forUnmarshaling);
 
-void marshal_VkExportMemoryWin32HandleInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkExportMemoryWin32HandleInfoNV* forMarshaling);
+void marshal_VkExportMemoryWin32HandleInfoNV(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkExportMemoryWin32HandleInfoNV* forMarshaling);
 
-void unmarshal_VkExportMemoryWin32HandleInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExportMemoryWin32HandleInfoNV* forUnmarshaling);
+void unmarshal_VkExportMemoryWin32HandleInfoNV(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkExportMemoryWin32HandleInfoNV* forUnmarshaling);
 
 #define OP_vkGetMemoryWin32HandleNV 20266
 #endif
 #ifdef VK_NV_win32_keyed_mutex
 void marshal_VkWin32KeyedMutexAcquireReleaseInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkWin32KeyedMutexAcquireReleaseInfoNV* forMarshaling);
 
 void unmarshal_VkWin32KeyedMutexAcquireReleaseInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkWin32KeyedMutexAcquireReleaseInfoNV* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_validation_flags
-void marshal_VkValidationFlagsEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkValidationFlagsEXT* forMarshaling);
+void marshal_VkValidationFlagsEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkValidationFlagsEXT* forMarshaling);
 
-void unmarshal_VkValidationFlagsEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkValidationFlagsEXT* forUnmarshaling);
+void unmarshal_VkValidationFlagsEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkValidationFlagsEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_NN_vi_surface
-void marshal_VkViSurfaceCreateInfoNN(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkViSurfaceCreateInfoNN* forMarshaling);
+void marshal_VkViSurfaceCreateInfoNN(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkViSurfaceCreateInfoNN* forMarshaling);
 
-void unmarshal_VkViSurfaceCreateInfoNN(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkViSurfaceCreateInfoNN* forUnmarshaling);
+void unmarshal_VkViSurfaceCreateInfoNN(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkViSurfaceCreateInfoNN* forUnmarshaling);
 
 #define OP_vkCreateViSurfaceNN 20267
 #endif
@@ -5337,91 +4076,71 @@
 #endif
 #ifdef VK_EXT_texture_compression_astc_hdr
 void marshal_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_astc_decode_mode
-void marshal_VkImageViewASTCDecodeModeEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageViewASTCDecodeModeEXT* forMarshaling);
+void marshal_VkImageViewASTCDecodeModeEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                          const VkImageViewASTCDecodeModeEXT* forMarshaling);
 
-void unmarshal_VkImageViewASTCDecodeModeEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageViewASTCDecodeModeEXT* forUnmarshaling);
+void unmarshal_VkImageViewASTCDecodeModeEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkImageViewASTCDecodeModeEXT* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceASTCDecodeFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceASTCDecodeFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceASTCDecodeFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceASTCDecodeFeaturesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_conditional_rendering
 void marshal_VkConditionalRenderingBeginInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkConditionalRenderingBeginInfoEXT* forMarshaling);
 
 void unmarshal_VkConditionalRenderingBeginInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkConditionalRenderingBeginInfoEXT* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceConditionalRenderingFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceConditionalRenderingFeaturesEXT* forUnmarshaling);
 
 void marshal_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkCommandBufferInheritanceConditionalRenderingInfoEXT* forMarshaling);
 
 void unmarshal_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkCommandBufferInheritanceConditionalRenderingInfoEXT* forUnmarshaling);
 
 #define OP_vkCmdBeginConditionalRenderingEXT 20268
 #define OP_vkCmdEndConditionalRenderingEXT 20269
 #endif
 #ifdef VK_NV_clip_space_w_scaling
-void marshal_VkViewportWScalingNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkViewportWScalingNV* forMarshaling);
+void marshal_VkViewportWScalingNV(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkViewportWScalingNV* forMarshaling);
 
-void unmarshal_VkViewportWScalingNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkViewportWScalingNV* forUnmarshaling);
+void unmarshal_VkViewportWScalingNV(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkViewportWScalingNV* forUnmarshaling);
 
 void marshal_VkPipelineViewportWScalingStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineViewportWScalingStateCreateInfoNV* forMarshaling);
 
 void unmarshal_VkPipelineViewportWScalingStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineViewportWScalingStateCreateInfoNV* forUnmarshaling);
 
 #define OP_vkCmdSetViewportWScalingNV 20279
@@ -5434,58 +4153,38 @@
 #define OP_vkGetRandROutputDisplayEXT 20282
 #endif
 #ifdef VK_EXT_display_surface_counter
-void marshal_VkSurfaceCapabilities2EXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSurfaceCapabilities2EXT* forMarshaling);
+void marshal_VkSurfaceCapabilities2EXT(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkSurfaceCapabilities2EXT* forMarshaling);
 
-void unmarshal_VkSurfaceCapabilities2EXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSurfaceCapabilities2EXT* forUnmarshaling);
+void unmarshal_VkSurfaceCapabilities2EXT(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkSurfaceCapabilities2EXT* forUnmarshaling);
 
 #define OP_vkGetPhysicalDeviceSurfaceCapabilities2EXT 20283
 #endif
 #ifdef VK_EXT_display_control
-void marshal_VkDisplayPowerInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDisplayPowerInfoEXT* forMarshaling);
+void marshal_VkDisplayPowerInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkDisplayPowerInfoEXT* forMarshaling);
 
-void unmarshal_VkDisplayPowerInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayPowerInfoEXT* forUnmarshaling);
+void unmarshal_VkDisplayPowerInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkDisplayPowerInfoEXT* forUnmarshaling);
 
-void marshal_VkDeviceEventInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDeviceEventInfoEXT* forMarshaling);
+void marshal_VkDeviceEventInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkDeviceEventInfoEXT* forMarshaling);
 
-void unmarshal_VkDeviceEventInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceEventInfoEXT* forUnmarshaling);
+void unmarshal_VkDeviceEventInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkDeviceEventInfoEXT* forUnmarshaling);
 
-void marshal_VkDisplayEventInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDisplayEventInfoEXT* forMarshaling);
+void marshal_VkDisplayEventInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkDisplayEventInfoEXT* forMarshaling);
 
-void unmarshal_VkDisplayEventInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayEventInfoEXT* forUnmarshaling);
+void unmarshal_VkDisplayEventInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkDisplayEventInfoEXT* forUnmarshaling);
 
-void marshal_VkSwapchainCounterCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSwapchainCounterCreateInfoEXT* forMarshaling);
+void marshal_VkSwapchainCounterCreateInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkSwapchainCounterCreateInfoEXT* forMarshaling);
 
-void unmarshal_VkSwapchainCounterCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSwapchainCounterCreateInfoEXT* forUnmarshaling);
+void unmarshal_VkSwapchainCounterCreateInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkSwapchainCounterCreateInfoEXT* forUnmarshaling);
 
 #define OP_vkDisplayPowerControlEXT 20284
 #define OP_vkRegisterDeviceEventEXT 20285
@@ -5493,45 +4192,29 @@
 #define OP_vkGetSwapchainCounterEXT 20287
 #endif
 #ifdef VK_GOOGLE_display_timing
-void marshal_VkRefreshCycleDurationGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkRefreshCycleDurationGOOGLE* forMarshaling);
+void marshal_VkRefreshCycleDurationGOOGLE(VulkanStream* vkStream, VkStructureType rootType,
+                                          const VkRefreshCycleDurationGOOGLE* forMarshaling);
 
-void unmarshal_VkRefreshCycleDurationGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRefreshCycleDurationGOOGLE* forUnmarshaling);
+void unmarshal_VkRefreshCycleDurationGOOGLE(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkRefreshCycleDurationGOOGLE* forUnmarshaling);
 
-void marshal_VkPastPresentationTimingGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPastPresentationTimingGOOGLE* forMarshaling);
+void marshal_VkPastPresentationTimingGOOGLE(VulkanStream* vkStream, VkStructureType rootType,
+                                            const VkPastPresentationTimingGOOGLE* forMarshaling);
 
-void unmarshal_VkPastPresentationTimingGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPastPresentationTimingGOOGLE* forUnmarshaling);
+void unmarshal_VkPastPresentationTimingGOOGLE(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkPastPresentationTimingGOOGLE* forUnmarshaling);
 
-void marshal_VkPresentTimeGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPresentTimeGOOGLE* forMarshaling);
+void marshal_VkPresentTimeGOOGLE(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkPresentTimeGOOGLE* forMarshaling);
 
-void unmarshal_VkPresentTimeGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPresentTimeGOOGLE* forUnmarshaling);
+void unmarshal_VkPresentTimeGOOGLE(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkPresentTimeGOOGLE* forUnmarshaling);
 
-void marshal_VkPresentTimesInfoGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPresentTimesInfoGOOGLE* forMarshaling);
+void marshal_VkPresentTimesInfoGOOGLE(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkPresentTimesInfoGOOGLE* forMarshaling);
 
-void unmarshal_VkPresentTimesInfoGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPresentTimesInfoGOOGLE* forUnmarshaling);
+void unmarshal_VkPresentTimesInfoGOOGLE(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkPresentTimesInfoGOOGLE* forUnmarshaling);
 
 #define OP_vkGetRefreshCycleDurationGOOGLE 20288
 #define OP_vkGetPastPresentationTimingGOOGLE 20289
@@ -5544,153 +4227,117 @@
 #endif
 #ifdef VK_NVX_multiview_per_view_attributes
 void marshal_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* forUnmarshaling);
 
 #endif
 #ifdef VK_NV_viewport_swizzle
-void marshal_VkViewportSwizzleNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkViewportSwizzleNV* forMarshaling);
+void marshal_VkViewportSwizzleNV(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkViewportSwizzleNV* forMarshaling);
 
-void unmarshal_VkViewportSwizzleNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkViewportSwizzleNV* forUnmarshaling);
+void unmarshal_VkViewportSwizzleNV(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkViewportSwizzleNV* forUnmarshaling);
 
 void marshal_VkPipelineViewportSwizzleStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineViewportSwizzleStateCreateInfoNV* forMarshaling);
 
 void unmarshal_VkPipelineViewportSwizzleStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineViewportSwizzleStateCreateInfoNV* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_discard_rectangles
 void marshal_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceDiscardRectanglePropertiesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceDiscardRectanglePropertiesEXT* forUnmarshaling);
 
 void marshal_VkPipelineDiscardRectangleStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineDiscardRectangleStateCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkPipelineDiscardRectangleStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineDiscardRectangleStateCreateInfoEXT* forUnmarshaling);
 
 #define OP_vkCmdSetDiscardRectangleEXT 20290
 #endif
 #ifdef VK_EXT_conservative_rasterization
 void marshal_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceConservativeRasterizationPropertiesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceConservativeRasterizationPropertiesEXT* forUnmarshaling);
 
 void marshal_VkPipelineRasterizationConservativeStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineRasterizationConservativeStateCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkPipelineRasterizationConservativeStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineRasterizationConservativeStateCreateInfoEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_depth_clip_enable
 void marshal_VkPhysicalDeviceDepthClipEnableFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceDepthClipEnableFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceDepthClipEnableFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceDepthClipEnableFeaturesEXT* forUnmarshaling);
 
 void marshal_VkPipelineRasterizationDepthClipStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineRasterizationDepthClipStateCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkPipelineRasterizationDepthClipStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineRasterizationDepthClipStateCreateInfoEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_swapchain_colorspace
 #endif
 #ifdef VK_EXT_hdr_metadata
-void marshal_VkXYColorEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkXYColorEXT* forMarshaling);
+void marshal_VkXYColorEXT(VulkanStream* vkStream, VkStructureType rootType,
+                          const VkXYColorEXT* forMarshaling);
 
-void unmarshal_VkXYColorEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkXYColorEXT* forUnmarshaling);
+void unmarshal_VkXYColorEXT(VulkanStream* vkStream, VkStructureType rootType,
+                            VkXYColorEXT* forUnmarshaling);
 
-void marshal_VkHdrMetadataEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkHdrMetadataEXT* forMarshaling);
+void marshal_VkHdrMetadataEXT(VulkanStream* vkStream, VkStructureType rootType,
+                              const VkHdrMetadataEXT* forMarshaling);
 
-void unmarshal_VkHdrMetadataEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkHdrMetadataEXT* forUnmarshaling);
+void unmarshal_VkHdrMetadataEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                VkHdrMetadataEXT* forUnmarshaling);
 
 #define OP_vkSetHdrMetadataEXT 20291
 #endif
 #ifdef VK_MVK_ios_surface
-void marshal_VkIOSSurfaceCreateInfoMVK(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkIOSSurfaceCreateInfoMVK* forMarshaling);
+void marshal_VkIOSSurfaceCreateInfoMVK(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkIOSSurfaceCreateInfoMVK* forMarshaling);
 
-void unmarshal_VkIOSSurfaceCreateInfoMVK(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkIOSSurfaceCreateInfoMVK* forUnmarshaling);
+void unmarshal_VkIOSSurfaceCreateInfoMVK(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkIOSSurfaceCreateInfoMVK* forUnmarshaling);
 
 #define OP_vkCreateIOSSurfaceMVK 20292
 #endif
 #ifdef VK_MVK_macos_surface
-void marshal_VkMacOSSurfaceCreateInfoMVK(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMacOSSurfaceCreateInfoMVK* forMarshaling);
+void marshal_VkMacOSSurfaceCreateInfoMVK(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkMacOSSurfaceCreateInfoMVK* forMarshaling);
 
-void unmarshal_VkMacOSSurfaceCreateInfoMVK(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMacOSSurfaceCreateInfoMVK* forUnmarshaling);
+void unmarshal_VkMacOSSurfaceCreateInfoMVK(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkMacOSSurfaceCreateInfoMVK* forUnmarshaling);
 
 #define OP_vkCreateMacOSSurfaceMVK 20293
 #endif
@@ -5707,55 +4354,39 @@
 #ifdef VK_EXT_queue_family_foreign
 #endif
 #ifdef VK_EXT_debug_utils
-void marshal_VkDebugUtilsLabelEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDebugUtilsLabelEXT* forMarshaling);
+void marshal_VkDebugUtilsLabelEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkDebugUtilsLabelEXT* forMarshaling);
 
-void unmarshal_VkDebugUtilsLabelEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDebugUtilsLabelEXT* forUnmarshaling);
+void unmarshal_VkDebugUtilsLabelEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkDebugUtilsLabelEXT* forUnmarshaling);
 
-void marshal_VkDebugUtilsObjectNameInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDebugUtilsObjectNameInfoEXT* forMarshaling);
+void marshal_VkDebugUtilsObjectNameInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkDebugUtilsObjectNameInfoEXT* forMarshaling);
 
-void unmarshal_VkDebugUtilsObjectNameInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDebugUtilsObjectNameInfoEXT* forUnmarshaling);
+void unmarshal_VkDebugUtilsObjectNameInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkDebugUtilsObjectNameInfoEXT* forUnmarshaling);
 
 void marshal_VkDebugUtilsMessengerCallbackDataEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkDebugUtilsMessengerCallbackDataEXT* forMarshaling);
 
 void unmarshal_VkDebugUtilsMessengerCallbackDataEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkDebugUtilsMessengerCallbackDataEXT* forUnmarshaling);
 
 void marshal_VkDebugUtilsMessengerCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkDebugUtilsMessengerCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkDebugUtilsMessengerCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkDebugUtilsMessengerCreateInfoEXT* forUnmarshaling);
 
-void marshal_VkDebugUtilsObjectTagInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDebugUtilsObjectTagInfoEXT* forMarshaling);
+void marshal_VkDebugUtilsObjectTagInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                          const VkDebugUtilsObjectTagInfoEXT* forMarshaling);
 
-void unmarshal_VkDebugUtilsObjectTagInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDebugUtilsObjectTagInfoEXT* forUnmarshaling);
+void unmarshal_VkDebugUtilsObjectTagInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkDebugUtilsObjectTagInfoEXT* forUnmarshaling);
 
 #define OP_vkSetDebugUtilsObjectNameEXT 20294
 #define OP_vkSetDebugUtilsObjectTagEXT 20295
@@ -5771,86 +4402,74 @@
 #endif
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
 void marshal_VkAndroidHardwareBufferUsageANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkAndroidHardwareBufferUsageANDROID* forMarshaling);
 
 void unmarshal_VkAndroidHardwareBufferUsageANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkAndroidHardwareBufferUsageANDROID* forUnmarshaling);
 
 void marshal_VkAndroidHardwareBufferPropertiesANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkAndroidHardwareBufferPropertiesANDROID* forMarshaling);
 
 void unmarshal_VkAndroidHardwareBufferPropertiesANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkAndroidHardwareBufferPropertiesANDROID* forUnmarshaling);
 
 void marshal_VkAndroidHardwareBufferFormatPropertiesANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkAndroidHardwareBufferFormatPropertiesANDROID* forMarshaling);
 
 void unmarshal_VkAndroidHardwareBufferFormatPropertiesANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkAndroidHardwareBufferFormatPropertiesANDROID* forUnmarshaling);
 
 void marshal_VkImportAndroidHardwareBufferInfoANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkImportAndroidHardwareBufferInfoANDROID* forMarshaling);
 
 void unmarshal_VkImportAndroidHardwareBufferInfoANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkImportAndroidHardwareBufferInfoANDROID* forUnmarshaling);
 
 void marshal_VkMemoryGetAndroidHardwareBufferInfoANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkMemoryGetAndroidHardwareBufferInfoANDROID* forMarshaling);
 
 void unmarshal_VkMemoryGetAndroidHardwareBufferInfoANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkMemoryGetAndroidHardwareBufferInfoANDROID* forUnmarshaling);
 
-void marshal_VkExternalFormatANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkExternalFormatANDROID* forMarshaling);
+void marshal_VkExternalFormatANDROID(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkExternalFormatANDROID* forMarshaling);
 
-void unmarshal_VkExternalFormatANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalFormatANDROID* forUnmarshaling);
+void unmarshal_VkExternalFormatANDROID(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkExternalFormatANDROID* forUnmarshaling);
 
 #define OP_vkGetAndroidHardwareBufferPropertiesANDROID 20305
 #define OP_vkGetMemoryAndroidHardwareBufferANDROID 20306
 void marshal_VkAndroidHardwareBufferFormatProperties2ANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkAndroidHardwareBufferFormatProperties2ANDROID* forMarshaling);
 
 void unmarshal_VkAndroidHardwareBufferFormatProperties2ANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkAndroidHardwareBufferFormatProperties2ANDROID* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_sampler_filter_minmax
-DEFINE_ALIAS_FUNCTION(marshal_VkSamplerReductionModeCreateInfo, marshal_VkSamplerReductionModeCreateInfoEXT)
+DEFINE_ALIAS_FUNCTION(marshal_VkSamplerReductionModeCreateInfo,
+                      marshal_VkSamplerReductionModeCreateInfoEXT)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkSamplerReductionModeCreateInfo, unmarshal_VkSamplerReductionModeCreateInfoEXT)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkSamplerReductionModeCreateInfo,
+                      unmarshal_VkSamplerReductionModeCreateInfoEXT)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceSamplerFilterMinmaxProperties, marshal_VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceSamplerFilterMinmaxProperties,
+                      marshal_VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceSamplerFilterMinmaxProperties, unmarshal_VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceSamplerFilterMinmaxProperties,
+                      unmarshal_VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT)
 
 #endif
 #ifdef VK_AMD_gpu_shader_int16
@@ -5861,185 +4480,141 @@
 #endif
 #ifdef VK_EXT_inline_uniform_block
 void marshal_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceInlineUniformBlockFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceInlineUniformBlockFeaturesEXT* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceInlineUniformBlockPropertiesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceInlineUniformBlockPropertiesEXT* forUnmarshaling);
 
 void marshal_VkWriteDescriptorSetInlineUniformBlockEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkWriteDescriptorSetInlineUniformBlockEXT* forMarshaling);
 
 void unmarshal_VkWriteDescriptorSetInlineUniformBlockEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkWriteDescriptorSetInlineUniformBlockEXT* forUnmarshaling);
 
 void marshal_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkDescriptorPoolInlineUniformBlockCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkDescriptorPoolInlineUniformBlockCreateInfoEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_shader_stencil_export
 #endif
 #ifdef VK_EXT_sample_locations
-void marshal_VkSampleLocationEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSampleLocationEXT* forMarshaling);
+void marshal_VkSampleLocationEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                 const VkSampleLocationEXT* forMarshaling);
 
-void unmarshal_VkSampleLocationEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSampleLocationEXT* forUnmarshaling);
+void unmarshal_VkSampleLocationEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkSampleLocationEXT* forUnmarshaling);
 
-void marshal_VkSampleLocationsInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSampleLocationsInfoEXT* forMarshaling);
+void marshal_VkSampleLocationsInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkSampleLocationsInfoEXT* forMarshaling);
 
-void unmarshal_VkSampleLocationsInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSampleLocationsInfoEXT* forUnmarshaling);
+void unmarshal_VkSampleLocationsInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkSampleLocationsInfoEXT* forUnmarshaling);
 
-void marshal_VkAttachmentSampleLocationsEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAttachmentSampleLocationsEXT* forMarshaling);
+void marshal_VkAttachmentSampleLocationsEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                            const VkAttachmentSampleLocationsEXT* forMarshaling);
 
-void unmarshal_VkAttachmentSampleLocationsEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAttachmentSampleLocationsEXT* forUnmarshaling);
+void unmarshal_VkAttachmentSampleLocationsEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkAttachmentSampleLocationsEXT* forUnmarshaling);
 
-void marshal_VkSubpassSampleLocationsEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSubpassSampleLocationsEXT* forMarshaling);
+void marshal_VkSubpassSampleLocationsEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkSubpassSampleLocationsEXT* forMarshaling);
 
-void unmarshal_VkSubpassSampleLocationsEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubpassSampleLocationsEXT* forUnmarshaling);
+void unmarshal_VkSubpassSampleLocationsEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkSubpassSampleLocationsEXT* forUnmarshaling);
 
 void marshal_VkRenderPassSampleLocationsBeginInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkRenderPassSampleLocationsBeginInfoEXT* forMarshaling);
 
 void unmarshal_VkRenderPassSampleLocationsBeginInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkRenderPassSampleLocationsBeginInfoEXT* forUnmarshaling);
 
 void marshal_VkPipelineSampleLocationsStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineSampleLocationsStateCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkPipelineSampleLocationsStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineSampleLocationsStateCreateInfoEXT* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceSampleLocationsPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceSampleLocationsPropertiesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceSampleLocationsPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceSampleLocationsPropertiesEXT* forUnmarshaling);
 
-void marshal_VkMultisamplePropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMultisamplePropertiesEXT* forMarshaling);
+void marshal_VkMultisamplePropertiesEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                        const VkMultisamplePropertiesEXT* forMarshaling);
 
-void unmarshal_VkMultisamplePropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMultisamplePropertiesEXT* forUnmarshaling);
+void unmarshal_VkMultisamplePropertiesEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkMultisamplePropertiesEXT* forUnmarshaling);
 
 #define OP_vkCmdSetSampleLocationsEXT 20307
 #define OP_vkGetPhysicalDeviceMultisamplePropertiesEXT 20308
 #endif
 #ifdef VK_EXT_blend_operation_advanced
 void marshal_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* forUnmarshaling);
 
 void marshal_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineColorBlendAdvancedStateCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineColorBlendAdvancedStateCreateInfoEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_NV_fragment_coverage_to_color
 void marshal_VkPipelineCoverageToColorStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineCoverageToColorStateCreateInfoNV* forMarshaling);
 
 void unmarshal_VkPipelineCoverageToColorStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineCoverageToColorStateCreateInfoNV* forUnmarshaling);
 
 #endif
 #ifdef VK_NV_framebuffer_mixed_samples
 void marshal_VkPipelineCoverageModulationStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineCoverageModulationStateCreateInfoNV* forMarshaling);
 
 void unmarshal_VkPipelineCoverageModulationStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineCoverageModulationStateCreateInfoNV* forUnmarshaling);
 
 #endif
@@ -6047,23 +4622,19 @@
 #endif
 #ifdef VK_NV_shader_sm_builtins
 void marshal_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* forUnmarshaling);
 
 #endif
@@ -6071,106 +4642,83 @@
 #endif
 #ifdef VK_EXT_image_drm_format_modifier
 void marshal_VkDrmFormatModifierPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkDrmFormatModifierPropertiesEXT* forMarshaling);
 
-void unmarshal_VkDrmFormatModifierPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDrmFormatModifierPropertiesEXT* forUnmarshaling);
+void unmarshal_VkDrmFormatModifierPropertiesEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkDrmFormatModifierPropertiesEXT* forUnmarshaling);
 
 void marshal_VkDrmFormatModifierPropertiesListEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkDrmFormatModifierPropertiesListEXT* forMarshaling);
 
 void unmarshal_VkDrmFormatModifierPropertiesListEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkDrmFormatModifierPropertiesListEXT* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceImageDrmFormatModifierInfoEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceImageDrmFormatModifierInfoEXT* forUnmarshaling);
 
 void marshal_VkImageDrmFormatModifierListCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkImageDrmFormatModifierListCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkImageDrmFormatModifierListCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkImageDrmFormatModifierListCreateInfoEXT* forUnmarshaling);
 
 void marshal_VkImageDrmFormatModifierExplicitCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkImageDrmFormatModifierExplicitCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkImageDrmFormatModifierExplicitCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkImageDrmFormatModifierExplicitCreateInfoEXT* forUnmarshaling);
 
 void marshal_VkImageDrmFormatModifierPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkImageDrmFormatModifierPropertiesEXT* forMarshaling);
 
 void unmarshal_VkImageDrmFormatModifierPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkImageDrmFormatModifierPropertiesEXT* forUnmarshaling);
 
 #define OP_vkGetImageDrmFormatModifierPropertiesEXT 251301237
 void marshal_VkDrmFormatModifierProperties2EXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkDrmFormatModifierProperties2EXT* forMarshaling);
 
 void unmarshal_VkDrmFormatModifierProperties2EXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkDrmFormatModifierProperties2EXT* forUnmarshaling);
 
 void marshal_VkDrmFormatModifierPropertiesList2EXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkDrmFormatModifierPropertiesList2EXT* forMarshaling);
 
 void unmarshal_VkDrmFormatModifierPropertiesList2EXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkDrmFormatModifierPropertiesList2EXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_validation_cache
-void marshal_VkValidationCacheCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkValidationCacheCreateInfoEXT* forMarshaling);
+void marshal_VkValidationCacheCreateInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                            const VkValidationCacheCreateInfoEXT* forMarshaling);
 
-void unmarshal_VkValidationCacheCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkValidationCacheCreateInfoEXT* forUnmarshaling);
+void unmarshal_VkValidationCacheCreateInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkValidationCacheCreateInfoEXT* forUnmarshaling);
 
 void marshal_VkShaderModuleValidationCacheCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkShaderModuleValidationCacheCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkShaderModuleValidationCacheCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkShaderModuleValidationCacheCreateInfoEXT* forUnmarshaling);
 
 #define OP_vkCreateValidationCacheEXT 20309
@@ -6179,98 +4727,88 @@
 #define OP_vkGetValidationCacheDataEXT 20312
 #endif
 #ifdef VK_EXT_descriptor_indexing
-DEFINE_ALIAS_FUNCTION(marshal_VkDescriptorSetLayoutBindingFlagsCreateInfo, marshal_VkDescriptorSetLayoutBindingFlagsCreateInfoEXT)
+DEFINE_ALIAS_FUNCTION(marshal_VkDescriptorSetLayoutBindingFlagsCreateInfo,
+                      marshal_VkDescriptorSetLayoutBindingFlagsCreateInfoEXT)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkDescriptorSetLayoutBindingFlagsCreateInfo, unmarshal_VkDescriptorSetLayoutBindingFlagsCreateInfoEXT)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkDescriptorSetLayoutBindingFlagsCreateInfo,
+                      unmarshal_VkDescriptorSetLayoutBindingFlagsCreateInfoEXT)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceDescriptorIndexingFeatures, marshal_VkPhysicalDeviceDescriptorIndexingFeaturesEXT)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceDescriptorIndexingFeatures,
+                      marshal_VkPhysicalDeviceDescriptorIndexingFeaturesEXT)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceDescriptorIndexingFeatures, unmarshal_VkPhysicalDeviceDescriptorIndexingFeaturesEXT)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceDescriptorIndexingFeatures,
+                      unmarshal_VkPhysicalDeviceDescriptorIndexingFeaturesEXT)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceDescriptorIndexingProperties, marshal_VkPhysicalDeviceDescriptorIndexingPropertiesEXT)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceDescriptorIndexingProperties,
+                      marshal_VkPhysicalDeviceDescriptorIndexingPropertiesEXT)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceDescriptorIndexingProperties, unmarshal_VkPhysicalDeviceDescriptorIndexingPropertiesEXT)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceDescriptorIndexingProperties,
+                      unmarshal_VkPhysicalDeviceDescriptorIndexingPropertiesEXT)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkDescriptorSetVariableDescriptorCountAllocateInfo, marshal_VkDescriptorSetVariableDescriptorCountAllocateInfoEXT)
+DEFINE_ALIAS_FUNCTION(marshal_VkDescriptorSetVariableDescriptorCountAllocateInfo,
+                      marshal_VkDescriptorSetVariableDescriptorCountAllocateInfoEXT)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkDescriptorSetVariableDescriptorCountAllocateInfo, unmarshal_VkDescriptorSetVariableDescriptorCountAllocateInfoEXT)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkDescriptorSetVariableDescriptorCountAllocateInfo,
+                      unmarshal_VkDescriptorSetVariableDescriptorCountAllocateInfoEXT)
 
-DEFINE_ALIAS_FUNCTION(marshal_VkDescriptorSetVariableDescriptorCountLayoutSupport, marshal_VkDescriptorSetVariableDescriptorCountLayoutSupportEXT)
+DEFINE_ALIAS_FUNCTION(marshal_VkDescriptorSetVariableDescriptorCountLayoutSupport,
+                      marshal_VkDescriptorSetVariableDescriptorCountLayoutSupportEXT)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkDescriptorSetVariableDescriptorCountLayoutSupport, unmarshal_VkDescriptorSetVariableDescriptorCountLayoutSupportEXT)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkDescriptorSetVariableDescriptorCountLayoutSupport,
+                      unmarshal_VkDescriptorSetVariableDescriptorCountLayoutSupportEXT)
 
 #endif
 #ifdef VK_EXT_shader_viewport_index_layer
 #endif
 #ifdef VK_NV_shading_rate_image
-void marshal_VkShadingRatePaletteNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkShadingRatePaletteNV* forMarshaling);
+void marshal_VkShadingRatePaletteNV(VulkanStream* vkStream, VkStructureType rootType,
+                                    const VkShadingRatePaletteNV* forMarshaling);
 
-void unmarshal_VkShadingRatePaletteNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkShadingRatePaletteNV* forUnmarshaling);
+void unmarshal_VkShadingRatePaletteNV(VulkanStream* vkStream, VkStructureType rootType,
+                                      VkShadingRatePaletteNV* forUnmarshaling);
 
 void marshal_VkPipelineViewportShadingRateImageStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineViewportShadingRateImageStateCreateInfoNV* forMarshaling);
 
 void unmarshal_VkPipelineViewportShadingRateImageStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineViewportShadingRateImageStateCreateInfoNV* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceShadingRateImageFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceShadingRateImageFeaturesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShadingRateImageFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceShadingRateImageFeaturesNV* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceShadingRateImagePropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceShadingRateImagePropertiesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShadingRateImagePropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceShadingRateImagePropertiesNV* forUnmarshaling);
 
-void marshal_VkCoarseSampleLocationNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCoarseSampleLocationNV* forMarshaling);
+void marshal_VkCoarseSampleLocationNV(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkCoarseSampleLocationNV* forMarshaling);
 
-void unmarshal_VkCoarseSampleLocationNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCoarseSampleLocationNV* forUnmarshaling);
+void unmarshal_VkCoarseSampleLocationNV(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkCoarseSampleLocationNV* forUnmarshaling);
 
-void marshal_VkCoarseSampleOrderCustomNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCoarseSampleOrderCustomNV* forMarshaling);
+void marshal_VkCoarseSampleOrderCustomNV(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkCoarseSampleOrderCustomNV* forMarshaling);
 
-void unmarshal_VkCoarseSampleOrderCustomNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCoarseSampleOrderCustomNV* forUnmarshaling);
+void unmarshal_VkCoarseSampleOrderCustomNV(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkCoarseSampleOrderCustomNV* forUnmarshaling);
 
 void marshal_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* forMarshaling);
 
 void unmarshal_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* forUnmarshaling);
 
 #define OP_vkCmdBindShadingRateImageNV 238618340
@@ -6279,166 +4817,123 @@
 #endif
 #ifdef VK_NV_ray_tracing
 void marshal_VkRayTracingShaderGroupCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkRayTracingShaderGroupCreateInfoNV* forMarshaling);
 
 void unmarshal_VkRayTracingShaderGroupCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkRayTracingShaderGroupCreateInfoNV* forUnmarshaling);
 
 void marshal_VkRayTracingPipelineCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkRayTracingPipelineCreateInfoNV* forMarshaling);
 
-void unmarshal_VkRayTracingPipelineCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRayTracingPipelineCreateInfoNV* forUnmarshaling);
+void unmarshal_VkRayTracingPipelineCreateInfoNV(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkRayTracingPipelineCreateInfoNV* forUnmarshaling);
 
-void marshal_VkGeometryTrianglesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkGeometryTrianglesNV* forMarshaling);
+void marshal_VkGeometryTrianglesNV(VulkanStream* vkStream, VkStructureType rootType,
+                                   const VkGeometryTrianglesNV* forMarshaling);
 
-void unmarshal_VkGeometryTrianglesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkGeometryTrianglesNV* forUnmarshaling);
+void unmarshal_VkGeometryTrianglesNV(VulkanStream* vkStream, VkStructureType rootType,
+                                     VkGeometryTrianglesNV* forUnmarshaling);
 
-void marshal_VkGeometryAABBNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkGeometryAABBNV* forMarshaling);
+void marshal_VkGeometryAABBNV(VulkanStream* vkStream, VkStructureType rootType,
+                              const VkGeometryAABBNV* forMarshaling);
 
-void unmarshal_VkGeometryAABBNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkGeometryAABBNV* forUnmarshaling);
+void unmarshal_VkGeometryAABBNV(VulkanStream* vkStream, VkStructureType rootType,
+                                VkGeometryAABBNV* forUnmarshaling);
 
-void marshal_VkGeometryDataNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkGeometryDataNV* forMarshaling);
+void marshal_VkGeometryDataNV(VulkanStream* vkStream, VkStructureType rootType,
+                              const VkGeometryDataNV* forMarshaling);
 
-void unmarshal_VkGeometryDataNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkGeometryDataNV* forUnmarshaling);
+void unmarshal_VkGeometryDataNV(VulkanStream* vkStream, VkStructureType rootType,
+                                VkGeometryDataNV* forUnmarshaling);
 
-void marshal_VkGeometryNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkGeometryNV* forMarshaling);
+void marshal_VkGeometryNV(VulkanStream* vkStream, VkStructureType rootType,
+                          const VkGeometryNV* forMarshaling);
 
-void unmarshal_VkGeometryNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkGeometryNV* forUnmarshaling);
+void unmarshal_VkGeometryNV(VulkanStream* vkStream, VkStructureType rootType,
+                            VkGeometryNV* forUnmarshaling);
 
-void marshal_VkAccelerationStructureInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAccelerationStructureInfoNV* forMarshaling);
+void marshal_VkAccelerationStructureInfoNV(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkAccelerationStructureInfoNV* forMarshaling);
 
-void unmarshal_VkAccelerationStructureInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureInfoNV* forUnmarshaling);
+void unmarshal_VkAccelerationStructureInfoNV(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkAccelerationStructureInfoNV* forUnmarshaling);
 
 void marshal_VkAccelerationStructureCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkAccelerationStructureCreateInfoNV* forMarshaling);
 
 void unmarshal_VkAccelerationStructureCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkAccelerationStructureCreateInfoNV* forUnmarshaling);
 
 void marshal_VkBindAccelerationStructureMemoryInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkBindAccelerationStructureMemoryInfoNV* forMarshaling);
 
 void unmarshal_VkBindAccelerationStructureMemoryInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkBindAccelerationStructureMemoryInfoNV* forUnmarshaling);
 
 void marshal_VkWriteDescriptorSetAccelerationStructureNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkWriteDescriptorSetAccelerationStructureNV* forMarshaling);
 
 void unmarshal_VkWriteDescriptorSetAccelerationStructureNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkWriteDescriptorSetAccelerationStructureNV* forUnmarshaling);
 
 void marshal_VkAccelerationStructureMemoryRequirementsInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkAccelerationStructureMemoryRequirementsInfoNV* forMarshaling);
 
 void unmarshal_VkAccelerationStructureMemoryRequirementsInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkAccelerationStructureMemoryRequirementsInfoNV* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceRayTracingPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceRayTracingPropertiesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceRayTracingPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceRayTracingPropertiesNV* forUnmarshaling);
 
-void marshal_VkTransformMatrixKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkTransformMatrixKHR* forMarshaling);
+void marshal_VkTransformMatrixKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkTransformMatrixKHR* forMarshaling);
 
-void unmarshal_VkTransformMatrixKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkTransformMatrixKHR* forUnmarshaling);
+void unmarshal_VkTransformMatrixKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkTransformMatrixKHR* forUnmarshaling);
 
 DEFINE_ALIAS_FUNCTION(marshal_VkTransformMatrixKHR, marshal_VkTransformMatrixNV)
 
 DEFINE_ALIAS_FUNCTION(unmarshal_VkTransformMatrixKHR, unmarshal_VkTransformMatrixNV)
 
-void marshal_VkAabbPositionsKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkAabbPositionsKHR* forMarshaling);
+void marshal_VkAabbPositionsKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                const VkAabbPositionsKHR* forMarshaling);
 
-void unmarshal_VkAabbPositionsKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAabbPositionsKHR* forUnmarshaling);
+void unmarshal_VkAabbPositionsKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkAabbPositionsKHR* forUnmarshaling);
 
 DEFINE_ALIAS_FUNCTION(marshal_VkAabbPositionsKHR, marshal_VkAabbPositionsNV)
 
 DEFINE_ALIAS_FUNCTION(unmarshal_VkAabbPositionsKHR, unmarshal_VkAabbPositionsNV)
 
 void marshal_VkAccelerationStructureInstanceKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkAccelerationStructureInstanceKHR* forMarshaling);
 
 void unmarshal_VkAccelerationStructureInstanceKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkAccelerationStructureInstanceKHR* forUnmarshaling);
 
-DEFINE_ALIAS_FUNCTION(marshal_VkAccelerationStructureInstanceKHR, marshal_VkAccelerationStructureInstanceNV)
+DEFINE_ALIAS_FUNCTION(marshal_VkAccelerationStructureInstanceKHR,
+                      marshal_VkAccelerationStructureInstanceNV)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkAccelerationStructureInstanceKHR, unmarshal_VkAccelerationStructureInstanceNV)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkAccelerationStructureInstanceKHR,
+                      unmarshal_VkAccelerationStructureInstanceNV)
 
 #define OP_vkCreateAccelerationStructureNV 259713020
 #define OP_vkDestroyAccelerationStructureNV 252775746
@@ -6456,45 +4951,37 @@
 #endif
 #ifdef VK_NV_representative_fragment_test
 void marshal_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* forUnmarshaling);
 
 void marshal_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineRepresentativeFragmentTestStateCreateInfoNV* forMarshaling);
 
 void unmarshal_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineRepresentativeFragmentTestStateCreateInfoNV* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_filter_cubic
 void marshal_VkPhysicalDeviceImageViewImageFormatInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceImageViewImageFormatInfoEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceImageViewImageFormatInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceImageViewImageFormatInfoEXT* forUnmarshaling);
 
 void marshal_VkFilterCubicImageViewImageFormatPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkFilterCubicImageViewImageFormatPropertiesEXT* forMarshaling);
 
 void unmarshal_VkFilterCubicImageViewImageFormatPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkFilterCubicImageViewImageFormatPropertiesEXT* forUnmarshaling);
 
 #endif
@@ -6502,45 +4989,35 @@
 #endif
 #ifdef VK_EXT_global_priority
 void marshal_VkDeviceQueueGlobalPriorityCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkDeviceQueueGlobalPriorityCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkDeviceQueueGlobalPriorityCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkDeviceQueueGlobalPriorityCreateInfoEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_external_memory_host
 void marshal_VkImportMemoryHostPointerInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkImportMemoryHostPointerInfoEXT* forMarshaling);
 
-void unmarshal_VkImportMemoryHostPointerInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportMemoryHostPointerInfoEXT* forUnmarshaling);
+void unmarshal_VkImportMemoryHostPointerInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkImportMemoryHostPointerInfoEXT* forUnmarshaling);
 
 void marshal_VkMemoryHostPointerPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkMemoryHostPointerPropertiesEXT* forMarshaling);
 
-void unmarshal_VkMemoryHostPointerPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryHostPointerPropertiesEXT* forUnmarshaling);
+void unmarshal_VkMemoryHostPointerPropertiesEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkMemoryHostPointerPropertiesEXT* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceExternalMemoryHostPropertiesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceExternalMemoryHostPropertiesEXT* forUnmarshaling);
 
 #define OP_vkGetMemoryHostPointerPropertiesEXT 20313
@@ -6550,199 +5027,150 @@
 #endif
 #ifdef VK_AMD_pipeline_compiler_control
 void marshal_VkPipelineCompilerControlCreateInfoAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineCompilerControlCreateInfoAMD* forMarshaling);
 
 void unmarshal_VkPipelineCompilerControlCreateInfoAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineCompilerControlCreateInfoAMD* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_calibrated_timestamps
-void marshal_VkCalibratedTimestampInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCalibratedTimestampInfoEXT* forMarshaling);
+void marshal_VkCalibratedTimestampInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                          const VkCalibratedTimestampInfoEXT* forMarshaling);
 
-void unmarshal_VkCalibratedTimestampInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCalibratedTimestampInfoEXT* forUnmarshaling);
+void unmarshal_VkCalibratedTimestampInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkCalibratedTimestampInfoEXT* forUnmarshaling);
 
 #define OP_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT 295643221
 #define OP_vkGetCalibratedTimestampsEXT 203583186
 #endif
 #ifdef VK_AMD_shader_core_properties
 void marshal_VkPhysicalDeviceShaderCorePropertiesAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceShaderCorePropertiesAMD* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShaderCorePropertiesAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceShaderCorePropertiesAMD* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_video_decode_h265
-void marshal_VkVideoDecodeH265ProfileEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoDecodeH265ProfileEXT* forMarshaling);
+void marshal_VkVideoDecodeH265ProfileEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkVideoDecodeH265ProfileEXT* forMarshaling);
 
-void unmarshal_VkVideoDecodeH265ProfileEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH265ProfileEXT* forUnmarshaling);
+void unmarshal_VkVideoDecodeH265ProfileEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkVideoDecodeH265ProfileEXT* forUnmarshaling);
 
 void marshal_VkVideoDecodeH265CapabilitiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkVideoDecodeH265CapabilitiesEXT* forMarshaling);
 
-void unmarshal_VkVideoDecodeH265CapabilitiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH265CapabilitiesEXT* forUnmarshaling);
+void unmarshal_VkVideoDecodeH265CapabilitiesEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkVideoDecodeH265CapabilitiesEXT* forUnmarshaling);
 
 void marshal_VkVideoDecodeH265SessionCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkVideoDecodeH265SessionCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkVideoDecodeH265SessionCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkVideoDecodeH265SessionCreateInfoEXT* forUnmarshaling);
 
 void marshal_VkVideoDecodeH265SessionParametersAddInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkVideoDecodeH265SessionParametersAddInfoEXT* forMarshaling);
 
 void unmarshal_VkVideoDecodeH265SessionParametersAddInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkVideoDecodeH265SessionParametersAddInfoEXT* forUnmarshaling);
 
 void marshal_VkVideoDecodeH265SessionParametersCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkVideoDecodeH265SessionParametersCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkVideoDecodeH265SessionParametersCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkVideoDecodeH265SessionParametersCreateInfoEXT* forUnmarshaling);
 
-void marshal_VkVideoDecodeH265PictureInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoDecodeH265PictureInfoEXT* forMarshaling);
+void marshal_VkVideoDecodeH265PictureInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkVideoDecodeH265PictureInfoEXT* forMarshaling);
 
-void unmarshal_VkVideoDecodeH265PictureInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH265PictureInfoEXT* forUnmarshaling);
+void unmarshal_VkVideoDecodeH265PictureInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkVideoDecodeH265PictureInfoEXT* forUnmarshaling);
 
-void marshal_VkVideoDecodeH265DpbSlotInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkVideoDecodeH265DpbSlotInfoEXT* forMarshaling);
+void marshal_VkVideoDecodeH265DpbSlotInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkVideoDecodeH265DpbSlotInfoEXT* forMarshaling);
 
-void unmarshal_VkVideoDecodeH265DpbSlotInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH265DpbSlotInfoEXT* forUnmarshaling);
+void unmarshal_VkVideoDecodeH265DpbSlotInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkVideoDecodeH265DpbSlotInfoEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_AMD_memory_overallocation_behavior
 void marshal_VkDeviceMemoryOverallocationCreateInfoAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkDeviceMemoryOverallocationCreateInfoAMD* forMarshaling);
 
 void unmarshal_VkDeviceMemoryOverallocationCreateInfoAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkDeviceMemoryOverallocationCreateInfoAMD* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_vertex_attribute_divisor
 void marshal_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* forUnmarshaling);
 
 void marshal_VkVertexInputBindingDivisorDescriptionEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkVertexInputBindingDivisorDescriptionEXT* forMarshaling);
 
 void unmarshal_VkVertexInputBindingDivisorDescriptionEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkVertexInputBindingDivisorDescriptionEXT* forUnmarshaling);
 
 void marshal_VkPipelineVertexInputDivisorStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineVertexInputDivisorStateCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkPipelineVertexInputDivisorStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineVertexInputDivisorStateCreateInfoEXT* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_GGP_frame_token
-void marshal_VkPresentFrameTokenGGP(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPresentFrameTokenGGP* forMarshaling);
+void marshal_VkPresentFrameTokenGGP(VulkanStream* vkStream, VkStructureType rootType,
+                                    const VkPresentFrameTokenGGP* forMarshaling);
 
-void unmarshal_VkPresentFrameTokenGGP(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPresentFrameTokenGGP* forUnmarshaling);
+void unmarshal_VkPresentFrameTokenGGP(VulkanStream* vkStream, VkStructureType rootType,
+                                      VkPresentFrameTokenGGP* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_pipeline_creation_feedback
-void marshal_VkPipelineCreationFeedbackEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPipelineCreationFeedbackEXT* forMarshaling);
+void marshal_VkPipelineCreationFeedbackEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkPipelineCreationFeedbackEXT* forMarshaling);
 
-void unmarshal_VkPipelineCreationFeedbackEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineCreationFeedbackEXT* forUnmarshaling);
+void unmarshal_VkPipelineCreationFeedbackEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkPipelineCreationFeedbackEXT* forUnmarshaling);
 
 void marshal_VkPipelineCreationFeedbackCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineCreationFeedbackCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkPipelineCreationFeedbackCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineCreationFeedbackCreateInfoEXT* forUnmarshaling);
 
 #endif
@@ -6750,46 +5178,37 @@
 #endif
 #ifdef VK_NV_compute_shader_derivatives
 void marshal_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* forUnmarshaling);
 
 #endif
 #ifdef VK_NV_mesh_shader
 void marshal_VkPhysicalDeviceMeshShaderFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceMeshShaderFeaturesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceMeshShaderFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceMeshShaderFeaturesNV* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceMeshShaderPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceMeshShaderPropertiesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceMeshShaderPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceMeshShaderPropertiesNV* forUnmarshaling);
 
 void marshal_VkDrawMeshTasksIndirectCommandNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkDrawMeshTasksIndirectCommandNV* forMarshaling);
 
-void unmarshal_VkDrawMeshTasksIndirectCommandNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDrawMeshTasksIndirectCommandNV* forUnmarshaling);
+void unmarshal_VkDrawMeshTasksIndirectCommandNV(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkDrawMeshTasksIndirectCommandNV* forUnmarshaling);
 
 #define OP_vkCmdDrawMeshTasksNV 207334931
 #define OP_vkCmdDrawMeshTasksIndirectNV 274079208
@@ -6797,170 +5216,132 @@
 #endif
 #ifdef VK_NV_fragment_shader_barycentric
 void marshal_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* forUnmarshaling);
 
 #endif
 #ifdef VK_NV_shader_image_footprint
 void marshal_VkPhysicalDeviceShaderImageFootprintFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceShaderImageFootprintFeaturesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShaderImageFootprintFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceShaderImageFootprintFeaturesNV* forUnmarshaling);
 
 #endif
 #ifdef VK_NV_scissor_exclusive
 void marshal_VkPipelineViewportExclusiveScissorStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineViewportExclusiveScissorStateCreateInfoNV* forMarshaling);
 
 void unmarshal_VkPipelineViewportExclusiveScissorStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineViewportExclusiveScissorStateCreateInfoNV* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceExclusiveScissorFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceExclusiveScissorFeaturesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceExclusiveScissorFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceExclusiveScissorFeaturesNV* forUnmarshaling);
 
 #define OP_vkCmdSetExclusiveScissorNV 225408194
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
 void marshal_VkQueueFamilyCheckpointPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkQueueFamilyCheckpointPropertiesNV* forMarshaling);
 
 void unmarshal_VkQueueFamilyCheckpointPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkQueueFamilyCheckpointPropertiesNV* forUnmarshaling);
 
-void marshal_VkCheckpointDataNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCheckpointDataNV* forMarshaling);
+void marshal_VkCheckpointDataNV(VulkanStream* vkStream, VkStructureType rootType,
+                                const VkCheckpointDataNV* forMarshaling);
 
-void unmarshal_VkCheckpointDataNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCheckpointDataNV* forUnmarshaling);
+void unmarshal_VkCheckpointDataNV(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkCheckpointDataNV* forUnmarshaling);
 
 #define OP_vkCmdSetCheckpointNV 20315
 #define OP_vkGetQueueCheckpointDataNV 20316
 #endif
 #ifdef VK_INTEL_shader_integer_functions2
 void marshal_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* forUnmarshaling);
 
 #endif
 #ifdef VK_INTEL_performance_query
-void marshal_VkPerformanceValueDataINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPerformanceValueDataINTEL* forMarshaling);
+void marshal_VkPerformanceValueDataINTEL(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkPerformanceValueDataINTEL* forMarshaling);
 
-void unmarshal_VkPerformanceValueDataINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPerformanceValueDataINTEL* forUnmarshaling);
+void unmarshal_VkPerformanceValueDataINTEL(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkPerformanceValueDataINTEL* forUnmarshaling);
 
-void marshal_VkPerformanceValueINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPerformanceValueINTEL* forMarshaling);
+void marshal_VkPerformanceValueINTEL(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkPerformanceValueINTEL* forMarshaling);
 
-void unmarshal_VkPerformanceValueINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPerformanceValueINTEL* forUnmarshaling);
+void unmarshal_VkPerformanceValueINTEL(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkPerformanceValueINTEL* forUnmarshaling);
 
 void marshal_VkInitializePerformanceApiInfoINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkInitializePerformanceApiInfoINTEL* forMarshaling);
 
 void unmarshal_VkInitializePerformanceApiInfoINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkInitializePerformanceApiInfoINTEL* forUnmarshaling);
 
 void marshal_VkQueryPoolPerformanceQueryCreateInfoINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkQueryPoolPerformanceQueryCreateInfoINTEL* forMarshaling);
 
 void unmarshal_VkQueryPoolPerformanceQueryCreateInfoINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkQueryPoolPerformanceQueryCreateInfoINTEL* forUnmarshaling);
 
-DEFINE_ALIAS_FUNCTION(marshal_VkQueryPoolPerformanceQueryCreateInfoINTEL, marshal_VkQueryPoolCreateInfoINTEL)
+DEFINE_ALIAS_FUNCTION(marshal_VkQueryPoolPerformanceQueryCreateInfoINTEL,
+                      marshal_VkQueryPoolCreateInfoINTEL)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkQueryPoolPerformanceQueryCreateInfoINTEL, unmarshal_VkQueryPoolCreateInfoINTEL)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkQueryPoolPerformanceQueryCreateInfoINTEL,
+                      unmarshal_VkQueryPoolCreateInfoINTEL)
 
-void marshal_VkPerformanceMarkerInfoINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPerformanceMarkerInfoINTEL* forMarshaling);
+void marshal_VkPerformanceMarkerInfoINTEL(VulkanStream* vkStream, VkStructureType rootType,
+                                          const VkPerformanceMarkerInfoINTEL* forMarshaling);
 
-void unmarshal_VkPerformanceMarkerInfoINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPerformanceMarkerInfoINTEL* forUnmarshaling);
+void unmarshal_VkPerformanceMarkerInfoINTEL(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkPerformanceMarkerInfoINTEL* forUnmarshaling);
 
 void marshal_VkPerformanceStreamMarkerInfoINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPerformanceStreamMarkerInfoINTEL* forMarshaling);
 
 void unmarshal_VkPerformanceStreamMarkerInfoINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPerformanceStreamMarkerInfoINTEL* forUnmarshaling);
 
-void marshal_VkPerformanceOverrideInfoINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPerformanceOverrideInfoINTEL* forMarshaling);
+void marshal_VkPerformanceOverrideInfoINTEL(VulkanStream* vkStream, VkStructureType rootType,
+                                            const VkPerformanceOverrideInfoINTEL* forMarshaling);
 
-void unmarshal_VkPerformanceOverrideInfoINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPerformanceOverrideInfoINTEL* forUnmarshaling);
+void unmarshal_VkPerformanceOverrideInfoINTEL(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkPerformanceOverrideInfoINTEL* forUnmarshaling);
 
 void marshal_VkPerformanceConfigurationAcquireInfoINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPerformanceConfigurationAcquireInfoINTEL* forMarshaling);
 
 void unmarshal_VkPerformanceConfigurationAcquireInfoINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPerformanceConfigurationAcquireInfoINTEL* forUnmarshaling);
 
 #define OP_vkInitializePerformanceApiINTEL 203336121
@@ -6975,101 +5356,85 @@
 #endif
 #ifdef VK_EXT_pci_bus_info
 void marshal_VkPhysicalDevicePCIBusInfoPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDevicePCIBusInfoPropertiesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDevicePCIBusInfoPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDevicePCIBusInfoPropertiesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_AMD_display_native_hdr
 void marshal_VkDisplayNativeHdrSurfaceCapabilitiesAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkDisplayNativeHdrSurfaceCapabilitiesAMD* forMarshaling);
 
 void unmarshal_VkDisplayNativeHdrSurfaceCapabilitiesAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkDisplayNativeHdrSurfaceCapabilitiesAMD* forUnmarshaling);
 
 void marshal_VkSwapchainDisplayNativeHdrCreateInfoAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkSwapchainDisplayNativeHdrCreateInfoAMD* forMarshaling);
 
 void unmarshal_VkSwapchainDisplayNativeHdrCreateInfoAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkSwapchainDisplayNativeHdrCreateInfoAMD* forUnmarshaling);
 
 #define OP_vkSetLocalDimmingAMD 267533472
 #endif
 #ifdef VK_FUCHSIA_imagepipe_surface
 void marshal_VkImagePipeSurfaceCreateInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkImagePipeSurfaceCreateInfoFUCHSIA* forMarshaling);
 
 void unmarshal_VkImagePipeSurfaceCreateInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkImagePipeSurfaceCreateInfoFUCHSIA* forUnmarshaling);
 
 #define OP_vkCreateImagePipeSurfaceFUCHSIA 261626137
 #endif
 #ifdef VK_EXT_metal_surface
-void marshal_VkMetalSurfaceCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMetalSurfaceCreateInfoEXT* forMarshaling);
+void marshal_VkMetalSurfaceCreateInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                         const VkMetalSurfaceCreateInfoEXT* forMarshaling);
 
-void unmarshal_VkMetalSurfaceCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMetalSurfaceCreateInfoEXT* forUnmarshaling);
+void unmarshal_VkMetalSurfaceCreateInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkMetalSurfaceCreateInfoEXT* forUnmarshaling);
 
 #define OP_vkCreateMetalSurfaceEXT 254915953
 #endif
 #ifdef VK_EXT_fragment_density_map
 void marshal_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceFragmentDensityMapFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceFragmentDensityMapFeaturesEXT* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceFragmentDensityMapPropertiesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceFragmentDensityMapPropertiesEXT* forUnmarshaling);
 
 void marshal_VkRenderPassFragmentDensityMapCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkRenderPassFragmentDensityMapCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkRenderPassFragmentDensityMapCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkRenderPassFragmentDensityMapCreateInfoEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_scalar_block_layout
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceScalarBlockLayoutFeatures, marshal_VkPhysicalDeviceScalarBlockLayoutFeaturesEXT)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceScalarBlockLayoutFeatures,
+                      marshal_VkPhysicalDeviceScalarBlockLayoutFeaturesEXT)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceScalarBlockLayoutFeatures, unmarshal_VkPhysicalDeviceScalarBlockLayoutFeaturesEXT)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceScalarBlockLayoutFeatures,
+                      unmarshal_VkPhysicalDeviceScalarBlockLayoutFeaturesEXT)
 
 #endif
 #ifdef VK_GOOGLE_hlsl_functionality1
@@ -7078,424 +5443,352 @@
 #endif
 #ifdef VK_EXT_subgroup_size_control
 void marshal_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* forUnmarshaling);
 
 void marshal_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_AMD_shader_core_properties2
 void marshal_VkPhysicalDeviceShaderCoreProperties2AMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceShaderCoreProperties2AMD* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShaderCoreProperties2AMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceShaderCoreProperties2AMD* forUnmarshaling);
 
 #endif
 #ifdef VK_AMD_device_coherent_memory
 void marshal_VkPhysicalDeviceCoherentMemoryFeaturesAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceCoherentMemoryFeaturesAMD* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceCoherentMemoryFeaturesAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceCoherentMemoryFeaturesAMD* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_shader_image_atomic_int64
 void marshal_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_memory_budget
 void marshal_VkPhysicalDeviceMemoryBudgetPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceMemoryBudgetPropertiesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceMemoryBudgetPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceMemoryBudgetPropertiesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_memory_priority
 void marshal_VkPhysicalDeviceMemoryPriorityFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceMemoryPriorityFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceMemoryPriorityFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceMemoryPriorityFeaturesEXT* forUnmarshaling);
 
-void marshal_VkMemoryPriorityAllocateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMemoryPriorityAllocateInfoEXT* forMarshaling);
+void marshal_VkMemoryPriorityAllocateInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkMemoryPriorityAllocateInfoEXT* forMarshaling);
 
-void unmarshal_VkMemoryPriorityAllocateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryPriorityAllocateInfoEXT* forUnmarshaling);
+void unmarshal_VkMemoryPriorityAllocateInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkMemoryPriorityAllocateInfoEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_NV_dedicated_allocation_image_aliasing
 void marshal_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_buffer_device_address
 void marshal_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* forUnmarshaling);
 
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT, marshal_VkPhysicalDeviceBufferAddressFeaturesEXT)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT,
+                      marshal_VkPhysicalDeviceBufferAddressFeaturesEXT)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT, unmarshal_VkPhysicalDeviceBufferAddressFeaturesEXT)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT,
+                      unmarshal_VkPhysicalDeviceBufferAddressFeaturesEXT)
 
 DEFINE_ALIAS_FUNCTION(marshal_VkBufferDeviceAddressInfo, marshal_VkBufferDeviceAddressInfoEXT)
 
 DEFINE_ALIAS_FUNCTION(unmarshal_VkBufferDeviceAddressInfo, unmarshal_VkBufferDeviceAddressInfoEXT)
 
 void marshal_VkBufferDeviceAddressCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkBufferDeviceAddressCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkBufferDeviceAddressCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkBufferDeviceAddressCreateInfoEXT* forUnmarshaling);
 
 #define OP_vkGetBufferDeviceAddressEXT 224361693
 #endif
 #ifdef VK_EXT_tooling_info
 void marshal_VkPhysicalDeviceToolPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceToolPropertiesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceToolPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceToolPropertiesEXT* forUnmarshaling);
 
 #define OP_vkGetPhysicalDeviceToolPropertiesEXT 282247593
 #endif
 #ifdef VK_EXT_separate_stencil_usage
-DEFINE_ALIAS_FUNCTION(marshal_VkImageStencilUsageCreateInfo, marshal_VkImageStencilUsageCreateInfoEXT)
+DEFINE_ALIAS_FUNCTION(marshal_VkImageStencilUsageCreateInfo,
+                      marshal_VkImageStencilUsageCreateInfoEXT)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkImageStencilUsageCreateInfo, unmarshal_VkImageStencilUsageCreateInfoEXT)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkImageStencilUsageCreateInfo,
+                      unmarshal_VkImageStencilUsageCreateInfoEXT)
 
 #endif
 #ifdef VK_EXT_validation_features
-void marshal_VkValidationFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkValidationFeaturesEXT* forMarshaling);
+void marshal_VkValidationFeaturesEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                     const VkValidationFeaturesEXT* forMarshaling);
 
-void unmarshal_VkValidationFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkValidationFeaturesEXT* forUnmarshaling);
+void unmarshal_VkValidationFeaturesEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkValidationFeaturesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_NV_cooperative_matrix
-void marshal_VkCooperativeMatrixPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCooperativeMatrixPropertiesNV* forMarshaling);
+void marshal_VkCooperativeMatrixPropertiesNV(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkCooperativeMatrixPropertiesNV* forMarshaling);
 
-void unmarshal_VkCooperativeMatrixPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCooperativeMatrixPropertiesNV* forUnmarshaling);
+void unmarshal_VkCooperativeMatrixPropertiesNV(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkCooperativeMatrixPropertiesNV* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceCooperativeMatrixFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceCooperativeMatrixFeaturesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceCooperativeMatrixFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceCooperativeMatrixFeaturesNV* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceCooperativeMatrixPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceCooperativeMatrixPropertiesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceCooperativeMatrixPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceCooperativeMatrixPropertiesNV* forUnmarshaling);
 
 #define OP_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV 287711429
 #endif
 #ifdef VK_NV_coverage_reduction_mode
 void marshal_VkPhysicalDeviceCoverageReductionModeFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceCoverageReductionModeFeaturesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceCoverageReductionModeFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceCoverageReductionModeFeaturesNV* forUnmarshaling);
 
 void marshal_VkPipelineCoverageReductionStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineCoverageReductionStateCreateInfoNV* forMarshaling);
 
 void unmarshal_VkPipelineCoverageReductionStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineCoverageReductionStateCreateInfoNV* forUnmarshaling);
 
 void marshal_VkFramebufferMixedSamplesCombinationNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkFramebufferMixedSamplesCombinationNV* forMarshaling);
 
 void unmarshal_VkFramebufferMixedSamplesCombinationNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkFramebufferMixedSamplesCombinationNV* forUnmarshaling);
 
 #define OP_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV 292032159
 #endif
 #ifdef VK_EXT_fragment_shader_interlock
 void marshal_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_ycbcr_image_arrays
 void marshal_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_provoking_vertex
 void marshal_VkPhysicalDeviceProvokingVertexFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceProvokingVertexFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceProvokingVertexFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceProvokingVertexFeaturesEXT* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceProvokingVertexPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceProvokingVertexPropertiesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceProvokingVertexPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceProvokingVertexPropertiesEXT* forUnmarshaling);
 
 void marshal_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineRasterizationProvokingVertexStateCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineRasterizationProvokingVertexStateCreateInfoEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_full_screen_exclusive
 void marshal_VkSurfaceFullScreenExclusiveInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkSurfaceFullScreenExclusiveInfoEXT* forMarshaling);
 
 void unmarshal_VkSurfaceFullScreenExclusiveInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkSurfaceFullScreenExclusiveInfoEXT* forUnmarshaling);
 
 void marshal_VkSurfaceCapabilitiesFullScreenExclusiveEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkSurfaceCapabilitiesFullScreenExclusiveEXT* forMarshaling);
 
 void unmarshal_VkSurfaceCapabilitiesFullScreenExclusiveEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkSurfaceCapabilitiesFullScreenExclusiveEXT* forUnmarshaling);
 
 #define OP_vkGetPhysicalDeviceSurfacePresentModes2EXT 268126279
 #define OP_vkAcquireFullScreenExclusiveModeEXT 200946668
 #define OP_vkReleaseFullScreenExclusiveModeEXT 257629142
 void marshal_VkSurfaceFullScreenExclusiveWin32InfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkSurfaceFullScreenExclusiveWin32InfoEXT* forMarshaling);
 
 void unmarshal_VkSurfaceFullScreenExclusiveWin32InfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkSurfaceFullScreenExclusiveWin32InfoEXT* forUnmarshaling);
 
 #define OP_vkGetDeviceGroupSurfacePresentModes2EXT 206369543
 #endif
 #ifdef VK_EXT_headless_surface
-void marshal_VkHeadlessSurfaceCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkHeadlessSurfaceCreateInfoEXT* forMarshaling);
+void marshal_VkHeadlessSurfaceCreateInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                            const VkHeadlessSurfaceCreateInfoEXT* forMarshaling);
 
-void unmarshal_VkHeadlessSurfaceCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkHeadlessSurfaceCreateInfoEXT* forUnmarshaling);
+void unmarshal_VkHeadlessSurfaceCreateInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkHeadlessSurfaceCreateInfoEXT* forUnmarshaling);
 
 #define OP_vkCreateHeadlessSurfaceEXT 298411290
 #endif
 #ifdef VK_EXT_line_rasterization
 void marshal_VkPhysicalDeviceLineRasterizationFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceLineRasterizationFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceLineRasterizationFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceLineRasterizationFeaturesEXT* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceLineRasterizationPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceLineRasterizationPropertiesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceLineRasterizationPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceLineRasterizationPropertiesEXT* forUnmarshaling);
 
 void marshal_VkPipelineRasterizationLineStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineRasterizationLineStateCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkPipelineRasterizationLineStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineRasterizationLineStateCreateInfoEXT* forUnmarshaling);
 
 #define OP_vkCmdSetLineStippleEXT 263855692
 #endif
 #ifdef VK_EXT_shader_atomic_float
 void marshal_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_host_query_reset
-DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceHostQueryResetFeatures, marshal_VkPhysicalDeviceHostQueryResetFeaturesEXT)
+DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceHostQueryResetFeatures,
+                      marshal_VkPhysicalDeviceHostQueryResetFeaturesEXT)
 
-DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceHostQueryResetFeatures, unmarshal_VkPhysicalDeviceHostQueryResetFeaturesEXT)
+DEFINE_ALIAS_FUNCTION(unmarshal_VkPhysicalDeviceHostQueryResetFeatures,
+                      unmarshal_VkPhysicalDeviceHostQueryResetFeaturesEXT)
 
 #define OP_vkResetQueryPoolEXT 242995959
 #endif
 #ifdef VK_EXT_index_type_uint8
 void marshal_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceIndexTypeUint8FeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceIndexTypeUint8FeaturesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_extended_dynamic_state
 void marshal_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* forUnmarshaling);
 
 #define OP_vkCmdSetCullModeEXT 266285895
@@ -7513,157 +5806,120 @@
 #endif
 #ifdef VK_EXT_shader_atomic_float2
 void marshal_VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
 void marshal_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_NV_device_generated_commands
 void marshal_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* forUnmarshaling);
 
 void marshal_VkGraphicsShaderGroupCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkGraphicsShaderGroupCreateInfoNV* forMarshaling);
 
 void unmarshal_VkGraphicsShaderGroupCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkGraphicsShaderGroupCreateInfoNV* forUnmarshaling);
 
 void marshal_VkGraphicsPipelineShaderGroupsCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkGraphicsPipelineShaderGroupsCreateInfoNV* forMarshaling);
 
 void unmarshal_VkGraphicsPipelineShaderGroupsCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkGraphicsPipelineShaderGroupsCreateInfoNV* forUnmarshaling);
 
 void marshal_VkBindShaderGroupIndirectCommandNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkBindShaderGroupIndirectCommandNV* forMarshaling);
 
 void unmarshal_VkBindShaderGroupIndirectCommandNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkBindShaderGroupIndirectCommandNV* forUnmarshaling);
 
 void marshal_VkBindIndexBufferIndirectCommandNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkBindIndexBufferIndirectCommandNV* forMarshaling);
 
 void unmarshal_VkBindIndexBufferIndirectCommandNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkBindIndexBufferIndirectCommandNV* forUnmarshaling);
 
 void marshal_VkBindVertexBufferIndirectCommandNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkBindVertexBufferIndirectCommandNV* forMarshaling);
 
 void unmarshal_VkBindVertexBufferIndirectCommandNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkBindVertexBufferIndirectCommandNV* forUnmarshaling);
 
 void marshal_VkSetStateFlagsIndirectCommandNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkSetStateFlagsIndirectCommandNV* forMarshaling);
 
-void unmarshal_VkSetStateFlagsIndirectCommandNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSetStateFlagsIndirectCommandNV* forUnmarshaling);
+void unmarshal_VkSetStateFlagsIndirectCommandNV(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkSetStateFlagsIndirectCommandNV* forUnmarshaling);
 
-void marshal_VkIndirectCommandsStreamNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkIndirectCommandsStreamNV* forMarshaling);
+void marshal_VkIndirectCommandsStreamNV(VulkanStream* vkStream, VkStructureType rootType,
+                                        const VkIndirectCommandsStreamNV* forMarshaling);
 
-void unmarshal_VkIndirectCommandsStreamNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkIndirectCommandsStreamNV* forUnmarshaling);
+void unmarshal_VkIndirectCommandsStreamNV(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkIndirectCommandsStreamNV* forUnmarshaling);
 
-void marshal_VkIndirectCommandsLayoutTokenNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkIndirectCommandsLayoutTokenNV* forMarshaling);
+void marshal_VkIndirectCommandsLayoutTokenNV(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkIndirectCommandsLayoutTokenNV* forMarshaling);
 
-void unmarshal_VkIndirectCommandsLayoutTokenNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkIndirectCommandsLayoutTokenNV* forUnmarshaling);
+void unmarshal_VkIndirectCommandsLayoutTokenNV(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkIndirectCommandsLayoutTokenNV* forUnmarshaling);
 
 void marshal_VkIndirectCommandsLayoutCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkIndirectCommandsLayoutCreateInfoNV* forMarshaling);
 
 void unmarshal_VkIndirectCommandsLayoutCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkIndirectCommandsLayoutCreateInfoNV* forUnmarshaling);
 
-void marshal_VkGeneratedCommandsInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkGeneratedCommandsInfoNV* forMarshaling);
+void marshal_VkGeneratedCommandsInfoNV(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkGeneratedCommandsInfoNV* forMarshaling);
 
-void unmarshal_VkGeneratedCommandsInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkGeneratedCommandsInfoNV* forUnmarshaling);
+void unmarshal_VkGeneratedCommandsInfoNV(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkGeneratedCommandsInfoNV* forUnmarshaling);
 
 void marshal_VkGeneratedCommandsMemoryRequirementsInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkGeneratedCommandsMemoryRequirementsInfoNV* forMarshaling);
 
 void unmarshal_VkGeneratedCommandsMemoryRequirementsInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkGeneratedCommandsMemoryRequirementsInfoNV* forUnmarshaling);
 
 #define OP_vkGetGeneratedCommandsMemoryRequirementsNV 249047049
@@ -7675,99 +5931,81 @@
 #endif
 #ifdef VK_NV_inherited_viewport_scissor
 void marshal_VkPhysicalDeviceInheritedViewportScissorFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceInheritedViewportScissorFeaturesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceInheritedViewportScissorFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceInheritedViewportScissorFeaturesNV* forUnmarshaling);
 
 void marshal_VkCommandBufferInheritanceViewportScissorInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkCommandBufferInheritanceViewportScissorInfoNV* forMarshaling);
 
 void unmarshal_VkCommandBufferInheritanceViewportScissorInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkCommandBufferInheritanceViewportScissorInfoNV* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_texel_buffer_alignment
 void marshal_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_QCOM_render_pass_transform
 void marshal_VkRenderPassTransformBeginInfoQCOM(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkRenderPassTransformBeginInfoQCOM* forMarshaling);
 
 void unmarshal_VkRenderPassTransformBeginInfoQCOM(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkRenderPassTransformBeginInfoQCOM* forUnmarshaling);
 
 void marshal_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkCommandBufferInheritanceRenderPassTransformInfoQCOM* forMarshaling);
 
 void unmarshal_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkCommandBufferInheritanceRenderPassTransformInfoQCOM* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_device_memory_report
 void marshal_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* forUnmarshaling);
 
 void marshal_VkDeviceMemoryReportCallbackDataEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkDeviceMemoryReportCallbackDataEXT* forMarshaling);
 
 void unmarshal_VkDeviceMemoryReportCallbackDataEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkDeviceMemoryReportCallbackDataEXT* forUnmarshaling);
 
 void marshal_VkDeviceDeviceMemoryReportCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkDeviceDeviceMemoryReportCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkDeviceDeviceMemoryReportCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkDeviceDeviceMemoryReportCreateInfoEXT* forUnmarshaling);
 
 #endif
@@ -7777,55 +6015,45 @@
 #endif
 #ifdef VK_EXT_robustness2
 void marshal_VkPhysicalDeviceRobustness2FeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceRobustness2FeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceRobustness2FeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceRobustness2FeaturesEXT* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceRobustness2PropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceRobustness2PropertiesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceRobustness2PropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceRobustness2PropertiesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_custom_border_color
 void marshal_VkSamplerCustomBorderColorCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkSamplerCustomBorderColorCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkSamplerCustomBorderColorCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkSamplerCustomBorderColorCreateInfoEXT* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceCustomBorderColorPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceCustomBorderColorPropertiesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceCustomBorderColorPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceCustomBorderColorPropertiesEXT* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceCustomBorderColorFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceCustomBorderColorFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceCustomBorderColorFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceCustomBorderColorFeaturesEXT* forUnmarshaling);
 
 #endif
@@ -7833,34 +6061,25 @@
 #endif
 #ifdef VK_EXT_private_data
 void marshal_VkPhysicalDevicePrivateDataFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDevicePrivateDataFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDevicePrivateDataFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDevicePrivateDataFeaturesEXT* forUnmarshaling);
 
 void marshal_VkDevicePrivateDataCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkDevicePrivateDataCreateInfoEXT* forMarshaling);
 
-void unmarshal_VkDevicePrivateDataCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDevicePrivateDataCreateInfoEXT* forUnmarshaling);
+void unmarshal_VkDevicePrivateDataCreateInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkDevicePrivateDataCreateInfoEXT* forUnmarshaling);
 
-void marshal_VkPrivateDataSlotCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkPrivateDataSlotCreateInfoEXT* forMarshaling);
+void marshal_VkPrivateDataSlotCreateInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                            const VkPrivateDataSlotCreateInfoEXT* forMarshaling);
 
-void unmarshal_VkPrivateDataSlotCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPrivateDataSlotCreateInfoEXT* forUnmarshaling);
+void unmarshal_VkPrivateDataSlotCreateInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkPrivateDataSlotCreateInfoEXT* forUnmarshaling);
 
 #define OP_vkCreatePrivateDataSlotEXT 236374049
 #define OP_vkDestroyPrivateDataSlotEXT 208891309
@@ -7869,35 +6088,29 @@
 #endif
 #ifdef VK_EXT_pipeline_creation_cache_control
 void marshal_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_NV_device_diagnostics_config
 void marshal_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceDiagnosticsConfigFeaturesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceDiagnosticsConfigFeaturesNV* forUnmarshaling);
 
 void marshal_VkDeviceDiagnosticsConfigCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkDeviceDiagnosticsConfigCreateInfoNV* forMarshaling);
 
 void unmarshal_VkDeviceDiagnosticsConfigCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkDeviceDiagnosticsConfigCreateInfoNV* forUnmarshaling);
 
 #endif
@@ -7905,208 +6118,164 @@
 #endif
 #ifdef VK_NV_fragment_shading_rate_enums
 void marshal_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* forUnmarshaling);
 
 void marshal_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineFragmentShadingRateEnumStateCreateInfoNV* forMarshaling);
 
 void unmarshal_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineFragmentShadingRateEnumStateCreateInfoNV* forUnmarshaling);
 
 #define OP_vkCmdSetFragmentShadingRateEnumNV 264649847
 #endif
 #ifdef VK_NV_ray_tracing_motion_blur
-void marshal_VkDeviceOrHostAddressConstKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDeviceOrHostAddressConstKHR* forMarshaling);
+void marshal_VkDeviceOrHostAddressConstKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkDeviceOrHostAddressConstKHR* forMarshaling);
 
-void unmarshal_VkDeviceOrHostAddressConstKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceOrHostAddressConstKHR* forUnmarshaling);
+void unmarshal_VkDeviceOrHostAddressConstKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkDeviceOrHostAddressConstKHR* forUnmarshaling);
 
 void marshal_VkAccelerationStructureGeometryMotionTrianglesDataNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkAccelerationStructureGeometryMotionTrianglesDataNV* forMarshaling);
 
 void unmarshal_VkAccelerationStructureGeometryMotionTrianglesDataNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkAccelerationStructureGeometryMotionTrianglesDataNV* forUnmarshaling);
 
 void marshal_VkAccelerationStructureMotionInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkAccelerationStructureMotionInfoNV* forMarshaling);
 
 void unmarshal_VkAccelerationStructureMotionInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkAccelerationStructureMotionInfoNV* forUnmarshaling);
 
 void marshal_VkAccelerationStructureMatrixMotionInstanceNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkAccelerationStructureMatrixMotionInstanceNV* forMarshaling);
 
 void unmarshal_VkAccelerationStructureMatrixMotionInstanceNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkAccelerationStructureMatrixMotionInstanceNV* forUnmarshaling);
 
-void marshal_VkSRTDataNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSRTDataNV* forMarshaling);
+void marshal_VkSRTDataNV(VulkanStream* vkStream, VkStructureType rootType,
+                         const VkSRTDataNV* forMarshaling);
 
-void unmarshal_VkSRTDataNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSRTDataNV* forUnmarshaling);
+void unmarshal_VkSRTDataNV(VulkanStream* vkStream, VkStructureType rootType,
+                           VkSRTDataNV* forUnmarshaling);
 
 void marshal_VkAccelerationStructureSRTMotionInstanceNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkAccelerationStructureSRTMotionInstanceNV* forMarshaling);
 
 void unmarshal_VkAccelerationStructureSRTMotionInstanceNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkAccelerationStructureSRTMotionInstanceNV* forUnmarshaling);
 
 void marshal_VkAccelerationStructureMotionInstanceDataNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkAccelerationStructureMotionInstanceDataNV* forMarshaling);
 
 void unmarshal_VkAccelerationStructureMotionInstanceDataNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkAccelerationStructureMotionInstanceDataNV* forUnmarshaling);
 
 void marshal_VkAccelerationStructureMotionInstanceNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkAccelerationStructureMotionInstanceNV* forMarshaling);
 
 void unmarshal_VkAccelerationStructureMotionInstanceNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkAccelerationStructureMotionInstanceNV* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceRayTracingMotionBlurFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceRayTracingMotionBlurFeaturesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceRayTracingMotionBlurFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceRayTracingMotionBlurFeaturesNV* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_ycbcr_2plane_444_formats
 void marshal_VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_fragment_density_map2
 void marshal_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_QCOM_rotated_copy_commands
-void marshal_VkCopyCommandTransformInfoQCOM(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkCopyCommandTransformInfoQCOM* forMarshaling);
+void marshal_VkCopyCommandTransformInfoQCOM(VulkanStream* vkStream, VkStructureType rootType,
+                                            const VkCopyCommandTransformInfoQCOM* forMarshaling);
 
-void unmarshal_VkCopyCommandTransformInfoQCOM(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCopyCommandTransformInfoQCOM* forUnmarshaling);
+void unmarshal_VkCopyCommandTransformInfoQCOM(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkCopyCommandTransformInfoQCOM* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_image_robustness
 void marshal_VkPhysicalDeviceImageRobustnessFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceImageRobustnessFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceImageRobustnessFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceImageRobustnessFeaturesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_4444_formats
 void marshal_VkPhysicalDevice4444FormatsFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDevice4444FormatsFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDevice4444FormatsFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDevice4444FormatsFeaturesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_rgba10x6_formats
 void marshal_VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT* forUnmarshaling);
 
 #endif
@@ -8115,137 +6284,109 @@
 #define OP_vkGetWinrtDisplayNV 294381219
 #endif
 #ifdef VK_EXT_directfb_surface
-void marshal_VkDirectFBSurfaceCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDirectFBSurfaceCreateInfoEXT* forMarshaling);
+void marshal_VkDirectFBSurfaceCreateInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                            const VkDirectFBSurfaceCreateInfoEXT* forMarshaling);
 
-void unmarshal_VkDirectFBSurfaceCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDirectFBSurfaceCreateInfoEXT* forUnmarshaling);
+void unmarshal_VkDirectFBSurfaceCreateInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkDirectFBSurfaceCreateInfoEXT* forUnmarshaling);
 
 #define OP_vkCreateDirectFBSurfaceEXT 220792403
 #define OP_vkGetPhysicalDeviceDirectFBPresentationSupportEXT 285441990
 #endif
 #ifdef VK_VALVE_mutable_descriptor_type
 void marshal_VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE* forUnmarshaling);
 
 void marshal_VkMutableDescriptorTypeListVALVE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkMutableDescriptorTypeListVALVE* forMarshaling);
 
-void unmarshal_VkMutableDescriptorTypeListVALVE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMutableDescriptorTypeListVALVE* forUnmarshaling);
+void unmarshal_VkMutableDescriptorTypeListVALVE(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkMutableDescriptorTypeListVALVE* forUnmarshaling);
 
 void marshal_VkMutableDescriptorTypeCreateInfoVALVE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkMutableDescriptorTypeCreateInfoVALVE* forMarshaling);
 
 void unmarshal_VkMutableDescriptorTypeCreateInfoVALVE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkMutableDescriptorTypeCreateInfoVALVE* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_vertex_input_dynamic_state
 void marshal_VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT* forUnmarshaling);
 
 void marshal_VkVertexInputBindingDescription2EXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkVertexInputBindingDescription2EXT* forMarshaling);
 
 void unmarshal_VkVertexInputBindingDescription2EXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkVertexInputBindingDescription2EXT* forUnmarshaling);
 
 void marshal_VkVertexInputAttributeDescription2EXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkVertexInputAttributeDescription2EXT* forMarshaling);
 
 void unmarshal_VkVertexInputAttributeDescription2EXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkVertexInputAttributeDescription2EXT* forUnmarshaling);
 
 #define OP_vkCmdSetVertexInputEXT 211522810
 #endif
 #ifdef VK_EXT_physical_device_drm
 void marshal_VkPhysicalDeviceDrmPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceDrmPropertiesEXT* forMarshaling);
 
-void unmarshal_VkPhysicalDeviceDrmPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDrmPropertiesEXT* forUnmarshaling);
+void unmarshal_VkPhysicalDeviceDrmPropertiesEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkPhysicalDeviceDrmPropertiesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_primitive_topology_list_restart
 void marshal_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_FUCHSIA_external_memory
 void marshal_VkImportMemoryZirconHandleInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkImportMemoryZirconHandleInfoFUCHSIA* forMarshaling);
 
 void unmarshal_VkImportMemoryZirconHandleInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkImportMemoryZirconHandleInfoFUCHSIA* forUnmarshaling);
 
 void marshal_VkMemoryZirconHandlePropertiesFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkMemoryZirconHandlePropertiesFUCHSIA* forMarshaling);
 
 void unmarshal_VkMemoryZirconHandlePropertiesFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkMemoryZirconHandlePropertiesFUCHSIA* forUnmarshaling);
 
 void marshal_VkMemoryGetZirconHandleInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkMemoryGetZirconHandleInfoFUCHSIA* forMarshaling);
 
 void unmarshal_VkMemoryGetZirconHandleInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkMemoryGetZirconHandleInfoFUCHSIA* forUnmarshaling);
 
 #define OP_vkGetMemoryZirconHandleFUCHSIA 215089868
@@ -8253,23 +6394,19 @@
 #endif
 #ifdef VK_FUCHSIA_external_semaphore
 void marshal_VkImportSemaphoreZirconHandleInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkImportSemaphoreZirconHandleInfoFUCHSIA* forMarshaling);
 
 void unmarshal_VkImportSemaphoreZirconHandleInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkImportSemaphoreZirconHandleInfoFUCHSIA* forUnmarshaling);
 
 void marshal_VkSemaphoreGetZirconHandleInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkSemaphoreGetZirconHandleInfoFUCHSIA* forMarshaling);
 
 void unmarshal_VkSemaphoreGetZirconHandleInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkSemaphoreGetZirconHandleInfoFUCHSIA* forUnmarshaling);
 
 #define OP_vkImportSemaphoreZirconHandleFUCHSIA 299314530
@@ -8277,104 +6414,78 @@
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
 void marshal_VkBufferCollectionCreateInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkBufferCollectionCreateInfoFUCHSIA* forMarshaling);
 
 void unmarshal_VkBufferCollectionCreateInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkBufferCollectionCreateInfoFUCHSIA* forUnmarshaling);
 
 void marshal_VkImportMemoryBufferCollectionFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkImportMemoryBufferCollectionFUCHSIA* forMarshaling);
 
 void unmarshal_VkImportMemoryBufferCollectionFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkImportMemoryBufferCollectionFUCHSIA* forUnmarshaling);
 
 void marshal_VkBufferCollectionImageCreateInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkBufferCollectionImageCreateInfoFUCHSIA* forMarshaling);
 
 void unmarshal_VkBufferCollectionImageCreateInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkBufferCollectionImageCreateInfoFUCHSIA* forUnmarshaling);
 
 void marshal_VkBufferCollectionConstraintsInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkBufferCollectionConstraintsInfoFUCHSIA* forMarshaling);
 
 void unmarshal_VkBufferCollectionConstraintsInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkBufferCollectionConstraintsInfoFUCHSIA* forUnmarshaling);
 
-void marshal_VkBufferConstraintsInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkBufferConstraintsInfoFUCHSIA* forMarshaling);
+void marshal_VkBufferConstraintsInfoFUCHSIA(VulkanStream* vkStream, VkStructureType rootType,
+                                            const VkBufferConstraintsInfoFUCHSIA* forMarshaling);
 
-void unmarshal_VkBufferConstraintsInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferConstraintsInfoFUCHSIA* forUnmarshaling);
+void unmarshal_VkBufferConstraintsInfoFUCHSIA(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkBufferConstraintsInfoFUCHSIA* forUnmarshaling);
 
 void marshal_VkBufferCollectionBufferCreateInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkBufferCollectionBufferCreateInfoFUCHSIA* forMarshaling);
 
 void unmarshal_VkBufferCollectionBufferCreateInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkBufferCollectionBufferCreateInfoFUCHSIA* forUnmarshaling);
 
-void marshal_VkSysmemColorSpaceFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkSysmemColorSpaceFUCHSIA* forMarshaling);
+void marshal_VkSysmemColorSpaceFUCHSIA(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkSysmemColorSpaceFUCHSIA* forMarshaling);
 
-void unmarshal_VkSysmemColorSpaceFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSysmemColorSpaceFUCHSIA* forUnmarshaling);
+void unmarshal_VkSysmemColorSpaceFUCHSIA(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkSysmemColorSpaceFUCHSIA* forUnmarshaling);
 
 void marshal_VkBufferCollectionPropertiesFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkBufferCollectionPropertiesFUCHSIA* forMarshaling);
 
 void unmarshal_VkBufferCollectionPropertiesFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkBufferCollectionPropertiesFUCHSIA* forUnmarshaling);
 
 void marshal_VkImageFormatConstraintsInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkImageFormatConstraintsInfoFUCHSIA* forMarshaling);
 
 void unmarshal_VkImageFormatConstraintsInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkImageFormatConstraintsInfoFUCHSIA* forUnmarshaling);
 
-void marshal_VkImageConstraintsInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImageConstraintsInfoFUCHSIA* forMarshaling);
+void marshal_VkImageConstraintsInfoFUCHSIA(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkImageConstraintsInfoFUCHSIA* forMarshaling);
 
-void unmarshal_VkImageConstraintsInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageConstraintsInfoFUCHSIA* forUnmarshaling);
+void unmarshal_VkImageConstraintsInfoFUCHSIA(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkImageConstraintsInfoFUCHSIA* forUnmarshaling);
 
 #define OP_vkCreateBufferCollectionFUCHSIA 277502099
 #define OP_vkSetBufferCollectionImageConstraintsFUCHSIA 274938613
@@ -8384,33 +6495,27 @@
 #endif
 #ifdef VK_HUAWEI_subpass_shading
 void marshal_VkSubpassShadingPipelineCreateInfoHUAWEI(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkSubpassShadingPipelineCreateInfoHUAWEI* forMarshaling);
 
 void unmarshal_VkSubpassShadingPipelineCreateInfoHUAWEI(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkSubpassShadingPipelineCreateInfoHUAWEI* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceSubpassShadingFeaturesHUAWEI(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceSubpassShadingFeaturesHUAWEI* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceSubpassShadingFeaturesHUAWEI(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceSubpassShadingFeaturesHUAWEI* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceSubpassShadingPropertiesHUAWEI(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceSubpassShadingPropertiesHUAWEI* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceSubpassShadingPropertiesHUAWEI(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceSubpassShadingPropertiesHUAWEI* forUnmarshaling);
 
 #define OP_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI 225288634
@@ -8418,49 +6523,39 @@
 #endif
 #ifdef VK_HUAWEI_invocation_mask
 void marshal_VkPhysicalDeviceInvocationMaskFeaturesHUAWEI(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceInvocationMaskFeaturesHUAWEI* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceInvocationMaskFeaturesHUAWEI(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceInvocationMaskFeaturesHUAWEI* forUnmarshaling);
 
 #define OP_vkCmdBindInvocationMaskHUAWEI 299305130
 #endif
 #ifdef VK_NV_external_memory_rdma
-void marshal_VkMemoryGetRemoteAddressInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMemoryGetRemoteAddressInfoNV* forMarshaling);
+void marshal_VkMemoryGetRemoteAddressInfoNV(VulkanStream* vkStream, VkStructureType rootType,
+                                            const VkMemoryGetRemoteAddressInfoNV* forMarshaling);
 
-void unmarshal_VkMemoryGetRemoteAddressInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryGetRemoteAddressInfoNV* forUnmarshaling);
+void unmarshal_VkMemoryGetRemoteAddressInfoNV(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkMemoryGetRemoteAddressInfoNV* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceExternalMemoryRDMAFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceExternalMemoryRDMAFeaturesNV* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceExternalMemoryRDMAFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceExternalMemoryRDMAFeaturesNV* forUnmarshaling);
 
 #define OP_vkGetMemoryRemoteAddressNV 256917597
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
 void marshal_VkPhysicalDeviceExtendedDynamicState2FeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceExtendedDynamicState2FeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceExtendedDynamicState2FeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceExtendedDynamicState2FeaturesEXT* forUnmarshaling);
 
 #define OP_vkCmdSetPatchControlPointsEXT 208680354
@@ -8470,72 +6565,52 @@
 #define OP_vkCmdSetPrimitiveRestartEnableEXT 299567883
 #endif
 #ifdef VK_QNX_screen_surface
-void marshal_VkScreenSurfaceCreateInfoQNX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkScreenSurfaceCreateInfoQNX* forMarshaling);
+void marshal_VkScreenSurfaceCreateInfoQNX(VulkanStream* vkStream, VkStructureType rootType,
+                                          const VkScreenSurfaceCreateInfoQNX* forMarshaling);
 
-void unmarshal_VkScreenSurfaceCreateInfoQNX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkScreenSurfaceCreateInfoQNX* forUnmarshaling);
+void unmarshal_VkScreenSurfaceCreateInfoQNX(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkScreenSurfaceCreateInfoQNX* forUnmarshaling);
 
 #define OP_vkCreateScreenSurfaceQNX 224377168
 #define OP_vkGetPhysicalDeviceScreenPresentationSupportQNX 258528902
 #endif
 #ifdef VK_EXT_color_write_enable
 void marshal_VkPhysicalDeviceColorWriteEnableFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceColorWriteEnableFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceColorWriteEnableFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceColorWriteEnableFeaturesEXT* forUnmarshaling);
 
 void marshal_VkPipelineColorWriteCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPipelineColorWriteCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkPipelineColorWriteCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPipelineColorWriteCreateInfoEXT* forUnmarshaling);
 
 #define OP_vkCmdSetColorWriteEnableEXT 202223297
 #endif
 #ifdef VK_GOOGLE_gfxstream
-void marshal_VkImportColorBufferGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImportColorBufferGOOGLE* forMarshaling);
+void marshal_VkImportColorBufferGOOGLE(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkImportColorBufferGOOGLE* forMarshaling);
 
-void unmarshal_VkImportColorBufferGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportColorBufferGOOGLE* forUnmarshaling);
+void unmarshal_VkImportColorBufferGOOGLE(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkImportColorBufferGOOGLE* forUnmarshaling);
 
-void marshal_VkImportBufferGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImportBufferGOOGLE* forMarshaling);
+void marshal_VkImportBufferGOOGLE(VulkanStream* vkStream, VkStructureType rootType,
+                                  const VkImportBufferGOOGLE* forMarshaling);
 
-void unmarshal_VkImportBufferGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportBufferGOOGLE* forUnmarshaling);
+void unmarshal_VkImportBufferGOOGLE(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkImportBufferGOOGLE* forUnmarshaling);
 
-void marshal_VkImportPhysicalAddressGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkImportPhysicalAddressGOOGLE* forMarshaling);
+void marshal_VkImportPhysicalAddressGOOGLE(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkImportPhysicalAddressGOOGLE* forMarshaling);
 
-void unmarshal_VkImportPhysicalAddressGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportPhysicalAddressGOOGLE* forUnmarshaling);
+void unmarshal_VkImportPhysicalAddressGOOGLE(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkImportPhysicalAddressGOOGLE* forUnmarshaling);
 
 #define OP_vkRegisterImageColorBufferGOOGLE 20318
 #define OP_vkRegisterBufferColorBufferGOOGLE 20319
@@ -8562,66 +6637,50 @@
 #endif
 #ifdef VK_EXT_global_priority_query
 void marshal_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT* forUnmarshaling);
 
 void marshal_VkQueueFamilyGlobalPriorityPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkQueueFamilyGlobalPriorityPropertiesEXT* forMarshaling);
 
 void unmarshal_VkQueueFamilyGlobalPriorityPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkQueueFamilyGlobalPriorityPropertiesEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_multi_draw
 void marshal_VkPhysicalDeviceMultiDrawFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceMultiDrawFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceMultiDrawFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceMultiDrawFeaturesEXT* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceMultiDrawPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceMultiDrawPropertiesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceMultiDrawPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceMultiDrawPropertiesEXT* forUnmarshaling);
 
-void marshal_VkMultiDrawInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMultiDrawInfoEXT* forMarshaling);
+void marshal_VkMultiDrawInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                const VkMultiDrawInfoEXT* forMarshaling);
 
-void unmarshal_VkMultiDrawInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMultiDrawInfoEXT* forUnmarshaling);
+void unmarshal_VkMultiDrawInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkMultiDrawInfoEXT* forUnmarshaling);
 
-void marshal_VkMultiDrawIndexedInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkMultiDrawIndexedInfoEXT* forMarshaling);
+void marshal_VkMultiDrawIndexedInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                       const VkMultiDrawIndexedInfoEXT* forMarshaling);
 
-void unmarshal_VkMultiDrawIndexedInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMultiDrawIndexedInfoEXT* forUnmarshaling);
+void unmarshal_VkMultiDrawIndexedInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkMultiDrawIndexedInfoEXT* forUnmarshaling);
 
 #define OP_vkCmdDrawMultiEXT 263629455
 #define OP_vkCmdDrawMultiIndexedEXT 284764463
@@ -8630,218 +6689,174 @@
 #endif
 #ifdef VK_EXT_border_color_swizzle
 void marshal_VkPhysicalDeviceBorderColorSwizzleFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceBorderColorSwizzleFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceBorderColorSwizzleFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceBorderColorSwizzleFeaturesEXT* forUnmarshaling);
 
 void marshal_VkSamplerBorderColorComponentMappingCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkSamplerBorderColorComponentMappingCreateInfoEXT* forMarshaling);
 
 void unmarshal_VkSamplerBorderColorComponentMappingCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkSamplerBorderColorComponentMappingCreateInfoEXT* forUnmarshaling);
 
 #endif
 #ifdef VK_EXT_pageable_device_local_memory
 void marshal_VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT* forMarshaling);
 
 void unmarshal_VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT* forUnmarshaling);
 
 #define OP_vkSetDeviceMemoryPriorityEXT 223991870
 #endif
 #ifdef VK_KHR_acceleration_structure
-void marshal_VkDeviceOrHostAddressKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkDeviceOrHostAddressKHR* forMarshaling);
+void marshal_VkDeviceOrHostAddressKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                      const VkDeviceOrHostAddressKHR* forMarshaling);
 
-void unmarshal_VkDeviceOrHostAddressKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceOrHostAddressKHR* forUnmarshaling);
+void unmarshal_VkDeviceOrHostAddressKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkDeviceOrHostAddressKHR* forUnmarshaling);
 
 void marshal_VkAccelerationStructureBuildRangeInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkAccelerationStructureBuildRangeInfoKHR* forMarshaling);
 
 void unmarshal_VkAccelerationStructureBuildRangeInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkAccelerationStructureBuildRangeInfoKHR* forUnmarshaling);
 
 void marshal_VkAccelerationStructureGeometryTrianglesDataKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkAccelerationStructureGeometryTrianglesDataKHR* forMarshaling);
 
 void unmarshal_VkAccelerationStructureGeometryTrianglesDataKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkAccelerationStructureGeometryTrianglesDataKHR* forUnmarshaling);
 
 void marshal_VkAccelerationStructureGeometryAabbsDataKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkAccelerationStructureGeometryAabbsDataKHR* forMarshaling);
 
 void unmarshal_VkAccelerationStructureGeometryAabbsDataKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkAccelerationStructureGeometryAabbsDataKHR* forUnmarshaling);
 
 void marshal_VkAccelerationStructureGeometryInstancesDataKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkAccelerationStructureGeometryInstancesDataKHR* forMarshaling);
 
 void unmarshal_VkAccelerationStructureGeometryInstancesDataKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkAccelerationStructureGeometryInstancesDataKHR* forUnmarshaling);
 
 void marshal_VkAccelerationStructureGeometryDataKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkAccelerationStructureGeometryDataKHR* forMarshaling);
 
 void unmarshal_VkAccelerationStructureGeometryDataKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkAccelerationStructureGeometryDataKHR* forUnmarshaling);
 
 void marshal_VkAccelerationStructureGeometryKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkAccelerationStructureGeometryKHR* forMarshaling);
 
 void unmarshal_VkAccelerationStructureGeometryKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkAccelerationStructureGeometryKHR* forUnmarshaling);
 
 void marshal_VkAccelerationStructureBuildGeometryInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkAccelerationStructureBuildGeometryInfoKHR* forMarshaling);
 
 void unmarshal_VkAccelerationStructureBuildGeometryInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkAccelerationStructureBuildGeometryInfoKHR* forUnmarshaling);
 
 void marshal_VkAccelerationStructureCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkAccelerationStructureCreateInfoKHR* forMarshaling);
 
 void unmarshal_VkAccelerationStructureCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkAccelerationStructureCreateInfoKHR* forUnmarshaling);
 
 void marshal_VkWriteDescriptorSetAccelerationStructureKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkWriteDescriptorSetAccelerationStructureKHR* forMarshaling);
 
 void unmarshal_VkWriteDescriptorSetAccelerationStructureKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkWriteDescriptorSetAccelerationStructureKHR* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceAccelerationStructureFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceAccelerationStructureFeaturesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceAccelerationStructureFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceAccelerationStructureFeaturesKHR* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceAccelerationStructurePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceAccelerationStructurePropertiesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceAccelerationStructurePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceAccelerationStructurePropertiesKHR* forUnmarshaling);
 
 void marshal_VkAccelerationStructureDeviceAddressInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkAccelerationStructureDeviceAddressInfoKHR* forMarshaling);
 
 void unmarshal_VkAccelerationStructureDeviceAddressInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkAccelerationStructureDeviceAddressInfoKHR* forUnmarshaling);
 
 void marshal_VkAccelerationStructureVersionInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkAccelerationStructureVersionInfoKHR* forMarshaling);
 
 void unmarshal_VkAccelerationStructureVersionInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkAccelerationStructureVersionInfoKHR* forUnmarshaling);
 
 void marshal_VkCopyAccelerationStructureToMemoryInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkCopyAccelerationStructureToMemoryInfoKHR* forMarshaling);
 
 void unmarshal_VkCopyAccelerationStructureToMemoryInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkCopyAccelerationStructureToMemoryInfoKHR* forUnmarshaling);
 
 void marshal_VkCopyMemoryToAccelerationStructureInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkCopyMemoryToAccelerationStructureInfoKHR* forMarshaling);
 
 void unmarshal_VkCopyMemoryToAccelerationStructureInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkCopyMemoryToAccelerationStructureInfoKHR* forUnmarshaling);
 
 void marshal_VkCopyAccelerationStructureInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkCopyAccelerationStructureInfoKHR* forMarshaling);
 
 void unmarshal_VkCopyAccelerationStructureInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkCopyAccelerationStructureInfoKHR* forUnmarshaling);
 
 void marshal_VkAccelerationStructureBuildSizesInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkAccelerationStructureBuildSizesInfoKHR* forMarshaling);
 
 void unmarshal_VkAccelerationStructureBuildSizesInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkAccelerationStructureBuildSizesInfoKHR* forUnmarshaling);
 
 #define OP_vkCreateAccelerationStructureKHR 259403971
@@ -8863,74 +6878,56 @@
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
 void marshal_VkRayTracingShaderGroupCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkRayTracingShaderGroupCreateInfoKHR* forMarshaling);
 
 void unmarshal_VkRayTracingShaderGroupCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkRayTracingShaderGroupCreateInfoKHR* forUnmarshaling);
 
 void marshal_VkRayTracingPipelineInterfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkRayTracingPipelineInterfaceCreateInfoKHR* forMarshaling);
 
 void unmarshal_VkRayTracingPipelineInterfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkRayTracingPipelineInterfaceCreateInfoKHR* forUnmarshaling);
 
 void marshal_VkRayTracingPipelineCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkRayTracingPipelineCreateInfoKHR* forMarshaling);
 
 void unmarshal_VkRayTracingPipelineCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkRayTracingPipelineCreateInfoKHR* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceRayTracingPipelineFeaturesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceRayTracingPipelineFeaturesKHR* forUnmarshaling);
 
 void marshal_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceRayTracingPipelinePropertiesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceRayTracingPipelinePropertiesKHR* forUnmarshaling);
 
-void marshal_VkStridedDeviceAddressRegionKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkStridedDeviceAddressRegionKHR* forMarshaling);
+void marshal_VkStridedDeviceAddressRegionKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                             const VkStridedDeviceAddressRegionKHR* forMarshaling);
 
-void unmarshal_VkStridedDeviceAddressRegionKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkStridedDeviceAddressRegionKHR* forUnmarshaling);
+void unmarshal_VkStridedDeviceAddressRegionKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkStridedDeviceAddressRegionKHR* forUnmarshaling);
 
-void marshal_VkTraceRaysIndirectCommandKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const VkTraceRaysIndirectCommandKHR* forMarshaling);
+void marshal_VkTraceRaysIndirectCommandKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           const VkTraceRaysIndirectCommandKHR* forMarshaling);
 
-void unmarshal_VkTraceRaysIndirectCommandKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkTraceRaysIndirectCommandKHR* forUnmarshaling);
+void unmarshal_VkTraceRaysIndirectCommandKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkTraceRaysIndirectCommandKHR* forUnmarshaling);
 
 #define OP_vkCmdTraceRaysKHR 213680716
 #define OP_vkCreateRayTracingPipelinesKHR 247628685
@@ -8941,22 +6938,19 @@
 #endif
 #ifdef VK_KHR_ray_query
 void marshal_VkPhysicalDeviceRayQueryFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     const VkPhysicalDeviceRayQueryFeaturesKHR* forMarshaling);
 
 void unmarshal_VkPhysicalDeviceRayQueryFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
+    VulkanStream* vkStream, VkStructureType rootType,
     VkPhysicalDeviceRayQueryFeaturesKHR* forUnmarshaling);
 
 #endif
-const char* api_opcode_to_string(
-    const uint32_t opcode);
+const char* api_opcode_to_string(const uint32_t opcode);
 
 #define OP_vkFirst_old 20000
 #define OP_vkLast_old 30000
 #define OP_vkFirst 200000000
 #define OP_vkLast 300000000
 
-} // namespace goldfish_vk
+}  // namespace goldfish_vk
diff --git a/stream-servers/vulkan/cereal/common/goldfish_vk_reserved_marshaling.cpp b/stream-servers/vulkan/cereal/common/goldfish_vk_reserved_marshaling.cpp
index 769581f..2e95115 100644
--- a/stream-servers/vulkan/cereal/common/goldfish_vk_reserved_marshaling.cpp
+++ b/stream-servers/vulkan/cereal/common/goldfish_vk_reserved_marshaling.cpp
@@ -14,56 +14,47 @@
 // limitations under the License.
 
 // Autogenerated module goldfish_vk_reserved_marshaling
-// (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
+// (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal
+// -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
 // VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
 // VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+//
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o
+// $CEREAL_OUTPUT_DIR
+//
 
 #include "goldfish_vk_reserved_marshaling.h"
 
+#include <string.h>
 
 #include "goldfish_vk_extension_structs.h"
 #include "goldfish_vk_private_defs.h"
-#include <string.h>
-
 
 namespace goldfish_vk {
 
-void reservedmarshal_extension_struct(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    const void* structExtension,
-    uint8_t** ptr);
+void reservedmarshal_extension_struct(VulkanStream* vkStream, VkStructureType rootType,
+                                      const void* structExtension, uint8_t** ptr);
 
-void reservedunmarshal_extension_struct(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    void* structExtension_out,
-    uint8_t** ptr);
+void reservedunmarshal_extension_struct(VulkanStream* vkStream, VkStructureType rootType,
+                                        void* structExtension_out, uint8_t** ptr);
 
 #ifdef VK_VERSION_1_0
-void reservedunmarshal_VkExtent2D(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExtent2D* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkExtent2D(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkExtent2D* forUnmarshaling, uint8_t** ptr) {
     memcpy((uint32_t*)&forUnmarshaling->width, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->height, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkExtent3D(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExtent3D* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkExtent3D(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkExtent3D* forUnmarshaling, uint8_t** ptr) {
     memcpy((uint32_t*)&forUnmarshaling->width, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->height, *ptr, sizeof(uint32_t));
@@ -72,24 +63,16 @@
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkOffset2D(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkOffset2D* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkOffset2D(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkOffset2D* forUnmarshaling, uint8_t** ptr) {
     memcpy((int32_t*)&forUnmarshaling->x, *ptr, sizeof(int32_t));
     *ptr += sizeof(int32_t);
     memcpy((int32_t*)&forUnmarshaling->y, *ptr, sizeof(int32_t));
     *ptr += sizeof(int32_t);
 }
 
-void reservedunmarshal_VkOffset3D(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkOffset3D* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkOffset3D(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkOffset3D* forUnmarshaling, uint8_t** ptr) {
     memcpy((int32_t*)&forUnmarshaling->x, *ptr, sizeof(int32_t));
     *ptr += sizeof(int32_t);
     memcpy((int32_t*)&forUnmarshaling->y, *ptr, sizeof(int32_t));
@@ -98,26 +81,17 @@
     *ptr += sizeof(int32_t);
 }
 
-void reservedunmarshal_VkRect2D(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRect2D* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkRect2D(VulkanStream* vkStream, VkStructureType rootType,
+                                VkRect2D* forUnmarshaling, uint8_t** ptr) {
     reservedunmarshal_VkOffset2D(vkStream, rootType, (VkOffset2D*)(&forUnmarshaling->offset), ptr);
     reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->extent), ptr);
 }
 
-void reservedunmarshal_VkBaseInStructure(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBaseInStructure* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkBaseInStructure(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkBaseInStructure* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -125,28 +99,25 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((VkBaseInStructure*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
 }
 
-void reservedunmarshal_VkBaseOutStructure(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBaseOutStructure* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkBaseOutStructure(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkBaseOutStructure* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -154,28 +125,26 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((VkBaseOutStructure*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
 }
 
-void reservedunmarshal_VkBufferMemoryBarrier(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferMemoryBarrier* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkBufferMemoryBarrier(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkBufferMemoryBarrier* forUnmarshaling,
+                                             uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -183,15 +152,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkAccessFlags*)&forUnmarshaling->srcAccessMask, *ptr, sizeof(VkAccessFlags));
     *ptr += sizeof(VkAccessFlags);
@@ -211,12 +182,9 @@
     *ptr += sizeof(VkDeviceSize);
 }
 
-void reservedunmarshal_VkDispatchIndirectCommand(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDispatchIndirectCommand* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDispatchIndirectCommand(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkDispatchIndirectCommand* forUnmarshaling,
+                                                 uint8_t** ptr) {
     memcpy((uint32_t*)&forUnmarshaling->x, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->y, *ptr, sizeof(uint32_t));
@@ -225,12 +193,10 @@
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkDrawIndexedIndirectCommand(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDrawIndexedIndirectCommand* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDrawIndexedIndirectCommand(VulkanStream* vkStream,
+                                                    VkStructureType rootType,
+                                                    VkDrawIndexedIndirectCommand* forUnmarshaling,
+                                                    uint8_t** ptr) {
     memcpy((uint32_t*)&forUnmarshaling->indexCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->instanceCount, *ptr, sizeof(uint32_t));
@@ -243,12 +209,9 @@
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkDrawIndirectCommand(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDrawIndirectCommand* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDrawIndirectCommand(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkDrawIndirectCommand* forUnmarshaling,
+                                             uint8_t** ptr) {
     memcpy((uint32_t*)&forUnmarshaling->vertexCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->instanceCount, *ptr, sizeof(uint32_t));
@@ -259,12 +222,9 @@
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkImageSubresourceRange(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageSubresourceRange* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkImageSubresourceRange(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkImageSubresourceRange* forUnmarshaling,
+                                               uint8_t** ptr) {
     memcpy((VkImageAspectFlags*)&forUnmarshaling->aspectMask, *ptr, sizeof(VkImageAspectFlags));
     *ptr += sizeof(VkImageAspectFlags);
     memcpy((uint32_t*)&forUnmarshaling->baseMipLevel, *ptr, sizeof(uint32_t));
@@ -277,16 +237,11 @@
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkImageMemoryBarrier(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageMemoryBarrier* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkImageMemoryBarrier(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkImageMemoryBarrier* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -294,15 +249,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkAccessFlags*)&forUnmarshaling->srcAccessMask, *ptr, sizeof(VkAccessFlags));
     *ptr += sizeof(VkAccessFlags);
@@ -320,19 +277,15 @@
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
     *(VkImage*)&forUnmarshaling->image = (VkImage)unbox_VkImage((VkImage)(*&cgen_var_0));
-    reservedunmarshal_VkImageSubresourceRange(vkStream, rootType, (VkImageSubresourceRange*)(&forUnmarshaling->subresourceRange), ptr);
+    reservedunmarshal_VkImageSubresourceRange(
+        vkStream, rootType, (VkImageSubresourceRange*)(&forUnmarshaling->subresourceRange), ptr);
 }
 
-void reservedunmarshal_VkMemoryBarrier(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryBarrier* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkMemoryBarrier(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkMemoryBarrier* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -340,15 +293,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkAccessFlags*)&forUnmarshaling->srcAccessMask, *ptr, sizeof(VkAccessFlags));
     *ptr += sizeof(VkAccessFlags);
@@ -357,14 +312,12 @@
 }
 
 void reservedunmarshal_VkPipelineCacheHeaderVersionOne(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineCacheHeaderVersionOne* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineCacheHeaderVersionOne* forUnmarshaling, uint8_t** ptr) {
     memcpy((uint32_t*)&forUnmarshaling->headerSize, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((VkPipelineCacheHeaderVersion*)&forUnmarshaling->headerVersion, *ptr, sizeof(VkPipelineCacheHeaderVersion));
+    memcpy((VkPipelineCacheHeaderVersion*)&forUnmarshaling->headerVersion, *ptr,
+           sizeof(VkPipelineCacheHeaderVersion));
     *ptr += sizeof(VkPipelineCacheHeaderVersion);
     memcpy((uint32_t*)&forUnmarshaling->vendorID, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -374,18 +327,14 @@
     *ptr += VK_UUID_SIZE * sizeof(uint8_t);
 }
 
-void reservedunmarshal_VkAllocationCallbacks(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAllocationCallbacks* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkAllocationCallbacks(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkAllocationCallbacks* forUnmarshaling,
+                                             uint8_t** ptr) {
     // WARNING PTR CHECK
     memcpy((void**)&forUnmarshaling->pUserData, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pUserData);
     *ptr += 8;
-    if (forUnmarshaling->pUserData)
-    {
+    if (forUnmarshaling->pUserData) {
         vkStream->alloc((void**)&forUnmarshaling->pUserData, sizeof(uint8_t));
         memcpy((void*)forUnmarshaling->pUserData, *ptr, sizeof(uint8_t));
         *ptr += sizeof(uint8_t);
@@ -399,7 +348,8 @@
     memcpy((PFN_vkFreeFunction*)&forUnmarshaling->pfnFree, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pfnFree);
     *ptr += 8;
-    memcpy((PFN_vkInternalAllocationNotification*)&forUnmarshaling->pfnInternalAllocation, (*ptr), 8);
+    memcpy((PFN_vkInternalAllocationNotification*)&forUnmarshaling->pfnInternalAllocation, (*ptr),
+           8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pfnInternalAllocation);
     *ptr += 8;
     memcpy((PFN_vkInternalFreeNotification*)&forUnmarshaling->pfnInternalFree, (*ptr), 8);
@@ -407,16 +357,11 @@
     *ptr += 8;
 }
 
-void reservedunmarshal_VkApplicationInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkApplicationInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkApplicationInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkApplicationInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -424,46 +369,41 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
-    {
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT) {
         // WARNING PTR CHECK
         memcpy((char**)&forUnmarshaling->pApplicationName, (*ptr), 8);
         android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pApplicationName);
         *ptr += 8;
-        if (forUnmarshaling->pApplicationName)
-        {
-            vkStream->loadStringInPlaceWithStreamPtr((char**)&forUnmarshaling->pApplicationName, ptr);
+        if (forUnmarshaling->pApplicationName) {
+            vkStream->loadStringInPlaceWithStreamPtr((char**)&forUnmarshaling->pApplicationName,
+                                                     ptr);
         }
-    }
-    else
-    {
+    } else {
         vkStream->loadStringInPlaceWithStreamPtr((char**)&forUnmarshaling->pApplicationName, ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->applicationVersion, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
-    {
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT) {
         // WARNING PTR CHECK
         memcpy((char**)&forUnmarshaling->pEngineName, (*ptr), 8);
         android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pEngineName);
         *ptr += 8;
-        if (forUnmarshaling->pEngineName)
-        {
+        if (forUnmarshaling->pEngineName) {
             vkStream->loadStringInPlaceWithStreamPtr((char**)&forUnmarshaling->pEngineName, ptr);
         }
-    }
-    else
-    {
+    } else {
         vkStream->loadStringInPlaceWithStreamPtr((char**)&forUnmarshaling->pEngineName, ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->engineVersion, *ptr, sizeof(uint32_t));
@@ -472,27 +412,24 @@
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkFormatProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFormatProperties* forUnmarshaling,
-    uint8_t** ptr)
-{
-    memcpy((VkFormatFeatureFlags*)&forUnmarshaling->linearTilingFeatures, *ptr, sizeof(VkFormatFeatureFlags));
+void reservedunmarshal_VkFormatProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkFormatProperties* forUnmarshaling, uint8_t** ptr) {
+    memcpy((VkFormatFeatureFlags*)&forUnmarshaling->linearTilingFeatures, *ptr,
+           sizeof(VkFormatFeatureFlags));
     *ptr += sizeof(VkFormatFeatureFlags);
-    memcpy((VkFormatFeatureFlags*)&forUnmarshaling->optimalTilingFeatures, *ptr, sizeof(VkFormatFeatureFlags));
+    memcpy((VkFormatFeatureFlags*)&forUnmarshaling->optimalTilingFeatures, *ptr,
+           sizeof(VkFormatFeatureFlags));
     *ptr += sizeof(VkFormatFeatureFlags);
-    memcpy((VkFormatFeatureFlags*)&forUnmarshaling->bufferFeatures, *ptr, sizeof(VkFormatFeatureFlags));
+    memcpy((VkFormatFeatureFlags*)&forUnmarshaling->bufferFeatures, *ptr,
+           sizeof(VkFormatFeatureFlags));
     *ptr += sizeof(VkFormatFeatureFlags);
 }
 
-void reservedunmarshal_VkImageFormatProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageFormatProperties* forUnmarshaling,
-    uint8_t** ptr)
-{
-    reservedunmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forUnmarshaling->maxExtent), ptr);
+void reservedunmarshal_VkImageFormatProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkImageFormatProperties* forUnmarshaling,
+                                               uint8_t** ptr) {
+    reservedunmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forUnmarshaling->maxExtent),
+                                 ptr);
     memcpy((uint32_t*)&forUnmarshaling->maxMipLevels, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->maxArrayLayers, *ptr, sizeof(uint32_t));
@@ -503,16 +440,11 @@
     *ptr += sizeof(VkDeviceSize);
 }
 
-void reservedunmarshal_VkInstanceCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkInstanceCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkInstanceCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkInstanceCreateInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -520,15 +452,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkInstanceCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkInstanceCreateFlags));
     *ptr += sizeof(VkInstanceCreateFlags);
@@ -536,49 +470,42 @@
     memcpy((VkApplicationInfo**)&forUnmarshaling->pApplicationInfo, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pApplicationInfo);
     *ptr += 8;
-    if (forUnmarshaling->pApplicationInfo)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pApplicationInfo, sizeof(const VkApplicationInfo));
-        reservedunmarshal_VkApplicationInfo(vkStream, rootType, (VkApplicationInfo*)(forUnmarshaling->pApplicationInfo), ptr);
+    if (forUnmarshaling->pApplicationInfo) {
+        vkStream->alloc((void**)&forUnmarshaling->pApplicationInfo,
+                        sizeof(const VkApplicationInfo));
+        reservedunmarshal_VkApplicationInfo(
+            vkStream, rootType, (VkApplicationInfo*)(forUnmarshaling->pApplicationInfo), ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->enabledLayerCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->loadStringArrayInPlaceWithStreamPtr((char***)&forUnmarshaling->ppEnabledLayerNames, ptr);
+    vkStream->loadStringArrayInPlaceWithStreamPtr((char***)&forUnmarshaling->ppEnabledLayerNames,
+                                                  ptr);
     memcpy((uint32_t*)&forUnmarshaling->enabledExtensionCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->loadStringArrayInPlaceWithStreamPtr((char***)&forUnmarshaling->ppEnabledExtensionNames, ptr);
+    vkStream->loadStringArrayInPlaceWithStreamPtr(
+        (char***)&forUnmarshaling->ppEnabledExtensionNames, ptr);
 }
 
-void reservedunmarshal_VkMemoryHeap(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryHeap* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkMemoryHeap(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkMemoryHeap* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkDeviceSize*)&forUnmarshaling->size, *ptr, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
     memcpy((VkMemoryHeapFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkMemoryHeapFlags));
     *ptr += sizeof(VkMemoryHeapFlags);
 }
 
-void reservedunmarshal_VkMemoryType(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryType* forUnmarshaling,
-    uint8_t** ptr)
-{
-    memcpy((VkMemoryPropertyFlags*)&forUnmarshaling->propertyFlags, *ptr, sizeof(VkMemoryPropertyFlags));
+void reservedunmarshal_VkMemoryType(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkMemoryType* forUnmarshaling, uint8_t** ptr) {
+    memcpy((VkMemoryPropertyFlags*)&forUnmarshaling->propertyFlags, *ptr,
+           sizeof(VkMemoryPropertyFlags));
     *ptr += sizeof(VkMemoryPropertyFlags);
     memcpy((uint32_t*)&forUnmarshaling->heapIndex, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkPhysicalDeviceFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFeatures* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkPhysicalDeviceFeatures(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkPhysicalDeviceFeatures* forUnmarshaling,
+                                                uint8_t** ptr) {
     memcpy((VkBool32*)&forUnmarshaling->robustBufferAccess, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy((VkBool32*)&forUnmarshaling->fullDrawIndexUint32, *ptr, sizeof(VkBool32));
@@ -633,7 +560,8 @@
     *ptr += sizeof(VkBool32);
     memcpy((VkBool32*)&forUnmarshaling->fragmentStoresAndAtomics, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderTessellationAndGeometryPointSize, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderTessellationAndGeometryPointSize, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy((VkBool32*)&forUnmarshaling->shaderImageGatherExtended, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -641,17 +569,23 @@
     *ptr += sizeof(VkBool32);
     memcpy((VkBool32*)&forUnmarshaling->shaderStorageImageMultisample, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderStorageImageReadWithoutFormat, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderStorageImageReadWithoutFormat, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderStorageImageWriteWithoutFormat, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderStorageImageWriteWithoutFormat, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderUniformBufferArrayDynamicIndexing, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderUniformBufferArrayDynamicIndexing, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderSampledImageArrayDynamicIndexing, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderSampledImageArrayDynamicIndexing, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderStorageBufferArrayDynamicIndexing, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderStorageBufferArrayDynamicIndexing, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderStorageImageArrayDynamicIndexing, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderStorageImageArrayDynamicIndexing, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy((VkBool32*)&forUnmarshaling->shaderClipDistance, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -691,12 +625,9 @@
     *ptr += sizeof(VkBool32);
 }
 
-void reservedunmarshal_VkPhysicalDeviceLimits(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceLimits* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkPhysicalDeviceLimits(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkPhysicalDeviceLimits* forUnmarshaling,
+                                              uint8_t** ptr) {
     memcpy((uint32_t*)&forUnmarshaling->maxImageDimension1D, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->maxImageDimension2D, *ptr, sizeof(uint32_t));
@@ -727,15 +658,18 @@
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorSamplers, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUniformBuffers, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUniformBuffers, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorStorageBuffers, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorStorageBuffers, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorSampledImages, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorStorageImages, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorInputAttachments, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorInputAttachments, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->maxPerStageResources, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -743,11 +677,13 @@
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUniformBuffers, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUniformBuffersDynamic, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUniformBuffersDynamic, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetStorageBuffers, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetStorageBuffersDynamic, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetStorageBuffersDynamic, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetSampledImages, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -769,17 +705,23 @@
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->maxTessellationPatchSize, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxTessellationControlPerVertexInputComponents, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxTessellationControlPerVertexInputComponents, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxTessellationControlPerVertexOutputComponents, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxTessellationControlPerVertexOutputComponents, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxTessellationControlPerPatchOutputComponents, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxTessellationControlPerPatchOutputComponents, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxTessellationControlTotalOutputComponents, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxTessellationControlTotalOutputComponents, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxTessellationEvaluationInputComponents, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxTessellationEvaluationInputComponents, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxTessellationEvaluationOutputComponents, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxTessellationEvaluationOutputComponents, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->maxGeometryShaderInvocations, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -832,11 +774,14 @@
     memcpy((size_t*)&forUnmarshaling->minMemoryMapAlignment, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->minMemoryMapAlignment);
     *ptr += 8;
-    memcpy((VkDeviceSize*)&forUnmarshaling->minTexelBufferOffsetAlignment, *ptr, sizeof(VkDeviceSize));
+    memcpy((VkDeviceSize*)&forUnmarshaling->minTexelBufferOffsetAlignment, *ptr,
+           sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
-    memcpy((VkDeviceSize*)&forUnmarshaling->minUniformBufferOffsetAlignment, *ptr, sizeof(VkDeviceSize));
+    memcpy((VkDeviceSize*)&forUnmarshaling->minUniformBufferOffsetAlignment, *ptr,
+           sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
-    memcpy((VkDeviceSize*)&forUnmarshaling->minStorageBufferOffsetAlignment, *ptr, sizeof(VkDeviceSize));
+    memcpy((VkDeviceSize*)&forUnmarshaling->minStorageBufferOffsetAlignment, *ptr,
+           sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
     memcpy((int32_t*)&forUnmarshaling->minTexelOffset, *ptr, sizeof(int32_t));
     *ptr += sizeof(int32_t);
@@ -858,25 +803,34 @@
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->maxFramebufferLayers, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((VkSampleCountFlags*)&forUnmarshaling->framebufferColorSampleCounts, *ptr, sizeof(VkSampleCountFlags));
+    memcpy((VkSampleCountFlags*)&forUnmarshaling->framebufferColorSampleCounts, *ptr,
+           sizeof(VkSampleCountFlags));
     *ptr += sizeof(VkSampleCountFlags);
-    memcpy((VkSampleCountFlags*)&forUnmarshaling->framebufferDepthSampleCounts, *ptr, sizeof(VkSampleCountFlags));
+    memcpy((VkSampleCountFlags*)&forUnmarshaling->framebufferDepthSampleCounts, *ptr,
+           sizeof(VkSampleCountFlags));
     *ptr += sizeof(VkSampleCountFlags);
-    memcpy((VkSampleCountFlags*)&forUnmarshaling->framebufferStencilSampleCounts, *ptr, sizeof(VkSampleCountFlags));
+    memcpy((VkSampleCountFlags*)&forUnmarshaling->framebufferStencilSampleCounts, *ptr,
+           sizeof(VkSampleCountFlags));
     *ptr += sizeof(VkSampleCountFlags);
-    memcpy((VkSampleCountFlags*)&forUnmarshaling->framebufferNoAttachmentsSampleCounts, *ptr, sizeof(VkSampleCountFlags));
+    memcpy((VkSampleCountFlags*)&forUnmarshaling->framebufferNoAttachmentsSampleCounts, *ptr,
+           sizeof(VkSampleCountFlags));
     *ptr += sizeof(VkSampleCountFlags);
     memcpy((uint32_t*)&forUnmarshaling->maxColorAttachments, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((VkSampleCountFlags*)&forUnmarshaling->sampledImageColorSampleCounts, *ptr, sizeof(VkSampleCountFlags));
+    memcpy((VkSampleCountFlags*)&forUnmarshaling->sampledImageColorSampleCounts, *ptr,
+           sizeof(VkSampleCountFlags));
     *ptr += sizeof(VkSampleCountFlags);
-    memcpy((VkSampleCountFlags*)&forUnmarshaling->sampledImageIntegerSampleCounts, *ptr, sizeof(VkSampleCountFlags));
+    memcpy((VkSampleCountFlags*)&forUnmarshaling->sampledImageIntegerSampleCounts, *ptr,
+           sizeof(VkSampleCountFlags));
     *ptr += sizeof(VkSampleCountFlags);
-    memcpy((VkSampleCountFlags*)&forUnmarshaling->sampledImageDepthSampleCounts, *ptr, sizeof(VkSampleCountFlags));
+    memcpy((VkSampleCountFlags*)&forUnmarshaling->sampledImageDepthSampleCounts, *ptr,
+           sizeof(VkSampleCountFlags));
     *ptr += sizeof(VkSampleCountFlags);
-    memcpy((VkSampleCountFlags*)&forUnmarshaling->sampledImageStencilSampleCounts, *ptr, sizeof(VkSampleCountFlags));
+    memcpy((VkSampleCountFlags*)&forUnmarshaling->sampledImageStencilSampleCounts, *ptr,
+           sizeof(VkSampleCountFlags));
     *ptr += sizeof(VkSampleCountFlags);
-    memcpy((VkSampleCountFlags*)&forUnmarshaling->storageImageSampleCounts, *ptr, sizeof(VkSampleCountFlags));
+    memcpy((VkSampleCountFlags*)&forUnmarshaling->storageImageSampleCounts, *ptr,
+           sizeof(VkSampleCountFlags));
     *ptr += sizeof(VkSampleCountFlags);
     memcpy((uint32_t*)&forUnmarshaling->maxSampleMaskWords, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -904,43 +858,40 @@
     *ptr += sizeof(VkBool32);
     memcpy((VkBool32*)&forUnmarshaling->standardSampleLocations, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkDeviceSize*)&forUnmarshaling->optimalBufferCopyOffsetAlignment, *ptr, sizeof(VkDeviceSize));
+    memcpy((VkDeviceSize*)&forUnmarshaling->optimalBufferCopyOffsetAlignment, *ptr,
+           sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
-    memcpy((VkDeviceSize*)&forUnmarshaling->optimalBufferCopyRowPitchAlignment, *ptr, sizeof(VkDeviceSize));
+    memcpy((VkDeviceSize*)&forUnmarshaling->optimalBufferCopyRowPitchAlignment, *ptr,
+           sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
     memcpy((VkDeviceSize*)&forUnmarshaling->nonCoherentAtomSize, *ptr, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
 }
 
 void reservedunmarshal_VkPhysicalDeviceMemoryProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMemoryProperties* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMemoryProperties* forUnmarshaling, uint8_t** ptr) {
     memcpy((uint32_t*)&forUnmarshaling->memoryTypeCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_TYPES; ++i)
-    {
-        reservedunmarshal_VkMemoryType(vkStream, rootType, (VkMemoryType*)(forUnmarshaling->memoryTypes + i), ptr);
+    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_TYPES; ++i) {
+        reservedunmarshal_VkMemoryType(vkStream, rootType,
+                                       (VkMemoryType*)(forUnmarshaling->memoryTypes + i), ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->memoryHeapCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_HEAPS; ++i)
-    {
-        reservedunmarshal_VkMemoryHeap(vkStream, rootType, (VkMemoryHeap*)(forUnmarshaling->memoryHeaps + i), ptr);
+    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_HEAPS; ++i) {
+        reservedunmarshal_VkMemoryHeap(vkStream, rootType,
+                                       (VkMemoryHeap*)(forUnmarshaling->memoryHeaps + i), ptr);
     }
 }
 
 void reservedunmarshal_VkPhysicalDeviceSparseProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSparseProperties* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceSparseProperties* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkBool32*)&forUnmarshaling->residencyStandard2DBlockShape, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->residencyStandard2DMultisampleBlockShape, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->residencyStandard2DMultisampleBlockShape, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy((VkBool32*)&forUnmarshaling->residencyStandard3DBlockShape, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -950,12 +901,9 @@
     *ptr += sizeof(VkBool32);
 }
 
-void reservedunmarshal_VkPhysicalDeviceProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceProperties* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkPhysicalDeviceProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                                  VkPhysicalDeviceProperties* forUnmarshaling,
+                                                  uint8_t** ptr) {
     memcpy((uint32_t*)&forUnmarshaling->apiVersion, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->driverVersion, *ptr, sizeof(uint32_t));
@@ -966,39 +914,37 @@
     *ptr += sizeof(uint32_t);
     memcpy((VkPhysicalDeviceType*)&forUnmarshaling->deviceType, *ptr, sizeof(VkPhysicalDeviceType));
     *ptr += sizeof(VkPhysicalDeviceType);
-    memcpy((char*)forUnmarshaling->deviceName, *ptr, VK_MAX_PHYSICAL_DEVICE_NAME_SIZE * sizeof(char));
+    memcpy((char*)forUnmarshaling->deviceName, *ptr,
+           VK_MAX_PHYSICAL_DEVICE_NAME_SIZE * sizeof(char));
     *ptr += VK_MAX_PHYSICAL_DEVICE_NAME_SIZE * sizeof(char);
     memcpy((uint8_t*)forUnmarshaling->pipelineCacheUUID, *ptr, VK_UUID_SIZE * sizeof(uint8_t));
     *ptr += VK_UUID_SIZE * sizeof(uint8_t);
-    reservedunmarshal_VkPhysicalDeviceLimits(vkStream, rootType, (VkPhysicalDeviceLimits*)(&forUnmarshaling->limits), ptr);
-    reservedunmarshal_VkPhysicalDeviceSparseProperties(vkStream, rootType, (VkPhysicalDeviceSparseProperties*)(&forUnmarshaling->sparseProperties), ptr);
+    reservedunmarshal_VkPhysicalDeviceLimits(
+        vkStream, rootType, (VkPhysicalDeviceLimits*)(&forUnmarshaling->limits), ptr);
+    reservedunmarshal_VkPhysicalDeviceSparseProperties(
+        vkStream, rootType, (VkPhysicalDeviceSparseProperties*)(&forUnmarshaling->sparseProperties),
+        ptr);
 }
 
-void reservedunmarshal_VkQueueFamilyProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkQueueFamilyProperties* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkQueueFamilyProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkQueueFamilyProperties* forUnmarshaling,
+                                               uint8_t** ptr) {
     memcpy((VkQueueFlags*)&forUnmarshaling->queueFlags, *ptr, sizeof(VkQueueFlags));
     *ptr += sizeof(VkQueueFlags);
     memcpy((uint32_t*)&forUnmarshaling->queueCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->timestampValidBits, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    reservedunmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forUnmarshaling->minImageTransferGranularity), ptr);
+    reservedunmarshal_VkExtent3D(vkStream, rootType,
+                                 (VkExtent3D*)(&forUnmarshaling->minImageTransferGranularity), ptr);
 }
 
-void reservedunmarshal_VkDeviceQueueCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceQueueCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDeviceQueueCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkDeviceQueueCreateInfo* forUnmarshaling,
+                                               uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -1006,37 +952,37 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkDeviceQueueCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkDeviceQueueCreateFlags));
+    memcpy((VkDeviceQueueCreateFlags*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkDeviceQueueCreateFlags));
     *ptr += sizeof(VkDeviceQueueCreateFlags);
     memcpy((uint32_t*)&forUnmarshaling->queueFamilyIndex, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->queueCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pQueuePriorities, forUnmarshaling->queueCount * sizeof(const float));
-    memcpy((float*)forUnmarshaling->pQueuePriorities, *ptr, forUnmarshaling->queueCount * sizeof(const float));
+    vkStream->alloc((void**)&forUnmarshaling->pQueuePriorities,
+                    forUnmarshaling->queueCount * sizeof(const float));
+    memcpy((float*)forUnmarshaling->pQueuePriorities, *ptr,
+           forUnmarshaling->queueCount * sizeof(const float));
     *ptr += forUnmarshaling->queueCount * sizeof(const float);
 }
 
-void reservedunmarshal_VkDeviceCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDeviceCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkDeviceCreateInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -1044,60 +990,61 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkDeviceCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkDeviceCreateFlags));
     *ptr += sizeof(VkDeviceCreateFlags);
     memcpy((uint32_t*)&forUnmarshaling->queueCreateInfoCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pQueueCreateInfos, forUnmarshaling->queueCreateInfoCount * sizeof(const VkDeviceQueueCreateInfo));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->queueCreateInfoCount; ++i)
-    {
-        reservedunmarshal_VkDeviceQueueCreateInfo(vkStream, rootType, (VkDeviceQueueCreateInfo*)(forUnmarshaling->pQueueCreateInfos + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pQueueCreateInfos,
+                    forUnmarshaling->queueCreateInfoCount * sizeof(const VkDeviceQueueCreateInfo));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->queueCreateInfoCount; ++i) {
+        reservedunmarshal_VkDeviceQueueCreateInfo(
+            vkStream, rootType, (VkDeviceQueueCreateInfo*)(forUnmarshaling->pQueueCreateInfos + i),
+            ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->enabledLayerCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->loadStringArrayInPlaceWithStreamPtr((char***)&forUnmarshaling->ppEnabledLayerNames, ptr);
+    vkStream->loadStringArrayInPlaceWithStreamPtr((char***)&forUnmarshaling->ppEnabledLayerNames,
+                                                  ptr);
     memcpy((uint32_t*)&forUnmarshaling->enabledExtensionCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->loadStringArrayInPlaceWithStreamPtr((char***)&forUnmarshaling->ppEnabledExtensionNames, ptr);
+    vkStream->loadStringArrayInPlaceWithStreamPtr(
+        (char***)&forUnmarshaling->ppEnabledExtensionNames, ptr);
     // WARNING PTR CHECK
     memcpy((VkPhysicalDeviceFeatures**)&forUnmarshaling->pEnabledFeatures, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pEnabledFeatures);
     *ptr += 8;
-    if (forUnmarshaling->pEnabledFeatures)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pEnabledFeatures, sizeof(const VkPhysicalDeviceFeatures));
-        reservedunmarshal_VkPhysicalDeviceFeatures(vkStream, rootType, (VkPhysicalDeviceFeatures*)(forUnmarshaling->pEnabledFeatures), ptr);
+    if (forUnmarshaling->pEnabledFeatures) {
+        vkStream->alloc((void**)&forUnmarshaling->pEnabledFeatures,
+                        sizeof(const VkPhysicalDeviceFeatures));
+        reservedunmarshal_VkPhysicalDeviceFeatures(
+            vkStream, rootType, (VkPhysicalDeviceFeatures*)(forUnmarshaling->pEnabledFeatures),
+            ptr);
     }
 }
 
-void reservedunmarshal_VkExtensionProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExtensionProperties* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkExtensionProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkExtensionProperties* forUnmarshaling,
+                                             uint8_t** ptr) {
     memcpy((char*)forUnmarshaling->extensionName, *ptr, VK_MAX_EXTENSION_NAME_SIZE * sizeof(char));
     *ptr += VK_MAX_EXTENSION_NAME_SIZE * sizeof(char);
     memcpy((uint32_t*)&forUnmarshaling->specVersion, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkLayerProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkLayerProperties* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkLayerProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkLayerProperties* forUnmarshaling, uint8_t** ptr) {
     memcpy((char*)forUnmarshaling->layerName, *ptr, VK_MAX_EXTENSION_NAME_SIZE * sizeof(char));
     *ptr += VK_MAX_EXTENSION_NAME_SIZE * sizeof(char);
     memcpy((uint32_t*)&forUnmarshaling->specVersion, *ptr, sizeof(uint32_t));
@@ -1108,16 +1055,11 @@
     *ptr += VK_MAX_DESCRIPTION_SIZE * sizeof(char);
 }
 
-void reservedunmarshal_VkSubmitInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubmitInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkSubmitInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkSubmitInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -1125,79 +1067,78 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->waitSemaphoreCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pWaitSemaphores, forUnmarshaling->waitSemaphoreCount * sizeof(const VkSemaphore));
-    if (forUnmarshaling->waitSemaphoreCount)
-    {
+    vkStream->alloc((void**)&forUnmarshaling->pWaitSemaphores,
+                    forUnmarshaling->waitSemaphoreCount * sizeof(const VkSemaphore));
+    if (forUnmarshaling->waitSemaphoreCount) {
         uint8_t* cgen_var_0_ptr = (uint8_t*)(*ptr);
         *ptr += 8 * forUnmarshaling->waitSemaphoreCount;
-        if (forUnmarshaling)
-        {
-            for (uint32_t k = 0; k < forUnmarshaling->waitSemaphoreCount; ++k)
-            {
-                uint64_t tmpval; memcpy(&tmpval, cgen_var_0_ptr + k * 8, sizeof(uint64_t));
-                *(((VkSemaphore*)forUnmarshaling->pWaitSemaphores) + k) = (VkSemaphore)unbox_VkSemaphore((VkSemaphore)tmpval);
+        if (forUnmarshaling) {
+            for (uint32_t k = 0; k < forUnmarshaling->waitSemaphoreCount; ++k) {
+                uint64_t tmpval;
+                memcpy(&tmpval, cgen_var_0_ptr + k * 8, sizeof(uint64_t));
+                *(((VkSemaphore*)forUnmarshaling->pWaitSemaphores) + k) =
+                    (VkSemaphore)unbox_VkSemaphore((VkSemaphore)tmpval);
             }
         }
     }
-    vkStream->alloc((void**)&forUnmarshaling->pWaitDstStageMask, forUnmarshaling->waitSemaphoreCount * sizeof(const VkPipelineStageFlags));
-    memcpy((VkPipelineStageFlags*)forUnmarshaling->pWaitDstStageMask, *ptr, forUnmarshaling->waitSemaphoreCount * sizeof(const VkPipelineStageFlags));
+    vkStream->alloc((void**)&forUnmarshaling->pWaitDstStageMask,
+                    forUnmarshaling->waitSemaphoreCount * sizeof(const VkPipelineStageFlags));
+    memcpy((VkPipelineStageFlags*)forUnmarshaling->pWaitDstStageMask, *ptr,
+           forUnmarshaling->waitSemaphoreCount * sizeof(const VkPipelineStageFlags));
     *ptr += forUnmarshaling->waitSemaphoreCount * sizeof(const VkPipelineStageFlags);
     memcpy((uint32_t*)&forUnmarshaling->commandBufferCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pCommandBuffers, forUnmarshaling->commandBufferCount * sizeof(const VkCommandBuffer));
-    if (forUnmarshaling->commandBufferCount)
-    {
+    vkStream->alloc((void**)&forUnmarshaling->pCommandBuffers,
+                    forUnmarshaling->commandBufferCount * sizeof(const VkCommandBuffer));
+    if (forUnmarshaling->commandBufferCount) {
         uint8_t* cgen_var_1_ptr = (uint8_t*)(*ptr);
         *ptr += 8 * forUnmarshaling->commandBufferCount;
-        if (forUnmarshaling)
-        {
-            for (uint32_t k = 0; k < forUnmarshaling->commandBufferCount; ++k)
-            {
-                uint64_t tmpval; memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
-                *(((VkCommandBuffer*)forUnmarshaling->pCommandBuffers) + k) = (VkCommandBuffer)unbox_VkCommandBuffer((VkCommandBuffer)tmpval);
+        if (forUnmarshaling) {
+            for (uint32_t k = 0; k < forUnmarshaling->commandBufferCount; ++k) {
+                uint64_t tmpval;
+                memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
+                *(((VkCommandBuffer*)forUnmarshaling->pCommandBuffers) + k) =
+                    (VkCommandBuffer)unbox_VkCommandBuffer((VkCommandBuffer)tmpval);
             }
         }
     }
     memcpy((uint32_t*)&forUnmarshaling->signalSemaphoreCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pSignalSemaphores, forUnmarshaling->signalSemaphoreCount * sizeof(const VkSemaphore));
-    if (forUnmarshaling->signalSemaphoreCount)
-    {
+    vkStream->alloc((void**)&forUnmarshaling->pSignalSemaphores,
+                    forUnmarshaling->signalSemaphoreCount * sizeof(const VkSemaphore));
+    if (forUnmarshaling->signalSemaphoreCount) {
         uint8_t* cgen_var_2_ptr = (uint8_t*)(*ptr);
         *ptr += 8 * forUnmarshaling->signalSemaphoreCount;
-        if (forUnmarshaling)
-        {
-            for (uint32_t k = 0; k < forUnmarshaling->signalSemaphoreCount; ++k)
-            {
-                uint64_t tmpval; memcpy(&tmpval, cgen_var_2_ptr + k * 8, sizeof(uint64_t));
-                *(((VkSemaphore*)forUnmarshaling->pSignalSemaphores) + k) = (VkSemaphore)unbox_VkSemaphore((VkSemaphore)tmpval);
+        if (forUnmarshaling) {
+            for (uint32_t k = 0; k < forUnmarshaling->signalSemaphoreCount; ++k) {
+                uint64_t tmpval;
+                memcpy(&tmpval, cgen_var_2_ptr + k * 8, sizeof(uint64_t));
+                *(((VkSemaphore*)forUnmarshaling->pSignalSemaphores) + k) =
+                    (VkSemaphore)unbox_VkSemaphore((VkSemaphore)tmpval);
             }
         }
     }
 }
 
-void reservedunmarshal_VkMappedMemoryRange(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMappedMemoryRange* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkMappedMemoryRange(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkMappedMemoryRange* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -1205,36 +1146,34 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkDeviceMemory*)&forUnmarshaling->memory = (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_0));
+    *(VkDeviceMemory*)&forUnmarshaling->memory =
+        (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_0));
     memcpy((VkDeviceSize*)&forUnmarshaling->offset, *ptr, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
     memcpy((VkDeviceSize*)&forUnmarshaling->size, *ptr, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
 }
 
-void reservedunmarshal_VkMemoryAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryAllocateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkMemoryAllocateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkMemoryAllocateInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -1242,15 +1181,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkDeviceSize*)&forUnmarshaling->allocationSize, *ptr, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
@@ -1258,12 +1199,8 @@
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkMemoryRequirements(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryRequirements* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkMemoryRequirements(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkMemoryRequirements* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkDeviceSize*)&forUnmarshaling->size, *ptr, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
     memcpy((VkDeviceSize*)&forUnmarshaling->alignment, *ptr, sizeof(VkDeviceSize));
@@ -1272,12 +1209,8 @@
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkSparseMemoryBind(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSparseMemoryBind* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkSparseMemoryBind(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkSparseMemoryBind* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkDeviceSize*)&forUnmarshaling->resourceOffset, *ptr, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
     memcpy((VkDeviceSize*)&forUnmarshaling->size, *ptr, sizeof(VkDeviceSize));
@@ -1285,57 +1218,52 @@
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkDeviceMemory*)&forUnmarshaling->memory = (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_0));
+    *(VkDeviceMemory*)&forUnmarshaling->memory =
+        (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_0));
     memcpy((VkDeviceSize*)&forUnmarshaling->memoryOffset, *ptr, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
-    memcpy((VkSparseMemoryBindFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkSparseMemoryBindFlags));
+    memcpy((VkSparseMemoryBindFlags*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkSparseMemoryBindFlags));
     *ptr += sizeof(VkSparseMemoryBindFlags);
 }
 
-void reservedunmarshal_VkSparseBufferMemoryBindInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSparseBufferMemoryBindInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkSparseBufferMemoryBindInfo(VulkanStream* vkStream,
+                                                    VkStructureType rootType,
+                                                    VkSparseBufferMemoryBindInfo* forUnmarshaling,
+                                                    uint8_t** ptr) {
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
     *(VkBuffer*)&forUnmarshaling->buffer = (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_0));
     memcpy((uint32_t*)&forUnmarshaling->bindCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pBinds, forUnmarshaling->bindCount * sizeof(const VkSparseMemoryBind));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->bindCount; ++i)
-    {
-        reservedunmarshal_VkSparseMemoryBind(vkStream, rootType, (VkSparseMemoryBind*)(forUnmarshaling->pBinds + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pBinds,
+                    forUnmarshaling->bindCount * sizeof(const VkSparseMemoryBind));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->bindCount; ++i) {
+        reservedunmarshal_VkSparseMemoryBind(
+            vkStream, rootType, (VkSparseMemoryBind*)(forUnmarshaling->pBinds + i), ptr);
     }
 }
 
 void reservedunmarshal_VkSparseImageOpaqueMemoryBindInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSparseImageOpaqueMemoryBindInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSparseImageOpaqueMemoryBindInfo* forUnmarshaling, uint8_t** ptr) {
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
     *(VkImage*)&forUnmarshaling->image = (VkImage)unbox_VkImage((VkImage)(*&cgen_var_0));
     memcpy((uint32_t*)&forUnmarshaling->bindCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pBinds, forUnmarshaling->bindCount * sizeof(const VkSparseMemoryBind));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->bindCount; ++i)
-    {
-        reservedunmarshal_VkSparseMemoryBind(vkStream, rootType, (VkSparseMemoryBind*)(forUnmarshaling->pBinds + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pBinds,
+                    forUnmarshaling->bindCount * sizeof(const VkSparseMemoryBind));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->bindCount; ++i) {
+        reservedunmarshal_VkSparseMemoryBind(
+            vkStream, rootType, (VkSparseMemoryBind*)(forUnmarshaling->pBinds + i), ptr);
     }
 }
 
-void reservedunmarshal_VkImageSubresource(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageSubresource* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkImageSubresource(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkImageSubresource* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkImageAspectFlags*)&forUnmarshaling->aspectMask, *ptr, sizeof(VkImageAspectFlags));
     *ptr += sizeof(VkImageAspectFlags);
     memcpy((uint32_t*)&forUnmarshaling->mipLevel, *ptr, sizeof(uint32_t));
@@ -1344,54 +1272,47 @@
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkSparseImageMemoryBind(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSparseImageMemoryBind* forUnmarshaling,
-    uint8_t** ptr)
-{
-    reservedunmarshal_VkImageSubresource(vkStream, rootType, (VkImageSubresource*)(&forUnmarshaling->subresource), ptr);
+void reservedunmarshal_VkSparseImageMemoryBind(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkSparseImageMemoryBind* forUnmarshaling,
+                                               uint8_t** ptr) {
+    reservedunmarshal_VkImageSubresource(vkStream, rootType,
+                                         (VkImageSubresource*)(&forUnmarshaling->subresource), ptr);
     reservedunmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->offset), ptr);
     reservedunmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forUnmarshaling->extent), ptr);
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkDeviceMemory*)&forUnmarshaling->memory = (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_0));
+    *(VkDeviceMemory*)&forUnmarshaling->memory =
+        (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_0));
     memcpy((VkDeviceSize*)&forUnmarshaling->memoryOffset, *ptr, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
-    memcpy((VkSparseMemoryBindFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkSparseMemoryBindFlags));
+    memcpy((VkSparseMemoryBindFlags*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkSparseMemoryBindFlags));
     *ptr += sizeof(VkSparseMemoryBindFlags);
 }
 
-void reservedunmarshal_VkSparseImageMemoryBindInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSparseImageMemoryBindInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkSparseImageMemoryBindInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkSparseImageMemoryBindInfo* forUnmarshaling,
+                                                   uint8_t** ptr) {
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
     *(VkImage*)&forUnmarshaling->image = (VkImage)unbox_VkImage((VkImage)(*&cgen_var_0));
     memcpy((uint32_t*)&forUnmarshaling->bindCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pBinds, forUnmarshaling->bindCount * sizeof(const VkSparseImageMemoryBind));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->bindCount; ++i)
-    {
-        reservedunmarshal_VkSparseImageMemoryBind(vkStream, rootType, (VkSparseImageMemoryBind*)(forUnmarshaling->pBinds + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pBinds,
+                    forUnmarshaling->bindCount * sizeof(const VkSparseImageMemoryBind));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->bindCount; ++i) {
+        reservedunmarshal_VkSparseImageMemoryBind(
+            vkStream, rootType, (VkSparseImageMemoryBind*)(forUnmarshaling->pBinds + i), ptr);
     }
 }
 
-void reservedunmarshal_VkBindSparseInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindSparseInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkBindSparseInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkBindSparseInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -1399,91 +1320,99 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->waitSemaphoreCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pWaitSemaphores, forUnmarshaling->waitSemaphoreCount * sizeof(const VkSemaphore));
-    if (forUnmarshaling->waitSemaphoreCount)
-    {
+    vkStream->alloc((void**)&forUnmarshaling->pWaitSemaphores,
+                    forUnmarshaling->waitSemaphoreCount * sizeof(const VkSemaphore));
+    if (forUnmarshaling->waitSemaphoreCount) {
         uint8_t* cgen_var_0_ptr = (uint8_t*)(*ptr);
         *ptr += 8 * forUnmarshaling->waitSemaphoreCount;
-        if (forUnmarshaling)
-        {
-            for (uint32_t k = 0; k < forUnmarshaling->waitSemaphoreCount; ++k)
-            {
-                uint64_t tmpval; memcpy(&tmpval, cgen_var_0_ptr + k * 8, sizeof(uint64_t));
-                *(((VkSemaphore*)forUnmarshaling->pWaitSemaphores) + k) = (VkSemaphore)unbox_VkSemaphore((VkSemaphore)tmpval);
+        if (forUnmarshaling) {
+            for (uint32_t k = 0; k < forUnmarshaling->waitSemaphoreCount; ++k) {
+                uint64_t tmpval;
+                memcpy(&tmpval, cgen_var_0_ptr + k * 8, sizeof(uint64_t));
+                *(((VkSemaphore*)forUnmarshaling->pWaitSemaphores) + k) =
+                    (VkSemaphore)unbox_VkSemaphore((VkSemaphore)tmpval);
             }
         }
     }
     memcpy((uint32_t*)&forUnmarshaling->bufferBindCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pBufferBinds, forUnmarshaling->bufferBindCount * sizeof(const VkSparseBufferMemoryBindInfo));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->bufferBindCount; ++i)
-    {
-        reservedunmarshal_VkSparseBufferMemoryBindInfo(vkStream, rootType, (VkSparseBufferMemoryBindInfo*)(forUnmarshaling->pBufferBinds + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pBufferBinds,
+                    forUnmarshaling->bufferBindCount * sizeof(const VkSparseBufferMemoryBindInfo));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->bufferBindCount; ++i) {
+        reservedunmarshal_VkSparseBufferMemoryBindInfo(
+            vkStream, rootType, (VkSparseBufferMemoryBindInfo*)(forUnmarshaling->pBufferBinds + i),
+            ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->imageOpaqueBindCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pImageOpaqueBinds, forUnmarshaling->imageOpaqueBindCount * sizeof(const VkSparseImageOpaqueMemoryBindInfo));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->imageOpaqueBindCount; ++i)
-    {
-        reservedunmarshal_VkSparseImageOpaqueMemoryBindInfo(vkStream, rootType, (VkSparseImageOpaqueMemoryBindInfo*)(forUnmarshaling->pImageOpaqueBinds + i), ptr);
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pImageOpaqueBinds,
+        forUnmarshaling->imageOpaqueBindCount * sizeof(const VkSparseImageOpaqueMemoryBindInfo));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->imageOpaqueBindCount; ++i) {
+        reservedunmarshal_VkSparseImageOpaqueMemoryBindInfo(
+            vkStream, rootType,
+            (VkSparseImageOpaqueMemoryBindInfo*)(forUnmarshaling->pImageOpaqueBinds + i), ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->imageBindCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pImageBinds, forUnmarshaling->imageBindCount * sizeof(const VkSparseImageMemoryBindInfo));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->imageBindCount; ++i)
-    {
-        reservedunmarshal_VkSparseImageMemoryBindInfo(vkStream, rootType, (VkSparseImageMemoryBindInfo*)(forUnmarshaling->pImageBinds + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pImageBinds,
+                    forUnmarshaling->imageBindCount * sizeof(const VkSparseImageMemoryBindInfo));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->imageBindCount; ++i) {
+        reservedunmarshal_VkSparseImageMemoryBindInfo(
+            vkStream, rootType, (VkSparseImageMemoryBindInfo*)(forUnmarshaling->pImageBinds + i),
+            ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->signalSemaphoreCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pSignalSemaphores, forUnmarshaling->signalSemaphoreCount * sizeof(const VkSemaphore));
-    if (forUnmarshaling->signalSemaphoreCount)
-    {
+    vkStream->alloc((void**)&forUnmarshaling->pSignalSemaphores,
+                    forUnmarshaling->signalSemaphoreCount * sizeof(const VkSemaphore));
+    if (forUnmarshaling->signalSemaphoreCount) {
         uint8_t* cgen_var_1_ptr = (uint8_t*)(*ptr);
         *ptr += 8 * forUnmarshaling->signalSemaphoreCount;
-        if (forUnmarshaling)
-        {
-            for (uint32_t k = 0; k < forUnmarshaling->signalSemaphoreCount; ++k)
-            {
-                uint64_t tmpval; memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
-                *(((VkSemaphore*)forUnmarshaling->pSignalSemaphores) + k) = (VkSemaphore)unbox_VkSemaphore((VkSemaphore)tmpval);
+        if (forUnmarshaling) {
+            for (uint32_t k = 0; k < forUnmarshaling->signalSemaphoreCount; ++k) {
+                uint64_t tmpval;
+                memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
+                *(((VkSemaphore*)forUnmarshaling->pSignalSemaphores) + k) =
+                    (VkSemaphore)unbox_VkSemaphore((VkSemaphore)tmpval);
             }
         }
     }
 }
 
-void reservedunmarshal_VkSparseImageFormatProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSparseImageFormatProperties* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkSparseImageFormatProperties(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkSparseImageFormatProperties* forUnmarshaling,
+                                                     uint8_t** ptr) {
     memcpy((VkImageAspectFlags*)&forUnmarshaling->aspectMask, *ptr, sizeof(VkImageAspectFlags));
     *ptr += sizeof(VkImageAspectFlags);
-    reservedunmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forUnmarshaling->imageGranularity), ptr);
-    memcpy((VkSparseImageFormatFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkSparseImageFormatFlags));
+    reservedunmarshal_VkExtent3D(vkStream, rootType,
+                                 (VkExtent3D*)(&forUnmarshaling->imageGranularity), ptr);
+    memcpy((VkSparseImageFormatFlags*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkSparseImageFormatFlags));
     *ptr += sizeof(VkSparseImageFormatFlags);
 }
 
 void reservedunmarshal_VkSparseImageMemoryRequirements(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSparseImageMemoryRequirements* forUnmarshaling,
-    uint8_t** ptr)
-{
-    reservedunmarshal_VkSparseImageFormatProperties(vkStream, rootType, (VkSparseImageFormatProperties*)(&forUnmarshaling->formatProperties), ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSparseImageMemoryRequirements* forUnmarshaling, uint8_t** ptr) {
+    reservedunmarshal_VkSparseImageFormatProperties(
+        vkStream, rootType, (VkSparseImageFormatProperties*)(&forUnmarshaling->formatProperties),
+        ptr);
     memcpy((uint32_t*)&forUnmarshaling->imageMipTailFirstLod, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((VkDeviceSize*)&forUnmarshaling->imageMipTailSize, *ptr, sizeof(VkDeviceSize));
@@ -1494,16 +1423,11 @@
     *ptr += sizeof(VkDeviceSize);
 }
 
-void reservedunmarshal_VkFenceCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFenceCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkFenceCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkFenceCreateInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -1511,30 +1435,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkFenceCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkFenceCreateFlags));
     *ptr += sizeof(VkFenceCreateFlags);
 }
 
-void reservedunmarshal_VkSemaphoreCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSemaphoreCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkSemaphoreCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkSemaphoreCreateInfo* forUnmarshaling,
+                                             uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -1542,30 +1464,27 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkSemaphoreCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkSemaphoreCreateFlags));
     *ptr += sizeof(VkSemaphoreCreateFlags);
 }
 
-void reservedunmarshal_VkEventCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkEventCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkEventCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkEventCreateInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -1573,30 +1492,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkEventCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkEventCreateFlags));
     *ptr += sizeof(VkEventCreateFlags);
 }
 
-void reservedunmarshal_VkQueryPoolCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkQueryPoolCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkQueryPoolCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkQueryPoolCreateInfo* forUnmarshaling,
+                                             uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -1604,15 +1521,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkQueryPoolCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkQueryPoolCreateFlags));
     *ptr += sizeof(VkQueryPoolCreateFlags);
@@ -1620,20 +1539,16 @@
     *ptr += sizeof(VkQueryType);
     memcpy((uint32_t*)&forUnmarshaling->queryCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((VkQueryPipelineStatisticFlags*)&forUnmarshaling->pipelineStatistics, *ptr, sizeof(VkQueryPipelineStatisticFlags));
+    memcpy((VkQueryPipelineStatisticFlags*)&forUnmarshaling->pipelineStatistics, *ptr,
+           sizeof(VkQueryPipelineStatisticFlags));
     *ptr += sizeof(VkQueryPipelineStatisticFlags);
 }
 
-void reservedunmarshal_VkBufferCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkBufferCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkBufferCreateInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -1641,15 +1556,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBufferCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkBufferCreateFlags));
     *ptr += sizeof(VkBufferCreateFlags);
@@ -1665,24 +1582,21 @@
     memcpy((uint32_t**)&forUnmarshaling->pQueueFamilyIndices, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pQueueFamilyIndices);
     *ptr += 8;
-    if (forUnmarshaling->pQueueFamilyIndices)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pQueueFamilyIndices, forUnmarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
-        memcpy((uint32_t*)forUnmarshaling->pQueueFamilyIndices, *ptr, forUnmarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
+    if (forUnmarshaling->pQueueFamilyIndices) {
+        vkStream->alloc((void**)&forUnmarshaling->pQueueFamilyIndices,
+                        forUnmarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
+        memcpy((uint32_t*)forUnmarshaling->pQueueFamilyIndices, *ptr,
+               forUnmarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
         *ptr += forUnmarshaling->queueFamilyIndexCount * sizeof(const uint32_t);
     }
 }
 
-void reservedunmarshal_VkBufferViewCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferViewCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkBufferViewCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkBufferViewCreateInfo* forUnmarshaling,
+                                              uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -1690,17 +1604,20 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkBufferViewCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkBufferViewCreateFlags));
+    memcpy((VkBufferViewCreateFlags*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkBufferViewCreateFlags));
     *ptr += sizeof(VkBufferViewCreateFlags);
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
@@ -1714,16 +1631,11 @@
     *ptr += sizeof(VkDeviceSize);
 }
 
-void reservedunmarshal_VkImageCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkImageCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkImageCreateInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -1731,15 +1643,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkImageCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkImageCreateFlags));
     *ptr += sizeof(VkImageCreateFlags);
@@ -1766,22 +1680,19 @@
     memcpy((uint32_t**)&forUnmarshaling->pQueueFamilyIndices, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pQueueFamilyIndices);
     *ptr += 8;
-    if (forUnmarshaling->pQueueFamilyIndices)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pQueueFamilyIndices, forUnmarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
-        memcpy((uint32_t*)forUnmarshaling->pQueueFamilyIndices, *ptr, forUnmarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
+    if (forUnmarshaling->pQueueFamilyIndices) {
+        vkStream->alloc((void**)&forUnmarshaling->pQueueFamilyIndices,
+                        forUnmarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
+        memcpy((uint32_t*)forUnmarshaling->pQueueFamilyIndices, *ptr,
+               forUnmarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
         *ptr += forUnmarshaling->queueFamilyIndexCount * sizeof(const uint32_t);
     }
     memcpy((VkImageLayout*)&forUnmarshaling->initialLayout, *ptr, sizeof(VkImageLayout));
     *ptr += sizeof(VkImageLayout);
 }
 
-void reservedunmarshal_VkSubresourceLayout(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubresourceLayout* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkSubresourceLayout(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkSubresourceLayout* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkDeviceSize*)&forUnmarshaling->offset, *ptr, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
     memcpy((VkDeviceSize*)&forUnmarshaling->size, *ptr, sizeof(VkDeviceSize));
@@ -1794,12 +1705,8 @@
     *ptr += sizeof(VkDeviceSize);
 }
 
-void reservedunmarshal_VkComponentMapping(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkComponentMapping* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkComponentMapping(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkComponentMapping* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkComponentSwizzle*)&forUnmarshaling->r, *ptr, sizeof(VkComponentSwizzle));
     *ptr += sizeof(VkComponentSwizzle);
     memcpy((VkComponentSwizzle*)&forUnmarshaling->g, *ptr, sizeof(VkComponentSwizzle));
@@ -1810,16 +1717,12 @@
     *ptr += sizeof(VkComponentSwizzle);
 }
 
-void reservedunmarshal_VkImageViewCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageViewCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkImageViewCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkImageViewCreateInfo* forUnmarshaling,
+                                             uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -1827,15 +1730,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkImageViewCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkImageViewCreateFlags));
     *ptr += sizeof(VkImageViewCreateFlags);
@@ -1847,20 +1752,18 @@
     *ptr += sizeof(VkImageViewType);
     memcpy((VkFormat*)&forUnmarshaling->format, *ptr, sizeof(VkFormat));
     *ptr += sizeof(VkFormat);
-    reservedunmarshal_VkComponentMapping(vkStream, rootType, (VkComponentMapping*)(&forUnmarshaling->components), ptr);
-    reservedunmarshal_VkImageSubresourceRange(vkStream, rootType, (VkImageSubresourceRange*)(&forUnmarshaling->subresourceRange), ptr);
+    reservedunmarshal_VkComponentMapping(vkStream, rootType,
+                                         (VkComponentMapping*)(&forUnmarshaling->components), ptr);
+    reservedunmarshal_VkImageSubresourceRange(
+        vkStream, rootType, (VkImageSubresourceRange*)(&forUnmarshaling->subresourceRange), ptr);
 }
 
-void reservedunmarshal_VkShaderModuleCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkShaderModuleCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkShaderModuleCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkShaderModuleCreateInfo* forUnmarshaling,
+                                                uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -1868,36 +1771,37 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkShaderModuleCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkShaderModuleCreateFlags));
+    memcpy((VkShaderModuleCreateFlags*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkShaderModuleCreateFlags));
     *ptr += sizeof(VkShaderModuleCreateFlags);
     memcpy((size_t*)&forUnmarshaling->codeSize, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->codeSize);
     *ptr += 8;
-    vkStream->alloc((void**)&forUnmarshaling->pCode, (forUnmarshaling->codeSize / 4) * sizeof(const uint32_t));
-    memcpy((uint32_t*)forUnmarshaling->pCode, *ptr, (forUnmarshaling->codeSize / 4) * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pCode,
+                    (forUnmarshaling->codeSize / 4) * sizeof(const uint32_t));
+    memcpy((uint32_t*)forUnmarshaling->pCode, *ptr,
+           (forUnmarshaling->codeSize / 4) * sizeof(const uint32_t));
     *ptr += (forUnmarshaling->codeSize / 4) * sizeof(const uint32_t);
 }
 
-void reservedunmarshal_VkPipelineCacheCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineCacheCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkPipelineCacheCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkPipelineCacheCreateInfo* forUnmarshaling,
+                                                 uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -1905,32 +1809,34 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkPipelineCacheCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkPipelineCacheCreateFlags));
+    memcpy((VkPipelineCacheCreateFlags*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkPipelineCacheCreateFlags));
     *ptr += sizeof(VkPipelineCacheCreateFlags);
     memcpy((size_t*)&forUnmarshaling->initialDataSize, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->initialDataSize);
     *ptr += 8;
-    vkStream->alloc((void**)&forUnmarshaling->pInitialData, forUnmarshaling->initialDataSize * sizeof(const uint8_t));
-    memcpy((void*)forUnmarshaling->pInitialData, *ptr, forUnmarshaling->initialDataSize * sizeof(const uint8_t));
+    vkStream->alloc((void**)&forUnmarshaling->pInitialData,
+                    forUnmarshaling->initialDataSize * sizeof(const uint8_t));
+    memcpy((void*)forUnmarshaling->pInitialData, *ptr,
+           forUnmarshaling->initialDataSize * sizeof(const uint8_t));
     *ptr += forUnmarshaling->initialDataSize * sizeof(const uint8_t);
 }
 
-void reservedunmarshal_VkSpecializationMapEntry(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSpecializationMapEntry* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkSpecializationMapEntry(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkSpecializationMapEntry* forUnmarshaling,
+                                                uint8_t** ptr) {
     memcpy((uint32_t*)&forUnmarshaling->constantID, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->offset, *ptr, sizeof(uint32_t));
@@ -1940,37 +1846,31 @@
     *ptr += 8;
 }
 
-void reservedunmarshal_VkSpecializationInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSpecializationInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkSpecializationInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkSpecializationInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((uint32_t*)&forUnmarshaling->mapEntryCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pMapEntries, forUnmarshaling->mapEntryCount * sizeof(const VkSpecializationMapEntry));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->mapEntryCount; ++i)
-    {
-        reservedunmarshal_VkSpecializationMapEntry(vkStream, rootType, (VkSpecializationMapEntry*)(forUnmarshaling->pMapEntries + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pMapEntries,
+                    forUnmarshaling->mapEntryCount * sizeof(const VkSpecializationMapEntry));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->mapEntryCount; ++i) {
+        reservedunmarshal_VkSpecializationMapEntry(
+            vkStream, rootType, (VkSpecializationMapEntry*)(forUnmarshaling->pMapEntries + i), ptr);
     }
     memcpy((size_t*)&forUnmarshaling->dataSize, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->dataSize);
     *ptr += 8;
-    vkStream->alloc((void**)&forUnmarshaling->pData, forUnmarshaling->dataSize * sizeof(const uint8_t));
+    vkStream->alloc((void**)&forUnmarshaling->pData,
+                    forUnmarshaling->dataSize * sizeof(const uint8_t));
     memcpy((void*)forUnmarshaling->pData, *ptr, forUnmarshaling->dataSize * sizeof(const uint8_t));
     *ptr += forUnmarshaling->dataSize * sizeof(const uint8_t);
 }
 
 void reservedunmarshal_VkPipelineShaderStageCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineShaderStageCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineShaderStageCreateInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -1978,46 +1878,47 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkPipelineShaderStageCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkPipelineShaderStageCreateFlags));
+    memcpy((VkPipelineShaderStageCreateFlags*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkPipelineShaderStageCreateFlags));
     *ptr += sizeof(VkPipelineShaderStageCreateFlags);
     memcpy((VkShaderStageFlagBits*)&forUnmarshaling->stage, *ptr, sizeof(VkShaderStageFlagBits));
     *ptr += sizeof(VkShaderStageFlagBits);
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkShaderModule*)&forUnmarshaling->module = (VkShaderModule)unbox_VkShaderModule((VkShaderModule)(*&cgen_var_0));
+    *(VkShaderModule*)&forUnmarshaling->module =
+        (VkShaderModule)unbox_VkShaderModule((VkShaderModule)(*&cgen_var_0));
     vkStream->loadStringInPlaceWithStreamPtr((char**)&forUnmarshaling->pName, ptr);
     // WARNING PTR CHECK
     memcpy((VkSpecializationInfo**)&forUnmarshaling->pSpecializationInfo, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pSpecializationInfo);
     *ptr += 8;
-    if (forUnmarshaling->pSpecializationInfo)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pSpecializationInfo, sizeof(const VkSpecializationInfo));
-        reservedunmarshal_VkSpecializationInfo(vkStream, rootType, (VkSpecializationInfo*)(forUnmarshaling->pSpecializationInfo), ptr);
+    if (forUnmarshaling->pSpecializationInfo) {
+        vkStream->alloc((void**)&forUnmarshaling->pSpecializationInfo,
+                        sizeof(const VkSpecializationInfo));
+        reservedunmarshal_VkSpecializationInfo(
+            vkStream, rootType, (VkSpecializationInfo*)(forUnmarshaling->pSpecializationInfo), ptr);
     }
 }
 
-void reservedunmarshal_VkComputePipelineCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkComputePipelineCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkComputePipelineCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkComputePipelineCreateInfo* forUnmarshaling,
+                                                   uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -2025,37 +1926,39 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkPipelineCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkPipelineCreateFlags));
     *ptr += sizeof(VkPipelineCreateFlags);
-    reservedunmarshal_VkPipelineShaderStageCreateInfo(vkStream, rootType, (VkPipelineShaderStageCreateInfo*)(&forUnmarshaling->stage), ptr);
+    reservedunmarshal_VkPipelineShaderStageCreateInfo(
+        vkStream, rootType, (VkPipelineShaderStageCreateInfo*)(&forUnmarshaling->stage), ptr);
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkPipelineLayout*)&forUnmarshaling->layout = (VkPipelineLayout)unbox_VkPipelineLayout((VkPipelineLayout)(*&cgen_var_0));
+    *(VkPipelineLayout*)&forUnmarshaling->layout =
+        (VkPipelineLayout)unbox_VkPipelineLayout((VkPipelineLayout)(*&cgen_var_0));
     uint64_t cgen_var_1;
     memcpy((uint64_t*)&cgen_var_1, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkPipeline*)&forUnmarshaling->basePipelineHandle = (VkPipeline)unbox_VkPipeline((VkPipeline)(*&cgen_var_1));
+    *(VkPipeline*)&forUnmarshaling->basePipelineHandle =
+        (VkPipeline)unbox_VkPipeline((VkPipeline)(*&cgen_var_1));
     memcpy((int32_t*)&forUnmarshaling->basePipelineIndex, *ptr, sizeof(int32_t));
     *ptr += sizeof(int32_t);
 }
 
 void reservedunmarshal_VkVertexInputBindingDescription(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVertexInputBindingDescription* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVertexInputBindingDescription* forUnmarshaling, uint8_t** ptr) {
     memcpy((uint32_t*)&forUnmarshaling->binding, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->stride, *ptr, sizeof(uint32_t));
@@ -2065,11 +1968,8 @@
 }
 
 void reservedunmarshal_VkVertexInputAttributeDescription(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVertexInputAttributeDescription* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVertexInputAttributeDescription* forUnmarshaling, uint8_t** ptr) {
     memcpy((uint32_t*)&forUnmarshaling->location, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->binding, *ptr, sizeof(uint32_t));
@@ -2081,15 +1981,11 @@
 }
 
 void reservedunmarshal_VkPipelineVertexInputStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineVertexInputStateCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineVertexInputStateCreateInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -2097,44 +1993,51 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkPipelineVertexInputStateCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkPipelineVertexInputStateCreateFlags));
+    memcpy((VkPipelineVertexInputStateCreateFlags*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkPipelineVertexInputStateCreateFlags));
     *ptr += sizeof(VkPipelineVertexInputStateCreateFlags);
     memcpy((uint32_t*)&forUnmarshaling->vertexBindingDescriptionCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pVertexBindingDescriptions, forUnmarshaling->vertexBindingDescriptionCount * sizeof(const VkVertexInputBindingDescription));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->vertexBindingDescriptionCount; ++i)
-    {
-        reservedunmarshal_VkVertexInputBindingDescription(vkStream, rootType, (VkVertexInputBindingDescription*)(forUnmarshaling->pVertexBindingDescriptions + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pVertexBindingDescriptions,
+                    forUnmarshaling->vertexBindingDescriptionCount *
+                        sizeof(const VkVertexInputBindingDescription));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->vertexBindingDescriptionCount; ++i) {
+        reservedunmarshal_VkVertexInputBindingDescription(
+            vkStream, rootType,
+            (VkVertexInputBindingDescription*)(forUnmarshaling->pVertexBindingDescriptions + i),
+            ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->vertexAttributeDescriptionCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pVertexAttributeDescriptions, forUnmarshaling->vertexAttributeDescriptionCount * sizeof(const VkVertexInputAttributeDescription));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->vertexAttributeDescriptionCount; ++i)
-    {
-        reservedunmarshal_VkVertexInputAttributeDescription(vkStream, rootType, (VkVertexInputAttributeDescription*)(forUnmarshaling->pVertexAttributeDescriptions + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pVertexAttributeDescriptions,
+                    forUnmarshaling->vertexAttributeDescriptionCount *
+                        sizeof(const VkVertexInputAttributeDescription));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->vertexAttributeDescriptionCount; ++i) {
+        reservedunmarshal_VkVertexInputAttributeDescription(
+            vkStream, rootType,
+            (VkVertexInputAttributeDescription*)(forUnmarshaling->pVertexAttributeDescriptions + i),
+            ptr);
     }
 }
 
 void reservedunmarshal_VkPipelineInputAssemblyStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineInputAssemblyStateCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineInputAssemblyStateCreateInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -2142,17 +2045,20 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkPipelineInputAssemblyStateCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkPipelineInputAssemblyStateCreateFlags));
+    memcpy((VkPipelineInputAssemblyStateCreateFlags*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkPipelineInputAssemblyStateCreateFlags));
     *ptr += sizeof(VkPipelineInputAssemblyStateCreateFlags);
     memcpy((VkPrimitiveTopology*)&forUnmarshaling->topology, *ptr, sizeof(VkPrimitiveTopology));
     *ptr += sizeof(VkPrimitiveTopology);
@@ -2161,15 +2067,11 @@
 }
 
 void reservedunmarshal_VkPipelineTessellationStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineTessellationStateCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineTessellationStateCreateInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -2177,28 +2079,27 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkPipelineTessellationStateCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkPipelineTessellationStateCreateFlags));
+    memcpy((VkPipelineTessellationStateCreateFlags*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkPipelineTessellationStateCreateFlags));
     *ptr += sizeof(VkPipelineTessellationStateCreateFlags);
     memcpy((uint32_t*)&forUnmarshaling->patchControlPoints, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkViewport(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkViewport* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkViewport(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkViewport* forUnmarshaling, uint8_t** ptr) {
     memcpy((float*)&forUnmarshaling->x, *ptr, sizeof(float));
     *ptr += sizeof(float);
     memcpy((float*)&forUnmarshaling->y, *ptr, sizeof(float));
@@ -2214,15 +2115,11 @@
 }
 
 void reservedunmarshal_VkPipelineViewportStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineViewportStateCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineViewportStateCreateInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -2230,17 +2127,20 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkPipelineViewportStateCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkPipelineViewportStateCreateFlags));
+    memcpy((VkPipelineViewportStateCreateFlags*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkPipelineViewportStateCreateFlags));
     *ptr += sizeof(VkPipelineViewportStateCreateFlags);
     memcpy((uint32_t*)&forUnmarshaling->viewportCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -2248,12 +2148,12 @@
     memcpy((VkViewport**)&forUnmarshaling->pViewports, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pViewports);
     *ptr += 8;
-    if (forUnmarshaling->pViewports)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pViewports, forUnmarshaling->viewportCount * sizeof(const VkViewport));
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->viewportCount; ++i)
-        {
-            reservedunmarshal_VkViewport(vkStream, rootType, (VkViewport*)(forUnmarshaling->pViewports + i), ptr);
+    if (forUnmarshaling->pViewports) {
+        vkStream->alloc((void**)&forUnmarshaling->pViewports,
+                        forUnmarshaling->viewportCount * sizeof(const VkViewport));
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->viewportCount; ++i) {
+            reservedunmarshal_VkViewport(vkStream, rootType,
+                                         (VkViewport*)(forUnmarshaling->pViewports + i), ptr);
         }
     }
     memcpy((uint32_t*)&forUnmarshaling->scissorCount, *ptr, sizeof(uint32_t));
@@ -2262,26 +2162,22 @@
     memcpy((VkRect2D**)&forUnmarshaling->pScissors, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pScissors);
     *ptr += 8;
-    if (forUnmarshaling->pScissors)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pScissors, forUnmarshaling->scissorCount * sizeof(const VkRect2D));
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->scissorCount; ++i)
-        {
-            reservedunmarshal_VkRect2D(vkStream, rootType, (VkRect2D*)(forUnmarshaling->pScissors + i), ptr);
+    if (forUnmarshaling->pScissors) {
+        vkStream->alloc((void**)&forUnmarshaling->pScissors,
+                        forUnmarshaling->scissorCount * sizeof(const VkRect2D));
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->scissorCount; ++i) {
+            reservedunmarshal_VkRect2D(vkStream, rootType,
+                                       (VkRect2D*)(forUnmarshaling->pScissors + i), ptr);
         }
     }
 }
 
 void reservedunmarshal_VkPipelineRasterizationStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineRasterizationStateCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineRasterizationStateCreateInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -2289,17 +2185,20 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkPipelineRasterizationStateCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkPipelineRasterizationStateCreateFlags));
+    memcpy((VkPipelineRasterizationStateCreateFlags*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkPipelineRasterizationStateCreateFlags));
     *ptr += sizeof(VkPipelineRasterizationStateCreateFlags);
     memcpy((VkBool32*)&forUnmarshaling->depthClampEnable, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -2324,15 +2223,11 @@
 }
 
 void reservedunmarshal_VkPipelineMultisampleStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineMultisampleStateCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineMultisampleStateCreateInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -2340,19 +2235,23 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkPipelineMultisampleStateCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkPipelineMultisampleStateCreateFlags));
+    memcpy((VkPipelineMultisampleStateCreateFlags*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkPipelineMultisampleStateCreateFlags));
     *ptr += sizeof(VkPipelineMultisampleStateCreateFlags);
-    memcpy((VkSampleCountFlagBits*)&forUnmarshaling->rasterizationSamples, *ptr, sizeof(VkSampleCountFlagBits));
+    memcpy((VkSampleCountFlagBits*)&forUnmarshaling->rasterizationSamples, *ptr,
+           sizeof(VkSampleCountFlagBits));
     *ptr += sizeof(VkSampleCountFlagBits);
     memcpy((VkBool32*)&forUnmarshaling->sampleShadingEnable, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -2362,10 +2261,12 @@
     memcpy((VkSampleMask**)&forUnmarshaling->pSampleMask, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pSampleMask);
     *ptr += 8;
-    if (forUnmarshaling->pSampleMask)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pSampleMask, (((forUnmarshaling->rasterizationSamples) + 31) / 32) * sizeof(const VkSampleMask));
-        memcpy((VkSampleMask*)forUnmarshaling->pSampleMask, *ptr, (((forUnmarshaling->rasterizationSamples) + 31) / 32) * sizeof(const VkSampleMask));
+    if (forUnmarshaling->pSampleMask) {
+        vkStream->alloc(
+            (void**)&forUnmarshaling->pSampleMask,
+            (((forUnmarshaling->rasterizationSamples) + 31) / 32) * sizeof(const VkSampleMask));
+        memcpy((VkSampleMask*)forUnmarshaling->pSampleMask, *ptr,
+               (((forUnmarshaling->rasterizationSamples) + 31) / 32) * sizeof(const VkSampleMask));
         *ptr += (((forUnmarshaling->rasterizationSamples) + 31) / 32) * sizeof(const VkSampleMask);
     }
     memcpy((VkBool32*)&forUnmarshaling->alphaToCoverageEnable, *ptr, sizeof(VkBool32));
@@ -2374,12 +2275,8 @@
     *ptr += sizeof(VkBool32);
 }
 
-void reservedunmarshal_VkStencilOpState(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkStencilOpState* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkStencilOpState(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkStencilOpState* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStencilOp*)&forUnmarshaling->failOp, *ptr, sizeof(VkStencilOp));
     *ptr += sizeof(VkStencilOp);
     memcpy((VkStencilOp*)&forUnmarshaling->passOp, *ptr, sizeof(VkStencilOp));
@@ -2397,15 +2294,11 @@
 }
 
 void reservedunmarshal_VkPipelineDepthStencilStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineDepthStencilStateCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineDepthStencilStateCreateInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -2413,17 +2306,20 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkPipelineDepthStencilStateCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkPipelineDepthStencilStateCreateFlags));
+    memcpy((VkPipelineDepthStencilStateCreateFlags*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkPipelineDepthStencilStateCreateFlags));
     *ptr += sizeof(VkPipelineDepthStencilStateCreateFlags);
     memcpy((VkBool32*)&forUnmarshaling->depthTestEnable, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -2435,8 +2331,10 @@
     *ptr += sizeof(VkBool32);
     memcpy((VkBool32*)&forUnmarshaling->stencilTestEnable, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    reservedunmarshal_VkStencilOpState(vkStream, rootType, (VkStencilOpState*)(&forUnmarshaling->front), ptr);
-    reservedunmarshal_VkStencilOpState(vkStream, rootType, (VkStencilOpState*)(&forUnmarshaling->back), ptr);
+    reservedunmarshal_VkStencilOpState(vkStream, rootType,
+                                       (VkStencilOpState*)(&forUnmarshaling->front), ptr);
+    reservedunmarshal_VkStencilOpState(vkStream, rootType,
+                                       (VkStencilOpState*)(&forUnmarshaling->back), ptr);
     memcpy((float*)&forUnmarshaling->minDepthBounds, *ptr, sizeof(float));
     *ptr += sizeof(float);
     memcpy((float*)&forUnmarshaling->maxDepthBounds, *ptr, sizeof(float));
@@ -2444,11 +2342,8 @@
 }
 
 void reservedunmarshal_VkPipelineColorBlendAttachmentState(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineColorBlendAttachmentState* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineColorBlendAttachmentState* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkBool32*)&forUnmarshaling->blendEnable, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy((VkBlendFactor*)&forUnmarshaling->srcColorBlendFactor, *ptr, sizeof(VkBlendFactor));
@@ -2463,20 +2358,17 @@
     *ptr += sizeof(VkBlendFactor);
     memcpy((VkBlendOp*)&forUnmarshaling->alphaBlendOp, *ptr, sizeof(VkBlendOp));
     *ptr += sizeof(VkBlendOp);
-    memcpy((VkColorComponentFlags*)&forUnmarshaling->colorWriteMask, *ptr, sizeof(VkColorComponentFlags));
+    memcpy((VkColorComponentFlags*)&forUnmarshaling->colorWriteMask, *ptr,
+           sizeof(VkColorComponentFlags));
     *ptr += sizeof(VkColorComponentFlags);
 }
 
 void reservedunmarshal_VkPipelineColorBlendStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineColorBlendStateCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineColorBlendStateCreateInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -2484,17 +2376,20 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkPipelineColorBlendStateCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkPipelineColorBlendStateCreateFlags));
+    memcpy((VkPipelineColorBlendStateCreateFlags*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkPipelineColorBlendStateCreateFlags));
     *ptr += sizeof(VkPipelineColorBlendStateCreateFlags);
     memcpy((VkBool32*)&forUnmarshaling->logicOpEnable, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -2502,25 +2397,24 @@
     *ptr += sizeof(VkLogicOp);
     memcpy((uint32_t*)&forUnmarshaling->attachmentCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pAttachments, forUnmarshaling->attachmentCount * sizeof(const VkPipelineColorBlendAttachmentState));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->attachmentCount; ++i)
-    {
-        reservedunmarshal_VkPipelineColorBlendAttachmentState(vkStream, rootType, (VkPipelineColorBlendAttachmentState*)(forUnmarshaling->pAttachments + i), ptr);
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pAttachments,
+        forUnmarshaling->attachmentCount * sizeof(const VkPipelineColorBlendAttachmentState));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->attachmentCount; ++i) {
+        reservedunmarshal_VkPipelineColorBlendAttachmentState(
+            vkStream, rootType,
+            (VkPipelineColorBlendAttachmentState*)(forUnmarshaling->pAttachments + i), ptr);
     }
     memcpy((float*)forUnmarshaling->blendConstants, *ptr, 4 * sizeof(float));
     *ptr += 4 * sizeof(float);
 }
 
 void reservedunmarshal_VkPipelineDynamicStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineDynamicStateCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineDynamicStateCreateInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -2528,49 +2422,49 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkPipelineDynamicStateCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkPipelineDynamicStateCreateFlags));
+    memcpy((VkPipelineDynamicStateCreateFlags*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkPipelineDynamicStateCreateFlags));
     *ptr += sizeof(VkPipelineDynamicStateCreateFlags);
     memcpy((uint32_t*)&forUnmarshaling->dynamicStateCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pDynamicStates, forUnmarshaling->dynamicStateCount * sizeof(const VkDynamicState));
-    memcpy((VkDynamicState*)forUnmarshaling->pDynamicStates, *ptr, forUnmarshaling->dynamicStateCount * sizeof(const VkDynamicState));
+    vkStream->alloc((void**)&forUnmarshaling->pDynamicStates,
+                    forUnmarshaling->dynamicStateCount * sizeof(const VkDynamicState));
+    memcpy((VkDynamicState*)forUnmarshaling->pDynamicStates, *ptr,
+           forUnmarshaling->dynamicStateCount * sizeof(const VkDynamicState));
     *ptr += forUnmarshaling->dynamicStateCount * sizeof(const VkDynamicState);
 }
 
-void reservedunmarshal_VkGraphicsPipelineCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkGraphicsPipelineCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkGraphicsPipelineCreateInfo(VulkanStream* vkStream,
+                                                    VkStructureType rootType,
+                                                    VkGraphicsPipelineCreateInfo* forUnmarshaling,
+                                                    uint8_t** ptr) {
     uint32_t hasRasterization = 1;
-    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT)
-    {
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) {
         memcpy((uint32_t*)&hasRasterization, (*ptr), 4);
         android::base::Stream::fromBe32((uint8_t*)&hasRasterization);
         *ptr += 4;
     }
     uint32_t hasTessellation = 1;
-    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT)
-    {
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) {
         memcpy((uint32_t*)&hasTessellation, (*ptr), 4);
         android::base::Stream::fromBe32((uint8_t*)&hasTessellation);
         *ptr += 4;
     }
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -2578,62 +2472,72 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkPipelineCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkPipelineCreateFlags));
     *ptr += sizeof(VkPipelineCreateFlags);
     memcpy((uint32_t*)&forUnmarshaling->stageCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pStages, forUnmarshaling->stageCount * sizeof(const VkPipelineShaderStageCreateInfo));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->stageCount; ++i)
-    {
-        reservedunmarshal_VkPipelineShaderStageCreateInfo(vkStream, rootType, (VkPipelineShaderStageCreateInfo*)(forUnmarshaling->pStages + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pStages,
+                    forUnmarshaling->stageCount * sizeof(const VkPipelineShaderStageCreateInfo));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->stageCount; ++i) {
+        reservedunmarshal_VkPipelineShaderStageCreateInfo(
+            vkStream, rootType, (VkPipelineShaderStageCreateInfo*)(forUnmarshaling->pStages + i),
+            ptr);
     }
     // WARNING PTR CHECK
-    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT)
-    {
-        memcpy((VkPipelineVertexInputStateCreateInfo**)&forUnmarshaling->pVertexInputState, (*ptr), 8);
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) {
+        memcpy((VkPipelineVertexInputStateCreateInfo**)&forUnmarshaling->pVertexInputState, (*ptr),
+               8);
         android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pVertexInputState);
         *ptr += 8;
     }
-    if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || forUnmarshaling->pVertexInputState))
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pVertexInputState, sizeof(const VkPipelineVertexInputStateCreateInfo));
-        reservedunmarshal_VkPipelineVertexInputStateCreateInfo(vkStream, rootType, (VkPipelineVertexInputStateCreateInfo*)(forUnmarshaling->pVertexInputState), ptr);
+    if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) ||
+         forUnmarshaling->pVertexInputState)) {
+        vkStream->alloc((void**)&forUnmarshaling->pVertexInputState,
+                        sizeof(const VkPipelineVertexInputStateCreateInfo));
+        reservedunmarshal_VkPipelineVertexInputStateCreateInfo(
+            vkStream, rootType,
+            (VkPipelineVertexInputStateCreateInfo*)(forUnmarshaling->pVertexInputState), ptr);
     }
     // WARNING PTR CHECK
-    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT)
-    {
-        memcpy((VkPipelineInputAssemblyStateCreateInfo**)&forUnmarshaling->pInputAssemblyState, (*ptr), 8);
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) {
+        memcpy((VkPipelineInputAssemblyStateCreateInfo**)&forUnmarshaling->pInputAssemblyState,
+               (*ptr), 8);
         android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pInputAssemblyState);
         *ptr += 8;
     }
-    if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || forUnmarshaling->pInputAssemblyState))
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pInputAssemblyState, sizeof(const VkPipelineInputAssemblyStateCreateInfo));
-        reservedunmarshal_VkPipelineInputAssemblyStateCreateInfo(vkStream, rootType, (VkPipelineInputAssemblyStateCreateInfo*)(forUnmarshaling->pInputAssemblyState), ptr);
+    if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) ||
+         forUnmarshaling->pInputAssemblyState)) {
+        vkStream->alloc((void**)&forUnmarshaling->pInputAssemblyState,
+                        sizeof(const VkPipelineInputAssemblyStateCreateInfo));
+        reservedunmarshal_VkPipelineInputAssemblyStateCreateInfo(
+            vkStream, rootType,
+            (VkPipelineInputAssemblyStateCreateInfo*)(forUnmarshaling->pInputAssemblyState), ptr);
     }
     // WARNING PTR CHECK
-    memcpy((VkPipelineTessellationStateCreateInfo**)&forUnmarshaling->pTessellationState, (*ptr), 8);
+    memcpy((VkPipelineTessellationStateCreateInfo**)&forUnmarshaling->pTessellationState, (*ptr),
+           8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pTessellationState);
     *ptr += 8;
-    if (forUnmarshaling->pTessellationState)
-    {
-        if (hasTessellation)
-        {
-            vkStream->alloc((void**)&forUnmarshaling->pTessellationState, sizeof(const VkPipelineTessellationStateCreateInfo));
-            reservedunmarshal_VkPipelineTessellationStateCreateInfo(vkStream, rootType, (VkPipelineTessellationStateCreateInfo*)(forUnmarshaling->pTessellationState), ptr);
-        }
-        else
-        {
+    if (forUnmarshaling->pTessellationState) {
+        if (hasTessellation) {
+            vkStream->alloc((void**)&forUnmarshaling->pTessellationState,
+                            sizeof(const VkPipelineTessellationStateCreateInfo));
+            reservedunmarshal_VkPipelineTessellationStateCreateInfo(
+                vkStream, rootType,
+                (VkPipelineTessellationStateCreateInfo*)(forUnmarshaling->pTessellationState), ptr);
+        } else {
             forUnmarshaling->pTessellationState = 0;
         }
     }
@@ -2641,59 +2545,60 @@
     memcpy((VkPipelineViewportStateCreateInfo**)&forUnmarshaling->pViewportState, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pViewportState);
     *ptr += 8;
-    if (forUnmarshaling->pViewportState)
-    {
-        if (hasRasterization)
-        {
-            vkStream->alloc((void**)&forUnmarshaling->pViewportState, sizeof(const VkPipelineViewportStateCreateInfo));
-            reservedunmarshal_VkPipelineViewportStateCreateInfo(vkStream, rootType, (VkPipelineViewportStateCreateInfo*)(forUnmarshaling->pViewportState), ptr);
-        }
-        else
-        {
+    if (forUnmarshaling->pViewportState) {
+        if (hasRasterization) {
+            vkStream->alloc((void**)&forUnmarshaling->pViewportState,
+                            sizeof(const VkPipelineViewportStateCreateInfo));
+            reservedunmarshal_VkPipelineViewportStateCreateInfo(
+                vkStream, rootType,
+                (VkPipelineViewportStateCreateInfo*)(forUnmarshaling->pViewportState), ptr);
+        } else {
             forUnmarshaling->pViewportState = 0;
         }
     }
     // WARNING PTR CHECK
-    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT)
-    {
-        memcpy((VkPipelineRasterizationStateCreateInfo**)&forUnmarshaling->pRasterizationState, (*ptr), 8);
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) {
+        memcpy((VkPipelineRasterizationStateCreateInfo**)&forUnmarshaling->pRasterizationState,
+               (*ptr), 8);
         android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pRasterizationState);
         *ptr += 8;
     }
-    if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || forUnmarshaling->pRasterizationState))
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pRasterizationState, sizeof(const VkPipelineRasterizationStateCreateInfo));
-        reservedunmarshal_VkPipelineRasterizationStateCreateInfo(vkStream, rootType, (VkPipelineRasterizationStateCreateInfo*)(forUnmarshaling->pRasterizationState), ptr);
+    if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) ||
+         forUnmarshaling->pRasterizationState)) {
+        vkStream->alloc((void**)&forUnmarshaling->pRasterizationState,
+                        sizeof(const VkPipelineRasterizationStateCreateInfo));
+        reservedunmarshal_VkPipelineRasterizationStateCreateInfo(
+            vkStream, rootType,
+            (VkPipelineRasterizationStateCreateInfo*)(forUnmarshaling->pRasterizationState), ptr);
     }
     // WARNING PTR CHECK
     memcpy((VkPipelineMultisampleStateCreateInfo**)&forUnmarshaling->pMultisampleState, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pMultisampleState);
     *ptr += 8;
-    if (forUnmarshaling->pMultisampleState)
-    {
-        if (hasRasterization)
-        {
-            vkStream->alloc((void**)&forUnmarshaling->pMultisampleState, sizeof(const VkPipelineMultisampleStateCreateInfo));
-            reservedunmarshal_VkPipelineMultisampleStateCreateInfo(vkStream, rootType, (VkPipelineMultisampleStateCreateInfo*)(forUnmarshaling->pMultisampleState), ptr);
-        }
-        else
-        {
+    if (forUnmarshaling->pMultisampleState) {
+        if (hasRasterization) {
+            vkStream->alloc((void**)&forUnmarshaling->pMultisampleState,
+                            sizeof(const VkPipelineMultisampleStateCreateInfo));
+            reservedunmarshal_VkPipelineMultisampleStateCreateInfo(
+                vkStream, rootType,
+                (VkPipelineMultisampleStateCreateInfo*)(forUnmarshaling->pMultisampleState), ptr);
+        } else {
             forUnmarshaling->pMultisampleState = 0;
         }
     }
     // WARNING PTR CHECK
-    memcpy((VkPipelineDepthStencilStateCreateInfo**)&forUnmarshaling->pDepthStencilState, (*ptr), 8);
+    memcpy((VkPipelineDepthStencilStateCreateInfo**)&forUnmarshaling->pDepthStencilState, (*ptr),
+           8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pDepthStencilState);
     *ptr += 8;
-    if (forUnmarshaling->pDepthStencilState)
-    {
-        if (hasRasterization)
-        {
-            vkStream->alloc((void**)&forUnmarshaling->pDepthStencilState, sizeof(const VkPipelineDepthStencilStateCreateInfo));
-            reservedunmarshal_VkPipelineDepthStencilStateCreateInfo(vkStream, rootType, (VkPipelineDepthStencilStateCreateInfo*)(forUnmarshaling->pDepthStencilState), ptr);
-        }
-        else
-        {
+    if (forUnmarshaling->pDepthStencilState) {
+        if (hasRasterization) {
+            vkStream->alloc((void**)&forUnmarshaling->pDepthStencilState,
+                            sizeof(const VkPipelineDepthStencilStateCreateInfo));
+            reservedunmarshal_VkPipelineDepthStencilStateCreateInfo(
+                vkStream, rootType,
+                (VkPipelineDepthStencilStateCreateInfo*)(forUnmarshaling->pDepthStencilState), ptr);
+        } else {
             forUnmarshaling->pDepthStencilState = 0;
         }
     }
@@ -2701,15 +2606,14 @@
     memcpy((VkPipelineColorBlendStateCreateInfo**)&forUnmarshaling->pColorBlendState, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pColorBlendState);
     *ptr += 8;
-    if (forUnmarshaling->pColorBlendState)
-    {
-        if (hasRasterization)
-        {
-            vkStream->alloc((void**)&forUnmarshaling->pColorBlendState, sizeof(const VkPipelineColorBlendStateCreateInfo));
-            reservedunmarshal_VkPipelineColorBlendStateCreateInfo(vkStream, rootType, (VkPipelineColorBlendStateCreateInfo*)(forUnmarshaling->pColorBlendState), ptr);
-        }
-        else
-        {
+    if (forUnmarshaling->pColorBlendState) {
+        if (hasRasterization) {
+            vkStream->alloc((void**)&forUnmarshaling->pColorBlendState,
+                            sizeof(const VkPipelineColorBlendStateCreateInfo));
+            reservedunmarshal_VkPipelineColorBlendStateCreateInfo(
+                vkStream, rootType,
+                (VkPipelineColorBlendStateCreateInfo*)(forUnmarshaling->pColorBlendState), ptr);
+        } else {
             forUnmarshaling->pColorBlendState = 0;
         }
     }
@@ -2717,35 +2621,36 @@
     memcpy((VkPipelineDynamicStateCreateInfo**)&forUnmarshaling->pDynamicState, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pDynamicState);
     *ptr += 8;
-    if (forUnmarshaling->pDynamicState)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pDynamicState, sizeof(const VkPipelineDynamicStateCreateInfo));
-        reservedunmarshal_VkPipelineDynamicStateCreateInfo(vkStream, rootType, (VkPipelineDynamicStateCreateInfo*)(forUnmarshaling->pDynamicState), ptr);
+    if (forUnmarshaling->pDynamicState) {
+        vkStream->alloc((void**)&forUnmarshaling->pDynamicState,
+                        sizeof(const VkPipelineDynamicStateCreateInfo));
+        reservedunmarshal_VkPipelineDynamicStateCreateInfo(
+            vkStream, rootType, (VkPipelineDynamicStateCreateInfo*)(forUnmarshaling->pDynamicState),
+            ptr);
     }
     uint64_t cgen_var_6;
     memcpy((uint64_t*)&cgen_var_6, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkPipelineLayout*)&forUnmarshaling->layout = (VkPipelineLayout)unbox_VkPipelineLayout((VkPipelineLayout)(*&cgen_var_6));
+    *(VkPipelineLayout*)&forUnmarshaling->layout =
+        (VkPipelineLayout)unbox_VkPipelineLayout((VkPipelineLayout)(*&cgen_var_6));
     uint64_t cgen_var_7;
     memcpy((uint64_t*)&cgen_var_7, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkRenderPass*)&forUnmarshaling->renderPass = (VkRenderPass)unbox_VkRenderPass((VkRenderPass)(*&cgen_var_7));
+    *(VkRenderPass*)&forUnmarshaling->renderPass =
+        (VkRenderPass)unbox_VkRenderPass((VkRenderPass)(*&cgen_var_7));
     memcpy((uint32_t*)&forUnmarshaling->subpass, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     uint64_t cgen_var_8;
     memcpy((uint64_t*)&cgen_var_8, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkPipeline*)&forUnmarshaling->basePipelineHandle = (VkPipeline)unbox_VkPipeline((VkPipeline)(*&cgen_var_8));
+    *(VkPipeline*)&forUnmarshaling->basePipelineHandle =
+        (VkPipeline)unbox_VkPipeline((VkPipeline)(*&cgen_var_8));
     memcpy((int32_t*)&forUnmarshaling->basePipelineIndex, *ptr, sizeof(int32_t));
     *ptr += sizeof(int32_t);
 }
 
-void reservedunmarshal_VkPushConstantRange(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPushConstantRange* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkPushConstantRange(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkPushConstantRange* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkShaderStageFlags*)&forUnmarshaling->stageFlags, *ptr, sizeof(VkShaderStageFlags));
     *ptr += sizeof(VkShaderStageFlags);
     memcpy((uint32_t*)&forUnmarshaling->offset, *ptr, sizeof(uint32_t));
@@ -2754,16 +2659,12 @@
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkPipelineLayoutCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineLayoutCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkPipelineLayoutCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                  VkPipelineLayoutCreateInfo* forUnmarshaling,
+                                                  uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -2771,53 +2672,54 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkPipelineLayoutCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkPipelineLayoutCreateFlags));
+    memcpy((VkPipelineLayoutCreateFlags*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkPipelineLayoutCreateFlags));
     *ptr += sizeof(VkPipelineLayoutCreateFlags);
     memcpy((uint32_t*)&forUnmarshaling->setLayoutCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pSetLayouts, forUnmarshaling->setLayoutCount * sizeof(const VkDescriptorSetLayout));
-    if (forUnmarshaling->setLayoutCount)
-    {
+    vkStream->alloc((void**)&forUnmarshaling->pSetLayouts,
+                    forUnmarshaling->setLayoutCount * sizeof(const VkDescriptorSetLayout));
+    if (forUnmarshaling->setLayoutCount) {
         uint8_t* cgen_var_0_ptr = (uint8_t*)(*ptr);
         *ptr += 8 * forUnmarshaling->setLayoutCount;
-        if (forUnmarshaling)
-        {
-            for (uint32_t k = 0; k < forUnmarshaling->setLayoutCount; ++k)
-            {
-                uint64_t tmpval; memcpy(&tmpval, cgen_var_0_ptr + k * 8, sizeof(uint64_t));
-                *(((VkDescriptorSetLayout*)forUnmarshaling->pSetLayouts) + k) = (VkDescriptorSetLayout)unbox_VkDescriptorSetLayout((VkDescriptorSetLayout)tmpval);
+        if (forUnmarshaling) {
+            for (uint32_t k = 0; k < forUnmarshaling->setLayoutCount; ++k) {
+                uint64_t tmpval;
+                memcpy(&tmpval, cgen_var_0_ptr + k * 8, sizeof(uint64_t));
+                *(((VkDescriptorSetLayout*)forUnmarshaling->pSetLayouts) + k) =
+                    (VkDescriptorSetLayout)unbox_VkDescriptorSetLayout(
+                        (VkDescriptorSetLayout)tmpval);
             }
         }
     }
     memcpy((uint32_t*)&forUnmarshaling->pushConstantRangeCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pPushConstantRanges, forUnmarshaling->pushConstantRangeCount * sizeof(const VkPushConstantRange));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->pushConstantRangeCount; ++i)
-    {
-        reservedunmarshal_VkPushConstantRange(vkStream, rootType, (VkPushConstantRange*)(forUnmarshaling->pPushConstantRanges + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pPushConstantRanges,
+                    forUnmarshaling->pushConstantRangeCount * sizeof(const VkPushConstantRange));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->pushConstantRangeCount; ++i) {
+        reservedunmarshal_VkPushConstantRange(
+            vkStream, rootType, (VkPushConstantRange*)(forUnmarshaling->pPushConstantRanges + i),
+            ptr);
     }
 }
 
-void reservedunmarshal_VkSamplerCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSamplerCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkSamplerCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkSamplerCreateInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -2825,15 +2727,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkSamplerCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkSamplerCreateFlags));
     *ptr += sizeof(VkSamplerCreateFlags);
@@ -2843,11 +2747,14 @@
     *ptr += sizeof(VkFilter);
     memcpy((VkSamplerMipmapMode*)&forUnmarshaling->mipmapMode, *ptr, sizeof(VkSamplerMipmapMode));
     *ptr += sizeof(VkSamplerMipmapMode);
-    memcpy((VkSamplerAddressMode*)&forUnmarshaling->addressModeU, *ptr, sizeof(VkSamplerAddressMode));
+    memcpy((VkSamplerAddressMode*)&forUnmarshaling->addressModeU, *ptr,
+           sizeof(VkSamplerAddressMode));
     *ptr += sizeof(VkSamplerAddressMode);
-    memcpy((VkSamplerAddressMode*)&forUnmarshaling->addressModeV, *ptr, sizeof(VkSamplerAddressMode));
+    memcpy((VkSamplerAddressMode*)&forUnmarshaling->addressModeV, *ptr,
+           sizeof(VkSamplerAddressMode));
     *ptr += sizeof(VkSamplerAddressMode);
-    memcpy((VkSamplerAddressMode*)&forUnmarshaling->addressModeW, *ptr, sizeof(VkSamplerAddressMode));
+    memcpy((VkSamplerAddressMode*)&forUnmarshaling->addressModeW, *ptr,
+           sizeof(VkSamplerAddressMode));
     *ptr += sizeof(VkSamplerAddressMode);
     memcpy((float*)&forUnmarshaling->mipLodBias, *ptr, sizeof(float));
     *ptr += sizeof(float);
@@ -2869,16 +2776,11 @@
     *ptr += sizeof(VkBool32);
 }
 
-void reservedunmarshal_VkCopyDescriptorSet(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCopyDescriptorSet* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkCopyDescriptorSet(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkCopyDescriptorSet* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -2886,20 +2788,23 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkDescriptorSet*)&forUnmarshaling->srcSet = (VkDescriptorSet)unbox_VkDescriptorSet((VkDescriptorSet)(*&cgen_var_0));
+    *(VkDescriptorSet*)&forUnmarshaling->srcSet =
+        (VkDescriptorSet)unbox_VkDescriptorSet((VkDescriptorSet)(*&cgen_var_0));
     memcpy((uint32_t*)&forUnmarshaling->srcBinding, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->srcArrayElement, *ptr, sizeof(uint32_t));
@@ -2907,7 +2812,8 @@
     uint64_t cgen_var_1;
     memcpy((uint64_t*)&cgen_var_1, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkDescriptorSet*)&forUnmarshaling->dstSet = (VkDescriptorSet)unbox_VkDescriptorSet((VkDescriptorSet)(*&cgen_var_1));
+    *(VkDescriptorSet*)&forUnmarshaling->dstSet =
+        (VkDescriptorSet)unbox_VkDescriptorSet((VkDescriptorSet)(*&cgen_var_1));
     memcpy((uint32_t*)&forUnmarshaling->dstBinding, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->dstArrayElement, *ptr, sizeof(uint32_t));
@@ -2916,12 +2822,9 @@
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkDescriptorBufferInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorBufferInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDescriptorBufferInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkDescriptorBufferInfo* forUnmarshaling,
+                                              uint8_t** ptr) {
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
@@ -2932,12 +2835,9 @@
     *ptr += sizeof(VkDeviceSize);
 }
 
-void reservedunmarshal_VkDescriptorImageInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorImageInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDescriptorImageInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkDescriptorImageInfo* forUnmarshaling,
+                                             uint8_t** ptr) {
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
@@ -2945,33 +2845,26 @@
     uint64_t cgen_var_1;
     memcpy((uint64_t*)&cgen_var_1, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkImageView*)&forUnmarshaling->imageView = (VkImageView)unbox_VkImageView((VkImageView)(*&cgen_var_1));
+    *(VkImageView*)&forUnmarshaling->imageView =
+        (VkImageView)unbox_VkImageView((VkImageView)(*&cgen_var_1));
     memcpy((VkImageLayout*)&forUnmarshaling->imageLayout, *ptr, sizeof(VkImageLayout));
     *ptr += sizeof(VkImageLayout);
 }
 
-void reservedunmarshal_VkDescriptorPoolSize(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorPoolSize* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDescriptorPoolSize(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkDescriptorPoolSize* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkDescriptorType*)&forUnmarshaling->type, *ptr, sizeof(VkDescriptorType));
     *ptr += sizeof(VkDescriptorType);
     memcpy((uint32_t*)&forUnmarshaling->descriptorCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkDescriptorPoolCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorPoolCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDescriptorPoolCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                  VkDescriptorPoolCreateInfo* forUnmarshaling,
+                                                  uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -2979,39 +2872,39 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkDescriptorPoolCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkDescriptorPoolCreateFlags));
+    memcpy((VkDescriptorPoolCreateFlags*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkDescriptorPoolCreateFlags));
     *ptr += sizeof(VkDescriptorPoolCreateFlags);
     memcpy((uint32_t*)&forUnmarshaling->maxSets, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->poolSizeCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pPoolSizes, forUnmarshaling->poolSizeCount * sizeof(const VkDescriptorPoolSize));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->poolSizeCount; ++i)
-    {
-        reservedunmarshal_VkDescriptorPoolSize(vkStream, rootType, (VkDescriptorPoolSize*)(forUnmarshaling->pPoolSizes + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pPoolSizes,
+                    forUnmarshaling->poolSizeCount * sizeof(const VkDescriptorPoolSize));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->poolSizeCount; ++i) {
+        reservedunmarshal_VkDescriptorPoolSize(
+            vkStream, rootType, (VkDescriptorPoolSize*)(forUnmarshaling->pPoolSizes + i), ptr);
     }
 }
 
-void reservedunmarshal_VkDescriptorSetAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorSetAllocateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDescriptorSetAllocateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkDescriptorSetAllocateInfo* forUnmarshaling,
+                                                   uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -3019,44 +2912,46 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkDescriptorPool*)&forUnmarshaling->descriptorPool = (VkDescriptorPool)unbox_VkDescriptorPool((VkDescriptorPool)(*&cgen_var_0));
+    *(VkDescriptorPool*)&forUnmarshaling->descriptorPool =
+        (VkDescriptorPool)unbox_VkDescriptorPool((VkDescriptorPool)(*&cgen_var_0));
     memcpy((uint32_t*)&forUnmarshaling->descriptorSetCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pSetLayouts, forUnmarshaling->descriptorSetCount * sizeof(const VkDescriptorSetLayout));
-    if (forUnmarshaling->descriptorSetCount)
-    {
+    vkStream->alloc((void**)&forUnmarshaling->pSetLayouts,
+                    forUnmarshaling->descriptorSetCount * sizeof(const VkDescriptorSetLayout));
+    if (forUnmarshaling->descriptorSetCount) {
         uint8_t* cgen_var_1_ptr = (uint8_t*)(*ptr);
         *ptr += 8 * forUnmarshaling->descriptorSetCount;
-        if (forUnmarshaling)
-        {
-            for (uint32_t k = 0; k < forUnmarshaling->descriptorSetCount; ++k)
-            {
-                uint64_t tmpval; memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
-                *(((VkDescriptorSetLayout*)forUnmarshaling->pSetLayouts) + k) = (VkDescriptorSetLayout)unbox_VkDescriptorSetLayout((VkDescriptorSetLayout)tmpval);
+        if (forUnmarshaling) {
+            for (uint32_t k = 0; k < forUnmarshaling->descriptorSetCount; ++k) {
+                uint64_t tmpval;
+                memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
+                *(((VkDescriptorSetLayout*)forUnmarshaling->pSetLayouts) + k) =
+                    (VkDescriptorSetLayout)unbox_VkDescriptorSetLayout(
+                        (VkDescriptorSetLayout)tmpval);
             }
         }
     }
 }
 
-void reservedunmarshal_VkDescriptorSetLayoutBinding(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorSetLayoutBinding* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDescriptorSetLayoutBinding(VulkanStream* vkStream,
+                                                    VkStructureType rootType,
+                                                    VkDescriptorSetLayoutBinding* forUnmarshaling,
+                                                    uint8_t** ptr) {
     memcpy((uint32_t*)&forUnmarshaling->binding, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((VkDescriptorType*)&forUnmarshaling->descriptorType, *ptr, sizeof(VkDescriptorType));
@@ -3069,19 +2964,18 @@
     memcpy((VkSampler**)&forUnmarshaling->pImmutableSamplers, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pImmutableSamplers);
     *ptr += 8;
-    if (forUnmarshaling->pImmutableSamplers)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pImmutableSamplers, forUnmarshaling->descriptorCount * sizeof(const VkSampler));
-        if (forUnmarshaling->descriptorCount)
-        {
+    if (forUnmarshaling->pImmutableSamplers) {
+        vkStream->alloc((void**)&forUnmarshaling->pImmutableSamplers,
+                        forUnmarshaling->descriptorCount * sizeof(const VkSampler));
+        if (forUnmarshaling->descriptorCount) {
             uint8_t* cgen_var_0_0_ptr = (uint8_t*)(*ptr);
             *ptr += 8 * forUnmarshaling->descriptorCount;
-            if (forUnmarshaling)
-            {
-                for (uint32_t k = 0; k < forUnmarshaling->descriptorCount; ++k)
-                {
-                    uint64_t tmpval; memcpy(&tmpval, cgen_var_0_0_ptr + k * 8, sizeof(uint64_t));
-                    *(((VkSampler*)forUnmarshaling->pImmutableSamplers) + k) = (VkSampler)unbox_VkSampler((VkSampler)tmpval);
+            if (forUnmarshaling) {
+                for (uint32_t k = 0; k < forUnmarshaling->descriptorCount; ++k) {
+                    uint64_t tmpval;
+                    memcpy(&tmpval, cgen_var_0_0_ptr + k * 8, sizeof(uint64_t));
+                    *(((VkSampler*)forUnmarshaling->pImmutableSamplers) + k) =
+                        (VkSampler)unbox_VkSampler((VkSampler)tmpval);
                 }
             }
         }
@@ -3089,15 +2983,11 @@
 }
 
 void reservedunmarshal_VkDescriptorSetLayoutCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorSetLayoutCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDescriptorSetLayoutCreateInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -3105,37 +2995,37 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkDescriptorSetLayoutCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkDescriptorSetLayoutCreateFlags));
+    memcpy((VkDescriptorSetLayoutCreateFlags*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkDescriptorSetLayoutCreateFlags));
     *ptr += sizeof(VkDescriptorSetLayoutCreateFlags);
     memcpy((uint32_t*)&forUnmarshaling->bindingCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pBindings, forUnmarshaling->bindingCount * sizeof(const VkDescriptorSetLayoutBinding));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->bindingCount; ++i)
-    {
-        reservedunmarshal_VkDescriptorSetLayoutBinding(vkStream, rootType, (VkDescriptorSetLayoutBinding*)(forUnmarshaling->pBindings + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pBindings,
+                    forUnmarshaling->bindingCount * sizeof(const VkDescriptorSetLayoutBinding));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->bindingCount; ++i) {
+        reservedunmarshal_VkDescriptorSetLayoutBinding(
+            vkStream, rootType, (VkDescriptorSetLayoutBinding*)(forUnmarshaling->pBindings + i),
+            ptr);
     }
 }
 
-void reservedunmarshal_VkWriteDescriptorSet(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkWriteDescriptorSet* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkWriteDescriptorSet(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkWriteDescriptorSet* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -3143,20 +3033,23 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkDescriptorSet*)&forUnmarshaling->dstSet = (VkDescriptorSet)unbox_VkDescriptorSet((VkDescriptorSet)(*&cgen_var_0));
+    *(VkDescriptorSet*)&forUnmarshaling->dstSet =
+        (VkDescriptorSet)unbox_VkDescriptorSet((VkDescriptorSet)(*&cgen_var_0));
     memcpy((uint32_t*)&forUnmarshaling->dstBinding, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->dstArrayElement, *ptr, sizeof(uint32_t));
@@ -3169,18 +3062,21 @@
     memcpy((VkDescriptorImageInfo**)&forUnmarshaling->pImageInfo, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pImageInfo);
     *ptr += 8;
-    if (forUnmarshaling->pImageInfo)
-    {
-        if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || ((VK_DESCRIPTOR_TYPE_SAMPLER == forUnmarshaling->descriptorType) || (VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER == forUnmarshaling->descriptorType) || (VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE == forUnmarshaling->descriptorType) || (VK_DESCRIPTOR_TYPE_STORAGE_IMAGE == forUnmarshaling->descriptorType) || (VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT == forUnmarshaling->descriptorType))))
-        {
-            vkStream->alloc((void**)&forUnmarshaling->pImageInfo, forUnmarshaling->descriptorCount * sizeof(const VkDescriptorImageInfo));
-            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->descriptorCount; ++i)
-            {
-                reservedunmarshal_VkDescriptorImageInfo(vkStream, rootType, (VkDescriptorImageInfo*)(forUnmarshaling->pImageInfo + i), ptr);
+    if (forUnmarshaling->pImageInfo) {
+        if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) ||
+             ((VK_DESCRIPTOR_TYPE_SAMPLER == forUnmarshaling->descriptorType) ||
+              (VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER == forUnmarshaling->descriptorType) ||
+              (VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE == forUnmarshaling->descriptorType) ||
+              (VK_DESCRIPTOR_TYPE_STORAGE_IMAGE == forUnmarshaling->descriptorType) ||
+              (VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT == forUnmarshaling->descriptorType)))) {
+            vkStream->alloc((void**)&forUnmarshaling->pImageInfo,
+                            forUnmarshaling->descriptorCount * sizeof(const VkDescriptorImageInfo));
+            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->descriptorCount; ++i) {
+                reservedunmarshal_VkDescriptorImageInfo(
+                    vkStream, rootType, (VkDescriptorImageInfo*)(forUnmarshaling->pImageInfo + i),
+                    ptr);
             }
-        }
-        else
-        {
+        } else {
             forUnmarshaling->pImageInfo = 0;
         }
     }
@@ -3188,18 +3084,21 @@
     memcpy((VkDescriptorBufferInfo**)&forUnmarshaling->pBufferInfo, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pBufferInfo);
     *ptr += 8;
-    if (forUnmarshaling->pBufferInfo)
-    {
-        if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || ((VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER == forUnmarshaling->descriptorType) || (VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC == forUnmarshaling->descriptorType) || (VK_DESCRIPTOR_TYPE_STORAGE_BUFFER == forUnmarshaling->descriptorType) || (VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC == forUnmarshaling->descriptorType))))
-        {
-            vkStream->alloc((void**)&forUnmarshaling->pBufferInfo, forUnmarshaling->descriptorCount * sizeof(const VkDescriptorBufferInfo));
-            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->descriptorCount; ++i)
-            {
-                reservedunmarshal_VkDescriptorBufferInfo(vkStream, rootType, (VkDescriptorBufferInfo*)(forUnmarshaling->pBufferInfo + i), ptr);
+    if (forUnmarshaling->pBufferInfo) {
+        if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) ||
+             ((VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER == forUnmarshaling->descriptorType) ||
+              (VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC == forUnmarshaling->descriptorType) ||
+              (VK_DESCRIPTOR_TYPE_STORAGE_BUFFER == forUnmarshaling->descriptorType) ||
+              (VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC == forUnmarshaling->descriptorType)))) {
+            vkStream->alloc(
+                (void**)&forUnmarshaling->pBufferInfo,
+                forUnmarshaling->descriptorCount * sizeof(const VkDescriptorBufferInfo));
+            for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->descriptorCount; ++i) {
+                reservedunmarshal_VkDescriptorBufferInfo(
+                    vkStream, rootType, (VkDescriptorBufferInfo*)(forUnmarshaling->pBufferInfo + i),
+                    ptr);
             }
-        }
-        else
-        {
+        } else {
             forUnmarshaling->pBufferInfo = 0;
         }
     }
@@ -3207,39 +3106,35 @@
     memcpy((VkBufferView**)&forUnmarshaling->pTexelBufferView, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pTexelBufferView);
     *ptr += 8;
-    if (forUnmarshaling->pTexelBufferView)
-    {
-        if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || ((VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER == forUnmarshaling->descriptorType) || (VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER == forUnmarshaling->descriptorType))))
-        {
-            vkStream->alloc((void**)&forUnmarshaling->pTexelBufferView, forUnmarshaling->descriptorCount * sizeof(const VkBufferView));
-            if (forUnmarshaling->descriptorCount)
-            {
+    if (forUnmarshaling->pTexelBufferView) {
+        if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) ||
+             ((VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER == forUnmarshaling->descriptorType) ||
+              (VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER == forUnmarshaling->descriptorType)))) {
+            vkStream->alloc((void**)&forUnmarshaling->pTexelBufferView,
+                            forUnmarshaling->descriptorCount * sizeof(const VkBufferView));
+            if (forUnmarshaling->descriptorCount) {
                 uint8_t* cgen_var_3_0_ptr = (uint8_t*)(*ptr);
                 *ptr += 8 * forUnmarshaling->descriptorCount;
-                if (forUnmarshaling)
-                {
-                    for (uint32_t k = 0; k < forUnmarshaling->descriptorCount; ++k)
-                    {
-                        uint64_t tmpval; memcpy(&tmpval, cgen_var_3_0_ptr + k * 8, sizeof(uint64_t));
-                        *(((VkBufferView*)forUnmarshaling->pTexelBufferView) + k) = (VkBufferView)unbox_VkBufferView((VkBufferView)tmpval);
+                if (forUnmarshaling) {
+                    for (uint32_t k = 0; k < forUnmarshaling->descriptorCount; ++k) {
+                        uint64_t tmpval;
+                        memcpy(&tmpval, cgen_var_3_0_ptr + k * 8, sizeof(uint64_t));
+                        *(((VkBufferView*)forUnmarshaling->pTexelBufferView) + k) =
+                            (VkBufferView)unbox_VkBufferView((VkBufferView)tmpval);
                     }
                 }
             }
-        }
-        else
-        {
+        } else {
             forUnmarshaling->pTexelBufferView = 0;
         }
     }
 }
 
-void reservedunmarshal_VkAttachmentDescription(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAttachmentDescription* forUnmarshaling,
-    uint8_t** ptr)
-{
-    memcpy((VkAttachmentDescriptionFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkAttachmentDescriptionFlags));
+void reservedunmarshal_VkAttachmentDescription(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkAttachmentDescription* forUnmarshaling,
+                                               uint8_t** ptr) {
+    memcpy((VkAttachmentDescriptionFlags*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkAttachmentDescriptionFlags));
     *ptr += sizeof(VkAttachmentDescriptionFlags);
     memcpy((VkFormat*)&forUnmarshaling->format, *ptr, sizeof(VkFormat));
     *ptr += sizeof(VkFormat);
@@ -3251,7 +3146,8 @@
     *ptr += sizeof(VkAttachmentStoreOp);
     memcpy((VkAttachmentLoadOp*)&forUnmarshaling->stencilLoadOp, *ptr, sizeof(VkAttachmentLoadOp));
     *ptr += sizeof(VkAttachmentLoadOp);
-    memcpy((VkAttachmentStoreOp*)&forUnmarshaling->stencilStoreOp, *ptr, sizeof(VkAttachmentStoreOp));
+    memcpy((VkAttachmentStoreOp*)&forUnmarshaling->stencilStoreOp, *ptr,
+           sizeof(VkAttachmentStoreOp));
     *ptr += sizeof(VkAttachmentStoreOp);
     memcpy((VkImageLayout*)&forUnmarshaling->initialLayout, *ptr, sizeof(VkImageLayout));
     *ptr += sizeof(VkImageLayout);
@@ -3259,28 +3155,21 @@
     *ptr += sizeof(VkImageLayout);
 }
 
-void reservedunmarshal_VkAttachmentReference(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAttachmentReference* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkAttachmentReference(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkAttachmentReference* forUnmarshaling,
+                                             uint8_t** ptr) {
     memcpy((uint32_t*)&forUnmarshaling->attachment, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((VkImageLayout*)&forUnmarshaling->layout, *ptr, sizeof(VkImageLayout));
     *ptr += sizeof(VkImageLayout);
 }
 
-void reservedunmarshal_VkFramebufferCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFramebufferCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkFramebufferCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkFramebufferCreateInfo* forUnmarshaling,
+                                               uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -3288,43 +3177,45 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkFramebufferCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkFramebufferCreateFlags));
+    memcpy((VkFramebufferCreateFlags*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkFramebufferCreateFlags));
     *ptr += sizeof(VkFramebufferCreateFlags);
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkRenderPass*)&forUnmarshaling->renderPass = (VkRenderPass)unbox_VkRenderPass((VkRenderPass)(*&cgen_var_0));
+    *(VkRenderPass*)&forUnmarshaling->renderPass =
+        (VkRenderPass)unbox_VkRenderPass((VkRenderPass)(*&cgen_var_0));
     memcpy((uint32_t*)&forUnmarshaling->attachmentCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || (((forUnmarshaling->flags & VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT) == 0))))
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pAttachments, forUnmarshaling->attachmentCount * sizeof(const VkImageView));
-        if (forUnmarshaling->attachmentCount)
-        {
+    if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) ||
+         (((forUnmarshaling->flags & VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT) == 0)))) {
+        vkStream->alloc((void**)&forUnmarshaling->pAttachments,
+                        forUnmarshaling->attachmentCount * sizeof(const VkImageView));
+        if (forUnmarshaling->attachmentCount) {
             uint8_t* cgen_var_0_0_ptr = (uint8_t*)(*ptr);
             *ptr += 8 * forUnmarshaling->attachmentCount;
-            if (forUnmarshaling)
-            {
-                for (uint32_t k = 0; k < forUnmarshaling->attachmentCount; ++k)
-                {
-                    uint64_t tmpval; memcpy(&tmpval, cgen_var_0_0_ptr + k * 8, sizeof(uint64_t));
-                    *(((VkImageView*)forUnmarshaling->pAttachments) + k) = (VkImageView)unbox_VkImageView((VkImageView)tmpval);
+            if (forUnmarshaling) {
+                for (uint32_t k = 0; k < forUnmarshaling->attachmentCount; ++k) {
+                    uint64_t tmpval;
+                    memcpy(&tmpval, cgen_var_0_0_ptr + k * 8, sizeof(uint64_t));
+                    *(((VkImageView*)forUnmarshaling->pAttachments) + k) =
+                        (VkImageView)unbox_VkImageView((VkImageView)tmpval);
                 }
             }
         }
-    }
-    else
-    {
+    } else {
         forUnmarshaling->pAttachments = 0;
     }
     memcpy((uint32_t*)&forUnmarshaling->width, *ptr, sizeof(uint32_t));
@@ -3335,71 +3226,77 @@
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkSubpassDescription(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubpassDescription* forUnmarshaling,
-    uint8_t** ptr)
-{
-    memcpy((VkSubpassDescriptionFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkSubpassDescriptionFlags));
+void reservedunmarshal_VkSubpassDescription(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkSubpassDescription* forUnmarshaling, uint8_t** ptr) {
+    memcpy((VkSubpassDescriptionFlags*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkSubpassDescriptionFlags));
     *ptr += sizeof(VkSubpassDescriptionFlags);
-    memcpy((VkPipelineBindPoint*)&forUnmarshaling->pipelineBindPoint, *ptr, sizeof(VkPipelineBindPoint));
+    memcpy((VkPipelineBindPoint*)&forUnmarshaling->pipelineBindPoint, *ptr,
+           sizeof(VkPipelineBindPoint));
     *ptr += sizeof(VkPipelineBindPoint);
     memcpy((uint32_t*)&forUnmarshaling->inputAttachmentCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pInputAttachments, forUnmarshaling->inputAttachmentCount * sizeof(const VkAttachmentReference));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->inputAttachmentCount; ++i)
-    {
-        reservedunmarshal_VkAttachmentReference(vkStream, rootType, (VkAttachmentReference*)(forUnmarshaling->pInputAttachments + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pInputAttachments,
+                    forUnmarshaling->inputAttachmentCount * sizeof(const VkAttachmentReference));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->inputAttachmentCount; ++i) {
+        reservedunmarshal_VkAttachmentReference(
+            vkStream, rootType, (VkAttachmentReference*)(forUnmarshaling->pInputAttachments + i),
+            ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->colorAttachmentCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pColorAttachments, forUnmarshaling->colorAttachmentCount * sizeof(const VkAttachmentReference));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->colorAttachmentCount; ++i)
-    {
-        reservedunmarshal_VkAttachmentReference(vkStream, rootType, (VkAttachmentReference*)(forUnmarshaling->pColorAttachments + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pColorAttachments,
+                    forUnmarshaling->colorAttachmentCount * sizeof(const VkAttachmentReference));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->colorAttachmentCount; ++i) {
+        reservedunmarshal_VkAttachmentReference(
+            vkStream, rootType, (VkAttachmentReference*)(forUnmarshaling->pColorAttachments + i),
+            ptr);
     }
     // WARNING PTR CHECK
     memcpy((VkAttachmentReference**)&forUnmarshaling->pResolveAttachments, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pResolveAttachments);
     *ptr += 8;
-    if (forUnmarshaling->pResolveAttachments)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pResolveAttachments, forUnmarshaling->colorAttachmentCount * sizeof(const VkAttachmentReference));
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->colorAttachmentCount; ++i)
-        {
-            reservedunmarshal_VkAttachmentReference(vkStream, rootType, (VkAttachmentReference*)(forUnmarshaling->pResolveAttachments + i), ptr);
+    if (forUnmarshaling->pResolveAttachments) {
+        vkStream->alloc(
+            (void**)&forUnmarshaling->pResolveAttachments,
+            forUnmarshaling->colorAttachmentCount * sizeof(const VkAttachmentReference));
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->colorAttachmentCount; ++i) {
+            reservedunmarshal_VkAttachmentReference(
+                vkStream, rootType,
+                (VkAttachmentReference*)(forUnmarshaling->pResolveAttachments + i), ptr);
         }
     }
     // WARNING PTR CHECK
     memcpy((VkAttachmentReference**)&forUnmarshaling->pDepthStencilAttachment, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pDepthStencilAttachment);
     *ptr += 8;
-    if (forUnmarshaling->pDepthStencilAttachment)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pDepthStencilAttachment, sizeof(const VkAttachmentReference));
-        reservedunmarshal_VkAttachmentReference(vkStream, rootType, (VkAttachmentReference*)(forUnmarshaling->pDepthStencilAttachment), ptr);
+    if (forUnmarshaling->pDepthStencilAttachment) {
+        vkStream->alloc((void**)&forUnmarshaling->pDepthStencilAttachment,
+                        sizeof(const VkAttachmentReference));
+        reservedunmarshal_VkAttachmentReference(
+            vkStream, rootType, (VkAttachmentReference*)(forUnmarshaling->pDepthStencilAttachment),
+            ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->preserveAttachmentCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pPreserveAttachments, forUnmarshaling->preserveAttachmentCount * sizeof(const uint32_t));
-    memcpy((uint32_t*)forUnmarshaling->pPreserveAttachments, *ptr, forUnmarshaling->preserveAttachmentCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pPreserveAttachments,
+                    forUnmarshaling->preserveAttachmentCount * sizeof(const uint32_t));
+    memcpy((uint32_t*)forUnmarshaling->pPreserveAttachments, *ptr,
+           forUnmarshaling->preserveAttachmentCount * sizeof(const uint32_t));
     *ptr += forUnmarshaling->preserveAttachmentCount * sizeof(const uint32_t);
 }
 
-void reservedunmarshal_VkSubpassDependency(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubpassDependency* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkSubpassDependency(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkSubpassDependency* forUnmarshaling, uint8_t** ptr) {
     memcpy((uint32_t*)&forUnmarshaling->srcSubpass, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->dstSubpass, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((VkPipelineStageFlags*)&forUnmarshaling->srcStageMask, *ptr, sizeof(VkPipelineStageFlags));
+    memcpy((VkPipelineStageFlags*)&forUnmarshaling->srcStageMask, *ptr,
+           sizeof(VkPipelineStageFlags));
     *ptr += sizeof(VkPipelineStageFlags);
-    memcpy((VkPipelineStageFlags*)&forUnmarshaling->dstStageMask, *ptr, sizeof(VkPipelineStageFlags));
+    memcpy((VkPipelineStageFlags*)&forUnmarshaling->dstStageMask, *ptr,
+           sizeof(VkPipelineStageFlags));
     *ptr += sizeof(VkPipelineStageFlags);
     memcpy((VkAccessFlags*)&forUnmarshaling->srcAccessMask, *ptr, sizeof(VkAccessFlags));
     *ptr += sizeof(VkAccessFlags);
@@ -3409,16 +3306,12 @@
     *ptr += sizeof(VkDependencyFlags);
 }
 
-void reservedunmarshal_VkRenderPassCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderPassCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkRenderPassCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkRenderPassCreateInfo* forUnmarshaling,
+                                              uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -3426,51 +3319,53 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkRenderPassCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkRenderPassCreateFlags));
+    memcpy((VkRenderPassCreateFlags*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkRenderPassCreateFlags));
     *ptr += sizeof(VkRenderPassCreateFlags);
     memcpy((uint32_t*)&forUnmarshaling->attachmentCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pAttachments, forUnmarshaling->attachmentCount * sizeof(const VkAttachmentDescription));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->attachmentCount; ++i)
-    {
-        reservedunmarshal_VkAttachmentDescription(vkStream, rootType, (VkAttachmentDescription*)(forUnmarshaling->pAttachments + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pAttachments,
+                    forUnmarshaling->attachmentCount * sizeof(const VkAttachmentDescription));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->attachmentCount; ++i) {
+        reservedunmarshal_VkAttachmentDescription(
+            vkStream, rootType, (VkAttachmentDescription*)(forUnmarshaling->pAttachments + i), ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->subpassCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pSubpasses, forUnmarshaling->subpassCount * sizeof(const VkSubpassDescription));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->subpassCount; ++i)
-    {
-        reservedunmarshal_VkSubpassDescription(vkStream, rootType, (VkSubpassDescription*)(forUnmarshaling->pSubpasses + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pSubpasses,
+                    forUnmarshaling->subpassCount * sizeof(const VkSubpassDescription));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->subpassCount; ++i) {
+        reservedunmarshal_VkSubpassDescription(
+            vkStream, rootType, (VkSubpassDescription*)(forUnmarshaling->pSubpasses + i), ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->dependencyCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pDependencies, forUnmarshaling->dependencyCount * sizeof(const VkSubpassDependency));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->dependencyCount; ++i)
-    {
-        reservedunmarshal_VkSubpassDependency(vkStream, rootType, (VkSubpassDependency*)(forUnmarshaling->pDependencies + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pDependencies,
+                    forUnmarshaling->dependencyCount * sizeof(const VkSubpassDependency));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->dependencyCount; ++i) {
+        reservedunmarshal_VkSubpassDependency(
+            vkStream, rootType, (VkSubpassDependency*)(forUnmarshaling->pDependencies + i), ptr);
     }
 }
 
-void reservedunmarshal_VkCommandPoolCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCommandPoolCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkCommandPoolCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkCommandPoolCreateInfo* forUnmarshaling,
+                                               uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -3478,32 +3373,31 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkCommandPoolCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkCommandPoolCreateFlags));
+    memcpy((VkCommandPoolCreateFlags*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkCommandPoolCreateFlags));
     *ptr += sizeof(VkCommandPoolCreateFlags);
     memcpy((uint32_t*)&forUnmarshaling->queueFamilyIndex, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkCommandBufferAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCommandBufferAllocateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkCommandBufferAllocateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkCommandBufferAllocateInfo* forUnmarshaling,
+                                                   uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -3511,20 +3405,23 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkCommandPool*)&forUnmarshaling->commandPool = (VkCommandPool)unbox_VkCommandPool((VkCommandPool)(*&cgen_var_0));
+    *(VkCommandPool*)&forUnmarshaling->commandPool =
+        (VkCommandPool)unbox_VkCommandPool((VkCommandPool)(*&cgen_var_0));
     memcpy((VkCommandBufferLevel*)&forUnmarshaling->level, *ptr, sizeof(VkCommandBufferLevel));
     *ptr += sizeof(VkCommandBufferLevel);
     memcpy((uint32_t*)&forUnmarshaling->commandBufferCount, *ptr, sizeof(uint32_t));
@@ -3532,15 +3429,11 @@
 }
 
 void reservedunmarshal_VkCommandBufferInheritanceInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCommandBufferInheritanceInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkCommandBufferInheritanceInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -3548,44 +3441,45 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkRenderPass*)&forUnmarshaling->renderPass = (VkRenderPass)unbox_VkRenderPass((VkRenderPass)(*&cgen_var_0));
+    *(VkRenderPass*)&forUnmarshaling->renderPass =
+        (VkRenderPass)unbox_VkRenderPass((VkRenderPass)(*&cgen_var_0));
     memcpy((uint32_t*)&forUnmarshaling->subpass, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     uint64_t cgen_var_1;
     memcpy((uint64_t*)&cgen_var_1, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkFramebuffer*)&forUnmarshaling->framebuffer = (VkFramebuffer)unbox_VkFramebuffer((VkFramebuffer)(*&cgen_var_1));
+    *(VkFramebuffer*)&forUnmarshaling->framebuffer =
+        (VkFramebuffer)unbox_VkFramebuffer((VkFramebuffer)(*&cgen_var_1));
     memcpy((VkBool32*)&forUnmarshaling->occlusionQueryEnable, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy((VkQueryControlFlags*)&forUnmarshaling->queryFlags, *ptr, sizeof(VkQueryControlFlags));
     *ptr += sizeof(VkQueryControlFlags);
-    memcpy((VkQueryPipelineStatisticFlags*)&forUnmarshaling->pipelineStatistics, *ptr, sizeof(VkQueryPipelineStatisticFlags));
+    memcpy((VkQueryPipelineStatisticFlags*)&forUnmarshaling->pipelineStatistics, *ptr,
+           sizeof(VkQueryPipelineStatisticFlags));
     *ptr += sizeof(VkQueryPipelineStatisticFlags);
 }
 
-void reservedunmarshal_VkCommandBufferBeginInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCommandBufferBeginInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkCommandBufferBeginInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkCommandBufferBeginInfo* forUnmarshaling,
+                                                uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -3593,35 +3487,36 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkCommandBufferUsageFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkCommandBufferUsageFlags));
+    memcpy((VkCommandBufferUsageFlags*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkCommandBufferUsageFlags));
     *ptr += sizeof(VkCommandBufferUsageFlags);
     // WARNING PTR CHECK
     memcpy((VkCommandBufferInheritanceInfo**)&forUnmarshaling->pInheritanceInfo, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pInheritanceInfo);
     *ptr += 8;
-    if (forUnmarshaling->pInheritanceInfo)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pInheritanceInfo, sizeof(const VkCommandBufferInheritanceInfo));
-        reservedunmarshal_VkCommandBufferInheritanceInfo(vkStream, rootType, (VkCommandBufferInheritanceInfo*)(forUnmarshaling->pInheritanceInfo), ptr);
+    if (forUnmarshaling->pInheritanceInfo) {
+        vkStream->alloc((void**)&forUnmarshaling->pInheritanceInfo,
+                        sizeof(const VkCommandBufferInheritanceInfo));
+        reservedunmarshal_VkCommandBufferInheritanceInfo(
+            vkStream, rootType,
+            (VkCommandBufferInheritanceInfo*)(forUnmarshaling->pInheritanceInfo), ptr);
     }
 }
 
-void reservedunmarshal_VkBufferCopy(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferCopy* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkBufferCopy(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkBufferCopy* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkDeviceSize*)&forUnmarshaling->srcOffset, *ptr, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
     memcpy((VkDeviceSize*)&forUnmarshaling->dstOffset, *ptr, sizeof(VkDeviceSize));
@@ -3630,12 +3525,9 @@
     *ptr += sizeof(VkDeviceSize);
 }
 
-void reservedunmarshal_VkImageSubresourceLayers(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageSubresourceLayers* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkImageSubresourceLayers(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkImageSubresourceLayers* forUnmarshaling,
+                                                uint8_t** ptr) {
     memcpy((VkImageAspectFlags*)&forUnmarshaling->aspectMask, *ptr, sizeof(VkImageAspectFlags));
     *ptr += sizeof(VkImageAspectFlags);
     memcpy((uint32_t*)&forUnmarshaling->mipLevel, *ptr, sizeof(uint32_t));
@@ -3646,73 +3538,55 @@
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkBufferImageCopy(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferImageCopy* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkBufferImageCopy(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkBufferImageCopy* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkDeviceSize*)&forUnmarshaling->bufferOffset, *ptr, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
     memcpy((uint32_t*)&forUnmarshaling->bufferRowLength, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->bufferImageHeight, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    reservedunmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->imageSubresource), ptr);
-    reservedunmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->imageOffset), ptr);
-    reservedunmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forUnmarshaling->imageExtent), ptr);
+    reservedunmarshal_VkImageSubresourceLayers(
+        vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->imageSubresource), ptr);
+    reservedunmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->imageOffset),
+                                 ptr);
+    reservedunmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forUnmarshaling->imageExtent),
+                                 ptr);
 }
 
-void reservedunmarshal_VkClearColorValue(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkClearColorValue* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkClearColorValue(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkClearColorValue* forUnmarshaling, uint8_t** ptr) {
     memcpy((float*)forUnmarshaling->float32, *ptr, 4 * sizeof(float));
     *ptr += 4 * sizeof(float);
 }
 
-void reservedunmarshal_VkClearDepthStencilValue(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkClearDepthStencilValue* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkClearDepthStencilValue(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkClearDepthStencilValue* forUnmarshaling,
+                                                uint8_t** ptr) {
     memcpy((float*)&forUnmarshaling->depth, *ptr, sizeof(float));
     *ptr += sizeof(float);
     memcpy((uint32_t*)&forUnmarshaling->stencil, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkClearValue(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkClearValue* forUnmarshaling,
-    uint8_t** ptr)
-{
-    reservedunmarshal_VkClearColorValue(vkStream, rootType, (VkClearColorValue*)(&forUnmarshaling->color), ptr);
+void reservedunmarshal_VkClearValue(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkClearValue* forUnmarshaling, uint8_t** ptr) {
+    reservedunmarshal_VkClearColorValue(vkStream, rootType,
+                                        (VkClearColorValue*)(&forUnmarshaling->color), ptr);
 }
 
-void reservedunmarshal_VkClearAttachment(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkClearAttachment* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkClearAttachment(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkClearAttachment* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkImageAspectFlags*)&forUnmarshaling->aspectMask, *ptr, sizeof(VkImageAspectFlags));
     *ptr += sizeof(VkImageAspectFlags);
     memcpy((uint32_t*)&forUnmarshaling->colorAttachment, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    reservedunmarshal_VkClearValue(vkStream, rootType, (VkClearValue*)(&forUnmarshaling->clearValue), ptr);
+    reservedunmarshal_VkClearValue(vkStream, rootType,
+                                   (VkClearValue*)(&forUnmarshaling->clearValue), ptr);
 }
 
-void reservedunmarshal_VkClearRect(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkClearRect* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkClearRect(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkClearRect* forUnmarshaling, uint8_t** ptr) {
     reservedunmarshal_VkRect2D(vkStream, rootType, (VkRect2D*)(&forUnmarshaling->rect), ptr);
     memcpy((uint32_t*)&forUnmarshaling->baseArrayLayer, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -3720,60 +3594,54 @@
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkImageBlit(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageBlit* forUnmarshaling,
-    uint8_t** ptr)
-{
-    reservedunmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->srcSubresource), ptr);
-    for (uint32_t i = 0; i < (uint32_t)2; ++i)
-    {
-        reservedunmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(forUnmarshaling->srcOffsets + i), ptr);
+void reservedunmarshal_VkImageBlit(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkImageBlit* forUnmarshaling, uint8_t** ptr) {
+    reservedunmarshal_VkImageSubresourceLayers(
+        vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->srcSubresource), ptr);
+    for (uint32_t i = 0; i < (uint32_t)2; ++i) {
+        reservedunmarshal_VkOffset3D(vkStream, rootType,
+                                     (VkOffset3D*)(forUnmarshaling->srcOffsets + i), ptr);
     }
-    reservedunmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->dstSubresource), ptr);
-    for (uint32_t i = 0; i < (uint32_t)2; ++i)
-    {
-        reservedunmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(forUnmarshaling->dstOffsets + i), ptr);
+    reservedunmarshal_VkImageSubresourceLayers(
+        vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->dstSubresource), ptr);
+    for (uint32_t i = 0; i < (uint32_t)2; ++i) {
+        reservedunmarshal_VkOffset3D(vkStream, rootType,
+                                     (VkOffset3D*)(forUnmarshaling->dstOffsets + i), ptr);
     }
 }
 
-void reservedunmarshal_VkImageCopy(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageCopy* forUnmarshaling,
-    uint8_t** ptr)
-{
-    reservedunmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->srcSubresource), ptr);
-    reservedunmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->srcOffset), ptr);
-    reservedunmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->dstSubresource), ptr);
-    reservedunmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->dstOffset), ptr);
+void reservedunmarshal_VkImageCopy(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkImageCopy* forUnmarshaling, uint8_t** ptr) {
+    reservedunmarshal_VkImageSubresourceLayers(
+        vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->srcSubresource), ptr);
+    reservedunmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->srcOffset),
+                                 ptr);
+    reservedunmarshal_VkImageSubresourceLayers(
+        vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->dstSubresource), ptr);
+    reservedunmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->dstOffset),
+                                 ptr);
     reservedunmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forUnmarshaling->extent), ptr);
 }
 
-void reservedunmarshal_VkImageResolve(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageResolve* forUnmarshaling,
-    uint8_t** ptr)
-{
-    reservedunmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->srcSubresource), ptr);
-    reservedunmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->srcOffset), ptr);
-    reservedunmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->dstSubresource), ptr);
-    reservedunmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->dstOffset), ptr);
+void reservedunmarshal_VkImageResolve(VulkanStream* vkStream, VkStructureType rootType,
+                                      VkImageResolve* forUnmarshaling, uint8_t** ptr) {
+    reservedunmarshal_VkImageSubresourceLayers(
+        vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->srcSubresource), ptr);
+    reservedunmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->srcOffset),
+                                 ptr);
+    reservedunmarshal_VkImageSubresourceLayers(
+        vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->dstSubresource), ptr);
+    reservedunmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->dstOffset),
+                                 ptr);
     reservedunmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forUnmarshaling->extent), ptr);
 }
 
-void reservedunmarshal_VkRenderPassBeginInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderPassBeginInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkRenderPassBeginInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkRenderPassBeginInfo* forUnmarshaling,
+                                             uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -3781,24 +3649,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkRenderPass*)&forUnmarshaling->renderPass = (VkRenderPass)unbox_VkRenderPass((VkRenderPass)(*&cgen_var_0));
+    *(VkRenderPass*)&forUnmarshaling->renderPass =
+        (VkRenderPass)unbox_VkRenderPass((VkRenderPass)(*&cgen_var_0));
     uint64_t cgen_var_1;
     memcpy((uint64_t*)&cgen_var_1, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkFramebuffer*)&forUnmarshaling->framebuffer = (VkFramebuffer)unbox_VkFramebuffer((VkFramebuffer)(*&cgen_var_1));
+    *(VkFramebuffer*)&forUnmarshaling->framebuffer =
+        (VkFramebuffer)unbox_VkFramebuffer((VkFramebuffer)(*&cgen_var_1));
     reservedunmarshal_VkRect2D(vkStream, rootType, (VkRect2D*)(&forUnmarshaling->renderArea), ptr);
     memcpy((uint32_t*)&forUnmarshaling->clearValueCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -3806,12 +3678,12 @@
     memcpy((VkClearValue**)&forUnmarshaling->pClearValues, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pClearValues);
     *ptr += 8;
-    if (forUnmarshaling->pClearValues)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pClearValues, forUnmarshaling->clearValueCount * sizeof(const VkClearValue));
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->clearValueCount; ++i)
-        {
-            reservedunmarshal_VkClearValue(vkStream, rootType, (VkClearValue*)(forUnmarshaling->pClearValues + i), ptr);
+    if (forUnmarshaling->pClearValues) {
+        vkStream->alloc((void**)&forUnmarshaling->pClearValues,
+                        forUnmarshaling->clearValueCount * sizeof(const VkClearValue));
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->clearValueCount; ++i) {
+            reservedunmarshal_VkClearValue(vkStream, rootType,
+                                           (VkClearValue*)(forUnmarshaling->pClearValues + i), ptr);
         }
     }
 }
@@ -3819,15 +3691,11 @@
 #endif
 #ifdef VK_VERSION_1_1
 void reservedunmarshal_VkPhysicalDeviceSubgroupProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSubgroupProperties* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceSubgroupProperties* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -3835,36 +3703,36 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->subgroupSize, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((VkShaderStageFlags*)&forUnmarshaling->supportedStages, *ptr, sizeof(VkShaderStageFlags));
+    memcpy((VkShaderStageFlags*)&forUnmarshaling->supportedStages, *ptr,
+           sizeof(VkShaderStageFlags));
     *ptr += sizeof(VkShaderStageFlags);
-    memcpy((VkSubgroupFeatureFlags*)&forUnmarshaling->supportedOperations, *ptr, sizeof(VkSubgroupFeatureFlags));
+    memcpy((VkSubgroupFeatureFlags*)&forUnmarshaling->supportedOperations, *ptr,
+           sizeof(VkSubgroupFeatureFlags));
     *ptr += sizeof(VkSubgroupFeatureFlags);
     memcpy((VkBool32*)&forUnmarshaling->quadOperationsInAllStages, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
-void reservedunmarshal_VkBindBufferMemoryInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindBufferMemoryInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkBindBufferMemoryInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkBindBufferMemoryInfo* forUnmarshaling,
+                                              uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -3872,15 +3740,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
@@ -3889,21 +3759,18 @@
     uint64_t cgen_var_1;
     memcpy((uint64_t*)&cgen_var_1, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkDeviceMemory*)&forUnmarshaling->memory = (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_1));
+    *(VkDeviceMemory*)&forUnmarshaling->memory =
+        (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_1));
     memcpy((VkDeviceSize*)&forUnmarshaling->memoryOffset, *ptr, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
 }
 
-void reservedunmarshal_VkBindImageMemoryInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindImageMemoryInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkBindImageMemoryInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkBindImageMemoryInfo* forUnmarshaling,
+                                             uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -3911,15 +3778,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
@@ -3928,21 +3797,18 @@
     uint64_t cgen_var_1;
     memcpy((uint64_t*)&cgen_var_1, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkDeviceMemory*)&forUnmarshaling->memory = (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_1));
+    *(VkDeviceMemory*)&forUnmarshaling->memory =
+        (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_1));
     memcpy((VkDeviceSize*)&forUnmarshaling->memoryOffset, *ptr, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
 }
 
 void reservedunmarshal_VkPhysicalDevice16BitStorageFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevice16BitStorageFeatures* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevice16BitStorageFeatures* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -3950,15 +3816,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->storageBuffer16BitAccess, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -3970,16 +3838,13 @@
     *ptr += sizeof(VkBool32);
 }
 
-void reservedunmarshal_VkMemoryDedicatedRequirements(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryDedicatedRequirements* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkMemoryDedicatedRequirements(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkMemoryDedicatedRequirements* forUnmarshaling,
+                                                     uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -3987,15 +3852,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->prefersDedicatedAllocation, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -4003,16 +3870,13 @@
     *ptr += sizeof(VkBool32);
 }
 
-void reservedunmarshal_VkMemoryDedicatedAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryDedicatedAllocateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkMemoryDedicatedAllocateInfo(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkMemoryDedicatedAllocateInfo* forUnmarshaling,
+                                                     uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -4020,15 +3884,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
@@ -4040,16 +3906,12 @@
     *(VkBuffer*)&forUnmarshaling->buffer = (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_1));
 }
 
-void reservedunmarshal_VkMemoryAllocateFlagsInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryAllocateFlagsInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkMemoryAllocateFlagsInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkMemoryAllocateFlagsInfo* forUnmarshaling,
+                                                 uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -4057,15 +3919,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkMemoryAllocateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkMemoryAllocateFlags));
     *ptr += sizeof(VkMemoryAllocateFlags);
@@ -4074,15 +3938,11 @@
 }
 
 void reservedunmarshal_VkDeviceGroupRenderPassBeginInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceGroupRenderPassBeginInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDeviceGroupRenderPassBeginInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -4090,37 +3950,36 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->deviceMask, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->deviceRenderAreaCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pDeviceRenderAreas, forUnmarshaling->deviceRenderAreaCount * sizeof(const VkRect2D));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->deviceRenderAreaCount; ++i)
-    {
-        reservedunmarshal_VkRect2D(vkStream, rootType, (VkRect2D*)(forUnmarshaling->pDeviceRenderAreas + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pDeviceRenderAreas,
+                    forUnmarshaling->deviceRenderAreaCount * sizeof(const VkRect2D));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->deviceRenderAreaCount; ++i) {
+        reservedunmarshal_VkRect2D(vkStream, rootType,
+                                   (VkRect2D*)(forUnmarshaling->pDeviceRenderAreas + i), ptr);
     }
 }
 
 void reservedunmarshal_VkDeviceGroupCommandBufferBeginInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceGroupCommandBufferBeginInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDeviceGroupCommandBufferBeginInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -4128,30 +3987,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->deviceMask, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkDeviceGroupSubmitInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceGroupSubmitInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDeviceGroupSubmitInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkDeviceGroupSubmitInfo* forUnmarshaling,
+                                               uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -4159,43 +4016,47 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->waitSemaphoreCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pWaitSemaphoreDeviceIndices, forUnmarshaling->waitSemaphoreCount * sizeof(const uint32_t));
-    memcpy((uint32_t*)forUnmarshaling->pWaitSemaphoreDeviceIndices, *ptr, forUnmarshaling->waitSemaphoreCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pWaitSemaphoreDeviceIndices,
+                    forUnmarshaling->waitSemaphoreCount * sizeof(const uint32_t));
+    memcpy((uint32_t*)forUnmarshaling->pWaitSemaphoreDeviceIndices, *ptr,
+           forUnmarshaling->waitSemaphoreCount * sizeof(const uint32_t));
     *ptr += forUnmarshaling->waitSemaphoreCount * sizeof(const uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->commandBufferCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pCommandBufferDeviceMasks, forUnmarshaling->commandBufferCount * sizeof(const uint32_t));
-    memcpy((uint32_t*)forUnmarshaling->pCommandBufferDeviceMasks, *ptr, forUnmarshaling->commandBufferCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pCommandBufferDeviceMasks,
+                    forUnmarshaling->commandBufferCount * sizeof(const uint32_t));
+    memcpy((uint32_t*)forUnmarshaling->pCommandBufferDeviceMasks, *ptr,
+           forUnmarshaling->commandBufferCount * sizeof(const uint32_t));
     *ptr += forUnmarshaling->commandBufferCount * sizeof(const uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->signalSemaphoreCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pSignalSemaphoreDeviceIndices, forUnmarshaling->signalSemaphoreCount * sizeof(const uint32_t));
-    memcpy((uint32_t*)forUnmarshaling->pSignalSemaphoreDeviceIndices, *ptr, forUnmarshaling->signalSemaphoreCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pSignalSemaphoreDeviceIndices,
+                    forUnmarshaling->signalSemaphoreCount * sizeof(const uint32_t));
+    memcpy((uint32_t*)forUnmarshaling->pSignalSemaphoreDeviceIndices, *ptr,
+           forUnmarshaling->signalSemaphoreCount * sizeof(const uint32_t));
     *ptr += forUnmarshaling->signalSemaphoreCount * sizeof(const uint32_t);
 }
 
-void reservedunmarshal_VkDeviceGroupBindSparseInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceGroupBindSparseInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDeviceGroupBindSparseInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkDeviceGroupBindSparseInfo* forUnmarshaling,
+                                                   uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -4203,15 +4064,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->resourceDeviceIndex, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -4220,15 +4083,11 @@
 }
 
 void reservedunmarshal_VkBindBufferMemoryDeviceGroupInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindBufferMemoryDeviceGroupInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBindBufferMemoryDeviceGroupInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -4236,33 +4095,33 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->deviceIndexCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pDeviceIndices, forUnmarshaling->deviceIndexCount * sizeof(const uint32_t));
-    memcpy((uint32_t*)forUnmarshaling->pDeviceIndices, *ptr, forUnmarshaling->deviceIndexCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pDeviceIndices,
+                    forUnmarshaling->deviceIndexCount * sizeof(const uint32_t));
+    memcpy((uint32_t*)forUnmarshaling->pDeviceIndices, *ptr,
+           forUnmarshaling->deviceIndexCount * sizeof(const uint32_t));
     *ptr += forUnmarshaling->deviceIndexCount * sizeof(const uint32_t);
 }
 
 void reservedunmarshal_VkBindImageMemoryDeviceGroupInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindImageMemoryDeviceGroupInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBindImageMemoryDeviceGroupInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -4270,40 +4129,41 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->deviceIndexCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pDeviceIndices, forUnmarshaling->deviceIndexCount * sizeof(const uint32_t));
-    memcpy((uint32_t*)forUnmarshaling->pDeviceIndices, *ptr, forUnmarshaling->deviceIndexCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pDeviceIndices,
+                    forUnmarshaling->deviceIndexCount * sizeof(const uint32_t));
+    memcpy((uint32_t*)forUnmarshaling->pDeviceIndices, *ptr,
+           forUnmarshaling->deviceIndexCount * sizeof(const uint32_t));
     *ptr += forUnmarshaling->deviceIndexCount * sizeof(const uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->splitInstanceBindRegionCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pSplitInstanceBindRegions, forUnmarshaling->splitInstanceBindRegionCount * sizeof(const VkRect2D));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->splitInstanceBindRegionCount; ++i)
-    {
-        reservedunmarshal_VkRect2D(vkStream, rootType, (VkRect2D*)(forUnmarshaling->pSplitInstanceBindRegions + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pSplitInstanceBindRegions,
+                    forUnmarshaling->splitInstanceBindRegionCount * sizeof(const VkRect2D));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->splitInstanceBindRegionCount; ++i) {
+        reservedunmarshal_VkRect2D(
+            vkStream, rootType, (VkRect2D*)(forUnmarshaling->pSplitInstanceBindRegions + i), ptr);
     }
 }
 
 void reservedunmarshal_VkPhysicalDeviceGroupProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceGroupProperties* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceGroupProperties* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -4311,34 +4171,34 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->physicalDeviceCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((VkPhysicalDevice*)forUnmarshaling->physicalDevices, *ptr, VK_MAX_DEVICE_GROUP_SIZE * sizeof(VkPhysicalDevice));
+    memcpy((VkPhysicalDevice*)forUnmarshaling->physicalDevices, *ptr,
+           VK_MAX_DEVICE_GROUP_SIZE * sizeof(VkPhysicalDevice));
     *ptr += VK_MAX_DEVICE_GROUP_SIZE * sizeof(VkPhysicalDevice);
     memcpy((VkBool32*)&forUnmarshaling->subsetAllocation, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
-void reservedunmarshal_VkDeviceGroupDeviceCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceGroupDeviceCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDeviceGroupDeviceCreateInfo(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkDeviceGroupDeviceCreateInfo* forUnmarshaling,
+                                                     uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -4346,44 +4206,42 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->physicalDeviceCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pPhysicalDevices, forUnmarshaling->physicalDeviceCount * sizeof(const VkPhysicalDevice));
-    if (forUnmarshaling->physicalDeviceCount)
-    {
+    vkStream->alloc((void**)&forUnmarshaling->pPhysicalDevices,
+                    forUnmarshaling->physicalDeviceCount * sizeof(const VkPhysicalDevice));
+    if (forUnmarshaling->physicalDeviceCount) {
         uint8_t* cgen_var_0_ptr = (uint8_t*)(*ptr);
         *ptr += 8 * forUnmarshaling->physicalDeviceCount;
-        if (forUnmarshaling)
-        {
-            for (uint32_t k = 0; k < forUnmarshaling->physicalDeviceCount; ++k)
-            {
-                uint64_t tmpval; memcpy(&tmpval, cgen_var_0_ptr + k * 8, sizeof(uint64_t));
-                *(((VkPhysicalDevice*)forUnmarshaling->pPhysicalDevices) + k) = (VkPhysicalDevice)unbox_VkPhysicalDevice((VkPhysicalDevice)tmpval);
+        if (forUnmarshaling) {
+            for (uint32_t k = 0; k < forUnmarshaling->physicalDeviceCount; ++k) {
+                uint64_t tmpval;
+                memcpy(&tmpval, cgen_var_0_ptr + k * 8, sizeof(uint64_t));
+                *(((VkPhysicalDevice*)forUnmarshaling->pPhysicalDevices) + k) =
+                    (VkPhysicalDevice)unbox_VkPhysicalDevice((VkPhysicalDevice)tmpval);
             }
         }
     }
 }
 
 void reservedunmarshal_VkBufferMemoryRequirementsInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferMemoryRequirementsInfo2* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBufferMemoryRequirementsInfo2* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -4391,15 +4249,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
@@ -4408,15 +4268,11 @@
 }
 
 void reservedunmarshal_VkImageMemoryRequirementsInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageMemoryRequirementsInfo2* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImageMemoryRequirementsInfo2* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -4424,15 +4280,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
@@ -4441,15 +4299,11 @@
 }
 
 void reservedunmarshal_VkImageSparseMemoryRequirementsInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageSparseMemoryRequirementsInfo2* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImageSparseMemoryRequirementsInfo2* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -4457,15 +4311,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
@@ -4473,16 +4329,12 @@
     *(VkImage*)&forUnmarshaling->image = (VkImage)unbox_VkImage((VkImage)(*&cgen_var_0));
 }
 
-void reservedunmarshal_VkMemoryRequirements2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryRequirements2* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkMemoryRequirements2(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkMemoryRequirements2* forUnmarshaling,
+                                             uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -4490,29 +4342,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    reservedunmarshal_VkMemoryRequirements(vkStream, rootType, (VkMemoryRequirements*)(&forUnmarshaling->memoryRequirements), ptr);
+    reservedunmarshal_VkMemoryRequirements(
+        vkStream, rootType, (VkMemoryRequirements*)(&forUnmarshaling->memoryRequirements), ptr);
 }
 
 void reservedunmarshal_VkSparseImageMemoryRequirements2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSparseImageMemoryRequirements2* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSparseImageMemoryRequirements2* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -4520,29 +4371,29 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    reservedunmarshal_VkSparseImageMemoryRequirements(vkStream, rootType, (VkSparseImageMemoryRequirements*)(&forUnmarshaling->memoryRequirements), ptr);
+    reservedunmarshal_VkSparseImageMemoryRequirements(
+        vkStream, rootType,
+        (VkSparseImageMemoryRequirements*)(&forUnmarshaling->memoryRequirements), ptr);
 }
 
-void reservedunmarshal_VkPhysicalDeviceFeatures2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFeatures2* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkPhysicalDeviceFeatures2(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkPhysicalDeviceFeatures2* forUnmarshaling,
+                                                 uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -4550,29 +4401,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    reservedunmarshal_VkPhysicalDeviceFeatures(vkStream, rootType, (VkPhysicalDeviceFeatures*)(&forUnmarshaling->features), ptr);
+    reservedunmarshal_VkPhysicalDeviceFeatures(
+        vkStream, rootType, (VkPhysicalDeviceFeatures*)(&forUnmarshaling->features), ptr);
 }
 
-void reservedunmarshal_VkPhysicalDeviceProperties2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceProperties2* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkPhysicalDeviceProperties2(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkPhysicalDeviceProperties2* forUnmarshaling,
+                                                   uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -4580,29 +4430,27 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    reservedunmarshal_VkPhysicalDeviceProperties(vkStream, rootType, (VkPhysicalDeviceProperties*)(&forUnmarshaling->properties), ptr);
+    reservedunmarshal_VkPhysicalDeviceProperties(
+        vkStream, rootType, (VkPhysicalDeviceProperties*)(&forUnmarshaling->properties), ptr);
 }
 
-void reservedunmarshal_VkFormatProperties2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFormatProperties2* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkFormatProperties2(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkFormatProperties2* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -4610,29 +4458,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    reservedunmarshal_VkFormatProperties(vkStream, rootType, (VkFormatProperties*)(&forUnmarshaling->formatProperties), ptr);
+    reservedunmarshal_VkFormatProperties(
+        vkStream, rootType, (VkFormatProperties*)(&forUnmarshaling->formatProperties), ptr);
 }
 
-void reservedunmarshal_VkImageFormatProperties2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageFormatProperties2* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkImageFormatProperties2(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkImageFormatProperties2* forUnmarshaling,
+                                                uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -4640,29 +4487,29 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    reservedunmarshal_VkImageFormatProperties(vkStream, rootType, (VkImageFormatProperties*)(&forUnmarshaling->imageFormatProperties), ptr);
+    reservedunmarshal_VkImageFormatProperties(
+        vkStream, rootType, (VkImageFormatProperties*)(&forUnmarshaling->imageFormatProperties),
+        ptr);
 }
 
 void reservedunmarshal_VkPhysicalDeviceImageFormatInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceImageFormatInfo2* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceImageFormatInfo2* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -4670,15 +4517,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkFormat*)&forUnmarshaling->format, *ptr, sizeof(VkFormat));
     *ptr += sizeof(VkFormat);
@@ -4692,16 +4541,12 @@
     *ptr += sizeof(VkImageCreateFlags);
 }
 
-void reservedunmarshal_VkQueueFamilyProperties2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkQueueFamilyProperties2* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkQueueFamilyProperties2(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkQueueFamilyProperties2* forUnmarshaling,
+                                                uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -4709,29 +4554,29 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    reservedunmarshal_VkQueueFamilyProperties(vkStream, rootType, (VkQueueFamilyProperties*)(&forUnmarshaling->queueFamilyProperties), ptr);
+    reservedunmarshal_VkQueueFamilyProperties(
+        vkStream, rootType, (VkQueueFamilyProperties*)(&forUnmarshaling->queueFamilyProperties),
+        ptr);
 }
 
 void reservedunmarshal_VkPhysicalDeviceMemoryProperties2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMemoryProperties2* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMemoryProperties2* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -4739,29 +4584,29 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    reservedunmarshal_VkPhysicalDeviceMemoryProperties(vkStream, rootType, (VkPhysicalDeviceMemoryProperties*)(&forUnmarshaling->memoryProperties), ptr);
+    reservedunmarshal_VkPhysicalDeviceMemoryProperties(
+        vkStream, rootType, (VkPhysicalDeviceMemoryProperties*)(&forUnmarshaling->memoryProperties),
+        ptr);
 }
 
 void reservedunmarshal_VkSparseImageFormatProperties2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSparseImageFormatProperties2* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSparseImageFormatProperties2* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -4769,29 +4614,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    reservedunmarshal_VkSparseImageFormatProperties(vkStream, rootType, (VkSparseImageFormatProperties*)(&forUnmarshaling->properties), ptr);
+    reservedunmarshal_VkSparseImageFormatProperties(
+        vkStream, rootType, (VkSparseImageFormatProperties*)(&forUnmarshaling->properties), ptr);
 }
 
 void reservedunmarshal_VkPhysicalDeviceSparseImageFormatInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSparseImageFormatInfo2* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceSparseImageFormatInfo2* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -4799,15 +4643,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkFormat*)&forUnmarshaling->format, *ptr, sizeof(VkFormat));
     *ptr += sizeof(VkFormat);
@@ -4822,15 +4668,11 @@
 }
 
 void reservedunmarshal_VkPhysicalDevicePointClippingProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePointClippingProperties* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePointClippingProperties* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -4838,26 +4680,26 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkPointClippingBehavior*)&forUnmarshaling->pointClippingBehavior, *ptr, sizeof(VkPointClippingBehavior));
+    memcpy((VkPointClippingBehavior*)&forUnmarshaling->pointClippingBehavior, *ptr,
+           sizeof(VkPointClippingBehavior));
     *ptr += sizeof(VkPointClippingBehavior);
 }
 
 void reservedunmarshal_VkInputAttachmentAspectReference(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkInputAttachmentAspectReference* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkInputAttachmentAspectReference* forUnmarshaling, uint8_t** ptr) {
     memcpy((uint32_t*)&forUnmarshaling->subpass, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->inputAttachmentIndex, *ptr, sizeof(uint32_t));
@@ -4867,15 +4709,11 @@
 }
 
 void reservedunmarshal_VkRenderPassInputAttachmentAspectCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderPassInputAttachmentAspectCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkRenderPassInputAttachmentAspectCreateInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -4883,35 +4721,36 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->aspectReferenceCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pAspectReferences, forUnmarshaling->aspectReferenceCount * sizeof(const VkInputAttachmentAspectReference));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->aspectReferenceCount; ++i)
-    {
-        reservedunmarshal_VkInputAttachmentAspectReference(vkStream, rootType, (VkInputAttachmentAspectReference*)(forUnmarshaling->pAspectReferences + i), ptr);
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pAspectReferences,
+        forUnmarshaling->aspectReferenceCount * sizeof(const VkInputAttachmentAspectReference));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->aspectReferenceCount; ++i) {
+        reservedunmarshal_VkInputAttachmentAspectReference(
+            vkStream, rootType,
+            (VkInputAttachmentAspectReference*)(forUnmarshaling->pAspectReferences + i), ptr);
     }
 }
 
-void reservedunmarshal_VkImageViewUsageCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageViewUsageCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkImageViewUsageCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                  VkImageViewUsageCreateInfo* forUnmarshaling,
+                                                  uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -4919,30 +4758,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkImageUsageFlags*)&forUnmarshaling->usage, *ptr, sizeof(VkImageUsageFlags));
     *ptr += sizeof(VkImageUsageFlags);
 }
 
 void reservedunmarshal_VkPipelineTessellationDomainOriginStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineTessellationDomainOriginStateCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineTessellationDomainOriginStateCreateInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -4950,30 +4787,29 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkTessellationDomainOrigin*)&forUnmarshaling->domainOrigin, *ptr, sizeof(VkTessellationDomainOrigin));
+    memcpy((VkTessellationDomainOrigin*)&forUnmarshaling->domainOrigin, *ptr,
+           sizeof(VkTessellationDomainOrigin));
     *ptr += sizeof(VkTessellationDomainOrigin);
 }
 
 void reservedunmarshal_VkRenderPassMultiviewCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderPassMultiviewCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkRenderPassMultiviewCreateInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -4981,43 +4817,47 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->subpassCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pViewMasks, forUnmarshaling->subpassCount * sizeof(const uint32_t));
-    memcpy((uint32_t*)forUnmarshaling->pViewMasks, *ptr, forUnmarshaling->subpassCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pViewMasks,
+                    forUnmarshaling->subpassCount * sizeof(const uint32_t));
+    memcpy((uint32_t*)forUnmarshaling->pViewMasks, *ptr,
+           forUnmarshaling->subpassCount * sizeof(const uint32_t));
     *ptr += forUnmarshaling->subpassCount * sizeof(const uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->dependencyCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pViewOffsets, forUnmarshaling->dependencyCount * sizeof(const int32_t));
-    memcpy((int32_t*)forUnmarshaling->pViewOffsets, *ptr, forUnmarshaling->dependencyCount * sizeof(const int32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pViewOffsets,
+                    forUnmarshaling->dependencyCount * sizeof(const int32_t));
+    memcpy((int32_t*)forUnmarshaling->pViewOffsets, *ptr,
+           forUnmarshaling->dependencyCount * sizeof(const int32_t));
     *ptr += forUnmarshaling->dependencyCount * sizeof(const int32_t);
     memcpy((uint32_t*)&forUnmarshaling->correlationMaskCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pCorrelationMasks, forUnmarshaling->correlationMaskCount * sizeof(const uint32_t));
-    memcpy((uint32_t*)forUnmarshaling->pCorrelationMasks, *ptr, forUnmarshaling->correlationMaskCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pCorrelationMasks,
+                    forUnmarshaling->correlationMaskCount * sizeof(const uint32_t));
+    memcpy((uint32_t*)forUnmarshaling->pCorrelationMasks, *ptr,
+           forUnmarshaling->correlationMaskCount * sizeof(const uint32_t));
     *ptr += forUnmarshaling->correlationMaskCount * sizeof(const uint32_t);
 }
 
 void reservedunmarshal_VkPhysicalDeviceMultiviewFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMultiviewFeatures* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMultiviewFeatures* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -5025,15 +4865,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->multiview, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -5044,15 +4886,11 @@
 }
 
 void reservedunmarshal_VkPhysicalDeviceMultiviewProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMultiviewProperties* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMultiviewProperties* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -5060,15 +4898,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->maxMultiviewViewCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -5077,15 +4917,11 @@
 }
 
 void reservedunmarshal_VkPhysicalDeviceVariablePointersFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceVariablePointersFeatures* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceVariablePointersFeatures* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -5093,15 +4929,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->variablePointersStorageBuffer, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -5110,15 +4948,11 @@
 }
 
 void reservedunmarshal_VkPhysicalDeviceProtectedMemoryFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceProtectedMemoryFeatures* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceProtectedMemoryFeatures* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -5126,30 +4960,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->protectedMemory, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkPhysicalDeviceProtectedMemoryProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceProtectedMemoryProperties* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceProtectedMemoryProperties* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -5157,30 +4989,27 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->protectedNoFault, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
-void reservedunmarshal_VkDeviceQueueInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceQueueInfo2* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDeviceQueueInfo2(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkDeviceQueueInfo2* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -5188,17 +5017,20 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkDeviceQueueCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkDeviceQueueCreateFlags));
+    memcpy((VkDeviceQueueCreateFlags*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkDeviceQueueCreateFlags));
     *ptr += sizeof(VkDeviceQueueCreateFlags);
     memcpy((uint32_t*)&forUnmarshaling->queueFamilyIndex, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -5206,16 +5038,12 @@
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkProtectedSubmitInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkProtectedSubmitInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkProtectedSubmitInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkProtectedSubmitInfo* forUnmarshaling,
+                                             uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -5223,30 +5051,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->protectedSubmit, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkSamplerYcbcrConversionCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSamplerYcbcrConversionCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSamplerYcbcrConversionCreateInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -5254,23 +5080,27 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkFormat*)&forUnmarshaling->format, *ptr, sizeof(VkFormat));
     *ptr += sizeof(VkFormat);
-    memcpy((VkSamplerYcbcrModelConversion*)&forUnmarshaling->ycbcrModel, *ptr, sizeof(VkSamplerYcbcrModelConversion));
+    memcpy((VkSamplerYcbcrModelConversion*)&forUnmarshaling->ycbcrModel, *ptr,
+           sizeof(VkSamplerYcbcrModelConversion));
     *ptr += sizeof(VkSamplerYcbcrModelConversion);
     memcpy((VkSamplerYcbcrRange*)&forUnmarshaling->ycbcrRange, *ptr, sizeof(VkSamplerYcbcrRange));
     *ptr += sizeof(VkSamplerYcbcrRange);
-    reservedunmarshal_VkComponentMapping(vkStream, rootType, (VkComponentMapping*)(&forUnmarshaling->components), ptr);
+    reservedunmarshal_VkComponentMapping(vkStream, rootType,
+                                         (VkComponentMapping*)(&forUnmarshaling->components), ptr);
     memcpy((VkChromaLocation*)&forUnmarshaling->xChromaOffset, *ptr, sizeof(VkChromaLocation));
     *ptr += sizeof(VkChromaLocation);
     memcpy((VkChromaLocation*)&forUnmarshaling->yChromaOffset, *ptr, sizeof(VkChromaLocation));
@@ -5281,16 +5111,13 @@
     *ptr += sizeof(VkBool32);
 }
 
-void reservedunmarshal_VkSamplerYcbcrConversionInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSamplerYcbcrConversionInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkSamplerYcbcrConversionInfo(VulkanStream* vkStream,
+                                                    VkStructureType rootType,
+                                                    VkSamplerYcbcrConversionInfo* forUnmarshaling,
+                                                    uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -5298,32 +5125,32 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkSamplerYcbcrConversion*)&forUnmarshaling->conversion = (VkSamplerYcbcrConversion)unbox_VkSamplerYcbcrConversion((VkSamplerYcbcrConversion)(*&cgen_var_0));
+    *(VkSamplerYcbcrConversion*)&forUnmarshaling->conversion =
+        (VkSamplerYcbcrConversion)unbox_VkSamplerYcbcrConversion(
+            (VkSamplerYcbcrConversion)(*&cgen_var_0));
 }
 
-void reservedunmarshal_VkBindImagePlaneMemoryInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindImagePlaneMemoryInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkBindImagePlaneMemoryInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                  VkBindImagePlaneMemoryInfo* forUnmarshaling,
+                                                  uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -5331,30 +5158,29 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkImageAspectFlagBits*)&forUnmarshaling->planeAspect, *ptr, sizeof(VkImageAspectFlagBits));
+    memcpy((VkImageAspectFlagBits*)&forUnmarshaling->planeAspect, *ptr,
+           sizeof(VkImageAspectFlagBits));
     *ptr += sizeof(VkImageAspectFlagBits);
 }
 
 void reservedunmarshal_VkImagePlaneMemoryRequirementsInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImagePlaneMemoryRequirementsInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImagePlaneMemoryRequirementsInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -5362,30 +5188,29 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkImageAspectFlagBits*)&forUnmarshaling->planeAspect, *ptr, sizeof(VkImageAspectFlagBits));
+    memcpy((VkImageAspectFlagBits*)&forUnmarshaling->planeAspect, *ptr,
+           sizeof(VkImageAspectFlagBits));
     *ptr += sizeof(VkImageAspectFlagBits);
 }
 
 void reservedunmarshal_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSamplerYcbcrConversionFeatures* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceSamplerYcbcrConversionFeatures* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -5393,30 +5218,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->samplerYcbcrConversion, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkSamplerYcbcrConversionImageFormatProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSamplerYcbcrConversionImageFormatProperties* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSamplerYcbcrConversionImageFormatProperties* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -5424,26 +5247,26 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((uint32_t*)&forUnmarshaling->combinedImageSamplerDescriptorCount, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->combinedImageSamplerDescriptorCount, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
 void reservedunmarshal_VkDescriptorUpdateTemplateEntry(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorUpdateTemplateEntry* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDescriptorUpdateTemplateEntry* forUnmarshaling, uint8_t** ptr) {
     memcpy((uint32_t*)&forUnmarshaling->dstBinding, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->dstArrayElement, *ptr, sizeof(uint32_t));
@@ -5461,15 +5284,11 @@
 }
 
 void reservedunmarshal_VkDescriptorUpdateTemplateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorUpdateTemplateCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDescriptorUpdateTemplateCreateInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -5477,65 +5296,71 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkDescriptorUpdateTemplateCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkDescriptorUpdateTemplateCreateFlags));
+    memcpy((VkDescriptorUpdateTemplateCreateFlags*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkDescriptorUpdateTemplateCreateFlags));
     *ptr += sizeof(VkDescriptorUpdateTemplateCreateFlags);
     memcpy((uint32_t*)&forUnmarshaling->descriptorUpdateEntryCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pDescriptorUpdateEntries, forUnmarshaling->descriptorUpdateEntryCount * sizeof(const VkDescriptorUpdateTemplateEntry));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->descriptorUpdateEntryCount; ++i)
-    {
-        reservedunmarshal_VkDescriptorUpdateTemplateEntry(vkStream, rootType, (VkDescriptorUpdateTemplateEntry*)(forUnmarshaling->pDescriptorUpdateEntries + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pDescriptorUpdateEntries,
+                    forUnmarshaling->descriptorUpdateEntryCount *
+                        sizeof(const VkDescriptorUpdateTemplateEntry));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->descriptorUpdateEntryCount; ++i) {
+        reservedunmarshal_VkDescriptorUpdateTemplateEntry(
+            vkStream, rootType,
+            (VkDescriptorUpdateTemplateEntry*)(forUnmarshaling->pDescriptorUpdateEntries + i), ptr);
     }
-    memcpy((VkDescriptorUpdateTemplateType*)&forUnmarshaling->templateType, *ptr, sizeof(VkDescriptorUpdateTemplateType));
+    memcpy((VkDescriptorUpdateTemplateType*)&forUnmarshaling->templateType, *ptr,
+           sizeof(VkDescriptorUpdateTemplateType));
     *ptr += sizeof(VkDescriptorUpdateTemplateType);
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkDescriptorSetLayout*)&forUnmarshaling->descriptorSetLayout = (VkDescriptorSetLayout)unbox_VkDescriptorSetLayout((VkDescriptorSetLayout)(*&cgen_var_0));
-    memcpy((VkPipelineBindPoint*)&forUnmarshaling->pipelineBindPoint, *ptr, sizeof(VkPipelineBindPoint));
+    *(VkDescriptorSetLayout*)&forUnmarshaling->descriptorSetLayout =
+        (VkDescriptorSetLayout)unbox_VkDescriptorSetLayout((VkDescriptorSetLayout)(*&cgen_var_0));
+    memcpy((VkPipelineBindPoint*)&forUnmarshaling->pipelineBindPoint, *ptr,
+           sizeof(VkPipelineBindPoint));
     *ptr += sizeof(VkPipelineBindPoint);
     uint64_t cgen_var_1;
     memcpy((uint64_t*)&cgen_var_1, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkPipelineLayout*)&forUnmarshaling->pipelineLayout = (VkPipelineLayout)unbox_VkPipelineLayout((VkPipelineLayout)(*&cgen_var_1));
+    *(VkPipelineLayout*)&forUnmarshaling->pipelineLayout =
+        (VkPipelineLayout)unbox_VkPipelineLayout((VkPipelineLayout)(*&cgen_var_1));
     memcpy((uint32_t*)&forUnmarshaling->set, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkExternalMemoryProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalMemoryProperties* forUnmarshaling,
-    uint8_t** ptr)
-{
-    memcpy((VkExternalMemoryFeatureFlags*)&forUnmarshaling->externalMemoryFeatures, *ptr, sizeof(VkExternalMemoryFeatureFlags));
+void reservedunmarshal_VkExternalMemoryProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                                  VkExternalMemoryProperties* forUnmarshaling,
+                                                  uint8_t** ptr) {
+    memcpy((VkExternalMemoryFeatureFlags*)&forUnmarshaling->externalMemoryFeatures, *ptr,
+           sizeof(VkExternalMemoryFeatureFlags));
     *ptr += sizeof(VkExternalMemoryFeatureFlags);
-    memcpy((VkExternalMemoryHandleTypeFlags*)&forUnmarshaling->exportFromImportedHandleTypes, *ptr, sizeof(VkExternalMemoryHandleTypeFlags));
+    memcpy((VkExternalMemoryHandleTypeFlags*)&forUnmarshaling->exportFromImportedHandleTypes, *ptr,
+           sizeof(VkExternalMemoryHandleTypeFlags));
     *ptr += sizeof(VkExternalMemoryHandleTypeFlags);
-    memcpy((VkExternalMemoryHandleTypeFlags*)&forUnmarshaling->compatibleHandleTypes, *ptr, sizeof(VkExternalMemoryHandleTypeFlags));
+    memcpy((VkExternalMemoryHandleTypeFlags*)&forUnmarshaling->compatibleHandleTypes, *ptr,
+           sizeof(VkExternalMemoryHandleTypeFlags));
     *ptr += sizeof(VkExternalMemoryHandleTypeFlags);
 }
 
 void reservedunmarshal_VkPhysicalDeviceExternalImageFormatInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceExternalImageFormatInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceExternalImageFormatInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -5543,30 +5368,29 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    memcpy((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr,
+           sizeof(VkExternalMemoryHandleTypeFlagBits));
     *ptr += sizeof(VkExternalMemoryHandleTypeFlagBits);
 }
 
 void reservedunmarshal_VkExternalImageFormatProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalImageFormatProperties* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkExternalImageFormatProperties* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -5574,29 +5398,29 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    reservedunmarshal_VkExternalMemoryProperties(vkStream, rootType, (VkExternalMemoryProperties*)(&forUnmarshaling->externalMemoryProperties), ptr);
+    reservedunmarshal_VkExternalMemoryProperties(
+        vkStream, rootType,
+        (VkExternalMemoryProperties*)(&forUnmarshaling->externalMemoryProperties), ptr);
 }
 
 void reservedunmarshal_VkPhysicalDeviceExternalBufferInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceExternalBufferInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceExternalBufferInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -5604,34 +5428,33 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBufferCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkBufferCreateFlags));
     *ptr += sizeof(VkBufferCreateFlags);
     memcpy((VkBufferUsageFlags*)&forUnmarshaling->usage, *ptr, sizeof(VkBufferUsageFlags));
     *ptr += sizeof(VkBufferUsageFlags);
-    memcpy((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    memcpy((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr,
+           sizeof(VkExternalMemoryHandleTypeFlagBits));
     *ptr += sizeof(VkExternalMemoryHandleTypeFlagBits);
 }
 
-void reservedunmarshal_VkExternalBufferProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalBufferProperties* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkExternalBufferProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                                  VkExternalBufferProperties* forUnmarshaling,
+                                                  uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -5639,29 +5462,30 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    reservedunmarshal_VkExternalMemoryProperties(vkStream, rootType, (VkExternalMemoryProperties*)(&forUnmarshaling->externalMemoryProperties), ptr);
+    reservedunmarshal_VkExternalMemoryProperties(
+        vkStream, rootType,
+        (VkExternalMemoryProperties*)(&forUnmarshaling->externalMemoryProperties), ptr);
 }
 
-void reservedunmarshal_VkPhysicalDeviceIDProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceIDProperties* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkPhysicalDeviceIDProperties(VulkanStream* vkStream,
+                                                    VkStructureType rootType,
+                                                    VkPhysicalDeviceIDProperties* forUnmarshaling,
+                                                    uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -5669,15 +5493,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint8_t*)forUnmarshaling->deviceUUID, *ptr, VK_UUID_SIZE * sizeof(uint8_t));
     *ptr += VK_UUID_SIZE * sizeof(uint8_t);
@@ -5692,15 +5518,11 @@
 }
 
 void reservedunmarshal_VkExternalMemoryImageCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalMemoryImageCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkExternalMemoryImageCreateInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -5708,30 +5530,29 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkExternalMemoryHandleTypeFlags*)&forUnmarshaling->handleTypes, *ptr, sizeof(VkExternalMemoryHandleTypeFlags));
+    memcpy((VkExternalMemoryHandleTypeFlags*)&forUnmarshaling->handleTypes, *ptr,
+           sizeof(VkExternalMemoryHandleTypeFlags));
     *ptr += sizeof(VkExternalMemoryHandleTypeFlags);
 }
 
 void reservedunmarshal_VkExternalMemoryBufferCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalMemoryBufferCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkExternalMemoryBufferCreateInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -5739,30 +5560,29 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkExternalMemoryHandleTypeFlags*)&forUnmarshaling->handleTypes, *ptr, sizeof(VkExternalMemoryHandleTypeFlags));
+    memcpy((VkExternalMemoryHandleTypeFlags*)&forUnmarshaling->handleTypes, *ptr,
+           sizeof(VkExternalMemoryHandleTypeFlags));
     *ptr += sizeof(VkExternalMemoryHandleTypeFlags);
 }
 
-void reservedunmarshal_VkExportMemoryAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExportMemoryAllocateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkExportMemoryAllocateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                  VkExportMemoryAllocateInfo* forUnmarshaling,
+                                                  uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -5770,30 +5590,29 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkExternalMemoryHandleTypeFlags*)&forUnmarshaling->handleTypes, *ptr, sizeof(VkExternalMemoryHandleTypeFlags));
+    memcpy((VkExternalMemoryHandleTypeFlags*)&forUnmarshaling->handleTypes, *ptr,
+           sizeof(VkExternalMemoryHandleTypeFlags));
     *ptr += sizeof(VkExternalMemoryHandleTypeFlags);
 }
 
 void reservedunmarshal_VkPhysicalDeviceExternalFenceInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceExternalFenceInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceExternalFenceInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -5801,30 +5620,29 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkExternalFenceHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr, sizeof(VkExternalFenceHandleTypeFlagBits));
+    memcpy((VkExternalFenceHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr,
+           sizeof(VkExternalFenceHandleTypeFlagBits));
     *ptr += sizeof(VkExternalFenceHandleTypeFlagBits);
 }
 
-void reservedunmarshal_VkExternalFenceProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalFenceProperties* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkExternalFenceProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkExternalFenceProperties* forUnmarshaling,
+                                                 uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -5832,34 +5650,35 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkExternalFenceHandleTypeFlags*)&forUnmarshaling->exportFromImportedHandleTypes, *ptr, sizeof(VkExternalFenceHandleTypeFlags));
+    memcpy((VkExternalFenceHandleTypeFlags*)&forUnmarshaling->exportFromImportedHandleTypes, *ptr,
+           sizeof(VkExternalFenceHandleTypeFlags));
     *ptr += sizeof(VkExternalFenceHandleTypeFlags);
-    memcpy((VkExternalFenceHandleTypeFlags*)&forUnmarshaling->compatibleHandleTypes, *ptr, sizeof(VkExternalFenceHandleTypeFlags));
+    memcpy((VkExternalFenceHandleTypeFlags*)&forUnmarshaling->compatibleHandleTypes, *ptr,
+           sizeof(VkExternalFenceHandleTypeFlags));
     *ptr += sizeof(VkExternalFenceHandleTypeFlags);
-    memcpy((VkExternalFenceFeatureFlags*)&forUnmarshaling->externalFenceFeatures, *ptr, sizeof(VkExternalFenceFeatureFlags));
+    memcpy((VkExternalFenceFeatureFlags*)&forUnmarshaling->externalFenceFeatures, *ptr,
+           sizeof(VkExternalFenceFeatureFlags));
     *ptr += sizeof(VkExternalFenceFeatureFlags);
 }
 
-void reservedunmarshal_VkExportFenceCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExportFenceCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkExportFenceCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkExportFenceCreateInfo* forUnmarshaling,
+                                               uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -5867,30 +5686,29 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkExternalFenceHandleTypeFlags*)&forUnmarshaling->handleTypes, *ptr, sizeof(VkExternalFenceHandleTypeFlags));
+    memcpy((VkExternalFenceHandleTypeFlags*)&forUnmarshaling->handleTypes, *ptr,
+           sizeof(VkExternalFenceHandleTypeFlags));
     *ptr += sizeof(VkExternalFenceHandleTypeFlags);
 }
 
-void reservedunmarshal_VkExportSemaphoreCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExportSemaphoreCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkExportSemaphoreCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkExportSemaphoreCreateInfo* forUnmarshaling,
+                                                   uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -5898,30 +5716,29 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkExternalSemaphoreHandleTypeFlags*)&forUnmarshaling->handleTypes, *ptr, sizeof(VkExternalSemaphoreHandleTypeFlags));
+    memcpy((VkExternalSemaphoreHandleTypeFlags*)&forUnmarshaling->handleTypes, *ptr,
+           sizeof(VkExternalSemaphoreHandleTypeFlags));
     *ptr += sizeof(VkExternalSemaphoreHandleTypeFlags);
 }
 
 void reservedunmarshal_VkPhysicalDeviceExternalSemaphoreInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceExternalSemaphoreInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceExternalSemaphoreInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -5929,30 +5746,30 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkExternalSemaphoreHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr, sizeof(VkExternalSemaphoreHandleTypeFlagBits));
+    memcpy((VkExternalSemaphoreHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr,
+           sizeof(VkExternalSemaphoreHandleTypeFlagBits));
     *ptr += sizeof(VkExternalSemaphoreHandleTypeFlagBits);
 }
 
-void reservedunmarshal_VkExternalSemaphoreProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalSemaphoreProperties* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkExternalSemaphoreProperties(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkExternalSemaphoreProperties* forUnmarshaling,
+                                                     uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -5960,34 +5777,35 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkExternalSemaphoreHandleTypeFlags*)&forUnmarshaling->exportFromImportedHandleTypes, *ptr, sizeof(VkExternalSemaphoreHandleTypeFlags));
+    memcpy((VkExternalSemaphoreHandleTypeFlags*)&forUnmarshaling->exportFromImportedHandleTypes,
+           *ptr, sizeof(VkExternalSemaphoreHandleTypeFlags));
     *ptr += sizeof(VkExternalSemaphoreHandleTypeFlags);
-    memcpy((VkExternalSemaphoreHandleTypeFlags*)&forUnmarshaling->compatibleHandleTypes, *ptr, sizeof(VkExternalSemaphoreHandleTypeFlags));
+    memcpy((VkExternalSemaphoreHandleTypeFlags*)&forUnmarshaling->compatibleHandleTypes, *ptr,
+           sizeof(VkExternalSemaphoreHandleTypeFlags));
     *ptr += sizeof(VkExternalSemaphoreHandleTypeFlags);
-    memcpy((VkExternalSemaphoreFeatureFlags*)&forUnmarshaling->externalSemaphoreFeatures, *ptr, sizeof(VkExternalSemaphoreFeatureFlags));
+    memcpy((VkExternalSemaphoreFeatureFlags*)&forUnmarshaling->externalSemaphoreFeatures, *ptr,
+           sizeof(VkExternalSemaphoreFeatureFlags));
     *ptr += sizeof(VkExternalSemaphoreFeatureFlags);
 }
 
 void reservedunmarshal_VkPhysicalDeviceMaintenance3Properties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMaintenance3Properties* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMaintenance3Properties* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -5995,15 +5813,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->maxPerSetDescriptors, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -6011,16 +5831,13 @@
     *ptr += sizeof(VkDeviceSize);
 }
 
-void reservedunmarshal_VkDescriptorSetLayoutSupport(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorSetLayoutSupport* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDescriptorSetLayoutSupport(VulkanStream* vkStream,
+                                                    VkStructureType rootType,
+                                                    VkDescriptorSetLayoutSupport* forUnmarshaling,
+                                                    uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -6028,30 +5845,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->supported, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkPhysicalDeviceShaderDrawParametersFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderDrawParametersFeatures* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderDrawParametersFeatures* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -6059,15 +5874,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->shaderDrawParameters, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -6076,15 +5893,11 @@
 #endif
 #ifdef VK_VERSION_1_2
 void reservedunmarshal_VkPhysicalDeviceVulkan11Features(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceVulkan11Features* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceVulkan11Features* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -6092,15 +5905,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->storageBuffer16BitAccess, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -6129,15 +5944,11 @@
 }
 
 void reservedunmarshal_VkPhysicalDeviceVulkan11Properties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceVulkan11Properties* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceVulkan11Properties* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -6145,15 +5956,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint8_t*)forUnmarshaling->deviceUUID, *ptr, VK_UUID_SIZE * sizeof(uint8_t));
     *ptr += VK_UUID_SIZE * sizeof(uint8_t);
@@ -6167,13 +5980,16 @@
     *ptr += sizeof(VkBool32);
     memcpy((uint32_t*)&forUnmarshaling->subgroupSize, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((VkShaderStageFlags*)&forUnmarshaling->subgroupSupportedStages, *ptr, sizeof(VkShaderStageFlags));
+    memcpy((VkShaderStageFlags*)&forUnmarshaling->subgroupSupportedStages, *ptr,
+           sizeof(VkShaderStageFlags));
     *ptr += sizeof(VkShaderStageFlags);
-    memcpy((VkSubgroupFeatureFlags*)&forUnmarshaling->subgroupSupportedOperations, *ptr, sizeof(VkSubgroupFeatureFlags));
+    memcpy((VkSubgroupFeatureFlags*)&forUnmarshaling->subgroupSupportedOperations, *ptr,
+           sizeof(VkSubgroupFeatureFlags));
     *ptr += sizeof(VkSubgroupFeatureFlags);
     memcpy((VkBool32*)&forUnmarshaling->subgroupQuadOperationsInAllStages, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkPointClippingBehavior*)&forUnmarshaling->pointClippingBehavior, *ptr, sizeof(VkPointClippingBehavior));
+    memcpy((VkPointClippingBehavior*)&forUnmarshaling->pointClippingBehavior, *ptr,
+           sizeof(VkPointClippingBehavior));
     *ptr += sizeof(VkPointClippingBehavior);
     memcpy((uint32_t*)&forUnmarshaling->maxMultiviewViewCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -6188,15 +6004,11 @@
 }
 
 void reservedunmarshal_VkPhysicalDeviceVulkan12Features(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceVulkan12Features* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceVulkan12Features* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -6204,15 +6016,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->samplerMirrorClampToEdge, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -6234,43 +6048,61 @@
     *ptr += sizeof(VkBool32);
     memcpy((VkBool32*)&forUnmarshaling->descriptorIndexing, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderInputAttachmentArrayDynamicIndexing, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderInputAttachmentArrayDynamicIndexing, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderUniformTexelBufferArrayDynamicIndexing, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderUniformTexelBufferArrayDynamicIndexing, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderStorageTexelBufferArrayDynamicIndexing, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderStorageTexelBufferArrayDynamicIndexing, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderUniformBufferArrayNonUniformIndexing, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderUniformBufferArrayNonUniformIndexing, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderSampledImageArrayNonUniformIndexing, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderSampledImageArrayNonUniformIndexing, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderStorageBufferArrayNonUniformIndexing, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderStorageBufferArrayNonUniformIndexing, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderStorageImageArrayNonUniformIndexing, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderStorageImageArrayNonUniformIndexing, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderInputAttachmentArrayNonUniformIndexing, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderInputAttachmentArrayNonUniformIndexing, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderUniformTexelBufferArrayNonUniformIndexing, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderUniformTexelBufferArrayNonUniformIndexing, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderStorageTexelBufferArrayNonUniformIndexing, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderStorageTexelBufferArrayNonUniformIndexing, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->descriptorBindingUniformBufferUpdateAfterBind, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->descriptorBindingUniformBufferUpdateAfterBind, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->descriptorBindingSampledImageUpdateAfterBind, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->descriptorBindingSampledImageUpdateAfterBind, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->descriptorBindingStorageImageUpdateAfterBind, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->descriptorBindingStorageImageUpdateAfterBind, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->descriptorBindingStorageBufferUpdateAfterBind, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->descriptorBindingStorageBufferUpdateAfterBind, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->descriptorBindingUniformTexelBufferUpdateAfterBind, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->descriptorBindingUniformTexelBufferUpdateAfterBind, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->descriptorBindingStorageTexelBufferUpdateAfterBind, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->descriptorBindingStorageTexelBufferUpdateAfterBind, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->descriptorBindingUpdateUnusedWhilePending, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->descriptorBindingUpdateUnusedWhilePending, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy((VkBool32*)&forUnmarshaling->descriptorBindingPartiallyBound, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->descriptorBindingVariableDescriptorCount, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->descriptorBindingVariableDescriptorCount, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy((VkBool32*)&forUnmarshaling->runtimeDescriptorArray, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -6300,7 +6132,8 @@
     *ptr += sizeof(VkBool32);
     memcpy((VkBool32*)&forUnmarshaling->vulkanMemoryModelDeviceScope, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->vulkanMemoryModelAvailabilityVisibilityChains, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->vulkanMemoryModelAvailabilityVisibilityChains, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy((VkBool32*)&forUnmarshaling->shaderOutputViewportIndex, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -6310,12 +6143,8 @@
     *ptr += sizeof(VkBool32);
 }
 
-void reservedunmarshal_VkConformanceVersion(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkConformanceVersion* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkConformanceVersion(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkConformanceVersion* forUnmarshaling, uint8_t** ptr) {
     memcpy((uint8_t*)&forUnmarshaling->major, *ptr, sizeof(uint8_t));
     *ptr += sizeof(uint8_t);
     memcpy((uint8_t*)&forUnmarshaling->minor, *ptr, sizeof(uint8_t));
@@ -6327,15 +6156,11 @@
 }
 
 void reservedunmarshal_VkPhysicalDeviceVulkan12Properties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceVulkan12Properties* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceVulkan12Properties* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -6343,15 +6168,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkDriverId*)&forUnmarshaling->driverID, *ptr, sizeof(VkDriverId));
     *ptr += sizeof(VkDriverId);
@@ -6359,16 +6186,22 @@
     *ptr += VK_MAX_DRIVER_NAME_SIZE * sizeof(char);
     memcpy((char*)forUnmarshaling->driverInfo, *ptr, VK_MAX_DRIVER_INFO_SIZE * sizeof(char));
     *ptr += VK_MAX_DRIVER_INFO_SIZE * sizeof(char);
-    reservedunmarshal_VkConformanceVersion(vkStream, rootType, (VkConformanceVersion*)(&forUnmarshaling->conformanceVersion), ptr);
-    memcpy((VkShaderFloatControlsIndependence*)&forUnmarshaling->denormBehaviorIndependence, *ptr, sizeof(VkShaderFloatControlsIndependence));
+    reservedunmarshal_VkConformanceVersion(
+        vkStream, rootType, (VkConformanceVersion*)(&forUnmarshaling->conformanceVersion), ptr);
+    memcpy((VkShaderFloatControlsIndependence*)&forUnmarshaling->denormBehaviorIndependence, *ptr,
+           sizeof(VkShaderFloatControlsIndependence));
     *ptr += sizeof(VkShaderFloatControlsIndependence);
-    memcpy((VkShaderFloatControlsIndependence*)&forUnmarshaling->roundingModeIndependence, *ptr, sizeof(VkShaderFloatControlsIndependence));
+    memcpy((VkShaderFloatControlsIndependence*)&forUnmarshaling->roundingModeIndependence, *ptr,
+           sizeof(VkShaderFloatControlsIndependence));
     *ptr += sizeof(VkShaderFloatControlsIndependence);
-    memcpy((VkBool32*)&forUnmarshaling->shaderSignedZeroInfNanPreserveFloat16, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderSignedZeroInfNanPreserveFloat16, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderSignedZeroInfNanPreserveFloat32, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderSignedZeroInfNanPreserveFloat32, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderSignedZeroInfNanPreserveFloat64, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderSignedZeroInfNanPreserveFloat64, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy((VkBool32*)&forUnmarshaling->shaderDenormPreserveFloat16, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -6394,55 +6227,78 @@
     *ptr += sizeof(VkBool32);
     memcpy((VkBool32*)&forUnmarshaling->shaderRoundingModeRTZFloat64, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((uint32_t*)&forUnmarshaling->maxUpdateAfterBindDescriptorsInAllPools, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxUpdateAfterBindDescriptorsInAllPools, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((VkBool32*)&forUnmarshaling->shaderUniformBufferArrayNonUniformIndexingNative, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderUniformBufferArrayNonUniformIndexingNative, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderSampledImageArrayNonUniformIndexingNative, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderSampledImageArrayNonUniformIndexingNative, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderStorageBufferArrayNonUniformIndexingNative, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderStorageBufferArrayNonUniformIndexingNative, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderStorageImageArrayNonUniformIndexingNative, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderStorageImageArrayNonUniformIndexingNative, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderInputAttachmentArrayNonUniformIndexingNative, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderInputAttachmentArrayNonUniformIndexingNative, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy((VkBool32*)&forUnmarshaling->robustBufferAccessUpdateAfterBind, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy((VkBool32*)&forUnmarshaling->quadDivergentImplicitLod, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindSamplers, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindSamplers, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindUniformBuffers, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindUniformBuffers, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindStorageBuffers, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindStorageBuffers, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindSampledImages, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindSampledImages, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindStorageImages, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindStorageImages, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindInputAttachments, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindInputAttachments, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxPerStageUpdateAfterBindResources, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxPerStageUpdateAfterBindResources, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindSamplers, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindSamplers, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindUniformBuffers, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindUniformBuffers, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindStorageBuffers, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindStorageBuffers, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindSampledImages, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindSampledImages, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindStorageImages, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindStorageImages, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindInputAttachments, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindInputAttachments, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((VkResolveModeFlags*)&forUnmarshaling->supportedDepthResolveModes, *ptr, sizeof(VkResolveModeFlags));
+    memcpy((VkResolveModeFlags*)&forUnmarshaling->supportedDepthResolveModes, *ptr,
+           sizeof(VkResolveModeFlags));
     *ptr += sizeof(VkResolveModeFlags);
-    memcpy((VkResolveModeFlags*)&forUnmarshaling->supportedStencilResolveModes, *ptr, sizeof(VkResolveModeFlags));
+    memcpy((VkResolveModeFlags*)&forUnmarshaling->supportedStencilResolveModes, *ptr,
+           sizeof(VkResolveModeFlags));
     *ptr += sizeof(VkResolveModeFlags);
     memcpy((VkBool32*)&forUnmarshaling->independentResolveNone, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -6452,22 +6308,20 @@
     *ptr += sizeof(VkBool32);
     memcpy((VkBool32*)&forUnmarshaling->filterMinmaxImageComponentMapping, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((uint64_t*)&forUnmarshaling->maxTimelineSemaphoreValueDifference, *ptr, sizeof(uint64_t));
+    memcpy((uint64_t*)&forUnmarshaling->maxTimelineSemaphoreValueDifference, *ptr,
+           sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
-    memcpy((VkSampleCountFlags*)&forUnmarshaling->framebufferIntegerColorSampleCounts, *ptr, sizeof(VkSampleCountFlags));
+    memcpy((VkSampleCountFlags*)&forUnmarshaling->framebufferIntegerColorSampleCounts, *ptr,
+           sizeof(VkSampleCountFlags));
     *ptr += sizeof(VkSampleCountFlags);
 }
 
-void reservedunmarshal_VkImageFormatListCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageFormatListCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkImageFormatListCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkImageFormatListCreateInfo* forUnmarshaling,
+                                                   uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -6475,33 +6329,33 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->viewFormatCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pViewFormats, forUnmarshaling->viewFormatCount * sizeof(const VkFormat));
-    memcpy((VkFormat*)forUnmarshaling->pViewFormats, *ptr, forUnmarshaling->viewFormatCount * sizeof(const VkFormat));
+    vkStream->alloc((void**)&forUnmarshaling->pViewFormats,
+                    forUnmarshaling->viewFormatCount * sizeof(const VkFormat));
+    memcpy((VkFormat*)forUnmarshaling->pViewFormats, *ptr,
+           forUnmarshaling->viewFormatCount * sizeof(const VkFormat));
     *ptr += forUnmarshaling->viewFormatCount * sizeof(const VkFormat);
 }
 
-void reservedunmarshal_VkAttachmentDescription2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAttachmentDescription2* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkAttachmentDescription2(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkAttachmentDescription2* forUnmarshaling,
+                                                uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -6509,17 +6363,20 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkAttachmentDescriptionFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkAttachmentDescriptionFlags));
+    memcpy((VkAttachmentDescriptionFlags*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkAttachmentDescriptionFlags));
     *ptr += sizeof(VkAttachmentDescriptionFlags);
     memcpy((VkFormat*)&forUnmarshaling->format, *ptr, sizeof(VkFormat));
     *ptr += sizeof(VkFormat);
@@ -6531,7 +6388,8 @@
     *ptr += sizeof(VkAttachmentStoreOp);
     memcpy((VkAttachmentLoadOp*)&forUnmarshaling->stencilLoadOp, *ptr, sizeof(VkAttachmentLoadOp));
     *ptr += sizeof(VkAttachmentLoadOp);
-    memcpy((VkAttachmentStoreOp*)&forUnmarshaling->stencilStoreOp, *ptr, sizeof(VkAttachmentStoreOp));
+    memcpy((VkAttachmentStoreOp*)&forUnmarshaling->stencilStoreOp, *ptr,
+           sizeof(VkAttachmentStoreOp));
     *ptr += sizeof(VkAttachmentStoreOp);
     memcpy((VkImageLayout*)&forUnmarshaling->initialLayout, *ptr, sizeof(VkImageLayout));
     *ptr += sizeof(VkImageLayout);
@@ -6539,16 +6397,12 @@
     *ptr += sizeof(VkImageLayout);
 }
 
-void reservedunmarshal_VkAttachmentReference2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAttachmentReference2* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkAttachmentReference2(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkAttachmentReference2* forUnmarshaling,
+                                              uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -6556,15 +6410,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->attachment, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -6574,16 +6430,12 @@
     *ptr += sizeof(VkImageAspectFlags);
 }
 
-void reservedunmarshal_VkSubpassDescription2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubpassDescription2* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkSubpassDescription2(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkSubpassDescription2* forUnmarshaling,
+                                             uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -6591,74 +6443,83 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkSubpassDescriptionFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkSubpassDescriptionFlags));
+    memcpy((VkSubpassDescriptionFlags*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkSubpassDescriptionFlags));
     *ptr += sizeof(VkSubpassDescriptionFlags);
-    memcpy((VkPipelineBindPoint*)&forUnmarshaling->pipelineBindPoint, *ptr, sizeof(VkPipelineBindPoint));
+    memcpy((VkPipelineBindPoint*)&forUnmarshaling->pipelineBindPoint, *ptr,
+           sizeof(VkPipelineBindPoint));
     *ptr += sizeof(VkPipelineBindPoint);
     memcpy((uint32_t*)&forUnmarshaling->viewMask, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->inputAttachmentCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pInputAttachments, forUnmarshaling->inputAttachmentCount * sizeof(const VkAttachmentReference2));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->inputAttachmentCount; ++i)
-    {
-        reservedunmarshal_VkAttachmentReference2(vkStream, rootType, (VkAttachmentReference2*)(forUnmarshaling->pInputAttachments + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pInputAttachments,
+                    forUnmarshaling->inputAttachmentCount * sizeof(const VkAttachmentReference2));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->inputAttachmentCount; ++i) {
+        reservedunmarshal_VkAttachmentReference2(
+            vkStream, rootType, (VkAttachmentReference2*)(forUnmarshaling->pInputAttachments + i),
+            ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->colorAttachmentCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pColorAttachments, forUnmarshaling->colorAttachmentCount * sizeof(const VkAttachmentReference2));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->colorAttachmentCount; ++i)
-    {
-        reservedunmarshal_VkAttachmentReference2(vkStream, rootType, (VkAttachmentReference2*)(forUnmarshaling->pColorAttachments + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pColorAttachments,
+                    forUnmarshaling->colorAttachmentCount * sizeof(const VkAttachmentReference2));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->colorAttachmentCount; ++i) {
+        reservedunmarshal_VkAttachmentReference2(
+            vkStream, rootType, (VkAttachmentReference2*)(forUnmarshaling->pColorAttachments + i),
+            ptr);
     }
     // WARNING PTR CHECK
     memcpy((VkAttachmentReference2**)&forUnmarshaling->pResolveAttachments, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pResolveAttachments);
     *ptr += 8;
-    if (forUnmarshaling->pResolveAttachments)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pResolveAttachments, forUnmarshaling->colorAttachmentCount * sizeof(const VkAttachmentReference2));
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->colorAttachmentCount; ++i)
-        {
-            reservedunmarshal_VkAttachmentReference2(vkStream, rootType, (VkAttachmentReference2*)(forUnmarshaling->pResolveAttachments + i), ptr);
+    if (forUnmarshaling->pResolveAttachments) {
+        vkStream->alloc(
+            (void**)&forUnmarshaling->pResolveAttachments,
+            forUnmarshaling->colorAttachmentCount * sizeof(const VkAttachmentReference2));
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->colorAttachmentCount; ++i) {
+            reservedunmarshal_VkAttachmentReference2(
+                vkStream, rootType,
+                (VkAttachmentReference2*)(forUnmarshaling->pResolveAttachments + i), ptr);
         }
     }
     // WARNING PTR CHECK
     memcpy((VkAttachmentReference2**)&forUnmarshaling->pDepthStencilAttachment, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pDepthStencilAttachment);
     *ptr += 8;
-    if (forUnmarshaling->pDepthStencilAttachment)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pDepthStencilAttachment, sizeof(const VkAttachmentReference2));
-        reservedunmarshal_VkAttachmentReference2(vkStream, rootType, (VkAttachmentReference2*)(forUnmarshaling->pDepthStencilAttachment), ptr);
+    if (forUnmarshaling->pDepthStencilAttachment) {
+        vkStream->alloc((void**)&forUnmarshaling->pDepthStencilAttachment,
+                        sizeof(const VkAttachmentReference2));
+        reservedunmarshal_VkAttachmentReference2(
+            vkStream, rootType, (VkAttachmentReference2*)(forUnmarshaling->pDepthStencilAttachment),
+            ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->preserveAttachmentCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pPreserveAttachments, forUnmarshaling->preserveAttachmentCount * sizeof(const uint32_t));
-    memcpy((uint32_t*)forUnmarshaling->pPreserveAttachments, *ptr, forUnmarshaling->preserveAttachmentCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pPreserveAttachments,
+                    forUnmarshaling->preserveAttachmentCount * sizeof(const uint32_t));
+    memcpy((uint32_t*)forUnmarshaling->pPreserveAttachments, *ptr,
+           forUnmarshaling->preserveAttachmentCount * sizeof(const uint32_t));
     *ptr += forUnmarshaling->preserveAttachmentCount * sizeof(const uint32_t);
 }
 
-void reservedunmarshal_VkSubpassDependency2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubpassDependency2* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkSubpassDependency2(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkSubpassDependency2* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -6666,23 +6527,27 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->srcSubpass, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->dstSubpass, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((VkPipelineStageFlags*)&forUnmarshaling->srcStageMask, *ptr, sizeof(VkPipelineStageFlags));
+    memcpy((VkPipelineStageFlags*)&forUnmarshaling->srcStageMask, *ptr,
+           sizeof(VkPipelineStageFlags));
     *ptr += sizeof(VkPipelineStageFlags);
-    memcpy((VkPipelineStageFlags*)&forUnmarshaling->dstStageMask, *ptr, sizeof(VkPipelineStageFlags));
+    memcpy((VkPipelineStageFlags*)&forUnmarshaling->dstStageMask, *ptr,
+           sizeof(VkPipelineStageFlags));
     *ptr += sizeof(VkPipelineStageFlags);
     memcpy((VkAccessFlags*)&forUnmarshaling->srcAccessMask, *ptr, sizeof(VkAccessFlags));
     *ptr += sizeof(VkAccessFlags);
@@ -6694,16 +6559,12 @@
     *ptr += sizeof(int32_t);
 }
 
-void reservedunmarshal_VkRenderPassCreateInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderPassCreateInfo2* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkRenderPassCreateInfo2(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkRenderPassCreateInfo2* forUnmarshaling,
+                                               uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -6711,56 +6572,60 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkRenderPassCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkRenderPassCreateFlags));
+    memcpy((VkRenderPassCreateFlags*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkRenderPassCreateFlags));
     *ptr += sizeof(VkRenderPassCreateFlags);
     memcpy((uint32_t*)&forUnmarshaling->attachmentCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pAttachments, forUnmarshaling->attachmentCount * sizeof(const VkAttachmentDescription2));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->attachmentCount; ++i)
-    {
-        reservedunmarshal_VkAttachmentDescription2(vkStream, rootType, (VkAttachmentDescription2*)(forUnmarshaling->pAttachments + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pAttachments,
+                    forUnmarshaling->attachmentCount * sizeof(const VkAttachmentDescription2));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->attachmentCount; ++i) {
+        reservedunmarshal_VkAttachmentDescription2(
+            vkStream, rootType, (VkAttachmentDescription2*)(forUnmarshaling->pAttachments + i),
+            ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->subpassCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pSubpasses, forUnmarshaling->subpassCount * sizeof(const VkSubpassDescription2));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->subpassCount; ++i)
-    {
-        reservedunmarshal_VkSubpassDescription2(vkStream, rootType, (VkSubpassDescription2*)(forUnmarshaling->pSubpasses + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pSubpasses,
+                    forUnmarshaling->subpassCount * sizeof(const VkSubpassDescription2));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->subpassCount; ++i) {
+        reservedunmarshal_VkSubpassDescription2(
+            vkStream, rootType, (VkSubpassDescription2*)(forUnmarshaling->pSubpasses + i), ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->dependencyCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pDependencies, forUnmarshaling->dependencyCount * sizeof(const VkSubpassDependency2));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->dependencyCount; ++i)
-    {
-        reservedunmarshal_VkSubpassDependency2(vkStream, rootType, (VkSubpassDependency2*)(forUnmarshaling->pDependencies + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pDependencies,
+                    forUnmarshaling->dependencyCount * sizeof(const VkSubpassDependency2));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->dependencyCount; ++i) {
+        reservedunmarshal_VkSubpassDependency2(
+            vkStream, rootType, (VkSubpassDependency2*)(forUnmarshaling->pDependencies + i), ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->correlatedViewMaskCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pCorrelatedViewMasks, forUnmarshaling->correlatedViewMaskCount * sizeof(const uint32_t));
-    memcpy((uint32_t*)forUnmarshaling->pCorrelatedViewMasks, *ptr, forUnmarshaling->correlatedViewMaskCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pCorrelatedViewMasks,
+                    forUnmarshaling->correlatedViewMaskCount * sizeof(const uint32_t));
+    memcpy((uint32_t*)forUnmarshaling->pCorrelatedViewMasks, *ptr,
+           forUnmarshaling->correlatedViewMaskCount * sizeof(const uint32_t));
     *ptr += forUnmarshaling->correlatedViewMaskCount * sizeof(const uint32_t);
 }
 
-void reservedunmarshal_VkSubpassBeginInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubpassBeginInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkSubpassBeginInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkSubpassBeginInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -6768,30 +6633,27 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkSubpassContents*)&forUnmarshaling->contents, *ptr, sizeof(VkSubpassContents));
     *ptr += sizeof(VkSubpassContents);
 }
 
-void reservedunmarshal_VkSubpassEndInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubpassEndInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkSubpassEndInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkSubpassEndInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -6799,28 +6661,26 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
 }
 
 void reservedunmarshal_VkPhysicalDevice8BitStorageFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevice8BitStorageFeatures* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevice8BitStorageFeatures* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -6828,15 +6688,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->storageBuffer8BitAccess, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -6847,15 +6709,11 @@
 }
 
 void reservedunmarshal_VkPhysicalDeviceDriverProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDriverProperties* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceDriverProperties* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -6863,15 +6721,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkDriverId*)&forUnmarshaling->driverID, *ptr, sizeof(VkDriverId));
     *ptr += sizeof(VkDriverId);
@@ -6879,19 +6739,16 @@
     *ptr += VK_MAX_DRIVER_NAME_SIZE * sizeof(char);
     memcpy((char*)forUnmarshaling->driverInfo, *ptr, VK_MAX_DRIVER_INFO_SIZE * sizeof(char));
     *ptr += VK_MAX_DRIVER_INFO_SIZE * sizeof(char);
-    reservedunmarshal_VkConformanceVersion(vkStream, rootType, (VkConformanceVersion*)(&forUnmarshaling->conformanceVersion), ptr);
+    reservedunmarshal_VkConformanceVersion(
+        vkStream, rootType, (VkConformanceVersion*)(&forUnmarshaling->conformanceVersion), ptr);
 }
 
 void reservedunmarshal_VkPhysicalDeviceShaderAtomicInt64Features(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderAtomicInt64Features* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderAtomicInt64Features* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -6899,15 +6756,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->shaderBufferInt64Atomics, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -6916,15 +6775,11 @@
 }
 
 void reservedunmarshal_VkPhysicalDeviceShaderFloat16Int8Features(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderFloat16Int8Features* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderFloat16Int8Features* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -6932,15 +6787,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->shaderFloat16, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -6949,15 +6806,11 @@
 }
 
 void reservedunmarshal_VkPhysicalDeviceFloatControlsProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFloatControlsProperties* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceFloatControlsProperties* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -6965,25 +6818,32 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkShaderFloatControlsIndependence*)&forUnmarshaling->denormBehaviorIndependence, *ptr, sizeof(VkShaderFloatControlsIndependence));
+    memcpy((VkShaderFloatControlsIndependence*)&forUnmarshaling->denormBehaviorIndependence, *ptr,
+           sizeof(VkShaderFloatControlsIndependence));
     *ptr += sizeof(VkShaderFloatControlsIndependence);
-    memcpy((VkShaderFloatControlsIndependence*)&forUnmarshaling->roundingModeIndependence, *ptr, sizeof(VkShaderFloatControlsIndependence));
+    memcpy((VkShaderFloatControlsIndependence*)&forUnmarshaling->roundingModeIndependence, *ptr,
+           sizeof(VkShaderFloatControlsIndependence));
     *ptr += sizeof(VkShaderFloatControlsIndependence);
-    memcpy((VkBool32*)&forUnmarshaling->shaderSignedZeroInfNanPreserveFloat16, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderSignedZeroInfNanPreserveFloat16, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderSignedZeroInfNanPreserveFloat32, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderSignedZeroInfNanPreserveFloat32, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderSignedZeroInfNanPreserveFloat64, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderSignedZeroInfNanPreserveFloat64, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy((VkBool32*)&forUnmarshaling->shaderDenormPreserveFloat16, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -7012,15 +6872,11 @@
 }
 
 void reservedunmarshal_VkDescriptorSetLayoutBindingFlagsCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorSetLayoutBindingFlagsCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDescriptorSetLayoutBindingFlagsCreateInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -7028,15 +6884,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->bindingCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -7044,24 +6902,21 @@
     memcpy((VkDescriptorBindingFlags**)&forUnmarshaling->pBindingFlags, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pBindingFlags);
     *ptr += 8;
-    if (forUnmarshaling->pBindingFlags)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pBindingFlags, forUnmarshaling->bindingCount * sizeof(const VkDescriptorBindingFlags));
-        memcpy((VkDescriptorBindingFlags*)forUnmarshaling->pBindingFlags, *ptr, forUnmarshaling->bindingCount * sizeof(const VkDescriptorBindingFlags));
+    if (forUnmarshaling->pBindingFlags) {
+        vkStream->alloc((void**)&forUnmarshaling->pBindingFlags,
+                        forUnmarshaling->bindingCount * sizeof(const VkDescriptorBindingFlags));
+        memcpy((VkDescriptorBindingFlags*)forUnmarshaling->pBindingFlags, *ptr,
+               forUnmarshaling->bindingCount * sizeof(const VkDescriptorBindingFlags));
         *ptr += forUnmarshaling->bindingCount * sizeof(const VkDescriptorBindingFlags);
     }
 }
 
 void reservedunmarshal_VkPhysicalDeviceDescriptorIndexingFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDescriptorIndexingFeatures* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceDescriptorIndexingFeatures* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -7069,68 +6924,84 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkBool32*)&forUnmarshaling->shaderInputAttachmentArrayDynamicIndexing, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderInputAttachmentArrayDynamicIndexing, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderUniformTexelBufferArrayDynamicIndexing, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderUniformTexelBufferArrayDynamicIndexing, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderStorageTexelBufferArrayDynamicIndexing, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderStorageTexelBufferArrayDynamicIndexing, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderUniformBufferArrayNonUniformIndexing, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderUniformBufferArrayNonUniformIndexing, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderSampledImageArrayNonUniformIndexing, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderSampledImageArrayNonUniformIndexing, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderStorageBufferArrayNonUniformIndexing, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderStorageBufferArrayNonUniformIndexing, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderStorageImageArrayNonUniformIndexing, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderStorageImageArrayNonUniformIndexing, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderInputAttachmentArrayNonUniformIndexing, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderInputAttachmentArrayNonUniformIndexing, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderUniformTexelBufferArrayNonUniformIndexing, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderUniformTexelBufferArrayNonUniformIndexing, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderStorageTexelBufferArrayNonUniformIndexing, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderStorageTexelBufferArrayNonUniformIndexing, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->descriptorBindingUniformBufferUpdateAfterBind, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->descriptorBindingUniformBufferUpdateAfterBind, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->descriptorBindingSampledImageUpdateAfterBind, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->descriptorBindingSampledImageUpdateAfterBind, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->descriptorBindingStorageImageUpdateAfterBind, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->descriptorBindingStorageImageUpdateAfterBind, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->descriptorBindingStorageBufferUpdateAfterBind, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->descriptorBindingStorageBufferUpdateAfterBind, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->descriptorBindingUniformTexelBufferUpdateAfterBind, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->descriptorBindingUniformTexelBufferUpdateAfterBind, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->descriptorBindingStorageTexelBufferUpdateAfterBind, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->descriptorBindingStorageTexelBufferUpdateAfterBind, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->descriptorBindingUpdateUnusedWhilePending, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->descriptorBindingUpdateUnusedWhilePending, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy((VkBool32*)&forUnmarshaling->descriptorBindingPartiallyBound, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->descriptorBindingVariableDescriptorCount, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->descriptorBindingVariableDescriptorCount, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy((VkBool32*)&forUnmarshaling->runtimeDescriptorArray, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkPhysicalDeviceDescriptorIndexingProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDescriptorIndexingProperties* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceDescriptorIndexingProperties* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -7138,74 +7009,93 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((uint32_t*)&forUnmarshaling->maxUpdateAfterBindDescriptorsInAllPools, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxUpdateAfterBindDescriptorsInAllPools, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((VkBool32*)&forUnmarshaling->shaderUniformBufferArrayNonUniformIndexingNative, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderUniformBufferArrayNonUniformIndexingNative, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderSampledImageArrayNonUniformIndexingNative, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderSampledImageArrayNonUniformIndexingNative, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderStorageBufferArrayNonUniformIndexingNative, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderStorageBufferArrayNonUniformIndexingNative, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderStorageImageArrayNonUniformIndexingNative, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderStorageImageArrayNonUniformIndexingNative, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderInputAttachmentArrayNonUniformIndexingNative, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderInputAttachmentArrayNonUniformIndexingNative, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy((VkBool32*)&forUnmarshaling->robustBufferAccessUpdateAfterBind, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy((VkBool32*)&forUnmarshaling->quadDivergentImplicitLod, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindSamplers, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindSamplers, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindUniformBuffers, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindUniformBuffers, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindStorageBuffers, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindStorageBuffers, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindSampledImages, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindSampledImages, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindStorageImages, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindStorageImages, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindInputAttachments, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindInputAttachments, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxPerStageUpdateAfterBindResources, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxPerStageUpdateAfterBindResources, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindSamplers, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindSamplers, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindUniformBuffers, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindUniformBuffers, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindStorageBuffers, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindStorageBuffers, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindSampledImages, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindSampledImages, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindStorageImages, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindStorageImages, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindInputAttachments, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindInputAttachments, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
 void reservedunmarshal_VkDescriptorSetVariableDescriptorCountAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorSetVariableDescriptorCountAllocateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDescriptorSetVariableDescriptorCountAllocateInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -7213,33 +7103,33 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->descriptorSetCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pDescriptorCounts, forUnmarshaling->descriptorSetCount * sizeof(const uint32_t));
-    memcpy((uint32_t*)forUnmarshaling->pDescriptorCounts, *ptr, forUnmarshaling->descriptorSetCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pDescriptorCounts,
+                    forUnmarshaling->descriptorSetCount * sizeof(const uint32_t));
+    memcpy((uint32_t*)forUnmarshaling->pDescriptorCounts, *ptr,
+           forUnmarshaling->descriptorSetCount * sizeof(const uint32_t));
     *ptr += forUnmarshaling->descriptorSetCount * sizeof(const uint32_t);
 }
 
 void reservedunmarshal_VkDescriptorSetVariableDescriptorCountLayoutSupport(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorSetVariableDescriptorCountLayoutSupport* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDescriptorSetVariableDescriptorCountLayoutSupport* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -7247,30 +7137,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->maxVariableDescriptorCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
 void reservedunmarshal_VkSubpassDescriptionDepthStencilResolve(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubpassDescriptionDepthStencilResolve* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSubpassDescriptionDepthStencilResolve* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -7278,41 +7166,43 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkResolveModeFlagBits*)&forUnmarshaling->depthResolveMode, *ptr, sizeof(VkResolveModeFlagBits));
+    memcpy((VkResolveModeFlagBits*)&forUnmarshaling->depthResolveMode, *ptr,
+           sizeof(VkResolveModeFlagBits));
     *ptr += sizeof(VkResolveModeFlagBits);
-    memcpy((VkResolveModeFlagBits*)&forUnmarshaling->stencilResolveMode, *ptr, sizeof(VkResolveModeFlagBits));
+    memcpy((VkResolveModeFlagBits*)&forUnmarshaling->stencilResolveMode, *ptr,
+           sizeof(VkResolveModeFlagBits));
     *ptr += sizeof(VkResolveModeFlagBits);
     // WARNING PTR CHECK
     memcpy((VkAttachmentReference2**)&forUnmarshaling->pDepthStencilResolveAttachment, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pDepthStencilResolveAttachment);
     *ptr += 8;
-    if (forUnmarshaling->pDepthStencilResolveAttachment)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pDepthStencilResolveAttachment, sizeof(const VkAttachmentReference2));
-        reservedunmarshal_VkAttachmentReference2(vkStream, rootType, (VkAttachmentReference2*)(forUnmarshaling->pDepthStencilResolveAttachment), ptr);
+    if (forUnmarshaling->pDepthStencilResolveAttachment) {
+        vkStream->alloc((void**)&forUnmarshaling->pDepthStencilResolveAttachment,
+                        sizeof(const VkAttachmentReference2));
+        reservedunmarshal_VkAttachmentReference2(
+            vkStream, rootType,
+            (VkAttachmentReference2*)(forUnmarshaling->pDepthStencilResolveAttachment), ptr);
     }
 }
 
 void reservedunmarshal_VkPhysicalDeviceDepthStencilResolveProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDepthStencilResolveProperties* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceDepthStencilResolveProperties* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -7320,19 +7210,23 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkResolveModeFlags*)&forUnmarshaling->supportedDepthResolveModes, *ptr, sizeof(VkResolveModeFlags));
+    memcpy((VkResolveModeFlags*)&forUnmarshaling->supportedDepthResolveModes, *ptr,
+           sizeof(VkResolveModeFlags));
     *ptr += sizeof(VkResolveModeFlags);
-    memcpy((VkResolveModeFlags*)&forUnmarshaling->supportedStencilResolveModes, *ptr, sizeof(VkResolveModeFlags));
+    memcpy((VkResolveModeFlags*)&forUnmarshaling->supportedStencilResolveModes, *ptr,
+           sizeof(VkResolveModeFlags));
     *ptr += sizeof(VkResolveModeFlags);
     memcpy((VkBool32*)&forUnmarshaling->independentResolveNone, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -7341,15 +7235,11 @@
 }
 
 void reservedunmarshal_VkPhysicalDeviceScalarBlockLayoutFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceScalarBlockLayoutFeatures* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceScalarBlockLayoutFeatures* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -7357,30 +7247,29 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->scalarBlockLayout, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
-void reservedunmarshal_VkImageStencilUsageCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageStencilUsageCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkImageStencilUsageCreateInfo(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkImageStencilUsageCreateInfo* forUnmarshaling,
+                                                     uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -7388,30 +7277,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkImageUsageFlags*)&forUnmarshaling->stencilUsage, *ptr, sizeof(VkImageUsageFlags));
     *ptr += sizeof(VkImageUsageFlags);
 }
 
 void reservedunmarshal_VkSamplerReductionModeCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSamplerReductionModeCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSamplerReductionModeCreateInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -7419,30 +7306,29 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkSamplerReductionMode*)&forUnmarshaling->reductionMode, *ptr, sizeof(VkSamplerReductionMode));
+    memcpy((VkSamplerReductionMode*)&forUnmarshaling->reductionMode, *ptr,
+           sizeof(VkSamplerReductionMode));
     *ptr += sizeof(VkSamplerReductionMode);
 }
 
 void reservedunmarshal_VkPhysicalDeviceSamplerFilterMinmaxProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSamplerFilterMinmaxProperties* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceSamplerFilterMinmaxProperties* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -7450,15 +7336,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->filterMinmaxSingleComponentFormats, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -7467,15 +7355,11 @@
 }
 
 void reservedunmarshal_VkPhysicalDeviceVulkanMemoryModelFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceVulkanMemoryModelFeatures* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceVulkanMemoryModelFeatures* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -7483,34 +7367,33 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->vulkanMemoryModel, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy((VkBool32*)&forUnmarshaling->vulkanMemoryModelDeviceScope, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->vulkanMemoryModelAvailabilityVisibilityChains, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->vulkanMemoryModelAvailabilityVisibilityChains, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkPhysicalDeviceImagelessFramebufferFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceImagelessFramebufferFeatures* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceImagelessFramebufferFeatures* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -7518,30 +7401,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->imagelessFramebuffer, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkFramebufferAttachmentImageInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFramebufferAttachmentImageInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkFramebufferAttachmentImageInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -7549,15 +7430,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkImageCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkImageCreateFlags));
     *ptr += sizeof(VkImageCreateFlags);
@@ -7571,21 +7454,19 @@
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->viewFormatCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pViewFormats, forUnmarshaling->viewFormatCount * sizeof(const VkFormat));
-    memcpy((VkFormat*)forUnmarshaling->pViewFormats, *ptr, forUnmarshaling->viewFormatCount * sizeof(const VkFormat));
+    vkStream->alloc((void**)&forUnmarshaling->pViewFormats,
+                    forUnmarshaling->viewFormatCount * sizeof(const VkFormat));
+    memcpy((VkFormat*)forUnmarshaling->pViewFormats, *ptr,
+           forUnmarshaling->viewFormatCount * sizeof(const VkFormat));
     *ptr += forUnmarshaling->viewFormatCount * sizeof(const VkFormat);
 }
 
 void reservedunmarshal_VkFramebufferAttachmentsCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFramebufferAttachmentsCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkFramebufferAttachmentsCreateInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -7593,35 +7474,36 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->attachmentImageInfoCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pAttachmentImageInfos, forUnmarshaling->attachmentImageInfoCount * sizeof(const VkFramebufferAttachmentImageInfo));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->attachmentImageInfoCount; ++i)
-    {
-        reservedunmarshal_VkFramebufferAttachmentImageInfo(vkStream, rootType, (VkFramebufferAttachmentImageInfo*)(forUnmarshaling->pAttachmentImageInfos + i), ptr);
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pAttachmentImageInfos,
+        forUnmarshaling->attachmentImageInfoCount * sizeof(const VkFramebufferAttachmentImageInfo));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->attachmentImageInfoCount; ++i) {
+        reservedunmarshal_VkFramebufferAttachmentImageInfo(
+            vkStream, rootType,
+            (VkFramebufferAttachmentImageInfo*)(forUnmarshaling->pAttachmentImageInfos + i), ptr);
     }
 }
 
 void reservedunmarshal_VkRenderPassAttachmentBeginInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderPassAttachmentBeginInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkRenderPassAttachmentBeginInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -7629,44 +7511,42 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->attachmentCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pAttachments, forUnmarshaling->attachmentCount * sizeof(const VkImageView));
-    if (forUnmarshaling->attachmentCount)
-    {
+    vkStream->alloc((void**)&forUnmarshaling->pAttachments,
+                    forUnmarshaling->attachmentCount * sizeof(const VkImageView));
+    if (forUnmarshaling->attachmentCount) {
         uint8_t* cgen_var_0_ptr = (uint8_t*)(*ptr);
         *ptr += 8 * forUnmarshaling->attachmentCount;
-        if (forUnmarshaling)
-        {
-            for (uint32_t k = 0; k < forUnmarshaling->attachmentCount; ++k)
-            {
-                uint64_t tmpval; memcpy(&tmpval, cgen_var_0_ptr + k * 8, sizeof(uint64_t));
-                *(((VkImageView*)forUnmarshaling->pAttachments) + k) = (VkImageView)unbox_VkImageView((VkImageView)tmpval);
+        if (forUnmarshaling) {
+            for (uint32_t k = 0; k < forUnmarshaling->attachmentCount; ++k) {
+                uint64_t tmpval;
+                memcpy(&tmpval, cgen_var_0_ptr + k * 8, sizeof(uint64_t));
+                *(((VkImageView*)forUnmarshaling->pAttachments) + k) =
+                    (VkImageView)unbox_VkImageView((VkImageView)tmpval);
             }
         }
     }
 }
 
 void reservedunmarshal_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceUniformBufferStandardLayoutFeatures* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceUniformBufferStandardLayoutFeatures* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -7674,30 +7554,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->uniformBufferStandardLayout, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -7705,30 +7583,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->shaderSubgroupExtendedTypes, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -7736,30 +7612,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->separateDepthStencilLayouts, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkAttachmentReferenceStencilLayout(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAttachmentReferenceStencilLayout* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAttachmentReferenceStencilLayout* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -7767,30 +7641,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkImageLayout*)&forUnmarshaling->stencilLayout, *ptr, sizeof(VkImageLayout));
     *ptr += sizeof(VkImageLayout);
 }
 
 void reservedunmarshal_VkAttachmentDescriptionStencilLayout(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAttachmentDescriptionStencilLayout* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAttachmentDescriptionStencilLayout* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -7798,15 +7670,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkImageLayout*)&forUnmarshaling->stencilInitialLayout, *ptr, sizeof(VkImageLayout));
     *ptr += sizeof(VkImageLayout);
@@ -7815,15 +7689,11 @@
 }
 
 void reservedunmarshal_VkPhysicalDeviceHostQueryResetFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceHostQueryResetFeatures* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceHostQueryResetFeatures* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -7831,30 +7701,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->hostQueryReset, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkPhysicalDeviceTimelineSemaphoreFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceTimelineSemaphoreFeatures* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceTimelineSemaphoreFeatures* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -7862,30 +7730,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->timelineSemaphore, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkPhysicalDeviceTimelineSemaphoreProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceTimelineSemaphoreProperties* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceTimelineSemaphoreProperties* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -7893,30 +7759,29 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((uint64_t*)&forUnmarshaling->maxTimelineSemaphoreValueDifference, *ptr, sizeof(uint64_t));
+    memcpy((uint64_t*)&forUnmarshaling->maxTimelineSemaphoreValueDifference, *ptr,
+           sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
 }
 
-void reservedunmarshal_VkSemaphoreTypeCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSemaphoreTypeCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkSemaphoreTypeCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkSemaphoreTypeCreateInfo* forUnmarshaling,
+                                                 uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -7924,15 +7789,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkSemaphoreType*)&forUnmarshaling->semaphoreType, *ptr, sizeof(VkSemaphoreType));
     *ptr += sizeof(VkSemaphoreType);
@@ -7940,16 +7807,13 @@
     *ptr += sizeof(uint64_t);
 }
 
-void reservedunmarshal_VkTimelineSemaphoreSubmitInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkTimelineSemaphoreSubmitInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkTimelineSemaphoreSubmitInfo(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkTimelineSemaphoreSubmitInfo* forUnmarshaling,
+                                                     uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -7957,15 +7821,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->waitSemaphoreValueCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -7973,10 +7839,11 @@
     memcpy((uint64_t**)&forUnmarshaling->pWaitSemaphoreValues, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pWaitSemaphoreValues);
     *ptr += 8;
-    if (forUnmarshaling->pWaitSemaphoreValues)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pWaitSemaphoreValues, forUnmarshaling->waitSemaphoreValueCount * sizeof(const uint64_t));
-        memcpy((uint64_t*)forUnmarshaling->pWaitSemaphoreValues, *ptr, forUnmarshaling->waitSemaphoreValueCount * sizeof(const uint64_t));
+    if (forUnmarshaling->pWaitSemaphoreValues) {
+        vkStream->alloc((void**)&forUnmarshaling->pWaitSemaphoreValues,
+                        forUnmarshaling->waitSemaphoreValueCount * sizeof(const uint64_t));
+        memcpy((uint64_t*)forUnmarshaling->pWaitSemaphoreValues, *ptr,
+               forUnmarshaling->waitSemaphoreValueCount * sizeof(const uint64_t));
         *ptr += forUnmarshaling->waitSemaphoreValueCount * sizeof(const uint64_t);
     }
     memcpy((uint32_t*)&forUnmarshaling->signalSemaphoreValueCount, *ptr, sizeof(uint32_t));
@@ -7985,24 +7852,20 @@
     memcpy((uint64_t**)&forUnmarshaling->pSignalSemaphoreValues, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pSignalSemaphoreValues);
     *ptr += 8;
-    if (forUnmarshaling->pSignalSemaphoreValues)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pSignalSemaphoreValues, forUnmarshaling->signalSemaphoreValueCount * sizeof(const uint64_t));
-        memcpy((uint64_t*)forUnmarshaling->pSignalSemaphoreValues, *ptr, forUnmarshaling->signalSemaphoreValueCount * sizeof(const uint64_t));
+    if (forUnmarshaling->pSignalSemaphoreValues) {
+        vkStream->alloc((void**)&forUnmarshaling->pSignalSemaphoreValues,
+                        forUnmarshaling->signalSemaphoreValueCount * sizeof(const uint64_t));
+        memcpy((uint64_t*)forUnmarshaling->pSignalSemaphoreValues, *ptr,
+               forUnmarshaling->signalSemaphoreValueCount * sizeof(const uint64_t));
         *ptr += forUnmarshaling->signalSemaphoreValueCount * sizeof(const uint64_t);
     }
 }
 
-void reservedunmarshal_VkSemaphoreWaitInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSemaphoreWaitInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkSemaphoreWaitInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkSemaphoreWaitInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -8010,49 +7873,49 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkSemaphoreWaitFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkSemaphoreWaitFlags));
     *ptr += sizeof(VkSemaphoreWaitFlags);
     memcpy((uint32_t*)&forUnmarshaling->semaphoreCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pSemaphores, forUnmarshaling->semaphoreCount * sizeof(const VkSemaphore));
-    if (forUnmarshaling->semaphoreCount)
-    {
+    vkStream->alloc((void**)&forUnmarshaling->pSemaphores,
+                    forUnmarshaling->semaphoreCount * sizeof(const VkSemaphore));
+    if (forUnmarshaling->semaphoreCount) {
         uint8_t* cgen_var_0_ptr = (uint8_t*)(*ptr);
         *ptr += 8 * forUnmarshaling->semaphoreCount;
-        if (forUnmarshaling)
-        {
-            for (uint32_t k = 0; k < forUnmarshaling->semaphoreCount; ++k)
-            {
-                uint64_t tmpval; memcpy(&tmpval, cgen_var_0_ptr + k * 8, sizeof(uint64_t));
-                *(((VkSemaphore*)forUnmarshaling->pSemaphores) + k) = (VkSemaphore)unbox_VkSemaphore((VkSemaphore)tmpval);
+        if (forUnmarshaling) {
+            for (uint32_t k = 0; k < forUnmarshaling->semaphoreCount; ++k) {
+                uint64_t tmpval;
+                memcpy(&tmpval, cgen_var_0_ptr + k * 8, sizeof(uint64_t));
+                *(((VkSemaphore*)forUnmarshaling->pSemaphores) + k) =
+                    (VkSemaphore)unbox_VkSemaphore((VkSemaphore)tmpval);
             }
         }
     }
-    vkStream->alloc((void**)&forUnmarshaling->pValues, forUnmarshaling->semaphoreCount * sizeof(const uint64_t));
-    memcpy((uint64_t*)forUnmarshaling->pValues, *ptr, forUnmarshaling->semaphoreCount * sizeof(const uint64_t));
+    vkStream->alloc((void**)&forUnmarshaling->pValues,
+                    forUnmarshaling->semaphoreCount * sizeof(const uint64_t));
+    memcpy((uint64_t*)forUnmarshaling->pValues, *ptr,
+           forUnmarshaling->semaphoreCount * sizeof(const uint64_t));
     *ptr += forUnmarshaling->semaphoreCount * sizeof(const uint64_t);
 }
 
-void reservedunmarshal_VkSemaphoreSignalInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSemaphoreSignalInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkSemaphoreSignalInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkSemaphoreSignalInfo* forUnmarshaling,
+                                             uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -8060,34 +7923,33 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkSemaphore*)&forUnmarshaling->semaphore = (VkSemaphore)unbox_VkSemaphore((VkSemaphore)(*&cgen_var_0));
+    *(VkSemaphore*)&forUnmarshaling->semaphore =
+        (VkSemaphore)unbox_VkSemaphore((VkSemaphore)(*&cgen_var_0));
     memcpy((uint64_t*)&forUnmarshaling->value, *ptr, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
 }
 
 void reservedunmarshal_VkPhysicalDeviceBufferDeviceAddressFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceBufferDeviceAddressFeatures* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceBufferDeviceAddressFeatures* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -8095,15 +7957,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->bufferDeviceAddress, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -8113,16 +7977,12 @@
     *ptr += sizeof(VkBool32);
 }
 
-void reservedunmarshal_VkBufferDeviceAddressInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferDeviceAddressInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkBufferDeviceAddressInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkBufferDeviceAddressInfo* forUnmarshaling,
+                                                 uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -8130,15 +7990,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
@@ -8147,15 +8009,11 @@
 }
 
 void reservedunmarshal_VkBufferOpaqueCaptureAddressCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferOpaqueCaptureAddressCreateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBufferOpaqueCaptureAddressCreateInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -8163,30 +8021,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint64_t*)&forUnmarshaling->opaqueCaptureAddress, *ptr, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
 }
 
 void reservedunmarshal_VkMemoryOpaqueCaptureAddressAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryOpaqueCaptureAddressAllocateInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkMemoryOpaqueCaptureAddressAllocateInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -8194,30 +8050,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint64_t*)&forUnmarshaling->opaqueCaptureAddress, *ptr, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
 }
 
 void reservedunmarshal_VkDeviceMemoryOpaqueCaptureAddressInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceMemoryOpaqueCaptureAddressInfo* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDeviceMemoryOpaqueCaptureAddressInfo* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -8225,55 +8079,58 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkDeviceMemory*)&forUnmarshaling->memory = (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_0));
+    *(VkDeviceMemory*)&forUnmarshaling->memory =
+        (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_0));
 }
 
 #endif
 #ifdef VK_KHR_surface
-void reservedunmarshal_VkSurfaceCapabilitiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSurfaceCapabilitiesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkSurfaceCapabilitiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkSurfaceCapabilitiesKHR* forUnmarshaling,
+                                                uint8_t** ptr) {
     memcpy((uint32_t*)&forUnmarshaling->minImageCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->maxImageCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->currentExtent), ptr);
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->minImageExtent), ptr);
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->maxImageExtent), ptr);
+    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->currentExtent),
+                                 ptr);
+    reservedunmarshal_VkExtent2D(vkStream, rootType,
+                                 (VkExtent2D*)(&forUnmarshaling->minImageExtent), ptr);
+    reservedunmarshal_VkExtent2D(vkStream, rootType,
+                                 (VkExtent2D*)(&forUnmarshaling->maxImageExtent), ptr);
     memcpy((uint32_t*)&forUnmarshaling->maxImageArrayLayers, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((VkSurfaceTransformFlagsKHR*)&forUnmarshaling->supportedTransforms, *ptr, sizeof(VkSurfaceTransformFlagsKHR));
+    memcpy((VkSurfaceTransformFlagsKHR*)&forUnmarshaling->supportedTransforms, *ptr,
+           sizeof(VkSurfaceTransformFlagsKHR));
     *ptr += sizeof(VkSurfaceTransformFlagsKHR);
-    memcpy((VkSurfaceTransformFlagBitsKHR*)&forUnmarshaling->currentTransform, *ptr, sizeof(VkSurfaceTransformFlagBitsKHR));
+    memcpy((VkSurfaceTransformFlagBitsKHR*)&forUnmarshaling->currentTransform, *ptr,
+           sizeof(VkSurfaceTransformFlagBitsKHR));
     *ptr += sizeof(VkSurfaceTransformFlagBitsKHR);
-    memcpy((VkCompositeAlphaFlagsKHR*)&forUnmarshaling->supportedCompositeAlpha, *ptr, sizeof(VkCompositeAlphaFlagsKHR));
+    memcpy((VkCompositeAlphaFlagsKHR*)&forUnmarshaling->supportedCompositeAlpha, *ptr,
+           sizeof(VkCompositeAlphaFlagsKHR));
     *ptr += sizeof(VkCompositeAlphaFlagsKHR);
-    memcpy((VkImageUsageFlags*)&forUnmarshaling->supportedUsageFlags, *ptr, sizeof(VkImageUsageFlags));
+    memcpy((VkImageUsageFlags*)&forUnmarshaling->supportedUsageFlags, *ptr,
+           sizeof(VkImageUsageFlags));
     *ptr += sizeof(VkImageUsageFlags);
 }
 
-void reservedunmarshal_VkSurfaceFormatKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSurfaceFormatKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkSurfaceFormatKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkSurfaceFormatKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkFormat*)&forUnmarshaling->format, *ptr, sizeof(VkFormat));
     *ptr += sizeof(VkFormat);
     memcpy((VkColorSpaceKHR*)&forUnmarshaling->colorSpace, *ptr, sizeof(VkColorSpaceKHR));
@@ -8282,16 +8139,12 @@
 
 #endif
 #ifdef VK_KHR_swapchain
-void reservedunmarshal_VkSwapchainCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSwapchainCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkSwapchainCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkSwapchainCreateInfoKHR* forUnmarshaling,
+                                                uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -8299,29 +8152,34 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkSwapchainCreateFlagsKHR*)&forUnmarshaling->flags, *ptr, sizeof(VkSwapchainCreateFlagsKHR));
+    memcpy((VkSwapchainCreateFlagsKHR*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkSwapchainCreateFlagsKHR));
     *ptr += sizeof(VkSwapchainCreateFlagsKHR);
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkSurfaceKHR*)&forUnmarshaling->surface = (VkSurfaceKHR)unbox_VkSurfaceKHR((VkSurfaceKHR)(*&cgen_var_0));
+    *(VkSurfaceKHR*)&forUnmarshaling->surface =
+        (VkSurfaceKHR)unbox_VkSurfaceKHR((VkSurfaceKHR)(*&cgen_var_0));
     memcpy((uint32_t*)&forUnmarshaling->minImageCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((VkFormat*)&forUnmarshaling->imageFormat, *ptr, sizeof(VkFormat));
     *ptr += sizeof(VkFormat);
     memcpy((VkColorSpaceKHR*)&forUnmarshaling->imageColorSpace, *ptr, sizeof(VkColorSpaceKHR));
     *ptr += sizeof(VkColorSpaceKHR);
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->imageExtent), ptr);
+    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->imageExtent),
+                                 ptr);
     memcpy((uint32_t*)&forUnmarshaling->imageArrayLayers, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((VkImageUsageFlags*)&forUnmarshaling->imageUsage, *ptr, sizeof(VkImageUsageFlags));
@@ -8334,15 +8192,18 @@
     memcpy((uint32_t**)&forUnmarshaling->pQueueFamilyIndices, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pQueueFamilyIndices);
     *ptr += 8;
-    if (forUnmarshaling->pQueueFamilyIndices)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pQueueFamilyIndices, forUnmarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
-        memcpy((uint32_t*)forUnmarshaling->pQueueFamilyIndices, *ptr, forUnmarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
+    if (forUnmarshaling->pQueueFamilyIndices) {
+        vkStream->alloc((void**)&forUnmarshaling->pQueueFamilyIndices,
+                        forUnmarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
+        memcpy((uint32_t*)forUnmarshaling->pQueueFamilyIndices, *ptr,
+               forUnmarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
         *ptr += forUnmarshaling->queueFamilyIndexCount * sizeof(const uint32_t);
     }
-    memcpy((VkSurfaceTransformFlagBitsKHR*)&forUnmarshaling->preTransform, *ptr, sizeof(VkSurfaceTransformFlagBitsKHR));
+    memcpy((VkSurfaceTransformFlagBitsKHR*)&forUnmarshaling->preTransform, *ptr,
+           sizeof(VkSurfaceTransformFlagBitsKHR));
     *ptr += sizeof(VkSurfaceTransformFlagBitsKHR);
-    memcpy((VkCompositeAlphaFlagBitsKHR*)&forUnmarshaling->compositeAlpha, *ptr, sizeof(VkCompositeAlphaFlagBitsKHR));
+    memcpy((VkCompositeAlphaFlagBitsKHR*)&forUnmarshaling->compositeAlpha, *ptr,
+           sizeof(VkCompositeAlphaFlagBitsKHR));
     *ptr += sizeof(VkCompositeAlphaFlagBitsKHR);
     memcpy((VkPresentModeKHR*)&forUnmarshaling->presentMode, *ptr, sizeof(VkPresentModeKHR));
     *ptr += sizeof(VkPresentModeKHR);
@@ -8351,19 +8212,15 @@
     uint64_t cgen_var_2;
     memcpy((uint64_t*)&cgen_var_2, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkSwapchainKHR*)&forUnmarshaling->oldSwapchain = (VkSwapchainKHR)unbox_VkSwapchainKHR((VkSwapchainKHR)(*&cgen_var_2));
+    *(VkSwapchainKHR*)&forUnmarshaling->oldSwapchain =
+        (VkSwapchainKHR)unbox_VkSwapchainKHR((VkSwapchainKHR)(*&cgen_var_2));
 }
 
-void reservedunmarshal_VkPresentInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPresentInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkPresentInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkPresentInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -8371,73 +8228,75 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->waitSemaphoreCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pWaitSemaphores, forUnmarshaling->waitSemaphoreCount * sizeof(const VkSemaphore));
-    if (forUnmarshaling->waitSemaphoreCount)
-    {
+    vkStream->alloc((void**)&forUnmarshaling->pWaitSemaphores,
+                    forUnmarshaling->waitSemaphoreCount * sizeof(const VkSemaphore));
+    if (forUnmarshaling->waitSemaphoreCount) {
         uint8_t* cgen_var_0_ptr = (uint8_t*)(*ptr);
         *ptr += 8 * forUnmarshaling->waitSemaphoreCount;
-        if (forUnmarshaling)
-        {
-            for (uint32_t k = 0; k < forUnmarshaling->waitSemaphoreCount; ++k)
-            {
-                uint64_t tmpval; memcpy(&tmpval, cgen_var_0_ptr + k * 8, sizeof(uint64_t));
-                *(((VkSemaphore*)forUnmarshaling->pWaitSemaphores) + k) = (VkSemaphore)unbox_VkSemaphore((VkSemaphore)tmpval);
+        if (forUnmarshaling) {
+            for (uint32_t k = 0; k < forUnmarshaling->waitSemaphoreCount; ++k) {
+                uint64_t tmpval;
+                memcpy(&tmpval, cgen_var_0_ptr + k * 8, sizeof(uint64_t));
+                *(((VkSemaphore*)forUnmarshaling->pWaitSemaphores) + k) =
+                    (VkSemaphore)unbox_VkSemaphore((VkSemaphore)tmpval);
             }
         }
     }
     memcpy((uint32_t*)&forUnmarshaling->swapchainCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pSwapchains, forUnmarshaling->swapchainCount * sizeof(const VkSwapchainKHR));
-    if (forUnmarshaling->swapchainCount)
-    {
+    vkStream->alloc((void**)&forUnmarshaling->pSwapchains,
+                    forUnmarshaling->swapchainCount * sizeof(const VkSwapchainKHR));
+    if (forUnmarshaling->swapchainCount) {
         uint8_t* cgen_var_1_ptr = (uint8_t*)(*ptr);
         *ptr += 8 * forUnmarshaling->swapchainCount;
-        if (forUnmarshaling)
-        {
-            for (uint32_t k = 0; k < forUnmarshaling->swapchainCount; ++k)
-            {
-                uint64_t tmpval; memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
-                *(((VkSwapchainKHR*)forUnmarshaling->pSwapchains) + k) = (VkSwapchainKHR)unbox_VkSwapchainKHR((VkSwapchainKHR)tmpval);
+        if (forUnmarshaling) {
+            for (uint32_t k = 0; k < forUnmarshaling->swapchainCount; ++k) {
+                uint64_t tmpval;
+                memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
+                *(((VkSwapchainKHR*)forUnmarshaling->pSwapchains) + k) =
+                    (VkSwapchainKHR)unbox_VkSwapchainKHR((VkSwapchainKHR)tmpval);
             }
         }
     }
-    vkStream->alloc((void**)&forUnmarshaling->pImageIndices, forUnmarshaling->swapchainCount * sizeof(const uint32_t));
-    memcpy((uint32_t*)forUnmarshaling->pImageIndices, *ptr, forUnmarshaling->swapchainCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pImageIndices,
+                    forUnmarshaling->swapchainCount * sizeof(const uint32_t));
+    memcpy((uint32_t*)forUnmarshaling->pImageIndices, *ptr,
+           forUnmarshaling->swapchainCount * sizeof(const uint32_t));
     *ptr += forUnmarshaling->swapchainCount * sizeof(const uint32_t);
     // WARNING PTR CHECK
     memcpy((VkResult**)&forUnmarshaling->pResults, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pResults);
     *ptr += 8;
-    if (forUnmarshaling->pResults)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pResults, forUnmarshaling->swapchainCount * sizeof(VkResult));
-        memcpy((VkResult*)forUnmarshaling->pResults, *ptr, forUnmarshaling->swapchainCount * sizeof(VkResult));
+    if (forUnmarshaling->pResults) {
+        vkStream->alloc((void**)&forUnmarshaling->pResults,
+                        forUnmarshaling->swapchainCount * sizeof(VkResult));
+        memcpy((VkResult*)forUnmarshaling->pResults, *ptr,
+               forUnmarshaling->swapchainCount * sizeof(VkResult));
         *ptr += forUnmarshaling->swapchainCount * sizeof(VkResult);
     }
 }
 
-void reservedunmarshal_VkImageSwapchainCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageSwapchainCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkImageSwapchainCreateInfoKHR(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkImageSwapchainCreateInfoKHR* forUnmarshaling,
+                                                     uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -8445,32 +8304,31 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkSwapchainKHR*)&forUnmarshaling->swapchain = (VkSwapchainKHR)unbox_VkSwapchainKHR((VkSwapchainKHR)(*&cgen_var_0));
+    *(VkSwapchainKHR*)&forUnmarshaling->swapchain =
+        (VkSwapchainKHR)unbox_VkSwapchainKHR((VkSwapchainKHR)(*&cgen_var_0));
 }
 
 void reservedunmarshal_VkBindImageMemorySwapchainInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindImageMemorySwapchainInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBindImageMemorySwapchainInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -8478,34 +8336,33 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkSwapchainKHR*)&forUnmarshaling->swapchain = (VkSwapchainKHR)unbox_VkSwapchainKHR((VkSwapchainKHR)(*&cgen_var_0));
+    *(VkSwapchainKHR*)&forUnmarshaling->swapchain =
+        (VkSwapchainKHR)unbox_VkSwapchainKHR((VkSwapchainKHR)(*&cgen_var_0));
     memcpy((uint32_t*)&forUnmarshaling->imageIndex, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkAcquireNextImageInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAcquireNextImageInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkAcquireNextImageInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkAcquireNextImageInfoKHR* forUnmarshaling,
+                                                 uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -8513,26 +8370,30 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkSwapchainKHR*)&forUnmarshaling->swapchain = (VkSwapchainKHR)unbox_VkSwapchainKHR((VkSwapchainKHR)(*&cgen_var_0));
+    *(VkSwapchainKHR*)&forUnmarshaling->swapchain =
+        (VkSwapchainKHR)unbox_VkSwapchainKHR((VkSwapchainKHR)(*&cgen_var_0));
     memcpy((uint64_t*)&forUnmarshaling->timeout, *ptr, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
     uint64_t cgen_var_1;
     memcpy((uint64_t*)&cgen_var_1, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkSemaphore*)&forUnmarshaling->semaphore = (VkSemaphore)unbox_VkSemaphore((VkSemaphore)(*&cgen_var_1));
+    *(VkSemaphore*)&forUnmarshaling->semaphore =
+        (VkSemaphore)unbox_VkSemaphore((VkSemaphore)(*&cgen_var_1));
     uint64_t cgen_var_2;
     memcpy((uint64_t*)&cgen_var_2, *ptr, 1 * 8);
     *ptr += 1 * 8;
@@ -8542,15 +8403,11 @@
 }
 
 void reservedunmarshal_VkDeviceGroupPresentCapabilitiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceGroupPresentCapabilitiesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDeviceGroupPresentCapabilitiesKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -8558,32 +8415,32 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((uint32_t*)forUnmarshaling->presentMask, *ptr, VK_MAX_DEVICE_GROUP_SIZE * sizeof(uint32_t));
+    memcpy((uint32_t*)forUnmarshaling->presentMask, *ptr,
+           VK_MAX_DEVICE_GROUP_SIZE * sizeof(uint32_t));
     *ptr += VK_MAX_DEVICE_GROUP_SIZE * sizeof(uint32_t);
-    memcpy((VkDeviceGroupPresentModeFlagsKHR*)&forUnmarshaling->modes, *ptr, sizeof(VkDeviceGroupPresentModeFlagsKHR));
+    memcpy((VkDeviceGroupPresentModeFlagsKHR*)&forUnmarshaling->modes, *ptr,
+           sizeof(VkDeviceGroupPresentModeFlagsKHR));
     *ptr += sizeof(VkDeviceGroupPresentModeFlagsKHR);
 }
 
-void reservedunmarshal_VkDeviceGroupPresentInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceGroupPresentInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDeviceGroupPresentInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkDeviceGroupPresentInfoKHR* forUnmarshaling,
+                                                   uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -8591,35 +8448,36 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->swapchainCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pDeviceMasks, forUnmarshaling->swapchainCount * sizeof(const uint32_t));
-    memcpy((uint32_t*)forUnmarshaling->pDeviceMasks, *ptr, forUnmarshaling->swapchainCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pDeviceMasks,
+                    forUnmarshaling->swapchainCount * sizeof(const uint32_t));
+    memcpy((uint32_t*)forUnmarshaling->pDeviceMasks, *ptr,
+           forUnmarshaling->swapchainCount * sizeof(const uint32_t));
     *ptr += forUnmarshaling->swapchainCount * sizeof(const uint32_t);
-    memcpy((VkDeviceGroupPresentModeFlagBitsKHR*)&forUnmarshaling->mode, *ptr, sizeof(VkDeviceGroupPresentModeFlagBitsKHR));
+    memcpy((VkDeviceGroupPresentModeFlagBitsKHR*)&forUnmarshaling->mode, *ptr,
+           sizeof(VkDeviceGroupPresentModeFlagBitsKHR));
     *ptr += sizeof(VkDeviceGroupPresentModeFlagBitsKHR);
 }
 
 void reservedunmarshal_VkDeviceGroupSwapchainCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceGroupSwapchainCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDeviceGroupSwapchainCreateInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -8627,43 +8485,40 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkDeviceGroupPresentModeFlagsKHR*)&forUnmarshaling->modes, *ptr, sizeof(VkDeviceGroupPresentModeFlagsKHR));
+    memcpy((VkDeviceGroupPresentModeFlagsKHR*)&forUnmarshaling->modes, *ptr,
+           sizeof(VkDeviceGroupPresentModeFlagsKHR));
     *ptr += sizeof(VkDeviceGroupPresentModeFlagsKHR);
 }
 
 #endif
 #ifdef VK_KHR_display
-void reservedunmarshal_VkDisplayModeParametersKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayModeParametersKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->visibleRegion), ptr);
+void reservedunmarshal_VkDisplayModeParametersKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                  VkDisplayModeParametersKHR* forUnmarshaling,
+                                                  uint8_t** ptr) {
+    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->visibleRegion),
+                                 ptr);
     memcpy((uint32_t*)&forUnmarshaling->refreshRate, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkDisplayModeCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayModeCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDisplayModeCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                  VkDisplayModeCreateInfoKHR* forUnmarshaling,
+                                                  uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -8671,80 +8526,89 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkDisplayModeCreateFlagsKHR*)&forUnmarshaling->flags, *ptr, sizeof(VkDisplayModeCreateFlagsKHR));
+    memcpy((VkDisplayModeCreateFlagsKHR*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkDisplayModeCreateFlagsKHR));
     *ptr += sizeof(VkDisplayModeCreateFlagsKHR);
-    reservedunmarshal_VkDisplayModeParametersKHR(vkStream, rootType, (VkDisplayModeParametersKHR*)(&forUnmarshaling->parameters), ptr);
+    reservedunmarshal_VkDisplayModeParametersKHR(
+        vkStream, rootType, (VkDisplayModeParametersKHR*)(&forUnmarshaling->parameters), ptr);
 }
 
-void reservedunmarshal_VkDisplayModePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayModePropertiesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDisplayModePropertiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                  VkDisplayModePropertiesKHR* forUnmarshaling,
+                                                  uint8_t** ptr) {
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkDisplayModeKHR*)&forUnmarshaling->displayMode = (VkDisplayModeKHR)unbox_VkDisplayModeKHR((VkDisplayModeKHR)(*&cgen_var_0));
-    reservedunmarshal_VkDisplayModeParametersKHR(vkStream, rootType, (VkDisplayModeParametersKHR*)(&forUnmarshaling->parameters), ptr);
+    *(VkDisplayModeKHR*)&forUnmarshaling->displayMode =
+        (VkDisplayModeKHR)unbox_VkDisplayModeKHR((VkDisplayModeKHR)(*&cgen_var_0));
+    reservedunmarshal_VkDisplayModeParametersKHR(
+        vkStream, rootType, (VkDisplayModeParametersKHR*)(&forUnmarshaling->parameters), ptr);
 }
 
-void reservedunmarshal_VkDisplayPlaneCapabilitiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayPlaneCapabilitiesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
-    memcpy((VkDisplayPlaneAlphaFlagsKHR*)&forUnmarshaling->supportedAlpha, *ptr, sizeof(VkDisplayPlaneAlphaFlagsKHR));
+void reservedunmarshal_VkDisplayPlaneCapabilitiesKHR(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkDisplayPlaneCapabilitiesKHR* forUnmarshaling,
+                                                     uint8_t** ptr) {
+    memcpy((VkDisplayPlaneAlphaFlagsKHR*)&forUnmarshaling->supportedAlpha, *ptr,
+           sizeof(VkDisplayPlaneAlphaFlagsKHR));
     *ptr += sizeof(VkDisplayPlaneAlphaFlagsKHR);
-    reservedunmarshal_VkOffset2D(vkStream, rootType, (VkOffset2D*)(&forUnmarshaling->minSrcPosition), ptr);
-    reservedunmarshal_VkOffset2D(vkStream, rootType, (VkOffset2D*)(&forUnmarshaling->maxSrcPosition), ptr);
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->minSrcExtent), ptr);
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->maxSrcExtent), ptr);
-    reservedunmarshal_VkOffset2D(vkStream, rootType, (VkOffset2D*)(&forUnmarshaling->minDstPosition), ptr);
-    reservedunmarshal_VkOffset2D(vkStream, rootType, (VkOffset2D*)(&forUnmarshaling->maxDstPosition), ptr);
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->minDstExtent), ptr);
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->maxDstExtent), ptr);
+    reservedunmarshal_VkOffset2D(vkStream, rootType,
+                                 (VkOffset2D*)(&forUnmarshaling->minSrcPosition), ptr);
+    reservedunmarshal_VkOffset2D(vkStream, rootType,
+                                 (VkOffset2D*)(&forUnmarshaling->maxSrcPosition), ptr);
+    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->minSrcExtent),
+                                 ptr);
+    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->maxSrcExtent),
+                                 ptr);
+    reservedunmarshal_VkOffset2D(vkStream, rootType,
+                                 (VkOffset2D*)(&forUnmarshaling->minDstPosition), ptr);
+    reservedunmarshal_VkOffset2D(vkStream, rootType,
+                                 (VkOffset2D*)(&forUnmarshaling->maxDstPosition), ptr);
+    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->minDstExtent),
+                                 ptr);
+    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->maxDstExtent),
+                                 ptr);
 }
 
-void reservedunmarshal_VkDisplayPlanePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayPlanePropertiesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDisplayPlanePropertiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkDisplayPlanePropertiesKHR* forUnmarshaling,
+                                                   uint8_t** ptr) {
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkDisplayKHR*)&forUnmarshaling->currentDisplay = (VkDisplayKHR)unbox_VkDisplayKHR((VkDisplayKHR)(*&cgen_var_0));
+    *(VkDisplayKHR*)&forUnmarshaling->currentDisplay =
+        (VkDisplayKHR)unbox_VkDisplayKHR((VkDisplayKHR)(*&cgen_var_0));
     memcpy((uint32_t*)&forUnmarshaling->currentStackIndex, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkDisplayPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayPropertiesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDisplayPropertiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkDisplayPropertiesKHR* forUnmarshaling,
+                                              uint8_t** ptr) {
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkDisplayKHR*)&forUnmarshaling->display = (VkDisplayKHR)unbox_VkDisplayKHR((VkDisplayKHR)(*&cgen_var_0));
+    *(VkDisplayKHR*)&forUnmarshaling->display =
+        (VkDisplayKHR)unbox_VkDisplayKHR((VkDisplayKHR)(*&cgen_var_0));
     vkStream->loadStringInPlaceWithStreamPtr((char**)&forUnmarshaling->displayName, ptr);
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->physicalDimensions), ptr);
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->physicalResolution), ptr);
-    memcpy((VkSurfaceTransformFlagsKHR*)&forUnmarshaling->supportedTransforms, *ptr, sizeof(VkSurfaceTransformFlagsKHR));
+    reservedunmarshal_VkExtent2D(vkStream, rootType,
+                                 (VkExtent2D*)(&forUnmarshaling->physicalDimensions), ptr);
+    reservedunmarshal_VkExtent2D(vkStream, rootType,
+                                 (VkExtent2D*)(&forUnmarshaling->physicalResolution), ptr);
+    memcpy((VkSurfaceTransformFlagsKHR*)&forUnmarshaling->supportedTransforms, *ptr,
+           sizeof(VkSurfaceTransformFlagsKHR));
     *ptr += sizeof(VkSurfaceTransformFlagsKHR);
     memcpy((VkBool32*)&forUnmarshaling->planeReorderPossible, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -8752,16 +8616,13 @@
     *ptr += sizeof(VkBool32);
 }
 
-void reservedunmarshal_VkDisplaySurfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplaySurfaceCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDisplaySurfaceCreateInfoKHR(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkDisplaySurfaceCreateInfoKHR* forUnmarshaling,
+                                                     uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -8769,47 +8630,50 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkDisplaySurfaceCreateFlagsKHR*)&forUnmarshaling->flags, *ptr, sizeof(VkDisplaySurfaceCreateFlagsKHR));
+    memcpy((VkDisplaySurfaceCreateFlagsKHR*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkDisplaySurfaceCreateFlagsKHR));
     *ptr += sizeof(VkDisplaySurfaceCreateFlagsKHR);
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkDisplayModeKHR*)&forUnmarshaling->displayMode = (VkDisplayModeKHR)unbox_VkDisplayModeKHR((VkDisplayModeKHR)(*&cgen_var_0));
+    *(VkDisplayModeKHR*)&forUnmarshaling->displayMode =
+        (VkDisplayModeKHR)unbox_VkDisplayModeKHR((VkDisplayModeKHR)(*&cgen_var_0));
     memcpy((uint32_t*)&forUnmarshaling->planeIndex, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->planeStackIndex, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((VkSurfaceTransformFlagBitsKHR*)&forUnmarshaling->transform, *ptr, sizeof(VkSurfaceTransformFlagBitsKHR));
+    memcpy((VkSurfaceTransformFlagBitsKHR*)&forUnmarshaling->transform, *ptr,
+           sizeof(VkSurfaceTransformFlagBitsKHR));
     *ptr += sizeof(VkSurfaceTransformFlagBitsKHR);
     memcpy((float*)&forUnmarshaling->globalAlpha, *ptr, sizeof(float));
     *ptr += sizeof(float);
-    memcpy((VkDisplayPlaneAlphaFlagBitsKHR*)&forUnmarshaling->alphaMode, *ptr, sizeof(VkDisplayPlaneAlphaFlagBitsKHR));
+    memcpy((VkDisplayPlaneAlphaFlagBitsKHR*)&forUnmarshaling->alphaMode, *ptr,
+           sizeof(VkDisplayPlaneAlphaFlagBitsKHR));
     *ptr += sizeof(VkDisplayPlaneAlphaFlagBitsKHR);
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->imageExtent), ptr);
+    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->imageExtent),
+                                 ptr);
 }
 
 #endif
 #ifdef VK_KHR_display_swapchain
-void reservedunmarshal_VkDisplayPresentInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayPresentInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDisplayPresentInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkDisplayPresentInfoKHR* forUnmarshaling,
+                                               uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -8817,15 +8681,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     reservedunmarshal_VkRect2D(vkStream, rootType, (VkRect2D*)(&forUnmarshaling->srcRect), ptr);
     reservedunmarshal_VkRect2D(vkStream, rootType, (VkRect2D*)(&forUnmarshaling->dstRect), ptr);
@@ -8835,16 +8701,12 @@
 
 #endif
 #ifdef VK_KHR_xlib_surface
-void reservedunmarshal_VkXlibSurfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkXlibSurfaceCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkXlibSurfaceCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                  VkXlibSurfaceCreateInfoKHR* forUnmarshaling,
+                                                  uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -8852,24 +8714,26 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkXlibSurfaceCreateFlagsKHR*)&forUnmarshaling->flags, *ptr, sizeof(VkXlibSurfaceCreateFlagsKHR));
+    memcpy((VkXlibSurfaceCreateFlagsKHR*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkXlibSurfaceCreateFlagsKHR));
     *ptr += sizeof(VkXlibSurfaceCreateFlagsKHR);
     // WARNING PTR CHECK
     memcpy((Display**)&forUnmarshaling->dpy, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->dpy);
     *ptr += 8;
-    if (forUnmarshaling->dpy)
-    {
+    if (forUnmarshaling->dpy) {
         vkStream->alloc((void**)&forUnmarshaling->dpy, sizeof(Display));
         memcpy((Display*)forUnmarshaling->dpy, *ptr, sizeof(Display));
         *ptr += sizeof(Display);
@@ -8880,30 +8744,22 @@
 
 #endif
 #ifdef VK_KHR_xcb_surface
-void reservedunmarshal_VkXcbSurfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkXcbSurfaceCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
-    
+void reservedunmarshal_VkXcbSurfaceCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkXcbSurfaceCreateInfoKHR* forUnmarshaling,
+                                                 uint8_t** ptr) {
     // This struct should never be marshaled / unmarshaled.
     __builtin_trap();
-    
 }
 
 #endif
 #ifdef VK_KHR_wayland_surface
-void reservedunmarshal_VkWaylandSurfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkWaylandSurfaceCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkWaylandSurfaceCreateInfoKHR(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkWaylandSurfaceCreateInfoKHR* forUnmarshaling,
+                                                     uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -8911,24 +8767,26 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkWaylandSurfaceCreateFlagsKHR*)&forUnmarshaling->flags, *ptr, sizeof(VkWaylandSurfaceCreateFlagsKHR));
+    memcpy((VkWaylandSurfaceCreateFlagsKHR*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkWaylandSurfaceCreateFlagsKHR));
     *ptr += sizeof(VkWaylandSurfaceCreateFlagsKHR);
     // WARNING PTR CHECK
     memcpy((wl_display**)&forUnmarshaling->display, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->display);
     *ptr += 8;
-    if (forUnmarshaling->display)
-    {
+    if (forUnmarshaling->display) {
         vkStream->alloc((void**)&forUnmarshaling->display, sizeof(wl_display));
         memcpy((wl_display*)forUnmarshaling->display, *ptr, sizeof(wl_display));
         *ptr += sizeof(wl_display);
@@ -8937,8 +8795,7 @@
     memcpy((wl_surface**)&forUnmarshaling->surface, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->surface);
     *ptr += 8;
-    if (forUnmarshaling->surface)
-    {
+    if (forUnmarshaling->surface) {
         vkStream->alloc((void**)&forUnmarshaling->surface, sizeof(wl_surface));
         memcpy((wl_surface*)forUnmarshaling->surface, *ptr, sizeof(wl_surface));
         *ptr += sizeof(wl_surface);
@@ -8947,16 +8804,13 @@
 
 #endif
 #ifdef VK_KHR_android_surface
-void reservedunmarshal_VkAndroidSurfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAndroidSurfaceCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkAndroidSurfaceCreateInfoKHR(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkAndroidSurfaceCreateInfoKHR* forUnmarshaling,
+                                                     uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -8964,24 +8818,26 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkAndroidSurfaceCreateFlagsKHR*)&forUnmarshaling->flags, *ptr, sizeof(VkAndroidSurfaceCreateFlagsKHR));
+    memcpy((VkAndroidSurfaceCreateFlagsKHR*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkAndroidSurfaceCreateFlagsKHR));
     *ptr += sizeof(VkAndroidSurfaceCreateFlagsKHR);
     // WARNING PTR CHECK
     memcpy((ANativeWindow**)&forUnmarshaling->window, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->window);
     *ptr += 8;
-    if (forUnmarshaling->window)
-    {
+    if (forUnmarshaling->window) {
         vkStream->alloc((void**)&forUnmarshaling->window, sizeof(ANativeWindow));
         memcpy((ANativeWindow*)forUnmarshaling->window, *ptr, sizeof(ANativeWindow));
         *ptr += sizeof(ANativeWindow);
@@ -8990,16 +8846,12 @@
 
 #endif
 #ifdef VK_KHR_win32_surface
-void reservedunmarshal_VkWin32SurfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkWin32SurfaceCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkWin32SurfaceCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkWin32SurfaceCreateInfoKHR* forUnmarshaling,
+                                                   uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -9007,17 +8859,20 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkWin32SurfaceCreateFlagsKHR*)&forUnmarshaling->flags, *ptr, sizeof(VkWin32SurfaceCreateFlagsKHR));
+    memcpy((VkWin32SurfaceCreateFlagsKHR*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkWin32SurfaceCreateFlagsKHR));
     *ptr += sizeof(VkWin32SurfaceCreateFlagsKHR);
     memcpy((HINSTANCE*)&forUnmarshaling->hinstance, *ptr, sizeof(HINSTANCE));
     *ptr += sizeof(HINSTANCE);
@@ -9030,15 +8885,11 @@
 #endif
 #ifdef VK_KHR_video_queue
 void reservedunmarshal_VkVideoQueueFamilyProperties2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoQueueFamilyProperties2KHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoQueueFamilyProperties2KHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -9046,30 +8897,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkVideoCodecOperationFlagsKHR*)&forUnmarshaling->videoCodecOperations, *ptr, sizeof(VkVideoCodecOperationFlagsKHR));
+    memcpy((VkVideoCodecOperationFlagsKHR*)&forUnmarshaling->videoCodecOperations, *ptr,
+           sizeof(VkVideoCodecOperationFlagsKHR));
     *ptr += sizeof(VkVideoCodecOperationFlagsKHR);
 }
 
-void reservedunmarshal_VkVideoProfileKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoProfileKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkVideoProfileKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkVideoProfileKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -9077,36 +8926,37 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkVideoCodecOperationFlagBitsKHR*)&forUnmarshaling->videoCodecOperation, *ptr, sizeof(VkVideoCodecOperationFlagBitsKHR));
+    memcpy((VkVideoCodecOperationFlagBitsKHR*)&forUnmarshaling->videoCodecOperation, *ptr,
+           sizeof(VkVideoCodecOperationFlagBitsKHR));
     *ptr += sizeof(VkVideoCodecOperationFlagBitsKHR);
-    memcpy((VkVideoChromaSubsamplingFlagsKHR*)&forUnmarshaling->chromaSubsampling, *ptr, sizeof(VkVideoChromaSubsamplingFlagsKHR));
+    memcpy((VkVideoChromaSubsamplingFlagsKHR*)&forUnmarshaling->chromaSubsampling, *ptr,
+           sizeof(VkVideoChromaSubsamplingFlagsKHR));
     *ptr += sizeof(VkVideoChromaSubsamplingFlagsKHR);
-    memcpy((VkVideoComponentBitDepthFlagsKHR*)&forUnmarshaling->lumaBitDepth, *ptr, sizeof(VkVideoComponentBitDepthFlagsKHR));
+    memcpy((VkVideoComponentBitDepthFlagsKHR*)&forUnmarshaling->lumaBitDepth, *ptr,
+           sizeof(VkVideoComponentBitDepthFlagsKHR));
     *ptr += sizeof(VkVideoComponentBitDepthFlagsKHR);
-    memcpy((VkVideoComponentBitDepthFlagsKHR*)&forUnmarshaling->chromaBitDepth, *ptr, sizeof(VkVideoComponentBitDepthFlagsKHR));
+    memcpy((VkVideoComponentBitDepthFlagsKHR*)&forUnmarshaling->chromaBitDepth, *ptr,
+           sizeof(VkVideoComponentBitDepthFlagsKHR));
     *ptr += sizeof(VkVideoComponentBitDepthFlagsKHR);
 }
 
-void reservedunmarshal_VkVideoProfilesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoProfilesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkVideoProfilesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkVideoProfilesKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -9114,32 +8964,31 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->profileCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     vkStream->alloc((void**)&forUnmarshaling->pProfiles, sizeof(const VkVideoProfileKHR));
-    reservedunmarshal_VkVideoProfileKHR(vkStream, rootType, (VkVideoProfileKHR*)(forUnmarshaling->pProfiles), ptr);
+    reservedunmarshal_VkVideoProfileKHR(vkStream, rootType,
+                                        (VkVideoProfileKHR*)(forUnmarshaling->pProfiles), ptr);
 }
 
-void reservedunmarshal_VkVideoCapabilitiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoCapabilitiesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkVideoCapabilitiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkVideoCapabilitiesKHR* forUnmarshaling,
+                                              uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -9147,25 +8996,33 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkVideoCapabilityFlagsKHR*)&forUnmarshaling->capabilityFlags, *ptr, sizeof(VkVideoCapabilityFlagsKHR));
+    memcpy((VkVideoCapabilityFlagsKHR*)&forUnmarshaling->capabilityFlags, *ptr,
+           sizeof(VkVideoCapabilityFlagsKHR));
     *ptr += sizeof(VkVideoCapabilityFlagsKHR);
-    memcpy((VkDeviceSize*)&forUnmarshaling->minBitstreamBufferOffsetAlignment, *ptr, sizeof(VkDeviceSize));
+    memcpy((VkDeviceSize*)&forUnmarshaling->minBitstreamBufferOffsetAlignment, *ptr,
+           sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
-    memcpy((VkDeviceSize*)&forUnmarshaling->minBitstreamBufferSizeAlignment, *ptr, sizeof(VkDeviceSize));
+    memcpy((VkDeviceSize*)&forUnmarshaling->minBitstreamBufferSizeAlignment, *ptr,
+           sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->videoPictureExtentGranularity), ptr);
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->minExtent), ptr);
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->maxExtent), ptr);
+    reservedunmarshal_VkExtent2D(
+        vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->videoPictureExtentGranularity), ptr);
+    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->minExtent),
+                                 ptr);
+    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->maxExtent),
+                                 ptr);
     memcpy((uint32_t*)&forUnmarshaling->maxReferencePicturesSlotsCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->maxReferencePicturesActiveCount, *ptr, sizeof(uint32_t));
@@ -9173,15 +9030,11 @@
 }
 
 void reservedunmarshal_VkPhysicalDeviceVideoFormatInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceVideoFormatInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceVideoFormatInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -9189,32 +9042,31 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkImageUsageFlags*)&forUnmarshaling->imageUsage, *ptr, sizeof(VkImageUsageFlags));
     *ptr += sizeof(VkImageUsageFlags);
     vkStream->alloc((void**)&forUnmarshaling->pVideoProfiles, sizeof(const VkVideoProfilesKHR));
-    reservedunmarshal_VkVideoProfilesKHR(vkStream, rootType, (VkVideoProfilesKHR*)(forUnmarshaling->pVideoProfiles), ptr);
+    reservedunmarshal_VkVideoProfilesKHR(
+        vkStream, rootType, (VkVideoProfilesKHR*)(forUnmarshaling->pVideoProfiles), ptr);
 }
 
-void reservedunmarshal_VkVideoFormatPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoFormatPropertiesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkVideoFormatPropertiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                  VkVideoFormatPropertiesKHR* forUnmarshaling,
+                                                  uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -9222,30 +9074,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkFormat*)&forUnmarshaling->format, *ptr, sizeof(VkFormat));
     *ptr += sizeof(VkFormat);
 }
 
-void reservedunmarshal_VkVideoPictureResourceKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoPictureResourceKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkVideoPictureResourceKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkVideoPictureResourceKHR* forUnmarshaling,
+                                                 uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -9253,36 +9103,37 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    reservedunmarshal_VkOffset2D(vkStream, rootType, (VkOffset2D*)(&forUnmarshaling->codedOffset), ptr);
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->codedExtent), ptr);
+    reservedunmarshal_VkOffset2D(vkStream, rootType, (VkOffset2D*)(&forUnmarshaling->codedOffset),
+                                 ptr);
+    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->codedExtent),
+                                 ptr);
     memcpy((uint32_t*)&forUnmarshaling->baseArrayLayer, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkImageView*)&forUnmarshaling->imageViewBinding = (VkImageView)unbox_VkImageView((VkImageView)(*&cgen_var_0));
+    *(VkImageView*)&forUnmarshaling->imageViewBinding =
+        (VkImageView)unbox_VkImageView((VkImageView)(*&cgen_var_0));
 }
 
-void reservedunmarshal_VkVideoReferenceSlotKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoReferenceSlotKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkVideoReferenceSlotKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkVideoReferenceSlotKHR* forUnmarshaling,
+                                               uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -9290,32 +9141,33 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((int8_t*)&forUnmarshaling->slotIndex, *ptr, sizeof(int8_t));
     *ptr += sizeof(int8_t);
-    vkStream->alloc((void**)&forUnmarshaling->pPictureResource, sizeof(const VkVideoPictureResourceKHR));
-    reservedunmarshal_VkVideoPictureResourceKHR(vkStream, rootType, (VkVideoPictureResourceKHR*)(forUnmarshaling->pPictureResource), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pPictureResource,
+                    sizeof(const VkVideoPictureResourceKHR));
+    reservedunmarshal_VkVideoPictureResourceKHR(
+        vkStream, rootType, (VkVideoPictureResourceKHR*)(forUnmarshaling->pPictureResource), ptr);
 }
 
-void reservedunmarshal_VkVideoGetMemoryPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoGetMemoryPropertiesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkVideoGetMemoryPropertiesKHR(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkVideoGetMemoryPropertiesKHR* forUnmarshaling,
+                                                     uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -9323,32 +9175,30 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->memoryBindIndex, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     vkStream->alloc((void**)&forUnmarshaling->pMemoryRequirements, sizeof(VkMemoryRequirements2));
-    reservedunmarshal_VkMemoryRequirements2(vkStream, rootType, (VkMemoryRequirements2*)(forUnmarshaling->pMemoryRequirements), ptr);
+    reservedunmarshal_VkMemoryRequirements2(
+        vkStream, rootType, (VkMemoryRequirements2*)(forUnmarshaling->pMemoryRequirements), ptr);
 }
 
-void reservedunmarshal_VkVideoBindMemoryKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoBindMemoryKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkVideoBindMemoryKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkVideoBindMemoryKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -9356,38 +9206,37 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->memoryBindIndex, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkDeviceMemory*)&forUnmarshaling->memory = (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_0));
+    *(VkDeviceMemory*)&forUnmarshaling->memory =
+        (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_0));
     memcpy((VkDeviceSize*)&forUnmarshaling->memoryOffset, *ptr, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
     memcpy((VkDeviceSize*)&forUnmarshaling->memorySize, *ptr, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
 }
 
-void reservedunmarshal_VkVideoSessionCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoSessionCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkVideoSessionCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkVideoSessionCreateInfoKHR* forUnmarshaling,
+                                                   uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -9395,25 +9244,30 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->queueFamilyIndex, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((VkVideoSessionCreateFlagsKHR*)&forUnmarshaling->flags, *ptr, sizeof(VkVideoSessionCreateFlagsKHR));
+    memcpy((VkVideoSessionCreateFlagsKHR*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkVideoSessionCreateFlagsKHR));
     *ptr += sizeof(VkVideoSessionCreateFlagsKHR);
     vkStream->alloc((void**)&forUnmarshaling->pVideoProfile, sizeof(const VkVideoProfileKHR));
-    reservedunmarshal_VkVideoProfileKHR(vkStream, rootType, (VkVideoProfileKHR*)(forUnmarshaling->pVideoProfile), ptr);
+    reservedunmarshal_VkVideoProfileKHR(vkStream, rootType,
+                                        (VkVideoProfileKHR*)(forUnmarshaling->pVideoProfile), ptr);
     memcpy((VkFormat*)&forUnmarshaling->pictureFormat, *ptr, sizeof(VkFormat));
     *ptr += sizeof(VkFormat);
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->maxCodedExtent), ptr);
+    reservedunmarshal_VkExtent2D(vkStream, rootType,
+                                 (VkExtent2D*)(&forUnmarshaling->maxCodedExtent), ptr);
     memcpy((VkFormat*)&forUnmarshaling->referencePicturesFormat, *ptr, sizeof(VkFormat));
     *ptr += sizeof(VkFormat);
     memcpy((uint32_t*)&forUnmarshaling->maxReferencePicturesSlotsCount, *ptr, sizeof(uint32_t));
@@ -9423,15 +9277,11 @@
 }
 
 void reservedunmarshal_VkVideoSessionParametersCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoSessionParametersCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoSessionParametersCreateInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -9439,17 +9289,20 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkVideoSessionParametersKHR*)&forUnmarshaling->videoSessionParametersTemplate, (*ptr), 8);
+    memcpy((VkVideoSessionParametersKHR*)&forUnmarshaling->videoSessionParametersTemplate, (*ptr),
+           8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->videoSessionParametersTemplate);
     *ptr += 8;
     memcpy((VkVideoSessionKHR*)&forUnmarshaling->videoSession, (*ptr), 8);
@@ -9458,15 +9311,11 @@
 }
 
 void reservedunmarshal_VkVideoSessionParametersUpdateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoSessionParametersUpdateInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoSessionParametersUpdateInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -9474,30 +9323,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->updateSequenceCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkVideoBeginCodingInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoBeginCodingInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkVideoBeginCodingInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkVideoBeginCodingInfoKHR* forUnmarshaling,
+                                                 uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -9505,19 +9352,23 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkVideoBeginCodingFlagsKHR*)&forUnmarshaling->flags, *ptr, sizeof(VkVideoBeginCodingFlagsKHR));
+    memcpy((VkVideoBeginCodingFlagsKHR*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkVideoBeginCodingFlagsKHR));
     *ptr += sizeof(VkVideoBeginCodingFlagsKHR);
-    memcpy((VkVideoCodingQualityPresetFlagsKHR*)&forUnmarshaling->codecQualityPreset, *ptr, sizeof(VkVideoCodingQualityPresetFlagsKHR));
+    memcpy((VkVideoCodingQualityPresetFlagsKHR*)&forUnmarshaling->codecQualityPreset, *ptr,
+           sizeof(VkVideoCodingQualityPresetFlagsKHR));
     *ptr += sizeof(VkVideoCodingQualityPresetFlagsKHR);
     memcpy((VkVideoSessionKHR*)&forUnmarshaling->videoSession, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->videoSession);
@@ -9527,23 +9378,21 @@
     *ptr += 8;
     memcpy((uint32_t*)&forUnmarshaling->referenceSlotCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pReferenceSlots, forUnmarshaling->referenceSlotCount * sizeof(const VkVideoReferenceSlotKHR));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->referenceSlotCount; ++i)
-    {
-        reservedunmarshal_VkVideoReferenceSlotKHR(vkStream, rootType, (VkVideoReferenceSlotKHR*)(forUnmarshaling->pReferenceSlots + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pReferenceSlots,
+                    forUnmarshaling->referenceSlotCount * sizeof(const VkVideoReferenceSlotKHR));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->referenceSlotCount; ++i) {
+        reservedunmarshal_VkVideoReferenceSlotKHR(
+            vkStream, rootType, (VkVideoReferenceSlotKHR*)(forUnmarshaling->pReferenceSlots + i),
+            ptr);
     }
 }
 
-void reservedunmarshal_VkVideoEndCodingInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEndCodingInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkVideoEndCodingInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkVideoEndCodingInfoKHR* forUnmarshaling,
+                                               uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -9551,30 +9400,29 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkVideoEndCodingFlagsKHR*)&forUnmarshaling->flags, *ptr, sizeof(VkVideoEndCodingFlagsKHR));
+    memcpy((VkVideoEndCodingFlagsKHR*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkVideoEndCodingFlagsKHR));
     *ptr += sizeof(VkVideoEndCodingFlagsKHR);
 }
 
-void reservedunmarshal_VkVideoCodingControlInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoCodingControlInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkVideoCodingControlInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkVideoCodingControlInfoKHR* forUnmarshaling,
+                                                   uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -9582,32 +9430,30 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkVideoCodingControlFlagsKHR*)&forUnmarshaling->flags, *ptr, sizeof(VkVideoCodingControlFlagsKHR));
+    memcpy((VkVideoCodingControlFlagsKHR*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkVideoCodingControlFlagsKHR));
     *ptr += sizeof(VkVideoCodingControlFlagsKHR);
 }
 
 #endif
 #ifdef VK_KHR_video_decode_queue
-void reservedunmarshal_VkVideoDecodeInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkVideoDecodeInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkVideoDecodeInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -9615,20 +9461,24 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkVideoDecodeFlagsKHR*)&forUnmarshaling->flags, *ptr, sizeof(VkVideoDecodeFlagsKHR));
     *ptr += sizeof(VkVideoDecodeFlagsKHR);
-    reservedunmarshal_VkOffset2D(vkStream, rootType, (VkOffset2D*)(&forUnmarshaling->codedOffset), ptr);
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->codedExtent), ptr);
+    reservedunmarshal_VkOffset2D(vkStream, rootType, (VkOffset2D*)(&forUnmarshaling->codedOffset),
+                                 ptr);
+    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->codedExtent),
+                                 ptr);
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
@@ -9637,30 +9487,33 @@
     *ptr += sizeof(VkDeviceSize);
     memcpy((VkDeviceSize*)&forUnmarshaling->srcBufferRange, *ptr, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
-    reservedunmarshal_VkVideoPictureResourceKHR(vkStream, rootType, (VkVideoPictureResourceKHR*)(&forUnmarshaling->dstPictureResource), ptr);
-    vkStream->alloc((void**)&forUnmarshaling->pSetupReferenceSlot, sizeof(const VkVideoReferenceSlotKHR));
-    reservedunmarshal_VkVideoReferenceSlotKHR(vkStream, rootType, (VkVideoReferenceSlotKHR*)(forUnmarshaling->pSetupReferenceSlot), ptr);
+    reservedunmarshal_VkVideoPictureResourceKHR(
+        vkStream, rootType, (VkVideoPictureResourceKHR*)(&forUnmarshaling->dstPictureResource),
+        ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pSetupReferenceSlot,
+                    sizeof(const VkVideoReferenceSlotKHR));
+    reservedunmarshal_VkVideoReferenceSlotKHR(
+        vkStream, rootType, (VkVideoReferenceSlotKHR*)(forUnmarshaling->pSetupReferenceSlot), ptr);
     memcpy((uint32_t*)&forUnmarshaling->referenceSlotCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pReferenceSlots, forUnmarshaling->referenceSlotCount * sizeof(const VkVideoReferenceSlotKHR));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->referenceSlotCount; ++i)
-    {
-        reservedunmarshal_VkVideoReferenceSlotKHR(vkStream, rootType, (VkVideoReferenceSlotKHR*)(forUnmarshaling->pReferenceSlots + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pReferenceSlots,
+                    forUnmarshaling->referenceSlotCount * sizeof(const VkVideoReferenceSlotKHR));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->referenceSlotCount; ++i) {
+        reservedunmarshal_VkVideoReferenceSlotKHR(
+            vkStream, rootType, (VkVideoReferenceSlotKHR*)(forUnmarshaling->pReferenceSlots + i),
+            ptr);
     }
 }
 
 #endif
 #ifdef VK_KHR_dynamic_rendering
-void reservedunmarshal_VkRenderingAttachmentInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderingAttachmentInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkRenderingAttachmentInfoKHR(VulkanStream* vkStream,
+                                                    VkStructureType rootType,
+                                                    VkRenderingAttachmentInfoKHR* forUnmarshaling,
+                                                    uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -9668,47 +9521,48 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkImageView*)&forUnmarshaling->imageView = (VkImageView)unbox_VkImageView((VkImageView)(*&cgen_var_0));
+    *(VkImageView*)&forUnmarshaling->imageView =
+        (VkImageView)unbox_VkImageView((VkImageView)(*&cgen_var_0));
     memcpy((VkImageLayout*)&forUnmarshaling->imageLayout, *ptr, sizeof(VkImageLayout));
     *ptr += sizeof(VkImageLayout);
-    memcpy((VkResolveModeFlagBits*)&forUnmarshaling->resolveMode, *ptr, sizeof(VkResolveModeFlagBits));
+    memcpy((VkResolveModeFlagBits*)&forUnmarshaling->resolveMode, *ptr,
+           sizeof(VkResolveModeFlagBits));
     *ptr += sizeof(VkResolveModeFlagBits);
     uint64_t cgen_var_1;
     memcpy((uint64_t*)&cgen_var_1, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkImageView*)&forUnmarshaling->resolveImageView = (VkImageView)unbox_VkImageView((VkImageView)(*&cgen_var_1));
+    *(VkImageView*)&forUnmarshaling->resolveImageView =
+        (VkImageView)unbox_VkImageView((VkImageView)(*&cgen_var_1));
     memcpy((VkImageLayout*)&forUnmarshaling->resolveImageLayout, *ptr, sizeof(VkImageLayout));
     *ptr += sizeof(VkImageLayout);
     memcpy((VkAttachmentLoadOp*)&forUnmarshaling->loadOp, *ptr, sizeof(VkAttachmentLoadOp));
     *ptr += sizeof(VkAttachmentLoadOp);
     memcpy((VkAttachmentStoreOp*)&forUnmarshaling->storeOp, *ptr, sizeof(VkAttachmentStoreOp));
     *ptr += sizeof(VkAttachmentStoreOp);
-    reservedunmarshal_VkClearValue(vkStream, rootType, (VkClearValue*)(&forUnmarshaling->clearValue), ptr);
+    reservedunmarshal_VkClearValue(vkStream, rootType,
+                                   (VkClearValue*)(&forUnmarshaling->clearValue), ptr);
 }
 
-void reservedunmarshal_VkRenderingInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderingInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkRenderingInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkRenderingInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -9716,15 +9570,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkRenderingFlagsKHR*)&forUnmarshaling->flags, *ptr, sizeof(VkRenderingFlagsKHR));
     *ptr += sizeof(VkRenderingFlagsKHR);
@@ -9735,41 +9591,44 @@
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->colorAttachmentCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pColorAttachments, forUnmarshaling->colorAttachmentCount * sizeof(const VkRenderingAttachmentInfoKHR));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->colorAttachmentCount; ++i)
-    {
-        reservedunmarshal_VkRenderingAttachmentInfoKHR(vkStream, rootType, (VkRenderingAttachmentInfoKHR*)(forUnmarshaling->pColorAttachments + i), ptr);
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pColorAttachments,
+        forUnmarshaling->colorAttachmentCount * sizeof(const VkRenderingAttachmentInfoKHR));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->colorAttachmentCount; ++i) {
+        reservedunmarshal_VkRenderingAttachmentInfoKHR(
+            vkStream, rootType,
+            (VkRenderingAttachmentInfoKHR*)(forUnmarshaling->pColorAttachments + i), ptr);
     }
     // WARNING PTR CHECK
     memcpy((VkRenderingAttachmentInfoKHR**)&forUnmarshaling->pDepthAttachment, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pDepthAttachment);
     *ptr += 8;
-    if (forUnmarshaling->pDepthAttachment)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pDepthAttachment, sizeof(const VkRenderingAttachmentInfoKHR));
-        reservedunmarshal_VkRenderingAttachmentInfoKHR(vkStream, rootType, (VkRenderingAttachmentInfoKHR*)(forUnmarshaling->pDepthAttachment), ptr);
+    if (forUnmarshaling->pDepthAttachment) {
+        vkStream->alloc((void**)&forUnmarshaling->pDepthAttachment,
+                        sizeof(const VkRenderingAttachmentInfoKHR));
+        reservedunmarshal_VkRenderingAttachmentInfoKHR(
+            vkStream, rootType, (VkRenderingAttachmentInfoKHR*)(forUnmarshaling->pDepthAttachment),
+            ptr);
     }
     // WARNING PTR CHECK
     memcpy((VkRenderingAttachmentInfoKHR**)&forUnmarshaling->pStencilAttachment, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pStencilAttachment);
     *ptr += 8;
-    if (forUnmarshaling->pStencilAttachment)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pStencilAttachment, sizeof(const VkRenderingAttachmentInfoKHR));
-        reservedunmarshal_VkRenderingAttachmentInfoKHR(vkStream, rootType, (VkRenderingAttachmentInfoKHR*)(forUnmarshaling->pStencilAttachment), ptr);
+    if (forUnmarshaling->pStencilAttachment) {
+        vkStream->alloc((void**)&forUnmarshaling->pStencilAttachment,
+                        sizeof(const VkRenderingAttachmentInfoKHR));
+        reservedunmarshal_VkRenderingAttachmentInfoKHR(
+            vkStream, rootType,
+            (VkRenderingAttachmentInfoKHR*)(forUnmarshaling->pStencilAttachment), ptr);
     }
 }
 
 void reservedunmarshal_VkPipelineRenderingCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineRenderingCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineRenderingCreateInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -9777,22 +9636,26 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->viewMask, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->colorAttachmentCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pColorAttachmentFormats, forUnmarshaling->colorAttachmentCount * sizeof(const VkFormat));
-    memcpy((VkFormat*)forUnmarshaling->pColorAttachmentFormats, *ptr, forUnmarshaling->colorAttachmentCount * sizeof(const VkFormat));
+    vkStream->alloc((void**)&forUnmarshaling->pColorAttachmentFormats,
+                    forUnmarshaling->colorAttachmentCount * sizeof(const VkFormat));
+    memcpy((VkFormat*)forUnmarshaling->pColorAttachmentFormats, *ptr,
+           forUnmarshaling->colorAttachmentCount * sizeof(const VkFormat));
     *ptr += forUnmarshaling->colorAttachmentCount * sizeof(const VkFormat);
     memcpy((VkFormat*)&forUnmarshaling->depthAttachmentFormat, *ptr, sizeof(VkFormat));
     *ptr += sizeof(VkFormat);
@@ -9801,15 +9664,11 @@
 }
 
 void reservedunmarshal_VkPhysicalDeviceDynamicRenderingFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDynamicRenderingFeaturesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceDynamicRenderingFeaturesKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -9817,30 +9676,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->dynamicRendering, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkCommandBufferInheritanceRenderingInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCommandBufferInheritanceRenderingInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkCommandBufferInheritanceRenderingInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -9848,15 +9705,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkRenderingFlagsKHR*)&forUnmarshaling->flags, *ptr, sizeof(VkRenderingFlagsKHR));
     *ptr += sizeof(VkRenderingFlagsKHR);
@@ -9864,27 +9723,26 @@
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->colorAttachmentCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pColorAttachmentFormats, forUnmarshaling->colorAttachmentCount * sizeof(const VkFormat));
-    memcpy((VkFormat*)forUnmarshaling->pColorAttachmentFormats, *ptr, forUnmarshaling->colorAttachmentCount * sizeof(const VkFormat));
+    vkStream->alloc((void**)&forUnmarshaling->pColorAttachmentFormats,
+                    forUnmarshaling->colorAttachmentCount * sizeof(const VkFormat));
+    memcpy((VkFormat*)forUnmarshaling->pColorAttachmentFormats, *ptr,
+           forUnmarshaling->colorAttachmentCount * sizeof(const VkFormat));
     *ptr += forUnmarshaling->colorAttachmentCount * sizeof(const VkFormat);
     memcpy((VkFormat*)&forUnmarshaling->depthAttachmentFormat, *ptr, sizeof(VkFormat));
     *ptr += sizeof(VkFormat);
     memcpy((VkFormat*)&forUnmarshaling->stencilAttachmentFormat, *ptr, sizeof(VkFormat));
     *ptr += sizeof(VkFormat);
-    memcpy((VkSampleCountFlagBits*)&forUnmarshaling->rasterizationSamples, *ptr, sizeof(VkSampleCountFlagBits));
+    memcpy((VkSampleCountFlagBits*)&forUnmarshaling->rasterizationSamples, *ptr,
+           sizeof(VkSampleCountFlagBits));
     *ptr += sizeof(VkSampleCountFlagBits);
 }
 
 void reservedunmarshal_VkRenderingFragmentShadingRateAttachmentInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderingFragmentShadingRateAttachmentInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkRenderingFragmentShadingRateAttachmentInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -9892,35 +9750,35 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkImageView*)&forUnmarshaling->imageView = (VkImageView)unbox_VkImageView((VkImageView)(*&cgen_var_0));
+    *(VkImageView*)&forUnmarshaling->imageView =
+        (VkImageView)unbox_VkImageView((VkImageView)(*&cgen_var_0));
     memcpy((VkImageLayout*)&forUnmarshaling->imageLayout, *ptr, sizeof(VkImageLayout));
     *ptr += sizeof(VkImageLayout);
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->shadingRateAttachmentTexelSize), ptr);
+    reservedunmarshal_VkExtent2D(
+        vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->shadingRateAttachmentTexelSize), ptr);
 }
 
 void reservedunmarshal_VkRenderingFragmentDensityMapAttachmentInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderingFragmentDensityMapAttachmentInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkRenderingFragmentDensityMapAttachmentInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -9928,34 +9786,33 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkImageView*)&forUnmarshaling->imageView = (VkImageView)unbox_VkImageView((VkImageView)(*&cgen_var_0));
+    *(VkImageView*)&forUnmarshaling->imageView =
+        (VkImageView)unbox_VkImageView((VkImageView)(*&cgen_var_0));
     memcpy((VkImageLayout*)&forUnmarshaling->imageLayout, *ptr, sizeof(VkImageLayout));
     *ptr += sizeof(VkImageLayout);
 }
 
 void reservedunmarshal_VkAttachmentSampleCountInfoAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAttachmentSampleCountInfoAMD* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAttachmentSampleCountInfoAMD* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -9963,15 +9820,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->colorAttachmentCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -9979,26 +9838,25 @@
     memcpy((VkSampleCountFlagBits**)&forUnmarshaling->pColorAttachmentSamples, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pColorAttachmentSamples);
     *ptr += 8;
-    if (forUnmarshaling->pColorAttachmentSamples)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pColorAttachmentSamples, forUnmarshaling->colorAttachmentCount * sizeof(const VkSampleCountFlagBits));
-        memcpy((VkSampleCountFlagBits*)forUnmarshaling->pColorAttachmentSamples, *ptr, forUnmarshaling->colorAttachmentCount * sizeof(const VkSampleCountFlagBits));
+    if (forUnmarshaling->pColorAttachmentSamples) {
+        vkStream->alloc(
+            (void**)&forUnmarshaling->pColorAttachmentSamples,
+            forUnmarshaling->colorAttachmentCount * sizeof(const VkSampleCountFlagBits));
+        memcpy((VkSampleCountFlagBits*)forUnmarshaling->pColorAttachmentSamples, *ptr,
+               forUnmarshaling->colorAttachmentCount * sizeof(const VkSampleCountFlagBits));
         *ptr += forUnmarshaling->colorAttachmentCount * sizeof(const VkSampleCountFlagBits);
     }
-    memcpy((VkSampleCountFlagBits*)&forUnmarshaling->depthStencilAttachmentSamples, *ptr, sizeof(VkSampleCountFlagBits));
+    memcpy((VkSampleCountFlagBits*)&forUnmarshaling->depthStencilAttachmentSamples, *ptr,
+           sizeof(VkSampleCountFlagBits));
     *ptr += sizeof(VkSampleCountFlagBits);
 }
 
 void reservedunmarshal_VkMultiviewPerViewAttributesInfoNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMultiviewPerViewAttributesInfoNVX* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkMultiviewPerViewAttributesInfoNVX* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -10006,15 +9864,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->perViewAttributes, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -10041,15 +9901,11 @@
 #endif
 #ifdef VK_KHR_external_memory_win32
 void reservedunmarshal_VkImportMemoryWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportMemoryWin32HandleInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImportMemoryWin32HandleInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -10057,17 +9913,20 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    memcpy((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr,
+           sizeof(VkExternalMemoryHandleTypeFlagBits));
     *ptr += sizeof(VkExternalMemoryHandleTypeFlagBits);
     memcpy((HANDLE*)&forUnmarshaling->handle, *ptr, sizeof(HANDLE));
     *ptr += sizeof(HANDLE);
@@ -10076,15 +9935,11 @@
 }
 
 void reservedunmarshal_VkExportMemoryWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExportMemoryWin32HandleInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkExportMemoryWin32HandleInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -10092,24 +9947,26 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     // WARNING PTR CHECK
     memcpy((SECURITY_ATTRIBUTES**)&forUnmarshaling->pAttributes, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pAttributes);
     *ptr += 8;
-    if (forUnmarshaling->pAttributes)
-    {
+    if (forUnmarshaling->pAttributes) {
         vkStream->alloc((void**)&forUnmarshaling->pAttributes, sizeof(const SECURITY_ATTRIBUTES));
-        memcpy((SECURITY_ATTRIBUTES*)forUnmarshaling->pAttributes, *ptr, sizeof(const SECURITY_ATTRIBUTES));
+        memcpy((SECURITY_ATTRIBUTES*)forUnmarshaling->pAttributes, *ptr,
+               sizeof(const SECURITY_ATTRIBUTES));
         *ptr += sizeof(const SECURITY_ATTRIBUTES);
     }
     memcpy((DWORD*)&forUnmarshaling->dwAccess, *ptr, sizeof(DWORD));
@@ -10119,15 +9976,11 @@
 }
 
 void reservedunmarshal_VkMemoryWin32HandlePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryWin32HandlePropertiesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkMemoryWin32HandlePropertiesKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -10135,30 +9988,29 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->memoryTypeBits, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkMemoryGetWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryGetWin32HandleInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkMemoryGetWin32HandleInfoKHR(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkMemoryGetWin32HandleInfoKHR* forUnmarshaling,
+                                                     uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -10166,36 +10018,36 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkDeviceMemory*)&forUnmarshaling->memory = (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_0));
-    memcpy((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    *(VkDeviceMemory*)&forUnmarshaling->memory =
+        (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_0));
+    memcpy((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr,
+           sizeof(VkExternalMemoryHandleTypeFlagBits));
     *ptr += sizeof(VkExternalMemoryHandleTypeFlagBits);
 }
 
 #endif
 #ifdef VK_KHR_external_memory_fd
-void reservedunmarshal_VkImportMemoryFdInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportMemoryFdInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkImportMemoryFdInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkImportMemoryFdInfoKHR* forUnmarshaling,
+                                               uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -10203,32 +10055,31 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    memcpy((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr,
+           sizeof(VkExternalMemoryHandleTypeFlagBits));
     *ptr += sizeof(VkExternalMemoryHandleTypeFlagBits);
     memcpy((int*)&forUnmarshaling->fd, *ptr, sizeof(int));
     *ptr += sizeof(int);
 }
 
-void reservedunmarshal_VkMemoryFdPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryFdPropertiesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkMemoryFdPropertiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkMemoryFdPropertiesKHR* forUnmarshaling,
+                                               uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -10236,30 +10087,27 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->memoryTypeBits, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkMemoryGetFdInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryGetFdInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkMemoryGetFdInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkMemoryGetFdInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -10267,36 +10115,36 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkDeviceMemory*)&forUnmarshaling->memory = (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_0));
-    memcpy((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    *(VkDeviceMemory*)&forUnmarshaling->memory =
+        (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_0));
+    memcpy((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr,
+           sizeof(VkExternalMemoryHandleTypeFlagBits));
     *ptr += sizeof(VkExternalMemoryHandleTypeFlagBits);
 }
 
 #endif
 #ifdef VK_KHR_win32_keyed_mutex
 void reservedunmarshal_VkWin32KeyedMutexAcquireReleaseInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkWin32KeyedMutexAcquireReleaseInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkWin32KeyedMutexAcquireReleaseInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -10304,56 +10152,64 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->acquireCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pAcquireSyncs, forUnmarshaling->acquireCount * sizeof(const VkDeviceMemory));
-    if (forUnmarshaling->acquireCount)
-    {
+    vkStream->alloc((void**)&forUnmarshaling->pAcquireSyncs,
+                    forUnmarshaling->acquireCount * sizeof(const VkDeviceMemory));
+    if (forUnmarshaling->acquireCount) {
         uint8_t* cgen_var_0_ptr = (uint8_t*)(*ptr);
         *ptr += 8 * forUnmarshaling->acquireCount;
-        if (forUnmarshaling)
-        {
-            for (uint32_t k = 0; k < forUnmarshaling->acquireCount; ++k)
-            {
-                uint64_t tmpval; memcpy(&tmpval, cgen_var_0_ptr + k * 8, sizeof(uint64_t));
-                *(((VkDeviceMemory*)forUnmarshaling->pAcquireSyncs) + k) = (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)tmpval);
+        if (forUnmarshaling) {
+            for (uint32_t k = 0; k < forUnmarshaling->acquireCount; ++k) {
+                uint64_t tmpval;
+                memcpy(&tmpval, cgen_var_0_ptr + k * 8, sizeof(uint64_t));
+                *(((VkDeviceMemory*)forUnmarshaling->pAcquireSyncs) + k) =
+                    (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)tmpval);
             }
         }
     }
-    vkStream->alloc((void**)&forUnmarshaling->pAcquireKeys, forUnmarshaling->acquireCount * sizeof(const uint64_t));
-    memcpy((uint64_t*)forUnmarshaling->pAcquireKeys, *ptr, forUnmarshaling->acquireCount * sizeof(const uint64_t));
+    vkStream->alloc((void**)&forUnmarshaling->pAcquireKeys,
+                    forUnmarshaling->acquireCount * sizeof(const uint64_t));
+    memcpy((uint64_t*)forUnmarshaling->pAcquireKeys, *ptr,
+           forUnmarshaling->acquireCount * sizeof(const uint64_t));
     *ptr += forUnmarshaling->acquireCount * sizeof(const uint64_t);
-    vkStream->alloc((void**)&forUnmarshaling->pAcquireTimeouts, forUnmarshaling->acquireCount * sizeof(const uint32_t));
-    memcpy((uint32_t*)forUnmarshaling->pAcquireTimeouts, *ptr, forUnmarshaling->acquireCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pAcquireTimeouts,
+                    forUnmarshaling->acquireCount * sizeof(const uint32_t));
+    memcpy((uint32_t*)forUnmarshaling->pAcquireTimeouts, *ptr,
+           forUnmarshaling->acquireCount * sizeof(const uint32_t));
     *ptr += forUnmarshaling->acquireCount * sizeof(const uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->releaseCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pReleaseSyncs, forUnmarshaling->releaseCount * sizeof(const VkDeviceMemory));
-    if (forUnmarshaling->releaseCount)
-    {
+    vkStream->alloc((void**)&forUnmarshaling->pReleaseSyncs,
+                    forUnmarshaling->releaseCount * sizeof(const VkDeviceMemory));
+    if (forUnmarshaling->releaseCount) {
         uint8_t* cgen_var_1_ptr = (uint8_t*)(*ptr);
         *ptr += 8 * forUnmarshaling->releaseCount;
-        if (forUnmarshaling)
-        {
-            for (uint32_t k = 0; k < forUnmarshaling->releaseCount; ++k)
-            {
-                uint64_t tmpval; memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
-                *(((VkDeviceMemory*)forUnmarshaling->pReleaseSyncs) + k) = (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)tmpval);
+        if (forUnmarshaling) {
+            for (uint32_t k = 0; k < forUnmarshaling->releaseCount; ++k) {
+                uint64_t tmpval;
+                memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
+                *(((VkDeviceMemory*)forUnmarshaling->pReleaseSyncs) + k) =
+                    (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)tmpval);
             }
         }
     }
-    vkStream->alloc((void**)&forUnmarshaling->pReleaseKeys, forUnmarshaling->releaseCount * sizeof(const uint64_t));
-    memcpy((uint64_t*)forUnmarshaling->pReleaseKeys, *ptr, forUnmarshaling->releaseCount * sizeof(const uint64_t));
+    vkStream->alloc((void**)&forUnmarshaling->pReleaseKeys,
+                    forUnmarshaling->releaseCount * sizeof(const uint64_t));
+    memcpy((uint64_t*)forUnmarshaling->pReleaseKeys, *ptr,
+           forUnmarshaling->releaseCount * sizeof(const uint64_t));
     *ptr += forUnmarshaling->releaseCount * sizeof(const uint64_t);
 }
 
@@ -10364,15 +10220,11 @@
 #endif
 #ifdef VK_KHR_external_semaphore_win32
 void reservedunmarshal_VkImportSemaphoreWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportSemaphoreWin32HandleInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImportSemaphoreWin32HandleInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -10380,23 +10232,27 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkSemaphore*)&forUnmarshaling->semaphore = (VkSemaphore)unbox_VkSemaphore((VkSemaphore)(*&cgen_var_0));
+    *(VkSemaphore*)&forUnmarshaling->semaphore =
+        (VkSemaphore)unbox_VkSemaphore((VkSemaphore)(*&cgen_var_0));
     memcpy((VkSemaphoreImportFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkSemaphoreImportFlags));
     *ptr += sizeof(VkSemaphoreImportFlags);
-    memcpy((VkExternalSemaphoreHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr, sizeof(VkExternalSemaphoreHandleTypeFlagBits));
+    memcpy((VkExternalSemaphoreHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr,
+           sizeof(VkExternalSemaphoreHandleTypeFlagBits));
     *ptr += sizeof(VkExternalSemaphoreHandleTypeFlagBits);
     memcpy((HANDLE*)&forUnmarshaling->handle, *ptr, sizeof(HANDLE));
     *ptr += sizeof(HANDLE);
@@ -10405,15 +10261,11 @@
 }
 
 void reservedunmarshal_VkExportSemaphoreWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExportSemaphoreWin32HandleInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkExportSemaphoreWin32HandleInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -10421,24 +10273,26 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     // WARNING PTR CHECK
     memcpy((SECURITY_ATTRIBUTES**)&forUnmarshaling->pAttributes, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pAttributes);
     *ptr += 8;
-    if (forUnmarshaling->pAttributes)
-    {
+    if (forUnmarshaling->pAttributes) {
         vkStream->alloc((void**)&forUnmarshaling->pAttributes, sizeof(const SECURITY_ATTRIBUTES));
-        memcpy((SECURITY_ATTRIBUTES*)forUnmarshaling->pAttributes, *ptr, sizeof(const SECURITY_ATTRIBUTES));
+        memcpy((SECURITY_ATTRIBUTES*)forUnmarshaling->pAttributes, *ptr,
+               sizeof(const SECURITY_ATTRIBUTES));
         *ptr += sizeof(const SECURITY_ATTRIBUTES);
     }
     memcpy((DWORD*)&forUnmarshaling->dwAccess, *ptr, sizeof(DWORD));
@@ -10447,16 +10301,12 @@
     *ptr += sizeof(LPCWSTR);
 }
 
-void reservedunmarshal_VkD3D12FenceSubmitInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkD3D12FenceSubmitInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkD3D12FenceSubmitInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkD3D12FenceSubmitInfoKHR* forUnmarshaling,
+                                                 uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -10464,15 +10314,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->waitSemaphoreValuesCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -10480,10 +10332,11 @@
     memcpy((uint64_t**)&forUnmarshaling->pWaitSemaphoreValues, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pWaitSemaphoreValues);
     *ptr += 8;
-    if (forUnmarshaling->pWaitSemaphoreValues)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pWaitSemaphoreValues, forUnmarshaling->waitSemaphoreValuesCount * sizeof(const uint64_t));
-        memcpy((uint64_t*)forUnmarshaling->pWaitSemaphoreValues, *ptr, forUnmarshaling->waitSemaphoreValuesCount * sizeof(const uint64_t));
+    if (forUnmarshaling->pWaitSemaphoreValues) {
+        vkStream->alloc((void**)&forUnmarshaling->pWaitSemaphoreValues,
+                        forUnmarshaling->waitSemaphoreValuesCount * sizeof(const uint64_t));
+        memcpy((uint64_t*)forUnmarshaling->pWaitSemaphoreValues, *ptr,
+               forUnmarshaling->waitSemaphoreValuesCount * sizeof(const uint64_t));
         *ptr += forUnmarshaling->waitSemaphoreValuesCount * sizeof(const uint64_t);
     }
     memcpy((uint32_t*)&forUnmarshaling->signalSemaphoreValuesCount, *ptr, sizeof(uint32_t));
@@ -10492,24 +10345,21 @@
     memcpy((uint64_t**)&forUnmarshaling->pSignalSemaphoreValues, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pSignalSemaphoreValues);
     *ptr += 8;
-    if (forUnmarshaling->pSignalSemaphoreValues)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pSignalSemaphoreValues, forUnmarshaling->signalSemaphoreValuesCount * sizeof(const uint64_t));
-        memcpy((uint64_t*)forUnmarshaling->pSignalSemaphoreValues, *ptr, forUnmarshaling->signalSemaphoreValuesCount * sizeof(const uint64_t));
+    if (forUnmarshaling->pSignalSemaphoreValues) {
+        vkStream->alloc((void**)&forUnmarshaling->pSignalSemaphoreValues,
+                        forUnmarshaling->signalSemaphoreValuesCount * sizeof(const uint64_t));
+        memcpy((uint64_t*)forUnmarshaling->pSignalSemaphoreValues, *ptr,
+               forUnmarshaling->signalSemaphoreValuesCount * sizeof(const uint64_t));
         *ptr += forUnmarshaling->signalSemaphoreValuesCount * sizeof(const uint64_t);
     }
 }
 
 void reservedunmarshal_VkSemaphoreGetWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSemaphoreGetWin32HandleInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSemaphoreGetWin32HandleInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -10517,36 +10367,36 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkSemaphore*)&forUnmarshaling->semaphore = (VkSemaphore)unbox_VkSemaphore((VkSemaphore)(*&cgen_var_0));
-    memcpy((VkExternalSemaphoreHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr, sizeof(VkExternalSemaphoreHandleTypeFlagBits));
+    *(VkSemaphore*)&forUnmarshaling->semaphore =
+        (VkSemaphore)unbox_VkSemaphore((VkSemaphore)(*&cgen_var_0));
+    memcpy((VkExternalSemaphoreHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr,
+           sizeof(VkExternalSemaphoreHandleTypeFlagBits));
     *ptr += sizeof(VkExternalSemaphoreHandleTypeFlagBits);
 }
 
 #endif
 #ifdef VK_KHR_external_semaphore_fd
-void reservedunmarshal_VkImportSemaphoreFdInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportSemaphoreFdInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkImportSemaphoreFdInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                  VkImportSemaphoreFdInfoKHR* forUnmarshaling,
+                                                  uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -10554,38 +10404,38 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkSemaphore*)&forUnmarshaling->semaphore = (VkSemaphore)unbox_VkSemaphore((VkSemaphore)(*&cgen_var_0));
+    *(VkSemaphore*)&forUnmarshaling->semaphore =
+        (VkSemaphore)unbox_VkSemaphore((VkSemaphore)(*&cgen_var_0));
     memcpy((VkSemaphoreImportFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkSemaphoreImportFlags));
     *ptr += sizeof(VkSemaphoreImportFlags);
-    memcpy((VkExternalSemaphoreHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr, sizeof(VkExternalSemaphoreHandleTypeFlagBits));
+    memcpy((VkExternalSemaphoreHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr,
+           sizeof(VkExternalSemaphoreHandleTypeFlagBits));
     *ptr += sizeof(VkExternalSemaphoreHandleTypeFlagBits);
     memcpy((int*)&forUnmarshaling->fd, *ptr, sizeof(int));
     *ptr += sizeof(int);
 }
 
-void reservedunmarshal_VkSemaphoreGetFdInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSemaphoreGetFdInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkSemaphoreGetFdInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkSemaphoreGetFdInfoKHR* forUnmarshaling,
+                                               uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -10593,36 +10443,36 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkSemaphore*)&forUnmarshaling->semaphore = (VkSemaphore)unbox_VkSemaphore((VkSemaphore)(*&cgen_var_0));
-    memcpy((VkExternalSemaphoreHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr, sizeof(VkExternalSemaphoreHandleTypeFlagBits));
+    *(VkSemaphore*)&forUnmarshaling->semaphore =
+        (VkSemaphore)unbox_VkSemaphore((VkSemaphore)(*&cgen_var_0));
+    memcpy((VkExternalSemaphoreHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr,
+           sizeof(VkExternalSemaphoreHandleTypeFlagBits));
     *ptr += sizeof(VkExternalSemaphoreHandleTypeFlagBits);
 }
 
 #endif
 #ifdef VK_KHR_push_descriptor
 void reservedunmarshal_VkPhysicalDevicePushDescriptorPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePushDescriptorPropertiesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePushDescriptorPropertiesKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -10630,15 +10480,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->maxPushDescriptors, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -10650,50 +10502,37 @@
 #ifdef VK_KHR_16bit_storage
 #endif
 #ifdef VK_KHR_incremental_present
-void reservedunmarshal_VkRectLayerKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRectLayerKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkRectLayerKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                      VkRectLayerKHR* forUnmarshaling, uint8_t** ptr) {
     reservedunmarshal_VkOffset2D(vkStream, rootType, (VkOffset2D*)(&forUnmarshaling->offset), ptr);
     reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->extent), ptr);
     memcpy((uint32_t*)&forUnmarshaling->layer, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkPresentRegionKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPresentRegionKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkPresentRegionKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkPresentRegionKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((uint32_t*)&forUnmarshaling->rectangleCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     // WARNING PTR CHECK
     memcpy((VkRectLayerKHR**)&forUnmarshaling->pRectangles, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pRectangles);
     *ptr += 8;
-    if (forUnmarshaling->pRectangles)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pRectangles, forUnmarshaling->rectangleCount * sizeof(const VkRectLayerKHR));
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->rectangleCount; ++i)
-        {
-            reservedunmarshal_VkRectLayerKHR(vkStream, rootType, (VkRectLayerKHR*)(forUnmarshaling->pRectangles + i), ptr);
+    if (forUnmarshaling->pRectangles) {
+        vkStream->alloc((void**)&forUnmarshaling->pRectangles,
+                        forUnmarshaling->rectangleCount * sizeof(const VkRectLayerKHR));
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->rectangleCount; ++i) {
+            reservedunmarshal_VkRectLayerKHR(
+                vkStream, rootType, (VkRectLayerKHR*)(forUnmarshaling->pRectangles + i), ptr);
         }
     }
 }
 
-void reservedunmarshal_VkPresentRegionsKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPresentRegionsKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkPresentRegionsKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkPresentRegionsKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -10701,15 +10540,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->swapchainCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -10717,12 +10558,12 @@
     memcpy((VkPresentRegionKHR**)&forUnmarshaling->pRegions, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pRegions);
     *ptr += 8;
-    if (forUnmarshaling->pRegions)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pRegions, forUnmarshaling->swapchainCount * sizeof(const VkPresentRegionKHR));
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->swapchainCount; ++i)
-        {
-            reservedunmarshal_VkPresentRegionKHR(vkStream, rootType, (VkPresentRegionKHR*)(forUnmarshaling->pRegions + i), ptr);
+    if (forUnmarshaling->pRegions) {
+        vkStream->alloc((void**)&forUnmarshaling->pRegions,
+                        forUnmarshaling->swapchainCount * sizeof(const VkPresentRegionKHR));
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->swapchainCount; ++i) {
+            reservedunmarshal_VkPresentRegionKHR(
+                vkStream, rootType, (VkPresentRegionKHR*)(forUnmarshaling->pRegions + i), ptr);
         }
     }
 }
@@ -10736,15 +10577,11 @@
 #endif
 #ifdef VK_KHR_shared_presentable_image
 void reservedunmarshal_VkSharedPresentSurfaceCapabilitiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSharedPresentSurfaceCapabilitiesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSharedPresentSurfaceCapabilitiesKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -10752,17 +10589,20 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkImageUsageFlags*)&forUnmarshaling->sharedPresentSupportedUsageFlags, *ptr, sizeof(VkImageUsageFlags));
+    memcpy((VkImageUsageFlags*)&forUnmarshaling->sharedPresentSupportedUsageFlags, *ptr,
+           sizeof(VkImageUsageFlags));
     *ptr += sizeof(VkImageUsageFlags);
 }
 
@@ -10773,15 +10613,11 @@
 #endif
 #ifdef VK_KHR_external_fence_win32
 void reservedunmarshal_VkImportFenceWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportFenceWin32HandleInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImportFenceWin32HandleInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -10789,15 +10625,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
@@ -10805,7 +10643,8 @@
     *(VkFence*)&forUnmarshaling->fence = (VkFence)unbox_VkFence((VkFence)(*&cgen_var_0));
     memcpy((VkFenceImportFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkFenceImportFlags));
     *ptr += sizeof(VkFenceImportFlags);
-    memcpy((VkExternalFenceHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr, sizeof(VkExternalFenceHandleTypeFlagBits));
+    memcpy((VkExternalFenceHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr,
+           sizeof(VkExternalFenceHandleTypeFlagBits));
     *ptr += sizeof(VkExternalFenceHandleTypeFlagBits);
     memcpy((HANDLE*)&forUnmarshaling->handle, *ptr, sizeof(HANDLE));
     *ptr += sizeof(HANDLE);
@@ -10814,15 +10653,11 @@
 }
 
 void reservedunmarshal_VkExportFenceWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExportFenceWin32HandleInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkExportFenceWin32HandleInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -10830,24 +10665,26 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     // WARNING PTR CHECK
     memcpy((SECURITY_ATTRIBUTES**)&forUnmarshaling->pAttributes, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pAttributes);
     *ptr += 8;
-    if (forUnmarshaling->pAttributes)
-    {
+    if (forUnmarshaling->pAttributes) {
         vkStream->alloc((void**)&forUnmarshaling->pAttributes, sizeof(const SECURITY_ATTRIBUTES));
-        memcpy((SECURITY_ATTRIBUTES*)forUnmarshaling->pAttributes, *ptr, sizeof(const SECURITY_ATTRIBUTES));
+        memcpy((SECURITY_ATTRIBUTES*)forUnmarshaling->pAttributes, *ptr,
+               sizeof(const SECURITY_ATTRIBUTES));
         *ptr += sizeof(const SECURITY_ATTRIBUTES);
     }
     memcpy((DWORD*)&forUnmarshaling->dwAccess, *ptr, sizeof(DWORD));
@@ -10856,16 +10693,13 @@
     *ptr += sizeof(LPCWSTR);
 }
 
-void reservedunmarshal_VkFenceGetWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFenceGetWin32HandleInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkFenceGetWin32HandleInfoKHR(VulkanStream* vkStream,
+                                                    VkStructureType rootType,
+                                                    VkFenceGetWin32HandleInfoKHR* forUnmarshaling,
+                                                    uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -10873,36 +10707,35 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
     *(VkFence*)&forUnmarshaling->fence = (VkFence)unbox_VkFence((VkFence)(*&cgen_var_0));
-    memcpy((VkExternalFenceHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr, sizeof(VkExternalFenceHandleTypeFlagBits));
+    memcpy((VkExternalFenceHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr,
+           sizeof(VkExternalFenceHandleTypeFlagBits));
     *ptr += sizeof(VkExternalFenceHandleTypeFlagBits);
 }
 
 #endif
 #ifdef VK_KHR_external_fence_fd
-void reservedunmarshal_VkImportFenceFdInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportFenceFdInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkImportFenceFdInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkImportFenceFdInfoKHR* forUnmarshaling,
+                                              uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -10910,15 +10743,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
@@ -10926,22 +10761,18 @@
     *(VkFence*)&forUnmarshaling->fence = (VkFence)unbox_VkFence((VkFence)(*&cgen_var_0));
     memcpy((VkFenceImportFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkFenceImportFlags));
     *ptr += sizeof(VkFenceImportFlags);
-    memcpy((VkExternalFenceHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr, sizeof(VkExternalFenceHandleTypeFlagBits));
+    memcpy((VkExternalFenceHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr,
+           sizeof(VkExternalFenceHandleTypeFlagBits));
     *ptr += sizeof(VkExternalFenceHandleTypeFlagBits);
     memcpy((int*)&forUnmarshaling->fd, *ptr, sizeof(int));
     *ptr += sizeof(int);
 }
 
-void reservedunmarshal_VkFenceGetFdInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFenceGetFdInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkFenceGetFdInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkFenceGetFdInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -10949,36 +10780,35 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
     *(VkFence*)&forUnmarshaling->fence = (VkFence)unbox_VkFence((VkFence)(*&cgen_var_0));
-    memcpy((VkExternalFenceHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr, sizeof(VkExternalFenceHandleTypeFlagBits));
+    memcpy((VkExternalFenceHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr,
+           sizeof(VkExternalFenceHandleTypeFlagBits));
     *ptr += sizeof(VkExternalFenceHandleTypeFlagBits);
 }
 
 #endif
 #ifdef VK_KHR_performance_query
 void reservedunmarshal_VkPhysicalDevicePerformanceQueryFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePerformanceQueryFeaturesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePerformanceQueryFeaturesKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -10986,32 +10816,31 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->performanceCounterQueryPools, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->performanceCounterMultipleQueryPools, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->performanceCounterMultipleQueryPools, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkPhysicalDevicePerformanceQueryPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePerformanceQueryPropertiesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePerformanceQueryPropertiesKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -11019,30 +10848,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->allowCommandBufferQueryCopies, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
-void reservedunmarshal_VkPerformanceCounterKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPerformanceCounterKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkPerformanceCounterKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkPerformanceCounterKHR* forUnmarshaling,
+                                               uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -11050,36 +10877,37 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkPerformanceCounterUnitKHR*)&forUnmarshaling->unit, *ptr, sizeof(VkPerformanceCounterUnitKHR));
+    memcpy((VkPerformanceCounterUnitKHR*)&forUnmarshaling->unit, *ptr,
+           sizeof(VkPerformanceCounterUnitKHR));
     *ptr += sizeof(VkPerformanceCounterUnitKHR);
-    memcpy((VkPerformanceCounterScopeKHR*)&forUnmarshaling->scope, *ptr, sizeof(VkPerformanceCounterScopeKHR));
+    memcpy((VkPerformanceCounterScopeKHR*)&forUnmarshaling->scope, *ptr,
+           sizeof(VkPerformanceCounterScopeKHR));
     *ptr += sizeof(VkPerformanceCounterScopeKHR);
-    memcpy((VkPerformanceCounterStorageKHR*)&forUnmarshaling->storage, *ptr, sizeof(VkPerformanceCounterStorageKHR));
+    memcpy((VkPerformanceCounterStorageKHR*)&forUnmarshaling->storage, *ptr,
+           sizeof(VkPerformanceCounterStorageKHR));
     *ptr += sizeof(VkPerformanceCounterStorageKHR);
     memcpy((uint8_t*)forUnmarshaling->uuid, *ptr, VK_UUID_SIZE * sizeof(uint8_t));
     *ptr += VK_UUID_SIZE * sizeof(uint8_t);
 }
 
 void reservedunmarshal_VkPerformanceCounterDescriptionKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPerformanceCounterDescriptionKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPerformanceCounterDescriptionKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -11087,17 +10915,20 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkPerformanceCounterDescriptionFlagsKHR*)&forUnmarshaling->flags, *ptr, sizeof(VkPerformanceCounterDescriptionFlagsKHR));
+    memcpy((VkPerformanceCounterDescriptionFlagsKHR*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkPerformanceCounterDescriptionFlagsKHR));
     *ptr += sizeof(VkPerformanceCounterDescriptionFlagsKHR);
     memcpy((char*)forUnmarshaling->name, *ptr, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
     *ptr += VK_MAX_DESCRIPTION_SIZE * sizeof(char);
@@ -11108,15 +10939,11 @@
 }
 
 void reservedunmarshal_VkQueryPoolPerformanceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkQueryPoolPerformanceCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkQueryPoolPerformanceCreateInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -11124,45 +10951,44 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->queueFamilyIndex, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->counterIndexCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pCounterIndices, forUnmarshaling->counterIndexCount * sizeof(const uint32_t));
-    memcpy((uint32_t*)forUnmarshaling->pCounterIndices, *ptr, forUnmarshaling->counterIndexCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pCounterIndices,
+                    forUnmarshaling->counterIndexCount * sizeof(const uint32_t));
+    memcpy((uint32_t*)forUnmarshaling->pCounterIndices, *ptr,
+           forUnmarshaling->counterIndexCount * sizeof(const uint32_t));
     *ptr += forUnmarshaling->counterIndexCount * sizeof(const uint32_t);
 }
 
-void reservedunmarshal_VkPerformanceCounterResultKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPerformanceCounterResultKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkPerformanceCounterResultKHR(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkPerformanceCounterResultKHR* forUnmarshaling,
+                                                     uint8_t** ptr) {
     memcpy((int32_t*)&forUnmarshaling->int32, *ptr, sizeof(int32_t));
     *ptr += sizeof(int32_t);
 }
 
-void reservedunmarshal_VkAcquireProfilingLockInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAcquireProfilingLockInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkAcquireProfilingLockInfoKHR(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkAcquireProfilingLockInfoKHR* forUnmarshaling,
+                                                     uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -11170,32 +10996,31 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkAcquireProfilingLockFlagsKHR*)&forUnmarshaling->flags, *ptr, sizeof(VkAcquireProfilingLockFlagsKHR));
+    memcpy((VkAcquireProfilingLockFlagsKHR*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkAcquireProfilingLockFlagsKHR));
     *ptr += sizeof(VkAcquireProfilingLockFlagsKHR);
     memcpy((uint64_t*)&forUnmarshaling->timeout, *ptr, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
 }
 
 void reservedunmarshal_VkPerformanceQuerySubmitInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPerformanceQuerySubmitInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPerformanceQuerySubmitInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -11203,15 +11028,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->counterPassIndex, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -11222,15 +11049,11 @@
 #endif
 #ifdef VK_KHR_get_surface_capabilities2
 void reservedunmarshal_VkPhysicalDeviceSurfaceInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSurfaceInfo2KHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceSurfaceInfo2KHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -11238,32 +11061,31 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkSurfaceKHR*)&forUnmarshaling->surface = (VkSurfaceKHR)unbox_VkSurfaceKHR((VkSurfaceKHR)(*&cgen_var_0));
+    *(VkSurfaceKHR*)&forUnmarshaling->surface =
+        (VkSurfaceKHR)unbox_VkSurfaceKHR((VkSurfaceKHR)(*&cgen_var_0));
 }
 
-void reservedunmarshal_VkSurfaceCapabilities2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSurfaceCapabilities2KHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkSurfaceCapabilities2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkSurfaceCapabilities2KHR* forUnmarshaling,
+                                                 uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -11271,29 +11093,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    reservedunmarshal_VkSurfaceCapabilitiesKHR(vkStream, rootType, (VkSurfaceCapabilitiesKHR*)(&forUnmarshaling->surfaceCapabilities), ptr);
+    reservedunmarshal_VkSurfaceCapabilitiesKHR(
+        vkStream, rootType, (VkSurfaceCapabilitiesKHR*)(&forUnmarshaling->surfaceCapabilities),
+        ptr);
 }
 
-void reservedunmarshal_VkSurfaceFormat2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSurfaceFormat2KHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkSurfaceFormat2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkSurfaceFormat2KHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -11301,33 +11122,32 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    reservedunmarshal_VkSurfaceFormatKHR(vkStream, rootType, (VkSurfaceFormatKHR*)(&forUnmarshaling->surfaceFormat), ptr);
+    reservedunmarshal_VkSurfaceFormatKHR(
+        vkStream, rootType, (VkSurfaceFormatKHR*)(&forUnmarshaling->surfaceFormat), ptr);
 }
 
 #endif
 #ifdef VK_KHR_variable_pointers
 #endif
 #ifdef VK_KHR_get_display_properties2
-void reservedunmarshal_VkDisplayProperties2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayProperties2KHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDisplayProperties2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkDisplayProperties2KHR* forUnmarshaling,
+                                               uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -11335,29 +11155,29 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    reservedunmarshal_VkDisplayPropertiesKHR(vkStream, rootType, (VkDisplayPropertiesKHR*)(&forUnmarshaling->displayProperties), ptr);
+    reservedunmarshal_VkDisplayPropertiesKHR(
+        vkStream, rootType, (VkDisplayPropertiesKHR*)(&forUnmarshaling->displayProperties), ptr);
 }
 
-void reservedunmarshal_VkDisplayPlaneProperties2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayPlaneProperties2KHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDisplayPlaneProperties2KHR(VulkanStream* vkStream,
+                                                    VkStructureType rootType,
+                                                    VkDisplayPlaneProperties2KHR* forUnmarshaling,
+                                                    uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -11365,29 +11185,29 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    reservedunmarshal_VkDisplayPlanePropertiesKHR(vkStream, rootType, (VkDisplayPlanePropertiesKHR*)(&forUnmarshaling->displayPlaneProperties), ptr);
+    reservedunmarshal_VkDisplayPlanePropertiesKHR(
+        vkStream, rootType,
+        (VkDisplayPlanePropertiesKHR*)(&forUnmarshaling->displayPlaneProperties), ptr);
 }
 
-void reservedunmarshal_VkDisplayModeProperties2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayModeProperties2KHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDisplayModeProperties2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkDisplayModeProperties2KHR* forUnmarshaling,
+                                                   uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -11395,29 +11215,29 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    reservedunmarshal_VkDisplayModePropertiesKHR(vkStream, rootType, (VkDisplayModePropertiesKHR*)(&forUnmarshaling->displayModeProperties), ptr);
+    reservedunmarshal_VkDisplayModePropertiesKHR(
+        vkStream, rootType, (VkDisplayModePropertiesKHR*)(&forUnmarshaling->displayModeProperties),
+        ptr);
 }
 
-void reservedunmarshal_VkDisplayPlaneInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayPlaneInfo2KHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDisplayPlaneInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkDisplayPlaneInfo2KHR* forUnmarshaling,
+                                              uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -11425,34 +11245,33 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkDisplayModeKHR*)&forUnmarshaling->mode = (VkDisplayModeKHR)unbox_VkDisplayModeKHR((VkDisplayModeKHR)(*&cgen_var_0));
+    *(VkDisplayModeKHR*)&forUnmarshaling->mode =
+        (VkDisplayModeKHR)unbox_VkDisplayModeKHR((VkDisplayModeKHR)(*&cgen_var_0));
     memcpy((uint32_t*)&forUnmarshaling->planeIndex, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
 void reservedunmarshal_VkDisplayPlaneCapabilities2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayPlaneCapabilities2KHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDisplayPlaneCapabilities2KHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -11460,17 +11279,20 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    reservedunmarshal_VkDisplayPlaneCapabilitiesKHR(vkStream, rootType, (VkDisplayPlaneCapabilitiesKHR*)(&forUnmarshaling->capabilities), ptr);
+    reservedunmarshal_VkDisplayPlaneCapabilitiesKHR(
+        vkStream, rootType, (VkDisplayPlaneCapabilitiesKHR*)(&forUnmarshaling->capabilities), ptr);
 }
 
 #endif
@@ -11490,15 +11312,11 @@
 #endif
 #ifdef VK_KHR_portability_subset
 void reservedunmarshal_VkPhysicalDevicePortabilitySubsetFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePortabilitySubsetFeaturesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePortabilitySubsetFeaturesKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -11506,15 +11324,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->constantAlphaColorBlendFactors, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -11536,7 +11356,8 @@
     *ptr += sizeof(VkBool32);
     memcpy((VkBool32*)&forUnmarshaling->separateStencilMaskRef, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->shaderSampleRateInterpolationFunctions, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderSampleRateInterpolationFunctions, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy((VkBool32*)&forUnmarshaling->tessellationIsolines, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -11549,15 +11370,11 @@
 }
 
 void reservedunmarshal_VkPhysicalDevicePortabilitySubsetPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePortabilitySubsetPropertiesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePortabilitySubsetPropertiesKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -11565,17 +11382,20 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((uint32_t*)&forUnmarshaling->minVertexInputBindingStrideAlignment, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->minVertexInputBindingStrideAlignment, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
@@ -11592,15 +11412,11 @@
 #endif
 #ifdef VK_KHR_shader_clock
 void reservedunmarshal_VkPhysicalDeviceShaderClockFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderClockFeaturesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderClockFeaturesKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -11608,15 +11424,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->shaderSubgroupClock, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -11639,15 +11457,11 @@
 #endif
 #ifdef VK_KHR_shader_terminate_invocation
 void reservedunmarshal_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -11655,15 +11469,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->shaderTerminateInvocation, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -11672,15 +11488,11 @@
 #endif
 #ifdef VK_KHR_fragment_shading_rate
 void reservedunmarshal_VkFragmentShadingRateAttachmentInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFragmentShadingRateAttachmentInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkFragmentShadingRateAttachmentInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -11688,38 +11500,39 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     // WARNING PTR CHECK
     memcpy((VkAttachmentReference2**)&forUnmarshaling->pFragmentShadingRateAttachment, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pFragmentShadingRateAttachment);
     *ptr += 8;
-    if (forUnmarshaling->pFragmentShadingRateAttachment)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pFragmentShadingRateAttachment, sizeof(const VkAttachmentReference2));
-        reservedunmarshal_VkAttachmentReference2(vkStream, rootType, (VkAttachmentReference2*)(forUnmarshaling->pFragmentShadingRateAttachment), ptr);
+    if (forUnmarshaling->pFragmentShadingRateAttachment) {
+        vkStream->alloc((void**)&forUnmarshaling->pFragmentShadingRateAttachment,
+                        sizeof(const VkAttachmentReference2));
+        reservedunmarshal_VkAttachmentReference2(
+            vkStream, rootType,
+            (VkAttachmentReference2*)(forUnmarshaling->pFragmentShadingRateAttachment), ptr);
     }
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->shadingRateAttachmentTexelSize), ptr);
+    reservedunmarshal_VkExtent2D(
+        vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->shadingRateAttachmentTexelSize), ptr);
 }
 
 void reservedunmarshal_VkPipelineFragmentShadingRateStateCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineFragmentShadingRateStateCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineFragmentShadingRateStateCreateInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -11727,31 +11540,31 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->fragmentSize), ptr);
-    memcpy((VkFragmentShadingRateCombinerOpKHR*)forUnmarshaling->combinerOps, *ptr, 2 * sizeof(VkFragmentShadingRateCombinerOpKHR));
+    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->fragmentSize),
+                                 ptr);
+    memcpy((VkFragmentShadingRateCombinerOpKHR*)forUnmarshaling->combinerOps, *ptr,
+           2 * sizeof(VkFragmentShadingRateCombinerOpKHR));
     *ptr += 2 * sizeof(VkFragmentShadingRateCombinerOpKHR);
 }
 
 void reservedunmarshal_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFragmentShadingRateFeaturesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceFragmentShadingRateFeaturesKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -11759,15 +11572,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->pipelineFragmentShadingRate, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -11778,15 +11593,11 @@
 }
 
 void reservedunmarshal_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFragmentShadingRatePropertiesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceFragmentShadingRatePropertiesKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -11794,59 +11605,73 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->minFragmentShadingRateAttachmentTexelSize), ptr);
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->maxFragmentShadingRateAttachmentTexelSize), ptr);
-    memcpy((uint32_t*)&forUnmarshaling->maxFragmentShadingRateAttachmentTexelSizeAspectRatio, *ptr, sizeof(uint32_t));
+    reservedunmarshal_VkExtent2D(
+        vkStream, rootType,
+        (VkExtent2D*)(&forUnmarshaling->minFragmentShadingRateAttachmentTexelSize), ptr);
+    reservedunmarshal_VkExtent2D(
+        vkStream, rootType,
+        (VkExtent2D*)(&forUnmarshaling->maxFragmentShadingRateAttachmentTexelSize), ptr);
+    memcpy((uint32_t*)&forUnmarshaling->maxFragmentShadingRateAttachmentTexelSizeAspectRatio, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((VkBool32*)&forUnmarshaling->primitiveFragmentShadingRateWithMultipleViewports, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->primitiveFragmentShadingRateWithMultipleViewports, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy((VkBool32*)&forUnmarshaling->layeredShadingRateAttachments, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->fragmentShadingRateNonTrivialCombinerOps, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->fragmentShadingRateNonTrivialCombinerOps, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->maxFragmentSize), ptr);
+    reservedunmarshal_VkExtent2D(vkStream, rootType,
+                                 (VkExtent2D*)(&forUnmarshaling->maxFragmentSize), ptr);
     memcpy((uint32_t*)&forUnmarshaling->maxFragmentSizeAspectRatio, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxFragmentShadingRateCoverageSamples, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxFragmentShadingRateCoverageSamples, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((VkSampleCountFlagBits*)&forUnmarshaling->maxFragmentShadingRateRasterizationSamples, *ptr, sizeof(VkSampleCountFlagBits));
+    memcpy((VkSampleCountFlagBits*)&forUnmarshaling->maxFragmentShadingRateRasterizationSamples,
+           *ptr, sizeof(VkSampleCountFlagBits));
     *ptr += sizeof(VkSampleCountFlagBits);
-    memcpy((VkBool32*)&forUnmarshaling->fragmentShadingRateWithShaderDepthStencilWrites, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->fragmentShadingRateWithShaderDepthStencilWrites, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy((VkBool32*)&forUnmarshaling->fragmentShadingRateWithSampleMask, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->fragmentShadingRateWithShaderSampleMask, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->fragmentShadingRateWithShaderSampleMask, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->fragmentShadingRateWithConservativeRasterization, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->fragmentShadingRateWithConservativeRasterization, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->fragmentShadingRateWithFragmentShaderInterlock, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->fragmentShadingRateWithFragmentShaderInterlock, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->fragmentShadingRateWithCustomSampleLocations, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->fragmentShadingRateWithCustomSampleLocations, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->fragmentShadingRateStrictMultiplyCombiner, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->fragmentShadingRateStrictMultiplyCombiner, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkPhysicalDeviceFragmentShadingRateKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFragmentShadingRateKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceFragmentShadingRateKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -11854,19 +11679,22 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkSampleCountFlags*)&forUnmarshaling->sampleCounts, *ptr, sizeof(VkSampleCountFlags));
     *ptr += sizeof(VkSampleCountFlags);
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->fragmentSize), ptr);
+    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->fragmentSize),
+                                 ptr);
 }
 
 #endif
@@ -11874,15 +11702,11 @@
 #endif
 #ifdef VK_KHR_surface_protected_capabilities
 void reservedunmarshal_VkSurfaceProtectedCapabilitiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSurfaceProtectedCapabilitiesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSurfaceProtectedCapabilitiesKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -11890,15 +11714,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->supportsProtected, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -11909,15 +11735,11 @@
 #endif
 #ifdef VK_KHR_present_wait
 void reservedunmarshal_VkPhysicalDevicePresentWaitFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePresentWaitFeaturesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePresentWaitFeaturesKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -11925,15 +11747,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->presentWait, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -11948,15 +11772,11 @@
 #endif
 #ifdef VK_KHR_pipeline_executable_properties
 void reservedunmarshal_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -11964,30 +11784,27 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->pipelineExecutableInfo, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
-void reservedunmarshal_VkPipelineInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkPipelineInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkPipelineInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -11995,32 +11812,31 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkPipeline*)&forUnmarshaling->pipeline = (VkPipeline)unbox_VkPipeline((VkPipeline)(*&cgen_var_0));
+    *(VkPipeline*)&forUnmarshaling->pipeline =
+        (VkPipeline)unbox_VkPipeline((VkPipeline)(*&cgen_var_0));
 }
 
 void reservedunmarshal_VkPipelineExecutablePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineExecutablePropertiesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineExecutablePropertiesKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -12028,15 +11844,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkShaderStageFlags*)&forUnmarshaling->stages, *ptr, sizeof(VkShaderStageFlags));
     *ptr += sizeof(VkShaderStageFlags);
@@ -12048,16 +11866,12 @@
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkPipelineExecutableInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineExecutableInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkPipelineExecutableInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkPipelineExecutableInfoKHR* forUnmarshaling,
+                                                   uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -12065,44 +11879,40 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkPipeline*)&forUnmarshaling->pipeline = (VkPipeline)unbox_VkPipeline((VkPipeline)(*&cgen_var_0));
+    *(VkPipeline*)&forUnmarshaling->pipeline =
+        (VkPipeline)unbox_VkPipeline((VkPipeline)(*&cgen_var_0));
     memcpy((uint32_t*)&forUnmarshaling->executableIndex, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
 void reservedunmarshal_VkPipelineExecutableStatisticValueKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineExecutableStatisticValueKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineExecutableStatisticValueKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkBool32*)&forUnmarshaling->b32, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkPipelineExecutableStatisticKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineExecutableStatisticKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineExecutableStatisticKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -12110,35 +11920,35 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((char*)forUnmarshaling->name, *ptr, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
     *ptr += VK_MAX_DESCRIPTION_SIZE * sizeof(char);
     memcpy((char*)forUnmarshaling->description, *ptr, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
     *ptr += VK_MAX_DESCRIPTION_SIZE * sizeof(char);
-    memcpy((VkPipelineExecutableStatisticFormatKHR*)&forUnmarshaling->format, *ptr, sizeof(VkPipelineExecutableStatisticFormatKHR));
+    memcpy((VkPipelineExecutableStatisticFormatKHR*)&forUnmarshaling->format, *ptr,
+           sizeof(VkPipelineExecutableStatisticFormatKHR));
     *ptr += sizeof(VkPipelineExecutableStatisticFormatKHR);
-    reservedunmarshal_VkPipelineExecutableStatisticValueKHR(vkStream, rootType, (VkPipelineExecutableStatisticValueKHR*)(&forUnmarshaling->value), ptr);
+    reservedunmarshal_VkPipelineExecutableStatisticValueKHR(
+        vkStream, rootType, (VkPipelineExecutableStatisticValueKHR*)(&forUnmarshaling->value), ptr);
 }
 
 void reservedunmarshal_VkPipelineExecutableInternalRepresentationKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineExecutableInternalRepresentationKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineExecutableInternalRepresentationKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -12146,15 +11956,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((char*)forUnmarshaling->name, *ptr, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
     *ptr += VK_MAX_DESCRIPTION_SIZE * sizeof(char);
@@ -12169,9 +11981,9 @@
     memcpy((void**)&forUnmarshaling->pData, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pData);
     *ptr += 8;
-    if (forUnmarshaling->pData)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pData, forUnmarshaling->dataSize * sizeof(uint8_t));
+    if (forUnmarshaling->pData) {
+        vkStream->alloc((void**)&forUnmarshaling->pData,
+                        forUnmarshaling->dataSize * sizeof(uint8_t));
         memcpy((void*)forUnmarshaling->pData, *ptr, forUnmarshaling->dataSize * sizeof(uint8_t));
         *ptr += forUnmarshaling->dataSize * sizeof(uint8_t);
     }
@@ -12180,15 +11992,11 @@
 #endif
 #ifdef VK_KHR_shader_integer_dot_product
 void reservedunmarshal_VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -12196,30 +12004,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->shaderIntegerDotProduct, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -12227,90 +12033,133 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkBool32*)&forUnmarshaling->integerDotProduct8BitUnsignedAccelerated, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->integerDotProduct8BitUnsignedAccelerated, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->integerDotProduct8BitSignedAccelerated, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->integerDotProduct8BitSignedAccelerated, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->integerDotProduct8BitMixedSignednessAccelerated, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->integerDotProduct8BitMixedSignednessAccelerated, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->integerDotProduct4x8BitPackedUnsignedAccelerated, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->integerDotProduct4x8BitPackedUnsignedAccelerated, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->integerDotProduct4x8BitPackedSignedAccelerated, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->integerDotProduct4x8BitPackedSignedAccelerated, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->integerDotProduct4x8BitPackedMixedSignednessAccelerated, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->integerDotProduct4x8BitPackedMixedSignednessAccelerated,
+           *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->integerDotProduct16BitUnsignedAccelerated, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->integerDotProduct16BitUnsignedAccelerated, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->integerDotProduct16BitSignedAccelerated, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->integerDotProduct16BitSignedAccelerated, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->integerDotProduct16BitMixedSignednessAccelerated, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->integerDotProduct16BitMixedSignednessAccelerated, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->integerDotProduct32BitUnsignedAccelerated, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->integerDotProduct32BitUnsignedAccelerated, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->integerDotProduct32BitSignedAccelerated, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->integerDotProduct32BitSignedAccelerated, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->integerDotProduct32BitMixedSignednessAccelerated, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->integerDotProduct32BitMixedSignednessAccelerated, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->integerDotProduct64BitUnsignedAccelerated, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->integerDotProduct64BitUnsignedAccelerated, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->integerDotProduct64BitSignedAccelerated, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->integerDotProduct64BitSignedAccelerated, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->integerDotProduct64BitMixedSignednessAccelerated, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->integerDotProduct64BitMixedSignednessAccelerated, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating8BitUnsignedAccelerated, *ptr, sizeof(VkBool32));
+    memcpy(
+        (VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating8BitUnsignedAccelerated,
+        *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating8BitSignedAccelerated, *ptr, sizeof(VkBool32));
+    memcpy(
+        (VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating8BitSignedAccelerated,
+        *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling
+               ->integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated,
+           *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling
+               ->integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated,
+           *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling
+               ->integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated,
+           *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling
+               ->integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated,
+           *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating16BitUnsignedAccelerated, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling
+               ->integerDotProductAccumulatingSaturating16BitUnsignedAccelerated,
+           *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating16BitSignedAccelerated, *ptr, sizeof(VkBool32));
+    memcpy(
+        (VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating16BitSignedAccelerated,
+        *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling
+               ->integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated,
+           *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating32BitUnsignedAccelerated, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling
+               ->integerDotProductAccumulatingSaturating32BitUnsignedAccelerated,
+           *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating32BitSignedAccelerated, *ptr, sizeof(VkBool32));
+    memcpy(
+        (VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating32BitSignedAccelerated,
+        *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling
+               ->integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated,
+           *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating64BitUnsignedAccelerated, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling
+               ->integerDotProductAccumulatingSaturating64BitUnsignedAccelerated,
+           *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating64BitSignedAccelerated, *ptr, sizeof(VkBool32));
+    memcpy(
+        (VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating64BitSignedAccelerated,
+        *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling
+               ->integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated,
+           *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 #endif
 #ifdef VK_KHR_pipeline_library
 void reservedunmarshal_VkPipelineLibraryCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineLibraryCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineLibraryCreateInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -12318,29 +12167,31 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->libraryCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pLibraries, forUnmarshaling->libraryCount * sizeof(const VkPipeline));
-    if (forUnmarshaling->libraryCount)
-    {
+    vkStream->alloc((void**)&forUnmarshaling->pLibraries,
+                    forUnmarshaling->libraryCount * sizeof(const VkPipeline));
+    if (forUnmarshaling->libraryCount) {
         uint8_t* cgen_var_0_ptr = (uint8_t*)(*ptr);
         *ptr += 8 * forUnmarshaling->libraryCount;
-        if (forUnmarshaling)
-        {
-            for (uint32_t k = 0; k < forUnmarshaling->libraryCount; ++k)
-            {
-                uint64_t tmpval; memcpy(&tmpval, cgen_var_0_ptr + k * 8, sizeof(uint64_t));
-                *(((VkPipeline*)forUnmarshaling->pLibraries) + k) = (VkPipeline)unbox_VkPipeline((VkPipeline)tmpval);
+        if (forUnmarshaling) {
+            for (uint32_t k = 0; k < forUnmarshaling->libraryCount; ++k) {
+                uint64_t tmpval;
+                memcpy(&tmpval, cgen_var_0_ptr + k * 8, sizeof(uint64_t));
+                *(((VkPipeline*)forUnmarshaling->pLibraries) + k) =
+                    (VkPipeline)unbox_VkPipeline((VkPipeline)tmpval);
             }
         }
     }
@@ -12350,16 +12201,11 @@
 #ifdef VK_KHR_shader_non_semantic_info
 #endif
 #ifdef VK_KHR_present_id
-void reservedunmarshal_VkPresentIdKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPresentIdKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkPresentIdKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                      VkPresentIdKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -12367,15 +12213,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->swapchainCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -12383,24 +12231,21 @@
     memcpy((uint64_t**)&forUnmarshaling->pPresentIds, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pPresentIds);
     *ptr += 8;
-    if (forUnmarshaling->pPresentIds)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pPresentIds, forUnmarshaling->swapchainCount * sizeof(const uint64_t));
-        memcpy((uint64_t*)forUnmarshaling->pPresentIds, *ptr, forUnmarshaling->swapchainCount * sizeof(const uint64_t));
+    if (forUnmarshaling->pPresentIds) {
+        vkStream->alloc((void**)&forUnmarshaling->pPresentIds,
+                        forUnmarshaling->swapchainCount * sizeof(const uint64_t));
+        memcpy((uint64_t*)forUnmarshaling->pPresentIds, *ptr,
+               forUnmarshaling->swapchainCount * sizeof(const uint64_t));
         *ptr += forUnmarshaling->swapchainCount * sizeof(const uint64_t);
     }
 }
 
 void reservedunmarshal_VkPhysicalDevicePresentIdFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePresentIdFeaturesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePresentIdFeaturesKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -12408,15 +12253,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->presentId, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -12424,16 +12271,11 @@
 
 #endif
 #ifdef VK_KHR_video_encode_queue
-void reservedunmarshal_VkVideoEncodeInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkVideoEncodeInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkVideoEncodeInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -12441,51 +12283,57 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkVideoEncodeFlagsKHR*)&forUnmarshaling->flags, *ptr, sizeof(VkVideoEncodeFlagsKHR));
     *ptr += sizeof(VkVideoEncodeFlagsKHR);
     memcpy((uint32_t*)&forUnmarshaling->qualityLevel, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->codedExtent), ptr);
+    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->codedExtent),
+                                 ptr);
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkBuffer*)&forUnmarshaling->dstBitstreamBuffer = (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_0));
+    *(VkBuffer*)&forUnmarshaling->dstBitstreamBuffer =
+        (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_0));
     memcpy((VkDeviceSize*)&forUnmarshaling->dstBitstreamBufferOffset, *ptr, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
     memcpy((VkDeviceSize*)&forUnmarshaling->dstBitstreamBufferMaxRange, *ptr, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
-    reservedunmarshal_VkVideoPictureResourceKHR(vkStream, rootType, (VkVideoPictureResourceKHR*)(&forUnmarshaling->srcPictureResource), ptr);
-    vkStream->alloc((void**)&forUnmarshaling->pSetupReferenceSlot, sizeof(const VkVideoReferenceSlotKHR));
-    reservedunmarshal_VkVideoReferenceSlotKHR(vkStream, rootType, (VkVideoReferenceSlotKHR*)(forUnmarshaling->pSetupReferenceSlot), ptr);
+    reservedunmarshal_VkVideoPictureResourceKHR(
+        vkStream, rootType, (VkVideoPictureResourceKHR*)(&forUnmarshaling->srcPictureResource),
+        ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pSetupReferenceSlot,
+                    sizeof(const VkVideoReferenceSlotKHR));
+    reservedunmarshal_VkVideoReferenceSlotKHR(
+        vkStream, rootType, (VkVideoReferenceSlotKHR*)(forUnmarshaling->pSetupReferenceSlot), ptr);
     memcpy((uint32_t*)&forUnmarshaling->referenceSlotCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pReferenceSlots, forUnmarshaling->referenceSlotCount * sizeof(const VkVideoReferenceSlotKHR));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->referenceSlotCount; ++i)
-    {
-        reservedunmarshal_VkVideoReferenceSlotKHR(vkStream, rootType, (VkVideoReferenceSlotKHR*)(forUnmarshaling->pReferenceSlots + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pReferenceSlots,
+                    forUnmarshaling->referenceSlotCount * sizeof(const VkVideoReferenceSlotKHR));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->referenceSlotCount; ++i) {
+        reservedunmarshal_VkVideoReferenceSlotKHR(
+            vkStream, rootType, (VkVideoReferenceSlotKHR*)(forUnmarshaling->pReferenceSlots + i),
+            ptr);
     }
 }
 
 void reservedunmarshal_VkVideoEncodeRateControlInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeRateControlInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeRateControlInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -12493,19 +12341,23 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkVideoEncodeRateControlFlagsKHR*)&forUnmarshaling->flags, *ptr, sizeof(VkVideoEncodeRateControlFlagsKHR));
+    memcpy((VkVideoEncodeRateControlFlagsKHR*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkVideoEncodeRateControlFlagsKHR));
     *ptr += sizeof(VkVideoEncodeRateControlFlagsKHR);
-    memcpy((VkVideoEncodeRateControlModeFlagBitsKHR*)&forUnmarshaling->rateControlMode, *ptr, sizeof(VkVideoEncodeRateControlModeFlagBitsKHR));
+    memcpy((VkVideoEncodeRateControlModeFlagBitsKHR*)&forUnmarshaling->rateControlMode, *ptr,
+           sizeof(VkVideoEncodeRateControlModeFlagBitsKHR));
     *ptr += sizeof(VkVideoEncodeRateControlModeFlagBitsKHR);
     memcpy((uint32_t*)&forUnmarshaling->averageBitrate, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -12521,16 +12373,11 @@
 
 #endif
 #ifdef VK_KHR_synchronization2
-void reservedunmarshal_VkMemoryBarrier2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryBarrier2KHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkMemoryBarrier2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkMemoryBarrier2KHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -12538,36 +12385,36 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkPipelineStageFlags2KHR*)&forUnmarshaling->srcStageMask, *ptr, sizeof(VkPipelineStageFlags2KHR));
+    memcpy((VkPipelineStageFlags2KHR*)&forUnmarshaling->srcStageMask, *ptr,
+           sizeof(VkPipelineStageFlags2KHR));
     *ptr += sizeof(VkPipelineStageFlags2KHR);
     memcpy((VkAccessFlags2KHR*)&forUnmarshaling->srcAccessMask, *ptr, sizeof(VkAccessFlags2KHR));
     *ptr += sizeof(VkAccessFlags2KHR);
-    memcpy((VkPipelineStageFlags2KHR*)&forUnmarshaling->dstStageMask, *ptr, sizeof(VkPipelineStageFlags2KHR));
+    memcpy((VkPipelineStageFlags2KHR*)&forUnmarshaling->dstStageMask, *ptr,
+           sizeof(VkPipelineStageFlags2KHR));
     *ptr += sizeof(VkPipelineStageFlags2KHR);
     memcpy((VkAccessFlags2KHR*)&forUnmarshaling->dstAccessMask, *ptr, sizeof(VkAccessFlags2KHR));
     *ptr += sizeof(VkAccessFlags2KHR);
 }
 
-void reservedunmarshal_VkBufferMemoryBarrier2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferMemoryBarrier2KHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkBufferMemoryBarrier2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkBufferMemoryBarrier2KHR* forUnmarshaling,
+                                                 uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -12575,21 +12422,25 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkPipelineStageFlags2KHR*)&forUnmarshaling->srcStageMask, *ptr, sizeof(VkPipelineStageFlags2KHR));
+    memcpy((VkPipelineStageFlags2KHR*)&forUnmarshaling->srcStageMask, *ptr,
+           sizeof(VkPipelineStageFlags2KHR));
     *ptr += sizeof(VkPipelineStageFlags2KHR);
     memcpy((VkAccessFlags2KHR*)&forUnmarshaling->srcAccessMask, *ptr, sizeof(VkAccessFlags2KHR));
     *ptr += sizeof(VkAccessFlags2KHR);
-    memcpy((VkPipelineStageFlags2KHR*)&forUnmarshaling->dstStageMask, *ptr, sizeof(VkPipelineStageFlags2KHR));
+    memcpy((VkPipelineStageFlags2KHR*)&forUnmarshaling->dstStageMask, *ptr,
+           sizeof(VkPipelineStageFlags2KHR));
     *ptr += sizeof(VkPipelineStageFlags2KHR);
     memcpy((VkAccessFlags2KHR*)&forUnmarshaling->dstAccessMask, *ptr, sizeof(VkAccessFlags2KHR));
     *ptr += sizeof(VkAccessFlags2KHR);
@@ -12607,16 +12458,12 @@
     *ptr += sizeof(VkDeviceSize);
 }
 
-void reservedunmarshal_VkImageMemoryBarrier2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageMemoryBarrier2KHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkImageMemoryBarrier2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkImageMemoryBarrier2KHR* forUnmarshaling,
+                                                uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -12624,21 +12471,25 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkPipelineStageFlags2KHR*)&forUnmarshaling->srcStageMask, *ptr, sizeof(VkPipelineStageFlags2KHR));
+    memcpy((VkPipelineStageFlags2KHR*)&forUnmarshaling->srcStageMask, *ptr,
+           sizeof(VkPipelineStageFlags2KHR));
     *ptr += sizeof(VkPipelineStageFlags2KHR);
     memcpy((VkAccessFlags2KHR*)&forUnmarshaling->srcAccessMask, *ptr, sizeof(VkAccessFlags2KHR));
     *ptr += sizeof(VkAccessFlags2KHR);
-    memcpy((VkPipelineStageFlags2KHR*)&forUnmarshaling->dstStageMask, *ptr, sizeof(VkPipelineStageFlags2KHR));
+    memcpy((VkPipelineStageFlags2KHR*)&forUnmarshaling->dstStageMask, *ptr,
+           sizeof(VkPipelineStageFlags2KHR));
     *ptr += sizeof(VkPipelineStageFlags2KHR);
     memcpy((VkAccessFlags2KHR*)&forUnmarshaling->dstAccessMask, *ptr, sizeof(VkAccessFlags2KHR));
     *ptr += sizeof(VkAccessFlags2KHR);
@@ -12654,19 +12505,15 @@
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
     *(VkImage*)&forUnmarshaling->image = (VkImage)unbox_VkImage((VkImage)(*&cgen_var_0));
-    reservedunmarshal_VkImageSubresourceRange(vkStream, rootType, (VkImageSubresourceRange*)(&forUnmarshaling->subresourceRange), ptr);
+    reservedunmarshal_VkImageSubresourceRange(
+        vkStream, rootType, (VkImageSubresourceRange*)(&forUnmarshaling->subresourceRange), ptr);
 }
 
-void reservedunmarshal_VkDependencyInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDependencyInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDependencyInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkDependencyInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -12674,51 +12521,56 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkDependencyFlags*)&forUnmarshaling->dependencyFlags, *ptr, sizeof(VkDependencyFlags));
     *ptr += sizeof(VkDependencyFlags);
     memcpy((uint32_t*)&forUnmarshaling->memoryBarrierCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pMemoryBarriers, forUnmarshaling->memoryBarrierCount * sizeof(const VkMemoryBarrier2KHR));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->memoryBarrierCount; ++i)
-    {
-        reservedunmarshal_VkMemoryBarrier2KHR(vkStream, rootType, (VkMemoryBarrier2KHR*)(forUnmarshaling->pMemoryBarriers + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pMemoryBarriers,
+                    forUnmarshaling->memoryBarrierCount * sizeof(const VkMemoryBarrier2KHR));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->memoryBarrierCount; ++i) {
+        reservedunmarshal_VkMemoryBarrier2KHR(
+            vkStream, rootType, (VkMemoryBarrier2KHR*)(forUnmarshaling->pMemoryBarriers + i), ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->bufferMemoryBarrierCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pBufferMemoryBarriers, forUnmarshaling->bufferMemoryBarrierCount * sizeof(const VkBufferMemoryBarrier2KHR));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->bufferMemoryBarrierCount; ++i)
-    {
-        reservedunmarshal_VkBufferMemoryBarrier2KHR(vkStream, rootType, (VkBufferMemoryBarrier2KHR*)(forUnmarshaling->pBufferMemoryBarriers + i), ptr);
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pBufferMemoryBarriers,
+        forUnmarshaling->bufferMemoryBarrierCount * sizeof(const VkBufferMemoryBarrier2KHR));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->bufferMemoryBarrierCount; ++i) {
+        reservedunmarshal_VkBufferMemoryBarrier2KHR(
+            vkStream, rootType,
+            (VkBufferMemoryBarrier2KHR*)(forUnmarshaling->pBufferMemoryBarriers + i), ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->imageMemoryBarrierCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pImageMemoryBarriers, forUnmarshaling->imageMemoryBarrierCount * sizeof(const VkImageMemoryBarrier2KHR));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->imageMemoryBarrierCount; ++i)
-    {
-        reservedunmarshal_VkImageMemoryBarrier2KHR(vkStream, rootType, (VkImageMemoryBarrier2KHR*)(forUnmarshaling->pImageMemoryBarriers + i), ptr);
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pImageMemoryBarriers,
+        forUnmarshaling->imageMemoryBarrierCount * sizeof(const VkImageMemoryBarrier2KHR));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->imageMemoryBarrierCount; ++i) {
+        reservedunmarshal_VkImageMemoryBarrier2KHR(
+            vkStream, rootType,
+            (VkImageMemoryBarrier2KHR*)(forUnmarshaling->pImageMemoryBarriers + i), ptr);
     }
 }
 
-void reservedunmarshal_VkSemaphoreSubmitInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSemaphoreSubmitInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkSemaphoreSubmitInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkSemaphoreSubmitInfoKHR* forUnmarshaling,
+                                                uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -12726,38 +12578,39 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkSemaphore*)&forUnmarshaling->semaphore = (VkSemaphore)unbox_VkSemaphore((VkSemaphore)(*&cgen_var_0));
+    *(VkSemaphore*)&forUnmarshaling->semaphore =
+        (VkSemaphore)unbox_VkSemaphore((VkSemaphore)(*&cgen_var_0));
     memcpy((uint64_t*)&forUnmarshaling->value, *ptr, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
-    memcpy((VkPipelineStageFlags2KHR*)&forUnmarshaling->stageMask, *ptr, sizeof(VkPipelineStageFlags2KHR));
+    memcpy((VkPipelineStageFlags2KHR*)&forUnmarshaling->stageMask, *ptr,
+           sizeof(VkPipelineStageFlags2KHR));
     *ptr += sizeof(VkPipelineStageFlags2KHR);
     memcpy((uint32_t*)&forUnmarshaling->deviceIndex, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkCommandBufferSubmitInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCommandBufferSubmitInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkCommandBufferSubmitInfoKHR(VulkanStream* vkStream,
+                                                    VkStructureType rootType,
+                                                    VkCommandBufferSubmitInfoKHR* forUnmarshaling,
+                                                    uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -12765,34 +12618,32 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkCommandBuffer*)&forUnmarshaling->commandBuffer = (VkCommandBuffer)unbox_VkCommandBuffer((VkCommandBuffer)(*&cgen_var_0));
+    *(VkCommandBuffer*)&forUnmarshaling->commandBuffer =
+        (VkCommandBuffer)unbox_VkCommandBuffer((VkCommandBuffer)(*&cgen_var_0));
     memcpy((uint32_t*)&forUnmarshaling->deviceMask, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkSubmitInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubmitInfo2KHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkSubmitInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkSubmitInfo2KHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -12800,51 +12651,58 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkSubmitFlagsKHR*)&forUnmarshaling->flags, *ptr, sizeof(VkSubmitFlagsKHR));
     *ptr += sizeof(VkSubmitFlagsKHR);
     memcpy((uint32_t*)&forUnmarshaling->waitSemaphoreInfoCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pWaitSemaphoreInfos, forUnmarshaling->waitSemaphoreInfoCount * sizeof(const VkSemaphoreSubmitInfoKHR));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->waitSemaphoreInfoCount; ++i)
-    {
-        reservedunmarshal_VkSemaphoreSubmitInfoKHR(vkStream, rootType, (VkSemaphoreSubmitInfoKHR*)(forUnmarshaling->pWaitSemaphoreInfos + i), ptr);
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pWaitSemaphoreInfos,
+        forUnmarshaling->waitSemaphoreInfoCount * sizeof(const VkSemaphoreSubmitInfoKHR));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->waitSemaphoreInfoCount; ++i) {
+        reservedunmarshal_VkSemaphoreSubmitInfoKHR(
+            vkStream, rootType,
+            (VkSemaphoreSubmitInfoKHR*)(forUnmarshaling->pWaitSemaphoreInfos + i), ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->commandBufferInfoCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pCommandBufferInfos, forUnmarshaling->commandBufferInfoCount * sizeof(const VkCommandBufferSubmitInfoKHR));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->commandBufferInfoCount; ++i)
-    {
-        reservedunmarshal_VkCommandBufferSubmitInfoKHR(vkStream, rootType, (VkCommandBufferSubmitInfoKHR*)(forUnmarshaling->pCommandBufferInfos + i), ptr);
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pCommandBufferInfos,
+        forUnmarshaling->commandBufferInfoCount * sizeof(const VkCommandBufferSubmitInfoKHR));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->commandBufferInfoCount; ++i) {
+        reservedunmarshal_VkCommandBufferSubmitInfoKHR(
+            vkStream, rootType,
+            (VkCommandBufferSubmitInfoKHR*)(forUnmarshaling->pCommandBufferInfos + i), ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->signalSemaphoreInfoCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pSignalSemaphoreInfos, forUnmarshaling->signalSemaphoreInfoCount * sizeof(const VkSemaphoreSubmitInfoKHR));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->signalSemaphoreInfoCount; ++i)
-    {
-        reservedunmarshal_VkSemaphoreSubmitInfoKHR(vkStream, rootType, (VkSemaphoreSubmitInfoKHR*)(forUnmarshaling->pSignalSemaphoreInfos + i), ptr);
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pSignalSemaphoreInfos,
+        forUnmarshaling->signalSemaphoreInfoCount * sizeof(const VkSemaphoreSubmitInfoKHR));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->signalSemaphoreInfoCount; ++i) {
+        reservedunmarshal_VkSemaphoreSubmitInfoKHR(
+            vkStream, rootType,
+            (VkSemaphoreSubmitInfoKHR*)(forUnmarshaling->pSignalSemaphoreInfos + i), ptr);
     }
 }
 
 void reservedunmarshal_VkPhysicalDeviceSynchronization2FeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSynchronization2FeaturesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceSynchronization2FeaturesKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -12852,30 +12710,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->synchronization2, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkQueueFamilyCheckpointProperties2NV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkQueueFamilyCheckpointProperties2NV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkQueueFamilyCheckpointProperties2NV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -12883,30 +12739,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkPipelineStageFlags2KHR*)&forUnmarshaling->checkpointExecutionStageMask, *ptr, sizeof(VkPipelineStageFlags2KHR));
+    memcpy((VkPipelineStageFlags2KHR*)&forUnmarshaling->checkpointExecutionStageMask, *ptr,
+           sizeof(VkPipelineStageFlags2KHR));
     *ptr += sizeof(VkPipelineStageFlags2KHR);
 }
 
-void reservedunmarshal_VkCheckpointData2NV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCheckpointData2NV* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkCheckpointData2NV(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkCheckpointData2NV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -12914,24 +12768,26 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkPipelineStageFlags2KHR*)&forUnmarshaling->stage, *ptr, sizeof(VkPipelineStageFlags2KHR));
+    memcpy((VkPipelineStageFlags2KHR*)&forUnmarshaling->stage, *ptr,
+           sizeof(VkPipelineStageFlags2KHR));
     *ptr += sizeof(VkPipelineStageFlags2KHR);
     // WARNING PTR CHECK
     memcpy((void**)&forUnmarshaling->pCheckpointMarker, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pCheckpointMarker);
     *ptr += 8;
-    if (forUnmarshaling->pCheckpointMarker)
-    {
+    if (forUnmarshaling->pCheckpointMarker) {
         vkStream->alloc((void**)&forUnmarshaling->pCheckpointMarker, sizeof(uint8_t));
         memcpy((void*)forUnmarshaling->pCheckpointMarker, *ptr, sizeof(uint8_t));
         *ptr += sizeof(uint8_t);
@@ -12941,15 +12797,11 @@
 #endif
 #ifdef VK_KHR_shader_subgroup_uniform_control_flow
 void reservedunmarshal_VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -12957,15 +12809,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->shaderSubgroupUniformControlFlow, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -12974,15 +12828,11 @@
 #endif
 #ifdef VK_KHR_zero_initialize_workgroup_memory
 void reservedunmarshal_VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -12990,32 +12840,31 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkBool32*)&forUnmarshaling->shaderZeroInitializeWorkgroupMemory, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->shaderZeroInitializeWorkgroupMemory, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 #endif
 #ifdef VK_KHR_workgroup_memory_explicit_layout
 void reservedunmarshal_VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -13023,38 +12872,38 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->workgroupMemoryExplicitLayout, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->workgroupMemoryExplicitLayoutScalarBlockLayout, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->workgroupMemoryExplicitLayoutScalarBlockLayout, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->workgroupMemoryExplicitLayout8BitAccess, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->workgroupMemoryExplicitLayout8BitAccess, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->workgroupMemoryExplicitLayout16BitAccess, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->workgroupMemoryExplicitLayout16BitAccess, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 #endif
 #ifdef VK_KHR_copy_commands2
-void reservedunmarshal_VkBufferCopy2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferCopy2KHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkBufferCopy2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkBufferCopy2KHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -13062,15 +12911,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkDeviceSize*)&forUnmarshaling->srcOffset, *ptr, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
@@ -13080,16 +12931,11 @@
     *ptr += sizeof(VkDeviceSize);
 }
 
-void reservedunmarshal_VkCopyBufferInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCopyBufferInfo2KHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkCopyBufferInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkCopyBufferInfo2KHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -13097,15 +12943,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
@@ -13117,23 +12965,19 @@
     *(VkBuffer*)&forUnmarshaling->dstBuffer = (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_1));
     memcpy((uint32_t*)&forUnmarshaling->regionCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pRegions, forUnmarshaling->regionCount * sizeof(const VkBufferCopy2KHR));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->regionCount; ++i)
-    {
-        reservedunmarshal_VkBufferCopy2KHR(vkStream, rootType, (VkBufferCopy2KHR*)(forUnmarshaling->pRegions + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pRegions,
+                    forUnmarshaling->regionCount * sizeof(const VkBufferCopy2KHR));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->regionCount; ++i) {
+        reservedunmarshal_VkBufferCopy2KHR(vkStream, rootType,
+                                           (VkBufferCopy2KHR*)(forUnmarshaling->pRegions + i), ptr);
     }
 }
 
-void reservedunmarshal_VkImageCopy2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageCopy2KHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkImageCopy2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkImageCopy2KHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -13141,33 +12985,34 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    reservedunmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->srcSubresource), ptr);
-    reservedunmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->srcOffset), ptr);
-    reservedunmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->dstSubresource), ptr);
-    reservedunmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->dstOffset), ptr);
+    reservedunmarshal_VkImageSubresourceLayers(
+        vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->srcSubresource), ptr);
+    reservedunmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->srcOffset),
+                                 ptr);
+    reservedunmarshal_VkImageSubresourceLayers(
+        vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->dstSubresource), ptr);
+    reservedunmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->dstOffset),
+                                 ptr);
     reservedunmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forUnmarshaling->extent), ptr);
 }
 
-void reservedunmarshal_VkCopyImageInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCopyImageInfo2KHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkCopyImageInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkCopyImageInfo2KHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -13175,15 +13020,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
@@ -13199,23 +13046,20 @@
     *ptr += sizeof(VkImageLayout);
     memcpy((uint32_t*)&forUnmarshaling->regionCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pRegions, forUnmarshaling->regionCount * sizeof(const VkImageCopy2KHR));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->regionCount; ++i)
-    {
-        reservedunmarshal_VkImageCopy2KHR(vkStream, rootType, (VkImageCopy2KHR*)(forUnmarshaling->pRegions + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pRegions,
+                    forUnmarshaling->regionCount * sizeof(const VkImageCopy2KHR));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->regionCount; ++i) {
+        reservedunmarshal_VkImageCopy2KHR(vkStream, rootType,
+                                          (VkImageCopy2KHR*)(forUnmarshaling->pRegions + i), ptr);
     }
 }
 
-void reservedunmarshal_VkBufferImageCopy2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferImageCopy2KHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkBufferImageCopy2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkBufferImageCopy2KHR* forUnmarshaling,
+                                             uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -13223,15 +13067,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkDeviceSize*)&forUnmarshaling->bufferOffset, *ptr, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
@@ -13239,21 +13085,20 @@
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->bufferImageHeight, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    reservedunmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->imageSubresource), ptr);
-    reservedunmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->imageOffset), ptr);
-    reservedunmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forUnmarshaling->imageExtent), ptr);
+    reservedunmarshal_VkImageSubresourceLayers(
+        vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->imageSubresource), ptr);
+    reservedunmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->imageOffset),
+                                 ptr);
+    reservedunmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forUnmarshaling->imageExtent),
+                                 ptr);
 }
 
-void reservedunmarshal_VkCopyBufferToImageInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCopyBufferToImageInfo2KHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkCopyBufferToImageInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkCopyBufferToImageInfo2KHR* forUnmarshaling,
+                                                   uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -13261,15 +13106,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
@@ -13283,23 +13130,20 @@
     *ptr += sizeof(VkImageLayout);
     memcpy((uint32_t*)&forUnmarshaling->regionCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pRegions, forUnmarshaling->regionCount * sizeof(const VkBufferImageCopy2KHR));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->regionCount; ++i)
-    {
-        reservedunmarshal_VkBufferImageCopy2KHR(vkStream, rootType, (VkBufferImageCopy2KHR*)(forUnmarshaling->pRegions + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pRegions,
+                    forUnmarshaling->regionCount * sizeof(const VkBufferImageCopy2KHR));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->regionCount; ++i) {
+        reservedunmarshal_VkBufferImageCopy2KHR(
+            vkStream, rootType, (VkBufferImageCopy2KHR*)(forUnmarshaling->pRegions + i), ptr);
     }
 }
 
-void reservedunmarshal_VkCopyImageToBufferInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCopyImageToBufferInfo2KHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkCopyImageToBufferInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkCopyImageToBufferInfo2KHR* forUnmarshaling,
+                                                   uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -13307,15 +13151,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
@@ -13329,23 +13175,19 @@
     *(VkBuffer*)&forUnmarshaling->dstBuffer = (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_1));
     memcpy((uint32_t*)&forUnmarshaling->regionCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pRegions, forUnmarshaling->regionCount * sizeof(const VkBufferImageCopy2KHR));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->regionCount; ++i)
-    {
-        reservedunmarshal_VkBufferImageCopy2KHR(vkStream, rootType, (VkBufferImageCopy2KHR*)(forUnmarshaling->pRegions + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pRegions,
+                    forUnmarshaling->regionCount * sizeof(const VkBufferImageCopy2KHR));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->regionCount; ++i) {
+        reservedunmarshal_VkBufferImageCopy2KHR(
+            vkStream, rootType, (VkBufferImageCopy2KHR*)(forUnmarshaling->pRegions + i), ptr);
     }
 }
 
-void reservedunmarshal_VkImageBlit2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageBlit2KHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkImageBlit2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkImageBlit2KHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -13353,38 +13195,37 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    reservedunmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->srcSubresource), ptr);
-    for (uint32_t i = 0; i < (uint32_t)2; ++i)
-    {
-        reservedunmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(forUnmarshaling->srcOffsets + i), ptr);
+    reservedunmarshal_VkImageSubresourceLayers(
+        vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->srcSubresource), ptr);
+    for (uint32_t i = 0; i < (uint32_t)2; ++i) {
+        reservedunmarshal_VkOffset3D(vkStream, rootType,
+                                     (VkOffset3D*)(forUnmarshaling->srcOffsets + i), ptr);
     }
-    reservedunmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->dstSubresource), ptr);
-    for (uint32_t i = 0; i < (uint32_t)2; ++i)
-    {
-        reservedunmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(forUnmarshaling->dstOffsets + i), ptr);
+    reservedunmarshal_VkImageSubresourceLayers(
+        vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->dstSubresource), ptr);
+    for (uint32_t i = 0; i < (uint32_t)2; ++i) {
+        reservedunmarshal_VkOffset3D(vkStream, rootType,
+                                     (VkOffset3D*)(forUnmarshaling->dstOffsets + i), ptr);
     }
 }
 
-void reservedunmarshal_VkBlitImageInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBlitImageInfo2KHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkBlitImageInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkBlitImageInfo2KHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -13392,15 +13233,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
@@ -13416,25 +13259,21 @@
     *ptr += sizeof(VkImageLayout);
     memcpy((uint32_t*)&forUnmarshaling->regionCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pRegions, forUnmarshaling->regionCount * sizeof(const VkImageBlit2KHR));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->regionCount; ++i)
-    {
-        reservedunmarshal_VkImageBlit2KHR(vkStream, rootType, (VkImageBlit2KHR*)(forUnmarshaling->pRegions + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pRegions,
+                    forUnmarshaling->regionCount * sizeof(const VkImageBlit2KHR));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->regionCount; ++i) {
+        reservedunmarshal_VkImageBlit2KHR(vkStream, rootType,
+                                          (VkImageBlit2KHR*)(forUnmarshaling->pRegions + i), ptr);
     }
     memcpy((VkFilter*)&forUnmarshaling->filter, *ptr, sizeof(VkFilter));
     *ptr += sizeof(VkFilter);
 }
 
-void reservedunmarshal_VkImageResolve2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageResolve2KHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkImageResolve2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkImageResolve2KHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -13442,33 +13281,35 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    reservedunmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->srcSubresource), ptr);
-    reservedunmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->srcOffset), ptr);
-    reservedunmarshal_VkImageSubresourceLayers(vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->dstSubresource), ptr);
-    reservedunmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->dstOffset), ptr);
+    reservedunmarshal_VkImageSubresourceLayers(
+        vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->srcSubresource), ptr);
+    reservedunmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->srcOffset),
+                                 ptr);
+    reservedunmarshal_VkImageSubresourceLayers(
+        vkStream, rootType, (VkImageSubresourceLayers*)(&forUnmarshaling->dstSubresource), ptr);
+    reservedunmarshal_VkOffset3D(vkStream, rootType, (VkOffset3D*)(&forUnmarshaling->dstOffset),
+                                 ptr);
     reservedunmarshal_VkExtent3D(vkStream, rootType, (VkExtent3D*)(&forUnmarshaling->extent), ptr);
 }
 
-void reservedunmarshal_VkResolveImageInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkResolveImageInfo2KHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkResolveImageInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkResolveImageInfo2KHR* forUnmarshaling,
+                                              uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -13476,15 +13317,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
@@ -13500,25 +13343,22 @@
     *ptr += sizeof(VkImageLayout);
     memcpy((uint32_t*)&forUnmarshaling->regionCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pRegions, forUnmarshaling->regionCount * sizeof(const VkImageResolve2KHR));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->regionCount; ++i)
-    {
-        reservedunmarshal_VkImageResolve2KHR(vkStream, rootType, (VkImageResolve2KHR*)(forUnmarshaling->pRegions + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pRegions,
+                    forUnmarshaling->regionCount * sizeof(const VkImageResolve2KHR));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->regionCount; ++i) {
+        reservedunmarshal_VkImageResolve2KHR(
+            vkStream, rootType, (VkImageResolve2KHR*)(forUnmarshaling->pRegions + i), ptr);
     }
 }
 
 #endif
 #ifdef VK_KHR_format_feature_flags2
-void reservedunmarshal_VkFormatProperties3KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFormatProperties3KHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkFormatProperties3KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkFormatProperties3KHR* forUnmarshaling,
+                                              uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -13526,36 +13366,37 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkFormatFeatureFlags2KHR*)&forUnmarshaling->linearTilingFeatures, *ptr, sizeof(VkFormatFeatureFlags2KHR));
+    memcpy((VkFormatFeatureFlags2KHR*)&forUnmarshaling->linearTilingFeatures, *ptr,
+           sizeof(VkFormatFeatureFlags2KHR));
     *ptr += sizeof(VkFormatFeatureFlags2KHR);
-    memcpy((VkFormatFeatureFlags2KHR*)&forUnmarshaling->optimalTilingFeatures, *ptr, sizeof(VkFormatFeatureFlags2KHR));
+    memcpy((VkFormatFeatureFlags2KHR*)&forUnmarshaling->optimalTilingFeatures, *ptr,
+           sizeof(VkFormatFeatureFlags2KHR));
     *ptr += sizeof(VkFormatFeatureFlags2KHR);
-    memcpy((VkFormatFeatureFlags2KHR*)&forUnmarshaling->bufferFeatures, *ptr, sizeof(VkFormatFeatureFlags2KHR));
+    memcpy((VkFormatFeatureFlags2KHR*)&forUnmarshaling->bufferFeatures, *ptr,
+           sizeof(VkFormatFeatureFlags2KHR));
     *ptr += sizeof(VkFormatFeatureFlags2KHR);
 }
 
 #endif
 #ifdef VK_KHR_maintenance4
 void reservedunmarshal_VkPhysicalDeviceMaintenance4FeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMaintenance4FeaturesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMaintenance4FeaturesKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -13563,30 +13404,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->maintenance4, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkPhysicalDeviceMaintenance4PropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMaintenance4PropertiesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMaintenance4PropertiesKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -13594,30 +13433,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkDeviceSize*)&forUnmarshaling->maxBufferSize, *ptr, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
 }
 
 void reservedunmarshal_VkDeviceBufferMemoryRequirementsKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceBufferMemoryRequirementsKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDeviceBufferMemoryRequirementsKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -13625,30 +13462,29 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     vkStream->alloc((void**)&forUnmarshaling->pCreateInfo, sizeof(const VkBufferCreateInfo));
-    reservedunmarshal_VkBufferCreateInfo(vkStream, rootType, (VkBufferCreateInfo*)(forUnmarshaling->pCreateInfo), ptr);
+    reservedunmarshal_VkBufferCreateInfo(vkStream, rootType,
+                                         (VkBufferCreateInfo*)(forUnmarshaling->pCreateInfo), ptr);
 }
 
 void reservedunmarshal_VkDeviceImageMemoryRequirementsKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceImageMemoryRequirementsKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDeviceImageMemoryRequirementsKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -13656,34 +13492,34 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     vkStream->alloc((void**)&forUnmarshaling->pCreateInfo, sizeof(const VkImageCreateInfo));
-    reservedunmarshal_VkImageCreateInfo(vkStream, rootType, (VkImageCreateInfo*)(forUnmarshaling->pCreateInfo), ptr);
-    memcpy((VkImageAspectFlagBits*)&forUnmarshaling->planeAspect, *ptr, sizeof(VkImageAspectFlagBits));
+    reservedunmarshal_VkImageCreateInfo(vkStream, rootType,
+                                        (VkImageCreateInfo*)(forUnmarshaling->pCreateInfo), ptr);
+    memcpy((VkImageAspectFlagBits*)&forUnmarshaling->planeAspect, *ptr,
+           sizeof(VkImageAspectFlagBits));
     *ptr += sizeof(VkImageAspectFlagBits);
 }
 
 #endif
 #ifdef VK_ANDROID_native_buffer
-void reservedunmarshal_VkNativeBufferANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkNativeBufferANDROID* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkNativeBufferANDROID(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkNativeBufferANDROID* forUnmarshaling,
+                                             uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -13691,22 +13527,23 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     // WARNING PTR CHECK
     memcpy((uint32_t**)&forUnmarshaling->handle, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->handle);
     *ptr += 8;
-    if (forUnmarshaling->handle)
-    {
+    if (forUnmarshaling->handle) {
         vkStream->alloc((void**)&forUnmarshaling->handle, sizeof(const uint32_t));
         memcpy((uint32_t*)forUnmarshaling->handle, *ptr, sizeof(const uint32_t));
         *ptr += sizeof(const uint32_t);
@@ -13726,15 +13563,11 @@
 #endif
 #ifdef VK_EXT_debug_report
 void reservedunmarshal_VkDebugReportCallbackCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDebugReportCallbackCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDebugReportCallbackCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -13742,15 +13575,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkDebugReportFlagsEXT*)&forUnmarshaling->flags, *ptr, sizeof(VkDebugReportFlagsEXT));
     *ptr += sizeof(VkDebugReportFlagsEXT);
@@ -13761,8 +13596,7 @@
     memcpy((void**)&forUnmarshaling->pUserData, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pUserData);
     *ptr += 8;
-    if (forUnmarshaling->pUserData)
-    {
+    if (forUnmarshaling->pUserData) {
         vkStream->alloc((void**)&forUnmarshaling->pUserData, sizeof(uint8_t));
         memcpy((void*)forUnmarshaling->pUserData, *ptr, sizeof(uint8_t));
         *ptr += sizeof(uint8_t);
@@ -13778,15 +13612,11 @@
 #endif
 #ifdef VK_AMD_rasterization_order
 void reservedunmarshal_VkPipelineRasterizationStateRasterizationOrderAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineRasterizationStateRasterizationOrderAMD* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineRasterizationStateRasterizationOrderAMD* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -13794,17 +13624,20 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkRasterizationOrderAMD*)&forUnmarshaling->rasterizationOrder, *ptr, sizeof(VkRasterizationOrderAMD));
+    memcpy((VkRasterizationOrderAMD*)&forUnmarshaling->rasterizationOrder, *ptr,
+           sizeof(VkRasterizationOrderAMD));
     *ptr += sizeof(VkRasterizationOrderAMD);
 }
 
@@ -13815,15 +13648,11 @@
 #endif
 #ifdef VK_EXT_debug_marker
 void reservedunmarshal_VkDebugMarkerObjectNameInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDebugMarkerObjectNameInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDebugMarkerObjectNameInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -13831,33 +13660,33 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkDebugReportObjectTypeEXT*)&forUnmarshaling->objectType, *ptr, sizeof(VkDebugReportObjectTypeEXT));
+    memcpy((VkDebugReportObjectTypeEXT*)&forUnmarshaling->objectType, *ptr,
+           sizeof(VkDebugReportObjectTypeEXT));
     *ptr += sizeof(VkDebugReportObjectTypeEXT);
     memcpy((uint64_t*)&forUnmarshaling->object, *ptr, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
     vkStream->loadStringInPlaceWithStreamPtr((char**)&forUnmarshaling->pObjectName, ptr);
 }
 
-void reservedunmarshal_VkDebugMarkerObjectTagInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDebugMarkerObjectTagInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDebugMarkerObjectTagInfoEXT(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkDebugMarkerObjectTagInfoEXT* forUnmarshaling,
+                                                     uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -13865,17 +13694,20 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkDebugReportObjectTypeEXT*)&forUnmarshaling->objectType, *ptr, sizeof(VkDebugReportObjectTypeEXT));
+    memcpy((VkDebugReportObjectTypeEXT*)&forUnmarshaling->objectType, *ptr,
+           sizeof(VkDebugReportObjectTypeEXT));
     *ptr += sizeof(VkDebugReportObjectTypeEXT);
     memcpy((uint64_t*)&forUnmarshaling->object, *ptr, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
@@ -13884,21 +13716,18 @@
     memcpy((size_t*)&forUnmarshaling->tagSize, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->tagSize);
     *ptr += 8;
-    vkStream->alloc((void**)&forUnmarshaling->pTag, forUnmarshaling->tagSize * sizeof(const uint8_t));
+    vkStream->alloc((void**)&forUnmarshaling->pTag,
+                    forUnmarshaling->tagSize * sizeof(const uint8_t));
     memcpy((void*)forUnmarshaling->pTag, *ptr, forUnmarshaling->tagSize * sizeof(const uint8_t));
     *ptr += forUnmarshaling->tagSize * sizeof(const uint8_t);
 }
 
-void reservedunmarshal_VkDebugMarkerMarkerInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDebugMarkerMarkerInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDebugMarkerMarkerInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                  VkDebugMarkerMarkerInfoEXT* forUnmarshaling,
+                                                  uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -13906,15 +13735,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     vkStream->loadStringInPlaceWithStreamPtr((char**)&forUnmarshaling->pMarkerName, ptr);
     memcpy((float*)forUnmarshaling->color, *ptr, 4 * sizeof(float));
@@ -13926,15 +13757,11 @@
 #endif
 #ifdef VK_NV_dedicated_allocation
 void reservedunmarshal_VkDedicatedAllocationImageCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDedicatedAllocationImageCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDedicatedAllocationImageCreateInfoNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -13942,30 +13769,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->dedicatedAllocation, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkDedicatedAllocationBufferCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDedicatedAllocationBufferCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDedicatedAllocationBufferCreateInfoNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -13973,30 +13798,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->dedicatedAllocation, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkDedicatedAllocationMemoryAllocateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDedicatedAllocationMemoryAllocateInfoNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDedicatedAllocationMemoryAllocateInfoNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -14004,15 +13827,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
@@ -14027,15 +13852,11 @@
 #endif
 #ifdef VK_EXT_transform_feedback
 void reservedunmarshal_VkPhysicalDeviceTransformFeedbackFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceTransformFeedbackFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceTransformFeedbackFeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -14043,15 +13864,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->transformFeedback, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -14060,15 +13883,11 @@
 }
 
 void reservedunmarshal_VkPhysicalDeviceTransformFeedbackPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceTransformFeedbackPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceTransformFeedbackPropertiesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -14076,48 +13895,50 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->maxTransformFeedbackStreams, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->maxTransformFeedbackBuffers, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((VkDeviceSize*)&forUnmarshaling->maxTransformFeedbackBufferSize, *ptr, sizeof(VkDeviceSize));
+    memcpy((VkDeviceSize*)&forUnmarshaling->maxTransformFeedbackBufferSize, *ptr,
+           sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
     memcpy((uint32_t*)&forUnmarshaling->maxTransformFeedbackStreamDataSize, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->maxTransformFeedbackBufferDataSize, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxTransformFeedbackBufferDataStride, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxTransformFeedbackBufferDataStride, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((VkBool32*)&forUnmarshaling->transformFeedbackQueries, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->transformFeedbackStreamsLinesTriangles, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->transformFeedbackStreamsLinesTriangles, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->transformFeedbackRasterizationStreamSelect, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->transformFeedbackRasterizationStreamSelect, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy((VkBool32*)&forUnmarshaling->transformFeedbackDraw, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkPipelineRasterizationStateStreamCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineRasterizationStateStreamCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineRasterizationStateStreamCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -14125,17 +13946,20 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkPipelineRasterizationStateStreamCreateFlagsEXT*)&forUnmarshaling->flags, *ptr, sizeof(VkPipelineRasterizationStateStreamCreateFlagsEXT));
+    memcpy((VkPipelineRasterizationStateStreamCreateFlagsEXT*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkPipelineRasterizationStateStreamCreateFlagsEXT));
     *ptr += sizeof(VkPipelineRasterizationStateStreamCreateFlagsEXT);
     memcpy((uint32_t*)&forUnmarshaling->rasterizationStream, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -14143,16 +13967,12 @@
 
 #endif
 #ifdef VK_NVX_binary_import
-void reservedunmarshal_VkCuModuleCreateInfoNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCuModuleCreateInfoNVX* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkCuModuleCreateInfoNVX(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkCuModuleCreateInfoNVX* forUnmarshaling,
+                                               uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -14160,34 +13980,33 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((size_t*)&forUnmarshaling->dataSize, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->dataSize);
     *ptr += 8;
-    vkStream->alloc((void**)&forUnmarshaling->pData, forUnmarshaling->dataSize * sizeof(const uint8_t));
+    vkStream->alloc((void**)&forUnmarshaling->pData,
+                    forUnmarshaling->dataSize * sizeof(const uint8_t));
     memcpy((void*)forUnmarshaling->pData, *ptr, forUnmarshaling->dataSize * sizeof(const uint8_t));
     *ptr += forUnmarshaling->dataSize * sizeof(const uint8_t);
 }
 
-void reservedunmarshal_VkCuFunctionCreateInfoNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCuFunctionCreateInfoNVX* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkCuFunctionCreateInfoNVX(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkCuFunctionCreateInfoNVX* forUnmarshaling,
+                                                 uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -14195,15 +14014,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkCuModuleNVX*)&forUnmarshaling->module, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->module);
@@ -14211,16 +14032,11 @@
     vkStream->loadStringInPlaceWithStreamPtr((char**)&forUnmarshaling->pName, ptr);
 }
 
-void reservedunmarshal_VkCuLaunchInfoNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCuLaunchInfoNVX* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkCuLaunchInfoNVX(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkCuLaunchInfoNVX* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -14228,15 +14044,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkCuFunctionNVX*)&forUnmarshaling->function, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->function);
@@ -14265,16 +14083,12 @@
 
 #endif
 #ifdef VK_NVX_image_view_handle
-void reservedunmarshal_VkImageViewHandleInfoNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageViewHandleInfoNVX* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkImageViewHandleInfoNVX(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkImageViewHandleInfoNVX* forUnmarshaling,
+                                                uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -14282,20 +14096,23 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkImageView*)&forUnmarshaling->imageView = (VkImageView)unbox_VkImageView((VkImageView)(*&cgen_var_0));
+    *(VkImageView*)&forUnmarshaling->imageView =
+        (VkImageView)unbox_VkImageView((VkImageView)(*&cgen_var_0));
     memcpy((VkDescriptorType*)&forUnmarshaling->descriptorType, *ptr, sizeof(VkDescriptorType));
     *ptr += sizeof(VkDescriptorType);
     uint64_t cgen_var_1;
@@ -14305,15 +14122,11 @@
 }
 
 void reservedunmarshal_VkImageViewAddressPropertiesNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageViewAddressPropertiesNVX* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImageViewAddressPropertiesNVX* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -14321,15 +14134,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkDeviceAddress*)&forUnmarshaling->deviceAddress, *ptr, sizeof(VkDeviceAddress));
     *ptr += sizeof(VkDeviceAddress);
@@ -14348,15 +14163,11 @@
 #endif
 #ifdef VK_EXT_video_encode_h264
 void reservedunmarshal_VkVideoEncodeH264CapabilitiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH264CapabilitiesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH264CapabilitiesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -14364,25 +14175,33 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkVideoEncodeH264CapabilityFlagsEXT*)&forUnmarshaling->flags, *ptr, sizeof(VkVideoEncodeH264CapabilityFlagsEXT));
+    memcpy((VkVideoEncodeH264CapabilityFlagsEXT*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkVideoEncodeH264CapabilityFlagsEXT));
     *ptr += sizeof(VkVideoEncodeH264CapabilityFlagsEXT);
-    memcpy((VkVideoEncodeH264InputModeFlagsEXT*)&forUnmarshaling->inputModeFlags, *ptr, sizeof(VkVideoEncodeH264InputModeFlagsEXT));
+    memcpy((VkVideoEncodeH264InputModeFlagsEXT*)&forUnmarshaling->inputModeFlags, *ptr,
+           sizeof(VkVideoEncodeH264InputModeFlagsEXT));
     *ptr += sizeof(VkVideoEncodeH264InputModeFlagsEXT);
-    memcpy((VkVideoEncodeH264OutputModeFlagsEXT*)&forUnmarshaling->outputModeFlags, *ptr, sizeof(VkVideoEncodeH264OutputModeFlagsEXT));
+    memcpy((VkVideoEncodeH264OutputModeFlagsEXT*)&forUnmarshaling->outputModeFlags, *ptr,
+           sizeof(VkVideoEncodeH264OutputModeFlagsEXT));
     *ptr += sizeof(VkVideoEncodeH264OutputModeFlagsEXT);
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->minPictureSizeInMbs), ptr);
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->maxPictureSizeInMbs), ptr);
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->inputImageDataAlignment), ptr);
+    reservedunmarshal_VkExtent2D(vkStream, rootType,
+                                 (VkExtent2D*)(&forUnmarshaling->minPictureSizeInMbs), ptr);
+    reservedunmarshal_VkExtent2D(vkStream, rootType,
+                                 (VkExtent2D*)(&forUnmarshaling->maxPictureSizeInMbs), ptr);
+    reservedunmarshal_VkExtent2D(vkStream, rootType,
+                                 (VkExtent2D*)(&forUnmarshaling->inputImageDataAlignment), ptr);
     memcpy((uint8_t*)&forUnmarshaling->maxNumL0ReferenceForP, *ptr, sizeof(uint8_t));
     *ptr += sizeof(uint8_t);
     memcpy((uint8_t*)&forUnmarshaling->maxNumL0ReferenceForB, *ptr, sizeof(uint8_t));
@@ -14391,19 +14210,16 @@
     *ptr += sizeof(uint8_t);
     memcpy((uint8_t*)&forUnmarshaling->qualityLevelCount, *ptr, sizeof(uint8_t));
     *ptr += sizeof(uint8_t);
-    reservedunmarshal_VkExtensionProperties(vkStream, rootType, (VkExtensionProperties*)(&forUnmarshaling->stdExtensionVersion), ptr);
+    reservedunmarshal_VkExtensionProperties(
+        vkStream, rootType, (VkExtensionProperties*)(&forUnmarshaling->stdExtensionVersion), ptr);
 }
 
 void reservedunmarshal_VkVideoEncodeH264SessionCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH264SessionCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH264SessionCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -14411,33 +14227,35 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkVideoEncodeH264CreateFlagsEXT*)&forUnmarshaling->flags, *ptr, sizeof(VkVideoEncodeH264CreateFlagsEXT));
+    memcpy((VkVideoEncodeH264CreateFlagsEXT*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkVideoEncodeH264CreateFlagsEXT));
     *ptr += sizeof(VkVideoEncodeH264CreateFlagsEXT);
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->maxPictureSizeInMbs), ptr);
-    vkStream->alloc((void**)&forUnmarshaling->pStdExtensionVersion, sizeof(const VkExtensionProperties));
-    reservedunmarshal_VkExtensionProperties(vkStream, rootType, (VkExtensionProperties*)(forUnmarshaling->pStdExtensionVersion), ptr);
+    reservedunmarshal_VkExtent2D(vkStream, rootType,
+                                 (VkExtent2D*)(&forUnmarshaling->maxPictureSizeInMbs), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pStdExtensionVersion,
+                    sizeof(const VkExtensionProperties));
+    reservedunmarshal_VkExtensionProperties(
+        vkStream, rootType, (VkExtensionProperties*)(forUnmarshaling->pStdExtensionVersion), ptr);
 }
 
 void reservedunmarshal_VkVideoEncodeH264SessionParametersAddInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH264SessionParametersAddInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH264SessionParametersAddInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -14445,15 +14263,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->spsStdCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -14461,10 +14281,12 @@
     memcpy((StdVideoH264SequenceParameterSet**)&forUnmarshaling->pSpsStd, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pSpsStd);
     *ptr += 8;
-    if (forUnmarshaling->pSpsStd)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pSpsStd, forUnmarshaling->spsStdCount * sizeof(const StdVideoH264SequenceParameterSet));
-        memcpy((StdVideoH264SequenceParameterSet*)forUnmarshaling->pSpsStd, *ptr, forUnmarshaling->spsStdCount * sizeof(const StdVideoH264SequenceParameterSet));
+    if (forUnmarshaling->pSpsStd) {
+        vkStream->alloc(
+            (void**)&forUnmarshaling->pSpsStd,
+            forUnmarshaling->spsStdCount * sizeof(const StdVideoH264SequenceParameterSet));
+        memcpy((StdVideoH264SequenceParameterSet*)forUnmarshaling->pSpsStd, *ptr,
+               forUnmarshaling->spsStdCount * sizeof(const StdVideoH264SequenceParameterSet));
         *ptr += forUnmarshaling->spsStdCount * sizeof(const StdVideoH264SequenceParameterSet);
     }
     memcpy((uint32_t*)&forUnmarshaling->ppsStdCount, *ptr, sizeof(uint32_t));
@@ -14473,24 +14295,22 @@
     memcpy((StdVideoH264PictureParameterSet**)&forUnmarshaling->pPpsStd, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pPpsStd);
     *ptr += 8;
-    if (forUnmarshaling->pPpsStd)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pPpsStd, forUnmarshaling->ppsStdCount * sizeof(const StdVideoH264PictureParameterSet));
-        memcpy((StdVideoH264PictureParameterSet*)forUnmarshaling->pPpsStd, *ptr, forUnmarshaling->ppsStdCount * sizeof(const StdVideoH264PictureParameterSet));
+    if (forUnmarshaling->pPpsStd) {
+        vkStream->alloc(
+            (void**)&forUnmarshaling->pPpsStd,
+            forUnmarshaling->ppsStdCount * sizeof(const StdVideoH264PictureParameterSet));
+        memcpy((StdVideoH264PictureParameterSet*)forUnmarshaling->pPpsStd, *ptr,
+               forUnmarshaling->ppsStdCount * sizeof(const StdVideoH264PictureParameterSet));
         *ptr += forUnmarshaling->ppsStdCount * sizeof(const StdVideoH264PictureParameterSet);
     }
 }
 
 void reservedunmarshal_VkVideoEncodeH264SessionParametersCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH264SessionParametersCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH264SessionParametersCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -14498,41 +14318,43 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->maxSpsStdCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->maxPpsStdCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     // WARNING PTR CHECK
-    memcpy((VkVideoEncodeH264SessionParametersAddInfoEXT**)&forUnmarshaling->pParametersAddInfo, (*ptr), 8);
+    memcpy((VkVideoEncodeH264SessionParametersAddInfoEXT**)&forUnmarshaling->pParametersAddInfo,
+           (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pParametersAddInfo);
     *ptr += 8;
-    if (forUnmarshaling->pParametersAddInfo)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pParametersAddInfo, sizeof(const VkVideoEncodeH264SessionParametersAddInfoEXT));
-        reservedunmarshal_VkVideoEncodeH264SessionParametersAddInfoEXT(vkStream, rootType, (VkVideoEncodeH264SessionParametersAddInfoEXT*)(forUnmarshaling->pParametersAddInfo), ptr);
+    if (forUnmarshaling->pParametersAddInfo) {
+        vkStream->alloc((void**)&forUnmarshaling->pParametersAddInfo,
+                        sizeof(const VkVideoEncodeH264SessionParametersAddInfoEXT));
+        reservedunmarshal_VkVideoEncodeH264SessionParametersAddInfoEXT(
+            vkStream, rootType,
+            (VkVideoEncodeH264SessionParametersAddInfoEXT*)(forUnmarshaling->pParametersAddInfo),
+            ptr);
     }
 }
 
 void reservedunmarshal_VkVideoEncodeH264DpbSlotInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH264DpbSlotInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH264DpbSlotInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -14540,33 +14362,34 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((int8_t*)&forUnmarshaling->slotIndex, *ptr, sizeof(int8_t));
     *ptr += sizeof(int8_t);
-    vkStream->alloc((void**)&forUnmarshaling->pStdPictureInfo, sizeof(const StdVideoEncodeH264PictureInfo));
-    memcpy((StdVideoEncodeH264PictureInfo*)forUnmarshaling->pStdPictureInfo, *ptr, sizeof(const StdVideoEncodeH264PictureInfo));
+    vkStream->alloc((void**)&forUnmarshaling->pStdPictureInfo,
+                    sizeof(const StdVideoEncodeH264PictureInfo));
+    memcpy((StdVideoEncodeH264PictureInfo*)forUnmarshaling->pStdPictureInfo, *ptr,
+           sizeof(const StdVideoEncodeH264PictureInfo));
     *ptr += sizeof(const StdVideoEncodeH264PictureInfo);
 }
 
-void reservedunmarshal_VkVideoEncodeH264NaluSliceEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH264NaluSliceEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkVideoEncodeH264NaluSliceEXT(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkVideoEncodeH264NaluSliceEXT* forUnmarshaling,
+                                                     uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -14574,34 +14397,44 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    vkStream->alloc((void**)&forUnmarshaling->pSliceHeaderStd, sizeof(const StdVideoEncodeH264SliceHeader));
-    memcpy((StdVideoEncodeH264SliceHeader*)forUnmarshaling->pSliceHeaderStd, *ptr, sizeof(const StdVideoEncodeH264SliceHeader));
+    vkStream->alloc((void**)&forUnmarshaling->pSliceHeaderStd,
+                    sizeof(const StdVideoEncodeH264SliceHeader));
+    memcpy((StdVideoEncodeH264SliceHeader*)forUnmarshaling->pSliceHeaderStd, *ptr,
+           sizeof(const StdVideoEncodeH264SliceHeader));
     *ptr += sizeof(const StdVideoEncodeH264SliceHeader);
     memcpy((uint32_t*)&forUnmarshaling->mbCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint8_t*)&forUnmarshaling->refFinalList0EntryCount, *ptr, sizeof(uint8_t));
     *ptr += sizeof(uint8_t);
-    vkStream->alloc((void**)&forUnmarshaling->pRefFinalList0Entries, forUnmarshaling->refFinalList0EntryCount * sizeof(const VkVideoEncodeH264DpbSlotInfoEXT));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->refFinalList0EntryCount; ++i)
-    {
-        reservedunmarshal_VkVideoEncodeH264DpbSlotInfoEXT(vkStream, rootType, (VkVideoEncodeH264DpbSlotInfoEXT*)(forUnmarshaling->pRefFinalList0Entries + i), ptr);
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pRefFinalList0Entries,
+        forUnmarshaling->refFinalList0EntryCount * sizeof(const VkVideoEncodeH264DpbSlotInfoEXT));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->refFinalList0EntryCount; ++i) {
+        reservedunmarshal_VkVideoEncodeH264DpbSlotInfoEXT(
+            vkStream, rootType,
+            (VkVideoEncodeH264DpbSlotInfoEXT*)(forUnmarshaling->pRefFinalList0Entries + i), ptr);
     }
     memcpy((uint8_t*)&forUnmarshaling->refFinalList1EntryCount, *ptr, sizeof(uint8_t));
     *ptr += sizeof(uint8_t);
-    vkStream->alloc((void**)&forUnmarshaling->pRefFinalList1Entries, forUnmarshaling->refFinalList1EntryCount * sizeof(const VkVideoEncodeH264DpbSlotInfoEXT));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->refFinalList1EntryCount; ++i)
-    {
-        reservedunmarshal_VkVideoEncodeH264DpbSlotInfoEXT(vkStream, rootType, (VkVideoEncodeH264DpbSlotInfoEXT*)(forUnmarshaling->pRefFinalList1Entries + i), ptr);
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pRefFinalList1Entries,
+        forUnmarshaling->refFinalList1EntryCount * sizeof(const VkVideoEncodeH264DpbSlotInfoEXT));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->refFinalList1EntryCount; ++i) {
+        reservedunmarshal_VkVideoEncodeH264DpbSlotInfoEXT(
+            vkStream, rootType,
+            (VkVideoEncodeH264DpbSlotInfoEXT*)(forUnmarshaling->pRefFinalList1Entries + i), ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->precedingNaluBytes, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -14612,15 +14445,11 @@
 }
 
 void reservedunmarshal_VkVideoEncodeH264VclFrameInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH264VclFrameInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH264VclFrameInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -14628,51 +14457,63 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint8_t*)&forUnmarshaling->refDefaultFinalList0EntryCount, *ptr, sizeof(uint8_t));
     *ptr += sizeof(uint8_t);
-    vkStream->alloc((void**)&forUnmarshaling->pRefDefaultFinalList0Entries, forUnmarshaling->refDefaultFinalList0EntryCount * sizeof(const VkVideoEncodeH264DpbSlotInfoEXT));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->refDefaultFinalList0EntryCount; ++i)
-    {
-        reservedunmarshal_VkVideoEncodeH264DpbSlotInfoEXT(vkStream, rootType, (VkVideoEncodeH264DpbSlotInfoEXT*)(forUnmarshaling->pRefDefaultFinalList0Entries + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pRefDefaultFinalList0Entries,
+                    forUnmarshaling->refDefaultFinalList0EntryCount *
+                        sizeof(const VkVideoEncodeH264DpbSlotInfoEXT));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->refDefaultFinalList0EntryCount; ++i) {
+        reservedunmarshal_VkVideoEncodeH264DpbSlotInfoEXT(
+            vkStream, rootType,
+            (VkVideoEncodeH264DpbSlotInfoEXT*)(forUnmarshaling->pRefDefaultFinalList0Entries + i),
+            ptr);
     }
     memcpy((uint8_t*)&forUnmarshaling->refDefaultFinalList1EntryCount, *ptr, sizeof(uint8_t));
     *ptr += sizeof(uint8_t);
-    vkStream->alloc((void**)&forUnmarshaling->pRefDefaultFinalList1Entries, forUnmarshaling->refDefaultFinalList1EntryCount * sizeof(const VkVideoEncodeH264DpbSlotInfoEXT));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->refDefaultFinalList1EntryCount; ++i)
-    {
-        reservedunmarshal_VkVideoEncodeH264DpbSlotInfoEXT(vkStream, rootType, (VkVideoEncodeH264DpbSlotInfoEXT*)(forUnmarshaling->pRefDefaultFinalList1Entries + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pRefDefaultFinalList1Entries,
+                    forUnmarshaling->refDefaultFinalList1EntryCount *
+                        sizeof(const VkVideoEncodeH264DpbSlotInfoEXT));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->refDefaultFinalList1EntryCount; ++i) {
+        reservedunmarshal_VkVideoEncodeH264DpbSlotInfoEXT(
+            vkStream, rootType,
+            (VkVideoEncodeH264DpbSlotInfoEXT*)(forUnmarshaling->pRefDefaultFinalList1Entries + i),
+            ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->naluSliceEntryCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pNaluSliceEntries, forUnmarshaling->naluSliceEntryCount * sizeof(const VkVideoEncodeH264NaluSliceEXT));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->naluSliceEntryCount; ++i)
-    {
-        reservedunmarshal_VkVideoEncodeH264NaluSliceEXT(vkStream, rootType, (VkVideoEncodeH264NaluSliceEXT*)(forUnmarshaling->pNaluSliceEntries + i), ptr);
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pNaluSliceEntries,
+        forUnmarshaling->naluSliceEntryCount * sizeof(const VkVideoEncodeH264NaluSliceEXT));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->naluSliceEntryCount; ++i) {
+        reservedunmarshal_VkVideoEncodeH264NaluSliceEXT(
+            vkStream, rootType,
+            (VkVideoEncodeH264NaluSliceEXT*)(forUnmarshaling->pNaluSliceEntries + i), ptr);
     }
-    vkStream->alloc((void**)&forUnmarshaling->pCurrentPictureInfo, sizeof(const VkVideoEncodeH264DpbSlotInfoEXT));
-    reservedunmarshal_VkVideoEncodeH264DpbSlotInfoEXT(vkStream, rootType, (VkVideoEncodeH264DpbSlotInfoEXT*)(forUnmarshaling->pCurrentPictureInfo), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pCurrentPictureInfo,
+                    sizeof(const VkVideoEncodeH264DpbSlotInfoEXT));
+    reservedunmarshal_VkVideoEncodeH264DpbSlotInfoEXT(
+        vkStream, rootType,
+        (VkVideoEncodeH264DpbSlotInfoEXT*)(forUnmarshaling->pCurrentPictureInfo), ptr);
 }
 
 void reservedunmarshal_VkVideoEncodeH264EmitPictureParametersEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH264EmitPictureParametersEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH264EmitPictureParametersEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -14680,15 +14521,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint8_t*)&forUnmarshaling->spsId, *ptr, sizeof(uint8_t));
     *ptr += sizeof(uint8_t);
@@ -14696,21 +14539,19 @@
     *ptr += sizeof(VkBool32);
     memcpy((uint32_t*)&forUnmarshaling->ppsIdEntryCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->ppsIdEntries, forUnmarshaling->ppsIdEntryCount * sizeof(const uint8_t));
-    memcpy((uint8_t*)forUnmarshaling->ppsIdEntries, *ptr, forUnmarshaling->ppsIdEntryCount * sizeof(const uint8_t));
+    vkStream->alloc((void**)&forUnmarshaling->ppsIdEntries,
+                    forUnmarshaling->ppsIdEntryCount * sizeof(const uint8_t));
+    memcpy((uint8_t*)forUnmarshaling->ppsIdEntries, *ptr,
+           forUnmarshaling->ppsIdEntryCount * sizeof(const uint8_t));
     *ptr += forUnmarshaling->ppsIdEntryCount * sizeof(const uint8_t);
 }
 
-void reservedunmarshal_VkVideoEncodeH264ProfileEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH264ProfileEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkVideoEncodeH264ProfileEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkVideoEncodeH264ProfileEXT* forUnmarshaling,
+                                                   uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -14718,32 +14559,31 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((StdVideoH264ProfileIdc*)&forUnmarshaling->stdProfileIdc, *ptr, sizeof(StdVideoH264ProfileIdc));
+    memcpy((StdVideoH264ProfileIdc*)&forUnmarshaling->stdProfileIdc, *ptr,
+           sizeof(StdVideoH264ProfileIdc));
     *ptr += sizeof(StdVideoH264ProfileIdc);
 }
 
 #endif
 #ifdef VK_EXT_video_encode_h265
 void reservedunmarshal_VkVideoEncodeH265CapabilitiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH265CapabilitiesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH265CapabilitiesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -14751,25 +14591,32 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkVideoEncodeH265CapabilityFlagsEXT*)&forUnmarshaling->flags, *ptr, sizeof(VkVideoEncodeH265CapabilityFlagsEXT));
+    memcpy((VkVideoEncodeH265CapabilityFlagsEXT*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkVideoEncodeH265CapabilityFlagsEXT));
     *ptr += sizeof(VkVideoEncodeH265CapabilityFlagsEXT);
-    memcpy((VkVideoEncodeH265InputModeFlagsEXT*)&forUnmarshaling->inputModeFlags, *ptr, sizeof(VkVideoEncodeH265InputModeFlagsEXT));
+    memcpy((VkVideoEncodeH265InputModeFlagsEXT*)&forUnmarshaling->inputModeFlags, *ptr,
+           sizeof(VkVideoEncodeH265InputModeFlagsEXT));
     *ptr += sizeof(VkVideoEncodeH265InputModeFlagsEXT);
-    memcpy((VkVideoEncodeH265OutputModeFlagsEXT*)&forUnmarshaling->outputModeFlags, *ptr, sizeof(VkVideoEncodeH265OutputModeFlagsEXT));
+    memcpy((VkVideoEncodeH265OutputModeFlagsEXT*)&forUnmarshaling->outputModeFlags, *ptr,
+           sizeof(VkVideoEncodeH265OutputModeFlagsEXT));
     *ptr += sizeof(VkVideoEncodeH265OutputModeFlagsEXT);
-    memcpy((VkVideoEncodeH265CtbSizeFlagsEXT*)&forUnmarshaling->ctbSizes, *ptr, sizeof(VkVideoEncodeH265CtbSizeFlagsEXT));
+    memcpy((VkVideoEncodeH265CtbSizeFlagsEXT*)&forUnmarshaling->ctbSizes, *ptr,
+           sizeof(VkVideoEncodeH265CtbSizeFlagsEXT));
     *ptr += sizeof(VkVideoEncodeH265CtbSizeFlagsEXT);
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->inputImageDataAlignment), ptr);
+    reservedunmarshal_VkExtent2D(vkStream, rootType,
+                                 (VkExtent2D*)(&forUnmarshaling->inputImageDataAlignment), ptr);
     memcpy((uint8_t*)&forUnmarshaling->maxNumL0ReferenceForP, *ptr, sizeof(uint8_t));
     *ptr += sizeof(uint8_t);
     memcpy((uint8_t*)&forUnmarshaling->maxNumL0ReferenceForB, *ptr, sizeof(uint8_t));
@@ -14780,19 +14627,16 @@
     *ptr += sizeof(uint8_t);
     memcpy((uint8_t*)&forUnmarshaling->qualityLevelCount, *ptr, sizeof(uint8_t));
     *ptr += sizeof(uint8_t);
-    reservedunmarshal_VkExtensionProperties(vkStream, rootType, (VkExtensionProperties*)(&forUnmarshaling->stdExtensionVersion), ptr);
+    reservedunmarshal_VkExtensionProperties(
+        vkStream, rootType, (VkExtensionProperties*)(&forUnmarshaling->stdExtensionVersion), ptr);
 }
 
 void reservedunmarshal_VkVideoEncodeH265SessionCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH265SessionCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH265SessionCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -14800,32 +14644,33 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkVideoEncodeH265CreateFlagsEXT*)&forUnmarshaling->flags, *ptr, sizeof(VkVideoEncodeH265CreateFlagsEXT));
+    memcpy((VkVideoEncodeH265CreateFlagsEXT*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkVideoEncodeH265CreateFlagsEXT));
     *ptr += sizeof(VkVideoEncodeH265CreateFlagsEXT);
-    vkStream->alloc((void**)&forUnmarshaling->pStdExtensionVersion, sizeof(const VkExtensionProperties));
-    reservedunmarshal_VkExtensionProperties(vkStream, rootType, (VkExtensionProperties*)(forUnmarshaling->pStdExtensionVersion), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pStdExtensionVersion,
+                    sizeof(const VkExtensionProperties));
+    reservedunmarshal_VkExtensionProperties(
+        vkStream, rootType, (VkExtensionProperties*)(forUnmarshaling->pStdExtensionVersion), ptr);
 }
 
 void reservedunmarshal_VkVideoEncodeH265SessionParametersAddInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH265SessionParametersAddInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH265SessionParametersAddInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -14833,15 +14678,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->vpsStdCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -14849,10 +14696,11 @@
     memcpy((StdVideoH265VideoParameterSet**)&forUnmarshaling->pVpsStd, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pVpsStd);
     *ptr += 8;
-    if (forUnmarshaling->pVpsStd)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pVpsStd, forUnmarshaling->vpsStdCount * sizeof(const StdVideoH265VideoParameterSet));
-        memcpy((StdVideoH265VideoParameterSet*)forUnmarshaling->pVpsStd, *ptr, forUnmarshaling->vpsStdCount * sizeof(const StdVideoH265VideoParameterSet));
+    if (forUnmarshaling->pVpsStd) {
+        vkStream->alloc((void**)&forUnmarshaling->pVpsStd,
+                        forUnmarshaling->vpsStdCount * sizeof(const StdVideoH265VideoParameterSet));
+        memcpy((StdVideoH265VideoParameterSet*)forUnmarshaling->pVpsStd, *ptr,
+               forUnmarshaling->vpsStdCount * sizeof(const StdVideoH265VideoParameterSet));
         *ptr += forUnmarshaling->vpsStdCount * sizeof(const StdVideoH265VideoParameterSet);
     }
     memcpy((uint32_t*)&forUnmarshaling->spsStdCount, *ptr, sizeof(uint32_t));
@@ -14861,10 +14709,12 @@
     memcpy((StdVideoH265SequenceParameterSet**)&forUnmarshaling->pSpsStd, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pSpsStd);
     *ptr += 8;
-    if (forUnmarshaling->pSpsStd)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pSpsStd, forUnmarshaling->spsStdCount * sizeof(const StdVideoH265SequenceParameterSet));
-        memcpy((StdVideoH265SequenceParameterSet*)forUnmarshaling->pSpsStd, *ptr, forUnmarshaling->spsStdCount * sizeof(const StdVideoH265SequenceParameterSet));
+    if (forUnmarshaling->pSpsStd) {
+        vkStream->alloc(
+            (void**)&forUnmarshaling->pSpsStd,
+            forUnmarshaling->spsStdCount * sizeof(const StdVideoH265SequenceParameterSet));
+        memcpy((StdVideoH265SequenceParameterSet*)forUnmarshaling->pSpsStd, *ptr,
+               forUnmarshaling->spsStdCount * sizeof(const StdVideoH265SequenceParameterSet));
         *ptr += forUnmarshaling->spsStdCount * sizeof(const StdVideoH265SequenceParameterSet);
     }
     memcpy((uint32_t*)&forUnmarshaling->ppsStdCount, *ptr, sizeof(uint32_t));
@@ -14873,24 +14723,22 @@
     memcpy((StdVideoH265PictureParameterSet**)&forUnmarshaling->pPpsStd, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pPpsStd);
     *ptr += 8;
-    if (forUnmarshaling->pPpsStd)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pPpsStd, forUnmarshaling->ppsStdCount * sizeof(const StdVideoH265PictureParameterSet));
-        memcpy((StdVideoH265PictureParameterSet*)forUnmarshaling->pPpsStd, *ptr, forUnmarshaling->ppsStdCount * sizeof(const StdVideoH265PictureParameterSet));
+    if (forUnmarshaling->pPpsStd) {
+        vkStream->alloc(
+            (void**)&forUnmarshaling->pPpsStd,
+            forUnmarshaling->ppsStdCount * sizeof(const StdVideoH265PictureParameterSet));
+        memcpy((StdVideoH265PictureParameterSet*)forUnmarshaling->pPpsStd, *ptr,
+               forUnmarshaling->ppsStdCount * sizeof(const StdVideoH265PictureParameterSet));
         *ptr += forUnmarshaling->ppsStdCount * sizeof(const StdVideoH265PictureParameterSet);
     }
 }
 
 void reservedunmarshal_VkVideoEncodeH265SessionParametersCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH265SessionParametersCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH265SessionParametersCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -14898,15 +14746,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->maxVpsStdCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -14915,26 +14765,26 @@
     memcpy((uint32_t*)&forUnmarshaling->maxPpsStdCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     // WARNING PTR CHECK
-    memcpy((VkVideoEncodeH265SessionParametersAddInfoEXT**)&forUnmarshaling->pParametersAddInfo, (*ptr), 8);
+    memcpy((VkVideoEncodeH265SessionParametersAddInfoEXT**)&forUnmarshaling->pParametersAddInfo,
+           (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pParametersAddInfo);
     *ptr += 8;
-    if (forUnmarshaling->pParametersAddInfo)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pParametersAddInfo, sizeof(const VkVideoEncodeH265SessionParametersAddInfoEXT));
-        reservedunmarshal_VkVideoEncodeH265SessionParametersAddInfoEXT(vkStream, rootType, (VkVideoEncodeH265SessionParametersAddInfoEXT*)(forUnmarshaling->pParametersAddInfo), ptr);
+    if (forUnmarshaling->pParametersAddInfo) {
+        vkStream->alloc((void**)&forUnmarshaling->pParametersAddInfo,
+                        sizeof(const VkVideoEncodeH265SessionParametersAddInfoEXT));
+        reservedunmarshal_VkVideoEncodeH265SessionParametersAddInfoEXT(
+            vkStream, rootType,
+            (VkVideoEncodeH265SessionParametersAddInfoEXT*)(forUnmarshaling->pParametersAddInfo),
+            ptr);
     }
 }
 
 void reservedunmarshal_VkVideoEncodeH265DpbSlotInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH265DpbSlotInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH265DpbSlotInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -14942,33 +14792,33 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((int8_t*)&forUnmarshaling->slotIndex, *ptr, sizeof(int8_t));
     *ptr += sizeof(int8_t);
-    vkStream->alloc((void**)&forUnmarshaling->pStdReferenceInfo, sizeof(const StdVideoEncodeH265ReferenceInfo));
-    memcpy((StdVideoEncodeH265ReferenceInfo*)forUnmarshaling->pStdReferenceInfo, *ptr, sizeof(const StdVideoEncodeH265ReferenceInfo));
+    vkStream->alloc((void**)&forUnmarshaling->pStdReferenceInfo,
+                    sizeof(const StdVideoEncodeH265ReferenceInfo));
+    memcpy((StdVideoEncodeH265ReferenceInfo*)forUnmarshaling->pStdReferenceInfo, *ptr,
+           sizeof(const StdVideoEncodeH265ReferenceInfo));
     *ptr += sizeof(const StdVideoEncodeH265ReferenceInfo);
 }
 
 void reservedunmarshal_VkVideoEncodeH265ReferenceListsEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH265ReferenceListsEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH265ReferenceListsEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -14976,45 +14826,52 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint8_t*)&forUnmarshaling->referenceList0EntryCount, *ptr, sizeof(uint8_t));
     *ptr += sizeof(uint8_t);
-    vkStream->alloc((void**)&forUnmarshaling->pReferenceList0Entries, forUnmarshaling->referenceList0EntryCount * sizeof(const VkVideoEncodeH265DpbSlotInfoEXT));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->referenceList0EntryCount; ++i)
-    {
-        reservedunmarshal_VkVideoEncodeH265DpbSlotInfoEXT(vkStream, rootType, (VkVideoEncodeH265DpbSlotInfoEXT*)(forUnmarshaling->pReferenceList0Entries + i), ptr);
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pReferenceList0Entries,
+        forUnmarshaling->referenceList0EntryCount * sizeof(const VkVideoEncodeH265DpbSlotInfoEXT));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->referenceList0EntryCount; ++i) {
+        reservedunmarshal_VkVideoEncodeH265DpbSlotInfoEXT(
+            vkStream, rootType,
+            (VkVideoEncodeH265DpbSlotInfoEXT*)(forUnmarshaling->pReferenceList0Entries + i), ptr);
     }
     memcpy((uint8_t*)&forUnmarshaling->referenceList1EntryCount, *ptr, sizeof(uint8_t));
     *ptr += sizeof(uint8_t);
-    vkStream->alloc((void**)&forUnmarshaling->pReferenceList1Entries, forUnmarshaling->referenceList1EntryCount * sizeof(const VkVideoEncodeH265DpbSlotInfoEXT));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->referenceList1EntryCount; ++i)
-    {
-        reservedunmarshal_VkVideoEncodeH265DpbSlotInfoEXT(vkStream, rootType, (VkVideoEncodeH265DpbSlotInfoEXT*)(forUnmarshaling->pReferenceList1Entries + i), ptr);
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pReferenceList1Entries,
+        forUnmarshaling->referenceList1EntryCount * sizeof(const VkVideoEncodeH265DpbSlotInfoEXT));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->referenceList1EntryCount; ++i) {
+        reservedunmarshal_VkVideoEncodeH265DpbSlotInfoEXT(
+            vkStream, rootType,
+            (VkVideoEncodeH265DpbSlotInfoEXT*)(forUnmarshaling->pReferenceList1Entries + i), ptr);
     }
-    vkStream->alloc((void**)&forUnmarshaling->pReferenceModifications, sizeof(const StdVideoEncodeH265ReferenceModifications));
-    memcpy((StdVideoEncodeH265ReferenceModifications*)forUnmarshaling->pReferenceModifications, *ptr, sizeof(const StdVideoEncodeH265ReferenceModifications));
+    vkStream->alloc((void**)&forUnmarshaling->pReferenceModifications,
+                    sizeof(const StdVideoEncodeH265ReferenceModifications));
+    memcpy((StdVideoEncodeH265ReferenceModifications*)forUnmarshaling->pReferenceModifications,
+           *ptr, sizeof(const StdVideoEncodeH265ReferenceModifications));
     *ptr += sizeof(const StdVideoEncodeH265ReferenceModifications);
 }
 
-void reservedunmarshal_VkVideoEncodeH265NaluSliceEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH265NaluSliceEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkVideoEncodeH265NaluSliceEXT(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkVideoEncodeH265NaluSliceEXT* forUnmarshaling,
+                                                     uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -15022,15 +14879,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->ctbCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -15038,26 +14897,26 @@
     memcpy((VkVideoEncodeH265ReferenceListsEXT**)&forUnmarshaling->pReferenceFinalLists, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pReferenceFinalLists);
     *ptr += 8;
-    if (forUnmarshaling->pReferenceFinalLists)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pReferenceFinalLists, sizeof(const VkVideoEncodeH265ReferenceListsEXT));
-        reservedunmarshal_VkVideoEncodeH265ReferenceListsEXT(vkStream, rootType, (VkVideoEncodeH265ReferenceListsEXT*)(forUnmarshaling->pReferenceFinalLists), ptr);
+    if (forUnmarshaling->pReferenceFinalLists) {
+        vkStream->alloc((void**)&forUnmarshaling->pReferenceFinalLists,
+                        sizeof(const VkVideoEncodeH265ReferenceListsEXT));
+        reservedunmarshal_VkVideoEncodeH265ReferenceListsEXT(
+            vkStream, rootType,
+            (VkVideoEncodeH265ReferenceListsEXT*)(forUnmarshaling->pReferenceFinalLists), ptr);
     }
-    vkStream->alloc((void**)&forUnmarshaling->pSliceHeaderStd, sizeof(const StdVideoEncodeH265SliceHeader));
-    memcpy((StdVideoEncodeH265SliceHeader*)forUnmarshaling->pSliceHeaderStd, *ptr, sizeof(const StdVideoEncodeH265SliceHeader));
+    vkStream->alloc((void**)&forUnmarshaling->pSliceHeaderStd,
+                    sizeof(const StdVideoEncodeH265SliceHeader));
+    memcpy((StdVideoEncodeH265SliceHeader*)forUnmarshaling->pSliceHeaderStd, *ptr,
+           sizeof(const StdVideoEncodeH265SliceHeader));
     *ptr += sizeof(const StdVideoEncodeH265SliceHeader);
 }
 
 void reservedunmarshal_VkVideoEncodeH265VclFrameInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH265VclFrameInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH265VclFrameInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -15065,47 +14924,52 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     // WARNING PTR CHECK
     memcpy((VkVideoEncodeH265ReferenceListsEXT**)&forUnmarshaling->pReferenceFinalLists, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pReferenceFinalLists);
     *ptr += 8;
-    if (forUnmarshaling->pReferenceFinalLists)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pReferenceFinalLists, sizeof(const VkVideoEncodeH265ReferenceListsEXT));
-        reservedunmarshal_VkVideoEncodeH265ReferenceListsEXT(vkStream, rootType, (VkVideoEncodeH265ReferenceListsEXT*)(forUnmarshaling->pReferenceFinalLists), ptr);
+    if (forUnmarshaling->pReferenceFinalLists) {
+        vkStream->alloc((void**)&forUnmarshaling->pReferenceFinalLists,
+                        sizeof(const VkVideoEncodeH265ReferenceListsEXT));
+        reservedunmarshal_VkVideoEncodeH265ReferenceListsEXT(
+            vkStream, rootType,
+            (VkVideoEncodeH265ReferenceListsEXT*)(forUnmarshaling->pReferenceFinalLists), ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->naluSliceEntryCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pNaluSliceEntries, forUnmarshaling->naluSliceEntryCount * sizeof(const VkVideoEncodeH265NaluSliceEXT));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->naluSliceEntryCount; ++i)
-    {
-        reservedunmarshal_VkVideoEncodeH265NaluSliceEXT(vkStream, rootType, (VkVideoEncodeH265NaluSliceEXT*)(forUnmarshaling->pNaluSliceEntries + i), ptr);
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pNaluSliceEntries,
+        forUnmarshaling->naluSliceEntryCount * sizeof(const VkVideoEncodeH265NaluSliceEXT));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->naluSliceEntryCount; ++i) {
+        reservedunmarshal_VkVideoEncodeH265NaluSliceEXT(
+            vkStream, rootType,
+            (VkVideoEncodeH265NaluSliceEXT*)(forUnmarshaling->pNaluSliceEntries + i), ptr);
     }
-    vkStream->alloc((void**)&forUnmarshaling->pCurrentPictureInfo, sizeof(const StdVideoEncodeH265PictureInfo));
-    memcpy((StdVideoEncodeH265PictureInfo*)forUnmarshaling->pCurrentPictureInfo, *ptr, sizeof(const StdVideoEncodeH265PictureInfo));
+    vkStream->alloc((void**)&forUnmarshaling->pCurrentPictureInfo,
+                    sizeof(const StdVideoEncodeH265PictureInfo));
+    memcpy((StdVideoEncodeH265PictureInfo*)forUnmarshaling->pCurrentPictureInfo, *ptr,
+           sizeof(const StdVideoEncodeH265PictureInfo));
     *ptr += sizeof(const StdVideoEncodeH265PictureInfo);
 }
 
 void reservedunmarshal_VkVideoEncodeH265EmitPictureParametersEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH265EmitPictureParametersEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH265EmitPictureParametersEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -15113,15 +14977,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint8_t*)&forUnmarshaling->vpsId, *ptr, sizeof(uint8_t));
     *ptr += sizeof(uint8_t);
@@ -15133,21 +14999,19 @@
     *ptr += sizeof(VkBool32);
     memcpy((uint32_t*)&forUnmarshaling->ppsIdEntryCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->ppsIdEntries, forUnmarshaling->ppsIdEntryCount * sizeof(const uint8_t));
-    memcpy((uint8_t*)forUnmarshaling->ppsIdEntries, *ptr, forUnmarshaling->ppsIdEntryCount * sizeof(const uint8_t));
+    vkStream->alloc((void**)&forUnmarshaling->ppsIdEntries,
+                    forUnmarshaling->ppsIdEntryCount * sizeof(const uint8_t));
+    memcpy((uint8_t*)forUnmarshaling->ppsIdEntries, *ptr,
+           forUnmarshaling->ppsIdEntryCount * sizeof(const uint8_t));
     *ptr += forUnmarshaling->ppsIdEntryCount * sizeof(const uint8_t);
 }
 
-void reservedunmarshal_VkVideoEncodeH265ProfileEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH265ProfileEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkVideoEncodeH265ProfileEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkVideoEncodeH265ProfileEXT* forUnmarshaling,
+                                                   uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -15155,32 +15019,31 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((StdVideoH265ProfileIdc*)&forUnmarshaling->stdProfileIdc, *ptr, sizeof(StdVideoH265ProfileIdc));
+    memcpy((StdVideoH265ProfileIdc*)&forUnmarshaling->stdProfileIdc, *ptr,
+           sizeof(StdVideoH265ProfileIdc));
     *ptr += sizeof(StdVideoH265ProfileIdc);
 }
 
 #endif
 #ifdef VK_EXT_video_decode_h264
-void reservedunmarshal_VkVideoDecodeH264ProfileEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH264ProfileEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkVideoDecodeH264ProfileEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkVideoDecodeH264ProfileEXT* forUnmarshaling,
+                                                   uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -15188,32 +15051,32 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((StdVideoH264ProfileIdc*)&forUnmarshaling->stdProfileIdc, *ptr, sizeof(StdVideoH264ProfileIdc));
+    memcpy((StdVideoH264ProfileIdc*)&forUnmarshaling->stdProfileIdc, *ptr,
+           sizeof(StdVideoH264ProfileIdc));
     *ptr += sizeof(StdVideoH264ProfileIdc);
-    memcpy((VkVideoDecodeH264PictureLayoutFlagsEXT*)&forUnmarshaling->pictureLayout, *ptr, sizeof(VkVideoDecodeH264PictureLayoutFlagsEXT));
+    memcpy((VkVideoDecodeH264PictureLayoutFlagsEXT*)&forUnmarshaling->pictureLayout, *ptr,
+           sizeof(VkVideoDecodeH264PictureLayoutFlagsEXT));
     *ptr += sizeof(VkVideoDecodeH264PictureLayoutFlagsEXT);
 }
 
 void reservedunmarshal_VkVideoDecodeH264CapabilitiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH264CapabilitiesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoDecodeH264CapabilitiesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -15221,32 +15084,32 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->maxLevel, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    reservedunmarshal_VkOffset2D(vkStream, rootType, (VkOffset2D*)(&forUnmarshaling->fieldOffsetGranularity), ptr);
-    reservedunmarshal_VkExtensionProperties(vkStream, rootType, (VkExtensionProperties*)(&forUnmarshaling->stdExtensionVersion), ptr);
+    reservedunmarshal_VkOffset2D(vkStream, rootType,
+                                 (VkOffset2D*)(&forUnmarshaling->fieldOffsetGranularity), ptr);
+    reservedunmarshal_VkExtensionProperties(
+        vkStream, rootType, (VkExtensionProperties*)(&forUnmarshaling->stdExtensionVersion), ptr);
 }
 
 void reservedunmarshal_VkVideoDecodeH264SessionCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH264SessionCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoDecodeH264SessionCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -15254,32 +15117,33 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkVideoDecodeH264CreateFlagsEXT*)&forUnmarshaling->flags, *ptr, sizeof(VkVideoDecodeH264CreateFlagsEXT));
+    memcpy((VkVideoDecodeH264CreateFlagsEXT*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkVideoDecodeH264CreateFlagsEXT));
     *ptr += sizeof(VkVideoDecodeH264CreateFlagsEXT);
-    vkStream->alloc((void**)&forUnmarshaling->pStdExtensionVersion, sizeof(const VkExtensionProperties));
-    reservedunmarshal_VkExtensionProperties(vkStream, rootType, (VkExtensionProperties*)(forUnmarshaling->pStdExtensionVersion), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pStdExtensionVersion,
+                    sizeof(const VkExtensionProperties));
+    reservedunmarshal_VkExtensionProperties(
+        vkStream, rootType, (VkExtensionProperties*)(forUnmarshaling->pStdExtensionVersion), ptr);
 }
 
 void reservedunmarshal_VkVideoDecodeH264SessionParametersAddInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH264SessionParametersAddInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoDecodeH264SessionParametersAddInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -15287,15 +15151,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->spsStdCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -15303,10 +15169,12 @@
     memcpy((StdVideoH264SequenceParameterSet**)&forUnmarshaling->pSpsStd, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pSpsStd);
     *ptr += 8;
-    if (forUnmarshaling->pSpsStd)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pSpsStd, forUnmarshaling->spsStdCount * sizeof(const StdVideoH264SequenceParameterSet));
-        memcpy((StdVideoH264SequenceParameterSet*)forUnmarshaling->pSpsStd, *ptr, forUnmarshaling->spsStdCount * sizeof(const StdVideoH264SequenceParameterSet));
+    if (forUnmarshaling->pSpsStd) {
+        vkStream->alloc(
+            (void**)&forUnmarshaling->pSpsStd,
+            forUnmarshaling->spsStdCount * sizeof(const StdVideoH264SequenceParameterSet));
+        memcpy((StdVideoH264SequenceParameterSet*)forUnmarshaling->pSpsStd, *ptr,
+               forUnmarshaling->spsStdCount * sizeof(const StdVideoH264SequenceParameterSet));
         *ptr += forUnmarshaling->spsStdCount * sizeof(const StdVideoH264SequenceParameterSet);
     }
     memcpy((uint32_t*)&forUnmarshaling->ppsStdCount, *ptr, sizeof(uint32_t));
@@ -15315,24 +15183,22 @@
     memcpy((StdVideoH264PictureParameterSet**)&forUnmarshaling->pPpsStd, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pPpsStd);
     *ptr += 8;
-    if (forUnmarshaling->pPpsStd)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pPpsStd, forUnmarshaling->ppsStdCount * sizeof(const StdVideoH264PictureParameterSet));
-        memcpy((StdVideoH264PictureParameterSet*)forUnmarshaling->pPpsStd, *ptr, forUnmarshaling->ppsStdCount * sizeof(const StdVideoH264PictureParameterSet));
+    if (forUnmarshaling->pPpsStd) {
+        vkStream->alloc(
+            (void**)&forUnmarshaling->pPpsStd,
+            forUnmarshaling->ppsStdCount * sizeof(const StdVideoH264PictureParameterSet));
+        memcpy((StdVideoH264PictureParameterSet*)forUnmarshaling->pPpsStd, *ptr,
+               forUnmarshaling->ppsStdCount * sizeof(const StdVideoH264PictureParameterSet));
         *ptr += forUnmarshaling->ppsStdCount * sizeof(const StdVideoH264PictureParameterSet);
     }
 }
 
 void reservedunmarshal_VkVideoDecodeH264SessionParametersCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH264SessionParametersCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoDecodeH264SessionParametersCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -15340,41 +15206,43 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->maxSpsStdCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->maxPpsStdCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     // WARNING PTR CHECK
-    memcpy((VkVideoDecodeH264SessionParametersAddInfoEXT**)&forUnmarshaling->pParametersAddInfo, (*ptr), 8);
+    memcpy((VkVideoDecodeH264SessionParametersAddInfoEXT**)&forUnmarshaling->pParametersAddInfo,
+           (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pParametersAddInfo);
     *ptr += 8;
-    if (forUnmarshaling->pParametersAddInfo)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pParametersAddInfo, sizeof(const VkVideoDecodeH264SessionParametersAddInfoEXT));
-        reservedunmarshal_VkVideoDecodeH264SessionParametersAddInfoEXT(vkStream, rootType, (VkVideoDecodeH264SessionParametersAddInfoEXT*)(forUnmarshaling->pParametersAddInfo), ptr);
+    if (forUnmarshaling->pParametersAddInfo) {
+        vkStream->alloc((void**)&forUnmarshaling->pParametersAddInfo,
+                        sizeof(const VkVideoDecodeH264SessionParametersAddInfoEXT));
+        reservedunmarshal_VkVideoDecodeH264SessionParametersAddInfoEXT(
+            vkStream, rootType,
+            (VkVideoDecodeH264SessionParametersAddInfoEXT*)(forUnmarshaling->pParametersAddInfo),
+            ptr);
     }
 }
 
 void reservedunmarshal_VkVideoDecodeH264PictureInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH264PictureInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoDecodeH264PictureInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -15382,36 +15250,38 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    vkStream->alloc((void**)&forUnmarshaling->pStdPictureInfo, sizeof(const StdVideoDecodeH264PictureInfo));
-    memcpy((StdVideoDecodeH264PictureInfo*)forUnmarshaling->pStdPictureInfo, *ptr, sizeof(const StdVideoDecodeH264PictureInfo));
+    vkStream->alloc((void**)&forUnmarshaling->pStdPictureInfo,
+                    sizeof(const StdVideoDecodeH264PictureInfo));
+    memcpy((StdVideoDecodeH264PictureInfo*)forUnmarshaling->pStdPictureInfo, *ptr,
+           sizeof(const StdVideoDecodeH264PictureInfo));
     *ptr += sizeof(const StdVideoDecodeH264PictureInfo);
     memcpy((uint32_t*)&forUnmarshaling->slicesCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pSlicesDataOffsets, forUnmarshaling->slicesCount * sizeof(const uint32_t));
-    memcpy((uint32_t*)forUnmarshaling->pSlicesDataOffsets, *ptr, forUnmarshaling->slicesCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pSlicesDataOffsets,
+                    forUnmarshaling->slicesCount * sizeof(const uint32_t));
+    memcpy((uint32_t*)forUnmarshaling->pSlicesDataOffsets, *ptr,
+           forUnmarshaling->slicesCount * sizeof(const uint32_t));
     *ptr += forUnmarshaling->slicesCount * sizeof(const uint32_t);
 }
 
-void reservedunmarshal_VkVideoDecodeH264MvcEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH264MvcEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkVideoDecodeH264MvcEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkVideoDecodeH264MvcEXT* forUnmarshaling,
+                                               uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -15419,31 +15289,30 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     vkStream->alloc((void**)&forUnmarshaling->pStdMvc, sizeof(const StdVideoDecodeH264Mvc));
-    memcpy((StdVideoDecodeH264Mvc*)forUnmarshaling->pStdMvc, *ptr, sizeof(const StdVideoDecodeH264Mvc));
+    memcpy((StdVideoDecodeH264Mvc*)forUnmarshaling->pStdMvc, *ptr,
+           sizeof(const StdVideoDecodeH264Mvc));
     *ptr += sizeof(const StdVideoDecodeH264Mvc);
 }
 
 void reservedunmarshal_VkVideoDecodeH264DpbSlotInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH264DpbSlotInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoDecodeH264DpbSlotInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -15451,33 +15320,33 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    vkStream->alloc((void**)&forUnmarshaling->pStdReferenceInfo, sizeof(const StdVideoDecodeH264ReferenceInfo));
-    memcpy((StdVideoDecodeH264ReferenceInfo*)forUnmarshaling->pStdReferenceInfo, *ptr, sizeof(const StdVideoDecodeH264ReferenceInfo));
+    vkStream->alloc((void**)&forUnmarshaling->pStdReferenceInfo,
+                    sizeof(const StdVideoDecodeH264ReferenceInfo));
+    memcpy((StdVideoDecodeH264ReferenceInfo*)forUnmarshaling->pStdReferenceInfo, *ptr,
+           sizeof(const StdVideoDecodeH264ReferenceInfo));
     *ptr += sizeof(const StdVideoDecodeH264ReferenceInfo);
 }
 
 #endif
 #ifdef VK_AMD_texture_gather_bias_lod
 void reservedunmarshal_VkTextureLODGatherFormatPropertiesAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkTextureLODGatherFormatPropertiesAMD* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkTextureLODGatherFormatPropertiesAMD* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -15485,15 +15354,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->supportsTextureGatherLODBiasAMD, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -15501,12 +15372,9 @@
 
 #endif
 #ifdef VK_AMD_shader_info
-void reservedunmarshal_VkShaderResourceUsageAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkShaderResourceUsageAMD* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkShaderResourceUsageAMD(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkShaderResourceUsageAMD* forUnmarshaling,
+                                                uint8_t** ptr) {
     memcpy((uint32_t*)&forUnmarshaling->numUsedVgprs, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->numUsedSgprs, *ptr, sizeof(uint32_t));
@@ -15521,15 +15389,14 @@
     *ptr += 8;
 }
 
-void reservedunmarshal_VkShaderStatisticsInfoAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkShaderStatisticsInfoAMD* forUnmarshaling,
-    uint8_t** ptr)
-{
-    memcpy((VkShaderStageFlags*)&forUnmarshaling->shaderStageMask, *ptr, sizeof(VkShaderStageFlags));
+void reservedunmarshal_VkShaderStatisticsInfoAMD(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkShaderStatisticsInfoAMD* forUnmarshaling,
+                                                 uint8_t** ptr) {
+    memcpy((VkShaderStageFlags*)&forUnmarshaling->shaderStageMask, *ptr,
+           sizeof(VkShaderStageFlags));
     *ptr += sizeof(VkShaderStageFlags);
-    reservedunmarshal_VkShaderResourceUsageAMD(vkStream, rootType, (VkShaderResourceUsageAMD*)(&forUnmarshaling->resourceUsage), ptr);
+    reservedunmarshal_VkShaderResourceUsageAMD(
+        vkStream, rootType, (VkShaderResourceUsageAMD*)(&forUnmarshaling->resourceUsage), ptr);
     memcpy((uint32_t*)&forUnmarshaling->numPhysicalVgprs, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->numPhysicalSgprs, *ptr, sizeof(uint32_t));
@@ -15547,15 +15414,11 @@
 #endif
 #ifdef VK_GGP_stream_descriptor_surface
 void reservedunmarshal_VkStreamDescriptorSurfaceCreateInfoGGP(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkStreamDescriptorSurfaceCreateInfoGGP* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkStreamDescriptorSurfaceCreateInfoGGP* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -15563,34 +15426,34 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkStreamDescriptorSurfaceCreateFlagsGGP*)&forUnmarshaling->flags, *ptr, sizeof(VkStreamDescriptorSurfaceCreateFlagsGGP));
+    memcpy((VkStreamDescriptorSurfaceCreateFlagsGGP*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkStreamDescriptorSurfaceCreateFlagsGGP));
     *ptr += sizeof(VkStreamDescriptorSurfaceCreateFlagsGGP);
-    memcpy((GgpStreamDescriptor*)&forUnmarshaling->streamDescriptor, *ptr, sizeof(GgpStreamDescriptor));
+    memcpy((GgpStreamDescriptor*)&forUnmarshaling->streamDescriptor, *ptr,
+           sizeof(GgpStreamDescriptor));
     *ptr += sizeof(GgpStreamDescriptor);
 }
 
 #endif
 #ifdef VK_NV_corner_sampled_image
 void reservedunmarshal_VkPhysicalDeviceCornerSampledImageFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceCornerSampledImageFeaturesNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceCornerSampledImageFeaturesNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -15598,15 +15461,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->cornerSampledImage, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -15617,32 +15482,30 @@
 #endif
 #ifdef VK_NV_external_memory_capabilities
 void reservedunmarshal_VkExternalImageFormatPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalImageFormatPropertiesNV* forUnmarshaling,
-    uint8_t** ptr)
-{
-    reservedunmarshal_VkImageFormatProperties(vkStream, rootType, (VkImageFormatProperties*)(&forUnmarshaling->imageFormatProperties), ptr);
-    memcpy((VkExternalMemoryFeatureFlagsNV*)&forUnmarshaling->externalMemoryFeatures, *ptr, sizeof(VkExternalMemoryFeatureFlagsNV));
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkExternalImageFormatPropertiesNV* forUnmarshaling, uint8_t** ptr) {
+    reservedunmarshal_VkImageFormatProperties(
+        vkStream, rootType, (VkImageFormatProperties*)(&forUnmarshaling->imageFormatProperties),
+        ptr);
+    memcpy((VkExternalMemoryFeatureFlagsNV*)&forUnmarshaling->externalMemoryFeatures, *ptr,
+           sizeof(VkExternalMemoryFeatureFlagsNV));
     *ptr += sizeof(VkExternalMemoryFeatureFlagsNV);
-    memcpy((VkExternalMemoryHandleTypeFlagsNV*)&forUnmarshaling->exportFromImportedHandleTypes, *ptr, sizeof(VkExternalMemoryHandleTypeFlagsNV));
+    memcpy((VkExternalMemoryHandleTypeFlagsNV*)&forUnmarshaling->exportFromImportedHandleTypes,
+           *ptr, sizeof(VkExternalMemoryHandleTypeFlagsNV));
     *ptr += sizeof(VkExternalMemoryHandleTypeFlagsNV);
-    memcpy((VkExternalMemoryHandleTypeFlagsNV*)&forUnmarshaling->compatibleHandleTypes, *ptr, sizeof(VkExternalMemoryHandleTypeFlagsNV));
+    memcpy((VkExternalMemoryHandleTypeFlagsNV*)&forUnmarshaling->compatibleHandleTypes, *ptr,
+           sizeof(VkExternalMemoryHandleTypeFlagsNV));
     *ptr += sizeof(VkExternalMemoryHandleTypeFlagsNV);
 }
 
 #endif
 #ifdef VK_NV_external_memory
 void reservedunmarshal_VkExternalMemoryImageCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalMemoryImageCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkExternalMemoryImageCreateInfoNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -15650,30 +15513,30 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkExternalMemoryHandleTypeFlagsNV*)&forUnmarshaling->handleTypes, *ptr, sizeof(VkExternalMemoryHandleTypeFlagsNV));
+    memcpy((VkExternalMemoryHandleTypeFlagsNV*)&forUnmarshaling->handleTypes, *ptr,
+           sizeof(VkExternalMemoryHandleTypeFlagsNV));
     *ptr += sizeof(VkExternalMemoryHandleTypeFlagsNV);
 }
 
-void reservedunmarshal_VkExportMemoryAllocateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExportMemoryAllocateInfoNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkExportMemoryAllocateInfoNV(VulkanStream* vkStream,
+                                                    VkStructureType rootType,
+                                                    VkExportMemoryAllocateInfoNV* forUnmarshaling,
+                                                    uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -15681,32 +15544,31 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkExternalMemoryHandleTypeFlagsNV*)&forUnmarshaling->handleTypes, *ptr, sizeof(VkExternalMemoryHandleTypeFlagsNV));
+    memcpy((VkExternalMemoryHandleTypeFlagsNV*)&forUnmarshaling->handleTypes, *ptr,
+           sizeof(VkExternalMemoryHandleTypeFlagsNV));
     *ptr += sizeof(VkExternalMemoryHandleTypeFlagsNV);
 }
 
 #endif
 #ifdef VK_NV_external_memory_win32
 void reservedunmarshal_VkImportMemoryWin32HandleInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportMemoryWin32HandleInfoNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImportMemoryWin32HandleInfoNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -15714,32 +15576,31 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkExternalMemoryHandleTypeFlagsNV*)&forUnmarshaling->handleType, *ptr, sizeof(VkExternalMemoryHandleTypeFlagsNV));
+    memcpy((VkExternalMemoryHandleTypeFlagsNV*)&forUnmarshaling->handleType, *ptr,
+           sizeof(VkExternalMemoryHandleTypeFlagsNV));
     *ptr += sizeof(VkExternalMemoryHandleTypeFlagsNV);
     memcpy((HANDLE*)&forUnmarshaling->handle, *ptr, sizeof(HANDLE));
     *ptr += sizeof(HANDLE);
 }
 
 void reservedunmarshal_VkExportMemoryWin32HandleInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExportMemoryWin32HandleInfoNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkExportMemoryWin32HandleInfoNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -15747,24 +15608,26 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     // WARNING PTR CHECK
     memcpy((SECURITY_ATTRIBUTES**)&forUnmarshaling->pAttributes, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pAttributes);
     *ptr += 8;
-    if (forUnmarshaling->pAttributes)
-    {
+    if (forUnmarshaling->pAttributes) {
         vkStream->alloc((void**)&forUnmarshaling->pAttributes, sizeof(const SECURITY_ATTRIBUTES));
-        memcpy((SECURITY_ATTRIBUTES*)forUnmarshaling->pAttributes, *ptr, sizeof(const SECURITY_ATTRIBUTES));
+        memcpy((SECURITY_ATTRIBUTES*)forUnmarshaling->pAttributes, *ptr,
+               sizeof(const SECURITY_ATTRIBUTES));
         *ptr += sizeof(const SECURITY_ATTRIBUTES);
     }
     memcpy((DWORD*)&forUnmarshaling->dwAccess, *ptr, sizeof(DWORD));
@@ -15774,15 +15637,11 @@
 #endif
 #ifdef VK_NV_win32_keyed_mutex
 void reservedunmarshal_VkWin32KeyedMutexAcquireReleaseInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkWin32KeyedMutexAcquireReleaseInfoNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkWin32KeyedMutexAcquireReleaseInfoNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -15790,71 +15649,74 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->acquireCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pAcquireSyncs, forUnmarshaling->acquireCount * sizeof(const VkDeviceMemory));
-    if (forUnmarshaling->acquireCount)
-    {
+    vkStream->alloc((void**)&forUnmarshaling->pAcquireSyncs,
+                    forUnmarshaling->acquireCount * sizeof(const VkDeviceMemory));
+    if (forUnmarshaling->acquireCount) {
         uint8_t* cgen_var_0_ptr = (uint8_t*)(*ptr);
         *ptr += 8 * forUnmarshaling->acquireCount;
-        if (forUnmarshaling)
-        {
-            for (uint32_t k = 0; k < forUnmarshaling->acquireCount; ++k)
-            {
-                uint64_t tmpval; memcpy(&tmpval, cgen_var_0_ptr + k * 8, sizeof(uint64_t));
-                *(((VkDeviceMemory*)forUnmarshaling->pAcquireSyncs) + k) = (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)tmpval);
+        if (forUnmarshaling) {
+            for (uint32_t k = 0; k < forUnmarshaling->acquireCount; ++k) {
+                uint64_t tmpval;
+                memcpy(&tmpval, cgen_var_0_ptr + k * 8, sizeof(uint64_t));
+                *(((VkDeviceMemory*)forUnmarshaling->pAcquireSyncs) + k) =
+                    (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)tmpval);
             }
         }
     }
-    vkStream->alloc((void**)&forUnmarshaling->pAcquireKeys, forUnmarshaling->acquireCount * sizeof(const uint64_t));
-    memcpy((uint64_t*)forUnmarshaling->pAcquireKeys, *ptr, forUnmarshaling->acquireCount * sizeof(const uint64_t));
+    vkStream->alloc((void**)&forUnmarshaling->pAcquireKeys,
+                    forUnmarshaling->acquireCount * sizeof(const uint64_t));
+    memcpy((uint64_t*)forUnmarshaling->pAcquireKeys, *ptr,
+           forUnmarshaling->acquireCount * sizeof(const uint64_t));
     *ptr += forUnmarshaling->acquireCount * sizeof(const uint64_t);
-    vkStream->alloc((void**)&forUnmarshaling->pAcquireTimeoutMilliseconds, forUnmarshaling->acquireCount * sizeof(const uint32_t));
-    memcpy((uint32_t*)forUnmarshaling->pAcquireTimeoutMilliseconds, *ptr, forUnmarshaling->acquireCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pAcquireTimeoutMilliseconds,
+                    forUnmarshaling->acquireCount * sizeof(const uint32_t));
+    memcpy((uint32_t*)forUnmarshaling->pAcquireTimeoutMilliseconds, *ptr,
+           forUnmarshaling->acquireCount * sizeof(const uint32_t));
     *ptr += forUnmarshaling->acquireCount * sizeof(const uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->releaseCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pReleaseSyncs, forUnmarshaling->releaseCount * sizeof(const VkDeviceMemory));
-    if (forUnmarshaling->releaseCount)
-    {
+    vkStream->alloc((void**)&forUnmarshaling->pReleaseSyncs,
+                    forUnmarshaling->releaseCount * sizeof(const VkDeviceMemory));
+    if (forUnmarshaling->releaseCount) {
         uint8_t* cgen_var_1_ptr = (uint8_t*)(*ptr);
         *ptr += 8 * forUnmarshaling->releaseCount;
-        if (forUnmarshaling)
-        {
-            for (uint32_t k = 0; k < forUnmarshaling->releaseCount; ++k)
-            {
-                uint64_t tmpval; memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
-                *(((VkDeviceMemory*)forUnmarshaling->pReleaseSyncs) + k) = (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)tmpval);
+        if (forUnmarshaling) {
+            for (uint32_t k = 0; k < forUnmarshaling->releaseCount; ++k) {
+                uint64_t tmpval;
+                memcpy(&tmpval, cgen_var_1_ptr + k * 8, sizeof(uint64_t));
+                *(((VkDeviceMemory*)forUnmarshaling->pReleaseSyncs) + k) =
+                    (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)tmpval);
             }
         }
     }
-    vkStream->alloc((void**)&forUnmarshaling->pReleaseKeys, forUnmarshaling->releaseCount * sizeof(const uint64_t));
-    memcpy((uint64_t*)forUnmarshaling->pReleaseKeys, *ptr, forUnmarshaling->releaseCount * sizeof(const uint64_t));
+    vkStream->alloc((void**)&forUnmarshaling->pReleaseKeys,
+                    forUnmarshaling->releaseCount * sizeof(const uint64_t));
+    memcpy((uint64_t*)forUnmarshaling->pReleaseKeys, *ptr,
+           forUnmarshaling->releaseCount * sizeof(const uint64_t));
     *ptr += forUnmarshaling->releaseCount * sizeof(const uint64_t);
 }
 
 #endif
 #ifdef VK_EXT_validation_flags
-void reservedunmarshal_VkValidationFlagsEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkValidationFlagsEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkValidationFlagsEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkValidationFlagsEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -15862,35 +15724,36 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->disabledValidationCheckCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pDisabledValidationChecks, forUnmarshaling->disabledValidationCheckCount * sizeof(const VkValidationCheckEXT));
-    memcpy((VkValidationCheckEXT*)forUnmarshaling->pDisabledValidationChecks, *ptr, forUnmarshaling->disabledValidationCheckCount * sizeof(const VkValidationCheckEXT));
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pDisabledValidationChecks,
+        forUnmarshaling->disabledValidationCheckCount * sizeof(const VkValidationCheckEXT));
+    memcpy((VkValidationCheckEXT*)forUnmarshaling->pDisabledValidationChecks, *ptr,
+           forUnmarshaling->disabledValidationCheckCount * sizeof(const VkValidationCheckEXT));
     *ptr += forUnmarshaling->disabledValidationCheckCount * sizeof(const VkValidationCheckEXT);
 }
 
 #endif
 #ifdef VK_NN_vi_surface
-void reservedunmarshal_VkViSurfaceCreateInfoNN(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkViSurfaceCreateInfoNN* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkViSurfaceCreateInfoNN(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkViSurfaceCreateInfoNN* forUnmarshaling,
+                                               uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -15898,24 +15761,26 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkViSurfaceCreateFlagsNN*)&forUnmarshaling->flags, *ptr, sizeof(VkViSurfaceCreateFlagsNN));
+    memcpy((VkViSurfaceCreateFlagsNN*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkViSurfaceCreateFlagsNN));
     *ptr += sizeof(VkViSurfaceCreateFlagsNN);
     // WARNING PTR CHECK
     memcpy((void**)&forUnmarshaling->window, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->window);
     *ptr += 8;
-    if (forUnmarshaling->window)
-    {
+    if (forUnmarshaling->window) {
         vkStream->alloc((void**)&forUnmarshaling->window, sizeof(uint8_t));
         memcpy((void*)forUnmarshaling->window, *ptr, sizeof(uint8_t));
         *ptr += sizeof(uint8_t);
@@ -15929,15 +15794,11 @@
 #endif
 #ifdef VK_EXT_texture_compression_astc_hdr
 void reservedunmarshal_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -15945,15 +15806,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->textureCompressionASTC_HDR, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -15961,16 +15824,13 @@
 
 #endif
 #ifdef VK_EXT_astc_decode_mode
-void reservedunmarshal_VkImageViewASTCDecodeModeEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageViewASTCDecodeModeEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkImageViewASTCDecodeModeEXT(VulkanStream* vkStream,
+                                                    VkStructureType rootType,
+                                                    VkImageViewASTCDecodeModeEXT* forUnmarshaling,
+                                                    uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -15978,30 +15838,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkFormat*)&forUnmarshaling->decodeMode, *ptr, sizeof(VkFormat));
     *ptr += sizeof(VkFormat);
 }
 
 void reservedunmarshal_VkPhysicalDeviceASTCDecodeFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceASTCDecodeFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceASTCDecodeFeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -16009,15 +15867,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->decodeModeSharedExponent, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -16026,15 +15886,11 @@
 #endif
 #ifdef VK_EXT_conditional_rendering
 void reservedunmarshal_VkConditionalRenderingBeginInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkConditionalRenderingBeginInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkConditionalRenderingBeginInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -16042,15 +15898,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
@@ -16058,20 +15916,17 @@
     *(VkBuffer*)&forUnmarshaling->buffer = (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_0));
     memcpy((VkDeviceSize*)&forUnmarshaling->offset, *ptr, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
-    memcpy((VkConditionalRenderingFlagsEXT*)&forUnmarshaling->flags, *ptr, sizeof(VkConditionalRenderingFlagsEXT));
+    memcpy((VkConditionalRenderingFlagsEXT*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkConditionalRenderingFlagsEXT));
     *ptr += sizeof(VkConditionalRenderingFlagsEXT);
 }
 
 void reservedunmarshal_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceConditionalRenderingFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceConditionalRenderingFeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -16079,15 +15934,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->conditionalRendering, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -16096,15 +15953,11 @@
 }
 
 void reservedunmarshal_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCommandBufferInheritanceConditionalRenderingInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkCommandBufferInheritanceConditionalRenderingInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -16112,15 +15965,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->conditionalRenderingEnable, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -16128,12 +15983,8 @@
 
 #endif
 #ifdef VK_NV_clip_space_w_scaling
-void reservedunmarshal_VkViewportWScalingNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkViewportWScalingNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkViewportWScalingNV(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkViewportWScalingNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((float*)&forUnmarshaling->xcoeff, *ptr, sizeof(float));
     *ptr += sizeof(float);
     memcpy((float*)&forUnmarshaling->ycoeff, *ptr, sizeof(float));
@@ -16141,15 +15992,11 @@
 }
 
 void reservedunmarshal_VkPipelineViewportWScalingStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineViewportWScalingStateCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineViewportWScalingStateCreateInfoNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -16157,15 +16004,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->viewportWScalingEnable, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -16175,12 +16024,13 @@
     memcpy((VkViewportWScalingNV**)&forUnmarshaling->pViewportWScalings, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pViewportWScalings);
     *ptr += 8;
-    if (forUnmarshaling->pViewportWScalings)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pViewportWScalings, forUnmarshaling->viewportCount * sizeof(const VkViewportWScalingNV));
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->viewportCount; ++i)
-        {
-            reservedunmarshal_VkViewportWScalingNV(vkStream, rootType, (VkViewportWScalingNV*)(forUnmarshaling->pViewportWScalings + i), ptr);
+    if (forUnmarshaling->pViewportWScalings) {
+        vkStream->alloc((void**)&forUnmarshaling->pViewportWScalings,
+                        forUnmarshaling->viewportCount * sizeof(const VkViewportWScalingNV));
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->viewportCount; ++i) {
+            reservedunmarshal_VkViewportWScalingNV(
+                vkStream, rootType,
+                (VkViewportWScalingNV*)(forUnmarshaling->pViewportWScalings + i), ptr);
         }
     }
 }
@@ -16191,16 +16041,12 @@
 #ifdef VK_EXT_acquire_xlib_display
 #endif
 #ifdef VK_EXT_display_surface_counter
-void reservedunmarshal_VkSurfaceCapabilities2EXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSurfaceCapabilities2EXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkSurfaceCapabilities2EXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkSurfaceCapabilities2EXT* forUnmarshaling,
+                                                 uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -16208,49 +16054,55 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->minImageCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->maxImageCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->currentExtent), ptr);
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->minImageExtent), ptr);
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->maxImageExtent), ptr);
+    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->currentExtent),
+                                 ptr);
+    reservedunmarshal_VkExtent2D(vkStream, rootType,
+                                 (VkExtent2D*)(&forUnmarshaling->minImageExtent), ptr);
+    reservedunmarshal_VkExtent2D(vkStream, rootType,
+                                 (VkExtent2D*)(&forUnmarshaling->maxImageExtent), ptr);
     memcpy((uint32_t*)&forUnmarshaling->maxImageArrayLayers, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((VkSurfaceTransformFlagsKHR*)&forUnmarshaling->supportedTransforms, *ptr, sizeof(VkSurfaceTransformFlagsKHR));
+    memcpy((VkSurfaceTransformFlagsKHR*)&forUnmarshaling->supportedTransforms, *ptr,
+           sizeof(VkSurfaceTransformFlagsKHR));
     *ptr += sizeof(VkSurfaceTransformFlagsKHR);
-    memcpy((VkSurfaceTransformFlagBitsKHR*)&forUnmarshaling->currentTransform, *ptr, sizeof(VkSurfaceTransformFlagBitsKHR));
+    memcpy((VkSurfaceTransformFlagBitsKHR*)&forUnmarshaling->currentTransform, *ptr,
+           sizeof(VkSurfaceTransformFlagBitsKHR));
     *ptr += sizeof(VkSurfaceTransformFlagBitsKHR);
-    memcpy((VkCompositeAlphaFlagsKHR*)&forUnmarshaling->supportedCompositeAlpha, *ptr, sizeof(VkCompositeAlphaFlagsKHR));
+    memcpy((VkCompositeAlphaFlagsKHR*)&forUnmarshaling->supportedCompositeAlpha, *ptr,
+           sizeof(VkCompositeAlphaFlagsKHR));
     *ptr += sizeof(VkCompositeAlphaFlagsKHR);
-    memcpy((VkImageUsageFlags*)&forUnmarshaling->supportedUsageFlags, *ptr, sizeof(VkImageUsageFlags));
+    memcpy((VkImageUsageFlags*)&forUnmarshaling->supportedUsageFlags, *ptr,
+           sizeof(VkImageUsageFlags));
     *ptr += sizeof(VkImageUsageFlags);
-    memcpy((VkSurfaceCounterFlagsEXT*)&forUnmarshaling->supportedSurfaceCounters, *ptr, sizeof(VkSurfaceCounterFlagsEXT));
+    memcpy((VkSurfaceCounterFlagsEXT*)&forUnmarshaling->supportedSurfaceCounters, *ptr,
+           sizeof(VkSurfaceCounterFlagsEXT));
     *ptr += sizeof(VkSurfaceCounterFlagsEXT);
 }
 
 #endif
 #ifdef VK_EXT_display_control
-void reservedunmarshal_VkDisplayPowerInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayPowerInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDisplayPowerInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkDisplayPowerInfoEXT* forUnmarshaling,
+                                             uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -16258,30 +16110,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkDisplayPowerStateEXT*)&forUnmarshaling->powerState, *ptr, sizeof(VkDisplayPowerStateEXT));
+    memcpy((VkDisplayPowerStateEXT*)&forUnmarshaling->powerState, *ptr,
+           sizeof(VkDisplayPowerStateEXT));
     *ptr += sizeof(VkDisplayPowerStateEXT);
 }
 
-void reservedunmarshal_VkDeviceEventInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceEventInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDeviceEventInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkDeviceEventInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -16289,30 +16139,29 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkDeviceEventTypeEXT*)&forUnmarshaling->deviceEvent, *ptr, sizeof(VkDeviceEventTypeEXT));
+    memcpy((VkDeviceEventTypeEXT*)&forUnmarshaling->deviceEvent, *ptr,
+           sizeof(VkDeviceEventTypeEXT));
     *ptr += sizeof(VkDeviceEventTypeEXT);
 }
 
-void reservedunmarshal_VkDisplayEventInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayEventInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDisplayEventInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkDisplayEventInfoEXT* forUnmarshaling,
+                                             uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -16320,30 +16169,29 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkDisplayEventTypeEXT*)&forUnmarshaling->displayEvent, *ptr, sizeof(VkDisplayEventTypeEXT));
+    memcpy((VkDisplayEventTypeEXT*)&forUnmarshaling->displayEvent, *ptr,
+           sizeof(VkDisplayEventTypeEXT));
     *ptr += sizeof(VkDisplayEventTypeEXT);
 }
 
 void reservedunmarshal_VkSwapchainCounterCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSwapchainCounterCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSwapchainCounterCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -16351,38 +16199,36 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkSurfaceCounterFlagsEXT*)&forUnmarshaling->surfaceCounters, *ptr, sizeof(VkSurfaceCounterFlagsEXT));
+    memcpy((VkSurfaceCounterFlagsEXT*)&forUnmarshaling->surfaceCounters, *ptr,
+           sizeof(VkSurfaceCounterFlagsEXT));
     *ptr += sizeof(VkSurfaceCounterFlagsEXT);
 }
 
 #endif
 #ifdef VK_GOOGLE_display_timing
-void reservedunmarshal_VkRefreshCycleDurationGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRefreshCycleDurationGOOGLE* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkRefreshCycleDurationGOOGLE(VulkanStream* vkStream,
+                                                    VkStructureType rootType,
+                                                    VkRefreshCycleDurationGOOGLE* forUnmarshaling,
+                                                    uint8_t** ptr) {
     memcpy((uint64_t*)&forUnmarshaling->refreshDuration, *ptr, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
 }
 
 void reservedunmarshal_VkPastPresentationTimingGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPastPresentationTimingGOOGLE* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPastPresentationTimingGOOGLE* forUnmarshaling, uint8_t** ptr) {
     memcpy((uint32_t*)&forUnmarshaling->presentID, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint64_t*)&forUnmarshaling->desiredPresentTime, *ptr, sizeof(uint64_t));
@@ -16395,28 +16241,20 @@
     *ptr += sizeof(uint64_t);
 }
 
-void reservedunmarshal_VkPresentTimeGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPresentTimeGOOGLE* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkPresentTimeGOOGLE(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkPresentTimeGOOGLE* forUnmarshaling, uint8_t** ptr) {
     memcpy((uint32_t*)&forUnmarshaling->presentID, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint64_t*)&forUnmarshaling->desiredPresentTime, *ptr, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
 }
 
-void reservedunmarshal_VkPresentTimesInfoGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPresentTimesInfoGOOGLE* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkPresentTimesInfoGOOGLE(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkPresentTimesInfoGOOGLE* forUnmarshaling,
+                                                uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -16424,15 +16262,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->swapchainCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -16440,12 +16280,12 @@
     memcpy((VkPresentTimeGOOGLE**)&forUnmarshaling->pTimes, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pTimes);
     *ptr += 8;
-    if (forUnmarshaling->pTimes)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pTimes, forUnmarshaling->swapchainCount * sizeof(const VkPresentTimeGOOGLE));
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->swapchainCount; ++i)
-        {
-            reservedunmarshal_VkPresentTimeGOOGLE(vkStream, rootType, (VkPresentTimeGOOGLE*)(forUnmarshaling->pTimes + i), ptr);
+    if (forUnmarshaling->pTimes) {
+        vkStream->alloc((void**)&forUnmarshaling->pTimes,
+                        forUnmarshaling->swapchainCount * sizeof(const VkPresentTimeGOOGLE));
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->swapchainCount; ++i) {
+            reservedunmarshal_VkPresentTimeGOOGLE(
+                vkStream, rootType, (VkPresentTimeGOOGLE*)(forUnmarshaling->pTimes + i), ptr);
         }
     }
 }
@@ -16459,15 +16299,11 @@
 #endif
 #ifdef VK_NVX_multiview_per_view_attributes
 void reservedunmarshal_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -16475,15 +16311,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->perViewPositionAllComponents, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -16491,32 +16329,28 @@
 
 #endif
 #ifdef VK_NV_viewport_swizzle
-void reservedunmarshal_VkViewportSwizzleNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkViewportSwizzleNV* forUnmarshaling,
-    uint8_t** ptr)
-{
-    memcpy((VkViewportCoordinateSwizzleNV*)&forUnmarshaling->x, *ptr, sizeof(VkViewportCoordinateSwizzleNV));
+void reservedunmarshal_VkViewportSwizzleNV(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkViewportSwizzleNV* forUnmarshaling, uint8_t** ptr) {
+    memcpy((VkViewportCoordinateSwizzleNV*)&forUnmarshaling->x, *ptr,
+           sizeof(VkViewportCoordinateSwizzleNV));
     *ptr += sizeof(VkViewportCoordinateSwizzleNV);
-    memcpy((VkViewportCoordinateSwizzleNV*)&forUnmarshaling->y, *ptr, sizeof(VkViewportCoordinateSwizzleNV));
+    memcpy((VkViewportCoordinateSwizzleNV*)&forUnmarshaling->y, *ptr,
+           sizeof(VkViewportCoordinateSwizzleNV));
     *ptr += sizeof(VkViewportCoordinateSwizzleNV);
-    memcpy((VkViewportCoordinateSwizzleNV*)&forUnmarshaling->z, *ptr, sizeof(VkViewportCoordinateSwizzleNV));
+    memcpy((VkViewportCoordinateSwizzleNV*)&forUnmarshaling->z, *ptr,
+           sizeof(VkViewportCoordinateSwizzleNV));
     *ptr += sizeof(VkViewportCoordinateSwizzleNV);
-    memcpy((VkViewportCoordinateSwizzleNV*)&forUnmarshaling->w, *ptr, sizeof(VkViewportCoordinateSwizzleNV));
+    memcpy((VkViewportCoordinateSwizzleNV*)&forUnmarshaling->w, *ptr,
+           sizeof(VkViewportCoordinateSwizzleNV));
     *ptr += sizeof(VkViewportCoordinateSwizzleNV);
 }
 
 void reservedunmarshal_VkPipelineViewportSwizzleStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineViewportSwizzleStateCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineViewportSwizzleStateCreateInfoNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -16524,17 +16358,20 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkPipelineViewportSwizzleStateCreateFlagsNV*)&forUnmarshaling->flags, *ptr, sizeof(VkPipelineViewportSwizzleStateCreateFlagsNV));
+    memcpy((VkPipelineViewportSwizzleStateCreateFlagsNV*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkPipelineViewportSwizzleStateCreateFlagsNV));
     *ptr += sizeof(VkPipelineViewportSwizzleStateCreateFlagsNV);
     memcpy((uint32_t*)&forUnmarshaling->viewportCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -16542,12 +16379,13 @@
     memcpy((VkViewportSwizzleNV**)&forUnmarshaling->pViewportSwizzles, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pViewportSwizzles);
     *ptr += 8;
-    if (forUnmarshaling->pViewportSwizzles)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pViewportSwizzles, forUnmarshaling->viewportCount * sizeof(const VkViewportSwizzleNV));
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->viewportCount; ++i)
-        {
-            reservedunmarshal_VkViewportSwizzleNV(vkStream, rootType, (VkViewportSwizzleNV*)(forUnmarshaling->pViewportSwizzles + i), ptr);
+    if (forUnmarshaling->pViewportSwizzles) {
+        vkStream->alloc((void**)&forUnmarshaling->pViewportSwizzles,
+                        forUnmarshaling->viewportCount * sizeof(const VkViewportSwizzleNV));
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->viewportCount; ++i) {
+            reservedunmarshal_VkViewportSwizzleNV(
+                vkStream, rootType, (VkViewportSwizzleNV*)(forUnmarshaling->pViewportSwizzles + i),
+                ptr);
         }
     }
 }
@@ -16555,15 +16393,11 @@
 #endif
 #ifdef VK_EXT_discard_rectangles
 void reservedunmarshal_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDiscardRectanglePropertiesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceDiscardRectanglePropertiesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -16571,30 +16405,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->maxDiscardRectangles, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
 void reservedunmarshal_VkPipelineDiscardRectangleStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineDiscardRectangleStateCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineDiscardRectangleStateCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -16602,19 +16434,23 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkPipelineDiscardRectangleStateCreateFlagsEXT*)&forUnmarshaling->flags, *ptr, sizeof(VkPipelineDiscardRectangleStateCreateFlagsEXT));
+    memcpy((VkPipelineDiscardRectangleStateCreateFlagsEXT*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkPipelineDiscardRectangleStateCreateFlagsEXT));
     *ptr += sizeof(VkPipelineDiscardRectangleStateCreateFlagsEXT);
-    memcpy((VkDiscardRectangleModeEXT*)&forUnmarshaling->discardRectangleMode, *ptr, sizeof(VkDiscardRectangleModeEXT));
+    memcpy((VkDiscardRectangleModeEXT*)&forUnmarshaling->discardRectangleMode, *ptr,
+           sizeof(VkDiscardRectangleModeEXT));
     *ptr += sizeof(VkDiscardRectangleModeEXT);
     memcpy((uint32_t*)&forUnmarshaling->discardRectangleCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -16622,12 +16458,12 @@
     memcpy((VkRect2D**)&forUnmarshaling->pDiscardRectangles, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pDiscardRectangles);
     *ptr += 8;
-    if (forUnmarshaling->pDiscardRectangles)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pDiscardRectangles, forUnmarshaling->discardRectangleCount * sizeof(const VkRect2D));
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->discardRectangleCount; ++i)
-        {
-            reservedunmarshal_VkRect2D(vkStream, rootType, (VkRect2D*)(forUnmarshaling->pDiscardRectangles + i), ptr);
+    if (forUnmarshaling->pDiscardRectangles) {
+        vkStream->alloc((void**)&forUnmarshaling->pDiscardRectangles,
+                        forUnmarshaling->discardRectangleCount * sizeof(const VkRect2D));
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->discardRectangleCount; ++i) {
+            reservedunmarshal_VkRect2D(vkStream, rootType,
+                                       (VkRect2D*)(forUnmarshaling->pDiscardRectangles + i), ptr);
         }
     }
 }
@@ -16635,15 +16471,11 @@
 #endif
 #ifdef VK_EXT_conservative_rasterization
 void reservedunmarshal_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceConservativeRasterizationPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceConservativeRasterizationPropertiesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -16651,46 +16483,48 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((float*)&forUnmarshaling->primitiveOverestimationSize, *ptr, sizeof(float));
     *ptr += sizeof(float);
     memcpy((float*)&forUnmarshaling->maxExtraPrimitiveOverestimationSize, *ptr, sizeof(float));
     *ptr += sizeof(float);
-    memcpy((float*)&forUnmarshaling->extraPrimitiveOverestimationSizeGranularity, *ptr, sizeof(float));
+    memcpy((float*)&forUnmarshaling->extraPrimitiveOverestimationSizeGranularity, *ptr,
+           sizeof(float));
     *ptr += sizeof(float);
     memcpy((VkBool32*)&forUnmarshaling->primitiveUnderestimation, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->conservativePointAndLineRasterization, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->conservativePointAndLineRasterization, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy((VkBool32*)&forUnmarshaling->degenerateTrianglesRasterized, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy((VkBool32*)&forUnmarshaling->degenerateLinesRasterized, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->fullyCoveredFragmentShaderInputVariable, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->fullyCoveredFragmentShaderInputVariable, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->conservativeRasterizationPostDepthCoverage, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->conservativeRasterizationPostDepthCoverage, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkPipelineRasterizationConservativeStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineRasterizationConservativeStateCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineRasterizationConservativeStateCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -16698,19 +16532,23 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkPipelineRasterizationConservativeStateCreateFlagsEXT*)&forUnmarshaling->flags, *ptr, sizeof(VkPipelineRasterizationConservativeStateCreateFlagsEXT));
+    memcpy((VkPipelineRasterizationConservativeStateCreateFlagsEXT*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkPipelineRasterizationConservativeStateCreateFlagsEXT));
     *ptr += sizeof(VkPipelineRasterizationConservativeStateCreateFlagsEXT);
-    memcpy((VkConservativeRasterizationModeEXT*)&forUnmarshaling->conservativeRasterizationMode, *ptr, sizeof(VkConservativeRasterizationModeEXT));
+    memcpy((VkConservativeRasterizationModeEXT*)&forUnmarshaling->conservativeRasterizationMode,
+           *ptr, sizeof(VkConservativeRasterizationModeEXT));
     *ptr += sizeof(VkConservativeRasterizationModeEXT);
     memcpy((float*)&forUnmarshaling->extraPrimitiveOverestimationSize, *ptr, sizeof(float));
     *ptr += sizeof(float);
@@ -16719,15 +16557,11 @@
 #endif
 #ifdef VK_EXT_depth_clip_enable
 void reservedunmarshal_VkPhysicalDeviceDepthClipEnableFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDepthClipEnableFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceDepthClipEnableFeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -16735,30 +16569,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->depthClipEnable, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkPipelineRasterizationDepthClipStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineRasterizationDepthClipStateCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineRasterizationDepthClipStateCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -16766,17 +16598,20 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkPipelineRasterizationDepthClipStateCreateFlagsEXT*)&forUnmarshaling->flags, *ptr, sizeof(VkPipelineRasterizationDepthClipStateCreateFlagsEXT));
+    memcpy((VkPipelineRasterizationDepthClipStateCreateFlagsEXT*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkPipelineRasterizationDepthClipStateCreateFlagsEXT));
     *ptr += sizeof(VkPipelineRasterizationDepthClipStateCreateFlagsEXT);
     memcpy((VkBool32*)&forUnmarshaling->depthClipEnable, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -16786,28 +16621,19 @@
 #ifdef VK_EXT_swapchain_colorspace
 #endif
 #ifdef VK_EXT_hdr_metadata
-void reservedunmarshal_VkXYColorEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkXYColorEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkXYColorEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkXYColorEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((float*)&forUnmarshaling->x, *ptr, sizeof(float));
     *ptr += sizeof(float);
     memcpy((float*)&forUnmarshaling->y, *ptr, sizeof(float));
     *ptr += sizeof(float);
 }
 
-void reservedunmarshal_VkHdrMetadataEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkHdrMetadataEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkHdrMetadataEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkHdrMetadataEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -16815,20 +16641,26 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    reservedunmarshal_VkXYColorEXT(vkStream, rootType, (VkXYColorEXT*)(&forUnmarshaling->displayPrimaryRed), ptr);
-    reservedunmarshal_VkXYColorEXT(vkStream, rootType, (VkXYColorEXT*)(&forUnmarshaling->displayPrimaryGreen), ptr);
-    reservedunmarshal_VkXYColorEXT(vkStream, rootType, (VkXYColorEXT*)(&forUnmarshaling->displayPrimaryBlue), ptr);
-    reservedunmarshal_VkXYColorEXT(vkStream, rootType, (VkXYColorEXT*)(&forUnmarshaling->whitePoint), ptr);
+    reservedunmarshal_VkXYColorEXT(vkStream, rootType,
+                                   (VkXYColorEXT*)(&forUnmarshaling->displayPrimaryRed), ptr);
+    reservedunmarshal_VkXYColorEXT(vkStream, rootType,
+                                   (VkXYColorEXT*)(&forUnmarshaling->displayPrimaryGreen), ptr);
+    reservedunmarshal_VkXYColorEXT(vkStream, rootType,
+                                   (VkXYColorEXT*)(&forUnmarshaling->displayPrimaryBlue), ptr);
+    reservedunmarshal_VkXYColorEXT(vkStream, rootType,
+                                   (VkXYColorEXT*)(&forUnmarshaling->whitePoint), ptr);
     memcpy((float*)&forUnmarshaling->maxLuminance, *ptr, sizeof(float));
     *ptr += sizeof(float);
     memcpy((float*)&forUnmarshaling->minLuminance, *ptr, sizeof(float));
@@ -16841,16 +16673,12 @@
 
 #endif
 #ifdef VK_MVK_ios_surface
-void reservedunmarshal_VkIOSSurfaceCreateInfoMVK(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkIOSSurfaceCreateInfoMVK* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkIOSSurfaceCreateInfoMVK(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkIOSSurfaceCreateInfoMVK* forUnmarshaling,
+                                                 uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -16858,24 +16686,26 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkIOSSurfaceCreateFlagsMVK*)&forUnmarshaling->flags, *ptr, sizeof(VkIOSSurfaceCreateFlagsMVK));
+    memcpy((VkIOSSurfaceCreateFlagsMVK*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkIOSSurfaceCreateFlagsMVK));
     *ptr += sizeof(VkIOSSurfaceCreateFlagsMVK);
     // WARNING PTR CHECK
     memcpy((void**)&forUnmarshaling->pView, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pView);
     *ptr += 8;
-    if (forUnmarshaling->pView)
-    {
+    if (forUnmarshaling->pView) {
         vkStream->alloc((void**)&forUnmarshaling->pView, sizeof(const uint8_t));
         memcpy((void*)forUnmarshaling->pView, *ptr, sizeof(const uint8_t));
         *ptr += sizeof(const uint8_t);
@@ -16884,16 +16714,12 @@
 
 #endif
 #ifdef VK_MVK_macos_surface
-void reservedunmarshal_VkMacOSSurfaceCreateInfoMVK(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMacOSSurfaceCreateInfoMVK* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkMacOSSurfaceCreateInfoMVK(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkMacOSSurfaceCreateInfoMVK* forUnmarshaling,
+                                                   uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -16901,24 +16727,26 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkMacOSSurfaceCreateFlagsMVK*)&forUnmarshaling->flags, *ptr, sizeof(VkMacOSSurfaceCreateFlagsMVK));
+    memcpy((VkMacOSSurfaceCreateFlagsMVK*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkMacOSSurfaceCreateFlagsMVK));
     *ptr += sizeof(VkMacOSSurfaceCreateFlagsMVK);
     // WARNING PTR CHECK
     memcpy((void**)&forUnmarshaling->pView, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pView);
     *ptr += 8;
-    if (forUnmarshaling->pView)
-    {
+    if (forUnmarshaling->pView) {
         vkStream->alloc((void**)&forUnmarshaling->pView, sizeof(const uint8_t));
         memcpy((void*)forUnmarshaling->pView, *ptr, sizeof(const uint8_t));
         *ptr += sizeof(const uint8_t);
@@ -16933,16 +16761,11 @@
 #ifdef VK_EXT_queue_family_foreign
 #endif
 #ifdef VK_EXT_debug_utils
-void reservedunmarshal_VkDebugUtilsLabelEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDebugUtilsLabelEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDebugUtilsLabelEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkDebugUtilsLabelEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -16950,31 +16773,30 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     vkStream->loadStringInPlaceWithStreamPtr((char**)&forUnmarshaling->pLabelName, ptr);
     memcpy((float*)forUnmarshaling->color, *ptr, 4 * sizeof(float));
     *ptr += 4 * sizeof(float);
 }
 
-void reservedunmarshal_VkDebugUtilsObjectNameInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDebugUtilsObjectNameInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDebugUtilsObjectNameInfoEXT(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkDebugUtilsObjectNameInfoEXT* forUnmarshaling,
+                                                     uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -16982,47 +16804,41 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkObjectType*)&forUnmarshaling->objectType, *ptr, sizeof(VkObjectType));
     *ptr += sizeof(VkObjectType);
     memcpy((uint64_t*)&forUnmarshaling->objectHandle, *ptr, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
-    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
-    {
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT) {
         // WARNING PTR CHECK
         memcpy((char**)&forUnmarshaling->pObjectName, (*ptr), 8);
         android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pObjectName);
         *ptr += 8;
-        if (forUnmarshaling->pObjectName)
-        {
+        if (forUnmarshaling->pObjectName) {
             vkStream->loadStringInPlaceWithStreamPtr((char**)&forUnmarshaling->pObjectName, ptr);
         }
-    }
-    else
-    {
+    } else {
         vkStream->loadStringInPlaceWithStreamPtr((char**)&forUnmarshaling->pObjectName, ptr);
     }
 }
 
 void reservedunmarshal_VkDebugUtilsMessengerCallbackDataEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDebugUtilsMessengerCallbackDataEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDebugUtilsMessengerCallbackDataEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -17030,31 +16846,30 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkDebugUtilsMessengerCallbackDataFlagsEXT*)&forUnmarshaling->flags, *ptr, sizeof(VkDebugUtilsMessengerCallbackDataFlagsEXT));
+    memcpy((VkDebugUtilsMessengerCallbackDataFlagsEXT*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkDebugUtilsMessengerCallbackDataFlagsEXT));
     *ptr += sizeof(VkDebugUtilsMessengerCallbackDataFlagsEXT);
-    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
-    {
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT) {
         // WARNING PTR CHECK
         memcpy((char**)&forUnmarshaling->pMessageIdName, (*ptr), 8);
         android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pMessageIdName);
         *ptr += 8;
-        if (forUnmarshaling->pMessageIdName)
-        {
+        if (forUnmarshaling->pMessageIdName) {
             vkStream->loadStringInPlaceWithStreamPtr((char**)&forUnmarshaling->pMessageIdName, ptr);
         }
-    }
-    else
-    {
+    } else {
         vkStream->loadStringInPlaceWithStreamPtr((char**)&forUnmarshaling->pMessageIdName, ptr);
     }
     memcpy((int32_t*)&forUnmarshaling->messageIdNumber, *ptr, sizeof(int32_t));
@@ -17066,12 +16881,13 @@
     memcpy((VkDebugUtilsLabelEXT**)&forUnmarshaling->pQueueLabels, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pQueueLabels);
     *ptr += 8;
-    if (forUnmarshaling->pQueueLabels)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pQueueLabels, forUnmarshaling->queueLabelCount * sizeof(VkDebugUtilsLabelEXT));
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->queueLabelCount; ++i)
-        {
-            reservedunmarshal_VkDebugUtilsLabelEXT(vkStream, rootType, (VkDebugUtilsLabelEXT*)(forUnmarshaling->pQueueLabels + i), ptr);
+    if (forUnmarshaling->pQueueLabels) {
+        vkStream->alloc((void**)&forUnmarshaling->pQueueLabels,
+                        forUnmarshaling->queueLabelCount * sizeof(VkDebugUtilsLabelEXT));
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->queueLabelCount; ++i) {
+            reservedunmarshal_VkDebugUtilsLabelEXT(
+                vkStream, rootType, (VkDebugUtilsLabelEXT*)(forUnmarshaling->pQueueLabels + i),
+                ptr);
         }
     }
     memcpy((uint32_t*)&forUnmarshaling->cmdBufLabelCount, *ptr, sizeof(uint32_t));
@@ -17080,12 +16896,13 @@
     memcpy((VkDebugUtilsLabelEXT**)&forUnmarshaling->pCmdBufLabels, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pCmdBufLabels);
     *ptr += 8;
-    if (forUnmarshaling->pCmdBufLabels)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pCmdBufLabels, forUnmarshaling->cmdBufLabelCount * sizeof(VkDebugUtilsLabelEXT));
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->cmdBufLabelCount; ++i)
-        {
-            reservedunmarshal_VkDebugUtilsLabelEXT(vkStream, rootType, (VkDebugUtilsLabelEXT*)(forUnmarshaling->pCmdBufLabels + i), ptr);
+    if (forUnmarshaling->pCmdBufLabels) {
+        vkStream->alloc((void**)&forUnmarshaling->pCmdBufLabels,
+                        forUnmarshaling->cmdBufLabelCount * sizeof(VkDebugUtilsLabelEXT));
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->cmdBufLabelCount; ++i) {
+            reservedunmarshal_VkDebugUtilsLabelEXT(
+                vkStream, rootType, (VkDebugUtilsLabelEXT*)(forUnmarshaling->pCmdBufLabels + i),
+                ptr);
         }
     }
     memcpy((uint32_t*)&forUnmarshaling->objectCount, *ptr, sizeof(uint32_t));
@@ -17094,26 +16911,23 @@
     memcpy((VkDebugUtilsObjectNameInfoEXT**)&forUnmarshaling->pObjects, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pObjects);
     *ptr += 8;
-    if (forUnmarshaling->pObjects)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pObjects, forUnmarshaling->objectCount * sizeof(VkDebugUtilsObjectNameInfoEXT));
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->objectCount; ++i)
-        {
-            reservedunmarshal_VkDebugUtilsObjectNameInfoEXT(vkStream, rootType, (VkDebugUtilsObjectNameInfoEXT*)(forUnmarshaling->pObjects + i), ptr);
+    if (forUnmarshaling->pObjects) {
+        vkStream->alloc((void**)&forUnmarshaling->pObjects,
+                        forUnmarshaling->objectCount * sizeof(VkDebugUtilsObjectNameInfoEXT));
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->objectCount; ++i) {
+            reservedunmarshal_VkDebugUtilsObjectNameInfoEXT(
+                vkStream, rootType, (VkDebugUtilsObjectNameInfoEXT*)(forUnmarshaling->pObjects + i),
+                ptr);
         }
     }
 }
 
 void reservedunmarshal_VkDebugUtilsMessengerCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDebugUtilsMessengerCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDebugUtilsMessengerCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -17121,21 +16935,26 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkDebugUtilsMessengerCreateFlagsEXT*)&forUnmarshaling->flags, *ptr, sizeof(VkDebugUtilsMessengerCreateFlagsEXT));
+    memcpy((VkDebugUtilsMessengerCreateFlagsEXT*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkDebugUtilsMessengerCreateFlagsEXT));
     *ptr += sizeof(VkDebugUtilsMessengerCreateFlagsEXT);
-    memcpy((VkDebugUtilsMessageSeverityFlagsEXT*)&forUnmarshaling->messageSeverity, *ptr, sizeof(VkDebugUtilsMessageSeverityFlagsEXT));
+    memcpy((VkDebugUtilsMessageSeverityFlagsEXT*)&forUnmarshaling->messageSeverity, *ptr,
+           sizeof(VkDebugUtilsMessageSeverityFlagsEXT));
     *ptr += sizeof(VkDebugUtilsMessageSeverityFlagsEXT);
-    memcpy((VkDebugUtilsMessageTypeFlagsEXT*)&forUnmarshaling->messageType, *ptr, sizeof(VkDebugUtilsMessageTypeFlagsEXT));
+    memcpy((VkDebugUtilsMessageTypeFlagsEXT*)&forUnmarshaling->messageType, *ptr,
+           sizeof(VkDebugUtilsMessageTypeFlagsEXT));
     *ptr += sizeof(VkDebugUtilsMessageTypeFlagsEXT);
     memcpy((PFN_vkDebugUtilsMessengerCallbackEXT*)&forUnmarshaling->pfnUserCallback, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pfnUserCallback);
@@ -17144,24 +16963,20 @@
     memcpy((void**)&forUnmarshaling->pUserData, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pUserData);
     *ptr += 8;
-    if (forUnmarshaling->pUserData)
-    {
+    if (forUnmarshaling->pUserData) {
         vkStream->alloc((void**)&forUnmarshaling->pUserData, sizeof(uint8_t));
         memcpy((void*)forUnmarshaling->pUserData, *ptr, sizeof(uint8_t));
         *ptr += sizeof(uint8_t);
     }
 }
 
-void reservedunmarshal_VkDebugUtilsObjectTagInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDebugUtilsObjectTagInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDebugUtilsObjectTagInfoEXT(VulkanStream* vkStream,
+                                                    VkStructureType rootType,
+                                                    VkDebugUtilsObjectTagInfoEXT* forUnmarshaling,
+                                                    uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -17169,15 +16984,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkObjectType*)&forUnmarshaling->objectType, *ptr, sizeof(VkObjectType));
     *ptr += sizeof(VkObjectType);
@@ -17188,7 +17005,8 @@
     memcpy((size_t*)&forUnmarshaling->tagSize, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->tagSize);
     *ptr += 8;
-    vkStream->alloc((void**)&forUnmarshaling->pTag, forUnmarshaling->tagSize * sizeof(const uint8_t));
+    vkStream->alloc((void**)&forUnmarshaling->pTag,
+                    forUnmarshaling->tagSize * sizeof(const uint8_t));
     memcpy((void*)forUnmarshaling->pTag, *ptr, forUnmarshaling->tagSize * sizeof(const uint8_t));
     *ptr += forUnmarshaling->tagSize * sizeof(const uint8_t);
 }
@@ -17196,15 +17014,11 @@
 #endif
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
 void reservedunmarshal_VkAndroidHardwareBufferUsageANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAndroidHardwareBufferUsageANDROID* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAndroidHardwareBufferUsageANDROID* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -17212,30 +17026,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint64_t*)&forUnmarshaling->androidHardwareBufferUsage, *ptr, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
 }
 
 void reservedunmarshal_VkAndroidHardwareBufferPropertiesANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAndroidHardwareBufferPropertiesANDROID* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAndroidHardwareBufferPropertiesANDROID* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -17243,15 +17055,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkDeviceSize*)&forUnmarshaling->allocationSize, *ptr, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
@@ -17260,15 +17074,11 @@
 }
 
 void reservedunmarshal_VkAndroidHardwareBufferFormatPropertiesANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAndroidHardwareBufferFormatPropertiesANDROID* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAndroidHardwareBufferFormatPropertiesANDROID* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -17276,43 +17086,48 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkFormat*)&forUnmarshaling->format, *ptr, sizeof(VkFormat));
     *ptr += sizeof(VkFormat);
     memcpy((uint64_t*)&forUnmarshaling->externalFormat, *ptr, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
-    memcpy((VkFormatFeatureFlags*)&forUnmarshaling->formatFeatures, *ptr, sizeof(VkFormatFeatureFlags));
+    memcpy((VkFormatFeatureFlags*)&forUnmarshaling->formatFeatures, *ptr,
+           sizeof(VkFormatFeatureFlags));
     *ptr += sizeof(VkFormatFeatureFlags);
-    reservedunmarshal_VkComponentMapping(vkStream, rootType, (VkComponentMapping*)(&forUnmarshaling->samplerYcbcrConversionComponents), ptr);
-    memcpy((VkSamplerYcbcrModelConversion*)&forUnmarshaling->suggestedYcbcrModel, *ptr, sizeof(VkSamplerYcbcrModelConversion));
+    reservedunmarshal_VkComponentMapping(
+        vkStream, rootType,
+        (VkComponentMapping*)(&forUnmarshaling->samplerYcbcrConversionComponents), ptr);
+    memcpy((VkSamplerYcbcrModelConversion*)&forUnmarshaling->suggestedYcbcrModel, *ptr,
+           sizeof(VkSamplerYcbcrModelConversion));
     *ptr += sizeof(VkSamplerYcbcrModelConversion);
-    memcpy((VkSamplerYcbcrRange*)&forUnmarshaling->suggestedYcbcrRange, *ptr, sizeof(VkSamplerYcbcrRange));
+    memcpy((VkSamplerYcbcrRange*)&forUnmarshaling->suggestedYcbcrRange, *ptr,
+           sizeof(VkSamplerYcbcrRange));
     *ptr += sizeof(VkSamplerYcbcrRange);
-    memcpy((VkChromaLocation*)&forUnmarshaling->suggestedXChromaOffset, *ptr, sizeof(VkChromaLocation));
+    memcpy((VkChromaLocation*)&forUnmarshaling->suggestedXChromaOffset, *ptr,
+           sizeof(VkChromaLocation));
     *ptr += sizeof(VkChromaLocation);
-    memcpy((VkChromaLocation*)&forUnmarshaling->suggestedYChromaOffset, *ptr, sizeof(VkChromaLocation));
+    memcpy((VkChromaLocation*)&forUnmarshaling->suggestedYChromaOffset, *ptr,
+           sizeof(VkChromaLocation));
     *ptr += sizeof(VkChromaLocation);
 }
 
 void reservedunmarshal_VkImportAndroidHardwareBufferInfoANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportAndroidHardwareBufferInfoANDROID* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImportAndroidHardwareBufferInfoANDROID* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -17320,15 +17135,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     vkStream->alloc((void**)&forUnmarshaling->buffer, sizeof(AHardwareBuffer));
     memcpy((AHardwareBuffer*)forUnmarshaling->buffer, *ptr, sizeof(AHardwareBuffer));
@@ -17336,15 +17153,11 @@
 }
 
 void reservedunmarshal_VkMemoryGetAndroidHardwareBufferInfoANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryGetAndroidHardwareBufferInfoANDROID* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkMemoryGetAndroidHardwareBufferInfoANDROID* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -17352,32 +17165,31 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkDeviceMemory*)&forUnmarshaling->memory = (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_0));
+    *(VkDeviceMemory*)&forUnmarshaling->memory =
+        (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_0));
 }
 
-void reservedunmarshal_VkExternalFormatANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalFormatANDROID* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkExternalFormatANDROID(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkExternalFormatANDROID* forUnmarshaling,
+                                               uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -17385,30 +17197,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint64_t*)&forUnmarshaling->externalFormat, *ptr, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
 }
 
 void reservedunmarshal_VkAndroidHardwareBufferFormatProperties2ANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAndroidHardwareBufferFormatProperties2ANDROID* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAndroidHardwareBufferFormatProperties2ANDROID* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -17416,30 +17226,39 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkFormat*)&forUnmarshaling->format, *ptr, sizeof(VkFormat));
     *ptr += sizeof(VkFormat);
     memcpy((uint64_t*)&forUnmarshaling->externalFormat, *ptr, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
-    memcpy((VkFormatFeatureFlags2KHR*)&forUnmarshaling->formatFeatures, *ptr, sizeof(VkFormatFeatureFlags2KHR));
+    memcpy((VkFormatFeatureFlags2KHR*)&forUnmarshaling->formatFeatures, *ptr,
+           sizeof(VkFormatFeatureFlags2KHR));
     *ptr += sizeof(VkFormatFeatureFlags2KHR);
-    reservedunmarshal_VkComponentMapping(vkStream, rootType, (VkComponentMapping*)(&forUnmarshaling->samplerYcbcrConversionComponents), ptr);
-    memcpy((VkSamplerYcbcrModelConversion*)&forUnmarshaling->suggestedYcbcrModel, *ptr, sizeof(VkSamplerYcbcrModelConversion));
+    reservedunmarshal_VkComponentMapping(
+        vkStream, rootType,
+        (VkComponentMapping*)(&forUnmarshaling->samplerYcbcrConversionComponents), ptr);
+    memcpy((VkSamplerYcbcrModelConversion*)&forUnmarshaling->suggestedYcbcrModel, *ptr,
+           sizeof(VkSamplerYcbcrModelConversion));
     *ptr += sizeof(VkSamplerYcbcrModelConversion);
-    memcpy((VkSamplerYcbcrRange*)&forUnmarshaling->suggestedYcbcrRange, *ptr, sizeof(VkSamplerYcbcrRange));
+    memcpy((VkSamplerYcbcrRange*)&forUnmarshaling->suggestedYcbcrRange, *ptr,
+           sizeof(VkSamplerYcbcrRange));
     *ptr += sizeof(VkSamplerYcbcrRange);
-    memcpy((VkChromaLocation*)&forUnmarshaling->suggestedXChromaOffset, *ptr, sizeof(VkChromaLocation));
+    memcpy((VkChromaLocation*)&forUnmarshaling->suggestedXChromaOffset, *ptr,
+           sizeof(VkChromaLocation));
     *ptr += sizeof(VkChromaLocation);
-    memcpy((VkChromaLocation*)&forUnmarshaling->suggestedYChromaOffset, *ptr, sizeof(VkChromaLocation));
+    memcpy((VkChromaLocation*)&forUnmarshaling->suggestedYChromaOffset, *ptr,
+           sizeof(VkChromaLocation));
     *ptr += sizeof(VkChromaLocation);
 }
 
@@ -17454,15 +17273,11 @@
 #endif
 #ifdef VK_EXT_inline_uniform_block
 void reservedunmarshal_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceInlineUniformBlockFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceInlineUniformBlockFeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -17470,32 +17285,31 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->inlineUniformBlock, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->descriptorBindingInlineUniformBlockUpdateAfterBind, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->descriptorBindingInlineUniformBlockUpdateAfterBind, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceInlineUniformBlockPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceInlineUniformBlockPropertiesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -17503,38 +17317,40 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->maxInlineUniformBlockSize, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorInlineUniformBlocks, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorInlineUniformBlocks, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks,
+           *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetInlineUniformBlocks, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetInlineUniformBlocks, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindInlineUniformBlocks, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindInlineUniformBlocks, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
 void reservedunmarshal_VkWriteDescriptorSetInlineUniformBlockEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkWriteDescriptorSetInlineUniformBlockEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkWriteDescriptorSetInlineUniformBlockEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -17542,33 +17358,32 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->dataSize, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pData, forUnmarshaling->dataSize * sizeof(const uint8_t));
+    vkStream->alloc((void**)&forUnmarshaling->pData,
+                    forUnmarshaling->dataSize * sizeof(const uint8_t));
     memcpy((void*)forUnmarshaling->pData, *ptr, forUnmarshaling->dataSize * sizeof(const uint8_t));
     *ptr += forUnmarshaling->dataSize * sizeof(const uint8_t);
 }
 
 void reservedunmarshal_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorPoolInlineUniformBlockCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDescriptorPoolInlineUniformBlockCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -17576,15 +17391,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->maxInlineUniformBlockBindings, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -17594,28 +17411,20 @@
 #ifdef VK_EXT_shader_stencil_export
 #endif
 #ifdef VK_EXT_sample_locations
-void reservedunmarshal_VkSampleLocationEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSampleLocationEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkSampleLocationEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkSampleLocationEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((float*)&forUnmarshaling->x, *ptr, sizeof(float));
     *ptr += sizeof(float);
     memcpy((float*)&forUnmarshaling->y, *ptr, sizeof(float));
     *ptr += sizeof(float);
 }
 
-void reservedunmarshal_VkSampleLocationsInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSampleLocationsInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkSampleLocationsInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkSampleLocationsInfoEXT* forUnmarshaling,
+                                                uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -17623,60 +17432,59 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkSampleCountFlagBits*)&forUnmarshaling->sampleLocationsPerPixel, *ptr, sizeof(VkSampleCountFlagBits));
+    memcpy((VkSampleCountFlagBits*)&forUnmarshaling->sampleLocationsPerPixel, *ptr,
+           sizeof(VkSampleCountFlagBits));
     *ptr += sizeof(VkSampleCountFlagBits);
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->sampleLocationGridSize), ptr);
+    reservedunmarshal_VkExtent2D(vkStream, rootType,
+                                 (VkExtent2D*)(&forUnmarshaling->sampleLocationGridSize), ptr);
     memcpy((uint32_t*)&forUnmarshaling->sampleLocationsCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pSampleLocations, forUnmarshaling->sampleLocationsCount * sizeof(const VkSampleLocationEXT));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->sampleLocationsCount; ++i)
-    {
-        reservedunmarshal_VkSampleLocationEXT(vkStream, rootType, (VkSampleLocationEXT*)(forUnmarshaling->pSampleLocations + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pSampleLocations,
+                    forUnmarshaling->sampleLocationsCount * sizeof(const VkSampleLocationEXT));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->sampleLocationsCount; ++i) {
+        reservedunmarshal_VkSampleLocationEXT(
+            vkStream, rootType, (VkSampleLocationEXT*)(forUnmarshaling->pSampleLocations + i), ptr);
     }
 }
 
 void reservedunmarshal_VkAttachmentSampleLocationsEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAttachmentSampleLocationsEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAttachmentSampleLocationsEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((uint32_t*)&forUnmarshaling->attachmentIndex, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    reservedunmarshal_VkSampleLocationsInfoEXT(vkStream, rootType, (VkSampleLocationsInfoEXT*)(&forUnmarshaling->sampleLocationsInfo), ptr);
+    reservedunmarshal_VkSampleLocationsInfoEXT(
+        vkStream, rootType, (VkSampleLocationsInfoEXT*)(&forUnmarshaling->sampleLocationsInfo),
+        ptr);
 }
 
-void reservedunmarshal_VkSubpassSampleLocationsEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubpassSampleLocationsEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkSubpassSampleLocationsEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkSubpassSampleLocationsEXT* forUnmarshaling,
+                                                   uint8_t** ptr) {
     memcpy((uint32_t*)&forUnmarshaling->subpassIndex, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    reservedunmarshal_VkSampleLocationsInfoEXT(vkStream, rootType, (VkSampleLocationsInfoEXT*)(&forUnmarshaling->sampleLocationsInfo), ptr);
+    reservedunmarshal_VkSampleLocationsInfoEXT(
+        vkStream, rootType, (VkSampleLocationsInfoEXT*)(&forUnmarshaling->sampleLocationsInfo),
+        ptr);
 }
 
 void reservedunmarshal_VkRenderPassSampleLocationsBeginInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderPassSampleLocationsBeginInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkRenderPassSampleLocationsBeginInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -17684,42 +17492,50 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((uint32_t*)&forUnmarshaling->attachmentInitialSampleLocationsCount, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->attachmentInitialSampleLocationsCount, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pAttachmentInitialSampleLocations, forUnmarshaling->attachmentInitialSampleLocationsCount * sizeof(const VkAttachmentSampleLocationsEXT));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->attachmentInitialSampleLocationsCount; ++i)
-    {
-        reservedunmarshal_VkAttachmentSampleLocationsEXT(vkStream, rootType, (VkAttachmentSampleLocationsEXT*)(forUnmarshaling->pAttachmentInitialSampleLocations + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pAttachmentInitialSampleLocations,
+                    forUnmarshaling->attachmentInitialSampleLocationsCount *
+                        sizeof(const VkAttachmentSampleLocationsEXT));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->attachmentInitialSampleLocationsCount;
+         ++i) {
+        reservedunmarshal_VkAttachmentSampleLocationsEXT(
+            vkStream, rootType,
+            (VkAttachmentSampleLocationsEXT*)(forUnmarshaling->pAttachmentInitialSampleLocations +
+                                              i),
+            ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->postSubpassSampleLocationsCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pPostSubpassSampleLocations, forUnmarshaling->postSubpassSampleLocationsCount * sizeof(const VkSubpassSampleLocationsEXT));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->postSubpassSampleLocationsCount; ++i)
-    {
-        reservedunmarshal_VkSubpassSampleLocationsEXT(vkStream, rootType, (VkSubpassSampleLocationsEXT*)(forUnmarshaling->pPostSubpassSampleLocations + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pPostSubpassSampleLocations,
+                    forUnmarshaling->postSubpassSampleLocationsCount *
+                        sizeof(const VkSubpassSampleLocationsEXT));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->postSubpassSampleLocationsCount; ++i) {
+        reservedunmarshal_VkSubpassSampleLocationsEXT(
+            vkStream, rootType,
+            (VkSubpassSampleLocationsEXT*)(forUnmarshaling->pPostSubpassSampleLocations + i), ptr);
     }
 }
 
 void reservedunmarshal_VkPipelineSampleLocationsStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineSampleLocationsStateCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineSampleLocationsStateCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -17727,31 +17543,31 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->sampleLocationsEnable, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    reservedunmarshal_VkSampleLocationsInfoEXT(vkStream, rootType, (VkSampleLocationsInfoEXT*)(&forUnmarshaling->sampleLocationsInfo), ptr);
+    reservedunmarshal_VkSampleLocationsInfoEXT(
+        vkStream, rootType, (VkSampleLocationsInfoEXT*)(&forUnmarshaling->sampleLocationsInfo),
+        ptr);
 }
 
 void reservedunmarshal_VkPhysicalDeviceSampleLocationsPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSampleLocationsPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceSampleLocationsPropertiesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -17759,19 +17575,23 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkSampleCountFlags*)&forUnmarshaling->sampleLocationSampleCounts, *ptr, sizeof(VkSampleCountFlags));
+    memcpy((VkSampleCountFlags*)&forUnmarshaling->sampleLocationSampleCounts, *ptr,
+           sizeof(VkSampleCountFlags));
     *ptr += sizeof(VkSampleCountFlags);
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->maxSampleLocationGridSize), ptr);
+    reservedunmarshal_VkExtent2D(vkStream, rootType,
+                                 (VkExtent2D*)(&forUnmarshaling->maxSampleLocationGridSize), ptr);
     memcpy((float*)forUnmarshaling->sampleLocationCoordinateRange, *ptr, 2 * sizeof(float));
     *ptr += 2 * sizeof(float);
     memcpy((uint32_t*)&forUnmarshaling->sampleLocationSubPixelBits, *ptr, sizeof(uint32_t));
@@ -17780,16 +17600,12 @@
     *ptr += sizeof(VkBool32);
 }
 
-void reservedunmarshal_VkMultisamplePropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMultisamplePropertiesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkMultisamplePropertiesEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                  VkMultisamplePropertiesEXT* forUnmarshaling,
+                                                  uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -17797,31 +17613,30 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->maxSampleLocationGridSize), ptr);
+    reservedunmarshal_VkExtent2D(vkStream, rootType,
+                                 (VkExtent2D*)(&forUnmarshaling->maxSampleLocationGridSize), ptr);
 }
 
 #endif
 #ifdef VK_EXT_blend_operation_advanced
 void reservedunmarshal_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -17829,30 +17644,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->advancedBlendCoherentOperations, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -17860,23 +17673,27 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->advancedBlendMaxColorAttachments, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((VkBool32*)&forUnmarshaling->advancedBlendIndependentBlend, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->advancedBlendNonPremultipliedSrcColor, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->advancedBlendNonPremultipliedSrcColor, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->advancedBlendNonPremultipliedDstColor, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->advancedBlendNonPremultipliedDstColor, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy((VkBool32*)&forUnmarshaling->advancedBlendCorrelatedOverlap, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -17885,15 +17702,11 @@
 }
 
 void reservedunmarshal_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineColorBlendAdvancedStateCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineColorBlendAdvancedStateCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -17901,15 +17714,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->srcPremultiplied, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -17922,15 +17737,11 @@
 #endif
 #ifdef VK_NV_fragment_coverage_to_color
 void reservedunmarshal_VkPipelineCoverageToColorStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineCoverageToColorStateCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineCoverageToColorStateCreateInfoNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -17938,17 +17749,20 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkPipelineCoverageToColorStateCreateFlagsNV*)&forUnmarshaling->flags, *ptr, sizeof(VkPipelineCoverageToColorStateCreateFlagsNV));
+    memcpy((VkPipelineCoverageToColorStateCreateFlagsNV*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkPipelineCoverageToColorStateCreateFlagsNV));
     *ptr += sizeof(VkPipelineCoverageToColorStateCreateFlagsNV);
     memcpy((VkBool32*)&forUnmarshaling->coverageToColorEnable, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -17959,15 +17773,11 @@
 #endif
 #ifdef VK_NV_framebuffer_mixed_samples
 void reservedunmarshal_VkPipelineCoverageModulationStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineCoverageModulationStateCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineCoverageModulationStateCreateInfoNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -17975,19 +17785,23 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkPipelineCoverageModulationStateCreateFlagsNV*)&forUnmarshaling->flags, *ptr, sizeof(VkPipelineCoverageModulationStateCreateFlagsNV));
+    memcpy((VkPipelineCoverageModulationStateCreateFlagsNV*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkPipelineCoverageModulationStateCreateFlagsNV));
     *ptr += sizeof(VkPipelineCoverageModulationStateCreateFlagsNV);
-    memcpy((VkCoverageModulationModeNV*)&forUnmarshaling->coverageModulationMode, *ptr, sizeof(VkCoverageModulationModeNV));
+    memcpy((VkCoverageModulationModeNV*)&forUnmarshaling->coverageModulationMode, *ptr,
+           sizeof(VkCoverageModulationModeNV));
     *ptr += sizeof(VkCoverageModulationModeNV);
     memcpy((VkBool32*)&forUnmarshaling->coverageModulationTableEnable, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -17997,10 +17811,11 @@
     memcpy((float**)&forUnmarshaling->pCoverageModulationTable, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pCoverageModulationTable);
     *ptr += 8;
-    if (forUnmarshaling->pCoverageModulationTable)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pCoverageModulationTable, forUnmarshaling->coverageModulationTableCount * sizeof(const float));
-        memcpy((float*)forUnmarshaling->pCoverageModulationTable, *ptr, forUnmarshaling->coverageModulationTableCount * sizeof(const float));
+    if (forUnmarshaling->pCoverageModulationTable) {
+        vkStream->alloc((void**)&forUnmarshaling->pCoverageModulationTable,
+                        forUnmarshaling->coverageModulationTableCount * sizeof(const float));
+        memcpy((float*)forUnmarshaling->pCoverageModulationTable, *ptr,
+               forUnmarshaling->coverageModulationTableCount * sizeof(const float));
         *ptr += forUnmarshaling->coverageModulationTableCount * sizeof(const float);
     }
 }
@@ -18010,15 +17825,11 @@
 #endif
 #ifdef VK_NV_shader_sm_builtins
 void reservedunmarshal_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -18026,15 +17837,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->shaderSMCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -18043,15 +17856,11 @@
 }
 
 void reservedunmarshal_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -18059,15 +17868,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->shaderSMBuiltins, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -18078,29 +17889,23 @@
 #endif
 #ifdef VK_EXT_image_drm_format_modifier
 void reservedunmarshal_VkDrmFormatModifierPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDrmFormatModifierPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDrmFormatModifierPropertiesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((uint64_t*)&forUnmarshaling->drmFormatModifier, *ptr, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
     memcpy((uint32_t*)&forUnmarshaling->drmFormatModifierPlaneCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((VkFormatFeatureFlags*)&forUnmarshaling->drmFormatModifierTilingFeatures, *ptr, sizeof(VkFormatFeatureFlags));
+    memcpy((VkFormatFeatureFlags*)&forUnmarshaling->drmFormatModifierTilingFeatures, *ptr,
+           sizeof(VkFormatFeatureFlags));
     *ptr += sizeof(VkFormatFeatureFlags);
 }
 
 void reservedunmarshal_VkDrmFormatModifierPropertiesListEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDrmFormatModifierPropertiesListEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDrmFormatModifierPropertiesListEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -18108,42 +17913,45 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->drmFormatModifierCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     // WARNING PTR CHECK
-    memcpy((VkDrmFormatModifierPropertiesEXT**)&forUnmarshaling->pDrmFormatModifierProperties, (*ptr), 8);
+    memcpy((VkDrmFormatModifierPropertiesEXT**)&forUnmarshaling->pDrmFormatModifierProperties,
+           (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pDrmFormatModifierProperties);
     *ptr += 8;
-    if (forUnmarshaling->pDrmFormatModifierProperties)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pDrmFormatModifierProperties, forUnmarshaling->drmFormatModifierCount * sizeof(VkDrmFormatModifierPropertiesEXT));
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->drmFormatModifierCount; ++i)
-        {
-            reservedunmarshal_VkDrmFormatModifierPropertiesEXT(vkStream, rootType, (VkDrmFormatModifierPropertiesEXT*)(forUnmarshaling->pDrmFormatModifierProperties + i), ptr);
+    if (forUnmarshaling->pDrmFormatModifierProperties) {
+        vkStream->alloc(
+            (void**)&forUnmarshaling->pDrmFormatModifierProperties,
+            forUnmarshaling->drmFormatModifierCount * sizeof(VkDrmFormatModifierPropertiesEXT));
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->drmFormatModifierCount; ++i) {
+            reservedunmarshal_VkDrmFormatModifierPropertiesEXT(
+                vkStream, rootType,
+                (VkDrmFormatModifierPropertiesEXT*)(forUnmarshaling->pDrmFormatModifierProperties +
+                                                    i),
+                ptr);
         }
     }
 }
 
 void reservedunmarshal_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceImageDrmFormatModifierInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceImageDrmFormatModifierInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -18151,15 +17959,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint64_t*)&forUnmarshaling->drmFormatModifier, *ptr, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
@@ -18171,24 +17981,21 @@
     memcpy((uint32_t**)&forUnmarshaling->pQueueFamilyIndices, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pQueueFamilyIndices);
     *ptr += 8;
-    if (forUnmarshaling->pQueueFamilyIndices)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pQueueFamilyIndices, forUnmarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
-        memcpy((uint32_t*)forUnmarshaling->pQueueFamilyIndices, *ptr, forUnmarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
+    if (forUnmarshaling->pQueueFamilyIndices) {
+        vkStream->alloc((void**)&forUnmarshaling->pQueueFamilyIndices,
+                        forUnmarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
+        memcpy((uint32_t*)forUnmarshaling->pQueueFamilyIndices, *ptr,
+               forUnmarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
         *ptr += forUnmarshaling->queueFamilyIndexCount * sizeof(const uint32_t);
     }
 }
 
 void reservedunmarshal_VkImageDrmFormatModifierListCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageDrmFormatModifierListCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImageDrmFormatModifierListCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -18196,33 +18003,33 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->drmFormatModifierCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pDrmFormatModifiers, forUnmarshaling->drmFormatModifierCount * sizeof(const uint64_t));
-    memcpy((uint64_t*)forUnmarshaling->pDrmFormatModifiers, *ptr, forUnmarshaling->drmFormatModifierCount * sizeof(const uint64_t));
+    vkStream->alloc((void**)&forUnmarshaling->pDrmFormatModifiers,
+                    forUnmarshaling->drmFormatModifierCount * sizeof(const uint64_t));
+    memcpy((uint64_t*)forUnmarshaling->pDrmFormatModifiers, *ptr,
+           forUnmarshaling->drmFormatModifierCount * sizeof(const uint64_t));
     *ptr += forUnmarshaling->drmFormatModifierCount * sizeof(const uint64_t);
 }
 
 void reservedunmarshal_VkImageDrmFormatModifierExplicitCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageDrmFormatModifierExplicitCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImageDrmFormatModifierExplicitCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -18230,37 +18037,37 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint64_t*)&forUnmarshaling->drmFormatModifier, *ptr, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
     memcpy((uint32_t*)&forUnmarshaling->drmFormatModifierPlaneCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pPlaneLayouts, forUnmarshaling->drmFormatModifierPlaneCount * sizeof(const VkSubresourceLayout));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->drmFormatModifierPlaneCount; ++i)
-    {
-        reservedunmarshal_VkSubresourceLayout(vkStream, rootType, (VkSubresourceLayout*)(forUnmarshaling->pPlaneLayouts + i), ptr);
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pPlaneLayouts,
+        forUnmarshaling->drmFormatModifierPlaneCount * sizeof(const VkSubresourceLayout));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->drmFormatModifierPlaneCount; ++i) {
+        reservedunmarshal_VkSubresourceLayout(
+            vkStream, rootType, (VkSubresourceLayout*)(forUnmarshaling->pPlaneLayouts + i), ptr);
     }
 }
 
 void reservedunmarshal_VkImageDrmFormatModifierPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageDrmFormatModifierPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImageDrmFormatModifierPropertiesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -18268,44 +18075,40 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint64_t*)&forUnmarshaling->drmFormatModifier, *ptr, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
 }
 
 void reservedunmarshal_VkDrmFormatModifierProperties2EXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDrmFormatModifierProperties2EXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDrmFormatModifierProperties2EXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((uint64_t*)&forUnmarshaling->drmFormatModifier, *ptr, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
     memcpy((uint32_t*)&forUnmarshaling->drmFormatModifierPlaneCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((VkFormatFeatureFlags2KHR*)&forUnmarshaling->drmFormatModifierTilingFeatures, *ptr, sizeof(VkFormatFeatureFlags2KHR));
+    memcpy((VkFormatFeatureFlags2KHR*)&forUnmarshaling->drmFormatModifierTilingFeatures, *ptr,
+           sizeof(VkFormatFeatureFlags2KHR));
     *ptr += sizeof(VkFormatFeatureFlags2KHR);
 }
 
 void reservedunmarshal_VkDrmFormatModifierPropertiesList2EXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDrmFormatModifierPropertiesList2EXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDrmFormatModifierPropertiesList2EXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -18313,28 +18116,35 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->drmFormatModifierCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     // WARNING PTR CHECK
-    memcpy((VkDrmFormatModifierProperties2EXT**)&forUnmarshaling->pDrmFormatModifierProperties, (*ptr), 8);
+    memcpy((VkDrmFormatModifierProperties2EXT**)&forUnmarshaling->pDrmFormatModifierProperties,
+           (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pDrmFormatModifierProperties);
     *ptr += 8;
-    if (forUnmarshaling->pDrmFormatModifierProperties)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pDrmFormatModifierProperties, forUnmarshaling->drmFormatModifierCount * sizeof(VkDrmFormatModifierProperties2EXT));
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->drmFormatModifierCount; ++i)
-        {
-            reservedunmarshal_VkDrmFormatModifierProperties2EXT(vkStream, rootType, (VkDrmFormatModifierProperties2EXT*)(forUnmarshaling->pDrmFormatModifierProperties + i), ptr);
+    if (forUnmarshaling->pDrmFormatModifierProperties) {
+        vkStream->alloc(
+            (void**)&forUnmarshaling->pDrmFormatModifierProperties,
+            forUnmarshaling->drmFormatModifierCount * sizeof(VkDrmFormatModifierProperties2EXT));
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->drmFormatModifierCount; ++i) {
+            reservedunmarshal_VkDrmFormatModifierProperties2EXT(
+                vkStream, rootType,
+                (VkDrmFormatModifierProperties2EXT*)(forUnmarshaling->pDrmFormatModifierProperties +
+                                                     i),
+                ptr);
         }
     }
 }
@@ -18342,15 +18152,11 @@
 #endif
 #ifdef VK_EXT_validation_cache
 void reservedunmarshal_VkValidationCacheCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkValidationCacheCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkValidationCacheCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -18358,36 +18164,37 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkValidationCacheCreateFlagsEXT*)&forUnmarshaling->flags, *ptr, sizeof(VkValidationCacheCreateFlagsEXT));
+    memcpy((VkValidationCacheCreateFlagsEXT*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkValidationCacheCreateFlagsEXT));
     *ptr += sizeof(VkValidationCacheCreateFlagsEXT);
     memcpy((size_t*)&forUnmarshaling->initialDataSize, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->initialDataSize);
     *ptr += 8;
-    vkStream->alloc((void**)&forUnmarshaling->pInitialData, forUnmarshaling->initialDataSize * sizeof(const uint8_t));
-    memcpy((void*)forUnmarshaling->pInitialData, *ptr, forUnmarshaling->initialDataSize * sizeof(const uint8_t));
+    vkStream->alloc((void**)&forUnmarshaling->pInitialData,
+                    forUnmarshaling->initialDataSize * sizeof(const uint8_t));
+    memcpy((void*)forUnmarshaling->pInitialData, *ptr,
+           forUnmarshaling->initialDataSize * sizeof(const uint8_t));
     *ptr += forUnmarshaling->initialDataSize * sizeof(const uint8_t);
 }
 
 void reservedunmarshal_VkShaderModuleValidationCacheCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkShaderModuleValidationCacheCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkShaderModuleValidationCacheCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -18395,20 +18202,23 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkValidationCacheEXT*)&forUnmarshaling->validationCache = (VkValidationCacheEXT)unbox_VkValidationCacheEXT((VkValidationCacheEXT)(*&cgen_var_0));
+    *(VkValidationCacheEXT*)&forUnmarshaling->validationCache =
+        (VkValidationCacheEXT)unbox_VkValidationCacheEXT((VkValidationCacheEXT)(*&cgen_var_0));
 }
 
 #endif
@@ -18417,29 +18227,27 @@
 #ifdef VK_EXT_shader_viewport_index_layer
 #endif
 #ifdef VK_NV_shading_rate_image
-void reservedunmarshal_VkShadingRatePaletteNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkShadingRatePaletteNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkShadingRatePaletteNV(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkShadingRatePaletteNV* forUnmarshaling,
+                                              uint8_t** ptr) {
     memcpy((uint32_t*)&forUnmarshaling->shadingRatePaletteEntryCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pShadingRatePaletteEntries, forUnmarshaling->shadingRatePaletteEntryCount * sizeof(const VkShadingRatePaletteEntryNV));
-    memcpy((VkShadingRatePaletteEntryNV*)forUnmarshaling->pShadingRatePaletteEntries, *ptr, forUnmarshaling->shadingRatePaletteEntryCount * sizeof(const VkShadingRatePaletteEntryNV));
-    *ptr += forUnmarshaling->shadingRatePaletteEntryCount * sizeof(const VkShadingRatePaletteEntryNV);
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pShadingRatePaletteEntries,
+        forUnmarshaling->shadingRatePaletteEntryCount * sizeof(const VkShadingRatePaletteEntryNV));
+    memcpy(
+        (VkShadingRatePaletteEntryNV*)forUnmarshaling->pShadingRatePaletteEntries, *ptr,
+        forUnmarshaling->shadingRatePaletteEntryCount * sizeof(const VkShadingRatePaletteEntryNV));
+    *ptr +=
+        forUnmarshaling->shadingRatePaletteEntryCount * sizeof(const VkShadingRatePaletteEntryNV);
 }
 
 void reservedunmarshal_VkPipelineViewportShadingRateImageStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineViewportShadingRateImageStateCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineViewportShadingRateImageStateCreateInfoNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -18447,15 +18255,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->shadingRateImageEnable, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -18465,26 +18275,23 @@
     memcpy((VkShadingRatePaletteNV**)&forUnmarshaling->pShadingRatePalettes, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pShadingRatePalettes);
     *ptr += 8;
-    if (forUnmarshaling->pShadingRatePalettes)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pShadingRatePalettes, forUnmarshaling->viewportCount * sizeof(const VkShadingRatePaletteNV));
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->viewportCount; ++i)
-        {
-            reservedunmarshal_VkShadingRatePaletteNV(vkStream, rootType, (VkShadingRatePaletteNV*)(forUnmarshaling->pShadingRatePalettes + i), ptr);
+    if (forUnmarshaling->pShadingRatePalettes) {
+        vkStream->alloc((void**)&forUnmarshaling->pShadingRatePalettes,
+                        forUnmarshaling->viewportCount * sizeof(const VkShadingRatePaletteNV));
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->viewportCount; ++i) {
+            reservedunmarshal_VkShadingRatePaletteNV(
+                vkStream, rootType,
+                (VkShadingRatePaletteNV*)(forUnmarshaling->pShadingRatePalettes + i), ptr);
         }
     }
 }
 
 void reservedunmarshal_VkPhysicalDeviceShadingRateImageFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShadingRateImageFeaturesNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShadingRateImageFeaturesNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -18492,15 +18299,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->shadingRateImage, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -18509,15 +18318,11 @@
 }
 
 void reservedunmarshal_VkPhysicalDeviceShadingRateImagePropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShadingRateImagePropertiesNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShadingRateImagePropertiesNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -18525,29 +18330,29 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->shadingRateTexelSize), ptr);
+    reservedunmarshal_VkExtent2D(vkStream, rootType,
+                                 (VkExtent2D*)(&forUnmarshaling->shadingRateTexelSize), ptr);
     memcpy((uint32_t*)&forUnmarshaling->shadingRatePaletteSize, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->shadingRateMaxCoarseSamples, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkCoarseSampleLocationNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCoarseSampleLocationNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkCoarseSampleLocationNV(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkCoarseSampleLocationNV* forUnmarshaling,
+                                                uint8_t** ptr) {
     memcpy((uint32_t*)&forUnmarshaling->pixelX, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->pixelY, *ptr, sizeof(uint32_t));
@@ -18556,35 +18361,31 @@
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkCoarseSampleOrderCustomNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCoarseSampleOrderCustomNV* forUnmarshaling,
-    uint8_t** ptr)
-{
-    memcpy((VkShadingRatePaletteEntryNV*)&forUnmarshaling->shadingRate, *ptr, sizeof(VkShadingRatePaletteEntryNV));
+void reservedunmarshal_VkCoarseSampleOrderCustomNV(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkCoarseSampleOrderCustomNV* forUnmarshaling,
+                                                   uint8_t** ptr) {
+    memcpy((VkShadingRatePaletteEntryNV*)&forUnmarshaling->shadingRate, *ptr,
+           sizeof(VkShadingRatePaletteEntryNV));
     *ptr += sizeof(VkShadingRatePaletteEntryNV);
     memcpy((uint32_t*)&forUnmarshaling->sampleCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->sampleLocationCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pSampleLocations, forUnmarshaling->sampleLocationCount * sizeof(const VkCoarseSampleLocationNV));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->sampleLocationCount; ++i)
-    {
-        reservedunmarshal_VkCoarseSampleLocationNV(vkStream, rootType, (VkCoarseSampleLocationNV*)(forUnmarshaling->pSampleLocations + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pSampleLocations,
+                    forUnmarshaling->sampleLocationCount * sizeof(const VkCoarseSampleLocationNV));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->sampleLocationCount; ++i) {
+        reservedunmarshal_VkCoarseSampleLocationNV(
+            vkStream, rootType, (VkCoarseSampleLocationNV*)(forUnmarshaling->pSampleLocations + i),
+            ptr);
     }
 }
 
 void reservedunmarshal_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -18592,39 +18393,41 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkCoarseSampleOrderTypeNV*)&forUnmarshaling->sampleOrderType, *ptr, sizeof(VkCoarseSampleOrderTypeNV));
+    memcpy((VkCoarseSampleOrderTypeNV*)&forUnmarshaling->sampleOrderType, *ptr,
+           sizeof(VkCoarseSampleOrderTypeNV));
     *ptr += sizeof(VkCoarseSampleOrderTypeNV);
     memcpy((uint32_t*)&forUnmarshaling->customSampleOrderCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pCustomSampleOrders, forUnmarshaling->customSampleOrderCount * sizeof(const VkCoarseSampleOrderCustomNV));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->customSampleOrderCount; ++i)
-    {
-        reservedunmarshal_VkCoarseSampleOrderCustomNV(vkStream, rootType, (VkCoarseSampleOrderCustomNV*)(forUnmarshaling->pCustomSampleOrders + i), ptr);
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pCustomSampleOrders,
+        forUnmarshaling->customSampleOrderCount * sizeof(const VkCoarseSampleOrderCustomNV));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->customSampleOrderCount; ++i) {
+        reservedunmarshal_VkCoarseSampleOrderCustomNV(
+            vkStream, rootType,
+            (VkCoarseSampleOrderCustomNV*)(forUnmarshaling->pCustomSampleOrders + i), ptr);
     }
 }
 
 #endif
 #ifdef VK_NV_ray_tracing
 void reservedunmarshal_VkRayTracingShaderGroupCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRayTracingShaderGroupCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkRayTracingShaderGroupCreateInfoNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -18632,17 +18435,20 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkRayTracingShaderGroupTypeKHR*)&forUnmarshaling->type, *ptr, sizeof(VkRayTracingShaderGroupTypeKHR));
+    memcpy((VkRayTracingShaderGroupTypeKHR*)&forUnmarshaling->type, *ptr,
+           sizeof(VkRayTracingShaderGroupTypeKHR));
     *ptr += sizeof(VkRayTracingShaderGroupTypeKHR);
     memcpy((uint32_t*)&forUnmarshaling->generalShader, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -18655,15 +18461,11 @@
 }
 
 void reservedunmarshal_VkRayTracingPipelineCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRayTracingPipelineCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkRayTracingPipelineCreateInfoNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -18671,56 +18473,61 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkPipelineCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkPipelineCreateFlags));
     *ptr += sizeof(VkPipelineCreateFlags);
     memcpy((uint32_t*)&forUnmarshaling->stageCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pStages, forUnmarshaling->stageCount * sizeof(const VkPipelineShaderStageCreateInfo));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->stageCount; ++i)
-    {
-        reservedunmarshal_VkPipelineShaderStageCreateInfo(vkStream, rootType, (VkPipelineShaderStageCreateInfo*)(forUnmarshaling->pStages + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pStages,
+                    forUnmarshaling->stageCount * sizeof(const VkPipelineShaderStageCreateInfo));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->stageCount; ++i) {
+        reservedunmarshal_VkPipelineShaderStageCreateInfo(
+            vkStream, rootType, (VkPipelineShaderStageCreateInfo*)(forUnmarshaling->pStages + i),
+            ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->groupCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pGroups, forUnmarshaling->groupCount * sizeof(const VkRayTracingShaderGroupCreateInfoNV));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->groupCount; ++i)
-    {
-        reservedunmarshal_VkRayTracingShaderGroupCreateInfoNV(vkStream, rootType, (VkRayTracingShaderGroupCreateInfoNV*)(forUnmarshaling->pGroups + i), ptr);
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pGroups,
+        forUnmarshaling->groupCount * sizeof(const VkRayTracingShaderGroupCreateInfoNV));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->groupCount; ++i) {
+        reservedunmarshal_VkRayTracingShaderGroupCreateInfoNV(
+            vkStream, rootType,
+            (VkRayTracingShaderGroupCreateInfoNV*)(forUnmarshaling->pGroups + i), ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->maxRecursionDepth, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkPipelineLayout*)&forUnmarshaling->layout = (VkPipelineLayout)unbox_VkPipelineLayout((VkPipelineLayout)(*&cgen_var_0));
+    *(VkPipelineLayout*)&forUnmarshaling->layout =
+        (VkPipelineLayout)unbox_VkPipelineLayout((VkPipelineLayout)(*&cgen_var_0));
     uint64_t cgen_var_1;
     memcpy((uint64_t*)&cgen_var_1, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkPipeline*)&forUnmarshaling->basePipelineHandle = (VkPipeline)unbox_VkPipeline((VkPipeline)(*&cgen_var_1));
+    *(VkPipeline*)&forUnmarshaling->basePipelineHandle =
+        (VkPipeline)unbox_VkPipeline((VkPipeline)(*&cgen_var_1));
     memcpy((int32_t*)&forUnmarshaling->basePipelineIndex, *ptr, sizeof(int32_t));
     *ptr += sizeof(int32_t);
 }
 
-void reservedunmarshal_VkGeometryTrianglesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkGeometryTrianglesNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkGeometryTrianglesNV(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkGeometryTrianglesNV* forUnmarshaling,
+                                             uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -18728,15 +18535,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
@@ -18763,21 +18572,17 @@
     uint64_t cgen_var_2;
     memcpy((uint64_t*)&cgen_var_2, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkBuffer*)&forUnmarshaling->transformData = (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_2));
+    *(VkBuffer*)&forUnmarshaling->transformData =
+        (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_2));
     memcpy((VkDeviceSize*)&forUnmarshaling->transformOffset, *ptr, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
 }
 
-void reservedunmarshal_VkGeometryAABBNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkGeometryAABBNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkGeometryAABBNV(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkGeometryAABBNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -18785,15 +18590,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
@@ -18807,26 +18614,19 @@
     *ptr += sizeof(VkDeviceSize);
 }
 
-void reservedunmarshal_VkGeometryDataNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkGeometryDataNV* forUnmarshaling,
-    uint8_t** ptr)
-{
-    reservedunmarshal_VkGeometryTrianglesNV(vkStream, rootType, (VkGeometryTrianglesNV*)(&forUnmarshaling->triangles), ptr);
-    reservedunmarshal_VkGeometryAABBNV(vkStream, rootType, (VkGeometryAABBNV*)(&forUnmarshaling->aabbs), ptr);
+void reservedunmarshal_VkGeometryDataNV(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkGeometryDataNV* forUnmarshaling, uint8_t** ptr) {
+    reservedunmarshal_VkGeometryTrianglesNV(
+        vkStream, rootType, (VkGeometryTrianglesNV*)(&forUnmarshaling->triangles), ptr);
+    reservedunmarshal_VkGeometryAABBNV(vkStream, rootType,
+                                       (VkGeometryAABBNV*)(&forUnmarshaling->aabbs), ptr);
 }
 
-void reservedunmarshal_VkGeometryNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkGeometryNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkGeometryNV(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkGeometryNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -18834,33 +18634,33 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkGeometryTypeKHR*)&forUnmarshaling->geometryType, *ptr, sizeof(VkGeometryTypeKHR));
     *ptr += sizeof(VkGeometryTypeKHR);
-    reservedunmarshal_VkGeometryDataNV(vkStream, rootType, (VkGeometryDataNV*)(&forUnmarshaling->geometry), ptr);
+    reservedunmarshal_VkGeometryDataNV(vkStream, rootType,
+                                       (VkGeometryDataNV*)(&forUnmarshaling->geometry), ptr);
     memcpy((VkGeometryFlagsKHR*)&forUnmarshaling->flags, *ptr, sizeof(VkGeometryFlagsKHR));
     *ptr += sizeof(VkGeometryFlagsKHR);
 }
 
-void reservedunmarshal_VkAccelerationStructureInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureInfoNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkAccelerationStructureInfoNV(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkAccelerationStructureInfoNV* forUnmarshaling,
+                                                     uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -18868,41 +18668,42 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkAccelerationStructureTypeNV*)&forUnmarshaling->type, *ptr, sizeof(VkAccelerationStructureTypeNV));
+    memcpy((VkAccelerationStructureTypeNV*)&forUnmarshaling->type, *ptr,
+           sizeof(VkAccelerationStructureTypeNV));
     *ptr += sizeof(VkAccelerationStructureTypeNV);
-    memcpy((VkBuildAccelerationStructureFlagsNV*)&forUnmarshaling->flags, *ptr, sizeof(VkBuildAccelerationStructureFlagsNV));
+    memcpy((VkBuildAccelerationStructureFlagsNV*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkBuildAccelerationStructureFlagsNV));
     *ptr += sizeof(VkBuildAccelerationStructureFlagsNV);
     memcpy((uint32_t*)&forUnmarshaling->instanceCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->geometryCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pGeometries, forUnmarshaling->geometryCount * sizeof(const VkGeometryNV));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->geometryCount; ++i)
-    {
-        reservedunmarshal_VkGeometryNV(vkStream, rootType, (VkGeometryNV*)(forUnmarshaling->pGeometries + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pGeometries,
+                    forUnmarshaling->geometryCount * sizeof(const VkGeometryNV));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->geometryCount; ++i) {
+        reservedunmarshal_VkGeometryNV(vkStream, rootType,
+                                       (VkGeometryNV*)(forUnmarshaling->pGeometries + i), ptr);
     }
 }
 
 void reservedunmarshal_VkAccelerationStructureCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureCreateInfoNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -18910,31 +18711,30 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkDeviceSize*)&forUnmarshaling->compactedSize, *ptr, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
-    reservedunmarshal_VkAccelerationStructureInfoNV(vkStream, rootType, (VkAccelerationStructureInfoNV*)(&forUnmarshaling->info), ptr);
+    reservedunmarshal_VkAccelerationStructureInfoNV(
+        vkStream, rootType, (VkAccelerationStructureInfoNV*)(&forUnmarshaling->info), ptr);
 }
 
 void reservedunmarshal_VkBindAccelerationStructureMemoryInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindAccelerationStructureMemoryInfoNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBindAccelerationStructureMemoryInfoNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -18942,43 +18742,46 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkAccelerationStructureNV*)&forUnmarshaling->accelerationStructure = (VkAccelerationStructureNV)unbox_VkAccelerationStructureNV((VkAccelerationStructureNV)(*&cgen_var_0));
+    *(VkAccelerationStructureNV*)&forUnmarshaling->accelerationStructure =
+        (VkAccelerationStructureNV)unbox_VkAccelerationStructureNV(
+            (VkAccelerationStructureNV)(*&cgen_var_0));
     uint64_t cgen_var_1;
     memcpy((uint64_t*)&cgen_var_1, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkDeviceMemory*)&forUnmarshaling->memory = (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_1));
+    *(VkDeviceMemory*)&forUnmarshaling->memory =
+        (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_1));
     memcpy((VkDeviceSize*)&forUnmarshaling->memoryOffset, *ptr, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
     memcpy((uint32_t*)&forUnmarshaling->deviceIndexCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pDeviceIndices, forUnmarshaling->deviceIndexCount * sizeof(const uint32_t));
-    memcpy((uint32_t*)forUnmarshaling->pDeviceIndices, *ptr, forUnmarshaling->deviceIndexCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pDeviceIndices,
+                    forUnmarshaling->deviceIndexCount * sizeof(const uint32_t));
+    memcpy((uint32_t*)forUnmarshaling->pDeviceIndices, *ptr,
+           forUnmarshaling->deviceIndexCount * sizeof(const uint32_t));
     *ptr += forUnmarshaling->deviceIndexCount * sizeof(const uint32_t);
 }
 
 void reservedunmarshal_VkWriteDescriptorSetAccelerationStructureNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkWriteDescriptorSetAccelerationStructureNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkWriteDescriptorSetAccelerationStructureNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -18986,15 +18789,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->accelerationStructureCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -19002,19 +18807,20 @@
     memcpy((VkAccelerationStructureNV**)&forUnmarshaling->pAccelerationStructures, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pAccelerationStructures);
     *ptr += 8;
-    if (forUnmarshaling->pAccelerationStructures)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pAccelerationStructures, forUnmarshaling->accelerationStructureCount * sizeof(const VkAccelerationStructureNV));
-        if (forUnmarshaling->accelerationStructureCount)
-        {
+    if (forUnmarshaling->pAccelerationStructures) {
+        vkStream->alloc(
+            (void**)&forUnmarshaling->pAccelerationStructures,
+            forUnmarshaling->accelerationStructureCount * sizeof(const VkAccelerationStructureNV));
+        if (forUnmarshaling->accelerationStructureCount) {
             uint8_t* cgen_var_0_0_ptr = (uint8_t*)(*ptr);
             *ptr += 8 * forUnmarshaling->accelerationStructureCount;
-            if (forUnmarshaling)
-            {
-                for (uint32_t k = 0; k < forUnmarshaling->accelerationStructureCount; ++k)
-                {
-                    uint64_t tmpval; memcpy(&tmpval, cgen_var_0_0_ptr + k * 8, sizeof(uint64_t));
-                    *(((VkAccelerationStructureNV*)forUnmarshaling->pAccelerationStructures) + k) = (VkAccelerationStructureNV)unbox_VkAccelerationStructureNV((VkAccelerationStructureNV)tmpval);
+            if (forUnmarshaling) {
+                for (uint32_t k = 0; k < forUnmarshaling->accelerationStructureCount; ++k) {
+                    uint64_t tmpval;
+                    memcpy(&tmpval, cgen_var_0_0_ptr + k * 8, sizeof(uint64_t));
+                    *(((VkAccelerationStructureNV*)forUnmarshaling->pAccelerationStructures) + k) =
+                        (VkAccelerationStructureNV)unbox_VkAccelerationStructureNV(
+                            (VkAccelerationStructureNV)tmpval);
                 }
             }
         }
@@ -19022,15 +18828,11 @@
 }
 
 void reservedunmarshal_VkAccelerationStructureMemoryRequirementsInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureMemoryRequirementsInfoNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureMemoryRequirementsInfoNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -19038,34 +18840,35 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkAccelerationStructureMemoryRequirementsTypeNV*)&forUnmarshaling->type, *ptr, sizeof(VkAccelerationStructureMemoryRequirementsTypeNV));
+    memcpy((VkAccelerationStructureMemoryRequirementsTypeNV*)&forUnmarshaling->type, *ptr,
+           sizeof(VkAccelerationStructureMemoryRequirementsTypeNV));
     *ptr += sizeof(VkAccelerationStructureMemoryRequirementsTypeNV);
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkAccelerationStructureNV*)&forUnmarshaling->accelerationStructure = (VkAccelerationStructureNV)unbox_VkAccelerationStructureNV((VkAccelerationStructureNV)(*&cgen_var_0));
+    *(VkAccelerationStructureNV*)&forUnmarshaling->accelerationStructure =
+        (VkAccelerationStructureNV)unbox_VkAccelerationStructureNV(
+            (VkAccelerationStructureNV)(*&cgen_var_0));
 }
 
 void reservedunmarshal_VkPhysicalDeviceRayTracingPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceRayTracingPropertiesNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceRayTracingPropertiesNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -19073,15 +18876,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->shaderGroupHandleSize, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -19097,26 +18902,19 @@
     *ptr += sizeof(uint64_t);
     memcpy((uint64_t*)&forUnmarshaling->maxTriangleCount, *ptr, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetAccelerationStructures, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetAccelerationStructures, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkTransformMatrixKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkTransformMatrixKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
-    memcpy((float*)forUnmarshaling->matrix, *ptr, ((3)*(4)) * sizeof(float));
-    *ptr += ((3)*(4)) * sizeof(float);
+void reservedunmarshal_VkTransformMatrixKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkTransformMatrixKHR* forUnmarshaling, uint8_t** ptr) {
+    memcpy((float*)forUnmarshaling->matrix, *ptr, ((3) * (4)) * sizeof(float));
+    *ptr += ((3) * (4)) * sizeof(float);
 }
 
-void reservedunmarshal_VkAabbPositionsKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAabbPositionsKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkAabbPositionsKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkAabbPositionsKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((float*)&forUnmarshaling->minX, *ptr, sizeof(float));
     *ptr += sizeof(float);
     memcpy((float*)&forUnmarshaling->minY, *ptr, sizeof(float));
@@ -19132,41 +18930,34 @@
 }
 
 void reservedunmarshal_VkAccelerationStructureInstanceKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureInstanceKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
-    
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureInstanceKHR* forUnmarshaling, uint8_t** ptr) {
     typedef struct VkAccelerationStructureInstanceKHRWithoutBitFields {
-        VkTransformMatrixKHR          transform;
-        uint32_t                      dwords[2];
-        uint64_t                      accelerationStructureReference;
+        VkTransformMatrixKHR transform;
+        uint32_t dwords[2];
+        uint64_t accelerationStructureReference;
     } VkAccelerationStructureInstanceKHRWithoutBitFields;
-    
-    VkAccelerationStructureInstanceKHRWithoutBitFields* forUnmarshaling_new = (VkAccelerationStructureInstanceKHRWithoutBitFields*)(forUnmarshaling);
-    reservedunmarshal_VkTransformMatrixKHR(vkStream, rootType, (VkTransformMatrixKHR*)(&forUnmarshaling_new->transform), ptr);
+
+    VkAccelerationStructureInstanceKHRWithoutBitFields* forUnmarshaling_new =
+        (VkAccelerationStructureInstanceKHRWithoutBitFields*)(forUnmarshaling);
+    reservedunmarshal_VkTransformMatrixKHR(
+        vkStream, rootType, (VkTransformMatrixKHR*)(&forUnmarshaling_new->transform), ptr);
     for (uint32_t i = 0; i < 2; i++) {
         memcpy((uint32_t*)&(forUnmarshaling_new->dwords[i]), *ptr, sizeof(uint32_t));
         *ptr += sizeof(uint32_t);
     }
     memcpy((uint64_t*)&forUnmarshaling_new->accelerationStructureReference, *ptr, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
-    
 }
 
 #endif
 #ifdef VK_NV_representative_fragment_test
 void reservedunmarshal_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -19174,30 +18965,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->representativeFragmentTest, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineRepresentativeFragmentTestStateCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineRepresentativeFragmentTestStateCreateInfoNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -19205,15 +18994,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->representativeFragmentTestEnable, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -19222,15 +19013,11 @@
 #endif
 #ifdef VK_EXT_filter_cubic
 void reservedunmarshal_VkPhysicalDeviceImageViewImageFormatInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceImageViewImageFormatInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceImageViewImageFormatInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -19238,30 +19025,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkImageViewType*)&forUnmarshaling->imageViewType, *ptr, sizeof(VkImageViewType));
     *ptr += sizeof(VkImageViewType);
 }
 
 void reservedunmarshal_VkFilterCubicImageViewImageFormatPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFilterCubicImageViewImageFormatPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkFilterCubicImageViewImageFormatPropertiesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -19269,15 +19054,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->filterCubic, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -19290,15 +19077,11 @@
 #endif
 #ifdef VK_EXT_global_priority
 void reservedunmarshal_VkDeviceQueueGlobalPriorityCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceQueueGlobalPriorityCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDeviceQueueGlobalPriorityCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -19306,32 +19089,31 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkQueueGlobalPriorityEXT*)&forUnmarshaling->globalPriority, *ptr, sizeof(VkQueueGlobalPriorityEXT));
+    memcpy((VkQueueGlobalPriorityEXT*)&forUnmarshaling->globalPriority, *ptr,
+           sizeof(VkQueueGlobalPriorityEXT));
     *ptr += sizeof(VkQueueGlobalPriorityEXT);
 }
 
 #endif
 #ifdef VK_EXT_external_memory_host
 void reservedunmarshal_VkImportMemoryHostPointerInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportMemoryHostPointerInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImportMemoryHostPointerInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -19339,24 +19121,26 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    memcpy((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr,
+           sizeof(VkExternalMemoryHandleTypeFlagBits));
     *ptr += sizeof(VkExternalMemoryHandleTypeFlagBits);
     // WARNING PTR CHECK
     memcpy((void**)&forUnmarshaling->pHostPointer, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pHostPointer);
     *ptr += 8;
-    if (forUnmarshaling->pHostPointer)
-    {
+    if (forUnmarshaling->pHostPointer) {
         vkStream->alloc((void**)&forUnmarshaling->pHostPointer, sizeof(uint8_t));
         memcpy((void*)forUnmarshaling->pHostPointer, *ptr, sizeof(uint8_t));
         *ptr += sizeof(uint8_t);
@@ -19364,15 +19148,11 @@
 }
 
 void reservedunmarshal_VkMemoryHostPointerPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryHostPointerPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkMemoryHostPointerPropertiesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -19380,30 +19160,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->memoryTypeBits, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
 void reservedunmarshal_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceExternalMemoryHostPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceExternalMemoryHostPropertiesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -19411,17 +19189,20 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkDeviceSize*)&forUnmarshaling->minImportedHostPointerAlignment, *ptr, sizeof(VkDeviceSize));
+    memcpy((VkDeviceSize*)&forUnmarshaling->minImportedHostPointerAlignment, *ptr,
+           sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
 }
 
@@ -19430,15 +19211,11 @@
 #endif
 #ifdef VK_AMD_pipeline_compiler_control
 void reservedunmarshal_VkPipelineCompilerControlCreateInfoAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineCompilerControlCreateInfoAMD* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineCompilerControlCreateInfoAMD* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -19446,32 +19223,32 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkPipelineCompilerControlFlagsAMD*)&forUnmarshaling->compilerControlFlags, *ptr, sizeof(VkPipelineCompilerControlFlagsAMD));
+    memcpy((VkPipelineCompilerControlFlagsAMD*)&forUnmarshaling->compilerControlFlags, *ptr,
+           sizeof(VkPipelineCompilerControlFlagsAMD));
     *ptr += sizeof(VkPipelineCompilerControlFlagsAMD);
 }
 
 #endif
 #ifdef VK_EXT_calibrated_timestamps
-void reservedunmarshal_VkCalibratedTimestampInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCalibratedTimestampInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkCalibratedTimestampInfoEXT(VulkanStream* vkStream,
+                                                    VkStructureType rootType,
+                                                    VkCalibratedTimestampInfoEXT* forUnmarshaling,
+                                                    uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -19479,15 +19256,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkTimeDomainEXT*)&forUnmarshaling->timeDomain, *ptr, sizeof(VkTimeDomainEXT));
     *ptr += sizeof(VkTimeDomainEXT);
@@ -19496,15 +19275,11 @@
 #endif
 #ifdef VK_AMD_shader_core_properties
 void reservedunmarshal_VkPhysicalDeviceShaderCorePropertiesAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderCorePropertiesAMD* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderCorePropertiesAMD* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -19512,15 +19287,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->shaderEngineCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -19554,16 +19331,12 @@
 
 #endif
 #ifdef VK_EXT_video_decode_h265
-void reservedunmarshal_VkVideoDecodeH265ProfileEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH265ProfileEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkVideoDecodeH265ProfileEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkVideoDecodeH265ProfileEXT* forUnmarshaling,
+                                                   uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -19571,30 +19344,29 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((StdVideoH265ProfileIdc*)&forUnmarshaling->stdProfileIdc, *ptr, sizeof(StdVideoH265ProfileIdc));
+    memcpy((StdVideoH265ProfileIdc*)&forUnmarshaling->stdProfileIdc, *ptr,
+           sizeof(StdVideoH265ProfileIdc));
     *ptr += sizeof(StdVideoH265ProfileIdc);
 }
 
 void reservedunmarshal_VkVideoDecodeH265CapabilitiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH265CapabilitiesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoDecodeH265CapabilitiesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -19602,31 +19374,30 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->maxLevel, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    reservedunmarshal_VkExtensionProperties(vkStream, rootType, (VkExtensionProperties*)(&forUnmarshaling->stdExtensionVersion), ptr);
+    reservedunmarshal_VkExtensionProperties(
+        vkStream, rootType, (VkExtensionProperties*)(&forUnmarshaling->stdExtensionVersion), ptr);
 }
 
 void reservedunmarshal_VkVideoDecodeH265SessionCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH265SessionCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoDecodeH265SessionCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -19634,32 +19405,33 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkVideoDecodeH265CreateFlagsEXT*)&forUnmarshaling->flags, *ptr, sizeof(VkVideoDecodeH265CreateFlagsEXT));
+    memcpy((VkVideoDecodeH265CreateFlagsEXT*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkVideoDecodeH265CreateFlagsEXT));
     *ptr += sizeof(VkVideoDecodeH265CreateFlagsEXT);
-    vkStream->alloc((void**)&forUnmarshaling->pStdExtensionVersion, sizeof(const VkExtensionProperties));
-    reservedunmarshal_VkExtensionProperties(vkStream, rootType, (VkExtensionProperties*)(forUnmarshaling->pStdExtensionVersion), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pStdExtensionVersion,
+                    sizeof(const VkExtensionProperties));
+    reservedunmarshal_VkExtensionProperties(
+        vkStream, rootType, (VkExtensionProperties*)(forUnmarshaling->pStdExtensionVersion), ptr);
 }
 
 void reservedunmarshal_VkVideoDecodeH265SessionParametersAddInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH265SessionParametersAddInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoDecodeH265SessionParametersAddInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -19667,15 +19439,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->spsStdCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -19683,10 +19457,12 @@
     memcpy((StdVideoH265SequenceParameterSet**)&forUnmarshaling->pSpsStd, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pSpsStd);
     *ptr += 8;
-    if (forUnmarshaling->pSpsStd)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pSpsStd, forUnmarshaling->spsStdCount * sizeof(const StdVideoH265SequenceParameterSet));
-        memcpy((StdVideoH265SequenceParameterSet*)forUnmarshaling->pSpsStd, *ptr, forUnmarshaling->spsStdCount * sizeof(const StdVideoH265SequenceParameterSet));
+    if (forUnmarshaling->pSpsStd) {
+        vkStream->alloc(
+            (void**)&forUnmarshaling->pSpsStd,
+            forUnmarshaling->spsStdCount * sizeof(const StdVideoH265SequenceParameterSet));
+        memcpy((StdVideoH265SequenceParameterSet*)forUnmarshaling->pSpsStd, *ptr,
+               forUnmarshaling->spsStdCount * sizeof(const StdVideoH265SequenceParameterSet));
         *ptr += forUnmarshaling->spsStdCount * sizeof(const StdVideoH265SequenceParameterSet);
     }
     memcpy((uint32_t*)&forUnmarshaling->ppsStdCount, *ptr, sizeof(uint32_t));
@@ -19695,24 +19471,22 @@
     memcpy((StdVideoH265PictureParameterSet**)&forUnmarshaling->pPpsStd, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pPpsStd);
     *ptr += 8;
-    if (forUnmarshaling->pPpsStd)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pPpsStd, forUnmarshaling->ppsStdCount * sizeof(const StdVideoH265PictureParameterSet));
-        memcpy((StdVideoH265PictureParameterSet*)forUnmarshaling->pPpsStd, *ptr, forUnmarshaling->ppsStdCount * sizeof(const StdVideoH265PictureParameterSet));
+    if (forUnmarshaling->pPpsStd) {
+        vkStream->alloc(
+            (void**)&forUnmarshaling->pPpsStd,
+            forUnmarshaling->ppsStdCount * sizeof(const StdVideoH265PictureParameterSet));
+        memcpy((StdVideoH265PictureParameterSet*)forUnmarshaling->pPpsStd, *ptr,
+               forUnmarshaling->ppsStdCount * sizeof(const StdVideoH265PictureParameterSet));
         *ptr += forUnmarshaling->ppsStdCount * sizeof(const StdVideoH265PictureParameterSet);
     }
 }
 
 void reservedunmarshal_VkVideoDecodeH265SessionParametersCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH265SessionParametersCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoDecodeH265SessionParametersCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -19720,41 +19494,43 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->maxSpsStdCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->maxPpsStdCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     // WARNING PTR CHECK
-    memcpy((VkVideoDecodeH265SessionParametersAddInfoEXT**)&forUnmarshaling->pParametersAddInfo, (*ptr), 8);
+    memcpy((VkVideoDecodeH265SessionParametersAddInfoEXT**)&forUnmarshaling->pParametersAddInfo,
+           (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pParametersAddInfo);
     *ptr += 8;
-    if (forUnmarshaling->pParametersAddInfo)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pParametersAddInfo, sizeof(const VkVideoDecodeH265SessionParametersAddInfoEXT));
-        reservedunmarshal_VkVideoDecodeH265SessionParametersAddInfoEXT(vkStream, rootType, (VkVideoDecodeH265SessionParametersAddInfoEXT*)(forUnmarshaling->pParametersAddInfo), ptr);
+    if (forUnmarshaling->pParametersAddInfo) {
+        vkStream->alloc((void**)&forUnmarshaling->pParametersAddInfo,
+                        sizeof(const VkVideoDecodeH265SessionParametersAddInfoEXT));
+        reservedunmarshal_VkVideoDecodeH265SessionParametersAddInfoEXT(
+            vkStream, rootType,
+            (VkVideoDecodeH265SessionParametersAddInfoEXT*)(forUnmarshaling->pParametersAddInfo),
+            ptr);
     }
 }
 
 void reservedunmarshal_VkVideoDecodeH265PictureInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH265PictureInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoDecodeH265PictureInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -19762,36 +19538,38 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    vkStream->alloc((void**)&forUnmarshaling->pStdPictureInfo, sizeof(StdVideoDecodeH265PictureInfo));
-    memcpy((StdVideoDecodeH265PictureInfo*)forUnmarshaling->pStdPictureInfo, *ptr, sizeof(StdVideoDecodeH265PictureInfo));
+    vkStream->alloc((void**)&forUnmarshaling->pStdPictureInfo,
+                    sizeof(StdVideoDecodeH265PictureInfo));
+    memcpy((StdVideoDecodeH265PictureInfo*)forUnmarshaling->pStdPictureInfo, *ptr,
+           sizeof(StdVideoDecodeH265PictureInfo));
     *ptr += sizeof(StdVideoDecodeH265PictureInfo);
     memcpy((uint32_t*)&forUnmarshaling->slicesCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pSlicesDataOffsets, forUnmarshaling->slicesCount * sizeof(const uint32_t));
-    memcpy((uint32_t*)forUnmarshaling->pSlicesDataOffsets, *ptr, forUnmarshaling->slicesCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pSlicesDataOffsets,
+                    forUnmarshaling->slicesCount * sizeof(const uint32_t));
+    memcpy((uint32_t*)forUnmarshaling->pSlicesDataOffsets, *ptr,
+           forUnmarshaling->slicesCount * sizeof(const uint32_t));
     *ptr += forUnmarshaling->slicesCount * sizeof(const uint32_t);
 }
 
 void reservedunmarshal_VkVideoDecodeH265DpbSlotInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH265DpbSlotInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoDecodeH265DpbSlotInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -19799,33 +19577,33 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    vkStream->alloc((void**)&forUnmarshaling->pStdReferenceInfo, sizeof(const StdVideoDecodeH265ReferenceInfo));
-    memcpy((StdVideoDecodeH265ReferenceInfo*)forUnmarshaling->pStdReferenceInfo, *ptr, sizeof(const StdVideoDecodeH265ReferenceInfo));
+    vkStream->alloc((void**)&forUnmarshaling->pStdReferenceInfo,
+                    sizeof(const StdVideoDecodeH265ReferenceInfo));
+    memcpy((StdVideoDecodeH265ReferenceInfo*)forUnmarshaling->pStdReferenceInfo, *ptr,
+           sizeof(const StdVideoDecodeH265ReferenceInfo));
     *ptr += sizeof(const StdVideoDecodeH265ReferenceInfo);
 }
 
 #endif
 #ifdef VK_AMD_memory_overallocation_behavior
 void reservedunmarshal_VkDeviceMemoryOverallocationCreateInfoAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceMemoryOverallocationCreateInfoAMD* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDeviceMemoryOverallocationCreateInfoAMD* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -19833,32 +19611,31 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkMemoryOverallocationBehaviorAMD*)&forUnmarshaling->overallocationBehavior, *ptr, sizeof(VkMemoryOverallocationBehaviorAMD));
+    memcpy((VkMemoryOverallocationBehaviorAMD*)&forUnmarshaling->overallocationBehavior, *ptr,
+           sizeof(VkMemoryOverallocationBehaviorAMD));
     *ptr += sizeof(VkMemoryOverallocationBehaviorAMD);
 }
 
 #endif
 #ifdef VK_EXT_vertex_attribute_divisor
 void reservedunmarshal_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -19866,26 +19643,25 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->maxVertexAttribDivisor, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
 void reservedunmarshal_VkVertexInputBindingDivisorDescriptionEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVertexInputBindingDivisorDescriptionEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVertexInputBindingDivisorDescriptionEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((uint32_t*)&forUnmarshaling->binding, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->divisor, *ptr, sizeof(uint32_t));
@@ -19893,15 +19669,11 @@
 }
 
 void reservedunmarshal_VkPipelineVertexInputDivisorStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineVertexInputDivisorStateCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineVertexInputDivisorStateCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -19909,35 +19681,38 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->vertexBindingDivisorCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pVertexBindingDivisors, forUnmarshaling->vertexBindingDivisorCount * sizeof(const VkVertexInputBindingDivisorDescriptionEXT));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->vertexBindingDivisorCount; ++i)
-    {
-        reservedunmarshal_VkVertexInputBindingDivisorDescriptionEXT(vkStream, rootType, (VkVertexInputBindingDivisorDescriptionEXT*)(forUnmarshaling->pVertexBindingDivisors + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pVertexBindingDivisors,
+                    forUnmarshaling->vertexBindingDivisorCount *
+                        sizeof(const VkVertexInputBindingDivisorDescriptionEXT));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->vertexBindingDivisorCount; ++i) {
+        reservedunmarshal_VkVertexInputBindingDivisorDescriptionEXT(
+            vkStream, rootType,
+            (VkVertexInputBindingDivisorDescriptionEXT*)(forUnmarshaling->pVertexBindingDivisors +
+                                                         i),
+            ptr);
     }
 }
 
 void reservedunmarshal_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -19945,34 +19720,33 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->vertexAttributeInstanceRateDivisor, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->vertexAttributeInstanceRateZeroDivisor, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->vertexAttributeInstanceRateZeroDivisor, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 #endif
 #ifdef VK_GGP_frame_token
-void reservedunmarshal_VkPresentFrameTokenGGP(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPresentFrameTokenGGP* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkPresentFrameTokenGGP(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkPresentFrameTokenGGP* forUnmarshaling,
+                                              uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -19980,15 +19754,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((GgpFrameToken*)&forUnmarshaling->frameToken, *ptr, sizeof(GgpFrameToken));
     *ptr += sizeof(GgpFrameToken);
@@ -19996,28 +19772,23 @@
 
 #endif
 #ifdef VK_EXT_pipeline_creation_feedback
-void reservedunmarshal_VkPipelineCreationFeedbackEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineCreationFeedbackEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
-    memcpy((VkPipelineCreationFeedbackFlagsEXT*)&forUnmarshaling->flags, *ptr, sizeof(VkPipelineCreationFeedbackFlagsEXT));
+void reservedunmarshal_VkPipelineCreationFeedbackEXT(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkPipelineCreationFeedbackEXT* forUnmarshaling,
+                                                     uint8_t** ptr) {
+    memcpy((VkPipelineCreationFeedbackFlagsEXT*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkPipelineCreationFeedbackFlagsEXT));
     *ptr += sizeof(VkPipelineCreationFeedbackFlagsEXT);
     memcpy((uint64_t*)&forUnmarshaling->duration, *ptr, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
 }
 
 void reservedunmarshal_VkPipelineCreationFeedbackCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineCreationFeedbackCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineCreationFeedbackCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -20025,24 +19796,33 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    vkStream->alloc((void**)&forUnmarshaling->pPipelineCreationFeedback, sizeof(VkPipelineCreationFeedbackEXT));
-    reservedunmarshal_VkPipelineCreationFeedbackEXT(vkStream, rootType, (VkPipelineCreationFeedbackEXT*)(forUnmarshaling->pPipelineCreationFeedback), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pPipelineCreationFeedback,
+                    sizeof(VkPipelineCreationFeedbackEXT));
+    reservedunmarshal_VkPipelineCreationFeedbackEXT(
+        vkStream, rootType,
+        (VkPipelineCreationFeedbackEXT*)(forUnmarshaling->pPipelineCreationFeedback), ptr);
     memcpy((uint32_t*)&forUnmarshaling->pipelineStageCreationFeedbackCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pPipelineStageCreationFeedbacks, forUnmarshaling->pipelineStageCreationFeedbackCount * sizeof(VkPipelineCreationFeedbackEXT));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->pipelineStageCreationFeedbackCount; ++i)
-    {
-        reservedunmarshal_VkPipelineCreationFeedbackEXT(vkStream, rootType, (VkPipelineCreationFeedbackEXT*)(forUnmarshaling->pPipelineStageCreationFeedbacks + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pPipelineStageCreationFeedbacks,
+                    forUnmarshaling->pipelineStageCreationFeedbackCount *
+                        sizeof(VkPipelineCreationFeedbackEXT));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->pipelineStageCreationFeedbackCount; ++i) {
+        reservedunmarshal_VkPipelineCreationFeedbackEXT(
+            vkStream, rootType,
+            (VkPipelineCreationFeedbackEXT*)(forUnmarshaling->pPipelineStageCreationFeedbacks + i),
+            ptr);
     }
 }
 
@@ -20051,15 +19831,11 @@
 #endif
 #ifdef VK_NV_compute_shader_derivatives
 void reservedunmarshal_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -20067,15 +19843,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->computeDerivativeGroupQuads, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -20086,15 +19864,11 @@
 #endif
 #ifdef VK_NV_mesh_shader
 void reservedunmarshal_VkPhysicalDeviceMeshShaderFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMeshShaderFeaturesNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMeshShaderFeaturesNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -20102,15 +19876,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->taskShader, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -20119,15 +19895,11 @@
 }
 
 void reservedunmarshal_VkPhysicalDeviceMeshShaderPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMeshShaderPropertiesNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMeshShaderPropertiesNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -20135,15 +19907,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->maxDrawMeshTasksCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -20174,11 +19948,8 @@
 }
 
 void reservedunmarshal_VkDrawMeshTasksIndirectCommandNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDrawMeshTasksIndirectCommandNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDrawMeshTasksIndirectCommandNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((uint32_t*)&forUnmarshaling->taskCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->firstTask, *ptr, sizeof(uint32_t));
@@ -20188,15 +19959,11 @@
 #endif
 #ifdef VK_NV_fragment_shader_barycentric
 void reservedunmarshal_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -20204,15 +19971,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->fragmentShaderBarycentric, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -20221,15 +19990,11 @@
 #endif
 #ifdef VK_NV_shader_image_footprint
 void reservedunmarshal_VkPhysicalDeviceShaderImageFootprintFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderImageFootprintFeaturesNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderImageFootprintFeaturesNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -20237,15 +20002,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->imageFootprint, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -20254,15 +20021,11 @@
 #endif
 #ifdef VK_NV_scissor_exclusive
 void reservedunmarshal_VkPipelineViewportExclusiveScissorStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineViewportExclusiveScissorStateCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineViewportExclusiveScissorStateCreateInfoNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -20270,15 +20033,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->exclusiveScissorCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -20286,26 +20051,22 @@
     memcpy((VkRect2D**)&forUnmarshaling->pExclusiveScissors, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pExclusiveScissors);
     *ptr += 8;
-    if (forUnmarshaling->pExclusiveScissors)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pExclusiveScissors, forUnmarshaling->exclusiveScissorCount * sizeof(const VkRect2D));
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->exclusiveScissorCount; ++i)
-        {
-            reservedunmarshal_VkRect2D(vkStream, rootType, (VkRect2D*)(forUnmarshaling->pExclusiveScissors + i), ptr);
+    if (forUnmarshaling->pExclusiveScissors) {
+        vkStream->alloc((void**)&forUnmarshaling->pExclusiveScissors,
+                        forUnmarshaling->exclusiveScissorCount * sizeof(const VkRect2D));
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->exclusiveScissorCount; ++i) {
+            reservedunmarshal_VkRect2D(vkStream, rootType,
+                                       (VkRect2D*)(forUnmarshaling->pExclusiveScissors + i), ptr);
         }
     }
 }
 
 void reservedunmarshal_VkPhysicalDeviceExclusiveScissorFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceExclusiveScissorFeaturesNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceExclusiveScissorFeaturesNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -20313,15 +20074,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->exclusiveScissor, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -20330,15 +20093,11 @@
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
 void reservedunmarshal_VkQueueFamilyCheckpointPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkQueueFamilyCheckpointPropertiesNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkQueueFamilyCheckpointPropertiesNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -20346,30 +20105,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkPipelineStageFlags*)&forUnmarshaling->checkpointExecutionStageMask, *ptr, sizeof(VkPipelineStageFlags));
+    memcpy((VkPipelineStageFlags*)&forUnmarshaling->checkpointExecutionStageMask, *ptr,
+           sizeof(VkPipelineStageFlags));
     *ptr += sizeof(VkPipelineStageFlags);
 }
 
-void reservedunmarshal_VkCheckpointDataNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCheckpointDataNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkCheckpointDataNV(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkCheckpointDataNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -20377,24 +20134,26 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkPipelineStageFlagBits*)&forUnmarshaling->stage, *ptr, sizeof(VkPipelineStageFlagBits));
+    memcpy((VkPipelineStageFlagBits*)&forUnmarshaling->stage, *ptr,
+           sizeof(VkPipelineStageFlagBits));
     *ptr += sizeof(VkPipelineStageFlagBits);
     // WARNING PTR CHECK
     memcpy((void**)&forUnmarshaling->pCheckpointMarker, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pCheckpointMarker);
     *ptr += 8;
-    if (forUnmarshaling->pCheckpointMarker)
-    {
+    if (forUnmarshaling->pCheckpointMarker) {
         vkStream->alloc((void**)&forUnmarshaling->pCheckpointMarker, sizeof(uint8_t));
         memcpy((void*)forUnmarshaling->pCheckpointMarker, *ptr, sizeof(uint8_t));
         *ptr += sizeof(uint8_t);
@@ -20404,15 +20163,11 @@
 #endif
 #ifdef VK_INTEL_shader_integer_functions2
 void reservedunmarshal_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -20420,15 +20175,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->shaderIntegerFunctions2, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -20436,37 +20193,29 @@
 
 #endif
 #ifdef VK_INTEL_performance_query
-void reservedunmarshal_VkPerformanceValueDataINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPerformanceValueDataINTEL* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkPerformanceValueDataINTEL(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkPerformanceValueDataINTEL* forUnmarshaling,
+                                                   uint8_t** ptr) {
     memcpy((uint32_t*)&forUnmarshaling->value32, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkPerformanceValueINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPerformanceValueINTEL* forUnmarshaling,
-    uint8_t** ptr)
-{
-    memcpy((VkPerformanceValueTypeINTEL*)&forUnmarshaling->type, *ptr, sizeof(VkPerformanceValueTypeINTEL));
+void reservedunmarshal_VkPerformanceValueINTEL(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkPerformanceValueINTEL* forUnmarshaling,
+                                               uint8_t** ptr) {
+    memcpy((VkPerformanceValueTypeINTEL*)&forUnmarshaling->type, *ptr,
+           sizeof(VkPerformanceValueTypeINTEL));
     *ptr += sizeof(VkPerformanceValueTypeINTEL);
-    reservedunmarshal_VkPerformanceValueDataINTEL(vkStream, rootType, (VkPerformanceValueDataINTEL*)(&forUnmarshaling->data), ptr);
+    reservedunmarshal_VkPerformanceValueDataINTEL(
+        vkStream, rootType, (VkPerformanceValueDataINTEL*)(&forUnmarshaling->data), ptr);
 }
 
 void reservedunmarshal_VkInitializePerformanceApiInfoINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkInitializePerformanceApiInfoINTEL* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkInitializePerformanceApiInfoINTEL* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -20474,22 +20223,23 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     // WARNING PTR CHECK
     memcpy((void**)&forUnmarshaling->pUserData, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pUserData);
     *ptr += 8;
-    if (forUnmarshaling->pUserData)
-    {
+    if (forUnmarshaling->pUserData) {
         vkStream->alloc((void**)&forUnmarshaling->pUserData, sizeof(uint8_t));
         memcpy((void*)forUnmarshaling->pUserData, *ptr, sizeof(uint8_t));
         *ptr += sizeof(uint8_t);
@@ -20497,15 +20247,11 @@
 }
 
 void reservedunmarshal_VkQueryPoolPerformanceQueryCreateInfoINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkQueryPoolPerformanceQueryCreateInfoINTEL* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkQueryPoolPerformanceQueryCreateInfoINTEL* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -20513,30 +20259,30 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkQueryPoolSamplingModeINTEL*)&forUnmarshaling->performanceCountersSampling, *ptr, sizeof(VkQueryPoolSamplingModeINTEL));
+    memcpy((VkQueryPoolSamplingModeINTEL*)&forUnmarshaling->performanceCountersSampling, *ptr,
+           sizeof(VkQueryPoolSamplingModeINTEL));
     *ptr += sizeof(VkQueryPoolSamplingModeINTEL);
 }
 
-void reservedunmarshal_VkPerformanceMarkerInfoINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPerformanceMarkerInfoINTEL* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkPerformanceMarkerInfoINTEL(VulkanStream* vkStream,
+                                                    VkStructureType rootType,
+                                                    VkPerformanceMarkerInfoINTEL* forUnmarshaling,
+                                                    uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -20544,30 +20290,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint64_t*)&forUnmarshaling->marker, *ptr, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
 }
 
 void reservedunmarshal_VkPerformanceStreamMarkerInfoINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPerformanceStreamMarkerInfoINTEL* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPerformanceStreamMarkerInfoINTEL* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -20575,30 +20319,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->marker, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
 void reservedunmarshal_VkPerformanceOverrideInfoINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPerformanceOverrideInfoINTEL* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPerformanceOverrideInfoINTEL* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -20606,17 +20348,20 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkPerformanceOverrideTypeINTEL*)&forUnmarshaling->type, *ptr, sizeof(VkPerformanceOverrideTypeINTEL));
+    memcpy((VkPerformanceOverrideTypeINTEL*)&forUnmarshaling->type, *ptr,
+           sizeof(VkPerformanceOverrideTypeINTEL));
     *ptr += sizeof(VkPerformanceOverrideTypeINTEL);
     memcpy((VkBool32*)&forUnmarshaling->enable, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -20625,15 +20370,11 @@
 }
 
 void reservedunmarshal_VkPerformanceConfigurationAcquireInfoINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPerformanceConfigurationAcquireInfoINTEL* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPerformanceConfigurationAcquireInfoINTEL* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -20641,32 +20382,31 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkPerformanceConfigurationTypeINTEL*)&forUnmarshaling->type, *ptr, sizeof(VkPerformanceConfigurationTypeINTEL));
+    memcpy((VkPerformanceConfigurationTypeINTEL*)&forUnmarshaling->type, *ptr,
+           sizeof(VkPerformanceConfigurationTypeINTEL));
     *ptr += sizeof(VkPerformanceConfigurationTypeINTEL);
 }
 
 #endif
 #ifdef VK_EXT_pci_bus_info
 void reservedunmarshal_VkPhysicalDevicePCIBusInfoPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePCIBusInfoPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePCIBusInfoPropertiesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -20674,15 +20414,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->pciDomain, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -20697,15 +20439,11 @@
 #endif
 #ifdef VK_AMD_display_native_hdr
 void reservedunmarshal_VkDisplayNativeHdrSurfaceCapabilitiesAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayNativeHdrSurfaceCapabilitiesAMD* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDisplayNativeHdrSurfaceCapabilitiesAMD* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -20713,30 +20451,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->localDimmingSupport, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkSwapchainDisplayNativeHdrCreateInfoAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSwapchainDisplayNativeHdrCreateInfoAMD* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSwapchainDisplayNativeHdrCreateInfoAMD* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -20744,15 +20480,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->localDimmingEnable, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -20761,15 +20499,11 @@
 #endif
 #ifdef VK_FUCHSIA_imagepipe_surface
 void reservedunmarshal_VkImagePipeSurfaceCreateInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImagePipeSurfaceCreateInfoFUCHSIA* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImagePipeSurfaceCreateInfoFUCHSIA* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -20777,17 +20511,20 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkImagePipeSurfaceCreateFlagsFUCHSIA*)&forUnmarshaling->flags, *ptr, sizeof(VkImagePipeSurfaceCreateFlagsFUCHSIA));
+    memcpy((VkImagePipeSurfaceCreateFlagsFUCHSIA*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkImagePipeSurfaceCreateFlagsFUCHSIA));
     *ptr += sizeof(VkImagePipeSurfaceCreateFlagsFUCHSIA);
     memcpy((zx_handle_t*)&forUnmarshaling->imagePipeHandle, *ptr, sizeof(zx_handle_t));
     *ptr += sizeof(zx_handle_t);
@@ -20795,31 +20532,22 @@
 
 #endif
 #ifdef VK_EXT_metal_surface
-void reservedunmarshal_VkMetalSurfaceCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMetalSurfaceCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
-    
+void reservedunmarshal_VkMetalSurfaceCreateInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkMetalSurfaceCreateInfoEXT* forUnmarshaling,
+                                                   uint8_t** ptr) {
     // This struct should never be marshaled / unmarshaled.
     __builtin_trap();
-    
 }
 
 #endif
 #ifdef VK_EXT_fragment_density_map
 void reservedunmarshal_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFragmentDensityMapFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceFragmentDensityMapFeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
     forUnmarshaling->sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -20827,35 +20555,34 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->fragmentDensityMap, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy((VkBool32*)&forUnmarshaling->fragmentDensityMapDynamic, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->fragmentDensityMapNonSubsampledImages, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->fragmentDensityMapNonSubsampledImages, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFragmentDensityMapPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceFragmentDensityMapPropertiesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
     forUnmarshaling->sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -20863,33 +20590,33 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->minFragmentDensityTexelSize), ptr);
-    reservedunmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->maxFragmentDensityTexelSize), ptr);
+    reservedunmarshal_VkExtent2D(vkStream, rootType,
+                                 (VkExtent2D*)(&forUnmarshaling->minFragmentDensityTexelSize), ptr);
+    reservedunmarshal_VkExtent2D(vkStream, rootType,
+                                 (VkExtent2D*)(&forUnmarshaling->maxFragmentDensityTexelSize), ptr);
     memcpy((VkBool32*)&forUnmarshaling->fragmentDensityInvocations, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkRenderPassFragmentDensityMapCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderPassFragmentDensityMapCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkRenderPassFragmentDensityMapCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
     forUnmarshaling->sType = VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -20897,17 +20624,21 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    reservedunmarshal_VkAttachmentReference(vkStream, rootType, (VkAttachmentReference*)(&forUnmarshaling->fragmentDensityMapAttachment), ptr);
+    reservedunmarshal_VkAttachmentReference(
+        vkStream, rootType,
+        (VkAttachmentReference*)(&forUnmarshaling->fragmentDensityMapAttachment), ptr);
 }
 
 #endif
@@ -20919,15 +20650,11 @@
 #endif
 #ifdef VK_EXT_subgroup_size_control
 void reservedunmarshal_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -20935,15 +20662,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->subgroupSizeControl, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -20952,15 +20681,11 @@
 }
 
 void reservedunmarshal_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -20968,15 +20693,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->minSubgroupSize, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -20984,20 +20711,17 @@
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->maxComputeWorkgroupSubgroups, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((VkShaderStageFlags*)&forUnmarshaling->requiredSubgroupSizeStages, *ptr, sizeof(VkShaderStageFlags));
+    memcpy((VkShaderStageFlags*)&forUnmarshaling->requiredSubgroupSizeStages, *ptr,
+           sizeof(VkShaderStageFlags));
     *ptr += sizeof(VkShaderStageFlags);
 }
 
 void reservedunmarshal_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -21005,15 +20729,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->requiredSubgroupSize, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -21022,15 +20748,11 @@
 #endif
 #ifdef VK_AMD_shader_core_properties2
 void reservedunmarshal_VkPhysicalDeviceShaderCoreProperties2AMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderCoreProperties2AMD* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderCoreProperties2AMD* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -21038,17 +20760,20 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkShaderCorePropertiesFlagsAMD*)&forUnmarshaling->shaderCoreFeatures, *ptr, sizeof(VkShaderCorePropertiesFlagsAMD));
+    memcpy((VkShaderCorePropertiesFlagsAMD*)&forUnmarshaling->shaderCoreFeatures, *ptr,
+           sizeof(VkShaderCorePropertiesFlagsAMD));
     *ptr += sizeof(VkShaderCorePropertiesFlagsAMD);
     memcpy((uint32_t*)&forUnmarshaling->activeComputeUnitCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -21057,15 +20782,11 @@
 #endif
 #ifdef VK_AMD_device_coherent_memory
 void reservedunmarshal_VkPhysicalDeviceCoherentMemoryFeaturesAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceCoherentMemoryFeaturesAMD* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceCoherentMemoryFeaturesAMD* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -21073,15 +20794,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->deviceCoherentMemory, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -21090,15 +20813,11 @@
 #endif
 #ifdef VK_EXT_shader_image_atomic_int64
 void reservedunmarshal_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -21106,15 +20825,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->shaderImageInt64Atomics, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -21125,15 +20846,11 @@
 #endif
 #ifdef VK_EXT_memory_budget
 void reservedunmarshal_VkPhysicalDeviceMemoryBudgetPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMemoryBudgetPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMemoryBudgetPropertiesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -21141,34 +20858,34 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkDeviceSize*)forUnmarshaling->heapBudget, *ptr, VK_MAX_MEMORY_HEAPS * sizeof(VkDeviceSize));
+    memcpy((VkDeviceSize*)forUnmarshaling->heapBudget, *ptr,
+           VK_MAX_MEMORY_HEAPS * sizeof(VkDeviceSize));
     *ptr += VK_MAX_MEMORY_HEAPS * sizeof(VkDeviceSize);
-    memcpy((VkDeviceSize*)forUnmarshaling->heapUsage, *ptr, VK_MAX_MEMORY_HEAPS * sizeof(VkDeviceSize));
+    memcpy((VkDeviceSize*)forUnmarshaling->heapUsage, *ptr,
+           VK_MAX_MEMORY_HEAPS * sizeof(VkDeviceSize));
     *ptr += VK_MAX_MEMORY_HEAPS * sizeof(VkDeviceSize);
 }
 
 #endif
 #ifdef VK_EXT_memory_priority
 void reservedunmarshal_VkPhysicalDeviceMemoryPriorityFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMemoryPriorityFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMemoryPriorityFeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -21176,30 +20893,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->memoryPriority, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkMemoryPriorityAllocateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryPriorityAllocateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkMemoryPriorityAllocateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -21207,15 +20922,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((float*)&forUnmarshaling->priority, *ptr, sizeof(float));
     *ptr += sizeof(float);
@@ -21224,15 +20941,11 @@
 #endif
 #ifdef VK_NV_dedicated_allocation_image_aliasing
 void reservedunmarshal_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -21240,15 +20953,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->dedicatedAllocationImageAliasing, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -21257,15 +20972,11 @@
 #endif
 #ifdef VK_EXT_buffer_device_address
 void reservedunmarshal_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -21273,15 +20984,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->bufferDeviceAddress, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -21292,15 +21005,11 @@
 }
 
 void reservedunmarshal_VkBufferDeviceAddressCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferDeviceAddressCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBufferDeviceAddressCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -21308,15 +21017,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkDeviceAddress*)&forUnmarshaling->deviceAddress, *ptr, sizeof(VkDeviceAddress));
     *ptr += sizeof(VkDeviceAddress);
@@ -21325,15 +21036,11 @@
 #endif
 #ifdef VK_EXT_tooling_info
 void reservedunmarshal_VkPhysicalDeviceToolPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceToolPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceToolPropertiesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -21341,15 +21048,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((char*)forUnmarshaling->name, *ptr, VK_MAX_EXTENSION_NAME_SIZE * sizeof(char));
     *ptr += VK_MAX_EXTENSION_NAME_SIZE * sizeof(char);
@@ -21367,16 +21076,12 @@
 #ifdef VK_EXT_separate_stencil_usage
 #endif
 #ifdef VK_EXT_validation_features
-void reservedunmarshal_VkValidationFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkValidationFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkValidationFeaturesEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkValidationFeaturesEXT* forUnmarshaling,
+                                               uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -21384,40 +21089,48 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->enabledValidationFeatureCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pEnabledValidationFeatures, forUnmarshaling->enabledValidationFeatureCount * sizeof(const VkValidationFeatureEnableEXT));
-    memcpy((VkValidationFeatureEnableEXT*)forUnmarshaling->pEnabledValidationFeatures, *ptr, forUnmarshaling->enabledValidationFeatureCount * sizeof(const VkValidationFeatureEnableEXT));
-    *ptr += forUnmarshaling->enabledValidationFeatureCount * sizeof(const VkValidationFeatureEnableEXT);
+    vkStream->alloc((void**)&forUnmarshaling->pEnabledValidationFeatures,
+                    forUnmarshaling->enabledValidationFeatureCount *
+                        sizeof(const VkValidationFeatureEnableEXT));
+    memcpy((VkValidationFeatureEnableEXT*)forUnmarshaling->pEnabledValidationFeatures, *ptr,
+           forUnmarshaling->enabledValidationFeatureCount *
+               sizeof(const VkValidationFeatureEnableEXT));
+    *ptr +=
+        forUnmarshaling->enabledValidationFeatureCount * sizeof(const VkValidationFeatureEnableEXT);
     memcpy((uint32_t*)&forUnmarshaling->disabledValidationFeatureCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pDisabledValidationFeatures, forUnmarshaling->disabledValidationFeatureCount * sizeof(const VkValidationFeatureDisableEXT));
-    memcpy((VkValidationFeatureDisableEXT*)forUnmarshaling->pDisabledValidationFeatures, *ptr, forUnmarshaling->disabledValidationFeatureCount * sizeof(const VkValidationFeatureDisableEXT));
-    *ptr += forUnmarshaling->disabledValidationFeatureCount * sizeof(const VkValidationFeatureDisableEXT);
+    vkStream->alloc((void**)&forUnmarshaling->pDisabledValidationFeatures,
+                    forUnmarshaling->disabledValidationFeatureCount *
+                        sizeof(const VkValidationFeatureDisableEXT));
+    memcpy((VkValidationFeatureDisableEXT*)forUnmarshaling->pDisabledValidationFeatures, *ptr,
+           forUnmarshaling->disabledValidationFeatureCount *
+               sizeof(const VkValidationFeatureDisableEXT));
+    *ptr += forUnmarshaling->disabledValidationFeatureCount *
+            sizeof(const VkValidationFeatureDisableEXT);
 }
 
 #endif
 #ifdef VK_NV_cooperative_matrix
 void reservedunmarshal_VkCooperativeMatrixPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCooperativeMatrixPropertiesNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkCooperativeMatrixPropertiesNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -21425,15 +21138,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->MSize, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -21454,15 +21169,11 @@
 }
 
 void reservedunmarshal_VkPhysicalDeviceCooperativeMatrixFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceCooperativeMatrixFeaturesNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceCooperativeMatrixFeaturesNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -21470,32 +21181,31 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->cooperativeMatrix, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->cooperativeMatrixRobustBufferAccess, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->cooperativeMatrixRobustBufferAccess, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkPhysicalDeviceCooperativeMatrixPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceCooperativeMatrixPropertiesNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceCooperativeMatrixPropertiesNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -21503,32 +21213,31 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkShaderStageFlags*)&forUnmarshaling->cooperativeMatrixSupportedStages, *ptr, sizeof(VkShaderStageFlags));
+    memcpy((VkShaderStageFlags*)&forUnmarshaling->cooperativeMatrixSupportedStages, *ptr,
+           sizeof(VkShaderStageFlags));
     *ptr += sizeof(VkShaderStageFlags);
 }
 
 #endif
 #ifdef VK_NV_coverage_reduction_mode
 void reservedunmarshal_VkPhysicalDeviceCoverageReductionModeFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceCoverageReductionModeFeaturesNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceCoverageReductionModeFeaturesNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -21536,30 +21245,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->coverageReductionMode, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkPipelineCoverageReductionStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineCoverageReductionStateCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineCoverageReductionStateCreateInfoNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -21567,32 +21274,32 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkPipelineCoverageReductionStateCreateFlagsNV*)&forUnmarshaling->flags, *ptr, sizeof(VkPipelineCoverageReductionStateCreateFlagsNV));
+    memcpy((VkPipelineCoverageReductionStateCreateFlagsNV*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkPipelineCoverageReductionStateCreateFlagsNV));
     *ptr += sizeof(VkPipelineCoverageReductionStateCreateFlagsNV);
-    memcpy((VkCoverageReductionModeNV*)&forUnmarshaling->coverageReductionMode, *ptr, sizeof(VkCoverageReductionModeNV));
+    memcpy((VkCoverageReductionModeNV*)&forUnmarshaling->coverageReductionMode, *ptr,
+           sizeof(VkCoverageReductionModeNV));
     *ptr += sizeof(VkCoverageReductionModeNV);
 }
 
 void reservedunmarshal_VkFramebufferMixedSamplesCombinationNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFramebufferMixedSamplesCombinationNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkFramebufferMixedSamplesCombinationNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -21600,21 +21307,26 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkCoverageReductionModeNV*)&forUnmarshaling->coverageReductionMode, *ptr, sizeof(VkCoverageReductionModeNV));
+    memcpy((VkCoverageReductionModeNV*)&forUnmarshaling->coverageReductionMode, *ptr,
+           sizeof(VkCoverageReductionModeNV));
     *ptr += sizeof(VkCoverageReductionModeNV);
-    memcpy((VkSampleCountFlagBits*)&forUnmarshaling->rasterizationSamples, *ptr, sizeof(VkSampleCountFlagBits));
+    memcpy((VkSampleCountFlagBits*)&forUnmarshaling->rasterizationSamples, *ptr,
+           sizeof(VkSampleCountFlagBits));
     *ptr += sizeof(VkSampleCountFlagBits);
-    memcpy((VkSampleCountFlags*)&forUnmarshaling->depthStencilSamples, *ptr, sizeof(VkSampleCountFlags));
+    memcpy((VkSampleCountFlags*)&forUnmarshaling->depthStencilSamples, *ptr,
+           sizeof(VkSampleCountFlags));
     *ptr += sizeof(VkSampleCountFlags);
     memcpy((VkSampleCountFlags*)&forUnmarshaling->colorSamples, *ptr, sizeof(VkSampleCountFlags));
     *ptr += sizeof(VkSampleCountFlags);
@@ -21623,15 +21335,11 @@
 #endif
 #ifdef VK_EXT_fragment_shader_interlock
 void reservedunmarshal_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -21639,15 +21347,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->fragmentShaderSampleInterlock, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -21660,15 +21370,11 @@
 #endif
 #ifdef VK_EXT_ycbcr_image_arrays
 void reservedunmarshal_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -21676,15 +21382,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->ycbcrImageArrays, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -21693,15 +21401,11 @@
 #endif
 #ifdef VK_EXT_provoking_vertex
 void reservedunmarshal_VkPhysicalDeviceProvokingVertexFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceProvokingVertexFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceProvokingVertexFeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -21709,32 +21413,31 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->provokingVertexLast, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->transformFeedbackPreservesProvokingVertex, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->transformFeedbackPreservesProvokingVertex, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkPhysicalDeviceProvokingVertexPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceProvokingVertexPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceProvokingVertexPropertiesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -21742,32 +21445,31 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->provokingVertexModePerPipeline, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->transformFeedbackPreservesTriangleFanProvokingVertex, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->transformFeedbackPreservesTriangleFanProvokingVertex, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineRasterizationProvokingVertexStateCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineRasterizationProvokingVertexStateCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -21775,32 +21477,31 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkProvokingVertexModeEXT*)&forUnmarshaling->provokingVertexMode, *ptr, sizeof(VkProvokingVertexModeEXT));
+    memcpy((VkProvokingVertexModeEXT*)&forUnmarshaling->provokingVertexMode, *ptr,
+           sizeof(VkProvokingVertexModeEXT));
     *ptr += sizeof(VkProvokingVertexModeEXT);
 }
 
 #endif
 #ifdef VK_EXT_full_screen_exclusive
 void reservedunmarshal_VkSurfaceFullScreenExclusiveInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSurfaceFullScreenExclusiveInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSurfaceFullScreenExclusiveInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -21808,30 +21509,29 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkFullScreenExclusiveEXT*)&forUnmarshaling->fullScreenExclusive, *ptr, sizeof(VkFullScreenExclusiveEXT));
+    memcpy((VkFullScreenExclusiveEXT*)&forUnmarshaling->fullScreenExclusive, *ptr,
+           sizeof(VkFullScreenExclusiveEXT));
     *ptr += sizeof(VkFullScreenExclusiveEXT);
 }
 
 void reservedunmarshal_VkSurfaceCapabilitiesFullScreenExclusiveEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSurfaceCapabilitiesFullScreenExclusiveEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSurfaceCapabilitiesFullScreenExclusiveEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -21839,30 +21539,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->fullScreenExclusiveSupported, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkSurfaceFullScreenExclusiveWin32InfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSurfaceFullScreenExclusiveWin32InfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSurfaceFullScreenExclusiveWin32InfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -21870,15 +21568,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((HMONITOR*)&forUnmarshaling->hmonitor, *ptr, sizeof(HMONITOR));
     *ptr += sizeof(HMONITOR);
@@ -21887,15 +21587,11 @@
 #endif
 #ifdef VK_EXT_headless_surface
 void reservedunmarshal_VkHeadlessSurfaceCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkHeadlessSurfaceCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkHeadlessSurfaceCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -21903,32 +21599,31 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkHeadlessSurfaceCreateFlagsEXT*)&forUnmarshaling->flags, *ptr, sizeof(VkHeadlessSurfaceCreateFlagsEXT));
+    memcpy((VkHeadlessSurfaceCreateFlagsEXT*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkHeadlessSurfaceCreateFlagsEXT));
     *ptr += sizeof(VkHeadlessSurfaceCreateFlagsEXT);
 }
 
 #endif
 #ifdef VK_EXT_line_rasterization
 void reservedunmarshal_VkPhysicalDeviceLineRasterizationFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceLineRasterizationFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceLineRasterizationFeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -21936,15 +21631,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->rectangularLines, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -21961,15 +21658,11 @@
 }
 
 void reservedunmarshal_VkPhysicalDeviceLineRasterizationPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceLineRasterizationPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceLineRasterizationPropertiesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -21977,30 +21670,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->lineSubPixelPrecisionBits, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
 void reservedunmarshal_VkPipelineRasterizationLineStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineRasterizationLineStateCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineRasterizationLineStateCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -22008,17 +21699,20 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkLineRasterizationModeEXT*)&forUnmarshaling->lineRasterizationMode, *ptr, sizeof(VkLineRasterizationModeEXT));
+    memcpy((VkLineRasterizationModeEXT*)&forUnmarshaling->lineRasterizationMode, *ptr,
+           sizeof(VkLineRasterizationModeEXT));
     *ptr += sizeof(VkLineRasterizationModeEXT);
     memcpy((VkBool32*)&forUnmarshaling->stippledLineEnable, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -22031,15 +21725,11 @@
 #endif
 #ifdef VK_EXT_shader_atomic_float
 void reservedunmarshal_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -22047,15 +21737,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->shaderBufferFloat32Atomics, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -22088,15 +21780,11 @@
 #endif
 #ifdef VK_EXT_index_type_uint8
 void reservedunmarshal_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceIndexTypeUint8FeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceIndexTypeUint8FeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -22104,15 +21792,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->indexTypeUint8, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -22121,15 +21811,11 @@
 #endif
 #ifdef VK_EXT_extended_dynamic_state
 void reservedunmarshal_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -22137,15 +21823,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->extendedDynamicState, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -22154,15 +21842,11 @@
 #endif
 #ifdef VK_EXT_shader_atomic_float2
 void reservedunmarshal_VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -22170,15 +21854,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->shaderBufferFloat16Atomics, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -22209,15 +21895,11 @@
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
 void reservedunmarshal_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -22225,15 +21907,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->shaderDemoteToHelperInvocation, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -22242,15 +21926,11 @@
 #endif
 #ifdef VK_NV_device_generated_commands
 void reservedunmarshal_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -22258,15 +21938,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->maxGraphicsShaderGroupCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -22280,24 +21962,23 @@
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->maxIndirectCommandsStreamStride, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->minSequencesCountBufferOffsetAlignment, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->minSequencesCountBufferOffsetAlignment, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->minSequencesIndexBufferOffsetAlignment, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->minSequencesIndexBufferOffsetAlignment, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->minIndirectCommandsBufferOffsetAlignment, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->minIndirectCommandsBufferOffsetAlignment, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
 void reservedunmarshal_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -22305,30 +21986,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->deviceGeneratedCommands, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkGraphicsShaderGroupCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkGraphicsShaderGroupCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkGraphicsShaderGroupCreateInfoNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -22336,53 +22015,58 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->stageCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pStages, forUnmarshaling->stageCount * sizeof(const VkPipelineShaderStageCreateInfo));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->stageCount; ++i)
-    {
-        reservedunmarshal_VkPipelineShaderStageCreateInfo(vkStream, rootType, (VkPipelineShaderStageCreateInfo*)(forUnmarshaling->pStages + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pStages,
+                    forUnmarshaling->stageCount * sizeof(const VkPipelineShaderStageCreateInfo));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->stageCount; ++i) {
+        reservedunmarshal_VkPipelineShaderStageCreateInfo(
+            vkStream, rootType, (VkPipelineShaderStageCreateInfo*)(forUnmarshaling->pStages + i),
+            ptr);
     }
     // WARNING PTR CHECK
     memcpy((VkPipelineVertexInputStateCreateInfo**)&forUnmarshaling->pVertexInputState, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pVertexInputState);
     *ptr += 8;
-    if (forUnmarshaling->pVertexInputState)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pVertexInputState, sizeof(const VkPipelineVertexInputStateCreateInfo));
-        reservedunmarshal_VkPipelineVertexInputStateCreateInfo(vkStream, rootType, (VkPipelineVertexInputStateCreateInfo*)(forUnmarshaling->pVertexInputState), ptr);
+    if (forUnmarshaling->pVertexInputState) {
+        vkStream->alloc((void**)&forUnmarshaling->pVertexInputState,
+                        sizeof(const VkPipelineVertexInputStateCreateInfo));
+        reservedunmarshal_VkPipelineVertexInputStateCreateInfo(
+            vkStream, rootType,
+            (VkPipelineVertexInputStateCreateInfo*)(forUnmarshaling->pVertexInputState), ptr);
     }
     // WARNING PTR CHECK
-    memcpy((VkPipelineTessellationStateCreateInfo**)&forUnmarshaling->pTessellationState, (*ptr), 8);
+    memcpy((VkPipelineTessellationStateCreateInfo**)&forUnmarshaling->pTessellationState, (*ptr),
+           8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pTessellationState);
     *ptr += 8;
-    if (forUnmarshaling->pTessellationState)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pTessellationState, sizeof(const VkPipelineTessellationStateCreateInfo));
-        reservedunmarshal_VkPipelineTessellationStateCreateInfo(vkStream, rootType, (VkPipelineTessellationStateCreateInfo*)(forUnmarshaling->pTessellationState), ptr);
+    if (forUnmarshaling->pTessellationState) {
+        vkStream->alloc((void**)&forUnmarshaling->pTessellationState,
+                        sizeof(const VkPipelineTessellationStateCreateInfo));
+        reservedunmarshal_VkPipelineTessellationStateCreateInfo(
+            vkStream, rootType,
+            (VkPipelineTessellationStateCreateInfo*)(forUnmarshaling->pTessellationState), ptr);
     }
 }
 
 void reservedunmarshal_VkGraphicsPipelineShaderGroupsCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkGraphicsPipelineShaderGroupsCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkGraphicsPipelineShaderGroupsCreateInfoNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -22390,57 +22074,55 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->groupCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pGroups, forUnmarshaling->groupCount * sizeof(const VkGraphicsShaderGroupCreateInfoNV));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->groupCount; ++i)
-    {
-        reservedunmarshal_VkGraphicsShaderGroupCreateInfoNV(vkStream, rootType, (VkGraphicsShaderGroupCreateInfoNV*)(forUnmarshaling->pGroups + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pGroups,
+                    forUnmarshaling->groupCount * sizeof(const VkGraphicsShaderGroupCreateInfoNV));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->groupCount; ++i) {
+        reservedunmarshal_VkGraphicsShaderGroupCreateInfoNV(
+            vkStream, rootType, (VkGraphicsShaderGroupCreateInfoNV*)(forUnmarshaling->pGroups + i),
+            ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->pipelineCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pPipelines, forUnmarshaling->pipelineCount * sizeof(const VkPipeline));
-    if (forUnmarshaling->pipelineCount)
-    {
+    vkStream->alloc((void**)&forUnmarshaling->pPipelines,
+                    forUnmarshaling->pipelineCount * sizeof(const VkPipeline));
+    if (forUnmarshaling->pipelineCount) {
         uint8_t* cgen_var_0_ptr = (uint8_t*)(*ptr);
         *ptr += 8 * forUnmarshaling->pipelineCount;
-        if (forUnmarshaling)
-        {
-            for (uint32_t k = 0; k < forUnmarshaling->pipelineCount; ++k)
-            {
-                uint64_t tmpval; memcpy(&tmpval, cgen_var_0_ptr + k * 8, sizeof(uint64_t));
-                *(((VkPipeline*)forUnmarshaling->pPipelines) + k) = (VkPipeline)unbox_VkPipeline((VkPipeline)tmpval);
+        if (forUnmarshaling) {
+            for (uint32_t k = 0; k < forUnmarshaling->pipelineCount; ++k) {
+                uint64_t tmpval;
+                memcpy(&tmpval, cgen_var_0_ptr + k * 8, sizeof(uint64_t));
+                *(((VkPipeline*)forUnmarshaling->pPipelines) + k) =
+                    (VkPipeline)unbox_VkPipeline((VkPipeline)tmpval);
             }
         }
     }
 }
 
 void reservedunmarshal_VkBindShaderGroupIndirectCommandNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindShaderGroupIndirectCommandNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBindShaderGroupIndirectCommandNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((uint32_t*)&forUnmarshaling->groupIndex, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
 void reservedunmarshal_VkBindIndexBufferIndirectCommandNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindIndexBufferIndirectCommandNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBindIndexBufferIndirectCommandNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkDeviceAddress*)&forUnmarshaling->bufferAddress, *ptr, sizeof(VkDeviceAddress));
     *ptr += sizeof(VkDeviceAddress);
     memcpy((uint32_t*)&forUnmarshaling->size, *ptr, sizeof(uint32_t));
@@ -22450,11 +22132,8 @@
 }
 
 void reservedunmarshal_VkBindVertexBufferIndirectCommandNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindVertexBufferIndirectCommandNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBindVertexBufferIndirectCommandNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkDeviceAddress*)&forUnmarshaling->bufferAddress, *ptr, sizeof(VkDeviceAddress));
     *ptr += sizeof(VkDeviceAddress);
     memcpy((uint32_t*)&forUnmarshaling->size, *ptr, sizeof(uint32_t));
@@ -22464,21 +22143,15 @@
 }
 
 void reservedunmarshal_VkSetStateFlagsIndirectCommandNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSetStateFlagsIndirectCommandNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSetStateFlagsIndirectCommandNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((uint32_t*)&forUnmarshaling->data, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkIndirectCommandsStreamNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkIndirectCommandsStreamNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkIndirectCommandsStreamNV(VulkanStream* vkStream, VkStructureType rootType,
+                                                  VkIndirectCommandsStreamNV* forUnmarshaling,
+                                                  uint8_t** ptr) {
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
@@ -22488,15 +22161,11 @@
 }
 
 void reservedunmarshal_VkIndirectCommandsLayoutTokenNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkIndirectCommandsLayoutTokenNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkIndirectCommandsLayoutTokenNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -22504,17 +22173,20 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkIndirectCommandsTokenTypeNV*)&forUnmarshaling->tokenType, *ptr, sizeof(VkIndirectCommandsTokenTypeNV));
+    memcpy((VkIndirectCommandsTokenTypeNV*)&forUnmarshaling->tokenType, *ptr,
+           sizeof(VkIndirectCommandsTokenTypeNV));
     *ptr += sizeof(VkIndirectCommandsTokenTypeNV);
     memcpy((uint32_t*)&forUnmarshaling->stream, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -22527,35 +22199,38 @@
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkPipelineLayout*)&forUnmarshaling->pushconstantPipelineLayout = (VkPipelineLayout)unbox_VkPipelineLayout((VkPipelineLayout)(*&cgen_var_0));
-    memcpy((VkShaderStageFlags*)&forUnmarshaling->pushconstantShaderStageFlags, *ptr, sizeof(VkShaderStageFlags));
+    *(VkPipelineLayout*)&forUnmarshaling->pushconstantPipelineLayout =
+        (VkPipelineLayout)unbox_VkPipelineLayout((VkPipelineLayout)(*&cgen_var_0));
+    memcpy((VkShaderStageFlags*)&forUnmarshaling->pushconstantShaderStageFlags, *ptr,
+           sizeof(VkShaderStageFlags));
     *ptr += sizeof(VkShaderStageFlags);
     memcpy((uint32_t*)&forUnmarshaling->pushconstantOffset, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->pushconstantSize, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((VkIndirectStateFlagsNV*)&forUnmarshaling->indirectStateFlags, *ptr, sizeof(VkIndirectStateFlagsNV));
+    memcpy((VkIndirectStateFlagsNV*)&forUnmarshaling->indirectStateFlags, *ptr,
+           sizeof(VkIndirectStateFlagsNV));
     *ptr += sizeof(VkIndirectStateFlagsNV);
     memcpy((uint32_t*)&forUnmarshaling->indexTypeCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pIndexTypes, forUnmarshaling->indexTypeCount * sizeof(const VkIndexType));
-    memcpy((VkIndexType*)forUnmarshaling->pIndexTypes, *ptr, forUnmarshaling->indexTypeCount * sizeof(const VkIndexType));
+    vkStream->alloc((void**)&forUnmarshaling->pIndexTypes,
+                    forUnmarshaling->indexTypeCount * sizeof(const VkIndexType));
+    memcpy((VkIndexType*)forUnmarshaling->pIndexTypes, *ptr,
+           forUnmarshaling->indexTypeCount * sizeof(const VkIndexType));
     *ptr += forUnmarshaling->indexTypeCount * sizeof(const VkIndexType);
-    vkStream->alloc((void**)&forUnmarshaling->pIndexTypeValues, forUnmarshaling->indexTypeCount * sizeof(const uint32_t));
-    memcpy((uint32_t*)forUnmarshaling->pIndexTypeValues, *ptr, forUnmarshaling->indexTypeCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pIndexTypeValues,
+                    forUnmarshaling->indexTypeCount * sizeof(const uint32_t));
+    memcpy((uint32_t*)forUnmarshaling->pIndexTypeValues, *ptr,
+           forUnmarshaling->indexTypeCount * sizeof(const uint32_t));
     *ptr += forUnmarshaling->indexTypeCount * sizeof(const uint32_t);
 }
 
 void reservedunmarshal_VkIndirectCommandsLayoutCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkIndirectCommandsLayoutCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkIndirectCommandsLayoutCreateInfoNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -22563,44 +22238,48 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkIndirectCommandsLayoutUsageFlagsNV*)&forUnmarshaling->flags, *ptr, sizeof(VkIndirectCommandsLayoutUsageFlagsNV));
+    memcpy((VkIndirectCommandsLayoutUsageFlagsNV*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkIndirectCommandsLayoutUsageFlagsNV));
     *ptr += sizeof(VkIndirectCommandsLayoutUsageFlagsNV);
-    memcpy((VkPipelineBindPoint*)&forUnmarshaling->pipelineBindPoint, *ptr, sizeof(VkPipelineBindPoint));
+    memcpy((VkPipelineBindPoint*)&forUnmarshaling->pipelineBindPoint, *ptr,
+           sizeof(VkPipelineBindPoint));
     *ptr += sizeof(VkPipelineBindPoint);
     memcpy((uint32_t*)&forUnmarshaling->tokenCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pTokens, forUnmarshaling->tokenCount * sizeof(const VkIndirectCommandsLayoutTokenNV));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->tokenCount; ++i)
-    {
-        reservedunmarshal_VkIndirectCommandsLayoutTokenNV(vkStream, rootType, (VkIndirectCommandsLayoutTokenNV*)(forUnmarshaling->pTokens + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pTokens,
+                    forUnmarshaling->tokenCount * sizeof(const VkIndirectCommandsLayoutTokenNV));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->tokenCount; ++i) {
+        reservedunmarshal_VkIndirectCommandsLayoutTokenNV(
+            vkStream, rootType, (VkIndirectCommandsLayoutTokenNV*)(forUnmarshaling->pTokens + i),
+            ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->streamCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pStreamStrides, forUnmarshaling->streamCount * sizeof(const uint32_t));
-    memcpy((uint32_t*)forUnmarshaling->pStreamStrides, *ptr, forUnmarshaling->streamCount * sizeof(const uint32_t));
+    vkStream->alloc((void**)&forUnmarshaling->pStreamStrides,
+                    forUnmarshaling->streamCount * sizeof(const uint32_t));
+    memcpy((uint32_t*)forUnmarshaling->pStreamStrides, *ptr,
+           forUnmarshaling->streamCount * sizeof(const uint32_t));
     *ptr += forUnmarshaling->streamCount * sizeof(const uint32_t);
 }
 
-void reservedunmarshal_VkGeneratedCommandsInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkGeneratedCommandsInfoNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkGeneratedCommandsInfoNV(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkGeneratedCommandsInfoNV* forUnmarshaling,
+                                                 uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -22608,39 +22287,47 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkPipelineBindPoint*)&forUnmarshaling->pipelineBindPoint, *ptr, sizeof(VkPipelineBindPoint));
+    memcpy((VkPipelineBindPoint*)&forUnmarshaling->pipelineBindPoint, *ptr,
+           sizeof(VkPipelineBindPoint));
     *ptr += sizeof(VkPipelineBindPoint);
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkPipeline*)&forUnmarshaling->pipeline = (VkPipeline)unbox_VkPipeline((VkPipeline)(*&cgen_var_0));
+    *(VkPipeline*)&forUnmarshaling->pipeline =
+        (VkPipeline)unbox_VkPipeline((VkPipeline)(*&cgen_var_0));
     uint64_t cgen_var_1;
     memcpy((uint64_t*)&cgen_var_1, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkIndirectCommandsLayoutNV*)&forUnmarshaling->indirectCommandsLayout = (VkIndirectCommandsLayoutNV)unbox_VkIndirectCommandsLayoutNV((VkIndirectCommandsLayoutNV)(*&cgen_var_1));
+    *(VkIndirectCommandsLayoutNV*)&forUnmarshaling->indirectCommandsLayout =
+        (VkIndirectCommandsLayoutNV)unbox_VkIndirectCommandsLayoutNV(
+            (VkIndirectCommandsLayoutNV)(*&cgen_var_1));
     memcpy((uint32_t*)&forUnmarshaling->streamCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pStreams, forUnmarshaling->streamCount * sizeof(const VkIndirectCommandsStreamNV));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->streamCount; ++i)
-    {
-        reservedunmarshal_VkIndirectCommandsStreamNV(vkStream, rootType, (VkIndirectCommandsStreamNV*)(forUnmarshaling->pStreams + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pStreams,
+                    forUnmarshaling->streamCount * sizeof(const VkIndirectCommandsStreamNV));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->streamCount; ++i) {
+        reservedunmarshal_VkIndirectCommandsStreamNV(
+            vkStream, rootType, (VkIndirectCommandsStreamNV*)(forUnmarshaling->pStreams + i), ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->sequencesCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     uint64_t cgen_var_2;
     memcpy((uint64_t*)&cgen_var_2, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkBuffer*)&forUnmarshaling->preprocessBuffer = (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_2));
+    *(VkBuffer*)&forUnmarshaling->preprocessBuffer =
+        (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_2));
     memcpy((VkDeviceSize*)&forUnmarshaling->preprocessOffset, *ptr, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
     memcpy((VkDeviceSize*)&forUnmarshaling->preprocessSize, *ptr, sizeof(VkDeviceSize));
@@ -22648,27 +22335,25 @@
     uint64_t cgen_var_3;
     memcpy((uint64_t*)&cgen_var_3, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkBuffer*)&forUnmarshaling->sequencesCountBuffer = (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_3));
+    *(VkBuffer*)&forUnmarshaling->sequencesCountBuffer =
+        (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_3));
     memcpy((VkDeviceSize*)&forUnmarshaling->sequencesCountOffset, *ptr, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
     uint64_t cgen_var_4;
     memcpy((uint64_t*)&cgen_var_4, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkBuffer*)&forUnmarshaling->sequencesIndexBuffer = (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_4));
+    *(VkBuffer*)&forUnmarshaling->sequencesIndexBuffer =
+        (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_4));
     memcpy((VkDeviceSize*)&forUnmarshaling->sequencesIndexOffset, *ptr, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
 }
 
 void reservedunmarshal_VkGeneratedCommandsMemoryRequirementsInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkGeneratedCommandsMemoryRequirementsInfoNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkGeneratedCommandsMemoryRequirementsInfoNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -22676,26 +22361,32 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkPipelineBindPoint*)&forUnmarshaling->pipelineBindPoint, *ptr, sizeof(VkPipelineBindPoint));
+    memcpy((VkPipelineBindPoint*)&forUnmarshaling->pipelineBindPoint, *ptr,
+           sizeof(VkPipelineBindPoint));
     *ptr += sizeof(VkPipelineBindPoint);
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkPipeline*)&forUnmarshaling->pipeline = (VkPipeline)unbox_VkPipeline((VkPipeline)(*&cgen_var_0));
+    *(VkPipeline*)&forUnmarshaling->pipeline =
+        (VkPipeline)unbox_VkPipeline((VkPipeline)(*&cgen_var_0));
     uint64_t cgen_var_1;
     memcpy((uint64_t*)&cgen_var_1, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkIndirectCommandsLayoutNV*)&forUnmarshaling->indirectCommandsLayout = (VkIndirectCommandsLayoutNV)unbox_VkIndirectCommandsLayoutNV((VkIndirectCommandsLayoutNV)(*&cgen_var_1));
+    *(VkIndirectCommandsLayoutNV*)&forUnmarshaling->indirectCommandsLayout =
+        (VkIndirectCommandsLayoutNV)unbox_VkIndirectCommandsLayoutNV(
+            (VkIndirectCommandsLayoutNV)(*&cgen_var_1));
     memcpy((uint32_t*)&forUnmarshaling->maxSequencesCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
@@ -22703,15 +22394,11 @@
 #endif
 #ifdef VK_NV_inherited_viewport_scissor
 void reservedunmarshal_VkPhysicalDeviceInheritedViewportScissorFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceInheritedViewportScissorFeaturesNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceInheritedViewportScissorFeaturesNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -22719,30 +22406,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->inheritedViewportScissor2D, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkCommandBufferInheritanceViewportScissorInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCommandBufferInheritanceViewportScissorInfoNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkCommandBufferInheritanceViewportScissorInfoNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -22750,15 +22435,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->viewportScissor2D, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -22768,25 +22455,21 @@
     memcpy((VkViewport**)&forUnmarshaling->pViewportDepths, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pViewportDepths);
     *ptr += 8;
-    if (forUnmarshaling->pViewportDepths)
-    {
+    if (forUnmarshaling->pViewportDepths) {
         vkStream->alloc((void**)&forUnmarshaling->pViewportDepths, sizeof(const VkViewport));
-        reservedunmarshal_VkViewport(vkStream, rootType, (VkViewport*)(forUnmarshaling->pViewportDepths), ptr);
+        reservedunmarshal_VkViewport(vkStream, rootType,
+                                     (VkViewport*)(forUnmarshaling->pViewportDepths), ptr);
     }
 }
 
 #endif
 #ifdef VK_EXT_texel_buffer_alignment
 void reservedunmarshal_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -22794,30 +22477,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->texelBufferAlignment, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -22825,38 +22506,40 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkDeviceSize*)&forUnmarshaling->storageTexelBufferOffsetAlignmentBytes, *ptr, sizeof(VkDeviceSize));
+    memcpy((VkDeviceSize*)&forUnmarshaling->storageTexelBufferOffsetAlignmentBytes, *ptr,
+           sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
-    memcpy((VkBool32*)&forUnmarshaling->storageTexelBufferOffsetSingleTexelAlignment, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->storageTexelBufferOffsetSingleTexelAlignment, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkDeviceSize*)&forUnmarshaling->uniformTexelBufferOffsetAlignmentBytes, *ptr, sizeof(VkDeviceSize));
+    memcpy((VkDeviceSize*)&forUnmarshaling->uniformTexelBufferOffsetAlignmentBytes, *ptr,
+           sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
-    memcpy((VkBool32*)&forUnmarshaling->uniformTexelBufferOffsetSingleTexelAlignment, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->uniformTexelBufferOffsetSingleTexelAlignment, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 #endif
 #ifdef VK_QCOM_render_pass_transform
 void reservedunmarshal_VkRenderPassTransformBeginInfoQCOM(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderPassTransformBeginInfoQCOM* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkRenderPassTransformBeginInfoQCOM* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -22864,30 +22547,29 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkSurfaceTransformFlagBitsKHR*)&forUnmarshaling->transform, *ptr, sizeof(VkSurfaceTransformFlagBitsKHR));
+    memcpy((VkSurfaceTransformFlagBitsKHR*)&forUnmarshaling->transform, *ptr,
+           sizeof(VkSurfaceTransformFlagBitsKHR));
     *ptr += sizeof(VkSurfaceTransformFlagBitsKHR);
 }
 
 void reservedunmarshal_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCommandBufferInheritanceRenderPassTransformInfoQCOM* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkCommandBufferInheritanceRenderPassTransformInfoQCOM* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -22895,17 +22577,20 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkSurfaceTransformFlagBitsKHR*)&forUnmarshaling->transform, *ptr, sizeof(VkSurfaceTransformFlagBitsKHR));
+    memcpy((VkSurfaceTransformFlagBitsKHR*)&forUnmarshaling->transform, *ptr,
+           sizeof(VkSurfaceTransformFlagBitsKHR));
     *ptr += sizeof(VkSurfaceTransformFlagBitsKHR);
     reservedunmarshal_VkRect2D(vkStream, rootType, (VkRect2D*)(&forUnmarshaling->renderArea), ptr);
 }
@@ -22913,15 +22598,11 @@
 #endif
 #ifdef VK_EXT_device_memory_report
 void reservedunmarshal_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -22929,30 +22610,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->deviceMemoryReport, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkDeviceMemoryReportCallbackDataEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceMemoryReportCallbackDataEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDeviceMemoryReportCallbackDataEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -22960,19 +22639,23 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkDeviceMemoryReportFlagsEXT*)&forUnmarshaling->flags, *ptr, sizeof(VkDeviceMemoryReportFlagsEXT));
+    memcpy((VkDeviceMemoryReportFlagsEXT*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkDeviceMemoryReportFlagsEXT));
     *ptr += sizeof(VkDeviceMemoryReportFlagsEXT);
-    memcpy((VkDeviceMemoryReportEventTypeEXT*)&forUnmarshaling->type, *ptr, sizeof(VkDeviceMemoryReportEventTypeEXT));
+    memcpy((VkDeviceMemoryReportEventTypeEXT*)&forUnmarshaling->type, *ptr,
+           sizeof(VkDeviceMemoryReportEventTypeEXT));
     *ptr += sizeof(VkDeviceMemoryReportEventTypeEXT);
     memcpy((uint64_t*)&forUnmarshaling->memoryObjectId, *ptr, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
@@ -22987,15 +22670,11 @@
 }
 
 void reservedunmarshal_VkDeviceDeviceMemoryReportCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceDeviceMemoryReportCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDeviceDeviceMemoryReportCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -23003,17 +22682,20 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkDeviceMemoryReportFlagsEXT*)&forUnmarshaling->flags, *ptr, sizeof(VkDeviceMemoryReportFlagsEXT));
+    memcpy((VkDeviceMemoryReportFlagsEXT*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkDeviceMemoryReportFlagsEXT));
     *ptr += sizeof(VkDeviceMemoryReportFlagsEXT);
     memcpy((PFN_vkDeviceMemoryReportCallbackEXT*)&forUnmarshaling->pfnUserCallback, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pfnUserCallback);
@@ -23028,15 +22710,11 @@
 #endif
 #ifdef VK_EXT_robustness2
 void reservedunmarshal_VkPhysicalDeviceRobustness2FeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceRobustness2FeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceRobustness2FeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -23044,15 +22722,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->robustBufferAccess2, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -23063,15 +22743,11 @@
 }
 
 void reservedunmarshal_VkPhysicalDeviceRobustness2PropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceRobustness2PropertiesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceRobustness2PropertiesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -23079,34 +22755,34 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkDeviceSize*)&forUnmarshaling->robustStorageBufferAccessSizeAlignment, *ptr, sizeof(VkDeviceSize));
+    memcpy((VkDeviceSize*)&forUnmarshaling->robustStorageBufferAccessSizeAlignment, *ptr,
+           sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
-    memcpy((VkDeviceSize*)&forUnmarshaling->robustUniformBufferAccessSizeAlignment, *ptr, sizeof(VkDeviceSize));
+    memcpy((VkDeviceSize*)&forUnmarshaling->robustUniformBufferAccessSizeAlignment, *ptr,
+           sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
 }
 
 #endif
 #ifdef VK_EXT_custom_border_color
 void reservedunmarshal_VkSamplerCustomBorderColorCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSamplerCustomBorderColorCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSamplerCustomBorderColorCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -23114,31 +22790,30 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    reservedunmarshal_VkClearColorValue(vkStream, rootType, (VkClearColorValue*)(&forUnmarshaling->customBorderColor), ptr);
+    reservedunmarshal_VkClearColorValue(
+        vkStream, rootType, (VkClearColorValue*)(&forUnmarshaling->customBorderColor), ptr);
     memcpy((VkFormat*)&forUnmarshaling->format, *ptr, sizeof(VkFormat));
     *ptr += sizeof(VkFormat);
 }
 
 void reservedunmarshal_VkPhysicalDeviceCustomBorderColorPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceCustomBorderColorPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceCustomBorderColorPropertiesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -23146,30 +22821,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->maxCustomBorderColorSamplers, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
 void reservedunmarshal_VkPhysicalDeviceCustomBorderColorFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceCustomBorderColorFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceCustomBorderColorFeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -23177,15 +22850,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->customBorderColors, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -23198,15 +22873,11 @@
 #endif
 #ifdef VK_EXT_private_data
 void reservedunmarshal_VkPhysicalDevicePrivateDataFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePrivateDataFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePrivateDataFeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -23214,30 +22885,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->privateData, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkDevicePrivateDataCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDevicePrivateDataCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDevicePrivateDataCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -23245,30 +22914,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->privateDataSlotRequestCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
 void reservedunmarshal_VkPrivateDataSlotCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPrivateDataSlotCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPrivateDataSlotCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -23276,32 +22943,31 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkPrivateDataSlotCreateFlagsEXT*)&forUnmarshaling->flags, *ptr, sizeof(VkPrivateDataSlotCreateFlagsEXT));
+    memcpy((VkPrivateDataSlotCreateFlagsEXT*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkPrivateDataSlotCreateFlagsEXT));
     *ptr += sizeof(VkPrivateDataSlotCreateFlagsEXT);
 }
 
 #endif
 #ifdef VK_EXT_pipeline_creation_cache_control
 void reservedunmarshal_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -23309,15 +22975,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->pipelineCreationCacheControl, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -23326,15 +22994,11 @@
 #endif
 #ifdef VK_NV_device_diagnostics_config
 void reservedunmarshal_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDiagnosticsConfigFeaturesNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceDiagnosticsConfigFeaturesNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -23342,30 +23006,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->diagnosticsConfig, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkDeviceDiagnosticsConfigCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceDiagnosticsConfigCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDeviceDiagnosticsConfigCreateInfoNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -23373,17 +23035,20 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkDeviceDiagnosticsConfigFlagsNV*)&forUnmarshaling->flags, *ptr, sizeof(VkDeviceDiagnosticsConfigFlagsNV));
+    memcpy((VkDeviceDiagnosticsConfigFlagsNV*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkDeviceDiagnosticsConfigFlagsNV));
     *ptr += sizeof(VkDeviceDiagnosticsConfigFlagsNV);
 }
 
@@ -23392,15 +23057,11 @@
 #endif
 #ifdef VK_NV_fragment_shading_rate_enums
 void reservedunmarshal_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -23408,15 +23069,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->fragmentShadingRateEnums, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -23427,15 +23090,11 @@
 }
 
 void reservedunmarshal_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -23443,30 +23102,29 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkSampleCountFlagBits*)&forUnmarshaling->maxFragmentShadingRateInvocationCount, *ptr, sizeof(VkSampleCountFlagBits));
+    memcpy((VkSampleCountFlagBits*)&forUnmarshaling->maxFragmentShadingRateInvocationCount, *ptr,
+           sizeof(VkSampleCountFlagBits));
     *ptr += sizeof(VkSampleCountFlagBits);
 }
 
 void reservedunmarshal_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineFragmentShadingRateEnumStateCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineFragmentShadingRateEnumStateCreateInfoNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -23474,46 +23132,45 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkFragmentShadingRateTypeNV*)&forUnmarshaling->shadingRateType, *ptr, sizeof(VkFragmentShadingRateTypeNV));
+    memcpy((VkFragmentShadingRateTypeNV*)&forUnmarshaling->shadingRateType, *ptr,
+           sizeof(VkFragmentShadingRateTypeNV));
     *ptr += sizeof(VkFragmentShadingRateTypeNV);
-    memcpy((VkFragmentShadingRateNV*)&forUnmarshaling->shadingRate, *ptr, sizeof(VkFragmentShadingRateNV));
+    memcpy((VkFragmentShadingRateNV*)&forUnmarshaling->shadingRate, *ptr,
+           sizeof(VkFragmentShadingRateNV));
     *ptr += sizeof(VkFragmentShadingRateNV);
-    memcpy((VkFragmentShadingRateCombinerOpKHR*)forUnmarshaling->combinerOps, *ptr, 2 * sizeof(VkFragmentShadingRateCombinerOpKHR));
+    memcpy((VkFragmentShadingRateCombinerOpKHR*)forUnmarshaling->combinerOps, *ptr,
+           2 * sizeof(VkFragmentShadingRateCombinerOpKHR));
     *ptr += 2 * sizeof(VkFragmentShadingRateCombinerOpKHR);
 }
 
 #endif
 #ifdef VK_NV_ray_tracing_motion_blur
-void reservedunmarshal_VkDeviceOrHostAddressConstKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceOrHostAddressConstKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDeviceOrHostAddressConstKHR(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkDeviceOrHostAddressConstKHR* forUnmarshaling,
+                                                     uint8_t** ptr) {
     memcpy((VkDeviceAddress*)&forUnmarshaling->deviceAddress, *ptr, sizeof(VkDeviceAddress));
     *ptr += sizeof(VkDeviceAddress);
 }
 
 void reservedunmarshal_VkAccelerationStructureGeometryMotionTrianglesDataNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureGeometryMotionTrianglesDataNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureGeometryMotionTrianglesDataNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -23521,29 +23178,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    reservedunmarshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forUnmarshaling->vertexData), ptr);
+    reservedunmarshal_VkDeviceOrHostAddressConstKHR(
+        vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forUnmarshaling->vertexData), ptr);
 }
 
 void reservedunmarshal_VkAccelerationStructureMotionInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureMotionInfoNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureMotionInfoNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -23551,54 +23207,51 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->maxInstances, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((VkAccelerationStructureMotionInfoFlagsNV*)&forUnmarshaling->flags, *ptr, sizeof(VkAccelerationStructureMotionInfoFlagsNV));
+    memcpy((VkAccelerationStructureMotionInfoFlagsNV*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkAccelerationStructureMotionInfoFlagsNV));
     *ptr += sizeof(VkAccelerationStructureMotionInfoFlagsNV);
 }
 
 void reservedunmarshal_VkAccelerationStructureMatrixMotionInstanceNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureMatrixMotionInstanceNV* forUnmarshaling,
-    uint8_t** ptr)
-{
-    
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureMatrixMotionInstanceNV* forUnmarshaling, uint8_t** ptr) {
     typedef struct VkAccelerationStructureMatrixMotionInstanceNVWithoutBitFields {
-        VkTransformMatrixKHR          transformT0;
-        VkTransformMatrixKHR          transformT1;
-        uint32_t                      dwords[2];
-        uint64_t                      accelerationStructureReference;
+        VkTransformMatrixKHR transformT0;
+        VkTransformMatrixKHR transformT1;
+        uint32_t dwords[2];
+        uint64_t accelerationStructureReference;
     } VkAccelerationStructureMatrixMotionInstanceNVWithoutBitFields;
-    
-    VkAccelerationStructureMatrixMotionInstanceNVWithoutBitFields* forUnmarshaling_new = (VkAccelerationStructureMatrixMotionInstanceNVWithoutBitFields*)(forUnmarshaling);
-    reservedunmarshal_VkTransformMatrixKHR(vkStream, rootType, (VkTransformMatrixKHR*)(&forUnmarshaling_new->transformT0), ptr);
-    reservedunmarshal_VkTransformMatrixKHR(vkStream, rootType, (VkTransformMatrixKHR*)(&forUnmarshaling_new->transformT1), ptr);
+
+    VkAccelerationStructureMatrixMotionInstanceNVWithoutBitFields* forUnmarshaling_new =
+        (VkAccelerationStructureMatrixMotionInstanceNVWithoutBitFields*)(forUnmarshaling);
+    reservedunmarshal_VkTransformMatrixKHR(
+        vkStream, rootType, (VkTransformMatrixKHR*)(&forUnmarshaling_new->transformT0), ptr);
+    reservedunmarshal_VkTransformMatrixKHR(
+        vkStream, rootType, (VkTransformMatrixKHR*)(&forUnmarshaling_new->transformT1), ptr);
     for (uint32_t i = 0; i < 2; i++) {
         memcpy((uint32_t*)&(forUnmarshaling_new->dwords[i]), *ptr, sizeof(uint32_t));
         *ptr += sizeof(uint32_t);
     }
     memcpy((uint64_t*)&forUnmarshaling_new->accelerationStructureReference, *ptr, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
-    
 }
 
-void reservedunmarshal_VkSRTDataNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSRTDataNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkSRTDataNV(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkSRTDataNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((float*)&forUnmarshaling->sx, *ptr, sizeof(float));
     *ptr += sizeof(float);
     memcpy((float*)&forUnmarshaling->a, *ptr, sizeof(float));
@@ -23634,63 +23287,57 @@
 }
 
 void reservedunmarshal_VkAccelerationStructureSRTMotionInstanceNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureSRTMotionInstanceNV* forUnmarshaling,
-    uint8_t** ptr)
-{
-    
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureSRTMotionInstanceNV* forUnmarshaling, uint8_t** ptr) {
     typedef struct VkAccelerationStructureSRTMotionInstanceNVWithoutBitFields {
-        VkSRTDataNV          transformT0;
-        VkSRTDataNV          transformT1;
-        uint32_t             dwords[2];
-        uint64_t             accelerationStructureReference;
+        VkSRTDataNV transformT0;
+        VkSRTDataNV transformT1;
+        uint32_t dwords[2];
+        uint64_t accelerationStructureReference;
     } VkAccelerationStructureSRTMotionInstanceNVWithoutBitFields;
-    
-    VkAccelerationStructureSRTMotionInstanceNVWithoutBitFields* forUnmarshaling_new = (VkAccelerationStructureSRTMotionInstanceNVWithoutBitFields*)(forUnmarshaling);
-    reservedunmarshal_VkSRTDataNV(vkStream, rootType, (VkSRTDataNV*)(&forUnmarshaling_new->transformT0), ptr);
-    reservedunmarshal_VkSRTDataNV(vkStream, rootType, (VkSRTDataNV*)(&forUnmarshaling_new->transformT1), ptr);
+
+    VkAccelerationStructureSRTMotionInstanceNVWithoutBitFields* forUnmarshaling_new =
+        (VkAccelerationStructureSRTMotionInstanceNVWithoutBitFields*)(forUnmarshaling);
+    reservedunmarshal_VkSRTDataNV(vkStream, rootType,
+                                  (VkSRTDataNV*)(&forUnmarshaling_new->transformT0), ptr);
+    reservedunmarshal_VkSRTDataNV(vkStream, rootType,
+                                  (VkSRTDataNV*)(&forUnmarshaling_new->transformT1), ptr);
     for (uint32_t i = 0; i < 2; i++) {
         memcpy((uint32_t*)&(forUnmarshaling_new->dwords[i]), *ptr, sizeof(uint32_t));
         *ptr += sizeof(uint32_t);
     }
     memcpy((uint64_t*)&forUnmarshaling_new->accelerationStructureReference, *ptr, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
-    
 }
 
 void reservedunmarshal_VkAccelerationStructureMotionInstanceDataNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureMotionInstanceDataNV* forUnmarshaling,
-    uint8_t** ptr)
-{
-    reservedunmarshal_VkAccelerationStructureInstanceKHR(vkStream, rootType, (VkAccelerationStructureInstanceKHR*)(&forUnmarshaling->staticInstance), ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureMotionInstanceDataNV* forUnmarshaling, uint8_t** ptr) {
+    reservedunmarshal_VkAccelerationStructureInstanceKHR(
+        vkStream, rootType, (VkAccelerationStructureInstanceKHR*)(&forUnmarshaling->staticInstance),
+        ptr);
 }
 
 void reservedunmarshal_VkAccelerationStructureMotionInstanceNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureMotionInstanceNV* forUnmarshaling,
-    uint8_t** ptr)
-{
-    memcpy((VkAccelerationStructureMotionInstanceTypeNV*)&forUnmarshaling->type, *ptr, sizeof(VkAccelerationStructureMotionInstanceTypeNV));
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureMotionInstanceNV* forUnmarshaling, uint8_t** ptr) {
+    memcpy((VkAccelerationStructureMotionInstanceTypeNV*)&forUnmarshaling->type, *ptr,
+           sizeof(VkAccelerationStructureMotionInstanceTypeNV));
     *ptr += sizeof(VkAccelerationStructureMotionInstanceTypeNV);
-    memcpy((VkAccelerationStructureMotionInstanceFlagsNV*)&forUnmarshaling->flags, *ptr, sizeof(VkAccelerationStructureMotionInstanceFlagsNV));
+    memcpy((VkAccelerationStructureMotionInstanceFlagsNV*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkAccelerationStructureMotionInstanceFlagsNV));
     *ptr += sizeof(VkAccelerationStructureMotionInstanceFlagsNV);
-    reservedunmarshal_VkAccelerationStructureMotionInstanceDataNV(vkStream, rootType, (VkAccelerationStructureMotionInstanceDataNV*)(&forUnmarshaling->data), ptr);
+    reservedunmarshal_VkAccelerationStructureMotionInstanceDataNV(
+        vkStream, rootType, (VkAccelerationStructureMotionInstanceDataNV*)(&forUnmarshaling->data),
+        ptr);
 }
 
 void reservedunmarshal_VkPhysicalDeviceRayTracingMotionBlurFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceRayTracingMotionBlurFeaturesNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceRayTracingMotionBlurFeaturesNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -23698,34 +23345,33 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->rayTracingMotionBlur, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->rayTracingMotionBlurPipelineTraceRaysIndirect, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->rayTracingMotionBlurPipelineTraceRaysIndirect, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 #endif
 #ifdef VK_EXT_ycbcr_2plane_444_formats
 void reservedunmarshal_VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -23733,15 +23379,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->ycbcr2plane444Formats, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -23750,15 +23398,11 @@
 #endif
 #ifdef VK_EXT_fragment_density_map2
 void reservedunmarshal_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -23766,30 +23410,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->fragmentDensityMapDeferred, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -23797,19 +23439,22 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->subsampledLoads, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->subsampledCoarseReconstructionEarlyAccess, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->subsampledCoarseReconstructionEarlyAccess, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy((uint32_t*)&forUnmarshaling->maxSubsampledArrayLayers, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -23820,15 +23465,11 @@
 #endif
 #ifdef VK_QCOM_rotated_copy_commands
 void reservedunmarshal_VkCopyCommandTransformInfoQCOM(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCopyCommandTransformInfoQCOM* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkCopyCommandTransformInfoQCOM* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -23836,32 +23477,31 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkSurfaceTransformFlagBitsKHR*)&forUnmarshaling->transform, *ptr, sizeof(VkSurfaceTransformFlagBitsKHR));
+    memcpy((VkSurfaceTransformFlagBitsKHR*)&forUnmarshaling->transform, *ptr,
+           sizeof(VkSurfaceTransformFlagBitsKHR));
     *ptr += sizeof(VkSurfaceTransformFlagBitsKHR);
 }
 
 #endif
 #ifdef VK_EXT_image_robustness
 void reservedunmarshal_VkPhysicalDeviceImageRobustnessFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceImageRobustnessFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceImageRobustnessFeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -23869,15 +23509,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->robustImageAccess, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -23886,15 +23528,11 @@
 #endif
 #ifdef VK_EXT_4444_formats
 void reservedunmarshal_VkPhysicalDevice4444FormatsFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevice4444FormatsFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevice4444FormatsFeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -23902,15 +23540,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->formatA4R4G4B4, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -23921,15 +23561,11 @@
 #endif
 #ifdef VK_EXT_rgba10x6_formats
 void reservedunmarshal_VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -23937,15 +23573,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->formatRgba10x6WithoutYCbCrSampler, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -23956,15 +23594,11 @@
 #endif
 #ifdef VK_EXT_directfb_surface
 void reservedunmarshal_VkDirectFBSurfaceCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDirectFBSurfaceCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDirectFBSurfaceCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -23972,24 +23606,26 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkDirectFBSurfaceCreateFlagsEXT*)&forUnmarshaling->flags, *ptr, sizeof(VkDirectFBSurfaceCreateFlagsEXT));
+    memcpy((VkDirectFBSurfaceCreateFlagsEXT*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkDirectFBSurfaceCreateFlagsEXT));
     *ptr += sizeof(VkDirectFBSurfaceCreateFlagsEXT);
     // WARNING PTR CHECK
     memcpy((IDirectFB**)&forUnmarshaling->dfb, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->dfb);
     *ptr += 8;
-    if (forUnmarshaling->dfb)
-    {
+    if (forUnmarshaling->dfb) {
         vkStream->alloc((void**)&forUnmarshaling->dfb, sizeof(IDirectFB));
         memcpy((IDirectFB*)forUnmarshaling->dfb, *ptr, sizeof(IDirectFB));
         *ptr += sizeof(IDirectFB);
@@ -23998,8 +23634,7 @@
     memcpy((IDirectFBSurface**)&forUnmarshaling->surface, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->surface);
     *ptr += 8;
-    if (forUnmarshaling->surface)
-    {
+    if (forUnmarshaling->surface) {
         vkStream->alloc((void**)&forUnmarshaling->surface, sizeof(IDirectFBSurface));
         memcpy((IDirectFBSurface*)forUnmarshaling->surface, *ptr, sizeof(IDirectFBSurface));
         *ptr += sizeof(IDirectFBSurface);
@@ -24009,15 +23644,11 @@
 #endif
 #ifdef VK_VALVE_mutable_descriptor_type
 void reservedunmarshal_VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -24025,43 +23656,40 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->mutableDescriptorType, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkMutableDescriptorTypeListVALVE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMutableDescriptorTypeListVALVE* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkMutableDescriptorTypeListVALVE* forUnmarshaling, uint8_t** ptr) {
     memcpy((uint32_t*)&forUnmarshaling->descriptorTypeCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pDescriptorTypes, forUnmarshaling->descriptorTypeCount * sizeof(const VkDescriptorType));
-    memcpy((VkDescriptorType*)forUnmarshaling->pDescriptorTypes, *ptr, forUnmarshaling->descriptorTypeCount * sizeof(const VkDescriptorType));
+    vkStream->alloc((void**)&forUnmarshaling->pDescriptorTypes,
+                    forUnmarshaling->descriptorTypeCount * sizeof(const VkDescriptorType));
+    memcpy((VkDescriptorType*)forUnmarshaling->pDescriptorTypes, *ptr,
+           forUnmarshaling->descriptorTypeCount * sizeof(const VkDescriptorType));
     *ptr += forUnmarshaling->descriptorTypeCount * sizeof(const VkDescriptorType);
 }
 
 void reservedunmarshal_VkMutableDescriptorTypeCreateInfoVALVE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMutableDescriptorTypeCreateInfoVALVE* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkMutableDescriptorTypeCreateInfoVALVE* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -24069,37 +23697,39 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->mutableDescriptorTypeListCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pMutableDescriptorTypeLists, forUnmarshaling->mutableDescriptorTypeListCount * sizeof(const VkMutableDescriptorTypeListVALVE));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->mutableDescriptorTypeListCount; ++i)
-    {
-        reservedunmarshal_VkMutableDescriptorTypeListVALVE(vkStream, rootType, (VkMutableDescriptorTypeListVALVE*)(forUnmarshaling->pMutableDescriptorTypeLists + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pMutableDescriptorTypeLists,
+                    forUnmarshaling->mutableDescriptorTypeListCount *
+                        sizeof(const VkMutableDescriptorTypeListVALVE));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->mutableDescriptorTypeListCount; ++i) {
+        reservedunmarshal_VkMutableDescriptorTypeListVALVE(
+            vkStream, rootType,
+            (VkMutableDescriptorTypeListVALVE*)(forUnmarshaling->pMutableDescriptorTypeLists + i),
+            ptr);
     }
 }
 
 #endif
 #ifdef VK_EXT_vertex_input_dynamic_state
 void reservedunmarshal_VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -24107,30 +23737,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->vertexInputDynamicState, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkVertexInputBindingDescription2EXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVertexInputBindingDescription2EXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVertexInputBindingDescription2EXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -24138,15 +23766,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->binding, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -24159,15 +23789,11 @@
 }
 
 void reservedunmarshal_VkVertexInputAttributeDescription2EXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVertexInputAttributeDescription2EXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVertexInputAttributeDescription2EXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -24175,15 +23801,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->location, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -24198,15 +23826,11 @@
 #endif
 #ifdef VK_EXT_physical_device_drm
 void reservedunmarshal_VkPhysicalDeviceDrmPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDrmPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceDrmPropertiesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -24214,15 +23838,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->hasPrimary, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -24241,15 +23867,11 @@
 #endif
 #ifdef VK_EXT_primitive_topology_list_restart
 void reservedunmarshal_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -24257,15 +23879,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->primitiveTopologyListRestart, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -24276,15 +23900,11 @@
 #endif
 #ifdef VK_FUCHSIA_external_memory
 void reservedunmarshal_VkImportMemoryZirconHandleInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportMemoryZirconHandleInfoFUCHSIA* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImportMemoryZirconHandleInfoFUCHSIA* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -24292,32 +23912,31 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    memcpy((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr,
+           sizeof(VkExternalMemoryHandleTypeFlagBits));
     *ptr += sizeof(VkExternalMemoryHandleTypeFlagBits);
     memcpy((zx_handle_t*)&forUnmarshaling->handle, *ptr, sizeof(zx_handle_t));
     *ptr += sizeof(zx_handle_t);
 }
 
 void reservedunmarshal_VkMemoryZirconHandlePropertiesFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryZirconHandlePropertiesFUCHSIA* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkMemoryZirconHandlePropertiesFUCHSIA* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -24325,30 +23944,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->memoryTypeBits, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
 void reservedunmarshal_VkMemoryGetZirconHandleInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryGetZirconHandleInfoFUCHSIA* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkMemoryGetZirconHandleInfoFUCHSIA* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -24356,36 +23973,36 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkDeviceMemory*)&forUnmarshaling->memory = (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_0));
-    memcpy((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    *(VkDeviceMemory*)&forUnmarshaling->memory =
+        (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_0));
+    memcpy((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr,
+           sizeof(VkExternalMemoryHandleTypeFlagBits));
     *ptr += sizeof(VkExternalMemoryHandleTypeFlagBits);
 }
 
 #endif
 #ifdef VK_FUCHSIA_external_semaphore
 void reservedunmarshal_VkImportSemaphoreZirconHandleInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportSemaphoreZirconHandleInfoFUCHSIA* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImportSemaphoreZirconHandleInfoFUCHSIA* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -24393,38 +24010,38 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkSemaphore*)&forUnmarshaling->semaphore = (VkSemaphore)unbox_VkSemaphore((VkSemaphore)(*&cgen_var_0));
+    *(VkSemaphore*)&forUnmarshaling->semaphore =
+        (VkSemaphore)unbox_VkSemaphore((VkSemaphore)(*&cgen_var_0));
     memcpy((VkSemaphoreImportFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkSemaphoreImportFlags));
     *ptr += sizeof(VkSemaphoreImportFlags);
-    memcpy((VkExternalSemaphoreHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr, sizeof(VkExternalSemaphoreHandleTypeFlagBits));
+    memcpy((VkExternalSemaphoreHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr,
+           sizeof(VkExternalSemaphoreHandleTypeFlagBits));
     *ptr += sizeof(VkExternalSemaphoreHandleTypeFlagBits);
     memcpy((zx_handle_t*)&forUnmarshaling->zirconHandle, *ptr, sizeof(zx_handle_t));
     *ptr += sizeof(zx_handle_t);
 }
 
 void reservedunmarshal_VkSemaphoreGetZirconHandleInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSemaphoreGetZirconHandleInfoFUCHSIA* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSemaphoreGetZirconHandleInfoFUCHSIA* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -24432,36 +24049,36 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkSemaphore*)&forUnmarshaling->semaphore = (VkSemaphore)unbox_VkSemaphore((VkSemaphore)(*&cgen_var_0));
-    memcpy((VkExternalSemaphoreHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr, sizeof(VkExternalSemaphoreHandleTypeFlagBits));
+    *(VkSemaphore*)&forUnmarshaling->semaphore =
+        (VkSemaphore)unbox_VkSemaphore((VkSemaphore)(*&cgen_var_0));
+    memcpy((VkExternalSemaphoreHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr,
+           sizeof(VkExternalSemaphoreHandleTypeFlagBits));
     *ptr += sizeof(VkExternalSemaphoreHandleTypeFlagBits);
 }
 
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
 void reservedunmarshal_VkBufferCollectionCreateInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferCollectionCreateInfoFUCHSIA* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBufferCollectionCreateInfoFUCHSIA* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -24469,30 +24086,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((zx_handle_t*)&forUnmarshaling->collectionToken, *ptr, sizeof(zx_handle_t));
     *ptr += sizeof(zx_handle_t);
 }
 
 void reservedunmarshal_VkImportMemoryBufferCollectionFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportMemoryBufferCollectionFUCHSIA* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImportMemoryBufferCollectionFUCHSIA* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -24500,15 +24115,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBufferCollectionFUCHSIA*)&forUnmarshaling->collection, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->collection);
@@ -24518,15 +24135,11 @@
 }
 
 void reservedunmarshal_VkBufferCollectionImageCreateInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferCollectionImageCreateInfoFUCHSIA* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBufferCollectionImageCreateInfoFUCHSIA* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -24534,15 +24147,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBufferCollectionFUCHSIA*)&forUnmarshaling->collection, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->collection);
@@ -24552,15 +24167,11 @@
 }
 
 void reservedunmarshal_VkBufferCollectionConstraintsInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferCollectionConstraintsInfoFUCHSIA* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBufferCollectionConstraintsInfoFUCHSIA* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -24568,15 +24179,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->minBufferCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -24591,15 +24204,11 @@
 }
 
 void reservedunmarshal_VkBufferConstraintsInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferConstraintsInfoFUCHSIA* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBufferConstraintsInfoFUCHSIA* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -24607,32 +24216,35 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    reservedunmarshal_VkBufferCreateInfo(vkStream, rootType, (VkBufferCreateInfo*)(&forUnmarshaling->createInfo), ptr);
-    memcpy((VkFormatFeatureFlags*)&forUnmarshaling->requiredFormatFeatures, *ptr, sizeof(VkFormatFeatureFlags));
+    reservedunmarshal_VkBufferCreateInfo(vkStream, rootType,
+                                         (VkBufferCreateInfo*)(&forUnmarshaling->createInfo), ptr);
+    memcpy((VkFormatFeatureFlags*)&forUnmarshaling->requiredFormatFeatures, *ptr,
+           sizeof(VkFormatFeatureFlags));
     *ptr += sizeof(VkFormatFeatureFlags);
-    reservedunmarshal_VkBufferCollectionConstraintsInfoFUCHSIA(vkStream, rootType, (VkBufferCollectionConstraintsInfoFUCHSIA*)(&forUnmarshaling->bufferCollectionConstraints), ptr);
+    reservedunmarshal_VkBufferCollectionConstraintsInfoFUCHSIA(
+        vkStream, rootType,
+        (VkBufferCollectionConstraintsInfoFUCHSIA*)(&forUnmarshaling->bufferCollectionConstraints),
+        ptr);
 }
 
 void reservedunmarshal_VkBufferCollectionBufferCreateInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferCollectionBufferCreateInfoFUCHSIA* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBufferCollectionBufferCreateInfoFUCHSIA* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -24640,15 +24252,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBufferCollectionFUCHSIA*)&forUnmarshaling->collection, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->collection);
@@ -24657,16 +24271,12 @@
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkSysmemColorSpaceFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSysmemColorSpaceFUCHSIA* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkSysmemColorSpaceFUCHSIA(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkSysmemColorSpaceFUCHSIA* forUnmarshaling,
+                                                 uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -24674,30 +24284,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->colorSpace, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
 void reservedunmarshal_VkBufferCollectionPropertiesFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferCollectionPropertiesFUCHSIA* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBufferCollectionPropertiesFUCHSIA* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -24705,15 +24313,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->memoryTypeBits, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -24723,30 +24333,35 @@
     *ptr += sizeof(uint32_t);
     memcpy((uint64_t*)&forUnmarshaling->sysmemPixelFormat, *ptr, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
-    memcpy((VkFormatFeatureFlags*)&forUnmarshaling->formatFeatures, *ptr, sizeof(VkFormatFeatureFlags));
+    memcpy((VkFormatFeatureFlags*)&forUnmarshaling->formatFeatures, *ptr,
+           sizeof(VkFormatFeatureFlags));
     *ptr += sizeof(VkFormatFeatureFlags);
-    reservedunmarshal_VkSysmemColorSpaceFUCHSIA(vkStream, rootType, (VkSysmemColorSpaceFUCHSIA*)(&forUnmarshaling->sysmemColorSpaceIndex), ptr);
-    reservedunmarshal_VkComponentMapping(vkStream, rootType, (VkComponentMapping*)(&forUnmarshaling->samplerYcbcrConversionComponents), ptr);
-    memcpy((VkSamplerYcbcrModelConversion*)&forUnmarshaling->suggestedYcbcrModel, *ptr, sizeof(VkSamplerYcbcrModelConversion));
+    reservedunmarshal_VkSysmemColorSpaceFUCHSIA(
+        vkStream, rootType, (VkSysmemColorSpaceFUCHSIA*)(&forUnmarshaling->sysmemColorSpaceIndex),
+        ptr);
+    reservedunmarshal_VkComponentMapping(
+        vkStream, rootType,
+        (VkComponentMapping*)(&forUnmarshaling->samplerYcbcrConversionComponents), ptr);
+    memcpy((VkSamplerYcbcrModelConversion*)&forUnmarshaling->suggestedYcbcrModel, *ptr,
+           sizeof(VkSamplerYcbcrModelConversion));
     *ptr += sizeof(VkSamplerYcbcrModelConversion);
-    memcpy((VkSamplerYcbcrRange*)&forUnmarshaling->suggestedYcbcrRange, *ptr, sizeof(VkSamplerYcbcrRange));
+    memcpy((VkSamplerYcbcrRange*)&forUnmarshaling->suggestedYcbcrRange, *ptr,
+           sizeof(VkSamplerYcbcrRange));
     *ptr += sizeof(VkSamplerYcbcrRange);
-    memcpy((VkChromaLocation*)&forUnmarshaling->suggestedXChromaOffset, *ptr, sizeof(VkChromaLocation));
+    memcpy((VkChromaLocation*)&forUnmarshaling->suggestedXChromaOffset, *ptr,
+           sizeof(VkChromaLocation));
     *ptr += sizeof(VkChromaLocation);
-    memcpy((VkChromaLocation*)&forUnmarshaling->suggestedYChromaOffset, *ptr, sizeof(VkChromaLocation));
+    memcpy((VkChromaLocation*)&forUnmarshaling->suggestedYChromaOffset, *ptr,
+           sizeof(VkChromaLocation));
     *ptr += sizeof(VkChromaLocation);
 }
 
 void reservedunmarshal_VkImageFormatConstraintsInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageFormatConstraintsInfoFUCHSIA* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImageFormatConstraintsInfoFUCHSIA* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -24754,39 +24369,43 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    reservedunmarshal_VkImageCreateInfo(vkStream, rootType, (VkImageCreateInfo*)(&forUnmarshaling->imageCreateInfo), ptr);
-    memcpy((VkFormatFeatureFlags*)&forUnmarshaling->requiredFormatFeatures, *ptr, sizeof(VkFormatFeatureFlags));
+    reservedunmarshal_VkImageCreateInfo(
+        vkStream, rootType, (VkImageCreateInfo*)(&forUnmarshaling->imageCreateInfo), ptr);
+    memcpy((VkFormatFeatureFlags*)&forUnmarshaling->requiredFormatFeatures, *ptr,
+           sizeof(VkFormatFeatureFlags));
     *ptr += sizeof(VkFormatFeatureFlags);
-    memcpy((VkImageFormatConstraintsFlagsFUCHSIA*)&forUnmarshaling->flags, *ptr, sizeof(VkImageFormatConstraintsFlagsFUCHSIA));
+    memcpy((VkImageFormatConstraintsFlagsFUCHSIA*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkImageFormatConstraintsFlagsFUCHSIA));
     *ptr += sizeof(VkImageFormatConstraintsFlagsFUCHSIA);
     memcpy((uint64_t*)&forUnmarshaling->sysmemPixelFormat, *ptr, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
     memcpy((uint32_t*)&forUnmarshaling->colorSpaceCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pColorSpaces, sizeof(const VkSysmemColorSpaceFUCHSIA));
-    reservedunmarshal_VkSysmemColorSpaceFUCHSIA(vkStream, rootType, (VkSysmemColorSpaceFUCHSIA*)(forUnmarshaling->pColorSpaces), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pColorSpaces,
+                    sizeof(const VkSysmemColorSpaceFUCHSIA));
+    reservedunmarshal_VkSysmemColorSpaceFUCHSIA(
+        vkStream, rootType, (VkSysmemColorSpaceFUCHSIA*)(forUnmarshaling->pColorSpaces), ptr);
 }
 
-void reservedunmarshal_VkImageConstraintsInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageConstraintsInfoFUCHSIA* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkImageConstraintsInfoFUCHSIA(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkImageConstraintsInfoFUCHSIA* forUnmarshaling,
+                                                     uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -24794,40 +24413,45 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->formatConstraintsCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pFormatConstraints, forUnmarshaling->formatConstraintsCount * sizeof(const VkImageFormatConstraintsInfoFUCHSIA));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->formatConstraintsCount; ++i)
-    {
-        reservedunmarshal_VkImageFormatConstraintsInfoFUCHSIA(vkStream, rootType, (VkImageFormatConstraintsInfoFUCHSIA*)(forUnmarshaling->pFormatConstraints + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pFormatConstraints,
+                    forUnmarshaling->formatConstraintsCount *
+                        sizeof(const VkImageFormatConstraintsInfoFUCHSIA));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->formatConstraintsCount; ++i) {
+        reservedunmarshal_VkImageFormatConstraintsInfoFUCHSIA(
+            vkStream, rootType,
+            (VkImageFormatConstraintsInfoFUCHSIA*)(forUnmarshaling->pFormatConstraints + i), ptr);
     }
-    reservedunmarshal_VkBufferCollectionConstraintsInfoFUCHSIA(vkStream, rootType, (VkBufferCollectionConstraintsInfoFUCHSIA*)(&forUnmarshaling->bufferCollectionConstraints), ptr);
-    memcpy((VkImageConstraintsInfoFlagsFUCHSIA*)&forUnmarshaling->flags, *ptr, sizeof(VkImageConstraintsInfoFlagsFUCHSIA));
+    reservedunmarshal_VkBufferCollectionConstraintsInfoFUCHSIA(
+        vkStream, rootType,
+        (VkBufferCollectionConstraintsInfoFUCHSIA*)(&forUnmarshaling->bufferCollectionConstraints),
+        ptr);
+    memcpy((VkImageConstraintsInfoFlagsFUCHSIA*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkImageConstraintsInfoFlagsFUCHSIA));
     *ptr += sizeof(VkImageConstraintsInfoFlagsFUCHSIA);
 }
 
 #endif
 #ifdef VK_HUAWEI_subpass_shading
 void reservedunmarshal_VkSubpassShadingPipelineCreateInfoHUAWEI(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubpassShadingPipelineCreateInfoHUAWEI* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSubpassShadingPipelineCreateInfoHUAWEI* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -24835,34 +24459,33 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkRenderPass*)&forUnmarshaling->renderPass = (VkRenderPass)unbox_VkRenderPass((VkRenderPass)(*&cgen_var_0));
+    *(VkRenderPass*)&forUnmarshaling->renderPass =
+        (VkRenderPass)unbox_VkRenderPass((VkRenderPass)(*&cgen_var_0));
     memcpy((uint32_t*)&forUnmarshaling->subpass, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
 void reservedunmarshal_VkPhysicalDeviceSubpassShadingFeaturesHUAWEI(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSubpassShadingFeaturesHUAWEI* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceSubpassShadingFeaturesHUAWEI* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -24870,30 +24493,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->subpassShading, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkPhysicalDeviceSubpassShadingPropertiesHUAWEI(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSubpassShadingPropertiesHUAWEI* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceSubpassShadingPropertiesHUAWEI* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -24901,32 +24522,31 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((uint32_t*)&forUnmarshaling->maxSubpassShadingWorkgroupSizeAspectRatio, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxSubpassShadingWorkgroupSizeAspectRatio, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
 #endif
 #ifdef VK_HUAWEI_invocation_mask
 void reservedunmarshal_VkPhysicalDeviceInvocationMaskFeaturesHUAWEI(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceInvocationMaskFeaturesHUAWEI* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceInvocationMaskFeaturesHUAWEI* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -24934,15 +24554,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->invocationMask, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -24951,15 +24573,11 @@
 #endif
 #ifdef VK_NV_external_memory_rdma
 void reservedunmarshal_VkMemoryGetRemoteAddressInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryGetRemoteAddressInfoNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkMemoryGetRemoteAddressInfoNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -24967,34 +24585,34 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkDeviceMemory*)&forUnmarshaling->memory = (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_0));
-    memcpy((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    *(VkDeviceMemory*)&forUnmarshaling->memory =
+        (VkDeviceMemory)unbox_VkDeviceMemory((VkDeviceMemory)(*&cgen_var_0));
+    memcpy((VkExternalMemoryHandleTypeFlagBits*)&forUnmarshaling->handleType, *ptr,
+           sizeof(VkExternalMemoryHandleTypeFlagBits));
     *ptr += sizeof(VkExternalMemoryHandleTypeFlagBits);
 }
 
 void reservedunmarshal_VkPhysicalDeviceExternalMemoryRDMAFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceExternalMemoryRDMAFeaturesNV* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceExternalMemoryRDMAFeaturesNV* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -25002,15 +24620,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->externalMemoryRDMA, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -25019,15 +24639,11 @@
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
 void reservedunmarshal_VkPhysicalDeviceExtendedDynamicState2FeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceExtendedDynamicState2FeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceExtendedDynamicState2FeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -25035,36 +24651,36 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->extendedDynamicState2, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy((VkBool32*)&forUnmarshaling->extendedDynamicState2LogicOp, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->extendedDynamicState2PatchControlPoints, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->extendedDynamicState2PatchControlPoints, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 #endif
 #ifdef VK_QNX_screen_surface
-void reservedunmarshal_VkScreenSurfaceCreateInfoQNX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkScreenSurfaceCreateInfoQNX* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkScreenSurfaceCreateInfoQNX(VulkanStream* vkStream,
+                                                    VkStructureType rootType,
+                                                    VkScreenSurfaceCreateInfoQNX* forUnmarshaling,
+                                                    uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -25072,24 +24688,26 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkScreenSurfaceCreateFlagsQNX*)&forUnmarshaling->flags, *ptr, sizeof(VkScreenSurfaceCreateFlagsQNX));
+    memcpy((VkScreenSurfaceCreateFlagsQNX*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkScreenSurfaceCreateFlagsQNX));
     *ptr += sizeof(VkScreenSurfaceCreateFlagsQNX);
     // WARNING PTR CHECK
     memcpy((_screen_context**)&forUnmarshaling->context, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->context);
     *ptr += 8;
-    if (forUnmarshaling->context)
-    {
+    if (forUnmarshaling->context) {
         vkStream->alloc((void**)&forUnmarshaling->context, sizeof(_screen_context));
         memcpy((_screen_context*)forUnmarshaling->context, *ptr, sizeof(_screen_context));
         *ptr += sizeof(_screen_context);
@@ -25098,8 +24716,7 @@
     memcpy((_screen_window**)&forUnmarshaling->window, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->window);
     *ptr += 8;
-    if (forUnmarshaling->window)
-    {
+    if (forUnmarshaling->window) {
         vkStream->alloc((void**)&forUnmarshaling->window, sizeof(_screen_window));
         memcpy((_screen_window*)forUnmarshaling->window, *ptr, sizeof(_screen_window));
         *ptr += sizeof(_screen_window);
@@ -25109,15 +24726,11 @@
 #endif
 #ifdef VK_EXT_color_write_enable
 void reservedunmarshal_VkPhysicalDeviceColorWriteEnableFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceColorWriteEnableFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceColorWriteEnableFeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -25125,30 +24738,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->colorWriteEnable, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkPipelineColorWriteCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineColorWriteCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineColorWriteCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -25156,36 +24767,36 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->attachmentCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pColorWriteEnables, forUnmarshaling->attachmentCount * sizeof(const VkBool32));
-    memcpy((VkBool32*)forUnmarshaling->pColorWriteEnables, *ptr, forUnmarshaling->attachmentCount * sizeof(const VkBool32));
+    vkStream->alloc((void**)&forUnmarshaling->pColorWriteEnables,
+                    forUnmarshaling->attachmentCount * sizeof(const VkBool32));
+    memcpy((VkBool32*)forUnmarshaling->pColorWriteEnables, *ptr,
+           forUnmarshaling->attachmentCount * sizeof(const VkBool32));
     *ptr += forUnmarshaling->attachmentCount * sizeof(const VkBool32);
 }
 
 #endif
 #ifdef VK_GOOGLE_gfxstream
-void reservedunmarshal_VkImportColorBufferGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportColorBufferGOOGLE* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkImportColorBufferGOOGLE(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkImportColorBufferGOOGLE* forUnmarshaling,
+                                                 uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
     forUnmarshaling->sType = VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -25193,31 +24804,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->colorBuffer, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkImportBufferGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportBufferGOOGLE* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkImportBufferGOOGLE(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkImportBufferGOOGLE* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
     forUnmarshaling->sType = VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -25225,31 +24833,30 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->buffer, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkImportPhysicalAddressGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportPhysicalAddressGOOGLE* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkImportPhysicalAddressGOOGLE(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkImportPhysicalAddressGOOGLE* forUnmarshaling,
+                                                     uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
     forUnmarshaling->sType = VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -25257,15 +24864,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint64_t*)&forUnmarshaling->physicalAddress, *ptr, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
@@ -25282,15 +24891,11 @@
 #endif
 #ifdef VK_EXT_global_priority_query
 void reservedunmarshal_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -25298,30 +24903,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->globalPriorityQuery, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkQueueFamilyGlobalPriorityPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkQueueFamilyGlobalPriorityPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkQueueFamilyGlobalPriorityPropertiesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -25329,34 +24932,33 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->priorityCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((VkQueueGlobalPriorityEXT*)forUnmarshaling->priorities, *ptr, VK_MAX_GLOBAL_PRIORITY_SIZE_EXT * sizeof(VkQueueGlobalPriorityEXT));
+    memcpy((VkQueueGlobalPriorityEXT*)forUnmarshaling->priorities, *ptr,
+           VK_MAX_GLOBAL_PRIORITY_SIZE_EXT * sizeof(VkQueueGlobalPriorityEXT));
     *ptr += VK_MAX_GLOBAL_PRIORITY_SIZE_EXT * sizeof(VkQueueGlobalPriorityEXT);
 }
 
 #endif
 #ifdef VK_EXT_multi_draw
 void reservedunmarshal_VkPhysicalDeviceMultiDrawFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMultiDrawFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMultiDrawFeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -25364,30 +24966,28 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->multiDraw, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkPhysicalDeviceMultiDrawPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMultiDrawPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMultiDrawPropertiesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -25395,38 +24995,33 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->maxMultiDrawCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkMultiDrawInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMultiDrawInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkMultiDrawInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkMultiDrawInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((uint32_t*)&forUnmarshaling->firstVertex, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->vertexCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
-void reservedunmarshal_VkMultiDrawIndexedInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMultiDrawIndexedInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkMultiDrawIndexedInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkMultiDrawIndexedInfoEXT* forUnmarshaling,
+                                                 uint8_t** ptr) {
     memcpy((uint32_t*)&forUnmarshaling->firstIndex, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->indexCount, *ptr, sizeof(uint32_t));
@@ -25440,15 +25035,11 @@
 #endif
 #ifdef VK_EXT_border_color_swizzle
 void reservedunmarshal_VkPhysicalDeviceBorderColorSwizzleFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceBorderColorSwizzleFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceBorderColorSwizzleFeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -25456,15 +25047,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->borderColorSwizzle, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -25473,15 +25066,11 @@
 }
 
 void reservedunmarshal_VkSamplerBorderColorComponentMappingCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSamplerBorderColorComponentMappingCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSamplerBorderColorComponentMappingCreateInfoEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -25489,17 +25078,20 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    reservedunmarshal_VkComponentMapping(vkStream, rootType, (VkComponentMapping*)(&forUnmarshaling->components), ptr);
+    reservedunmarshal_VkComponentMapping(vkStream, rootType,
+                                         (VkComponentMapping*)(&forUnmarshaling->components), ptr);
     memcpy((VkBool32*)&forUnmarshaling->srgb, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
@@ -25507,15 +25099,11 @@
 #endif
 #ifdef VK_EXT_pageable_device_local_memory
 void reservedunmarshal_VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -25523,15 +25111,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->pageableDeviceLocalMemory, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -25539,22 +25129,16 @@
 
 #endif
 #ifdef VK_KHR_acceleration_structure
-void reservedunmarshal_VkDeviceOrHostAddressKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceOrHostAddressKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkDeviceOrHostAddressKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkDeviceOrHostAddressKHR* forUnmarshaling,
+                                                uint8_t** ptr) {
     memcpy((VkDeviceAddress*)&forUnmarshaling->deviceAddress, *ptr, sizeof(VkDeviceAddress));
     *ptr += sizeof(VkDeviceAddress);
 }
 
 void reservedunmarshal_VkAccelerationStructureBuildRangeInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureBuildRangeInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureBuildRangeInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((uint32_t*)&forUnmarshaling->primitiveCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->primitiveOffset, *ptr, sizeof(uint32_t));
@@ -25566,15 +25150,11 @@
 }
 
 void reservedunmarshal_VkAccelerationStructureGeometryTrianglesDataKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureGeometryTrianglesDataKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureGeometryTrianglesDataKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -25582,39 +25162,40 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkFormat*)&forUnmarshaling->vertexFormat, *ptr, sizeof(VkFormat));
     *ptr += sizeof(VkFormat);
-    reservedunmarshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forUnmarshaling->vertexData), ptr);
+    reservedunmarshal_VkDeviceOrHostAddressConstKHR(
+        vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forUnmarshaling->vertexData), ptr);
     memcpy((VkDeviceSize*)&forUnmarshaling->vertexStride, *ptr, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
     memcpy((uint32_t*)&forUnmarshaling->maxVertex, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((VkIndexType*)&forUnmarshaling->indexType, *ptr, sizeof(VkIndexType));
     *ptr += sizeof(VkIndexType);
-    reservedunmarshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forUnmarshaling->indexData), ptr);
-    reservedunmarshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forUnmarshaling->transformData), ptr);
+    reservedunmarshal_VkDeviceOrHostAddressConstKHR(
+        vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forUnmarshaling->indexData), ptr);
+    reservedunmarshal_VkDeviceOrHostAddressConstKHR(
+        vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forUnmarshaling->transformData), ptr);
 }
 
 void reservedunmarshal_VkAccelerationStructureGeometryAabbsDataKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureGeometryAabbsDataKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureGeometryAabbsDataKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -25622,31 +25203,30 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    reservedunmarshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forUnmarshaling->data), ptr);
+    reservedunmarshal_VkDeviceOrHostAddressConstKHR(
+        vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forUnmarshaling->data), ptr);
     memcpy((VkDeviceSize*)&forUnmarshaling->stride, *ptr, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
 }
 
 void reservedunmarshal_VkAccelerationStructureGeometryInstancesDataKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureGeometryInstancesDataKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureGeometryInstancesDataKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -25654,40 +25234,38 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->arrayOfPointers, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    reservedunmarshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forUnmarshaling->data), ptr);
+    reservedunmarshal_VkDeviceOrHostAddressConstKHR(
+        vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forUnmarshaling->data), ptr);
 }
 
 void reservedunmarshal_VkAccelerationStructureGeometryDataKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureGeometryDataKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
-    reservedunmarshal_VkAccelerationStructureGeometryTrianglesDataKHR(vkStream, rootType, (VkAccelerationStructureGeometryTrianglesDataKHR*)(&forUnmarshaling->triangles), ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureGeometryDataKHR* forUnmarshaling, uint8_t** ptr) {
+    reservedunmarshal_VkAccelerationStructureGeometryTrianglesDataKHR(
+        vkStream, rootType,
+        (VkAccelerationStructureGeometryTrianglesDataKHR*)(&forUnmarshaling->triangles), ptr);
 }
 
 void reservedunmarshal_VkAccelerationStructureGeometryKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureGeometryKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureGeometryKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -25695,33 +25273,33 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkGeometryTypeKHR*)&forUnmarshaling->geometryType, *ptr, sizeof(VkGeometryTypeKHR));
     *ptr += sizeof(VkGeometryTypeKHR);
-    reservedunmarshal_VkAccelerationStructureGeometryDataKHR(vkStream, rootType, (VkAccelerationStructureGeometryDataKHR*)(&forUnmarshaling->geometry), ptr);
+    reservedunmarshal_VkAccelerationStructureGeometryDataKHR(
+        vkStream, rootType, (VkAccelerationStructureGeometryDataKHR*)(&forUnmarshaling->geometry),
+        ptr);
     memcpy((VkGeometryFlagsKHR*)&forUnmarshaling->flags, *ptr, sizeof(VkGeometryFlagsKHR));
     *ptr += sizeof(VkGeometryFlagsKHR);
 }
 
 void reservedunmarshal_VkAccelerationStructureBuildGeometryInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureBuildGeometryInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureBuildGeometryInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -25729,57 +25307,65 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkAccelerationStructureTypeKHR*)&forUnmarshaling->type, *ptr, sizeof(VkAccelerationStructureTypeKHR));
+    memcpy((VkAccelerationStructureTypeKHR*)&forUnmarshaling->type, *ptr,
+           sizeof(VkAccelerationStructureTypeKHR));
     *ptr += sizeof(VkAccelerationStructureTypeKHR);
-    memcpy((VkBuildAccelerationStructureFlagsKHR*)&forUnmarshaling->flags, *ptr, sizeof(VkBuildAccelerationStructureFlagsKHR));
+    memcpy((VkBuildAccelerationStructureFlagsKHR*)&forUnmarshaling->flags, *ptr,
+           sizeof(VkBuildAccelerationStructureFlagsKHR));
     *ptr += sizeof(VkBuildAccelerationStructureFlagsKHR);
-    memcpy((VkBuildAccelerationStructureModeKHR*)&forUnmarshaling->mode, *ptr, sizeof(VkBuildAccelerationStructureModeKHR));
+    memcpy((VkBuildAccelerationStructureModeKHR*)&forUnmarshaling->mode, *ptr,
+           sizeof(VkBuildAccelerationStructureModeKHR));
     *ptr += sizeof(VkBuildAccelerationStructureModeKHR);
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkAccelerationStructureKHR*)&forUnmarshaling->srcAccelerationStructure = (VkAccelerationStructureKHR)unbox_VkAccelerationStructureKHR((VkAccelerationStructureKHR)(*&cgen_var_0));
+    *(VkAccelerationStructureKHR*)&forUnmarshaling->srcAccelerationStructure =
+        (VkAccelerationStructureKHR)unbox_VkAccelerationStructureKHR(
+            (VkAccelerationStructureKHR)(*&cgen_var_0));
     uint64_t cgen_var_1;
     memcpy((uint64_t*)&cgen_var_1, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkAccelerationStructureKHR*)&forUnmarshaling->dstAccelerationStructure = (VkAccelerationStructureKHR)unbox_VkAccelerationStructureKHR((VkAccelerationStructureKHR)(*&cgen_var_1));
+    *(VkAccelerationStructureKHR*)&forUnmarshaling->dstAccelerationStructure =
+        (VkAccelerationStructureKHR)unbox_VkAccelerationStructureKHR(
+            (VkAccelerationStructureKHR)(*&cgen_var_1));
     memcpy((uint32_t*)&forUnmarshaling->geometryCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     // WARNING PTR CHECK
     memcpy((VkAccelerationStructureGeometryKHR**)&forUnmarshaling->pGeometries, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pGeometries);
     *ptr += 8;
-    if (forUnmarshaling->pGeometries)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pGeometries, forUnmarshaling->geometryCount * sizeof(const VkAccelerationStructureGeometryKHR));
-        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->geometryCount; ++i)
-        {
-            reservedunmarshal_VkAccelerationStructureGeometryKHR(vkStream, rootType, (VkAccelerationStructureGeometryKHR*)(forUnmarshaling->pGeometries + i), ptr);
+    if (forUnmarshaling->pGeometries) {
+        vkStream->alloc(
+            (void**)&forUnmarshaling->pGeometries,
+            forUnmarshaling->geometryCount * sizeof(const VkAccelerationStructureGeometryKHR));
+        for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->geometryCount; ++i) {
+            reservedunmarshal_VkAccelerationStructureGeometryKHR(
+                vkStream, rootType,
+                (VkAccelerationStructureGeometryKHR*)(forUnmarshaling->pGeometries + i), ptr);
         }
     }
-    reservedunmarshal_VkDeviceOrHostAddressKHR(vkStream, rootType, (VkDeviceOrHostAddressKHR*)(&forUnmarshaling->scratchData), ptr);
+    reservedunmarshal_VkDeviceOrHostAddressKHR(
+        vkStream, rootType, (VkDeviceOrHostAddressKHR*)(&forUnmarshaling->scratchData), ptr);
 }
 
 void reservedunmarshal_VkAccelerationStructureCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureCreateInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -25787,17 +25373,20 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkAccelerationStructureCreateFlagsKHR*)&forUnmarshaling->createFlags, *ptr, sizeof(VkAccelerationStructureCreateFlagsKHR));
+    memcpy((VkAccelerationStructureCreateFlagsKHR*)&forUnmarshaling->createFlags, *ptr,
+           sizeof(VkAccelerationStructureCreateFlagsKHR));
     *ptr += sizeof(VkAccelerationStructureCreateFlagsKHR);
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
@@ -25807,22 +25396,19 @@
     *ptr += sizeof(VkDeviceSize);
     memcpy((VkDeviceSize*)&forUnmarshaling->size, *ptr, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
-    memcpy((VkAccelerationStructureTypeKHR*)&forUnmarshaling->type, *ptr, sizeof(VkAccelerationStructureTypeKHR));
+    memcpy((VkAccelerationStructureTypeKHR*)&forUnmarshaling->type, *ptr,
+           sizeof(VkAccelerationStructureTypeKHR));
     *ptr += sizeof(VkAccelerationStructureTypeKHR);
     memcpy((VkDeviceAddress*)&forUnmarshaling->deviceAddress, *ptr, sizeof(VkDeviceAddress));
     *ptr += sizeof(VkDeviceAddress);
 }
 
 void reservedunmarshal_VkWriteDescriptorSetAccelerationStructureKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkWriteDescriptorSetAccelerationStructureKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkWriteDescriptorSetAccelerationStructureKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -25830,15 +25416,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->accelerationStructureCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -25846,19 +25434,20 @@
     memcpy((VkAccelerationStructureKHR**)&forUnmarshaling->pAccelerationStructures, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pAccelerationStructures);
     *ptr += 8;
-    if (forUnmarshaling->pAccelerationStructures)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pAccelerationStructures, forUnmarshaling->accelerationStructureCount * sizeof(const VkAccelerationStructureKHR));
-        if (forUnmarshaling->accelerationStructureCount)
-        {
+    if (forUnmarshaling->pAccelerationStructures) {
+        vkStream->alloc(
+            (void**)&forUnmarshaling->pAccelerationStructures,
+            forUnmarshaling->accelerationStructureCount * sizeof(const VkAccelerationStructureKHR));
+        if (forUnmarshaling->accelerationStructureCount) {
             uint8_t* cgen_var_0_0_ptr = (uint8_t*)(*ptr);
             *ptr += 8 * forUnmarshaling->accelerationStructureCount;
-            if (forUnmarshaling)
-            {
-                for (uint32_t k = 0; k < forUnmarshaling->accelerationStructureCount; ++k)
-                {
-                    uint64_t tmpval; memcpy(&tmpval, cgen_var_0_0_ptr + k * 8, sizeof(uint64_t));
-                    *(((VkAccelerationStructureKHR*)forUnmarshaling->pAccelerationStructures) + k) = (VkAccelerationStructureKHR)unbox_VkAccelerationStructureKHR((VkAccelerationStructureKHR)tmpval);
+            if (forUnmarshaling) {
+                for (uint32_t k = 0; k < forUnmarshaling->accelerationStructureCount; ++k) {
+                    uint64_t tmpval;
+                    memcpy(&tmpval, cgen_var_0_0_ptr + k * 8, sizeof(uint64_t));
+                    *(((VkAccelerationStructureKHR*)forUnmarshaling->pAccelerationStructures) + k) =
+                        (VkAccelerationStructureKHR)unbox_VkAccelerationStructureKHR(
+                            (VkAccelerationStructureKHR)tmpval);
                 }
             }
         }
@@ -25866,15 +25455,11 @@
 }
 
 void reservedunmarshal_VkPhysicalDeviceAccelerationStructureFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceAccelerationStructureFeaturesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceAccelerationStructureFeaturesKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -25882,15 +25467,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->accelerationStructure, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
@@ -25900,20 +25487,17 @@
     *ptr += sizeof(VkBool32);
     memcpy((VkBool32*)&forUnmarshaling->accelerationStructureHostCommands, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->descriptorBindingAccelerationStructureUpdateAfterBind, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->descriptorBindingAccelerationStructureUpdateAfterBind, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkPhysicalDeviceAccelerationStructurePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceAccelerationStructurePropertiesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceAccelerationStructurePropertiesKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -25921,15 +25505,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint64_t*)&forUnmarshaling->maxGeometryCount, *ptr, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
@@ -25937,28 +25523,29 @@
     *ptr += sizeof(uint64_t);
     memcpy((uint64_t*)&forUnmarshaling->maxPrimitiveCount, *ptr, sizeof(uint64_t));
     *ptr += sizeof(uint64_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorAccelerationStructures, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorAccelerationStructures, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindAccelerationStructures, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxPerStageDescriptorUpdateAfterBindAccelerationStructures,
+           *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetAccelerationStructures, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetAccelerationStructures, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindAccelerationStructures, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->maxDescriptorSetUpdateAfterBindAccelerationStructures, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    memcpy((uint32_t*)&forUnmarshaling->minAccelerationStructureScratchOffsetAlignment, *ptr, sizeof(uint32_t));
+    memcpy((uint32_t*)&forUnmarshaling->minAccelerationStructureScratchOffsetAlignment, *ptr,
+           sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
 }
 
 void reservedunmarshal_VkAccelerationStructureDeviceAddressInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureDeviceAddressInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureDeviceAddressInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -25966,32 +25553,32 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkAccelerationStructureKHR*)&forUnmarshaling->accelerationStructure = (VkAccelerationStructureKHR)unbox_VkAccelerationStructureKHR((VkAccelerationStructureKHR)(*&cgen_var_0));
+    *(VkAccelerationStructureKHR*)&forUnmarshaling->accelerationStructure =
+        (VkAccelerationStructureKHR)unbox_VkAccelerationStructureKHR(
+            (VkAccelerationStructureKHR)(*&cgen_var_0));
 }
 
 void reservedunmarshal_VkAccelerationStructureVersionInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureVersionInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureVersionInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -25999,31 +25586,30 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    vkStream->alloc((void**)&forUnmarshaling->pVersionData, 2*VK_UUID_SIZE * sizeof(const uint8_t));
-    memcpy((uint8_t*)forUnmarshaling->pVersionData, *ptr, 2*VK_UUID_SIZE * sizeof(const uint8_t));
-    *ptr += 2*VK_UUID_SIZE * sizeof(const uint8_t);
+    vkStream->alloc((void**)&forUnmarshaling->pVersionData,
+                    2 * VK_UUID_SIZE * sizeof(const uint8_t));
+    memcpy((uint8_t*)forUnmarshaling->pVersionData, *ptr, 2 * VK_UUID_SIZE * sizeof(const uint8_t));
+    *ptr += 2 * VK_UUID_SIZE * sizeof(const uint8_t);
 }
 
 void reservedunmarshal_VkCopyAccelerationStructureToMemoryInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCopyAccelerationStructureToMemoryInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkCopyAccelerationStructureToMemoryInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -26031,35 +25617,37 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkAccelerationStructureKHR*)&forUnmarshaling->src = (VkAccelerationStructureKHR)unbox_VkAccelerationStructureKHR((VkAccelerationStructureKHR)(*&cgen_var_0));
-    reservedunmarshal_VkDeviceOrHostAddressKHR(vkStream, rootType, (VkDeviceOrHostAddressKHR*)(&forUnmarshaling->dst), ptr);
-    memcpy((VkCopyAccelerationStructureModeKHR*)&forUnmarshaling->mode, *ptr, sizeof(VkCopyAccelerationStructureModeKHR));
+    *(VkAccelerationStructureKHR*)&forUnmarshaling->src =
+        (VkAccelerationStructureKHR)unbox_VkAccelerationStructureKHR(
+            (VkAccelerationStructureKHR)(*&cgen_var_0));
+    reservedunmarshal_VkDeviceOrHostAddressKHR(
+        vkStream, rootType, (VkDeviceOrHostAddressKHR*)(&forUnmarshaling->dst), ptr);
+    memcpy((VkCopyAccelerationStructureModeKHR*)&forUnmarshaling->mode, *ptr,
+           sizeof(VkCopyAccelerationStructureModeKHR));
     *ptr += sizeof(VkCopyAccelerationStructureModeKHR);
 }
 
 void reservedunmarshal_VkCopyMemoryToAccelerationStructureInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCopyMemoryToAccelerationStructureInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkCopyMemoryToAccelerationStructureInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -26067,35 +25655,37 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    reservedunmarshal_VkDeviceOrHostAddressConstKHR(vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forUnmarshaling->src), ptr);
+    reservedunmarshal_VkDeviceOrHostAddressConstKHR(
+        vkStream, rootType, (VkDeviceOrHostAddressConstKHR*)(&forUnmarshaling->src), ptr);
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkAccelerationStructureKHR*)&forUnmarshaling->dst = (VkAccelerationStructureKHR)unbox_VkAccelerationStructureKHR((VkAccelerationStructureKHR)(*&cgen_var_0));
-    memcpy((VkCopyAccelerationStructureModeKHR*)&forUnmarshaling->mode, *ptr, sizeof(VkCopyAccelerationStructureModeKHR));
+    *(VkAccelerationStructureKHR*)&forUnmarshaling->dst =
+        (VkAccelerationStructureKHR)unbox_VkAccelerationStructureKHR(
+            (VkAccelerationStructureKHR)(*&cgen_var_0));
+    memcpy((VkCopyAccelerationStructureModeKHR*)&forUnmarshaling->mode, *ptr,
+           sizeof(VkCopyAccelerationStructureModeKHR));
     *ptr += sizeof(VkCopyAccelerationStructureModeKHR);
 }
 
 void reservedunmarshal_VkCopyAccelerationStructureInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCopyAccelerationStructureInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkCopyAccelerationStructureInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -26103,38 +25693,41 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     uint64_t cgen_var_0;
     memcpy((uint64_t*)&cgen_var_0, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkAccelerationStructureKHR*)&forUnmarshaling->src = (VkAccelerationStructureKHR)unbox_VkAccelerationStructureKHR((VkAccelerationStructureKHR)(*&cgen_var_0));
+    *(VkAccelerationStructureKHR*)&forUnmarshaling->src =
+        (VkAccelerationStructureKHR)unbox_VkAccelerationStructureKHR(
+            (VkAccelerationStructureKHR)(*&cgen_var_0));
     uint64_t cgen_var_1;
     memcpy((uint64_t*)&cgen_var_1, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkAccelerationStructureKHR*)&forUnmarshaling->dst = (VkAccelerationStructureKHR)unbox_VkAccelerationStructureKHR((VkAccelerationStructureKHR)(*&cgen_var_1));
-    memcpy((VkCopyAccelerationStructureModeKHR*)&forUnmarshaling->mode, *ptr, sizeof(VkCopyAccelerationStructureModeKHR));
+    *(VkAccelerationStructureKHR*)&forUnmarshaling->dst =
+        (VkAccelerationStructureKHR)unbox_VkAccelerationStructureKHR(
+            (VkAccelerationStructureKHR)(*&cgen_var_1));
+    memcpy((VkCopyAccelerationStructureModeKHR*)&forUnmarshaling->mode, *ptr,
+           sizeof(VkCopyAccelerationStructureModeKHR));
     *ptr += sizeof(VkCopyAccelerationStructureModeKHR);
 }
 
 void reservedunmarshal_VkAccelerationStructureBuildSizesInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureBuildSizesInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureBuildSizesInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -26142,15 +25735,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkDeviceSize*)&forUnmarshaling->accelerationStructureSize, *ptr, sizeof(VkDeviceSize));
     *ptr += sizeof(VkDeviceSize);
@@ -26163,15 +25758,11 @@
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
 void reservedunmarshal_VkRayTracingShaderGroupCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRayTracingShaderGroupCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkRayTracingShaderGroupCreateInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -26179,17 +25770,20 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
-    memcpy((VkRayTracingShaderGroupTypeKHR*)&forUnmarshaling->type, *ptr, sizeof(VkRayTracingShaderGroupTypeKHR));
+    memcpy((VkRayTracingShaderGroupTypeKHR*)&forUnmarshaling->type, *ptr,
+           sizeof(VkRayTracingShaderGroupTypeKHR));
     *ptr += sizeof(VkRayTracingShaderGroupTypeKHR);
     memcpy((uint32_t*)&forUnmarshaling->generalShader, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -26203,24 +25797,21 @@
     memcpy((void**)&forUnmarshaling->pShaderGroupCaptureReplayHandle, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pShaderGroupCaptureReplayHandle);
     *ptr += 8;
-    if (forUnmarshaling->pShaderGroupCaptureReplayHandle)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pShaderGroupCaptureReplayHandle, sizeof(const uint8_t));
-        memcpy((void*)forUnmarshaling->pShaderGroupCaptureReplayHandle, *ptr, sizeof(const uint8_t));
+    if (forUnmarshaling->pShaderGroupCaptureReplayHandle) {
+        vkStream->alloc((void**)&forUnmarshaling->pShaderGroupCaptureReplayHandle,
+                        sizeof(const uint8_t));
+        memcpy((void*)forUnmarshaling->pShaderGroupCaptureReplayHandle, *ptr,
+               sizeof(const uint8_t));
         *ptr += sizeof(const uint8_t);
     }
 }
 
 void reservedunmarshal_VkRayTracingPipelineInterfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRayTracingPipelineInterfaceCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkRayTracingPipelineInterfaceCreateInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -26228,15 +25819,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->maxPipelineRayPayloadSize, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -26245,15 +25838,11 @@
 }
 
 void reservedunmarshal_VkRayTracingPipelineCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRayTracingPipelineCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkRayTracingPipelineCreateInfoKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -26261,31 +25850,38 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkPipelineCreateFlags*)&forUnmarshaling->flags, *ptr, sizeof(VkPipelineCreateFlags));
     *ptr += sizeof(VkPipelineCreateFlags);
     memcpy((uint32_t*)&forUnmarshaling->stageCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pStages, forUnmarshaling->stageCount * sizeof(const VkPipelineShaderStageCreateInfo));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->stageCount; ++i)
-    {
-        reservedunmarshal_VkPipelineShaderStageCreateInfo(vkStream, rootType, (VkPipelineShaderStageCreateInfo*)(forUnmarshaling->pStages + i), ptr);
+    vkStream->alloc((void**)&forUnmarshaling->pStages,
+                    forUnmarshaling->stageCount * sizeof(const VkPipelineShaderStageCreateInfo));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->stageCount; ++i) {
+        reservedunmarshal_VkPipelineShaderStageCreateInfo(
+            vkStream, rootType, (VkPipelineShaderStageCreateInfo*)(forUnmarshaling->pStages + i),
+            ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->groupCount, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
-    vkStream->alloc((void**)&forUnmarshaling->pGroups, forUnmarshaling->groupCount * sizeof(const VkRayTracingShaderGroupCreateInfoKHR));
-    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->groupCount; ++i)
-    {
-        reservedunmarshal_VkRayTracingShaderGroupCreateInfoKHR(vkStream, rootType, (VkRayTracingShaderGroupCreateInfoKHR*)(forUnmarshaling->pGroups + i), ptr);
+    vkStream->alloc(
+        (void**)&forUnmarshaling->pGroups,
+        forUnmarshaling->groupCount * sizeof(const VkRayTracingShaderGroupCreateInfoKHR));
+    for (uint32_t i = 0; i < (uint32_t)forUnmarshaling->groupCount; ++i) {
+        reservedunmarshal_VkRayTracingShaderGroupCreateInfoKHR(
+            vkStream, rootType,
+            (VkRayTracingShaderGroupCreateInfoKHR*)(forUnmarshaling->pGroups + i), ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->maxPipelineRayRecursionDepth, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -26293,51 +25889,56 @@
     memcpy((VkPipelineLibraryCreateInfoKHR**)&forUnmarshaling->pLibraryInfo, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pLibraryInfo);
     *ptr += 8;
-    if (forUnmarshaling->pLibraryInfo)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pLibraryInfo, sizeof(const VkPipelineLibraryCreateInfoKHR));
-        reservedunmarshal_VkPipelineLibraryCreateInfoKHR(vkStream, rootType, (VkPipelineLibraryCreateInfoKHR*)(forUnmarshaling->pLibraryInfo), ptr);
+    if (forUnmarshaling->pLibraryInfo) {
+        vkStream->alloc((void**)&forUnmarshaling->pLibraryInfo,
+                        sizeof(const VkPipelineLibraryCreateInfoKHR));
+        reservedunmarshal_VkPipelineLibraryCreateInfoKHR(
+            vkStream, rootType, (VkPipelineLibraryCreateInfoKHR*)(forUnmarshaling->pLibraryInfo),
+            ptr);
     }
     // WARNING PTR CHECK
-    memcpy((VkRayTracingPipelineInterfaceCreateInfoKHR**)&forUnmarshaling->pLibraryInterface, (*ptr), 8);
+    memcpy((VkRayTracingPipelineInterfaceCreateInfoKHR**)&forUnmarshaling->pLibraryInterface,
+           (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pLibraryInterface);
     *ptr += 8;
-    if (forUnmarshaling->pLibraryInterface)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pLibraryInterface, sizeof(const VkRayTracingPipelineInterfaceCreateInfoKHR));
-        reservedunmarshal_VkRayTracingPipelineInterfaceCreateInfoKHR(vkStream, rootType, (VkRayTracingPipelineInterfaceCreateInfoKHR*)(forUnmarshaling->pLibraryInterface), ptr);
+    if (forUnmarshaling->pLibraryInterface) {
+        vkStream->alloc((void**)&forUnmarshaling->pLibraryInterface,
+                        sizeof(const VkRayTracingPipelineInterfaceCreateInfoKHR));
+        reservedunmarshal_VkRayTracingPipelineInterfaceCreateInfoKHR(
+            vkStream, rootType,
+            (VkRayTracingPipelineInterfaceCreateInfoKHR*)(forUnmarshaling->pLibraryInterface), ptr);
     }
     // WARNING PTR CHECK
     memcpy((VkPipelineDynamicStateCreateInfo**)&forUnmarshaling->pDynamicState, (*ptr), 8);
     android::base::Stream::fromBe64((uint8_t*)&forUnmarshaling->pDynamicState);
     *ptr += 8;
-    if (forUnmarshaling->pDynamicState)
-    {
-        vkStream->alloc((void**)&forUnmarshaling->pDynamicState, sizeof(const VkPipelineDynamicStateCreateInfo));
-        reservedunmarshal_VkPipelineDynamicStateCreateInfo(vkStream, rootType, (VkPipelineDynamicStateCreateInfo*)(forUnmarshaling->pDynamicState), ptr);
+    if (forUnmarshaling->pDynamicState) {
+        vkStream->alloc((void**)&forUnmarshaling->pDynamicState,
+                        sizeof(const VkPipelineDynamicStateCreateInfo));
+        reservedunmarshal_VkPipelineDynamicStateCreateInfo(
+            vkStream, rootType, (VkPipelineDynamicStateCreateInfo*)(forUnmarshaling->pDynamicState),
+            ptr);
     }
     uint64_t cgen_var_3;
     memcpy((uint64_t*)&cgen_var_3, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkPipelineLayout*)&forUnmarshaling->layout = (VkPipelineLayout)unbox_VkPipelineLayout((VkPipelineLayout)(*&cgen_var_3));
+    *(VkPipelineLayout*)&forUnmarshaling->layout =
+        (VkPipelineLayout)unbox_VkPipelineLayout((VkPipelineLayout)(*&cgen_var_3));
     uint64_t cgen_var_4;
     memcpy((uint64_t*)&cgen_var_4, *ptr, 1 * 8);
     *ptr += 1 * 8;
-    *(VkPipeline*)&forUnmarshaling->basePipelineHandle = (VkPipeline)unbox_VkPipeline((VkPipeline)(*&cgen_var_4));
+    *(VkPipeline*)&forUnmarshaling->basePipelineHandle =
+        (VkPipeline)unbox_VkPipeline((VkPipeline)(*&cgen_var_4));
     memcpy((int32_t*)&forUnmarshaling->basePipelineIndex, *ptr, sizeof(int32_t));
     *ptr += sizeof(int32_t);
 }
 
 void reservedunmarshal_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceRayTracingPipelineFeaturesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceRayTracingPipelineFeaturesKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -26345,38 +25946,39 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->rayTracingPipeline, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->rayTracingPipelineShaderGroupHandleCaptureReplay, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->rayTracingPipelineShaderGroupHandleCaptureReplay, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->rayTracingPipelineShaderGroupHandleCaptureReplayMixed, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->rayTracingPipelineShaderGroupHandleCaptureReplayMixed, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
-    memcpy((VkBool32*)&forUnmarshaling->rayTracingPipelineTraceRaysIndirect, *ptr, sizeof(VkBool32));
+    memcpy((VkBool32*)&forUnmarshaling->rayTracingPipelineTraceRaysIndirect, *ptr,
+           sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
     memcpy((VkBool32*)&forUnmarshaling->rayTraversalPrimitiveCulling, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 void reservedunmarshal_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceRayTracingPipelinePropertiesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceRayTracingPipelinePropertiesKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -26384,15 +25986,17 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((uint32_t*)&forUnmarshaling->shaderGroupHandleSize, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
@@ -26413,11 +26017,8 @@
 }
 
 void reservedunmarshal_VkStridedDeviceAddressRegionKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkStridedDeviceAddressRegionKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkStridedDeviceAddressRegionKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkDeviceAddress*)&forUnmarshaling->deviceAddress, *ptr, sizeof(VkDeviceAddress));
     *ptr += sizeof(VkDeviceAddress);
     memcpy((VkDeviceSize*)&forUnmarshaling->stride, *ptr, sizeof(VkDeviceSize));
@@ -26426,12 +26027,10 @@
     *ptr += sizeof(VkDeviceSize);
 }
 
-void reservedunmarshal_VkTraceRaysIndirectCommandKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkTraceRaysIndirectCommandKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+void reservedunmarshal_VkTraceRaysIndirectCommandKHR(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkTraceRaysIndirectCommandKHR* forUnmarshaling,
+                                                     uint8_t** ptr) {
     memcpy((uint32_t*)&forUnmarshaling->width, *ptr, sizeof(uint32_t));
     *ptr += sizeof(uint32_t);
     memcpy((uint32_t*)&forUnmarshaling->height, *ptr, sizeof(uint32_t));
@@ -26443,15 +26042,11 @@
 #endif
 #ifdef VK_KHR_ray_query
 void reservedunmarshal_VkPhysicalDeviceRayQueryFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceRayQueryFeaturesKHR* forUnmarshaling,
-    uint8_t** ptr)
-{
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceRayQueryFeaturesKHR* forUnmarshaling, uint8_t** ptr) {
     memcpy((VkStructureType*)&forUnmarshaling->sType, *ptr, sizeof(VkStructureType));
     *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM)
-    {
+    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
         rootType = forUnmarshaling->sType;
     }
     uint32_t pNext_size;
@@ -26459,1571 +26054,2056 @@
     android::base::Stream::fromBe32((uint8_t*)&pNext_size);
     *ptr += sizeof(uint32_t);
     forUnmarshaling->pNext = nullptr;
-    if (pNext_size)
-    {
+    if (pNext_size) {
         vkStream->alloc((void**)&forUnmarshaling->pNext, sizeof(VkStructureType));
         memcpy((void*)forUnmarshaling->pNext, *ptr, sizeof(VkStructureType));
         *ptr += sizeof(VkStructureType);
         VkStructureType extType = *(VkStructureType*)(forUnmarshaling->pNext);
-        vkStream->alloc((void**)&forUnmarshaling->pNext, goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
+        vkStream->alloc((void**)&forUnmarshaling->pNext,
+                        goldfish_vk_extension_struct_size_with_stream_features(
+                            vkStream->getFeatureBits(), rootType, forUnmarshaling->pNext));
         *(VkStructureType*)forUnmarshaling->pNext = extType;
-        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext), ptr);
+        reservedunmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext),
+                                           ptr);
     }
     memcpy((VkBool32*)&forUnmarshaling->rayQuery, *ptr, sizeof(VkBool32));
     *ptr += sizeof(VkBool32);
 }
 
 #endif
-void reservedunmarshal_extension_struct(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    void* structExtension_out,
-    uint8_t** ptr)
-{
+void reservedunmarshal_extension_struct(VulkanStream* vkStream, VkStructureType rootType,
+                                        void* structExtension_out, uint8_t** ptr) {
     VkInstanceCreateInfo* structAccess = (VkInstanceCreateInfo*)(structExtension_out);
-    uint32_t currExtSize = goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), rootType, structExtension_out);
-    if (!currExtSize && structExtension_out)
-    {
+    uint32_t currExtSize = goldfish_vk_extension_struct_size_with_stream_features(
+        vkStream->getFeatureBits(), rootType, structExtension_out);
+    if (!currExtSize && structExtension_out) {
         // unknown struct extension; skip and call on its pNext field
         reservedunmarshal_extension_struct(vkStream, rootType, (void*)structAccess->pNext, ptr);
         return;
-    }
-    else
-    {
+    } else {
         // known or null extension struct
-        if (!currExtSize)
-        {
+        if (!currExtSize) {
             // exit if this was a null extension struct (size == 0 in this branch)
             return;
         }
     }
-    if (!structExtension_out)
-    {
+    if (!structExtension_out) {
         return;
     }
     uint32_t structType = (uint32_t)goldfish_vk_struct_type(structExtension_out);
-    switch(structType)
-    {
+    switch (structType) {
 #ifdef VK_VERSION_1_1
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES:
-        {
-            reservedunmarshal_VkPhysicalDeviceSubgroupProperties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceSubgroupProperties*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES: {
+            reservedunmarshal_VkPhysicalDeviceSubgroupProperties(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceSubgroupProperties*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES:
-        {
-            reservedunmarshal_VkPhysicalDevice16BitStorageFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDevice16BitStorageFeatures*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES: {
+            reservedunmarshal_VkPhysicalDevice16BitStorageFeatures(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDevice16BitStorageFeatures*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS:
-        {
-            reservedunmarshal_VkMemoryDedicatedRequirements(vkStream, rootType, reinterpret_cast<VkMemoryDedicatedRequirements*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS: {
+            reservedunmarshal_VkMemoryDedicatedRequirements(
+                vkStream, rootType,
+                reinterpret_cast<VkMemoryDedicatedRequirements*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO:
-        {
-            reservedunmarshal_VkMemoryDedicatedAllocateInfo(vkStream, rootType, reinterpret_cast<VkMemoryDedicatedAllocateInfo*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO: {
+            reservedunmarshal_VkMemoryDedicatedAllocateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkMemoryDedicatedAllocateInfo*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO:
-        {
-            reservedunmarshal_VkMemoryAllocateFlagsInfo(vkStream, rootType, reinterpret_cast<VkMemoryAllocateFlagsInfo*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO: {
+            reservedunmarshal_VkMemoryAllocateFlagsInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkMemoryAllocateFlagsInfo*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO:
-        {
-            reservedunmarshal_VkDeviceGroupRenderPassBeginInfo(vkStream, rootType, reinterpret_cast<VkDeviceGroupRenderPassBeginInfo*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO: {
+            reservedunmarshal_VkDeviceGroupRenderPassBeginInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkDeviceGroupRenderPassBeginInfo*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO:
-        {
-            reservedunmarshal_VkDeviceGroupCommandBufferBeginInfo(vkStream, rootType, reinterpret_cast<VkDeviceGroupCommandBufferBeginInfo*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO: {
+            reservedunmarshal_VkDeviceGroupCommandBufferBeginInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkDeviceGroupCommandBufferBeginInfo*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO:
-        {
-            reservedunmarshal_VkDeviceGroupSubmitInfo(vkStream, rootType, reinterpret_cast<VkDeviceGroupSubmitInfo*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO: {
+            reservedunmarshal_VkDeviceGroupSubmitInfo(
+                vkStream, rootType, reinterpret_cast<VkDeviceGroupSubmitInfo*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO:
-        {
-            reservedunmarshal_VkDeviceGroupBindSparseInfo(vkStream, rootType, reinterpret_cast<VkDeviceGroupBindSparseInfo*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO: {
+            reservedunmarshal_VkDeviceGroupBindSparseInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkDeviceGroupBindSparseInfo*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO:
-        {
-            reservedunmarshal_VkBindBufferMemoryDeviceGroupInfo(vkStream, rootType, reinterpret_cast<VkBindBufferMemoryDeviceGroupInfo*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO: {
+            reservedunmarshal_VkBindBufferMemoryDeviceGroupInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkBindBufferMemoryDeviceGroupInfo*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO:
-        {
-            reservedunmarshal_VkBindImageMemoryDeviceGroupInfo(vkStream, rootType, reinterpret_cast<VkBindImageMemoryDeviceGroupInfo*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO: {
+            reservedunmarshal_VkBindImageMemoryDeviceGroupInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkBindImageMemoryDeviceGroupInfo*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO:
-        {
-            reservedunmarshal_VkDeviceGroupDeviceCreateInfo(vkStream, rootType, reinterpret_cast<VkDeviceGroupDeviceCreateInfo*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO: {
+            reservedunmarshal_VkDeviceGroupDeviceCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkDeviceGroupDeviceCreateInfo*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2:
-        {
-            reservedunmarshal_VkPhysicalDeviceFeatures2(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceFeatures2*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2: {
+            reservedunmarshal_VkPhysicalDeviceFeatures2(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceFeatures2*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES:
-        {
-            reservedunmarshal_VkPhysicalDevicePointClippingProperties(vkStream, rootType, reinterpret_cast<VkPhysicalDevicePointClippingProperties*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES: {
+            reservedunmarshal_VkPhysicalDevicePointClippingProperties(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDevicePointClippingProperties*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO:
-        {
-            reservedunmarshal_VkRenderPassInputAttachmentAspectCreateInfo(vkStream, rootType, reinterpret_cast<VkRenderPassInputAttachmentAspectCreateInfo*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO: {
+            reservedunmarshal_VkRenderPassInputAttachmentAspectCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkRenderPassInputAttachmentAspectCreateInfo*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO:
-        {
-            reservedunmarshal_VkImageViewUsageCreateInfo(vkStream, rootType, reinterpret_cast<VkImageViewUsageCreateInfo*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO: {
+            reservedunmarshal_VkImageViewUsageCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkImageViewUsageCreateInfo*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO:
-        {
-            reservedunmarshal_VkPipelineTessellationDomainOriginStateCreateInfo(vkStream, rootType, reinterpret_cast<VkPipelineTessellationDomainOriginStateCreateInfo*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO: {
+            reservedunmarshal_VkPipelineTessellationDomainOriginStateCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineTessellationDomainOriginStateCreateInfo*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO:
-        {
-            reservedunmarshal_VkRenderPassMultiviewCreateInfo(vkStream, rootType, reinterpret_cast<VkRenderPassMultiviewCreateInfo*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO: {
+            reservedunmarshal_VkRenderPassMultiviewCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkRenderPassMultiviewCreateInfo*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES:
-        {
-            reservedunmarshal_VkPhysicalDeviceMultiviewFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceMultiviewFeatures*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES: {
+            reservedunmarshal_VkPhysicalDeviceMultiviewFeatures(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceMultiviewFeatures*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES:
-        {
-            reservedunmarshal_VkPhysicalDeviceMultiviewProperties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceMultiviewProperties*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES: {
+            reservedunmarshal_VkPhysicalDeviceMultiviewProperties(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceMultiviewProperties*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES:
-        {
-            reservedunmarshal_VkPhysicalDeviceVariablePointersFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceVariablePointersFeatures*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES: {
+            reservedunmarshal_VkPhysicalDeviceVariablePointersFeatures(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceVariablePointersFeatures*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES:
-        {
-            reservedunmarshal_VkPhysicalDeviceProtectedMemoryFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceProtectedMemoryFeatures*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES: {
+            reservedunmarshal_VkPhysicalDeviceProtectedMemoryFeatures(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceProtectedMemoryFeatures*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES:
-        {
-            reservedunmarshal_VkPhysicalDeviceProtectedMemoryProperties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceProtectedMemoryProperties*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES: {
+            reservedunmarshal_VkPhysicalDeviceProtectedMemoryProperties(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceProtectedMemoryProperties*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO:
-        {
-            reservedunmarshal_VkProtectedSubmitInfo(vkStream, rootType, reinterpret_cast<VkProtectedSubmitInfo*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO: {
+            reservedunmarshal_VkProtectedSubmitInfo(
+                vkStream, rootType, reinterpret_cast<VkProtectedSubmitInfo*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO:
-        {
-            reservedunmarshal_VkSamplerYcbcrConversionInfo(vkStream, rootType, reinterpret_cast<VkSamplerYcbcrConversionInfo*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO: {
+            reservedunmarshal_VkSamplerYcbcrConversionInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkSamplerYcbcrConversionInfo*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO:
-        {
-            reservedunmarshal_VkBindImagePlaneMemoryInfo(vkStream, rootType, reinterpret_cast<VkBindImagePlaneMemoryInfo*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO: {
+            reservedunmarshal_VkBindImagePlaneMemoryInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkBindImagePlaneMemoryInfo*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO:
-        {
-            reservedunmarshal_VkImagePlaneMemoryRequirementsInfo(vkStream, rootType, reinterpret_cast<VkImagePlaneMemoryRequirementsInfo*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO: {
+            reservedunmarshal_VkImagePlaneMemoryRequirementsInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkImagePlaneMemoryRequirementsInfo*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES:
-        {
-            reservedunmarshal_VkPhysicalDeviceSamplerYcbcrConversionFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES: {
+            reservedunmarshal_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES:
-        {
-            reservedunmarshal_VkSamplerYcbcrConversionImageFormatProperties(vkStream, rootType, reinterpret_cast<VkSamplerYcbcrConversionImageFormatProperties*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES: {
+            reservedunmarshal_VkSamplerYcbcrConversionImageFormatProperties(
+                vkStream, rootType,
+                reinterpret_cast<VkSamplerYcbcrConversionImageFormatProperties*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO:
-        {
-            reservedunmarshal_VkPhysicalDeviceExternalImageFormatInfo(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceExternalImageFormatInfo*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO: {
+            reservedunmarshal_VkPhysicalDeviceExternalImageFormatInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceExternalImageFormatInfo*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES:
-        {
-            reservedunmarshal_VkExternalImageFormatProperties(vkStream, rootType, reinterpret_cast<VkExternalImageFormatProperties*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES: {
+            reservedunmarshal_VkExternalImageFormatProperties(
+                vkStream, rootType,
+                reinterpret_cast<VkExternalImageFormatProperties*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES:
-        {
-            reservedunmarshal_VkPhysicalDeviceIDProperties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceIDProperties*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES: {
+            reservedunmarshal_VkPhysicalDeviceIDProperties(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceIDProperties*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO:
-        {
-            reservedunmarshal_VkExternalMemoryImageCreateInfo(vkStream, rootType, reinterpret_cast<VkExternalMemoryImageCreateInfo*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO: {
+            reservedunmarshal_VkExternalMemoryImageCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkExternalMemoryImageCreateInfo*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO:
-        {
-            reservedunmarshal_VkExternalMemoryBufferCreateInfo(vkStream, rootType, reinterpret_cast<VkExternalMemoryBufferCreateInfo*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO: {
+            reservedunmarshal_VkExternalMemoryBufferCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkExternalMemoryBufferCreateInfo*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO:
-        {
-            reservedunmarshal_VkExportMemoryAllocateInfo(vkStream, rootType, reinterpret_cast<VkExportMemoryAllocateInfo*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO: {
+            reservedunmarshal_VkExportMemoryAllocateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkExportMemoryAllocateInfo*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO:
-        {
-            reservedunmarshal_VkExportFenceCreateInfo(vkStream, rootType, reinterpret_cast<VkExportFenceCreateInfo*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO: {
+            reservedunmarshal_VkExportFenceCreateInfo(
+                vkStream, rootType, reinterpret_cast<VkExportFenceCreateInfo*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO:
-        {
-            reservedunmarshal_VkExportSemaphoreCreateInfo(vkStream, rootType, reinterpret_cast<VkExportSemaphoreCreateInfo*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO: {
+            reservedunmarshal_VkExportSemaphoreCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkExportSemaphoreCreateInfo*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES:
-        {
-            reservedunmarshal_VkPhysicalDeviceMaintenance3Properties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceMaintenance3Properties*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES: {
+            reservedunmarshal_VkPhysicalDeviceMaintenance3Properties(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceMaintenance3Properties*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES:
-        {
-            reservedunmarshal_VkPhysicalDeviceShaderDrawParametersFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderDrawParametersFeatures*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES: {
+            reservedunmarshal_VkPhysicalDeviceShaderDrawParametersFeatures(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderDrawParametersFeatures*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_VERSION_1_2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES:
-        {
-            reservedunmarshal_VkPhysicalDeviceVulkan11Features(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceVulkan11Features*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: {
+            reservedunmarshal_VkPhysicalDeviceVulkan11Features(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceVulkan11Features*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES:
-        {
-            reservedunmarshal_VkPhysicalDeviceVulkan11Properties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceVulkan11Properties*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: {
+            reservedunmarshal_VkPhysicalDeviceVulkan11Properties(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceVulkan11Properties*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES:
-        {
-            reservedunmarshal_VkPhysicalDeviceVulkan12Features(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceVulkan12Features*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: {
+            reservedunmarshal_VkPhysicalDeviceVulkan12Features(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceVulkan12Features*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES:
-        {
-            reservedunmarshal_VkPhysicalDeviceVulkan12Properties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceVulkan12Properties*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: {
+            reservedunmarshal_VkPhysicalDeviceVulkan12Properties(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceVulkan12Properties*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO:
-        {
-            reservedunmarshal_VkImageFormatListCreateInfo(vkStream, rootType, reinterpret_cast<VkImageFormatListCreateInfo*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO: {
+            reservedunmarshal_VkImageFormatListCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkImageFormatListCreateInfo*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES:
-        {
-            reservedunmarshal_VkPhysicalDevice8BitStorageFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDevice8BitStorageFeatures*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES: {
+            reservedunmarshal_VkPhysicalDevice8BitStorageFeatures(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDevice8BitStorageFeatures*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES:
-        {
-            reservedunmarshal_VkPhysicalDeviceDriverProperties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceDriverProperties*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES: {
+            reservedunmarshal_VkPhysicalDeviceDriverProperties(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceDriverProperties*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES:
-        {
-            reservedunmarshal_VkPhysicalDeviceShaderAtomicInt64Features(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderAtomicInt64Features*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES: {
+            reservedunmarshal_VkPhysicalDeviceShaderAtomicInt64Features(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderAtomicInt64Features*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES:
-        {
-            reservedunmarshal_VkPhysicalDeviceShaderFloat16Int8Features(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderFloat16Int8Features*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES: {
+            reservedunmarshal_VkPhysicalDeviceShaderFloat16Int8Features(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderFloat16Int8Features*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES:
-        {
-            reservedunmarshal_VkPhysicalDeviceFloatControlsProperties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceFloatControlsProperties*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES: {
+            reservedunmarshal_VkPhysicalDeviceFloatControlsProperties(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceFloatControlsProperties*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO:
-        {
-            reservedunmarshal_VkDescriptorSetLayoutBindingFlagsCreateInfo(vkStream, rootType, reinterpret_cast<VkDescriptorSetLayoutBindingFlagsCreateInfo*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO: {
+            reservedunmarshal_VkDescriptorSetLayoutBindingFlagsCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkDescriptorSetLayoutBindingFlagsCreateInfo*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES:
-        {
-            reservedunmarshal_VkPhysicalDeviceDescriptorIndexingFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceDescriptorIndexingFeatures*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES: {
+            reservedunmarshal_VkPhysicalDeviceDescriptorIndexingFeatures(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceDescriptorIndexingFeatures*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES:
-        {
-            reservedunmarshal_VkPhysicalDeviceDescriptorIndexingProperties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceDescriptorIndexingProperties*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES: {
+            reservedunmarshal_VkPhysicalDeviceDescriptorIndexingProperties(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceDescriptorIndexingProperties*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO:
-        {
-            reservedunmarshal_VkDescriptorSetVariableDescriptorCountAllocateInfo(vkStream, rootType, reinterpret_cast<VkDescriptorSetVariableDescriptorCountAllocateInfo*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO: {
+            reservedunmarshal_VkDescriptorSetVariableDescriptorCountAllocateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkDescriptorSetVariableDescriptorCountAllocateInfo*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT:
-        {
-            reservedunmarshal_VkDescriptorSetVariableDescriptorCountLayoutSupport(vkStream, rootType, reinterpret_cast<VkDescriptorSetVariableDescriptorCountLayoutSupport*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT: {
+            reservedunmarshal_VkDescriptorSetVariableDescriptorCountLayoutSupport(
+                vkStream, rootType,
+                reinterpret_cast<VkDescriptorSetVariableDescriptorCountLayoutSupport*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE:
-        {
-            reservedunmarshal_VkSubpassDescriptionDepthStencilResolve(vkStream, rootType, reinterpret_cast<VkSubpassDescriptionDepthStencilResolve*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE: {
+            reservedunmarshal_VkSubpassDescriptionDepthStencilResolve(
+                vkStream, rootType,
+                reinterpret_cast<VkSubpassDescriptionDepthStencilResolve*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES:
-        {
-            reservedunmarshal_VkPhysicalDeviceDepthStencilResolveProperties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceDepthStencilResolveProperties*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES: {
+            reservedunmarshal_VkPhysicalDeviceDepthStencilResolveProperties(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceDepthStencilResolveProperties*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES:
-        {
-            reservedunmarshal_VkPhysicalDeviceScalarBlockLayoutFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceScalarBlockLayoutFeatures*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES: {
+            reservedunmarshal_VkPhysicalDeviceScalarBlockLayoutFeatures(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceScalarBlockLayoutFeatures*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO:
-        {
-            reservedunmarshal_VkImageStencilUsageCreateInfo(vkStream, rootType, reinterpret_cast<VkImageStencilUsageCreateInfo*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO: {
+            reservedunmarshal_VkImageStencilUsageCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkImageStencilUsageCreateInfo*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO:
-        {
-            reservedunmarshal_VkSamplerReductionModeCreateInfo(vkStream, rootType, reinterpret_cast<VkSamplerReductionModeCreateInfo*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO: {
+            reservedunmarshal_VkSamplerReductionModeCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkSamplerReductionModeCreateInfo*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES:
-        {
-            reservedunmarshal_VkPhysicalDeviceSamplerFilterMinmaxProperties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceSamplerFilterMinmaxProperties*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES: {
+            reservedunmarshal_VkPhysicalDeviceSamplerFilterMinmaxProperties(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceSamplerFilterMinmaxProperties*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES:
-        {
-            reservedunmarshal_VkPhysicalDeviceVulkanMemoryModelFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceVulkanMemoryModelFeatures*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES: {
+            reservedunmarshal_VkPhysicalDeviceVulkanMemoryModelFeatures(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceVulkanMemoryModelFeatures*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES:
-        {
-            reservedunmarshal_VkPhysicalDeviceImagelessFramebufferFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceImagelessFramebufferFeatures*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES: {
+            reservedunmarshal_VkPhysicalDeviceImagelessFramebufferFeatures(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceImagelessFramebufferFeatures*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO:
-        {
-            reservedunmarshal_VkFramebufferAttachmentsCreateInfo(vkStream, rootType, reinterpret_cast<VkFramebufferAttachmentsCreateInfo*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO: {
+            reservedunmarshal_VkFramebufferAttachmentsCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkFramebufferAttachmentsCreateInfo*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO:
-        {
-            reservedunmarshal_VkRenderPassAttachmentBeginInfo(vkStream, rootType, reinterpret_cast<VkRenderPassAttachmentBeginInfo*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO: {
+            reservedunmarshal_VkRenderPassAttachmentBeginInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkRenderPassAttachmentBeginInfo*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES:
-        {
-            reservedunmarshal_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceUniformBufferStandardLayoutFeatures*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES: {
+            reservedunmarshal_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceUniformBufferStandardLayoutFeatures*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES:
-        {
-            reservedunmarshal_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES: {
+            reservedunmarshal_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES:
-        {
-            reservedunmarshal_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES: {
+            reservedunmarshal_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT:
-        {
-            reservedunmarshal_VkAttachmentReferenceStencilLayout(vkStream, rootType, reinterpret_cast<VkAttachmentReferenceStencilLayout*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT: {
+            reservedunmarshal_VkAttachmentReferenceStencilLayout(
+                vkStream, rootType,
+                reinterpret_cast<VkAttachmentReferenceStencilLayout*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT:
-        {
-            reservedunmarshal_VkAttachmentDescriptionStencilLayout(vkStream, rootType, reinterpret_cast<VkAttachmentDescriptionStencilLayout*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT: {
+            reservedunmarshal_VkAttachmentDescriptionStencilLayout(
+                vkStream, rootType,
+                reinterpret_cast<VkAttachmentDescriptionStencilLayout*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES:
-        {
-            reservedunmarshal_VkPhysicalDeviceHostQueryResetFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceHostQueryResetFeatures*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES: {
+            reservedunmarshal_VkPhysicalDeviceHostQueryResetFeatures(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceHostQueryResetFeatures*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES:
-        {
-            reservedunmarshal_VkPhysicalDeviceTimelineSemaphoreFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceTimelineSemaphoreFeatures*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES: {
+            reservedunmarshal_VkPhysicalDeviceTimelineSemaphoreFeatures(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceTimelineSemaphoreFeatures*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES:
-        {
-            reservedunmarshal_VkPhysicalDeviceTimelineSemaphoreProperties(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceTimelineSemaphoreProperties*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES: {
+            reservedunmarshal_VkPhysicalDeviceTimelineSemaphoreProperties(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceTimelineSemaphoreProperties*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO:
-        {
-            reservedunmarshal_VkSemaphoreTypeCreateInfo(vkStream, rootType, reinterpret_cast<VkSemaphoreTypeCreateInfo*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO: {
+            reservedunmarshal_VkSemaphoreTypeCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkSemaphoreTypeCreateInfo*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO:
-        {
-            reservedunmarshal_VkTimelineSemaphoreSubmitInfo(vkStream, rootType, reinterpret_cast<VkTimelineSemaphoreSubmitInfo*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO: {
+            reservedunmarshal_VkTimelineSemaphoreSubmitInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkTimelineSemaphoreSubmitInfo*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES:
-        {
-            reservedunmarshal_VkPhysicalDeviceBufferDeviceAddressFeatures(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceBufferDeviceAddressFeatures*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES: {
+            reservedunmarshal_VkPhysicalDeviceBufferDeviceAddressFeatures(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceBufferDeviceAddressFeatures*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO:
-        {
-            reservedunmarshal_VkBufferOpaqueCaptureAddressCreateInfo(vkStream, rootType, reinterpret_cast<VkBufferOpaqueCaptureAddressCreateInfo*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO: {
+            reservedunmarshal_VkBufferOpaqueCaptureAddressCreateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkBufferOpaqueCaptureAddressCreateInfo*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO:
-        {
-            reservedunmarshal_VkMemoryOpaqueCaptureAddressAllocateInfo(vkStream, rootType, reinterpret_cast<VkMemoryOpaqueCaptureAddressAllocateInfo*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO: {
+            reservedunmarshal_VkMemoryOpaqueCaptureAddressAllocateInfo(
+                vkStream, rootType,
+                reinterpret_cast<VkMemoryOpaqueCaptureAddressAllocateInfo*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_swapchain
-        case VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR:
-        {
-            reservedunmarshal_VkImageSwapchainCreateInfoKHR(vkStream, rootType, reinterpret_cast<VkImageSwapchainCreateInfoKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR: {
+            reservedunmarshal_VkImageSwapchainCreateInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkImageSwapchainCreateInfoKHR*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR:
-        {
-            reservedunmarshal_VkBindImageMemorySwapchainInfoKHR(vkStream, rootType, reinterpret_cast<VkBindImageMemorySwapchainInfoKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR: {
+            reservedunmarshal_VkBindImageMemorySwapchainInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkBindImageMemorySwapchainInfoKHR*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR:
-        {
-            reservedunmarshal_VkDeviceGroupPresentInfoKHR(vkStream, rootType, reinterpret_cast<VkDeviceGroupPresentInfoKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR: {
+            reservedunmarshal_VkDeviceGroupPresentInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkDeviceGroupPresentInfoKHR*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR:
-        {
-            reservedunmarshal_VkDeviceGroupSwapchainCreateInfoKHR(vkStream, rootType, reinterpret_cast<VkDeviceGroupSwapchainCreateInfoKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR: {
+            reservedunmarshal_VkDeviceGroupSwapchainCreateInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkDeviceGroupSwapchainCreateInfoKHR*>(structExtension_out), ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_display_swapchain
-        case VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR:
-        {
-            reservedunmarshal_VkDisplayPresentInfoKHR(vkStream, rootType, reinterpret_cast<VkDisplayPresentInfoKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR: {
+            reservedunmarshal_VkDisplayPresentInfoKHR(
+                vkStream, rootType, reinterpret_cast<VkDisplayPresentInfoKHR*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_video_queue
-        case VK_STRUCTURE_TYPE_VIDEO_QUEUE_FAMILY_PROPERTIES_2_KHR:
-        {
-            reservedunmarshal_VkVideoQueueFamilyProperties2KHR(vkStream, rootType, reinterpret_cast<VkVideoQueueFamilyProperties2KHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_VIDEO_QUEUE_FAMILY_PROPERTIES_2_KHR: {
+            reservedunmarshal_VkVideoQueueFamilyProperties2KHR(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoQueueFamilyProperties2KHR*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_PROFILE_KHR:
-        {
-            reservedunmarshal_VkVideoProfileKHR(vkStream, rootType, reinterpret_cast<VkVideoProfileKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_VIDEO_PROFILE_KHR: {
+            reservedunmarshal_VkVideoProfileKHR(
+                vkStream, rootType, reinterpret_cast<VkVideoProfileKHR*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_PROFILES_KHR:
-        {
-            reservedunmarshal_VkVideoProfilesKHR(vkStream, rootType, reinterpret_cast<VkVideoProfilesKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_VIDEO_PROFILES_KHR: {
+            reservedunmarshal_VkVideoProfilesKHR(
+                vkStream, rootType, reinterpret_cast<VkVideoProfilesKHR*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_dynamic_rendering
-        case VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR:
-        {
-            reservedunmarshal_VkPipelineRenderingCreateInfoKHR(vkStream, rootType, reinterpret_cast<VkPipelineRenderingCreateInfoKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR: {
+            reservedunmarshal_VkPipelineRenderingCreateInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineRenderingCreateInfoKHR*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES_KHR:
-        {
-            reservedunmarshal_VkPhysicalDeviceDynamicRenderingFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceDynamicRenderingFeaturesKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES_KHR: {
+            reservedunmarshal_VkPhysicalDeviceDynamicRenderingFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceDynamicRenderingFeaturesKHR*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR:
-        {
-            reservedunmarshal_VkCommandBufferInheritanceRenderingInfoKHR(vkStream, rootType, reinterpret_cast<VkCommandBufferInheritanceRenderingInfoKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR: {
+            reservedunmarshal_VkCommandBufferInheritanceRenderingInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkCommandBufferInheritanceRenderingInfoKHR*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR:
-        {
-            reservedunmarshal_VkRenderingFragmentShadingRateAttachmentInfoKHR(vkStream, rootType, reinterpret_cast<VkRenderingFragmentShadingRateAttachmentInfoKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR: {
+            reservedunmarshal_VkRenderingFragmentShadingRateAttachmentInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkRenderingFragmentShadingRateAttachmentInfoKHR*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_INFO_EXT:
-        {
-            reservedunmarshal_VkRenderingFragmentDensityMapAttachmentInfoEXT(vkStream, rootType, reinterpret_cast<VkRenderingFragmentDensityMapAttachmentInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_INFO_EXT: {
+            reservedunmarshal_VkRenderingFragmentDensityMapAttachmentInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkRenderingFragmentDensityMapAttachmentInfoEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_ATTACHMENT_SAMPLE_COUNT_INFO_AMD:
-        {
-            reservedunmarshal_VkAttachmentSampleCountInfoAMD(vkStream, rootType, reinterpret_cast<VkAttachmentSampleCountInfoAMD*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_ATTACHMENT_SAMPLE_COUNT_INFO_AMD: {
+            reservedunmarshal_VkAttachmentSampleCountInfoAMD(
+                vkStream, rootType,
+                reinterpret_cast<VkAttachmentSampleCountInfoAMD*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_MULTIVIEW_PER_VIEW_ATTRIBUTES_INFO_NVX:
-        {
-            reservedunmarshal_VkMultiviewPerViewAttributesInfoNVX(vkStream, rootType, reinterpret_cast<VkMultiviewPerViewAttributesInfoNVX*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_MULTIVIEW_PER_VIEW_ATTRIBUTES_INFO_NVX: {
+            reservedunmarshal_VkMultiviewPerViewAttributesInfoNVX(
+                vkStream, rootType,
+                reinterpret_cast<VkMultiviewPerViewAttributesInfoNVX*>(structExtension_out), ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_external_memory_win32
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
-        {
-            reservedunmarshal_VkImportMemoryWin32HandleInfoKHR(vkStream, rootType, reinterpret_cast<VkImportMemoryWin32HandleInfoKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR: {
+            reservedunmarshal_VkImportMemoryWin32HandleInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkImportMemoryWin32HandleInfoKHR*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
-        {
-            reservedunmarshal_VkExportMemoryWin32HandleInfoKHR(vkStream, rootType, reinterpret_cast<VkExportMemoryWin32HandleInfoKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR: {
+            reservedunmarshal_VkExportMemoryWin32HandleInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkExportMemoryWin32HandleInfoKHR*>(structExtension_out), ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_external_memory_fd
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR:
-        {
-            reservedunmarshal_VkImportMemoryFdInfoKHR(vkStream, rootType, reinterpret_cast<VkImportMemoryFdInfoKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR: {
+            reservedunmarshal_VkImportMemoryFdInfoKHR(
+                vkStream, rootType, reinterpret_cast<VkImportMemoryFdInfoKHR*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_win32_keyed_mutex
-        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR:
-        {
-            reservedunmarshal_VkWin32KeyedMutexAcquireReleaseInfoKHR(vkStream, rootType, reinterpret_cast<VkWin32KeyedMutexAcquireReleaseInfoKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR: {
+            reservedunmarshal_VkWin32KeyedMutexAcquireReleaseInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkWin32KeyedMutexAcquireReleaseInfoKHR*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_external_semaphore_win32
-        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR:
-        {
-            reservedunmarshal_VkExportSemaphoreWin32HandleInfoKHR(vkStream, rootType, reinterpret_cast<VkExportSemaphoreWin32HandleInfoKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR: {
+            reservedunmarshal_VkExportSemaphoreWin32HandleInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkExportSemaphoreWin32HandleInfoKHR*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR:
-        {
-            reservedunmarshal_VkD3D12FenceSubmitInfoKHR(vkStream, rootType, reinterpret_cast<VkD3D12FenceSubmitInfoKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR: {
+            reservedunmarshal_VkD3D12FenceSubmitInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkD3D12FenceSubmitInfoKHR*>(structExtension_out), ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_push_descriptor
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR:
-        {
-            reservedunmarshal_VkPhysicalDevicePushDescriptorPropertiesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDevicePushDescriptorPropertiesKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR: {
+            reservedunmarshal_VkPhysicalDevicePushDescriptorPropertiesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDevicePushDescriptorPropertiesKHR*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_incremental_present
-        case VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR:
-        {
-            reservedunmarshal_VkPresentRegionsKHR(vkStream, rootType, reinterpret_cast<VkPresentRegionsKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR: {
+            reservedunmarshal_VkPresentRegionsKHR(
+                vkStream, rootType, reinterpret_cast<VkPresentRegionsKHR*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_shared_presentable_image
-        case VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR:
-        {
-            reservedunmarshal_VkSharedPresentSurfaceCapabilitiesKHR(vkStream, rootType, reinterpret_cast<VkSharedPresentSurfaceCapabilitiesKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR: {
+            reservedunmarshal_VkSharedPresentSurfaceCapabilitiesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkSharedPresentSurfaceCapabilitiesKHR*>(structExtension_out), ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_external_fence_win32
-        case VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR:
-        {
-            reservedunmarshal_VkExportFenceWin32HandleInfoKHR(vkStream, rootType, reinterpret_cast<VkExportFenceWin32HandleInfoKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR: {
+            reservedunmarshal_VkExportFenceWin32HandleInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkExportFenceWin32HandleInfoKHR*>(structExtension_out), ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_performance_query
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR:
-        {
-            reservedunmarshal_VkPhysicalDevicePerformanceQueryFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDevicePerformanceQueryFeaturesKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR: {
+            reservedunmarshal_VkPhysicalDevicePerformanceQueryFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDevicePerformanceQueryFeaturesKHR*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR:
-        {
-            reservedunmarshal_VkPhysicalDevicePerformanceQueryPropertiesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDevicePerformanceQueryPropertiesKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR: {
+            reservedunmarshal_VkPhysicalDevicePerformanceQueryPropertiesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDevicePerformanceQueryPropertiesKHR*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR:
-        {
-            reservedunmarshal_VkQueryPoolPerformanceCreateInfoKHR(vkStream, rootType, reinterpret_cast<VkQueryPoolPerformanceCreateInfoKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR: {
+            reservedunmarshal_VkQueryPoolPerformanceCreateInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkQueryPoolPerformanceCreateInfoKHR*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR:
-        {
-            reservedunmarshal_VkPerformanceQuerySubmitInfoKHR(vkStream, rootType, reinterpret_cast<VkPerformanceQuerySubmitInfoKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR: {
+            reservedunmarshal_VkPerformanceQuerySubmitInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPerformanceQuerySubmitInfoKHR*>(structExtension_out), ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_portability_subset
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR:
-        {
-            reservedunmarshal_VkPhysicalDevicePortabilitySubsetFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDevicePortabilitySubsetFeaturesKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR: {
+            reservedunmarshal_VkPhysicalDevicePortabilitySubsetFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDevicePortabilitySubsetFeaturesKHR*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR:
-        {
-            reservedunmarshal_VkPhysicalDevicePortabilitySubsetPropertiesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDevicePortabilitySubsetPropertiesKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR: {
+            reservedunmarshal_VkPhysicalDevicePortabilitySubsetPropertiesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDevicePortabilitySubsetPropertiesKHR*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_shader_clock
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR:
-        {
-            reservedunmarshal_VkPhysicalDeviceShaderClockFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderClockFeaturesKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR: {
+            reservedunmarshal_VkPhysicalDeviceShaderClockFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderClockFeaturesKHR*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_shader_terminate_invocation
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR:
-        {
-            reservedunmarshal_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR: {
+            reservedunmarshal_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_fragment_shading_rate
-        case VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR:
-        {
-            reservedunmarshal_VkFragmentShadingRateAttachmentInfoKHR(vkStream, rootType, reinterpret_cast<VkFragmentShadingRateAttachmentInfoKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR: {
+            reservedunmarshal_VkFragmentShadingRateAttachmentInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkFragmentShadingRateAttachmentInfoKHR*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR:
-        {
-            reservedunmarshal_VkPipelineFragmentShadingRateStateCreateInfoKHR(vkStream, rootType, reinterpret_cast<VkPipelineFragmentShadingRateStateCreateInfoKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR: {
+            reservedunmarshal_VkPipelineFragmentShadingRateStateCreateInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineFragmentShadingRateStateCreateInfoKHR*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR:
-        {
-            reservedunmarshal_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceFragmentShadingRateFeaturesKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR: {
+            reservedunmarshal_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceFragmentShadingRateFeaturesKHR*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR:
-        {
-            reservedunmarshal_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceFragmentShadingRatePropertiesKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR: {
+            reservedunmarshal_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceFragmentShadingRatePropertiesKHR*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_surface_protected_capabilities
-        case VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR:
-        {
-            reservedunmarshal_VkSurfaceProtectedCapabilitiesKHR(vkStream, rootType, reinterpret_cast<VkSurfaceProtectedCapabilitiesKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR: {
+            reservedunmarshal_VkSurfaceProtectedCapabilitiesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkSurfaceProtectedCapabilitiesKHR*>(structExtension_out), ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_present_wait
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR:
-        {
-            reservedunmarshal_VkPhysicalDevicePresentWaitFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDevicePresentWaitFeaturesKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR: {
+            reservedunmarshal_VkPhysicalDevicePresentWaitFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDevicePresentWaitFeaturesKHR*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_pipeline_executable_properties
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR:
-        {
-            reservedunmarshal_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR: {
+            reservedunmarshal_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_shader_integer_dot_product
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR:
-        {
-            reservedunmarshal_VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR: {
+            reservedunmarshal_VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES_KHR:
-        {
-            reservedunmarshal_VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES_KHR: {
+            reservedunmarshal_VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_present_id
-        case VK_STRUCTURE_TYPE_PRESENT_ID_KHR:
-        {
-            reservedunmarshal_VkPresentIdKHR(vkStream, rootType, reinterpret_cast<VkPresentIdKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PRESENT_ID_KHR: {
+            reservedunmarshal_VkPresentIdKHR(
+                vkStream, rootType, reinterpret_cast<VkPresentIdKHR*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR:
-        {
-            reservedunmarshal_VkPhysicalDevicePresentIdFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDevicePresentIdFeaturesKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR: {
+            reservedunmarshal_VkPhysicalDevicePresentIdFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDevicePresentIdFeaturesKHR*>(structExtension_out), ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_video_encode_queue
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_INFO_KHR:
-        {
-            reservedunmarshal_VkVideoEncodeRateControlInfoKHR(vkStream, rootType, reinterpret_cast<VkVideoEncodeRateControlInfoKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_INFO_KHR: {
+            reservedunmarshal_VkVideoEncodeRateControlInfoKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoEncodeRateControlInfoKHR*>(structExtension_out), ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_synchronization2
-        case VK_STRUCTURE_TYPE_MEMORY_BARRIER_2_KHR:
-        {
-            reservedunmarshal_VkMemoryBarrier2KHR(vkStream, rootType, reinterpret_cast<VkMemoryBarrier2KHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_MEMORY_BARRIER_2_KHR: {
+            reservedunmarshal_VkMemoryBarrier2KHR(
+                vkStream, rootType, reinterpret_cast<VkMemoryBarrier2KHR*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR:
-        {
-            reservedunmarshal_VkPhysicalDeviceSynchronization2FeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceSynchronization2FeaturesKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR: {
+            reservedunmarshal_VkPhysicalDeviceSynchronization2FeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceSynchronization2FeaturesKHR*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_2_NV:
-        {
-            reservedunmarshal_VkQueueFamilyCheckpointProperties2NV(vkStream, rootType, reinterpret_cast<VkQueueFamilyCheckpointProperties2NV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_2_NV: {
+            reservedunmarshal_VkQueueFamilyCheckpointProperties2NV(
+                vkStream, rootType,
+                reinterpret_cast<VkQueueFamilyCheckpointProperties2NV*>(structExtension_out), ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_shader_subgroup_uniform_control_flow
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR:
-        {
-            reservedunmarshal_VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR: {
+            reservedunmarshal_VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_zero_initialize_workgroup_memory
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR:
-        {
-            reservedunmarshal_VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR: {
+            reservedunmarshal_VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_workgroup_memory_explicit_layout
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR:
-        {
-            reservedunmarshal_VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR: {
+            reservedunmarshal_VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_format_feature_flags2
-        case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR:
-        {
-            reservedunmarshal_VkFormatProperties3KHR(vkStream, rootType, reinterpret_cast<VkFormatProperties3KHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR: {
+            reservedunmarshal_VkFormatProperties3KHR(
+                vkStream, rootType, reinterpret_cast<VkFormatProperties3KHR*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_maintenance4
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES_KHR:
-        {
-            reservedunmarshal_VkPhysicalDeviceMaintenance4FeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceMaintenance4FeaturesKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES_KHR: {
+            reservedunmarshal_VkPhysicalDeviceMaintenance4FeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceMaintenance4FeaturesKHR*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES_KHR:
-        {
-            reservedunmarshal_VkPhysicalDeviceMaintenance4PropertiesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceMaintenance4PropertiesKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES_KHR: {
+            reservedunmarshal_VkPhysicalDeviceMaintenance4PropertiesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceMaintenance4PropertiesKHR*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_ANDROID_native_buffer
-        case VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID:
-        {
-            reservedunmarshal_VkNativeBufferANDROID(vkStream, rootType, reinterpret_cast<VkNativeBufferANDROID*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID: {
+            reservedunmarshal_VkNativeBufferANDROID(
+                vkStream, rootType, reinterpret_cast<VkNativeBufferANDROID*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_debug_report
-        case VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT:
-        {
-            reservedunmarshal_VkDebugReportCallbackCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkDebugReportCallbackCreateInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT: {
+            reservedunmarshal_VkDebugReportCallbackCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkDebugReportCallbackCreateInfoEXT*>(structExtension_out), ptr);
             break;
         }
 #endif
 #ifdef VK_AMD_rasterization_order
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD:
-        {
-            reservedunmarshal_VkPipelineRasterizationStateRasterizationOrderAMD(vkStream, rootType, reinterpret_cast<VkPipelineRasterizationStateRasterizationOrderAMD*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD: {
+            reservedunmarshal_VkPipelineRasterizationStateRasterizationOrderAMD(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineRasterizationStateRasterizationOrderAMD*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_NV_dedicated_allocation
-        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV:
-        {
-            reservedunmarshal_VkDedicatedAllocationImageCreateInfoNV(vkStream, rootType, reinterpret_cast<VkDedicatedAllocationImageCreateInfoNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV: {
+            reservedunmarshal_VkDedicatedAllocationImageCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkDedicatedAllocationImageCreateInfoNV*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV:
-        {
-            reservedunmarshal_VkDedicatedAllocationBufferCreateInfoNV(vkStream, rootType, reinterpret_cast<VkDedicatedAllocationBufferCreateInfoNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV: {
+            reservedunmarshal_VkDedicatedAllocationBufferCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkDedicatedAllocationBufferCreateInfoNV*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV:
-        {
-            reservedunmarshal_VkDedicatedAllocationMemoryAllocateInfoNV(vkStream, rootType, reinterpret_cast<VkDedicatedAllocationMemoryAllocateInfoNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV: {
+            reservedunmarshal_VkDedicatedAllocationMemoryAllocateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkDedicatedAllocationMemoryAllocateInfoNV*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_transform_feedback
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceTransformFeedbackFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceTransformFeedbackFeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceTransformFeedbackFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceTransformFeedbackFeaturesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceTransformFeedbackPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceTransformFeedbackPropertiesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceTransformFeedbackPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceTransformFeedbackPropertiesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT:
-        {
-            reservedunmarshal_VkPipelineRasterizationStateStreamCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkPipelineRasterizationStateStreamCreateInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT: {
+            reservedunmarshal_VkPipelineRasterizationStateStreamCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineRasterizationStateStreamCreateInfoEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_video_encode_h264
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_EXT:
-        {
-            reservedunmarshal_VkVideoEncodeH264CapabilitiesEXT(vkStream, rootType, reinterpret_cast<VkVideoEncodeH264CapabilitiesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_EXT: {
+            reservedunmarshal_VkVideoEncodeH264CapabilitiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoEncodeH264CapabilitiesEXT*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_CREATE_INFO_EXT:
-        {
-            reservedunmarshal_VkVideoEncodeH264SessionCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkVideoEncodeH264SessionCreateInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_CREATE_INFO_EXT: {
+            reservedunmarshal_VkVideoEncodeH264SessionCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoEncodeH264SessionCreateInfoEXT*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
-            reservedunmarshal_VkVideoEncodeH264SessionParametersAddInfoEXT(vkStream, rootType, reinterpret_cast<VkVideoEncodeH264SessionParametersAddInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT: {
+            reservedunmarshal_VkVideoEncodeH264SessionParametersAddInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoEncodeH264SessionParametersAddInfoEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
-            reservedunmarshal_VkVideoEncodeH264SessionParametersCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkVideoEncodeH264SessionParametersCreateInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT: {
+            reservedunmarshal_VkVideoEncodeH264SessionParametersCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoEncodeH264SessionParametersCreateInfoEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_VCL_FRAME_INFO_EXT:
-        {
-            reservedunmarshal_VkVideoEncodeH264VclFrameInfoEXT(vkStream, rootType, reinterpret_cast<VkVideoEncodeH264VclFrameInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_VCL_FRAME_INFO_EXT: {
+            reservedunmarshal_VkVideoEncodeH264VclFrameInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoEncodeH264VclFrameInfoEXT*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_EMIT_PICTURE_PARAMETERS_EXT:
-        {
-            reservedunmarshal_VkVideoEncodeH264EmitPictureParametersEXT(vkStream, rootType, reinterpret_cast<VkVideoEncodeH264EmitPictureParametersEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_EMIT_PICTURE_PARAMETERS_EXT: {
+            reservedunmarshal_VkVideoEncodeH264EmitPictureParametersEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoEncodeH264EmitPictureParametersEXT*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_EXT:
-        {
-            reservedunmarshal_VkVideoEncodeH264ProfileEXT(vkStream, rootType, reinterpret_cast<VkVideoEncodeH264ProfileEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_EXT: {
+            reservedunmarshal_VkVideoEncodeH264ProfileEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoEncodeH264ProfileEXT*>(structExtension_out), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_video_encode_h265
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_EXT:
-        {
-            reservedunmarshal_VkVideoEncodeH265CapabilitiesEXT(vkStream, rootType, reinterpret_cast<VkVideoEncodeH265CapabilitiesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_EXT: {
+            reservedunmarshal_VkVideoEncodeH265CapabilitiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoEncodeH265CapabilitiesEXT*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_CREATE_INFO_EXT:
-        {
-            reservedunmarshal_VkVideoEncodeH265SessionCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkVideoEncodeH265SessionCreateInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_CREATE_INFO_EXT: {
+            reservedunmarshal_VkVideoEncodeH265SessionCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoEncodeH265SessionCreateInfoEXT*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
-            reservedunmarshal_VkVideoEncodeH265SessionParametersAddInfoEXT(vkStream, rootType, reinterpret_cast<VkVideoEncodeH265SessionParametersAddInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT: {
+            reservedunmarshal_VkVideoEncodeH265SessionParametersAddInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoEncodeH265SessionParametersAddInfoEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
-            reservedunmarshal_VkVideoEncodeH265SessionParametersCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkVideoEncodeH265SessionParametersCreateInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT: {
+            reservedunmarshal_VkVideoEncodeH265SessionParametersCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoEncodeH265SessionParametersCreateInfoEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_VCL_FRAME_INFO_EXT:
-        {
-            reservedunmarshal_VkVideoEncodeH265VclFrameInfoEXT(vkStream, rootType, reinterpret_cast<VkVideoEncodeH265VclFrameInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_VCL_FRAME_INFO_EXT: {
+            reservedunmarshal_VkVideoEncodeH265VclFrameInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoEncodeH265VclFrameInfoEXT*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_EMIT_PICTURE_PARAMETERS_EXT:
-        {
-            reservedunmarshal_VkVideoEncodeH265EmitPictureParametersEXT(vkStream, rootType, reinterpret_cast<VkVideoEncodeH265EmitPictureParametersEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_EMIT_PICTURE_PARAMETERS_EXT: {
+            reservedunmarshal_VkVideoEncodeH265EmitPictureParametersEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoEncodeH265EmitPictureParametersEXT*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_EXT:
-        {
-            reservedunmarshal_VkVideoEncodeH265ProfileEXT(vkStream, rootType, reinterpret_cast<VkVideoEncodeH265ProfileEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_EXT: {
+            reservedunmarshal_VkVideoEncodeH265ProfileEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoEncodeH265ProfileEXT*>(structExtension_out), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_video_decode_h264
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_EXT:
-        {
-            reservedunmarshal_VkVideoDecodeH264ProfileEXT(vkStream, rootType, reinterpret_cast<VkVideoDecodeH264ProfileEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_EXT: {
+            reservedunmarshal_VkVideoDecodeH264ProfileEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoDecodeH264ProfileEXT*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT:
-        {
-            reservedunmarshal_VkVideoDecodeH264CapabilitiesEXT(vkStream, rootType, reinterpret_cast<VkVideoDecodeH264CapabilitiesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT: {
+            reservedunmarshal_VkVideoDecodeH264CapabilitiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoDecodeH264CapabilitiesEXT*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_CREATE_INFO_EXT:
-        {
-            reservedunmarshal_VkVideoDecodeH264SessionCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkVideoDecodeH264SessionCreateInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_CREATE_INFO_EXT: {
+            reservedunmarshal_VkVideoDecodeH264SessionCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoDecodeH264SessionCreateInfoEXT*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
-            reservedunmarshal_VkVideoDecodeH264SessionParametersAddInfoEXT(vkStream, rootType, reinterpret_cast<VkVideoDecodeH264SessionParametersAddInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT: {
+            reservedunmarshal_VkVideoDecodeH264SessionParametersAddInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoDecodeH264SessionParametersAddInfoEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
-            reservedunmarshal_VkVideoDecodeH264SessionParametersCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkVideoDecodeH264SessionParametersCreateInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT: {
+            reservedunmarshal_VkVideoDecodeH264SessionParametersCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoDecodeH264SessionParametersCreateInfoEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT:
-        {
-            reservedunmarshal_VkVideoDecodeH264PictureInfoEXT(vkStream, rootType, reinterpret_cast<VkVideoDecodeH264PictureInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT: {
+            reservedunmarshal_VkVideoDecodeH264PictureInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoDecodeH264PictureInfoEXT*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_MVC_EXT:
-        {
-            reservedunmarshal_VkVideoDecodeH264MvcEXT(vkStream, rootType, reinterpret_cast<VkVideoDecodeH264MvcEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_MVC_EXT: {
+            reservedunmarshal_VkVideoDecodeH264MvcEXT(
+                vkStream, rootType, reinterpret_cast<VkVideoDecodeH264MvcEXT*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT:
-        {
-            reservedunmarshal_VkVideoDecodeH264DpbSlotInfoEXT(vkStream, rootType, reinterpret_cast<VkVideoDecodeH264DpbSlotInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT: {
+            reservedunmarshal_VkVideoDecodeH264DpbSlotInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoDecodeH264DpbSlotInfoEXT*>(structExtension_out), ptr);
             break;
         }
 #endif
 #ifdef VK_AMD_texture_gather_bias_lod
-        case VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD:
-        {
-            reservedunmarshal_VkTextureLODGatherFormatPropertiesAMD(vkStream, rootType, reinterpret_cast<VkTextureLODGatherFormatPropertiesAMD*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD: {
+            reservedunmarshal_VkTextureLODGatherFormatPropertiesAMD(
+                vkStream, rootType,
+                reinterpret_cast<VkTextureLODGatherFormatPropertiesAMD*>(structExtension_out), ptr);
             break;
         }
 #endif
 #ifdef VK_NV_corner_sampled_image
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV:
-        {
-            reservedunmarshal_VkPhysicalDeviceCornerSampledImageFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceCornerSampledImageFeaturesNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV: {
+            reservedunmarshal_VkPhysicalDeviceCornerSampledImageFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceCornerSampledImageFeaturesNV*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_NV_external_memory
-        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV:
-        {
-            reservedunmarshal_VkExternalMemoryImageCreateInfoNV(vkStream, rootType, reinterpret_cast<VkExternalMemoryImageCreateInfoNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV: {
+            reservedunmarshal_VkExternalMemoryImageCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkExternalMemoryImageCreateInfoNV*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV:
-        {
-            reservedunmarshal_VkExportMemoryAllocateInfoNV(vkStream, rootType, reinterpret_cast<VkExportMemoryAllocateInfoNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV: {
+            reservedunmarshal_VkExportMemoryAllocateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkExportMemoryAllocateInfoNV*>(structExtension_out), ptr);
             break;
         }
 #endif
 #ifdef VK_NV_external_memory_win32
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV:
-        {
-            reservedunmarshal_VkImportMemoryWin32HandleInfoNV(vkStream, rootType, reinterpret_cast<VkImportMemoryWin32HandleInfoNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV: {
+            reservedunmarshal_VkImportMemoryWin32HandleInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkImportMemoryWin32HandleInfoNV*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV:
-        {
-            reservedunmarshal_VkExportMemoryWin32HandleInfoNV(vkStream, rootType, reinterpret_cast<VkExportMemoryWin32HandleInfoNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV: {
+            reservedunmarshal_VkExportMemoryWin32HandleInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkExportMemoryWin32HandleInfoNV*>(structExtension_out), ptr);
             break;
         }
 #endif
 #ifdef VK_NV_win32_keyed_mutex
-        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV:
-        {
-            reservedunmarshal_VkWin32KeyedMutexAcquireReleaseInfoNV(vkStream, rootType, reinterpret_cast<VkWin32KeyedMutexAcquireReleaseInfoNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV: {
+            reservedunmarshal_VkWin32KeyedMutexAcquireReleaseInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkWin32KeyedMutexAcquireReleaseInfoNV*>(structExtension_out), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_validation_flags
-        case VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT:
-        {
-            reservedunmarshal_VkValidationFlagsEXT(vkStream, rootType, reinterpret_cast<VkValidationFlagsEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT: {
+            reservedunmarshal_VkValidationFlagsEXT(
+                vkStream, rootType, reinterpret_cast<VkValidationFlagsEXT*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_texture_compression_astc_hdr
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_astc_decode_mode
-        case VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT:
-        {
-            reservedunmarshal_VkImageViewASTCDecodeModeEXT(vkStream, rootType, reinterpret_cast<VkImageViewASTCDecodeModeEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT: {
+            reservedunmarshal_VkImageViewASTCDecodeModeEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkImageViewASTCDecodeModeEXT*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceASTCDecodeFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceASTCDecodeFeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceASTCDecodeFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceASTCDecodeFeaturesEXT*>(structExtension_out), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_conditional_rendering
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceConditionalRenderingFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceConditionalRenderingFeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceConditionalRenderingFeaturesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT:
-        {
-            reservedunmarshal_VkCommandBufferInheritanceConditionalRenderingInfoEXT(vkStream, rootType, reinterpret_cast<VkCommandBufferInheritanceConditionalRenderingInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT: {
+            reservedunmarshal_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkCommandBufferInheritanceConditionalRenderingInfoEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_NV_clip_space_w_scaling
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV:
-        {
-            reservedunmarshal_VkPipelineViewportWScalingStateCreateInfoNV(vkStream, rootType, reinterpret_cast<VkPipelineViewportWScalingStateCreateInfoNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV: {
+            reservedunmarshal_VkPipelineViewportWScalingStateCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineViewportWScalingStateCreateInfoNV*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_display_control
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT:
-        {
-            reservedunmarshal_VkSwapchainCounterCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkSwapchainCounterCreateInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT: {
+            reservedunmarshal_VkSwapchainCounterCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkSwapchainCounterCreateInfoEXT*>(structExtension_out), ptr);
             break;
         }
 #endif
 #ifdef VK_GOOGLE_display_timing
-        case VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE:
-        {
-            reservedunmarshal_VkPresentTimesInfoGOOGLE(vkStream, rootType, reinterpret_cast<VkPresentTimesInfoGOOGLE*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE: {
+            reservedunmarshal_VkPresentTimesInfoGOOGLE(
+                vkStream, rootType,
+                reinterpret_cast<VkPresentTimesInfoGOOGLE*>(structExtension_out), ptr);
             break;
         }
 #endif
 #ifdef VK_NVX_multiview_per_view_attributes
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX:
-        {
-            reservedunmarshal_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX: {
+            reservedunmarshal_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_NV_viewport_swizzle
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV:
-        {
-            reservedunmarshal_VkPipelineViewportSwizzleStateCreateInfoNV(vkStream, rootType, reinterpret_cast<VkPipelineViewportSwizzleStateCreateInfoNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV: {
+            reservedunmarshal_VkPipelineViewportSwizzleStateCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineViewportSwizzleStateCreateInfoNV*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_discard_rectangles
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceDiscardRectanglePropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceDiscardRectanglePropertiesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceDiscardRectanglePropertiesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT:
-        {
-            reservedunmarshal_VkPipelineDiscardRectangleStateCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkPipelineDiscardRectangleStateCreateInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT: {
+            reservedunmarshal_VkPipelineDiscardRectangleStateCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineDiscardRectangleStateCreateInfoEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_conservative_rasterization
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceConservativeRasterizationPropertiesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceConservativeRasterizationPropertiesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT:
-        {
-            reservedunmarshal_VkPipelineRasterizationConservativeStateCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkPipelineRasterizationConservativeStateCreateInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT: {
+            reservedunmarshal_VkPipelineRasterizationConservativeStateCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineRasterizationConservativeStateCreateInfoEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_depth_clip_enable
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceDepthClipEnableFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceDepthClipEnableFeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceDepthClipEnableFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceDepthClipEnableFeaturesEXT*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT:
-        {
-            reservedunmarshal_VkPipelineRasterizationDepthClipStateCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkPipelineRasterizationDepthClipStateCreateInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT: {
+            reservedunmarshal_VkPipelineRasterizationDepthClipStateCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineRasterizationDepthClipStateCreateInfoEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_debug_utils
-        case VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT:
-        {
-            reservedunmarshal_VkDebugUtilsMessengerCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkDebugUtilsMessengerCreateInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT: {
+            reservedunmarshal_VkDebugUtilsMessengerCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkDebugUtilsMessengerCreateInfoEXT*>(structExtension_out), ptr);
             break;
         }
 #endif
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
-        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID:
-        {
-            reservedunmarshal_VkAndroidHardwareBufferUsageANDROID(vkStream, rootType, reinterpret_cast<VkAndroidHardwareBufferUsageANDROID*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID: {
+            reservedunmarshal_VkAndroidHardwareBufferUsageANDROID(
+                vkStream, rootType,
+                reinterpret_cast<VkAndroidHardwareBufferUsageANDROID*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID:
-        {
-            reservedunmarshal_VkAndroidHardwareBufferFormatPropertiesANDROID(vkStream, rootType, reinterpret_cast<VkAndroidHardwareBufferFormatPropertiesANDROID*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID: {
+            reservedunmarshal_VkAndroidHardwareBufferFormatPropertiesANDROID(
+                vkStream, rootType,
+                reinterpret_cast<VkAndroidHardwareBufferFormatPropertiesANDROID*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID:
-        {
-            reservedunmarshal_VkImportAndroidHardwareBufferInfoANDROID(vkStream, rootType, reinterpret_cast<VkImportAndroidHardwareBufferInfoANDROID*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID: {
+            reservedunmarshal_VkImportAndroidHardwareBufferInfoANDROID(
+                vkStream, rootType,
+                reinterpret_cast<VkImportAndroidHardwareBufferInfoANDROID*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID:
-        {
-            reservedunmarshal_VkExternalFormatANDROID(vkStream, rootType, reinterpret_cast<VkExternalFormatANDROID*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID: {
+            reservedunmarshal_VkExternalFormatANDROID(
+                vkStream, rootType, reinterpret_cast<VkExternalFormatANDROID*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_2_ANDROID:
-        {
-            reservedunmarshal_VkAndroidHardwareBufferFormatProperties2ANDROID(vkStream, rootType, reinterpret_cast<VkAndroidHardwareBufferFormatProperties2ANDROID*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_2_ANDROID: {
+            reservedunmarshal_VkAndroidHardwareBufferFormatProperties2ANDROID(
+                vkStream, rootType,
+                reinterpret_cast<VkAndroidHardwareBufferFormatProperties2ANDROID*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_inline_uniform_block
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceInlineUniformBlockFeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceInlineUniformBlockFeaturesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceInlineUniformBlockPropertiesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceInlineUniformBlockPropertiesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT:
-        {
-            reservedunmarshal_VkWriteDescriptorSetInlineUniformBlockEXT(vkStream, rootType, reinterpret_cast<VkWriteDescriptorSetInlineUniformBlockEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT: {
+            reservedunmarshal_VkWriteDescriptorSetInlineUniformBlockEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkWriteDescriptorSetInlineUniformBlockEXT*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT:
-        {
-            reservedunmarshal_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkDescriptorPoolInlineUniformBlockCreateInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT: {
+            reservedunmarshal_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkDescriptorPoolInlineUniformBlockCreateInfoEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_sample_locations
-        case VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT:
-        {
-            reservedunmarshal_VkSampleLocationsInfoEXT(vkStream, rootType, reinterpret_cast<VkSampleLocationsInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT: {
+            reservedunmarshal_VkSampleLocationsInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkSampleLocationsInfoEXT*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT:
-        {
-            reservedunmarshal_VkRenderPassSampleLocationsBeginInfoEXT(vkStream, rootType, reinterpret_cast<VkRenderPassSampleLocationsBeginInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT: {
+            reservedunmarshal_VkRenderPassSampleLocationsBeginInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkRenderPassSampleLocationsBeginInfoEXT*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT:
-        {
-            reservedunmarshal_VkPipelineSampleLocationsStateCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkPipelineSampleLocationsStateCreateInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT: {
+            reservedunmarshal_VkPipelineSampleLocationsStateCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineSampleLocationsStateCreateInfoEXT*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceSampleLocationsPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceSampleLocationsPropertiesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceSampleLocationsPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceSampleLocationsPropertiesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_blend_operation_advanced
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT:
-        {
-            reservedunmarshal_VkPipelineColorBlendAdvancedStateCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkPipelineColorBlendAdvancedStateCreateInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT: {
+            reservedunmarshal_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineColorBlendAdvancedStateCreateInfoEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_NV_fragment_coverage_to_color
-        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV:
-        {
-            reservedunmarshal_VkPipelineCoverageToColorStateCreateInfoNV(vkStream, rootType, reinterpret_cast<VkPipelineCoverageToColorStateCreateInfoNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV: {
+            reservedunmarshal_VkPipelineCoverageToColorStateCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineCoverageToColorStateCreateInfoNV*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_NV_framebuffer_mixed_samples
-        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV:
-        {
-            reservedunmarshal_VkPipelineCoverageModulationStateCreateInfoNV(vkStream, rootType, reinterpret_cast<VkPipelineCoverageModulationStateCreateInfoNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV: {
+            reservedunmarshal_VkPipelineCoverageModulationStateCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineCoverageModulationStateCreateInfoNV*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_NV_shader_sm_builtins
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV:
-        {
-            reservedunmarshal_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderSMBuiltinsPropertiesNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV: {
+            reservedunmarshal_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderSMBuiltinsPropertiesNV*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV:
-        {
-            reservedunmarshal_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderSMBuiltinsFeaturesNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV: {
+            reservedunmarshal_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderSMBuiltinsFeaturesNV*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_image_drm_format_modifier
-        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT:
-        {
-            reservedunmarshal_VkDrmFormatModifierPropertiesListEXT(vkStream, rootType, reinterpret_cast<VkDrmFormatModifierPropertiesListEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT: {
+            reservedunmarshal_VkDrmFormatModifierPropertiesListEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkDrmFormatModifierPropertiesListEXT*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceImageDrmFormatModifierInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT: {
+            reservedunmarshal_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceImageDrmFormatModifierInfoEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT:
-        {
-            reservedunmarshal_VkImageDrmFormatModifierListCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkImageDrmFormatModifierListCreateInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT: {
+            reservedunmarshal_VkImageDrmFormatModifierListCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkImageDrmFormatModifierListCreateInfoEXT*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT:
-        {
-            reservedunmarshal_VkImageDrmFormatModifierExplicitCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkImageDrmFormatModifierExplicitCreateInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT: {
+            reservedunmarshal_VkImageDrmFormatModifierExplicitCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkImageDrmFormatModifierExplicitCreateInfoEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_2_EXT:
-        {
-            reservedunmarshal_VkDrmFormatModifierPropertiesList2EXT(vkStream, rootType, reinterpret_cast<VkDrmFormatModifierPropertiesList2EXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_2_EXT: {
+            reservedunmarshal_VkDrmFormatModifierPropertiesList2EXT(
+                vkStream, rootType,
+                reinterpret_cast<VkDrmFormatModifierPropertiesList2EXT*>(structExtension_out), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_validation_cache
-        case VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT:
-        {
-            reservedunmarshal_VkShaderModuleValidationCacheCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkShaderModuleValidationCacheCreateInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT: {
+            reservedunmarshal_VkShaderModuleValidationCacheCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkShaderModuleValidationCacheCreateInfoEXT*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_NV_shading_rate_image
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV:
-        {
-            reservedunmarshal_VkPipelineViewportShadingRateImageStateCreateInfoNV(vkStream, rootType, reinterpret_cast<VkPipelineViewportShadingRateImageStateCreateInfoNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV: {
+            reservedunmarshal_VkPipelineViewportShadingRateImageStateCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineViewportShadingRateImageStateCreateInfoNV*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV:
-        {
-            reservedunmarshal_VkPhysicalDeviceShadingRateImageFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShadingRateImageFeaturesNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV: {
+            reservedunmarshal_VkPhysicalDeviceShadingRateImageFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShadingRateImageFeaturesNV*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV:
-        {
-            reservedunmarshal_VkPhysicalDeviceShadingRateImagePropertiesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShadingRateImagePropertiesNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV: {
+            reservedunmarshal_VkPhysicalDeviceShadingRateImagePropertiesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShadingRateImagePropertiesNV*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV:
-        {
-            reservedunmarshal_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(vkStream, rootType, reinterpret_cast<VkPipelineViewportCoarseSampleOrderStateCreateInfoNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV: {
+            reservedunmarshal_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineViewportCoarseSampleOrderStateCreateInfoNV*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_NV_ray_tracing
-        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV:
-        {
-            reservedunmarshal_VkWriteDescriptorSetAccelerationStructureNV(vkStream, rootType, reinterpret_cast<VkWriteDescriptorSetAccelerationStructureNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV: {
+            reservedunmarshal_VkWriteDescriptorSetAccelerationStructureNV(
+                vkStream, rootType,
+                reinterpret_cast<VkWriteDescriptorSetAccelerationStructureNV*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV:
-        {
-            reservedunmarshal_VkPhysicalDeviceRayTracingPropertiesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceRayTracingPropertiesNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV: {
+            reservedunmarshal_VkPhysicalDeviceRayTracingPropertiesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceRayTracingPropertiesNV*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_NV_representative_fragment_test
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV:
-        {
-            reservedunmarshal_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV: {
+            reservedunmarshal_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV:
-        {
-            reservedunmarshal_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(vkStream, rootType, reinterpret_cast<VkPipelineRepresentativeFragmentTestStateCreateInfoNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV: {
+            reservedunmarshal_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineRepresentativeFragmentTestStateCreateInfoNV*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_filter_cubic
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceImageViewImageFormatInfoEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceImageViewImageFormatInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT: {
+            reservedunmarshal_VkPhysicalDeviceImageViewImageFormatInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceImageViewImageFormatInfoEXT*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT:
-        {
-            reservedunmarshal_VkFilterCubicImageViewImageFormatPropertiesEXT(vkStream, rootType, reinterpret_cast<VkFilterCubicImageViewImageFormatPropertiesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT: {
+            reservedunmarshal_VkFilterCubicImageViewImageFormatPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkFilterCubicImageViewImageFormatPropertiesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_global_priority
-        case VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT:
-        {
-            reservedunmarshal_VkDeviceQueueGlobalPriorityCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkDeviceQueueGlobalPriorityCreateInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT: {
+            reservedunmarshal_VkDeviceQueueGlobalPriorityCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkDeviceQueueGlobalPriorityCreateInfoEXT*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_external_memory_host
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT:
-        {
-            reservedunmarshal_VkImportMemoryHostPointerInfoEXT(vkStream, rootType, reinterpret_cast<VkImportMemoryHostPointerInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT: {
+            reservedunmarshal_VkImportMemoryHostPointerInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkImportMemoryHostPointerInfoEXT*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceExternalMemoryHostPropertiesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceExternalMemoryHostPropertiesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_AMD_pipeline_compiler_control
-        case VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD:
-        {
-            reservedunmarshal_VkPipelineCompilerControlCreateInfoAMD(vkStream, rootType, reinterpret_cast<VkPipelineCompilerControlCreateInfoAMD*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD: {
+            reservedunmarshal_VkPipelineCompilerControlCreateInfoAMD(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineCompilerControlCreateInfoAMD*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_AMD_shader_core_properties
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD:
-        {
-            reservedunmarshal_VkPhysicalDeviceShaderCorePropertiesAMD(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderCorePropertiesAMD*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD: {
+            reservedunmarshal_VkPhysicalDeviceShaderCorePropertiesAMD(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderCorePropertiesAMD*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_video_decode_h265
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_EXT:
-        {
-            reservedunmarshal_VkVideoDecodeH265ProfileEXT(vkStream, rootType, reinterpret_cast<VkVideoDecodeH265ProfileEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_EXT: {
+            reservedunmarshal_VkVideoDecodeH265ProfileEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoDecodeH265ProfileEXT*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT:
-        {
-            reservedunmarshal_VkVideoDecodeH265CapabilitiesEXT(vkStream, rootType, reinterpret_cast<VkVideoDecodeH265CapabilitiesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT: {
+            reservedunmarshal_VkVideoDecodeH265CapabilitiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoDecodeH265CapabilitiesEXT*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_CREATE_INFO_EXT:
-        {
-            reservedunmarshal_VkVideoDecodeH265SessionCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkVideoDecodeH265SessionCreateInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_CREATE_INFO_EXT: {
+            reservedunmarshal_VkVideoDecodeH265SessionCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoDecodeH265SessionCreateInfoEXT*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
-            reservedunmarshal_VkVideoDecodeH265SessionParametersAddInfoEXT(vkStream, rootType, reinterpret_cast<VkVideoDecodeH265SessionParametersAddInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT: {
+            reservedunmarshal_VkVideoDecodeH265SessionParametersAddInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoDecodeH265SessionParametersAddInfoEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
-            reservedunmarshal_VkVideoDecodeH265SessionParametersCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkVideoDecodeH265SessionParametersCreateInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT: {
+            reservedunmarshal_VkVideoDecodeH265SessionParametersCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoDecodeH265SessionParametersCreateInfoEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT:
-        {
-            reservedunmarshal_VkVideoDecodeH265PictureInfoEXT(vkStream, rootType, reinterpret_cast<VkVideoDecodeH265PictureInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT: {
+            reservedunmarshal_VkVideoDecodeH265PictureInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoDecodeH265PictureInfoEXT*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT:
-        {
-            reservedunmarshal_VkVideoDecodeH265DpbSlotInfoEXT(vkStream, rootType, reinterpret_cast<VkVideoDecodeH265DpbSlotInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT: {
+            reservedunmarshal_VkVideoDecodeH265DpbSlotInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkVideoDecodeH265DpbSlotInfoEXT*>(structExtension_out), ptr);
             break;
         }
 #endif
 #ifdef VK_AMD_memory_overallocation_behavior
-        case VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD:
-        {
-            reservedunmarshal_VkDeviceMemoryOverallocationCreateInfoAMD(vkStream, rootType, reinterpret_cast<VkDeviceMemoryOverallocationCreateInfoAMD*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD: {
+            reservedunmarshal_VkDeviceMemoryOverallocationCreateInfoAMD(
+                vkStream, rootType,
+                reinterpret_cast<VkDeviceMemoryOverallocationCreateInfoAMD*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_vertex_attribute_divisor
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT:
-        {
-            reservedunmarshal_VkPipelineVertexInputDivisorStateCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkPipelineVertexInputDivisorStateCreateInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT: {
+            reservedunmarshal_VkPipelineVertexInputDivisorStateCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineVertexInputDivisorStateCreateInfoEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_GGP_frame_token
-        case VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP:
-        {
-            reservedunmarshal_VkPresentFrameTokenGGP(vkStream, rootType, reinterpret_cast<VkPresentFrameTokenGGP*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP: {
+            reservedunmarshal_VkPresentFrameTokenGGP(
+                vkStream, rootType, reinterpret_cast<VkPresentFrameTokenGGP*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_pipeline_creation_feedback
-        case VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT:
-        {
-            reservedunmarshal_VkPipelineCreationFeedbackCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkPipelineCreationFeedbackCreateInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT: {
+            reservedunmarshal_VkPipelineCreationFeedbackCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineCreationFeedbackCreateInfoEXT*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_NV_compute_shader_derivatives
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV:
-        {
-            reservedunmarshal_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceComputeShaderDerivativesFeaturesNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV: {
+            reservedunmarshal_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceComputeShaderDerivativesFeaturesNV*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_NV_mesh_shader
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV:
-        {
-            reservedunmarshal_VkPhysicalDeviceMeshShaderFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceMeshShaderFeaturesNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV: {
+            reservedunmarshal_VkPhysicalDeviceMeshShaderFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceMeshShaderFeaturesNV*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV:
-        {
-            reservedunmarshal_VkPhysicalDeviceMeshShaderPropertiesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceMeshShaderPropertiesNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV: {
+            reservedunmarshal_VkPhysicalDeviceMeshShaderPropertiesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceMeshShaderPropertiesNV*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_NV_fragment_shader_barycentric
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV:
-        {
-            reservedunmarshal_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV: {
+            reservedunmarshal_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_NV_shader_image_footprint
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV:
-        {
-            reservedunmarshal_VkPhysicalDeviceShaderImageFootprintFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderImageFootprintFeaturesNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV: {
+            reservedunmarshal_VkPhysicalDeviceShaderImageFootprintFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderImageFootprintFeaturesNV*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_NV_scissor_exclusive
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV:
-        {
-            reservedunmarshal_VkPipelineViewportExclusiveScissorStateCreateInfoNV(vkStream, rootType, reinterpret_cast<VkPipelineViewportExclusiveScissorStateCreateInfoNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV: {
+            reservedunmarshal_VkPipelineViewportExclusiveScissorStateCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineViewportExclusiveScissorStateCreateInfoNV*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV:
-        {
-            reservedunmarshal_VkPhysicalDeviceExclusiveScissorFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceExclusiveScissorFeaturesNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV: {
+            reservedunmarshal_VkPhysicalDeviceExclusiveScissorFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceExclusiveScissorFeaturesNV*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
-        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV:
-        {
-            reservedunmarshal_VkQueueFamilyCheckpointPropertiesNV(vkStream, rootType, reinterpret_cast<VkQueueFamilyCheckpointPropertiesNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV: {
+            reservedunmarshal_VkQueueFamilyCheckpointPropertiesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkQueueFamilyCheckpointPropertiesNV*>(structExtension_out), ptr);
             break;
         }
 #endif
 #ifdef VK_INTEL_shader_integer_functions2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL:
-        {
-            reservedunmarshal_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL: {
+            reservedunmarshal_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_INTEL_performance_query
-        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL:
-        {
-            reservedunmarshal_VkQueryPoolPerformanceQueryCreateInfoINTEL(vkStream, rootType, reinterpret_cast<VkQueryPoolPerformanceQueryCreateInfoINTEL*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL: {
+            reservedunmarshal_VkQueryPoolPerformanceQueryCreateInfoINTEL(
+                vkStream, rootType,
+                reinterpret_cast<VkQueryPoolPerformanceQueryCreateInfoINTEL*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_pci_bus_info
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDevicePCIBusInfoPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDevicePCIBusInfoPropertiesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT: {
+            reservedunmarshal_VkPhysicalDevicePCIBusInfoPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDevicePCIBusInfoPropertiesEXT*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_AMD_display_native_hdr
-        case VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD:
-        {
-            reservedunmarshal_VkDisplayNativeHdrSurfaceCapabilitiesAMD(vkStream, rootType, reinterpret_cast<VkDisplayNativeHdrSurfaceCapabilitiesAMD*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD: {
+            reservedunmarshal_VkDisplayNativeHdrSurfaceCapabilitiesAMD(
+                vkStream, rootType,
+                reinterpret_cast<VkDisplayNativeHdrSurfaceCapabilitiesAMD*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD:
-        {
-            reservedunmarshal_VkSwapchainDisplayNativeHdrCreateInfoAMD(vkStream, rootType, reinterpret_cast<VkSwapchainDisplayNativeHdrCreateInfoAMD*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD: {
+            reservedunmarshal_VkSwapchainDisplayNativeHdrCreateInfoAMD(
+                vkStream, rootType,
+                reinterpret_cast<VkSwapchainDisplayNativeHdrCreateInfoAMD*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_fragment_density_map
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT:
-        {
-            switch(rootType)
-            {
-                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2:
-                {
-                    reservedunmarshal_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT: {
+            switch (rootType) {
+                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2: {
+                    reservedunmarshal_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
+                        vkStream, rootType,
+                        reinterpret_cast<VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(
+                            structExtension_out),
+                        ptr);
                     break;
                 }
-                case VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO:
-                {
-                    reservedunmarshal_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(structExtension_out), ptr);
+                case VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO: {
+                    reservedunmarshal_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
+                        vkStream, rootType,
+                        reinterpret_cast<VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(
+                            structExtension_out),
+                        ptr);
                     break;
                 }
-                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO:
-                {
-                    reservedunmarshal_VkImportColorBufferGOOGLE(vkStream, rootType, reinterpret_cast<VkImportColorBufferGOOGLE*>(structExtension_out), ptr);
+                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO: {
+                    reservedunmarshal_VkImportColorBufferGOOGLE(
+                        vkStream, rootType,
+                        reinterpret_cast<VkImportColorBufferGOOGLE*>(structExtension_out), ptr);
                     break;
                 }
-                default:
-                {
-                    reservedunmarshal_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(structExtension_out), ptr);
+                default: {
+                    reservedunmarshal_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
+                        vkStream, rootType,
+                        reinterpret_cast<VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(
+                            structExtension_out),
+                        ptr);
                     break;
                 }
             }
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT:
-        {
-            switch(rootType)
-            {
-                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2:
-                {
-                    reservedunmarshal_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT: {
+            switch (rootType) {
+                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2: {
+                    reservedunmarshal_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
+                        vkStream, rootType,
+                        reinterpret_cast<VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(
+                            structExtension_out),
+                        ptr);
                     break;
                 }
-                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO:
-                {
-                    reservedunmarshal_VkImportPhysicalAddressGOOGLE(vkStream, rootType, reinterpret_cast<VkImportPhysicalAddressGOOGLE*>(structExtension_out), ptr);
+                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO: {
+                    reservedunmarshal_VkImportPhysicalAddressGOOGLE(
+                        vkStream, rootType,
+                        reinterpret_cast<VkImportPhysicalAddressGOOGLE*>(structExtension_out), ptr);
                     break;
                 }
-                default:
-                {
-                    reservedunmarshal_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(structExtension_out), ptr);
+                default: {
+                    reservedunmarshal_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
+                        vkStream, rootType,
+                        reinterpret_cast<VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(
+                            structExtension_out),
+                        ptr);
                     break;
                 }
             }
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT:
-        {
-            switch(rootType)
-            {
-                case VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO:
-                {
-                    reservedunmarshal_VkRenderPassFragmentDensityMapCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkRenderPassFragmentDensityMapCreateInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT: {
+            switch (rootType) {
+                case VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO: {
+                    reservedunmarshal_VkRenderPassFragmentDensityMapCreateInfoEXT(
+                        vkStream, rootType,
+                        reinterpret_cast<VkRenderPassFragmentDensityMapCreateInfoEXT*>(
+                            structExtension_out),
+                        ptr);
                     break;
                 }
-                case VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2:
-                {
-                    reservedunmarshal_VkRenderPassFragmentDensityMapCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkRenderPassFragmentDensityMapCreateInfoEXT*>(structExtension_out), ptr);
+                case VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2: {
+                    reservedunmarshal_VkRenderPassFragmentDensityMapCreateInfoEXT(
+                        vkStream, rootType,
+                        reinterpret_cast<VkRenderPassFragmentDensityMapCreateInfoEXT*>(
+                            structExtension_out),
+                        ptr);
                     break;
                 }
-                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO:
-                {
-                    reservedunmarshal_VkImportBufferGOOGLE(vkStream, rootType, reinterpret_cast<VkImportBufferGOOGLE*>(structExtension_out), ptr);
+                case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO: {
+                    reservedunmarshal_VkImportBufferGOOGLE(
+                        vkStream, rootType,
+                        reinterpret_cast<VkImportBufferGOOGLE*>(structExtension_out), ptr);
                     break;
                 }
-                default:
-                {
-                    reservedunmarshal_VkRenderPassFragmentDensityMapCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkRenderPassFragmentDensityMapCreateInfoEXT*>(structExtension_out), ptr);
+                default: {
+                    reservedunmarshal_VkRenderPassFragmentDensityMapCreateInfoEXT(
+                        vkStream, rootType,
+                        reinterpret_cast<VkRenderPassFragmentDensityMapCreateInfoEXT*>(
+                            structExtension_out),
+                        ptr);
                     break;
                 }
             }
@@ -28031,628 +28111,863 @@
         }
 #endif
 #ifdef VK_EXT_subgroup_size_control
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceSubgroupSizeControlFeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceSubgroupSizeControlFeaturesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceSubgroupSizeControlPropertiesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceSubgroupSizeControlPropertiesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT:
-        {
-            reservedunmarshal_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT: {
+            reservedunmarshal_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_AMD_shader_core_properties2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD:
-        {
-            reservedunmarshal_VkPhysicalDeviceShaderCoreProperties2AMD(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderCoreProperties2AMD*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD: {
+            reservedunmarshal_VkPhysicalDeviceShaderCoreProperties2AMD(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderCoreProperties2AMD*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_AMD_device_coherent_memory
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD:
-        {
-            reservedunmarshal_VkPhysicalDeviceCoherentMemoryFeaturesAMD(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceCoherentMemoryFeaturesAMD*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD: {
+            reservedunmarshal_VkPhysicalDeviceCoherentMemoryFeaturesAMD(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceCoherentMemoryFeaturesAMD*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_shader_image_atomic_int64
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_memory_budget
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceMemoryBudgetPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceMemoryBudgetPropertiesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceMemoryBudgetPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceMemoryBudgetPropertiesEXT*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_memory_priority
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceMemoryPriorityFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceMemoryPriorityFeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceMemoryPriorityFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceMemoryPriorityFeaturesEXT*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT:
-        {
-            reservedunmarshal_VkMemoryPriorityAllocateInfoEXT(vkStream, rootType, reinterpret_cast<VkMemoryPriorityAllocateInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT: {
+            reservedunmarshal_VkMemoryPriorityAllocateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkMemoryPriorityAllocateInfoEXT*>(structExtension_out), ptr);
             break;
         }
 #endif
 #ifdef VK_NV_dedicated_allocation_image_aliasing
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV:
-        {
-            reservedunmarshal_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV: {
+            reservedunmarshal_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_buffer_device_address
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceBufferDeviceAddressFeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceBufferDeviceAddressFeaturesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT:
-        {
-            reservedunmarshal_VkBufferDeviceAddressCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkBufferDeviceAddressCreateInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT: {
+            reservedunmarshal_VkBufferDeviceAddressCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkBufferDeviceAddressCreateInfoEXT*>(structExtension_out), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_validation_features
-        case VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT:
-        {
-            reservedunmarshal_VkValidationFeaturesEXT(vkStream, rootType, reinterpret_cast<VkValidationFeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT: {
+            reservedunmarshal_VkValidationFeaturesEXT(
+                vkStream, rootType, reinterpret_cast<VkValidationFeaturesEXT*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_NV_cooperative_matrix
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV:
-        {
-            reservedunmarshal_VkPhysicalDeviceCooperativeMatrixFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceCooperativeMatrixFeaturesNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV: {
+            reservedunmarshal_VkPhysicalDeviceCooperativeMatrixFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceCooperativeMatrixFeaturesNV*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV:
-        {
-            reservedunmarshal_VkPhysicalDeviceCooperativeMatrixPropertiesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceCooperativeMatrixPropertiesNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV: {
+            reservedunmarshal_VkPhysicalDeviceCooperativeMatrixPropertiesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceCooperativeMatrixPropertiesNV*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_NV_coverage_reduction_mode
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV:
-        {
-            reservedunmarshal_VkPhysicalDeviceCoverageReductionModeFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceCoverageReductionModeFeaturesNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV: {
+            reservedunmarshal_VkPhysicalDeviceCoverageReductionModeFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceCoverageReductionModeFeaturesNV*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV:
-        {
-            reservedunmarshal_VkPipelineCoverageReductionStateCreateInfoNV(vkStream, rootType, reinterpret_cast<VkPipelineCoverageReductionStateCreateInfoNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV: {
+            reservedunmarshal_VkPipelineCoverageReductionStateCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineCoverageReductionStateCreateInfoNV*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_fragment_shader_interlock
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_ycbcr_image_arrays
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_provoking_vertex
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceProvokingVertexFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceProvokingVertexFeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceProvokingVertexFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceProvokingVertexFeaturesEXT*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_PROPERTIES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceProvokingVertexPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceProvokingVertexPropertiesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_PROPERTIES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceProvokingVertexPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceProvokingVertexPropertiesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT:
-        {
-            reservedunmarshal_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkPipelineRasterizationProvokingVertexStateCreateInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT: {
+            reservedunmarshal_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineRasterizationProvokingVertexStateCreateInfoEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_full_screen_exclusive
-        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT:
-        {
-            reservedunmarshal_VkSurfaceFullScreenExclusiveInfoEXT(vkStream, rootType, reinterpret_cast<VkSurfaceFullScreenExclusiveInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT: {
+            reservedunmarshal_VkSurfaceFullScreenExclusiveInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkSurfaceFullScreenExclusiveInfoEXT*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT:
-        {
-            reservedunmarshal_VkSurfaceCapabilitiesFullScreenExclusiveEXT(vkStream, rootType, reinterpret_cast<VkSurfaceCapabilitiesFullScreenExclusiveEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT: {
+            reservedunmarshal_VkSurfaceCapabilitiesFullScreenExclusiveEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkSurfaceCapabilitiesFullScreenExclusiveEXT*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT:
-        {
-            reservedunmarshal_VkSurfaceFullScreenExclusiveWin32InfoEXT(vkStream, rootType, reinterpret_cast<VkSurfaceFullScreenExclusiveWin32InfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT: {
+            reservedunmarshal_VkSurfaceFullScreenExclusiveWin32InfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkSurfaceFullScreenExclusiveWin32InfoEXT*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_line_rasterization
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceLineRasterizationFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceLineRasterizationFeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceLineRasterizationFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceLineRasterizationFeaturesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceLineRasterizationPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceLineRasterizationPropertiesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceLineRasterizationPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceLineRasterizationPropertiesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT:
-        {
-            reservedunmarshal_VkPipelineRasterizationLineStateCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkPipelineRasterizationLineStateCreateInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT: {
+            reservedunmarshal_VkPipelineRasterizationLineStateCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineRasterizationLineStateCreateInfoEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_shader_atomic_float
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_index_type_uint8
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceIndexTypeUint8FeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceIndexTypeUint8FeaturesEXT*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_shader_atomic_float2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_NV_device_generated_commands
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV:
-        {
-            reservedunmarshal_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV: {
+            reservedunmarshal_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV:
-        {
-            reservedunmarshal_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV: {
+            reservedunmarshal_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV:
-        {
-            reservedunmarshal_VkGraphicsPipelineShaderGroupsCreateInfoNV(vkStream, rootType, reinterpret_cast<VkGraphicsPipelineShaderGroupsCreateInfoNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV: {
+            reservedunmarshal_VkGraphicsPipelineShaderGroupsCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkGraphicsPipelineShaderGroupsCreateInfoNV*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_NV_inherited_viewport_scissor
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV:
-        {
-            reservedunmarshal_VkPhysicalDeviceInheritedViewportScissorFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceInheritedViewportScissorFeaturesNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV: {
+            reservedunmarshal_VkPhysicalDeviceInheritedViewportScissorFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceInheritedViewportScissorFeaturesNV*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_VIEWPORT_SCISSOR_INFO_NV:
-        {
-            reservedunmarshal_VkCommandBufferInheritanceViewportScissorInfoNV(vkStream, rootType, reinterpret_cast<VkCommandBufferInheritanceViewportScissorInfoNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_VIEWPORT_SCISSOR_INFO_NV: {
+            reservedunmarshal_VkCommandBufferInheritanceViewportScissorInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkCommandBufferInheritanceViewportScissorInfoNV*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_texel_buffer_alignment
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_QCOM_render_pass_transform
-        case VK_STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM:
-        {
-            reservedunmarshal_VkRenderPassTransformBeginInfoQCOM(vkStream, rootType, reinterpret_cast<VkRenderPassTransformBeginInfoQCOM*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM: {
+            reservedunmarshal_VkRenderPassTransformBeginInfoQCOM(
+                vkStream, rootType,
+                reinterpret_cast<VkRenderPassTransformBeginInfoQCOM*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM:
-        {
-            reservedunmarshal_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(vkStream, rootType, reinterpret_cast<VkCommandBufferInheritanceRenderPassTransformInfoQCOM*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM: {
+            reservedunmarshal_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(
+                vkStream, rootType,
+                reinterpret_cast<VkCommandBufferInheritanceRenderPassTransformInfoQCOM*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_device_memory_report
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceDeviceMemoryReportFeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceDeviceMemoryReportFeaturesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT:
-        {
-            reservedunmarshal_VkDeviceDeviceMemoryReportCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkDeviceDeviceMemoryReportCreateInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT: {
+            reservedunmarshal_VkDeviceDeviceMemoryReportCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkDeviceDeviceMemoryReportCreateInfoEXT*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_robustness2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceRobustness2FeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceRobustness2FeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceRobustness2FeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceRobustness2FeaturesEXT*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceRobustness2PropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceRobustness2PropertiesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceRobustness2PropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceRobustness2PropertiesEXT*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_custom_border_color
-        case VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT:
-        {
-            reservedunmarshal_VkSamplerCustomBorderColorCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkSamplerCustomBorderColorCreateInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT: {
+            reservedunmarshal_VkSamplerCustomBorderColorCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkSamplerCustomBorderColorCreateInfoEXT*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceCustomBorderColorPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceCustomBorderColorPropertiesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceCustomBorderColorPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceCustomBorderColorPropertiesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceCustomBorderColorFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceCustomBorderColorFeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceCustomBorderColorFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceCustomBorderColorFeaturesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_private_data
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDevicePrivateDataFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDevicePrivateDataFeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDevicePrivateDataFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDevicePrivateDataFeaturesEXT*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT:
-        {
-            reservedunmarshal_VkDevicePrivateDataCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkDevicePrivateDataCreateInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT: {
+            reservedunmarshal_VkDevicePrivateDataCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkDevicePrivateDataCreateInfoEXT*>(structExtension_out), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_pipeline_creation_cache_control
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_NV_device_diagnostics_config
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV:
-        {
-            reservedunmarshal_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceDiagnosticsConfigFeaturesNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV: {
+            reservedunmarshal_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceDiagnosticsConfigFeaturesNV*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV:
-        {
-            reservedunmarshal_VkDeviceDiagnosticsConfigCreateInfoNV(vkStream, rootType, reinterpret_cast<VkDeviceDiagnosticsConfigCreateInfoNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV: {
+            reservedunmarshal_VkDeviceDiagnosticsConfigCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkDeviceDiagnosticsConfigCreateInfoNV*>(structExtension_out), ptr);
             break;
         }
 #endif
 #ifdef VK_NV_fragment_shading_rate_enums
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV:
-        {
-            reservedunmarshal_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV: {
+            reservedunmarshal_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV:
-        {
-            reservedunmarshal_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV: {
+            reservedunmarshal_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV:
-        {
-            reservedunmarshal_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(vkStream, rootType, reinterpret_cast<VkPipelineFragmentShadingRateEnumStateCreateInfoNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV: {
+            reservedunmarshal_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineFragmentShadingRateEnumStateCreateInfoNV*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_NV_ray_tracing_motion_blur
-        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_MOTION_TRIANGLES_DATA_NV:
-        {
-            reservedunmarshal_VkAccelerationStructureGeometryMotionTrianglesDataNV(vkStream, rootType, reinterpret_cast<VkAccelerationStructureGeometryMotionTrianglesDataNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_MOTION_TRIANGLES_DATA_NV: {
+            reservedunmarshal_VkAccelerationStructureGeometryMotionTrianglesDataNV(
+                vkStream, rootType,
+                reinterpret_cast<VkAccelerationStructureGeometryMotionTrianglesDataNV*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MOTION_INFO_NV:
-        {
-            reservedunmarshal_VkAccelerationStructureMotionInfoNV(vkStream, rootType, reinterpret_cast<VkAccelerationStructureMotionInfoNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MOTION_INFO_NV: {
+            reservedunmarshal_VkAccelerationStructureMotionInfoNV(
+                vkStream, rootType,
+                reinterpret_cast<VkAccelerationStructureMotionInfoNV*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV:
-        {
-            reservedunmarshal_VkPhysicalDeviceRayTracingMotionBlurFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceRayTracingMotionBlurFeaturesNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV: {
+            reservedunmarshal_VkPhysicalDeviceRayTracingMotionBlurFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceRayTracingMotionBlurFeaturesNV*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_ycbcr_2plane_444_formats
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_fragment_density_map2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2FeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2FeaturesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2PropertiesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2PropertiesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_QCOM_rotated_copy_commands
-        case VK_STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM:
-        {
-            reservedunmarshal_VkCopyCommandTransformInfoQCOM(vkStream, rootType, reinterpret_cast<VkCopyCommandTransformInfoQCOM*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM: {
+            reservedunmarshal_VkCopyCommandTransformInfoQCOM(
+                vkStream, rootType,
+                reinterpret_cast<VkCopyCommandTransformInfoQCOM*>(structExtension_out), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_image_robustness
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceImageRobustnessFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceImageRobustnessFeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceImageRobustnessFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceImageRobustnessFeaturesEXT*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_4444_formats
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDevice4444FormatsFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDevice4444FormatsFeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDevice4444FormatsFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDevice4444FormatsFeaturesEXT*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_rgba10x6_formats
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_VALVE_mutable_descriptor_type
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE:
-        {
-            reservedunmarshal_VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE: {
+            reservedunmarshal_VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE:
-        {
-            reservedunmarshal_VkMutableDescriptorTypeCreateInfoVALVE(vkStream, rootType, reinterpret_cast<VkMutableDescriptorTypeCreateInfoVALVE*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE: {
+            reservedunmarshal_VkMutableDescriptorTypeCreateInfoVALVE(
+                vkStream, rootType,
+                reinterpret_cast<VkMutableDescriptorTypeCreateInfoVALVE*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_vertex_input_dynamic_state
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_physical_device_drm
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRM_PROPERTIES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceDrmPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceDrmPropertiesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRM_PROPERTIES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceDrmPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceDrmPropertiesEXT*>(structExtension_out), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_primitive_topology_list_restart
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_FUCHSIA_external_memory
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA:
-        {
-            reservedunmarshal_VkImportMemoryZirconHandleInfoFUCHSIA(vkStream, rootType, reinterpret_cast<VkImportMemoryZirconHandleInfoFUCHSIA*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA: {
+            reservedunmarshal_VkImportMemoryZirconHandleInfoFUCHSIA(
+                vkStream, rootType,
+                reinterpret_cast<VkImportMemoryZirconHandleInfoFUCHSIA*>(structExtension_out), ptr);
             break;
         }
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA:
-        {
-            reservedunmarshal_VkImportMemoryBufferCollectionFUCHSIA(vkStream, rootType, reinterpret_cast<VkImportMemoryBufferCollectionFUCHSIA*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA: {
+            reservedunmarshal_VkImportMemoryBufferCollectionFUCHSIA(
+                vkStream, rootType,
+                reinterpret_cast<VkImportMemoryBufferCollectionFUCHSIA*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA:
-        {
-            reservedunmarshal_VkBufferCollectionImageCreateInfoFUCHSIA(vkStream, rootType, reinterpret_cast<VkBufferCollectionImageCreateInfoFUCHSIA*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA: {
+            reservedunmarshal_VkBufferCollectionImageCreateInfoFUCHSIA(
+                vkStream, rootType,
+                reinterpret_cast<VkBufferCollectionImageCreateInfoFUCHSIA*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_BUFFER_CREATE_INFO_FUCHSIA:
-        {
-            reservedunmarshal_VkBufferCollectionBufferCreateInfoFUCHSIA(vkStream, rootType, reinterpret_cast<VkBufferCollectionBufferCreateInfoFUCHSIA*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_BUFFER_CREATE_INFO_FUCHSIA: {
+            reservedunmarshal_VkBufferCollectionBufferCreateInfoFUCHSIA(
+                vkStream, rootType,
+                reinterpret_cast<VkBufferCollectionBufferCreateInfoFUCHSIA*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_HUAWEI_subpass_shading
-        case VK_STRUCTURE_TYPE_SUBPASS_SHADING_PIPELINE_CREATE_INFO_HUAWEI:
-        {
-            reservedunmarshal_VkSubpassShadingPipelineCreateInfoHUAWEI(vkStream, rootType, reinterpret_cast<VkSubpassShadingPipelineCreateInfoHUAWEI*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_SUBPASS_SHADING_PIPELINE_CREATE_INFO_HUAWEI: {
+            reservedunmarshal_VkSubpassShadingPipelineCreateInfoHUAWEI(
+                vkStream, rootType,
+                reinterpret_cast<VkSubpassShadingPipelineCreateInfoHUAWEI*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI:
-        {
-            reservedunmarshal_VkPhysicalDeviceSubpassShadingFeaturesHUAWEI(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceSubpassShadingFeaturesHUAWEI*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI: {
+            reservedunmarshal_VkPhysicalDeviceSubpassShadingFeaturesHUAWEI(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceSubpassShadingFeaturesHUAWEI*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_PROPERTIES_HUAWEI:
-        {
-            reservedunmarshal_VkPhysicalDeviceSubpassShadingPropertiesHUAWEI(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceSubpassShadingPropertiesHUAWEI*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_PROPERTIES_HUAWEI: {
+            reservedunmarshal_VkPhysicalDeviceSubpassShadingPropertiesHUAWEI(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceSubpassShadingPropertiesHUAWEI*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_HUAWEI_invocation_mask
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI:
-        {
-            reservedunmarshal_VkPhysicalDeviceInvocationMaskFeaturesHUAWEI(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceInvocationMaskFeaturesHUAWEI*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI: {
+            reservedunmarshal_VkPhysicalDeviceInvocationMaskFeaturesHUAWEI(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceInvocationMaskFeaturesHUAWEI*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_NV_external_memory_rdma
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV:
-        {
-            reservedunmarshal_VkPhysicalDeviceExternalMemoryRDMAFeaturesNV(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceExternalMemoryRDMAFeaturesNV*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV: {
+            reservedunmarshal_VkPhysicalDeviceExternalMemoryRDMAFeaturesNV(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceExternalMemoryRDMAFeaturesNV*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceExtendedDynamicState2FeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceExtendedDynamicState2FeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceExtendedDynamicState2FeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceExtendedDynamicState2FeaturesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_color_write_enable
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceColorWriteEnableFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceColorWriteEnableFeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceColorWriteEnableFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceColorWriteEnableFeaturesEXT*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_WRITE_CREATE_INFO_EXT:
-        {
-            reservedunmarshal_VkPipelineColorWriteCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkPipelineColorWriteCreateInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_WRITE_CREATE_INFO_EXT: {
+            reservedunmarshal_VkPipelineColorWriteCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPipelineColorWriteCreateInfoEXT*>(structExtension_out), ptr);
             break;
         }
 #endif
 #ifdef VK_GOOGLE_gfxstream
-        case VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE:
-        {
-            reservedunmarshal_VkImportColorBufferGOOGLE(vkStream, rootType, reinterpret_cast<VkImportColorBufferGOOGLE*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE: {
+            reservedunmarshal_VkImportColorBufferGOOGLE(
+                vkStream, rootType,
+                reinterpret_cast<VkImportColorBufferGOOGLE*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE:
-        {
-            reservedunmarshal_VkImportBufferGOOGLE(vkStream, rootType, reinterpret_cast<VkImportBufferGOOGLE*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE: {
+            reservedunmarshal_VkImportBufferGOOGLE(
+                vkStream, rootType, reinterpret_cast<VkImportBufferGOOGLE*>(structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE:
-        {
-            reservedunmarshal_VkImportPhysicalAddressGOOGLE(vkStream, rootType, reinterpret_cast<VkImportPhysicalAddressGOOGLE*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE: {
+            reservedunmarshal_VkImportPhysicalAddressGOOGLE(
+                vkStream, rootType,
+                reinterpret_cast<VkImportPhysicalAddressGOOGLE*>(structExtension_out), ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_global_priority_query
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_EXT:
-        {
-            reservedunmarshal_VkQueueFamilyGlobalPriorityPropertiesEXT(vkStream, rootType, reinterpret_cast<VkQueueFamilyGlobalPriorityPropertiesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_EXT: {
+            reservedunmarshal_VkQueueFamilyGlobalPriorityPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkQueueFamilyGlobalPriorityPropertiesEXT*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_multi_draw
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceMultiDrawFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceMultiDrawFeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceMultiDrawFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceMultiDrawFeaturesEXT*>(structExtension_out), ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceMultiDrawPropertiesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceMultiDrawPropertiesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceMultiDrawPropertiesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceMultiDrawPropertiesEXT*>(structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_border_color_swizzle
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDeviceBorderColorSwizzleFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceBorderColorSwizzleFeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDeviceBorderColorSwizzleFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceBorderColorSwizzleFeaturesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_BORDER_COLOR_COMPONENT_MAPPING_CREATE_INFO_EXT:
-        {
-            reservedunmarshal_VkSamplerBorderColorComponentMappingCreateInfoEXT(vkStream, rootType, reinterpret_cast<VkSamplerBorderColorComponentMappingCreateInfoEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_SAMPLER_BORDER_COLOR_COMPONENT_MAPPING_CREATE_INFO_EXT: {
+            reservedunmarshal_VkSamplerBorderColorComponentMappingCreateInfoEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkSamplerBorderColorComponentMappingCreateInfoEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_EXT_pageable_device_local_memory
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT:
-        {
-            reservedunmarshal_VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT(vkStream, rootType, reinterpret_cast<VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT: {
+            reservedunmarshal_VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_acceleration_structure
-        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR:
-        {
-            reservedunmarshal_VkWriteDescriptorSetAccelerationStructureKHR(vkStream, rootType, reinterpret_cast<VkWriteDescriptorSetAccelerationStructureKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR: {
+            reservedunmarshal_VkWriteDescriptorSetAccelerationStructureKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkWriteDescriptorSetAccelerationStructureKHR*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR:
-        {
-            reservedunmarshal_VkPhysicalDeviceAccelerationStructureFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceAccelerationStructureFeaturesKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR: {
+            reservedunmarshal_VkPhysicalDeviceAccelerationStructureFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceAccelerationStructureFeaturesKHR*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR:
-        {
-            reservedunmarshal_VkPhysicalDeviceAccelerationStructurePropertiesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceAccelerationStructurePropertiesKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR: {
+            reservedunmarshal_VkPhysicalDeviceAccelerationStructurePropertiesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceAccelerationStructurePropertiesKHR*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR:
-        {
-            reservedunmarshal_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceRayTracingPipelineFeaturesKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR: {
+            reservedunmarshal_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceRayTracingPipelineFeaturesKHR*>(
+                    structExtension_out),
+                ptr);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR:
-        {
-            reservedunmarshal_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceRayTracingPipelinePropertiesKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR: {
+            reservedunmarshal_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceRayTracingPipelinePropertiesKHR*>(
+                    structExtension_out),
+                ptr);
             break;
         }
 #endif
 #ifdef VK_KHR_ray_query
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR:
-        {
-            reservedunmarshal_VkPhysicalDeviceRayQueryFeaturesKHR(vkStream, rootType, reinterpret_cast<VkPhysicalDeviceRayQueryFeaturesKHR*>(structExtension_out), ptr);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR: {
+            reservedunmarshal_VkPhysicalDeviceRayQueryFeaturesKHR(
+                vkStream, rootType,
+                reinterpret_cast<VkPhysicalDeviceRayQueryFeaturesKHR*>(structExtension_out), ptr);
             break;
         }
 #endif
-        default:
-        {
+        default: {
             // fatal; the switch is only taken if the extension struct is known
             abort();
         }
     }
 }
 
-
-} // namespace goldfish_vk
+}  // namespace goldfish_vk
diff --git a/stream-servers/vulkan/cereal/common/goldfish_vk_reserved_marshaling.h b/stream-servers/vulkan/cereal/common/goldfish_vk_reserved_marshaling.h
index 26133bd..ad4968d 100644
--- a/stream-servers/vulkan/cereal/common/goldfish_vk_reserved_marshaling.h
+++ b/stream-servers/vulkan/cereal/common/goldfish_vk_reserved_marshaling.h
@@ -14,1772 +14,1187 @@
 // limitations under the License.
 
 // Autogenerated module goldfish_vk_reserved_marshaling
-// (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
+// (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml
+// cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
 // VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
 // VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+//
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o
+// $CEREAL_OUTPUT_DIR
+//
 #pragma once
 #include <vulkan/vulkan.h>
-#include "vulkan_gfxstream.h"
-
-#include "goldfish_vk_private_defs.h"
 
 #include "VulkanStream.h"
 #include "base/StreamSerializing.h"
+#include "goldfish_vk_private_defs.h"
+#include "vulkan_gfxstream.h"
 
 namespace goldfish_vk {
 #ifdef VK_VERSION_1_0
-void reservedunmarshal_VkExtent2D(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExtent2D* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkExtent2D(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkExtent2D* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkExtent3D(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExtent3D* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkExtent3D(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkExtent3D* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkOffset2D(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkOffset2D* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkOffset2D(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkOffset2D* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkOffset3D(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkOffset3D* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkOffset3D(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkOffset3D* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkRect2D(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRect2D* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkRect2D(VulkanStream* vkStream, VkStructureType rootType,
+                                VkRect2D* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkBaseInStructure(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBaseInStructure* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkBaseInStructure(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkBaseInStructure* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkBaseOutStructure(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBaseOutStructure* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkBaseOutStructure(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkBaseOutStructure* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkBufferMemoryBarrier(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferMemoryBarrier* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkBufferMemoryBarrier(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkBufferMemoryBarrier* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkDispatchIndirectCommand(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDispatchIndirectCommand* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDispatchIndirectCommand(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkDispatchIndirectCommand* forUnmarshaling,
+                                                 uint8_t** ptr);
 
-void reservedunmarshal_VkDrawIndexedIndirectCommand(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDrawIndexedIndirectCommand* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDrawIndexedIndirectCommand(VulkanStream* vkStream,
+                                                    VkStructureType rootType,
+                                                    VkDrawIndexedIndirectCommand* forUnmarshaling,
+                                                    uint8_t** ptr);
 
-void reservedunmarshal_VkDrawIndirectCommand(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDrawIndirectCommand* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDrawIndirectCommand(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkDrawIndirectCommand* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkImageSubresourceRange(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageSubresourceRange* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkImageSubresourceRange(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkImageSubresourceRange* forUnmarshaling,
+                                               uint8_t** ptr);
 
-void reservedunmarshal_VkImageMemoryBarrier(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageMemoryBarrier* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkImageMemoryBarrier(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkImageMemoryBarrier* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkMemoryBarrier(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryBarrier* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkMemoryBarrier(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkMemoryBarrier* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineCacheHeaderVersionOne(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineCacheHeaderVersionOne* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineCacheHeaderVersionOne* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkAllocationCallbacks(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAllocationCallbacks* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkAllocationCallbacks(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkAllocationCallbacks* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkApplicationInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkApplicationInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkApplicationInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkApplicationInfo* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkFormatProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFormatProperties* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkFormatProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkFormatProperties* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkImageFormatProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageFormatProperties* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkImageFormatProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkImageFormatProperties* forUnmarshaling,
+                                               uint8_t** ptr);
 
-void reservedunmarshal_VkInstanceCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkInstanceCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkInstanceCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkInstanceCreateInfo* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkMemoryHeap(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryHeap* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkMemoryHeap(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkMemoryHeap* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkMemoryType(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryType* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkMemoryType(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkMemoryType* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkPhysicalDeviceFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFeatures* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkPhysicalDeviceFeatures(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkPhysicalDeviceFeatures* forUnmarshaling,
+                                                uint8_t** ptr);
 
-void reservedunmarshal_VkPhysicalDeviceLimits(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceLimits* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkPhysicalDeviceLimits(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkPhysicalDeviceLimits* forUnmarshaling,
+                                              uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceMemoryProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMemoryProperties* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMemoryProperties* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceSparseProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSparseProperties* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceSparseProperties* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkPhysicalDeviceProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceProperties* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkPhysicalDeviceProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                                  VkPhysicalDeviceProperties* forUnmarshaling,
+                                                  uint8_t** ptr);
 
-void reservedunmarshal_VkQueueFamilyProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkQueueFamilyProperties* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkQueueFamilyProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkQueueFamilyProperties* forUnmarshaling,
+                                               uint8_t** ptr);
 
-void reservedunmarshal_VkDeviceQueueCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceQueueCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDeviceQueueCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkDeviceQueueCreateInfo* forUnmarshaling,
+                                               uint8_t** ptr);
 
-void reservedunmarshal_VkDeviceCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDeviceCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkDeviceCreateInfo* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkExtensionProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExtensionProperties* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkExtensionProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkExtensionProperties* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkLayerProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkLayerProperties* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkLayerProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkLayerProperties* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkSubmitInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubmitInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkSubmitInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkSubmitInfo* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkMappedMemoryRange(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMappedMemoryRange* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkMappedMemoryRange(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkMappedMemoryRange* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkMemoryAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryAllocateInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkMemoryAllocateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkMemoryAllocateInfo* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkMemoryRequirements(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryRequirements* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkMemoryRequirements(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkMemoryRequirements* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkSparseMemoryBind(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSparseMemoryBind* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkSparseMemoryBind(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkSparseMemoryBind* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkSparseBufferMemoryBindInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSparseBufferMemoryBindInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkSparseBufferMemoryBindInfo(VulkanStream* vkStream,
+                                                    VkStructureType rootType,
+                                                    VkSparseBufferMemoryBindInfo* forUnmarshaling,
+                                                    uint8_t** ptr);
 
 void reservedunmarshal_VkSparseImageOpaqueMemoryBindInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSparseImageOpaqueMemoryBindInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSparseImageOpaqueMemoryBindInfo* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkImageSubresource(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageSubresource* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkImageSubresource(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkImageSubresource* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkSparseImageMemoryBind(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSparseImageMemoryBind* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkSparseImageMemoryBind(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkSparseImageMemoryBind* forUnmarshaling,
+                                               uint8_t** ptr);
 
-void reservedunmarshal_VkSparseImageMemoryBindInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSparseImageMemoryBindInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkSparseImageMemoryBindInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkSparseImageMemoryBindInfo* forUnmarshaling,
+                                                   uint8_t** ptr);
 
-void reservedunmarshal_VkBindSparseInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindSparseInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkBindSparseInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkBindSparseInfo* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkSparseImageFormatProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSparseImageFormatProperties* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkSparseImageFormatProperties(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkSparseImageFormatProperties* forUnmarshaling,
+                                                     uint8_t** ptr);
 
 void reservedunmarshal_VkSparseImageMemoryRequirements(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSparseImageMemoryRequirements* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSparseImageMemoryRequirements* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkFenceCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFenceCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkFenceCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkFenceCreateInfo* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkSemaphoreCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSemaphoreCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkSemaphoreCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkSemaphoreCreateInfo* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkEventCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkEventCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkEventCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkEventCreateInfo* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkQueryPoolCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkQueryPoolCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkQueryPoolCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkQueryPoolCreateInfo* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkBufferCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkBufferCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkBufferCreateInfo* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkBufferViewCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferViewCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkBufferViewCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkBufferViewCreateInfo* forUnmarshaling,
+                                              uint8_t** ptr);
 
-void reservedunmarshal_VkImageCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkImageCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkImageCreateInfo* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkSubresourceLayout(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubresourceLayout* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkSubresourceLayout(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkSubresourceLayout* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkComponentMapping(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkComponentMapping* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkComponentMapping(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkComponentMapping* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkImageViewCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageViewCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkImageViewCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkImageViewCreateInfo* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkShaderModuleCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkShaderModuleCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkShaderModuleCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkShaderModuleCreateInfo* forUnmarshaling,
+                                                uint8_t** ptr);
 
-void reservedunmarshal_VkPipelineCacheCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineCacheCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkPipelineCacheCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkPipelineCacheCreateInfo* forUnmarshaling,
+                                                 uint8_t** ptr);
 
-void reservedunmarshal_VkSpecializationMapEntry(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSpecializationMapEntry* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkSpecializationMapEntry(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkSpecializationMapEntry* forUnmarshaling,
+                                                uint8_t** ptr);
 
-void reservedunmarshal_VkSpecializationInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSpecializationInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkSpecializationInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkSpecializationInfo* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineShaderStageCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineShaderStageCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineShaderStageCreateInfo* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkComputePipelineCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkComputePipelineCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkComputePipelineCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkComputePipelineCreateInfo* forUnmarshaling,
+                                                   uint8_t** ptr);
 
 void reservedunmarshal_VkVertexInputBindingDescription(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVertexInputBindingDescription* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVertexInputBindingDescription* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkVertexInputAttributeDescription(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVertexInputAttributeDescription* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVertexInputAttributeDescription* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineVertexInputStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineVertexInputStateCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineVertexInputStateCreateInfo* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineInputAssemblyStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineInputAssemblyStateCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineInputAssemblyStateCreateInfo* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineTessellationStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineTessellationStateCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineTessellationStateCreateInfo* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkViewport(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkViewport* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkViewport(VulkanStream* vkStream, VkStructureType rootType,
+                                  VkViewport* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineViewportStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineViewportStateCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineViewportStateCreateInfo* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineRasterizationStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineRasterizationStateCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineRasterizationStateCreateInfo* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineMultisampleStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineMultisampleStateCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineMultisampleStateCreateInfo* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkStencilOpState(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkStencilOpState* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkStencilOpState(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkStencilOpState* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineDepthStencilStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineDepthStencilStateCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineDepthStencilStateCreateInfo* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineColorBlendAttachmentState(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineColorBlendAttachmentState* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineColorBlendAttachmentState* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineColorBlendStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineColorBlendStateCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineColorBlendStateCreateInfo* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineDynamicStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineDynamicStateCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineDynamicStateCreateInfo* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkGraphicsPipelineCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkGraphicsPipelineCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkGraphicsPipelineCreateInfo(VulkanStream* vkStream,
+                                                    VkStructureType rootType,
+                                                    VkGraphicsPipelineCreateInfo* forUnmarshaling,
+                                                    uint8_t** ptr);
 
-void reservedunmarshal_VkPushConstantRange(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPushConstantRange* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkPushConstantRange(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkPushConstantRange* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkPipelineLayoutCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineLayoutCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkPipelineLayoutCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                  VkPipelineLayoutCreateInfo* forUnmarshaling,
+                                                  uint8_t** ptr);
 
-void reservedunmarshal_VkSamplerCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSamplerCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkSamplerCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkSamplerCreateInfo* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkCopyDescriptorSet(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCopyDescriptorSet* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkCopyDescriptorSet(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkCopyDescriptorSet* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkDescriptorBufferInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorBufferInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDescriptorBufferInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkDescriptorBufferInfo* forUnmarshaling,
+                                              uint8_t** ptr);
 
-void reservedunmarshal_VkDescriptorImageInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorImageInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDescriptorImageInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkDescriptorImageInfo* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkDescriptorPoolSize(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorPoolSize* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDescriptorPoolSize(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkDescriptorPoolSize* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkDescriptorPoolCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorPoolCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDescriptorPoolCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                  VkDescriptorPoolCreateInfo* forUnmarshaling,
+                                                  uint8_t** ptr);
 
-void reservedunmarshal_VkDescriptorSetAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorSetAllocateInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDescriptorSetAllocateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkDescriptorSetAllocateInfo* forUnmarshaling,
+                                                   uint8_t** ptr);
 
-void reservedunmarshal_VkDescriptorSetLayoutBinding(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorSetLayoutBinding* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDescriptorSetLayoutBinding(VulkanStream* vkStream,
+                                                    VkStructureType rootType,
+                                                    VkDescriptorSetLayoutBinding* forUnmarshaling,
+                                                    uint8_t** ptr);
 
 void reservedunmarshal_VkDescriptorSetLayoutCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorSetLayoutCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDescriptorSetLayoutCreateInfo* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkWriteDescriptorSet(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkWriteDescriptorSet* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkWriteDescriptorSet(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkWriteDescriptorSet* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkAttachmentDescription(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAttachmentDescription* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkAttachmentDescription(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkAttachmentDescription* forUnmarshaling,
+                                               uint8_t** ptr);
 
-void reservedunmarshal_VkAttachmentReference(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAttachmentReference* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkAttachmentReference(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkAttachmentReference* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkFramebufferCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFramebufferCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkFramebufferCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkFramebufferCreateInfo* forUnmarshaling,
+                                               uint8_t** ptr);
 
-void reservedunmarshal_VkSubpassDescription(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubpassDescription* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkSubpassDescription(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkSubpassDescription* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkSubpassDependency(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubpassDependency* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkSubpassDependency(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkSubpassDependency* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkRenderPassCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderPassCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkRenderPassCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkRenderPassCreateInfo* forUnmarshaling,
+                                              uint8_t** ptr);
 
-void reservedunmarshal_VkCommandPoolCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCommandPoolCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkCommandPoolCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkCommandPoolCreateInfo* forUnmarshaling,
+                                               uint8_t** ptr);
 
-void reservedunmarshal_VkCommandBufferAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCommandBufferAllocateInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkCommandBufferAllocateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkCommandBufferAllocateInfo* forUnmarshaling,
+                                                   uint8_t** ptr);
 
 void reservedunmarshal_VkCommandBufferInheritanceInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCommandBufferInheritanceInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkCommandBufferInheritanceInfo* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkCommandBufferBeginInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCommandBufferBeginInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkCommandBufferBeginInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkCommandBufferBeginInfo* forUnmarshaling,
+                                                uint8_t** ptr);
 
-void reservedunmarshal_VkBufferCopy(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferCopy* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkBufferCopy(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkBufferCopy* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkImageSubresourceLayers(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageSubresourceLayers* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkImageSubresourceLayers(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkImageSubresourceLayers* forUnmarshaling,
+                                                uint8_t** ptr);
 
-void reservedunmarshal_VkBufferImageCopy(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferImageCopy* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkBufferImageCopy(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkBufferImageCopy* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkClearColorValue(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkClearColorValue* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkClearColorValue(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkClearColorValue* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkClearDepthStencilValue(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkClearDepthStencilValue* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkClearDepthStencilValue(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkClearDepthStencilValue* forUnmarshaling,
+                                                uint8_t** ptr);
 
-void reservedunmarshal_VkClearValue(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkClearValue* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkClearValue(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkClearValue* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkClearAttachment(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkClearAttachment* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkClearAttachment(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkClearAttachment* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkClearRect(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkClearRect* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkClearRect(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkClearRect* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkImageBlit(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageBlit* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkImageBlit(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkImageBlit* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkImageCopy(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageCopy* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkImageCopy(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkImageCopy* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkImageResolve(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageResolve* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkImageResolve(VulkanStream* vkStream, VkStructureType rootType,
+                                      VkImageResolve* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkRenderPassBeginInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderPassBeginInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkRenderPassBeginInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkRenderPassBeginInfo* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_VERSION_1_1
 void reservedunmarshal_VkPhysicalDeviceSubgroupProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSubgroupProperties* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceSubgroupProperties* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkBindBufferMemoryInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindBufferMemoryInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkBindBufferMemoryInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkBindBufferMemoryInfo* forUnmarshaling,
+                                              uint8_t** ptr);
 
-void reservedunmarshal_VkBindImageMemoryInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindImageMemoryInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkBindImageMemoryInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkBindImageMemoryInfo* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDevice16BitStorageFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevice16BitStorageFeatures* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevice16BitStorageFeatures* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkMemoryDedicatedRequirements(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryDedicatedRequirements* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkMemoryDedicatedRequirements(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkMemoryDedicatedRequirements* forUnmarshaling,
+                                                     uint8_t** ptr);
 
-void reservedunmarshal_VkMemoryDedicatedAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryDedicatedAllocateInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkMemoryDedicatedAllocateInfo(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkMemoryDedicatedAllocateInfo* forUnmarshaling,
+                                                     uint8_t** ptr);
 
-void reservedunmarshal_VkMemoryAllocateFlagsInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryAllocateFlagsInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkMemoryAllocateFlagsInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkMemoryAllocateFlagsInfo* forUnmarshaling,
+                                                 uint8_t** ptr);
 
 void reservedunmarshal_VkDeviceGroupRenderPassBeginInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceGroupRenderPassBeginInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDeviceGroupRenderPassBeginInfo* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkDeviceGroupCommandBufferBeginInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceGroupCommandBufferBeginInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDeviceGroupCommandBufferBeginInfo* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkDeviceGroupSubmitInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceGroupSubmitInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDeviceGroupSubmitInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkDeviceGroupSubmitInfo* forUnmarshaling,
+                                               uint8_t** ptr);
 
-void reservedunmarshal_VkDeviceGroupBindSparseInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceGroupBindSparseInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDeviceGroupBindSparseInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkDeviceGroupBindSparseInfo* forUnmarshaling,
+                                                   uint8_t** ptr);
 
 void reservedunmarshal_VkBindBufferMemoryDeviceGroupInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindBufferMemoryDeviceGroupInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBindBufferMemoryDeviceGroupInfo* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkBindImageMemoryDeviceGroupInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindImageMemoryDeviceGroupInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBindImageMemoryDeviceGroupInfo* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceGroupProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceGroupProperties* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceGroupProperties* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkDeviceGroupDeviceCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceGroupDeviceCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDeviceGroupDeviceCreateInfo(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkDeviceGroupDeviceCreateInfo* forUnmarshaling,
+                                                     uint8_t** ptr);
 
 void reservedunmarshal_VkBufferMemoryRequirementsInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferMemoryRequirementsInfo2* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBufferMemoryRequirementsInfo2* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkImageMemoryRequirementsInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageMemoryRequirementsInfo2* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImageMemoryRequirementsInfo2* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkImageSparseMemoryRequirementsInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageSparseMemoryRequirementsInfo2* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImageSparseMemoryRequirementsInfo2* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkMemoryRequirements2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryRequirements2* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkMemoryRequirements2(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkMemoryRequirements2* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkSparseImageMemoryRequirements2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSparseImageMemoryRequirements2* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSparseImageMemoryRequirements2* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkPhysicalDeviceFeatures2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFeatures2* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkPhysicalDeviceFeatures2(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkPhysicalDeviceFeatures2* forUnmarshaling,
+                                                 uint8_t** ptr);
 
-void reservedunmarshal_VkPhysicalDeviceProperties2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceProperties2* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkPhysicalDeviceProperties2(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkPhysicalDeviceProperties2* forUnmarshaling,
+                                                   uint8_t** ptr);
 
-void reservedunmarshal_VkFormatProperties2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFormatProperties2* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkFormatProperties2(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkFormatProperties2* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkImageFormatProperties2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageFormatProperties2* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkImageFormatProperties2(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkImageFormatProperties2* forUnmarshaling,
+                                                uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceImageFormatInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceImageFormatInfo2* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceImageFormatInfo2* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkQueueFamilyProperties2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkQueueFamilyProperties2* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkQueueFamilyProperties2(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkQueueFamilyProperties2* forUnmarshaling,
+                                                uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceMemoryProperties2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMemoryProperties2* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMemoryProperties2* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkSparseImageFormatProperties2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSparseImageFormatProperties2* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSparseImageFormatProperties2* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceSparseImageFormatInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSparseImageFormatInfo2* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceSparseImageFormatInfo2* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDevicePointClippingProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePointClippingProperties* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePointClippingProperties* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkInputAttachmentAspectReference(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkInputAttachmentAspectReference* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkInputAttachmentAspectReference* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkRenderPassInputAttachmentAspectCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderPassInputAttachmentAspectCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkRenderPassInputAttachmentAspectCreateInfo* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkImageViewUsageCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageViewUsageCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkImageViewUsageCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                  VkImageViewUsageCreateInfo* forUnmarshaling,
+                                                  uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineTessellationDomainOriginStateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineTessellationDomainOriginStateCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineTessellationDomainOriginStateCreateInfo* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkRenderPassMultiviewCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderPassMultiviewCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkRenderPassMultiviewCreateInfo* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceMultiviewFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMultiviewFeatures* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMultiviewFeatures* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceMultiviewProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMultiviewProperties* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMultiviewProperties* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceVariablePointersFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceVariablePointersFeatures* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceVariablePointersFeatures* forUnmarshaling, uint8_t** ptr);
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceVariablePointersFeatures, reservedunmarshal_VkPhysicalDeviceVariablePointerFeatures)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceVariablePointersFeatures,
+                      reservedunmarshal_VkPhysicalDeviceVariablePointerFeatures)
 
 void reservedunmarshal_VkPhysicalDeviceProtectedMemoryFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceProtectedMemoryFeatures* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceProtectedMemoryFeatures* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceProtectedMemoryProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceProtectedMemoryProperties* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceProtectedMemoryProperties* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkDeviceQueueInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceQueueInfo2* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDeviceQueueInfo2(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkDeviceQueueInfo2* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkProtectedSubmitInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkProtectedSubmitInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkProtectedSubmitInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkProtectedSubmitInfo* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkSamplerYcbcrConversionCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSamplerYcbcrConversionCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSamplerYcbcrConversionCreateInfo* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkSamplerYcbcrConversionInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSamplerYcbcrConversionInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkSamplerYcbcrConversionInfo(VulkanStream* vkStream,
+                                                    VkStructureType rootType,
+                                                    VkSamplerYcbcrConversionInfo* forUnmarshaling,
+                                                    uint8_t** ptr);
 
-void reservedunmarshal_VkBindImagePlaneMemoryInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindImagePlaneMemoryInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkBindImagePlaneMemoryInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                  VkBindImagePlaneMemoryInfo* forUnmarshaling,
+                                                  uint8_t** ptr);
 
 void reservedunmarshal_VkImagePlaneMemoryRequirementsInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImagePlaneMemoryRequirementsInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImagePlaneMemoryRequirementsInfo* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSamplerYcbcrConversionFeatures* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceSamplerYcbcrConversionFeatures* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkSamplerYcbcrConversionImageFormatProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSamplerYcbcrConversionImageFormatProperties* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSamplerYcbcrConversionImageFormatProperties* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkDescriptorUpdateTemplateEntry(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorUpdateTemplateEntry* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDescriptorUpdateTemplateEntry* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkDescriptorUpdateTemplateCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorUpdateTemplateCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDescriptorUpdateTemplateCreateInfo* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkExternalMemoryProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalMemoryProperties* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkExternalMemoryProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                                  VkExternalMemoryProperties* forUnmarshaling,
+                                                  uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceExternalImageFormatInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceExternalImageFormatInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceExternalImageFormatInfo* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkExternalImageFormatProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalImageFormatProperties* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkExternalImageFormatProperties* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceExternalBufferInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceExternalBufferInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceExternalBufferInfo* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkExternalBufferProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalBufferProperties* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkExternalBufferProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                                  VkExternalBufferProperties* forUnmarshaling,
+                                                  uint8_t** ptr);
 
-void reservedunmarshal_VkPhysicalDeviceIDProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceIDProperties* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkPhysicalDeviceIDProperties(VulkanStream* vkStream,
+                                                    VkStructureType rootType,
+                                                    VkPhysicalDeviceIDProperties* forUnmarshaling,
+                                                    uint8_t** ptr);
 
 void reservedunmarshal_VkExternalMemoryImageCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalMemoryImageCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkExternalMemoryImageCreateInfo* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkExternalMemoryBufferCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalMemoryBufferCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkExternalMemoryBufferCreateInfo* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkExportMemoryAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExportMemoryAllocateInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkExportMemoryAllocateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                  VkExportMemoryAllocateInfo* forUnmarshaling,
+                                                  uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceExternalFenceInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceExternalFenceInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceExternalFenceInfo* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkExternalFenceProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalFenceProperties* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkExternalFenceProperties(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkExternalFenceProperties* forUnmarshaling,
+                                                 uint8_t** ptr);
 
-void reservedunmarshal_VkExportFenceCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExportFenceCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkExportFenceCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkExportFenceCreateInfo* forUnmarshaling,
+                                               uint8_t** ptr);
 
-void reservedunmarshal_VkExportSemaphoreCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExportSemaphoreCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkExportSemaphoreCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkExportSemaphoreCreateInfo* forUnmarshaling,
+                                                   uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceExternalSemaphoreInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceExternalSemaphoreInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceExternalSemaphoreInfo* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkExternalSemaphoreProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalSemaphoreProperties* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkExternalSemaphoreProperties(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkExternalSemaphoreProperties* forUnmarshaling,
+                                                     uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceMaintenance3Properties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMaintenance3Properties* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMaintenance3Properties* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkDescriptorSetLayoutSupport(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorSetLayoutSupport* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDescriptorSetLayoutSupport(VulkanStream* vkStream,
+                                                    VkStructureType rootType,
+                                                    VkDescriptorSetLayoutSupport* forUnmarshaling,
+                                                    uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceShaderDrawParametersFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderDrawParametersFeatures* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderDrawParametersFeatures* forUnmarshaling, uint8_t** ptr);
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceShaderDrawParametersFeatures, reservedunmarshal_VkPhysicalDeviceShaderDrawParameterFeatures)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceShaderDrawParametersFeatures,
+                      reservedunmarshal_VkPhysicalDeviceShaderDrawParameterFeatures)
 
 #endif
 #ifdef VK_VERSION_1_2
 void reservedunmarshal_VkPhysicalDeviceVulkan11Features(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceVulkan11Features* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceVulkan11Features* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceVulkan11Properties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceVulkan11Properties* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceVulkan11Properties* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceVulkan12Features(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceVulkan12Features* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceVulkan12Features* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkConformanceVersion(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkConformanceVersion* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkConformanceVersion(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkConformanceVersion* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceVulkan12Properties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceVulkan12Properties* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceVulkan12Properties* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkImageFormatListCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageFormatListCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkImageFormatListCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkImageFormatListCreateInfo* forUnmarshaling,
+                                                   uint8_t** ptr);
 
-void reservedunmarshal_VkAttachmentDescription2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAttachmentDescription2* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkAttachmentDescription2(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkAttachmentDescription2* forUnmarshaling,
+                                                uint8_t** ptr);
 
-void reservedunmarshal_VkAttachmentReference2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAttachmentReference2* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkAttachmentReference2(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkAttachmentReference2* forUnmarshaling,
+                                              uint8_t** ptr);
 
-void reservedunmarshal_VkSubpassDescription2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubpassDescription2* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkSubpassDescription2(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkSubpassDescription2* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkSubpassDependency2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubpassDependency2* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkSubpassDependency2(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkSubpassDependency2* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkRenderPassCreateInfo2(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderPassCreateInfo2* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkRenderPassCreateInfo2(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkRenderPassCreateInfo2* forUnmarshaling,
+                                               uint8_t** ptr);
 
-void reservedunmarshal_VkSubpassBeginInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubpassBeginInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkSubpassBeginInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkSubpassBeginInfo* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkSubpassEndInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubpassEndInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkSubpassEndInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkSubpassEndInfo* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDevice8BitStorageFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevice8BitStorageFeatures* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevice8BitStorageFeatures* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceDriverProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDriverProperties* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceDriverProperties* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceShaderAtomicInt64Features(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderAtomicInt64Features* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderAtomicInt64Features* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceShaderFloat16Int8Features(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderFloat16Int8Features* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderFloat16Int8Features* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceFloatControlsProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFloatControlsProperties* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceFloatControlsProperties* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkDescriptorSetLayoutBindingFlagsCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorSetLayoutBindingFlagsCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDescriptorSetLayoutBindingFlagsCreateInfo* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceDescriptorIndexingFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDescriptorIndexingFeatures* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceDescriptorIndexingFeatures* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceDescriptorIndexingProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDescriptorIndexingProperties* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceDescriptorIndexingProperties* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkDescriptorSetVariableDescriptorCountAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorSetVariableDescriptorCountAllocateInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDescriptorSetVariableDescriptorCountAllocateInfo* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkDescriptorSetVariableDescriptorCountLayoutSupport(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorSetVariableDescriptorCountLayoutSupport* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDescriptorSetVariableDescriptorCountLayoutSupport* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkSubpassDescriptionDepthStencilResolve(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubpassDescriptionDepthStencilResolve* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSubpassDescriptionDepthStencilResolve* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceDepthStencilResolveProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDepthStencilResolveProperties* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceDepthStencilResolveProperties* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceScalarBlockLayoutFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceScalarBlockLayoutFeatures* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceScalarBlockLayoutFeatures* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkImageStencilUsageCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageStencilUsageCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkImageStencilUsageCreateInfo(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkImageStencilUsageCreateInfo* forUnmarshaling,
+                                                     uint8_t** ptr);
 
 void reservedunmarshal_VkSamplerReductionModeCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSamplerReductionModeCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSamplerReductionModeCreateInfo* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceSamplerFilterMinmaxProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSamplerFilterMinmaxProperties* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceSamplerFilterMinmaxProperties* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceVulkanMemoryModelFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceVulkanMemoryModelFeatures* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceVulkanMemoryModelFeatures* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceImagelessFramebufferFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceImagelessFramebufferFeatures* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceImagelessFramebufferFeatures* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkFramebufferAttachmentImageInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFramebufferAttachmentImageInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkFramebufferAttachmentImageInfo* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkFramebufferAttachmentsCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFramebufferAttachmentsCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkFramebufferAttachmentsCreateInfo* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkRenderPassAttachmentBeginInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderPassAttachmentBeginInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkRenderPassAttachmentBeginInfo* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceUniformBufferStandardLayoutFeatures* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceUniformBufferStandardLayoutFeatures* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkAttachmentReferenceStencilLayout(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAttachmentReferenceStencilLayout* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAttachmentReferenceStencilLayout* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkAttachmentDescriptionStencilLayout(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAttachmentDescriptionStencilLayout* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAttachmentDescriptionStencilLayout* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceHostQueryResetFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceHostQueryResetFeatures* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceHostQueryResetFeatures* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceTimelineSemaphoreFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceTimelineSemaphoreFeatures* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceTimelineSemaphoreFeatures* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceTimelineSemaphoreProperties(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceTimelineSemaphoreProperties* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceTimelineSemaphoreProperties* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkSemaphoreTypeCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSemaphoreTypeCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkSemaphoreTypeCreateInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkSemaphoreTypeCreateInfo* forUnmarshaling,
+                                                 uint8_t** ptr);
 
-void reservedunmarshal_VkTimelineSemaphoreSubmitInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkTimelineSemaphoreSubmitInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkTimelineSemaphoreSubmitInfo(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkTimelineSemaphoreSubmitInfo* forUnmarshaling,
+                                                     uint8_t** ptr);
 
-void reservedunmarshal_VkSemaphoreWaitInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSemaphoreWaitInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkSemaphoreWaitInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkSemaphoreWaitInfo* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkSemaphoreSignalInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSemaphoreSignalInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkSemaphoreSignalInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkSemaphoreSignalInfo* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceBufferDeviceAddressFeatures(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceBufferDeviceAddressFeatures* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceBufferDeviceAddressFeatures* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkBufferDeviceAddressInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferDeviceAddressInfo* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkBufferDeviceAddressInfo(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkBufferDeviceAddressInfo* forUnmarshaling,
+                                                 uint8_t** ptr);
 
 void reservedunmarshal_VkBufferOpaqueCaptureAddressCreateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferOpaqueCaptureAddressCreateInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBufferOpaqueCaptureAddressCreateInfo* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkMemoryOpaqueCaptureAddressAllocateInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryOpaqueCaptureAddressAllocateInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkMemoryOpaqueCaptureAddressAllocateInfo* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkDeviceMemoryOpaqueCaptureAddressInfo(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceMemoryOpaqueCaptureAddressInfo* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDeviceMemoryOpaqueCaptureAddressInfo* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_surface
-void reservedunmarshal_VkSurfaceCapabilitiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSurfaceCapabilitiesKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkSurfaceCapabilitiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkSurfaceCapabilitiesKHR* forUnmarshaling,
+                                                uint8_t** ptr);
 
-void reservedunmarshal_VkSurfaceFormatKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSurfaceFormatKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkSurfaceFormatKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkSurfaceFormatKHR* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_swapchain
-void reservedunmarshal_VkSwapchainCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSwapchainCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkSwapchainCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkSwapchainCreateInfoKHR* forUnmarshaling,
+                                                uint8_t** ptr);
 
-void reservedunmarshal_VkPresentInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPresentInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkPresentInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkPresentInfoKHR* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkImageSwapchainCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageSwapchainCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkImageSwapchainCreateInfoKHR(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkImageSwapchainCreateInfoKHR* forUnmarshaling,
+                                                     uint8_t** ptr);
 
 void reservedunmarshal_VkBindImageMemorySwapchainInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindImageMemorySwapchainInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBindImageMemorySwapchainInfoKHR* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkAcquireNextImageInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAcquireNextImageInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkAcquireNextImageInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkAcquireNextImageInfoKHR* forUnmarshaling,
+                                                 uint8_t** ptr);
 
 void reservedunmarshal_VkDeviceGroupPresentCapabilitiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceGroupPresentCapabilitiesKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDeviceGroupPresentCapabilitiesKHR* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkDeviceGroupPresentInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceGroupPresentInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDeviceGroupPresentInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkDeviceGroupPresentInfoKHR* forUnmarshaling,
+                                                   uint8_t** ptr);
 
 void reservedunmarshal_VkDeviceGroupSwapchainCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceGroupSwapchainCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDeviceGroupSwapchainCreateInfoKHR* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_display
-void reservedunmarshal_VkDisplayModeParametersKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayModeParametersKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDisplayModeParametersKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                  VkDisplayModeParametersKHR* forUnmarshaling,
+                                                  uint8_t** ptr);
 
-void reservedunmarshal_VkDisplayModeCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayModeCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDisplayModeCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                  VkDisplayModeCreateInfoKHR* forUnmarshaling,
+                                                  uint8_t** ptr);
 
-void reservedunmarshal_VkDisplayModePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayModePropertiesKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDisplayModePropertiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                  VkDisplayModePropertiesKHR* forUnmarshaling,
+                                                  uint8_t** ptr);
 
-void reservedunmarshal_VkDisplayPlaneCapabilitiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayPlaneCapabilitiesKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDisplayPlaneCapabilitiesKHR(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkDisplayPlaneCapabilitiesKHR* forUnmarshaling,
+                                                     uint8_t** ptr);
 
-void reservedunmarshal_VkDisplayPlanePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayPlanePropertiesKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDisplayPlanePropertiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkDisplayPlanePropertiesKHR* forUnmarshaling,
+                                                   uint8_t** ptr);
 
-void reservedunmarshal_VkDisplayPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayPropertiesKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDisplayPropertiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkDisplayPropertiesKHR* forUnmarshaling,
+                                              uint8_t** ptr);
 
-void reservedunmarshal_VkDisplaySurfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplaySurfaceCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDisplaySurfaceCreateInfoKHR(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkDisplaySurfaceCreateInfoKHR* forUnmarshaling,
+                                                     uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_display_swapchain
-void reservedunmarshal_VkDisplayPresentInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayPresentInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDisplayPresentInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkDisplayPresentInfoKHR* forUnmarshaling,
+                                               uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_xlib_surface
-void reservedunmarshal_VkXlibSurfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkXlibSurfaceCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkXlibSurfaceCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                  VkXlibSurfaceCreateInfoKHR* forUnmarshaling,
+                                                  uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_xcb_surface
-void reservedunmarshal_VkXcbSurfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkXcbSurfaceCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkXcbSurfaceCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkXcbSurfaceCreateInfoKHR* forUnmarshaling,
+                                                 uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_wayland_surface
-void reservedunmarshal_VkWaylandSurfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkWaylandSurfaceCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkWaylandSurfaceCreateInfoKHR(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkWaylandSurfaceCreateInfoKHR* forUnmarshaling,
+                                                     uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_android_surface
-void reservedunmarshal_VkAndroidSurfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAndroidSurfaceCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkAndroidSurfaceCreateInfoKHR(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkAndroidSurfaceCreateInfoKHR* forUnmarshaling,
+                                                     uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_win32_surface
-void reservedunmarshal_VkWin32SurfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkWin32SurfaceCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkWin32SurfaceCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkWin32SurfaceCreateInfoKHR* forUnmarshaling,
+                                                   uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_sampler_mirror_clamp_to_edge
 #endif
 #ifdef VK_KHR_video_queue
 void reservedunmarshal_VkVideoQueueFamilyProperties2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoQueueFamilyProperties2KHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoQueueFamilyProperties2KHR* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkVideoProfileKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoProfileKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkVideoProfileKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkVideoProfileKHR* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkVideoProfilesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoProfilesKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkVideoProfilesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkVideoProfilesKHR* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkVideoCapabilitiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoCapabilitiesKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkVideoCapabilitiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkVideoCapabilitiesKHR* forUnmarshaling,
+                                              uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceVideoFormatInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceVideoFormatInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceVideoFormatInfoKHR* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkVideoFormatPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoFormatPropertiesKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkVideoFormatPropertiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                  VkVideoFormatPropertiesKHR* forUnmarshaling,
+                                                  uint8_t** ptr);
 
-void reservedunmarshal_VkVideoPictureResourceKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoPictureResourceKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkVideoPictureResourceKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkVideoPictureResourceKHR* forUnmarshaling,
+                                                 uint8_t** ptr);
 
-void reservedunmarshal_VkVideoReferenceSlotKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoReferenceSlotKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkVideoReferenceSlotKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkVideoReferenceSlotKHR* forUnmarshaling,
+                                               uint8_t** ptr);
 
-void reservedunmarshal_VkVideoGetMemoryPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoGetMemoryPropertiesKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkVideoGetMemoryPropertiesKHR(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkVideoGetMemoryPropertiesKHR* forUnmarshaling,
+                                                     uint8_t** ptr);
 
-void reservedunmarshal_VkVideoBindMemoryKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoBindMemoryKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkVideoBindMemoryKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkVideoBindMemoryKHR* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkVideoSessionCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoSessionCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkVideoSessionCreateInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkVideoSessionCreateInfoKHR* forUnmarshaling,
+                                                   uint8_t** ptr);
 
 void reservedunmarshal_VkVideoSessionParametersCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoSessionParametersCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoSessionParametersCreateInfoKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkVideoSessionParametersUpdateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoSessionParametersUpdateInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoSessionParametersUpdateInfoKHR* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkVideoBeginCodingInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoBeginCodingInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkVideoBeginCodingInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkVideoBeginCodingInfoKHR* forUnmarshaling,
+                                                 uint8_t** ptr);
 
-void reservedunmarshal_VkVideoEndCodingInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEndCodingInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkVideoEndCodingInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkVideoEndCodingInfoKHR* forUnmarshaling,
+                                               uint8_t** ptr);
 
-void reservedunmarshal_VkVideoCodingControlInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoCodingControlInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkVideoCodingControlInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkVideoCodingControlInfoKHR* forUnmarshaling,
+                                                   uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_video_decode_queue
-void reservedunmarshal_VkVideoDecodeInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkVideoDecodeInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkVideoDecodeInfoKHR* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_dynamic_rendering
-void reservedunmarshal_VkRenderingAttachmentInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderingAttachmentInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkRenderingAttachmentInfoKHR(VulkanStream* vkStream,
+                                                    VkStructureType rootType,
+                                                    VkRenderingAttachmentInfoKHR* forUnmarshaling,
+                                                    uint8_t** ptr);
 
-void reservedunmarshal_VkRenderingInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderingInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkRenderingInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkRenderingInfoKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineRenderingCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineRenderingCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineRenderingCreateInfoKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceDynamicRenderingFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDynamicRenderingFeaturesKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceDynamicRenderingFeaturesKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkCommandBufferInheritanceRenderingInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCommandBufferInheritanceRenderingInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkCommandBufferInheritanceRenderingInfoKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkRenderingFragmentShadingRateAttachmentInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderingFragmentShadingRateAttachmentInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkRenderingFragmentShadingRateAttachmentInfoKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkRenderingFragmentDensityMapAttachmentInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderingFragmentDensityMapAttachmentInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkRenderingFragmentDensityMapAttachmentInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkAttachmentSampleCountInfoAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAttachmentSampleCountInfoAMD* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAttachmentSampleCountInfoAMD* forUnmarshaling, uint8_t** ptr);
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkAttachmentSampleCountInfoAMD, reservedunmarshal_VkAttachmentSampleCountInfoNV)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkAttachmentSampleCountInfoAMD,
+                      reservedunmarshal_VkAttachmentSampleCountInfoNV)
 
 void reservedunmarshal_VkMultiviewPerViewAttributesInfoNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMultiviewPerViewAttributesInfoNVX* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkMultiviewPerViewAttributesInfoNVX* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_multiview
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkRenderPassMultiviewCreateInfo, reservedunmarshal_VkRenderPassMultiviewCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkRenderPassMultiviewCreateInfo,
+                      reservedunmarshal_VkRenderPassMultiviewCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceMultiviewFeatures, reservedunmarshal_VkPhysicalDeviceMultiviewFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceMultiviewFeatures,
+                      reservedunmarshal_VkPhysicalDeviceMultiviewFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceMultiviewProperties, reservedunmarshal_VkPhysicalDeviceMultiviewPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceMultiviewProperties,
+                      reservedunmarshal_VkPhysicalDeviceMultiviewPropertiesKHR)
 
 #endif
 #ifdef VK_KHR_get_physical_device_properties2
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceFeatures2, reservedunmarshal_VkPhysicalDeviceFeatures2KHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceFeatures2,
+                      reservedunmarshal_VkPhysicalDeviceFeatures2KHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceProperties2, reservedunmarshal_VkPhysicalDeviceProperties2KHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceProperties2,
+                      reservedunmarshal_VkPhysicalDeviceProperties2KHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkFormatProperties2, reservedunmarshal_VkFormatProperties2KHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkFormatProperties2,
+                      reservedunmarshal_VkFormatProperties2KHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkImageFormatProperties2, reservedunmarshal_VkImageFormatProperties2KHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkImageFormatProperties2,
+                      reservedunmarshal_VkImageFormatProperties2KHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceImageFormatInfo2, reservedunmarshal_VkPhysicalDeviceImageFormatInfo2KHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceImageFormatInfo2,
+                      reservedunmarshal_VkPhysicalDeviceImageFormatInfo2KHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkQueueFamilyProperties2, reservedunmarshal_VkQueueFamilyProperties2KHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkQueueFamilyProperties2,
+                      reservedunmarshal_VkQueueFamilyProperties2KHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceMemoryProperties2, reservedunmarshal_VkPhysicalDeviceMemoryProperties2KHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceMemoryProperties2,
+                      reservedunmarshal_VkPhysicalDeviceMemoryProperties2KHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkSparseImageFormatProperties2, reservedunmarshal_VkSparseImageFormatProperties2KHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkSparseImageFormatProperties2,
+                      reservedunmarshal_VkSparseImageFormatProperties2KHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceSparseImageFormatInfo2, reservedunmarshal_VkPhysicalDeviceSparseImageFormatInfo2KHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceSparseImageFormatInfo2,
+                      reservedunmarshal_VkPhysicalDeviceSparseImageFormatInfo2KHR)
 
 #endif
 #ifdef VK_KHR_device_group
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkMemoryAllocateFlagsInfo, reservedunmarshal_VkMemoryAllocateFlagsInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkMemoryAllocateFlagsInfo,
+                      reservedunmarshal_VkMemoryAllocateFlagsInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkDeviceGroupRenderPassBeginInfo, reservedunmarshal_VkDeviceGroupRenderPassBeginInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkDeviceGroupRenderPassBeginInfo,
+                      reservedunmarshal_VkDeviceGroupRenderPassBeginInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkDeviceGroupCommandBufferBeginInfo, reservedunmarshal_VkDeviceGroupCommandBufferBeginInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkDeviceGroupCommandBufferBeginInfo,
+                      reservedunmarshal_VkDeviceGroupCommandBufferBeginInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkDeviceGroupSubmitInfo, reservedunmarshal_VkDeviceGroupSubmitInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkDeviceGroupSubmitInfo,
+                      reservedunmarshal_VkDeviceGroupSubmitInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkDeviceGroupBindSparseInfo, reservedunmarshal_VkDeviceGroupBindSparseInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkDeviceGroupBindSparseInfo,
+                      reservedunmarshal_VkDeviceGroupBindSparseInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkBindBufferMemoryDeviceGroupInfo, reservedunmarshal_VkBindBufferMemoryDeviceGroupInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkBindBufferMemoryDeviceGroupInfo,
+                      reservedunmarshal_VkBindBufferMemoryDeviceGroupInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkBindImageMemoryDeviceGroupInfo, reservedunmarshal_VkBindImageMemoryDeviceGroupInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkBindImageMemoryDeviceGroupInfo,
+                      reservedunmarshal_VkBindImageMemoryDeviceGroupInfoKHR)
 
 #endif
 #ifdef VK_KHR_shader_draw_parameters
@@ -1787,201 +1202,190 @@
 #ifdef VK_KHR_maintenance1
 #endif
 #ifdef VK_KHR_device_group_creation
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceGroupProperties, reservedunmarshal_VkPhysicalDeviceGroupPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceGroupProperties,
+                      reservedunmarshal_VkPhysicalDeviceGroupPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkDeviceGroupDeviceCreateInfo, reservedunmarshal_VkDeviceGroupDeviceCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkDeviceGroupDeviceCreateInfo,
+                      reservedunmarshal_VkDeviceGroupDeviceCreateInfoKHR)
 
 #endif
 #ifdef VK_KHR_external_memory_capabilities
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkExternalMemoryProperties, reservedunmarshal_VkExternalMemoryPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkExternalMemoryProperties,
+                      reservedunmarshal_VkExternalMemoryPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceExternalImageFormatInfo, reservedunmarshal_VkPhysicalDeviceExternalImageFormatInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceExternalImageFormatInfo,
+                      reservedunmarshal_VkPhysicalDeviceExternalImageFormatInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkExternalImageFormatProperties, reservedunmarshal_VkExternalImageFormatPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkExternalImageFormatProperties,
+                      reservedunmarshal_VkExternalImageFormatPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceExternalBufferInfo, reservedunmarshal_VkPhysicalDeviceExternalBufferInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceExternalBufferInfo,
+                      reservedunmarshal_VkPhysicalDeviceExternalBufferInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkExternalBufferProperties, reservedunmarshal_VkExternalBufferPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkExternalBufferProperties,
+                      reservedunmarshal_VkExternalBufferPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceIDProperties, reservedunmarshal_VkPhysicalDeviceIDPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceIDProperties,
+                      reservedunmarshal_VkPhysicalDeviceIDPropertiesKHR)
 
 #endif
 #ifdef VK_KHR_external_memory
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkExternalMemoryImageCreateInfo, reservedunmarshal_VkExternalMemoryImageCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkExternalMemoryImageCreateInfo,
+                      reservedunmarshal_VkExternalMemoryImageCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkExternalMemoryBufferCreateInfo, reservedunmarshal_VkExternalMemoryBufferCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkExternalMemoryBufferCreateInfo,
+                      reservedunmarshal_VkExternalMemoryBufferCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkExportMemoryAllocateInfo, reservedunmarshal_VkExportMemoryAllocateInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkExportMemoryAllocateInfo,
+                      reservedunmarshal_VkExportMemoryAllocateInfoKHR)
 
 #endif
 #ifdef VK_KHR_external_memory_win32
 void reservedunmarshal_VkImportMemoryWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportMemoryWin32HandleInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImportMemoryWin32HandleInfoKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkExportMemoryWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExportMemoryWin32HandleInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkExportMemoryWin32HandleInfoKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkMemoryWin32HandlePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryWin32HandlePropertiesKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkMemoryWin32HandlePropertiesKHR* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkMemoryGetWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryGetWin32HandleInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkMemoryGetWin32HandleInfoKHR(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkMemoryGetWin32HandleInfoKHR* forUnmarshaling,
+                                                     uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_external_memory_fd
-void reservedunmarshal_VkImportMemoryFdInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportMemoryFdInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkImportMemoryFdInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkImportMemoryFdInfoKHR* forUnmarshaling,
+                                               uint8_t** ptr);
 
-void reservedunmarshal_VkMemoryFdPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryFdPropertiesKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkMemoryFdPropertiesKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkMemoryFdPropertiesKHR* forUnmarshaling,
+                                               uint8_t** ptr);
 
-void reservedunmarshal_VkMemoryGetFdInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryGetFdInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkMemoryGetFdInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkMemoryGetFdInfoKHR* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_win32_keyed_mutex
 void reservedunmarshal_VkWin32KeyedMutexAcquireReleaseInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkWin32KeyedMutexAcquireReleaseInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkWin32KeyedMutexAcquireReleaseInfoKHR* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_external_semaphore_capabilities
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceExternalSemaphoreInfo, reservedunmarshal_VkPhysicalDeviceExternalSemaphoreInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceExternalSemaphoreInfo,
+                      reservedunmarshal_VkPhysicalDeviceExternalSemaphoreInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkExternalSemaphoreProperties, reservedunmarshal_VkExternalSemaphorePropertiesKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkExternalSemaphoreProperties,
+                      reservedunmarshal_VkExternalSemaphorePropertiesKHR)
 
 #endif
 #ifdef VK_KHR_external_semaphore
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkExportSemaphoreCreateInfo, reservedunmarshal_VkExportSemaphoreCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkExportSemaphoreCreateInfo,
+                      reservedunmarshal_VkExportSemaphoreCreateInfoKHR)
 
 #endif
 #ifdef VK_KHR_external_semaphore_win32
 void reservedunmarshal_VkImportSemaphoreWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportSemaphoreWin32HandleInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImportSemaphoreWin32HandleInfoKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkExportSemaphoreWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExportSemaphoreWin32HandleInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkExportSemaphoreWin32HandleInfoKHR* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkD3D12FenceSubmitInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkD3D12FenceSubmitInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkD3D12FenceSubmitInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkD3D12FenceSubmitInfoKHR* forUnmarshaling,
+                                                 uint8_t** ptr);
 
 void reservedunmarshal_VkSemaphoreGetWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSemaphoreGetWin32HandleInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSemaphoreGetWin32HandleInfoKHR* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_external_semaphore_fd
-void reservedunmarshal_VkImportSemaphoreFdInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportSemaphoreFdInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkImportSemaphoreFdInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                  VkImportSemaphoreFdInfoKHR* forUnmarshaling,
+                                                  uint8_t** ptr);
 
-void reservedunmarshal_VkSemaphoreGetFdInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSemaphoreGetFdInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkSemaphoreGetFdInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkSemaphoreGetFdInfoKHR* forUnmarshaling,
+                                               uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_push_descriptor
 void reservedunmarshal_VkPhysicalDevicePushDescriptorPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePushDescriptorPropertiesKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePushDescriptorPropertiesKHR* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_shader_float16_int8
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceShaderFloat16Int8Features, reservedunmarshal_VkPhysicalDeviceShaderFloat16Int8FeaturesKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceShaderFloat16Int8Features,
+                      reservedunmarshal_VkPhysicalDeviceShaderFloat16Int8FeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceShaderFloat16Int8Features, reservedunmarshal_VkPhysicalDeviceFloat16Int8FeaturesKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceShaderFloat16Int8Features,
+                      reservedunmarshal_VkPhysicalDeviceFloat16Int8FeaturesKHR)
 
 #endif
 #ifdef VK_KHR_16bit_storage
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDevice16BitStorageFeatures, reservedunmarshal_VkPhysicalDevice16BitStorageFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDevice16BitStorageFeatures,
+                      reservedunmarshal_VkPhysicalDevice16BitStorageFeaturesKHR)
 
 #endif
 #ifdef VK_KHR_incremental_present
-void reservedunmarshal_VkRectLayerKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRectLayerKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkRectLayerKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                      VkRectLayerKHR* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkPresentRegionKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPresentRegionKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkPresentRegionKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkPresentRegionKHR* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkPresentRegionsKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPresentRegionsKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkPresentRegionsKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkPresentRegionsKHR* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_descriptor_update_template
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkDescriptorUpdateTemplateEntry, reservedunmarshal_VkDescriptorUpdateTemplateEntryKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkDescriptorUpdateTemplateEntry,
+                      reservedunmarshal_VkDescriptorUpdateTemplateEntryKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkDescriptorUpdateTemplateCreateInfo, reservedunmarshal_VkDescriptorUpdateTemplateCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkDescriptorUpdateTemplateCreateInfo,
+                      reservedunmarshal_VkDescriptorUpdateTemplateCreateInfoKHR)
 
 #endif
 #ifdef VK_KHR_imageless_framebuffer
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceImagelessFramebufferFeatures, reservedunmarshal_VkPhysicalDeviceImagelessFramebufferFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceImagelessFramebufferFeatures,
+                      reservedunmarshal_VkPhysicalDeviceImagelessFramebufferFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkFramebufferAttachmentsCreateInfo, reservedunmarshal_VkFramebufferAttachmentsCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkFramebufferAttachmentsCreateInfo,
+                      reservedunmarshal_VkFramebufferAttachmentsCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkFramebufferAttachmentImageInfo, reservedunmarshal_VkFramebufferAttachmentImageInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkFramebufferAttachmentImageInfo,
+                      reservedunmarshal_VkFramebufferAttachmentImageInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkRenderPassAttachmentBeginInfo, reservedunmarshal_VkRenderPassAttachmentBeginInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkRenderPassAttachmentBeginInfo,
+                      reservedunmarshal_VkRenderPassAttachmentBeginInfoKHR)
 
 #endif
 #ifdef VK_KHR_create_renderpass2
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkRenderPassCreateInfo2, reservedunmarshal_VkRenderPassCreateInfo2KHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkRenderPassCreateInfo2,
+                      reservedunmarshal_VkRenderPassCreateInfo2KHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkAttachmentDescription2, reservedunmarshal_VkAttachmentDescription2KHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkAttachmentDescription2,
+                      reservedunmarshal_VkAttachmentDescription2KHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkAttachmentReference2, reservedunmarshal_VkAttachmentReference2KHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkAttachmentReference2,
+                      reservedunmarshal_VkAttachmentReference2KHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkSubpassDescription2, reservedunmarshal_VkSubpassDescription2KHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkSubpassDescription2,
+                      reservedunmarshal_VkSubpassDescription2KHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkSubpassDependency2, reservedunmarshal_VkSubpassDependency2KHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkSubpassDependency2,
+                      reservedunmarshal_VkSubpassDependency2KHR)
 
 DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkSubpassBeginInfo, reservedunmarshal_VkSubpassBeginInfoKHR)
 
@@ -1990,180 +1394,150 @@
 #endif
 #ifdef VK_KHR_shared_presentable_image
 void reservedunmarshal_VkSharedPresentSurfaceCapabilitiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSharedPresentSurfaceCapabilitiesKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSharedPresentSurfaceCapabilitiesKHR* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_external_fence_capabilities
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceExternalFenceInfo, reservedunmarshal_VkPhysicalDeviceExternalFenceInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceExternalFenceInfo,
+                      reservedunmarshal_VkPhysicalDeviceExternalFenceInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkExternalFenceProperties, reservedunmarshal_VkExternalFencePropertiesKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkExternalFenceProperties,
+                      reservedunmarshal_VkExternalFencePropertiesKHR)
 
 #endif
 #ifdef VK_KHR_external_fence
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkExportFenceCreateInfo, reservedunmarshal_VkExportFenceCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkExportFenceCreateInfo,
+                      reservedunmarshal_VkExportFenceCreateInfoKHR)
 
 #endif
 #ifdef VK_KHR_external_fence_win32
 void reservedunmarshal_VkImportFenceWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportFenceWin32HandleInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImportFenceWin32HandleInfoKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkExportFenceWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExportFenceWin32HandleInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkExportFenceWin32HandleInfoKHR* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkFenceGetWin32HandleInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFenceGetWin32HandleInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkFenceGetWin32HandleInfoKHR(VulkanStream* vkStream,
+                                                    VkStructureType rootType,
+                                                    VkFenceGetWin32HandleInfoKHR* forUnmarshaling,
+                                                    uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_external_fence_fd
-void reservedunmarshal_VkImportFenceFdInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportFenceFdInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkImportFenceFdInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkImportFenceFdInfoKHR* forUnmarshaling,
+                                              uint8_t** ptr);
 
-void reservedunmarshal_VkFenceGetFdInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFenceGetFdInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkFenceGetFdInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkFenceGetFdInfoKHR* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_performance_query
 void reservedunmarshal_VkPhysicalDevicePerformanceQueryFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePerformanceQueryFeaturesKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePerformanceQueryFeaturesKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDevicePerformanceQueryPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePerformanceQueryPropertiesKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePerformanceQueryPropertiesKHR* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkPerformanceCounterKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPerformanceCounterKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkPerformanceCounterKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkPerformanceCounterKHR* forUnmarshaling,
+                                               uint8_t** ptr);
 
 void reservedunmarshal_VkPerformanceCounterDescriptionKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPerformanceCounterDescriptionKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPerformanceCounterDescriptionKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkQueryPoolPerformanceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkQueryPoolPerformanceCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkQueryPoolPerformanceCreateInfoKHR* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkPerformanceCounterResultKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPerformanceCounterResultKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkPerformanceCounterResultKHR(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkPerformanceCounterResultKHR* forUnmarshaling,
+                                                     uint8_t** ptr);
 
-void reservedunmarshal_VkAcquireProfilingLockInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAcquireProfilingLockInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkAcquireProfilingLockInfoKHR(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkAcquireProfilingLockInfoKHR* forUnmarshaling,
+                                                     uint8_t** ptr);
 
 void reservedunmarshal_VkPerformanceQuerySubmitInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPerformanceQuerySubmitInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPerformanceQuerySubmitInfoKHR* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_maintenance2
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDevicePointClippingProperties, reservedunmarshal_VkPhysicalDevicePointClippingPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDevicePointClippingProperties,
+                      reservedunmarshal_VkPhysicalDevicePointClippingPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkRenderPassInputAttachmentAspectCreateInfo, reservedunmarshal_VkRenderPassInputAttachmentAspectCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkRenderPassInputAttachmentAspectCreateInfo,
+                      reservedunmarshal_VkRenderPassInputAttachmentAspectCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkInputAttachmentAspectReference, reservedunmarshal_VkInputAttachmentAspectReferenceKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkInputAttachmentAspectReference,
+                      reservedunmarshal_VkInputAttachmentAspectReferenceKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkImageViewUsageCreateInfo, reservedunmarshal_VkImageViewUsageCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkImageViewUsageCreateInfo,
+                      reservedunmarshal_VkImageViewUsageCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPipelineTessellationDomainOriginStateCreateInfo, reservedunmarshal_VkPipelineTessellationDomainOriginStateCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPipelineTessellationDomainOriginStateCreateInfo,
+                      reservedunmarshal_VkPipelineTessellationDomainOriginStateCreateInfoKHR)
 
 #endif
 #ifdef VK_KHR_get_surface_capabilities2
 void reservedunmarshal_VkPhysicalDeviceSurfaceInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSurfaceInfo2KHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceSurfaceInfo2KHR* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkSurfaceCapabilities2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSurfaceCapabilities2KHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkSurfaceCapabilities2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkSurfaceCapabilities2KHR* forUnmarshaling,
+                                                 uint8_t** ptr);
 
-void reservedunmarshal_VkSurfaceFormat2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSurfaceFormat2KHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkSurfaceFormat2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkSurfaceFormat2KHR* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_variable_pointers
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceVariablePointersFeatures, reservedunmarshal_VkPhysicalDeviceVariablePointerFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceVariablePointersFeatures,
+                      reservedunmarshal_VkPhysicalDeviceVariablePointerFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceVariablePointersFeatures, reservedunmarshal_VkPhysicalDeviceVariablePointersFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceVariablePointersFeatures,
+                      reservedunmarshal_VkPhysicalDeviceVariablePointersFeaturesKHR)
 
 #endif
 #ifdef VK_KHR_get_display_properties2
-void reservedunmarshal_VkDisplayProperties2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayProperties2KHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDisplayProperties2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkDisplayProperties2KHR* forUnmarshaling,
+                                               uint8_t** ptr);
 
-void reservedunmarshal_VkDisplayPlaneProperties2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayPlaneProperties2KHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDisplayPlaneProperties2KHR(VulkanStream* vkStream,
+                                                    VkStructureType rootType,
+                                                    VkDisplayPlaneProperties2KHR* forUnmarshaling,
+                                                    uint8_t** ptr);
 
-void reservedunmarshal_VkDisplayModeProperties2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayModeProperties2KHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDisplayModeProperties2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkDisplayModeProperties2KHR* forUnmarshaling,
+                                                   uint8_t** ptr);
 
-void reservedunmarshal_VkDisplayPlaneInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayPlaneInfo2KHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDisplayPlaneInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkDisplayPlaneInfo2KHR* forUnmarshaling,
+                                              uint8_t** ptr);
 
 void reservedunmarshal_VkDisplayPlaneCapabilities2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayPlaneCapabilities2KHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDisplayPlaneCapabilities2KHR* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_dedicated_allocation
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkMemoryDedicatedRequirements, reservedunmarshal_VkMemoryDedicatedRequirementsKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkMemoryDedicatedRequirements,
+                      reservedunmarshal_VkMemoryDedicatedRequirementsKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkMemoryDedicatedAllocateInfo, reservedunmarshal_VkMemoryDedicatedAllocateInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkMemoryDedicatedAllocateInfo,
+                      reservedunmarshal_VkMemoryDedicatedAllocateInfoKHR)
 
 #endif
 #ifdef VK_KHR_storage_buffer_storage_class
@@ -2171,501 +1545,414 @@
 #ifdef VK_KHR_relaxed_block_layout
 #endif
 #ifdef VK_KHR_get_memory_requirements2
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkBufferMemoryRequirementsInfo2, reservedunmarshal_VkBufferMemoryRequirementsInfo2KHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkBufferMemoryRequirementsInfo2,
+                      reservedunmarshal_VkBufferMemoryRequirementsInfo2KHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkImageMemoryRequirementsInfo2, reservedunmarshal_VkImageMemoryRequirementsInfo2KHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkImageMemoryRequirementsInfo2,
+                      reservedunmarshal_VkImageMemoryRequirementsInfo2KHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkImageSparseMemoryRequirementsInfo2, reservedunmarshal_VkImageSparseMemoryRequirementsInfo2KHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkImageSparseMemoryRequirementsInfo2,
+                      reservedunmarshal_VkImageSparseMemoryRequirementsInfo2KHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkMemoryRequirements2, reservedunmarshal_VkMemoryRequirements2KHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkMemoryRequirements2,
+                      reservedunmarshal_VkMemoryRequirements2KHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkSparseImageMemoryRequirements2, reservedunmarshal_VkSparseImageMemoryRequirements2KHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkSparseImageMemoryRequirements2,
+                      reservedunmarshal_VkSparseImageMemoryRequirements2KHR)
 
 #endif
 #ifdef VK_KHR_image_format_list
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkImageFormatListCreateInfo, reservedunmarshal_VkImageFormatListCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkImageFormatListCreateInfo,
+                      reservedunmarshal_VkImageFormatListCreateInfoKHR)
 
 #endif
 #ifdef VK_KHR_sampler_ycbcr_conversion
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkSamplerYcbcrConversionCreateInfo, reservedunmarshal_VkSamplerYcbcrConversionCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkSamplerYcbcrConversionCreateInfo,
+                      reservedunmarshal_VkSamplerYcbcrConversionCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkSamplerYcbcrConversionInfo, reservedunmarshal_VkSamplerYcbcrConversionInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkSamplerYcbcrConversionInfo,
+                      reservedunmarshal_VkSamplerYcbcrConversionInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkBindImagePlaneMemoryInfo, reservedunmarshal_VkBindImagePlaneMemoryInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkBindImagePlaneMemoryInfo,
+                      reservedunmarshal_VkBindImagePlaneMemoryInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkImagePlaneMemoryRequirementsInfo, reservedunmarshal_VkImagePlaneMemoryRequirementsInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkImagePlaneMemoryRequirementsInfo,
+                      reservedunmarshal_VkImagePlaneMemoryRequirementsInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceSamplerYcbcrConversionFeatures, reservedunmarshal_VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceSamplerYcbcrConversionFeatures,
+                      reservedunmarshal_VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkSamplerYcbcrConversionImageFormatProperties, reservedunmarshal_VkSamplerYcbcrConversionImageFormatPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkSamplerYcbcrConversionImageFormatProperties,
+                      reservedunmarshal_VkSamplerYcbcrConversionImageFormatPropertiesKHR)
 
 #endif
 #ifdef VK_KHR_bind_memory2
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkBindBufferMemoryInfo, reservedunmarshal_VkBindBufferMemoryInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkBindBufferMemoryInfo,
+                      reservedunmarshal_VkBindBufferMemoryInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkBindImageMemoryInfo, reservedunmarshal_VkBindImageMemoryInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkBindImageMemoryInfo,
+                      reservedunmarshal_VkBindImageMemoryInfoKHR)
 
 #endif
 #ifdef VK_KHR_portability_subset
 void reservedunmarshal_VkPhysicalDevicePortabilitySubsetFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePortabilitySubsetFeaturesKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePortabilitySubsetFeaturesKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDevicePortabilitySubsetPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePortabilitySubsetPropertiesKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePortabilitySubsetPropertiesKHR* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_maintenance3
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceMaintenance3Properties, reservedunmarshal_VkPhysicalDeviceMaintenance3PropertiesKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceMaintenance3Properties,
+                      reservedunmarshal_VkPhysicalDeviceMaintenance3PropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkDescriptorSetLayoutSupport, reservedunmarshal_VkDescriptorSetLayoutSupportKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkDescriptorSetLayoutSupport,
+                      reservedunmarshal_VkDescriptorSetLayoutSupportKHR)
 
 #endif
 #ifdef VK_KHR_draw_indirect_count
 #endif
 #ifdef VK_KHR_shader_subgroup_extended_types
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures, reservedunmarshal_VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures,
+                      reservedunmarshal_VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR)
 
 #endif
 #ifdef VK_KHR_8bit_storage
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDevice8BitStorageFeatures, reservedunmarshal_VkPhysicalDevice8BitStorageFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDevice8BitStorageFeatures,
+                      reservedunmarshal_VkPhysicalDevice8BitStorageFeaturesKHR)
 
 #endif
 #ifdef VK_KHR_shader_atomic_int64
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceShaderAtomicInt64Features, reservedunmarshal_VkPhysicalDeviceShaderAtomicInt64FeaturesKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceShaderAtomicInt64Features,
+                      reservedunmarshal_VkPhysicalDeviceShaderAtomicInt64FeaturesKHR)
 
 #endif
 #ifdef VK_KHR_shader_clock
 void reservedunmarshal_VkPhysicalDeviceShaderClockFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderClockFeaturesKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderClockFeaturesKHR* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_driver_properties
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkConformanceVersion, reservedunmarshal_VkConformanceVersionKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkConformanceVersion,
+                      reservedunmarshal_VkConformanceVersionKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceDriverProperties, reservedunmarshal_VkPhysicalDeviceDriverPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceDriverProperties,
+                      reservedunmarshal_VkPhysicalDeviceDriverPropertiesKHR)
 
 #endif
 #ifdef VK_KHR_shader_float_controls
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceFloatControlsProperties, reservedunmarshal_VkPhysicalDeviceFloatControlsPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceFloatControlsProperties,
+                      reservedunmarshal_VkPhysicalDeviceFloatControlsPropertiesKHR)
 
 #endif
 #ifdef VK_KHR_depth_stencil_resolve
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkSubpassDescriptionDepthStencilResolve, reservedunmarshal_VkSubpassDescriptionDepthStencilResolveKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkSubpassDescriptionDepthStencilResolve,
+                      reservedunmarshal_VkSubpassDescriptionDepthStencilResolveKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceDepthStencilResolveProperties, reservedunmarshal_VkPhysicalDeviceDepthStencilResolvePropertiesKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceDepthStencilResolveProperties,
+                      reservedunmarshal_VkPhysicalDeviceDepthStencilResolvePropertiesKHR)
 
 #endif
 #ifdef VK_KHR_swapchain_mutable_format
 #endif
 #ifdef VK_KHR_timeline_semaphore
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceTimelineSemaphoreFeatures, reservedunmarshal_VkPhysicalDeviceTimelineSemaphoreFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceTimelineSemaphoreFeatures,
+                      reservedunmarshal_VkPhysicalDeviceTimelineSemaphoreFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceTimelineSemaphoreProperties, reservedunmarshal_VkPhysicalDeviceTimelineSemaphorePropertiesKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceTimelineSemaphoreProperties,
+                      reservedunmarshal_VkPhysicalDeviceTimelineSemaphorePropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkSemaphoreTypeCreateInfo, reservedunmarshal_VkSemaphoreTypeCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkSemaphoreTypeCreateInfo,
+                      reservedunmarshal_VkSemaphoreTypeCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkTimelineSemaphoreSubmitInfo, reservedunmarshal_VkTimelineSemaphoreSubmitInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkTimelineSemaphoreSubmitInfo,
+                      reservedunmarshal_VkTimelineSemaphoreSubmitInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkSemaphoreWaitInfo, reservedunmarshal_VkSemaphoreWaitInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkSemaphoreWaitInfo,
+                      reservedunmarshal_VkSemaphoreWaitInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkSemaphoreSignalInfo, reservedunmarshal_VkSemaphoreSignalInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkSemaphoreSignalInfo,
+                      reservedunmarshal_VkSemaphoreSignalInfoKHR)
 
 #endif
 #ifdef VK_KHR_vulkan_memory_model
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceVulkanMemoryModelFeatures, reservedunmarshal_VkPhysicalDeviceVulkanMemoryModelFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceVulkanMemoryModelFeatures,
+                      reservedunmarshal_VkPhysicalDeviceVulkanMemoryModelFeaturesKHR)
 
 #endif
 #ifdef VK_KHR_shader_terminate_invocation
 void reservedunmarshal_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_fragment_shading_rate
 void reservedunmarshal_VkFragmentShadingRateAttachmentInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFragmentShadingRateAttachmentInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkFragmentShadingRateAttachmentInfoKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineFragmentShadingRateStateCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineFragmentShadingRateStateCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineFragmentShadingRateStateCreateInfoKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFragmentShadingRateFeaturesKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceFragmentShadingRateFeaturesKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFragmentShadingRatePropertiesKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceFragmentShadingRatePropertiesKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceFragmentShadingRateKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFragmentShadingRateKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceFragmentShadingRateKHR* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_spirv_1_4
 #endif
 #ifdef VK_KHR_surface_protected_capabilities
 void reservedunmarshal_VkSurfaceProtectedCapabilitiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSurfaceProtectedCapabilitiesKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSurfaceProtectedCapabilitiesKHR* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_separate_depth_stencil_layouts
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures, reservedunmarshal_VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures,
+                      reservedunmarshal_VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkAttachmentReferenceStencilLayout, reservedunmarshal_VkAttachmentReferenceStencilLayoutKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkAttachmentReferenceStencilLayout,
+                      reservedunmarshal_VkAttachmentReferenceStencilLayoutKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkAttachmentDescriptionStencilLayout, reservedunmarshal_VkAttachmentDescriptionStencilLayoutKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkAttachmentDescriptionStencilLayout,
+                      reservedunmarshal_VkAttachmentDescriptionStencilLayoutKHR)
 
 #endif
 #ifdef VK_KHR_present_wait
 void reservedunmarshal_VkPhysicalDevicePresentWaitFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePresentWaitFeaturesKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePresentWaitFeaturesKHR* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_uniform_buffer_standard_layout
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceUniformBufferStandardLayoutFeatures, reservedunmarshal_VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceUniformBufferStandardLayoutFeatures,
+                      reservedunmarshal_VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR)
 
 #endif
 #ifdef VK_KHR_buffer_device_address
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceBufferDeviceAddressFeatures, reservedunmarshal_VkPhysicalDeviceBufferDeviceAddressFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceBufferDeviceAddressFeatures,
+                      reservedunmarshal_VkPhysicalDeviceBufferDeviceAddressFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkBufferDeviceAddressInfo, reservedunmarshal_VkBufferDeviceAddressInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkBufferDeviceAddressInfo,
+                      reservedunmarshal_VkBufferDeviceAddressInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkBufferOpaqueCaptureAddressCreateInfo, reservedunmarshal_VkBufferOpaqueCaptureAddressCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkBufferOpaqueCaptureAddressCreateInfo,
+                      reservedunmarshal_VkBufferOpaqueCaptureAddressCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkMemoryOpaqueCaptureAddressAllocateInfo, reservedunmarshal_VkMemoryOpaqueCaptureAddressAllocateInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkMemoryOpaqueCaptureAddressAllocateInfo,
+                      reservedunmarshal_VkMemoryOpaqueCaptureAddressAllocateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkDeviceMemoryOpaqueCaptureAddressInfo, reservedunmarshal_VkDeviceMemoryOpaqueCaptureAddressInfoKHR)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkDeviceMemoryOpaqueCaptureAddressInfo,
+                      reservedunmarshal_VkDeviceMemoryOpaqueCaptureAddressInfoKHR)
 
 #endif
 #ifdef VK_KHR_deferred_host_operations
 #endif
 #ifdef VK_KHR_pipeline_executable_properties
 void reservedunmarshal_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkPipelineInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkPipelineInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkPipelineInfoKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineExecutablePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineExecutablePropertiesKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineExecutablePropertiesKHR* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkPipelineExecutableInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineExecutableInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkPipelineExecutableInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkPipelineExecutableInfoKHR* forUnmarshaling,
+                                                   uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineExecutableStatisticValueKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineExecutableStatisticValueKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineExecutableStatisticValueKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineExecutableStatisticKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineExecutableStatisticKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineExecutableStatisticKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineExecutableInternalRepresentationKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineExecutableInternalRepresentationKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineExecutableInternalRepresentationKHR* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_shader_integer_dot_product
 void reservedunmarshal_VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_pipeline_library
 void reservedunmarshal_VkPipelineLibraryCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineLibraryCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineLibraryCreateInfoKHR* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_shader_non_semantic_info
 #endif
 #ifdef VK_KHR_present_id
-void reservedunmarshal_VkPresentIdKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPresentIdKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkPresentIdKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                      VkPresentIdKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDevicePresentIdFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePresentIdFeaturesKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePresentIdFeaturesKHR* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_video_encode_queue
-void reservedunmarshal_VkVideoEncodeInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkVideoEncodeInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkVideoEncodeInfoKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkVideoEncodeRateControlInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeRateControlInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeRateControlInfoKHR* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_synchronization2
-void reservedunmarshal_VkMemoryBarrier2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryBarrier2KHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkMemoryBarrier2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkMemoryBarrier2KHR* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkBufferMemoryBarrier2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferMemoryBarrier2KHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkBufferMemoryBarrier2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkBufferMemoryBarrier2KHR* forUnmarshaling,
+                                                 uint8_t** ptr);
 
-void reservedunmarshal_VkImageMemoryBarrier2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageMemoryBarrier2KHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkImageMemoryBarrier2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkImageMemoryBarrier2KHR* forUnmarshaling,
+                                                uint8_t** ptr);
 
-void reservedunmarshal_VkDependencyInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDependencyInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDependencyInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkDependencyInfoKHR* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkSemaphoreSubmitInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSemaphoreSubmitInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkSemaphoreSubmitInfoKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkSemaphoreSubmitInfoKHR* forUnmarshaling,
+                                                uint8_t** ptr);
 
-void reservedunmarshal_VkCommandBufferSubmitInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCommandBufferSubmitInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkCommandBufferSubmitInfoKHR(VulkanStream* vkStream,
+                                                    VkStructureType rootType,
+                                                    VkCommandBufferSubmitInfoKHR* forUnmarshaling,
+                                                    uint8_t** ptr);
 
-void reservedunmarshal_VkSubmitInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubmitInfo2KHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkSubmitInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkSubmitInfo2KHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceSynchronization2FeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSynchronization2FeaturesKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceSynchronization2FeaturesKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkQueueFamilyCheckpointProperties2NV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkQueueFamilyCheckpointProperties2NV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkQueueFamilyCheckpointProperties2NV* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkCheckpointData2NV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCheckpointData2NV* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkCheckpointData2NV(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkCheckpointData2NV* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_shader_subgroup_uniform_control_flow
 void reservedunmarshal_VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_zero_initialize_workgroup_memory
 void reservedunmarshal_VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_workgroup_memory_explicit_layout
 void reservedunmarshal_VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_copy_commands2
-void reservedunmarshal_VkBufferCopy2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferCopy2KHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkBufferCopy2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkBufferCopy2KHR* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkCopyBufferInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCopyBufferInfo2KHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkCopyBufferInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkCopyBufferInfo2KHR* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkImageCopy2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageCopy2KHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkImageCopy2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkImageCopy2KHR* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkCopyImageInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCopyImageInfo2KHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkCopyImageInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkCopyImageInfo2KHR* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkBufferImageCopy2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferImageCopy2KHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkBufferImageCopy2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkBufferImageCopy2KHR* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkCopyBufferToImageInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCopyBufferToImageInfo2KHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkCopyBufferToImageInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkCopyBufferToImageInfo2KHR* forUnmarshaling,
+                                                   uint8_t** ptr);
 
-void reservedunmarshal_VkCopyImageToBufferInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCopyImageToBufferInfo2KHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkCopyImageToBufferInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkCopyImageToBufferInfo2KHR* forUnmarshaling,
+                                                   uint8_t** ptr);
 
-void reservedunmarshal_VkImageBlit2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageBlit2KHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkImageBlit2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                       VkImageBlit2KHR* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkBlitImageInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBlitImageInfo2KHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkBlitImageInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkBlitImageInfo2KHR* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkImageResolve2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageResolve2KHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkImageResolve2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkImageResolve2KHR* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkResolveImageInfo2KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkResolveImageInfo2KHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkResolveImageInfo2KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkResolveImageInfo2KHR* forUnmarshaling,
+                                              uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_format_feature_flags2
-void reservedunmarshal_VkFormatProperties3KHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFormatProperties3KHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkFormatProperties3KHR(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkFormatProperties3KHR* forUnmarshaling,
+                                              uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_maintenance4
 void reservedunmarshal_VkPhysicalDeviceMaintenance4FeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMaintenance4FeaturesKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMaintenance4FeaturesKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceMaintenance4PropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMaintenance4PropertiesKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMaintenance4PropertiesKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkDeviceBufferMemoryRequirementsKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceBufferMemoryRequirementsKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDeviceBufferMemoryRequirementsKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkDeviceImageMemoryRequirementsKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceImageMemoryRequirementsKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDeviceImageMemoryRequirementsKHR* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_ANDROID_native_buffer
-void reservedunmarshal_VkNativeBufferANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkNativeBufferANDROID* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkNativeBufferANDROID(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkNativeBufferANDROID* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_debug_report
 void reservedunmarshal_VkDebugReportCallbackCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDebugReportCallbackCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDebugReportCallbackCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_NV_glsl_shader
@@ -2676,10 +1963,8 @@
 #endif
 #ifdef VK_AMD_rasterization_order
 void reservedunmarshal_VkPipelineRasterizationStateRasterizationOrderAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineRasterizationStateRasterizationOrderAMD* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineRasterizationStateRasterizationOrderAMD* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_AMD_shader_trinary_minmax
@@ -2688,98 +1973,70 @@
 #endif
 #ifdef VK_EXT_debug_marker
 void reservedunmarshal_VkDebugMarkerObjectNameInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDebugMarkerObjectNameInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDebugMarkerObjectNameInfoEXT* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkDebugMarkerObjectTagInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDebugMarkerObjectTagInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDebugMarkerObjectTagInfoEXT(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkDebugMarkerObjectTagInfoEXT* forUnmarshaling,
+                                                     uint8_t** ptr);
 
-void reservedunmarshal_VkDebugMarkerMarkerInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDebugMarkerMarkerInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDebugMarkerMarkerInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                  VkDebugMarkerMarkerInfoEXT* forUnmarshaling,
+                                                  uint8_t** ptr);
 
 #endif
 #ifdef VK_AMD_gcn_shader
 #endif
 #ifdef VK_NV_dedicated_allocation
 void reservedunmarshal_VkDedicatedAllocationImageCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDedicatedAllocationImageCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDedicatedAllocationImageCreateInfoNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkDedicatedAllocationBufferCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDedicatedAllocationBufferCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDedicatedAllocationBufferCreateInfoNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkDedicatedAllocationMemoryAllocateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDedicatedAllocationMemoryAllocateInfoNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDedicatedAllocationMemoryAllocateInfoNV* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_transform_feedback
 void reservedunmarshal_VkPhysicalDeviceTransformFeedbackFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceTransformFeedbackFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceTransformFeedbackFeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceTransformFeedbackPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceTransformFeedbackPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceTransformFeedbackPropertiesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineRasterizationStateStreamCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineRasterizationStateStreamCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineRasterizationStateStreamCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_NVX_binary_import
-void reservedunmarshal_VkCuModuleCreateInfoNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCuModuleCreateInfoNVX* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkCuModuleCreateInfoNVX(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkCuModuleCreateInfoNVX* forUnmarshaling,
+                                               uint8_t** ptr);
 
-void reservedunmarshal_VkCuFunctionCreateInfoNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCuFunctionCreateInfoNVX* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkCuFunctionCreateInfoNVX(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkCuFunctionCreateInfoNVX* forUnmarshaling,
+                                                 uint8_t** ptr);
 
-void reservedunmarshal_VkCuLaunchInfoNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCuLaunchInfoNVX* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkCuLaunchInfoNVX(VulkanStream* vkStream, VkStructureType rootType,
+                                         VkCuLaunchInfoNVX* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_NVX_image_view_handle
-void reservedunmarshal_VkImageViewHandleInfoNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageViewHandleInfoNVX* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkImageViewHandleInfoNVX(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkImageViewHandleInfoNVX* forUnmarshaling,
+                                                uint8_t** ptr);
 
 void reservedunmarshal_VkImageViewAddressPropertiesNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageViewAddressPropertiesNVX* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImageViewAddressPropertiesNVX* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_AMD_draw_indirect_count
@@ -2792,272 +2049,194 @@
 #endif
 #ifdef VK_EXT_video_encode_h264
 void reservedunmarshal_VkVideoEncodeH264CapabilitiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH264CapabilitiesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH264CapabilitiesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkVideoEncodeH264SessionCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH264SessionCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH264SessionCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkVideoEncodeH264SessionParametersAddInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH264SessionParametersAddInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH264SessionParametersAddInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkVideoEncodeH264SessionParametersCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH264SessionParametersCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH264SessionParametersCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkVideoEncodeH264DpbSlotInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH264DpbSlotInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH264DpbSlotInfoEXT* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkVideoEncodeH264NaluSliceEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH264NaluSliceEXT* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkVideoEncodeH264NaluSliceEXT(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkVideoEncodeH264NaluSliceEXT* forUnmarshaling,
+                                                     uint8_t** ptr);
 
 void reservedunmarshal_VkVideoEncodeH264VclFrameInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH264VclFrameInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH264VclFrameInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkVideoEncodeH264EmitPictureParametersEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH264EmitPictureParametersEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH264EmitPictureParametersEXT* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkVideoEncodeH264ProfileEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH264ProfileEXT* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkVideoEncodeH264ProfileEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkVideoEncodeH264ProfileEXT* forUnmarshaling,
+                                                   uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_video_encode_h265
 void reservedunmarshal_VkVideoEncodeH265CapabilitiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH265CapabilitiesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH265CapabilitiesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkVideoEncodeH265SessionCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH265SessionCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH265SessionCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkVideoEncodeH265SessionParametersAddInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH265SessionParametersAddInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH265SessionParametersAddInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkVideoEncodeH265SessionParametersCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH265SessionParametersCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH265SessionParametersCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkVideoEncodeH265DpbSlotInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH265DpbSlotInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH265DpbSlotInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkVideoEncodeH265ReferenceListsEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH265ReferenceListsEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH265ReferenceListsEXT* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkVideoEncodeH265NaluSliceEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH265NaluSliceEXT* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkVideoEncodeH265NaluSliceEXT(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkVideoEncodeH265NaluSliceEXT* forUnmarshaling,
+                                                     uint8_t** ptr);
 
 void reservedunmarshal_VkVideoEncodeH265VclFrameInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH265VclFrameInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH265VclFrameInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkVideoEncodeH265EmitPictureParametersEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH265EmitPictureParametersEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoEncodeH265EmitPictureParametersEXT* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkVideoEncodeH265ProfileEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoEncodeH265ProfileEXT* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkVideoEncodeH265ProfileEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkVideoEncodeH265ProfileEXT* forUnmarshaling,
+                                                   uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_video_decode_h264
-void reservedunmarshal_VkVideoDecodeH264ProfileEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH264ProfileEXT* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkVideoDecodeH264ProfileEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkVideoDecodeH264ProfileEXT* forUnmarshaling,
+                                                   uint8_t** ptr);
 
 void reservedunmarshal_VkVideoDecodeH264CapabilitiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH264CapabilitiesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoDecodeH264CapabilitiesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkVideoDecodeH264SessionCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH264SessionCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoDecodeH264SessionCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkVideoDecodeH264SessionParametersAddInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH264SessionParametersAddInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoDecodeH264SessionParametersAddInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkVideoDecodeH264SessionParametersCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH264SessionParametersCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoDecodeH264SessionParametersCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkVideoDecodeH264PictureInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH264PictureInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoDecodeH264PictureInfoEXT* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkVideoDecodeH264MvcEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH264MvcEXT* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkVideoDecodeH264MvcEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkVideoDecodeH264MvcEXT* forUnmarshaling,
+                                               uint8_t** ptr);
 
 void reservedunmarshal_VkVideoDecodeH264DpbSlotInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH264DpbSlotInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoDecodeH264DpbSlotInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_AMD_texture_gather_bias_lod
 void reservedunmarshal_VkTextureLODGatherFormatPropertiesAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkTextureLODGatherFormatPropertiesAMD* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkTextureLODGatherFormatPropertiesAMD* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_AMD_shader_info
-void reservedunmarshal_VkShaderResourceUsageAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkShaderResourceUsageAMD* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkShaderResourceUsageAMD(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkShaderResourceUsageAMD* forUnmarshaling,
+                                                uint8_t** ptr);
 
-void reservedunmarshal_VkShaderStatisticsInfoAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkShaderStatisticsInfoAMD* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkShaderStatisticsInfoAMD(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkShaderStatisticsInfoAMD* forUnmarshaling,
+                                                 uint8_t** ptr);
 
 #endif
 #ifdef VK_AMD_shader_image_load_store_lod
 #endif
 #ifdef VK_GGP_stream_descriptor_surface
 void reservedunmarshal_VkStreamDescriptorSurfaceCreateInfoGGP(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkStreamDescriptorSurfaceCreateInfoGGP* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkStreamDescriptorSurfaceCreateInfoGGP* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_NV_corner_sampled_image
 void reservedunmarshal_VkPhysicalDeviceCornerSampledImageFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceCornerSampledImageFeaturesNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceCornerSampledImageFeaturesNV* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_IMG_format_pvrtc
 #endif
 #ifdef VK_NV_external_memory_capabilities
 void reservedunmarshal_VkExternalImageFormatPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalImageFormatPropertiesNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkExternalImageFormatPropertiesNV* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_NV_external_memory
 void reservedunmarshal_VkExternalMemoryImageCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalMemoryImageCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkExternalMemoryImageCreateInfoNV* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkExportMemoryAllocateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExportMemoryAllocateInfoNV* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkExportMemoryAllocateInfoNV(VulkanStream* vkStream,
+                                                    VkStructureType rootType,
+                                                    VkExportMemoryAllocateInfoNV* forUnmarshaling,
+                                                    uint8_t** ptr);
 
 #endif
 #ifdef VK_NV_external_memory_win32
 void reservedunmarshal_VkImportMemoryWin32HandleInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportMemoryWin32HandleInfoNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImportMemoryWin32HandleInfoNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkExportMemoryWin32HandleInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExportMemoryWin32HandleInfoNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkExportMemoryWin32HandleInfoNV* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_NV_win32_keyed_mutex
 void reservedunmarshal_VkWin32KeyedMutexAcquireReleaseInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkWin32KeyedMutexAcquireReleaseInfoNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkWin32KeyedMutexAcquireReleaseInfoNV* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_validation_flags
-void reservedunmarshal_VkValidationFlagsEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkValidationFlagsEXT* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkValidationFlagsEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkValidationFlagsEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_NN_vi_surface
-void reservedunmarshal_VkViSurfaceCreateInfoNN(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkViSurfaceCreateInfoNN* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkViSurfaceCreateInfoNN(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkViSurfaceCreateInfoNN* forUnmarshaling,
+                                               uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_shader_subgroup_ballot
@@ -3066,58 +2245,42 @@
 #endif
 #ifdef VK_EXT_texture_compression_astc_hdr
 void reservedunmarshal_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_astc_decode_mode
-void reservedunmarshal_VkImageViewASTCDecodeModeEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageViewASTCDecodeModeEXT* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkImageViewASTCDecodeModeEXT(VulkanStream* vkStream,
+                                                    VkStructureType rootType,
+                                                    VkImageViewASTCDecodeModeEXT* forUnmarshaling,
+                                                    uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceASTCDecodeFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceASTCDecodeFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceASTCDecodeFeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_conditional_rendering
 void reservedunmarshal_VkConditionalRenderingBeginInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkConditionalRenderingBeginInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkConditionalRenderingBeginInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceConditionalRenderingFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceConditionalRenderingFeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCommandBufferInheritanceConditionalRenderingInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkCommandBufferInheritanceConditionalRenderingInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_NV_clip_space_w_scaling
-void reservedunmarshal_VkViewportWScalingNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkViewportWScalingNV* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkViewportWScalingNV(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkViewportWScalingNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineViewportWScalingStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineViewportWScalingStateCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineViewportWScalingStateCreateInfoNV* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_direct_mode_display
@@ -3125,63 +2288,42 @@
 #ifdef VK_EXT_acquire_xlib_display
 #endif
 #ifdef VK_EXT_display_surface_counter
-void reservedunmarshal_VkSurfaceCapabilities2EXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSurfaceCapabilities2EXT* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkSurfaceCapabilities2EXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkSurfaceCapabilities2EXT* forUnmarshaling,
+                                                 uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_display_control
-void reservedunmarshal_VkDisplayPowerInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayPowerInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDisplayPowerInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkDisplayPowerInfoEXT* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkDeviceEventInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceEventInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDeviceEventInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkDeviceEventInfoEXT* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkDisplayEventInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayEventInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDisplayEventInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkDisplayEventInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkSwapchainCounterCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSwapchainCounterCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSwapchainCounterCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_GOOGLE_display_timing
-void reservedunmarshal_VkRefreshCycleDurationGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRefreshCycleDurationGOOGLE* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkRefreshCycleDurationGOOGLE(VulkanStream* vkStream,
+                                                    VkStructureType rootType,
+                                                    VkRefreshCycleDurationGOOGLE* forUnmarshaling,
+                                                    uint8_t** ptr);
 
 void reservedunmarshal_VkPastPresentationTimingGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPastPresentationTimingGOOGLE* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPastPresentationTimingGOOGLE* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkPresentTimeGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPresentTimeGOOGLE* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkPresentTimeGOOGLE(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkPresentTimeGOOGLE* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkPresentTimesInfoGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPresentTimesInfoGOOGLE* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkPresentTimesInfoGOOGLE(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkPresentTimesInfoGOOGLE* forUnmarshaling,
+                                                uint8_t** ptr);
 
 #endif
 #ifdef VK_NV_sample_mask_override_coverage
@@ -3192,98 +2334,69 @@
 #endif
 #ifdef VK_NVX_multiview_per_view_attributes
 void reservedunmarshal_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_NV_viewport_swizzle
-void reservedunmarshal_VkViewportSwizzleNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkViewportSwizzleNV* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkViewportSwizzleNV(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkViewportSwizzleNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineViewportSwizzleStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineViewportSwizzleStateCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineViewportSwizzleStateCreateInfoNV* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_discard_rectangles
 void reservedunmarshal_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDiscardRectanglePropertiesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceDiscardRectanglePropertiesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineDiscardRectangleStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineDiscardRectangleStateCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineDiscardRectangleStateCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_conservative_rasterization
 void reservedunmarshal_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceConservativeRasterizationPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceConservativeRasterizationPropertiesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineRasterizationConservativeStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineRasterizationConservativeStateCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineRasterizationConservativeStateCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_depth_clip_enable
 void reservedunmarshal_VkPhysicalDeviceDepthClipEnableFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDepthClipEnableFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceDepthClipEnableFeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineRasterizationDepthClipStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineRasterizationDepthClipStateCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineRasterizationDepthClipStateCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_swapchain_colorspace
 #endif
 #ifdef VK_EXT_hdr_metadata
-void reservedunmarshal_VkXYColorEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkXYColorEXT* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkXYColorEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkXYColorEXT* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkHdrMetadataEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkHdrMetadataEXT* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkHdrMetadataEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkHdrMetadataEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_MVK_ios_surface
-void reservedunmarshal_VkIOSSurfaceCreateInfoMVK(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkIOSSurfaceCreateInfoMVK* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkIOSSurfaceCreateInfoMVK(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkIOSSurfaceCreateInfoMVK* forUnmarshaling,
+                                                 uint8_t** ptr);
 
 #endif
 #ifdef VK_MVK_macos_surface
-void reservedunmarshal_VkMacOSSurfaceCreateInfoMVK(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMacOSSurfaceCreateInfoMVK* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkMacOSSurfaceCreateInfoMVK(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkMacOSSurfaceCreateInfoMVK* forUnmarshaling,
+                                                   uint8_t** ptr);
 
 #endif
 #ifdef VK_MVK_moltenvk
@@ -3293,85 +2406,64 @@
 #ifdef VK_EXT_queue_family_foreign
 #endif
 #ifdef VK_EXT_debug_utils
-void reservedunmarshal_VkDebugUtilsLabelEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDebugUtilsLabelEXT* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDebugUtilsLabelEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkDebugUtilsLabelEXT* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkDebugUtilsObjectNameInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDebugUtilsObjectNameInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDebugUtilsObjectNameInfoEXT(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkDebugUtilsObjectNameInfoEXT* forUnmarshaling,
+                                                     uint8_t** ptr);
 
 void reservedunmarshal_VkDebugUtilsMessengerCallbackDataEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDebugUtilsMessengerCallbackDataEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDebugUtilsMessengerCallbackDataEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkDebugUtilsMessengerCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDebugUtilsMessengerCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDebugUtilsMessengerCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkDebugUtilsObjectTagInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDebugUtilsObjectTagInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDebugUtilsObjectTagInfoEXT(VulkanStream* vkStream,
+                                                    VkStructureType rootType,
+                                                    VkDebugUtilsObjectTagInfoEXT* forUnmarshaling,
+                                                    uint8_t** ptr);
 
 #endif
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
 void reservedunmarshal_VkAndroidHardwareBufferUsageANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAndroidHardwareBufferUsageANDROID* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAndroidHardwareBufferUsageANDROID* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkAndroidHardwareBufferPropertiesANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAndroidHardwareBufferPropertiesANDROID* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAndroidHardwareBufferPropertiesANDROID* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkAndroidHardwareBufferFormatPropertiesANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAndroidHardwareBufferFormatPropertiesANDROID* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAndroidHardwareBufferFormatPropertiesANDROID* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkImportAndroidHardwareBufferInfoANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportAndroidHardwareBufferInfoANDROID* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImportAndroidHardwareBufferInfoANDROID* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkMemoryGetAndroidHardwareBufferInfoANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryGetAndroidHardwareBufferInfoANDROID* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkMemoryGetAndroidHardwareBufferInfoANDROID* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkExternalFormatANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkExternalFormatANDROID* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkExternalFormatANDROID(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkExternalFormatANDROID* forUnmarshaling,
+                                               uint8_t** ptr);
 
 void reservedunmarshal_VkAndroidHardwareBufferFormatProperties2ANDROID(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAndroidHardwareBufferFormatProperties2ANDROID* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAndroidHardwareBufferFormatProperties2ANDROID* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_sampler_filter_minmax
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkSamplerReductionModeCreateInfo, reservedunmarshal_VkSamplerReductionModeCreateInfoEXT)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkSamplerReductionModeCreateInfo,
+                      reservedunmarshal_VkSamplerReductionModeCreateInfoEXT)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceSamplerFilterMinmaxProperties, reservedunmarshal_VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceSamplerFilterMinmaxProperties,
+                      reservedunmarshal_VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT)
 
 #endif
 #ifdef VK_AMD_gpu_shader_int16
@@ -3382,734 +2474,530 @@
 #endif
 #ifdef VK_EXT_inline_uniform_block
 void reservedunmarshal_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceInlineUniformBlockFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceInlineUniformBlockFeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceInlineUniformBlockPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceInlineUniformBlockPropertiesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkWriteDescriptorSetInlineUniformBlockEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkWriteDescriptorSetInlineUniformBlockEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkWriteDescriptorSetInlineUniformBlockEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDescriptorPoolInlineUniformBlockCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDescriptorPoolInlineUniformBlockCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_shader_stencil_export
 #endif
 #ifdef VK_EXT_sample_locations
-void reservedunmarshal_VkSampleLocationEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSampleLocationEXT* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkSampleLocationEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                           VkSampleLocationEXT* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkSampleLocationsInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSampleLocationsInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkSampleLocationsInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkSampleLocationsInfoEXT* forUnmarshaling,
+                                                uint8_t** ptr);
 
 void reservedunmarshal_VkAttachmentSampleLocationsEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAttachmentSampleLocationsEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAttachmentSampleLocationsEXT* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkSubpassSampleLocationsEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubpassSampleLocationsEXT* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkSubpassSampleLocationsEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkSubpassSampleLocationsEXT* forUnmarshaling,
+                                                   uint8_t** ptr);
 
 void reservedunmarshal_VkRenderPassSampleLocationsBeginInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderPassSampleLocationsBeginInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkRenderPassSampleLocationsBeginInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineSampleLocationsStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineSampleLocationsStateCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineSampleLocationsStateCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceSampleLocationsPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSampleLocationsPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceSampleLocationsPropertiesEXT* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkMultisamplePropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMultisamplePropertiesEXT* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkMultisamplePropertiesEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                  VkMultisamplePropertiesEXT* forUnmarshaling,
+                                                  uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_blend_operation_advanced
 void reservedunmarshal_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineColorBlendAdvancedStateCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineColorBlendAdvancedStateCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_NV_fragment_coverage_to_color
 void reservedunmarshal_VkPipelineCoverageToColorStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineCoverageToColorStateCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineCoverageToColorStateCreateInfoNV* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_NV_framebuffer_mixed_samples
 void reservedunmarshal_VkPipelineCoverageModulationStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineCoverageModulationStateCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineCoverageModulationStateCreateInfoNV* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_NV_fill_rectangle
 #endif
 #ifdef VK_NV_shader_sm_builtins
 void reservedunmarshal_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_post_depth_coverage
 #endif
 #ifdef VK_EXT_image_drm_format_modifier
 void reservedunmarshal_VkDrmFormatModifierPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDrmFormatModifierPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDrmFormatModifierPropertiesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkDrmFormatModifierPropertiesListEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDrmFormatModifierPropertiesListEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDrmFormatModifierPropertiesListEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceImageDrmFormatModifierInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceImageDrmFormatModifierInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkImageDrmFormatModifierListCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageDrmFormatModifierListCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImageDrmFormatModifierListCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkImageDrmFormatModifierExplicitCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageDrmFormatModifierExplicitCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImageDrmFormatModifierExplicitCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkImageDrmFormatModifierPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageDrmFormatModifierPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImageDrmFormatModifierPropertiesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkDrmFormatModifierProperties2EXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDrmFormatModifierProperties2EXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDrmFormatModifierProperties2EXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkDrmFormatModifierPropertiesList2EXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDrmFormatModifierPropertiesList2EXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDrmFormatModifierPropertiesList2EXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_validation_cache
 void reservedunmarshal_VkValidationCacheCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkValidationCacheCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkValidationCacheCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkShaderModuleValidationCacheCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkShaderModuleValidationCacheCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkShaderModuleValidationCacheCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_descriptor_indexing
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkDescriptorSetLayoutBindingFlagsCreateInfo, reservedunmarshal_VkDescriptorSetLayoutBindingFlagsCreateInfoEXT)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkDescriptorSetLayoutBindingFlagsCreateInfo,
+                      reservedunmarshal_VkDescriptorSetLayoutBindingFlagsCreateInfoEXT)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceDescriptorIndexingFeatures, reservedunmarshal_VkPhysicalDeviceDescriptorIndexingFeaturesEXT)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceDescriptorIndexingFeatures,
+                      reservedunmarshal_VkPhysicalDeviceDescriptorIndexingFeaturesEXT)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceDescriptorIndexingProperties, reservedunmarshal_VkPhysicalDeviceDescriptorIndexingPropertiesEXT)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceDescriptorIndexingProperties,
+                      reservedunmarshal_VkPhysicalDeviceDescriptorIndexingPropertiesEXT)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkDescriptorSetVariableDescriptorCountAllocateInfo, reservedunmarshal_VkDescriptorSetVariableDescriptorCountAllocateInfoEXT)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkDescriptorSetVariableDescriptorCountAllocateInfo,
+                      reservedunmarshal_VkDescriptorSetVariableDescriptorCountAllocateInfoEXT)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkDescriptorSetVariableDescriptorCountLayoutSupport, reservedunmarshal_VkDescriptorSetVariableDescriptorCountLayoutSupportEXT)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkDescriptorSetVariableDescriptorCountLayoutSupport,
+                      reservedunmarshal_VkDescriptorSetVariableDescriptorCountLayoutSupportEXT)
 
 #endif
 #ifdef VK_EXT_shader_viewport_index_layer
 #endif
 #ifdef VK_NV_shading_rate_image
-void reservedunmarshal_VkShadingRatePaletteNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkShadingRatePaletteNV* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkShadingRatePaletteNV(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkShadingRatePaletteNV* forUnmarshaling,
+                                              uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineViewportShadingRateImageStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineViewportShadingRateImageStateCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineViewportShadingRateImageStateCreateInfoNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceShadingRateImageFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShadingRateImageFeaturesNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShadingRateImageFeaturesNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceShadingRateImagePropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShadingRateImagePropertiesNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShadingRateImagePropertiesNV* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkCoarseSampleLocationNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCoarseSampleLocationNV* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkCoarseSampleLocationNV(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkCoarseSampleLocationNV* forUnmarshaling,
+                                                uint8_t** ptr);
 
-void reservedunmarshal_VkCoarseSampleOrderCustomNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCoarseSampleOrderCustomNV* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkCoarseSampleOrderCustomNV(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkCoarseSampleOrderCustomNV* forUnmarshaling,
+                                                   uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_NV_ray_tracing
 void reservedunmarshal_VkRayTracingShaderGroupCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRayTracingShaderGroupCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkRayTracingShaderGroupCreateInfoNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkRayTracingPipelineCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRayTracingPipelineCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkRayTracingPipelineCreateInfoNV* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkGeometryTrianglesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkGeometryTrianglesNV* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkGeometryTrianglesNV(VulkanStream* vkStream, VkStructureType rootType,
+                                             VkGeometryTrianglesNV* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkGeometryAABBNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkGeometryAABBNV* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkGeometryAABBNV(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkGeometryAABBNV* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkGeometryDataNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkGeometryDataNV* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkGeometryDataNV(VulkanStream* vkStream, VkStructureType rootType,
+                                        VkGeometryDataNV* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkGeometryNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkGeometryNV* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkGeometryNV(VulkanStream* vkStream, VkStructureType rootType,
+                                    VkGeometryNV* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkAccelerationStructureInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureInfoNV* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkAccelerationStructureInfoNV(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkAccelerationStructureInfoNV* forUnmarshaling,
+                                                     uint8_t** ptr);
 
 void reservedunmarshal_VkAccelerationStructureCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureCreateInfoNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkBindAccelerationStructureMemoryInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindAccelerationStructureMemoryInfoNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBindAccelerationStructureMemoryInfoNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkWriteDescriptorSetAccelerationStructureNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkWriteDescriptorSetAccelerationStructureNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkWriteDescriptorSetAccelerationStructureNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkAccelerationStructureMemoryRequirementsInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureMemoryRequirementsInfoNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureMemoryRequirementsInfoNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceRayTracingPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceRayTracingPropertiesNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceRayTracingPropertiesNV* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkTransformMatrixKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkTransformMatrixKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkTransformMatrixKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkTransformMatrixKHR* forUnmarshaling, uint8_t** ptr);
 
 DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkTransformMatrixKHR, reservedunmarshal_VkTransformMatrixNV)
 
-void reservedunmarshal_VkAabbPositionsKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAabbPositionsKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkAabbPositionsKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkAabbPositionsKHR* forUnmarshaling, uint8_t** ptr);
 
 DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkAabbPositionsKHR, reservedunmarshal_VkAabbPositionsNV)
 
 void reservedunmarshal_VkAccelerationStructureInstanceKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureInstanceKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureInstanceKHR* forUnmarshaling, uint8_t** ptr);
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkAccelerationStructureInstanceKHR, reservedunmarshal_VkAccelerationStructureInstanceNV)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkAccelerationStructureInstanceKHR,
+                      reservedunmarshal_VkAccelerationStructureInstanceNV)
 
 #endif
 #ifdef VK_NV_representative_fragment_test
 void reservedunmarshal_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineRepresentativeFragmentTestStateCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineRepresentativeFragmentTestStateCreateInfoNV* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_filter_cubic
 void reservedunmarshal_VkPhysicalDeviceImageViewImageFormatInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceImageViewImageFormatInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceImageViewImageFormatInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkFilterCubicImageViewImageFormatPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFilterCubicImageViewImageFormatPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkFilterCubicImageViewImageFormatPropertiesEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_QCOM_render_pass_shader_resolve
 #endif
 #ifdef VK_EXT_global_priority
 void reservedunmarshal_VkDeviceQueueGlobalPriorityCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceQueueGlobalPriorityCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDeviceQueueGlobalPriorityCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_external_memory_host
 void reservedunmarshal_VkImportMemoryHostPointerInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportMemoryHostPointerInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImportMemoryHostPointerInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkMemoryHostPointerPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryHostPointerPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkMemoryHostPointerPropertiesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceExternalMemoryHostPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceExternalMemoryHostPropertiesEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_AMD_buffer_marker
 #endif
 #ifdef VK_AMD_pipeline_compiler_control
 void reservedunmarshal_VkPipelineCompilerControlCreateInfoAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineCompilerControlCreateInfoAMD* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineCompilerControlCreateInfoAMD* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_calibrated_timestamps
-void reservedunmarshal_VkCalibratedTimestampInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCalibratedTimestampInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkCalibratedTimestampInfoEXT(VulkanStream* vkStream,
+                                                    VkStructureType rootType,
+                                                    VkCalibratedTimestampInfoEXT* forUnmarshaling,
+                                                    uint8_t** ptr);
 
 #endif
 #ifdef VK_AMD_shader_core_properties
 void reservedunmarshal_VkPhysicalDeviceShaderCorePropertiesAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderCorePropertiesAMD* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderCorePropertiesAMD* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_video_decode_h265
-void reservedunmarshal_VkVideoDecodeH265ProfileEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH265ProfileEXT* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkVideoDecodeH265ProfileEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkVideoDecodeH265ProfileEXT* forUnmarshaling,
+                                                   uint8_t** ptr);
 
 void reservedunmarshal_VkVideoDecodeH265CapabilitiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH265CapabilitiesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoDecodeH265CapabilitiesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkVideoDecodeH265SessionCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH265SessionCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoDecodeH265SessionCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkVideoDecodeH265SessionParametersAddInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH265SessionParametersAddInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoDecodeH265SessionParametersAddInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkVideoDecodeH265SessionParametersCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH265SessionParametersCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoDecodeH265SessionParametersCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkVideoDecodeH265PictureInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH265PictureInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoDecodeH265PictureInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkVideoDecodeH265DpbSlotInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVideoDecodeH265DpbSlotInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVideoDecodeH265DpbSlotInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_AMD_memory_overallocation_behavior
 void reservedunmarshal_VkDeviceMemoryOverallocationCreateInfoAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceMemoryOverallocationCreateInfoAMD* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDeviceMemoryOverallocationCreateInfoAMD* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_vertex_attribute_divisor
 void reservedunmarshal_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkVertexInputBindingDivisorDescriptionEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVertexInputBindingDivisorDescriptionEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVertexInputBindingDivisorDescriptionEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineVertexInputDivisorStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineVertexInputDivisorStateCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineVertexInputDivisorStateCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_GGP_frame_token
-void reservedunmarshal_VkPresentFrameTokenGGP(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPresentFrameTokenGGP* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkPresentFrameTokenGGP(VulkanStream* vkStream, VkStructureType rootType,
+                                              VkPresentFrameTokenGGP* forUnmarshaling,
+                                              uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_pipeline_creation_feedback
-void reservedunmarshal_VkPipelineCreationFeedbackEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineCreationFeedbackEXT* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkPipelineCreationFeedbackEXT(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkPipelineCreationFeedbackEXT* forUnmarshaling,
+                                                     uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineCreationFeedbackCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineCreationFeedbackCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineCreationFeedbackCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_NV_shader_subgroup_partitioned
 #endif
 #ifdef VK_NV_compute_shader_derivatives
 void reservedunmarshal_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_NV_mesh_shader
 void reservedunmarshal_VkPhysicalDeviceMeshShaderFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMeshShaderFeaturesNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMeshShaderFeaturesNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceMeshShaderPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMeshShaderPropertiesNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMeshShaderPropertiesNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkDrawMeshTasksIndirectCommandNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDrawMeshTasksIndirectCommandNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDrawMeshTasksIndirectCommandNV* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_NV_fragment_shader_barycentric
 void reservedunmarshal_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_NV_shader_image_footprint
 void reservedunmarshal_VkPhysicalDeviceShaderImageFootprintFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderImageFootprintFeaturesNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderImageFootprintFeaturesNV* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_NV_scissor_exclusive
 void reservedunmarshal_VkPipelineViewportExclusiveScissorStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineViewportExclusiveScissorStateCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineViewportExclusiveScissorStateCreateInfoNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceExclusiveScissorFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceExclusiveScissorFeaturesNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceExclusiveScissorFeaturesNV* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
 void reservedunmarshal_VkQueueFamilyCheckpointPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkQueueFamilyCheckpointPropertiesNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkQueueFamilyCheckpointPropertiesNV* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkCheckpointDataNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCheckpointDataNV* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkCheckpointDataNV(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkCheckpointDataNV* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_INTEL_shader_integer_functions2
 void reservedunmarshal_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_INTEL_performance_query
-void reservedunmarshal_VkPerformanceValueDataINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPerformanceValueDataINTEL* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkPerformanceValueDataINTEL(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkPerformanceValueDataINTEL* forUnmarshaling,
+                                                   uint8_t** ptr);
 
-void reservedunmarshal_VkPerformanceValueINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPerformanceValueINTEL* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkPerformanceValueINTEL(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkPerformanceValueINTEL* forUnmarshaling,
+                                               uint8_t** ptr);
 
 void reservedunmarshal_VkInitializePerformanceApiInfoINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkInitializePerformanceApiInfoINTEL* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkInitializePerformanceApiInfoINTEL* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkQueryPoolPerformanceQueryCreateInfoINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkQueryPoolPerformanceQueryCreateInfoINTEL* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkQueryPoolPerformanceQueryCreateInfoINTEL* forUnmarshaling, uint8_t** ptr);
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkQueryPoolPerformanceQueryCreateInfoINTEL, reservedunmarshal_VkQueryPoolCreateInfoINTEL)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkQueryPoolPerformanceQueryCreateInfoINTEL,
+                      reservedunmarshal_VkQueryPoolCreateInfoINTEL)
 
-void reservedunmarshal_VkPerformanceMarkerInfoINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPerformanceMarkerInfoINTEL* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkPerformanceMarkerInfoINTEL(VulkanStream* vkStream,
+                                                    VkStructureType rootType,
+                                                    VkPerformanceMarkerInfoINTEL* forUnmarshaling,
+                                                    uint8_t** ptr);
 
 void reservedunmarshal_VkPerformanceStreamMarkerInfoINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPerformanceStreamMarkerInfoINTEL* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPerformanceStreamMarkerInfoINTEL* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPerformanceOverrideInfoINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPerformanceOverrideInfoINTEL* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPerformanceOverrideInfoINTEL* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPerformanceConfigurationAcquireInfoINTEL(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPerformanceConfigurationAcquireInfoINTEL* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPerformanceConfigurationAcquireInfoINTEL* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_pci_bus_info
 void reservedunmarshal_VkPhysicalDevicePCIBusInfoPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePCIBusInfoPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePCIBusInfoPropertiesEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_AMD_display_native_hdr
 void reservedunmarshal_VkDisplayNativeHdrSurfaceCapabilitiesAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDisplayNativeHdrSurfaceCapabilitiesAMD* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDisplayNativeHdrSurfaceCapabilitiesAMD* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkSwapchainDisplayNativeHdrCreateInfoAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSwapchainDisplayNativeHdrCreateInfoAMD* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSwapchainDisplayNativeHdrCreateInfoAMD* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_FUCHSIA_imagepipe_surface
 void reservedunmarshal_VkImagePipeSurfaceCreateInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImagePipeSurfaceCreateInfoFUCHSIA* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImagePipeSurfaceCreateInfoFUCHSIA* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_metal_surface
-void reservedunmarshal_VkMetalSurfaceCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMetalSurfaceCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkMetalSurfaceCreateInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                   VkMetalSurfaceCreateInfoEXT* forUnmarshaling,
+                                                   uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_fragment_density_map
 void reservedunmarshal_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFragmentDensityMapFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceFragmentDensityMapFeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFragmentDensityMapPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceFragmentDensityMapPropertiesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkRenderPassFragmentDensityMapCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderPassFragmentDensityMapCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkRenderPassFragmentDensityMapCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_scalar_block_layout
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceScalarBlockLayoutFeatures, reservedunmarshal_VkPhysicalDeviceScalarBlockLayoutFeaturesEXT)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceScalarBlockLayoutFeatures,
+                      reservedunmarshal_VkPhysicalDeviceScalarBlockLayoutFeaturesEXT)
 
 #endif
 #ifdef VK_GOOGLE_hlsl_functionality1
@@ -4118,1117 +3006,801 @@
 #endif
 #ifdef VK_EXT_subgroup_size_control
 void reservedunmarshal_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_AMD_shader_core_properties2
 void reservedunmarshal_VkPhysicalDeviceShaderCoreProperties2AMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderCoreProperties2AMD* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderCoreProperties2AMD* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_AMD_device_coherent_memory
 void reservedunmarshal_VkPhysicalDeviceCoherentMemoryFeaturesAMD(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceCoherentMemoryFeaturesAMD* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceCoherentMemoryFeaturesAMD* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_shader_image_atomic_int64
 void reservedunmarshal_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_memory_budget
 void reservedunmarshal_VkPhysicalDeviceMemoryBudgetPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMemoryBudgetPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMemoryBudgetPropertiesEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_memory_priority
 void reservedunmarshal_VkPhysicalDeviceMemoryPriorityFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMemoryPriorityFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMemoryPriorityFeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkMemoryPriorityAllocateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryPriorityAllocateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkMemoryPriorityAllocateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_NV_dedicated_allocation_image_aliasing
 void reservedunmarshal_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_buffer_device_address
 void reservedunmarshal_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT, reservedunmarshal_VkPhysicalDeviceBufferAddressFeaturesEXT)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT,
+                      reservedunmarshal_VkPhysicalDeviceBufferAddressFeaturesEXT)
 
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkBufferDeviceAddressInfo, reservedunmarshal_VkBufferDeviceAddressInfoEXT)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkBufferDeviceAddressInfo,
+                      reservedunmarshal_VkBufferDeviceAddressInfoEXT)
 
 void reservedunmarshal_VkBufferDeviceAddressCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferDeviceAddressCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBufferDeviceAddressCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_tooling_info
 void reservedunmarshal_VkPhysicalDeviceToolPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceToolPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceToolPropertiesEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_separate_stencil_usage
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkImageStencilUsageCreateInfo, reservedunmarshal_VkImageStencilUsageCreateInfoEXT)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkImageStencilUsageCreateInfo,
+                      reservedunmarshal_VkImageStencilUsageCreateInfoEXT)
 
 #endif
 #ifdef VK_EXT_validation_features
-void reservedunmarshal_VkValidationFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkValidationFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkValidationFeaturesEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                               VkValidationFeaturesEXT* forUnmarshaling,
+                                               uint8_t** ptr);
 
 #endif
 #ifdef VK_NV_cooperative_matrix
 void reservedunmarshal_VkCooperativeMatrixPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCooperativeMatrixPropertiesNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkCooperativeMatrixPropertiesNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceCooperativeMatrixFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceCooperativeMatrixFeaturesNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceCooperativeMatrixFeaturesNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceCooperativeMatrixPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceCooperativeMatrixPropertiesNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceCooperativeMatrixPropertiesNV* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_NV_coverage_reduction_mode
 void reservedunmarshal_VkPhysicalDeviceCoverageReductionModeFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceCoverageReductionModeFeaturesNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceCoverageReductionModeFeaturesNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineCoverageReductionStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineCoverageReductionStateCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineCoverageReductionStateCreateInfoNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkFramebufferMixedSamplesCombinationNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkFramebufferMixedSamplesCombinationNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkFramebufferMixedSamplesCombinationNV* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_fragment_shader_interlock
 void reservedunmarshal_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_ycbcr_image_arrays
 void reservedunmarshal_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_provoking_vertex
 void reservedunmarshal_VkPhysicalDeviceProvokingVertexFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceProvokingVertexFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceProvokingVertexFeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceProvokingVertexPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceProvokingVertexPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceProvokingVertexPropertiesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineRasterizationProvokingVertexStateCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineRasterizationProvokingVertexStateCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_full_screen_exclusive
 void reservedunmarshal_VkSurfaceFullScreenExclusiveInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSurfaceFullScreenExclusiveInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSurfaceFullScreenExclusiveInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkSurfaceCapabilitiesFullScreenExclusiveEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSurfaceCapabilitiesFullScreenExclusiveEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSurfaceCapabilitiesFullScreenExclusiveEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkSurfaceFullScreenExclusiveWin32InfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSurfaceFullScreenExclusiveWin32InfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSurfaceFullScreenExclusiveWin32InfoEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_headless_surface
 void reservedunmarshal_VkHeadlessSurfaceCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkHeadlessSurfaceCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkHeadlessSurfaceCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_line_rasterization
 void reservedunmarshal_VkPhysicalDeviceLineRasterizationFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceLineRasterizationFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceLineRasterizationFeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceLineRasterizationPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceLineRasterizationPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceLineRasterizationPropertiesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineRasterizationLineStateCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineRasterizationLineStateCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineRasterizationLineStateCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_shader_atomic_float
 void reservedunmarshal_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_host_query_reset
-DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceHostQueryResetFeatures, reservedunmarshal_VkPhysicalDeviceHostQueryResetFeaturesEXT)
+DEFINE_ALIAS_FUNCTION(reservedunmarshal_VkPhysicalDeviceHostQueryResetFeatures,
+                      reservedunmarshal_VkPhysicalDeviceHostQueryResetFeaturesEXT)
 
 #endif
 #ifdef VK_EXT_index_type_uint8
 void reservedunmarshal_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceIndexTypeUint8FeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceIndexTypeUint8FeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_extended_dynamic_state
 void reservedunmarshal_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_shader_atomic_float2
 void reservedunmarshal_VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
 void reservedunmarshal_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_NV_device_generated_commands
 void reservedunmarshal_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkGraphicsShaderGroupCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkGraphicsShaderGroupCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkGraphicsShaderGroupCreateInfoNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkGraphicsPipelineShaderGroupsCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkGraphicsPipelineShaderGroupsCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkGraphicsPipelineShaderGroupsCreateInfoNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkBindShaderGroupIndirectCommandNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindShaderGroupIndirectCommandNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBindShaderGroupIndirectCommandNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkBindIndexBufferIndirectCommandNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindIndexBufferIndirectCommandNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBindIndexBufferIndirectCommandNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkBindVertexBufferIndirectCommandNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBindVertexBufferIndirectCommandNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBindVertexBufferIndirectCommandNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkSetStateFlagsIndirectCommandNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSetStateFlagsIndirectCommandNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSetStateFlagsIndirectCommandNV* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkIndirectCommandsStreamNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkIndirectCommandsStreamNV* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkIndirectCommandsStreamNV(VulkanStream* vkStream, VkStructureType rootType,
+                                                  VkIndirectCommandsStreamNV* forUnmarshaling,
+                                                  uint8_t** ptr);
 
 void reservedunmarshal_VkIndirectCommandsLayoutTokenNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkIndirectCommandsLayoutTokenNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkIndirectCommandsLayoutTokenNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkIndirectCommandsLayoutCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkIndirectCommandsLayoutCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkIndirectCommandsLayoutCreateInfoNV* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkGeneratedCommandsInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkGeneratedCommandsInfoNV* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkGeneratedCommandsInfoNV(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkGeneratedCommandsInfoNV* forUnmarshaling,
+                                                 uint8_t** ptr);
 
 void reservedunmarshal_VkGeneratedCommandsMemoryRequirementsInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkGeneratedCommandsMemoryRequirementsInfoNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkGeneratedCommandsMemoryRequirementsInfoNV* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_NV_inherited_viewport_scissor
 void reservedunmarshal_VkPhysicalDeviceInheritedViewportScissorFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceInheritedViewportScissorFeaturesNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceInheritedViewportScissorFeaturesNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkCommandBufferInheritanceViewportScissorInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCommandBufferInheritanceViewportScissorInfoNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkCommandBufferInheritanceViewportScissorInfoNV* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_texel_buffer_alignment
 void reservedunmarshal_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_QCOM_render_pass_transform
 void reservedunmarshal_VkRenderPassTransformBeginInfoQCOM(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRenderPassTransformBeginInfoQCOM* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkRenderPassTransformBeginInfoQCOM* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCommandBufferInheritanceRenderPassTransformInfoQCOM* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkCommandBufferInheritanceRenderPassTransformInfoQCOM* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_device_memory_report
 void reservedunmarshal_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkDeviceMemoryReportCallbackDataEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceMemoryReportCallbackDataEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDeviceMemoryReportCallbackDataEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkDeviceDeviceMemoryReportCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceDeviceMemoryReportCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDeviceDeviceMemoryReportCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_acquire_drm_display
 #endif
 #ifdef VK_EXT_robustness2
 void reservedunmarshal_VkPhysicalDeviceRobustness2FeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceRobustness2FeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceRobustness2FeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceRobustness2PropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceRobustness2PropertiesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceRobustness2PropertiesEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_custom_border_color
 void reservedunmarshal_VkSamplerCustomBorderColorCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSamplerCustomBorderColorCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSamplerCustomBorderColorCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceCustomBorderColorPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceCustomBorderColorPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceCustomBorderColorPropertiesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceCustomBorderColorFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceCustomBorderColorFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceCustomBorderColorFeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_GOOGLE_user_type
 #endif
 #ifdef VK_EXT_private_data
 void reservedunmarshal_VkPhysicalDevicePrivateDataFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePrivateDataFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePrivateDataFeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkDevicePrivateDataCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDevicePrivateDataCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDevicePrivateDataCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPrivateDataSlotCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPrivateDataSlotCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPrivateDataSlotCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_pipeline_creation_cache_control
 void reservedunmarshal_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_NV_device_diagnostics_config
 void reservedunmarshal_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDiagnosticsConfigFeaturesNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceDiagnosticsConfigFeaturesNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkDeviceDiagnosticsConfigCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceDiagnosticsConfigCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDeviceDiagnosticsConfigCreateInfoNV* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_QCOM_render_pass_store_ops
 #endif
 #ifdef VK_NV_fragment_shading_rate_enums
 void reservedunmarshal_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineFragmentShadingRateEnumStateCreateInfoNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineFragmentShadingRateEnumStateCreateInfoNV* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_NV_ray_tracing_motion_blur
-void reservedunmarshal_VkDeviceOrHostAddressConstKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceOrHostAddressConstKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDeviceOrHostAddressConstKHR(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkDeviceOrHostAddressConstKHR* forUnmarshaling,
+                                                     uint8_t** ptr);
 
 void reservedunmarshal_VkAccelerationStructureGeometryMotionTrianglesDataNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureGeometryMotionTrianglesDataNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureGeometryMotionTrianglesDataNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkAccelerationStructureMotionInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureMotionInfoNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureMotionInfoNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkAccelerationStructureMatrixMotionInstanceNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureMatrixMotionInstanceNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureMatrixMotionInstanceNV* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkSRTDataNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSRTDataNV* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkSRTDataNV(VulkanStream* vkStream, VkStructureType rootType,
+                                   VkSRTDataNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkAccelerationStructureSRTMotionInstanceNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureSRTMotionInstanceNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureSRTMotionInstanceNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkAccelerationStructureMotionInstanceDataNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureMotionInstanceDataNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureMotionInstanceDataNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkAccelerationStructureMotionInstanceNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureMotionInstanceNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureMotionInstanceNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceRayTracingMotionBlurFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceRayTracingMotionBlurFeaturesNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceRayTracingMotionBlurFeaturesNV* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_ycbcr_2plane_444_formats
 void reservedunmarshal_VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_fragment_density_map2
 void reservedunmarshal_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_QCOM_rotated_copy_commands
 void reservedunmarshal_VkCopyCommandTransformInfoQCOM(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCopyCommandTransformInfoQCOM* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkCopyCommandTransformInfoQCOM* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_image_robustness
 void reservedunmarshal_VkPhysicalDeviceImageRobustnessFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceImageRobustnessFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceImageRobustnessFeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_4444_formats
 void reservedunmarshal_VkPhysicalDevice4444FormatsFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevice4444FormatsFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevice4444FormatsFeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_rgba10x6_formats
 void reservedunmarshal_VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_NV_acquire_winrt_display
 #endif
 #ifdef VK_EXT_directfb_surface
 void reservedunmarshal_VkDirectFBSurfaceCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDirectFBSurfaceCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkDirectFBSurfaceCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_VALVE_mutable_descriptor_type
 void reservedunmarshal_VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkMutableDescriptorTypeListVALVE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMutableDescriptorTypeListVALVE* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkMutableDescriptorTypeListVALVE* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkMutableDescriptorTypeCreateInfoVALVE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMutableDescriptorTypeCreateInfoVALVE* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkMutableDescriptorTypeCreateInfoVALVE* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_vertex_input_dynamic_state
 void reservedunmarshal_VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkVertexInputBindingDescription2EXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVertexInputBindingDescription2EXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVertexInputBindingDescription2EXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkVertexInputAttributeDescription2EXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkVertexInputAttributeDescription2EXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkVertexInputAttributeDescription2EXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_physical_device_drm
 void reservedunmarshal_VkPhysicalDeviceDrmPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceDrmPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceDrmPropertiesEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_primitive_topology_list_restart
 void reservedunmarshal_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_FUCHSIA_external_memory
 void reservedunmarshal_VkImportMemoryZirconHandleInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportMemoryZirconHandleInfoFUCHSIA* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImportMemoryZirconHandleInfoFUCHSIA* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkMemoryZirconHandlePropertiesFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryZirconHandlePropertiesFUCHSIA* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkMemoryZirconHandlePropertiesFUCHSIA* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkMemoryGetZirconHandleInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryGetZirconHandleInfoFUCHSIA* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkMemoryGetZirconHandleInfoFUCHSIA* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_FUCHSIA_external_semaphore
 void reservedunmarshal_VkImportSemaphoreZirconHandleInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportSemaphoreZirconHandleInfoFUCHSIA* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImportSemaphoreZirconHandleInfoFUCHSIA* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkSemaphoreGetZirconHandleInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSemaphoreGetZirconHandleInfoFUCHSIA* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSemaphoreGetZirconHandleInfoFUCHSIA* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
 void reservedunmarshal_VkBufferCollectionCreateInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferCollectionCreateInfoFUCHSIA* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBufferCollectionCreateInfoFUCHSIA* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkImportMemoryBufferCollectionFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportMemoryBufferCollectionFUCHSIA* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImportMemoryBufferCollectionFUCHSIA* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkBufferCollectionImageCreateInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferCollectionImageCreateInfoFUCHSIA* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBufferCollectionImageCreateInfoFUCHSIA* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkBufferCollectionConstraintsInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferCollectionConstraintsInfoFUCHSIA* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBufferCollectionConstraintsInfoFUCHSIA* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkBufferConstraintsInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferConstraintsInfoFUCHSIA* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBufferConstraintsInfoFUCHSIA* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkBufferCollectionBufferCreateInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferCollectionBufferCreateInfoFUCHSIA* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBufferCollectionBufferCreateInfoFUCHSIA* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkSysmemColorSpaceFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSysmemColorSpaceFUCHSIA* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkSysmemColorSpaceFUCHSIA(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkSysmemColorSpaceFUCHSIA* forUnmarshaling,
+                                                 uint8_t** ptr);
 
 void reservedunmarshal_VkBufferCollectionPropertiesFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkBufferCollectionPropertiesFUCHSIA* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkBufferCollectionPropertiesFUCHSIA* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkImageFormatConstraintsInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageFormatConstraintsInfoFUCHSIA* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkImageFormatConstraintsInfoFUCHSIA* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkImageConstraintsInfoFUCHSIA(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImageConstraintsInfoFUCHSIA* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkImageConstraintsInfoFUCHSIA(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkImageConstraintsInfoFUCHSIA* forUnmarshaling,
+                                                     uint8_t** ptr);
 
 #endif
 #ifdef VK_HUAWEI_subpass_shading
 void reservedunmarshal_VkSubpassShadingPipelineCreateInfoHUAWEI(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSubpassShadingPipelineCreateInfoHUAWEI* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSubpassShadingPipelineCreateInfoHUAWEI* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceSubpassShadingFeaturesHUAWEI(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSubpassShadingFeaturesHUAWEI* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceSubpassShadingFeaturesHUAWEI* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceSubpassShadingPropertiesHUAWEI(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceSubpassShadingPropertiesHUAWEI* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceSubpassShadingPropertiesHUAWEI* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_HUAWEI_invocation_mask
 void reservedunmarshal_VkPhysicalDeviceInvocationMaskFeaturesHUAWEI(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceInvocationMaskFeaturesHUAWEI* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceInvocationMaskFeaturesHUAWEI* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_NV_external_memory_rdma
 void reservedunmarshal_VkMemoryGetRemoteAddressInfoNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMemoryGetRemoteAddressInfoNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkMemoryGetRemoteAddressInfoNV* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceExternalMemoryRDMAFeaturesNV(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceExternalMemoryRDMAFeaturesNV* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceExternalMemoryRDMAFeaturesNV* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
 void reservedunmarshal_VkPhysicalDeviceExtendedDynamicState2FeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceExtendedDynamicState2FeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceExtendedDynamicState2FeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_QNX_screen_surface
-void reservedunmarshal_VkScreenSurfaceCreateInfoQNX(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkScreenSurfaceCreateInfoQNX* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkScreenSurfaceCreateInfoQNX(VulkanStream* vkStream,
+                                                    VkStructureType rootType,
+                                                    VkScreenSurfaceCreateInfoQNX* forUnmarshaling,
+                                                    uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_color_write_enable
 void reservedunmarshal_VkPhysicalDeviceColorWriteEnableFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceColorWriteEnableFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceColorWriteEnableFeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPipelineColorWriteCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPipelineColorWriteCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPipelineColorWriteCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_GOOGLE_gfxstream
-void reservedunmarshal_VkImportColorBufferGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportColorBufferGOOGLE* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkImportColorBufferGOOGLE(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkImportColorBufferGOOGLE* forUnmarshaling,
+                                                 uint8_t** ptr);
 
-void reservedunmarshal_VkImportBufferGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportBufferGOOGLE* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkImportBufferGOOGLE(VulkanStream* vkStream, VkStructureType rootType,
+                                            VkImportBufferGOOGLE* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkImportPhysicalAddressGOOGLE(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkImportPhysicalAddressGOOGLE* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkImportPhysicalAddressGOOGLE(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkImportPhysicalAddressGOOGLE* forUnmarshaling,
+                                                     uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_global_priority_query
 void reservedunmarshal_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkQueueFamilyGlobalPriorityPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkQueueFamilyGlobalPriorityPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkQueueFamilyGlobalPriorityPropertiesEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_multi_draw
 void reservedunmarshal_VkPhysicalDeviceMultiDrawFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMultiDrawFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMultiDrawFeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceMultiDrawPropertiesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceMultiDrawPropertiesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceMultiDrawPropertiesEXT* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkMultiDrawInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMultiDrawInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkMultiDrawInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                          VkMultiDrawInfoEXT* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkMultiDrawIndexedInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkMultiDrawIndexedInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkMultiDrawIndexedInfoEXT(VulkanStream* vkStream, VkStructureType rootType,
+                                                 VkMultiDrawIndexedInfoEXT* forUnmarshaling,
+                                                 uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_load_store_op_none
 #endif
 #ifdef VK_EXT_border_color_swizzle
 void reservedunmarshal_VkPhysicalDeviceBorderColorSwizzleFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceBorderColorSwizzleFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceBorderColorSwizzleFeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkSamplerBorderColorComponentMappingCreateInfoEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkSamplerBorderColorComponentMappingCreateInfoEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkSamplerBorderColorComponentMappingCreateInfoEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_EXT_pageable_device_local_memory
 void reservedunmarshal_VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_acceleration_structure
-void reservedunmarshal_VkDeviceOrHostAddressKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkDeviceOrHostAddressKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkDeviceOrHostAddressKHR(VulkanStream* vkStream, VkStructureType rootType,
+                                                VkDeviceOrHostAddressKHR* forUnmarshaling,
+                                                uint8_t** ptr);
 
 void reservedunmarshal_VkAccelerationStructureBuildRangeInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureBuildRangeInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureBuildRangeInfoKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkAccelerationStructureGeometryTrianglesDataKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureGeometryTrianglesDataKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureGeometryTrianglesDataKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkAccelerationStructureGeometryAabbsDataKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureGeometryAabbsDataKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureGeometryAabbsDataKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkAccelerationStructureGeometryInstancesDataKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureGeometryInstancesDataKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureGeometryInstancesDataKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkAccelerationStructureGeometryDataKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureGeometryDataKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureGeometryDataKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkAccelerationStructureGeometryKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureGeometryKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureGeometryKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkAccelerationStructureBuildGeometryInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureBuildGeometryInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureBuildGeometryInfoKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkAccelerationStructureCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureCreateInfoKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkWriteDescriptorSetAccelerationStructureKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkWriteDescriptorSetAccelerationStructureKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkWriteDescriptorSetAccelerationStructureKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceAccelerationStructureFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceAccelerationStructureFeaturesKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceAccelerationStructureFeaturesKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceAccelerationStructurePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceAccelerationStructurePropertiesKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceAccelerationStructurePropertiesKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkAccelerationStructureDeviceAddressInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureDeviceAddressInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureDeviceAddressInfoKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkAccelerationStructureVersionInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureVersionInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureVersionInfoKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkCopyAccelerationStructureToMemoryInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCopyAccelerationStructureToMemoryInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkCopyAccelerationStructureToMemoryInfoKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkCopyMemoryToAccelerationStructureInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCopyMemoryToAccelerationStructureInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkCopyMemoryToAccelerationStructureInfoKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkCopyAccelerationStructureInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkCopyAccelerationStructureInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkCopyAccelerationStructureInfoKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkAccelerationStructureBuildSizesInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkAccelerationStructureBuildSizesInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkAccelerationStructureBuildSizesInfoKHR* forUnmarshaling, uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
 void reservedunmarshal_VkRayTracingShaderGroupCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRayTracingShaderGroupCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkRayTracingShaderGroupCreateInfoKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkRayTracingPipelineInterfaceCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRayTracingPipelineInterfaceCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkRayTracingPipelineInterfaceCreateInfoKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkRayTracingPipelineCreateInfoKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkRayTracingPipelineCreateInfoKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkRayTracingPipelineCreateInfoKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceRayTracingPipelineFeaturesKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceRayTracingPipelineFeaturesKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceRayTracingPipelinePropertiesKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceRayTracingPipelinePropertiesKHR* forUnmarshaling, uint8_t** ptr);
 
 void reservedunmarshal_VkStridedDeviceAddressRegionKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkStridedDeviceAddressRegionKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkStridedDeviceAddressRegionKHR* forUnmarshaling, uint8_t** ptr);
 
-void reservedunmarshal_VkTraceRaysIndirectCommandKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkTraceRaysIndirectCommandKHR* forUnmarshaling,
-    uint8_t** ptr);
+void reservedunmarshal_VkTraceRaysIndirectCommandKHR(VulkanStream* vkStream,
+                                                     VkStructureType rootType,
+                                                     VkTraceRaysIndirectCommandKHR* forUnmarshaling,
+                                                     uint8_t** ptr);
 
 #endif
 #ifdef VK_KHR_ray_query
 void reservedunmarshal_VkPhysicalDeviceRayQueryFeaturesKHR(
-    VulkanStream* vkStream,
-    VkStructureType rootType,
-    VkPhysicalDeviceRayQueryFeaturesKHR* forUnmarshaling,
-    uint8_t** ptr);
+    VulkanStream* vkStream, VkStructureType rootType,
+    VkPhysicalDeviceRayQueryFeaturesKHR* forUnmarshaling, uint8_t** ptr);
 
 #endif
 
-} // namespace goldfish_vk
+}  // namespace goldfish_vk
diff --git a/stream-servers/vulkan/cereal/common/goldfish_vk_testing.cpp b/stream-servers/vulkan/cereal/common/goldfish_vk_testing.cpp
index c056457..811df82 100644
--- a/stream-servers/vulkan/cereal/common/goldfish_vk_testing.cpp
+++ b/stream-servers/vulkan/cereal/common/goldfish_vk_testing.cpp
@@ -14,771 +14,1329 @@
 // limitations under the License.
 
 // Autogenerated module goldfish_vk_testing
-// (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
+// (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal
+// -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
 // VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
 // VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+//
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o
+// $CEREAL_OUTPUT_DIR
+//
 
 #include "goldfish_vk_testing.h"
 
+#include <string.h>
 
 #include "goldfish_vk_extension_structs.h"
 #include "goldfish_vk_private_defs.h"
-#include <string.h>
-
 
 namespace goldfish_vk {
 
-void checkEqual_extension_struct(
-    const void* structExtension,
-    const void* structExtension2,
-    OnFailCompareFunc onFail);
+void checkEqual_extension_struct(const void* structExtension, const void* structExtension2,
+                                 OnFailCompareFunc onFail);
 
 #ifdef VK_VERSION_1_0
-void checkEqual_VkExtent2D(
-    const VkExtent2D* a,
-    const VkExtent2D* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->width) == (b->width))) { onFail("a->width (Error: Value not equal)"); };
-    if (!((a->height) == (b->height))) { onFail("a->height (Error: Value not equal)"); };
+void checkEqual_VkExtent2D(const VkExtent2D* a, const VkExtent2D* b, OnFailCompareFunc onFail) {
+    if (!((a->width) == (b->width))) {
+        onFail("a->width (Error: Value not equal)");
+    };
+    if (!((a->height) == (b->height))) {
+        onFail("a->height (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkExtent3D(
-    const VkExtent3D* a,
-    const VkExtent3D* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->width) == (b->width))) { onFail("a->width (Error: Value not equal)"); };
-    if (!((a->height) == (b->height))) { onFail("a->height (Error: Value not equal)"); };
-    if (!((a->depth) == (b->depth))) { onFail("a->depth (Error: Value not equal)"); };
+void checkEqual_VkExtent3D(const VkExtent3D* a, const VkExtent3D* b, OnFailCompareFunc onFail) {
+    if (!((a->width) == (b->width))) {
+        onFail("a->width (Error: Value not equal)");
+    };
+    if (!((a->height) == (b->height))) {
+        onFail("a->height (Error: Value not equal)");
+    };
+    if (!((a->depth) == (b->depth))) {
+        onFail("a->depth (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkOffset2D(
-    const VkOffset2D* a,
-    const VkOffset2D* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->x) == (b->x))) { onFail("a->x (Error: Value not equal)"); };
-    if (!((a->y) == (b->y))) { onFail("a->y (Error: Value not equal)"); };
+void checkEqual_VkOffset2D(const VkOffset2D* a, const VkOffset2D* b, OnFailCompareFunc onFail) {
+    if (!((a->x) == (b->x))) {
+        onFail("a->x (Error: Value not equal)");
+    };
+    if (!((a->y) == (b->y))) {
+        onFail("a->y (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkOffset3D(
-    const VkOffset3D* a,
-    const VkOffset3D* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->x) == (b->x))) { onFail("a->x (Error: Value not equal)"); };
-    if (!((a->y) == (b->y))) { onFail("a->y (Error: Value not equal)"); };
-    if (!((a->z) == (b->z))) { onFail("a->z (Error: Value not equal)"); };
+void checkEqual_VkOffset3D(const VkOffset3D* a, const VkOffset3D* b, OnFailCompareFunc onFail) {
+    if (!((a->x) == (b->x))) {
+        onFail("a->x (Error: Value not equal)");
+    };
+    if (!((a->y) == (b->y))) {
+        onFail("a->y (Error: Value not equal)");
+    };
+    if (!((a->z) == (b->z))) {
+        onFail("a->z (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkRect2D(
-    const VkRect2D* a,
-    const VkRect2D* b,
-    OnFailCompareFunc onFail)
-{
+void checkEqual_VkRect2D(const VkRect2D* a, const VkRect2D* b, OnFailCompareFunc onFail) {
     checkEqual_VkOffset2D(&a->offset, &b->offset, onFail);
     checkEqual_VkExtent2D(&a->extent, &b->extent, onFail);
 }
 
-void checkEqual_VkBaseInStructure(
-    const VkBaseInStructure* a,
-    const VkBaseInStructure* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkBaseInStructure(const VkBaseInStructure* a, const VkBaseInStructure* b,
+                                  OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
 }
 
-void checkEqual_VkBaseOutStructure(
-    const VkBaseOutStructure* a,
-    const VkBaseOutStructure* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkBaseOutStructure(const VkBaseOutStructure* a, const VkBaseOutStructure* b,
+                                   OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
 }
 
-void checkEqual_VkBufferMemoryBarrier(
-    const VkBufferMemoryBarrier* a,
-    const VkBufferMemoryBarrier* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkBufferMemoryBarrier(const VkBufferMemoryBarrier* a,
+                                      const VkBufferMemoryBarrier* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->srcAccessMask) == (b->srcAccessMask))) { onFail("a->srcAccessMask (Error: Value not equal)"); };
-    if (!((a->dstAccessMask) == (b->dstAccessMask))) { onFail("a->dstAccessMask (Error: Value not equal)"); };
-    if (!((a->srcQueueFamilyIndex) == (b->srcQueueFamilyIndex))) { onFail("a->srcQueueFamilyIndex (Error: Value not equal)"); };
-    if (!((a->dstQueueFamilyIndex) == (b->dstQueueFamilyIndex))) { onFail("a->dstQueueFamilyIndex (Error: Value not equal)"); };
-    if (!((a->buffer) == (b->buffer))) { onFail("a->buffer (Error: Value not equal)"); };
-    if (!((a->offset) == (b->offset))) { onFail("a->offset (Error: Value not equal)"); };
-    if (!((a->size) == (b->size))) { onFail("a->size (Error: Value not equal)"); };
+    if (!((a->srcAccessMask) == (b->srcAccessMask))) {
+        onFail("a->srcAccessMask (Error: Value not equal)");
+    };
+    if (!((a->dstAccessMask) == (b->dstAccessMask))) {
+        onFail("a->dstAccessMask (Error: Value not equal)");
+    };
+    if (!((a->srcQueueFamilyIndex) == (b->srcQueueFamilyIndex))) {
+        onFail("a->srcQueueFamilyIndex (Error: Value not equal)");
+    };
+    if (!((a->dstQueueFamilyIndex) == (b->dstQueueFamilyIndex))) {
+        onFail("a->dstQueueFamilyIndex (Error: Value not equal)");
+    };
+    if (!((a->buffer) == (b->buffer))) {
+        onFail("a->buffer (Error: Value not equal)");
+    };
+    if (!((a->offset) == (b->offset))) {
+        onFail("a->offset (Error: Value not equal)");
+    };
+    if (!((a->size) == (b->size))) {
+        onFail("a->size (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkDispatchIndirectCommand(
-    const VkDispatchIndirectCommand* a,
-    const VkDispatchIndirectCommand* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->x) == (b->x))) { onFail("a->x (Error: Value not equal)"); };
-    if (!((a->y) == (b->y))) { onFail("a->y (Error: Value not equal)"); };
-    if (!((a->z) == (b->z))) { onFail("a->z (Error: Value not equal)"); };
+void checkEqual_VkDispatchIndirectCommand(const VkDispatchIndirectCommand* a,
+                                          const VkDispatchIndirectCommand* b,
+                                          OnFailCompareFunc onFail) {
+    if (!((a->x) == (b->x))) {
+        onFail("a->x (Error: Value not equal)");
+    };
+    if (!((a->y) == (b->y))) {
+        onFail("a->y (Error: Value not equal)");
+    };
+    if (!((a->z) == (b->z))) {
+        onFail("a->z (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkDrawIndexedIndirectCommand(
-    const VkDrawIndexedIndirectCommand* a,
-    const VkDrawIndexedIndirectCommand* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->indexCount) == (b->indexCount))) { onFail("a->indexCount (Error: Value not equal)"); };
-    if (!((a->instanceCount) == (b->instanceCount))) { onFail("a->instanceCount (Error: Value not equal)"); };
-    if (!((a->firstIndex) == (b->firstIndex))) { onFail("a->firstIndex (Error: Value not equal)"); };
-    if (!((a->vertexOffset) == (b->vertexOffset))) { onFail("a->vertexOffset (Error: Value not equal)"); };
-    if (!((a->firstInstance) == (b->firstInstance))) { onFail("a->firstInstance (Error: Value not equal)"); };
+void checkEqual_VkDrawIndexedIndirectCommand(const VkDrawIndexedIndirectCommand* a,
+                                             const VkDrawIndexedIndirectCommand* b,
+                                             OnFailCompareFunc onFail) {
+    if (!((a->indexCount) == (b->indexCount))) {
+        onFail("a->indexCount (Error: Value not equal)");
+    };
+    if (!((a->instanceCount) == (b->instanceCount))) {
+        onFail("a->instanceCount (Error: Value not equal)");
+    };
+    if (!((a->firstIndex) == (b->firstIndex))) {
+        onFail("a->firstIndex (Error: Value not equal)");
+    };
+    if (!((a->vertexOffset) == (b->vertexOffset))) {
+        onFail("a->vertexOffset (Error: Value not equal)");
+    };
+    if (!((a->firstInstance) == (b->firstInstance))) {
+        onFail("a->firstInstance (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkDrawIndirectCommand(
-    const VkDrawIndirectCommand* a,
-    const VkDrawIndirectCommand* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->vertexCount) == (b->vertexCount))) { onFail("a->vertexCount (Error: Value not equal)"); };
-    if (!((a->instanceCount) == (b->instanceCount))) { onFail("a->instanceCount (Error: Value not equal)"); };
-    if (!((a->firstVertex) == (b->firstVertex))) { onFail("a->firstVertex (Error: Value not equal)"); };
-    if (!((a->firstInstance) == (b->firstInstance))) { onFail("a->firstInstance (Error: Value not equal)"); };
+void checkEqual_VkDrawIndirectCommand(const VkDrawIndirectCommand* a,
+                                      const VkDrawIndirectCommand* b, OnFailCompareFunc onFail) {
+    if (!((a->vertexCount) == (b->vertexCount))) {
+        onFail("a->vertexCount (Error: Value not equal)");
+    };
+    if (!((a->instanceCount) == (b->instanceCount))) {
+        onFail("a->instanceCount (Error: Value not equal)");
+    };
+    if (!((a->firstVertex) == (b->firstVertex))) {
+        onFail("a->firstVertex (Error: Value not equal)");
+    };
+    if (!((a->firstInstance) == (b->firstInstance))) {
+        onFail("a->firstInstance (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkImageSubresourceRange(
-    const VkImageSubresourceRange* a,
-    const VkImageSubresourceRange* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->aspectMask) == (b->aspectMask))) { onFail("a->aspectMask (Error: Value not equal)"); };
-    if (!((a->baseMipLevel) == (b->baseMipLevel))) { onFail("a->baseMipLevel (Error: Value not equal)"); };
-    if (!((a->levelCount) == (b->levelCount))) { onFail("a->levelCount (Error: Value not equal)"); };
-    if (!((a->baseArrayLayer) == (b->baseArrayLayer))) { onFail("a->baseArrayLayer (Error: Value not equal)"); };
-    if (!((a->layerCount) == (b->layerCount))) { onFail("a->layerCount (Error: Value not equal)"); };
+void checkEqual_VkImageSubresourceRange(const VkImageSubresourceRange* a,
+                                        const VkImageSubresourceRange* b,
+                                        OnFailCompareFunc onFail) {
+    if (!((a->aspectMask) == (b->aspectMask))) {
+        onFail("a->aspectMask (Error: Value not equal)");
+    };
+    if (!((a->baseMipLevel) == (b->baseMipLevel))) {
+        onFail("a->baseMipLevel (Error: Value not equal)");
+    };
+    if (!((a->levelCount) == (b->levelCount))) {
+        onFail("a->levelCount (Error: Value not equal)");
+    };
+    if (!((a->baseArrayLayer) == (b->baseArrayLayer))) {
+        onFail("a->baseArrayLayer (Error: Value not equal)");
+    };
+    if (!((a->layerCount) == (b->layerCount))) {
+        onFail("a->layerCount (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkImageMemoryBarrier(
-    const VkImageMemoryBarrier* a,
-    const VkImageMemoryBarrier* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkImageMemoryBarrier(const VkImageMemoryBarrier* a, const VkImageMemoryBarrier* b,
+                                     OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->srcAccessMask) == (b->srcAccessMask))) { onFail("a->srcAccessMask (Error: Value not equal)"); };
-    if (!((a->dstAccessMask) == (b->dstAccessMask))) { onFail("a->dstAccessMask (Error: Value not equal)"); };
-    if (!((a->oldLayout) == (b->oldLayout))) { onFail("a->oldLayout (Error: Value not equal)"); };
-    if (!((a->newLayout) == (b->newLayout))) { onFail("a->newLayout (Error: Value not equal)"); };
-    if (!((a->srcQueueFamilyIndex) == (b->srcQueueFamilyIndex))) { onFail("a->srcQueueFamilyIndex (Error: Value not equal)"); };
-    if (!((a->dstQueueFamilyIndex) == (b->dstQueueFamilyIndex))) { onFail("a->dstQueueFamilyIndex (Error: Value not equal)"); };
-    if (!((a->image) == (b->image))) { onFail("a->image (Error: Value not equal)"); };
+    if (!((a->srcAccessMask) == (b->srcAccessMask))) {
+        onFail("a->srcAccessMask (Error: Value not equal)");
+    };
+    if (!((a->dstAccessMask) == (b->dstAccessMask))) {
+        onFail("a->dstAccessMask (Error: Value not equal)");
+    };
+    if (!((a->oldLayout) == (b->oldLayout))) {
+        onFail("a->oldLayout (Error: Value not equal)");
+    };
+    if (!((a->newLayout) == (b->newLayout))) {
+        onFail("a->newLayout (Error: Value not equal)");
+    };
+    if (!((a->srcQueueFamilyIndex) == (b->srcQueueFamilyIndex))) {
+        onFail("a->srcQueueFamilyIndex (Error: Value not equal)");
+    };
+    if (!((a->dstQueueFamilyIndex) == (b->dstQueueFamilyIndex))) {
+        onFail("a->dstQueueFamilyIndex (Error: Value not equal)");
+    };
+    if (!((a->image) == (b->image))) {
+        onFail("a->image (Error: Value not equal)");
+    };
     checkEqual_VkImageSubresourceRange(&a->subresourceRange, &b->subresourceRange, onFail);
 }
 
-void checkEqual_VkMemoryBarrier(
-    const VkMemoryBarrier* a,
-    const VkMemoryBarrier* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkMemoryBarrier(const VkMemoryBarrier* a, const VkMemoryBarrier* b,
+                                OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->srcAccessMask) == (b->srcAccessMask))) { onFail("a->srcAccessMask (Error: Value not equal)"); };
-    if (!((a->dstAccessMask) == (b->dstAccessMask))) { onFail("a->dstAccessMask (Error: Value not equal)"); };
+    if (!((a->srcAccessMask) == (b->srcAccessMask))) {
+        onFail("a->srcAccessMask (Error: Value not equal)");
+    };
+    if (!((a->dstAccessMask) == (b->dstAccessMask))) {
+        onFail("a->dstAccessMask (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkPipelineCacheHeaderVersionOne(
-    const VkPipelineCacheHeaderVersionOne* a,
-    const VkPipelineCacheHeaderVersionOne* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->headerSize) == (b->headerSize))) { onFail("a->headerSize (Error: Value not equal)"); };
-    if (!((a->headerVersion) == (b->headerVersion))) { onFail("a->headerVersion (Error: Value not equal)"); };
-    if (!((a->vendorID) == (b->vendorID))) { onFail("a->vendorID (Error: Value not equal)"); };
-    if (!((a->deviceID) == (b->deviceID))) { onFail("a->deviceID (Error: Value not equal)"); };
-    if (!((memcmp(a->pipelineCacheUUID, b->pipelineCacheUUID, VK_UUID_SIZE * sizeof(uint8_t)) == 0))) { onFail("a->pipelineCacheUUID (Error: Unequal static array)"); };
+void checkEqual_VkPipelineCacheHeaderVersionOne(const VkPipelineCacheHeaderVersionOne* a,
+                                                const VkPipelineCacheHeaderVersionOne* b,
+                                                OnFailCompareFunc onFail) {
+    if (!((a->headerSize) == (b->headerSize))) {
+        onFail("a->headerSize (Error: Value not equal)");
+    };
+    if (!((a->headerVersion) == (b->headerVersion))) {
+        onFail("a->headerVersion (Error: Value not equal)");
+    };
+    if (!((a->vendorID) == (b->vendorID))) {
+        onFail("a->vendorID (Error: Value not equal)");
+    };
+    if (!((a->deviceID) == (b->deviceID))) {
+        onFail("a->deviceID (Error: Value not equal)");
+    };
+    if (!((memcmp(a->pipelineCacheUUID, b->pipelineCacheUUID, VK_UUID_SIZE * sizeof(uint8_t)) ==
+           0))) {
+        onFail("a->pipelineCacheUUID (Error: Unequal static array)");
+    };
 }
 
-void checkEqual_VkAllocationCallbacks(
-    const VkAllocationCallbacks* a,
-    const VkAllocationCallbacks* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((!(a->pUserData) && !(b->pUserData)) || ((a->pUserData) && (b->pUserData)))) { onFail("a->pUserData (Error: Mismatch in optional field)"); };
-    if (!((a->pfnAllocation) == (b->pfnAllocation))) { onFail("a->pfnAllocation (Error: Value not equal)"); };
-    if (!((a->pfnReallocation) == (b->pfnReallocation))) { onFail("a->pfnReallocation (Error: Value not equal)"); };
-    if (!((a->pfnFree) == (b->pfnFree))) { onFail("a->pfnFree (Error: Value not equal)"); };
-    if (!((a->pfnInternalAllocation) == (b->pfnInternalAllocation))) { onFail("a->pfnInternalAllocation (Error: Value not equal)"); };
-    if (!((a->pfnInternalFree) == (b->pfnInternalFree))) { onFail("a->pfnInternalFree (Error: Value not equal)"); };
+void checkEqual_VkAllocationCallbacks(const VkAllocationCallbacks* a,
+                                      const VkAllocationCallbacks* b, OnFailCompareFunc onFail) {
+    if (!((!(a->pUserData) && !(b->pUserData)) || ((a->pUserData) && (b->pUserData)))) {
+        onFail("a->pUserData (Error: Mismatch in optional field)");
+    };
+    if (!((a->pfnAllocation) == (b->pfnAllocation))) {
+        onFail("a->pfnAllocation (Error: Value not equal)");
+    };
+    if (!((a->pfnReallocation) == (b->pfnReallocation))) {
+        onFail("a->pfnReallocation (Error: Value not equal)");
+    };
+    if (!((a->pfnFree) == (b->pfnFree))) {
+        onFail("a->pfnFree (Error: Value not equal)");
+    };
+    if (!((a->pfnInternalAllocation) == (b->pfnInternalAllocation))) {
+        onFail("a->pfnInternalAllocation (Error: Value not equal)");
+    };
+    if (!((a->pfnInternalFree) == (b->pfnInternalFree))) {
+        onFail("a->pfnInternalFree (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkApplicationInfo(
-    const VkApplicationInfo* a,
-    const VkApplicationInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkApplicationInfo(const VkApplicationInfo* a, const VkApplicationInfo* b,
+                                  OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((!(a->pApplicationName) && !(b->pApplicationName)) || ((a->pApplicationName) && (b->pApplicationName)))) { onFail("a->pApplicationName (Error: Mismatch in optional field)"); };
-    if (a->pApplicationName && b->pApplicationName)
-    {
-        if (!((!(a->pApplicationName) && !(b->pApplicationName)) || ((a->pApplicationName) && (b->pApplicationName)))) { onFail("a->pApplicationName (Error: Mismatch in string pointer nullness)"); };
-        if ((a->pApplicationName) && (b->pApplicationName))
-        {
-            if (!((strcmp(a->pApplicationName, b->pApplicationName) == 0))) { onFail("a->pApplicationName (Error: Unequal strings)"); };
+    if (!((!(a->pApplicationName) && !(b->pApplicationName)) ||
+          ((a->pApplicationName) && (b->pApplicationName)))) {
+        onFail("a->pApplicationName (Error: Mismatch in optional field)");
+    };
+    if (a->pApplicationName && b->pApplicationName) {
+        if (!((!(a->pApplicationName) && !(b->pApplicationName)) ||
+              ((a->pApplicationName) && (b->pApplicationName)))) {
+            onFail("a->pApplicationName (Error: Mismatch in string pointer nullness)");
+        };
+        if ((a->pApplicationName) && (b->pApplicationName)) {
+            if (!((strcmp(a->pApplicationName, b->pApplicationName) == 0))) {
+                onFail("a->pApplicationName (Error: Unequal strings)");
+            };
         }
     }
-    if (!((a->applicationVersion) == (b->applicationVersion))) { onFail("a->applicationVersion (Error: Value not equal)"); };
-    if (!((!(a->pEngineName) && !(b->pEngineName)) || ((a->pEngineName) && (b->pEngineName)))) { onFail("a->pEngineName (Error: Mismatch in optional field)"); };
-    if (a->pEngineName && b->pEngineName)
-    {
-        if (!((!(a->pEngineName) && !(b->pEngineName)) || ((a->pEngineName) && (b->pEngineName)))) { onFail("a->pEngineName (Error: Mismatch in string pointer nullness)"); };
-        if ((a->pEngineName) && (b->pEngineName))
-        {
-            if (!((strcmp(a->pEngineName, b->pEngineName) == 0))) { onFail("a->pEngineName (Error: Unequal strings)"); };
+    if (!((a->applicationVersion) == (b->applicationVersion))) {
+        onFail("a->applicationVersion (Error: Value not equal)");
+    };
+    if (!((!(a->pEngineName) && !(b->pEngineName)) || ((a->pEngineName) && (b->pEngineName)))) {
+        onFail("a->pEngineName (Error: Mismatch in optional field)");
+    };
+    if (a->pEngineName && b->pEngineName) {
+        if (!((!(a->pEngineName) && !(b->pEngineName)) || ((a->pEngineName) && (b->pEngineName)))) {
+            onFail("a->pEngineName (Error: Mismatch in string pointer nullness)");
+        };
+        if ((a->pEngineName) && (b->pEngineName)) {
+            if (!((strcmp(a->pEngineName, b->pEngineName) == 0))) {
+                onFail("a->pEngineName (Error: Unequal strings)");
+            };
         }
     }
-    if (!((a->engineVersion) == (b->engineVersion))) { onFail("a->engineVersion (Error: Value not equal)"); };
-    if (!((a->apiVersion) == (b->apiVersion))) { onFail("a->apiVersion (Error: Value not equal)"); };
+    if (!((a->engineVersion) == (b->engineVersion))) {
+        onFail("a->engineVersion (Error: Value not equal)");
+    };
+    if (!((a->apiVersion) == (b->apiVersion))) {
+        onFail("a->apiVersion (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkFormatProperties(
-    const VkFormatProperties* a,
-    const VkFormatProperties* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->linearTilingFeatures) == (b->linearTilingFeatures))) { onFail("a->linearTilingFeatures (Error: Value not equal)"); };
-    if (!((a->optimalTilingFeatures) == (b->optimalTilingFeatures))) { onFail("a->optimalTilingFeatures (Error: Value not equal)"); };
-    if (!((a->bufferFeatures) == (b->bufferFeatures))) { onFail("a->bufferFeatures (Error: Value not equal)"); };
+void checkEqual_VkFormatProperties(const VkFormatProperties* a, const VkFormatProperties* b,
+                                   OnFailCompareFunc onFail) {
+    if (!((a->linearTilingFeatures) == (b->linearTilingFeatures))) {
+        onFail("a->linearTilingFeatures (Error: Value not equal)");
+    };
+    if (!((a->optimalTilingFeatures) == (b->optimalTilingFeatures))) {
+        onFail("a->optimalTilingFeatures (Error: Value not equal)");
+    };
+    if (!((a->bufferFeatures) == (b->bufferFeatures))) {
+        onFail("a->bufferFeatures (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkImageFormatProperties(
-    const VkImageFormatProperties* a,
-    const VkImageFormatProperties* b,
-    OnFailCompareFunc onFail)
-{
+void checkEqual_VkImageFormatProperties(const VkImageFormatProperties* a,
+                                        const VkImageFormatProperties* b,
+                                        OnFailCompareFunc onFail) {
     checkEqual_VkExtent3D(&a->maxExtent, &b->maxExtent, onFail);
-    if (!((a->maxMipLevels) == (b->maxMipLevels))) { onFail("a->maxMipLevels (Error: Value not equal)"); };
-    if (!((a->maxArrayLayers) == (b->maxArrayLayers))) { onFail("a->maxArrayLayers (Error: Value not equal)"); };
-    if (!((a->sampleCounts) == (b->sampleCounts))) { onFail("a->sampleCounts (Error: Value not equal)"); };
-    if (!((a->maxResourceSize) == (b->maxResourceSize))) { onFail("a->maxResourceSize (Error: Value not equal)"); };
+    if (!((a->maxMipLevels) == (b->maxMipLevels))) {
+        onFail("a->maxMipLevels (Error: Value not equal)");
+    };
+    if (!((a->maxArrayLayers) == (b->maxArrayLayers))) {
+        onFail("a->maxArrayLayers (Error: Value not equal)");
+    };
+    if (!((a->sampleCounts) == (b->sampleCounts))) {
+        onFail("a->sampleCounts (Error: Value not equal)");
+    };
+    if (!((a->maxResourceSize) == (b->maxResourceSize))) {
+        onFail("a->maxResourceSize (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkInstanceCreateInfo(
-    const VkInstanceCreateInfo* a,
-    const VkInstanceCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkInstanceCreateInfo(const VkInstanceCreateInfo* a, const VkInstanceCreateInfo* b,
+                                     OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((!(a->pApplicationInfo) && !(b->pApplicationInfo)) || ((a->pApplicationInfo) && (b->pApplicationInfo)))) { onFail("a->pApplicationInfo (Error: Mismatch in optional field)"); };
-    if (a->pApplicationInfo && b->pApplicationInfo)
-    {
-        if ((a->pApplicationInfo) && (b->pApplicationInfo))
-        {
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((!(a->pApplicationInfo) && !(b->pApplicationInfo)) ||
+          ((a->pApplicationInfo) && (b->pApplicationInfo)))) {
+        onFail("a->pApplicationInfo (Error: Mismatch in optional field)");
+    };
+    if (a->pApplicationInfo && b->pApplicationInfo) {
+        if ((a->pApplicationInfo) && (b->pApplicationInfo)) {
             checkEqual_VkApplicationInfo(a->pApplicationInfo, b->pApplicationInfo, onFail);
         }
     }
-    if (!((a->enabledLayerCount) == (b->enabledLayerCount))) { onFail("a->enabledLayerCount (Error: Value not equal)"); };
-    if (!((!(a->ppEnabledLayerNames) && !(b->ppEnabledLayerNames)) || ((a->ppEnabledLayerNames) && (b->ppEnabledLayerNames)))) { onFail("a->ppEnabledLayerNames (Error: Mismatch in string array pointer nullness)"); };
-    if (!((a->enabledLayerCount) == (b->enabledLayerCount))) { onFail("a->ppEnabledLayerNames (Error: Lengths not equal in string array)"); };
-    if (!((a->enabledLayerCount) == (b->enabledLayerCount))) { onFail("a->ppEnabledLayerNames (Error: Lengths not equal in string array)"); };
-    if ((a->enabledLayerCount) == (b->enabledLayerCount) && (a->ppEnabledLayerNames) && (b->ppEnabledLayerNames))
-    {
-        if (a)
-        {
-            for (uint32_t i = 0; i < (uint32_t)a->enabledLayerCount; ++i)
-            {
-                if (!((strcmp(*(a->ppEnabledLayerNames + i), *(b->ppEnabledLayerNames + i)) == 0))) { onFail("a->ppEnabledLayerNames (Error: Unequal string in string array)"); };
+    if (!((a->enabledLayerCount) == (b->enabledLayerCount))) {
+        onFail("a->enabledLayerCount (Error: Value not equal)");
+    };
+    if (!((!(a->ppEnabledLayerNames) && !(b->ppEnabledLayerNames)) ||
+          ((a->ppEnabledLayerNames) && (b->ppEnabledLayerNames)))) {
+        onFail("a->ppEnabledLayerNames (Error: Mismatch in string array pointer nullness)");
+    };
+    if (!((a->enabledLayerCount) == (b->enabledLayerCount))) {
+        onFail("a->ppEnabledLayerNames (Error: Lengths not equal in string array)");
+    };
+    if (!((a->enabledLayerCount) == (b->enabledLayerCount))) {
+        onFail("a->ppEnabledLayerNames (Error: Lengths not equal in string array)");
+    };
+    if ((a->enabledLayerCount) == (b->enabledLayerCount) && (a->ppEnabledLayerNames) &&
+        (b->ppEnabledLayerNames)) {
+        if (a) {
+            for (uint32_t i = 0; i < (uint32_t)a->enabledLayerCount; ++i) {
+                if (!((strcmp(*(a->ppEnabledLayerNames + i), *(b->ppEnabledLayerNames + i)) ==
+                       0))) {
+                    onFail("a->ppEnabledLayerNames (Error: Unequal string in string array)");
+                };
             }
         }
     }
-    if (!((a->enabledExtensionCount) == (b->enabledExtensionCount))) { onFail("a->enabledExtensionCount (Error: Value not equal)"); };
-    if (!((!(a->ppEnabledExtensionNames) && !(b->ppEnabledExtensionNames)) || ((a->ppEnabledExtensionNames) && (b->ppEnabledExtensionNames)))) { onFail("a->ppEnabledExtensionNames (Error: Mismatch in string array pointer nullness)"); };
-    if (!((a->enabledExtensionCount) == (b->enabledExtensionCount))) { onFail("a->ppEnabledExtensionNames (Error: Lengths not equal in string array)"); };
-    if (!((a->enabledExtensionCount) == (b->enabledExtensionCount))) { onFail("a->ppEnabledExtensionNames (Error: Lengths not equal in string array)"); };
-    if ((a->enabledExtensionCount) == (b->enabledExtensionCount) && (a->ppEnabledExtensionNames) && (b->ppEnabledExtensionNames))
-    {
-        if (a)
-        {
-            for (uint32_t i = 0; i < (uint32_t)a->enabledExtensionCount; ++i)
-            {
-                if (!((strcmp(*(a->ppEnabledExtensionNames + i), *(b->ppEnabledExtensionNames + i)) == 0))) { onFail("a->ppEnabledExtensionNames (Error: Unequal string in string array)"); };
+    if (!((a->enabledExtensionCount) == (b->enabledExtensionCount))) {
+        onFail("a->enabledExtensionCount (Error: Value not equal)");
+    };
+    if (!((!(a->ppEnabledExtensionNames) && !(b->ppEnabledExtensionNames)) ||
+          ((a->ppEnabledExtensionNames) && (b->ppEnabledExtensionNames)))) {
+        onFail("a->ppEnabledExtensionNames (Error: Mismatch in string array pointer nullness)");
+    };
+    if (!((a->enabledExtensionCount) == (b->enabledExtensionCount))) {
+        onFail("a->ppEnabledExtensionNames (Error: Lengths not equal in string array)");
+    };
+    if (!((a->enabledExtensionCount) == (b->enabledExtensionCount))) {
+        onFail("a->ppEnabledExtensionNames (Error: Lengths not equal in string array)");
+    };
+    if ((a->enabledExtensionCount) == (b->enabledExtensionCount) && (a->ppEnabledExtensionNames) &&
+        (b->ppEnabledExtensionNames)) {
+        if (a) {
+            for (uint32_t i = 0; i < (uint32_t)a->enabledExtensionCount; ++i) {
+                if (!((strcmp(*(a->ppEnabledExtensionNames + i),
+                              *(b->ppEnabledExtensionNames + i)) == 0))) {
+                    onFail("a->ppEnabledExtensionNames (Error: Unequal string in string array)");
+                };
             }
         }
     }
 }
 
-void checkEqual_VkMemoryHeap(
-    const VkMemoryHeap* a,
-    const VkMemoryHeap* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->size) == (b->size))) { onFail("a->size (Error: Value not equal)"); };
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
+void checkEqual_VkMemoryHeap(const VkMemoryHeap* a, const VkMemoryHeap* b,
+                             OnFailCompareFunc onFail) {
+    if (!((a->size) == (b->size))) {
+        onFail("a->size (Error: Value not equal)");
+    };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkMemoryType(
-    const VkMemoryType* a,
-    const VkMemoryType* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->propertyFlags) == (b->propertyFlags))) { onFail("a->propertyFlags (Error: Value not equal)"); };
-    if (!((a->heapIndex) == (b->heapIndex))) { onFail("a->heapIndex (Error: Value not equal)"); };
+void checkEqual_VkMemoryType(const VkMemoryType* a, const VkMemoryType* b,
+                             OnFailCompareFunc onFail) {
+    if (!((a->propertyFlags) == (b->propertyFlags))) {
+        onFail("a->propertyFlags (Error: Value not equal)");
+    };
+    if (!((a->heapIndex) == (b->heapIndex))) {
+        onFail("a->heapIndex (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkPhysicalDeviceFeatures(
-    const VkPhysicalDeviceFeatures* a,
-    const VkPhysicalDeviceFeatures* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->robustBufferAccess) == (b->robustBufferAccess))) { onFail("a->robustBufferAccess (Error: Value not equal)"); };
-    if (!((a->fullDrawIndexUint32) == (b->fullDrawIndexUint32))) { onFail("a->fullDrawIndexUint32 (Error: Value not equal)"); };
-    if (!((a->imageCubeArray) == (b->imageCubeArray))) { onFail("a->imageCubeArray (Error: Value not equal)"); };
-    if (!((a->independentBlend) == (b->independentBlend))) { onFail("a->independentBlend (Error: Value not equal)"); };
-    if (!((a->geometryShader) == (b->geometryShader))) { onFail("a->geometryShader (Error: Value not equal)"); };
-    if (!((a->tessellationShader) == (b->tessellationShader))) { onFail("a->tessellationShader (Error: Value not equal)"); };
-    if (!((a->sampleRateShading) == (b->sampleRateShading))) { onFail("a->sampleRateShading (Error: Value not equal)"); };
-    if (!((a->dualSrcBlend) == (b->dualSrcBlend))) { onFail("a->dualSrcBlend (Error: Value not equal)"); };
-    if (!((a->logicOp) == (b->logicOp))) { onFail("a->logicOp (Error: Value not equal)"); };
-    if (!((a->multiDrawIndirect) == (b->multiDrawIndirect))) { onFail("a->multiDrawIndirect (Error: Value not equal)"); };
-    if (!((a->drawIndirectFirstInstance) == (b->drawIndirectFirstInstance))) { onFail("a->drawIndirectFirstInstance (Error: Value not equal)"); };
-    if (!((a->depthClamp) == (b->depthClamp))) { onFail("a->depthClamp (Error: Value not equal)"); };
-    if (!((a->depthBiasClamp) == (b->depthBiasClamp))) { onFail("a->depthBiasClamp (Error: Value not equal)"); };
-    if (!((a->fillModeNonSolid) == (b->fillModeNonSolid))) { onFail("a->fillModeNonSolid (Error: Value not equal)"); };
-    if (!((a->depthBounds) == (b->depthBounds))) { onFail("a->depthBounds (Error: Value not equal)"); };
-    if (!((a->wideLines) == (b->wideLines))) { onFail("a->wideLines (Error: Value not equal)"); };
-    if (!((a->largePoints) == (b->largePoints))) { onFail("a->largePoints (Error: Value not equal)"); };
-    if (!((a->alphaToOne) == (b->alphaToOne))) { onFail("a->alphaToOne (Error: Value not equal)"); };
-    if (!((a->multiViewport) == (b->multiViewport))) { onFail("a->multiViewport (Error: Value not equal)"); };
-    if (!((a->samplerAnisotropy) == (b->samplerAnisotropy))) { onFail("a->samplerAnisotropy (Error: Value not equal)"); };
-    if (!((a->textureCompressionETC2) == (b->textureCompressionETC2))) { onFail("a->textureCompressionETC2 (Error: Value not equal)"); };
-    if (!((a->textureCompressionASTC_LDR) == (b->textureCompressionASTC_LDR))) { onFail("a->textureCompressionASTC_LDR (Error: Value not equal)"); };
-    if (!((a->textureCompressionBC) == (b->textureCompressionBC))) { onFail("a->textureCompressionBC (Error: Value not equal)"); };
-    if (!((a->occlusionQueryPrecise) == (b->occlusionQueryPrecise))) { onFail("a->occlusionQueryPrecise (Error: Value not equal)"); };
-    if (!((a->pipelineStatisticsQuery) == (b->pipelineStatisticsQuery))) { onFail("a->pipelineStatisticsQuery (Error: Value not equal)"); };
-    if (!((a->vertexPipelineStoresAndAtomics) == (b->vertexPipelineStoresAndAtomics))) { onFail("a->vertexPipelineStoresAndAtomics (Error: Value not equal)"); };
-    if (!((a->fragmentStoresAndAtomics) == (b->fragmentStoresAndAtomics))) { onFail("a->fragmentStoresAndAtomics (Error: Value not equal)"); };
-    if (!((a->shaderTessellationAndGeometryPointSize) == (b->shaderTessellationAndGeometryPointSize))) { onFail("a->shaderTessellationAndGeometryPointSize (Error: Value not equal)"); };
-    if (!((a->shaderImageGatherExtended) == (b->shaderImageGatherExtended))) { onFail("a->shaderImageGatherExtended (Error: Value not equal)"); };
-    if (!((a->shaderStorageImageExtendedFormats) == (b->shaderStorageImageExtendedFormats))) { onFail("a->shaderStorageImageExtendedFormats (Error: Value not equal)"); };
-    if (!((a->shaderStorageImageMultisample) == (b->shaderStorageImageMultisample))) { onFail("a->shaderStorageImageMultisample (Error: Value not equal)"); };
-    if (!((a->shaderStorageImageReadWithoutFormat) == (b->shaderStorageImageReadWithoutFormat))) { onFail("a->shaderStorageImageReadWithoutFormat (Error: Value not equal)"); };
-    if (!((a->shaderStorageImageWriteWithoutFormat) == (b->shaderStorageImageWriteWithoutFormat))) { onFail("a->shaderStorageImageWriteWithoutFormat (Error: Value not equal)"); };
-    if (!((a->shaderUniformBufferArrayDynamicIndexing) == (b->shaderUniformBufferArrayDynamicIndexing))) { onFail("a->shaderUniformBufferArrayDynamicIndexing (Error: Value not equal)"); };
-    if (!((a->shaderSampledImageArrayDynamicIndexing) == (b->shaderSampledImageArrayDynamicIndexing))) { onFail("a->shaderSampledImageArrayDynamicIndexing (Error: Value not equal)"); };
-    if (!((a->shaderStorageBufferArrayDynamicIndexing) == (b->shaderStorageBufferArrayDynamicIndexing))) { onFail("a->shaderStorageBufferArrayDynamicIndexing (Error: Value not equal)"); };
-    if (!((a->shaderStorageImageArrayDynamicIndexing) == (b->shaderStorageImageArrayDynamicIndexing))) { onFail("a->shaderStorageImageArrayDynamicIndexing (Error: Value not equal)"); };
-    if (!((a->shaderClipDistance) == (b->shaderClipDistance))) { onFail("a->shaderClipDistance (Error: Value not equal)"); };
-    if (!((a->shaderCullDistance) == (b->shaderCullDistance))) { onFail("a->shaderCullDistance (Error: Value not equal)"); };
-    if (!((a->shaderFloat64) == (b->shaderFloat64))) { onFail("a->shaderFloat64 (Error: Value not equal)"); };
-    if (!((a->shaderInt64) == (b->shaderInt64))) { onFail("a->shaderInt64 (Error: Value not equal)"); };
-    if (!((a->shaderInt16) == (b->shaderInt16))) { onFail("a->shaderInt16 (Error: Value not equal)"); };
-    if (!((a->shaderResourceResidency) == (b->shaderResourceResidency))) { onFail("a->shaderResourceResidency (Error: Value not equal)"); };
-    if (!((a->shaderResourceMinLod) == (b->shaderResourceMinLod))) { onFail("a->shaderResourceMinLod (Error: Value not equal)"); };
-    if (!((a->sparseBinding) == (b->sparseBinding))) { onFail("a->sparseBinding (Error: Value not equal)"); };
-    if (!((a->sparseResidencyBuffer) == (b->sparseResidencyBuffer))) { onFail("a->sparseResidencyBuffer (Error: Value not equal)"); };
-    if (!((a->sparseResidencyImage2D) == (b->sparseResidencyImage2D))) { onFail("a->sparseResidencyImage2D (Error: Value not equal)"); };
-    if (!((a->sparseResidencyImage3D) == (b->sparseResidencyImage3D))) { onFail("a->sparseResidencyImage3D (Error: Value not equal)"); };
-    if (!((a->sparseResidency2Samples) == (b->sparseResidency2Samples))) { onFail("a->sparseResidency2Samples (Error: Value not equal)"); };
-    if (!((a->sparseResidency4Samples) == (b->sparseResidency4Samples))) { onFail("a->sparseResidency4Samples (Error: Value not equal)"); };
-    if (!((a->sparseResidency8Samples) == (b->sparseResidency8Samples))) { onFail("a->sparseResidency8Samples (Error: Value not equal)"); };
-    if (!((a->sparseResidency16Samples) == (b->sparseResidency16Samples))) { onFail("a->sparseResidency16Samples (Error: Value not equal)"); };
-    if (!((a->sparseResidencyAliased) == (b->sparseResidencyAliased))) { onFail("a->sparseResidencyAliased (Error: Value not equal)"); };
-    if (!((a->variableMultisampleRate) == (b->variableMultisampleRate))) { onFail("a->variableMultisampleRate (Error: Value not equal)"); };
-    if (!((a->inheritedQueries) == (b->inheritedQueries))) { onFail("a->inheritedQueries (Error: Value not equal)"); };
+void checkEqual_VkPhysicalDeviceFeatures(const VkPhysicalDeviceFeatures* a,
+                                         const VkPhysicalDeviceFeatures* b,
+                                         OnFailCompareFunc onFail) {
+    if (!((a->robustBufferAccess) == (b->robustBufferAccess))) {
+        onFail("a->robustBufferAccess (Error: Value not equal)");
+    };
+    if (!((a->fullDrawIndexUint32) == (b->fullDrawIndexUint32))) {
+        onFail("a->fullDrawIndexUint32 (Error: Value not equal)");
+    };
+    if (!((a->imageCubeArray) == (b->imageCubeArray))) {
+        onFail("a->imageCubeArray (Error: Value not equal)");
+    };
+    if (!((a->independentBlend) == (b->independentBlend))) {
+        onFail("a->independentBlend (Error: Value not equal)");
+    };
+    if (!((a->geometryShader) == (b->geometryShader))) {
+        onFail("a->geometryShader (Error: Value not equal)");
+    };
+    if (!((a->tessellationShader) == (b->tessellationShader))) {
+        onFail("a->tessellationShader (Error: Value not equal)");
+    };
+    if (!((a->sampleRateShading) == (b->sampleRateShading))) {
+        onFail("a->sampleRateShading (Error: Value not equal)");
+    };
+    if (!((a->dualSrcBlend) == (b->dualSrcBlend))) {
+        onFail("a->dualSrcBlend (Error: Value not equal)");
+    };
+    if (!((a->logicOp) == (b->logicOp))) {
+        onFail("a->logicOp (Error: Value not equal)");
+    };
+    if (!((a->multiDrawIndirect) == (b->multiDrawIndirect))) {
+        onFail("a->multiDrawIndirect (Error: Value not equal)");
+    };
+    if (!((a->drawIndirectFirstInstance) == (b->drawIndirectFirstInstance))) {
+        onFail("a->drawIndirectFirstInstance (Error: Value not equal)");
+    };
+    if (!((a->depthClamp) == (b->depthClamp))) {
+        onFail("a->depthClamp (Error: Value not equal)");
+    };
+    if (!((a->depthBiasClamp) == (b->depthBiasClamp))) {
+        onFail("a->depthBiasClamp (Error: Value not equal)");
+    };
+    if (!((a->fillModeNonSolid) == (b->fillModeNonSolid))) {
+        onFail("a->fillModeNonSolid (Error: Value not equal)");
+    };
+    if (!((a->depthBounds) == (b->depthBounds))) {
+        onFail("a->depthBounds (Error: Value not equal)");
+    };
+    if (!((a->wideLines) == (b->wideLines))) {
+        onFail("a->wideLines (Error: Value not equal)");
+    };
+    if (!((a->largePoints) == (b->largePoints))) {
+        onFail("a->largePoints (Error: Value not equal)");
+    };
+    if (!((a->alphaToOne) == (b->alphaToOne))) {
+        onFail("a->alphaToOne (Error: Value not equal)");
+    };
+    if (!((a->multiViewport) == (b->multiViewport))) {
+        onFail("a->multiViewport (Error: Value not equal)");
+    };
+    if (!((a->samplerAnisotropy) == (b->samplerAnisotropy))) {
+        onFail("a->samplerAnisotropy (Error: Value not equal)");
+    };
+    if (!((a->textureCompressionETC2) == (b->textureCompressionETC2))) {
+        onFail("a->textureCompressionETC2 (Error: Value not equal)");
+    };
+    if (!((a->textureCompressionASTC_LDR) == (b->textureCompressionASTC_LDR))) {
+        onFail("a->textureCompressionASTC_LDR (Error: Value not equal)");
+    };
+    if (!((a->textureCompressionBC) == (b->textureCompressionBC))) {
+        onFail("a->textureCompressionBC (Error: Value not equal)");
+    };
+    if (!((a->occlusionQueryPrecise) == (b->occlusionQueryPrecise))) {
+        onFail("a->occlusionQueryPrecise (Error: Value not equal)");
+    };
+    if (!((a->pipelineStatisticsQuery) == (b->pipelineStatisticsQuery))) {
+        onFail("a->pipelineStatisticsQuery (Error: Value not equal)");
+    };
+    if (!((a->vertexPipelineStoresAndAtomics) == (b->vertexPipelineStoresAndAtomics))) {
+        onFail("a->vertexPipelineStoresAndAtomics (Error: Value not equal)");
+    };
+    if (!((a->fragmentStoresAndAtomics) == (b->fragmentStoresAndAtomics))) {
+        onFail("a->fragmentStoresAndAtomics (Error: Value not equal)");
+    };
+    if (!((a->shaderTessellationAndGeometryPointSize) ==
+          (b->shaderTessellationAndGeometryPointSize))) {
+        onFail("a->shaderTessellationAndGeometryPointSize (Error: Value not equal)");
+    };
+    if (!((a->shaderImageGatherExtended) == (b->shaderImageGatherExtended))) {
+        onFail("a->shaderImageGatherExtended (Error: Value not equal)");
+    };
+    if (!((a->shaderStorageImageExtendedFormats) == (b->shaderStorageImageExtendedFormats))) {
+        onFail("a->shaderStorageImageExtendedFormats (Error: Value not equal)");
+    };
+    if (!((a->shaderStorageImageMultisample) == (b->shaderStorageImageMultisample))) {
+        onFail("a->shaderStorageImageMultisample (Error: Value not equal)");
+    };
+    if (!((a->shaderStorageImageReadWithoutFormat) == (b->shaderStorageImageReadWithoutFormat))) {
+        onFail("a->shaderStorageImageReadWithoutFormat (Error: Value not equal)");
+    };
+    if (!((a->shaderStorageImageWriteWithoutFormat) == (b->shaderStorageImageWriteWithoutFormat))) {
+        onFail("a->shaderStorageImageWriteWithoutFormat (Error: Value not equal)");
+    };
+    if (!((a->shaderUniformBufferArrayDynamicIndexing) ==
+          (b->shaderUniformBufferArrayDynamicIndexing))) {
+        onFail("a->shaderUniformBufferArrayDynamicIndexing (Error: Value not equal)");
+    };
+    if (!((a->shaderSampledImageArrayDynamicIndexing) ==
+          (b->shaderSampledImageArrayDynamicIndexing))) {
+        onFail("a->shaderSampledImageArrayDynamicIndexing (Error: Value not equal)");
+    };
+    if (!((a->shaderStorageBufferArrayDynamicIndexing) ==
+          (b->shaderStorageBufferArrayDynamicIndexing))) {
+        onFail("a->shaderStorageBufferArrayDynamicIndexing (Error: Value not equal)");
+    };
+    if (!((a->shaderStorageImageArrayDynamicIndexing) ==
+          (b->shaderStorageImageArrayDynamicIndexing))) {
+        onFail("a->shaderStorageImageArrayDynamicIndexing (Error: Value not equal)");
+    };
+    if (!((a->shaderClipDistance) == (b->shaderClipDistance))) {
+        onFail("a->shaderClipDistance (Error: Value not equal)");
+    };
+    if (!((a->shaderCullDistance) == (b->shaderCullDistance))) {
+        onFail("a->shaderCullDistance (Error: Value not equal)");
+    };
+    if (!((a->shaderFloat64) == (b->shaderFloat64))) {
+        onFail("a->shaderFloat64 (Error: Value not equal)");
+    };
+    if (!((a->shaderInt64) == (b->shaderInt64))) {
+        onFail("a->shaderInt64 (Error: Value not equal)");
+    };
+    if (!((a->shaderInt16) == (b->shaderInt16))) {
+        onFail("a->shaderInt16 (Error: Value not equal)");
+    };
+    if (!((a->shaderResourceResidency) == (b->shaderResourceResidency))) {
+        onFail("a->shaderResourceResidency (Error: Value not equal)");
+    };
+    if (!((a->shaderResourceMinLod) == (b->shaderResourceMinLod))) {
+        onFail("a->shaderResourceMinLod (Error: Value not equal)");
+    };
+    if (!((a->sparseBinding) == (b->sparseBinding))) {
+        onFail("a->sparseBinding (Error: Value not equal)");
+    };
+    if (!((a->sparseResidencyBuffer) == (b->sparseResidencyBuffer))) {
+        onFail("a->sparseResidencyBuffer (Error: Value not equal)");
+    };
+    if (!((a->sparseResidencyImage2D) == (b->sparseResidencyImage2D))) {
+        onFail("a->sparseResidencyImage2D (Error: Value not equal)");
+    };
+    if (!((a->sparseResidencyImage3D) == (b->sparseResidencyImage3D))) {
+        onFail("a->sparseResidencyImage3D (Error: Value not equal)");
+    };
+    if (!((a->sparseResidency2Samples) == (b->sparseResidency2Samples))) {
+        onFail("a->sparseResidency2Samples (Error: Value not equal)");
+    };
+    if (!((a->sparseResidency4Samples) == (b->sparseResidency4Samples))) {
+        onFail("a->sparseResidency4Samples (Error: Value not equal)");
+    };
+    if (!((a->sparseResidency8Samples) == (b->sparseResidency8Samples))) {
+        onFail("a->sparseResidency8Samples (Error: Value not equal)");
+    };
+    if (!((a->sparseResidency16Samples) == (b->sparseResidency16Samples))) {
+        onFail("a->sparseResidency16Samples (Error: Value not equal)");
+    };
+    if (!((a->sparseResidencyAliased) == (b->sparseResidencyAliased))) {
+        onFail("a->sparseResidencyAliased (Error: Value not equal)");
+    };
+    if (!((a->variableMultisampleRate) == (b->variableMultisampleRate))) {
+        onFail("a->variableMultisampleRate (Error: Value not equal)");
+    };
+    if (!((a->inheritedQueries) == (b->inheritedQueries))) {
+        onFail("a->inheritedQueries (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkPhysicalDeviceLimits(
-    const VkPhysicalDeviceLimits* a,
-    const VkPhysicalDeviceLimits* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->maxImageDimension1D) == (b->maxImageDimension1D))) { onFail("a->maxImageDimension1D (Error: Value not equal)"); };
-    if (!((a->maxImageDimension2D) == (b->maxImageDimension2D))) { onFail("a->maxImageDimension2D (Error: Value not equal)"); };
-    if (!((a->maxImageDimension3D) == (b->maxImageDimension3D))) { onFail("a->maxImageDimension3D (Error: Value not equal)"); };
-    if (!((a->maxImageDimensionCube) == (b->maxImageDimensionCube))) { onFail("a->maxImageDimensionCube (Error: Value not equal)"); };
-    if (!((a->maxImageArrayLayers) == (b->maxImageArrayLayers))) { onFail("a->maxImageArrayLayers (Error: Value not equal)"); };
-    if (!((a->maxTexelBufferElements) == (b->maxTexelBufferElements))) { onFail("a->maxTexelBufferElements (Error: Value not equal)"); };
-    if (!((a->maxUniformBufferRange) == (b->maxUniformBufferRange))) { onFail("a->maxUniformBufferRange (Error: Value not equal)"); };
-    if (!((a->maxStorageBufferRange) == (b->maxStorageBufferRange))) { onFail("a->maxStorageBufferRange (Error: Value not equal)"); };
-    if (!((a->maxPushConstantsSize) == (b->maxPushConstantsSize))) { onFail("a->maxPushConstantsSize (Error: Value not equal)"); };
-    if (!((a->maxMemoryAllocationCount) == (b->maxMemoryAllocationCount))) { onFail("a->maxMemoryAllocationCount (Error: Value not equal)"); };
-    if (!((a->maxSamplerAllocationCount) == (b->maxSamplerAllocationCount))) { onFail("a->maxSamplerAllocationCount (Error: Value not equal)"); };
-    if (!((a->bufferImageGranularity) == (b->bufferImageGranularity))) { onFail("a->bufferImageGranularity (Error: Value not equal)"); };
-    if (!((a->sparseAddressSpaceSize) == (b->sparseAddressSpaceSize))) { onFail("a->sparseAddressSpaceSize (Error: Value not equal)"); };
-    if (!((a->maxBoundDescriptorSets) == (b->maxBoundDescriptorSets))) { onFail("a->maxBoundDescriptorSets (Error: Value not equal)"); };
-    if (!((a->maxPerStageDescriptorSamplers) == (b->maxPerStageDescriptorSamplers))) { onFail("a->maxPerStageDescriptorSamplers (Error: Value not equal)"); };
-    if (!((a->maxPerStageDescriptorUniformBuffers) == (b->maxPerStageDescriptorUniformBuffers))) { onFail("a->maxPerStageDescriptorUniformBuffers (Error: Value not equal)"); };
-    if (!((a->maxPerStageDescriptorStorageBuffers) == (b->maxPerStageDescriptorStorageBuffers))) { onFail("a->maxPerStageDescriptorStorageBuffers (Error: Value not equal)"); };
-    if (!((a->maxPerStageDescriptorSampledImages) == (b->maxPerStageDescriptorSampledImages))) { onFail("a->maxPerStageDescriptorSampledImages (Error: Value not equal)"); };
-    if (!((a->maxPerStageDescriptorStorageImages) == (b->maxPerStageDescriptorStorageImages))) { onFail("a->maxPerStageDescriptorStorageImages (Error: Value not equal)"); };
-    if (!((a->maxPerStageDescriptorInputAttachments) == (b->maxPerStageDescriptorInputAttachments))) { onFail("a->maxPerStageDescriptorInputAttachments (Error: Value not equal)"); };
-    if (!((a->maxPerStageResources) == (b->maxPerStageResources))) { onFail("a->maxPerStageResources (Error: Value not equal)"); };
-    if (!((a->maxDescriptorSetSamplers) == (b->maxDescriptorSetSamplers))) { onFail("a->maxDescriptorSetSamplers (Error: Value not equal)"); };
-    if (!((a->maxDescriptorSetUniformBuffers) == (b->maxDescriptorSetUniformBuffers))) { onFail("a->maxDescriptorSetUniformBuffers (Error: Value not equal)"); };
-    if (!((a->maxDescriptorSetUniformBuffersDynamic) == (b->maxDescriptorSetUniformBuffersDynamic))) { onFail("a->maxDescriptorSetUniformBuffersDynamic (Error: Value not equal)"); };
-    if (!((a->maxDescriptorSetStorageBuffers) == (b->maxDescriptorSetStorageBuffers))) { onFail("a->maxDescriptorSetStorageBuffers (Error: Value not equal)"); };
-    if (!((a->maxDescriptorSetStorageBuffersDynamic) == (b->maxDescriptorSetStorageBuffersDynamic))) { onFail("a->maxDescriptorSetStorageBuffersDynamic (Error: Value not equal)"); };
-    if (!((a->maxDescriptorSetSampledImages) == (b->maxDescriptorSetSampledImages))) { onFail("a->maxDescriptorSetSampledImages (Error: Value not equal)"); };
-    if (!((a->maxDescriptorSetStorageImages) == (b->maxDescriptorSetStorageImages))) { onFail("a->maxDescriptorSetStorageImages (Error: Value not equal)"); };
-    if (!((a->maxDescriptorSetInputAttachments) == (b->maxDescriptorSetInputAttachments))) { onFail("a->maxDescriptorSetInputAttachments (Error: Value not equal)"); };
-    if (!((a->maxVertexInputAttributes) == (b->maxVertexInputAttributes))) { onFail("a->maxVertexInputAttributes (Error: Value not equal)"); };
-    if (!((a->maxVertexInputBindings) == (b->maxVertexInputBindings))) { onFail("a->maxVertexInputBindings (Error: Value not equal)"); };
-    if (!((a->maxVertexInputAttributeOffset) == (b->maxVertexInputAttributeOffset))) { onFail("a->maxVertexInputAttributeOffset (Error: Value not equal)"); };
-    if (!((a->maxVertexInputBindingStride) == (b->maxVertexInputBindingStride))) { onFail("a->maxVertexInputBindingStride (Error: Value not equal)"); };
-    if (!((a->maxVertexOutputComponents) == (b->maxVertexOutputComponents))) { onFail("a->maxVertexOutputComponents (Error: Value not equal)"); };
-    if (!((a->maxTessellationGenerationLevel) == (b->maxTessellationGenerationLevel))) { onFail("a->maxTessellationGenerationLevel (Error: Value not equal)"); };
-    if (!((a->maxTessellationPatchSize) == (b->maxTessellationPatchSize))) { onFail("a->maxTessellationPatchSize (Error: Value not equal)"); };
-    if (!((a->maxTessellationControlPerVertexInputComponents) == (b->maxTessellationControlPerVertexInputComponents))) { onFail("a->maxTessellationControlPerVertexInputComponents (Error: Value not equal)"); };
-    if (!((a->maxTessellationControlPerVertexOutputComponents) == (b->maxTessellationControlPerVertexOutputComponents))) { onFail("a->maxTessellationControlPerVertexOutputComponents (Error: Value not equal)"); };
-    if (!((a->maxTessellationControlPerPatchOutputComponents) == (b->maxTessellationControlPerPatchOutputComponents))) { onFail("a->maxTessellationControlPerPatchOutputComponents (Error: Value not equal)"); };
-    if (!((a->maxTessellationControlTotalOutputComponents) == (b->maxTessellationControlTotalOutputComponents))) { onFail("a->maxTessellationControlTotalOutputComponents (Error: Value not equal)"); };
-    if (!((a->maxTessellationEvaluationInputComponents) == (b->maxTessellationEvaluationInputComponents))) { onFail("a->maxTessellationEvaluationInputComponents (Error: Value not equal)"); };
-    if (!((a->maxTessellationEvaluationOutputComponents) == (b->maxTessellationEvaluationOutputComponents))) { onFail("a->maxTessellationEvaluationOutputComponents (Error: Value not equal)"); };
-    if (!((a->maxGeometryShaderInvocations) == (b->maxGeometryShaderInvocations))) { onFail("a->maxGeometryShaderInvocations (Error: Value not equal)"); };
-    if (!((a->maxGeometryInputComponents) == (b->maxGeometryInputComponents))) { onFail("a->maxGeometryInputComponents (Error: Value not equal)"); };
-    if (!((a->maxGeometryOutputComponents) == (b->maxGeometryOutputComponents))) { onFail("a->maxGeometryOutputComponents (Error: Value not equal)"); };
-    if (!((a->maxGeometryOutputVertices) == (b->maxGeometryOutputVertices))) { onFail("a->maxGeometryOutputVertices (Error: Value not equal)"); };
-    if (!((a->maxGeometryTotalOutputComponents) == (b->maxGeometryTotalOutputComponents))) { onFail("a->maxGeometryTotalOutputComponents (Error: Value not equal)"); };
-    if (!((a->maxFragmentInputComponents) == (b->maxFragmentInputComponents))) { onFail("a->maxFragmentInputComponents (Error: Value not equal)"); };
-    if (!((a->maxFragmentOutputAttachments) == (b->maxFragmentOutputAttachments))) { onFail("a->maxFragmentOutputAttachments (Error: Value not equal)"); };
-    if (!((a->maxFragmentDualSrcAttachments) == (b->maxFragmentDualSrcAttachments))) { onFail("a->maxFragmentDualSrcAttachments (Error: Value not equal)"); };
-    if (!((a->maxFragmentCombinedOutputResources) == (b->maxFragmentCombinedOutputResources))) { onFail("a->maxFragmentCombinedOutputResources (Error: Value not equal)"); };
-    if (!((a->maxComputeSharedMemorySize) == (b->maxComputeSharedMemorySize))) { onFail("a->maxComputeSharedMemorySize (Error: Value not equal)"); };
-    if (!((memcmp(a->maxComputeWorkGroupCount, b->maxComputeWorkGroupCount, 3 * sizeof(uint32_t)) == 0))) { onFail("a->maxComputeWorkGroupCount (Error: Unequal static array)"); };
-    if (!((a->maxComputeWorkGroupInvocations) == (b->maxComputeWorkGroupInvocations))) { onFail("a->maxComputeWorkGroupInvocations (Error: Value not equal)"); };
-    if (!((memcmp(a->maxComputeWorkGroupSize, b->maxComputeWorkGroupSize, 3 * sizeof(uint32_t)) == 0))) { onFail("a->maxComputeWorkGroupSize (Error: Unequal static array)"); };
-    if (!((a->subPixelPrecisionBits) == (b->subPixelPrecisionBits))) { onFail("a->subPixelPrecisionBits (Error: Value not equal)"); };
-    if (!((a->subTexelPrecisionBits) == (b->subTexelPrecisionBits))) { onFail("a->subTexelPrecisionBits (Error: Value not equal)"); };
-    if (!((a->mipmapPrecisionBits) == (b->mipmapPrecisionBits))) { onFail("a->mipmapPrecisionBits (Error: Value not equal)"); };
-    if (!((a->maxDrawIndexedIndexValue) == (b->maxDrawIndexedIndexValue))) { onFail("a->maxDrawIndexedIndexValue (Error: Value not equal)"); };
-    if (!((a->maxDrawIndirectCount) == (b->maxDrawIndirectCount))) { onFail("a->maxDrawIndirectCount (Error: Value not equal)"); };
-    if (!((a->maxSamplerLodBias) == (b->maxSamplerLodBias))) { onFail("a->maxSamplerLodBias (Error: Value not equal)"); };
-    if (!((a->maxSamplerAnisotropy) == (b->maxSamplerAnisotropy))) { onFail("a->maxSamplerAnisotropy (Error: Value not equal)"); };
-    if (!((a->maxViewports) == (b->maxViewports))) { onFail("a->maxViewports (Error: Value not equal)"); };
-    if (!((memcmp(a->maxViewportDimensions, b->maxViewportDimensions, 2 * sizeof(uint32_t)) == 0))) { onFail("a->maxViewportDimensions (Error: Unequal static array)"); };
-    if (!((memcmp(a->viewportBoundsRange, b->viewportBoundsRange, 2 * sizeof(float)) == 0))) { onFail("a->viewportBoundsRange (Error: Unequal static array)"); };
-    if (!((a->viewportSubPixelBits) == (b->viewportSubPixelBits))) { onFail("a->viewportSubPixelBits (Error: Value not equal)"); };
-    if (!((a->minMemoryMapAlignment) == (b->minMemoryMapAlignment))) { onFail("a->minMemoryMapAlignment (Error: Value not equal)"); };
-    if (!((a->minTexelBufferOffsetAlignment) == (b->minTexelBufferOffsetAlignment))) { onFail("a->minTexelBufferOffsetAlignment (Error: Value not equal)"); };
-    if (!((a->minUniformBufferOffsetAlignment) == (b->minUniformBufferOffsetAlignment))) { onFail("a->minUniformBufferOffsetAlignment (Error: Value not equal)"); };
-    if (!((a->minStorageBufferOffsetAlignment) == (b->minStorageBufferOffsetAlignment))) { onFail("a->minStorageBufferOffsetAlignment (Error: Value not equal)"); };
-    if (!((a->minTexelOffset) == (b->minTexelOffset))) { onFail("a->minTexelOffset (Error: Value not equal)"); };
-    if (!((a->maxTexelOffset) == (b->maxTexelOffset))) { onFail("a->maxTexelOffset (Error: Value not equal)"); };
-    if (!((a->minTexelGatherOffset) == (b->minTexelGatherOffset))) { onFail("a->minTexelGatherOffset (Error: Value not equal)"); };
-    if (!((a->maxTexelGatherOffset) == (b->maxTexelGatherOffset))) { onFail("a->maxTexelGatherOffset (Error: Value not equal)"); };
-    if (!((a->minInterpolationOffset) == (b->minInterpolationOffset))) { onFail("a->minInterpolationOffset (Error: Value not equal)"); };
-    if (!((a->maxInterpolationOffset) == (b->maxInterpolationOffset))) { onFail("a->maxInterpolationOffset (Error: Value not equal)"); };
-    if (!((a->subPixelInterpolationOffsetBits) == (b->subPixelInterpolationOffsetBits))) { onFail("a->subPixelInterpolationOffsetBits (Error: Value not equal)"); };
-    if (!((a->maxFramebufferWidth) == (b->maxFramebufferWidth))) { onFail("a->maxFramebufferWidth (Error: Value not equal)"); };
-    if (!((a->maxFramebufferHeight) == (b->maxFramebufferHeight))) { onFail("a->maxFramebufferHeight (Error: Value not equal)"); };
-    if (!((a->maxFramebufferLayers) == (b->maxFramebufferLayers))) { onFail("a->maxFramebufferLayers (Error: Value not equal)"); };
-    if (!((a->framebufferColorSampleCounts) == (b->framebufferColorSampleCounts))) { onFail("a->framebufferColorSampleCounts (Error: Value not equal)"); };
-    if (!((a->framebufferDepthSampleCounts) == (b->framebufferDepthSampleCounts))) { onFail("a->framebufferDepthSampleCounts (Error: Value not equal)"); };
-    if (!((a->framebufferStencilSampleCounts) == (b->framebufferStencilSampleCounts))) { onFail("a->framebufferStencilSampleCounts (Error: Value not equal)"); };
-    if (!((a->framebufferNoAttachmentsSampleCounts) == (b->framebufferNoAttachmentsSampleCounts))) { onFail("a->framebufferNoAttachmentsSampleCounts (Error: Value not equal)"); };
-    if (!((a->maxColorAttachments) == (b->maxColorAttachments))) { onFail("a->maxColorAttachments (Error: Value not equal)"); };
-    if (!((a->sampledImageColorSampleCounts) == (b->sampledImageColorSampleCounts))) { onFail("a->sampledImageColorSampleCounts (Error: Value not equal)"); };
-    if (!((a->sampledImageIntegerSampleCounts) == (b->sampledImageIntegerSampleCounts))) { onFail("a->sampledImageIntegerSampleCounts (Error: Value not equal)"); };
-    if (!((a->sampledImageDepthSampleCounts) == (b->sampledImageDepthSampleCounts))) { onFail("a->sampledImageDepthSampleCounts (Error: Value not equal)"); };
-    if (!((a->sampledImageStencilSampleCounts) == (b->sampledImageStencilSampleCounts))) { onFail("a->sampledImageStencilSampleCounts (Error: Value not equal)"); };
-    if (!((a->storageImageSampleCounts) == (b->storageImageSampleCounts))) { onFail("a->storageImageSampleCounts (Error: Value not equal)"); };
-    if (!((a->maxSampleMaskWords) == (b->maxSampleMaskWords))) { onFail("a->maxSampleMaskWords (Error: Value not equal)"); };
-    if (!((a->timestampComputeAndGraphics) == (b->timestampComputeAndGraphics))) { onFail("a->timestampComputeAndGraphics (Error: Value not equal)"); };
-    if (!((a->timestampPeriod) == (b->timestampPeriod))) { onFail("a->timestampPeriod (Error: Value not equal)"); };
-    if (!((a->maxClipDistances) == (b->maxClipDistances))) { onFail("a->maxClipDistances (Error: Value not equal)"); };
-    if (!((a->maxCullDistances) == (b->maxCullDistances))) { onFail("a->maxCullDistances (Error: Value not equal)"); };
-    if (!((a->maxCombinedClipAndCullDistances) == (b->maxCombinedClipAndCullDistances))) { onFail("a->maxCombinedClipAndCullDistances (Error: Value not equal)"); };
-    if (!((a->discreteQueuePriorities) == (b->discreteQueuePriorities))) { onFail("a->discreteQueuePriorities (Error: Value not equal)"); };
-    if (!((memcmp(a->pointSizeRange, b->pointSizeRange, 2 * sizeof(float)) == 0))) { onFail("a->pointSizeRange (Error: Unequal static array)"); };
-    if (!((memcmp(a->lineWidthRange, b->lineWidthRange, 2 * sizeof(float)) == 0))) { onFail("a->lineWidthRange (Error: Unequal static array)"); };
-    if (!((a->pointSizeGranularity) == (b->pointSizeGranularity))) { onFail("a->pointSizeGranularity (Error: Value not equal)"); };
-    if (!((a->lineWidthGranularity) == (b->lineWidthGranularity))) { onFail("a->lineWidthGranularity (Error: Value not equal)"); };
-    if (!((a->strictLines) == (b->strictLines))) { onFail("a->strictLines (Error: Value not equal)"); };
-    if (!((a->standardSampleLocations) == (b->standardSampleLocations))) { onFail("a->standardSampleLocations (Error: Value not equal)"); };
-    if (!((a->optimalBufferCopyOffsetAlignment) == (b->optimalBufferCopyOffsetAlignment))) { onFail("a->optimalBufferCopyOffsetAlignment (Error: Value not equal)"); };
-    if (!((a->optimalBufferCopyRowPitchAlignment) == (b->optimalBufferCopyRowPitchAlignment))) { onFail("a->optimalBufferCopyRowPitchAlignment (Error: Value not equal)"); };
-    if (!((a->nonCoherentAtomSize) == (b->nonCoherentAtomSize))) { onFail("a->nonCoherentAtomSize (Error: Value not equal)"); };
+void checkEqual_VkPhysicalDeviceLimits(const VkPhysicalDeviceLimits* a,
+                                       const VkPhysicalDeviceLimits* b, OnFailCompareFunc onFail) {
+    if (!((a->maxImageDimension1D) == (b->maxImageDimension1D))) {
+        onFail("a->maxImageDimension1D (Error: Value not equal)");
+    };
+    if (!((a->maxImageDimension2D) == (b->maxImageDimension2D))) {
+        onFail("a->maxImageDimension2D (Error: Value not equal)");
+    };
+    if (!((a->maxImageDimension3D) == (b->maxImageDimension3D))) {
+        onFail("a->maxImageDimension3D (Error: Value not equal)");
+    };
+    if (!((a->maxImageDimensionCube) == (b->maxImageDimensionCube))) {
+        onFail("a->maxImageDimensionCube (Error: Value not equal)");
+    };
+    if (!((a->maxImageArrayLayers) == (b->maxImageArrayLayers))) {
+        onFail("a->maxImageArrayLayers (Error: Value not equal)");
+    };
+    if (!((a->maxTexelBufferElements) == (b->maxTexelBufferElements))) {
+        onFail("a->maxTexelBufferElements (Error: Value not equal)");
+    };
+    if (!((a->maxUniformBufferRange) == (b->maxUniformBufferRange))) {
+        onFail("a->maxUniformBufferRange (Error: Value not equal)");
+    };
+    if (!((a->maxStorageBufferRange) == (b->maxStorageBufferRange))) {
+        onFail("a->maxStorageBufferRange (Error: Value not equal)");
+    };
+    if (!((a->maxPushConstantsSize) == (b->maxPushConstantsSize))) {
+        onFail("a->maxPushConstantsSize (Error: Value not equal)");
+    };
+    if (!((a->maxMemoryAllocationCount) == (b->maxMemoryAllocationCount))) {
+        onFail("a->maxMemoryAllocationCount (Error: Value not equal)");
+    };
+    if (!((a->maxSamplerAllocationCount) == (b->maxSamplerAllocationCount))) {
+        onFail("a->maxSamplerAllocationCount (Error: Value not equal)");
+    };
+    if (!((a->bufferImageGranularity) == (b->bufferImageGranularity))) {
+        onFail("a->bufferImageGranularity (Error: Value not equal)");
+    };
+    if (!((a->sparseAddressSpaceSize) == (b->sparseAddressSpaceSize))) {
+        onFail("a->sparseAddressSpaceSize (Error: Value not equal)");
+    };
+    if (!((a->maxBoundDescriptorSets) == (b->maxBoundDescriptorSets))) {
+        onFail("a->maxBoundDescriptorSets (Error: Value not equal)");
+    };
+    if (!((a->maxPerStageDescriptorSamplers) == (b->maxPerStageDescriptorSamplers))) {
+        onFail("a->maxPerStageDescriptorSamplers (Error: Value not equal)");
+    };
+    if (!((a->maxPerStageDescriptorUniformBuffers) == (b->maxPerStageDescriptorUniformBuffers))) {
+        onFail("a->maxPerStageDescriptorUniformBuffers (Error: Value not equal)");
+    };
+    if (!((a->maxPerStageDescriptorStorageBuffers) == (b->maxPerStageDescriptorStorageBuffers))) {
+        onFail("a->maxPerStageDescriptorStorageBuffers (Error: Value not equal)");
+    };
+    if (!((a->maxPerStageDescriptorSampledImages) == (b->maxPerStageDescriptorSampledImages))) {
+        onFail("a->maxPerStageDescriptorSampledImages (Error: Value not equal)");
+    };
+    if (!((a->maxPerStageDescriptorStorageImages) == (b->maxPerStageDescriptorStorageImages))) {
+        onFail("a->maxPerStageDescriptorStorageImages (Error: Value not equal)");
+    };
+    if (!((a->maxPerStageDescriptorInputAttachments) ==
+          (b->maxPerStageDescriptorInputAttachments))) {
+        onFail("a->maxPerStageDescriptorInputAttachments (Error: Value not equal)");
+    };
+    if (!((a->maxPerStageResources) == (b->maxPerStageResources))) {
+        onFail("a->maxPerStageResources (Error: Value not equal)");
+    };
+    if (!((a->maxDescriptorSetSamplers) == (b->maxDescriptorSetSamplers))) {
+        onFail("a->maxDescriptorSetSamplers (Error: Value not equal)");
+    };
+    if (!((a->maxDescriptorSetUniformBuffers) == (b->maxDescriptorSetUniformBuffers))) {
+        onFail("a->maxDescriptorSetUniformBuffers (Error: Value not equal)");
+    };
+    if (!((a->maxDescriptorSetUniformBuffersDynamic) ==
+          (b->maxDescriptorSetUniformBuffersDynamic))) {
+        onFail("a->maxDescriptorSetUniformBuffersDynamic (Error: Value not equal)");
+    };
+    if (!((a->maxDescriptorSetStorageBuffers) == (b->maxDescriptorSetStorageBuffers))) {
+        onFail("a->maxDescriptorSetStorageBuffers (Error: Value not equal)");
+    };
+    if (!((a->maxDescriptorSetStorageBuffersDynamic) ==
+          (b->maxDescriptorSetStorageBuffersDynamic))) {
+        onFail("a->maxDescriptorSetStorageBuffersDynamic (Error: Value not equal)");
+    };
+    if (!((a->maxDescriptorSetSampledImages) == (b->maxDescriptorSetSampledImages))) {
+        onFail("a->maxDescriptorSetSampledImages (Error: Value not equal)");
+    };
+    if (!((a->maxDescriptorSetStorageImages) == (b->maxDescriptorSetStorageImages))) {
+        onFail("a->maxDescriptorSetStorageImages (Error: Value not equal)");
+    };
+    if (!((a->maxDescriptorSetInputAttachments) == (b->maxDescriptorSetInputAttachments))) {
+        onFail("a->maxDescriptorSetInputAttachments (Error: Value not equal)");
+    };
+    if (!((a->maxVertexInputAttributes) == (b->maxVertexInputAttributes))) {
+        onFail("a->maxVertexInputAttributes (Error: Value not equal)");
+    };
+    if (!((a->maxVertexInputBindings) == (b->maxVertexInputBindings))) {
+        onFail("a->maxVertexInputBindings (Error: Value not equal)");
+    };
+    if (!((a->maxVertexInputAttributeOffset) == (b->maxVertexInputAttributeOffset))) {
+        onFail("a->maxVertexInputAttributeOffset (Error: Value not equal)");
+    };
+    if (!((a->maxVertexInputBindingStride) == (b->maxVertexInputBindingStride))) {
+        onFail("a->maxVertexInputBindingStride (Error: Value not equal)");
+    };
+    if (!((a->maxVertexOutputComponents) == (b->maxVertexOutputComponents))) {
+        onFail("a->maxVertexOutputComponents (Error: Value not equal)");
+    };
+    if (!((a->maxTessellationGenerationLevel) == (b->maxTessellationGenerationLevel))) {
+        onFail("a->maxTessellationGenerationLevel (Error: Value not equal)");
+    };
+    if (!((a->maxTessellationPatchSize) == (b->maxTessellationPatchSize))) {
+        onFail("a->maxTessellationPatchSize (Error: Value not equal)");
+    };
+    if (!((a->maxTessellationControlPerVertexInputComponents) ==
+          (b->maxTessellationControlPerVertexInputComponents))) {
+        onFail("a->maxTessellationControlPerVertexInputComponents (Error: Value not equal)");
+    };
+    if (!((a->maxTessellationControlPerVertexOutputComponents) ==
+          (b->maxTessellationControlPerVertexOutputComponents))) {
+        onFail("a->maxTessellationControlPerVertexOutputComponents (Error: Value not equal)");
+    };
+    if (!((a->maxTessellationControlPerPatchOutputComponents) ==
+          (b->maxTessellationControlPerPatchOutputComponents))) {
+        onFail("a->maxTessellationControlPerPatchOutputComponents (Error: Value not equal)");
+    };
+    if (!((a->maxTessellationControlTotalOutputComponents) ==
+          (b->maxTessellationControlTotalOutputComponents))) {
+        onFail("a->maxTessellationControlTotalOutputComponents (Error: Value not equal)");
+    };
+    if (!((a->maxTessellationEvaluationInputComponents) ==
+          (b->maxTessellationEvaluationInputComponents))) {
+        onFail("a->maxTessellationEvaluationInputComponents (Error: Value not equal)");
+    };
+    if (!((a->maxTessellationEvaluationOutputComponents) ==
+          (b->maxTessellationEvaluationOutputComponents))) {
+        onFail("a->maxTessellationEvaluationOutputComponents (Error: Value not equal)");
+    };
+    if (!((a->maxGeometryShaderInvocations) == (b->maxGeometryShaderInvocations))) {
+        onFail("a->maxGeometryShaderInvocations (Error: Value not equal)");
+    };
+    if (!((a->maxGeometryInputComponents) == (b->maxGeometryInputComponents))) {
+        onFail("a->maxGeometryInputComponents (Error: Value not equal)");
+    };
+    if (!((a->maxGeometryOutputComponents) == (b->maxGeometryOutputComponents))) {
+        onFail("a->maxGeometryOutputComponents (Error: Value not equal)");
+    };
+    if (!((a->maxGeometryOutputVertices) == (b->maxGeometryOutputVertices))) {
+        onFail("a->maxGeometryOutputVertices (Error: Value not equal)");
+    };
+    if (!((a->maxGeometryTotalOutputComponents) == (b->maxGeometryTotalOutputComponents))) {
+        onFail("a->maxGeometryTotalOutputComponents (Error: Value not equal)");
+    };
+    if (!((a->maxFragmentInputComponents) == (b->maxFragmentInputComponents))) {
+        onFail("a->maxFragmentInputComponents (Error: Value not equal)");
+    };
+    if (!((a->maxFragmentOutputAttachments) == (b->maxFragmentOutputAttachments))) {
+        onFail("a->maxFragmentOutputAttachments (Error: Value not equal)");
+    };
+    if (!((a->maxFragmentDualSrcAttachments) == (b->maxFragmentDualSrcAttachments))) {
+        onFail("a->maxFragmentDualSrcAttachments (Error: Value not equal)");
+    };
+    if (!((a->maxFragmentCombinedOutputResources) == (b->maxFragmentCombinedOutputResources))) {
+        onFail("a->maxFragmentCombinedOutputResources (Error: Value not equal)");
+    };
+    if (!((a->maxComputeSharedMemorySize) == (b->maxComputeSharedMemorySize))) {
+        onFail("a->maxComputeSharedMemorySize (Error: Value not equal)");
+    };
+    if (!((memcmp(a->maxComputeWorkGroupCount, b->maxComputeWorkGroupCount, 3 * sizeof(uint32_t)) ==
+           0))) {
+        onFail("a->maxComputeWorkGroupCount (Error: Unequal static array)");
+    };
+    if (!((a->maxComputeWorkGroupInvocations) == (b->maxComputeWorkGroupInvocations))) {
+        onFail("a->maxComputeWorkGroupInvocations (Error: Value not equal)");
+    };
+    if (!((memcmp(a->maxComputeWorkGroupSize, b->maxComputeWorkGroupSize, 3 * sizeof(uint32_t)) ==
+           0))) {
+        onFail("a->maxComputeWorkGroupSize (Error: Unequal static array)");
+    };
+    if (!((a->subPixelPrecisionBits) == (b->subPixelPrecisionBits))) {
+        onFail("a->subPixelPrecisionBits (Error: Value not equal)");
+    };
+    if (!((a->subTexelPrecisionBits) == (b->subTexelPrecisionBits))) {
+        onFail("a->subTexelPrecisionBits (Error: Value not equal)");
+    };
+    if (!((a->mipmapPrecisionBits) == (b->mipmapPrecisionBits))) {
+        onFail("a->mipmapPrecisionBits (Error: Value not equal)");
+    };
+    if (!((a->maxDrawIndexedIndexValue) == (b->maxDrawIndexedIndexValue))) {
+        onFail("a->maxDrawIndexedIndexValue (Error: Value not equal)");
+    };
+    if (!((a->maxDrawIndirectCount) == (b->maxDrawIndirectCount))) {
+        onFail("a->maxDrawIndirectCount (Error: Value not equal)");
+    };
+    if (!((a->maxSamplerLodBias) == (b->maxSamplerLodBias))) {
+        onFail("a->maxSamplerLodBias (Error: Value not equal)");
+    };
+    if (!((a->maxSamplerAnisotropy) == (b->maxSamplerAnisotropy))) {
+        onFail("a->maxSamplerAnisotropy (Error: Value not equal)");
+    };
+    if (!((a->maxViewports) == (b->maxViewports))) {
+        onFail("a->maxViewports (Error: Value not equal)");
+    };
+    if (!((memcmp(a->maxViewportDimensions, b->maxViewportDimensions, 2 * sizeof(uint32_t)) ==
+           0))) {
+        onFail("a->maxViewportDimensions (Error: Unequal static array)");
+    };
+    if (!((memcmp(a->viewportBoundsRange, b->viewportBoundsRange, 2 * sizeof(float)) == 0))) {
+        onFail("a->viewportBoundsRange (Error: Unequal static array)");
+    };
+    if (!((a->viewportSubPixelBits) == (b->viewportSubPixelBits))) {
+        onFail("a->viewportSubPixelBits (Error: Value not equal)");
+    };
+    if (!((a->minMemoryMapAlignment) == (b->minMemoryMapAlignment))) {
+        onFail("a->minMemoryMapAlignment (Error: Value not equal)");
+    };
+    if (!((a->minTexelBufferOffsetAlignment) == (b->minTexelBufferOffsetAlignment))) {
+        onFail("a->minTexelBufferOffsetAlignment (Error: Value not equal)");
+    };
+    if (!((a->minUniformBufferOffsetAlignment) == (b->minUniformBufferOffsetAlignment))) {
+        onFail("a->minUniformBufferOffsetAlignment (Error: Value not equal)");
+    };
+    if (!((a->minStorageBufferOffsetAlignment) == (b->minStorageBufferOffsetAlignment))) {
+        onFail("a->minStorageBufferOffsetAlignment (Error: Value not equal)");
+    };
+    if (!((a->minTexelOffset) == (b->minTexelOffset))) {
+        onFail("a->minTexelOffset (Error: Value not equal)");
+    };
+    if (!((a->maxTexelOffset) == (b->maxTexelOffset))) {
+        onFail("a->maxTexelOffset (Error: Value not equal)");
+    };
+    if (!((a->minTexelGatherOffset) == (b->minTexelGatherOffset))) {
+        onFail("a->minTexelGatherOffset (Error: Value not equal)");
+    };
+    if (!((a->maxTexelGatherOffset) == (b->maxTexelGatherOffset))) {
+        onFail("a->maxTexelGatherOffset (Error: Value not equal)");
+    };
+    if (!((a->minInterpolationOffset) == (b->minInterpolationOffset))) {
+        onFail("a->minInterpolationOffset (Error: Value not equal)");
+    };
+    if (!((a->maxInterpolationOffset) == (b->maxInterpolationOffset))) {
+        onFail("a->maxInterpolationOffset (Error: Value not equal)");
+    };
+    if (!((a->subPixelInterpolationOffsetBits) == (b->subPixelInterpolationOffsetBits))) {
+        onFail("a->subPixelInterpolationOffsetBits (Error: Value not equal)");
+    };
+    if (!((a->maxFramebufferWidth) == (b->maxFramebufferWidth))) {
+        onFail("a->maxFramebufferWidth (Error: Value not equal)");
+    };
+    if (!((a->maxFramebufferHeight) == (b->maxFramebufferHeight))) {
+        onFail("a->maxFramebufferHeight (Error: Value not equal)");
+    };
+    if (!((a->maxFramebufferLayers) == (b->maxFramebufferLayers))) {
+        onFail("a->maxFramebufferLayers (Error: Value not equal)");
+    };
+    if (!((a->framebufferColorSampleCounts) == (b->framebufferColorSampleCounts))) {
+        onFail("a->framebufferColorSampleCounts (Error: Value not equal)");
+    };
+    if (!((a->framebufferDepthSampleCounts) == (b->framebufferDepthSampleCounts))) {
+        onFail("a->framebufferDepthSampleCounts (Error: Value not equal)");
+    };
+    if (!((a->framebufferStencilSampleCounts) == (b->framebufferStencilSampleCounts))) {
+        onFail("a->framebufferStencilSampleCounts (Error: Value not equal)");
+    };
+    if (!((a->framebufferNoAttachmentsSampleCounts) == (b->framebufferNoAttachmentsSampleCounts))) {
+        onFail("a->framebufferNoAttachmentsSampleCounts (Error: Value not equal)");
+    };
+    if (!((a->maxColorAttachments) == (b->maxColorAttachments))) {
+        onFail("a->maxColorAttachments (Error: Value not equal)");
+    };
+    if (!((a->sampledImageColorSampleCounts) == (b->sampledImageColorSampleCounts))) {
+        onFail("a->sampledImageColorSampleCounts (Error: Value not equal)");
+    };
+    if (!((a->sampledImageIntegerSampleCounts) == (b->sampledImageIntegerSampleCounts))) {
+        onFail("a->sampledImageIntegerSampleCounts (Error: Value not equal)");
+    };
+    if (!((a->sampledImageDepthSampleCounts) == (b->sampledImageDepthSampleCounts))) {
+        onFail("a->sampledImageDepthSampleCounts (Error: Value not equal)");
+    };
+    if (!((a->sampledImageStencilSampleCounts) == (b->sampledImageStencilSampleCounts))) {
+        onFail("a->sampledImageStencilSampleCounts (Error: Value not equal)");
+    };
+    if (!((a->storageImageSampleCounts) == (b->storageImageSampleCounts))) {
+        onFail("a->storageImageSampleCounts (Error: Value not equal)");
+    };
+    if (!((a->maxSampleMaskWords) == (b->maxSampleMaskWords))) {
+        onFail("a->maxSampleMaskWords (Error: Value not equal)");
+    };
+    if (!((a->timestampComputeAndGraphics) == (b->timestampComputeAndGraphics))) {
+        onFail("a->timestampComputeAndGraphics (Error: Value not equal)");
+    };
+    if (!((a->timestampPeriod) == (b->timestampPeriod))) {
+        onFail("a->timestampPeriod (Error: Value not equal)");
+    };
+    if (!((a->maxClipDistances) == (b->maxClipDistances))) {
+        onFail("a->maxClipDistances (Error: Value not equal)");
+    };
+    if (!((a->maxCullDistances) == (b->maxCullDistances))) {
+        onFail("a->maxCullDistances (Error: Value not equal)");
+    };
+    if (!((a->maxCombinedClipAndCullDistances) == (b->maxCombinedClipAndCullDistances))) {
+        onFail("a->maxCombinedClipAndCullDistances (Error: Value not equal)");
+    };
+    if (!((a->discreteQueuePriorities) == (b->discreteQueuePriorities))) {
+        onFail("a->discreteQueuePriorities (Error: Value not equal)");
+    };
+    if (!((memcmp(a->pointSizeRange, b->pointSizeRange, 2 * sizeof(float)) == 0))) {
+        onFail("a->pointSizeRange (Error: Unequal static array)");
+    };
+    if (!((memcmp(a->lineWidthRange, b->lineWidthRange, 2 * sizeof(float)) == 0))) {
+        onFail("a->lineWidthRange (Error: Unequal static array)");
+    };
+    if (!((a->pointSizeGranularity) == (b->pointSizeGranularity))) {
+        onFail("a->pointSizeGranularity (Error: Value not equal)");
+    };
+    if (!((a->lineWidthGranularity) == (b->lineWidthGranularity))) {
+        onFail("a->lineWidthGranularity (Error: Value not equal)");
+    };
+    if (!((a->strictLines) == (b->strictLines))) {
+        onFail("a->strictLines (Error: Value not equal)");
+    };
+    if (!((a->standardSampleLocations) == (b->standardSampleLocations))) {
+        onFail("a->standardSampleLocations (Error: Value not equal)");
+    };
+    if (!((a->optimalBufferCopyOffsetAlignment) == (b->optimalBufferCopyOffsetAlignment))) {
+        onFail("a->optimalBufferCopyOffsetAlignment (Error: Value not equal)");
+    };
+    if (!((a->optimalBufferCopyRowPitchAlignment) == (b->optimalBufferCopyRowPitchAlignment))) {
+        onFail("a->optimalBufferCopyRowPitchAlignment (Error: Value not equal)");
+    };
+    if (!((a->nonCoherentAtomSize) == (b->nonCoherentAtomSize))) {
+        onFail("a->nonCoherentAtomSize (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkPhysicalDeviceMemoryProperties(
-    const VkPhysicalDeviceMemoryProperties* a,
-    const VkPhysicalDeviceMemoryProperties* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->memoryTypeCount) == (b->memoryTypeCount))) { onFail("a->memoryTypeCount (Error: Value not equal)"); };
-    if (!((VK_MAX_MEMORY_TYPES) == (VK_MAX_MEMORY_TYPES))) { onFail("a->memoryTypes (Error: Lengths not equal)"); };
-    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_TYPES; ++i)
-    {
+void checkEqual_VkPhysicalDeviceMemoryProperties(const VkPhysicalDeviceMemoryProperties* a,
+                                                 const VkPhysicalDeviceMemoryProperties* b,
+                                                 OnFailCompareFunc onFail) {
+    if (!((a->memoryTypeCount) == (b->memoryTypeCount))) {
+        onFail("a->memoryTypeCount (Error: Value not equal)");
+    };
+    if (!((VK_MAX_MEMORY_TYPES) == (VK_MAX_MEMORY_TYPES))) {
+        onFail("a->memoryTypes (Error: Lengths not equal)");
+    };
+    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_TYPES; ++i) {
         checkEqual_VkMemoryType(a->memoryTypes + i, b->memoryTypes + i, onFail);
     }
-    if (!((a->memoryHeapCount) == (b->memoryHeapCount))) { onFail("a->memoryHeapCount (Error: Value not equal)"); };
-    if (!((VK_MAX_MEMORY_HEAPS) == (VK_MAX_MEMORY_HEAPS))) { onFail("a->memoryHeaps (Error: Lengths not equal)"); };
-    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_HEAPS; ++i)
-    {
+    if (!((a->memoryHeapCount) == (b->memoryHeapCount))) {
+        onFail("a->memoryHeapCount (Error: Value not equal)");
+    };
+    if (!((VK_MAX_MEMORY_HEAPS) == (VK_MAX_MEMORY_HEAPS))) {
+        onFail("a->memoryHeaps (Error: Lengths not equal)");
+    };
+    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_HEAPS; ++i) {
         checkEqual_VkMemoryHeap(a->memoryHeaps + i, b->memoryHeaps + i, onFail);
     }
 }
 
-void checkEqual_VkPhysicalDeviceSparseProperties(
-    const VkPhysicalDeviceSparseProperties* a,
-    const VkPhysicalDeviceSparseProperties* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->residencyStandard2DBlockShape) == (b->residencyStandard2DBlockShape))) { onFail("a->residencyStandard2DBlockShape (Error: Value not equal)"); };
-    if (!((a->residencyStandard2DMultisampleBlockShape) == (b->residencyStandard2DMultisampleBlockShape))) { onFail("a->residencyStandard2DMultisampleBlockShape (Error: Value not equal)"); };
-    if (!((a->residencyStandard3DBlockShape) == (b->residencyStandard3DBlockShape))) { onFail("a->residencyStandard3DBlockShape (Error: Value not equal)"); };
-    if (!((a->residencyAlignedMipSize) == (b->residencyAlignedMipSize))) { onFail("a->residencyAlignedMipSize (Error: Value not equal)"); };
-    if (!((a->residencyNonResidentStrict) == (b->residencyNonResidentStrict))) { onFail("a->residencyNonResidentStrict (Error: Value not equal)"); };
+void checkEqual_VkPhysicalDeviceSparseProperties(const VkPhysicalDeviceSparseProperties* a,
+                                                 const VkPhysicalDeviceSparseProperties* b,
+                                                 OnFailCompareFunc onFail) {
+    if (!((a->residencyStandard2DBlockShape) == (b->residencyStandard2DBlockShape))) {
+        onFail("a->residencyStandard2DBlockShape (Error: Value not equal)");
+    };
+    if (!((a->residencyStandard2DMultisampleBlockShape) ==
+          (b->residencyStandard2DMultisampleBlockShape))) {
+        onFail("a->residencyStandard2DMultisampleBlockShape (Error: Value not equal)");
+    };
+    if (!((a->residencyStandard3DBlockShape) == (b->residencyStandard3DBlockShape))) {
+        onFail("a->residencyStandard3DBlockShape (Error: Value not equal)");
+    };
+    if (!((a->residencyAlignedMipSize) == (b->residencyAlignedMipSize))) {
+        onFail("a->residencyAlignedMipSize (Error: Value not equal)");
+    };
+    if (!((a->residencyNonResidentStrict) == (b->residencyNonResidentStrict))) {
+        onFail("a->residencyNonResidentStrict (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkPhysicalDeviceProperties(
-    const VkPhysicalDeviceProperties* a,
-    const VkPhysicalDeviceProperties* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->apiVersion) == (b->apiVersion))) { onFail("a->apiVersion (Error: Value not equal)"); };
-    if (!((a->driverVersion) == (b->driverVersion))) { onFail("a->driverVersion (Error: Value not equal)"); };
-    if (!((a->vendorID) == (b->vendorID))) { onFail("a->vendorID (Error: Value not equal)"); };
-    if (!((a->deviceID) == (b->deviceID))) { onFail("a->deviceID (Error: Value not equal)"); };
-    if (!((a->deviceType) == (b->deviceType))) { onFail("a->deviceType (Error: Value not equal)"); };
-    if (!((memcmp(a->deviceName, b->deviceName, VK_MAX_PHYSICAL_DEVICE_NAME_SIZE * sizeof(char)) == 0))) { onFail("a->deviceName (Error: Unequal static array)"); };
-    if (!((memcmp(a->pipelineCacheUUID, b->pipelineCacheUUID, VK_UUID_SIZE * sizeof(uint8_t)) == 0))) { onFail("a->pipelineCacheUUID (Error: Unequal static array)"); };
+void checkEqual_VkPhysicalDeviceProperties(const VkPhysicalDeviceProperties* a,
+                                           const VkPhysicalDeviceProperties* b,
+                                           OnFailCompareFunc onFail) {
+    if (!((a->apiVersion) == (b->apiVersion))) {
+        onFail("a->apiVersion (Error: Value not equal)");
+    };
+    if (!((a->driverVersion) == (b->driverVersion))) {
+        onFail("a->driverVersion (Error: Value not equal)");
+    };
+    if (!((a->vendorID) == (b->vendorID))) {
+        onFail("a->vendorID (Error: Value not equal)");
+    };
+    if (!((a->deviceID) == (b->deviceID))) {
+        onFail("a->deviceID (Error: Value not equal)");
+    };
+    if (!((a->deviceType) == (b->deviceType))) {
+        onFail("a->deviceType (Error: Value not equal)");
+    };
+    if (!((memcmp(a->deviceName, b->deviceName, VK_MAX_PHYSICAL_DEVICE_NAME_SIZE * sizeof(char)) ==
+           0))) {
+        onFail("a->deviceName (Error: Unequal static array)");
+    };
+    if (!((memcmp(a->pipelineCacheUUID, b->pipelineCacheUUID, VK_UUID_SIZE * sizeof(uint8_t)) ==
+           0))) {
+        onFail("a->pipelineCacheUUID (Error: Unequal static array)");
+    };
     checkEqual_VkPhysicalDeviceLimits(&a->limits, &b->limits, onFail);
     checkEqual_VkPhysicalDeviceSparseProperties(&a->sparseProperties, &b->sparseProperties, onFail);
 }
 
-void checkEqual_VkQueueFamilyProperties(
-    const VkQueueFamilyProperties* a,
-    const VkQueueFamilyProperties* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->queueFlags) == (b->queueFlags))) { onFail("a->queueFlags (Error: Value not equal)"); };
-    if (!((a->queueCount) == (b->queueCount))) { onFail("a->queueCount (Error: Value not equal)"); };
-    if (!((a->timestampValidBits) == (b->timestampValidBits))) { onFail("a->timestampValidBits (Error: Value not equal)"); };
+void checkEqual_VkQueueFamilyProperties(const VkQueueFamilyProperties* a,
+                                        const VkQueueFamilyProperties* b,
+                                        OnFailCompareFunc onFail) {
+    if (!((a->queueFlags) == (b->queueFlags))) {
+        onFail("a->queueFlags (Error: Value not equal)");
+    };
+    if (!((a->queueCount) == (b->queueCount))) {
+        onFail("a->queueCount (Error: Value not equal)");
+    };
+    if (!((a->timestampValidBits) == (b->timestampValidBits))) {
+        onFail("a->timestampValidBits (Error: Value not equal)");
+    };
     checkEqual_VkExtent3D(&a->minImageTransferGranularity, &b->minImageTransferGranularity, onFail);
 }
 
-void checkEqual_VkDeviceQueueCreateInfo(
-    const VkDeviceQueueCreateInfo* a,
-    const VkDeviceQueueCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDeviceQueueCreateInfo(const VkDeviceQueueCreateInfo* a,
+                                        const VkDeviceQueueCreateInfo* b,
+                                        OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->queueFamilyIndex) == (b->queueFamilyIndex))) { onFail("a->queueFamilyIndex (Error: Value not equal)"); };
-    if (!((a->queueCount) == (b->queueCount))) { onFail("a->queueCount (Error: Value not equal)"); };
-    if (!((a->queueCount) == (b->queueCount))) { onFail("a->pQueuePriorities (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pQueuePriorities, b->pQueuePriorities, a->queueCount * sizeof(const float)) == 0))) { onFail("a->pQueuePriorities (Error: Unequal dyn array)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->queueFamilyIndex) == (b->queueFamilyIndex))) {
+        onFail("a->queueFamilyIndex (Error: Value not equal)");
+    };
+    if (!((a->queueCount) == (b->queueCount))) {
+        onFail("a->queueCount (Error: Value not equal)");
+    };
+    if (!((a->queueCount) == (b->queueCount))) {
+        onFail("a->pQueuePriorities (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pQueuePriorities, b->pQueuePriorities, a->queueCount * sizeof(const float)) ==
+           0))) {
+        onFail("a->pQueuePriorities (Error: Unequal dyn array)");
+    };
 }
 
-void checkEqual_VkDeviceCreateInfo(
-    const VkDeviceCreateInfo* a,
-    const VkDeviceCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDeviceCreateInfo(const VkDeviceCreateInfo* a, const VkDeviceCreateInfo* b,
+                                   OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->queueCreateInfoCount) == (b->queueCreateInfoCount))) { onFail("a->queueCreateInfoCount (Error: Value not equal)"); };
-    if ((a->pQueueCreateInfos) && (b->pQueueCreateInfos))
-    {
-        if (!((a->queueCreateInfoCount) == (b->queueCreateInfoCount))) { onFail("a->pQueueCreateInfos (Error: Lengths not equal)"); };
-        if ((a->queueCreateInfoCount) == (b->queueCreateInfoCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->queueCreateInfoCount; ++i)
-                {
-                    checkEqual_VkDeviceQueueCreateInfo(a->pQueueCreateInfos + i, b->pQueueCreateInfos + i, onFail);
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->queueCreateInfoCount) == (b->queueCreateInfoCount))) {
+        onFail("a->queueCreateInfoCount (Error: Value not equal)");
+    };
+    if ((a->pQueueCreateInfos) && (b->pQueueCreateInfos)) {
+        if (!((a->queueCreateInfoCount) == (b->queueCreateInfoCount))) {
+            onFail("a->pQueueCreateInfos (Error: Lengths not equal)");
+        };
+        if ((a->queueCreateInfoCount) == (b->queueCreateInfoCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->queueCreateInfoCount; ++i) {
+                    checkEqual_VkDeviceQueueCreateInfo(a->pQueueCreateInfos + i,
+                                                       b->pQueueCreateInfos + i, onFail);
                 }
             }
         }
     }
-    if (!((a->enabledLayerCount) == (b->enabledLayerCount))) { onFail("a->enabledLayerCount (Error: Value not equal)"); };
-    if (!((!(a->ppEnabledLayerNames) && !(b->ppEnabledLayerNames)) || ((a->ppEnabledLayerNames) && (b->ppEnabledLayerNames)))) { onFail("a->ppEnabledLayerNames (Error: Mismatch in string array pointer nullness)"); };
-    if (!((a->enabledLayerCount) == (b->enabledLayerCount))) { onFail("a->ppEnabledLayerNames (Error: Lengths not equal in string array)"); };
-    if (!((a->enabledLayerCount) == (b->enabledLayerCount))) { onFail("a->ppEnabledLayerNames (Error: Lengths not equal in string array)"); };
-    if ((a->enabledLayerCount) == (b->enabledLayerCount) && (a->ppEnabledLayerNames) && (b->ppEnabledLayerNames))
-    {
-        if (a)
-        {
-            for (uint32_t i = 0; i < (uint32_t)a->enabledLayerCount; ++i)
-            {
-                if (!((strcmp(*(a->ppEnabledLayerNames + i), *(b->ppEnabledLayerNames + i)) == 0))) { onFail("a->ppEnabledLayerNames (Error: Unequal string in string array)"); };
+    if (!((a->enabledLayerCount) == (b->enabledLayerCount))) {
+        onFail("a->enabledLayerCount (Error: Value not equal)");
+    };
+    if (!((!(a->ppEnabledLayerNames) && !(b->ppEnabledLayerNames)) ||
+          ((a->ppEnabledLayerNames) && (b->ppEnabledLayerNames)))) {
+        onFail("a->ppEnabledLayerNames (Error: Mismatch in string array pointer nullness)");
+    };
+    if (!((a->enabledLayerCount) == (b->enabledLayerCount))) {
+        onFail("a->ppEnabledLayerNames (Error: Lengths not equal in string array)");
+    };
+    if (!((a->enabledLayerCount) == (b->enabledLayerCount))) {
+        onFail("a->ppEnabledLayerNames (Error: Lengths not equal in string array)");
+    };
+    if ((a->enabledLayerCount) == (b->enabledLayerCount) && (a->ppEnabledLayerNames) &&
+        (b->ppEnabledLayerNames)) {
+        if (a) {
+            for (uint32_t i = 0; i < (uint32_t)a->enabledLayerCount; ++i) {
+                if (!((strcmp(*(a->ppEnabledLayerNames + i), *(b->ppEnabledLayerNames + i)) ==
+                       0))) {
+                    onFail("a->ppEnabledLayerNames (Error: Unequal string in string array)");
+                };
             }
         }
     }
-    if (!((a->enabledExtensionCount) == (b->enabledExtensionCount))) { onFail("a->enabledExtensionCount (Error: Value not equal)"); };
-    if (!((!(a->ppEnabledExtensionNames) && !(b->ppEnabledExtensionNames)) || ((a->ppEnabledExtensionNames) && (b->ppEnabledExtensionNames)))) { onFail("a->ppEnabledExtensionNames (Error: Mismatch in string array pointer nullness)"); };
-    if (!((a->enabledExtensionCount) == (b->enabledExtensionCount))) { onFail("a->ppEnabledExtensionNames (Error: Lengths not equal in string array)"); };
-    if (!((a->enabledExtensionCount) == (b->enabledExtensionCount))) { onFail("a->ppEnabledExtensionNames (Error: Lengths not equal in string array)"); };
-    if ((a->enabledExtensionCount) == (b->enabledExtensionCount) && (a->ppEnabledExtensionNames) && (b->ppEnabledExtensionNames))
-    {
-        if (a)
-        {
-            for (uint32_t i = 0; i < (uint32_t)a->enabledExtensionCount; ++i)
-            {
-                if (!((strcmp(*(a->ppEnabledExtensionNames + i), *(b->ppEnabledExtensionNames + i)) == 0))) { onFail("a->ppEnabledExtensionNames (Error: Unequal string in string array)"); };
+    if (!((a->enabledExtensionCount) == (b->enabledExtensionCount))) {
+        onFail("a->enabledExtensionCount (Error: Value not equal)");
+    };
+    if (!((!(a->ppEnabledExtensionNames) && !(b->ppEnabledExtensionNames)) ||
+          ((a->ppEnabledExtensionNames) && (b->ppEnabledExtensionNames)))) {
+        onFail("a->ppEnabledExtensionNames (Error: Mismatch in string array pointer nullness)");
+    };
+    if (!((a->enabledExtensionCount) == (b->enabledExtensionCount))) {
+        onFail("a->ppEnabledExtensionNames (Error: Lengths not equal in string array)");
+    };
+    if (!((a->enabledExtensionCount) == (b->enabledExtensionCount))) {
+        onFail("a->ppEnabledExtensionNames (Error: Lengths not equal in string array)");
+    };
+    if ((a->enabledExtensionCount) == (b->enabledExtensionCount) && (a->ppEnabledExtensionNames) &&
+        (b->ppEnabledExtensionNames)) {
+        if (a) {
+            for (uint32_t i = 0; i < (uint32_t)a->enabledExtensionCount; ++i) {
+                if (!((strcmp(*(a->ppEnabledExtensionNames + i),
+                              *(b->ppEnabledExtensionNames + i)) == 0))) {
+                    onFail("a->ppEnabledExtensionNames (Error: Unequal string in string array)");
+                };
             }
         }
     }
-    if (!((!(a->pEnabledFeatures) && !(b->pEnabledFeatures)) || ((a->pEnabledFeatures) && (b->pEnabledFeatures)))) { onFail("a->pEnabledFeatures (Error: Mismatch in optional field)"); };
-    if (a->pEnabledFeatures && b->pEnabledFeatures)
-    {
-        if ((a->pEnabledFeatures) && (b->pEnabledFeatures))
-        {
+    if (!((!(a->pEnabledFeatures) && !(b->pEnabledFeatures)) ||
+          ((a->pEnabledFeatures) && (b->pEnabledFeatures)))) {
+        onFail("a->pEnabledFeatures (Error: Mismatch in optional field)");
+    };
+    if (a->pEnabledFeatures && b->pEnabledFeatures) {
+        if ((a->pEnabledFeatures) && (b->pEnabledFeatures)) {
             checkEqual_VkPhysicalDeviceFeatures(a->pEnabledFeatures, b->pEnabledFeatures, onFail);
         }
     }
 }
 
-void checkEqual_VkExtensionProperties(
-    const VkExtensionProperties* a,
-    const VkExtensionProperties* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((memcmp(a->extensionName, b->extensionName, VK_MAX_EXTENSION_NAME_SIZE * sizeof(char)) == 0))) { onFail("a->extensionName (Error: Unequal static array)"); };
-    if (!((a->specVersion) == (b->specVersion))) { onFail("a->specVersion (Error: Value not equal)"); };
+void checkEqual_VkExtensionProperties(const VkExtensionProperties* a,
+                                      const VkExtensionProperties* b, OnFailCompareFunc onFail) {
+    if (!((memcmp(a->extensionName, b->extensionName, VK_MAX_EXTENSION_NAME_SIZE * sizeof(char)) ==
+           0))) {
+        onFail("a->extensionName (Error: Unequal static array)");
+    };
+    if (!((a->specVersion) == (b->specVersion))) {
+        onFail("a->specVersion (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkLayerProperties(
-    const VkLayerProperties* a,
-    const VkLayerProperties* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((memcmp(a->layerName, b->layerName, VK_MAX_EXTENSION_NAME_SIZE * sizeof(char)) == 0))) { onFail("a->layerName (Error: Unequal static array)"); };
-    if (!((a->specVersion) == (b->specVersion))) { onFail("a->specVersion (Error: Value not equal)"); };
-    if (!((a->implementationVersion) == (b->implementationVersion))) { onFail("a->implementationVersion (Error: Value not equal)"); };
-    if (!((memcmp(a->description, b->description, VK_MAX_DESCRIPTION_SIZE * sizeof(char)) == 0))) { onFail("a->description (Error: Unequal static array)"); };
+void checkEqual_VkLayerProperties(const VkLayerProperties* a, const VkLayerProperties* b,
+                                  OnFailCompareFunc onFail) {
+    if (!((memcmp(a->layerName, b->layerName, VK_MAX_EXTENSION_NAME_SIZE * sizeof(char)) == 0))) {
+        onFail("a->layerName (Error: Unequal static array)");
+    };
+    if (!((a->specVersion) == (b->specVersion))) {
+        onFail("a->specVersion (Error: Value not equal)");
+    };
+    if (!((a->implementationVersion) == (b->implementationVersion))) {
+        onFail("a->implementationVersion (Error: Value not equal)");
+    };
+    if (!((memcmp(a->description, b->description, VK_MAX_DESCRIPTION_SIZE * sizeof(char)) == 0))) {
+        onFail("a->description (Error: Unequal static array)");
+    };
 }
 
-void checkEqual_VkSubmitInfo(
-    const VkSubmitInfo* a,
-    const VkSubmitInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkSubmitInfo(const VkSubmitInfo* a, const VkSubmitInfo* b,
+                             OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->waitSemaphoreCount) == (b->waitSemaphoreCount))) { onFail("a->waitSemaphoreCount (Error: Value not equal)"); };
-    if (!((a->waitSemaphoreCount) == (b->waitSemaphoreCount))) { onFail("a->pWaitSemaphores (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pWaitSemaphores, b->pWaitSemaphores, a->waitSemaphoreCount * sizeof(const VkSemaphore)) == 0))) { onFail("a->pWaitSemaphores (Error: Unequal dyn array)"); };
-    if (!((a->waitSemaphoreCount) == (b->waitSemaphoreCount))) { onFail("a->pWaitDstStageMask (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pWaitDstStageMask, b->pWaitDstStageMask, a->waitSemaphoreCount * sizeof(const VkPipelineStageFlags)) == 0))) { onFail("a->pWaitDstStageMask (Error: Unequal dyn array)"); };
-    if (!((a->commandBufferCount) == (b->commandBufferCount))) { onFail("a->commandBufferCount (Error: Value not equal)"); };
-    if (!((a->commandBufferCount) == (b->commandBufferCount))) { onFail("a->pCommandBuffers (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pCommandBuffers, b->pCommandBuffers, a->commandBufferCount * sizeof(const VkCommandBuffer)) == 0))) { onFail("a->pCommandBuffers (Error: Unequal dyn array)"); };
-    if (!((a->signalSemaphoreCount) == (b->signalSemaphoreCount))) { onFail("a->signalSemaphoreCount (Error: Value not equal)"); };
-    if (!((a->signalSemaphoreCount) == (b->signalSemaphoreCount))) { onFail("a->pSignalSemaphores (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pSignalSemaphores, b->pSignalSemaphores, a->signalSemaphoreCount * sizeof(const VkSemaphore)) == 0))) { onFail("a->pSignalSemaphores (Error: Unequal dyn array)"); };
+    if (!((a->waitSemaphoreCount) == (b->waitSemaphoreCount))) {
+        onFail("a->waitSemaphoreCount (Error: Value not equal)");
+    };
+    if (!((a->waitSemaphoreCount) == (b->waitSemaphoreCount))) {
+        onFail("a->pWaitSemaphores (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pWaitSemaphores, b->pWaitSemaphores,
+                  a->waitSemaphoreCount * sizeof(const VkSemaphore)) == 0))) {
+        onFail("a->pWaitSemaphores (Error: Unequal dyn array)");
+    };
+    if (!((a->waitSemaphoreCount) == (b->waitSemaphoreCount))) {
+        onFail("a->pWaitDstStageMask (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pWaitDstStageMask, b->pWaitDstStageMask,
+                  a->waitSemaphoreCount * sizeof(const VkPipelineStageFlags)) == 0))) {
+        onFail("a->pWaitDstStageMask (Error: Unequal dyn array)");
+    };
+    if (!((a->commandBufferCount) == (b->commandBufferCount))) {
+        onFail("a->commandBufferCount (Error: Value not equal)");
+    };
+    if (!((a->commandBufferCount) == (b->commandBufferCount))) {
+        onFail("a->pCommandBuffers (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pCommandBuffers, b->pCommandBuffers,
+                  a->commandBufferCount * sizeof(const VkCommandBuffer)) == 0))) {
+        onFail("a->pCommandBuffers (Error: Unequal dyn array)");
+    };
+    if (!((a->signalSemaphoreCount) == (b->signalSemaphoreCount))) {
+        onFail("a->signalSemaphoreCount (Error: Value not equal)");
+    };
+    if (!((a->signalSemaphoreCount) == (b->signalSemaphoreCount))) {
+        onFail("a->pSignalSemaphores (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pSignalSemaphores, b->pSignalSemaphores,
+                  a->signalSemaphoreCount * sizeof(const VkSemaphore)) == 0))) {
+        onFail("a->pSignalSemaphores (Error: Unequal dyn array)");
+    };
 }
 
-void checkEqual_VkMappedMemoryRange(
-    const VkMappedMemoryRange* a,
-    const VkMappedMemoryRange* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkMappedMemoryRange(const VkMappedMemoryRange* a, const VkMappedMemoryRange* b,
+                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->memory) == (b->memory))) { onFail("a->memory (Error: Value not equal)"); };
-    if (!((a->offset) == (b->offset))) { onFail("a->offset (Error: Value not equal)"); };
-    if (!((a->size) == (b->size))) { onFail("a->size (Error: Value not equal)"); };
+    if (!((a->memory) == (b->memory))) {
+        onFail("a->memory (Error: Value not equal)");
+    };
+    if (!((a->offset) == (b->offset))) {
+        onFail("a->offset (Error: Value not equal)");
+    };
+    if (!((a->size) == (b->size))) {
+        onFail("a->size (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkMemoryAllocateInfo(
-    const VkMemoryAllocateInfo* a,
-    const VkMemoryAllocateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkMemoryAllocateInfo(const VkMemoryAllocateInfo* a, const VkMemoryAllocateInfo* b,
+                                     OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->allocationSize) == (b->allocationSize))) { onFail("a->allocationSize (Error: Value not equal)"); };
-    if (!((a->memoryTypeIndex) == (b->memoryTypeIndex))) { onFail("a->memoryTypeIndex (Error: Value not equal)"); };
+    if (!((a->allocationSize) == (b->allocationSize))) {
+        onFail("a->allocationSize (Error: Value not equal)");
+    };
+    if (!((a->memoryTypeIndex) == (b->memoryTypeIndex))) {
+        onFail("a->memoryTypeIndex (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkMemoryRequirements(
-    const VkMemoryRequirements* a,
-    const VkMemoryRequirements* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->size) == (b->size))) { onFail("a->size (Error: Value not equal)"); };
-    if (!((a->alignment) == (b->alignment))) { onFail("a->alignment (Error: Value not equal)"); };
-    if (!((a->memoryTypeBits) == (b->memoryTypeBits))) { onFail("a->memoryTypeBits (Error: Value not equal)"); };
+void checkEqual_VkMemoryRequirements(const VkMemoryRequirements* a, const VkMemoryRequirements* b,
+                                     OnFailCompareFunc onFail) {
+    if (!((a->size) == (b->size))) {
+        onFail("a->size (Error: Value not equal)");
+    };
+    if (!((a->alignment) == (b->alignment))) {
+        onFail("a->alignment (Error: Value not equal)");
+    };
+    if (!((a->memoryTypeBits) == (b->memoryTypeBits))) {
+        onFail("a->memoryTypeBits (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkSparseMemoryBind(
-    const VkSparseMemoryBind* a,
-    const VkSparseMemoryBind* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->resourceOffset) == (b->resourceOffset))) { onFail("a->resourceOffset (Error: Value not equal)"); };
-    if (!((a->size) == (b->size))) { onFail("a->size (Error: Value not equal)"); };
-    if (!((a->memory) == (b->memory))) { onFail("a->memory (Error: Value not equal)"); };
-    if (!((a->memoryOffset) == (b->memoryOffset))) { onFail("a->memoryOffset (Error: Value not equal)"); };
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
+void checkEqual_VkSparseMemoryBind(const VkSparseMemoryBind* a, const VkSparseMemoryBind* b,
+                                   OnFailCompareFunc onFail) {
+    if (!((a->resourceOffset) == (b->resourceOffset))) {
+        onFail("a->resourceOffset (Error: Value not equal)");
+    };
+    if (!((a->size) == (b->size))) {
+        onFail("a->size (Error: Value not equal)");
+    };
+    if (!((a->memory) == (b->memory))) {
+        onFail("a->memory (Error: Value not equal)");
+    };
+    if (!((a->memoryOffset) == (b->memoryOffset))) {
+        onFail("a->memoryOffset (Error: Value not equal)");
+    };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkSparseBufferMemoryBindInfo(
-    const VkSparseBufferMemoryBindInfo* a,
-    const VkSparseBufferMemoryBindInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->buffer) == (b->buffer))) { onFail("a->buffer (Error: Value not equal)"); };
-    if (!((a->bindCount) == (b->bindCount))) { onFail("a->bindCount (Error: Value not equal)"); };
-    if ((a->pBinds) && (b->pBinds))
-    {
-        if (!((a->bindCount) == (b->bindCount))) { onFail("a->pBinds (Error: Lengths not equal)"); };
-        if ((a->bindCount) == (b->bindCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->bindCount; ++i)
-                {
+void checkEqual_VkSparseBufferMemoryBindInfo(const VkSparseBufferMemoryBindInfo* a,
+                                             const VkSparseBufferMemoryBindInfo* b,
+                                             OnFailCompareFunc onFail) {
+    if (!((a->buffer) == (b->buffer))) {
+        onFail("a->buffer (Error: Value not equal)");
+    };
+    if (!((a->bindCount) == (b->bindCount))) {
+        onFail("a->bindCount (Error: Value not equal)");
+    };
+    if ((a->pBinds) && (b->pBinds)) {
+        if (!((a->bindCount) == (b->bindCount))) {
+            onFail("a->pBinds (Error: Lengths not equal)");
+        };
+        if ((a->bindCount) == (b->bindCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->bindCount; ++i) {
                     checkEqual_VkSparseMemoryBind(a->pBinds + i, b->pBinds + i, onFail);
                 }
             }
@@ -786,22 +1344,22 @@
     }
 }
 
-void checkEqual_VkSparseImageOpaqueMemoryBindInfo(
-    const VkSparseImageOpaqueMemoryBindInfo* a,
-    const VkSparseImageOpaqueMemoryBindInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->image) == (b->image))) { onFail("a->image (Error: Value not equal)"); };
-    if (!((a->bindCount) == (b->bindCount))) { onFail("a->bindCount (Error: Value not equal)"); };
-    if ((a->pBinds) && (b->pBinds))
-    {
-        if (!((a->bindCount) == (b->bindCount))) { onFail("a->pBinds (Error: Lengths not equal)"); };
-        if ((a->bindCount) == (b->bindCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->bindCount; ++i)
-                {
+void checkEqual_VkSparseImageOpaqueMemoryBindInfo(const VkSparseImageOpaqueMemoryBindInfo* a,
+                                                  const VkSparseImageOpaqueMemoryBindInfo* b,
+                                                  OnFailCompareFunc onFail) {
+    if (!((a->image) == (b->image))) {
+        onFail("a->image (Error: Value not equal)");
+    };
+    if (!((a->bindCount) == (b->bindCount))) {
+        onFail("a->bindCount (Error: Value not equal)");
+    };
+    if ((a->pBinds) && (b->pBinds)) {
+        if (!((a->bindCount) == (b->bindCount))) {
+            onFail("a->pBinds (Error: Lengths not equal)");
+        };
+        if ((a->bindCount) == (b->bindCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->bindCount; ++i) {
                     checkEqual_VkSparseMemoryBind(a->pBinds + i, b->pBinds + i, onFail);
                 }
             }
@@ -809,45 +1367,52 @@
     }
 }
 
-void checkEqual_VkImageSubresource(
-    const VkImageSubresource* a,
-    const VkImageSubresource* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->aspectMask) == (b->aspectMask))) { onFail("a->aspectMask (Error: Value not equal)"); };
-    if (!((a->mipLevel) == (b->mipLevel))) { onFail("a->mipLevel (Error: Value not equal)"); };
-    if (!((a->arrayLayer) == (b->arrayLayer))) { onFail("a->arrayLayer (Error: Value not equal)"); };
+void checkEqual_VkImageSubresource(const VkImageSubresource* a, const VkImageSubresource* b,
+                                   OnFailCompareFunc onFail) {
+    if (!((a->aspectMask) == (b->aspectMask))) {
+        onFail("a->aspectMask (Error: Value not equal)");
+    };
+    if (!((a->mipLevel) == (b->mipLevel))) {
+        onFail("a->mipLevel (Error: Value not equal)");
+    };
+    if (!((a->arrayLayer) == (b->arrayLayer))) {
+        onFail("a->arrayLayer (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkSparseImageMemoryBind(
-    const VkSparseImageMemoryBind* a,
-    const VkSparseImageMemoryBind* b,
-    OnFailCompareFunc onFail)
-{
+void checkEqual_VkSparseImageMemoryBind(const VkSparseImageMemoryBind* a,
+                                        const VkSparseImageMemoryBind* b,
+                                        OnFailCompareFunc onFail) {
     checkEqual_VkImageSubresource(&a->subresource, &b->subresource, onFail);
     checkEqual_VkOffset3D(&a->offset, &b->offset, onFail);
     checkEqual_VkExtent3D(&a->extent, &b->extent, onFail);
-    if (!((a->memory) == (b->memory))) { onFail("a->memory (Error: Value not equal)"); };
-    if (!((a->memoryOffset) == (b->memoryOffset))) { onFail("a->memoryOffset (Error: Value not equal)"); };
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
+    if (!((a->memory) == (b->memory))) {
+        onFail("a->memory (Error: Value not equal)");
+    };
+    if (!((a->memoryOffset) == (b->memoryOffset))) {
+        onFail("a->memoryOffset (Error: Value not equal)");
+    };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkSparseImageMemoryBindInfo(
-    const VkSparseImageMemoryBindInfo* a,
-    const VkSparseImageMemoryBindInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->image) == (b->image))) { onFail("a->image (Error: Value not equal)"); };
-    if (!((a->bindCount) == (b->bindCount))) { onFail("a->bindCount (Error: Value not equal)"); };
-    if ((a->pBinds) && (b->pBinds))
-    {
-        if (!((a->bindCount) == (b->bindCount))) { onFail("a->pBinds (Error: Lengths not equal)"); };
-        if ((a->bindCount) == (b->bindCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->bindCount; ++i)
-                {
+void checkEqual_VkSparseImageMemoryBindInfo(const VkSparseImageMemoryBindInfo* a,
+                                            const VkSparseImageMemoryBindInfo* b,
+                                            OnFailCompareFunc onFail) {
+    if (!((a->image) == (b->image))) {
+        onFail("a->image (Error: Value not equal)");
+    };
+    if (!((a->bindCount) == (b->bindCount))) {
+        onFail("a->bindCount (Error: Value not equal)");
+    };
+    if ((a->pBinds) && (b->pBinds)) {
+        if (!((a->bindCount) == (b->bindCount))) {
+            onFail("a->pBinds (Error: Lengths not equal)");
+        };
+        if ((a->bindCount) == (b->bindCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->bindCount; ++i) {
                     checkEqual_VkSparseImageMemoryBind(a->pBinds + i, b->pBinds + i, onFail);
                 }
             }
@@ -855,423 +1420,565 @@
     }
 }
 
-void checkEqual_VkBindSparseInfo(
-    const VkBindSparseInfo* a,
-    const VkBindSparseInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkBindSparseInfo(const VkBindSparseInfo* a, const VkBindSparseInfo* b,
+                                 OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->waitSemaphoreCount) == (b->waitSemaphoreCount))) { onFail("a->waitSemaphoreCount (Error: Value not equal)"); };
-    if (!((a->waitSemaphoreCount) == (b->waitSemaphoreCount))) { onFail("a->pWaitSemaphores (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pWaitSemaphores, b->pWaitSemaphores, a->waitSemaphoreCount * sizeof(const VkSemaphore)) == 0))) { onFail("a->pWaitSemaphores (Error: Unequal dyn array)"); };
-    if (!((a->bufferBindCount) == (b->bufferBindCount))) { onFail("a->bufferBindCount (Error: Value not equal)"); };
-    if ((a->pBufferBinds) && (b->pBufferBinds))
-    {
-        if (!((a->bufferBindCount) == (b->bufferBindCount))) { onFail("a->pBufferBinds (Error: Lengths not equal)"); };
-        if ((a->bufferBindCount) == (b->bufferBindCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->bufferBindCount; ++i)
-                {
-                    checkEqual_VkSparseBufferMemoryBindInfo(a->pBufferBinds + i, b->pBufferBinds + i, onFail);
+    if (!((a->waitSemaphoreCount) == (b->waitSemaphoreCount))) {
+        onFail("a->waitSemaphoreCount (Error: Value not equal)");
+    };
+    if (!((a->waitSemaphoreCount) == (b->waitSemaphoreCount))) {
+        onFail("a->pWaitSemaphores (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pWaitSemaphores, b->pWaitSemaphores,
+                  a->waitSemaphoreCount * sizeof(const VkSemaphore)) == 0))) {
+        onFail("a->pWaitSemaphores (Error: Unequal dyn array)");
+    };
+    if (!((a->bufferBindCount) == (b->bufferBindCount))) {
+        onFail("a->bufferBindCount (Error: Value not equal)");
+    };
+    if ((a->pBufferBinds) && (b->pBufferBinds)) {
+        if (!((a->bufferBindCount) == (b->bufferBindCount))) {
+            onFail("a->pBufferBinds (Error: Lengths not equal)");
+        };
+        if ((a->bufferBindCount) == (b->bufferBindCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->bufferBindCount; ++i) {
+                    checkEqual_VkSparseBufferMemoryBindInfo(a->pBufferBinds + i,
+                                                            b->pBufferBinds + i, onFail);
                 }
             }
         }
     }
-    if (!((a->imageOpaqueBindCount) == (b->imageOpaqueBindCount))) { onFail("a->imageOpaqueBindCount (Error: Value not equal)"); };
-    if ((a->pImageOpaqueBinds) && (b->pImageOpaqueBinds))
-    {
-        if (!((a->imageOpaqueBindCount) == (b->imageOpaqueBindCount))) { onFail("a->pImageOpaqueBinds (Error: Lengths not equal)"); };
-        if ((a->imageOpaqueBindCount) == (b->imageOpaqueBindCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->imageOpaqueBindCount; ++i)
-                {
-                    checkEqual_VkSparseImageOpaqueMemoryBindInfo(a->pImageOpaqueBinds + i, b->pImageOpaqueBinds + i, onFail);
+    if (!((a->imageOpaqueBindCount) == (b->imageOpaqueBindCount))) {
+        onFail("a->imageOpaqueBindCount (Error: Value not equal)");
+    };
+    if ((a->pImageOpaqueBinds) && (b->pImageOpaqueBinds)) {
+        if (!((a->imageOpaqueBindCount) == (b->imageOpaqueBindCount))) {
+            onFail("a->pImageOpaqueBinds (Error: Lengths not equal)");
+        };
+        if ((a->imageOpaqueBindCount) == (b->imageOpaqueBindCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->imageOpaqueBindCount; ++i) {
+                    checkEqual_VkSparseImageOpaqueMemoryBindInfo(a->pImageOpaqueBinds + i,
+                                                                 b->pImageOpaqueBinds + i, onFail);
                 }
             }
         }
     }
-    if (!((a->imageBindCount) == (b->imageBindCount))) { onFail("a->imageBindCount (Error: Value not equal)"); };
-    if ((a->pImageBinds) && (b->pImageBinds))
-    {
-        if (!((a->imageBindCount) == (b->imageBindCount))) { onFail("a->pImageBinds (Error: Lengths not equal)"); };
-        if ((a->imageBindCount) == (b->imageBindCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->imageBindCount; ++i)
-                {
-                    checkEqual_VkSparseImageMemoryBindInfo(a->pImageBinds + i, b->pImageBinds + i, onFail);
+    if (!((a->imageBindCount) == (b->imageBindCount))) {
+        onFail("a->imageBindCount (Error: Value not equal)");
+    };
+    if ((a->pImageBinds) && (b->pImageBinds)) {
+        if (!((a->imageBindCount) == (b->imageBindCount))) {
+            onFail("a->pImageBinds (Error: Lengths not equal)");
+        };
+        if ((a->imageBindCount) == (b->imageBindCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->imageBindCount; ++i) {
+                    checkEqual_VkSparseImageMemoryBindInfo(a->pImageBinds + i, b->pImageBinds + i,
+                                                           onFail);
                 }
             }
         }
     }
-    if (!((a->signalSemaphoreCount) == (b->signalSemaphoreCount))) { onFail("a->signalSemaphoreCount (Error: Value not equal)"); };
-    if (!((a->signalSemaphoreCount) == (b->signalSemaphoreCount))) { onFail("a->pSignalSemaphores (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pSignalSemaphores, b->pSignalSemaphores, a->signalSemaphoreCount * sizeof(const VkSemaphore)) == 0))) { onFail("a->pSignalSemaphores (Error: Unequal dyn array)"); };
+    if (!((a->signalSemaphoreCount) == (b->signalSemaphoreCount))) {
+        onFail("a->signalSemaphoreCount (Error: Value not equal)");
+    };
+    if (!((a->signalSemaphoreCount) == (b->signalSemaphoreCount))) {
+        onFail("a->pSignalSemaphores (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pSignalSemaphores, b->pSignalSemaphores,
+                  a->signalSemaphoreCount * sizeof(const VkSemaphore)) == 0))) {
+        onFail("a->pSignalSemaphores (Error: Unequal dyn array)");
+    };
 }
 
-void checkEqual_VkSparseImageFormatProperties(
-    const VkSparseImageFormatProperties* a,
-    const VkSparseImageFormatProperties* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->aspectMask) == (b->aspectMask))) { onFail("a->aspectMask (Error: Value not equal)"); };
+void checkEqual_VkSparseImageFormatProperties(const VkSparseImageFormatProperties* a,
+                                              const VkSparseImageFormatProperties* b,
+                                              OnFailCompareFunc onFail) {
+    if (!((a->aspectMask) == (b->aspectMask))) {
+        onFail("a->aspectMask (Error: Value not equal)");
+    };
     checkEqual_VkExtent3D(&a->imageGranularity, &b->imageGranularity, onFail);
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkSparseImageMemoryRequirements(
-    const VkSparseImageMemoryRequirements* a,
-    const VkSparseImageMemoryRequirements* b,
-    OnFailCompareFunc onFail)
-{
+void checkEqual_VkSparseImageMemoryRequirements(const VkSparseImageMemoryRequirements* a,
+                                                const VkSparseImageMemoryRequirements* b,
+                                                OnFailCompareFunc onFail) {
     checkEqual_VkSparseImageFormatProperties(&a->formatProperties, &b->formatProperties, onFail);
-    if (!((a->imageMipTailFirstLod) == (b->imageMipTailFirstLod))) { onFail("a->imageMipTailFirstLod (Error: Value not equal)"); };
-    if (!((a->imageMipTailSize) == (b->imageMipTailSize))) { onFail("a->imageMipTailSize (Error: Value not equal)"); };
-    if (!((a->imageMipTailOffset) == (b->imageMipTailOffset))) { onFail("a->imageMipTailOffset (Error: Value not equal)"); };
-    if (!((a->imageMipTailStride) == (b->imageMipTailStride))) { onFail("a->imageMipTailStride (Error: Value not equal)"); };
+    if (!((a->imageMipTailFirstLod) == (b->imageMipTailFirstLod))) {
+        onFail("a->imageMipTailFirstLod (Error: Value not equal)");
+    };
+    if (!((a->imageMipTailSize) == (b->imageMipTailSize))) {
+        onFail("a->imageMipTailSize (Error: Value not equal)");
+    };
+    if (!((a->imageMipTailOffset) == (b->imageMipTailOffset))) {
+        onFail("a->imageMipTailOffset (Error: Value not equal)");
+    };
+    if (!((a->imageMipTailStride) == (b->imageMipTailStride))) {
+        onFail("a->imageMipTailStride (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkFenceCreateInfo(
-    const VkFenceCreateInfo* a,
-    const VkFenceCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkFenceCreateInfo(const VkFenceCreateInfo* a, const VkFenceCreateInfo* b,
+                                  OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkSemaphoreCreateInfo(
-    const VkSemaphoreCreateInfo* a,
-    const VkSemaphoreCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkSemaphoreCreateInfo(const VkSemaphoreCreateInfo* a,
+                                      const VkSemaphoreCreateInfo* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkEventCreateInfo(
-    const VkEventCreateInfo* a,
-    const VkEventCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkEventCreateInfo(const VkEventCreateInfo* a, const VkEventCreateInfo* b,
+                                  OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkQueryPoolCreateInfo(
-    const VkQueryPoolCreateInfo* a,
-    const VkQueryPoolCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkQueryPoolCreateInfo(const VkQueryPoolCreateInfo* a,
+                                      const VkQueryPoolCreateInfo* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->queryType) == (b->queryType))) { onFail("a->queryType (Error: Value not equal)"); };
-    if (!((a->queryCount) == (b->queryCount))) { onFail("a->queryCount (Error: Value not equal)"); };
-    if (!((a->pipelineStatistics) == (b->pipelineStatistics))) { onFail("a->pipelineStatistics (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->queryType) == (b->queryType))) {
+        onFail("a->queryType (Error: Value not equal)");
+    };
+    if (!((a->queryCount) == (b->queryCount))) {
+        onFail("a->queryCount (Error: Value not equal)");
+    };
+    if (!((a->pipelineStatistics) == (b->pipelineStatistics))) {
+        onFail("a->pipelineStatistics (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkBufferCreateInfo(
-    const VkBufferCreateInfo* a,
-    const VkBufferCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkBufferCreateInfo(const VkBufferCreateInfo* a, const VkBufferCreateInfo* b,
+                                   OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->size) == (b->size))) { onFail("a->size (Error: Value not equal)"); };
-    if (!((a->usage) == (b->usage))) { onFail("a->usage (Error: Value not equal)"); };
-    if (!((a->sharingMode) == (b->sharingMode))) { onFail("a->sharingMode (Error: Value not equal)"); };
-    if (!((a->queueFamilyIndexCount) == (b->queueFamilyIndexCount))) { onFail("a->queueFamilyIndexCount (Error: Value not equal)"); };
-    if (!((!(a->pQueueFamilyIndices) && !(b->pQueueFamilyIndices)) || ((a->pQueueFamilyIndices) && (b->pQueueFamilyIndices)))) { onFail("a->pQueueFamilyIndices (Error: Mismatch in optional field)"); };
-    if (a->pQueueFamilyIndices && b->pQueueFamilyIndices)
-    {
-        if (!((a->queueFamilyIndexCount) == (b->queueFamilyIndexCount))) { onFail("a->pQueueFamilyIndices (Error: Lengths not equal)"); };
-        if (!((memcmp(a->pQueueFamilyIndices, b->pQueueFamilyIndices, a->queueFamilyIndexCount * sizeof(const uint32_t)) == 0))) { onFail("a->pQueueFamilyIndices (Error: Unequal dyn array)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->size) == (b->size))) {
+        onFail("a->size (Error: Value not equal)");
+    };
+    if (!((a->usage) == (b->usage))) {
+        onFail("a->usage (Error: Value not equal)");
+    };
+    if (!((a->sharingMode) == (b->sharingMode))) {
+        onFail("a->sharingMode (Error: Value not equal)");
+    };
+    if (!((a->queueFamilyIndexCount) == (b->queueFamilyIndexCount))) {
+        onFail("a->queueFamilyIndexCount (Error: Value not equal)");
+    };
+    if (!((!(a->pQueueFamilyIndices) && !(b->pQueueFamilyIndices)) ||
+          ((a->pQueueFamilyIndices) && (b->pQueueFamilyIndices)))) {
+        onFail("a->pQueueFamilyIndices (Error: Mismatch in optional field)");
+    };
+    if (a->pQueueFamilyIndices && b->pQueueFamilyIndices) {
+        if (!((a->queueFamilyIndexCount) == (b->queueFamilyIndexCount))) {
+            onFail("a->pQueueFamilyIndices (Error: Lengths not equal)");
+        };
+        if (!((memcmp(a->pQueueFamilyIndices, b->pQueueFamilyIndices,
+                      a->queueFamilyIndexCount * sizeof(const uint32_t)) == 0))) {
+            onFail("a->pQueueFamilyIndices (Error: Unequal dyn array)");
+        };
     }
 }
 
-void checkEqual_VkBufferViewCreateInfo(
-    const VkBufferViewCreateInfo* a,
-    const VkBufferViewCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkBufferViewCreateInfo(const VkBufferViewCreateInfo* a,
+                                       const VkBufferViewCreateInfo* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->buffer) == (b->buffer))) { onFail("a->buffer (Error: Value not equal)"); };
-    if (!((a->format) == (b->format))) { onFail("a->format (Error: Value not equal)"); };
-    if (!((a->offset) == (b->offset))) { onFail("a->offset (Error: Value not equal)"); };
-    if (!((a->range) == (b->range))) { onFail("a->range (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->buffer) == (b->buffer))) {
+        onFail("a->buffer (Error: Value not equal)");
+    };
+    if (!((a->format) == (b->format))) {
+        onFail("a->format (Error: Value not equal)");
+    };
+    if (!((a->offset) == (b->offset))) {
+        onFail("a->offset (Error: Value not equal)");
+    };
+    if (!((a->range) == (b->range))) {
+        onFail("a->range (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkImageCreateInfo(
-    const VkImageCreateInfo* a,
-    const VkImageCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkImageCreateInfo(const VkImageCreateInfo* a, const VkImageCreateInfo* b,
+                                  OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->imageType) == (b->imageType))) { onFail("a->imageType (Error: Value not equal)"); };
-    if (!((a->format) == (b->format))) { onFail("a->format (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->imageType) == (b->imageType))) {
+        onFail("a->imageType (Error: Value not equal)");
+    };
+    if (!((a->format) == (b->format))) {
+        onFail("a->format (Error: Value not equal)");
+    };
     checkEqual_VkExtent3D(&a->extent, &b->extent, onFail);
-    if (!((a->mipLevels) == (b->mipLevels))) { onFail("a->mipLevels (Error: Value not equal)"); };
-    if (!((a->arrayLayers) == (b->arrayLayers))) { onFail("a->arrayLayers (Error: Value not equal)"); };
-    if (!((a->samples) == (b->samples))) { onFail("a->samples (Error: Value not equal)"); };
-    if (!((a->tiling) == (b->tiling))) { onFail("a->tiling (Error: Value not equal)"); };
-    if (!((a->usage) == (b->usage))) { onFail("a->usage (Error: Value not equal)"); };
-    if (!((a->sharingMode) == (b->sharingMode))) { onFail("a->sharingMode (Error: Value not equal)"); };
-    if (!((a->queueFamilyIndexCount) == (b->queueFamilyIndexCount))) { onFail("a->queueFamilyIndexCount (Error: Value not equal)"); };
-    if (!((!(a->pQueueFamilyIndices) && !(b->pQueueFamilyIndices)) || ((a->pQueueFamilyIndices) && (b->pQueueFamilyIndices)))) { onFail("a->pQueueFamilyIndices (Error: Mismatch in optional field)"); };
-    if (a->pQueueFamilyIndices && b->pQueueFamilyIndices)
-    {
-        if (!((a->queueFamilyIndexCount) == (b->queueFamilyIndexCount))) { onFail("a->pQueueFamilyIndices (Error: Lengths not equal)"); };
-        if (!((memcmp(a->pQueueFamilyIndices, b->pQueueFamilyIndices, a->queueFamilyIndexCount * sizeof(const uint32_t)) == 0))) { onFail("a->pQueueFamilyIndices (Error: Unequal dyn array)"); };
+    if (!((a->mipLevels) == (b->mipLevels))) {
+        onFail("a->mipLevels (Error: Value not equal)");
+    };
+    if (!((a->arrayLayers) == (b->arrayLayers))) {
+        onFail("a->arrayLayers (Error: Value not equal)");
+    };
+    if (!((a->samples) == (b->samples))) {
+        onFail("a->samples (Error: Value not equal)");
+    };
+    if (!((a->tiling) == (b->tiling))) {
+        onFail("a->tiling (Error: Value not equal)");
+    };
+    if (!((a->usage) == (b->usage))) {
+        onFail("a->usage (Error: Value not equal)");
+    };
+    if (!((a->sharingMode) == (b->sharingMode))) {
+        onFail("a->sharingMode (Error: Value not equal)");
+    };
+    if (!((a->queueFamilyIndexCount) == (b->queueFamilyIndexCount))) {
+        onFail("a->queueFamilyIndexCount (Error: Value not equal)");
+    };
+    if (!((!(a->pQueueFamilyIndices) && !(b->pQueueFamilyIndices)) ||
+          ((a->pQueueFamilyIndices) && (b->pQueueFamilyIndices)))) {
+        onFail("a->pQueueFamilyIndices (Error: Mismatch in optional field)");
+    };
+    if (a->pQueueFamilyIndices && b->pQueueFamilyIndices) {
+        if (!((a->queueFamilyIndexCount) == (b->queueFamilyIndexCount))) {
+            onFail("a->pQueueFamilyIndices (Error: Lengths not equal)");
+        };
+        if (!((memcmp(a->pQueueFamilyIndices, b->pQueueFamilyIndices,
+                      a->queueFamilyIndexCount * sizeof(const uint32_t)) == 0))) {
+            onFail("a->pQueueFamilyIndices (Error: Unequal dyn array)");
+        };
     }
-    if (!((a->initialLayout) == (b->initialLayout))) { onFail("a->initialLayout (Error: Value not equal)"); };
+    if (!((a->initialLayout) == (b->initialLayout))) {
+        onFail("a->initialLayout (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkSubresourceLayout(
-    const VkSubresourceLayout* a,
-    const VkSubresourceLayout* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->offset) == (b->offset))) { onFail("a->offset (Error: Value not equal)"); };
-    if (!((a->size) == (b->size))) { onFail("a->size (Error: Value not equal)"); };
-    if (!((a->rowPitch) == (b->rowPitch))) { onFail("a->rowPitch (Error: Value not equal)"); };
-    if (!((a->arrayPitch) == (b->arrayPitch))) { onFail("a->arrayPitch (Error: Value not equal)"); };
-    if (!((a->depthPitch) == (b->depthPitch))) { onFail("a->depthPitch (Error: Value not equal)"); };
+void checkEqual_VkSubresourceLayout(const VkSubresourceLayout* a, const VkSubresourceLayout* b,
+                                    OnFailCompareFunc onFail) {
+    if (!((a->offset) == (b->offset))) {
+        onFail("a->offset (Error: Value not equal)");
+    };
+    if (!((a->size) == (b->size))) {
+        onFail("a->size (Error: Value not equal)");
+    };
+    if (!((a->rowPitch) == (b->rowPitch))) {
+        onFail("a->rowPitch (Error: Value not equal)");
+    };
+    if (!((a->arrayPitch) == (b->arrayPitch))) {
+        onFail("a->arrayPitch (Error: Value not equal)");
+    };
+    if (!((a->depthPitch) == (b->depthPitch))) {
+        onFail("a->depthPitch (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkComponentMapping(
-    const VkComponentMapping* a,
-    const VkComponentMapping* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->r) == (b->r))) { onFail("a->r (Error: Value not equal)"); };
-    if (!((a->g) == (b->g))) { onFail("a->g (Error: Value not equal)"); };
-    if (!((a->b) == (b->b))) { onFail("a->b (Error: Value not equal)"); };
-    if (!((a->a) == (b->a))) { onFail("a->a (Error: Value not equal)"); };
+void checkEqual_VkComponentMapping(const VkComponentMapping* a, const VkComponentMapping* b,
+                                   OnFailCompareFunc onFail) {
+    if (!((a->r) == (b->r))) {
+        onFail("a->r (Error: Value not equal)");
+    };
+    if (!((a->g) == (b->g))) {
+        onFail("a->g (Error: Value not equal)");
+    };
+    if (!((a->b) == (b->b))) {
+        onFail("a->b (Error: Value not equal)");
+    };
+    if (!((a->a) == (b->a))) {
+        onFail("a->a (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkImageViewCreateInfo(
-    const VkImageViewCreateInfo* a,
-    const VkImageViewCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkImageViewCreateInfo(const VkImageViewCreateInfo* a,
+                                      const VkImageViewCreateInfo* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->image) == (b->image))) { onFail("a->image (Error: Value not equal)"); };
-    if (!((a->viewType) == (b->viewType))) { onFail("a->viewType (Error: Value not equal)"); };
-    if (!((a->format) == (b->format))) { onFail("a->format (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->image) == (b->image))) {
+        onFail("a->image (Error: Value not equal)");
+    };
+    if (!((a->viewType) == (b->viewType))) {
+        onFail("a->viewType (Error: Value not equal)");
+    };
+    if (!((a->format) == (b->format))) {
+        onFail("a->format (Error: Value not equal)");
+    };
     checkEqual_VkComponentMapping(&a->components, &b->components, onFail);
     checkEqual_VkImageSubresourceRange(&a->subresourceRange, &b->subresourceRange, onFail);
 }
 
-void checkEqual_VkShaderModuleCreateInfo(
-    const VkShaderModuleCreateInfo* a,
-    const VkShaderModuleCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkShaderModuleCreateInfo(const VkShaderModuleCreateInfo* a,
+                                         const VkShaderModuleCreateInfo* b,
+                                         OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->codeSize) == (b->codeSize))) { onFail("a->codeSize (Error: Value not equal)"); };
-    if (!(((a->codeSize / 4)) == ((b->codeSize / 4)))) { onFail("a->pCode (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pCode, b->pCode, (a->codeSize / 4) * sizeof(const uint32_t)) == 0))) { onFail("a->pCode (Error: Unequal dyn array)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->codeSize) == (b->codeSize))) {
+        onFail("a->codeSize (Error: Value not equal)");
+    };
+    if (!(((a->codeSize / 4)) == ((b->codeSize / 4)))) {
+        onFail("a->pCode (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pCode, b->pCode, (a->codeSize / 4) * sizeof(const uint32_t)) == 0))) {
+        onFail("a->pCode (Error: Unequal dyn array)");
+    };
 }
 
-void checkEqual_VkPipelineCacheCreateInfo(
-    const VkPipelineCacheCreateInfo* a,
-    const VkPipelineCacheCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPipelineCacheCreateInfo(const VkPipelineCacheCreateInfo* a,
+                                          const VkPipelineCacheCreateInfo* b,
+                                          OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->initialDataSize) == (b->initialDataSize))) { onFail("a->initialDataSize (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->initialDataSize) == (b->initialDataSize))) {
+        onFail("a->initialDataSize (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkSpecializationMapEntry(
-    const VkSpecializationMapEntry* a,
-    const VkSpecializationMapEntry* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->constantID) == (b->constantID))) { onFail("a->constantID (Error: Value not equal)"); };
-    if (!((a->offset) == (b->offset))) { onFail("a->offset (Error: Value not equal)"); };
-    if (!((a->size) == (b->size))) { onFail("a->size (Error: Value not equal)"); };
+void checkEqual_VkSpecializationMapEntry(const VkSpecializationMapEntry* a,
+                                         const VkSpecializationMapEntry* b,
+                                         OnFailCompareFunc onFail) {
+    if (!((a->constantID) == (b->constantID))) {
+        onFail("a->constantID (Error: Value not equal)");
+    };
+    if (!((a->offset) == (b->offset))) {
+        onFail("a->offset (Error: Value not equal)");
+    };
+    if (!((a->size) == (b->size))) {
+        onFail("a->size (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkSpecializationInfo(
-    const VkSpecializationInfo* a,
-    const VkSpecializationInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->mapEntryCount) == (b->mapEntryCount))) { onFail("a->mapEntryCount (Error: Value not equal)"); };
-    if ((a->pMapEntries) && (b->pMapEntries))
-    {
-        if (!((a->mapEntryCount) == (b->mapEntryCount))) { onFail("a->pMapEntries (Error: Lengths not equal)"); };
-        if ((a->mapEntryCount) == (b->mapEntryCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->mapEntryCount; ++i)
-                {
-                    checkEqual_VkSpecializationMapEntry(a->pMapEntries + i, b->pMapEntries + i, onFail);
+void checkEqual_VkSpecializationInfo(const VkSpecializationInfo* a, const VkSpecializationInfo* b,
+                                     OnFailCompareFunc onFail) {
+    if (!((a->mapEntryCount) == (b->mapEntryCount))) {
+        onFail("a->mapEntryCount (Error: Value not equal)");
+    };
+    if ((a->pMapEntries) && (b->pMapEntries)) {
+        if (!((a->mapEntryCount) == (b->mapEntryCount))) {
+            onFail("a->pMapEntries (Error: Lengths not equal)");
+        };
+        if ((a->mapEntryCount) == (b->mapEntryCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->mapEntryCount; ++i) {
+                    checkEqual_VkSpecializationMapEntry(a->pMapEntries + i, b->pMapEntries + i,
+                                                        onFail);
                 }
             }
         }
     }
-    if (!((a->dataSize) == (b->dataSize))) { onFail("a->dataSize (Error: Value not equal)"); };
+    if (!((a->dataSize) == (b->dataSize))) {
+        onFail("a->dataSize (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkPipelineShaderStageCreateInfo(
-    const VkPipelineShaderStageCreateInfo* a,
-    const VkPipelineShaderStageCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPipelineShaderStageCreateInfo(const VkPipelineShaderStageCreateInfo* a,
+                                                const VkPipelineShaderStageCreateInfo* b,
+                                                OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->stage) == (b->stage))) { onFail("a->stage (Error: Value not equal)"); };
-    if (!((a->module) == (b->module))) { onFail("a->module (Error: Value not equal)"); };
-    if (!((!(a->pName) && !(b->pName)) || ((a->pName) && (b->pName)))) { onFail("a->pName (Error: Mismatch in string pointer nullness)"); };
-    if ((a->pName) && (b->pName))
-    {
-        if (!((strcmp(a->pName, b->pName) == 0))) { onFail("a->pName (Error: Unequal strings)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->stage) == (b->stage))) {
+        onFail("a->stage (Error: Value not equal)");
+    };
+    if (!((a->module) == (b->module))) {
+        onFail("a->module (Error: Value not equal)");
+    };
+    if (!((!(a->pName) && !(b->pName)) || ((a->pName) && (b->pName)))) {
+        onFail("a->pName (Error: Mismatch in string pointer nullness)");
+    };
+    if ((a->pName) && (b->pName)) {
+        if (!((strcmp(a->pName, b->pName) == 0))) {
+            onFail("a->pName (Error: Unequal strings)");
+        };
     }
-    if (!((!(a->pSpecializationInfo) && !(b->pSpecializationInfo)) || ((a->pSpecializationInfo) && (b->pSpecializationInfo)))) { onFail("a->pSpecializationInfo (Error: Mismatch in optional field)"); };
-    if (a->pSpecializationInfo && b->pSpecializationInfo)
-    {
-        if ((a->pSpecializationInfo) && (b->pSpecializationInfo))
-        {
+    if (!((!(a->pSpecializationInfo) && !(b->pSpecializationInfo)) ||
+          ((a->pSpecializationInfo) && (b->pSpecializationInfo)))) {
+        onFail("a->pSpecializationInfo (Error: Mismatch in optional field)");
+    };
+    if (a->pSpecializationInfo && b->pSpecializationInfo) {
+        if ((a->pSpecializationInfo) && (b->pSpecializationInfo)) {
             checkEqual_VkSpecializationInfo(a->pSpecializationInfo, b->pSpecializationInfo, onFail);
         }
     }
 }
 
-void checkEqual_VkComputePipelineCreateInfo(
-    const VkComputePipelineCreateInfo* a,
-    const VkComputePipelineCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkComputePipelineCreateInfo(const VkComputePipelineCreateInfo* a,
+                                            const VkComputePipelineCreateInfo* b,
+                                            OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
     checkEqual_VkPipelineShaderStageCreateInfo(&a->stage, &b->stage, onFail);
-    if (!((a->layout) == (b->layout))) { onFail("a->layout (Error: Value not equal)"); };
-    if (!((a->basePipelineHandle) == (b->basePipelineHandle))) { onFail("a->basePipelineHandle (Error: Value not equal)"); };
-    if (!((a->basePipelineIndex) == (b->basePipelineIndex))) { onFail("a->basePipelineIndex (Error: Value not equal)"); };
+    if (!((a->layout) == (b->layout))) {
+        onFail("a->layout (Error: Value not equal)");
+    };
+    if (!((a->basePipelineHandle) == (b->basePipelineHandle))) {
+        onFail("a->basePipelineHandle (Error: Value not equal)");
+    };
+    if (!((a->basePipelineIndex) == (b->basePipelineIndex))) {
+        onFail("a->basePipelineIndex (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkVertexInputBindingDescription(
-    const VkVertexInputBindingDescription* a,
-    const VkVertexInputBindingDescription* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->binding) == (b->binding))) { onFail("a->binding (Error: Value not equal)"); };
-    if (!((a->stride) == (b->stride))) { onFail("a->stride (Error: Value not equal)"); };
-    if (!((a->inputRate) == (b->inputRate))) { onFail("a->inputRate (Error: Value not equal)"); };
+void checkEqual_VkVertexInputBindingDescription(const VkVertexInputBindingDescription* a,
+                                                const VkVertexInputBindingDescription* b,
+                                                OnFailCompareFunc onFail) {
+    if (!((a->binding) == (b->binding))) {
+        onFail("a->binding (Error: Value not equal)");
+    };
+    if (!((a->stride) == (b->stride))) {
+        onFail("a->stride (Error: Value not equal)");
+    };
+    if (!((a->inputRate) == (b->inputRate))) {
+        onFail("a->inputRate (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkVertexInputAttributeDescription(
-    const VkVertexInputAttributeDescription* a,
-    const VkVertexInputAttributeDescription* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->location) == (b->location))) { onFail("a->location (Error: Value not equal)"); };
-    if (!((a->binding) == (b->binding))) { onFail("a->binding (Error: Value not equal)"); };
-    if (!((a->format) == (b->format))) { onFail("a->format (Error: Value not equal)"); };
-    if (!((a->offset) == (b->offset))) { onFail("a->offset (Error: Value not equal)"); };
+void checkEqual_VkVertexInputAttributeDescription(const VkVertexInputAttributeDescription* a,
+                                                  const VkVertexInputAttributeDescription* b,
+                                                  OnFailCompareFunc onFail) {
+    if (!((a->location) == (b->location))) {
+        onFail("a->location (Error: Value not equal)");
+    };
+    if (!((a->binding) == (b->binding))) {
+        onFail("a->binding (Error: Value not equal)");
+    };
+    if (!((a->format) == (b->format))) {
+        onFail("a->format (Error: Value not equal)");
+    };
+    if (!((a->offset) == (b->offset))) {
+        onFail("a->offset (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkPipelineVertexInputStateCreateInfo(
-    const VkPipelineVertexInputStateCreateInfo* a,
-    const VkPipelineVertexInputStateCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPipelineVertexInputStateCreateInfo(const VkPipelineVertexInputStateCreateInfo* a,
+                                                     const VkPipelineVertexInputStateCreateInfo* b,
+                                                     OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->vertexBindingDescriptionCount) == (b->vertexBindingDescriptionCount))) { onFail("a->vertexBindingDescriptionCount (Error: Value not equal)"); };
-    if ((a->pVertexBindingDescriptions) && (b->pVertexBindingDescriptions))
-    {
-        if (!((a->vertexBindingDescriptionCount) == (b->vertexBindingDescriptionCount))) { onFail("a->pVertexBindingDescriptions (Error: Lengths not equal)"); };
-        if ((a->vertexBindingDescriptionCount) == (b->vertexBindingDescriptionCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->vertexBindingDescriptionCount; ++i)
-                {
-                    checkEqual_VkVertexInputBindingDescription(a->pVertexBindingDescriptions + i, b->pVertexBindingDescriptions + i, onFail);
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->vertexBindingDescriptionCount) == (b->vertexBindingDescriptionCount))) {
+        onFail("a->vertexBindingDescriptionCount (Error: Value not equal)");
+    };
+    if ((a->pVertexBindingDescriptions) && (b->pVertexBindingDescriptions)) {
+        if (!((a->vertexBindingDescriptionCount) == (b->vertexBindingDescriptionCount))) {
+            onFail("a->pVertexBindingDescriptions (Error: Lengths not equal)");
+        };
+        if ((a->vertexBindingDescriptionCount) == (b->vertexBindingDescriptionCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->vertexBindingDescriptionCount; ++i) {
+                    checkEqual_VkVertexInputBindingDescription(a->pVertexBindingDescriptions + i,
+                                                               b->pVertexBindingDescriptions + i,
+                                                               onFail);
                 }
             }
         }
     }
-    if (!((a->vertexAttributeDescriptionCount) == (b->vertexAttributeDescriptionCount))) { onFail("a->vertexAttributeDescriptionCount (Error: Value not equal)"); };
-    if ((a->pVertexAttributeDescriptions) && (b->pVertexAttributeDescriptions))
-    {
-        if (!((a->vertexAttributeDescriptionCount) == (b->vertexAttributeDescriptionCount))) { onFail("a->pVertexAttributeDescriptions (Error: Lengths not equal)"); };
-        if ((a->vertexAttributeDescriptionCount) == (b->vertexAttributeDescriptionCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->vertexAttributeDescriptionCount; ++i)
-                {
-                    checkEqual_VkVertexInputAttributeDescription(a->pVertexAttributeDescriptions + i, b->pVertexAttributeDescriptions + i, onFail);
+    if (!((a->vertexAttributeDescriptionCount) == (b->vertexAttributeDescriptionCount))) {
+        onFail("a->vertexAttributeDescriptionCount (Error: Value not equal)");
+    };
+    if ((a->pVertexAttributeDescriptions) && (b->pVertexAttributeDescriptions)) {
+        if (!((a->vertexAttributeDescriptionCount) == (b->vertexAttributeDescriptionCount))) {
+            onFail("a->pVertexAttributeDescriptions (Error: Lengths not equal)");
+        };
+        if ((a->vertexAttributeDescriptionCount) == (b->vertexAttributeDescriptionCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->vertexAttributeDescriptionCount; ++i) {
+                    checkEqual_VkVertexInputAttributeDescription(
+                        a->pVertexAttributeDescriptions + i, b->pVertexAttributeDescriptions + i,
+                        onFail);
                 }
             }
         }
@@ -1280,89 +1987,108 @@
 
 void checkEqual_VkPipelineInputAssemblyStateCreateInfo(
     const VkPipelineInputAssemblyStateCreateInfo* a,
-    const VkPipelineInputAssemblyStateCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPipelineInputAssemblyStateCreateInfo* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->topology) == (b->topology))) { onFail("a->topology (Error: Value not equal)"); };
-    if (!((a->primitiveRestartEnable) == (b->primitiveRestartEnable))) { onFail("a->primitiveRestartEnable (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->topology) == (b->topology))) {
+        onFail("a->topology (Error: Value not equal)");
+    };
+    if (!((a->primitiveRestartEnable) == (b->primitiveRestartEnable))) {
+        onFail("a->primitiveRestartEnable (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPipelineTessellationStateCreateInfo(
-    const VkPipelineTessellationStateCreateInfo* a,
-    const VkPipelineTessellationStateCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPipelineTessellationStateCreateInfo* a, const VkPipelineTessellationStateCreateInfo* b,
+    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->patchControlPoints) == (b->patchControlPoints))) { onFail("a->patchControlPoints (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->patchControlPoints) == (b->patchControlPoints))) {
+        onFail("a->patchControlPoints (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkViewport(
-    const VkViewport* a,
-    const VkViewport* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->x) == (b->x))) { onFail("a->x (Error: Value not equal)"); };
-    if (!((a->y) == (b->y))) { onFail("a->y (Error: Value not equal)"); };
-    if (!((a->width) == (b->width))) { onFail("a->width (Error: Value not equal)"); };
-    if (!((a->height) == (b->height))) { onFail("a->height (Error: Value not equal)"); };
-    if (!((a->minDepth) == (b->minDepth))) { onFail("a->minDepth (Error: Value not equal)"); };
-    if (!((a->maxDepth) == (b->maxDepth))) { onFail("a->maxDepth (Error: Value not equal)"); };
+void checkEqual_VkViewport(const VkViewport* a, const VkViewport* b, OnFailCompareFunc onFail) {
+    if (!((a->x) == (b->x))) {
+        onFail("a->x (Error: Value not equal)");
+    };
+    if (!((a->y) == (b->y))) {
+        onFail("a->y (Error: Value not equal)");
+    };
+    if (!((a->width) == (b->width))) {
+        onFail("a->width (Error: Value not equal)");
+    };
+    if (!((a->height) == (b->height))) {
+        onFail("a->height (Error: Value not equal)");
+    };
+    if (!((a->minDepth) == (b->minDepth))) {
+        onFail("a->minDepth (Error: Value not equal)");
+    };
+    if (!((a->maxDepth) == (b->maxDepth))) {
+        onFail("a->maxDepth (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkPipelineViewportStateCreateInfo(
-    const VkPipelineViewportStateCreateInfo* a,
-    const VkPipelineViewportStateCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPipelineViewportStateCreateInfo(const VkPipelineViewportStateCreateInfo* a,
+                                                  const VkPipelineViewportStateCreateInfo* b,
+                                                  OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->viewportCount) == (b->viewportCount))) { onFail("a->viewportCount (Error: Value not equal)"); };
-    if (!((!(a->pViewports) && !(b->pViewports)) || ((a->pViewports) && (b->pViewports)))) { onFail("a->pViewports (Error: Mismatch in optional field)"); };
-    if (a->pViewports && b->pViewports)
-    {
-        if ((a->pViewports) && (b->pViewports))
-        {
-            if (!((a->viewportCount) == (b->viewportCount))) { onFail("a->pViewports (Error: Lengths not equal)"); };
-            if ((a->viewportCount) == (b->viewportCount))
-            {
-                if (a)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)a->viewportCount; ++i)
-                    {
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->viewportCount) == (b->viewportCount))) {
+        onFail("a->viewportCount (Error: Value not equal)");
+    };
+    if (!((!(a->pViewports) && !(b->pViewports)) || ((a->pViewports) && (b->pViewports)))) {
+        onFail("a->pViewports (Error: Mismatch in optional field)");
+    };
+    if (a->pViewports && b->pViewports) {
+        if ((a->pViewports) && (b->pViewports)) {
+            if (!((a->viewportCount) == (b->viewportCount))) {
+                onFail("a->pViewports (Error: Lengths not equal)");
+            };
+            if ((a->viewportCount) == (b->viewportCount)) {
+                if (a) {
+                    for (uint32_t i = 0; i < (uint32_t)a->viewportCount; ++i) {
                         checkEqual_VkViewport(a->pViewports + i, b->pViewports + i, onFail);
                     }
                 }
             }
         }
     }
-    if (!((a->scissorCount) == (b->scissorCount))) { onFail("a->scissorCount (Error: Value not equal)"); };
-    if (!((!(a->pScissors) && !(b->pScissors)) || ((a->pScissors) && (b->pScissors)))) { onFail("a->pScissors (Error: Mismatch in optional field)"); };
-    if (a->pScissors && b->pScissors)
-    {
-        if ((a->pScissors) && (b->pScissors))
-        {
-            if (!((a->scissorCount) == (b->scissorCount))) { onFail("a->pScissors (Error: Lengths not equal)"); };
-            if ((a->scissorCount) == (b->scissorCount))
-            {
-                if (a)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)a->scissorCount; ++i)
-                    {
+    if (!((a->scissorCount) == (b->scissorCount))) {
+        onFail("a->scissorCount (Error: Value not equal)");
+    };
+    if (!((!(a->pScissors) && !(b->pScissors)) || ((a->pScissors) && (b->pScissors)))) {
+        onFail("a->pScissors (Error: Mismatch in optional field)");
+    };
+    if (a->pScissors && b->pScissors) {
+        if ((a->pScissors) && (b->pScissors)) {
+            if (!((a->scissorCount) == (b->scissorCount))) {
+                onFail("a->pScissors (Error: Lengths not equal)");
+            };
+            if ((a->scissorCount) == (b->scissorCount)) {
+                if (a) {
+                    for (uint32_t i = 0; i < (uint32_t)a->scissorCount; ++i) {
                         checkEqual_VkRect2D(a->pScissors + i, b->pScissors + i, onFail);
                     }
                 }
@@ -1373,393 +2099,582 @@
 
 void checkEqual_VkPipelineRasterizationStateCreateInfo(
     const VkPipelineRasterizationStateCreateInfo* a,
-    const VkPipelineRasterizationStateCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPipelineRasterizationStateCreateInfo* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->depthClampEnable) == (b->depthClampEnable))) { onFail("a->depthClampEnable (Error: Value not equal)"); };
-    if (!((a->rasterizerDiscardEnable) == (b->rasterizerDiscardEnable))) { onFail("a->rasterizerDiscardEnable (Error: Value not equal)"); };
-    if (!((a->polygonMode) == (b->polygonMode))) { onFail("a->polygonMode (Error: Value not equal)"); };
-    if (!((a->cullMode) == (b->cullMode))) { onFail("a->cullMode (Error: Value not equal)"); };
-    if (!((a->frontFace) == (b->frontFace))) { onFail("a->frontFace (Error: Value not equal)"); };
-    if (!((a->depthBiasEnable) == (b->depthBiasEnable))) { onFail("a->depthBiasEnable (Error: Value not equal)"); };
-    if (!((a->depthBiasConstantFactor) == (b->depthBiasConstantFactor))) { onFail("a->depthBiasConstantFactor (Error: Value not equal)"); };
-    if (!((a->depthBiasClamp) == (b->depthBiasClamp))) { onFail("a->depthBiasClamp (Error: Value not equal)"); };
-    if (!((a->depthBiasSlopeFactor) == (b->depthBiasSlopeFactor))) { onFail("a->depthBiasSlopeFactor (Error: Value not equal)"); };
-    if (!((a->lineWidth) == (b->lineWidth))) { onFail("a->lineWidth (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->depthClampEnable) == (b->depthClampEnable))) {
+        onFail("a->depthClampEnable (Error: Value not equal)");
+    };
+    if (!((a->rasterizerDiscardEnable) == (b->rasterizerDiscardEnable))) {
+        onFail("a->rasterizerDiscardEnable (Error: Value not equal)");
+    };
+    if (!((a->polygonMode) == (b->polygonMode))) {
+        onFail("a->polygonMode (Error: Value not equal)");
+    };
+    if (!((a->cullMode) == (b->cullMode))) {
+        onFail("a->cullMode (Error: Value not equal)");
+    };
+    if (!((a->frontFace) == (b->frontFace))) {
+        onFail("a->frontFace (Error: Value not equal)");
+    };
+    if (!((a->depthBiasEnable) == (b->depthBiasEnable))) {
+        onFail("a->depthBiasEnable (Error: Value not equal)");
+    };
+    if (!((a->depthBiasConstantFactor) == (b->depthBiasConstantFactor))) {
+        onFail("a->depthBiasConstantFactor (Error: Value not equal)");
+    };
+    if (!((a->depthBiasClamp) == (b->depthBiasClamp))) {
+        onFail("a->depthBiasClamp (Error: Value not equal)");
+    };
+    if (!((a->depthBiasSlopeFactor) == (b->depthBiasSlopeFactor))) {
+        onFail("a->depthBiasSlopeFactor (Error: Value not equal)");
+    };
+    if (!((a->lineWidth) == (b->lineWidth))) {
+        onFail("a->lineWidth (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkPipelineMultisampleStateCreateInfo(
-    const VkPipelineMultisampleStateCreateInfo* a,
-    const VkPipelineMultisampleStateCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPipelineMultisampleStateCreateInfo(const VkPipelineMultisampleStateCreateInfo* a,
+                                                     const VkPipelineMultisampleStateCreateInfo* b,
+                                                     OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->rasterizationSamples) == (b->rasterizationSamples))) { onFail("a->rasterizationSamples (Error: Value not equal)"); };
-    if (!((a->sampleShadingEnable) == (b->sampleShadingEnable))) { onFail("a->sampleShadingEnable (Error: Value not equal)"); };
-    if (!((a->minSampleShading) == (b->minSampleShading))) { onFail("a->minSampleShading (Error: Value not equal)"); };
-    if (!((!(a->pSampleMask) && !(b->pSampleMask)) || ((a->pSampleMask) && (b->pSampleMask)))) { onFail("a->pSampleMask (Error: Mismatch in optional field)"); };
-    if (a->pSampleMask && b->pSampleMask)
-    {
-        if (!(((((a->rasterizationSamples) + 31) / 32)) == ((((b->rasterizationSamples) + 31) / 32)))) { onFail("a->pSampleMask (Error: Lengths not equal)"); };
-        if (!((memcmp(a->pSampleMask, b->pSampleMask, (((a->rasterizationSamples) + 31) / 32) * sizeof(const VkSampleMask)) == 0))) { onFail("a->pSampleMask (Error: Unequal dyn array)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->rasterizationSamples) == (b->rasterizationSamples))) {
+        onFail("a->rasterizationSamples (Error: Value not equal)");
+    };
+    if (!((a->sampleShadingEnable) == (b->sampleShadingEnable))) {
+        onFail("a->sampleShadingEnable (Error: Value not equal)");
+    };
+    if (!((a->minSampleShading) == (b->minSampleShading))) {
+        onFail("a->minSampleShading (Error: Value not equal)");
+    };
+    if (!((!(a->pSampleMask) && !(b->pSampleMask)) || ((a->pSampleMask) && (b->pSampleMask)))) {
+        onFail("a->pSampleMask (Error: Mismatch in optional field)");
+    };
+    if (a->pSampleMask && b->pSampleMask) {
+        if (!(((((a->rasterizationSamples) + 31) / 32)) ==
+              ((((b->rasterizationSamples) + 31) / 32)))) {
+            onFail("a->pSampleMask (Error: Lengths not equal)");
+        };
+        if (!((memcmp(a->pSampleMask, b->pSampleMask,
+                      (((a->rasterizationSamples) + 31) / 32) * sizeof(const VkSampleMask)) ==
+               0))) {
+            onFail("a->pSampleMask (Error: Unequal dyn array)");
+        };
     }
-    if (!((a->alphaToCoverageEnable) == (b->alphaToCoverageEnable))) { onFail("a->alphaToCoverageEnable (Error: Value not equal)"); };
-    if (!((a->alphaToOneEnable) == (b->alphaToOneEnable))) { onFail("a->alphaToOneEnable (Error: Value not equal)"); };
+    if (!((a->alphaToCoverageEnable) == (b->alphaToCoverageEnable))) {
+        onFail("a->alphaToCoverageEnable (Error: Value not equal)");
+    };
+    if (!((a->alphaToOneEnable) == (b->alphaToOneEnable))) {
+        onFail("a->alphaToOneEnable (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkStencilOpState(
-    const VkStencilOpState* a,
-    const VkStencilOpState* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->failOp) == (b->failOp))) { onFail("a->failOp (Error: Value not equal)"); };
-    if (!((a->passOp) == (b->passOp))) { onFail("a->passOp (Error: Value not equal)"); };
-    if (!((a->depthFailOp) == (b->depthFailOp))) { onFail("a->depthFailOp (Error: Value not equal)"); };
-    if (!((a->compareOp) == (b->compareOp))) { onFail("a->compareOp (Error: Value not equal)"); };
-    if (!((a->compareMask) == (b->compareMask))) { onFail("a->compareMask (Error: Value not equal)"); };
-    if (!((a->writeMask) == (b->writeMask))) { onFail("a->writeMask (Error: Value not equal)"); };
-    if (!((a->reference) == (b->reference))) { onFail("a->reference (Error: Value not equal)"); };
+void checkEqual_VkStencilOpState(const VkStencilOpState* a, const VkStencilOpState* b,
+                                 OnFailCompareFunc onFail) {
+    if (!((a->failOp) == (b->failOp))) {
+        onFail("a->failOp (Error: Value not equal)");
+    };
+    if (!((a->passOp) == (b->passOp))) {
+        onFail("a->passOp (Error: Value not equal)");
+    };
+    if (!((a->depthFailOp) == (b->depthFailOp))) {
+        onFail("a->depthFailOp (Error: Value not equal)");
+    };
+    if (!((a->compareOp) == (b->compareOp))) {
+        onFail("a->compareOp (Error: Value not equal)");
+    };
+    if (!((a->compareMask) == (b->compareMask))) {
+        onFail("a->compareMask (Error: Value not equal)");
+    };
+    if (!((a->writeMask) == (b->writeMask))) {
+        onFail("a->writeMask (Error: Value not equal)");
+    };
+    if (!((a->reference) == (b->reference))) {
+        onFail("a->reference (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPipelineDepthStencilStateCreateInfo(
-    const VkPipelineDepthStencilStateCreateInfo* a,
-    const VkPipelineDepthStencilStateCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPipelineDepthStencilStateCreateInfo* a, const VkPipelineDepthStencilStateCreateInfo* b,
+    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->depthTestEnable) == (b->depthTestEnable))) { onFail("a->depthTestEnable (Error: Value not equal)"); };
-    if (!((a->depthWriteEnable) == (b->depthWriteEnable))) { onFail("a->depthWriteEnable (Error: Value not equal)"); };
-    if (!((a->depthCompareOp) == (b->depthCompareOp))) { onFail("a->depthCompareOp (Error: Value not equal)"); };
-    if (!((a->depthBoundsTestEnable) == (b->depthBoundsTestEnable))) { onFail("a->depthBoundsTestEnable (Error: Value not equal)"); };
-    if (!((a->stencilTestEnable) == (b->stencilTestEnable))) { onFail("a->stencilTestEnable (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->depthTestEnable) == (b->depthTestEnable))) {
+        onFail("a->depthTestEnable (Error: Value not equal)");
+    };
+    if (!((a->depthWriteEnable) == (b->depthWriteEnable))) {
+        onFail("a->depthWriteEnable (Error: Value not equal)");
+    };
+    if (!((a->depthCompareOp) == (b->depthCompareOp))) {
+        onFail("a->depthCompareOp (Error: Value not equal)");
+    };
+    if (!((a->depthBoundsTestEnable) == (b->depthBoundsTestEnable))) {
+        onFail("a->depthBoundsTestEnable (Error: Value not equal)");
+    };
+    if (!((a->stencilTestEnable) == (b->stencilTestEnable))) {
+        onFail("a->stencilTestEnable (Error: Value not equal)");
+    };
     checkEqual_VkStencilOpState(&a->front, &b->front, onFail);
     checkEqual_VkStencilOpState(&a->back, &b->back, onFail);
-    if (!((a->minDepthBounds) == (b->minDepthBounds))) { onFail("a->minDepthBounds (Error: Value not equal)"); };
-    if (!((a->maxDepthBounds) == (b->maxDepthBounds))) { onFail("a->maxDepthBounds (Error: Value not equal)"); };
+    if (!((a->minDepthBounds) == (b->minDepthBounds))) {
+        onFail("a->minDepthBounds (Error: Value not equal)");
+    };
+    if (!((a->maxDepthBounds) == (b->maxDepthBounds))) {
+        onFail("a->maxDepthBounds (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkPipelineColorBlendAttachmentState(
-    const VkPipelineColorBlendAttachmentState* a,
-    const VkPipelineColorBlendAttachmentState* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->blendEnable) == (b->blendEnable))) { onFail("a->blendEnable (Error: Value not equal)"); };
-    if (!((a->srcColorBlendFactor) == (b->srcColorBlendFactor))) { onFail("a->srcColorBlendFactor (Error: Value not equal)"); };
-    if (!((a->dstColorBlendFactor) == (b->dstColorBlendFactor))) { onFail("a->dstColorBlendFactor (Error: Value not equal)"); };
-    if (!((a->colorBlendOp) == (b->colorBlendOp))) { onFail("a->colorBlendOp (Error: Value not equal)"); };
-    if (!((a->srcAlphaBlendFactor) == (b->srcAlphaBlendFactor))) { onFail("a->srcAlphaBlendFactor (Error: Value not equal)"); };
-    if (!((a->dstAlphaBlendFactor) == (b->dstAlphaBlendFactor))) { onFail("a->dstAlphaBlendFactor (Error: Value not equal)"); };
-    if (!((a->alphaBlendOp) == (b->alphaBlendOp))) { onFail("a->alphaBlendOp (Error: Value not equal)"); };
-    if (!((a->colorWriteMask) == (b->colorWriteMask))) { onFail("a->colorWriteMask (Error: Value not equal)"); };
+void checkEqual_VkPipelineColorBlendAttachmentState(const VkPipelineColorBlendAttachmentState* a,
+                                                    const VkPipelineColorBlendAttachmentState* b,
+                                                    OnFailCompareFunc onFail) {
+    if (!((a->blendEnable) == (b->blendEnable))) {
+        onFail("a->blendEnable (Error: Value not equal)");
+    };
+    if (!((a->srcColorBlendFactor) == (b->srcColorBlendFactor))) {
+        onFail("a->srcColorBlendFactor (Error: Value not equal)");
+    };
+    if (!((a->dstColorBlendFactor) == (b->dstColorBlendFactor))) {
+        onFail("a->dstColorBlendFactor (Error: Value not equal)");
+    };
+    if (!((a->colorBlendOp) == (b->colorBlendOp))) {
+        onFail("a->colorBlendOp (Error: Value not equal)");
+    };
+    if (!((a->srcAlphaBlendFactor) == (b->srcAlphaBlendFactor))) {
+        onFail("a->srcAlphaBlendFactor (Error: Value not equal)");
+    };
+    if (!((a->dstAlphaBlendFactor) == (b->dstAlphaBlendFactor))) {
+        onFail("a->dstAlphaBlendFactor (Error: Value not equal)");
+    };
+    if (!((a->alphaBlendOp) == (b->alphaBlendOp))) {
+        onFail("a->alphaBlendOp (Error: Value not equal)");
+    };
+    if (!((a->colorWriteMask) == (b->colorWriteMask))) {
+        onFail("a->colorWriteMask (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkPipelineColorBlendStateCreateInfo(
-    const VkPipelineColorBlendStateCreateInfo* a,
-    const VkPipelineColorBlendStateCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPipelineColorBlendStateCreateInfo(const VkPipelineColorBlendStateCreateInfo* a,
+                                                    const VkPipelineColorBlendStateCreateInfo* b,
+                                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->logicOpEnable) == (b->logicOpEnable))) { onFail("a->logicOpEnable (Error: Value not equal)"); };
-    if (!((a->logicOp) == (b->logicOp))) { onFail("a->logicOp (Error: Value not equal)"); };
-    if (!((a->attachmentCount) == (b->attachmentCount))) { onFail("a->attachmentCount (Error: Value not equal)"); };
-    if ((a->pAttachments) && (b->pAttachments))
-    {
-        if (!((a->attachmentCount) == (b->attachmentCount))) { onFail("a->pAttachments (Error: Lengths not equal)"); };
-        if ((a->attachmentCount) == (b->attachmentCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->attachmentCount; ++i)
-                {
-                    checkEqual_VkPipelineColorBlendAttachmentState(a->pAttachments + i, b->pAttachments + i, onFail);
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->logicOpEnable) == (b->logicOpEnable))) {
+        onFail("a->logicOpEnable (Error: Value not equal)");
+    };
+    if (!((a->logicOp) == (b->logicOp))) {
+        onFail("a->logicOp (Error: Value not equal)");
+    };
+    if (!((a->attachmentCount) == (b->attachmentCount))) {
+        onFail("a->attachmentCount (Error: Value not equal)");
+    };
+    if ((a->pAttachments) && (b->pAttachments)) {
+        if (!((a->attachmentCount) == (b->attachmentCount))) {
+            onFail("a->pAttachments (Error: Lengths not equal)");
+        };
+        if ((a->attachmentCount) == (b->attachmentCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->attachmentCount; ++i) {
+                    checkEqual_VkPipelineColorBlendAttachmentState(a->pAttachments + i,
+                                                                   b->pAttachments + i, onFail);
                 }
             }
         }
     }
-    if (!((memcmp(a->blendConstants, b->blendConstants, 4 * sizeof(float)) == 0))) { onFail("a->blendConstants (Error: Unequal static array)"); };
+    if (!((memcmp(a->blendConstants, b->blendConstants, 4 * sizeof(float)) == 0))) {
+        onFail("a->blendConstants (Error: Unequal static array)");
+    };
 }
 
-void checkEqual_VkPipelineDynamicStateCreateInfo(
-    const VkPipelineDynamicStateCreateInfo* a,
-    const VkPipelineDynamicStateCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPipelineDynamicStateCreateInfo(const VkPipelineDynamicStateCreateInfo* a,
+                                                 const VkPipelineDynamicStateCreateInfo* b,
+                                                 OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->dynamicStateCount) == (b->dynamicStateCount))) { onFail("a->dynamicStateCount (Error: Value not equal)"); };
-    if (!((a->dynamicStateCount) == (b->dynamicStateCount))) { onFail("a->pDynamicStates (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pDynamicStates, b->pDynamicStates, a->dynamicStateCount * sizeof(const VkDynamicState)) == 0))) { onFail("a->pDynamicStates (Error: Unequal dyn array)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->dynamicStateCount) == (b->dynamicStateCount))) {
+        onFail("a->dynamicStateCount (Error: Value not equal)");
+    };
+    if (!((a->dynamicStateCount) == (b->dynamicStateCount))) {
+        onFail("a->pDynamicStates (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pDynamicStates, b->pDynamicStates,
+                  a->dynamicStateCount * sizeof(const VkDynamicState)) == 0))) {
+        onFail("a->pDynamicStates (Error: Unequal dyn array)");
+    };
 }
 
-void checkEqual_VkGraphicsPipelineCreateInfo(
-    const VkGraphicsPipelineCreateInfo* a,
-    const VkGraphicsPipelineCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkGraphicsPipelineCreateInfo(const VkGraphicsPipelineCreateInfo* a,
+                                             const VkGraphicsPipelineCreateInfo* b,
+                                             OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->stageCount) == (b->stageCount))) { onFail("a->stageCount (Error: Value not equal)"); };
-    if ((a->pStages) && (b->pStages))
-    {
-        if (!((a->stageCount) == (b->stageCount))) { onFail("a->pStages (Error: Lengths not equal)"); };
-        if ((a->stageCount) == (b->stageCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->stageCount; ++i)
-                {
-                    checkEqual_VkPipelineShaderStageCreateInfo(a->pStages + i, b->pStages + i, onFail);
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->stageCount) == (b->stageCount))) {
+        onFail("a->stageCount (Error: Value not equal)");
+    };
+    if ((a->pStages) && (b->pStages)) {
+        if (!((a->stageCount) == (b->stageCount))) {
+            onFail("a->pStages (Error: Lengths not equal)");
+        };
+        if ((a->stageCount) == (b->stageCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->stageCount; ++i) {
+                    checkEqual_VkPipelineShaderStageCreateInfo(a->pStages + i, b->pStages + i,
+                                                               onFail);
                 }
             }
         }
     }
-    if (!((!(a->pVertexInputState) && !(b->pVertexInputState)) || ((a->pVertexInputState) && (b->pVertexInputState)))) { onFail("a->pVertexInputState (Error: Mismatch in optional field)"); };
-    if (a->pVertexInputState && b->pVertexInputState)
-    {
-        if ((a->pVertexInputState) && (b->pVertexInputState))
-        {
-            checkEqual_VkPipelineVertexInputStateCreateInfo(a->pVertexInputState, b->pVertexInputState, onFail);
+    if (!((!(a->pVertexInputState) && !(b->pVertexInputState)) ||
+          ((a->pVertexInputState) && (b->pVertexInputState)))) {
+        onFail("a->pVertexInputState (Error: Mismatch in optional field)");
+    };
+    if (a->pVertexInputState && b->pVertexInputState) {
+        if ((a->pVertexInputState) && (b->pVertexInputState)) {
+            checkEqual_VkPipelineVertexInputStateCreateInfo(a->pVertexInputState,
+                                                            b->pVertexInputState, onFail);
         }
     }
-    if (!((!(a->pInputAssemblyState) && !(b->pInputAssemblyState)) || ((a->pInputAssemblyState) && (b->pInputAssemblyState)))) { onFail("a->pInputAssemblyState (Error: Mismatch in optional field)"); };
-    if (a->pInputAssemblyState && b->pInputAssemblyState)
-    {
-        if ((a->pInputAssemblyState) && (b->pInputAssemblyState))
-        {
-            checkEqual_VkPipelineInputAssemblyStateCreateInfo(a->pInputAssemblyState, b->pInputAssemblyState, onFail);
+    if (!((!(a->pInputAssemblyState) && !(b->pInputAssemblyState)) ||
+          ((a->pInputAssemblyState) && (b->pInputAssemblyState)))) {
+        onFail("a->pInputAssemblyState (Error: Mismatch in optional field)");
+    };
+    if (a->pInputAssemblyState && b->pInputAssemblyState) {
+        if ((a->pInputAssemblyState) && (b->pInputAssemblyState)) {
+            checkEqual_VkPipelineInputAssemblyStateCreateInfo(a->pInputAssemblyState,
+                                                              b->pInputAssemblyState, onFail);
         }
     }
-    if (!((!(a->pTessellationState) && !(b->pTessellationState)) || ((a->pTessellationState) && (b->pTessellationState)))) { onFail("a->pTessellationState (Error: Mismatch in optional field)"); };
-    if (a->pTessellationState && b->pTessellationState)
-    {
-        if ((a->pTessellationState) && (b->pTessellationState))
-        {
-            checkEqual_VkPipelineTessellationStateCreateInfo(a->pTessellationState, b->pTessellationState, onFail);
+    if (!((!(a->pTessellationState) && !(b->pTessellationState)) ||
+          ((a->pTessellationState) && (b->pTessellationState)))) {
+        onFail("a->pTessellationState (Error: Mismatch in optional field)");
+    };
+    if (a->pTessellationState && b->pTessellationState) {
+        if ((a->pTessellationState) && (b->pTessellationState)) {
+            checkEqual_VkPipelineTessellationStateCreateInfo(a->pTessellationState,
+                                                             b->pTessellationState, onFail);
         }
     }
-    if (!((!(a->pViewportState) && !(b->pViewportState)) || ((a->pViewportState) && (b->pViewportState)))) { onFail("a->pViewportState (Error: Mismatch in optional field)"); };
-    if (a->pViewportState && b->pViewportState)
-    {
-        if ((a->pViewportState) && (b->pViewportState))
-        {
-            checkEqual_VkPipelineViewportStateCreateInfo(a->pViewportState, b->pViewportState, onFail);
+    if (!((!(a->pViewportState) && !(b->pViewportState)) ||
+          ((a->pViewportState) && (b->pViewportState)))) {
+        onFail("a->pViewportState (Error: Mismatch in optional field)");
+    };
+    if (a->pViewportState && b->pViewportState) {
+        if ((a->pViewportState) && (b->pViewportState)) {
+            checkEqual_VkPipelineViewportStateCreateInfo(a->pViewportState, b->pViewportState,
+                                                         onFail);
         }
     }
-    if (!((!(a->pRasterizationState) && !(b->pRasterizationState)) || ((a->pRasterizationState) && (b->pRasterizationState)))) { onFail("a->pRasterizationState (Error: Mismatch in optional field)"); };
-    if (a->pRasterizationState && b->pRasterizationState)
-    {
-        if ((a->pRasterizationState) && (b->pRasterizationState))
-        {
-            checkEqual_VkPipelineRasterizationStateCreateInfo(a->pRasterizationState, b->pRasterizationState, onFail);
+    if (!((!(a->pRasterizationState) && !(b->pRasterizationState)) ||
+          ((a->pRasterizationState) && (b->pRasterizationState)))) {
+        onFail("a->pRasterizationState (Error: Mismatch in optional field)");
+    };
+    if (a->pRasterizationState && b->pRasterizationState) {
+        if ((a->pRasterizationState) && (b->pRasterizationState)) {
+            checkEqual_VkPipelineRasterizationStateCreateInfo(a->pRasterizationState,
+                                                              b->pRasterizationState, onFail);
         }
     }
-    if (!((!(a->pMultisampleState) && !(b->pMultisampleState)) || ((a->pMultisampleState) && (b->pMultisampleState)))) { onFail("a->pMultisampleState (Error: Mismatch in optional field)"); };
-    if (a->pMultisampleState && b->pMultisampleState)
-    {
-        if ((a->pMultisampleState) && (b->pMultisampleState))
-        {
-            checkEqual_VkPipelineMultisampleStateCreateInfo(a->pMultisampleState, b->pMultisampleState, onFail);
+    if (!((!(a->pMultisampleState) && !(b->pMultisampleState)) ||
+          ((a->pMultisampleState) && (b->pMultisampleState)))) {
+        onFail("a->pMultisampleState (Error: Mismatch in optional field)");
+    };
+    if (a->pMultisampleState && b->pMultisampleState) {
+        if ((a->pMultisampleState) && (b->pMultisampleState)) {
+            checkEqual_VkPipelineMultisampleStateCreateInfo(a->pMultisampleState,
+                                                            b->pMultisampleState, onFail);
         }
     }
-    if (!((!(a->pDepthStencilState) && !(b->pDepthStencilState)) || ((a->pDepthStencilState) && (b->pDepthStencilState)))) { onFail("a->pDepthStencilState (Error: Mismatch in optional field)"); };
-    if (a->pDepthStencilState && b->pDepthStencilState)
-    {
-        if ((a->pDepthStencilState) && (b->pDepthStencilState))
-        {
-            checkEqual_VkPipelineDepthStencilStateCreateInfo(a->pDepthStencilState, b->pDepthStencilState, onFail);
+    if (!((!(a->pDepthStencilState) && !(b->pDepthStencilState)) ||
+          ((a->pDepthStencilState) && (b->pDepthStencilState)))) {
+        onFail("a->pDepthStencilState (Error: Mismatch in optional field)");
+    };
+    if (a->pDepthStencilState && b->pDepthStencilState) {
+        if ((a->pDepthStencilState) && (b->pDepthStencilState)) {
+            checkEqual_VkPipelineDepthStencilStateCreateInfo(a->pDepthStencilState,
+                                                             b->pDepthStencilState, onFail);
         }
     }
-    if (!((!(a->pColorBlendState) && !(b->pColorBlendState)) || ((a->pColorBlendState) && (b->pColorBlendState)))) { onFail("a->pColorBlendState (Error: Mismatch in optional field)"); };
-    if (a->pColorBlendState && b->pColorBlendState)
-    {
-        if ((a->pColorBlendState) && (b->pColorBlendState))
-        {
-            checkEqual_VkPipelineColorBlendStateCreateInfo(a->pColorBlendState, b->pColorBlendState, onFail);
+    if (!((!(a->pColorBlendState) && !(b->pColorBlendState)) ||
+          ((a->pColorBlendState) && (b->pColorBlendState)))) {
+        onFail("a->pColorBlendState (Error: Mismatch in optional field)");
+    };
+    if (a->pColorBlendState && b->pColorBlendState) {
+        if ((a->pColorBlendState) && (b->pColorBlendState)) {
+            checkEqual_VkPipelineColorBlendStateCreateInfo(a->pColorBlendState, b->pColorBlendState,
+                                                           onFail);
         }
     }
-    if (!((!(a->pDynamicState) && !(b->pDynamicState)) || ((a->pDynamicState) && (b->pDynamicState)))) { onFail("a->pDynamicState (Error: Mismatch in optional field)"); };
-    if (a->pDynamicState && b->pDynamicState)
-    {
-        if ((a->pDynamicState) && (b->pDynamicState))
-        {
+    if (!((!(a->pDynamicState) && !(b->pDynamicState)) ||
+          ((a->pDynamicState) && (b->pDynamicState)))) {
+        onFail("a->pDynamicState (Error: Mismatch in optional field)");
+    };
+    if (a->pDynamicState && b->pDynamicState) {
+        if ((a->pDynamicState) && (b->pDynamicState)) {
             checkEqual_VkPipelineDynamicStateCreateInfo(a->pDynamicState, b->pDynamicState, onFail);
         }
     }
-    if (!((a->layout) == (b->layout))) { onFail("a->layout (Error: Value not equal)"); };
-    if (!((a->renderPass) == (b->renderPass))) { onFail("a->renderPass (Error: Value not equal)"); };
-    if (!((a->subpass) == (b->subpass))) { onFail("a->subpass (Error: Value not equal)"); };
-    if (!((a->basePipelineHandle) == (b->basePipelineHandle))) { onFail("a->basePipelineHandle (Error: Value not equal)"); };
-    if (!((a->basePipelineIndex) == (b->basePipelineIndex))) { onFail("a->basePipelineIndex (Error: Value not equal)"); };
+    if (!((a->layout) == (b->layout))) {
+        onFail("a->layout (Error: Value not equal)");
+    };
+    if (!((a->renderPass) == (b->renderPass))) {
+        onFail("a->renderPass (Error: Value not equal)");
+    };
+    if (!((a->subpass) == (b->subpass))) {
+        onFail("a->subpass (Error: Value not equal)");
+    };
+    if (!((a->basePipelineHandle) == (b->basePipelineHandle))) {
+        onFail("a->basePipelineHandle (Error: Value not equal)");
+    };
+    if (!((a->basePipelineIndex) == (b->basePipelineIndex))) {
+        onFail("a->basePipelineIndex (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkPushConstantRange(
-    const VkPushConstantRange* a,
-    const VkPushConstantRange* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->stageFlags) == (b->stageFlags))) { onFail("a->stageFlags (Error: Value not equal)"); };
-    if (!((a->offset) == (b->offset))) { onFail("a->offset (Error: Value not equal)"); };
-    if (!((a->size) == (b->size))) { onFail("a->size (Error: Value not equal)"); };
+void checkEqual_VkPushConstantRange(const VkPushConstantRange* a, const VkPushConstantRange* b,
+                                    OnFailCompareFunc onFail) {
+    if (!((a->stageFlags) == (b->stageFlags))) {
+        onFail("a->stageFlags (Error: Value not equal)");
+    };
+    if (!((a->offset) == (b->offset))) {
+        onFail("a->offset (Error: Value not equal)");
+    };
+    if (!((a->size) == (b->size))) {
+        onFail("a->size (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkPipelineLayoutCreateInfo(
-    const VkPipelineLayoutCreateInfo* a,
-    const VkPipelineLayoutCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPipelineLayoutCreateInfo(const VkPipelineLayoutCreateInfo* a,
+                                           const VkPipelineLayoutCreateInfo* b,
+                                           OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->setLayoutCount) == (b->setLayoutCount))) { onFail("a->setLayoutCount (Error: Value not equal)"); };
-    if (!((a->setLayoutCount) == (b->setLayoutCount))) { onFail("a->pSetLayouts (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pSetLayouts, b->pSetLayouts, a->setLayoutCount * sizeof(const VkDescriptorSetLayout)) == 0))) { onFail("a->pSetLayouts (Error: Unequal dyn array)"); };
-    if (!((a->pushConstantRangeCount) == (b->pushConstantRangeCount))) { onFail("a->pushConstantRangeCount (Error: Value not equal)"); };
-    if ((a->pPushConstantRanges) && (b->pPushConstantRanges))
-    {
-        if (!((a->pushConstantRangeCount) == (b->pushConstantRangeCount))) { onFail("a->pPushConstantRanges (Error: Lengths not equal)"); };
-        if ((a->pushConstantRangeCount) == (b->pushConstantRangeCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->pushConstantRangeCount; ++i)
-                {
-                    checkEqual_VkPushConstantRange(a->pPushConstantRanges + i, b->pPushConstantRanges + i, onFail);
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->setLayoutCount) == (b->setLayoutCount))) {
+        onFail("a->setLayoutCount (Error: Value not equal)");
+    };
+    if (!((a->setLayoutCount) == (b->setLayoutCount))) {
+        onFail("a->pSetLayouts (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pSetLayouts, b->pSetLayouts,
+                  a->setLayoutCount * sizeof(const VkDescriptorSetLayout)) == 0))) {
+        onFail("a->pSetLayouts (Error: Unequal dyn array)");
+    };
+    if (!((a->pushConstantRangeCount) == (b->pushConstantRangeCount))) {
+        onFail("a->pushConstantRangeCount (Error: Value not equal)");
+    };
+    if ((a->pPushConstantRanges) && (b->pPushConstantRanges)) {
+        if (!((a->pushConstantRangeCount) == (b->pushConstantRangeCount))) {
+            onFail("a->pPushConstantRanges (Error: Lengths not equal)");
+        };
+        if ((a->pushConstantRangeCount) == (b->pushConstantRangeCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->pushConstantRangeCount; ++i) {
+                    checkEqual_VkPushConstantRange(a->pPushConstantRanges + i,
+                                                   b->pPushConstantRanges + i, onFail);
                 }
             }
         }
     }
 }
 
-void checkEqual_VkSamplerCreateInfo(
-    const VkSamplerCreateInfo* a,
-    const VkSamplerCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkSamplerCreateInfo(const VkSamplerCreateInfo* a, const VkSamplerCreateInfo* b,
+                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->magFilter) == (b->magFilter))) { onFail("a->magFilter (Error: Value not equal)"); };
-    if (!((a->minFilter) == (b->minFilter))) { onFail("a->minFilter (Error: Value not equal)"); };
-    if (!((a->mipmapMode) == (b->mipmapMode))) { onFail("a->mipmapMode (Error: Value not equal)"); };
-    if (!((a->addressModeU) == (b->addressModeU))) { onFail("a->addressModeU (Error: Value not equal)"); };
-    if (!((a->addressModeV) == (b->addressModeV))) { onFail("a->addressModeV (Error: Value not equal)"); };
-    if (!((a->addressModeW) == (b->addressModeW))) { onFail("a->addressModeW (Error: Value not equal)"); };
-    if (!((a->mipLodBias) == (b->mipLodBias))) { onFail("a->mipLodBias (Error: Value not equal)"); };
-    if (!((a->anisotropyEnable) == (b->anisotropyEnable))) { onFail("a->anisotropyEnable (Error: Value not equal)"); };
-    if (!((a->maxAnisotropy) == (b->maxAnisotropy))) { onFail("a->maxAnisotropy (Error: Value not equal)"); };
-    if (!((a->compareEnable) == (b->compareEnable))) { onFail("a->compareEnable (Error: Value not equal)"); };
-    if (!((a->compareOp) == (b->compareOp))) { onFail("a->compareOp (Error: Value not equal)"); };
-    if (!((a->minLod) == (b->minLod))) { onFail("a->minLod (Error: Value not equal)"); };
-    if (!((a->maxLod) == (b->maxLod))) { onFail("a->maxLod (Error: Value not equal)"); };
-    if (!((a->borderColor) == (b->borderColor))) { onFail("a->borderColor (Error: Value not equal)"); };
-    if (!((a->unnormalizedCoordinates) == (b->unnormalizedCoordinates))) { onFail("a->unnormalizedCoordinates (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->magFilter) == (b->magFilter))) {
+        onFail("a->magFilter (Error: Value not equal)");
+    };
+    if (!((a->minFilter) == (b->minFilter))) {
+        onFail("a->minFilter (Error: Value not equal)");
+    };
+    if (!((a->mipmapMode) == (b->mipmapMode))) {
+        onFail("a->mipmapMode (Error: Value not equal)");
+    };
+    if (!((a->addressModeU) == (b->addressModeU))) {
+        onFail("a->addressModeU (Error: Value not equal)");
+    };
+    if (!((a->addressModeV) == (b->addressModeV))) {
+        onFail("a->addressModeV (Error: Value not equal)");
+    };
+    if (!((a->addressModeW) == (b->addressModeW))) {
+        onFail("a->addressModeW (Error: Value not equal)");
+    };
+    if (!((a->mipLodBias) == (b->mipLodBias))) {
+        onFail("a->mipLodBias (Error: Value not equal)");
+    };
+    if (!((a->anisotropyEnable) == (b->anisotropyEnable))) {
+        onFail("a->anisotropyEnable (Error: Value not equal)");
+    };
+    if (!((a->maxAnisotropy) == (b->maxAnisotropy))) {
+        onFail("a->maxAnisotropy (Error: Value not equal)");
+    };
+    if (!((a->compareEnable) == (b->compareEnable))) {
+        onFail("a->compareEnable (Error: Value not equal)");
+    };
+    if (!((a->compareOp) == (b->compareOp))) {
+        onFail("a->compareOp (Error: Value not equal)");
+    };
+    if (!((a->minLod) == (b->minLod))) {
+        onFail("a->minLod (Error: Value not equal)");
+    };
+    if (!((a->maxLod) == (b->maxLod))) {
+        onFail("a->maxLod (Error: Value not equal)");
+    };
+    if (!((a->borderColor) == (b->borderColor))) {
+        onFail("a->borderColor (Error: Value not equal)");
+    };
+    if (!((a->unnormalizedCoordinates) == (b->unnormalizedCoordinates))) {
+        onFail("a->unnormalizedCoordinates (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkCopyDescriptorSet(
-    const VkCopyDescriptorSet* a,
-    const VkCopyDescriptorSet* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkCopyDescriptorSet(const VkCopyDescriptorSet* a, const VkCopyDescriptorSet* b,
+                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->srcSet) == (b->srcSet))) { onFail("a->srcSet (Error: Value not equal)"); };
-    if (!((a->srcBinding) == (b->srcBinding))) { onFail("a->srcBinding (Error: Value not equal)"); };
-    if (!((a->srcArrayElement) == (b->srcArrayElement))) { onFail("a->srcArrayElement (Error: Value not equal)"); };
-    if (!((a->dstSet) == (b->dstSet))) { onFail("a->dstSet (Error: Value not equal)"); };
-    if (!((a->dstBinding) == (b->dstBinding))) { onFail("a->dstBinding (Error: Value not equal)"); };
-    if (!((a->dstArrayElement) == (b->dstArrayElement))) { onFail("a->dstArrayElement (Error: Value not equal)"); };
-    if (!((a->descriptorCount) == (b->descriptorCount))) { onFail("a->descriptorCount (Error: Value not equal)"); };
+    if (!((a->srcSet) == (b->srcSet))) {
+        onFail("a->srcSet (Error: Value not equal)");
+    };
+    if (!((a->srcBinding) == (b->srcBinding))) {
+        onFail("a->srcBinding (Error: Value not equal)");
+    };
+    if (!((a->srcArrayElement) == (b->srcArrayElement))) {
+        onFail("a->srcArrayElement (Error: Value not equal)");
+    };
+    if (!((a->dstSet) == (b->dstSet))) {
+        onFail("a->dstSet (Error: Value not equal)");
+    };
+    if (!((a->dstBinding) == (b->dstBinding))) {
+        onFail("a->dstBinding (Error: Value not equal)");
+    };
+    if (!((a->dstArrayElement) == (b->dstArrayElement))) {
+        onFail("a->dstArrayElement (Error: Value not equal)");
+    };
+    if (!((a->descriptorCount) == (b->descriptorCount))) {
+        onFail("a->descriptorCount (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkDescriptorBufferInfo(
-    const VkDescriptorBufferInfo* a,
-    const VkDescriptorBufferInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->buffer) == (b->buffer))) { onFail("a->buffer (Error: Value not equal)"); };
-    if (!((a->offset) == (b->offset))) { onFail("a->offset (Error: Value not equal)"); };
-    if (!((a->range) == (b->range))) { onFail("a->range (Error: Value not equal)"); };
+void checkEqual_VkDescriptorBufferInfo(const VkDescriptorBufferInfo* a,
+                                       const VkDescriptorBufferInfo* b, OnFailCompareFunc onFail) {
+    if (!((a->buffer) == (b->buffer))) {
+        onFail("a->buffer (Error: Value not equal)");
+    };
+    if (!((a->offset) == (b->offset))) {
+        onFail("a->offset (Error: Value not equal)");
+    };
+    if (!((a->range) == (b->range))) {
+        onFail("a->range (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkDescriptorImageInfo(
-    const VkDescriptorImageInfo* a,
-    const VkDescriptorImageInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sampler) == (b->sampler))) { onFail("a->sampler (Error: Value not equal)"); };
-    if (!((a->imageView) == (b->imageView))) { onFail("a->imageView (Error: Value not equal)"); };
-    if (!((a->imageLayout) == (b->imageLayout))) { onFail("a->imageLayout (Error: Value not equal)"); };
+void checkEqual_VkDescriptorImageInfo(const VkDescriptorImageInfo* a,
+                                      const VkDescriptorImageInfo* b, OnFailCompareFunc onFail) {
+    if (!((a->sampler) == (b->sampler))) {
+        onFail("a->sampler (Error: Value not equal)");
+    };
+    if (!((a->imageView) == (b->imageView))) {
+        onFail("a->imageView (Error: Value not equal)");
+    };
+    if (!((a->imageLayout) == (b->imageLayout))) {
+        onFail("a->imageLayout (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkDescriptorPoolSize(
-    const VkDescriptorPoolSize* a,
-    const VkDescriptorPoolSize* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->type) == (b->type))) { onFail("a->type (Error: Value not equal)"); };
-    if (!((a->descriptorCount) == (b->descriptorCount))) { onFail("a->descriptorCount (Error: Value not equal)"); };
+void checkEqual_VkDescriptorPoolSize(const VkDescriptorPoolSize* a, const VkDescriptorPoolSize* b,
+                                     OnFailCompareFunc onFail) {
+    if (!((a->type) == (b->type))) {
+        onFail("a->type (Error: Value not equal)");
+    };
+    if (!((a->descriptorCount) == (b->descriptorCount))) {
+        onFail("a->descriptorCount (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkDescriptorPoolCreateInfo(
-    const VkDescriptorPoolCreateInfo* a,
-    const VkDescriptorPoolCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDescriptorPoolCreateInfo(const VkDescriptorPoolCreateInfo* a,
+                                           const VkDescriptorPoolCreateInfo* b,
+                                           OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->maxSets) == (b->maxSets))) { onFail("a->maxSets (Error: Value not equal)"); };
-    if (!((a->poolSizeCount) == (b->poolSizeCount))) { onFail("a->poolSizeCount (Error: Value not equal)"); };
-    if ((a->pPoolSizes) && (b->pPoolSizes))
-    {
-        if (!((a->poolSizeCount) == (b->poolSizeCount))) { onFail("a->pPoolSizes (Error: Lengths not equal)"); };
-        if ((a->poolSizeCount) == (b->poolSizeCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->poolSizeCount; ++i)
-                {
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->maxSets) == (b->maxSets))) {
+        onFail("a->maxSets (Error: Value not equal)");
+    };
+    if (!((a->poolSizeCount) == (b->poolSizeCount))) {
+        onFail("a->poolSizeCount (Error: Value not equal)");
+    };
+    if ((a->pPoolSizes) && (b->pPoolSizes)) {
+        if (!((a->poolSizeCount) == (b->poolSizeCount))) {
+            onFail("a->pPoolSizes (Error: Lengths not equal)");
+        };
+        if ((a->poolSizeCount) == (b->poolSizeCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->poolSizeCount; ++i) {
                     checkEqual_VkDescriptorPoolSize(a->pPoolSizes + i, b->pPoolSizes + i, onFail);
                 }
             }
@@ -1767,485 +2682,613 @@
     }
 }
 
-void checkEqual_VkDescriptorSetAllocateInfo(
-    const VkDescriptorSetAllocateInfo* a,
-    const VkDescriptorSetAllocateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDescriptorSetAllocateInfo(const VkDescriptorSetAllocateInfo* a,
+                                            const VkDescriptorSetAllocateInfo* b,
+                                            OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->descriptorPool) == (b->descriptorPool))) { onFail("a->descriptorPool (Error: Value not equal)"); };
-    if (!((a->descriptorSetCount) == (b->descriptorSetCount))) { onFail("a->descriptorSetCount (Error: Value not equal)"); };
-    if (!((a->descriptorSetCount) == (b->descriptorSetCount))) { onFail("a->pSetLayouts (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pSetLayouts, b->pSetLayouts, a->descriptorSetCount * sizeof(const VkDescriptorSetLayout)) == 0))) { onFail("a->pSetLayouts (Error: Unequal dyn array)"); };
+    if (!((a->descriptorPool) == (b->descriptorPool))) {
+        onFail("a->descriptorPool (Error: Value not equal)");
+    };
+    if (!((a->descriptorSetCount) == (b->descriptorSetCount))) {
+        onFail("a->descriptorSetCount (Error: Value not equal)");
+    };
+    if (!((a->descriptorSetCount) == (b->descriptorSetCount))) {
+        onFail("a->pSetLayouts (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pSetLayouts, b->pSetLayouts,
+                  a->descriptorSetCount * sizeof(const VkDescriptorSetLayout)) == 0))) {
+        onFail("a->pSetLayouts (Error: Unequal dyn array)");
+    };
 }
 
-void checkEqual_VkDescriptorSetLayoutBinding(
-    const VkDescriptorSetLayoutBinding* a,
-    const VkDescriptorSetLayoutBinding* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->binding) == (b->binding))) { onFail("a->binding (Error: Value not equal)"); };
-    if (!((a->descriptorType) == (b->descriptorType))) { onFail("a->descriptorType (Error: Value not equal)"); };
-    if (!((a->descriptorCount) == (b->descriptorCount))) { onFail("a->descriptorCount (Error: Value not equal)"); };
-    if (!((a->stageFlags) == (b->stageFlags))) { onFail("a->stageFlags (Error: Value not equal)"); };
-    if (!((!(a->pImmutableSamplers) && !(b->pImmutableSamplers)) || ((a->pImmutableSamplers) && (b->pImmutableSamplers)))) { onFail("a->pImmutableSamplers (Error: Mismatch in optional field)"); };
-    if (a->pImmutableSamplers && b->pImmutableSamplers)
-    {
-        if (!((a->descriptorCount) == (b->descriptorCount))) { onFail("a->pImmutableSamplers (Error: Lengths not equal)"); };
-        if (!((memcmp(a->pImmutableSamplers, b->pImmutableSamplers, a->descriptorCount * sizeof(const VkSampler)) == 0))) { onFail("a->pImmutableSamplers (Error: Unequal dyn array)"); };
+void checkEqual_VkDescriptorSetLayoutBinding(const VkDescriptorSetLayoutBinding* a,
+                                             const VkDescriptorSetLayoutBinding* b,
+                                             OnFailCompareFunc onFail) {
+    if (!((a->binding) == (b->binding))) {
+        onFail("a->binding (Error: Value not equal)");
+    };
+    if (!((a->descriptorType) == (b->descriptorType))) {
+        onFail("a->descriptorType (Error: Value not equal)");
+    };
+    if (!((a->descriptorCount) == (b->descriptorCount))) {
+        onFail("a->descriptorCount (Error: Value not equal)");
+    };
+    if (!((a->stageFlags) == (b->stageFlags))) {
+        onFail("a->stageFlags (Error: Value not equal)");
+    };
+    if (!((!(a->pImmutableSamplers) && !(b->pImmutableSamplers)) ||
+          ((a->pImmutableSamplers) && (b->pImmutableSamplers)))) {
+        onFail("a->pImmutableSamplers (Error: Mismatch in optional field)");
+    };
+    if (a->pImmutableSamplers && b->pImmutableSamplers) {
+        if (!((a->descriptorCount) == (b->descriptorCount))) {
+            onFail("a->pImmutableSamplers (Error: Lengths not equal)");
+        };
+        if (!((memcmp(a->pImmutableSamplers, b->pImmutableSamplers,
+                      a->descriptorCount * sizeof(const VkSampler)) == 0))) {
+            onFail("a->pImmutableSamplers (Error: Unequal dyn array)");
+        };
     }
 }
 
-void checkEqual_VkDescriptorSetLayoutCreateInfo(
-    const VkDescriptorSetLayoutCreateInfo* a,
-    const VkDescriptorSetLayoutCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDescriptorSetLayoutCreateInfo(const VkDescriptorSetLayoutCreateInfo* a,
+                                                const VkDescriptorSetLayoutCreateInfo* b,
+                                                OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->bindingCount) == (b->bindingCount))) { onFail("a->bindingCount (Error: Value not equal)"); };
-    if ((a->pBindings) && (b->pBindings))
-    {
-        if (!((a->bindingCount) == (b->bindingCount))) { onFail("a->pBindings (Error: Lengths not equal)"); };
-        if ((a->bindingCount) == (b->bindingCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->bindingCount; ++i)
-                {
-                    checkEqual_VkDescriptorSetLayoutBinding(a->pBindings + i, b->pBindings + i, onFail);
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->bindingCount) == (b->bindingCount))) {
+        onFail("a->bindingCount (Error: Value not equal)");
+    };
+    if ((a->pBindings) && (b->pBindings)) {
+        if (!((a->bindingCount) == (b->bindingCount))) {
+            onFail("a->pBindings (Error: Lengths not equal)");
+        };
+        if ((a->bindingCount) == (b->bindingCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->bindingCount; ++i) {
+                    checkEqual_VkDescriptorSetLayoutBinding(a->pBindings + i, b->pBindings + i,
+                                                            onFail);
                 }
             }
         }
     }
 }
 
-void checkEqual_VkWriteDescriptorSet(
-    const VkWriteDescriptorSet* a,
-    const VkWriteDescriptorSet* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkWriteDescriptorSet(const VkWriteDescriptorSet* a, const VkWriteDescriptorSet* b,
+                                     OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->dstSet) == (b->dstSet))) { onFail("a->dstSet (Error: Value not equal)"); };
-    if (!((a->dstBinding) == (b->dstBinding))) { onFail("a->dstBinding (Error: Value not equal)"); };
-    if (!((a->dstArrayElement) == (b->dstArrayElement))) { onFail("a->dstArrayElement (Error: Value not equal)"); };
-    if (!((a->descriptorCount) == (b->descriptorCount))) { onFail("a->descriptorCount (Error: Value not equal)"); };
-    if (!((a->descriptorType) == (b->descriptorType))) { onFail("a->descriptorType (Error: Value not equal)"); };
-    if (!((!(a->pImageInfo) && !(b->pImageInfo)) || ((a->pImageInfo) && (b->pImageInfo)))) { onFail("a->pImageInfo (Error: Mismatch in optional field)"); };
-    if (a->pImageInfo && b->pImageInfo)
-    {
-        if ((a->pImageInfo) && (b->pImageInfo))
-        {
-            if (!((a->descriptorCount) == (b->descriptorCount))) { onFail("a->pImageInfo (Error: Lengths not equal)"); };
-            if ((a->descriptorCount) == (b->descriptorCount))
-            {
-                if (a)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)a->descriptorCount; ++i)
-                    {
-                        checkEqual_VkDescriptorImageInfo(a->pImageInfo + i, b->pImageInfo + i, onFail);
+    if (!((a->dstSet) == (b->dstSet))) {
+        onFail("a->dstSet (Error: Value not equal)");
+    };
+    if (!((a->dstBinding) == (b->dstBinding))) {
+        onFail("a->dstBinding (Error: Value not equal)");
+    };
+    if (!((a->dstArrayElement) == (b->dstArrayElement))) {
+        onFail("a->dstArrayElement (Error: Value not equal)");
+    };
+    if (!((a->descriptorCount) == (b->descriptorCount))) {
+        onFail("a->descriptorCount (Error: Value not equal)");
+    };
+    if (!((a->descriptorType) == (b->descriptorType))) {
+        onFail("a->descriptorType (Error: Value not equal)");
+    };
+    if (!((!(a->pImageInfo) && !(b->pImageInfo)) || ((a->pImageInfo) && (b->pImageInfo)))) {
+        onFail("a->pImageInfo (Error: Mismatch in optional field)");
+    };
+    if (a->pImageInfo && b->pImageInfo) {
+        if ((a->pImageInfo) && (b->pImageInfo)) {
+            if (!((a->descriptorCount) == (b->descriptorCount))) {
+                onFail("a->pImageInfo (Error: Lengths not equal)");
+            };
+            if ((a->descriptorCount) == (b->descriptorCount)) {
+                if (a) {
+                    for (uint32_t i = 0; i < (uint32_t)a->descriptorCount; ++i) {
+                        checkEqual_VkDescriptorImageInfo(a->pImageInfo + i, b->pImageInfo + i,
+                                                         onFail);
                     }
                 }
             }
         }
     }
-    if (!((!(a->pBufferInfo) && !(b->pBufferInfo)) || ((a->pBufferInfo) && (b->pBufferInfo)))) { onFail("a->pBufferInfo (Error: Mismatch in optional field)"); };
-    if (a->pBufferInfo && b->pBufferInfo)
-    {
-        if ((a->pBufferInfo) && (b->pBufferInfo))
-        {
-            if (!((a->descriptorCount) == (b->descriptorCount))) { onFail("a->pBufferInfo (Error: Lengths not equal)"); };
-            if ((a->descriptorCount) == (b->descriptorCount))
-            {
-                if (a)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)a->descriptorCount; ++i)
-                    {
-                        checkEqual_VkDescriptorBufferInfo(a->pBufferInfo + i, b->pBufferInfo + i, onFail);
+    if (!((!(a->pBufferInfo) && !(b->pBufferInfo)) || ((a->pBufferInfo) && (b->pBufferInfo)))) {
+        onFail("a->pBufferInfo (Error: Mismatch in optional field)");
+    };
+    if (a->pBufferInfo && b->pBufferInfo) {
+        if ((a->pBufferInfo) && (b->pBufferInfo)) {
+            if (!((a->descriptorCount) == (b->descriptorCount))) {
+                onFail("a->pBufferInfo (Error: Lengths not equal)");
+            };
+            if ((a->descriptorCount) == (b->descriptorCount)) {
+                if (a) {
+                    for (uint32_t i = 0; i < (uint32_t)a->descriptorCount; ++i) {
+                        checkEqual_VkDescriptorBufferInfo(a->pBufferInfo + i, b->pBufferInfo + i,
+                                                          onFail);
                     }
                 }
             }
         }
     }
-    if (!((!(a->pTexelBufferView) && !(b->pTexelBufferView)) || ((a->pTexelBufferView) && (b->pTexelBufferView)))) { onFail("a->pTexelBufferView (Error: Mismatch in optional field)"); };
-    if (a->pTexelBufferView && b->pTexelBufferView)
-    {
-        if (!((a->descriptorCount) == (b->descriptorCount))) { onFail("a->pTexelBufferView (Error: Lengths not equal)"); };
-        if (!((memcmp(a->pTexelBufferView, b->pTexelBufferView, a->descriptorCount * sizeof(const VkBufferView)) == 0))) { onFail("a->pTexelBufferView (Error: Unequal dyn array)"); };
+    if (!((!(a->pTexelBufferView) && !(b->pTexelBufferView)) ||
+          ((a->pTexelBufferView) && (b->pTexelBufferView)))) {
+        onFail("a->pTexelBufferView (Error: Mismatch in optional field)");
+    };
+    if (a->pTexelBufferView && b->pTexelBufferView) {
+        if (!((a->descriptorCount) == (b->descriptorCount))) {
+            onFail("a->pTexelBufferView (Error: Lengths not equal)");
+        };
+        if (!((memcmp(a->pTexelBufferView, b->pTexelBufferView,
+                      a->descriptorCount * sizeof(const VkBufferView)) == 0))) {
+            onFail("a->pTexelBufferView (Error: Unequal dyn array)");
+        };
     }
 }
 
-void checkEqual_VkAttachmentDescription(
-    const VkAttachmentDescription* a,
-    const VkAttachmentDescription* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->format) == (b->format))) { onFail("a->format (Error: Value not equal)"); };
-    if (!((a->samples) == (b->samples))) { onFail("a->samples (Error: Value not equal)"); };
-    if (!((a->loadOp) == (b->loadOp))) { onFail("a->loadOp (Error: Value not equal)"); };
-    if (!((a->storeOp) == (b->storeOp))) { onFail("a->storeOp (Error: Value not equal)"); };
-    if (!((a->stencilLoadOp) == (b->stencilLoadOp))) { onFail("a->stencilLoadOp (Error: Value not equal)"); };
-    if (!((a->stencilStoreOp) == (b->stencilStoreOp))) { onFail("a->stencilStoreOp (Error: Value not equal)"); };
-    if (!((a->initialLayout) == (b->initialLayout))) { onFail("a->initialLayout (Error: Value not equal)"); };
-    if (!((a->finalLayout) == (b->finalLayout))) { onFail("a->finalLayout (Error: Value not equal)"); };
+void checkEqual_VkAttachmentDescription(const VkAttachmentDescription* a,
+                                        const VkAttachmentDescription* b,
+                                        OnFailCompareFunc onFail) {
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->format) == (b->format))) {
+        onFail("a->format (Error: Value not equal)");
+    };
+    if (!((a->samples) == (b->samples))) {
+        onFail("a->samples (Error: Value not equal)");
+    };
+    if (!((a->loadOp) == (b->loadOp))) {
+        onFail("a->loadOp (Error: Value not equal)");
+    };
+    if (!((a->storeOp) == (b->storeOp))) {
+        onFail("a->storeOp (Error: Value not equal)");
+    };
+    if (!((a->stencilLoadOp) == (b->stencilLoadOp))) {
+        onFail("a->stencilLoadOp (Error: Value not equal)");
+    };
+    if (!((a->stencilStoreOp) == (b->stencilStoreOp))) {
+        onFail("a->stencilStoreOp (Error: Value not equal)");
+    };
+    if (!((a->initialLayout) == (b->initialLayout))) {
+        onFail("a->initialLayout (Error: Value not equal)");
+    };
+    if (!((a->finalLayout) == (b->finalLayout))) {
+        onFail("a->finalLayout (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkAttachmentReference(
-    const VkAttachmentReference* a,
-    const VkAttachmentReference* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->attachment) == (b->attachment))) { onFail("a->attachment (Error: Value not equal)"); };
-    if (!((a->layout) == (b->layout))) { onFail("a->layout (Error: Value not equal)"); };
+void checkEqual_VkAttachmentReference(const VkAttachmentReference* a,
+                                      const VkAttachmentReference* b, OnFailCompareFunc onFail) {
+    if (!((a->attachment) == (b->attachment))) {
+        onFail("a->attachment (Error: Value not equal)");
+    };
+    if (!((a->layout) == (b->layout))) {
+        onFail("a->layout (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkFramebufferCreateInfo(
-    const VkFramebufferCreateInfo* a,
-    const VkFramebufferCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkFramebufferCreateInfo(const VkFramebufferCreateInfo* a,
+                                        const VkFramebufferCreateInfo* b,
+                                        OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->renderPass) == (b->renderPass))) { onFail("a->renderPass (Error: Value not equal)"); };
-    if (!((a->attachmentCount) == (b->attachmentCount))) { onFail("a->attachmentCount (Error: Value not equal)"); };
-    if (!((a->attachmentCount) == (b->attachmentCount))) { onFail("a->pAttachments (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pAttachments, b->pAttachments, a->attachmentCount * sizeof(const VkImageView)) == 0))) { onFail("a->pAttachments (Error: Unequal dyn array)"); };
-    if (!((a->width) == (b->width))) { onFail("a->width (Error: Value not equal)"); };
-    if (!((a->height) == (b->height))) { onFail("a->height (Error: Value not equal)"); };
-    if (!((a->layers) == (b->layers))) { onFail("a->layers (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->renderPass) == (b->renderPass))) {
+        onFail("a->renderPass (Error: Value not equal)");
+    };
+    if (!((a->attachmentCount) == (b->attachmentCount))) {
+        onFail("a->attachmentCount (Error: Value not equal)");
+    };
+    if (!((a->attachmentCount) == (b->attachmentCount))) {
+        onFail("a->pAttachments (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pAttachments, b->pAttachments,
+                  a->attachmentCount * sizeof(const VkImageView)) == 0))) {
+        onFail("a->pAttachments (Error: Unequal dyn array)");
+    };
+    if (!((a->width) == (b->width))) {
+        onFail("a->width (Error: Value not equal)");
+    };
+    if (!((a->height) == (b->height))) {
+        onFail("a->height (Error: Value not equal)");
+    };
+    if (!((a->layers) == (b->layers))) {
+        onFail("a->layers (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkSubpassDescription(
-    const VkSubpassDescription* a,
-    const VkSubpassDescription* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->pipelineBindPoint) == (b->pipelineBindPoint))) { onFail("a->pipelineBindPoint (Error: Value not equal)"); };
-    if (!((a->inputAttachmentCount) == (b->inputAttachmentCount))) { onFail("a->inputAttachmentCount (Error: Value not equal)"); };
-    if ((a->pInputAttachments) && (b->pInputAttachments))
-    {
-        if (!((a->inputAttachmentCount) == (b->inputAttachmentCount))) { onFail("a->pInputAttachments (Error: Lengths not equal)"); };
-        if ((a->inputAttachmentCount) == (b->inputAttachmentCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->inputAttachmentCount; ++i)
-                {
-                    checkEqual_VkAttachmentReference(a->pInputAttachments + i, b->pInputAttachments + i, onFail);
+void checkEqual_VkSubpassDescription(const VkSubpassDescription* a, const VkSubpassDescription* b,
+                                     OnFailCompareFunc onFail) {
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->pipelineBindPoint) == (b->pipelineBindPoint))) {
+        onFail("a->pipelineBindPoint (Error: Value not equal)");
+    };
+    if (!((a->inputAttachmentCount) == (b->inputAttachmentCount))) {
+        onFail("a->inputAttachmentCount (Error: Value not equal)");
+    };
+    if ((a->pInputAttachments) && (b->pInputAttachments)) {
+        if (!((a->inputAttachmentCount) == (b->inputAttachmentCount))) {
+            onFail("a->pInputAttachments (Error: Lengths not equal)");
+        };
+        if ((a->inputAttachmentCount) == (b->inputAttachmentCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->inputAttachmentCount; ++i) {
+                    checkEqual_VkAttachmentReference(a->pInputAttachments + i,
+                                                     b->pInputAttachments + i, onFail);
                 }
             }
         }
     }
-    if (!((a->colorAttachmentCount) == (b->colorAttachmentCount))) { onFail("a->colorAttachmentCount (Error: Value not equal)"); };
-    if ((a->pColorAttachments) && (b->pColorAttachments))
-    {
-        if (!((a->colorAttachmentCount) == (b->colorAttachmentCount))) { onFail("a->pColorAttachments (Error: Lengths not equal)"); };
-        if ((a->colorAttachmentCount) == (b->colorAttachmentCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->colorAttachmentCount; ++i)
-                {
-                    checkEqual_VkAttachmentReference(a->pColorAttachments + i, b->pColorAttachments + i, onFail);
+    if (!((a->colorAttachmentCount) == (b->colorAttachmentCount))) {
+        onFail("a->colorAttachmentCount (Error: Value not equal)");
+    };
+    if ((a->pColorAttachments) && (b->pColorAttachments)) {
+        if (!((a->colorAttachmentCount) == (b->colorAttachmentCount))) {
+            onFail("a->pColorAttachments (Error: Lengths not equal)");
+        };
+        if ((a->colorAttachmentCount) == (b->colorAttachmentCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->colorAttachmentCount; ++i) {
+                    checkEqual_VkAttachmentReference(a->pColorAttachments + i,
+                                                     b->pColorAttachments + i, onFail);
                 }
             }
         }
     }
-    if (!((!(a->pResolveAttachments) && !(b->pResolveAttachments)) || ((a->pResolveAttachments) && (b->pResolveAttachments)))) { onFail("a->pResolveAttachments (Error: Mismatch in optional field)"); };
-    if (a->pResolveAttachments && b->pResolveAttachments)
-    {
-        if ((a->pResolveAttachments) && (b->pResolveAttachments))
-        {
-            if (!((a->colorAttachmentCount) == (b->colorAttachmentCount))) { onFail("a->pResolveAttachments (Error: Lengths not equal)"); };
-            if ((a->colorAttachmentCount) == (b->colorAttachmentCount))
-            {
-                if (a)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)a->colorAttachmentCount; ++i)
-                    {
-                        checkEqual_VkAttachmentReference(a->pResolveAttachments + i, b->pResolveAttachments + i, onFail);
+    if (!((!(a->pResolveAttachments) && !(b->pResolveAttachments)) ||
+          ((a->pResolveAttachments) && (b->pResolveAttachments)))) {
+        onFail("a->pResolveAttachments (Error: Mismatch in optional field)");
+    };
+    if (a->pResolveAttachments && b->pResolveAttachments) {
+        if ((a->pResolveAttachments) && (b->pResolveAttachments)) {
+            if (!((a->colorAttachmentCount) == (b->colorAttachmentCount))) {
+                onFail("a->pResolveAttachments (Error: Lengths not equal)");
+            };
+            if ((a->colorAttachmentCount) == (b->colorAttachmentCount)) {
+                if (a) {
+                    for (uint32_t i = 0; i < (uint32_t)a->colorAttachmentCount; ++i) {
+                        checkEqual_VkAttachmentReference(a->pResolveAttachments + i,
+                                                         b->pResolveAttachments + i, onFail);
                     }
                 }
             }
         }
     }
-    if (!((!(a->pDepthStencilAttachment) && !(b->pDepthStencilAttachment)) || ((a->pDepthStencilAttachment) && (b->pDepthStencilAttachment)))) { onFail("a->pDepthStencilAttachment (Error: Mismatch in optional field)"); };
-    if (a->pDepthStencilAttachment && b->pDepthStencilAttachment)
-    {
-        if ((a->pDepthStencilAttachment) && (b->pDepthStencilAttachment))
-        {
-            checkEqual_VkAttachmentReference(a->pDepthStencilAttachment, b->pDepthStencilAttachment, onFail);
+    if (!((!(a->pDepthStencilAttachment) && !(b->pDepthStencilAttachment)) ||
+          ((a->pDepthStencilAttachment) && (b->pDepthStencilAttachment)))) {
+        onFail("a->pDepthStencilAttachment (Error: Mismatch in optional field)");
+    };
+    if (a->pDepthStencilAttachment && b->pDepthStencilAttachment) {
+        if ((a->pDepthStencilAttachment) && (b->pDepthStencilAttachment)) {
+            checkEqual_VkAttachmentReference(a->pDepthStencilAttachment, b->pDepthStencilAttachment,
+                                             onFail);
         }
     }
-    if (!((a->preserveAttachmentCount) == (b->preserveAttachmentCount))) { onFail("a->preserveAttachmentCount (Error: Value not equal)"); };
-    if (!((a->preserveAttachmentCount) == (b->preserveAttachmentCount))) { onFail("a->pPreserveAttachments (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pPreserveAttachments, b->pPreserveAttachments, a->preserveAttachmentCount * sizeof(const uint32_t)) == 0))) { onFail("a->pPreserveAttachments (Error: Unequal dyn array)"); };
+    if (!((a->preserveAttachmentCount) == (b->preserveAttachmentCount))) {
+        onFail("a->preserveAttachmentCount (Error: Value not equal)");
+    };
+    if (!((a->preserveAttachmentCount) == (b->preserveAttachmentCount))) {
+        onFail("a->pPreserveAttachments (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pPreserveAttachments, b->pPreserveAttachments,
+                  a->preserveAttachmentCount * sizeof(const uint32_t)) == 0))) {
+        onFail("a->pPreserveAttachments (Error: Unequal dyn array)");
+    };
 }
 
-void checkEqual_VkSubpassDependency(
-    const VkSubpassDependency* a,
-    const VkSubpassDependency* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->srcSubpass) == (b->srcSubpass))) { onFail("a->srcSubpass (Error: Value not equal)"); };
-    if (!((a->dstSubpass) == (b->dstSubpass))) { onFail("a->dstSubpass (Error: Value not equal)"); };
-    if (!((a->srcStageMask) == (b->srcStageMask))) { onFail("a->srcStageMask (Error: Value not equal)"); };
-    if (!((a->dstStageMask) == (b->dstStageMask))) { onFail("a->dstStageMask (Error: Value not equal)"); };
-    if (!((a->srcAccessMask) == (b->srcAccessMask))) { onFail("a->srcAccessMask (Error: Value not equal)"); };
-    if (!((a->dstAccessMask) == (b->dstAccessMask))) { onFail("a->dstAccessMask (Error: Value not equal)"); };
-    if (!((a->dependencyFlags) == (b->dependencyFlags))) { onFail("a->dependencyFlags (Error: Value not equal)"); };
+void checkEqual_VkSubpassDependency(const VkSubpassDependency* a, const VkSubpassDependency* b,
+                                    OnFailCompareFunc onFail) {
+    if (!((a->srcSubpass) == (b->srcSubpass))) {
+        onFail("a->srcSubpass (Error: Value not equal)");
+    };
+    if (!((a->dstSubpass) == (b->dstSubpass))) {
+        onFail("a->dstSubpass (Error: Value not equal)");
+    };
+    if (!((a->srcStageMask) == (b->srcStageMask))) {
+        onFail("a->srcStageMask (Error: Value not equal)");
+    };
+    if (!((a->dstStageMask) == (b->dstStageMask))) {
+        onFail("a->dstStageMask (Error: Value not equal)");
+    };
+    if (!((a->srcAccessMask) == (b->srcAccessMask))) {
+        onFail("a->srcAccessMask (Error: Value not equal)");
+    };
+    if (!((a->dstAccessMask) == (b->dstAccessMask))) {
+        onFail("a->dstAccessMask (Error: Value not equal)");
+    };
+    if (!((a->dependencyFlags) == (b->dependencyFlags))) {
+        onFail("a->dependencyFlags (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkRenderPassCreateInfo(
-    const VkRenderPassCreateInfo* a,
-    const VkRenderPassCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkRenderPassCreateInfo(const VkRenderPassCreateInfo* a,
+                                       const VkRenderPassCreateInfo* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->attachmentCount) == (b->attachmentCount))) { onFail("a->attachmentCount (Error: Value not equal)"); };
-    if ((a->pAttachments) && (b->pAttachments))
-    {
-        if (!((a->attachmentCount) == (b->attachmentCount))) { onFail("a->pAttachments (Error: Lengths not equal)"); };
-        if ((a->attachmentCount) == (b->attachmentCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->attachmentCount; ++i)
-                {
-                    checkEqual_VkAttachmentDescription(a->pAttachments + i, b->pAttachments + i, onFail);
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->attachmentCount) == (b->attachmentCount))) {
+        onFail("a->attachmentCount (Error: Value not equal)");
+    };
+    if ((a->pAttachments) && (b->pAttachments)) {
+        if (!((a->attachmentCount) == (b->attachmentCount))) {
+            onFail("a->pAttachments (Error: Lengths not equal)");
+        };
+        if ((a->attachmentCount) == (b->attachmentCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->attachmentCount; ++i) {
+                    checkEqual_VkAttachmentDescription(a->pAttachments + i, b->pAttachments + i,
+                                                       onFail);
                 }
             }
         }
     }
-    if (!((a->subpassCount) == (b->subpassCount))) { onFail("a->subpassCount (Error: Value not equal)"); };
-    if ((a->pSubpasses) && (b->pSubpasses))
-    {
-        if (!((a->subpassCount) == (b->subpassCount))) { onFail("a->pSubpasses (Error: Lengths not equal)"); };
-        if ((a->subpassCount) == (b->subpassCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->subpassCount; ++i)
-                {
+    if (!((a->subpassCount) == (b->subpassCount))) {
+        onFail("a->subpassCount (Error: Value not equal)");
+    };
+    if ((a->pSubpasses) && (b->pSubpasses)) {
+        if (!((a->subpassCount) == (b->subpassCount))) {
+            onFail("a->pSubpasses (Error: Lengths not equal)");
+        };
+        if ((a->subpassCount) == (b->subpassCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->subpassCount; ++i) {
                     checkEqual_VkSubpassDescription(a->pSubpasses + i, b->pSubpasses + i, onFail);
                 }
             }
         }
     }
-    if (!((a->dependencyCount) == (b->dependencyCount))) { onFail("a->dependencyCount (Error: Value not equal)"); };
-    if ((a->pDependencies) && (b->pDependencies))
-    {
-        if (!((a->dependencyCount) == (b->dependencyCount))) { onFail("a->pDependencies (Error: Lengths not equal)"); };
-        if ((a->dependencyCount) == (b->dependencyCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->dependencyCount; ++i)
-                {
-                    checkEqual_VkSubpassDependency(a->pDependencies + i, b->pDependencies + i, onFail);
+    if (!((a->dependencyCount) == (b->dependencyCount))) {
+        onFail("a->dependencyCount (Error: Value not equal)");
+    };
+    if ((a->pDependencies) && (b->pDependencies)) {
+        if (!((a->dependencyCount) == (b->dependencyCount))) {
+            onFail("a->pDependencies (Error: Lengths not equal)");
+        };
+        if ((a->dependencyCount) == (b->dependencyCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->dependencyCount; ++i) {
+                    checkEqual_VkSubpassDependency(a->pDependencies + i, b->pDependencies + i,
+                                                   onFail);
                 }
             }
         }
     }
 }
 
-void checkEqual_VkCommandPoolCreateInfo(
-    const VkCommandPoolCreateInfo* a,
-    const VkCommandPoolCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkCommandPoolCreateInfo(const VkCommandPoolCreateInfo* a,
+                                        const VkCommandPoolCreateInfo* b,
+                                        OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->queueFamilyIndex) == (b->queueFamilyIndex))) { onFail("a->queueFamilyIndex (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->queueFamilyIndex) == (b->queueFamilyIndex))) {
+        onFail("a->queueFamilyIndex (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkCommandBufferAllocateInfo(
-    const VkCommandBufferAllocateInfo* a,
-    const VkCommandBufferAllocateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkCommandBufferAllocateInfo(const VkCommandBufferAllocateInfo* a,
+                                            const VkCommandBufferAllocateInfo* b,
+                                            OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->commandPool) == (b->commandPool))) { onFail("a->commandPool (Error: Value not equal)"); };
-    if (!((a->level) == (b->level))) { onFail("a->level (Error: Value not equal)"); };
-    if (!((a->commandBufferCount) == (b->commandBufferCount))) { onFail("a->commandBufferCount (Error: Value not equal)"); };
+    if (!((a->commandPool) == (b->commandPool))) {
+        onFail("a->commandPool (Error: Value not equal)");
+    };
+    if (!((a->level) == (b->level))) {
+        onFail("a->level (Error: Value not equal)");
+    };
+    if (!((a->commandBufferCount) == (b->commandBufferCount))) {
+        onFail("a->commandBufferCount (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkCommandBufferInheritanceInfo(
-    const VkCommandBufferInheritanceInfo* a,
-    const VkCommandBufferInheritanceInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkCommandBufferInheritanceInfo(const VkCommandBufferInheritanceInfo* a,
+                                               const VkCommandBufferInheritanceInfo* b,
+                                               OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->renderPass) == (b->renderPass))) { onFail("a->renderPass (Error: Value not equal)"); };
-    if (!((a->subpass) == (b->subpass))) { onFail("a->subpass (Error: Value not equal)"); };
-    if (!((a->framebuffer) == (b->framebuffer))) { onFail("a->framebuffer (Error: Value not equal)"); };
-    if (!((a->occlusionQueryEnable) == (b->occlusionQueryEnable))) { onFail("a->occlusionQueryEnable (Error: Value not equal)"); };
-    if (!((a->queryFlags) == (b->queryFlags))) { onFail("a->queryFlags (Error: Value not equal)"); };
-    if (!((a->pipelineStatistics) == (b->pipelineStatistics))) { onFail("a->pipelineStatistics (Error: Value not equal)"); };
+    if (!((a->renderPass) == (b->renderPass))) {
+        onFail("a->renderPass (Error: Value not equal)");
+    };
+    if (!((a->subpass) == (b->subpass))) {
+        onFail("a->subpass (Error: Value not equal)");
+    };
+    if (!((a->framebuffer) == (b->framebuffer))) {
+        onFail("a->framebuffer (Error: Value not equal)");
+    };
+    if (!((a->occlusionQueryEnable) == (b->occlusionQueryEnable))) {
+        onFail("a->occlusionQueryEnable (Error: Value not equal)");
+    };
+    if (!((a->queryFlags) == (b->queryFlags))) {
+        onFail("a->queryFlags (Error: Value not equal)");
+    };
+    if (!((a->pipelineStatistics) == (b->pipelineStatistics))) {
+        onFail("a->pipelineStatistics (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkCommandBufferBeginInfo(
-    const VkCommandBufferBeginInfo* a,
-    const VkCommandBufferBeginInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkCommandBufferBeginInfo(const VkCommandBufferBeginInfo* a,
+                                         const VkCommandBufferBeginInfo* b,
+                                         OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((!(a->pInheritanceInfo) && !(b->pInheritanceInfo)) || ((a->pInheritanceInfo) && (b->pInheritanceInfo)))) { onFail("a->pInheritanceInfo (Error: Mismatch in optional field)"); };
-    if (a->pInheritanceInfo && b->pInheritanceInfo)
-    {
-        if ((a->pInheritanceInfo) && (b->pInheritanceInfo))
-        {
-            checkEqual_VkCommandBufferInheritanceInfo(a->pInheritanceInfo, b->pInheritanceInfo, onFail);
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((!(a->pInheritanceInfo) && !(b->pInheritanceInfo)) ||
+          ((a->pInheritanceInfo) && (b->pInheritanceInfo)))) {
+        onFail("a->pInheritanceInfo (Error: Mismatch in optional field)");
+    };
+    if (a->pInheritanceInfo && b->pInheritanceInfo) {
+        if ((a->pInheritanceInfo) && (b->pInheritanceInfo)) {
+            checkEqual_VkCommandBufferInheritanceInfo(a->pInheritanceInfo, b->pInheritanceInfo,
+                                                      onFail);
         }
     }
 }
 
-void checkEqual_VkBufferCopy(
-    const VkBufferCopy* a,
-    const VkBufferCopy* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->srcOffset) == (b->srcOffset))) { onFail("a->srcOffset (Error: Value not equal)"); };
-    if (!((a->dstOffset) == (b->dstOffset))) { onFail("a->dstOffset (Error: Value not equal)"); };
-    if (!((a->size) == (b->size))) { onFail("a->size (Error: Value not equal)"); };
+void checkEqual_VkBufferCopy(const VkBufferCopy* a, const VkBufferCopy* b,
+                             OnFailCompareFunc onFail) {
+    if (!((a->srcOffset) == (b->srcOffset))) {
+        onFail("a->srcOffset (Error: Value not equal)");
+    };
+    if (!((a->dstOffset) == (b->dstOffset))) {
+        onFail("a->dstOffset (Error: Value not equal)");
+    };
+    if (!((a->size) == (b->size))) {
+        onFail("a->size (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkImageSubresourceLayers(
-    const VkImageSubresourceLayers* a,
-    const VkImageSubresourceLayers* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->aspectMask) == (b->aspectMask))) { onFail("a->aspectMask (Error: Value not equal)"); };
-    if (!((a->mipLevel) == (b->mipLevel))) { onFail("a->mipLevel (Error: Value not equal)"); };
-    if (!((a->baseArrayLayer) == (b->baseArrayLayer))) { onFail("a->baseArrayLayer (Error: Value not equal)"); };
-    if (!((a->layerCount) == (b->layerCount))) { onFail("a->layerCount (Error: Value not equal)"); };
+void checkEqual_VkImageSubresourceLayers(const VkImageSubresourceLayers* a,
+                                         const VkImageSubresourceLayers* b,
+                                         OnFailCompareFunc onFail) {
+    if (!((a->aspectMask) == (b->aspectMask))) {
+        onFail("a->aspectMask (Error: Value not equal)");
+    };
+    if (!((a->mipLevel) == (b->mipLevel))) {
+        onFail("a->mipLevel (Error: Value not equal)");
+    };
+    if (!((a->baseArrayLayer) == (b->baseArrayLayer))) {
+        onFail("a->baseArrayLayer (Error: Value not equal)");
+    };
+    if (!((a->layerCount) == (b->layerCount))) {
+        onFail("a->layerCount (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkBufferImageCopy(
-    const VkBufferImageCopy* a,
-    const VkBufferImageCopy* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->bufferOffset) == (b->bufferOffset))) { onFail("a->bufferOffset (Error: Value not equal)"); };
-    if (!((a->bufferRowLength) == (b->bufferRowLength))) { onFail("a->bufferRowLength (Error: Value not equal)"); };
-    if (!((a->bufferImageHeight) == (b->bufferImageHeight))) { onFail("a->bufferImageHeight (Error: Value not equal)"); };
+void checkEqual_VkBufferImageCopy(const VkBufferImageCopy* a, const VkBufferImageCopy* b,
+                                  OnFailCompareFunc onFail) {
+    if (!((a->bufferOffset) == (b->bufferOffset))) {
+        onFail("a->bufferOffset (Error: Value not equal)");
+    };
+    if (!((a->bufferRowLength) == (b->bufferRowLength))) {
+        onFail("a->bufferRowLength (Error: Value not equal)");
+    };
+    if (!((a->bufferImageHeight) == (b->bufferImageHeight))) {
+        onFail("a->bufferImageHeight (Error: Value not equal)");
+    };
     checkEqual_VkImageSubresourceLayers(&a->imageSubresource, &b->imageSubresource, onFail);
     checkEqual_VkOffset3D(&a->imageOffset, &b->imageOffset, onFail);
     checkEqual_VkExtent3D(&a->imageExtent, &b->imageExtent, onFail);
 }
 
-void checkEqual_VkClearColorValue(
-    const VkClearColorValue* a,
-    const VkClearColorValue* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((memcmp(a->float32, b->float32, 4 * sizeof(float)) == 0))) { onFail("a->float32 (Error: Unequal static array)"); };
-    if (!((memcmp(a->int32, b->int32, 4 * sizeof(int32_t)) == 0))) { onFail("a->int32 (Error: Unequal static array)"); };
-    if (!((memcmp(a->uint32, b->uint32, 4 * sizeof(uint32_t)) == 0))) { onFail("a->uint32 (Error: Unequal static array)"); };
+void checkEqual_VkClearColorValue(const VkClearColorValue* a, const VkClearColorValue* b,
+                                  OnFailCompareFunc onFail) {
+    if (!((memcmp(a->float32, b->float32, 4 * sizeof(float)) == 0))) {
+        onFail("a->float32 (Error: Unequal static array)");
+    };
+    if (!((memcmp(a->int32, b->int32, 4 * sizeof(int32_t)) == 0))) {
+        onFail("a->int32 (Error: Unequal static array)");
+    };
+    if (!((memcmp(a->uint32, b->uint32, 4 * sizeof(uint32_t)) == 0))) {
+        onFail("a->uint32 (Error: Unequal static array)");
+    };
 }
 
-void checkEqual_VkClearDepthStencilValue(
-    const VkClearDepthStencilValue* a,
-    const VkClearDepthStencilValue* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->depth) == (b->depth))) { onFail("a->depth (Error: Value not equal)"); };
-    if (!((a->stencil) == (b->stencil))) { onFail("a->stencil (Error: Value not equal)"); };
+void checkEqual_VkClearDepthStencilValue(const VkClearDepthStencilValue* a,
+                                         const VkClearDepthStencilValue* b,
+                                         OnFailCompareFunc onFail) {
+    if (!((a->depth) == (b->depth))) {
+        onFail("a->depth (Error: Value not equal)");
+    };
+    if (!((a->stencil) == (b->stencil))) {
+        onFail("a->stencil (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkClearValue(
-    const VkClearValue* a,
-    const VkClearValue* b,
-    OnFailCompareFunc onFail)
-{
+void checkEqual_VkClearValue(const VkClearValue* a, const VkClearValue* b,
+                             OnFailCompareFunc onFail) {
     checkEqual_VkClearColorValue(&a->color, &b->color, onFail);
     checkEqual_VkClearDepthStencilValue(&a->depthStencil, &b->depthStencil, onFail);
 }
 
-void checkEqual_VkClearAttachment(
-    const VkClearAttachment* a,
-    const VkClearAttachment* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->aspectMask) == (b->aspectMask))) { onFail("a->aspectMask (Error: Value not equal)"); };
-    if (!((a->colorAttachment) == (b->colorAttachment))) { onFail("a->colorAttachment (Error: Value not equal)"); };
+void checkEqual_VkClearAttachment(const VkClearAttachment* a, const VkClearAttachment* b,
+                                  OnFailCompareFunc onFail) {
+    if (!((a->aspectMask) == (b->aspectMask))) {
+        onFail("a->aspectMask (Error: Value not equal)");
+    };
+    if (!((a->colorAttachment) == (b->colorAttachment))) {
+        onFail("a->colorAttachment (Error: Value not equal)");
+    };
     checkEqual_VkClearValue(&a->clearValue, &b->clearValue, onFail);
 }
 
-void checkEqual_VkClearRect(
-    const VkClearRect* a,
-    const VkClearRect* b,
-    OnFailCompareFunc onFail)
-{
+void checkEqual_VkClearRect(const VkClearRect* a, const VkClearRect* b, OnFailCompareFunc onFail) {
     checkEqual_VkRect2D(&a->rect, &b->rect, onFail);
-    if (!((a->baseArrayLayer) == (b->baseArrayLayer))) { onFail("a->baseArrayLayer (Error: Value not equal)"); };
-    if (!((a->layerCount) == (b->layerCount))) { onFail("a->layerCount (Error: Value not equal)"); };
+    if (!((a->baseArrayLayer) == (b->baseArrayLayer))) {
+        onFail("a->baseArrayLayer (Error: Value not equal)");
+    };
+    if (!((a->layerCount) == (b->layerCount))) {
+        onFail("a->layerCount (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkImageBlit(
-    const VkImageBlit* a,
-    const VkImageBlit* b,
-    OnFailCompareFunc onFail)
-{
+void checkEqual_VkImageBlit(const VkImageBlit* a, const VkImageBlit* b, OnFailCompareFunc onFail) {
     checkEqual_VkImageSubresourceLayers(&a->srcSubresource, &b->srcSubresource, onFail);
-    if (!((2) == (2))) { onFail("a->srcOffsets (Error: Lengths not equal)"); };
-    for (uint32_t i = 0; i < (uint32_t)2; ++i)
-    {
+    if (!((2) == (2))) {
+        onFail("a->srcOffsets (Error: Lengths not equal)");
+    };
+    for (uint32_t i = 0; i < (uint32_t)2; ++i) {
         checkEqual_VkOffset3D(a->srcOffsets + i, b->srcOffsets + i, onFail);
     }
     checkEqual_VkImageSubresourceLayers(&a->dstSubresource, &b->dstSubresource, onFail);
-    if (!((2) == (2))) { onFail("a->dstOffsets (Error: Lengths not equal)"); };
-    for (uint32_t i = 0; i < (uint32_t)2; ++i)
-    {
+    if (!((2) == (2))) {
+        onFail("a->dstOffsets (Error: Lengths not equal)");
+    };
+    for (uint32_t i = 0; i < (uint32_t)2; ++i) {
         checkEqual_VkOffset3D(a->dstOffsets + i, b->dstOffsets + i, onFail);
     }
 }
 
-void checkEqual_VkImageCopy(
-    const VkImageCopy* a,
-    const VkImageCopy* b,
-    OnFailCompareFunc onFail)
-{
+void checkEqual_VkImageCopy(const VkImageCopy* a, const VkImageCopy* b, OnFailCompareFunc onFail) {
     checkEqual_VkImageSubresourceLayers(&a->srcSubresource, &b->srcSubresource, onFail);
     checkEqual_VkOffset3D(&a->srcOffset, &b->srcOffset, onFail);
     checkEqual_VkImageSubresourceLayers(&a->dstSubresource, &b->dstSubresource, onFail);
@@ -2253,11 +3296,8 @@
     checkEqual_VkExtent3D(&a->extent, &b->extent, onFail);
 }
 
-void checkEqual_VkImageResolve(
-    const VkImageResolve* a,
-    const VkImageResolve* b,
-    OnFailCompareFunc onFail)
-{
+void checkEqual_VkImageResolve(const VkImageResolve* a, const VkImageResolve* b,
+                               OnFailCompareFunc onFail) {
     checkEqual_VkImageSubresourceLayers(&a->srcSubresource, &b->srcSubresource, onFail);
     checkEqual_VkOffset3D(&a->srcOffset, &b->srcOffset, onFail);
     checkEqual_VkImageSubresourceLayers(&a->dstSubresource, &b->dstSubresource, onFail);
@@ -2265,32 +3305,35 @@
     checkEqual_VkExtent3D(&a->extent, &b->extent, onFail);
 }
 
-void checkEqual_VkRenderPassBeginInfo(
-    const VkRenderPassBeginInfo* a,
-    const VkRenderPassBeginInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkRenderPassBeginInfo(const VkRenderPassBeginInfo* a,
+                                      const VkRenderPassBeginInfo* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->renderPass) == (b->renderPass))) { onFail("a->renderPass (Error: Value not equal)"); };
-    if (!((a->framebuffer) == (b->framebuffer))) { onFail("a->framebuffer (Error: Value not equal)"); };
+    if (!((a->renderPass) == (b->renderPass))) {
+        onFail("a->renderPass (Error: Value not equal)");
+    };
+    if (!((a->framebuffer) == (b->framebuffer))) {
+        onFail("a->framebuffer (Error: Value not equal)");
+    };
     checkEqual_VkRect2D(&a->renderArea, &b->renderArea, onFail);
-    if (!((a->clearValueCount) == (b->clearValueCount))) { onFail("a->clearValueCount (Error: Value not equal)"); };
-    if (!((!(a->pClearValues) && !(b->pClearValues)) || ((a->pClearValues) && (b->pClearValues)))) { onFail("a->pClearValues (Error: Mismatch in optional field)"); };
-    if (a->pClearValues && b->pClearValues)
-    {
-        if ((a->pClearValues) && (b->pClearValues))
-        {
-            if (!((a->clearValueCount) == (b->clearValueCount))) { onFail("a->pClearValues (Error: Lengths not equal)"); };
-            if ((a->clearValueCount) == (b->clearValueCount))
-            {
-                if (a)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)a->clearValueCount; ++i)
-                    {
+    if (!((a->clearValueCount) == (b->clearValueCount))) {
+        onFail("a->clearValueCount (Error: Value not equal)");
+    };
+    if (!((!(a->pClearValues) && !(b->pClearValues)) || ((a->pClearValues) && (b->pClearValues)))) {
+        onFail("a->pClearValues (Error: Mismatch in optional field)");
+    };
+    if (a->pClearValues && b->pClearValues) {
+        if ((a->pClearValues) && (b->pClearValues)) {
+            if (!((a->clearValueCount) == (b->clearValueCount))) {
+                onFail("a->pClearValues (Error: Lengths not equal)");
+            };
+            if ((a->clearValueCount) == (b->clearValueCount)) {
+                if (a) {
+                    for (uint32_t i = 0; i < (uint32_t)a->clearValueCount; ++i) {
                         checkEqual_VkClearValue(a->pClearValues + i, b->pClearValues + i, onFail);
                     }
                 }
@@ -2301,429 +3344,515 @@
 
 #endif
 #ifdef VK_VERSION_1_1
-void checkEqual_VkPhysicalDeviceSubgroupProperties(
-    const VkPhysicalDeviceSubgroupProperties* a,
-    const VkPhysicalDeviceSubgroupProperties* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPhysicalDeviceSubgroupProperties(const VkPhysicalDeviceSubgroupProperties* a,
+                                                   const VkPhysicalDeviceSubgroupProperties* b,
+                                                   OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->subgroupSize) == (b->subgroupSize))) { onFail("a->subgroupSize (Error: Value not equal)"); };
-    if (!((a->supportedStages) == (b->supportedStages))) { onFail("a->supportedStages (Error: Value not equal)"); };
-    if (!((a->supportedOperations) == (b->supportedOperations))) { onFail("a->supportedOperations (Error: Value not equal)"); };
-    if (!((a->quadOperationsInAllStages) == (b->quadOperationsInAllStages))) { onFail("a->quadOperationsInAllStages (Error: Value not equal)"); };
+    if (!((a->subgroupSize) == (b->subgroupSize))) {
+        onFail("a->subgroupSize (Error: Value not equal)");
+    };
+    if (!((a->supportedStages) == (b->supportedStages))) {
+        onFail("a->supportedStages (Error: Value not equal)");
+    };
+    if (!((a->supportedOperations) == (b->supportedOperations))) {
+        onFail("a->supportedOperations (Error: Value not equal)");
+    };
+    if (!((a->quadOperationsInAllStages) == (b->quadOperationsInAllStages))) {
+        onFail("a->quadOperationsInAllStages (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkBindBufferMemoryInfo(
-    const VkBindBufferMemoryInfo* a,
-    const VkBindBufferMemoryInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkBindBufferMemoryInfo(const VkBindBufferMemoryInfo* a,
+                                       const VkBindBufferMemoryInfo* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->buffer) == (b->buffer))) { onFail("a->buffer (Error: Value not equal)"); };
-    if (!((a->memory) == (b->memory))) { onFail("a->memory (Error: Value not equal)"); };
-    if (!((a->memoryOffset) == (b->memoryOffset))) { onFail("a->memoryOffset (Error: Value not equal)"); };
+    if (!((a->buffer) == (b->buffer))) {
+        onFail("a->buffer (Error: Value not equal)");
+    };
+    if (!((a->memory) == (b->memory))) {
+        onFail("a->memory (Error: Value not equal)");
+    };
+    if (!((a->memoryOffset) == (b->memoryOffset))) {
+        onFail("a->memoryOffset (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkBindImageMemoryInfo(
-    const VkBindImageMemoryInfo* a,
-    const VkBindImageMemoryInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkBindImageMemoryInfo(const VkBindImageMemoryInfo* a,
+                                      const VkBindImageMemoryInfo* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->image) == (b->image))) { onFail("a->image (Error: Value not equal)"); };
-    if (!((a->memory) == (b->memory))) { onFail("a->memory (Error: Value not equal)"); };
-    if (!((a->memoryOffset) == (b->memoryOffset))) { onFail("a->memoryOffset (Error: Value not equal)"); };
+    if (!((a->image) == (b->image))) {
+        onFail("a->image (Error: Value not equal)");
+    };
+    if (!((a->memory) == (b->memory))) {
+        onFail("a->memory (Error: Value not equal)");
+    };
+    if (!((a->memoryOffset) == (b->memoryOffset))) {
+        onFail("a->memoryOffset (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkPhysicalDevice16BitStorageFeatures(
-    const VkPhysicalDevice16BitStorageFeatures* a,
-    const VkPhysicalDevice16BitStorageFeatures* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPhysicalDevice16BitStorageFeatures(const VkPhysicalDevice16BitStorageFeatures* a,
+                                                     const VkPhysicalDevice16BitStorageFeatures* b,
+                                                     OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->storageBuffer16BitAccess) == (b->storageBuffer16BitAccess))) { onFail("a->storageBuffer16BitAccess (Error: Value not equal)"); };
-    if (!((a->uniformAndStorageBuffer16BitAccess) == (b->uniformAndStorageBuffer16BitAccess))) { onFail("a->uniformAndStorageBuffer16BitAccess (Error: Value not equal)"); };
-    if (!((a->storagePushConstant16) == (b->storagePushConstant16))) { onFail("a->storagePushConstant16 (Error: Value not equal)"); };
-    if (!((a->storageInputOutput16) == (b->storageInputOutput16))) { onFail("a->storageInputOutput16 (Error: Value not equal)"); };
+    if (!((a->storageBuffer16BitAccess) == (b->storageBuffer16BitAccess))) {
+        onFail("a->storageBuffer16BitAccess (Error: Value not equal)");
+    };
+    if (!((a->uniformAndStorageBuffer16BitAccess) == (b->uniformAndStorageBuffer16BitAccess))) {
+        onFail("a->uniformAndStorageBuffer16BitAccess (Error: Value not equal)");
+    };
+    if (!((a->storagePushConstant16) == (b->storagePushConstant16))) {
+        onFail("a->storagePushConstant16 (Error: Value not equal)");
+    };
+    if (!((a->storageInputOutput16) == (b->storageInputOutput16))) {
+        onFail("a->storageInputOutput16 (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkMemoryDedicatedRequirements(
-    const VkMemoryDedicatedRequirements* a,
-    const VkMemoryDedicatedRequirements* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkMemoryDedicatedRequirements(const VkMemoryDedicatedRequirements* a,
+                                              const VkMemoryDedicatedRequirements* b,
+                                              OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->prefersDedicatedAllocation) == (b->prefersDedicatedAllocation))) { onFail("a->prefersDedicatedAllocation (Error: Value not equal)"); };
-    if (!((a->requiresDedicatedAllocation) == (b->requiresDedicatedAllocation))) { onFail("a->requiresDedicatedAllocation (Error: Value not equal)"); };
+    if (!((a->prefersDedicatedAllocation) == (b->prefersDedicatedAllocation))) {
+        onFail("a->prefersDedicatedAllocation (Error: Value not equal)");
+    };
+    if (!((a->requiresDedicatedAllocation) == (b->requiresDedicatedAllocation))) {
+        onFail("a->requiresDedicatedAllocation (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkMemoryDedicatedAllocateInfo(
-    const VkMemoryDedicatedAllocateInfo* a,
-    const VkMemoryDedicatedAllocateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkMemoryDedicatedAllocateInfo(const VkMemoryDedicatedAllocateInfo* a,
+                                              const VkMemoryDedicatedAllocateInfo* b,
+                                              OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->image) == (b->image))) { onFail("a->image (Error: Value not equal)"); };
-    if (!((a->buffer) == (b->buffer))) { onFail("a->buffer (Error: Value not equal)"); };
+    if (!((a->image) == (b->image))) {
+        onFail("a->image (Error: Value not equal)");
+    };
+    if (!((a->buffer) == (b->buffer))) {
+        onFail("a->buffer (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkMemoryAllocateFlagsInfo(
-    const VkMemoryAllocateFlagsInfo* a,
-    const VkMemoryAllocateFlagsInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkMemoryAllocateFlagsInfo(const VkMemoryAllocateFlagsInfo* a,
+                                          const VkMemoryAllocateFlagsInfo* b,
+                                          OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->deviceMask) == (b->deviceMask))) { onFail("a->deviceMask (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->deviceMask) == (b->deviceMask))) {
+        onFail("a->deviceMask (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkDeviceGroupRenderPassBeginInfo(
-    const VkDeviceGroupRenderPassBeginInfo* a,
-    const VkDeviceGroupRenderPassBeginInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDeviceGroupRenderPassBeginInfo(const VkDeviceGroupRenderPassBeginInfo* a,
+                                                 const VkDeviceGroupRenderPassBeginInfo* b,
+                                                 OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->deviceMask) == (b->deviceMask))) { onFail("a->deviceMask (Error: Value not equal)"); };
-    if (!((a->deviceRenderAreaCount) == (b->deviceRenderAreaCount))) { onFail("a->deviceRenderAreaCount (Error: Value not equal)"); };
-    if ((a->pDeviceRenderAreas) && (b->pDeviceRenderAreas))
-    {
-        if (!((a->deviceRenderAreaCount) == (b->deviceRenderAreaCount))) { onFail("a->pDeviceRenderAreas (Error: Lengths not equal)"); };
-        if ((a->deviceRenderAreaCount) == (b->deviceRenderAreaCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->deviceRenderAreaCount; ++i)
-                {
-                    checkEqual_VkRect2D(a->pDeviceRenderAreas + i, b->pDeviceRenderAreas + i, onFail);
+    if (!((a->deviceMask) == (b->deviceMask))) {
+        onFail("a->deviceMask (Error: Value not equal)");
+    };
+    if (!((a->deviceRenderAreaCount) == (b->deviceRenderAreaCount))) {
+        onFail("a->deviceRenderAreaCount (Error: Value not equal)");
+    };
+    if ((a->pDeviceRenderAreas) && (b->pDeviceRenderAreas)) {
+        if (!((a->deviceRenderAreaCount) == (b->deviceRenderAreaCount))) {
+            onFail("a->pDeviceRenderAreas (Error: Lengths not equal)");
+        };
+        if ((a->deviceRenderAreaCount) == (b->deviceRenderAreaCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->deviceRenderAreaCount; ++i) {
+                    checkEqual_VkRect2D(a->pDeviceRenderAreas + i, b->pDeviceRenderAreas + i,
+                                        onFail);
                 }
             }
         }
     }
 }
 
-void checkEqual_VkDeviceGroupCommandBufferBeginInfo(
-    const VkDeviceGroupCommandBufferBeginInfo* a,
-    const VkDeviceGroupCommandBufferBeginInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDeviceGroupCommandBufferBeginInfo(const VkDeviceGroupCommandBufferBeginInfo* a,
+                                                    const VkDeviceGroupCommandBufferBeginInfo* b,
+                                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->deviceMask) == (b->deviceMask))) { onFail("a->deviceMask (Error: Value not equal)"); };
+    if (!((a->deviceMask) == (b->deviceMask))) {
+        onFail("a->deviceMask (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkDeviceGroupSubmitInfo(
-    const VkDeviceGroupSubmitInfo* a,
-    const VkDeviceGroupSubmitInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDeviceGroupSubmitInfo(const VkDeviceGroupSubmitInfo* a,
+                                        const VkDeviceGroupSubmitInfo* b,
+                                        OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->waitSemaphoreCount) == (b->waitSemaphoreCount))) { onFail("a->waitSemaphoreCount (Error: Value not equal)"); };
-    if (!((a->waitSemaphoreCount) == (b->waitSemaphoreCount))) { onFail("a->pWaitSemaphoreDeviceIndices (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pWaitSemaphoreDeviceIndices, b->pWaitSemaphoreDeviceIndices, a->waitSemaphoreCount * sizeof(const uint32_t)) == 0))) { onFail("a->pWaitSemaphoreDeviceIndices (Error: Unequal dyn array)"); };
-    if (!((a->commandBufferCount) == (b->commandBufferCount))) { onFail("a->commandBufferCount (Error: Value not equal)"); };
-    if (!((a->commandBufferCount) == (b->commandBufferCount))) { onFail("a->pCommandBufferDeviceMasks (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pCommandBufferDeviceMasks, b->pCommandBufferDeviceMasks, a->commandBufferCount * sizeof(const uint32_t)) == 0))) { onFail("a->pCommandBufferDeviceMasks (Error: Unequal dyn array)"); };
-    if (!((a->signalSemaphoreCount) == (b->signalSemaphoreCount))) { onFail("a->signalSemaphoreCount (Error: Value not equal)"); };
-    if (!((a->signalSemaphoreCount) == (b->signalSemaphoreCount))) { onFail("a->pSignalSemaphoreDeviceIndices (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pSignalSemaphoreDeviceIndices, b->pSignalSemaphoreDeviceIndices, a->signalSemaphoreCount * sizeof(const uint32_t)) == 0))) { onFail("a->pSignalSemaphoreDeviceIndices (Error: Unequal dyn array)"); };
+    if (!((a->waitSemaphoreCount) == (b->waitSemaphoreCount))) {
+        onFail("a->waitSemaphoreCount (Error: Value not equal)");
+    };
+    if (!((a->waitSemaphoreCount) == (b->waitSemaphoreCount))) {
+        onFail("a->pWaitSemaphoreDeviceIndices (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pWaitSemaphoreDeviceIndices, b->pWaitSemaphoreDeviceIndices,
+                  a->waitSemaphoreCount * sizeof(const uint32_t)) == 0))) {
+        onFail("a->pWaitSemaphoreDeviceIndices (Error: Unequal dyn array)");
+    };
+    if (!((a->commandBufferCount) == (b->commandBufferCount))) {
+        onFail("a->commandBufferCount (Error: Value not equal)");
+    };
+    if (!((a->commandBufferCount) == (b->commandBufferCount))) {
+        onFail("a->pCommandBufferDeviceMasks (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pCommandBufferDeviceMasks, b->pCommandBufferDeviceMasks,
+                  a->commandBufferCount * sizeof(const uint32_t)) == 0))) {
+        onFail("a->pCommandBufferDeviceMasks (Error: Unequal dyn array)");
+    };
+    if (!((a->signalSemaphoreCount) == (b->signalSemaphoreCount))) {
+        onFail("a->signalSemaphoreCount (Error: Value not equal)");
+    };
+    if (!((a->signalSemaphoreCount) == (b->signalSemaphoreCount))) {
+        onFail("a->pSignalSemaphoreDeviceIndices (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pSignalSemaphoreDeviceIndices, b->pSignalSemaphoreDeviceIndices,
+                  a->signalSemaphoreCount * sizeof(const uint32_t)) == 0))) {
+        onFail("a->pSignalSemaphoreDeviceIndices (Error: Unequal dyn array)");
+    };
 }
 
-void checkEqual_VkDeviceGroupBindSparseInfo(
-    const VkDeviceGroupBindSparseInfo* a,
-    const VkDeviceGroupBindSparseInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDeviceGroupBindSparseInfo(const VkDeviceGroupBindSparseInfo* a,
+                                            const VkDeviceGroupBindSparseInfo* b,
+                                            OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->resourceDeviceIndex) == (b->resourceDeviceIndex))) { onFail("a->resourceDeviceIndex (Error: Value not equal)"); };
-    if (!((a->memoryDeviceIndex) == (b->memoryDeviceIndex))) { onFail("a->memoryDeviceIndex (Error: Value not equal)"); };
+    if (!((a->resourceDeviceIndex) == (b->resourceDeviceIndex))) {
+        onFail("a->resourceDeviceIndex (Error: Value not equal)");
+    };
+    if (!((a->memoryDeviceIndex) == (b->memoryDeviceIndex))) {
+        onFail("a->memoryDeviceIndex (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkBindBufferMemoryDeviceGroupInfo(
-    const VkBindBufferMemoryDeviceGroupInfo* a,
-    const VkBindBufferMemoryDeviceGroupInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkBindBufferMemoryDeviceGroupInfo(const VkBindBufferMemoryDeviceGroupInfo* a,
+                                                  const VkBindBufferMemoryDeviceGroupInfo* b,
+                                                  OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->deviceIndexCount) == (b->deviceIndexCount))) { onFail("a->deviceIndexCount (Error: Value not equal)"); };
-    if (!((a->deviceIndexCount) == (b->deviceIndexCount))) { onFail("a->pDeviceIndices (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pDeviceIndices, b->pDeviceIndices, a->deviceIndexCount * sizeof(const uint32_t)) == 0))) { onFail("a->pDeviceIndices (Error: Unequal dyn array)"); };
+    if (!((a->deviceIndexCount) == (b->deviceIndexCount))) {
+        onFail("a->deviceIndexCount (Error: Value not equal)");
+    };
+    if (!((a->deviceIndexCount) == (b->deviceIndexCount))) {
+        onFail("a->pDeviceIndices (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pDeviceIndices, b->pDeviceIndices,
+                  a->deviceIndexCount * sizeof(const uint32_t)) == 0))) {
+        onFail("a->pDeviceIndices (Error: Unequal dyn array)");
+    };
 }
 
-void checkEqual_VkBindImageMemoryDeviceGroupInfo(
-    const VkBindImageMemoryDeviceGroupInfo* a,
-    const VkBindImageMemoryDeviceGroupInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkBindImageMemoryDeviceGroupInfo(const VkBindImageMemoryDeviceGroupInfo* a,
+                                                 const VkBindImageMemoryDeviceGroupInfo* b,
+                                                 OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->deviceIndexCount) == (b->deviceIndexCount))) { onFail("a->deviceIndexCount (Error: Value not equal)"); };
-    if (!((a->deviceIndexCount) == (b->deviceIndexCount))) { onFail("a->pDeviceIndices (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pDeviceIndices, b->pDeviceIndices, a->deviceIndexCount * sizeof(const uint32_t)) == 0))) { onFail("a->pDeviceIndices (Error: Unequal dyn array)"); };
-    if (!((a->splitInstanceBindRegionCount) == (b->splitInstanceBindRegionCount))) { onFail("a->splitInstanceBindRegionCount (Error: Value not equal)"); };
-    if ((a->pSplitInstanceBindRegions) && (b->pSplitInstanceBindRegions))
-    {
-        if (!((a->splitInstanceBindRegionCount) == (b->splitInstanceBindRegionCount))) { onFail("a->pSplitInstanceBindRegions (Error: Lengths not equal)"); };
-        if ((a->splitInstanceBindRegionCount) == (b->splitInstanceBindRegionCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->splitInstanceBindRegionCount; ++i)
-                {
-                    checkEqual_VkRect2D(a->pSplitInstanceBindRegions + i, b->pSplitInstanceBindRegions + i, onFail);
+    if (!((a->deviceIndexCount) == (b->deviceIndexCount))) {
+        onFail("a->deviceIndexCount (Error: Value not equal)");
+    };
+    if (!((a->deviceIndexCount) == (b->deviceIndexCount))) {
+        onFail("a->pDeviceIndices (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pDeviceIndices, b->pDeviceIndices,
+                  a->deviceIndexCount * sizeof(const uint32_t)) == 0))) {
+        onFail("a->pDeviceIndices (Error: Unequal dyn array)");
+    };
+    if (!((a->splitInstanceBindRegionCount) == (b->splitInstanceBindRegionCount))) {
+        onFail("a->splitInstanceBindRegionCount (Error: Value not equal)");
+    };
+    if ((a->pSplitInstanceBindRegions) && (b->pSplitInstanceBindRegions)) {
+        if (!((a->splitInstanceBindRegionCount) == (b->splitInstanceBindRegionCount))) {
+            onFail("a->pSplitInstanceBindRegions (Error: Lengths not equal)");
+        };
+        if ((a->splitInstanceBindRegionCount) == (b->splitInstanceBindRegionCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->splitInstanceBindRegionCount; ++i) {
+                    checkEqual_VkRect2D(a->pSplitInstanceBindRegions + i,
+                                        b->pSplitInstanceBindRegions + i, onFail);
                 }
             }
         }
     }
 }
 
-void checkEqual_VkPhysicalDeviceGroupProperties(
-    const VkPhysicalDeviceGroupProperties* a,
-    const VkPhysicalDeviceGroupProperties* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPhysicalDeviceGroupProperties(const VkPhysicalDeviceGroupProperties* a,
+                                                const VkPhysicalDeviceGroupProperties* b,
+                                                OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->physicalDeviceCount) == (b->physicalDeviceCount))) { onFail("a->physicalDeviceCount (Error: Value not equal)"); };
-    if (!((memcmp(a->physicalDevices, b->physicalDevices, VK_MAX_DEVICE_GROUP_SIZE * sizeof(VkPhysicalDevice)) == 0))) { onFail("a->physicalDevices (Error: Unequal static array)"); };
-    if (!((a->subsetAllocation) == (b->subsetAllocation))) { onFail("a->subsetAllocation (Error: Value not equal)"); };
+    if (!((a->physicalDeviceCount) == (b->physicalDeviceCount))) {
+        onFail("a->physicalDeviceCount (Error: Value not equal)");
+    };
+    if (!((memcmp(a->physicalDevices, b->physicalDevices,
+                  VK_MAX_DEVICE_GROUP_SIZE * sizeof(VkPhysicalDevice)) == 0))) {
+        onFail("a->physicalDevices (Error: Unequal static array)");
+    };
+    if (!((a->subsetAllocation) == (b->subsetAllocation))) {
+        onFail("a->subsetAllocation (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkDeviceGroupDeviceCreateInfo(
-    const VkDeviceGroupDeviceCreateInfo* a,
-    const VkDeviceGroupDeviceCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDeviceGroupDeviceCreateInfo(const VkDeviceGroupDeviceCreateInfo* a,
+                                              const VkDeviceGroupDeviceCreateInfo* b,
+                                              OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->physicalDeviceCount) == (b->physicalDeviceCount))) { onFail("a->physicalDeviceCount (Error: Value not equal)"); };
-    if (!((a->physicalDeviceCount) == (b->physicalDeviceCount))) { onFail("a->pPhysicalDevices (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pPhysicalDevices, b->pPhysicalDevices, a->physicalDeviceCount * sizeof(const VkPhysicalDevice)) == 0))) { onFail("a->pPhysicalDevices (Error: Unequal dyn array)"); };
+    if (!((a->physicalDeviceCount) == (b->physicalDeviceCount))) {
+        onFail("a->physicalDeviceCount (Error: Value not equal)");
+    };
+    if (!((a->physicalDeviceCount) == (b->physicalDeviceCount))) {
+        onFail("a->pPhysicalDevices (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pPhysicalDevices, b->pPhysicalDevices,
+                  a->physicalDeviceCount * sizeof(const VkPhysicalDevice)) == 0))) {
+        onFail("a->pPhysicalDevices (Error: Unequal dyn array)");
+    };
 }
 
-void checkEqual_VkBufferMemoryRequirementsInfo2(
-    const VkBufferMemoryRequirementsInfo2* a,
-    const VkBufferMemoryRequirementsInfo2* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkBufferMemoryRequirementsInfo2(const VkBufferMemoryRequirementsInfo2* a,
+                                                const VkBufferMemoryRequirementsInfo2* b,
+                                                OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->buffer) == (b->buffer))) { onFail("a->buffer (Error: Value not equal)"); };
+    if (!((a->buffer) == (b->buffer))) {
+        onFail("a->buffer (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkImageMemoryRequirementsInfo2(
-    const VkImageMemoryRequirementsInfo2* a,
-    const VkImageMemoryRequirementsInfo2* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkImageMemoryRequirementsInfo2(const VkImageMemoryRequirementsInfo2* a,
+                                               const VkImageMemoryRequirementsInfo2* b,
+                                               OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->image) == (b->image))) { onFail("a->image (Error: Value not equal)"); };
+    if (!((a->image) == (b->image))) {
+        onFail("a->image (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkImageSparseMemoryRequirementsInfo2(
-    const VkImageSparseMemoryRequirementsInfo2* a,
-    const VkImageSparseMemoryRequirementsInfo2* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkImageSparseMemoryRequirementsInfo2(const VkImageSparseMemoryRequirementsInfo2* a,
+                                                     const VkImageSparseMemoryRequirementsInfo2* b,
+                                                     OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->image) == (b->image))) { onFail("a->image (Error: Value not equal)"); };
+    if (!((a->image) == (b->image))) {
+        onFail("a->image (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkMemoryRequirements2(
-    const VkMemoryRequirements2* a,
-    const VkMemoryRequirements2* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkMemoryRequirements2(const VkMemoryRequirements2* a,
+                                      const VkMemoryRequirements2* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
     checkEqual_VkMemoryRequirements(&a->memoryRequirements, &b->memoryRequirements, onFail);
 }
 
-void checkEqual_VkSparseImageMemoryRequirements2(
-    const VkSparseImageMemoryRequirements2* a,
-    const VkSparseImageMemoryRequirements2* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkSparseImageMemoryRequirements2(const VkSparseImageMemoryRequirements2* a,
+                                                 const VkSparseImageMemoryRequirements2* b,
+                                                 OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    checkEqual_VkSparseImageMemoryRequirements(&a->memoryRequirements, &b->memoryRequirements, onFail);
+    checkEqual_VkSparseImageMemoryRequirements(&a->memoryRequirements, &b->memoryRequirements,
+                                               onFail);
 }
 
-void checkEqual_VkPhysicalDeviceFeatures2(
-    const VkPhysicalDeviceFeatures2* a,
-    const VkPhysicalDeviceFeatures2* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPhysicalDeviceFeatures2(const VkPhysicalDeviceFeatures2* a,
+                                          const VkPhysicalDeviceFeatures2* b,
+                                          OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
     checkEqual_VkPhysicalDeviceFeatures(&a->features, &b->features, onFail);
 }
 
-void checkEqual_VkPhysicalDeviceProperties2(
-    const VkPhysicalDeviceProperties2* a,
-    const VkPhysicalDeviceProperties2* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPhysicalDeviceProperties2(const VkPhysicalDeviceProperties2* a,
+                                            const VkPhysicalDeviceProperties2* b,
+                                            OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
     checkEqual_VkPhysicalDeviceProperties(&a->properties, &b->properties, onFail);
 }
 
-void checkEqual_VkFormatProperties2(
-    const VkFormatProperties2* a,
-    const VkFormatProperties2* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkFormatProperties2(const VkFormatProperties2* a, const VkFormatProperties2* b,
+                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
     checkEqual_VkFormatProperties(&a->formatProperties, &b->formatProperties, onFail);
 }
 
-void checkEqual_VkImageFormatProperties2(
-    const VkImageFormatProperties2* a,
-    const VkImageFormatProperties2* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkImageFormatProperties2(const VkImageFormatProperties2* a,
+                                         const VkImageFormatProperties2* b,
+                                         OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    checkEqual_VkImageFormatProperties(&a->imageFormatProperties, &b->imageFormatProperties, onFail);
+    checkEqual_VkImageFormatProperties(&a->imageFormatProperties, &b->imageFormatProperties,
+                                       onFail);
 }
 
-void checkEqual_VkPhysicalDeviceImageFormatInfo2(
-    const VkPhysicalDeviceImageFormatInfo2* a,
-    const VkPhysicalDeviceImageFormatInfo2* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPhysicalDeviceImageFormatInfo2(const VkPhysicalDeviceImageFormatInfo2* a,
+                                                 const VkPhysicalDeviceImageFormatInfo2* b,
+                                                 OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->format) == (b->format))) { onFail("a->format (Error: Value not equal)"); };
-    if (!((a->type) == (b->type))) { onFail("a->type (Error: Value not equal)"); };
-    if (!((a->tiling) == (b->tiling))) { onFail("a->tiling (Error: Value not equal)"); };
-    if (!((a->usage) == (b->usage))) { onFail("a->usage (Error: Value not equal)"); };
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
+    if (!((a->format) == (b->format))) {
+        onFail("a->format (Error: Value not equal)");
+    };
+    if (!((a->type) == (b->type))) {
+        onFail("a->type (Error: Value not equal)");
+    };
+    if (!((a->tiling) == (b->tiling))) {
+        onFail("a->tiling (Error: Value not equal)");
+    };
+    if (!((a->usage) == (b->usage))) {
+        onFail("a->usage (Error: Value not equal)");
+    };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkQueueFamilyProperties2(
-    const VkQueueFamilyProperties2* a,
-    const VkQueueFamilyProperties2* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkQueueFamilyProperties2(const VkQueueFamilyProperties2* a,
+                                         const VkQueueFamilyProperties2* b,
+                                         OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    checkEqual_VkQueueFamilyProperties(&a->queueFamilyProperties, &b->queueFamilyProperties, onFail);
+    checkEqual_VkQueueFamilyProperties(&a->queueFamilyProperties, &b->queueFamilyProperties,
+                                       onFail);
 }
 
-void checkEqual_VkPhysicalDeviceMemoryProperties2(
-    const VkPhysicalDeviceMemoryProperties2* a,
-    const VkPhysicalDeviceMemoryProperties2* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPhysicalDeviceMemoryProperties2(const VkPhysicalDeviceMemoryProperties2* a,
+                                                  const VkPhysicalDeviceMemoryProperties2* b,
+                                                  OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
     checkEqual_VkPhysicalDeviceMemoryProperties(&a->memoryProperties, &b->memoryProperties, onFail);
 }
 
-void checkEqual_VkSparseImageFormatProperties2(
-    const VkSparseImageFormatProperties2* a,
-    const VkSparseImageFormatProperties2* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkSparseImageFormatProperties2(const VkSparseImageFormatProperties2* a,
+                                               const VkSparseImageFormatProperties2* b,
+                                               OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
     checkEqual_VkSparseImageFormatProperties(&a->properties, &b->properties, onFail);
@@ -2731,1849 +3860,2724 @@
 
 void checkEqual_VkPhysicalDeviceSparseImageFormatInfo2(
     const VkPhysicalDeviceSparseImageFormatInfo2* a,
-    const VkPhysicalDeviceSparseImageFormatInfo2* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceSparseImageFormatInfo2* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->format) == (b->format))) { onFail("a->format (Error: Value not equal)"); };
-    if (!((a->type) == (b->type))) { onFail("a->type (Error: Value not equal)"); };
-    if (!((a->samples) == (b->samples))) { onFail("a->samples (Error: Value not equal)"); };
-    if (!((a->usage) == (b->usage))) { onFail("a->usage (Error: Value not equal)"); };
-    if (!((a->tiling) == (b->tiling))) { onFail("a->tiling (Error: Value not equal)"); };
+    if (!((a->format) == (b->format))) {
+        onFail("a->format (Error: Value not equal)");
+    };
+    if (!((a->type) == (b->type))) {
+        onFail("a->type (Error: Value not equal)");
+    };
+    if (!((a->samples) == (b->samples))) {
+        onFail("a->samples (Error: Value not equal)");
+    };
+    if (!((a->usage) == (b->usage))) {
+        onFail("a->usage (Error: Value not equal)");
+    };
+    if (!((a->tiling) == (b->tiling))) {
+        onFail("a->tiling (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDevicePointClippingProperties(
     const VkPhysicalDevicePointClippingProperties* a,
-    const VkPhysicalDevicePointClippingProperties* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDevicePointClippingProperties* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->pointClippingBehavior) == (b->pointClippingBehavior))) { onFail("a->pointClippingBehavior (Error: Value not equal)"); };
+    if (!((a->pointClippingBehavior) == (b->pointClippingBehavior))) {
+        onFail("a->pointClippingBehavior (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkInputAttachmentAspectReference(
-    const VkInputAttachmentAspectReference* a,
-    const VkInputAttachmentAspectReference* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->subpass) == (b->subpass))) { onFail("a->subpass (Error: Value not equal)"); };
-    if (!((a->inputAttachmentIndex) == (b->inputAttachmentIndex))) { onFail("a->inputAttachmentIndex (Error: Value not equal)"); };
-    if (!((a->aspectMask) == (b->aspectMask))) { onFail("a->aspectMask (Error: Value not equal)"); };
+void checkEqual_VkInputAttachmentAspectReference(const VkInputAttachmentAspectReference* a,
+                                                 const VkInputAttachmentAspectReference* b,
+                                                 OnFailCompareFunc onFail) {
+    if (!((a->subpass) == (b->subpass))) {
+        onFail("a->subpass (Error: Value not equal)");
+    };
+    if (!((a->inputAttachmentIndex) == (b->inputAttachmentIndex))) {
+        onFail("a->inputAttachmentIndex (Error: Value not equal)");
+    };
+    if (!((a->aspectMask) == (b->aspectMask))) {
+        onFail("a->aspectMask (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkRenderPassInputAttachmentAspectCreateInfo(
     const VkRenderPassInputAttachmentAspectCreateInfo* a,
-    const VkRenderPassInputAttachmentAspectCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkRenderPassInputAttachmentAspectCreateInfo* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->aspectReferenceCount) == (b->aspectReferenceCount))) { onFail("a->aspectReferenceCount (Error: Value not equal)"); };
-    if ((a->pAspectReferences) && (b->pAspectReferences))
-    {
-        if (!((a->aspectReferenceCount) == (b->aspectReferenceCount))) { onFail("a->pAspectReferences (Error: Lengths not equal)"); };
-        if ((a->aspectReferenceCount) == (b->aspectReferenceCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->aspectReferenceCount; ++i)
-                {
-                    checkEqual_VkInputAttachmentAspectReference(a->pAspectReferences + i, b->pAspectReferences + i, onFail);
+    if (!((a->aspectReferenceCount) == (b->aspectReferenceCount))) {
+        onFail("a->aspectReferenceCount (Error: Value not equal)");
+    };
+    if ((a->pAspectReferences) && (b->pAspectReferences)) {
+        if (!((a->aspectReferenceCount) == (b->aspectReferenceCount))) {
+            onFail("a->pAspectReferences (Error: Lengths not equal)");
+        };
+        if ((a->aspectReferenceCount) == (b->aspectReferenceCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->aspectReferenceCount; ++i) {
+                    checkEqual_VkInputAttachmentAspectReference(a->pAspectReferences + i,
+                                                                b->pAspectReferences + i, onFail);
                 }
             }
         }
     }
 }
 
-void checkEqual_VkImageViewUsageCreateInfo(
-    const VkImageViewUsageCreateInfo* a,
-    const VkImageViewUsageCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkImageViewUsageCreateInfo(const VkImageViewUsageCreateInfo* a,
+                                           const VkImageViewUsageCreateInfo* b,
+                                           OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->usage) == (b->usage))) { onFail("a->usage (Error: Value not equal)"); };
+    if (!((a->usage) == (b->usage))) {
+        onFail("a->usage (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPipelineTessellationDomainOriginStateCreateInfo(
     const VkPipelineTessellationDomainOriginStateCreateInfo* a,
-    const VkPipelineTessellationDomainOriginStateCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPipelineTessellationDomainOriginStateCreateInfo* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->domainOrigin) == (b->domainOrigin))) { onFail("a->domainOrigin (Error: Value not equal)"); };
+    if (!((a->domainOrigin) == (b->domainOrigin))) {
+        onFail("a->domainOrigin (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkRenderPassMultiviewCreateInfo(
-    const VkRenderPassMultiviewCreateInfo* a,
-    const VkRenderPassMultiviewCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkRenderPassMultiviewCreateInfo(const VkRenderPassMultiviewCreateInfo* a,
+                                                const VkRenderPassMultiviewCreateInfo* b,
+                                                OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->subpassCount) == (b->subpassCount))) { onFail("a->subpassCount (Error: Value not equal)"); };
-    if (!((a->subpassCount) == (b->subpassCount))) { onFail("a->pViewMasks (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pViewMasks, b->pViewMasks, a->subpassCount * sizeof(const uint32_t)) == 0))) { onFail("a->pViewMasks (Error: Unequal dyn array)"); };
-    if (!((a->dependencyCount) == (b->dependencyCount))) { onFail("a->dependencyCount (Error: Value not equal)"); };
-    if (!((a->dependencyCount) == (b->dependencyCount))) { onFail("a->pViewOffsets (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pViewOffsets, b->pViewOffsets, a->dependencyCount * sizeof(const int32_t)) == 0))) { onFail("a->pViewOffsets (Error: Unequal dyn array)"); };
-    if (!((a->correlationMaskCount) == (b->correlationMaskCount))) { onFail("a->correlationMaskCount (Error: Value not equal)"); };
-    if (!((a->correlationMaskCount) == (b->correlationMaskCount))) { onFail("a->pCorrelationMasks (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pCorrelationMasks, b->pCorrelationMasks, a->correlationMaskCount * sizeof(const uint32_t)) == 0))) { onFail("a->pCorrelationMasks (Error: Unequal dyn array)"); };
+    if (!((a->subpassCount) == (b->subpassCount))) {
+        onFail("a->subpassCount (Error: Value not equal)");
+    };
+    if (!((a->subpassCount) == (b->subpassCount))) {
+        onFail("a->pViewMasks (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pViewMasks, b->pViewMasks, a->subpassCount * sizeof(const uint32_t)) == 0))) {
+        onFail("a->pViewMasks (Error: Unequal dyn array)");
+    };
+    if (!((a->dependencyCount) == (b->dependencyCount))) {
+        onFail("a->dependencyCount (Error: Value not equal)");
+    };
+    if (!((a->dependencyCount) == (b->dependencyCount))) {
+        onFail("a->pViewOffsets (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pViewOffsets, b->pViewOffsets, a->dependencyCount * sizeof(const int32_t)) ==
+           0))) {
+        onFail("a->pViewOffsets (Error: Unequal dyn array)");
+    };
+    if (!((a->correlationMaskCount) == (b->correlationMaskCount))) {
+        onFail("a->correlationMaskCount (Error: Value not equal)");
+    };
+    if (!((a->correlationMaskCount) == (b->correlationMaskCount))) {
+        onFail("a->pCorrelationMasks (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pCorrelationMasks, b->pCorrelationMasks,
+                  a->correlationMaskCount * sizeof(const uint32_t)) == 0))) {
+        onFail("a->pCorrelationMasks (Error: Unequal dyn array)");
+    };
 }
 
-void checkEqual_VkPhysicalDeviceMultiviewFeatures(
-    const VkPhysicalDeviceMultiviewFeatures* a,
-    const VkPhysicalDeviceMultiviewFeatures* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPhysicalDeviceMultiviewFeatures(const VkPhysicalDeviceMultiviewFeatures* a,
+                                                  const VkPhysicalDeviceMultiviewFeatures* b,
+                                                  OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->multiview) == (b->multiview))) { onFail("a->multiview (Error: Value not equal)"); };
-    if (!((a->multiviewGeometryShader) == (b->multiviewGeometryShader))) { onFail("a->multiviewGeometryShader (Error: Value not equal)"); };
-    if (!((a->multiviewTessellationShader) == (b->multiviewTessellationShader))) { onFail("a->multiviewTessellationShader (Error: Value not equal)"); };
+    if (!((a->multiview) == (b->multiview))) {
+        onFail("a->multiview (Error: Value not equal)");
+    };
+    if (!((a->multiviewGeometryShader) == (b->multiviewGeometryShader))) {
+        onFail("a->multiviewGeometryShader (Error: Value not equal)");
+    };
+    if (!((a->multiviewTessellationShader) == (b->multiviewTessellationShader))) {
+        onFail("a->multiviewTessellationShader (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkPhysicalDeviceMultiviewProperties(
-    const VkPhysicalDeviceMultiviewProperties* a,
-    const VkPhysicalDeviceMultiviewProperties* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPhysicalDeviceMultiviewProperties(const VkPhysicalDeviceMultiviewProperties* a,
+                                                    const VkPhysicalDeviceMultiviewProperties* b,
+                                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->maxMultiviewViewCount) == (b->maxMultiviewViewCount))) { onFail("a->maxMultiviewViewCount (Error: Value not equal)"); };
-    if (!((a->maxMultiviewInstanceIndex) == (b->maxMultiviewInstanceIndex))) { onFail("a->maxMultiviewInstanceIndex (Error: Value not equal)"); };
+    if (!((a->maxMultiviewViewCount) == (b->maxMultiviewViewCount))) {
+        onFail("a->maxMultiviewViewCount (Error: Value not equal)");
+    };
+    if (!((a->maxMultiviewInstanceIndex) == (b->maxMultiviewInstanceIndex))) {
+        onFail("a->maxMultiviewInstanceIndex (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceVariablePointersFeatures(
     const VkPhysicalDeviceVariablePointersFeatures* a,
-    const VkPhysicalDeviceVariablePointersFeatures* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceVariablePointersFeatures* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->variablePointersStorageBuffer) == (b->variablePointersStorageBuffer))) { onFail("a->variablePointersStorageBuffer (Error: Value not equal)"); };
-    if (!((a->variablePointers) == (b->variablePointers))) { onFail("a->variablePointers (Error: Value not equal)"); };
+    if (!((a->variablePointersStorageBuffer) == (b->variablePointersStorageBuffer))) {
+        onFail("a->variablePointersStorageBuffer (Error: Value not equal)");
+    };
+    if (!((a->variablePointers) == (b->variablePointers))) {
+        onFail("a->variablePointers (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceProtectedMemoryFeatures(
     const VkPhysicalDeviceProtectedMemoryFeatures* a,
-    const VkPhysicalDeviceProtectedMemoryFeatures* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceProtectedMemoryFeatures* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->protectedMemory) == (b->protectedMemory))) { onFail("a->protectedMemory (Error: Value not equal)"); };
+    if (!((a->protectedMemory) == (b->protectedMemory))) {
+        onFail("a->protectedMemory (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceProtectedMemoryProperties(
     const VkPhysicalDeviceProtectedMemoryProperties* a,
-    const VkPhysicalDeviceProtectedMemoryProperties* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceProtectedMemoryProperties* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->protectedNoFault) == (b->protectedNoFault))) { onFail("a->protectedNoFault (Error: Value not equal)"); };
+    if (!((a->protectedNoFault) == (b->protectedNoFault))) {
+        onFail("a->protectedNoFault (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkDeviceQueueInfo2(
-    const VkDeviceQueueInfo2* a,
-    const VkDeviceQueueInfo2* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDeviceQueueInfo2(const VkDeviceQueueInfo2* a, const VkDeviceQueueInfo2* b,
+                                   OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->queueFamilyIndex) == (b->queueFamilyIndex))) { onFail("a->queueFamilyIndex (Error: Value not equal)"); };
-    if (!((a->queueIndex) == (b->queueIndex))) { onFail("a->queueIndex (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->queueFamilyIndex) == (b->queueFamilyIndex))) {
+        onFail("a->queueFamilyIndex (Error: Value not equal)");
+    };
+    if (!((a->queueIndex) == (b->queueIndex))) {
+        onFail("a->queueIndex (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkProtectedSubmitInfo(
-    const VkProtectedSubmitInfo* a,
-    const VkProtectedSubmitInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkProtectedSubmitInfo(const VkProtectedSubmitInfo* a,
+                                      const VkProtectedSubmitInfo* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->protectedSubmit) == (b->protectedSubmit))) { onFail("a->protectedSubmit (Error: Value not equal)"); };
+    if (!((a->protectedSubmit) == (b->protectedSubmit))) {
+        onFail("a->protectedSubmit (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkSamplerYcbcrConversionCreateInfo(
-    const VkSamplerYcbcrConversionCreateInfo* a,
-    const VkSamplerYcbcrConversionCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkSamplerYcbcrConversionCreateInfo(const VkSamplerYcbcrConversionCreateInfo* a,
+                                                   const VkSamplerYcbcrConversionCreateInfo* b,
+                                                   OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->format) == (b->format))) { onFail("a->format (Error: Value not equal)"); };
-    if (!((a->ycbcrModel) == (b->ycbcrModel))) { onFail("a->ycbcrModel (Error: Value not equal)"); };
-    if (!((a->ycbcrRange) == (b->ycbcrRange))) { onFail("a->ycbcrRange (Error: Value not equal)"); };
+    if (!((a->format) == (b->format))) {
+        onFail("a->format (Error: Value not equal)");
+    };
+    if (!((a->ycbcrModel) == (b->ycbcrModel))) {
+        onFail("a->ycbcrModel (Error: Value not equal)");
+    };
+    if (!((a->ycbcrRange) == (b->ycbcrRange))) {
+        onFail("a->ycbcrRange (Error: Value not equal)");
+    };
     checkEqual_VkComponentMapping(&a->components, &b->components, onFail);
-    if (!((a->xChromaOffset) == (b->xChromaOffset))) { onFail("a->xChromaOffset (Error: Value not equal)"); };
-    if (!((a->yChromaOffset) == (b->yChromaOffset))) { onFail("a->yChromaOffset (Error: Value not equal)"); };
-    if (!((a->chromaFilter) == (b->chromaFilter))) { onFail("a->chromaFilter (Error: Value not equal)"); };
-    if (!((a->forceExplicitReconstruction) == (b->forceExplicitReconstruction))) { onFail("a->forceExplicitReconstruction (Error: Value not equal)"); };
+    if (!((a->xChromaOffset) == (b->xChromaOffset))) {
+        onFail("a->xChromaOffset (Error: Value not equal)");
+    };
+    if (!((a->yChromaOffset) == (b->yChromaOffset))) {
+        onFail("a->yChromaOffset (Error: Value not equal)");
+    };
+    if (!((a->chromaFilter) == (b->chromaFilter))) {
+        onFail("a->chromaFilter (Error: Value not equal)");
+    };
+    if (!((a->forceExplicitReconstruction) == (b->forceExplicitReconstruction))) {
+        onFail("a->forceExplicitReconstruction (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkSamplerYcbcrConversionInfo(
-    const VkSamplerYcbcrConversionInfo* a,
-    const VkSamplerYcbcrConversionInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkSamplerYcbcrConversionInfo(const VkSamplerYcbcrConversionInfo* a,
+                                             const VkSamplerYcbcrConversionInfo* b,
+                                             OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->conversion) == (b->conversion))) { onFail("a->conversion (Error: Value not equal)"); };
+    if (!((a->conversion) == (b->conversion))) {
+        onFail("a->conversion (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkBindImagePlaneMemoryInfo(
-    const VkBindImagePlaneMemoryInfo* a,
-    const VkBindImagePlaneMemoryInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkBindImagePlaneMemoryInfo(const VkBindImagePlaneMemoryInfo* a,
+                                           const VkBindImagePlaneMemoryInfo* b,
+                                           OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->planeAspect) == (b->planeAspect))) { onFail("a->planeAspect (Error: Value not equal)"); };
+    if (!((a->planeAspect) == (b->planeAspect))) {
+        onFail("a->planeAspect (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkImagePlaneMemoryRequirementsInfo(
-    const VkImagePlaneMemoryRequirementsInfo* a,
-    const VkImagePlaneMemoryRequirementsInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkImagePlaneMemoryRequirementsInfo(const VkImagePlaneMemoryRequirementsInfo* a,
+                                                   const VkImagePlaneMemoryRequirementsInfo* b,
+                                                   OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->planeAspect) == (b->planeAspect))) { onFail("a->planeAspect (Error: Value not equal)"); };
+    if (!((a->planeAspect) == (b->planeAspect))) {
+        onFail("a->planeAspect (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
     const VkPhysicalDeviceSamplerYcbcrConversionFeatures* a,
-    const VkPhysicalDeviceSamplerYcbcrConversionFeatures* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceSamplerYcbcrConversionFeatures* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->samplerYcbcrConversion) == (b->samplerYcbcrConversion))) { onFail("a->samplerYcbcrConversion (Error: Value not equal)"); };
+    if (!((a->samplerYcbcrConversion) == (b->samplerYcbcrConversion))) {
+        onFail("a->samplerYcbcrConversion (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkSamplerYcbcrConversionImageFormatProperties(
     const VkSamplerYcbcrConversionImageFormatProperties* a,
-    const VkSamplerYcbcrConversionImageFormatProperties* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkSamplerYcbcrConversionImageFormatProperties* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->combinedImageSamplerDescriptorCount) == (b->combinedImageSamplerDescriptorCount))) { onFail("a->combinedImageSamplerDescriptorCount (Error: Value not equal)"); };
+    if (!((a->combinedImageSamplerDescriptorCount) == (b->combinedImageSamplerDescriptorCount))) {
+        onFail("a->combinedImageSamplerDescriptorCount (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkDescriptorUpdateTemplateEntry(
-    const VkDescriptorUpdateTemplateEntry* a,
-    const VkDescriptorUpdateTemplateEntry* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->dstBinding) == (b->dstBinding))) { onFail("a->dstBinding (Error: Value not equal)"); };
-    if (!((a->dstArrayElement) == (b->dstArrayElement))) { onFail("a->dstArrayElement (Error: Value not equal)"); };
-    if (!((a->descriptorCount) == (b->descriptorCount))) { onFail("a->descriptorCount (Error: Value not equal)"); };
-    if (!((a->descriptorType) == (b->descriptorType))) { onFail("a->descriptorType (Error: Value not equal)"); };
-    if (!((a->offset) == (b->offset))) { onFail("a->offset (Error: Value not equal)"); };
-    if (!((a->stride) == (b->stride))) { onFail("a->stride (Error: Value not equal)"); };
+void checkEqual_VkDescriptorUpdateTemplateEntry(const VkDescriptorUpdateTemplateEntry* a,
+                                                const VkDescriptorUpdateTemplateEntry* b,
+                                                OnFailCompareFunc onFail) {
+    if (!((a->dstBinding) == (b->dstBinding))) {
+        onFail("a->dstBinding (Error: Value not equal)");
+    };
+    if (!((a->dstArrayElement) == (b->dstArrayElement))) {
+        onFail("a->dstArrayElement (Error: Value not equal)");
+    };
+    if (!((a->descriptorCount) == (b->descriptorCount))) {
+        onFail("a->descriptorCount (Error: Value not equal)");
+    };
+    if (!((a->descriptorType) == (b->descriptorType))) {
+        onFail("a->descriptorType (Error: Value not equal)");
+    };
+    if (!((a->offset) == (b->offset))) {
+        onFail("a->offset (Error: Value not equal)");
+    };
+    if (!((a->stride) == (b->stride))) {
+        onFail("a->stride (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkDescriptorUpdateTemplateCreateInfo(
-    const VkDescriptorUpdateTemplateCreateInfo* a,
-    const VkDescriptorUpdateTemplateCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDescriptorUpdateTemplateCreateInfo(const VkDescriptorUpdateTemplateCreateInfo* a,
+                                                     const VkDescriptorUpdateTemplateCreateInfo* b,
+                                                     OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->descriptorUpdateEntryCount) == (b->descriptorUpdateEntryCount))) { onFail("a->descriptorUpdateEntryCount (Error: Value not equal)"); };
-    if ((a->pDescriptorUpdateEntries) && (b->pDescriptorUpdateEntries))
-    {
-        if (!((a->descriptorUpdateEntryCount) == (b->descriptorUpdateEntryCount))) { onFail("a->pDescriptorUpdateEntries (Error: Lengths not equal)"); };
-        if ((a->descriptorUpdateEntryCount) == (b->descriptorUpdateEntryCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->descriptorUpdateEntryCount; ++i)
-                {
-                    checkEqual_VkDescriptorUpdateTemplateEntry(a->pDescriptorUpdateEntries + i, b->pDescriptorUpdateEntries + i, onFail);
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->descriptorUpdateEntryCount) == (b->descriptorUpdateEntryCount))) {
+        onFail("a->descriptorUpdateEntryCount (Error: Value not equal)");
+    };
+    if ((a->pDescriptorUpdateEntries) && (b->pDescriptorUpdateEntries)) {
+        if (!((a->descriptorUpdateEntryCount) == (b->descriptorUpdateEntryCount))) {
+            onFail("a->pDescriptorUpdateEntries (Error: Lengths not equal)");
+        };
+        if ((a->descriptorUpdateEntryCount) == (b->descriptorUpdateEntryCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->descriptorUpdateEntryCount; ++i) {
+                    checkEqual_VkDescriptorUpdateTemplateEntry(
+                        a->pDescriptorUpdateEntries + i, b->pDescriptorUpdateEntries + i, onFail);
                 }
             }
         }
     }
-    if (!((a->templateType) == (b->templateType))) { onFail("a->templateType (Error: Value not equal)"); };
-    if (!((a->descriptorSetLayout) == (b->descriptorSetLayout))) { onFail("a->descriptorSetLayout (Error: Value not equal)"); };
-    if (!((a->pipelineBindPoint) == (b->pipelineBindPoint))) { onFail("a->pipelineBindPoint (Error: Value not equal)"); };
-    if (!((a->pipelineLayout) == (b->pipelineLayout))) { onFail("a->pipelineLayout (Error: Value not equal)"); };
-    if (!((a->set) == (b->set))) { onFail("a->set (Error: Value not equal)"); };
+    if (!((a->templateType) == (b->templateType))) {
+        onFail("a->templateType (Error: Value not equal)");
+    };
+    if (!((a->descriptorSetLayout) == (b->descriptorSetLayout))) {
+        onFail("a->descriptorSetLayout (Error: Value not equal)");
+    };
+    if (!((a->pipelineBindPoint) == (b->pipelineBindPoint))) {
+        onFail("a->pipelineBindPoint (Error: Value not equal)");
+    };
+    if (!((a->pipelineLayout) == (b->pipelineLayout))) {
+        onFail("a->pipelineLayout (Error: Value not equal)");
+    };
+    if (!((a->set) == (b->set))) {
+        onFail("a->set (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkExternalMemoryProperties(
-    const VkExternalMemoryProperties* a,
-    const VkExternalMemoryProperties* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->externalMemoryFeatures) == (b->externalMemoryFeatures))) { onFail("a->externalMemoryFeatures (Error: Value not equal)"); };
-    if (!((a->exportFromImportedHandleTypes) == (b->exportFromImportedHandleTypes))) { onFail("a->exportFromImportedHandleTypes (Error: Value not equal)"); };
-    if (!((a->compatibleHandleTypes) == (b->compatibleHandleTypes))) { onFail("a->compatibleHandleTypes (Error: Value not equal)"); };
+void checkEqual_VkExternalMemoryProperties(const VkExternalMemoryProperties* a,
+                                           const VkExternalMemoryProperties* b,
+                                           OnFailCompareFunc onFail) {
+    if (!((a->externalMemoryFeatures) == (b->externalMemoryFeatures))) {
+        onFail("a->externalMemoryFeatures (Error: Value not equal)");
+    };
+    if (!((a->exportFromImportedHandleTypes) == (b->exportFromImportedHandleTypes))) {
+        onFail("a->exportFromImportedHandleTypes (Error: Value not equal)");
+    };
+    if (!((a->compatibleHandleTypes) == (b->compatibleHandleTypes))) {
+        onFail("a->compatibleHandleTypes (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceExternalImageFormatInfo(
     const VkPhysicalDeviceExternalImageFormatInfo* a,
-    const VkPhysicalDeviceExternalImageFormatInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceExternalImageFormatInfo* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->handleType) == (b->handleType))) { onFail("a->handleType (Error: Value not equal)"); };
+    if (!((a->handleType) == (b->handleType))) {
+        onFail("a->handleType (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkExternalImageFormatProperties(
-    const VkExternalImageFormatProperties* a,
-    const VkExternalImageFormatProperties* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkExternalImageFormatProperties(const VkExternalImageFormatProperties* a,
+                                                const VkExternalImageFormatProperties* b,
+                                                OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    checkEqual_VkExternalMemoryProperties(&a->externalMemoryProperties, &b->externalMemoryProperties, onFail);
+    checkEqual_VkExternalMemoryProperties(&a->externalMemoryProperties,
+                                          &b->externalMemoryProperties, onFail);
 }
 
-void checkEqual_VkPhysicalDeviceExternalBufferInfo(
-    const VkPhysicalDeviceExternalBufferInfo* a,
-    const VkPhysicalDeviceExternalBufferInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPhysicalDeviceExternalBufferInfo(const VkPhysicalDeviceExternalBufferInfo* a,
+                                                   const VkPhysicalDeviceExternalBufferInfo* b,
+                                                   OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->usage) == (b->usage))) { onFail("a->usage (Error: Value not equal)"); };
-    if (!((a->handleType) == (b->handleType))) { onFail("a->handleType (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->usage) == (b->usage))) {
+        onFail("a->usage (Error: Value not equal)");
+    };
+    if (!((a->handleType) == (b->handleType))) {
+        onFail("a->handleType (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkExternalBufferProperties(
-    const VkExternalBufferProperties* a,
-    const VkExternalBufferProperties* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkExternalBufferProperties(const VkExternalBufferProperties* a,
+                                           const VkExternalBufferProperties* b,
+                                           OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    checkEqual_VkExternalMemoryProperties(&a->externalMemoryProperties, &b->externalMemoryProperties, onFail);
+    checkEqual_VkExternalMemoryProperties(&a->externalMemoryProperties,
+                                          &b->externalMemoryProperties, onFail);
 }
 
-void checkEqual_VkPhysicalDeviceIDProperties(
-    const VkPhysicalDeviceIDProperties* a,
-    const VkPhysicalDeviceIDProperties* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPhysicalDeviceIDProperties(const VkPhysicalDeviceIDProperties* a,
+                                             const VkPhysicalDeviceIDProperties* b,
+                                             OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((memcmp(a->deviceUUID, b->deviceUUID, VK_UUID_SIZE * sizeof(uint8_t)) == 0))) { onFail("a->deviceUUID (Error: Unequal static array)"); };
-    if (!((memcmp(a->driverUUID, b->driverUUID, VK_UUID_SIZE * sizeof(uint8_t)) == 0))) { onFail("a->driverUUID (Error: Unequal static array)"); };
-    if (!((memcmp(a->deviceLUID, b->deviceLUID, VK_LUID_SIZE * sizeof(uint8_t)) == 0))) { onFail("a->deviceLUID (Error: Unequal static array)"); };
-    if (!((a->deviceNodeMask) == (b->deviceNodeMask))) { onFail("a->deviceNodeMask (Error: Value not equal)"); };
-    if (!((a->deviceLUIDValid) == (b->deviceLUIDValid))) { onFail("a->deviceLUIDValid (Error: Value not equal)"); };
+    if (!((memcmp(a->deviceUUID, b->deviceUUID, VK_UUID_SIZE * sizeof(uint8_t)) == 0))) {
+        onFail("a->deviceUUID (Error: Unequal static array)");
+    };
+    if (!((memcmp(a->driverUUID, b->driverUUID, VK_UUID_SIZE * sizeof(uint8_t)) == 0))) {
+        onFail("a->driverUUID (Error: Unequal static array)");
+    };
+    if (!((memcmp(a->deviceLUID, b->deviceLUID, VK_LUID_SIZE * sizeof(uint8_t)) == 0))) {
+        onFail("a->deviceLUID (Error: Unequal static array)");
+    };
+    if (!((a->deviceNodeMask) == (b->deviceNodeMask))) {
+        onFail("a->deviceNodeMask (Error: Value not equal)");
+    };
+    if (!((a->deviceLUIDValid) == (b->deviceLUIDValid))) {
+        onFail("a->deviceLUIDValid (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkExternalMemoryImageCreateInfo(
-    const VkExternalMemoryImageCreateInfo* a,
-    const VkExternalMemoryImageCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkExternalMemoryImageCreateInfo(const VkExternalMemoryImageCreateInfo* a,
+                                                const VkExternalMemoryImageCreateInfo* b,
+                                                OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->handleTypes) == (b->handleTypes))) { onFail("a->handleTypes (Error: Value not equal)"); };
+    if (!((a->handleTypes) == (b->handleTypes))) {
+        onFail("a->handleTypes (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkExternalMemoryBufferCreateInfo(
-    const VkExternalMemoryBufferCreateInfo* a,
-    const VkExternalMemoryBufferCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkExternalMemoryBufferCreateInfo(const VkExternalMemoryBufferCreateInfo* a,
+                                                 const VkExternalMemoryBufferCreateInfo* b,
+                                                 OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->handleTypes) == (b->handleTypes))) { onFail("a->handleTypes (Error: Value not equal)"); };
+    if (!((a->handleTypes) == (b->handleTypes))) {
+        onFail("a->handleTypes (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkExportMemoryAllocateInfo(
-    const VkExportMemoryAllocateInfo* a,
-    const VkExportMemoryAllocateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkExportMemoryAllocateInfo(const VkExportMemoryAllocateInfo* a,
+                                           const VkExportMemoryAllocateInfo* b,
+                                           OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->handleTypes) == (b->handleTypes))) { onFail("a->handleTypes (Error: Value not equal)"); };
+    if (!((a->handleTypes) == (b->handleTypes))) {
+        onFail("a->handleTypes (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkPhysicalDeviceExternalFenceInfo(
-    const VkPhysicalDeviceExternalFenceInfo* a,
-    const VkPhysicalDeviceExternalFenceInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPhysicalDeviceExternalFenceInfo(const VkPhysicalDeviceExternalFenceInfo* a,
+                                                  const VkPhysicalDeviceExternalFenceInfo* b,
+                                                  OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->handleType) == (b->handleType))) { onFail("a->handleType (Error: Value not equal)"); };
+    if (!((a->handleType) == (b->handleType))) {
+        onFail("a->handleType (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkExternalFenceProperties(
-    const VkExternalFenceProperties* a,
-    const VkExternalFenceProperties* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkExternalFenceProperties(const VkExternalFenceProperties* a,
+                                          const VkExternalFenceProperties* b,
+                                          OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->exportFromImportedHandleTypes) == (b->exportFromImportedHandleTypes))) { onFail("a->exportFromImportedHandleTypes (Error: Value not equal)"); };
-    if (!((a->compatibleHandleTypes) == (b->compatibleHandleTypes))) { onFail("a->compatibleHandleTypes (Error: Value not equal)"); };
-    if (!((a->externalFenceFeatures) == (b->externalFenceFeatures))) { onFail("a->externalFenceFeatures (Error: Value not equal)"); };
+    if (!((a->exportFromImportedHandleTypes) == (b->exportFromImportedHandleTypes))) {
+        onFail("a->exportFromImportedHandleTypes (Error: Value not equal)");
+    };
+    if (!((a->compatibleHandleTypes) == (b->compatibleHandleTypes))) {
+        onFail("a->compatibleHandleTypes (Error: Value not equal)");
+    };
+    if (!((a->externalFenceFeatures) == (b->externalFenceFeatures))) {
+        onFail("a->externalFenceFeatures (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkExportFenceCreateInfo(
-    const VkExportFenceCreateInfo* a,
-    const VkExportFenceCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkExportFenceCreateInfo(const VkExportFenceCreateInfo* a,
+                                        const VkExportFenceCreateInfo* b,
+                                        OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->handleTypes) == (b->handleTypes))) { onFail("a->handleTypes (Error: Value not equal)"); };
+    if (!((a->handleTypes) == (b->handleTypes))) {
+        onFail("a->handleTypes (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkExportSemaphoreCreateInfo(
-    const VkExportSemaphoreCreateInfo* a,
-    const VkExportSemaphoreCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkExportSemaphoreCreateInfo(const VkExportSemaphoreCreateInfo* a,
+                                            const VkExportSemaphoreCreateInfo* b,
+                                            OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->handleTypes) == (b->handleTypes))) { onFail("a->handleTypes (Error: Value not equal)"); };
+    if (!((a->handleTypes) == (b->handleTypes))) {
+        onFail("a->handleTypes (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceExternalSemaphoreInfo(
-    const VkPhysicalDeviceExternalSemaphoreInfo* a,
-    const VkPhysicalDeviceExternalSemaphoreInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceExternalSemaphoreInfo* a, const VkPhysicalDeviceExternalSemaphoreInfo* b,
+    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->handleType) == (b->handleType))) { onFail("a->handleType (Error: Value not equal)"); };
+    if (!((a->handleType) == (b->handleType))) {
+        onFail("a->handleType (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkExternalSemaphoreProperties(
-    const VkExternalSemaphoreProperties* a,
-    const VkExternalSemaphoreProperties* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkExternalSemaphoreProperties(const VkExternalSemaphoreProperties* a,
+                                              const VkExternalSemaphoreProperties* b,
+                                              OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->exportFromImportedHandleTypes) == (b->exportFromImportedHandleTypes))) { onFail("a->exportFromImportedHandleTypes (Error: Value not equal)"); };
-    if (!((a->compatibleHandleTypes) == (b->compatibleHandleTypes))) { onFail("a->compatibleHandleTypes (Error: Value not equal)"); };
-    if (!((a->externalSemaphoreFeatures) == (b->externalSemaphoreFeatures))) { onFail("a->externalSemaphoreFeatures (Error: Value not equal)"); };
+    if (!((a->exportFromImportedHandleTypes) == (b->exportFromImportedHandleTypes))) {
+        onFail("a->exportFromImportedHandleTypes (Error: Value not equal)");
+    };
+    if (!((a->compatibleHandleTypes) == (b->compatibleHandleTypes))) {
+        onFail("a->compatibleHandleTypes (Error: Value not equal)");
+    };
+    if (!((a->externalSemaphoreFeatures) == (b->externalSemaphoreFeatures))) {
+        onFail("a->externalSemaphoreFeatures (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceMaintenance3Properties(
     const VkPhysicalDeviceMaintenance3Properties* a,
-    const VkPhysicalDeviceMaintenance3Properties* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceMaintenance3Properties* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->maxPerSetDescriptors) == (b->maxPerSetDescriptors))) { onFail("a->maxPerSetDescriptors (Error: Value not equal)"); };
-    if (!((a->maxMemoryAllocationSize) == (b->maxMemoryAllocationSize))) { onFail("a->maxMemoryAllocationSize (Error: Value not equal)"); };
+    if (!((a->maxPerSetDescriptors) == (b->maxPerSetDescriptors))) {
+        onFail("a->maxPerSetDescriptors (Error: Value not equal)");
+    };
+    if (!((a->maxMemoryAllocationSize) == (b->maxMemoryAllocationSize))) {
+        onFail("a->maxMemoryAllocationSize (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkDescriptorSetLayoutSupport(
-    const VkDescriptorSetLayoutSupport* a,
-    const VkDescriptorSetLayoutSupport* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDescriptorSetLayoutSupport(const VkDescriptorSetLayoutSupport* a,
+                                             const VkDescriptorSetLayoutSupport* b,
+                                             OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->supported) == (b->supported))) { onFail("a->supported (Error: Value not equal)"); };
+    if (!((a->supported) == (b->supported))) {
+        onFail("a->supported (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceShaderDrawParametersFeatures(
     const VkPhysicalDeviceShaderDrawParametersFeatures* a,
-    const VkPhysicalDeviceShaderDrawParametersFeatures* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceShaderDrawParametersFeatures* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->shaderDrawParameters) == (b->shaderDrawParameters))) { onFail("a->shaderDrawParameters (Error: Value not equal)"); };
+    if (!((a->shaderDrawParameters) == (b->shaderDrawParameters))) {
+        onFail("a->shaderDrawParameters (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_VERSION_1_2
-void checkEqual_VkPhysicalDeviceVulkan11Features(
-    const VkPhysicalDeviceVulkan11Features* a,
-    const VkPhysicalDeviceVulkan11Features* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPhysicalDeviceVulkan11Features(const VkPhysicalDeviceVulkan11Features* a,
+                                                 const VkPhysicalDeviceVulkan11Features* b,
+                                                 OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->storageBuffer16BitAccess) == (b->storageBuffer16BitAccess))) { onFail("a->storageBuffer16BitAccess (Error: Value not equal)"); };
-    if (!((a->uniformAndStorageBuffer16BitAccess) == (b->uniformAndStorageBuffer16BitAccess))) { onFail("a->uniformAndStorageBuffer16BitAccess (Error: Value not equal)"); };
-    if (!((a->storagePushConstant16) == (b->storagePushConstant16))) { onFail("a->storagePushConstant16 (Error: Value not equal)"); };
-    if (!((a->storageInputOutput16) == (b->storageInputOutput16))) { onFail("a->storageInputOutput16 (Error: Value not equal)"); };
-    if (!((a->multiview) == (b->multiview))) { onFail("a->multiview (Error: Value not equal)"); };
-    if (!((a->multiviewGeometryShader) == (b->multiviewGeometryShader))) { onFail("a->multiviewGeometryShader (Error: Value not equal)"); };
-    if (!((a->multiviewTessellationShader) == (b->multiviewTessellationShader))) { onFail("a->multiviewTessellationShader (Error: Value not equal)"); };
-    if (!((a->variablePointersStorageBuffer) == (b->variablePointersStorageBuffer))) { onFail("a->variablePointersStorageBuffer (Error: Value not equal)"); };
-    if (!((a->variablePointers) == (b->variablePointers))) { onFail("a->variablePointers (Error: Value not equal)"); };
-    if (!((a->protectedMemory) == (b->protectedMemory))) { onFail("a->protectedMemory (Error: Value not equal)"); };
-    if (!((a->samplerYcbcrConversion) == (b->samplerYcbcrConversion))) { onFail("a->samplerYcbcrConversion (Error: Value not equal)"); };
-    if (!((a->shaderDrawParameters) == (b->shaderDrawParameters))) { onFail("a->shaderDrawParameters (Error: Value not equal)"); };
+    if (!((a->storageBuffer16BitAccess) == (b->storageBuffer16BitAccess))) {
+        onFail("a->storageBuffer16BitAccess (Error: Value not equal)");
+    };
+    if (!((a->uniformAndStorageBuffer16BitAccess) == (b->uniformAndStorageBuffer16BitAccess))) {
+        onFail("a->uniformAndStorageBuffer16BitAccess (Error: Value not equal)");
+    };
+    if (!((a->storagePushConstant16) == (b->storagePushConstant16))) {
+        onFail("a->storagePushConstant16 (Error: Value not equal)");
+    };
+    if (!((a->storageInputOutput16) == (b->storageInputOutput16))) {
+        onFail("a->storageInputOutput16 (Error: Value not equal)");
+    };
+    if (!((a->multiview) == (b->multiview))) {
+        onFail("a->multiview (Error: Value not equal)");
+    };
+    if (!((a->multiviewGeometryShader) == (b->multiviewGeometryShader))) {
+        onFail("a->multiviewGeometryShader (Error: Value not equal)");
+    };
+    if (!((a->multiviewTessellationShader) == (b->multiviewTessellationShader))) {
+        onFail("a->multiviewTessellationShader (Error: Value not equal)");
+    };
+    if (!((a->variablePointersStorageBuffer) == (b->variablePointersStorageBuffer))) {
+        onFail("a->variablePointersStorageBuffer (Error: Value not equal)");
+    };
+    if (!((a->variablePointers) == (b->variablePointers))) {
+        onFail("a->variablePointers (Error: Value not equal)");
+    };
+    if (!((a->protectedMemory) == (b->protectedMemory))) {
+        onFail("a->protectedMemory (Error: Value not equal)");
+    };
+    if (!((a->samplerYcbcrConversion) == (b->samplerYcbcrConversion))) {
+        onFail("a->samplerYcbcrConversion (Error: Value not equal)");
+    };
+    if (!((a->shaderDrawParameters) == (b->shaderDrawParameters))) {
+        onFail("a->shaderDrawParameters (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkPhysicalDeviceVulkan11Properties(
-    const VkPhysicalDeviceVulkan11Properties* a,
-    const VkPhysicalDeviceVulkan11Properties* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPhysicalDeviceVulkan11Properties(const VkPhysicalDeviceVulkan11Properties* a,
+                                                   const VkPhysicalDeviceVulkan11Properties* b,
+                                                   OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((memcmp(a->deviceUUID, b->deviceUUID, VK_UUID_SIZE * sizeof(uint8_t)) == 0))) { onFail("a->deviceUUID (Error: Unequal static array)"); };
-    if (!((memcmp(a->driverUUID, b->driverUUID, VK_UUID_SIZE * sizeof(uint8_t)) == 0))) { onFail("a->driverUUID (Error: Unequal static array)"); };
-    if (!((memcmp(a->deviceLUID, b->deviceLUID, VK_LUID_SIZE * sizeof(uint8_t)) == 0))) { onFail("a->deviceLUID (Error: Unequal static array)"); };
-    if (!((a->deviceNodeMask) == (b->deviceNodeMask))) { onFail("a->deviceNodeMask (Error: Value not equal)"); };
-    if (!((a->deviceLUIDValid) == (b->deviceLUIDValid))) { onFail("a->deviceLUIDValid (Error: Value not equal)"); };
-    if (!((a->subgroupSize) == (b->subgroupSize))) { onFail("a->subgroupSize (Error: Value not equal)"); };
-    if (!((a->subgroupSupportedStages) == (b->subgroupSupportedStages))) { onFail("a->subgroupSupportedStages (Error: Value not equal)"); };
-    if (!((a->subgroupSupportedOperations) == (b->subgroupSupportedOperations))) { onFail("a->subgroupSupportedOperations (Error: Value not equal)"); };
-    if (!((a->subgroupQuadOperationsInAllStages) == (b->subgroupQuadOperationsInAllStages))) { onFail("a->subgroupQuadOperationsInAllStages (Error: Value not equal)"); };
-    if (!((a->pointClippingBehavior) == (b->pointClippingBehavior))) { onFail("a->pointClippingBehavior (Error: Value not equal)"); };
-    if (!((a->maxMultiviewViewCount) == (b->maxMultiviewViewCount))) { onFail("a->maxMultiviewViewCount (Error: Value not equal)"); };
-    if (!((a->maxMultiviewInstanceIndex) == (b->maxMultiviewInstanceIndex))) { onFail("a->maxMultiviewInstanceIndex (Error: Value not equal)"); };
-    if (!((a->protectedNoFault) == (b->protectedNoFault))) { onFail("a->protectedNoFault (Error: Value not equal)"); };
-    if (!((a->maxPerSetDescriptors) == (b->maxPerSetDescriptors))) { onFail("a->maxPerSetDescriptors (Error: Value not equal)"); };
-    if (!((a->maxMemoryAllocationSize) == (b->maxMemoryAllocationSize))) { onFail("a->maxMemoryAllocationSize (Error: Value not equal)"); };
+    if (!((memcmp(a->deviceUUID, b->deviceUUID, VK_UUID_SIZE * sizeof(uint8_t)) == 0))) {
+        onFail("a->deviceUUID (Error: Unequal static array)");
+    };
+    if (!((memcmp(a->driverUUID, b->driverUUID, VK_UUID_SIZE * sizeof(uint8_t)) == 0))) {
+        onFail("a->driverUUID (Error: Unequal static array)");
+    };
+    if (!((memcmp(a->deviceLUID, b->deviceLUID, VK_LUID_SIZE * sizeof(uint8_t)) == 0))) {
+        onFail("a->deviceLUID (Error: Unequal static array)");
+    };
+    if (!((a->deviceNodeMask) == (b->deviceNodeMask))) {
+        onFail("a->deviceNodeMask (Error: Value not equal)");
+    };
+    if (!((a->deviceLUIDValid) == (b->deviceLUIDValid))) {
+        onFail("a->deviceLUIDValid (Error: Value not equal)");
+    };
+    if (!((a->subgroupSize) == (b->subgroupSize))) {
+        onFail("a->subgroupSize (Error: Value not equal)");
+    };
+    if (!((a->subgroupSupportedStages) == (b->subgroupSupportedStages))) {
+        onFail("a->subgroupSupportedStages (Error: Value not equal)");
+    };
+    if (!((a->subgroupSupportedOperations) == (b->subgroupSupportedOperations))) {
+        onFail("a->subgroupSupportedOperations (Error: Value not equal)");
+    };
+    if (!((a->subgroupQuadOperationsInAllStages) == (b->subgroupQuadOperationsInAllStages))) {
+        onFail("a->subgroupQuadOperationsInAllStages (Error: Value not equal)");
+    };
+    if (!((a->pointClippingBehavior) == (b->pointClippingBehavior))) {
+        onFail("a->pointClippingBehavior (Error: Value not equal)");
+    };
+    if (!((a->maxMultiviewViewCount) == (b->maxMultiviewViewCount))) {
+        onFail("a->maxMultiviewViewCount (Error: Value not equal)");
+    };
+    if (!((a->maxMultiviewInstanceIndex) == (b->maxMultiviewInstanceIndex))) {
+        onFail("a->maxMultiviewInstanceIndex (Error: Value not equal)");
+    };
+    if (!((a->protectedNoFault) == (b->protectedNoFault))) {
+        onFail("a->protectedNoFault (Error: Value not equal)");
+    };
+    if (!((a->maxPerSetDescriptors) == (b->maxPerSetDescriptors))) {
+        onFail("a->maxPerSetDescriptors (Error: Value not equal)");
+    };
+    if (!((a->maxMemoryAllocationSize) == (b->maxMemoryAllocationSize))) {
+        onFail("a->maxMemoryAllocationSize (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkPhysicalDeviceVulkan12Features(
-    const VkPhysicalDeviceVulkan12Features* a,
-    const VkPhysicalDeviceVulkan12Features* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPhysicalDeviceVulkan12Features(const VkPhysicalDeviceVulkan12Features* a,
+                                                 const VkPhysicalDeviceVulkan12Features* b,
+                                                 OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->samplerMirrorClampToEdge) == (b->samplerMirrorClampToEdge))) { onFail("a->samplerMirrorClampToEdge (Error: Value not equal)"); };
-    if (!((a->drawIndirectCount) == (b->drawIndirectCount))) { onFail("a->drawIndirectCount (Error: Value not equal)"); };
-    if (!((a->storageBuffer8BitAccess) == (b->storageBuffer8BitAccess))) { onFail("a->storageBuffer8BitAccess (Error: Value not equal)"); };
-    if (!((a->uniformAndStorageBuffer8BitAccess) == (b->uniformAndStorageBuffer8BitAccess))) { onFail("a->uniformAndStorageBuffer8BitAccess (Error: Value not equal)"); };
-    if (!((a->storagePushConstant8) == (b->storagePushConstant8))) { onFail("a->storagePushConstant8 (Error: Value not equal)"); };
-    if (!((a->shaderBufferInt64Atomics) == (b->shaderBufferInt64Atomics))) { onFail("a->shaderBufferInt64Atomics (Error: Value not equal)"); };
-    if (!((a->shaderSharedInt64Atomics) == (b->shaderSharedInt64Atomics))) { onFail("a->shaderSharedInt64Atomics (Error: Value not equal)"); };
-    if (!((a->shaderFloat16) == (b->shaderFloat16))) { onFail("a->shaderFloat16 (Error: Value not equal)"); };
-    if (!((a->shaderInt8) == (b->shaderInt8))) { onFail("a->shaderInt8 (Error: Value not equal)"); };
-    if (!((a->descriptorIndexing) == (b->descriptorIndexing))) { onFail("a->descriptorIndexing (Error: Value not equal)"); };
-    if (!((a->shaderInputAttachmentArrayDynamicIndexing) == (b->shaderInputAttachmentArrayDynamicIndexing))) { onFail("a->shaderInputAttachmentArrayDynamicIndexing (Error: Value not equal)"); };
-    if (!((a->shaderUniformTexelBufferArrayDynamicIndexing) == (b->shaderUniformTexelBufferArrayDynamicIndexing))) { onFail("a->shaderUniformTexelBufferArrayDynamicIndexing (Error: Value not equal)"); };
-    if (!((a->shaderStorageTexelBufferArrayDynamicIndexing) == (b->shaderStorageTexelBufferArrayDynamicIndexing))) { onFail("a->shaderStorageTexelBufferArrayDynamicIndexing (Error: Value not equal)"); };
-    if (!((a->shaderUniformBufferArrayNonUniformIndexing) == (b->shaderUniformBufferArrayNonUniformIndexing))) { onFail("a->shaderUniformBufferArrayNonUniformIndexing (Error: Value not equal)"); };
-    if (!((a->shaderSampledImageArrayNonUniformIndexing) == (b->shaderSampledImageArrayNonUniformIndexing))) { onFail("a->shaderSampledImageArrayNonUniformIndexing (Error: Value not equal)"); };
-    if (!((a->shaderStorageBufferArrayNonUniformIndexing) == (b->shaderStorageBufferArrayNonUniformIndexing))) { onFail("a->shaderStorageBufferArrayNonUniformIndexing (Error: Value not equal)"); };
-    if (!((a->shaderStorageImageArrayNonUniformIndexing) == (b->shaderStorageImageArrayNonUniformIndexing))) { onFail("a->shaderStorageImageArrayNonUniformIndexing (Error: Value not equal)"); };
-    if (!((a->shaderInputAttachmentArrayNonUniformIndexing) == (b->shaderInputAttachmentArrayNonUniformIndexing))) { onFail("a->shaderInputAttachmentArrayNonUniformIndexing (Error: Value not equal)"); };
-    if (!((a->shaderUniformTexelBufferArrayNonUniformIndexing) == (b->shaderUniformTexelBufferArrayNonUniformIndexing))) { onFail("a->shaderUniformTexelBufferArrayNonUniformIndexing (Error: Value not equal)"); };
-    if (!((a->shaderStorageTexelBufferArrayNonUniformIndexing) == (b->shaderStorageTexelBufferArrayNonUniformIndexing))) { onFail("a->shaderStorageTexelBufferArrayNonUniformIndexing (Error: Value not equal)"); };
-    if (!((a->descriptorBindingUniformBufferUpdateAfterBind) == (b->descriptorBindingUniformBufferUpdateAfterBind))) { onFail("a->descriptorBindingUniformBufferUpdateAfterBind (Error: Value not equal)"); };
-    if (!((a->descriptorBindingSampledImageUpdateAfterBind) == (b->descriptorBindingSampledImageUpdateAfterBind))) { onFail("a->descriptorBindingSampledImageUpdateAfterBind (Error: Value not equal)"); };
-    if (!((a->descriptorBindingStorageImageUpdateAfterBind) == (b->descriptorBindingStorageImageUpdateAfterBind))) { onFail("a->descriptorBindingStorageImageUpdateAfterBind (Error: Value not equal)"); };
-    if (!((a->descriptorBindingStorageBufferUpdateAfterBind) == (b->descriptorBindingStorageBufferUpdateAfterBind))) { onFail("a->descriptorBindingStorageBufferUpdateAfterBind (Error: Value not equal)"); };
-    if (!((a->descriptorBindingUniformTexelBufferUpdateAfterBind) == (b->descriptorBindingUniformTexelBufferUpdateAfterBind))) { onFail("a->descriptorBindingUniformTexelBufferUpdateAfterBind (Error: Value not equal)"); };
-    if (!((a->descriptorBindingStorageTexelBufferUpdateAfterBind) == (b->descriptorBindingStorageTexelBufferUpdateAfterBind))) { onFail("a->descriptorBindingStorageTexelBufferUpdateAfterBind (Error: Value not equal)"); };
-    if (!((a->descriptorBindingUpdateUnusedWhilePending) == (b->descriptorBindingUpdateUnusedWhilePending))) { onFail("a->descriptorBindingUpdateUnusedWhilePending (Error: Value not equal)"); };
-    if (!((a->descriptorBindingPartiallyBound) == (b->descriptorBindingPartiallyBound))) { onFail("a->descriptorBindingPartiallyBound (Error: Value not equal)"); };
-    if (!((a->descriptorBindingVariableDescriptorCount) == (b->descriptorBindingVariableDescriptorCount))) { onFail("a->descriptorBindingVariableDescriptorCount (Error: Value not equal)"); };
-    if (!((a->runtimeDescriptorArray) == (b->runtimeDescriptorArray))) { onFail("a->runtimeDescriptorArray (Error: Value not equal)"); };
-    if (!((a->samplerFilterMinmax) == (b->samplerFilterMinmax))) { onFail("a->samplerFilterMinmax (Error: Value not equal)"); };
-    if (!((a->scalarBlockLayout) == (b->scalarBlockLayout))) { onFail("a->scalarBlockLayout (Error: Value not equal)"); };
-    if (!((a->imagelessFramebuffer) == (b->imagelessFramebuffer))) { onFail("a->imagelessFramebuffer (Error: Value not equal)"); };
-    if (!((a->uniformBufferStandardLayout) == (b->uniformBufferStandardLayout))) { onFail("a->uniformBufferStandardLayout (Error: Value not equal)"); };
-    if (!((a->shaderSubgroupExtendedTypes) == (b->shaderSubgroupExtendedTypes))) { onFail("a->shaderSubgroupExtendedTypes (Error: Value not equal)"); };
-    if (!((a->separateDepthStencilLayouts) == (b->separateDepthStencilLayouts))) { onFail("a->separateDepthStencilLayouts (Error: Value not equal)"); };
-    if (!((a->hostQueryReset) == (b->hostQueryReset))) { onFail("a->hostQueryReset (Error: Value not equal)"); };
-    if (!((a->timelineSemaphore) == (b->timelineSemaphore))) { onFail("a->timelineSemaphore (Error: Value not equal)"); };
-    if (!((a->bufferDeviceAddress) == (b->bufferDeviceAddress))) { onFail("a->bufferDeviceAddress (Error: Value not equal)"); };
-    if (!((a->bufferDeviceAddressCaptureReplay) == (b->bufferDeviceAddressCaptureReplay))) { onFail("a->bufferDeviceAddressCaptureReplay (Error: Value not equal)"); };
-    if (!((a->bufferDeviceAddressMultiDevice) == (b->bufferDeviceAddressMultiDevice))) { onFail("a->bufferDeviceAddressMultiDevice (Error: Value not equal)"); };
-    if (!((a->vulkanMemoryModel) == (b->vulkanMemoryModel))) { onFail("a->vulkanMemoryModel (Error: Value not equal)"); };
-    if (!((a->vulkanMemoryModelDeviceScope) == (b->vulkanMemoryModelDeviceScope))) { onFail("a->vulkanMemoryModelDeviceScope (Error: Value not equal)"); };
-    if (!((a->vulkanMemoryModelAvailabilityVisibilityChains) == (b->vulkanMemoryModelAvailabilityVisibilityChains))) { onFail("a->vulkanMemoryModelAvailabilityVisibilityChains (Error: Value not equal)"); };
-    if (!((a->shaderOutputViewportIndex) == (b->shaderOutputViewportIndex))) { onFail("a->shaderOutputViewportIndex (Error: Value not equal)"); };
-    if (!((a->shaderOutputLayer) == (b->shaderOutputLayer))) { onFail("a->shaderOutputLayer (Error: Value not equal)"); };
-    if (!((a->subgroupBroadcastDynamicId) == (b->subgroupBroadcastDynamicId))) { onFail("a->subgroupBroadcastDynamicId (Error: Value not equal)"); };
+    if (!((a->samplerMirrorClampToEdge) == (b->samplerMirrorClampToEdge))) {
+        onFail("a->samplerMirrorClampToEdge (Error: Value not equal)");
+    };
+    if (!((a->drawIndirectCount) == (b->drawIndirectCount))) {
+        onFail("a->drawIndirectCount (Error: Value not equal)");
+    };
+    if (!((a->storageBuffer8BitAccess) == (b->storageBuffer8BitAccess))) {
+        onFail("a->storageBuffer8BitAccess (Error: Value not equal)");
+    };
+    if (!((a->uniformAndStorageBuffer8BitAccess) == (b->uniformAndStorageBuffer8BitAccess))) {
+        onFail("a->uniformAndStorageBuffer8BitAccess (Error: Value not equal)");
+    };
+    if (!((a->storagePushConstant8) == (b->storagePushConstant8))) {
+        onFail("a->storagePushConstant8 (Error: Value not equal)");
+    };
+    if (!((a->shaderBufferInt64Atomics) == (b->shaderBufferInt64Atomics))) {
+        onFail("a->shaderBufferInt64Atomics (Error: Value not equal)");
+    };
+    if (!((a->shaderSharedInt64Atomics) == (b->shaderSharedInt64Atomics))) {
+        onFail("a->shaderSharedInt64Atomics (Error: Value not equal)");
+    };
+    if (!((a->shaderFloat16) == (b->shaderFloat16))) {
+        onFail("a->shaderFloat16 (Error: Value not equal)");
+    };
+    if (!((a->shaderInt8) == (b->shaderInt8))) {
+        onFail("a->shaderInt8 (Error: Value not equal)");
+    };
+    if (!((a->descriptorIndexing) == (b->descriptorIndexing))) {
+        onFail("a->descriptorIndexing (Error: Value not equal)");
+    };
+    if (!((a->shaderInputAttachmentArrayDynamicIndexing) ==
+          (b->shaderInputAttachmentArrayDynamicIndexing))) {
+        onFail("a->shaderInputAttachmentArrayDynamicIndexing (Error: Value not equal)");
+    };
+    if (!((a->shaderUniformTexelBufferArrayDynamicIndexing) ==
+          (b->shaderUniformTexelBufferArrayDynamicIndexing))) {
+        onFail("a->shaderUniformTexelBufferArrayDynamicIndexing (Error: Value not equal)");
+    };
+    if (!((a->shaderStorageTexelBufferArrayDynamicIndexing) ==
+          (b->shaderStorageTexelBufferArrayDynamicIndexing))) {
+        onFail("a->shaderStorageTexelBufferArrayDynamicIndexing (Error: Value not equal)");
+    };
+    if (!((a->shaderUniformBufferArrayNonUniformIndexing) ==
+          (b->shaderUniformBufferArrayNonUniformIndexing))) {
+        onFail("a->shaderUniformBufferArrayNonUniformIndexing (Error: Value not equal)");
+    };
+    if (!((a->shaderSampledImageArrayNonUniformIndexing) ==
+          (b->shaderSampledImageArrayNonUniformIndexing))) {
+        onFail("a->shaderSampledImageArrayNonUniformIndexing (Error: Value not equal)");
+    };
+    if (!((a->shaderStorageBufferArrayNonUniformIndexing) ==
+          (b->shaderStorageBufferArrayNonUniformIndexing))) {
+        onFail("a->shaderStorageBufferArrayNonUniformIndexing (Error: Value not equal)");
+    };
+    if (!((a->shaderStorageImageArrayNonUniformIndexing) ==
+          (b->shaderStorageImageArrayNonUniformIndexing))) {
+        onFail("a->shaderStorageImageArrayNonUniformIndexing (Error: Value not equal)");
+    };
+    if (!((a->shaderInputAttachmentArrayNonUniformIndexing) ==
+          (b->shaderInputAttachmentArrayNonUniformIndexing))) {
+        onFail("a->shaderInputAttachmentArrayNonUniformIndexing (Error: Value not equal)");
+    };
+    if (!((a->shaderUniformTexelBufferArrayNonUniformIndexing) ==
+          (b->shaderUniformTexelBufferArrayNonUniformIndexing))) {
+        onFail("a->shaderUniformTexelBufferArrayNonUniformIndexing (Error: Value not equal)");
+    };
+    if (!((a->shaderStorageTexelBufferArrayNonUniformIndexing) ==
+          (b->shaderStorageTexelBufferArrayNonUniformIndexing))) {
+        onFail("a->shaderStorageTexelBufferArrayNonUniformIndexing (Error: Value not equal)");
+    };
+    if (!((a->descriptorBindingUniformBufferUpdateAfterBind) ==
+          (b->descriptorBindingUniformBufferUpdateAfterBind))) {
+        onFail("a->descriptorBindingUniformBufferUpdateAfterBind (Error: Value not equal)");
+    };
+    if (!((a->descriptorBindingSampledImageUpdateAfterBind) ==
+          (b->descriptorBindingSampledImageUpdateAfterBind))) {
+        onFail("a->descriptorBindingSampledImageUpdateAfterBind (Error: Value not equal)");
+    };
+    if (!((a->descriptorBindingStorageImageUpdateAfterBind) ==
+          (b->descriptorBindingStorageImageUpdateAfterBind))) {
+        onFail("a->descriptorBindingStorageImageUpdateAfterBind (Error: Value not equal)");
+    };
+    if (!((a->descriptorBindingStorageBufferUpdateAfterBind) ==
+          (b->descriptorBindingStorageBufferUpdateAfterBind))) {
+        onFail("a->descriptorBindingStorageBufferUpdateAfterBind (Error: Value not equal)");
+    };
+    if (!((a->descriptorBindingUniformTexelBufferUpdateAfterBind) ==
+          (b->descriptorBindingUniformTexelBufferUpdateAfterBind))) {
+        onFail("a->descriptorBindingUniformTexelBufferUpdateAfterBind (Error: Value not equal)");
+    };
+    if (!((a->descriptorBindingStorageTexelBufferUpdateAfterBind) ==
+          (b->descriptorBindingStorageTexelBufferUpdateAfterBind))) {
+        onFail("a->descriptorBindingStorageTexelBufferUpdateAfterBind (Error: Value not equal)");
+    };
+    if (!((a->descriptorBindingUpdateUnusedWhilePending) ==
+          (b->descriptorBindingUpdateUnusedWhilePending))) {
+        onFail("a->descriptorBindingUpdateUnusedWhilePending (Error: Value not equal)");
+    };
+    if (!((a->descriptorBindingPartiallyBound) == (b->descriptorBindingPartiallyBound))) {
+        onFail("a->descriptorBindingPartiallyBound (Error: Value not equal)");
+    };
+    if (!((a->descriptorBindingVariableDescriptorCount) ==
+          (b->descriptorBindingVariableDescriptorCount))) {
+        onFail("a->descriptorBindingVariableDescriptorCount (Error: Value not equal)");
+    };
+    if (!((a->runtimeDescriptorArray) == (b->runtimeDescriptorArray))) {
+        onFail("a->runtimeDescriptorArray (Error: Value not equal)");
+    };
+    if (!((a->samplerFilterMinmax) == (b->samplerFilterMinmax))) {
+        onFail("a->samplerFilterMinmax (Error: Value not equal)");
+    };
+    if (!((a->scalarBlockLayout) == (b->scalarBlockLayout))) {
+        onFail("a->scalarBlockLayout (Error: Value not equal)");
+    };
+    if (!((a->imagelessFramebuffer) == (b->imagelessFramebuffer))) {
+        onFail("a->imagelessFramebuffer (Error: Value not equal)");
+    };
+    if (!((a->uniformBufferStandardLayout) == (b->uniformBufferStandardLayout))) {
+        onFail("a->uniformBufferStandardLayout (Error: Value not equal)");
+    };
+    if (!((a->shaderSubgroupExtendedTypes) == (b->shaderSubgroupExtendedTypes))) {
+        onFail("a->shaderSubgroupExtendedTypes (Error: Value not equal)");
+    };
+    if (!((a->separateDepthStencilLayouts) == (b->separateDepthStencilLayouts))) {
+        onFail("a->separateDepthStencilLayouts (Error: Value not equal)");
+    };
+    if (!((a->hostQueryReset) == (b->hostQueryReset))) {
+        onFail("a->hostQueryReset (Error: Value not equal)");
+    };
+    if (!((a->timelineSemaphore) == (b->timelineSemaphore))) {
+        onFail("a->timelineSemaphore (Error: Value not equal)");
+    };
+    if (!((a->bufferDeviceAddress) == (b->bufferDeviceAddress))) {
+        onFail("a->bufferDeviceAddress (Error: Value not equal)");
+    };
+    if (!((a->bufferDeviceAddressCaptureReplay) == (b->bufferDeviceAddressCaptureReplay))) {
+        onFail("a->bufferDeviceAddressCaptureReplay (Error: Value not equal)");
+    };
+    if (!((a->bufferDeviceAddressMultiDevice) == (b->bufferDeviceAddressMultiDevice))) {
+        onFail("a->bufferDeviceAddressMultiDevice (Error: Value not equal)");
+    };
+    if (!((a->vulkanMemoryModel) == (b->vulkanMemoryModel))) {
+        onFail("a->vulkanMemoryModel (Error: Value not equal)");
+    };
+    if (!((a->vulkanMemoryModelDeviceScope) == (b->vulkanMemoryModelDeviceScope))) {
+        onFail("a->vulkanMemoryModelDeviceScope (Error: Value not equal)");
+    };
+    if (!((a->vulkanMemoryModelAvailabilityVisibilityChains) ==
+          (b->vulkanMemoryModelAvailabilityVisibilityChains))) {
+        onFail("a->vulkanMemoryModelAvailabilityVisibilityChains (Error: Value not equal)");
+    };
+    if (!((a->shaderOutputViewportIndex) == (b->shaderOutputViewportIndex))) {
+        onFail("a->shaderOutputViewportIndex (Error: Value not equal)");
+    };
+    if (!((a->shaderOutputLayer) == (b->shaderOutputLayer))) {
+        onFail("a->shaderOutputLayer (Error: Value not equal)");
+    };
+    if (!((a->subgroupBroadcastDynamicId) == (b->subgroupBroadcastDynamicId))) {
+        onFail("a->subgroupBroadcastDynamicId (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkConformanceVersion(
-    const VkConformanceVersion* a,
-    const VkConformanceVersion* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->major) == (b->major))) { onFail("a->major (Error: Value not equal)"); };
-    if (!((a->minor) == (b->minor))) { onFail("a->minor (Error: Value not equal)"); };
-    if (!((a->subminor) == (b->subminor))) { onFail("a->subminor (Error: Value not equal)"); };
-    if (!((a->patch) == (b->patch))) { onFail("a->patch (Error: Value not equal)"); };
+void checkEqual_VkConformanceVersion(const VkConformanceVersion* a, const VkConformanceVersion* b,
+                                     OnFailCompareFunc onFail) {
+    if (!((a->major) == (b->major))) {
+        onFail("a->major (Error: Value not equal)");
+    };
+    if (!((a->minor) == (b->minor))) {
+        onFail("a->minor (Error: Value not equal)");
+    };
+    if (!((a->subminor) == (b->subminor))) {
+        onFail("a->subminor (Error: Value not equal)");
+    };
+    if (!((a->patch) == (b->patch))) {
+        onFail("a->patch (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkPhysicalDeviceVulkan12Properties(
-    const VkPhysicalDeviceVulkan12Properties* a,
-    const VkPhysicalDeviceVulkan12Properties* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPhysicalDeviceVulkan12Properties(const VkPhysicalDeviceVulkan12Properties* a,
+                                                   const VkPhysicalDeviceVulkan12Properties* b,
+                                                   OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->driverID) == (b->driverID))) { onFail("a->driverID (Error: Value not equal)"); };
-    if (!((memcmp(a->driverName, b->driverName, VK_MAX_DRIVER_NAME_SIZE * sizeof(char)) == 0))) { onFail("a->driverName (Error: Unequal static array)"); };
-    if (!((memcmp(a->driverInfo, b->driverInfo, VK_MAX_DRIVER_INFO_SIZE * sizeof(char)) == 0))) { onFail("a->driverInfo (Error: Unequal static array)"); };
+    if (!((a->driverID) == (b->driverID))) {
+        onFail("a->driverID (Error: Value not equal)");
+    };
+    if (!((memcmp(a->driverName, b->driverName, VK_MAX_DRIVER_NAME_SIZE * sizeof(char)) == 0))) {
+        onFail("a->driverName (Error: Unequal static array)");
+    };
+    if (!((memcmp(a->driverInfo, b->driverInfo, VK_MAX_DRIVER_INFO_SIZE * sizeof(char)) == 0))) {
+        onFail("a->driverInfo (Error: Unequal static array)");
+    };
     checkEqual_VkConformanceVersion(&a->conformanceVersion, &b->conformanceVersion, onFail);
-    if (!((a->denormBehaviorIndependence) == (b->denormBehaviorIndependence))) { onFail("a->denormBehaviorIndependence (Error: Value not equal)"); };
-    if (!((a->roundingModeIndependence) == (b->roundingModeIndependence))) { onFail("a->roundingModeIndependence (Error: Value not equal)"); };
-    if (!((a->shaderSignedZeroInfNanPreserveFloat16) == (b->shaderSignedZeroInfNanPreserveFloat16))) { onFail("a->shaderSignedZeroInfNanPreserveFloat16 (Error: Value not equal)"); };
-    if (!((a->shaderSignedZeroInfNanPreserveFloat32) == (b->shaderSignedZeroInfNanPreserveFloat32))) { onFail("a->shaderSignedZeroInfNanPreserveFloat32 (Error: Value not equal)"); };
-    if (!((a->shaderSignedZeroInfNanPreserveFloat64) == (b->shaderSignedZeroInfNanPreserveFloat64))) { onFail("a->shaderSignedZeroInfNanPreserveFloat64 (Error: Value not equal)"); };
-    if (!((a->shaderDenormPreserveFloat16) == (b->shaderDenormPreserveFloat16))) { onFail("a->shaderDenormPreserveFloat16 (Error: Value not equal)"); };
-    if (!((a->shaderDenormPreserveFloat32) == (b->shaderDenormPreserveFloat32))) { onFail("a->shaderDenormPreserveFloat32 (Error: Value not equal)"); };
-    if (!((a->shaderDenormPreserveFloat64) == (b->shaderDenormPreserveFloat64))) { onFail("a->shaderDenormPreserveFloat64 (Error: Value not equal)"); };
-    if (!((a->shaderDenormFlushToZeroFloat16) == (b->shaderDenormFlushToZeroFloat16))) { onFail("a->shaderDenormFlushToZeroFloat16 (Error: Value not equal)"); };
-    if (!((a->shaderDenormFlushToZeroFloat32) == (b->shaderDenormFlushToZeroFloat32))) { onFail("a->shaderDenormFlushToZeroFloat32 (Error: Value not equal)"); };
-    if (!((a->shaderDenormFlushToZeroFloat64) == (b->shaderDenormFlushToZeroFloat64))) { onFail("a->shaderDenormFlushToZeroFloat64 (Error: Value not equal)"); };
-    if (!((a->shaderRoundingModeRTEFloat16) == (b->shaderRoundingModeRTEFloat16))) { onFail("a->shaderRoundingModeRTEFloat16 (Error: Value not equal)"); };
-    if (!((a->shaderRoundingModeRTEFloat32) == (b->shaderRoundingModeRTEFloat32))) { onFail("a->shaderRoundingModeRTEFloat32 (Error: Value not equal)"); };
-    if (!((a->shaderRoundingModeRTEFloat64) == (b->shaderRoundingModeRTEFloat64))) { onFail("a->shaderRoundingModeRTEFloat64 (Error: Value not equal)"); };
-    if (!((a->shaderRoundingModeRTZFloat16) == (b->shaderRoundingModeRTZFloat16))) { onFail("a->shaderRoundingModeRTZFloat16 (Error: Value not equal)"); };
-    if (!((a->shaderRoundingModeRTZFloat32) == (b->shaderRoundingModeRTZFloat32))) { onFail("a->shaderRoundingModeRTZFloat32 (Error: Value not equal)"); };
-    if (!((a->shaderRoundingModeRTZFloat64) == (b->shaderRoundingModeRTZFloat64))) { onFail("a->shaderRoundingModeRTZFloat64 (Error: Value not equal)"); };
-    if (!((a->maxUpdateAfterBindDescriptorsInAllPools) == (b->maxUpdateAfterBindDescriptorsInAllPools))) { onFail("a->maxUpdateAfterBindDescriptorsInAllPools (Error: Value not equal)"); };
-    if (!((a->shaderUniformBufferArrayNonUniformIndexingNative) == (b->shaderUniformBufferArrayNonUniformIndexingNative))) { onFail("a->shaderUniformBufferArrayNonUniformIndexingNative (Error: Value not equal)"); };
-    if (!((a->shaderSampledImageArrayNonUniformIndexingNative) == (b->shaderSampledImageArrayNonUniformIndexingNative))) { onFail("a->shaderSampledImageArrayNonUniformIndexingNative (Error: Value not equal)"); };
-    if (!((a->shaderStorageBufferArrayNonUniformIndexingNative) == (b->shaderStorageBufferArrayNonUniformIndexingNative))) { onFail("a->shaderStorageBufferArrayNonUniformIndexingNative (Error: Value not equal)"); };
-    if (!((a->shaderStorageImageArrayNonUniformIndexingNative) == (b->shaderStorageImageArrayNonUniformIndexingNative))) { onFail("a->shaderStorageImageArrayNonUniformIndexingNative (Error: Value not equal)"); };
-    if (!((a->shaderInputAttachmentArrayNonUniformIndexingNative) == (b->shaderInputAttachmentArrayNonUniformIndexingNative))) { onFail("a->shaderInputAttachmentArrayNonUniformIndexingNative (Error: Value not equal)"); };
-    if (!((a->robustBufferAccessUpdateAfterBind) == (b->robustBufferAccessUpdateAfterBind))) { onFail("a->robustBufferAccessUpdateAfterBind (Error: Value not equal)"); };
-    if (!((a->quadDivergentImplicitLod) == (b->quadDivergentImplicitLod))) { onFail("a->quadDivergentImplicitLod (Error: Value not equal)"); };
-    if (!((a->maxPerStageDescriptorUpdateAfterBindSamplers) == (b->maxPerStageDescriptorUpdateAfterBindSamplers))) { onFail("a->maxPerStageDescriptorUpdateAfterBindSamplers (Error: Value not equal)"); };
-    if (!((a->maxPerStageDescriptorUpdateAfterBindUniformBuffers) == (b->maxPerStageDescriptorUpdateAfterBindUniformBuffers))) { onFail("a->maxPerStageDescriptorUpdateAfterBindUniformBuffers (Error: Value not equal)"); };
-    if (!((a->maxPerStageDescriptorUpdateAfterBindStorageBuffers) == (b->maxPerStageDescriptorUpdateAfterBindStorageBuffers))) { onFail("a->maxPerStageDescriptorUpdateAfterBindStorageBuffers (Error: Value not equal)"); };
-    if (!((a->maxPerStageDescriptorUpdateAfterBindSampledImages) == (b->maxPerStageDescriptorUpdateAfterBindSampledImages))) { onFail("a->maxPerStageDescriptorUpdateAfterBindSampledImages (Error: Value not equal)"); };
-    if (!((a->maxPerStageDescriptorUpdateAfterBindStorageImages) == (b->maxPerStageDescriptorUpdateAfterBindStorageImages))) { onFail("a->maxPerStageDescriptorUpdateAfterBindStorageImages (Error: Value not equal)"); };
-    if (!((a->maxPerStageDescriptorUpdateAfterBindInputAttachments) == (b->maxPerStageDescriptorUpdateAfterBindInputAttachments))) { onFail("a->maxPerStageDescriptorUpdateAfterBindInputAttachments (Error: Value not equal)"); };
-    if (!((a->maxPerStageUpdateAfterBindResources) == (b->maxPerStageUpdateAfterBindResources))) { onFail("a->maxPerStageUpdateAfterBindResources (Error: Value not equal)"); };
-    if (!((a->maxDescriptorSetUpdateAfterBindSamplers) == (b->maxDescriptorSetUpdateAfterBindSamplers))) { onFail("a->maxDescriptorSetUpdateAfterBindSamplers (Error: Value not equal)"); };
-    if (!((a->maxDescriptorSetUpdateAfterBindUniformBuffers) == (b->maxDescriptorSetUpdateAfterBindUniformBuffers))) { onFail("a->maxDescriptorSetUpdateAfterBindUniformBuffers (Error: Value not equal)"); };
-    if (!((a->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic) == (b->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic))) { onFail("a->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic (Error: Value not equal)"); };
-    if (!((a->maxDescriptorSetUpdateAfterBindStorageBuffers) == (b->maxDescriptorSetUpdateAfterBindStorageBuffers))) { onFail("a->maxDescriptorSetUpdateAfterBindStorageBuffers (Error: Value not equal)"); };
-    if (!((a->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic) == (b->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic))) { onFail("a->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic (Error: Value not equal)"); };
-    if (!((a->maxDescriptorSetUpdateAfterBindSampledImages) == (b->maxDescriptorSetUpdateAfterBindSampledImages))) { onFail("a->maxDescriptorSetUpdateAfterBindSampledImages (Error: Value not equal)"); };
-    if (!((a->maxDescriptorSetUpdateAfterBindStorageImages) == (b->maxDescriptorSetUpdateAfterBindStorageImages))) { onFail("a->maxDescriptorSetUpdateAfterBindStorageImages (Error: Value not equal)"); };
-    if (!((a->maxDescriptorSetUpdateAfterBindInputAttachments) == (b->maxDescriptorSetUpdateAfterBindInputAttachments))) { onFail("a->maxDescriptorSetUpdateAfterBindInputAttachments (Error: Value not equal)"); };
-    if (!((a->supportedDepthResolveModes) == (b->supportedDepthResolveModes))) { onFail("a->supportedDepthResolveModes (Error: Value not equal)"); };
-    if (!((a->supportedStencilResolveModes) == (b->supportedStencilResolveModes))) { onFail("a->supportedStencilResolveModes (Error: Value not equal)"); };
-    if (!((a->independentResolveNone) == (b->independentResolveNone))) { onFail("a->independentResolveNone (Error: Value not equal)"); };
-    if (!((a->independentResolve) == (b->independentResolve))) { onFail("a->independentResolve (Error: Value not equal)"); };
-    if (!((a->filterMinmaxSingleComponentFormats) == (b->filterMinmaxSingleComponentFormats))) { onFail("a->filterMinmaxSingleComponentFormats (Error: Value not equal)"); };
-    if (!((a->filterMinmaxImageComponentMapping) == (b->filterMinmaxImageComponentMapping))) { onFail("a->filterMinmaxImageComponentMapping (Error: Value not equal)"); };
-    if (!((a->maxTimelineSemaphoreValueDifference) == (b->maxTimelineSemaphoreValueDifference))) { onFail("a->maxTimelineSemaphoreValueDifference (Error: Value not equal)"); };
-    if (!((a->framebufferIntegerColorSampleCounts) == (b->framebufferIntegerColorSampleCounts))) { onFail("a->framebufferIntegerColorSampleCounts (Error: Value not equal)"); };
+    if (!((a->denormBehaviorIndependence) == (b->denormBehaviorIndependence))) {
+        onFail("a->denormBehaviorIndependence (Error: Value not equal)");
+    };
+    if (!((a->roundingModeIndependence) == (b->roundingModeIndependence))) {
+        onFail("a->roundingModeIndependence (Error: Value not equal)");
+    };
+    if (!((a->shaderSignedZeroInfNanPreserveFloat16) ==
+          (b->shaderSignedZeroInfNanPreserveFloat16))) {
+        onFail("a->shaderSignedZeroInfNanPreserveFloat16 (Error: Value not equal)");
+    };
+    if (!((a->shaderSignedZeroInfNanPreserveFloat32) ==
+          (b->shaderSignedZeroInfNanPreserveFloat32))) {
+        onFail("a->shaderSignedZeroInfNanPreserveFloat32 (Error: Value not equal)");
+    };
+    if (!((a->shaderSignedZeroInfNanPreserveFloat64) ==
+          (b->shaderSignedZeroInfNanPreserveFloat64))) {
+        onFail("a->shaderSignedZeroInfNanPreserveFloat64 (Error: Value not equal)");
+    };
+    if (!((a->shaderDenormPreserveFloat16) == (b->shaderDenormPreserveFloat16))) {
+        onFail("a->shaderDenormPreserveFloat16 (Error: Value not equal)");
+    };
+    if (!((a->shaderDenormPreserveFloat32) == (b->shaderDenormPreserveFloat32))) {
+        onFail("a->shaderDenormPreserveFloat32 (Error: Value not equal)");
+    };
+    if (!((a->shaderDenormPreserveFloat64) == (b->shaderDenormPreserveFloat64))) {
+        onFail("a->shaderDenormPreserveFloat64 (Error: Value not equal)");
+    };
+    if (!((a->shaderDenormFlushToZeroFloat16) == (b->shaderDenormFlushToZeroFloat16))) {
+        onFail("a->shaderDenormFlushToZeroFloat16 (Error: Value not equal)");
+    };
+    if (!((a->shaderDenormFlushToZeroFloat32) == (b->shaderDenormFlushToZeroFloat32))) {
+        onFail("a->shaderDenormFlushToZeroFloat32 (Error: Value not equal)");
+    };
+    if (!((a->shaderDenormFlushToZeroFloat64) == (b->shaderDenormFlushToZeroFloat64))) {
+        onFail("a->shaderDenormFlushToZeroFloat64 (Error: Value not equal)");
+    };
+    if (!((a->shaderRoundingModeRTEFloat16) == (b->shaderRoundingModeRTEFloat16))) {
+        onFail("a->shaderRoundingModeRTEFloat16 (Error: Value not equal)");
+    };
+    if (!((a->shaderRoundingModeRTEFloat32) == (b->shaderRoundingModeRTEFloat32))) {
+        onFail("a->shaderRoundingModeRTEFloat32 (Error: Value not equal)");
+    };
+    if (!((a->shaderRoundingModeRTEFloat64) == (b->shaderRoundingModeRTEFloat64))) {
+        onFail("a->shaderRoundingModeRTEFloat64 (Error: Value not equal)");
+    };
+    if (!((a->shaderRoundingModeRTZFloat16) == (b->shaderRoundingModeRTZFloat16))) {
+        onFail("a->shaderRoundingModeRTZFloat16 (Error: Value not equal)");
+    };
+    if (!((a->shaderRoundingModeRTZFloat32) == (b->shaderRoundingModeRTZFloat32))) {
+        onFail("a->shaderRoundingModeRTZFloat32 (Error: Value not equal)");
+    };
+    if (!((a->shaderRoundingModeRTZFloat64) == (b->shaderRoundingModeRTZFloat64))) {
+        onFail("a->shaderRoundingModeRTZFloat64 (Error: Value not equal)");
+    };
+    if (!((a->maxUpdateAfterBindDescriptorsInAllPools) ==
+          (b->maxUpdateAfterBindDescriptorsInAllPools))) {
+        onFail("a->maxUpdateAfterBindDescriptorsInAllPools (Error: Value not equal)");
+    };
+    if (!((a->shaderUniformBufferArrayNonUniformIndexingNative) ==
+          (b->shaderUniformBufferArrayNonUniformIndexingNative))) {
+        onFail("a->shaderUniformBufferArrayNonUniformIndexingNative (Error: Value not equal)");
+    };
+    if (!((a->shaderSampledImageArrayNonUniformIndexingNative) ==
+          (b->shaderSampledImageArrayNonUniformIndexingNative))) {
+        onFail("a->shaderSampledImageArrayNonUniformIndexingNative (Error: Value not equal)");
+    };
+    if (!((a->shaderStorageBufferArrayNonUniformIndexingNative) ==
+          (b->shaderStorageBufferArrayNonUniformIndexingNative))) {
+        onFail("a->shaderStorageBufferArrayNonUniformIndexingNative (Error: Value not equal)");
+    };
+    if (!((a->shaderStorageImageArrayNonUniformIndexingNative) ==
+          (b->shaderStorageImageArrayNonUniformIndexingNative))) {
+        onFail("a->shaderStorageImageArrayNonUniformIndexingNative (Error: Value not equal)");
+    };
+    if (!((a->shaderInputAttachmentArrayNonUniformIndexingNative) ==
+          (b->shaderInputAttachmentArrayNonUniformIndexingNative))) {
+        onFail("a->shaderInputAttachmentArrayNonUniformIndexingNative (Error: Value not equal)");
+    };
+    if (!((a->robustBufferAccessUpdateAfterBind) == (b->robustBufferAccessUpdateAfterBind))) {
+        onFail("a->robustBufferAccessUpdateAfterBind (Error: Value not equal)");
+    };
+    if (!((a->quadDivergentImplicitLod) == (b->quadDivergentImplicitLod))) {
+        onFail("a->quadDivergentImplicitLod (Error: Value not equal)");
+    };
+    if (!((a->maxPerStageDescriptorUpdateAfterBindSamplers) ==
+          (b->maxPerStageDescriptorUpdateAfterBindSamplers))) {
+        onFail("a->maxPerStageDescriptorUpdateAfterBindSamplers (Error: Value not equal)");
+    };
+    if (!((a->maxPerStageDescriptorUpdateAfterBindUniformBuffers) ==
+          (b->maxPerStageDescriptorUpdateAfterBindUniformBuffers))) {
+        onFail("a->maxPerStageDescriptorUpdateAfterBindUniformBuffers (Error: Value not equal)");
+    };
+    if (!((a->maxPerStageDescriptorUpdateAfterBindStorageBuffers) ==
+          (b->maxPerStageDescriptorUpdateAfterBindStorageBuffers))) {
+        onFail("a->maxPerStageDescriptorUpdateAfterBindStorageBuffers (Error: Value not equal)");
+    };
+    if (!((a->maxPerStageDescriptorUpdateAfterBindSampledImages) ==
+          (b->maxPerStageDescriptorUpdateAfterBindSampledImages))) {
+        onFail("a->maxPerStageDescriptorUpdateAfterBindSampledImages (Error: Value not equal)");
+    };
+    if (!((a->maxPerStageDescriptorUpdateAfterBindStorageImages) ==
+          (b->maxPerStageDescriptorUpdateAfterBindStorageImages))) {
+        onFail("a->maxPerStageDescriptorUpdateAfterBindStorageImages (Error: Value not equal)");
+    };
+    if (!((a->maxPerStageDescriptorUpdateAfterBindInputAttachments) ==
+          (b->maxPerStageDescriptorUpdateAfterBindInputAttachments))) {
+        onFail("a->maxPerStageDescriptorUpdateAfterBindInputAttachments (Error: Value not equal)");
+    };
+    if (!((a->maxPerStageUpdateAfterBindResources) == (b->maxPerStageUpdateAfterBindResources))) {
+        onFail("a->maxPerStageUpdateAfterBindResources (Error: Value not equal)");
+    };
+    if (!((a->maxDescriptorSetUpdateAfterBindSamplers) ==
+          (b->maxDescriptorSetUpdateAfterBindSamplers))) {
+        onFail("a->maxDescriptorSetUpdateAfterBindSamplers (Error: Value not equal)");
+    };
+    if (!((a->maxDescriptorSetUpdateAfterBindUniformBuffers) ==
+          (b->maxDescriptorSetUpdateAfterBindUniformBuffers))) {
+        onFail("a->maxDescriptorSetUpdateAfterBindUniformBuffers (Error: Value not equal)");
+    };
+    if (!((a->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic) ==
+          (b->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic))) {
+        onFail("a->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic (Error: Value not equal)");
+    };
+    if (!((a->maxDescriptorSetUpdateAfterBindStorageBuffers) ==
+          (b->maxDescriptorSetUpdateAfterBindStorageBuffers))) {
+        onFail("a->maxDescriptorSetUpdateAfterBindStorageBuffers (Error: Value not equal)");
+    };
+    if (!((a->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic) ==
+          (b->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic))) {
+        onFail("a->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic (Error: Value not equal)");
+    };
+    if (!((a->maxDescriptorSetUpdateAfterBindSampledImages) ==
+          (b->maxDescriptorSetUpdateAfterBindSampledImages))) {
+        onFail("a->maxDescriptorSetUpdateAfterBindSampledImages (Error: Value not equal)");
+    };
+    if (!((a->maxDescriptorSetUpdateAfterBindStorageImages) ==
+          (b->maxDescriptorSetUpdateAfterBindStorageImages))) {
+        onFail("a->maxDescriptorSetUpdateAfterBindStorageImages (Error: Value not equal)");
+    };
+    if (!((a->maxDescriptorSetUpdateAfterBindInputAttachments) ==
+          (b->maxDescriptorSetUpdateAfterBindInputAttachments))) {
+        onFail("a->maxDescriptorSetUpdateAfterBindInputAttachments (Error: Value not equal)");
+    };
+    if (!((a->supportedDepthResolveModes) == (b->supportedDepthResolveModes))) {
+        onFail("a->supportedDepthResolveModes (Error: Value not equal)");
+    };
+    if (!((a->supportedStencilResolveModes) == (b->supportedStencilResolveModes))) {
+        onFail("a->supportedStencilResolveModes (Error: Value not equal)");
+    };
+    if (!((a->independentResolveNone) == (b->independentResolveNone))) {
+        onFail("a->independentResolveNone (Error: Value not equal)");
+    };
+    if (!((a->independentResolve) == (b->independentResolve))) {
+        onFail("a->independentResolve (Error: Value not equal)");
+    };
+    if (!((a->filterMinmaxSingleComponentFormats) == (b->filterMinmaxSingleComponentFormats))) {
+        onFail("a->filterMinmaxSingleComponentFormats (Error: Value not equal)");
+    };
+    if (!((a->filterMinmaxImageComponentMapping) == (b->filterMinmaxImageComponentMapping))) {
+        onFail("a->filterMinmaxImageComponentMapping (Error: Value not equal)");
+    };
+    if (!((a->maxTimelineSemaphoreValueDifference) == (b->maxTimelineSemaphoreValueDifference))) {
+        onFail("a->maxTimelineSemaphoreValueDifference (Error: Value not equal)");
+    };
+    if (!((a->framebufferIntegerColorSampleCounts) == (b->framebufferIntegerColorSampleCounts))) {
+        onFail("a->framebufferIntegerColorSampleCounts (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkImageFormatListCreateInfo(
-    const VkImageFormatListCreateInfo* a,
-    const VkImageFormatListCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkImageFormatListCreateInfo(const VkImageFormatListCreateInfo* a,
+                                            const VkImageFormatListCreateInfo* b,
+                                            OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->viewFormatCount) == (b->viewFormatCount))) { onFail("a->viewFormatCount (Error: Value not equal)"); };
-    if (!((a->viewFormatCount) == (b->viewFormatCount))) { onFail("a->pViewFormats (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pViewFormats, b->pViewFormats, a->viewFormatCount * sizeof(const VkFormat)) == 0))) { onFail("a->pViewFormats (Error: Unequal dyn array)"); };
+    if (!((a->viewFormatCount) == (b->viewFormatCount))) {
+        onFail("a->viewFormatCount (Error: Value not equal)");
+    };
+    if (!((a->viewFormatCount) == (b->viewFormatCount))) {
+        onFail("a->pViewFormats (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pViewFormats, b->pViewFormats, a->viewFormatCount * sizeof(const VkFormat)) ==
+           0))) {
+        onFail("a->pViewFormats (Error: Unequal dyn array)");
+    };
 }
 
-void checkEqual_VkAttachmentDescription2(
-    const VkAttachmentDescription2* a,
-    const VkAttachmentDescription2* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkAttachmentDescription2(const VkAttachmentDescription2* a,
+                                         const VkAttachmentDescription2* b,
+                                         OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->format) == (b->format))) { onFail("a->format (Error: Value not equal)"); };
-    if (!((a->samples) == (b->samples))) { onFail("a->samples (Error: Value not equal)"); };
-    if (!((a->loadOp) == (b->loadOp))) { onFail("a->loadOp (Error: Value not equal)"); };
-    if (!((a->storeOp) == (b->storeOp))) { onFail("a->storeOp (Error: Value not equal)"); };
-    if (!((a->stencilLoadOp) == (b->stencilLoadOp))) { onFail("a->stencilLoadOp (Error: Value not equal)"); };
-    if (!((a->stencilStoreOp) == (b->stencilStoreOp))) { onFail("a->stencilStoreOp (Error: Value not equal)"); };
-    if (!((a->initialLayout) == (b->initialLayout))) { onFail("a->initialLayout (Error: Value not equal)"); };
-    if (!((a->finalLayout) == (b->finalLayout))) { onFail("a->finalLayout (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->format) == (b->format))) {
+        onFail("a->format (Error: Value not equal)");
+    };
+    if (!((a->samples) == (b->samples))) {
+        onFail("a->samples (Error: Value not equal)");
+    };
+    if (!((a->loadOp) == (b->loadOp))) {
+        onFail("a->loadOp (Error: Value not equal)");
+    };
+    if (!((a->storeOp) == (b->storeOp))) {
+        onFail("a->storeOp (Error: Value not equal)");
+    };
+    if (!((a->stencilLoadOp) == (b->stencilLoadOp))) {
+        onFail("a->stencilLoadOp (Error: Value not equal)");
+    };
+    if (!((a->stencilStoreOp) == (b->stencilStoreOp))) {
+        onFail("a->stencilStoreOp (Error: Value not equal)");
+    };
+    if (!((a->initialLayout) == (b->initialLayout))) {
+        onFail("a->initialLayout (Error: Value not equal)");
+    };
+    if (!((a->finalLayout) == (b->finalLayout))) {
+        onFail("a->finalLayout (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkAttachmentReference2(
-    const VkAttachmentReference2* a,
-    const VkAttachmentReference2* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkAttachmentReference2(const VkAttachmentReference2* a,
+                                       const VkAttachmentReference2* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->attachment) == (b->attachment))) { onFail("a->attachment (Error: Value not equal)"); };
-    if (!((a->layout) == (b->layout))) { onFail("a->layout (Error: Value not equal)"); };
-    if (!((a->aspectMask) == (b->aspectMask))) { onFail("a->aspectMask (Error: Value not equal)"); };
+    if (!((a->attachment) == (b->attachment))) {
+        onFail("a->attachment (Error: Value not equal)");
+    };
+    if (!((a->layout) == (b->layout))) {
+        onFail("a->layout (Error: Value not equal)");
+    };
+    if (!((a->aspectMask) == (b->aspectMask))) {
+        onFail("a->aspectMask (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkSubpassDescription2(
-    const VkSubpassDescription2* a,
-    const VkSubpassDescription2* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkSubpassDescription2(const VkSubpassDescription2* a,
+                                      const VkSubpassDescription2* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->pipelineBindPoint) == (b->pipelineBindPoint))) { onFail("a->pipelineBindPoint (Error: Value not equal)"); };
-    if (!((a->viewMask) == (b->viewMask))) { onFail("a->viewMask (Error: Value not equal)"); };
-    if (!((a->inputAttachmentCount) == (b->inputAttachmentCount))) { onFail("a->inputAttachmentCount (Error: Value not equal)"); };
-    if ((a->pInputAttachments) && (b->pInputAttachments))
-    {
-        if (!((a->inputAttachmentCount) == (b->inputAttachmentCount))) { onFail("a->pInputAttachments (Error: Lengths not equal)"); };
-        if ((a->inputAttachmentCount) == (b->inputAttachmentCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->inputAttachmentCount; ++i)
-                {
-                    checkEqual_VkAttachmentReference2(a->pInputAttachments + i, b->pInputAttachments + i, onFail);
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->pipelineBindPoint) == (b->pipelineBindPoint))) {
+        onFail("a->pipelineBindPoint (Error: Value not equal)");
+    };
+    if (!((a->viewMask) == (b->viewMask))) {
+        onFail("a->viewMask (Error: Value not equal)");
+    };
+    if (!((a->inputAttachmentCount) == (b->inputAttachmentCount))) {
+        onFail("a->inputAttachmentCount (Error: Value not equal)");
+    };
+    if ((a->pInputAttachments) && (b->pInputAttachments)) {
+        if (!((a->inputAttachmentCount) == (b->inputAttachmentCount))) {
+            onFail("a->pInputAttachments (Error: Lengths not equal)");
+        };
+        if ((a->inputAttachmentCount) == (b->inputAttachmentCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->inputAttachmentCount; ++i) {
+                    checkEqual_VkAttachmentReference2(a->pInputAttachments + i,
+                                                      b->pInputAttachments + i, onFail);
                 }
             }
         }
     }
-    if (!((a->colorAttachmentCount) == (b->colorAttachmentCount))) { onFail("a->colorAttachmentCount (Error: Value not equal)"); };
-    if ((a->pColorAttachments) && (b->pColorAttachments))
-    {
-        if (!((a->colorAttachmentCount) == (b->colorAttachmentCount))) { onFail("a->pColorAttachments (Error: Lengths not equal)"); };
-        if ((a->colorAttachmentCount) == (b->colorAttachmentCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->colorAttachmentCount; ++i)
-                {
-                    checkEqual_VkAttachmentReference2(a->pColorAttachments + i, b->pColorAttachments + i, onFail);
+    if (!((a->colorAttachmentCount) == (b->colorAttachmentCount))) {
+        onFail("a->colorAttachmentCount (Error: Value not equal)");
+    };
+    if ((a->pColorAttachments) && (b->pColorAttachments)) {
+        if (!((a->colorAttachmentCount) == (b->colorAttachmentCount))) {
+            onFail("a->pColorAttachments (Error: Lengths not equal)");
+        };
+        if ((a->colorAttachmentCount) == (b->colorAttachmentCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->colorAttachmentCount; ++i) {
+                    checkEqual_VkAttachmentReference2(a->pColorAttachments + i,
+                                                      b->pColorAttachments + i, onFail);
                 }
             }
         }
     }
-    if (!((!(a->pResolveAttachments) && !(b->pResolveAttachments)) || ((a->pResolveAttachments) && (b->pResolveAttachments)))) { onFail("a->pResolveAttachments (Error: Mismatch in optional field)"); };
-    if (a->pResolveAttachments && b->pResolveAttachments)
-    {
-        if ((a->pResolveAttachments) && (b->pResolveAttachments))
-        {
-            if (!((a->colorAttachmentCount) == (b->colorAttachmentCount))) { onFail("a->pResolveAttachments (Error: Lengths not equal)"); };
-            if ((a->colorAttachmentCount) == (b->colorAttachmentCount))
-            {
-                if (a)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)a->colorAttachmentCount; ++i)
-                    {
-                        checkEqual_VkAttachmentReference2(a->pResolveAttachments + i, b->pResolveAttachments + i, onFail);
+    if (!((!(a->pResolveAttachments) && !(b->pResolveAttachments)) ||
+          ((a->pResolveAttachments) && (b->pResolveAttachments)))) {
+        onFail("a->pResolveAttachments (Error: Mismatch in optional field)");
+    };
+    if (a->pResolveAttachments && b->pResolveAttachments) {
+        if ((a->pResolveAttachments) && (b->pResolveAttachments)) {
+            if (!((a->colorAttachmentCount) == (b->colorAttachmentCount))) {
+                onFail("a->pResolveAttachments (Error: Lengths not equal)");
+            };
+            if ((a->colorAttachmentCount) == (b->colorAttachmentCount)) {
+                if (a) {
+                    for (uint32_t i = 0; i < (uint32_t)a->colorAttachmentCount; ++i) {
+                        checkEqual_VkAttachmentReference2(a->pResolveAttachments + i,
+                                                          b->pResolveAttachments + i, onFail);
                     }
                 }
             }
         }
     }
-    if (!((!(a->pDepthStencilAttachment) && !(b->pDepthStencilAttachment)) || ((a->pDepthStencilAttachment) && (b->pDepthStencilAttachment)))) { onFail("a->pDepthStencilAttachment (Error: Mismatch in optional field)"); };
-    if (a->pDepthStencilAttachment && b->pDepthStencilAttachment)
-    {
-        if ((a->pDepthStencilAttachment) && (b->pDepthStencilAttachment))
-        {
-            checkEqual_VkAttachmentReference2(a->pDepthStencilAttachment, b->pDepthStencilAttachment, onFail);
+    if (!((!(a->pDepthStencilAttachment) && !(b->pDepthStencilAttachment)) ||
+          ((a->pDepthStencilAttachment) && (b->pDepthStencilAttachment)))) {
+        onFail("a->pDepthStencilAttachment (Error: Mismatch in optional field)");
+    };
+    if (a->pDepthStencilAttachment && b->pDepthStencilAttachment) {
+        if ((a->pDepthStencilAttachment) && (b->pDepthStencilAttachment)) {
+            checkEqual_VkAttachmentReference2(a->pDepthStencilAttachment,
+                                              b->pDepthStencilAttachment, onFail);
         }
     }
-    if (!((a->preserveAttachmentCount) == (b->preserveAttachmentCount))) { onFail("a->preserveAttachmentCount (Error: Value not equal)"); };
-    if (!((a->preserveAttachmentCount) == (b->preserveAttachmentCount))) { onFail("a->pPreserveAttachments (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pPreserveAttachments, b->pPreserveAttachments, a->preserveAttachmentCount * sizeof(const uint32_t)) == 0))) { onFail("a->pPreserveAttachments (Error: Unequal dyn array)"); };
+    if (!((a->preserveAttachmentCount) == (b->preserveAttachmentCount))) {
+        onFail("a->preserveAttachmentCount (Error: Value not equal)");
+    };
+    if (!((a->preserveAttachmentCount) == (b->preserveAttachmentCount))) {
+        onFail("a->pPreserveAttachments (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pPreserveAttachments, b->pPreserveAttachments,
+                  a->preserveAttachmentCount * sizeof(const uint32_t)) == 0))) {
+        onFail("a->pPreserveAttachments (Error: Unequal dyn array)");
+    };
 }
 
-void checkEqual_VkSubpassDependency2(
-    const VkSubpassDependency2* a,
-    const VkSubpassDependency2* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkSubpassDependency2(const VkSubpassDependency2* a, const VkSubpassDependency2* b,
+                                     OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->srcSubpass) == (b->srcSubpass))) { onFail("a->srcSubpass (Error: Value not equal)"); };
-    if (!((a->dstSubpass) == (b->dstSubpass))) { onFail("a->dstSubpass (Error: Value not equal)"); };
-    if (!((a->srcStageMask) == (b->srcStageMask))) { onFail("a->srcStageMask (Error: Value not equal)"); };
-    if (!((a->dstStageMask) == (b->dstStageMask))) { onFail("a->dstStageMask (Error: Value not equal)"); };
-    if (!((a->srcAccessMask) == (b->srcAccessMask))) { onFail("a->srcAccessMask (Error: Value not equal)"); };
-    if (!((a->dstAccessMask) == (b->dstAccessMask))) { onFail("a->dstAccessMask (Error: Value not equal)"); };
-    if (!((a->dependencyFlags) == (b->dependencyFlags))) { onFail("a->dependencyFlags (Error: Value not equal)"); };
-    if (!((a->viewOffset) == (b->viewOffset))) { onFail("a->viewOffset (Error: Value not equal)"); };
+    if (!((a->srcSubpass) == (b->srcSubpass))) {
+        onFail("a->srcSubpass (Error: Value not equal)");
+    };
+    if (!((a->dstSubpass) == (b->dstSubpass))) {
+        onFail("a->dstSubpass (Error: Value not equal)");
+    };
+    if (!((a->srcStageMask) == (b->srcStageMask))) {
+        onFail("a->srcStageMask (Error: Value not equal)");
+    };
+    if (!((a->dstStageMask) == (b->dstStageMask))) {
+        onFail("a->dstStageMask (Error: Value not equal)");
+    };
+    if (!((a->srcAccessMask) == (b->srcAccessMask))) {
+        onFail("a->srcAccessMask (Error: Value not equal)");
+    };
+    if (!((a->dstAccessMask) == (b->dstAccessMask))) {
+        onFail("a->dstAccessMask (Error: Value not equal)");
+    };
+    if (!((a->dependencyFlags) == (b->dependencyFlags))) {
+        onFail("a->dependencyFlags (Error: Value not equal)");
+    };
+    if (!((a->viewOffset) == (b->viewOffset))) {
+        onFail("a->viewOffset (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkRenderPassCreateInfo2(
-    const VkRenderPassCreateInfo2* a,
-    const VkRenderPassCreateInfo2* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkRenderPassCreateInfo2(const VkRenderPassCreateInfo2* a,
+                                        const VkRenderPassCreateInfo2* b,
+                                        OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->attachmentCount) == (b->attachmentCount))) { onFail("a->attachmentCount (Error: Value not equal)"); };
-    if ((a->pAttachments) && (b->pAttachments))
-    {
-        if (!((a->attachmentCount) == (b->attachmentCount))) { onFail("a->pAttachments (Error: Lengths not equal)"); };
-        if ((a->attachmentCount) == (b->attachmentCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->attachmentCount; ++i)
-                {
-                    checkEqual_VkAttachmentDescription2(a->pAttachments + i, b->pAttachments + i, onFail);
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->attachmentCount) == (b->attachmentCount))) {
+        onFail("a->attachmentCount (Error: Value not equal)");
+    };
+    if ((a->pAttachments) && (b->pAttachments)) {
+        if (!((a->attachmentCount) == (b->attachmentCount))) {
+            onFail("a->pAttachments (Error: Lengths not equal)");
+        };
+        if ((a->attachmentCount) == (b->attachmentCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->attachmentCount; ++i) {
+                    checkEqual_VkAttachmentDescription2(a->pAttachments + i, b->pAttachments + i,
+                                                        onFail);
                 }
             }
         }
     }
-    if (!((a->subpassCount) == (b->subpassCount))) { onFail("a->subpassCount (Error: Value not equal)"); };
-    if ((a->pSubpasses) && (b->pSubpasses))
-    {
-        if (!((a->subpassCount) == (b->subpassCount))) { onFail("a->pSubpasses (Error: Lengths not equal)"); };
-        if ((a->subpassCount) == (b->subpassCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->subpassCount; ++i)
-                {
+    if (!((a->subpassCount) == (b->subpassCount))) {
+        onFail("a->subpassCount (Error: Value not equal)");
+    };
+    if ((a->pSubpasses) && (b->pSubpasses)) {
+        if (!((a->subpassCount) == (b->subpassCount))) {
+            onFail("a->pSubpasses (Error: Lengths not equal)");
+        };
+        if ((a->subpassCount) == (b->subpassCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->subpassCount; ++i) {
                     checkEqual_VkSubpassDescription2(a->pSubpasses + i, b->pSubpasses + i, onFail);
                 }
             }
         }
     }
-    if (!((a->dependencyCount) == (b->dependencyCount))) { onFail("a->dependencyCount (Error: Value not equal)"); };
-    if ((a->pDependencies) && (b->pDependencies))
-    {
-        if (!((a->dependencyCount) == (b->dependencyCount))) { onFail("a->pDependencies (Error: Lengths not equal)"); };
-        if ((a->dependencyCount) == (b->dependencyCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->dependencyCount; ++i)
-                {
-                    checkEqual_VkSubpassDependency2(a->pDependencies + i, b->pDependencies + i, onFail);
+    if (!((a->dependencyCount) == (b->dependencyCount))) {
+        onFail("a->dependencyCount (Error: Value not equal)");
+    };
+    if ((a->pDependencies) && (b->pDependencies)) {
+        if (!((a->dependencyCount) == (b->dependencyCount))) {
+            onFail("a->pDependencies (Error: Lengths not equal)");
+        };
+        if ((a->dependencyCount) == (b->dependencyCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->dependencyCount; ++i) {
+                    checkEqual_VkSubpassDependency2(a->pDependencies + i, b->pDependencies + i,
+                                                    onFail);
                 }
             }
         }
     }
-    if (!((a->correlatedViewMaskCount) == (b->correlatedViewMaskCount))) { onFail("a->correlatedViewMaskCount (Error: Value not equal)"); };
-    if (!((a->correlatedViewMaskCount) == (b->correlatedViewMaskCount))) { onFail("a->pCorrelatedViewMasks (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pCorrelatedViewMasks, b->pCorrelatedViewMasks, a->correlatedViewMaskCount * sizeof(const uint32_t)) == 0))) { onFail("a->pCorrelatedViewMasks (Error: Unequal dyn array)"); };
+    if (!((a->correlatedViewMaskCount) == (b->correlatedViewMaskCount))) {
+        onFail("a->correlatedViewMaskCount (Error: Value not equal)");
+    };
+    if (!((a->correlatedViewMaskCount) == (b->correlatedViewMaskCount))) {
+        onFail("a->pCorrelatedViewMasks (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pCorrelatedViewMasks, b->pCorrelatedViewMasks,
+                  a->correlatedViewMaskCount * sizeof(const uint32_t)) == 0))) {
+        onFail("a->pCorrelatedViewMasks (Error: Unequal dyn array)");
+    };
 }
 
-void checkEqual_VkSubpassBeginInfo(
-    const VkSubpassBeginInfo* a,
-    const VkSubpassBeginInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkSubpassBeginInfo(const VkSubpassBeginInfo* a, const VkSubpassBeginInfo* b,
+                                   OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->contents) == (b->contents))) { onFail("a->contents (Error: Value not equal)"); };
+    if (!((a->contents) == (b->contents))) {
+        onFail("a->contents (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkSubpassEndInfo(
-    const VkSubpassEndInfo* a,
-    const VkSubpassEndInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkSubpassEndInfo(const VkSubpassEndInfo* a, const VkSubpassEndInfo* b,
+                                 OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
 }
 
-void checkEqual_VkPhysicalDevice8BitStorageFeatures(
-    const VkPhysicalDevice8BitStorageFeatures* a,
-    const VkPhysicalDevice8BitStorageFeatures* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPhysicalDevice8BitStorageFeatures(const VkPhysicalDevice8BitStorageFeatures* a,
+                                                    const VkPhysicalDevice8BitStorageFeatures* b,
+                                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->storageBuffer8BitAccess) == (b->storageBuffer8BitAccess))) { onFail("a->storageBuffer8BitAccess (Error: Value not equal)"); };
-    if (!((a->uniformAndStorageBuffer8BitAccess) == (b->uniformAndStorageBuffer8BitAccess))) { onFail("a->uniformAndStorageBuffer8BitAccess (Error: Value not equal)"); };
-    if (!((a->storagePushConstant8) == (b->storagePushConstant8))) { onFail("a->storagePushConstant8 (Error: Value not equal)"); };
+    if (!((a->storageBuffer8BitAccess) == (b->storageBuffer8BitAccess))) {
+        onFail("a->storageBuffer8BitAccess (Error: Value not equal)");
+    };
+    if (!((a->uniformAndStorageBuffer8BitAccess) == (b->uniformAndStorageBuffer8BitAccess))) {
+        onFail("a->uniformAndStorageBuffer8BitAccess (Error: Value not equal)");
+    };
+    if (!((a->storagePushConstant8) == (b->storagePushConstant8))) {
+        onFail("a->storagePushConstant8 (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkPhysicalDeviceDriverProperties(
-    const VkPhysicalDeviceDriverProperties* a,
-    const VkPhysicalDeviceDriverProperties* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPhysicalDeviceDriverProperties(const VkPhysicalDeviceDriverProperties* a,
+                                                 const VkPhysicalDeviceDriverProperties* b,
+                                                 OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->driverID) == (b->driverID))) { onFail("a->driverID (Error: Value not equal)"); };
-    if (!((memcmp(a->driverName, b->driverName, VK_MAX_DRIVER_NAME_SIZE * sizeof(char)) == 0))) { onFail("a->driverName (Error: Unequal static array)"); };
-    if (!((memcmp(a->driverInfo, b->driverInfo, VK_MAX_DRIVER_INFO_SIZE * sizeof(char)) == 0))) { onFail("a->driverInfo (Error: Unequal static array)"); };
+    if (!((a->driverID) == (b->driverID))) {
+        onFail("a->driverID (Error: Value not equal)");
+    };
+    if (!((memcmp(a->driverName, b->driverName, VK_MAX_DRIVER_NAME_SIZE * sizeof(char)) == 0))) {
+        onFail("a->driverName (Error: Unequal static array)");
+    };
+    if (!((memcmp(a->driverInfo, b->driverInfo, VK_MAX_DRIVER_INFO_SIZE * sizeof(char)) == 0))) {
+        onFail("a->driverInfo (Error: Unequal static array)");
+    };
     checkEqual_VkConformanceVersion(&a->conformanceVersion, &b->conformanceVersion, onFail);
 }
 
 void checkEqual_VkPhysicalDeviceShaderAtomicInt64Features(
     const VkPhysicalDeviceShaderAtomicInt64Features* a,
-    const VkPhysicalDeviceShaderAtomicInt64Features* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceShaderAtomicInt64Features* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->shaderBufferInt64Atomics) == (b->shaderBufferInt64Atomics))) { onFail("a->shaderBufferInt64Atomics (Error: Value not equal)"); };
-    if (!((a->shaderSharedInt64Atomics) == (b->shaderSharedInt64Atomics))) { onFail("a->shaderSharedInt64Atomics (Error: Value not equal)"); };
+    if (!((a->shaderBufferInt64Atomics) == (b->shaderBufferInt64Atomics))) {
+        onFail("a->shaderBufferInt64Atomics (Error: Value not equal)");
+    };
+    if (!((a->shaderSharedInt64Atomics) == (b->shaderSharedInt64Atomics))) {
+        onFail("a->shaderSharedInt64Atomics (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceShaderFloat16Int8Features(
     const VkPhysicalDeviceShaderFloat16Int8Features* a,
-    const VkPhysicalDeviceShaderFloat16Int8Features* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceShaderFloat16Int8Features* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->shaderFloat16) == (b->shaderFloat16))) { onFail("a->shaderFloat16 (Error: Value not equal)"); };
-    if (!((a->shaderInt8) == (b->shaderInt8))) { onFail("a->shaderInt8 (Error: Value not equal)"); };
+    if (!((a->shaderFloat16) == (b->shaderFloat16))) {
+        onFail("a->shaderFloat16 (Error: Value not equal)");
+    };
+    if (!((a->shaderInt8) == (b->shaderInt8))) {
+        onFail("a->shaderInt8 (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceFloatControlsProperties(
     const VkPhysicalDeviceFloatControlsProperties* a,
-    const VkPhysicalDeviceFloatControlsProperties* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceFloatControlsProperties* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->denormBehaviorIndependence) == (b->denormBehaviorIndependence))) { onFail("a->denormBehaviorIndependence (Error: Value not equal)"); };
-    if (!((a->roundingModeIndependence) == (b->roundingModeIndependence))) { onFail("a->roundingModeIndependence (Error: Value not equal)"); };
-    if (!((a->shaderSignedZeroInfNanPreserveFloat16) == (b->shaderSignedZeroInfNanPreserveFloat16))) { onFail("a->shaderSignedZeroInfNanPreserveFloat16 (Error: Value not equal)"); };
-    if (!((a->shaderSignedZeroInfNanPreserveFloat32) == (b->shaderSignedZeroInfNanPreserveFloat32))) { onFail("a->shaderSignedZeroInfNanPreserveFloat32 (Error: Value not equal)"); };
-    if (!((a->shaderSignedZeroInfNanPreserveFloat64) == (b->shaderSignedZeroInfNanPreserveFloat64))) { onFail("a->shaderSignedZeroInfNanPreserveFloat64 (Error: Value not equal)"); };
-    if (!((a->shaderDenormPreserveFloat16) == (b->shaderDenormPreserveFloat16))) { onFail("a->shaderDenormPreserveFloat16 (Error: Value not equal)"); };
-    if (!((a->shaderDenormPreserveFloat32) == (b->shaderDenormPreserveFloat32))) { onFail("a->shaderDenormPreserveFloat32 (Error: Value not equal)"); };
-    if (!((a->shaderDenormPreserveFloat64) == (b->shaderDenormPreserveFloat64))) { onFail("a->shaderDenormPreserveFloat64 (Error: Value not equal)"); };
-    if (!((a->shaderDenormFlushToZeroFloat16) == (b->shaderDenormFlushToZeroFloat16))) { onFail("a->shaderDenormFlushToZeroFloat16 (Error: Value not equal)"); };
-    if (!((a->shaderDenormFlushToZeroFloat32) == (b->shaderDenormFlushToZeroFloat32))) { onFail("a->shaderDenormFlushToZeroFloat32 (Error: Value not equal)"); };
-    if (!((a->shaderDenormFlushToZeroFloat64) == (b->shaderDenormFlushToZeroFloat64))) { onFail("a->shaderDenormFlushToZeroFloat64 (Error: Value not equal)"); };
-    if (!((a->shaderRoundingModeRTEFloat16) == (b->shaderRoundingModeRTEFloat16))) { onFail("a->shaderRoundingModeRTEFloat16 (Error: Value not equal)"); };
-    if (!((a->shaderRoundingModeRTEFloat32) == (b->shaderRoundingModeRTEFloat32))) { onFail("a->shaderRoundingModeRTEFloat32 (Error: Value not equal)"); };
-    if (!((a->shaderRoundingModeRTEFloat64) == (b->shaderRoundingModeRTEFloat64))) { onFail("a->shaderRoundingModeRTEFloat64 (Error: Value not equal)"); };
-    if (!((a->shaderRoundingModeRTZFloat16) == (b->shaderRoundingModeRTZFloat16))) { onFail("a->shaderRoundingModeRTZFloat16 (Error: Value not equal)"); };
-    if (!((a->shaderRoundingModeRTZFloat32) == (b->shaderRoundingModeRTZFloat32))) { onFail("a->shaderRoundingModeRTZFloat32 (Error: Value not equal)"); };
-    if (!((a->shaderRoundingModeRTZFloat64) == (b->shaderRoundingModeRTZFloat64))) { onFail("a->shaderRoundingModeRTZFloat64 (Error: Value not equal)"); };
+    if (!((a->denormBehaviorIndependence) == (b->denormBehaviorIndependence))) {
+        onFail("a->denormBehaviorIndependence (Error: Value not equal)");
+    };
+    if (!((a->roundingModeIndependence) == (b->roundingModeIndependence))) {
+        onFail("a->roundingModeIndependence (Error: Value not equal)");
+    };
+    if (!((a->shaderSignedZeroInfNanPreserveFloat16) ==
+          (b->shaderSignedZeroInfNanPreserveFloat16))) {
+        onFail("a->shaderSignedZeroInfNanPreserveFloat16 (Error: Value not equal)");
+    };
+    if (!((a->shaderSignedZeroInfNanPreserveFloat32) ==
+          (b->shaderSignedZeroInfNanPreserveFloat32))) {
+        onFail("a->shaderSignedZeroInfNanPreserveFloat32 (Error: Value not equal)");
+    };
+    if (!((a->shaderSignedZeroInfNanPreserveFloat64) ==
+          (b->shaderSignedZeroInfNanPreserveFloat64))) {
+        onFail("a->shaderSignedZeroInfNanPreserveFloat64 (Error: Value not equal)");
+    };
+    if (!((a->shaderDenormPreserveFloat16) == (b->shaderDenormPreserveFloat16))) {
+        onFail("a->shaderDenormPreserveFloat16 (Error: Value not equal)");
+    };
+    if (!((a->shaderDenormPreserveFloat32) == (b->shaderDenormPreserveFloat32))) {
+        onFail("a->shaderDenormPreserveFloat32 (Error: Value not equal)");
+    };
+    if (!((a->shaderDenormPreserveFloat64) == (b->shaderDenormPreserveFloat64))) {
+        onFail("a->shaderDenormPreserveFloat64 (Error: Value not equal)");
+    };
+    if (!((a->shaderDenormFlushToZeroFloat16) == (b->shaderDenormFlushToZeroFloat16))) {
+        onFail("a->shaderDenormFlushToZeroFloat16 (Error: Value not equal)");
+    };
+    if (!((a->shaderDenormFlushToZeroFloat32) == (b->shaderDenormFlushToZeroFloat32))) {
+        onFail("a->shaderDenormFlushToZeroFloat32 (Error: Value not equal)");
+    };
+    if (!((a->shaderDenormFlushToZeroFloat64) == (b->shaderDenormFlushToZeroFloat64))) {
+        onFail("a->shaderDenormFlushToZeroFloat64 (Error: Value not equal)");
+    };
+    if (!((a->shaderRoundingModeRTEFloat16) == (b->shaderRoundingModeRTEFloat16))) {
+        onFail("a->shaderRoundingModeRTEFloat16 (Error: Value not equal)");
+    };
+    if (!((a->shaderRoundingModeRTEFloat32) == (b->shaderRoundingModeRTEFloat32))) {
+        onFail("a->shaderRoundingModeRTEFloat32 (Error: Value not equal)");
+    };
+    if (!((a->shaderRoundingModeRTEFloat64) == (b->shaderRoundingModeRTEFloat64))) {
+        onFail("a->shaderRoundingModeRTEFloat64 (Error: Value not equal)");
+    };
+    if (!((a->shaderRoundingModeRTZFloat16) == (b->shaderRoundingModeRTZFloat16))) {
+        onFail("a->shaderRoundingModeRTZFloat16 (Error: Value not equal)");
+    };
+    if (!((a->shaderRoundingModeRTZFloat32) == (b->shaderRoundingModeRTZFloat32))) {
+        onFail("a->shaderRoundingModeRTZFloat32 (Error: Value not equal)");
+    };
+    if (!((a->shaderRoundingModeRTZFloat64) == (b->shaderRoundingModeRTZFloat64))) {
+        onFail("a->shaderRoundingModeRTZFloat64 (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkDescriptorSetLayoutBindingFlagsCreateInfo(
     const VkDescriptorSetLayoutBindingFlagsCreateInfo* a,
-    const VkDescriptorSetLayoutBindingFlagsCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkDescriptorSetLayoutBindingFlagsCreateInfo* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->bindingCount) == (b->bindingCount))) { onFail("a->bindingCount (Error: Value not equal)"); };
-    if (!((!(a->pBindingFlags) && !(b->pBindingFlags)) || ((a->pBindingFlags) && (b->pBindingFlags)))) { onFail("a->pBindingFlags (Error: Mismatch in optional field)"); };
-    if (a->pBindingFlags && b->pBindingFlags)
-    {
-        if (!((a->bindingCount) == (b->bindingCount))) { onFail("a->pBindingFlags (Error: Lengths not equal)"); };
-        if (!((memcmp(a->pBindingFlags, b->pBindingFlags, a->bindingCount * sizeof(const VkDescriptorBindingFlags)) == 0))) { onFail("a->pBindingFlags (Error: Unequal dyn array)"); };
+    if (!((a->bindingCount) == (b->bindingCount))) {
+        onFail("a->bindingCount (Error: Value not equal)");
+    };
+    if (!((!(a->pBindingFlags) && !(b->pBindingFlags)) ||
+          ((a->pBindingFlags) && (b->pBindingFlags)))) {
+        onFail("a->pBindingFlags (Error: Mismatch in optional field)");
+    };
+    if (a->pBindingFlags && b->pBindingFlags) {
+        if (!((a->bindingCount) == (b->bindingCount))) {
+            onFail("a->pBindingFlags (Error: Lengths not equal)");
+        };
+        if (!((memcmp(a->pBindingFlags, b->pBindingFlags,
+                      a->bindingCount * sizeof(const VkDescriptorBindingFlags)) == 0))) {
+            onFail("a->pBindingFlags (Error: Unequal dyn array)");
+        };
     }
 }
 
 void checkEqual_VkPhysicalDeviceDescriptorIndexingFeatures(
     const VkPhysicalDeviceDescriptorIndexingFeatures* a,
-    const VkPhysicalDeviceDescriptorIndexingFeatures* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceDescriptorIndexingFeatures* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->shaderInputAttachmentArrayDynamicIndexing) == (b->shaderInputAttachmentArrayDynamicIndexing))) { onFail("a->shaderInputAttachmentArrayDynamicIndexing (Error: Value not equal)"); };
-    if (!((a->shaderUniformTexelBufferArrayDynamicIndexing) == (b->shaderUniformTexelBufferArrayDynamicIndexing))) { onFail("a->shaderUniformTexelBufferArrayDynamicIndexing (Error: Value not equal)"); };
-    if (!((a->shaderStorageTexelBufferArrayDynamicIndexing) == (b->shaderStorageTexelBufferArrayDynamicIndexing))) { onFail("a->shaderStorageTexelBufferArrayDynamicIndexing (Error: Value not equal)"); };
-    if (!((a->shaderUniformBufferArrayNonUniformIndexing) == (b->shaderUniformBufferArrayNonUniformIndexing))) { onFail("a->shaderUniformBufferArrayNonUniformIndexing (Error: Value not equal)"); };
-    if (!((a->shaderSampledImageArrayNonUniformIndexing) == (b->shaderSampledImageArrayNonUniformIndexing))) { onFail("a->shaderSampledImageArrayNonUniformIndexing (Error: Value not equal)"); };
-    if (!((a->shaderStorageBufferArrayNonUniformIndexing) == (b->shaderStorageBufferArrayNonUniformIndexing))) { onFail("a->shaderStorageBufferArrayNonUniformIndexing (Error: Value not equal)"); };
-    if (!((a->shaderStorageImageArrayNonUniformIndexing) == (b->shaderStorageImageArrayNonUniformIndexing))) { onFail("a->shaderStorageImageArrayNonUniformIndexing (Error: Value not equal)"); };
-    if (!((a->shaderInputAttachmentArrayNonUniformIndexing) == (b->shaderInputAttachmentArrayNonUniformIndexing))) { onFail("a->shaderInputAttachmentArrayNonUniformIndexing (Error: Value not equal)"); };
-    if (!((a->shaderUniformTexelBufferArrayNonUniformIndexing) == (b->shaderUniformTexelBufferArrayNonUniformIndexing))) { onFail("a->shaderUniformTexelBufferArrayNonUniformIndexing (Error: Value not equal)"); };
-    if (!((a->shaderStorageTexelBufferArrayNonUniformIndexing) == (b->shaderStorageTexelBufferArrayNonUniformIndexing))) { onFail("a->shaderStorageTexelBufferArrayNonUniformIndexing (Error: Value not equal)"); };
-    if (!((a->descriptorBindingUniformBufferUpdateAfterBind) == (b->descriptorBindingUniformBufferUpdateAfterBind))) { onFail("a->descriptorBindingUniformBufferUpdateAfterBind (Error: Value not equal)"); };
-    if (!((a->descriptorBindingSampledImageUpdateAfterBind) == (b->descriptorBindingSampledImageUpdateAfterBind))) { onFail("a->descriptorBindingSampledImageUpdateAfterBind (Error: Value not equal)"); };
-    if (!((a->descriptorBindingStorageImageUpdateAfterBind) == (b->descriptorBindingStorageImageUpdateAfterBind))) { onFail("a->descriptorBindingStorageImageUpdateAfterBind (Error: Value not equal)"); };
-    if (!((a->descriptorBindingStorageBufferUpdateAfterBind) == (b->descriptorBindingStorageBufferUpdateAfterBind))) { onFail("a->descriptorBindingStorageBufferUpdateAfterBind (Error: Value not equal)"); };
-    if (!((a->descriptorBindingUniformTexelBufferUpdateAfterBind) == (b->descriptorBindingUniformTexelBufferUpdateAfterBind))) { onFail("a->descriptorBindingUniformTexelBufferUpdateAfterBind (Error: Value not equal)"); };
-    if (!((a->descriptorBindingStorageTexelBufferUpdateAfterBind) == (b->descriptorBindingStorageTexelBufferUpdateAfterBind))) { onFail("a->descriptorBindingStorageTexelBufferUpdateAfterBind (Error: Value not equal)"); };
-    if (!((a->descriptorBindingUpdateUnusedWhilePending) == (b->descriptorBindingUpdateUnusedWhilePending))) { onFail("a->descriptorBindingUpdateUnusedWhilePending (Error: Value not equal)"); };
-    if (!((a->descriptorBindingPartiallyBound) == (b->descriptorBindingPartiallyBound))) { onFail("a->descriptorBindingPartiallyBound (Error: Value not equal)"); };
-    if (!((a->descriptorBindingVariableDescriptorCount) == (b->descriptorBindingVariableDescriptorCount))) { onFail("a->descriptorBindingVariableDescriptorCount (Error: Value not equal)"); };
-    if (!((a->runtimeDescriptorArray) == (b->runtimeDescriptorArray))) { onFail("a->runtimeDescriptorArray (Error: Value not equal)"); };
+    if (!((a->shaderInputAttachmentArrayDynamicIndexing) ==
+          (b->shaderInputAttachmentArrayDynamicIndexing))) {
+        onFail("a->shaderInputAttachmentArrayDynamicIndexing (Error: Value not equal)");
+    };
+    if (!((a->shaderUniformTexelBufferArrayDynamicIndexing) ==
+          (b->shaderUniformTexelBufferArrayDynamicIndexing))) {
+        onFail("a->shaderUniformTexelBufferArrayDynamicIndexing (Error: Value not equal)");
+    };
+    if (!((a->shaderStorageTexelBufferArrayDynamicIndexing) ==
+          (b->shaderStorageTexelBufferArrayDynamicIndexing))) {
+        onFail("a->shaderStorageTexelBufferArrayDynamicIndexing (Error: Value not equal)");
+    };
+    if (!((a->shaderUniformBufferArrayNonUniformIndexing) ==
+          (b->shaderUniformBufferArrayNonUniformIndexing))) {
+        onFail("a->shaderUniformBufferArrayNonUniformIndexing (Error: Value not equal)");
+    };
+    if (!((a->shaderSampledImageArrayNonUniformIndexing) ==
+          (b->shaderSampledImageArrayNonUniformIndexing))) {
+        onFail("a->shaderSampledImageArrayNonUniformIndexing (Error: Value not equal)");
+    };
+    if (!((a->shaderStorageBufferArrayNonUniformIndexing) ==
+          (b->shaderStorageBufferArrayNonUniformIndexing))) {
+        onFail("a->shaderStorageBufferArrayNonUniformIndexing (Error: Value not equal)");
+    };
+    if (!((a->shaderStorageImageArrayNonUniformIndexing) ==
+          (b->shaderStorageImageArrayNonUniformIndexing))) {
+        onFail("a->shaderStorageImageArrayNonUniformIndexing (Error: Value not equal)");
+    };
+    if (!((a->shaderInputAttachmentArrayNonUniformIndexing) ==
+          (b->shaderInputAttachmentArrayNonUniformIndexing))) {
+        onFail("a->shaderInputAttachmentArrayNonUniformIndexing (Error: Value not equal)");
+    };
+    if (!((a->shaderUniformTexelBufferArrayNonUniformIndexing) ==
+          (b->shaderUniformTexelBufferArrayNonUniformIndexing))) {
+        onFail("a->shaderUniformTexelBufferArrayNonUniformIndexing (Error: Value not equal)");
+    };
+    if (!((a->shaderStorageTexelBufferArrayNonUniformIndexing) ==
+          (b->shaderStorageTexelBufferArrayNonUniformIndexing))) {
+        onFail("a->shaderStorageTexelBufferArrayNonUniformIndexing (Error: Value not equal)");
+    };
+    if (!((a->descriptorBindingUniformBufferUpdateAfterBind) ==
+          (b->descriptorBindingUniformBufferUpdateAfterBind))) {
+        onFail("a->descriptorBindingUniformBufferUpdateAfterBind (Error: Value not equal)");
+    };
+    if (!((a->descriptorBindingSampledImageUpdateAfterBind) ==
+          (b->descriptorBindingSampledImageUpdateAfterBind))) {
+        onFail("a->descriptorBindingSampledImageUpdateAfterBind (Error: Value not equal)");
+    };
+    if (!((a->descriptorBindingStorageImageUpdateAfterBind) ==
+          (b->descriptorBindingStorageImageUpdateAfterBind))) {
+        onFail("a->descriptorBindingStorageImageUpdateAfterBind (Error: Value not equal)");
+    };
+    if (!((a->descriptorBindingStorageBufferUpdateAfterBind) ==
+          (b->descriptorBindingStorageBufferUpdateAfterBind))) {
+        onFail("a->descriptorBindingStorageBufferUpdateAfterBind (Error: Value not equal)");
+    };
+    if (!((a->descriptorBindingUniformTexelBufferUpdateAfterBind) ==
+          (b->descriptorBindingUniformTexelBufferUpdateAfterBind))) {
+        onFail("a->descriptorBindingUniformTexelBufferUpdateAfterBind (Error: Value not equal)");
+    };
+    if (!((a->descriptorBindingStorageTexelBufferUpdateAfterBind) ==
+          (b->descriptorBindingStorageTexelBufferUpdateAfterBind))) {
+        onFail("a->descriptorBindingStorageTexelBufferUpdateAfterBind (Error: Value not equal)");
+    };
+    if (!((a->descriptorBindingUpdateUnusedWhilePending) ==
+          (b->descriptorBindingUpdateUnusedWhilePending))) {
+        onFail("a->descriptorBindingUpdateUnusedWhilePending (Error: Value not equal)");
+    };
+    if (!((a->descriptorBindingPartiallyBound) == (b->descriptorBindingPartiallyBound))) {
+        onFail("a->descriptorBindingPartiallyBound (Error: Value not equal)");
+    };
+    if (!((a->descriptorBindingVariableDescriptorCount) ==
+          (b->descriptorBindingVariableDescriptorCount))) {
+        onFail("a->descriptorBindingVariableDescriptorCount (Error: Value not equal)");
+    };
+    if (!((a->runtimeDescriptorArray) == (b->runtimeDescriptorArray))) {
+        onFail("a->runtimeDescriptorArray (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceDescriptorIndexingProperties(
     const VkPhysicalDeviceDescriptorIndexingProperties* a,
-    const VkPhysicalDeviceDescriptorIndexingProperties* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceDescriptorIndexingProperties* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->maxUpdateAfterBindDescriptorsInAllPools) == (b->maxUpdateAfterBindDescriptorsInAllPools))) { onFail("a->maxUpdateAfterBindDescriptorsInAllPools (Error: Value not equal)"); };
-    if (!((a->shaderUniformBufferArrayNonUniformIndexingNative) == (b->shaderUniformBufferArrayNonUniformIndexingNative))) { onFail("a->shaderUniformBufferArrayNonUniformIndexingNative (Error: Value not equal)"); };
-    if (!((a->shaderSampledImageArrayNonUniformIndexingNative) == (b->shaderSampledImageArrayNonUniformIndexingNative))) { onFail("a->shaderSampledImageArrayNonUniformIndexingNative (Error: Value not equal)"); };
-    if (!((a->shaderStorageBufferArrayNonUniformIndexingNative) == (b->shaderStorageBufferArrayNonUniformIndexingNative))) { onFail("a->shaderStorageBufferArrayNonUniformIndexingNative (Error: Value not equal)"); };
-    if (!((a->shaderStorageImageArrayNonUniformIndexingNative) == (b->shaderStorageImageArrayNonUniformIndexingNative))) { onFail("a->shaderStorageImageArrayNonUniformIndexingNative (Error: Value not equal)"); };
-    if (!((a->shaderInputAttachmentArrayNonUniformIndexingNative) == (b->shaderInputAttachmentArrayNonUniformIndexingNative))) { onFail("a->shaderInputAttachmentArrayNonUniformIndexingNative (Error: Value not equal)"); };
-    if (!((a->robustBufferAccessUpdateAfterBind) == (b->robustBufferAccessUpdateAfterBind))) { onFail("a->robustBufferAccessUpdateAfterBind (Error: Value not equal)"); };
-    if (!((a->quadDivergentImplicitLod) == (b->quadDivergentImplicitLod))) { onFail("a->quadDivergentImplicitLod (Error: Value not equal)"); };
-    if (!((a->maxPerStageDescriptorUpdateAfterBindSamplers) == (b->maxPerStageDescriptorUpdateAfterBindSamplers))) { onFail("a->maxPerStageDescriptorUpdateAfterBindSamplers (Error: Value not equal)"); };
-    if (!((a->maxPerStageDescriptorUpdateAfterBindUniformBuffers) == (b->maxPerStageDescriptorUpdateAfterBindUniformBuffers))) { onFail("a->maxPerStageDescriptorUpdateAfterBindUniformBuffers (Error: Value not equal)"); };
-    if (!((a->maxPerStageDescriptorUpdateAfterBindStorageBuffers) == (b->maxPerStageDescriptorUpdateAfterBindStorageBuffers))) { onFail("a->maxPerStageDescriptorUpdateAfterBindStorageBuffers (Error: Value not equal)"); };
-    if (!((a->maxPerStageDescriptorUpdateAfterBindSampledImages) == (b->maxPerStageDescriptorUpdateAfterBindSampledImages))) { onFail("a->maxPerStageDescriptorUpdateAfterBindSampledImages (Error: Value not equal)"); };
-    if (!((a->maxPerStageDescriptorUpdateAfterBindStorageImages) == (b->maxPerStageDescriptorUpdateAfterBindStorageImages))) { onFail("a->maxPerStageDescriptorUpdateAfterBindStorageImages (Error: Value not equal)"); };
-    if (!((a->maxPerStageDescriptorUpdateAfterBindInputAttachments) == (b->maxPerStageDescriptorUpdateAfterBindInputAttachments))) { onFail("a->maxPerStageDescriptorUpdateAfterBindInputAttachments (Error: Value not equal)"); };
-    if (!((a->maxPerStageUpdateAfterBindResources) == (b->maxPerStageUpdateAfterBindResources))) { onFail("a->maxPerStageUpdateAfterBindResources (Error: Value not equal)"); };
-    if (!((a->maxDescriptorSetUpdateAfterBindSamplers) == (b->maxDescriptorSetUpdateAfterBindSamplers))) { onFail("a->maxDescriptorSetUpdateAfterBindSamplers (Error: Value not equal)"); };
-    if (!((a->maxDescriptorSetUpdateAfterBindUniformBuffers) == (b->maxDescriptorSetUpdateAfterBindUniformBuffers))) { onFail("a->maxDescriptorSetUpdateAfterBindUniformBuffers (Error: Value not equal)"); };
-    if (!((a->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic) == (b->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic))) { onFail("a->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic (Error: Value not equal)"); };
-    if (!((a->maxDescriptorSetUpdateAfterBindStorageBuffers) == (b->maxDescriptorSetUpdateAfterBindStorageBuffers))) { onFail("a->maxDescriptorSetUpdateAfterBindStorageBuffers (Error: Value not equal)"); };
-    if (!((a->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic) == (b->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic))) { onFail("a->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic (Error: Value not equal)"); };
-    if (!((a->maxDescriptorSetUpdateAfterBindSampledImages) == (b->maxDescriptorSetUpdateAfterBindSampledImages))) { onFail("a->maxDescriptorSetUpdateAfterBindSampledImages (Error: Value not equal)"); };
-    if (!((a->maxDescriptorSetUpdateAfterBindStorageImages) == (b->maxDescriptorSetUpdateAfterBindStorageImages))) { onFail("a->maxDescriptorSetUpdateAfterBindStorageImages (Error: Value not equal)"); };
-    if (!((a->maxDescriptorSetUpdateAfterBindInputAttachments) == (b->maxDescriptorSetUpdateAfterBindInputAttachments))) { onFail("a->maxDescriptorSetUpdateAfterBindInputAttachments (Error: Value not equal)"); };
+    if (!((a->maxUpdateAfterBindDescriptorsInAllPools) ==
+          (b->maxUpdateAfterBindDescriptorsInAllPools))) {
+        onFail("a->maxUpdateAfterBindDescriptorsInAllPools (Error: Value not equal)");
+    };
+    if (!((a->shaderUniformBufferArrayNonUniformIndexingNative) ==
+          (b->shaderUniformBufferArrayNonUniformIndexingNative))) {
+        onFail("a->shaderUniformBufferArrayNonUniformIndexingNative (Error: Value not equal)");
+    };
+    if (!((a->shaderSampledImageArrayNonUniformIndexingNative) ==
+          (b->shaderSampledImageArrayNonUniformIndexingNative))) {
+        onFail("a->shaderSampledImageArrayNonUniformIndexingNative (Error: Value not equal)");
+    };
+    if (!((a->shaderStorageBufferArrayNonUniformIndexingNative) ==
+          (b->shaderStorageBufferArrayNonUniformIndexingNative))) {
+        onFail("a->shaderStorageBufferArrayNonUniformIndexingNative (Error: Value not equal)");
+    };
+    if (!((a->shaderStorageImageArrayNonUniformIndexingNative) ==
+          (b->shaderStorageImageArrayNonUniformIndexingNative))) {
+        onFail("a->shaderStorageImageArrayNonUniformIndexingNative (Error: Value not equal)");
+    };
+    if (!((a->shaderInputAttachmentArrayNonUniformIndexingNative) ==
+          (b->shaderInputAttachmentArrayNonUniformIndexingNative))) {
+        onFail("a->shaderInputAttachmentArrayNonUniformIndexingNative (Error: Value not equal)");
+    };
+    if (!((a->robustBufferAccessUpdateAfterBind) == (b->robustBufferAccessUpdateAfterBind))) {
+        onFail("a->robustBufferAccessUpdateAfterBind (Error: Value not equal)");
+    };
+    if (!((a->quadDivergentImplicitLod) == (b->quadDivergentImplicitLod))) {
+        onFail("a->quadDivergentImplicitLod (Error: Value not equal)");
+    };
+    if (!((a->maxPerStageDescriptorUpdateAfterBindSamplers) ==
+          (b->maxPerStageDescriptorUpdateAfterBindSamplers))) {
+        onFail("a->maxPerStageDescriptorUpdateAfterBindSamplers (Error: Value not equal)");
+    };
+    if (!((a->maxPerStageDescriptorUpdateAfterBindUniformBuffers) ==
+          (b->maxPerStageDescriptorUpdateAfterBindUniformBuffers))) {
+        onFail("a->maxPerStageDescriptorUpdateAfterBindUniformBuffers (Error: Value not equal)");
+    };
+    if (!((a->maxPerStageDescriptorUpdateAfterBindStorageBuffers) ==
+          (b->maxPerStageDescriptorUpdateAfterBindStorageBuffers))) {
+        onFail("a->maxPerStageDescriptorUpdateAfterBindStorageBuffers (Error: Value not equal)");
+    };
+    if (!((a->maxPerStageDescriptorUpdateAfterBindSampledImages) ==
+          (b->maxPerStageDescriptorUpdateAfterBindSampledImages))) {
+        onFail("a->maxPerStageDescriptorUpdateAfterBindSampledImages (Error: Value not equal)");
+    };
+    if (!((a->maxPerStageDescriptorUpdateAfterBindStorageImages) ==
+          (b->maxPerStageDescriptorUpdateAfterBindStorageImages))) {
+        onFail("a->maxPerStageDescriptorUpdateAfterBindStorageImages (Error: Value not equal)");
+    };
+    if (!((a->maxPerStageDescriptorUpdateAfterBindInputAttachments) ==
+          (b->maxPerStageDescriptorUpdateAfterBindInputAttachments))) {
+        onFail("a->maxPerStageDescriptorUpdateAfterBindInputAttachments (Error: Value not equal)");
+    };
+    if (!((a->maxPerStageUpdateAfterBindResources) == (b->maxPerStageUpdateAfterBindResources))) {
+        onFail("a->maxPerStageUpdateAfterBindResources (Error: Value not equal)");
+    };
+    if (!((a->maxDescriptorSetUpdateAfterBindSamplers) ==
+          (b->maxDescriptorSetUpdateAfterBindSamplers))) {
+        onFail("a->maxDescriptorSetUpdateAfterBindSamplers (Error: Value not equal)");
+    };
+    if (!((a->maxDescriptorSetUpdateAfterBindUniformBuffers) ==
+          (b->maxDescriptorSetUpdateAfterBindUniformBuffers))) {
+        onFail("a->maxDescriptorSetUpdateAfterBindUniformBuffers (Error: Value not equal)");
+    };
+    if (!((a->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic) ==
+          (b->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic))) {
+        onFail("a->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic (Error: Value not equal)");
+    };
+    if (!((a->maxDescriptorSetUpdateAfterBindStorageBuffers) ==
+          (b->maxDescriptorSetUpdateAfterBindStorageBuffers))) {
+        onFail("a->maxDescriptorSetUpdateAfterBindStorageBuffers (Error: Value not equal)");
+    };
+    if (!((a->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic) ==
+          (b->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic))) {
+        onFail("a->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic (Error: Value not equal)");
+    };
+    if (!((a->maxDescriptorSetUpdateAfterBindSampledImages) ==
+          (b->maxDescriptorSetUpdateAfterBindSampledImages))) {
+        onFail("a->maxDescriptorSetUpdateAfterBindSampledImages (Error: Value not equal)");
+    };
+    if (!((a->maxDescriptorSetUpdateAfterBindStorageImages) ==
+          (b->maxDescriptorSetUpdateAfterBindStorageImages))) {
+        onFail("a->maxDescriptorSetUpdateAfterBindStorageImages (Error: Value not equal)");
+    };
+    if (!((a->maxDescriptorSetUpdateAfterBindInputAttachments) ==
+          (b->maxDescriptorSetUpdateAfterBindInputAttachments))) {
+        onFail("a->maxDescriptorSetUpdateAfterBindInputAttachments (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkDescriptorSetVariableDescriptorCountAllocateInfo(
     const VkDescriptorSetVariableDescriptorCountAllocateInfo* a,
-    const VkDescriptorSetVariableDescriptorCountAllocateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkDescriptorSetVariableDescriptorCountAllocateInfo* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->descriptorSetCount) == (b->descriptorSetCount))) { onFail("a->descriptorSetCount (Error: Value not equal)"); };
-    if (!((a->descriptorSetCount) == (b->descriptorSetCount))) { onFail("a->pDescriptorCounts (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pDescriptorCounts, b->pDescriptorCounts, a->descriptorSetCount * sizeof(const uint32_t)) == 0))) { onFail("a->pDescriptorCounts (Error: Unequal dyn array)"); };
+    if (!((a->descriptorSetCount) == (b->descriptorSetCount))) {
+        onFail("a->descriptorSetCount (Error: Value not equal)");
+    };
+    if (!((a->descriptorSetCount) == (b->descriptorSetCount))) {
+        onFail("a->pDescriptorCounts (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pDescriptorCounts, b->pDescriptorCounts,
+                  a->descriptorSetCount * sizeof(const uint32_t)) == 0))) {
+        onFail("a->pDescriptorCounts (Error: Unequal dyn array)");
+    };
 }
 
 void checkEqual_VkDescriptorSetVariableDescriptorCountLayoutSupport(
     const VkDescriptorSetVariableDescriptorCountLayoutSupport* a,
-    const VkDescriptorSetVariableDescriptorCountLayoutSupport* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkDescriptorSetVariableDescriptorCountLayoutSupport* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->maxVariableDescriptorCount) == (b->maxVariableDescriptorCount))) { onFail("a->maxVariableDescriptorCount (Error: Value not equal)"); };
+    if (!((a->maxVariableDescriptorCount) == (b->maxVariableDescriptorCount))) {
+        onFail("a->maxVariableDescriptorCount (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkSubpassDescriptionDepthStencilResolve(
     const VkSubpassDescriptionDepthStencilResolve* a,
-    const VkSubpassDescriptionDepthStencilResolve* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkSubpassDescriptionDepthStencilResolve* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->depthResolveMode) == (b->depthResolveMode))) { onFail("a->depthResolveMode (Error: Value not equal)"); };
-    if (!((a->stencilResolveMode) == (b->stencilResolveMode))) { onFail("a->stencilResolveMode (Error: Value not equal)"); };
-    if (!((!(a->pDepthStencilResolveAttachment) && !(b->pDepthStencilResolveAttachment)) || ((a->pDepthStencilResolveAttachment) && (b->pDepthStencilResolveAttachment)))) { onFail("a->pDepthStencilResolveAttachment (Error: Mismatch in optional field)"); };
-    if (a->pDepthStencilResolveAttachment && b->pDepthStencilResolveAttachment)
-    {
-        if ((a->pDepthStencilResolveAttachment) && (b->pDepthStencilResolveAttachment))
-        {
-            checkEqual_VkAttachmentReference2(a->pDepthStencilResolveAttachment, b->pDepthStencilResolveAttachment, onFail);
+    if (!((a->depthResolveMode) == (b->depthResolveMode))) {
+        onFail("a->depthResolveMode (Error: Value not equal)");
+    };
+    if (!((a->stencilResolveMode) == (b->stencilResolveMode))) {
+        onFail("a->stencilResolveMode (Error: Value not equal)");
+    };
+    if (!((!(a->pDepthStencilResolveAttachment) && !(b->pDepthStencilResolveAttachment)) ||
+          ((a->pDepthStencilResolveAttachment) && (b->pDepthStencilResolveAttachment)))) {
+        onFail("a->pDepthStencilResolveAttachment (Error: Mismatch in optional field)");
+    };
+    if (a->pDepthStencilResolveAttachment && b->pDepthStencilResolveAttachment) {
+        if ((a->pDepthStencilResolveAttachment) && (b->pDepthStencilResolveAttachment)) {
+            checkEqual_VkAttachmentReference2(a->pDepthStencilResolveAttachment,
+                                              b->pDepthStencilResolveAttachment, onFail);
         }
     }
 }
 
 void checkEqual_VkPhysicalDeviceDepthStencilResolveProperties(
     const VkPhysicalDeviceDepthStencilResolveProperties* a,
-    const VkPhysicalDeviceDepthStencilResolveProperties* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceDepthStencilResolveProperties* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->supportedDepthResolveModes) == (b->supportedDepthResolveModes))) { onFail("a->supportedDepthResolveModes (Error: Value not equal)"); };
-    if (!((a->supportedStencilResolveModes) == (b->supportedStencilResolveModes))) { onFail("a->supportedStencilResolveModes (Error: Value not equal)"); };
-    if (!((a->independentResolveNone) == (b->independentResolveNone))) { onFail("a->independentResolveNone (Error: Value not equal)"); };
-    if (!((a->independentResolve) == (b->independentResolve))) { onFail("a->independentResolve (Error: Value not equal)"); };
+    if (!((a->supportedDepthResolveModes) == (b->supportedDepthResolveModes))) {
+        onFail("a->supportedDepthResolveModes (Error: Value not equal)");
+    };
+    if (!((a->supportedStencilResolveModes) == (b->supportedStencilResolveModes))) {
+        onFail("a->supportedStencilResolveModes (Error: Value not equal)");
+    };
+    if (!((a->independentResolveNone) == (b->independentResolveNone))) {
+        onFail("a->independentResolveNone (Error: Value not equal)");
+    };
+    if (!((a->independentResolve) == (b->independentResolve))) {
+        onFail("a->independentResolve (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceScalarBlockLayoutFeatures(
     const VkPhysicalDeviceScalarBlockLayoutFeatures* a,
-    const VkPhysicalDeviceScalarBlockLayoutFeatures* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceScalarBlockLayoutFeatures* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->scalarBlockLayout) == (b->scalarBlockLayout))) { onFail("a->scalarBlockLayout (Error: Value not equal)"); };
+    if (!((a->scalarBlockLayout) == (b->scalarBlockLayout))) {
+        onFail("a->scalarBlockLayout (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkImageStencilUsageCreateInfo(
-    const VkImageStencilUsageCreateInfo* a,
-    const VkImageStencilUsageCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkImageStencilUsageCreateInfo(const VkImageStencilUsageCreateInfo* a,
+                                              const VkImageStencilUsageCreateInfo* b,
+                                              OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->stencilUsage) == (b->stencilUsage))) { onFail("a->stencilUsage (Error: Value not equal)"); };
+    if (!((a->stencilUsage) == (b->stencilUsage))) {
+        onFail("a->stencilUsage (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkSamplerReductionModeCreateInfo(
-    const VkSamplerReductionModeCreateInfo* a,
-    const VkSamplerReductionModeCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkSamplerReductionModeCreateInfo(const VkSamplerReductionModeCreateInfo* a,
+                                                 const VkSamplerReductionModeCreateInfo* b,
+                                                 OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->reductionMode) == (b->reductionMode))) { onFail("a->reductionMode (Error: Value not equal)"); };
+    if (!((a->reductionMode) == (b->reductionMode))) {
+        onFail("a->reductionMode (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceSamplerFilterMinmaxProperties(
     const VkPhysicalDeviceSamplerFilterMinmaxProperties* a,
-    const VkPhysicalDeviceSamplerFilterMinmaxProperties* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceSamplerFilterMinmaxProperties* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->filterMinmaxSingleComponentFormats) == (b->filterMinmaxSingleComponentFormats))) { onFail("a->filterMinmaxSingleComponentFormats (Error: Value not equal)"); };
-    if (!((a->filterMinmaxImageComponentMapping) == (b->filterMinmaxImageComponentMapping))) { onFail("a->filterMinmaxImageComponentMapping (Error: Value not equal)"); };
+    if (!((a->filterMinmaxSingleComponentFormats) == (b->filterMinmaxSingleComponentFormats))) {
+        onFail("a->filterMinmaxSingleComponentFormats (Error: Value not equal)");
+    };
+    if (!((a->filterMinmaxImageComponentMapping) == (b->filterMinmaxImageComponentMapping))) {
+        onFail("a->filterMinmaxImageComponentMapping (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceVulkanMemoryModelFeatures(
     const VkPhysicalDeviceVulkanMemoryModelFeatures* a,
-    const VkPhysicalDeviceVulkanMemoryModelFeatures* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceVulkanMemoryModelFeatures* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->vulkanMemoryModel) == (b->vulkanMemoryModel))) { onFail("a->vulkanMemoryModel (Error: Value not equal)"); };
-    if (!((a->vulkanMemoryModelDeviceScope) == (b->vulkanMemoryModelDeviceScope))) { onFail("a->vulkanMemoryModelDeviceScope (Error: Value not equal)"); };
-    if (!((a->vulkanMemoryModelAvailabilityVisibilityChains) == (b->vulkanMemoryModelAvailabilityVisibilityChains))) { onFail("a->vulkanMemoryModelAvailabilityVisibilityChains (Error: Value not equal)"); };
+    if (!((a->vulkanMemoryModel) == (b->vulkanMemoryModel))) {
+        onFail("a->vulkanMemoryModel (Error: Value not equal)");
+    };
+    if (!((a->vulkanMemoryModelDeviceScope) == (b->vulkanMemoryModelDeviceScope))) {
+        onFail("a->vulkanMemoryModelDeviceScope (Error: Value not equal)");
+    };
+    if (!((a->vulkanMemoryModelAvailabilityVisibilityChains) ==
+          (b->vulkanMemoryModelAvailabilityVisibilityChains))) {
+        onFail("a->vulkanMemoryModelAvailabilityVisibilityChains (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceImagelessFramebufferFeatures(
     const VkPhysicalDeviceImagelessFramebufferFeatures* a,
-    const VkPhysicalDeviceImagelessFramebufferFeatures* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceImagelessFramebufferFeatures* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->imagelessFramebuffer) == (b->imagelessFramebuffer))) { onFail("a->imagelessFramebuffer (Error: Value not equal)"); };
+    if (!((a->imagelessFramebuffer) == (b->imagelessFramebuffer))) {
+        onFail("a->imagelessFramebuffer (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkFramebufferAttachmentImageInfo(
-    const VkFramebufferAttachmentImageInfo* a,
-    const VkFramebufferAttachmentImageInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkFramebufferAttachmentImageInfo(const VkFramebufferAttachmentImageInfo* a,
+                                                 const VkFramebufferAttachmentImageInfo* b,
+                                                 OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->usage) == (b->usage))) { onFail("a->usage (Error: Value not equal)"); };
-    if (!((a->width) == (b->width))) { onFail("a->width (Error: Value not equal)"); };
-    if (!((a->height) == (b->height))) { onFail("a->height (Error: Value not equal)"); };
-    if (!((a->layerCount) == (b->layerCount))) { onFail("a->layerCount (Error: Value not equal)"); };
-    if (!((a->viewFormatCount) == (b->viewFormatCount))) { onFail("a->viewFormatCount (Error: Value not equal)"); };
-    if (!((a->viewFormatCount) == (b->viewFormatCount))) { onFail("a->pViewFormats (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pViewFormats, b->pViewFormats, a->viewFormatCount * sizeof(const VkFormat)) == 0))) { onFail("a->pViewFormats (Error: Unequal dyn array)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->usage) == (b->usage))) {
+        onFail("a->usage (Error: Value not equal)");
+    };
+    if (!((a->width) == (b->width))) {
+        onFail("a->width (Error: Value not equal)");
+    };
+    if (!((a->height) == (b->height))) {
+        onFail("a->height (Error: Value not equal)");
+    };
+    if (!((a->layerCount) == (b->layerCount))) {
+        onFail("a->layerCount (Error: Value not equal)");
+    };
+    if (!((a->viewFormatCount) == (b->viewFormatCount))) {
+        onFail("a->viewFormatCount (Error: Value not equal)");
+    };
+    if (!((a->viewFormatCount) == (b->viewFormatCount))) {
+        onFail("a->pViewFormats (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pViewFormats, b->pViewFormats, a->viewFormatCount * sizeof(const VkFormat)) ==
+           0))) {
+        onFail("a->pViewFormats (Error: Unequal dyn array)");
+    };
 }
 
-void checkEqual_VkFramebufferAttachmentsCreateInfo(
-    const VkFramebufferAttachmentsCreateInfo* a,
-    const VkFramebufferAttachmentsCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkFramebufferAttachmentsCreateInfo(const VkFramebufferAttachmentsCreateInfo* a,
+                                                   const VkFramebufferAttachmentsCreateInfo* b,
+                                                   OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->attachmentImageInfoCount) == (b->attachmentImageInfoCount))) { onFail("a->attachmentImageInfoCount (Error: Value not equal)"); };
-    if ((a->pAttachmentImageInfos) && (b->pAttachmentImageInfos))
-    {
-        if (!((a->attachmentImageInfoCount) == (b->attachmentImageInfoCount))) { onFail("a->pAttachmentImageInfos (Error: Lengths not equal)"); };
-        if ((a->attachmentImageInfoCount) == (b->attachmentImageInfoCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->attachmentImageInfoCount; ++i)
-                {
-                    checkEqual_VkFramebufferAttachmentImageInfo(a->pAttachmentImageInfos + i, b->pAttachmentImageInfos + i, onFail);
+    if (!((a->attachmentImageInfoCount) == (b->attachmentImageInfoCount))) {
+        onFail("a->attachmentImageInfoCount (Error: Value not equal)");
+    };
+    if ((a->pAttachmentImageInfos) && (b->pAttachmentImageInfos)) {
+        if (!((a->attachmentImageInfoCount) == (b->attachmentImageInfoCount))) {
+            onFail("a->pAttachmentImageInfos (Error: Lengths not equal)");
+        };
+        if ((a->attachmentImageInfoCount) == (b->attachmentImageInfoCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->attachmentImageInfoCount; ++i) {
+                    checkEqual_VkFramebufferAttachmentImageInfo(
+                        a->pAttachmentImageInfos + i, b->pAttachmentImageInfos + i, onFail);
                 }
             }
         }
     }
 }
 
-void checkEqual_VkRenderPassAttachmentBeginInfo(
-    const VkRenderPassAttachmentBeginInfo* a,
-    const VkRenderPassAttachmentBeginInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkRenderPassAttachmentBeginInfo(const VkRenderPassAttachmentBeginInfo* a,
+                                                const VkRenderPassAttachmentBeginInfo* b,
+                                                OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->attachmentCount) == (b->attachmentCount))) { onFail("a->attachmentCount (Error: Value not equal)"); };
-    if (!((a->attachmentCount) == (b->attachmentCount))) { onFail("a->pAttachments (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pAttachments, b->pAttachments, a->attachmentCount * sizeof(const VkImageView)) == 0))) { onFail("a->pAttachments (Error: Unequal dyn array)"); };
+    if (!((a->attachmentCount) == (b->attachmentCount))) {
+        onFail("a->attachmentCount (Error: Value not equal)");
+    };
+    if (!((a->attachmentCount) == (b->attachmentCount))) {
+        onFail("a->pAttachments (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pAttachments, b->pAttachments,
+                  a->attachmentCount * sizeof(const VkImageView)) == 0))) {
+        onFail("a->pAttachments (Error: Unequal dyn array)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(
     const VkPhysicalDeviceUniformBufferStandardLayoutFeatures* a,
-    const VkPhysicalDeviceUniformBufferStandardLayoutFeatures* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceUniformBufferStandardLayoutFeatures* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->uniformBufferStandardLayout) == (b->uniformBufferStandardLayout))) { onFail("a->uniformBufferStandardLayout (Error: Value not equal)"); };
+    if (!((a->uniformBufferStandardLayout) == (b->uniformBufferStandardLayout))) {
+        onFail("a->uniformBufferStandardLayout (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(
     const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* a,
-    const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->shaderSubgroupExtendedTypes) == (b->shaderSubgroupExtendedTypes))) { onFail("a->shaderSubgroupExtendedTypes (Error: Value not equal)"); };
+    if (!((a->shaderSubgroupExtendedTypes) == (b->shaderSubgroupExtendedTypes))) {
+        onFail("a->shaderSubgroupExtendedTypes (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(
     const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* a,
-    const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->separateDepthStencilLayouts) == (b->separateDepthStencilLayouts))) { onFail("a->separateDepthStencilLayouts (Error: Value not equal)"); };
+    if (!((a->separateDepthStencilLayouts) == (b->separateDepthStencilLayouts))) {
+        onFail("a->separateDepthStencilLayouts (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkAttachmentReferenceStencilLayout(
-    const VkAttachmentReferenceStencilLayout* a,
-    const VkAttachmentReferenceStencilLayout* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkAttachmentReferenceStencilLayout(const VkAttachmentReferenceStencilLayout* a,
+                                                   const VkAttachmentReferenceStencilLayout* b,
+                                                   OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->stencilLayout) == (b->stencilLayout))) { onFail("a->stencilLayout (Error: Value not equal)"); };
+    if (!((a->stencilLayout) == (b->stencilLayout))) {
+        onFail("a->stencilLayout (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkAttachmentDescriptionStencilLayout(
-    const VkAttachmentDescriptionStencilLayout* a,
-    const VkAttachmentDescriptionStencilLayout* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkAttachmentDescriptionStencilLayout(const VkAttachmentDescriptionStencilLayout* a,
+                                                     const VkAttachmentDescriptionStencilLayout* b,
+                                                     OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->stencilInitialLayout) == (b->stencilInitialLayout))) { onFail("a->stencilInitialLayout (Error: Value not equal)"); };
-    if (!((a->stencilFinalLayout) == (b->stencilFinalLayout))) { onFail("a->stencilFinalLayout (Error: Value not equal)"); };
+    if (!((a->stencilInitialLayout) == (b->stencilInitialLayout))) {
+        onFail("a->stencilInitialLayout (Error: Value not equal)");
+    };
+    if (!((a->stencilFinalLayout) == (b->stencilFinalLayout))) {
+        onFail("a->stencilFinalLayout (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceHostQueryResetFeatures(
     const VkPhysicalDeviceHostQueryResetFeatures* a,
-    const VkPhysicalDeviceHostQueryResetFeatures* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceHostQueryResetFeatures* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->hostQueryReset) == (b->hostQueryReset))) { onFail("a->hostQueryReset (Error: Value not equal)"); };
+    if (!((a->hostQueryReset) == (b->hostQueryReset))) {
+        onFail("a->hostQueryReset (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceTimelineSemaphoreFeatures(
     const VkPhysicalDeviceTimelineSemaphoreFeatures* a,
-    const VkPhysicalDeviceTimelineSemaphoreFeatures* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceTimelineSemaphoreFeatures* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->timelineSemaphore) == (b->timelineSemaphore))) { onFail("a->timelineSemaphore (Error: Value not equal)"); };
+    if (!((a->timelineSemaphore) == (b->timelineSemaphore))) {
+        onFail("a->timelineSemaphore (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceTimelineSemaphoreProperties(
     const VkPhysicalDeviceTimelineSemaphoreProperties* a,
-    const VkPhysicalDeviceTimelineSemaphoreProperties* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceTimelineSemaphoreProperties* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->maxTimelineSemaphoreValueDifference) == (b->maxTimelineSemaphoreValueDifference))) { onFail("a->maxTimelineSemaphoreValueDifference (Error: Value not equal)"); };
+    if (!((a->maxTimelineSemaphoreValueDifference) == (b->maxTimelineSemaphoreValueDifference))) {
+        onFail("a->maxTimelineSemaphoreValueDifference (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkSemaphoreTypeCreateInfo(
-    const VkSemaphoreTypeCreateInfo* a,
-    const VkSemaphoreTypeCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkSemaphoreTypeCreateInfo(const VkSemaphoreTypeCreateInfo* a,
+                                          const VkSemaphoreTypeCreateInfo* b,
+                                          OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->semaphoreType) == (b->semaphoreType))) { onFail("a->semaphoreType (Error: Value not equal)"); };
-    if (!((a->initialValue) == (b->initialValue))) { onFail("a->initialValue (Error: Value not equal)"); };
+    if (!((a->semaphoreType) == (b->semaphoreType))) {
+        onFail("a->semaphoreType (Error: Value not equal)");
+    };
+    if (!((a->initialValue) == (b->initialValue))) {
+        onFail("a->initialValue (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkTimelineSemaphoreSubmitInfo(
-    const VkTimelineSemaphoreSubmitInfo* a,
-    const VkTimelineSemaphoreSubmitInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkTimelineSemaphoreSubmitInfo(const VkTimelineSemaphoreSubmitInfo* a,
+                                              const VkTimelineSemaphoreSubmitInfo* b,
+                                              OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->waitSemaphoreValueCount) == (b->waitSemaphoreValueCount))) { onFail("a->waitSemaphoreValueCount (Error: Value not equal)"); };
-    if (!((!(a->pWaitSemaphoreValues) && !(b->pWaitSemaphoreValues)) || ((a->pWaitSemaphoreValues) && (b->pWaitSemaphoreValues)))) { onFail("a->pWaitSemaphoreValues (Error: Mismatch in optional field)"); };
-    if (a->pWaitSemaphoreValues && b->pWaitSemaphoreValues)
-    {
-        if (!((a->waitSemaphoreValueCount) == (b->waitSemaphoreValueCount))) { onFail("a->pWaitSemaphoreValues (Error: Lengths not equal)"); };
-        if (!((memcmp(a->pWaitSemaphoreValues, b->pWaitSemaphoreValues, a->waitSemaphoreValueCount * sizeof(const uint64_t)) == 0))) { onFail("a->pWaitSemaphoreValues (Error: Unequal dyn array)"); };
+    if (!((a->waitSemaphoreValueCount) == (b->waitSemaphoreValueCount))) {
+        onFail("a->waitSemaphoreValueCount (Error: Value not equal)");
+    };
+    if (!((!(a->pWaitSemaphoreValues) && !(b->pWaitSemaphoreValues)) ||
+          ((a->pWaitSemaphoreValues) && (b->pWaitSemaphoreValues)))) {
+        onFail("a->pWaitSemaphoreValues (Error: Mismatch in optional field)");
+    };
+    if (a->pWaitSemaphoreValues && b->pWaitSemaphoreValues) {
+        if (!((a->waitSemaphoreValueCount) == (b->waitSemaphoreValueCount))) {
+            onFail("a->pWaitSemaphoreValues (Error: Lengths not equal)");
+        };
+        if (!((memcmp(a->pWaitSemaphoreValues, b->pWaitSemaphoreValues,
+                      a->waitSemaphoreValueCount * sizeof(const uint64_t)) == 0))) {
+            onFail("a->pWaitSemaphoreValues (Error: Unequal dyn array)");
+        };
     }
-    if (!((a->signalSemaphoreValueCount) == (b->signalSemaphoreValueCount))) { onFail("a->signalSemaphoreValueCount (Error: Value not equal)"); };
-    if (!((!(a->pSignalSemaphoreValues) && !(b->pSignalSemaphoreValues)) || ((a->pSignalSemaphoreValues) && (b->pSignalSemaphoreValues)))) { onFail("a->pSignalSemaphoreValues (Error: Mismatch in optional field)"); };
-    if (a->pSignalSemaphoreValues && b->pSignalSemaphoreValues)
-    {
-        if (!((a->signalSemaphoreValueCount) == (b->signalSemaphoreValueCount))) { onFail("a->pSignalSemaphoreValues (Error: Lengths not equal)"); };
-        if (!((memcmp(a->pSignalSemaphoreValues, b->pSignalSemaphoreValues, a->signalSemaphoreValueCount * sizeof(const uint64_t)) == 0))) { onFail("a->pSignalSemaphoreValues (Error: Unequal dyn array)"); };
+    if (!((a->signalSemaphoreValueCount) == (b->signalSemaphoreValueCount))) {
+        onFail("a->signalSemaphoreValueCount (Error: Value not equal)");
+    };
+    if (!((!(a->pSignalSemaphoreValues) && !(b->pSignalSemaphoreValues)) ||
+          ((a->pSignalSemaphoreValues) && (b->pSignalSemaphoreValues)))) {
+        onFail("a->pSignalSemaphoreValues (Error: Mismatch in optional field)");
+    };
+    if (a->pSignalSemaphoreValues && b->pSignalSemaphoreValues) {
+        if (!((a->signalSemaphoreValueCount) == (b->signalSemaphoreValueCount))) {
+            onFail("a->pSignalSemaphoreValues (Error: Lengths not equal)");
+        };
+        if (!((memcmp(a->pSignalSemaphoreValues, b->pSignalSemaphoreValues,
+                      a->signalSemaphoreValueCount * sizeof(const uint64_t)) == 0))) {
+            onFail("a->pSignalSemaphoreValues (Error: Unequal dyn array)");
+        };
     }
 }
 
-void checkEqual_VkSemaphoreWaitInfo(
-    const VkSemaphoreWaitInfo* a,
-    const VkSemaphoreWaitInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkSemaphoreWaitInfo(const VkSemaphoreWaitInfo* a, const VkSemaphoreWaitInfo* b,
+                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->semaphoreCount) == (b->semaphoreCount))) { onFail("a->semaphoreCount (Error: Value not equal)"); };
-    if (!((a->semaphoreCount) == (b->semaphoreCount))) { onFail("a->pSemaphores (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pSemaphores, b->pSemaphores, a->semaphoreCount * sizeof(const VkSemaphore)) == 0))) { onFail("a->pSemaphores (Error: Unequal dyn array)"); };
-    if (!((a->semaphoreCount) == (b->semaphoreCount))) { onFail("a->pValues (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pValues, b->pValues, a->semaphoreCount * sizeof(const uint64_t)) == 0))) { onFail("a->pValues (Error: Unequal dyn array)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->semaphoreCount) == (b->semaphoreCount))) {
+        onFail("a->semaphoreCount (Error: Value not equal)");
+    };
+    if (!((a->semaphoreCount) == (b->semaphoreCount))) {
+        onFail("a->pSemaphores (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pSemaphores, b->pSemaphores, a->semaphoreCount * sizeof(const VkSemaphore)) ==
+           0))) {
+        onFail("a->pSemaphores (Error: Unequal dyn array)");
+    };
+    if (!((a->semaphoreCount) == (b->semaphoreCount))) {
+        onFail("a->pValues (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pValues, b->pValues, a->semaphoreCount * sizeof(const uint64_t)) == 0))) {
+        onFail("a->pValues (Error: Unequal dyn array)");
+    };
 }
 
-void checkEqual_VkSemaphoreSignalInfo(
-    const VkSemaphoreSignalInfo* a,
-    const VkSemaphoreSignalInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkSemaphoreSignalInfo(const VkSemaphoreSignalInfo* a,
+                                      const VkSemaphoreSignalInfo* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->semaphore) == (b->semaphore))) { onFail("a->semaphore (Error: Value not equal)"); };
-    if (!((a->value) == (b->value))) { onFail("a->value (Error: Value not equal)"); };
+    if (!((a->semaphore) == (b->semaphore))) {
+        onFail("a->semaphore (Error: Value not equal)");
+    };
+    if (!((a->value) == (b->value))) {
+        onFail("a->value (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceBufferDeviceAddressFeatures(
     const VkPhysicalDeviceBufferDeviceAddressFeatures* a,
-    const VkPhysicalDeviceBufferDeviceAddressFeatures* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceBufferDeviceAddressFeatures* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->bufferDeviceAddress) == (b->bufferDeviceAddress))) { onFail("a->bufferDeviceAddress (Error: Value not equal)"); };
-    if (!((a->bufferDeviceAddressCaptureReplay) == (b->bufferDeviceAddressCaptureReplay))) { onFail("a->bufferDeviceAddressCaptureReplay (Error: Value not equal)"); };
-    if (!((a->bufferDeviceAddressMultiDevice) == (b->bufferDeviceAddressMultiDevice))) { onFail("a->bufferDeviceAddressMultiDevice (Error: Value not equal)"); };
+    if (!((a->bufferDeviceAddress) == (b->bufferDeviceAddress))) {
+        onFail("a->bufferDeviceAddress (Error: Value not equal)");
+    };
+    if (!((a->bufferDeviceAddressCaptureReplay) == (b->bufferDeviceAddressCaptureReplay))) {
+        onFail("a->bufferDeviceAddressCaptureReplay (Error: Value not equal)");
+    };
+    if (!((a->bufferDeviceAddressMultiDevice) == (b->bufferDeviceAddressMultiDevice))) {
+        onFail("a->bufferDeviceAddressMultiDevice (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkBufferDeviceAddressInfo(
-    const VkBufferDeviceAddressInfo* a,
-    const VkBufferDeviceAddressInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkBufferDeviceAddressInfo(const VkBufferDeviceAddressInfo* a,
+                                          const VkBufferDeviceAddressInfo* b,
+                                          OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->buffer) == (b->buffer))) { onFail("a->buffer (Error: Value not equal)"); };
+    if (!((a->buffer) == (b->buffer))) {
+        onFail("a->buffer (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkBufferOpaqueCaptureAddressCreateInfo(
     const VkBufferOpaqueCaptureAddressCreateInfo* a,
-    const VkBufferOpaqueCaptureAddressCreateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkBufferOpaqueCaptureAddressCreateInfo* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->opaqueCaptureAddress) == (b->opaqueCaptureAddress))) { onFail("a->opaqueCaptureAddress (Error: Value not equal)"); };
+    if (!((a->opaqueCaptureAddress) == (b->opaqueCaptureAddress))) {
+        onFail("a->opaqueCaptureAddress (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkMemoryOpaqueCaptureAddressAllocateInfo(
     const VkMemoryOpaqueCaptureAddressAllocateInfo* a,
-    const VkMemoryOpaqueCaptureAddressAllocateInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkMemoryOpaqueCaptureAddressAllocateInfo* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->opaqueCaptureAddress) == (b->opaqueCaptureAddress))) { onFail("a->opaqueCaptureAddress (Error: Value not equal)"); };
+    if (!((a->opaqueCaptureAddress) == (b->opaqueCaptureAddress))) {
+        onFail("a->opaqueCaptureAddress (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkDeviceMemoryOpaqueCaptureAddressInfo(
     const VkDeviceMemoryOpaqueCaptureAddressInfo* a,
-    const VkDeviceMemoryOpaqueCaptureAddressInfo* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkDeviceMemoryOpaqueCaptureAddressInfo* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->memory) == (b->memory))) { onFail("a->memory (Error: Value not equal)"); };
+    if (!((a->memory) == (b->memory))) {
+        onFail("a->memory (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_KHR_surface
-void checkEqual_VkSurfaceCapabilitiesKHR(
-    const VkSurfaceCapabilitiesKHR* a,
-    const VkSurfaceCapabilitiesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->minImageCount) == (b->minImageCount))) { onFail("a->minImageCount (Error: Value not equal)"); };
-    if (!((a->maxImageCount) == (b->maxImageCount))) { onFail("a->maxImageCount (Error: Value not equal)"); };
+void checkEqual_VkSurfaceCapabilitiesKHR(const VkSurfaceCapabilitiesKHR* a,
+                                         const VkSurfaceCapabilitiesKHR* b,
+                                         OnFailCompareFunc onFail) {
+    if (!((a->minImageCount) == (b->minImageCount))) {
+        onFail("a->minImageCount (Error: Value not equal)");
+    };
+    if (!((a->maxImageCount) == (b->maxImageCount))) {
+        onFail("a->maxImageCount (Error: Value not equal)");
+    };
     checkEqual_VkExtent2D(&a->currentExtent, &b->currentExtent, onFail);
     checkEqual_VkExtent2D(&a->minImageExtent, &b->minImageExtent, onFail);
     checkEqual_VkExtent2D(&a->maxImageExtent, &b->maxImageExtent, onFail);
-    if (!((a->maxImageArrayLayers) == (b->maxImageArrayLayers))) { onFail("a->maxImageArrayLayers (Error: Value not equal)"); };
-    if (!((a->supportedTransforms) == (b->supportedTransforms))) { onFail("a->supportedTransforms (Error: Value not equal)"); };
-    if (!((a->currentTransform) == (b->currentTransform))) { onFail("a->currentTransform (Error: Value not equal)"); };
-    if (!((a->supportedCompositeAlpha) == (b->supportedCompositeAlpha))) { onFail("a->supportedCompositeAlpha (Error: Value not equal)"); };
-    if (!((a->supportedUsageFlags) == (b->supportedUsageFlags))) { onFail("a->supportedUsageFlags (Error: Value not equal)"); };
+    if (!((a->maxImageArrayLayers) == (b->maxImageArrayLayers))) {
+        onFail("a->maxImageArrayLayers (Error: Value not equal)");
+    };
+    if (!((a->supportedTransforms) == (b->supportedTransforms))) {
+        onFail("a->supportedTransforms (Error: Value not equal)");
+    };
+    if (!((a->currentTransform) == (b->currentTransform))) {
+        onFail("a->currentTransform (Error: Value not equal)");
+    };
+    if (!((a->supportedCompositeAlpha) == (b->supportedCompositeAlpha))) {
+        onFail("a->supportedCompositeAlpha (Error: Value not equal)");
+    };
+    if (!((a->supportedUsageFlags) == (b->supportedUsageFlags))) {
+        onFail("a->supportedUsageFlags (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkSurfaceFormatKHR(
-    const VkSurfaceFormatKHR* a,
-    const VkSurfaceFormatKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->format) == (b->format))) { onFail("a->format (Error: Value not equal)"); };
-    if (!((a->colorSpace) == (b->colorSpace))) { onFail("a->colorSpace (Error: Value not equal)"); };
+void checkEqual_VkSurfaceFormatKHR(const VkSurfaceFormatKHR* a, const VkSurfaceFormatKHR* b,
+                                   OnFailCompareFunc onFail) {
+    if (!((a->format) == (b->format))) {
+        onFail("a->format (Error: Value not equal)");
+    };
+    if (!((a->colorSpace) == (b->colorSpace))) {
+        onFail("a->colorSpace (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_KHR_swapchain
-void checkEqual_VkSwapchainCreateInfoKHR(
-    const VkSwapchainCreateInfoKHR* a,
-    const VkSwapchainCreateInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkSwapchainCreateInfoKHR(const VkSwapchainCreateInfoKHR* a,
+                                         const VkSwapchainCreateInfoKHR* b,
+                                         OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->surface) == (b->surface))) { onFail("a->surface (Error: Value not equal)"); };
-    if (!((a->minImageCount) == (b->minImageCount))) { onFail("a->minImageCount (Error: Value not equal)"); };
-    if (!((a->imageFormat) == (b->imageFormat))) { onFail("a->imageFormat (Error: Value not equal)"); };
-    if (!((a->imageColorSpace) == (b->imageColorSpace))) { onFail("a->imageColorSpace (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->surface) == (b->surface))) {
+        onFail("a->surface (Error: Value not equal)");
+    };
+    if (!((a->minImageCount) == (b->minImageCount))) {
+        onFail("a->minImageCount (Error: Value not equal)");
+    };
+    if (!((a->imageFormat) == (b->imageFormat))) {
+        onFail("a->imageFormat (Error: Value not equal)");
+    };
+    if (!((a->imageColorSpace) == (b->imageColorSpace))) {
+        onFail("a->imageColorSpace (Error: Value not equal)");
+    };
     checkEqual_VkExtent2D(&a->imageExtent, &b->imageExtent, onFail);
-    if (!((a->imageArrayLayers) == (b->imageArrayLayers))) { onFail("a->imageArrayLayers (Error: Value not equal)"); };
-    if (!((a->imageUsage) == (b->imageUsage))) { onFail("a->imageUsage (Error: Value not equal)"); };
-    if (!((a->imageSharingMode) == (b->imageSharingMode))) { onFail("a->imageSharingMode (Error: Value not equal)"); };
-    if (!((a->queueFamilyIndexCount) == (b->queueFamilyIndexCount))) { onFail("a->queueFamilyIndexCount (Error: Value not equal)"); };
-    if (!((!(a->pQueueFamilyIndices) && !(b->pQueueFamilyIndices)) || ((a->pQueueFamilyIndices) && (b->pQueueFamilyIndices)))) { onFail("a->pQueueFamilyIndices (Error: Mismatch in optional field)"); };
-    if (a->pQueueFamilyIndices && b->pQueueFamilyIndices)
-    {
-        if (!((a->queueFamilyIndexCount) == (b->queueFamilyIndexCount))) { onFail("a->pQueueFamilyIndices (Error: Lengths not equal)"); };
-        if (!((memcmp(a->pQueueFamilyIndices, b->pQueueFamilyIndices, a->queueFamilyIndexCount * sizeof(const uint32_t)) == 0))) { onFail("a->pQueueFamilyIndices (Error: Unequal dyn array)"); };
+    if (!((a->imageArrayLayers) == (b->imageArrayLayers))) {
+        onFail("a->imageArrayLayers (Error: Value not equal)");
+    };
+    if (!((a->imageUsage) == (b->imageUsage))) {
+        onFail("a->imageUsage (Error: Value not equal)");
+    };
+    if (!((a->imageSharingMode) == (b->imageSharingMode))) {
+        onFail("a->imageSharingMode (Error: Value not equal)");
+    };
+    if (!((a->queueFamilyIndexCount) == (b->queueFamilyIndexCount))) {
+        onFail("a->queueFamilyIndexCount (Error: Value not equal)");
+    };
+    if (!((!(a->pQueueFamilyIndices) && !(b->pQueueFamilyIndices)) ||
+          ((a->pQueueFamilyIndices) && (b->pQueueFamilyIndices)))) {
+        onFail("a->pQueueFamilyIndices (Error: Mismatch in optional field)");
+    };
+    if (a->pQueueFamilyIndices && b->pQueueFamilyIndices) {
+        if (!((a->queueFamilyIndexCount) == (b->queueFamilyIndexCount))) {
+            onFail("a->pQueueFamilyIndices (Error: Lengths not equal)");
+        };
+        if (!((memcmp(a->pQueueFamilyIndices, b->pQueueFamilyIndices,
+                      a->queueFamilyIndexCount * sizeof(const uint32_t)) == 0))) {
+            onFail("a->pQueueFamilyIndices (Error: Unequal dyn array)");
+        };
     }
-    if (!((a->preTransform) == (b->preTransform))) { onFail("a->preTransform (Error: Value not equal)"); };
-    if (!((a->compositeAlpha) == (b->compositeAlpha))) { onFail("a->compositeAlpha (Error: Value not equal)"); };
-    if (!((a->presentMode) == (b->presentMode))) { onFail("a->presentMode (Error: Value not equal)"); };
-    if (!((a->clipped) == (b->clipped))) { onFail("a->clipped (Error: Value not equal)"); };
-    if (!((a->oldSwapchain) == (b->oldSwapchain))) { onFail("a->oldSwapchain (Error: Value not equal)"); };
+    if (!((a->preTransform) == (b->preTransform))) {
+        onFail("a->preTransform (Error: Value not equal)");
+    };
+    if (!((a->compositeAlpha) == (b->compositeAlpha))) {
+        onFail("a->compositeAlpha (Error: Value not equal)");
+    };
+    if (!((a->presentMode) == (b->presentMode))) {
+        onFail("a->presentMode (Error: Value not equal)");
+    };
+    if (!((a->clipped) == (b->clipped))) {
+        onFail("a->clipped (Error: Value not equal)");
+    };
+    if (!((a->oldSwapchain) == (b->oldSwapchain))) {
+        onFail("a->oldSwapchain (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkPresentInfoKHR(
-    const VkPresentInfoKHR* a,
-    const VkPresentInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPresentInfoKHR(const VkPresentInfoKHR* a, const VkPresentInfoKHR* b,
+                                 OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->waitSemaphoreCount) == (b->waitSemaphoreCount))) { onFail("a->waitSemaphoreCount (Error: Value not equal)"); };
-    if (!((a->waitSemaphoreCount) == (b->waitSemaphoreCount))) { onFail("a->pWaitSemaphores (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pWaitSemaphores, b->pWaitSemaphores, a->waitSemaphoreCount * sizeof(const VkSemaphore)) == 0))) { onFail("a->pWaitSemaphores (Error: Unequal dyn array)"); };
-    if (!((a->swapchainCount) == (b->swapchainCount))) { onFail("a->swapchainCount (Error: Value not equal)"); };
-    if (!((a->swapchainCount) == (b->swapchainCount))) { onFail("a->pSwapchains (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pSwapchains, b->pSwapchains, a->swapchainCount * sizeof(const VkSwapchainKHR)) == 0))) { onFail("a->pSwapchains (Error: Unequal dyn array)"); };
-    if (!((a->swapchainCount) == (b->swapchainCount))) { onFail("a->pImageIndices (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pImageIndices, b->pImageIndices, a->swapchainCount * sizeof(const uint32_t)) == 0))) { onFail("a->pImageIndices (Error: Unequal dyn array)"); };
-    if (!((!(a->pResults) && !(b->pResults)) || ((a->pResults) && (b->pResults)))) { onFail("a->pResults (Error: Mismatch in optional field)"); };
-    if (a->pResults && b->pResults)
-    {
-        if (!((a->swapchainCount) == (b->swapchainCount))) { onFail("a->pResults (Error: Lengths not equal)"); };
-        if (!((memcmp(a->pResults, b->pResults, a->swapchainCount * sizeof(VkResult)) == 0))) { onFail("a->pResults (Error: Unequal dyn array)"); };
+    if (!((a->waitSemaphoreCount) == (b->waitSemaphoreCount))) {
+        onFail("a->waitSemaphoreCount (Error: Value not equal)");
+    };
+    if (!((a->waitSemaphoreCount) == (b->waitSemaphoreCount))) {
+        onFail("a->pWaitSemaphores (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pWaitSemaphores, b->pWaitSemaphores,
+                  a->waitSemaphoreCount * sizeof(const VkSemaphore)) == 0))) {
+        onFail("a->pWaitSemaphores (Error: Unequal dyn array)");
+    };
+    if (!((a->swapchainCount) == (b->swapchainCount))) {
+        onFail("a->swapchainCount (Error: Value not equal)");
+    };
+    if (!((a->swapchainCount) == (b->swapchainCount))) {
+        onFail("a->pSwapchains (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pSwapchains, b->pSwapchains,
+                  a->swapchainCount * sizeof(const VkSwapchainKHR)) == 0))) {
+        onFail("a->pSwapchains (Error: Unequal dyn array)");
+    };
+    if (!((a->swapchainCount) == (b->swapchainCount))) {
+        onFail("a->pImageIndices (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pImageIndices, b->pImageIndices, a->swapchainCount * sizeof(const uint32_t)) ==
+           0))) {
+        onFail("a->pImageIndices (Error: Unequal dyn array)");
+    };
+    if (!((!(a->pResults) && !(b->pResults)) || ((a->pResults) && (b->pResults)))) {
+        onFail("a->pResults (Error: Mismatch in optional field)");
+    };
+    if (a->pResults && b->pResults) {
+        if (!((a->swapchainCount) == (b->swapchainCount))) {
+            onFail("a->pResults (Error: Lengths not equal)");
+        };
+        if (!((memcmp(a->pResults, b->pResults, a->swapchainCount * sizeof(VkResult)) == 0))) {
+            onFail("a->pResults (Error: Unequal dyn array)");
+        };
     }
 }
 
-void checkEqual_VkImageSwapchainCreateInfoKHR(
-    const VkImageSwapchainCreateInfoKHR* a,
-    const VkImageSwapchainCreateInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkImageSwapchainCreateInfoKHR(const VkImageSwapchainCreateInfoKHR* a,
+                                              const VkImageSwapchainCreateInfoKHR* b,
+                                              OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->swapchain) == (b->swapchain))) { onFail("a->swapchain (Error: Value not equal)"); };
+    if (!((a->swapchain) == (b->swapchain))) {
+        onFail("a->swapchain (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkBindImageMemorySwapchainInfoKHR(
-    const VkBindImageMemorySwapchainInfoKHR* a,
-    const VkBindImageMemorySwapchainInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkBindImageMemorySwapchainInfoKHR(const VkBindImageMemorySwapchainInfoKHR* a,
+                                                  const VkBindImageMemorySwapchainInfoKHR* b,
+                                                  OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->swapchain) == (b->swapchain))) { onFail("a->swapchain (Error: Value not equal)"); };
-    if (!((a->imageIndex) == (b->imageIndex))) { onFail("a->imageIndex (Error: Value not equal)"); };
+    if (!((a->swapchain) == (b->swapchain))) {
+        onFail("a->swapchain (Error: Value not equal)");
+    };
+    if (!((a->imageIndex) == (b->imageIndex))) {
+        onFail("a->imageIndex (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkAcquireNextImageInfoKHR(
-    const VkAcquireNextImageInfoKHR* a,
-    const VkAcquireNextImageInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkAcquireNextImageInfoKHR(const VkAcquireNextImageInfoKHR* a,
+                                          const VkAcquireNextImageInfoKHR* b,
+                                          OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->swapchain) == (b->swapchain))) { onFail("a->swapchain (Error: Value not equal)"); };
-    if (!((a->timeout) == (b->timeout))) { onFail("a->timeout (Error: Value not equal)"); };
-    if (!((a->semaphore) == (b->semaphore))) { onFail("a->semaphore (Error: Value not equal)"); };
-    if (!((a->fence) == (b->fence))) { onFail("a->fence (Error: Value not equal)"); };
-    if (!((a->deviceMask) == (b->deviceMask))) { onFail("a->deviceMask (Error: Value not equal)"); };
+    if (!((a->swapchain) == (b->swapchain))) {
+        onFail("a->swapchain (Error: Value not equal)");
+    };
+    if (!((a->timeout) == (b->timeout))) {
+        onFail("a->timeout (Error: Value not equal)");
+    };
+    if (!((a->semaphore) == (b->semaphore))) {
+        onFail("a->semaphore (Error: Value not equal)");
+    };
+    if (!((a->fence) == (b->fence))) {
+        onFail("a->fence (Error: Value not equal)");
+    };
+    if (!((a->deviceMask) == (b->deviceMask))) {
+        onFail("a->deviceMask (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkDeviceGroupPresentCapabilitiesKHR(
-    const VkDeviceGroupPresentCapabilitiesKHR* a,
-    const VkDeviceGroupPresentCapabilitiesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDeviceGroupPresentCapabilitiesKHR(const VkDeviceGroupPresentCapabilitiesKHR* a,
+                                                    const VkDeviceGroupPresentCapabilitiesKHR* b,
+                                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((memcmp(a->presentMask, b->presentMask, VK_MAX_DEVICE_GROUP_SIZE * sizeof(uint32_t)) == 0))) { onFail("a->presentMask (Error: Unequal static array)"); };
-    if (!((a->modes) == (b->modes))) { onFail("a->modes (Error: Value not equal)"); };
+    if (!((memcmp(a->presentMask, b->presentMask, VK_MAX_DEVICE_GROUP_SIZE * sizeof(uint32_t)) ==
+           0))) {
+        onFail("a->presentMask (Error: Unequal static array)");
+    };
+    if (!((a->modes) == (b->modes))) {
+        onFail("a->modes (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkDeviceGroupPresentInfoKHR(
-    const VkDeviceGroupPresentInfoKHR* a,
-    const VkDeviceGroupPresentInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDeviceGroupPresentInfoKHR(const VkDeviceGroupPresentInfoKHR* a,
+                                            const VkDeviceGroupPresentInfoKHR* b,
+                                            OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->swapchainCount) == (b->swapchainCount))) { onFail("a->swapchainCount (Error: Value not equal)"); };
-    if (!((a->swapchainCount) == (b->swapchainCount))) { onFail("a->pDeviceMasks (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pDeviceMasks, b->pDeviceMasks, a->swapchainCount * sizeof(const uint32_t)) == 0))) { onFail("a->pDeviceMasks (Error: Unequal dyn array)"); };
-    if (!((a->mode) == (b->mode))) { onFail("a->mode (Error: Value not equal)"); };
+    if (!((a->swapchainCount) == (b->swapchainCount))) {
+        onFail("a->swapchainCount (Error: Value not equal)");
+    };
+    if (!((a->swapchainCount) == (b->swapchainCount))) {
+        onFail("a->pDeviceMasks (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pDeviceMasks, b->pDeviceMasks, a->swapchainCount * sizeof(const uint32_t)) ==
+           0))) {
+        onFail("a->pDeviceMasks (Error: Unequal dyn array)");
+    };
+    if (!((a->mode) == (b->mode))) {
+        onFail("a->mode (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkDeviceGroupSwapchainCreateInfoKHR(
-    const VkDeviceGroupSwapchainCreateInfoKHR* a,
-    const VkDeviceGroupSwapchainCreateInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDeviceGroupSwapchainCreateInfoKHR(const VkDeviceGroupSwapchainCreateInfoKHR* a,
+                                                    const VkDeviceGroupSwapchainCreateInfoKHR* b,
+                                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->modes) == (b->modes))) { onFail("a->modes (Error: Value not equal)"); };
+    if (!((a->modes) == (b->modes))) {
+        onFail("a->modes (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_KHR_display
-void checkEqual_VkDisplayModeParametersKHR(
-    const VkDisplayModeParametersKHR* a,
-    const VkDisplayModeParametersKHR* b,
-    OnFailCompareFunc onFail)
-{
+void checkEqual_VkDisplayModeParametersKHR(const VkDisplayModeParametersKHR* a,
+                                           const VkDisplayModeParametersKHR* b,
+                                           OnFailCompareFunc onFail) {
     checkEqual_VkExtent2D(&a->visibleRegion, &b->visibleRegion, onFail);
-    if (!((a->refreshRate) == (b->refreshRate))) { onFail("a->refreshRate (Error: Value not equal)"); };
+    if (!((a->refreshRate) == (b->refreshRate))) {
+        onFail("a->refreshRate (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkDisplayModeCreateInfoKHR(
-    const VkDisplayModeCreateInfoKHR* a,
-    const VkDisplayModeCreateInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDisplayModeCreateInfoKHR(const VkDisplayModeCreateInfoKHR* a,
+                                           const VkDisplayModeCreateInfoKHR* b,
+                                           OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
     checkEqual_VkDisplayModeParametersKHR(&a->parameters, &b->parameters, onFail);
 }
 
-void checkEqual_VkDisplayModePropertiesKHR(
-    const VkDisplayModePropertiesKHR* a,
-    const VkDisplayModePropertiesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->displayMode) == (b->displayMode))) { onFail("a->displayMode (Error: Value not equal)"); };
+void checkEqual_VkDisplayModePropertiesKHR(const VkDisplayModePropertiesKHR* a,
+                                           const VkDisplayModePropertiesKHR* b,
+                                           OnFailCompareFunc onFail) {
+    if (!((a->displayMode) == (b->displayMode))) {
+        onFail("a->displayMode (Error: Value not equal)");
+    };
     checkEqual_VkDisplayModeParametersKHR(&a->parameters, &b->parameters, onFail);
 }
 
-void checkEqual_VkDisplayPlaneCapabilitiesKHR(
-    const VkDisplayPlaneCapabilitiesKHR* a,
-    const VkDisplayPlaneCapabilitiesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->supportedAlpha) == (b->supportedAlpha))) { onFail("a->supportedAlpha (Error: Value not equal)"); };
+void checkEqual_VkDisplayPlaneCapabilitiesKHR(const VkDisplayPlaneCapabilitiesKHR* a,
+                                              const VkDisplayPlaneCapabilitiesKHR* b,
+                                              OnFailCompareFunc onFail) {
+    if (!((a->supportedAlpha) == (b->supportedAlpha))) {
+        onFail("a->supportedAlpha (Error: Value not equal)");
+    };
     checkEqual_VkOffset2D(&a->minSrcPosition, &b->minSrcPosition, onFail);
     checkEqual_VkOffset2D(&a->maxSrcPosition, &b->maxSrcPosition, onFail);
     checkEqual_VkExtent2D(&a->minSrcExtent, &b->minSrcExtent, onFail);
@@ -4584,481 +6588,588 @@
     checkEqual_VkExtent2D(&a->maxDstExtent, &b->maxDstExtent, onFail);
 }
 
-void checkEqual_VkDisplayPlanePropertiesKHR(
-    const VkDisplayPlanePropertiesKHR* a,
-    const VkDisplayPlanePropertiesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->currentDisplay) == (b->currentDisplay))) { onFail("a->currentDisplay (Error: Value not equal)"); };
-    if (!((a->currentStackIndex) == (b->currentStackIndex))) { onFail("a->currentStackIndex (Error: Value not equal)"); };
+void checkEqual_VkDisplayPlanePropertiesKHR(const VkDisplayPlanePropertiesKHR* a,
+                                            const VkDisplayPlanePropertiesKHR* b,
+                                            OnFailCompareFunc onFail) {
+    if (!((a->currentDisplay) == (b->currentDisplay))) {
+        onFail("a->currentDisplay (Error: Value not equal)");
+    };
+    if (!((a->currentStackIndex) == (b->currentStackIndex))) {
+        onFail("a->currentStackIndex (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkDisplayPropertiesKHR(
-    const VkDisplayPropertiesKHR* a,
-    const VkDisplayPropertiesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->display) == (b->display))) { onFail("a->display (Error: Value not equal)"); };
-    if (!((!(a->displayName) && !(b->displayName)) || ((a->displayName) && (b->displayName)))) { onFail("a->displayName (Error: Mismatch in string pointer nullness)"); };
-    if ((a->displayName) && (b->displayName))
-    {
-        if (!((strcmp(a->displayName, b->displayName) == 0))) { onFail("a->displayName (Error: Unequal strings)"); };
+void checkEqual_VkDisplayPropertiesKHR(const VkDisplayPropertiesKHR* a,
+                                       const VkDisplayPropertiesKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->display) == (b->display))) {
+        onFail("a->display (Error: Value not equal)");
+    };
+    if (!((!(a->displayName) && !(b->displayName)) || ((a->displayName) && (b->displayName)))) {
+        onFail("a->displayName (Error: Mismatch in string pointer nullness)");
+    };
+    if ((a->displayName) && (b->displayName)) {
+        if (!((strcmp(a->displayName, b->displayName) == 0))) {
+            onFail("a->displayName (Error: Unequal strings)");
+        };
     }
     checkEqual_VkExtent2D(&a->physicalDimensions, &b->physicalDimensions, onFail);
     checkEqual_VkExtent2D(&a->physicalResolution, &b->physicalResolution, onFail);
-    if (!((a->supportedTransforms) == (b->supportedTransforms))) { onFail("a->supportedTransforms (Error: Value not equal)"); };
-    if (!((a->planeReorderPossible) == (b->planeReorderPossible))) { onFail("a->planeReorderPossible (Error: Value not equal)"); };
-    if (!((a->persistentContent) == (b->persistentContent))) { onFail("a->persistentContent (Error: Value not equal)"); };
+    if (!((a->supportedTransforms) == (b->supportedTransforms))) {
+        onFail("a->supportedTransforms (Error: Value not equal)");
+    };
+    if (!((a->planeReorderPossible) == (b->planeReorderPossible))) {
+        onFail("a->planeReorderPossible (Error: Value not equal)");
+    };
+    if (!((a->persistentContent) == (b->persistentContent))) {
+        onFail("a->persistentContent (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkDisplaySurfaceCreateInfoKHR(
-    const VkDisplaySurfaceCreateInfoKHR* a,
-    const VkDisplaySurfaceCreateInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDisplaySurfaceCreateInfoKHR(const VkDisplaySurfaceCreateInfoKHR* a,
+                                              const VkDisplaySurfaceCreateInfoKHR* b,
+                                              OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->displayMode) == (b->displayMode))) { onFail("a->displayMode (Error: Value not equal)"); };
-    if (!((a->planeIndex) == (b->planeIndex))) { onFail("a->planeIndex (Error: Value not equal)"); };
-    if (!((a->planeStackIndex) == (b->planeStackIndex))) { onFail("a->planeStackIndex (Error: Value not equal)"); };
-    if (!((a->transform) == (b->transform))) { onFail("a->transform (Error: Value not equal)"); };
-    if (!((a->globalAlpha) == (b->globalAlpha))) { onFail("a->globalAlpha (Error: Value not equal)"); };
-    if (!((a->alphaMode) == (b->alphaMode))) { onFail("a->alphaMode (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->displayMode) == (b->displayMode))) {
+        onFail("a->displayMode (Error: Value not equal)");
+    };
+    if (!((a->planeIndex) == (b->planeIndex))) {
+        onFail("a->planeIndex (Error: Value not equal)");
+    };
+    if (!((a->planeStackIndex) == (b->planeStackIndex))) {
+        onFail("a->planeStackIndex (Error: Value not equal)");
+    };
+    if (!((a->transform) == (b->transform))) {
+        onFail("a->transform (Error: Value not equal)");
+    };
+    if (!((a->globalAlpha) == (b->globalAlpha))) {
+        onFail("a->globalAlpha (Error: Value not equal)");
+    };
+    if (!((a->alphaMode) == (b->alphaMode))) {
+        onFail("a->alphaMode (Error: Value not equal)");
+    };
     checkEqual_VkExtent2D(&a->imageExtent, &b->imageExtent, onFail);
 }
 
 #endif
 #ifdef VK_KHR_display_swapchain
-void checkEqual_VkDisplayPresentInfoKHR(
-    const VkDisplayPresentInfoKHR* a,
-    const VkDisplayPresentInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDisplayPresentInfoKHR(const VkDisplayPresentInfoKHR* a,
+                                        const VkDisplayPresentInfoKHR* b,
+                                        OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
     checkEqual_VkRect2D(&a->srcRect, &b->srcRect, onFail);
     checkEqual_VkRect2D(&a->dstRect, &b->dstRect, onFail);
-    if (!((a->persistent) == (b->persistent))) { onFail("a->persistent (Error: Value not equal)"); };
+    if (!((a->persistent) == (b->persistent))) {
+        onFail("a->persistent (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_KHR_xlib_surface
-void checkEqual_VkXlibSurfaceCreateInfoKHR(
-    const VkXlibSurfaceCreateInfoKHR* a,
-    const VkXlibSurfaceCreateInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkXlibSurfaceCreateInfoKHR(const VkXlibSurfaceCreateInfoKHR* a,
+                                           const VkXlibSurfaceCreateInfoKHR* b,
+                                           OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((!(a->dpy) && !(b->dpy)) || ((a->dpy) && (b->dpy)))) { onFail("a->dpy (Error: Mismatch in optional field)"); };
-    if (a->dpy && b->dpy)
-    {
-        if (!((memcmp(a->dpy, b->dpy, sizeof(Display)) == 0))) { onFail("a->dpy (Error: Unequal dyn array)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((!(a->dpy) && !(b->dpy)) || ((a->dpy) && (b->dpy)))) {
+        onFail("a->dpy (Error: Mismatch in optional field)");
+    };
+    if (a->dpy && b->dpy) {
+        if (!((memcmp(a->dpy, b->dpy, sizeof(Display)) == 0))) {
+            onFail("a->dpy (Error: Unequal dyn array)");
+        };
     }
-    if (!((a->window) == (b->window))) { onFail("a->window (Error: Value not equal)"); };
+    if (!((a->window) == (b->window))) {
+        onFail("a->window (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_KHR_xcb_surface
-void checkEqual_VkXcbSurfaceCreateInfoKHR(
-    const VkXcbSurfaceCreateInfoKHR* a,
-    const VkXcbSurfaceCreateInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkXcbSurfaceCreateInfoKHR(const VkXcbSurfaceCreateInfoKHR* a,
+                                          const VkXcbSurfaceCreateInfoKHR* b,
+                                          OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((!(a->connection) && !(b->connection)) || ((a->connection) && (b->connection)))) { onFail("a->connection (Error: Mismatch in optional field)"); };
-    if (a->connection && b->connection)
-    {
-        if (!((memcmp(a->connection, b->connection, sizeof(xcb_connection_t)) == 0))) { onFail("a->connection (Error: Unequal dyn array)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((!(a->connection) && !(b->connection)) || ((a->connection) && (b->connection)))) {
+        onFail("a->connection (Error: Mismatch in optional field)");
+    };
+    if (a->connection && b->connection) {
+        if (!((memcmp(a->connection, b->connection, sizeof(xcb_connection_t)) == 0))) {
+            onFail("a->connection (Error: Unequal dyn array)");
+        };
     }
-    if (!((a->window) == (b->window))) { onFail("a->window (Error: Value not equal)"); };
+    if (!((a->window) == (b->window))) {
+        onFail("a->window (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_KHR_wayland_surface
-void checkEqual_VkWaylandSurfaceCreateInfoKHR(
-    const VkWaylandSurfaceCreateInfoKHR* a,
-    const VkWaylandSurfaceCreateInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkWaylandSurfaceCreateInfoKHR(const VkWaylandSurfaceCreateInfoKHR* a,
+                                              const VkWaylandSurfaceCreateInfoKHR* b,
+                                              OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((!(a->display) && !(b->display)) || ((a->display) && (b->display)))) { onFail("a->display (Error: Mismatch in optional field)"); };
-    if (a->display && b->display)
-    {
-        if (!((memcmp(a->display, b->display, sizeof(wl_display)) == 0))) { onFail("a->display (Error: Unequal dyn array)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((!(a->display) && !(b->display)) || ((a->display) && (b->display)))) {
+        onFail("a->display (Error: Mismatch in optional field)");
+    };
+    if (a->display && b->display) {
+        if (!((memcmp(a->display, b->display, sizeof(wl_display)) == 0))) {
+            onFail("a->display (Error: Unequal dyn array)");
+        };
     }
-    if (!((!(a->surface) && !(b->surface)) || ((a->surface) && (b->surface)))) { onFail("a->surface (Error: Mismatch in optional field)"); };
-    if (a->surface && b->surface)
-    {
-        if (!((memcmp(a->surface, b->surface, sizeof(wl_surface)) == 0))) { onFail("a->surface (Error: Unequal dyn array)"); };
+    if (!((!(a->surface) && !(b->surface)) || ((a->surface) && (b->surface)))) {
+        onFail("a->surface (Error: Mismatch in optional field)");
+    };
+    if (a->surface && b->surface) {
+        if (!((memcmp(a->surface, b->surface, sizeof(wl_surface)) == 0))) {
+            onFail("a->surface (Error: Unequal dyn array)");
+        };
     }
 }
 
 #endif
 #ifdef VK_KHR_android_surface
-void checkEqual_VkAndroidSurfaceCreateInfoKHR(
-    const VkAndroidSurfaceCreateInfoKHR* a,
-    const VkAndroidSurfaceCreateInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkAndroidSurfaceCreateInfoKHR(const VkAndroidSurfaceCreateInfoKHR* a,
+                                              const VkAndroidSurfaceCreateInfoKHR* b,
+                                              OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((!(a->window) && !(b->window)) || ((a->window) && (b->window)))) { onFail("a->window (Error: Mismatch in optional field)"); };
-    if (a->window && b->window)
-    {
-        if (!((memcmp(a->window, b->window, sizeof(ANativeWindow)) == 0))) { onFail("a->window (Error: Unequal dyn array)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((!(a->window) && !(b->window)) || ((a->window) && (b->window)))) {
+        onFail("a->window (Error: Mismatch in optional field)");
+    };
+    if (a->window && b->window) {
+        if (!((memcmp(a->window, b->window, sizeof(ANativeWindow)) == 0))) {
+            onFail("a->window (Error: Unequal dyn array)");
+        };
     }
 }
 
 #endif
 #ifdef VK_KHR_win32_surface
-void checkEqual_VkWin32SurfaceCreateInfoKHR(
-    const VkWin32SurfaceCreateInfoKHR* a,
-    const VkWin32SurfaceCreateInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkWin32SurfaceCreateInfoKHR(const VkWin32SurfaceCreateInfoKHR* a,
+                                            const VkWin32SurfaceCreateInfoKHR* b,
+                                            OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->hinstance) == (b->hinstance))) { onFail("a->hinstance (Error: Value not equal)"); };
-    if (!((a->hwnd) == (b->hwnd))) { onFail("a->hwnd (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->hinstance) == (b->hinstance))) {
+        onFail("a->hinstance (Error: Value not equal)");
+    };
+    if (!((a->hwnd) == (b->hwnd))) {
+        onFail("a->hwnd (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_KHR_sampler_mirror_clamp_to_edge
 #endif
 #ifdef VK_KHR_video_queue
-void checkEqual_VkVideoQueueFamilyProperties2KHR(
-    const VkVideoQueueFamilyProperties2KHR* a,
-    const VkVideoQueueFamilyProperties2KHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkVideoQueueFamilyProperties2KHR(const VkVideoQueueFamilyProperties2KHR* a,
+                                                 const VkVideoQueueFamilyProperties2KHR* b,
+                                                 OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->videoCodecOperations) == (b->videoCodecOperations))) { onFail("a->videoCodecOperations (Error: Value not equal)"); };
+    if (!((a->videoCodecOperations) == (b->videoCodecOperations))) {
+        onFail("a->videoCodecOperations (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkVideoProfileKHR(
-    const VkVideoProfileKHR* a,
-    const VkVideoProfileKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkVideoProfileKHR(const VkVideoProfileKHR* a, const VkVideoProfileKHR* b,
+                                  OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->videoCodecOperation) == (b->videoCodecOperation))) { onFail("a->videoCodecOperation (Error: Value not equal)"); };
-    if (!((a->chromaSubsampling) == (b->chromaSubsampling))) { onFail("a->chromaSubsampling (Error: Value not equal)"); };
-    if (!((a->lumaBitDepth) == (b->lumaBitDepth))) { onFail("a->lumaBitDepth (Error: Value not equal)"); };
-    if (!((a->chromaBitDepth) == (b->chromaBitDepth))) { onFail("a->chromaBitDepth (Error: Value not equal)"); };
+    if (!((a->videoCodecOperation) == (b->videoCodecOperation))) {
+        onFail("a->videoCodecOperation (Error: Value not equal)");
+    };
+    if (!((a->chromaSubsampling) == (b->chromaSubsampling))) {
+        onFail("a->chromaSubsampling (Error: Value not equal)");
+    };
+    if (!((a->lumaBitDepth) == (b->lumaBitDepth))) {
+        onFail("a->lumaBitDepth (Error: Value not equal)");
+    };
+    if (!((a->chromaBitDepth) == (b->chromaBitDepth))) {
+        onFail("a->chromaBitDepth (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkVideoProfilesKHR(
-    const VkVideoProfilesKHR* a,
-    const VkVideoProfilesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkVideoProfilesKHR(const VkVideoProfilesKHR* a, const VkVideoProfilesKHR* b,
+                                   OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->profileCount) == (b->profileCount))) { onFail("a->profileCount (Error: Value not equal)"); };
-    if ((a->pProfiles) && (b->pProfiles))
-    {
+    if (!((a->profileCount) == (b->profileCount))) {
+        onFail("a->profileCount (Error: Value not equal)");
+    };
+    if ((a->pProfiles) && (b->pProfiles)) {
         checkEqual_VkVideoProfileKHR(a->pProfiles, b->pProfiles, onFail);
     }
 }
 
-void checkEqual_VkVideoCapabilitiesKHR(
-    const VkVideoCapabilitiesKHR* a,
-    const VkVideoCapabilitiesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkVideoCapabilitiesKHR(const VkVideoCapabilitiesKHR* a,
+                                       const VkVideoCapabilitiesKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->capabilityFlags) == (b->capabilityFlags))) { onFail("a->capabilityFlags (Error: Value not equal)"); };
-    if (!((a->minBitstreamBufferOffsetAlignment) == (b->minBitstreamBufferOffsetAlignment))) { onFail("a->minBitstreamBufferOffsetAlignment (Error: Value not equal)"); };
-    if (!((a->minBitstreamBufferSizeAlignment) == (b->minBitstreamBufferSizeAlignment))) { onFail("a->minBitstreamBufferSizeAlignment (Error: Value not equal)"); };
-    checkEqual_VkExtent2D(&a->videoPictureExtentGranularity, &b->videoPictureExtentGranularity, onFail);
+    if (!((a->capabilityFlags) == (b->capabilityFlags))) {
+        onFail("a->capabilityFlags (Error: Value not equal)");
+    };
+    if (!((a->minBitstreamBufferOffsetAlignment) == (b->minBitstreamBufferOffsetAlignment))) {
+        onFail("a->minBitstreamBufferOffsetAlignment (Error: Value not equal)");
+    };
+    if (!((a->minBitstreamBufferSizeAlignment) == (b->minBitstreamBufferSizeAlignment))) {
+        onFail("a->minBitstreamBufferSizeAlignment (Error: Value not equal)");
+    };
+    checkEqual_VkExtent2D(&a->videoPictureExtentGranularity, &b->videoPictureExtentGranularity,
+                          onFail);
     checkEqual_VkExtent2D(&a->minExtent, &b->minExtent, onFail);
     checkEqual_VkExtent2D(&a->maxExtent, &b->maxExtent, onFail);
-    if (!((a->maxReferencePicturesSlotsCount) == (b->maxReferencePicturesSlotsCount))) { onFail("a->maxReferencePicturesSlotsCount (Error: Value not equal)"); };
-    if (!((a->maxReferencePicturesActiveCount) == (b->maxReferencePicturesActiveCount))) { onFail("a->maxReferencePicturesActiveCount (Error: Value not equal)"); };
+    if (!((a->maxReferencePicturesSlotsCount) == (b->maxReferencePicturesSlotsCount))) {
+        onFail("a->maxReferencePicturesSlotsCount (Error: Value not equal)");
+    };
+    if (!((a->maxReferencePicturesActiveCount) == (b->maxReferencePicturesActiveCount))) {
+        onFail("a->maxReferencePicturesActiveCount (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkPhysicalDeviceVideoFormatInfoKHR(
-    const VkPhysicalDeviceVideoFormatInfoKHR* a,
-    const VkPhysicalDeviceVideoFormatInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPhysicalDeviceVideoFormatInfoKHR(const VkPhysicalDeviceVideoFormatInfoKHR* a,
+                                                   const VkPhysicalDeviceVideoFormatInfoKHR* b,
+                                                   OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->imageUsage) == (b->imageUsage))) { onFail("a->imageUsage (Error: Value not equal)"); };
-    if ((a->pVideoProfiles) && (b->pVideoProfiles))
-    {
+    if (!((a->imageUsage) == (b->imageUsage))) {
+        onFail("a->imageUsage (Error: Value not equal)");
+    };
+    if ((a->pVideoProfiles) && (b->pVideoProfiles)) {
         checkEqual_VkVideoProfilesKHR(a->pVideoProfiles, b->pVideoProfiles, onFail);
     }
 }
 
-void checkEqual_VkVideoFormatPropertiesKHR(
-    const VkVideoFormatPropertiesKHR* a,
-    const VkVideoFormatPropertiesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkVideoFormatPropertiesKHR(const VkVideoFormatPropertiesKHR* a,
+                                           const VkVideoFormatPropertiesKHR* b,
+                                           OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->format) == (b->format))) { onFail("a->format (Error: Value not equal)"); };
+    if (!((a->format) == (b->format))) {
+        onFail("a->format (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkVideoPictureResourceKHR(
-    const VkVideoPictureResourceKHR* a,
-    const VkVideoPictureResourceKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkVideoPictureResourceKHR(const VkVideoPictureResourceKHR* a,
+                                          const VkVideoPictureResourceKHR* b,
+                                          OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
     checkEqual_VkOffset2D(&a->codedOffset, &b->codedOffset, onFail);
     checkEqual_VkExtent2D(&a->codedExtent, &b->codedExtent, onFail);
-    if (!((a->baseArrayLayer) == (b->baseArrayLayer))) { onFail("a->baseArrayLayer (Error: Value not equal)"); };
-    if (!((a->imageViewBinding) == (b->imageViewBinding))) { onFail("a->imageViewBinding (Error: Value not equal)"); };
+    if (!((a->baseArrayLayer) == (b->baseArrayLayer))) {
+        onFail("a->baseArrayLayer (Error: Value not equal)");
+    };
+    if (!((a->imageViewBinding) == (b->imageViewBinding))) {
+        onFail("a->imageViewBinding (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkVideoReferenceSlotKHR(
-    const VkVideoReferenceSlotKHR* a,
-    const VkVideoReferenceSlotKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkVideoReferenceSlotKHR(const VkVideoReferenceSlotKHR* a,
+                                        const VkVideoReferenceSlotKHR* b,
+                                        OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->slotIndex) == (b->slotIndex))) { onFail("a->slotIndex (Error: Value not equal)"); };
-    if ((a->pPictureResource) && (b->pPictureResource))
-    {
+    if (!((a->slotIndex) == (b->slotIndex))) {
+        onFail("a->slotIndex (Error: Value not equal)");
+    };
+    if ((a->pPictureResource) && (b->pPictureResource)) {
         checkEqual_VkVideoPictureResourceKHR(a->pPictureResource, b->pPictureResource, onFail);
     }
 }
 
-void checkEqual_VkVideoGetMemoryPropertiesKHR(
-    const VkVideoGetMemoryPropertiesKHR* a,
-    const VkVideoGetMemoryPropertiesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkVideoGetMemoryPropertiesKHR(const VkVideoGetMemoryPropertiesKHR* a,
+                                              const VkVideoGetMemoryPropertiesKHR* b,
+                                              OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->memoryBindIndex) == (b->memoryBindIndex))) { onFail("a->memoryBindIndex (Error: Value not equal)"); };
-    if ((a->pMemoryRequirements) && (b->pMemoryRequirements))
-    {
+    if (!((a->memoryBindIndex) == (b->memoryBindIndex))) {
+        onFail("a->memoryBindIndex (Error: Value not equal)");
+    };
+    if ((a->pMemoryRequirements) && (b->pMemoryRequirements)) {
         checkEqual_VkMemoryRequirements2(a->pMemoryRequirements, b->pMemoryRequirements, onFail);
     }
 }
 
-void checkEqual_VkVideoBindMemoryKHR(
-    const VkVideoBindMemoryKHR* a,
-    const VkVideoBindMemoryKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkVideoBindMemoryKHR(const VkVideoBindMemoryKHR* a, const VkVideoBindMemoryKHR* b,
+                                     OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->memoryBindIndex) == (b->memoryBindIndex))) { onFail("a->memoryBindIndex (Error: Value not equal)"); };
-    if (!((a->memory) == (b->memory))) { onFail("a->memory (Error: Value not equal)"); };
-    if (!((a->memoryOffset) == (b->memoryOffset))) { onFail("a->memoryOffset (Error: Value not equal)"); };
-    if (!((a->memorySize) == (b->memorySize))) { onFail("a->memorySize (Error: Value not equal)"); };
+    if (!((a->memoryBindIndex) == (b->memoryBindIndex))) {
+        onFail("a->memoryBindIndex (Error: Value not equal)");
+    };
+    if (!((a->memory) == (b->memory))) {
+        onFail("a->memory (Error: Value not equal)");
+    };
+    if (!((a->memoryOffset) == (b->memoryOffset))) {
+        onFail("a->memoryOffset (Error: Value not equal)");
+    };
+    if (!((a->memorySize) == (b->memorySize))) {
+        onFail("a->memorySize (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkVideoSessionCreateInfoKHR(
-    const VkVideoSessionCreateInfoKHR* a,
-    const VkVideoSessionCreateInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkVideoSessionCreateInfoKHR(const VkVideoSessionCreateInfoKHR* a,
+                                            const VkVideoSessionCreateInfoKHR* b,
+                                            OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->queueFamilyIndex) == (b->queueFamilyIndex))) { onFail("a->queueFamilyIndex (Error: Value not equal)"); };
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if ((a->pVideoProfile) && (b->pVideoProfile))
-    {
+    if (!((a->queueFamilyIndex) == (b->queueFamilyIndex))) {
+        onFail("a->queueFamilyIndex (Error: Value not equal)");
+    };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if ((a->pVideoProfile) && (b->pVideoProfile)) {
         checkEqual_VkVideoProfileKHR(a->pVideoProfile, b->pVideoProfile, onFail);
     }
-    if (!((a->pictureFormat) == (b->pictureFormat))) { onFail("a->pictureFormat (Error: Value not equal)"); };
+    if (!((a->pictureFormat) == (b->pictureFormat))) {
+        onFail("a->pictureFormat (Error: Value not equal)");
+    };
     checkEqual_VkExtent2D(&a->maxCodedExtent, &b->maxCodedExtent, onFail);
-    if (!((a->referencePicturesFormat) == (b->referencePicturesFormat))) { onFail("a->referencePicturesFormat (Error: Value not equal)"); };
-    if (!((a->maxReferencePicturesSlotsCount) == (b->maxReferencePicturesSlotsCount))) { onFail("a->maxReferencePicturesSlotsCount (Error: Value not equal)"); };
-    if (!((a->maxReferencePicturesActiveCount) == (b->maxReferencePicturesActiveCount))) { onFail("a->maxReferencePicturesActiveCount (Error: Value not equal)"); };
+    if (!((a->referencePicturesFormat) == (b->referencePicturesFormat))) {
+        onFail("a->referencePicturesFormat (Error: Value not equal)");
+    };
+    if (!((a->maxReferencePicturesSlotsCount) == (b->maxReferencePicturesSlotsCount))) {
+        onFail("a->maxReferencePicturesSlotsCount (Error: Value not equal)");
+    };
+    if (!((a->maxReferencePicturesActiveCount) == (b->maxReferencePicturesActiveCount))) {
+        onFail("a->maxReferencePicturesActiveCount (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkVideoSessionParametersCreateInfoKHR(
-    const VkVideoSessionParametersCreateInfoKHR* a,
-    const VkVideoSessionParametersCreateInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkVideoSessionParametersCreateInfoKHR* a, const VkVideoSessionParametersCreateInfoKHR* b,
+    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->videoSessionParametersTemplate) == (b->videoSessionParametersTemplate))) { onFail("a->videoSessionParametersTemplate (Error: Value not equal)"); };
-    if (!((a->videoSession) == (b->videoSession))) { onFail("a->videoSession (Error: Value not equal)"); };
+    if (!((a->videoSessionParametersTemplate) == (b->videoSessionParametersTemplate))) {
+        onFail("a->videoSessionParametersTemplate (Error: Value not equal)");
+    };
+    if (!((a->videoSession) == (b->videoSession))) {
+        onFail("a->videoSession (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkVideoSessionParametersUpdateInfoKHR(
-    const VkVideoSessionParametersUpdateInfoKHR* a,
-    const VkVideoSessionParametersUpdateInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkVideoSessionParametersUpdateInfoKHR* a, const VkVideoSessionParametersUpdateInfoKHR* b,
+    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->updateSequenceCount) == (b->updateSequenceCount))) { onFail("a->updateSequenceCount (Error: Value not equal)"); };
+    if (!((a->updateSequenceCount) == (b->updateSequenceCount))) {
+        onFail("a->updateSequenceCount (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkVideoBeginCodingInfoKHR(
-    const VkVideoBeginCodingInfoKHR* a,
-    const VkVideoBeginCodingInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkVideoBeginCodingInfoKHR(const VkVideoBeginCodingInfoKHR* a,
+                                          const VkVideoBeginCodingInfoKHR* b,
+                                          OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->codecQualityPreset) == (b->codecQualityPreset))) { onFail("a->codecQualityPreset (Error: Value not equal)"); };
-    if (!((a->videoSession) == (b->videoSession))) { onFail("a->videoSession (Error: Value not equal)"); };
-    if (!((a->videoSessionParameters) == (b->videoSessionParameters))) { onFail("a->videoSessionParameters (Error: Value not equal)"); };
-    if (!((a->referenceSlotCount) == (b->referenceSlotCount))) { onFail("a->referenceSlotCount (Error: Value not equal)"); };
-    if ((a->pReferenceSlots) && (b->pReferenceSlots))
-    {
-        if (!((a->referenceSlotCount) == (b->referenceSlotCount))) { onFail("a->pReferenceSlots (Error: Lengths not equal)"); };
-        if ((a->referenceSlotCount) == (b->referenceSlotCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->referenceSlotCount; ++i)
-                {
-                    checkEqual_VkVideoReferenceSlotKHR(a->pReferenceSlots + i, b->pReferenceSlots + i, onFail);
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->codecQualityPreset) == (b->codecQualityPreset))) {
+        onFail("a->codecQualityPreset (Error: Value not equal)");
+    };
+    if (!((a->videoSession) == (b->videoSession))) {
+        onFail("a->videoSession (Error: Value not equal)");
+    };
+    if (!((a->videoSessionParameters) == (b->videoSessionParameters))) {
+        onFail("a->videoSessionParameters (Error: Value not equal)");
+    };
+    if (!((a->referenceSlotCount) == (b->referenceSlotCount))) {
+        onFail("a->referenceSlotCount (Error: Value not equal)");
+    };
+    if ((a->pReferenceSlots) && (b->pReferenceSlots)) {
+        if (!((a->referenceSlotCount) == (b->referenceSlotCount))) {
+            onFail("a->pReferenceSlots (Error: Lengths not equal)");
+        };
+        if ((a->referenceSlotCount) == (b->referenceSlotCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->referenceSlotCount; ++i) {
+                    checkEqual_VkVideoReferenceSlotKHR(a->pReferenceSlots + i,
+                                                       b->pReferenceSlots + i, onFail);
                 }
             }
         }
     }
 }
 
-void checkEqual_VkVideoEndCodingInfoKHR(
-    const VkVideoEndCodingInfoKHR* a,
-    const VkVideoEndCodingInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkVideoEndCodingInfoKHR(const VkVideoEndCodingInfoKHR* a,
+                                        const VkVideoEndCodingInfoKHR* b,
+                                        OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkVideoCodingControlInfoKHR(
-    const VkVideoCodingControlInfoKHR* a,
-    const VkVideoCodingControlInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkVideoCodingControlInfoKHR(const VkVideoCodingControlInfoKHR* a,
+                                            const VkVideoCodingControlInfoKHR* b,
+                                            OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_KHR_video_decode_queue
-void checkEqual_VkVideoDecodeInfoKHR(
-    const VkVideoDecodeInfoKHR* a,
-    const VkVideoDecodeInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkVideoDecodeInfoKHR(const VkVideoDecodeInfoKHR* a, const VkVideoDecodeInfoKHR* b,
+                                     OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
     checkEqual_VkOffset2D(&a->codedOffset, &b->codedOffset, onFail);
     checkEqual_VkExtent2D(&a->codedExtent, &b->codedExtent, onFail);
-    if (!((a->srcBuffer) == (b->srcBuffer))) { onFail("a->srcBuffer (Error: Value not equal)"); };
-    if (!((a->srcBufferOffset) == (b->srcBufferOffset))) { onFail("a->srcBufferOffset (Error: Value not equal)"); };
-    if (!((a->srcBufferRange) == (b->srcBufferRange))) { onFail("a->srcBufferRange (Error: Value not equal)"); };
+    if (!((a->srcBuffer) == (b->srcBuffer))) {
+        onFail("a->srcBuffer (Error: Value not equal)");
+    };
+    if (!((a->srcBufferOffset) == (b->srcBufferOffset))) {
+        onFail("a->srcBufferOffset (Error: Value not equal)");
+    };
+    if (!((a->srcBufferRange) == (b->srcBufferRange))) {
+        onFail("a->srcBufferRange (Error: Value not equal)");
+    };
     checkEqual_VkVideoPictureResourceKHR(&a->dstPictureResource, &b->dstPictureResource, onFail);
-    if ((a->pSetupReferenceSlot) && (b->pSetupReferenceSlot))
-    {
+    if ((a->pSetupReferenceSlot) && (b->pSetupReferenceSlot)) {
         checkEqual_VkVideoReferenceSlotKHR(a->pSetupReferenceSlot, b->pSetupReferenceSlot, onFail);
     }
-    if (!((a->referenceSlotCount) == (b->referenceSlotCount))) { onFail("a->referenceSlotCount (Error: Value not equal)"); };
-    if ((a->pReferenceSlots) && (b->pReferenceSlots))
-    {
-        if (!((a->referenceSlotCount) == (b->referenceSlotCount))) { onFail("a->pReferenceSlots (Error: Lengths not equal)"); };
-        if ((a->referenceSlotCount) == (b->referenceSlotCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->referenceSlotCount; ++i)
-                {
-                    checkEqual_VkVideoReferenceSlotKHR(a->pReferenceSlots + i, b->pReferenceSlots + i, onFail);
+    if (!((a->referenceSlotCount) == (b->referenceSlotCount))) {
+        onFail("a->referenceSlotCount (Error: Value not equal)");
+    };
+    if ((a->pReferenceSlots) && (b->pReferenceSlots)) {
+        if (!((a->referenceSlotCount) == (b->referenceSlotCount))) {
+            onFail("a->pReferenceSlots (Error: Lengths not equal)");
+        };
+        if ((a->referenceSlotCount) == (b->referenceSlotCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->referenceSlotCount; ++i) {
+                    checkEqual_VkVideoReferenceSlotKHR(a->pReferenceSlots + i,
+                                                       b->pReferenceSlots + i, onFail);
                 }
             }
         }
@@ -5067,185 +7178,256 @@
 
 #endif
 #ifdef VK_KHR_dynamic_rendering
-void checkEqual_VkRenderingAttachmentInfoKHR(
-    const VkRenderingAttachmentInfoKHR* a,
-    const VkRenderingAttachmentInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkRenderingAttachmentInfoKHR(const VkRenderingAttachmentInfoKHR* a,
+                                             const VkRenderingAttachmentInfoKHR* b,
+                                             OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->imageView) == (b->imageView))) { onFail("a->imageView (Error: Value not equal)"); };
-    if (!((a->imageLayout) == (b->imageLayout))) { onFail("a->imageLayout (Error: Value not equal)"); };
-    if (!((a->resolveMode) == (b->resolveMode))) { onFail("a->resolveMode (Error: Value not equal)"); };
-    if (!((a->resolveImageView) == (b->resolveImageView))) { onFail("a->resolveImageView (Error: Value not equal)"); };
-    if (!((a->resolveImageLayout) == (b->resolveImageLayout))) { onFail("a->resolveImageLayout (Error: Value not equal)"); };
-    if (!((a->loadOp) == (b->loadOp))) { onFail("a->loadOp (Error: Value not equal)"); };
-    if (!((a->storeOp) == (b->storeOp))) { onFail("a->storeOp (Error: Value not equal)"); };
+    if (!((a->imageView) == (b->imageView))) {
+        onFail("a->imageView (Error: Value not equal)");
+    };
+    if (!((a->imageLayout) == (b->imageLayout))) {
+        onFail("a->imageLayout (Error: Value not equal)");
+    };
+    if (!((a->resolveMode) == (b->resolveMode))) {
+        onFail("a->resolveMode (Error: Value not equal)");
+    };
+    if (!((a->resolveImageView) == (b->resolveImageView))) {
+        onFail("a->resolveImageView (Error: Value not equal)");
+    };
+    if (!((a->resolveImageLayout) == (b->resolveImageLayout))) {
+        onFail("a->resolveImageLayout (Error: Value not equal)");
+    };
+    if (!((a->loadOp) == (b->loadOp))) {
+        onFail("a->loadOp (Error: Value not equal)");
+    };
+    if (!((a->storeOp) == (b->storeOp))) {
+        onFail("a->storeOp (Error: Value not equal)");
+    };
     checkEqual_VkClearValue(&a->clearValue, &b->clearValue, onFail);
 }
 
-void checkEqual_VkRenderingInfoKHR(
-    const VkRenderingInfoKHR* a,
-    const VkRenderingInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkRenderingInfoKHR(const VkRenderingInfoKHR* a, const VkRenderingInfoKHR* b,
+                                   OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
     checkEqual_VkRect2D(&a->renderArea, &b->renderArea, onFail);
-    if (!((a->layerCount) == (b->layerCount))) { onFail("a->layerCount (Error: Value not equal)"); };
-    if (!((a->viewMask) == (b->viewMask))) { onFail("a->viewMask (Error: Value not equal)"); };
-    if (!((a->colorAttachmentCount) == (b->colorAttachmentCount))) { onFail("a->colorAttachmentCount (Error: Value not equal)"); };
-    if ((a->pColorAttachments) && (b->pColorAttachments))
-    {
-        if (!((a->colorAttachmentCount) == (b->colorAttachmentCount))) { onFail("a->pColorAttachments (Error: Lengths not equal)"); };
-        if ((a->colorAttachmentCount) == (b->colorAttachmentCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->colorAttachmentCount; ++i)
-                {
-                    checkEqual_VkRenderingAttachmentInfoKHR(a->pColorAttachments + i, b->pColorAttachments + i, onFail);
+    if (!((a->layerCount) == (b->layerCount))) {
+        onFail("a->layerCount (Error: Value not equal)");
+    };
+    if (!((a->viewMask) == (b->viewMask))) {
+        onFail("a->viewMask (Error: Value not equal)");
+    };
+    if (!((a->colorAttachmentCount) == (b->colorAttachmentCount))) {
+        onFail("a->colorAttachmentCount (Error: Value not equal)");
+    };
+    if ((a->pColorAttachments) && (b->pColorAttachments)) {
+        if (!((a->colorAttachmentCount) == (b->colorAttachmentCount))) {
+            onFail("a->pColorAttachments (Error: Lengths not equal)");
+        };
+        if ((a->colorAttachmentCount) == (b->colorAttachmentCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->colorAttachmentCount; ++i) {
+                    checkEqual_VkRenderingAttachmentInfoKHR(a->pColorAttachments + i,
+                                                            b->pColorAttachments + i, onFail);
                 }
             }
         }
     }
-    if (!((!(a->pDepthAttachment) && !(b->pDepthAttachment)) || ((a->pDepthAttachment) && (b->pDepthAttachment)))) { onFail("a->pDepthAttachment (Error: Mismatch in optional field)"); };
-    if (a->pDepthAttachment && b->pDepthAttachment)
-    {
-        if ((a->pDepthAttachment) && (b->pDepthAttachment))
-        {
-            checkEqual_VkRenderingAttachmentInfoKHR(a->pDepthAttachment, b->pDepthAttachment, onFail);
+    if (!((!(a->pDepthAttachment) && !(b->pDepthAttachment)) ||
+          ((a->pDepthAttachment) && (b->pDepthAttachment)))) {
+        onFail("a->pDepthAttachment (Error: Mismatch in optional field)");
+    };
+    if (a->pDepthAttachment && b->pDepthAttachment) {
+        if ((a->pDepthAttachment) && (b->pDepthAttachment)) {
+            checkEqual_VkRenderingAttachmentInfoKHR(a->pDepthAttachment, b->pDepthAttachment,
+                                                    onFail);
         }
     }
-    if (!((!(a->pStencilAttachment) && !(b->pStencilAttachment)) || ((a->pStencilAttachment) && (b->pStencilAttachment)))) { onFail("a->pStencilAttachment (Error: Mismatch in optional field)"); };
-    if (a->pStencilAttachment && b->pStencilAttachment)
-    {
-        if ((a->pStencilAttachment) && (b->pStencilAttachment))
-        {
-            checkEqual_VkRenderingAttachmentInfoKHR(a->pStencilAttachment, b->pStencilAttachment, onFail);
+    if (!((!(a->pStencilAttachment) && !(b->pStencilAttachment)) ||
+          ((a->pStencilAttachment) && (b->pStencilAttachment)))) {
+        onFail("a->pStencilAttachment (Error: Mismatch in optional field)");
+    };
+    if (a->pStencilAttachment && b->pStencilAttachment) {
+        if ((a->pStencilAttachment) && (b->pStencilAttachment)) {
+            checkEqual_VkRenderingAttachmentInfoKHR(a->pStencilAttachment, b->pStencilAttachment,
+                                                    onFail);
         }
     }
 }
 
-void checkEqual_VkPipelineRenderingCreateInfoKHR(
-    const VkPipelineRenderingCreateInfoKHR* a,
-    const VkPipelineRenderingCreateInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPipelineRenderingCreateInfoKHR(const VkPipelineRenderingCreateInfoKHR* a,
+                                                 const VkPipelineRenderingCreateInfoKHR* b,
+                                                 OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->viewMask) == (b->viewMask))) { onFail("a->viewMask (Error: Value not equal)"); };
-    if (!((a->colorAttachmentCount) == (b->colorAttachmentCount))) { onFail("a->colorAttachmentCount (Error: Value not equal)"); };
-    if (!((a->colorAttachmentCount) == (b->colorAttachmentCount))) { onFail("a->pColorAttachmentFormats (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pColorAttachmentFormats, b->pColorAttachmentFormats, a->colorAttachmentCount * sizeof(const VkFormat)) == 0))) { onFail("a->pColorAttachmentFormats (Error: Unequal dyn array)"); };
-    if (!((a->depthAttachmentFormat) == (b->depthAttachmentFormat))) { onFail("a->depthAttachmentFormat (Error: Value not equal)"); };
-    if (!((a->stencilAttachmentFormat) == (b->stencilAttachmentFormat))) { onFail("a->stencilAttachmentFormat (Error: Value not equal)"); };
+    if (!((a->viewMask) == (b->viewMask))) {
+        onFail("a->viewMask (Error: Value not equal)");
+    };
+    if (!((a->colorAttachmentCount) == (b->colorAttachmentCount))) {
+        onFail("a->colorAttachmentCount (Error: Value not equal)");
+    };
+    if (!((a->colorAttachmentCount) == (b->colorAttachmentCount))) {
+        onFail("a->pColorAttachmentFormats (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pColorAttachmentFormats, b->pColorAttachmentFormats,
+                  a->colorAttachmentCount * sizeof(const VkFormat)) == 0))) {
+        onFail("a->pColorAttachmentFormats (Error: Unequal dyn array)");
+    };
+    if (!((a->depthAttachmentFormat) == (b->depthAttachmentFormat))) {
+        onFail("a->depthAttachmentFormat (Error: Value not equal)");
+    };
+    if (!((a->stencilAttachmentFormat) == (b->stencilAttachmentFormat))) {
+        onFail("a->stencilAttachmentFormat (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceDynamicRenderingFeaturesKHR(
     const VkPhysicalDeviceDynamicRenderingFeaturesKHR* a,
-    const VkPhysicalDeviceDynamicRenderingFeaturesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceDynamicRenderingFeaturesKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->dynamicRendering) == (b->dynamicRendering))) { onFail("a->dynamicRendering (Error: Value not equal)"); };
+    if (!((a->dynamicRendering) == (b->dynamicRendering))) {
+        onFail("a->dynamicRendering (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkCommandBufferInheritanceRenderingInfoKHR(
     const VkCommandBufferInheritanceRenderingInfoKHR* a,
-    const VkCommandBufferInheritanceRenderingInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkCommandBufferInheritanceRenderingInfoKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->viewMask) == (b->viewMask))) { onFail("a->viewMask (Error: Value not equal)"); };
-    if (!((a->colorAttachmentCount) == (b->colorAttachmentCount))) { onFail("a->colorAttachmentCount (Error: Value not equal)"); };
-    if (!((a->colorAttachmentCount) == (b->colorAttachmentCount))) { onFail("a->pColorAttachmentFormats (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pColorAttachmentFormats, b->pColorAttachmentFormats, a->colorAttachmentCount * sizeof(const VkFormat)) == 0))) { onFail("a->pColorAttachmentFormats (Error: Unequal dyn array)"); };
-    if (!((a->depthAttachmentFormat) == (b->depthAttachmentFormat))) { onFail("a->depthAttachmentFormat (Error: Value not equal)"); };
-    if (!((a->stencilAttachmentFormat) == (b->stencilAttachmentFormat))) { onFail("a->stencilAttachmentFormat (Error: Value not equal)"); };
-    if (!((a->rasterizationSamples) == (b->rasterizationSamples))) { onFail("a->rasterizationSamples (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->viewMask) == (b->viewMask))) {
+        onFail("a->viewMask (Error: Value not equal)");
+    };
+    if (!((a->colorAttachmentCount) == (b->colorAttachmentCount))) {
+        onFail("a->colorAttachmentCount (Error: Value not equal)");
+    };
+    if (!((a->colorAttachmentCount) == (b->colorAttachmentCount))) {
+        onFail("a->pColorAttachmentFormats (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pColorAttachmentFormats, b->pColorAttachmentFormats,
+                  a->colorAttachmentCount * sizeof(const VkFormat)) == 0))) {
+        onFail("a->pColorAttachmentFormats (Error: Unequal dyn array)");
+    };
+    if (!((a->depthAttachmentFormat) == (b->depthAttachmentFormat))) {
+        onFail("a->depthAttachmentFormat (Error: Value not equal)");
+    };
+    if (!((a->stencilAttachmentFormat) == (b->stencilAttachmentFormat))) {
+        onFail("a->stencilAttachmentFormat (Error: Value not equal)");
+    };
+    if (!((a->rasterizationSamples) == (b->rasterizationSamples))) {
+        onFail("a->rasterizationSamples (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkRenderingFragmentShadingRateAttachmentInfoKHR(
     const VkRenderingFragmentShadingRateAttachmentInfoKHR* a,
-    const VkRenderingFragmentShadingRateAttachmentInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkRenderingFragmentShadingRateAttachmentInfoKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->imageView) == (b->imageView))) { onFail("a->imageView (Error: Value not equal)"); };
-    if (!((a->imageLayout) == (b->imageLayout))) { onFail("a->imageLayout (Error: Value not equal)"); };
-    checkEqual_VkExtent2D(&a->shadingRateAttachmentTexelSize, &b->shadingRateAttachmentTexelSize, onFail);
+    if (!((a->imageView) == (b->imageView))) {
+        onFail("a->imageView (Error: Value not equal)");
+    };
+    if (!((a->imageLayout) == (b->imageLayout))) {
+        onFail("a->imageLayout (Error: Value not equal)");
+    };
+    checkEqual_VkExtent2D(&a->shadingRateAttachmentTexelSize, &b->shadingRateAttachmentTexelSize,
+                          onFail);
 }
 
 void checkEqual_VkRenderingFragmentDensityMapAttachmentInfoEXT(
     const VkRenderingFragmentDensityMapAttachmentInfoEXT* a,
-    const VkRenderingFragmentDensityMapAttachmentInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkRenderingFragmentDensityMapAttachmentInfoEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->imageView) == (b->imageView))) { onFail("a->imageView (Error: Value not equal)"); };
-    if (!((a->imageLayout) == (b->imageLayout))) { onFail("a->imageLayout (Error: Value not equal)"); };
+    if (!((a->imageView) == (b->imageView))) {
+        onFail("a->imageView (Error: Value not equal)");
+    };
+    if (!((a->imageLayout) == (b->imageLayout))) {
+        onFail("a->imageLayout (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkAttachmentSampleCountInfoAMD(
-    const VkAttachmentSampleCountInfoAMD* a,
-    const VkAttachmentSampleCountInfoAMD* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkAttachmentSampleCountInfoAMD(const VkAttachmentSampleCountInfoAMD* a,
+                                               const VkAttachmentSampleCountInfoAMD* b,
+                                               OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->colorAttachmentCount) == (b->colorAttachmentCount))) { onFail("a->colorAttachmentCount (Error: Value not equal)"); };
-    if (!((!(a->pColorAttachmentSamples) && !(b->pColorAttachmentSamples)) || ((a->pColorAttachmentSamples) && (b->pColorAttachmentSamples)))) { onFail("a->pColorAttachmentSamples (Error: Mismatch in optional field)"); };
-    if (a->pColorAttachmentSamples && b->pColorAttachmentSamples)
-    {
-        if (!((a->colorAttachmentCount) == (b->colorAttachmentCount))) { onFail("a->pColorAttachmentSamples (Error: Lengths not equal)"); };
-        if (!((memcmp(a->pColorAttachmentSamples, b->pColorAttachmentSamples, a->colorAttachmentCount * sizeof(const VkSampleCountFlagBits)) == 0))) { onFail("a->pColorAttachmentSamples (Error: Unequal dyn array)"); };
+    if (!((a->colorAttachmentCount) == (b->colorAttachmentCount))) {
+        onFail("a->colorAttachmentCount (Error: Value not equal)");
+    };
+    if (!((!(a->pColorAttachmentSamples) && !(b->pColorAttachmentSamples)) ||
+          ((a->pColorAttachmentSamples) && (b->pColorAttachmentSamples)))) {
+        onFail("a->pColorAttachmentSamples (Error: Mismatch in optional field)");
+    };
+    if (a->pColorAttachmentSamples && b->pColorAttachmentSamples) {
+        if (!((a->colorAttachmentCount) == (b->colorAttachmentCount))) {
+            onFail("a->pColorAttachmentSamples (Error: Lengths not equal)");
+        };
+        if (!((memcmp(a->pColorAttachmentSamples, b->pColorAttachmentSamples,
+                      a->colorAttachmentCount * sizeof(const VkSampleCountFlagBits)) == 0))) {
+            onFail("a->pColorAttachmentSamples (Error: Unequal dyn array)");
+        };
     }
-    if (!((a->depthStencilAttachmentSamples) == (b->depthStencilAttachmentSamples))) { onFail("a->depthStencilAttachmentSamples (Error: Value not equal)"); };
+    if (!((a->depthStencilAttachmentSamples) == (b->depthStencilAttachmentSamples))) {
+        onFail("a->depthStencilAttachmentSamples (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkMultiviewPerViewAttributesInfoNVX(
-    const VkMultiviewPerViewAttributesInfoNVX* a,
-    const VkMultiviewPerViewAttributesInfoNVX* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkMultiviewPerViewAttributesInfoNVX(const VkMultiviewPerViewAttributesInfoNVX* a,
+                                                    const VkMultiviewPerViewAttributesInfoNVX* b,
+                                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->perViewAttributes) == (b->perViewAttributes))) { onFail("a->perViewAttributes (Error: Value not equal)"); };
-    if (!((a->perViewAttributesPositionXOnly) == (b->perViewAttributesPositionXOnly))) { onFail("a->perViewAttributesPositionXOnly (Error: Value not equal)"); };
+    if (!((a->perViewAttributes) == (b->perViewAttributes))) {
+        onFail("a->perViewAttributes (Error: Value not equal)");
+    };
+    if (!((a->perViewAttributesPositionXOnly) == (b->perViewAttributesPositionXOnly))) {
+        onFail("a->perViewAttributesPositionXOnly (Error: Value not equal)");
+    };
 }
 
 #endif
@@ -5266,134 +7448,183 @@
 #ifdef VK_KHR_external_memory
 #endif
 #ifdef VK_KHR_external_memory_win32
-void checkEqual_VkImportMemoryWin32HandleInfoKHR(
-    const VkImportMemoryWin32HandleInfoKHR* a,
-    const VkImportMemoryWin32HandleInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkImportMemoryWin32HandleInfoKHR(const VkImportMemoryWin32HandleInfoKHR* a,
+                                                 const VkImportMemoryWin32HandleInfoKHR* b,
+                                                 OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->handleType) == (b->handleType))) { onFail("a->handleType (Error: Value not equal)"); };
-    if (!((a->handle) == (b->handle))) { onFail("a->handle (Error: Value not equal)"); };
-    if (!((a->name) == (b->name))) { onFail("a->name (Error: Value not equal)"); };
+    if (!((a->handleType) == (b->handleType))) {
+        onFail("a->handleType (Error: Value not equal)");
+    };
+    if (!((a->handle) == (b->handle))) {
+        onFail("a->handle (Error: Value not equal)");
+    };
+    if (!((a->name) == (b->name))) {
+        onFail("a->name (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkExportMemoryWin32HandleInfoKHR(
-    const VkExportMemoryWin32HandleInfoKHR* a,
-    const VkExportMemoryWin32HandleInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkExportMemoryWin32HandleInfoKHR(const VkExportMemoryWin32HandleInfoKHR* a,
+                                                 const VkExportMemoryWin32HandleInfoKHR* b,
+                                                 OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((!(a->pAttributes) && !(b->pAttributes)) || ((a->pAttributes) && (b->pAttributes)))) { onFail("a->pAttributes (Error: Mismatch in optional field)"); };
-    if (a->pAttributes && b->pAttributes)
-    {
-        if (!((memcmp(a->pAttributes, b->pAttributes, sizeof(const SECURITY_ATTRIBUTES)) == 0))) { onFail("a->pAttributes (Error: Unequal dyn array)"); };
+    if (!((!(a->pAttributes) && !(b->pAttributes)) || ((a->pAttributes) && (b->pAttributes)))) {
+        onFail("a->pAttributes (Error: Mismatch in optional field)");
+    };
+    if (a->pAttributes && b->pAttributes) {
+        if (!((memcmp(a->pAttributes, b->pAttributes, sizeof(const SECURITY_ATTRIBUTES)) == 0))) {
+            onFail("a->pAttributes (Error: Unequal dyn array)");
+        };
     }
-    if (!((a->dwAccess) == (b->dwAccess))) { onFail("a->dwAccess (Error: Value not equal)"); };
-    if (!((a->name) == (b->name))) { onFail("a->name (Error: Value not equal)"); };
+    if (!((a->dwAccess) == (b->dwAccess))) {
+        onFail("a->dwAccess (Error: Value not equal)");
+    };
+    if (!((a->name) == (b->name))) {
+        onFail("a->name (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkMemoryWin32HandlePropertiesKHR(
-    const VkMemoryWin32HandlePropertiesKHR* a,
-    const VkMemoryWin32HandlePropertiesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkMemoryWin32HandlePropertiesKHR(const VkMemoryWin32HandlePropertiesKHR* a,
+                                                 const VkMemoryWin32HandlePropertiesKHR* b,
+                                                 OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->memoryTypeBits) == (b->memoryTypeBits))) { onFail("a->memoryTypeBits (Error: Value not equal)"); };
+    if (!((a->memoryTypeBits) == (b->memoryTypeBits))) {
+        onFail("a->memoryTypeBits (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkMemoryGetWin32HandleInfoKHR(
-    const VkMemoryGetWin32HandleInfoKHR* a,
-    const VkMemoryGetWin32HandleInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkMemoryGetWin32HandleInfoKHR(const VkMemoryGetWin32HandleInfoKHR* a,
+                                              const VkMemoryGetWin32HandleInfoKHR* b,
+                                              OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->memory) == (b->memory))) { onFail("a->memory (Error: Value not equal)"); };
-    if (!((a->handleType) == (b->handleType))) { onFail("a->handleType (Error: Value not equal)"); };
+    if (!((a->memory) == (b->memory))) {
+        onFail("a->memory (Error: Value not equal)");
+    };
+    if (!((a->handleType) == (b->handleType))) {
+        onFail("a->handleType (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_KHR_external_memory_fd
-void checkEqual_VkImportMemoryFdInfoKHR(
-    const VkImportMemoryFdInfoKHR* a,
-    const VkImportMemoryFdInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkImportMemoryFdInfoKHR(const VkImportMemoryFdInfoKHR* a,
+                                        const VkImportMemoryFdInfoKHR* b,
+                                        OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->handleType) == (b->handleType))) { onFail("a->handleType (Error: Value not equal)"); };
-    if (!((a->fd) == (b->fd))) { onFail("a->fd (Error: Value not equal)"); };
+    if (!((a->handleType) == (b->handleType))) {
+        onFail("a->handleType (Error: Value not equal)");
+    };
+    if (!((a->fd) == (b->fd))) {
+        onFail("a->fd (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkMemoryFdPropertiesKHR(
-    const VkMemoryFdPropertiesKHR* a,
-    const VkMemoryFdPropertiesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkMemoryFdPropertiesKHR(const VkMemoryFdPropertiesKHR* a,
+                                        const VkMemoryFdPropertiesKHR* b,
+                                        OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->memoryTypeBits) == (b->memoryTypeBits))) { onFail("a->memoryTypeBits (Error: Value not equal)"); };
+    if (!((a->memoryTypeBits) == (b->memoryTypeBits))) {
+        onFail("a->memoryTypeBits (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkMemoryGetFdInfoKHR(
-    const VkMemoryGetFdInfoKHR* a,
-    const VkMemoryGetFdInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkMemoryGetFdInfoKHR(const VkMemoryGetFdInfoKHR* a, const VkMemoryGetFdInfoKHR* b,
+                                     OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->memory) == (b->memory))) { onFail("a->memory (Error: Value not equal)"); };
-    if (!((a->handleType) == (b->handleType))) { onFail("a->handleType (Error: Value not equal)"); };
+    if (!((a->memory) == (b->memory))) {
+        onFail("a->memory (Error: Value not equal)");
+    };
+    if (!((a->handleType) == (b->handleType))) {
+        onFail("a->handleType (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_KHR_win32_keyed_mutex
 void checkEqual_VkWin32KeyedMutexAcquireReleaseInfoKHR(
     const VkWin32KeyedMutexAcquireReleaseInfoKHR* a,
-    const VkWin32KeyedMutexAcquireReleaseInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkWin32KeyedMutexAcquireReleaseInfoKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->acquireCount) == (b->acquireCount))) { onFail("a->acquireCount (Error: Value not equal)"); };
-    if (!((a->acquireCount) == (b->acquireCount))) { onFail("a->pAcquireSyncs (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pAcquireSyncs, b->pAcquireSyncs, a->acquireCount * sizeof(const VkDeviceMemory)) == 0))) { onFail("a->pAcquireSyncs (Error: Unequal dyn array)"); };
-    if (!((a->acquireCount) == (b->acquireCount))) { onFail("a->pAcquireKeys (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pAcquireKeys, b->pAcquireKeys, a->acquireCount * sizeof(const uint64_t)) == 0))) { onFail("a->pAcquireKeys (Error: Unequal dyn array)"); };
-    if (!((a->acquireCount) == (b->acquireCount))) { onFail("a->pAcquireTimeouts (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pAcquireTimeouts, b->pAcquireTimeouts, a->acquireCount * sizeof(const uint32_t)) == 0))) { onFail("a->pAcquireTimeouts (Error: Unequal dyn array)"); };
-    if (!((a->releaseCount) == (b->releaseCount))) { onFail("a->releaseCount (Error: Value not equal)"); };
-    if (!((a->releaseCount) == (b->releaseCount))) { onFail("a->pReleaseSyncs (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pReleaseSyncs, b->pReleaseSyncs, a->releaseCount * sizeof(const VkDeviceMemory)) == 0))) { onFail("a->pReleaseSyncs (Error: Unequal dyn array)"); };
-    if (!((a->releaseCount) == (b->releaseCount))) { onFail("a->pReleaseKeys (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pReleaseKeys, b->pReleaseKeys, a->releaseCount * sizeof(const uint64_t)) == 0))) { onFail("a->pReleaseKeys (Error: Unequal dyn array)"); };
+    if (!((a->acquireCount) == (b->acquireCount))) {
+        onFail("a->acquireCount (Error: Value not equal)");
+    };
+    if (!((a->acquireCount) == (b->acquireCount))) {
+        onFail("a->pAcquireSyncs (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pAcquireSyncs, b->pAcquireSyncs,
+                  a->acquireCount * sizeof(const VkDeviceMemory)) == 0))) {
+        onFail("a->pAcquireSyncs (Error: Unequal dyn array)");
+    };
+    if (!((a->acquireCount) == (b->acquireCount))) {
+        onFail("a->pAcquireKeys (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pAcquireKeys, b->pAcquireKeys, a->acquireCount * sizeof(const uint64_t)) ==
+           0))) {
+        onFail("a->pAcquireKeys (Error: Unequal dyn array)");
+    };
+    if (!((a->acquireCount) == (b->acquireCount))) {
+        onFail("a->pAcquireTimeouts (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pAcquireTimeouts, b->pAcquireTimeouts,
+                  a->acquireCount * sizeof(const uint32_t)) == 0))) {
+        onFail("a->pAcquireTimeouts (Error: Unequal dyn array)");
+    };
+    if (!((a->releaseCount) == (b->releaseCount))) {
+        onFail("a->releaseCount (Error: Value not equal)");
+    };
+    if (!((a->releaseCount) == (b->releaseCount))) {
+        onFail("a->pReleaseSyncs (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pReleaseSyncs, b->pReleaseSyncs,
+                  a->releaseCount * sizeof(const VkDeviceMemory)) == 0))) {
+        onFail("a->pReleaseSyncs (Error: Unequal dyn array)");
+    };
+    if (!((a->releaseCount) == (b->releaseCount))) {
+        onFail("a->pReleaseKeys (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pReleaseKeys, b->pReleaseKeys, a->releaseCount * sizeof(const uint64_t)) ==
+           0))) {
+        onFail("a->pReleaseKeys (Error: Unequal dyn array)");
+    };
 }
 
 #endif
@@ -5402,127 +7633,173 @@
 #ifdef VK_KHR_external_semaphore
 #endif
 #ifdef VK_KHR_external_semaphore_win32
-void checkEqual_VkImportSemaphoreWin32HandleInfoKHR(
-    const VkImportSemaphoreWin32HandleInfoKHR* a,
-    const VkImportSemaphoreWin32HandleInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkImportSemaphoreWin32HandleInfoKHR(const VkImportSemaphoreWin32HandleInfoKHR* a,
+                                                    const VkImportSemaphoreWin32HandleInfoKHR* b,
+                                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->semaphore) == (b->semaphore))) { onFail("a->semaphore (Error: Value not equal)"); };
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->handleType) == (b->handleType))) { onFail("a->handleType (Error: Value not equal)"); };
-    if (!((a->handle) == (b->handle))) { onFail("a->handle (Error: Value not equal)"); };
-    if (!((a->name) == (b->name))) { onFail("a->name (Error: Value not equal)"); };
+    if (!((a->semaphore) == (b->semaphore))) {
+        onFail("a->semaphore (Error: Value not equal)");
+    };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->handleType) == (b->handleType))) {
+        onFail("a->handleType (Error: Value not equal)");
+    };
+    if (!((a->handle) == (b->handle))) {
+        onFail("a->handle (Error: Value not equal)");
+    };
+    if (!((a->name) == (b->name))) {
+        onFail("a->name (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkExportSemaphoreWin32HandleInfoKHR(
-    const VkExportSemaphoreWin32HandleInfoKHR* a,
-    const VkExportSemaphoreWin32HandleInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkExportSemaphoreWin32HandleInfoKHR(const VkExportSemaphoreWin32HandleInfoKHR* a,
+                                                    const VkExportSemaphoreWin32HandleInfoKHR* b,
+                                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((!(a->pAttributes) && !(b->pAttributes)) || ((a->pAttributes) && (b->pAttributes)))) { onFail("a->pAttributes (Error: Mismatch in optional field)"); };
-    if (a->pAttributes && b->pAttributes)
-    {
-        if (!((memcmp(a->pAttributes, b->pAttributes, sizeof(const SECURITY_ATTRIBUTES)) == 0))) { onFail("a->pAttributes (Error: Unequal dyn array)"); };
+    if (!((!(a->pAttributes) && !(b->pAttributes)) || ((a->pAttributes) && (b->pAttributes)))) {
+        onFail("a->pAttributes (Error: Mismatch in optional field)");
+    };
+    if (a->pAttributes && b->pAttributes) {
+        if (!((memcmp(a->pAttributes, b->pAttributes, sizeof(const SECURITY_ATTRIBUTES)) == 0))) {
+            onFail("a->pAttributes (Error: Unequal dyn array)");
+        };
     }
-    if (!((a->dwAccess) == (b->dwAccess))) { onFail("a->dwAccess (Error: Value not equal)"); };
-    if (!((a->name) == (b->name))) { onFail("a->name (Error: Value not equal)"); };
+    if (!((a->dwAccess) == (b->dwAccess))) {
+        onFail("a->dwAccess (Error: Value not equal)");
+    };
+    if (!((a->name) == (b->name))) {
+        onFail("a->name (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkD3D12FenceSubmitInfoKHR(
-    const VkD3D12FenceSubmitInfoKHR* a,
-    const VkD3D12FenceSubmitInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkD3D12FenceSubmitInfoKHR(const VkD3D12FenceSubmitInfoKHR* a,
+                                          const VkD3D12FenceSubmitInfoKHR* b,
+                                          OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->waitSemaphoreValuesCount) == (b->waitSemaphoreValuesCount))) { onFail("a->waitSemaphoreValuesCount (Error: Value not equal)"); };
-    if (!((!(a->pWaitSemaphoreValues) && !(b->pWaitSemaphoreValues)) || ((a->pWaitSemaphoreValues) && (b->pWaitSemaphoreValues)))) { onFail("a->pWaitSemaphoreValues (Error: Mismatch in optional field)"); };
-    if (a->pWaitSemaphoreValues && b->pWaitSemaphoreValues)
-    {
-        if (!((a->waitSemaphoreValuesCount) == (b->waitSemaphoreValuesCount))) { onFail("a->pWaitSemaphoreValues (Error: Lengths not equal)"); };
-        if (!((memcmp(a->pWaitSemaphoreValues, b->pWaitSemaphoreValues, a->waitSemaphoreValuesCount * sizeof(const uint64_t)) == 0))) { onFail("a->pWaitSemaphoreValues (Error: Unequal dyn array)"); };
+    if (!((a->waitSemaphoreValuesCount) == (b->waitSemaphoreValuesCount))) {
+        onFail("a->waitSemaphoreValuesCount (Error: Value not equal)");
+    };
+    if (!((!(a->pWaitSemaphoreValues) && !(b->pWaitSemaphoreValues)) ||
+          ((a->pWaitSemaphoreValues) && (b->pWaitSemaphoreValues)))) {
+        onFail("a->pWaitSemaphoreValues (Error: Mismatch in optional field)");
+    };
+    if (a->pWaitSemaphoreValues && b->pWaitSemaphoreValues) {
+        if (!((a->waitSemaphoreValuesCount) == (b->waitSemaphoreValuesCount))) {
+            onFail("a->pWaitSemaphoreValues (Error: Lengths not equal)");
+        };
+        if (!((memcmp(a->pWaitSemaphoreValues, b->pWaitSemaphoreValues,
+                      a->waitSemaphoreValuesCount * sizeof(const uint64_t)) == 0))) {
+            onFail("a->pWaitSemaphoreValues (Error: Unequal dyn array)");
+        };
     }
-    if (!((a->signalSemaphoreValuesCount) == (b->signalSemaphoreValuesCount))) { onFail("a->signalSemaphoreValuesCount (Error: Value not equal)"); };
-    if (!((!(a->pSignalSemaphoreValues) && !(b->pSignalSemaphoreValues)) || ((a->pSignalSemaphoreValues) && (b->pSignalSemaphoreValues)))) { onFail("a->pSignalSemaphoreValues (Error: Mismatch in optional field)"); };
-    if (a->pSignalSemaphoreValues && b->pSignalSemaphoreValues)
-    {
-        if (!((a->signalSemaphoreValuesCount) == (b->signalSemaphoreValuesCount))) { onFail("a->pSignalSemaphoreValues (Error: Lengths not equal)"); };
-        if (!((memcmp(a->pSignalSemaphoreValues, b->pSignalSemaphoreValues, a->signalSemaphoreValuesCount * sizeof(const uint64_t)) == 0))) { onFail("a->pSignalSemaphoreValues (Error: Unequal dyn array)"); };
+    if (!((a->signalSemaphoreValuesCount) == (b->signalSemaphoreValuesCount))) {
+        onFail("a->signalSemaphoreValuesCount (Error: Value not equal)");
+    };
+    if (!((!(a->pSignalSemaphoreValues) && !(b->pSignalSemaphoreValues)) ||
+          ((a->pSignalSemaphoreValues) && (b->pSignalSemaphoreValues)))) {
+        onFail("a->pSignalSemaphoreValues (Error: Mismatch in optional field)");
+    };
+    if (a->pSignalSemaphoreValues && b->pSignalSemaphoreValues) {
+        if (!((a->signalSemaphoreValuesCount) == (b->signalSemaphoreValuesCount))) {
+            onFail("a->pSignalSemaphoreValues (Error: Lengths not equal)");
+        };
+        if (!((memcmp(a->pSignalSemaphoreValues, b->pSignalSemaphoreValues,
+                      a->signalSemaphoreValuesCount * sizeof(const uint64_t)) == 0))) {
+            onFail("a->pSignalSemaphoreValues (Error: Unequal dyn array)");
+        };
     }
 }
 
-void checkEqual_VkSemaphoreGetWin32HandleInfoKHR(
-    const VkSemaphoreGetWin32HandleInfoKHR* a,
-    const VkSemaphoreGetWin32HandleInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkSemaphoreGetWin32HandleInfoKHR(const VkSemaphoreGetWin32HandleInfoKHR* a,
+                                                 const VkSemaphoreGetWin32HandleInfoKHR* b,
+                                                 OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->semaphore) == (b->semaphore))) { onFail("a->semaphore (Error: Value not equal)"); };
-    if (!((a->handleType) == (b->handleType))) { onFail("a->handleType (Error: Value not equal)"); };
+    if (!((a->semaphore) == (b->semaphore))) {
+        onFail("a->semaphore (Error: Value not equal)");
+    };
+    if (!((a->handleType) == (b->handleType))) {
+        onFail("a->handleType (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_KHR_external_semaphore_fd
-void checkEqual_VkImportSemaphoreFdInfoKHR(
-    const VkImportSemaphoreFdInfoKHR* a,
-    const VkImportSemaphoreFdInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkImportSemaphoreFdInfoKHR(const VkImportSemaphoreFdInfoKHR* a,
+                                           const VkImportSemaphoreFdInfoKHR* b,
+                                           OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->semaphore) == (b->semaphore))) { onFail("a->semaphore (Error: Value not equal)"); };
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->handleType) == (b->handleType))) { onFail("a->handleType (Error: Value not equal)"); };
-    if (!((a->fd) == (b->fd))) { onFail("a->fd (Error: Value not equal)"); };
+    if (!((a->semaphore) == (b->semaphore))) {
+        onFail("a->semaphore (Error: Value not equal)");
+    };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->handleType) == (b->handleType))) {
+        onFail("a->handleType (Error: Value not equal)");
+    };
+    if (!((a->fd) == (b->fd))) {
+        onFail("a->fd (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkSemaphoreGetFdInfoKHR(
-    const VkSemaphoreGetFdInfoKHR* a,
-    const VkSemaphoreGetFdInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkSemaphoreGetFdInfoKHR(const VkSemaphoreGetFdInfoKHR* a,
+                                        const VkSemaphoreGetFdInfoKHR* b,
+                                        OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->semaphore) == (b->semaphore))) { onFail("a->semaphore (Error: Value not equal)"); };
-    if (!((a->handleType) == (b->handleType))) { onFail("a->handleType (Error: Value not equal)"); };
+    if (!((a->semaphore) == (b->semaphore))) {
+        onFail("a->semaphore (Error: Value not equal)");
+    };
+    if (!((a->handleType) == (b->handleType))) {
+        onFail("a->handleType (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_KHR_push_descriptor
 void checkEqual_VkPhysicalDevicePushDescriptorPropertiesKHR(
     const VkPhysicalDevicePushDescriptorPropertiesKHR* a,
-    const VkPhysicalDevicePushDescriptorPropertiesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDevicePushDescriptorPropertiesKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->maxPushDescriptors) == (b->maxPushDescriptors))) { onFail("a->maxPushDescriptors (Error: Value not equal)"); };
+    if (!((a->maxPushDescriptors) == (b->maxPushDescriptors))) {
+        onFail("a->maxPushDescriptors (Error: Value not equal)");
+    };
 }
 
 #endif
@@ -5531,34 +7808,31 @@
 #ifdef VK_KHR_16bit_storage
 #endif
 #ifdef VK_KHR_incremental_present
-void checkEqual_VkRectLayerKHR(
-    const VkRectLayerKHR* a,
-    const VkRectLayerKHR* b,
-    OnFailCompareFunc onFail)
-{
+void checkEqual_VkRectLayerKHR(const VkRectLayerKHR* a, const VkRectLayerKHR* b,
+                               OnFailCompareFunc onFail) {
     checkEqual_VkOffset2D(&a->offset, &b->offset, onFail);
     checkEqual_VkExtent2D(&a->extent, &b->extent, onFail);
-    if (!((a->layer) == (b->layer))) { onFail("a->layer (Error: Value not equal)"); };
+    if (!((a->layer) == (b->layer))) {
+        onFail("a->layer (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkPresentRegionKHR(
-    const VkPresentRegionKHR* a,
-    const VkPresentRegionKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->rectangleCount) == (b->rectangleCount))) { onFail("a->rectangleCount (Error: Value not equal)"); };
-    if (!((!(a->pRectangles) && !(b->pRectangles)) || ((a->pRectangles) && (b->pRectangles)))) { onFail("a->pRectangles (Error: Mismatch in optional field)"); };
-    if (a->pRectangles && b->pRectangles)
-    {
-        if ((a->pRectangles) && (b->pRectangles))
-        {
-            if (!((a->rectangleCount) == (b->rectangleCount))) { onFail("a->pRectangles (Error: Lengths not equal)"); };
-            if ((a->rectangleCount) == (b->rectangleCount))
-            {
-                if (a)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)a->rectangleCount; ++i)
-                    {
+void checkEqual_VkPresentRegionKHR(const VkPresentRegionKHR* a, const VkPresentRegionKHR* b,
+                                   OnFailCompareFunc onFail) {
+    if (!((a->rectangleCount) == (b->rectangleCount))) {
+        onFail("a->rectangleCount (Error: Value not equal)");
+    };
+    if (!((!(a->pRectangles) && !(b->pRectangles)) || ((a->pRectangles) && (b->pRectangles)))) {
+        onFail("a->pRectangles (Error: Mismatch in optional field)");
+    };
+    if (a->pRectangles && b->pRectangles) {
+        if ((a->pRectangles) && (b->pRectangles)) {
+            if (!((a->rectangleCount) == (b->rectangleCount))) {
+                onFail("a->pRectangles (Error: Lengths not equal)");
+            };
+            if ((a->rectangleCount) == (b->rectangleCount)) {
+                if (a) {
+                    for (uint32_t i = 0; i < (uint32_t)a->rectangleCount; ++i) {
                         checkEqual_VkRectLayerKHR(a->pRectangles + i, b->pRectangles + i, onFail);
                     }
                 }
@@ -5567,29 +7841,28 @@
     }
 }
 
-void checkEqual_VkPresentRegionsKHR(
-    const VkPresentRegionsKHR* a,
-    const VkPresentRegionsKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPresentRegionsKHR(const VkPresentRegionsKHR* a, const VkPresentRegionsKHR* b,
+                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->swapchainCount) == (b->swapchainCount))) { onFail("a->swapchainCount (Error: Value not equal)"); };
-    if (!((!(a->pRegions) && !(b->pRegions)) || ((a->pRegions) && (b->pRegions)))) { onFail("a->pRegions (Error: Mismatch in optional field)"); };
-    if (a->pRegions && b->pRegions)
-    {
-        if ((a->pRegions) && (b->pRegions))
-        {
-            if (!((a->swapchainCount) == (b->swapchainCount))) { onFail("a->pRegions (Error: Lengths not equal)"); };
-            if ((a->swapchainCount) == (b->swapchainCount))
-            {
-                if (a)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)a->swapchainCount; ++i)
-                    {
+    if (!((a->swapchainCount) == (b->swapchainCount))) {
+        onFail("a->swapchainCount (Error: Value not equal)");
+    };
+    if (!((!(a->pRegions) && !(b->pRegions)) || ((a->pRegions) && (b->pRegions)))) {
+        onFail("a->pRegions (Error: Mismatch in optional field)");
+    };
+    if (a->pRegions && b->pRegions) {
+        if ((a->pRegions) && (b->pRegions)) {
+            if (!((a->swapchainCount) == (b->swapchainCount))) {
+                onFail("a->pRegions (Error: Lengths not equal)");
+            };
+            if ((a->swapchainCount) == (b->swapchainCount)) {
+                if (a) {
+                    for (uint32_t i = 0; i < (uint32_t)a->swapchainCount; ++i) {
                         checkEqual_VkPresentRegionKHR(a->pRegions + i, b->pRegions + i, onFail);
                     }
                 }
@@ -5607,16 +7880,17 @@
 #endif
 #ifdef VK_KHR_shared_presentable_image
 void checkEqual_VkSharedPresentSurfaceCapabilitiesKHR(
-    const VkSharedPresentSurfaceCapabilitiesKHR* a,
-    const VkSharedPresentSurfaceCapabilitiesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkSharedPresentSurfaceCapabilitiesKHR* a, const VkSharedPresentSurfaceCapabilitiesKHR* b,
+    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->sharedPresentSupportedUsageFlags) == (b->sharedPresentSupportedUsageFlags))) { onFail("a->sharedPresentSupportedUsageFlags (Error: Value not equal)"); };
+    if (!((a->sharedPresentSupportedUsageFlags) == (b->sharedPresentSupportedUsageFlags))) {
+        onFail("a->sharedPresentSupportedUsageFlags (Error: Value not equal)");
+    };
 }
 
 #endif
@@ -5625,243 +7899,307 @@
 #ifdef VK_KHR_external_fence
 #endif
 #ifdef VK_KHR_external_fence_win32
-void checkEqual_VkImportFenceWin32HandleInfoKHR(
-    const VkImportFenceWin32HandleInfoKHR* a,
-    const VkImportFenceWin32HandleInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkImportFenceWin32HandleInfoKHR(const VkImportFenceWin32HandleInfoKHR* a,
+                                                const VkImportFenceWin32HandleInfoKHR* b,
+                                                OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->fence) == (b->fence))) { onFail("a->fence (Error: Value not equal)"); };
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->handleType) == (b->handleType))) { onFail("a->handleType (Error: Value not equal)"); };
-    if (!((a->handle) == (b->handle))) { onFail("a->handle (Error: Value not equal)"); };
-    if (!((a->name) == (b->name))) { onFail("a->name (Error: Value not equal)"); };
+    if (!((a->fence) == (b->fence))) {
+        onFail("a->fence (Error: Value not equal)");
+    };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->handleType) == (b->handleType))) {
+        onFail("a->handleType (Error: Value not equal)");
+    };
+    if (!((a->handle) == (b->handle))) {
+        onFail("a->handle (Error: Value not equal)");
+    };
+    if (!((a->name) == (b->name))) {
+        onFail("a->name (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkExportFenceWin32HandleInfoKHR(
-    const VkExportFenceWin32HandleInfoKHR* a,
-    const VkExportFenceWin32HandleInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkExportFenceWin32HandleInfoKHR(const VkExportFenceWin32HandleInfoKHR* a,
+                                                const VkExportFenceWin32HandleInfoKHR* b,
+                                                OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((!(a->pAttributes) && !(b->pAttributes)) || ((a->pAttributes) && (b->pAttributes)))) { onFail("a->pAttributes (Error: Mismatch in optional field)"); };
-    if (a->pAttributes && b->pAttributes)
-    {
-        if (!((memcmp(a->pAttributes, b->pAttributes, sizeof(const SECURITY_ATTRIBUTES)) == 0))) { onFail("a->pAttributes (Error: Unequal dyn array)"); };
+    if (!((!(a->pAttributes) && !(b->pAttributes)) || ((a->pAttributes) && (b->pAttributes)))) {
+        onFail("a->pAttributes (Error: Mismatch in optional field)");
+    };
+    if (a->pAttributes && b->pAttributes) {
+        if (!((memcmp(a->pAttributes, b->pAttributes, sizeof(const SECURITY_ATTRIBUTES)) == 0))) {
+            onFail("a->pAttributes (Error: Unequal dyn array)");
+        };
     }
-    if (!((a->dwAccess) == (b->dwAccess))) { onFail("a->dwAccess (Error: Value not equal)"); };
-    if (!((a->name) == (b->name))) { onFail("a->name (Error: Value not equal)"); };
+    if (!((a->dwAccess) == (b->dwAccess))) {
+        onFail("a->dwAccess (Error: Value not equal)");
+    };
+    if (!((a->name) == (b->name))) {
+        onFail("a->name (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkFenceGetWin32HandleInfoKHR(
-    const VkFenceGetWin32HandleInfoKHR* a,
-    const VkFenceGetWin32HandleInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkFenceGetWin32HandleInfoKHR(const VkFenceGetWin32HandleInfoKHR* a,
+                                             const VkFenceGetWin32HandleInfoKHR* b,
+                                             OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->fence) == (b->fence))) { onFail("a->fence (Error: Value not equal)"); };
-    if (!((a->handleType) == (b->handleType))) { onFail("a->handleType (Error: Value not equal)"); };
+    if (!((a->fence) == (b->fence))) {
+        onFail("a->fence (Error: Value not equal)");
+    };
+    if (!((a->handleType) == (b->handleType))) {
+        onFail("a->handleType (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_KHR_external_fence_fd
-void checkEqual_VkImportFenceFdInfoKHR(
-    const VkImportFenceFdInfoKHR* a,
-    const VkImportFenceFdInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkImportFenceFdInfoKHR(const VkImportFenceFdInfoKHR* a,
+                                       const VkImportFenceFdInfoKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->fence) == (b->fence))) { onFail("a->fence (Error: Value not equal)"); };
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->handleType) == (b->handleType))) { onFail("a->handleType (Error: Value not equal)"); };
-    if (!((a->fd) == (b->fd))) { onFail("a->fd (Error: Value not equal)"); };
+    if (!((a->fence) == (b->fence))) {
+        onFail("a->fence (Error: Value not equal)");
+    };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->handleType) == (b->handleType))) {
+        onFail("a->handleType (Error: Value not equal)");
+    };
+    if (!((a->fd) == (b->fd))) {
+        onFail("a->fd (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkFenceGetFdInfoKHR(
-    const VkFenceGetFdInfoKHR* a,
-    const VkFenceGetFdInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkFenceGetFdInfoKHR(const VkFenceGetFdInfoKHR* a, const VkFenceGetFdInfoKHR* b,
+                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->fence) == (b->fence))) { onFail("a->fence (Error: Value not equal)"); };
-    if (!((a->handleType) == (b->handleType))) { onFail("a->handleType (Error: Value not equal)"); };
+    if (!((a->fence) == (b->fence))) {
+        onFail("a->fence (Error: Value not equal)");
+    };
+    if (!((a->handleType) == (b->handleType))) {
+        onFail("a->handleType (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_KHR_performance_query
 void checkEqual_VkPhysicalDevicePerformanceQueryFeaturesKHR(
     const VkPhysicalDevicePerformanceQueryFeaturesKHR* a,
-    const VkPhysicalDevicePerformanceQueryFeaturesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDevicePerformanceQueryFeaturesKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->performanceCounterQueryPools) == (b->performanceCounterQueryPools))) { onFail("a->performanceCounterQueryPools (Error: Value not equal)"); };
-    if (!((a->performanceCounterMultipleQueryPools) == (b->performanceCounterMultipleQueryPools))) { onFail("a->performanceCounterMultipleQueryPools (Error: Value not equal)"); };
+    if (!((a->performanceCounterQueryPools) == (b->performanceCounterQueryPools))) {
+        onFail("a->performanceCounterQueryPools (Error: Value not equal)");
+    };
+    if (!((a->performanceCounterMultipleQueryPools) == (b->performanceCounterMultipleQueryPools))) {
+        onFail("a->performanceCounterMultipleQueryPools (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDevicePerformanceQueryPropertiesKHR(
     const VkPhysicalDevicePerformanceQueryPropertiesKHR* a,
-    const VkPhysicalDevicePerformanceQueryPropertiesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDevicePerformanceQueryPropertiesKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->allowCommandBufferQueryCopies) == (b->allowCommandBufferQueryCopies))) { onFail("a->allowCommandBufferQueryCopies (Error: Value not equal)"); };
+    if (!((a->allowCommandBufferQueryCopies) == (b->allowCommandBufferQueryCopies))) {
+        onFail("a->allowCommandBufferQueryCopies (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkPerformanceCounterKHR(
-    const VkPerformanceCounterKHR* a,
-    const VkPerformanceCounterKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPerformanceCounterKHR(const VkPerformanceCounterKHR* a,
+                                        const VkPerformanceCounterKHR* b,
+                                        OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->unit) == (b->unit))) { onFail("a->unit (Error: Value not equal)"); };
-    if (!((a->scope) == (b->scope))) { onFail("a->scope (Error: Value not equal)"); };
-    if (!((a->storage) == (b->storage))) { onFail("a->storage (Error: Value not equal)"); };
-    if (!((memcmp(a->uuid, b->uuid, VK_UUID_SIZE * sizeof(uint8_t)) == 0))) { onFail("a->uuid (Error: Unequal static array)"); };
+    if (!((a->unit) == (b->unit))) {
+        onFail("a->unit (Error: Value not equal)");
+    };
+    if (!((a->scope) == (b->scope))) {
+        onFail("a->scope (Error: Value not equal)");
+    };
+    if (!((a->storage) == (b->storage))) {
+        onFail("a->storage (Error: Value not equal)");
+    };
+    if (!((memcmp(a->uuid, b->uuid, VK_UUID_SIZE * sizeof(uint8_t)) == 0))) {
+        onFail("a->uuid (Error: Unequal static array)");
+    };
 }
 
-void checkEqual_VkPerformanceCounterDescriptionKHR(
-    const VkPerformanceCounterDescriptionKHR* a,
-    const VkPerformanceCounterDescriptionKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPerformanceCounterDescriptionKHR(const VkPerformanceCounterDescriptionKHR* a,
+                                                   const VkPerformanceCounterDescriptionKHR* b,
+                                                   OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((memcmp(a->name, b->name, VK_MAX_DESCRIPTION_SIZE * sizeof(char)) == 0))) { onFail("a->name (Error: Unequal static array)"); };
-    if (!((memcmp(a->category, b->category, VK_MAX_DESCRIPTION_SIZE * sizeof(char)) == 0))) { onFail("a->category (Error: Unequal static array)"); };
-    if (!((memcmp(a->description, b->description, VK_MAX_DESCRIPTION_SIZE * sizeof(char)) == 0))) { onFail("a->description (Error: Unequal static array)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((memcmp(a->name, b->name, VK_MAX_DESCRIPTION_SIZE * sizeof(char)) == 0))) {
+        onFail("a->name (Error: Unequal static array)");
+    };
+    if (!((memcmp(a->category, b->category, VK_MAX_DESCRIPTION_SIZE * sizeof(char)) == 0))) {
+        onFail("a->category (Error: Unequal static array)");
+    };
+    if (!((memcmp(a->description, b->description, VK_MAX_DESCRIPTION_SIZE * sizeof(char)) == 0))) {
+        onFail("a->description (Error: Unequal static array)");
+    };
 }
 
-void checkEqual_VkQueryPoolPerformanceCreateInfoKHR(
-    const VkQueryPoolPerformanceCreateInfoKHR* a,
-    const VkQueryPoolPerformanceCreateInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkQueryPoolPerformanceCreateInfoKHR(const VkQueryPoolPerformanceCreateInfoKHR* a,
+                                                    const VkQueryPoolPerformanceCreateInfoKHR* b,
+                                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->queueFamilyIndex) == (b->queueFamilyIndex))) { onFail("a->queueFamilyIndex (Error: Value not equal)"); };
-    if (!((a->counterIndexCount) == (b->counterIndexCount))) { onFail("a->counterIndexCount (Error: Value not equal)"); };
-    if (!((a->counterIndexCount) == (b->counterIndexCount))) { onFail("a->pCounterIndices (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pCounterIndices, b->pCounterIndices, a->counterIndexCount * sizeof(const uint32_t)) == 0))) { onFail("a->pCounterIndices (Error: Unequal dyn array)"); };
+    if (!((a->queueFamilyIndex) == (b->queueFamilyIndex))) {
+        onFail("a->queueFamilyIndex (Error: Value not equal)");
+    };
+    if (!((a->counterIndexCount) == (b->counterIndexCount))) {
+        onFail("a->counterIndexCount (Error: Value not equal)");
+    };
+    if (!((a->counterIndexCount) == (b->counterIndexCount))) {
+        onFail("a->pCounterIndices (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pCounterIndices, b->pCounterIndices,
+                  a->counterIndexCount * sizeof(const uint32_t)) == 0))) {
+        onFail("a->pCounterIndices (Error: Unequal dyn array)");
+    };
 }
 
-void checkEqual_VkPerformanceCounterResultKHR(
-    const VkPerformanceCounterResultKHR* a,
-    const VkPerformanceCounterResultKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->int32) == (b->int32))) { onFail("a->int32 (Error: Value not equal)"); };
-    if (!((a->int64) == (b->int64))) { onFail("a->int64 (Error: Value not equal)"); };
-    if (!((a->uint32) == (b->uint32))) { onFail("a->uint32 (Error: Value not equal)"); };
-    if (!((a->uint64) == (b->uint64))) { onFail("a->uint64 (Error: Value not equal)"); };
-    if (!((a->float32) == (b->float32))) { onFail("a->float32 (Error: Value not equal)"); };
-    if (!((a->float64) == (b->float64))) { onFail("a->float64 (Error: Value not equal)"); };
+void checkEqual_VkPerformanceCounterResultKHR(const VkPerformanceCounterResultKHR* a,
+                                              const VkPerformanceCounterResultKHR* b,
+                                              OnFailCompareFunc onFail) {
+    if (!((a->int32) == (b->int32))) {
+        onFail("a->int32 (Error: Value not equal)");
+    };
+    if (!((a->int64) == (b->int64))) {
+        onFail("a->int64 (Error: Value not equal)");
+    };
+    if (!((a->uint32) == (b->uint32))) {
+        onFail("a->uint32 (Error: Value not equal)");
+    };
+    if (!((a->uint64) == (b->uint64))) {
+        onFail("a->uint64 (Error: Value not equal)");
+    };
+    if (!((a->float32) == (b->float32))) {
+        onFail("a->float32 (Error: Value not equal)");
+    };
+    if (!((a->float64) == (b->float64))) {
+        onFail("a->float64 (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkAcquireProfilingLockInfoKHR(
-    const VkAcquireProfilingLockInfoKHR* a,
-    const VkAcquireProfilingLockInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkAcquireProfilingLockInfoKHR(const VkAcquireProfilingLockInfoKHR* a,
+                                              const VkAcquireProfilingLockInfoKHR* b,
+                                              OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->timeout) == (b->timeout))) { onFail("a->timeout (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->timeout) == (b->timeout))) {
+        onFail("a->timeout (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkPerformanceQuerySubmitInfoKHR(
-    const VkPerformanceQuerySubmitInfoKHR* a,
-    const VkPerformanceQuerySubmitInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPerformanceQuerySubmitInfoKHR(const VkPerformanceQuerySubmitInfoKHR* a,
+                                                const VkPerformanceQuerySubmitInfoKHR* b,
+                                                OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->counterPassIndex) == (b->counterPassIndex))) { onFail("a->counterPassIndex (Error: Value not equal)"); };
+    if (!((a->counterPassIndex) == (b->counterPassIndex))) {
+        onFail("a->counterPassIndex (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_KHR_maintenance2
 #endif
 #ifdef VK_KHR_get_surface_capabilities2
-void checkEqual_VkPhysicalDeviceSurfaceInfo2KHR(
-    const VkPhysicalDeviceSurfaceInfo2KHR* a,
-    const VkPhysicalDeviceSurfaceInfo2KHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPhysicalDeviceSurfaceInfo2KHR(const VkPhysicalDeviceSurfaceInfo2KHR* a,
+                                                const VkPhysicalDeviceSurfaceInfo2KHR* b,
+                                                OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->surface) == (b->surface))) { onFail("a->surface (Error: Value not equal)"); };
+    if (!((a->surface) == (b->surface))) {
+        onFail("a->surface (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkSurfaceCapabilities2KHR(
-    const VkSurfaceCapabilities2KHR* a,
-    const VkSurfaceCapabilities2KHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkSurfaceCapabilities2KHR(const VkSurfaceCapabilities2KHR* a,
+                                          const VkSurfaceCapabilities2KHR* b,
+                                          OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
     checkEqual_VkSurfaceCapabilitiesKHR(&a->surfaceCapabilities, &b->surfaceCapabilities, onFail);
 }
 
-void checkEqual_VkSurfaceFormat2KHR(
-    const VkSurfaceFormat2KHR* a,
-    const VkSurfaceFormat2KHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkSurfaceFormat2KHR(const VkSurfaceFormat2KHR* a, const VkSurfaceFormat2KHR* b,
+                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
     checkEqual_VkSurfaceFormatKHR(&a->surfaceFormat, &b->surfaceFormat, onFail);
@@ -5871,67 +8209,67 @@
 #ifdef VK_KHR_variable_pointers
 #endif
 #ifdef VK_KHR_get_display_properties2
-void checkEqual_VkDisplayProperties2KHR(
-    const VkDisplayProperties2KHR* a,
-    const VkDisplayProperties2KHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDisplayProperties2KHR(const VkDisplayProperties2KHR* a,
+                                        const VkDisplayProperties2KHR* b,
+                                        OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
     checkEqual_VkDisplayPropertiesKHR(&a->displayProperties, &b->displayProperties, onFail);
 }
 
-void checkEqual_VkDisplayPlaneProperties2KHR(
-    const VkDisplayPlaneProperties2KHR* a,
-    const VkDisplayPlaneProperties2KHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDisplayPlaneProperties2KHR(const VkDisplayPlaneProperties2KHR* a,
+                                             const VkDisplayPlaneProperties2KHR* b,
+                                             OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    checkEqual_VkDisplayPlanePropertiesKHR(&a->displayPlaneProperties, &b->displayPlaneProperties, onFail);
+    checkEqual_VkDisplayPlanePropertiesKHR(&a->displayPlaneProperties, &b->displayPlaneProperties,
+                                           onFail);
 }
 
-void checkEqual_VkDisplayModeProperties2KHR(
-    const VkDisplayModeProperties2KHR* a,
-    const VkDisplayModeProperties2KHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDisplayModeProperties2KHR(const VkDisplayModeProperties2KHR* a,
+                                            const VkDisplayModeProperties2KHR* b,
+                                            OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    checkEqual_VkDisplayModePropertiesKHR(&a->displayModeProperties, &b->displayModeProperties, onFail);
+    checkEqual_VkDisplayModePropertiesKHR(&a->displayModeProperties, &b->displayModeProperties,
+                                          onFail);
 }
 
-void checkEqual_VkDisplayPlaneInfo2KHR(
-    const VkDisplayPlaneInfo2KHR* a,
-    const VkDisplayPlaneInfo2KHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDisplayPlaneInfo2KHR(const VkDisplayPlaneInfo2KHR* a,
+                                       const VkDisplayPlaneInfo2KHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->mode) == (b->mode))) { onFail("a->mode (Error: Value not equal)"); };
-    if (!((a->planeIndex) == (b->planeIndex))) { onFail("a->planeIndex (Error: Value not equal)"); };
+    if (!((a->mode) == (b->mode))) {
+        onFail("a->mode (Error: Value not equal)");
+    };
+    if (!((a->planeIndex) == (b->planeIndex))) {
+        onFail("a->planeIndex (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkDisplayPlaneCapabilities2KHR(
-    const VkDisplayPlaneCapabilities2KHR* a,
-    const VkDisplayPlaneCapabilities2KHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDisplayPlaneCapabilities2KHR(const VkDisplayPlaneCapabilities2KHR* a,
+                                               const VkDisplayPlaneCapabilities2KHR* b,
+                                               OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
     checkEqual_VkDisplayPlaneCapabilitiesKHR(&a->capabilities, &b->capabilities, onFail);
@@ -5955,42 +8293,73 @@
 #ifdef VK_KHR_portability_subset
 void checkEqual_VkPhysicalDevicePortabilitySubsetFeaturesKHR(
     const VkPhysicalDevicePortabilitySubsetFeaturesKHR* a,
-    const VkPhysicalDevicePortabilitySubsetFeaturesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDevicePortabilitySubsetFeaturesKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->constantAlphaColorBlendFactors) == (b->constantAlphaColorBlendFactors))) { onFail("a->constantAlphaColorBlendFactors (Error: Value not equal)"); };
-    if (!((a->events) == (b->events))) { onFail("a->events (Error: Value not equal)"); };
-    if (!((a->imageViewFormatReinterpretation) == (b->imageViewFormatReinterpretation))) { onFail("a->imageViewFormatReinterpretation (Error: Value not equal)"); };
-    if (!((a->imageViewFormatSwizzle) == (b->imageViewFormatSwizzle))) { onFail("a->imageViewFormatSwizzle (Error: Value not equal)"); };
-    if (!((a->imageView2DOn3DImage) == (b->imageView2DOn3DImage))) { onFail("a->imageView2DOn3DImage (Error: Value not equal)"); };
-    if (!((a->multisampleArrayImage) == (b->multisampleArrayImage))) { onFail("a->multisampleArrayImage (Error: Value not equal)"); };
-    if (!((a->mutableComparisonSamplers) == (b->mutableComparisonSamplers))) { onFail("a->mutableComparisonSamplers (Error: Value not equal)"); };
-    if (!((a->pointPolygons) == (b->pointPolygons))) { onFail("a->pointPolygons (Error: Value not equal)"); };
-    if (!((a->samplerMipLodBias) == (b->samplerMipLodBias))) { onFail("a->samplerMipLodBias (Error: Value not equal)"); };
-    if (!((a->separateStencilMaskRef) == (b->separateStencilMaskRef))) { onFail("a->separateStencilMaskRef (Error: Value not equal)"); };
-    if (!((a->shaderSampleRateInterpolationFunctions) == (b->shaderSampleRateInterpolationFunctions))) { onFail("a->shaderSampleRateInterpolationFunctions (Error: Value not equal)"); };
-    if (!((a->tessellationIsolines) == (b->tessellationIsolines))) { onFail("a->tessellationIsolines (Error: Value not equal)"); };
-    if (!((a->tessellationPointMode) == (b->tessellationPointMode))) { onFail("a->tessellationPointMode (Error: Value not equal)"); };
-    if (!((a->triangleFans) == (b->triangleFans))) { onFail("a->triangleFans (Error: Value not equal)"); };
-    if (!((a->vertexAttributeAccessBeyondStride) == (b->vertexAttributeAccessBeyondStride))) { onFail("a->vertexAttributeAccessBeyondStride (Error: Value not equal)"); };
+    if (!((a->constantAlphaColorBlendFactors) == (b->constantAlphaColorBlendFactors))) {
+        onFail("a->constantAlphaColorBlendFactors (Error: Value not equal)");
+    };
+    if (!((a->events) == (b->events))) {
+        onFail("a->events (Error: Value not equal)");
+    };
+    if (!((a->imageViewFormatReinterpretation) == (b->imageViewFormatReinterpretation))) {
+        onFail("a->imageViewFormatReinterpretation (Error: Value not equal)");
+    };
+    if (!((a->imageViewFormatSwizzle) == (b->imageViewFormatSwizzle))) {
+        onFail("a->imageViewFormatSwizzle (Error: Value not equal)");
+    };
+    if (!((a->imageView2DOn3DImage) == (b->imageView2DOn3DImage))) {
+        onFail("a->imageView2DOn3DImage (Error: Value not equal)");
+    };
+    if (!((a->multisampleArrayImage) == (b->multisampleArrayImage))) {
+        onFail("a->multisampleArrayImage (Error: Value not equal)");
+    };
+    if (!((a->mutableComparisonSamplers) == (b->mutableComparisonSamplers))) {
+        onFail("a->mutableComparisonSamplers (Error: Value not equal)");
+    };
+    if (!((a->pointPolygons) == (b->pointPolygons))) {
+        onFail("a->pointPolygons (Error: Value not equal)");
+    };
+    if (!((a->samplerMipLodBias) == (b->samplerMipLodBias))) {
+        onFail("a->samplerMipLodBias (Error: Value not equal)");
+    };
+    if (!((a->separateStencilMaskRef) == (b->separateStencilMaskRef))) {
+        onFail("a->separateStencilMaskRef (Error: Value not equal)");
+    };
+    if (!((a->shaderSampleRateInterpolationFunctions) ==
+          (b->shaderSampleRateInterpolationFunctions))) {
+        onFail("a->shaderSampleRateInterpolationFunctions (Error: Value not equal)");
+    };
+    if (!((a->tessellationIsolines) == (b->tessellationIsolines))) {
+        onFail("a->tessellationIsolines (Error: Value not equal)");
+    };
+    if (!((a->tessellationPointMode) == (b->tessellationPointMode))) {
+        onFail("a->tessellationPointMode (Error: Value not equal)");
+    };
+    if (!((a->triangleFans) == (b->triangleFans))) {
+        onFail("a->triangleFans (Error: Value not equal)");
+    };
+    if (!((a->vertexAttributeAccessBeyondStride) == (b->vertexAttributeAccessBeyondStride))) {
+        onFail("a->vertexAttributeAccessBeyondStride (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDevicePortabilitySubsetPropertiesKHR(
     const VkPhysicalDevicePortabilitySubsetPropertiesKHR* a,
-    const VkPhysicalDevicePortabilitySubsetPropertiesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDevicePortabilitySubsetPropertiesKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->minVertexInputBindingStrideAlignment) == (b->minVertexInputBindingStrideAlignment))) { onFail("a->minVertexInputBindingStrideAlignment (Error: Value not equal)"); };
+    if (!((a->minVertexInputBindingStrideAlignment) == (b->minVertexInputBindingStrideAlignment))) {
+        onFail("a->minVertexInputBindingStrideAlignment (Error: Value not equal)");
+    };
 }
 
 #endif
@@ -6007,16 +8376,19 @@
 #ifdef VK_KHR_shader_clock
 void checkEqual_VkPhysicalDeviceShaderClockFeaturesKHR(
     const VkPhysicalDeviceShaderClockFeaturesKHR* a,
-    const VkPhysicalDeviceShaderClockFeaturesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceShaderClockFeaturesKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->shaderSubgroupClock) == (b->shaderSubgroupClock))) { onFail("a->shaderSubgroupClock (Error: Value not equal)"); };
-    if (!((a->shaderDeviceClock) == (b->shaderDeviceClock))) { onFail("a->shaderDeviceClock (Error: Value not equal)"); };
+    if (!((a->shaderSubgroupClock) == (b->shaderSubgroupClock))) {
+        onFail("a->shaderSubgroupClock (Error: Value not equal)");
+    };
+    if (!((a->shaderDeviceClock) == (b->shaderDeviceClock))) {
+        onFail("a->shaderDeviceClock (Error: Value not equal)");
+    };
 }
 
 #endif
@@ -6035,109 +8407,160 @@
 #ifdef VK_KHR_shader_terminate_invocation
 void checkEqual_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(
     const VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* a,
-    const VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->shaderTerminateInvocation) == (b->shaderTerminateInvocation))) { onFail("a->shaderTerminateInvocation (Error: Value not equal)"); };
+    if (!((a->shaderTerminateInvocation) == (b->shaderTerminateInvocation))) {
+        onFail("a->shaderTerminateInvocation (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_KHR_fragment_shading_rate
 void checkEqual_VkFragmentShadingRateAttachmentInfoKHR(
     const VkFragmentShadingRateAttachmentInfoKHR* a,
-    const VkFragmentShadingRateAttachmentInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkFragmentShadingRateAttachmentInfoKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((!(a->pFragmentShadingRateAttachment) && !(b->pFragmentShadingRateAttachment)) || ((a->pFragmentShadingRateAttachment) && (b->pFragmentShadingRateAttachment)))) { onFail("a->pFragmentShadingRateAttachment (Error: Mismatch in optional field)"); };
-    if (a->pFragmentShadingRateAttachment && b->pFragmentShadingRateAttachment)
-    {
-        if ((a->pFragmentShadingRateAttachment) && (b->pFragmentShadingRateAttachment))
-        {
-            checkEqual_VkAttachmentReference2(a->pFragmentShadingRateAttachment, b->pFragmentShadingRateAttachment, onFail);
+    if (!((!(a->pFragmentShadingRateAttachment) && !(b->pFragmentShadingRateAttachment)) ||
+          ((a->pFragmentShadingRateAttachment) && (b->pFragmentShadingRateAttachment)))) {
+        onFail("a->pFragmentShadingRateAttachment (Error: Mismatch in optional field)");
+    };
+    if (a->pFragmentShadingRateAttachment && b->pFragmentShadingRateAttachment) {
+        if ((a->pFragmentShadingRateAttachment) && (b->pFragmentShadingRateAttachment)) {
+            checkEqual_VkAttachmentReference2(a->pFragmentShadingRateAttachment,
+                                              b->pFragmentShadingRateAttachment, onFail);
         }
     }
-    checkEqual_VkExtent2D(&a->shadingRateAttachmentTexelSize, &b->shadingRateAttachmentTexelSize, onFail);
+    checkEqual_VkExtent2D(&a->shadingRateAttachmentTexelSize, &b->shadingRateAttachmentTexelSize,
+                          onFail);
 }
 
 void checkEqual_VkPipelineFragmentShadingRateStateCreateInfoKHR(
     const VkPipelineFragmentShadingRateStateCreateInfoKHR* a,
-    const VkPipelineFragmentShadingRateStateCreateInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPipelineFragmentShadingRateStateCreateInfoKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
     checkEqual_VkExtent2D(&a->fragmentSize, &b->fragmentSize, onFail);
-    if (!((memcmp(a->combinerOps, b->combinerOps, 2 * sizeof(VkFragmentShadingRateCombinerOpKHR)) == 0))) { onFail("a->combinerOps (Error: Unequal static array)"); };
+    if (!((memcmp(a->combinerOps, b->combinerOps, 2 * sizeof(VkFragmentShadingRateCombinerOpKHR)) ==
+           0))) {
+        onFail("a->combinerOps (Error: Unequal static array)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(
     const VkPhysicalDeviceFragmentShadingRateFeaturesKHR* a,
-    const VkPhysicalDeviceFragmentShadingRateFeaturesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceFragmentShadingRateFeaturesKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->pipelineFragmentShadingRate) == (b->pipelineFragmentShadingRate))) { onFail("a->pipelineFragmentShadingRate (Error: Value not equal)"); };
-    if (!((a->primitiveFragmentShadingRate) == (b->primitiveFragmentShadingRate))) { onFail("a->primitiveFragmentShadingRate (Error: Value not equal)"); };
-    if (!((a->attachmentFragmentShadingRate) == (b->attachmentFragmentShadingRate))) { onFail("a->attachmentFragmentShadingRate (Error: Value not equal)"); };
+    if (!((a->pipelineFragmentShadingRate) == (b->pipelineFragmentShadingRate))) {
+        onFail("a->pipelineFragmentShadingRate (Error: Value not equal)");
+    };
+    if (!((a->primitiveFragmentShadingRate) == (b->primitiveFragmentShadingRate))) {
+        onFail("a->primitiveFragmentShadingRate (Error: Value not equal)");
+    };
+    if (!((a->attachmentFragmentShadingRate) == (b->attachmentFragmentShadingRate))) {
+        onFail("a->attachmentFragmentShadingRate (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(
     const VkPhysicalDeviceFragmentShadingRatePropertiesKHR* a,
-    const VkPhysicalDeviceFragmentShadingRatePropertiesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceFragmentShadingRatePropertiesKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    checkEqual_VkExtent2D(&a->minFragmentShadingRateAttachmentTexelSize, &b->minFragmentShadingRateAttachmentTexelSize, onFail);
-    checkEqual_VkExtent2D(&a->maxFragmentShadingRateAttachmentTexelSize, &b->maxFragmentShadingRateAttachmentTexelSize, onFail);
-    if (!((a->maxFragmentShadingRateAttachmentTexelSizeAspectRatio) == (b->maxFragmentShadingRateAttachmentTexelSizeAspectRatio))) { onFail("a->maxFragmentShadingRateAttachmentTexelSizeAspectRatio (Error: Value not equal)"); };
-    if (!((a->primitiveFragmentShadingRateWithMultipleViewports) == (b->primitiveFragmentShadingRateWithMultipleViewports))) { onFail("a->primitiveFragmentShadingRateWithMultipleViewports (Error: Value not equal)"); };
-    if (!((a->layeredShadingRateAttachments) == (b->layeredShadingRateAttachments))) { onFail("a->layeredShadingRateAttachments (Error: Value not equal)"); };
-    if (!((a->fragmentShadingRateNonTrivialCombinerOps) == (b->fragmentShadingRateNonTrivialCombinerOps))) { onFail("a->fragmentShadingRateNonTrivialCombinerOps (Error: Value not equal)"); };
+    checkEqual_VkExtent2D(&a->minFragmentShadingRateAttachmentTexelSize,
+                          &b->minFragmentShadingRateAttachmentTexelSize, onFail);
+    checkEqual_VkExtent2D(&a->maxFragmentShadingRateAttachmentTexelSize,
+                          &b->maxFragmentShadingRateAttachmentTexelSize, onFail);
+    if (!((a->maxFragmentShadingRateAttachmentTexelSizeAspectRatio) ==
+          (b->maxFragmentShadingRateAttachmentTexelSizeAspectRatio))) {
+        onFail("a->maxFragmentShadingRateAttachmentTexelSizeAspectRatio (Error: Value not equal)");
+    };
+    if (!((a->primitiveFragmentShadingRateWithMultipleViewports) ==
+          (b->primitiveFragmentShadingRateWithMultipleViewports))) {
+        onFail("a->primitiveFragmentShadingRateWithMultipleViewports (Error: Value not equal)");
+    };
+    if (!((a->layeredShadingRateAttachments) == (b->layeredShadingRateAttachments))) {
+        onFail("a->layeredShadingRateAttachments (Error: Value not equal)");
+    };
+    if (!((a->fragmentShadingRateNonTrivialCombinerOps) ==
+          (b->fragmentShadingRateNonTrivialCombinerOps))) {
+        onFail("a->fragmentShadingRateNonTrivialCombinerOps (Error: Value not equal)");
+    };
     checkEqual_VkExtent2D(&a->maxFragmentSize, &b->maxFragmentSize, onFail);
-    if (!((a->maxFragmentSizeAspectRatio) == (b->maxFragmentSizeAspectRatio))) { onFail("a->maxFragmentSizeAspectRatio (Error: Value not equal)"); };
-    if (!((a->maxFragmentShadingRateCoverageSamples) == (b->maxFragmentShadingRateCoverageSamples))) { onFail("a->maxFragmentShadingRateCoverageSamples (Error: Value not equal)"); };
-    if (!((a->maxFragmentShadingRateRasterizationSamples) == (b->maxFragmentShadingRateRasterizationSamples))) { onFail("a->maxFragmentShadingRateRasterizationSamples (Error: Value not equal)"); };
-    if (!((a->fragmentShadingRateWithShaderDepthStencilWrites) == (b->fragmentShadingRateWithShaderDepthStencilWrites))) { onFail("a->fragmentShadingRateWithShaderDepthStencilWrites (Error: Value not equal)"); };
-    if (!((a->fragmentShadingRateWithSampleMask) == (b->fragmentShadingRateWithSampleMask))) { onFail("a->fragmentShadingRateWithSampleMask (Error: Value not equal)"); };
-    if (!((a->fragmentShadingRateWithShaderSampleMask) == (b->fragmentShadingRateWithShaderSampleMask))) { onFail("a->fragmentShadingRateWithShaderSampleMask (Error: Value not equal)"); };
-    if (!((a->fragmentShadingRateWithConservativeRasterization) == (b->fragmentShadingRateWithConservativeRasterization))) { onFail("a->fragmentShadingRateWithConservativeRasterization (Error: Value not equal)"); };
-    if (!((a->fragmentShadingRateWithFragmentShaderInterlock) == (b->fragmentShadingRateWithFragmentShaderInterlock))) { onFail("a->fragmentShadingRateWithFragmentShaderInterlock (Error: Value not equal)"); };
-    if (!((a->fragmentShadingRateWithCustomSampleLocations) == (b->fragmentShadingRateWithCustomSampleLocations))) { onFail("a->fragmentShadingRateWithCustomSampleLocations (Error: Value not equal)"); };
-    if (!((a->fragmentShadingRateStrictMultiplyCombiner) == (b->fragmentShadingRateStrictMultiplyCombiner))) { onFail("a->fragmentShadingRateStrictMultiplyCombiner (Error: Value not equal)"); };
+    if (!((a->maxFragmentSizeAspectRatio) == (b->maxFragmentSizeAspectRatio))) {
+        onFail("a->maxFragmentSizeAspectRatio (Error: Value not equal)");
+    };
+    if (!((a->maxFragmentShadingRateCoverageSamples) ==
+          (b->maxFragmentShadingRateCoverageSamples))) {
+        onFail("a->maxFragmentShadingRateCoverageSamples (Error: Value not equal)");
+    };
+    if (!((a->maxFragmentShadingRateRasterizationSamples) ==
+          (b->maxFragmentShadingRateRasterizationSamples))) {
+        onFail("a->maxFragmentShadingRateRasterizationSamples (Error: Value not equal)");
+    };
+    if (!((a->fragmentShadingRateWithShaderDepthStencilWrites) ==
+          (b->fragmentShadingRateWithShaderDepthStencilWrites))) {
+        onFail("a->fragmentShadingRateWithShaderDepthStencilWrites (Error: Value not equal)");
+    };
+    if (!((a->fragmentShadingRateWithSampleMask) == (b->fragmentShadingRateWithSampleMask))) {
+        onFail("a->fragmentShadingRateWithSampleMask (Error: Value not equal)");
+    };
+    if (!((a->fragmentShadingRateWithShaderSampleMask) ==
+          (b->fragmentShadingRateWithShaderSampleMask))) {
+        onFail("a->fragmentShadingRateWithShaderSampleMask (Error: Value not equal)");
+    };
+    if (!((a->fragmentShadingRateWithConservativeRasterization) ==
+          (b->fragmentShadingRateWithConservativeRasterization))) {
+        onFail("a->fragmentShadingRateWithConservativeRasterization (Error: Value not equal)");
+    };
+    if (!((a->fragmentShadingRateWithFragmentShaderInterlock) ==
+          (b->fragmentShadingRateWithFragmentShaderInterlock))) {
+        onFail("a->fragmentShadingRateWithFragmentShaderInterlock (Error: Value not equal)");
+    };
+    if (!((a->fragmentShadingRateWithCustomSampleLocations) ==
+          (b->fragmentShadingRateWithCustomSampleLocations))) {
+        onFail("a->fragmentShadingRateWithCustomSampleLocations (Error: Value not equal)");
+    };
+    if (!((a->fragmentShadingRateStrictMultiplyCombiner) ==
+          (b->fragmentShadingRateStrictMultiplyCombiner))) {
+        onFail("a->fragmentShadingRateStrictMultiplyCombiner (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceFragmentShadingRateKHR(
     const VkPhysicalDeviceFragmentShadingRateKHR* a,
-    const VkPhysicalDeviceFragmentShadingRateKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceFragmentShadingRateKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->sampleCounts) == (b->sampleCounts))) { onFail("a->sampleCounts (Error: Value not equal)"); };
+    if (!((a->sampleCounts) == (b->sampleCounts))) {
+        onFail("a->sampleCounts (Error: Value not equal)");
+    };
     checkEqual_VkExtent2D(&a->fragmentSize, &b->fragmentSize, onFail);
 }
 
@@ -6145,17 +8568,18 @@
 #ifdef VK_KHR_spirv_1_4
 #endif
 #ifdef VK_KHR_surface_protected_capabilities
-void checkEqual_VkSurfaceProtectedCapabilitiesKHR(
-    const VkSurfaceProtectedCapabilitiesKHR* a,
-    const VkSurfaceProtectedCapabilitiesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkSurfaceProtectedCapabilitiesKHR(const VkSurfaceProtectedCapabilitiesKHR* a,
+                                                  const VkSurfaceProtectedCapabilitiesKHR* b,
+                                                  OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->supportsProtected) == (b->supportsProtected))) { onFail("a->supportsProtected (Error: Value not equal)"); };
+    if (!((a->supportsProtected) == (b->supportsProtected))) {
+        onFail("a->supportsProtected (Error: Value not equal)");
+    };
 }
 
 #endif
@@ -6164,15 +8588,16 @@
 #ifdef VK_KHR_present_wait
 void checkEqual_VkPhysicalDevicePresentWaitFeaturesKHR(
     const VkPhysicalDevicePresentWaitFeaturesKHR* a,
-    const VkPhysicalDevicePresentWaitFeaturesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDevicePresentWaitFeaturesKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->presentWait) == (b->presentWait))) { onFail("a->presentWait (Error: Value not equal)"); };
+    if (!((a->presentWait) == (b->presentWait))) {
+        onFail("a->presentWait (Error: Value not equal)");
+    };
 }
 
 #endif
@@ -6185,474 +8610,716 @@
 #ifdef VK_KHR_pipeline_executable_properties
 void checkEqual_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(
     const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* a,
-    const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->pipelineExecutableInfo) == (b->pipelineExecutableInfo))) { onFail("a->pipelineExecutableInfo (Error: Value not equal)"); };
+    if (!((a->pipelineExecutableInfo) == (b->pipelineExecutableInfo))) {
+        onFail("a->pipelineExecutableInfo (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkPipelineInfoKHR(
-    const VkPipelineInfoKHR* a,
-    const VkPipelineInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPipelineInfoKHR(const VkPipelineInfoKHR* a, const VkPipelineInfoKHR* b,
+                                  OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->pipeline) == (b->pipeline))) { onFail("a->pipeline (Error: Value not equal)"); };
+    if (!((a->pipeline) == (b->pipeline))) {
+        onFail("a->pipeline (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkPipelineExecutablePropertiesKHR(
-    const VkPipelineExecutablePropertiesKHR* a,
-    const VkPipelineExecutablePropertiesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPipelineExecutablePropertiesKHR(const VkPipelineExecutablePropertiesKHR* a,
+                                                  const VkPipelineExecutablePropertiesKHR* b,
+                                                  OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->stages) == (b->stages))) { onFail("a->stages (Error: Value not equal)"); };
-    if (!((memcmp(a->name, b->name, VK_MAX_DESCRIPTION_SIZE * sizeof(char)) == 0))) { onFail("a->name (Error: Unequal static array)"); };
-    if (!((memcmp(a->description, b->description, VK_MAX_DESCRIPTION_SIZE * sizeof(char)) == 0))) { onFail("a->description (Error: Unequal static array)"); };
-    if (!((a->subgroupSize) == (b->subgroupSize))) { onFail("a->subgroupSize (Error: Value not equal)"); };
+    if (!((a->stages) == (b->stages))) {
+        onFail("a->stages (Error: Value not equal)");
+    };
+    if (!((memcmp(a->name, b->name, VK_MAX_DESCRIPTION_SIZE * sizeof(char)) == 0))) {
+        onFail("a->name (Error: Unequal static array)");
+    };
+    if (!((memcmp(a->description, b->description, VK_MAX_DESCRIPTION_SIZE * sizeof(char)) == 0))) {
+        onFail("a->description (Error: Unequal static array)");
+    };
+    if (!((a->subgroupSize) == (b->subgroupSize))) {
+        onFail("a->subgroupSize (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkPipelineExecutableInfoKHR(
-    const VkPipelineExecutableInfoKHR* a,
-    const VkPipelineExecutableInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPipelineExecutableInfoKHR(const VkPipelineExecutableInfoKHR* a,
+                                            const VkPipelineExecutableInfoKHR* b,
+                                            OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->pipeline) == (b->pipeline))) { onFail("a->pipeline (Error: Value not equal)"); };
-    if (!((a->executableIndex) == (b->executableIndex))) { onFail("a->executableIndex (Error: Value not equal)"); };
+    if (!((a->pipeline) == (b->pipeline))) {
+        onFail("a->pipeline (Error: Value not equal)");
+    };
+    if (!((a->executableIndex) == (b->executableIndex))) {
+        onFail("a->executableIndex (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPipelineExecutableStatisticValueKHR(
-    const VkPipelineExecutableStatisticValueKHR* a,
-    const VkPipelineExecutableStatisticValueKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->b32) == (b->b32))) { onFail("a->b32 (Error: Value not equal)"); };
-    if (!((a->i64) == (b->i64))) { onFail("a->i64 (Error: Value not equal)"); };
-    if (!((a->u64) == (b->u64))) { onFail("a->u64 (Error: Value not equal)"); };
-    if (!((a->f64) == (b->f64))) { onFail("a->f64 (Error: Value not equal)"); };
+    const VkPipelineExecutableStatisticValueKHR* a, const VkPipelineExecutableStatisticValueKHR* b,
+    OnFailCompareFunc onFail) {
+    if (!((a->b32) == (b->b32))) {
+        onFail("a->b32 (Error: Value not equal)");
+    };
+    if (!((a->i64) == (b->i64))) {
+        onFail("a->i64 (Error: Value not equal)");
+    };
+    if (!((a->u64) == (b->u64))) {
+        onFail("a->u64 (Error: Value not equal)");
+    };
+    if (!((a->f64) == (b->f64))) {
+        onFail("a->f64 (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkPipelineExecutableStatisticKHR(
-    const VkPipelineExecutableStatisticKHR* a,
-    const VkPipelineExecutableStatisticKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPipelineExecutableStatisticKHR(const VkPipelineExecutableStatisticKHR* a,
+                                                 const VkPipelineExecutableStatisticKHR* b,
+                                                 OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((memcmp(a->name, b->name, VK_MAX_DESCRIPTION_SIZE * sizeof(char)) == 0))) { onFail("a->name (Error: Unequal static array)"); };
-    if (!((memcmp(a->description, b->description, VK_MAX_DESCRIPTION_SIZE * sizeof(char)) == 0))) { onFail("a->description (Error: Unequal static array)"); };
-    if (!((a->format) == (b->format))) { onFail("a->format (Error: Value not equal)"); };
+    if (!((memcmp(a->name, b->name, VK_MAX_DESCRIPTION_SIZE * sizeof(char)) == 0))) {
+        onFail("a->name (Error: Unequal static array)");
+    };
+    if (!((memcmp(a->description, b->description, VK_MAX_DESCRIPTION_SIZE * sizeof(char)) == 0))) {
+        onFail("a->description (Error: Unequal static array)");
+    };
+    if (!((a->format) == (b->format))) {
+        onFail("a->format (Error: Value not equal)");
+    };
     checkEqual_VkPipelineExecutableStatisticValueKHR(&a->value, &b->value, onFail);
 }
 
 void checkEqual_VkPipelineExecutableInternalRepresentationKHR(
     const VkPipelineExecutableInternalRepresentationKHR* a,
-    const VkPipelineExecutableInternalRepresentationKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPipelineExecutableInternalRepresentationKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((memcmp(a->name, b->name, VK_MAX_DESCRIPTION_SIZE * sizeof(char)) == 0))) { onFail("a->name (Error: Unequal static array)"); };
-    if (!((memcmp(a->description, b->description, VK_MAX_DESCRIPTION_SIZE * sizeof(char)) == 0))) { onFail("a->description (Error: Unequal static array)"); };
-    if (!((a->isText) == (b->isText))) { onFail("a->isText (Error: Value not equal)"); };
-    if (!((a->dataSize) == (b->dataSize))) { onFail("a->dataSize (Error: Value not equal)"); };
-    if (!((!(a->pData) && !(b->pData)) || ((a->pData) && (b->pData)))) { onFail("a->pData (Error: Mismatch in optional field)"); };
+    if (!((memcmp(a->name, b->name, VK_MAX_DESCRIPTION_SIZE * sizeof(char)) == 0))) {
+        onFail("a->name (Error: Unequal static array)");
+    };
+    if (!((memcmp(a->description, b->description, VK_MAX_DESCRIPTION_SIZE * sizeof(char)) == 0))) {
+        onFail("a->description (Error: Unequal static array)");
+    };
+    if (!((a->isText) == (b->isText))) {
+        onFail("a->isText (Error: Value not equal)");
+    };
+    if (!((a->dataSize) == (b->dataSize))) {
+        onFail("a->dataSize (Error: Value not equal)");
+    };
+    if (!((!(a->pData) && !(b->pData)) || ((a->pData) && (b->pData)))) {
+        onFail("a->pData (Error: Mismatch in optional field)");
+    };
 }
 
 #endif
 #ifdef VK_KHR_shader_integer_dot_product
 void checkEqual_VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR(
     const VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR* a,
-    const VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->shaderIntegerDotProduct) == (b->shaderIntegerDotProduct))) { onFail("a->shaderIntegerDotProduct (Error: Value not equal)"); };
+    if (!((a->shaderIntegerDotProduct) == (b->shaderIntegerDotProduct))) {
+        onFail("a->shaderIntegerDotProduct (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR(
     const VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR* a,
-    const VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->integerDotProduct8BitUnsignedAccelerated) == (b->integerDotProduct8BitUnsignedAccelerated))) { onFail("a->integerDotProduct8BitUnsignedAccelerated (Error: Value not equal)"); };
-    if (!((a->integerDotProduct8BitSignedAccelerated) == (b->integerDotProduct8BitSignedAccelerated))) { onFail("a->integerDotProduct8BitSignedAccelerated (Error: Value not equal)"); };
-    if (!((a->integerDotProduct8BitMixedSignednessAccelerated) == (b->integerDotProduct8BitMixedSignednessAccelerated))) { onFail("a->integerDotProduct8BitMixedSignednessAccelerated (Error: Value not equal)"); };
-    if (!((a->integerDotProduct4x8BitPackedUnsignedAccelerated) == (b->integerDotProduct4x8BitPackedUnsignedAccelerated))) { onFail("a->integerDotProduct4x8BitPackedUnsignedAccelerated (Error: Value not equal)"); };
-    if (!((a->integerDotProduct4x8BitPackedSignedAccelerated) == (b->integerDotProduct4x8BitPackedSignedAccelerated))) { onFail("a->integerDotProduct4x8BitPackedSignedAccelerated (Error: Value not equal)"); };
-    if (!((a->integerDotProduct4x8BitPackedMixedSignednessAccelerated) == (b->integerDotProduct4x8BitPackedMixedSignednessAccelerated))) { onFail("a->integerDotProduct4x8BitPackedMixedSignednessAccelerated (Error: Value not equal)"); };
-    if (!((a->integerDotProduct16BitUnsignedAccelerated) == (b->integerDotProduct16BitUnsignedAccelerated))) { onFail("a->integerDotProduct16BitUnsignedAccelerated (Error: Value not equal)"); };
-    if (!((a->integerDotProduct16BitSignedAccelerated) == (b->integerDotProduct16BitSignedAccelerated))) { onFail("a->integerDotProduct16BitSignedAccelerated (Error: Value not equal)"); };
-    if (!((a->integerDotProduct16BitMixedSignednessAccelerated) == (b->integerDotProduct16BitMixedSignednessAccelerated))) { onFail("a->integerDotProduct16BitMixedSignednessAccelerated (Error: Value not equal)"); };
-    if (!((a->integerDotProduct32BitUnsignedAccelerated) == (b->integerDotProduct32BitUnsignedAccelerated))) { onFail("a->integerDotProduct32BitUnsignedAccelerated (Error: Value not equal)"); };
-    if (!((a->integerDotProduct32BitSignedAccelerated) == (b->integerDotProduct32BitSignedAccelerated))) { onFail("a->integerDotProduct32BitSignedAccelerated (Error: Value not equal)"); };
-    if (!((a->integerDotProduct32BitMixedSignednessAccelerated) == (b->integerDotProduct32BitMixedSignednessAccelerated))) { onFail("a->integerDotProduct32BitMixedSignednessAccelerated (Error: Value not equal)"); };
-    if (!((a->integerDotProduct64BitUnsignedAccelerated) == (b->integerDotProduct64BitUnsignedAccelerated))) { onFail("a->integerDotProduct64BitUnsignedAccelerated (Error: Value not equal)"); };
-    if (!((a->integerDotProduct64BitSignedAccelerated) == (b->integerDotProduct64BitSignedAccelerated))) { onFail("a->integerDotProduct64BitSignedAccelerated (Error: Value not equal)"); };
-    if (!((a->integerDotProduct64BitMixedSignednessAccelerated) == (b->integerDotProduct64BitMixedSignednessAccelerated))) { onFail("a->integerDotProduct64BitMixedSignednessAccelerated (Error: Value not equal)"); };
-    if (!((a->integerDotProductAccumulatingSaturating8BitUnsignedAccelerated) == (b->integerDotProductAccumulatingSaturating8BitUnsignedAccelerated))) { onFail("a->integerDotProductAccumulatingSaturating8BitUnsignedAccelerated (Error: Value not equal)"); };
-    if (!((a->integerDotProductAccumulatingSaturating8BitSignedAccelerated) == (b->integerDotProductAccumulatingSaturating8BitSignedAccelerated))) { onFail("a->integerDotProductAccumulatingSaturating8BitSignedAccelerated (Error: Value not equal)"); };
-    if (!((a->integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated) == (b->integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated))) { onFail("a->integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated (Error: Value not equal)"); };
-    if (!((a->integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated) == (b->integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated))) { onFail("a->integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated (Error: Value not equal)"); };
-    if (!((a->integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated) == (b->integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated))) { onFail("a->integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated (Error: Value not equal)"); };
-    if (!((a->integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated) == (b->integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated))) { onFail("a->integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated (Error: Value not equal)"); };
-    if (!((a->integerDotProductAccumulatingSaturating16BitUnsignedAccelerated) == (b->integerDotProductAccumulatingSaturating16BitUnsignedAccelerated))) { onFail("a->integerDotProductAccumulatingSaturating16BitUnsignedAccelerated (Error: Value not equal)"); };
-    if (!((a->integerDotProductAccumulatingSaturating16BitSignedAccelerated) == (b->integerDotProductAccumulatingSaturating16BitSignedAccelerated))) { onFail("a->integerDotProductAccumulatingSaturating16BitSignedAccelerated (Error: Value not equal)"); };
-    if (!((a->integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated) == (b->integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated))) { onFail("a->integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated (Error: Value not equal)"); };
-    if (!((a->integerDotProductAccumulatingSaturating32BitUnsignedAccelerated) == (b->integerDotProductAccumulatingSaturating32BitUnsignedAccelerated))) { onFail("a->integerDotProductAccumulatingSaturating32BitUnsignedAccelerated (Error: Value not equal)"); };
-    if (!((a->integerDotProductAccumulatingSaturating32BitSignedAccelerated) == (b->integerDotProductAccumulatingSaturating32BitSignedAccelerated))) { onFail("a->integerDotProductAccumulatingSaturating32BitSignedAccelerated (Error: Value not equal)"); };
-    if (!((a->integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated) == (b->integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated))) { onFail("a->integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated (Error: Value not equal)"); };
-    if (!((a->integerDotProductAccumulatingSaturating64BitUnsignedAccelerated) == (b->integerDotProductAccumulatingSaturating64BitUnsignedAccelerated))) { onFail("a->integerDotProductAccumulatingSaturating64BitUnsignedAccelerated (Error: Value not equal)"); };
-    if (!((a->integerDotProductAccumulatingSaturating64BitSignedAccelerated) == (b->integerDotProductAccumulatingSaturating64BitSignedAccelerated))) { onFail("a->integerDotProductAccumulatingSaturating64BitSignedAccelerated (Error: Value not equal)"); };
-    if (!((a->integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated) == (b->integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated))) { onFail("a->integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated (Error: Value not equal)"); };
+    if (!((a->integerDotProduct8BitUnsignedAccelerated) ==
+          (b->integerDotProduct8BitUnsignedAccelerated))) {
+        onFail("a->integerDotProduct8BitUnsignedAccelerated (Error: Value not equal)");
+    };
+    if (!((a->integerDotProduct8BitSignedAccelerated) ==
+          (b->integerDotProduct8BitSignedAccelerated))) {
+        onFail("a->integerDotProduct8BitSignedAccelerated (Error: Value not equal)");
+    };
+    if (!((a->integerDotProduct8BitMixedSignednessAccelerated) ==
+          (b->integerDotProduct8BitMixedSignednessAccelerated))) {
+        onFail("a->integerDotProduct8BitMixedSignednessAccelerated (Error: Value not equal)");
+    };
+    if (!((a->integerDotProduct4x8BitPackedUnsignedAccelerated) ==
+          (b->integerDotProduct4x8BitPackedUnsignedAccelerated))) {
+        onFail("a->integerDotProduct4x8BitPackedUnsignedAccelerated (Error: Value not equal)");
+    };
+    if (!((a->integerDotProduct4x8BitPackedSignedAccelerated) ==
+          (b->integerDotProduct4x8BitPackedSignedAccelerated))) {
+        onFail("a->integerDotProduct4x8BitPackedSignedAccelerated (Error: Value not equal)");
+    };
+    if (!((a->integerDotProduct4x8BitPackedMixedSignednessAccelerated) ==
+          (b->integerDotProduct4x8BitPackedMixedSignednessAccelerated))) {
+        onFail(
+            "a->integerDotProduct4x8BitPackedMixedSignednessAccelerated (Error: Value not equal)");
+    };
+    if (!((a->integerDotProduct16BitUnsignedAccelerated) ==
+          (b->integerDotProduct16BitUnsignedAccelerated))) {
+        onFail("a->integerDotProduct16BitUnsignedAccelerated (Error: Value not equal)");
+    };
+    if (!((a->integerDotProduct16BitSignedAccelerated) ==
+          (b->integerDotProduct16BitSignedAccelerated))) {
+        onFail("a->integerDotProduct16BitSignedAccelerated (Error: Value not equal)");
+    };
+    if (!((a->integerDotProduct16BitMixedSignednessAccelerated) ==
+          (b->integerDotProduct16BitMixedSignednessAccelerated))) {
+        onFail("a->integerDotProduct16BitMixedSignednessAccelerated (Error: Value not equal)");
+    };
+    if (!((a->integerDotProduct32BitUnsignedAccelerated) ==
+          (b->integerDotProduct32BitUnsignedAccelerated))) {
+        onFail("a->integerDotProduct32BitUnsignedAccelerated (Error: Value not equal)");
+    };
+    if (!((a->integerDotProduct32BitSignedAccelerated) ==
+          (b->integerDotProduct32BitSignedAccelerated))) {
+        onFail("a->integerDotProduct32BitSignedAccelerated (Error: Value not equal)");
+    };
+    if (!((a->integerDotProduct32BitMixedSignednessAccelerated) ==
+          (b->integerDotProduct32BitMixedSignednessAccelerated))) {
+        onFail("a->integerDotProduct32BitMixedSignednessAccelerated (Error: Value not equal)");
+    };
+    if (!((a->integerDotProduct64BitUnsignedAccelerated) ==
+          (b->integerDotProduct64BitUnsignedAccelerated))) {
+        onFail("a->integerDotProduct64BitUnsignedAccelerated (Error: Value not equal)");
+    };
+    if (!((a->integerDotProduct64BitSignedAccelerated) ==
+          (b->integerDotProduct64BitSignedAccelerated))) {
+        onFail("a->integerDotProduct64BitSignedAccelerated (Error: Value not equal)");
+    };
+    if (!((a->integerDotProduct64BitMixedSignednessAccelerated) ==
+          (b->integerDotProduct64BitMixedSignednessAccelerated))) {
+        onFail("a->integerDotProduct64BitMixedSignednessAccelerated (Error: Value not equal)");
+    };
+    if (!((a->integerDotProductAccumulatingSaturating8BitUnsignedAccelerated) ==
+          (b->integerDotProductAccumulatingSaturating8BitUnsignedAccelerated))) {
+        onFail(
+            "a->integerDotProductAccumulatingSaturating8BitUnsignedAccelerated (Error: Value not "
+            "equal)");
+    };
+    if (!((a->integerDotProductAccumulatingSaturating8BitSignedAccelerated) ==
+          (b->integerDotProductAccumulatingSaturating8BitSignedAccelerated))) {
+        onFail(
+            "a->integerDotProductAccumulatingSaturating8BitSignedAccelerated (Error: Value not "
+            "equal)");
+    };
+    if (!((a->integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated) ==
+          (b->integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated))) {
+        onFail(
+            "a->integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated (Error: "
+            "Value not equal)");
+    };
+    if (!((a->integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated) ==
+          (b->integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated))) {
+        onFail(
+            "a->integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated (Error: "
+            "Value not equal)");
+    };
+    if (!((a->integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated) ==
+          (b->integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated))) {
+        onFail(
+            "a->integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated (Error: Value "
+            "not equal)");
+    };
+    if (!((a->integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated) ==
+          (b->integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated))) {
+        onFail(
+            "a->integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated "
+            "(Error: Value not equal)");
+    };
+    if (!((a->integerDotProductAccumulatingSaturating16BitUnsignedAccelerated) ==
+          (b->integerDotProductAccumulatingSaturating16BitUnsignedAccelerated))) {
+        onFail(
+            "a->integerDotProductAccumulatingSaturating16BitUnsignedAccelerated (Error: Value not "
+            "equal)");
+    };
+    if (!((a->integerDotProductAccumulatingSaturating16BitSignedAccelerated) ==
+          (b->integerDotProductAccumulatingSaturating16BitSignedAccelerated))) {
+        onFail(
+            "a->integerDotProductAccumulatingSaturating16BitSignedAccelerated (Error: Value not "
+            "equal)");
+    };
+    if (!((a->integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated) ==
+          (b->integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated))) {
+        onFail(
+            "a->integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated (Error: "
+            "Value not equal)");
+    };
+    if (!((a->integerDotProductAccumulatingSaturating32BitUnsignedAccelerated) ==
+          (b->integerDotProductAccumulatingSaturating32BitUnsignedAccelerated))) {
+        onFail(
+            "a->integerDotProductAccumulatingSaturating32BitUnsignedAccelerated (Error: Value not "
+            "equal)");
+    };
+    if (!((a->integerDotProductAccumulatingSaturating32BitSignedAccelerated) ==
+          (b->integerDotProductAccumulatingSaturating32BitSignedAccelerated))) {
+        onFail(
+            "a->integerDotProductAccumulatingSaturating32BitSignedAccelerated (Error: Value not "
+            "equal)");
+    };
+    if (!((a->integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated) ==
+          (b->integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated))) {
+        onFail(
+            "a->integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated (Error: "
+            "Value not equal)");
+    };
+    if (!((a->integerDotProductAccumulatingSaturating64BitUnsignedAccelerated) ==
+          (b->integerDotProductAccumulatingSaturating64BitUnsignedAccelerated))) {
+        onFail(
+            "a->integerDotProductAccumulatingSaturating64BitUnsignedAccelerated (Error: Value not "
+            "equal)");
+    };
+    if (!((a->integerDotProductAccumulatingSaturating64BitSignedAccelerated) ==
+          (b->integerDotProductAccumulatingSaturating64BitSignedAccelerated))) {
+        onFail(
+            "a->integerDotProductAccumulatingSaturating64BitSignedAccelerated (Error: Value not "
+            "equal)");
+    };
+    if (!((a->integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated) ==
+          (b->integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated))) {
+        onFail(
+            "a->integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated (Error: "
+            "Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_KHR_pipeline_library
-void checkEqual_VkPipelineLibraryCreateInfoKHR(
-    const VkPipelineLibraryCreateInfoKHR* a,
-    const VkPipelineLibraryCreateInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPipelineLibraryCreateInfoKHR(const VkPipelineLibraryCreateInfoKHR* a,
+                                               const VkPipelineLibraryCreateInfoKHR* b,
+                                               OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->libraryCount) == (b->libraryCount))) { onFail("a->libraryCount (Error: Value not equal)"); };
-    if (!((a->libraryCount) == (b->libraryCount))) { onFail("a->pLibraries (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pLibraries, b->pLibraries, a->libraryCount * sizeof(const VkPipeline)) == 0))) { onFail("a->pLibraries (Error: Unequal dyn array)"); };
+    if (!((a->libraryCount) == (b->libraryCount))) {
+        onFail("a->libraryCount (Error: Value not equal)");
+    };
+    if (!((a->libraryCount) == (b->libraryCount))) {
+        onFail("a->pLibraries (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pLibraries, b->pLibraries, a->libraryCount * sizeof(const VkPipeline)) ==
+           0))) {
+        onFail("a->pLibraries (Error: Unequal dyn array)");
+    };
 }
 
 #endif
 #ifdef VK_KHR_shader_non_semantic_info
 #endif
 #ifdef VK_KHR_present_id
-void checkEqual_VkPresentIdKHR(
-    const VkPresentIdKHR* a,
-    const VkPresentIdKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPresentIdKHR(const VkPresentIdKHR* a, const VkPresentIdKHR* b,
+                               OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->swapchainCount) == (b->swapchainCount))) { onFail("a->swapchainCount (Error: Value not equal)"); };
-    if (!((!(a->pPresentIds) && !(b->pPresentIds)) || ((a->pPresentIds) && (b->pPresentIds)))) { onFail("a->pPresentIds (Error: Mismatch in optional field)"); };
-    if (a->pPresentIds && b->pPresentIds)
-    {
-        if (!((a->swapchainCount) == (b->swapchainCount))) { onFail("a->pPresentIds (Error: Lengths not equal)"); };
-        if (!((memcmp(a->pPresentIds, b->pPresentIds, a->swapchainCount * sizeof(const uint64_t)) == 0))) { onFail("a->pPresentIds (Error: Unequal dyn array)"); };
+    if (!((a->swapchainCount) == (b->swapchainCount))) {
+        onFail("a->swapchainCount (Error: Value not equal)");
+    };
+    if (!((!(a->pPresentIds) && !(b->pPresentIds)) || ((a->pPresentIds) && (b->pPresentIds)))) {
+        onFail("a->pPresentIds (Error: Mismatch in optional field)");
+    };
+    if (a->pPresentIds && b->pPresentIds) {
+        if (!((a->swapchainCount) == (b->swapchainCount))) {
+            onFail("a->pPresentIds (Error: Lengths not equal)");
+        };
+        if (!((memcmp(a->pPresentIds, b->pPresentIds, a->swapchainCount * sizeof(const uint64_t)) ==
+               0))) {
+            onFail("a->pPresentIds (Error: Unequal dyn array)");
+        };
     }
 }
 
-void checkEqual_VkPhysicalDevicePresentIdFeaturesKHR(
-    const VkPhysicalDevicePresentIdFeaturesKHR* a,
-    const VkPhysicalDevicePresentIdFeaturesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPhysicalDevicePresentIdFeaturesKHR(const VkPhysicalDevicePresentIdFeaturesKHR* a,
+                                                     const VkPhysicalDevicePresentIdFeaturesKHR* b,
+                                                     OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->presentId) == (b->presentId))) { onFail("a->presentId (Error: Value not equal)"); };
+    if (!((a->presentId) == (b->presentId))) {
+        onFail("a->presentId (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_KHR_video_encode_queue
-void checkEqual_VkVideoEncodeInfoKHR(
-    const VkVideoEncodeInfoKHR* a,
-    const VkVideoEncodeInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkVideoEncodeInfoKHR(const VkVideoEncodeInfoKHR* a, const VkVideoEncodeInfoKHR* b,
+                                     OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->qualityLevel) == (b->qualityLevel))) { onFail("a->qualityLevel (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->qualityLevel) == (b->qualityLevel))) {
+        onFail("a->qualityLevel (Error: Value not equal)");
+    };
     checkEqual_VkExtent2D(&a->codedExtent, &b->codedExtent, onFail);
-    if (!((a->dstBitstreamBuffer) == (b->dstBitstreamBuffer))) { onFail("a->dstBitstreamBuffer (Error: Value not equal)"); };
-    if (!((a->dstBitstreamBufferOffset) == (b->dstBitstreamBufferOffset))) { onFail("a->dstBitstreamBufferOffset (Error: Value not equal)"); };
-    if (!((a->dstBitstreamBufferMaxRange) == (b->dstBitstreamBufferMaxRange))) { onFail("a->dstBitstreamBufferMaxRange (Error: Value not equal)"); };
+    if (!((a->dstBitstreamBuffer) == (b->dstBitstreamBuffer))) {
+        onFail("a->dstBitstreamBuffer (Error: Value not equal)");
+    };
+    if (!((a->dstBitstreamBufferOffset) == (b->dstBitstreamBufferOffset))) {
+        onFail("a->dstBitstreamBufferOffset (Error: Value not equal)");
+    };
+    if (!((a->dstBitstreamBufferMaxRange) == (b->dstBitstreamBufferMaxRange))) {
+        onFail("a->dstBitstreamBufferMaxRange (Error: Value not equal)");
+    };
     checkEqual_VkVideoPictureResourceKHR(&a->srcPictureResource, &b->srcPictureResource, onFail);
-    if ((a->pSetupReferenceSlot) && (b->pSetupReferenceSlot))
-    {
+    if ((a->pSetupReferenceSlot) && (b->pSetupReferenceSlot)) {
         checkEqual_VkVideoReferenceSlotKHR(a->pSetupReferenceSlot, b->pSetupReferenceSlot, onFail);
     }
-    if (!((a->referenceSlotCount) == (b->referenceSlotCount))) { onFail("a->referenceSlotCount (Error: Value not equal)"); };
-    if ((a->pReferenceSlots) && (b->pReferenceSlots))
-    {
-        if (!((a->referenceSlotCount) == (b->referenceSlotCount))) { onFail("a->pReferenceSlots (Error: Lengths not equal)"); };
-        if ((a->referenceSlotCount) == (b->referenceSlotCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->referenceSlotCount; ++i)
-                {
-                    checkEqual_VkVideoReferenceSlotKHR(a->pReferenceSlots + i, b->pReferenceSlots + i, onFail);
+    if (!((a->referenceSlotCount) == (b->referenceSlotCount))) {
+        onFail("a->referenceSlotCount (Error: Value not equal)");
+    };
+    if ((a->pReferenceSlots) && (b->pReferenceSlots)) {
+        if (!((a->referenceSlotCount) == (b->referenceSlotCount))) {
+            onFail("a->pReferenceSlots (Error: Lengths not equal)");
+        };
+        if ((a->referenceSlotCount) == (b->referenceSlotCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->referenceSlotCount; ++i) {
+                    checkEqual_VkVideoReferenceSlotKHR(a->pReferenceSlots + i,
+                                                       b->pReferenceSlots + i, onFail);
                 }
             }
         }
     }
 }
 
-void checkEqual_VkVideoEncodeRateControlInfoKHR(
-    const VkVideoEncodeRateControlInfoKHR* a,
-    const VkVideoEncodeRateControlInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkVideoEncodeRateControlInfoKHR(const VkVideoEncodeRateControlInfoKHR* a,
+                                                const VkVideoEncodeRateControlInfoKHR* b,
+                                                OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->rateControlMode) == (b->rateControlMode))) { onFail("a->rateControlMode (Error: Value not equal)"); };
-    if (!((a->averageBitrate) == (b->averageBitrate))) { onFail("a->averageBitrate (Error: Value not equal)"); };
-    if (!((a->peakToAverageBitrateRatio) == (b->peakToAverageBitrateRatio))) { onFail("a->peakToAverageBitrateRatio (Error: Value not equal)"); };
-    if (!((a->frameRateNumerator) == (b->frameRateNumerator))) { onFail("a->frameRateNumerator (Error: Value not equal)"); };
-    if (!((a->frameRateDenominator) == (b->frameRateDenominator))) { onFail("a->frameRateDenominator (Error: Value not equal)"); };
-    if (!((a->virtualBufferSizeInMs) == (b->virtualBufferSizeInMs))) { onFail("a->virtualBufferSizeInMs (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->rateControlMode) == (b->rateControlMode))) {
+        onFail("a->rateControlMode (Error: Value not equal)");
+    };
+    if (!((a->averageBitrate) == (b->averageBitrate))) {
+        onFail("a->averageBitrate (Error: Value not equal)");
+    };
+    if (!((a->peakToAverageBitrateRatio) == (b->peakToAverageBitrateRatio))) {
+        onFail("a->peakToAverageBitrateRatio (Error: Value not equal)");
+    };
+    if (!((a->frameRateNumerator) == (b->frameRateNumerator))) {
+        onFail("a->frameRateNumerator (Error: Value not equal)");
+    };
+    if (!((a->frameRateDenominator) == (b->frameRateDenominator))) {
+        onFail("a->frameRateDenominator (Error: Value not equal)");
+    };
+    if (!((a->virtualBufferSizeInMs) == (b->virtualBufferSizeInMs))) {
+        onFail("a->virtualBufferSizeInMs (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_KHR_synchronization2
-void checkEqual_VkMemoryBarrier2KHR(
-    const VkMemoryBarrier2KHR* a,
-    const VkMemoryBarrier2KHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkMemoryBarrier2KHR(const VkMemoryBarrier2KHR* a, const VkMemoryBarrier2KHR* b,
+                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->srcStageMask) == (b->srcStageMask))) { onFail("a->srcStageMask (Error: Value not equal)"); };
-    if (!((a->srcAccessMask) == (b->srcAccessMask))) { onFail("a->srcAccessMask (Error: Value not equal)"); };
-    if (!((a->dstStageMask) == (b->dstStageMask))) { onFail("a->dstStageMask (Error: Value not equal)"); };
-    if (!((a->dstAccessMask) == (b->dstAccessMask))) { onFail("a->dstAccessMask (Error: Value not equal)"); };
+    if (!((a->srcStageMask) == (b->srcStageMask))) {
+        onFail("a->srcStageMask (Error: Value not equal)");
+    };
+    if (!((a->srcAccessMask) == (b->srcAccessMask))) {
+        onFail("a->srcAccessMask (Error: Value not equal)");
+    };
+    if (!((a->dstStageMask) == (b->dstStageMask))) {
+        onFail("a->dstStageMask (Error: Value not equal)");
+    };
+    if (!((a->dstAccessMask) == (b->dstAccessMask))) {
+        onFail("a->dstAccessMask (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkBufferMemoryBarrier2KHR(
-    const VkBufferMemoryBarrier2KHR* a,
-    const VkBufferMemoryBarrier2KHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkBufferMemoryBarrier2KHR(const VkBufferMemoryBarrier2KHR* a,
+                                          const VkBufferMemoryBarrier2KHR* b,
+                                          OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->srcStageMask) == (b->srcStageMask))) { onFail("a->srcStageMask (Error: Value not equal)"); };
-    if (!((a->srcAccessMask) == (b->srcAccessMask))) { onFail("a->srcAccessMask (Error: Value not equal)"); };
-    if (!((a->dstStageMask) == (b->dstStageMask))) { onFail("a->dstStageMask (Error: Value not equal)"); };
-    if (!((a->dstAccessMask) == (b->dstAccessMask))) { onFail("a->dstAccessMask (Error: Value not equal)"); };
-    if (!((a->srcQueueFamilyIndex) == (b->srcQueueFamilyIndex))) { onFail("a->srcQueueFamilyIndex (Error: Value not equal)"); };
-    if (!((a->dstQueueFamilyIndex) == (b->dstQueueFamilyIndex))) { onFail("a->dstQueueFamilyIndex (Error: Value not equal)"); };
-    if (!((a->buffer) == (b->buffer))) { onFail("a->buffer (Error: Value not equal)"); };
-    if (!((a->offset) == (b->offset))) { onFail("a->offset (Error: Value not equal)"); };
-    if (!((a->size) == (b->size))) { onFail("a->size (Error: Value not equal)"); };
+    if (!((a->srcStageMask) == (b->srcStageMask))) {
+        onFail("a->srcStageMask (Error: Value not equal)");
+    };
+    if (!((a->srcAccessMask) == (b->srcAccessMask))) {
+        onFail("a->srcAccessMask (Error: Value not equal)");
+    };
+    if (!((a->dstStageMask) == (b->dstStageMask))) {
+        onFail("a->dstStageMask (Error: Value not equal)");
+    };
+    if (!((a->dstAccessMask) == (b->dstAccessMask))) {
+        onFail("a->dstAccessMask (Error: Value not equal)");
+    };
+    if (!((a->srcQueueFamilyIndex) == (b->srcQueueFamilyIndex))) {
+        onFail("a->srcQueueFamilyIndex (Error: Value not equal)");
+    };
+    if (!((a->dstQueueFamilyIndex) == (b->dstQueueFamilyIndex))) {
+        onFail("a->dstQueueFamilyIndex (Error: Value not equal)");
+    };
+    if (!((a->buffer) == (b->buffer))) {
+        onFail("a->buffer (Error: Value not equal)");
+    };
+    if (!((a->offset) == (b->offset))) {
+        onFail("a->offset (Error: Value not equal)");
+    };
+    if (!((a->size) == (b->size))) {
+        onFail("a->size (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkImageMemoryBarrier2KHR(
-    const VkImageMemoryBarrier2KHR* a,
-    const VkImageMemoryBarrier2KHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkImageMemoryBarrier2KHR(const VkImageMemoryBarrier2KHR* a,
+                                         const VkImageMemoryBarrier2KHR* b,
+                                         OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->srcStageMask) == (b->srcStageMask))) { onFail("a->srcStageMask (Error: Value not equal)"); };
-    if (!((a->srcAccessMask) == (b->srcAccessMask))) { onFail("a->srcAccessMask (Error: Value not equal)"); };
-    if (!((a->dstStageMask) == (b->dstStageMask))) { onFail("a->dstStageMask (Error: Value not equal)"); };
-    if (!((a->dstAccessMask) == (b->dstAccessMask))) { onFail("a->dstAccessMask (Error: Value not equal)"); };
-    if (!((a->oldLayout) == (b->oldLayout))) { onFail("a->oldLayout (Error: Value not equal)"); };
-    if (!((a->newLayout) == (b->newLayout))) { onFail("a->newLayout (Error: Value not equal)"); };
-    if (!((a->srcQueueFamilyIndex) == (b->srcQueueFamilyIndex))) { onFail("a->srcQueueFamilyIndex (Error: Value not equal)"); };
-    if (!((a->dstQueueFamilyIndex) == (b->dstQueueFamilyIndex))) { onFail("a->dstQueueFamilyIndex (Error: Value not equal)"); };
-    if (!((a->image) == (b->image))) { onFail("a->image (Error: Value not equal)"); };
+    if (!((a->srcStageMask) == (b->srcStageMask))) {
+        onFail("a->srcStageMask (Error: Value not equal)");
+    };
+    if (!((a->srcAccessMask) == (b->srcAccessMask))) {
+        onFail("a->srcAccessMask (Error: Value not equal)");
+    };
+    if (!((a->dstStageMask) == (b->dstStageMask))) {
+        onFail("a->dstStageMask (Error: Value not equal)");
+    };
+    if (!((a->dstAccessMask) == (b->dstAccessMask))) {
+        onFail("a->dstAccessMask (Error: Value not equal)");
+    };
+    if (!((a->oldLayout) == (b->oldLayout))) {
+        onFail("a->oldLayout (Error: Value not equal)");
+    };
+    if (!((a->newLayout) == (b->newLayout))) {
+        onFail("a->newLayout (Error: Value not equal)");
+    };
+    if (!((a->srcQueueFamilyIndex) == (b->srcQueueFamilyIndex))) {
+        onFail("a->srcQueueFamilyIndex (Error: Value not equal)");
+    };
+    if (!((a->dstQueueFamilyIndex) == (b->dstQueueFamilyIndex))) {
+        onFail("a->dstQueueFamilyIndex (Error: Value not equal)");
+    };
+    if (!((a->image) == (b->image))) {
+        onFail("a->image (Error: Value not equal)");
+    };
     checkEqual_VkImageSubresourceRange(&a->subresourceRange, &b->subresourceRange, onFail);
 }
 
-void checkEqual_VkDependencyInfoKHR(
-    const VkDependencyInfoKHR* a,
-    const VkDependencyInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDependencyInfoKHR(const VkDependencyInfoKHR* a, const VkDependencyInfoKHR* b,
+                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->dependencyFlags) == (b->dependencyFlags))) { onFail("a->dependencyFlags (Error: Value not equal)"); };
-    if (!((a->memoryBarrierCount) == (b->memoryBarrierCount))) { onFail("a->memoryBarrierCount (Error: Value not equal)"); };
-    if ((a->pMemoryBarriers) && (b->pMemoryBarriers))
-    {
-        if (!((a->memoryBarrierCount) == (b->memoryBarrierCount))) { onFail("a->pMemoryBarriers (Error: Lengths not equal)"); };
-        if ((a->memoryBarrierCount) == (b->memoryBarrierCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->memoryBarrierCount; ++i)
-                {
-                    checkEqual_VkMemoryBarrier2KHR(a->pMemoryBarriers + i, b->pMemoryBarriers + i, onFail);
+    if (!((a->dependencyFlags) == (b->dependencyFlags))) {
+        onFail("a->dependencyFlags (Error: Value not equal)");
+    };
+    if (!((a->memoryBarrierCount) == (b->memoryBarrierCount))) {
+        onFail("a->memoryBarrierCount (Error: Value not equal)");
+    };
+    if ((a->pMemoryBarriers) && (b->pMemoryBarriers)) {
+        if (!((a->memoryBarrierCount) == (b->memoryBarrierCount))) {
+            onFail("a->pMemoryBarriers (Error: Lengths not equal)");
+        };
+        if ((a->memoryBarrierCount) == (b->memoryBarrierCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->memoryBarrierCount; ++i) {
+                    checkEqual_VkMemoryBarrier2KHR(a->pMemoryBarriers + i, b->pMemoryBarriers + i,
+                                                   onFail);
                 }
             }
         }
     }
-    if (!((a->bufferMemoryBarrierCount) == (b->bufferMemoryBarrierCount))) { onFail("a->bufferMemoryBarrierCount (Error: Value not equal)"); };
-    if ((a->pBufferMemoryBarriers) && (b->pBufferMemoryBarriers))
-    {
-        if (!((a->bufferMemoryBarrierCount) == (b->bufferMemoryBarrierCount))) { onFail("a->pBufferMemoryBarriers (Error: Lengths not equal)"); };
-        if ((a->bufferMemoryBarrierCount) == (b->bufferMemoryBarrierCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->bufferMemoryBarrierCount; ++i)
-                {
-                    checkEqual_VkBufferMemoryBarrier2KHR(a->pBufferMemoryBarriers + i, b->pBufferMemoryBarriers + i, onFail);
+    if (!((a->bufferMemoryBarrierCount) == (b->bufferMemoryBarrierCount))) {
+        onFail("a->bufferMemoryBarrierCount (Error: Value not equal)");
+    };
+    if ((a->pBufferMemoryBarriers) && (b->pBufferMemoryBarriers)) {
+        if (!((a->bufferMemoryBarrierCount) == (b->bufferMemoryBarrierCount))) {
+            onFail("a->pBufferMemoryBarriers (Error: Lengths not equal)");
+        };
+        if ((a->bufferMemoryBarrierCount) == (b->bufferMemoryBarrierCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->bufferMemoryBarrierCount; ++i) {
+                    checkEqual_VkBufferMemoryBarrier2KHR(a->pBufferMemoryBarriers + i,
+                                                         b->pBufferMemoryBarriers + i, onFail);
                 }
             }
         }
     }
-    if (!((a->imageMemoryBarrierCount) == (b->imageMemoryBarrierCount))) { onFail("a->imageMemoryBarrierCount (Error: Value not equal)"); };
-    if ((a->pImageMemoryBarriers) && (b->pImageMemoryBarriers))
-    {
-        if (!((a->imageMemoryBarrierCount) == (b->imageMemoryBarrierCount))) { onFail("a->pImageMemoryBarriers (Error: Lengths not equal)"); };
-        if ((a->imageMemoryBarrierCount) == (b->imageMemoryBarrierCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->imageMemoryBarrierCount; ++i)
-                {
-                    checkEqual_VkImageMemoryBarrier2KHR(a->pImageMemoryBarriers + i, b->pImageMemoryBarriers + i, onFail);
+    if (!((a->imageMemoryBarrierCount) == (b->imageMemoryBarrierCount))) {
+        onFail("a->imageMemoryBarrierCount (Error: Value not equal)");
+    };
+    if ((a->pImageMemoryBarriers) && (b->pImageMemoryBarriers)) {
+        if (!((a->imageMemoryBarrierCount) == (b->imageMemoryBarrierCount))) {
+            onFail("a->pImageMemoryBarriers (Error: Lengths not equal)");
+        };
+        if ((a->imageMemoryBarrierCount) == (b->imageMemoryBarrierCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->imageMemoryBarrierCount; ++i) {
+                    checkEqual_VkImageMemoryBarrier2KHR(a->pImageMemoryBarriers + i,
+                                                        b->pImageMemoryBarriers + i, onFail);
                 }
             }
         }
     }
 }
 
-void checkEqual_VkSemaphoreSubmitInfoKHR(
-    const VkSemaphoreSubmitInfoKHR* a,
-    const VkSemaphoreSubmitInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkSemaphoreSubmitInfoKHR(const VkSemaphoreSubmitInfoKHR* a,
+                                         const VkSemaphoreSubmitInfoKHR* b,
+                                         OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->semaphore) == (b->semaphore))) { onFail("a->semaphore (Error: Value not equal)"); };
-    if (!((a->value) == (b->value))) { onFail("a->value (Error: Value not equal)"); };
-    if (!((a->stageMask) == (b->stageMask))) { onFail("a->stageMask (Error: Value not equal)"); };
-    if (!((a->deviceIndex) == (b->deviceIndex))) { onFail("a->deviceIndex (Error: Value not equal)"); };
+    if (!((a->semaphore) == (b->semaphore))) {
+        onFail("a->semaphore (Error: Value not equal)");
+    };
+    if (!((a->value) == (b->value))) {
+        onFail("a->value (Error: Value not equal)");
+    };
+    if (!((a->stageMask) == (b->stageMask))) {
+        onFail("a->stageMask (Error: Value not equal)");
+    };
+    if (!((a->deviceIndex) == (b->deviceIndex))) {
+        onFail("a->deviceIndex (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkCommandBufferSubmitInfoKHR(
-    const VkCommandBufferSubmitInfoKHR* a,
-    const VkCommandBufferSubmitInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkCommandBufferSubmitInfoKHR(const VkCommandBufferSubmitInfoKHR* a,
+                                             const VkCommandBufferSubmitInfoKHR* b,
+                                             OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->commandBuffer) == (b->commandBuffer))) { onFail("a->commandBuffer (Error: Value not equal)"); };
-    if (!((a->deviceMask) == (b->deviceMask))) { onFail("a->deviceMask (Error: Value not equal)"); };
+    if (!((a->commandBuffer) == (b->commandBuffer))) {
+        onFail("a->commandBuffer (Error: Value not equal)");
+    };
+    if (!((a->deviceMask) == (b->deviceMask))) {
+        onFail("a->deviceMask (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkSubmitInfo2KHR(
-    const VkSubmitInfo2KHR* a,
-    const VkSubmitInfo2KHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkSubmitInfo2KHR(const VkSubmitInfo2KHR* a, const VkSubmitInfo2KHR* b,
+                                 OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->waitSemaphoreInfoCount) == (b->waitSemaphoreInfoCount))) { onFail("a->waitSemaphoreInfoCount (Error: Value not equal)"); };
-    if ((a->pWaitSemaphoreInfos) && (b->pWaitSemaphoreInfos))
-    {
-        if (!((a->waitSemaphoreInfoCount) == (b->waitSemaphoreInfoCount))) { onFail("a->pWaitSemaphoreInfos (Error: Lengths not equal)"); };
-        if ((a->waitSemaphoreInfoCount) == (b->waitSemaphoreInfoCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->waitSemaphoreInfoCount; ++i)
-                {
-                    checkEqual_VkSemaphoreSubmitInfoKHR(a->pWaitSemaphoreInfos + i, b->pWaitSemaphoreInfos + i, onFail);
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->waitSemaphoreInfoCount) == (b->waitSemaphoreInfoCount))) {
+        onFail("a->waitSemaphoreInfoCount (Error: Value not equal)");
+    };
+    if ((a->pWaitSemaphoreInfos) && (b->pWaitSemaphoreInfos)) {
+        if (!((a->waitSemaphoreInfoCount) == (b->waitSemaphoreInfoCount))) {
+            onFail("a->pWaitSemaphoreInfos (Error: Lengths not equal)");
+        };
+        if ((a->waitSemaphoreInfoCount) == (b->waitSemaphoreInfoCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->waitSemaphoreInfoCount; ++i) {
+                    checkEqual_VkSemaphoreSubmitInfoKHR(a->pWaitSemaphoreInfos + i,
+                                                        b->pWaitSemaphoreInfos + i, onFail);
                 }
             }
         }
     }
-    if (!((a->commandBufferInfoCount) == (b->commandBufferInfoCount))) { onFail("a->commandBufferInfoCount (Error: Value not equal)"); };
-    if ((a->pCommandBufferInfos) && (b->pCommandBufferInfos))
-    {
-        if (!((a->commandBufferInfoCount) == (b->commandBufferInfoCount))) { onFail("a->pCommandBufferInfos (Error: Lengths not equal)"); };
-        if ((a->commandBufferInfoCount) == (b->commandBufferInfoCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->commandBufferInfoCount; ++i)
-                {
-                    checkEqual_VkCommandBufferSubmitInfoKHR(a->pCommandBufferInfos + i, b->pCommandBufferInfos + i, onFail);
+    if (!((a->commandBufferInfoCount) == (b->commandBufferInfoCount))) {
+        onFail("a->commandBufferInfoCount (Error: Value not equal)");
+    };
+    if ((a->pCommandBufferInfos) && (b->pCommandBufferInfos)) {
+        if (!((a->commandBufferInfoCount) == (b->commandBufferInfoCount))) {
+            onFail("a->pCommandBufferInfos (Error: Lengths not equal)");
+        };
+        if ((a->commandBufferInfoCount) == (b->commandBufferInfoCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->commandBufferInfoCount; ++i) {
+                    checkEqual_VkCommandBufferSubmitInfoKHR(a->pCommandBufferInfos + i,
+                                                            b->pCommandBufferInfos + i, onFail);
                 }
             }
         }
     }
-    if (!((a->signalSemaphoreInfoCount) == (b->signalSemaphoreInfoCount))) { onFail("a->signalSemaphoreInfoCount (Error: Value not equal)"); };
-    if ((a->pSignalSemaphoreInfos) && (b->pSignalSemaphoreInfos))
-    {
-        if (!((a->signalSemaphoreInfoCount) == (b->signalSemaphoreInfoCount))) { onFail("a->pSignalSemaphoreInfos (Error: Lengths not equal)"); };
-        if ((a->signalSemaphoreInfoCount) == (b->signalSemaphoreInfoCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->signalSemaphoreInfoCount; ++i)
-                {
-                    checkEqual_VkSemaphoreSubmitInfoKHR(a->pSignalSemaphoreInfos + i, b->pSignalSemaphoreInfos + i, onFail);
+    if (!((a->signalSemaphoreInfoCount) == (b->signalSemaphoreInfoCount))) {
+        onFail("a->signalSemaphoreInfoCount (Error: Value not equal)");
+    };
+    if ((a->pSignalSemaphoreInfos) && (b->pSignalSemaphoreInfos)) {
+        if (!((a->signalSemaphoreInfoCount) == (b->signalSemaphoreInfoCount))) {
+            onFail("a->pSignalSemaphoreInfos (Error: Lengths not equal)");
+        };
+        if ((a->signalSemaphoreInfoCount) == (b->signalSemaphoreInfoCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->signalSemaphoreInfoCount; ++i) {
+                    checkEqual_VkSemaphoreSubmitInfoKHR(a->pSignalSemaphoreInfos + i,
+                                                        b->pSignalSemaphoreInfos + i, onFail);
                 }
             }
         }
@@ -6661,42 +9328,47 @@
 
 void checkEqual_VkPhysicalDeviceSynchronization2FeaturesKHR(
     const VkPhysicalDeviceSynchronization2FeaturesKHR* a,
-    const VkPhysicalDeviceSynchronization2FeaturesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceSynchronization2FeaturesKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->synchronization2) == (b->synchronization2))) { onFail("a->synchronization2 (Error: Value not equal)"); };
+    if (!((a->synchronization2) == (b->synchronization2))) {
+        onFail("a->synchronization2 (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkQueueFamilyCheckpointProperties2NV(
-    const VkQueueFamilyCheckpointProperties2NV* a,
-    const VkQueueFamilyCheckpointProperties2NV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkQueueFamilyCheckpointProperties2NV(const VkQueueFamilyCheckpointProperties2NV* a,
+                                                     const VkQueueFamilyCheckpointProperties2NV* b,
+                                                     OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->checkpointExecutionStageMask) == (b->checkpointExecutionStageMask))) { onFail("a->checkpointExecutionStageMask (Error: Value not equal)"); };
+    if (!((a->checkpointExecutionStageMask) == (b->checkpointExecutionStageMask))) {
+        onFail("a->checkpointExecutionStageMask (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkCheckpointData2NV(
-    const VkCheckpointData2NV* a,
-    const VkCheckpointData2NV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkCheckpointData2NV(const VkCheckpointData2NV* a, const VkCheckpointData2NV* b,
+                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->stage) == (b->stage))) { onFail("a->stage (Error: Value not equal)"); };
-    if (!((!(a->pCheckpointMarker) && !(b->pCheckpointMarker)) || ((a->pCheckpointMarker) && (b->pCheckpointMarker)))) { onFail("a->pCheckpointMarker (Error: Mismatch in optional field)"); };
+    if (!((a->stage) == (b->stage))) {
+        onFail("a->stage (Error: Value not equal)");
+    };
+    if (!((!(a->pCheckpointMarker) && !(b->pCheckpointMarker)) ||
+          ((a->pCheckpointMarker) && (b->pCheckpointMarker)))) {
+        onFail("a->pCheckpointMarker (Error: Mismatch in optional field)");
+    };
 }
 
 #endif
@@ -6704,88 +9376,107 @@
 void checkEqual_VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR(
     const VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR* a,
     const VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->shaderSubgroupUniformControlFlow) == (b->shaderSubgroupUniformControlFlow))) { onFail("a->shaderSubgroupUniformControlFlow (Error: Value not equal)"); };
+    if (!((a->shaderSubgroupUniformControlFlow) == (b->shaderSubgroupUniformControlFlow))) {
+        onFail("a->shaderSubgroupUniformControlFlow (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_KHR_zero_initialize_workgroup_memory
 void checkEqual_VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR(
     const VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR* a,
-    const VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->shaderZeroInitializeWorkgroupMemory) == (b->shaderZeroInitializeWorkgroupMemory))) { onFail("a->shaderZeroInitializeWorkgroupMemory (Error: Value not equal)"); };
+    if (!((a->shaderZeroInitializeWorkgroupMemory) == (b->shaderZeroInitializeWorkgroupMemory))) {
+        onFail("a->shaderZeroInitializeWorkgroupMemory (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_KHR_workgroup_memory_explicit_layout
 void checkEqual_VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR(
     const VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR* a,
-    const VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->workgroupMemoryExplicitLayout) == (b->workgroupMemoryExplicitLayout))) { onFail("a->workgroupMemoryExplicitLayout (Error: Value not equal)"); };
-    if (!((a->workgroupMemoryExplicitLayoutScalarBlockLayout) == (b->workgroupMemoryExplicitLayoutScalarBlockLayout))) { onFail("a->workgroupMemoryExplicitLayoutScalarBlockLayout (Error: Value not equal)"); };
-    if (!((a->workgroupMemoryExplicitLayout8BitAccess) == (b->workgroupMemoryExplicitLayout8BitAccess))) { onFail("a->workgroupMemoryExplicitLayout8BitAccess (Error: Value not equal)"); };
-    if (!((a->workgroupMemoryExplicitLayout16BitAccess) == (b->workgroupMemoryExplicitLayout16BitAccess))) { onFail("a->workgroupMemoryExplicitLayout16BitAccess (Error: Value not equal)"); };
+    if (!((a->workgroupMemoryExplicitLayout) == (b->workgroupMemoryExplicitLayout))) {
+        onFail("a->workgroupMemoryExplicitLayout (Error: Value not equal)");
+    };
+    if (!((a->workgroupMemoryExplicitLayoutScalarBlockLayout) ==
+          (b->workgroupMemoryExplicitLayoutScalarBlockLayout))) {
+        onFail("a->workgroupMemoryExplicitLayoutScalarBlockLayout (Error: Value not equal)");
+    };
+    if (!((a->workgroupMemoryExplicitLayout8BitAccess) ==
+          (b->workgroupMemoryExplicitLayout8BitAccess))) {
+        onFail("a->workgroupMemoryExplicitLayout8BitAccess (Error: Value not equal)");
+    };
+    if (!((a->workgroupMemoryExplicitLayout16BitAccess) ==
+          (b->workgroupMemoryExplicitLayout16BitAccess))) {
+        onFail("a->workgroupMemoryExplicitLayout16BitAccess (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_KHR_copy_commands2
-void checkEqual_VkBufferCopy2KHR(
-    const VkBufferCopy2KHR* a,
-    const VkBufferCopy2KHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkBufferCopy2KHR(const VkBufferCopy2KHR* a, const VkBufferCopy2KHR* b,
+                                 OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->srcOffset) == (b->srcOffset))) { onFail("a->srcOffset (Error: Value not equal)"); };
-    if (!((a->dstOffset) == (b->dstOffset))) { onFail("a->dstOffset (Error: Value not equal)"); };
-    if (!((a->size) == (b->size))) { onFail("a->size (Error: Value not equal)"); };
+    if (!((a->srcOffset) == (b->srcOffset))) {
+        onFail("a->srcOffset (Error: Value not equal)");
+    };
+    if (!((a->dstOffset) == (b->dstOffset))) {
+        onFail("a->dstOffset (Error: Value not equal)");
+    };
+    if (!((a->size) == (b->size))) {
+        onFail("a->size (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkCopyBufferInfo2KHR(
-    const VkCopyBufferInfo2KHR* a,
-    const VkCopyBufferInfo2KHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkCopyBufferInfo2KHR(const VkCopyBufferInfo2KHR* a, const VkCopyBufferInfo2KHR* b,
+                                     OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->srcBuffer) == (b->srcBuffer))) { onFail("a->srcBuffer (Error: Value not equal)"); };
-    if (!((a->dstBuffer) == (b->dstBuffer))) { onFail("a->dstBuffer (Error: Value not equal)"); };
-    if (!((a->regionCount) == (b->regionCount))) { onFail("a->regionCount (Error: Value not equal)"); };
-    if ((a->pRegions) && (b->pRegions))
-    {
-        if (!((a->regionCount) == (b->regionCount))) { onFail("a->pRegions (Error: Lengths not equal)"); };
-        if ((a->regionCount) == (b->regionCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->regionCount; ++i)
-                {
+    if (!((a->srcBuffer) == (b->srcBuffer))) {
+        onFail("a->srcBuffer (Error: Value not equal)");
+    };
+    if (!((a->dstBuffer) == (b->dstBuffer))) {
+        onFail("a->dstBuffer (Error: Value not equal)");
+    };
+    if (!((a->regionCount) == (b->regionCount))) {
+        onFail("a->regionCount (Error: Value not equal)");
+    };
+    if ((a->pRegions) && (b->pRegions)) {
+        if (!((a->regionCount) == (b->regionCount))) {
+            onFail("a->pRegions (Error: Lengths not equal)");
+        };
+        if ((a->regionCount) == (b->regionCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->regionCount; ++i) {
                     checkEqual_VkBufferCopy2KHR(a->pRegions + i, b->pRegions + i, onFail);
                 }
             }
@@ -6793,14 +9484,12 @@
     }
 }
 
-void checkEqual_VkImageCopy2KHR(
-    const VkImageCopy2KHR* a,
-    const VkImageCopy2KHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkImageCopy2KHR(const VkImageCopy2KHR* a, const VkImageCopy2KHR* b,
+                                OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
     checkEqual_VkImageSubresourceLayers(&a->srcSubresource, &b->srcSubresource, onFail);
@@ -6810,30 +9499,36 @@
     checkEqual_VkExtent3D(&a->extent, &b->extent, onFail);
 }
 
-void checkEqual_VkCopyImageInfo2KHR(
-    const VkCopyImageInfo2KHR* a,
-    const VkCopyImageInfo2KHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkCopyImageInfo2KHR(const VkCopyImageInfo2KHR* a, const VkCopyImageInfo2KHR* b,
+                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->srcImage) == (b->srcImage))) { onFail("a->srcImage (Error: Value not equal)"); };
-    if (!((a->srcImageLayout) == (b->srcImageLayout))) { onFail("a->srcImageLayout (Error: Value not equal)"); };
-    if (!((a->dstImage) == (b->dstImage))) { onFail("a->dstImage (Error: Value not equal)"); };
-    if (!((a->dstImageLayout) == (b->dstImageLayout))) { onFail("a->dstImageLayout (Error: Value not equal)"); };
-    if (!((a->regionCount) == (b->regionCount))) { onFail("a->regionCount (Error: Value not equal)"); };
-    if ((a->pRegions) && (b->pRegions))
-    {
-        if (!((a->regionCount) == (b->regionCount))) { onFail("a->pRegions (Error: Lengths not equal)"); };
-        if ((a->regionCount) == (b->regionCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->regionCount; ++i)
-                {
+    if (!((a->srcImage) == (b->srcImage))) {
+        onFail("a->srcImage (Error: Value not equal)");
+    };
+    if (!((a->srcImageLayout) == (b->srcImageLayout))) {
+        onFail("a->srcImageLayout (Error: Value not equal)");
+    };
+    if (!((a->dstImage) == (b->dstImage))) {
+        onFail("a->dstImage (Error: Value not equal)");
+    };
+    if (!((a->dstImageLayout) == (b->dstImageLayout))) {
+        onFail("a->dstImageLayout (Error: Value not equal)");
+    };
+    if (!((a->regionCount) == (b->regionCount))) {
+        onFail("a->regionCount (Error: Value not equal)");
+    };
+    if ((a->pRegions) && (b->pRegions)) {
+        if (!((a->regionCount) == (b->regionCount))) {
+            onFail("a->pRegions (Error: Lengths not equal)");
+        };
+        if ((a->regionCount) == (b->regionCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->regionCount; ++i) {
                     checkEqual_VkImageCopy2KHR(a->pRegions + i, b->pRegions + i, onFail);
                 }
             }
@@ -6841,47 +9536,56 @@
     }
 }
 
-void checkEqual_VkBufferImageCopy2KHR(
-    const VkBufferImageCopy2KHR* a,
-    const VkBufferImageCopy2KHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkBufferImageCopy2KHR(const VkBufferImageCopy2KHR* a,
+                                      const VkBufferImageCopy2KHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->bufferOffset) == (b->bufferOffset))) { onFail("a->bufferOffset (Error: Value not equal)"); };
-    if (!((a->bufferRowLength) == (b->bufferRowLength))) { onFail("a->bufferRowLength (Error: Value not equal)"); };
-    if (!((a->bufferImageHeight) == (b->bufferImageHeight))) { onFail("a->bufferImageHeight (Error: Value not equal)"); };
+    if (!((a->bufferOffset) == (b->bufferOffset))) {
+        onFail("a->bufferOffset (Error: Value not equal)");
+    };
+    if (!((a->bufferRowLength) == (b->bufferRowLength))) {
+        onFail("a->bufferRowLength (Error: Value not equal)");
+    };
+    if (!((a->bufferImageHeight) == (b->bufferImageHeight))) {
+        onFail("a->bufferImageHeight (Error: Value not equal)");
+    };
     checkEqual_VkImageSubresourceLayers(&a->imageSubresource, &b->imageSubresource, onFail);
     checkEqual_VkOffset3D(&a->imageOffset, &b->imageOffset, onFail);
     checkEqual_VkExtent3D(&a->imageExtent, &b->imageExtent, onFail);
 }
 
-void checkEqual_VkCopyBufferToImageInfo2KHR(
-    const VkCopyBufferToImageInfo2KHR* a,
-    const VkCopyBufferToImageInfo2KHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkCopyBufferToImageInfo2KHR(const VkCopyBufferToImageInfo2KHR* a,
+                                            const VkCopyBufferToImageInfo2KHR* b,
+                                            OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->srcBuffer) == (b->srcBuffer))) { onFail("a->srcBuffer (Error: Value not equal)"); };
-    if (!((a->dstImage) == (b->dstImage))) { onFail("a->dstImage (Error: Value not equal)"); };
-    if (!((a->dstImageLayout) == (b->dstImageLayout))) { onFail("a->dstImageLayout (Error: Value not equal)"); };
-    if (!((a->regionCount) == (b->regionCount))) { onFail("a->regionCount (Error: Value not equal)"); };
-    if ((a->pRegions) && (b->pRegions))
-    {
-        if (!((a->regionCount) == (b->regionCount))) { onFail("a->pRegions (Error: Lengths not equal)"); };
-        if ((a->regionCount) == (b->regionCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->regionCount; ++i)
-                {
+    if (!((a->srcBuffer) == (b->srcBuffer))) {
+        onFail("a->srcBuffer (Error: Value not equal)");
+    };
+    if (!((a->dstImage) == (b->dstImage))) {
+        onFail("a->dstImage (Error: Value not equal)");
+    };
+    if (!((a->dstImageLayout) == (b->dstImageLayout))) {
+        onFail("a->dstImageLayout (Error: Value not equal)");
+    };
+    if (!((a->regionCount) == (b->regionCount))) {
+        onFail("a->regionCount (Error: Value not equal)");
+    };
+    if ((a->pRegions) && (b->pRegions)) {
+        if (!((a->regionCount) == (b->regionCount))) {
+            onFail("a->pRegions (Error: Lengths not equal)");
+        };
+        if ((a->regionCount) == (b->regionCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->regionCount; ++i) {
                     checkEqual_VkBufferImageCopy2KHR(a->pRegions + i, b->pRegions + i, onFail);
                 }
             }
@@ -6889,29 +9593,34 @@
     }
 }
 
-void checkEqual_VkCopyImageToBufferInfo2KHR(
-    const VkCopyImageToBufferInfo2KHR* a,
-    const VkCopyImageToBufferInfo2KHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkCopyImageToBufferInfo2KHR(const VkCopyImageToBufferInfo2KHR* a,
+                                            const VkCopyImageToBufferInfo2KHR* b,
+                                            OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->srcImage) == (b->srcImage))) { onFail("a->srcImage (Error: Value not equal)"); };
-    if (!((a->srcImageLayout) == (b->srcImageLayout))) { onFail("a->srcImageLayout (Error: Value not equal)"); };
-    if (!((a->dstBuffer) == (b->dstBuffer))) { onFail("a->dstBuffer (Error: Value not equal)"); };
-    if (!((a->regionCount) == (b->regionCount))) { onFail("a->regionCount (Error: Value not equal)"); };
-    if ((a->pRegions) && (b->pRegions))
-    {
-        if (!((a->regionCount) == (b->regionCount))) { onFail("a->pRegions (Error: Lengths not equal)"); };
-        if ((a->regionCount) == (b->regionCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->regionCount; ++i)
-                {
+    if (!((a->srcImage) == (b->srcImage))) {
+        onFail("a->srcImage (Error: Value not equal)");
+    };
+    if (!((a->srcImageLayout) == (b->srcImageLayout))) {
+        onFail("a->srcImageLayout (Error: Value not equal)");
+    };
+    if (!((a->dstBuffer) == (b->dstBuffer))) {
+        onFail("a->dstBuffer (Error: Value not equal)");
+    };
+    if (!((a->regionCount) == (b->regionCount))) {
+        onFail("a->regionCount (Error: Value not equal)");
+    };
+    if ((a->pRegions) && (b->pRegions)) {
+        if (!((a->regionCount) == (b->regionCount))) {
+            onFail("a->pRegions (Error: Lengths not equal)");
+        };
+        if ((a->regionCount) == (b->regionCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->regionCount; ++i) {
                     checkEqual_VkBufferImageCopy2KHR(a->pRegions + i, b->pRegions + i, onFail);
                 }
             }
@@ -6919,70 +9628,76 @@
     }
 }
 
-void checkEqual_VkImageBlit2KHR(
-    const VkImageBlit2KHR* a,
-    const VkImageBlit2KHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkImageBlit2KHR(const VkImageBlit2KHR* a, const VkImageBlit2KHR* b,
+                                OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
     checkEqual_VkImageSubresourceLayers(&a->srcSubresource, &b->srcSubresource, onFail);
-    if (!((2) == (2))) { onFail("a->srcOffsets (Error: Lengths not equal)"); };
-    for (uint32_t i = 0; i < (uint32_t)2; ++i)
-    {
+    if (!((2) == (2))) {
+        onFail("a->srcOffsets (Error: Lengths not equal)");
+    };
+    for (uint32_t i = 0; i < (uint32_t)2; ++i) {
         checkEqual_VkOffset3D(a->srcOffsets + i, b->srcOffsets + i, onFail);
     }
     checkEqual_VkImageSubresourceLayers(&a->dstSubresource, &b->dstSubresource, onFail);
-    if (!((2) == (2))) { onFail("a->dstOffsets (Error: Lengths not equal)"); };
-    for (uint32_t i = 0; i < (uint32_t)2; ++i)
-    {
+    if (!((2) == (2))) {
+        onFail("a->dstOffsets (Error: Lengths not equal)");
+    };
+    for (uint32_t i = 0; i < (uint32_t)2; ++i) {
         checkEqual_VkOffset3D(a->dstOffsets + i, b->dstOffsets + i, onFail);
     }
 }
 
-void checkEqual_VkBlitImageInfo2KHR(
-    const VkBlitImageInfo2KHR* a,
-    const VkBlitImageInfo2KHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkBlitImageInfo2KHR(const VkBlitImageInfo2KHR* a, const VkBlitImageInfo2KHR* b,
+                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->srcImage) == (b->srcImage))) { onFail("a->srcImage (Error: Value not equal)"); };
-    if (!((a->srcImageLayout) == (b->srcImageLayout))) { onFail("a->srcImageLayout (Error: Value not equal)"); };
-    if (!((a->dstImage) == (b->dstImage))) { onFail("a->dstImage (Error: Value not equal)"); };
-    if (!((a->dstImageLayout) == (b->dstImageLayout))) { onFail("a->dstImageLayout (Error: Value not equal)"); };
-    if (!((a->regionCount) == (b->regionCount))) { onFail("a->regionCount (Error: Value not equal)"); };
-    if ((a->pRegions) && (b->pRegions))
-    {
-        if (!((a->regionCount) == (b->regionCount))) { onFail("a->pRegions (Error: Lengths not equal)"); };
-        if ((a->regionCount) == (b->regionCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->regionCount; ++i)
-                {
+    if (!((a->srcImage) == (b->srcImage))) {
+        onFail("a->srcImage (Error: Value not equal)");
+    };
+    if (!((a->srcImageLayout) == (b->srcImageLayout))) {
+        onFail("a->srcImageLayout (Error: Value not equal)");
+    };
+    if (!((a->dstImage) == (b->dstImage))) {
+        onFail("a->dstImage (Error: Value not equal)");
+    };
+    if (!((a->dstImageLayout) == (b->dstImageLayout))) {
+        onFail("a->dstImageLayout (Error: Value not equal)");
+    };
+    if (!((a->regionCount) == (b->regionCount))) {
+        onFail("a->regionCount (Error: Value not equal)");
+    };
+    if ((a->pRegions) && (b->pRegions)) {
+        if (!((a->regionCount) == (b->regionCount))) {
+            onFail("a->pRegions (Error: Lengths not equal)");
+        };
+        if ((a->regionCount) == (b->regionCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->regionCount; ++i) {
                     checkEqual_VkImageBlit2KHR(a->pRegions + i, b->pRegions + i, onFail);
                 }
             }
         }
     }
-    if (!((a->filter) == (b->filter))) { onFail("a->filter (Error: Value not equal)"); };
+    if (!((a->filter) == (b->filter))) {
+        onFail("a->filter (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkImageResolve2KHR(
-    const VkImageResolve2KHR* a,
-    const VkImageResolve2KHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkImageResolve2KHR(const VkImageResolve2KHR* a, const VkImageResolve2KHR* b,
+                                   OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
     checkEqual_VkImageSubresourceLayers(&a->srcSubresource, &b->srcSubresource, onFail);
@@ -6992,30 +9707,36 @@
     checkEqual_VkExtent3D(&a->extent, &b->extent, onFail);
 }
 
-void checkEqual_VkResolveImageInfo2KHR(
-    const VkResolveImageInfo2KHR* a,
-    const VkResolveImageInfo2KHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkResolveImageInfo2KHR(const VkResolveImageInfo2KHR* a,
+                                       const VkResolveImageInfo2KHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->srcImage) == (b->srcImage))) { onFail("a->srcImage (Error: Value not equal)"); };
-    if (!((a->srcImageLayout) == (b->srcImageLayout))) { onFail("a->srcImageLayout (Error: Value not equal)"); };
-    if (!((a->dstImage) == (b->dstImage))) { onFail("a->dstImage (Error: Value not equal)"); };
-    if (!((a->dstImageLayout) == (b->dstImageLayout))) { onFail("a->dstImageLayout (Error: Value not equal)"); };
-    if (!((a->regionCount) == (b->regionCount))) { onFail("a->regionCount (Error: Value not equal)"); };
-    if ((a->pRegions) && (b->pRegions))
-    {
-        if (!((a->regionCount) == (b->regionCount))) { onFail("a->pRegions (Error: Lengths not equal)"); };
-        if ((a->regionCount) == (b->regionCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->regionCount; ++i)
-                {
+    if (!((a->srcImage) == (b->srcImage))) {
+        onFail("a->srcImage (Error: Value not equal)");
+    };
+    if (!((a->srcImageLayout) == (b->srcImageLayout))) {
+        onFail("a->srcImageLayout (Error: Value not equal)");
+    };
+    if (!((a->dstImage) == (b->dstImage))) {
+        onFail("a->dstImage (Error: Value not equal)");
+    };
+    if (!((a->dstImageLayout) == (b->dstImageLayout))) {
+        onFail("a->dstImageLayout (Error: Value not equal)");
+    };
+    if (!((a->regionCount) == (b->regionCount))) {
+        onFail("a->regionCount (Error: Value not equal)");
+    };
+    if ((a->pRegions) && (b->pRegions)) {
+        if (!((a->regionCount) == (b->regionCount))) {
+            onFail("a->pRegions (Error: Lengths not equal)");
+        };
+        if ((a->regionCount) == (b->regionCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->regionCount; ++i) {
                     checkEqual_VkImageResolve2KHR(a->pRegions + i, b->pRegions + i, onFail);
                 }
             }
@@ -7025,121 +9746,141 @@
 
 #endif
 #ifdef VK_KHR_format_feature_flags2
-void checkEqual_VkFormatProperties3KHR(
-    const VkFormatProperties3KHR* a,
-    const VkFormatProperties3KHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkFormatProperties3KHR(const VkFormatProperties3KHR* a,
+                                       const VkFormatProperties3KHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->linearTilingFeatures) == (b->linearTilingFeatures))) { onFail("a->linearTilingFeatures (Error: Value not equal)"); };
-    if (!((a->optimalTilingFeatures) == (b->optimalTilingFeatures))) { onFail("a->optimalTilingFeatures (Error: Value not equal)"); };
-    if (!((a->bufferFeatures) == (b->bufferFeatures))) { onFail("a->bufferFeatures (Error: Value not equal)"); };
+    if (!((a->linearTilingFeatures) == (b->linearTilingFeatures))) {
+        onFail("a->linearTilingFeatures (Error: Value not equal)");
+    };
+    if (!((a->optimalTilingFeatures) == (b->optimalTilingFeatures))) {
+        onFail("a->optimalTilingFeatures (Error: Value not equal)");
+    };
+    if (!((a->bufferFeatures) == (b->bufferFeatures))) {
+        onFail("a->bufferFeatures (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_KHR_maintenance4
 void checkEqual_VkPhysicalDeviceMaintenance4FeaturesKHR(
     const VkPhysicalDeviceMaintenance4FeaturesKHR* a,
-    const VkPhysicalDeviceMaintenance4FeaturesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceMaintenance4FeaturesKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->maintenance4) == (b->maintenance4))) { onFail("a->maintenance4 (Error: Value not equal)"); };
+    if (!((a->maintenance4) == (b->maintenance4))) {
+        onFail("a->maintenance4 (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceMaintenance4PropertiesKHR(
     const VkPhysicalDeviceMaintenance4PropertiesKHR* a,
-    const VkPhysicalDeviceMaintenance4PropertiesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceMaintenance4PropertiesKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->maxBufferSize) == (b->maxBufferSize))) { onFail("a->maxBufferSize (Error: Value not equal)"); };
+    if (!((a->maxBufferSize) == (b->maxBufferSize))) {
+        onFail("a->maxBufferSize (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkDeviceBufferMemoryRequirementsKHR(
-    const VkDeviceBufferMemoryRequirementsKHR* a,
-    const VkDeviceBufferMemoryRequirementsKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDeviceBufferMemoryRequirementsKHR(const VkDeviceBufferMemoryRequirementsKHR* a,
+                                                    const VkDeviceBufferMemoryRequirementsKHR* b,
+                                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if ((a->pCreateInfo) && (b->pCreateInfo))
-    {
+    if ((a->pCreateInfo) && (b->pCreateInfo)) {
         checkEqual_VkBufferCreateInfo(a->pCreateInfo, b->pCreateInfo, onFail);
     }
 }
 
-void checkEqual_VkDeviceImageMemoryRequirementsKHR(
-    const VkDeviceImageMemoryRequirementsKHR* a,
-    const VkDeviceImageMemoryRequirementsKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDeviceImageMemoryRequirementsKHR(const VkDeviceImageMemoryRequirementsKHR* a,
+                                                   const VkDeviceImageMemoryRequirementsKHR* b,
+                                                   OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if ((a->pCreateInfo) && (b->pCreateInfo))
-    {
+    if ((a->pCreateInfo) && (b->pCreateInfo)) {
         checkEqual_VkImageCreateInfo(a->pCreateInfo, b->pCreateInfo, onFail);
     }
-    if (!((a->planeAspect) == (b->planeAspect))) { onFail("a->planeAspect (Error: Value not equal)"); };
+    if (!((a->planeAspect) == (b->planeAspect))) {
+        onFail("a->planeAspect (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_ANDROID_native_buffer
-void checkEqual_VkNativeBufferANDROID(
-    const VkNativeBufferANDROID* a,
-    const VkNativeBufferANDROID* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkNativeBufferANDROID(const VkNativeBufferANDROID* a,
+                                      const VkNativeBufferANDROID* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((!(a->handle) && !(b->handle)) || ((a->handle) && (b->handle)))) { onFail("a->handle (Error: Mismatch in optional field)"); };
-    if (a->handle && b->handle)
-    {
-        if (!((memcmp(a->handle, b->handle, sizeof(const uint32_t)) == 0))) { onFail("a->handle (Error: Unequal dyn array)"); };
+    if (!((!(a->handle) && !(b->handle)) || ((a->handle) && (b->handle)))) {
+        onFail("a->handle (Error: Mismatch in optional field)");
+    };
+    if (a->handle && b->handle) {
+        if (!((memcmp(a->handle, b->handle, sizeof(const uint32_t)) == 0))) {
+            onFail("a->handle (Error: Unequal dyn array)");
+        };
     }
-    if (!((a->stride) == (b->stride))) { onFail("a->stride (Error: Value not equal)"); };
-    if (!((a->format) == (b->format))) { onFail("a->format (Error: Value not equal)"); };
-    if (!((a->usage) == (b->usage))) { onFail("a->usage (Error: Value not equal)"); };
-    if (!((a->consumer) == (b->consumer))) { onFail("a->consumer (Error: Value not equal)"); };
-    if (!((a->producer) == (b->producer))) { onFail("a->producer (Error: Value not equal)"); };
+    if (!((a->stride) == (b->stride))) {
+        onFail("a->stride (Error: Value not equal)");
+    };
+    if (!((a->format) == (b->format))) {
+        onFail("a->format (Error: Value not equal)");
+    };
+    if (!((a->usage) == (b->usage))) {
+        onFail("a->usage (Error: Value not equal)");
+    };
+    if (!((a->consumer) == (b->consumer))) {
+        onFail("a->consumer (Error: Value not equal)");
+    };
+    if (!((a->producer) == (b->producer))) {
+        onFail("a->producer (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_debug_report
-void checkEqual_VkDebugReportCallbackCreateInfoEXT(
-    const VkDebugReportCallbackCreateInfoEXT* a,
-    const VkDebugReportCallbackCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDebugReportCallbackCreateInfoEXT(const VkDebugReportCallbackCreateInfoEXT* a,
+                                                   const VkDebugReportCallbackCreateInfoEXT* b,
+                                                   OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->pfnCallback) == (b->pfnCallback))) { onFail("a->pfnCallback (Error: Value not equal)"); };
-    if (!((!(a->pUserData) && !(b->pUserData)) || ((a->pUserData) && (b->pUserData)))) { onFail("a->pUserData (Error: Mismatch in optional field)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->pfnCallback) == (b->pfnCallback))) {
+        onFail("a->pfnCallback (Error: Value not equal)");
+    };
+    if (!((!(a->pUserData) && !(b->pUserData)) || ((a->pUserData) && (b->pUserData)))) {
+        onFail("a->pUserData (Error: Mismatch in optional field)");
+    };
 }
 
 #endif
@@ -7152,15 +9893,16 @@
 #ifdef VK_AMD_rasterization_order
 void checkEqual_VkPipelineRasterizationStateRasterizationOrderAMD(
     const VkPipelineRasterizationStateRasterizationOrderAMD* a,
-    const VkPipelineRasterizationStateRasterizationOrderAMD* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPipelineRasterizationStateRasterizationOrderAMD* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->rasterizationOrder) == (b->rasterizationOrder))) { onFail("a->rasterizationOrder (Error: Value not equal)"); };
+    if (!((a->rasterizationOrder) == (b->rasterizationOrder))) {
+        onFail("a->rasterizationOrder (Error: Value not equal)");
+    };
 }
 
 #endif
@@ -7169,57 +9911,74 @@
 #ifdef VK_AMD_shader_explicit_vertex_parameter
 #endif
 #ifdef VK_EXT_debug_marker
-void checkEqual_VkDebugMarkerObjectNameInfoEXT(
-    const VkDebugMarkerObjectNameInfoEXT* a,
-    const VkDebugMarkerObjectNameInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDebugMarkerObjectNameInfoEXT(const VkDebugMarkerObjectNameInfoEXT* a,
+                                               const VkDebugMarkerObjectNameInfoEXT* b,
+                                               OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->objectType) == (b->objectType))) { onFail("a->objectType (Error: Value not equal)"); };
-    if (!((a->object) == (b->object))) { onFail("a->object (Error: Value not equal)"); };
-    if (!((!(a->pObjectName) && !(b->pObjectName)) || ((a->pObjectName) && (b->pObjectName)))) { onFail("a->pObjectName (Error: Mismatch in string pointer nullness)"); };
-    if ((a->pObjectName) && (b->pObjectName))
-    {
-        if (!((strcmp(a->pObjectName, b->pObjectName) == 0))) { onFail("a->pObjectName (Error: Unequal strings)"); };
+    if (!((a->objectType) == (b->objectType))) {
+        onFail("a->objectType (Error: Value not equal)");
+    };
+    if (!((a->object) == (b->object))) {
+        onFail("a->object (Error: Value not equal)");
+    };
+    if (!((!(a->pObjectName) && !(b->pObjectName)) || ((a->pObjectName) && (b->pObjectName)))) {
+        onFail("a->pObjectName (Error: Mismatch in string pointer nullness)");
+    };
+    if ((a->pObjectName) && (b->pObjectName)) {
+        if (!((strcmp(a->pObjectName, b->pObjectName) == 0))) {
+            onFail("a->pObjectName (Error: Unequal strings)");
+        };
     }
 }
 
-void checkEqual_VkDebugMarkerObjectTagInfoEXT(
-    const VkDebugMarkerObjectTagInfoEXT* a,
-    const VkDebugMarkerObjectTagInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDebugMarkerObjectTagInfoEXT(const VkDebugMarkerObjectTagInfoEXT* a,
+                                              const VkDebugMarkerObjectTagInfoEXT* b,
+                                              OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->objectType) == (b->objectType))) { onFail("a->objectType (Error: Value not equal)"); };
-    if (!((a->object) == (b->object))) { onFail("a->object (Error: Value not equal)"); };
-    if (!((a->tagName) == (b->tagName))) { onFail("a->tagName (Error: Value not equal)"); };
-    if (!((a->tagSize) == (b->tagSize))) { onFail("a->tagSize (Error: Value not equal)"); };
+    if (!((a->objectType) == (b->objectType))) {
+        onFail("a->objectType (Error: Value not equal)");
+    };
+    if (!((a->object) == (b->object))) {
+        onFail("a->object (Error: Value not equal)");
+    };
+    if (!((a->tagName) == (b->tagName))) {
+        onFail("a->tagName (Error: Value not equal)");
+    };
+    if (!((a->tagSize) == (b->tagSize))) {
+        onFail("a->tagSize (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkDebugMarkerMarkerInfoEXT(
-    const VkDebugMarkerMarkerInfoEXT* a,
-    const VkDebugMarkerMarkerInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDebugMarkerMarkerInfoEXT(const VkDebugMarkerMarkerInfoEXT* a,
+                                           const VkDebugMarkerMarkerInfoEXT* b,
+                                           OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((!(a->pMarkerName) && !(b->pMarkerName)) || ((a->pMarkerName) && (b->pMarkerName)))) { onFail("a->pMarkerName (Error: Mismatch in string pointer nullness)"); };
-    if ((a->pMarkerName) && (b->pMarkerName))
-    {
-        if (!((strcmp(a->pMarkerName, b->pMarkerName) == 0))) { onFail("a->pMarkerName (Error: Unequal strings)"); };
+    if (!((!(a->pMarkerName) && !(b->pMarkerName)) || ((a->pMarkerName) && (b->pMarkerName)))) {
+        onFail("a->pMarkerName (Error: Mismatch in string pointer nullness)");
+    };
+    if ((a->pMarkerName) && (b->pMarkerName)) {
+        if (!((strcmp(a->pMarkerName, b->pMarkerName) == 0))) {
+            onFail("a->pMarkerName (Error: Unequal strings)");
+        };
     }
-    if (!((memcmp(a->color, b->color, 4 * sizeof(float)) == 0))) { onFail("a->color (Error: Unequal static array)"); };
+    if (!((memcmp(a->color, b->color, 4 * sizeof(float)) == 0))) {
+        onFail("a->color (Error: Unequal static array)");
+    };
 }
 
 #endif
@@ -7228,180 +9987,243 @@
 #ifdef VK_NV_dedicated_allocation
 void checkEqual_VkDedicatedAllocationImageCreateInfoNV(
     const VkDedicatedAllocationImageCreateInfoNV* a,
-    const VkDedicatedAllocationImageCreateInfoNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkDedicatedAllocationImageCreateInfoNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->dedicatedAllocation) == (b->dedicatedAllocation))) { onFail("a->dedicatedAllocation (Error: Value not equal)"); };
+    if (!((a->dedicatedAllocation) == (b->dedicatedAllocation))) {
+        onFail("a->dedicatedAllocation (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkDedicatedAllocationBufferCreateInfoNV(
     const VkDedicatedAllocationBufferCreateInfoNV* a,
-    const VkDedicatedAllocationBufferCreateInfoNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkDedicatedAllocationBufferCreateInfoNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->dedicatedAllocation) == (b->dedicatedAllocation))) { onFail("a->dedicatedAllocation (Error: Value not equal)"); };
+    if (!((a->dedicatedAllocation) == (b->dedicatedAllocation))) {
+        onFail("a->dedicatedAllocation (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkDedicatedAllocationMemoryAllocateInfoNV(
     const VkDedicatedAllocationMemoryAllocateInfoNV* a,
-    const VkDedicatedAllocationMemoryAllocateInfoNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkDedicatedAllocationMemoryAllocateInfoNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->image) == (b->image))) { onFail("a->image (Error: Value not equal)"); };
-    if (!((a->buffer) == (b->buffer))) { onFail("a->buffer (Error: Value not equal)"); };
+    if (!((a->image) == (b->image))) {
+        onFail("a->image (Error: Value not equal)");
+    };
+    if (!((a->buffer) == (b->buffer))) {
+        onFail("a->buffer (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_transform_feedback
 void checkEqual_VkPhysicalDeviceTransformFeedbackFeaturesEXT(
     const VkPhysicalDeviceTransformFeedbackFeaturesEXT* a,
-    const VkPhysicalDeviceTransformFeedbackFeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceTransformFeedbackFeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->transformFeedback) == (b->transformFeedback))) { onFail("a->transformFeedback (Error: Value not equal)"); };
-    if (!((a->geometryStreams) == (b->geometryStreams))) { onFail("a->geometryStreams (Error: Value not equal)"); };
+    if (!((a->transformFeedback) == (b->transformFeedback))) {
+        onFail("a->transformFeedback (Error: Value not equal)");
+    };
+    if (!((a->geometryStreams) == (b->geometryStreams))) {
+        onFail("a->geometryStreams (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceTransformFeedbackPropertiesEXT(
     const VkPhysicalDeviceTransformFeedbackPropertiesEXT* a,
-    const VkPhysicalDeviceTransformFeedbackPropertiesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceTransformFeedbackPropertiesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->maxTransformFeedbackStreams) == (b->maxTransformFeedbackStreams))) { onFail("a->maxTransformFeedbackStreams (Error: Value not equal)"); };
-    if (!((a->maxTransformFeedbackBuffers) == (b->maxTransformFeedbackBuffers))) { onFail("a->maxTransformFeedbackBuffers (Error: Value not equal)"); };
-    if (!((a->maxTransformFeedbackBufferSize) == (b->maxTransformFeedbackBufferSize))) { onFail("a->maxTransformFeedbackBufferSize (Error: Value not equal)"); };
-    if (!((a->maxTransformFeedbackStreamDataSize) == (b->maxTransformFeedbackStreamDataSize))) { onFail("a->maxTransformFeedbackStreamDataSize (Error: Value not equal)"); };
-    if (!((a->maxTransformFeedbackBufferDataSize) == (b->maxTransformFeedbackBufferDataSize))) { onFail("a->maxTransformFeedbackBufferDataSize (Error: Value not equal)"); };
-    if (!((a->maxTransformFeedbackBufferDataStride) == (b->maxTransformFeedbackBufferDataStride))) { onFail("a->maxTransformFeedbackBufferDataStride (Error: Value not equal)"); };
-    if (!((a->transformFeedbackQueries) == (b->transformFeedbackQueries))) { onFail("a->transformFeedbackQueries (Error: Value not equal)"); };
-    if (!((a->transformFeedbackStreamsLinesTriangles) == (b->transformFeedbackStreamsLinesTriangles))) { onFail("a->transformFeedbackStreamsLinesTriangles (Error: Value not equal)"); };
-    if (!((a->transformFeedbackRasterizationStreamSelect) == (b->transformFeedbackRasterizationStreamSelect))) { onFail("a->transformFeedbackRasterizationStreamSelect (Error: Value not equal)"); };
-    if (!((a->transformFeedbackDraw) == (b->transformFeedbackDraw))) { onFail("a->transformFeedbackDraw (Error: Value not equal)"); };
+    if (!((a->maxTransformFeedbackStreams) == (b->maxTransformFeedbackStreams))) {
+        onFail("a->maxTransformFeedbackStreams (Error: Value not equal)");
+    };
+    if (!((a->maxTransformFeedbackBuffers) == (b->maxTransformFeedbackBuffers))) {
+        onFail("a->maxTransformFeedbackBuffers (Error: Value not equal)");
+    };
+    if (!((a->maxTransformFeedbackBufferSize) == (b->maxTransformFeedbackBufferSize))) {
+        onFail("a->maxTransformFeedbackBufferSize (Error: Value not equal)");
+    };
+    if (!((a->maxTransformFeedbackStreamDataSize) == (b->maxTransformFeedbackStreamDataSize))) {
+        onFail("a->maxTransformFeedbackStreamDataSize (Error: Value not equal)");
+    };
+    if (!((a->maxTransformFeedbackBufferDataSize) == (b->maxTransformFeedbackBufferDataSize))) {
+        onFail("a->maxTransformFeedbackBufferDataSize (Error: Value not equal)");
+    };
+    if (!((a->maxTransformFeedbackBufferDataStride) == (b->maxTransformFeedbackBufferDataStride))) {
+        onFail("a->maxTransformFeedbackBufferDataStride (Error: Value not equal)");
+    };
+    if (!((a->transformFeedbackQueries) == (b->transformFeedbackQueries))) {
+        onFail("a->transformFeedbackQueries (Error: Value not equal)");
+    };
+    if (!((a->transformFeedbackStreamsLinesTriangles) ==
+          (b->transformFeedbackStreamsLinesTriangles))) {
+        onFail("a->transformFeedbackStreamsLinesTriangles (Error: Value not equal)");
+    };
+    if (!((a->transformFeedbackRasterizationStreamSelect) ==
+          (b->transformFeedbackRasterizationStreamSelect))) {
+        onFail("a->transformFeedbackRasterizationStreamSelect (Error: Value not equal)");
+    };
+    if (!((a->transformFeedbackDraw) == (b->transformFeedbackDraw))) {
+        onFail("a->transformFeedbackDraw (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPipelineRasterizationStateStreamCreateInfoEXT(
     const VkPipelineRasterizationStateStreamCreateInfoEXT* a,
-    const VkPipelineRasterizationStateStreamCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPipelineRasterizationStateStreamCreateInfoEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->rasterizationStream) == (b->rasterizationStream))) { onFail("a->rasterizationStream (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->rasterizationStream) == (b->rasterizationStream))) {
+        onFail("a->rasterizationStream (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_NVX_binary_import
-void checkEqual_VkCuModuleCreateInfoNVX(
-    const VkCuModuleCreateInfoNVX* a,
-    const VkCuModuleCreateInfoNVX* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkCuModuleCreateInfoNVX(const VkCuModuleCreateInfoNVX* a,
+                                        const VkCuModuleCreateInfoNVX* b,
+                                        OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->dataSize) == (b->dataSize))) { onFail("a->dataSize (Error: Value not equal)"); };
+    if (!((a->dataSize) == (b->dataSize))) {
+        onFail("a->dataSize (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkCuFunctionCreateInfoNVX(
-    const VkCuFunctionCreateInfoNVX* a,
-    const VkCuFunctionCreateInfoNVX* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkCuFunctionCreateInfoNVX(const VkCuFunctionCreateInfoNVX* a,
+                                          const VkCuFunctionCreateInfoNVX* b,
+                                          OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->module) == (b->module))) { onFail("a->module (Error: Value not equal)"); };
-    if (!((!(a->pName) && !(b->pName)) || ((a->pName) && (b->pName)))) { onFail("a->pName (Error: Mismatch in string pointer nullness)"); };
-    if ((a->pName) && (b->pName))
-    {
-        if (!((strcmp(a->pName, b->pName) == 0))) { onFail("a->pName (Error: Unequal strings)"); };
+    if (!((a->module) == (b->module))) {
+        onFail("a->module (Error: Value not equal)");
+    };
+    if (!((!(a->pName) && !(b->pName)) || ((a->pName) && (b->pName)))) {
+        onFail("a->pName (Error: Mismatch in string pointer nullness)");
+    };
+    if ((a->pName) && (b->pName)) {
+        if (!((strcmp(a->pName, b->pName) == 0))) {
+            onFail("a->pName (Error: Unequal strings)");
+        };
     }
 }
 
-void checkEqual_VkCuLaunchInfoNVX(
-    const VkCuLaunchInfoNVX* a,
-    const VkCuLaunchInfoNVX* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkCuLaunchInfoNVX(const VkCuLaunchInfoNVX* a, const VkCuLaunchInfoNVX* b,
+                                  OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->function) == (b->function))) { onFail("a->function (Error: Value not equal)"); };
-    if (!((a->gridDimX) == (b->gridDimX))) { onFail("a->gridDimX (Error: Value not equal)"); };
-    if (!((a->gridDimY) == (b->gridDimY))) { onFail("a->gridDimY (Error: Value not equal)"); };
-    if (!((a->gridDimZ) == (b->gridDimZ))) { onFail("a->gridDimZ (Error: Value not equal)"); };
-    if (!((a->blockDimX) == (b->blockDimX))) { onFail("a->blockDimX (Error: Value not equal)"); };
-    if (!((a->blockDimY) == (b->blockDimY))) { onFail("a->blockDimY (Error: Value not equal)"); };
-    if (!((a->blockDimZ) == (b->blockDimZ))) { onFail("a->blockDimZ (Error: Value not equal)"); };
-    if (!((a->sharedMemBytes) == (b->sharedMemBytes))) { onFail("a->sharedMemBytes (Error: Value not equal)"); };
-    if (!((a->paramCount) == (b->paramCount))) { onFail("a->paramCount (Error: Value not equal)"); };
-    if (!((a->extraCount) == (b->extraCount))) { onFail("a->extraCount (Error: Value not equal)"); };
+    if (!((a->function) == (b->function))) {
+        onFail("a->function (Error: Value not equal)");
+    };
+    if (!((a->gridDimX) == (b->gridDimX))) {
+        onFail("a->gridDimX (Error: Value not equal)");
+    };
+    if (!((a->gridDimY) == (b->gridDimY))) {
+        onFail("a->gridDimY (Error: Value not equal)");
+    };
+    if (!((a->gridDimZ) == (b->gridDimZ))) {
+        onFail("a->gridDimZ (Error: Value not equal)");
+    };
+    if (!((a->blockDimX) == (b->blockDimX))) {
+        onFail("a->blockDimX (Error: Value not equal)");
+    };
+    if (!((a->blockDimY) == (b->blockDimY))) {
+        onFail("a->blockDimY (Error: Value not equal)");
+    };
+    if (!((a->blockDimZ) == (b->blockDimZ))) {
+        onFail("a->blockDimZ (Error: Value not equal)");
+    };
+    if (!((a->sharedMemBytes) == (b->sharedMemBytes))) {
+        onFail("a->sharedMemBytes (Error: Value not equal)");
+    };
+    if (!((a->paramCount) == (b->paramCount))) {
+        onFail("a->paramCount (Error: Value not equal)");
+    };
+    if (!((a->extraCount) == (b->extraCount))) {
+        onFail("a->extraCount (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_NVX_image_view_handle
-void checkEqual_VkImageViewHandleInfoNVX(
-    const VkImageViewHandleInfoNVX* a,
-    const VkImageViewHandleInfoNVX* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkImageViewHandleInfoNVX(const VkImageViewHandleInfoNVX* a,
+                                         const VkImageViewHandleInfoNVX* b,
+                                         OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->imageView) == (b->imageView))) { onFail("a->imageView (Error: Value not equal)"); };
-    if (!((a->descriptorType) == (b->descriptorType))) { onFail("a->descriptorType (Error: Value not equal)"); };
-    if (!((a->sampler) == (b->sampler))) { onFail("a->sampler (Error: Value not equal)"); };
+    if (!((a->imageView) == (b->imageView))) {
+        onFail("a->imageView (Error: Value not equal)");
+    };
+    if (!((a->descriptorType) == (b->descriptorType))) {
+        onFail("a->descriptorType (Error: Value not equal)");
+    };
+    if (!((a->sampler) == (b->sampler))) {
+        onFail("a->sampler (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkImageViewAddressPropertiesNVX(
-    const VkImageViewAddressPropertiesNVX* a,
-    const VkImageViewAddressPropertiesNVX* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkImageViewAddressPropertiesNVX(const VkImageViewAddressPropertiesNVX* a,
+                                                const VkImageViewAddressPropertiesNVX* b,
+                                                OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->deviceAddress) == (b->deviceAddress))) { onFail("a->deviceAddress (Error: Value not equal)"); };
-    if (!((a->size) == (b->size))) { onFail("a->size (Error: Value not equal)"); };
+    if (!((a->deviceAddress) == (b->deviceAddress))) {
+        onFail("a->deviceAddress (Error: Value not equal)");
+    };
+    if (!((a->size) == (b->size))) {
+        onFail("a->size (Error: Value not equal)");
+    };
 }
 
 #endif
@@ -7414,671 +10236,871 @@
 #ifdef VK_AMD_shader_ballot
 #endif
 #ifdef VK_EXT_video_encode_h264
-void checkEqual_VkVideoEncodeH264CapabilitiesEXT(
-    const VkVideoEncodeH264CapabilitiesEXT* a,
-    const VkVideoEncodeH264CapabilitiesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkVideoEncodeH264CapabilitiesEXT(const VkVideoEncodeH264CapabilitiesEXT* a,
+                                                 const VkVideoEncodeH264CapabilitiesEXT* b,
+                                                 OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->inputModeFlags) == (b->inputModeFlags))) { onFail("a->inputModeFlags (Error: Value not equal)"); };
-    if (!((a->outputModeFlags) == (b->outputModeFlags))) { onFail("a->outputModeFlags (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->inputModeFlags) == (b->inputModeFlags))) {
+        onFail("a->inputModeFlags (Error: Value not equal)");
+    };
+    if (!((a->outputModeFlags) == (b->outputModeFlags))) {
+        onFail("a->outputModeFlags (Error: Value not equal)");
+    };
     checkEqual_VkExtent2D(&a->minPictureSizeInMbs, &b->minPictureSizeInMbs, onFail);
     checkEqual_VkExtent2D(&a->maxPictureSizeInMbs, &b->maxPictureSizeInMbs, onFail);
     checkEqual_VkExtent2D(&a->inputImageDataAlignment, &b->inputImageDataAlignment, onFail);
-    if (!((a->maxNumL0ReferenceForP) == (b->maxNumL0ReferenceForP))) { onFail("a->maxNumL0ReferenceForP (Error: Value not equal)"); };
-    if (!((a->maxNumL0ReferenceForB) == (b->maxNumL0ReferenceForB))) { onFail("a->maxNumL0ReferenceForB (Error: Value not equal)"); };
-    if (!((a->maxNumL1Reference) == (b->maxNumL1Reference))) { onFail("a->maxNumL1Reference (Error: Value not equal)"); };
-    if (!((a->qualityLevelCount) == (b->qualityLevelCount))) { onFail("a->qualityLevelCount (Error: Value not equal)"); };
+    if (!((a->maxNumL0ReferenceForP) == (b->maxNumL0ReferenceForP))) {
+        onFail("a->maxNumL0ReferenceForP (Error: Value not equal)");
+    };
+    if (!((a->maxNumL0ReferenceForB) == (b->maxNumL0ReferenceForB))) {
+        onFail("a->maxNumL0ReferenceForB (Error: Value not equal)");
+    };
+    if (!((a->maxNumL1Reference) == (b->maxNumL1Reference))) {
+        onFail("a->maxNumL1Reference (Error: Value not equal)");
+    };
+    if (!((a->qualityLevelCount) == (b->qualityLevelCount))) {
+        onFail("a->qualityLevelCount (Error: Value not equal)");
+    };
     checkEqual_VkExtensionProperties(&a->stdExtensionVersion, &b->stdExtensionVersion, onFail);
 }
 
 void checkEqual_VkVideoEncodeH264SessionCreateInfoEXT(
-    const VkVideoEncodeH264SessionCreateInfoEXT* a,
-    const VkVideoEncodeH264SessionCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkVideoEncodeH264SessionCreateInfoEXT* a, const VkVideoEncodeH264SessionCreateInfoEXT* b,
+    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
     checkEqual_VkExtent2D(&a->maxPictureSizeInMbs, &b->maxPictureSizeInMbs, onFail);
-    if ((a->pStdExtensionVersion) && (b->pStdExtensionVersion))
-    {
+    if ((a->pStdExtensionVersion) && (b->pStdExtensionVersion)) {
         checkEqual_VkExtensionProperties(a->pStdExtensionVersion, b->pStdExtensionVersion, onFail);
     }
 }
 
 void checkEqual_VkVideoEncodeH264SessionParametersAddInfoEXT(
     const VkVideoEncodeH264SessionParametersAddInfoEXT* a,
-    const VkVideoEncodeH264SessionParametersAddInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkVideoEncodeH264SessionParametersAddInfoEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->spsStdCount) == (b->spsStdCount))) { onFail("a->spsStdCount (Error: Value not equal)"); };
-    if (!((!(a->pSpsStd) && !(b->pSpsStd)) || ((a->pSpsStd) && (b->pSpsStd)))) { onFail("a->pSpsStd (Error: Mismatch in optional field)"); };
-    if (a->pSpsStd && b->pSpsStd)
-    {
-        if (!((a->spsStdCount) == (b->spsStdCount))) { onFail("a->pSpsStd (Error: Lengths not equal)"); };
-        if (!((memcmp(a->pSpsStd, b->pSpsStd, a->spsStdCount * sizeof(const StdVideoH264SequenceParameterSet)) == 0))) { onFail("a->pSpsStd (Error: Unequal dyn array)"); };
+    if (!((a->spsStdCount) == (b->spsStdCount))) {
+        onFail("a->spsStdCount (Error: Value not equal)");
+    };
+    if (!((!(a->pSpsStd) && !(b->pSpsStd)) || ((a->pSpsStd) && (b->pSpsStd)))) {
+        onFail("a->pSpsStd (Error: Mismatch in optional field)");
+    };
+    if (a->pSpsStd && b->pSpsStd) {
+        if (!((a->spsStdCount) == (b->spsStdCount))) {
+            onFail("a->pSpsStd (Error: Lengths not equal)");
+        };
+        if (!((memcmp(a->pSpsStd, b->pSpsStd,
+                      a->spsStdCount * sizeof(const StdVideoH264SequenceParameterSet)) == 0))) {
+            onFail("a->pSpsStd (Error: Unequal dyn array)");
+        };
     }
-    if (!((a->ppsStdCount) == (b->ppsStdCount))) { onFail("a->ppsStdCount (Error: Value not equal)"); };
-    if (!((!(a->pPpsStd) && !(b->pPpsStd)) || ((a->pPpsStd) && (b->pPpsStd)))) { onFail("a->pPpsStd (Error: Mismatch in optional field)"); };
-    if (a->pPpsStd && b->pPpsStd)
-    {
-        if (!((a->ppsStdCount) == (b->ppsStdCount))) { onFail("a->pPpsStd (Error: Lengths not equal)"); };
-        if (!((memcmp(a->pPpsStd, b->pPpsStd, a->ppsStdCount * sizeof(const StdVideoH264PictureParameterSet)) == 0))) { onFail("a->pPpsStd (Error: Unequal dyn array)"); };
+    if (!((a->ppsStdCount) == (b->ppsStdCount))) {
+        onFail("a->ppsStdCount (Error: Value not equal)");
+    };
+    if (!((!(a->pPpsStd) && !(b->pPpsStd)) || ((a->pPpsStd) && (b->pPpsStd)))) {
+        onFail("a->pPpsStd (Error: Mismatch in optional field)");
+    };
+    if (a->pPpsStd && b->pPpsStd) {
+        if (!((a->ppsStdCount) == (b->ppsStdCount))) {
+            onFail("a->pPpsStd (Error: Lengths not equal)");
+        };
+        if (!((memcmp(a->pPpsStd, b->pPpsStd,
+                      a->ppsStdCount * sizeof(const StdVideoH264PictureParameterSet)) == 0))) {
+            onFail("a->pPpsStd (Error: Unequal dyn array)");
+        };
     }
 }
 
 void checkEqual_VkVideoEncodeH264SessionParametersCreateInfoEXT(
     const VkVideoEncodeH264SessionParametersCreateInfoEXT* a,
-    const VkVideoEncodeH264SessionParametersCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkVideoEncodeH264SessionParametersCreateInfoEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->maxSpsStdCount) == (b->maxSpsStdCount))) { onFail("a->maxSpsStdCount (Error: Value not equal)"); };
-    if (!((a->maxPpsStdCount) == (b->maxPpsStdCount))) { onFail("a->maxPpsStdCount (Error: Value not equal)"); };
-    if (!((!(a->pParametersAddInfo) && !(b->pParametersAddInfo)) || ((a->pParametersAddInfo) && (b->pParametersAddInfo)))) { onFail("a->pParametersAddInfo (Error: Mismatch in optional field)"); };
-    if (a->pParametersAddInfo && b->pParametersAddInfo)
-    {
-        if ((a->pParametersAddInfo) && (b->pParametersAddInfo))
-        {
-            checkEqual_VkVideoEncodeH264SessionParametersAddInfoEXT(a->pParametersAddInfo, b->pParametersAddInfo, onFail);
+    if (!((a->maxSpsStdCount) == (b->maxSpsStdCount))) {
+        onFail("a->maxSpsStdCount (Error: Value not equal)");
+    };
+    if (!((a->maxPpsStdCount) == (b->maxPpsStdCount))) {
+        onFail("a->maxPpsStdCount (Error: Value not equal)");
+    };
+    if (!((!(a->pParametersAddInfo) && !(b->pParametersAddInfo)) ||
+          ((a->pParametersAddInfo) && (b->pParametersAddInfo)))) {
+        onFail("a->pParametersAddInfo (Error: Mismatch in optional field)");
+    };
+    if (a->pParametersAddInfo && b->pParametersAddInfo) {
+        if ((a->pParametersAddInfo) && (b->pParametersAddInfo)) {
+            checkEqual_VkVideoEncodeH264SessionParametersAddInfoEXT(a->pParametersAddInfo,
+                                                                    b->pParametersAddInfo, onFail);
         }
     }
 }
 
-void checkEqual_VkVideoEncodeH264DpbSlotInfoEXT(
-    const VkVideoEncodeH264DpbSlotInfoEXT* a,
-    const VkVideoEncodeH264DpbSlotInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkVideoEncodeH264DpbSlotInfoEXT(const VkVideoEncodeH264DpbSlotInfoEXT* a,
+                                                const VkVideoEncodeH264DpbSlotInfoEXT* b,
+                                                OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->slotIndex) == (b->slotIndex))) { onFail("a->slotIndex (Error: Value not equal)"); };
-    if (!((memcmp(a->pStdPictureInfo, b->pStdPictureInfo, sizeof(const StdVideoEncodeH264PictureInfo)) == 0))) { onFail("a->pStdPictureInfo (Error: Unequal dyn array)"); };
+    if (!((a->slotIndex) == (b->slotIndex))) {
+        onFail("a->slotIndex (Error: Value not equal)");
+    };
+    if (!((memcmp(a->pStdPictureInfo, b->pStdPictureInfo,
+                  sizeof(const StdVideoEncodeH264PictureInfo)) == 0))) {
+        onFail("a->pStdPictureInfo (Error: Unequal dyn array)");
+    };
 }
 
-void checkEqual_VkVideoEncodeH264NaluSliceEXT(
-    const VkVideoEncodeH264NaluSliceEXT* a,
-    const VkVideoEncodeH264NaluSliceEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkVideoEncodeH264NaluSliceEXT(const VkVideoEncodeH264NaluSliceEXT* a,
+                                              const VkVideoEncodeH264NaluSliceEXT* b,
+                                              OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((memcmp(a->pSliceHeaderStd, b->pSliceHeaderStd, sizeof(const StdVideoEncodeH264SliceHeader)) == 0))) { onFail("a->pSliceHeaderStd (Error: Unequal dyn array)"); };
-    if (!((a->mbCount) == (b->mbCount))) { onFail("a->mbCount (Error: Value not equal)"); };
-    if (!((a->refFinalList0EntryCount) == (b->refFinalList0EntryCount))) { onFail("a->refFinalList0EntryCount (Error: Value not equal)"); };
-    if ((a->pRefFinalList0Entries) && (b->pRefFinalList0Entries))
-    {
-        if (!((a->refFinalList0EntryCount) == (b->refFinalList0EntryCount))) { onFail("a->pRefFinalList0Entries (Error: Lengths not equal)"); };
-        if ((a->refFinalList0EntryCount) == (b->refFinalList0EntryCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->refFinalList0EntryCount; ++i)
-                {
-                    checkEqual_VkVideoEncodeH264DpbSlotInfoEXT(a->pRefFinalList0Entries + i, b->pRefFinalList0Entries + i, onFail);
+    if (!((memcmp(a->pSliceHeaderStd, b->pSliceHeaderStd,
+                  sizeof(const StdVideoEncodeH264SliceHeader)) == 0))) {
+        onFail("a->pSliceHeaderStd (Error: Unequal dyn array)");
+    };
+    if (!((a->mbCount) == (b->mbCount))) {
+        onFail("a->mbCount (Error: Value not equal)");
+    };
+    if (!((a->refFinalList0EntryCount) == (b->refFinalList0EntryCount))) {
+        onFail("a->refFinalList0EntryCount (Error: Value not equal)");
+    };
+    if ((a->pRefFinalList0Entries) && (b->pRefFinalList0Entries)) {
+        if (!((a->refFinalList0EntryCount) == (b->refFinalList0EntryCount))) {
+            onFail("a->pRefFinalList0Entries (Error: Lengths not equal)");
+        };
+        if ((a->refFinalList0EntryCount) == (b->refFinalList0EntryCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->refFinalList0EntryCount; ++i) {
+                    checkEqual_VkVideoEncodeH264DpbSlotInfoEXT(
+                        a->pRefFinalList0Entries + i, b->pRefFinalList0Entries + i, onFail);
                 }
             }
         }
     }
-    if (!((a->refFinalList1EntryCount) == (b->refFinalList1EntryCount))) { onFail("a->refFinalList1EntryCount (Error: Value not equal)"); };
-    if ((a->pRefFinalList1Entries) && (b->pRefFinalList1Entries))
-    {
-        if (!((a->refFinalList1EntryCount) == (b->refFinalList1EntryCount))) { onFail("a->pRefFinalList1Entries (Error: Lengths not equal)"); };
-        if ((a->refFinalList1EntryCount) == (b->refFinalList1EntryCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->refFinalList1EntryCount; ++i)
-                {
-                    checkEqual_VkVideoEncodeH264DpbSlotInfoEXT(a->pRefFinalList1Entries + i, b->pRefFinalList1Entries + i, onFail);
+    if (!((a->refFinalList1EntryCount) == (b->refFinalList1EntryCount))) {
+        onFail("a->refFinalList1EntryCount (Error: Value not equal)");
+    };
+    if ((a->pRefFinalList1Entries) && (b->pRefFinalList1Entries)) {
+        if (!((a->refFinalList1EntryCount) == (b->refFinalList1EntryCount))) {
+            onFail("a->pRefFinalList1Entries (Error: Lengths not equal)");
+        };
+        if ((a->refFinalList1EntryCount) == (b->refFinalList1EntryCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->refFinalList1EntryCount; ++i) {
+                    checkEqual_VkVideoEncodeH264DpbSlotInfoEXT(
+                        a->pRefFinalList1Entries + i, b->pRefFinalList1Entries + i, onFail);
                 }
             }
         }
     }
-    if (!((a->precedingNaluBytes) == (b->precedingNaluBytes))) { onFail("a->precedingNaluBytes (Error: Value not equal)"); };
-    if (!((a->minQp) == (b->minQp))) { onFail("a->minQp (Error: Value not equal)"); };
-    if (!((a->maxQp) == (b->maxQp))) { onFail("a->maxQp (Error: Value not equal)"); };
+    if (!((a->precedingNaluBytes) == (b->precedingNaluBytes))) {
+        onFail("a->precedingNaluBytes (Error: Value not equal)");
+    };
+    if (!((a->minQp) == (b->minQp))) {
+        onFail("a->minQp (Error: Value not equal)");
+    };
+    if (!((a->maxQp) == (b->maxQp))) {
+        onFail("a->maxQp (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkVideoEncodeH264VclFrameInfoEXT(
-    const VkVideoEncodeH264VclFrameInfoEXT* a,
-    const VkVideoEncodeH264VclFrameInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkVideoEncodeH264VclFrameInfoEXT(const VkVideoEncodeH264VclFrameInfoEXT* a,
+                                                 const VkVideoEncodeH264VclFrameInfoEXT* b,
+                                                 OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->refDefaultFinalList0EntryCount) == (b->refDefaultFinalList0EntryCount))) { onFail("a->refDefaultFinalList0EntryCount (Error: Value not equal)"); };
-    if ((a->pRefDefaultFinalList0Entries) && (b->pRefDefaultFinalList0Entries))
-    {
-        if (!((a->refDefaultFinalList0EntryCount) == (b->refDefaultFinalList0EntryCount))) { onFail("a->pRefDefaultFinalList0Entries (Error: Lengths not equal)"); };
-        if ((a->refDefaultFinalList0EntryCount) == (b->refDefaultFinalList0EntryCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->refDefaultFinalList0EntryCount; ++i)
-                {
-                    checkEqual_VkVideoEncodeH264DpbSlotInfoEXT(a->pRefDefaultFinalList0Entries + i, b->pRefDefaultFinalList0Entries + i, onFail);
+    if (!((a->refDefaultFinalList0EntryCount) == (b->refDefaultFinalList0EntryCount))) {
+        onFail("a->refDefaultFinalList0EntryCount (Error: Value not equal)");
+    };
+    if ((a->pRefDefaultFinalList0Entries) && (b->pRefDefaultFinalList0Entries)) {
+        if (!((a->refDefaultFinalList0EntryCount) == (b->refDefaultFinalList0EntryCount))) {
+            onFail("a->pRefDefaultFinalList0Entries (Error: Lengths not equal)");
+        };
+        if ((a->refDefaultFinalList0EntryCount) == (b->refDefaultFinalList0EntryCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->refDefaultFinalList0EntryCount; ++i) {
+                    checkEqual_VkVideoEncodeH264DpbSlotInfoEXT(a->pRefDefaultFinalList0Entries + i,
+                                                               b->pRefDefaultFinalList0Entries + i,
+                                                               onFail);
                 }
             }
         }
     }
-    if (!((a->refDefaultFinalList1EntryCount) == (b->refDefaultFinalList1EntryCount))) { onFail("a->refDefaultFinalList1EntryCount (Error: Value not equal)"); };
-    if ((a->pRefDefaultFinalList1Entries) && (b->pRefDefaultFinalList1Entries))
-    {
-        if (!((a->refDefaultFinalList1EntryCount) == (b->refDefaultFinalList1EntryCount))) { onFail("a->pRefDefaultFinalList1Entries (Error: Lengths not equal)"); };
-        if ((a->refDefaultFinalList1EntryCount) == (b->refDefaultFinalList1EntryCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->refDefaultFinalList1EntryCount; ++i)
-                {
-                    checkEqual_VkVideoEncodeH264DpbSlotInfoEXT(a->pRefDefaultFinalList1Entries + i, b->pRefDefaultFinalList1Entries + i, onFail);
+    if (!((a->refDefaultFinalList1EntryCount) == (b->refDefaultFinalList1EntryCount))) {
+        onFail("a->refDefaultFinalList1EntryCount (Error: Value not equal)");
+    };
+    if ((a->pRefDefaultFinalList1Entries) && (b->pRefDefaultFinalList1Entries)) {
+        if (!((a->refDefaultFinalList1EntryCount) == (b->refDefaultFinalList1EntryCount))) {
+            onFail("a->pRefDefaultFinalList1Entries (Error: Lengths not equal)");
+        };
+        if ((a->refDefaultFinalList1EntryCount) == (b->refDefaultFinalList1EntryCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->refDefaultFinalList1EntryCount; ++i) {
+                    checkEqual_VkVideoEncodeH264DpbSlotInfoEXT(a->pRefDefaultFinalList1Entries + i,
+                                                               b->pRefDefaultFinalList1Entries + i,
+                                                               onFail);
                 }
             }
         }
     }
-    if (!((a->naluSliceEntryCount) == (b->naluSliceEntryCount))) { onFail("a->naluSliceEntryCount (Error: Value not equal)"); };
-    if ((a->pNaluSliceEntries) && (b->pNaluSliceEntries))
-    {
-        if (!((a->naluSliceEntryCount) == (b->naluSliceEntryCount))) { onFail("a->pNaluSliceEntries (Error: Lengths not equal)"); };
-        if ((a->naluSliceEntryCount) == (b->naluSliceEntryCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->naluSliceEntryCount; ++i)
-                {
-                    checkEqual_VkVideoEncodeH264NaluSliceEXT(a->pNaluSliceEntries + i, b->pNaluSliceEntries + i, onFail);
+    if (!((a->naluSliceEntryCount) == (b->naluSliceEntryCount))) {
+        onFail("a->naluSliceEntryCount (Error: Value not equal)");
+    };
+    if ((a->pNaluSliceEntries) && (b->pNaluSliceEntries)) {
+        if (!((a->naluSliceEntryCount) == (b->naluSliceEntryCount))) {
+            onFail("a->pNaluSliceEntries (Error: Lengths not equal)");
+        };
+        if ((a->naluSliceEntryCount) == (b->naluSliceEntryCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->naluSliceEntryCount; ++i) {
+                    checkEqual_VkVideoEncodeH264NaluSliceEXT(a->pNaluSliceEntries + i,
+                                                             b->pNaluSliceEntries + i, onFail);
                 }
             }
         }
     }
-    if ((a->pCurrentPictureInfo) && (b->pCurrentPictureInfo))
-    {
-        checkEqual_VkVideoEncodeH264DpbSlotInfoEXT(a->pCurrentPictureInfo, b->pCurrentPictureInfo, onFail);
+    if ((a->pCurrentPictureInfo) && (b->pCurrentPictureInfo)) {
+        checkEqual_VkVideoEncodeH264DpbSlotInfoEXT(a->pCurrentPictureInfo, b->pCurrentPictureInfo,
+                                                   onFail);
     }
 }
 
 void checkEqual_VkVideoEncodeH264EmitPictureParametersEXT(
     const VkVideoEncodeH264EmitPictureParametersEXT* a,
-    const VkVideoEncodeH264EmitPictureParametersEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkVideoEncodeH264EmitPictureParametersEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->spsId) == (b->spsId))) { onFail("a->spsId (Error: Value not equal)"); };
-    if (!((a->emitSpsEnable) == (b->emitSpsEnable))) { onFail("a->emitSpsEnable (Error: Value not equal)"); };
-    if (!((a->ppsIdEntryCount) == (b->ppsIdEntryCount))) { onFail("a->ppsIdEntryCount (Error: Value not equal)"); };
-    if (!((a->ppsIdEntryCount) == (b->ppsIdEntryCount))) { onFail("a->ppsIdEntries (Error: Lengths not equal)"); };
-    if (!((memcmp(a->ppsIdEntries, b->ppsIdEntries, a->ppsIdEntryCount * sizeof(const uint8_t)) == 0))) { onFail("a->ppsIdEntries (Error: Unequal dyn array)"); };
+    if (!((a->spsId) == (b->spsId))) {
+        onFail("a->spsId (Error: Value not equal)");
+    };
+    if (!((a->emitSpsEnable) == (b->emitSpsEnable))) {
+        onFail("a->emitSpsEnable (Error: Value not equal)");
+    };
+    if (!((a->ppsIdEntryCount) == (b->ppsIdEntryCount))) {
+        onFail("a->ppsIdEntryCount (Error: Value not equal)");
+    };
+    if (!((a->ppsIdEntryCount) == (b->ppsIdEntryCount))) {
+        onFail("a->ppsIdEntries (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->ppsIdEntries, b->ppsIdEntries, a->ppsIdEntryCount * sizeof(const uint8_t)) ==
+           0))) {
+        onFail("a->ppsIdEntries (Error: Unequal dyn array)");
+    };
 }
 
-void checkEqual_VkVideoEncodeH264ProfileEXT(
-    const VkVideoEncodeH264ProfileEXT* a,
-    const VkVideoEncodeH264ProfileEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkVideoEncodeH264ProfileEXT(const VkVideoEncodeH264ProfileEXT* a,
+                                            const VkVideoEncodeH264ProfileEXT* b,
+                                            OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->stdProfileIdc) == (b->stdProfileIdc))) { onFail("a->stdProfileIdc (Error: Value not equal)"); };
+    if (!((a->stdProfileIdc) == (b->stdProfileIdc))) {
+        onFail("a->stdProfileIdc (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_video_encode_h265
-void checkEqual_VkVideoEncodeH265CapabilitiesEXT(
-    const VkVideoEncodeH265CapabilitiesEXT* a,
-    const VkVideoEncodeH265CapabilitiesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkVideoEncodeH265CapabilitiesEXT(const VkVideoEncodeH265CapabilitiesEXT* a,
+                                                 const VkVideoEncodeH265CapabilitiesEXT* b,
+                                                 OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->inputModeFlags) == (b->inputModeFlags))) { onFail("a->inputModeFlags (Error: Value not equal)"); };
-    if (!((a->outputModeFlags) == (b->outputModeFlags))) { onFail("a->outputModeFlags (Error: Value not equal)"); };
-    if (!((a->ctbSizes) == (b->ctbSizes))) { onFail("a->ctbSizes (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->inputModeFlags) == (b->inputModeFlags))) {
+        onFail("a->inputModeFlags (Error: Value not equal)");
+    };
+    if (!((a->outputModeFlags) == (b->outputModeFlags))) {
+        onFail("a->outputModeFlags (Error: Value not equal)");
+    };
+    if (!((a->ctbSizes) == (b->ctbSizes))) {
+        onFail("a->ctbSizes (Error: Value not equal)");
+    };
     checkEqual_VkExtent2D(&a->inputImageDataAlignment, &b->inputImageDataAlignment, onFail);
-    if (!((a->maxNumL0ReferenceForP) == (b->maxNumL0ReferenceForP))) { onFail("a->maxNumL0ReferenceForP (Error: Value not equal)"); };
-    if (!((a->maxNumL0ReferenceForB) == (b->maxNumL0ReferenceForB))) { onFail("a->maxNumL0ReferenceForB (Error: Value not equal)"); };
-    if (!((a->maxNumL1Reference) == (b->maxNumL1Reference))) { onFail("a->maxNumL1Reference (Error: Value not equal)"); };
-    if (!((a->maxNumSubLayers) == (b->maxNumSubLayers))) { onFail("a->maxNumSubLayers (Error: Value not equal)"); };
-    if (!((a->qualityLevelCount) == (b->qualityLevelCount))) { onFail("a->qualityLevelCount (Error: Value not equal)"); };
+    if (!((a->maxNumL0ReferenceForP) == (b->maxNumL0ReferenceForP))) {
+        onFail("a->maxNumL0ReferenceForP (Error: Value not equal)");
+    };
+    if (!((a->maxNumL0ReferenceForB) == (b->maxNumL0ReferenceForB))) {
+        onFail("a->maxNumL0ReferenceForB (Error: Value not equal)");
+    };
+    if (!((a->maxNumL1Reference) == (b->maxNumL1Reference))) {
+        onFail("a->maxNumL1Reference (Error: Value not equal)");
+    };
+    if (!((a->maxNumSubLayers) == (b->maxNumSubLayers))) {
+        onFail("a->maxNumSubLayers (Error: Value not equal)");
+    };
+    if (!((a->qualityLevelCount) == (b->qualityLevelCount))) {
+        onFail("a->qualityLevelCount (Error: Value not equal)");
+    };
     checkEqual_VkExtensionProperties(&a->stdExtensionVersion, &b->stdExtensionVersion, onFail);
 }
 
 void checkEqual_VkVideoEncodeH265SessionCreateInfoEXT(
-    const VkVideoEncodeH265SessionCreateInfoEXT* a,
-    const VkVideoEncodeH265SessionCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkVideoEncodeH265SessionCreateInfoEXT* a, const VkVideoEncodeH265SessionCreateInfoEXT* b,
+    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if ((a->pStdExtensionVersion) && (b->pStdExtensionVersion))
-    {
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if ((a->pStdExtensionVersion) && (b->pStdExtensionVersion)) {
         checkEqual_VkExtensionProperties(a->pStdExtensionVersion, b->pStdExtensionVersion, onFail);
     }
 }
 
 void checkEqual_VkVideoEncodeH265SessionParametersAddInfoEXT(
     const VkVideoEncodeH265SessionParametersAddInfoEXT* a,
-    const VkVideoEncodeH265SessionParametersAddInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkVideoEncodeH265SessionParametersAddInfoEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->vpsStdCount) == (b->vpsStdCount))) { onFail("a->vpsStdCount (Error: Value not equal)"); };
-    if (!((!(a->pVpsStd) && !(b->pVpsStd)) || ((a->pVpsStd) && (b->pVpsStd)))) { onFail("a->pVpsStd (Error: Mismatch in optional field)"); };
-    if (a->pVpsStd && b->pVpsStd)
-    {
-        if (!((a->vpsStdCount) == (b->vpsStdCount))) { onFail("a->pVpsStd (Error: Lengths not equal)"); };
-        if (!((memcmp(a->pVpsStd, b->pVpsStd, a->vpsStdCount * sizeof(const StdVideoH265VideoParameterSet)) == 0))) { onFail("a->pVpsStd (Error: Unequal dyn array)"); };
+    if (!((a->vpsStdCount) == (b->vpsStdCount))) {
+        onFail("a->vpsStdCount (Error: Value not equal)");
+    };
+    if (!((!(a->pVpsStd) && !(b->pVpsStd)) || ((a->pVpsStd) && (b->pVpsStd)))) {
+        onFail("a->pVpsStd (Error: Mismatch in optional field)");
+    };
+    if (a->pVpsStd && b->pVpsStd) {
+        if (!((a->vpsStdCount) == (b->vpsStdCount))) {
+            onFail("a->pVpsStd (Error: Lengths not equal)");
+        };
+        if (!((memcmp(a->pVpsStd, b->pVpsStd,
+                      a->vpsStdCount * sizeof(const StdVideoH265VideoParameterSet)) == 0))) {
+            onFail("a->pVpsStd (Error: Unequal dyn array)");
+        };
     }
-    if (!((a->spsStdCount) == (b->spsStdCount))) { onFail("a->spsStdCount (Error: Value not equal)"); };
-    if (!((!(a->pSpsStd) && !(b->pSpsStd)) || ((a->pSpsStd) && (b->pSpsStd)))) { onFail("a->pSpsStd (Error: Mismatch in optional field)"); };
-    if (a->pSpsStd && b->pSpsStd)
-    {
-        if (!((a->spsStdCount) == (b->spsStdCount))) { onFail("a->pSpsStd (Error: Lengths not equal)"); };
-        if (!((memcmp(a->pSpsStd, b->pSpsStd, a->spsStdCount * sizeof(const StdVideoH265SequenceParameterSet)) == 0))) { onFail("a->pSpsStd (Error: Unequal dyn array)"); };
+    if (!((a->spsStdCount) == (b->spsStdCount))) {
+        onFail("a->spsStdCount (Error: Value not equal)");
+    };
+    if (!((!(a->pSpsStd) && !(b->pSpsStd)) || ((a->pSpsStd) && (b->pSpsStd)))) {
+        onFail("a->pSpsStd (Error: Mismatch in optional field)");
+    };
+    if (a->pSpsStd && b->pSpsStd) {
+        if (!((a->spsStdCount) == (b->spsStdCount))) {
+            onFail("a->pSpsStd (Error: Lengths not equal)");
+        };
+        if (!((memcmp(a->pSpsStd, b->pSpsStd,
+                      a->spsStdCount * sizeof(const StdVideoH265SequenceParameterSet)) == 0))) {
+            onFail("a->pSpsStd (Error: Unequal dyn array)");
+        };
     }
-    if (!((a->ppsStdCount) == (b->ppsStdCount))) { onFail("a->ppsStdCount (Error: Value not equal)"); };
-    if (!((!(a->pPpsStd) && !(b->pPpsStd)) || ((a->pPpsStd) && (b->pPpsStd)))) { onFail("a->pPpsStd (Error: Mismatch in optional field)"); };
-    if (a->pPpsStd && b->pPpsStd)
-    {
-        if (!((a->ppsStdCount) == (b->ppsStdCount))) { onFail("a->pPpsStd (Error: Lengths not equal)"); };
-        if (!((memcmp(a->pPpsStd, b->pPpsStd, a->ppsStdCount * sizeof(const StdVideoH265PictureParameterSet)) == 0))) { onFail("a->pPpsStd (Error: Unequal dyn array)"); };
+    if (!((a->ppsStdCount) == (b->ppsStdCount))) {
+        onFail("a->ppsStdCount (Error: Value not equal)");
+    };
+    if (!((!(a->pPpsStd) && !(b->pPpsStd)) || ((a->pPpsStd) && (b->pPpsStd)))) {
+        onFail("a->pPpsStd (Error: Mismatch in optional field)");
+    };
+    if (a->pPpsStd && b->pPpsStd) {
+        if (!((a->ppsStdCount) == (b->ppsStdCount))) {
+            onFail("a->pPpsStd (Error: Lengths not equal)");
+        };
+        if (!((memcmp(a->pPpsStd, b->pPpsStd,
+                      a->ppsStdCount * sizeof(const StdVideoH265PictureParameterSet)) == 0))) {
+            onFail("a->pPpsStd (Error: Unequal dyn array)");
+        };
     }
 }
 
 void checkEqual_VkVideoEncodeH265SessionParametersCreateInfoEXT(
     const VkVideoEncodeH265SessionParametersCreateInfoEXT* a,
-    const VkVideoEncodeH265SessionParametersCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkVideoEncodeH265SessionParametersCreateInfoEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->maxVpsStdCount) == (b->maxVpsStdCount))) { onFail("a->maxVpsStdCount (Error: Value not equal)"); };
-    if (!((a->maxSpsStdCount) == (b->maxSpsStdCount))) { onFail("a->maxSpsStdCount (Error: Value not equal)"); };
-    if (!((a->maxPpsStdCount) == (b->maxPpsStdCount))) { onFail("a->maxPpsStdCount (Error: Value not equal)"); };
-    if (!((!(a->pParametersAddInfo) && !(b->pParametersAddInfo)) || ((a->pParametersAddInfo) && (b->pParametersAddInfo)))) { onFail("a->pParametersAddInfo (Error: Mismatch in optional field)"); };
-    if (a->pParametersAddInfo && b->pParametersAddInfo)
-    {
-        if ((a->pParametersAddInfo) && (b->pParametersAddInfo))
-        {
-            checkEqual_VkVideoEncodeH265SessionParametersAddInfoEXT(a->pParametersAddInfo, b->pParametersAddInfo, onFail);
+    if (!((a->maxVpsStdCount) == (b->maxVpsStdCount))) {
+        onFail("a->maxVpsStdCount (Error: Value not equal)");
+    };
+    if (!((a->maxSpsStdCount) == (b->maxSpsStdCount))) {
+        onFail("a->maxSpsStdCount (Error: Value not equal)");
+    };
+    if (!((a->maxPpsStdCount) == (b->maxPpsStdCount))) {
+        onFail("a->maxPpsStdCount (Error: Value not equal)");
+    };
+    if (!((!(a->pParametersAddInfo) && !(b->pParametersAddInfo)) ||
+          ((a->pParametersAddInfo) && (b->pParametersAddInfo)))) {
+        onFail("a->pParametersAddInfo (Error: Mismatch in optional field)");
+    };
+    if (a->pParametersAddInfo && b->pParametersAddInfo) {
+        if ((a->pParametersAddInfo) && (b->pParametersAddInfo)) {
+            checkEqual_VkVideoEncodeH265SessionParametersAddInfoEXT(a->pParametersAddInfo,
+                                                                    b->pParametersAddInfo, onFail);
         }
     }
 }
 
-void checkEqual_VkVideoEncodeH265DpbSlotInfoEXT(
-    const VkVideoEncodeH265DpbSlotInfoEXT* a,
-    const VkVideoEncodeH265DpbSlotInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkVideoEncodeH265DpbSlotInfoEXT(const VkVideoEncodeH265DpbSlotInfoEXT* a,
+                                                const VkVideoEncodeH265DpbSlotInfoEXT* b,
+                                                OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->slotIndex) == (b->slotIndex))) { onFail("a->slotIndex (Error: Value not equal)"); };
-    if (!((memcmp(a->pStdReferenceInfo, b->pStdReferenceInfo, sizeof(const StdVideoEncodeH265ReferenceInfo)) == 0))) { onFail("a->pStdReferenceInfo (Error: Unequal dyn array)"); };
+    if (!((a->slotIndex) == (b->slotIndex))) {
+        onFail("a->slotIndex (Error: Value not equal)");
+    };
+    if (!((memcmp(a->pStdReferenceInfo, b->pStdReferenceInfo,
+                  sizeof(const StdVideoEncodeH265ReferenceInfo)) == 0))) {
+        onFail("a->pStdReferenceInfo (Error: Unequal dyn array)");
+    };
 }
 
-void checkEqual_VkVideoEncodeH265ReferenceListsEXT(
-    const VkVideoEncodeH265ReferenceListsEXT* a,
-    const VkVideoEncodeH265ReferenceListsEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkVideoEncodeH265ReferenceListsEXT(const VkVideoEncodeH265ReferenceListsEXT* a,
+                                                   const VkVideoEncodeH265ReferenceListsEXT* b,
+                                                   OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->referenceList0EntryCount) == (b->referenceList0EntryCount))) { onFail("a->referenceList0EntryCount (Error: Value not equal)"); };
-    if ((a->pReferenceList0Entries) && (b->pReferenceList0Entries))
-    {
-        if (!((a->referenceList0EntryCount) == (b->referenceList0EntryCount))) { onFail("a->pReferenceList0Entries (Error: Lengths not equal)"); };
-        if ((a->referenceList0EntryCount) == (b->referenceList0EntryCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->referenceList0EntryCount; ++i)
-                {
-                    checkEqual_VkVideoEncodeH265DpbSlotInfoEXT(a->pReferenceList0Entries + i, b->pReferenceList0Entries + i, onFail);
+    if (!((a->referenceList0EntryCount) == (b->referenceList0EntryCount))) {
+        onFail("a->referenceList0EntryCount (Error: Value not equal)");
+    };
+    if ((a->pReferenceList0Entries) && (b->pReferenceList0Entries)) {
+        if (!((a->referenceList0EntryCount) == (b->referenceList0EntryCount))) {
+            onFail("a->pReferenceList0Entries (Error: Lengths not equal)");
+        };
+        if ((a->referenceList0EntryCount) == (b->referenceList0EntryCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->referenceList0EntryCount; ++i) {
+                    checkEqual_VkVideoEncodeH265DpbSlotInfoEXT(
+                        a->pReferenceList0Entries + i, b->pReferenceList0Entries + i, onFail);
                 }
             }
         }
     }
-    if (!((a->referenceList1EntryCount) == (b->referenceList1EntryCount))) { onFail("a->referenceList1EntryCount (Error: Value not equal)"); };
-    if ((a->pReferenceList1Entries) && (b->pReferenceList1Entries))
-    {
-        if (!((a->referenceList1EntryCount) == (b->referenceList1EntryCount))) { onFail("a->pReferenceList1Entries (Error: Lengths not equal)"); };
-        if ((a->referenceList1EntryCount) == (b->referenceList1EntryCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->referenceList1EntryCount; ++i)
-                {
-                    checkEqual_VkVideoEncodeH265DpbSlotInfoEXT(a->pReferenceList1Entries + i, b->pReferenceList1Entries + i, onFail);
+    if (!((a->referenceList1EntryCount) == (b->referenceList1EntryCount))) {
+        onFail("a->referenceList1EntryCount (Error: Value not equal)");
+    };
+    if ((a->pReferenceList1Entries) && (b->pReferenceList1Entries)) {
+        if (!((a->referenceList1EntryCount) == (b->referenceList1EntryCount))) {
+            onFail("a->pReferenceList1Entries (Error: Lengths not equal)");
+        };
+        if ((a->referenceList1EntryCount) == (b->referenceList1EntryCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->referenceList1EntryCount; ++i) {
+                    checkEqual_VkVideoEncodeH265DpbSlotInfoEXT(
+                        a->pReferenceList1Entries + i, b->pReferenceList1Entries + i, onFail);
                 }
             }
         }
     }
-    if (!((memcmp(a->pReferenceModifications, b->pReferenceModifications, sizeof(const StdVideoEncodeH265ReferenceModifications)) == 0))) { onFail("a->pReferenceModifications (Error: Unequal dyn array)"); };
+    if (!((memcmp(a->pReferenceModifications, b->pReferenceModifications,
+                  sizeof(const StdVideoEncodeH265ReferenceModifications)) == 0))) {
+        onFail("a->pReferenceModifications (Error: Unequal dyn array)");
+    };
 }
 
-void checkEqual_VkVideoEncodeH265NaluSliceEXT(
-    const VkVideoEncodeH265NaluSliceEXT* a,
-    const VkVideoEncodeH265NaluSliceEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkVideoEncodeH265NaluSliceEXT(const VkVideoEncodeH265NaluSliceEXT* a,
+                                              const VkVideoEncodeH265NaluSliceEXT* b,
+                                              OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->ctbCount) == (b->ctbCount))) { onFail("a->ctbCount (Error: Value not equal)"); };
-    if (!((!(a->pReferenceFinalLists) && !(b->pReferenceFinalLists)) || ((a->pReferenceFinalLists) && (b->pReferenceFinalLists)))) { onFail("a->pReferenceFinalLists (Error: Mismatch in optional field)"); };
-    if (a->pReferenceFinalLists && b->pReferenceFinalLists)
-    {
-        if ((a->pReferenceFinalLists) && (b->pReferenceFinalLists))
-        {
-            checkEqual_VkVideoEncodeH265ReferenceListsEXT(a->pReferenceFinalLists, b->pReferenceFinalLists, onFail);
+    if (!((a->ctbCount) == (b->ctbCount))) {
+        onFail("a->ctbCount (Error: Value not equal)");
+    };
+    if (!((!(a->pReferenceFinalLists) && !(b->pReferenceFinalLists)) ||
+          ((a->pReferenceFinalLists) && (b->pReferenceFinalLists)))) {
+        onFail("a->pReferenceFinalLists (Error: Mismatch in optional field)");
+    };
+    if (a->pReferenceFinalLists && b->pReferenceFinalLists) {
+        if ((a->pReferenceFinalLists) && (b->pReferenceFinalLists)) {
+            checkEqual_VkVideoEncodeH265ReferenceListsEXT(a->pReferenceFinalLists,
+                                                          b->pReferenceFinalLists, onFail);
         }
     }
-    if (!((memcmp(a->pSliceHeaderStd, b->pSliceHeaderStd, sizeof(const StdVideoEncodeH265SliceHeader)) == 0))) { onFail("a->pSliceHeaderStd (Error: Unequal dyn array)"); };
+    if (!((memcmp(a->pSliceHeaderStd, b->pSliceHeaderStd,
+                  sizeof(const StdVideoEncodeH265SliceHeader)) == 0))) {
+        onFail("a->pSliceHeaderStd (Error: Unequal dyn array)");
+    };
 }
 
-void checkEqual_VkVideoEncodeH265VclFrameInfoEXT(
-    const VkVideoEncodeH265VclFrameInfoEXT* a,
-    const VkVideoEncodeH265VclFrameInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkVideoEncodeH265VclFrameInfoEXT(const VkVideoEncodeH265VclFrameInfoEXT* a,
+                                                 const VkVideoEncodeH265VclFrameInfoEXT* b,
+                                                 OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((!(a->pReferenceFinalLists) && !(b->pReferenceFinalLists)) || ((a->pReferenceFinalLists) && (b->pReferenceFinalLists)))) { onFail("a->pReferenceFinalLists (Error: Mismatch in optional field)"); };
-    if (a->pReferenceFinalLists && b->pReferenceFinalLists)
-    {
-        if ((a->pReferenceFinalLists) && (b->pReferenceFinalLists))
-        {
-            checkEqual_VkVideoEncodeH265ReferenceListsEXT(a->pReferenceFinalLists, b->pReferenceFinalLists, onFail);
+    if (!((!(a->pReferenceFinalLists) && !(b->pReferenceFinalLists)) ||
+          ((a->pReferenceFinalLists) && (b->pReferenceFinalLists)))) {
+        onFail("a->pReferenceFinalLists (Error: Mismatch in optional field)");
+    };
+    if (a->pReferenceFinalLists && b->pReferenceFinalLists) {
+        if ((a->pReferenceFinalLists) && (b->pReferenceFinalLists)) {
+            checkEqual_VkVideoEncodeH265ReferenceListsEXT(a->pReferenceFinalLists,
+                                                          b->pReferenceFinalLists, onFail);
         }
     }
-    if (!((a->naluSliceEntryCount) == (b->naluSliceEntryCount))) { onFail("a->naluSliceEntryCount (Error: Value not equal)"); };
-    if ((a->pNaluSliceEntries) && (b->pNaluSliceEntries))
-    {
-        if (!((a->naluSliceEntryCount) == (b->naluSliceEntryCount))) { onFail("a->pNaluSliceEntries (Error: Lengths not equal)"); };
-        if ((a->naluSliceEntryCount) == (b->naluSliceEntryCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->naluSliceEntryCount; ++i)
-                {
-                    checkEqual_VkVideoEncodeH265NaluSliceEXT(a->pNaluSliceEntries + i, b->pNaluSliceEntries + i, onFail);
+    if (!((a->naluSliceEntryCount) == (b->naluSliceEntryCount))) {
+        onFail("a->naluSliceEntryCount (Error: Value not equal)");
+    };
+    if ((a->pNaluSliceEntries) && (b->pNaluSliceEntries)) {
+        if (!((a->naluSliceEntryCount) == (b->naluSliceEntryCount))) {
+            onFail("a->pNaluSliceEntries (Error: Lengths not equal)");
+        };
+        if ((a->naluSliceEntryCount) == (b->naluSliceEntryCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->naluSliceEntryCount; ++i) {
+                    checkEqual_VkVideoEncodeH265NaluSliceEXT(a->pNaluSliceEntries + i,
+                                                             b->pNaluSliceEntries + i, onFail);
                 }
             }
         }
     }
-    if (!((memcmp(a->pCurrentPictureInfo, b->pCurrentPictureInfo, sizeof(const StdVideoEncodeH265PictureInfo)) == 0))) { onFail("a->pCurrentPictureInfo (Error: Unequal dyn array)"); };
+    if (!((memcmp(a->pCurrentPictureInfo, b->pCurrentPictureInfo,
+                  sizeof(const StdVideoEncodeH265PictureInfo)) == 0))) {
+        onFail("a->pCurrentPictureInfo (Error: Unequal dyn array)");
+    };
 }
 
 void checkEqual_VkVideoEncodeH265EmitPictureParametersEXT(
     const VkVideoEncodeH265EmitPictureParametersEXT* a,
-    const VkVideoEncodeH265EmitPictureParametersEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkVideoEncodeH265EmitPictureParametersEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->vpsId) == (b->vpsId))) { onFail("a->vpsId (Error: Value not equal)"); };
-    if (!((a->spsId) == (b->spsId))) { onFail("a->spsId (Error: Value not equal)"); };
-    if (!((a->emitVpsEnable) == (b->emitVpsEnable))) { onFail("a->emitVpsEnable (Error: Value not equal)"); };
-    if (!((a->emitSpsEnable) == (b->emitSpsEnable))) { onFail("a->emitSpsEnable (Error: Value not equal)"); };
-    if (!((a->ppsIdEntryCount) == (b->ppsIdEntryCount))) { onFail("a->ppsIdEntryCount (Error: Value not equal)"); };
-    if (!((a->ppsIdEntryCount) == (b->ppsIdEntryCount))) { onFail("a->ppsIdEntries (Error: Lengths not equal)"); };
-    if (!((memcmp(a->ppsIdEntries, b->ppsIdEntries, a->ppsIdEntryCount * sizeof(const uint8_t)) == 0))) { onFail("a->ppsIdEntries (Error: Unequal dyn array)"); };
+    if (!((a->vpsId) == (b->vpsId))) {
+        onFail("a->vpsId (Error: Value not equal)");
+    };
+    if (!((a->spsId) == (b->spsId))) {
+        onFail("a->spsId (Error: Value not equal)");
+    };
+    if (!((a->emitVpsEnable) == (b->emitVpsEnable))) {
+        onFail("a->emitVpsEnable (Error: Value not equal)");
+    };
+    if (!((a->emitSpsEnable) == (b->emitSpsEnable))) {
+        onFail("a->emitSpsEnable (Error: Value not equal)");
+    };
+    if (!((a->ppsIdEntryCount) == (b->ppsIdEntryCount))) {
+        onFail("a->ppsIdEntryCount (Error: Value not equal)");
+    };
+    if (!((a->ppsIdEntryCount) == (b->ppsIdEntryCount))) {
+        onFail("a->ppsIdEntries (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->ppsIdEntries, b->ppsIdEntries, a->ppsIdEntryCount * sizeof(const uint8_t)) ==
+           0))) {
+        onFail("a->ppsIdEntries (Error: Unequal dyn array)");
+    };
 }
 
-void checkEqual_VkVideoEncodeH265ProfileEXT(
-    const VkVideoEncodeH265ProfileEXT* a,
-    const VkVideoEncodeH265ProfileEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkVideoEncodeH265ProfileEXT(const VkVideoEncodeH265ProfileEXT* a,
+                                            const VkVideoEncodeH265ProfileEXT* b,
+                                            OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->stdProfileIdc) == (b->stdProfileIdc))) { onFail("a->stdProfileIdc (Error: Value not equal)"); };
+    if (!((a->stdProfileIdc) == (b->stdProfileIdc))) {
+        onFail("a->stdProfileIdc (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_video_decode_h264
-void checkEqual_VkVideoDecodeH264ProfileEXT(
-    const VkVideoDecodeH264ProfileEXT* a,
-    const VkVideoDecodeH264ProfileEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkVideoDecodeH264ProfileEXT(const VkVideoDecodeH264ProfileEXT* a,
+                                            const VkVideoDecodeH264ProfileEXT* b,
+                                            OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->stdProfileIdc) == (b->stdProfileIdc))) { onFail("a->stdProfileIdc (Error: Value not equal)"); };
-    if (!((a->pictureLayout) == (b->pictureLayout))) { onFail("a->pictureLayout (Error: Value not equal)"); };
+    if (!((a->stdProfileIdc) == (b->stdProfileIdc))) {
+        onFail("a->stdProfileIdc (Error: Value not equal)");
+    };
+    if (!((a->pictureLayout) == (b->pictureLayout))) {
+        onFail("a->pictureLayout (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkVideoDecodeH264CapabilitiesEXT(
-    const VkVideoDecodeH264CapabilitiesEXT* a,
-    const VkVideoDecodeH264CapabilitiesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkVideoDecodeH264CapabilitiesEXT(const VkVideoDecodeH264CapabilitiesEXT* a,
+                                                 const VkVideoDecodeH264CapabilitiesEXT* b,
+                                                 OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->maxLevel) == (b->maxLevel))) { onFail("a->maxLevel (Error: Value not equal)"); };
+    if (!((a->maxLevel) == (b->maxLevel))) {
+        onFail("a->maxLevel (Error: Value not equal)");
+    };
     checkEqual_VkOffset2D(&a->fieldOffsetGranularity, &b->fieldOffsetGranularity, onFail);
     checkEqual_VkExtensionProperties(&a->stdExtensionVersion, &b->stdExtensionVersion, onFail);
 }
 
 void checkEqual_VkVideoDecodeH264SessionCreateInfoEXT(
-    const VkVideoDecodeH264SessionCreateInfoEXT* a,
-    const VkVideoDecodeH264SessionCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkVideoDecodeH264SessionCreateInfoEXT* a, const VkVideoDecodeH264SessionCreateInfoEXT* b,
+    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if ((a->pStdExtensionVersion) && (b->pStdExtensionVersion))
-    {
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if ((a->pStdExtensionVersion) && (b->pStdExtensionVersion)) {
         checkEqual_VkExtensionProperties(a->pStdExtensionVersion, b->pStdExtensionVersion, onFail);
     }
 }
 
 void checkEqual_VkVideoDecodeH264SessionParametersAddInfoEXT(
     const VkVideoDecodeH264SessionParametersAddInfoEXT* a,
-    const VkVideoDecodeH264SessionParametersAddInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkVideoDecodeH264SessionParametersAddInfoEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->spsStdCount) == (b->spsStdCount))) { onFail("a->spsStdCount (Error: Value not equal)"); };
-    if (!((!(a->pSpsStd) && !(b->pSpsStd)) || ((a->pSpsStd) && (b->pSpsStd)))) { onFail("a->pSpsStd (Error: Mismatch in optional field)"); };
-    if (a->pSpsStd && b->pSpsStd)
-    {
-        if (!((a->spsStdCount) == (b->spsStdCount))) { onFail("a->pSpsStd (Error: Lengths not equal)"); };
-        if (!((memcmp(a->pSpsStd, b->pSpsStd, a->spsStdCount * sizeof(const StdVideoH264SequenceParameterSet)) == 0))) { onFail("a->pSpsStd (Error: Unequal dyn array)"); };
+    if (!((a->spsStdCount) == (b->spsStdCount))) {
+        onFail("a->spsStdCount (Error: Value not equal)");
+    };
+    if (!((!(a->pSpsStd) && !(b->pSpsStd)) || ((a->pSpsStd) && (b->pSpsStd)))) {
+        onFail("a->pSpsStd (Error: Mismatch in optional field)");
+    };
+    if (a->pSpsStd && b->pSpsStd) {
+        if (!((a->spsStdCount) == (b->spsStdCount))) {
+            onFail("a->pSpsStd (Error: Lengths not equal)");
+        };
+        if (!((memcmp(a->pSpsStd, b->pSpsStd,
+                      a->spsStdCount * sizeof(const StdVideoH264SequenceParameterSet)) == 0))) {
+            onFail("a->pSpsStd (Error: Unequal dyn array)");
+        };
     }
-    if (!((a->ppsStdCount) == (b->ppsStdCount))) { onFail("a->ppsStdCount (Error: Value not equal)"); };
-    if (!((!(a->pPpsStd) && !(b->pPpsStd)) || ((a->pPpsStd) && (b->pPpsStd)))) { onFail("a->pPpsStd (Error: Mismatch in optional field)"); };
-    if (a->pPpsStd && b->pPpsStd)
-    {
-        if (!((a->ppsStdCount) == (b->ppsStdCount))) { onFail("a->pPpsStd (Error: Lengths not equal)"); };
-        if (!((memcmp(a->pPpsStd, b->pPpsStd, a->ppsStdCount * sizeof(const StdVideoH264PictureParameterSet)) == 0))) { onFail("a->pPpsStd (Error: Unequal dyn array)"); };
+    if (!((a->ppsStdCount) == (b->ppsStdCount))) {
+        onFail("a->ppsStdCount (Error: Value not equal)");
+    };
+    if (!((!(a->pPpsStd) && !(b->pPpsStd)) || ((a->pPpsStd) && (b->pPpsStd)))) {
+        onFail("a->pPpsStd (Error: Mismatch in optional field)");
+    };
+    if (a->pPpsStd && b->pPpsStd) {
+        if (!((a->ppsStdCount) == (b->ppsStdCount))) {
+            onFail("a->pPpsStd (Error: Lengths not equal)");
+        };
+        if (!((memcmp(a->pPpsStd, b->pPpsStd,
+                      a->ppsStdCount * sizeof(const StdVideoH264PictureParameterSet)) == 0))) {
+            onFail("a->pPpsStd (Error: Unequal dyn array)");
+        };
     }
 }
 
 void checkEqual_VkVideoDecodeH264SessionParametersCreateInfoEXT(
     const VkVideoDecodeH264SessionParametersCreateInfoEXT* a,
-    const VkVideoDecodeH264SessionParametersCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkVideoDecodeH264SessionParametersCreateInfoEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->maxSpsStdCount) == (b->maxSpsStdCount))) { onFail("a->maxSpsStdCount (Error: Value not equal)"); };
-    if (!((a->maxPpsStdCount) == (b->maxPpsStdCount))) { onFail("a->maxPpsStdCount (Error: Value not equal)"); };
-    if (!((!(a->pParametersAddInfo) && !(b->pParametersAddInfo)) || ((a->pParametersAddInfo) && (b->pParametersAddInfo)))) { onFail("a->pParametersAddInfo (Error: Mismatch in optional field)"); };
-    if (a->pParametersAddInfo && b->pParametersAddInfo)
-    {
-        if ((a->pParametersAddInfo) && (b->pParametersAddInfo))
-        {
-            checkEqual_VkVideoDecodeH264SessionParametersAddInfoEXT(a->pParametersAddInfo, b->pParametersAddInfo, onFail);
+    if (!((a->maxSpsStdCount) == (b->maxSpsStdCount))) {
+        onFail("a->maxSpsStdCount (Error: Value not equal)");
+    };
+    if (!((a->maxPpsStdCount) == (b->maxPpsStdCount))) {
+        onFail("a->maxPpsStdCount (Error: Value not equal)");
+    };
+    if (!((!(a->pParametersAddInfo) && !(b->pParametersAddInfo)) ||
+          ((a->pParametersAddInfo) && (b->pParametersAddInfo)))) {
+        onFail("a->pParametersAddInfo (Error: Mismatch in optional field)");
+    };
+    if (a->pParametersAddInfo && b->pParametersAddInfo) {
+        if ((a->pParametersAddInfo) && (b->pParametersAddInfo)) {
+            checkEqual_VkVideoDecodeH264SessionParametersAddInfoEXT(a->pParametersAddInfo,
+                                                                    b->pParametersAddInfo, onFail);
         }
     }
 }
 
-void checkEqual_VkVideoDecodeH264PictureInfoEXT(
-    const VkVideoDecodeH264PictureInfoEXT* a,
-    const VkVideoDecodeH264PictureInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkVideoDecodeH264PictureInfoEXT(const VkVideoDecodeH264PictureInfoEXT* a,
+                                                const VkVideoDecodeH264PictureInfoEXT* b,
+                                                OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((memcmp(a->pStdPictureInfo, b->pStdPictureInfo, sizeof(const StdVideoDecodeH264PictureInfo)) == 0))) { onFail("a->pStdPictureInfo (Error: Unequal dyn array)"); };
-    if (!((a->slicesCount) == (b->slicesCount))) { onFail("a->slicesCount (Error: Value not equal)"); };
-    if (!((a->slicesCount) == (b->slicesCount))) { onFail("a->pSlicesDataOffsets (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pSlicesDataOffsets, b->pSlicesDataOffsets, a->slicesCount * sizeof(const uint32_t)) == 0))) { onFail("a->pSlicesDataOffsets (Error: Unequal dyn array)"); };
+    if (!((memcmp(a->pStdPictureInfo, b->pStdPictureInfo,
+                  sizeof(const StdVideoDecodeH264PictureInfo)) == 0))) {
+        onFail("a->pStdPictureInfo (Error: Unequal dyn array)");
+    };
+    if (!((a->slicesCount) == (b->slicesCount))) {
+        onFail("a->slicesCount (Error: Value not equal)");
+    };
+    if (!((a->slicesCount) == (b->slicesCount))) {
+        onFail("a->pSlicesDataOffsets (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pSlicesDataOffsets, b->pSlicesDataOffsets,
+                  a->slicesCount * sizeof(const uint32_t)) == 0))) {
+        onFail("a->pSlicesDataOffsets (Error: Unequal dyn array)");
+    };
 }
 
-void checkEqual_VkVideoDecodeH264MvcEXT(
-    const VkVideoDecodeH264MvcEXT* a,
-    const VkVideoDecodeH264MvcEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkVideoDecodeH264MvcEXT(const VkVideoDecodeH264MvcEXT* a,
+                                        const VkVideoDecodeH264MvcEXT* b,
+                                        OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((memcmp(a->pStdMvc, b->pStdMvc, sizeof(const StdVideoDecodeH264Mvc)) == 0))) { onFail("a->pStdMvc (Error: Unequal dyn array)"); };
+    if (!((memcmp(a->pStdMvc, b->pStdMvc, sizeof(const StdVideoDecodeH264Mvc)) == 0))) {
+        onFail("a->pStdMvc (Error: Unequal dyn array)");
+    };
 }
 
-void checkEqual_VkVideoDecodeH264DpbSlotInfoEXT(
-    const VkVideoDecodeH264DpbSlotInfoEXT* a,
-    const VkVideoDecodeH264DpbSlotInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkVideoDecodeH264DpbSlotInfoEXT(const VkVideoDecodeH264DpbSlotInfoEXT* a,
+                                                const VkVideoDecodeH264DpbSlotInfoEXT* b,
+                                                OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((memcmp(a->pStdReferenceInfo, b->pStdReferenceInfo, sizeof(const StdVideoDecodeH264ReferenceInfo)) == 0))) { onFail("a->pStdReferenceInfo (Error: Unequal dyn array)"); };
+    if (!((memcmp(a->pStdReferenceInfo, b->pStdReferenceInfo,
+                  sizeof(const StdVideoDecodeH264ReferenceInfo)) == 0))) {
+        onFail("a->pStdReferenceInfo (Error: Unequal dyn array)");
+    };
 }
 
 #endif
 #ifdef VK_AMD_texture_gather_bias_lod
 void checkEqual_VkTextureLODGatherFormatPropertiesAMD(
-    const VkTextureLODGatherFormatPropertiesAMD* a,
-    const VkTextureLODGatherFormatPropertiesAMD* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkTextureLODGatherFormatPropertiesAMD* a, const VkTextureLODGatherFormatPropertiesAMD* b,
+    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->supportsTextureGatherLODBiasAMD) == (b->supportsTextureGatherLODBiasAMD))) { onFail("a->supportsTextureGatherLODBiasAMD (Error: Value not equal)"); };
+    if (!((a->supportsTextureGatherLODBiasAMD) == (b->supportsTextureGatherLODBiasAMD))) {
+        onFail("a->supportsTextureGatherLODBiasAMD (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_AMD_shader_info
-void checkEqual_VkShaderResourceUsageAMD(
-    const VkShaderResourceUsageAMD* a,
-    const VkShaderResourceUsageAMD* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->numUsedVgprs) == (b->numUsedVgprs))) { onFail("a->numUsedVgprs (Error: Value not equal)"); };
-    if (!((a->numUsedSgprs) == (b->numUsedSgprs))) { onFail("a->numUsedSgprs (Error: Value not equal)"); };
-    if (!((a->ldsSizePerLocalWorkGroup) == (b->ldsSizePerLocalWorkGroup))) { onFail("a->ldsSizePerLocalWorkGroup (Error: Value not equal)"); };
-    if (!((a->ldsUsageSizeInBytes) == (b->ldsUsageSizeInBytes))) { onFail("a->ldsUsageSizeInBytes (Error: Value not equal)"); };
-    if (!((a->scratchMemUsageInBytes) == (b->scratchMemUsageInBytes))) { onFail("a->scratchMemUsageInBytes (Error: Value not equal)"); };
+void checkEqual_VkShaderResourceUsageAMD(const VkShaderResourceUsageAMD* a,
+                                         const VkShaderResourceUsageAMD* b,
+                                         OnFailCompareFunc onFail) {
+    if (!((a->numUsedVgprs) == (b->numUsedVgprs))) {
+        onFail("a->numUsedVgprs (Error: Value not equal)");
+    };
+    if (!((a->numUsedSgprs) == (b->numUsedSgprs))) {
+        onFail("a->numUsedSgprs (Error: Value not equal)");
+    };
+    if (!((a->ldsSizePerLocalWorkGroup) == (b->ldsSizePerLocalWorkGroup))) {
+        onFail("a->ldsSizePerLocalWorkGroup (Error: Value not equal)");
+    };
+    if (!((a->ldsUsageSizeInBytes) == (b->ldsUsageSizeInBytes))) {
+        onFail("a->ldsUsageSizeInBytes (Error: Value not equal)");
+    };
+    if (!((a->scratchMemUsageInBytes) == (b->scratchMemUsageInBytes))) {
+        onFail("a->scratchMemUsageInBytes (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkShaderStatisticsInfoAMD(
-    const VkShaderStatisticsInfoAMD* a,
-    const VkShaderStatisticsInfoAMD* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->shaderStageMask) == (b->shaderStageMask))) { onFail("a->shaderStageMask (Error: Value not equal)"); };
+void checkEqual_VkShaderStatisticsInfoAMD(const VkShaderStatisticsInfoAMD* a,
+                                          const VkShaderStatisticsInfoAMD* b,
+                                          OnFailCompareFunc onFail) {
+    if (!((a->shaderStageMask) == (b->shaderStageMask))) {
+        onFail("a->shaderStageMask (Error: Value not equal)");
+    };
     checkEqual_VkShaderResourceUsageAMD(&a->resourceUsage, &b->resourceUsage, onFail);
-    if (!((a->numPhysicalVgprs) == (b->numPhysicalVgprs))) { onFail("a->numPhysicalVgprs (Error: Value not equal)"); };
-    if (!((a->numPhysicalSgprs) == (b->numPhysicalSgprs))) { onFail("a->numPhysicalSgprs (Error: Value not equal)"); };
-    if (!((a->numAvailableVgprs) == (b->numAvailableVgprs))) { onFail("a->numAvailableVgprs (Error: Value not equal)"); };
-    if (!((a->numAvailableSgprs) == (b->numAvailableSgprs))) { onFail("a->numAvailableSgprs (Error: Value not equal)"); };
-    if (!((memcmp(a->computeWorkGroupSize, b->computeWorkGroupSize, 3 * sizeof(uint32_t)) == 0))) { onFail("a->computeWorkGroupSize (Error: Unequal static array)"); };
+    if (!((a->numPhysicalVgprs) == (b->numPhysicalVgprs))) {
+        onFail("a->numPhysicalVgprs (Error: Value not equal)");
+    };
+    if (!((a->numPhysicalSgprs) == (b->numPhysicalSgprs))) {
+        onFail("a->numPhysicalSgprs (Error: Value not equal)");
+    };
+    if (!((a->numAvailableVgprs) == (b->numAvailableVgprs))) {
+        onFail("a->numAvailableVgprs (Error: Value not equal)");
+    };
+    if (!((a->numAvailableSgprs) == (b->numAvailableSgprs))) {
+        onFail("a->numAvailableSgprs (Error: Value not equal)");
+    };
+    if (!((memcmp(a->computeWorkGroupSize, b->computeWorkGroupSize, 3 * sizeof(uint32_t)) == 0))) {
+        onFail("a->computeWorkGroupSize (Error: Unequal static array)");
+    };
 }
 
 #endif
@@ -8087,167 +11109,221 @@
 #ifdef VK_GGP_stream_descriptor_surface
 void checkEqual_VkStreamDescriptorSurfaceCreateInfoGGP(
     const VkStreamDescriptorSurfaceCreateInfoGGP* a,
-    const VkStreamDescriptorSurfaceCreateInfoGGP* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkStreamDescriptorSurfaceCreateInfoGGP* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->streamDescriptor) == (b->streamDescriptor))) { onFail("a->streamDescriptor (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->streamDescriptor) == (b->streamDescriptor))) {
+        onFail("a->streamDescriptor (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_NV_corner_sampled_image
 void checkEqual_VkPhysicalDeviceCornerSampledImageFeaturesNV(
     const VkPhysicalDeviceCornerSampledImageFeaturesNV* a,
-    const VkPhysicalDeviceCornerSampledImageFeaturesNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceCornerSampledImageFeaturesNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->cornerSampledImage) == (b->cornerSampledImage))) { onFail("a->cornerSampledImage (Error: Value not equal)"); };
+    if (!((a->cornerSampledImage) == (b->cornerSampledImage))) {
+        onFail("a->cornerSampledImage (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_IMG_format_pvrtc
 #endif
 #ifdef VK_NV_external_memory_capabilities
-void checkEqual_VkExternalImageFormatPropertiesNV(
-    const VkExternalImageFormatPropertiesNV* a,
-    const VkExternalImageFormatPropertiesNV* b,
-    OnFailCompareFunc onFail)
-{
-    checkEqual_VkImageFormatProperties(&a->imageFormatProperties, &b->imageFormatProperties, onFail);
-    if (!((a->externalMemoryFeatures) == (b->externalMemoryFeatures))) { onFail("a->externalMemoryFeatures (Error: Value not equal)"); };
-    if (!((a->exportFromImportedHandleTypes) == (b->exportFromImportedHandleTypes))) { onFail("a->exportFromImportedHandleTypes (Error: Value not equal)"); };
-    if (!((a->compatibleHandleTypes) == (b->compatibleHandleTypes))) { onFail("a->compatibleHandleTypes (Error: Value not equal)"); };
+void checkEqual_VkExternalImageFormatPropertiesNV(const VkExternalImageFormatPropertiesNV* a,
+                                                  const VkExternalImageFormatPropertiesNV* b,
+                                                  OnFailCompareFunc onFail) {
+    checkEqual_VkImageFormatProperties(&a->imageFormatProperties, &b->imageFormatProperties,
+                                       onFail);
+    if (!((a->externalMemoryFeatures) == (b->externalMemoryFeatures))) {
+        onFail("a->externalMemoryFeatures (Error: Value not equal)");
+    };
+    if (!((a->exportFromImportedHandleTypes) == (b->exportFromImportedHandleTypes))) {
+        onFail("a->exportFromImportedHandleTypes (Error: Value not equal)");
+    };
+    if (!((a->compatibleHandleTypes) == (b->compatibleHandleTypes))) {
+        onFail("a->compatibleHandleTypes (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_NV_external_memory
-void checkEqual_VkExternalMemoryImageCreateInfoNV(
-    const VkExternalMemoryImageCreateInfoNV* a,
-    const VkExternalMemoryImageCreateInfoNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkExternalMemoryImageCreateInfoNV(const VkExternalMemoryImageCreateInfoNV* a,
+                                                  const VkExternalMemoryImageCreateInfoNV* b,
+                                                  OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->handleTypes) == (b->handleTypes))) { onFail("a->handleTypes (Error: Value not equal)"); };
+    if (!((a->handleTypes) == (b->handleTypes))) {
+        onFail("a->handleTypes (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkExportMemoryAllocateInfoNV(
-    const VkExportMemoryAllocateInfoNV* a,
-    const VkExportMemoryAllocateInfoNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkExportMemoryAllocateInfoNV(const VkExportMemoryAllocateInfoNV* a,
+                                             const VkExportMemoryAllocateInfoNV* b,
+                                             OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->handleTypes) == (b->handleTypes))) { onFail("a->handleTypes (Error: Value not equal)"); };
+    if (!((a->handleTypes) == (b->handleTypes))) {
+        onFail("a->handleTypes (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_NV_external_memory_win32
-void checkEqual_VkImportMemoryWin32HandleInfoNV(
-    const VkImportMemoryWin32HandleInfoNV* a,
-    const VkImportMemoryWin32HandleInfoNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkImportMemoryWin32HandleInfoNV(const VkImportMemoryWin32HandleInfoNV* a,
+                                                const VkImportMemoryWin32HandleInfoNV* b,
+                                                OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->handleType) == (b->handleType))) { onFail("a->handleType (Error: Value not equal)"); };
-    if (!((a->handle) == (b->handle))) { onFail("a->handle (Error: Value not equal)"); };
+    if (!((a->handleType) == (b->handleType))) {
+        onFail("a->handleType (Error: Value not equal)");
+    };
+    if (!((a->handle) == (b->handle))) {
+        onFail("a->handle (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkExportMemoryWin32HandleInfoNV(
-    const VkExportMemoryWin32HandleInfoNV* a,
-    const VkExportMemoryWin32HandleInfoNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkExportMemoryWin32HandleInfoNV(const VkExportMemoryWin32HandleInfoNV* a,
+                                                const VkExportMemoryWin32HandleInfoNV* b,
+                                                OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((!(a->pAttributes) && !(b->pAttributes)) || ((a->pAttributes) && (b->pAttributes)))) { onFail("a->pAttributes (Error: Mismatch in optional field)"); };
-    if (a->pAttributes && b->pAttributes)
-    {
-        if (!((memcmp(a->pAttributes, b->pAttributes, sizeof(const SECURITY_ATTRIBUTES)) == 0))) { onFail("a->pAttributes (Error: Unequal dyn array)"); };
+    if (!((!(a->pAttributes) && !(b->pAttributes)) || ((a->pAttributes) && (b->pAttributes)))) {
+        onFail("a->pAttributes (Error: Mismatch in optional field)");
+    };
+    if (a->pAttributes && b->pAttributes) {
+        if (!((memcmp(a->pAttributes, b->pAttributes, sizeof(const SECURITY_ATTRIBUTES)) == 0))) {
+            onFail("a->pAttributes (Error: Unequal dyn array)");
+        };
     }
-    if (!((a->dwAccess) == (b->dwAccess))) { onFail("a->dwAccess (Error: Value not equal)"); };
+    if (!((a->dwAccess) == (b->dwAccess))) {
+        onFail("a->dwAccess (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_NV_win32_keyed_mutex
 void checkEqual_VkWin32KeyedMutexAcquireReleaseInfoNV(
-    const VkWin32KeyedMutexAcquireReleaseInfoNV* a,
-    const VkWin32KeyedMutexAcquireReleaseInfoNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkWin32KeyedMutexAcquireReleaseInfoNV* a, const VkWin32KeyedMutexAcquireReleaseInfoNV* b,
+    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->acquireCount) == (b->acquireCount))) { onFail("a->acquireCount (Error: Value not equal)"); };
-    if (!((a->acquireCount) == (b->acquireCount))) { onFail("a->pAcquireSyncs (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pAcquireSyncs, b->pAcquireSyncs, a->acquireCount * sizeof(const VkDeviceMemory)) == 0))) { onFail("a->pAcquireSyncs (Error: Unequal dyn array)"); };
-    if (!((a->acquireCount) == (b->acquireCount))) { onFail("a->pAcquireKeys (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pAcquireKeys, b->pAcquireKeys, a->acquireCount * sizeof(const uint64_t)) == 0))) { onFail("a->pAcquireKeys (Error: Unequal dyn array)"); };
-    if (!((a->acquireCount) == (b->acquireCount))) { onFail("a->pAcquireTimeoutMilliseconds (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pAcquireTimeoutMilliseconds, b->pAcquireTimeoutMilliseconds, a->acquireCount * sizeof(const uint32_t)) == 0))) { onFail("a->pAcquireTimeoutMilliseconds (Error: Unequal dyn array)"); };
-    if (!((a->releaseCount) == (b->releaseCount))) { onFail("a->releaseCount (Error: Value not equal)"); };
-    if (!((a->releaseCount) == (b->releaseCount))) { onFail("a->pReleaseSyncs (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pReleaseSyncs, b->pReleaseSyncs, a->releaseCount * sizeof(const VkDeviceMemory)) == 0))) { onFail("a->pReleaseSyncs (Error: Unequal dyn array)"); };
-    if (!((a->releaseCount) == (b->releaseCount))) { onFail("a->pReleaseKeys (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pReleaseKeys, b->pReleaseKeys, a->releaseCount * sizeof(const uint64_t)) == 0))) { onFail("a->pReleaseKeys (Error: Unequal dyn array)"); };
+    if (!((a->acquireCount) == (b->acquireCount))) {
+        onFail("a->acquireCount (Error: Value not equal)");
+    };
+    if (!((a->acquireCount) == (b->acquireCount))) {
+        onFail("a->pAcquireSyncs (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pAcquireSyncs, b->pAcquireSyncs,
+                  a->acquireCount * sizeof(const VkDeviceMemory)) == 0))) {
+        onFail("a->pAcquireSyncs (Error: Unequal dyn array)");
+    };
+    if (!((a->acquireCount) == (b->acquireCount))) {
+        onFail("a->pAcquireKeys (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pAcquireKeys, b->pAcquireKeys, a->acquireCount * sizeof(const uint64_t)) ==
+           0))) {
+        onFail("a->pAcquireKeys (Error: Unequal dyn array)");
+    };
+    if (!((a->acquireCount) == (b->acquireCount))) {
+        onFail("a->pAcquireTimeoutMilliseconds (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pAcquireTimeoutMilliseconds, b->pAcquireTimeoutMilliseconds,
+                  a->acquireCount * sizeof(const uint32_t)) == 0))) {
+        onFail("a->pAcquireTimeoutMilliseconds (Error: Unequal dyn array)");
+    };
+    if (!((a->releaseCount) == (b->releaseCount))) {
+        onFail("a->releaseCount (Error: Value not equal)");
+    };
+    if (!((a->releaseCount) == (b->releaseCount))) {
+        onFail("a->pReleaseSyncs (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pReleaseSyncs, b->pReleaseSyncs,
+                  a->releaseCount * sizeof(const VkDeviceMemory)) == 0))) {
+        onFail("a->pReleaseSyncs (Error: Unequal dyn array)");
+    };
+    if (!((a->releaseCount) == (b->releaseCount))) {
+        onFail("a->pReleaseKeys (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pReleaseKeys, b->pReleaseKeys, a->releaseCount * sizeof(const uint64_t)) ==
+           0))) {
+        onFail("a->pReleaseKeys (Error: Unequal dyn array)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_validation_flags
-void checkEqual_VkValidationFlagsEXT(
-    const VkValidationFlagsEXT* a,
-    const VkValidationFlagsEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkValidationFlagsEXT(const VkValidationFlagsEXT* a, const VkValidationFlagsEXT* b,
+                                     OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->disabledValidationCheckCount) == (b->disabledValidationCheckCount))) { onFail("a->disabledValidationCheckCount (Error: Value not equal)"); };
-    if (!((a->disabledValidationCheckCount) == (b->disabledValidationCheckCount))) { onFail("a->pDisabledValidationChecks (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pDisabledValidationChecks, b->pDisabledValidationChecks, a->disabledValidationCheckCount * sizeof(const VkValidationCheckEXT)) == 0))) { onFail("a->pDisabledValidationChecks (Error: Unequal dyn array)"); };
+    if (!((a->disabledValidationCheckCount) == (b->disabledValidationCheckCount))) {
+        onFail("a->disabledValidationCheckCount (Error: Value not equal)");
+    };
+    if (!((a->disabledValidationCheckCount) == (b->disabledValidationCheckCount))) {
+        onFail("a->pDisabledValidationChecks (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pDisabledValidationChecks, b->pDisabledValidationChecks,
+                  a->disabledValidationCheckCount * sizeof(const VkValidationCheckEXT)) == 0))) {
+        onFail("a->pDisabledValidationChecks (Error: Unequal dyn array)");
+    };
 }
 
 #endif
 #ifdef VK_NN_vi_surface
-void checkEqual_VkViSurfaceCreateInfoNN(
-    const VkViSurfaceCreateInfoNN* a,
-    const VkViSurfaceCreateInfoNN* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkViSurfaceCreateInfoNN(const VkViSurfaceCreateInfoNN* a,
+                                        const VkViSurfaceCreateInfoNN* b,
+                                        OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((!(a->window) && !(b->window)) || ((a->window) && (b->window)))) { onFail("a->window (Error: Mismatch in optional field)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((!(a->window) && !(b->window)) || ((a->window) && (b->window)))) {
+        onFail("a->window (Error: Mismatch in optional field)");
+    };
 }
 
 #endif
@@ -8258,125 +11334,142 @@
 #ifdef VK_EXT_texture_compression_astc_hdr
 void checkEqual_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(
     const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* a,
-    const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->textureCompressionASTC_HDR) == (b->textureCompressionASTC_HDR))) { onFail("a->textureCompressionASTC_HDR (Error: Value not equal)"); };
+    if (!((a->textureCompressionASTC_HDR) == (b->textureCompressionASTC_HDR))) {
+        onFail("a->textureCompressionASTC_HDR (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_astc_decode_mode
-void checkEqual_VkImageViewASTCDecodeModeEXT(
-    const VkImageViewASTCDecodeModeEXT* a,
-    const VkImageViewASTCDecodeModeEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkImageViewASTCDecodeModeEXT(const VkImageViewASTCDecodeModeEXT* a,
+                                             const VkImageViewASTCDecodeModeEXT* b,
+                                             OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->decodeMode) == (b->decodeMode))) { onFail("a->decodeMode (Error: Value not equal)"); };
+    if (!((a->decodeMode) == (b->decodeMode))) {
+        onFail("a->decodeMode (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceASTCDecodeFeaturesEXT(
-    const VkPhysicalDeviceASTCDecodeFeaturesEXT* a,
-    const VkPhysicalDeviceASTCDecodeFeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceASTCDecodeFeaturesEXT* a, const VkPhysicalDeviceASTCDecodeFeaturesEXT* b,
+    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->decodeModeSharedExponent) == (b->decodeModeSharedExponent))) { onFail("a->decodeModeSharedExponent (Error: Value not equal)"); };
+    if (!((a->decodeModeSharedExponent) == (b->decodeModeSharedExponent))) {
+        onFail("a->decodeModeSharedExponent (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_conditional_rendering
-void checkEqual_VkConditionalRenderingBeginInfoEXT(
-    const VkConditionalRenderingBeginInfoEXT* a,
-    const VkConditionalRenderingBeginInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkConditionalRenderingBeginInfoEXT(const VkConditionalRenderingBeginInfoEXT* a,
+                                                   const VkConditionalRenderingBeginInfoEXT* b,
+                                                   OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->buffer) == (b->buffer))) { onFail("a->buffer (Error: Value not equal)"); };
-    if (!((a->offset) == (b->offset))) { onFail("a->offset (Error: Value not equal)"); };
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
+    if (!((a->buffer) == (b->buffer))) {
+        onFail("a->buffer (Error: Value not equal)");
+    };
+    if (!((a->offset) == (b->offset))) {
+        onFail("a->offset (Error: Value not equal)");
+    };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
     const VkPhysicalDeviceConditionalRenderingFeaturesEXT* a,
-    const VkPhysicalDeviceConditionalRenderingFeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceConditionalRenderingFeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->conditionalRendering) == (b->conditionalRendering))) { onFail("a->conditionalRendering (Error: Value not equal)"); };
-    if (!((a->inheritedConditionalRendering) == (b->inheritedConditionalRendering))) { onFail("a->inheritedConditionalRendering (Error: Value not equal)"); };
+    if (!((a->conditionalRendering) == (b->conditionalRendering))) {
+        onFail("a->conditionalRendering (Error: Value not equal)");
+    };
+    if (!((a->inheritedConditionalRendering) == (b->inheritedConditionalRendering))) {
+        onFail("a->inheritedConditionalRendering (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
     const VkCommandBufferInheritanceConditionalRenderingInfoEXT* a,
-    const VkCommandBufferInheritanceConditionalRenderingInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkCommandBufferInheritanceConditionalRenderingInfoEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->conditionalRenderingEnable) == (b->conditionalRenderingEnable))) { onFail("a->conditionalRenderingEnable (Error: Value not equal)"); };
+    if (!((a->conditionalRenderingEnable) == (b->conditionalRenderingEnable))) {
+        onFail("a->conditionalRenderingEnable (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_NV_clip_space_w_scaling
-void checkEqual_VkViewportWScalingNV(
-    const VkViewportWScalingNV* a,
-    const VkViewportWScalingNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->xcoeff) == (b->xcoeff))) { onFail("a->xcoeff (Error: Value not equal)"); };
-    if (!((a->ycoeff) == (b->ycoeff))) { onFail("a->ycoeff (Error: Value not equal)"); };
+void checkEqual_VkViewportWScalingNV(const VkViewportWScalingNV* a, const VkViewportWScalingNV* b,
+                                     OnFailCompareFunc onFail) {
+    if (!((a->xcoeff) == (b->xcoeff))) {
+        onFail("a->xcoeff (Error: Value not equal)");
+    };
+    if (!((a->ycoeff) == (b->ycoeff))) {
+        onFail("a->ycoeff (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPipelineViewportWScalingStateCreateInfoNV(
     const VkPipelineViewportWScalingStateCreateInfoNV* a,
-    const VkPipelineViewportWScalingStateCreateInfoNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPipelineViewportWScalingStateCreateInfoNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->viewportWScalingEnable) == (b->viewportWScalingEnable))) { onFail("a->viewportWScalingEnable (Error: Value not equal)"); };
-    if (!((a->viewportCount) == (b->viewportCount))) { onFail("a->viewportCount (Error: Value not equal)"); };
-    if (!((!(a->pViewportWScalings) && !(b->pViewportWScalings)) || ((a->pViewportWScalings) && (b->pViewportWScalings)))) { onFail("a->pViewportWScalings (Error: Mismatch in optional field)"); };
-    if (a->pViewportWScalings && b->pViewportWScalings)
-    {
-        if ((a->pViewportWScalings) && (b->pViewportWScalings))
-        {
-            if (!((a->viewportCount) == (b->viewportCount))) { onFail("a->pViewportWScalings (Error: Lengths not equal)"); };
-            if ((a->viewportCount) == (b->viewportCount))
-            {
-                if (a)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)a->viewportCount; ++i)
-                    {
-                        checkEqual_VkViewportWScalingNV(a->pViewportWScalings + i, b->pViewportWScalings + i, onFail);
+    if (!((a->viewportWScalingEnable) == (b->viewportWScalingEnable))) {
+        onFail("a->viewportWScalingEnable (Error: Value not equal)");
+    };
+    if (!((a->viewportCount) == (b->viewportCount))) {
+        onFail("a->viewportCount (Error: Value not equal)");
+    };
+    if (!((!(a->pViewportWScalings) && !(b->pViewportWScalings)) ||
+          ((a->pViewportWScalings) && (b->pViewportWScalings)))) {
+        onFail("a->pViewportWScalings (Error: Mismatch in optional field)");
+    };
+    if (a->pViewportWScalings && b->pViewportWScalings) {
+        if ((a->pViewportWScalings) && (b->pViewportWScalings)) {
+            if (!((a->viewportCount) == (b->viewportCount))) {
+                onFail("a->pViewportWScalings (Error: Lengths not equal)");
+            };
+            if ((a->viewportCount) == (b->viewportCount)) {
+                if (a) {
+                    for (uint32_t i = 0; i < (uint32_t)a->viewportCount; ++i) {
+                        checkEqual_VkViewportWScalingNV(a->pViewportWScalings + i,
+                                                        b->pViewportWScalings + i, onFail);
                     }
                 }
             }
@@ -8390,137 +11483,162 @@
 #ifdef VK_EXT_acquire_xlib_display
 #endif
 #ifdef VK_EXT_display_surface_counter
-void checkEqual_VkSurfaceCapabilities2EXT(
-    const VkSurfaceCapabilities2EXT* a,
-    const VkSurfaceCapabilities2EXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkSurfaceCapabilities2EXT(const VkSurfaceCapabilities2EXT* a,
+                                          const VkSurfaceCapabilities2EXT* b,
+                                          OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->minImageCount) == (b->minImageCount))) { onFail("a->minImageCount (Error: Value not equal)"); };
-    if (!((a->maxImageCount) == (b->maxImageCount))) { onFail("a->maxImageCount (Error: Value not equal)"); };
+    if (!((a->minImageCount) == (b->minImageCount))) {
+        onFail("a->minImageCount (Error: Value not equal)");
+    };
+    if (!((a->maxImageCount) == (b->maxImageCount))) {
+        onFail("a->maxImageCount (Error: Value not equal)");
+    };
     checkEqual_VkExtent2D(&a->currentExtent, &b->currentExtent, onFail);
     checkEqual_VkExtent2D(&a->minImageExtent, &b->minImageExtent, onFail);
     checkEqual_VkExtent2D(&a->maxImageExtent, &b->maxImageExtent, onFail);
-    if (!((a->maxImageArrayLayers) == (b->maxImageArrayLayers))) { onFail("a->maxImageArrayLayers (Error: Value not equal)"); };
-    if (!((a->supportedTransforms) == (b->supportedTransforms))) { onFail("a->supportedTransforms (Error: Value not equal)"); };
-    if (!((a->currentTransform) == (b->currentTransform))) { onFail("a->currentTransform (Error: Value not equal)"); };
-    if (!((a->supportedCompositeAlpha) == (b->supportedCompositeAlpha))) { onFail("a->supportedCompositeAlpha (Error: Value not equal)"); };
-    if (!((a->supportedUsageFlags) == (b->supportedUsageFlags))) { onFail("a->supportedUsageFlags (Error: Value not equal)"); };
-    if (!((a->supportedSurfaceCounters) == (b->supportedSurfaceCounters))) { onFail("a->supportedSurfaceCounters (Error: Value not equal)"); };
+    if (!((a->maxImageArrayLayers) == (b->maxImageArrayLayers))) {
+        onFail("a->maxImageArrayLayers (Error: Value not equal)");
+    };
+    if (!((a->supportedTransforms) == (b->supportedTransforms))) {
+        onFail("a->supportedTransforms (Error: Value not equal)");
+    };
+    if (!((a->currentTransform) == (b->currentTransform))) {
+        onFail("a->currentTransform (Error: Value not equal)");
+    };
+    if (!((a->supportedCompositeAlpha) == (b->supportedCompositeAlpha))) {
+        onFail("a->supportedCompositeAlpha (Error: Value not equal)");
+    };
+    if (!((a->supportedUsageFlags) == (b->supportedUsageFlags))) {
+        onFail("a->supportedUsageFlags (Error: Value not equal)");
+    };
+    if (!((a->supportedSurfaceCounters) == (b->supportedSurfaceCounters))) {
+        onFail("a->supportedSurfaceCounters (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_display_control
-void checkEqual_VkDisplayPowerInfoEXT(
-    const VkDisplayPowerInfoEXT* a,
-    const VkDisplayPowerInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDisplayPowerInfoEXT(const VkDisplayPowerInfoEXT* a,
+                                      const VkDisplayPowerInfoEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->powerState) == (b->powerState))) { onFail("a->powerState (Error: Value not equal)"); };
+    if (!((a->powerState) == (b->powerState))) {
+        onFail("a->powerState (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkDeviceEventInfoEXT(
-    const VkDeviceEventInfoEXT* a,
-    const VkDeviceEventInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDeviceEventInfoEXT(const VkDeviceEventInfoEXT* a, const VkDeviceEventInfoEXT* b,
+                                     OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->deviceEvent) == (b->deviceEvent))) { onFail("a->deviceEvent (Error: Value not equal)"); };
+    if (!((a->deviceEvent) == (b->deviceEvent))) {
+        onFail("a->deviceEvent (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkDisplayEventInfoEXT(
-    const VkDisplayEventInfoEXT* a,
-    const VkDisplayEventInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDisplayEventInfoEXT(const VkDisplayEventInfoEXT* a,
+                                      const VkDisplayEventInfoEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->displayEvent) == (b->displayEvent))) { onFail("a->displayEvent (Error: Value not equal)"); };
+    if (!((a->displayEvent) == (b->displayEvent))) {
+        onFail("a->displayEvent (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkSwapchainCounterCreateInfoEXT(
-    const VkSwapchainCounterCreateInfoEXT* a,
-    const VkSwapchainCounterCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkSwapchainCounterCreateInfoEXT(const VkSwapchainCounterCreateInfoEXT* a,
+                                                const VkSwapchainCounterCreateInfoEXT* b,
+                                                OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->surfaceCounters) == (b->surfaceCounters))) { onFail("a->surfaceCounters (Error: Value not equal)"); };
+    if (!((a->surfaceCounters) == (b->surfaceCounters))) {
+        onFail("a->surfaceCounters (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_GOOGLE_display_timing
-void checkEqual_VkRefreshCycleDurationGOOGLE(
-    const VkRefreshCycleDurationGOOGLE* a,
-    const VkRefreshCycleDurationGOOGLE* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->refreshDuration) == (b->refreshDuration))) { onFail("a->refreshDuration (Error: Value not equal)"); };
+void checkEqual_VkRefreshCycleDurationGOOGLE(const VkRefreshCycleDurationGOOGLE* a,
+                                             const VkRefreshCycleDurationGOOGLE* b,
+                                             OnFailCompareFunc onFail) {
+    if (!((a->refreshDuration) == (b->refreshDuration))) {
+        onFail("a->refreshDuration (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkPastPresentationTimingGOOGLE(
-    const VkPastPresentationTimingGOOGLE* a,
-    const VkPastPresentationTimingGOOGLE* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->presentID) == (b->presentID))) { onFail("a->presentID (Error: Value not equal)"); };
-    if (!((a->desiredPresentTime) == (b->desiredPresentTime))) { onFail("a->desiredPresentTime (Error: Value not equal)"); };
-    if (!((a->actualPresentTime) == (b->actualPresentTime))) { onFail("a->actualPresentTime (Error: Value not equal)"); };
-    if (!((a->earliestPresentTime) == (b->earliestPresentTime))) { onFail("a->earliestPresentTime (Error: Value not equal)"); };
-    if (!((a->presentMargin) == (b->presentMargin))) { onFail("a->presentMargin (Error: Value not equal)"); };
+void checkEqual_VkPastPresentationTimingGOOGLE(const VkPastPresentationTimingGOOGLE* a,
+                                               const VkPastPresentationTimingGOOGLE* b,
+                                               OnFailCompareFunc onFail) {
+    if (!((a->presentID) == (b->presentID))) {
+        onFail("a->presentID (Error: Value not equal)");
+    };
+    if (!((a->desiredPresentTime) == (b->desiredPresentTime))) {
+        onFail("a->desiredPresentTime (Error: Value not equal)");
+    };
+    if (!((a->actualPresentTime) == (b->actualPresentTime))) {
+        onFail("a->actualPresentTime (Error: Value not equal)");
+    };
+    if (!((a->earliestPresentTime) == (b->earliestPresentTime))) {
+        onFail("a->earliestPresentTime (Error: Value not equal)");
+    };
+    if (!((a->presentMargin) == (b->presentMargin))) {
+        onFail("a->presentMargin (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkPresentTimeGOOGLE(
-    const VkPresentTimeGOOGLE* a,
-    const VkPresentTimeGOOGLE* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->presentID) == (b->presentID))) { onFail("a->presentID (Error: Value not equal)"); };
-    if (!((a->desiredPresentTime) == (b->desiredPresentTime))) { onFail("a->desiredPresentTime (Error: Value not equal)"); };
+void checkEqual_VkPresentTimeGOOGLE(const VkPresentTimeGOOGLE* a, const VkPresentTimeGOOGLE* b,
+                                    OnFailCompareFunc onFail) {
+    if (!((a->presentID) == (b->presentID))) {
+        onFail("a->presentID (Error: Value not equal)");
+    };
+    if (!((a->desiredPresentTime) == (b->desiredPresentTime))) {
+        onFail("a->desiredPresentTime (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkPresentTimesInfoGOOGLE(
-    const VkPresentTimesInfoGOOGLE* a,
-    const VkPresentTimesInfoGOOGLE* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPresentTimesInfoGOOGLE(const VkPresentTimesInfoGOOGLE* a,
+                                         const VkPresentTimesInfoGOOGLE* b,
+                                         OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->swapchainCount) == (b->swapchainCount))) { onFail("a->swapchainCount (Error: Value not equal)"); };
-    if (!((!(a->pTimes) && !(b->pTimes)) || ((a->pTimes) && (b->pTimes)))) { onFail("a->pTimes (Error: Mismatch in optional field)"); };
-    if (a->pTimes && b->pTimes)
-    {
-        if ((a->pTimes) && (b->pTimes))
-        {
-            if (!((a->swapchainCount) == (b->swapchainCount))) { onFail("a->pTimes (Error: Lengths not equal)"); };
-            if ((a->swapchainCount) == (b->swapchainCount))
-            {
-                if (a)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)a->swapchainCount; ++i)
-                    {
+    if (!((a->swapchainCount) == (b->swapchainCount))) {
+        onFail("a->swapchainCount (Error: Value not equal)");
+    };
+    if (!((!(a->pTimes) && !(b->pTimes)) || ((a->pTimes) && (b->pTimes)))) {
+        onFail("a->pTimes (Error: Mismatch in optional field)");
+    };
+    if (a->pTimes && b->pTimes) {
+        if ((a->pTimes) && (b->pTimes)) {
+            if (!((a->swapchainCount) == (b->swapchainCount))) {
+                onFail("a->pTimes (Error: Lengths not equal)");
+            };
+            if ((a->swapchainCount) == (b->swapchainCount)) {
+                if (a) {
+                    for (uint32_t i = 0; i < (uint32_t)a->swapchainCount; ++i) {
                         checkEqual_VkPresentTimeGOOGLE(a->pTimes + i, b->pTimes + i, onFail);
                     }
                 }
@@ -8539,55 +11657,65 @@
 #ifdef VK_NVX_multiview_per_view_attributes
 void checkEqual_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
     const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* a,
-    const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->perViewPositionAllComponents) == (b->perViewPositionAllComponents))) { onFail("a->perViewPositionAllComponents (Error: Value not equal)"); };
+    if (!((a->perViewPositionAllComponents) == (b->perViewPositionAllComponents))) {
+        onFail("a->perViewPositionAllComponents (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_NV_viewport_swizzle
-void checkEqual_VkViewportSwizzleNV(
-    const VkViewportSwizzleNV* a,
-    const VkViewportSwizzleNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->x) == (b->x))) { onFail("a->x (Error: Value not equal)"); };
-    if (!((a->y) == (b->y))) { onFail("a->y (Error: Value not equal)"); };
-    if (!((a->z) == (b->z))) { onFail("a->z (Error: Value not equal)"); };
-    if (!((a->w) == (b->w))) { onFail("a->w (Error: Value not equal)"); };
+void checkEqual_VkViewportSwizzleNV(const VkViewportSwizzleNV* a, const VkViewportSwizzleNV* b,
+                                    OnFailCompareFunc onFail) {
+    if (!((a->x) == (b->x))) {
+        onFail("a->x (Error: Value not equal)");
+    };
+    if (!((a->y) == (b->y))) {
+        onFail("a->y (Error: Value not equal)");
+    };
+    if (!((a->z) == (b->z))) {
+        onFail("a->z (Error: Value not equal)");
+    };
+    if (!((a->w) == (b->w))) {
+        onFail("a->w (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPipelineViewportSwizzleStateCreateInfoNV(
     const VkPipelineViewportSwizzleStateCreateInfoNV* a,
-    const VkPipelineViewportSwizzleStateCreateInfoNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPipelineViewportSwizzleStateCreateInfoNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->viewportCount) == (b->viewportCount))) { onFail("a->viewportCount (Error: Value not equal)"); };
-    if (!((!(a->pViewportSwizzles) && !(b->pViewportSwizzles)) || ((a->pViewportSwizzles) && (b->pViewportSwizzles)))) { onFail("a->pViewportSwizzles (Error: Mismatch in optional field)"); };
-    if (a->pViewportSwizzles && b->pViewportSwizzles)
-    {
-        if ((a->pViewportSwizzles) && (b->pViewportSwizzles))
-        {
-            if (!((a->viewportCount) == (b->viewportCount))) { onFail("a->pViewportSwizzles (Error: Lengths not equal)"); };
-            if ((a->viewportCount) == (b->viewportCount))
-            {
-                if (a)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)a->viewportCount; ++i)
-                    {
-                        checkEqual_VkViewportSwizzleNV(a->pViewportSwizzles + i, b->pViewportSwizzles + i, onFail);
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->viewportCount) == (b->viewportCount))) {
+        onFail("a->viewportCount (Error: Value not equal)");
+    };
+    if (!((!(a->pViewportSwizzles) && !(b->pViewportSwizzles)) ||
+          ((a->pViewportSwizzles) && (b->pViewportSwizzles)))) {
+        onFail("a->pViewportSwizzles (Error: Mismatch in optional field)");
+    };
+    if (a->pViewportSwizzles && b->pViewportSwizzles) {
+        if ((a->pViewportSwizzles) && (b->pViewportSwizzles)) {
+            if (!((a->viewportCount) == (b->viewportCount))) {
+                onFail("a->pViewportSwizzles (Error: Lengths not equal)");
+            };
+            if ((a->viewportCount) == (b->viewportCount)) {
+                if (a) {
+                    for (uint32_t i = 0; i < (uint32_t)a->viewportCount; ++i) {
+                        checkEqual_VkViewportSwizzleNV(a->pViewportSwizzles + i,
+                                                       b->pViewportSwizzles + i, onFail);
                     }
                 }
             }
@@ -8599,43 +11727,50 @@
 #ifdef VK_EXT_discard_rectangles
 void checkEqual_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
     const VkPhysicalDeviceDiscardRectanglePropertiesEXT* a,
-    const VkPhysicalDeviceDiscardRectanglePropertiesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceDiscardRectanglePropertiesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->maxDiscardRectangles) == (b->maxDiscardRectangles))) { onFail("a->maxDiscardRectangles (Error: Value not equal)"); };
+    if (!((a->maxDiscardRectangles) == (b->maxDiscardRectangles))) {
+        onFail("a->maxDiscardRectangles (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPipelineDiscardRectangleStateCreateInfoEXT(
     const VkPipelineDiscardRectangleStateCreateInfoEXT* a,
-    const VkPipelineDiscardRectangleStateCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPipelineDiscardRectangleStateCreateInfoEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->discardRectangleMode) == (b->discardRectangleMode))) { onFail("a->discardRectangleMode (Error: Value not equal)"); };
-    if (!((a->discardRectangleCount) == (b->discardRectangleCount))) { onFail("a->discardRectangleCount (Error: Value not equal)"); };
-    if (!((!(a->pDiscardRectangles) && !(b->pDiscardRectangles)) || ((a->pDiscardRectangles) && (b->pDiscardRectangles)))) { onFail("a->pDiscardRectangles (Error: Mismatch in optional field)"); };
-    if (a->pDiscardRectangles && b->pDiscardRectangles)
-    {
-        if ((a->pDiscardRectangles) && (b->pDiscardRectangles))
-        {
-            if (!((a->discardRectangleCount) == (b->discardRectangleCount))) { onFail("a->pDiscardRectangles (Error: Lengths not equal)"); };
-            if ((a->discardRectangleCount) == (b->discardRectangleCount))
-            {
-                if (a)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)a->discardRectangleCount; ++i)
-                    {
-                        checkEqual_VkRect2D(a->pDiscardRectangles + i, b->pDiscardRectangles + i, onFail);
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->discardRectangleMode) == (b->discardRectangleMode))) {
+        onFail("a->discardRectangleMode (Error: Value not equal)");
+    };
+    if (!((a->discardRectangleCount) == (b->discardRectangleCount))) {
+        onFail("a->discardRectangleCount (Error: Value not equal)");
+    };
+    if (!((!(a->pDiscardRectangles) && !(b->pDiscardRectangles)) ||
+          ((a->pDiscardRectangles) && (b->pDiscardRectangles)))) {
+        onFail("a->pDiscardRectangles (Error: Mismatch in optional field)");
+    };
+    if (a->pDiscardRectangles && b->pDiscardRectangles) {
+        if ((a->pDiscardRectangles) && (b->pDiscardRectangles)) {
+            if (!((a->discardRectangleCount) == (b->discardRectangleCount))) {
+                onFail("a->pDiscardRectangles (Error: Lengths not equal)");
+            };
+            if ((a->discardRectangleCount) == (b->discardRectangleCount)) {
+                if (a) {
+                    for (uint32_t i = 0; i < (uint32_t)a->discardRectangleCount; ++i) {
+                        checkEqual_VkRect2D(a->pDiscardRectangles + i, b->pDiscardRectangles + i,
+                                            onFail);
                     }
                 }
             }
@@ -8647,132 +11782,175 @@
 #ifdef VK_EXT_conservative_rasterization
 void checkEqual_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
     const VkPhysicalDeviceConservativeRasterizationPropertiesEXT* a,
-    const VkPhysicalDeviceConservativeRasterizationPropertiesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceConservativeRasterizationPropertiesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->primitiveOverestimationSize) == (b->primitiveOverestimationSize))) { onFail("a->primitiveOverestimationSize (Error: Value not equal)"); };
-    if (!((a->maxExtraPrimitiveOverestimationSize) == (b->maxExtraPrimitiveOverestimationSize))) { onFail("a->maxExtraPrimitiveOverestimationSize (Error: Value not equal)"); };
-    if (!((a->extraPrimitiveOverestimationSizeGranularity) == (b->extraPrimitiveOverestimationSizeGranularity))) { onFail("a->extraPrimitiveOverestimationSizeGranularity (Error: Value not equal)"); };
-    if (!((a->primitiveUnderestimation) == (b->primitiveUnderestimation))) { onFail("a->primitiveUnderestimation (Error: Value not equal)"); };
-    if (!((a->conservativePointAndLineRasterization) == (b->conservativePointAndLineRasterization))) { onFail("a->conservativePointAndLineRasterization (Error: Value not equal)"); };
-    if (!((a->degenerateTrianglesRasterized) == (b->degenerateTrianglesRasterized))) { onFail("a->degenerateTrianglesRasterized (Error: Value not equal)"); };
-    if (!((a->degenerateLinesRasterized) == (b->degenerateLinesRasterized))) { onFail("a->degenerateLinesRasterized (Error: Value not equal)"); };
-    if (!((a->fullyCoveredFragmentShaderInputVariable) == (b->fullyCoveredFragmentShaderInputVariable))) { onFail("a->fullyCoveredFragmentShaderInputVariable (Error: Value not equal)"); };
-    if (!((a->conservativeRasterizationPostDepthCoverage) == (b->conservativeRasterizationPostDepthCoverage))) { onFail("a->conservativeRasterizationPostDepthCoverage (Error: Value not equal)"); };
+    if (!((a->primitiveOverestimationSize) == (b->primitiveOverestimationSize))) {
+        onFail("a->primitiveOverestimationSize (Error: Value not equal)");
+    };
+    if (!((a->maxExtraPrimitiveOverestimationSize) == (b->maxExtraPrimitiveOverestimationSize))) {
+        onFail("a->maxExtraPrimitiveOverestimationSize (Error: Value not equal)");
+    };
+    if (!((a->extraPrimitiveOverestimationSizeGranularity) ==
+          (b->extraPrimitiveOverestimationSizeGranularity))) {
+        onFail("a->extraPrimitiveOverestimationSizeGranularity (Error: Value not equal)");
+    };
+    if (!((a->primitiveUnderestimation) == (b->primitiveUnderestimation))) {
+        onFail("a->primitiveUnderestimation (Error: Value not equal)");
+    };
+    if (!((a->conservativePointAndLineRasterization) ==
+          (b->conservativePointAndLineRasterization))) {
+        onFail("a->conservativePointAndLineRasterization (Error: Value not equal)");
+    };
+    if (!((a->degenerateTrianglesRasterized) == (b->degenerateTrianglesRasterized))) {
+        onFail("a->degenerateTrianglesRasterized (Error: Value not equal)");
+    };
+    if (!((a->degenerateLinesRasterized) == (b->degenerateLinesRasterized))) {
+        onFail("a->degenerateLinesRasterized (Error: Value not equal)");
+    };
+    if (!((a->fullyCoveredFragmentShaderInputVariable) ==
+          (b->fullyCoveredFragmentShaderInputVariable))) {
+        onFail("a->fullyCoveredFragmentShaderInputVariable (Error: Value not equal)");
+    };
+    if (!((a->conservativeRasterizationPostDepthCoverage) ==
+          (b->conservativeRasterizationPostDepthCoverage))) {
+        onFail("a->conservativeRasterizationPostDepthCoverage (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPipelineRasterizationConservativeStateCreateInfoEXT(
     const VkPipelineRasterizationConservativeStateCreateInfoEXT* a,
-    const VkPipelineRasterizationConservativeStateCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPipelineRasterizationConservativeStateCreateInfoEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->conservativeRasterizationMode) == (b->conservativeRasterizationMode))) { onFail("a->conservativeRasterizationMode (Error: Value not equal)"); };
-    if (!((a->extraPrimitiveOverestimationSize) == (b->extraPrimitiveOverestimationSize))) { onFail("a->extraPrimitiveOverestimationSize (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->conservativeRasterizationMode) == (b->conservativeRasterizationMode))) {
+        onFail("a->conservativeRasterizationMode (Error: Value not equal)");
+    };
+    if (!((a->extraPrimitiveOverestimationSize) == (b->extraPrimitiveOverestimationSize))) {
+        onFail("a->extraPrimitiveOverestimationSize (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_depth_clip_enable
 void checkEqual_VkPhysicalDeviceDepthClipEnableFeaturesEXT(
     const VkPhysicalDeviceDepthClipEnableFeaturesEXT* a,
-    const VkPhysicalDeviceDepthClipEnableFeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceDepthClipEnableFeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->depthClipEnable) == (b->depthClipEnable))) { onFail("a->depthClipEnable (Error: Value not equal)"); };
+    if (!((a->depthClipEnable) == (b->depthClipEnable))) {
+        onFail("a->depthClipEnable (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPipelineRasterizationDepthClipStateCreateInfoEXT(
     const VkPipelineRasterizationDepthClipStateCreateInfoEXT* a,
-    const VkPipelineRasterizationDepthClipStateCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPipelineRasterizationDepthClipStateCreateInfoEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->depthClipEnable) == (b->depthClipEnable))) { onFail("a->depthClipEnable (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->depthClipEnable) == (b->depthClipEnable))) {
+        onFail("a->depthClipEnable (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_swapchain_colorspace
 #endif
 #ifdef VK_EXT_hdr_metadata
-void checkEqual_VkXYColorEXT(
-    const VkXYColorEXT* a,
-    const VkXYColorEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->x) == (b->x))) { onFail("a->x (Error: Value not equal)"); };
-    if (!((a->y) == (b->y))) { onFail("a->y (Error: Value not equal)"); };
+void checkEqual_VkXYColorEXT(const VkXYColorEXT* a, const VkXYColorEXT* b,
+                             OnFailCompareFunc onFail) {
+    if (!((a->x) == (b->x))) {
+        onFail("a->x (Error: Value not equal)");
+    };
+    if (!((a->y) == (b->y))) {
+        onFail("a->y (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkHdrMetadataEXT(
-    const VkHdrMetadataEXT* a,
-    const VkHdrMetadataEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkHdrMetadataEXT(const VkHdrMetadataEXT* a, const VkHdrMetadataEXT* b,
+                                 OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
     checkEqual_VkXYColorEXT(&a->displayPrimaryRed, &b->displayPrimaryRed, onFail);
     checkEqual_VkXYColorEXT(&a->displayPrimaryGreen, &b->displayPrimaryGreen, onFail);
     checkEqual_VkXYColorEXT(&a->displayPrimaryBlue, &b->displayPrimaryBlue, onFail);
     checkEqual_VkXYColorEXT(&a->whitePoint, &b->whitePoint, onFail);
-    if (!((a->maxLuminance) == (b->maxLuminance))) { onFail("a->maxLuminance (Error: Value not equal)"); };
-    if (!((a->minLuminance) == (b->minLuminance))) { onFail("a->minLuminance (Error: Value not equal)"); };
-    if (!((a->maxContentLightLevel) == (b->maxContentLightLevel))) { onFail("a->maxContentLightLevel (Error: Value not equal)"); };
-    if (!((a->maxFrameAverageLightLevel) == (b->maxFrameAverageLightLevel))) { onFail("a->maxFrameAverageLightLevel (Error: Value not equal)"); };
+    if (!((a->maxLuminance) == (b->maxLuminance))) {
+        onFail("a->maxLuminance (Error: Value not equal)");
+    };
+    if (!((a->minLuminance) == (b->minLuminance))) {
+        onFail("a->minLuminance (Error: Value not equal)");
+    };
+    if (!((a->maxContentLightLevel) == (b->maxContentLightLevel))) {
+        onFail("a->maxContentLightLevel (Error: Value not equal)");
+    };
+    if (!((a->maxFrameAverageLightLevel) == (b->maxFrameAverageLightLevel))) {
+        onFail("a->maxFrameAverageLightLevel (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_MVK_ios_surface
-void checkEqual_VkIOSSurfaceCreateInfoMVK(
-    const VkIOSSurfaceCreateInfoMVK* a,
-    const VkIOSSurfaceCreateInfoMVK* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkIOSSurfaceCreateInfoMVK(const VkIOSSurfaceCreateInfoMVK* a,
+                                          const VkIOSSurfaceCreateInfoMVK* b,
+                                          OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((!(a->pView) && !(b->pView)) || ((a->pView) && (b->pView)))) { onFail("a->pView (Error: Mismatch in optional field)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((!(a->pView) && !(b->pView)) || ((a->pView) && (b->pView)))) {
+        onFail("a->pView (Error: Mismatch in optional field)");
+    };
 }
 
 #endif
 #ifdef VK_MVK_macos_surface
-void checkEqual_VkMacOSSurfaceCreateInfoMVK(
-    const VkMacOSSurfaceCreateInfoMVK* a,
-    const VkMacOSSurfaceCreateInfoMVK* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkMacOSSurfaceCreateInfoMVK(const VkMacOSSurfaceCreateInfoMVK* a,
+                                            const VkMacOSSurfaceCreateInfoMVK* b,
+                                            OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((!(a->pView) && !(b->pView)) || ((a->pView) && (b->pView)))) { onFail("a->pView (Error: Mismatch in optional field)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((!(a->pView) && !(b->pView)) || ((a->pView) && (b->pView)))) {
+        onFail("a->pView (Error: Mismatch in optional field)");
+    };
 }
 
 #endif
@@ -8783,125 +11961,154 @@
 #ifdef VK_EXT_queue_family_foreign
 #endif
 #ifdef VK_EXT_debug_utils
-void checkEqual_VkDebugUtilsLabelEXT(
-    const VkDebugUtilsLabelEXT* a,
-    const VkDebugUtilsLabelEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDebugUtilsLabelEXT(const VkDebugUtilsLabelEXT* a, const VkDebugUtilsLabelEXT* b,
+                                     OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((!(a->pLabelName) && !(b->pLabelName)) || ((a->pLabelName) && (b->pLabelName)))) { onFail("a->pLabelName (Error: Mismatch in string pointer nullness)"); };
-    if ((a->pLabelName) && (b->pLabelName))
-    {
-        if (!((strcmp(a->pLabelName, b->pLabelName) == 0))) { onFail("a->pLabelName (Error: Unequal strings)"); };
+    if (!((!(a->pLabelName) && !(b->pLabelName)) || ((a->pLabelName) && (b->pLabelName)))) {
+        onFail("a->pLabelName (Error: Mismatch in string pointer nullness)");
+    };
+    if ((a->pLabelName) && (b->pLabelName)) {
+        if (!((strcmp(a->pLabelName, b->pLabelName) == 0))) {
+            onFail("a->pLabelName (Error: Unequal strings)");
+        };
     }
-    if (!((memcmp(a->color, b->color, 4 * sizeof(float)) == 0))) { onFail("a->color (Error: Unequal static array)"); };
+    if (!((memcmp(a->color, b->color, 4 * sizeof(float)) == 0))) {
+        onFail("a->color (Error: Unequal static array)");
+    };
 }
 
-void checkEqual_VkDebugUtilsObjectNameInfoEXT(
-    const VkDebugUtilsObjectNameInfoEXT* a,
-    const VkDebugUtilsObjectNameInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDebugUtilsObjectNameInfoEXT(const VkDebugUtilsObjectNameInfoEXT* a,
+                                              const VkDebugUtilsObjectNameInfoEXT* b,
+                                              OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->objectType) == (b->objectType))) { onFail("a->objectType (Error: Value not equal)"); };
-    if (!((a->objectHandle) == (b->objectHandle))) { onFail("a->objectHandle (Error: Value not equal)"); };
-    if (!((!(a->pObjectName) && !(b->pObjectName)) || ((a->pObjectName) && (b->pObjectName)))) { onFail("a->pObjectName (Error: Mismatch in optional field)"); };
-    if (a->pObjectName && b->pObjectName)
-    {
-        if (!((!(a->pObjectName) && !(b->pObjectName)) || ((a->pObjectName) && (b->pObjectName)))) { onFail("a->pObjectName (Error: Mismatch in string pointer nullness)"); };
-        if ((a->pObjectName) && (b->pObjectName))
-        {
-            if (!((strcmp(a->pObjectName, b->pObjectName) == 0))) { onFail("a->pObjectName (Error: Unequal strings)"); };
+    if (!((a->objectType) == (b->objectType))) {
+        onFail("a->objectType (Error: Value not equal)");
+    };
+    if (!((a->objectHandle) == (b->objectHandle))) {
+        onFail("a->objectHandle (Error: Value not equal)");
+    };
+    if (!((!(a->pObjectName) && !(b->pObjectName)) || ((a->pObjectName) && (b->pObjectName)))) {
+        onFail("a->pObjectName (Error: Mismatch in optional field)");
+    };
+    if (a->pObjectName && b->pObjectName) {
+        if (!((!(a->pObjectName) && !(b->pObjectName)) || ((a->pObjectName) && (b->pObjectName)))) {
+            onFail("a->pObjectName (Error: Mismatch in string pointer nullness)");
+        };
+        if ((a->pObjectName) && (b->pObjectName)) {
+            if (!((strcmp(a->pObjectName, b->pObjectName) == 0))) {
+                onFail("a->pObjectName (Error: Unequal strings)");
+            };
         }
     }
 }
 
-void checkEqual_VkDebugUtilsMessengerCallbackDataEXT(
-    const VkDebugUtilsMessengerCallbackDataEXT* a,
-    const VkDebugUtilsMessengerCallbackDataEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDebugUtilsMessengerCallbackDataEXT(const VkDebugUtilsMessengerCallbackDataEXT* a,
+                                                     const VkDebugUtilsMessengerCallbackDataEXT* b,
+                                                     OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((!(a->pMessageIdName) && !(b->pMessageIdName)) || ((a->pMessageIdName) && (b->pMessageIdName)))) { onFail("a->pMessageIdName (Error: Mismatch in optional field)"); };
-    if (a->pMessageIdName && b->pMessageIdName)
-    {
-        if (!((!(a->pMessageIdName) && !(b->pMessageIdName)) || ((a->pMessageIdName) && (b->pMessageIdName)))) { onFail("a->pMessageIdName (Error: Mismatch in string pointer nullness)"); };
-        if ((a->pMessageIdName) && (b->pMessageIdName))
-        {
-            if (!((strcmp(a->pMessageIdName, b->pMessageIdName) == 0))) { onFail("a->pMessageIdName (Error: Unequal strings)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((!(a->pMessageIdName) && !(b->pMessageIdName)) ||
+          ((a->pMessageIdName) && (b->pMessageIdName)))) {
+        onFail("a->pMessageIdName (Error: Mismatch in optional field)");
+    };
+    if (a->pMessageIdName && b->pMessageIdName) {
+        if (!((!(a->pMessageIdName) && !(b->pMessageIdName)) ||
+              ((a->pMessageIdName) && (b->pMessageIdName)))) {
+            onFail("a->pMessageIdName (Error: Mismatch in string pointer nullness)");
+        };
+        if ((a->pMessageIdName) && (b->pMessageIdName)) {
+            if (!((strcmp(a->pMessageIdName, b->pMessageIdName) == 0))) {
+                onFail("a->pMessageIdName (Error: Unequal strings)");
+            };
         }
     }
-    if (!((a->messageIdNumber) == (b->messageIdNumber))) { onFail("a->messageIdNumber (Error: Value not equal)"); };
-    if (!((!(a->pMessage) && !(b->pMessage)) || ((a->pMessage) && (b->pMessage)))) { onFail("a->pMessage (Error: Mismatch in string pointer nullness)"); };
-    if ((a->pMessage) && (b->pMessage))
-    {
-        if (!((strcmp(a->pMessage, b->pMessage) == 0))) { onFail("a->pMessage (Error: Unequal strings)"); };
+    if (!((a->messageIdNumber) == (b->messageIdNumber))) {
+        onFail("a->messageIdNumber (Error: Value not equal)");
+    };
+    if (!((!(a->pMessage) && !(b->pMessage)) || ((a->pMessage) && (b->pMessage)))) {
+        onFail("a->pMessage (Error: Mismatch in string pointer nullness)");
+    };
+    if ((a->pMessage) && (b->pMessage)) {
+        if (!((strcmp(a->pMessage, b->pMessage) == 0))) {
+            onFail("a->pMessage (Error: Unequal strings)");
+        };
     }
-    if (!((a->queueLabelCount) == (b->queueLabelCount))) { onFail("a->queueLabelCount (Error: Value not equal)"); };
-    if (!((!(a->pQueueLabels) && !(b->pQueueLabels)) || ((a->pQueueLabels) && (b->pQueueLabels)))) { onFail("a->pQueueLabels (Error: Mismatch in optional field)"); };
-    if (a->pQueueLabels && b->pQueueLabels)
-    {
-        if ((a->pQueueLabels) && (b->pQueueLabels))
-        {
-            if (!((a->queueLabelCount) == (b->queueLabelCount))) { onFail("a->pQueueLabels (Error: Lengths not equal)"); };
-            if ((a->queueLabelCount) == (b->queueLabelCount))
-            {
-                if (a)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)a->queueLabelCount; ++i)
-                    {
-                        checkEqual_VkDebugUtilsLabelEXT(a->pQueueLabels + i, b->pQueueLabels + i, onFail);
+    if (!((a->queueLabelCount) == (b->queueLabelCount))) {
+        onFail("a->queueLabelCount (Error: Value not equal)");
+    };
+    if (!((!(a->pQueueLabels) && !(b->pQueueLabels)) || ((a->pQueueLabels) && (b->pQueueLabels)))) {
+        onFail("a->pQueueLabels (Error: Mismatch in optional field)");
+    };
+    if (a->pQueueLabels && b->pQueueLabels) {
+        if ((a->pQueueLabels) && (b->pQueueLabels)) {
+            if (!((a->queueLabelCount) == (b->queueLabelCount))) {
+                onFail("a->pQueueLabels (Error: Lengths not equal)");
+            };
+            if ((a->queueLabelCount) == (b->queueLabelCount)) {
+                if (a) {
+                    for (uint32_t i = 0; i < (uint32_t)a->queueLabelCount; ++i) {
+                        checkEqual_VkDebugUtilsLabelEXT(a->pQueueLabels + i, b->pQueueLabels + i,
+                                                        onFail);
                     }
                 }
             }
         }
     }
-    if (!((a->cmdBufLabelCount) == (b->cmdBufLabelCount))) { onFail("a->cmdBufLabelCount (Error: Value not equal)"); };
-    if (!((!(a->pCmdBufLabels) && !(b->pCmdBufLabels)) || ((a->pCmdBufLabels) && (b->pCmdBufLabels)))) { onFail("a->pCmdBufLabels (Error: Mismatch in optional field)"); };
-    if (a->pCmdBufLabels && b->pCmdBufLabels)
-    {
-        if ((a->pCmdBufLabels) && (b->pCmdBufLabels))
-        {
-            if (!((a->cmdBufLabelCount) == (b->cmdBufLabelCount))) { onFail("a->pCmdBufLabels (Error: Lengths not equal)"); };
-            if ((a->cmdBufLabelCount) == (b->cmdBufLabelCount))
-            {
-                if (a)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)a->cmdBufLabelCount; ++i)
-                    {
-                        checkEqual_VkDebugUtilsLabelEXT(a->pCmdBufLabels + i, b->pCmdBufLabels + i, onFail);
+    if (!((a->cmdBufLabelCount) == (b->cmdBufLabelCount))) {
+        onFail("a->cmdBufLabelCount (Error: Value not equal)");
+    };
+    if (!((!(a->pCmdBufLabels) && !(b->pCmdBufLabels)) ||
+          ((a->pCmdBufLabels) && (b->pCmdBufLabels)))) {
+        onFail("a->pCmdBufLabels (Error: Mismatch in optional field)");
+    };
+    if (a->pCmdBufLabels && b->pCmdBufLabels) {
+        if ((a->pCmdBufLabels) && (b->pCmdBufLabels)) {
+            if (!((a->cmdBufLabelCount) == (b->cmdBufLabelCount))) {
+                onFail("a->pCmdBufLabels (Error: Lengths not equal)");
+            };
+            if ((a->cmdBufLabelCount) == (b->cmdBufLabelCount)) {
+                if (a) {
+                    for (uint32_t i = 0; i < (uint32_t)a->cmdBufLabelCount; ++i) {
+                        checkEqual_VkDebugUtilsLabelEXT(a->pCmdBufLabels + i, b->pCmdBufLabels + i,
+                                                        onFail);
                     }
                 }
             }
         }
     }
-    if (!((a->objectCount) == (b->objectCount))) { onFail("a->objectCount (Error: Value not equal)"); };
-    if (!((!(a->pObjects) && !(b->pObjects)) || ((a->pObjects) && (b->pObjects)))) { onFail("a->pObjects (Error: Mismatch in optional field)"); };
-    if (a->pObjects && b->pObjects)
-    {
-        if ((a->pObjects) && (b->pObjects))
-        {
-            if (!((a->objectCount) == (b->objectCount))) { onFail("a->pObjects (Error: Lengths not equal)"); };
-            if ((a->objectCount) == (b->objectCount))
-            {
-                if (a)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)a->objectCount; ++i)
-                    {
-                        checkEqual_VkDebugUtilsObjectNameInfoEXT(a->pObjects + i, b->pObjects + i, onFail);
+    if (!((a->objectCount) == (b->objectCount))) {
+        onFail("a->objectCount (Error: Value not equal)");
+    };
+    if (!((!(a->pObjects) && !(b->pObjects)) || ((a->pObjects) && (b->pObjects)))) {
+        onFail("a->pObjects (Error: Mismatch in optional field)");
+    };
+    if (a->pObjects && b->pObjects) {
+        if ((a->pObjects) && (b->pObjects)) {
+            if (!((a->objectCount) == (b->objectCount))) {
+                onFail("a->pObjects (Error: Lengths not equal)");
+            };
+            if ((a->objectCount) == (b->objectCount)) {
+                if (a) {
+                    for (uint32_t i = 0; i < (uint32_t)a->objectCount; ++i) {
+                        checkEqual_VkDebugUtilsObjectNameInfoEXT(a->pObjects + i, b->pObjects + i,
+                                                                 onFail);
                     }
                 }
             }
@@ -8909,145 +12116,196 @@
     }
 }
 
-void checkEqual_VkDebugUtilsMessengerCreateInfoEXT(
-    const VkDebugUtilsMessengerCreateInfoEXT* a,
-    const VkDebugUtilsMessengerCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDebugUtilsMessengerCreateInfoEXT(const VkDebugUtilsMessengerCreateInfoEXT* a,
+                                                   const VkDebugUtilsMessengerCreateInfoEXT* b,
+                                                   OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->messageSeverity) == (b->messageSeverity))) { onFail("a->messageSeverity (Error: Value not equal)"); };
-    if (!((a->messageType) == (b->messageType))) { onFail("a->messageType (Error: Value not equal)"); };
-    if (!((a->pfnUserCallback) == (b->pfnUserCallback))) { onFail("a->pfnUserCallback (Error: Value not equal)"); };
-    if (!((!(a->pUserData) && !(b->pUserData)) || ((a->pUserData) && (b->pUserData)))) { onFail("a->pUserData (Error: Mismatch in optional field)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->messageSeverity) == (b->messageSeverity))) {
+        onFail("a->messageSeverity (Error: Value not equal)");
+    };
+    if (!((a->messageType) == (b->messageType))) {
+        onFail("a->messageType (Error: Value not equal)");
+    };
+    if (!((a->pfnUserCallback) == (b->pfnUserCallback))) {
+        onFail("a->pfnUserCallback (Error: Value not equal)");
+    };
+    if (!((!(a->pUserData) && !(b->pUserData)) || ((a->pUserData) && (b->pUserData)))) {
+        onFail("a->pUserData (Error: Mismatch in optional field)");
+    };
 }
 
-void checkEqual_VkDebugUtilsObjectTagInfoEXT(
-    const VkDebugUtilsObjectTagInfoEXT* a,
-    const VkDebugUtilsObjectTagInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDebugUtilsObjectTagInfoEXT(const VkDebugUtilsObjectTagInfoEXT* a,
+                                             const VkDebugUtilsObjectTagInfoEXT* b,
+                                             OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->objectType) == (b->objectType))) { onFail("a->objectType (Error: Value not equal)"); };
-    if (!((a->objectHandle) == (b->objectHandle))) { onFail("a->objectHandle (Error: Value not equal)"); };
-    if (!((a->tagName) == (b->tagName))) { onFail("a->tagName (Error: Value not equal)"); };
-    if (!((a->tagSize) == (b->tagSize))) { onFail("a->tagSize (Error: Value not equal)"); };
+    if (!((a->objectType) == (b->objectType))) {
+        onFail("a->objectType (Error: Value not equal)");
+    };
+    if (!((a->objectHandle) == (b->objectHandle))) {
+        onFail("a->objectHandle (Error: Value not equal)");
+    };
+    if (!((a->tagName) == (b->tagName))) {
+        onFail("a->tagName (Error: Value not equal)");
+    };
+    if (!((a->tagSize) == (b->tagSize))) {
+        onFail("a->tagSize (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
-void checkEqual_VkAndroidHardwareBufferUsageANDROID(
-    const VkAndroidHardwareBufferUsageANDROID* a,
-    const VkAndroidHardwareBufferUsageANDROID* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkAndroidHardwareBufferUsageANDROID(const VkAndroidHardwareBufferUsageANDROID* a,
+                                                    const VkAndroidHardwareBufferUsageANDROID* b,
+                                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->androidHardwareBufferUsage) == (b->androidHardwareBufferUsage))) { onFail("a->androidHardwareBufferUsage (Error: Value not equal)"); };
+    if (!((a->androidHardwareBufferUsage) == (b->androidHardwareBufferUsage))) {
+        onFail("a->androidHardwareBufferUsage (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkAndroidHardwareBufferPropertiesANDROID(
     const VkAndroidHardwareBufferPropertiesANDROID* a,
-    const VkAndroidHardwareBufferPropertiesANDROID* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkAndroidHardwareBufferPropertiesANDROID* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->allocationSize) == (b->allocationSize))) { onFail("a->allocationSize (Error: Value not equal)"); };
-    if (!((a->memoryTypeBits) == (b->memoryTypeBits))) { onFail("a->memoryTypeBits (Error: Value not equal)"); };
+    if (!((a->allocationSize) == (b->allocationSize))) {
+        onFail("a->allocationSize (Error: Value not equal)");
+    };
+    if (!((a->memoryTypeBits) == (b->memoryTypeBits))) {
+        onFail("a->memoryTypeBits (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkAndroidHardwareBufferFormatPropertiesANDROID(
     const VkAndroidHardwareBufferFormatPropertiesANDROID* a,
-    const VkAndroidHardwareBufferFormatPropertiesANDROID* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkAndroidHardwareBufferFormatPropertiesANDROID* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->format) == (b->format))) { onFail("a->format (Error: Value not equal)"); };
-    if (!((a->externalFormat) == (b->externalFormat))) { onFail("a->externalFormat (Error: Value not equal)"); };
-    if (!((a->formatFeatures) == (b->formatFeatures))) { onFail("a->formatFeatures (Error: Value not equal)"); };
-    checkEqual_VkComponentMapping(&a->samplerYcbcrConversionComponents, &b->samplerYcbcrConversionComponents, onFail);
-    if (!((a->suggestedYcbcrModel) == (b->suggestedYcbcrModel))) { onFail("a->suggestedYcbcrModel (Error: Value not equal)"); };
-    if (!((a->suggestedYcbcrRange) == (b->suggestedYcbcrRange))) { onFail("a->suggestedYcbcrRange (Error: Value not equal)"); };
-    if (!((a->suggestedXChromaOffset) == (b->suggestedXChromaOffset))) { onFail("a->suggestedXChromaOffset (Error: Value not equal)"); };
-    if (!((a->suggestedYChromaOffset) == (b->suggestedYChromaOffset))) { onFail("a->suggestedYChromaOffset (Error: Value not equal)"); };
+    if (!((a->format) == (b->format))) {
+        onFail("a->format (Error: Value not equal)");
+    };
+    if (!((a->externalFormat) == (b->externalFormat))) {
+        onFail("a->externalFormat (Error: Value not equal)");
+    };
+    if (!((a->formatFeatures) == (b->formatFeatures))) {
+        onFail("a->formatFeatures (Error: Value not equal)");
+    };
+    checkEqual_VkComponentMapping(&a->samplerYcbcrConversionComponents,
+                                  &b->samplerYcbcrConversionComponents, onFail);
+    if (!((a->suggestedYcbcrModel) == (b->suggestedYcbcrModel))) {
+        onFail("a->suggestedYcbcrModel (Error: Value not equal)");
+    };
+    if (!((a->suggestedYcbcrRange) == (b->suggestedYcbcrRange))) {
+        onFail("a->suggestedYcbcrRange (Error: Value not equal)");
+    };
+    if (!((a->suggestedXChromaOffset) == (b->suggestedXChromaOffset))) {
+        onFail("a->suggestedXChromaOffset (Error: Value not equal)");
+    };
+    if (!((a->suggestedYChromaOffset) == (b->suggestedYChromaOffset))) {
+        onFail("a->suggestedYChromaOffset (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkImportAndroidHardwareBufferInfoANDROID(
     const VkImportAndroidHardwareBufferInfoANDROID* a,
-    const VkImportAndroidHardwareBufferInfoANDROID* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkImportAndroidHardwareBufferInfoANDROID* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((memcmp(a->buffer, b->buffer, sizeof(AHardwareBuffer)) == 0))) { onFail("a->buffer (Error: Unequal dyn array)"); };
+    if (!((memcmp(a->buffer, b->buffer, sizeof(AHardwareBuffer)) == 0))) {
+        onFail("a->buffer (Error: Unequal dyn array)");
+    };
 }
 
 void checkEqual_VkMemoryGetAndroidHardwareBufferInfoANDROID(
     const VkMemoryGetAndroidHardwareBufferInfoANDROID* a,
-    const VkMemoryGetAndroidHardwareBufferInfoANDROID* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkMemoryGetAndroidHardwareBufferInfoANDROID* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->memory) == (b->memory))) { onFail("a->memory (Error: Value not equal)"); };
+    if (!((a->memory) == (b->memory))) {
+        onFail("a->memory (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkExternalFormatANDROID(
-    const VkExternalFormatANDROID* a,
-    const VkExternalFormatANDROID* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkExternalFormatANDROID(const VkExternalFormatANDROID* a,
+                                        const VkExternalFormatANDROID* b,
+                                        OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->externalFormat) == (b->externalFormat))) { onFail("a->externalFormat (Error: Value not equal)"); };
+    if (!((a->externalFormat) == (b->externalFormat))) {
+        onFail("a->externalFormat (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkAndroidHardwareBufferFormatProperties2ANDROID(
     const VkAndroidHardwareBufferFormatProperties2ANDROID* a,
-    const VkAndroidHardwareBufferFormatProperties2ANDROID* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkAndroidHardwareBufferFormatProperties2ANDROID* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->format) == (b->format))) { onFail("a->format (Error: Value not equal)"); };
-    if (!((a->externalFormat) == (b->externalFormat))) { onFail("a->externalFormat (Error: Value not equal)"); };
-    if (!((a->formatFeatures) == (b->formatFeatures))) { onFail("a->formatFeatures (Error: Value not equal)"); };
-    checkEqual_VkComponentMapping(&a->samplerYcbcrConversionComponents, &b->samplerYcbcrConversionComponents, onFail);
-    if (!((a->suggestedYcbcrModel) == (b->suggestedYcbcrModel))) { onFail("a->suggestedYcbcrModel (Error: Value not equal)"); };
-    if (!((a->suggestedYcbcrRange) == (b->suggestedYcbcrRange))) { onFail("a->suggestedYcbcrRange (Error: Value not equal)"); };
-    if (!((a->suggestedXChromaOffset) == (b->suggestedXChromaOffset))) { onFail("a->suggestedXChromaOffset (Error: Value not equal)"); };
-    if (!((a->suggestedYChromaOffset) == (b->suggestedYChromaOffset))) { onFail("a->suggestedYChromaOffset (Error: Value not equal)"); };
+    if (!((a->format) == (b->format))) {
+        onFail("a->format (Error: Value not equal)");
+    };
+    if (!((a->externalFormat) == (b->externalFormat))) {
+        onFail("a->externalFormat (Error: Value not equal)");
+    };
+    if (!((a->formatFeatures) == (b->formatFeatures))) {
+        onFail("a->formatFeatures (Error: Value not equal)");
+    };
+    checkEqual_VkComponentMapping(&a->samplerYcbcrConversionComponents,
+                                  &b->samplerYcbcrConversionComponents, onFail);
+    if (!((a->suggestedYcbcrModel) == (b->suggestedYcbcrModel))) {
+        onFail("a->suggestedYcbcrModel (Error: Value not equal)");
+    };
+    if (!((a->suggestedYcbcrRange) == (b->suggestedYcbcrRange))) {
+        onFail("a->suggestedYcbcrRange (Error: Value not equal)");
+    };
+    if (!((a->suggestedXChromaOffset) == (b->suggestedXChromaOffset))) {
+        onFail("a->suggestedXChromaOffset (Error: Value not equal)");
+    };
+    if (!((a->suggestedYChromaOffset) == (b->suggestedYChromaOffset))) {
+        onFail("a->suggestedYChromaOffset (Error: Value not equal)");
+    };
 }
 
 #endif
@@ -9062,157 +12320,185 @@
 #ifdef VK_EXT_inline_uniform_block
 void checkEqual_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(
     const VkPhysicalDeviceInlineUniformBlockFeaturesEXT* a,
-    const VkPhysicalDeviceInlineUniformBlockFeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceInlineUniformBlockFeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->inlineUniformBlock) == (b->inlineUniformBlock))) { onFail("a->inlineUniformBlock (Error: Value not equal)"); };
-    if (!((a->descriptorBindingInlineUniformBlockUpdateAfterBind) == (b->descriptorBindingInlineUniformBlockUpdateAfterBind))) { onFail("a->descriptorBindingInlineUniformBlockUpdateAfterBind (Error: Value not equal)"); };
+    if (!((a->inlineUniformBlock) == (b->inlineUniformBlock))) {
+        onFail("a->inlineUniformBlock (Error: Value not equal)");
+    };
+    if (!((a->descriptorBindingInlineUniformBlockUpdateAfterBind) ==
+          (b->descriptorBindingInlineUniformBlockUpdateAfterBind))) {
+        onFail("a->descriptorBindingInlineUniformBlockUpdateAfterBind (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(
     const VkPhysicalDeviceInlineUniformBlockPropertiesEXT* a,
-    const VkPhysicalDeviceInlineUniformBlockPropertiesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceInlineUniformBlockPropertiesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->maxInlineUniformBlockSize) == (b->maxInlineUniformBlockSize))) { onFail("a->maxInlineUniformBlockSize (Error: Value not equal)"); };
-    if (!((a->maxPerStageDescriptorInlineUniformBlocks) == (b->maxPerStageDescriptorInlineUniformBlocks))) { onFail("a->maxPerStageDescriptorInlineUniformBlocks (Error: Value not equal)"); };
-    if (!((a->maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks) == (b->maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks))) { onFail("a->maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks (Error: Value not equal)"); };
-    if (!((a->maxDescriptorSetInlineUniformBlocks) == (b->maxDescriptorSetInlineUniformBlocks))) { onFail("a->maxDescriptorSetInlineUniformBlocks (Error: Value not equal)"); };
-    if (!((a->maxDescriptorSetUpdateAfterBindInlineUniformBlocks) == (b->maxDescriptorSetUpdateAfterBindInlineUniformBlocks))) { onFail("a->maxDescriptorSetUpdateAfterBindInlineUniformBlocks (Error: Value not equal)"); };
+    if (!((a->maxInlineUniformBlockSize) == (b->maxInlineUniformBlockSize))) {
+        onFail("a->maxInlineUniformBlockSize (Error: Value not equal)");
+    };
+    if (!((a->maxPerStageDescriptorInlineUniformBlocks) ==
+          (b->maxPerStageDescriptorInlineUniformBlocks))) {
+        onFail("a->maxPerStageDescriptorInlineUniformBlocks (Error: Value not equal)");
+    };
+    if (!((a->maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks) ==
+          (b->maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks))) {
+        onFail(
+            "a->maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks (Error: Value not equal)");
+    };
+    if (!((a->maxDescriptorSetInlineUniformBlocks) == (b->maxDescriptorSetInlineUniformBlocks))) {
+        onFail("a->maxDescriptorSetInlineUniformBlocks (Error: Value not equal)");
+    };
+    if (!((a->maxDescriptorSetUpdateAfterBindInlineUniformBlocks) ==
+          (b->maxDescriptorSetUpdateAfterBindInlineUniformBlocks))) {
+        onFail("a->maxDescriptorSetUpdateAfterBindInlineUniformBlocks (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkWriteDescriptorSetInlineUniformBlockEXT(
     const VkWriteDescriptorSetInlineUniformBlockEXT* a,
-    const VkWriteDescriptorSetInlineUniformBlockEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkWriteDescriptorSetInlineUniformBlockEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->dataSize) == (b->dataSize))) { onFail("a->dataSize (Error: Value not equal)"); };
+    if (!((a->dataSize) == (b->dataSize))) {
+        onFail("a->dataSize (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(
     const VkDescriptorPoolInlineUniformBlockCreateInfoEXT* a,
-    const VkDescriptorPoolInlineUniformBlockCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkDescriptorPoolInlineUniformBlockCreateInfoEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->maxInlineUniformBlockBindings) == (b->maxInlineUniformBlockBindings))) { onFail("a->maxInlineUniformBlockBindings (Error: Value not equal)"); };
+    if (!((a->maxInlineUniformBlockBindings) == (b->maxInlineUniformBlockBindings))) {
+        onFail("a->maxInlineUniformBlockBindings (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_shader_stencil_export
 #endif
 #ifdef VK_EXT_sample_locations
-void checkEqual_VkSampleLocationEXT(
-    const VkSampleLocationEXT* a,
-    const VkSampleLocationEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->x) == (b->x))) { onFail("a->x (Error: Value not equal)"); };
-    if (!((a->y) == (b->y))) { onFail("a->y (Error: Value not equal)"); };
+void checkEqual_VkSampleLocationEXT(const VkSampleLocationEXT* a, const VkSampleLocationEXT* b,
+                                    OnFailCompareFunc onFail) {
+    if (!((a->x) == (b->x))) {
+        onFail("a->x (Error: Value not equal)");
+    };
+    if (!((a->y) == (b->y))) {
+        onFail("a->y (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkSampleLocationsInfoEXT(
-    const VkSampleLocationsInfoEXT* a,
-    const VkSampleLocationsInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkSampleLocationsInfoEXT(const VkSampleLocationsInfoEXT* a,
+                                         const VkSampleLocationsInfoEXT* b,
+                                         OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->sampleLocationsPerPixel) == (b->sampleLocationsPerPixel))) { onFail("a->sampleLocationsPerPixel (Error: Value not equal)"); };
+    if (!((a->sampleLocationsPerPixel) == (b->sampleLocationsPerPixel))) {
+        onFail("a->sampleLocationsPerPixel (Error: Value not equal)");
+    };
     checkEqual_VkExtent2D(&a->sampleLocationGridSize, &b->sampleLocationGridSize, onFail);
-    if (!((a->sampleLocationsCount) == (b->sampleLocationsCount))) { onFail("a->sampleLocationsCount (Error: Value not equal)"); };
-    if ((a->pSampleLocations) && (b->pSampleLocations))
-    {
-        if (!((a->sampleLocationsCount) == (b->sampleLocationsCount))) { onFail("a->pSampleLocations (Error: Lengths not equal)"); };
-        if ((a->sampleLocationsCount) == (b->sampleLocationsCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->sampleLocationsCount; ++i)
-                {
-                    checkEqual_VkSampleLocationEXT(a->pSampleLocations + i, b->pSampleLocations + i, onFail);
+    if (!((a->sampleLocationsCount) == (b->sampleLocationsCount))) {
+        onFail("a->sampleLocationsCount (Error: Value not equal)");
+    };
+    if ((a->pSampleLocations) && (b->pSampleLocations)) {
+        if (!((a->sampleLocationsCount) == (b->sampleLocationsCount))) {
+            onFail("a->pSampleLocations (Error: Lengths not equal)");
+        };
+        if ((a->sampleLocationsCount) == (b->sampleLocationsCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->sampleLocationsCount; ++i) {
+                    checkEqual_VkSampleLocationEXT(a->pSampleLocations + i, b->pSampleLocations + i,
+                                                   onFail);
                 }
             }
         }
     }
 }
 
-void checkEqual_VkAttachmentSampleLocationsEXT(
-    const VkAttachmentSampleLocationsEXT* a,
-    const VkAttachmentSampleLocationsEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->attachmentIndex) == (b->attachmentIndex))) { onFail("a->attachmentIndex (Error: Value not equal)"); };
+void checkEqual_VkAttachmentSampleLocationsEXT(const VkAttachmentSampleLocationsEXT* a,
+                                               const VkAttachmentSampleLocationsEXT* b,
+                                               OnFailCompareFunc onFail) {
+    if (!((a->attachmentIndex) == (b->attachmentIndex))) {
+        onFail("a->attachmentIndex (Error: Value not equal)");
+    };
     checkEqual_VkSampleLocationsInfoEXT(&a->sampleLocationsInfo, &b->sampleLocationsInfo, onFail);
 }
 
-void checkEqual_VkSubpassSampleLocationsEXT(
-    const VkSubpassSampleLocationsEXT* a,
-    const VkSubpassSampleLocationsEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->subpassIndex) == (b->subpassIndex))) { onFail("a->subpassIndex (Error: Value not equal)"); };
+void checkEqual_VkSubpassSampleLocationsEXT(const VkSubpassSampleLocationsEXT* a,
+                                            const VkSubpassSampleLocationsEXT* b,
+                                            OnFailCompareFunc onFail) {
+    if (!((a->subpassIndex) == (b->subpassIndex))) {
+        onFail("a->subpassIndex (Error: Value not equal)");
+    };
     checkEqual_VkSampleLocationsInfoEXT(&a->sampleLocationsInfo, &b->sampleLocationsInfo, onFail);
 }
 
 void checkEqual_VkRenderPassSampleLocationsBeginInfoEXT(
     const VkRenderPassSampleLocationsBeginInfoEXT* a,
-    const VkRenderPassSampleLocationsBeginInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkRenderPassSampleLocationsBeginInfoEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->attachmentInitialSampleLocationsCount) == (b->attachmentInitialSampleLocationsCount))) { onFail("a->attachmentInitialSampleLocationsCount (Error: Value not equal)"); };
-    if ((a->pAttachmentInitialSampleLocations) && (b->pAttachmentInitialSampleLocations))
-    {
-        if (!((a->attachmentInitialSampleLocationsCount) == (b->attachmentInitialSampleLocationsCount))) { onFail("a->pAttachmentInitialSampleLocations (Error: Lengths not equal)"); };
-        if ((a->attachmentInitialSampleLocationsCount) == (b->attachmentInitialSampleLocationsCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->attachmentInitialSampleLocationsCount; ++i)
-                {
-                    checkEqual_VkAttachmentSampleLocationsEXT(a->pAttachmentInitialSampleLocations + i, b->pAttachmentInitialSampleLocations + i, onFail);
+    if (!((a->attachmentInitialSampleLocationsCount) ==
+          (b->attachmentInitialSampleLocationsCount))) {
+        onFail("a->attachmentInitialSampleLocationsCount (Error: Value not equal)");
+    };
+    if ((a->pAttachmentInitialSampleLocations) && (b->pAttachmentInitialSampleLocations)) {
+        if (!((a->attachmentInitialSampleLocationsCount) ==
+              (b->attachmentInitialSampleLocationsCount))) {
+            onFail("a->pAttachmentInitialSampleLocations (Error: Lengths not equal)");
+        };
+        if ((a->attachmentInitialSampleLocationsCount) ==
+            (b->attachmentInitialSampleLocationsCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->attachmentInitialSampleLocationsCount; ++i) {
+                    checkEqual_VkAttachmentSampleLocationsEXT(
+                        a->pAttachmentInitialSampleLocations + i,
+                        b->pAttachmentInitialSampleLocations + i, onFail);
                 }
             }
         }
     }
-    if (!((a->postSubpassSampleLocationsCount) == (b->postSubpassSampleLocationsCount))) { onFail("a->postSubpassSampleLocationsCount (Error: Value not equal)"); };
-    if ((a->pPostSubpassSampleLocations) && (b->pPostSubpassSampleLocations))
-    {
-        if (!((a->postSubpassSampleLocationsCount) == (b->postSubpassSampleLocationsCount))) { onFail("a->pPostSubpassSampleLocations (Error: Lengths not equal)"); };
-        if ((a->postSubpassSampleLocationsCount) == (b->postSubpassSampleLocationsCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->postSubpassSampleLocationsCount; ++i)
-                {
-                    checkEqual_VkSubpassSampleLocationsEXT(a->pPostSubpassSampleLocations + i, b->pPostSubpassSampleLocations + i, onFail);
+    if (!((a->postSubpassSampleLocationsCount) == (b->postSubpassSampleLocationsCount))) {
+        onFail("a->postSubpassSampleLocationsCount (Error: Value not equal)");
+    };
+    if ((a->pPostSubpassSampleLocations) && (b->pPostSubpassSampleLocations)) {
+        if (!((a->postSubpassSampleLocationsCount) == (b->postSubpassSampleLocationsCount))) {
+            onFail("a->pPostSubpassSampleLocations (Error: Lengths not equal)");
+        };
+        if ((a->postSubpassSampleLocationsCount) == (b->postSubpassSampleLocationsCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->postSubpassSampleLocationsCount; ++i) {
+                    checkEqual_VkSubpassSampleLocationsEXT(a->pPostSubpassSampleLocations + i,
+                                                           b->pPostSubpassSampleLocations + i,
+                                                           onFail);
                 }
             }
         }
@@ -9221,43 +12507,51 @@
 
 void checkEqual_VkPipelineSampleLocationsStateCreateInfoEXT(
     const VkPipelineSampleLocationsStateCreateInfoEXT* a,
-    const VkPipelineSampleLocationsStateCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPipelineSampleLocationsStateCreateInfoEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->sampleLocationsEnable) == (b->sampleLocationsEnable))) { onFail("a->sampleLocationsEnable (Error: Value not equal)"); };
+    if (!((a->sampleLocationsEnable) == (b->sampleLocationsEnable))) {
+        onFail("a->sampleLocationsEnable (Error: Value not equal)");
+    };
     checkEqual_VkSampleLocationsInfoEXT(&a->sampleLocationsInfo, &b->sampleLocationsInfo, onFail);
 }
 
 void checkEqual_VkPhysicalDeviceSampleLocationsPropertiesEXT(
     const VkPhysicalDeviceSampleLocationsPropertiesEXT* a,
-    const VkPhysicalDeviceSampleLocationsPropertiesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceSampleLocationsPropertiesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->sampleLocationSampleCounts) == (b->sampleLocationSampleCounts))) { onFail("a->sampleLocationSampleCounts (Error: Value not equal)"); };
+    if (!((a->sampleLocationSampleCounts) == (b->sampleLocationSampleCounts))) {
+        onFail("a->sampleLocationSampleCounts (Error: Value not equal)");
+    };
     checkEqual_VkExtent2D(&a->maxSampleLocationGridSize, &b->maxSampleLocationGridSize, onFail);
-    if (!((memcmp(a->sampleLocationCoordinateRange, b->sampleLocationCoordinateRange, 2 * sizeof(float)) == 0))) { onFail("a->sampleLocationCoordinateRange (Error: Unequal static array)"); };
-    if (!((a->sampleLocationSubPixelBits) == (b->sampleLocationSubPixelBits))) { onFail("a->sampleLocationSubPixelBits (Error: Value not equal)"); };
-    if (!((a->variableSampleLocations) == (b->variableSampleLocations))) { onFail("a->variableSampleLocations (Error: Value not equal)"); };
+    if (!((memcmp(a->sampleLocationCoordinateRange, b->sampleLocationCoordinateRange,
+                  2 * sizeof(float)) == 0))) {
+        onFail("a->sampleLocationCoordinateRange (Error: Unequal static array)");
+    };
+    if (!((a->sampleLocationSubPixelBits) == (b->sampleLocationSubPixelBits))) {
+        onFail("a->sampleLocationSubPixelBits (Error: Value not equal)");
+    };
+    if (!((a->variableSampleLocations) == (b->variableSampleLocations))) {
+        onFail("a->variableSampleLocations (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkMultisamplePropertiesEXT(
-    const VkMultisamplePropertiesEXT* a,
-    const VkMultisamplePropertiesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkMultisamplePropertiesEXT(const VkMultisamplePropertiesEXT* a,
+                                           const VkMultisamplePropertiesEXT* b,
+                                           OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
     checkEqual_VkExtent2D(&a->maxSampleLocationGridSize, &b->maxSampleLocationGridSize, onFail);
@@ -9267,88 +12561,126 @@
 #ifdef VK_EXT_blend_operation_advanced
 void checkEqual_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
     const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* a,
-    const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->advancedBlendCoherentOperations) == (b->advancedBlendCoherentOperations))) { onFail("a->advancedBlendCoherentOperations (Error: Value not equal)"); };
+    if (!((a->advancedBlendCoherentOperations) == (b->advancedBlendCoherentOperations))) {
+        onFail("a->advancedBlendCoherentOperations (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
     const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* a,
-    const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->advancedBlendMaxColorAttachments) == (b->advancedBlendMaxColorAttachments))) { onFail("a->advancedBlendMaxColorAttachments (Error: Value not equal)"); };
-    if (!((a->advancedBlendIndependentBlend) == (b->advancedBlendIndependentBlend))) { onFail("a->advancedBlendIndependentBlend (Error: Value not equal)"); };
-    if (!((a->advancedBlendNonPremultipliedSrcColor) == (b->advancedBlendNonPremultipliedSrcColor))) { onFail("a->advancedBlendNonPremultipliedSrcColor (Error: Value not equal)"); };
-    if (!((a->advancedBlendNonPremultipliedDstColor) == (b->advancedBlendNonPremultipliedDstColor))) { onFail("a->advancedBlendNonPremultipliedDstColor (Error: Value not equal)"); };
-    if (!((a->advancedBlendCorrelatedOverlap) == (b->advancedBlendCorrelatedOverlap))) { onFail("a->advancedBlendCorrelatedOverlap (Error: Value not equal)"); };
-    if (!((a->advancedBlendAllOperations) == (b->advancedBlendAllOperations))) { onFail("a->advancedBlendAllOperations (Error: Value not equal)"); };
+    if (!((a->advancedBlendMaxColorAttachments) == (b->advancedBlendMaxColorAttachments))) {
+        onFail("a->advancedBlendMaxColorAttachments (Error: Value not equal)");
+    };
+    if (!((a->advancedBlendIndependentBlend) == (b->advancedBlendIndependentBlend))) {
+        onFail("a->advancedBlendIndependentBlend (Error: Value not equal)");
+    };
+    if (!((a->advancedBlendNonPremultipliedSrcColor) ==
+          (b->advancedBlendNonPremultipliedSrcColor))) {
+        onFail("a->advancedBlendNonPremultipliedSrcColor (Error: Value not equal)");
+    };
+    if (!((a->advancedBlendNonPremultipliedDstColor) ==
+          (b->advancedBlendNonPremultipliedDstColor))) {
+        onFail("a->advancedBlendNonPremultipliedDstColor (Error: Value not equal)");
+    };
+    if (!((a->advancedBlendCorrelatedOverlap) == (b->advancedBlendCorrelatedOverlap))) {
+        onFail("a->advancedBlendCorrelatedOverlap (Error: Value not equal)");
+    };
+    if (!((a->advancedBlendAllOperations) == (b->advancedBlendAllOperations))) {
+        onFail("a->advancedBlendAllOperations (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
     const VkPipelineColorBlendAdvancedStateCreateInfoEXT* a,
-    const VkPipelineColorBlendAdvancedStateCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPipelineColorBlendAdvancedStateCreateInfoEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->srcPremultiplied) == (b->srcPremultiplied))) { onFail("a->srcPremultiplied (Error: Value not equal)"); };
-    if (!((a->dstPremultiplied) == (b->dstPremultiplied))) { onFail("a->dstPremultiplied (Error: Value not equal)"); };
-    if (!((a->blendOverlap) == (b->blendOverlap))) { onFail("a->blendOverlap (Error: Value not equal)"); };
+    if (!((a->srcPremultiplied) == (b->srcPremultiplied))) {
+        onFail("a->srcPremultiplied (Error: Value not equal)");
+    };
+    if (!((a->dstPremultiplied) == (b->dstPremultiplied))) {
+        onFail("a->dstPremultiplied (Error: Value not equal)");
+    };
+    if (!((a->blendOverlap) == (b->blendOverlap))) {
+        onFail("a->blendOverlap (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_NV_fragment_coverage_to_color
 void checkEqual_VkPipelineCoverageToColorStateCreateInfoNV(
     const VkPipelineCoverageToColorStateCreateInfoNV* a,
-    const VkPipelineCoverageToColorStateCreateInfoNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPipelineCoverageToColorStateCreateInfoNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->coverageToColorEnable) == (b->coverageToColorEnable))) { onFail("a->coverageToColorEnable (Error: Value not equal)"); };
-    if (!((a->coverageToColorLocation) == (b->coverageToColorLocation))) { onFail("a->coverageToColorLocation (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->coverageToColorEnable) == (b->coverageToColorEnable))) {
+        onFail("a->coverageToColorEnable (Error: Value not equal)");
+    };
+    if (!((a->coverageToColorLocation) == (b->coverageToColorLocation))) {
+        onFail("a->coverageToColorLocation (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_NV_framebuffer_mixed_samples
 void checkEqual_VkPipelineCoverageModulationStateCreateInfoNV(
     const VkPipelineCoverageModulationStateCreateInfoNV* a,
-    const VkPipelineCoverageModulationStateCreateInfoNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPipelineCoverageModulationStateCreateInfoNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->coverageModulationMode) == (b->coverageModulationMode))) { onFail("a->coverageModulationMode (Error: Value not equal)"); };
-    if (!((a->coverageModulationTableEnable) == (b->coverageModulationTableEnable))) { onFail("a->coverageModulationTableEnable (Error: Value not equal)"); };
-    if (!((a->coverageModulationTableCount) == (b->coverageModulationTableCount))) { onFail("a->coverageModulationTableCount (Error: Value not equal)"); };
-    if (!((!(a->pCoverageModulationTable) && !(b->pCoverageModulationTable)) || ((a->pCoverageModulationTable) && (b->pCoverageModulationTable)))) { onFail("a->pCoverageModulationTable (Error: Mismatch in optional field)"); };
-    if (a->pCoverageModulationTable && b->pCoverageModulationTable)
-    {
-        if (!((a->coverageModulationTableCount) == (b->coverageModulationTableCount))) { onFail("a->pCoverageModulationTable (Error: Lengths not equal)"); };
-        if (!((memcmp(a->pCoverageModulationTable, b->pCoverageModulationTable, a->coverageModulationTableCount * sizeof(const float)) == 0))) { onFail("a->pCoverageModulationTable (Error: Unequal dyn array)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->coverageModulationMode) == (b->coverageModulationMode))) {
+        onFail("a->coverageModulationMode (Error: Value not equal)");
+    };
+    if (!((a->coverageModulationTableEnable) == (b->coverageModulationTableEnable))) {
+        onFail("a->coverageModulationTableEnable (Error: Value not equal)");
+    };
+    if (!((a->coverageModulationTableCount) == (b->coverageModulationTableCount))) {
+        onFail("a->coverageModulationTableCount (Error: Value not equal)");
+    };
+    if (!((!(a->pCoverageModulationTable) && !(b->pCoverageModulationTable)) ||
+          ((a->pCoverageModulationTable) && (b->pCoverageModulationTable)))) {
+        onFail("a->pCoverageModulationTable (Error: Mismatch in optional field)");
+    };
+    if (a->pCoverageModulationTable && b->pCoverageModulationTable) {
+        if (!((a->coverageModulationTableCount) == (b->coverageModulationTableCount))) {
+            onFail("a->pCoverageModulationTable (Error: Lengths not equal)");
+        };
+        if (!((memcmp(a->pCoverageModulationTable, b->pCoverageModulationTable,
+                      a->coverageModulationTableCount * sizeof(const float)) == 0))) {
+            onFail("a->pCoverageModulationTable (Error: Unequal dyn array)");
+        };
     }
 }
 
@@ -9358,69 +12690,80 @@
 #ifdef VK_NV_shader_sm_builtins
 void checkEqual_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(
     const VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* a,
-    const VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->shaderSMCount) == (b->shaderSMCount))) { onFail("a->shaderSMCount (Error: Value not equal)"); };
-    if (!((a->shaderWarpsPerSM) == (b->shaderWarpsPerSM))) { onFail("a->shaderWarpsPerSM (Error: Value not equal)"); };
+    if (!((a->shaderSMCount) == (b->shaderSMCount))) {
+        onFail("a->shaderSMCount (Error: Value not equal)");
+    };
+    if (!((a->shaderWarpsPerSM) == (b->shaderWarpsPerSM))) {
+        onFail("a->shaderWarpsPerSM (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(
     const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* a,
-    const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->shaderSMBuiltins) == (b->shaderSMBuiltins))) { onFail("a->shaderSMBuiltins (Error: Value not equal)"); };
+    if (!((a->shaderSMBuiltins) == (b->shaderSMBuiltins))) {
+        onFail("a->shaderSMBuiltins (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_post_depth_coverage
 #endif
 #ifdef VK_EXT_image_drm_format_modifier
-void checkEqual_VkDrmFormatModifierPropertiesEXT(
-    const VkDrmFormatModifierPropertiesEXT* a,
-    const VkDrmFormatModifierPropertiesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->drmFormatModifier) == (b->drmFormatModifier))) { onFail("a->drmFormatModifier (Error: Value not equal)"); };
-    if (!((a->drmFormatModifierPlaneCount) == (b->drmFormatModifierPlaneCount))) { onFail("a->drmFormatModifierPlaneCount (Error: Value not equal)"); };
-    if (!((a->drmFormatModifierTilingFeatures) == (b->drmFormatModifierTilingFeatures))) { onFail("a->drmFormatModifierTilingFeatures (Error: Value not equal)"); };
+void checkEqual_VkDrmFormatModifierPropertiesEXT(const VkDrmFormatModifierPropertiesEXT* a,
+                                                 const VkDrmFormatModifierPropertiesEXT* b,
+                                                 OnFailCompareFunc onFail) {
+    if (!((a->drmFormatModifier) == (b->drmFormatModifier))) {
+        onFail("a->drmFormatModifier (Error: Value not equal)");
+    };
+    if (!((a->drmFormatModifierPlaneCount) == (b->drmFormatModifierPlaneCount))) {
+        onFail("a->drmFormatModifierPlaneCount (Error: Value not equal)");
+    };
+    if (!((a->drmFormatModifierTilingFeatures) == (b->drmFormatModifierTilingFeatures))) {
+        onFail("a->drmFormatModifierTilingFeatures (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkDrmFormatModifierPropertiesListEXT(
-    const VkDrmFormatModifierPropertiesListEXT* a,
-    const VkDrmFormatModifierPropertiesListEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDrmFormatModifierPropertiesListEXT(const VkDrmFormatModifierPropertiesListEXT* a,
+                                                     const VkDrmFormatModifierPropertiesListEXT* b,
+                                                     OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->drmFormatModifierCount) == (b->drmFormatModifierCount))) { onFail("a->drmFormatModifierCount (Error: Value not equal)"); };
-    if (!((!(a->pDrmFormatModifierProperties) && !(b->pDrmFormatModifierProperties)) || ((a->pDrmFormatModifierProperties) && (b->pDrmFormatModifierProperties)))) { onFail("a->pDrmFormatModifierProperties (Error: Mismatch in optional field)"); };
-    if (a->pDrmFormatModifierProperties && b->pDrmFormatModifierProperties)
-    {
-        if ((a->pDrmFormatModifierProperties) && (b->pDrmFormatModifierProperties))
-        {
-            if (!((a->drmFormatModifierCount) == (b->drmFormatModifierCount))) { onFail("a->pDrmFormatModifierProperties (Error: Lengths not equal)"); };
-            if ((a->drmFormatModifierCount) == (b->drmFormatModifierCount))
-            {
-                if (a)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)a->drmFormatModifierCount; ++i)
-                    {
-                        checkEqual_VkDrmFormatModifierPropertiesEXT(a->pDrmFormatModifierProperties + i, b->pDrmFormatModifierProperties + i, onFail);
+    if (!((a->drmFormatModifierCount) == (b->drmFormatModifierCount))) {
+        onFail("a->drmFormatModifierCount (Error: Value not equal)");
+    };
+    if (!((!(a->pDrmFormatModifierProperties) && !(b->pDrmFormatModifierProperties)) ||
+          ((a->pDrmFormatModifierProperties) && (b->pDrmFormatModifierProperties)))) {
+        onFail("a->pDrmFormatModifierProperties (Error: Mismatch in optional field)");
+    };
+    if (a->pDrmFormatModifierProperties && b->pDrmFormatModifierProperties) {
+        if ((a->pDrmFormatModifierProperties) && (b->pDrmFormatModifierProperties)) {
+            if (!((a->drmFormatModifierCount) == (b->drmFormatModifierCount))) {
+                onFail("a->pDrmFormatModifierProperties (Error: Lengths not equal)");
+            };
+            if ((a->drmFormatModifierCount) == (b->drmFormatModifierCount)) {
+                if (a) {
+                    for (uint32_t i = 0; i < (uint32_t)a->drmFormatModifierCount; ++i) {
+                        checkEqual_VkDrmFormatModifierPropertiesEXT(
+                            a->pDrmFormatModifierProperties + i,
+                            b->pDrmFormatModifierProperties + i, onFail);
                     }
                 }
             }
@@ -9430,62 +12773,82 @@
 
 void checkEqual_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(
     const VkPhysicalDeviceImageDrmFormatModifierInfoEXT* a,
-    const VkPhysicalDeviceImageDrmFormatModifierInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceImageDrmFormatModifierInfoEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->drmFormatModifier) == (b->drmFormatModifier))) { onFail("a->drmFormatModifier (Error: Value not equal)"); };
-    if (!((a->sharingMode) == (b->sharingMode))) { onFail("a->sharingMode (Error: Value not equal)"); };
-    if (!((a->queueFamilyIndexCount) == (b->queueFamilyIndexCount))) { onFail("a->queueFamilyIndexCount (Error: Value not equal)"); };
-    if (!((!(a->pQueueFamilyIndices) && !(b->pQueueFamilyIndices)) || ((a->pQueueFamilyIndices) && (b->pQueueFamilyIndices)))) { onFail("a->pQueueFamilyIndices (Error: Mismatch in optional field)"); };
-    if (a->pQueueFamilyIndices && b->pQueueFamilyIndices)
-    {
-        if (!((a->queueFamilyIndexCount) == (b->queueFamilyIndexCount))) { onFail("a->pQueueFamilyIndices (Error: Lengths not equal)"); };
-        if (!((memcmp(a->pQueueFamilyIndices, b->pQueueFamilyIndices, a->queueFamilyIndexCount * sizeof(const uint32_t)) == 0))) { onFail("a->pQueueFamilyIndices (Error: Unequal dyn array)"); };
+    if (!((a->drmFormatModifier) == (b->drmFormatModifier))) {
+        onFail("a->drmFormatModifier (Error: Value not equal)");
+    };
+    if (!((a->sharingMode) == (b->sharingMode))) {
+        onFail("a->sharingMode (Error: Value not equal)");
+    };
+    if (!((a->queueFamilyIndexCount) == (b->queueFamilyIndexCount))) {
+        onFail("a->queueFamilyIndexCount (Error: Value not equal)");
+    };
+    if (!((!(a->pQueueFamilyIndices) && !(b->pQueueFamilyIndices)) ||
+          ((a->pQueueFamilyIndices) && (b->pQueueFamilyIndices)))) {
+        onFail("a->pQueueFamilyIndices (Error: Mismatch in optional field)");
+    };
+    if (a->pQueueFamilyIndices && b->pQueueFamilyIndices) {
+        if (!((a->queueFamilyIndexCount) == (b->queueFamilyIndexCount))) {
+            onFail("a->pQueueFamilyIndices (Error: Lengths not equal)");
+        };
+        if (!((memcmp(a->pQueueFamilyIndices, b->pQueueFamilyIndices,
+                      a->queueFamilyIndexCount * sizeof(const uint32_t)) == 0))) {
+            onFail("a->pQueueFamilyIndices (Error: Unequal dyn array)");
+        };
     }
 }
 
 void checkEqual_VkImageDrmFormatModifierListCreateInfoEXT(
     const VkImageDrmFormatModifierListCreateInfoEXT* a,
-    const VkImageDrmFormatModifierListCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkImageDrmFormatModifierListCreateInfoEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->drmFormatModifierCount) == (b->drmFormatModifierCount))) { onFail("a->drmFormatModifierCount (Error: Value not equal)"); };
-    if (!((a->drmFormatModifierCount) == (b->drmFormatModifierCount))) { onFail("a->pDrmFormatModifiers (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pDrmFormatModifiers, b->pDrmFormatModifiers, a->drmFormatModifierCount * sizeof(const uint64_t)) == 0))) { onFail("a->pDrmFormatModifiers (Error: Unequal dyn array)"); };
+    if (!((a->drmFormatModifierCount) == (b->drmFormatModifierCount))) {
+        onFail("a->drmFormatModifierCount (Error: Value not equal)");
+    };
+    if (!((a->drmFormatModifierCount) == (b->drmFormatModifierCount))) {
+        onFail("a->pDrmFormatModifiers (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pDrmFormatModifiers, b->pDrmFormatModifiers,
+                  a->drmFormatModifierCount * sizeof(const uint64_t)) == 0))) {
+        onFail("a->pDrmFormatModifiers (Error: Unequal dyn array)");
+    };
 }
 
 void checkEqual_VkImageDrmFormatModifierExplicitCreateInfoEXT(
     const VkImageDrmFormatModifierExplicitCreateInfoEXT* a,
-    const VkImageDrmFormatModifierExplicitCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkImageDrmFormatModifierExplicitCreateInfoEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->drmFormatModifier) == (b->drmFormatModifier))) { onFail("a->drmFormatModifier (Error: Value not equal)"); };
-    if (!((a->drmFormatModifierPlaneCount) == (b->drmFormatModifierPlaneCount))) { onFail("a->drmFormatModifierPlaneCount (Error: Value not equal)"); };
-    if ((a->pPlaneLayouts) && (b->pPlaneLayouts))
-    {
-        if (!((a->drmFormatModifierPlaneCount) == (b->drmFormatModifierPlaneCount))) { onFail("a->pPlaneLayouts (Error: Lengths not equal)"); };
-        if ((a->drmFormatModifierPlaneCount) == (b->drmFormatModifierPlaneCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->drmFormatModifierPlaneCount; ++i)
-                {
-                    checkEqual_VkSubresourceLayout(a->pPlaneLayouts + i, b->pPlaneLayouts + i, onFail);
+    if (!((a->drmFormatModifier) == (b->drmFormatModifier))) {
+        onFail("a->drmFormatModifier (Error: Value not equal)");
+    };
+    if (!((a->drmFormatModifierPlaneCount) == (b->drmFormatModifierPlaneCount))) {
+        onFail("a->drmFormatModifierPlaneCount (Error: Value not equal)");
+    };
+    if ((a->pPlaneLayouts) && (b->pPlaneLayouts)) {
+        if (!((a->drmFormatModifierPlaneCount) == (b->drmFormatModifierPlaneCount))) {
+            onFail("a->pPlaneLayouts (Error: Lengths not equal)");
+        };
+        if ((a->drmFormatModifierPlaneCount) == (b->drmFormatModifierPlaneCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->drmFormatModifierPlaneCount; ++i) {
+                    checkEqual_VkSubresourceLayout(a->pPlaneLayouts + i, b->pPlaneLayouts + i,
+                                                   onFail);
                 }
             }
         }
@@ -9493,52 +12856,60 @@
 }
 
 void checkEqual_VkImageDrmFormatModifierPropertiesEXT(
-    const VkImageDrmFormatModifierPropertiesEXT* a,
-    const VkImageDrmFormatModifierPropertiesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkImageDrmFormatModifierPropertiesEXT* a, const VkImageDrmFormatModifierPropertiesEXT* b,
+    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->drmFormatModifier) == (b->drmFormatModifier))) { onFail("a->drmFormatModifier (Error: Value not equal)"); };
+    if (!((a->drmFormatModifier) == (b->drmFormatModifier))) {
+        onFail("a->drmFormatModifier (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkDrmFormatModifierProperties2EXT(
-    const VkDrmFormatModifierProperties2EXT* a,
-    const VkDrmFormatModifierProperties2EXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->drmFormatModifier) == (b->drmFormatModifier))) { onFail("a->drmFormatModifier (Error: Value not equal)"); };
-    if (!((a->drmFormatModifierPlaneCount) == (b->drmFormatModifierPlaneCount))) { onFail("a->drmFormatModifierPlaneCount (Error: Value not equal)"); };
-    if (!((a->drmFormatModifierTilingFeatures) == (b->drmFormatModifierTilingFeatures))) { onFail("a->drmFormatModifierTilingFeatures (Error: Value not equal)"); };
+void checkEqual_VkDrmFormatModifierProperties2EXT(const VkDrmFormatModifierProperties2EXT* a,
+                                                  const VkDrmFormatModifierProperties2EXT* b,
+                                                  OnFailCompareFunc onFail) {
+    if (!((a->drmFormatModifier) == (b->drmFormatModifier))) {
+        onFail("a->drmFormatModifier (Error: Value not equal)");
+    };
+    if (!((a->drmFormatModifierPlaneCount) == (b->drmFormatModifierPlaneCount))) {
+        onFail("a->drmFormatModifierPlaneCount (Error: Value not equal)");
+    };
+    if (!((a->drmFormatModifierTilingFeatures) == (b->drmFormatModifierTilingFeatures))) {
+        onFail("a->drmFormatModifierTilingFeatures (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkDrmFormatModifierPropertiesList2EXT(
-    const VkDrmFormatModifierPropertiesList2EXT* a,
-    const VkDrmFormatModifierPropertiesList2EXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkDrmFormatModifierPropertiesList2EXT* a, const VkDrmFormatModifierPropertiesList2EXT* b,
+    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->drmFormatModifierCount) == (b->drmFormatModifierCount))) { onFail("a->drmFormatModifierCount (Error: Value not equal)"); };
-    if (!((!(a->pDrmFormatModifierProperties) && !(b->pDrmFormatModifierProperties)) || ((a->pDrmFormatModifierProperties) && (b->pDrmFormatModifierProperties)))) { onFail("a->pDrmFormatModifierProperties (Error: Mismatch in optional field)"); };
-    if (a->pDrmFormatModifierProperties && b->pDrmFormatModifierProperties)
-    {
-        if ((a->pDrmFormatModifierProperties) && (b->pDrmFormatModifierProperties))
-        {
-            if (!((a->drmFormatModifierCount) == (b->drmFormatModifierCount))) { onFail("a->pDrmFormatModifierProperties (Error: Lengths not equal)"); };
-            if ((a->drmFormatModifierCount) == (b->drmFormatModifierCount))
-            {
-                if (a)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)a->drmFormatModifierCount; ++i)
-                    {
-                        checkEqual_VkDrmFormatModifierProperties2EXT(a->pDrmFormatModifierProperties + i, b->pDrmFormatModifierProperties + i, onFail);
+    if (!((a->drmFormatModifierCount) == (b->drmFormatModifierCount))) {
+        onFail("a->drmFormatModifierCount (Error: Value not equal)");
+    };
+    if (!((!(a->pDrmFormatModifierProperties) && !(b->pDrmFormatModifierProperties)) ||
+          ((a->pDrmFormatModifierProperties) && (b->pDrmFormatModifierProperties)))) {
+        onFail("a->pDrmFormatModifierProperties (Error: Mismatch in optional field)");
+    };
+    if (a->pDrmFormatModifierProperties && b->pDrmFormatModifierProperties) {
+        if ((a->pDrmFormatModifierProperties) && (b->pDrmFormatModifierProperties)) {
+            if (!((a->drmFormatModifierCount) == (b->drmFormatModifierCount))) {
+                onFail("a->pDrmFormatModifierProperties (Error: Lengths not equal)");
+            };
+            if ((a->drmFormatModifierCount) == (b->drmFormatModifierCount)) {
+                if (a) {
+                    for (uint32_t i = 0; i < (uint32_t)a->drmFormatModifierCount; ++i) {
+                        checkEqual_VkDrmFormatModifierProperties2EXT(
+                            a->pDrmFormatModifierProperties + i,
+                            b->pDrmFormatModifierProperties + i, onFail);
                     }
                 }
             }
@@ -9548,31 +12919,35 @@
 
 #endif
 #ifdef VK_EXT_validation_cache
-void checkEqual_VkValidationCacheCreateInfoEXT(
-    const VkValidationCacheCreateInfoEXT* a,
-    const VkValidationCacheCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkValidationCacheCreateInfoEXT(const VkValidationCacheCreateInfoEXT* a,
+                                               const VkValidationCacheCreateInfoEXT* b,
+                                               OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->initialDataSize) == (b->initialDataSize))) { onFail("a->initialDataSize (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->initialDataSize) == (b->initialDataSize))) {
+        onFail("a->initialDataSize (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkShaderModuleValidationCacheCreateInfoEXT(
     const VkShaderModuleValidationCacheCreateInfoEXT* a,
-    const VkShaderModuleValidationCacheCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkShaderModuleValidationCacheCreateInfoEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->validationCache) == (b->validationCache))) { onFail("a->validationCache (Error: Value not equal)"); };
+    if (!((a->validationCache) == (b->validationCache))) {
+        onFail("a->validationCache (Error: Value not equal)");
+    };
 }
 
 #endif
@@ -9581,41 +12956,50 @@
 #ifdef VK_EXT_shader_viewport_index_layer
 #endif
 #ifdef VK_NV_shading_rate_image
-void checkEqual_VkShadingRatePaletteNV(
-    const VkShadingRatePaletteNV* a,
-    const VkShadingRatePaletteNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->shadingRatePaletteEntryCount) == (b->shadingRatePaletteEntryCount))) { onFail("a->shadingRatePaletteEntryCount (Error: Value not equal)"); };
-    if (!((a->shadingRatePaletteEntryCount) == (b->shadingRatePaletteEntryCount))) { onFail("a->pShadingRatePaletteEntries (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pShadingRatePaletteEntries, b->pShadingRatePaletteEntries, a->shadingRatePaletteEntryCount * sizeof(const VkShadingRatePaletteEntryNV)) == 0))) { onFail("a->pShadingRatePaletteEntries (Error: Unequal dyn array)"); };
+void checkEqual_VkShadingRatePaletteNV(const VkShadingRatePaletteNV* a,
+                                       const VkShadingRatePaletteNV* b, OnFailCompareFunc onFail) {
+    if (!((a->shadingRatePaletteEntryCount) == (b->shadingRatePaletteEntryCount))) {
+        onFail("a->shadingRatePaletteEntryCount (Error: Value not equal)");
+    };
+    if (!((a->shadingRatePaletteEntryCount) == (b->shadingRatePaletteEntryCount))) {
+        onFail("a->pShadingRatePaletteEntries (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pShadingRatePaletteEntries, b->pShadingRatePaletteEntries,
+                  a->shadingRatePaletteEntryCount * sizeof(const VkShadingRatePaletteEntryNV)) ==
+           0))) {
+        onFail("a->pShadingRatePaletteEntries (Error: Unequal dyn array)");
+    };
 }
 
 void checkEqual_VkPipelineViewportShadingRateImageStateCreateInfoNV(
     const VkPipelineViewportShadingRateImageStateCreateInfoNV* a,
-    const VkPipelineViewportShadingRateImageStateCreateInfoNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPipelineViewportShadingRateImageStateCreateInfoNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->shadingRateImageEnable) == (b->shadingRateImageEnable))) { onFail("a->shadingRateImageEnable (Error: Value not equal)"); };
-    if (!((a->viewportCount) == (b->viewportCount))) { onFail("a->viewportCount (Error: Value not equal)"); };
-    if (!((!(a->pShadingRatePalettes) && !(b->pShadingRatePalettes)) || ((a->pShadingRatePalettes) && (b->pShadingRatePalettes)))) { onFail("a->pShadingRatePalettes (Error: Mismatch in optional field)"); };
-    if (a->pShadingRatePalettes && b->pShadingRatePalettes)
-    {
-        if ((a->pShadingRatePalettes) && (b->pShadingRatePalettes))
-        {
-            if (!((a->viewportCount) == (b->viewportCount))) { onFail("a->pShadingRatePalettes (Error: Lengths not equal)"); };
-            if ((a->viewportCount) == (b->viewportCount))
-            {
-                if (a)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)a->viewportCount; ++i)
-                    {
-                        checkEqual_VkShadingRatePaletteNV(a->pShadingRatePalettes + i, b->pShadingRatePalettes + i, onFail);
+    if (!((a->shadingRateImageEnable) == (b->shadingRateImageEnable))) {
+        onFail("a->shadingRateImageEnable (Error: Value not equal)");
+    };
+    if (!((a->viewportCount) == (b->viewportCount))) {
+        onFail("a->viewportCount (Error: Value not equal)");
+    };
+    if (!((!(a->pShadingRatePalettes) && !(b->pShadingRatePalettes)) ||
+          ((a->pShadingRatePalettes) && (b->pShadingRatePalettes)))) {
+        onFail("a->pShadingRatePalettes (Error: Mismatch in optional field)");
+    };
+    if (a->pShadingRatePalettes && b->pShadingRatePalettes) {
+        if ((a->pShadingRatePalettes) && (b->pShadingRatePalettes)) {
+            if (!((a->viewportCount) == (b->viewportCount))) {
+                onFail("a->pShadingRatePalettes (Error: Lengths not equal)");
+            };
+            if ((a->viewportCount) == (b->viewportCount)) {
+                if (a) {
+                    for (uint32_t i = 0; i < (uint32_t)a->viewportCount; ++i) {
+                        checkEqual_VkShadingRatePaletteNV(a->pShadingRatePalettes + i,
+                                                          b->pShadingRatePalettes + i, onFail);
                     }
                 }
             }
@@ -9625,61 +13009,74 @@
 
 void checkEqual_VkPhysicalDeviceShadingRateImageFeaturesNV(
     const VkPhysicalDeviceShadingRateImageFeaturesNV* a,
-    const VkPhysicalDeviceShadingRateImageFeaturesNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceShadingRateImageFeaturesNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->shadingRateImage) == (b->shadingRateImage))) { onFail("a->shadingRateImage (Error: Value not equal)"); };
-    if (!((a->shadingRateCoarseSampleOrder) == (b->shadingRateCoarseSampleOrder))) { onFail("a->shadingRateCoarseSampleOrder (Error: Value not equal)"); };
+    if (!((a->shadingRateImage) == (b->shadingRateImage))) {
+        onFail("a->shadingRateImage (Error: Value not equal)");
+    };
+    if (!((a->shadingRateCoarseSampleOrder) == (b->shadingRateCoarseSampleOrder))) {
+        onFail("a->shadingRateCoarseSampleOrder (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceShadingRateImagePropertiesNV(
     const VkPhysicalDeviceShadingRateImagePropertiesNV* a,
-    const VkPhysicalDeviceShadingRateImagePropertiesNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceShadingRateImagePropertiesNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
     checkEqual_VkExtent2D(&a->shadingRateTexelSize, &b->shadingRateTexelSize, onFail);
-    if (!((a->shadingRatePaletteSize) == (b->shadingRatePaletteSize))) { onFail("a->shadingRatePaletteSize (Error: Value not equal)"); };
-    if (!((a->shadingRateMaxCoarseSamples) == (b->shadingRateMaxCoarseSamples))) { onFail("a->shadingRateMaxCoarseSamples (Error: Value not equal)"); };
+    if (!((a->shadingRatePaletteSize) == (b->shadingRatePaletteSize))) {
+        onFail("a->shadingRatePaletteSize (Error: Value not equal)");
+    };
+    if (!((a->shadingRateMaxCoarseSamples) == (b->shadingRateMaxCoarseSamples))) {
+        onFail("a->shadingRateMaxCoarseSamples (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkCoarseSampleLocationNV(
-    const VkCoarseSampleLocationNV* a,
-    const VkCoarseSampleLocationNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->pixelX) == (b->pixelX))) { onFail("a->pixelX (Error: Value not equal)"); };
-    if (!((a->pixelY) == (b->pixelY))) { onFail("a->pixelY (Error: Value not equal)"); };
-    if (!((a->sample) == (b->sample))) { onFail("a->sample (Error: Value not equal)"); };
+void checkEqual_VkCoarseSampleLocationNV(const VkCoarseSampleLocationNV* a,
+                                         const VkCoarseSampleLocationNV* b,
+                                         OnFailCompareFunc onFail) {
+    if (!((a->pixelX) == (b->pixelX))) {
+        onFail("a->pixelX (Error: Value not equal)");
+    };
+    if (!((a->pixelY) == (b->pixelY))) {
+        onFail("a->pixelY (Error: Value not equal)");
+    };
+    if (!((a->sample) == (b->sample))) {
+        onFail("a->sample (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkCoarseSampleOrderCustomNV(
-    const VkCoarseSampleOrderCustomNV* a,
-    const VkCoarseSampleOrderCustomNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->shadingRate) == (b->shadingRate))) { onFail("a->shadingRate (Error: Value not equal)"); };
-    if (!((a->sampleCount) == (b->sampleCount))) { onFail("a->sampleCount (Error: Value not equal)"); };
-    if (!((a->sampleLocationCount) == (b->sampleLocationCount))) { onFail("a->sampleLocationCount (Error: Value not equal)"); };
-    if ((a->pSampleLocations) && (b->pSampleLocations))
-    {
-        if (!((a->sampleLocationCount) == (b->sampleLocationCount))) { onFail("a->pSampleLocations (Error: Lengths not equal)"); };
-        if ((a->sampleLocationCount) == (b->sampleLocationCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->sampleLocationCount; ++i)
-                {
-                    checkEqual_VkCoarseSampleLocationNV(a->pSampleLocations + i, b->pSampleLocations + i, onFail);
+void checkEqual_VkCoarseSampleOrderCustomNV(const VkCoarseSampleOrderCustomNV* a,
+                                            const VkCoarseSampleOrderCustomNV* b,
+                                            OnFailCompareFunc onFail) {
+    if (!((a->shadingRate) == (b->shadingRate))) {
+        onFail("a->shadingRate (Error: Value not equal)");
+    };
+    if (!((a->sampleCount) == (b->sampleCount))) {
+        onFail("a->sampleCount (Error: Value not equal)");
+    };
+    if (!((a->sampleLocationCount) == (b->sampleLocationCount))) {
+        onFail("a->sampleLocationCount (Error: Value not equal)");
+    };
+    if ((a->pSampleLocations) && (b->pSampleLocations)) {
+        if (!((a->sampleLocationCount) == (b->sampleLocationCount))) {
+            onFail("a->pSampleLocations (Error: Lengths not equal)");
+        };
+        if ((a->sampleLocationCount) == (b->sampleLocationCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->sampleLocationCount; ++i) {
+                    checkEqual_VkCoarseSampleLocationNV(a->pSampleLocations + i,
+                                                        b->pSampleLocations + i, onFail);
                 }
             }
         }
@@ -9688,26 +13085,28 @@
 
 void checkEqual_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(
     const VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* a,
-    const VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->sampleOrderType) == (b->sampleOrderType))) { onFail("a->sampleOrderType (Error: Value not equal)"); };
-    if (!((a->customSampleOrderCount) == (b->customSampleOrderCount))) { onFail("a->customSampleOrderCount (Error: Value not equal)"); };
-    if ((a->pCustomSampleOrders) && (b->pCustomSampleOrders))
-    {
-        if (!((a->customSampleOrderCount) == (b->customSampleOrderCount))) { onFail("a->pCustomSampleOrders (Error: Lengths not equal)"); };
-        if ((a->customSampleOrderCount) == (b->customSampleOrderCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->customSampleOrderCount; ++i)
-                {
-                    checkEqual_VkCoarseSampleOrderCustomNV(a->pCustomSampleOrders + i, b->pCustomSampleOrders + i, onFail);
+    if (!((a->sampleOrderType) == (b->sampleOrderType))) {
+        onFail("a->sampleOrderType (Error: Value not equal)");
+    };
+    if (!((a->customSampleOrderCount) == (b->customSampleOrderCount))) {
+        onFail("a->customSampleOrderCount (Error: Value not equal)");
+    };
+    if ((a->pCustomSampleOrders) && (b->pCustomSampleOrders)) {
+        if (!((a->customSampleOrderCount) == (b->customSampleOrderCount))) {
+            onFail("a->pCustomSampleOrders (Error: Lengths not equal)");
+        };
+        if ((a->customSampleOrderCount) == (b->customSampleOrderCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->customSampleOrderCount; ++i) {
+                    checkEqual_VkCoarseSampleOrderCustomNV(a->pCustomSampleOrders + i,
+                                                           b->pCustomSampleOrders + i, onFail);
                 }
             }
         }
@@ -9716,156 +13115,206 @@
 
 #endif
 #ifdef VK_NV_ray_tracing
-void checkEqual_VkRayTracingShaderGroupCreateInfoNV(
-    const VkRayTracingShaderGroupCreateInfoNV* a,
-    const VkRayTracingShaderGroupCreateInfoNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkRayTracingShaderGroupCreateInfoNV(const VkRayTracingShaderGroupCreateInfoNV* a,
+                                                    const VkRayTracingShaderGroupCreateInfoNV* b,
+                                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->type) == (b->type))) { onFail("a->type (Error: Value not equal)"); };
-    if (!((a->generalShader) == (b->generalShader))) { onFail("a->generalShader (Error: Value not equal)"); };
-    if (!((a->closestHitShader) == (b->closestHitShader))) { onFail("a->closestHitShader (Error: Value not equal)"); };
-    if (!((a->anyHitShader) == (b->anyHitShader))) { onFail("a->anyHitShader (Error: Value not equal)"); };
-    if (!((a->intersectionShader) == (b->intersectionShader))) { onFail("a->intersectionShader (Error: Value not equal)"); };
+    if (!((a->type) == (b->type))) {
+        onFail("a->type (Error: Value not equal)");
+    };
+    if (!((a->generalShader) == (b->generalShader))) {
+        onFail("a->generalShader (Error: Value not equal)");
+    };
+    if (!((a->closestHitShader) == (b->closestHitShader))) {
+        onFail("a->closestHitShader (Error: Value not equal)");
+    };
+    if (!((a->anyHitShader) == (b->anyHitShader))) {
+        onFail("a->anyHitShader (Error: Value not equal)");
+    };
+    if (!((a->intersectionShader) == (b->intersectionShader))) {
+        onFail("a->intersectionShader (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkRayTracingPipelineCreateInfoNV(
-    const VkRayTracingPipelineCreateInfoNV* a,
-    const VkRayTracingPipelineCreateInfoNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkRayTracingPipelineCreateInfoNV(const VkRayTracingPipelineCreateInfoNV* a,
+                                                 const VkRayTracingPipelineCreateInfoNV* b,
+                                                 OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->stageCount) == (b->stageCount))) { onFail("a->stageCount (Error: Value not equal)"); };
-    if ((a->pStages) && (b->pStages))
-    {
-        if (!((a->stageCount) == (b->stageCount))) { onFail("a->pStages (Error: Lengths not equal)"); };
-        if ((a->stageCount) == (b->stageCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->stageCount; ++i)
-                {
-                    checkEqual_VkPipelineShaderStageCreateInfo(a->pStages + i, b->pStages + i, onFail);
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->stageCount) == (b->stageCount))) {
+        onFail("a->stageCount (Error: Value not equal)");
+    };
+    if ((a->pStages) && (b->pStages)) {
+        if (!((a->stageCount) == (b->stageCount))) {
+            onFail("a->pStages (Error: Lengths not equal)");
+        };
+        if ((a->stageCount) == (b->stageCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->stageCount; ++i) {
+                    checkEqual_VkPipelineShaderStageCreateInfo(a->pStages + i, b->pStages + i,
+                                                               onFail);
                 }
             }
         }
     }
-    if (!((a->groupCount) == (b->groupCount))) { onFail("a->groupCount (Error: Value not equal)"); };
-    if ((a->pGroups) && (b->pGroups))
-    {
-        if (!((a->groupCount) == (b->groupCount))) { onFail("a->pGroups (Error: Lengths not equal)"); };
-        if ((a->groupCount) == (b->groupCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->groupCount; ++i)
-                {
-                    checkEqual_VkRayTracingShaderGroupCreateInfoNV(a->pGroups + i, b->pGroups + i, onFail);
+    if (!((a->groupCount) == (b->groupCount))) {
+        onFail("a->groupCount (Error: Value not equal)");
+    };
+    if ((a->pGroups) && (b->pGroups)) {
+        if (!((a->groupCount) == (b->groupCount))) {
+            onFail("a->pGroups (Error: Lengths not equal)");
+        };
+        if ((a->groupCount) == (b->groupCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->groupCount; ++i) {
+                    checkEqual_VkRayTracingShaderGroupCreateInfoNV(a->pGroups + i, b->pGroups + i,
+                                                                   onFail);
                 }
             }
         }
     }
-    if (!((a->maxRecursionDepth) == (b->maxRecursionDepth))) { onFail("a->maxRecursionDepth (Error: Value not equal)"); };
-    if (!((a->layout) == (b->layout))) { onFail("a->layout (Error: Value not equal)"); };
-    if (!((a->basePipelineHandle) == (b->basePipelineHandle))) { onFail("a->basePipelineHandle (Error: Value not equal)"); };
-    if (!((a->basePipelineIndex) == (b->basePipelineIndex))) { onFail("a->basePipelineIndex (Error: Value not equal)"); };
+    if (!((a->maxRecursionDepth) == (b->maxRecursionDepth))) {
+        onFail("a->maxRecursionDepth (Error: Value not equal)");
+    };
+    if (!((a->layout) == (b->layout))) {
+        onFail("a->layout (Error: Value not equal)");
+    };
+    if (!((a->basePipelineHandle) == (b->basePipelineHandle))) {
+        onFail("a->basePipelineHandle (Error: Value not equal)");
+    };
+    if (!((a->basePipelineIndex) == (b->basePipelineIndex))) {
+        onFail("a->basePipelineIndex (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkGeometryTrianglesNV(
-    const VkGeometryTrianglesNV* a,
-    const VkGeometryTrianglesNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkGeometryTrianglesNV(const VkGeometryTrianglesNV* a,
+                                      const VkGeometryTrianglesNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->vertexData) == (b->vertexData))) { onFail("a->vertexData (Error: Value not equal)"); };
-    if (!((a->vertexOffset) == (b->vertexOffset))) { onFail("a->vertexOffset (Error: Value not equal)"); };
-    if (!((a->vertexCount) == (b->vertexCount))) { onFail("a->vertexCount (Error: Value not equal)"); };
-    if (!((a->vertexStride) == (b->vertexStride))) { onFail("a->vertexStride (Error: Value not equal)"); };
-    if (!((a->vertexFormat) == (b->vertexFormat))) { onFail("a->vertexFormat (Error: Value not equal)"); };
-    if (!((a->indexData) == (b->indexData))) { onFail("a->indexData (Error: Value not equal)"); };
-    if (!((a->indexOffset) == (b->indexOffset))) { onFail("a->indexOffset (Error: Value not equal)"); };
-    if (!((a->indexCount) == (b->indexCount))) { onFail("a->indexCount (Error: Value not equal)"); };
-    if (!((a->indexType) == (b->indexType))) { onFail("a->indexType (Error: Value not equal)"); };
-    if (!((a->transformData) == (b->transformData))) { onFail("a->transformData (Error: Value not equal)"); };
-    if (!((a->transformOffset) == (b->transformOffset))) { onFail("a->transformOffset (Error: Value not equal)"); };
+    if (!((a->vertexData) == (b->vertexData))) {
+        onFail("a->vertexData (Error: Value not equal)");
+    };
+    if (!((a->vertexOffset) == (b->vertexOffset))) {
+        onFail("a->vertexOffset (Error: Value not equal)");
+    };
+    if (!((a->vertexCount) == (b->vertexCount))) {
+        onFail("a->vertexCount (Error: Value not equal)");
+    };
+    if (!((a->vertexStride) == (b->vertexStride))) {
+        onFail("a->vertexStride (Error: Value not equal)");
+    };
+    if (!((a->vertexFormat) == (b->vertexFormat))) {
+        onFail("a->vertexFormat (Error: Value not equal)");
+    };
+    if (!((a->indexData) == (b->indexData))) {
+        onFail("a->indexData (Error: Value not equal)");
+    };
+    if (!((a->indexOffset) == (b->indexOffset))) {
+        onFail("a->indexOffset (Error: Value not equal)");
+    };
+    if (!((a->indexCount) == (b->indexCount))) {
+        onFail("a->indexCount (Error: Value not equal)");
+    };
+    if (!((a->indexType) == (b->indexType))) {
+        onFail("a->indexType (Error: Value not equal)");
+    };
+    if (!((a->transformData) == (b->transformData))) {
+        onFail("a->transformData (Error: Value not equal)");
+    };
+    if (!((a->transformOffset) == (b->transformOffset))) {
+        onFail("a->transformOffset (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkGeometryAABBNV(
-    const VkGeometryAABBNV* a,
-    const VkGeometryAABBNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkGeometryAABBNV(const VkGeometryAABBNV* a, const VkGeometryAABBNV* b,
+                                 OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->aabbData) == (b->aabbData))) { onFail("a->aabbData (Error: Value not equal)"); };
-    if (!((a->numAABBs) == (b->numAABBs))) { onFail("a->numAABBs (Error: Value not equal)"); };
-    if (!((a->stride) == (b->stride))) { onFail("a->stride (Error: Value not equal)"); };
-    if (!((a->offset) == (b->offset))) { onFail("a->offset (Error: Value not equal)"); };
+    if (!((a->aabbData) == (b->aabbData))) {
+        onFail("a->aabbData (Error: Value not equal)");
+    };
+    if (!((a->numAABBs) == (b->numAABBs))) {
+        onFail("a->numAABBs (Error: Value not equal)");
+    };
+    if (!((a->stride) == (b->stride))) {
+        onFail("a->stride (Error: Value not equal)");
+    };
+    if (!((a->offset) == (b->offset))) {
+        onFail("a->offset (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkGeometryDataNV(
-    const VkGeometryDataNV* a,
-    const VkGeometryDataNV* b,
-    OnFailCompareFunc onFail)
-{
+void checkEqual_VkGeometryDataNV(const VkGeometryDataNV* a, const VkGeometryDataNV* b,
+                                 OnFailCompareFunc onFail) {
     checkEqual_VkGeometryTrianglesNV(&a->triangles, &b->triangles, onFail);
     checkEqual_VkGeometryAABBNV(&a->aabbs, &b->aabbs, onFail);
 }
 
-void checkEqual_VkGeometryNV(
-    const VkGeometryNV* a,
-    const VkGeometryNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkGeometryNV(const VkGeometryNV* a, const VkGeometryNV* b,
+                             OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->geometryType) == (b->geometryType))) { onFail("a->geometryType (Error: Value not equal)"); };
+    if (!((a->geometryType) == (b->geometryType))) {
+        onFail("a->geometryType (Error: Value not equal)");
+    };
     checkEqual_VkGeometryDataNV(&a->geometry, &b->geometry, onFail);
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkAccelerationStructureInfoNV(
-    const VkAccelerationStructureInfoNV* a,
-    const VkAccelerationStructureInfoNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkAccelerationStructureInfoNV(const VkAccelerationStructureInfoNV* a,
+                                              const VkAccelerationStructureInfoNV* b,
+                                              OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->type) == (b->type))) { onFail("a->type (Error: Value not equal)"); };
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->instanceCount) == (b->instanceCount))) { onFail("a->instanceCount (Error: Value not equal)"); };
-    if (!((a->geometryCount) == (b->geometryCount))) { onFail("a->geometryCount (Error: Value not equal)"); };
-    if ((a->pGeometries) && (b->pGeometries))
-    {
-        if (!((a->geometryCount) == (b->geometryCount))) { onFail("a->pGeometries (Error: Lengths not equal)"); };
-        if ((a->geometryCount) == (b->geometryCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->geometryCount; ++i)
-                {
+    if (!((a->type) == (b->type))) {
+        onFail("a->type (Error: Value not equal)");
+    };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->instanceCount) == (b->instanceCount))) {
+        onFail("a->instanceCount (Error: Value not equal)");
+    };
+    if (!((a->geometryCount) == (b->geometryCount))) {
+        onFail("a->geometryCount (Error: Value not equal)");
+    };
+    if ((a->pGeometries) && (b->pGeometries)) {
+        if (!((a->geometryCount) == (b->geometryCount))) {
+            onFail("a->pGeometries (Error: Lengths not equal)");
+        };
+        if ((a->geometryCount) == (b->geometryCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->geometryCount; ++i) {
                     checkEqual_VkGeometryNV(a->pGeometries + i, b->pGeometries + i, onFail);
                 }
             }
@@ -9873,180 +13322,244 @@
     }
 }
 
-void checkEqual_VkAccelerationStructureCreateInfoNV(
-    const VkAccelerationStructureCreateInfoNV* a,
-    const VkAccelerationStructureCreateInfoNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkAccelerationStructureCreateInfoNV(const VkAccelerationStructureCreateInfoNV* a,
+                                                    const VkAccelerationStructureCreateInfoNV* b,
+                                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->compactedSize) == (b->compactedSize))) { onFail("a->compactedSize (Error: Value not equal)"); };
+    if (!((a->compactedSize) == (b->compactedSize))) {
+        onFail("a->compactedSize (Error: Value not equal)");
+    };
     checkEqual_VkAccelerationStructureInfoNV(&a->info, &b->info, onFail);
 }
 
 void checkEqual_VkBindAccelerationStructureMemoryInfoNV(
     const VkBindAccelerationStructureMemoryInfoNV* a,
-    const VkBindAccelerationStructureMemoryInfoNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkBindAccelerationStructureMemoryInfoNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->accelerationStructure) == (b->accelerationStructure))) { onFail("a->accelerationStructure (Error: Value not equal)"); };
-    if (!((a->memory) == (b->memory))) { onFail("a->memory (Error: Value not equal)"); };
-    if (!((a->memoryOffset) == (b->memoryOffset))) { onFail("a->memoryOffset (Error: Value not equal)"); };
-    if (!((a->deviceIndexCount) == (b->deviceIndexCount))) { onFail("a->deviceIndexCount (Error: Value not equal)"); };
-    if (!((a->deviceIndexCount) == (b->deviceIndexCount))) { onFail("a->pDeviceIndices (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pDeviceIndices, b->pDeviceIndices, a->deviceIndexCount * sizeof(const uint32_t)) == 0))) { onFail("a->pDeviceIndices (Error: Unequal dyn array)"); };
+    if (!((a->accelerationStructure) == (b->accelerationStructure))) {
+        onFail("a->accelerationStructure (Error: Value not equal)");
+    };
+    if (!((a->memory) == (b->memory))) {
+        onFail("a->memory (Error: Value not equal)");
+    };
+    if (!((a->memoryOffset) == (b->memoryOffset))) {
+        onFail("a->memoryOffset (Error: Value not equal)");
+    };
+    if (!((a->deviceIndexCount) == (b->deviceIndexCount))) {
+        onFail("a->deviceIndexCount (Error: Value not equal)");
+    };
+    if (!((a->deviceIndexCount) == (b->deviceIndexCount))) {
+        onFail("a->pDeviceIndices (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pDeviceIndices, b->pDeviceIndices,
+                  a->deviceIndexCount * sizeof(const uint32_t)) == 0))) {
+        onFail("a->pDeviceIndices (Error: Unequal dyn array)");
+    };
 }
 
 void checkEqual_VkWriteDescriptorSetAccelerationStructureNV(
     const VkWriteDescriptorSetAccelerationStructureNV* a,
-    const VkWriteDescriptorSetAccelerationStructureNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkWriteDescriptorSetAccelerationStructureNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->accelerationStructureCount) == (b->accelerationStructureCount))) { onFail("a->accelerationStructureCount (Error: Value not equal)"); };
-    if (!((!(a->pAccelerationStructures) && !(b->pAccelerationStructures)) || ((a->pAccelerationStructures) && (b->pAccelerationStructures)))) { onFail("a->pAccelerationStructures (Error: Mismatch in optional field)"); };
-    if (a->pAccelerationStructures && b->pAccelerationStructures)
-    {
-        if (!((a->accelerationStructureCount) == (b->accelerationStructureCount))) { onFail("a->pAccelerationStructures (Error: Lengths not equal)"); };
-        if (!((memcmp(a->pAccelerationStructures, b->pAccelerationStructures, a->accelerationStructureCount * sizeof(const VkAccelerationStructureNV)) == 0))) { onFail("a->pAccelerationStructures (Error: Unequal dyn array)"); };
+    if (!((a->accelerationStructureCount) == (b->accelerationStructureCount))) {
+        onFail("a->accelerationStructureCount (Error: Value not equal)");
+    };
+    if (!((!(a->pAccelerationStructures) && !(b->pAccelerationStructures)) ||
+          ((a->pAccelerationStructures) && (b->pAccelerationStructures)))) {
+        onFail("a->pAccelerationStructures (Error: Mismatch in optional field)");
+    };
+    if (a->pAccelerationStructures && b->pAccelerationStructures) {
+        if (!((a->accelerationStructureCount) == (b->accelerationStructureCount))) {
+            onFail("a->pAccelerationStructures (Error: Lengths not equal)");
+        };
+        if (!((memcmp(a->pAccelerationStructures, b->pAccelerationStructures,
+                      a->accelerationStructureCount * sizeof(const VkAccelerationStructureNV)) ==
+               0))) {
+            onFail("a->pAccelerationStructures (Error: Unequal dyn array)");
+        };
     }
 }
 
 void checkEqual_VkAccelerationStructureMemoryRequirementsInfoNV(
     const VkAccelerationStructureMemoryRequirementsInfoNV* a,
-    const VkAccelerationStructureMemoryRequirementsInfoNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkAccelerationStructureMemoryRequirementsInfoNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->type) == (b->type))) { onFail("a->type (Error: Value not equal)"); };
-    if (!((a->accelerationStructure) == (b->accelerationStructure))) { onFail("a->accelerationStructure (Error: Value not equal)"); };
+    if (!((a->type) == (b->type))) {
+        onFail("a->type (Error: Value not equal)");
+    };
+    if (!((a->accelerationStructure) == (b->accelerationStructure))) {
+        onFail("a->accelerationStructure (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceRayTracingPropertiesNV(
     const VkPhysicalDeviceRayTracingPropertiesNV* a,
-    const VkPhysicalDeviceRayTracingPropertiesNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceRayTracingPropertiesNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->shaderGroupHandleSize) == (b->shaderGroupHandleSize))) { onFail("a->shaderGroupHandleSize (Error: Value not equal)"); };
-    if (!((a->maxRecursionDepth) == (b->maxRecursionDepth))) { onFail("a->maxRecursionDepth (Error: Value not equal)"); };
-    if (!((a->maxShaderGroupStride) == (b->maxShaderGroupStride))) { onFail("a->maxShaderGroupStride (Error: Value not equal)"); };
-    if (!((a->shaderGroupBaseAlignment) == (b->shaderGroupBaseAlignment))) { onFail("a->shaderGroupBaseAlignment (Error: Value not equal)"); };
-    if (!((a->maxGeometryCount) == (b->maxGeometryCount))) { onFail("a->maxGeometryCount (Error: Value not equal)"); };
-    if (!((a->maxInstanceCount) == (b->maxInstanceCount))) { onFail("a->maxInstanceCount (Error: Value not equal)"); };
-    if (!((a->maxTriangleCount) == (b->maxTriangleCount))) { onFail("a->maxTriangleCount (Error: Value not equal)"); };
-    if (!((a->maxDescriptorSetAccelerationStructures) == (b->maxDescriptorSetAccelerationStructures))) { onFail("a->maxDescriptorSetAccelerationStructures (Error: Value not equal)"); };
+    if (!((a->shaderGroupHandleSize) == (b->shaderGroupHandleSize))) {
+        onFail("a->shaderGroupHandleSize (Error: Value not equal)");
+    };
+    if (!((a->maxRecursionDepth) == (b->maxRecursionDepth))) {
+        onFail("a->maxRecursionDepth (Error: Value not equal)");
+    };
+    if (!((a->maxShaderGroupStride) == (b->maxShaderGroupStride))) {
+        onFail("a->maxShaderGroupStride (Error: Value not equal)");
+    };
+    if (!((a->shaderGroupBaseAlignment) == (b->shaderGroupBaseAlignment))) {
+        onFail("a->shaderGroupBaseAlignment (Error: Value not equal)");
+    };
+    if (!((a->maxGeometryCount) == (b->maxGeometryCount))) {
+        onFail("a->maxGeometryCount (Error: Value not equal)");
+    };
+    if (!((a->maxInstanceCount) == (b->maxInstanceCount))) {
+        onFail("a->maxInstanceCount (Error: Value not equal)");
+    };
+    if (!((a->maxTriangleCount) == (b->maxTriangleCount))) {
+        onFail("a->maxTriangleCount (Error: Value not equal)");
+    };
+    if (!((a->maxDescriptorSetAccelerationStructures) ==
+          (b->maxDescriptorSetAccelerationStructures))) {
+        onFail("a->maxDescriptorSetAccelerationStructures (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkTransformMatrixKHR(
-    const VkTransformMatrixKHR* a,
-    const VkTransformMatrixKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((memcmp(a->matrix, b->matrix, ((3)*(4)) * sizeof(float)) == 0))) { onFail("a->matrix (Error: Unequal static array)"); };
+void checkEqual_VkTransformMatrixKHR(const VkTransformMatrixKHR* a, const VkTransformMatrixKHR* b,
+                                     OnFailCompareFunc onFail) {
+    if (!((memcmp(a->matrix, b->matrix, ((3) * (4)) * sizeof(float)) == 0))) {
+        onFail("a->matrix (Error: Unequal static array)");
+    };
 }
 
-void checkEqual_VkAabbPositionsKHR(
-    const VkAabbPositionsKHR* a,
-    const VkAabbPositionsKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->minX) == (b->minX))) { onFail("a->minX (Error: Value not equal)"); };
-    if (!((a->minY) == (b->minY))) { onFail("a->minY (Error: Value not equal)"); };
-    if (!((a->minZ) == (b->minZ))) { onFail("a->minZ (Error: Value not equal)"); };
-    if (!((a->maxX) == (b->maxX))) { onFail("a->maxX (Error: Value not equal)"); };
-    if (!((a->maxY) == (b->maxY))) { onFail("a->maxY (Error: Value not equal)"); };
-    if (!((a->maxZ) == (b->maxZ))) { onFail("a->maxZ (Error: Value not equal)"); };
+void checkEqual_VkAabbPositionsKHR(const VkAabbPositionsKHR* a, const VkAabbPositionsKHR* b,
+                                   OnFailCompareFunc onFail) {
+    if (!((a->minX) == (b->minX))) {
+        onFail("a->minX (Error: Value not equal)");
+    };
+    if (!((a->minY) == (b->minY))) {
+        onFail("a->minY (Error: Value not equal)");
+    };
+    if (!((a->minZ) == (b->minZ))) {
+        onFail("a->minZ (Error: Value not equal)");
+    };
+    if (!((a->maxX) == (b->maxX))) {
+        onFail("a->maxX (Error: Value not equal)");
+    };
+    if (!((a->maxY) == (b->maxY))) {
+        onFail("a->maxY (Error: Value not equal)");
+    };
+    if (!((a->maxZ) == (b->maxZ))) {
+        onFail("a->maxZ (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkAccelerationStructureInstanceKHR(
-    const VkAccelerationStructureInstanceKHR* a,
-    const VkAccelerationStructureInstanceKHR* b,
-    OnFailCompareFunc onFail)
-{
+void checkEqual_VkAccelerationStructureInstanceKHR(const VkAccelerationStructureInstanceKHR* a,
+                                                   const VkAccelerationStructureInstanceKHR* b,
+                                                   OnFailCompareFunc onFail) {
     checkEqual_VkTransformMatrixKHR(&a->transform, &b->transform, onFail);
-    if (!((a->instanceCustomIndex) == (b->instanceCustomIndex))) { onFail("a->instanceCustomIndex (Error: Value not equal)"); };
-    if (!((a->mask) == (b->mask))) { onFail("a->mask (Error: Value not equal)"); };
-    if (!((a->instanceShaderBindingTableRecordOffset) == (b->instanceShaderBindingTableRecordOffset))) { onFail("a->instanceShaderBindingTableRecordOffset (Error: Value not equal)"); };
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->accelerationStructureReference) == (b->accelerationStructureReference))) { onFail("a->accelerationStructureReference (Error: Value not equal)"); };
+    if (!((a->instanceCustomIndex) == (b->instanceCustomIndex))) {
+        onFail("a->instanceCustomIndex (Error: Value not equal)");
+    };
+    if (!((a->mask) == (b->mask))) {
+        onFail("a->mask (Error: Value not equal)");
+    };
+    if (!((a->instanceShaderBindingTableRecordOffset) ==
+          (b->instanceShaderBindingTableRecordOffset))) {
+        onFail("a->instanceShaderBindingTableRecordOffset (Error: Value not equal)");
+    };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->accelerationStructureReference) == (b->accelerationStructureReference))) {
+        onFail("a->accelerationStructureReference (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_NV_representative_fragment_test
 void checkEqual_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(
     const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* a,
-    const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->representativeFragmentTest) == (b->representativeFragmentTest))) { onFail("a->representativeFragmentTest (Error: Value not equal)"); };
+    if (!((a->representativeFragmentTest) == (b->representativeFragmentTest))) {
+        onFail("a->representativeFragmentTest (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(
     const VkPipelineRepresentativeFragmentTestStateCreateInfoNV* a,
-    const VkPipelineRepresentativeFragmentTestStateCreateInfoNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPipelineRepresentativeFragmentTestStateCreateInfoNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->representativeFragmentTestEnable) == (b->representativeFragmentTestEnable))) { onFail("a->representativeFragmentTestEnable (Error: Value not equal)"); };
+    if (!((a->representativeFragmentTestEnable) == (b->representativeFragmentTestEnable))) {
+        onFail("a->representativeFragmentTestEnable (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_filter_cubic
 void checkEqual_VkPhysicalDeviceImageViewImageFormatInfoEXT(
     const VkPhysicalDeviceImageViewImageFormatInfoEXT* a,
-    const VkPhysicalDeviceImageViewImageFormatInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceImageViewImageFormatInfoEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->imageViewType) == (b->imageViewType))) { onFail("a->imageViewType (Error: Value not equal)"); };
+    if (!((a->imageViewType) == (b->imageViewType))) {
+        onFail("a->imageViewType (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkFilterCubicImageViewImageFormatPropertiesEXT(
     const VkFilterCubicImageViewImageFormatPropertiesEXT* a,
-    const VkFilterCubicImageViewImageFormatPropertiesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkFilterCubicImageViewImageFormatPropertiesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->filterCubic) == (b->filterCubic))) { onFail("a->filterCubic (Error: Value not equal)"); };
-    if (!((a->filterCubicMinmax) == (b->filterCubicMinmax))) { onFail("a->filterCubicMinmax (Error: Value not equal)"); };
+    if (!((a->filterCubic) == (b->filterCubic))) {
+        onFail("a->filterCubic (Error: Value not equal)");
+    };
+    if (!((a->filterCubicMinmax) == (b->filterCubicMinmax))) {
+        onFail("a->filterCubicMinmax (Error: Value not equal)");
+    };
 }
 
 #endif
@@ -10055,57 +13568,63 @@
 #ifdef VK_EXT_global_priority
 void checkEqual_VkDeviceQueueGlobalPriorityCreateInfoEXT(
     const VkDeviceQueueGlobalPriorityCreateInfoEXT* a,
-    const VkDeviceQueueGlobalPriorityCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkDeviceQueueGlobalPriorityCreateInfoEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->globalPriority) == (b->globalPriority))) { onFail("a->globalPriority (Error: Value not equal)"); };
+    if (!((a->globalPriority) == (b->globalPriority))) {
+        onFail("a->globalPriority (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_external_memory_host
-void checkEqual_VkImportMemoryHostPointerInfoEXT(
-    const VkImportMemoryHostPointerInfoEXT* a,
-    const VkImportMemoryHostPointerInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkImportMemoryHostPointerInfoEXT(const VkImportMemoryHostPointerInfoEXT* a,
+                                                 const VkImportMemoryHostPointerInfoEXT* b,
+                                                 OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->handleType) == (b->handleType))) { onFail("a->handleType (Error: Value not equal)"); };
-    if (!((!(a->pHostPointer) && !(b->pHostPointer)) || ((a->pHostPointer) && (b->pHostPointer)))) { onFail("a->pHostPointer (Error: Mismatch in optional field)"); };
+    if (!((a->handleType) == (b->handleType))) {
+        onFail("a->handleType (Error: Value not equal)");
+    };
+    if (!((!(a->pHostPointer) && !(b->pHostPointer)) || ((a->pHostPointer) && (b->pHostPointer)))) {
+        onFail("a->pHostPointer (Error: Mismatch in optional field)");
+    };
 }
 
-void checkEqual_VkMemoryHostPointerPropertiesEXT(
-    const VkMemoryHostPointerPropertiesEXT* a,
-    const VkMemoryHostPointerPropertiesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkMemoryHostPointerPropertiesEXT(const VkMemoryHostPointerPropertiesEXT* a,
+                                                 const VkMemoryHostPointerPropertiesEXT* b,
+                                                 OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->memoryTypeBits) == (b->memoryTypeBits))) { onFail("a->memoryTypeBits (Error: Value not equal)"); };
+    if (!((a->memoryTypeBits) == (b->memoryTypeBits))) {
+        onFail("a->memoryTypeBits (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
     const VkPhysicalDeviceExternalMemoryHostPropertiesEXT* a,
-    const VkPhysicalDeviceExternalMemoryHostPropertiesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceExternalMemoryHostPropertiesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->minImportedHostPointerAlignment) == (b->minImportedHostPointerAlignment))) { onFail("a->minImportedHostPointerAlignment (Error: Value not equal)"); };
+    if (!((a->minImportedHostPointerAlignment) == (b->minImportedHostPointerAlignment))) {
+        onFail("a->minImportedHostPointerAlignment (Error: Value not equal)");
+    };
 }
 
 #endif
@@ -10114,243 +13633,309 @@
 #ifdef VK_AMD_pipeline_compiler_control
 void checkEqual_VkPipelineCompilerControlCreateInfoAMD(
     const VkPipelineCompilerControlCreateInfoAMD* a,
-    const VkPipelineCompilerControlCreateInfoAMD* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPipelineCompilerControlCreateInfoAMD* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->compilerControlFlags) == (b->compilerControlFlags))) { onFail("a->compilerControlFlags (Error: Value not equal)"); };
+    if (!((a->compilerControlFlags) == (b->compilerControlFlags))) {
+        onFail("a->compilerControlFlags (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_calibrated_timestamps
-void checkEqual_VkCalibratedTimestampInfoEXT(
-    const VkCalibratedTimestampInfoEXT* a,
-    const VkCalibratedTimestampInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkCalibratedTimestampInfoEXT(const VkCalibratedTimestampInfoEXT* a,
+                                             const VkCalibratedTimestampInfoEXT* b,
+                                             OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->timeDomain) == (b->timeDomain))) { onFail("a->timeDomain (Error: Value not equal)"); };
+    if (!((a->timeDomain) == (b->timeDomain))) {
+        onFail("a->timeDomain (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_AMD_shader_core_properties
 void checkEqual_VkPhysicalDeviceShaderCorePropertiesAMD(
     const VkPhysicalDeviceShaderCorePropertiesAMD* a,
-    const VkPhysicalDeviceShaderCorePropertiesAMD* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceShaderCorePropertiesAMD* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->shaderEngineCount) == (b->shaderEngineCount))) { onFail("a->shaderEngineCount (Error: Value not equal)"); };
-    if (!((a->shaderArraysPerEngineCount) == (b->shaderArraysPerEngineCount))) { onFail("a->shaderArraysPerEngineCount (Error: Value not equal)"); };
-    if (!((a->computeUnitsPerShaderArray) == (b->computeUnitsPerShaderArray))) { onFail("a->computeUnitsPerShaderArray (Error: Value not equal)"); };
-    if (!((a->simdPerComputeUnit) == (b->simdPerComputeUnit))) { onFail("a->simdPerComputeUnit (Error: Value not equal)"); };
-    if (!((a->wavefrontsPerSimd) == (b->wavefrontsPerSimd))) { onFail("a->wavefrontsPerSimd (Error: Value not equal)"); };
-    if (!((a->wavefrontSize) == (b->wavefrontSize))) { onFail("a->wavefrontSize (Error: Value not equal)"); };
-    if (!((a->sgprsPerSimd) == (b->sgprsPerSimd))) { onFail("a->sgprsPerSimd (Error: Value not equal)"); };
-    if (!((a->minSgprAllocation) == (b->minSgprAllocation))) { onFail("a->minSgprAllocation (Error: Value not equal)"); };
-    if (!((a->maxSgprAllocation) == (b->maxSgprAllocation))) { onFail("a->maxSgprAllocation (Error: Value not equal)"); };
-    if (!((a->sgprAllocationGranularity) == (b->sgprAllocationGranularity))) { onFail("a->sgprAllocationGranularity (Error: Value not equal)"); };
-    if (!((a->vgprsPerSimd) == (b->vgprsPerSimd))) { onFail("a->vgprsPerSimd (Error: Value not equal)"); };
-    if (!((a->minVgprAllocation) == (b->minVgprAllocation))) { onFail("a->minVgprAllocation (Error: Value not equal)"); };
-    if (!((a->maxVgprAllocation) == (b->maxVgprAllocation))) { onFail("a->maxVgprAllocation (Error: Value not equal)"); };
-    if (!((a->vgprAllocationGranularity) == (b->vgprAllocationGranularity))) { onFail("a->vgprAllocationGranularity (Error: Value not equal)"); };
+    if (!((a->shaderEngineCount) == (b->shaderEngineCount))) {
+        onFail("a->shaderEngineCount (Error: Value not equal)");
+    };
+    if (!((a->shaderArraysPerEngineCount) == (b->shaderArraysPerEngineCount))) {
+        onFail("a->shaderArraysPerEngineCount (Error: Value not equal)");
+    };
+    if (!((a->computeUnitsPerShaderArray) == (b->computeUnitsPerShaderArray))) {
+        onFail("a->computeUnitsPerShaderArray (Error: Value not equal)");
+    };
+    if (!((a->simdPerComputeUnit) == (b->simdPerComputeUnit))) {
+        onFail("a->simdPerComputeUnit (Error: Value not equal)");
+    };
+    if (!((a->wavefrontsPerSimd) == (b->wavefrontsPerSimd))) {
+        onFail("a->wavefrontsPerSimd (Error: Value not equal)");
+    };
+    if (!((a->wavefrontSize) == (b->wavefrontSize))) {
+        onFail("a->wavefrontSize (Error: Value not equal)");
+    };
+    if (!((a->sgprsPerSimd) == (b->sgprsPerSimd))) {
+        onFail("a->sgprsPerSimd (Error: Value not equal)");
+    };
+    if (!((a->minSgprAllocation) == (b->minSgprAllocation))) {
+        onFail("a->minSgprAllocation (Error: Value not equal)");
+    };
+    if (!((a->maxSgprAllocation) == (b->maxSgprAllocation))) {
+        onFail("a->maxSgprAllocation (Error: Value not equal)");
+    };
+    if (!((a->sgprAllocationGranularity) == (b->sgprAllocationGranularity))) {
+        onFail("a->sgprAllocationGranularity (Error: Value not equal)");
+    };
+    if (!((a->vgprsPerSimd) == (b->vgprsPerSimd))) {
+        onFail("a->vgprsPerSimd (Error: Value not equal)");
+    };
+    if (!((a->minVgprAllocation) == (b->minVgprAllocation))) {
+        onFail("a->minVgprAllocation (Error: Value not equal)");
+    };
+    if (!((a->maxVgprAllocation) == (b->maxVgprAllocation))) {
+        onFail("a->maxVgprAllocation (Error: Value not equal)");
+    };
+    if (!((a->vgprAllocationGranularity) == (b->vgprAllocationGranularity))) {
+        onFail("a->vgprAllocationGranularity (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_video_decode_h265
-void checkEqual_VkVideoDecodeH265ProfileEXT(
-    const VkVideoDecodeH265ProfileEXT* a,
-    const VkVideoDecodeH265ProfileEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkVideoDecodeH265ProfileEXT(const VkVideoDecodeH265ProfileEXT* a,
+                                            const VkVideoDecodeH265ProfileEXT* b,
+                                            OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->stdProfileIdc) == (b->stdProfileIdc))) { onFail("a->stdProfileIdc (Error: Value not equal)"); };
+    if (!((a->stdProfileIdc) == (b->stdProfileIdc))) {
+        onFail("a->stdProfileIdc (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkVideoDecodeH265CapabilitiesEXT(
-    const VkVideoDecodeH265CapabilitiesEXT* a,
-    const VkVideoDecodeH265CapabilitiesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkVideoDecodeH265CapabilitiesEXT(const VkVideoDecodeH265CapabilitiesEXT* a,
+                                                 const VkVideoDecodeH265CapabilitiesEXT* b,
+                                                 OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->maxLevel) == (b->maxLevel))) { onFail("a->maxLevel (Error: Value not equal)"); };
+    if (!((a->maxLevel) == (b->maxLevel))) {
+        onFail("a->maxLevel (Error: Value not equal)");
+    };
     checkEqual_VkExtensionProperties(&a->stdExtensionVersion, &b->stdExtensionVersion, onFail);
 }
 
 void checkEqual_VkVideoDecodeH265SessionCreateInfoEXT(
-    const VkVideoDecodeH265SessionCreateInfoEXT* a,
-    const VkVideoDecodeH265SessionCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkVideoDecodeH265SessionCreateInfoEXT* a, const VkVideoDecodeH265SessionCreateInfoEXT* b,
+    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if ((a->pStdExtensionVersion) && (b->pStdExtensionVersion))
-    {
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if ((a->pStdExtensionVersion) && (b->pStdExtensionVersion)) {
         checkEqual_VkExtensionProperties(a->pStdExtensionVersion, b->pStdExtensionVersion, onFail);
     }
 }
 
 void checkEqual_VkVideoDecodeH265SessionParametersAddInfoEXT(
     const VkVideoDecodeH265SessionParametersAddInfoEXT* a,
-    const VkVideoDecodeH265SessionParametersAddInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkVideoDecodeH265SessionParametersAddInfoEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->spsStdCount) == (b->spsStdCount))) { onFail("a->spsStdCount (Error: Value not equal)"); };
-    if (!((!(a->pSpsStd) && !(b->pSpsStd)) || ((a->pSpsStd) && (b->pSpsStd)))) { onFail("a->pSpsStd (Error: Mismatch in optional field)"); };
-    if (a->pSpsStd && b->pSpsStd)
-    {
-        if (!((a->spsStdCount) == (b->spsStdCount))) { onFail("a->pSpsStd (Error: Lengths not equal)"); };
-        if (!((memcmp(a->pSpsStd, b->pSpsStd, a->spsStdCount * sizeof(const StdVideoH265SequenceParameterSet)) == 0))) { onFail("a->pSpsStd (Error: Unequal dyn array)"); };
+    if (!((a->spsStdCount) == (b->spsStdCount))) {
+        onFail("a->spsStdCount (Error: Value not equal)");
+    };
+    if (!((!(a->pSpsStd) && !(b->pSpsStd)) || ((a->pSpsStd) && (b->pSpsStd)))) {
+        onFail("a->pSpsStd (Error: Mismatch in optional field)");
+    };
+    if (a->pSpsStd && b->pSpsStd) {
+        if (!((a->spsStdCount) == (b->spsStdCount))) {
+            onFail("a->pSpsStd (Error: Lengths not equal)");
+        };
+        if (!((memcmp(a->pSpsStd, b->pSpsStd,
+                      a->spsStdCount * sizeof(const StdVideoH265SequenceParameterSet)) == 0))) {
+            onFail("a->pSpsStd (Error: Unequal dyn array)");
+        };
     }
-    if (!((a->ppsStdCount) == (b->ppsStdCount))) { onFail("a->ppsStdCount (Error: Value not equal)"); };
-    if (!((!(a->pPpsStd) && !(b->pPpsStd)) || ((a->pPpsStd) && (b->pPpsStd)))) { onFail("a->pPpsStd (Error: Mismatch in optional field)"); };
-    if (a->pPpsStd && b->pPpsStd)
-    {
-        if (!((a->ppsStdCount) == (b->ppsStdCount))) { onFail("a->pPpsStd (Error: Lengths not equal)"); };
-        if (!((memcmp(a->pPpsStd, b->pPpsStd, a->ppsStdCount * sizeof(const StdVideoH265PictureParameterSet)) == 0))) { onFail("a->pPpsStd (Error: Unequal dyn array)"); };
+    if (!((a->ppsStdCount) == (b->ppsStdCount))) {
+        onFail("a->ppsStdCount (Error: Value not equal)");
+    };
+    if (!((!(a->pPpsStd) && !(b->pPpsStd)) || ((a->pPpsStd) && (b->pPpsStd)))) {
+        onFail("a->pPpsStd (Error: Mismatch in optional field)");
+    };
+    if (a->pPpsStd && b->pPpsStd) {
+        if (!((a->ppsStdCount) == (b->ppsStdCount))) {
+            onFail("a->pPpsStd (Error: Lengths not equal)");
+        };
+        if (!((memcmp(a->pPpsStd, b->pPpsStd,
+                      a->ppsStdCount * sizeof(const StdVideoH265PictureParameterSet)) == 0))) {
+            onFail("a->pPpsStd (Error: Unequal dyn array)");
+        };
     }
 }
 
 void checkEqual_VkVideoDecodeH265SessionParametersCreateInfoEXT(
     const VkVideoDecodeH265SessionParametersCreateInfoEXT* a,
-    const VkVideoDecodeH265SessionParametersCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkVideoDecodeH265SessionParametersCreateInfoEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->maxSpsStdCount) == (b->maxSpsStdCount))) { onFail("a->maxSpsStdCount (Error: Value not equal)"); };
-    if (!((a->maxPpsStdCount) == (b->maxPpsStdCount))) { onFail("a->maxPpsStdCount (Error: Value not equal)"); };
-    if (!((!(a->pParametersAddInfo) && !(b->pParametersAddInfo)) || ((a->pParametersAddInfo) && (b->pParametersAddInfo)))) { onFail("a->pParametersAddInfo (Error: Mismatch in optional field)"); };
-    if (a->pParametersAddInfo && b->pParametersAddInfo)
-    {
-        if ((a->pParametersAddInfo) && (b->pParametersAddInfo))
-        {
-            checkEqual_VkVideoDecodeH265SessionParametersAddInfoEXT(a->pParametersAddInfo, b->pParametersAddInfo, onFail);
+    if (!((a->maxSpsStdCount) == (b->maxSpsStdCount))) {
+        onFail("a->maxSpsStdCount (Error: Value not equal)");
+    };
+    if (!((a->maxPpsStdCount) == (b->maxPpsStdCount))) {
+        onFail("a->maxPpsStdCount (Error: Value not equal)");
+    };
+    if (!((!(a->pParametersAddInfo) && !(b->pParametersAddInfo)) ||
+          ((a->pParametersAddInfo) && (b->pParametersAddInfo)))) {
+        onFail("a->pParametersAddInfo (Error: Mismatch in optional field)");
+    };
+    if (a->pParametersAddInfo && b->pParametersAddInfo) {
+        if ((a->pParametersAddInfo) && (b->pParametersAddInfo)) {
+            checkEqual_VkVideoDecodeH265SessionParametersAddInfoEXT(a->pParametersAddInfo,
+                                                                    b->pParametersAddInfo, onFail);
         }
     }
 }
 
-void checkEqual_VkVideoDecodeH265PictureInfoEXT(
-    const VkVideoDecodeH265PictureInfoEXT* a,
-    const VkVideoDecodeH265PictureInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkVideoDecodeH265PictureInfoEXT(const VkVideoDecodeH265PictureInfoEXT* a,
+                                                const VkVideoDecodeH265PictureInfoEXT* b,
+                                                OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((memcmp(a->pStdPictureInfo, b->pStdPictureInfo, sizeof(StdVideoDecodeH265PictureInfo)) == 0))) { onFail("a->pStdPictureInfo (Error: Unequal dyn array)"); };
-    if (!((a->slicesCount) == (b->slicesCount))) { onFail("a->slicesCount (Error: Value not equal)"); };
-    if (!((a->slicesCount) == (b->slicesCount))) { onFail("a->pSlicesDataOffsets (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pSlicesDataOffsets, b->pSlicesDataOffsets, a->slicesCount * sizeof(const uint32_t)) == 0))) { onFail("a->pSlicesDataOffsets (Error: Unequal dyn array)"); };
+    if (!((memcmp(a->pStdPictureInfo, b->pStdPictureInfo, sizeof(StdVideoDecodeH265PictureInfo)) ==
+           0))) {
+        onFail("a->pStdPictureInfo (Error: Unequal dyn array)");
+    };
+    if (!((a->slicesCount) == (b->slicesCount))) {
+        onFail("a->slicesCount (Error: Value not equal)");
+    };
+    if (!((a->slicesCount) == (b->slicesCount))) {
+        onFail("a->pSlicesDataOffsets (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pSlicesDataOffsets, b->pSlicesDataOffsets,
+                  a->slicesCount * sizeof(const uint32_t)) == 0))) {
+        onFail("a->pSlicesDataOffsets (Error: Unequal dyn array)");
+    };
 }
 
-void checkEqual_VkVideoDecodeH265DpbSlotInfoEXT(
-    const VkVideoDecodeH265DpbSlotInfoEXT* a,
-    const VkVideoDecodeH265DpbSlotInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkVideoDecodeH265DpbSlotInfoEXT(const VkVideoDecodeH265DpbSlotInfoEXT* a,
+                                                const VkVideoDecodeH265DpbSlotInfoEXT* b,
+                                                OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((memcmp(a->pStdReferenceInfo, b->pStdReferenceInfo, sizeof(const StdVideoDecodeH265ReferenceInfo)) == 0))) { onFail("a->pStdReferenceInfo (Error: Unequal dyn array)"); };
+    if (!((memcmp(a->pStdReferenceInfo, b->pStdReferenceInfo,
+                  sizeof(const StdVideoDecodeH265ReferenceInfo)) == 0))) {
+        onFail("a->pStdReferenceInfo (Error: Unequal dyn array)");
+    };
 }
 
 #endif
 #ifdef VK_AMD_memory_overallocation_behavior
 void checkEqual_VkDeviceMemoryOverallocationCreateInfoAMD(
     const VkDeviceMemoryOverallocationCreateInfoAMD* a,
-    const VkDeviceMemoryOverallocationCreateInfoAMD* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkDeviceMemoryOverallocationCreateInfoAMD* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->overallocationBehavior) == (b->overallocationBehavior))) { onFail("a->overallocationBehavior (Error: Value not equal)"); };
+    if (!((a->overallocationBehavior) == (b->overallocationBehavior))) {
+        onFail("a->overallocationBehavior (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_vertex_attribute_divisor
 void checkEqual_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
     const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* a,
-    const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->maxVertexAttribDivisor) == (b->maxVertexAttribDivisor))) { onFail("a->maxVertexAttribDivisor (Error: Value not equal)"); };
+    if (!((a->maxVertexAttribDivisor) == (b->maxVertexAttribDivisor))) {
+        onFail("a->maxVertexAttribDivisor (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkVertexInputBindingDivisorDescriptionEXT(
     const VkVertexInputBindingDivisorDescriptionEXT* a,
-    const VkVertexInputBindingDivisorDescriptionEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->binding) == (b->binding))) { onFail("a->binding (Error: Value not equal)"); };
-    if (!((a->divisor) == (b->divisor))) { onFail("a->divisor (Error: Value not equal)"); };
+    const VkVertexInputBindingDivisorDescriptionEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->binding) == (b->binding))) {
+        onFail("a->binding (Error: Value not equal)");
+    };
+    if (!((a->divisor) == (b->divisor))) {
+        onFail("a->divisor (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPipelineVertexInputDivisorStateCreateInfoEXT(
     const VkPipelineVertexInputDivisorStateCreateInfoEXT* a,
-    const VkPipelineVertexInputDivisorStateCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPipelineVertexInputDivisorStateCreateInfoEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->vertexBindingDivisorCount) == (b->vertexBindingDivisorCount))) { onFail("a->vertexBindingDivisorCount (Error: Value not equal)"); };
-    if ((a->pVertexBindingDivisors) && (b->pVertexBindingDivisors))
-    {
-        if (!((a->vertexBindingDivisorCount) == (b->vertexBindingDivisorCount))) { onFail("a->pVertexBindingDivisors (Error: Lengths not equal)"); };
-        if ((a->vertexBindingDivisorCount) == (b->vertexBindingDivisorCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->vertexBindingDivisorCount; ++i)
-                {
-                    checkEqual_VkVertexInputBindingDivisorDescriptionEXT(a->pVertexBindingDivisors + i, b->pVertexBindingDivisors + i, onFail);
+    if (!((a->vertexBindingDivisorCount) == (b->vertexBindingDivisorCount))) {
+        onFail("a->vertexBindingDivisorCount (Error: Value not equal)");
+    };
+    if ((a->pVertexBindingDivisors) && (b->pVertexBindingDivisors)) {
+        if (!((a->vertexBindingDivisorCount) == (b->vertexBindingDivisorCount))) {
+            onFail("a->pVertexBindingDivisors (Error: Lengths not equal)");
+        };
+        if ((a->vertexBindingDivisorCount) == (b->vertexBindingDivisorCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->vertexBindingDivisorCount; ++i) {
+                    checkEqual_VkVertexInputBindingDivisorDescriptionEXT(
+                        a->pVertexBindingDivisors + i, b->pVertexBindingDivisors + i, onFail);
                 }
             }
         }
@@ -10359,69 +13944,76 @@
 
 void checkEqual_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(
     const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* a,
-    const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->vertexAttributeInstanceRateDivisor) == (b->vertexAttributeInstanceRateDivisor))) { onFail("a->vertexAttributeInstanceRateDivisor (Error: Value not equal)"); };
-    if (!((a->vertexAttributeInstanceRateZeroDivisor) == (b->vertexAttributeInstanceRateZeroDivisor))) { onFail("a->vertexAttributeInstanceRateZeroDivisor (Error: Value not equal)"); };
+    if (!((a->vertexAttributeInstanceRateDivisor) == (b->vertexAttributeInstanceRateDivisor))) {
+        onFail("a->vertexAttributeInstanceRateDivisor (Error: Value not equal)");
+    };
+    if (!((a->vertexAttributeInstanceRateZeroDivisor) ==
+          (b->vertexAttributeInstanceRateZeroDivisor))) {
+        onFail("a->vertexAttributeInstanceRateZeroDivisor (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_GGP_frame_token
-void checkEqual_VkPresentFrameTokenGGP(
-    const VkPresentFrameTokenGGP* a,
-    const VkPresentFrameTokenGGP* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPresentFrameTokenGGP(const VkPresentFrameTokenGGP* a,
+                                       const VkPresentFrameTokenGGP* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->frameToken) == (b->frameToken))) { onFail("a->frameToken (Error: Value not equal)"); };
+    if (!((a->frameToken) == (b->frameToken))) {
+        onFail("a->frameToken (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_pipeline_creation_feedback
-void checkEqual_VkPipelineCreationFeedbackEXT(
-    const VkPipelineCreationFeedbackEXT* a,
-    const VkPipelineCreationFeedbackEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->duration) == (b->duration))) { onFail("a->duration (Error: Value not equal)"); };
+void checkEqual_VkPipelineCreationFeedbackEXT(const VkPipelineCreationFeedbackEXT* a,
+                                              const VkPipelineCreationFeedbackEXT* b,
+                                              OnFailCompareFunc onFail) {
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->duration) == (b->duration))) {
+        onFail("a->duration (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPipelineCreationFeedbackCreateInfoEXT(
     const VkPipelineCreationFeedbackCreateInfoEXT* a,
-    const VkPipelineCreationFeedbackCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPipelineCreationFeedbackCreateInfoEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if ((a->pPipelineCreationFeedback) && (b->pPipelineCreationFeedback))
-    {
-        checkEqual_VkPipelineCreationFeedbackEXT(a->pPipelineCreationFeedback, b->pPipelineCreationFeedback, onFail);
+    if ((a->pPipelineCreationFeedback) && (b->pPipelineCreationFeedback)) {
+        checkEqual_VkPipelineCreationFeedbackEXT(a->pPipelineCreationFeedback,
+                                                 b->pPipelineCreationFeedback, onFail);
     }
-    if (!((a->pipelineStageCreationFeedbackCount) == (b->pipelineStageCreationFeedbackCount))) { onFail("a->pipelineStageCreationFeedbackCount (Error: Value not equal)"); };
-    if ((a->pPipelineStageCreationFeedbacks) && (b->pPipelineStageCreationFeedbacks))
-    {
-        if (!((a->pipelineStageCreationFeedbackCount) == (b->pipelineStageCreationFeedbackCount))) { onFail("a->pPipelineStageCreationFeedbacks (Error: Lengths not equal)"); };
-        if ((a->pipelineStageCreationFeedbackCount) == (b->pipelineStageCreationFeedbackCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->pipelineStageCreationFeedbackCount; ++i)
-                {
-                    checkEqual_VkPipelineCreationFeedbackEXT(a->pPipelineStageCreationFeedbacks + i, b->pPipelineStageCreationFeedbacks + i, onFail);
+    if (!((a->pipelineStageCreationFeedbackCount) == (b->pipelineStageCreationFeedbackCount))) {
+        onFail("a->pipelineStageCreationFeedbackCount (Error: Value not equal)");
+    };
+    if ((a->pPipelineStageCreationFeedbacks) && (b->pPipelineStageCreationFeedbacks)) {
+        if (!((a->pipelineStageCreationFeedbackCount) == (b->pipelineStageCreationFeedbackCount))) {
+            onFail("a->pPipelineStageCreationFeedbacks (Error: Lengths not equal)");
+        };
+        if ((a->pipelineStageCreationFeedbackCount) == (b->pipelineStageCreationFeedbackCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->pipelineStageCreationFeedbackCount; ++i) {
+                    checkEqual_VkPipelineCreationFeedbackEXT(a->pPipelineStageCreationFeedbacks + i,
+                                                             b->pPipelineStageCreationFeedbacks + i,
+                                                             onFail);
                 }
             }
         }
@@ -10434,124 +14026,161 @@
 #ifdef VK_NV_compute_shader_derivatives
 void checkEqual_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(
     const VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* a,
-    const VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->computeDerivativeGroupQuads) == (b->computeDerivativeGroupQuads))) { onFail("a->computeDerivativeGroupQuads (Error: Value not equal)"); };
-    if (!((a->computeDerivativeGroupLinear) == (b->computeDerivativeGroupLinear))) { onFail("a->computeDerivativeGroupLinear (Error: Value not equal)"); };
+    if (!((a->computeDerivativeGroupQuads) == (b->computeDerivativeGroupQuads))) {
+        onFail("a->computeDerivativeGroupQuads (Error: Value not equal)");
+    };
+    if (!((a->computeDerivativeGroupLinear) == (b->computeDerivativeGroupLinear))) {
+        onFail("a->computeDerivativeGroupLinear (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_NV_mesh_shader
-void checkEqual_VkPhysicalDeviceMeshShaderFeaturesNV(
-    const VkPhysicalDeviceMeshShaderFeaturesNV* a,
-    const VkPhysicalDeviceMeshShaderFeaturesNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPhysicalDeviceMeshShaderFeaturesNV(const VkPhysicalDeviceMeshShaderFeaturesNV* a,
+                                                     const VkPhysicalDeviceMeshShaderFeaturesNV* b,
+                                                     OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->taskShader) == (b->taskShader))) { onFail("a->taskShader (Error: Value not equal)"); };
-    if (!((a->meshShader) == (b->meshShader))) { onFail("a->meshShader (Error: Value not equal)"); };
+    if (!((a->taskShader) == (b->taskShader))) {
+        onFail("a->taskShader (Error: Value not equal)");
+    };
+    if (!((a->meshShader) == (b->meshShader))) {
+        onFail("a->meshShader (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceMeshShaderPropertiesNV(
     const VkPhysicalDeviceMeshShaderPropertiesNV* a,
-    const VkPhysicalDeviceMeshShaderPropertiesNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceMeshShaderPropertiesNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->maxDrawMeshTasksCount) == (b->maxDrawMeshTasksCount))) { onFail("a->maxDrawMeshTasksCount (Error: Value not equal)"); };
-    if (!((a->maxTaskWorkGroupInvocations) == (b->maxTaskWorkGroupInvocations))) { onFail("a->maxTaskWorkGroupInvocations (Error: Value not equal)"); };
-    if (!((memcmp(a->maxTaskWorkGroupSize, b->maxTaskWorkGroupSize, 3 * sizeof(uint32_t)) == 0))) { onFail("a->maxTaskWorkGroupSize (Error: Unequal static array)"); };
-    if (!((a->maxTaskTotalMemorySize) == (b->maxTaskTotalMemorySize))) { onFail("a->maxTaskTotalMemorySize (Error: Value not equal)"); };
-    if (!((a->maxTaskOutputCount) == (b->maxTaskOutputCount))) { onFail("a->maxTaskOutputCount (Error: Value not equal)"); };
-    if (!((a->maxMeshWorkGroupInvocations) == (b->maxMeshWorkGroupInvocations))) { onFail("a->maxMeshWorkGroupInvocations (Error: Value not equal)"); };
-    if (!((memcmp(a->maxMeshWorkGroupSize, b->maxMeshWorkGroupSize, 3 * sizeof(uint32_t)) == 0))) { onFail("a->maxMeshWorkGroupSize (Error: Unequal static array)"); };
-    if (!((a->maxMeshTotalMemorySize) == (b->maxMeshTotalMemorySize))) { onFail("a->maxMeshTotalMemorySize (Error: Value not equal)"); };
-    if (!((a->maxMeshOutputVertices) == (b->maxMeshOutputVertices))) { onFail("a->maxMeshOutputVertices (Error: Value not equal)"); };
-    if (!((a->maxMeshOutputPrimitives) == (b->maxMeshOutputPrimitives))) { onFail("a->maxMeshOutputPrimitives (Error: Value not equal)"); };
-    if (!((a->maxMeshMultiviewViewCount) == (b->maxMeshMultiviewViewCount))) { onFail("a->maxMeshMultiviewViewCount (Error: Value not equal)"); };
-    if (!((a->meshOutputPerVertexGranularity) == (b->meshOutputPerVertexGranularity))) { onFail("a->meshOutputPerVertexGranularity (Error: Value not equal)"); };
-    if (!((a->meshOutputPerPrimitiveGranularity) == (b->meshOutputPerPrimitiveGranularity))) { onFail("a->meshOutputPerPrimitiveGranularity (Error: Value not equal)"); };
+    if (!((a->maxDrawMeshTasksCount) == (b->maxDrawMeshTasksCount))) {
+        onFail("a->maxDrawMeshTasksCount (Error: Value not equal)");
+    };
+    if (!((a->maxTaskWorkGroupInvocations) == (b->maxTaskWorkGroupInvocations))) {
+        onFail("a->maxTaskWorkGroupInvocations (Error: Value not equal)");
+    };
+    if (!((memcmp(a->maxTaskWorkGroupSize, b->maxTaskWorkGroupSize, 3 * sizeof(uint32_t)) == 0))) {
+        onFail("a->maxTaskWorkGroupSize (Error: Unequal static array)");
+    };
+    if (!((a->maxTaskTotalMemorySize) == (b->maxTaskTotalMemorySize))) {
+        onFail("a->maxTaskTotalMemorySize (Error: Value not equal)");
+    };
+    if (!((a->maxTaskOutputCount) == (b->maxTaskOutputCount))) {
+        onFail("a->maxTaskOutputCount (Error: Value not equal)");
+    };
+    if (!((a->maxMeshWorkGroupInvocations) == (b->maxMeshWorkGroupInvocations))) {
+        onFail("a->maxMeshWorkGroupInvocations (Error: Value not equal)");
+    };
+    if (!((memcmp(a->maxMeshWorkGroupSize, b->maxMeshWorkGroupSize, 3 * sizeof(uint32_t)) == 0))) {
+        onFail("a->maxMeshWorkGroupSize (Error: Unequal static array)");
+    };
+    if (!((a->maxMeshTotalMemorySize) == (b->maxMeshTotalMemorySize))) {
+        onFail("a->maxMeshTotalMemorySize (Error: Value not equal)");
+    };
+    if (!((a->maxMeshOutputVertices) == (b->maxMeshOutputVertices))) {
+        onFail("a->maxMeshOutputVertices (Error: Value not equal)");
+    };
+    if (!((a->maxMeshOutputPrimitives) == (b->maxMeshOutputPrimitives))) {
+        onFail("a->maxMeshOutputPrimitives (Error: Value not equal)");
+    };
+    if (!((a->maxMeshMultiviewViewCount) == (b->maxMeshMultiviewViewCount))) {
+        onFail("a->maxMeshMultiviewViewCount (Error: Value not equal)");
+    };
+    if (!((a->meshOutputPerVertexGranularity) == (b->meshOutputPerVertexGranularity))) {
+        onFail("a->meshOutputPerVertexGranularity (Error: Value not equal)");
+    };
+    if (!((a->meshOutputPerPrimitiveGranularity) == (b->meshOutputPerPrimitiveGranularity))) {
+        onFail("a->meshOutputPerPrimitiveGranularity (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkDrawMeshTasksIndirectCommandNV(
-    const VkDrawMeshTasksIndirectCommandNV* a,
-    const VkDrawMeshTasksIndirectCommandNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->taskCount) == (b->taskCount))) { onFail("a->taskCount (Error: Value not equal)"); };
-    if (!((a->firstTask) == (b->firstTask))) { onFail("a->firstTask (Error: Value not equal)"); };
+void checkEqual_VkDrawMeshTasksIndirectCommandNV(const VkDrawMeshTasksIndirectCommandNV* a,
+                                                 const VkDrawMeshTasksIndirectCommandNV* b,
+                                                 OnFailCompareFunc onFail) {
+    if (!((a->taskCount) == (b->taskCount))) {
+        onFail("a->taskCount (Error: Value not equal)");
+    };
+    if (!((a->firstTask) == (b->firstTask))) {
+        onFail("a->firstTask (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_NV_fragment_shader_barycentric
 void checkEqual_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(
     const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* a,
-    const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->fragmentShaderBarycentric) == (b->fragmentShaderBarycentric))) { onFail("a->fragmentShaderBarycentric (Error: Value not equal)"); };
+    if (!((a->fragmentShaderBarycentric) == (b->fragmentShaderBarycentric))) {
+        onFail("a->fragmentShaderBarycentric (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_NV_shader_image_footprint
 void checkEqual_VkPhysicalDeviceShaderImageFootprintFeaturesNV(
     const VkPhysicalDeviceShaderImageFootprintFeaturesNV* a,
-    const VkPhysicalDeviceShaderImageFootprintFeaturesNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceShaderImageFootprintFeaturesNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->imageFootprint) == (b->imageFootprint))) { onFail("a->imageFootprint (Error: Value not equal)"); };
+    if (!((a->imageFootprint) == (b->imageFootprint))) {
+        onFail("a->imageFootprint (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_NV_scissor_exclusive
 void checkEqual_VkPipelineViewportExclusiveScissorStateCreateInfoNV(
     const VkPipelineViewportExclusiveScissorStateCreateInfoNV* a,
-    const VkPipelineViewportExclusiveScissorStateCreateInfoNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPipelineViewportExclusiveScissorStateCreateInfoNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->exclusiveScissorCount) == (b->exclusiveScissorCount))) { onFail("a->exclusiveScissorCount (Error: Value not equal)"); };
-    if (!((!(a->pExclusiveScissors) && !(b->pExclusiveScissors)) || ((a->pExclusiveScissors) && (b->pExclusiveScissors)))) { onFail("a->pExclusiveScissors (Error: Mismatch in optional field)"); };
-    if (a->pExclusiveScissors && b->pExclusiveScissors)
-    {
-        if ((a->pExclusiveScissors) && (b->pExclusiveScissors))
-        {
-            if (!((a->exclusiveScissorCount) == (b->exclusiveScissorCount))) { onFail("a->pExclusiveScissors (Error: Lengths not equal)"); };
-            if ((a->exclusiveScissorCount) == (b->exclusiveScissorCount))
-            {
-                if (a)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)a->exclusiveScissorCount; ++i)
-                    {
-                        checkEqual_VkRect2D(a->pExclusiveScissors + i, b->pExclusiveScissors + i, onFail);
+    if (!((a->exclusiveScissorCount) == (b->exclusiveScissorCount))) {
+        onFail("a->exclusiveScissorCount (Error: Value not equal)");
+    };
+    if (!((!(a->pExclusiveScissors) && !(b->pExclusiveScissors)) ||
+          ((a->pExclusiveScissors) && (b->pExclusiveScissors)))) {
+        onFail("a->pExclusiveScissors (Error: Mismatch in optional field)");
+    };
+    if (a->pExclusiveScissors && b->pExclusiveScissors) {
+        if ((a->pExclusiveScissors) && (b->pExclusiveScissors)) {
+            if (!((a->exclusiveScissorCount) == (b->exclusiveScissorCount))) {
+                onFail("a->pExclusiveScissors (Error: Lengths not equal)");
+            };
+            if ((a->exclusiveScissorCount) == (b->exclusiveScissorCount)) {
+                if (a) {
+                    for (uint32_t i = 0; i < (uint32_t)a->exclusiveScissorCount; ++i) {
+                        checkEqual_VkRect2D(a->pExclusiveScissors + i, b->pExclusiveScissors + i,
+                                            onFail);
                     }
                 }
             }
@@ -10561,247 +14190,288 @@
 
 void checkEqual_VkPhysicalDeviceExclusiveScissorFeaturesNV(
     const VkPhysicalDeviceExclusiveScissorFeaturesNV* a,
-    const VkPhysicalDeviceExclusiveScissorFeaturesNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceExclusiveScissorFeaturesNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->exclusiveScissor) == (b->exclusiveScissor))) { onFail("a->exclusiveScissor (Error: Value not equal)"); };
+    if (!((a->exclusiveScissor) == (b->exclusiveScissor))) {
+        onFail("a->exclusiveScissor (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
-void checkEqual_VkQueueFamilyCheckpointPropertiesNV(
-    const VkQueueFamilyCheckpointPropertiesNV* a,
-    const VkQueueFamilyCheckpointPropertiesNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkQueueFamilyCheckpointPropertiesNV(const VkQueueFamilyCheckpointPropertiesNV* a,
+                                                    const VkQueueFamilyCheckpointPropertiesNV* b,
+                                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->checkpointExecutionStageMask) == (b->checkpointExecutionStageMask))) { onFail("a->checkpointExecutionStageMask (Error: Value not equal)"); };
+    if (!((a->checkpointExecutionStageMask) == (b->checkpointExecutionStageMask))) {
+        onFail("a->checkpointExecutionStageMask (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkCheckpointDataNV(
-    const VkCheckpointDataNV* a,
-    const VkCheckpointDataNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkCheckpointDataNV(const VkCheckpointDataNV* a, const VkCheckpointDataNV* b,
+                                   OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->stage) == (b->stage))) { onFail("a->stage (Error: Value not equal)"); };
-    if (!((!(a->pCheckpointMarker) && !(b->pCheckpointMarker)) || ((a->pCheckpointMarker) && (b->pCheckpointMarker)))) { onFail("a->pCheckpointMarker (Error: Mismatch in optional field)"); };
+    if (!((a->stage) == (b->stage))) {
+        onFail("a->stage (Error: Value not equal)");
+    };
+    if (!((!(a->pCheckpointMarker) && !(b->pCheckpointMarker)) ||
+          ((a->pCheckpointMarker) && (b->pCheckpointMarker)))) {
+        onFail("a->pCheckpointMarker (Error: Mismatch in optional field)");
+    };
 }
 
 #endif
 #ifdef VK_INTEL_shader_integer_functions2
 void checkEqual_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(
     const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* a,
-    const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->shaderIntegerFunctions2) == (b->shaderIntegerFunctions2))) { onFail("a->shaderIntegerFunctions2 (Error: Value not equal)"); };
+    if (!((a->shaderIntegerFunctions2) == (b->shaderIntegerFunctions2))) {
+        onFail("a->shaderIntegerFunctions2 (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_INTEL_performance_query
-void checkEqual_VkPerformanceValueDataINTEL(
-    const VkPerformanceValueDataINTEL* a,
-    const VkPerformanceValueDataINTEL* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->value32) == (b->value32))) { onFail("a->value32 (Error: Value not equal)"); };
-    if (!((a->value64) == (b->value64))) { onFail("a->value64 (Error: Value not equal)"); };
-    if (!((a->valueFloat) == (b->valueFloat))) { onFail("a->valueFloat (Error: Value not equal)"); };
-    if (!((a->valueBool) == (b->valueBool))) { onFail("a->valueBool (Error: Value not equal)"); };
-    if (!((!(a->valueString) && !(b->valueString)) || ((a->valueString) && (b->valueString)))) { onFail("a->valueString (Error: Mismatch in string pointer nullness)"); };
-    if ((a->valueString) && (b->valueString))
-    {
-        if (!((strcmp(a->valueString, b->valueString) == 0))) { onFail("a->valueString (Error: Unequal strings)"); };
+void checkEqual_VkPerformanceValueDataINTEL(const VkPerformanceValueDataINTEL* a,
+                                            const VkPerformanceValueDataINTEL* b,
+                                            OnFailCompareFunc onFail) {
+    if (!((a->value32) == (b->value32))) {
+        onFail("a->value32 (Error: Value not equal)");
+    };
+    if (!((a->value64) == (b->value64))) {
+        onFail("a->value64 (Error: Value not equal)");
+    };
+    if (!((a->valueFloat) == (b->valueFloat))) {
+        onFail("a->valueFloat (Error: Value not equal)");
+    };
+    if (!((a->valueBool) == (b->valueBool))) {
+        onFail("a->valueBool (Error: Value not equal)");
+    };
+    if (!((!(a->valueString) && !(b->valueString)) || ((a->valueString) && (b->valueString)))) {
+        onFail("a->valueString (Error: Mismatch in string pointer nullness)");
+    };
+    if ((a->valueString) && (b->valueString)) {
+        if (!((strcmp(a->valueString, b->valueString) == 0))) {
+            onFail("a->valueString (Error: Unequal strings)");
+        };
     }
 }
 
-void checkEqual_VkPerformanceValueINTEL(
-    const VkPerformanceValueINTEL* a,
-    const VkPerformanceValueINTEL* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->type) == (b->type))) { onFail("a->type (Error: Value not equal)"); };
+void checkEqual_VkPerformanceValueINTEL(const VkPerformanceValueINTEL* a,
+                                        const VkPerformanceValueINTEL* b,
+                                        OnFailCompareFunc onFail) {
+    if (!((a->type) == (b->type))) {
+        onFail("a->type (Error: Value not equal)");
+    };
     checkEqual_VkPerformanceValueDataINTEL(&a->data, &b->data, onFail);
 }
 
-void checkEqual_VkInitializePerformanceApiInfoINTEL(
-    const VkInitializePerformanceApiInfoINTEL* a,
-    const VkInitializePerformanceApiInfoINTEL* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkInitializePerformanceApiInfoINTEL(const VkInitializePerformanceApiInfoINTEL* a,
+                                                    const VkInitializePerformanceApiInfoINTEL* b,
+                                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((!(a->pUserData) && !(b->pUserData)) || ((a->pUserData) && (b->pUserData)))) { onFail("a->pUserData (Error: Mismatch in optional field)"); };
+    if (!((!(a->pUserData) && !(b->pUserData)) || ((a->pUserData) && (b->pUserData)))) {
+        onFail("a->pUserData (Error: Mismatch in optional field)");
+    };
 }
 
 void checkEqual_VkQueryPoolPerformanceQueryCreateInfoINTEL(
     const VkQueryPoolPerformanceQueryCreateInfoINTEL* a,
-    const VkQueryPoolPerformanceQueryCreateInfoINTEL* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkQueryPoolPerformanceQueryCreateInfoINTEL* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->performanceCountersSampling) == (b->performanceCountersSampling))) { onFail("a->performanceCountersSampling (Error: Value not equal)"); };
+    if (!((a->performanceCountersSampling) == (b->performanceCountersSampling))) {
+        onFail("a->performanceCountersSampling (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkPerformanceMarkerInfoINTEL(
-    const VkPerformanceMarkerInfoINTEL* a,
-    const VkPerformanceMarkerInfoINTEL* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPerformanceMarkerInfoINTEL(const VkPerformanceMarkerInfoINTEL* a,
+                                             const VkPerformanceMarkerInfoINTEL* b,
+                                             OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->marker) == (b->marker))) { onFail("a->marker (Error: Value not equal)"); };
+    if (!((a->marker) == (b->marker))) {
+        onFail("a->marker (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkPerformanceStreamMarkerInfoINTEL(
-    const VkPerformanceStreamMarkerInfoINTEL* a,
-    const VkPerformanceStreamMarkerInfoINTEL* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPerformanceStreamMarkerInfoINTEL(const VkPerformanceStreamMarkerInfoINTEL* a,
+                                                   const VkPerformanceStreamMarkerInfoINTEL* b,
+                                                   OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->marker) == (b->marker))) { onFail("a->marker (Error: Value not equal)"); };
+    if (!((a->marker) == (b->marker))) {
+        onFail("a->marker (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkPerformanceOverrideInfoINTEL(
-    const VkPerformanceOverrideInfoINTEL* a,
-    const VkPerformanceOverrideInfoINTEL* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPerformanceOverrideInfoINTEL(const VkPerformanceOverrideInfoINTEL* a,
+                                               const VkPerformanceOverrideInfoINTEL* b,
+                                               OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->type) == (b->type))) { onFail("a->type (Error: Value not equal)"); };
-    if (!((a->enable) == (b->enable))) { onFail("a->enable (Error: Value not equal)"); };
-    if (!((a->parameter) == (b->parameter))) { onFail("a->parameter (Error: Value not equal)"); };
+    if (!((a->type) == (b->type))) {
+        onFail("a->type (Error: Value not equal)");
+    };
+    if (!((a->enable) == (b->enable))) {
+        onFail("a->enable (Error: Value not equal)");
+    };
+    if (!((a->parameter) == (b->parameter))) {
+        onFail("a->parameter (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPerformanceConfigurationAcquireInfoINTEL(
     const VkPerformanceConfigurationAcquireInfoINTEL* a,
-    const VkPerformanceConfigurationAcquireInfoINTEL* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPerformanceConfigurationAcquireInfoINTEL* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->type) == (b->type))) { onFail("a->type (Error: Value not equal)"); };
+    if (!((a->type) == (b->type))) {
+        onFail("a->type (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_pci_bus_info
 void checkEqual_VkPhysicalDevicePCIBusInfoPropertiesEXT(
     const VkPhysicalDevicePCIBusInfoPropertiesEXT* a,
-    const VkPhysicalDevicePCIBusInfoPropertiesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDevicePCIBusInfoPropertiesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->pciDomain) == (b->pciDomain))) { onFail("a->pciDomain (Error: Value not equal)"); };
-    if (!((a->pciBus) == (b->pciBus))) { onFail("a->pciBus (Error: Value not equal)"); };
-    if (!((a->pciDevice) == (b->pciDevice))) { onFail("a->pciDevice (Error: Value not equal)"); };
-    if (!((a->pciFunction) == (b->pciFunction))) { onFail("a->pciFunction (Error: Value not equal)"); };
+    if (!((a->pciDomain) == (b->pciDomain))) {
+        onFail("a->pciDomain (Error: Value not equal)");
+    };
+    if (!((a->pciBus) == (b->pciBus))) {
+        onFail("a->pciBus (Error: Value not equal)");
+    };
+    if (!((a->pciDevice) == (b->pciDevice))) {
+        onFail("a->pciDevice (Error: Value not equal)");
+    };
+    if (!((a->pciFunction) == (b->pciFunction))) {
+        onFail("a->pciFunction (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_AMD_display_native_hdr
 void checkEqual_VkDisplayNativeHdrSurfaceCapabilitiesAMD(
     const VkDisplayNativeHdrSurfaceCapabilitiesAMD* a,
-    const VkDisplayNativeHdrSurfaceCapabilitiesAMD* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkDisplayNativeHdrSurfaceCapabilitiesAMD* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->localDimmingSupport) == (b->localDimmingSupport))) { onFail("a->localDimmingSupport (Error: Value not equal)"); };
+    if (!((a->localDimmingSupport) == (b->localDimmingSupport))) {
+        onFail("a->localDimmingSupport (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkSwapchainDisplayNativeHdrCreateInfoAMD(
     const VkSwapchainDisplayNativeHdrCreateInfoAMD* a,
-    const VkSwapchainDisplayNativeHdrCreateInfoAMD* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkSwapchainDisplayNativeHdrCreateInfoAMD* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->localDimmingEnable) == (b->localDimmingEnable))) { onFail("a->localDimmingEnable (Error: Value not equal)"); };
+    if (!((a->localDimmingEnable) == (b->localDimmingEnable))) {
+        onFail("a->localDimmingEnable (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_FUCHSIA_imagepipe_surface
-void checkEqual_VkImagePipeSurfaceCreateInfoFUCHSIA(
-    const VkImagePipeSurfaceCreateInfoFUCHSIA* a,
-    const VkImagePipeSurfaceCreateInfoFUCHSIA* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkImagePipeSurfaceCreateInfoFUCHSIA(const VkImagePipeSurfaceCreateInfoFUCHSIA* a,
+                                                    const VkImagePipeSurfaceCreateInfoFUCHSIA* b,
+                                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->imagePipeHandle) == (b->imagePipeHandle))) { onFail("a->imagePipeHandle (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->imagePipeHandle) == (b->imagePipeHandle))) {
+        onFail("a->imagePipeHandle (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_metal_surface
-void checkEqual_VkMetalSurfaceCreateInfoEXT(
-    const VkMetalSurfaceCreateInfoEXT* a,
-    const VkMetalSurfaceCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkMetalSurfaceCreateInfoEXT(const VkMetalSurfaceCreateInfoEXT* a,
+                                            const VkMetalSurfaceCreateInfoEXT* b,
+                                            OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((!(a->pLayer) && !(b->pLayer)) || ((a->pLayer) && (b->pLayer)))) { onFail("a->pLayer (Error: Mismatch in optional field)"); };
-    if (a->pLayer && b->pLayer)
-    {
-        if (!((memcmp(a->pLayer, b->pLayer, sizeof(const CAMetalLayer)) == 0))) { onFail("a->pLayer (Error: Unequal dyn array)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((!(a->pLayer) && !(b->pLayer)) || ((a->pLayer) && (b->pLayer)))) {
+        onFail("a->pLayer (Error: Mismatch in optional field)");
+    };
+    if (a->pLayer && b->pLayer) {
+        if (!((memcmp(a->pLayer, b->pLayer, sizeof(const CAMetalLayer)) == 0))) {
+            onFail("a->pLayer (Error: Unequal dyn array)");
+        };
     }
 }
 
@@ -10809,45 +14479,52 @@
 #ifdef VK_EXT_fragment_density_map
 void checkEqual_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
     const VkPhysicalDeviceFragmentDensityMapFeaturesEXT* a,
-    const VkPhysicalDeviceFragmentDensityMapFeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceFragmentDensityMapFeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->fragmentDensityMap) == (b->fragmentDensityMap))) { onFail("a->fragmentDensityMap (Error: Value not equal)"); };
-    if (!((a->fragmentDensityMapDynamic) == (b->fragmentDensityMapDynamic))) { onFail("a->fragmentDensityMapDynamic (Error: Value not equal)"); };
-    if (!((a->fragmentDensityMapNonSubsampledImages) == (b->fragmentDensityMapNonSubsampledImages))) { onFail("a->fragmentDensityMapNonSubsampledImages (Error: Value not equal)"); };
+    if (!((a->fragmentDensityMap) == (b->fragmentDensityMap))) {
+        onFail("a->fragmentDensityMap (Error: Value not equal)");
+    };
+    if (!((a->fragmentDensityMapDynamic) == (b->fragmentDensityMapDynamic))) {
+        onFail("a->fragmentDensityMapDynamic (Error: Value not equal)");
+    };
+    if (!((a->fragmentDensityMapNonSubsampledImages) ==
+          (b->fragmentDensityMapNonSubsampledImages))) {
+        onFail("a->fragmentDensityMapNonSubsampledImages (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
     const VkPhysicalDeviceFragmentDensityMapPropertiesEXT* a,
-    const VkPhysicalDeviceFragmentDensityMapPropertiesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceFragmentDensityMapPropertiesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
     checkEqual_VkExtent2D(&a->minFragmentDensityTexelSize, &b->minFragmentDensityTexelSize, onFail);
     checkEqual_VkExtent2D(&a->maxFragmentDensityTexelSize, &b->maxFragmentDensityTexelSize, onFail);
-    if (!((a->fragmentDensityInvocations) == (b->fragmentDensityInvocations))) { onFail("a->fragmentDensityInvocations (Error: Value not equal)"); };
+    if (!((a->fragmentDensityInvocations) == (b->fragmentDensityInvocations))) {
+        onFail("a->fragmentDensityInvocations (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkRenderPassFragmentDensityMapCreateInfoEXT(
     const VkRenderPassFragmentDensityMapCreateInfoEXT* a,
-    const VkRenderPassFragmentDensityMapCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkRenderPassFragmentDensityMapCreateInfoEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    checkEqual_VkAttachmentReference(&a->fragmentDensityMapAttachment, &b->fragmentDensityMapAttachment, onFail);
+    checkEqual_VkAttachmentReference(&a->fragmentDensityMapAttachment,
+                                     &b->fragmentDensityMapAttachment, onFail);
 }
 
 #endif
@@ -10860,522 +14537,668 @@
 #ifdef VK_EXT_subgroup_size_control
 void checkEqual_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(
     const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* a,
-    const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->subgroupSizeControl) == (b->subgroupSizeControl))) { onFail("a->subgroupSizeControl (Error: Value not equal)"); };
-    if (!((a->computeFullSubgroups) == (b->computeFullSubgroups))) { onFail("a->computeFullSubgroups (Error: Value not equal)"); };
+    if (!((a->subgroupSizeControl) == (b->subgroupSizeControl))) {
+        onFail("a->subgroupSizeControl (Error: Value not equal)");
+    };
+    if (!((a->computeFullSubgroups) == (b->computeFullSubgroups))) {
+        onFail("a->computeFullSubgroups (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(
     const VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* a,
-    const VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->minSubgroupSize) == (b->minSubgroupSize))) { onFail("a->minSubgroupSize (Error: Value not equal)"); };
-    if (!((a->maxSubgroupSize) == (b->maxSubgroupSize))) { onFail("a->maxSubgroupSize (Error: Value not equal)"); };
-    if (!((a->maxComputeWorkgroupSubgroups) == (b->maxComputeWorkgroupSubgroups))) { onFail("a->maxComputeWorkgroupSubgroups (Error: Value not equal)"); };
-    if (!((a->requiredSubgroupSizeStages) == (b->requiredSubgroupSizeStages))) { onFail("a->requiredSubgroupSizeStages (Error: Value not equal)"); };
+    if (!((a->minSubgroupSize) == (b->minSubgroupSize))) {
+        onFail("a->minSubgroupSize (Error: Value not equal)");
+    };
+    if (!((a->maxSubgroupSize) == (b->maxSubgroupSize))) {
+        onFail("a->maxSubgroupSize (Error: Value not equal)");
+    };
+    if (!((a->maxComputeWorkgroupSubgroups) == (b->maxComputeWorkgroupSubgroups))) {
+        onFail("a->maxComputeWorkgroupSubgroups (Error: Value not equal)");
+    };
+    if (!((a->requiredSubgroupSizeStages) == (b->requiredSubgroupSizeStages))) {
+        onFail("a->requiredSubgroupSizeStages (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(
     const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* a,
-    const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->requiredSubgroupSize) == (b->requiredSubgroupSize))) { onFail("a->requiredSubgroupSize (Error: Value not equal)"); };
+    if (!((a->requiredSubgroupSize) == (b->requiredSubgroupSize))) {
+        onFail("a->requiredSubgroupSize (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_AMD_shader_core_properties2
 void checkEqual_VkPhysicalDeviceShaderCoreProperties2AMD(
     const VkPhysicalDeviceShaderCoreProperties2AMD* a,
-    const VkPhysicalDeviceShaderCoreProperties2AMD* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceShaderCoreProperties2AMD* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->shaderCoreFeatures) == (b->shaderCoreFeatures))) { onFail("a->shaderCoreFeatures (Error: Value not equal)"); };
-    if (!((a->activeComputeUnitCount) == (b->activeComputeUnitCount))) { onFail("a->activeComputeUnitCount (Error: Value not equal)"); };
+    if (!((a->shaderCoreFeatures) == (b->shaderCoreFeatures))) {
+        onFail("a->shaderCoreFeatures (Error: Value not equal)");
+    };
+    if (!((a->activeComputeUnitCount) == (b->activeComputeUnitCount))) {
+        onFail("a->activeComputeUnitCount (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_AMD_device_coherent_memory
 void checkEqual_VkPhysicalDeviceCoherentMemoryFeaturesAMD(
     const VkPhysicalDeviceCoherentMemoryFeaturesAMD* a,
-    const VkPhysicalDeviceCoherentMemoryFeaturesAMD* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceCoherentMemoryFeaturesAMD* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->deviceCoherentMemory) == (b->deviceCoherentMemory))) { onFail("a->deviceCoherentMemory (Error: Value not equal)"); };
+    if (!((a->deviceCoherentMemory) == (b->deviceCoherentMemory))) {
+        onFail("a->deviceCoherentMemory (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_shader_image_atomic_int64
 void checkEqual_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(
     const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* a,
-    const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->shaderImageInt64Atomics) == (b->shaderImageInt64Atomics))) { onFail("a->shaderImageInt64Atomics (Error: Value not equal)"); };
-    if (!((a->sparseImageInt64Atomics) == (b->sparseImageInt64Atomics))) { onFail("a->sparseImageInt64Atomics (Error: Value not equal)"); };
+    if (!((a->shaderImageInt64Atomics) == (b->shaderImageInt64Atomics))) {
+        onFail("a->shaderImageInt64Atomics (Error: Value not equal)");
+    };
+    if (!((a->sparseImageInt64Atomics) == (b->sparseImageInt64Atomics))) {
+        onFail("a->sparseImageInt64Atomics (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_memory_budget
 void checkEqual_VkPhysicalDeviceMemoryBudgetPropertiesEXT(
     const VkPhysicalDeviceMemoryBudgetPropertiesEXT* a,
-    const VkPhysicalDeviceMemoryBudgetPropertiesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceMemoryBudgetPropertiesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((memcmp(a->heapBudget, b->heapBudget, VK_MAX_MEMORY_HEAPS * sizeof(VkDeviceSize)) == 0))) { onFail("a->heapBudget (Error: Unequal static array)"); };
-    if (!((memcmp(a->heapUsage, b->heapUsage, VK_MAX_MEMORY_HEAPS * sizeof(VkDeviceSize)) == 0))) { onFail("a->heapUsage (Error: Unequal static array)"); };
+    if (!((memcmp(a->heapBudget, b->heapBudget, VK_MAX_MEMORY_HEAPS * sizeof(VkDeviceSize)) ==
+           0))) {
+        onFail("a->heapBudget (Error: Unequal static array)");
+    };
+    if (!((memcmp(a->heapUsage, b->heapUsage, VK_MAX_MEMORY_HEAPS * sizeof(VkDeviceSize)) == 0))) {
+        onFail("a->heapUsage (Error: Unequal static array)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_memory_priority
 void checkEqual_VkPhysicalDeviceMemoryPriorityFeaturesEXT(
     const VkPhysicalDeviceMemoryPriorityFeaturesEXT* a,
-    const VkPhysicalDeviceMemoryPriorityFeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceMemoryPriorityFeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->memoryPriority) == (b->memoryPriority))) { onFail("a->memoryPriority (Error: Value not equal)"); };
+    if (!((a->memoryPriority) == (b->memoryPriority))) {
+        onFail("a->memoryPriority (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkMemoryPriorityAllocateInfoEXT(
-    const VkMemoryPriorityAllocateInfoEXT* a,
-    const VkMemoryPriorityAllocateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkMemoryPriorityAllocateInfoEXT(const VkMemoryPriorityAllocateInfoEXT* a,
+                                                const VkMemoryPriorityAllocateInfoEXT* b,
+                                                OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->priority) == (b->priority))) { onFail("a->priority (Error: Value not equal)"); };
+    if (!((a->priority) == (b->priority))) {
+        onFail("a->priority (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_NV_dedicated_allocation_image_aliasing
 void checkEqual_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(
     const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* a,
-    const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->dedicatedAllocationImageAliasing) == (b->dedicatedAllocationImageAliasing))) { onFail("a->dedicatedAllocationImageAliasing (Error: Value not equal)"); };
+    if (!((a->dedicatedAllocationImageAliasing) == (b->dedicatedAllocationImageAliasing))) {
+        onFail("a->dedicatedAllocationImageAliasing (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_buffer_device_address
 void checkEqual_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(
     const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* a,
-    const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->bufferDeviceAddress) == (b->bufferDeviceAddress))) { onFail("a->bufferDeviceAddress (Error: Value not equal)"); };
-    if (!((a->bufferDeviceAddressCaptureReplay) == (b->bufferDeviceAddressCaptureReplay))) { onFail("a->bufferDeviceAddressCaptureReplay (Error: Value not equal)"); };
-    if (!((a->bufferDeviceAddressMultiDevice) == (b->bufferDeviceAddressMultiDevice))) { onFail("a->bufferDeviceAddressMultiDevice (Error: Value not equal)"); };
+    if (!((a->bufferDeviceAddress) == (b->bufferDeviceAddress))) {
+        onFail("a->bufferDeviceAddress (Error: Value not equal)");
+    };
+    if (!((a->bufferDeviceAddressCaptureReplay) == (b->bufferDeviceAddressCaptureReplay))) {
+        onFail("a->bufferDeviceAddressCaptureReplay (Error: Value not equal)");
+    };
+    if (!((a->bufferDeviceAddressMultiDevice) == (b->bufferDeviceAddressMultiDevice))) {
+        onFail("a->bufferDeviceAddressMultiDevice (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkBufferDeviceAddressCreateInfoEXT(
-    const VkBufferDeviceAddressCreateInfoEXT* a,
-    const VkBufferDeviceAddressCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkBufferDeviceAddressCreateInfoEXT(const VkBufferDeviceAddressCreateInfoEXT* a,
+                                                   const VkBufferDeviceAddressCreateInfoEXT* b,
+                                                   OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->deviceAddress) == (b->deviceAddress))) { onFail("a->deviceAddress (Error: Value not equal)"); };
+    if (!((a->deviceAddress) == (b->deviceAddress))) {
+        onFail("a->deviceAddress (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_tooling_info
-void checkEqual_VkPhysicalDeviceToolPropertiesEXT(
-    const VkPhysicalDeviceToolPropertiesEXT* a,
-    const VkPhysicalDeviceToolPropertiesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPhysicalDeviceToolPropertiesEXT(const VkPhysicalDeviceToolPropertiesEXT* a,
+                                                  const VkPhysicalDeviceToolPropertiesEXT* b,
+                                                  OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((memcmp(a->name, b->name, VK_MAX_EXTENSION_NAME_SIZE * sizeof(char)) == 0))) { onFail("a->name (Error: Unequal static array)"); };
-    if (!((memcmp(a->version, b->version, VK_MAX_EXTENSION_NAME_SIZE * sizeof(char)) == 0))) { onFail("a->version (Error: Unequal static array)"); };
-    if (!((a->purposes) == (b->purposes))) { onFail("a->purposes (Error: Value not equal)"); };
-    if (!((memcmp(a->description, b->description, VK_MAX_DESCRIPTION_SIZE * sizeof(char)) == 0))) { onFail("a->description (Error: Unequal static array)"); };
-    if (!((memcmp(a->layer, b->layer, VK_MAX_EXTENSION_NAME_SIZE * sizeof(char)) == 0))) { onFail("a->layer (Error: Unequal static array)"); };
+    if (!((memcmp(a->name, b->name, VK_MAX_EXTENSION_NAME_SIZE * sizeof(char)) == 0))) {
+        onFail("a->name (Error: Unequal static array)");
+    };
+    if (!((memcmp(a->version, b->version, VK_MAX_EXTENSION_NAME_SIZE * sizeof(char)) == 0))) {
+        onFail("a->version (Error: Unequal static array)");
+    };
+    if (!((a->purposes) == (b->purposes))) {
+        onFail("a->purposes (Error: Value not equal)");
+    };
+    if (!((memcmp(a->description, b->description, VK_MAX_DESCRIPTION_SIZE * sizeof(char)) == 0))) {
+        onFail("a->description (Error: Unequal static array)");
+    };
+    if (!((memcmp(a->layer, b->layer, VK_MAX_EXTENSION_NAME_SIZE * sizeof(char)) == 0))) {
+        onFail("a->layer (Error: Unequal static array)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_separate_stencil_usage
 #endif
 #ifdef VK_EXT_validation_features
-void checkEqual_VkValidationFeaturesEXT(
-    const VkValidationFeaturesEXT* a,
-    const VkValidationFeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkValidationFeaturesEXT(const VkValidationFeaturesEXT* a,
+                                        const VkValidationFeaturesEXT* b,
+                                        OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->enabledValidationFeatureCount) == (b->enabledValidationFeatureCount))) { onFail("a->enabledValidationFeatureCount (Error: Value not equal)"); };
-    if (!((a->enabledValidationFeatureCount) == (b->enabledValidationFeatureCount))) { onFail("a->pEnabledValidationFeatures (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pEnabledValidationFeatures, b->pEnabledValidationFeatures, a->enabledValidationFeatureCount * sizeof(const VkValidationFeatureEnableEXT)) == 0))) { onFail("a->pEnabledValidationFeatures (Error: Unequal dyn array)"); };
-    if (!((a->disabledValidationFeatureCount) == (b->disabledValidationFeatureCount))) { onFail("a->disabledValidationFeatureCount (Error: Value not equal)"); };
-    if (!((a->disabledValidationFeatureCount) == (b->disabledValidationFeatureCount))) { onFail("a->pDisabledValidationFeatures (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pDisabledValidationFeatures, b->pDisabledValidationFeatures, a->disabledValidationFeatureCount * sizeof(const VkValidationFeatureDisableEXT)) == 0))) { onFail("a->pDisabledValidationFeatures (Error: Unequal dyn array)"); };
+    if (!((a->enabledValidationFeatureCount) == (b->enabledValidationFeatureCount))) {
+        onFail("a->enabledValidationFeatureCount (Error: Value not equal)");
+    };
+    if (!((a->enabledValidationFeatureCount) == (b->enabledValidationFeatureCount))) {
+        onFail("a->pEnabledValidationFeatures (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pEnabledValidationFeatures, b->pEnabledValidationFeatures,
+                  a->enabledValidationFeatureCount * sizeof(const VkValidationFeatureEnableEXT)) ==
+           0))) {
+        onFail("a->pEnabledValidationFeatures (Error: Unequal dyn array)");
+    };
+    if (!((a->disabledValidationFeatureCount) == (b->disabledValidationFeatureCount))) {
+        onFail("a->disabledValidationFeatureCount (Error: Value not equal)");
+    };
+    if (!((a->disabledValidationFeatureCount) == (b->disabledValidationFeatureCount))) {
+        onFail("a->pDisabledValidationFeatures (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pDisabledValidationFeatures, b->pDisabledValidationFeatures,
+                  a->disabledValidationFeatureCount *
+                      sizeof(const VkValidationFeatureDisableEXT)) == 0))) {
+        onFail("a->pDisabledValidationFeatures (Error: Unequal dyn array)");
+    };
 }
 
 #endif
 #ifdef VK_NV_cooperative_matrix
-void checkEqual_VkCooperativeMatrixPropertiesNV(
-    const VkCooperativeMatrixPropertiesNV* a,
-    const VkCooperativeMatrixPropertiesNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkCooperativeMatrixPropertiesNV(const VkCooperativeMatrixPropertiesNV* a,
+                                                const VkCooperativeMatrixPropertiesNV* b,
+                                                OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->MSize) == (b->MSize))) { onFail("a->MSize (Error: Value not equal)"); };
-    if (!((a->NSize) == (b->NSize))) { onFail("a->NSize (Error: Value not equal)"); };
-    if (!((a->KSize) == (b->KSize))) { onFail("a->KSize (Error: Value not equal)"); };
-    if (!((a->AType) == (b->AType))) { onFail("a->AType (Error: Value not equal)"); };
-    if (!((a->BType) == (b->BType))) { onFail("a->BType (Error: Value not equal)"); };
-    if (!((a->CType) == (b->CType))) { onFail("a->CType (Error: Value not equal)"); };
-    if (!((a->DType) == (b->DType))) { onFail("a->DType (Error: Value not equal)"); };
-    if (!((a->scope) == (b->scope))) { onFail("a->scope (Error: Value not equal)"); };
+    if (!((a->MSize) == (b->MSize))) {
+        onFail("a->MSize (Error: Value not equal)");
+    };
+    if (!((a->NSize) == (b->NSize))) {
+        onFail("a->NSize (Error: Value not equal)");
+    };
+    if (!((a->KSize) == (b->KSize))) {
+        onFail("a->KSize (Error: Value not equal)");
+    };
+    if (!((a->AType) == (b->AType))) {
+        onFail("a->AType (Error: Value not equal)");
+    };
+    if (!((a->BType) == (b->BType))) {
+        onFail("a->BType (Error: Value not equal)");
+    };
+    if (!((a->CType) == (b->CType))) {
+        onFail("a->CType (Error: Value not equal)");
+    };
+    if (!((a->DType) == (b->DType))) {
+        onFail("a->DType (Error: Value not equal)");
+    };
+    if (!((a->scope) == (b->scope))) {
+        onFail("a->scope (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceCooperativeMatrixFeaturesNV(
     const VkPhysicalDeviceCooperativeMatrixFeaturesNV* a,
-    const VkPhysicalDeviceCooperativeMatrixFeaturesNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceCooperativeMatrixFeaturesNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->cooperativeMatrix) == (b->cooperativeMatrix))) { onFail("a->cooperativeMatrix (Error: Value not equal)"); };
-    if (!((a->cooperativeMatrixRobustBufferAccess) == (b->cooperativeMatrixRobustBufferAccess))) { onFail("a->cooperativeMatrixRobustBufferAccess (Error: Value not equal)"); };
+    if (!((a->cooperativeMatrix) == (b->cooperativeMatrix))) {
+        onFail("a->cooperativeMatrix (Error: Value not equal)");
+    };
+    if (!((a->cooperativeMatrixRobustBufferAccess) == (b->cooperativeMatrixRobustBufferAccess))) {
+        onFail("a->cooperativeMatrixRobustBufferAccess (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceCooperativeMatrixPropertiesNV(
     const VkPhysicalDeviceCooperativeMatrixPropertiesNV* a,
-    const VkPhysicalDeviceCooperativeMatrixPropertiesNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceCooperativeMatrixPropertiesNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->cooperativeMatrixSupportedStages) == (b->cooperativeMatrixSupportedStages))) { onFail("a->cooperativeMatrixSupportedStages (Error: Value not equal)"); };
+    if (!((a->cooperativeMatrixSupportedStages) == (b->cooperativeMatrixSupportedStages))) {
+        onFail("a->cooperativeMatrixSupportedStages (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_NV_coverage_reduction_mode
 void checkEqual_VkPhysicalDeviceCoverageReductionModeFeaturesNV(
     const VkPhysicalDeviceCoverageReductionModeFeaturesNV* a,
-    const VkPhysicalDeviceCoverageReductionModeFeaturesNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceCoverageReductionModeFeaturesNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->coverageReductionMode) == (b->coverageReductionMode))) { onFail("a->coverageReductionMode (Error: Value not equal)"); };
+    if (!((a->coverageReductionMode) == (b->coverageReductionMode))) {
+        onFail("a->coverageReductionMode (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPipelineCoverageReductionStateCreateInfoNV(
     const VkPipelineCoverageReductionStateCreateInfoNV* a,
-    const VkPipelineCoverageReductionStateCreateInfoNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPipelineCoverageReductionStateCreateInfoNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->coverageReductionMode) == (b->coverageReductionMode))) { onFail("a->coverageReductionMode (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->coverageReductionMode) == (b->coverageReductionMode))) {
+        onFail("a->coverageReductionMode (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkFramebufferMixedSamplesCombinationNV(
     const VkFramebufferMixedSamplesCombinationNV* a,
-    const VkFramebufferMixedSamplesCombinationNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkFramebufferMixedSamplesCombinationNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->coverageReductionMode) == (b->coverageReductionMode))) { onFail("a->coverageReductionMode (Error: Value not equal)"); };
-    if (!((a->rasterizationSamples) == (b->rasterizationSamples))) { onFail("a->rasterizationSamples (Error: Value not equal)"); };
-    if (!((a->depthStencilSamples) == (b->depthStencilSamples))) { onFail("a->depthStencilSamples (Error: Value not equal)"); };
-    if (!((a->colorSamples) == (b->colorSamples))) { onFail("a->colorSamples (Error: Value not equal)"); };
+    if (!((a->coverageReductionMode) == (b->coverageReductionMode))) {
+        onFail("a->coverageReductionMode (Error: Value not equal)");
+    };
+    if (!((a->rasterizationSamples) == (b->rasterizationSamples))) {
+        onFail("a->rasterizationSamples (Error: Value not equal)");
+    };
+    if (!((a->depthStencilSamples) == (b->depthStencilSamples))) {
+        onFail("a->depthStencilSamples (Error: Value not equal)");
+    };
+    if (!((a->colorSamples) == (b->colorSamples))) {
+        onFail("a->colorSamples (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_fragment_shader_interlock
 void checkEqual_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(
     const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* a,
-    const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->fragmentShaderSampleInterlock) == (b->fragmentShaderSampleInterlock))) { onFail("a->fragmentShaderSampleInterlock (Error: Value not equal)"); };
-    if (!((a->fragmentShaderPixelInterlock) == (b->fragmentShaderPixelInterlock))) { onFail("a->fragmentShaderPixelInterlock (Error: Value not equal)"); };
-    if (!((a->fragmentShaderShadingRateInterlock) == (b->fragmentShaderShadingRateInterlock))) { onFail("a->fragmentShaderShadingRateInterlock (Error: Value not equal)"); };
+    if (!((a->fragmentShaderSampleInterlock) == (b->fragmentShaderSampleInterlock))) {
+        onFail("a->fragmentShaderSampleInterlock (Error: Value not equal)");
+    };
+    if (!((a->fragmentShaderPixelInterlock) == (b->fragmentShaderPixelInterlock))) {
+        onFail("a->fragmentShaderPixelInterlock (Error: Value not equal)");
+    };
+    if (!((a->fragmentShaderShadingRateInterlock) == (b->fragmentShaderShadingRateInterlock))) {
+        onFail("a->fragmentShaderShadingRateInterlock (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_ycbcr_image_arrays
 void checkEqual_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(
     const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* a,
-    const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->ycbcrImageArrays) == (b->ycbcrImageArrays))) { onFail("a->ycbcrImageArrays (Error: Value not equal)"); };
+    if (!((a->ycbcrImageArrays) == (b->ycbcrImageArrays))) {
+        onFail("a->ycbcrImageArrays (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_provoking_vertex
 void checkEqual_VkPhysicalDeviceProvokingVertexFeaturesEXT(
     const VkPhysicalDeviceProvokingVertexFeaturesEXT* a,
-    const VkPhysicalDeviceProvokingVertexFeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceProvokingVertexFeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->provokingVertexLast) == (b->provokingVertexLast))) { onFail("a->provokingVertexLast (Error: Value not equal)"); };
-    if (!((a->transformFeedbackPreservesProvokingVertex) == (b->transformFeedbackPreservesProvokingVertex))) { onFail("a->transformFeedbackPreservesProvokingVertex (Error: Value not equal)"); };
+    if (!((a->provokingVertexLast) == (b->provokingVertexLast))) {
+        onFail("a->provokingVertexLast (Error: Value not equal)");
+    };
+    if (!((a->transformFeedbackPreservesProvokingVertex) ==
+          (b->transformFeedbackPreservesProvokingVertex))) {
+        onFail("a->transformFeedbackPreservesProvokingVertex (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceProvokingVertexPropertiesEXT(
     const VkPhysicalDeviceProvokingVertexPropertiesEXT* a,
-    const VkPhysicalDeviceProvokingVertexPropertiesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceProvokingVertexPropertiesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->provokingVertexModePerPipeline) == (b->provokingVertexModePerPipeline))) { onFail("a->provokingVertexModePerPipeline (Error: Value not equal)"); };
-    if (!((a->transformFeedbackPreservesTriangleFanProvokingVertex) == (b->transformFeedbackPreservesTriangleFanProvokingVertex))) { onFail("a->transformFeedbackPreservesTriangleFanProvokingVertex (Error: Value not equal)"); };
+    if (!((a->provokingVertexModePerPipeline) == (b->provokingVertexModePerPipeline))) {
+        onFail("a->provokingVertexModePerPipeline (Error: Value not equal)");
+    };
+    if (!((a->transformFeedbackPreservesTriangleFanProvokingVertex) ==
+          (b->transformFeedbackPreservesTriangleFanProvokingVertex))) {
+        onFail("a->transformFeedbackPreservesTriangleFanProvokingVertex (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT(
     const VkPipelineRasterizationProvokingVertexStateCreateInfoEXT* a,
-    const VkPipelineRasterizationProvokingVertexStateCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPipelineRasterizationProvokingVertexStateCreateInfoEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->provokingVertexMode) == (b->provokingVertexMode))) { onFail("a->provokingVertexMode (Error: Value not equal)"); };
+    if (!((a->provokingVertexMode) == (b->provokingVertexMode))) {
+        onFail("a->provokingVertexMode (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_full_screen_exclusive
-void checkEqual_VkSurfaceFullScreenExclusiveInfoEXT(
-    const VkSurfaceFullScreenExclusiveInfoEXT* a,
-    const VkSurfaceFullScreenExclusiveInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkSurfaceFullScreenExclusiveInfoEXT(const VkSurfaceFullScreenExclusiveInfoEXT* a,
+                                                    const VkSurfaceFullScreenExclusiveInfoEXT* b,
+                                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->fullScreenExclusive) == (b->fullScreenExclusive))) { onFail("a->fullScreenExclusive (Error: Value not equal)"); };
+    if (!((a->fullScreenExclusive) == (b->fullScreenExclusive))) {
+        onFail("a->fullScreenExclusive (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkSurfaceCapabilitiesFullScreenExclusiveEXT(
     const VkSurfaceCapabilitiesFullScreenExclusiveEXT* a,
-    const VkSurfaceCapabilitiesFullScreenExclusiveEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkSurfaceCapabilitiesFullScreenExclusiveEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->fullScreenExclusiveSupported) == (b->fullScreenExclusiveSupported))) { onFail("a->fullScreenExclusiveSupported (Error: Value not equal)"); };
+    if (!((a->fullScreenExclusiveSupported) == (b->fullScreenExclusiveSupported))) {
+        onFail("a->fullScreenExclusiveSupported (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkSurfaceFullScreenExclusiveWin32InfoEXT(
     const VkSurfaceFullScreenExclusiveWin32InfoEXT* a,
-    const VkSurfaceFullScreenExclusiveWin32InfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkSurfaceFullScreenExclusiveWin32InfoEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->hmonitor) == (b->hmonitor))) { onFail("a->hmonitor (Error: Value not equal)"); };
+    if (!((a->hmonitor) == (b->hmonitor))) {
+        onFail("a->hmonitor (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_headless_surface
-void checkEqual_VkHeadlessSurfaceCreateInfoEXT(
-    const VkHeadlessSurfaceCreateInfoEXT* a,
-    const VkHeadlessSurfaceCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkHeadlessSurfaceCreateInfoEXT(const VkHeadlessSurfaceCreateInfoEXT* a,
+                                               const VkHeadlessSurfaceCreateInfoEXT* b,
+                                               OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_line_rasterization
 void checkEqual_VkPhysicalDeviceLineRasterizationFeaturesEXT(
     const VkPhysicalDeviceLineRasterizationFeaturesEXT* a,
-    const VkPhysicalDeviceLineRasterizationFeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceLineRasterizationFeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->rectangularLines) == (b->rectangularLines))) { onFail("a->rectangularLines (Error: Value not equal)"); };
-    if (!((a->bresenhamLines) == (b->bresenhamLines))) { onFail("a->bresenhamLines (Error: Value not equal)"); };
-    if (!((a->smoothLines) == (b->smoothLines))) { onFail("a->smoothLines (Error: Value not equal)"); };
-    if (!((a->stippledRectangularLines) == (b->stippledRectangularLines))) { onFail("a->stippledRectangularLines (Error: Value not equal)"); };
-    if (!((a->stippledBresenhamLines) == (b->stippledBresenhamLines))) { onFail("a->stippledBresenhamLines (Error: Value not equal)"); };
-    if (!((a->stippledSmoothLines) == (b->stippledSmoothLines))) { onFail("a->stippledSmoothLines (Error: Value not equal)"); };
+    if (!((a->rectangularLines) == (b->rectangularLines))) {
+        onFail("a->rectangularLines (Error: Value not equal)");
+    };
+    if (!((a->bresenhamLines) == (b->bresenhamLines))) {
+        onFail("a->bresenhamLines (Error: Value not equal)");
+    };
+    if (!((a->smoothLines) == (b->smoothLines))) {
+        onFail("a->smoothLines (Error: Value not equal)");
+    };
+    if (!((a->stippledRectangularLines) == (b->stippledRectangularLines))) {
+        onFail("a->stippledRectangularLines (Error: Value not equal)");
+    };
+    if (!((a->stippledBresenhamLines) == (b->stippledBresenhamLines))) {
+        onFail("a->stippledBresenhamLines (Error: Value not equal)");
+    };
+    if (!((a->stippledSmoothLines) == (b->stippledSmoothLines))) {
+        onFail("a->stippledSmoothLines (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceLineRasterizationPropertiesEXT(
     const VkPhysicalDeviceLineRasterizationPropertiesEXT* a,
-    const VkPhysicalDeviceLineRasterizationPropertiesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceLineRasterizationPropertiesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->lineSubPixelPrecisionBits) == (b->lineSubPixelPrecisionBits))) { onFail("a->lineSubPixelPrecisionBits (Error: Value not equal)"); };
+    if (!((a->lineSubPixelPrecisionBits) == (b->lineSubPixelPrecisionBits))) {
+        onFail("a->lineSubPixelPrecisionBits (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPipelineRasterizationLineStateCreateInfoEXT(
     const VkPipelineRasterizationLineStateCreateInfoEXT* a,
-    const VkPipelineRasterizationLineStateCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPipelineRasterizationLineStateCreateInfoEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->lineRasterizationMode) == (b->lineRasterizationMode))) { onFail("a->lineRasterizationMode (Error: Value not equal)"); };
-    if (!((a->stippledLineEnable) == (b->stippledLineEnable))) { onFail("a->stippledLineEnable (Error: Value not equal)"); };
-    if (!((a->lineStippleFactor) == (b->lineStippleFactor))) { onFail("a->lineStippleFactor (Error: Value not equal)"); };
-    if (!((a->lineStipplePattern) == (b->lineStipplePattern))) { onFail("a->lineStipplePattern (Error: Value not equal)"); };
+    if (!((a->lineRasterizationMode) == (b->lineRasterizationMode))) {
+        onFail("a->lineRasterizationMode (Error: Value not equal)");
+    };
+    if (!((a->stippledLineEnable) == (b->stippledLineEnable))) {
+        onFail("a->stippledLineEnable (Error: Value not equal)");
+    };
+    if (!((a->lineStippleFactor) == (b->lineStippleFactor))) {
+        onFail("a->lineStippleFactor (Error: Value not equal)");
+    };
+    if (!((a->lineStipplePattern) == (b->lineStipplePattern))) {
+        onFail("a->lineStipplePattern (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_shader_atomic_float
 void checkEqual_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(
     const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* a,
-    const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->shaderBufferFloat32Atomics) == (b->shaderBufferFloat32Atomics))) { onFail("a->shaderBufferFloat32Atomics (Error: Value not equal)"); };
-    if (!((a->shaderBufferFloat32AtomicAdd) == (b->shaderBufferFloat32AtomicAdd))) { onFail("a->shaderBufferFloat32AtomicAdd (Error: Value not equal)"); };
-    if (!((a->shaderBufferFloat64Atomics) == (b->shaderBufferFloat64Atomics))) { onFail("a->shaderBufferFloat64Atomics (Error: Value not equal)"); };
-    if (!((a->shaderBufferFloat64AtomicAdd) == (b->shaderBufferFloat64AtomicAdd))) { onFail("a->shaderBufferFloat64AtomicAdd (Error: Value not equal)"); };
-    if (!((a->shaderSharedFloat32Atomics) == (b->shaderSharedFloat32Atomics))) { onFail("a->shaderSharedFloat32Atomics (Error: Value not equal)"); };
-    if (!((a->shaderSharedFloat32AtomicAdd) == (b->shaderSharedFloat32AtomicAdd))) { onFail("a->shaderSharedFloat32AtomicAdd (Error: Value not equal)"); };
-    if (!((a->shaderSharedFloat64Atomics) == (b->shaderSharedFloat64Atomics))) { onFail("a->shaderSharedFloat64Atomics (Error: Value not equal)"); };
-    if (!((a->shaderSharedFloat64AtomicAdd) == (b->shaderSharedFloat64AtomicAdd))) { onFail("a->shaderSharedFloat64AtomicAdd (Error: Value not equal)"); };
-    if (!((a->shaderImageFloat32Atomics) == (b->shaderImageFloat32Atomics))) { onFail("a->shaderImageFloat32Atomics (Error: Value not equal)"); };
-    if (!((a->shaderImageFloat32AtomicAdd) == (b->shaderImageFloat32AtomicAdd))) { onFail("a->shaderImageFloat32AtomicAdd (Error: Value not equal)"); };
-    if (!((a->sparseImageFloat32Atomics) == (b->sparseImageFloat32Atomics))) { onFail("a->sparseImageFloat32Atomics (Error: Value not equal)"); };
-    if (!((a->sparseImageFloat32AtomicAdd) == (b->sparseImageFloat32AtomicAdd))) { onFail("a->sparseImageFloat32AtomicAdd (Error: Value not equal)"); };
+    if (!((a->shaderBufferFloat32Atomics) == (b->shaderBufferFloat32Atomics))) {
+        onFail("a->shaderBufferFloat32Atomics (Error: Value not equal)");
+    };
+    if (!((a->shaderBufferFloat32AtomicAdd) == (b->shaderBufferFloat32AtomicAdd))) {
+        onFail("a->shaderBufferFloat32AtomicAdd (Error: Value not equal)");
+    };
+    if (!((a->shaderBufferFloat64Atomics) == (b->shaderBufferFloat64Atomics))) {
+        onFail("a->shaderBufferFloat64Atomics (Error: Value not equal)");
+    };
+    if (!((a->shaderBufferFloat64AtomicAdd) == (b->shaderBufferFloat64AtomicAdd))) {
+        onFail("a->shaderBufferFloat64AtomicAdd (Error: Value not equal)");
+    };
+    if (!((a->shaderSharedFloat32Atomics) == (b->shaderSharedFloat32Atomics))) {
+        onFail("a->shaderSharedFloat32Atomics (Error: Value not equal)");
+    };
+    if (!((a->shaderSharedFloat32AtomicAdd) == (b->shaderSharedFloat32AtomicAdd))) {
+        onFail("a->shaderSharedFloat32AtomicAdd (Error: Value not equal)");
+    };
+    if (!((a->shaderSharedFloat64Atomics) == (b->shaderSharedFloat64Atomics))) {
+        onFail("a->shaderSharedFloat64Atomics (Error: Value not equal)");
+    };
+    if (!((a->shaderSharedFloat64AtomicAdd) == (b->shaderSharedFloat64AtomicAdd))) {
+        onFail("a->shaderSharedFloat64AtomicAdd (Error: Value not equal)");
+    };
+    if (!((a->shaderImageFloat32Atomics) == (b->shaderImageFloat32Atomics))) {
+        onFail("a->shaderImageFloat32Atomics (Error: Value not equal)");
+    };
+    if (!((a->shaderImageFloat32AtomicAdd) == (b->shaderImageFloat32AtomicAdd))) {
+        onFail("a->shaderImageFloat32AtomicAdd (Error: Value not equal)");
+    };
+    if (!((a->sparseImageFloat32Atomics) == (b->sparseImageFloat32Atomics))) {
+        onFail("a->sparseImageFloat32Atomics (Error: Value not equal)");
+    };
+    if (!((a->sparseImageFloat32AtomicAdd) == (b->sparseImageFloat32AtomicAdd))) {
+        onFail("a->sparseImageFloat32AtomicAdd (Error: Value not equal)");
+    };
 }
 
 #endif
@@ -11384,372 +15207,515 @@
 #ifdef VK_EXT_index_type_uint8
 void checkEqual_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(
     const VkPhysicalDeviceIndexTypeUint8FeaturesEXT* a,
-    const VkPhysicalDeviceIndexTypeUint8FeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceIndexTypeUint8FeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->indexTypeUint8) == (b->indexTypeUint8))) { onFail("a->indexTypeUint8 (Error: Value not equal)"); };
+    if (!((a->indexTypeUint8) == (b->indexTypeUint8))) {
+        onFail("a->indexTypeUint8 (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_extended_dynamic_state
 void checkEqual_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(
     const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* a,
-    const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->extendedDynamicState) == (b->extendedDynamicState))) { onFail("a->extendedDynamicState (Error: Value not equal)"); };
+    if (!((a->extendedDynamicState) == (b->extendedDynamicState))) {
+        onFail("a->extendedDynamicState (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_shader_atomic_float2
 void checkEqual_VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT(
     const VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT* a,
-    const VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->shaderBufferFloat16Atomics) == (b->shaderBufferFloat16Atomics))) { onFail("a->shaderBufferFloat16Atomics (Error: Value not equal)"); };
-    if (!((a->shaderBufferFloat16AtomicAdd) == (b->shaderBufferFloat16AtomicAdd))) { onFail("a->shaderBufferFloat16AtomicAdd (Error: Value not equal)"); };
-    if (!((a->shaderBufferFloat16AtomicMinMax) == (b->shaderBufferFloat16AtomicMinMax))) { onFail("a->shaderBufferFloat16AtomicMinMax (Error: Value not equal)"); };
-    if (!((a->shaderBufferFloat32AtomicMinMax) == (b->shaderBufferFloat32AtomicMinMax))) { onFail("a->shaderBufferFloat32AtomicMinMax (Error: Value not equal)"); };
-    if (!((a->shaderBufferFloat64AtomicMinMax) == (b->shaderBufferFloat64AtomicMinMax))) { onFail("a->shaderBufferFloat64AtomicMinMax (Error: Value not equal)"); };
-    if (!((a->shaderSharedFloat16Atomics) == (b->shaderSharedFloat16Atomics))) { onFail("a->shaderSharedFloat16Atomics (Error: Value not equal)"); };
-    if (!((a->shaderSharedFloat16AtomicAdd) == (b->shaderSharedFloat16AtomicAdd))) { onFail("a->shaderSharedFloat16AtomicAdd (Error: Value not equal)"); };
-    if (!((a->shaderSharedFloat16AtomicMinMax) == (b->shaderSharedFloat16AtomicMinMax))) { onFail("a->shaderSharedFloat16AtomicMinMax (Error: Value not equal)"); };
-    if (!((a->shaderSharedFloat32AtomicMinMax) == (b->shaderSharedFloat32AtomicMinMax))) { onFail("a->shaderSharedFloat32AtomicMinMax (Error: Value not equal)"); };
-    if (!((a->shaderSharedFloat64AtomicMinMax) == (b->shaderSharedFloat64AtomicMinMax))) { onFail("a->shaderSharedFloat64AtomicMinMax (Error: Value not equal)"); };
-    if (!((a->shaderImageFloat32AtomicMinMax) == (b->shaderImageFloat32AtomicMinMax))) { onFail("a->shaderImageFloat32AtomicMinMax (Error: Value not equal)"); };
-    if (!((a->sparseImageFloat32AtomicMinMax) == (b->sparseImageFloat32AtomicMinMax))) { onFail("a->sparseImageFloat32AtomicMinMax (Error: Value not equal)"); };
+    if (!((a->shaderBufferFloat16Atomics) == (b->shaderBufferFloat16Atomics))) {
+        onFail("a->shaderBufferFloat16Atomics (Error: Value not equal)");
+    };
+    if (!((a->shaderBufferFloat16AtomicAdd) == (b->shaderBufferFloat16AtomicAdd))) {
+        onFail("a->shaderBufferFloat16AtomicAdd (Error: Value not equal)");
+    };
+    if (!((a->shaderBufferFloat16AtomicMinMax) == (b->shaderBufferFloat16AtomicMinMax))) {
+        onFail("a->shaderBufferFloat16AtomicMinMax (Error: Value not equal)");
+    };
+    if (!((a->shaderBufferFloat32AtomicMinMax) == (b->shaderBufferFloat32AtomicMinMax))) {
+        onFail("a->shaderBufferFloat32AtomicMinMax (Error: Value not equal)");
+    };
+    if (!((a->shaderBufferFloat64AtomicMinMax) == (b->shaderBufferFloat64AtomicMinMax))) {
+        onFail("a->shaderBufferFloat64AtomicMinMax (Error: Value not equal)");
+    };
+    if (!((a->shaderSharedFloat16Atomics) == (b->shaderSharedFloat16Atomics))) {
+        onFail("a->shaderSharedFloat16Atomics (Error: Value not equal)");
+    };
+    if (!((a->shaderSharedFloat16AtomicAdd) == (b->shaderSharedFloat16AtomicAdd))) {
+        onFail("a->shaderSharedFloat16AtomicAdd (Error: Value not equal)");
+    };
+    if (!((a->shaderSharedFloat16AtomicMinMax) == (b->shaderSharedFloat16AtomicMinMax))) {
+        onFail("a->shaderSharedFloat16AtomicMinMax (Error: Value not equal)");
+    };
+    if (!((a->shaderSharedFloat32AtomicMinMax) == (b->shaderSharedFloat32AtomicMinMax))) {
+        onFail("a->shaderSharedFloat32AtomicMinMax (Error: Value not equal)");
+    };
+    if (!((a->shaderSharedFloat64AtomicMinMax) == (b->shaderSharedFloat64AtomicMinMax))) {
+        onFail("a->shaderSharedFloat64AtomicMinMax (Error: Value not equal)");
+    };
+    if (!((a->shaderImageFloat32AtomicMinMax) == (b->shaderImageFloat32AtomicMinMax))) {
+        onFail("a->shaderImageFloat32AtomicMinMax (Error: Value not equal)");
+    };
+    if (!((a->sparseImageFloat32AtomicMinMax) == (b->sparseImageFloat32AtomicMinMax))) {
+        onFail("a->sparseImageFloat32AtomicMinMax (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
 void checkEqual_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(
     const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* a,
-    const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->shaderDemoteToHelperInvocation) == (b->shaderDemoteToHelperInvocation))) { onFail("a->shaderDemoteToHelperInvocation (Error: Value not equal)"); };
+    if (!((a->shaderDemoteToHelperInvocation) == (b->shaderDemoteToHelperInvocation))) {
+        onFail("a->shaderDemoteToHelperInvocation (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_NV_device_generated_commands
 void checkEqual_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(
     const VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* a,
-    const VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->maxGraphicsShaderGroupCount) == (b->maxGraphicsShaderGroupCount))) { onFail("a->maxGraphicsShaderGroupCount (Error: Value not equal)"); };
-    if (!((a->maxIndirectSequenceCount) == (b->maxIndirectSequenceCount))) { onFail("a->maxIndirectSequenceCount (Error: Value not equal)"); };
-    if (!((a->maxIndirectCommandsTokenCount) == (b->maxIndirectCommandsTokenCount))) { onFail("a->maxIndirectCommandsTokenCount (Error: Value not equal)"); };
-    if (!((a->maxIndirectCommandsStreamCount) == (b->maxIndirectCommandsStreamCount))) { onFail("a->maxIndirectCommandsStreamCount (Error: Value not equal)"); };
-    if (!((a->maxIndirectCommandsTokenOffset) == (b->maxIndirectCommandsTokenOffset))) { onFail("a->maxIndirectCommandsTokenOffset (Error: Value not equal)"); };
-    if (!((a->maxIndirectCommandsStreamStride) == (b->maxIndirectCommandsStreamStride))) { onFail("a->maxIndirectCommandsStreamStride (Error: Value not equal)"); };
-    if (!((a->minSequencesCountBufferOffsetAlignment) == (b->minSequencesCountBufferOffsetAlignment))) { onFail("a->minSequencesCountBufferOffsetAlignment (Error: Value not equal)"); };
-    if (!((a->minSequencesIndexBufferOffsetAlignment) == (b->minSequencesIndexBufferOffsetAlignment))) { onFail("a->minSequencesIndexBufferOffsetAlignment (Error: Value not equal)"); };
-    if (!((a->minIndirectCommandsBufferOffsetAlignment) == (b->minIndirectCommandsBufferOffsetAlignment))) { onFail("a->minIndirectCommandsBufferOffsetAlignment (Error: Value not equal)"); };
+    if (!((a->maxGraphicsShaderGroupCount) == (b->maxGraphicsShaderGroupCount))) {
+        onFail("a->maxGraphicsShaderGroupCount (Error: Value not equal)");
+    };
+    if (!((a->maxIndirectSequenceCount) == (b->maxIndirectSequenceCount))) {
+        onFail("a->maxIndirectSequenceCount (Error: Value not equal)");
+    };
+    if (!((a->maxIndirectCommandsTokenCount) == (b->maxIndirectCommandsTokenCount))) {
+        onFail("a->maxIndirectCommandsTokenCount (Error: Value not equal)");
+    };
+    if (!((a->maxIndirectCommandsStreamCount) == (b->maxIndirectCommandsStreamCount))) {
+        onFail("a->maxIndirectCommandsStreamCount (Error: Value not equal)");
+    };
+    if (!((a->maxIndirectCommandsTokenOffset) == (b->maxIndirectCommandsTokenOffset))) {
+        onFail("a->maxIndirectCommandsTokenOffset (Error: Value not equal)");
+    };
+    if (!((a->maxIndirectCommandsStreamStride) == (b->maxIndirectCommandsStreamStride))) {
+        onFail("a->maxIndirectCommandsStreamStride (Error: Value not equal)");
+    };
+    if (!((a->minSequencesCountBufferOffsetAlignment) ==
+          (b->minSequencesCountBufferOffsetAlignment))) {
+        onFail("a->minSequencesCountBufferOffsetAlignment (Error: Value not equal)");
+    };
+    if (!((a->minSequencesIndexBufferOffsetAlignment) ==
+          (b->minSequencesIndexBufferOffsetAlignment))) {
+        onFail("a->minSequencesIndexBufferOffsetAlignment (Error: Value not equal)");
+    };
+    if (!((a->minIndirectCommandsBufferOffsetAlignment) ==
+          (b->minIndirectCommandsBufferOffsetAlignment))) {
+        onFail("a->minIndirectCommandsBufferOffsetAlignment (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(
     const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* a,
-    const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->deviceGeneratedCommands) == (b->deviceGeneratedCommands))) { onFail("a->deviceGeneratedCommands (Error: Value not equal)"); };
+    if (!((a->deviceGeneratedCommands) == (b->deviceGeneratedCommands))) {
+        onFail("a->deviceGeneratedCommands (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkGraphicsShaderGroupCreateInfoNV(
-    const VkGraphicsShaderGroupCreateInfoNV* a,
-    const VkGraphicsShaderGroupCreateInfoNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkGraphicsShaderGroupCreateInfoNV(const VkGraphicsShaderGroupCreateInfoNV* a,
+                                                  const VkGraphicsShaderGroupCreateInfoNV* b,
+                                                  OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->stageCount) == (b->stageCount))) { onFail("a->stageCount (Error: Value not equal)"); };
-    if ((a->pStages) && (b->pStages))
-    {
-        if (!((a->stageCount) == (b->stageCount))) { onFail("a->pStages (Error: Lengths not equal)"); };
-        if ((a->stageCount) == (b->stageCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->stageCount; ++i)
-                {
-                    checkEqual_VkPipelineShaderStageCreateInfo(a->pStages + i, b->pStages + i, onFail);
+    if (!((a->stageCount) == (b->stageCount))) {
+        onFail("a->stageCount (Error: Value not equal)");
+    };
+    if ((a->pStages) && (b->pStages)) {
+        if (!((a->stageCount) == (b->stageCount))) {
+            onFail("a->pStages (Error: Lengths not equal)");
+        };
+        if ((a->stageCount) == (b->stageCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->stageCount; ++i) {
+                    checkEqual_VkPipelineShaderStageCreateInfo(a->pStages + i, b->pStages + i,
+                                                               onFail);
                 }
             }
         }
     }
-    if (!((!(a->pVertexInputState) && !(b->pVertexInputState)) || ((a->pVertexInputState) && (b->pVertexInputState)))) { onFail("a->pVertexInputState (Error: Mismatch in optional field)"); };
-    if (a->pVertexInputState && b->pVertexInputState)
-    {
-        if ((a->pVertexInputState) && (b->pVertexInputState))
-        {
-            checkEqual_VkPipelineVertexInputStateCreateInfo(a->pVertexInputState, b->pVertexInputState, onFail);
+    if (!((!(a->pVertexInputState) && !(b->pVertexInputState)) ||
+          ((a->pVertexInputState) && (b->pVertexInputState)))) {
+        onFail("a->pVertexInputState (Error: Mismatch in optional field)");
+    };
+    if (a->pVertexInputState && b->pVertexInputState) {
+        if ((a->pVertexInputState) && (b->pVertexInputState)) {
+            checkEqual_VkPipelineVertexInputStateCreateInfo(a->pVertexInputState,
+                                                            b->pVertexInputState, onFail);
         }
     }
-    if (!((!(a->pTessellationState) && !(b->pTessellationState)) || ((a->pTessellationState) && (b->pTessellationState)))) { onFail("a->pTessellationState (Error: Mismatch in optional field)"); };
-    if (a->pTessellationState && b->pTessellationState)
-    {
-        if ((a->pTessellationState) && (b->pTessellationState))
-        {
-            checkEqual_VkPipelineTessellationStateCreateInfo(a->pTessellationState, b->pTessellationState, onFail);
+    if (!((!(a->pTessellationState) && !(b->pTessellationState)) ||
+          ((a->pTessellationState) && (b->pTessellationState)))) {
+        onFail("a->pTessellationState (Error: Mismatch in optional field)");
+    };
+    if (a->pTessellationState && b->pTessellationState) {
+        if ((a->pTessellationState) && (b->pTessellationState)) {
+            checkEqual_VkPipelineTessellationStateCreateInfo(a->pTessellationState,
+                                                             b->pTessellationState, onFail);
         }
     }
 }
 
 void checkEqual_VkGraphicsPipelineShaderGroupsCreateInfoNV(
     const VkGraphicsPipelineShaderGroupsCreateInfoNV* a,
-    const VkGraphicsPipelineShaderGroupsCreateInfoNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkGraphicsPipelineShaderGroupsCreateInfoNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->groupCount) == (b->groupCount))) { onFail("a->groupCount (Error: Value not equal)"); };
-    if ((a->pGroups) && (b->pGroups))
-    {
-        if (!((a->groupCount) == (b->groupCount))) { onFail("a->pGroups (Error: Lengths not equal)"); };
-        if ((a->groupCount) == (b->groupCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->groupCount; ++i)
-                {
-                    checkEqual_VkGraphicsShaderGroupCreateInfoNV(a->pGroups + i, b->pGroups + i, onFail);
+    if (!((a->groupCount) == (b->groupCount))) {
+        onFail("a->groupCount (Error: Value not equal)");
+    };
+    if ((a->pGroups) && (b->pGroups)) {
+        if (!((a->groupCount) == (b->groupCount))) {
+            onFail("a->pGroups (Error: Lengths not equal)");
+        };
+        if ((a->groupCount) == (b->groupCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->groupCount; ++i) {
+                    checkEqual_VkGraphicsShaderGroupCreateInfoNV(a->pGroups + i, b->pGroups + i,
+                                                                 onFail);
                 }
             }
         }
     }
-    if (!((a->pipelineCount) == (b->pipelineCount))) { onFail("a->pipelineCount (Error: Value not equal)"); };
-    if (!((a->pipelineCount) == (b->pipelineCount))) { onFail("a->pPipelines (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pPipelines, b->pPipelines, a->pipelineCount * sizeof(const VkPipeline)) == 0))) { onFail("a->pPipelines (Error: Unequal dyn array)"); };
+    if (!((a->pipelineCount) == (b->pipelineCount))) {
+        onFail("a->pipelineCount (Error: Value not equal)");
+    };
+    if (!((a->pipelineCount) == (b->pipelineCount))) {
+        onFail("a->pPipelines (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pPipelines, b->pPipelines, a->pipelineCount * sizeof(const VkPipeline)) ==
+           0))) {
+        onFail("a->pPipelines (Error: Unequal dyn array)");
+    };
 }
 
-void checkEqual_VkBindShaderGroupIndirectCommandNV(
-    const VkBindShaderGroupIndirectCommandNV* a,
-    const VkBindShaderGroupIndirectCommandNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->groupIndex) == (b->groupIndex))) { onFail("a->groupIndex (Error: Value not equal)"); };
+void checkEqual_VkBindShaderGroupIndirectCommandNV(const VkBindShaderGroupIndirectCommandNV* a,
+                                                   const VkBindShaderGroupIndirectCommandNV* b,
+                                                   OnFailCompareFunc onFail) {
+    if (!((a->groupIndex) == (b->groupIndex))) {
+        onFail("a->groupIndex (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkBindIndexBufferIndirectCommandNV(
-    const VkBindIndexBufferIndirectCommandNV* a,
-    const VkBindIndexBufferIndirectCommandNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->bufferAddress) == (b->bufferAddress))) { onFail("a->bufferAddress (Error: Value not equal)"); };
-    if (!((a->size) == (b->size))) { onFail("a->size (Error: Value not equal)"); };
-    if (!((a->indexType) == (b->indexType))) { onFail("a->indexType (Error: Value not equal)"); };
+void checkEqual_VkBindIndexBufferIndirectCommandNV(const VkBindIndexBufferIndirectCommandNV* a,
+                                                   const VkBindIndexBufferIndirectCommandNV* b,
+                                                   OnFailCompareFunc onFail) {
+    if (!((a->bufferAddress) == (b->bufferAddress))) {
+        onFail("a->bufferAddress (Error: Value not equal)");
+    };
+    if (!((a->size) == (b->size))) {
+        onFail("a->size (Error: Value not equal)");
+    };
+    if (!((a->indexType) == (b->indexType))) {
+        onFail("a->indexType (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkBindVertexBufferIndirectCommandNV(
-    const VkBindVertexBufferIndirectCommandNV* a,
-    const VkBindVertexBufferIndirectCommandNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->bufferAddress) == (b->bufferAddress))) { onFail("a->bufferAddress (Error: Value not equal)"); };
-    if (!((a->size) == (b->size))) { onFail("a->size (Error: Value not equal)"); };
-    if (!((a->stride) == (b->stride))) { onFail("a->stride (Error: Value not equal)"); };
+void checkEqual_VkBindVertexBufferIndirectCommandNV(const VkBindVertexBufferIndirectCommandNV* a,
+                                                    const VkBindVertexBufferIndirectCommandNV* b,
+                                                    OnFailCompareFunc onFail) {
+    if (!((a->bufferAddress) == (b->bufferAddress))) {
+        onFail("a->bufferAddress (Error: Value not equal)");
+    };
+    if (!((a->size) == (b->size))) {
+        onFail("a->size (Error: Value not equal)");
+    };
+    if (!((a->stride) == (b->stride))) {
+        onFail("a->stride (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkSetStateFlagsIndirectCommandNV(
-    const VkSetStateFlagsIndirectCommandNV* a,
-    const VkSetStateFlagsIndirectCommandNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->data) == (b->data))) { onFail("a->data (Error: Value not equal)"); };
+void checkEqual_VkSetStateFlagsIndirectCommandNV(const VkSetStateFlagsIndirectCommandNV* a,
+                                                 const VkSetStateFlagsIndirectCommandNV* b,
+                                                 OnFailCompareFunc onFail) {
+    if (!((a->data) == (b->data))) {
+        onFail("a->data (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkIndirectCommandsStreamNV(
-    const VkIndirectCommandsStreamNV* a,
-    const VkIndirectCommandsStreamNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->buffer) == (b->buffer))) { onFail("a->buffer (Error: Value not equal)"); };
-    if (!((a->offset) == (b->offset))) { onFail("a->offset (Error: Value not equal)"); };
+void checkEqual_VkIndirectCommandsStreamNV(const VkIndirectCommandsStreamNV* a,
+                                           const VkIndirectCommandsStreamNV* b,
+                                           OnFailCompareFunc onFail) {
+    if (!((a->buffer) == (b->buffer))) {
+        onFail("a->buffer (Error: Value not equal)");
+    };
+    if (!((a->offset) == (b->offset))) {
+        onFail("a->offset (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkIndirectCommandsLayoutTokenNV(
-    const VkIndirectCommandsLayoutTokenNV* a,
-    const VkIndirectCommandsLayoutTokenNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkIndirectCommandsLayoutTokenNV(const VkIndirectCommandsLayoutTokenNV* a,
+                                                const VkIndirectCommandsLayoutTokenNV* b,
+                                                OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->tokenType) == (b->tokenType))) { onFail("a->tokenType (Error: Value not equal)"); };
-    if (!((a->stream) == (b->stream))) { onFail("a->stream (Error: Value not equal)"); };
-    if (!((a->offset) == (b->offset))) { onFail("a->offset (Error: Value not equal)"); };
-    if (!((a->vertexBindingUnit) == (b->vertexBindingUnit))) { onFail("a->vertexBindingUnit (Error: Value not equal)"); };
-    if (!((a->vertexDynamicStride) == (b->vertexDynamicStride))) { onFail("a->vertexDynamicStride (Error: Value not equal)"); };
-    if (!((a->pushconstantPipelineLayout) == (b->pushconstantPipelineLayout))) { onFail("a->pushconstantPipelineLayout (Error: Value not equal)"); };
-    if (!((a->pushconstantShaderStageFlags) == (b->pushconstantShaderStageFlags))) { onFail("a->pushconstantShaderStageFlags (Error: Value not equal)"); };
-    if (!((a->pushconstantOffset) == (b->pushconstantOffset))) { onFail("a->pushconstantOffset (Error: Value not equal)"); };
-    if (!((a->pushconstantSize) == (b->pushconstantSize))) { onFail("a->pushconstantSize (Error: Value not equal)"); };
-    if (!((a->indirectStateFlags) == (b->indirectStateFlags))) { onFail("a->indirectStateFlags (Error: Value not equal)"); };
-    if (!((a->indexTypeCount) == (b->indexTypeCount))) { onFail("a->indexTypeCount (Error: Value not equal)"); };
-    if (!((a->indexTypeCount) == (b->indexTypeCount))) { onFail("a->pIndexTypes (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pIndexTypes, b->pIndexTypes, a->indexTypeCount * sizeof(const VkIndexType)) == 0))) { onFail("a->pIndexTypes (Error: Unequal dyn array)"); };
-    if (!((a->indexTypeCount) == (b->indexTypeCount))) { onFail("a->pIndexTypeValues (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pIndexTypeValues, b->pIndexTypeValues, a->indexTypeCount * sizeof(const uint32_t)) == 0))) { onFail("a->pIndexTypeValues (Error: Unequal dyn array)"); };
+    if (!((a->tokenType) == (b->tokenType))) {
+        onFail("a->tokenType (Error: Value not equal)");
+    };
+    if (!((a->stream) == (b->stream))) {
+        onFail("a->stream (Error: Value not equal)");
+    };
+    if (!((a->offset) == (b->offset))) {
+        onFail("a->offset (Error: Value not equal)");
+    };
+    if (!((a->vertexBindingUnit) == (b->vertexBindingUnit))) {
+        onFail("a->vertexBindingUnit (Error: Value not equal)");
+    };
+    if (!((a->vertexDynamicStride) == (b->vertexDynamicStride))) {
+        onFail("a->vertexDynamicStride (Error: Value not equal)");
+    };
+    if (!((a->pushconstantPipelineLayout) == (b->pushconstantPipelineLayout))) {
+        onFail("a->pushconstantPipelineLayout (Error: Value not equal)");
+    };
+    if (!((a->pushconstantShaderStageFlags) == (b->pushconstantShaderStageFlags))) {
+        onFail("a->pushconstantShaderStageFlags (Error: Value not equal)");
+    };
+    if (!((a->pushconstantOffset) == (b->pushconstantOffset))) {
+        onFail("a->pushconstantOffset (Error: Value not equal)");
+    };
+    if (!((a->pushconstantSize) == (b->pushconstantSize))) {
+        onFail("a->pushconstantSize (Error: Value not equal)");
+    };
+    if (!((a->indirectStateFlags) == (b->indirectStateFlags))) {
+        onFail("a->indirectStateFlags (Error: Value not equal)");
+    };
+    if (!((a->indexTypeCount) == (b->indexTypeCount))) {
+        onFail("a->indexTypeCount (Error: Value not equal)");
+    };
+    if (!((a->indexTypeCount) == (b->indexTypeCount))) {
+        onFail("a->pIndexTypes (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pIndexTypes, b->pIndexTypes, a->indexTypeCount * sizeof(const VkIndexType)) ==
+           0))) {
+        onFail("a->pIndexTypes (Error: Unequal dyn array)");
+    };
+    if (!((a->indexTypeCount) == (b->indexTypeCount))) {
+        onFail("a->pIndexTypeValues (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pIndexTypeValues, b->pIndexTypeValues,
+                  a->indexTypeCount * sizeof(const uint32_t)) == 0))) {
+        onFail("a->pIndexTypeValues (Error: Unequal dyn array)");
+    };
 }
 
-void checkEqual_VkIndirectCommandsLayoutCreateInfoNV(
-    const VkIndirectCommandsLayoutCreateInfoNV* a,
-    const VkIndirectCommandsLayoutCreateInfoNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkIndirectCommandsLayoutCreateInfoNV(const VkIndirectCommandsLayoutCreateInfoNV* a,
+                                                     const VkIndirectCommandsLayoutCreateInfoNV* b,
+                                                     OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->pipelineBindPoint) == (b->pipelineBindPoint))) { onFail("a->pipelineBindPoint (Error: Value not equal)"); };
-    if (!((a->tokenCount) == (b->tokenCount))) { onFail("a->tokenCount (Error: Value not equal)"); };
-    if ((a->pTokens) && (b->pTokens))
-    {
-        if (!((a->tokenCount) == (b->tokenCount))) { onFail("a->pTokens (Error: Lengths not equal)"); };
-        if ((a->tokenCount) == (b->tokenCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->tokenCount; ++i)
-                {
-                    checkEqual_VkIndirectCommandsLayoutTokenNV(a->pTokens + i, b->pTokens + i, onFail);
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->pipelineBindPoint) == (b->pipelineBindPoint))) {
+        onFail("a->pipelineBindPoint (Error: Value not equal)");
+    };
+    if (!((a->tokenCount) == (b->tokenCount))) {
+        onFail("a->tokenCount (Error: Value not equal)");
+    };
+    if ((a->pTokens) && (b->pTokens)) {
+        if (!((a->tokenCount) == (b->tokenCount))) {
+            onFail("a->pTokens (Error: Lengths not equal)");
+        };
+        if ((a->tokenCount) == (b->tokenCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->tokenCount; ++i) {
+                    checkEqual_VkIndirectCommandsLayoutTokenNV(a->pTokens + i, b->pTokens + i,
+                                                               onFail);
                 }
             }
         }
     }
-    if (!((a->streamCount) == (b->streamCount))) { onFail("a->streamCount (Error: Value not equal)"); };
-    if (!((a->streamCount) == (b->streamCount))) { onFail("a->pStreamStrides (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pStreamStrides, b->pStreamStrides, a->streamCount * sizeof(const uint32_t)) == 0))) { onFail("a->pStreamStrides (Error: Unequal dyn array)"); };
+    if (!((a->streamCount) == (b->streamCount))) {
+        onFail("a->streamCount (Error: Value not equal)");
+    };
+    if (!((a->streamCount) == (b->streamCount))) {
+        onFail("a->pStreamStrides (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pStreamStrides, b->pStreamStrides, a->streamCount * sizeof(const uint32_t)) ==
+           0))) {
+        onFail("a->pStreamStrides (Error: Unequal dyn array)");
+    };
 }
 
-void checkEqual_VkGeneratedCommandsInfoNV(
-    const VkGeneratedCommandsInfoNV* a,
-    const VkGeneratedCommandsInfoNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkGeneratedCommandsInfoNV(const VkGeneratedCommandsInfoNV* a,
+                                          const VkGeneratedCommandsInfoNV* b,
+                                          OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->pipelineBindPoint) == (b->pipelineBindPoint))) { onFail("a->pipelineBindPoint (Error: Value not equal)"); };
-    if (!((a->pipeline) == (b->pipeline))) { onFail("a->pipeline (Error: Value not equal)"); };
-    if (!((a->indirectCommandsLayout) == (b->indirectCommandsLayout))) { onFail("a->indirectCommandsLayout (Error: Value not equal)"); };
-    if (!((a->streamCount) == (b->streamCount))) { onFail("a->streamCount (Error: Value not equal)"); };
-    if ((a->pStreams) && (b->pStreams))
-    {
-        if (!((a->streamCount) == (b->streamCount))) { onFail("a->pStreams (Error: Lengths not equal)"); };
-        if ((a->streamCount) == (b->streamCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->streamCount; ++i)
-                {
+    if (!((a->pipelineBindPoint) == (b->pipelineBindPoint))) {
+        onFail("a->pipelineBindPoint (Error: Value not equal)");
+    };
+    if (!((a->pipeline) == (b->pipeline))) {
+        onFail("a->pipeline (Error: Value not equal)");
+    };
+    if (!((a->indirectCommandsLayout) == (b->indirectCommandsLayout))) {
+        onFail("a->indirectCommandsLayout (Error: Value not equal)");
+    };
+    if (!((a->streamCount) == (b->streamCount))) {
+        onFail("a->streamCount (Error: Value not equal)");
+    };
+    if ((a->pStreams) && (b->pStreams)) {
+        if (!((a->streamCount) == (b->streamCount))) {
+            onFail("a->pStreams (Error: Lengths not equal)");
+        };
+        if ((a->streamCount) == (b->streamCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->streamCount; ++i) {
                     checkEqual_VkIndirectCommandsStreamNV(a->pStreams + i, b->pStreams + i, onFail);
                 }
             }
         }
     }
-    if (!((a->sequencesCount) == (b->sequencesCount))) { onFail("a->sequencesCount (Error: Value not equal)"); };
-    if (!((a->preprocessBuffer) == (b->preprocessBuffer))) { onFail("a->preprocessBuffer (Error: Value not equal)"); };
-    if (!((a->preprocessOffset) == (b->preprocessOffset))) { onFail("a->preprocessOffset (Error: Value not equal)"); };
-    if (!((a->preprocessSize) == (b->preprocessSize))) { onFail("a->preprocessSize (Error: Value not equal)"); };
-    if (!((a->sequencesCountBuffer) == (b->sequencesCountBuffer))) { onFail("a->sequencesCountBuffer (Error: Value not equal)"); };
-    if (!((a->sequencesCountOffset) == (b->sequencesCountOffset))) { onFail("a->sequencesCountOffset (Error: Value not equal)"); };
-    if (!((a->sequencesIndexBuffer) == (b->sequencesIndexBuffer))) { onFail("a->sequencesIndexBuffer (Error: Value not equal)"); };
-    if (!((a->sequencesIndexOffset) == (b->sequencesIndexOffset))) { onFail("a->sequencesIndexOffset (Error: Value not equal)"); };
+    if (!((a->sequencesCount) == (b->sequencesCount))) {
+        onFail("a->sequencesCount (Error: Value not equal)");
+    };
+    if (!((a->preprocessBuffer) == (b->preprocessBuffer))) {
+        onFail("a->preprocessBuffer (Error: Value not equal)");
+    };
+    if (!((a->preprocessOffset) == (b->preprocessOffset))) {
+        onFail("a->preprocessOffset (Error: Value not equal)");
+    };
+    if (!((a->preprocessSize) == (b->preprocessSize))) {
+        onFail("a->preprocessSize (Error: Value not equal)");
+    };
+    if (!((a->sequencesCountBuffer) == (b->sequencesCountBuffer))) {
+        onFail("a->sequencesCountBuffer (Error: Value not equal)");
+    };
+    if (!((a->sequencesCountOffset) == (b->sequencesCountOffset))) {
+        onFail("a->sequencesCountOffset (Error: Value not equal)");
+    };
+    if (!((a->sequencesIndexBuffer) == (b->sequencesIndexBuffer))) {
+        onFail("a->sequencesIndexBuffer (Error: Value not equal)");
+    };
+    if (!((a->sequencesIndexOffset) == (b->sequencesIndexOffset))) {
+        onFail("a->sequencesIndexOffset (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkGeneratedCommandsMemoryRequirementsInfoNV(
     const VkGeneratedCommandsMemoryRequirementsInfoNV* a,
-    const VkGeneratedCommandsMemoryRequirementsInfoNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkGeneratedCommandsMemoryRequirementsInfoNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->pipelineBindPoint) == (b->pipelineBindPoint))) { onFail("a->pipelineBindPoint (Error: Value not equal)"); };
-    if (!((a->pipeline) == (b->pipeline))) { onFail("a->pipeline (Error: Value not equal)"); };
-    if (!((a->indirectCommandsLayout) == (b->indirectCommandsLayout))) { onFail("a->indirectCommandsLayout (Error: Value not equal)"); };
-    if (!((a->maxSequencesCount) == (b->maxSequencesCount))) { onFail("a->maxSequencesCount (Error: Value not equal)"); };
+    if (!((a->pipelineBindPoint) == (b->pipelineBindPoint))) {
+        onFail("a->pipelineBindPoint (Error: Value not equal)");
+    };
+    if (!((a->pipeline) == (b->pipeline))) {
+        onFail("a->pipeline (Error: Value not equal)");
+    };
+    if (!((a->indirectCommandsLayout) == (b->indirectCommandsLayout))) {
+        onFail("a->indirectCommandsLayout (Error: Value not equal)");
+    };
+    if (!((a->maxSequencesCount) == (b->maxSequencesCount))) {
+        onFail("a->maxSequencesCount (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_NV_inherited_viewport_scissor
 void checkEqual_VkPhysicalDeviceInheritedViewportScissorFeaturesNV(
     const VkPhysicalDeviceInheritedViewportScissorFeaturesNV* a,
-    const VkPhysicalDeviceInheritedViewportScissorFeaturesNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceInheritedViewportScissorFeaturesNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->inheritedViewportScissor2D) == (b->inheritedViewportScissor2D))) { onFail("a->inheritedViewportScissor2D (Error: Value not equal)"); };
+    if (!((a->inheritedViewportScissor2D) == (b->inheritedViewportScissor2D))) {
+        onFail("a->inheritedViewportScissor2D (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkCommandBufferInheritanceViewportScissorInfoNV(
     const VkCommandBufferInheritanceViewportScissorInfoNV* a,
-    const VkCommandBufferInheritanceViewportScissorInfoNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkCommandBufferInheritanceViewportScissorInfoNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->viewportScissor2D) == (b->viewportScissor2D))) { onFail("a->viewportScissor2D (Error: Value not equal)"); };
-    if (!((a->viewportDepthCount) == (b->viewportDepthCount))) { onFail("a->viewportDepthCount (Error: Value not equal)"); };
-    if (!((!(a->pViewportDepths) && !(b->pViewportDepths)) || ((a->pViewportDepths) && (b->pViewportDepths)))) { onFail("a->pViewportDepths (Error: Mismatch in optional field)"); };
-    if (a->pViewportDepths && b->pViewportDepths)
-    {
-        if ((a->pViewportDepths) && (b->pViewportDepths))
-        {
+    if (!((a->viewportScissor2D) == (b->viewportScissor2D))) {
+        onFail("a->viewportScissor2D (Error: Value not equal)");
+    };
+    if (!((a->viewportDepthCount) == (b->viewportDepthCount))) {
+        onFail("a->viewportDepthCount (Error: Value not equal)");
+    };
+    if (!((!(a->pViewportDepths) && !(b->pViewportDepths)) ||
+          ((a->pViewportDepths) && (b->pViewportDepths)))) {
+        onFail("a->pViewportDepths (Error: Mismatch in optional field)");
+    };
+    if (a->pViewportDepths && b->pViewportDepths) {
+        if ((a->pViewportDepths) && (b->pViewportDepths)) {
             checkEqual_VkViewport(a->pViewportDepths, b->pViewportDepths, onFail);
         }
     }
@@ -11759,59 +15725,73 @@
 #ifdef VK_EXT_texel_buffer_alignment
 void checkEqual_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
     const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* a,
-    const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->texelBufferAlignment) == (b->texelBufferAlignment))) { onFail("a->texelBufferAlignment (Error: Value not equal)"); };
+    if (!((a->texelBufferAlignment) == (b->texelBufferAlignment))) {
+        onFail("a->texelBufferAlignment (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(
     const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* a,
-    const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->storageTexelBufferOffsetAlignmentBytes) == (b->storageTexelBufferOffsetAlignmentBytes))) { onFail("a->storageTexelBufferOffsetAlignmentBytes (Error: Value not equal)"); };
-    if (!((a->storageTexelBufferOffsetSingleTexelAlignment) == (b->storageTexelBufferOffsetSingleTexelAlignment))) { onFail("a->storageTexelBufferOffsetSingleTexelAlignment (Error: Value not equal)"); };
-    if (!((a->uniformTexelBufferOffsetAlignmentBytes) == (b->uniformTexelBufferOffsetAlignmentBytes))) { onFail("a->uniformTexelBufferOffsetAlignmentBytes (Error: Value not equal)"); };
-    if (!((a->uniformTexelBufferOffsetSingleTexelAlignment) == (b->uniformTexelBufferOffsetSingleTexelAlignment))) { onFail("a->uniformTexelBufferOffsetSingleTexelAlignment (Error: Value not equal)"); };
+    if (!((a->storageTexelBufferOffsetAlignmentBytes) ==
+          (b->storageTexelBufferOffsetAlignmentBytes))) {
+        onFail("a->storageTexelBufferOffsetAlignmentBytes (Error: Value not equal)");
+    };
+    if (!((a->storageTexelBufferOffsetSingleTexelAlignment) ==
+          (b->storageTexelBufferOffsetSingleTexelAlignment))) {
+        onFail("a->storageTexelBufferOffsetSingleTexelAlignment (Error: Value not equal)");
+    };
+    if (!((a->uniformTexelBufferOffsetAlignmentBytes) ==
+          (b->uniformTexelBufferOffsetAlignmentBytes))) {
+        onFail("a->uniformTexelBufferOffsetAlignmentBytes (Error: Value not equal)");
+    };
+    if (!((a->uniformTexelBufferOffsetSingleTexelAlignment) ==
+          (b->uniformTexelBufferOffsetSingleTexelAlignment))) {
+        onFail("a->uniformTexelBufferOffsetSingleTexelAlignment (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_QCOM_render_pass_transform
-void checkEqual_VkRenderPassTransformBeginInfoQCOM(
-    const VkRenderPassTransformBeginInfoQCOM* a,
-    const VkRenderPassTransformBeginInfoQCOM* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkRenderPassTransformBeginInfoQCOM(const VkRenderPassTransformBeginInfoQCOM* a,
+                                                   const VkRenderPassTransformBeginInfoQCOM* b,
+                                                   OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->transform) == (b->transform))) { onFail("a->transform (Error: Value not equal)"); };
+    if (!((a->transform) == (b->transform))) {
+        onFail("a->transform (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(
     const VkCommandBufferInheritanceRenderPassTransformInfoQCOM* a,
-    const VkCommandBufferInheritanceRenderPassTransformInfoQCOM* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkCommandBufferInheritanceRenderPassTransformInfoQCOM* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->transform) == (b->transform))) { onFail("a->transform (Error: Value not equal)"); };
+    if (!((a->transform) == (b->transform))) {
+        onFail("a->transform (Error: Value not equal)");
+    };
     checkEqual_VkRect2D(&a->renderArea, &b->renderArea, onFail);
 }
 
@@ -11819,48 +15799,65 @@
 #ifdef VK_EXT_device_memory_report
 void checkEqual_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(
     const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* a,
-    const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->deviceMemoryReport) == (b->deviceMemoryReport))) { onFail("a->deviceMemoryReport (Error: Value not equal)"); };
+    if (!((a->deviceMemoryReport) == (b->deviceMemoryReport))) {
+        onFail("a->deviceMemoryReport (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkDeviceMemoryReportCallbackDataEXT(
-    const VkDeviceMemoryReportCallbackDataEXT* a,
-    const VkDeviceMemoryReportCallbackDataEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDeviceMemoryReportCallbackDataEXT(const VkDeviceMemoryReportCallbackDataEXT* a,
+                                                    const VkDeviceMemoryReportCallbackDataEXT* b,
+                                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->type) == (b->type))) { onFail("a->type (Error: Value not equal)"); };
-    if (!((a->memoryObjectId) == (b->memoryObjectId))) { onFail("a->memoryObjectId (Error: Value not equal)"); };
-    if (!((a->size) == (b->size))) { onFail("a->size (Error: Value not equal)"); };
-    if (!((a->objectType) == (b->objectType))) { onFail("a->objectType (Error: Value not equal)"); };
-    if (!((a->objectHandle) == (b->objectHandle))) { onFail("a->objectHandle (Error: Value not equal)"); };
-    if (!((a->heapIndex) == (b->heapIndex))) { onFail("a->heapIndex (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->type) == (b->type))) {
+        onFail("a->type (Error: Value not equal)");
+    };
+    if (!((a->memoryObjectId) == (b->memoryObjectId))) {
+        onFail("a->memoryObjectId (Error: Value not equal)");
+    };
+    if (!((a->size) == (b->size))) {
+        onFail("a->size (Error: Value not equal)");
+    };
+    if (!((a->objectType) == (b->objectType))) {
+        onFail("a->objectType (Error: Value not equal)");
+    };
+    if (!((a->objectHandle) == (b->objectHandle))) {
+        onFail("a->objectHandle (Error: Value not equal)");
+    };
+    if (!((a->heapIndex) == (b->heapIndex))) {
+        onFail("a->heapIndex (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkDeviceDeviceMemoryReportCreateInfoEXT(
     const VkDeviceDeviceMemoryReportCreateInfoEXT* a,
-    const VkDeviceDeviceMemoryReportCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkDeviceDeviceMemoryReportCreateInfoEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->pfnUserCallback) == (b->pfnUserCallback))) { onFail("a->pfnUserCallback (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->pfnUserCallback) == (b->pfnUserCallback))) {
+        onFail("a->pfnUserCallback (Error: Value not equal)");
+    };
 }
 
 #endif
@@ -11869,74 +15866,89 @@
 #ifdef VK_EXT_robustness2
 void checkEqual_VkPhysicalDeviceRobustness2FeaturesEXT(
     const VkPhysicalDeviceRobustness2FeaturesEXT* a,
-    const VkPhysicalDeviceRobustness2FeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceRobustness2FeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->robustBufferAccess2) == (b->robustBufferAccess2))) { onFail("a->robustBufferAccess2 (Error: Value not equal)"); };
-    if (!((a->robustImageAccess2) == (b->robustImageAccess2))) { onFail("a->robustImageAccess2 (Error: Value not equal)"); };
-    if (!((a->nullDescriptor) == (b->nullDescriptor))) { onFail("a->nullDescriptor (Error: Value not equal)"); };
+    if (!((a->robustBufferAccess2) == (b->robustBufferAccess2))) {
+        onFail("a->robustBufferAccess2 (Error: Value not equal)");
+    };
+    if (!((a->robustImageAccess2) == (b->robustImageAccess2))) {
+        onFail("a->robustImageAccess2 (Error: Value not equal)");
+    };
+    if (!((a->nullDescriptor) == (b->nullDescriptor))) {
+        onFail("a->nullDescriptor (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceRobustness2PropertiesEXT(
     const VkPhysicalDeviceRobustness2PropertiesEXT* a,
-    const VkPhysicalDeviceRobustness2PropertiesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceRobustness2PropertiesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->robustStorageBufferAccessSizeAlignment) == (b->robustStorageBufferAccessSizeAlignment))) { onFail("a->robustStorageBufferAccessSizeAlignment (Error: Value not equal)"); };
-    if (!((a->robustUniformBufferAccessSizeAlignment) == (b->robustUniformBufferAccessSizeAlignment))) { onFail("a->robustUniformBufferAccessSizeAlignment (Error: Value not equal)"); };
+    if (!((a->robustStorageBufferAccessSizeAlignment) ==
+          (b->robustStorageBufferAccessSizeAlignment))) {
+        onFail("a->robustStorageBufferAccessSizeAlignment (Error: Value not equal)");
+    };
+    if (!((a->robustUniformBufferAccessSizeAlignment) ==
+          (b->robustUniformBufferAccessSizeAlignment))) {
+        onFail("a->robustUniformBufferAccessSizeAlignment (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_custom_border_color
 void checkEqual_VkSamplerCustomBorderColorCreateInfoEXT(
     const VkSamplerCustomBorderColorCreateInfoEXT* a,
-    const VkSamplerCustomBorderColorCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkSamplerCustomBorderColorCreateInfoEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
     checkEqual_VkClearColorValue(&a->customBorderColor, &b->customBorderColor, onFail);
-    if (!((a->format) == (b->format))) { onFail("a->format (Error: Value not equal)"); };
+    if (!((a->format) == (b->format))) {
+        onFail("a->format (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceCustomBorderColorPropertiesEXT(
     const VkPhysicalDeviceCustomBorderColorPropertiesEXT* a,
-    const VkPhysicalDeviceCustomBorderColorPropertiesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceCustomBorderColorPropertiesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->maxCustomBorderColorSamplers) == (b->maxCustomBorderColorSamplers))) { onFail("a->maxCustomBorderColorSamplers (Error: Value not equal)"); };
+    if (!((a->maxCustomBorderColorSamplers) == (b->maxCustomBorderColorSamplers))) {
+        onFail("a->maxCustomBorderColorSamplers (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceCustomBorderColorFeaturesEXT(
     const VkPhysicalDeviceCustomBorderColorFeaturesEXT* a,
-    const VkPhysicalDeviceCustomBorderColorFeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceCustomBorderColorFeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->customBorderColors) == (b->customBorderColors))) { onFail("a->customBorderColors (Error: Value not equal)"); };
-    if (!((a->customBorderColorWithoutFormat) == (b->customBorderColorWithoutFormat))) { onFail("a->customBorderColorWithoutFormat (Error: Value not equal)"); };
+    if (!((a->customBorderColors) == (b->customBorderColors))) {
+        onFail("a->customBorderColors (Error: Value not equal)");
+    };
+    if (!((a->customBorderColorWithoutFormat) == (b->customBorderColorWithoutFormat))) {
+        onFail("a->customBorderColorWithoutFormat (Error: Value not equal)");
+    };
 }
 
 #endif
@@ -11945,84 +15957,90 @@
 #ifdef VK_EXT_private_data
 void checkEqual_VkPhysicalDevicePrivateDataFeaturesEXT(
     const VkPhysicalDevicePrivateDataFeaturesEXT* a,
-    const VkPhysicalDevicePrivateDataFeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDevicePrivateDataFeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->privateData) == (b->privateData))) { onFail("a->privateData (Error: Value not equal)"); };
+    if (!((a->privateData) == (b->privateData))) {
+        onFail("a->privateData (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkDevicePrivateDataCreateInfoEXT(
-    const VkDevicePrivateDataCreateInfoEXT* a,
-    const VkDevicePrivateDataCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDevicePrivateDataCreateInfoEXT(const VkDevicePrivateDataCreateInfoEXT* a,
+                                                 const VkDevicePrivateDataCreateInfoEXT* b,
+                                                 OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->privateDataSlotRequestCount) == (b->privateDataSlotRequestCount))) { onFail("a->privateDataSlotRequestCount (Error: Value not equal)"); };
+    if (!((a->privateDataSlotRequestCount) == (b->privateDataSlotRequestCount))) {
+        onFail("a->privateDataSlotRequestCount (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkPrivateDataSlotCreateInfoEXT(
-    const VkPrivateDataSlotCreateInfoEXT* a,
-    const VkPrivateDataSlotCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPrivateDataSlotCreateInfoEXT(const VkPrivateDataSlotCreateInfoEXT* a,
+                                               const VkPrivateDataSlotCreateInfoEXT* b,
+                                               OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_pipeline_creation_cache_control
 void checkEqual_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(
     const VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* a,
-    const VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->pipelineCreationCacheControl) == (b->pipelineCreationCacheControl))) { onFail("a->pipelineCreationCacheControl (Error: Value not equal)"); };
+    if (!((a->pipelineCreationCacheControl) == (b->pipelineCreationCacheControl))) {
+        onFail("a->pipelineCreationCacheControl (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_NV_device_diagnostics_config
 void checkEqual_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(
     const VkPhysicalDeviceDiagnosticsConfigFeaturesNV* a,
-    const VkPhysicalDeviceDiagnosticsConfigFeaturesNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceDiagnosticsConfigFeaturesNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->diagnosticsConfig) == (b->diagnosticsConfig))) { onFail("a->diagnosticsConfig (Error: Value not equal)"); };
+    if (!((a->diagnosticsConfig) == (b->diagnosticsConfig))) {
+        onFail("a->diagnosticsConfig (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkDeviceDiagnosticsConfigCreateInfoNV(
-    const VkDeviceDiagnosticsConfigCreateInfoNV* a,
-    const VkDeviceDiagnosticsConfigCreateInfoNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkDeviceDiagnosticsConfigCreateInfoNV* a, const VkDeviceDiagnosticsConfigCreateInfoNV* b,
+    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
 }
 
 #endif
@@ -12031,301 +16049,393 @@
 #ifdef VK_NV_fragment_shading_rate_enums
 void checkEqual_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(
     const VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* a,
-    const VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->fragmentShadingRateEnums) == (b->fragmentShadingRateEnums))) { onFail("a->fragmentShadingRateEnums (Error: Value not equal)"); };
-    if (!((a->supersampleFragmentShadingRates) == (b->supersampleFragmentShadingRates))) { onFail("a->supersampleFragmentShadingRates (Error: Value not equal)"); };
-    if (!((a->noInvocationFragmentShadingRates) == (b->noInvocationFragmentShadingRates))) { onFail("a->noInvocationFragmentShadingRates (Error: Value not equal)"); };
+    if (!((a->fragmentShadingRateEnums) == (b->fragmentShadingRateEnums))) {
+        onFail("a->fragmentShadingRateEnums (Error: Value not equal)");
+    };
+    if (!((a->supersampleFragmentShadingRates) == (b->supersampleFragmentShadingRates))) {
+        onFail("a->supersampleFragmentShadingRates (Error: Value not equal)");
+    };
+    if (!((a->noInvocationFragmentShadingRates) == (b->noInvocationFragmentShadingRates))) {
+        onFail("a->noInvocationFragmentShadingRates (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(
     const VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* a,
-    const VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->maxFragmentShadingRateInvocationCount) == (b->maxFragmentShadingRateInvocationCount))) { onFail("a->maxFragmentShadingRateInvocationCount (Error: Value not equal)"); };
+    if (!((a->maxFragmentShadingRateInvocationCount) ==
+          (b->maxFragmentShadingRateInvocationCount))) {
+        onFail("a->maxFragmentShadingRateInvocationCount (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(
     const VkPipelineFragmentShadingRateEnumStateCreateInfoNV* a,
-    const VkPipelineFragmentShadingRateEnumStateCreateInfoNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPipelineFragmentShadingRateEnumStateCreateInfoNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->shadingRateType) == (b->shadingRateType))) { onFail("a->shadingRateType (Error: Value not equal)"); };
-    if (!((a->shadingRate) == (b->shadingRate))) { onFail("a->shadingRate (Error: Value not equal)"); };
-    if (!((memcmp(a->combinerOps, b->combinerOps, 2 * sizeof(VkFragmentShadingRateCombinerOpKHR)) == 0))) { onFail("a->combinerOps (Error: Unequal static array)"); };
+    if (!((a->shadingRateType) == (b->shadingRateType))) {
+        onFail("a->shadingRateType (Error: Value not equal)");
+    };
+    if (!((a->shadingRate) == (b->shadingRate))) {
+        onFail("a->shadingRate (Error: Value not equal)");
+    };
+    if (!((memcmp(a->combinerOps, b->combinerOps, 2 * sizeof(VkFragmentShadingRateCombinerOpKHR)) ==
+           0))) {
+        onFail("a->combinerOps (Error: Unequal static array)");
+    };
 }
 
 #endif
 #ifdef VK_NV_ray_tracing_motion_blur
-void checkEqual_VkDeviceOrHostAddressConstKHR(
-    const VkDeviceOrHostAddressConstKHR* a,
-    const VkDeviceOrHostAddressConstKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->deviceAddress) == (b->deviceAddress))) { onFail("a->deviceAddress (Error: Value not equal)"); };
-    if (!((!(a->hostAddress) && !(b->hostAddress)) || ((a->hostAddress) && (b->hostAddress)))) { onFail("a->hostAddress (Error: Mismatch in optional field)"); };
+void checkEqual_VkDeviceOrHostAddressConstKHR(const VkDeviceOrHostAddressConstKHR* a,
+                                              const VkDeviceOrHostAddressConstKHR* b,
+                                              OnFailCompareFunc onFail) {
+    if (!((a->deviceAddress) == (b->deviceAddress))) {
+        onFail("a->deviceAddress (Error: Value not equal)");
+    };
+    if (!((!(a->hostAddress) && !(b->hostAddress)) || ((a->hostAddress) && (b->hostAddress)))) {
+        onFail("a->hostAddress (Error: Mismatch in optional field)");
+    };
 }
 
 void checkEqual_VkAccelerationStructureGeometryMotionTrianglesDataNV(
     const VkAccelerationStructureGeometryMotionTrianglesDataNV* a,
-    const VkAccelerationStructureGeometryMotionTrianglesDataNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkAccelerationStructureGeometryMotionTrianglesDataNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
     checkEqual_VkDeviceOrHostAddressConstKHR(&a->vertexData, &b->vertexData, onFail);
 }
 
-void checkEqual_VkAccelerationStructureMotionInfoNV(
-    const VkAccelerationStructureMotionInfoNV* a,
-    const VkAccelerationStructureMotionInfoNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkAccelerationStructureMotionInfoNV(const VkAccelerationStructureMotionInfoNV* a,
+                                                    const VkAccelerationStructureMotionInfoNV* b,
+                                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->maxInstances) == (b->maxInstances))) { onFail("a->maxInstances (Error: Value not equal)"); };
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
+    if (!((a->maxInstances) == (b->maxInstances))) {
+        onFail("a->maxInstances (Error: Value not equal)");
+    };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkAccelerationStructureMatrixMotionInstanceNV(
     const VkAccelerationStructureMatrixMotionInstanceNV* a,
-    const VkAccelerationStructureMatrixMotionInstanceNV* b,
-    OnFailCompareFunc onFail)
-{
+    const VkAccelerationStructureMatrixMotionInstanceNV* b, OnFailCompareFunc onFail) {
     checkEqual_VkTransformMatrixKHR(&a->transformT0, &b->transformT0, onFail);
     checkEqual_VkTransformMatrixKHR(&a->transformT1, &b->transformT1, onFail);
-    if (!((a->instanceCustomIndex) == (b->instanceCustomIndex))) { onFail("a->instanceCustomIndex (Error: Value not equal)"); };
-    if (!((a->mask) == (b->mask))) { onFail("a->mask (Error: Value not equal)"); };
-    if (!((a->instanceShaderBindingTableRecordOffset) == (b->instanceShaderBindingTableRecordOffset))) { onFail("a->instanceShaderBindingTableRecordOffset (Error: Value not equal)"); };
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->accelerationStructureReference) == (b->accelerationStructureReference))) { onFail("a->accelerationStructureReference (Error: Value not equal)"); };
+    if (!((a->instanceCustomIndex) == (b->instanceCustomIndex))) {
+        onFail("a->instanceCustomIndex (Error: Value not equal)");
+    };
+    if (!((a->mask) == (b->mask))) {
+        onFail("a->mask (Error: Value not equal)");
+    };
+    if (!((a->instanceShaderBindingTableRecordOffset) ==
+          (b->instanceShaderBindingTableRecordOffset))) {
+        onFail("a->instanceShaderBindingTableRecordOffset (Error: Value not equal)");
+    };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->accelerationStructureReference) == (b->accelerationStructureReference))) {
+        onFail("a->accelerationStructureReference (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkSRTDataNV(
-    const VkSRTDataNV* a,
-    const VkSRTDataNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sx) == (b->sx))) { onFail("a->sx (Error: Value not equal)"); };
-    if (!((a->a) == (b->a))) { onFail("a->a (Error: Value not equal)"); };
-    if (!((a->b) == (b->b))) { onFail("a->b (Error: Value not equal)"); };
-    if (!((a->pvx) == (b->pvx))) { onFail("a->pvx (Error: Value not equal)"); };
-    if (!((a->sy) == (b->sy))) { onFail("a->sy (Error: Value not equal)"); };
-    if (!((a->c) == (b->c))) { onFail("a->c (Error: Value not equal)"); };
-    if (!((a->pvy) == (b->pvy))) { onFail("a->pvy (Error: Value not equal)"); };
-    if (!((a->sz) == (b->sz))) { onFail("a->sz (Error: Value not equal)"); };
-    if (!((a->pvz) == (b->pvz))) { onFail("a->pvz (Error: Value not equal)"); };
-    if (!((a->qx) == (b->qx))) { onFail("a->qx (Error: Value not equal)"); };
-    if (!((a->qy) == (b->qy))) { onFail("a->qy (Error: Value not equal)"); };
-    if (!((a->qz) == (b->qz))) { onFail("a->qz (Error: Value not equal)"); };
-    if (!((a->qw) == (b->qw))) { onFail("a->qw (Error: Value not equal)"); };
-    if (!((a->tx) == (b->tx))) { onFail("a->tx (Error: Value not equal)"); };
-    if (!((a->ty) == (b->ty))) { onFail("a->ty (Error: Value not equal)"); };
-    if (!((a->tz) == (b->tz))) { onFail("a->tz (Error: Value not equal)"); };
+void checkEqual_VkSRTDataNV(const VkSRTDataNV* a, const VkSRTDataNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sx) == (b->sx))) {
+        onFail("a->sx (Error: Value not equal)");
+    };
+    if (!((a->a) == (b->a))) {
+        onFail("a->a (Error: Value not equal)");
+    };
+    if (!((a->b) == (b->b))) {
+        onFail("a->b (Error: Value not equal)");
+    };
+    if (!((a->pvx) == (b->pvx))) {
+        onFail("a->pvx (Error: Value not equal)");
+    };
+    if (!((a->sy) == (b->sy))) {
+        onFail("a->sy (Error: Value not equal)");
+    };
+    if (!((a->c) == (b->c))) {
+        onFail("a->c (Error: Value not equal)");
+    };
+    if (!((a->pvy) == (b->pvy))) {
+        onFail("a->pvy (Error: Value not equal)");
+    };
+    if (!((a->sz) == (b->sz))) {
+        onFail("a->sz (Error: Value not equal)");
+    };
+    if (!((a->pvz) == (b->pvz))) {
+        onFail("a->pvz (Error: Value not equal)");
+    };
+    if (!((a->qx) == (b->qx))) {
+        onFail("a->qx (Error: Value not equal)");
+    };
+    if (!((a->qy) == (b->qy))) {
+        onFail("a->qy (Error: Value not equal)");
+    };
+    if (!((a->qz) == (b->qz))) {
+        onFail("a->qz (Error: Value not equal)");
+    };
+    if (!((a->qw) == (b->qw))) {
+        onFail("a->qw (Error: Value not equal)");
+    };
+    if (!((a->tx) == (b->tx))) {
+        onFail("a->tx (Error: Value not equal)");
+    };
+    if (!((a->ty) == (b->ty))) {
+        onFail("a->ty (Error: Value not equal)");
+    };
+    if (!((a->tz) == (b->tz))) {
+        onFail("a->tz (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkAccelerationStructureSRTMotionInstanceNV(
     const VkAccelerationStructureSRTMotionInstanceNV* a,
-    const VkAccelerationStructureSRTMotionInstanceNV* b,
-    OnFailCompareFunc onFail)
-{
+    const VkAccelerationStructureSRTMotionInstanceNV* b, OnFailCompareFunc onFail) {
     checkEqual_VkSRTDataNV(&a->transformT0, &b->transformT0, onFail);
     checkEqual_VkSRTDataNV(&a->transformT1, &b->transformT1, onFail);
-    if (!((a->instanceCustomIndex) == (b->instanceCustomIndex))) { onFail("a->instanceCustomIndex (Error: Value not equal)"); };
-    if (!((a->mask) == (b->mask))) { onFail("a->mask (Error: Value not equal)"); };
-    if (!((a->instanceShaderBindingTableRecordOffset) == (b->instanceShaderBindingTableRecordOffset))) { onFail("a->instanceShaderBindingTableRecordOffset (Error: Value not equal)"); };
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->accelerationStructureReference) == (b->accelerationStructureReference))) { onFail("a->accelerationStructureReference (Error: Value not equal)"); };
+    if (!((a->instanceCustomIndex) == (b->instanceCustomIndex))) {
+        onFail("a->instanceCustomIndex (Error: Value not equal)");
+    };
+    if (!((a->mask) == (b->mask))) {
+        onFail("a->mask (Error: Value not equal)");
+    };
+    if (!((a->instanceShaderBindingTableRecordOffset) ==
+          (b->instanceShaderBindingTableRecordOffset))) {
+        onFail("a->instanceShaderBindingTableRecordOffset (Error: Value not equal)");
+    };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->accelerationStructureReference) == (b->accelerationStructureReference))) {
+        onFail("a->accelerationStructureReference (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkAccelerationStructureMotionInstanceDataNV(
     const VkAccelerationStructureMotionInstanceDataNV* a,
-    const VkAccelerationStructureMotionInstanceDataNV* b,
-    OnFailCompareFunc onFail)
-{
+    const VkAccelerationStructureMotionInstanceDataNV* b, OnFailCompareFunc onFail) {
     checkEqual_VkAccelerationStructureInstanceKHR(&a->staticInstance, &b->staticInstance, onFail);
-    checkEqual_VkAccelerationStructureMatrixMotionInstanceNV(&a->matrixMotionInstance, &b->matrixMotionInstance, onFail);
-    checkEqual_VkAccelerationStructureSRTMotionInstanceNV(&a->srtMotionInstance, &b->srtMotionInstance, onFail);
+    checkEqual_VkAccelerationStructureMatrixMotionInstanceNV(&a->matrixMotionInstance,
+                                                             &b->matrixMotionInstance, onFail);
+    checkEqual_VkAccelerationStructureSRTMotionInstanceNV(&a->srtMotionInstance,
+                                                          &b->srtMotionInstance, onFail);
 }
 
 void checkEqual_VkAccelerationStructureMotionInstanceNV(
     const VkAccelerationStructureMotionInstanceNV* a,
-    const VkAccelerationStructureMotionInstanceNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->type) == (b->type))) { onFail("a->type (Error: Value not equal)"); };
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
+    const VkAccelerationStructureMotionInstanceNV* b, OnFailCompareFunc onFail) {
+    if (!((a->type) == (b->type))) {
+        onFail("a->type (Error: Value not equal)");
+    };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
     checkEqual_VkAccelerationStructureMotionInstanceDataNV(&a->data, &b->data, onFail);
 }
 
 void checkEqual_VkPhysicalDeviceRayTracingMotionBlurFeaturesNV(
     const VkPhysicalDeviceRayTracingMotionBlurFeaturesNV* a,
-    const VkPhysicalDeviceRayTracingMotionBlurFeaturesNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceRayTracingMotionBlurFeaturesNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->rayTracingMotionBlur) == (b->rayTracingMotionBlur))) { onFail("a->rayTracingMotionBlur (Error: Value not equal)"); };
-    if (!((a->rayTracingMotionBlurPipelineTraceRaysIndirect) == (b->rayTracingMotionBlurPipelineTraceRaysIndirect))) { onFail("a->rayTracingMotionBlurPipelineTraceRaysIndirect (Error: Value not equal)"); };
+    if (!((a->rayTracingMotionBlur) == (b->rayTracingMotionBlur))) {
+        onFail("a->rayTracingMotionBlur (Error: Value not equal)");
+    };
+    if (!((a->rayTracingMotionBlurPipelineTraceRaysIndirect) ==
+          (b->rayTracingMotionBlurPipelineTraceRaysIndirect))) {
+        onFail("a->rayTracingMotionBlurPipelineTraceRaysIndirect (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_ycbcr_2plane_444_formats
 void checkEqual_VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT(
     const VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT* a,
-    const VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->ycbcr2plane444Formats) == (b->ycbcr2plane444Formats))) { onFail("a->ycbcr2plane444Formats (Error: Value not equal)"); };
+    if (!((a->ycbcr2plane444Formats) == (b->ycbcr2plane444Formats))) {
+        onFail("a->ycbcr2plane444Formats (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_fragment_density_map2
 void checkEqual_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(
     const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* a,
-    const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->fragmentDensityMapDeferred) == (b->fragmentDensityMapDeferred))) { onFail("a->fragmentDensityMapDeferred (Error: Value not equal)"); };
+    if (!((a->fragmentDensityMapDeferred) == (b->fragmentDensityMapDeferred))) {
+        onFail("a->fragmentDensityMapDeferred (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(
     const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* a,
-    const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->subsampledLoads) == (b->subsampledLoads))) { onFail("a->subsampledLoads (Error: Value not equal)"); };
-    if (!((a->subsampledCoarseReconstructionEarlyAccess) == (b->subsampledCoarseReconstructionEarlyAccess))) { onFail("a->subsampledCoarseReconstructionEarlyAccess (Error: Value not equal)"); };
-    if (!((a->maxSubsampledArrayLayers) == (b->maxSubsampledArrayLayers))) { onFail("a->maxSubsampledArrayLayers (Error: Value not equal)"); };
-    if (!((a->maxDescriptorSetSubsampledSamplers) == (b->maxDescriptorSetSubsampledSamplers))) { onFail("a->maxDescriptorSetSubsampledSamplers (Error: Value not equal)"); };
+    if (!((a->subsampledLoads) == (b->subsampledLoads))) {
+        onFail("a->subsampledLoads (Error: Value not equal)");
+    };
+    if (!((a->subsampledCoarseReconstructionEarlyAccess) ==
+          (b->subsampledCoarseReconstructionEarlyAccess))) {
+        onFail("a->subsampledCoarseReconstructionEarlyAccess (Error: Value not equal)");
+    };
+    if (!((a->maxSubsampledArrayLayers) == (b->maxSubsampledArrayLayers))) {
+        onFail("a->maxSubsampledArrayLayers (Error: Value not equal)");
+    };
+    if (!((a->maxDescriptorSetSubsampledSamplers) == (b->maxDescriptorSetSubsampledSamplers))) {
+        onFail("a->maxDescriptorSetSubsampledSamplers (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_QCOM_rotated_copy_commands
-void checkEqual_VkCopyCommandTransformInfoQCOM(
-    const VkCopyCommandTransformInfoQCOM* a,
-    const VkCopyCommandTransformInfoQCOM* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkCopyCommandTransformInfoQCOM(const VkCopyCommandTransformInfoQCOM* a,
+                                               const VkCopyCommandTransformInfoQCOM* b,
+                                               OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->transform) == (b->transform))) { onFail("a->transform (Error: Value not equal)"); };
+    if (!((a->transform) == (b->transform))) {
+        onFail("a->transform (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_image_robustness
 void checkEqual_VkPhysicalDeviceImageRobustnessFeaturesEXT(
     const VkPhysicalDeviceImageRobustnessFeaturesEXT* a,
-    const VkPhysicalDeviceImageRobustnessFeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceImageRobustnessFeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->robustImageAccess) == (b->robustImageAccess))) { onFail("a->robustImageAccess (Error: Value not equal)"); };
+    if (!((a->robustImageAccess) == (b->robustImageAccess))) {
+        onFail("a->robustImageAccess (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_4444_formats
 void checkEqual_VkPhysicalDevice4444FormatsFeaturesEXT(
     const VkPhysicalDevice4444FormatsFeaturesEXT* a,
-    const VkPhysicalDevice4444FormatsFeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDevice4444FormatsFeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->formatA4R4G4B4) == (b->formatA4R4G4B4))) { onFail("a->formatA4R4G4B4 (Error: Value not equal)"); };
-    if (!((a->formatA4B4G4R4) == (b->formatA4B4G4R4))) { onFail("a->formatA4B4G4R4 (Error: Value not equal)"); };
+    if (!((a->formatA4R4G4B4) == (b->formatA4R4G4B4))) {
+        onFail("a->formatA4R4G4B4 (Error: Value not equal)");
+    };
+    if (!((a->formatA4B4G4R4) == (b->formatA4B4G4R4))) {
+        onFail("a->formatA4B4G4R4 (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_rgba10x6_formats
 void checkEqual_VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT(
     const VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT* a,
-    const VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->formatRgba10x6WithoutYCbCrSampler) == (b->formatRgba10x6WithoutYCbCrSampler))) { onFail("a->formatRgba10x6WithoutYCbCrSampler (Error: Value not equal)"); };
+    if (!((a->formatRgba10x6WithoutYCbCrSampler) == (b->formatRgba10x6WithoutYCbCrSampler))) {
+        onFail("a->formatRgba10x6WithoutYCbCrSampler (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_NV_acquire_winrt_display
 #endif
 #ifdef VK_EXT_directfb_surface
-void checkEqual_VkDirectFBSurfaceCreateInfoEXT(
-    const VkDirectFBSurfaceCreateInfoEXT* a,
-    const VkDirectFBSurfaceCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkDirectFBSurfaceCreateInfoEXT(const VkDirectFBSurfaceCreateInfoEXT* a,
+                                               const VkDirectFBSurfaceCreateInfoEXT* b,
+                                               OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((!(a->dfb) && !(b->dfb)) || ((a->dfb) && (b->dfb)))) { onFail("a->dfb (Error: Mismatch in optional field)"); };
-    if (a->dfb && b->dfb)
-    {
-        if (!((memcmp(a->dfb, b->dfb, sizeof(IDirectFB)) == 0))) { onFail("a->dfb (Error: Unequal dyn array)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((!(a->dfb) && !(b->dfb)) || ((a->dfb) && (b->dfb)))) {
+        onFail("a->dfb (Error: Mismatch in optional field)");
+    };
+    if (a->dfb && b->dfb) {
+        if (!((memcmp(a->dfb, b->dfb, sizeof(IDirectFB)) == 0))) {
+            onFail("a->dfb (Error: Unequal dyn array)");
+        };
     }
-    if (!((!(a->surface) && !(b->surface)) || ((a->surface) && (b->surface)))) { onFail("a->surface (Error: Mismatch in optional field)"); };
-    if (a->surface && b->surface)
-    {
-        if (!((memcmp(a->surface, b->surface, sizeof(IDirectFBSurface)) == 0))) { onFail("a->surface (Error: Unequal dyn array)"); };
+    if (!((!(a->surface) && !(b->surface)) || ((a->surface) && (b->surface)))) {
+        onFail("a->surface (Error: Mismatch in optional field)");
+    };
+    if (a->surface && b->surface) {
+        if (!((memcmp(a->surface, b->surface, sizeof(IDirectFBSurface)) == 0))) {
+            onFail("a->surface (Error: Unequal dyn array)");
+        };
     }
 }
 
@@ -12333,48 +16443,55 @@
 #ifdef VK_VALVE_mutable_descriptor_type
 void checkEqual_VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE(
     const VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE* a,
-    const VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->mutableDescriptorType) == (b->mutableDescriptorType))) { onFail("a->mutableDescriptorType (Error: Value not equal)"); };
+    if (!((a->mutableDescriptorType) == (b->mutableDescriptorType))) {
+        onFail("a->mutableDescriptorType (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkMutableDescriptorTypeListVALVE(
-    const VkMutableDescriptorTypeListVALVE* a,
-    const VkMutableDescriptorTypeListVALVE* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->descriptorTypeCount) == (b->descriptorTypeCount))) { onFail("a->descriptorTypeCount (Error: Value not equal)"); };
-    if (!((a->descriptorTypeCount) == (b->descriptorTypeCount))) { onFail("a->pDescriptorTypes (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pDescriptorTypes, b->pDescriptorTypes, a->descriptorTypeCount * sizeof(const VkDescriptorType)) == 0))) { onFail("a->pDescriptorTypes (Error: Unequal dyn array)"); };
+void checkEqual_VkMutableDescriptorTypeListVALVE(const VkMutableDescriptorTypeListVALVE* a,
+                                                 const VkMutableDescriptorTypeListVALVE* b,
+                                                 OnFailCompareFunc onFail) {
+    if (!((a->descriptorTypeCount) == (b->descriptorTypeCount))) {
+        onFail("a->descriptorTypeCount (Error: Value not equal)");
+    };
+    if (!((a->descriptorTypeCount) == (b->descriptorTypeCount))) {
+        onFail("a->pDescriptorTypes (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pDescriptorTypes, b->pDescriptorTypes,
+                  a->descriptorTypeCount * sizeof(const VkDescriptorType)) == 0))) {
+        onFail("a->pDescriptorTypes (Error: Unequal dyn array)");
+    };
 }
 
 void checkEqual_VkMutableDescriptorTypeCreateInfoVALVE(
     const VkMutableDescriptorTypeCreateInfoVALVE* a,
-    const VkMutableDescriptorTypeCreateInfoVALVE* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkMutableDescriptorTypeCreateInfoVALVE* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->mutableDescriptorTypeListCount) == (b->mutableDescriptorTypeListCount))) { onFail("a->mutableDescriptorTypeListCount (Error: Value not equal)"); };
-    if ((a->pMutableDescriptorTypeLists) && (b->pMutableDescriptorTypeLists))
-    {
-        if (!((a->mutableDescriptorTypeListCount) == (b->mutableDescriptorTypeListCount))) { onFail("a->pMutableDescriptorTypeLists (Error: Lengths not equal)"); };
-        if ((a->mutableDescriptorTypeListCount) == (b->mutableDescriptorTypeListCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->mutableDescriptorTypeListCount; ++i)
-                {
-                    checkEqual_VkMutableDescriptorTypeListVALVE(a->pMutableDescriptorTypeLists + i, b->pMutableDescriptorTypeLists + i, onFail);
+    if (!((a->mutableDescriptorTypeListCount) == (b->mutableDescriptorTypeListCount))) {
+        onFail("a->mutableDescriptorTypeListCount (Error: Value not equal)");
+    };
+    if ((a->pMutableDescriptorTypeLists) && (b->pMutableDescriptorTypeLists)) {
+        if (!((a->mutableDescriptorTypeListCount) == (b->mutableDescriptorTypeListCount))) {
+            onFail("a->pMutableDescriptorTypeLists (Error: Lengths not equal)");
+        };
+        if ((a->mutableDescriptorTypeListCount) == (b->mutableDescriptorTypeListCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->mutableDescriptorTypeListCount; ++i) {
+                    checkEqual_VkMutableDescriptorTypeListVALVE(a->pMutableDescriptorTypeLists + i,
+                                                                b->pMutableDescriptorTypeLists + i,
+                                                                onFail);
                 }
             }
         }
@@ -12385,460 +16502,580 @@
 #ifdef VK_EXT_vertex_input_dynamic_state
 void checkEqual_VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT(
     const VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT* a,
-    const VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->vertexInputDynamicState) == (b->vertexInputDynamicState))) { onFail("a->vertexInputDynamicState (Error: Value not equal)"); };
+    if (!((a->vertexInputDynamicState) == (b->vertexInputDynamicState))) {
+        onFail("a->vertexInputDynamicState (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkVertexInputBindingDescription2EXT(
-    const VkVertexInputBindingDescription2EXT* a,
-    const VkVertexInputBindingDescription2EXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkVertexInputBindingDescription2EXT(const VkVertexInputBindingDescription2EXT* a,
+                                                    const VkVertexInputBindingDescription2EXT* b,
+                                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->binding) == (b->binding))) { onFail("a->binding (Error: Value not equal)"); };
-    if (!((a->stride) == (b->stride))) { onFail("a->stride (Error: Value not equal)"); };
-    if (!((a->inputRate) == (b->inputRate))) { onFail("a->inputRate (Error: Value not equal)"); };
-    if (!((a->divisor) == (b->divisor))) { onFail("a->divisor (Error: Value not equal)"); };
+    if (!((a->binding) == (b->binding))) {
+        onFail("a->binding (Error: Value not equal)");
+    };
+    if (!((a->stride) == (b->stride))) {
+        onFail("a->stride (Error: Value not equal)");
+    };
+    if (!((a->inputRate) == (b->inputRate))) {
+        onFail("a->inputRate (Error: Value not equal)");
+    };
+    if (!((a->divisor) == (b->divisor))) {
+        onFail("a->divisor (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkVertexInputAttributeDescription2EXT(
-    const VkVertexInputAttributeDescription2EXT* a,
-    const VkVertexInputAttributeDescription2EXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkVertexInputAttributeDescription2EXT* a, const VkVertexInputAttributeDescription2EXT* b,
+    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->location) == (b->location))) { onFail("a->location (Error: Value not equal)"); };
-    if (!((a->binding) == (b->binding))) { onFail("a->binding (Error: Value not equal)"); };
-    if (!((a->format) == (b->format))) { onFail("a->format (Error: Value not equal)"); };
-    if (!((a->offset) == (b->offset))) { onFail("a->offset (Error: Value not equal)"); };
+    if (!((a->location) == (b->location))) {
+        onFail("a->location (Error: Value not equal)");
+    };
+    if (!((a->binding) == (b->binding))) {
+        onFail("a->binding (Error: Value not equal)");
+    };
+    if (!((a->format) == (b->format))) {
+        onFail("a->format (Error: Value not equal)");
+    };
+    if (!((a->offset) == (b->offset))) {
+        onFail("a->offset (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_physical_device_drm
-void checkEqual_VkPhysicalDeviceDrmPropertiesEXT(
-    const VkPhysicalDeviceDrmPropertiesEXT* a,
-    const VkPhysicalDeviceDrmPropertiesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPhysicalDeviceDrmPropertiesEXT(const VkPhysicalDeviceDrmPropertiesEXT* a,
+                                                 const VkPhysicalDeviceDrmPropertiesEXT* b,
+                                                 OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->hasPrimary) == (b->hasPrimary))) { onFail("a->hasPrimary (Error: Value not equal)"); };
-    if (!((a->hasRender) == (b->hasRender))) { onFail("a->hasRender (Error: Value not equal)"); };
-    if (!((a->primaryMajor) == (b->primaryMajor))) { onFail("a->primaryMajor (Error: Value not equal)"); };
-    if (!((a->primaryMinor) == (b->primaryMinor))) { onFail("a->primaryMinor (Error: Value not equal)"); };
-    if (!((a->renderMajor) == (b->renderMajor))) { onFail("a->renderMajor (Error: Value not equal)"); };
-    if (!((a->renderMinor) == (b->renderMinor))) { onFail("a->renderMinor (Error: Value not equal)"); };
+    if (!((a->hasPrimary) == (b->hasPrimary))) {
+        onFail("a->hasPrimary (Error: Value not equal)");
+    };
+    if (!((a->hasRender) == (b->hasRender))) {
+        onFail("a->hasRender (Error: Value not equal)");
+    };
+    if (!((a->primaryMajor) == (b->primaryMajor))) {
+        onFail("a->primaryMajor (Error: Value not equal)");
+    };
+    if (!((a->primaryMinor) == (b->primaryMinor))) {
+        onFail("a->primaryMinor (Error: Value not equal)");
+    };
+    if (!((a->renderMajor) == (b->renderMajor))) {
+        onFail("a->renderMajor (Error: Value not equal)");
+    };
+    if (!((a->renderMinor) == (b->renderMinor))) {
+        onFail("a->renderMinor (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_primitive_topology_list_restart
 void checkEqual_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT(
     const VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT* a,
-    const VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->primitiveTopologyListRestart) == (b->primitiveTopologyListRestart))) { onFail("a->primitiveTopologyListRestart (Error: Value not equal)"); };
-    if (!((a->primitiveTopologyPatchListRestart) == (b->primitiveTopologyPatchListRestart))) { onFail("a->primitiveTopologyPatchListRestart (Error: Value not equal)"); };
+    if (!((a->primitiveTopologyListRestart) == (b->primitiveTopologyListRestart))) {
+        onFail("a->primitiveTopologyListRestart (Error: Value not equal)");
+    };
+    if (!((a->primitiveTopologyPatchListRestart) == (b->primitiveTopologyPatchListRestart))) {
+        onFail("a->primitiveTopologyPatchListRestart (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_FUCHSIA_external_memory
 void checkEqual_VkImportMemoryZirconHandleInfoFUCHSIA(
-    const VkImportMemoryZirconHandleInfoFUCHSIA* a,
-    const VkImportMemoryZirconHandleInfoFUCHSIA* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkImportMemoryZirconHandleInfoFUCHSIA* a, const VkImportMemoryZirconHandleInfoFUCHSIA* b,
+    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->handleType) == (b->handleType))) { onFail("a->handleType (Error: Value not equal)"); };
-    if (!((a->handle) == (b->handle))) { onFail("a->handle (Error: Value not equal)"); };
+    if (!((a->handleType) == (b->handleType))) {
+        onFail("a->handleType (Error: Value not equal)");
+    };
+    if (!((a->handle) == (b->handle))) {
+        onFail("a->handle (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkMemoryZirconHandlePropertiesFUCHSIA(
-    const VkMemoryZirconHandlePropertiesFUCHSIA* a,
-    const VkMemoryZirconHandlePropertiesFUCHSIA* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkMemoryZirconHandlePropertiesFUCHSIA* a, const VkMemoryZirconHandlePropertiesFUCHSIA* b,
+    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->memoryTypeBits) == (b->memoryTypeBits))) { onFail("a->memoryTypeBits (Error: Value not equal)"); };
+    if (!((a->memoryTypeBits) == (b->memoryTypeBits))) {
+        onFail("a->memoryTypeBits (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkMemoryGetZirconHandleInfoFUCHSIA(
-    const VkMemoryGetZirconHandleInfoFUCHSIA* a,
-    const VkMemoryGetZirconHandleInfoFUCHSIA* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkMemoryGetZirconHandleInfoFUCHSIA(const VkMemoryGetZirconHandleInfoFUCHSIA* a,
+                                                   const VkMemoryGetZirconHandleInfoFUCHSIA* b,
+                                                   OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->memory) == (b->memory))) { onFail("a->memory (Error: Value not equal)"); };
-    if (!((a->handleType) == (b->handleType))) { onFail("a->handleType (Error: Value not equal)"); };
+    if (!((a->memory) == (b->memory))) {
+        onFail("a->memory (Error: Value not equal)");
+    };
+    if (!((a->handleType) == (b->handleType))) {
+        onFail("a->handleType (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_FUCHSIA_external_semaphore
 void checkEqual_VkImportSemaphoreZirconHandleInfoFUCHSIA(
     const VkImportSemaphoreZirconHandleInfoFUCHSIA* a,
-    const VkImportSemaphoreZirconHandleInfoFUCHSIA* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkImportSemaphoreZirconHandleInfoFUCHSIA* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->semaphore) == (b->semaphore))) { onFail("a->semaphore (Error: Value not equal)"); };
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->handleType) == (b->handleType))) { onFail("a->handleType (Error: Value not equal)"); };
-    if (!((a->zirconHandle) == (b->zirconHandle))) { onFail("a->zirconHandle (Error: Value not equal)"); };
+    if (!((a->semaphore) == (b->semaphore))) {
+        onFail("a->semaphore (Error: Value not equal)");
+    };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->handleType) == (b->handleType))) {
+        onFail("a->handleType (Error: Value not equal)");
+    };
+    if (!((a->zirconHandle) == (b->zirconHandle))) {
+        onFail("a->zirconHandle (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkSemaphoreGetZirconHandleInfoFUCHSIA(
-    const VkSemaphoreGetZirconHandleInfoFUCHSIA* a,
-    const VkSemaphoreGetZirconHandleInfoFUCHSIA* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkSemaphoreGetZirconHandleInfoFUCHSIA* a, const VkSemaphoreGetZirconHandleInfoFUCHSIA* b,
+    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->semaphore) == (b->semaphore))) { onFail("a->semaphore (Error: Value not equal)"); };
-    if (!((a->handleType) == (b->handleType))) { onFail("a->handleType (Error: Value not equal)"); };
+    if (!((a->semaphore) == (b->semaphore))) {
+        onFail("a->semaphore (Error: Value not equal)");
+    };
+    if (!((a->handleType) == (b->handleType))) {
+        onFail("a->handleType (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
-void checkEqual_VkBufferCollectionCreateInfoFUCHSIA(
-    const VkBufferCollectionCreateInfoFUCHSIA* a,
-    const VkBufferCollectionCreateInfoFUCHSIA* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkBufferCollectionCreateInfoFUCHSIA(const VkBufferCollectionCreateInfoFUCHSIA* a,
+                                                    const VkBufferCollectionCreateInfoFUCHSIA* b,
+                                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->collectionToken) == (b->collectionToken))) { onFail("a->collectionToken (Error: Value not equal)"); };
+    if (!((a->collectionToken) == (b->collectionToken))) {
+        onFail("a->collectionToken (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkImportMemoryBufferCollectionFUCHSIA(
-    const VkImportMemoryBufferCollectionFUCHSIA* a,
-    const VkImportMemoryBufferCollectionFUCHSIA* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkImportMemoryBufferCollectionFUCHSIA* a, const VkImportMemoryBufferCollectionFUCHSIA* b,
+    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->collection) == (b->collection))) { onFail("a->collection (Error: Value not equal)"); };
-    if (!((a->index) == (b->index))) { onFail("a->index (Error: Value not equal)"); };
+    if (!((a->collection) == (b->collection))) {
+        onFail("a->collection (Error: Value not equal)");
+    };
+    if (!((a->index) == (b->index))) {
+        onFail("a->index (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkBufferCollectionImageCreateInfoFUCHSIA(
     const VkBufferCollectionImageCreateInfoFUCHSIA* a,
-    const VkBufferCollectionImageCreateInfoFUCHSIA* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkBufferCollectionImageCreateInfoFUCHSIA* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->collection) == (b->collection))) { onFail("a->collection (Error: Value not equal)"); };
-    if (!((a->index) == (b->index))) { onFail("a->index (Error: Value not equal)"); };
+    if (!((a->collection) == (b->collection))) {
+        onFail("a->collection (Error: Value not equal)");
+    };
+    if (!((a->index) == (b->index))) {
+        onFail("a->index (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkBufferCollectionConstraintsInfoFUCHSIA(
     const VkBufferCollectionConstraintsInfoFUCHSIA* a,
-    const VkBufferCollectionConstraintsInfoFUCHSIA* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkBufferCollectionConstraintsInfoFUCHSIA* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->minBufferCount) == (b->minBufferCount))) { onFail("a->minBufferCount (Error: Value not equal)"); };
-    if (!((a->maxBufferCount) == (b->maxBufferCount))) { onFail("a->maxBufferCount (Error: Value not equal)"); };
-    if (!((a->minBufferCountForCamping) == (b->minBufferCountForCamping))) { onFail("a->minBufferCountForCamping (Error: Value not equal)"); };
-    if (!((a->minBufferCountForDedicatedSlack) == (b->minBufferCountForDedicatedSlack))) { onFail("a->minBufferCountForDedicatedSlack (Error: Value not equal)"); };
-    if (!((a->minBufferCountForSharedSlack) == (b->minBufferCountForSharedSlack))) { onFail("a->minBufferCountForSharedSlack (Error: Value not equal)"); };
+    if (!((a->minBufferCount) == (b->minBufferCount))) {
+        onFail("a->minBufferCount (Error: Value not equal)");
+    };
+    if (!((a->maxBufferCount) == (b->maxBufferCount))) {
+        onFail("a->maxBufferCount (Error: Value not equal)");
+    };
+    if (!((a->minBufferCountForCamping) == (b->minBufferCountForCamping))) {
+        onFail("a->minBufferCountForCamping (Error: Value not equal)");
+    };
+    if (!((a->minBufferCountForDedicatedSlack) == (b->minBufferCountForDedicatedSlack))) {
+        onFail("a->minBufferCountForDedicatedSlack (Error: Value not equal)");
+    };
+    if (!((a->minBufferCountForSharedSlack) == (b->minBufferCountForSharedSlack))) {
+        onFail("a->minBufferCountForSharedSlack (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkBufferConstraintsInfoFUCHSIA(
-    const VkBufferConstraintsInfoFUCHSIA* a,
-    const VkBufferConstraintsInfoFUCHSIA* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkBufferConstraintsInfoFUCHSIA(const VkBufferConstraintsInfoFUCHSIA* a,
+                                               const VkBufferConstraintsInfoFUCHSIA* b,
+                                               OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
     checkEqual_VkBufferCreateInfo(&a->createInfo, &b->createInfo, onFail);
-    if (!((a->requiredFormatFeatures) == (b->requiredFormatFeatures))) { onFail("a->requiredFormatFeatures (Error: Value not equal)"); };
-    checkEqual_VkBufferCollectionConstraintsInfoFUCHSIA(&a->bufferCollectionConstraints, &b->bufferCollectionConstraints, onFail);
+    if (!((a->requiredFormatFeatures) == (b->requiredFormatFeatures))) {
+        onFail("a->requiredFormatFeatures (Error: Value not equal)");
+    };
+    checkEqual_VkBufferCollectionConstraintsInfoFUCHSIA(&a->bufferCollectionConstraints,
+                                                        &b->bufferCollectionConstraints, onFail);
 }
 
 void checkEqual_VkBufferCollectionBufferCreateInfoFUCHSIA(
     const VkBufferCollectionBufferCreateInfoFUCHSIA* a,
-    const VkBufferCollectionBufferCreateInfoFUCHSIA* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkBufferCollectionBufferCreateInfoFUCHSIA* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->collection) == (b->collection))) { onFail("a->collection (Error: Value not equal)"); };
-    if (!((a->index) == (b->index))) { onFail("a->index (Error: Value not equal)"); };
+    if (!((a->collection) == (b->collection))) {
+        onFail("a->collection (Error: Value not equal)");
+    };
+    if (!((a->index) == (b->index))) {
+        onFail("a->index (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkSysmemColorSpaceFUCHSIA(
-    const VkSysmemColorSpaceFUCHSIA* a,
-    const VkSysmemColorSpaceFUCHSIA* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkSysmemColorSpaceFUCHSIA(const VkSysmemColorSpaceFUCHSIA* a,
+                                          const VkSysmemColorSpaceFUCHSIA* b,
+                                          OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->colorSpace) == (b->colorSpace))) { onFail("a->colorSpace (Error: Value not equal)"); };
+    if (!((a->colorSpace) == (b->colorSpace))) {
+        onFail("a->colorSpace (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkBufferCollectionPropertiesFUCHSIA(
-    const VkBufferCollectionPropertiesFUCHSIA* a,
-    const VkBufferCollectionPropertiesFUCHSIA* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkBufferCollectionPropertiesFUCHSIA(const VkBufferCollectionPropertiesFUCHSIA* a,
+                                                    const VkBufferCollectionPropertiesFUCHSIA* b,
+                                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->memoryTypeBits) == (b->memoryTypeBits))) { onFail("a->memoryTypeBits (Error: Value not equal)"); };
-    if (!((a->bufferCount) == (b->bufferCount))) { onFail("a->bufferCount (Error: Value not equal)"); };
-    if (!((a->createInfoIndex) == (b->createInfoIndex))) { onFail("a->createInfoIndex (Error: Value not equal)"); };
-    if (!((a->sysmemPixelFormat) == (b->sysmemPixelFormat))) { onFail("a->sysmemPixelFormat (Error: Value not equal)"); };
-    if (!((a->formatFeatures) == (b->formatFeatures))) { onFail("a->formatFeatures (Error: Value not equal)"); };
-    checkEqual_VkSysmemColorSpaceFUCHSIA(&a->sysmemColorSpaceIndex, &b->sysmemColorSpaceIndex, onFail);
-    checkEqual_VkComponentMapping(&a->samplerYcbcrConversionComponents, &b->samplerYcbcrConversionComponents, onFail);
-    if (!((a->suggestedYcbcrModel) == (b->suggestedYcbcrModel))) { onFail("a->suggestedYcbcrModel (Error: Value not equal)"); };
-    if (!((a->suggestedYcbcrRange) == (b->suggestedYcbcrRange))) { onFail("a->suggestedYcbcrRange (Error: Value not equal)"); };
-    if (!((a->suggestedXChromaOffset) == (b->suggestedXChromaOffset))) { onFail("a->suggestedXChromaOffset (Error: Value not equal)"); };
-    if (!((a->suggestedYChromaOffset) == (b->suggestedYChromaOffset))) { onFail("a->suggestedYChromaOffset (Error: Value not equal)"); };
+    if (!((a->memoryTypeBits) == (b->memoryTypeBits))) {
+        onFail("a->memoryTypeBits (Error: Value not equal)");
+    };
+    if (!((a->bufferCount) == (b->bufferCount))) {
+        onFail("a->bufferCount (Error: Value not equal)");
+    };
+    if (!((a->createInfoIndex) == (b->createInfoIndex))) {
+        onFail("a->createInfoIndex (Error: Value not equal)");
+    };
+    if (!((a->sysmemPixelFormat) == (b->sysmemPixelFormat))) {
+        onFail("a->sysmemPixelFormat (Error: Value not equal)");
+    };
+    if (!((a->formatFeatures) == (b->formatFeatures))) {
+        onFail("a->formatFeatures (Error: Value not equal)");
+    };
+    checkEqual_VkSysmemColorSpaceFUCHSIA(&a->sysmemColorSpaceIndex, &b->sysmemColorSpaceIndex,
+                                         onFail);
+    checkEqual_VkComponentMapping(&a->samplerYcbcrConversionComponents,
+                                  &b->samplerYcbcrConversionComponents, onFail);
+    if (!((a->suggestedYcbcrModel) == (b->suggestedYcbcrModel))) {
+        onFail("a->suggestedYcbcrModel (Error: Value not equal)");
+    };
+    if (!((a->suggestedYcbcrRange) == (b->suggestedYcbcrRange))) {
+        onFail("a->suggestedYcbcrRange (Error: Value not equal)");
+    };
+    if (!((a->suggestedXChromaOffset) == (b->suggestedXChromaOffset))) {
+        onFail("a->suggestedXChromaOffset (Error: Value not equal)");
+    };
+    if (!((a->suggestedYChromaOffset) == (b->suggestedYChromaOffset))) {
+        onFail("a->suggestedYChromaOffset (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkImageFormatConstraintsInfoFUCHSIA(
-    const VkImageFormatConstraintsInfoFUCHSIA* a,
-    const VkImageFormatConstraintsInfoFUCHSIA* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkImageFormatConstraintsInfoFUCHSIA(const VkImageFormatConstraintsInfoFUCHSIA* a,
+                                                    const VkImageFormatConstraintsInfoFUCHSIA* b,
+                                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
     checkEqual_VkImageCreateInfo(&a->imageCreateInfo, &b->imageCreateInfo, onFail);
-    if (!((a->requiredFormatFeatures) == (b->requiredFormatFeatures))) { onFail("a->requiredFormatFeatures (Error: Value not equal)"); };
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->sysmemPixelFormat) == (b->sysmemPixelFormat))) { onFail("a->sysmemPixelFormat (Error: Value not equal)"); };
-    if (!((a->colorSpaceCount) == (b->colorSpaceCount))) { onFail("a->colorSpaceCount (Error: Value not equal)"); };
-    if ((a->pColorSpaces) && (b->pColorSpaces))
-    {
+    if (!((a->requiredFormatFeatures) == (b->requiredFormatFeatures))) {
+        onFail("a->requiredFormatFeatures (Error: Value not equal)");
+    };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->sysmemPixelFormat) == (b->sysmemPixelFormat))) {
+        onFail("a->sysmemPixelFormat (Error: Value not equal)");
+    };
+    if (!((a->colorSpaceCount) == (b->colorSpaceCount))) {
+        onFail("a->colorSpaceCount (Error: Value not equal)");
+    };
+    if ((a->pColorSpaces) && (b->pColorSpaces)) {
         checkEqual_VkSysmemColorSpaceFUCHSIA(a->pColorSpaces, b->pColorSpaces, onFail);
     }
 }
 
-void checkEqual_VkImageConstraintsInfoFUCHSIA(
-    const VkImageConstraintsInfoFUCHSIA* a,
-    const VkImageConstraintsInfoFUCHSIA* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkImageConstraintsInfoFUCHSIA(const VkImageConstraintsInfoFUCHSIA* a,
+                                              const VkImageConstraintsInfoFUCHSIA* b,
+                                              OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->formatConstraintsCount) == (b->formatConstraintsCount))) { onFail("a->formatConstraintsCount (Error: Value not equal)"); };
-    if ((a->pFormatConstraints) && (b->pFormatConstraints))
-    {
-        if (!((a->formatConstraintsCount) == (b->formatConstraintsCount))) { onFail("a->pFormatConstraints (Error: Lengths not equal)"); };
-        if ((a->formatConstraintsCount) == (b->formatConstraintsCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->formatConstraintsCount; ++i)
-                {
-                    checkEqual_VkImageFormatConstraintsInfoFUCHSIA(a->pFormatConstraints + i, b->pFormatConstraints + i, onFail);
+    if (!((a->formatConstraintsCount) == (b->formatConstraintsCount))) {
+        onFail("a->formatConstraintsCount (Error: Value not equal)");
+    };
+    if ((a->pFormatConstraints) && (b->pFormatConstraints)) {
+        if (!((a->formatConstraintsCount) == (b->formatConstraintsCount))) {
+            onFail("a->pFormatConstraints (Error: Lengths not equal)");
+        };
+        if ((a->formatConstraintsCount) == (b->formatConstraintsCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->formatConstraintsCount; ++i) {
+                    checkEqual_VkImageFormatConstraintsInfoFUCHSIA(
+                        a->pFormatConstraints + i, b->pFormatConstraints + i, onFail);
                 }
             }
         }
     }
-    checkEqual_VkBufferCollectionConstraintsInfoFUCHSIA(&a->bufferCollectionConstraints, &b->bufferCollectionConstraints, onFail);
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
+    checkEqual_VkBufferCollectionConstraintsInfoFUCHSIA(&a->bufferCollectionConstraints,
+                                                        &b->bufferCollectionConstraints, onFail);
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_HUAWEI_subpass_shading
 void checkEqual_VkSubpassShadingPipelineCreateInfoHUAWEI(
     const VkSubpassShadingPipelineCreateInfoHUAWEI* a,
-    const VkSubpassShadingPipelineCreateInfoHUAWEI* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkSubpassShadingPipelineCreateInfoHUAWEI* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->renderPass) == (b->renderPass))) { onFail("a->renderPass (Error: Value not equal)"); };
-    if (!((a->subpass) == (b->subpass))) { onFail("a->subpass (Error: Value not equal)"); };
+    if (!((a->renderPass) == (b->renderPass))) {
+        onFail("a->renderPass (Error: Value not equal)");
+    };
+    if (!((a->subpass) == (b->subpass))) {
+        onFail("a->subpass (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceSubpassShadingFeaturesHUAWEI(
     const VkPhysicalDeviceSubpassShadingFeaturesHUAWEI* a,
-    const VkPhysicalDeviceSubpassShadingFeaturesHUAWEI* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceSubpassShadingFeaturesHUAWEI* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->subpassShading) == (b->subpassShading))) { onFail("a->subpassShading (Error: Value not equal)"); };
+    if (!((a->subpassShading) == (b->subpassShading))) {
+        onFail("a->subpassShading (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceSubpassShadingPropertiesHUAWEI(
     const VkPhysicalDeviceSubpassShadingPropertiesHUAWEI* a,
-    const VkPhysicalDeviceSubpassShadingPropertiesHUAWEI* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceSubpassShadingPropertiesHUAWEI* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->maxSubpassShadingWorkgroupSizeAspectRatio) == (b->maxSubpassShadingWorkgroupSizeAspectRatio))) { onFail("a->maxSubpassShadingWorkgroupSizeAspectRatio (Error: Value not equal)"); };
+    if (!((a->maxSubpassShadingWorkgroupSizeAspectRatio) ==
+          (b->maxSubpassShadingWorkgroupSizeAspectRatio))) {
+        onFail("a->maxSubpassShadingWorkgroupSizeAspectRatio (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_HUAWEI_invocation_mask
 void checkEqual_VkPhysicalDeviceInvocationMaskFeaturesHUAWEI(
     const VkPhysicalDeviceInvocationMaskFeaturesHUAWEI* a,
-    const VkPhysicalDeviceInvocationMaskFeaturesHUAWEI* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceInvocationMaskFeaturesHUAWEI* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->invocationMask) == (b->invocationMask))) { onFail("a->invocationMask (Error: Value not equal)"); };
+    if (!((a->invocationMask) == (b->invocationMask))) {
+        onFail("a->invocationMask (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_NV_external_memory_rdma
-void checkEqual_VkMemoryGetRemoteAddressInfoNV(
-    const VkMemoryGetRemoteAddressInfoNV* a,
-    const VkMemoryGetRemoteAddressInfoNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkMemoryGetRemoteAddressInfoNV(const VkMemoryGetRemoteAddressInfoNV* a,
+                                               const VkMemoryGetRemoteAddressInfoNV* b,
+                                               OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->memory) == (b->memory))) { onFail("a->memory (Error: Value not equal)"); };
-    if (!((a->handleType) == (b->handleType))) { onFail("a->handleType (Error: Value not equal)"); };
+    if (!((a->memory) == (b->memory))) {
+        onFail("a->memory (Error: Value not equal)");
+    };
+    if (!((a->handleType) == (b->handleType))) {
+        onFail("a->handleType (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceExternalMemoryRDMAFeaturesNV(
     const VkPhysicalDeviceExternalMemoryRDMAFeaturesNV* a,
-    const VkPhysicalDeviceExternalMemoryRDMAFeaturesNV* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceExternalMemoryRDMAFeaturesNV* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->externalMemoryRDMA) == (b->externalMemoryRDMA))) { onFail("a->externalMemoryRDMA (Error: Value not equal)"); };
+    if (!((a->externalMemoryRDMA) == (b->externalMemoryRDMA))) {
+        onFail("a->externalMemoryRDMA (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
 void checkEqual_VkPhysicalDeviceExtendedDynamicState2FeaturesEXT(
     const VkPhysicalDeviceExtendedDynamicState2FeaturesEXT* a,
-    const VkPhysicalDeviceExtendedDynamicState2FeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceExtendedDynamicState2FeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->extendedDynamicState2) == (b->extendedDynamicState2))) { onFail("a->extendedDynamicState2 (Error: Value not equal)"); };
-    if (!((a->extendedDynamicState2LogicOp) == (b->extendedDynamicState2LogicOp))) { onFail("a->extendedDynamicState2LogicOp (Error: Value not equal)"); };
-    if (!((a->extendedDynamicState2PatchControlPoints) == (b->extendedDynamicState2PatchControlPoints))) { onFail("a->extendedDynamicState2PatchControlPoints (Error: Value not equal)"); };
+    if (!((a->extendedDynamicState2) == (b->extendedDynamicState2))) {
+        onFail("a->extendedDynamicState2 (Error: Value not equal)");
+    };
+    if (!((a->extendedDynamicState2LogicOp) == (b->extendedDynamicState2LogicOp))) {
+        onFail("a->extendedDynamicState2LogicOp (Error: Value not equal)");
+    };
+    if (!((a->extendedDynamicState2PatchControlPoints) ==
+          (b->extendedDynamicState2PatchControlPoints))) {
+        onFail("a->extendedDynamicState2PatchControlPoints (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_QNX_screen_surface
-void checkEqual_VkScreenSurfaceCreateInfoQNX(
-    const VkScreenSurfaceCreateInfoQNX* a,
-    const VkScreenSurfaceCreateInfoQNX* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkScreenSurfaceCreateInfoQNX(const VkScreenSurfaceCreateInfoQNX* a,
+                                             const VkScreenSurfaceCreateInfoQNX* b,
+                                             OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((!(a->context) && !(b->context)) || ((a->context) && (b->context)))) { onFail("a->context (Error: Mismatch in optional field)"); };
-    if (a->context && b->context)
-    {
-        if (!((memcmp(a->context, b->context, sizeof(_screen_context)) == 0))) { onFail("a->context (Error: Unequal dyn array)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((!(a->context) && !(b->context)) || ((a->context) && (b->context)))) {
+        onFail("a->context (Error: Mismatch in optional field)");
+    };
+    if (a->context && b->context) {
+        if (!((memcmp(a->context, b->context, sizeof(_screen_context)) == 0))) {
+            onFail("a->context (Error: Unequal dyn array)");
+        };
     }
-    if (!((!(a->window) && !(b->window)) || ((a->window) && (b->window)))) { onFail("a->window (Error: Mismatch in optional field)"); };
-    if (a->window && b->window)
-    {
-        if (!((memcmp(a->window, b->window, sizeof(_screen_window)) == 0))) { onFail("a->window (Error: Unequal dyn array)"); };
+    if (!((!(a->window) && !(b->window)) || ((a->window) && (b->window)))) {
+        onFail("a->window (Error: Mismatch in optional field)");
+    };
+    if (a->window && b->window) {
+        if (!((memcmp(a->window, b->window, sizeof(_screen_window)) == 0))) {
+            onFail("a->window (Error: Unequal dyn array)");
+        };
     }
 }
 
@@ -12846,151 +17083,180 @@
 #ifdef VK_EXT_color_write_enable
 void checkEqual_VkPhysicalDeviceColorWriteEnableFeaturesEXT(
     const VkPhysicalDeviceColorWriteEnableFeaturesEXT* a,
-    const VkPhysicalDeviceColorWriteEnableFeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceColorWriteEnableFeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->colorWriteEnable) == (b->colorWriteEnable))) { onFail("a->colorWriteEnable (Error: Value not equal)"); };
+    if (!((a->colorWriteEnable) == (b->colorWriteEnable))) {
+        onFail("a->colorWriteEnable (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkPipelineColorWriteCreateInfoEXT(
-    const VkPipelineColorWriteCreateInfoEXT* a,
-    const VkPipelineColorWriteCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPipelineColorWriteCreateInfoEXT(const VkPipelineColorWriteCreateInfoEXT* a,
+                                                  const VkPipelineColorWriteCreateInfoEXT* b,
+                                                  OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->attachmentCount) == (b->attachmentCount))) { onFail("a->attachmentCount (Error: Value not equal)"); };
-    if (!((a->attachmentCount) == (b->attachmentCount))) { onFail("a->pColorWriteEnables (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pColorWriteEnables, b->pColorWriteEnables, a->attachmentCount * sizeof(const VkBool32)) == 0))) { onFail("a->pColorWriteEnables (Error: Unequal dyn array)"); };
+    if (!((a->attachmentCount) == (b->attachmentCount))) {
+        onFail("a->attachmentCount (Error: Value not equal)");
+    };
+    if (!((a->attachmentCount) == (b->attachmentCount))) {
+        onFail("a->pColorWriteEnables (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pColorWriteEnables, b->pColorWriteEnables,
+                  a->attachmentCount * sizeof(const VkBool32)) == 0))) {
+        onFail("a->pColorWriteEnables (Error: Unequal dyn array)");
+    };
 }
 
 #endif
 #ifdef VK_GOOGLE_gfxstream
-void checkEqual_VkImportColorBufferGOOGLE(
-    const VkImportColorBufferGOOGLE* a,
-    const VkImportColorBufferGOOGLE* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkImportColorBufferGOOGLE(const VkImportColorBufferGOOGLE* a,
+                                          const VkImportColorBufferGOOGLE* b,
+                                          OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->colorBuffer) == (b->colorBuffer))) { onFail("a->colorBuffer (Error: Value not equal)"); };
+    if (!((a->colorBuffer) == (b->colorBuffer))) {
+        onFail("a->colorBuffer (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkImportBufferGOOGLE(
-    const VkImportBufferGOOGLE* a,
-    const VkImportBufferGOOGLE* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkImportBufferGOOGLE(const VkImportBufferGOOGLE* a, const VkImportBufferGOOGLE* b,
+                                     OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->buffer) == (b->buffer))) { onFail("a->buffer (Error: Value not equal)"); };
+    if (!((a->buffer) == (b->buffer))) {
+        onFail("a->buffer (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkImportPhysicalAddressGOOGLE(
-    const VkImportPhysicalAddressGOOGLE* a,
-    const VkImportPhysicalAddressGOOGLE* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkImportPhysicalAddressGOOGLE(const VkImportPhysicalAddressGOOGLE* a,
+                                              const VkImportPhysicalAddressGOOGLE* b,
+                                              OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->physicalAddress) == (b->physicalAddress))) { onFail("a->physicalAddress (Error: Value not equal)"); };
-    if (!((a->size) == (b->size))) { onFail("a->size (Error: Value not equal)"); };
-    if (!((a->format) == (b->format))) { onFail("a->format (Error: Value not equal)"); };
-    if (!((a->tiling) == (b->tiling))) { onFail("a->tiling (Error: Value not equal)"); };
-    if (!((a->tilingParameter) == (b->tilingParameter))) { onFail("a->tilingParameter (Error: Value not equal)"); };
+    if (!((a->physicalAddress) == (b->physicalAddress))) {
+        onFail("a->physicalAddress (Error: Value not equal)");
+    };
+    if (!((a->size) == (b->size))) {
+        onFail("a->size (Error: Value not equal)");
+    };
+    if (!((a->format) == (b->format))) {
+        onFail("a->format (Error: Value not equal)");
+    };
+    if (!((a->tiling) == (b->tiling))) {
+        onFail("a->tiling (Error: Value not equal)");
+    };
+    if (!((a->tilingParameter) == (b->tilingParameter))) {
+        onFail("a->tilingParameter (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_global_priority_query
 void checkEqual_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(
     const VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT* a,
-    const VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->globalPriorityQuery) == (b->globalPriorityQuery))) { onFail("a->globalPriorityQuery (Error: Value not equal)"); };
+    if (!((a->globalPriorityQuery) == (b->globalPriorityQuery))) {
+        onFail("a->globalPriorityQuery (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkQueueFamilyGlobalPriorityPropertiesEXT(
     const VkQueueFamilyGlobalPriorityPropertiesEXT* a,
-    const VkQueueFamilyGlobalPriorityPropertiesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkQueueFamilyGlobalPriorityPropertiesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->priorityCount) == (b->priorityCount))) { onFail("a->priorityCount (Error: Value not equal)"); };
-    if (!((memcmp(a->priorities, b->priorities, VK_MAX_GLOBAL_PRIORITY_SIZE_EXT * sizeof(VkQueueGlobalPriorityEXT)) == 0))) { onFail("a->priorities (Error: Unequal static array)"); };
+    if (!((a->priorityCount) == (b->priorityCount))) {
+        onFail("a->priorityCount (Error: Value not equal)");
+    };
+    if (!((memcmp(a->priorities, b->priorities,
+                  VK_MAX_GLOBAL_PRIORITY_SIZE_EXT * sizeof(VkQueueGlobalPriorityEXT)) == 0))) {
+        onFail("a->priorities (Error: Unequal static array)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_multi_draw
-void checkEqual_VkPhysicalDeviceMultiDrawFeaturesEXT(
-    const VkPhysicalDeviceMultiDrawFeaturesEXT* a,
-    const VkPhysicalDeviceMultiDrawFeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPhysicalDeviceMultiDrawFeaturesEXT(const VkPhysicalDeviceMultiDrawFeaturesEXT* a,
+                                                     const VkPhysicalDeviceMultiDrawFeaturesEXT* b,
+                                                     OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->multiDraw) == (b->multiDraw))) { onFail("a->multiDraw (Error: Value not equal)"); };
+    if (!((a->multiDraw) == (b->multiDraw))) {
+        onFail("a->multiDraw (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceMultiDrawPropertiesEXT(
     const VkPhysicalDeviceMultiDrawPropertiesEXT* a,
-    const VkPhysicalDeviceMultiDrawPropertiesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceMultiDrawPropertiesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->maxMultiDrawCount) == (b->maxMultiDrawCount))) { onFail("a->maxMultiDrawCount (Error: Value not equal)"); };
+    if (!((a->maxMultiDrawCount) == (b->maxMultiDrawCount))) {
+        onFail("a->maxMultiDrawCount (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkMultiDrawInfoEXT(
-    const VkMultiDrawInfoEXT* a,
-    const VkMultiDrawInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->firstVertex) == (b->firstVertex))) { onFail("a->firstVertex (Error: Value not equal)"); };
-    if (!((a->vertexCount) == (b->vertexCount))) { onFail("a->vertexCount (Error: Value not equal)"); };
+void checkEqual_VkMultiDrawInfoEXT(const VkMultiDrawInfoEXT* a, const VkMultiDrawInfoEXT* b,
+                                   OnFailCompareFunc onFail) {
+    if (!((a->firstVertex) == (b->firstVertex))) {
+        onFail("a->firstVertex (Error: Value not equal)");
+    };
+    if (!((a->vertexCount) == (b->vertexCount))) {
+        onFail("a->vertexCount (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkMultiDrawIndexedInfoEXT(
-    const VkMultiDrawIndexedInfoEXT* a,
-    const VkMultiDrawIndexedInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->firstIndex) == (b->firstIndex))) { onFail("a->firstIndex (Error: Value not equal)"); };
-    if (!((a->indexCount) == (b->indexCount))) { onFail("a->indexCount (Error: Value not equal)"); };
-    if (!((a->vertexOffset) == (b->vertexOffset))) { onFail("a->vertexOffset (Error: Value not equal)"); };
+void checkEqual_VkMultiDrawIndexedInfoEXT(const VkMultiDrawIndexedInfoEXT* a,
+                                          const VkMultiDrawIndexedInfoEXT* b,
+                                          OnFailCompareFunc onFail) {
+    if (!((a->firstIndex) == (b->firstIndex))) {
+        onFail("a->firstIndex (Error: Value not equal)");
+    };
+    if (!((a->indexCount) == (b->indexCount))) {
+        onFail("a->indexCount (Error: Value not equal)");
+    };
+    if (!((a->vertexOffset) == (b->vertexOffset))) {
+        onFail("a->vertexOffset (Error: Value not equal)");
+    };
 }
 
 #endif
@@ -12999,170 +17265,206 @@
 #ifdef VK_EXT_border_color_swizzle
 void checkEqual_VkPhysicalDeviceBorderColorSwizzleFeaturesEXT(
     const VkPhysicalDeviceBorderColorSwizzleFeaturesEXT* a,
-    const VkPhysicalDeviceBorderColorSwizzleFeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceBorderColorSwizzleFeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->borderColorSwizzle) == (b->borderColorSwizzle))) { onFail("a->borderColorSwizzle (Error: Value not equal)"); };
-    if (!((a->borderColorSwizzleFromImage) == (b->borderColorSwizzleFromImage))) { onFail("a->borderColorSwizzleFromImage (Error: Value not equal)"); };
+    if (!((a->borderColorSwizzle) == (b->borderColorSwizzle))) {
+        onFail("a->borderColorSwizzle (Error: Value not equal)");
+    };
+    if (!((a->borderColorSwizzleFromImage) == (b->borderColorSwizzleFromImage))) {
+        onFail("a->borderColorSwizzleFromImage (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkSamplerBorderColorComponentMappingCreateInfoEXT(
     const VkSamplerBorderColorComponentMappingCreateInfoEXT* a,
-    const VkSamplerBorderColorComponentMappingCreateInfoEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkSamplerBorderColorComponentMappingCreateInfoEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
     checkEqual_VkComponentMapping(&a->components, &b->components, onFail);
-    if (!((a->srgb) == (b->srgb))) { onFail("a->srgb (Error: Value not equal)"); };
+    if (!((a->srgb) == (b->srgb))) {
+        onFail("a->srgb (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_EXT_pageable_device_local_memory
 void checkEqual_VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT(
     const VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT* a,
-    const VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->pageableDeviceLocalMemory) == (b->pageableDeviceLocalMemory))) { onFail("a->pageableDeviceLocalMemory (Error: Value not equal)"); };
+    if (!((a->pageableDeviceLocalMemory) == (b->pageableDeviceLocalMemory))) {
+        onFail("a->pageableDeviceLocalMemory (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_KHR_acceleration_structure
-void checkEqual_VkDeviceOrHostAddressKHR(
-    const VkDeviceOrHostAddressKHR* a,
-    const VkDeviceOrHostAddressKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->deviceAddress) == (b->deviceAddress))) { onFail("a->deviceAddress (Error: Value not equal)"); };
-    if (!((!(a->hostAddress) && !(b->hostAddress)) || ((a->hostAddress) && (b->hostAddress)))) { onFail("a->hostAddress (Error: Mismatch in optional field)"); };
+void checkEqual_VkDeviceOrHostAddressKHR(const VkDeviceOrHostAddressKHR* a,
+                                         const VkDeviceOrHostAddressKHR* b,
+                                         OnFailCompareFunc onFail) {
+    if (!((a->deviceAddress) == (b->deviceAddress))) {
+        onFail("a->deviceAddress (Error: Value not equal)");
+    };
+    if (!((!(a->hostAddress) && !(b->hostAddress)) || ((a->hostAddress) && (b->hostAddress)))) {
+        onFail("a->hostAddress (Error: Mismatch in optional field)");
+    };
 }
 
 void checkEqual_VkAccelerationStructureBuildRangeInfoKHR(
     const VkAccelerationStructureBuildRangeInfoKHR* a,
-    const VkAccelerationStructureBuildRangeInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->primitiveCount) == (b->primitiveCount))) { onFail("a->primitiveCount (Error: Value not equal)"); };
-    if (!((a->primitiveOffset) == (b->primitiveOffset))) { onFail("a->primitiveOffset (Error: Value not equal)"); };
-    if (!((a->firstVertex) == (b->firstVertex))) { onFail("a->firstVertex (Error: Value not equal)"); };
-    if (!((a->transformOffset) == (b->transformOffset))) { onFail("a->transformOffset (Error: Value not equal)"); };
+    const VkAccelerationStructureBuildRangeInfoKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->primitiveCount) == (b->primitiveCount))) {
+        onFail("a->primitiveCount (Error: Value not equal)");
+    };
+    if (!((a->primitiveOffset) == (b->primitiveOffset))) {
+        onFail("a->primitiveOffset (Error: Value not equal)");
+    };
+    if (!((a->firstVertex) == (b->firstVertex))) {
+        onFail("a->firstVertex (Error: Value not equal)");
+    };
+    if (!((a->transformOffset) == (b->transformOffset))) {
+        onFail("a->transformOffset (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkAccelerationStructureGeometryTrianglesDataKHR(
     const VkAccelerationStructureGeometryTrianglesDataKHR* a,
-    const VkAccelerationStructureGeometryTrianglesDataKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkAccelerationStructureGeometryTrianglesDataKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->vertexFormat) == (b->vertexFormat))) { onFail("a->vertexFormat (Error: Value not equal)"); };
+    if (!((a->vertexFormat) == (b->vertexFormat))) {
+        onFail("a->vertexFormat (Error: Value not equal)");
+    };
     checkEqual_VkDeviceOrHostAddressConstKHR(&a->vertexData, &b->vertexData, onFail);
-    if (!((a->vertexStride) == (b->vertexStride))) { onFail("a->vertexStride (Error: Value not equal)"); };
-    if (!((a->maxVertex) == (b->maxVertex))) { onFail("a->maxVertex (Error: Value not equal)"); };
-    if (!((a->indexType) == (b->indexType))) { onFail("a->indexType (Error: Value not equal)"); };
+    if (!((a->vertexStride) == (b->vertexStride))) {
+        onFail("a->vertexStride (Error: Value not equal)");
+    };
+    if (!((a->maxVertex) == (b->maxVertex))) {
+        onFail("a->maxVertex (Error: Value not equal)");
+    };
+    if (!((a->indexType) == (b->indexType))) {
+        onFail("a->indexType (Error: Value not equal)");
+    };
     checkEqual_VkDeviceOrHostAddressConstKHR(&a->indexData, &b->indexData, onFail);
     checkEqual_VkDeviceOrHostAddressConstKHR(&a->transformData, &b->transformData, onFail);
 }
 
 void checkEqual_VkAccelerationStructureGeometryAabbsDataKHR(
     const VkAccelerationStructureGeometryAabbsDataKHR* a,
-    const VkAccelerationStructureGeometryAabbsDataKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkAccelerationStructureGeometryAabbsDataKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
     checkEqual_VkDeviceOrHostAddressConstKHR(&a->data, &b->data, onFail);
-    if (!((a->stride) == (b->stride))) { onFail("a->stride (Error: Value not equal)"); };
+    if (!((a->stride) == (b->stride))) {
+        onFail("a->stride (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkAccelerationStructureGeometryInstancesDataKHR(
     const VkAccelerationStructureGeometryInstancesDataKHR* a,
-    const VkAccelerationStructureGeometryInstancesDataKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkAccelerationStructureGeometryInstancesDataKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->arrayOfPointers) == (b->arrayOfPointers))) { onFail("a->arrayOfPointers (Error: Value not equal)"); };
+    if (!((a->arrayOfPointers) == (b->arrayOfPointers))) {
+        onFail("a->arrayOfPointers (Error: Value not equal)");
+    };
     checkEqual_VkDeviceOrHostAddressConstKHR(&a->data, &b->data, onFail);
 }
 
 void checkEqual_VkAccelerationStructureGeometryDataKHR(
     const VkAccelerationStructureGeometryDataKHR* a,
-    const VkAccelerationStructureGeometryDataKHR* b,
-    OnFailCompareFunc onFail)
-{
-    checkEqual_VkAccelerationStructureGeometryTrianglesDataKHR(&a->triangles, &b->triangles, onFail);
+    const VkAccelerationStructureGeometryDataKHR* b, OnFailCompareFunc onFail) {
+    checkEqual_VkAccelerationStructureGeometryTrianglesDataKHR(&a->triangles, &b->triangles,
+                                                               onFail);
     checkEqual_VkAccelerationStructureGeometryAabbsDataKHR(&a->aabbs, &b->aabbs, onFail);
-    checkEqual_VkAccelerationStructureGeometryInstancesDataKHR(&a->instances, &b->instances, onFail);
+    checkEqual_VkAccelerationStructureGeometryInstancesDataKHR(&a->instances, &b->instances,
+                                                               onFail);
 }
 
-void checkEqual_VkAccelerationStructureGeometryKHR(
-    const VkAccelerationStructureGeometryKHR* a,
-    const VkAccelerationStructureGeometryKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkAccelerationStructureGeometryKHR(const VkAccelerationStructureGeometryKHR* a,
+                                                   const VkAccelerationStructureGeometryKHR* b,
+                                                   OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->geometryType) == (b->geometryType))) { onFail("a->geometryType (Error: Value not equal)"); };
+    if (!((a->geometryType) == (b->geometryType))) {
+        onFail("a->geometryType (Error: Value not equal)");
+    };
     checkEqual_VkAccelerationStructureGeometryDataKHR(&a->geometry, &b->geometry, onFail);
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkAccelerationStructureBuildGeometryInfoKHR(
     const VkAccelerationStructureBuildGeometryInfoKHR* a,
-    const VkAccelerationStructureBuildGeometryInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkAccelerationStructureBuildGeometryInfoKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->type) == (b->type))) { onFail("a->type (Error: Value not equal)"); };
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->mode) == (b->mode))) { onFail("a->mode (Error: Value not equal)"); };
-    if (!((a->srcAccelerationStructure) == (b->srcAccelerationStructure))) { onFail("a->srcAccelerationStructure (Error: Value not equal)"); };
-    if (!((a->dstAccelerationStructure) == (b->dstAccelerationStructure))) { onFail("a->dstAccelerationStructure (Error: Value not equal)"); };
-    if (!((a->geometryCount) == (b->geometryCount))) { onFail("a->geometryCount (Error: Value not equal)"); };
-    if (!((!(a->pGeometries) && !(b->pGeometries)) || ((a->pGeometries) && (b->pGeometries)))) { onFail("a->pGeometries (Error: Mismatch in optional field)"); };
-    if (a->pGeometries && b->pGeometries)
-    {
-        if ((a->pGeometries) && (b->pGeometries))
-        {
-            if (!((a->geometryCount) == (b->geometryCount))) { onFail("a->pGeometries (Error: Lengths not equal)"); };
-            if ((a->geometryCount) == (b->geometryCount))
-            {
-                if (a)
-                {
-                    for (uint32_t i = 0; i < (uint32_t)a->geometryCount; ++i)
-                    {
-                        checkEqual_VkAccelerationStructureGeometryKHR(a->pGeometries + i, b->pGeometries + i, onFail);
+    if (!((a->type) == (b->type))) {
+        onFail("a->type (Error: Value not equal)");
+    };
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->mode) == (b->mode))) {
+        onFail("a->mode (Error: Value not equal)");
+    };
+    if (!((a->srcAccelerationStructure) == (b->srcAccelerationStructure))) {
+        onFail("a->srcAccelerationStructure (Error: Value not equal)");
+    };
+    if (!((a->dstAccelerationStructure) == (b->dstAccelerationStructure))) {
+        onFail("a->dstAccelerationStructure (Error: Value not equal)");
+    };
+    if (!((a->geometryCount) == (b->geometryCount))) {
+        onFail("a->geometryCount (Error: Value not equal)");
+    };
+    if (!((!(a->pGeometries) && !(b->pGeometries)) || ((a->pGeometries) && (b->pGeometries)))) {
+        onFail("a->pGeometries (Error: Mismatch in optional field)");
+    };
+    if (a->pGeometries && b->pGeometries) {
+        if ((a->pGeometries) && (b->pGeometries)) {
+            if (!((a->geometryCount) == (b->geometryCount))) {
+                onFail("a->pGeometries (Error: Lengths not equal)");
+            };
+            if ((a->geometryCount) == (b->geometryCount)) {
+                if (a) {
+                    for (uint32_t i = 0; i < (uint32_t)a->geometryCount; ++i) {
+                        checkEqual_VkAccelerationStructureGeometryKHR(a->pGeometries + i,
+                                                                      b->pGeometries + i, onFail);
                     }
                 }
             }
@@ -13171,2444 +17473,3578 @@
     checkEqual_VkDeviceOrHostAddressKHR(&a->scratchData, &b->scratchData, onFail);
 }
 
-void checkEqual_VkAccelerationStructureCreateInfoKHR(
-    const VkAccelerationStructureCreateInfoKHR* a,
-    const VkAccelerationStructureCreateInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkAccelerationStructureCreateInfoKHR(const VkAccelerationStructureCreateInfoKHR* a,
+                                                     const VkAccelerationStructureCreateInfoKHR* b,
+                                                     OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->createFlags) == (b->createFlags))) { onFail("a->createFlags (Error: Value not equal)"); };
-    if (!((a->buffer) == (b->buffer))) { onFail("a->buffer (Error: Value not equal)"); };
-    if (!((a->offset) == (b->offset))) { onFail("a->offset (Error: Value not equal)"); };
-    if (!((a->size) == (b->size))) { onFail("a->size (Error: Value not equal)"); };
-    if (!((a->type) == (b->type))) { onFail("a->type (Error: Value not equal)"); };
-    if (!((a->deviceAddress) == (b->deviceAddress))) { onFail("a->deviceAddress (Error: Value not equal)"); };
+    if (!((a->createFlags) == (b->createFlags))) {
+        onFail("a->createFlags (Error: Value not equal)");
+    };
+    if (!((a->buffer) == (b->buffer))) {
+        onFail("a->buffer (Error: Value not equal)");
+    };
+    if (!((a->offset) == (b->offset))) {
+        onFail("a->offset (Error: Value not equal)");
+    };
+    if (!((a->size) == (b->size))) {
+        onFail("a->size (Error: Value not equal)");
+    };
+    if (!((a->type) == (b->type))) {
+        onFail("a->type (Error: Value not equal)");
+    };
+    if (!((a->deviceAddress) == (b->deviceAddress))) {
+        onFail("a->deviceAddress (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkWriteDescriptorSetAccelerationStructureKHR(
     const VkWriteDescriptorSetAccelerationStructureKHR* a,
-    const VkWriteDescriptorSetAccelerationStructureKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkWriteDescriptorSetAccelerationStructureKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->accelerationStructureCount) == (b->accelerationStructureCount))) { onFail("a->accelerationStructureCount (Error: Value not equal)"); };
-    if (!((!(a->pAccelerationStructures) && !(b->pAccelerationStructures)) || ((a->pAccelerationStructures) && (b->pAccelerationStructures)))) { onFail("a->pAccelerationStructures (Error: Mismatch in optional field)"); };
-    if (a->pAccelerationStructures && b->pAccelerationStructures)
-    {
-        if (!((a->accelerationStructureCount) == (b->accelerationStructureCount))) { onFail("a->pAccelerationStructures (Error: Lengths not equal)"); };
-        if (!((memcmp(a->pAccelerationStructures, b->pAccelerationStructures, a->accelerationStructureCount * sizeof(const VkAccelerationStructureKHR)) == 0))) { onFail("a->pAccelerationStructures (Error: Unequal dyn array)"); };
+    if (!((a->accelerationStructureCount) == (b->accelerationStructureCount))) {
+        onFail("a->accelerationStructureCount (Error: Value not equal)");
+    };
+    if (!((!(a->pAccelerationStructures) && !(b->pAccelerationStructures)) ||
+          ((a->pAccelerationStructures) && (b->pAccelerationStructures)))) {
+        onFail("a->pAccelerationStructures (Error: Mismatch in optional field)");
+    };
+    if (a->pAccelerationStructures && b->pAccelerationStructures) {
+        if (!((a->accelerationStructureCount) == (b->accelerationStructureCount))) {
+            onFail("a->pAccelerationStructures (Error: Lengths not equal)");
+        };
+        if (!((memcmp(a->pAccelerationStructures, b->pAccelerationStructures,
+                      a->accelerationStructureCount * sizeof(const VkAccelerationStructureKHR)) ==
+               0))) {
+            onFail("a->pAccelerationStructures (Error: Unequal dyn array)");
+        };
     }
 }
 
 void checkEqual_VkPhysicalDeviceAccelerationStructureFeaturesKHR(
     const VkPhysicalDeviceAccelerationStructureFeaturesKHR* a,
-    const VkPhysicalDeviceAccelerationStructureFeaturesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceAccelerationStructureFeaturesKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->accelerationStructure) == (b->accelerationStructure))) { onFail("a->accelerationStructure (Error: Value not equal)"); };
-    if (!((a->accelerationStructureCaptureReplay) == (b->accelerationStructureCaptureReplay))) { onFail("a->accelerationStructureCaptureReplay (Error: Value not equal)"); };
-    if (!((a->accelerationStructureIndirectBuild) == (b->accelerationStructureIndirectBuild))) { onFail("a->accelerationStructureIndirectBuild (Error: Value not equal)"); };
-    if (!((a->accelerationStructureHostCommands) == (b->accelerationStructureHostCommands))) { onFail("a->accelerationStructureHostCommands (Error: Value not equal)"); };
-    if (!((a->descriptorBindingAccelerationStructureUpdateAfterBind) == (b->descriptorBindingAccelerationStructureUpdateAfterBind))) { onFail("a->descriptorBindingAccelerationStructureUpdateAfterBind (Error: Value not equal)"); };
+    if (!((a->accelerationStructure) == (b->accelerationStructure))) {
+        onFail("a->accelerationStructure (Error: Value not equal)");
+    };
+    if (!((a->accelerationStructureCaptureReplay) == (b->accelerationStructureCaptureReplay))) {
+        onFail("a->accelerationStructureCaptureReplay (Error: Value not equal)");
+    };
+    if (!((a->accelerationStructureIndirectBuild) == (b->accelerationStructureIndirectBuild))) {
+        onFail("a->accelerationStructureIndirectBuild (Error: Value not equal)");
+    };
+    if (!((a->accelerationStructureHostCommands) == (b->accelerationStructureHostCommands))) {
+        onFail("a->accelerationStructureHostCommands (Error: Value not equal)");
+    };
+    if (!((a->descriptorBindingAccelerationStructureUpdateAfterBind) ==
+          (b->descriptorBindingAccelerationStructureUpdateAfterBind))) {
+        onFail("a->descriptorBindingAccelerationStructureUpdateAfterBind (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceAccelerationStructurePropertiesKHR(
     const VkPhysicalDeviceAccelerationStructurePropertiesKHR* a,
-    const VkPhysicalDeviceAccelerationStructurePropertiesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceAccelerationStructurePropertiesKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->maxGeometryCount) == (b->maxGeometryCount))) { onFail("a->maxGeometryCount (Error: Value not equal)"); };
-    if (!((a->maxInstanceCount) == (b->maxInstanceCount))) { onFail("a->maxInstanceCount (Error: Value not equal)"); };
-    if (!((a->maxPrimitiveCount) == (b->maxPrimitiveCount))) { onFail("a->maxPrimitiveCount (Error: Value not equal)"); };
-    if (!((a->maxPerStageDescriptorAccelerationStructures) == (b->maxPerStageDescriptorAccelerationStructures))) { onFail("a->maxPerStageDescriptorAccelerationStructures (Error: Value not equal)"); };
-    if (!((a->maxPerStageDescriptorUpdateAfterBindAccelerationStructures) == (b->maxPerStageDescriptorUpdateAfterBindAccelerationStructures))) { onFail("a->maxPerStageDescriptorUpdateAfterBindAccelerationStructures (Error: Value not equal)"); };
-    if (!((a->maxDescriptorSetAccelerationStructures) == (b->maxDescriptorSetAccelerationStructures))) { onFail("a->maxDescriptorSetAccelerationStructures (Error: Value not equal)"); };
-    if (!((a->maxDescriptorSetUpdateAfterBindAccelerationStructures) == (b->maxDescriptorSetUpdateAfterBindAccelerationStructures))) { onFail("a->maxDescriptorSetUpdateAfterBindAccelerationStructures (Error: Value not equal)"); };
-    if (!((a->minAccelerationStructureScratchOffsetAlignment) == (b->minAccelerationStructureScratchOffsetAlignment))) { onFail("a->minAccelerationStructureScratchOffsetAlignment (Error: Value not equal)"); };
+    if (!((a->maxGeometryCount) == (b->maxGeometryCount))) {
+        onFail("a->maxGeometryCount (Error: Value not equal)");
+    };
+    if (!((a->maxInstanceCount) == (b->maxInstanceCount))) {
+        onFail("a->maxInstanceCount (Error: Value not equal)");
+    };
+    if (!((a->maxPrimitiveCount) == (b->maxPrimitiveCount))) {
+        onFail("a->maxPrimitiveCount (Error: Value not equal)");
+    };
+    if (!((a->maxPerStageDescriptorAccelerationStructures) ==
+          (b->maxPerStageDescriptorAccelerationStructures))) {
+        onFail("a->maxPerStageDescriptorAccelerationStructures (Error: Value not equal)");
+    };
+    if (!((a->maxPerStageDescriptorUpdateAfterBindAccelerationStructures) ==
+          (b->maxPerStageDescriptorUpdateAfterBindAccelerationStructures))) {
+        onFail(
+            "a->maxPerStageDescriptorUpdateAfterBindAccelerationStructures (Error: Value not "
+            "equal)");
+    };
+    if (!((a->maxDescriptorSetAccelerationStructures) ==
+          (b->maxDescriptorSetAccelerationStructures))) {
+        onFail("a->maxDescriptorSetAccelerationStructures (Error: Value not equal)");
+    };
+    if (!((a->maxDescriptorSetUpdateAfterBindAccelerationStructures) ==
+          (b->maxDescriptorSetUpdateAfterBindAccelerationStructures))) {
+        onFail("a->maxDescriptorSetUpdateAfterBindAccelerationStructures (Error: Value not equal)");
+    };
+    if (!((a->minAccelerationStructureScratchOffsetAlignment) ==
+          (b->minAccelerationStructureScratchOffsetAlignment))) {
+        onFail("a->minAccelerationStructureScratchOffsetAlignment (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkAccelerationStructureDeviceAddressInfoKHR(
     const VkAccelerationStructureDeviceAddressInfoKHR* a,
-    const VkAccelerationStructureDeviceAddressInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkAccelerationStructureDeviceAddressInfoKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->accelerationStructure) == (b->accelerationStructure))) { onFail("a->accelerationStructure (Error: Value not equal)"); };
+    if (!((a->accelerationStructure) == (b->accelerationStructure))) {
+        onFail("a->accelerationStructure (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkAccelerationStructureVersionInfoKHR(
-    const VkAccelerationStructureVersionInfoKHR* a,
-    const VkAccelerationStructureVersionInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkAccelerationStructureVersionInfoKHR* a, const VkAccelerationStructureVersionInfoKHR* b,
+    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((2*VK_UUID_SIZE) == (2*VK_UUID_SIZE))) { onFail("a->pVersionData (Error: Lengths not equal)"); };
-    if (!((memcmp(a->pVersionData, b->pVersionData, 2*VK_UUID_SIZE * sizeof(const uint8_t)) == 0))) { onFail("a->pVersionData (Error: Unequal dyn array)"); };
+    if (!((2 * VK_UUID_SIZE) == (2 * VK_UUID_SIZE))) {
+        onFail("a->pVersionData (Error: Lengths not equal)");
+    };
+    if (!((memcmp(a->pVersionData, b->pVersionData, 2 * VK_UUID_SIZE * sizeof(const uint8_t)) ==
+           0))) {
+        onFail("a->pVersionData (Error: Unequal dyn array)");
+    };
 }
 
 void checkEqual_VkCopyAccelerationStructureToMemoryInfoKHR(
     const VkCopyAccelerationStructureToMemoryInfoKHR* a,
-    const VkCopyAccelerationStructureToMemoryInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkCopyAccelerationStructureToMemoryInfoKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->src) == (b->src))) { onFail("a->src (Error: Value not equal)"); };
+    if (!((a->src) == (b->src))) {
+        onFail("a->src (Error: Value not equal)");
+    };
     checkEqual_VkDeviceOrHostAddressKHR(&a->dst, &b->dst, onFail);
-    if (!((a->mode) == (b->mode))) { onFail("a->mode (Error: Value not equal)"); };
+    if (!((a->mode) == (b->mode))) {
+        onFail("a->mode (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkCopyMemoryToAccelerationStructureInfoKHR(
     const VkCopyMemoryToAccelerationStructureInfoKHR* a,
-    const VkCopyMemoryToAccelerationStructureInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkCopyMemoryToAccelerationStructureInfoKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
     checkEqual_VkDeviceOrHostAddressConstKHR(&a->src, &b->src, onFail);
-    if (!((a->dst) == (b->dst))) { onFail("a->dst (Error: Value not equal)"); };
-    if (!((a->mode) == (b->mode))) { onFail("a->mode (Error: Value not equal)"); };
+    if (!((a->dst) == (b->dst))) {
+        onFail("a->dst (Error: Value not equal)");
+    };
+    if (!((a->mode) == (b->mode))) {
+        onFail("a->mode (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkCopyAccelerationStructureInfoKHR(
-    const VkCopyAccelerationStructureInfoKHR* a,
-    const VkCopyAccelerationStructureInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkCopyAccelerationStructureInfoKHR(const VkCopyAccelerationStructureInfoKHR* a,
+                                                   const VkCopyAccelerationStructureInfoKHR* b,
+                                                   OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->src) == (b->src))) { onFail("a->src (Error: Value not equal)"); };
-    if (!((a->dst) == (b->dst))) { onFail("a->dst (Error: Value not equal)"); };
-    if (!((a->mode) == (b->mode))) { onFail("a->mode (Error: Value not equal)"); };
+    if (!((a->src) == (b->src))) {
+        onFail("a->src (Error: Value not equal)");
+    };
+    if (!((a->dst) == (b->dst))) {
+        onFail("a->dst (Error: Value not equal)");
+    };
+    if (!((a->mode) == (b->mode))) {
+        onFail("a->mode (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkAccelerationStructureBuildSizesInfoKHR(
     const VkAccelerationStructureBuildSizesInfoKHR* a,
-    const VkAccelerationStructureBuildSizesInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkAccelerationStructureBuildSizesInfoKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->accelerationStructureSize) == (b->accelerationStructureSize))) { onFail("a->accelerationStructureSize (Error: Value not equal)"); };
-    if (!((a->updateScratchSize) == (b->updateScratchSize))) { onFail("a->updateScratchSize (Error: Value not equal)"); };
-    if (!((a->buildScratchSize) == (b->buildScratchSize))) { onFail("a->buildScratchSize (Error: Value not equal)"); };
+    if (!((a->accelerationStructureSize) == (b->accelerationStructureSize))) {
+        onFail("a->accelerationStructureSize (Error: Value not equal)");
+    };
+    if (!((a->updateScratchSize) == (b->updateScratchSize))) {
+        onFail("a->updateScratchSize (Error: Value not equal)");
+    };
+    if (!((a->buildScratchSize) == (b->buildScratchSize))) {
+        onFail("a->buildScratchSize (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
-void checkEqual_VkRayTracingShaderGroupCreateInfoKHR(
-    const VkRayTracingShaderGroupCreateInfoKHR* a,
-    const VkRayTracingShaderGroupCreateInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkRayTracingShaderGroupCreateInfoKHR(const VkRayTracingShaderGroupCreateInfoKHR* a,
+                                                     const VkRayTracingShaderGroupCreateInfoKHR* b,
+                                                     OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->type) == (b->type))) { onFail("a->type (Error: Value not equal)"); };
-    if (!((a->generalShader) == (b->generalShader))) { onFail("a->generalShader (Error: Value not equal)"); };
-    if (!((a->closestHitShader) == (b->closestHitShader))) { onFail("a->closestHitShader (Error: Value not equal)"); };
-    if (!((a->anyHitShader) == (b->anyHitShader))) { onFail("a->anyHitShader (Error: Value not equal)"); };
-    if (!((a->intersectionShader) == (b->intersectionShader))) { onFail("a->intersectionShader (Error: Value not equal)"); };
-    if (!((!(a->pShaderGroupCaptureReplayHandle) && !(b->pShaderGroupCaptureReplayHandle)) || ((a->pShaderGroupCaptureReplayHandle) && (b->pShaderGroupCaptureReplayHandle)))) { onFail("a->pShaderGroupCaptureReplayHandle (Error: Mismatch in optional field)"); };
+    if (!((a->type) == (b->type))) {
+        onFail("a->type (Error: Value not equal)");
+    };
+    if (!((a->generalShader) == (b->generalShader))) {
+        onFail("a->generalShader (Error: Value not equal)");
+    };
+    if (!((a->closestHitShader) == (b->closestHitShader))) {
+        onFail("a->closestHitShader (Error: Value not equal)");
+    };
+    if (!((a->anyHitShader) == (b->anyHitShader))) {
+        onFail("a->anyHitShader (Error: Value not equal)");
+    };
+    if (!((a->intersectionShader) == (b->intersectionShader))) {
+        onFail("a->intersectionShader (Error: Value not equal)");
+    };
+    if (!((!(a->pShaderGroupCaptureReplayHandle) && !(b->pShaderGroupCaptureReplayHandle)) ||
+          ((a->pShaderGroupCaptureReplayHandle) && (b->pShaderGroupCaptureReplayHandle)))) {
+        onFail("a->pShaderGroupCaptureReplayHandle (Error: Mismatch in optional field)");
+    };
 }
 
 void checkEqual_VkRayTracingPipelineInterfaceCreateInfoKHR(
     const VkRayTracingPipelineInterfaceCreateInfoKHR* a,
-    const VkRayTracingPipelineInterfaceCreateInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkRayTracingPipelineInterfaceCreateInfoKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->maxPipelineRayPayloadSize) == (b->maxPipelineRayPayloadSize))) { onFail("a->maxPipelineRayPayloadSize (Error: Value not equal)"); };
-    if (!((a->maxPipelineRayHitAttributeSize) == (b->maxPipelineRayHitAttributeSize))) { onFail("a->maxPipelineRayHitAttributeSize (Error: Value not equal)"); };
+    if (!((a->maxPipelineRayPayloadSize) == (b->maxPipelineRayPayloadSize))) {
+        onFail("a->maxPipelineRayPayloadSize (Error: Value not equal)");
+    };
+    if (!((a->maxPipelineRayHitAttributeSize) == (b->maxPipelineRayHitAttributeSize))) {
+        onFail("a->maxPipelineRayHitAttributeSize (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkRayTracingPipelineCreateInfoKHR(
-    const VkRayTracingPipelineCreateInfoKHR* a,
-    const VkRayTracingPipelineCreateInfoKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkRayTracingPipelineCreateInfoKHR(const VkRayTracingPipelineCreateInfoKHR* a,
+                                                  const VkRayTracingPipelineCreateInfoKHR* b,
+                                                  OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->flags) == (b->flags))) { onFail("a->flags (Error: Value not equal)"); };
-    if (!((a->stageCount) == (b->stageCount))) { onFail("a->stageCount (Error: Value not equal)"); };
-    if ((a->pStages) && (b->pStages))
-    {
-        if (!((a->stageCount) == (b->stageCount))) { onFail("a->pStages (Error: Lengths not equal)"); };
-        if ((a->stageCount) == (b->stageCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->stageCount; ++i)
-                {
-                    checkEqual_VkPipelineShaderStageCreateInfo(a->pStages + i, b->pStages + i, onFail);
+    if (!((a->flags) == (b->flags))) {
+        onFail("a->flags (Error: Value not equal)");
+    };
+    if (!((a->stageCount) == (b->stageCount))) {
+        onFail("a->stageCount (Error: Value not equal)");
+    };
+    if ((a->pStages) && (b->pStages)) {
+        if (!((a->stageCount) == (b->stageCount))) {
+            onFail("a->pStages (Error: Lengths not equal)");
+        };
+        if ((a->stageCount) == (b->stageCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->stageCount; ++i) {
+                    checkEqual_VkPipelineShaderStageCreateInfo(a->pStages + i, b->pStages + i,
+                                                               onFail);
                 }
             }
         }
     }
-    if (!((a->groupCount) == (b->groupCount))) { onFail("a->groupCount (Error: Value not equal)"); };
-    if ((a->pGroups) && (b->pGroups))
-    {
-        if (!((a->groupCount) == (b->groupCount))) { onFail("a->pGroups (Error: Lengths not equal)"); };
-        if ((a->groupCount) == (b->groupCount))
-        {
-            if (a)
-            {
-                for (uint32_t i = 0; i < (uint32_t)a->groupCount; ++i)
-                {
-                    checkEqual_VkRayTracingShaderGroupCreateInfoKHR(a->pGroups + i, b->pGroups + i, onFail);
+    if (!((a->groupCount) == (b->groupCount))) {
+        onFail("a->groupCount (Error: Value not equal)");
+    };
+    if ((a->pGroups) && (b->pGroups)) {
+        if (!((a->groupCount) == (b->groupCount))) {
+            onFail("a->pGroups (Error: Lengths not equal)");
+        };
+        if ((a->groupCount) == (b->groupCount)) {
+            if (a) {
+                for (uint32_t i = 0; i < (uint32_t)a->groupCount; ++i) {
+                    checkEqual_VkRayTracingShaderGroupCreateInfoKHR(a->pGroups + i, b->pGroups + i,
+                                                                    onFail);
                 }
             }
         }
     }
-    if (!((a->maxPipelineRayRecursionDepth) == (b->maxPipelineRayRecursionDepth))) { onFail("a->maxPipelineRayRecursionDepth (Error: Value not equal)"); };
-    if (!((!(a->pLibraryInfo) && !(b->pLibraryInfo)) || ((a->pLibraryInfo) && (b->pLibraryInfo)))) { onFail("a->pLibraryInfo (Error: Mismatch in optional field)"); };
-    if (a->pLibraryInfo && b->pLibraryInfo)
-    {
-        if ((a->pLibraryInfo) && (b->pLibraryInfo))
-        {
+    if (!((a->maxPipelineRayRecursionDepth) == (b->maxPipelineRayRecursionDepth))) {
+        onFail("a->maxPipelineRayRecursionDepth (Error: Value not equal)");
+    };
+    if (!((!(a->pLibraryInfo) && !(b->pLibraryInfo)) || ((a->pLibraryInfo) && (b->pLibraryInfo)))) {
+        onFail("a->pLibraryInfo (Error: Mismatch in optional field)");
+    };
+    if (a->pLibraryInfo && b->pLibraryInfo) {
+        if ((a->pLibraryInfo) && (b->pLibraryInfo)) {
             checkEqual_VkPipelineLibraryCreateInfoKHR(a->pLibraryInfo, b->pLibraryInfo, onFail);
         }
     }
-    if (!((!(a->pLibraryInterface) && !(b->pLibraryInterface)) || ((a->pLibraryInterface) && (b->pLibraryInterface)))) { onFail("a->pLibraryInterface (Error: Mismatch in optional field)"); };
-    if (a->pLibraryInterface && b->pLibraryInterface)
-    {
-        if ((a->pLibraryInterface) && (b->pLibraryInterface))
-        {
-            checkEqual_VkRayTracingPipelineInterfaceCreateInfoKHR(a->pLibraryInterface, b->pLibraryInterface, onFail);
+    if (!((!(a->pLibraryInterface) && !(b->pLibraryInterface)) ||
+          ((a->pLibraryInterface) && (b->pLibraryInterface)))) {
+        onFail("a->pLibraryInterface (Error: Mismatch in optional field)");
+    };
+    if (a->pLibraryInterface && b->pLibraryInterface) {
+        if ((a->pLibraryInterface) && (b->pLibraryInterface)) {
+            checkEqual_VkRayTracingPipelineInterfaceCreateInfoKHR(a->pLibraryInterface,
+                                                                  b->pLibraryInterface, onFail);
         }
     }
-    if (!((!(a->pDynamicState) && !(b->pDynamicState)) || ((a->pDynamicState) && (b->pDynamicState)))) { onFail("a->pDynamicState (Error: Mismatch in optional field)"); };
-    if (a->pDynamicState && b->pDynamicState)
-    {
-        if ((a->pDynamicState) && (b->pDynamicState))
-        {
+    if (!((!(a->pDynamicState) && !(b->pDynamicState)) ||
+          ((a->pDynamicState) && (b->pDynamicState)))) {
+        onFail("a->pDynamicState (Error: Mismatch in optional field)");
+    };
+    if (a->pDynamicState && b->pDynamicState) {
+        if ((a->pDynamicState) && (b->pDynamicState)) {
             checkEqual_VkPipelineDynamicStateCreateInfo(a->pDynamicState, b->pDynamicState, onFail);
         }
     }
-    if (!((a->layout) == (b->layout))) { onFail("a->layout (Error: Value not equal)"); };
-    if (!((a->basePipelineHandle) == (b->basePipelineHandle))) { onFail("a->basePipelineHandle (Error: Value not equal)"); };
-    if (!((a->basePipelineIndex) == (b->basePipelineIndex))) { onFail("a->basePipelineIndex (Error: Value not equal)"); };
+    if (!((a->layout) == (b->layout))) {
+        onFail("a->layout (Error: Value not equal)");
+    };
+    if (!((a->basePipelineHandle) == (b->basePipelineHandle))) {
+        onFail("a->basePipelineHandle (Error: Value not equal)");
+    };
+    if (!((a->basePipelineIndex) == (b->basePipelineIndex))) {
+        onFail("a->basePipelineIndex (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(
     const VkPhysicalDeviceRayTracingPipelineFeaturesKHR* a,
-    const VkPhysicalDeviceRayTracingPipelineFeaturesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceRayTracingPipelineFeaturesKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->rayTracingPipeline) == (b->rayTracingPipeline))) { onFail("a->rayTracingPipeline (Error: Value not equal)"); };
-    if (!((a->rayTracingPipelineShaderGroupHandleCaptureReplay) == (b->rayTracingPipelineShaderGroupHandleCaptureReplay))) { onFail("a->rayTracingPipelineShaderGroupHandleCaptureReplay (Error: Value not equal)"); };
-    if (!((a->rayTracingPipelineShaderGroupHandleCaptureReplayMixed) == (b->rayTracingPipelineShaderGroupHandleCaptureReplayMixed))) { onFail("a->rayTracingPipelineShaderGroupHandleCaptureReplayMixed (Error: Value not equal)"); };
-    if (!((a->rayTracingPipelineTraceRaysIndirect) == (b->rayTracingPipelineTraceRaysIndirect))) { onFail("a->rayTracingPipelineTraceRaysIndirect (Error: Value not equal)"); };
-    if (!((a->rayTraversalPrimitiveCulling) == (b->rayTraversalPrimitiveCulling))) { onFail("a->rayTraversalPrimitiveCulling (Error: Value not equal)"); };
+    if (!((a->rayTracingPipeline) == (b->rayTracingPipeline))) {
+        onFail("a->rayTracingPipeline (Error: Value not equal)");
+    };
+    if (!((a->rayTracingPipelineShaderGroupHandleCaptureReplay) ==
+          (b->rayTracingPipelineShaderGroupHandleCaptureReplay))) {
+        onFail("a->rayTracingPipelineShaderGroupHandleCaptureReplay (Error: Value not equal)");
+    };
+    if (!((a->rayTracingPipelineShaderGroupHandleCaptureReplayMixed) ==
+          (b->rayTracingPipelineShaderGroupHandleCaptureReplayMixed))) {
+        onFail("a->rayTracingPipelineShaderGroupHandleCaptureReplayMixed (Error: Value not equal)");
+    };
+    if (!((a->rayTracingPipelineTraceRaysIndirect) == (b->rayTracingPipelineTraceRaysIndirect))) {
+        onFail("a->rayTracingPipelineTraceRaysIndirect (Error: Value not equal)");
+    };
+    if (!((a->rayTraversalPrimitiveCulling) == (b->rayTraversalPrimitiveCulling))) {
+        onFail("a->rayTraversalPrimitiveCulling (Error: Value not equal)");
+    };
 }
 
 void checkEqual_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(
     const VkPhysicalDeviceRayTracingPipelinePropertiesKHR* a,
-    const VkPhysicalDeviceRayTracingPipelinePropertiesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+    const VkPhysicalDeviceRayTracingPipelinePropertiesKHR* b, OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->shaderGroupHandleSize) == (b->shaderGroupHandleSize))) { onFail("a->shaderGroupHandleSize (Error: Value not equal)"); };
-    if (!((a->maxRayRecursionDepth) == (b->maxRayRecursionDepth))) { onFail("a->maxRayRecursionDepth (Error: Value not equal)"); };
-    if (!((a->maxShaderGroupStride) == (b->maxShaderGroupStride))) { onFail("a->maxShaderGroupStride (Error: Value not equal)"); };
-    if (!((a->shaderGroupBaseAlignment) == (b->shaderGroupBaseAlignment))) { onFail("a->shaderGroupBaseAlignment (Error: Value not equal)"); };
-    if (!((a->shaderGroupHandleCaptureReplaySize) == (b->shaderGroupHandleCaptureReplaySize))) { onFail("a->shaderGroupHandleCaptureReplaySize (Error: Value not equal)"); };
-    if (!((a->maxRayDispatchInvocationCount) == (b->maxRayDispatchInvocationCount))) { onFail("a->maxRayDispatchInvocationCount (Error: Value not equal)"); };
-    if (!((a->shaderGroupHandleAlignment) == (b->shaderGroupHandleAlignment))) { onFail("a->shaderGroupHandleAlignment (Error: Value not equal)"); };
-    if (!((a->maxRayHitAttributeSize) == (b->maxRayHitAttributeSize))) { onFail("a->maxRayHitAttributeSize (Error: Value not equal)"); };
+    if (!((a->shaderGroupHandleSize) == (b->shaderGroupHandleSize))) {
+        onFail("a->shaderGroupHandleSize (Error: Value not equal)");
+    };
+    if (!((a->maxRayRecursionDepth) == (b->maxRayRecursionDepth))) {
+        onFail("a->maxRayRecursionDepth (Error: Value not equal)");
+    };
+    if (!((a->maxShaderGroupStride) == (b->maxShaderGroupStride))) {
+        onFail("a->maxShaderGroupStride (Error: Value not equal)");
+    };
+    if (!((a->shaderGroupBaseAlignment) == (b->shaderGroupBaseAlignment))) {
+        onFail("a->shaderGroupBaseAlignment (Error: Value not equal)");
+    };
+    if (!((a->shaderGroupHandleCaptureReplaySize) == (b->shaderGroupHandleCaptureReplaySize))) {
+        onFail("a->shaderGroupHandleCaptureReplaySize (Error: Value not equal)");
+    };
+    if (!((a->maxRayDispatchInvocationCount) == (b->maxRayDispatchInvocationCount))) {
+        onFail("a->maxRayDispatchInvocationCount (Error: Value not equal)");
+    };
+    if (!((a->shaderGroupHandleAlignment) == (b->shaderGroupHandleAlignment))) {
+        onFail("a->shaderGroupHandleAlignment (Error: Value not equal)");
+    };
+    if (!((a->maxRayHitAttributeSize) == (b->maxRayHitAttributeSize))) {
+        onFail("a->maxRayHitAttributeSize (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkStridedDeviceAddressRegionKHR(
-    const VkStridedDeviceAddressRegionKHR* a,
-    const VkStridedDeviceAddressRegionKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->deviceAddress) == (b->deviceAddress))) { onFail("a->deviceAddress (Error: Value not equal)"); };
-    if (!((a->stride) == (b->stride))) { onFail("a->stride (Error: Value not equal)"); };
-    if (!((a->size) == (b->size))) { onFail("a->size (Error: Value not equal)"); };
+void checkEqual_VkStridedDeviceAddressRegionKHR(const VkStridedDeviceAddressRegionKHR* a,
+                                                const VkStridedDeviceAddressRegionKHR* b,
+                                                OnFailCompareFunc onFail) {
+    if (!((a->deviceAddress) == (b->deviceAddress))) {
+        onFail("a->deviceAddress (Error: Value not equal)");
+    };
+    if (!((a->stride) == (b->stride))) {
+        onFail("a->stride (Error: Value not equal)");
+    };
+    if (!((a->size) == (b->size))) {
+        onFail("a->size (Error: Value not equal)");
+    };
 }
 
-void checkEqual_VkTraceRaysIndirectCommandKHR(
-    const VkTraceRaysIndirectCommandKHR* a,
-    const VkTraceRaysIndirectCommandKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->width) == (b->width))) { onFail("a->width (Error: Value not equal)"); };
-    if (!((a->height) == (b->height))) { onFail("a->height (Error: Value not equal)"); };
-    if (!((a->depth) == (b->depth))) { onFail("a->depth (Error: Value not equal)"); };
+void checkEqual_VkTraceRaysIndirectCommandKHR(const VkTraceRaysIndirectCommandKHR* a,
+                                              const VkTraceRaysIndirectCommandKHR* b,
+                                              OnFailCompareFunc onFail) {
+    if (!((a->width) == (b->width))) {
+        onFail("a->width (Error: Value not equal)");
+    };
+    if (!((a->height) == (b->height))) {
+        onFail("a->height (Error: Value not equal)");
+    };
+    if (!((a->depth) == (b->depth))) {
+        onFail("a->depth (Error: Value not equal)");
+    };
 }
 
 #endif
 #ifdef VK_KHR_ray_query
-void checkEqual_VkPhysicalDeviceRayQueryFeaturesKHR(
-    const VkPhysicalDeviceRayQueryFeaturesKHR* a,
-    const VkPhysicalDeviceRayQueryFeaturesKHR* b,
-    OnFailCompareFunc onFail)
-{
-    if (!((a->sType) == (b->sType))) { onFail("a->sType (Error: Value not equal)"); };
-    if (a->pNext)
-    {
+void checkEqual_VkPhysicalDeviceRayQueryFeaturesKHR(const VkPhysicalDeviceRayQueryFeaturesKHR* a,
+                                                    const VkPhysicalDeviceRayQueryFeaturesKHR* b,
+                                                    OnFailCompareFunc onFail) {
+    if (!((a->sType) == (b->sType))) {
+        onFail("a->sType (Error: Value not equal)");
+    };
+    if (a->pNext) {
         checkEqual_extension_struct(a->pNext, b->pNext, onFail);
     }
-    if (!((a->rayQuery) == (b->rayQuery))) { onFail("a->rayQuery (Error: Value not equal)"); };
+    if (!((a->rayQuery) == (b->rayQuery))) {
+        onFail("a->rayQuery (Error: Value not equal)");
+    };
 }
 
 #endif
-void checkEqual_extension_struct(
-    const void* structExtension,
-    const void* structExtension2,
-    OnFailCompareFunc onFail)
-{
-    if (!structExtension)
-    {
+void checkEqual_extension_struct(const void* structExtension, const void* structExtension2,
+                                 OnFailCompareFunc onFail) {
+    if (!structExtension) {
         return;
     }
     uint32_t structType = (uint32_t)goldfish_vk_struct_type(structExtension);
-    switch(structType)
-    {
+    switch (structType) {
 #ifdef VK_VERSION_1_1
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES:
-        {
-            checkEqual_VkPhysicalDeviceSubgroupProperties(reinterpret_cast<const VkPhysicalDeviceSubgroupProperties*>(structExtension), reinterpret_cast<const VkPhysicalDeviceSubgroupProperties*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES: {
+            checkEqual_VkPhysicalDeviceSubgroupProperties(
+                reinterpret_cast<const VkPhysicalDeviceSubgroupProperties*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceSubgroupProperties*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES:
-        {
-            checkEqual_VkPhysicalDevice16BitStorageFeatures(reinterpret_cast<const VkPhysicalDevice16BitStorageFeatures*>(structExtension), reinterpret_cast<const VkPhysicalDevice16BitStorageFeatures*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES: {
+            checkEqual_VkPhysicalDevice16BitStorageFeatures(
+                reinterpret_cast<const VkPhysicalDevice16BitStorageFeatures*>(structExtension),
+                reinterpret_cast<const VkPhysicalDevice16BitStorageFeatures*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS:
-        {
-            checkEqual_VkMemoryDedicatedRequirements(reinterpret_cast<const VkMemoryDedicatedRequirements*>(structExtension), reinterpret_cast<const VkMemoryDedicatedRequirements*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS: {
+            checkEqual_VkMemoryDedicatedRequirements(
+                reinterpret_cast<const VkMemoryDedicatedRequirements*>(structExtension),
+                reinterpret_cast<const VkMemoryDedicatedRequirements*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO:
-        {
-            checkEqual_VkMemoryDedicatedAllocateInfo(reinterpret_cast<const VkMemoryDedicatedAllocateInfo*>(structExtension), reinterpret_cast<const VkMemoryDedicatedAllocateInfo*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO: {
+            checkEqual_VkMemoryDedicatedAllocateInfo(
+                reinterpret_cast<const VkMemoryDedicatedAllocateInfo*>(structExtension),
+                reinterpret_cast<const VkMemoryDedicatedAllocateInfo*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO:
-        {
-            checkEqual_VkMemoryAllocateFlagsInfo(reinterpret_cast<const VkMemoryAllocateFlagsInfo*>(structExtension), reinterpret_cast<const VkMemoryAllocateFlagsInfo*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO: {
+            checkEqual_VkMemoryAllocateFlagsInfo(
+                reinterpret_cast<const VkMemoryAllocateFlagsInfo*>(structExtension),
+                reinterpret_cast<const VkMemoryAllocateFlagsInfo*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO:
-        {
-            checkEqual_VkDeviceGroupRenderPassBeginInfo(reinterpret_cast<const VkDeviceGroupRenderPassBeginInfo*>(structExtension), reinterpret_cast<const VkDeviceGroupRenderPassBeginInfo*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO: {
+            checkEqual_VkDeviceGroupRenderPassBeginInfo(
+                reinterpret_cast<const VkDeviceGroupRenderPassBeginInfo*>(structExtension),
+                reinterpret_cast<const VkDeviceGroupRenderPassBeginInfo*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO:
-        {
-            checkEqual_VkDeviceGroupCommandBufferBeginInfo(reinterpret_cast<const VkDeviceGroupCommandBufferBeginInfo*>(structExtension), reinterpret_cast<const VkDeviceGroupCommandBufferBeginInfo*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO: {
+            checkEqual_VkDeviceGroupCommandBufferBeginInfo(
+                reinterpret_cast<const VkDeviceGroupCommandBufferBeginInfo*>(structExtension),
+                reinterpret_cast<const VkDeviceGroupCommandBufferBeginInfo*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO:
-        {
-            checkEqual_VkDeviceGroupSubmitInfo(reinterpret_cast<const VkDeviceGroupSubmitInfo*>(structExtension), reinterpret_cast<const VkDeviceGroupSubmitInfo*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO: {
+            checkEqual_VkDeviceGroupSubmitInfo(
+                reinterpret_cast<const VkDeviceGroupSubmitInfo*>(structExtension),
+                reinterpret_cast<const VkDeviceGroupSubmitInfo*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO:
-        {
-            checkEqual_VkDeviceGroupBindSparseInfo(reinterpret_cast<const VkDeviceGroupBindSparseInfo*>(structExtension), reinterpret_cast<const VkDeviceGroupBindSparseInfo*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO: {
+            checkEqual_VkDeviceGroupBindSparseInfo(
+                reinterpret_cast<const VkDeviceGroupBindSparseInfo*>(structExtension),
+                reinterpret_cast<const VkDeviceGroupBindSparseInfo*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO:
-        {
-            checkEqual_VkBindBufferMemoryDeviceGroupInfo(reinterpret_cast<const VkBindBufferMemoryDeviceGroupInfo*>(structExtension), reinterpret_cast<const VkBindBufferMemoryDeviceGroupInfo*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO: {
+            checkEqual_VkBindBufferMemoryDeviceGroupInfo(
+                reinterpret_cast<const VkBindBufferMemoryDeviceGroupInfo*>(structExtension),
+                reinterpret_cast<const VkBindBufferMemoryDeviceGroupInfo*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO:
-        {
-            checkEqual_VkBindImageMemoryDeviceGroupInfo(reinterpret_cast<const VkBindImageMemoryDeviceGroupInfo*>(structExtension), reinterpret_cast<const VkBindImageMemoryDeviceGroupInfo*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO: {
+            checkEqual_VkBindImageMemoryDeviceGroupInfo(
+                reinterpret_cast<const VkBindImageMemoryDeviceGroupInfo*>(structExtension),
+                reinterpret_cast<const VkBindImageMemoryDeviceGroupInfo*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO:
-        {
-            checkEqual_VkDeviceGroupDeviceCreateInfo(reinterpret_cast<const VkDeviceGroupDeviceCreateInfo*>(structExtension), reinterpret_cast<const VkDeviceGroupDeviceCreateInfo*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO: {
+            checkEqual_VkDeviceGroupDeviceCreateInfo(
+                reinterpret_cast<const VkDeviceGroupDeviceCreateInfo*>(structExtension),
+                reinterpret_cast<const VkDeviceGroupDeviceCreateInfo*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2:
-        {
-            checkEqual_VkPhysicalDeviceFeatures2(reinterpret_cast<const VkPhysicalDeviceFeatures2*>(structExtension), reinterpret_cast<const VkPhysicalDeviceFeatures2*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2: {
+            checkEqual_VkPhysicalDeviceFeatures2(
+                reinterpret_cast<const VkPhysicalDeviceFeatures2*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceFeatures2*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES:
-        {
-            checkEqual_VkPhysicalDevicePointClippingProperties(reinterpret_cast<const VkPhysicalDevicePointClippingProperties*>(structExtension), reinterpret_cast<const VkPhysicalDevicePointClippingProperties*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES: {
+            checkEqual_VkPhysicalDevicePointClippingProperties(
+                reinterpret_cast<const VkPhysicalDevicePointClippingProperties*>(structExtension),
+                reinterpret_cast<const VkPhysicalDevicePointClippingProperties*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO:
-        {
-            checkEqual_VkRenderPassInputAttachmentAspectCreateInfo(reinterpret_cast<const VkRenderPassInputAttachmentAspectCreateInfo*>(structExtension), reinterpret_cast<const VkRenderPassInputAttachmentAspectCreateInfo*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO: {
+            checkEqual_VkRenderPassInputAttachmentAspectCreateInfo(
+                reinterpret_cast<const VkRenderPassInputAttachmentAspectCreateInfo*>(
+                    structExtension),
+                reinterpret_cast<const VkRenderPassInputAttachmentAspectCreateInfo*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO:
-        {
-            checkEqual_VkImageViewUsageCreateInfo(reinterpret_cast<const VkImageViewUsageCreateInfo*>(structExtension), reinterpret_cast<const VkImageViewUsageCreateInfo*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO: {
+            checkEqual_VkImageViewUsageCreateInfo(
+                reinterpret_cast<const VkImageViewUsageCreateInfo*>(structExtension),
+                reinterpret_cast<const VkImageViewUsageCreateInfo*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO:
-        {
-            checkEqual_VkPipelineTessellationDomainOriginStateCreateInfo(reinterpret_cast<const VkPipelineTessellationDomainOriginStateCreateInfo*>(structExtension), reinterpret_cast<const VkPipelineTessellationDomainOriginStateCreateInfo*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO: {
+            checkEqual_VkPipelineTessellationDomainOriginStateCreateInfo(
+                reinterpret_cast<const VkPipelineTessellationDomainOriginStateCreateInfo*>(
+                    structExtension),
+                reinterpret_cast<const VkPipelineTessellationDomainOriginStateCreateInfo*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO:
-        {
-            checkEqual_VkRenderPassMultiviewCreateInfo(reinterpret_cast<const VkRenderPassMultiviewCreateInfo*>(structExtension), reinterpret_cast<const VkRenderPassMultiviewCreateInfo*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO: {
+            checkEqual_VkRenderPassMultiviewCreateInfo(
+                reinterpret_cast<const VkRenderPassMultiviewCreateInfo*>(structExtension),
+                reinterpret_cast<const VkRenderPassMultiviewCreateInfo*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES:
-        {
-            checkEqual_VkPhysicalDeviceMultiviewFeatures(reinterpret_cast<const VkPhysicalDeviceMultiviewFeatures*>(structExtension), reinterpret_cast<const VkPhysicalDeviceMultiviewFeatures*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES: {
+            checkEqual_VkPhysicalDeviceMultiviewFeatures(
+                reinterpret_cast<const VkPhysicalDeviceMultiviewFeatures*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceMultiviewFeatures*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES:
-        {
-            checkEqual_VkPhysicalDeviceMultiviewProperties(reinterpret_cast<const VkPhysicalDeviceMultiviewProperties*>(structExtension), reinterpret_cast<const VkPhysicalDeviceMultiviewProperties*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES: {
+            checkEqual_VkPhysicalDeviceMultiviewProperties(
+                reinterpret_cast<const VkPhysicalDeviceMultiviewProperties*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceMultiviewProperties*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES:
-        {
-            checkEqual_VkPhysicalDeviceVariablePointersFeatures(reinterpret_cast<const VkPhysicalDeviceVariablePointersFeatures*>(structExtension), reinterpret_cast<const VkPhysicalDeviceVariablePointersFeatures*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES: {
+            checkEqual_VkPhysicalDeviceVariablePointersFeatures(
+                reinterpret_cast<const VkPhysicalDeviceVariablePointersFeatures*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceVariablePointersFeatures*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES:
-        {
-            checkEqual_VkPhysicalDeviceProtectedMemoryFeatures(reinterpret_cast<const VkPhysicalDeviceProtectedMemoryFeatures*>(structExtension), reinterpret_cast<const VkPhysicalDeviceProtectedMemoryFeatures*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES: {
+            checkEqual_VkPhysicalDeviceProtectedMemoryFeatures(
+                reinterpret_cast<const VkPhysicalDeviceProtectedMemoryFeatures*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceProtectedMemoryFeatures*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES:
-        {
-            checkEqual_VkPhysicalDeviceProtectedMemoryProperties(reinterpret_cast<const VkPhysicalDeviceProtectedMemoryProperties*>(structExtension), reinterpret_cast<const VkPhysicalDeviceProtectedMemoryProperties*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES: {
+            checkEqual_VkPhysicalDeviceProtectedMemoryProperties(
+                reinterpret_cast<const VkPhysicalDeviceProtectedMemoryProperties*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceProtectedMemoryProperties*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO:
-        {
-            checkEqual_VkProtectedSubmitInfo(reinterpret_cast<const VkProtectedSubmitInfo*>(structExtension), reinterpret_cast<const VkProtectedSubmitInfo*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO: {
+            checkEqual_VkProtectedSubmitInfo(
+                reinterpret_cast<const VkProtectedSubmitInfo*>(structExtension),
+                reinterpret_cast<const VkProtectedSubmitInfo*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO:
-        {
-            checkEqual_VkSamplerYcbcrConversionInfo(reinterpret_cast<const VkSamplerYcbcrConversionInfo*>(structExtension), reinterpret_cast<const VkSamplerYcbcrConversionInfo*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO: {
+            checkEqual_VkSamplerYcbcrConversionInfo(
+                reinterpret_cast<const VkSamplerYcbcrConversionInfo*>(structExtension),
+                reinterpret_cast<const VkSamplerYcbcrConversionInfo*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO:
-        {
-            checkEqual_VkBindImagePlaneMemoryInfo(reinterpret_cast<const VkBindImagePlaneMemoryInfo*>(structExtension), reinterpret_cast<const VkBindImagePlaneMemoryInfo*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO: {
+            checkEqual_VkBindImagePlaneMemoryInfo(
+                reinterpret_cast<const VkBindImagePlaneMemoryInfo*>(structExtension),
+                reinterpret_cast<const VkBindImagePlaneMemoryInfo*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO:
-        {
-            checkEqual_VkImagePlaneMemoryRequirementsInfo(reinterpret_cast<const VkImagePlaneMemoryRequirementsInfo*>(structExtension), reinterpret_cast<const VkImagePlaneMemoryRequirementsInfo*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO: {
+            checkEqual_VkImagePlaneMemoryRequirementsInfo(
+                reinterpret_cast<const VkImagePlaneMemoryRequirementsInfo*>(structExtension),
+                reinterpret_cast<const VkImagePlaneMemoryRequirementsInfo*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES:
-        {
-            checkEqual_VkPhysicalDeviceSamplerYcbcrConversionFeatures(reinterpret_cast<const VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(structExtension), reinterpret_cast<const VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES: {
+            checkEqual_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
+                reinterpret_cast<const VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES:
-        {
-            checkEqual_VkSamplerYcbcrConversionImageFormatProperties(reinterpret_cast<const VkSamplerYcbcrConversionImageFormatProperties*>(structExtension), reinterpret_cast<const VkSamplerYcbcrConversionImageFormatProperties*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES: {
+            checkEqual_VkSamplerYcbcrConversionImageFormatProperties(
+                reinterpret_cast<const VkSamplerYcbcrConversionImageFormatProperties*>(
+                    structExtension),
+                reinterpret_cast<const VkSamplerYcbcrConversionImageFormatProperties*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO:
-        {
-            checkEqual_VkPhysicalDeviceExternalImageFormatInfo(reinterpret_cast<const VkPhysicalDeviceExternalImageFormatInfo*>(structExtension), reinterpret_cast<const VkPhysicalDeviceExternalImageFormatInfo*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO: {
+            checkEqual_VkPhysicalDeviceExternalImageFormatInfo(
+                reinterpret_cast<const VkPhysicalDeviceExternalImageFormatInfo*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceExternalImageFormatInfo*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES:
-        {
-            checkEqual_VkExternalImageFormatProperties(reinterpret_cast<const VkExternalImageFormatProperties*>(structExtension), reinterpret_cast<const VkExternalImageFormatProperties*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES: {
+            checkEqual_VkExternalImageFormatProperties(
+                reinterpret_cast<const VkExternalImageFormatProperties*>(structExtension),
+                reinterpret_cast<const VkExternalImageFormatProperties*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES:
-        {
-            checkEqual_VkPhysicalDeviceIDProperties(reinterpret_cast<const VkPhysicalDeviceIDProperties*>(structExtension), reinterpret_cast<const VkPhysicalDeviceIDProperties*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES: {
+            checkEqual_VkPhysicalDeviceIDProperties(
+                reinterpret_cast<const VkPhysicalDeviceIDProperties*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceIDProperties*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO:
-        {
-            checkEqual_VkExternalMemoryImageCreateInfo(reinterpret_cast<const VkExternalMemoryImageCreateInfo*>(structExtension), reinterpret_cast<const VkExternalMemoryImageCreateInfo*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO: {
+            checkEqual_VkExternalMemoryImageCreateInfo(
+                reinterpret_cast<const VkExternalMemoryImageCreateInfo*>(structExtension),
+                reinterpret_cast<const VkExternalMemoryImageCreateInfo*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO:
-        {
-            checkEqual_VkExternalMemoryBufferCreateInfo(reinterpret_cast<const VkExternalMemoryBufferCreateInfo*>(structExtension), reinterpret_cast<const VkExternalMemoryBufferCreateInfo*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO: {
+            checkEqual_VkExternalMemoryBufferCreateInfo(
+                reinterpret_cast<const VkExternalMemoryBufferCreateInfo*>(structExtension),
+                reinterpret_cast<const VkExternalMemoryBufferCreateInfo*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO:
-        {
-            checkEqual_VkExportMemoryAllocateInfo(reinterpret_cast<const VkExportMemoryAllocateInfo*>(structExtension), reinterpret_cast<const VkExportMemoryAllocateInfo*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO: {
+            checkEqual_VkExportMemoryAllocateInfo(
+                reinterpret_cast<const VkExportMemoryAllocateInfo*>(structExtension),
+                reinterpret_cast<const VkExportMemoryAllocateInfo*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO:
-        {
-            checkEqual_VkExportFenceCreateInfo(reinterpret_cast<const VkExportFenceCreateInfo*>(structExtension), reinterpret_cast<const VkExportFenceCreateInfo*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO: {
+            checkEqual_VkExportFenceCreateInfo(
+                reinterpret_cast<const VkExportFenceCreateInfo*>(structExtension),
+                reinterpret_cast<const VkExportFenceCreateInfo*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO:
-        {
-            checkEqual_VkExportSemaphoreCreateInfo(reinterpret_cast<const VkExportSemaphoreCreateInfo*>(structExtension), reinterpret_cast<const VkExportSemaphoreCreateInfo*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO: {
+            checkEqual_VkExportSemaphoreCreateInfo(
+                reinterpret_cast<const VkExportSemaphoreCreateInfo*>(structExtension),
+                reinterpret_cast<const VkExportSemaphoreCreateInfo*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES:
-        {
-            checkEqual_VkPhysicalDeviceMaintenance3Properties(reinterpret_cast<const VkPhysicalDeviceMaintenance3Properties*>(structExtension), reinterpret_cast<const VkPhysicalDeviceMaintenance3Properties*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES: {
+            checkEqual_VkPhysicalDeviceMaintenance3Properties(
+                reinterpret_cast<const VkPhysicalDeviceMaintenance3Properties*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceMaintenance3Properties*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES:
-        {
-            checkEqual_VkPhysicalDeviceShaderDrawParametersFeatures(reinterpret_cast<const VkPhysicalDeviceShaderDrawParametersFeatures*>(structExtension), reinterpret_cast<const VkPhysicalDeviceShaderDrawParametersFeatures*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES: {
+            checkEqual_VkPhysicalDeviceShaderDrawParametersFeatures(
+                reinterpret_cast<const VkPhysicalDeviceShaderDrawParametersFeatures*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceShaderDrawParametersFeatures*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_VERSION_1_2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES:
-        {
-            checkEqual_VkPhysicalDeviceVulkan11Features(reinterpret_cast<const VkPhysicalDeviceVulkan11Features*>(structExtension), reinterpret_cast<const VkPhysicalDeviceVulkan11Features*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: {
+            checkEqual_VkPhysicalDeviceVulkan11Features(
+                reinterpret_cast<const VkPhysicalDeviceVulkan11Features*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceVulkan11Features*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES:
-        {
-            checkEqual_VkPhysicalDeviceVulkan11Properties(reinterpret_cast<const VkPhysicalDeviceVulkan11Properties*>(structExtension), reinterpret_cast<const VkPhysicalDeviceVulkan11Properties*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: {
+            checkEqual_VkPhysicalDeviceVulkan11Properties(
+                reinterpret_cast<const VkPhysicalDeviceVulkan11Properties*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceVulkan11Properties*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES:
-        {
-            checkEqual_VkPhysicalDeviceVulkan12Features(reinterpret_cast<const VkPhysicalDeviceVulkan12Features*>(structExtension), reinterpret_cast<const VkPhysicalDeviceVulkan12Features*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: {
+            checkEqual_VkPhysicalDeviceVulkan12Features(
+                reinterpret_cast<const VkPhysicalDeviceVulkan12Features*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceVulkan12Features*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES:
-        {
-            checkEqual_VkPhysicalDeviceVulkan12Properties(reinterpret_cast<const VkPhysicalDeviceVulkan12Properties*>(structExtension), reinterpret_cast<const VkPhysicalDeviceVulkan12Properties*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: {
+            checkEqual_VkPhysicalDeviceVulkan12Properties(
+                reinterpret_cast<const VkPhysicalDeviceVulkan12Properties*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceVulkan12Properties*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO:
-        {
-            checkEqual_VkImageFormatListCreateInfo(reinterpret_cast<const VkImageFormatListCreateInfo*>(structExtension), reinterpret_cast<const VkImageFormatListCreateInfo*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO: {
+            checkEqual_VkImageFormatListCreateInfo(
+                reinterpret_cast<const VkImageFormatListCreateInfo*>(structExtension),
+                reinterpret_cast<const VkImageFormatListCreateInfo*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES:
-        {
-            checkEqual_VkPhysicalDevice8BitStorageFeatures(reinterpret_cast<const VkPhysicalDevice8BitStorageFeatures*>(structExtension), reinterpret_cast<const VkPhysicalDevice8BitStorageFeatures*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES: {
+            checkEqual_VkPhysicalDevice8BitStorageFeatures(
+                reinterpret_cast<const VkPhysicalDevice8BitStorageFeatures*>(structExtension),
+                reinterpret_cast<const VkPhysicalDevice8BitStorageFeatures*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES:
-        {
-            checkEqual_VkPhysicalDeviceDriverProperties(reinterpret_cast<const VkPhysicalDeviceDriverProperties*>(structExtension), reinterpret_cast<const VkPhysicalDeviceDriverProperties*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES: {
+            checkEqual_VkPhysicalDeviceDriverProperties(
+                reinterpret_cast<const VkPhysicalDeviceDriverProperties*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceDriverProperties*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES:
-        {
-            checkEqual_VkPhysicalDeviceShaderAtomicInt64Features(reinterpret_cast<const VkPhysicalDeviceShaderAtomicInt64Features*>(structExtension), reinterpret_cast<const VkPhysicalDeviceShaderAtomicInt64Features*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES: {
+            checkEqual_VkPhysicalDeviceShaderAtomicInt64Features(
+                reinterpret_cast<const VkPhysicalDeviceShaderAtomicInt64Features*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceShaderAtomicInt64Features*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES:
-        {
-            checkEqual_VkPhysicalDeviceShaderFloat16Int8Features(reinterpret_cast<const VkPhysicalDeviceShaderFloat16Int8Features*>(structExtension), reinterpret_cast<const VkPhysicalDeviceShaderFloat16Int8Features*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES: {
+            checkEqual_VkPhysicalDeviceShaderFloat16Int8Features(
+                reinterpret_cast<const VkPhysicalDeviceShaderFloat16Int8Features*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceShaderFloat16Int8Features*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES:
-        {
-            checkEqual_VkPhysicalDeviceFloatControlsProperties(reinterpret_cast<const VkPhysicalDeviceFloatControlsProperties*>(structExtension), reinterpret_cast<const VkPhysicalDeviceFloatControlsProperties*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES: {
+            checkEqual_VkPhysicalDeviceFloatControlsProperties(
+                reinterpret_cast<const VkPhysicalDeviceFloatControlsProperties*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceFloatControlsProperties*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO:
-        {
-            checkEqual_VkDescriptorSetLayoutBindingFlagsCreateInfo(reinterpret_cast<const VkDescriptorSetLayoutBindingFlagsCreateInfo*>(structExtension), reinterpret_cast<const VkDescriptorSetLayoutBindingFlagsCreateInfo*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO: {
+            checkEqual_VkDescriptorSetLayoutBindingFlagsCreateInfo(
+                reinterpret_cast<const VkDescriptorSetLayoutBindingFlagsCreateInfo*>(
+                    structExtension),
+                reinterpret_cast<const VkDescriptorSetLayoutBindingFlagsCreateInfo*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES:
-        {
-            checkEqual_VkPhysicalDeviceDescriptorIndexingFeatures(reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingFeatures*>(structExtension), reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingFeatures*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES: {
+            checkEqual_VkPhysicalDeviceDescriptorIndexingFeatures(
+                reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingFeatures*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingFeatures*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES:
-        {
-            checkEqual_VkPhysicalDeviceDescriptorIndexingProperties(reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingProperties*>(structExtension), reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingProperties*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES: {
+            checkEqual_VkPhysicalDeviceDescriptorIndexingProperties(
+                reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingProperties*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingProperties*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO:
-        {
-            checkEqual_VkDescriptorSetVariableDescriptorCountAllocateInfo(reinterpret_cast<const VkDescriptorSetVariableDescriptorCountAllocateInfo*>(structExtension), reinterpret_cast<const VkDescriptorSetVariableDescriptorCountAllocateInfo*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO: {
+            checkEqual_VkDescriptorSetVariableDescriptorCountAllocateInfo(
+                reinterpret_cast<const VkDescriptorSetVariableDescriptorCountAllocateInfo*>(
+                    structExtension),
+                reinterpret_cast<const VkDescriptorSetVariableDescriptorCountAllocateInfo*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT:
-        {
-            checkEqual_VkDescriptorSetVariableDescriptorCountLayoutSupport(reinterpret_cast<const VkDescriptorSetVariableDescriptorCountLayoutSupport*>(structExtension), reinterpret_cast<const VkDescriptorSetVariableDescriptorCountLayoutSupport*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT: {
+            checkEqual_VkDescriptorSetVariableDescriptorCountLayoutSupport(
+                reinterpret_cast<const VkDescriptorSetVariableDescriptorCountLayoutSupport*>(
+                    structExtension),
+                reinterpret_cast<const VkDescriptorSetVariableDescriptorCountLayoutSupport*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE:
-        {
-            checkEqual_VkSubpassDescriptionDepthStencilResolve(reinterpret_cast<const VkSubpassDescriptionDepthStencilResolve*>(structExtension), reinterpret_cast<const VkSubpassDescriptionDepthStencilResolve*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE: {
+            checkEqual_VkSubpassDescriptionDepthStencilResolve(
+                reinterpret_cast<const VkSubpassDescriptionDepthStencilResolve*>(structExtension),
+                reinterpret_cast<const VkSubpassDescriptionDepthStencilResolve*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES:
-        {
-            checkEqual_VkPhysicalDeviceDepthStencilResolveProperties(reinterpret_cast<const VkPhysicalDeviceDepthStencilResolveProperties*>(structExtension), reinterpret_cast<const VkPhysicalDeviceDepthStencilResolveProperties*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES: {
+            checkEqual_VkPhysicalDeviceDepthStencilResolveProperties(
+                reinterpret_cast<const VkPhysicalDeviceDepthStencilResolveProperties*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceDepthStencilResolveProperties*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES:
-        {
-            checkEqual_VkPhysicalDeviceScalarBlockLayoutFeatures(reinterpret_cast<const VkPhysicalDeviceScalarBlockLayoutFeatures*>(structExtension), reinterpret_cast<const VkPhysicalDeviceScalarBlockLayoutFeatures*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES: {
+            checkEqual_VkPhysicalDeviceScalarBlockLayoutFeatures(
+                reinterpret_cast<const VkPhysicalDeviceScalarBlockLayoutFeatures*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceScalarBlockLayoutFeatures*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO:
-        {
-            checkEqual_VkImageStencilUsageCreateInfo(reinterpret_cast<const VkImageStencilUsageCreateInfo*>(structExtension), reinterpret_cast<const VkImageStencilUsageCreateInfo*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO: {
+            checkEqual_VkImageStencilUsageCreateInfo(
+                reinterpret_cast<const VkImageStencilUsageCreateInfo*>(structExtension),
+                reinterpret_cast<const VkImageStencilUsageCreateInfo*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO:
-        {
-            checkEqual_VkSamplerReductionModeCreateInfo(reinterpret_cast<const VkSamplerReductionModeCreateInfo*>(structExtension), reinterpret_cast<const VkSamplerReductionModeCreateInfo*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO: {
+            checkEqual_VkSamplerReductionModeCreateInfo(
+                reinterpret_cast<const VkSamplerReductionModeCreateInfo*>(structExtension),
+                reinterpret_cast<const VkSamplerReductionModeCreateInfo*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES:
-        {
-            checkEqual_VkPhysicalDeviceSamplerFilterMinmaxProperties(reinterpret_cast<const VkPhysicalDeviceSamplerFilterMinmaxProperties*>(structExtension), reinterpret_cast<const VkPhysicalDeviceSamplerFilterMinmaxProperties*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES: {
+            checkEqual_VkPhysicalDeviceSamplerFilterMinmaxProperties(
+                reinterpret_cast<const VkPhysicalDeviceSamplerFilterMinmaxProperties*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceSamplerFilterMinmaxProperties*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES:
-        {
-            checkEqual_VkPhysicalDeviceVulkanMemoryModelFeatures(reinterpret_cast<const VkPhysicalDeviceVulkanMemoryModelFeatures*>(structExtension), reinterpret_cast<const VkPhysicalDeviceVulkanMemoryModelFeatures*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES: {
+            checkEqual_VkPhysicalDeviceVulkanMemoryModelFeatures(
+                reinterpret_cast<const VkPhysicalDeviceVulkanMemoryModelFeatures*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceVulkanMemoryModelFeatures*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES:
-        {
-            checkEqual_VkPhysicalDeviceImagelessFramebufferFeatures(reinterpret_cast<const VkPhysicalDeviceImagelessFramebufferFeatures*>(structExtension), reinterpret_cast<const VkPhysicalDeviceImagelessFramebufferFeatures*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES: {
+            checkEqual_VkPhysicalDeviceImagelessFramebufferFeatures(
+                reinterpret_cast<const VkPhysicalDeviceImagelessFramebufferFeatures*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceImagelessFramebufferFeatures*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO:
-        {
-            checkEqual_VkFramebufferAttachmentsCreateInfo(reinterpret_cast<const VkFramebufferAttachmentsCreateInfo*>(structExtension), reinterpret_cast<const VkFramebufferAttachmentsCreateInfo*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO: {
+            checkEqual_VkFramebufferAttachmentsCreateInfo(
+                reinterpret_cast<const VkFramebufferAttachmentsCreateInfo*>(structExtension),
+                reinterpret_cast<const VkFramebufferAttachmentsCreateInfo*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO:
-        {
-            checkEqual_VkRenderPassAttachmentBeginInfo(reinterpret_cast<const VkRenderPassAttachmentBeginInfo*>(structExtension), reinterpret_cast<const VkRenderPassAttachmentBeginInfo*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO: {
+            checkEqual_VkRenderPassAttachmentBeginInfo(
+                reinterpret_cast<const VkRenderPassAttachmentBeginInfo*>(structExtension),
+                reinterpret_cast<const VkRenderPassAttachmentBeginInfo*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES:
-        {
-            checkEqual_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(reinterpret_cast<const VkPhysicalDeviceUniformBufferStandardLayoutFeatures*>(structExtension), reinterpret_cast<const VkPhysicalDeviceUniformBufferStandardLayoutFeatures*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES: {
+            checkEqual_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(
+                reinterpret_cast<const VkPhysicalDeviceUniformBufferStandardLayoutFeatures*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceUniformBufferStandardLayoutFeatures*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES:
-        {
-            checkEqual_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(reinterpret_cast<const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures*>(structExtension), reinterpret_cast<const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES: {
+            checkEqual_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(
+                reinterpret_cast<const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES:
-        {
-            checkEqual_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(reinterpret_cast<const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures*>(structExtension), reinterpret_cast<const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES: {
+            checkEqual_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(
+                reinterpret_cast<const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT:
-        {
-            checkEqual_VkAttachmentReferenceStencilLayout(reinterpret_cast<const VkAttachmentReferenceStencilLayout*>(structExtension), reinterpret_cast<const VkAttachmentReferenceStencilLayout*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT: {
+            checkEqual_VkAttachmentReferenceStencilLayout(
+                reinterpret_cast<const VkAttachmentReferenceStencilLayout*>(structExtension),
+                reinterpret_cast<const VkAttachmentReferenceStencilLayout*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT:
-        {
-            checkEqual_VkAttachmentDescriptionStencilLayout(reinterpret_cast<const VkAttachmentDescriptionStencilLayout*>(structExtension), reinterpret_cast<const VkAttachmentDescriptionStencilLayout*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT: {
+            checkEqual_VkAttachmentDescriptionStencilLayout(
+                reinterpret_cast<const VkAttachmentDescriptionStencilLayout*>(structExtension),
+                reinterpret_cast<const VkAttachmentDescriptionStencilLayout*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES:
-        {
-            checkEqual_VkPhysicalDeviceHostQueryResetFeatures(reinterpret_cast<const VkPhysicalDeviceHostQueryResetFeatures*>(structExtension), reinterpret_cast<const VkPhysicalDeviceHostQueryResetFeatures*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES: {
+            checkEqual_VkPhysicalDeviceHostQueryResetFeatures(
+                reinterpret_cast<const VkPhysicalDeviceHostQueryResetFeatures*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceHostQueryResetFeatures*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES:
-        {
-            checkEqual_VkPhysicalDeviceTimelineSemaphoreFeatures(reinterpret_cast<const VkPhysicalDeviceTimelineSemaphoreFeatures*>(structExtension), reinterpret_cast<const VkPhysicalDeviceTimelineSemaphoreFeatures*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES: {
+            checkEqual_VkPhysicalDeviceTimelineSemaphoreFeatures(
+                reinterpret_cast<const VkPhysicalDeviceTimelineSemaphoreFeatures*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceTimelineSemaphoreFeatures*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES:
-        {
-            checkEqual_VkPhysicalDeviceTimelineSemaphoreProperties(reinterpret_cast<const VkPhysicalDeviceTimelineSemaphoreProperties*>(structExtension), reinterpret_cast<const VkPhysicalDeviceTimelineSemaphoreProperties*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES: {
+            checkEqual_VkPhysicalDeviceTimelineSemaphoreProperties(
+                reinterpret_cast<const VkPhysicalDeviceTimelineSemaphoreProperties*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceTimelineSemaphoreProperties*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO:
-        {
-            checkEqual_VkSemaphoreTypeCreateInfo(reinterpret_cast<const VkSemaphoreTypeCreateInfo*>(structExtension), reinterpret_cast<const VkSemaphoreTypeCreateInfo*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO: {
+            checkEqual_VkSemaphoreTypeCreateInfo(
+                reinterpret_cast<const VkSemaphoreTypeCreateInfo*>(structExtension),
+                reinterpret_cast<const VkSemaphoreTypeCreateInfo*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO:
-        {
-            checkEqual_VkTimelineSemaphoreSubmitInfo(reinterpret_cast<const VkTimelineSemaphoreSubmitInfo*>(structExtension), reinterpret_cast<const VkTimelineSemaphoreSubmitInfo*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO: {
+            checkEqual_VkTimelineSemaphoreSubmitInfo(
+                reinterpret_cast<const VkTimelineSemaphoreSubmitInfo*>(structExtension),
+                reinterpret_cast<const VkTimelineSemaphoreSubmitInfo*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES:
-        {
-            checkEqual_VkPhysicalDeviceBufferDeviceAddressFeatures(reinterpret_cast<const VkPhysicalDeviceBufferDeviceAddressFeatures*>(structExtension), reinterpret_cast<const VkPhysicalDeviceBufferDeviceAddressFeatures*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES: {
+            checkEqual_VkPhysicalDeviceBufferDeviceAddressFeatures(
+                reinterpret_cast<const VkPhysicalDeviceBufferDeviceAddressFeatures*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceBufferDeviceAddressFeatures*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO:
-        {
-            checkEqual_VkBufferOpaqueCaptureAddressCreateInfo(reinterpret_cast<const VkBufferOpaqueCaptureAddressCreateInfo*>(structExtension), reinterpret_cast<const VkBufferOpaqueCaptureAddressCreateInfo*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO: {
+            checkEqual_VkBufferOpaqueCaptureAddressCreateInfo(
+                reinterpret_cast<const VkBufferOpaqueCaptureAddressCreateInfo*>(structExtension),
+                reinterpret_cast<const VkBufferOpaqueCaptureAddressCreateInfo*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO:
-        {
-            checkEqual_VkMemoryOpaqueCaptureAddressAllocateInfo(reinterpret_cast<const VkMemoryOpaqueCaptureAddressAllocateInfo*>(structExtension), reinterpret_cast<const VkMemoryOpaqueCaptureAddressAllocateInfo*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO: {
+            checkEqual_VkMemoryOpaqueCaptureAddressAllocateInfo(
+                reinterpret_cast<const VkMemoryOpaqueCaptureAddressAllocateInfo*>(structExtension),
+                reinterpret_cast<const VkMemoryOpaqueCaptureAddressAllocateInfo*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_KHR_swapchain
-        case VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR:
-        {
-            checkEqual_VkImageSwapchainCreateInfoKHR(reinterpret_cast<const VkImageSwapchainCreateInfoKHR*>(structExtension), reinterpret_cast<const VkImageSwapchainCreateInfoKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR: {
+            checkEqual_VkImageSwapchainCreateInfoKHR(
+                reinterpret_cast<const VkImageSwapchainCreateInfoKHR*>(structExtension),
+                reinterpret_cast<const VkImageSwapchainCreateInfoKHR*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR:
-        {
-            checkEqual_VkBindImageMemorySwapchainInfoKHR(reinterpret_cast<const VkBindImageMemorySwapchainInfoKHR*>(structExtension), reinterpret_cast<const VkBindImageMemorySwapchainInfoKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR: {
+            checkEqual_VkBindImageMemorySwapchainInfoKHR(
+                reinterpret_cast<const VkBindImageMemorySwapchainInfoKHR*>(structExtension),
+                reinterpret_cast<const VkBindImageMemorySwapchainInfoKHR*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR:
-        {
-            checkEqual_VkDeviceGroupPresentInfoKHR(reinterpret_cast<const VkDeviceGroupPresentInfoKHR*>(structExtension), reinterpret_cast<const VkDeviceGroupPresentInfoKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR: {
+            checkEqual_VkDeviceGroupPresentInfoKHR(
+                reinterpret_cast<const VkDeviceGroupPresentInfoKHR*>(structExtension),
+                reinterpret_cast<const VkDeviceGroupPresentInfoKHR*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR:
-        {
-            checkEqual_VkDeviceGroupSwapchainCreateInfoKHR(reinterpret_cast<const VkDeviceGroupSwapchainCreateInfoKHR*>(structExtension), reinterpret_cast<const VkDeviceGroupSwapchainCreateInfoKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR: {
+            checkEqual_VkDeviceGroupSwapchainCreateInfoKHR(
+                reinterpret_cast<const VkDeviceGroupSwapchainCreateInfoKHR*>(structExtension),
+                reinterpret_cast<const VkDeviceGroupSwapchainCreateInfoKHR*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_KHR_display_swapchain
-        case VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR:
-        {
-            checkEqual_VkDisplayPresentInfoKHR(reinterpret_cast<const VkDisplayPresentInfoKHR*>(structExtension), reinterpret_cast<const VkDisplayPresentInfoKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR: {
+            checkEqual_VkDisplayPresentInfoKHR(
+                reinterpret_cast<const VkDisplayPresentInfoKHR*>(structExtension),
+                reinterpret_cast<const VkDisplayPresentInfoKHR*>(structExtension2), onFail);
             break;
         }
 #endif
 #ifdef VK_KHR_video_queue
-        case VK_STRUCTURE_TYPE_VIDEO_QUEUE_FAMILY_PROPERTIES_2_KHR:
-        {
-            checkEqual_VkVideoQueueFamilyProperties2KHR(reinterpret_cast<const VkVideoQueueFamilyProperties2KHR*>(structExtension), reinterpret_cast<const VkVideoQueueFamilyProperties2KHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_VIDEO_QUEUE_FAMILY_PROPERTIES_2_KHR: {
+            checkEqual_VkVideoQueueFamilyProperties2KHR(
+                reinterpret_cast<const VkVideoQueueFamilyProperties2KHR*>(structExtension),
+                reinterpret_cast<const VkVideoQueueFamilyProperties2KHR*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_PROFILE_KHR:
-        {
-            checkEqual_VkVideoProfileKHR(reinterpret_cast<const VkVideoProfileKHR*>(structExtension), reinterpret_cast<const VkVideoProfileKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_VIDEO_PROFILE_KHR: {
+            checkEqual_VkVideoProfileKHR(
+                reinterpret_cast<const VkVideoProfileKHR*>(structExtension),
+                reinterpret_cast<const VkVideoProfileKHR*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_PROFILES_KHR:
-        {
-            checkEqual_VkVideoProfilesKHR(reinterpret_cast<const VkVideoProfilesKHR*>(structExtension), reinterpret_cast<const VkVideoProfilesKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_VIDEO_PROFILES_KHR: {
+            checkEqual_VkVideoProfilesKHR(
+                reinterpret_cast<const VkVideoProfilesKHR*>(structExtension),
+                reinterpret_cast<const VkVideoProfilesKHR*>(structExtension2), onFail);
             break;
         }
 #endif
 #ifdef VK_KHR_dynamic_rendering
-        case VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR:
-        {
-            checkEqual_VkPipelineRenderingCreateInfoKHR(reinterpret_cast<const VkPipelineRenderingCreateInfoKHR*>(structExtension), reinterpret_cast<const VkPipelineRenderingCreateInfoKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR: {
+            checkEqual_VkPipelineRenderingCreateInfoKHR(
+                reinterpret_cast<const VkPipelineRenderingCreateInfoKHR*>(structExtension),
+                reinterpret_cast<const VkPipelineRenderingCreateInfoKHR*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES_KHR:
-        {
-            checkEqual_VkPhysicalDeviceDynamicRenderingFeaturesKHR(reinterpret_cast<const VkPhysicalDeviceDynamicRenderingFeaturesKHR*>(structExtension), reinterpret_cast<const VkPhysicalDeviceDynamicRenderingFeaturesKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES_KHR: {
+            checkEqual_VkPhysicalDeviceDynamicRenderingFeaturesKHR(
+                reinterpret_cast<const VkPhysicalDeviceDynamicRenderingFeaturesKHR*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceDynamicRenderingFeaturesKHR*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR:
-        {
-            checkEqual_VkCommandBufferInheritanceRenderingInfoKHR(reinterpret_cast<const VkCommandBufferInheritanceRenderingInfoKHR*>(structExtension), reinterpret_cast<const VkCommandBufferInheritanceRenderingInfoKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR: {
+            checkEqual_VkCommandBufferInheritanceRenderingInfoKHR(
+                reinterpret_cast<const VkCommandBufferInheritanceRenderingInfoKHR*>(
+                    structExtension),
+                reinterpret_cast<const VkCommandBufferInheritanceRenderingInfoKHR*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR:
-        {
-            checkEqual_VkRenderingFragmentShadingRateAttachmentInfoKHR(reinterpret_cast<const VkRenderingFragmentShadingRateAttachmentInfoKHR*>(structExtension), reinterpret_cast<const VkRenderingFragmentShadingRateAttachmentInfoKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR: {
+            checkEqual_VkRenderingFragmentShadingRateAttachmentInfoKHR(
+                reinterpret_cast<const VkRenderingFragmentShadingRateAttachmentInfoKHR*>(
+                    structExtension),
+                reinterpret_cast<const VkRenderingFragmentShadingRateAttachmentInfoKHR*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_INFO_EXT:
-        {
-            checkEqual_VkRenderingFragmentDensityMapAttachmentInfoEXT(reinterpret_cast<const VkRenderingFragmentDensityMapAttachmentInfoEXT*>(structExtension), reinterpret_cast<const VkRenderingFragmentDensityMapAttachmentInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_INFO_EXT: {
+            checkEqual_VkRenderingFragmentDensityMapAttachmentInfoEXT(
+                reinterpret_cast<const VkRenderingFragmentDensityMapAttachmentInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkRenderingFragmentDensityMapAttachmentInfoEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_ATTACHMENT_SAMPLE_COUNT_INFO_AMD:
-        {
-            checkEqual_VkAttachmentSampleCountInfoAMD(reinterpret_cast<const VkAttachmentSampleCountInfoAMD*>(structExtension), reinterpret_cast<const VkAttachmentSampleCountInfoAMD*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_ATTACHMENT_SAMPLE_COUNT_INFO_AMD: {
+            checkEqual_VkAttachmentSampleCountInfoAMD(
+                reinterpret_cast<const VkAttachmentSampleCountInfoAMD*>(structExtension),
+                reinterpret_cast<const VkAttachmentSampleCountInfoAMD*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_MULTIVIEW_PER_VIEW_ATTRIBUTES_INFO_NVX:
-        {
-            checkEqual_VkMultiviewPerViewAttributesInfoNVX(reinterpret_cast<const VkMultiviewPerViewAttributesInfoNVX*>(structExtension), reinterpret_cast<const VkMultiviewPerViewAttributesInfoNVX*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_MULTIVIEW_PER_VIEW_ATTRIBUTES_INFO_NVX: {
+            checkEqual_VkMultiviewPerViewAttributesInfoNVX(
+                reinterpret_cast<const VkMultiviewPerViewAttributesInfoNVX*>(structExtension),
+                reinterpret_cast<const VkMultiviewPerViewAttributesInfoNVX*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_KHR_external_memory_win32
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
-        {
-            checkEqual_VkImportMemoryWin32HandleInfoKHR(reinterpret_cast<const VkImportMemoryWin32HandleInfoKHR*>(structExtension), reinterpret_cast<const VkImportMemoryWin32HandleInfoKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR: {
+            checkEqual_VkImportMemoryWin32HandleInfoKHR(
+                reinterpret_cast<const VkImportMemoryWin32HandleInfoKHR*>(structExtension),
+                reinterpret_cast<const VkImportMemoryWin32HandleInfoKHR*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
-        {
-            checkEqual_VkExportMemoryWin32HandleInfoKHR(reinterpret_cast<const VkExportMemoryWin32HandleInfoKHR*>(structExtension), reinterpret_cast<const VkExportMemoryWin32HandleInfoKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR: {
+            checkEqual_VkExportMemoryWin32HandleInfoKHR(
+                reinterpret_cast<const VkExportMemoryWin32HandleInfoKHR*>(structExtension),
+                reinterpret_cast<const VkExportMemoryWin32HandleInfoKHR*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_KHR_external_memory_fd
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR:
-        {
-            checkEqual_VkImportMemoryFdInfoKHR(reinterpret_cast<const VkImportMemoryFdInfoKHR*>(structExtension), reinterpret_cast<const VkImportMemoryFdInfoKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR: {
+            checkEqual_VkImportMemoryFdInfoKHR(
+                reinterpret_cast<const VkImportMemoryFdInfoKHR*>(structExtension),
+                reinterpret_cast<const VkImportMemoryFdInfoKHR*>(structExtension2), onFail);
             break;
         }
 #endif
 #ifdef VK_KHR_win32_keyed_mutex
-        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR:
-        {
-            checkEqual_VkWin32KeyedMutexAcquireReleaseInfoKHR(reinterpret_cast<const VkWin32KeyedMutexAcquireReleaseInfoKHR*>(structExtension), reinterpret_cast<const VkWin32KeyedMutexAcquireReleaseInfoKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR: {
+            checkEqual_VkWin32KeyedMutexAcquireReleaseInfoKHR(
+                reinterpret_cast<const VkWin32KeyedMutexAcquireReleaseInfoKHR*>(structExtension),
+                reinterpret_cast<const VkWin32KeyedMutexAcquireReleaseInfoKHR*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_KHR_external_semaphore_win32
-        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR:
-        {
-            checkEqual_VkExportSemaphoreWin32HandleInfoKHR(reinterpret_cast<const VkExportSemaphoreWin32HandleInfoKHR*>(structExtension), reinterpret_cast<const VkExportSemaphoreWin32HandleInfoKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR: {
+            checkEqual_VkExportSemaphoreWin32HandleInfoKHR(
+                reinterpret_cast<const VkExportSemaphoreWin32HandleInfoKHR*>(structExtension),
+                reinterpret_cast<const VkExportSemaphoreWin32HandleInfoKHR*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR:
-        {
-            checkEqual_VkD3D12FenceSubmitInfoKHR(reinterpret_cast<const VkD3D12FenceSubmitInfoKHR*>(structExtension), reinterpret_cast<const VkD3D12FenceSubmitInfoKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR: {
+            checkEqual_VkD3D12FenceSubmitInfoKHR(
+                reinterpret_cast<const VkD3D12FenceSubmitInfoKHR*>(structExtension),
+                reinterpret_cast<const VkD3D12FenceSubmitInfoKHR*>(structExtension2), onFail);
             break;
         }
 #endif
 #ifdef VK_KHR_push_descriptor
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR:
-        {
-            checkEqual_VkPhysicalDevicePushDescriptorPropertiesKHR(reinterpret_cast<const VkPhysicalDevicePushDescriptorPropertiesKHR*>(structExtension), reinterpret_cast<const VkPhysicalDevicePushDescriptorPropertiesKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR: {
+            checkEqual_VkPhysicalDevicePushDescriptorPropertiesKHR(
+                reinterpret_cast<const VkPhysicalDevicePushDescriptorPropertiesKHR*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDevicePushDescriptorPropertiesKHR*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_KHR_incremental_present
-        case VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR:
-        {
-            checkEqual_VkPresentRegionsKHR(reinterpret_cast<const VkPresentRegionsKHR*>(structExtension), reinterpret_cast<const VkPresentRegionsKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR: {
+            checkEqual_VkPresentRegionsKHR(
+                reinterpret_cast<const VkPresentRegionsKHR*>(structExtension),
+                reinterpret_cast<const VkPresentRegionsKHR*>(structExtension2), onFail);
             break;
         }
 #endif
 #ifdef VK_KHR_shared_presentable_image
-        case VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR:
-        {
-            checkEqual_VkSharedPresentSurfaceCapabilitiesKHR(reinterpret_cast<const VkSharedPresentSurfaceCapabilitiesKHR*>(structExtension), reinterpret_cast<const VkSharedPresentSurfaceCapabilitiesKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR: {
+            checkEqual_VkSharedPresentSurfaceCapabilitiesKHR(
+                reinterpret_cast<const VkSharedPresentSurfaceCapabilitiesKHR*>(structExtension),
+                reinterpret_cast<const VkSharedPresentSurfaceCapabilitiesKHR*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_KHR_external_fence_win32
-        case VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR:
-        {
-            checkEqual_VkExportFenceWin32HandleInfoKHR(reinterpret_cast<const VkExportFenceWin32HandleInfoKHR*>(structExtension), reinterpret_cast<const VkExportFenceWin32HandleInfoKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR: {
+            checkEqual_VkExportFenceWin32HandleInfoKHR(
+                reinterpret_cast<const VkExportFenceWin32HandleInfoKHR*>(structExtension),
+                reinterpret_cast<const VkExportFenceWin32HandleInfoKHR*>(structExtension2), onFail);
             break;
         }
 #endif
 #ifdef VK_KHR_performance_query
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR:
-        {
-            checkEqual_VkPhysicalDevicePerformanceQueryFeaturesKHR(reinterpret_cast<const VkPhysicalDevicePerformanceQueryFeaturesKHR*>(structExtension), reinterpret_cast<const VkPhysicalDevicePerformanceQueryFeaturesKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR: {
+            checkEqual_VkPhysicalDevicePerformanceQueryFeaturesKHR(
+                reinterpret_cast<const VkPhysicalDevicePerformanceQueryFeaturesKHR*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDevicePerformanceQueryFeaturesKHR*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR:
-        {
-            checkEqual_VkPhysicalDevicePerformanceQueryPropertiesKHR(reinterpret_cast<const VkPhysicalDevicePerformanceQueryPropertiesKHR*>(structExtension), reinterpret_cast<const VkPhysicalDevicePerformanceQueryPropertiesKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR: {
+            checkEqual_VkPhysicalDevicePerformanceQueryPropertiesKHR(
+                reinterpret_cast<const VkPhysicalDevicePerformanceQueryPropertiesKHR*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDevicePerformanceQueryPropertiesKHR*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR:
-        {
-            checkEqual_VkQueryPoolPerformanceCreateInfoKHR(reinterpret_cast<const VkQueryPoolPerformanceCreateInfoKHR*>(structExtension), reinterpret_cast<const VkQueryPoolPerformanceCreateInfoKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR: {
+            checkEqual_VkQueryPoolPerformanceCreateInfoKHR(
+                reinterpret_cast<const VkQueryPoolPerformanceCreateInfoKHR*>(structExtension),
+                reinterpret_cast<const VkQueryPoolPerformanceCreateInfoKHR*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR:
-        {
-            checkEqual_VkPerformanceQuerySubmitInfoKHR(reinterpret_cast<const VkPerformanceQuerySubmitInfoKHR*>(structExtension), reinterpret_cast<const VkPerformanceQuerySubmitInfoKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR: {
+            checkEqual_VkPerformanceQuerySubmitInfoKHR(
+                reinterpret_cast<const VkPerformanceQuerySubmitInfoKHR*>(structExtension),
+                reinterpret_cast<const VkPerformanceQuerySubmitInfoKHR*>(structExtension2), onFail);
             break;
         }
 #endif
 #ifdef VK_KHR_portability_subset
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR:
-        {
-            checkEqual_VkPhysicalDevicePortabilitySubsetFeaturesKHR(reinterpret_cast<const VkPhysicalDevicePortabilitySubsetFeaturesKHR*>(structExtension), reinterpret_cast<const VkPhysicalDevicePortabilitySubsetFeaturesKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR: {
+            checkEqual_VkPhysicalDevicePortabilitySubsetFeaturesKHR(
+                reinterpret_cast<const VkPhysicalDevicePortabilitySubsetFeaturesKHR*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDevicePortabilitySubsetFeaturesKHR*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR:
-        {
-            checkEqual_VkPhysicalDevicePortabilitySubsetPropertiesKHR(reinterpret_cast<const VkPhysicalDevicePortabilitySubsetPropertiesKHR*>(structExtension), reinterpret_cast<const VkPhysicalDevicePortabilitySubsetPropertiesKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR: {
+            checkEqual_VkPhysicalDevicePortabilitySubsetPropertiesKHR(
+                reinterpret_cast<const VkPhysicalDevicePortabilitySubsetPropertiesKHR*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDevicePortabilitySubsetPropertiesKHR*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_KHR_shader_clock
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR:
-        {
-            checkEqual_VkPhysicalDeviceShaderClockFeaturesKHR(reinterpret_cast<const VkPhysicalDeviceShaderClockFeaturesKHR*>(structExtension), reinterpret_cast<const VkPhysicalDeviceShaderClockFeaturesKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR: {
+            checkEqual_VkPhysicalDeviceShaderClockFeaturesKHR(
+                reinterpret_cast<const VkPhysicalDeviceShaderClockFeaturesKHR*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceShaderClockFeaturesKHR*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_KHR_shader_terminate_invocation
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR:
-        {
-            checkEqual_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(reinterpret_cast<const VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR*>(structExtension), reinterpret_cast<const VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR: {
+            checkEqual_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(
+                reinterpret_cast<const VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_KHR_fragment_shading_rate
-        case VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR:
-        {
-            checkEqual_VkFragmentShadingRateAttachmentInfoKHR(reinterpret_cast<const VkFragmentShadingRateAttachmentInfoKHR*>(structExtension), reinterpret_cast<const VkFragmentShadingRateAttachmentInfoKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR: {
+            checkEqual_VkFragmentShadingRateAttachmentInfoKHR(
+                reinterpret_cast<const VkFragmentShadingRateAttachmentInfoKHR*>(structExtension),
+                reinterpret_cast<const VkFragmentShadingRateAttachmentInfoKHR*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR:
-        {
-            checkEqual_VkPipelineFragmentShadingRateStateCreateInfoKHR(reinterpret_cast<const VkPipelineFragmentShadingRateStateCreateInfoKHR*>(structExtension), reinterpret_cast<const VkPipelineFragmentShadingRateStateCreateInfoKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR: {
+            checkEqual_VkPipelineFragmentShadingRateStateCreateInfoKHR(
+                reinterpret_cast<const VkPipelineFragmentShadingRateStateCreateInfoKHR*>(
+                    structExtension),
+                reinterpret_cast<const VkPipelineFragmentShadingRateStateCreateInfoKHR*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR:
-        {
-            checkEqual_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateFeaturesKHR*>(structExtension), reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateFeaturesKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR: {
+            checkEqual_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(
+                reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateFeaturesKHR*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateFeaturesKHR*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR:
-        {
-            checkEqual_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(reinterpret_cast<const VkPhysicalDeviceFragmentShadingRatePropertiesKHR*>(structExtension), reinterpret_cast<const VkPhysicalDeviceFragmentShadingRatePropertiesKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR: {
+            checkEqual_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(
+                reinterpret_cast<const VkPhysicalDeviceFragmentShadingRatePropertiesKHR*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceFragmentShadingRatePropertiesKHR*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_KHR_surface_protected_capabilities
-        case VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR:
-        {
-            checkEqual_VkSurfaceProtectedCapabilitiesKHR(reinterpret_cast<const VkSurfaceProtectedCapabilitiesKHR*>(structExtension), reinterpret_cast<const VkSurfaceProtectedCapabilitiesKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR: {
+            checkEqual_VkSurfaceProtectedCapabilitiesKHR(
+                reinterpret_cast<const VkSurfaceProtectedCapabilitiesKHR*>(structExtension),
+                reinterpret_cast<const VkSurfaceProtectedCapabilitiesKHR*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_KHR_present_wait
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR:
-        {
-            checkEqual_VkPhysicalDevicePresentWaitFeaturesKHR(reinterpret_cast<const VkPhysicalDevicePresentWaitFeaturesKHR*>(structExtension), reinterpret_cast<const VkPhysicalDevicePresentWaitFeaturesKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR: {
+            checkEqual_VkPhysicalDevicePresentWaitFeaturesKHR(
+                reinterpret_cast<const VkPhysicalDevicePresentWaitFeaturesKHR*>(structExtension),
+                reinterpret_cast<const VkPhysicalDevicePresentWaitFeaturesKHR*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_KHR_pipeline_executable_properties
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR:
-        {
-            checkEqual_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(reinterpret_cast<const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR*>(structExtension), reinterpret_cast<const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR: {
+            checkEqual_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(
+                reinterpret_cast<const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_KHR_shader_integer_dot_product
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR:
-        {
-            checkEqual_VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR(reinterpret_cast<const VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR*>(structExtension), reinterpret_cast<const VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR: {
+            checkEqual_VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR(
+                reinterpret_cast<const VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES_KHR:
-        {
-            checkEqual_VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR(reinterpret_cast<const VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR*>(structExtension), reinterpret_cast<const VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES_KHR: {
+            checkEqual_VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR(
+                reinterpret_cast<const VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_KHR_present_id
-        case VK_STRUCTURE_TYPE_PRESENT_ID_KHR:
-        {
-            checkEqual_VkPresentIdKHR(reinterpret_cast<const VkPresentIdKHR*>(structExtension), reinterpret_cast<const VkPresentIdKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PRESENT_ID_KHR: {
+            checkEqual_VkPresentIdKHR(reinterpret_cast<const VkPresentIdKHR*>(structExtension),
+                                      reinterpret_cast<const VkPresentIdKHR*>(structExtension2),
+                                      onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR:
-        {
-            checkEqual_VkPhysicalDevicePresentIdFeaturesKHR(reinterpret_cast<const VkPhysicalDevicePresentIdFeaturesKHR*>(structExtension), reinterpret_cast<const VkPhysicalDevicePresentIdFeaturesKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR: {
+            checkEqual_VkPhysicalDevicePresentIdFeaturesKHR(
+                reinterpret_cast<const VkPhysicalDevicePresentIdFeaturesKHR*>(structExtension),
+                reinterpret_cast<const VkPhysicalDevicePresentIdFeaturesKHR*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_KHR_video_encode_queue
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_INFO_KHR:
-        {
-            checkEqual_VkVideoEncodeRateControlInfoKHR(reinterpret_cast<const VkVideoEncodeRateControlInfoKHR*>(structExtension), reinterpret_cast<const VkVideoEncodeRateControlInfoKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_INFO_KHR: {
+            checkEqual_VkVideoEncodeRateControlInfoKHR(
+                reinterpret_cast<const VkVideoEncodeRateControlInfoKHR*>(structExtension),
+                reinterpret_cast<const VkVideoEncodeRateControlInfoKHR*>(structExtension2), onFail);
             break;
         }
 #endif
 #ifdef VK_KHR_synchronization2
-        case VK_STRUCTURE_TYPE_MEMORY_BARRIER_2_KHR:
-        {
-            checkEqual_VkMemoryBarrier2KHR(reinterpret_cast<const VkMemoryBarrier2KHR*>(structExtension), reinterpret_cast<const VkMemoryBarrier2KHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_MEMORY_BARRIER_2_KHR: {
+            checkEqual_VkMemoryBarrier2KHR(
+                reinterpret_cast<const VkMemoryBarrier2KHR*>(structExtension),
+                reinterpret_cast<const VkMemoryBarrier2KHR*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR:
-        {
-            checkEqual_VkPhysicalDeviceSynchronization2FeaturesKHR(reinterpret_cast<const VkPhysicalDeviceSynchronization2FeaturesKHR*>(structExtension), reinterpret_cast<const VkPhysicalDeviceSynchronization2FeaturesKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR: {
+            checkEqual_VkPhysicalDeviceSynchronization2FeaturesKHR(
+                reinterpret_cast<const VkPhysicalDeviceSynchronization2FeaturesKHR*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceSynchronization2FeaturesKHR*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_2_NV:
-        {
-            checkEqual_VkQueueFamilyCheckpointProperties2NV(reinterpret_cast<const VkQueueFamilyCheckpointProperties2NV*>(structExtension), reinterpret_cast<const VkQueueFamilyCheckpointProperties2NV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_2_NV: {
+            checkEqual_VkQueueFamilyCheckpointProperties2NV(
+                reinterpret_cast<const VkQueueFamilyCheckpointProperties2NV*>(structExtension),
+                reinterpret_cast<const VkQueueFamilyCheckpointProperties2NV*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_KHR_shader_subgroup_uniform_control_flow
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR:
-        {
-            checkEqual_VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR(reinterpret_cast<const VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR*>(structExtension), reinterpret_cast<const VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR: {
+            checkEqual_VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR(
+                reinterpret_cast<
+                    const VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR*>(
+                    structExtension),
+                reinterpret_cast<
+                    const VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_KHR_zero_initialize_workgroup_memory
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR:
-        {
-            checkEqual_VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR(reinterpret_cast<const VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR*>(structExtension), reinterpret_cast<const VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR: {
+            checkEqual_VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR(
+                reinterpret_cast<const VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_KHR_workgroup_memory_explicit_layout
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR:
-        {
-            checkEqual_VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR(reinterpret_cast<const VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR*>(structExtension), reinterpret_cast<const VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR: {
+            checkEqual_VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR(
+                reinterpret_cast<const VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_KHR_format_feature_flags2
-        case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR:
-        {
-            checkEqual_VkFormatProperties3KHR(reinterpret_cast<const VkFormatProperties3KHR*>(structExtension), reinterpret_cast<const VkFormatProperties3KHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR: {
+            checkEqual_VkFormatProperties3KHR(
+                reinterpret_cast<const VkFormatProperties3KHR*>(structExtension),
+                reinterpret_cast<const VkFormatProperties3KHR*>(structExtension2), onFail);
             break;
         }
 #endif
 #ifdef VK_KHR_maintenance4
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES_KHR:
-        {
-            checkEqual_VkPhysicalDeviceMaintenance4FeaturesKHR(reinterpret_cast<const VkPhysicalDeviceMaintenance4FeaturesKHR*>(structExtension), reinterpret_cast<const VkPhysicalDeviceMaintenance4FeaturesKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES_KHR: {
+            checkEqual_VkPhysicalDeviceMaintenance4FeaturesKHR(
+                reinterpret_cast<const VkPhysicalDeviceMaintenance4FeaturesKHR*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceMaintenance4FeaturesKHR*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES_KHR:
-        {
-            checkEqual_VkPhysicalDeviceMaintenance4PropertiesKHR(reinterpret_cast<const VkPhysicalDeviceMaintenance4PropertiesKHR*>(structExtension), reinterpret_cast<const VkPhysicalDeviceMaintenance4PropertiesKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES_KHR: {
+            checkEqual_VkPhysicalDeviceMaintenance4PropertiesKHR(
+                reinterpret_cast<const VkPhysicalDeviceMaintenance4PropertiesKHR*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceMaintenance4PropertiesKHR*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_ANDROID_native_buffer
-        case VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID:
-        {
-            checkEqual_VkNativeBufferANDROID(reinterpret_cast<const VkNativeBufferANDROID*>(structExtension), reinterpret_cast<const VkNativeBufferANDROID*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID: {
+            checkEqual_VkNativeBufferANDROID(
+                reinterpret_cast<const VkNativeBufferANDROID*>(structExtension),
+                reinterpret_cast<const VkNativeBufferANDROID*>(structExtension2), onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_debug_report
-        case VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT:
-        {
-            checkEqual_VkDebugReportCallbackCreateInfoEXT(reinterpret_cast<const VkDebugReportCallbackCreateInfoEXT*>(structExtension), reinterpret_cast<const VkDebugReportCallbackCreateInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT: {
+            checkEqual_VkDebugReportCallbackCreateInfoEXT(
+                reinterpret_cast<const VkDebugReportCallbackCreateInfoEXT*>(structExtension),
+                reinterpret_cast<const VkDebugReportCallbackCreateInfoEXT*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_AMD_rasterization_order
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD:
-        {
-            checkEqual_VkPipelineRasterizationStateRasterizationOrderAMD(reinterpret_cast<const VkPipelineRasterizationStateRasterizationOrderAMD*>(structExtension), reinterpret_cast<const VkPipelineRasterizationStateRasterizationOrderAMD*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD: {
+            checkEqual_VkPipelineRasterizationStateRasterizationOrderAMD(
+                reinterpret_cast<const VkPipelineRasterizationStateRasterizationOrderAMD*>(
+                    structExtension),
+                reinterpret_cast<const VkPipelineRasterizationStateRasterizationOrderAMD*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_NV_dedicated_allocation
-        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV:
-        {
-            checkEqual_VkDedicatedAllocationImageCreateInfoNV(reinterpret_cast<const VkDedicatedAllocationImageCreateInfoNV*>(structExtension), reinterpret_cast<const VkDedicatedAllocationImageCreateInfoNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV: {
+            checkEqual_VkDedicatedAllocationImageCreateInfoNV(
+                reinterpret_cast<const VkDedicatedAllocationImageCreateInfoNV*>(structExtension),
+                reinterpret_cast<const VkDedicatedAllocationImageCreateInfoNV*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV:
-        {
-            checkEqual_VkDedicatedAllocationBufferCreateInfoNV(reinterpret_cast<const VkDedicatedAllocationBufferCreateInfoNV*>(structExtension), reinterpret_cast<const VkDedicatedAllocationBufferCreateInfoNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV: {
+            checkEqual_VkDedicatedAllocationBufferCreateInfoNV(
+                reinterpret_cast<const VkDedicatedAllocationBufferCreateInfoNV*>(structExtension),
+                reinterpret_cast<const VkDedicatedAllocationBufferCreateInfoNV*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV:
-        {
-            checkEqual_VkDedicatedAllocationMemoryAllocateInfoNV(reinterpret_cast<const VkDedicatedAllocationMemoryAllocateInfoNV*>(structExtension), reinterpret_cast<const VkDedicatedAllocationMemoryAllocateInfoNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV: {
+            checkEqual_VkDedicatedAllocationMemoryAllocateInfoNV(
+                reinterpret_cast<const VkDedicatedAllocationMemoryAllocateInfoNV*>(structExtension),
+                reinterpret_cast<const VkDedicatedAllocationMemoryAllocateInfoNV*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_transform_feedback
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceTransformFeedbackFeaturesEXT(reinterpret_cast<const VkPhysicalDeviceTransformFeedbackFeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceTransformFeedbackFeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT: {
+            checkEqual_VkPhysicalDeviceTransformFeedbackFeaturesEXT(
+                reinterpret_cast<const VkPhysicalDeviceTransformFeedbackFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceTransformFeedbackFeaturesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceTransformFeedbackPropertiesEXT(reinterpret_cast<const VkPhysicalDeviceTransformFeedbackPropertiesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceTransformFeedbackPropertiesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT: {
+            checkEqual_VkPhysicalDeviceTransformFeedbackPropertiesEXT(
+                reinterpret_cast<const VkPhysicalDeviceTransformFeedbackPropertiesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceTransformFeedbackPropertiesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT:
-        {
-            checkEqual_VkPipelineRasterizationStateStreamCreateInfoEXT(reinterpret_cast<const VkPipelineRasterizationStateStreamCreateInfoEXT*>(structExtension), reinterpret_cast<const VkPipelineRasterizationStateStreamCreateInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT: {
+            checkEqual_VkPipelineRasterizationStateStreamCreateInfoEXT(
+                reinterpret_cast<const VkPipelineRasterizationStateStreamCreateInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPipelineRasterizationStateStreamCreateInfoEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_video_encode_h264
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_EXT:
-        {
-            checkEqual_VkVideoEncodeH264CapabilitiesEXT(reinterpret_cast<const VkVideoEncodeH264CapabilitiesEXT*>(structExtension), reinterpret_cast<const VkVideoEncodeH264CapabilitiesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_EXT: {
+            checkEqual_VkVideoEncodeH264CapabilitiesEXT(
+                reinterpret_cast<const VkVideoEncodeH264CapabilitiesEXT*>(structExtension),
+                reinterpret_cast<const VkVideoEncodeH264CapabilitiesEXT*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_CREATE_INFO_EXT:
-        {
-            checkEqual_VkVideoEncodeH264SessionCreateInfoEXT(reinterpret_cast<const VkVideoEncodeH264SessionCreateInfoEXT*>(structExtension), reinterpret_cast<const VkVideoEncodeH264SessionCreateInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_CREATE_INFO_EXT: {
+            checkEqual_VkVideoEncodeH264SessionCreateInfoEXT(
+                reinterpret_cast<const VkVideoEncodeH264SessionCreateInfoEXT*>(structExtension),
+                reinterpret_cast<const VkVideoEncodeH264SessionCreateInfoEXT*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
-            checkEqual_VkVideoEncodeH264SessionParametersAddInfoEXT(reinterpret_cast<const VkVideoEncodeH264SessionParametersAddInfoEXT*>(structExtension), reinterpret_cast<const VkVideoEncodeH264SessionParametersAddInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT: {
+            checkEqual_VkVideoEncodeH264SessionParametersAddInfoEXT(
+                reinterpret_cast<const VkVideoEncodeH264SessionParametersAddInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkVideoEncodeH264SessionParametersAddInfoEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
-            checkEqual_VkVideoEncodeH264SessionParametersCreateInfoEXT(reinterpret_cast<const VkVideoEncodeH264SessionParametersCreateInfoEXT*>(structExtension), reinterpret_cast<const VkVideoEncodeH264SessionParametersCreateInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT: {
+            checkEqual_VkVideoEncodeH264SessionParametersCreateInfoEXT(
+                reinterpret_cast<const VkVideoEncodeH264SessionParametersCreateInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkVideoEncodeH264SessionParametersCreateInfoEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_VCL_FRAME_INFO_EXT:
-        {
-            checkEqual_VkVideoEncodeH264VclFrameInfoEXT(reinterpret_cast<const VkVideoEncodeH264VclFrameInfoEXT*>(structExtension), reinterpret_cast<const VkVideoEncodeH264VclFrameInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_VCL_FRAME_INFO_EXT: {
+            checkEqual_VkVideoEncodeH264VclFrameInfoEXT(
+                reinterpret_cast<const VkVideoEncodeH264VclFrameInfoEXT*>(structExtension),
+                reinterpret_cast<const VkVideoEncodeH264VclFrameInfoEXT*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_EMIT_PICTURE_PARAMETERS_EXT:
-        {
-            checkEqual_VkVideoEncodeH264EmitPictureParametersEXT(reinterpret_cast<const VkVideoEncodeH264EmitPictureParametersEXT*>(structExtension), reinterpret_cast<const VkVideoEncodeH264EmitPictureParametersEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_EMIT_PICTURE_PARAMETERS_EXT: {
+            checkEqual_VkVideoEncodeH264EmitPictureParametersEXT(
+                reinterpret_cast<const VkVideoEncodeH264EmitPictureParametersEXT*>(structExtension),
+                reinterpret_cast<const VkVideoEncodeH264EmitPictureParametersEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_EXT:
-        {
-            checkEqual_VkVideoEncodeH264ProfileEXT(reinterpret_cast<const VkVideoEncodeH264ProfileEXT*>(structExtension), reinterpret_cast<const VkVideoEncodeH264ProfileEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_EXT: {
+            checkEqual_VkVideoEncodeH264ProfileEXT(
+                reinterpret_cast<const VkVideoEncodeH264ProfileEXT*>(structExtension),
+                reinterpret_cast<const VkVideoEncodeH264ProfileEXT*>(structExtension2), onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_video_encode_h265
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_EXT:
-        {
-            checkEqual_VkVideoEncodeH265CapabilitiesEXT(reinterpret_cast<const VkVideoEncodeH265CapabilitiesEXT*>(structExtension), reinterpret_cast<const VkVideoEncodeH265CapabilitiesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_EXT: {
+            checkEqual_VkVideoEncodeH265CapabilitiesEXT(
+                reinterpret_cast<const VkVideoEncodeH265CapabilitiesEXT*>(structExtension),
+                reinterpret_cast<const VkVideoEncodeH265CapabilitiesEXT*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_CREATE_INFO_EXT:
-        {
-            checkEqual_VkVideoEncodeH265SessionCreateInfoEXT(reinterpret_cast<const VkVideoEncodeH265SessionCreateInfoEXT*>(structExtension), reinterpret_cast<const VkVideoEncodeH265SessionCreateInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_CREATE_INFO_EXT: {
+            checkEqual_VkVideoEncodeH265SessionCreateInfoEXT(
+                reinterpret_cast<const VkVideoEncodeH265SessionCreateInfoEXT*>(structExtension),
+                reinterpret_cast<const VkVideoEncodeH265SessionCreateInfoEXT*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
-            checkEqual_VkVideoEncodeH265SessionParametersAddInfoEXT(reinterpret_cast<const VkVideoEncodeH265SessionParametersAddInfoEXT*>(structExtension), reinterpret_cast<const VkVideoEncodeH265SessionParametersAddInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT: {
+            checkEqual_VkVideoEncodeH265SessionParametersAddInfoEXT(
+                reinterpret_cast<const VkVideoEncodeH265SessionParametersAddInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkVideoEncodeH265SessionParametersAddInfoEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
-            checkEqual_VkVideoEncodeH265SessionParametersCreateInfoEXT(reinterpret_cast<const VkVideoEncodeH265SessionParametersCreateInfoEXT*>(structExtension), reinterpret_cast<const VkVideoEncodeH265SessionParametersCreateInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT: {
+            checkEqual_VkVideoEncodeH265SessionParametersCreateInfoEXT(
+                reinterpret_cast<const VkVideoEncodeH265SessionParametersCreateInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkVideoEncodeH265SessionParametersCreateInfoEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_VCL_FRAME_INFO_EXT:
-        {
-            checkEqual_VkVideoEncodeH265VclFrameInfoEXT(reinterpret_cast<const VkVideoEncodeH265VclFrameInfoEXT*>(structExtension), reinterpret_cast<const VkVideoEncodeH265VclFrameInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_VCL_FRAME_INFO_EXT: {
+            checkEqual_VkVideoEncodeH265VclFrameInfoEXT(
+                reinterpret_cast<const VkVideoEncodeH265VclFrameInfoEXT*>(structExtension),
+                reinterpret_cast<const VkVideoEncodeH265VclFrameInfoEXT*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_EMIT_PICTURE_PARAMETERS_EXT:
-        {
-            checkEqual_VkVideoEncodeH265EmitPictureParametersEXT(reinterpret_cast<const VkVideoEncodeH265EmitPictureParametersEXT*>(structExtension), reinterpret_cast<const VkVideoEncodeH265EmitPictureParametersEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_EMIT_PICTURE_PARAMETERS_EXT: {
+            checkEqual_VkVideoEncodeH265EmitPictureParametersEXT(
+                reinterpret_cast<const VkVideoEncodeH265EmitPictureParametersEXT*>(structExtension),
+                reinterpret_cast<const VkVideoEncodeH265EmitPictureParametersEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_EXT:
-        {
-            checkEqual_VkVideoEncodeH265ProfileEXT(reinterpret_cast<const VkVideoEncodeH265ProfileEXT*>(structExtension), reinterpret_cast<const VkVideoEncodeH265ProfileEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_EXT: {
+            checkEqual_VkVideoEncodeH265ProfileEXT(
+                reinterpret_cast<const VkVideoEncodeH265ProfileEXT*>(structExtension),
+                reinterpret_cast<const VkVideoEncodeH265ProfileEXT*>(structExtension2), onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_video_decode_h264
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_EXT:
-        {
-            checkEqual_VkVideoDecodeH264ProfileEXT(reinterpret_cast<const VkVideoDecodeH264ProfileEXT*>(structExtension), reinterpret_cast<const VkVideoDecodeH264ProfileEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_EXT: {
+            checkEqual_VkVideoDecodeH264ProfileEXT(
+                reinterpret_cast<const VkVideoDecodeH264ProfileEXT*>(structExtension),
+                reinterpret_cast<const VkVideoDecodeH264ProfileEXT*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT:
-        {
-            checkEqual_VkVideoDecodeH264CapabilitiesEXT(reinterpret_cast<const VkVideoDecodeH264CapabilitiesEXT*>(structExtension), reinterpret_cast<const VkVideoDecodeH264CapabilitiesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT: {
+            checkEqual_VkVideoDecodeH264CapabilitiesEXT(
+                reinterpret_cast<const VkVideoDecodeH264CapabilitiesEXT*>(structExtension),
+                reinterpret_cast<const VkVideoDecodeH264CapabilitiesEXT*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_CREATE_INFO_EXT:
-        {
-            checkEqual_VkVideoDecodeH264SessionCreateInfoEXT(reinterpret_cast<const VkVideoDecodeH264SessionCreateInfoEXT*>(structExtension), reinterpret_cast<const VkVideoDecodeH264SessionCreateInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_CREATE_INFO_EXT: {
+            checkEqual_VkVideoDecodeH264SessionCreateInfoEXT(
+                reinterpret_cast<const VkVideoDecodeH264SessionCreateInfoEXT*>(structExtension),
+                reinterpret_cast<const VkVideoDecodeH264SessionCreateInfoEXT*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
-            checkEqual_VkVideoDecodeH264SessionParametersAddInfoEXT(reinterpret_cast<const VkVideoDecodeH264SessionParametersAddInfoEXT*>(structExtension), reinterpret_cast<const VkVideoDecodeH264SessionParametersAddInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT: {
+            checkEqual_VkVideoDecodeH264SessionParametersAddInfoEXT(
+                reinterpret_cast<const VkVideoDecodeH264SessionParametersAddInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkVideoDecodeH264SessionParametersAddInfoEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
-            checkEqual_VkVideoDecodeH264SessionParametersCreateInfoEXT(reinterpret_cast<const VkVideoDecodeH264SessionParametersCreateInfoEXT*>(structExtension), reinterpret_cast<const VkVideoDecodeH264SessionParametersCreateInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT: {
+            checkEqual_VkVideoDecodeH264SessionParametersCreateInfoEXT(
+                reinterpret_cast<const VkVideoDecodeH264SessionParametersCreateInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkVideoDecodeH264SessionParametersCreateInfoEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT:
-        {
-            checkEqual_VkVideoDecodeH264PictureInfoEXT(reinterpret_cast<const VkVideoDecodeH264PictureInfoEXT*>(structExtension), reinterpret_cast<const VkVideoDecodeH264PictureInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT: {
+            checkEqual_VkVideoDecodeH264PictureInfoEXT(
+                reinterpret_cast<const VkVideoDecodeH264PictureInfoEXT*>(structExtension),
+                reinterpret_cast<const VkVideoDecodeH264PictureInfoEXT*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_MVC_EXT:
-        {
-            checkEqual_VkVideoDecodeH264MvcEXT(reinterpret_cast<const VkVideoDecodeH264MvcEXT*>(structExtension), reinterpret_cast<const VkVideoDecodeH264MvcEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_MVC_EXT: {
+            checkEqual_VkVideoDecodeH264MvcEXT(
+                reinterpret_cast<const VkVideoDecodeH264MvcEXT*>(structExtension),
+                reinterpret_cast<const VkVideoDecodeH264MvcEXT*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT:
-        {
-            checkEqual_VkVideoDecodeH264DpbSlotInfoEXT(reinterpret_cast<const VkVideoDecodeH264DpbSlotInfoEXT*>(structExtension), reinterpret_cast<const VkVideoDecodeH264DpbSlotInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT: {
+            checkEqual_VkVideoDecodeH264DpbSlotInfoEXT(
+                reinterpret_cast<const VkVideoDecodeH264DpbSlotInfoEXT*>(structExtension),
+                reinterpret_cast<const VkVideoDecodeH264DpbSlotInfoEXT*>(structExtension2), onFail);
             break;
         }
 #endif
 #ifdef VK_AMD_texture_gather_bias_lod
-        case VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD:
-        {
-            checkEqual_VkTextureLODGatherFormatPropertiesAMD(reinterpret_cast<const VkTextureLODGatherFormatPropertiesAMD*>(structExtension), reinterpret_cast<const VkTextureLODGatherFormatPropertiesAMD*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD: {
+            checkEqual_VkTextureLODGatherFormatPropertiesAMD(
+                reinterpret_cast<const VkTextureLODGatherFormatPropertiesAMD*>(structExtension),
+                reinterpret_cast<const VkTextureLODGatherFormatPropertiesAMD*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_NV_corner_sampled_image
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV:
-        {
-            checkEqual_VkPhysicalDeviceCornerSampledImageFeaturesNV(reinterpret_cast<const VkPhysicalDeviceCornerSampledImageFeaturesNV*>(structExtension), reinterpret_cast<const VkPhysicalDeviceCornerSampledImageFeaturesNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV: {
+            checkEqual_VkPhysicalDeviceCornerSampledImageFeaturesNV(
+                reinterpret_cast<const VkPhysicalDeviceCornerSampledImageFeaturesNV*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceCornerSampledImageFeaturesNV*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_NV_external_memory
-        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV:
-        {
-            checkEqual_VkExternalMemoryImageCreateInfoNV(reinterpret_cast<const VkExternalMemoryImageCreateInfoNV*>(structExtension), reinterpret_cast<const VkExternalMemoryImageCreateInfoNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV: {
+            checkEqual_VkExternalMemoryImageCreateInfoNV(
+                reinterpret_cast<const VkExternalMemoryImageCreateInfoNV*>(structExtension),
+                reinterpret_cast<const VkExternalMemoryImageCreateInfoNV*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV:
-        {
-            checkEqual_VkExportMemoryAllocateInfoNV(reinterpret_cast<const VkExportMemoryAllocateInfoNV*>(structExtension), reinterpret_cast<const VkExportMemoryAllocateInfoNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV: {
+            checkEqual_VkExportMemoryAllocateInfoNV(
+                reinterpret_cast<const VkExportMemoryAllocateInfoNV*>(structExtension),
+                reinterpret_cast<const VkExportMemoryAllocateInfoNV*>(structExtension2), onFail);
             break;
         }
 #endif
 #ifdef VK_NV_external_memory_win32
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV:
-        {
-            checkEqual_VkImportMemoryWin32HandleInfoNV(reinterpret_cast<const VkImportMemoryWin32HandleInfoNV*>(structExtension), reinterpret_cast<const VkImportMemoryWin32HandleInfoNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV: {
+            checkEqual_VkImportMemoryWin32HandleInfoNV(
+                reinterpret_cast<const VkImportMemoryWin32HandleInfoNV*>(structExtension),
+                reinterpret_cast<const VkImportMemoryWin32HandleInfoNV*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV:
-        {
-            checkEqual_VkExportMemoryWin32HandleInfoNV(reinterpret_cast<const VkExportMemoryWin32HandleInfoNV*>(structExtension), reinterpret_cast<const VkExportMemoryWin32HandleInfoNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV: {
+            checkEqual_VkExportMemoryWin32HandleInfoNV(
+                reinterpret_cast<const VkExportMemoryWin32HandleInfoNV*>(structExtension),
+                reinterpret_cast<const VkExportMemoryWin32HandleInfoNV*>(structExtension2), onFail);
             break;
         }
 #endif
 #ifdef VK_NV_win32_keyed_mutex
-        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV:
-        {
-            checkEqual_VkWin32KeyedMutexAcquireReleaseInfoNV(reinterpret_cast<const VkWin32KeyedMutexAcquireReleaseInfoNV*>(structExtension), reinterpret_cast<const VkWin32KeyedMutexAcquireReleaseInfoNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV: {
+            checkEqual_VkWin32KeyedMutexAcquireReleaseInfoNV(
+                reinterpret_cast<const VkWin32KeyedMutexAcquireReleaseInfoNV*>(structExtension),
+                reinterpret_cast<const VkWin32KeyedMutexAcquireReleaseInfoNV*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_validation_flags
-        case VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT:
-        {
-            checkEqual_VkValidationFlagsEXT(reinterpret_cast<const VkValidationFlagsEXT*>(structExtension), reinterpret_cast<const VkValidationFlagsEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT: {
+            checkEqual_VkValidationFlagsEXT(
+                reinterpret_cast<const VkValidationFlagsEXT*>(structExtension),
+                reinterpret_cast<const VkValidationFlagsEXT*>(structExtension2), onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_texture_compression_astc_hdr
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(reinterpret_cast<const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT: {
+            checkEqual_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(
+                reinterpret_cast<const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_astc_decode_mode
-        case VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT:
-        {
-            checkEqual_VkImageViewASTCDecodeModeEXT(reinterpret_cast<const VkImageViewASTCDecodeModeEXT*>(structExtension), reinterpret_cast<const VkImageViewASTCDecodeModeEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT: {
+            checkEqual_VkImageViewASTCDecodeModeEXT(
+                reinterpret_cast<const VkImageViewASTCDecodeModeEXT*>(structExtension),
+                reinterpret_cast<const VkImageViewASTCDecodeModeEXT*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceASTCDecodeFeaturesEXT(reinterpret_cast<const VkPhysicalDeviceASTCDecodeFeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceASTCDecodeFeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT: {
+            checkEqual_VkPhysicalDeviceASTCDecodeFeaturesEXT(
+                reinterpret_cast<const VkPhysicalDeviceASTCDecodeFeaturesEXT*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceASTCDecodeFeaturesEXT*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_conditional_rendering
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceConditionalRenderingFeaturesEXT(reinterpret_cast<const VkPhysicalDeviceConditionalRenderingFeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceConditionalRenderingFeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT: {
+            checkEqual_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
+                reinterpret_cast<const VkPhysicalDeviceConditionalRenderingFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceConditionalRenderingFeaturesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT:
-        {
-            checkEqual_VkCommandBufferInheritanceConditionalRenderingInfoEXT(reinterpret_cast<const VkCommandBufferInheritanceConditionalRenderingInfoEXT*>(structExtension), reinterpret_cast<const VkCommandBufferInheritanceConditionalRenderingInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT: {
+            checkEqual_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
+                reinterpret_cast<const VkCommandBufferInheritanceConditionalRenderingInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkCommandBufferInheritanceConditionalRenderingInfoEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_NV_clip_space_w_scaling
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV:
-        {
-            checkEqual_VkPipelineViewportWScalingStateCreateInfoNV(reinterpret_cast<const VkPipelineViewportWScalingStateCreateInfoNV*>(structExtension), reinterpret_cast<const VkPipelineViewportWScalingStateCreateInfoNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV: {
+            checkEqual_VkPipelineViewportWScalingStateCreateInfoNV(
+                reinterpret_cast<const VkPipelineViewportWScalingStateCreateInfoNV*>(
+                    structExtension),
+                reinterpret_cast<const VkPipelineViewportWScalingStateCreateInfoNV*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_display_control
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT:
-        {
-            checkEqual_VkSwapchainCounterCreateInfoEXT(reinterpret_cast<const VkSwapchainCounterCreateInfoEXT*>(structExtension), reinterpret_cast<const VkSwapchainCounterCreateInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT: {
+            checkEqual_VkSwapchainCounterCreateInfoEXT(
+                reinterpret_cast<const VkSwapchainCounterCreateInfoEXT*>(structExtension),
+                reinterpret_cast<const VkSwapchainCounterCreateInfoEXT*>(structExtension2), onFail);
             break;
         }
 #endif
 #ifdef VK_GOOGLE_display_timing
-        case VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE:
-        {
-            checkEqual_VkPresentTimesInfoGOOGLE(reinterpret_cast<const VkPresentTimesInfoGOOGLE*>(structExtension), reinterpret_cast<const VkPresentTimesInfoGOOGLE*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE: {
+            checkEqual_VkPresentTimesInfoGOOGLE(
+                reinterpret_cast<const VkPresentTimesInfoGOOGLE*>(structExtension),
+                reinterpret_cast<const VkPresentTimesInfoGOOGLE*>(structExtension2), onFail);
             break;
         }
 #endif
 #ifdef VK_NVX_multiview_per_view_attributes
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX:
-        {
-            checkEqual_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(reinterpret_cast<const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX*>(structExtension), reinterpret_cast<const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX: {
+            checkEqual_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
+                reinterpret_cast<const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_NV_viewport_swizzle
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV:
-        {
-            checkEqual_VkPipelineViewportSwizzleStateCreateInfoNV(reinterpret_cast<const VkPipelineViewportSwizzleStateCreateInfoNV*>(structExtension), reinterpret_cast<const VkPipelineViewportSwizzleStateCreateInfoNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV: {
+            checkEqual_VkPipelineViewportSwizzleStateCreateInfoNV(
+                reinterpret_cast<const VkPipelineViewportSwizzleStateCreateInfoNV*>(
+                    structExtension),
+                reinterpret_cast<const VkPipelineViewportSwizzleStateCreateInfoNV*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_discard_rectangles
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceDiscardRectanglePropertiesEXT(reinterpret_cast<const VkPhysicalDeviceDiscardRectanglePropertiesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceDiscardRectanglePropertiesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT: {
+            checkEqual_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
+                reinterpret_cast<const VkPhysicalDeviceDiscardRectanglePropertiesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceDiscardRectanglePropertiesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT:
-        {
-            checkEqual_VkPipelineDiscardRectangleStateCreateInfoEXT(reinterpret_cast<const VkPipelineDiscardRectangleStateCreateInfoEXT*>(structExtension), reinterpret_cast<const VkPipelineDiscardRectangleStateCreateInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT: {
+            checkEqual_VkPipelineDiscardRectangleStateCreateInfoEXT(
+                reinterpret_cast<const VkPipelineDiscardRectangleStateCreateInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPipelineDiscardRectangleStateCreateInfoEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_conservative_rasterization
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(reinterpret_cast<const VkPhysicalDeviceConservativeRasterizationPropertiesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceConservativeRasterizationPropertiesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT: {
+            checkEqual_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
+                reinterpret_cast<const VkPhysicalDeviceConservativeRasterizationPropertiesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceConservativeRasterizationPropertiesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT:
-        {
-            checkEqual_VkPipelineRasterizationConservativeStateCreateInfoEXT(reinterpret_cast<const VkPipelineRasterizationConservativeStateCreateInfoEXT*>(structExtension), reinterpret_cast<const VkPipelineRasterizationConservativeStateCreateInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT: {
+            checkEqual_VkPipelineRasterizationConservativeStateCreateInfoEXT(
+                reinterpret_cast<const VkPipelineRasterizationConservativeStateCreateInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPipelineRasterizationConservativeStateCreateInfoEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_depth_clip_enable
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceDepthClipEnableFeaturesEXT(reinterpret_cast<const VkPhysicalDeviceDepthClipEnableFeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceDepthClipEnableFeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT: {
+            checkEqual_VkPhysicalDeviceDepthClipEnableFeaturesEXT(
+                reinterpret_cast<const VkPhysicalDeviceDepthClipEnableFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceDepthClipEnableFeaturesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT:
-        {
-            checkEqual_VkPipelineRasterizationDepthClipStateCreateInfoEXT(reinterpret_cast<const VkPipelineRasterizationDepthClipStateCreateInfoEXT*>(structExtension), reinterpret_cast<const VkPipelineRasterizationDepthClipStateCreateInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT: {
+            checkEqual_VkPipelineRasterizationDepthClipStateCreateInfoEXT(
+                reinterpret_cast<const VkPipelineRasterizationDepthClipStateCreateInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPipelineRasterizationDepthClipStateCreateInfoEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_debug_utils
-        case VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT:
-        {
-            checkEqual_VkDebugUtilsMessengerCreateInfoEXT(reinterpret_cast<const VkDebugUtilsMessengerCreateInfoEXT*>(structExtension), reinterpret_cast<const VkDebugUtilsMessengerCreateInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT: {
+            checkEqual_VkDebugUtilsMessengerCreateInfoEXT(
+                reinterpret_cast<const VkDebugUtilsMessengerCreateInfoEXT*>(structExtension),
+                reinterpret_cast<const VkDebugUtilsMessengerCreateInfoEXT*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
-        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID:
-        {
-            checkEqual_VkAndroidHardwareBufferUsageANDROID(reinterpret_cast<const VkAndroidHardwareBufferUsageANDROID*>(structExtension), reinterpret_cast<const VkAndroidHardwareBufferUsageANDROID*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID: {
+            checkEqual_VkAndroidHardwareBufferUsageANDROID(
+                reinterpret_cast<const VkAndroidHardwareBufferUsageANDROID*>(structExtension),
+                reinterpret_cast<const VkAndroidHardwareBufferUsageANDROID*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID:
-        {
-            checkEqual_VkAndroidHardwareBufferFormatPropertiesANDROID(reinterpret_cast<const VkAndroidHardwareBufferFormatPropertiesANDROID*>(structExtension), reinterpret_cast<const VkAndroidHardwareBufferFormatPropertiesANDROID*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID: {
+            checkEqual_VkAndroidHardwareBufferFormatPropertiesANDROID(
+                reinterpret_cast<const VkAndroidHardwareBufferFormatPropertiesANDROID*>(
+                    structExtension),
+                reinterpret_cast<const VkAndroidHardwareBufferFormatPropertiesANDROID*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID:
-        {
-            checkEqual_VkImportAndroidHardwareBufferInfoANDROID(reinterpret_cast<const VkImportAndroidHardwareBufferInfoANDROID*>(structExtension), reinterpret_cast<const VkImportAndroidHardwareBufferInfoANDROID*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID: {
+            checkEqual_VkImportAndroidHardwareBufferInfoANDROID(
+                reinterpret_cast<const VkImportAndroidHardwareBufferInfoANDROID*>(structExtension),
+                reinterpret_cast<const VkImportAndroidHardwareBufferInfoANDROID*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID:
-        {
-            checkEqual_VkExternalFormatANDROID(reinterpret_cast<const VkExternalFormatANDROID*>(structExtension), reinterpret_cast<const VkExternalFormatANDROID*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID: {
+            checkEqual_VkExternalFormatANDROID(
+                reinterpret_cast<const VkExternalFormatANDROID*>(structExtension),
+                reinterpret_cast<const VkExternalFormatANDROID*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_2_ANDROID:
-        {
-            checkEqual_VkAndroidHardwareBufferFormatProperties2ANDROID(reinterpret_cast<const VkAndroidHardwareBufferFormatProperties2ANDROID*>(structExtension), reinterpret_cast<const VkAndroidHardwareBufferFormatProperties2ANDROID*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_2_ANDROID: {
+            checkEqual_VkAndroidHardwareBufferFormatProperties2ANDROID(
+                reinterpret_cast<const VkAndroidHardwareBufferFormatProperties2ANDROID*>(
+                    structExtension),
+                reinterpret_cast<const VkAndroidHardwareBufferFormatProperties2ANDROID*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_inline_uniform_block
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(reinterpret_cast<const VkPhysicalDeviceInlineUniformBlockFeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceInlineUniformBlockFeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT: {
+            checkEqual_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(
+                reinterpret_cast<const VkPhysicalDeviceInlineUniformBlockFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceInlineUniformBlockFeaturesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(reinterpret_cast<const VkPhysicalDeviceInlineUniformBlockPropertiesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceInlineUniformBlockPropertiesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT: {
+            checkEqual_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(
+                reinterpret_cast<const VkPhysicalDeviceInlineUniformBlockPropertiesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceInlineUniformBlockPropertiesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT:
-        {
-            checkEqual_VkWriteDescriptorSetInlineUniformBlockEXT(reinterpret_cast<const VkWriteDescriptorSetInlineUniformBlockEXT*>(structExtension), reinterpret_cast<const VkWriteDescriptorSetInlineUniformBlockEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT: {
+            checkEqual_VkWriteDescriptorSetInlineUniformBlockEXT(
+                reinterpret_cast<const VkWriteDescriptorSetInlineUniformBlockEXT*>(structExtension),
+                reinterpret_cast<const VkWriteDescriptorSetInlineUniformBlockEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT:
-        {
-            checkEqual_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(reinterpret_cast<const VkDescriptorPoolInlineUniformBlockCreateInfoEXT*>(structExtension), reinterpret_cast<const VkDescriptorPoolInlineUniformBlockCreateInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT: {
+            checkEqual_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(
+                reinterpret_cast<const VkDescriptorPoolInlineUniformBlockCreateInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkDescriptorPoolInlineUniformBlockCreateInfoEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_sample_locations
-        case VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT:
-        {
-            checkEqual_VkSampleLocationsInfoEXT(reinterpret_cast<const VkSampleLocationsInfoEXT*>(structExtension), reinterpret_cast<const VkSampleLocationsInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT: {
+            checkEqual_VkSampleLocationsInfoEXT(
+                reinterpret_cast<const VkSampleLocationsInfoEXT*>(structExtension),
+                reinterpret_cast<const VkSampleLocationsInfoEXT*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT:
-        {
-            checkEqual_VkRenderPassSampleLocationsBeginInfoEXT(reinterpret_cast<const VkRenderPassSampleLocationsBeginInfoEXT*>(structExtension), reinterpret_cast<const VkRenderPassSampleLocationsBeginInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT: {
+            checkEqual_VkRenderPassSampleLocationsBeginInfoEXT(
+                reinterpret_cast<const VkRenderPassSampleLocationsBeginInfoEXT*>(structExtension),
+                reinterpret_cast<const VkRenderPassSampleLocationsBeginInfoEXT*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT:
-        {
-            checkEqual_VkPipelineSampleLocationsStateCreateInfoEXT(reinterpret_cast<const VkPipelineSampleLocationsStateCreateInfoEXT*>(structExtension), reinterpret_cast<const VkPipelineSampleLocationsStateCreateInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT: {
+            checkEqual_VkPipelineSampleLocationsStateCreateInfoEXT(
+                reinterpret_cast<const VkPipelineSampleLocationsStateCreateInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPipelineSampleLocationsStateCreateInfoEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceSampleLocationsPropertiesEXT(reinterpret_cast<const VkPhysicalDeviceSampleLocationsPropertiesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceSampleLocationsPropertiesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT: {
+            checkEqual_VkPhysicalDeviceSampleLocationsPropertiesEXT(
+                reinterpret_cast<const VkPhysicalDeviceSampleLocationsPropertiesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceSampleLocationsPropertiesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_blend_operation_advanced
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT: {
+            checkEqual_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
+                reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT: {
+            checkEqual_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
+                reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT:
-        {
-            checkEqual_VkPipelineColorBlendAdvancedStateCreateInfoEXT(reinterpret_cast<const VkPipelineColorBlendAdvancedStateCreateInfoEXT*>(structExtension), reinterpret_cast<const VkPipelineColorBlendAdvancedStateCreateInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT: {
+            checkEqual_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
+                reinterpret_cast<const VkPipelineColorBlendAdvancedStateCreateInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPipelineColorBlendAdvancedStateCreateInfoEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_NV_fragment_coverage_to_color
-        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV:
-        {
-            checkEqual_VkPipelineCoverageToColorStateCreateInfoNV(reinterpret_cast<const VkPipelineCoverageToColorStateCreateInfoNV*>(structExtension), reinterpret_cast<const VkPipelineCoverageToColorStateCreateInfoNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV: {
+            checkEqual_VkPipelineCoverageToColorStateCreateInfoNV(
+                reinterpret_cast<const VkPipelineCoverageToColorStateCreateInfoNV*>(
+                    structExtension),
+                reinterpret_cast<const VkPipelineCoverageToColorStateCreateInfoNV*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_NV_framebuffer_mixed_samples
-        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV:
-        {
-            checkEqual_VkPipelineCoverageModulationStateCreateInfoNV(reinterpret_cast<const VkPipelineCoverageModulationStateCreateInfoNV*>(structExtension), reinterpret_cast<const VkPipelineCoverageModulationStateCreateInfoNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV: {
+            checkEqual_VkPipelineCoverageModulationStateCreateInfoNV(
+                reinterpret_cast<const VkPipelineCoverageModulationStateCreateInfoNV*>(
+                    structExtension),
+                reinterpret_cast<const VkPipelineCoverageModulationStateCreateInfoNV*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_NV_shader_sm_builtins
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV:
-        {
-            checkEqual_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(reinterpret_cast<const VkPhysicalDeviceShaderSMBuiltinsPropertiesNV*>(structExtension), reinterpret_cast<const VkPhysicalDeviceShaderSMBuiltinsPropertiesNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV: {
+            checkEqual_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(
+                reinterpret_cast<const VkPhysicalDeviceShaderSMBuiltinsPropertiesNV*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceShaderSMBuiltinsPropertiesNV*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV:
-        {
-            checkEqual_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(reinterpret_cast<const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV*>(structExtension), reinterpret_cast<const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV: {
+            checkEqual_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(
+                reinterpret_cast<const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_image_drm_format_modifier
-        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT:
-        {
-            checkEqual_VkDrmFormatModifierPropertiesListEXT(reinterpret_cast<const VkDrmFormatModifierPropertiesListEXT*>(structExtension), reinterpret_cast<const VkDrmFormatModifierPropertiesListEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT: {
+            checkEqual_VkDrmFormatModifierPropertiesListEXT(
+                reinterpret_cast<const VkDrmFormatModifierPropertiesListEXT*>(structExtension),
+                reinterpret_cast<const VkDrmFormatModifierPropertiesListEXT*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT:
-        {
-            checkEqual_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(reinterpret_cast<const VkPhysicalDeviceImageDrmFormatModifierInfoEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceImageDrmFormatModifierInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT: {
+            checkEqual_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(
+                reinterpret_cast<const VkPhysicalDeviceImageDrmFormatModifierInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceImageDrmFormatModifierInfoEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT:
-        {
-            checkEqual_VkImageDrmFormatModifierListCreateInfoEXT(reinterpret_cast<const VkImageDrmFormatModifierListCreateInfoEXT*>(structExtension), reinterpret_cast<const VkImageDrmFormatModifierListCreateInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT: {
+            checkEqual_VkImageDrmFormatModifierListCreateInfoEXT(
+                reinterpret_cast<const VkImageDrmFormatModifierListCreateInfoEXT*>(structExtension),
+                reinterpret_cast<const VkImageDrmFormatModifierListCreateInfoEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT:
-        {
-            checkEqual_VkImageDrmFormatModifierExplicitCreateInfoEXT(reinterpret_cast<const VkImageDrmFormatModifierExplicitCreateInfoEXT*>(structExtension), reinterpret_cast<const VkImageDrmFormatModifierExplicitCreateInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT: {
+            checkEqual_VkImageDrmFormatModifierExplicitCreateInfoEXT(
+                reinterpret_cast<const VkImageDrmFormatModifierExplicitCreateInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkImageDrmFormatModifierExplicitCreateInfoEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_2_EXT:
-        {
-            checkEqual_VkDrmFormatModifierPropertiesList2EXT(reinterpret_cast<const VkDrmFormatModifierPropertiesList2EXT*>(structExtension), reinterpret_cast<const VkDrmFormatModifierPropertiesList2EXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_2_EXT: {
+            checkEqual_VkDrmFormatModifierPropertiesList2EXT(
+                reinterpret_cast<const VkDrmFormatModifierPropertiesList2EXT*>(structExtension),
+                reinterpret_cast<const VkDrmFormatModifierPropertiesList2EXT*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_validation_cache
-        case VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT:
-        {
-            checkEqual_VkShaderModuleValidationCacheCreateInfoEXT(reinterpret_cast<const VkShaderModuleValidationCacheCreateInfoEXT*>(structExtension), reinterpret_cast<const VkShaderModuleValidationCacheCreateInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT: {
+            checkEqual_VkShaderModuleValidationCacheCreateInfoEXT(
+                reinterpret_cast<const VkShaderModuleValidationCacheCreateInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkShaderModuleValidationCacheCreateInfoEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_NV_shading_rate_image
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV:
-        {
-            checkEqual_VkPipelineViewportShadingRateImageStateCreateInfoNV(reinterpret_cast<const VkPipelineViewportShadingRateImageStateCreateInfoNV*>(structExtension), reinterpret_cast<const VkPipelineViewportShadingRateImageStateCreateInfoNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV: {
+            checkEqual_VkPipelineViewportShadingRateImageStateCreateInfoNV(
+                reinterpret_cast<const VkPipelineViewportShadingRateImageStateCreateInfoNV*>(
+                    structExtension),
+                reinterpret_cast<const VkPipelineViewportShadingRateImageStateCreateInfoNV*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV:
-        {
-            checkEqual_VkPhysicalDeviceShadingRateImageFeaturesNV(reinterpret_cast<const VkPhysicalDeviceShadingRateImageFeaturesNV*>(structExtension), reinterpret_cast<const VkPhysicalDeviceShadingRateImageFeaturesNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV: {
+            checkEqual_VkPhysicalDeviceShadingRateImageFeaturesNV(
+                reinterpret_cast<const VkPhysicalDeviceShadingRateImageFeaturesNV*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceShadingRateImageFeaturesNV*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV:
-        {
-            checkEqual_VkPhysicalDeviceShadingRateImagePropertiesNV(reinterpret_cast<const VkPhysicalDeviceShadingRateImagePropertiesNV*>(structExtension), reinterpret_cast<const VkPhysicalDeviceShadingRateImagePropertiesNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV: {
+            checkEqual_VkPhysicalDeviceShadingRateImagePropertiesNV(
+                reinterpret_cast<const VkPhysicalDeviceShadingRateImagePropertiesNV*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceShadingRateImagePropertiesNV*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV:
-        {
-            checkEqual_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(reinterpret_cast<const VkPipelineViewportCoarseSampleOrderStateCreateInfoNV*>(structExtension), reinterpret_cast<const VkPipelineViewportCoarseSampleOrderStateCreateInfoNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV: {
+            checkEqual_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(
+                reinterpret_cast<const VkPipelineViewportCoarseSampleOrderStateCreateInfoNV*>(
+                    structExtension),
+                reinterpret_cast<const VkPipelineViewportCoarseSampleOrderStateCreateInfoNV*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_NV_ray_tracing
-        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV:
-        {
-            checkEqual_VkWriteDescriptorSetAccelerationStructureNV(reinterpret_cast<const VkWriteDescriptorSetAccelerationStructureNV*>(structExtension), reinterpret_cast<const VkWriteDescriptorSetAccelerationStructureNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV: {
+            checkEqual_VkWriteDescriptorSetAccelerationStructureNV(
+                reinterpret_cast<const VkWriteDescriptorSetAccelerationStructureNV*>(
+                    structExtension),
+                reinterpret_cast<const VkWriteDescriptorSetAccelerationStructureNV*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV:
-        {
-            checkEqual_VkPhysicalDeviceRayTracingPropertiesNV(reinterpret_cast<const VkPhysicalDeviceRayTracingPropertiesNV*>(structExtension), reinterpret_cast<const VkPhysicalDeviceRayTracingPropertiesNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV: {
+            checkEqual_VkPhysicalDeviceRayTracingPropertiesNV(
+                reinterpret_cast<const VkPhysicalDeviceRayTracingPropertiesNV*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceRayTracingPropertiesNV*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_NV_representative_fragment_test
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV:
-        {
-            checkEqual_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(reinterpret_cast<const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV*>(structExtension), reinterpret_cast<const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV: {
+            checkEqual_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(
+                reinterpret_cast<const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV:
-        {
-            checkEqual_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(reinterpret_cast<const VkPipelineRepresentativeFragmentTestStateCreateInfoNV*>(structExtension), reinterpret_cast<const VkPipelineRepresentativeFragmentTestStateCreateInfoNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV: {
+            checkEqual_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(
+                reinterpret_cast<const VkPipelineRepresentativeFragmentTestStateCreateInfoNV*>(
+                    structExtension),
+                reinterpret_cast<const VkPipelineRepresentativeFragmentTestStateCreateInfoNV*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_filter_cubic
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT:
-        {
-            checkEqual_VkPhysicalDeviceImageViewImageFormatInfoEXT(reinterpret_cast<const VkPhysicalDeviceImageViewImageFormatInfoEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceImageViewImageFormatInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT: {
+            checkEqual_VkPhysicalDeviceImageViewImageFormatInfoEXT(
+                reinterpret_cast<const VkPhysicalDeviceImageViewImageFormatInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceImageViewImageFormatInfoEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT:
-        {
-            checkEqual_VkFilterCubicImageViewImageFormatPropertiesEXT(reinterpret_cast<const VkFilterCubicImageViewImageFormatPropertiesEXT*>(structExtension), reinterpret_cast<const VkFilterCubicImageViewImageFormatPropertiesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT: {
+            checkEqual_VkFilterCubicImageViewImageFormatPropertiesEXT(
+                reinterpret_cast<const VkFilterCubicImageViewImageFormatPropertiesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkFilterCubicImageViewImageFormatPropertiesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_global_priority
-        case VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT:
-        {
-            checkEqual_VkDeviceQueueGlobalPriorityCreateInfoEXT(reinterpret_cast<const VkDeviceQueueGlobalPriorityCreateInfoEXT*>(structExtension), reinterpret_cast<const VkDeviceQueueGlobalPriorityCreateInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT: {
+            checkEqual_VkDeviceQueueGlobalPriorityCreateInfoEXT(
+                reinterpret_cast<const VkDeviceQueueGlobalPriorityCreateInfoEXT*>(structExtension),
+                reinterpret_cast<const VkDeviceQueueGlobalPriorityCreateInfoEXT*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_external_memory_host
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT:
-        {
-            checkEqual_VkImportMemoryHostPointerInfoEXT(reinterpret_cast<const VkImportMemoryHostPointerInfoEXT*>(structExtension), reinterpret_cast<const VkImportMemoryHostPointerInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT: {
+            checkEqual_VkImportMemoryHostPointerInfoEXT(
+                reinterpret_cast<const VkImportMemoryHostPointerInfoEXT*>(structExtension),
+                reinterpret_cast<const VkImportMemoryHostPointerInfoEXT*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(reinterpret_cast<const VkPhysicalDeviceExternalMemoryHostPropertiesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceExternalMemoryHostPropertiesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT: {
+            checkEqual_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
+                reinterpret_cast<const VkPhysicalDeviceExternalMemoryHostPropertiesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceExternalMemoryHostPropertiesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_AMD_pipeline_compiler_control
-        case VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD:
-        {
-            checkEqual_VkPipelineCompilerControlCreateInfoAMD(reinterpret_cast<const VkPipelineCompilerControlCreateInfoAMD*>(structExtension), reinterpret_cast<const VkPipelineCompilerControlCreateInfoAMD*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD: {
+            checkEqual_VkPipelineCompilerControlCreateInfoAMD(
+                reinterpret_cast<const VkPipelineCompilerControlCreateInfoAMD*>(structExtension),
+                reinterpret_cast<const VkPipelineCompilerControlCreateInfoAMD*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_AMD_shader_core_properties
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD:
-        {
-            checkEqual_VkPhysicalDeviceShaderCorePropertiesAMD(reinterpret_cast<const VkPhysicalDeviceShaderCorePropertiesAMD*>(structExtension), reinterpret_cast<const VkPhysicalDeviceShaderCorePropertiesAMD*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD: {
+            checkEqual_VkPhysicalDeviceShaderCorePropertiesAMD(
+                reinterpret_cast<const VkPhysicalDeviceShaderCorePropertiesAMD*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceShaderCorePropertiesAMD*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_video_decode_h265
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_EXT:
-        {
-            checkEqual_VkVideoDecodeH265ProfileEXT(reinterpret_cast<const VkVideoDecodeH265ProfileEXT*>(structExtension), reinterpret_cast<const VkVideoDecodeH265ProfileEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_EXT: {
+            checkEqual_VkVideoDecodeH265ProfileEXT(
+                reinterpret_cast<const VkVideoDecodeH265ProfileEXT*>(structExtension),
+                reinterpret_cast<const VkVideoDecodeH265ProfileEXT*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT:
-        {
-            checkEqual_VkVideoDecodeH265CapabilitiesEXT(reinterpret_cast<const VkVideoDecodeH265CapabilitiesEXT*>(structExtension), reinterpret_cast<const VkVideoDecodeH265CapabilitiesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT: {
+            checkEqual_VkVideoDecodeH265CapabilitiesEXT(
+                reinterpret_cast<const VkVideoDecodeH265CapabilitiesEXT*>(structExtension),
+                reinterpret_cast<const VkVideoDecodeH265CapabilitiesEXT*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_CREATE_INFO_EXT:
-        {
-            checkEqual_VkVideoDecodeH265SessionCreateInfoEXT(reinterpret_cast<const VkVideoDecodeH265SessionCreateInfoEXT*>(structExtension), reinterpret_cast<const VkVideoDecodeH265SessionCreateInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_CREATE_INFO_EXT: {
+            checkEqual_VkVideoDecodeH265SessionCreateInfoEXT(
+                reinterpret_cast<const VkVideoDecodeH265SessionCreateInfoEXT*>(structExtension),
+                reinterpret_cast<const VkVideoDecodeH265SessionCreateInfoEXT*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
-            checkEqual_VkVideoDecodeH265SessionParametersAddInfoEXT(reinterpret_cast<const VkVideoDecodeH265SessionParametersAddInfoEXT*>(structExtension), reinterpret_cast<const VkVideoDecodeH265SessionParametersAddInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT: {
+            checkEqual_VkVideoDecodeH265SessionParametersAddInfoEXT(
+                reinterpret_cast<const VkVideoDecodeH265SessionParametersAddInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkVideoDecodeH265SessionParametersAddInfoEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
-            checkEqual_VkVideoDecodeH265SessionParametersCreateInfoEXT(reinterpret_cast<const VkVideoDecodeH265SessionParametersCreateInfoEXT*>(structExtension), reinterpret_cast<const VkVideoDecodeH265SessionParametersCreateInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT: {
+            checkEqual_VkVideoDecodeH265SessionParametersCreateInfoEXT(
+                reinterpret_cast<const VkVideoDecodeH265SessionParametersCreateInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkVideoDecodeH265SessionParametersCreateInfoEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT:
-        {
-            checkEqual_VkVideoDecodeH265PictureInfoEXT(reinterpret_cast<const VkVideoDecodeH265PictureInfoEXT*>(structExtension), reinterpret_cast<const VkVideoDecodeH265PictureInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT: {
+            checkEqual_VkVideoDecodeH265PictureInfoEXT(
+                reinterpret_cast<const VkVideoDecodeH265PictureInfoEXT*>(structExtension),
+                reinterpret_cast<const VkVideoDecodeH265PictureInfoEXT*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT:
-        {
-            checkEqual_VkVideoDecodeH265DpbSlotInfoEXT(reinterpret_cast<const VkVideoDecodeH265DpbSlotInfoEXT*>(structExtension), reinterpret_cast<const VkVideoDecodeH265DpbSlotInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT: {
+            checkEqual_VkVideoDecodeH265DpbSlotInfoEXT(
+                reinterpret_cast<const VkVideoDecodeH265DpbSlotInfoEXT*>(structExtension),
+                reinterpret_cast<const VkVideoDecodeH265DpbSlotInfoEXT*>(structExtension2), onFail);
             break;
         }
 #endif
 #ifdef VK_AMD_memory_overallocation_behavior
-        case VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD:
-        {
-            checkEqual_VkDeviceMemoryOverallocationCreateInfoAMD(reinterpret_cast<const VkDeviceMemoryOverallocationCreateInfoAMD*>(structExtension), reinterpret_cast<const VkDeviceMemoryOverallocationCreateInfoAMD*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD: {
+            checkEqual_VkDeviceMemoryOverallocationCreateInfoAMD(
+                reinterpret_cast<const VkDeviceMemoryOverallocationCreateInfoAMD*>(structExtension),
+                reinterpret_cast<const VkDeviceMemoryOverallocationCreateInfoAMD*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_vertex_attribute_divisor
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(reinterpret_cast<const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT: {
+            checkEqual_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
+                reinterpret_cast<const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT:
-        {
-            checkEqual_VkPipelineVertexInputDivisorStateCreateInfoEXT(reinterpret_cast<const VkPipelineVertexInputDivisorStateCreateInfoEXT*>(structExtension), reinterpret_cast<const VkPipelineVertexInputDivisorStateCreateInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT: {
+            checkEqual_VkPipelineVertexInputDivisorStateCreateInfoEXT(
+                reinterpret_cast<const VkPipelineVertexInputDivisorStateCreateInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPipelineVertexInputDivisorStateCreateInfoEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(reinterpret_cast<const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: {
+            checkEqual_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(
+                reinterpret_cast<const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_GGP_frame_token
-        case VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP:
-        {
-            checkEqual_VkPresentFrameTokenGGP(reinterpret_cast<const VkPresentFrameTokenGGP*>(structExtension), reinterpret_cast<const VkPresentFrameTokenGGP*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP: {
+            checkEqual_VkPresentFrameTokenGGP(
+                reinterpret_cast<const VkPresentFrameTokenGGP*>(structExtension),
+                reinterpret_cast<const VkPresentFrameTokenGGP*>(structExtension2), onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_pipeline_creation_feedback
-        case VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT:
-        {
-            checkEqual_VkPipelineCreationFeedbackCreateInfoEXT(reinterpret_cast<const VkPipelineCreationFeedbackCreateInfoEXT*>(structExtension), reinterpret_cast<const VkPipelineCreationFeedbackCreateInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT: {
+            checkEqual_VkPipelineCreationFeedbackCreateInfoEXT(
+                reinterpret_cast<const VkPipelineCreationFeedbackCreateInfoEXT*>(structExtension),
+                reinterpret_cast<const VkPipelineCreationFeedbackCreateInfoEXT*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_NV_compute_shader_derivatives
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV:
-        {
-            checkEqual_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(reinterpret_cast<const VkPhysicalDeviceComputeShaderDerivativesFeaturesNV*>(structExtension), reinterpret_cast<const VkPhysicalDeviceComputeShaderDerivativesFeaturesNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV: {
+            checkEqual_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(
+                reinterpret_cast<const VkPhysicalDeviceComputeShaderDerivativesFeaturesNV*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceComputeShaderDerivativesFeaturesNV*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_NV_mesh_shader
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV:
-        {
-            checkEqual_VkPhysicalDeviceMeshShaderFeaturesNV(reinterpret_cast<const VkPhysicalDeviceMeshShaderFeaturesNV*>(structExtension), reinterpret_cast<const VkPhysicalDeviceMeshShaderFeaturesNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV: {
+            checkEqual_VkPhysicalDeviceMeshShaderFeaturesNV(
+                reinterpret_cast<const VkPhysicalDeviceMeshShaderFeaturesNV*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceMeshShaderFeaturesNV*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV:
-        {
-            checkEqual_VkPhysicalDeviceMeshShaderPropertiesNV(reinterpret_cast<const VkPhysicalDeviceMeshShaderPropertiesNV*>(structExtension), reinterpret_cast<const VkPhysicalDeviceMeshShaderPropertiesNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV: {
+            checkEqual_VkPhysicalDeviceMeshShaderPropertiesNV(
+                reinterpret_cast<const VkPhysicalDeviceMeshShaderPropertiesNV*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceMeshShaderPropertiesNV*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_NV_fragment_shader_barycentric
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV:
-        {
-            checkEqual_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(reinterpret_cast<const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV*>(structExtension), reinterpret_cast<const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV: {
+            checkEqual_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(
+                reinterpret_cast<const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_NV_shader_image_footprint
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV:
-        {
-            checkEqual_VkPhysicalDeviceShaderImageFootprintFeaturesNV(reinterpret_cast<const VkPhysicalDeviceShaderImageFootprintFeaturesNV*>(structExtension), reinterpret_cast<const VkPhysicalDeviceShaderImageFootprintFeaturesNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV: {
+            checkEqual_VkPhysicalDeviceShaderImageFootprintFeaturesNV(
+                reinterpret_cast<const VkPhysicalDeviceShaderImageFootprintFeaturesNV*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceShaderImageFootprintFeaturesNV*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_NV_scissor_exclusive
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV:
-        {
-            checkEqual_VkPipelineViewportExclusiveScissorStateCreateInfoNV(reinterpret_cast<const VkPipelineViewportExclusiveScissorStateCreateInfoNV*>(structExtension), reinterpret_cast<const VkPipelineViewportExclusiveScissorStateCreateInfoNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV: {
+            checkEqual_VkPipelineViewportExclusiveScissorStateCreateInfoNV(
+                reinterpret_cast<const VkPipelineViewportExclusiveScissorStateCreateInfoNV*>(
+                    structExtension),
+                reinterpret_cast<const VkPipelineViewportExclusiveScissorStateCreateInfoNV*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV:
-        {
-            checkEqual_VkPhysicalDeviceExclusiveScissorFeaturesNV(reinterpret_cast<const VkPhysicalDeviceExclusiveScissorFeaturesNV*>(structExtension), reinterpret_cast<const VkPhysicalDeviceExclusiveScissorFeaturesNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV: {
+            checkEqual_VkPhysicalDeviceExclusiveScissorFeaturesNV(
+                reinterpret_cast<const VkPhysicalDeviceExclusiveScissorFeaturesNV*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceExclusiveScissorFeaturesNV*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
-        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV:
-        {
-            checkEqual_VkQueueFamilyCheckpointPropertiesNV(reinterpret_cast<const VkQueueFamilyCheckpointPropertiesNV*>(structExtension), reinterpret_cast<const VkQueueFamilyCheckpointPropertiesNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV: {
+            checkEqual_VkQueueFamilyCheckpointPropertiesNV(
+                reinterpret_cast<const VkQueueFamilyCheckpointPropertiesNV*>(structExtension),
+                reinterpret_cast<const VkQueueFamilyCheckpointPropertiesNV*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_INTEL_shader_integer_functions2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL:
-        {
-            checkEqual_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(reinterpret_cast<const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL*>(structExtension), reinterpret_cast<const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL: {
+            checkEqual_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(
+                reinterpret_cast<const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_INTEL_performance_query
-        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL:
-        {
-            checkEqual_VkQueryPoolPerformanceQueryCreateInfoINTEL(reinterpret_cast<const VkQueryPoolPerformanceQueryCreateInfoINTEL*>(structExtension), reinterpret_cast<const VkQueryPoolPerformanceQueryCreateInfoINTEL*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL: {
+            checkEqual_VkQueryPoolPerformanceQueryCreateInfoINTEL(
+                reinterpret_cast<const VkQueryPoolPerformanceQueryCreateInfoINTEL*>(
+                    structExtension),
+                reinterpret_cast<const VkQueryPoolPerformanceQueryCreateInfoINTEL*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_pci_bus_info
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT:
-        {
-            checkEqual_VkPhysicalDevicePCIBusInfoPropertiesEXT(reinterpret_cast<const VkPhysicalDevicePCIBusInfoPropertiesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDevicePCIBusInfoPropertiesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT: {
+            checkEqual_VkPhysicalDevicePCIBusInfoPropertiesEXT(
+                reinterpret_cast<const VkPhysicalDevicePCIBusInfoPropertiesEXT*>(structExtension),
+                reinterpret_cast<const VkPhysicalDevicePCIBusInfoPropertiesEXT*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_AMD_display_native_hdr
-        case VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD:
-        {
-            checkEqual_VkDisplayNativeHdrSurfaceCapabilitiesAMD(reinterpret_cast<const VkDisplayNativeHdrSurfaceCapabilitiesAMD*>(structExtension), reinterpret_cast<const VkDisplayNativeHdrSurfaceCapabilitiesAMD*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD: {
+            checkEqual_VkDisplayNativeHdrSurfaceCapabilitiesAMD(
+                reinterpret_cast<const VkDisplayNativeHdrSurfaceCapabilitiesAMD*>(structExtension),
+                reinterpret_cast<const VkDisplayNativeHdrSurfaceCapabilitiesAMD*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD:
-        {
-            checkEqual_VkSwapchainDisplayNativeHdrCreateInfoAMD(reinterpret_cast<const VkSwapchainDisplayNativeHdrCreateInfoAMD*>(structExtension), reinterpret_cast<const VkSwapchainDisplayNativeHdrCreateInfoAMD*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD: {
+            checkEqual_VkSwapchainDisplayNativeHdrCreateInfoAMD(
+                reinterpret_cast<const VkSwapchainDisplayNativeHdrCreateInfoAMD*>(structExtension),
+                reinterpret_cast<const VkSwapchainDisplayNativeHdrCreateInfoAMD*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_fragment_density_map
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT: {
+            checkEqual_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
+                reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT: {
+            checkEqual_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
+                reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT:
-        {
-            checkEqual_VkRenderPassFragmentDensityMapCreateInfoEXT(reinterpret_cast<const VkRenderPassFragmentDensityMapCreateInfoEXT*>(structExtension), reinterpret_cast<const VkRenderPassFragmentDensityMapCreateInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT: {
+            checkEqual_VkRenderPassFragmentDensityMapCreateInfoEXT(
+                reinterpret_cast<const VkRenderPassFragmentDensityMapCreateInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkRenderPassFragmentDensityMapCreateInfoEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_subgroup_size_control
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(reinterpret_cast<const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT: {
+            checkEqual_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(
+                reinterpret_cast<const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(reinterpret_cast<const VkPhysicalDeviceSubgroupSizeControlPropertiesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceSubgroupSizeControlPropertiesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT: {
+            checkEqual_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(
+                reinterpret_cast<const VkPhysicalDeviceSubgroupSizeControlPropertiesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceSubgroupSizeControlPropertiesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT:
-        {
-            checkEqual_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(reinterpret_cast<const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT*>(structExtension), reinterpret_cast<const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT: {
+            checkEqual_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(
+                reinterpret_cast<const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_AMD_shader_core_properties2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD:
-        {
-            checkEqual_VkPhysicalDeviceShaderCoreProperties2AMD(reinterpret_cast<const VkPhysicalDeviceShaderCoreProperties2AMD*>(structExtension), reinterpret_cast<const VkPhysicalDeviceShaderCoreProperties2AMD*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD: {
+            checkEqual_VkPhysicalDeviceShaderCoreProperties2AMD(
+                reinterpret_cast<const VkPhysicalDeviceShaderCoreProperties2AMD*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceShaderCoreProperties2AMD*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_AMD_device_coherent_memory
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD:
-        {
-            checkEqual_VkPhysicalDeviceCoherentMemoryFeaturesAMD(reinterpret_cast<const VkPhysicalDeviceCoherentMemoryFeaturesAMD*>(structExtension), reinterpret_cast<const VkPhysicalDeviceCoherentMemoryFeaturesAMD*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD: {
+            checkEqual_VkPhysicalDeviceCoherentMemoryFeaturesAMD(
+                reinterpret_cast<const VkPhysicalDeviceCoherentMemoryFeaturesAMD*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceCoherentMemoryFeaturesAMD*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_shader_image_atomic_int64
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(reinterpret_cast<const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT: {
+            checkEqual_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(
+                reinterpret_cast<const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_memory_budget
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceMemoryBudgetPropertiesEXT(reinterpret_cast<const VkPhysicalDeviceMemoryBudgetPropertiesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceMemoryBudgetPropertiesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT: {
+            checkEqual_VkPhysicalDeviceMemoryBudgetPropertiesEXT(
+                reinterpret_cast<const VkPhysicalDeviceMemoryBudgetPropertiesEXT*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceMemoryBudgetPropertiesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_memory_priority
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceMemoryPriorityFeaturesEXT(reinterpret_cast<const VkPhysicalDeviceMemoryPriorityFeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceMemoryPriorityFeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT: {
+            checkEqual_VkPhysicalDeviceMemoryPriorityFeaturesEXT(
+                reinterpret_cast<const VkPhysicalDeviceMemoryPriorityFeaturesEXT*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceMemoryPriorityFeaturesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT:
-        {
-            checkEqual_VkMemoryPriorityAllocateInfoEXT(reinterpret_cast<const VkMemoryPriorityAllocateInfoEXT*>(structExtension), reinterpret_cast<const VkMemoryPriorityAllocateInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT: {
+            checkEqual_VkMemoryPriorityAllocateInfoEXT(
+                reinterpret_cast<const VkMemoryPriorityAllocateInfoEXT*>(structExtension),
+                reinterpret_cast<const VkMemoryPriorityAllocateInfoEXT*>(structExtension2), onFail);
             break;
         }
 #endif
 #ifdef VK_NV_dedicated_allocation_image_aliasing
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV:
-        {
-            checkEqual_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(reinterpret_cast<const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV*>(structExtension), reinterpret_cast<const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV: {
+            checkEqual_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(
+                reinterpret_cast<const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_buffer_device_address
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(reinterpret_cast<const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT: {
+            checkEqual_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(
+                reinterpret_cast<const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT:
-        {
-            checkEqual_VkBufferDeviceAddressCreateInfoEXT(reinterpret_cast<const VkBufferDeviceAddressCreateInfoEXT*>(structExtension), reinterpret_cast<const VkBufferDeviceAddressCreateInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT: {
+            checkEqual_VkBufferDeviceAddressCreateInfoEXT(
+                reinterpret_cast<const VkBufferDeviceAddressCreateInfoEXT*>(structExtension),
+                reinterpret_cast<const VkBufferDeviceAddressCreateInfoEXT*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_validation_features
-        case VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT:
-        {
-            checkEqual_VkValidationFeaturesEXT(reinterpret_cast<const VkValidationFeaturesEXT*>(structExtension), reinterpret_cast<const VkValidationFeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT: {
+            checkEqual_VkValidationFeaturesEXT(
+                reinterpret_cast<const VkValidationFeaturesEXT*>(structExtension),
+                reinterpret_cast<const VkValidationFeaturesEXT*>(structExtension2), onFail);
             break;
         }
 #endif
 #ifdef VK_NV_cooperative_matrix
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV:
-        {
-            checkEqual_VkPhysicalDeviceCooperativeMatrixFeaturesNV(reinterpret_cast<const VkPhysicalDeviceCooperativeMatrixFeaturesNV*>(structExtension), reinterpret_cast<const VkPhysicalDeviceCooperativeMatrixFeaturesNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV: {
+            checkEqual_VkPhysicalDeviceCooperativeMatrixFeaturesNV(
+                reinterpret_cast<const VkPhysicalDeviceCooperativeMatrixFeaturesNV*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceCooperativeMatrixFeaturesNV*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV:
-        {
-            checkEqual_VkPhysicalDeviceCooperativeMatrixPropertiesNV(reinterpret_cast<const VkPhysicalDeviceCooperativeMatrixPropertiesNV*>(structExtension), reinterpret_cast<const VkPhysicalDeviceCooperativeMatrixPropertiesNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV: {
+            checkEqual_VkPhysicalDeviceCooperativeMatrixPropertiesNV(
+                reinterpret_cast<const VkPhysicalDeviceCooperativeMatrixPropertiesNV*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceCooperativeMatrixPropertiesNV*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_NV_coverage_reduction_mode
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV:
-        {
-            checkEqual_VkPhysicalDeviceCoverageReductionModeFeaturesNV(reinterpret_cast<const VkPhysicalDeviceCoverageReductionModeFeaturesNV*>(structExtension), reinterpret_cast<const VkPhysicalDeviceCoverageReductionModeFeaturesNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV: {
+            checkEqual_VkPhysicalDeviceCoverageReductionModeFeaturesNV(
+                reinterpret_cast<const VkPhysicalDeviceCoverageReductionModeFeaturesNV*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceCoverageReductionModeFeaturesNV*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV:
-        {
-            checkEqual_VkPipelineCoverageReductionStateCreateInfoNV(reinterpret_cast<const VkPipelineCoverageReductionStateCreateInfoNV*>(structExtension), reinterpret_cast<const VkPipelineCoverageReductionStateCreateInfoNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV: {
+            checkEqual_VkPipelineCoverageReductionStateCreateInfoNV(
+                reinterpret_cast<const VkPipelineCoverageReductionStateCreateInfoNV*>(
+                    structExtension),
+                reinterpret_cast<const VkPipelineCoverageReductionStateCreateInfoNV*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_fragment_shader_interlock
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(reinterpret_cast<const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT: {
+            checkEqual_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(
+                reinterpret_cast<const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_ycbcr_image_arrays
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(reinterpret_cast<const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT: {
+            checkEqual_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(
+                reinterpret_cast<const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_provoking_vertex
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceProvokingVertexFeaturesEXT(reinterpret_cast<const VkPhysicalDeviceProvokingVertexFeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceProvokingVertexFeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT: {
+            checkEqual_VkPhysicalDeviceProvokingVertexFeaturesEXT(
+                reinterpret_cast<const VkPhysicalDeviceProvokingVertexFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceProvokingVertexFeaturesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_PROPERTIES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceProvokingVertexPropertiesEXT(reinterpret_cast<const VkPhysicalDeviceProvokingVertexPropertiesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceProvokingVertexPropertiesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_PROPERTIES_EXT: {
+            checkEqual_VkPhysicalDeviceProvokingVertexPropertiesEXT(
+                reinterpret_cast<const VkPhysicalDeviceProvokingVertexPropertiesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceProvokingVertexPropertiesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT:
-        {
-            checkEqual_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT(reinterpret_cast<const VkPipelineRasterizationProvokingVertexStateCreateInfoEXT*>(structExtension), reinterpret_cast<const VkPipelineRasterizationProvokingVertexStateCreateInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT: {
+            checkEqual_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT(
+                reinterpret_cast<const VkPipelineRasterizationProvokingVertexStateCreateInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPipelineRasterizationProvokingVertexStateCreateInfoEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_full_screen_exclusive
-        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT:
-        {
-            checkEqual_VkSurfaceFullScreenExclusiveInfoEXT(reinterpret_cast<const VkSurfaceFullScreenExclusiveInfoEXT*>(structExtension), reinterpret_cast<const VkSurfaceFullScreenExclusiveInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT: {
+            checkEqual_VkSurfaceFullScreenExclusiveInfoEXT(
+                reinterpret_cast<const VkSurfaceFullScreenExclusiveInfoEXT*>(structExtension),
+                reinterpret_cast<const VkSurfaceFullScreenExclusiveInfoEXT*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT:
-        {
-            checkEqual_VkSurfaceCapabilitiesFullScreenExclusiveEXT(reinterpret_cast<const VkSurfaceCapabilitiesFullScreenExclusiveEXT*>(structExtension), reinterpret_cast<const VkSurfaceCapabilitiesFullScreenExclusiveEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT: {
+            checkEqual_VkSurfaceCapabilitiesFullScreenExclusiveEXT(
+                reinterpret_cast<const VkSurfaceCapabilitiesFullScreenExclusiveEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkSurfaceCapabilitiesFullScreenExclusiveEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT:
-        {
-            checkEqual_VkSurfaceFullScreenExclusiveWin32InfoEXT(reinterpret_cast<const VkSurfaceFullScreenExclusiveWin32InfoEXT*>(structExtension), reinterpret_cast<const VkSurfaceFullScreenExclusiveWin32InfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT: {
+            checkEqual_VkSurfaceFullScreenExclusiveWin32InfoEXT(
+                reinterpret_cast<const VkSurfaceFullScreenExclusiveWin32InfoEXT*>(structExtension),
+                reinterpret_cast<const VkSurfaceFullScreenExclusiveWin32InfoEXT*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_line_rasterization
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceLineRasterizationFeaturesEXT(reinterpret_cast<const VkPhysicalDeviceLineRasterizationFeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceLineRasterizationFeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT: {
+            checkEqual_VkPhysicalDeviceLineRasterizationFeaturesEXT(
+                reinterpret_cast<const VkPhysicalDeviceLineRasterizationFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceLineRasterizationFeaturesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceLineRasterizationPropertiesEXT(reinterpret_cast<const VkPhysicalDeviceLineRasterizationPropertiesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceLineRasterizationPropertiesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT: {
+            checkEqual_VkPhysicalDeviceLineRasterizationPropertiesEXT(
+                reinterpret_cast<const VkPhysicalDeviceLineRasterizationPropertiesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceLineRasterizationPropertiesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT:
-        {
-            checkEqual_VkPipelineRasterizationLineStateCreateInfoEXT(reinterpret_cast<const VkPipelineRasterizationLineStateCreateInfoEXT*>(structExtension), reinterpret_cast<const VkPipelineRasterizationLineStateCreateInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT: {
+            checkEqual_VkPipelineRasterizationLineStateCreateInfoEXT(
+                reinterpret_cast<const VkPipelineRasterizationLineStateCreateInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPipelineRasterizationLineStateCreateInfoEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_shader_atomic_float
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(reinterpret_cast<const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT: {
+            checkEqual_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(
+                reinterpret_cast<const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_index_type_uint8
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(reinterpret_cast<const VkPhysicalDeviceIndexTypeUint8FeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceIndexTypeUint8FeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT: {
+            checkEqual_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(
+                reinterpret_cast<const VkPhysicalDeviceIndexTypeUint8FeaturesEXT*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceIndexTypeUint8FeaturesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(reinterpret_cast<const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT: {
+            checkEqual_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(
+                reinterpret_cast<const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_shader_atomic_float2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT(reinterpret_cast<const VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT: {
+            checkEqual_VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT(
+                reinterpret_cast<const VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(reinterpret_cast<const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT: {
+            checkEqual_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(
+                reinterpret_cast<const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_NV_device_generated_commands
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV:
-        {
-            checkEqual_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV*>(structExtension), reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV: {
+            checkEqual_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(
+                reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV:
-        {
-            checkEqual_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV*>(structExtension), reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV: {
+            checkEqual_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(
+                reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV:
-        {
-            checkEqual_VkGraphicsPipelineShaderGroupsCreateInfoNV(reinterpret_cast<const VkGraphicsPipelineShaderGroupsCreateInfoNV*>(structExtension), reinterpret_cast<const VkGraphicsPipelineShaderGroupsCreateInfoNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV: {
+            checkEqual_VkGraphicsPipelineShaderGroupsCreateInfoNV(
+                reinterpret_cast<const VkGraphicsPipelineShaderGroupsCreateInfoNV*>(
+                    structExtension),
+                reinterpret_cast<const VkGraphicsPipelineShaderGroupsCreateInfoNV*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_NV_inherited_viewport_scissor
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV:
-        {
-            checkEqual_VkPhysicalDeviceInheritedViewportScissorFeaturesNV(reinterpret_cast<const VkPhysicalDeviceInheritedViewportScissorFeaturesNV*>(structExtension), reinterpret_cast<const VkPhysicalDeviceInheritedViewportScissorFeaturesNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV: {
+            checkEqual_VkPhysicalDeviceInheritedViewportScissorFeaturesNV(
+                reinterpret_cast<const VkPhysicalDeviceInheritedViewportScissorFeaturesNV*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceInheritedViewportScissorFeaturesNV*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_VIEWPORT_SCISSOR_INFO_NV:
-        {
-            checkEqual_VkCommandBufferInheritanceViewportScissorInfoNV(reinterpret_cast<const VkCommandBufferInheritanceViewportScissorInfoNV*>(structExtension), reinterpret_cast<const VkCommandBufferInheritanceViewportScissorInfoNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_VIEWPORT_SCISSOR_INFO_NV: {
+            checkEqual_VkCommandBufferInheritanceViewportScissorInfoNV(
+                reinterpret_cast<const VkCommandBufferInheritanceViewportScissorInfoNV*>(
+                    structExtension),
+                reinterpret_cast<const VkCommandBufferInheritanceViewportScissorInfoNV*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_texel_buffer_alignment
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(reinterpret_cast<const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: {
+            checkEqual_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
+                reinterpret_cast<const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(reinterpret_cast<const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT: {
+            checkEqual_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(
+                reinterpret_cast<const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_QCOM_render_pass_transform
-        case VK_STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM:
-        {
-            checkEqual_VkRenderPassTransformBeginInfoQCOM(reinterpret_cast<const VkRenderPassTransformBeginInfoQCOM*>(structExtension), reinterpret_cast<const VkRenderPassTransformBeginInfoQCOM*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM: {
+            checkEqual_VkRenderPassTransformBeginInfoQCOM(
+                reinterpret_cast<const VkRenderPassTransformBeginInfoQCOM*>(structExtension),
+                reinterpret_cast<const VkRenderPassTransformBeginInfoQCOM*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM:
-        {
-            checkEqual_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(reinterpret_cast<const VkCommandBufferInheritanceRenderPassTransformInfoQCOM*>(structExtension), reinterpret_cast<const VkCommandBufferInheritanceRenderPassTransformInfoQCOM*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM: {
+            checkEqual_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(
+                reinterpret_cast<const VkCommandBufferInheritanceRenderPassTransformInfoQCOM*>(
+                    structExtension),
+                reinterpret_cast<const VkCommandBufferInheritanceRenderPassTransformInfoQCOM*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_device_memory_report
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(reinterpret_cast<const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT: {
+            checkEqual_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(
+                reinterpret_cast<const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT:
-        {
-            checkEqual_VkDeviceDeviceMemoryReportCreateInfoEXT(reinterpret_cast<const VkDeviceDeviceMemoryReportCreateInfoEXT*>(structExtension), reinterpret_cast<const VkDeviceDeviceMemoryReportCreateInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT: {
+            checkEqual_VkDeviceDeviceMemoryReportCreateInfoEXT(
+                reinterpret_cast<const VkDeviceDeviceMemoryReportCreateInfoEXT*>(structExtension),
+                reinterpret_cast<const VkDeviceDeviceMemoryReportCreateInfoEXT*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_robustness2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceRobustness2FeaturesEXT(reinterpret_cast<const VkPhysicalDeviceRobustness2FeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceRobustness2FeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT: {
+            checkEqual_VkPhysicalDeviceRobustness2FeaturesEXT(
+                reinterpret_cast<const VkPhysicalDeviceRobustness2FeaturesEXT*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceRobustness2FeaturesEXT*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceRobustness2PropertiesEXT(reinterpret_cast<const VkPhysicalDeviceRobustness2PropertiesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceRobustness2PropertiesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT: {
+            checkEqual_VkPhysicalDeviceRobustness2PropertiesEXT(
+                reinterpret_cast<const VkPhysicalDeviceRobustness2PropertiesEXT*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceRobustness2PropertiesEXT*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_custom_border_color
-        case VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT:
-        {
-            checkEqual_VkSamplerCustomBorderColorCreateInfoEXT(reinterpret_cast<const VkSamplerCustomBorderColorCreateInfoEXT*>(structExtension), reinterpret_cast<const VkSamplerCustomBorderColorCreateInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT: {
+            checkEqual_VkSamplerCustomBorderColorCreateInfoEXT(
+                reinterpret_cast<const VkSamplerCustomBorderColorCreateInfoEXT*>(structExtension),
+                reinterpret_cast<const VkSamplerCustomBorderColorCreateInfoEXT*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceCustomBorderColorPropertiesEXT(reinterpret_cast<const VkPhysicalDeviceCustomBorderColorPropertiesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceCustomBorderColorPropertiesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT: {
+            checkEqual_VkPhysicalDeviceCustomBorderColorPropertiesEXT(
+                reinterpret_cast<const VkPhysicalDeviceCustomBorderColorPropertiesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceCustomBorderColorPropertiesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceCustomBorderColorFeaturesEXT(reinterpret_cast<const VkPhysicalDeviceCustomBorderColorFeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceCustomBorderColorFeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT: {
+            checkEqual_VkPhysicalDeviceCustomBorderColorFeaturesEXT(
+                reinterpret_cast<const VkPhysicalDeviceCustomBorderColorFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceCustomBorderColorFeaturesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_private_data
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDevicePrivateDataFeaturesEXT(reinterpret_cast<const VkPhysicalDevicePrivateDataFeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDevicePrivateDataFeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT: {
+            checkEqual_VkPhysicalDevicePrivateDataFeaturesEXT(
+                reinterpret_cast<const VkPhysicalDevicePrivateDataFeaturesEXT*>(structExtension),
+                reinterpret_cast<const VkPhysicalDevicePrivateDataFeaturesEXT*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT:
-        {
-            checkEqual_VkDevicePrivateDataCreateInfoEXT(reinterpret_cast<const VkDevicePrivateDataCreateInfoEXT*>(structExtension), reinterpret_cast<const VkDevicePrivateDataCreateInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT: {
+            checkEqual_VkDevicePrivateDataCreateInfoEXT(
+                reinterpret_cast<const VkDevicePrivateDataCreateInfoEXT*>(structExtension),
+                reinterpret_cast<const VkDevicePrivateDataCreateInfoEXT*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_pipeline_creation_cache_control
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(reinterpret_cast<const VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT: {
+            checkEqual_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(
+                reinterpret_cast<const VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_NV_device_diagnostics_config
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV:
-        {
-            checkEqual_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(reinterpret_cast<const VkPhysicalDeviceDiagnosticsConfigFeaturesNV*>(structExtension), reinterpret_cast<const VkPhysicalDeviceDiagnosticsConfigFeaturesNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV: {
+            checkEqual_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(
+                reinterpret_cast<const VkPhysicalDeviceDiagnosticsConfigFeaturesNV*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceDiagnosticsConfigFeaturesNV*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV:
-        {
-            checkEqual_VkDeviceDiagnosticsConfigCreateInfoNV(reinterpret_cast<const VkDeviceDiagnosticsConfigCreateInfoNV*>(structExtension), reinterpret_cast<const VkDeviceDiagnosticsConfigCreateInfoNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV: {
+            checkEqual_VkDeviceDiagnosticsConfigCreateInfoNV(
+                reinterpret_cast<const VkDeviceDiagnosticsConfigCreateInfoNV*>(structExtension),
+                reinterpret_cast<const VkDeviceDiagnosticsConfigCreateInfoNV*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_NV_fragment_shading_rate_enums
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV:
-        {
-            checkEqual_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV*>(structExtension), reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV: {
+            checkEqual_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(
+                reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV:
-        {
-            checkEqual_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV*>(structExtension), reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV: {
+            checkEqual_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(
+                reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV:
-        {
-            checkEqual_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(reinterpret_cast<const VkPipelineFragmentShadingRateEnumStateCreateInfoNV*>(structExtension), reinterpret_cast<const VkPipelineFragmentShadingRateEnumStateCreateInfoNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV: {
+            checkEqual_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(
+                reinterpret_cast<const VkPipelineFragmentShadingRateEnumStateCreateInfoNV*>(
+                    structExtension),
+                reinterpret_cast<const VkPipelineFragmentShadingRateEnumStateCreateInfoNV*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_NV_ray_tracing_motion_blur
-        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_MOTION_TRIANGLES_DATA_NV:
-        {
-            checkEqual_VkAccelerationStructureGeometryMotionTrianglesDataNV(reinterpret_cast<const VkAccelerationStructureGeometryMotionTrianglesDataNV*>(structExtension), reinterpret_cast<const VkAccelerationStructureGeometryMotionTrianglesDataNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_MOTION_TRIANGLES_DATA_NV: {
+            checkEqual_VkAccelerationStructureGeometryMotionTrianglesDataNV(
+                reinterpret_cast<const VkAccelerationStructureGeometryMotionTrianglesDataNV*>(
+                    structExtension),
+                reinterpret_cast<const VkAccelerationStructureGeometryMotionTrianglesDataNV*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MOTION_INFO_NV:
-        {
-            checkEqual_VkAccelerationStructureMotionInfoNV(reinterpret_cast<const VkAccelerationStructureMotionInfoNV*>(structExtension), reinterpret_cast<const VkAccelerationStructureMotionInfoNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MOTION_INFO_NV: {
+            checkEqual_VkAccelerationStructureMotionInfoNV(
+                reinterpret_cast<const VkAccelerationStructureMotionInfoNV*>(structExtension),
+                reinterpret_cast<const VkAccelerationStructureMotionInfoNV*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV:
-        {
-            checkEqual_VkPhysicalDeviceRayTracingMotionBlurFeaturesNV(reinterpret_cast<const VkPhysicalDeviceRayTracingMotionBlurFeaturesNV*>(structExtension), reinterpret_cast<const VkPhysicalDeviceRayTracingMotionBlurFeaturesNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV: {
+            checkEqual_VkPhysicalDeviceRayTracingMotionBlurFeaturesNV(
+                reinterpret_cast<const VkPhysicalDeviceRayTracingMotionBlurFeaturesNV*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceRayTracingMotionBlurFeaturesNV*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_ycbcr_2plane_444_formats
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT(reinterpret_cast<const VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT: {
+            checkEqual_VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT(
+                reinterpret_cast<const VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_fragment_density_map2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(reinterpret_cast<const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT: {
+            checkEqual_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(
+                reinterpret_cast<const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(reinterpret_cast<const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT: {
+            checkEqual_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(
+                reinterpret_cast<const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_QCOM_rotated_copy_commands
-        case VK_STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM:
-        {
-            checkEqual_VkCopyCommandTransformInfoQCOM(reinterpret_cast<const VkCopyCommandTransformInfoQCOM*>(structExtension), reinterpret_cast<const VkCopyCommandTransformInfoQCOM*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM: {
+            checkEqual_VkCopyCommandTransformInfoQCOM(
+                reinterpret_cast<const VkCopyCommandTransformInfoQCOM*>(structExtension),
+                reinterpret_cast<const VkCopyCommandTransformInfoQCOM*>(structExtension2), onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_image_robustness
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceImageRobustnessFeaturesEXT(reinterpret_cast<const VkPhysicalDeviceImageRobustnessFeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceImageRobustnessFeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT: {
+            checkEqual_VkPhysicalDeviceImageRobustnessFeaturesEXT(
+                reinterpret_cast<const VkPhysicalDeviceImageRobustnessFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceImageRobustnessFeaturesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_4444_formats
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDevice4444FormatsFeaturesEXT(reinterpret_cast<const VkPhysicalDevice4444FormatsFeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDevice4444FormatsFeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT: {
+            checkEqual_VkPhysicalDevice4444FormatsFeaturesEXT(
+                reinterpret_cast<const VkPhysicalDevice4444FormatsFeaturesEXT*>(structExtension),
+                reinterpret_cast<const VkPhysicalDevice4444FormatsFeaturesEXT*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_rgba10x6_formats
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT(reinterpret_cast<const VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT: {
+            checkEqual_VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT(
+                reinterpret_cast<const VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_VALVE_mutable_descriptor_type
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE:
-        {
-            checkEqual_VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE(reinterpret_cast<const VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE*>(structExtension), reinterpret_cast<const VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE: {
+            checkEqual_VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE(
+                reinterpret_cast<const VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE:
-        {
-            checkEqual_VkMutableDescriptorTypeCreateInfoVALVE(reinterpret_cast<const VkMutableDescriptorTypeCreateInfoVALVE*>(structExtension), reinterpret_cast<const VkMutableDescriptorTypeCreateInfoVALVE*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE: {
+            checkEqual_VkMutableDescriptorTypeCreateInfoVALVE(
+                reinterpret_cast<const VkMutableDescriptorTypeCreateInfoVALVE*>(structExtension),
+                reinterpret_cast<const VkMutableDescriptorTypeCreateInfoVALVE*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_vertex_input_dynamic_state
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT(reinterpret_cast<const VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT: {
+            checkEqual_VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT(
+                reinterpret_cast<const VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_physical_device_drm
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRM_PROPERTIES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceDrmPropertiesEXT(reinterpret_cast<const VkPhysicalDeviceDrmPropertiesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceDrmPropertiesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRM_PROPERTIES_EXT: {
+            checkEqual_VkPhysicalDeviceDrmPropertiesEXT(
+                reinterpret_cast<const VkPhysicalDeviceDrmPropertiesEXT*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceDrmPropertiesEXT*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_primitive_topology_list_restart
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT(reinterpret_cast<const VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT: {
+            checkEqual_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT(
+                reinterpret_cast<const VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_FUCHSIA_external_memory
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA:
-        {
-            checkEqual_VkImportMemoryZirconHandleInfoFUCHSIA(reinterpret_cast<const VkImportMemoryZirconHandleInfoFUCHSIA*>(structExtension), reinterpret_cast<const VkImportMemoryZirconHandleInfoFUCHSIA*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA: {
+            checkEqual_VkImportMemoryZirconHandleInfoFUCHSIA(
+                reinterpret_cast<const VkImportMemoryZirconHandleInfoFUCHSIA*>(structExtension),
+                reinterpret_cast<const VkImportMemoryZirconHandleInfoFUCHSIA*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA:
-        {
-            checkEqual_VkImportMemoryBufferCollectionFUCHSIA(reinterpret_cast<const VkImportMemoryBufferCollectionFUCHSIA*>(structExtension), reinterpret_cast<const VkImportMemoryBufferCollectionFUCHSIA*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA: {
+            checkEqual_VkImportMemoryBufferCollectionFUCHSIA(
+                reinterpret_cast<const VkImportMemoryBufferCollectionFUCHSIA*>(structExtension),
+                reinterpret_cast<const VkImportMemoryBufferCollectionFUCHSIA*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA:
-        {
-            checkEqual_VkBufferCollectionImageCreateInfoFUCHSIA(reinterpret_cast<const VkBufferCollectionImageCreateInfoFUCHSIA*>(structExtension), reinterpret_cast<const VkBufferCollectionImageCreateInfoFUCHSIA*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA: {
+            checkEqual_VkBufferCollectionImageCreateInfoFUCHSIA(
+                reinterpret_cast<const VkBufferCollectionImageCreateInfoFUCHSIA*>(structExtension),
+                reinterpret_cast<const VkBufferCollectionImageCreateInfoFUCHSIA*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_BUFFER_CREATE_INFO_FUCHSIA:
-        {
-            checkEqual_VkBufferCollectionBufferCreateInfoFUCHSIA(reinterpret_cast<const VkBufferCollectionBufferCreateInfoFUCHSIA*>(structExtension), reinterpret_cast<const VkBufferCollectionBufferCreateInfoFUCHSIA*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_BUFFER_CREATE_INFO_FUCHSIA: {
+            checkEqual_VkBufferCollectionBufferCreateInfoFUCHSIA(
+                reinterpret_cast<const VkBufferCollectionBufferCreateInfoFUCHSIA*>(structExtension),
+                reinterpret_cast<const VkBufferCollectionBufferCreateInfoFUCHSIA*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_HUAWEI_subpass_shading
-        case VK_STRUCTURE_TYPE_SUBPASS_SHADING_PIPELINE_CREATE_INFO_HUAWEI:
-        {
-            checkEqual_VkSubpassShadingPipelineCreateInfoHUAWEI(reinterpret_cast<const VkSubpassShadingPipelineCreateInfoHUAWEI*>(structExtension), reinterpret_cast<const VkSubpassShadingPipelineCreateInfoHUAWEI*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_SUBPASS_SHADING_PIPELINE_CREATE_INFO_HUAWEI: {
+            checkEqual_VkSubpassShadingPipelineCreateInfoHUAWEI(
+                reinterpret_cast<const VkSubpassShadingPipelineCreateInfoHUAWEI*>(structExtension),
+                reinterpret_cast<const VkSubpassShadingPipelineCreateInfoHUAWEI*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI:
-        {
-            checkEqual_VkPhysicalDeviceSubpassShadingFeaturesHUAWEI(reinterpret_cast<const VkPhysicalDeviceSubpassShadingFeaturesHUAWEI*>(structExtension), reinterpret_cast<const VkPhysicalDeviceSubpassShadingFeaturesHUAWEI*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI: {
+            checkEqual_VkPhysicalDeviceSubpassShadingFeaturesHUAWEI(
+                reinterpret_cast<const VkPhysicalDeviceSubpassShadingFeaturesHUAWEI*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceSubpassShadingFeaturesHUAWEI*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_PROPERTIES_HUAWEI:
-        {
-            checkEqual_VkPhysicalDeviceSubpassShadingPropertiesHUAWEI(reinterpret_cast<const VkPhysicalDeviceSubpassShadingPropertiesHUAWEI*>(structExtension), reinterpret_cast<const VkPhysicalDeviceSubpassShadingPropertiesHUAWEI*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_PROPERTIES_HUAWEI: {
+            checkEqual_VkPhysicalDeviceSubpassShadingPropertiesHUAWEI(
+                reinterpret_cast<const VkPhysicalDeviceSubpassShadingPropertiesHUAWEI*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceSubpassShadingPropertiesHUAWEI*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_HUAWEI_invocation_mask
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI:
-        {
-            checkEqual_VkPhysicalDeviceInvocationMaskFeaturesHUAWEI(reinterpret_cast<const VkPhysicalDeviceInvocationMaskFeaturesHUAWEI*>(structExtension), reinterpret_cast<const VkPhysicalDeviceInvocationMaskFeaturesHUAWEI*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI: {
+            checkEqual_VkPhysicalDeviceInvocationMaskFeaturesHUAWEI(
+                reinterpret_cast<const VkPhysicalDeviceInvocationMaskFeaturesHUAWEI*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceInvocationMaskFeaturesHUAWEI*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_NV_external_memory_rdma
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV:
-        {
-            checkEqual_VkPhysicalDeviceExternalMemoryRDMAFeaturesNV(reinterpret_cast<const VkPhysicalDeviceExternalMemoryRDMAFeaturesNV*>(structExtension), reinterpret_cast<const VkPhysicalDeviceExternalMemoryRDMAFeaturesNV*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV: {
+            checkEqual_VkPhysicalDeviceExternalMemoryRDMAFeaturesNV(
+                reinterpret_cast<const VkPhysicalDeviceExternalMemoryRDMAFeaturesNV*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceExternalMemoryRDMAFeaturesNV*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceExtendedDynamicState2FeaturesEXT(reinterpret_cast<const VkPhysicalDeviceExtendedDynamicState2FeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceExtendedDynamicState2FeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT: {
+            checkEqual_VkPhysicalDeviceExtendedDynamicState2FeaturesEXT(
+                reinterpret_cast<const VkPhysicalDeviceExtendedDynamicState2FeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceExtendedDynamicState2FeaturesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_color_write_enable
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceColorWriteEnableFeaturesEXT(reinterpret_cast<const VkPhysicalDeviceColorWriteEnableFeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceColorWriteEnableFeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT: {
+            checkEqual_VkPhysicalDeviceColorWriteEnableFeaturesEXT(
+                reinterpret_cast<const VkPhysicalDeviceColorWriteEnableFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceColorWriteEnableFeaturesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_WRITE_CREATE_INFO_EXT:
-        {
-            checkEqual_VkPipelineColorWriteCreateInfoEXT(reinterpret_cast<const VkPipelineColorWriteCreateInfoEXT*>(structExtension), reinterpret_cast<const VkPipelineColorWriteCreateInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_WRITE_CREATE_INFO_EXT: {
+            checkEqual_VkPipelineColorWriteCreateInfoEXT(
+                reinterpret_cast<const VkPipelineColorWriteCreateInfoEXT*>(structExtension),
+                reinterpret_cast<const VkPipelineColorWriteCreateInfoEXT*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_GOOGLE_gfxstream
-        case VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE:
-        {
-            checkEqual_VkImportColorBufferGOOGLE(reinterpret_cast<const VkImportColorBufferGOOGLE*>(structExtension), reinterpret_cast<const VkImportColorBufferGOOGLE*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE: {
+            checkEqual_VkImportColorBufferGOOGLE(
+                reinterpret_cast<const VkImportColorBufferGOOGLE*>(structExtension),
+                reinterpret_cast<const VkImportColorBufferGOOGLE*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE:
-        {
-            checkEqual_VkImportBufferGOOGLE(reinterpret_cast<const VkImportBufferGOOGLE*>(structExtension), reinterpret_cast<const VkImportBufferGOOGLE*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE: {
+            checkEqual_VkImportBufferGOOGLE(
+                reinterpret_cast<const VkImportBufferGOOGLE*>(structExtension),
+                reinterpret_cast<const VkImportBufferGOOGLE*>(structExtension2), onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE:
-        {
-            checkEqual_VkImportPhysicalAddressGOOGLE(reinterpret_cast<const VkImportPhysicalAddressGOOGLE*>(structExtension), reinterpret_cast<const VkImportPhysicalAddressGOOGLE*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE: {
+            checkEqual_VkImportPhysicalAddressGOOGLE(
+                reinterpret_cast<const VkImportPhysicalAddressGOOGLE*>(structExtension),
+                reinterpret_cast<const VkImportPhysicalAddressGOOGLE*>(structExtension2), onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_global_priority_query
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(reinterpret_cast<const VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT: {
+            checkEqual_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(
+                reinterpret_cast<const VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_EXT:
-        {
-            checkEqual_VkQueueFamilyGlobalPriorityPropertiesEXT(reinterpret_cast<const VkQueueFamilyGlobalPriorityPropertiesEXT*>(structExtension), reinterpret_cast<const VkQueueFamilyGlobalPriorityPropertiesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_EXT: {
+            checkEqual_VkQueueFamilyGlobalPriorityPropertiesEXT(
+                reinterpret_cast<const VkQueueFamilyGlobalPriorityPropertiesEXT*>(structExtension),
+                reinterpret_cast<const VkQueueFamilyGlobalPriorityPropertiesEXT*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_multi_draw
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceMultiDrawFeaturesEXT(reinterpret_cast<const VkPhysicalDeviceMultiDrawFeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceMultiDrawFeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT: {
+            checkEqual_VkPhysicalDeviceMultiDrawFeaturesEXT(
+                reinterpret_cast<const VkPhysicalDeviceMultiDrawFeaturesEXT*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceMultiDrawFeaturesEXT*>(structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceMultiDrawPropertiesEXT(reinterpret_cast<const VkPhysicalDeviceMultiDrawPropertiesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceMultiDrawPropertiesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT: {
+            checkEqual_VkPhysicalDeviceMultiDrawPropertiesEXT(
+                reinterpret_cast<const VkPhysicalDeviceMultiDrawPropertiesEXT*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceMultiDrawPropertiesEXT*>(structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_border_color_swizzle
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDeviceBorderColorSwizzleFeaturesEXT(reinterpret_cast<const VkPhysicalDeviceBorderColorSwizzleFeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDeviceBorderColorSwizzleFeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT: {
+            checkEqual_VkPhysicalDeviceBorderColorSwizzleFeaturesEXT(
+                reinterpret_cast<const VkPhysicalDeviceBorderColorSwizzleFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceBorderColorSwizzleFeaturesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_BORDER_COLOR_COMPONENT_MAPPING_CREATE_INFO_EXT:
-        {
-            checkEqual_VkSamplerBorderColorComponentMappingCreateInfoEXT(reinterpret_cast<const VkSamplerBorderColorComponentMappingCreateInfoEXT*>(structExtension), reinterpret_cast<const VkSamplerBorderColorComponentMappingCreateInfoEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_SAMPLER_BORDER_COLOR_COMPONENT_MAPPING_CREATE_INFO_EXT: {
+            checkEqual_VkSamplerBorderColorComponentMappingCreateInfoEXT(
+                reinterpret_cast<const VkSamplerBorderColorComponentMappingCreateInfoEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkSamplerBorderColorComponentMappingCreateInfoEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_EXT_pageable_device_local_memory
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT:
-        {
-            checkEqual_VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT(reinterpret_cast<const VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT*>(structExtension), reinterpret_cast<const VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT: {
+            checkEqual_VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT(
+                reinterpret_cast<const VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_KHR_acceleration_structure
-        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR:
-        {
-            checkEqual_VkWriteDescriptorSetAccelerationStructureKHR(reinterpret_cast<const VkWriteDescriptorSetAccelerationStructureKHR*>(structExtension), reinterpret_cast<const VkWriteDescriptorSetAccelerationStructureKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR: {
+            checkEqual_VkWriteDescriptorSetAccelerationStructureKHR(
+                reinterpret_cast<const VkWriteDescriptorSetAccelerationStructureKHR*>(
+                    structExtension),
+                reinterpret_cast<const VkWriteDescriptorSetAccelerationStructureKHR*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR:
-        {
-            checkEqual_VkPhysicalDeviceAccelerationStructureFeaturesKHR(reinterpret_cast<const VkPhysicalDeviceAccelerationStructureFeaturesKHR*>(structExtension), reinterpret_cast<const VkPhysicalDeviceAccelerationStructureFeaturesKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR: {
+            checkEqual_VkPhysicalDeviceAccelerationStructureFeaturesKHR(
+                reinterpret_cast<const VkPhysicalDeviceAccelerationStructureFeaturesKHR*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceAccelerationStructureFeaturesKHR*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR:
-        {
-            checkEqual_VkPhysicalDeviceAccelerationStructurePropertiesKHR(reinterpret_cast<const VkPhysicalDeviceAccelerationStructurePropertiesKHR*>(structExtension), reinterpret_cast<const VkPhysicalDeviceAccelerationStructurePropertiesKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR: {
+            checkEqual_VkPhysicalDeviceAccelerationStructurePropertiesKHR(
+                reinterpret_cast<const VkPhysicalDeviceAccelerationStructurePropertiesKHR*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceAccelerationStructurePropertiesKHR*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR:
-        {
-            checkEqual_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(reinterpret_cast<const VkPhysicalDeviceRayTracingPipelineFeaturesKHR*>(structExtension), reinterpret_cast<const VkPhysicalDeviceRayTracingPipelineFeaturesKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR: {
+            checkEqual_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(
+                reinterpret_cast<const VkPhysicalDeviceRayTracingPipelineFeaturesKHR*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceRayTracingPipelineFeaturesKHR*>(
+                    structExtension2),
+                onFail);
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR:
-        {
-            checkEqual_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(reinterpret_cast<const VkPhysicalDeviceRayTracingPipelinePropertiesKHR*>(structExtension), reinterpret_cast<const VkPhysicalDeviceRayTracingPipelinePropertiesKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR: {
+            checkEqual_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(
+                reinterpret_cast<const VkPhysicalDeviceRayTracingPipelinePropertiesKHR*>(
+                    structExtension),
+                reinterpret_cast<const VkPhysicalDeviceRayTracingPipelinePropertiesKHR*>(
+                    structExtension2),
+                onFail);
             break;
         }
 #endif
 #ifdef VK_KHR_ray_query
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR:
-        {
-            checkEqual_VkPhysicalDeviceRayQueryFeaturesKHR(reinterpret_cast<const VkPhysicalDeviceRayQueryFeaturesKHR*>(structExtension), reinterpret_cast<const VkPhysicalDeviceRayQueryFeaturesKHR*>(structExtension2), onFail);
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR: {
+            checkEqual_VkPhysicalDeviceRayQueryFeaturesKHR(
+                reinterpret_cast<const VkPhysicalDeviceRayQueryFeaturesKHR*>(structExtension),
+                reinterpret_cast<const VkPhysicalDeviceRayQueryFeaturesKHR*>(structExtension2),
+                onFail);
             break;
         }
 #endif
-        default:
-        {
+        default: {
             return;
         }
     }
 }
 
-
-} // namespace goldfish_vk
+}  // namespace goldfish_vk
diff --git a/stream-servers/vulkan/cereal/common/goldfish_vk_testing.h b/stream-servers/vulkan/cereal/common/goldfish_vk_testing.h
index dcba631..0c27393 100644
--- a/stream-servers/vulkan/cereal/common/goldfish_vk_testing.h
+++ b/stream-servers/vulkan/cereal/common/goldfish_vk_testing.h
@@ -14,1494 +14,1131 @@
 // limitations under the License.
 
 // Autogenerated module goldfish_vk_testing
-// (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
+// (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml
+// cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
 // VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
 // VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+//
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o
+// $CEREAL_OUTPUT_DIR
+//
 #pragma once
+#include <string.h>
 #include <vulkan/vulkan.h>
-#include "vulkan_gfxstream.h"
+
+#include <functional>
 
 #include "goldfish_vk_private_defs.h"
-#include <string.h>
-#include <functional>
+#include "vulkan_gfxstream.h"
 using OnFailCompareFunc = std::function<void(const char*)>;
 
 namespace goldfish_vk {
 #ifdef VK_VERSION_1_0
-void checkEqual_VkExtent2D(
-    const VkExtent2D* a,
-    const VkExtent2D* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkExtent2D(const VkExtent2D* a, const VkExtent2D* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkExtent3D(
-    const VkExtent3D* a,
-    const VkExtent3D* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkExtent3D(const VkExtent3D* a, const VkExtent3D* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkOffset2D(
-    const VkOffset2D* a,
-    const VkOffset2D* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkOffset2D(const VkOffset2D* a, const VkOffset2D* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkOffset3D(
-    const VkOffset3D* a,
-    const VkOffset3D* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkOffset3D(const VkOffset3D* a, const VkOffset3D* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkRect2D(
-    const VkRect2D* a,
-    const VkRect2D* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkRect2D(const VkRect2D* a, const VkRect2D* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkBaseInStructure(
-    const VkBaseInStructure* a,
-    const VkBaseInStructure* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkBaseInStructure(const VkBaseInStructure* a, const VkBaseInStructure* b,
+                                  OnFailCompareFunc onFail);
 
-void checkEqual_VkBaseOutStructure(
-    const VkBaseOutStructure* a,
-    const VkBaseOutStructure* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkBaseOutStructure(const VkBaseOutStructure* a, const VkBaseOutStructure* b,
+                                   OnFailCompareFunc onFail);
 
-void checkEqual_VkBufferMemoryBarrier(
-    const VkBufferMemoryBarrier* a,
-    const VkBufferMemoryBarrier* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkBufferMemoryBarrier(const VkBufferMemoryBarrier* a,
+                                      const VkBufferMemoryBarrier* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkDispatchIndirectCommand(
-    const VkDispatchIndirectCommand* a,
-    const VkDispatchIndirectCommand* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDispatchIndirectCommand(const VkDispatchIndirectCommand* a,
+                                          const VkDispatchIndirectCommand* b,
+                                          OnFailCompareFunc onFail);
 
-void checkEqual_VkDrawIndexedIndirectCommand(
-    const VkDrawIndexedIndirectCommand* a,
-    const VkDrawIndexedIndirectCommand* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDrawIndexedIndirectCommand(const VkDrawIndexedIndirectCommand* a,
+                                             const VkDrawIndexedIndirectCommand* b,
+                                             OnFailCompareFunc onFail);
 
-void checkEqual_VkDrawIndirectCommand(
-    const VkDrawIndirectCommand* a,
-    const VkDrawIndirectCommand* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDrawIndirectCommand(const VkDrawIndirectCommand* a,
+                                      const VkDrawIndirectCommand* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkImageSubresourceRange(
-    const VkImageSubresourceRange* a,
-    const VkImageSubresourceRange* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImageSubresourceRange(const VkImageSubresourceRange* a,
+                                        const VkImageSubresourceRange* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkImageMemoryBarrier(
-    const VkImageMemoryBarrier* a,
-    const VkImageMemoryBarrier* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImageMemoryBarrier(const VkImageMemoryBarrier* a, const VkImageMemoryBarrier* b,
+                                     OnFailCompareFunc onFail);
 
-void checkEqual_VkMemoryBarrier(
-    const VkMemoryBarrier* a,
-    const VkMemoryBarrier* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkMemoryBarrier(const VkMemoryBarrier* a, const VkMemoryBarrier* b,
+                                OnFailCompareFunc onFail);
 
-void checkEqual_VkPipelineCacheHeaderVersionOne(
-    const VkPipelineCacheHeaderVersionOne* a,
-    const VkPipelineCacheHeaderVersionOne* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPipelineCacheHeaderVersionOne(const VkPipelineCacheHeaderVersionOne* a,
+                                                const VkPipelineCacheHeaderVersionOne* b,
+                                                OnFailCompareFunc onFail);
 
-void checkEqual_VkAllocationCallbacks(
-    const VkAllocationCallbacks* a,
-    const VkAllocationCallbacks* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkAllocationCallbacks(const VkAllocationCallbacks* a,
+                                      const VkAllocationCallbacks* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkApplicationInfo(
-    const VkApplicationInfo* a,
-    const VkApplicationInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkApplicationInfo(const VkApplicationInfo* a, const VkApplicationInfo* b,
+                                  OnFailCompareFunc onFail);
 
-void checkEqual_VkFormatProperties(
-    const VkFormatProperties* a,
-    const VkFormatProperties* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkFormatProperties(const VkFormatProperties* a, const VkFormatProperties* b,
+                                   OnFailCompareFunc onFail);
 
-void checkEqual_VkImageFormatProperties(
-    const VkImageFormatProperties* a,
-    const VkImageFormatProperties* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImageFormatProperties(const VkImageFormatProperties* a,
+                                        const VkImageFormatProperties* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkInstanceCreateInfo(
-    const VkInstanceCreateInfo* a,
-    const VkInstanceCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkInstanceCreateInfo(const VkInstanceCreateInfo* a, const VkInstanceCreateInfo* b,
+                                     OnFailCompareFunc onFail);
 
-void checkEqual_VkMemoryHeap(
-    const VkMemoryHeap* a,
-    const VkMemoryHeap* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkMemoryHeap(const VkMemoryHeap* a, const VkMemoryHeap* b,
+                             OnFailCompareFunc onFail);
 
-void checkEqual_VkMemoryType(
-    const VkMemoryType* a,
-    const VkMemoryType* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkMemoryType(const VkMemoryType* a, const VkMemoryType* b,
+                             OnFailCompareFunc onFail);
 
-void checkEqual_VkPhysicalDeviceFeatures(
-    const VkPhysicalDeviceFeatures* a,
-    const VkPhysicalDeviceFeatures* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPhysicalDeviceFeatures(const VkPhysicalDeviceFeatures* a,
+                                         const VkPhysicalDeviceFeatures* b,
+                                         OnFailCompareFunc onFail);
 
-void checkEqual_VkPhysicalDeviceLimits(
-    const VkPhysicalDeviceLimits* a,
-    const VkPhysicalDeviceLimits* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPhysicalDeviceLimits(const VkPhysicalDeviceLimits* a,
+                                       const VkPhysicalDeviceLimits* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkPhysicalDeviceMemoryProperties(
-    const VkPhysicalDeviceMemoryProperties* a,
-    const VkPhysicalDeviceMemoryProperties* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPhysicalDeviceMemoryProperties(const VkPhysicalDeviceMemoryProperties* a,
+                                                 const VkPhysicalDeviceMemoryProperties* b,
+                                                 OnFailCompareFunc onFail);
 
-void checkEqual_VkPhysicalDeviceSparseProperties(
-    const VkPhysicalDeviceSparseProperties* a,
-    const VkPhysicalDeviceSparseProperties* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPhysicalDeviceSparseProperties(const VkPhysicalDeviceSparseProperties* a,
+                                                 const VkPhysicalDeviceSparseProperties* b,
+                                                 OnFailCompareFunc onFail);
 
-void checkEqual_VkPhysicalDeviceProperties(
-    const VkPhysicalDeviceProperties* a,
-    const VkPhysicalDeviceProperties* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPhysicalDeviceProperties(const VkPhysicalDeviceProperties* a,
+                                           const VkPhysicalDeviceProperties* b,
+                                           OnFailCompareFunc onFail);
 
-void checkEqual_VkQueueFamilyProperties(
-    const VkQueueFamilyProperties* a,
-    const VkQueueFamilyProperties* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkQueueFamilyProperties(const VkQueueFamilyProperties* a,
+                                        const VkQueueFamilyProperties* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkDeviceQueueCreateInfo(
-    const VkDeviceQueueCreateInfo* a,
-    const VkDeviceQueueCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDeviceQueueCreateInfo(const VkDeviceQueueCreateInfo* a,
+                                        const VkDeviceQueueCreateInfo* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkDeviceCreateInfo(
-    const VkDeviceCreateInfo* a,
-    const VkDeviceCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDeviceCreateInfo(const VkDeviceCreateInfo* a, const VkDeviceCreateInfo* b,
+                                   OnFailCompareFunc onFail);
 
-void checkEqual_VkExtensionProperties(
-    const VkExtensionProperties* a,
-    const VkExtensionProperties* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkExtensionProperties(const VkExtensionProperties* a,
+                                      const VkExtensionProperties* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkLayerProperties(
-    const VkLayerProperties* a,
-    const VkLayerProperties* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkLayerProperties(const VkLayerProperties* a, const VkLayerProperties* b,
+                                  OnFailCompareFunc onFail);
 
-void checkEqual_VkSubmitInfo(
-    const VkSubmitInfo* a,
-    const VkSubmitInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSubmitInfo(const VkSubmitInfo* a, const VkSubmitInfo* b,
+                             OnFailCompareFunc onFail);
 
-void checkEqual_VkMappedMemoryRange(
-    const VkMappedMemoryRange* a,
-    const VkMappedMemoryRange* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkMappedMemoryRange(const VkMappedMemoryRange* a, const VkMappedMemoryRange* b,
+                                    OnFailCompareFunc onFail);
 
-void checkEqual_VkMemoryAllocateInfo(
-    const VkMemoryAllocateInfo* a,
-    const VkMemoryAllocateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkMemoryAllocateInfo(const VkMemoryAllocateInfo* a, const VkMemoryAllocateInfo* b,
+                                     OnFailCompareFunc onFail);
 
-void checkEqual_VkMemoryRequirements(
-    const VkMemoryRequirements* a,
-    const VkMemoryRequirements* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkMemoryRequirements(const VkMemoryRequirements* a, const VkMemoryRequirements* b,
+                                     OnFailCompareFunc onFail);
 
-void checkEqual_VkSparseMemoryBind(
-    const VkSparseMemoryBind* a,
-    const VkSparseMemoryBind* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSparseMemoryBind(const VkSparseMemoryBind* a, const VkSparseMemoryBind* b,
+                                   OnFailCompareFunc onFail);
 
-void checkEqual_VkSparseBufferMemoryBindInfo(
-    const VkSparseBufferMemoryBindInfo* a,
-    const VkSparseBufferMemoryBindInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSparseBufferMemoryBindInfo(const VkSparseBufferMemoryBindInfo* a,
+                                             const VkSparseBufferMemoryBindInfo* b,
+                                             OnFailCompareFunc onFail);
 
-void checkEqual_VkSparseImageOpaqueMemoryBindInfo(
-    const VkSparseImageOpaqueMemoryBindInfo* a,
-    const VkSparseImageOpaqueMemoryBindInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSparseImageOpaqueMemoryBindInfo(const VkSparseImageOpaqueMemoryBindInfo* a,
+                                                  const VkSparseImageOpaqueMemoryBindInfo* b,
+                                                  OnFailCompareFunc onFail);
 
-void checkEqual_VkImageSubresource(
-    const VkImageSubresource* a,
-    const VkImageSubresource* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImageSubresource(const VkImageSubresource* a, const VkImageSubresource* b,
+                                   OnFailCompareFunc onFail);
 
-void checkEqual_VkSparseImageMemoryBind(
-    const VkSparseImageMemoryBind* a,
-    const VkSparseImageMemoryBind* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSparseImageMemoryBind(const VkSparseImageMemoryBind* a,
+                                        const VkSparseImageMemoryBind* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkSparseImageMemoryBindInfo(
-    const VkSparseImageMemoryBindInfo* a,
-    const VkSparseImageMemoryBindInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSparseImageMemoryBindInfo(const VkSparseImageMemoryBindInfo* a,
+                                            const VkSparseImageMemoryBindInfo* b,
+                                            OnFailCompareFunc onFail);
 
-void checkEqual_VkBindSparseInfo(
-    const VkBindSparseInfo* a,
-    const VkBindSparseInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkBindSparseInfo(const VkBindSparseInfo* a, const VkBindSparseInfo* b,
+                                 OnFailCompareFunc onFail);
 
-void checkEqual_VkSparseImageFormatProperties(
-    const VkSparseImageFormatProperties* a,
-    const VkSparseImageFormatProperties* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSparseImageFormatProperties(const VkSparseImageFormatProperties* a,
+                                              const VkSparseImageFormatProperties* b,
+                                              OnFailCompareFunc onFail);
 
-void checkEqual_VkSparseImageMemoryRequirements(
-    const VkSparseImageMemoryRequirements* a,
-    const VkSparseImageMemoryRequirements* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSparseImageMemoryRequirements(const VkSparseImageMemoryRequirements* a,
+                                                const VkSparseImageMemoryRequirements* b,
+                                                OnFailCompareFunc onFail);
 
-void checkEqual_VkFenceCreateInfo(
-    const VkFenceCreateInfo* a,
-    const VkFenceCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkFenceCreateInfo(const VkFenceCreateInfo* a, const VkFenceCreateInfo* b,
+                                  OnFailCompareFunc onFail);
 
-void checkEqual_VkSemaphoreCreateInfo(
-    const VkSemaphoreCreateInfo* a,
-    const VkSemaphoreCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSemaphoreCreateInfo(const VkSemaphoreCreateInfo* a,
+                                      const VkSemaphoreCreateInfo* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkEventCreateInfo(
-    const VkEventCreateInfo* a,
-    const VkEventCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkEventCreateInfo(const VkEventCreateInfo* a, const VkEventCreateInfo* b,
+                                  OnFailCompareFunc onFail);
 
-void checkEqual_VkQueryPoolCreateInfo(
-    const VkQueryPoolCreateInfo* a,
-    const VkQueryPoolCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkQueryPoolCreateInfo(const VkQueryPoolCreateInfo* a,
+                                      const VkQueryPoolCreateInfo* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkBufferCreateInfo(
-    const VkBufferCreateInfo* a,
-    const VkBufferCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkBufferCreateInfo(const VkBufferCreateInfo* a, const VkBufferCreateInfo* b,
+                                   OnFailCompareFunc onFail);
 
-void checkEqual_VkBufferViewCreateInfo(
-    const VkBufferViewCreateInfo* a,
-    const VkBufferViewCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkBufferViewCreateInfo(const VkBufferViewCreateInfo* a,
+                                       const VkBufferViewCreateInfo* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkImageCreateInfo(
-    const VkImageCreateInfo* a,
-    const VkImageCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImageCreateInfo(const VkImageCreateInfo* a, const VkImageCreateInfo* b,
+                                  OnFailCompareFunc onFail);
 
-void checkEqual_VkSubresourceLayout(
-    const VkSubresourceLayout* a,
-    const VkSubresourceLayout* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSubresourceLayout(const VkSubresourceLayout* a, const VkSubresourceLayout* b,
+                                    OnFailCompareFunc onFail);
 
-void checkEqual_VkComponentMapping(
-    const VkComponentMapping* a,
-    const VkComponentMapping* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkComponentMapping(const VkComponentMapping* a, const VkComponentMapping* b,
+                                   OnFailCompareFunc onFail);
 
-void checkEqual_VkImageViewCreateInfo(
-    const VkImageViewCreateInfo* a,
-    const VkImageViewCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImageViewCreateInfo(const VkImageViewCreateInfo* a,
+                                      const VkImageViewCreateInfo* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkShaderModuleCreateInfo(
-    const VkShaderModuleCreateInfo* a,
-    const VkShaderModuleCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkShaderModuleCreateInfo(const VkShaderModuleCreateInfo* a,
+                                         const VkShaderModuleCreateInfo* b,
+                                         OnFailCompareFunc onFail);
 
-void checkEqual_VkPipelineCacheCreateInfo(
-    const VkPipelineCacheCreateInfo* a,
-    const VkPipelineCacheCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPipelineCacheCreateInfo(const VkPipelineCacheCreateInfo* a,
+                                          const VkPipelineCacheCreateInfo* b,
+                                          OnFailCompareFunc onFail);
 
-void checkEqual_VkSpecializationMapEntry(
-    const VkSpecializationMapEntry* a,
-    const VkSpecializationMapEntry* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSpecializationMapEntry(const VkSpecializationMapEntry* a,
+                                         const VkSpecializationMapEntry* b,
+                                         OnFailCompareFunc onFail);
 
-void checkEqual_VkSpecializationInfo(
-    const VkSpecializationInfo* a,
-    const VkSpecializationInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSpecializationInfo(const VkSpecializationInfo* a, const VkSpecializationInfo* b,
+                                     OnFailCompareFunc onFail);
 
-void checkEqual_VkPipelineShaderStageCreateInfo(
-    const VkPipelineShaderStageCreateInfo* a,
-    const VkPipelineShaderStageCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPipelineShaderStageCreateInfo(const VkPipelineShaderStageCreateInfo* a,
+                                                const VkPipelineShaderStageCreateInfo* b,
+                                                OnFailCompareFunc onFail);
 
-void checkEqual_VkComputePipelineCreateInfo(
-    const VkComputePipelineCreateInfo* a,
-    const VkComputePipelineCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkComputePipelineCreateInfo(const VkComputePipelineCreateInfo* a,
+                                            const VkComputePipelineCreateInfo* b,
+                                            OnFailCompareFunc onFail);
 
-void checkEqual_VkVertexInputBindingDescription(
-    const VkVertexInputBindingDescription* a,
-    const VkVertexInputBindingDescription* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVertexInputBindingDescription(const VkVertexInputBindingDescription* a,
+                                                const VkVertexInputBindingDescription* b,
+                                                OnFailCompareFunc onFail);
 
-void checkEqual_VkVertexInputAttributeDescription(
-    const VkVertexInputAttributeDescription* a,
-    const VkVertexInputAttributeDescription* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVertexInputAttributeDescription(const VkVertexInputAttributeDescription* a,
+                                                  const VkVertexInputAttributeDescription* b,
+                                                  OnFailCompareFunc onFail);
 
-void checkEqual_VkPipelineVertexInputStateCreateInfo(
-    const VkPipelineVertexInputStateCreateInfo* a,
-    const VkPipelineVertexInputStateCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPipelineVertexInputStateCreateInfo(const VkPipelineVertexInputStateCreateInfo* a,
+                                                     const VkPipelineVertexInputStateCreateInfo* b,
+                                                     OnFailCompareFunc onFail);
 
 void checkEqual_VkPipelineInputAssemblyStateCreateInfo(
     const VkPipelineInputAssemblyStateCreateInfo* a,
-    const VkPipelineInputAssemblyStateCreateInfo* b,
-    OnFailCompareFunc onFail);
+    const VkPipelineInputAssemblyStateCreateInfo* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPipelineTessellationStateCreateInfo(
-    const VkPipelineTessellationStateCreateInfo* a,
-    const VkPipelineTessellationStateCreateInfo* b,
+    const VkPipelineTessellationStateCreateInfo* a, const VkPipelineTessellationStateCreateInfo* b,
     OnFailCompareFunc onFail);
 
-void checkEqual_VkViewport(
-    const VkViewport* a,
-    const VkViewport* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkViewport(const VkViewport* a, const VkViewport* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkPipelineViewportStateCreateInfo(
-    const VkPipelineViewportStateCreateInfo* a,
-    const VkPipelineViewportStateCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPipelineViewportStateCreateInfo(const VkPipelineViewportStateCreateInfo* a,
+                                                  const VkPipelineViewportStateCreateInfo* b,
+                                                  OnFailCompareFunc onFail);
 
 void checkEqual_VkPipelineRasterizationStateCreateInfo(
     const VkPipelineRasterizationStateCreateInfo* a,
-    const VkPipelineRasterizationStateCreateInfo* b,
-    OnFailCompareFunc onFail);
+    const VkPipelineRasterizationStateCreateInfo* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkPipelineMultisampleStateCreateInfo(
-    const VkPipelineMultisampleStateCreateInfo* a,
-    const VkPipelineMultisampleStateCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPipelineMultisampleStateCreateInfo(const VkPipelineMultisampleStateCreateInfo* a,
+                                                     const VkPipelineMultisampleStateCreateInfo* b,
+                                                     OnFailCompareFunc onFail);
 
-void checkEqual_VkStencilOpState(
-    const VkStencilOpState* a,
-    const VkStencilOpState* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkStencilOpState(const VkStencilOpState* a, const VkStencilOpState* b,
+                                 OnFailCompareFunc onFail);
 
 void checkEqual_VkPipelineDepthStencilStateCreateInfo(
-    const VkPipelineDepthStencilStateCreateInfo* a,
-    const VkPipelineDepthStencilStateCreateInfo* b,
+    const VkPipelineDepthStencilStateCreateInfo* a, const VkPipelineDepthStencilStateCreateInfo* b,
     OnFailCompareFunc onFail);
 
-void checkEqual_VkPipelineColorBlendAttachmentState(
-    const VkPipelineColorBlendAttachmentState* a,
-    const VkPipelineColorBlendAttachmentState* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPipelineColorBlendAttachmentState(const VkPipelineColorBlendAttachmentState* a,
+                                                    const VkPipelineColorBlendAttachmentState* b,
+                                                    OnFailCompareFunc onFail);
 
-void checkEqual_VkPipelineColorBlendStateCreateInfo(
-    const VkPipelineColorBlendStateCreateInfo* a,
-    const VkPipelineColorBlendStateCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPipelineColorBlendStateCreateInfo(const VkPipelineColorBlendStateCreateInfo* a,
+                                                    const VkPipelineColorBlendStateCreateInfo* b,
+                                                    OnFailCompareFunc onFail);
 
-void checkEqual_VkPipelineDynamicStateCreateInfo(
-    const VkPipelineDynamicStateCreateInfo* a,
-    const VkPipelineDynamicStateCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPipelineDynamicStateCreateInfo(const VkPipelineDynamicStateCreateInfo* a,
+                                                 const VkPipelineDynamicStateCreateInfo* b,
+                                                 OnFailCompareFunc onFail);
 
-void checkEqual_VkGraphicsPipelineCreateInfo(
-    const VkGraphicsPipelineCreateInfo* a,
-    const VkGraphicsPipelineCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkGraphicsPipelineCreateInfo(const VkGraphicsPipelineCreateInfo* a,
+                                             const VkGraphicsPipelineCreateInfo* b,
+                                             OnFailCompareFunc onFail);
 
-void checkEqual_VkPushConstantRange(
-    const VkPushConstantRange* a,
-    const VkPushConstantRange* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPushConstantRange(const VkPushConstantRange* a, const VkPushConstantRange* b,
+                                    OnFailCompareFunc onFail);
 
-void checkEqual_VkPipelineLayoutCreateInfo(
-    const VkPipelineLayoutCreateInfo* a,
-    const VkPipelineLayoutCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPipelineLayoutCreateInfo(const VkPipelineLayoutCreateInfo* a,
+                                           const VkPipelineLayoutCreateInfo* b,
+                                           OnFailCompareFunc onFail);
 
-void checkEqual_VkSamplerCreateInfo(
-    const VkSamplerCreateInfo* a,
-    const VkSamplerCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSamplerCreateInfo(const VkSamplerCreateInfo* a, const VkSamplerCreateInfo* b,
+                                    OnFailCompareFunc onFail);
 
-void checkEqual_VkCopyDescriptorSet(
-    const VkCopyDescriptorSet* a,
-    const VkCopyDescriptorSet* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkCopyDescriptorSet(const VkCopyDescriptorSet* a, const VkCopyDescriptorSet* b,
+                                    OnFailCompareFunc onFail);
 
-void checkEqual_VkDescriptorBufferInfo(
-    const VkDescriptorBufferInfo* a,
-    const VkDescriptorBufferInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDescriptorBufferInfo(const VkDescriptorBufferInfo* a,
+                                       const VkDescriptorBufferInfo* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkDescriptorImageInfo(
-    const VkDescriptorImageInfo* a,
-    const VkDescriptorImageInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDescriptorImageInfo(const VkDescriptorImageInfo* a,
+                                      const VkDescriptorImageInfo* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkDescriptorPoolSize(
-    const VkDescriptorPoolSize* a,
-    const VkDescriptorPoolSize* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDescriptorPoolSize(const VkDescriptorPoolSize* a, const VkDescriptorPoolSize* b,
+                                     OnFailCompareFunc onFail);
 
-void checkEqual_VkDescriptorPoolCreateInfo(
-    const VkDescriptorPoolCreateInfo* a,
-    const VkDescriptorPoolCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDescriptorPoolCreateInfo(const VkDescriptorPoolCreateInfo* a,
+                                           const VkDescriptorPoolCreateInfo* b,
+                                           OnFailCompareFunc onFail);
 
-void checkEqual_VkDescriptorSetAllocateInfo(
-    const VkDescriptorSetAllocateInfo* a,
-    const VkDescriptorSetAllocateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDescriptorSetAllocateInfo(const VkDescriptorSetAllocateInfo* a,
+                                            const VkDescriptorSetAllocateInfo* b,
+                                            OnFailCompareFunc onFail);
 
-void checkEqual_VkDescriptorSetLayoutBinding(
-    const VkDescriptorSetLayoutBinding* a,
-    const VkDescriptorSetLayoutBinding* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDescriptorSetLayoutBinding(const VkDescriptorSetLayoutBinding* a,
+                                             const VkDescriptorSetLayoutBinding* b,
+                                             OnFailCompareFunc onFail);
 
-void checkEqual_VkDescriptorSetLayoutCreateInfo(
-    const VkDescriptorSetLayoutCreateInfo* a,
-    const VkDescriptorSetLayoutCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDescriptorSetLayoutCreateInfo(const VkDescriptorSetLayoutCreateInfo* a,
+                                                const VkDescriptorSetLayoutCreateInfo* b,
+                                                OnFailCompareFunc onFail);
 
-void checkEqual_VkWriteDescriptorSet(
-    const VkWriteDescriptorSet* a,
-    const VkWriteDescriptorSet* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkWriteDescriptorSet(const VkWriteDescriptorSet* a, const VkWriteDescriptorSet* b,
+                                     OnFailCompareFunc onFail);
 
-void checkEqual_VkAttachmentDescription(
-    const VkAttachmentDescription* a,
-    const VkAttachmentDescription* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkAttachmentDescription(const VkAttachmentDescription* a,
+                                        const VkAttachmentDescription* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkAttachmentReference(
-    const VkAttachmentReference* a,
-    const VkAttachmentReference* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkAttachmentReference(const VkAttachmentReference* a,
+                                      const VkAttachmentReference* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkFramebufferCreateInfo(
-    const VkFramebufferCreateInfo* a,
-    const VkFramebufferCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkFramebufferCreateInfo(const VkFramebufferCreateInfo* a,
+                                        const VkFramebufferCreateInfo* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkSubpassDescription(
-    const VkSubpassDescription* a,
-    const VkSubpassDescription* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSubpassDescription(const VkSubpassDescription* a, const VkSubpassDescription* b,
+                                     OnFailCompareFunc onFail);
 
-void checkEqual_VkSubpassDependency(
-    const VkSubpassDependency* a,
-    const VkSubpassDependency* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSubpassDependency(const VkSubpassDependency* a, const VkSubpassDependency* b,
+                                    OnFailCompareFunc onFail);
 
-void checkEqual_VkRenderPassCreateInfo(
-    const VkRenderPassCreateInfo* a,
-    const VkRenderPassCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkRenderPassCreateInfo(const VkRenderPassCreateInfo* a,
+                                       const VkRenderPassCreateInfo* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkCommandPoolCreateInfo(
-    const VkCommandPoolCreateInfo* a,
-    const VkCommandPoolCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkCommandPoolCreateInfo(const VkCommandPoolCreateInfo* a,
+                                        const VkCommandPoolCreateInfo* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkCommandBufferAllocateInfo(
-    const VkCommandBufferAllocateInfo* a,
-    const VkCommandBufferAllocateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkCommandBufferAllocateInfo(const VkCommandBufferAllocateInfo* a,
+                                            const VkCommandBufferAllocateInfo* b,
+                                            OnFailCompareFunc onFail);
 
-void checkEqual_VkCommandBufferInheritanceInfo(
-    const VkCommandBufferInheritanceInfo* a,
-    const VkCommandBufferInheritanceInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkCommandBufferInheritanceInfo(const VkCommandBufferInheritanceInfo* a,
+                                               const VkCommandBufferInheritanceInfo* b,
+                                               OnFailCompareFunc onFail);
 
-void checkEqual_VkCommandBufferBeginInfo(
-    const VkCommandBufferBeginInfo* a,
-    const VkCommandBufferBeginInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkCommandBufferBeginInfo(const VkCommandBufferBeginInfo* a,
+                                         const VkCommandBufferBeginInfo* b,
+                                         OnFailCompareFunc onFail);
 
-void checkEqual_VkBufferCopy(
-    const VkBufferCopy* a,
-    const VkBufferCopy* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkBufferCopy(const VkBufferCopy* a, const VkBufferCopy* b,
+                             OnFailCompareFunc onFail);
 
-void checkEqual_VkImageSubresourceLayers(
-    const VkImageSubresourceLayers* a,
-    const VkImageSubresourceLayers* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImageSubresourceLayers(const VkImageSubresourceLayers* a,
+                                         const VkImageSubresourceLayers* b,
+                                         OnFailCompareFunc onFail);
 
-void checkEqual_VkBufferImageCopy(
-    const VkBufferImageCopy* a,
-    const VkBufferImageCopy* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkBufferImageCopy(const VkBufferImageCopy* a, const VkBufferImageCopy* b,
+                                  OnFailCompareFunc onFail);
 
-void checkEqual_VkClearColorValue(
-    const VkClearColorValue* a,
-    const VkClearColorValue* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkClearColorValue(const VkClearColorValue* a, const VkClearColorValue* b,
+                                  OnFailCompareFunc onFail);
 
-void checkEqual_VkClearDepthStencilValue(
-    const VkClearDepthStencilValue* a,
-    const VkClearDepthStencilValue* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkClearDepthStencilValue(const VkClearDepthStencilValue* a,
+                                         const VkClearDepthStencilValue* b,
+                                         OnFailCompareFunc onFail);
 
-void checkEqual_VkClearValue(
-    const VkClearValue* a,
-    const VkClearValue* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkClearValue(const VkClearValue* a, const VkClearValue* b,
+                             OnFailCompareFunc onFail);
 
-void checkEqual_VkClearAttachment(
-    const VkClearAttachment* a,
-    const VkClearAttachment* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkClearAttachment(const VkClearAttachment* a, const VkClearAttachment* b,
+                                  OnFailCompareFunc onFail);
 
-void checkEqual_VkClearRect(
-    const VkClearRect* a,
-    const VkClearRect* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkClearRect(const VkClearRect* a, const VkClearRect* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkImageBlit(
-    const VkImageBlit* a,
-    const VkImageBlit* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImageBlit(const VkImageBlit* a, const VkImageBlit* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkImageCopy(
-    const VkImageCopy* a,
-    const VkImageCopy* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImageCopy(const VkImageCopy* a, const VkImageCopy* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkImageResolve(
-    const VkImageResolve* a,
-    const VkImageResolve* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImageResolve(const VkImageResolve* a, const VkImageResolve* b,
+                               OnFailCompareFunc onFail);
 
-void checkEqual_VkRenderPassBeginInfo(
-    const VkRenderPassBeginInfo* a,
-    const VkRenderPassBeginInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkRenderPassBeginInfo(const VkRenderPassBeginInfo* a,
+                                      const VkRenderPassBeginInfo* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_VERSION_1_1
-void checkEqual_VkPhysicalDeviceSubgroupProperties(
-    const VkPhysicalDeviceSubgroupProperties* a,
-    const VkPhysicalDeviceSubgroupProperties* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPhysicalDeviceSubgroupProperties(const VkPhysicalDeviceSubgroupProperties* a,
+                                                   const VkPhysicalDeviceSubgroupProperties* b,
+                                                   OnFailCompareFunc onFail);
 
-void checkEqual_VkBindBufferMemoryInfo(
-    const VkBindBufferMemoryInfo* a,
-    const VkBindBufferMemoryInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkBindBufferMemoryInfo(const VkBindBufferMemoryInfo* a,
+                                       const VkBindBufferMemoryInfo* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkBindImageMemoryInfo(
-    const VkBindImageMemoryInfo* a,
-    const VkBindImageMemoryInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkBindImageMemoryInfo(const VkBindImageMemoryInfo* a,
+                                      const VkBindImageMemoryInfo* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkPhysicalDevice16BitStorageFeatures(
-    const VkPhysicalDevice16BitStorageFeatures* a,
-    const VkPhysicalDevice16BitStorageFeatures* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPhysicalDevice16BitStorageFeatures(const VkPhysicalDevice16BitStorageFeatures* a,
+                                                     const VkPhysicalDevice16BitStorageFeatures* b,
+                                                     OnFailCompareFunc onFail);
 
-void checkEqual_VkMemoryDedicatedRequirements(
-    const VkMemoryDedicatedRequirements* a,
-    const VkMemoryDedicatedRequirements* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkMemoryDedicatedRequirements(const VkMemoryDedicatedRequirements* a,
+                                              const VkMemoryDedicatedRequirements* b,
+                                              OnFailCompareFunc onFail);
 
-void checkEqual_VkMemoryDedicatedAllocateInfo(
-    const VkMemoryDedicatedAllocateInfo* a,
-    const VkMemoryDedicatedAllocateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkMemoryDedicatedAllocateInfo(const VkMemoryDedicatedAllocateInfo* a,
+                                              const VkMemoryDedicatedAllocateInfo* b,
+                                              OnFailCompareFunc onFail);
 
-void checkEqual_VkMemoryAllocateFlagsInfo(
-    const VkMemoryAllocateFlagsInfo* a,
-    const VkMemoryAllocateFlagsInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkMemoryAllocateFlagsInfo(const VkMemoryAllocateFlagsInfo* a,
+                                          const VkMemoryAllocateFlagsInfo* b,
+                                          OnFailCompareFunc onFail);
 
-void checkEqual_VkDeviceGroupRenderPassBeginInfo(
-    const VkDeviceGroupRenderPassBeginInfo* a,
-    const VkDeviceGroupRenderPassBeginInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDeviceGroupRenderPassBeginInfo(const VkDeviceGroupRenderPassBeginInfo* a,
+                                                 const VkDeviceGroupRenderPassBeginInfo* b,
+                                                 OnFailCompareFunc onFail);
 
-void checkEqual_VkDeviceGroupCommandBufferBeginInfo(
-    const VkDeviceGroupCommandBufferBeginInfo* a,
-    const VkDeviceGroupCommandBufferBeginInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDeviceGroupCommandBufferBeginInfo(const VkDeviceGroupCommandBufferBeginInfo* a,
+                                                    const VkDeviceGroupCommandBufferBeginInfo* b,
+                                                    OnFailCompareFunc onFail);
 
-void checkEqual_VkDeviceGroupSubmitInfo(
-    const VkDeviceGroupSubmitInfo* a,
-    const VkDeviceGroupSubmitInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDeviceGroupSubmitInfo(const VkDeviceGroupSubmitInfo* a,
+                                        const VkDeviceGroupSubmitInfo* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkDeviceGroupBindSparseInfo(
-    const VkDeviceGroupBindSparseInfo* a,
-    const VkDeviceGroupBindSparseInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDeviceGroupBindSparseInfo(const VkDeviceGroupBindSparseInfo* a,
+                                            const VkDeviceGroupBindSparseInfo* b,
+                                            OnFailCompareFunc onFail);
 
-void checkEqual_VkBindBufferMemoryDeviceGroupInfo(
-    const VkBindBufferMemoryDeviceGroupInfo* a,
-    const VkBindBufferMemoryDeviceGroupInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkBindBufferMemoryDeviceGroupInfo(const VkBindBufferMemoryDeviceGroupInfo* a,
+                                                  const VkBindBufferMemoryDeviceGroupInfo* b,
+                                                  OnFailCompareFunc onFail);
 
-void checkEqual_VkBindImageMemoryDeviceGroupInfo(
-    const VkBindImageMemoryDeviceGroupInfo* a,
-    const VkBindImageMemoryDeviceGroupInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkBindImageMemoryDeviceGroupInfo(const VkBindImageMemoryDeviceGroupInfo* a,
+                                                 const VkBindImageMemoryDeviceGroupInfo* b,
+                                                 OnFailCompareFunc onFail);
 
-void checkEqual_VkPhysicalDeviceGroupProperties(
-    const VkPhysicalDeviceGroupProperties* a,
-    const VkPhysicalDeviceGroupProperties* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPhysicalDeviceGroupProperties(const VkPhysicalDeviceGroupProperties* a,
+                                                const VkPhysicalDeviceGroupProperties* b,
+                                                OnFailCompareFunc onFail);
 
-void checkEqual_VkDeviceGroupDeviceCreateInfo(
-    const VkDeviceGroupDeviceCreateInfo* a,
-    const VkDeviceGroupDeviceCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDeviceGroupDeviceCreateInfo(const VkDeviceGroupDeviceCreateInfo* a,
+                                              const VkDeviceGroupDeviceCreateInfo* b,
+                                              OnFailCompareFunc onFail);
 
-void checkEqual_VkBufferMemoryRequirementsInfo2(
-    const VkBufferMemoryRequirementsInfo2* a,
-    const VkBufferMemoryRequirementsInfo2* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkBufferMemoryRequirementsInfo2(const VkBufferMemoryRequirementsInfo2* a,
+                                                const VkBufferMemoryRequirementsInfo2* b,
+                                                OnFailCompareFunc onFail);
 
-void checkEqual_VkImageMemoryRequirementsInfo2(
-    const VkImageMemoryRequirementsInfo2* a,
-    const VkImageMemoryRequirementsInfo2* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImageMemoryRequirementsInfo2(const VkImageMemoryRequirementsInfo2* a,
+                                               const VkImageMemoryRequirementsInfo2* b,
+                                               OnFailCompareFunc onFail);
 
-void checkEqual_VkImageSparseMemoryRequirementsInfo2(
-    const VkImageSparseMemoryRequirementsInfo2* a,
-    const VkImageSparseMemoryRequirementsInfo2* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImageSparseMemoryRequirementsInfo2(const VkImageSparseMemoryRequirementsInfo2* a,
+                                                     const VkImageSparseMemoryRequirementsInfo2* b,
+                                                     OnFailCompareFunc onFail);
 
-void checkEqual_VkMemoryRequirements2(
-    const VkMemoryRequirements2* a,
-    const VkMemoryRequirements2* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkMemoryRequirements2(const VkMemoryRequirements2* a,
+                                      const VkMemoryRequirements2* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkSparseImageMemoryRequirements2(
-    const VkSparseImageMemoryRequirements2* a,
-    const VkSparseImageMemoryRequirements2* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSparseImageMemoryRequirements2(const VkSparseImageMemoryRequirements2* a,
+                                                 const VkSparseImageMemoryRequirements2* b,
+                                                 OnFailCompareFunc onFail);
 
-void checkEqual_VkPhysicalDeviceFeatures2(
-    const VkPhysicalDeviceFeatures2* a,
-    const VkPhysicalDeviceFeatures2* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPhysicalDeviceFeatures2(const VkPhysicalDeviceFeatures2* a,
+                                          const VkPhysicalDeviceFeatures2* b,
+                                          OnFailCompareFunc onFail);
 
-void checkEqual_VkPhysicalDeviceProperties2(
-    const VkPhysicalDeviceProperties2* a,
-    const VkPhysicalDeviceProperties2* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPhysicalDeviceProperties2(const VkPhysicalDeviceProperties2* a,
+                                            const VkPhysicalDeviceProperties2* b,
+                                            OnFailCompareFunc onFail);
 
-void checkEqual_VkFormatProperties2(
-    const VkFormatProperties2* a,
-    const VkFormatProperties2* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkFormatProperties2(const VkFormatProperties2* a, const VkFormatProperties2* b,
+                                    OnFailCompareFunc onFail);
 
-void checkEqual_VkImageFormatProperties2(
-    const VkImageFormatProperties2* a,
-    const VkImageFormatProperties2* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImageFormatProperties2(const VkImageFormatProperties2* a,
+                                         const VkImageFormatProperties2* b,
+                                         OnFailCompareFunc onFail);
 
-void checkEqual_VkPhysicalDeviceImageFormatInfo2(
-    const VkPhysicalDeviceImageFormatInfo2* a,
-    const VkPhysicalDeviceImageFormatInfo2* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPhysicalDeviceImageFormatInfo2(const VkPhysicalDeviceImageFormatInfo2* a,
+                                                 const VkPhysicalDeviceImageFormatInfo2* b,
+                                                 OnFailCompareFunc onFail);
 
-void checkEqual_VkQueueFamilyProperties2(
-    const VkQueueFamilyProperties2* a,
-    const VkQueueFamilyProperties2* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkQueueFamilyProperties2(const VkQueueFamilyProperties2* a,
+                                         const VkQueueFamilyProperties2* b,
+                                         OnFailCompareFunc onFail);
 
-void checkEqual_VkPhysicalDeviceMemoryProperties2(
-    const VkPhysicalDeviceMemoryProperties2* a,
-    const VkPhysicalDeviceMemoryProperties2* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPhysicalDeviceMemoryProperties2(const VkPhysicalDeviceMemoryProperties2* a,
+                                                  const VkPhysicalDeviceMemoryProperties2* b,
+                                                  OnFailCompareFunc onFail);
 
-void checkEqual_VkSparseImageFormatProperties2(
-    const VkSparseImageFormatProperties2* a,
-    const VkSparseImageFormatProperties2* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSparseImageFormatProperties2(const VkSparseImageFormatProperties2* a,
+                                               const VkSparseImageFormatProperties2* b,
+                                               OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceSparseImageFormatInfo2(
     const VkPhysicalDeviceSparseImageFormatInfo2* a,
-    const VkPhysicalDeviceSparseImageFormatInfo2* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceSparseImageFormatInfo2* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDevicePointClippingProperties(
     const VkPhysicalDevicePointClippingProperties* a,
-    const VkPhysicalDevicePointClippingProperties* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDevicePointClippingProperties* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkInputAttachmentAspectReference(
-    const VkInputAttachmentAspectReference* a,
-    const VkInputAttachmentAspectReference* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkInputAttachmentAspectReference(const VkInputAttachmentAspectReference* a,
+                                                 const VkInputAttachmentAspectReference* b,
+                                                 OnFailCompareFunc onFail);
 
 void checkEqual_VkRenderPassInputAttachmentAspectCreateInfo(
     const VkRenderPassInputAttachmentAspectCreateInfo* a,
-    const VkRenderPassInputAttachmentAspectCreateInfo* b,
-    OnFailCompareFunc onFail);
+    const VkRenderPassInputAttachmentAspectCreateInfo* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkImageViewUsageCreateInfo(
-    const VkImageViewUsageCreateInfo* a,
-    const VkImageViewUsageCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImageViewUsageCreateInfo(const VkImageViewUsageCreateInfo* a,
+                                           const VkImageViewUsageCreateInfo* b,
+                                           OnFailCompareFunc onFail);
 
 void checkEqual_VkPipelineTessellationDomainOriginStateCreateInfo(
     const VkPipelineTessellationDomainOriginStateCreateInfo* a,
-    const VkPipelineTessellationDomainOriginStateCreateInfo* b,
-    OnFailCompareFunc onFail);
+    const VkPipelineTessellationDomainOriginStateCreateInfo* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkRenderPassMultiviewCreateInfo(
-    const VkRenderPassMultiviewCreateInfo* a,
-    const VkRenderPassMultiviewCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkRenderPassMultiviewCreateInfo(const VkRenderPassMultiviewCreateInfo* a,
+                                                const VkRenderPassMultiviewCreateInfo* b,
+                                                OnFailCompareFunc onFail);
 
-void checkEqual_VkPhysicalDeviceMultiviewFeatures(
-    const VkPhysicalDeviceMultiviewFeatures* a,
-    const VkPhysicalDeviceMultiviewFeatures* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPhysicalDeviceMultiviewFeatures(const VkPhysicalDeviceMultiviewFeatures* a,
+                                                  const VkPhysicalDeviceMultiviewFeatures* b,
+                                                  OnFailCompareFunc onFail);
 
-void checkEqual_VkPhysicalDeviceMultiviewProperties(
-    const VkPhysicalDeviceMultiviewProperties* a,
-    const VkPhysicalDeviceMultiviewProperties* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPhysicalDeviceMultiviewProperties(const VkPhysicalDeviceMultiviewProperties* a,
+                                                    const VkPhysicalDeviceMultiviewProperties* b,
+                                                    OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceVariablePointersFeatures(
     const VkPhysicalDeviceVariablePointersFeatures* a,
-    const VkPhysicalDeviceVariablePointersFeatures* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceVariablePointersFeatures* b, OnFailCompareFunc onFail);
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceVariablePointersFeatures, checkEqual_VkPhysicalDeviceVariablePointerFeatures)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceVariablePointersFeatures,
+                      checkEqual_VkPhysicalDeviceVariablePointerFeatures)
 
 void checkEqual_VkPhysicalDeviceProtectedMemoryFeatures(
     const VkPhysicalDeviceProtectedMemoryFeatures* a,
-    const VkPhysicalDeviceProtectedMemoryFeatures* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceProtectedMemoryFeatures* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceProtectedMemoryProperties(
     const VkPhysicalDeviceProtectedMemoryProperties* a,
-    const VkPhysicalDeviceProtectedMemoryProperties* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceProtectedMemoryProperties* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkDeviceQueueInfo2(
-    const VkDeviceQueueInfo2* a,
-    const VkDeviceQueueInfo2* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDeviceQueueInfo2(const VkDeviceQueueInfo2* a, const VkDeviceQueueInfo2* b,
+                                   OnFailCompareFunc onFail);
 
-void checkEqual_VkProtectedSubmitInfo(
-    const VkProtectedSubmitInfo* a,
-    const VkProtectedSubmitInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkProtectedSubmitInfo(const VkProtectedSubmitInfo* a,
+                                      const VkProtectedSubmitInfo* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkSamplerYcbcrConversionCreateInfo(
-    const VkSamplerYcbcrConversionCreateInfo* a,
-    const VkSamplerYcbcrConversionCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSamplerYcbcrConversionCreateInfo(const VkSamplerYcbcrConversionCreateInfo* a,
+                                                   const VkSamplerYcbcrConversionCreateInfo* b,
+                                                   OnFailCompareFunc onFail);
 
-void checkEqual_VkSamplerYcbcrConversionInfo(
-    const VkSamplerYcbcrConversionInfo* a,
-    const VkSamplerYcbcrConversionInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSamplerYcbcrConversionInfo(const VkSamplerYcbcrConversionInfo* a,
+                                             const VkSamplerYcbcrConversionInfo* b,
+                                             OnFailCompareFunc onFail);
 
-void checkEqual_VkBindImagePlaneMemoryInfo(
-    const VkBindImagePlaneMemoryInfo* a,
-    const VkBindImagePlaneMemoryInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkBindImagePlaneMemoryInfo(const VkBindImagePlaneMemoryInfo* a,
+                                           const VkBindImagePlaneMemoryInfo* b,
+                                           OnFailCompareFunc onFail);
 
-void checkEqual_VkImagePlaneMemoryRequirementsInfo(
-    const VkImagePlaneMemoryRequirementsInfo* a,
-    const VkImagePlaneMemoryRequirementsInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImagePlaneMemoryRequirementsInfo(const VkImagePlaneMemoryRequirementsInfo* a,
+                                                   const VkImagePlaneMemoryRequirementsInfo* b,
+                                                   OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
     const VkPhysicalDeviceSamplerYcbcrConversionFeatures* a,
-    const VkPhysicalDeviceSamplerYcbcrConversionFeatures* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceSamplerYcbcrConversionFeatures* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkSamplerYcbcrConversionImageFormatProperties(
     const VkSamplerYcbcrConversionImageFormatProperties* a,
-    const VkSamplerYcbcrConversionImageFormatProperties* b,
-    OnFailCompareFunc onFail);
+    const VkSamplerYcbcrConversionImageFormatProperties* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkDescriptorUpdateTemplateEntry(
-    const VkDescriptorUpdateTemplateEntry* a,
-    const VkDescriptorUpdateTemplateEntry* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDescriptorUpdateTemplateEntry(const VkDescriptorUpdateTemplateEntry* a,
+                                                const VkDescriptorUpdateTemplateEntry* b,
+                                                OnFailCompareFunc onFail);
 
-void checkEqual_VkDescriptorUpdateTemplateCreateInfo(
-    const VkDescriptorUpdateTemplateCreateInfo* a,
-    const VkDescriptorUpdateTemplateCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDescriptorUpdateTemplateCreateInfo(const VkDescriptorUpdateTemplateCreateInfo* a,
+                                                     const VkDescriptorUpdateTemplateCreateInfo* b,
+                                                     OnFailCompareFunc onFail);
 
-void checkEqual_VkExternalMemoryProperties(
-    const VkExternalMemoryProperties* a,
-    const VkExternalMemoryProperties* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkExternalMemoryProperties(const VkExternalMemoryProperties* a,
+                                           const VkExternalMemoryProperties* b,
+                                           OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceExternalImageFormatInfo(
     const VkPhysicalDeviceExternalImageFormatInfo* a,
-    const VkPhysicalDeviceExternalImageFormatInfo* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceExternalImageFormatInfo* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkExternalImageFormatProperties(
-    const VkExternalImageFormatProperties* a,
-    const VkExternalImageFormatProperties* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkExternalImageFormatProperties(const VkExternalImageFormatProperties* a,
+                                                const VkExternalImageFormatProperties* b,
+                                                OnFailCompareFunc onFail);
 
-void checkEqual_VkPhysicalDeviceExternalBufferInfo(
-    const VkPhysicalDeviceExternalBufferInfo* a,
-    const VkPhysicalDeviceExternalBufferInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPhysicalDeviceExternalBufferInfo(const VkPhysicalDeviceExternalBufferInfo* a,
+                                                   const VkPhysicalDeviceExternalBufferInfo* b,
+                                                   OnFailCompareFunc onFail);
 
-void checkEqual_VkExternalBufferProperties(
-    const VkExternalBufferProperties* a,
-    const VkExternalBufferProperties* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkExternalBufferProperties(const VkExternalBufferProperties* a,
+                                           const VkExternalBufferProperties* b,
+                                           OnFailCompareFunc onFail);
 
-void checkEqual_VkPhysicalDeviceIDProperties(
-    const VkPhysicalDeviceIDProperties* a,
-    const VkPhysicalDeviceIDProperties* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPhysicalDeviceIDProperties(const VkPhysicalDeviceIDProperties* a,
+                                             const VkPhysicalDeviceIDProperties* b,
+                                             OnFailCompareFunc onFail);
 
-void checkEqual_VkExternalMemoryImageCreateInfo(
-    const VkExternalMemoryImageCreateInfo* a,
-    const VkExternalMemoryImageCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkExternalMemoryImageCreateInfo(const VkExternalMemoryImageCreateInfo* a,
+                                                const VkExternalMemoryImageCreateInfo* b,
+                                                OnFailCompareFunc onFail);
 
-void checkEqual_VkExternalMemoryBufferCreateInfo(
-    const VkExternalMemoryBufferCreateInfo* a,
-    const VkExternalMemoryBufferCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkExternalMemoryBufferCreateInfo(const VkExternalMemoryBufferCreateInfo* a,
+                                                 const VkExternalMemoryBufferCreateInfo* b,
+                                                 OnFailCompareFunc onFail);
 
-void checkEqual_VkExportMemoryAllocateInfo(
-    const VkExportMemoryAllocateInfo* a,
-    const VkExportMemoryAllocateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkExportMemoryAllocateInfo(const VkExportMemoryAllocateInfo* a,
+                                           const VkExportMemoryAllocateInfo* b,
+                                           OnFailCompareFunc onFail);
 
-void checkEqual_VkPhysicalDeviceExternalFenceInfo(
-    const VkPhysicalDeviceExternalFenceInfo* a,
-    const VkPhysicalDeviceExternalFenceInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPhysicalDeviceExternalFenceInfo(const VkPhysicalDeviceExternalFenceInfo* a,
+                                                  const VkPhysicalDeviceExternalFenceInfo* b,
+                                                  OnFailCompareFunc onFail);
 
-void checkEqual_VkExternalFenceProperties(
-    const VkExternalFenceProperties* a,
-    const VkExternalFenceProperties* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkExternalFenceProperties(const VkExternalFenceProperties* a,
+                                          const VkExternalFenceProperties* b,
+                                          OnFailCompareFunc onFail);
 
-void checkEqual_VkExportFenceCreateInfo(
-    const VkExportFenceCreateInfo* a,
-    const VkExportFenceCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkExportFenceCreateInfo(const VkExportFenceCreateInfo* a,
+                                        const VkExportFenceCreateInfo* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkExportSemaphoreCreateInfo(
-    const VkExportSemaphoreCreateInfo* a,
-    const VkExportSemaphoreCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkExportSemaphoreCreateInfo(const VkExportSemaphoreCreateInfo* a,
+                                            const VkExportSemaphoreCreateInfo* b,
+                                            OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceExternalSemaphoreInfo(
-    const VkPhysicalDeviceExternalSemaphoreInfo* a,
-    const VkPhysicalDeviceExternalSemaphoreInfo* b,
+    const VkPhysicalDeviceExternalSemaphoreInfo* a, const VkPhysicalDeviceExternalSemaphoreInfo* b,
     OnFailCompareFunc onFail);
 
-void checkEqual_VkExternalSemaphoreProperties(
-    const VkExternalSemaphoreProperties* a,
-    const VkExternalSemaphoreProperties* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkExternalSemaphoreProperties(const VkExternalSemaphoreProperties* a,
+                                              const VkExternalSemaphoreProperties* b,
+                                              OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceMaintenance3Properties(
     const VkPhysicalDeviceMaintenance3Properties* a,
-    const VkPhysicalDeviceMaintenance3Properties* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceMaintenance3Properties* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkDescriptorSetLayoutSupport(
-    const VkDescriptorSetLayoutSupport* a,
-    const VkDescriptorSetLayoutSupport* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDescriptorSetLayoutSupport(const VkDescriptorSetLayoutSupport* a,
+                                             const VkDescriptorSetLayoutSupport* b,
+                                             OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceShaderDrawParametersFeatures(
     const VkPhysicalDeviceShaderDrawParametersFeatures* a,
-    const VkPhysicalDeviceShaderDrawParametersFeatures* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceShaderDrawParametersFeatures* b, OnFailCompareFunc onFail);
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceShaderDrawParametersFeatures, checkEqual_VkPhysicalDeviceShaderDrawParameterFeatures)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceShaderDrawParametersFeatures,
+                      checkEqual_VkPhysicalDeviceShaderDrawParameterFeatures)
 
 #endif
 #ifdef VK_VERSION_1_2
-void checkEqual_VkPhysicalDeviceVulkan11Features(
-    const VkPhysicalDeviceVulkan11Features* a,
-    const VkPhysicalDeviceVulkan11Features* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPhysicalDeviceVulkan11Features(const VkPhysicalDeviceVulkan11Features* a,
+                                                 const VkPhysicalDeviceVulkan11Features* b,
+                                                 OnFailCompareFunc onFail);
 
-void checkEqual_VkPhysicalDeviceVulkan11Properties(
-    const VkPhysicalDeviceVulkan11Properties* a,
-    const VkPhysicalDeviceVulkan11Properties* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPhysicalDeviceVulkan11Properties(const VkPhysicalDeviceVulkan11Properties* a,
+                                                   const VkPhysicalDeviceVulkan11Properties* b,
+                                                   OnFailCompareFunc onFail);
 
-void checkEqual_VkPhysicalDeviceVulkan12Features(
-    const VkPhysicalDeviceVulkan12Features* a,
-    const VkPhysicalDeviceVulkan12Features* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPhysicalDeviceVulkan12Features(const VkPhysicalDeviceVulkan12Features* a,
+                                                 const VkPhysicalDeviceVulkan12Features* b,
+                                                 OnFailCompareFunc onFail);
 
-void checkEqual_VkConformanceVersion(
-    const VkConformanceVersion* a,
-    const VkConformanceVersion* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkConformanceVersion(const VkConformanceVersion* a, const VkConformanceVersion* b,
+                                     OnFailCompareFunc onFail);
 
-void checkEqual_VkPhysicalDeviceVulkan12Properties(
-    const VkPhysicalDeviceVulkan12Properties* a,
-    const VkPhysicalDeviceVulkan12Properties* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPhysicalDeviceVulkan12Properties(const VkPhysicalDeviceVulkan12Properties* a,
+                                                   const VkPhysicalDeviceVulkan12Properties* b,
+                                                   OnFailCompareFunc onFail);
 
-void checkEqual_VkImageFormatListCreateInfo(
-    const VkImageFormatListCreateInfo* a,
-    const VkImageFormatListCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImageFormatListCreateInfo(const VkImageFormatListCreateInfo* a,
+                                            const VkImageFormatListCreateInfo* b,
+                                            OnFailCompareFunc onFail);
 
-void checkEqual_VkAttachmentDescription2(
-    const VkAttachmentDescription2* a,
-    const VkAttachmentDescription2* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkAttachmentDescription2(const VkAttachmentDescription2* a,
+                                         const VkAttachmentDescription2* b,
+                                         OnFailCompareFunc onFail);
 
-void checkEqual_VkAttachmentReference2(
-    const VkAttachmentReference2* a,
-    const VkAttachmentReference2* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkAttachmentReference2(const VkAttachmentReference2* a,
+                                       const VkAttachmentReference2* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkSubpassDescription2(
-    const VkSubpassDescription2* a,
-    const VkSubpassDescription2* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSubpassDescription2(const VkSubpassDescription2* a,
+                                      const VkSubpassDescription2* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkSubpassDependency2(
-    const VkSubpassDependency2* a,
-    const VkSubpassDependency2* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSubpassDependency2(const VkSubpassDependency2* a, const VkSubpassDependency2* b,
+                                     OnFailCompareFunc onFail);
 
-void checkEqual_VkRenderPassCreateInfo2(
-    const VkRenderPassCreateInfo2* a,
-    const VkRenderPassCreateInfo2* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkRenderPassCreateInfo2(const VkRenderPassCreateInfo2* a,
+                                        const VkRenderPassCreateInfo2* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkSubpassBeginInfo(
-    const VkSubpassBeginInfo* a,
-    const VkSubpassBeginInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSubpassBeginInfo(const VkSubpassBeginInfo* a, const VkSubpassBeginInfo* b,
+                                   OnFailCompareFunc onFail);
 
-void checkEqual_VkSubpassEndInfo(
-    const VkSubpassEndInfo* a,
-    const VkSubpassEndInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSubpassEndInfo(const VkSubpassEndInfo* a, const VkSubpassEndInfo* b,
+                                 OnFailCompareFunc onFail);
 
-void checkEqual_VkPhysicalDevice8BitStorageFeatures(
-    const VkPhysicalDevice8BitStorageFeatures* a,
-    const VkPhysicalDevice8BitStorageFeatures* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPhysicalDevice8BitStorageFeatures(const VkPhysicalDevice8BitStorageFeatures* a,
+                                                    const VkPhysicalDevice8BitStorageFeatures* b,
+                                                    OnFailCompareFunc onFail);
 
-void checkEqual_VkPhysicalDeviceDriverProperties(
-    const VkPhysicalDeviceDriverProperties* a,
-    const VkPhysicalDeviceDriverProperties* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPhysicalDeviceDriverProperties(const VkPhysicalDeviceDriverProperties* a,
+                                                 const VkPhysicalDeviceDriverProperties* b,
+                                                 OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceShaderAtomicInt64Features(
     const VkPhysicalDeviceShaderAtomicInt64Features* a,
-    const VkPhysicalDeviceShaderAtomicInt64Features* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceShaderAtomicInt64Features* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceShaderFloat16Int8Features(
     const VkPhysicalDeviceShaderFloat16Int8Features* a,
-    const VkPhysicalDeviceShaderFloat16Int8Features* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceShaderFloat16Int8Features* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceFloatControlsProperties(
     const VkPhysicalDeviceFloatControlsProperties* a,
-    const VkPhysicalDeviceFloatControlsProperties* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceFloatControlsProperties* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkDescriptorSetLayoutBindingFlagsCreateInfo(
     const VkDescriptorSetLayoutBindingFlagsCreateInfo* a,
-    const VkDescriptorSetLayoutBindingFlagsCreateInfo* b,
-    OnFailCompareFunc onFail);
+    const VkDescriptorSetLayoutBindingFlagsCreateInfo* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceDescriptorIndexingFeatures(
     const VkPhysicalDeviceDescriptorIndexingFeatures* a,
-    const VkPhysicalDeviceDescriptorIndexingFeatures* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceDescriptorIndexingFeatures* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceDescriptorIndexingProperties(
     const VkPhysicalDeviceDescriptorIndexingProperties* a,
-    const VkPhysicalDeviceDescriptorIndexingProperties* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceDescriptorIndexingProperties* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkDescriptorSetVariableDescriptorCountAllocateInfo(
     const VkDescriptorSetVariableDescriptorCountAllocateInfo* a,
-    const VkDescriptorSetVariableDescriptorCountAllocateInfo* b,
-    OnFailCompareFunc onFail);
+    const VkDescriptorSetVariableDescriptorCountAllocateInfo* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkDescriptorSetVariableDescriptorCountLayoutSupport(
     const VkDescriptorSetVariableDescriptorCountLayoutSupport* a,
-    const VkDescriptorSetVariableDescriptorCountLayoutSupport* b,
-    OnFailCompareFunc onFail);
+    const VkDescriptorSetVariableDescriptorCountLayoutSupport* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkSubpassDescriptionDepthStencilResolve(
     const VkSubpassDescriptionDepthStencilResolve* a,
-    const VkSubpassDescriptionDepthStencilResolve* b,
-    OnFailCompareFunc onFail);
+    const VkSubpassDescriptionDepthStencilResolve* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceDepthStencilResolveProperties(
     const VkPhysicalDeviceDepthStencilResolveProperties* a,
-    const VkPhysicalDeviceDepthStencilResolveProperties* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceDepthStencilResolveProperties* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceScalarBlockLayoutFeatures(
     const VkPhysicalDeviceScalarBlockLayoutFeatures* a,
-    const VkPhysicalDeviceScalarBlockLayoutFeatures* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceScalarBlockLayoutFeatures* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkImageStencilUsageCreateInfo(
-    const VkImageStencilUsageCreateInfo* a,
-    const VkImageStencilUsageCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImageStencilUsageCreateInfo(const VkImageStencilUsageCreateInfo* a,
+                                              const VkImageStencilUsageCreateInfo* b,
+                                              OnFailCompareFunc onFail);
 
-void checkEqual_VkSamplerReductionModeCreateInfo(
-    const VkSamplerReductionModeCreateInfo* a,
-    const VkSamplerReductionModeCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSamplerReductionModeCreateInfo(const VkSamplerReductionModeCreateInfo* a,
+                                                 const VkSamplerReductionModeCreateInfo* b,
+                                                 OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceSamplerFilterMinmaxProperties(
     const VkPhysicalDeviceSamplerFilterMinmaxProperties* a,
-    const VkPhysicalDeviceSamplerFilterMinmaxProperties* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceSamplerFilterMinmaxProperties* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceVulkanMemoryModelFeatures(
     const VkPhysicalDeviceVulkanMemoryModelFeatures* a,
-    const VkPhysicalDeviceVulkanMemoryModelFeatures* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceVulkanMemoryModelFeatures* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceImagelessFramebufferFeatures(
     const VkPhysicalDeviceImagelessFramebufferFeatures* a,
-    const VkPhysicalDeviceImagelessFramebufferFeatures* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceImagelessFramebufferFeatures* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkFramebufferAttachmentImageInfo(
-    const VkFramebufferAttachmentImageInfo* a,
-    const VkFramebufferAttachmentImageInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkFramebufferAttachmentImageInfo(const VkFramebufferAttachmentImageInfo* a,
+                                                 const VkFramebufferAttachmentImageInfo* b,
+                                                 OnFailCompareFunc onFail);
 
-void checkEqual_VkFramebufferAttachmentsCreateInfo(
-    const VkFramebufferAttachmentsCreateInfo* a,
-    const VkFramebufferAttachmentsCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkFramebufferAttachmentsCreateInfo(const VkFramebufferAttachmentsCreateInfo* a,
+                                                   const VkFramebufferAttachmentsCreateInfo* b,
+                                                   OnFailCompareFunc onFail);
 
-void checkEqual_VkRenderPassAttachmentBeginInfo(
-    const VkRenderPassAttachmentBeginInfo* a,
-    const VkRenderPassAttachmentBeginInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkRenderPassAttachmentBeginInfo(const VkRenderPassAttachmentBeginInfo* a,
+                                                const VkRenderPassAttachmentBeginInfo* b,
+                                                OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(
     const VkPhysicalDeviceUniformBufferStandardLayoutFeatures* a,
-    const VkPhysicalDeviceUniformBufferStandardLayoutFeatures* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceUniformBufferStandardLayoutFeatures* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(
     const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* a,
-    const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(
     const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* a,
-    const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkAttachmentReferenceStencilLayout(
-    const VkAttachmentReferenceStencilLayout* a,
-    const VkAttachmentReferenceStencilLayout* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkAttachmentReferenceStencilLayout(const VkAttachmentReferenceStencilLayout* a,
+                                                   const VkAttachmentReferenceStencilLayout* b,
+                                                   OnFailCompareFunc onFail);
 
-void checkEqual_VkAttachmentDescriptionStencilLayout(
-    const VkAttachmentDescriptionStencilLayout* a,
-    const VkAttachmentDescriptionStencilLayout* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkAttachmentDescriptionStencilLayout(const VkAttachmentDescriptionStencilLayout* a,
+                                                     const VkAttachmentDescriptionStencilLayout* b,
+                                                     OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceHostQueryResetFeatures(
     const VkPhysicalDeviceHostQueryResetFeatures* a,
-    const VkPhysicalDeviceHostQueryResetFeatures* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceHostQueryResetFeatures* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceTimelineSemaphoreFeatures(
     const VkPhysicalDeviceTimelineSemaphoreFeatures* a,
-    const VkPhysicalDeviceTimelineSemaphoreFeatures* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceTimelineSemaphoreFeatures* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceTimelineSemaphoreProperties(
     const VkPhysicalDeviceTimelineSemaphoreProperties* a,
-    const VkPhysicalDeviceTimelineSemaphoreProperties* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceTimelineSemaphoreProperties* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkSemaphoreTypeCreateInfo(
-    const VkSemaphoreTypeCreateInfo* a,
-    const VkSemaphoreTypeCreateInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSemaphoreTypeCreateInfo(const VkSemaphoreTypeCreateInfo* a,
+                                          const VkSemaphoreTypeCreateInfo* b,
+                                          OnFailCompareFunc onFail);
 
-void checkEqual_VkTimelineSemaphoreSubmitInfo(
-    const VkTimelineSemaphoreSubmitInfo* a,
-    const VkTimelineSemaphoreSubmitInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkTimelineSemaphoreSubmitInfo(const VkTimelineSemaphoreSubmitInfo* a,
+                                              const VkTimelineSemaphoreSubmitInfo* b,
+                                              OnFailCompareFunc onFail);
 
-void checkEqual_VkSemaphoreWaitInfo(
-    const VkSemaphoreWaitInfo* a,
-    const VkSemaphoreWaitInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSemaphoreWaitInfo(const VkSemaphoreWaitInfo* a, const VkSemaphoreWaitInfo* b,
+                                    OnFailCompareFunc onFail);
 
-void checkEqual_VkSemaphoreSignalInfo(
-    const VkSemaphoreSignalInfo* a,
-    const VkSemaphoreSignalInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSemaphoreSignalInfo(const VkSemaphoreSignalInfo* a,
+                                      const VkSemaphoreSignalInfo* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceBufferDeviceAddressFeatures(
     const VkPhysicalDeviceBufferDeviceAddressFeatures* a,
-    const VkPhysicalDeviceBufferDeviceAddressFeatures* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceBufferDeviceAddressFeatures* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkBufferDeviceAddressInfo(
-    const VkBufferDeviceAddressInfo* a,
-    const VkBufferDeviceAddressInfo* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkBufferDeviceAddressInfo(const VkBufferDeviceAddressInfo* a,
+                                          const VkBufferDeviceAddressInfo* b,
+                                          OnFailCompareFunc onFail);
 
 void checkEqual_VkBufferOpaqueCaptureAddressCreateInfo(
     const VkBufferOpaqueCaptureAddressCreateInfo* a,
-    const VkBufferOpaqueCaptureAddressCreateInfo* b,
-    OnFailCompareFunc onFail);
+    const VkBufferOpaqueCaptureAddressCreateInfo* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkMemoryOpaqueCaptureAddressAllocateInfo(
     const VkMemoryOpaqueCaptureAddressAllocateInfo* a,
-    const VkMemoryOpaqueCaptureAddressAllocateInfo* b,
-    OnFailCompareFunc onFail);
+    const VkMemoryOpaqueCaptureAddressAllocateInfo* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkDeviceMemoryOpaqueCaptureAddressInfo(
     const VkDeviceMemoryOpaqueCaptureAddressInfo* a,
-    const VkDeviceMemoryOpaqueCaptureAddressInfo* b,
-    OnFailCompareFunc onFail);
+    const VkDeviceMemoryOpaqueCaptureAddressInfo* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_surface
-void checkEqual_VkSurfaceCapabilitiesKHR(
-    const VkSurfaceCapabilitiesKHR* a,
-    const VkSurfaceCapabilitiesKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSurfaceCapabilitiesKHR(const VkSurfaceCapabilitiesKHR* a,
+                                         const VkSurfaceCapabilitiesKHR* b,
+                                         OnFailCompareFunc onFail);
 
-void checkEqual_VkSurfaceFormatKHR(
-    const VkSurfaceFormatKHR* a,
-    const VkSurfaceFormatKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSurfaceFormatKHR(const VkSurfaceFormatKHR* a, const VkSurfaceFormatKHR* b,
+                                   OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_swapchain
-void checkEqual_VkSwapchainCreateInfoKHR(
-    const VkSwapchainCreateInfoKHR* a,
-    const VkSwapchainCreateInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSwapchainCreateInfoKHR(const VkSwapchainCreateInfoKHR* a,
+                                         const VkSwapchainCreateInfoKHR* b,
+                                         OnFailCompareFunc onFail);
 
-void checkEqual_VkPresentInfoKHR(
-    const VkPresentInfoKHR* a,
-    const VkPresentInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPresentInfoKHR(const VkPresentInfoKHR* a, const VkPresentInfoKHR* b,
+                                 OnFailCompareFunc onFail);
 
-void checkEqual_VkImageSwapchainCreateInfoKHR(
-    const VkImageSwapchainCreateInfoKHR* a,
-    const VkImageSwapchainCreateInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImageSwapchainCreateInfoKHR(const VkImageSwapchainCreateInfoKHR* a,
+                                              const VkImageSwapchainCreateInfoKHR* b,
+                                              OnFailCompareFunc onFail);
 
-void checkEqual_VkBindImageMemorySwapchainInfoKHR(
-    const VkBindImageMemorySwapchainInfoKHR* a,
-    const VkBindImageMemorySwapchainInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkBindImageMemorySwapchainInfoKHR(const VkBindImageMemorySwapchainInfoKHR* a,
+                                                  const VkBindImageMemorySwapchainInfoKHR* b,
+                                                  OnFailCompareFunc onFail);
 
-void checkEqual_VkAcquireNextImageInfoKHR(
-    const VkAcquireNextImageInfoKHR* a,
-    const VkAcquireNextImageInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkAcquireNextImageInfoKHR(const VkAcquireNextImageInfoKHR* a,
+                                          const VkAcquireNextImageInfoKHR* b,
+                                          OnFailCompareFunc onFail);
 
-void checkEqual_VkDeviceGroupPresentCapabilitiesKHR(
-    const VkDeviceGroupPresentCapabilitiesKHR* a,
-    const VkDeviceGroupPresentCapabilitiesKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDeviceGroupPresentCapabilitiesKHR(const VkDeviceGroupPresentCapabilitiesKHR* a,
+                                                    const VkDeviceGroupPresentCapabilitiesKHR* b,
+                                                    OnFailCompareFunc onFail);
 
-void checkEqual_VkDeviceGroupPresentInfoKHR(
-    const VkDeviceGroupPresentInfoKHR* a,
-    const VkDeviceGroupPresentInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDeviceGroupPresentInfoKHR(const VkDeviceGroupPresentInfoKHR* a,
+                                            const VkDeviceGroupPresentInfoKHR* b,
+                                            OnFailCompareFunc onFail);
 
-void checkEqual_VkDeviceGroupSwapchainCreateInfoKHR(
-    const VkDeviceGroupSwapchainCreateInfoKHR* a,
-    const VkDeviceGroupSwapchainCreateInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDeviceGroupSwapchainCreateInfoKHR(const VkDeviceGroupSwapchainCreateInfoKHR* a,
+                                                    const VkDeviceGroupSwapchainCreateInfoKHR* b,
+                                                    OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_display
-void checkEqual_VkDisplayModeParametersKHR(
-    const VkDisplayModeParametersKHR* a,
-    const VkDisplayModeParametersKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDisplayModeParametersKHR(const VkDisplayModeParametersKHR* a,
+                                           const VkDisplayModeParametersKHR* b,
+                                           OnFailCompareFunc onFail);
 
-void checkEqual_VkDisplayModeCreateInfoKHR(
-    const VkDisplayModeCreateInfoKHR* a,
-    const VkDisplayModeCreateInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDisplayModeCreateInfoKHR(const VkDisplayModeCreateInfoKHR* a,
+                                           const VkDisplayModeCreateInfoKHR* b,
+                                           OnFailCompareFunc onFail);
 
-void checkEqual_VkDisplayModePropertiesKHR(
-    const VkDisplayModePropertiesKHR* a,
-    const VkDisplayModePropertiesKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDisplayModePropertiesKHR(const VkDisplayModePropertiesKHR* a,
+                                           const VkDisplayModePropertiesKHR* b,
+                                           OnFailCompareFunc onFail);
 
-void checkEqual_VkDisplayPlaneCapabilitiesKHR(
-    const VkDisplayPlaneCapabilitiesKHR* a,
-    const VkDisplayPlaneCapabilitiesKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDisplayPlaneCapabilitiesKHR(const VkDisplayPlaneCapabilitiesKHR* a,
+                                              const VkDisplayPlaneCapabilitiesKHR* b,
+                                              OnFailCompareFunc onFail);
 
-void checkEqual_VkDisplayPlanePropertiesKHR(
-    const VkDisplayPlanePropertiesKHR* a,
-    const VkDisplayPlanePropertiesKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDisplayPlanePropertiesKHR(const VkDisplayPlanePropertiesKHR* a,
+                                            const VkDisplayPlanePropertiesKHR* b,
+                                            OnFailCompareFunc onFail);
 
-void checkEqual_VkDisplayPropertiesKHR(
-    const VkDisplayPropertiesKHR* a,
-    const VkDisplayPropertiesKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDisplayPropertiesKHR(const VkDisplayPropertiesKHR* a,
+                                       const VkDisplayPropertiesKHR* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkDisplaySurfaceCreateInfoKHR(
-    const VkDisplaySurfaceCreateInfoKHR* a,
-    const VkDisplaySurfaceCreateInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDisplaySurfaceCreateInfoKHR(const VkDisplaySurfaceCreateInfoKHR* a,
+                                              const VkDisplaySurfaceCreateInfoKHR* b,
+                                              OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_display_swapchain
-void checkEqual_VkDisplayPresentInfoKHR(
-    const VkDisplayPresentInfoKHR* a,
-    const VkDisplayPresentInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDisplayPresentInfoKHR(const VkDisplayPresentInfoKHR* a,
+                                        const VkDisplayPresentInfoKHR* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_xlib_surface
-void checkEqual_VkXlibSurfaceCreateInfoKHR(
-    const VkXlibSurfaceCreateInfoKHR* a,
-    const VkXlibSurfaceCreateInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkXlibSurfaceCreateInfoKHR(const VkXlibSurfaceCreateInfoKHR* a,
+                                           const VkXlibSurfaceCreateInfoKHR* b,
+                                           OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_xcb_surface
-void checkEqual_VkXcbSurfaceCreateInfoKHR(
-    const VkXcbSurfaceCreateInfoKHR* a,
-    const VkXcbSurfaceCreateInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkXcbSurfaceCreateInfoKHR(const VkXcbSurfaceCreateInfoKHR* a,
+                                          const VkXcbSurfaceCreateInfoKHR* b,
+                                          OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_wayland_surface
-void checkEqual_VkWaylandSurfaceCreateInfoKHR(
-    const VkWaylandSurfaceCreateInfoKHR* a,
-    const VkWaylandSurfaceCreateInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkWaylandSurfaceCreateInfoKHR(const VkWaylandSurfaceCreateInfoKHR* a,
+                                              const VkWaylandSurfaceCreateInfoKHR* b,
+                                              OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_android_surface
-void checkEqual_VkAndroidSurfaceCreateInfoKHR(
-    const VkAndroidSurfaceCreateInfoKHR* a,
-    const VkAndroidSurfaceCreateInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkAndroidSurfaceCreateInfoKHR(const VkAndroidSurfaceCreateInfoKHR* a,
+                                              const VkAndroidSurfaceCreateInfoKHR* b,
+                                              OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_win32_surface
-void checkEqual_VkWin32SurfaceCreateInfoKHR(
-    const VkWin32SurfaceCreateInfoKHR* a,
-    const VkWin32SurfaceCreateInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkWin32SurfaceCreateInfoKHR(const VkWin32SurfaceCreateInfoKHR* a,
+                                            const VkWin32SurfaceCreateInfoKHR* b,
+                                            OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_sampler_mirror_clamp_to_edge
 #endif
 #ifdef VK_KHR_video_queue
-void checkEqual_VkVideoQueueFamilyProperties2KHR(
-    const VkVideoQueueFamilyProperties2KHR* a,
-    const VkVideoQueueFamilyProperties2KHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVideoQueueFamilyProperties2KHR(const VkVideoQueueFamilyProperties2KHR* a,
+                                                 const VkVideoQueueFamilyProperties2KHR* b,
+                                                 OnFailCompareFunc onFail);
 
-void checkEqual_VkVideoProfileKHR(
-    const VkVideoProfileKHR* a,
-    const VkVideoProfileKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVideoProfileKHR(const VkVideoProfileKHR* a, const VkVideoProfileKHR* b,
+                                  OnFailCompareFunc onFail);
 
-void checkEqual_VkVideoProfilesKHR(
-    const VkVideoProfilesKHR* a,
-    const VkVideoProfilesKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVideoProfilesKHR(const VkVideoProfilesKHR* a, const VkVideoProfilesKHR* b,
+                                   OnFailCompareFunc onFail);
 
-void checkEqual_VkVideoCapabilitiesKHR(
-    const VkVideoCapabilitiesKHR* a,
-    const VkVideoCapabilitiesKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVideoCapabilitiesKHR(const VkVideoCapabilitiesKHR* a,
+                                       const VkVideoCapabilitiesKHR* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkPhysicalDeviceVideoFormatInfoKHR(
-    const VkPhysicalDeviceVideoFormatInfoKHR* a,
-    const VkPhysicalDeviceVideoFormatInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPhysicalDeviceVideoFormatInfoKHR(const VkPhysicalDeviceVideoFormatInfoKHR* a,
+                                                   const VkPhysicalDeviceVideoFormatInfoKHR* b,
+                                                   OnFailCompareFunc onFail);
 
-void checkEqual_VkVideoFormatPropertiesKHR(
-    const VkVideoFormatPropertiesKHR* a,
-    const VkVideoFormatPropertiesKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVideoFormatPropertiesKHR(const VkVideoFormatPropertiesKHR* a,
+                                           const VkVideoFormatPropertiesKHR* b,
+                                           OnFailCompareFunc onFail);
 
-void checkEqual_VkVideoPictureResourceKHR(
-    const VkVideoPictureResourceKHR* a,
-    const VkVideoPictureResourceKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVideoPictureResourceKHR(const VkVideoPictureResourceKHR* a,
+                                          const VkVideoPictureResourceKHR* b,
+                                          OnFailCompareFunc onFail);
 
-void checkEqual_VkVideoReferenceSlotKHR(
-    const VkVideoReferenceSlotKHR* a,
-    const VkVideoReferenceSlotKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVideoReferenceSlotKHR(const VkVideoReferenceSlotKHR* a,
+                                        const VkVideoReferenceSlotKHR* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkVideoGetMemoryPropertiesKHR(
-    const VkVideoGetMemoryPropertiesKHR* a,
-    const VkVideoGetMemoryPropertiesKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVideoGetMemoryPropertiesKHR(const VkVideoGetMemoryPropertiesKHR* a,
+                                              const VkVideoGetMemoryPropertiesKHR* b,
+                                              OnFailCompareFunc onFail);
 
-void checkEqual_VkVideoBindMemoryKHR(
-    const VkVideoBindMemoryKHR* a,
-    const VkVideoBindMemoryKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVideoBindMemoryKHR(const VkVideoBindMemoryKHR* a, const VkVideoBindMemoryKHR* b,
+                                     OnFailCompareFunc onFail);
 
-void checkEqual_VkVideoSessionCreateInfoKHR(
-    const VkVideoSessionCreateInfoKHR* a,
-    const VkVideoSessionCreateInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVideoSessionCreateInfoKHR(const VkVideoSessionCreateInfoKHR* a,
+                                            const VkVideoSessionCreateInfoKHR* b,
+                                            OnFailCompareFunc onFail);
 
 void checkEqual_VkVideoSessionParametersCreateInfoKHR(
-    const VkVideoSessionParametersCreateInfoKHR* a,
-    const VkVideoSessionParametersCreateInfoKHR* b,
+    const VkVideoSessionParametersCreateInfoKHR* a, const VkVideoSessionParametersCreateInfoKHR* b,
     OnFailCompareFunc onFail);
 
 void checkEqual_VkVideoSessionParametersUpdateInfoKHR(
-    const VkVideoSessionParametersUpdateInfoKHR* a,
-    const VkVideoSessionParametersUpdateInfoKHR* b,
+    const VkVideoSessionParametersUpdateInfoKHR* a, const VkVideoSessionParametersUpdateInfoKHR* b,
     OnFailCompareFunc onFail);
 
-void checkEqual_VkVideoBeginCodingInfoKHR(
-    const VkVideoBeginCodingInfoKHR* a,
-    const VkVideoBeginCodingInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVideoBeginCodingInfoKHR(const VkVideoBeginCodingInfoKHR* a,
+                                          const VkVideoBeginCodingInfoKHR* b,
+                                          OnFailCompareFunc onFail);
 
-void checkEqual_VkVideoEndCodingInfoKHR(
-    const VkVideoEndCodingInfoKHR* a,
-    const VkVideoEndCodingInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVideoEndCodingInfoKHR(const VkVideoEndCodingInfoKHR* a,
+                                        const VkVideoEndCodingInfoKHR* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkVideoCodingControlInfoKHR(
-    const VkVideoCodingControlInfoKHR* a,
-    const VkVideoCodingControlInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVideoCodingControlInfoKHR(const VkVideoCodingControlInfoKHR* a,
+                                            const VkVideoCodingControlInfoKHR* b,
+                                            OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_video_decode_queue
-void checkEqual_VkVideoDecodeInfoKHR(
-    const VkVideoDecodeInfoKHR* a,
-    const VkVideoDecodeInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVideoDecodeInfoKHR(const VkVideoDecodeInfoKHR* a, const VkVideoDecodeInfoKHR* b,
+                                     OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_dynamic_rendering
-void checkEqual_VkRenderingAttachmentInfoKHR(
-    const VkRenderingAttachmentInfoKHR* a,
-    const VkRenderingAttachmentInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkRenderingAttachmentInfoKHR(const VkRenderingAttachmentInfoKHR* a,
+                                             const VkRenderingAttachmentInfoKHR* b,
+                                             OnFailCompareFunc onFail);
 
-void checkEqual_VkRenderingInfoKHR(
-    const VkRenderingInfoKHR* a,
-    const VkRenderingInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkRenderingInfoKHR(const VkRenderingInfoKHR* a, const VkRenderingInfoKHR* b,
+                                   OnFailCompareFunc onFail);
 
-void checkEqual_VkPipelineRenderingCreateInfoKHR(
-    const VkPipelineRenderingCreateInfoKHR* a,
-    const VkPipelineRenderingCreateInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPipelineRenderingCreateInfoKHR(const VkPipelineRenderingCreateInfoKHR* a,
+                                                 const VkPipelineRenderingCreateInfoKHR* b,
+                                                 OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceDynamicRenderingFeaturesKHR(
     const VkPhysicalDeviceDynamicRenderingFeaturesKHR* a,
-    const VkPhysicalDeviceDynamicRenderingFeaturesKHR* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceDynamicRenderingFeaturesKHR* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkCommandBufferInheritanceRenderingInfoKHR(
     const VkCommandBufferInheritanceRenderingInfoKHR* a,
-    const VkCommandBufferInheritanceRenderingInfoKHR* b,
-    OnFailCompareFunc onFail);
+    const VkCommandBufferInheritanceRenderingInfoKHR* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkRenderingFragmentShadingRateAttachmentInfoKHR(
     const VkRenderingFragmentShadingRateAttachmentInfoKHR* a,
-    const VkRenderingFragmentShadingRateAttachmentInfoKHR* b,
-    OnFailCompareFunc onFail);
+    const VkRenderingFragmentShadingRateAttachmentInfoKHR* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkRenderingFragmentDensityMapAttachmentInfoEXT(
     const VkRenderingFragmentDensityMapAttachmentInfoEXT* a,
-    const VkRenderingFragmentDensityMapAttachmentInfoEXT* b,
-    OnFailCompareFunc onFail);
+    const VkRenderingFragmentDensityMapAttachmentInfoEXT* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkAttachmentSampleCountInfoAMD(
-    const VkAttachmentSampleCountInfoAMD* a,
-    const VkAttachmentSampleCountInfoAMD* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkAttachmentSampleCountInfoAMD(const VkAttachmentSampleCountInfoAMD* a,
+                                               const VkAttachmentSampleCountInfoAMD* b,
+                                               OnFailCompareFunc onFail);
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkAttachmentSampleCountInfoAMD, checkEqual_VkAttachmentSampleCountInfoNV)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkAttachmentSampleCountInfoAMD,
+                      checkEqual_VkAttachmentSampleCountInfoNV)
 
-void checkEqual_VkMultiviewPerViewAttributesInfoNVX(
-    const VkMultiviewPerViewAttributesInfoNVX* a,
-    const VkMultiviewPerViewAttributesInfoNVX* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkMultiviewPerViewAttributesInfoNVX(const VkMultiviewPerViewAttributesInfoNVX* a,
+                                                    const VkMultiviewPerViewAttributesInfoNVX* b,
+                                                    OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_multiview
-DEFINE_ALIAS_FUNCTION(checkEqual_VkRenderPassMultiviewCreateInfo, checkEqual_VkRenderPassMultiviewCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkRenderPassMultiviewCreateInfo,
+                      checkEqual_VkRenderPassMultiviewCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceMultiviewFeatures, checkEqual_VkPhysicalDeviceMultiviewFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceMultiviewFeatures,
+                      checkEqual_VkPhysicalDeviceMultiviewFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceMultiviewProperties, checkEqual_VkPhysicalDeviceMultiviewPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceMultiviewProperties,
+                      checkEqual_VkPhysicalDeviceMultiviewPropertiesKHR)
 
 #endif
 #ifdef VK_KHR_get_physical_device_properties2
 DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceFeatures2, checkEqual_VkPhysicalDeviceFeatures2KHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceProperties2, checkEqual_VkPhysicalDeviceProperties2KHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceProperties2,
+                      checkEqual_VkPhysicalDeviceProperties2KHR)
 
 DEFINE_ALIAS_FUNCTION(checkEqual_VkFormatProperties2, checkEqual_VkFormatProperties2KHR)
 
 DEFINE_ALIAS_FUNCTION(checkEqual_VkImageFormatProperties2, checkEqual_VkImageFormatProperties2KHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceImageFormatInfo2, checkEqual_VkPhysicalDeviceImageFormatInfo2KHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceImageFormatInfo2,
+                      checkEqual_VkPhysicalDeviceImageFormatInfo2KHR)
 
 DEFINE_ALIAS_FUNCTION(checkEqual_VkQueueFamilyProperties2, checkEqual_VkQueueFamilyProperties2KHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceMemoryProperties2, checkEqual_VkPhysicalDeviceMemoryProperties2KHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceMemoryProperties2,
+                      checkEqual_VkPhysicalDeviceMemoryProperties2KHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkSparseImageFormatProperties2, checkEqual_VkSparseImageFormatProperties2KHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkSparseImageFormatProperties2,
+                      checkEqual_VkSparseImageFormatProperties2KHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceSparseImageFormatInfo2, checkEqual_VkPhysicalDeviceSparseImageFormatInfo2KHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceSparseImageFormatInfo2,
+                      checkEqual_VkPhysicalDeviceSparseImageFormatInfo2KHR)
 
 #endif
 #ifdef VK_KHR_device_group
 DEFINE_ALIAS_FUNCTION(checkEqual_VkMemoryAllocateFlagsInfo, checkEqual_VkMemoryAllocateFlagsInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkDeviceGroupRenderPassBeginInfo, checkEqual_VkDeviceGroupRenderPassBeginInfoKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkDeviceGroupRenderPassBeginInfo,
+                      checkEqual_VkDeviceGroupRenderPassBeginInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkDeviceGroupCommandBufferBeginInfo, checkEqual_VkDeviceGroupCommandBufferBeginInfoKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkDeviceGroupCommandBufferBeginInfo,
+                      checkEqual_VkDeviceGroupCommandBufferBeginInfoKHR)
 
 DEFINE_ALIAS_FUNCTION(checkEqual_VkDeviceGroupSubmitInfo, checkEqual_VkDeviceGroupSubmitInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkDeviceGroupBindSparseInfo, checkEqual_VkDeviceGroupBindSparseInfoKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkDeviceGroupBindSparseInfo,
+                      checkEqual_VkDeviceGroupBindSparseInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkBindBufferMemoryDeviceGroupInfo, checkEqual_VkBindBufferMemoryDeviceGroupInfoKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkBindBufferMemoryDeviceGroupInfo,
+                      checkEqual_VkBindBufferMemoryDeviceGroupInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkBindImageMemoryDeviceGroupInfo, checkEqual_VkBindImageMemoryDeviceGroupInfoKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkBindImageMemoryDeviceGroupInfo,
+                      checkEqual_VkBindImageMemoryDeviceGroupInfoKHR)
 
 #endif
 #ifdef VK_KHR_shader_draw_parameters
@@ -1509,171 +1146,169 @@
 #ifdef VK_KHR_maintenance1
 #endif
 #ifdef VK_KHR_device_group_creation
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceGroupProperties, checkEqual_VkPhysicalDeviceGroupPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceGroupProperties,
+                      checkEqual_VkPhysicalDeviceGroupPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkDeviceGroupDeviceCreateInfo, checkEqual_VkDeviceGroupDeviceCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkDeviceGroupDeviceCreateInfo,
+                      checkEqual_VkDeviceGroupDeviceCreateInfoKHR)
 
 #endif
 #ifdef VK_KHR_external_memory_capabilities
-DEFINE_ALIAS_FUNCTION(checkEqual_VkExternalMemoryProperties, checkEqual_VkExternalMemoryPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkExternalMemoryProperties,
+                      checkEqual_VkExternalMemoryPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceExternalImageFormatInfo, checkEqual_VkPhysicalDeviceExternalImageFormatInfoKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceExternalImageFormatInfo,
+                      checkEqual_VkPhysicalDeviceExternalImageFormatInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkExternalImageFormatProperties, checkEqual_VkExternalImageFormatPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkExternalImageFormatProperties,
+                      checkEqual_VkExternalImageFormatPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceExternalBufferInfo, checkEqual_VkPhysicalDeviceExternalBufferInfoKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceExternalBufferInfo,
+                      checkEqual_VkPhysicalDeviceExternalBufferInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkExternalBufferProperties, checkEqual_VkExternalBufferPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkExternalBufferProperties,
+                      checkEqual_VkExternalBufferPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceIDProperties, checkEqual_VkPhysicalDeviceIDPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceIDProperties,
+                      checkEqual_VkPhysicalDeviceIDPropertiesKHR)
 
 #endif
 #ifdef VK_KHR_external_memory
-DEFINE_ALIAS_FUNCTION(checkEqual_VkExternalMemoryImageCreateInfo, checkEqual_VkExternalMemoryImageCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkExternalMemoryImageCreateInfo,
+                      checkEqual_VkExternalMemoryImageCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkExternalMemoryBufferCreateInfo, checkEqual_VkExternalMemoryBufferCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkExternalMemoryBufferCreateInfo,
+                      checkEqual_VkExternalMemoryBufferCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkExportMemoryAllocateInfo, checkEqual_VkExportMemoryAllocateInfoKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkExportMemoryAllocateInfo,
+                      checkEqual_VkExportMemoryAllocateInfoKHR)
 
 #endif
 #ifdef VK_KHR_external_memory_win32
-void checkEqual_VkImportMemoryWin32HandleInfoKHR(
-    const VkImportMemoryWin32HandleInfoKHR* a,
-    const VkImportMemoryWin32HandleInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImportMemoryWin32HandleInfoKHR(const VkImportMemoryWin32HandleInfoKHR* a,
+                                                 const VkImportMemoryWin32HandleInfoKHR* b,
+                                                 OnFailCompareFunc onFail);
 
-void checkEqual_VkExportMemoryWin32HandleInfoKHR(
-    const VkExportMemoryWin32HandleInfoKHR* a,
-    const VkExportMemoryWin32HandleInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkExportMemoryWin32HandleInfoKHR(const VkExportMemoryWin32HandleInfoKHR* a,
+                                                 const VkExportMemoryWin32HandleInfoKHR* b,
+                                                 OnFailCompareFunc onFail);
 
-void checkEqual_VkMemoryWin32HandlePropertiesKHR(
-    const VkMemoryWin32HandlePropertiesKHR* a,
-    const VkMemoryWin32HandlePropertiesKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkMemoryWin32HandlePropertiesKHR(const VkMemoryWin32HandlePropertiesKHR* a,
+                                                 const VkMemoryWin32HandlePropertiesKHR* b,
+                                                 OnFailCompareFunc onFail);
 
-void checkEqual_VkMemoryGetWin32HandleInfoKHR(
-    const VkMemoryGetWin32HandleInfoKHR* a,
-    const VkMemoryGetWin32HandleInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkMemoryGetWin32HandleInfoKHR(const VkMemoryGetWin32HandleInfoKHR* a,
+                                              const VkMemoryGetWin32HandleInfoKHR* b,
+                                              OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_external_memory_fd
-void checkEqual_VkImportMemoryFdInfoKHR(
-    const VkImportMemoryFdInfoKHR* a,
-    const VkImportMemoryFdInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImportMemoryFdInfoKHR(const VkImportMemoryFdInfoKHR* a,
+                                        const VkImportMemoryFdInfoKHR* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkMemoryFdPropertiesKHR(
-    const VkMemoryFdPropertiesKHR* a,
-    const VkMemoryFdPropertiesKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkMemoryFdPropertiesKHR(const VkMemoryFdPropertiesKHR* a,
+                                        const VkMemoryFdPropertiesKHR* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkMemoryGetFdInfoKHR(
-    const VkMemoryGetFdInfoKHR* a,
-    const VkMemoryGetFdInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkMemoryGetFdInfoKHR(const VkMemoryGetFdInfoKHR* a, const VkMemoryGetFdInfoKHR* b,
+                                     OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_win32_keyed_mutex
 void checkEqual_VkWin32KeyedMutexAcquireReleaseInfoKHR(
     const VkWin32KeyedMutexAcquireReleaseInfoKHR* a,
-    const VkWin32KeyedMutexAcquireReleaseInfoKHR* b,
-    OnFailCompareFunc onFail);
+    const VkWin32KeyedMutexAcquireReleaseInfoKHR* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_external_semaphore_capabilities
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceExternalSemaphoreInfo, checkEqual_VkPhysicalDeviceExternalSemaphoreInfoKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceExternalSemaphoreInfo,
+                      checkEqual_VkPhysicalDeviceExternalSemaphoreInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkExternalSemaphoreProperties, checkEqual_VkExternalSemaphorePropertiesKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkExternalSemaphoreProperties,
+                      checkEqual_VkExternalSemaphorePropertiesKHR)
 
 #endif
 #ifdef VK_KHR_external_semaphore
-DEFINE_ALIAS_FUNCTION(checkEqual_VkExportSemaphoreCreateInfo, checkEqual_VkExportSemaphoreCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkExportSemaphoreCreateInfo,
+                      checkEqual_VkExportSemaphoreCreateInfoKHR)
 
 #endif
 #ifdef VK_KHR_external_semaphore_win32
-void checkEqual_VkImportSemaphoreWin32HandleInfoKHR(
-    const VkImportSemaphoreWin32HandleInfoKHR* a,
-    const VkImportSemaphoreWin32HandleInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImportSemaphoreWin32HandleInfoKHR(const VkImportSemaphoreWin32HandleInfoKHR* a,
+                                                    const VkImportSemaphoreWin32HandleInfoKHR* b,
+                                                    OnFailCompareFunc onFail);
 
-void checkEqual_VkExportSemaphoreWin32HandleInfoKHR(
-    const VkExportSemaphoreWin32HandleInfoKHR* a,
-    const VkExportSemaphoreWin32HandleInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkExportSemaphoreWin32HandleInfoKHR(const VkExportSemaphoreWin32HandleInfoKHR* a,
+                                                    const VkExportSemaphoreWin32HandleInfoKHR* b,
+                                                    OnFailCompareFunc onFail);
 
-void checkEqual_VkD3D12FenceSubmitInfoKHR(
-    const VkD3D12FenceSubmitInfoKHR* a,
-    const VkD3D12FenceSubmitInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkD3D12FenceSubmitInfoKHR(const VkD3D12FenceSubmitInfoKHR* a,
+                                          const VkD3D12FenceSubmitInfoKHR* b,
+                                          OnFailCompareFunc onFail);
 
-void checkEqual_VkSemaphoreGetWin32HandleInfoKHR(
-    const VkSemaphoreGetWin32HandleInfoKHR* a,
-    const VkSemaphoreGetWin32HandleInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSemaphoreGetWin32HandleInfoKHR(const VkSemaphoreGetWin32HandleInfoKHR* a,
+                                                 const VkSemaphoreGetWin32HandleInfoKHR* b,
+                                                 OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_external_semaphore_fd
-void checkEqual_VkImportSemaphoreFdInfoKHR(
-    const VkImportSemaphoreFdInfoKHR* a,
-    const VkImportSemaphoreFdInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImportSemaphoreFdInfoKHR(const VkImportSemaphoreFdInfoKHR* a,
+                                           const VkImportSemaphoreFdInfoKHR* b,
+                                           OnFailCompareFunc onFail);
 
-void checkEqual_VkSemaphoreGetFdInfoKHR(
-    const VkSemaphoreGetFdInfoKHR* a,
-    const VkSemaphoreGetFdInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSemaphoreGetFdInfoKHR(const VkSemaphoreGetFdInfoKHR* a,
+                                        const VkSemaphoreGetFdInfoKHR* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_push_descriptor
 void checkEqual_VkPhysicalDevicePushDescriptorPropertiesKHR(
     const VkPhysicalDevicePushDescriptorPropertiesKHR* a,
-    const VkPhysicalDevicePushDescriptorPropertiesKHR* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDevicePushDescriptorPropertiesKHR* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_shader_float16_int8
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceShaderFloat16Int8Features, checkEqual_VkPhysicalDeviceShaderFloat16Int8FeaturesKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceShaderFloat16Int8Features,
+                      checkEqual_VkPhysicalDeviceShaderFloat16Int8FeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceShaderFloat16Int8Features, checkEqual_VkPhysicalDeviceFloat16Int8FeaturesKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceShaderFloat16Int8Features,
+                      checkEqual_VkPhysicalDeviceFloat16Int8FeaturesKHR)
 
 #endif
 #ifdef VK_KHR_16bit_storage
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDevice16BitStorageFeatures, checkEqual_VkPhysicalDevice16BitStorageFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDevice16BitStorageFeatures,
+                      checkEqual_VkPhysicalDevice16BitStorageFeaturesKHR)
 
 #endif
 #ifdef VK_KHR_incremental_present
-void checkEqual_VkRectLayerKHR(
-    const VkRectLayerKHR* a,
-    const VkRectLayerKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkRectLayerKHR(const VkRectLayerKHR* a, const VkRectLayerKHR* b,
+                               OnFailCompareFunc onFail);
 
-void checkEqual_VkPresentRegionKHR(
-    const VkPresentRegionKHR* a,
-    const VkPresentRegionKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPresentRegionKHR(const VkPresentRegionKHR* a, const VkPresentRegionKHR* b,
+                                   OnFailCompareFunc onFail);
 
-void checkEqual_VkPresentRegionsKHR(
-    const VkPresentRegionsKHR* a,
-    const VkPresentRegionsKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPresentRegionsKHR(const VkPresentRegionsKHR* a, const VkPresentRegionsKHR* b,
+                                    OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_descriptor_update_template
-DEFINE_ALIAS_FUNCTION(checkEqual_VkDescriptorUpdateTemplateEntry, checkEqual_VkDescriptorUpdateTemplateEntryKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkDescriptorUpdateTemplateEntry,
+                      checkEqual_VkDescriptorUpdateTemplateEntryKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkDescriptorUpdateTemplateCreateInfo, checkEqual_VkDescriptorUpdateTemplateCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkDescriptorUpdateTemplateCreateInfo,
+                      checkEqual_VkDescriptorUpdateTemplateCreateInfoKHR)
 
 #endif
 #ifdef VK_KHR_imageless_framebuffer
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceImagelessFramebufferFeatures, checkEqual_VkPhysicalDeviceImagelessFramebufferFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceImagelessFramebufferFeatures,
+                      checkEqual_VkPhysicalDeviceImagelessFramebufferFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkFramebufferAttachmentsCreateInfo, checkEqual_VkFramebufferAttachmentsCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkFramebufferAttachmentsCreateInfo,
+                      checkEqual_VkFramebufferAttachmentsCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkFramebufferAttachmentImageInfo, checkEqual_VkFramebufferAttachmentImageInfoKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkFramebufferAttachmentImageInfo,
+                      checkEqual_VkFramebufferAttachmentImageInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkRenderPassAttachmentBeginInfo, checkEqual_VkRenderPassAttachmentBeginInfoKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkRenderPassAttachmentBeginInfo,
+                      checkEqual_VkRenderPassAttachmentBeginInfoKHR)
 
 #endif
 #ifdef VK_KHR_create_renderpass2
@@ -1694,13 +1329,13 @@
 #endif
 #ifdef VK_KHR_shared_presentable_image
 void checkEqual_VkSharedPresentSurfaceCapabilitiesKHR(
-    const VkSharedPresentSurfaceCapabilitiesKHR* a,
-    const VkSharedPresentSurfaceCapabilitiesKHR* b,
+    const VkSharedPresentSurfaceCapabilitiesKHR* a, const VkSharedPresentSurfaceCapabilitiesKHR* b,
     OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_external_fence_capabilities
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceExternalFenceInfo, checkEqual_VkPhysicalDeviceExternalFenceInfoKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceExternalFenceInfo,
+                      checkEqual_VkPhysicalDeviceExternalFenceInfoKHR)
 
 DEFINE_ALIAS_FUNCTION(checkEqual_VkExternalFenceProperties, checkEqual_VkExternalFencePropertiesKHR)
 
@@ -1710,142 +1345,124 @@
 
 #endif
 #ifdef VK_KHR_external_fence_win32
-void checkEqual_VkImportFenceWin32HandleInfoKHR(
-    const VkImportFenceWin32HandleInfoKHR* a,
-    const VkImportFenceWin32HandleInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImportFenceWin32HandleInfoKHR(const VkImportFenceWin32HandleInfoKHR* a,
+                                                const VkImportFenceWin32HandleInfoKHR* b,
+                                                OnFailCompareFunc onFail);
 
-void checkEqual_VkExportFenceWin32HandleInfoKHR(
-    const VkExportFenceWin32HandleInfoKHR* a,
-    const VkExportFenceWin32HandleInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkExportFenceWin32HandleInfoKHR(const VkExportFenceWin32HandleInfoKHR* a,
+                                                const VkExportFenceWin32HandleInfoKHR* b,
+                                                OnFailCompareFunc onFail);
 
-void checkEqual_VkFenceGetWin32HandleInfoKHR(
-    const VkFenceGetWin32HandleInfoKHR* a,
-    const VkFenceGetWin32HandleInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkFenceGetWin32HandleInfoKHR(const VkFenceGetWin32HandleInfoKHR* a,
+                                             const VkFenceGetWin32HandleInfoKHR* b,
+                                             OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_external_fence_fd
-void checkEqual_VkImportFenceFdInfoKHR(
-    const VkImportFenceFdInfoKHR* a,
-    const VkImportFenceFdInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImportFenceFdInfoKHR(const VkImportFenceFdInfoKHR* a,
+                                       const VkImportFenceFdInfoKHR* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkFenceGetFdInfoKHR(
-    const VkFenceGetFdInfoKHR* a,
-    const VkFenceGetFdInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkFenceGetFdInfoKHR(const VkFenceGetFdInfoKHR* a, const VkFenceGetFdInfoKHR* b,
+                                    OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_performance_query
 void checkEqual_VkPhysicalDevicePerformanceQueryFeaturesKHR(
     const VkPhysicalDevicePerformanceQueryFeaturesKHR* a,
-    const VkPhysicalDevicePerformanceQueryFeaturesKHR* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDevicePerformanceQueryFeaturesKHR* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDevicePerformanceQueryPropertiesKHR(
     const VkPhysicalDevicePerformanceQueryPropertiesKHR* a,
-    const VkPhysicalDevicePerformanceQueryPropertiesKHR* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDevicePerformanceQueryPropertiesKHR* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkPerformanceCounterKHR(
-    const VkPerformanceCounterKHR* a,
-    const VkPerformanceCounterKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPerformanceCounterKHR(const VkPerformanceCounterKHR* a,
+                                        const VkPerformanceCounterKHR* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkPerformanceCounterDescriptionKHR(
-    const VkPerformanceCounterDescriptionKHR* a,
-    const VkPerformanceCounterDescriptionKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPerformanceCounterDescriptionKHR(const VkPerformanceCounterDescriptionKHR* a,
+                                                   const VkPerformanceCounterDescriptionKHR* b,
+                                                   OnFailCompareFunc onFail);
 
-void checkEqual_VkQueryPoolPerformanceCreateInfoKHR(
-    const VkQueryPoolPerformanceCreateInfoKHR* a,
-    const VkQueryPoolPerformanceCreateInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkQueryPoolPerformanceCreateInfoKHR(const VkQueryPoolPerformanceCreateInfoKHR* a,
+                                                    const VkQueryPoolPerformanceCreateInfoKHR* b,
+                                                    OnFailCompareFunc onFail);
 
-void checkEqual_VkPerformanceCounterResultKHR(
-    const VkPerformanceCounterResultKHR* a,
-    const VkPerformanceCounterResultKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPerformanceCounterResultKHR(const VkPerformanceCounterResultKHR* a,
+                                              const VkPerformanceCounterResultKHR* b,
+                                              OnFailCompareFunc onFail);
 
-void checkEqual_VkAcquireProfilingLockInfoKHR(
-    const VkAcquireProfilingLockInfoKHR* a,
-    const VkAcquireProfilingLockInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkAcquireProfilingLockInfoKHR(const VkAcquireProfilingLockInfoKHR* a,
+                                              const VkAcquireProfilingLockInfoKHR* b,
+                                              OnFailCompareFunc onFail);
 
-void checkEqual_VkPerformanceQuerySubmitInfoKHR(
-    const VkPerformanceQuerySubmitInfoKHR* a,
-    const VkPerformanceQuerySubmitInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPerformanceQuerySubmitInfoKHR(const VkPerformanceQuerySubmitInfoKHR* a,
+                                                const VkPerformanceQuerySubmitInfoKHR* b,
+                                                OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_maintenance2
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDevicePointClippingProperties, checkEqual_VkPhysicalDevicePointClippingPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDevicePointClippingProperties,
+                      checkEqual_VkPhysicalDevicePointClippingPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkRenderPassInputAttachmentAspectCreateInfo, checkEqual_VkRenderPassInputAttachmentAspectCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkRenderPassInputAttachmentAspectCreateInfo,
+                      checkEqual_VkRenderPassInputAttachmentAspectCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkInputAttachmentAspectReference, checkEqual_VkInputAttachmentAspectReferenceKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkInputAttachmentAspectReference,
+                      checkEqual_VkInputAttachmentAspectReferenceKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkImageViewUsageCreateInfo, checkEqual_VkImageViewUsageCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkImageViewUsageCreateInfo,
+                      checkEqual_VkImageViewUsageCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPipelineTessellationDomainOriginStateCreateInfo, checkEqual_VkPipelineTessellationDomainOriginStateCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPipelineTessellationDomainOriginStateCreateInfo,
+                      checkEqual_VkPipelineTessellationDomainOriginStateCreateInfoKHR)
 
 #endif
 #ifdef VK_KHR_get_surface_capabilities2
-void checkEqual_VkPhysicalDeviceSurfaceInfo2KHR(
-    const VkPhysicalDeviceSurfaceInfo2KHR* a,
-    const VkPhysicalDeviceSurfaceInfo2KHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPhysicalDeviceSurfaceInfo2KHR(const VkPhysicalDeviceSurfaceInfo2KHR* a,
+                                                const VkPhysicalDeviceSurfaceInfo2KHR* b,
+                                                OnFailCompareFunc onFail);
 
-void checkEqual_VkSurfaceCapabilities2KHR(
-    const VkSurfaceCapabilities2KHR* a,
-    const VkSurfaceCapabilities2KHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSurfaceCapabilities2KHR(const VkSurfaceCapabilities2KHR* a,
+                                          const VkSurfaceCapabilities2KHR* b,
+                                          OnFailCompareFunc onFail);
 
-void checkEqual_VkSurfaceFormat2KHR(
-    const VkSurfaceFormat2KHR* a,
-    const VkSurfaceFormat2KHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSurfaceFormat2KHR(const VkSurfaceFormat2KHR* a, const VkSurfaceFormat2KHR* b,
+                                    OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_variable_pointers
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceVariablePointersFeatures, checkEqual_VkPhysicalDeviceVariablePointerFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceVariablePointersFeatures,
+                      checkEqual_VkPhysicalDeviceVariablePointerFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceVariablePointersFeatures, checkEqual_VkPhysicalDeviceVariablePointersFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceVariablePointersFeatures,
+                      checkEqual_VkPhysicalDeviceVariablePointersFeaturesKHR)
 
 #endif
 #ifdef VK_KHR_get_display_properties2
-void checkEqual_VkDisplayProperties2KHR(
-    const VkDisplayProperties2KHR* a,
-    const VkDisplayProperties2KHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDisplayProperties2KHR(const VkDisplayProperties2KHR* a,
+                                        const VkDisplayProperties2KHR* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkDisplayPlaneProperties2KHR(
-    const VkDisplayPlaneProperties2KHR* a,
-    const VkDisplayPlaneProperties2KHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDisplayPlaneProperties2KHR(const VkDisplayPlaneProperties2KHR* a,
+                                             const VkDisplayPlaneProperties2KHR* b,
+                                             OnFailCompareFunc onFail);
 
-void checkEqual_VkDisplayModeProperties2KHR(
-    const VkDisplayModeProperties2KHR* a,
-    const VkDisplayModeProperties2KHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDisplayModeProperties2KHR(const VkDisplayModeProperties2KHR* a,
+                                            const VkDisplayModeProperties2KHR* b,
+                                            OnFailCompareFunc onFail);
 
-void checkEqual_VkDisplayPlaneInfo2KHR(
-    const VkDisplayPlaneInfo2KHR* a,
-    const VkDisplayPlaneInfo2KHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDisplayPlaneInfo2KHR(const VkDisplayPlaneInfo2KHR* a,
+                                       const VkDisplayPlaneInfo2KHR* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkDisplayPlaneCapabilities2KHR(
-    const VkDisplayPlaneCapabilities2KHR* a,
-    const VkDisplayPlaneCapabilities2KHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDisplayPlaneCapabilities2KHR(const VkDisplayPlaneCapabilities2KHR* a,
+                                               const VkDisplayPlaneCapabilities2KHR* b,
+                                               OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_dedicated_allocation
-DEFINE_ALIAS_FUNCTION(checkEqual_VkMemoryDedicatedRequirements, checkEqual_VkMemoryDedicatedRequirementsKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkMemoryDedicatedRequirements,
+                      checkEqual_VkMemoryDedicatedRequirementsKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkMemoryDedicatedAllocateInfo, checkEqual_VkMemoryDedicatedAllocateInfoKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkMemoryDedicatedAllocateInfo,
+                      checkEqual_VkMemoryDedicatedAllocateInfoKHR)
 
 #endif
 #ifdef VK_KHR_storage_buffer_storage_class
@@ -1853,33 +1470,44 @@
 #ifdef VK_KHR_relaxed_block_layout
 #endif
 #ifdef VK_KHR_get_memory_requirements2
-DEFINE_ALIAS_FUNCTION(checkEqual_VkBufferMemoryRequirementsInfo2, checkEqual_VkBufferMemoryRequirementsInfo2KHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkBufferMemoryRequirementsInfo2,
+                      checkEqual_VkBufferMemoryRequirementsInfo2KHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkImageMemoryRequirementsInfo2, checkEqual_VkImageMemoryRequirementsInfo2KHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkImageMemoryRequirementsInfo2,
+                      checkEqual_VkImageMemoryRequirementsInfo2KHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkImageSparseMemoryRequirementsInfo2, checkEqual_VkImageSparseMemoryRequirementsInfo2KHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkImageSparseMemoryRequirementsInfo2,
+                      checkEqual_VkImageSparseMemoryRequirementsInfo2KHR)
 
 DEFINE_ALIAS_FUNCTION(checkEqual_VkMemoryRequirements2, checkEqual_VkMemoryRequirements2KHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkSparseImageMemoryRequirements2, checkEqual_VkSparseImageMemoryRequirements2KHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkSparseImageMemoryRequirements2,
+                      checkEqual_VkSparseImageMemoryRequirements2KHR)
 
 #endif
 #ifdef VK_KHR_image_format_list
-DEFINE_ALIAS_FUNCTION(checkEqual_VkImageFormatListCreateInfo, checkEqual_VkImageFormatListCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkImageFormatListCreateInfo,
+                      checkEqual_VkImageFormatListCreateInfoKHR)
 
 #endif
 #ifdef VK_KHR_sampler_ycbcr_conversion
-DEFINE_ALIAS_FUNCTION(checkEqual_VkSamplerYcbcrConversionCreateInfo, checkEqual_VkSamplerYcbcrConversionCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkSamplerYcbcrConversionCreateInfo,
+                      checkEqual_VkSamplerYcbcrConversionCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkSamplerYcbcrConversionInfo, checkEqual_VkSamplerYcbcrConversionInfoKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkSamplerYcbcrConversionInfo,
+                      checkEqual_VkSamplerYcbcrConversionInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkBindImagePlaneMemoryInfo, checkEqual_VkBindImagePlaneMemoryInfoKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkBindImagePlaneMemoryInfo,
+                      checkEqual_VkBindImagePlaneMemoryInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkImagePlaneMemoryRequirementsInfo, checkEqual_VkImagePlaneMemoryRequirementsInfoKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkImagePlaneMemoryRequirementsInfo,
+                      checkEqual_VkImagePlaneMemoryRequirementsInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceSamplerYcbcrConversionFeatures, checkEqual_VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceSamplerYcbcrConversionFeatures,
+                      checkEqual_VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkSamplerYcbcrConversionImageFormatProperties, checkEqual_VkSamplerYcbcrConversionImageFormatPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkSamplerYcbcrConversionImageFormatProperties,
+                      checkEqual_VkSamplerYcbcrConversionImageFormatPropertiesKHR)
 
 #endif
 #ifdef VK_KHR_bind_memory2
@@ -1891,68 +1519,77 @@
 #ifdef VK_KHR_portability_subset
 void checkEqual_VkPhysicalDevicePortabilitySubsetFeaturesKHR(
     const VkPhysicalDevicePortabilitySubsetFeaturesKHR* a,
-    const VkPhysicalDevicePortabilitySubsetFeaturesKHR* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDevicePortabilitySubsetFeaturesKHR* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDevicePortabilitySubsetPropertiesKHR(
     const VkPhysicalDevicePortabilitySubsetPropertiesKHR* a,
-    const VkPhysicalDevicePortabilitySubsetPropertiesKHR* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDevicePortabilitySubsetPropertiesKHR* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_maintenance3
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceMaintenance3Properties, checkEqual_VkPhysicalDeviceMaintenance3PropertiesKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceMaintenance3Properties,
+                      checkEqual_VkPhysicalDeviceMaintenance3PropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkDescriptorSetLayoutSupport, checkEqual_VkDescriptorSetLayoutSupportKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkDescriptorSetLayoutSupport,
+                      checkEqual_VkDescriptorSetLayoutSupportKHR)
 
 #endif
 #ifdef VK_KHR_draw_indirect_count
 #endif
 #ifdef VK_KHR_shader_subgroup_extended_types
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures, checkEqual_VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures,
+                      checkEqual_VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR)
 
 #endif
 #ifdef VK_KHR_8bit_storage
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDevice8BitStorageFeatures, checkEqual_VkPhysicalDevice8BitStorageFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDevice8BitStorageFeatures,
+                      checkEqual_VkPhysicalDevice8BitStorageFeaturesKHR)
 
 #endif
 #ifdef VK_KHR_shader_atomic_int64
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceShaderAtomicInt64Features, checkEqual_VkPhysicalDeviceShaderAtomicInt64FeaturesKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceShaderAtomicInt64Features,
+                      checkEqual_VkPhysicalDeviceShaderAtomicInt64FeaturesKHR)
 
 #endif
 #ifdef VK_KHR_shader_clock
 void checkEqual_VkPhysicalDeviceShaderClockFeaturesKHR(
     const VkPhysicalDeviceShaderClockFeaturesKHR* a,
-    const VkPhysicalDeviceShaderClockFeaturesKHR* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceShaderClockFeaturesKHR* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_driver_properties
 DEFINE_ALIAS_FUNCTION(checkEqual_VkConformanceVersion, checkEqual_VkConformanceVersionKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceDriverProperties, checkEqual_VkPhysicalDeviceDriverPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceDriverProperties,
+                      checkEqual_VkPhysicalDeviceDriverPropertiesKHR)
 
 #endif
 #ifdef VK_KHR_shader_float_controls
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceFloatControlsProperties, checkEqual_VkPhysicalDeviceFloatControlsPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceFloatControlsProperties,
+                      checkEqual_VkPhysicalDeviceFloatControlsPropertiesKHR)
 
 #endif
 #ifdef VK_KHR_depth_stencil_resolve
-DEFINE_ALIAS_FUNCTION(checkEqual_VkSubpassDescriptionDepthStencilResolve, checkEqual_VkSubpassDescriptionDepthStencilResolveKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkSubpassDescriptionDepthStencilResolve,
+                      checkEqual_VkSubpassDescriptionDepthStencilResolveKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceDepthStencilResolveProperties, checkEqual_VkPhysicalDeviceDepthStencilResolvePropertiesKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceDepthStencilResolveProperties,
+                      checkEqual_VkPhysicalDeviceDepthStencilResolvePropertiesKHR)
 
 #endif
 #ifdef VK_KHR_swapchain_mutable_format
 #endif
 #ifdef VK_KHR_timeline_semaphore
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceTimelineSemaphoreFeatures, checkEqual_VkPhysicalDeviceTimelineSemaphoreFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceTimelineSemaphoreFeatures,
+                      checkEqual_VkPhysicalDeviceTimelineSemaphoreFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceTimelineSemaphoreProperties, checkEqual_VkPhysicalDeviceTimelineSemaphorePropertiesKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceTimelineSemaphoreProperties,
+                      checkEqual_VkPhysicalDeviceTimelineSemaphorePropertiesKHR)
 
 DEFINE_ALIAS_FUNCTION(checkEqual_VkSemaphoreTypeCreateInfo, checkEqual_VkSemaphoreTypeCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkTimelineSemaphoreSubmitInfo, checkEqual_VkTimelineSemaphoreSubmitInfoKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkTimelineSemaphoreSubmitInfo,
+                      checkEqual_VkTimelineSemaphoreSubmitInfoKHR)
 
 DEFINE_ALIAS_FUNCTION(checkEqual_VkSemaphoreWaitInfo, checkEqual_VkSemaphoreWaitInfoKHR)
 
@@ -1960,81 +1597,82 @@
 
 #endif
 #ifdef VK_KHR_vulkan_memory_model
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceVulkanMemoryModelFeatures, checkEqual_VkPhysicalDeviceVulkanMemoryModelFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceVulkanMemoryModelFeatures,
+                      checkEqual_VkPhysicalDeviceVulkanMemoryModelFeaturesKHR)
 
 #endif
 #ifdef VK_KHR_shader_terminate_invocation
 void checkEqual_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(
     const VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* a,
-    const VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_fragment_shading_rate
 void checkEqual_VkFragmentShadingRateAttachmentInfoKHR(
     const VkFragmentShadingRateAttachmentInfoKHR* a,
-    const VkFragmentShadingRateAttachmentInfoKHR* b,
-    OnFailCompareFunc onFail);
+    const VkFragmentShadingRateAttachmentInfoKHR* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPipelineFragmentShadingRateStateCreateInfoKHR(
     const VkPipelineFragmentShadingRateStateCreateInfoKHR* a,
-    const VkPipelineFragmentShadingRateStateCreateInfoKHR* b,
-    OnFailCompareFunc onFail);
+    const VkPipelineFragmentShadingRateStateCreateInfoKHR* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(
     const VkPhysicalDeviceFragmentShadingRateFeaturesKHR* a,
-    const VkPhysicalDeviceFragmentShadingRateFeaturesKHR* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceFragmentShadingRateFeaturesKHR* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(
     const VkPhysicalDeviceFragmentShadingRatePropertiesKHR* a,
-    const VkPhysicalDeviceFragmentShadingRatePropertiesKHR* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceFragmentShadingRatePropertiesKHR* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceFragmentShadingRateKHR(
     const VkPhysicalDeviceFragmentShadingRateKHR* a,
-    const VkPhysicalDeviceFragmentShadingRateKHR* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceFragmentShadingRateKHR* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_spirv_1_4
 #endif
 #ifdef VK_KHR_surface_protected_capabilities
-void checkEqual_VkSurfaceProtectedCapabilitiesKHR(
-    const VkSurfaceProtectedCapabilitiesKHR* a,
-    const VkSurfaceProtectedCapabilitiesKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSurfaceProtectedCapabilitiesKHR(const VkSurfaceProtectedCapabilitiesKHR* a,
+                                                  const VkSurfaceProtectedCapabilitiesKHR* b,
+                                                  OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_separate_depth_stencil_layouts
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures, checkEqual_VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures,
+                      checkEqual_VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkAttachmentReferenceStencilLayout, checkEqual_VkAttachmentReferenceStencilLayoutKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkAttachmentReferenceStencilLayout,
+                      checkEqual_VkAttachmentReferenceStencilLayoutKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkAttachmentDescriptionStencilLayout, checkEqual_VkAttachmentDescriptionStencilLayoutKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkAttachmentDescriptionStencilLayout,
+                      checkEqual_VkAttachmentDescriptionStencilLayoutKHR)
 
 #endif
 #ifdef VK_KHR_present_wait
 void checkEqual_VkPhysicalDevicePresentWaitFeaturesKHR(
     const VkPhysicalDevicePresentWaitFeaturesKHR* a,
-    const VkPhysicalDevicePresentWaitFeaturesKHR* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDevicePresentWaitFeaturesKHR* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_uniform_buffer_standard_layout
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceUniformBufferStandardLayoutFeatures, checkEqual_VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceUniformBufferStandardLayoutFeatures,
+                      checkEqual_VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR)
 
 #endif
 #ifdef VK_KHR_buffer_device_address
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceBufferDeviceAddressFeatures, checkEqual_VkPhysicalDeviceBufferDeviceAddressFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceBufferDeviceAddressFeatures,
+                      checkEqual_VkPhysicalDeviceBufferDeviceAddressFeaturesKHR)
 
 DEFINE_ALIAS_FUNCTION(checkEqual_VkBufferDeviceAddressInfo, checkEqual_VkBufferDeviceAddressInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkBufferOpaqueCaptureAddressCreateInfo, checkEqual_VkBufferOpaqueCaptureAddressCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkBufferOpaqueCaptureAddressCreateInfo,
+                      checkEqual_VkBufferOpaqueCaptureAddressCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkMemoryOpaqueCaptureAddressAllocateInfo, checkEqual_VkMemoryOpaqueCaptureAddressAllocateInfoKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkMemoryOpaqueCaptureAddressAllocateInfo,
+                      checkEqual_VkMemoryOpaqueCaptureAddressAllocateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkDeviceMemoryOpaqueCaptureAddressInfo, checkEqual_VkDeviceMemoryOpaqueCaptureAddressInfoKHR)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkDeviceMemoryOpaqueCaptureAddressInfo,
+                      checkEqual_VkDeviceMemoryOpaqueCaptureAddressInfoKHR)
 
 #endif
 #ifdef VK_KHR_deferred_host_operations
@@ -2042,256 +1680,193 @@
 #ifdef VK_KHR_pipeline_executable_properties
 void checkEqual_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(
     const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* a,
-    const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkPipelineInfoKHR(
-    const VkPipelineInfoKHR* a,
-    const VkPipelineInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPipelineInfoKHR(const VkPipelineInfoKHR* a, const VkPipelineInfoKHR* b,
+                                  OnFailCompareFunc onFail);
 
-void checkEqual_VkPipelineExecutablePropertiesKHR(
-    const VkPipelineExecutablePropertiesKHR* a,
-    const VkPipelineExecutablePropertiesKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPipelineExecutablePropertiesKHR(const VkPipelineExecutablePropertiesKHR* a,
+                                                  const VkPipelineExecutablePropertiesKHR* b,
+                                                  OnFailCompareFunc onFail);
 
-void checkEqual_VkPipelineExecutableInfoKHR(
-    const VkPipelineExecutableInfoKHR* a,
-    const VkPipelineExecutableInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPipelineExecutableInfoKHR(const VkPipelineExecutableInfoKHR* a,
+                                            const VkPipelineExecutableInfoKHR* b,
+                                            OnFailCompareFunc onFail);
 
 void checkEqual_VkPipelineExecutableStatisticValueKHR(
-    const VkPipelineExecutableStatisticValueKHR* a,
-    const VkPipelineExecutableStatisticValueKHR* b,
+    const VkPipelineExecutableStatisticValueKHR* a, const VkPipelineExecutableStatisticValueKHR* b,
     OnFailCompareFunc onFail);
 
-void checkEqual_VkPipelineExecutableStatisticKHR(
-    const VkPipelineExecutableStatisticKHR* a,
-    const VkPipelineExecutableStatisticKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPipelineExecutableStatisticKHR(const VkPipelineExecutableStatisticKHR* a,
+                                                 const VkPipelineExecutableStatisticKHR* b,
+                                                 OnFailCompareFunc onFail);
 
 void checkEqual_VkPipelineExecutableInternalRepresentationKHR(
     const VkPipelineExecutableInternalRepresentationKHR* a,
-    const VkPipelineExecutableInternalRepresentationKHR* b,
-    OnFailCompareFunc onFail);
+    const VkPipelineExecutableInternalRepresentationKHR* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_shader_integer_dot_product
 void checkEqual_VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR(
     const VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR* a,
-    const VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR(
     const VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR* a,
-    const VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_pipeline_library
-void checkEqual_VkPipelineLibraryCreateInfoKHR(
-    const VkPipelineLibraryCreateInfoKHR* a,
-    const VkPipelineLibraryCreateInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPipelineLibraryCreateInfoKHR(const VkPipelineLibraryCreateInfoKHR* a,
+                                               const VkPipelineLibraryCreateInfoKHR* b,
+                                               OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_shader_non_semantic_info
 #endif
 #ifdef VK_KHR_present_id
-void checkEqual_VkPresentIdKHR(
-    const VkPresentIdKHR* a,
-    const VkPresentIdKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPresentIdKHR(const VkPresentIdKHR* a, const VkPresentIdKHR* b,
+                               OnFailCompareFunc onFail);
 
-void checkEqual_VkPhysicalDevicePresentIdFeaturesKHR(
-    const VkPhysicalDevicePresentIdFeaturesKHR* a,
-    const VkPhysicalDevicePresentIdFeaturesKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPhysicalDevicePresentIdFeaturesKHR(const VkPhysicalDevicePresentIdFeaturesKHR* a,
+                                                     const VkPhysicalDevicePresentIdFeaturesKHR* b,
+                                                     OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_video_encode_queue
-void checkEqual_VkVideoEncodeInfoKHR(
-    const VkVideoEncodeInfoKHR* a,
-    const VkVideoEncodeInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVideoEncodeInfoKHR(const VkVideoEncodeInfoKHR* a, const VkVideoEncodeInfoKHR* b,
+                                     OnFailCompareFunc onFail);
 
-void checkEqual_VkVideoEncodeRateControlInfoKHR(
-    const VkVideoEncodeRateControlInfoKHR* a,
-    const VkVideoEncodeRateControlInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVideoEncodeRateControlInfoKHR(const VkVideoEncodeRateControlInfoKHR* a,
+                                                const VkVideoEncodeRateControlInfoKHR* b,
+                                                OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_synchronization2
-void checkEqual_VkMemoryBarrier2KHR(
-    const VkMemoryBarrier2KHR* a,
-    const VkMemoryBarrier2KHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkMemoryBarrier2KHR(const VkMemoryBarrier2KHR* a, const VkMemoryBarrier2KHR* b,
+                                    OnFailCompareFunc onFail);
 
-void checkEqual_VkBufferMemoryBarrier2KHR(
-    const VkBufferMemoryBarrier2KHR* a,
-    const VkBufferMemoryBarrier2KHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkBufferMemoryBarrier2KHR(const VkBufferMemoryBarrier2KHR* a,
+                                          const VkBufferMemoryBarrier2KHR* b,
+                                          OnFailCompareFunc onFail);
 
-void checkEqual_VkImageMemoryBarrier2KHR(
-    const VkImageMemoryBarrier2KHR* a,
-    const VkImageMemoryBarrier2KHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImageMemoryBarrier2KHR(const VkImageMemoryBarrier2KHR* a,
+                                         const VkImageMemoryBarrier2KHR* b,
+                                         OnFailCompareFunc onFail);
 
-void checkEqual_VkDependencyInfoKHR(
-    const VkDependencyInfoKHR* a,
-    const VkDependencyInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDependencyInfoKHR(const VkDependencyInfoKHR* a, const VkDependencyInfoKHR* b,
+                                    OnFailCompareFunc onFail);
 
-void checkEqual_VkSemaphoreSubmitInfoKHR(
-    const VkSemaphoreSubmitInfoKHR* a,
-    const VkSemaphoreSubmitInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSemaphoreSubmitInfoKHR(const VkSemaphoreSubmitInfoKHR* a,
+                                         const VkSemaphoreSubmitInfoKHR* b,
+                                         OnFailCompareFunc onFail);
 
-void checkEqual_VkCommandBufferSubmitInfoKHR(
-    const VkCommandBufferSubmitInfoKHR* a,
-    const VkCommandBufferSubmitInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkCommandBufferSubmitInfoKHR(const VkCommandBufferSubmitInfoKHR* a,
+                                             const VkCommandBufferSubmitInfoKHR* b,
+                                             OnFailCompareFunc onFail);
 
-void checkEqual_VkSubmitInfo2KHR(
-    const VkSubmitInfo2KHR* a,
-    const VkSubmitInfo2KHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSubmitInfo2KHR(const VkSubmitInfo2KHR* a, const VkSubmitInfo2KHR* b,
+                                 OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceSynchronization2FeaturesKHR(
     const VkPhysicalDeviceSynchronization2FeaturesKHR* a,
-    const VkPhysicalDeviceSynchronization2FeaturesKHR* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceSynchronization2FeaturesKHR* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkQueueFamilyCheckpointProperties2NV(
-    const VkQueueFamilyCheckpointProperties2NV* a,
-    const VkQueueFamilyCheckpointProperties2NV* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkQueueFamilyCheckpointProperties2NV(const VkQueueFamilyCheckpointProperties2NV* a,
+                                                     const VkQueueFamilyCheckpointProperties2NV* b,
+                                                     OnFailCompareFunc onFail);
 
-void checkEqual_VkCheckpointData2NV(
-    const VkCheckpointData2NV* a,
-    const VkCheckpointData2NV* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkCheckpointData2NV(const VkCheckpointData2NV* a, const VkCheckpointData2NV* b,
+                                    OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_shader_subgroup_uniform_control_flow
 void checkEqual_VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR(
     const VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR* a,
-    const VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_zero_initialize_workgroup_memory
 void checkEqual_VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR(
     const VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR* a,
-    const VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_workgroup_memory_explicit_layout
 void checkEqual_VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR(
     const VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR* a,
-    const VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_copy_commands2
-void checkEqual_VkBufferCopy2KHR(
-    const VkBufferCopy2KHR* a,
-    const VkBufferCopy2KHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkBufferCopy2KHR(const VkBufferCopy2KHR* a, const VkBufferCopy2KHR* b,
+                                 OnFailCompareFunc onFail);
 
-void checkEqual_VkCopyBufferInfo2KHR(
-    const VkCopyBufferInfo2KHR* a,
-    const VkCopyBufferInfo2KHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkCopyBufferInfo2KHR(const VkCopyBufferInfo2KHR* a, const VkCopyBufferInfo2KHR* b,
+                                     OnFailCompareFunc onFail);
 
-void checkEqual_VkImageCopy2KHR(
-    const VkImageCopy2KHR* a,
-    const VkImageCopy2KHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImageCopy2KHR(const VkImageCopy2KHR* a, const VkImageCopy2KHR* b,
+                                OnFailCompareFunc onFail);
 
-void checkEqual_VkCopyImageInfo2KHR(
-    const VkCopyImageInfo2KHR* a,
-    const VkCopyImageInfo2KHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkCopyImageInfo2KHR(const VkCopyImageInfo2KHR* a, const VkCopyImageInfo2KHR* b,
+                                    OnFailCompareFunc onFail);
 
-void checkEqual_VkBufferImageCopy2KHR(
-    const VkBufferImageCopy2KHR* a,
-    const VkBufferImageCopy2KHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkBufferImageCopy2KHR(const VkBufferImageCopy2KHR* a,
+                                      const VkBufferImageCopy2KHR* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkCopyBufferToImageInfo2KHR(
-    const VkCopyBufferToImageInfo2KHR* a,
-    const VkCopyBufferToImageInfo2KHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkCopyBufferToImageInfo2KHR(const VkCopyBufferToImageInfo2KHR* a,
+                                            const VkCopyBufferToImageInfo2KHR* b,
+                                            OnFailCompareFunc onFail);
 
-void checkEqual_VkCopyImageToBufferInfo2KHR(
-    const VkCopyImageToBufferInfo2KHR* a,
-    const VkCopyImageToBufferInfo2KHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkCopyImageToBufferInfo2KHR(const VkCopyImageToBufferInfo2KHR* a,
+                                            const VkCopyImageToBufferInfo2KHR* b,
+                                            OnFailCompareFunc onFail);
 
-void checkEqual_VkImageBlit2KHR(
-    const VkImageBlit2KHR* a,
-    const VkImageBlit2KHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImageBlit2KHR(const VkImageBlit2KHR* a, const VkImageBlit2KHR* b,
+                                OnFailCompareFunc onFail);
 
-void checkEqual_VkBlitImageInfo2KHR(
-    const VkBlitImageInfo2KHR* a,
-    const VkBlitImageInfo2KHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkBlitImageInfo2KHR(const VkBlitImageInfo2KHR* a, const VkBlitImageInfo2KHR* b,
+                                    OnFailCompareFunc onFail);
 
-void checkEqual_VkImageResolve2KHR(
-    const VkImageResolve2KHR* a,
-    const VkImageResolve2KHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImageResolve2KHR(const VkImageResolve2KHR* a, const VkImageResolve2KHR* b,
+                                   OnFailCompareFunc onFail);
 
-void checkEqual_VkResolveImageInfo2KHR(
-    const VkResolveImageInfo2KHR* a,
-    const VkResolveImageInfo2KHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkResolveImageInfo2KHR(const VkResolveImageInfo2KHR* a,
+                                       const VkResolveImageInfo2KHR* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_format_feature_flags2
-void checkEqual_VkFormatProperties3KHR(
-    const VkFormatProperties3KHR* a,
-    const VkFormatProperties3KHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkFormatProperties3KHR(const VkFormatProperties3KHR* a,
+                                       const VkFormatProperties3KHR* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_maintenance4
 void checkEqual_VkPhysicalDeviceMaintenance4FeaturesKHR(
     const VkPhysicalDeviceMaintenance4FeaturesKHR* a,
-    const VkPhysicalDeviceMaintenance4FeaturesKHR* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceMaintenance4FeaturesKHR* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceMaintenance4PropertiesKHR(
     const VkPhysicalDeviceMaintenance4PropertiesKHR* a,
-    const VkPhysicalDeviceMaintenance4PropertiesKHR* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceMaintenance4PropertiesKHR* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkDeviceBufferMemoryRequirementsKHR(
-    const VkDeviceBufferMemoryRequirementsKHR* a,
-    const VkDeviceBufferMemoryRequirementsKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDeviceBufferMemoryRequirementsKHR(const VkDeviceBufferMemoryRequirementsKHR* a,
+                                                    const VkDeviceBufferMemoryRequirementsKHR* b,
+                                                    OnFailCompareFunc onFail);
 
-void checkEqual_VkDeviceImageMemoryRequirementsKHR(
-    const VkDeviceImageMemoryRequirementsKHR* a,
-    const VkDeviceImageMemoryRequirementsKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDeviceImageMemoryRequirementsKHR(const VkDeviceImageMemoryRequirementsKHR* a,
+                                                   const VkDeviceImageMemoryRequirementsKHR* b,
+                                                   OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_ANDROID_native_buffer
-void checkEqual_VkNativeBufferANDROID(
-    const VkNativeBufferANDROID* a,
-    const VkNativeBufferANDROID* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkNativeBufferANDROID(const VkNativeBufferANDROID* a,
+                                      const VkNativeBufferANDROID* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_debug_report
-void checkEqual_VkDebugReportCallbackCreateInfoEXT(
-    const VkDebugReportCallbackCreateInfoEXT* a,
-    const VkDebugReportCallbackCreateInfoEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDebugReportCallbackCreateInfoEXT(const VkDebugReportCallbackCreateInfoEXT* a,
+                                                   const VkDebugReportCallbackCreateInfoEXT* b,
+                                                   OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_NV_glsl_shader
@@ -2303,8 +1878,7 @@
 #ifdef VK_AMD_rasterization_order
 void checkEqual_VkPipelineRasterizationStateRasterizationOrderAMD(
     const VkPipelineRasterizationStateRasterizationOrderAMD* a,
-    const VkPipelineRasterizationStateRasterizationOrderAMD* b,
-    OnFailCompareFunc onFail);
+    const VkPipelineRasterizationStateRasterizationOrderAMD* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_AMD_shader_trinary_minmax
@@ -2312,20 +1886,17 @@
 #ifdef VK_AMD_shader_explicit_vertex_parameter
 #endif
 #ifdef VK_EXT_debug_marker
-void checkEqual_VkDebugMarkerObjectNameInfoEXT(
-    const VkDebugMarkerObjectNameInfoEXT* a,
-    const VkDebugMarkerObjectNameInfoEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDebugMarkerObjectNameInfoEXT(const VkDebugMarkerObjectNameInfoEXT* a,
+                                               const VkDebugMarkerObjectNameInfoEXT* b,
+                                               OnFailCompareFunc onFail);
 
-void checkEqual_VkDebugMarkerObjectTagInfoEXT(
-    const VkDebugMarkerObjectTagInfoEXT* a,
-    const VkDebugMarkerObjectTagInfoEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDebugMarkerObjectTagInfoEXT(const VkDebugMarkerObjectTagInfoEXT* a,
+                                              const VkDebugMarkerObjectTagInfoEXT* b,
+                                              OnFailCompareFunc onFail);
 
-void checkEqual_VkDebugMarkerMarkerInfoEXT(
-    const VkDebugMarkerMarkerInfoEXT* a,
-    const VkDebugMarkerMarkerInfoEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDebugMarkerMarkerInfoEXT(const VkDebugMarkerMarkerInfoEXT* a,
+                                           const VkDebugMarkerMarkerInfoEXT* b,
+                                           OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_AMD_gcn_shader
@@ -2333,64 +1904,51 @@
 #ifdef VK_NV_dedicated_allocation
 void checkEqual_VkDedicatedAllocationImageCreateInfoNV(
     const VkDedicatedAllocationImageCreateInfoNV* a,
-    const VkDedicatedAllocationImageCreateInfoNV* b,
-    OnFailCompareFunc onFail);
+    const VkDedicatedAllocationImageCreateInfoNV* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkDedicatedAllocationBufferCreateInfoNV(
     const VkDedicatedAllocationBufferCreateInfoNV* a,
-    const VkDedicatedAllocationBufferCreateInfoNV* b,
-    OnFailCompareFunc onFail);
+    const VkDedicatedAllocationBufferCreateInfoNV* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkDedicatedAllocationMemoryAllocateInfoNV(
     const VkDedicatedAllocationMemoryAllocateInfoNV* a,
-    const VkDedicatedAllocationMemoryAllocateInfoNV* b,
-    OnFailCompareFunc onFail);
+    const VkDedicatedAllocationMemoryAllocateInfoNV* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_transform_feedback
 void checkEqual_VkPhysicalDeviceTransformFeedbackFeaturesEXT(
     const VkPhysicalDeviceTransformFeedbackFeaturesEXT* a,
-    const VkPhysicalDeviceTransformFeedbackFeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceTransformFeedbackFeaturesEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceTransformFeedbackPropertiesEXT(
     const VkPhysicalDeviceTransformFeedbackPropertiesEXT* a,
-    const VkPhysicalDeviceTransformFeedbackPropertiesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceTransformFeedbackPropertiesEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPipelineRasterizationStateStreamCreateInfoEXT(
     const VkPipelineRasterizationStateStreamCreateInfoEXT* a,
-    const VkPipelineRasterizationStateStreamCreateInfoEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPipelineRasterizationStateStreamCreateInfoEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_NVX_binary_import
-void checkEqual_VkCuModuleCreateInfoNVX(
-    const VkCuModuleCreateInfoNVX* a,
-    const VkCuModuleCreateInfoNVX* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkCuModuleCreateInfoNVX(const VkCuModuleCreateInfoNVX* a,
+                                        const VkCuModuleCreateInfoNVX* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkCuFunctionCreateInfoNVX(
-    const VkCuFunctionCreateInfoNVX* a,
-    const VkCuFunctionCreateInfoNVX* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkCuFunctionCreateInfoNVX(const VkCuFunctionCreateInfoNVX* a,
+                                          const VkCuFunctionCreateInfoNVX* b,
+                                          OnFailCompareFunc onFail);
 
-void checkEqual_VkCuLaunchInfoNVX(
-    const VkCuLaunchInfoNVX* a,
-    const VkCuLaunchInfoNVX* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkCuLaunchInfoNVX(const VkCuLaunchInfoNVX* a, const VkCuLaunchInfoNVX* b,
+                                  OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_NVX_image_view_handle
-void checkEqual_VkImageViewHandleInfoNVX(
-    const VkImageViewHandleInfoNVX* a,
-    const VkImageViewHandleInfoNVX* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImageViewHandleInfoNVX(const VkImageViewHandleInfoNVX* a,
+                                         const VkImageViewHandleInfoNVX* b,
+                                         OnFailCompareFunc onFail);
 
-void checkEqual_VkImageViewAddressPropertiesNVX(
-    const VkImageViewAddressPropertiesNVX* a,
-    const VkImageViewAddressPropertiesNVX* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImageViewAddressPropertiesNVX(const VkImageViewAddressPropertiesNVX* a,
+                                                const VkImageViewAddressPropertiesNVX* b,
+                                                OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_AMD_draw_indirect_count
@@ -2402,163 +1960,132 @@
 #ifdef VK_AMD_shader_ballot
 #endif
 #ifdef VK_EXT_video_encode_h264
-void checkEqual_VkVideoEncodeH264CapabilitiesEXT(
-    const VkVideoEncodeH264CapabilitiesEXT* a,
-    const VkVideoEncodeH264CapabilitiesEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVideoEncodeH264CapabilitiesEXT(const VkVideoEncodeH264CapabilitiesEXT* a,
+                                                 const VkVideoEncodeH264CapabilitiesEXT* b,
+                                                 OnFailCompareFunc onFail);
 
 void checkEqual_VkVideoEncodeH264SessionCreateInfoEXT(
-    const VkVideoEncodeH264SessionCreateInfoEXT* a,
-    const VkVideoEncodeH264SessionCreateInfoEXT* b,
+    const VkVideoEncodeH264SessionCreateInfoEXT* a, const VkVideoEncodeH264SessionCreateInfoEXT* b,
     OnFailCompareFunc onFail);
 
 void checkEqual_VkVideoEncodeH264SessionParametersAddInfoEXT(
     const VkVideoEncodeH264SessionParametersAddInfoEXT* a,
-    const VkVideoEncodeH264SessionParametersAddInfoEXT* b,
-    OnFailCompareFunc onFail);
+    const VkVideoEncodeH264SessionParametersAddInfoEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkVideoEncodeH264SessionParametersCreateInfoEXT(
     const VkVideoEncodeH264SessionParametersCreateInfoEXT* a,
-    const VkVideoEncodeH264SessionParametersCreateInfoEXT* b,
-    OnFailCompareFunc onFail);
+    const VkVideoEncodeH264SessionParametersCreateInfoEXT* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkVideoEncodeH264DpbSlotInfoEXT(
-    const VkVideoEncodeH264DpbSlotInfoEXT* a,
-    const VkVideoEncodeH264DpbSlotInfoEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVideoEncodeH264DpbSlotInfoEXT(const VkVideoEncodeH264DpbSlotInfoEXT* a,
+                                                const VkVideoEncodeH264DpbSlotInfoEXT* b,
+                                                OnFailCompareFunc onFail);
 
-void checkEqual_VkVideoEncodeH264NaluSliceEXT(
-    const VkVideoEncodeH264NaluSliceEXT* a,
-    const VkVideoEncodeH264NaluSliceEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVideoEncodeH264NaluSliceEXT(const VkVideoEncodeH264NaluSliceEXT* a,
+                                              const VkVideoEncodeH264NaluSliceEXT* b,
+                                              OnFailCompareFunc onFail);
 
-void checkEqual_VkVideoEncodeH264VclFrameInfoEXT(
-    const VkVideoEncodeH264VclFrameInfoEXT* a,
-    const VkVideoEncodeH264VclFrameInfoEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVideoEncodeH264VclFrameInfoEXT(const VkVideoEncodeH264VclFrameInfoEXT* a,
+                                                 const VkVideoEncodeH264VclFrameInfoEXT* b,
+                                                 OnFailCompareFunc onFail);
 
 void checkEqual_VkVideoEncodeH264EmitPictureParametersEXT(
     const VkVideoEncodeH264EmitPictureParametersEXT* a,
-    const VkVideoEncodeH264EmitPictureParametersEXT* b,
-    OnFailCompareFunc onFail);
+    const VkVideoEncodeH264EmitPictureParametersEXT* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkVideoEncodeH264ProfileEXT(
-    const VkVideoEncodeH264ProfileEXT* a,
-    const VkVideoEncodeH264ProfileEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVideoEncodeH264ProfileEXT(const VkVideoEncodeH264ProfileEXT* a,
+                                            const VkVideoEncodeH264ProfileEXT* b,
+                                            OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_video_encode_h265
-void checkEqual_VkVideoEncodeH265CapabilitiesEXT(
-    const VkVideoEncodeH265CapabilitiesEXT* a,
-    const VkVideoEncodeH265CapabilitiesEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVideoEncodeH265CapabilitiesEXT(const VkVideoEncodeH265CapabilitiesEXT* a,
+                                                 const VkVideoEncodeH265CapabilitiesEXT* b,
+                                                 OnFailCompareFunc onFail);
 
 void checkEqual_VkVideoEncodeH265SessionCreateInfoEXT(
-    const VkVideoEncodeH265SessionCreateInfoEXT* a,
-    const VkVideoEncodeH265SessionCreateInfoEXT* b,
+    const VkVideoEncodeH265SessionCreateInfoEXT* a, const VkVideoEncodeH265SessionCreateInfoEXT* b,
     OnFailCompareFunc onFail);
 
 void checkEqual_VkVideoEncodeH265SessionParametersAddInfoEXT(
     const VkVideoEncodeH265SessionParametersAddInfoEXT* a,
-    const VkVideoEncodeH265SessionParametersAddInfoEXT* b,
-    OnFailCompareFunc onFail);
+    const VkVideoEncodeH265SessionParametersAddInfoEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkVideoEncodeH265SessionParametersCreateInfoEXT(
     const VkVideoEncodeH265SessionParametersCreateInfoEXT* a,
-    const VkVideoEncodeH265SessionParametersCreateInfoEXT* b,
-    OnFailCompareFunc onFail);
+    const VkVideoEncodeH265SessionParametersCreateInfoEXT* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkVideoEncodeH265DpbSlotInfoEXT(
-    const VkVideoEncodeH265DpbSlotInfoEXT* a,
-    const VkVideoEncodeH265DpbSlotInfoEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVideoEncodeH265DpbSlotInfoEXT(const VkVideoEncodeH265DpbSlotInfoEXT* a,
+                                                const VkVideoEncodeH265DpbSlotInfoEXT* b,
+                                                OnFailCompareFunc onFail);
 
-void checkEqual_VkVideoEncodeH265ReferenceListsEXT(
-    const VkVideoEncodeH265ReferenceListsEXT* a,
-    const VkVideoEncodeH265ReferenceListsEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVideoEncodeH265ReferenceListsEXT(const VkVideoEncodeH265ReferenceListsEXT* a,
+                                                   const VkVideoEncodeH265ReferenceListsEXT* b,
+                                                   OnFailCompareFunc onFail);
 
-void checkEqual_VkVideoEncodeH265NaluSliceEXT(
-    const VkVideoEncodeH265NaluSliceEXT* a,
-    const VkVideoEncodeH265NaluSliceEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVideoEncodeH265NaluSliceEXT(const VkVideoEncodeH265NaluSliceEXT* a,
+                                              const VkVideoEncodeH265NaluSliceEXT* b,
+                                              OnFailCompareFunc onFail);
 
-void checkEqual_VkVideoEncodeH265VclFrameInfoEXT(
-    const VkVideoEncodeH265VclFrameInfoEXT* a,
-    const VkVideoEncodeH265VclFrameInfoEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVideoEncodeH265VclFrameInfoEXT(const VkVideoEncodeH265VclFrameInfoEXT* a,
+                                                 const VkVideoEncodeH265VclFrameInfoEXT* b,
+                                                 OnFailCompareFunc onFail);
 
 void checkEqual_VkVideoEncodeH265EmitPictureParametersEXT(
     const VkVideoEncodeH265EmitPictureParametersEXT* a,
-    const VkVideoEncodeH265EmitPictureParametersEXT* b,
-    OnFailCompareFunc onFail);
+    const VkVideoEncodeH265EmitPictureParametersEXT* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkVideoEncodeH265ProfileEXT(
-    const VkVideoEncodeH265ProfileEXT* a,
-    const VkVideoEncodeH265ProfileEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVideoEncodeH265ProfileEXT(const VkVideoEncodeH265ProfileEXT* a,
+                                            const VkVideoEncodeH265ProfileEXT* b,
+                                            OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_video_decode_h264
-void checkEqual_VkVideoDecodeH264ProfileEXT(
-    const VkVideoDecodeH264ProfileEXT* a,
-    const VkVideoDecodeH264ProfileEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVideoDecodeH264ProfileEXT(const VkVideoDecodeH264ProfileEXT* a,
+                                            const VkVideoDecodeH264ProfileEXT* b,
+                                            OnFailCompareFunc onFail);
 
-void checkEqual_VkVideoDecodeH264CapabilitiesEXT(
-    const VkVideoDecodeH264CapabilitiesEXT* a,
-    const VkVideoDecodeH264CapabilitiesEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVideoDecodeH264CapabilitiesEXT(const VkVideoDecodeH264CapabilitiesEXT* a,
+                                                 const VkVideoDecodeH264CapabilitiesEXT* b,
+                                                 OnFailCompareFunc onFail);
 
 void checkEqual_VkVideoDecodeH264SessionCreateInfoEXT(
-    const VkVideoDecodeH264SessionCreateInfoEXT* a,
-    const VkVideoDecodeH264SessionCreateInfoEXT* b,
+    const VkVideoDecodeH264SessionCreateInfoEXT* a, const VkVideoDecodeH264SessionCreateInfoEXT* b,
     OnFailCompareFunc onFail);
 
 void checkEqual_VkVideoDecodeH264SessionParametersAddInfoEXT(
     const VkVideoDecodeH264SessionParametersAddInfoEXT* a,
-    const VkVideoDecodeH264SessionParametersAddInfoEXT* b,
-    OnFailCompareFunc onFail);
+    const VkVideoDecodeH264SessionParametersAddInfoEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkVideoDecodeH264SessionParametersCreateInfoEXT(
     const VkVideoDecodeH264SessionParametersCreateInfoEXT* a,
-    const VkVideoDecodeH264SessionParametersCreateInfoEXT* b,
-    OnFailCompareFunc onFail);
+    const VkVideoDecodeH264SessionParametersCreateInfoEXT* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkVideoDecodeH264PictureInfoEXT(
-    const VkVideoDecodeH264PictureInfoEXT* a,
-    const VkVideoDecodeH264PictureInfoEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVideoDecodeH264PictureInfoEXT(const VkVideoDecodeH264PictureInfoEXT* a,
+                                                const VkVideoDecodeH264PictureInfoEXT* b,
+                                                OnFailCompareFunc onFail);
 
-void checkEqual_VkVideoDecodeH264MvcEXT(
-    const VkVideoDecodeH264MvcEXT* a,
-    const VkVideoDecodeH264MvcEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVideoDecodeH264MvcEXT(const VkVideoDecodeH264MvcEXT* a,
+                                        const VkVideoDecodeH264MvcEXT* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkVideoDecodeH264DpbSlotInfoEXT(
-    const VkVideoDecodeH264DpbSlotInfoEXT* a,
-    const VkVideoDecodeH264DpbSlotInfoEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVideoDecodeH264DpbSlotInfoEXT(const VkVideoDecodeH264DpbSlotInfoEXT* a,
+                                                const VkVideoDecodeH264DpbSlotInfoEXT* b,
+                                                OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_AMD_texture_gather_bias_lod
 void checkEqual_VkTextureLODGatherFormatPropertiesAMD(
-    const VkTextureLODGatherFormatPropertiesAMD* a,
-    const VkTextureLODGatherFormatPropertiesAMD* b,
+    const VkTextureLODGatherFormatPropertiesAMD* a, const VkTextureLODGatherFormatPropertiesAMD* b,
     OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_AMD_shader_info
-void checkEqual_VkShaderResourceUsageAMD(
-    const VkShaderResourceUsageAMD* a,
-    const VkShaderResourceUsageAMD* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkShaderResourceUsageAMD(const VkShaderResourceUsageAMD* a,
+                                         const VkShaderResourceUsageAMD* b,
+                                         OnFailCompareFunc onFail);
 
-void checkEqual_VkShaderStatisticsInfoAMD(
-    const VkShaderStatisticsInfoAMD* a,
-    const VkShaderStatisticsInfoAMD* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkShaderStatisticsInfoAMD(const VkShaderStatisticsInfoAMD* a,
+                                          const VkShaderStatisticsInfoAMD* b,
+                                          OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_AMD_shader_image_load_store_lod
@@ -2566,69 +2093,57 @@
 #ifdef VK_GGP_stream_descriptor_surface
 void checkEqual_VkStreamDescriptorSurfaceCreateInfoGGP(
     const VkStreamDescriptorSurfaceCreateInfoGGP* a,
-    const VkStreamDescriptorSurfaceCreateInfoGGP* b,
-    OnFailCompareFunc onFail);
+    const VkStreamDescriptorSurfaceCreateInfoGGP* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_NV_corner_sampled_image
 void checkEqual_VkPhysicalDeviceCornerSampledImageFeaturesNV(
     const VkPhysicalDeviceCornerSampledImageFeaturesNV* a,
-    const VkPhysicalDeviceCornerSampledImageFeaturesNV* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceCornerSampledImageFeaturesNV* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_IMG_format_pvrtc
 #endif
 #ifdef VK_NV_external_memory_capabilities
-void checkEqual_VkExternalImageFormatPropertiesNV(
-    const VkExternalImageFormatPropertiesNV* a,
-    const VkExternalImageFormatPropertiesNV* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkExternalImageFormatPropertiesNV(const VkExternalImageFormatPropertiesNV* a,
+                                                  const VkExternalImageFormatPropertiesNV* b,
+                                                  OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_NV_external_memory
-void checkEqual_VkExternalMemoryImageCreateInfoNV(
-    const VkExternalMemoryImageCreateInfoNV* a,
-    const VkExternalMemoryImageCreateInfoNV* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkExternalMemoryImageCreateInfoNV(const VkExternalMemoryImageCreateInfoNV* a,
+                                                  const VkExternalMemoryImageCreateInfoNV* b,
+                                                  OnFailCompareFunc onFail);
 
-void checkEqual_VkExportMemoryAllocateInfoNV(
-    const VkExportMemoryAllocateInfoNV* a,
-    const VkExportMemoryAllocateInfoNV* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkExportMemoryAllocateInfoNV(const VkExportMemoryAllocateInfoNV* a,
+                                             const VkExportMemoryAllocateInfoNV* b,
+                                             OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_NV_external_memory_win32
-void checkEqual_VkImportMemoryWin32HandleInfoNV(
-    const VkImportMemoryWin32HandleInfoNV* a,
-    const VkImportMemoryWin32HandleInfoNV* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImportMemoryWin32HandleInfoNV(const VkImportMemoryWin32HandleInfoNV* a,
+                                                const VkImportMemoryWin32HandleInfoNV* b,
+                                                OnFailCompareFunc onFail);
 
-void checkEqual_VkExportMemoryWin32HandleInfoNV(
-    const VkExportMemoryWin32HandleInfoNV* a,
-    const VkExportMemoryWin32HandleInfoNV* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkExportMemoryWin32HandleInfoNV(const VkExportMemoryWin32HandleInfoNV* a,
+                                                const VkExportMemoryWin32HandleInfoNV* b,
+                                                OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_NV_win32_keyed_mutex
 void checkEqual_VkWin32KeyedMutexAcquireReleaseInfoNV(
-    const VkWin32KeyedMutexAcquireReleaseInfoNV* a,
-    const VkWin32KeyedMutexAcquireReleaseInfoNV* b,
+    const VkWin32KeyedMutexAcquireReleaseInfoNV* a, const VkWin32KeyedMutexAcquireReleaseInfoNV* b,
     OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_validation_flags
-void checkEqual_VkValidationFlagsEXT(
-    const VkValidationFlagsEXT* a,
-    const VkValidationFlagsEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkValidationFlagsEXT(const VkValidationFlagsEXT* a, const VkValidationFlagsEXT* b,
+                                     OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_NN_vi_surface
-void checkEqual_VkViSurfaceCreateInfoNN(
-    const VkViSurfaceCreateInfoNN* a,
-    const VkViSurfaceCreateInfoNN* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkViSurfaceCreateInfoNN(const VkViSurfaceCreateInfoNN* a,
+                                        const VkViSurfaceCreateInfoNN* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_shader_subgroup_ballot
@@ -2638,49 +2153,40 @@
 #ifdef VK_EXT_texture_compression_astc_hdr
 void checkEqual_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(
     const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* a,
-    const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_astc_decode_mode
-void checkEqual_VkImageViewASTCDecodeModeEXT(
-    const VkImageViewASTCDecodeModeEXT* a,
-    const VkImageViewASTCDecodeModeEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImageViewASTCDecodeModeEXT(const VkImageViewASTCDecodeModeEXT* a,
+                                             const VkImageViewASTCDecodeModeEXT* b,
+                                             OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceASTCDecodeFeaturesEXT(
-    const VkPhysicalDeviceASTCDecodeFeaturesEXT* a,
-    const VkPhysicalDeviceASTCDecodeFeaturesEXT* b,
+    const VkPhysicalDeviceASTCDecodeFeaturesEXT* a, const VkPhysicalDeviceASTCDecodeFeaturesEXT* b,
     OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_conditional_rendering
-void checkEqual_VkConditionalRenderingBeginInfoEXT(
-    const VkConditionalRenderingBeginInfoEXT* a,
-    const VkConditionalRenderingBeginInfoEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkConditionalRenderingBeginInfoEXT(const VkConditionalRenderingBeginInfoEXT* a,
+                                                   const VkConditionalRenderingBeginInfoEXT* b,
+                                                   OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
     const VkPhysicalDeviceConditionalRenderingFeaturesEXT* a,
-    const VkPhysicalDeviceConditionalRenderingFeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceConditionalRenderingFeaturesEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
     const VkCommandBufferInheritanceConditionalRenderingInfoEXT* a,
-    const VkCommandBufferInheritanceConditionalRenderingInfoEXT* b,
-    OnFailCompareFunc onFail);
+    const VkCommandBufferInheritanceConditionalRenderingInfoEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_NV_clip_space_w_scaling
-void checkEqual_VkViewportWScalingNV(
-    const VkViewportWScalingNV* a,
-    const VkViewportWScalingNV* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkViewportWScalingNV(const VkViewportWScalingNV* a, const VkViewportWScalingNV* b,
+                                     OnFailCompareFunc onFail);
 
 void checkEqual_VkPipelineViewportWScalingStateCreateInfoNV(
     const VkPipelineViewportWScalingStateCreateInfoNV* a,
-    const VkPipelineViewportWScalingStateCreateInfoNV* b,
-    OnFailCompareFunc onFail);
+    const VkPipelineViewportWScalingStateCreateInfoNV* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_direct_mode_display
@@ -2688,54 +2194,41 @@
 #ifdef VK_EXT_acquire_xlib_display
 #endif
 #ifdef VK_EXT_display_surface_counter
-void checkEqual_VkSurfaceCapabilities2EXT(
-    const VkSurfaceCapabilities2EXT* a,
-    const VkSurfaceCapabilities2EXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSurfaceCapabilities2EXT(const VkSurfaceCapabilities2EXT* a,
+                                          const VkSurfaceCapabilities2EXT* b,
+                                          OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_display_control
-void checkEqual_VkDisplayPowerInfoEXT(
-    const VkDisplayPowerInfoEXT* a,
-    const VkDisplayPowerInfoEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDisplayPowerInfoEXT(const VkDisplayPowerInfoEXT* a,
+                                      const VkDisplayPowerInfoEXT* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkDeviceEventInfoEXT(
-    const VkDeviceEventInfoEXT* a,
-    const VkDeviceEventInfoEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDeviceEventInfoEXT(const VkDeviceEventInfoEXT* a, const VkDeviceEventInfoEXT* b,
+                                     OnFailCompareFunc onFail);
 
-void checkEqual_VkDisplayEventInfoEXT(
-    const VkDisplayEventInfoEXT* a,
-    const VkDisplayEventInfoEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDisplayEventInfoEXT(const VkDisplayEventInfoEXT* a,
+                                      const VkDisplayEventInfoEXT* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkSwapchainCounterCreateInfoEXT(
-    const VkSwapchainCounterCreateInfoEXT* a,
-    const VkSwapchainCounterCreateInfoEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSwapchainCounterCreateInfoEXT(const VkSwapchainCounterCreateInfoEXT* a,
+                                                const VkSwapchainCounterCreateInfoEXT* b,
+                                                OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_GOOGLE_display_timing
-void checkEqual_VkRefreshCycleDurationGOOGLE(
-    const VkRefreshCycleDurationGOOGLE* a,
-    const VkRefreshCycleDurationGOOGLE* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkRefreshCycleDurationGOOGLE(const VkRefreshCycleDurationGOOGLE* a,
+                                             const VkRefreshCycleDurationGOOGLE* b,
+                                             OnFailCompareFunc onFail);
 
-void checkEqual_VkPastPresentationTimingGOOGLE(
-    const VkPastPresentationTimingGOOGLE* a,
-    const VkPastPresentationTimingGOOGLE* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPastPresentationTimingGOOGLE(const VkPastPresentationTimingGOOGLE* a,
+                                               const VkPastPresentationTimingGOOGLE* b,
+                                               OnFailCompareFunc onFail);
 
-void checkEqual_VkPresentTimeGOOGLE(
-    const VkPresentTimeGOOGLE* a,
-    const VkPresentTimeGOOGLE* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPresentTimeGOOGLE(const VkPresentTimeGOOGLE* a, const VkPresentTimeGOOGLE* b,
+                                    OnFailCompareFunc onFail);
 
-void checkEqual_VkPresentTimesInfoGOOGLE(
-    const VkPresentTimesInfoGOOGLE* a,
-    const VkPresentTimesInfoGOOGLE* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPresentTimesInfoGOOGLE(const VkPresentTimesInfoGOOGLE* a,
+                                         const VkPresentTimesInfoGOOGLE* b,
+                                         OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_NV_sample_mask_override_coverage
@@ -2747,84 +2240,68 @@
 #ifdef VK_NVX_multiview_per_view_attributes
 void checkEqual_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
     const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* a,
-    const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_NV_viewport_swizzle
-void checkEqual_VkViewportSwizzleNV(
-    const VkViewportSwizzleNV* a,
-    const VkViewportSwizzleNV* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkViewportSwizzleNV(const VkViewportSwizzleNV* a, const VkViewportSwizzleNV* b,
+                                    OnFailCompareFunc onFail);
 
 void checkEqual_VkPipelineViewportSwizzleStateCreateInfoNV(
     const VkPipelineViewportSwizzleStateCreateInfoNV* a,
-    const VkPipelineViewportSwizzleStateCreateInfoNV* b,
-    OnFailCompareFunc onFail);
+    const VkPipelineViewportSwizzleStateCreateInfoNV* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_discard_rectangles
 void checkEqual_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
     const VkPhysicalDeviceDiscardRectanglePropertiesEXT* a,
-    const VkPhysicalDeviceDiscardRectanglePropertiesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceDiscardRectanglePropertiesEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPipelineDiscardRectangleStateCreateInfoEXT(
     const VkPipelineDiscardRectangleStateCreateInfoEXT* a,
-    const VkPipelineDiscardRectangleStateCreateInfoEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPipelineDiscardRectangleStateCreateInfoEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_conservative_rasterization
 void checkEqual_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
     const VkPhysicalDeviceConservativeRasterizationPropertiesEXT* a,
-    const VkPhysicalDeviceConservativeRasterizationPropertiesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceConservativeRasterizationPropertiesEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPipelineRasterizationConservativeStateCreateInfoEXT(
     const VkPipelineRasterizationConservativeStateCreateInfoEXT* a,
-    const VkPipelineRasterizationConservativeStateCreateInfoEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPipelineRasterizationConservativeStateCreateInfoEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_depth_clip_enable
 void checkEqual_VkPhysicalDeviceDepthClipEnableFeaturesEXT(
     const VkPhysicalDeviceDepthClipEnableFeaturesEXT* a,
-    const VkPhysicalDeviceDepthClipEnableFeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceDepthClipEnableFeaturesEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPipelineRasterizationDepthClipStateCreateInfoEXT(
     const VkPipelineRasterizationDepthClipStateCreateInfoEXT* a,
-    const VkPipelineRasterizationDepthClipStateCreateInfoEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPipelineRasterizationDepthClipStateCreateInfoEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_swapchain_colorspace
 #endif
 #ifdef VK_EXT_hdr_metadata
-void checkEqual_VkXYColorEXT(
-    const VkXYColorEXT* a,
-    const VkXYColorEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkXYColorEXT(const VkXYColorEXT* a, const VkXYColorEXT* b,
+                             OnFailCompareFunc onFail);
 
-void checkEqual_VkHdrMetadataEXT(
-    const VkHdrMetadataEXT* a,
-    const VkHdrMetadataEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkHdrMetadataEXT(const VkHdrMetadataEXT* a, const VkHdrMetadataEXT* b,
+                                 OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_MVK_ios_surface
-void checkEqual_VkIOSSurfaceCreateInfoMVK(
-    const VkIOSSurfaceCreateInfoMVK* a,
-    const VkIOSSurfaceCreateInfoMVK* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkIOSSurfaceCreateInfoMVK(const VkIOSSurfaceCreateInfoMVK* a,
+                                          const VkIOSSurfaceCreateInfoMVK* b,
+                                          OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_MVK_macos_surface
-void checkEqual_VkMacOSSurfaceCreateInfoMVK(
-    const VkMacOSSurfaceCreateInfoMVK* a,
-    const VkMacOSSurfaceCreateInfoMVK* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkMacOSSurfaceCreateInfoMVK(const VkMacOSSurfaceCreateInfoMVK* a,
+                                            const VkMacOSSurfaceCreateInfoMVK* b,
+                                            OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_MVK_moltenvk
@@ -2834,73 +2311,61 @@
 #ifdef VK_EXT_queue_family_foreign
 #endif
 #ifdef VK_EXT_debug_utils
-void checkEqual_VkDebugUtilsLabelEXT(
-    const VkDebugUtilsLabelEXT* a,
-    const VkDebugUtilsLabelEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDebugUtilsLabelEXT(const VkDebugUtilsLabelEXT* a, const VkDebugUtilsLabelEXT* b,
+                                     OnFailCompareFunc onFail);
 
-void checkEqual_VkDebugUtilsObjectNameInfoEXT(
-    const VkDebugUtilsObjectNameInfoEXT* a,
-    const VkDebugUtilsObjectNameInfoEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDebugUtilsObjectNameInfoEXT(const VkDebugUtilsObjectNameInfoEXT* a,
+                                              const VkDebugUtilsObjectNameInfoEXT* b,
+                                              OnFailCompareFunc onFail);
 
-void checkEqual_VkDebugUtilsMessengerCallbackDataEXT(
-    const VkDebugUtilsMessengerCallbackDataEXT* a,
-    const VkDebugUtilsMessengerCallbackDataEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDebugUtilsMessengerCallbackDataEXT(const VkDebugUtilsMessengerCallbackDataEXT* a,
+                                                     const VkDebugUtilsMessengerCallbackDataEXT* b,
+                                                     OnFailCompareFunc onFail);
 
-void checkEqual_VkDebugUtilsMessengerCreateInfoEXT(
-    const VkDebugUtilsMessengerCreateInfoEXT* a,
-    const VkDebugUtilsMessengerCreateInfoEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDebugUtilsMessengerCreateInfoEXT(const VkDebugUtilsMessengerCreateInfoEXT* a,
+                                                   const VkDebugUtilsMessengerCreateInfoEXT* b,
+                                                   OnFailCompareFunc onFail);
 
-void checkEqual_VkDebugUtilsObjectTagInfoEXT(
-    const VkDebugUtilsObjectTagInfoEXT* a,
-    const VkDebugUtilsObjectTagInfoEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDebugUtilsObjectTagInfoEXT(const VkDebugUtilsObjectTagInfoEXT* a,
+                                             const VkDebugUtilsObjectTagInfoEXT* b,
+                                             OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
-void checkEqual_VkAndroidHardwareBufferUsageANDROID(
-    const VkAndroidHardwareBufferUsageANDROID* a,
-    const VkAndroidHardwareBufferUsageANDROID* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkAndroidHardwareBufferUsageANDROID(const VkAndroidHardwareBufferUsageANDROID* a,
+                                                    const VkAndroidHardwareBufferUsageANDROID* b,
+                                                    OnFailCompareFunc onFail);
 
 void checkEqual_VkAndroidHardwareBufferPropertiesANDROID(
     const VkAndroidHardwareBufferPropertiesANDROID* a,
-    const VkAndroidHardwareBufferPropertiesANDROID* b,
-    OnFailCompareFunc onFail);
+    const VkAndroidHardwareBufferPropertiesANDROID* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkAndroidHardwareBufferFormatPropertiesANDROID(
     const VkAndroidHardwareBufferFormatPropertiesANDROID* a,
-    const VkAndroidHardwareBufferFormatPropertiesANDROID* b,
-    OnFailCompareFunc onFail);
+    const VkAndroidHardwareBufferFormatPropertiesANDROID* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkImportAndroidHardwareBufferInfoANDROID(
     const VkImportAndroidHardwareBufferInfoANDROID* a,
-    const VkImportAndroidHardwareBufferInfoANDROID* b,
-    OnFailCompareFunc onFail);
+    const VkImportAndroidHardwareBufferInfoANDROID* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkMemoryGetAndroidHardwareBufferInfoANDROID(
     const VkMemoryGetAndroidHardwareBufferInfoANDROID* a,
-    const VkMemoryGetAndroidHardwareBufferInfoANDROID* b,
-    OnFailCompareFunc onFail);
+    const VkMemoryGetAndroidHardwareBufferInfoANDROID* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkExternalFormatANDROID(
-    const VkExternalFormatANDROID* a,
-    const VkExternalFormatANDROID* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkExternalFormatANDROID(const VkExternalFormatANDROID* a,
+                                        const VkExternalFormatANDROID* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkAndroidHardwareBufferFormatProperties2ANDROID(
     const VkAndroidHardwareBufferFormatProperties2ANDROID* a,
-    const VkAndroidHardwareBufferFormatProperties2ANDROID* b,
-    OnFailCompareFunc onFail);
+    const VkAndroidHardwareBufferFormatProperties2ANDROID* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_sampler_filter_minmax
-DEFINE_ALIAS_FUNCTION(checkEqual_VkSamplerReductionModeCreateInfo, checkEqual_VkSamplerReductionModeCreateInfoEXT)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkSamplerReductionModeCreateInfo,
+                      checkEqual_VkSamplerReductionModeCreateInfoEXT)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceSamplerFilterMinmaxProperties, checkEqual_VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceSamplerFilterMinmaxProperties,
+                      checkEqual_VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT)
 
 #endif
 #ifdef VK_AMD_gpu_shader_int16
@@ -2912,98 +2377,80 @@
 #ifdef VK_EXT_inline_uniform_block
 void checkEqual_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(
     const VkPhysicalDeviceInlineUniformBlockFeaturesEXT* a,
-    const VkPhysicalDeviceInlineUniformBlockFeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceInlineUniformBlockFeaturesEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(
     const VkPhysicalDeviceInlineUniformBlockPropertiesEXT* a,
-    const VkPhysicalDeviceInlineUniformBlockPropertiesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceInlineUniformBlockPropertiesEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkWriteDescriptorSetInlineUniformBlockEXT(
     const VkWriteDescriptorSetInlineUniformBlockEXT* a,
-    const VkWriteDescriptorSetInlineUniformBlockEXT* b,
-    OnFailCompareFunc onFail);
+    const VkWriteDescriptorSetInlineUniformBlockEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(
     const VkDescriptorPoolInlineUniformBlockCreateInfoEXT* a,
-    const VkDescriptorPoolInlineUniformBlockCreateInfoEXT* b,
-    OnFailCompareFunc onFail);
+    const VkDescriptorPoolInlineUniformBlockCreateInfoEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_shader_stencil_export
 #endif
 #ifdef VK_EXT_sample_locations
-void checkEqual_VkSampleLocationEXT(
-    const VkSampleLocationEXT* a,
-    const VkSampleLocationEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSampleLocationEXT(const VkSampleLocationEXT* a, const VkSampleLocationEXT* b,
+                                    OnFailCompareFunc onFail);
 
-void checkEqual_VkSampleLocationsInfoEXT(
-    const VkSampleLocationsInfoEXT* a,
-    const VkSampleLocationsInfoEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSampleLocationsInfoEXT(const VkSampleLocationsInfoEXT* a,
+                                         const VkSampleLocationsInfoEXT* b,
+                                         OnFailCompareFunc onFail);
 
-void checkEqual_VkAttachmentSampleLocationsEXT(
-    const VkAttachmentSampleLocationsEXT* a,
-    const VkAttachmentSampleLocationsEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkAttachmentSampleLocationsEXT(const VkAttachmentSampleLocationsEXT* a,
+                                               const VkAttachmentSampleLocationsEXT* b,
+                                               OnFailCompareFunc onFail);
 
-void checkEqual_VkSubpassSampleLocationsEXT(
-    const VkSubpassSampleLocationsEXT* a,
-    const VkSubpassSampleLocationsEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSubpassSampleLocationsEXT(const VkSubpassSampleLocationsEXT* a,
+                                            const VkSubpassSampleLocationsEXT* b,
+                                            OnFailCompareFunc onFail);
 
 void checkEqual_VkRenderPassSampleLocationsBeginInfoEXT(
     const VkRenderPassSampleLocationsBeginInfoEXT* a,
-    const VkRenderPassSampleLocationsBeginInfoEXT* b,
-    OnFailCompareFunc onFail);
+    const VkRenderPassSampleLocationsBeginInfoEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPipelineSampleLocationsStateCreateInfoEXT(
     const VkPipelineSampleLocationsStateCreateInfoEXT* a,
-    const VkPipelineSampleLocationsStateCreateInfoEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPipelineSampleLocationsStateCreateInfoEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceSampleLocationsPropertiesEXT(
     const VkPhysicalDeviceSampleLocationsPropertiesEXT* a,
-    const VkPhysicalDeviceSampleLocationsPropertiesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceSampleLocationsPropertiesEXT* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkMultisamplePropertiesEXT(
-    const VkMultisamplePropertiesEXT* a,
-    const VkMultisamplePropertiesEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkMultisamplePropertiesEXT(const VkMultisamplePropertiesEXT* a,
+                                           const VkMultisamplePropertiesEXT* b,
+                                           OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_blend_operation_advanced
 void checkEqual_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
     const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* a,
-    const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
     const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* a,
-    const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
     const VkPipelineColorBlendAdvancedStateCreateInfoEXT* a,
-    const VkPipelineColorBlendAdvancedStateCreateInfoEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPipelineColorBlendAdvancedStateCreateInfoEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_NV_fragment_coverage_to_color
 void checkEqual_VkPipelineCoverageToColorStateCreateInfoNV(
     const VkPipelineCoverageToColorStateCreateInfoNV* a,
-    const VkPipelineCoverageToColorStateCreateInfoNV* b,
-    OnFailCompareFunc onFail);
+    const VkPipelineCoverageToColorStateCreateInfoNV* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_NV_framebuffer_mixed_samples
 void checkEqual_VkPipelineCoverageModulationStateCreateInfoNV(
     const VkPipelineCoverageModulationStateCreateInfoNV* a,
-    const VkPipelineCoverageModulationStateCreateInfoNV* b,
-    OnFailCompareFunc onFail);
+    const VkPipelineCoverageModulationStateCreateInfoNV* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_NV_fill_rectangle
@@ -3011,227 +2458,188 @@
 #ifdef VK_NV_shader_sm_builtins
 void checkEqual_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(
     const VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* a,
-    const VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(
     const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* a,
-    const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_post_depth_coverage
 #endif
 #ifdef VK_EXT_image_drm_format_modifier
-void checkEqual_VkDrmFormatModifierPropertiesEXT(
-    const VkDrmFormatModifierPropertiesEXT* a,
-    const VkDrmFormatModifierPropertiesEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDrmFormatModifierPropertiesEXT(const VkDrmFormatModifierPropertiesEXT* a,
+                                                 const VkDrmFormatModifierPropertiesEXT* b,
+                                                 OnFailCompareFunc onFail);
 
-void checkEqual_VkDrmFormatModifierPropertiesListEXT(
-    const VkDrmFormatModifierPropertiesListEXT* a,
-    const VkDrmFormatModifierPropertiesListEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDrmFormatModifierPropertiesListEXT(const VkDrmFormatModifierPropertiesListEXT* a,
+                                                     const VkDrmFormatModifierPropertiesListEXT* b,
+                                                     OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(
     const VkPhysicalDeviceImageDrmFormatModifierInfoEXT* a,
-    const VkPhysicalDeviceImageDrmFormatModifierInfoEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceImageDrmFormatModifierInfoEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkImageDrmFormatModifierListCreateInfoEXT(
     const VkImageDrmFormatModifierListCreateInfoEXT* a,
-    const VkImageDrmFormatModifierListCreateInfoEXT* b,
-    OnFailCompareFunc onFail);
+    const VkImageDrmFormatModifierListCreateInfoEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkImageDrmFormatModifierExplicitCreateInfoEXT(
     const VkImageDrmFormatModifierExplicitCreateInfoEXT* a,
-    const VkImageDrmFormatModifierExplicitCreateInfoEXT* b,
-    OnFailCompareFunc onFail);
+    const VkImageDrmFormatModifierExplicitCreateInfoEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkImageDrmFormatModifierPropertiesEXT(
-    const VkImageDrmFormatModifierPropertiesEXT* a,
-    const VkImageDrmFormatModifierPropertiesEXT* b,
+    const VkImageDrmFormatModifierPropertiesEXT* a, const VkImageDrmFormatModifierPropertiesEXT* b,
     OnFailCompareFunc onFail);
 
-void checkEqual_VkDrmFormatModifierProperties2EXT(
-    const VkDrmFormatModifierProperties2EXT* a,
-    const VkDrmFormatModifierProperties2EXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDrmFormatModifierProperties2EXT(const VkDrmFormatModifierProperties2EXT* a,
+                                                  const VkDrmFormatModifierProperties2EXT* b,
+                                                  OnFailCompareFunc onFail);
 
 void checkEqual_VkDrmFormatModifierPropertiesList2EXT(
-    const VkDrmFormatModifierPropertiesList2EXT* a,
-    const VkDrmFormatModifierPropertiesList2EXT* b,
+    const VkDrmFormatModifierPropertiesList2EXT* a, const VkDrmFormatModifierPropertiesList2EXT* b,
     OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_validation_cache
-void checkEqual_VkValidationCacheCreateInfoEXT(
-    const VkValidationCacheCreateInfoEXT* a,
-    const VkValidationCacheCreateInfoEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkValidationCacheCreateInfoEXT(const VkValidationCacheCreateInfoEXT* a,
+                                               const VkValidationCacheCreateInfoEXT* b,
+                                               OnFailCompareFunc onFail);
 
 void checkEqual_VkShaderModuleValidationCacheCreateInfoEXT(
     const VkShaderModuleValidationCacheCreateInfoEXT* a,
-    const VkShaderModuleValidationCacheCreateInfoEXT* b,
-    OnFailCompareFunc onFail);
+    const VkShaderModuleValidationCacheCreateInfoEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_descriptor_indexing
-DEFINE_ALIAS_FUNCTION(checkEqual_VkDescriptorSetLayoutBindingFlagsCreateInfo, checkEqual_VkDescriptorSetLayoutBindingFlagsCreateInfoEXT)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkDescriptorSetLayoutBindingFlagsCreateInfo,
+                      checkEqual_VkDescriptorSetLayoutBindingFlagsCreateInfoEXT)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceDescriptorIndexingFeatures, checkEqual_VkPhysicalDeviceDescriptorIndexingFeaturesEXT)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceDescriptorIndexingFeatures,
+                      checkEqual_VkPhysicalDeviceDescriptorIndexingFeaturesEXT)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceDescriptorIndexingProperties, checkEqual_VkPhysicalDeviceDescriptorIndexingPropertiesEXT)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceDescriptorIndexingProperties,
+                      checkEqual_VkPhysicalDeviceDescriptorIndexingPropertiesEXT)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkDescriptorSetVariableDescriptorCountAllocateInfo, checkEqual_VkDescriptorSetVariableDescriptorCountAllocateInfoEXT)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkDescriptorSetVariableDescriptorCountAllocateInfo,
+                      checkEqual_VkDescriptorSetVariableDescriptorCountAllocateInfoEXT)
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkDescriptorSetVariableDescriptorCountLayoutSupport, checkEqual_VkDescriptorSetVariableDescriptorCountLayoutSupportEXT)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkDescriptorSetVariableDescriptorCountLayoutSupport,
+                      checkEqual_VkDescriptorSetVariableDescriptorCountLayoutSupportEXT)
 
 #endif
 #ifdef VK_EXT_shader_viewport_index_layer
 #endif
 #ifdef VK_NV_shading_rate_image
-void checkEqual_VkShadingRatePaletteNV(
-    const VkShadingRatePaletteNV* a,
-    const VkShadingRatePaletteNV* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkShadingRatePaletteNV(const VkShadingRatePaletteNV* a,
+                                       const VkShadingRatePaletteNV* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPipelineViewportShadingRateImageStateCreateInfoNV(
     const VkPipelineViewportShadingRateImageStateCreateInfoNV* a,
-    const VkPipelineViewportShadingRateImageStateCreateInfoNV* b,
-    OnFailCompareFunc onFail);
+    const VkPipelineViewportShadingRateImageStateCreateInfoNV* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceShadingRateImageFeaturesNV(
     const VkPhysicalDeviceShadingRateImageFeaturesNV* a,
-    const VkPhysicalDeviceShadingRateImageFeaturesNV* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceShadingRateImageFeaturesNV* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceShadingRateImagePropertiesNV(
     const VkPhysicalDeviceShadingRateImagePropertiesNV* a,
-    const VkPhysicalDeviceShadingRateImagePropertiesNV* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceShadingRateImagePropertiesNV* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkCoarseSampleLocationNV(
-    const VkCoarseSampleLocationNV* a,
-    const VkCoarseSampleLocationNV* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkCoarseSampleLocationNV(const VkCoarseSampleLocationNV* a,
+                                         const VkCoarseSampleLocationNV* b,
+                                         OnFailCompareFunc onFail);
 
-void checkEqual_VkCoarseSampleOrderCustomNV(
-    const VkCoarseSampleOrderCustomNV* a,
-    const VkCoarseSampleOrderCustomNV* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkCoarseSampleOrderCustomNV(const VkCoarseSampleOrderCustomNV* a,
+                                            const VkCoarseSampleOrderCustomNV* b,
+                                            OnFailCompareFunc onFail);
 
 void checkEqual_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(
     const VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* a,
-    const VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* b,
-    OnFailCompareFunc onFail);
+    const VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_NV_ray_tracing
-void checkEqual_VkRayTracingShaderGroupCreateInfoNV(
-    const VkRayTracingShaderGroupCreateInfoNV* a,
-    const VkRayTracingShaderGroupCreateInfoNV* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkRayTracingShaderGroupCreateInfoNV(const VkRayTracingShaderGroupCreateInfoNV* a,
+                                                    const VkRayTracingShaderGroupCreateInfoNV* b,
+                                                    OnFailCompareFunc onFail);
 
-void checkEqual_VkRayTracingPipelineCreateInfoNV(
-    const VkRayTracingPipelineCreateInfoNV* a,
-    const VkRayTracingPipelineCreateInfoNV* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkRayTracingPipelineCreateInfoNV(const VkRayTracingPipelineCreateInfoNV* a,
+                                                 const VkRayTracingPipelineCreateInfoNV* b,
+                                                 OnFailCompareFunc onFail);
 
-void checkEqual_VkGeometryTrianglesNV(
-    const VkGeometryTrianglesNV* a,
-    const VkGeometryTrianglesNV* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkGeometryTrianglesNV(const VkGeometryTrianglesNV* a,
+                                      const VkGeometryTrianglesNV* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkGeometryAABBNV(
-    const VkGeometryAABBNV* a,
-    const VkGeometryAABBNV* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkGeometryAABBNV(const VkGeometryAABBNV* a, const VkGeometryAABBNV* b,
+                                 OnFailCompareFunc onFail);
 
-void checkEqual_VkGeometryDataNV(
-    const VkGeometryDataNV* a,
-    const VkGeometryDataNV* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkGeometryDataNV(const VkGeometryDataNV* a, const VkGeometryDataNV* b,
+                                 OnFailCompareFunc onFail);
 
-void checkEqual_VkGeometryNV(
-    const VkGeometryNV* a,
-    const VkGeometryNV* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkGeometryNV(const VkGeometryNV* a, const VkGeometryNV* b,
+                             OnFailCompareFunc onFail);
 
-void checkEqual_VkAccelerationStructureInfoNV(
-    const VkAccelerationStructureInfoNV* a,
-    const VkAccelerationStructureInfoNV* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkAccelerationStructureInfoNV(const VkAccelerationStructureInfoNV* a,
+                                              const VkAccelerationStructureInfoNV* b,
+                                              OnFailCompareFunc onFail);
 
-void checkEqual_VkAccelerationStructureCreateInfoNV(
-    const VkAccelerationStructureCreateInfoNV* a,
-    const VkAccelerationStructureCreateInfoNV* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkAccelerationStructureCreateInfoNV(const VkAccelerationStructureCreateInfoNV* a,
+                                                    const VkAccelerationStructureCreateInfoNV* b,
+                                                    OnFailCompareFunc onFail);
 
 void checkEqual_VkBindAccelerationStructureMemoryInfoNV(
     const VkBindAccelerationStructureMemoryInfoNV* a,
-    const VkBindAccelerationStructureMemoryInfoNV* b,
-    OnFailCompareFunc onFail);
+    const VkBindAccelerationStructureMemoryInfoNV* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkWriteDescriptorSetAccelerationStructureNV(
     const VkWriteDescriptorSetAccelerationStructureNV* a,
-    const VkWriteDescriptorSetAccelerationStructureNV* b,
-    OnFailCompareFunc onFail);
+    const VkWriteDescriptorSetAccelerationStructureNV* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkAccelerationStructureMemoryRequirementsInfoNV(
     const VkAccelerationStructureMemoryRequirementsInfoNV* a,
-    const VkAccelerationStructureMemoryRequirementsInfoNV* b,
-    OnFailCompareFunc onFail);
+    const VkAccelerationStructureMemoryRequirementsInfoNV* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceRayTracingPropertiesNV(
     const VkPhysicalDeviceRayTracingPropertiesNV* a,
-    const VkPhysicalDeviceRayTracingPropertiesNV* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceRayTracingPropertiesNV* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkTransformMatrixKHR(
-    const VkTransformMatrixKHR* a,
-    const VkTransformMatrixKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkTransformMatrixKHR(const VkTransformMatrixKHR* a, const VkTransformMatrixKHR* b,
+                                     OnFailCompareFunc onFail);
 
 DEFINE_ALIAS_FUNCTION(checkEqual_VkTransformMatrixKHR, checkEqual_VkTransformMatrixNV)
 
-void checkEqual_VkAabbPositionsKHR(
-    const VkAabbPositionsKHR* a,
-    const VkAabbPositionsKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkAabbPositionsKHR(const VkAabbPositionsKHR* a, const VkAabbPositionsKHR* b,
+                                   OnFailCompareFunc onFail);
 
 DEFINE_ALIAS_FUNCTION(checkEqual_VkAabbPositionsKHR, checkEqual_VkAabbPositionsNV)
 
-void checkEqual_VkAccelerationStructureInstanceKHR(
-    const VkAccelerationStructureInstanceKHR* a,
-    const VkAccelerationStructureInstanceKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkAccelerationStructureInstanceKHR(const VkAccelerationStructureInstanceKHR* a,
+                                                   const VkAccelerationStructureInstanceKHR* b,
+                                                   OnFailCompareFunc onFail);
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkAccelerationStructureInstanceKHR, checkEqual_VkAccelerationStructureInstanceNV)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkAccelerationStructureInstanceKHR,
+                      checkEqual_VkAccelerationStructureInstanceNV)
 
 #endif
 #ifdef VK_NV_representative_fragment_test
 void checkEqual_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(
     const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* a,
-    const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(
     const VkPipelineRepresentativeFragmentTestStateCreateInfoNV* a,
-    const VkPipelineRepresentativeFragmentTestStateCreateInfoNV* b,
-    OnFailCompareFunc onFail);
+    const VkPipelineRepresentativeFragmentTestStateCreateInfoNV* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_filter_cubic
 void checkEqual_VkPhysicalDeviceImageViewImageFormatInfoEXT(
     const VkPhysicalDeviceImageViewImageFormatInfoEXT* a,
-    const VkPhysicalDeviceImageViewImageFormatInfoEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceImageViewImageFormatInfoEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkFilterCubicImageViewImageFormatPropertiesEXT(
     const VkFilterCubicImageViewImageFormatPropertiesEXT* a,
-    const VkFilterCubicImageViewImageFormatPropertiesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkFilterCubicImageViewImageFormatPropertiesEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_QCOM_render_pass_shader_resolve
@@ -3239,25 +2647,21 @@
 #ifdef VK_EXT_global_priority
 void checkEqual_VkDeviceQueueGlobalPriorityCreateInfoEXT(
     const VkDeviceQueueGlobalPriorityCreateInfoEXT* a,
-    const VkDeviceQueueGlobalPriorityCreateInfoEXT* b,
-    OnFailCompareFunc onFail);
+    const VkDeviceQueueGlobalPriorityCreateInfoEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_external_memory_host
-void checkEqual_VkImportMemoryHostPointerInfoEXT(
-    const VkImportMemoryHostPointerInfoEXT* a,
-    const VkImportMemoryHostPointerInfoEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImportMemoryHostPointerInfoEXT(const VkImportMemoryHostPointerInfoEXT* a,
+                                                 const VkImportMemoryHostPointerInfoEXT* b,
+                                                 OnFailCompareFunc onFail);
 
-void checkEqual_VkMemoryHostPointerPropertiesEXT(
-    const VkMemoryHostPointerPropertiesEXT* a,
-    const VkMemoryHostPointerPropertiesEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkMemoryHostPointerPropertiesEXT(const VkMemoryHostPointerPropertiesEXT* a,
+                                                 const VkMemoryHostPointerPropertiesEXT* b,
+                                                 OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
     const VkPhysicalDeviceExternalMemoryHostPropertiesEXT* a,
-    const VkPhysicalDeviceExternalMemoryHostPropertiesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceExternalMemoryHostPropertiesEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_AMD_buffer_marker
@@ -3265,107 +2669,88 @@
 #ifdef VK_AMD_pipeline_compiler_control
 void checkEqual_VkPipelineCompilerControlCreateInfoAMD(
     const VkPipelineCompilerControlCreateInfoAMD* a,
-    const VkPipelineCompilerControlCreateInfoAMD* b,
-    OnFailCompareFunc onFail);
+    const VkPipelineCompilerControlCreateInfoAMD* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_calibrated_timestamps
-void checkEqual_VkCalibratedTimestampInfoEXT(
-    const VkCalibratedTimestampInfoEXT* a,
-    const VkCalibratedTimestampInfoEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkCalibratedTimestampInfoEXT(const VkCalibratedTimestampInfoEXT* a,
+                                             const VkCalibratedTimestampInfoEXT* b,
+                                             OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_AMD_shader_core_properties
 void checkEqual_VkPhysicalDeviceShaderCorePropertiesAMD(
     const VkPhysicalDeviceShaderCorePropertiesAMD* a,
-    const VkPhysicalDeviceShaderCorePropertiesAMD* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceShaderCorePropertiesAMD* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_video_decode_h265
-void checkEqual_VkVideoDecodeH265ProfileEXT(
-    const VkVideoDecodeH265ProfileEXT* a,
-    const VkVideoDecodeH265ProfileEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVideoDecodeH265ProfileEXT(const VkVideoDecodeH265ProfileEXT* a,
+                                            const VkVideoDecodeH265ProfileEXT* b,
+                                            OnFailCompareFunc onFail);
 
-void checkEqual_VkVideoDecodeH265CapabilitiesEXT(
-    const VkVideoDecodeH265CapabilitiesEXT* a,
-    const VkVideoDecodeH265CapabilitiesEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVideoDecodeH265CapabilitiesEXT(const VkVideoDecodeH265CapabilitiesEXT* a,
+                                                 const VkVideoDecodeH265CapabilitiesEXT* b,
+                                                 OnFailCompareFunc onFail);
 
 void checkEqual_VkVideoDecodeH265SessionCreateInfoEXT(
-    const VkVideoDecodeH265SessionCreateInfoEXT* a,
-    const VkVideoDecodeH265SessionCreateInfoEXT* b,
+    const VkVideoDecodeH265SessionCreateInfoEXT* a, const VkVideoDecodeH265SessionCreateInfoEXT* b,
     OnFailCompareFunc onFail);
 
 void checkEqual_VkVideoDecodeH265SessionParametersAddInfoEXT(
     const VkVideoDecodeH265SessionParametersAddInfoEXT* a,
-    const VkVideoDecodeH265SessionParametersAddInfoEXT* b,
-    OnFailCompareFunc onFail);
+    const VkVideoDecodeH265SessionParametersAddInfoEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkVideoDecodeH265SessionParametersCreateInfoEXT(
     const VkVideoDecodeH265SessionParametersCreateInfoEXT* a,
-    const VkVideoDecodeH265SessionParametersCreateInfoEXT* b,
-    OnFailCompareFunc onFail);
+    const VkVideoDecodeH265SessionParametersCreateInfoEXT* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkVideoDecodeH265PictureInfoEXT(
-    const VkVideoDecodeH265PictureInfoEXT* a,
-    const VkVideoDecodeH265PictureInfoEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVideoDecodeH265PictureInfoEXT(const VkVideoDecodeH265PictureInfoEXT* a,
+                                                const VkVideoDecodeH265PictureInfoEXT* b,
+                                                OnFailCompareFunc onFail);
 
-void checkEqual_VkVideoDecodeH265DpbSlotInfoEXT(
-    const VkVideoDecodeH265DpbSlotInfoEXT* a,
-    const VkVideoDecodeH265DpbSlotInfoEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVideoDecodeH265DpbSlotInfoEXT(const VkVideoDecodeH265DpbSlotInfoEXT* a,
+                                                const VkVideoDecodeH265DpbSlotInfoEXT* b,
+                                                OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_AMD_memory_overallocation_behavior
 void checkEqual_VkDeviceMemoryOverallocationCreateInfoAMD(
     const VkDeviceMemoryOverallocationCreateInfoAMD* a,
-    const VkDeviceMemoryOverallocationCreateInfoAMD* b,
-    OnFailCompareFunc onFail);
+    const VkDeviceMemoryOverallocationCreateInfoAMD* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_vertex_attribute_divisor
 void checkEqual_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
     const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* a,
-    const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkVertexInputBindingDivisorDescriptionEXT(
     const VkVertexInputBindingDivisorDescriptionEXT* a,
-    const VkVertexInputBindingDivisorDescriptionEXT* b,
-    OnFailCompareFunc onFail);
+    const VkVertexInputBindingDivisorDescriptionEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPipelineVertexInputDivisorStateCreateInfoEXT(
     const VkPipelineVertexInputDivisorStateCreateInfoEXT* a,
-    const VkPipelineVertexInputDivisorStateCreateInfoEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPipelineVertexInputDivisorStateCreateInfoEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(
     const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* a,
-    const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_GGP_frame_token
-void checkEqual_VkPresentFrameTokenGGP(
-    const VkPresentFrameTokenGGP* a,
-    const VkPresentFrameTokenGGP* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPresentFrameTokenGGP(const VkPresentFrameTokenGGP* a,
+                                       const VkPresentFrameTokenGGP* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_pipeline_creation_feedback
-void checkEqual_VkPipelineCreationFeedbackEXT(
-    const VkPipelineCreationFeedbackEXT* a,
-    const VkPipelineCreationFeedbackEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPipelineCreationFeedbackEXT(const VkPipelineCreationFeedbackEXT* a,
+                                              const VkPipelineCreationFeedbackEXT* b,
+                                              OnFailCompareFunc onFail);
 
 void checkEqual_VkPipelineCreationFeedbackCreateInfoEXT(
     const VkPipelineCreationFeedbackCreateInfoEXT* a,
-    const VkPipelineCreationFeedbackCreateInfoEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPipelineCreationFeedbackCreateInfoEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_NV_shader_subgroup_partitioned
@@ -3373,168 +2758,141 @@
 #ifdef VK_NV_compute_shader_derivatives
 void checkEqual_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(
     const VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* a,
-    const VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_NV_mesh_shader
-void checkEqual_VkPhysicalDeviceMeshShaderFeaturesNV(
-    const VkPhysicalDeviceMeshShaderFeaturesNV* a,
-    const VkPhysicalDeviceMeshShaderFeaturesNV* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPhysicalDeviceMeshShaderFeaturesNV(const VkPhysicalDeviceMeshShaderFeaturesNV* a,
+                                                     const VkPhysicalDeviceMeshShaderFeaturesNV* b,
+                                                     OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceMeshShaderPropertiesNV(
     const VkPhysicalDeviceMeshShaderPropertiesNV* a,
-    const VkPhysicalDeviceMeshShaderPropertiesNV* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceMeshShaderPropertiesNV* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkDrawMeshTasksIndirectCommandNV(
-    const VkDrawMeshTasksIndirectCommandNV* a,
-    const VkDrawMeshTasksIndirectCommandNV* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDrawMeshTasksIndirectCommandNV(const VkDrawMeshTasksIndirectCommandNV* a,
+                                                 const VkDrawMeshTasksIndirectCommandNV* b,
+                                                 OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_NV_fragment_shader_barycentric
 void checkEqual_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(
     const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* a,
-    const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_NV_shader_image_footprint
 void checkEqual_VkPhysicalDeviceShaderImageFootprintFeaturesNV(
     const VkPhysicalDeviceShaderImageFootprintFeaturesNV* a,
-    const VkPhysicalDeviceShaderImageFootprintFeaturesNV* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceShaderImageFootprintFeaturesNV* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_NV_scissor_exclusive
 void checkEqual_VkPipelineViewportExclusiveScissorStateCreateInfoNV(
     const VkPipelineViewportExclusiveScissorStateCreateInfoNV* a,
-    const VkPipelineViewportExclusiveScissorStateCreateInfoNV* b,
-    OnFailCompareFunc onFail);
+    const VkPipelineViewportExclusiveScissorStateCreateInfoNV* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceExclusiveScissorFeaturesNV(
     const VkPhysicalDeviceExclusiveScissorFeaturesNV* a,
-    const VkPhysicalDeviceExclusiveScissorFeaturesNV* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceExclusiveScissorFeaturesNV* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
-void checkEqual_VkQueueFamilyCheckpointPropertiesNV(
-    const VkQueueFamilyCheckpointPropertiesNV* a,
-    const VkQueueFamilyCheckpointPropertiesNV* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkQueueFamilyCheckpointPropertiesNV(const VkQueueFamilyCheckpointPropertiesNV* a,
+                                                    const VkQueueFamilyCheckpointPropertiesNV* b,
+                                                    OnFailCompareFunc onFail);
 
-void checkEqual_VkCheckpointDataNV(
-    const VkCheckpointDataNV* a,
-    const VkCheckpointDataNV* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkCheckpointDataNV(const VkCheckpointDataNV* a, const VkCheckpointDataNV* b,
+                                   OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_INTEL_shader_integer_functions2
 void checkEqual_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(
     const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* a,
-    const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_INTEL_performance_query
-void checkEqual_VkPerformanceValueDataINTEL(
-    const VkPerformanceValueDataINTEL* a,
-    const VkPerformanceValueDataINTEL* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPerformanceValueDataINTEL(const VkPerformanceValueDataINTEL* a,
+                                            const VkPerformanceValueDataINTEL* b,
+                                            OnFailCompareFunc onFail);
 
-void checkEqual_VkPerformanceValueINTEL(
-    const VkPerformanceValueINTEL* a,
-    const VkPerformanceValueINTEL* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPerformanceValueINTEL(const VkPerformanceValueINTEL* a,
+                                        const VkPerformanceValueINTEL* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkInitializePerformanceApiInfoINTEL(
-    const VkInitializePerformanceApiInfoINTEL* a,
-    const VkInitializePerformanceApiInfoINTEL* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkInitializePerformanceApiInfoINTEL(const VkInitializePerformanceApiInfoINTEL* a,
+                                                    const VkInitializePerformanceApiInfoINTEL* b,
+                                                    OnFailCompareFunc onFail);
 
 void checkEqual_VkQueryPoolPerformanceQueryCreateInfoINTEL(
     const VkQueryPoolPerformanceQueryCreateInfoINTEL* a,
-    const VkQueryPoolPerformanceQueryCreateInfoINTEL* b,
-    OnFailCompareFunc onFail);
+    const VkQueryPoolPerformanceQueryCreateInfoINTEL* b, OnFailCompareFunc onFail);
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkQueryPoolPerformanceQueryCreateInfoINTEL, checkEqual_VkQueryPoolCreateInfoINTEL)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkQueryPoolPerformanceQueryCreateInfoINTEL,
+                      checkEqual_VkQueryPoolCreateInfoINTEL)
 
-void checkEqual_VkPerformanceMarkerInfoINTEL(
-    const VkPerformanceMarkerInfoINTEL* a,
-    const VkPerformanceMarkerInfoINTEL* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPerformanceMarkerInfoINTEL(const VkPerformanceMarkerInfoINTEL* a,
+                                             const VkPerformanceMarkerInfoINTEL* b,
+                                             OnFailCompareFunc onFail);
 
-void checkEqual_VkPerformanceStreamMarkerInfoINTEL(
-    const VkPerformanceStreamMarkerInfoINTEL* a,
-    const VkPerformanceStreamMarkerInfoINTEL* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPerformanceStreamMarkerInfoINTEL(const VkPerformanceStreamMarkerInfoINTEL* a,
+                                                   const VkPerformanceStreamMarkerInfoINTEL* b,
+                                                   OnFailCompareFunc onFail);
 
-void checkEqual_VkPerformanceOverrideInfoINTEL(
-    const VkPerformanceOverrideInfoINTEL* a,
-    const VkPerformanceOverrideInfoINTEL* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPerformanceOverrideInfoINTEL(const VkPerformanceOverrideInfoINTEL* a,
+                                               const VkPerformanceOverrideInfoINTEL* b,
+                                               OnFailCompareFunc onFail);
 
 void checkEqual_VkPerformanceConfigurationAcquireInfoINTEL(
     const VkPerformanceConfigurationAcquireInfoINTEL* a,
-    const VkPerformanceConfigurationAcquireInfoINTEL* b,
-    OnFailCompareFunc onFail);
+    const VkPerformanceConfigurationAcquireInfoINTEL* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_pci_bus_info
 void checkEqual_VkPhysicalDevicePCIBusInfoPropertiesEXT(
     const VkPhysicalDevicePCIBusInfoPropertiesEXT* a,
-    const VkPhysicalDevicePCIBusInfoPropertiesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDevicePCIBusInfoPropertiesEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_AMD_display_native_hdr
 void checkEqual_VkDisplayNativeHdrSurfaceCapabilitiesAMD(
     const VkDisplayNativeHdrSurfaceCapabilitiesAMD* a,
-    const VkDisplayNativeHdrSurfaceCapabilitiesAMD* b,
-    OnFailCompareFunc onFail);
+    const VkDisplayNativeHdrSurfaceCapabilitiesAMD* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkSwapchainDisplayNativeHdrCreateInfoAMD(
     const VkSwapchainDisplayNativeHdrCreateInfoAMD* a,
-    const VkSwapchainDisplayNativeHdrCreateInfoAMD* b,
-    OnFailCompareFunc onFail);
+    const VkSwapchainDisplayNativeHdrCreateInfoAMD* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_FUCHSIA_imagepipe_surface
-void checkEqual_VkImagePipeSurfaceCreateInfoFUCHSIA(
-    const VkImagePipeSurfaceCreateInfoFUCHSIA* a,
-    const VkImagePipeSurfaceCreateInfoFUCHSIA* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImagePipeSurfaceCreateInfoFUCHSIA(const VkImagePipeSurfaceCreateInfoFUCHSIA* a,
+                                                    const VkImagePipeSurfaceCreateInfoFUCHSIA* b,
+                                                    OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_metal_surface
-void checkEqual_VkMetalSurfaceCreateInfoEXT(
-    const VkMetalSurfaceCreateInfoEXT* a,
-    const VkMetalSurfaceCreateInfoEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkMetalSurfaceCreateInfoEXT(const VkMetalSurfaceCreateInfoEXT* a,
+                                            const VkMetalSurfaceCreateInfoEXT* b,
+                                            OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_fragment_density_map
 void checkEqual_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
     const VkPhysicalDeviceFragmentDensityMapFeaturesEXT* a,
-    const VkPhysicalDeviceFragmentDensityMapFeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceFragmentDensityMapFeaturesEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
     const VkPhysicalDeviceFragmentDensityMapPropertiesEXT* a,
-    const VkPhysicalDeviceFragmentDensityMapPropertiesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceFragmentDensityMapPropertiesEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkRenderPassFragmentDensityMapCreateInfoEXT(
     const VkRenderPassFragmentDensityMapCreateInfoEXT* a,
-    const VkRenderPassFragmentDensityMapCreateInfoEXT* b,
-    OnFailCompareFunc onFail);
+    const VkRenderPassFragmentDensityMapCreateInfoEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_scalar_block_layout
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceScalarBlockLayoutFeatures, checkEqual_VkPhysicalDeviceScalarBlockLayoutFeaturesEXT)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceScalarBlockLayoutFeatures,
+                      checkEqual_VkPhysicalDeviceScalarBlockLayoutFeaturesEXT)
 
 #endif
 #ifdef VK_GOOGLE_hlsl_functionality1
@@ -3544,364 +2902,307 @@
 #ifdef VK_EXT_subgroup_size_control
 void checkEqual_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(
     const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* a,
-    const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(
     const VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* a,
-    const VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(
     const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* a,
-    const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_AMD_shader_core_properties2
 void checkEqual_VkPhysicalDeviceShaderCoreProperties2AMD(
     const VkPhysicalDeviceShaderCoreProperties2AMD* a,
-    const VkPhysicalDeviceShaderCoreProperties2AMD* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceShaderCoreProperties2AMD* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_AMD_device_coherent_memory
 void checkEqual_VkPhysicalDeviceCoherentMemoryFeaturesAMD(
     const VkPhysicalDeviceCoherentMemoryFeaturesAMD* a,
-    const VkPhysicalDeviceCoherentMemoryFeaturesAMD* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceCoherentMemoryFeaturesAMD* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_shader_image_atomic_int64
 void checkEqual_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(
     const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* a,
-    const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_memory_budget
 void checkEqual_VkPhysicalDeviceMemoryBudgetPropertiesEXT(
     const VkPhysicalDeviceMemoryBudgetPropertiesEXT* a,
-    const VkPhysicalDeviceMemoryBudgetPropertiesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceMemoryBudgetPropertiesEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_memory_priority
 void checkEqual_VkPhysicalDeviceMemoryPriorityFeaturesEXT(
     const VkPhysicalDeviceMemoryPriorityFeaturesEXT* a,
-    const VkPhysicalDeviceMemoryPriorityFeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceMemoryPriorityFeaturesEXT* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkMemoryPriorityAllocateInfoEXT(
-    const VkMemoryPriorityAllocateInfoEXT* a,
-    const VkMemoryPriorityAllocateInfoEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkMemoryPriorityAllocateInfoEXT(const VkMemoryPriorityAllocateInfoEXT* a,
+                                                const VkMemoryPriorityAllocateInfoEXT* b,
+                                                OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_NV_dedicated_allocation_image_aliasing
 void checkEqual_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(
     const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* a,
-    const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_buffer_device_address
 void checkEqual_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(
     const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* a,
-    const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* b, OnFailCompareFunc onFail);
 
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT, checkEqual_VkPhysicalDeviceBufferAddressFeaturesEXT)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT,
+                      checkEqual_VkPhysicalDeviceBufferAddressFeaturesEXT)
 
 DEFINE_ALIAS_FUNCTION(checkEqual_VkBufferDeviceAddressInfo, checkEqual_VkBufferDeviceAddressInfoEXT)
 
-void checkEqual_VkBufferDeviceAddressCreateInfoEXT(
-    const VkBufferDeviceAddressCreateInfoEXT* a,
-    const VkBufferDeviceAddressCreateInfoEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkBufferDeviceAddressCreateInfoEXT(const VkBufferDeviceAddressCreateInfoEXT* a,
+                                                   const VkBufferDeviceAddressCreateInfoEXT* b,
+                                                   OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_tooling_info
-void checkEqual_VkPhysicalDeviceToolPropertiesEXT(
-    const VkPhysicalDeviceToolPropertiesEXT* a,
-    const VkPhysicalDeviceToolPropertiesEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPhysicalDeviceToolPropertiesEXT(const VkPhysicalDeviceToolPropertiesEXT* a,
+                                                  const VkPhysicalDeviceToolPropertiesEXT* b,
+                                                  OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_separate_stencil_usage
-DEFINE_ALIAS_FUNCTION(checkEqual_VkImageStencilUsageCreateInfo, checkEqual_VkImageStencilUsageCreateInfoEXT)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkImageStencilUsageCreateInfo,
+                      checkEqual_VkImageStencilUsageCreateInfoEXT)
 
 #endif
 #ifdef VK_EXT_validation_features
-void checkEqual_VkValidationFeaturesEXT(
-    const VkValidationFeaturesEXT* a,
-    const VkValidationFeaturesEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkValidationFeaturesEXT(const VkValidationFeaturesEXT* a,
+                                        const VkValidationFeaturesEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_NV_cooperative_matrix
-void checkEqual_VkCooperativeMatrixPropertiesNV(
-    const VkCooperativeMatrixPropertiesNV* a,
-    const VkCooperativeMatrixPropertiesNV* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkCooperativeMatrixPropertiesNV(const VkCooperativeMatrixPropertiesNV* a,
+                                                const VkCooperativeMatrixPropertiesNV* b,
+                                                OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceCooperativeMatrixFeaturesNV(
     const VkPhysicalDeviceCooperativeMatrixFeaturesNV* a,
-    const VkPhysicalDeviceCooperativeMatrixFeaturesNV* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceCooperativeMatrixFeaturesNV* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceCooperativeMatrixPropertiesNV(
     const VkPhysicalDeviceCooperativeMatrixPropertiesNV* a,
-    const VkPhysicalDeviceCooperativeMatrixPropertiesNV* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceCooperativeMatrixPropertiesNV* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_NV_coverage_reduction_mode
 void checkEqual_VkPhysicalDeviceCoverageReductionModeFeaturesNV(
     const VkPhysicalDeviceCoverageReductionModeFeaturesNV* a,
-    const VkPhysicalDeviceCoverageReductionModeFeaturesNV* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceCoverageReductionModeFeaturesNV* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPipelineCoverageReductionStateCreateInfoNV(
     const VkPipelineCoverageReductionStateCreateInfoNV* a,
-    const VkPipelineCoverageReductionStateCreateInfoNV* b,
-    OnFailCompareFunc onFail);
+    const VkPipelineCoverageReductionStateCreateInfoNV* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkFramebufferMixedSamplesCombinationNV(
     const VkFramebufferMixedSamplesCombinationNV* a,
-    const VkFramebufferMixedSamplesCombinationNV* b,
-    OnFailCompareFunc onFail);
+    const VkFramebufferMixedSamplesCombinationNV* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_fragment_shader_interlock
 void checkEqual_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(
     const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* a,
-    const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_ycbcr_image_arrays
 void checkEqual_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(
     const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* a,
-    const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_provoking_vertex
 void checkEqual_VkPhysicalDeviceProvokingVertexFeaturesEXT(
     const VkPhysicalDeviceProvokingVertexFeaturesEXT* a,
-    const VkPhysicalDeviceProvokingVertexFeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceProvokingVertexFeaturesEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceProvokingVertexPropertiesEXT(
     const VkPhysicalDeviceProvokingVertexPropertiesEXT* a,
-    const VkPhysicalDeviceProvokingVertexPropertiesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceProvokingVertexPropertiesEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT(
     const VkPipelineRasterizationProvokingVertexStateCreateInfoEXT* a,
-    const VkPipelineRasterizationProvokingVertexStateCreateInfoEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPipelineRasterizationProvokingVertexStateCreateInfoEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_full_screen_exclusive
-void checkEqual_VkSurfaceFullScreenExclusiveInfoEXT(
-    const VkSurfaceFullScreenExclusiveInfoEXT* a,
-    const VkSurfaceFullScreenExclusiveInfoEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSurfaceFullScreenExclusiveInfoEXT(const VkSurfaceFullScreenExclusiveInfoEXT* a,
+                                                    const VkSurfaceFullScreenExclusiveInfoEXT* b,
+                                                    OnFailCompareFunc onFail);
 
 void checkEqual_VkSurfaceCapabilitiesFullScreenExclusiveEXT(
     const VkSurfaceCapabilitiesFullScreenExclusiveEXT* a,
-    const VkSurfaceCapabilitiesFullScreenExclusiveEXT* b,
-    OnFailCompareFunc onFail);
+    const VkSurfaceCapabilitiesFullScreenExclusiveEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkSurfaceFullScreenExclusiveWin32InfoEXT(
     const VkSurfaceFullScreenExclusiveWin32InfoEXT* a,
-    const VkSurfaceFullScreenExclusiveWin32InfoEXT* b,
-    OnFailCompareFunc onFail);
+    const VkSurfaceFullScreenExclusiveWin32InfoEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_headless_surface
-void checkEqual_VkHeadlessSurfaceCreateInfoEXT(
-    const VkHeadlessSurfaceCreateInfoEXT* a,
-    const VkHeadlessSurfaceCreateInfoEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkHeadlessSurfaceCreateInfoEXT(const VkHeadlessSurfaceCreateInfoEXT* a,
+                                               const VkHeadlessSurfaceCreateInfoEXT* b,
+                                               OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_line_rasterization
 void checkEqual_VkPhysicalDeviceLineRasterizationFeaturesEXT(
     const VkPhysicalDeviceLineRasterizationFeaturesEXT* a,
-    const VkPhysicalDeviceLineRasterizationFeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceLineRasterizationFeaturesEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceLineRasterizationPropertiesEXT(
     const VkPhysicalDeviceLineRasterizationPropertiesEXT* a,
-    const VkPhysicalDeviceLineRasterizationPropertiesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceLineRasterizationPropertiesEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPipelineRasterizationLineStateCreateInfoEXT(
     const VkPipelineRasterizationLineStateCreateInfoEXT* a,
-    const VkPipelineRasterizationLineStateCreateInfoEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPipelineRasterizationLineStateCreateInfoEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_shader_atomic_float
 void checkEqual_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(
     const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* a,
-    const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_host_query_reset
-DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceHostQueryResetFeatures, checkEqual_VkPhysicalDeviceHostQueryResetFeaturesEXT)
+DEFINE_ALIAS_FUNCTION(checkEqual_VkPhysicalDeviceHostQueryResetFeatures,
+                      checkEqual_VkPhysicalDeviceHostQueryResetFeaturesEXT)
 
 #endif
 #ifdef VK_EXT_index_type_uint8
 void checkEqual_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(
     const VkPhysicalDeviceIndexTypeUint8FeaturesEXT* a,
-    const VkPhysicalDeviceIndexTypeUint8FeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceIndexTypeUint8FeaturesEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_extended_dynamic_state
 void checkEqual_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(
     const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* a,
-    const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_shader_atomic_float2
 void checkEqual_VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT(
     const VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT* a,
-    const VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
 void checkEqual_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(
     const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* a,
-    const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_NV_device_generated_commands
 void checkEqual_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(
     const VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* a,
-    const VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(
     const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* a,
-    const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkGraphicsShaderGroupCreateInfoNV(
-    const VkGraphicsShaderGroupCreateInfoNV* a,
-    const VkGraphicsShaderGroupCreateInfoNV* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkGraphicsShaderGroupCreateInfoNV(const VkGraphicsShaderGroupCreateInfoNV* a,
+                                                  const VkGraphicsShaderGroupCreateInfoNV* b,
+                                                  OnFailCompareFunc onFail);
 
 void checkEqual_VkGraphicsPipelineShaderGroupsCreateInfoNV(
     const VkGraphicsPipelineShaderGroupsCreateInfoNV* a,
-    const VkGraphicsPipelineShaderGroupsCreateInfoNV* b,
-    OnFailCompareFunc onFail);
+    const VkGraphicsPipelineShaderGroupsCreateInfoNV* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkBindShaderGroupIndirectCommandNV(
-    const VkBindShaderGroupIndirectCommandNV* a,
-    const VkBindShaderGroupIndirectCommandNV* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkBindShaderGroupIndirectCommandNV(const VkBindShaderGroupIndirectCommandNV* a,
+                                                   const VkBindShaderGroupIndirectCommandNV* b,
+                                                   OnFailCompareFunc onFail);
 
-void checkEqual_VkBindIndexBufferIndirectCommandNV(
-    const VkBindIndexBufferIndirectCommandNV* a,
-    const VkBindIndexBufferIndirectCommandNV* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkBindIndexBufferIndirectCommandNV(const VkBindIndexBufferIndirectCommandNV* a,
+                                                   const VkBindIndexBufferIndirectCommandNV* b,
+                                                   OnFailCompareFunc onFail);
 
-void checkEqual_VkBindVertexBufferIndirectCommandNV(
-    const VkBindVertexBufferIndirectCommandNV* a,
-    const VkBindVertexBufferIndirectCommandNV* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkBindVertexBufferIndirectCommandNV(const VkBindVertexBufferIndirectCommandNV* a,
+                                                    const VkBindVertexBufferIndirectCommandNV* b,
+                                                    OnFailCompareFunc onFail);
 
-void checkEqual_VkSetStateFlagsIndirectCommandNV(
-    const VkSetStateFlagsIndirectCommandNV* a,
-    const VkSetStateFlagsIndirectCommandNV* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSetStateFlagsIndirectCommandNV(const VkSetStateFlagsIndirectCommandNV* a,
+                                                 const VkSetStateFlagsIndirectCommandNV* b,
+                                                 OnFailCompareFunc onFail);
 
-void checkEqual_VkIndirectCommandsStreamNV(
-    const VkIndirectCommandsStreamNV* a,
-    const VkIndirectCommandsStreamNV* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkIndirectCommandsStreamNV(const VkIndirectCommandsStreamNV* a,
+                                           const VkIndirectCommandsStreamNV* b,
+                                           OnFailCompareFunc onFail);
 
-void checkEqual_VkIndirectCommandsLayoutTokenNV(
-    const VkIndirectCommandsLayoutTokenNV* a,
-    const VkIndirectCommandsLayoutTokenNV* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkIndirectCommandsLayoutTokenNV(const VkIndirectCommandsLayoutTokenNV* a,
+                                                const VkIndirectCommandsLayoutTokenNV* b,
+                                                OnFailCompareFunc onFail);
 
-void checkEqual_VkIndirectCommandsLayoutCreateInfoNV(
-    const VkIndirectCommandsLayoutCreateInfoNV* a,
-    const VkIndirectCommandsLayoutCreateInfoNV* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkIndirectCommandsLayoutCreateInfoNV(const VkIndirectCommandsLayoutCreateInfoNV* a,
+                                                     const VkIndirectCommandsLayoutCreateInfoNV* b,
+                                                     OnFailCompareFunc onFail);
 
-void checkEqual_VkGeneratedCommandsInfoNV(
-    const VkGeneratedCommandsInfoNV* a,
-    const VkGeneratedCommandsInfoNV* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkGeneratedCommandsInfoNV(const VkGeneratedCommandsInfoNV* a,
+                                          const VkGeneratedCommandsInfoNV* b,
+                                          OnFailCompareFunc onFail);
 
 void checkEqual_VkGeneratedCommandsMemoryRequirementsInfoNV(
     const VkGeneratedCommandsMemoryRequirementsInfoNV* a,
-    const VkGeneratedCommandsMemoryRequirementsInfoNV* b,
-    OnFailCompareFunc onFail);
+    const VkGeneratedCommandsMemoryRequirementsInfoNV* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_NV_inherited_viewport_scissor
 void checkEqual_VkPhysicalDeviceInheritedViewportScissorFeaturesNV(
     const VkPhysicalDeviceInheritedViewportScissorFeaturesNV* a,
-    const VkPhysicalDeviceInheritedViewportScissorFeaturesNV* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceInheritedViewportScissorFeaturesNV* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkCommandBufferInheritanceViewportScissorInfoNV(
     const VkCommandBufferInheritanceViewportScissorInfoNV* a,
-    const VkCommandBufferInheritanceViewportScissorInfoNV* b,
-    OnFailCompareFunc onFail);
+    const VkCommandBufferInheritanceViewportScissorInfoNV* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_texel_buffer_alignment
 void checkEqual_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
     const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* a,
-    const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(
     const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* a,
-    const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_QCOM_render_pass_transform
-void checkEqual_VkRenderPassTransformBeginInfoQCOM(
-    const VkRenderPassTransformBeginInfoQCOM* a,
-    const VkRenderPassTransformBeginInfoQCOM* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkRenderPassTransformBeginInfoQCOM(const VkRenderPassTransformBeginInfoQCOM* a,
+                                                   const VkRenderPassTransformBeginInfoQCOM* b,
+                                                   OnFailCompareFunc onFail);
 
 void checkEqual_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(
     const VkCommandBufferInheritanceRenderPassTransformInfoQCOM* a,
-    const VkCommandBufferInheritanceRenderPassTransformInfoQCOM* b,
-    OnFailCompareFunc onFail);
+    const VkCommandBufferInheritanceRenderPassTransformInfoQCOM* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_device_memory_report
 void checkEqual_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(
     const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* a,
-    const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkDeviceMemoryReportCallbackDataEXT(
-    const VkDeviceMemoryReportCallbackDataEXT* a,
-    const VkDeviceMemoryReportCallbackDataEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDeviceMemoryReportCallbackDataEXT(const VkDeviceMemoryReportCallbackDataEXT* a,
+                                                    const VkDeviceMemoryReportCallbackDataEXT* b,
+                                                    OnFailCompareFunc onFail);
 
 void checkEqual_VkDeviceDeviceMemoryReportCreateInfoEXT(
     const VkDeviceDeviceMemoryReportCreateInfoEXT* a,
-    const VkDeviceDeviceMemoryReportCreateInfoEXT* b,
-    OnFailCompareFunc onFail);
+    const VkDeviceDeviceMemoryReportCreateInfoEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_acquire_drm_display
@@ -3909,30 +3210,25 @@
 #ifdef VK_EXT_robustness2
 void checkEqual_VkPhysicalDeviceRobustness2FeaturesEXT(
     const VkPhysicalDeviceRobustness2FeaturesEXT* a,
-    const VkPhysicalDeviceRobustness2FeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceRobustness2FeaturesEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceRobustness2PropertiesEXT(
     const VkPhysicalDeviceRobustness2PropertiesEXT* a,
-    const VkPhysicalDeviceRobustness2PropertiesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceRobustness2PropertiesEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_custom_border_color
 void checkEqual_VkSamplerCustomBorderColorCreateInfoEXT(
     const VkSamplerCustomBorderColorCreateInfoEXT* a,
-    const VkSamplerCustomBorderColorCreateInfoEXT* b,
-    OnFailCompareFunc onFail);
+    const VkSamplerCustomBorderColorCreateInfoEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceCustomBorderColorPropertiesEXT(
     const VkPhysicalDeviceCustomBorderColorPropertiesEXT* a,
-    const VkPhysicalDeviceCustomBorderColorPropertiesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceCustomBorderColorPropertiesEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceCustomBorderColorFeaturesEXT(
     const VkPhysicalDeviceCustomBorderColorFeaturesEXT* a,
-    const VkPhysicalDeviceCustomBorderColorFeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceCustomBorderColorFeaturesEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_GOOGLE_user_type
@@ -3940,36 +3236,30 @@
 #ifdef VK_EXT_private_data
 void checkEqual_VkPhysicalDevicePrivateDataFeaturesEXT(
     const VkPhysicalDevicePrivateDataFeaturesEXT* a,
-    const VkPhysicalDevicePrivateDataFeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDevicePrivateDataFeaturesEXT* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkDevicePrivateDataCreateInfoEXT(
-    const VkDevicePrivateDataCreateInfoEXT* a,
-    const VkDevicePrivateDataCreateInfoEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDevicePrivateDataCreateInfoEXT(const VkDevicePrivateDataCreateInfoEXT* a,
+                                                 const VkDevicePrivateDataCreateInfoEXT* b,
+                                                 OnFailCompareFunc onFail);
 
-void checkEqual_VkPrivateDataSlotCreateInfoEXT(
-    const VkPrivateDataSlotCreateInfoEXT* a,
-    const VkPrivateDataSlotCreateInfoEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPrivateDataSlotCreateInfoEXT(const VkPrivateDataSlotCreateInfoEXT* a,
+                                               const VkPrivateDataSlotCreateInfoEXT* b,
+                                               OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_pipeline_creation_cache_control
 void checkEqual_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(
     const VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* a,
-    const VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_NV_device_diagnostics_config
 void checkEqual_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(
     const VkPhysicalDeviceDiagnosticsConfigFeaturesNV* a,
-    const VkPhysicalDeviceDiagnosticsConfigFeaturesNV* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceDiagnosticsConfigFeaturesNV* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkDeviceDiagnosticsConfigCreateInfoNV(
-    const VkDeviceDiagnosticsConfigCreateInfoNV* a,
-    const VkDeviceDiagnosticsConfigCreateInfoNV* b,
+    const VkDeviceDiagnosticsConfigCreateInfoNV* a, const VkDeviceDiagnosticsConfigCreateInfoNV* b,
     OnFailCompareFunc onFail);
 
 #endif
@@ -3978,363 +3268,297 @@
 #ifdef VK_NV_fragment_shading_rate_enums
 void checkEqual_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(
     const VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* a,
-    const VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(
     const VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* a,
-    const VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(
     const VkPipelineFragmentShadingRateEnumStateCreateInfoNV* a,
-    const VkPipelineFragmentShadingRateEnumStateCreateInfoNV* b,
-    OnFailCompareFunc onFail);
+    const VkPipelineFragmentShadingRateEnumStateCreateInfoNV* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_NV_ray_tracing_motion_blur
-void checkEqual_VkDeviceOrHostAddressConstKHR(
-    const VkDeviceOrHostAddressConstKHR* a,
-    const VkDeviceOrHostAddressConstKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDeviceOrHostAddressConstKHR(const VkDeviceOrHostAddressConstKHR* a,
+                                              const VkDeviceOrHostAddressConstKHR* b,
+                                              OnFailCompareFunc onFail);
 
 void checkEqual_VkAccelerationStructureGeometryMotionTrianglesDataNV(
     const VkAccelerationStructureGeometryMotionTrianglesDataNV* a,
-    const VkAccelerationStructureGeometryMotionTrianglesDataNV* b,
-    OnFailCompareFunc onFail);
+    const VkAccelerationStructureGeometryMotionTrianglesDataNV* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkAccelerationStructureMotionInfoNV(
-    const VkAccelerationStructureMotionInfoNV* a,
-    const VkAccelerationStructureMotionInfoNV* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkAccelerationStructureMotionInfoNV(const VkAccelerationStructureMotionInfoNV* a,
+                                                    const VkAccelerationStructureMotionInfoNV* b,
+                                                    OnFailCompareFunc onFail);
 
 void checkEqual_VkAccelerationStructureMatrixMotionInstanceNV(
     const VkAccelerationStructureMatrixMotionInstanceNV* a,
-    const VkAccelerationStructureMatrixMotionInstanceNV* b,
-    OnFailCompareFunc onFail);
+    const VkAccelerationStructureMatrixMotionInstanceNV* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkSRTDataNV(
-    const VkSRTDataNV* a,
-    const VkSRTDataNV* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSRTDataNV(const VkSRTDataNV* a, const VkSRTDataNV* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkAccelerationStructureSRTMotionInstanceNV(
     const VkAccelerationStructureSRTMotionInstanceNV* a,
-    const VkAccelerationStructureSRTMotionInstanceNV* b,
-    OnFailCompareFunc onFail);
+    const VkAccelerationStructureSRTMotionInstanceNV* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkAccelerationStructureMotionInstanceDataNV(
     const VkAccelerationStructureMotionInstanceDataNV* a,
-    const VkAccelerationStructureMotionInstanceDataNV* b,
-    OnFailCompareFunc onFail);
+    const VkAccelerationStructureMotionInstanceDataNV* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkAccelerationStructureMotionInstanceNV(
     const VkAccelerationStructureMotionInstanceNV* a,
-    const VkAccelerationStructureMotionInstanceNV* b,
-    OnFailCompareFunc onFail);
+    const VkAccelerationStructureMotionInstanceNV* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceRayTracingMotionBlurFeaturesNV(
     const VkPhysicalDeviceRayTracingMotionBlurFeaturesNV* a,
-    const VkPhysicalDeviceRayTracingMotionBlurFeaturesNV* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceRayTracingMotionBlurFeaturesNV* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_ycbcr_2plane_444_formats
 void checkEqual_VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT(
     const VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT* a,
-    const VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_fragment_density_map2
 void checkEqual_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(
     const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* a,
-    const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(
     const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* a,
-    const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_QCOM_rotated_copy_commands
-void checkEqual_VkCopyCommandTransformInfoQCOM(
-    const VkCopyCommandTransformInfoQCOM* a,
-    const VkCopyCommandTransformInfoQCOM* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkCopyCommandTransformInfoQCOM(const VkCopyCommandTransformInfoQCOM* a,
+                                               const VkCopyCommandTransformInfoQCOM* b,
+                                               OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_image_robustness
 void checkEqual_VkPhysicalDeviceImageRobustnessFeaturesEXT(
     const VkPhysicalDeviceImageRobustnessFeaturesEXT* a,
-    const VkPhysicalDeviceImageRobustnessFeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceImageRobustnessFeaturesEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_4444_formats
 void checkEqual_VkPhysicalDevice4444FormatsFeaturesEXT(
     const VkPhysicalDevice4444FormatsFeaturesEXT* a,
-    const VkPhysicalDevice4444FormatsFeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDevice4444FormatsFeaturesEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_rgba10x6_formats
 void checkEqual_VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT(
     const VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT* a,
-    const VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_NV_acquire_winrt_display
 #endif
 #ifdef VK_EXT_directfb_surface
-void checkEqual_VkDirectFBSurfaceCreateInfoEXT(
-    const VkDirectFBSurfaceCreateInfoEXT* a,
-    const VkDirectFBSurfaceCreateInfoEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDirectFBSurfaceCreateInfoEXT(const VkDirectFBSurfaceCreateInfoEXT* a,
+                                               const VkDirectFBSurfaceCreateInfoEXT* b,
+                                               OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_VALVE_mutable_descriptor_type
 void checkEqual_VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE(
     const VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE* a,
-    const VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkMutableDescriptorTypeListVALVE(
-    const VkMutableDescriptorTypeListVALVE* a,
-    const VkMutableDescriptorTypeListVALVE* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkMutableDescriptorTypeListVALVE(const VkMutableDescriptorTypeListVALVE* a,
+                                                 const VkMutableDescriptorTypeListVALVE* b,
+                                                 OnFailCompareFunc onFail);
 
 void checkEqual_VkMutableDescriptorTypeCreateInfoVALVE(
     const VkMutableDescriptorTypeCreateInfoVALVE* a,
-    const VkMutableDescriptorTypeCreateInfoVALVE* b,
-    OnFailCompareFunc onFail);
+    const VkMutableDescriptorTypeCreateInfoVALVE* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_vertex_input_dynamic_state
 void checkEqual_VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT(
     const VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT* a,
-    const VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkVertexInputBindingDescription2EXT(
-    const VkVertexInputBindingDescription2EXT* a,
-    const VkVertexInputBindingDescription2EXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkVertexInputBindingDescription2EXT(const VkVertexInputBindingDescription2EXT* a,
+                                                    const VkVertexInputBindingDescription2EXT* b,
+                                                    OnFailCompareFunc onFail);
 
 void checkEqual_VkVertexInputAttributeDescription2EXT(
-    const VkVertexInputAttributeDescription2EXT* a,
-    const VkVertexInputAttributeDescription2EXT* b,
+    const VkVertexInputAttributeDescription2EXT* a, const VkVertexInputAttributeDescription2EXT* b,
     OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_physical_device_drm
-void checkEqual_VkPhysicalDeviceDrmPropertiesEXT(
-    const VkPhysicalDeviceDrmPropertiesEXT* a,
-    const VkPhysicalDeviceDrmPropertiesEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPhysicalDeviceDrmPropertiesEXT(const VkPhysicalDeviceDrmPropertiesEXT* a,
+                                                 const VkPhysicalDeviceDrmPropertiesEXT* b,
+                                                 OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_primitive_topology_list_restart
 void checkEqual_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT(
     const VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT* a,
-    const VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_FUCHSIA_external_memory
 void checkEqual_VkImportMemoryZirconHandleInfoFUCHSIA(
-    const VkImportMemoryZirconHandleInfoFUCHSIA* a,
-    const VkImportMemoryZirconHandleInfoFUCHSIA* b,
+    const VkImportMemoryZirconHandleInfoFUCHSIA* a, const VkImportMemoryZirconHandleInfoFUCHSIA* b,
     OnFailCompareFunc onFail);
 
 void checkEqual_VkMemoryZirconHandlePropertiesFUCHSIA(
-    const VkMemoryZirconHandlePropertiesFUCHSIA* a,
-    const VkMemoryZirconHandlePropertiesFUCHSIA* b,
+    const VkMemoryZirconHandlePropertiesFUCHSIA* a, const VkMemoryZirconHandlePropertiesFUCHSIA* b,
     OnFailCompareFunc onFail);
 
-void checkEqual_VkMemoryGetZirconHandleInfoFUCHSIA(
-    const VkMemoryGetZirconHandleInfoFUCHSIA* a,
-    const VkMemoryGetZirconHandleInfoFUCHSIA* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkMemoryGetZirconHandleInfoFUCHSIA(const VkMemoryGetZirconHandleInfoFUCHSIA* a,
+                                                   const VkMemoryGetZirconHandleInfoFUCHSIA* b,
+                                                   OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_FUCHSIA_external_semaphore
 void checkEqual_VkImportSemaphoreZirconHandleInfoFUCHSIA(
     const VkImportSemaphoreZirconHandleInfoFUCHSIA* a,
-    const VkImportSemaphoreZirconHandleInfoFUCHSIA* b,
-    OnFailCompareFunc onFail);
+    const VkImportSemaphoreZirconHandleInfoFUCHSIA* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkSemaphoreGetZirconHandleInfoFUCHSIA(
-    const VkSemaphoreGetZirconHandleInfoFUCHSIA* a,
-    const VkSemaphoreGetZirconHandleInfoFUCHSIA* b,
+    const VkSemaphoreGetZirconHandleInfoFUCHSIA* a, const VkSemaphoreGetZirconHandleInfoFUCHSIA* b,
     OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
-void checkEqual_VkBufferCollectionCreateInfoFUCHSIA(
-    const VkBufferCollectionCreateInfoFUCHSIA* a,
-    const VkBufferCollectionCreateInfoFUCHSIA* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkBufferCollectionCreateInfoFUCHSIA(const VkBufferCollectionCreateInfoFUCHSIA* a,
+                                                    const VkBufferCollectionCreateInfoFUCHSIA* b,
+                                                    OnFailCompareFunc onFail);
 
 void checkEqual_VkImportMemoryBufferCollectionFUCHSIA(
-    const VkImportMemoryBufferCollectionFUCHSIA* a,
-    const VkImportMemoryBufferCollectionFUCHSIA* b,
+    const VkImportMemoryBufferCollectionFUCHSIA* a, const VkImportMemoryBufferCollectionFUCHSIA* b,
     OnFailCompareFunc onFail);
 
 void checkEqual_VkBufferCollectionImageCreateInfoFUCHSIA(
     const VkBufferCollectionImageCreateInfoFUCHSIA* a,
-    const VkBufferCollectionImageCreateInfoFUCHSIA* b,
-    OnFailCompareFunc onFail);
+    const VkBufferCollectionImageCreateInfoFUCHSIA* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkBufferCollectionConstraintsInfoFUCHSIA(
     const VkBufferCollectionConstraintsInfoFUCHSIA* a,
-    const VkBufferCollectionConstraintsInfoFUCHSIA* b,
-    OnFailCompareFunc onFail);
+    const VkBufferCollectionConstraintsInfoFUCHSIA* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkBufferConstraintsInfoFUCHSIA(
-    const VkBufferConstraintsInfoFUCHSIA* a,
-    const VkBufferConstraintsInfoFUCHSIA* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkBufferConstraintsInfoFUCHSIA(const VkBufferConstraintsInfoFUCHSIA* a,
+                                               const VkBufferConstraintsInfoFUCHSIA* b,
+                                               OnFailCompareFunc onFail);
 
 void checkEqual_VkBufferCollectionBufferCreateInfoFUCHSIA(
     const VkBufferCollectionBufferCreateInfoFUCHSIA* a,
-    const VkBufferCollectionBufferCreateInfoFUCHSIA* b,
-    OnFailCompareFunc onFail);
+    const VkBufferCollectionBufferCreateInfoFUCHSIA* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkSysmemColorSpaceFUCHSIA(
-    const VkSysmemColorSpaceFUCHSIA* a,
-    const VkSysmemColorSpaceFUCHSIA* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkSysmemColorSpaceFUCHSIA(const VkSysmemColorSpaceFUCHSIA* a,
+                                          const VkSysmemColorSpaceFUCHSIA* b,
+                                          OnFailCompareFunc onFail);
 
-void checkEqual_VkBufferCollectionPropertiesFUCHSIA(
-    const VkBufferCollectionPropertiesFUCHSIA* a,
-    const VkBufferCollectionPropertiesFUCHSIA* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkBufferCollectionPropertiesFUCHSIA(const VkBufferCollectionPropertiesFUCHSIA* a,
+                                                    const VkBufferCollectionPropertiesFUCHSIA* b,
+                                                    OnFailCompareFunc onFail);
 
-void checkEqual_VkImageFormatConstraintsInfoFUCHSIA(
-    const VkImageFormatConstraintsInfoFUCHSIA* a,
-    const VkImageFormatConstraintsInfoFUCHSIA* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImageFormatConstraintsInfoFUCHSIA(const VkImageFormatConstraintsInfoFUCHSIA* a,
+                                                    const VkImageFormatConstraintsInfoFUCHSIA* b,
+                                                    OnFailCompareFunc onFail);
 
-void checkEqual_VkImageConstraintsInfoFUCHSIA(
-    const VkImageConstraintsInfoFUCHSIA* a,
-    const VkImageConstraintsInfoFUCHSIA* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImageConstraintsInfoFUCHSIA(const VkImageConstraintsInfoFUCHSIA* a,
+                                              const VkImageConstraintsInfoFUCHSIA* b,
+                                              OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_HUAWEI_subpass_shading
 void checkEqual_VkSubpassShadingPipelineCreateInfoHUAWEI(
     const VkSubpassShadingPipelineCreateInfoHUAWEI* a,
-    const VkSubpassShadingPipelineCreateInfoHUAWEI* b,
-    OnFailCompareFunc onFail);
+    const VkSubpassShadingPipelineCreateInfoHUAWEI* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceSubpassShadingFeaturesHUAWEI(
     const VkPhysicalDeviceSubpassShadingFeaturesHUAWEI* a,
-    const VkPhysicalDeviceSubpassShadingFeaturesHUAWEI* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceSubpassShadingFeaturesHUAWEI* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceSubpassShadingPropertiesHUAWEI(
     const VkPhysicalDeviceSubpassShadingPropertiesHUAWEI* a,
-    const VkPhysicalDeviceSubpassShadingPropertiesHUAWEI* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceSubpassShadingPropertiesHUAWEI* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_HUAWEI_invocation_mask
 void checkEqual_VkPhysicalDeviceInvocationMaskFeaturesHUAWEI(
     const VkPhysicalDeviceInvocationMaskFeaturesHUAWEI* a,
-    const VkPhysicalDeviceInvocationMaskFeaturesHUAWEI* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceInvocationMaskFeaturesHUAWEI* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_NV_external_memory_rdma
-void checkEqual_VkMemoryGetRemoteAddressInfoNV(
-    const VkMemoryGetRemoteAddressInfoNV* a,
-    const VkMemoryGetRemoteAddressInfoNV* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkMemoryGetRemoteAddressInfoNV(const VkMemoryGetRemoteAddressInfoNV* a,
+                                               const VkMemoryGetRemoteAddressInfoNV* b,
+                                               OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceExternalMemoryRDMAFeaturesNV(
     const VkPhysicalDeviceExternalMemoryRDMAFeaturesNV* a,
-    const VkPhysicalDeviceExternalMemoryRDMAFeaturesNV* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceExternalMemoryRDMAFeaturesNV* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
 void checkEqual_VkPhysicalDeviceExtendedDynamicState2FeaturesEXT(
     const VkPhysicalDeviceExtendedDynamicState2FeaturesEXT* a,
-    const VkPhysicalDeviceExtendedDynamicState2FeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceExtendedDynamicState2FeaturesEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_QNX_screen_surface
-void checkEqual_VkScreenSurfaceCreateInfoQNX(
-    const VkScreenSurfaceCreateInfoQNX* a,
-    const VkScreenSurfaceCreateInfoQNX* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkScreenSurfaceCreateInfoQNX(const VkScreenSurfaceCreateInfoQNX* a,
+                                             const VkScreenSurfaceCreateInfoQNX* b,
+                                             OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_color_write_enable
 void checkEqual_VkPhysicalDeviceColorWriteEnableFeaturesEXT(
     const VkPhysicalDeviceColorWriteEnableFeaturesEXT* a,
-    const VkPhysicalDeviceColorWriteEnableFeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceColorWriteEnableFeaturesEXT* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkPipelineColorWriteCreateInfoEXT(
-    const VkPipelineColorWriteCreateInfoEXT* a,
-    const VkPipelineColorWriteCreateInfoEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPipelineColorWriteCreateInfoEXT(const VkPipelineColorWriteCreateInfoEXT* a,
+                                                  const VkPipelineColorWriteCreateInfoEXT* b,
+                                                  OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_GOOGLE_gfxstream
-void checkEqual_VkImportColorBufferGOOGLE(
-    const VkImportColorBufferGOOGLE* a,
-    const VkImportColorBufferGOOGLE* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImportColorBufferGOOGLE(const VkImportColorBufferGOOGLE* a,
+                                          const VkImportColorBufferGOOGLE* b,
+                                          OnFailCompareFunc onFail);
 
-void checkEqual_VkImportBufferGOOGLE(
-    const VkImportBufferGOOGLE* a,
-    const VkImportBufferGOOGLE* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImportBufferGOOGLE(const VkImportBufferGOOGLE* a, const VkImportBufferGOOGLE* b,
+                                     OnFailCompareFunc onFail);
 
-void checkEqual_VkImportPhysicalAddressGOOGLE(
-    const VkImportPhysicalAddressGOOGLE* a,
-    const VkImportPhysicalAddressGOOGLE* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkImportPhysicalAddressGOOGLE(const VkImportPhysicalAddressGOOGLE* a,
+                                              const VkImportPhysicalAddressGOOGLE* b,
+                                              OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_global_priority_query
 void checkEqual_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(
     const VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT* a,
-    const VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkQueueFamilyGlobalPriorityPropertiesEXT(
     const VkQueueFamilyGlobalPriorityPropertiesEXT* a,
-    const VkQueueFamilyGlobalPriorityPropertiesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkQueueFamilyGlobalPriorityPropertiesEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_multi_draw
-void checkEqual_VkPhysicalDeviceMultiDrawFeaturesEXT(
-    const VkPhysicalDeviceMultiDrawFeaturesEXT* a,
-    const VkPhysicalDeviceMultiDrawFeaturesEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPhysicalDeviceMultiDrawFeaturesEXT(const VkPhysicalDeviceMultiDrawFeaturesEXT* a,
+                                                     const VkPhysicalDeviceMultiDrawFeaturesEXT* b,
+                                                     OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceMultiDrawPropertiesEXT(
     const VkPhysicalDeviceMultiDrawPropertiesEXT* a,
-    const VkPhysicalDeviceMultiDrawPropertiesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceMultiDrawPropertiesEXT* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkMultiDrawInfoEXT(
-    const VkMultiDrawInfoEXT* a,
-    const VkMultiDrawInfoEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkMultiDrawInfoEXT(const VkMultiDrawInfoEXT* a, const VkMultiDrawInfoEXT* b,
+                                   OnFailCompareFunc onFail);
 
-void checkEqual_VkMultiDrawIndexedInfoEXT(
-    const VkMultiDrawIndexedInfoEXT* a,
-    const VkMultiDrawIndexedInfoEXT* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkMultiDrawIndexedInfoEXT(const VkMultiDrawIndexedInfoEXT* a,
+                                          const VkMultiDrawIndexedInfoEXT* b,
+                                          OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_load_store_op_none
@@ -4342,157 +3566,128 @@
 #ifdef VK_EXT_border_color_swizzle
 void checkEqual_VkPhysicalDeviceBorderColorSwizzleFeaturesEXT(
     const VkPhysicalDeviceBorderColorSwizzleFeaturesEXT* a,
-    const VkPhysicalDeviceBorderColorSwizzleFeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceBorderColorSwizzleFeaturesEXT* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkSamplerBorderColorComponentMappingCreateInfoEXT(
     const VkSamplerBorderColorComponentMappingCreateInfoEXT* a,
-    const VkSamplerBorderColorComponentMappingCreateInfoEXT* b,
-    OnFailCompareFunc onFail);
+    const VkSamplerBorderColorComponentMappingCreateInfoEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_EXT_pageable_device_local_memory
 void checkEqual_VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT(
     const VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT* a,
-    const VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_acceleration_structure
-void checkEqual_VkDeviceOrHostAddressKHR(
-    const VkDeviceOrHostAddressKHR* a,
-    const VkDeviceOrHostAddressKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkDeviceOrHostAddressKHR(const VkDeviceOrHostAddressKHR* a,
+                                         const VkDeviceOrHostAddressKHR* b,
+                                         OnFailCompareFunc onFail);
 
 void checkEqual_VkAccelerationStructureBuildRangeInfoKHR(
     const VkAccelerationStructureBuildRangeInfoKHR* a,
-    const VkAccelerationStructureBuildRangeInfoKHR* b,
-    OnFailCompareFunc onFail);
+    const VkAccelerationStructureBuildRangeInfoKHR* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkAccelerationStructureGeometryTrianglesDataKHR(
     const VkAccelerationStructureGeometryTrianglesDataKHR* a,
-    const VkAccelerationStructureGeometryTrianglesDataKHR* b,
-    OnFailCompareFunc onFail);
+    const VkAccelerationStructureGeometryTrianglesDataKHR* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkAccelerationStructureGeometryAabbsDataKHR(
     const VkAccelerationStructureGeometryAabbsDataKHR* a,
-    const VkAccelerationStructureGeometryAabbsDataKHR* b,
-    OnFailCompareFunc onFail);
+    const VkAccelerationStructureGeometryAabbsDataKHR* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkAccelerationStructureGeometryInstancesDataKHR(
     const VkAccelerationStructureGeometryInstancesDataKHR* a,
-    const VkAccelerationStructureGeometryInstancesDataKHR* b,
-    OnFailCompareFunc onFail);
+    const VkAccelerationStructureGeometryInstancesDataKHR* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkAccelerationStructureGeometryDataKHR(
     const VkAccelerationStructureGeometryDataKHR* a,
-    const VkAccelerationStructureGeometryDataKHR* b,
-    OnFailCompareFunc onFail);
+    const VkAccelerationStructureGeometryDataKHR* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkAccelerationStructureGeometryKHR(
-    const VkAccelerationStructureGeometryKHR* a,
-    const VkAccelerationStructureGeometryKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkAccelerationStructureGeometryKHR(const VkAccelerationStructureGeometryKHR* a,
+                                                   const VkAccelerationStructureGeometryKHR* b,
+                                                   OnFailCompareFunc onFail);
 
 void checkEqual_VkAccelerationStructureBuildGeometryInfoKHR(
     const VkAccelerationStructureBuildGeometryInfoKHR* a,
-    const VkAccelerationStructureBuildGeometryInfoKHR* b,
-    OnFailCompareFunc onFail);
+    const VkAccelerationStructureBuildGeometryInfoKHR* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkAccelerationStructureCreateInfoKHR(
-    const VkAccelerationStructureCreateInfoKHR* a,
-    const VkAccelerationStructureCreateInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkAccelerationStructureCreateInfoKHR(const VkAccelerationStructureCreateInfoKHR* a,
+                                                     const VkAccelerationStructureCreateInfoKHR* b,
+                                                     OnFailCompareFunc onFail);
 
 void checkEqual_VkWriteDescriptorSetAccelerationStructureKHR(
     const VkWriteDescriptorSetAccelerationStructureKHR* a,
-    const VkWriteDescriptorSetAccelerationStructureKHR* b,
-    OnFailCompareFunc onFail);
+    const VkWriteDescriptorSetAccelerationStructureKHR* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceAccelerationStructureFeaturesKHR(
     const VkPhysicalDeviceAccelerationStructureFeaturesKHR* a,
-    const VkPhysicalDeviceAccelerationStructureFeaturesKHR* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceAccelerationStructureFeaturesKHR* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceAccelerationStructurePropertiesKHR(
     const VkPhysicalDeviceAccelerationStructurePropertiesKHR* a,
-    const VkPhysicalDeviceAccelerationStructurePropertiesKHR* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceAccelerationStructurePropertiesKHR* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkAccelerationStructureDeviceAddressInfoKHR(
     const VkAccelerationStructureDeviceAddressInfoKHR* a,
-    const VkAccelerationStructureDeviceAddressInfoKHR* b,
-    OnFailCompareFunc onFail);
+    const VkAccelerationStructureDeviceAddressInfoKHR* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkAccelerationStructureVersionInfoKHR(
-    const VkAccelerationStructureVersionInfoKHR* a,
-    const VkAccelerationStructureVersionInfoKHR* b,
+    const VkAccelerationStructureVersionInfoKHR* a, const VkAccelerationStructureVersionInfoKHR* b,
     OnFailCompareFunc onFail);
 
 void checkEqual_VkCopyAccelerationStructureToMemoryInfoKHR(
     const VkCopyAccelerationStructureToMemoryInfoKHR* a,
-    const VkCopyAccelerationStructureToMemoryInfoKHR* b,
-    OnFailCompareFunc onFail);
+    const VkCopyAccelerationStructureToMemoryInfoKHR* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkCopyMemoryToAccelerationStructureInfoKHR(
     const VkCopyMemoryToAccelerationStructureInfoKHR* a,
-    const VkCopyMemoryToAccelerationStructureInfoKHR* b,
-    OnFailCompareFunc onFail);
+    const VkCopyMemoryToAccelerationStructureInfoKHR* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkCopyAccelerationStructureInfoKHR(
-    const VkCopyAccelerationStructureInfoKHR* a,
-    const VkCopyAccelerationStructureInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkCopyAccelerationStructureInfoKHR(const VkCopyAccelerationStructureInfoKHR* a,
+                                                   const VkCopyAccelerationStructureInfoKHR* b,
+                                                   OnFailCompareFunc onFail);
 
 void checkEqual_VkAccelerationStructureBuildSizesInfoKHR(
     const VkAccelerationStructureBuildSizesInfoKHR* a,
-    const VkAccelerationStructureBuildSizesInfoKHR* b,
-    OnFailCompareFunc onFail);
+    const VkAccelerationStructureBuildSizesInfoKHR* b, OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
-void checkEqual_VkRayTracingShaderGroupCreateInfoKHR(
-    const VkRayTracingShaderGroupCreateInfoKHR* a,
-    const VkRayTracingShaderGroupCreateInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkRayTracingShaderGroupCreateInfoKHR(const VkRayTracingShaderGroupCreateInfoKHR* a,
+                                                     const VkRayTracingShaderGroupCreateInfoKHR* b,
+                                                     OnFailCompareFunc onFail);
 
 void checkEqual_VkRayTracingPipelineInterfaceCreateInfoKHR(
     const VkRayTracingPipelineInterfaceCreateInfoKHR* a,
-    const VkRayTracingPipelineInterfaceCreateInfoKHR* b,
-    OnFailCompareFunc onFail);
+    const VkRayTracingPipelineInterfaceCreateInfoKHR* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkRayTracingPipelineCreateInfoKHR(
-    const VkRayTracingPipelineCreateInfoKHR* a,
-    const VkRayTracingPipelineCreateInfoKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkRayTracingPipelineCreateInfoKHR(const VkRayTracingPipelineCreateInfoKHR* a,
+                                                  const VkRayTracingPipelineCreateInfoKHR* b,
+                                                  OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(
     const VkPhysicalDeviceRayTracingPipelineFeaturesKHR* a,
-    const VkPhysicalDeviceRayTracingPipelineFeaturesKHR* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceRayTracingPipelineFeaturesKHR* b, OnFailCompareFunc onFail);
 
 void checkEqual_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(
     const VkPhysicalDeviceRayTracingPipelinePropertiesKHR* a,
-    const VkPhysicalDeviceRayTracingPipelinePropertiesKHR* b,
-    OnFailCompareFunc onFail);
+    const VkPhysicalDeviceRayTracingPipelinePropertiesKHR* b, OnFailCompareFunc onFail);
 
-void checkEqual_VkStridedDeviceAddressRegionKHR(
-    const VkStridedDeviceAddressRegionKHR* a,
-    const VkStridedDeviceAddressRegionKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkStridedDeviceAddressRegionKHR(const VkStridedDeviceAddressRegionKHR* a,
+                                                const VkStridedDeviceAddressRegionKHR* b,
+                                                OnFailCompareFunc onFail);
 
-void checkEqual_VkTraceRaysIndirectCommandKHR(
-    const VkTraceRaysIndirectCommandKHR* a,
-    const VkTraceRaysIndirectCommandKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkTraceRaysIndirectCommandKHR(const VkTraceRaysIndirectCommandKHR* a,
+                                              const VkTraceRaysIndirectCommandKHR* b,
+                                              OnFailCompareFunc onFail);
 
 #endif
 #ifdef VK_KHR_ray_query
-void checkEqual_VkPhysicalDeviceRayQueryFeaturesKHR(
-    const VkPhysicalDeviceRayQueryFeaturesKHR* a,
-    const VkPhysicalDeviceRayQueryFeaturesKHR* b,
-    OnFailCompareFunc onFail);
+void checkEqual_VkPhysicalDeviceRayQueryFeaturesKHR(const VkPhysicalDeviceRayQueryFeaturesKHR* a,
+                                                    const VkPhysicalDeviceRayQueryFeaturesKHR* b,
+                                                    OnFailCompareFunc onFail);
 
 #endif
 
-} // namespace goldfish_vk
+}  // namespace goldfish_vk
diff --git a/stream-servers/vulkan/cereal/common/goldfish_vk_transform.cpp b/stream-servers/vulkan/cereal/common/goldfish_vk_transform.cpp
index 7d0b6ae..2285f6f 100644
--- a/stream-servers/vulkan/cereal/common/goldfish_vk_transform.cpp
+++ b/stream-servers/vulkan/cereal/common/goldfish_vk_transform.cpp
@@ -14,1636 +14,1306 @@
 // limitations under the License.
 
 // Autogenerated module goldfish_vk_transform
-// (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
+// (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal
+// -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
 // VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
 // VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+//
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o
+// $CEREAL_OUTPUT_DIR
+//
 
 #include "goldfish_vk_transform.h"
 
-
 #include "VkDecoderGlobalState.h"
 
-
 namespace goldfish_vk {
 
-void transform_tohost_extension_struct(
-    VkDecoderGlobalState* resourceTracker,
-    void* structExtension_out);
+void transform_tohost_extension_struct(VkDecoderGlobalState* resourceTracker,
+                                       void* structExtension_out);
 
-void transform_fromhost_extension_struct(
-    VkDecoderGlobalState* resourceTracker,
-    void* structExtension_out);
+void transform_fromhost_extension_struct(VkDecoderGlobalState* resourceTracker,
+                                         void* structExtension_out);
 
 #ifdef VK_VERSION_1_0
-void transform_tohost_VkExtent2D(
-    VkDecoderGlobalState* resourceTracker,
-    VkExtent2D* toTransform)
-{
+void transform_tohost_VkExtent2D(VkDecoderGlobalState* resourceTracker, VkExtent2D* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkExtent2D(
-    VkDecoderGlobalState* resourceTracker,
-    VkExtent2D* toTransform)
-{
+void transform_fromhost_VkExtent2D(VkDecoderGlobalState* resourceTracker, VkExtent2D* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkExtent3D(
-    VkDecoderGlobalState* resourceTracker,
-    VkExtent3D* toTransform)
-{
+void transform_tohost_VkExtent3D(VkDecoderGlobalState* resourceTracker, VkExtent3D* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkExtent3D(
-    VkDecoderGlobalState* resourceTracker,
-    VkExtent3D* toTransform)
-{
+void transform_fromhost_VkExtent3D(VkDecoderGlobalState* resourceTracker, VkExtent3D* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkOffset2D(
-    VkDecoderGlobalState* resourceTracker,
-    VkOffset2D* toTransform)
-{
+void transform_tohost_VkOffset2D(VkDecoderGlobalState* resourceTracker, VkOffset2D* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkOffset2D(
-    VkDecoderGlobalState* resourceTracker,
-    VkOffset2D* toTransform)
-{
+void transform_fromhost_VkOffset2D(VkDecoderGlobalState* resourceTracker, VkOffset2D* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkOffset3D(
-    VkDecoderGlobalState* resourceTracker,
-    VkOffset3D* toTransform)
-{
+void transform_tohost_VkOffset3D(VkDecoderGlobalState* resourceTracker, VkOffset3D* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkOffset3D(
-    VkDecoderGlobalState* resourceTracker,
-    VkOffset3D* toTransform)
-{
+void transform_fromhost_VkOffset3D(VkDecoderGlobalState* resourceTracker, VkOffset3D* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkRect2D(
-    VkDecoderGlobalState* resourceTracker,
-    VkRect2D* toTransform)
-{
+void transform_tohost_VkRect2D(VkDecoderGlobalState* resourceTracker, VkRect2D* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
     transform_tohost_VkOffset2D(resourceTracker, (VkOffset2D*)(&toTransform->offset));
     transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->extent));
 }
 
-void transform_fromhost_VkRect2D(
-    VkDecoderGlobalState* resourceTracker,
-    VkRect2D* toTransform)
-{
+void transform_fromhost_VkRect2D(VkDecoderGlobalState* resourceTracker, VkRect2D* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
     transform_fromhost_VkOffset2D(resourceTracker, (VkOffset2D*)(&toTransform->offset));
     transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->extent));
 }
 
-void transform_tohost_VkBaseInStructure(
-    VkDecoderGlobalState* resourceTracker,
-    VkBaseInStructure* toTransform)
-{
+void transform_tohost_VkBaseInStructure(VkDecoderGlobalState* resourceTracker,
+                                        VkBaseInStructure* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkBaseInStructure(
-    VkDecoderGlobalState* resourceTracker,
-    VkBaseInStructure* toTransform)
-{
+void transform_fromhost_VkBaseInStructure(VkDecoderGlobalState* resourceTracker,
+                                          VkBaseInStructure* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkBaseOutStructure(
-    VkDecoderGlobalState* resourceTracker,
-    VkBaseOutStructure* toTransform)
-{
+void transform_tohost_VkBaseOutStructure(VkDecoderGlobalState* resourceTracker,
+                                         VkBaseOutStructure* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkBaseOutStructure(
-    VkDecoderGlobalState* resourceTracker,
-    VkBaseOutStructure* toTransform)
-{
+void transform_fromhost_VkBaseOutStructure(VkDecoderGlobalState* resourceTracker,
+                                           VkBaseOutStructure* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkBufferMemoryBarrier(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferMemoryBarrier* toTransform)
-{
+void transform_tohost_VkBufferMemoryBarrier(VkDecoderGlobalState* resourceTracker,
+                                            VkBufferMemoryBarrier* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkBufferMemoryBarrier(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferMemoryBarrier* toTransform)
-{
+void transform_fromhost_VkBufferMemoryBarrier(VkDecoderGlobalState* resourceTracker,
+                                              VkBufferMemoryBarrier* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkDispatchIndirectCommand(
-    VkDecoderGlobalState* resourceTracker,
-    VkDispatchIndirectCommand* toTransform)
-{
+void transform_tohost_VkDispatchIndirectCommand(VkDecoderGlobalState* resourceTracker,
+                                                VkDispatchIndirectCommand* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkDispatchIndirectCommand(
-    VkDecoderGlobalState* resourceTracker,
-    VkDispatchIndirectCommand* toTransform)
-{
+void transform_fromhost_VkDispatchIndirectCommand(VkDecoderGlobalState* resourceTracker,
+                                                  VkDispatchIndirectCommand* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkDrawIndexedIndirectCommand(
-    VkDecoderGlobalState* resourceTracker,
-    VkDrawIndexedIndirectCommand* toTransform)
-{
+void transform_tohost_VkDrawIndexedIndirectCommand(VkDecoderGlobalState* resourceTracker,
+                                                   VkDrawIndexedIndirectCommand* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkDrawIndexedIndirectCommand(
-    VkDecoderGlobalState* resourceTracker,
-    VkDrawIndexedIndirectCommand* toTransform)
-{
+void transform_fromhost_VkDrawIndexedIndirectCommand(VkDecoderGlobalState* resourceTracker,
+                                                     VkDrawIndexedIndirectCommand* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkDrawIndirectCommand(
-    VkDecoderGlobalState* resourceTracker,
-    VkDrawIndirectCommand* toTransform)
-{
+void transform_tohost_VkDrawIndirectCommand(VkDecoderGlobalState* resourceTracker,
+                                            VkDrawIndirectCommand* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkDrawIndirectCommand(
-    VkDecoderGlobalState* resourceTracker,
-    VkDrawIndirectCommand* toTransform)
-{
+void transform_fromhost_VkDrawIndirectCommand(VkDecoderGlobalState* resourceTracker,
+                                              VkDrawIndirectCommand* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkImageSubresourceRange(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageSubresourceRange* toTransform)
-{
+void transform_tohost_VkImageSubresourceRange(VkDecoderGlobalState* resourceTracker,
+                                              VkImageSubresourceRange* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkImageSubresourceRange(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageSubresourceRange* toTransform)
-{
+void transform_fromhost_VkImageSubresourceRange(VkDecoderGlobalState* resourceTracker,
+                                                VkImageSubresourceRange* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkImageMemoryBarrier(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageMemoryBarrier* toTransform)
-{
+void transform_tohost_VkImageMemoryBarrier(VkDecoderGlobalState* resourceTracker,
+                                           VkImageMemoryBarrier* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkImageSubresourceRange(resourceTracker, (VkImageSubresourceRange*)(&toTransform->subresourceRange));
+    transform_tohost_VkImageSubresourceRange(
+        resourceTracker, (VkImageSubresourceRange*)(&toTransform->subresourceRange));
 }
 
-void transform_fromhost_VkImageMemoryBarrier(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageMemoryBarrier* toTransform)
-{
+void transform_fromhost_VkImageMemoryBarrier(VkDecoderGlobalState* resourceTracker,
+                                             VkImageMemoryBarrier* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkImageSubresourceRange(resourceTracker, (VkImageSubresourceRange*)(&toTransform->subresourceRange));
+    transform_fromhost_VkImageSubresourceRange(
+        resourceTracker, (VkImageSubresourceRange*)(&toTransform->subresourceRange));
 }
 
-void transform_tohost_VkMemoryBarrier(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryBarrier* toTransform)
-{
+void transform_tohost_VkMemoryBarrier(VkDecoderGlobalState* resourceTracker,
+                                      VkMemoryBarrier* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkMemoryBarrier(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryBarrier* toTransform)
-{
+void transform_fromhost_VkMemoryBarrier(VkDecoderGlobalState* resourceTracker,
+                                        VkMemoryBarrier* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPipelineCacheHeaderVersionOne(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineCacheHeaderVersionOne* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineCacheHeaderVersionOne* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_fromhost_VkPipelineCacheHeaderVersionOne(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineCacheHeaderVersionOne* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineCacheHeaderVersionOne* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkAllocationCallbacks(
-    VkDecoderGlobalState* resourceTracker,
-    VkAllocationCallbacks* toTransform)
-{
+void transform_tohost_VkAllocationCallbacks(VkDecoderGlobalState* resourceTracker,
+                                            VkAllocationCallbacks* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkAllocationCallbacks(
-    VkDecoderGlobalState* resourceTracker,
-    VkAllocationCallbacks* toTransform)
-{
+void transform_fromhost_VkAllocationCallbacks(VkDecoderGlobalState* resourceTracker,
+                                              VkAllocationCallbacks* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkApplicationInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkApplicationInfo* toTransform)
-{
+void transform_tohost_VkApplicationInfo(VkDecoderGlobalState* resourceTracker,
+                                        VkApplicationInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkApplicationInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkApplicationInfo* toTransform)
-{
+void transform_fromhost_VkApplicationInfo(VkDecoderGlobalState* resourceTracker,
+                                          VkApplicationInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkFormatProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkFormatProperties* toTransform)
-{
+void transform_tohost_VkFormatProperties(VkDecoderGlobalState* resourceTracker,
+                                         VkFormatProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkFormatProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkFormatProperties* toTransform)
-{
+void transform_fromhost_VkFormatProperties(VkDecoderGlobalState* resourceTracker,
+                                           VkFormatProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkImageFormatProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageFormatProperties* toTransform)
-{
+void transform_tohost_VkImageFormatProperties(VkDecoderGlobalState* resourceTracker,
+                                              VkImageFormatProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
     transform_tohost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->maxExtent));
 }
 
-void transform_fromhost_VkImageFormatProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageFormatProperties* toTransform)
-{
+void transform_fromhost_VkImageFormatProperties(VkDecoderGlobalState* resourceTracker,
+                                                VkImageFormatProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
     transform_fromhost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->maxExtent));
 }
 
-void transform_tohost_VkInstanceCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkInstanceCreateInfo* toTransform)
-{
+void transform_tohost_VkInstanceCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                           VkInstanceCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pApplicationInfo)
-    {
-        transform_tohost_VkApplicationInfo(resourceTracker, (VkApplicationInfo*)(toTransform->pApplicationInfo));
+    if (toTransform->pApplicationInfo) {
+        transform_tohost_VkApplicationInfo(resourceTracker,
+                                           (VkApplicationInfo*)(toTransform->pApplicationInfo));
     }
 }
 
-void transform_fromhost_VkInstanceCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkInstanceCreateInfo* toTransform)
-{
+void transform_fromhost_VkInstanceCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                             VkInstanceCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pApplicationInfo)
-    {
-        transform_fromhost_VkApplicationInfo(resourceTracker, (VkApplicationInfo*)(toTransform->pApplicationInfo));
+    if (toTransform->pApplicationInfo) {
+        transform_fromhost_VkApplicationInfo(resourceTracker,
+                                             (VkApplicationInfo*)(toTransform->pApplicationInfo));
     }
 }
 
-void transform_tohost_VkMemoryHeap(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryHeap* toTransform)
-{
+void transform_tohost_VkMemoryHeap(VkDecoderGlobalState* resourceTracker,
+                                   VkMemoryHeap* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkMemoryHeap(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryHeap* toTransform)
-{
+void transform_fromhost_VkMemoryHeap(VkDecoderGlobalState* resourceTracker,
+                                     VkMemoryHeap* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkMemoryType(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryType* toTransform)
-{
+void transform_tohost_VkMemoryType(VkDecoderGlobalState* resourceTracker,
+                                   VkMemoryType* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkMemoryType(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryType* toTransform)
-{
+void transform_fromhost_VkMemoryType(VkDecoderGlobalState* resourceTracker,
+                                     VkMemoryType* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkPhysicalDeviceFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceFeatures* toTransform)
-{
+void transform_tohost_VkPhysicalDeviceFeatures(VkDecoderGlobalState* resourceTracker,
+                                               VkPhysicalDeviceFeatures* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkPhysicalDeviceFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceFeatures* toTransform)
-{
+void transform_fromhost_VkPhysicalDeviceFeatures(VkDecoderGlobalState* resourceTracker,
+                                                 VkPhysicalDeviceFeatures* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkPhysicalDeviceLimits(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceLimits* toTransform)
-{
+void transform_tohost_VkPhysicalDeviceLimits(VkDecoderGlobalState* resourceTracker,
+                                             VkPhysicalDeviceLimits* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkPhysicalDeviceLimits(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceLimits* toTransform)
-{
+void transform_fromhost_VkPhysicalDeviceLimits(VkDecoderGlobalState* resourceTracker,
+                                               VkPhysicalDeviceLimits* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_tohost_VkPhysicalDeviceMemoryProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMemoryProperties* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMemoryProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_TYPES; ++i)
-    {
-        transform_tohost_VkMemoryType(resourceTracker, (VkMemoryType*)(toTransform->memoryTypes + i));
+    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_TYPES; ++i) {
+        transform_tohost_VkMemoryType(resourceTracker,
+                                      (VkMemoryType*)(toTransform->memoryTypes + i));
     }
-    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_HEAPS; ++i)
-    {
-        transform_tohost_VkMemoryHeap(resourceTracker, (VkMemoryHeap*)(toTransform->memoryHeaps + i));
+    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_HEAPS; ++i) {
+        transform_tohost_VkMemoryHeap(resourceTracker,
+                                      (VkMemoryHeap*)(toTransform->memoryHeaps + i));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceMemoryProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMemoryProperties* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMemoryProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_TYPES; ++i)
-    {
-        transform_fromhost_VkMemoryType(resourceTracker, (VkMemoryType*)(toTransform->memoryTypes + i));
+    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_TYPES; ++i) {
+        transform_fromhost_VkMemoryType(resourceTracker,
+                                        (VkMemoryType*)(toTransform->memoryTypes + i));
     }
-    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_HEAPS; ++i)
-    {
-        transform_fromhost_VkMemoryHeap(resourceTracker, (VkMemoryHeap*)(toTransform->memoryHeaps + i));
+    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_HEAPS; ++i) {
+        transform_fromhost_VkMemoryHeap(resourceTracker,
+                                        (VkMemoryHeap*)(toTransform->memoryHeaps + i));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceSparseProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceSparseProperties* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceSparseProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_fromhost_VkPhysicalDeviceSparseProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceSparseProperties* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceSparseProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkPhysicalDeviceProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceProperties* toTransform)
-{
+void transform_tohost_VkPhysicalDeviceProperties(VkDecoderGlobalState* resourceTracker,
+                                                 VkPhysicalDeviceProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_tohost_VkPhysicalDeviceLimits(resourceTracker, (VkPhysicalDeviceLimits*)(&toTransform->limits));
-    transform_tohost_VkPhysicalDeviceSparseProperties(resourceTracker, (VkPhysicalDeviceSparseProperties*)(&toTransform->sparseProperties));
+    transform_tohost_VkPhysicalDeviceLimits(resourceTracker,
+                                            (VkPhysicalDeviceLimits*)(&toTransform->limits));
+    transform_tohost_VkPhysicalDeviceSparseProperties(
+        resourceTracker, (VkPhysicalDeviceSparseProperties*)(&toTransform->sparseProperties));
 }
 
-void transform_fromhost_VkPhysicalDeviceProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceProperties* toTransform)
-{
+void transform_fromhost_VkPhysicalDeviceProperties(VkDecoderGlobalState* resourceTracker,
+                                                   VkPhysicalDeviceProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_fromhost_VkPhysicalDeviceLimits(resourceTracker, (VkPhysicalDeviceLimits*)(&toTransform->limits));
-    transform_fromhost_VkPhysicalDeviceSparseProperties(resourceTracker, (VkPhysicalDeviceSparseProperties*)(&toTransform->sparseProperties));
+    transform_fromhost_VkPhysicalDeviceLimits(resourceTracker,
+                                              (VkPhysicalDeviceLimits*)(&toTransform->limits));
+    transform_fromhost_VkPhysicalDeviceSparseProperties(
+        resourceTracker, (VkPhysicalDeviceSparseProperties*)(&toTransform->sparseProperties));
 }
 
-void transform_tohost_VkQueueFamilyProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkQueueFamilyProperties* toTransform)
-{
+void transform_tohost_VkQueueFamilyProperties(VkDecoderGlobalState* resourceTracker,
+                                              VkQueueFamilyProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_tohost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->minImageTransferGranularity));
+    transform_tohost_VkExtent3D(resourceTracker,
+                                (VkExtent3D*)(&toTransform->minImageTransferGranularity));
 }
 
-void transform_fromhost_VkQueueFamilyProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkQueueFamilyProperties* toTransform)
-{
+void transform_fromhost_VkQueueFamilyProperties(VkDecoderGlobalState* resourceTracker,
+                                                VkQueueFamilyProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_fromhost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->minImageTransferGranularity));
+    transform_fromhost_VkExtent3D(resourceTracker,
+                                  (VkExtent3D*)(&toTransform->minImageTransferGranularity));
 }
 
-void transform_tohost_VkDeviceQueueCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceQueueCreateInfo* toTransform)
-{
+void transform_tohost_VkDeviceQueueCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                              VkDeviceQueueCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkDeviceQueueCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceQueueCreateInfo* toTransform)
-{
+void transform_fromhost_VkDeviceQueueCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                VkDeviceQueueCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkDeviceCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceCreateInfo* toTransform)
-{
+void transform_tohost_VkDeviceCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                         VkDeviceCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pQueueCreateInfos)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->queueCreateInfoCount; ++i)
-            {
-                transform_tohost_VkDeviceQueueCreateInfo(resourceTracker, (VkDeviceQueueCreateInfo*)(toTransform->pQueueCreateInfos + i));
+    if (toTransform) {
+        if (toTransform->pQueueCreateInfos) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->queueCreateInfoCount; ++i) {
+                transform_tohost_VkDeviceQueueCreateInfo(
+                    resourceTracker,
+                    (VkDeviceQueueCreateInfo*)(toTransform->pQueueCreateInfos + i));
             }
         }
     }
-    if (toTransform->pEnabledFeatures)
-    {
-        transform_tohost_VkPhysicalDeviceFeatures(resourceTracker, (VkPhysicalDeviceFeatures*)(toTransform->pEnabledFeatures));
+    if (toTransform->pEnabledFeatures) {
+        transform_tohost_VkPhysicalDeviceFeatures(
+            resourceTracker, (VkPhysicalDeviceFeatures*)(toTransform->pEnabledFeatures));
     }
 }
 
-void transform_fromhost_VkDeviceCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceCreateInfo* toTransform)
-{
+void transform_fromhost_VkDeviceCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                           VkDeviceCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pQueueCreateInfos)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->queueCreateInfoCount; ++i)
-            {
-                transform_fromhost_VkDeviceQueueCreateInfo(resourceTracker, (VkDeviceQueueCreateInfo*)(toTransform->pQueueCreateInfos + i));
+    if (toTransform) {
+        if (toTransform->pQueueCreateInfos) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->queueCreateInfoCount; ++i) {
+                transform_fromhost_VkDeviceQueueCreateInfo(
+                    resourceTracker,
+                    (VkDeviceQueueCreateInfo*)(toTransform->pQueueCreateInfos + i));
             }
         }
     }
-    if (toTransform->pEnabledFeatures)
-    {
-        transform_fromhost_VkPhysicalDeviceFeatures(resourceTracker, (VkPhysicalDeviceFeatures*)(toTransform->pEnabledFeatures));
+    if (toTransform->pEnabledFeatures) {
+        transform_fromhost_VkPhysicalDeviceFeatures(
+            resourceTracker, (VkPhysicalDeviceFeatures*)(toTransform->pEnabledFeatures));
     }
 }
 
-void transform_tohost_VkExtensionProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkExtensionProperties* toTransform)
-{
+void transform_tohost_VkExtensionProperties(VkDecoderGlobalState* resourceTracker,
+                                            VkExtensionProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkExtensionProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkExtensionProperties* toTransform)
-{
+void transform_fromhost_VkExtensionProperties(VkDecoderGlobalState* resourceTracker,
+                                              VkExtensionProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkLayerProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkLayerProperties* toTransform)
-{
+void transform_tohost_VkLayerProperties(VkDecoderGlobalState* resourceTracker,
+                                        VkLayerProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkLayerProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkLayerProperties* toTransform)
-{
+void transform_fromhost_VkLayerProperties(VkDecoderGlobalState* resourceTracker,
+                                          VkLayerProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkSubmitInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubmitInfo* toTransform)
-{
+void transform_tohost_VkSubmitInfo(VkDecoderGlobalState* resourceTracker,
+                                   VkSubmitInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkSubmitInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubmitInfo* toTransform)
-{
+void transform_fromhost_VkSubmitInfo(VkDecoderGlobalState* resourceTracker,
+                                     VkSubmitInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkMappedMemoryRange(
-    VkDecoderGlobalState* resourceTracker,
-    VkMappedMemoryRange* toTransform)
-{
+void transform_tohost_VkMappedMemoryRange(VkDecoderGlobalState* resourceTracker,
+                                          VkMappedMemoryRange* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)&toTransform->offset, 1, (VkDeviceSize*)&toTransform->size, 1, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
-    if (toTransform->pNext)
-    {
+    resourceTracker->deviceMemoryTransform_tohost(
+        (VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)&toTransform->offset, 1,
+        (VkDeviceSize*)&toTransform->size, 1, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkMappedMemoryRange(
-    VkDecoderGlobalState* resourceTracker,
-    VkMappedMemoryRange* toTransform)
-{
+void transform_fromhost_VkMappedMemoryRange(VkDecoderGlobalState* resourceTracker,
+                                            VkMappedMemoryRange* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    resourceTracker->deviceMemoryTransform_fromhost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)&toTransform->offset, 1, (VkDeviceSize*)&toTransform->size, 1, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
-    if (toTransform->pNext)
-    {
+    resourceTracker->deviceMemoryTransform_fromhost(
+        (VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)&toTransform->offset, 1,
+        (VkDeviceSize*)&toTransform->size, 1, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkMemoryAllocateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryAllocateInfo* toTransform)
-{
+void transform_tohost_VkMemoryAllocateInfo(VkDecoderGlobalState* resourceTracker,
+                                           VkMemoryAllocateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)&toTransform->memoryTypeIndex, 1, (uint32_t*)nullptr, 0);
-    if (toTransform->pNext)
-    {
+    resourceTracker->deviceMemoryTransform_tohost(
+        (VkDeviceMemory*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0,
+        (uint32_t*)&toTransform->memoryTypeIndex, 1, (uint32_t*)nullptr, 0);
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkMemoryAllocateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryAllocateInfo* toTransform)
-{
+void transform_fromhost_VkMemoryAllocateInfo(VkDecoderGlobalState* resourceTracker,
+                                             VkMemoryAllocateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    resourceTracker->deviceMemoryTransform_fromhost((VkDeviceMemory*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)&toTransform->memoryTypeIndex, 1, (uint32_t*)nullptr, 0);
-    if (toTransform->pNext)
-    {
+    resourceTracker->deviceMemoryTransform_fromhost(
+        (VkDeviceMemory*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0,
+        (uint32_t*)&toTransform->memoryTypeIndex, 1, (uint32_t*)nullptr, 0);
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkMemoryRequirements(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryRequirements* toTransform)
-{
+void transform_tohost_VkMemoryRequirements(VkDecoderGlobalState* resourceTracker,
+                                           VkMemoryRequirements* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)&toTransform->memoryTypeBits, 1);
+    resourceTracker->deviceMemoryTransform_tohost(
+        (VkDeviceMemory*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0,
+        (uint32_t*)nullptr, 0, (uint32_t*)&toTransform->memoryTypeBits, 1);
 }
 
-void transform_fromhost_VkMemoryRequirements(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryRequirements* toTransform)
-{
+void transform_fromhost_VkMemoryRequirements(VkDecoderGlobalState* resourceTracker,
+                                             VkMemoryRequirements* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    resourceTracker->deviceMemoryTransform_fromhost((VkDeviceMemory*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)&toTransform->memoryTypeBits, 1);
+    resourceTracker->deviceMemoryTransform_fromhost(
+        (VkDeviceMemory*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0,
+        (uint32_t*)nullptr, 0, (uint32_t*)&toTransform->memoryTypeBits, 1);
 }
 
-void transform_tohost_VkSparseMemoryBind(
-    VkDecoderGlobalState* resourceTracker,
-    VkSparseMemoryBind* toTransform)
-{
+void transform_tohost_VkSparseMemoryBind(VkDecoderGlobalState* resourceTracker,
+                                         VkSparseMemoryBind* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)&toTransform->memoryOffset, 1, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
+    resourceTracker->deviceMemoryTransform_tohost(
+        (VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)&toTransform->memoryOffset, 1,
+        (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
 }
 
-void transform_fromhost_VkSparseMemoryBind(
-    VkDecoderGlobalState* resourceTracker,
-    VkSparseMemoryBind* toTransform)
-{
+void transform_fromhost_VkSparseMemoryBind(VkDecoderGlobalState* resourceTracker,
+                                           VkSparseMemoryBind* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    resourceTracker->deviceMemoryTransform_fromhost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)&toTransform->memoryOffset, 1, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
+    resourceTracker->deviceMemoryTransform_fromhost(
+        (VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)&toTransform->memoryOffset, 1,
+        (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
 }
 
-void transform_tohost_VkSparseBufferMemoryBindInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSparseBufferMemoryBindInfo* toTransform)
-{
+void transform_tohost_VkSparseBufferMemoryBindInfo(VkDecoderGlobalState* resourceTracker,
+                                                   VkSparseBufferMemoryBindInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform)
-    {
-        if (toTransform->pBinds)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->bindCount; ++i)
-            {
-                transform_tohost_VkSparseMemoryBind(resourceTracker, (VkSparseMemoryBind*)(toTransform->pBinds + i));
+    if (toTransform) {
+        if (toTransform->pBinds) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->bindCount; ++i) {
+                transform_tohost_VkSparseMemoryBind(resourceTracker,
+                                                    (VkSparseMemoryBind*)(toTransform->pBinds + i));
             }
         }
     }
 }
 
-void transform_fromhost_VkSparseBufferMemoryBindInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSparseBufferMemoryBindInfo* toTransform)
-{
+void transform_fromhost_VkSparseBufferMemoryBindInfo(VkDecoderGlobalState* resourceTracker,
+                                                     VkSparseBufferMemoryBindInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform)
-    {
-        if (toTransform->pBinds)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->bindCount; ++i)
-            {
-                transform_fromhost_VkSparseMemoryBind(resourceTracker, (VkSparseMemoryBind*)(toTransform->pBinds + i));
+    if (toTransform) {
+        if (toTransform->pBinds) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->bindCount; ++i) {
+                transform_fromhost_VkSparseMemoryBind(
+                    resourceTracker, (VkSparseMemoryBind*)(toTransform->pBinds + i));
             }
         }
     }
 }
 
 void transform_tohost_VkSparseImageOpaqueMemoryBindInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSparseImageOpaqueMemoryBindInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkSparseImageOpaqueMemoryBindInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform)
-    {
-        if (toTransform->pBinds)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->bindCount; ++i)
-            {
-                transform_tohost_VkSparseMemoryBind(resourceTracker, (VkSparseMemoryBind*)(toTransform->pBinds + i));
+    if (toTransform) {
+        if (toTransform->pBinds) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->bindCount; ++i) {
+                transform_tohost_VkSparseMemoryBind(resourceTracker,
+                                                    (VkSparseMemoryBind*)(toTransform->pBinds + i));
             }
         }
     }
 }
 
 void transform_fromhost_VkSparseImageOpaqueMemoryBindInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSparseImageOpaqueMemoryBindInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkSparseImageOpaqueMemoryBindInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform)
-    {
-        if (toTransform->pBinds)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->bindCount; ++i)
-            {
-                transform_fromhost_VkSparseMemoryBind(resourceTracker, (VkSparseMemoryBind*)(toTransform->pBinds + i));
+    if (toTransform) {
+        if (toTransform->pBinds) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->bindCount; ++i) {
+                transform_fromhost_VkSparseMemoryBind(
+                    resourceTracker, (VkSparseMemoryBind*)(toTransform->pBinds + i));
             }
         }
     }
 }
 
-void transform_tohost_VkImageSubresource(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageSubresource* toTransform)
-{
+void transform_tohost_VkImageSubresource(VkDecoderGlobalState* resourceTracker,
+                                         VkImageSubresource* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkImageSubresource(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageSubresource* toTransform)
-{
+void transform_fromhost_VkImageSubresource(VkDecoderGlobalState* resourceTracker,
+                                           VkImageSubresource* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkSparseImageMemoryBind(
-    VkDecoderGlobalState* resourceTracker,
-    VkSparseImageMemoryBind* toTransform)
-{
+void transform_tohost_VkSparseImageMemoryBind(VkDecoderGlobalState* resourceTracker,
+                                              VkSparseImageMemoryBind* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)&toTransform->memoryOffset, 1, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
-    transform_tohost_VkImageSubresource(resourceTracker, (VkImageSubresource*)(&toTransform->subresource));
+    resourceTracker->deviceMemoryTransform_tohost(
+        (VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)&toTransform->memoryOffset, 1,
+        (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
+    transform_tohost_VkImageSubresource(resourceTracker,
+                                        (VkImageSubresource*)(&toTransform->subresource));
     transform_tohost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->offset));
     transform_tohost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->extent));
 }
 
-void transform_fromhost_VkSparseImageMemoryBind(
-    VkDecoderGlobalState* resourceTracker,
-    VkSparseImageMemoryBind* toTransform)
-{
+void transform_fromhost_VkSparseImageMemoryBind(VkDecoderGlobalState* resourceTracker,
+                                                VkSparseImageMemoryBind* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    resourceTracker->deviceMemoryTransform_fromhost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)&toTransform->memoryOffset, 1, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
-    transform_fromhost_VkImageSubresource(resourceTracker, (VkImageSubresource*)(&toTransform->subresource));
+    resourceTracker->deviceMemoryTransform_fromhost(
+        (VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)&toTransform->memoryOffset, 1,
+        (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
+    transform_fromhost_VkImageSubresource(resourceTracker,
+                                          (VkImageSubresource*)(&toTransform->subresource));
     transform_fromhost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->offset));
     transform_fromhost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->extent));
 }
 
-void transform_tohost_VkSparseImageMemoryBindInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSparseImageMemoryBindInfo* toTransform)
-{
+void transform_tohost_VkSparseImageMemoryBindInfo(VkDecoderGlobalState* resourceTracker,
+                                                  VkSparseImageMemoryBindInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform)
-    {
-        if (toTransform->pBinds)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->bindCount; ++i)
-            {
-                transform_tohost_VkSparseImageMemoryBind(resourceTracker, (VkSparseImageMemoryBind*)(toTransform->pBinds + i));
+    if (toTransform) {
+        if (toTransform->pBinds) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->bindCount; ++i) {
+                transform_tohost_VkSparseImageMemoryBind(
+                    resourceTracker, (VkSparseImageMemoryBind*)(toTransform->pBinds + i));
             }
         }
     }
 }
 
-void transform_fromhost_VkSparseImageMemoryBindInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSparseImageMemoryBindInfo* toTransform)
-{
+void transform_fromhost_VkSparseImageMemoryBindInfo(VkDecoderGlobalState* resourceTracker,
+                                                    VkSparseImageMemoryBindInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform)
-    {
-        if (toTransform->pBinds)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->bindCount; ++i)
-            {
-                transform_fromhost_VkSparseImageMemoryBind(resourceTracker, (VkSparseImageMemoryBind*)(toTransform->pBinds + i));
+    if (toTransform) {
+        if (toTransform->pBinds) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->bindCount; ++i) {
+                transform_fromhost_VkSparseImageMemoryBind(
+                    resourceTracker, (VkSparseImageMemoryBind*)(toTransform->pBinds + i));
             }
         }
     }
 }
 
-void transform_tohost_VkBindSparseInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindSparseInfo* toTransform)
-{
+void transform_tohost_VkBindSparseInfo(VkDecoderGlobalState* resourceTracker,
+                                       VkBindSparseInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pBufferBinds)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->bufferBindCount; ++i)
-            {
-                transform_tohost_VkSparseBufferMemoryBindInfo(resourceTracker, (VkSparseBufferMemoryBindInfo*)(toTransform->pBufferBinds + i));
+    if (toTransform) {
+        if (toTransform->pBufferBinds) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->bufferBindCount; ++i) {
+                transform_tohost_VkSparseBufferMemoryBindInfo(
+                    resourceTracker,
+                    (VkSparseBufferMemoryBindInfo*)(toTransform->pBufferBinds + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pImageOpaqueBinds)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->imageOpaqueBindCount; ++i)
-            {
-                transform_tohost_VkSparseImageOpaqueMemoryBindInfo(resourceTracker, (VkSparseImageOpaqueMemoryBindInfo*)(toTransform->pImageOpaqueBinds + i));
+    if (toTransform) {
+        if (toTransform->pImageOpaqueBinds) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->imageOpaqueBindCount; ++i) {
+                transform_tohost_VkSparseImageOpaqueMemoryBindInfo(
+                    resourceTracker,
+                    (VkSparseImageOpaqueMemoryBindInfo*)(toTransform->pImageOpaqueBinds + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pImageBinds)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->imageBindCount; ++i)
-            {
-                transform_tohost_VkSparseImageMemoryBindInfo(resourceTracker, (VkSparseImageMemoryBindInfo*)(toTransform->pImageBinds + i));
+    if (toTransform) {
+        if (toTransform->pImageBinds) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->imageBindCount; ++i) {
+                transform_tohost_VkSparseImageMemoryBindInfo(
+                    resourceTracker, (VkSparseImageMemoryBindInfo*)(toTransform->pImageBinds + i));
             }
         }
     }
 }
 
-void transform_fromhost_VkBindSparseInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindSparseInfo* toTransform)
-{
+void transform_fromhost_VkBindSparseInfo(VkDecoderGlobalState* resourceTracker,
+                                         VkBindSparseInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pBufferBinds)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->bufferBindCount; ++i)
-            {
-                transform_fromhost_VkSparseBufferMemoryBindInfo(resourceTracker, (VkSparseBufferMemoryBindInfo*)(toTransform->pBufferBinds + i));
+    if (toTransform) {
+        if (toTransform->pBufferBinds) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->bufferBindCount; ++i) {
+                transform_fromhost_VkSparseBufferMemoryBindInfo(
+                    resourceTracker,
+                    (VkSparseBufferMemoryBindInfo*)(toTransform->pBufferBinds + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pImageOpaqueBinds)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->imageOpaqueBindCount; ++i)
-            {
-                transform_fromhost_VkSparseImageOpaqueMemoryBindInfo(resourceTracker, (VkSparseImageOpaqueMemoryBindInfo*)(toTransform->pImageOpaqueBinds + i));
+    if (toTransform) {
+        if (toTransform->pImageOpaqueBinds) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->imageOpaqueBindCount; ++i) {
+                transform_fromhost_VkSparseImageOpaqueMemoryBindInfo(
+                    resourceTracker,
+                    (VkSparseImageOpaqueMemoryBindInfo*)(toTransform->pImageOpaqueBinds + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pImageBinds)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->imageBindCount; ++i)
-            {
-                transform_fromhost_VkSparseImageMemoryBindInfo(resourceTracker, (VkSparseImageMemoryBindInfo*)(toTransform->pImageBinds + i));
+    if (toTransform) {
+        if (toTransform->pImageBinds) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->imageBindCount; ++i) {
+                transform_fromhost_VkSparseImageMemoryBindInfo(
+                    resourceTracker, (VkSparseImageMemoryBindInfo*)(toTransform->pImageBinds + i));
             }
         }
     }
 }
 
-void transform_tohost_VkSparseImageFormatProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkSparseImageFormatProperties* toTransform)
-{
+void transform_tohost_VkSparseImageFormatProperties(VkDecoderGlobalState* resourceTracker,
+                                                    VkSparseImageFormatProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
     transform_tohost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->imageGranularity));
 }
 
-void transform_fromhost_VkSparseImageFormatProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkSparseImageFormatProperties* toTransform)
-{
+void transform_fromhost_VkSparseImageFormatProperties(VkDecoderGlobalState* resourceTracker,
+                                                      VkSparseImageFormatProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
     transform_fromhost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->imageGranularity));
 }
 
 void transform_tohost_VkSparseImageMemoryRequirements(
-    VkDecoderGlobalState* resourceTracker,
-    VkSparseImageMemoryRequirements* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkSparseImageMemoryRequirements* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_tohost_VkSparseImageFormatProperties(resourceTracker, (VkSparseImageFormatProperties*)(&toTransform->formatProperties));
+    transform_tohost_VkSparseImageFormatProperties(
+        resourceTracker, (VkSparseImageFormatProperties*)(&toTransform->formatProperties));
 }
 
 void transform_fromhost_VkSparseImageMemoryRequirements(
-    VkDecoderGlobalState* resourceTracker,
-    VkSparseImageMemoryRequirements* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkSparseImageMemoryRequirements* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_fromhost_VkSparseImageFormatProperties(resourceTracker, (VkSparseImageFormatProperties*)(&toTransform->formatProperties));
+    transform_fromhost_VkSparseImageFormatProperties(
+        resourceTracker, (VkSparseImageFormatProperties*)(&toTransform->formatProperties));
 }
 
-void transform_tohost_VkFenceCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkFenceCreateInfo* toTransform)
-{
+void transform_tohost_VkFenceCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                        VkFenceCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkFenceCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkFenceCreateInfo* toTransform)
-{
+void transform_fromhost_VkFenceCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                          VkFenceCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkSemaphoreCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSemaphoreCreateInfo* toTransform)
-{
+void transform_tohost_VkSemaphoreCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                            VkSemaphoreCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkSemaphoreCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSemaphoreCreateInfo* toTransform)
-{
+void transform_fromhost_VkSemaphoreCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                              VkSemaphoreCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkEventCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkEventCreateInfo* toTransform)
-{
+void transform_tohost_VkEventCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                        VkEventCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkEventCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkEventCreateInfo* toTransform)
-{
+void transform_fromhost_VkEventCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                          VkEventCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkQueryPoolCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkQueryPoolCreateInfo* toTransform)
-{
+void transform_tohost_VkQueryPoolCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                            VkQueryPoolCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkQueryPoolCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkQueryPoolCreateInfo* toTransform)
-{
+void transform_fromhost_VkQueryPoolCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                              VkQueryPoolCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkBufferCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferCreateInfo* toTransform)
-{
+void transform_tohost_VkBufferCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                         VkBufferCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkBufferCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferCreateInfo* toTransform)
-{
+void transform_fromhost_VkBufferCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                           VkBufferCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkBufferViewCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferViewCreateInfo* toTransform)
-{
+void transform_tohost_VkBufferViewCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                             VkBufferViewCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkBufferViewCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferViewCreateInfo* toTransform)
-{
+void transform_fromhost_VkBufferViewCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                               VkBufferViewCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkImageCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageCreateInfo* toTransform)
-{
+void transform_tohost_VkImageCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                        VkImageCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
     transform_tohost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->extent));
 }
 
-void transform_fromhost_VkImageCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageCreateInfo* toTransform)
-{
+void transform_fromhost_VkImageCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                          VkImageCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
     transform_fromhost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->extent));
 }
 
-void transform_tohost_VkSubresourceLayout(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubresourceLayout* toTransform)
-{
+void transform_tohost_VkSubresourceLayout(VkDecoderGlobalState* resourceTracker,
+                                          VkSubresourceLayout* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkSubresourceLayout(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubresourceLayout* toTransform)
-{
+void transform_fromhost_VkSubresourceLayout(VkDecoderGlobalState* resourceTracker,
+                                            VkSubresourceLayout* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkComponentMapping(
-    VkDecoderGlobalState* resourceTracker,
-    VkComponentMapping* toTransform)
-{
+void transform_tohost_VkComponentMapping(VkDecoderGlobalState* resourceTracker,
+                                         VkComponentMapping* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkComponentMapping(
-    VkDecoderGlobalState* resourceTracker,
-    VkComponentMapping* toTransform)
-{
+void transform_fromhost_VkComponentMapping(VkDecoderGlobalState* resourceTracker,
+                                           VkComponentMapping* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkImageViewCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageViewCreateInfo* toTransform)
-{
+void transform_tohost_VkImageViewCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                            VkImageViewCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkComponentMapping(resourceTracker, (VkComponentMapping*)(&toTransform->components));
-    transform_tohost_VkImageSubresourceRange(resourceTracker, (VkImageSubresourceRange*)(&toTransform->subresourceRange));
+    transform_tohost_VkComponentMapping(resourceTracker,
+                                        (VkComponentMapping*)(&toTransform->components));
+    transform_tohost_VkImageSubresourceRange(
+        resourceTracker, (VkImageSubresourceRange*)(&toTransform->subresourceRange));
 }
 
-void transform_fromhost_VkImageViewCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageViewCreateInfo* toTransform)
-{
+void transform_fromhost_VkImageViewCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                              VkImageViewCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkComponentMapping(resourceTracker, (VkComponentMapping*)(&toTransform->components));
-    transform_fromhost_VkImageSubresourceRange(resourceTracker, (VkImageSubresourceRange*)(&toTransform->subresourceRange));
+    transform_fromhost_VkComponentMapping(resourceTracker,
+                                          (VkComponentMapping*)(&toTransform->components));
+    transform_fromhost_VkImageSubresourceRange(
+        resourceTracker, (VkImageSubresourceRange*)(&toTransform->subresourceRange));
 }
 
-void transform_tohost_VkShaderModuleCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkShaderModuleCreateInfo* toTransform)
-{
+void transform_tohost_VkShaderModuleCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                               VkShaderModuleCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkShaderModuleCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkShaderModuleCreateInfo* toTransform)
-{
+void transform_fromhost_VkShaderModuleCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                 VkShaderModuleCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkPipelineCacheCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineCacheCreateInfo* toTransform)
-{
+void transform_tohost_VkPipelineCacheCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                VkPipelineCacheCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkPipelineCacheCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineCacheCreateInfo* toTransform)
-{
+void transform_fromhost_VkPipelineCacheCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                  VkPipelineCacheCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkSpecializationMapEntry(
-    VkDecoderGlobalState* resourceTracker,
-    VkSpecializationMapEntry* toTransform)
-{
+void transform_tohost_VkSpecializationMapEntry(VkDecoderGlobalState* resourceTracker,
+                                               VkSpecializationMapEntry* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkSpecializationMapEntry(
-    VkDecoderGlobalState* resourceTracker,
-    VkSpecializationMapEntry* toTransform)
-{
+void transform_fromhost_VkSpecializationMapEntry(VkDecoderGlobalState* resourceTracker,
+                                                 VkSpecializationMapEntry* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkSpecializationInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSpecializationInfo* toTransform)
-{
+void transform_tohost_VkSpecializationInfo(VkDecoderGlobalState* resourceTracker,
+                                           VkSpecializationInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform)
-    {
-        if (toTransform->pMapEntries)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->mapEntryCount; ++i)
-            {
-                transform_tohost_VkSpecializationMapEntry(resourceTracker, (VkSpecializationMapEntry*)(toTransform->pMapEntries + i));
+    if (toTransform) {
+        if (toTransform->pMapEntries) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->mapEntryCount; ++i) {
+                transform_tohost_VkSpecializationMapEntry(
+                    resourceTracker, (VkSpecializationMapEntry*)(toTransform->pMapEntries + i));
             }
         }
     }
 }
 
-void transform_fromhost_VkSpecializationInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSpecializationInfo* toTransform)
-{
+void transform_fromhost_VkSpecializationInfo(VkDecoderGlobalState* resourceTracker,
+                                             VkSpecializationInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform)
-    {
-        if (toTransform->pMapEntries)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->mapEntryCount; ++i)
-            {
-                transform_fromhost_VkSpecializationMapEntry(resourceTracker, (VkSpecializationMapEntry*)(toTransform->pMapEntries + i));
+    if (toTransform) {
+        if (toTransform->pMapEntries) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->mapEntryCount; ++i) {
+                transform_fromhost_VkSpecializationMapEntry(
+                    resourceTracker, (VkSpecializationMapEntry*)(toTransform->pMapEntries + i));
             }
         }
     }
 }
 
 void transform_tohost_VkPipelineShaderStageCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineShaderStageCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineShaderStageCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pSpecializationInfo)
-    {
-        transform_tohost_VkSpecializationInfo(resourceTracker, (VkSpecializationInfo*)(toTransform->pSpecializationInfo));
+    if (toTransform->pSpecializationInfo) {
+        transform_tohost_VkSpecializationInfo(
+            resourceTracker, (VkSpecializationInfo*)(toTransform->pSpecializationInfo));
     }
 }
 
 void transform_fromhost_VkPipelineShaderStageCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineShaderStageCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineShaderStageCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pSpecializationInfo)
-    {
-        transform_fromhost_VkSpecializationInfo(resourceTracker, (VkSpecializationInfo*)(toTransform->pSpecializationInfo));
+    if (toTransform->pSpecializationInfo) {
+        transform_fromhost_VkSpecializationInfo(
+            resourceTracker, (VkSpecializationInfo*)(toTransform->pSpecializationInfo));
     }
 }
 
-void transform_tohost_VkComputePipelineCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkComputePipelineCreateInfo* toTransform)
-{
+void transform_tohost_VkComputePipelineCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                  VkComputePipelineCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkPipelineShaderStageCreateInfo(resourceTracker, (VkPipelineShaderStageCreateInfo*)(&toTransform->stage));
+    transform_tohost_VkPipelineShaderStageCreateInfo(
+        resourceTracker, (VkPipelineShaderStageCreateInfo*)(&toTransform->stage));
 }
 
-void transform_fromhost_VkComputePipelineCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkComputePipelineCreateInfo* toTransform)
-{
+void transform_fromhost_VkComputePipelineCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                    VkComputePipelineCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkPipelineShaderStageCreateInfo(resourceTracker, (VkPipelineShaderStageCreateInfo*)(&toTransform->stage));
+    transform_fromhost_VkPipelineShaderStageCreateInfo(
+        resourceTracker, (VkPipelineShaderStageCreateInfo*)(&toTransform->stage));
 }
 
 void transform_tohost_VkVertexInputBindingDescription(
-    VkDecoderGlobalState* resourceTracker,
-    VkVertexInputBindingDescription* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVertexInputBindingDescription* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_fromhost_VkVertexInputBindingDescription(
-    VkDecoderGlobalState* resourceTracker,
-    VkVertexInputBindingDescription* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVertexInputBindingDescription* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_tohost_VkVertexInputAttributeDescription(
-    VkDecoderGlobalState* resourceTracker,
-    VkVertexInputAttributeDescription* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVertexInputAttributeDescription* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_fromhost_VkVertexInputAttributeDescription(
-    VkDecoderGlobalState* resourceTracker,
-    VkVertexInputAttributeDescription* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVertexInputAttributeDescription* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_tohost_VkPipelineVertexInputStateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineVertexInputStateCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineVertexInputStateCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pVertexBindingDescriptions)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->vertexBindingDescriptionCount; ++i)
-            {
-                transform_tohost_VkVertexInputBindingDescription(resourceTracker, (VkVertexInputBindingDescription*)(toTransform->pVertexBindingDescriptions + i));
+    if (toTransform) {
+        if (toTransform->pVertexBindingDescriptions) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->vertexBindingDescriptionCount; ++i) {
+                transform_tohost_VkVertexInputBindingDescription(
+                    resourceTracker,
+                    (VkVertexInputBindingDescription*)(toTransform->pVertexBindingDescriptions +
+                                                       i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pVertexAttributeDescriptions)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->vertexAttributeDescriptionCount; ++i)
-            {
-                transform_tohost_VkVertexInputAttributeDescription(resourceTracker, (VkVertexInputAttributeDescription*)(toTransform->pVertexAttributeDescriptions + i));
+    if (toTransform) {
+        if (toTransform->pVertexAttributeDescriptions) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->vertexAttributeDescriptionCount; ++i) {
+                transform_tohost_VkVertexInputAttributeDescription(
+                    resourceTracker,
+                    (VkVertexInputAttributeDescription*)(toTransform->pVertexAttributeDescriptions +
+                                                         i));
             }
         }
     }
 }
 
 void transform_fromhost_VkPipelineVertexInputStateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineVertexInputStateCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineVertexInputStateCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pVertexBindingDescriptions)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->vertexBindingDescriptionCount; ++i)
-            {
-                transform_fromhost_VkVertexInputBindingDescription(resourceTracker, (VkVertexInputBindingDescription*)(toTransform->pVertexBindingDescriptions + i));
+    if (toTransform) {
+        if (toTransform->pVertexBindingDescriptions) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->vertexBindingDescriptionCount; ++i) {
+                transform_fromhost_VkVertexInputBindingDescription(
+                    resourceTracker,
+                    (VkVertexInputBindingDescription*)(toTransform->pVertexBindingDescriptions +
+                                                       i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pVertexAttributeDescriptions)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->vertexAttributeDescriptionCount; ++i)
-            {
-                transform_fromhost_VkVertexInputAttributeDescription(resourceTracker, (VkVertexInputAttributeDescription*)(toTransform->pVertexAttributeDescriptions + i));
+    if (toTransform) {
+        if (toTransform->pVertexAttributeDescriptions) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->vertexAttributeDescriptionCount; ++i) {
+                transform_fromhost_VkVertexInputAttributeDescription(
+                    resourceTracker,
+                    (VkVertexInputAttributeDescription*)(toTransform->pVertexAttributeDescriptions +
+                                                         i));
             }
         }
     }
 }
 
 void transform_tohost_VkPipelineInputAssemblyStateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineInputAssemblyStateCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineInputAssemblyStateCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPipelineInputAssemblyStateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineInputAssemblyStateCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineInputAssemblyStateCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPipelineTessellationStateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineTessellationStateCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineTessellationStateCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPipelineTessellationStateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineTessellationStateCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineTessellationStateCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkViewport(
-    VkDecoderGlobalState* resourceTracker,
-    VkViewport* toTransform)
-{
+void transform_tohost_VkViewport(VkDecoderGlobalState* resourceTracker, VkViewport* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkViewport(
-    VkDecoderGlobalState* resourceTracker,
-    VkViewport* toTransform)
-{
+void transform_fromhost_VkViewport(VkDecoderGlobalState* resourceTracker, VkViewport* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_tohost_VkPipelineViewportStateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineViewportStateCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineViewportStateCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pViewports)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->viewportCount; ++i)
-            {
-                transform_tohost_VkViewport(resourceTracker, (VkViewport*)(toTransform->pViewports + i));
+    if (toTransform) {
+        if (toTransform->pViewports) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->viewportCount; ++i) {
+                transform_tohost_VkViewport(resourceTracker,
+                                            (VkViewport*)(toTransform->pViewports + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pScissors)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->scissorCount; ++i)
-            {
+    if (toTransform) {
+        if (toTransform->pScissors) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->scissorCount; ++i) {
                 transform_tohost_VkRect2D(resourceTracker, (VkRect2D*)(toTransform->pScissors + i));
             }
         }
@@ -1651,109 +1321,83 @@
 }
 
 void transform_fromhost_VkPipelineViewportStateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineViewportStateCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineViewportStateCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pViewports)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->viewportCount; ++i)
-            {
-                transform_fromhost_VkViewport(resourceTracker, (VkViewport*)(toTransform->pViewports + i));
+    if (toTransform) {
+        if (toTransform->pViewports) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->viewportCount; ++i) {
+                transform_fromhost_VkViewport(resourceTracker,
+                                              (VkViewport*)(toTransform->pViewports + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pScissors)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->scissorCount; ++i)
-            {
-                transform_fromhost_VkRect2D(resourceTracker, (VkRect2D*)(toTransform->pScissors + i));
+    if (toTransform) {
+        if (toTransform->pScissors) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->scissorCount; ++i) {
+                transform_fromhost_VkRect2D(resourceTracker,
+                                            (VkRect2D*)(toTransform->pScissors + i));
             }
         }
     }
 }
 
 void transform_tohost_VkPipelineRasterizationStateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineRasterizationStateCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineRasterizationStateCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPipelineRasterizationStateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineRasterizationStateCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineRasterizationStateCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPipelineMultisampleStateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineMultisampleStateCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineMultisampleStateCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPipelineMultisampleStateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineMultisampleStateCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineMultisampleStateCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkStencilOpState(
-    VkDecoderGlobalState* resourceTracker,
-    VkStencilOpState* toTransform)
-{
+void transform_tohost_VkStencilOpState(VkDecoderGlobalState* resourceTracker,
+                                       VkStencilOpState* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkStencilOpState(
-    VkDecoderGlobalState* resourceTracker,
-    VkStencilOpState* toTransform)
-{
+void transform_fromhost_VkStencilOpState(VkDecoderGlobalState* resourceTracker,
+                                         VkStencilOpState* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_tohost_VkPipelineDepthStencilStateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineDepthStencilStateCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineDepthStencilStateCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
     transform_tohost_VkStencilOpState(resourceTracker, (VkStencilOpState*)(&toTransform->front));
@@ -1761,13 +1405,10 @@
 }
 
 void transform_fromhost_VkPipelineDepthStencilStateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineDepthStencilStateCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineDepthStencilStateCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
     transform_fromhost_VkStencilOpState(resourceTracker, (VkStencilOpState*)(&toTransform->front));
@@ -1775,1168 +1416,952 @@
 }
 
 void transform_tohost_VkPipelineColorBlendAttachmentState(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineColorBlendAttachmentState* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineColorBlendAttachmentState* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_fromhost_VkPipelineColorBlendAttachmentState(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineColorBlendAttachmentState* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineColorBlendAttachmentState* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_tohost_VkPipelineColorBlendStateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineColorBlendStateCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineColorBlendStateCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pAttachments)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->attachmentCount; ++i)
-            {
-                transform_tohost_VkPipelineColorBlendAttachmentState(resourceTracker, (VkPipelineColorBlendAttachmentState*)(toTransform->pAttachments + i));
+    if (toTransform) {
+        if (toTransform->pAttachments) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->attachmentCount; ++i) {
+                transform_tohost_VkPipelineColorBlendAttachmentState(
+                    resourceTracker,
+                    (VkPipelineColorBlendAttachmentState*)(toTransform->pAttachments + i));
             }
         }
     }
 }
 
 void transform_fromhost_VkPipelineColorBlendStateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineColorBlendStateCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineColorBlendStateCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pAttachments)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->attachmentCount; ++i)
-            {
-                transform_fromhost_VkPipelineColorBlendAttachmentState(resourceTracker, (VkPipelineColorBlendAttachmentState*)(toTransform->pAttachments + i));
+    if (toTransform) {
+        if (toTransform->pAttachments) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->attachmentCount; ++i) {
+                transform_fromhost_VkPipelineColorBlendAttachmentState(
+                    resourceTracker,
+                    (VkPipelineColorBlendAttachmentState*)(toTransform->pAttachments + i));
             }
         }
     }
 }
 
 void transform_tohost_VkPipelineDynamicStateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineDynamicStateCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineDynamicStateCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPipelineDynamicStateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineDynamicStateCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineDynamicStateCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkGraphicsPipelineCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkGraphicsPipelineCreateInfo* toTransform)
-{
+void transform_tohost_VkGraphicsPipelineCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                   VkGraphicsPipelineCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pStages)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->stageCount; ++i)
-            {
-                transform_tohost_VkPipelineShaderStageCreateInfo(resourceTracker, (VkPipelineShaderStageCreateInfo*)(toTransform->pStages + i));
+    if (toTransform) {
+        if (toTransform->pStages) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->stageCount; ++i) {
+                transform_tohost_VkPipelineShaderStageCreateInfo(
+                    resourceTracker, (VkPipelineShaderStageCreateInfo*)(toTransform->pStages + i));
             }
         }
     }
-    if (toTransform->pVertexInputState)
-    {
-        transform_tohost_VkPipelineVertexInputStateCreateInfo(resourceTracker, (VkPipelineVertexInputStateCreateInfo*)(toTransform->pVertexInputState));
+    if (toTransform->pVertexInputState) {
+        transform_tohost_VkPipelineVertexInputStateCreateInfo(
+            resourceTracker,
+            (VkPipelineVertexInputStateCreateInfo*)(toTransform->pVertexInputState));
     }
-    if (toTransform->pInputAssemblyState)
-    {
-        transform_tohost_VkPipelineInputAssemblyStateCreateInfo(resourceTracker, (VkPipelineInputAssemblyStateCreateInfo*)(toTransform->pInputAssemblyState));
+    if (toTransform->pInputAssemblyState) {
+        transform_tohost_VkPipelineInputAssemblyStateCreateInfo(
+            resourceTracker,
+            (VkPipelineInputAssemblyStateCreateInfo*)(toTransform->pInputAssemblyState));
     }
-    if (toTransform->pTessellationState)
-    {
-        transform_tohost_VkPipelineTessellationStateCreateInfo(resourceTracker, (VkPipelineTessellationStateCreateInfo*)(toTransform->pTessellationState));
+    if (toTransform->pTessellationState) {
+        transform_tohost_VkPipelineTessellationStateCreateInfo(
+            resourceTracker,
+            (VkPipelineTessellationStateCreateInfo*)(toTransform->pTessellationState));
     }
-    if (toTransform->pViewportState)
-    {
-        transform_tohost_VkPipelineViewportStateCreateInfo(resourceTracker, (VkPipelineViewportStateCreateInfo*)(toTransform->pViewportState));
+    if (toTransform->pViewportState) {
+        transform_tohost_VkPipelineViewportStateCreateInfo(
+            resourceTracker, (VkPipelineViewportStateCreateInfo*)(toTransform->pViewportState));
     }
-    if (toTransform->pRasterizationState)
-    {
-        transform_tohost_VkPipelineRasterizationStateCreateInfo(resourceTracker, (VkPipelineRasterizationStateCreateInfo*)(toTransform->pRasterizationState));
+    if (toTransform->pRasterizationState) {
+        transform_tohost_VkPipelineRasterizationStateCreateInfo(
+            resourceTracker,
+            (VkPipelineRasterizationStateCreateInfo*)(toTransform->pRasterizationState));
     }
-    if (toTransform->pMultisampleState)
-    {
-        transform_tohost_VkPipelineMultisampleStateCreateInfo(resourceTracker, (VkPipelineMultisampleStateCreateInfo*)(toTransform->pMultisampleState));
+    if (toTransform->pMultisampleState) {
+        transform_tohost_VkPipelineMultisampleStateCreateInfo(
+            resourceTracker,
+            (VkPipelineMultisampleStateCreateInfo*)(toTransform->pMultisampleState));
     }
-    if (toTransform->pDepthStencilState)
-    {
-        transform_tohost_VkPipelineDepthStencilStateCreateInfo(resourceTracker, (VkPipelineDepthStencilStateCreateInfo*)(toTransform->pDepthStencilState));
+    if (toTransform->pDepthStencilState) {
+        transform_tohost_VkPipelineDepthStencilStateCreateInfo(
+            resourceTracker,
+            (VkPipelineDepthStencilStateCreateInfo*)(toTransform->pDepthStencilState));
     }
-    if (toTransform->pColorBlendState)
-    {
-        transform_tohost_VkPipelineColorBlendStateCreateInfo(resourceTracker, (VkPipelineColorBlendStateCreateInfo*)(toTransform->pColorBlendState));
+    if (toTransform->pColorBlendState) {
+        transform_tohost_VkPipelineColorBlendStateCreateInfo(
+            resourceTracker, (VkPipelineColorBlendStateCreateInfo*)(toTransform->pColorBlendState));
     }
-    if (toTransform->pDynamicState)
-    {
-        transform_tohost_VkPipelineDynamicStateCreateInfo(resourceTracker, (VkPipelineDynamicStateCreateInfo*)(toTransform->pDynamicState));
+    if (toTransform->pDynamicState) {
+        transform_tohost_VkPipelineDynamicStateCreateInfo(
+            resourceTracker, (VkPipelineDynamicStateCreateInfo*)(toTransform->pDynamicState));
     }
 }
 
-void transform_fromhost_VkGraphicsPipelineCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkGraphicsPipelineCreateInfo* toTransform)
-{
+void transform_fromhost_VkGraphicsPipelineCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                     VkGraphicsPipelineCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pStages)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->stageCount; ++i)
-            {
-                transform_fromhost_VkPipelineShaderStageCreateInfo(resourceTracker, (VkPipelineShaderStageCreateInfo*)(toTransform->pStages + i));
+    if (toTransform) {
+        if (toTransform->pStages) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->stageCount; ++i) {
+                transform_fromhost_VkPipelineShaderStageCreateInfo(
+                    resourceTracker, (VkPipelineShaderStageCreateInfo*)(toTransform->pStages + i));
             }
         }
     }
-    if (toTransform->pVertexInputState)
-    {
-        transform_fromhost_VkPipelineVertexInputStateCreateInfo(resourceTracker, (VkPipelineVertexInputStateCreateInfo*)(toTransform->pVertexInputState));
+    if (toTransform->pVertexInputState) {
+        transform_fromhost_VkPipelineVertexInputStateCreateInfo(
+            resourceTracker,
+            (VkPipelineVertexInputStateCreateInfo*)(toTransform->pVertexInputState));
     }
-    if (toTransform->pInputAssemblyState)
-    {
-        transform_fromhost_VkPipelineInputAssemblyStateCreateInfo(resourceTracker, (VkPipelineInputAssemblyStateCreateInfo*)(toTransform->pInputAssemblyState));
+    if (toTransform->pInputAssemblyState) {
+        transform_fromhost_VkPipelineInputAssemblyStateCreateInfo(
+            resourceTracker,
+            (VkPipelineInputAssemblyStateCreateInfo*)(toTransform->pInputAssemblyState));
     }
-    if (toTransform->pTessellationState)
-    {
-        transform_fromhost_VkPipelineTessellationStateCreateInfo(resourceTracker, (VkPipelineTessellationStateCreateInfo*)(toTransform->pTessellationState));
+    if (toTransform->pTessellationState) {
+        transform_fromhost_VkPipelineTessellationStateCreateInfo(
+            resourceTracker,
+            (VkPipelineTessellationStateCreateInfo*)(toTransform->pTessellationState));
     }
-    if (toTransform->pViewportState)
-    {
-        transform_fromhost_VkPipelineViewportStateCreateInfo(resourceTracker, (VkPipelineViewportStateCreateInfo*)(toTransform->pViewportState));
+    if (toTransform->pViewportState) {
+        transform_fromhost_VkPipelineViewportStateCreateInfo(
+            resourceTracker, (VkPipelineViewportStateCreateInfo*)(toTransform->pViewportState));
     }
-    if (toTransform->pRasterizationState)
-    {
-        transform_fromhost_VkPipelineRasterizationStateCreateInfo(resourceTracker, (VkPipelineRasterizationStateCreateInfo*)(toTransform->pRasterizationState));
+    if (toTransform->pRasterizationState) {
+        transform_fromhost_VkPipelineRasterizationStateCreateInfo(
+            resourceTracker,
+            (VkPipelineRasterizationStateCreateInfo*)(toTransform->pRasterizationState));
     }
-    if (toTransform->pMultisampleState)
-    {
-        transform_fromhost_VkPipelineMultisampleStateCreateInfo(resourceTracker, (VkPipelineMultisampleStateCreateInfo*)(toTransform->pMultisampleState));
+    if (toTransform->pMultisampleState) {
+        transform_fromhost_VkPipelineMultisampleStateCreateInfo(
+            resourceTracker,
+            (VkPipelineMultisampleStateCreateInfo*)(toTransform->pMultisampleState));
     }
-    if (toTransform->pDepthStencilState)
-    {
-        transform_fromhost_VkPipelineDepthStencilStateCreateInfo(resourceTracker, (VkPipelineDepthStencilStateCreateInfo*)(toTransform->pDepthStencilState));
+    if (toTransform->pDepthStencilState) {
+        transform_fromhost_VkPipelineDepthStencilStateCreateInfo(
+            resourceTracker,
+            (VkPipelineDepthStencilStateCreateInfo*)(toTransform->pDepthStencilState));
     }
-    if (toTransform->pColorBlendState)
-    {
-        transform_fromhost_VkPipelineColorBlendStateCreateInfo(resourceTracker, (VkPipelineColorBlendStateCreateInfo*)(toTransform->pColorBlendState));
+    if (toTransform->pColorBlendState) {
+        transform_fromhost_VkPipelineColorBlendStateCreateInfo(
+            resourceTracker, (VkPipelineColorBlendStateCreateInfo*)(toTransform->pColorBlendState));
     }
-    if (toTransform->pDynamicState)
-    {
-        transform_fromhost_VkPipelineDynamicStateCreateInfo(resourceTracker, (VkPipelineDynamicStateCreateInfo*)(toTransform->pDynamicState));
+    if (toTransform->pDynamicState) {
+        transform_fromhost_VkPipelineDynamicStateCreateInfo(
+            resourceTracker, (VkPipelineDynamicStateCreateInfo*)(toTransform->pDynamicState));
     }
 }
 
-void transform_tohost_VkPushConstantRange(
-    VkDecoderGlobalState* resourceTracker,
-    VkPushConstantRange* toTransform)
-{
+void transform_tohost_VkPushConstantRange(VkDecoderGlobalState* resourceTracker,
+                                          VkPushConstantRange* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkPushConstantRange(
-    VkDecoderGlobalState* resourceTracker,
-    VkPushConstantRange* toTransform)
-{
+void transform_fromhost_VkPushConstantRange(VkDecoderGlobalState* resourceTracker,
+                                            VkPushConstantRange* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkPipelineLayoutCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineLayoutCreateInfo* toTransform)
-{
+void transform_tohost_VkPipelineLayoutCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                 VkPipelineLayoutCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pPushConstantRanges)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->pushConstantRangeCount; ++i)
-            {
-                transform_tohost_VkPushConstantRange(resourceTracker, (VkPushConstantRange*)(toTransform->pPushConstantRanges + i));
+    if (toTransform) {
+        if (toTransform->pPushConstantRanges) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->pushConstantRangeCount; ++i) {
+                transform_tohost_VkPushConstantRange(
+                    resourceTracker, (VkPushConstantRange*)(toTransform->pPushConstantRanges + i));
             }
         }
     }
 }
 
-void transform_fromhost_VkPipelineLayoutCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineLayoutCreateInfo* toTransform)
-{
+void transform_fromhost_VkPipelineLayoutCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                   VkPipelineLayoutCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pPushConstantRanges)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->pushConstantRangeCount; ++i)
-            {
-                transform_fromhost_VkPushConstantRange(resourceTracker, (VkPushConstantRange*)(toTransform->pPushConstantRanges + i));
+    if (toTransform) {
+        if (toTransform->pPushConstantRanges) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->pushConstantRangeCount; ++i) {
+                transform_fromhost_VkPushConstantRange(
+                    resourceTracker, (VkPushConstantRange*)(toTransform->pPushConstantRanges + i));
             }
         }
     }
 }
 
-void transform_tohost_VkSamplerCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSamplerCreateInfo* toTransform)
-{
+void transform_tohost_VkSamplerCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                          VkSamplerCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkSamplerCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSamplerCreateInfo* toTransform)
-{
+void transform_fromhost_VkSamplerCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                            VkSamplerCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkCopyDescriptorSet(
-    VkDecoderGlobalState* resourceTracker,
-    VkCopyDescriptorSet* toTransform)
-{
+void transform_tohost_VkCopyDescriptorSet(VkDecoderGlobalState* resourceTracker,
+                                          VkCopyDescriptorSet* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkCopyDescriptorSet(
-    VkDecoderGlobalState* resourceTracker,
-    VkCopyDescriptorSet* toTransform)
-{
+void transform_fromhost_VkCopyDescriptorSet(VkDecoderGlobalState* resourceTracker,
+                                            VkCopyDescriptorSet* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkDescriptorBufferInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorBufferInfo* toTransform)
-{
+void transform_tohost_VkDescriptorBufferInfo(VkDecoderGlobalState* resourceTracker,
+                                             VkDescriptorBufferInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkDescriptorBufferInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorBufferInfo* toTransform)
-{
+void transform_fromhost_VkDescriptorBufferInfo(VkDecoderGlobalState* resourceTracker,
+                                               VkDescriptorBufferInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkDescriptorImageInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorImageInfo* toTransform)
-{
+void transform_tohost_VkDescriptorImageInfo(VkDecoderGlobalState* resourceTracker,
+                                            VkDescriptorImageInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkDescriptorImageInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorImageInfo* toTransform)
-{
+void transform_fromhost_VkDescriptorImageInfo(VkDecoderGlobalState* resourceTracker,
+                                              VkDescriptorImageInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkDescriptorPoolSize(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorPoolSize* toTransform)
-{
+void transform_tohost_VkDescriptorPoolSize(VkDecoderGlobalState* resourceTracker,
+                                           VkDescriptorPoolSize* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkDescriptorPoolSize(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorPoolSize* toTransform)
-{
+void transform_fromhost_VkDescriptorPoolSize(VkDecoderGlobalState* resourceTracker,
+                                             VkDescriptorPoolSize* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkDescriptorPoolCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorPoolCreateInfo* toTransform)
-{
+void transform_tohost_VkDescriptorPoolCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                 VkDescriptorPoolCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pPoolSizes)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->poolSizeCount; ++i)
-            {
-                transform_tohost_VkDescriptorPoolSize(resourceTracker, (VkDescriptorPoolSize*)(toTransform->pPoolSizes + i));
+    if (toTransform) {
+        if (toTransform->pPoolSizes) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->poolSizeCount; ++i) {
+                transform_tohost_VkDescriptorPoolSize(
+                    resourceTracker, (VkDescriptorPoolSize*)(toTransform->pPoolSizes + i));
             }
         }
     }
 }
 
-void transform_fromhost_VkDescriptorPoolCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorPoolCreateInfo* toTransform)
-{
+void transform_fromhost_VkDescriptorPoolCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                   VkDescriptorPoolCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pPoolSizes)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->poolSizeCount; ++i)
-            {
-                transform_fromhost_VkDescriptorPoolSize(resourceTracker, (VkDescriptorPoolSize*)(toTransform->pPoolSizes + i));
+    if (toTransform) {
+        if (toTransform->pPoolSizes) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->poolSizeCount; ++i) {
+                transform_fromhost_VkDescriptorPoolSize(
+                    resourceTracker, (VkDescriptorPoolSize*)(toTransform->pPoolSizes + i));
             }
         }
     }
 }
 
-void transform_tohost_VkDescriptorSetAllocateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorSetAllocateInfo* toTransform)
-{
+void transform_tohost_VkDescriptorSetAllocateInfo(VkDecoderGlobalState* resourceTracker,
+                                                  VkDescriptorSetAllocateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkDescriptorSetAllocateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorSetAllocateInfo* toTransform)
-{
+void transform_fromhost_VkDescriptorSetAllocateInfo(VkDecoderGlobalState* resourceTracker,
+                                                    VkDescriptorSetAllocateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkDescriptorSetLayoutBinding(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorSetLayoutBinding* toTransform)
-{
+void transform_tohost_VkDescriptorSetLayoutBinding(VkDecoderGlobalState* resourceTracker,
+                                                   VkDescriptorSetLayoutBinding* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkDescriptorSetLayoutBinding(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorSetLayoutBinding* toTransform)
-{
+void transform_fromhost_VkDescriptorSetLayoutBinding(VkDecoderGlobalState* resourceTracker,
+                                                     VkDescriptorSetLayoutBinding* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_tohost_VkDescriptorSetLayoutCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorSetLayoutCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDescriptorSetLayoutCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pBindings)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->bindingCount; ++i)
-            {
-                transform_tohost_VkDescriptorSetLayoutBinding(resourceTracker, (VkDescriptorSetLayoutBinding*)(toTransform->pBindings + i));
+    if (toTransform) {
+        if (toTransform->pBindings) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->bindingCount; ++i) {
+                transform_tohost_VkDescriptorSetLayoutBinding(
+                    resourceTracker, (VkDescriptorSetLayoutBinding*)(toTransform->pBindings + i));
             }
         }
     }
 }
 
 void transform_fromhost_VkDescriptorSetLayoutCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorSetLayoutCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDescriptorSetLayoutCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pBindings)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->bindingCount; ++i)
-            {
-                transform_fromhost_VkDescriptorSetLayoutBinding(resourceTracker, (VkDescriptorSetLayoutBinding*)(toTransform->pBindings + i));
+    if (toTransform) {
+        if (toTransform->pBindings) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->bindingCount; ++i) {
+                transform_fromhost_VkDescriptorSetLayoutBinding(
+                    resourceTracker, (VkDescriptorSetLayoutBinding*)(toTransform->pBindings + i));
             }
         }
     }
 }
 
-void transform_tohost_VkWriteDescriptorSet(
-    VkDecoderGlobalState* resourceTracker,
-    VkWriteDescriptorSet* toTransform)
-{
+void transform_tohost_VkWriteDescriptorSet(VkDecoderGlobalState* resourceTracker,
+                                           VkWriteDescriptorSet* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pImageInfo)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->descriptorCount; ++i)
-            {
-                transform_tohost_VkDescriptorImageInfo(resourceTracker, (VkDescriptorImageInfo*)(toTransform->pImageInfo + i));
+    if (toTransform) {
+        if (toTransform->pImageInfo) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->descriptorCount; ++i) {
+                transform_tohost_VkDescriptorImageInfo(
+                    resourceTracker, (VkDescriptorImageInfo*)(toTransform->pImageInfo + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pBufferInfo)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->descriptorCount; ++i)
-            {
-                transform_tohost_VkDescriptorBufferInfo(resourceTracker, (VkDescriptorBufferInfo*)(toTransform->pBufferInfo + i));
+    if (toTransform) {
+        if (toTransform->pBufferInfo) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->descriptorCount; ++i) {
+                transform_tohost_VkDescriptorBufferInfo(
+                    resourceTracker, (VkDescriptorBufferInfo*)(toTransform->pBufferInfo + i));
             }
         }
     }
 }
 
-void transform_fromhost_VkWriteDescriptorSet(
-    VkDecoderGlobalState* resourceTracker,
-    VkWriteDescriptorSet* toTransform)
-{
+void transform_fromhost_VkWriteDescriptorSet(VkDecoderGlobalState* resourceTracker,
+                                             VkWriteDescriptorSet* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pImageInfo)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->descriptorCount; ++i)
-            {
-                transform_fromhost_VkDescriptorImageInfo(resourceTracker, (VkDescriptorImageInfo*)(toTransform->pImageInfo + i));
+    if (toTransform) {
+        if (toTransform->pImageInfo) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->descriptorCount; ++i) {
+                transform_fromhost_VkDescriptorImageInfo(
+                    resourceTracker, (VkDescriptorImageInfo*)(toTransform->pImageInfo + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pBufferInfo)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->descriptorCount; ++i)
-            {
-                transform_fromhost_VkDescriptorBufferInfo(resourceTracker, (VkDescriptorBufferInfo*)(toTransform->pBufferInfo + i));
+    if (toTransform) {
+        if (toTransform->pBufferInfo) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->descriptorCount; ++i) {
+                transform_fromhost_VkDescriptorBufferInfo(
+                    resourceTracker, (VkDescriptorBufferInfo*)(toTransform->pBufferInfo + i));
             }
         }
     }
 }
 
-void transform_tohost_VkAttachmentDescription(
-    VkDecoderGlobalState* resourceTracker,
-    VkAttachmentDescription* toTransform)
-{
+void transform_tohost_VkAttachmentDescription(VkDecoderGlobalState* resourceTracker,
+                                              VkAttachmentDescription* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkAttachmentDescription(
-    VkDecoderGlobalState* resourceTracker,
-    VkAttachmentDescription* toTransform)
-{
+void transform_fromhost_VkAttachmentDescription(VkDecoderGlobalState* resourceTracker,
+                                                VkAttachmentDescription* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkAttachmentReference(
-    VkDecoderGlobalState* resourceTracker,
-    VkAttachmentReference* toTransform)
-{
+void transform_tohost_VkAttachmentReference(VkDecoderGlobalState* resourceTracker,
+                                            VkAttachmentReference* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkAttachmentReference(
-    VkDecoderGlobalState* resourceTracker,
-    VkAttachmentReference* toTransform)
-{
+void transform_fromhost_VkAttachmentReference(VkDecoderGlobalState* resourceTracker,
+                                              VkAttachmentReference* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkFramebufferCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkFramebufferCreateInfo* toTransform)
-{
+void transform_tohost_VkFramebufferCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                              VkFramebufferCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkFramebufferCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkFramebufferCreateInfo* toTransform)
-{
+void transform_fromhost_VkFramebufferCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                VkFramebufferCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkSubpassDescription(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubpassDescription* toTransform)
-{
+void transform_tohost_VkSubpassDescription(VkDecoderGlobalState* resourceTracker,
+                                           VkSubpassDescription* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform)
-    {
-        if (toTransform->pInputAttachments)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->inputAttachmentCount; ++i)
-            {
-                transform_tohost_VkAttachmentReference(resourceTracker, (VkAttachmentReference*)(toTransform->pInputAttachments + i));
+    if (toTransform) {
+        if (toTransform->pInputAttachments) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->inputAttachmentCount; ++i) {
+                transform_tohost_VkAttachmentReference(
+                    resourceTracker, (VkAttachmentReference*)(toTransform->pInputAttachments + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pColorAttachments)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->colorAttachmentCount; ++i)
-            {
-                transform_tohost_VkAttachmentReference(resourceTracker, (VkAttachmentReference*)(toTransform->pColorAttachments + i));
+    if (toTransform) {
+        if (toTransform->pColorAttachments) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->colorAttachmentCount; ++i) {
+                transform_tohost_VkAttachmentReference(
+                    resourceTracker, (VkAttachmentReference*)(toTransform->pColorAttachments + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pResolveAttachments)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->colorAttachmentCount; ++i)
-            {
-                transform_tohost_VkAttachmentReference(resourceTracker, (VkAttachmentReference*)(toTransform->pResolveAttachments + i));
+    if (toTransform) {
+        if (toTransform->pResolveAttachments) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->colorAttachmentCount; ++i) {
+                transform_tohost_VkAttachmentReference(
+                    resourceTracker,
+                    (VkAttachmentReference*)(toTransform->pResolveAttachments + i));
             }
         }
     }
-    if (toTransform->pDepthStencilAttachment)
-    {
-        transform_tohost_VkAttachmentReference(resourceTracker, (VkAttachmentReference*)(toTransform->pDepthStencilAttachment));
+    if (toTransform->pDepthStencilAttachment) {
+        transform_tohost_VkAttachmentReference(
+            resourceTracker, (VkAttachmentReference*)(toTransform->pDepthStencilAttachment));
     }
 }
 
-void transform_fromhost_VkSubpassDescription(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubpassDescription* toTransform)
-{
+void transform_fromhost_VkSubpassDescription(VkDecoderGlobalState* resourceTracker,
+                                             VkSubpassDescription* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform)
-    {
-        if (toTransform->pInputAttachments)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->inputAttachmentCount; ++i)
-            {
-                transform_fromhost_VkAttachmentReference(resourceTracker, (VkAttachmentReference*)(toTransform->pInputAttachments + i));
+    if (toTransform) {
+        if (toTransform->pInputAttachments) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->inputAttachmentCount; ++i) {
+                transform_fromhost_VkAttachmentReference(
+                    resourceTracker, (VkAttachmentReference*)(toTransform->pInputAttachments + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pColorAttachments)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->colorAttachmentCount; ++i)
-            {
-                transform_fromhost_VkAttachmentReference(resourceTracker, (VkAttachmentReference*)(toTransform->pColorAttachments + i));
+    if (toTransform) {
+        if (toTransform->pColorAttachments) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->colorAttachmentCount; ++i) {
+                transform_fromhost_VkAttachmentReference(
+                    resourceTracker, (VkAttachmentReference*)(toTransform->pColorAttachments + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pResolveAttachments)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->colorAttachmentCount; ++i)
-            {
-                transform_fromhost_VkAttachmentReference(resourceTracker, (VkAttachmentReference*)(toTransform->pResolveAttachments + i));
+    if (toTransform) {
+        if (toTransform->pResolveAttachments) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->colorAttachmentCount; ++i) {
+                transform_fromhost_VkAttachmentReference(
+                    resourceTracker,
+                    (VkAttachmentReference*)(toTransform->pResolveAttachments + i));
             }
         }
     }
-    if (toTransform->pDepthStencilAttachment)
-    {
-        transform_fromhost_VkAttachmentReference(resourceTracker, (VkAttachmentReference*)(toTransform->pDepthStencilAttachment));
+    if (toTransform->pDepthStencilAttachment) {
+        transform_fromhost_VkAttachmentReference(
+            resourceTracker, (VkAttachmentReference*)(toTransform->pDepthStencilAttachment));
     }
 }
 
-void transform_tohost_VkSubpassDependency(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubpassDependency* toTransform)
-{
+void transform_tohost_VkSubpassDependency(VkDecoderGlobalState* resourceTracker,
+                                          VkSubpassDependency* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkSubpassDependency(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubpassDependency* toTransform)
-{
+void transform_fromhost_VkSubpassDependency(VkDecoderGlobalState* resourceTracker,
+                                            VkSubpassDependency* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkRenderPassCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkRenderPassCreateInfo* toTransform)
-{
+void transform_tohost_VkRenderPassCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                             VkRenderPassCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pAttachments)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->attachmentCount; ++i)
-            {
-                transform_tohost_VkAttachmentDescription(resourceTracker, (VkAttachmentDescription*)(toTransform->pAttachments + i));
+    if (toTransform) {
+        if (toTransform->pAttachments) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->attachmentCount; ++i) {
+                transform_tohost_VkAttachmentDescription(
+                    resourceTracker, (VkAttachmentDescription*)(toTransform->pAttachments + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pSubpasses)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->subpassCount; ++i)
-            {
-                transform_tohost_VkSubpassDescription(resourceTracker, (VkSubpassDescription*)(toTransform->pSubpasses + i));
+    if (toTransform) {
+        if (toTransform->pSubpasses) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->subpassCount; ++i) {
+                transform_tohost_VkSubpassDescription(
+                    resourceTracker, (VkSubpassDescription*)(toTransform->pSubpasses + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pDependencies)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->dependencyCount; ++i)
-            {
-                transform_tohost_VkSubpassDependency(resourceTracker, (VkSubpassDependency*)(toTransform->pDependencies + i));
+    if (toTransform) {
+        if (toTransform->pDependencies) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->dependencyCount; ++i) {
+                transform_tohost_VkSubpassDependency(
+                    resourceTracker, (VkSubpassDependency*)(toTransform->pDependencies + i));
             }
         }
     }
 }
 
-void transform_fromhost_VkRenderPassCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkRenderPassCreateInfo* toTransform)
-{
+void transform_fromhost_VkRenderPassCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                               VkRenderPassCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pAttachments)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->attachmentCount; ++i)
-            {
-                transform_fromhost_VkAttachmentDescription(resourceTracker, (VkAttachmentDescription*)(toTransform->pAttachments + i));
+    if (toTransform) {
+        if (toTransform->pAttachments) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->attachmentCount; ++i) {
+                transform_fromhost_VkAttachmentDescription(
+                    resourceTracker, (VkAttachmentDescription*)(toTransform->pAttachments + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pSubpasses)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->subpassCount; ++i)
-            {
-                transform_fromhost_VkSubpassDescription(resourceTracker, (VkSubpassDescription*)(toTransform->pSubpasses + i));
+    if (toTransform) {
+        if (toTransform->pSubpasses) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->subpassCount; ++i) {
+                transform_fromhost_VkSubpassDescription(
+                    resourceTracker, (VkSubpassDescription*)(toTransform->pSubpasses + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pDependencies)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->dependencyCount; ++i)
-            {
-                transform_fromhost_VkSubpassDependency(resourceTracker, (VkSubpassDependency*)(toTransform->pDependencies + i));
+    if (toTransform) {
+        if (toTransform->pDependencies) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->dependencyCount; ++i) {
+                transform_fromhost_VkSubpassDependency(
+                    resourceTracker, (VkSubpassDependency*)(toTransform->pDependencies + i));
             }
         }
     }
 }
 
-void transform_tohost_VkCommandPoolCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkCommandPoolCreateInfo* toTransform)
-{
+void transform_tohost_VkCommandPoolCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                              VkCommandPoolCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkCommandPoolCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkCommandPoolCreateInfo* toTransform)
-{
+void transform_fromhost_VkCommandPoolCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                VkCommandPoolCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkCommandBufferAllocateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkCommandBufferAllocateInfo* toTransform)
-{
+void transform_tohost_VkCommandBufferAllocateInfo(VkDecoderGlobalState* resourceTracker,
+                                                  VkCommandBufferAllocateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkCommandBufferAllocateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkCommandBufferAllocateInfo* toTransform)
-{
+void transform_fromhost_VkCommandBufferAllocateInfo(VkDecoderGlobalState* resourceTracker,
+                                                    VkCommandBufferAllocateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkCommandBufferInheritanceInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkCommandBufferInheritanceInfo* toTransform)
-{
+void transform_tohost_VkCommandBufferInheritanceInfo(VkDecoderGlobalState* resourceTracker,
+                                                     VkCommandBufferInheritanceInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkCommandBufferInheritanceInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkCommandBufferInheritanceInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkCommandBufferInheritanceInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkCommandBufferBeginInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkCommandBufferBeginInfo* toTransform)
-{
+void transform_tohost_VkCommandBufferBeginInfo(VkDecoderGlobalState* resourceTracker,
+                                               VkCommandBufferBeginInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pInheritanceInfo)
-    {
-        transform_tohost_VkCommandBufferInheritanceInfo(resourceTracker, (VkCommandBufferInheritanceInfo*)(toTransform->pInheritanceInfo));
+    if (toTransform->pInheritanceInfo) {
+        transform_tohost_VkCommandBufferInheritanceInfo(
+            resourceTracker, (VkCommandBufferInheritanceInfo*)(toTransform->pInheritanceInfo));
     }
 }
 
-void transform_fromhost_VkCommandBufferBeginInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkCommandBufferBeginInfo* toTransform)
-{
+void transform_fromhost_VkCommandBufferBeginInfo(VkDecoderGlobalState* resourceTracker,
+                                                 VkCommandBufferBeginInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pInheritanceInfo)
-    {
-        transform_fromhost_VkCommandBufferInheritanceInfo(resourceTracker, (VkCommandBufferInheritanceInfo*)(toTransform->pInheritanceInfo));
+    if (toTransform->pInheritanceInfo) {
+        transform_fromhost_VkCommandBufferInheritanceInfo(
+            resourceTracker, (VkCommandBufferInheritanceInfo*)(toTransform->pInheritanceInfo));
     }
 }
 
-void transform_tohost_VkBufferCopy(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferCopy* toTransform)
-{
+void transform_tohost_VkBufferCopy(VkDecoderGlobalState* resourceTracker,
+                                   VkBufferCopy* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkBufferCopy(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferCopy* toTransform)
-{
+void transform_fromhost_VkBufferCopy(VkDecoderGlobalState* resourceTracker,
+                                     VkBufferCopy* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkImageSubresourceLayers(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageSubresourceLayers* toTransform)
-{
+void transform_tohost_VkImageSubresourceLayers(VkDecoderGlobalState* resourceTracker,
+                                               VkImageSubresourceLayers* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkImageSubresourceLayers(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageSubresourceLayers* toTransform)
-{
+void transform_fromhost_VkImageSubresourceLayers(VkDecoderGlobalState* resourceTracker,
+                                                 VkImageSubresourceLayers* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkBufferImageCopy(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferImageCopy* toTransform)
-{
+void transform_tohost_VkBufferImageCopy(VkDecoderGlobalState* resourceTracker,
+                                        VkBufferImageCopy* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_tohost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->imageSubresource));
+    transform_tohost_VkImageSubresourceLayers(
+        resourceTracker, (VkImageSubresourceLayers*)(&toTransform->imageSubresource));
     transform_tohost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->imageOffset));
     transform_tohost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->imageExtent));
 }
 
-void transform_fromhost_VkBufferImageCopy(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferImageCopy* toTransform)
-{
+void transform_fromhost_VkBufferImageCopy(VkDecoderGlobalState* resourceTracker,
+                                          VkBufferImageCopy* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_fromhost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->imageSubresource));
+    transform_fromhost_VkImageSubresourceLayers(
+        resourceTracker, (VkImageSubresourceLayers*)(&toTransform->imageSubresource));
     transform_fromhost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->imageOffset));
     transform_fromhost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->imageExtent));
 }
 
-void transform_tohost_VkClearColorValue(
-    VkDecoderGlobalState* resourceTracker,
-    VkClearColorValue* toTransform)
-{
+void transform_tohost_VkClearColorValue(VkDecoderGlobalState* resourceTracker,
+                                        VkClearColorValue* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkClearColorValue(
-    VkDecoderGlobalState* resourceTracker,
-    VkClearColorValue* toTransform)
-{
+void transform_fromhost_VkClearColorValue(VkDecoderGlobalState* resourceTracker,
+                                          VkClearColorValue* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkClearDepthStencilValue(
-    VkDecoderGlobalState* resourceTracker,
-    VkClearDepthStencilValue* toTransform)
-{
+void transform_tohost_VkClearDepthStencilValue(VkDecoderGlobalState* resourceTracker,
+                                               VkClearDepthStencilValue* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkClearDepthStencilValue(
-    VkDecoderGlobalState* resourceTracker,
-    VkClearDepthStencilValue* toTransform)
-{
+void transform_fromhost_VkClearDepthStencilValue(VkDecoderGlobalState* resourceTracker,
+                                                 VkClearDepthStencilValue* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkClearValue(
-    VkDecoderGlobalState* resourceTracker,
-    VkClearValue* toTransform)
-{
+void transform_tohost_VkClearValue(VkDecoderGlobalState* resourceTracker,
+                                   VkClearValue* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
     transform_tohost_VkClearColorValue(resourceTracker, (VkClearColorValue*)(&toTransform->color));
-    transform_tohost_VkClearDepthStencilValue(resourceTracker, (VkClearDepthStencilValue*)(&toTransform->depthStencil));
+    transform_tohost_VkClearDepthStencilValue(
+        resourceTracker, (VkClearDepthStencilValue*)(&toTransform->depthStencil));
 }
 
-void transform_fromhost_VkClearValue(
-    VkDecoderGlobalState* resourceTracker,
-    VkClearValue* toTransform)
-{
+void transform_fromhost_VkClearValue(VkDecoderGlobalState* resourceTracker,
+                                     VkClearValue* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_fromhost_VkClearColorValue(resourceTracker, (VkClearColorValue*)(&toTransform->color));
-    transform_fromhost_VkClearDepthStencilValue(resourceTracker, (VkClearDepthStencilValue*)(&toTransform->depthStencil));
+    transform_fromhost_VkClearColorValue(resourceTracker,
+                                         (VkClearColorValue*)(&toTransform->color));
+    transform_fromhost_VkClearDepthStencilValue(
+        resourceTracker, (VkClearDepthStencilValue*)(&toTransform->depthStencil));
 }
 
-void transform_tohost_VkClearAttachment(
-    VkDecoderGlobalState* resourceTracker,
-    VkClearAttachment* toTransform)
-{
+void transform_tohost_VkClearAttachment(VkDecoderGlobalState* resourceTracker,
+                                        VkClearAttachment* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
     transform_tohost_VkClearValue(resourceTracker, (VkClearValue*)(&toTransform->clearValue));
 }
 
-void transform_fromhost_VkClearAttachment(
-    VkDecoderGlobalState* resourceTracker,
-    VkClearAttachment* toTransform)
-{
+void transform_fromhost_VkClearAttachment(VkDecoderGlobalState* resourceTracker,
+                                          VkClearAttachment* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
     transform_fromhost_VkClearValue(resourceTracker, (VkClearValue*)(&toTransform->clearValue));
 }
 
-void transform_tohost_VkClearRect(
-    VkDecoderGlobalState* resourceTracker,
-    VkClearRect* toTransform)
-{
+void transform_tohost_VkClearRect(VkDecoderGlobalState* resourceTracker, VkClearRect* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
     transform_tohost_VkRect2D(resourceTracker, (VkRect2D*)(&toTransform->rect));
 }
 
-void transform_fromhost_VkClearRect(
-    VkDecoderGlobalState* resourceTracker,
-    VkClearRect* toTransform)
-{
+void transform_fromhost_VkClearRect(VkDecoderGlobalState* resourceTracker,
+                                    VkClearRect* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
     transform_fromhost_VkRect2D(resourceTracker, (VkRect2D*)(&toTransform->rect));
 }
 
-void transform_tohost_VkImageBlit(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageBlit* toTransform)
-{
+void transform_tohost_VkImageBlit(VkDecoderGlobalState* resourceTracker, VkImageBlit* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_tohost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->srcSubresource));
-    for (uint32_t i = 0; i < (uint32_t)2; ++i)
-    {
+    transform_tohost_VkImageSubresourceLayers(
+        resourceTracker, (VkImageSubresourceLayers*)(&toTransform->srcSubresource));
+    for (uint32_t i = 0; i < (uint32_t)2; ++i) {
         transform_tohost_VkOffset3D(resourceTracker, (VkOffset3D*)(toTransform->srcOffsets + i));
     }
-    transform_tohost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->dstSubresource));
-    for (uint32_t i = 0; i < (uint32_t)2; ++i)
-    {
+    transform_tohost_VkImageSubresourceLayers(
+        resourceTracker, (VkImageSubresourceLayers*)(&toTransform->dstSubresource));
+    for (uint32_t i = 0; i < (uint32_t)2; ++i) {
         transform_tohost_VkOffset3D(resourceTracker, (VkOffset3D*)(toTransform->dstOffsets + i));
     }
 }
 
-void transform_fromhost_VkImageBlit(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageBlit* toTransform)
-{
+void transform_fromhost_VkImageBlit(VkDecoderGlobalState* resourceTracker,
+                                    VkImageBlit* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_fromhost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->srcSubresource));
-    for (uint32_t i = 0; i < (uint32_t)2; ++i)
-    {
+    transform_fromhost_VkImageSubresourceLayers(
+        resourceTracker, (VkImageSubresourceLayers*)(&toTransform->srcSubresource));
+    for (uint32_t i = 0; i < (uint32_t)2; ++i) {
         transform_fromhost_VkOffset3D(resourceTracker, (VkOffset3D*)(toTransform->srcOffsets + i));
     }
-    transform_fromhost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->dstSubresource));
-    for (uint32_t i = 0; i < (uint32_t)2; ++i)
-    {
+    transform_fromhost_VkImageSubresourceLayers(
+        resourceTracker, (VkImageSubresourceLayers*)(&toTransform->dstSubresource));
+    for (uint32_t i = 0; i < (uint32_t)2; ++i) {
         transform_fromhost_VkOffset3D(resourceTracker, (VkOffset3D*)(toTransform->dstOffsets + i));
     }
 }
 
-void transform_tohost_VkImageCopy(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageCopy* toTransform)
-{
+void transform_tohost_VkImageCopy(VkDecoderGlobalState* resourceTracker, VkImageCopy* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_tohost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->srcSubresource));
+    transform_tohost_VkImageSubresourceLayers(
+        resourceTracker, (VkImageSubresourceLayers*)(&toTransform->srcSubresource));
     transform_tohost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->srcOffset));
-    transform_tohost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->dstSubresource));
+    transform_tohost_VkImageSubresourceLayers(
+        resourceTracker, (VkImageSubresourceLayers*)(&toTransform->dstSubresource));
     transform_tohost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->dstOffset));
     transform_tohost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->extent));
 }
 
-void transform_fromhost_VkImageCopy(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageCopy* toTransform)
-{
+void transform_fromhost_VkImageCopy(VkDecoderGlobalState* resourceTracker,
+                                    VkImageCopy* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_fromhost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->srcSubresource));
+    transform_fromhost_VkImageSubresourceLayers(
+        resourceTracker, (VkImageSubresourceLayers*)(&toTransform->srcSubresource));
     transform_fromhost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->srcOffset));
-    transform_fromhost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->dstSubresource));
+    transform_fromhost_VkImageSubresourceLayers(
+        resourceTracker, (VkImageSubresourceLayers*)(&toTransform->dstSubresource));
     transform_fromhost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->dstOffset));
     transform_fromhost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->extent));
 }
 
-void transform_tohost_VkImageResolve(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageResolve* toTransform)
-{
+void transform_tohost_VkImageResolve(VkDecoderGlobalState* resourceTracker,
+                                     VkImageResolve* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_tohost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->srcSubresource));
+    transform_tohost_VkImageSubresourceLayers(
+        resourceTracker, (VkImageSubresourceLayers*)(&toTransform->srcSubresource));
     transform_tohost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->srcOffset));
-    transform_tohost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->dstSubresource));
+    transform_tohost_VkImageSubresourceLayers(
+        resourceTracker, (VkImageSubresourceLayers*)(&toTransform->dstSubresource));
     transform_tohost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->dstOffset));
     transform_tohost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->extent));
 }
 
-void transform_fromhost_VkImageResolve(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageResolve* toTransform)
-{
+void transform_fromhost_VkImageResolve(VkDecoderGlobalState* resourceTracker,
+                                       VkImageResolve* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_fromhost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->srcSubresource));
+    transform_fromhost_VkImageSubresourceLayers(
+        resourceTracker, (VkImageSubresourceLayers*)(&toTransform->srcSubresource));
     transform_fromhost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->srcOffset));
-    transform_fromhost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->dstSubresource));
+    transform_fromhost_VkImageSubresourceLayers(
+        resourceTracker, (VkImageSubresourceLayers*)(&toTransform->dstSubresource));
     transform_fromhost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->dstOffset));
     transform_fromhost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->extent));
 }
 
-void transform_tohost_VkRenderPassBeginInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkRenderPassBeginInfo* toTransform)
-{
+void transform_tohost_VkRenderPassBeginInfo(VkDecoderGlobalState* resourceTracker,
+                                            VkRenderPassBeginInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
     transform_tohost_VkRect2D(resourceTracker, (VkRect2D*)(&toTransform->renderArea));
-    if (toTransform)
-    {
-        if (toTransform->pClearValues)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->clearValueCount; ++i)
-            {
-                transform_tohost_VkClearValue(resourceTracker, (VkClearValue*)(toTransform->pClearValues + i));
+    if (toTransform) {
+        if (toTransform->pClearValues) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->clearValueCount; ++i) {
+                transform_tohost_VkClearValue(resourceTracker,
+                                              (VkClearValue*)(toTransform->pClearValues + i));
             }
         }
     }
 }
 
-void transform_fromhost_VkRenderPassBeginInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkRenderPassBeginInfo* toTransform)
-{
+void transform_fromhost_VkRenderPassBeginInfo(VkDecoderGlobalState* resourceTracker,
+                                              VkRenderPassBeginInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
     transform_fromhost_VkRect2D(resourceTracker, (VkRect2D*)(&toTransform->renderArea));
-    if (toTransform)
-    {
-        if (toTransform->pClearValues)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->clearValueCount; ++i)
-            {
-                transform_fromhost_VkClearValue(resourceTracker, (VkClearValue*)(toTransform->pClearValues + i));
+    if (toTransform) {
+        if (toTransform->pClearValues) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->clearValueCount; ++i) {
+                transform_fromhost_VkClearValue(resourceTracker,
+                                                (VkClearValue*)(toTransform->pClearValues + i));
             }
         }
     }
@@ -2945,820 +2370,651 @@
 #endif
 #ifdef VK_VERSION_1_1
 void transform_tohost_VkPhysicalDeviceSubgroupProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceSubgroupProperties* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceSubgroupProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceSubgroupProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceSubgroupProperties* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceSubgroupProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkBindBufferMemoryInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindBufferMemoryInfo* toTransform)
-{
+void transform_tohost_VkBindBufferMemoryInfo(VkDecoderGlobalState* resourceTracker,
+                                             VkBindBufferMemoryInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)&toTransform->memoryOffset, 1, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
-    if (toTransform->pNext)
-    {
+    resourceTracker->deviceMemoryTransform_tohost(
+        (VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)&toTransform->memoryOffset, 1,
+        (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkBindBufferMemoryInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindBufferMemoryInfo* toTransform)
-{
+void transform_fromhost_VkBindBufferMemoryInfo(VkDecoderGlobalState* resourceTracker,
+                                               VkBindBufferMemoryInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    resourceTracker->deviceMemoryTransform_fromhost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)&toTransform->memoryOffset, 1, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
-    if (toTransform->pNext)
-    {
+    resourceTracker->deviceMemoryTransform_fromhost(
+        (VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)&toTransform->memoryOffset, 1,
+        (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkBindImageMemoryInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindImageMemoryInfo* toTransform)
-{
+void transform_tohost_VkBindImageMemoryInfo(VkDecoderGlobalState* resourceTracker,
+                                            VkBindImageMemoryInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)&toTransform->memoryOffset, 1, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
-    if (toTransform->pNext)
-    {
+    resourceTracker->deviceMemoryTransform_tohost(
+        (VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)&toTransform->memoryOffset, 1,
+        (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkBindImageMemoryInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindImageMemoryInfo* toTransform)
-{
+void transform_fromhost_VkBindImageMemoryInfo(VkDecoderGlobalState* resourceTracker,
+                                              VkBindImageMemoryInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    resourceTracker->deviceMemoryTransform_fromhost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)&toTransform->memoryOffset, 1, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
-    if (toTransform->pNext)
-    {
+    resourceTracker->deviceMemoryTransform_fromhost(
+        (VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)&toTransform->memoryOffset, 1,
+        (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDevice16BitStorageFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevice16BitStorageFeatures* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDevice16BitStorageFeatures* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDevice16BitStorageFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevice16BitStorageFeatures* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDevice16BitStorageFeatures* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkMemoryDedicatedRequirements(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryDedicatedRequirements* toTransform)
-{
+void transform_tohost_VkMemoryDedicatedRequirements(VkDecoderGlobalState* resourceTracker,
+                                                    VkMemoryDedicatedRequirements* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkMemoryDedicatedRequirements(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryDedicatedRequirements* toTransform)
-{
+void transform_fromhost_VkMemoryDedicatedRequirements(VkDecoderGlobalState* resourceTracker,
+                                                      VkMemoryDedicatedRequirements* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkMemoryDedicatedAllocateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryDedicatedAllocateInfo* toTransform)
-{
+void transform_tohost_VkMemoryDedicatedAllocateInfo(VkDecoderGlobalState* resourceTracker,
+                                                    VkMemoryDedicatedAllocateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkMemoryDedicatedAllocateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryDedicatedAllocateInfo* toTransform)
-{
+void transform_fromhost_VkMemoryDedicatedAllocateInfo(VkDecoderGlobalState* resourceTracker,
+                                                      VkMemoryDedicatedAllocateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkMemoryAllocateFlagsInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryAllocateFlagsInfo* toTransform)
-{
+void transform_tohost_VkMemoryAllocateFlagsInfo(VkDecoderGlobalState* resourceTracker,
+                                                VkMemoryAllocateFlagsInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkMemoryAllocateFlagsInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryAllocateFlagsInfo* toTransform)
-{
+void transform_fromhost_VkMemoryAllocateFlagsInfo(VkDecoderGlobalState* resourceTracker,
+                                                  VkMemoryAllocateFlagsInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkDeviceGroupRenderPassBeginInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceGroupRenderPassBeginInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDeviceGroupRenderPassBeginInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pDeviceRenderAreas)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->deviceRenderAreaCount; ++i)
-            {
-                transform_tohost_VkRect2D(resourceTracker, (VkRect2D*)(toTransform->pDeviceRenderAreas + i));
+    if (toTransform) {
+        if (toTransform->pDeviceRenderAreas) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->deviceRenderAreaCount; ++i) {
+                transform_tohost_VkRect2D(resourceTracker,
+                                          (VkRect2D*)(toTransform->pDeviceRenderAreas + i));
             }
         }
     }
 }
 
 void transform_fromhost_VkDeviceGroupRenderPassBeginInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceGroupRenderPassBeginInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDeviceGroupRenderPassBeginInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pDeviceRenderAreas)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->deviceRenderAreaCount; ++i)
-            {
-                transform_fromhost_VkRect2D(resourceTracker, (VkRect2D*)(toTransform->pDeviceRenderAreas + i));
+    if (toTransform) {
+        if (toTransform->pDeviceRenderAreas) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->deviceRenderAreaCount; ++i) {
+                transform_fromhost_VkRect2D(resourceTracker,
+                                            (VkRect2D*)(toTransform->pDeviceRenderAreas + i));
             }
         }
     }
 }
 
 void transform_tohost_VkDeviceGroupCommandBufferBeginInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceGroupCommandBufferBeginInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDeviceGroupCommandBufferBeginInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkDeviceGroupCommandBufferBeginInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceGroupCommandBufferBeginInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDeviceGroupCommandBufferBeginInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkDeviceGroupSubmitInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceGroupSubmitInfo* toTransform)
-{
+void transform_tohost_VkDeviceGroupSubmitInfo(VkDecoderGlobalState* resourceTracker,
+                                              VkDeviceGroupSubmitInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkDeviceGroupSubmitInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceGroupSubmitInfo* toTransform)
-{
+void transform_fromhost_VkDeviceGroupSubmitInfo(VkDecoderGlobalState* resourceTracker,
+                                                VkDeviceGroupSubmitInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkDeviceGroupBindSparseInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceGroupBindSparseInfo* toTransform)
-{
+void transform_tohost_VkDeviceGroupBindSparseInfo(VkDecoderGlobalState* resourceTracker,
+                                                  VkDeviceGroupBindSparseInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkDeviceGroupBindSparseInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceGroupBindSparseInfo* toTransform)
-{
+void transform_fromhost_VkDeviceGroupBindSparseInfo(VkDecoderGlobalState* resourceTracker,
+                                                    VkDeviceGroupBindSparseInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkBindBufferMemoryDeviceGroupInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindBufferMemoryDeviceGroupInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkBindBufferMemoryDeviceGroupInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkBindBufferMemoryDeviceGroupInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindBufferMemoryDeviceGroupInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkBindBufferMemoryDeviceGroupInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkBindImageMemoryDeviceGroupInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindImageMemoryDeviceGroupInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkBindImageMemoryDeviceGroupInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pSplitInstanceBindRegions)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->splitInstanceBindRegionCount; ++i)
-            {
-                transform_tohost_VkRect2D(resourceTracker, (VkRect2D*)(toTransform->pSplitInstanceBindRegions + i));
+    if (toTransform) {
+        if (toTransform->pSplitInstanceBindRegions) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->splitInstanceBindRegionCount; ++i) {
+                transform_tohost_VkRect2D(resourceTracker,
+                                          (VkRect2D*)(toTransform->pSplitInstanceBindRegions + i));
             }
         }
     }
 }
 
 void transform_fromhost_VkBindImageMemoryDeviceGroupInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindImageMemoryDeviceGroupInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkBindImageMemoryDeviceGroupInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pSplitInstanceBindRegions)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->splitInstanceBindRegionCount; ++i)
-            {
-                transform_fromhost_VkRect2D(resourceTracker, (VkRect2D*)(toTransform->pSplitInstanceBindRegions + i));
+    if (toTransform) {
+        if (toTransform->pSplitInstanceBindRegions) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->splitInstanceBindRegionCount; ++i) {
+                transform_fromhost_VkRect2D(
+                    resourceTracker, (VkRect2D*)(toTransform->pSplitInstanceBindRegions + i));
             }
         }
     }
 }
 
 void transform_tohost_VkPhysicalDeviceGroupProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceGroupProperties* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceGroupProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceGroupProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceGroupProperties* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceGroupProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkDeviceGroupDeviceCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceGroupDeviceCreateInfo* toTransform)
-{
+void transform_tohost_VkDeviceGroupDeviceCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                    VkDeviceGroupDeviceCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkDeviceGroupDeviceCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceGroupDeviceCreateInfo* toTransform)
-{
+void transform_fromhost_VkDeviceGroupDeviceCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                      VkDeviceGroupDeviceCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkBufferMemoryRequirementsInfo2(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferMemoryRequirementsInfo2* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkBufferMemoryRequirementsInfo2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkBufferMemoryRequirementsInfo2(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferMemoryRequirementsInfo2* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkBufferMemoryRequirementsInfo2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkImageMemoryRequirementsInfo2(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageMemoryRequirementsInfo2* toTransform)
-{
+void transform_tohost_VkImageMemoryRequirementsInfo2(VkDecoderGlobalState* resourceTracker,
+                                                     VkImageMemoryRequirementsInfo2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkImageMemoryRequirementsInfo2(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageMemoryRequirementsInfo2* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkImageMemoryRequirementsInfo2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkImageSparseMemoryRequirementsInfo2(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageSparseMemoryRequirementsInfo2* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkImageSparseMemoryRequirementsInfo2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkImageSparseMemoryRequirementsInfo2(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageSparseMemoryRequirementsInfo2* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkImageSparseMemoryRequirementsInfo2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkMemoryRequirements2(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryRequirements2* toTransform)
-{
+void transform_tohost_VkMemoryRequirements2(VkDecoderGlobalState* resourceTracker,
+                                            VkMemoryRequirements2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkMemoryRequirements(resourceTracker, (VkMemoryRequirements*)(&toTransform->memoryRequirements));
+    transform_tohost_VkMemoryRequirements(
+        resourceTracker, (VkMemoryRequirements*)(&toTransform->memoryRequirements));
 }
 
-void transform_fromhost_VkMemoryRequirements2(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryRequirements2* toTransform)
-{
+void transform_fromhost_VkMemoryRequirements2(VkDecoderGlobalState* resourceTracker,
+                                              VkMemoryRequirements2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkMemoryRequirements(resourceTracker, (VkMemoryRequirements*)(&toTransform->memoryRequirements));
+    transform_fromhost_VkMemoryRequirements(
+        resourceTracker, (VkMemoryRequirements*)(&toTransform->memoryRequirements));
 }
 
 void transform_tohost_VkSparseImageMemoryRequirements2(
-    VkDecoderGlobalState* resourceTracker,
-    VkSparseImageMemoryRequirements2* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkSparseImageMemoryRequirements2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkSparseImageMemoryRequirements(resourceTracker, (VkSparseImageMemoryRequirements*)(&toTransform->memoryRequirements));
+    transform_tohost_VkSparseImageMemoryRequirements(
+        resourceTracker, (VkSparseImageMemoryRequirements*)(&toTransform->memoryRequirements));
 }
 
 void transform_fromhost_VkSparseImageMemoryRequirements2(
-    VkDecoderGlobalState* resourceTracker,
-    VkSparseImageMemoryRequirements2* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkSparseImageMemoryRequirements2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkSparseImageMemoryRequirements(resourceTracker, (VkSparseImageMemoryRequirements*)(&toTransform->memoryRequirements));
+    transform_fromhost_VkSparseImageMemoryRequirements(
+        resourceTracker, (VkSparseImageMemoryRequirements*)(&toTransform->memoryRequirements));
 }
 
-void transform_tohost_VkPhysicalDeviceFeatures2(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceFeatures2* toTransform)
-{
+void transform_tohost_VkPhysicalDeviceFeatures2(VkDecoderGlobalState* resourceTracker,
+                                                VkPhysicalDeviceFeatures2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkPhysicalDeviceFeatures(resourceTracker, (VkPhysicalDeviceFeatures*)(&toTransform->features));
+    transform_tohost_VkPhysicalDeviceFeatures(resourceTracker,
+                                              (VkPhysicalDeviceFeatures*)(&toTransform->features));
 }
 
-void transform_fromhost_VkPhysicalDeviceFeatures2(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceFeatures2* toTransform)
-{
+void transform_fromhost_VkPhysicalDeviceFeatures2(VkDecoderGlobalState* resourceTracker,
+                                                  VkPhysicalDeviceFeatures2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkPhysicalDeviceFeatures(resourceTracker, (VkPhysicalDeviceFeatures*)(&toTransform->features));
+    transform_fromhost_VkPhysicalDeviceFeatures(
+        resourceTracker, (VkPhysicalDeviceFeatures*)(&toTransform->features));
 }
 
-void transform_tohost_VkPhysicalDeviceProperties2(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceProperties2* toTransform)
-{
+void transform_tohost_VkPhysicalDeviceProperties2(VkDecoderGlobalState* resourceTracker,
+                                                  VkPhysicalDeviceProperties2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkPhysicalDeviceProperties(resourceTracker, (VkPhysicalDeviceProperties*)(&toTransform->properties));
+    transform_tohost_VkPhysicalDeviceProperties(
+        resourceTracker, (VkPhysicalDeviceProperties*)(&toTransform->properties));
 }
 
-void transform_fromhost_VkPhysicalDeviceProperties2(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceProperties2* toTransform)
-{
+void transform_fromhost_VkPhysicalDeviceProperties2(VkDecoderGlobalState* resourceTracker,
+                                                    VkPhysicalDeviceProperties2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkPhysicalDeviceProperties(resourceTracker, (VkPhysicalDeviceProperties*)(&toTransform->properties));
+    transform_fromhost_VkPhysicalDeviceProperties(
+        resourceTracker, (VkPhysicalDeviceProperties*)(&toTransform->properties));
 }
 
-void transform_tohost_VkFormatProperties2(
-    VkDecoderGlobalState* resourceTracker,
-    VkFormatProperties2* toTransform)
-{
+void transform_tohost_VkFormatProperties2(VkDecoderGlobalState* resourceTracker,
+                                          VkFormatProperties2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkFormatProperties(resourceTracker, (VkFormatProperties*)(&toTransform->formatProperties));
+    transform_tohost_VkFormatProperties(resourceTracker,
+                                        (VkFormatProperties*)(&toTransform->formatProperties));
 }
 
-void transform_fromhost_VkFormatProperties2(
-    VkDecoderGlobalState* resourceTracker,
-    VkFormatProperties2* toTransform)
-{
+void transform_fromhost_VkFormatProperties2(VkDecoderGlobalState* resourceTracker,
+                                            VkFormatProperties2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkFormatProperties(resourceTracker, (VkFormatProperties*)(&toTransform->formatProperties));
+    transform_fromhost_VkFormatProperties(resourceTracker,
+                                          (VkFormatProperties*)(&toTransform->formatProperties));
 }
 
-void transform_tohost_VkImageFormatProperties2(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageFormatProperties2* toTransform)
-{
+void transform_tohost_VkImageFormatProperties2(VkDecoderGlobalState* resourceTracker,
+                                               VkImageFormatProperties2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkImageFormatProperties(resourceTracker, (VkImageFormatProperties*)(&toTransform->imageFormatProperties));
+    transform_tohost_VkImageFormatProperties(
+        resourceTracker, (VkImageFormatProperties*)(&toTransform->imageFormatProperties));
 }
 
-void transform_fromhost_VkImageFormatProperties2(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageFormatProperties2* toTransform)
-{
+void transform_fromhost_VkImageFormatProperties2(VkDecoderGlobalState* resourceTracker,
+                                                 VkImageFormatProperties2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkImageFormatProperties(resourceTracker, (VkImageFormatProperties*)(&toTransform->imageFormatProperties));
+    transform_fromhost_VkImageFormatProperties(
+        resourceTracker, (VkImageFormatProperties*)(&toTransform->imageFormatProperties));
 }
 
 void transform_tohost_VkPhysicalDeviceImageFormatInfo2(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceImageFormatInfo2* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceImageFormatInfo2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceImageFormatInfo2(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceImageFormatInfo2* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceImageFormatInfo2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkQueueFamilyProperties2(
-    VkDecoderGlobalState* resourceTracker,
-    VkQueueFamilyProperties2* toTransform)
-{
+void transform_tohost_VkQueueFamilyProperties2(VkDecoderGlobalState* resourceTracker,
+                                               VkQueueFamilyProperties2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkQueueFamilyProperties(resourceTracker, (VkQueueFamilyProperties*)(&toTransform->queueFamilyProperties));
+    transform_tohost_VkQueueFamilyProperties(
+        resourceTracker, (VkQueueFamilyProperties*)(&toTransform->queueFamilyProperties));
 }
 
-void transform_fromhost_VkQueueFamilyProperties2(
-    VkDecoderGlobalState* resourceTracker,
-    VkQueueFamilyProperties2* toTransform)
-{
+void transform_fromhost_VkQueueFamilyProperties2(VkDecoderGlobalState* resourceTracker,
+                                                 VkQueueFamilyProperties2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkQueueFamilyProperties(resourceTracker, (VkQueueFamilyProperties*)(&toTransform->queueFamilyProperties));
+    transform_fromhost_VkQueueFamilyProperties(
+        resourceTracker, (VkQueueFamilyProperties*)(&toTransform->queueFamilyProperties));
 }
 
 void transform_tohost_VkPhysicalDeviceMemoryProperties2(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMemoryProperties2* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMemoryProperties2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkPhysicalDeviceMemoryProperties(resourceTracker, (VkPhysicalDeviceMemoryProperties*)(&toTransform->memoryProperties));
+    transform_tohost_VkPhysicalDeviceMemoryProperties(
+        resourceTracker, (VkPhysicalDeviceMemoryProperties*)(&toTransform->memoryProperties));
 }
 
 void transform_fromhost_VkPhysicalDeviceMemoryProperties2(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMemoryProperties2* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMemoryProperties2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkPhysicalDeviceMemoryProperties(resourceTracker, (VkPhysicalDeviceMemoryProperties*)(&toTransform->memoryProperties));
+    transform_fromhost_VkPhysicalDeviceMemoryProperties(
+        resourceTracker, (VkPhysicalDeviceMemoryProperties*)(&toTransform->memoryProperties));
 }
 
-void transform_tohost_VkSparseImageFormatProperties2(
-    VkDecoderGlobalState* resourceTracker,
-    VkSparseImageFormatProperties2* toTransform)
-{
+void transform_tohost_VkSparseImageFormatProperties2(VkDecoderGlobalState* resourceTracker,
+                                                     VkSparseImageFormatProperties2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkSparseImageFormatProperties(resourceTracker, (VkSparseImageFormatProperties*)(&toTransform->properties));
+    transform_tohost_VkSparseImageFormatProperties(
+        resourceTracker, (VkSparseImageFormatProperties*)(&toTransform->properties));
 }
 
 void transform_fromhost_VkSparseImageFormatProperties2(
-    VkDecoderGlobalState* resourceTracker,
-    VkSparseImageFormatProperties2* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkSparseImageFormatProperties2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkSparseImageFormatProperties(resourceTracker, (VkSparseImageFormatProperties*)(&toTransform->properties));
+    transform_fromhost_VkSparseImageFormatProperties(
+        resourceTracker, (VkSparseImageFormatProperties*)(&toTransform->properties));
 }
 
 void transform_tohost_VkPhysicalDeviceSparseImageFormatInfo2(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceSparseImageFormatInfo2* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceSparseImageFormatInfo2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceSparseImageFormatInfo2(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceSparseImageFormatInfo2* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceSparseImageFormatInfo2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDevicePointClippingProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePointClippingProperties* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDevicePointClippingProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDevicePointClippingProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePointClippingProperties* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDevicePointClippingProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkInputAttachmentAspectReference(
-    VkDecoderGlobalState* resourceTracker,
-    VkInputAttachmentAspectReference* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkInputAttachmentAspectReference* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_fromhost_VkInputAttachmentAspectReference(
-    VkDecoderGlobalState* resourceTracker,
-    VkInputAttachmentAspectReference* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkInputAttachmentAspectReference* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_tohost_VkRenderPassInputAttachmentAspectCreateInfo(
     VkDecoderGlobalState* resourceTracker,
-    VkRenderPassInputAttachmentAspectCreateInfo* toTransform)
-{
+    VkRenderPassInputAttachmentAspectCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pAspectReferences)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->aspectReferenceCount; ++i)
-            {
-                transform_tohost_VkInputAttachmentAspectReference(resourceTracker, (VkInputAttachmentAspectReference*)(toTransform->pAspectReferences + i));
+    if (toTransform) {
+        if (toTransform->pAspectReferences) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->aspectReferenceCount; ++i) {
+                transform_tohost_VkInputAttachmentAspectReference(
+                    resourceTracker,
+                    (VkInputAttachmentAspectReference*)(toTransform->pAspectReferences + i));
             }
         }
     }
@@ -3766,900 +3022,701 @@
 
 void transform_fromhost_VkRenderPassInputAttachmentAspectCreateInfo(
     VkDecoderGlobalState* resourceTracker,
-    VkRenderPassInputAttachmentAspectCreateInfo* toTransform)
-{
+    VkRenderPassInputAttachmentAspectCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pAspectReferences)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->aspectReferenceCount; ++i)
-            {
-                transform_fromhost_VkInputAttachmentAspectReference(resourceTracker, (VkInputAttachmentAspectReference*)(toTransform->pAspectReferences + i));
+    if (toTransform) {
+        if (toTransform->pAspectReferences) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->aspectReferenceCount; ++i) {
+                transform_fromhost_VkInputAttachmentAspectReference(
+                    resourceTracker,
+                    (VkInputAttachmentAspectReference*)(toTransform->pAspectReferences + i));
             }
         }
     }
 }
 
-void transform_tohost_VkImageViewUsageCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageViewUsageCreateInfo* toTransform)
-{
+void transform_tohost_VkImageViewUsageCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                 VkImageViewUsageCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkImageViewUsageCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageViewUsageCreateInfo* toTransform)
-{
+void transform_fromhost_VkImageViewUsageCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                   VkImageViewUsageCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPipelineTessellationDomainOriginStateCreateInfo(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineTessellationDomainOriginStateCreateInfo* toTransform)
-{
+    VkPipelineTessellationDomainOriginStateCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPipelineTessellationDomainOriginStateCreateInfo(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineTessellationDomainOriginStateCreateInfo* toTransform)
-{
+    VkPipelineTessellationDomainOriginStateCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkRenderPassMultiviewCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkRenderPassMultiviewCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkRenderPassMultiviewCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkRenderPassMultiviewCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkRenderPassMultiviewCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkRenderPassMultiviewCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceMultiviewFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMultiviewFeatures* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMultiviewFeatures* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceMultiviewFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMultiviewFeatures* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMultiviewFeatures* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceMultiviewProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMultiviewProperties* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMultiviewProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceMultiviewProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMultiviewProperties* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMultiviewProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceVariablePointersFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceVariablePointersFeatures* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceVariablePointersFeatures* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceVariablePointersFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceVariablePointersFeatures* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceVariablePointersFeatures* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceProtectedMemoryFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceProtectedMemoryFeatures* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceProtectedMemoryFeatures* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceProtectedMemoryFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceProtectedMemoryFeatures* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceProtectedMemoryFeatures* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceProtectedMemoryProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceProtectedMemoryProperties* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceProtectedMemoryProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceProtectedMemoryProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceProtectedMemoryProperties* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceProtectedMemoryProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkDeviceQueueInfo2(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceQueueInfo2* toTransform)
-{
+void transform_tohost_VkDeviceQueueInfo2(VkDecoderGlobalState* resourceTracker,
+                                         VkDeviceQueueInfo2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkDeviceQueueInfo2(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceQueueInfo2* toTransform)
-{
+void transform_fromhost_VkDeviceQueueInfo2(VkDecoderGlobalState* resourceTracker,
+                                           VkDeviceQueueInfo2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkProtectedSubmitInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkProtectedSubmitInfo* toTransform)
-{
+void transform_tohost_VkProtectedSubmitInfo(VkDecoderGlobalState* resourceTracker,
+                                            VkProtectedSubmitInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkProtectedSubmitInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkProtectedSubmitInfo* toTransform)
-{
+void transform_fromhost_VkProtectedSubmitInfo(VkDecoderGlobalState* resourceTracker,
+                                              VkProtectedSubmitInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkSamplerYcbcrConversionCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSamplerYcbcrConversionCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkSamplerYcbcrConversionCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkComponentMapping(resourceTracker, (VkComponentMapping*)(&toTransform->components));
+    transform_tohost_VkComponentMapping(resourceTracker,
+                                        (VkComponentMapping*)(&toTransform->components));
 }
 
 void transform_fromhost_VkSamplerYcbcrConversionCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSamplerYcbcrConversionCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkSamplerYcbcrConversionCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkComponentMapping(resourceTracker, (VkComponentMapping*)(&toTransform->components));
+    transform_fromhost_VkComponentMapping(resourceTracker,
+                                          (VkComponentMapping*)(&toTransform->components));
 }
 
-void transform_tohost_VkSamplerYcbcrConversionInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSamplerYcbcrConversionInfo* toTransform)
-{
+void transform_tohost_VkSamplerYcbcrConversionInfo(VkDecoderGlobalState* resourceTracker,
+                                                   VkSamplerYcbcrConversionInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkSamplerYcbcrConversionInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSamplerYcbcrConversionInfo* toTransform)
-{
+void transform_fromhost_VkSamplerYcbcrConversionInfo(VkDecoderGlobalState* resourceTracker,
+                                                     VkSamplerYcbcrConversionInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkBindImagePlaneMemoryInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindImagePlaneMemoryInfo* toTransform)
-{
+void transform_tohost_VkBindImagePlaneMemoryInfo(VkDecoderGlobalState* resourceTracker,
+                                                 VkBindImagePlaneMemoryInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkBindImagePlaneMemoryInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindImagePlaneMemoryInfo* toTransform)
-{
+void transform_fromhost_VkBindImagePlaneMemoryInfo(VkDecoderGlobalState* resourceTracker,
+                                                   VkBindImagePlaneMemoryInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkImagePlaneMemoryRequirementsInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkImagePlaneMemoryRequirementsInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkImagePlaneMemoryRequirementsInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkImagePlaneMemoryRequirementsInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkImagePlaneMemoryRequirementsInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkImagePlaneMemoryRequirementsInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceSamplerYcbcrConversionFeatures* toTransform)
-{
+    VkPhysicalDeviceSamplerYcbcrConversionFeatures* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceSamplerYcbcrConversionFeatures* toTransform)
-{
+    VkPhysicalDeviceSamplerYcbcrConversionFeatures* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkSamplerYcbcrConversionImageFormatProperties(
     VkDecoderGlobalState* resourceTracker,
-    VkSamplerYcbcrConversionImageFormatProperties* toTransform)
-{
+    VkSamplerYcbcrConversionImageFormatProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkSamplerYcbcrConversionImageFormatProperties(
     VkDecoderGlobalState* resourceTracker,
-    VkSamplerYcbcrConversionImageFormatProperties* toTransform)
-{
+    VkSamplerYcbcrConversionImageFormatProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkDescriptorUpdateTemplateEntry(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorUpdateTemplateEntry* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDescriptorUpdateTemplateEntry* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_fromhost_VkDescriptorUpdateTemplateEntry(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorUpdateTemplateEntry* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDescriptorUpdateTemplateEntry* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_tohost_VkDescriptorUpdateTemplateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorUpdateTemplateCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDescriptorUpdateTemplateCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pDescriptorUpdateEntries)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->descriptorUpdateEntryCount; ++i)
-            {
-                transform_tohost_VkDescriptorUpdateTemplateEntry(resourceTracker, (VkDescriptorUpdateTemplateEntry*)(toTransform->pDescriptorUpdateEntries + i));
+    if (toTransform) {
+        if (toTransform->pDescriptorUpdateEntries) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->descriptorUpdateEntryCount; ++i) {
+                transform_tohost_VkDescriptorUpdateTemplateEntry(
+                    resourceTracker,
+                    (VkDescriptorUpdateTemplateEntry*)(toTransform->pDescriptorUpdateEntries + i));
             }
         }
     }
 }
 
 void transform_fromhost_VkDescriptorUpdateTemplateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorUpdateTemplateCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDescriptorUpdateTemplateCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pDescriptorUpdateEntries)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->descriptorUpdateEntryCount; ++i)
-            {
-                transform_fromhost_VkDescriptorUpdateTemplateEntry(resourceTracker, (VkDescriptorUpdateTemplateEntry*)(toTransform->pDescriptorUpdateEntries + i));
+    if (toTransform) {
+        if (toTransform->pDescriptorUpdateEntries) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->descriptorUpdateEntryCount; ++i) {
+                transform_fromhost_VkDescriptorUpdateTemplateEntry(
+                    resourceTracker,
+                    (VkDescriptorUpdateTemplateEntry*)(toTransform->pDescriptorUpdateEntries + i));
             }
         }
     }
 }
 
-void transform_tohost_VkExternalMemoryProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalMemoryProperties* toTransform)
-{
+void transform_tohost_VkExternalMemoryProperties(VkDecoderGlobalState* resourceTracker,
+                                                 VkExternalMemoryProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkExternalMemoryProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalMemoryProperties* toTransform)
-{
+void transform_fromhost_VkExternalMemoryProperties(VkDecoderGlobalState* resourceTracker,
+                                                   VkExternalMemoryProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_tohost_VkPhysicalDeviceExternalImageFormatInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceExternalImageFormatInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceExternalImageFormatInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceExternalImageFormatInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceExternalImageFormatInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceExternalImageFormatInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkExternalImageFormatProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalImageFormatProperties* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkExternalImageFormatProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    resourceTracker->transformImpl_VkExternalMemoryProperties_tohost(&toTransform->externalMemoryProperties, 1);
-    transform_tohost_VkExternalMemoryProperties(resourceTracker, (VkExternalMemoryProperties*)(&toTransform->externalMemoryProperties));
+    resourceTracker->transformImpl_VkExternalMemoryProperties_tohost(
+        &toTransform->externalMemoryProperties, 1);
+    transform_tohost_VkExternalMemoryProperties(
+        resourceTracker, (VkExternalMemoryProperties*)(&toTransform->externalMemoryProperties));
 }
 
 void transform_fromhost_VkExternalImageFormatProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalImageFormatProperties* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkExternalImageFormatProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    resourceTracker->transformImpl_VkExternalMemoryProperties_fromhost(&toTransform->externalMemoryProperties, 1);
-    transform_fromhost_VkExternalMemoryProperties(resourceTracker, (VkExternalMemoryProperties*)(&toTransform->externalMemoryProperties));
+    resourceTracker->transformImpl_VkExternalMemoryProperties_fromhost(
+        &toTransform->externalMemoryProperties, 1);
+    transform_fromhost_VkExternalMemoryProperties(
+        resourceTracker, (VkExternalMemoryProperties*)(&toTransform->externalMemoryProperties));
 }
 
 void transform_tohost_VkPhysicalDeviceExternalBufferInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceExternalBufferInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceExternalBufferInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceExternalBufferInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceExternalBufferInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceExternalBufferInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkExternalBufferProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalBufferProperties* toTransform)
-{
+void transform_tohost_VkExternalBufferProperties(VkDecoderGlobalState* resourceTracker,
+                                                 VkExternalBufferProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    resourceTracker->transformImpl_VkExternalMemoryProperties_tohost(&toTransform->externalMemoryProperties, 1);
-    transform_tohost_VkExternalMemoryProperties(resourceTracker, (VkExternalMemoryProperties*)(&toTransform->externalMemoryProperties));
+    resourceTracker->transformImpl_VkExternalMemoryProperties_tohost(
+        &toTransform->externalMemoryProperties, 1);
+    transform_tohost_VkExternalMemoryProperties(
+        resourceTracker, (VkExternalMemoryProperties*)(&toTransform->externalMemoryProperties));
 }
 
-void transform_fromhost_VkExternalBufferProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalBufferProperties* toTransform)
-{
+void transform_fromhost_VkExternalBufferProperties(VkDecoderGlobalState* resourceTracker,
+                                                   VkExternalBufferProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    resourceTracker->transformImpl_VkExternalMemoryProperties_fromhost(&toTransform->externalMemoryProperties, 1);
-    transform_fromhost_VkExternalMemoryProperties(resourceTracker, (VkExternalMemoryProperties*)(&toTransform->externalMemoryProperties));
+    resourceTracker->transformImpl_VkExternalMemoryProperties_fromhost(
+        &toTransform->externalMemoryProperties, 1);
+    transform_fromhost_VkExternalMemoryProperties(
+        resourceTracker, (VkExternalMemoryProperties*)(&toTransform->externalMemoryProperties));
 }
 
-void transform_tohost_VkPhysicalDeviceIDProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceIDProperties* toTransform)
-{
+void transform_tohost_VkPhysicalDeviceIDProperties(VkDecoderGlobalState* resourceTracker,
+                                                   VkPhysicalDeviceIDProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkPhysicalDeviceIDProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceIDProperties* toTransform)
-{
+void transform_fromhost_VkPhysicalDeviceIDProperties(VkDecoderGlobalState* resourceTracker,
+                                                     VkPhysicalDeviceIDProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkExternalMemoryImageCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalMemoryImageCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkExternalMemoryImageCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkExternalMemoryImageCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalMemoryImageCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkExternalMemoryImageCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkExternalMemoryBufferCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalMemoryBufferCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkExternalMemoryBufferCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkExternalMemoryBufferCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalMemoryBufferCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkExternalMemoryBufferCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkExportMemoryAllocateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkExportMemoryAllocateInfo* toTransform)
-{
+void transform_tohost_VkExportMemoryAllocateInfo(VkDecoderGlobalState* resourceTracker,
+                                                 VkExportMemoryAllocateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkExportMemoryAllocateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkExportMemoryAllocateInfo* toTransform)
-{
+void transform_fromhost_VkExportMemoryAllocateInfo(VkDecoderGlobalState* resourceTracker,
+                                                   VkExportMemoryAllocateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceExternalFenceInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceExternalFenceInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceExternalFenceInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceExternalFenceInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceExternalFenceInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceExternalFenceInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkExternalFenceProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalFenceProperties* toTransform)
-{
+void transform_tohost_VkExternalFenceProperties(VkDecoderGlobalState* resourceTracker,
+                                                VkExternalFenceProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkExternalFenceProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalFenceProperties* toTransform)
-{
+void transform_fromhost_VkExternalFenceProperties(VkDecoderGlobalState* resourceTracker,
+                                                  VkExternalFenceProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkExportFenceCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkExportFenceCreateInfo* toTransform)
-{
+void transform_tohost_VkExportFenceCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                              VkExportFenceCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkExportFenceCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkExportFenceCreateInfo* toTransform)
-{
+void transform_fromhost_VkExportFenceCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                VkExportFenceCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkExportSemaphoreCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkExportSemaphoreCreateInfo* toTransform)
-{
+void transform_tohost_VkExportSemaphoreCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                  VkExportSemaphoreCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkExportSemaphoreCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkExportSemaphoreCreateInfo* toTransform)
-{
+void transform_fromhost_VkExportSemaphoreCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                    VkExportSemaphoreCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceExternalSemaphoreInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceExternalSemaphoreInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceExternalSemaphoreInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceExternalSemaphoreInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceExternalSemaphoreInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceExternalSemaphoreInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkExternalSemaphoreProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalSemaphoreProperties* toTransform)
-{
+void transform_tohost_VkExternalSemaphoreProperties(VkDecoderGlobalState* resourceTracker,
+                                                    VkExternalSemaphoreProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkExternalSemaphoreProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalSemaphoreProperties* toTransform)
-{
+void transform_fromhost_VkExternalSemaphoreProperties(VkDecoderGlobalState* resourceTracker,
+                                                      VkExternalSemaphoreProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceMaintenance3Properties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMaintenance3Properties* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMaintenance3Properties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceMaintenance3Properties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMaintenance3Properties* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMaintenance3Properties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkDescriptorSetLayoutSupport(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorSetLayoutSupport* toTransform)
-{
+void transform_tohost_VkDescriptorSetLayoutSupport(VkDecoderGlobalState* resourceTracker,
+                                                   VkDescriptorSetLayoutSupport* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkDescriptorSetLayoutSupport(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorSetLayoutSupport* toTransform)
-{
+void transform_fromhost_VkDescriptorSetLayoutSupport(VkDecoderGlobalState* resourceTracker,
+                                                     VkDescriptorSetLayoutSupport* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceShaderDrawParametersFeatures(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderDrawParametersFeatures* toTransform)
-{
+    VkPhysicalDeviceShaderDrawParametersFeatures* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceShaderDrawParametersFeatures(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderDrawParametersFeatures* toTransform)
-{
+    VkPhysicalDeviceShaderDrawParametersFeatures* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -4667,1389 +3724,1095 @@
 #endif
 #ifdef VK_VERSION_1_2
 void transform_tohost_VkPhysicalDeviceVulkan11Features(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceVulkan11Features* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceVulkan11Features* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceVulkan11Features(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceVulkan11Features* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceVulkan11Features* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceVulkan11Properties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceVulkan11Properties* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceVulkan11Properties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceVulkan11Properties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceVulkan11Properties* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceVulkan11Properties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceVulkan12Features(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceVulkan12Features* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceVulkan12Features* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceVulkan12Features(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceVulkan12Features* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceVulkan12Features* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkConformanceVersion(
-    VkDecoderGlobalState* resourceTracker,
-    VkConformanceVersion* toTransform)
-{
+void transform_tohost_VkConformanceVersion(VkDecoderGlobalState* resourceTracker,
+                                           VkConformanceVersion* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkConformanceVersion(
-    VkDecoderGlobalState* resourceTracker,
-    VkConformanceVersion* toTransform)
-{
+void transform_fromhost_VkConformanceVersion(VkDecoderGlobalState* resourceTracker,
+                                             VkConformanceVersion* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_tohost_VkPhysicalDeviceVulkan12Properties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceVulkan12Properties* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceVulkan12Properties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkConformanceVersion(resourceTracker, (VkConformanceVersion*)(&toTransform->conformanceVersion));
+    transform_tohost_VkConformanceVersion(
+        resourceTracker, (VkConformanceVersion*)(&toTransform->conformanceVersion));
 }
 
 void transform_fromhost_VkPhysicalDeviceVulkan12Properties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceVulkan12Properties* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceVulkan12Properties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkConformanceVersion(resourceTracker, (VkConformanceVersion*)(&toTransform->conformanceVersion));
+    transform_fromhost_VkConformanceVersion(
+        resourceTracker, (VkConformanceVersion*)(&toTransform->conformanceVersion));
 }
 
-void transform_tohost_VkImageFormatListCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageFormatListCreateInfo* toTransform)
-{
+void transform_tohost_VkImageFormatListCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                  VkImageFormatListCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkImageFormatListCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageFormatListCreateInfo* toTransform)
-{
+void transform_fromhost_VkImageFormatListCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                    VkImageFormatListCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkAttachmentDescription2(
-    VkDecoderGlobalState* resourceTracker,
-    VkAttachmentDescription2* toTransform)
-{
+void transform_tohost_VkAttachmentDescription2(VkDecoderGlobalState* resourceTracker,
+                                               VkAttachmentDescription2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkAttachmentDescription2(
-    VkDecoderGlobalState* resourceTracker,
-    VkAttachmentDescription2* toTransform)
-{
+void transform_fromhost_VkAttachmentDescription2(VkDecoderGlobalState* resourceTracker,
+                                                 VkAttachmentDescription2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkAttachmentReference2(
-    VkDecoderGlobalState* resourceTracker,
-    VkAttachmentReference2* toTransform)
-{
+void transform_tohost_VkAttachmentReference2(VkDecoderGlobalState* resourceTracker,
+                                             VkAttachmentReference2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkAttachmentReference2(
-    VkDecoderGlobalState* resourceTracker,
-    VkAttachmentReference2* toTransform)
-{
+void transform_fromhost_VkAttachmentReference2(VkDecoderGlobalState* resourceTracker,
+                                               VkAttachmentReference2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkSubpassDescription2(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubpassDescription2* toTransform)
-{
+void transform_tohost_VkSubpassDescription2(VkDecoderGlobalState* resourceTracker,
+                                            VkSubpassDescription2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pInputAttachments)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->inputAttachmentCount; ++i)
-            {
-                transform_tohost_VkAttachmentReference2(resourceTracker, (VkAttachmentReference2*)(toTransform->pInputAttachments + i));
+    if (toTransform) {
+        if (toTransform->pInputAttachments) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->inputAttachmentCount; ++i) {
+                transform_tohost_VkAttachmentReference2(
+                    resourceTracker, (VkAttachmentReference2*)(toTransform->pInputAttachments + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pColorAttachments)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->colorAttachmentCount; ++i)
-            {
-                transform_tohost_VkAttachmentReference2(resourceTracker, (VkAttachmentReference2*)(toTransform->pColorAttachments + i));
+    if (toTransform) {
+        if (toTransform->pColorAttachments) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->colorAttachmentCount; ++i) {
+                transform_tohost_VkAttachmentReference2(
+                    resourceTracker, (VkAttachmentReference2*)(toTransform->pColorAttachments + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pResolveAttachments)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->colorAttachmentCount; ++i)
-            {
-                transform_tohost_VkAttachmentReference2(resourceTracker, (VkAttachmentReference2*)(toTransform->pResolveAttachments + i));
+    if (toTransform) {
+        if (toTransform->pResolveAttachments) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->colorAttachmentCount; ++i) {
+                transform_tohost_VkAttachmentReference2(
+                    resourceTracker,
+                    (VkAttachmentReference2*)(toTransform->pResolveAttachments + i));
             }
         }
     }
-    if (toTransform->pDepthStencilAttachment)
-    {
-        transform_tohost_VkAttachmentReference2(resourceTracker, (VkAttachmentReference2*)(toTransform->pDepthStencilAttachment));
+    if (toTransform->pDepthStencilAttachment) {
+        transform_tohost_VkAttachmentReference2(
+            resourceTracker, (VkAttachmentReference2*)(toTransform->pDepthStencilAttachment));
     }
 }
 
-void transform_fromhost_VkSubpassDescription2(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubpassDescription2* toTransform)
-{
+void transform_fromhost_VkSubpassDescription2(VkDecoderGlobalState* resourceTracker,
+                                              VkSubpassDescription2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pInputAttachments)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->inputAttachmentCount; ++i)
-            {
-                transform_fromhost_VkAttachmentReference2(resourceTracker, (VkAttachmentReference2*)(toTransform->pInputAttachments + i));
+    if (toTransform) {
+        if (toTransform->pInputAttachments) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->inputAttachmentCount; ++i) {
+                transform_fromhost_VkAttachmentReference2(
+                    resourceTracker, (VkAttachmentReference2*)(toTransform->pInputAttachments + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pColorAttachments)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->colorAttachmentCount; ++i)
-            {
-                transform_fromhost_VkAttachmentReference2(resourceTracker, (VkAttachmentReference2*)(toTransform->pColorAttachments + i));
+    if (toTransform) {
+        if (toTransform->pColorAttachments) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->colorAttachmentCount; ++i) {
+                transform_fromhost_VkAttachmentReference2(
+                    resourceTracker, (VkAttachmentReference2*)(toTransform->pColorAttachments + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pResolveAttachments)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->colorAttachmentCount; ++i)
-            {
-                transform_fromhost_VkAttachmentReference2(resourceTracker, (VkAttachmentReference2*)(toTransform->pResolveAttachments + i));
+    if (toTransform) {
+        if (toTransform->pResolveAttachments) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->colorAttachmentCount; ++i) {
+                transform_fromhost_VkAttachmentReference2(
+                    resourceTracker,
+                    (VkAttachmentReference2*)(toTransform->pResolveAttachments + i));
             }
         }
     }
-    if (toTransform->pDepthStencilAttachment)
-    {
-        transform_fromhost_VkAttachmentReference2(resourceTracker, (VkAttachmentReference2*)(toTransform->pDepthStencilAttachment));
+    if (toTransform->pDepthStencilAttachment) {
+        transform_fromhost_VkAttachmentReference2(
+            resourceTracker, (VkAttachmentReference2*)(toTransform->pDepthStencilAttachment));
     }
 }
 
-void transform_tohost_VkSubpassDependency2(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubpassDependency2* toTransform)
-{
+void transform_tohost_VkSubpassDependency2(VkDecoderGlobalState* resourceTracker,
+                                           VkSubpassDependency2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkSubpassDependency2(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubpassDependency2* toTransform)
-{
+void transform_fromhost_VkSubpassDependency2(VkDecoderGlobalState* resourceTracker,
+                                             VkSubpassDependency2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkRenderPassCreateInfo2(
-    VkDecoderGlobalState* resourceTracker,
-    VkRenderPassCreateInfo2* toTransform)
-{
+void transform_tohost_VkRenderPassCreateInfo2(VkDecoderGlobalState* resourceTracker,
+                                              VkRenderPassCreateInfo2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pAttachments)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->attachmentCount; ++i)
-            {
-                transform_tohost_VkAttachmentDescription2(resourceTracker, (VkAttachmentDescription2*)(toTransform->pAttachments + i));
+    if (toTransform) {
+        if (toTransform->pAttachments) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->attachmentCount; ++i) {
+                transform_tohost_VkAttachmentDescription2(
+                    resourceTracker, (VkAttachmentDescription2*)(toTransform->pAttachments + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pSubpasses)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->subpassCount; ++i)
-            {
-                transform_tohost_VkSubpassDescription2(resourceTracker, (VkSubpassDescription2*)(toTransform->pSubpasses + i));
+    if (toTransform) {
+        if (toTransform->pSubpasses) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->subpassCount; ++i) {
+                transform_tohost_VkSubpassDescription2(
+                    resourceTracker, (VkSubpassDescription2*)(toTransform->pSubpasses + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pDependencies)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->dependencyCount; ++i)
-            {
-                transform_tohost_VkSubpassDependency2(resourceTracker, (VkSubpassDependency2*)(toTransform->pDependencies + i));
+    if (toTransform) {
+        if (toTransform->pDependencies) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->dependencyCount; ++i) {
+                transform_tohost_VkSubpassDependency2(
+                    resourceTracker, (VkSubpassDependency2*)(toTransform->pDependencies + i));
             }
         }
     }
 }
 
-void transform_fromhost_VkRenderPassCreateInfo2(
-    VkDecoderGlobalState* resourceTracker,
-    VkRenderPassCreateInfo2* toTransform)
-{
+void transform_fromhost_VkRenderPassCreateInfo2(VkDecoderGlobalState* resourceTracker,
+                                                VkRenderPassCreateInfo2* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pAttachments)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->attachmentCount; ++i)
-            {
-                transform_fromhost_VkAttachmentDescription2(resourceTracker, (VkAttachmentDescription2*)(toTransform->pAttachments + i));
+    if (toTransform) {
+        if (toTransform->pAttachments) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->attachmentCount; ++i) {
+                transform_fromhost_VkAttachmentDescription2(
+                    resourceTracker, (VkAttachmentDescription2*)(toTransform->pAttachments + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pSubpasses)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->subpassCount; ++i)
-            {
-                transform_fromhost_VkSubpassDescription2(resourceTracker, (VkSubpassDescription2*)(toTransform->pSubpasses + i));
+    if (toTransform) {
+        if (toTransform->pSubpasses) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->subpassCount; ++i) {
+                transform_fromhost_VkSubpassDescription2(
+                    resourceTracker, (VkSubpassDescription2*)(toTransform->pSubpasses + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pDependencies)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->dependencyCount; ++i)
-            {
-                transform_fromhost_VkSubpassDependency2(resourceTracker, (VkSubpassDependency2*)(toTransform->pDependencies + i));
+    if (toTransform) {
+        if (toTransform->pDependencies) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->dependencyCount; ++i) {
+                transform_fromhost_VkSubpassDependency2(
+                    resourceTracker, (VkSubpassDependency2*)(toTransform->pDependencies + i));
             }
         }
     }
 }
 
-void transform_tohost_VkSubpassBeginInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubpassBeginInfo* toTransform)
-{
+void transform_tohost_VkSubpassBeginInfo(VkDecoderGlobalState* resourceTracker,
+                                         VkSubpassBeginInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkSubpassBeginInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubpassBeginInfo* toTransform)
-{
+void transform_fromhost_VkSubpassBeginInfo(VkDecoderGlobalState* resourceTracker,
+                                           VkSubpassBeginInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkSubpassEndInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubpassEndInfo* toTransform)
-{
+void transform_tohost_VkSubpassEndInfo(VkDecoderGlobalState* resourceTracker,
+                                       VkSubpassEndInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkSubpassEndInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubpassEndInfo* toTransform)
-{
+void transform_fromhost_VkSubpassEndInfo(VkDecoderGlobalState* resourceTracker,
+                                         VkSubpassEndInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDevice8BitStorageFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevice8BitStorageFeatures* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDevice8BitStorageFeatures* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDevice8BitStorageFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevice8BitStorageFeatures* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDevice8BitStorageFeatures* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceDriverProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceDriverProperties* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceDriverProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkConformanceVersion(resourceTracker, (VkConformanceVersion*)(&toTransform->conformanceVersion));
+    transform_tohost_VkConformanceVersion(
+        resourceTracker, (VkConformanceVersion*)(&toTransform->conformanceVersion));
 }
 
 void transform_fromhost_VkPhysicalDeviceDriverProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceDriverProperties* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceDriverProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkConformanceVersion(resourceTracker, (VkConformanceVersion*)(&toTransform->conformanceVersion));
+    transform_fromhost_VkConformanceVersion(
+        resourceTracker, (VkConformanceVersion*)(&toTransform->conformanceVersion));
 }
 
 void transform_tohost_VkPhysicalDeviceShaderAtomicInt64Features(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderAtomicInt64Features* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceShaderAtomicInt64Features* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceShaderAtomicInt64Features(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderAtomicInt64Features* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceShaderAtomicInt64Features* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceShaderFloat16Int8Features(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderFloat16Int8Features* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceShaderFloat16Int8Features* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceShaderFloat16Int8Features(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderFloat16Int8Features* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceShaderFloat16Int8Features* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceFloatControlsProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceFloatControlsProperties* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceFloatControlsProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceFloatControlsProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceFloatControlsProperties* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceFloatControlsProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkDescriptorSetLayoutBindingFlagsCreateInfo(
     VkDecoderGlobalState* resourceTracker,
-    VkDescriptorSetLayoutBindingFlagsCreateInfo* toTransform)
-{
+    VkDescriptorSetLayoutBindingFlagsCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkDescriptorSetLayoutBindingFlagsCreateInfo(
     VkDecoderGlobalState* resourceTracker,
-    VkDescriptorSetLayoutBindingFlagsCreateInfo* toTransform)
-{
+    VkDescriptorSetLayoutBindingFlagsCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceDescriptorIndexingFeatures(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceDescriptorIndexingFeatures* toTransform)
-{
+    VkPhysicalDeviceDescriptorIndexingFeatures* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceDescriptorIndexingFeatures(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceDescriptorIndexingFeatures* toTransform)
-{
+    VkPhysicalDeviceDescriptorIndexingFeatures* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceDescriptorIndexingProperties(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceDescriptorIndexingProperties* toTransform)
-{
+    VkPhysicalDeviceDescriptorIndexingProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceDescriptorIndexingProperties(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceDescriptorIndexingProperties* toTransform)
-{
+    VkPhysicalDeviceDescriptorIndexingProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkDescriptorSetVariableDescriptorCountAllocateInfo(
     VkDecoderGlobalState* resourceTracker,
-    VkDescriptorSetVariableDescriptorCountAllocateInfo* toTransform)
-{
+    VkDescriptorSetVariableDescriptorCountAllocateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkDescriptorSetVariableDescriptorCountAllocateInfo(
     VkDecoderGlobalState* resourceTracker,
-    VkDescriptorSetVariableDescriptorCountAllocateInfo* toTransform)
-{
+    VkDescriptorSetVariableDescriptorCountAllocateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkDescriptorSetVariableDescriptorCountLayoutSupport(
     VkDecoderGlobalState* resourceTracker,
-    VkDescriptorSetVariableDescriptorCountLayoutSupport* toTransform)
-{
+    VkDescriptorSetVariableDescriptorCountLayoutSupport* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkDescriptorSetVariableDescriptorCountLayoutSupport(
     VkDecoderGlobalState* resourceTracker,
-    VkDescriptorSetVariableDescriptorCountLayoutSupport* toTransform)
-{
+    VkDescriptorSetVariableDescriptorCountLayoutSupport* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkSubpassDescriptionDepthStencilResolve(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubpassDescriptionDepthStencilResolve* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkSubpassDescriptionDepthStencilResolve* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pDepthStencilResolveAttachment)
-    {
-        transform_tohost_VkAttachmentReference2(resourceTracker, (VkAttachmentReference2*)(toTransform->pDepthStencilResolveAttachment));
+    if (toTransform->pDepthStencilResolveAttachment) {
+        transform_tohost_VkAttachmentReference2(
+            resourceTracker,
+            (VkAttachmentReference2*)(toTransform->pDepthStencilResolveAttachment));
     }
 }
 
 void transform_fromhost_VkSubpassDescriptionDepthStencilResolve(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubpassDescriptionDepthStencilResolve* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkSubpassDescriptionDepthStencilResolve* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pDepthStencilResolveAttachment)
-    {
-        transform_fromhost_VkAttachmentReference2(resourceTracker, (VkAttachmentReference2*)(toTransform->pDepthStencilResolveAttachment));
+    if (toTransform->pDepthStencilResolveAttachment) {
+        transform_fromhost_VkAttachmentReference2(
+            resourceTracker,
+            (VkAttachmentReference2*)(toTransform->pDepthStencilResolveAttachment));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceDepthStencilResolveProperties(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceDepthStencilResolveProperties* toTransform)
-{
+    VkPhysicalDeviceDepthStencilResolveProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceDepthStencilResolveProperties(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceDepthStencilResolveProperties* toTransform)
-{
+    VkPhysicalDeviceDepthStencilResolveProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceScalarBlockLayoutFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceScalarBlockLayoutFeatures* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceScalarBlockLayoutFeatures* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceScalarBlockLayoutFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceScalarBlockLayoutFeatures* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceScalarBlockLayoutFeatures* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkImageStencilUsageCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageStencilUsageCreateInfo* toTransform)
-{
+void transform_tohost_VkImageStencilUsageCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                    VkImageStencilUsageCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkImageStencilUsageCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageStencilUsageCreateInfo* toTransform)
-{
+void transform_fromhost_VkImageStencilUsageCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                      VkImageStencilUsageCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkSamplerReductionModeCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSamplerReductionModeCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkSamplerReductionModeCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkSamplerReductionModeCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSamplerReductionModeCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkSamplerReductionModeCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceSamplerFilterMinmaxProperties(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceSamplerFilterMinmaxProperties* toTransform)
-{
+    VkPhysicalDeviceSamplerFilterMinmaxProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceSamplerFilterMinmaxProperties(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceSamplerFilterMinmaxProperties* toTransform)
-{
+    VkPhysicalDeviceSamplerFilterMinmaxProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceVulkanMemoryModelFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceVulkanMemoryModelFeatures* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceVulkanMemoryModelFeatures* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceVulkanMemoryModelFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceVulkanMemoryModelFeatures* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceVulkanMemoryModelFeatures* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceImagelessFramebufferFeatures(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceImagelessFramebufferFeatures* toTransform)
-{
+    VkPhysicalDeviceImagelessFramebufferFeatures* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceImagelessFramebufferFeatures(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceImagelessFramebufferFeatures* toTransform)
-{
+    VkPhysicalDeviceImagelessFramebufferFeatures* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkFramebufferAttachmentImageInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkFramebufferAttachmentImageInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkFramebufferAttachmentImageInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkFramebufferAttachmentImageInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkFramebufferAttachmentImageInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkFramebufferAttachmentImageInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkFramebufferAttachmentsCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkFramebufferAttachmentsCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkFramebufferAttachmentsCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pAttachmentImageInfos)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->attachmentImageInfoCount; ++i)
-            {
-                transform_tohost_VkFramebufferAttachmentImageInfo(resourceTracker, (VkFramebufferAttachmentImageInfo*)(toTransform->pAttachmentImageInfos + i));
+    if (toTransform) {
+        if (toTransform->pAttachmentImageInfos) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->attachmentImageInfoCount; ++i) {
+                transform_tohost_VkFramebufferAttachmentImageInfo(
+                    resourceTracker,
+                    (VkFramebufferAttachmentImageInfo*)(toTransform->pAttachmentImageInfos + i));
             }
         }
     }
 }
 
 void transform_fromhost_VkFramebufferAttachmentsCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkFramebufferAttachmentsCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkFramebufferAttachmentsCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pAttachmentImageInfos)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->attachmentImageInfoCount; ++i)
-            {
-                transform_fromhost_VkFramebufferAttachmentImageInfo(resourceTracker, (VkFramebufferAttachmentImageInfo*)(toTransform->pAttachmentImageInfos + i));
+    if (toTransform) {
+        if (toTransform->pAttachmentImageInfos) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->attachmentImageInfoCount; ++i) {
+                transform_fromhost_VkFramebufferAttachmentImageInfo(
+                    resourceTracker,
+                    (VkFramebufferAttachmentImageInfo*)(toTransform->pAttachmentImageInfos + i));
             }
         }
     }
 }
 
 void transform_tohost_VkRenderPassAttachmentBeginInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkRenderPassAttachmentBeginInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkRenderPassAttachmentBeginInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkRenderPassAttachmentBeginInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkRenderPassAttachmentBeginInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkRenderPassAttachmentBeginInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceUniformBufferStandardLayoutFeatures* toTransform)
-{
+    VkPhysicalDeviceUniformBufferStandardLayoutFeatures* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceUniformBufferStandardLayoutFeatures* toTransform)
-{
+    VkPhysicalDeviceUniformBufferStandardLayoutFeatures* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* toTransform)
-{
+    VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* toTransform)
-{
+    VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* toTransform)
-{
+    VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* toTransform)
-{
+    VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkAttachmentReferenceStencilLayout(
-    VkDecoderGlobalState* resourceTracker,
-    VkAttachmentReferenceStencilLayout* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkAttachmentReferenceStencilLayout* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkAttachmentReferenceStencilLayout(
-    VkDecoderGlobalState* resourceTracker,
-    VkAttachmentReferenceStencilLayout* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkAttachmentReferenceStencilLayout* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkAttachmentDescriptionStencilLayout(
-    VkDecoderGlobalState* resourceTracker,
-    VkAttachmentDescriptionStencilLayout* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkAttachmentDescriptionStencilLayout* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkAttachmentDescriptionStencilLayout(
-    VkDecoderGlobalState* resourceTracker,
-    VkAttachmentDescriptionStencilLayout* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkAttachmentDescriptionStencilLayout* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceHostQueryResetFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceHostQueryResetFeatures* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceHostQueryResetFeatures* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceHostQueryResetFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceHostQueryResetFeatures* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceHostQueryResetFeatures* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceTimelineSemaphoreFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceTimelineSemaphoreFeatures* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceTimelineSemaphoreFeatures* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceTimelineSemaphoreFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceTimelineSemaphoreFeatures* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceTimelineSemaphoreFeatures* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceTimelineSemaphoreProperties(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceTimelineSemaphoreProperties* toTransform)
-{
+    VkPhysicalDeviceTimelineSemaphoreProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceTimelineSemaphoreProperties(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceTimelineSemaphoreProperties* toTransform)
-{
+    VkPhysicalDeviceTimelineSemaphoreProperties* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkSemaphoreTypeCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSemaphoreTypeCreateInfo* toTransform)
-{
+void transform_tohost_VkSemaphoreTypeCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                VkSemaphoreTypeCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkSemaphoreTypeCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSemaphoreTypeCreateInfo* toTransform)
-{
+void transform_fromhost_VkSemaphoreTypeCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                  VkSemaphoreTypeCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkTimelineSemaphoreSubmitInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkTimelineSemaphoreSubmitInfo* toTransform)
-{
+void transform_tohost_VkTimelineSemaphoreSubmitInfo(VkDecoderGlobalState* resourceTracker,
+                                                    VkTimelineSemaphoreSubmitInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkTimelineSemaphoreSubmitInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkTimelineSemaphoreSubmitInfo* toTransform)
-{
+void transform_fromhost_VkTimelineSemaphoreSubmitInfo(VkDecoderGlobalState* resourceTracker,
+                                                      VkTimelineSemaphoreSubmitInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkSemaphoreWaitInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSemaphoreWaitInfo* toTransform)
-{
+void transform_tohost_VkSemaphoreWaitInfo(VkDecoderGlobalState* resourceTracker,
+                                          VkSemaphoreWaitInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkSemaphoreWaitInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSemaphoreWaitInfo* toTransform)
-{
+void transform_fromhost_VkSemaphoreWaitInfo(VkDecoderGlobalState* resourceTracker,
+                                            VkSemaphoreWaitInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkSemaphoreSignalInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSemaphoreSignalInfo* toTransform)
-{
+void transform_tohost_VkSemaphoreSignalInfo(VkDecoderGlobalState* resourceTracker,
+                                            VkSemaphoreSignalInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkSemaphoreSignalInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSemaphoreSignalInfo* toTransform)
-{
+void transform_fromhost_VkSemaphoreSignalInfo(VkDecoderGlobalState* resourceTracker,
+                                              VkSemaphoreSignalInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceBufferDeviceAddressFeatures(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceBufferDeviceAddressFeatures* toTransform)
-{
+    VkPhysicalDeviceBufferDeviceAddressFeatures* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceBufferDeviceAddressFeatures(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceBufferDeviceAddressFeatures* toTransform)
-{
+    VkPhysicalDeviceBufferDeviceAddressFeatures* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkBufferDeviceAddressInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferDeviceAddressInfo* toTransform)
-{
+void transform_tohost_VkBufferDeviceAddressInfo(VkDecoderGlobalState* resourceTracker,
+                                                VkBufferDeviceAddressInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkBufferDeviceAddressInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferDeviceAddressInfo* toTransform)
-{
+void transform_fromhost_VkBufferDeviceAddressInfo(VkDecoderGlobalState* resourceTracker,
+                                                  VkBufferDeviceAddressInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkBufferOpaqueCaptureAddressCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferOpaqueCaptureAddressCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkBufferOpaqueCaptureAddressCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkBufferOpaqueCaptureAddressCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferOpaqueCaptureAddressCreateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkBufferOpaqueCaptureAddressCreateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkMemoryOpaqueCaptureAddressAllocateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryOpaqueCaptureAddressAllocateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkMemoryOpaqueCaptureAddressAllocateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkMemoryOpaqueCaptureAddressAllocateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryOpaqueCaptureAddressAllocateInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkMemoryOpaqueCaptureAddressAllocateInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkDeviceMemoryOpaqueCaptureAddressInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceMemoryOpaqueCaptureAddressInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDeviceMemoryOpaqueCaptureAddressInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
-    if (toTransform->pNext)
-    {
+    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)&toTransform->memory, 1,
+                                                  (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr,
+                                                  0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkDeviceMemoryOpaqueCaptureAddressInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceMemoryOpaqueCaptureAddressInfo* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDeviceMemoryOpaqueCaptureAddressInfo* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    resourceTracker->deviceMemoryTransform_fromhost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
-    if (toTransform->pNext)
-    {
+    resourceTracker->deviceMemoryTransform_fromhost(
+        (VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr,
+        0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_KHR_surface
-void transform_tohost_VkSurfaceCapabilitiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSurfaceCapabilitiesKHR* toTransform)
-{
+void transform_tohost_VkSurfaceCapabilitiesKHR(VkDecoderGlobalState* resourceTracker,
+                                               VkSurfaceCapabilitiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
     transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->currentExtent));
@@ -6057,10 +4820,8 @@
     transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxImageExtent));
 }
 
-void transform_fromhost_VkSurfaceCapabilitiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSurfaceCapabilitiesKHR* toTransform)
-{
+void transform_fromhost_VkSurfaceCapabilitiesKHR(VkDecoderGlobalState* resourceTracker,
+                                                 VkSurfaceCapabilitiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
     transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->currentExtent));
@@ -6068,286 +4829,222 @@
     transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxImageExtent));
 }
 
-void transform_tohost_VkSurfaceFormatKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSurfaceFormatKHR* toTransform)
-{
+void transform_tohost_VkSurfaceFormatKHR(VkDecoderGlobalState* resourceTracker,
+                                         VkSurfaceFormatKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkSurfaceFormatKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSurfaceFormatKHR* toTransform)
-{
+void transform_fromhost_VkSurfaceFormatKHR(VkDecoderGlobalState* resourceTracker,
+                                           VkSurfaceFormatKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 #endif
 #ifdef VK_KHR_swapchain
-void transform_tohost_VkSwapchainCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSwapchainCreateInfoKHR* toTransform)
-{
+void transform_tohost_VkSwapchainCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                               VkSwapchainCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
     transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->imageExtent));
 }
 
-void transform_fromhost_VkSwapchainCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSwapchainCreateInfoKHR* toTransform)
-{
+void transform_fromhost_VkSwapchainCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                 VkSwapchainCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
     transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->imageExtent));
 }
 
-void transform_tohost_VkPresentInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPresentInfoKHR* toTransform)
-{
+void transform_tohost_VkPresentInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                       VkPresentInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkPresentInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPresentInfoKHR* toTransform)
-{
+void transform_fromhost_VkPresentInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                         VkPresentInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkImageSwapchainCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageSwapchainCreateInfoKHR* toTransform)
-{
+void transform_tohost_VkImageSwapchainCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkImageSwapchainCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkImageSwapchainCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageSwapchainCreateInfoKHR* toTransform)
-{
+void transform_fromhost_VkImageSwapchainCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                      VkImageSwapchainCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkBindImageMemorySwapchainInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindImageMemorySwapchainInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkBindImageMemorySwapchainInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkBindImageMemorySwapchainInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindImageMemorySwapchainInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkBindImageMemorySwapchainInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkAcquireNextImageInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAcquireNextImageInfoKHR* toTransform)
-{
+void transform_tohost_VkAcquireNextImageInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                VkAcquireNextImageInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkAcquireNextImageInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAcquireNextImageInfoKHR* toTransform)
-{
+void transform_fromhost_VkAcquireNextImageInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                  VkAcquireNextImageInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkDeviceGroupPresentCapabilitiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceGroupPresentCapabilitiesKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDeviceGroupPresentCapabilitiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkDeviceGroupPresentCapabilitiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceGroupPresentCapabilitiesKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDeviceGroupPresentCapabilitiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkDeviceGroupPresentInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceGroupPresentInfoKHR* toTransform)
-{
+void transform_tohost_VkDeviceGroupPresentInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                  VkDeviceGroupPresentInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkDeviceGroupPresentInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceGroupPresentInfoKHR* toTransform)
-{
+void transform_fromhost_VkDeviceGroupPresentInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkDeviceGroupPresentInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkDeviceGroupSwapchainCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceGroupSwapchainCreateInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDeviceGroupSwapchainCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkDeviceGroupSwapchainCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceGroupSwapchainCreateInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDeviceGroupSwapchainCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_KHR_display
-void transform_tohost_VkDisplayModeParametersKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayModeParametersKHR* toTransform)
-{
+void transform_tohost_VkDisplayModeParametersKHR(VkDecoderGlobalState* resourceTracker,
+                                                 VkDisplayModeParametersKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
     transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->visibleRegion));
 }
 
-void transform_fromhost_VkDisplayModeParametersKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayModeParametersKHR* toTransform)
-{
+void transform_fromhost_VkDisplayModeParametersKHR(VkDecoderGlobalState* resourceTracker,
+                                                   VkDisplayModeParametersKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
     transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->visibleRegion));
 }
 
-void transform_tohost_VkDisplayModeCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayModeCreateInfoKHR* toTransform)
-{
+void transform_tohost_VkDisplayModeCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                 VkDisplayModeCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkDisplayModeParametersKHR(resourceTracker, (VkDisplayModeParametersKHR*)(&toTransform->parameters));
+    transform_tohost_VkDisplayModeParametersKHR(
+        resourceTracker, (VkDisplayModeParametersKHR*)(&toTransform->parameters));
 }
 
-void transform_fromhost_VkDisplayModeCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayModeCreateInfoKHR* toTransform)
-{
+void transform_fromhost_VkDisplayModeCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                   VkDisplayModeCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkDisplayModeParametersKHR(resourceTracker, (VkDisplayModeParametersKHR*)(&toTransform->parameters));
+    transform_fromhost_VkDisplayModeParametersKHR(
+        resourceTracker, (VkDisplayModeParametersKHR*)(&toTransform->parameters));
 }
 
-void transform_tohost_VkDisplayModePropertiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayModePropertiesKHR* toTransform)
-{
+void transform_tohost_VkDisplayModePropertiesKHR(VkDecoderGlobalState* resourceTracker,
+                                                 VkDisplayModePropertiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_tohost_VkDisplayModeParametersKHR(resourceTracker, (VkDisplayModeParametersKHR*)(&toTransform->parameters));
+    transform_tohost_VkDisplayModeParametersKHR(
+        resourceTracker, (VkDisplayModeParametersKHR*)(&toTransform->parameters));
 }
 
-void transform_fromhost_VkDisplayModePropertiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayModePropertiesKHR* toTransform)
-{
+void transform_fromhost_VkDisplayModePropertiesKHR(VkDecoderGlobalState* resourceTracker,
+                                                   VkDisplayModePropertiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_fromhost_VkDisplayModeParametersKHR(resourceTracker, (VkDisplayModeParametersKHR*)(&toTransform->parameters));
+    transform_fromhost_VkDisplayModeParametersKHR(
+        resourceTracker, (VkDisplayModeParametersKHR*)(&toTransform->parameters));
 }
 
-void transform_tohost_VkDisplayPlaneCapabilitiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayPlaneCapabilitiesKHR* toTransform)
-{
+void transform_tohost_VkDisplayPlaneCapabilitiesKHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkDisplayPlaneCapabilitiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
     transform_tohost_VkOffset2D(resourceTracker, (VkOffset2D*)(&toTransform->minSrcPosition));
@@ -6360,10 +5057,8 @@
     transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxDstExtent));
 }
 
-void transform_fromhost_VkDisplayPlaneCapabilitiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayPlaneCapabilitiesKHR* toTransform)
-{
+void transform_fromhost_VkDisplayPlaneCapabilitiesKHR(VkDecoderGlobalState* resourceTracker,
+                                                      VkDisplayPlaneCapabilitiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
     transform_fromhost_VkOffset2D(resourceTracker, (VkOffset2D*)(&toTransform->minSrcPosition));
@@ -6376,63 +5071,49 @@
     transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxDstExtent));
 }
 
-void transform_tohost_VkDisplayPlanePropertiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayPlanePropertiesKHR* toTransform)
-{
+void transform_tohost_VkDisplayPlanePropertiesKHR(VkDecoderGlobalState* resourceTracker,
+                                                  VkDisplayPlanePropertiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkDisplayPlanePropertiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayPlanePropertiesKHR* toTransform)
-{
+void transform_fromhost_VkDisplayPlanePropertiesKHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkDisplayPlanePropertiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkDisplayPropertiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayPropertiesKHR* toTransform)
-{
+void transform_tohost_VkDisplayPropertiesKHR(VkDecoderGlobalState* resourceTracker,
+                                             VkDisplayPropertiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
     transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->physicalDimensions));
     transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->physicalResolution));
 }
 
-void transform_fromhost_VkDisplayPropertiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayPropertiesKHR* toTransform)
-{
+void transform_fromhost_VkDisplayPropertiesKHR(VkDecoderGlobalState* resourceTracker,
+                                               VkDisplayPropertiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
     transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->physicalDimensions));
     transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->physicalResolution));
 }
 
-void transform_tohost_VkDisplaySurfaceCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplaySurfaceCreateInfoKHR* toTransform)
-{
+void transform_tohost_VkDisplaySurfaceCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkDisplaySurfaceCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
     transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->imageExtent));
 }
 
-void transform_fromhost_VkDisplaySurfaceCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplaySurfaceCreateInfoKHR* toTransform)
-{
+void transform_fromhost_VkDisplaySurfaceCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                      VkDisplaySurfaceCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
     transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->imageExtent));
@@ -6440,28 +5121,22 @@
 
 #endif
 #ifdef VK_KHR_display_swapchain
-void transform_tohost_VkDisplayPresentInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayPresentInfoKHR* toTransform)
-{
+void transform_tohost_VkDisplayPresentInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                              VkDisplayPresentInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
     transform_tohost_VkRect2D(resourceTracker, (VkRect2D*)(&toTransform->srcRect));
     transform_tohost_VkRect2D(resourceTracker, (VkRect2D*)(&toTransform->dstRect));
 }
 
-void transform_fromhost_VkDisplayPresentInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayPresentInfoKHR* toTransform)
-{
+void transform_fromhost_VkDisplayPresentInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                VkDisplayPresentInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
     transform_fromhost_VkRect2D(resourceTracker, (VkRect2D*)(&toTransform->srcRect));
@@ -6470,130 +5145,100 @@
 
 #endif
 #ifdef VK_KHR_xlib_surface
-void transform_tohost_VkXlibSurfaceCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkXlibSurfaceCreateInfoKHR* toTransform)
-{
+void transform_tohost_VkXlibSurfaceCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                 VkXlibSurfaceCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkXlibSurfaceCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkXlibSurfaceCreateInfoKHR* toTransform)
-{
+void transform_fromhost_VkXlibSurfaceCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                   VkXlibSurfaceCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_KHR_xcb_surface
-void transform_tohost_VkXcbSurfaceCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkXcbSurfaceCreateInfoKHR* toTransform)
-{
+void transform_tohost_VkXcbSurfaceCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                VkXcbSurfaceCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkXcbSurfaceCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkXcbSurfaceCreateInfoKHR* toTransform)
-{
+void transform_fromhost_VkXcbSurfaceCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                  VkXcbSurfaceCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_KHR_wayland_surface
-void transform_tohost_VkWaylandSurfaceCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkWaylandSurfaceCreateInfoKHR* toTransform)
-{
+void transform_tohost_VkWaylandSurfaceCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkWaylandSurfaceCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkWaylandSurfaceCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkWaylandSurfaceCreateInfoKHR* toTransform)
-{
+void transform_fromhost_VkWaylandSurfaceCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                      VkWaylandSurfaceCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_KHR_android_surface
-void transform_tohost_VkAndroidSurfaceCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAndroidSurfaceCreateInfoKHR* toTransform)
-{
+void transform_tohost_VkAndroidSurfaceCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkAndroidSurfaceCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkAndroidSurfaceCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAndroidSurfaceCreateInfoKHR* toTransform)
-{
+void transform_fromhost_VkAndroidSurfaceCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                      VkAndroidSurfaceCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_KHR_win32_surface
-void transform_tohost_VkWin32SurfaceCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkWin32SurfaceCreateInfoKHR* toTransform)
-{
+void transform_tohost_VkWin32SurfaceCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                  VkWin32SurfaceCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkWin32SurfaceCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkWin32SurfaceCreateInfoKHR* toTransform)
-{
+void transform_fromhost_VkWin32SurfaceCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkWin32SurfaceCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -6603,516 +5248,410 @@
 #endif
 #ifdef VK_KHR_video_queue
 void transform_tohost_VkVideoQueueFamilyProperties2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoQueueFamilyProperties2KHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoQueueFamilyProperties2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkVideoQueueFamilyProperties2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoQueueFamilyProperties2KHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoQueueFamilyProperties2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkVideoProfileKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoProfileKHR* toTransform)
-{
+void transform_tohost_VkVideoProfileKHR(VkDecoderGlobalState* resourceTracker,
+                                        VkVideoProfileKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkVideoProfileKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoProfileKHR* toTransform)
-{
+void transform_fromhost_VkVideoProfileKHR(VkDecoderGlobalState* resourceTracker,
+                                          VkVideoProfileKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkVideoProfilesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoProfilesKHR* toTransform)
-{
+void transform_tohost_VkVideoProfilesKHR(VkDecoderGlobalState* resourceTracker,
+                                         VkVideoProfilesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pProfiles)
-    {
-        transform_tohost_VkVideoProfileKHR(resourceTracker, (VkVideoProfileKHR*)(toTransform->pProfiles));
+    if (toTransform->pProfiles) {
+        transform_tohost_VkVideoProfileKHR(resourceTracker,
+                                           (VkVideoProfileKHR*)(toTransform->pProfiles));
     }
 }
 
-void transform_fromhost_VkVideoProfilesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoProfilesKHR* toTransform)
-{
+void transform_fromhost_VkVideoProfilesKHR(VkDecoderGlobalState* resourceTracker,
+                                           VkVideoProfilesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pProfiles)
-    {
-        transform_fromhost_VkVideoProfileKHR(resourceTracker, (VkVideoProfileKHR*)(toTransform->pProfiles));
+    if (toTransform->pProfiles) {
+        transform_fromhost_VkVideoProfileKHR(resourceTracker,
+                                             (VkVideoProfileKHR*)(toTransform->pProfiles));
     }
 }
 
-void transform_tohost_VkVideoCapabilitiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoCapabilitiesKHR* toTransform)
-{
+void transform_tohost_VkVideoCapabilitiesKHR(VkDecoderGlobalState* resourceTracker,
+                                             VkVideoCapabilitiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->videoPictureExtentGranularity));
+    transform_tohost_VkExtent2D(resourceTracker,
+                                (VkExtent2D*)(&toTransform->videoPictureExtentGranularity));
     transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->minExtent));
     transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxExtent));
 }
 
-void transform_fromhost_VkVideoCapabilitiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoCapabilitiesKHR* toTransform)
-{
+void transform_fromhost_VkVideoCapabilitiesKHR(VkDecoderGlobalState* resourceTracker,
+                                               VkVideoCapabilitiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->videoPictureExtentGranularity));
+    transform_fromhost_VkExtent2D(resourceTracker,
+                                  (VkExtent2D*)(&toTransform->videoPictureExtentGranularity));
     transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->minExtent));
     transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxExtent));
 }
 
 void transform_tohost_VkPhysicalDeviceVideoFormatInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceVideoFormatInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceVideoFormatInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pVideoProfiles)
-    {
-        transform_tohost_VkVideoProfilesKHR(resourceTracker, (VkVideoProfilesKHR*)(toTransform->pVideoProfiles));
+    if (toTransform->pVideoProfiles) {
+        transform_tohost_VkVideoProfilesKHR(resourceTracker,
+                                            (VkVideoProfilesKHR*)(toTransform->pVideoProfiles));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceVideoFormatInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceVideoFormatInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceVideoFormatInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pVideoProfiles)
-    {
-        transform_fromhost_VkVideoProfilesKHR(resourceTracker, (VkVideoProfilesKHR*)(toTransform->pVideoProfiles));
+    if (toTransform->pVideoProfiles) {
+        transform_fromhost_VkVideoProfilesKHR(resourceTracker,
+                                              (VkVideoProfilesKHR*)(toTransform->pVideoProfiles));
     }
 }
 
-void transform_tohost_VkVideoFormatPropertiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoFormatPropertiesKHR* toTransform)
-{
+void transform_tohost_VkVideoFormatPropertiesKHR(VkDecoderGlobalState* resourceTracker,
+                                                 VkVideoFormatPropertiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkVideoFormatPropertiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoFormatPropertiesKHR* toTransform)
-{
+void transform_fromhost_VkVideoFormatPropertiesKHR(VkDecoderGlobalState* resourceTracker,
+                                                   VkVideoFormatPropertiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkVideoPictureResourceKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoPictureResourceKHR* toTransform)
-{
+void transform_tohost_VkVideoPictureResourceKHR(VkDecoderGlobalState* resourceTracker,
+                                                VkVideoPictureResourceKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
     transform_tohost_VkOffset2D(resourceTracker, (VkOffset2D*)(&toTransform->codedOffset));
     transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->codedExtent));
 }
 
-void transform_fromhost_VkVideoPictureResourceKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoPictureResourceKHR* toTransform)
-{
+void transform_fromhost_VkVideoPictureResourceKHR(VkDecoderGlobalState* resourceTracker,
+                                                  VkVideoPictureResourceKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
     transform_fromhost_VkOffset2D(resourceTracker, (VkOffset2D*)(&toTransform->codedOffset));
     transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->codedExtent));
 }
 
-void transform_tohost_VkVideoReferenceSlotKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoReferenceSlotKHR* toTransform)
-{
+void transform_tohost_VkVideoReferenceSlotKHR(VkDecoderGlobalState* resourceTracker,
+                                              VkVideoReferenceSlotKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pPictureResource)
-    {
-        transform_tohost_VkVideoPictureResourceKHR(resourceTracker, (VkVideoPictureResourceKHR*)(toTransform->pPictureResource));
+    if (toTransform->pPictureResource) {
+        transform_tohost_VkVideoPictureResourceKHR(
+            resourceTracker, (VkVideoPictureResourceKHR*)(toTransform->pPictureResource));
     }
 }
 
-void transform_fromhost_VkVideoReferenceSlotKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoReferenceSlotKHR* toTransform)
-{
+void transform_fromhost_VkVideoReferenceSlotKHR(VkDecoderGlobalState* resourceTracker,
+                                                VkVideoReferenceSlotKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pPictureResource)
-    {
-        transform_fromhost_VkVideoPictureResourceKHR(resourceTracker, (VkVideoPictureResourceKHR*)(toTransform->pPictureResource));
+    if (toTransform->pPictureResource) {
+        transform_fromhost_VkVideoPictureResourceKHR(
+            resourceTracker, (VkVideoPictureResourceKHR*)(toTransform->pPictureResource));
     }
 }
 
-void transform_tohost_VkVideoGetMemoryPropertiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoGetMemoryPropertiesKHR* toTransform)
-{
+void transform_tohost_VkVideoGetMemoryPropertiesKHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkVideoGetMemoryPropertiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pMemoryRequirements)
-    {
-        transform_tohost_VkMemoryRequirements2(resourceTracker, (VkMemoryRequirements2*)(toTransform->pMemoryRequirements));
+    if (toTransform->pMemoryRequirements) {
+        transform_tohost_VkMemoryRequirements2(
+            resourceTracker, (VkMemoryRequirements2*)(toTransform->pMemoryRequirements));
     }
 }
 
-void transform_fromhost_VkVideoGetMemoryPropertiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoGetMemoryPropertiesKHR* toTransform)
-{
+void transform_fromhost_VkVideoGetMemoryPropertiesKHR(VkDecoderGlobalState* resourceTracker,
+                                                      VkVideoGetMemoryPropertiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pMemoryRequirements)
-    {
-        transform_fromhost_VkMemoryRequirements2(resourceTracker, (VkMemoryRequirements2*)(toTransform->pMemoryRequirements));
+    if (toTransform->pMemoryRequirements) {
+        transform_fromhost_VkMemoryRequirements2(
+            resourceTracker, (VkMemoryRequirements2*)(toTransform->pMemoryRequirements));
     }
 }
 
-void transform_tohost_VkVideoBindMemoryKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoBindMemoryKHR* toTransform)
-{
+void transform_tohost_VkVideoBindMemoryKHR(VkDecoderGlobalState* resourceTracker,
+                                           VkVideoBindMemoryKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkVideoBindMemoryKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoBindMemoryKHR* toTransform)
-{
+void transform_fromhost_VkVideoBindMemoryKHR(VkDecoderGlobalState* resourceTracker,
+                                             VkVideoBindMemoryKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkVideoSessionCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoSessionCreateInfoKHR* toTransform)
-{
+void transform_tohost_VkVideoSessionCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                  VkVideoSessionCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pVideoProfile)
-    {
-        transform_tohost_VkVideoProfileKHR(resourceTracker, (VkVideoProfileKHR*)(toTransform->pVideoProfile));
+    if (toTransform->pVideoProfile) {
+        transform_tohost_VkVideoProfileKHR(resourceTracker,
+                                           (VkVideoProfileKHR*)(toTransform->pVideoProfile));
     }
     transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxCodedExtent));
 }
 
-void transform_fromhost_VkVideoSessionCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoSessionCreateInfoKHR* toTransform)
-{
+void transform_fromhost_VkVideoSessionCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkVideoSessionCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pVideoProfile)
-    {
-        transform_fromhost_VkVideoProfileKHR(resourceTracker, (VkVideoProfileKHR*)(toTransform->pVideoProfile));
+    if (toTransform->pVideoProfile) {
+        transform_fromhost_VkVideoProfileKHR(resourceTracker,
+                                             (VkVideoProfileKHR*)(toTransform->pVideoProfile));
     }
     transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxCodedExtent));
 }
 
 void transform_tohost_VkVideoSessionParametersCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoSessionParametersCreateInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoSessionParametersCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkVideoSessionParametersCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoSessionParametersCreateInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoSessionParametersCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkVideoSessionParametersUpdateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoSessionParametersUpdateInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoSessionParametersUpdateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkVideoSessionParametersUpdateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoSessionParametersUpdateInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoSessionParametersUpdateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkVideoBeginCodingInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoBeginCodingInfoKHR* toTransform)
-{
+void transform_tohost_VkVideoBeginCodingInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                VkVideoBeginCodingInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pReferenceSlots)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->referenceSlotCount; ++i)
-            {
-                transform_tohost_VkVideoReferenceSlotKHR(resourceTracker, (VkVideoReferenceSlotKHR*)(toTransform->pReferenceSlots + i));
+    if (toTransform) {
+        if (toTransform->pReferenceSlots) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->referenceSlotCount; ++i) {
+                transform_tohost_VkVideoReferenceSlotKHR(
+                    resourceTracker, (VkVideoReferenceSlotKHR*)(toTransform->pReferenceSlots + i));
             }
         }
     }
 }
 
-void transform_fromhost_VkVideoBeginCodingInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoBeginCodingInfoKHR* toTransform)
-{
+void transform_fromhost_VkVideoBeginCodingInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                  VkVideoBeginCodingInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pReferenceSlots)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->referenceSlotCount; ++i)
-            {
-                transform_fromhost_VkVideoReferenceSlotKHR(resourceTracker, (VkVideoReferenceSlotKHR*)(toTransform->pReferenceSlots + i));
+    if (toTransform) {
+        if (toTransform->pReferenceSlots) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->referenceSlotCount; ++i) {
+                transform_fromhost_VkVideoReferenceSlotKHR(
+                    resourceTracker, (VkVideoReferenceSlotKHR*)(toTransform->pReferenceSlots + i));
             }
         }
     }
 }
 
-void transform_tohost_VkVideoEndCodingInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEndCodingInfoKHR* toTransform)
-{
+void transform_tohost_VkVideoEndCodingInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                              VkVideoEndCodingInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkVideoEndCodingInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEndCodingInfoKHR* toTransform)
-{
+void transform_fromhost_VkVideoEndCodingInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                VkVideoEndCodingInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkVideoCodingControlInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoCodingControlInfoKHR* toTransform)
-{
+void transform_tohost_VkVideoCodingControlInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                  VkVideoCodingControlInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkVideoCodingControlInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoCodingControlInfoKHR* toTransform)
-{
+void transform_fromhost_VkVideoCodingControlInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkVideoCodingControlInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_KHR_video_decode_queue
-void transform_tohost_VkVideoDecodeInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeInfoKHR* toTransform)
-{
+void transform_tohost_VkVideoDecodeInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                           VkVideoDecodeInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
     transform_tohost_VkOffset2D(resourceTracker, (VkOffset2D*)(&toTransform->codedOffset));
     transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->codedExtent));
-    transform_tohost_VkVideoPictureResourceKHR(resourceTracker, (VkVideoPictureResourceKHR*)(&toTransform->dstPictureResource));
-    if (toTransform->pSetupReferenceSlot)
-    {
-        transform_tohost_VkVideoReferenceSlotKHR(resourceTracker, (VkVideoReferenceSlotKHR*)(toTransform->pSetupReferenceSlot));
+    transform_tohost_VkVideoPictureResourceKHR(
+        resourceTracker, (VkVideoPictureResourceKHR*)(&toTransform->dstPictureResource));
+    if (toTransform->pSetupReferenceSlot) {
+        transform_tohost_VkVideoReferenceSlotKHR(
+            resourceTracker, (VkVideoReferenceSlotKHR*)(toTransform->pSetupReferenceSlot));
     }
-    if (toTransform)
-    {
-        if (toTransform->pReferenceSlots)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->referenceSlotCount; ++i)
-            {
-                transform_tohost_VkVideoReferenceSlotKHR(resourceTracker, (VkVideoReferenceSlotKHR*)(toTransform->pReferenceSlots + i));
+    if (toTransform) {
+        if (toTransform->pReferenceSlots) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->referenceSlotCount; ++i) {
+                transform_tohost_VkVideoReferenceSlotKHR(
+                    resourceTracker, (VkVideoReferenceSlotKHR*)(toTransform->pReferenceSlots + i));
             }
         }
     }
 }
 
-void transform_fromhost_VkVideoDecodeInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeInfoKHR* toTransform)
-{
+void transform_fromhost_VkVideoDecodeInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                             VkVideoDecodeInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
     transform_fromhost_VkOffset2D(resourceTracker, (VkOffset2D*)(&toTransform->codedOffset));
     transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->codedExtent));
-    transform_fromhost_VkVideoPictureResourceKHR(resourceTracker, (VkVideoPictureResourceKHR*)(&toTransform->dstPictureResource));
-    if (toTransform->pSetupReferenceSlot)
-    {
-        transform_fromhost_VkVideoReferenceSlotKHR(resourceTracker, (VkVideoReferenceSlotKHR*)(toTransform->pSetupReferenceSlot));
+    transform_fromhost_VkVideoPictureResourceKHR(
+        resourceTracker, (VkVideoPictureResourceKHR*)(&toTransform->dstPictureResource));
+    if (toTransform->pSetupReferenceSlot) {
+        transform_fromhost_VkVideoReferenceSlotKHR(
+            resourceTracker, (VkVideoReferenceSlotKHR*)(toTransform->pSetupReferenceSlot));
     }
-    if (toTransform)
-    {
-        if (toTransform->pReferenceSlots)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->referenceSlotCount; ++i)
-            {
-                transform_fromhost_VkVideoReferenceSlotKHR(resourceTracker, (VkVideoReferenceSlotKHR*)(toTransform->pReferenceSlots + i));
+    if (toTransform) {
+        if (toTransform->pReferenceSlots) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->referenceSlotCount; ++i) {
+                transform_fromhost_VkVideoReferenceSlotKHR(
+                    resourceTracker, (VkVideoReferenceSlotKHR*)(toTransform->pReferenceSlots + i));
             }
         }
     }
@@ -7120,260 +5659,214 @@
 
 #endif
 #ifdef VK_KHR_dynamic_rendering
-void transform_tohost_VkRenderingAttachmentInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkRenderingAttachmentInfoKHR* toTransform)
-{
+void transform_tohost_VkRenderingAttachmentInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                   VkRenderingAttachmentInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
     transform_tohost_VkClearValue(resourceTracker, (VkClearValue*)(&toTransform->clearValue));
 }
 
-void transform_fromhost_VkRenderingAttachmentInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkRenderingAttachmentInfoKHR* toTransform)
-{
+void transform_fromhost_VkRenderingAttachmentInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                     VkRenderingAttachmentInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
     transform_fromhost_VkClearValue(resourceTracker, (VkClearValue*)(&toTransform->clearValue));
 }
 
-void transform_tohost_VkRenderingInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkRenderingInfoKHR* toTransform)
-{
+void transform_tohost_VkRenderingInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                         VkRenderingInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
     transform_tohost_VkRect2D(resourceTracker, (VkRect2D*)(&toTransform->renderArea));
-    if (toTransform)
-    {
-        if (toTransform->pColorAttachments)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->colorAttachmentCount; ++i)
-            {
-                transform_tohost_VkRenderingAttachmentInfoKHR(resourceTracker, (VkRenderingAttachmentInfoKHR*)(toTransform->pColorAttachments + i));
+    if (toTransform) {
+        if (toTransform->pColorAttachments) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->colorAttachmentCount; ++i) {
+                transform_tohost_VkRenderingAttachmentInfoKHR(
+                    resourceTracker,
+                    (VkRenderingAttachmentInfoKHR*)(toTransform->pColorAttachments + i));
             }
         }
     }
-    if (toTransform->pDepthAttachment)
-    {
-        transform_tohost_VkRenderingAttachmentInfoKHR(resourceTracker, (VkRenderingAttachmentInfoKHR*)(toTransform->pDepthAttachment));
+    if (toTransform->pDepthAttachment) {
+        transform_tohost_VkRenderingAttachmentInfoKHR(
+            resourceTracker, (VkRenderingAttachmentInfoKHR*)(toTransform->pDepthAttachment));
     }
-    if (toTransform->pStencilAttachment)
-    {
-        transform_tohost_VkRenderingAttachmentInfoKHR(resourceTracker, (VkRenderingAttachmentInfoKHR*)(toTransform->pStencilAttachment));
+    if (toTransform->pStencilAttachment) {
+        transform_tohost_VkRenderingAttachmentInfoKHR(
+            resourceTracker, (VkRenderingAttachmentInfoKHR*)(toTransform->pStencilAttachment));
     }
 }
 
-void transform_fromhost_VkRenderingInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkRenderingInfoKHR* toTransform)
-{
+void transform_fromhost_VkRenderingInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                           VkRenderingInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
     transform_fromhost_VkRect2D(resourceTracker, (VkRect2D*)(&toTransform->renderArea));
-    if (toTransform)
-    {
-        if (toTransform->pColorAttachments)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->colorAttachmentCount; ++i)
-            {
-                transform_fromhost_VkRenderingAttachmentInfoKHR(resourceTracker, (VkRenderingAttachmentInfoKHR*)(toTransform->pColorAttachments + i));
+    if (toTransform) {
+        if (toTransform->pColorAttachments) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->colorAttachmentCount; ++i) {
+                transform_fromhost_VkRenderingAttachmentInfoKHR(
+                    resourceTracker,
+                    (VkRenderingAttachmentInfoKHR*)(toTransform->pColorAttachments + i));
             }
         }
     }
-    if (toTransform->pDepthAttachment)
-    {
-        transform_fromhost_VkRenderingAttachmentInfoKHR(resourceTracker, (VkRenderingAttachmentInfoKHR*)(toTransform->pDepthAttachment));
+    if (toTransform->pDepthAttachment) {
+        transform_fromhost_VkRenderingAttachmentInfoKHR(
+            resourceTracker, (VkRenderingAttachmentInfoKHR*)(toTransform->pDepthAttachment));
     }
-    if (toTransform->pStencilAttachment)
-    {
-        transform_fromhost_VkRenderingAttachmentInfoKHR(resourceTracker, (VkRenderingAttachmentInfoKHR*)(toTransform->pStencilAttachment));
+    if (toTransform->pStencilAttachment) {
+        transform_fromhost_VkRenderingAttachmentInfoKHR(
+            resourceTracker, (VkRenderingAttachmentInfoKHR*)(toTransform->pStencilAttachment));
     }
 }
 
 void transform_tohost_VkPipelineRenderingCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineRenderingCreateInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineRenderingCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPipelineRenderingCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineRenderingCreateInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineRenderingCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceDynamicRenderingFeaturesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceDynamicRenderingFeaturesKHR* toTransform)
-{
+    VkPhysicalDeviceDynamicRenderingFeaturesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceDynamicRenderingFeaturesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceDynamicRenderingFeaturesKHR* toTransform)
-{
+    VkPhysicalDeviceDynamicRenderingFeaturesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkCommandBufferInheritanceRenderingInfoKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkCommandBufferInheritanceRenderingInfoKHR* toTransform)
-{
+    VkCommandBufferInheritanceRenderingInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkCommandBufferInheritanceRenderingInfoKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkCommandBufferInheritanceRenderingInfoKHR* toTransform)
-{
+    VkCommandBufferInheritanceRenderingInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkRenderingFragmentShadingRateAttachmentInfoKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkRenderingFragmentShadingRateAttachmentInfoKHR* toTransform)
-{
+    VkRenderingFragmentShadingRateAttachmentInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->shadingRateAttachmentTexelSize));
+    transform_tohost_VkExtent2D(resourceTracker,
+                                (VkExtent2D*)(&toTransform->shadingRateAttachmentTexelSize));
 }
 
 void transform_fromhost_VkRenderingFragmentShadingRateAttachmentInfoKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkRenderingFragmentShadingRateAttachmentInfoKHR* toTransform)
-{
+    VkRenderingFragmentShadingRateAttachmentInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->shadingRateAttachmentTexelSize));
+    transform_fromhost_VkExtent2D(resourceTracker,
+                                  (VkExtent2D*)(&toTransform->shadingRateAttachmentTexelSize));
 }
 
 void transform_tohost_VkRenderingFragmentDensityMapAttachmentInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkRenderingFragmentDensityMapAttachmentInfoEXT* toTransform)
-{
+    VkRenderingFragmentDensityMapAttachmentInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkRenderingFragmentDensityMapAttachmentInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkRenderingFragmentDensityMapAttachmentInfoEXT* toTransform)
-{
+    VkRenderingFragmentDensityMapAttachmentInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkAttachmentSampleCountInfoAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkAttachmentSampleCountInfoAMD* toTransform)
-{
+void transform_tohost_VkAttachmentSampleCountInfoAMD(VkDecoderGlobalState* resourceTracker,
+                                                     VkAttachmentSampleCountInfoAMD* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkAttachmentSampleCountInfoAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkAttachmentSampleCountInfoAMD* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkAttachmentSampleCountInfoAMD* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkMultiviewPerViewAttributesInfoNVX(
-    VkDecoderGlobalState* resourceTracker,
-    VkMultiviewPerViewAttributesInfoNVX* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkMultiviewPerViewAttributesInfoNVX* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkMultiviewPerViewAttributesInfoNVX(
-    VkDecoderGlobalState* resourceTracker,
-    VkMultiviewPerViewAttributesInfoNVX* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkMultiviewPerViewAttributesInfoNVX* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -7397,179 +5890,153 @@
 #endif
 #ifdef VK_KHR_external_memory_win32
 void transform_tohost_VkImportMemoryWin32HandleInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportMemoryWin32HandleInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkImportMemoryWin32HandleInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkImportMemoryWin32HandleInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportMemoryWin32HandleInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkImportMemoryWin32HandleInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkExportMemoryWin32HandleInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkExportMemoryWin32HandleInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkExportMemoryWin32HandleInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkExportMemoryWin32HandleInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkExportMemoryWin32HandleInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkExportMemoryWin32HandleInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkMemoryWin32HandlePropertiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryWin32HandlePropertiesKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkMemoryWin32HandlePropertiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)&toTransform->memoryTypeBits, 1);
-    if (toTransform->pNext)
-    {
+    resourceTracker->deviceMemoryTransform_tohost(
+        (VkDeviceMemory*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0,
+        (uint32_t*)nullptr, 0, (uint32_t*)&toTransform->memoryTypeBits, 1);
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkMemoryWin32HandlePropertiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryWin32HandlePropertiesKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkMemoryWin32HandlePropertiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    resourceTracker->deviceMemoryTransform_fromhost((VkDeviceMemory*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)&toTransform->memoryTypeBits, 1);
-    if (toTransform->pNext)
-    {
+    resourceTracker->deviceMemoryTransform_fromhost(
+        (VkDeviceMemory*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0,
+        (uint32_t*)nullptr, 0, (uint32_t*)&toTransform->memoryTypeBits, 1);
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkMemoryGetWin32HandleInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryGetWin32HandleInfoKHR* toTransform)
-{
+void transform_tohost_VkMemoryGetWin32HandleInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkMemoryGetWin32HandleInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
-    if (toTransform->pNext)
-    {
+    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)&toTransform->memory, 1,
+                                                  (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr,
+                                                  0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkMemoryGetWin32HandleInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryGetWin32HandleInfoKHR* toTransform)
-{
+void transform_fromhost_VkMemoryGetWin32HandleInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                      VkMemoryGetWin32HandleInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    resourceTracker->deviceMemoryTransform_fromhost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
-    if (toTransform->pNext)
-    {
+    resourceTracker->deviceMemoryTransform_fromhost(
+        (VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr,
+        0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_KHR_external_memory_fd
-void transform_tohost_VkImportMemoryFdInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportMemoryFdInfoKHR* toTransform)
-{
+void transform_tohost_VkImportMemoryFdInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                              VkImportMemoryFdInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkImportMemoryFdInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportMemoryFdInfoKHR* toTransform)
-{
+void transform_fromhost_VkImportMemoryFdInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                VkImportMemoryFdInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkMemoryFdPropertiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryFdPropertiesKHR* toTransform)
-{
+void transform_tohost_VkMemoryFdPropertiesKHR(VkDecoderGlobalState* resourceTracker,
+                                              VkMemoryFdPropertiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)&toTransform->memoryTypeBits, 1);
-    if (toTransform->pNext)
-    {
+    resourceTracker->deviceMemoryTransform_tohost(
+        (VkDeviceMemory*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0,
+        (uint32_t*)nullptr, 0, (uint32_t*)&toTransform->memoryTypeBits, 1);
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkMemoryFdPropertiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryFdPropertiesKHR* toTransform)
-{
+void transform_fromhost_VkMemoryFdPropertiesKHR(VkDecoderGlobalState* resourceTracker,
+                                                VkMemoryFdPropertiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    resourceTracker->deviceMemoryTransform_fromhost((VkDeviceMemory*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)&toTransform->memoryTypeBits, 1);
-    if (toTransform->pNext)
-    {
+    resourceTracker->deviceMemoryTransform_fromhost(
+        (VkDeviceMemory*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0,
+        (uint32_t*)nullptr, 0, (uint32_t*)&toTransform->memoryTypeBits, 1);
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkMemoryGetFdInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryGetFdInfoKHR* toTransform)
-{
+void transform_tohost_VkMemoryGetFdInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                           VkMemoryGetFdInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
-    if (toTransform->pNext)
-    {
+    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)&toTransform->memory, 1,
+                                                  (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr,
+                                                  0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkMemoryGetFdInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryGetFdInfoKHR* toTransform)
-{
+void transform_fromhost_VkMemoryGetFdInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                             VkMemoryGetFdInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    resourceTracker->deviceMemoryTransform_fromhost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
-    if (toTransform->pNext)
-    {
+    resourceTracker->deviceMemoryTransform_fromhost(
+        (VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr,
+        0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -7577,27 +6044,27 @@
 #endif
 #ifdef VK_KHR_win32_keyed_mutex
 void transform_tohost_VkWin32KeyedMutexAcquireReleaseInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkWin32KeyedMutexAcquireReleaseInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkWin32KeyedMutexAcquireReleaseInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)toTransform->pReleaseSyncs, toTransform->releaseCount, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
-    if (toTransform->pNext)
-    {
+    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)toTransform->pReleaseSyncs,
+                                                  toTransform->releaseCount, (VkDeviceSize*)nullptr,
+                                                  0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr,
+                                                  0, (uint32_t*)nullptr, 0);
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkWin32KeyedMutexAcquireReleaseInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkWin32KeyedMutexAcquireReleaseInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkWin32KeyedMutexAcquireReleaseInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    resourceTracker->deviceMemoryTransform_fromhost((VkDeviceMemory*)toTransform->pReleaseSyncs, toTransform->releaseCount, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
-    if (toTransform->pNext)
-    {
+    resourceTracker->deviceMemoryTransform_fromhost(
+        (VkDeviceMemory*)toTransform->pReleaseSyncs, toTransform->releaseCount,
+        (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0,
+        (uint32_t*)nullptr, 0);
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -7609,147 +6076,111 @@
 #endif
 #ifdef VK_KHR_external_semaphore_win32
 void transform_tohost_VkImportSemaphoreWin32HandleInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportSemaphoreWin32HandleInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkImportSemaphoreWin32HandleInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkImportSemaphoreWin32HandleInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportSemaphoreWin32HandleInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkImportSemaphoreWin32HandleInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkExportSemaphoreWin32HandleInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkExportSemaphoreWin32HandleInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkExportSemaphoreWin32HandleInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkExportSemaphoreWin32HandleInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkExportSemaphoreWin32HandleInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkExportSemaphoreWin32HandleInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkD3D12FenceSubmitInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkD3D12FenceSubmitInfoKHR* toTransform)
-{
+void transform_tohost_VkD3D12FenceSubmitInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                VkD3D12FenceSubmitInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkD3D12FenceSubmitInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkD3D12FenceSubmitInfoKHR* toTransform)
-{
+void transform_fromhost_VkD3D12FenceSubmitInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                  VkD3D12FenceSubmitInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkSemaphoreGetWin32HandleInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSemaphoreGetWin32HandleInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkSemaphoreGetWin32HandleInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkSemaphoreGetWin32HandleInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSemaphoreGetWin32HandleInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkSemaphoreGetWin32HandleInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_KHR_external_semaphore_fd
-void transform_tohost_VkImportSemaphoreFdInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportSemaphoreFdInfoKHR* toTransform)
-{
+void transform_tohost_VkImportSemaphoreFdInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                 VkImportSemaphoreFdInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkImportSemaphoreFdInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportSemaphoreFdInfoKHR* toTransform)
-{
+void transform_fromhost_VkImportSemaphoreFdInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                   VkImportSemaphoreFdInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkSemaphoreGetFdInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSemaphoreGetFdInfoKHR* toTransform)
-{
+void transform_tohost_VkSemaphoreGetFdInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                              VkSemaphoreGetFdInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkSemaphoreGetFdInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSemaphoreGetFdInfoKHR* toTransform)
-{
+void transform_fromhost_VkSemaphoreGetFdInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                VkSemaphoreGetFdInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -7758,24 +6189,20 @@
 #ifdef VK_KHR_push_descriptor
 void transform_tohost_VkPhysicalDevicePushDescriptorPropertiesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePushDescriptorPropertiesKHR* toTransform)
-{
+    VkPhysicalDevicePushDescriptorPropertiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDevicePushDescriptorPropertiesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePushDescriptorPropertiesKHR* toTransform)
-{
+    VkPhysicalDevicePushDescriptorPropertiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -7786,101 +6213,79 @@
 #ifdef VK_KHR_16bit_storage
 #endif
 #ifdef VK_KHR_incremental_present
-void transform_tohost_VkRectLayerKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkRectLayerKHR* toTransform)
-{
+void transform_tohost_VkRectLayerKHR(VkDecoderGlobalState* resourceTracker,
+                                     VkRectLayerKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
     transform_tohost_VkOffset2D(resourceTracker, (VkOffset2D*)(&toTransform->offset));
     transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->extent));
 }
 
-void transform_fromhost_VkRectLayerKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkRectLayerKHR* toTransform)
-{
+void transform_fromhost_VkRectLayerKHR(VkDecoderGlobalState* resourceTracker,
+                                       VkRectLayerKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
     transform_fromhost_VkOffset2D(resourceTracker, (VkOffset2D*)(&toTransform->offset));
     transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->extent));
 }
 
-void transform_tohost_VkPresentRegionKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPresentRegionKHR* toTransform)
-{
+void transform_tohost_VkPresentRegionKHR(VkDecoderGlobalState* resourceTracker,
+                                         VkPresentRegionKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform)
-    {
-        if (toTransform->pRectangles)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->rectangleCount; ++i)
-            {
-                transform_tohost_VkRectLayerKHR(resourceTracker, (VkRectLayerKHR*)(toTransform->pRectangles + i));
+    if (toTransform) {
+        if (toTransform->pRectangles) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->rectangleCount; ++i) {
+                transform_tohost_VkRectLayerKHR(resourceTracker,
+                                                (VkRectLayerKHR*)(toTransform->pRectangles + i));
             }
         }
     }
 }
 
-void transform_fromhost_VkPresentRegionKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPresentRegionKHR* toTransform)
-{
+void transform_fromhost_VkPresentRegionKHR(VkDecoderGlobalState* resourceTracker,
+                                           VkPresentRegionKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform)
-    {
-        if (toTransform->pRectangles)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->rectangleCount; ++i)
-            {
-                transform_fromhost_VkRectLayerKHR(resourceTracker, (VkRectLayerKHR*)(toTransform->pRectangles + i));
+    if (toTransform) {
+        if (toTransform->pRectangles) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->rectangleCount; ++i) {
+                transform_fromhost_VkRectLayerKHR(resourceTracker,
+                                                  (VkRectLayerKHR*)(toTransform->pRectangles + i));
             }
         }
     }
 }
 
-void transform_tohost_VkPresentRegionsKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPresentRegionsKHR* toTransform)
-{
+void transform_tohost_VkPresentRegionsKHR(VkDecoderGlobalState* resourceTracker,
+                                          VkPresentRegionsKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pRegions)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->swapchainCount; ++i)
-            {
-                transform_tohost_VkPresentRegionKHR(resourceTracker, (VkPresentRegionKHR*)(toTransform->pRegions + i));
+    if (toTransform) {
+        if (toTransform->pRegions) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->swapchainCount; ++i) {
+                transform_tohost_VkPresentRegionKHR(
+                    resourceTracker, (VkPresentRegionKHR*)(toTransform->pRegions + i));
             }
         }
     }
 }
 
-void transform_fromhost_VkPresentRegionsKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPresentRegionsKHR* toTransform)
-{
+void transform_fromhost_VkPresentRegionsKHR(VkDecoderGlobalState* resourceTracker,
+                                            VkPresentRegionsKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pRegions)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->swapchainCount; ++i)
-            {
-                transform_fromhost_VkPresentRegionKHR(resourceTracker, (VkPresentRegionKHR*)(toTransform->pRegions + i));
+    if (toTransform) {
+        if (toTransform->pRegions) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->swapchainCount; ++i) {
+                transform_fromhost_VkPresentRegionKHR(
+                    resourceTracker, (VkPresentRegionKHR*)(toTransform->pRegions + i));
             }
         }
     }
@@ -7895,25 +6300,19 @@
 #endif
 #ifdef VK_KHR_shared_presentable_image
 void transform_tohost_VkSharedPresentSurfaceCapabilitiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSharedPresentSurfaceCapabilitiesKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkSharedPresentSurfaceCapabilitiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkSharedPresentSurfaceCapabilitiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSharedPresentSurfaceCapabilitiesKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkSharedPresentSurfaceCapabilitiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -7925,123 +6324,93 @@
 #endif
 #ifdef VK_KHR_external_fence_win32
 void transform_tohost_VkImportFenceWin32HandleInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportFenceWin32HandleInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkImportFenceWin32HandleInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkImportFenceWin32HandleInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportFenceWin32HandleInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkImportFenceWin32HandleInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkExportFenceWin32HandleInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkExportFenceWin32HandleInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkExportFenceWin32HandleInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkExportFenceWin32HandleInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkExportFenceWin32HandleInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkExportFenceWin32HandleInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkFenceGetWin32HandleInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkFenceGetWin32HandleInfoKHR* toTransform)
-{
+void transform_tohost_VkFenceGetWin32HandleInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                   VkFenceGetWin32HandleInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkFenceGetWin32HandleInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkFenceGetWin32HandleInfoKHR* toTransform)
-{
+void transform_fromhost_VkFenceGetWin32HandleInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                     VkFenceGetWin32HandleInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_KHR_external_fence_fd
-void transform_tohost_VkImportFenceFdInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportFenceFdInfoKHR* toTransform)
-{
+void transform_tohost_VkImportFenceFdInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                             VkImportFenceFdInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkImportFenceFdInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportFenceFdInfoKHR* toTransform)
-{
+void transform_fromhost_VkImportFenceFdInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                               VkImportFenceFdInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkFenceGetFdInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkFenceGetFdInfoKHR* toTransform)
-{
+void transform_tohost_VkFenceGetFdInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                          VkFenceGetFdInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkFenceGetFdInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkFenceGetFdInfoKHR* toTransform)
-{
+void transform_fromhost_VkFenceGetFdInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                            VkFenceGetFdInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -8050,184 +6419,142 @@
 #ifdef VK_KHR_performance_query
 void transform_tohost_VkPhysicalDevicePerformanceQueryFeaturesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePerformanceQueryFeaturesKHR* toTransform)
-{
+    VkPhysicalDevicePerformanceQueryFeaturesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDevicePerformanceQueryFeaturesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePerformanceQueryFeaturesKHR* toTransform)
-{
+    VkPhysicalDevicePerformanceQueryFeaturesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDevicePerformanceQueryPropertiesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePerformanceQueryPropertiesKHR* toTransform)
-{
+    VkPhysicalDevicePerformanceQueryPropertiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDevicePerformanceQueryPropertiesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePerformanceQueryPropertiesKHR* toTransform)
-{
+    VkPhysicalDevicePerformanceQueryPropertiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkPerformanceCounterKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceCounterKHR* toTransform)
-{
+void transform_tohost_VkPerformanceCounterKHR(VkDecoderGlobalState* resourceTracker,
+                                              VkPerformanceCounterKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkPerformanceCounterKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceCounterKHR* toTransform)
-{
+void transform_fromhost_VkPerformanceCounterKHR(VkDecoderGlobalState* resourceTracker,
+                                                VkPerformanceCounterKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPerformanceCounterDescriptionKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceCounterDescriptionKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPerformanceCounterDescriptionKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPerformanceCounterDescriptionKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceCounterDescriptionKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPerformanceCounterDescriptionKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkQueryPoolPerformanceCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkQueryPoolPerformanceCreateInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkQueryPoolPerformanceCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkQueryPoolPerformanceCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkQueryPoolPerformanceCreateInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkQueryPoolPerformanceCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkPerformanceCounterResultKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceCounterResultKHR* toTransform)
-{
+void transform_tohost_VkPerformanceCounterResultKHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkPerformanceCounterResultKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkPerformanceCounterResultKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceCounterResultKHR* toTransform)
-{
+void transform_fromhost_VkPerformanceCounterResultKHR(VkDecoderGlobalState* resourceTracker,
+                                                      VkPerformanceCounterResultKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkAcquireProfilingLockInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAcquireProfilingLockInfoKHR* toTransform)
-{
+void transform_tohost_VkAcquireProfilingLockInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkAcquireProfilingLockInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkAcquireProfilingLockInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAcquireProfilingLockInfoKHR* toTransform)
-{
+void transform_fromhost_VkAcquireProfilingLockInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                      VkAcquireProfilingLockInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPerformanceQuerySubmitInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceQuerySubmitInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPerformanceQuerySubmitInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPerformanceQuerySubmitInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceQuerySubmitInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPerformanceQuerySubmitInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -8237,211 +6564,175 @@
 #endif
 #ifdef VK_KHR_get_surface_capabilities2
 void transform_tohost_VkPhysicalDeviceSurfaceInfo2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceSurfaceInfo2KHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceSurfaceInfo2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceSurfaceInfo2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceSurfaceInfo2KHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceSurfaceInfo2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkSurfaceCapabilities2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSurfaceCapabilities2KHR* toTransform)
-{
+void transform_tohost_VkSurfaceCapabilities2KHR(VkDecoderGlobalState* resourceTracker,
+                                                VkSurfaceCapabilities2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkSurfaceCapabilitiesKHR(resourceTracker, (VkSurfaceCapabilitiesKHR*)(&toTransform->surfaceCapabilities));
+    transform_tohost_VkSurfaceCapabilitiesKHR(
+        resourceTracker, (VkSurfaceCapabilitiesKHR*)(&toTransform->surfaceCapabilities));
 }
 
-void transform_fromhost_VkSurfaceCapabilities2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSurfaceCapabilities2KHR* toTransform)
-{
+void transform_fromhost_VkSurfaceCapabilities2KHR(VkDecoderGlobalState* resourceTracker,
+                                                  VkSurfaceCapabilities2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkSurfaceCapabilitiesKHR(resourceTracker, (VkSurfaceCapabilitiesKHR*)(&toTransform->surfaceCapabilities));
+    transform_fromhost_VkSurfaceCapabilitiesKHR(
+        resourceTracker, (VkSurfaceCapabilitiesKHR*)(&toTransform->surfaceCapabilities));
 }
 
-void transform_tohost_VkSurfaceFormat2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSurfaceFormat2KHR* toTransform)
-{
+void transform_tohost_VkSurfaceFormat2KHR(VkDecoderGlobalState* resourceTracker,
+                                          VkSurfaceFormat2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkSurfaceFormatKHR(resourceTracker, (VkSurfaceFormatKHR*)(&toTransform->surfaceFormat));
+    transform_tohost_VkSurfaceFormatKHR(resourceTracker,
+                                        (VkSurfaceFormatKHR*)(&toTransform->surfaceFormat));
 }
 
-void transform_fromhost_VkSurfaceFormat2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSurfaceFormat2KHR* toTransform)
-{
+void transform_fromhost_VkSurfaceFormat2KHR(VkDecoderGlobalState* resourceTracker,
+                                            VkSurfaceFormat2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkSurfaceFormatKHR(resourceTracker, (VkSurfaceFormatKHR*)(&toTransform->surfaceFormat));
+    transform_fromhost_VkSurfaceFormatKHR(resourceTracker,
+                                          (VkSurfaceFormatKHR*)(&toTransform->surfaceFormat));
 }
 
 #endif
 #ifdef VK_KHR_variable_pointers
 #endif
 #ifdef VK_KHR_get_display_properties2
-void transform_tohost_VkDisplayProperties2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayProperties2KHR* toTransform)
-{
+void transform_tohost_VkDisplayProperties2KHR(VkDecoderGlobalState* resourceTracker,
+                                              VkDisplayProperties2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkDisplayPropertiesKHR(resourceTracker, (VkDisplayPropertiesKHR*)(&toTransform->displayProperties));
+    transform_tohost_VkDisplayPropertiesKHR(
+        resourceTracker, (VkDisplayPropertiesKHR*)(&toTransform->displayProperties));
 }
 
-void transform_fromhost_VkDisplayProperties2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayProperties2KHR* toTransform)
-{
+void transform_fromhost_VkDisplayProperties2KHR(VkDecoderGlobalState* resourceTracker,
+                                                VkDisplayProperties2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkDisplayPropertiesKHR(resourceTracker, (VkDisplayPropertiesKHR*)(&toTransform->displayProperties));
+    transform_fromhost_VkDisplayPropertiesKHR(
+        resourceTracker, (VkDisplayPropertiesKHR*)(&toTransform->displayProperties));
 }
 
-void transform_tohost_VkDisplayPlaneProperties2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayPlaneProperties2KHR* toTransform)
-{
+void transform_tohost_VkDisplayPlaneProperties2KHR(VkDecoderGlobalState* resourceTracker,
+                                                   VkDisplayPlaneProperties2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkDisplayPlanePropertiesKHR(resourceTracker, (VkDisplayPlanePropertiesKHR*)(&toTransform->displayPlaneProperties));
+    transform_tohost_VkDisplayPlanePropertiesKHR(
+        resourceTracker, (VkDisplayPlanePropertiesKHR*)(&toTransform->displayPlaneProperties));
 }
 
-void transform_fromhost_VkDisplayPlaneProperties2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayPlaneProperties2KHR* toTransform)
-{
+void transform_fromhost_VkDisplayPlaneProperties2KHR(VkDecoderGlobalState* resourceTracker,
+                                                     VkDisplayPlaneProperties2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkDisplayPlanePropertiesKHR(resourceTracker, (VkDisplayPlanePropertiesKHR*)(&toTransform->displayPlaneProperties));
+    transform_fromhost_VkDisplayPlanePropertiesKHR(
+        resourceTracker, (VkDisplayPlanePropertiesKHR*)(&toTransform->displayPlaneProperties));
 }
 
-void transform_tohost_VkDisplayModeProperties2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayModeProperties2KHR* toTransform)
-{
+void transform_tohost_VkDisplayModeProperties2KHR(VkDecoderGlobalState* resourceTracker,
+                                                  VkDisplayModeProperties2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkDisplayModePropertiesKHR(resourceTracker, (VkDisplayModePropertiesKHR*)(&toTransform->displayModeProperties));
+    transform_tohost_VkDisplayModePropertiesKHR(
+        resourceTracker, (VkDisplayModePropertiesKHR*)(&toTransform->displayModeProperties));
 }
 
-void transform_fromhost_VkDisplayModeProperties2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayModeProperties2KHR* toTransform)
-{
+void transform_fromhost_VkDisplayModeProperties2KHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkDisplayModeProperties2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkDisplayModePropertiesKHR(resourceTracker, (VkDisplayModePropertiesKHR*)(&toTransform->displayModeProperties));
+    transform_fromhost_VkDisplayModePropertiesKHR(
+        resourceTracker, (VkDisplayModePropertiesKHR*)(&toTransform->displayModeProperties));
 }
 
-void transform_tohost_VkDisplayPlaneInfo2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayPlaneInfo2KHR* toTransform)
-{
+void transform_tohost_VkDisplayPlaneInfo2KHR(VkDecoderGlobalState* resourceTracker,
+                                             VkDisplayPlaneInfo2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkDisplayPlaneInfo2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayPlaneInfo2KHR* toTransform)
-{
+void transform_fromhost_VkDisplayPlaneInfo2KHR(VkDecoderGlobalState* resourceTracker,
+                                               VkDisplayPlaneInfo2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkDisplayPlaneCapabilities2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayPlaneCapabilities2KHR* toTransform)
-{
+void transform_tohost_VkDisplayPlaneCapabilities2KHR(VkDecoderGlobalState* resourceTracker,
+                                                     VkDisplayPlaneCapabilities2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkDisplayPlaneCapabilitiesKHR(resourceTracker, (VkDisplayPlaneCapabilitiesKHR*)(&toTransform->capabilities));
+    transform_tohost_VkDisplayPlaneCapabilitiesKHR(
+        resourceTracker, (VkDisplayPlaneCapabilitiesKHR*)(&toTransform->capabilities));
 }
 
 void transform_fromhost_VkDisplayPlaneCapabilities2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayPlaneCapabilities2KHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDisplayPlaneCapabilities2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkDisplayPlaneCapabilitiesKHR(resourceTracker, (VkDisplayPlaneCapabilitiesKHR*)(&toTransform->capabilities));
+    transform_fromhost_VkDisplayPlaneCapabilitiesKHR(
+        resourceTracker, (VkDisplayPlaneCapabilitiesKHR*)(&toTransform->capabilities));
 }
 
 #endif
@@ -8462,48 +6753,40 @@
 #ifdef VK_KHR_portability_subset
 void transform_tohost_VkPhysicalDevicePortabilitySubsetFeaturesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePortabilitySubsetFeaturesKHR* toTransform)
-{
+    VkPhysicalDevicePortabilitySubsetFeaturesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDevicePortabilitySubsetFeaturesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePortabilitySubsetFeaturesKHR* toTransform)
-{
+    VkPhysicalDevicePortabilitySubsetFeaturesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDevicePortabilitySubsetPropertiesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePortabilitySubsetPropertiesKHR* toTransform)
-{
+    VkPhysicalDevicePortabilitySubsetPropertiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDevicePortabilitySubsetPropertiesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePortabilitySubsetPropertiesKHR* toTransform)
-{
+    VkPhysicalDevicePortabilitySubsetPropertiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -8521,25 +6804,19 @@
 #endif
 #ifdef VK_KHR_shader_clock
 void transform_tohost_VkPhysicalDeviceShaderClockFeaturesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderClockFeaturesKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceShaderClockFeaturesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceShaderClockFeaturesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderClockFeaturesKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceShaderClockFeaturesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -8560,24 +6837,20 @@
 #ifdef VK_KHR_shader_terminate_invocation
 void transform_tohost_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* toTransform)
-{
+    VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* toTransform)
-{
+    VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -8585,47 +6858,43 @@
 #endif
 #ifdef VK_KHR_fragment_shading_rate
 void transform_tohost_VkFragmentShadingRateAttachmentInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkFragmentShadingRateAttachmentInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkFragmentShadingRateAttachmentInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pFragmentShadingRateAttachment)
-    {
-        transform_tohost_VkAttachmentReference2(resourceTracker, (VkAttachmentReference2*)(toTransform->pFragmentShadingRateAttachment));
+    if (toTransform->pFragmentShadingRateAttachment) {
+        transform_tohost_VkAttachmentReference2(
+            resourceTracker,
+            (VkAttachmentReference2*)(toTransform->pFragmentShadingRateAttachment));
     }
-    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->shadingRateAttachmentTexelSize));
+    transform_tohost_VkExtent2D(resourceTracker,
+                                (VkExtent2D*)(&toTransform->shadingRateAttachmentTexelSize));
 }
 
 void transform_fromhost_VkFragmentShadingRateAttachmentInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkFragmentShadingRateAttachmentInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkFragmentShadingRateAttachmentInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pFragmentShadingRateAttachment)
-    {
-        transform_fromhost_VkAttachmentReference2(resourceTracker, (VkAttachmentReference2*)(toTransform->pFragmentShadingRateAttachment));
+    if (toTransform->pFragmentShadingRateAttachment) {
+        transform_fromhost_VkAttachmentReference2(
+            resourceTracker,
+            (VkAttachmentReference2*)(toTransform->pFragmentShadingRateAttachment));
     }
-    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->shadingRateAttachmentTexelSize));
+    transform_fromhost_VkExtent2D(resourceTracker,
+                                  (VkExtent2D*)(&toTransform->shadingRateAttachmentTexelSize));
 }
 
 void transform_tohost_VkPipelineFragmentShadingRateStateCreateInfoKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineFragmentShadingRateStateCreateInfoKHR* toTransform)
-{
+    VkPipelineFragmentShadingRateStateCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
     transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->fragmentSize));
@@ -8633,12 +6902,10 @@
 
 void transform_fromhost_VkPipelineFragmentShadingRateStateCreateInfoKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineFragmentShadingRateStateCreateInfoKHR* toTransform)
-{
+    VkPipelineFragmentShadingRateStateCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
     transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->fragmentSize));
@@ -8646,79 +6913,69 @@
 
 void transform_tohost_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceFragmentShadingRateFeaturesKHR* toTransform)
-{
+    VkPhysicalDeviceFragmentShadingRateFeaturesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceFragmentShadingRateFeaturesKHR* toTransform)
-{
+    VkPhysicalDeviceFragmentShadingRateFeaturesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceFragmentShadingRatePropertiesKHR* toTransform)
-{
+    VkPhysicalDeviceFragmentShadingRatePropertiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->minFragmentShadingRateAttachmentTexelSize));
-    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxFragmentShadingRateAttachmentTexelSize));
+    transform_tohost_VkExtent2D(
+        resourceTracker, (VkExtent2D*)(&toTransform->minFragmentShadingRateAttachmentTexelSize));
+    transform_tohost_VkExtent2D(
+        resourceTracker, (VkExtent2D*)(&toTransform->maxFragmentShadingRateAttachmentTexelSize));
     transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxFragmentSize));
 }
 
 void transform_fromhost_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceFragmentShadingRatePropertiesKHR* toTransform)
-{
+    VkPhysicalDeviceFragmentShadingRatePropertiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->minFragmentShadingRateAttachmentTexelSize));
-    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxFragmentShadingRateAttachmentTexelSize));
+    transform_fromhost_VkExtent2D(
+        resourceTracker, (VkExtent2D*)(&toTransform->minFragmentShadingRateAttachmentTexelSize));
+    transform_fromhost_VkExtent2D(
+        resourceTracker, (VkExtent2D*)(&toTransform->maxFragmentShadingRateAttachmentTexelSize));
     transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxFragmentSize));
 }
 
 void transform_tohost_VkPhysicalDeviceFragmentShadingRateKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceFragmentShadingRateKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceFragmentShadingRateKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
     transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->fragmentSize));
 }
 
 void transform_fromhost_VkPhysicalDeviceFragmentShadingRateKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceFragmentShadingRateKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceFragmentShadingRateKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
     transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->fragmentSize));
@@ -8729,25 +6986,19 @@
 #endif
 #ifdef VK_KHR_surface_protected_capabilities
 void transform_tohost_VkSurfaceProtectedCapabilitiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSurfaceProtectedCapabilitiesKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkSurfaceProtectedCapabilitiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkSurfaceProtectedCapabilitiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSurfaceProtectedCapabilitiesKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkSurfaceProtectedCapabilitiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -8757,25 +7008,19 @@
 #endif
 #ifdef VK_KHR_present_wait
 void transform_tohost_VkPhysicalDevicePresentWaitFeaturesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePresentWaitFeaturesKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDevicePresentWaitFeaturesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDevicePresentWaitFeaturesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePresentWaitFeaturesKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDevicePresentWaitFeaturesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -8790,162 +7035,128 @@
 #ifdef VK_KHR_pipeline_executable_properties
 void transform_tohost_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* toTransform)
-{
+    VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* toTransform)
-{
+    VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkPipelineInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineInfoKHR* toTransform)
-{
+void transform_tohost_VkPipelineInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                        VkPipelineInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkPipelineInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineInfoKHR* toTransform)
-{
+void transform_fromhost_VkPipelineInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                          VkPipelineInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPipelineExecutablePropertiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineExecutablePropertiesKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineExecutablePropertiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPipelineExecutablePropertiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineExecutablePropertiesKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineExecutablePropertiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkPipelineExecutableInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineExecutableInfoKHR* toTransform)
-{
+void transform_tohost_VkPipelineExecutableInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                  VkPipelineExecutableInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkPipelineExecutableInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineExecutableInfoKHR* toTransform)
-{
+void transform_fromhost_VkPipelineExecutableInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkPipelineExecutableInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPipelineExecutableStatisticValueKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineExecutableStatisticValueKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineExecutableStatisticValueKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_fromhost_VkPipelineExecutableStatisticValueKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineExecutableStatisticValueKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineExecutableStatisticValueKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_tohost_VkPipelineExecutableStatisticKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineExecutableStatisticKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineExecutableStatisticKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkPipelineExecutableStatisticValueKHR(resourceTracker, (VkPipelineExecutableStatisticValueKHR*)(&toTransform->value));
+    transform_tohost_VkPipelineExecutableStatisticValueKHR(
+        resourceTracker, (VkPipelineExecutableStatisticValueKHR*)(&toTransform->value));
 }
 
 void transform_fromhost_VkPipelineExecutableStatisticKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineExecutableStatisticKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineExecutableStatisticKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkPipelineExecutableStatisticValueKHR(resourceTracker, (VkPipelineExecutableStatisticValueKHR*)(&toTransform->value));
+    transform_fromhost_VkPipelineExecutableStatisticValueKHR(
+        resourceTracker, (VkPipelineExecutableStatisticValueKHR*)(&toTransform->value));
 }
 
 void transform_tohost_VkPipelineExecutableInternalRepresentationKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineExecutableInternalRepresentationKHR* toTransform)
-{
+    VkPipelineExecutableInternalRepresentationKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPipelineExecutableInternalRepresentationKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineExecutableInternalRepresentationKHR* toTransform)
-{
+    VkPipelineExecutableInternalRepresentationKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -8954,74 +7165,60 @@
 #ifdef VK_KHR_shader_integer_dot_product
 void transform_tohost_VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR* toTransform)
-{
+    VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR* toTransform)
-{
+    VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR* toTransform)
-{
+    VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR* toTransform)
-{
+    VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_KHR_pipeline_library
-void transform_tohost_VkPipelineLibraryCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineLibraryCreateInfoKHR* toTransform)
-{
+void transform_tohost_VkPipelineLibraryCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                     VkPipelineLibraryCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPipelineLibraryCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineLibraryCreateInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineLibraryCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -9030,423 +7227,343 @@
 #ifdef VK_KHR_shader_non_semantic_info
 #endif
 #ifdef VK_KHR_present_id
-void transform_tohost_VkPresentIdKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPresentIdKHR* toTransform)
-{
+void transform_tohost_VkPresentIdKHR(VkDecoderGlobalState* resourceTracker,
+                                     VkPresentIdKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkPresentIdKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPresentIdKHR* toTransform)
-{
+void transform_fromhost_VkPresentIdKHR(VkDecoderGlobalState* resourceTracker,
+                                       VkPresentIdKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDevicePresentIdFeaturesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePresentIdFeaturesKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDevicePresentIdFeaturesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDevicePresentIdFeaturesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePresentIdFeaturesKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDevicePresentIdFeaturesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_KHR_video_encode_queue
-void transform_tohost_VkVideoEncodeInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeInfoKHR* toTransform)
-{
+void transform_tohost_VkVideoEncodeInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                           VkVideoEncodeInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
     transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->codedExtent));
-    transform_tohost_VkVideoPictureResourceKHR(resourceTracker, (VkVideoPictureResourceKHR*)(&toTransform->srcPictureResource));
-    if (toTransform->pSetupReferenceSlot)
-    {
-        transform_tohost_VkVideoReferenceSlotKHR(resourceTracker, (VkVideoReferenceSlotKHR*)(toTransform->pSetupReferenceSlot));
+    transform_tohost_VkVideoPictureResourceKHR(
+        resourceTracker, (VkVideoPictureResourceKHR*)(&toTransform->srcPictureResource));
+    if (toTransform->pSetupReferenceSlot) {
+        transform_tohost_VkVideoReferenceSlotKHR(
+            resourceTracker, (VkVideoReferenceSlotKHR*)(toTransform->pSetupReferenceSlot));
     }
-    if (toTransform)
-    {
-        if (toTransform->pReferenceSlots)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->referenceSlotCount; ++i)
-            {
-                transform_tohost_VkVideoReferenceSlotKHR(resourceTracker, (VkVideoReferenceSlotKHR*)(toTransform->pReferenceSlots + i));
+    if (toTransform) {
+        if (toTransform->pReferenceSlots) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->referenceSlotCount; ++i) {
+                transform_tohost_VkVideoReferenceSlotKHR(
+                    resourceTracker, (VkVideoReferenceSlotKHR*)(toTransform->pReferenceSlots + i));
             }
         }
     }
 }
 
-void transform_fromhost_VkVideoEncodeInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeInfoKHR* toTransform)
-{
+void transform_fromhost_VkVideoEncodeInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                             VkVideoEncodeInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
     transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->codedExtent));
-    transform_fromhost_VkVideoPictureResourceKHR(resourceTracker, (VkVideoPictureResourceKHR*)(&toTransform->srcPictureResource));
-    if (toTransform->pSetupReferenceSlot)
-    {
-        transform_fromhost_VkVideoReferenceSlotKHR(resourceTracker, (VkVideoReferenceSlotKHR*)(toTransform->pSetupReferenceSlot));
+    transform_fromhost_VkVideoPictureResourceKHR(
+        resourceTracker, (VkVideoPictureResourceKHR*)(&toTransform->srcPictureResource));
+    if (toTransform->pSetupReferenceSlot) {
+        transform_fromhost_VkVideoReferenceSlotKHR(
+            resourceTracker, (VkVideoReferenceSlotKHR*)(toTransform->pSetupReferenceSlot));
     }
-    if (toTransform)
-    {
-        if (toTransform->pReferenceSlots)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->referenceSlotCount; ++i)
-            {
-                transform_fromhost_VkVideoReferenceSlotKHR(resourceTracker, (VkVideoReferenceSlotKHR*)(toTransform->pReferenceSlots + i));
+    if (toTransform) {
+        if (toTransform->pReferenceSlots) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->referenceSlotCount; ++i) {
+                transform_fromhost_VkVideoReferenceSlotKHR(
+                    resourceTracker, (VkVideoReferenceSlotKHR*)(toTransform->pReferenceSlots + i));
             }
         }
     }
 }
 
 void transform_tohost_VkVideoEncodeRateControlInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeRateControlInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeRateControlInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkVideoEncodeRateControlInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeRateControlInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeRateControlInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_KHR_synchronization2
-void transform_tohost_VkMemoryBarrier2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryBarrier2KHR* toTransform)
-{
+void transform_tohost_VkMemoryBarrier2KHR(VkDecoderGlobalState* resourceTracker,
+                                          VkMemoryBarrier2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkMemoryBarrier2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryBarrier2KHR* toTransform)
-{
+void transform_fromhost_VkMemoryBarrier2KHR(VkDecoderGlobalState* resourceTracker,
+                                            VkMemoryBarrier2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkBufferMemoryBarrier2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferMemoryBarrier2KHR* toTransform)
-{
+void transform_tohost_VkBufferMemoryBarrier2KHR(VkDecoderGlobalState* resourceTracker,
+                                                VkBufferMemoryBarrier2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkBufferMemoryBarrier2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferMemoryBarrier2KHR* toTransform)
-{
+void transform_fromhost_VkBufferMemoryBarrier2KHR(VkDecoderGlobalState* resourceTracker,
+                                                  VkBufferMemoryBarrier2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkImageMemoryBarrier2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageMemoryBarrier2KHR* toTransform)
-{
+void transform_tohost_VkImageMemoryBarrier2KHR(VkDecoderGlobalState* resourceTracker,
+                                               VkImageMemoryBarrier2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkImageSubresourceRange(resourceTracker, (VkImageSubresourceRange*)(&toTransform->subresourceRange));
+    transform_tohost_VkImageSubresourceRange(
+        resourceTracker, (VkImageSubresourceRange*)(&toTransform->subresourceRange));
 }
 
-void transform_fromhost_VkImageMemoryBarrier2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageMemoryBarrier2KHR* toTransform)
-{
+void transform_fromhost_VkImageMemoryBarrier2KHR(VkDecoderGlobalState* resourceTracker,
+                                                 VkImageMemoryBarrier2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkImageSubresourceRange(resourceTracker, (VkImageSubresourceRange*)(&toTransform->subresourceRange));
+    transform_fromhost_VkImageSubresourceRange(
+        resourceTracker, (VkImageSubresourceRange*)(&toTransform->subresourceRange));
 }
 
-void transform_tohost_VkDependencyInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDependencyInfoKHR* toTransform)
-{
+void transform_tohost_VkDependencyInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                          VkDependencyInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pMemoryBarriers)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->memoryBarrierCount; ++i)
-            {
-                transform_tohost_VkMemoryBarrier2KHR(resourceTracker, (VkMemoryBarrier2KHR*)(toTransform->pMemoryBarriers + i));
+    if (toTransform) {
+        if (toTransform->pMemoryBarriers) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->memoryBarrierCount; ++i) {
+                transform_tohost_VkMemoryBarrier2KHR(
+                    resourceTracker, (VkMemoryBarrier2KHR*)(toTransform->pMemoryBarriers + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pBufferMemoryBarriers)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->bufferMemoryBarrierCount; ++i)
-            {
-                transform_tohost_VkBufferMemoryBarrier2KHR(resourceTracker, (VkBufferMemoryBarrier2KHR*)(toTransform->pBufferMemoryBarriers + i));
+    if (toTransform) {
+        if (toTransform->pBufferMemoryBarriers) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->bufferMemoryBarrierCount; ++i) {
+                transform_tohost_VkBufferMemoryBarrier2KHR(
+                    resourceTracker,
+                    (VkBufferMemoryBarrier2KHR*)(toTransform->pBufferMemoryBarriers + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pImageMemoryBarriers)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->imageMemoryBarrierCount; ++i)
-            {
-                transform_tohost_VkImageMemoryBarrier2KHR(resourceTracker, (VkImageMemoryBarrier2KHR*)(toTransform->pImageMemoryBarriers + i));
+    if (toTransform) {
+        if (toTransform->pImageMemoryBarriers) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->imageMemoryBarrierCount; ++i) {
+                transform_tohost_VkImageMemoryBarrier2KHR(
+                    resourceTracker,
+                    (VkImageMemoryBarrier2KHR*)(toTransform->pImageMemoryBarriers + i));
             }
         }
     }
 }
 
-void transform_fromhost_VkDependencyInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDependencyInfoKHR* toTransform)
-{
+void transform_fromhost_VkDependencyInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                            VkDependencyInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pMemoryBarriers)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->memoryBarrierCount; ++i)
-            {
-                transform_fromhost_VkMemoryBarrier2KHR(resourceTracker, (VkMemoryBarrier2KHR*)(toTransform->pMemoryBarriers + i));
+    if (toTransform) {
+        if (toTransform->pMemoryBarriers) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->memoryBarrierCount; ++i) {
+                transform_fromhost_VkMemoryBarrier2KHR(
+                    resourceTracker, (VkMemoryBarrier2KHR*)(toTransform->pMemoryBarriers + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pBufferMemoryBarriers)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->bufferMemoryBarrierCount; ++i)
-            {
-                transform_fromhost_VkBufferMemoryBarrier2KHR(resourceTracker, (VkBufferMemoryBarrier2KHR*)(toTransform->pBufferMemoryBarriers + i));
+    if (toTransform) {
+        if (toTransform->pBufferMemoryBarriers) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->bufferMemoryBarrierCount; ++i) {
+                transform_fromhost_VkBufferMemoryBarrier2KHR(
+                    resourceTracker,
+                    (VkBufferMemoryBarrier2KHR*)(toTransform->pBufferMemoryBarriers + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pImageMemoryBarriers)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->imageMemoryBarrierCount; ++i)
-            {
-                transform_fromhost_VkImageMemoryBarrier2KHR(resourceTracker, (VkImageMemoryBarrier2KHR*)(toTransform->pImageMemoryBarriers + i));
+    if (toTransform) {
+        if (toTransform->pImageMemoryBarriers) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->imageMemoryBarrierCount; ++i) {
+                transform_fromhost_VkImageMemoryBarrier2KHR(
+                    resourceTracker,
+                    (VkImageMemoryBarrier2KHR*)(toTransform->pImageMemoryBarriers + i));
             }
         }
     }
 }
 
-void transform_tohost_VkSemaphoreSubmitInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSemaphoreSubmitInfoKHR* toTransform)
-{
+void transform_tohost_VkSemaphoreSubmitInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                               VkSemaphoreSubmitInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkSemaphoreSubmitInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSemaphoreSubmitInfoKHR* toTransform)
-{
+void transform_fromhost_VkSemaphoreSubmitInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                 VkSemaphoreSubmitInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkCommandBufferSubmitInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkCommandBufferSubmitInfoKHR* toTransform)
-{
+void transform_tohost_VkCommandBufferSubmitInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                   VkCommandBufferSubmitInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkCommandBufferSubmitInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkCommandBufferSubmitInfoKHR* toTransform)
-{
+void transform_fromhost_VkCommandBufferSubmitInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                     VkCommandBufferSubmitInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkSubmitInfo2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubmitInfo2KHR* toTransform)
-{
+void transform_tohost_VkSubmitInfo2KHR(VkDecoderGlobalState* resourceTracker,
+                                       VkSubmitInfo2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pWaitSemaphoreInfos)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->waitSemaphoreInfoCount; ++i)
-            {
-                transform_tohost_VkSemaphoreSubmitInfoKHR(resourceTracker, (VkSemaphoreSubmitInfoKHR*)(toTransform->pWaitSemaphoreInfos + i));
+    if (toTransform) {
+        if (toTransform->pWaitSemaphoreInfos) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->waitSemaphoreInfoCount; ++i) {
+                transform_tohost_VkSemaphoreSubmitInfoKHR(
+                    resourceTracker,
+                    (VkSemaphoreSubmitInfoKHR*)(toTransform->pWaitSemaphoreInfos + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pCommandBufferInfos)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->commandBufferInfoCount; ++i)
-            {
-                transform_tohost_VkCommandBufferSubmitInfoKHR(resourceTracker, (VkCommandBufferSubmitInfoKHR*)(toTransform->pCommandBufferInfos + i));
+    if (toTransform) {
+        if (toTransform->pCommandBufferInfos) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->commandBufferInfoCount; ++i) {
+                transform_tohost_VkCommandBufferSubmitInfoKHR(
+                    resourceTracker,
+                    (VkCommandBufferSubmitInfoKHR*)(toTransform->pCommandBufferInfos + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pSignalSemaphoreInfos)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->signalSemaphoreInfoCount; ++i)
-            {
-                transform_tohost_VkSemaphoreSubmitInfoKHR(resourceTracker, (VkSemaphoreSubmitInfoKHR*)(toTransform->pSignalSemaphoreInfos + i));
+    if (toTransform) {
+        if (toTransform->pSignalSemaphoreInfos) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->signalSemaphoreInfoCount; ++i) {
+                transform_tohost_VkSemaphoreSubmitInfoKHR(
+                    resourceTracker,
+                    (VkSemaphoreSubmitInfoKHR*)(toTransform->pSignalSemaphoreInfos + i));
             }
         }
     }
 }
 
-void transform_fromhost_VkSubmitInfo2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubmitInfo2KHR* toTransform)
-{
+void transform_fromhost_VkSubmitInfo2KHR(VkDecoderGlobalState* resourceTracker,
+                                         VkSubmitInfo2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pWaitSemaphoreInfos)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->waitSemaphoreInfoCount; ++i)
-            {
-                transform_fromhost_VkSemaphoreSubmitInfoKHR(resourceTracker, (VkSemaphoreSubmitInfoKHR*)(toTransform->pWaitSemaphoreInfos + i));
+    if (toTransform) {
+        if (toTransform->pWaitSemaphoreInfos) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->waitSemaphoreInfoCount; ++i) {
+                transform_fromhost_VkSemaphoreSubmitInfoKHR(
+                    resourceTracker,
+                    (VkSemaphoreSubmitInfoKHR*)(toTransform->pWaitSemaphoreInfos + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pCommandBufferInfos)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->commandBufferInfoCount; ++i)
-            {
-                transform_fromhost_VkCommandBufferSubmitInfoKHR(resourceTracker, (VkCommandBufferSubmitInfoKHR*)(toTransform->pCommandBufferInfos + i));
+    if (toTransform) {
+        if (toTransform->pCommandBufferInfos) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->commandBufferInfoCount; ++i) {
+                transform_fromhost_VkCommandBufferSubmitInfoKHR(
+                    resourceTracker,
+                    (VkCommandBufferSubmitInfoKHR*)(toTransform->pCommandBufferInfos + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pSignalSemaphoreInfos)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->signalSemaphoreInfoCount; ++i)
-            {
-                transform_fromhost_VkSemaphoreSubmitInfoKHR(resourceTracker, (VkSemaphoreSubmitInfoKHR*)(toTransform->pSignalSemaphoreInfos + i));
+    if (toTransform) {
+        if (toTransform->pSignalSemaphoreInfos) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->signalSemaphoreInfoCount; ++i) {
+                transform_fromhost_VkSemaphoreSubmitInfoKHR(
+                    resourceTracker,
+                    (VkSemaphoreSubmitInfoKHR*)(toTransform->pSignalSemaphoreInfos + i));
             }
         }
     }
@@ -9454,72 +7571,56 @@
 
 void transform_tohost_VkPhysicalDeviceSynchronization2FeaturesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceSynchronization2FeaturesKHR* toTransform)
-{
+    VkPhysicalDeviceSynchronization2FeaturesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceSynchronization2FeaturesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceSynchronization2FeaturesKHR* toTransform)
-{
+    VkPhysicalDeviceSynchronization2FeaturesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkQueueFamilyCheckpointProperties2NV(
-    VkDecoderGlobalState* resourceTracker,
-    VkQueueFamilyCheckpointProperties2NV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkQueueFamilyCheckpointProperties2NV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkQueueFamilyCheckpointProperties2NV(
-    VkDecoderGlobalState* resourceTracker,
-    VkQueueFamilyCheckpointProperties2NV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkQueueFamilyCheckpointProperties2NV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkCheckpointData2NV(
-    VkDecoderGlobalState* resourceTracker,
-    VkCheckpointData2NV* toTransform)
-{
+void transform_tohost_VkCheckpointData2NV(VkDecoderGlobalState* resourceTracker,
+                                          VkCheckpointData2NV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkCheckpointData2NV(
-    VkDecoderGlobalState* resourceTracker,
-    VkCheckpointData2NV* toTransform)
-{
+void transform_fromhost_VkCheckpointData2NV(VkDecoderGlobalState* resourceTracker,
+                                            VkCheckpointData2NV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -9528,24 +7629,20 @@
 #ifdef VK_KHR_shader_subgroup_uniform_control_flow
 void transform_tohost_VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR* toTransform)
-{
+    VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR* toTransform)
-{
+    VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -9554,24 +7651,20 @@
 #ifdef VK_KHR_zero_initialize_workgroup_memory
 void transform_tohost_VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR* toTransform)
-{
+    VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR* toTransform)
-{
+    VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -9580,455 +7673,371 @@
 #ifdef VK_KHR_workgroup_memory_explicit_layout
 void transform_tohost_VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR* toTransform)
-{
+    VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR* toTransform)
-{
+    VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_KHR_copy_commands2
-void transform_tohost_VkBufferCopy2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferCopy2KHR* toTransform)
-{
+void transform_tohost_VkBufferCopy2KHR(VkDecoderGlobalState* resourceTracker,
+                                       VkBufferCopy2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkBufferCopy2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferCopy2KHR* toTransform)
-{
+void transform_fromhost_VkBufferCopy2KHR(VkDecoderGlobalState* resourceTracker,
+                                         VkBufferCopy2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkCopyBufferInfo2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkCopyBufferInfo2KHR* toTransform)
-{
+void transform_tohost_VkCopyBufferInfo2KHR(VkDecoderGlobalState* resourceTracker,
+                                           VkCopyBufferInfo2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pRegions)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->regionCount; ++i)
-            {
-                transform_tohost_VkBufferCopy2KHR(resourceTracker, (VkBufferCopy2KHR*)(toTransform->pRegions + i));
+    if (toTransform) {
+        if (toTransform->pRegions) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->regionCount; ++i) {
+                transform_tohost_VkBufferCopy2KHR(resourceTracker,
+                                                  (VkBufferCopy2KHR*)(toTransform->pRegions + i));
             }
         }
     }
 }
 
-void transform_fromhost_VkCopyBufferInfo2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkCopyBufferInfo2KHR* toTransform)
-{
+void transform_fromhost_VkCopyBufferInfo2KHR(VkDecoderGlobalState* resourceTracker,
+                                             VkCopyBufferInfo2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pRegions)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->regionCount; ++i)
-            {
-                transform_fromhost_VkBufferCopy2KHR(resourceTracker, (VkBufferCopy2KHR*)(toTransform->pRegions + i));
+    if (toTransform) {
+        if (toTransform->pRegions) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->regionCount; ++i) {
+                transform_fromhost_VkBufferCopy2KHR(resourceTracker,
+                                                    (VkBufferCopy2KHR*)(toTransform->pRegions + i));
             }
         }
     }
 }
 
-void transform_tohost_VkImageCopy2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageCopy2KHR* toTransform)
-{
+void transform_tohost_VkImageCopy2KHR(VkDecoderGlobalState* resourceTracker,
+                                      VkImageCopy2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->srcSubresource));
+    transform_tohost_VkImageSubresourceLayers(
+        resourceTracker, (VkImageSubresourceLayers*)(&toTransform->srcSubresource));
     transform_tohost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->srcOffset));
-    transform_tohost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->dstSubresource));
+    transform_tohost_VkImageSubresourceLayers(
+        resourceTracker, (VkImageSubresourceLayers*)(&toTransform->dstSubresource));
     transform_tohost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->dstOffset));
     transform_tohost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->extent));
 }
 
-void transform_fromhost_VkImageCopy2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageCopy2KHR* toTransform)
-{
+void transform_fromhost_VkImageCopy2KHR(VkDecoderGlobalState* resourceTracker,
+                                        VkImageCopy2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->srcSubresource));
+    transform_fromhost_VkImageSubresourceLayers(
+        resourceTracker, (VkImageSubresourceLayers*)(&toTransform->srcSubresource));
     transform_fromhost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->srcOffset));
-    transform_fromhost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->dstSubresource));
+    transform_fromhost_VkImageSubresourceLayers(
+        resourceTracker, (VkImageSubresourceLayers*)(&toTransform->dstSubresource));
     transform_fromhost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->dstOffset));
     transform_fromhost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->extent));
 }
 
-void transform_tohost_VkCopyImageInfo2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkCopyImageInfo2KHR* toTransform)
-{
+void transform_tohost_VkCopyImageInfo2KHR(VkDecoderGlobalState* resourceTracker,
+                                          VkCopyImageInfo2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pRegions)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->regionCount; ++i)
-            {
-                transform_tohost_VkImageCopy2KHR(resourceTracker, (VkImageCopy2KHR*)(toTransform->pRegions + i));
+    if (toTransform) {
+        if (toTransform->pRegions) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->regionCount; ++i) {
+                transform_tohost_VkImageCopy2KHR(resourceTracker,
+                                                 (VkImageCopy2KHR*)(toTransform->pRegions + i));
             }
         }
     }
 }
 
-void transform_fromhost_VkCopyImageInfo2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkCopyImageInfo2KHR* toTransform)
-{
+void transform_fromhost_VkCopyImageInfo2KHR(VkDecoderGlobalState* resourceTracker,
+                                            VkCopyImageInfo2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pRegions)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->regionCount; ++i)
-            {
-                transform_fromhost_VkImageCopy2KHR(resourceTracker, (VkImageCopy2KHR*)(toTransform->pRegions + i));
+    if (toTransform) {
+        if (toTransform->pRegions) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->regionCount; ++i) {
+                transform_fromhost_VkImageCopy2KHR(resourceTracker,
+                                                   (VkImageCopy2KHR*)(toTransform->pRegions + i));
             }
         }
     }
 }
 
-void transform_tohost_VkBufferImageCopy2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferImageCopy2KHR* toTransform)
-{
+void transform_tohost_VkBufferImageCopy2KHR(VkDecoderGlobalState* resourceTracker,
+                                            VkBufferImageCopy2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->imageSubresource));
+    transform_tohost_VkImageSubresourceLayers(
+        resourceTracker, (VkImageSubresourceLayers*)(&toTransform->imageSubresource));
     transform_tohost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->imageOffset));
     transform_tohost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->imageExtent));
 }
 
-void transform_fromhost_VkBufferImageCopy2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferImageCopy2KHR* toTransform)
-{
+void transform_fromhost_VkBufferImageCopy2KHR(VkDecoderGlobalState* resourceTracker,
+                                              VkBufferImageCopy2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->imageSubresource));
+    transform_fromhost_VkImageSubresourceLayers(
+        resourceTracker, (VkImageSubresourceLayers*)(&toTransform->imageSubresource));
     transform_fromhost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->imageOffset));
     transform_fromhost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->imageExtent));
 }
 
-void transform_tohost_VkCopyBufferToImageInfo2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkCopyBufferToImageInfo2KHR* toTransform)
-{
+void transform_tohost_VkCopyBufferToImageInfo2KHR(VkDecoderGlobalState* resourceTracker,
+                                                  VkCopyBufferToImageInfo2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pRegions)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->regionCount; ++i)
-            {
-                transform_tohost_VkBufferImageCopy2KHR(resourceTracker, (VkBufferImageCopy2KHR*)(toTransform->pRegions + i));
+    if (toTransform) {
+        if (toTransform->pRegions) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->regionCount; ++i) {
+                transform_tohost_VkBufferImageCopy2KHR(
+                    resourceTracker, (VkBufferImageCopy2KHR*)(toTransform->pRegions + i));
             }
         }
     }
 }
 
-void transform_fromhost_VkCopyBufferToImageInfo2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkCopyBufferToImageInfo2KHR* toTransform)
-{
+void transform_fromhost_VkCopyBufferToImageInfo2KHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkCopyBufferToImageInfo2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pRegions)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->regionCount; ++i)
-            {
-                transform_fromhost_VkBufferImageCopy2KHR(resourceTracker, (VkBufferImageCopy2KHR*)(toTransform->pRegions + i));
+    if (toTransform) {
+        if (toTransform->pRegions) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->regionCount; ++i) {
+                transform_fromhost_VkBufferImageCopy2KHR(
+                    resourceTracker, (VkBufferImageCopy2KHR*)(toTransform->pRegions + i));
             }
         }
     }
 }
 
-void transform_tohost_VkCopyImageToBufferInfo2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkCopyImageToBufferInfo2KHR* toTransform)
-{
+void transform_tohost_VkCopyImageToBufferInfo2KHR(VkDecoderGlobalState* resourceTracker,
+                                                  VkCopyImageToBufferInfo2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pRegions)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->regionCount; ++i)
-            {
-                transform_tohost_VkBufferImageCopy2KHR(resourceTracker, (VkBufferImageCopy2KHR*)(toTransform->pRegions + i));
+    if (toTransform) {
+        if (toTransform->pRegions) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->regionCount; ++i) {
+                transform_tohost_VkBufferImageCopy2KHR(
+                    resourceTracker, (VkBufferImageCopy2KHR*)(toTransform->pRegions + i));
             }
         }
     }
 }
 
-void transform_fromhost_VkCopyImageToBufferInfo2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkCopyImageToBufferInfo2KHR* toTransform)
-{
+void transform_fromhost_VkCopyImageToBufferInfo2KHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkCopyImageToBufferInfo2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pRegions)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->regionCount; ++i)
-            {
-                transform_fromhost_VkBufferImageCopy2KHR(resourceTracker, (VkBufferImageCopy2KHR*)(toTransform->pRegions + i));
+    if (toTransform) {
+        if (toTransform->pRegions) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->regionCount; ++i) {
+                transform_fromhost_VkBufferImageCopy2KHR(
+                    resourceTracker, (VkBufferImageCopy2KHR*)(toTransform->pRegions + i));
             }
         }
     }
 }
 
-void transform_tohost_VkImageBlit2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageBlit2KHR* toTransform)
-{
+void transform_tohost_VkImageBlit2KHR(VkDecoderGlobalState* resourceTracker,
+                                      VkImageBlit2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->srcSubresource));
-    for (uint32_t i = 0; i < (uint32_t)2; ++i)
-    {
+    transform_tohost_VkImageSubresourceLayers(
+        resourceTracker, (VkImageSubresourceLayers*)(&toTransform->srcSubresource));
+    for (uint32_t i = 0; i < (uint32_t)2; ++i) {
         transform_tohost_VkOffset3D(resourceTracker, (VkOffset3D*)(toTransform->srcOffsets + i));
     }
-    transform_tohost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->dstSubresource));
-    for (uint32_t i = 0; i < (uint32_t)2; ++i)
-    {
+    transform_tohost_VkImageSubresourceLayers(
+        resourceTracker, (VkImageSubresourceLayers*)(&toTransform->dstSubresource));
+    for (uint32_t i = 0; i < (uint32_t)2; ++i) {
         transform_tohost_VkOffset3D(resourceTracker, (VkOffset3D*)(toTransform->dstOffsets + i));
     }
 }
 
-void transform_fromhost_VkImageBlit2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageBlit2KHR* toTransform)
-{
+void transform_fromhost_VkImageBlit2KHR(VkDecoderGlobalState* resourceTracker,
+                                        VkImageBlit2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->srcSubresource));
-    for (uint32_t i = 0; i < (uint32_t)2; ++i)
-    {
+    transform_fromhost_VkImageSubresourceLayers(
+        resourceTracker, (VkImageSubresourceLayers*)(&toTransform->srcSubresource));
+    for (uint32_t i = 0; i < (uint32_t)2; ++i) {
         transform_fromhost_VkOffset3D(resourceTracker, (VkOffset3D*)(toTransform->srcOffsets + i));
     }
-    transform_fromhost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->dstSubresource));
-    for (uint32_t i = 0; i < (uint32_t)2; ++i)
-    {
+    transform_fromhost_VkImageSubresourceLayers(
+        resourceTracker, (VkImageSubresourceLayers*)(&toTransform->dstSubresource));
+    for (uint32_t i = 0; i < (uint32_t)2; ++i) {
         transform_fromhost_VkOffset3D(resourceTracker, (VkOffset3D*)(toTransform->dstOffsets + i));
     }
 }
 
-void transform_tohost_VkBlitImageInfo2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkBlitImageInfo2KHR* toTransform)
-{
+void transform_tohost_VkBlitImageInfo2KHR(VkDecoderGlobalState* resourceTracker,
+                                          VkBlitImageInfo2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pRegions)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->regionCount; ++i)
-            {
-                transform_tohost_VkImageBlit2KHR(resourceTracker, (VkImageBlit2KHR*)(toTransform->pRegions + i));
+    if (toTransform) {
+        if (toTransform->pRegions) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->regionCount; ++i) {
+                transform_tohost_VkImageBlit2KHR(resourceTracker,
+                                                 (VkImageBlit2KHR*)(toTransform->pRegions + i));
             }
         }
     }
 }
 
-void transform_fromhost_VkBlitImageInfo2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkBlitImageInfo2KHR* toTransform)
-{
+void transform_fromhost_VkBlitImageInfo2KHR(VkDecoderGlobalState* resourceTracker,
+                                            VkBlitImageInfo2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pRegions)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->regionCount; ++i)
-            {
-                transform_fromhost_VkImageBlit2KHR(resourceTracker, (VkImageBlit2KHR*)(toTransform->pRegions + i));
+    if (toTransform) {
+        if (toTransform->pRegions) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->regionCount; ++i) {
+                transform_fromhost_VkImageBlit2KHR(resourceTracker,
+                                                   (VkImageBlit2KHR*)(toTransform->pRegions + i));
             }
         }
     }
 }
 
-void transform_tohost_VkImageResolve2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageResolve2KHR* toTransform)
-{
+void transform_tohost_VkImageResolve2KHR(VkDecoderGlobalState* resourceTracker,
+                                         VkImageResolve2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->srcSubresource));
+    transform_tohost_VkImageSubresourceLayers(
+        resourceTracker, (VkImageSubresourceLayers*)(&toTransform->srcSubresource));
     transform_tohost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->srcOffset));
-    transform_tohost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->dstSubresource));
+    transform_tohost_VkImageSubresourceLayers(
+        resourceTracker, (VkImageSubresourceLayers*)(&toTransform->dstSubresource));
     transform_tohost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->dstOffset));
     transform_tohost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->extent));
 }
 
-void transform_fromhost_VkImageResolve2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageResolve2KHR* toTransform)
-{
+void transform_fromhost_VkImageResolve2KHR(VkDecoderGlobalState* resourceTracker,
+                                           VkImageResolve2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->srcSubresource));
+    transform_fromhost_VkImageSubresourceLayers(
+        resourceTracker, (VkImageSubresourceLayers*)(&toTransform->srcSubresource));
     transform_fromhost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->srcOffset));
-    transform_fromhost_VkImageSubresourceLayers(resourceTracker, (VkImageSubresourceLayers*)(&toTransform->dstSubresource));
+    transform_fromhost_VkImageSubresourceLayers(
+        resourceTracker, (VkImageSubresourceLayers*)(&toTransform->dstSubresource));
     transform_fromhost_VkOffset3D(resourceTracker, (VkOffset3D*)(&toTransform->dstOffset));
     transform_fromhost_VkExtent3D(resourceTracker, (VkExtent3D*)(&toTransform->extent));
 }
 
-void transform_tohost_VkResolveImageInfo2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkResolveImageInfo2KHR* toTransform)
-{
+void transform_tohost_VkResolveImageInfo2KHR(VkDecoderGlobalState* resourceTracker,
+                                             VkResolveImageInfo2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pRegions)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->regionCount; ++i)
-            {
-                transform_tohost_VkImageResolve2KHR(resourceTracker, (VkImageResolve2KHR*)(toTransform->pRegions + i));
+    if (toTransform) {
+        if (toTransform->pRegions) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->regionCount; ++i) {
+                transform_tohost_VkImageResolve2KHR(
+                    resourceTracker, (VkImageResolve2KHR*)(toTransform->pRegions + i));
             }
         }
     }
 }
 
-void transform_fromhost_VkResolveImageInfo2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkResolveImageInfo2KHR* toTransform)
-{
+void transform_fromhost_VkResolveImageInfo2KHR(VkDecoderGlobalState* resourceTracker,
+                                               VkResolveImageInfo2KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pRegions)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->regionCount; ++i)
-            {
-                transform_fromhost_VkImageResolve2KHR(resourceTracker, (VkImageResolve2KHR*)(toTransform->pRegions + i));
+    if (toTransform) {
+        if (toTransform->pRegions) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->regionCount; ++i) {
+                transform_fromhost_VkImageResolve2KHR(
+                    resourceTracker, (VkImageResolve2KHR*)(toTransform->pRegions + i));
             }
         }
     }
@@ -10036,26 +8045,20 @@
 
 #endif
 #ifdef VK_KHR_format_feature_flags2
-void transform_tohost_VkFormatProperties3KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkFormatProperties3KHR* toTransform)
-{
+void transform_tohost_VkFormatProperties3KHR(VkDecoderGlobalState* resourceTracker,
+                                             VkFormatProperties3KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkFormatProperties3KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkFormatProperties3KHR* toTransform)
-{
+void transform_fromhost_VkFormatProperties3KHR(VkDecoderGlobalState* resourceTracker,
+                                               VkFormatProperties3KHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -10063,141 +8066,111 @@
 #endif
 #ifdef VK_KHR_maintenance4
 void transform_tohost_VkPhysicalDeviceMaintenance4FeaturesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMaintenance4FeaturesKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMaintenance4FeaturesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceMaintenance4FeaturesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMaintenance4FeaturesKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMaintenance4FeaturesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceMaintenance4PropertiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMaintenance4PropertiesKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMaintenance4PropertiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceMaintenance4PropertiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMaintenance4PropertiesKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMaintenance4PropertiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkDeviceBufferMemoryRequirementsKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceBufferMemoryRequirementsKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDeviceBufferMemoryRequirementsKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pCreateInfo)
-    {
-        transform_tohost_VkBufferCreateInfo(resourceTracker, (VkBufferCreateInfo*)(toTransform->pCreateInfo));
+    if (toTransform->pCreateInfo) {
+        transform_tohost_VkBufferCreateInfo(resourceTracker,
+                                            (VkBufferCreateInfo*)(toTransform->pCreateInfo));
     }
 }
 
 void transform_fromhost_VkDeviceBufferMemoryRequirementsKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceBufferMemoryRequirementsKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDeviceBufferMemoryRequirementsKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pCreateInfo)
-    {
-        transform_fromhost_VkBufferCreateInfo(resourceTracker, (VkBufferCreateInfo*)(toTransform->pCreateInfo));
+    if (toTransform->pCreateInfo) {
+        transform_fromhost_VkBufferCreateInfo(resourceTracker,
+                                              (VkBufferCreateInfo*)(toTransform->pCreateInfo));
     }
 }
 
 void transform_tohost_VkDeviceImageMemoryRequirementsKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceImageMemoryRequirementsKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDeviceImageMemoryRequirementsKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pCreateInfo)
-    {
+    if (toTransform->pCreateInfo) {
         resourceTracker->transformImpl_VkImageCreateInfo_tohost(toTransform->pCreateInfo, 1);
-        transform_tohost_VkImageCreateInfo(resourceTracker, (VkImageCreateInfo*)(toTransform->pCreateInfo));
+        transform_tohost_VkImageCreateInfo(resourceTracker,
+                                           (VkImageCreateInfo*)(toTransform->pCreateInfo));
     }
 }
 
 void transform_fromhost_VkDeviceImageMemoryRequirementsKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceImageMemoryRequirementsKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDeviceImageMemoryRequirementsKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pCreateInfo)
-    {
+    if (toTransform->pCreateInfo) {
         resourceTracker->transformImpl_VkImageCreateInfo_fromhost(toTransform->pCreateInfo, 1);
-        transform_fromhost_VkImageCreateInfo(resourceTracker, (VkImageCreateInfo*)(toTransform->pCreateInfo));
+        transform_fromhost_VkImageCreateInfo(resourceTracker,
+                                             (VkImageCreateInfo*)(toTransform->pCreateInfo));
     }
 }
 
 #endif
 #ifdef VK_ANDROID_native_buffer
-void transform_tohost_VkNativeBufferANDROID(
-    VkDecoderGlobalState* resourceTracker,
-    VkNativeBufferANDROID* toTransform)
-{
+void transform_tohost_VkNativeBufferANDROID(VkDecoderGlobalState* resourceTracker,
+                                            VkNativeBufferANDROID* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkNativeBufferANDROID(
-    VkDecoderGlobalState* resourceTracker,
-    VkNativeBufferANDROID* toTransform)
-{
+void transform_fromhost_VkNativeBufferANDROID(VkDecoderGlobalState* resourceTracker,
+                                              VkNativeBufferANDROID* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -10205,25 +8178,19 @@
 #endif
 #ifdef VK_EXT_debug_report
 void transform_tohost_VkDebugReportCallbackCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDebugReportCallbackCreateInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDebugReportCallbackCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkDebugReportCallbackCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDebugReportCallbackCreateInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDebugReportCallbackCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -10238,24 +8205,20 @@
 #ifdef VK_AMD_rasterization_order
 void transform_tohost_VkPipelineRasterizationStateRasterizationOrderAMD(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineRasterizationStateRasterizationOrderAMD* toTransform)
-{
+    VkPipelineRasterizationStateRasterizationOrderAMD* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPipelineRasterizationStateRasterizationOrderAMD(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineRasterizationStateRasterizationOrderAMD* toTransform)
-{
+    VkPipelineRasterizationStateRasterizationOrderAMD* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -10266,74 +8229,56 @@
 #ifdef VK_AMD_shader_explicit_vertex_parameter
 #endif
 #ifdef VK_EXT_debug_marker
-void transform_tohost_VkDebugMarkerObjectNameInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDebugMarkerObjectNameInfoEXT* toTransform)
-{
+void transform_tohost_VkDebugMarkerObjectNameInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                     VkDebugMarkerObjectNameInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkDebugMarkerObjectNameInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDebugMarkerObjectNameInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDebugMarkerObjectNameInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkDebugMarkerObjectTagInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDebugMarkerObjectTagInfoEXT* toTransform)
-{
+void transform_tohost_VkDebugMarkerObjectTagInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                    VkDebugMarkerObjectTagInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkDebugMarkerObjectTagInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDebugMarkerObjectTagInfoEXT* toTransform)
-{
+void transform_fromhost_VkDebugMarkerObjectTagInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                      VkDebugMarkerObjectTagInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkDebugMarkerMarkerInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDebugMarkerMarkerInfoEXT* toTransform)
-{
+void transform_tohost_VkDebugMarkerMarkerInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                 VkDebugMarkerMarkerInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkDebugMarkerMarkerInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDebugMarkerMarkerInfoEXT* toTransform)
-{
+void transform_fromhost_VkDebugMarkerMarkerInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                   VkDebugMarkerMarkerInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -10343,73 +8288,55 @@
 #endif
 #ifdef VK_NV_dedicated_allocation
 void transform_tohost_VkDedicatedAllocationImageCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkDedicatedAllocationImageCreateInfoNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDedicatedAllocationImageCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkDedicatedAllocationImageCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkDedicatedAllocationImageCreateInfoNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDedicatedAllocationImageCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkDedicatedAllocationBufferCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkDedicatedAllocationBufferCreateInfoNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDedicatedAllocationBufferCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkDedicatedAllocationBufferCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkDedicatedAllocationBufferCreateInfoNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDedicatedAllocationBufferCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkDedicatedAllocationMemoryAllocateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkDedicatedAllocationMemoryAllocateInfoNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDedicatedAllocationMemoryAllocateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkDedicatedAllocationMemoryAllocateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkDedicatedAllocationMemoryAllocateInfoNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDedicatedAllocationMemoryAllocateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -10418,196 +8345,154 @@
 #ifdef VK_EXT_transform_feedback
 void transform_tohost_VkPhysicalDeviceTransformFeedbackFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceTransformFeedbackFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceTransformFeedbackFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceTransformFeedbackFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceTransformFeedbackFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceTransformFeedbackFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceTransformFeedbackPropertiesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceTransformFeedbackPropertiesEXT* toTransform)
-{
+    VkPhysicalDeviceTransformFeedbackPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceTransformFeedbackPropertiesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceTransformFeedbackPropertiesEXT* toTransform)
-{
+    VkPhysicalDeviceTransformFeedbackPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPipelineRasterizationStateStreamCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineRasterizationStateStreamCreateInfoEXT* toTransform)
-{
+    VkPipelineRasterizationStateStreamCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPipelineRasterizationStateStreamCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineRasterizationStateStreamCreateInfoEXT* toTransform)
-{
+    VkPipelineRasterizationStateStreamCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_NVX_binary_import
-void transform_tohost_VkCuModuleCreateInfoNVX(
-    VkDecoderGlobalState* resourceTracker,
-    VkCuModuleCreateInfoNVX* toTransform)
-{
+void transform_tohost_VkCuModuleCreateInfoNVX(VkDecoderGlobalState* resourceTracker,
+                                              VkCuModuleCreateInfoNVX* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkCuModuleCreateInfoNVX(
-    VkDecoderGlobalState* resourceTracker,
-    VkCuModuleCreateInfoNVX* toTransform)
-{
+void transform_fromhost_VkCuModuleCreateInfoNVX(VkDecoderGlobalState* resourceTracker,
+                                                VkCuModuleCreateInfoNVX* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkCuFunctionCreateInfoNVX(
-    VkDecoderGlobalState* resourceTracker,
-    VkCuFunctionCreateInfoNVX* toTransform)
-{
+void transform_tohost_VkCuFunctionCreateInfoNVX(VkDecoderGlobalState* resourceTracker,
+                                                VkCuFunctionCreateInfoNVX* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkCuFunctionCreateInfoNVX(
-    VkDecoderGlobalState* resourceTracker,
-    VkCuFunctionCreateInfoNVX* toTransform)
-{
+void transform_fromhost_VkCuFunctionCreateInfoNVX(VkDecoderGlobalState* resourceTracker,
+                                                  VkCuFunctionCreateInfoNVX* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkCuLaunchInfoNVX(
-    VkDecoderGlobalState* resourceTracker,
-    VkCuLaunchInfoNVX* toTransform)
-{
+void transform_tohost_VkCuLaunchInfoNVX(VkDecoderGlobalState* resourceTracker,
+                                        VkCuLaunchInfoNVX* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkCuLaunchInfoNVX(
-    VkDecoderGlobalState* resourceTracker,
-    VkCuLaunchInfoNVX* toTransform)
-{
+void transform_fromhost_VkCuLaunchInfoNVX(VkDecoderGlobalState* resourceTracker,
+                                          VkCuLaunchInfoNVX* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_NVX_image_view_handle
-void transform_tohost_VkImageViewHandleInfoNVX(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageViewHandleInfoNVX* toTransform)
-{
+void transform_tohost_VkImageViewHandleInfoNVX(VkDecoderGlobalState* resourceTracker,
+                                               VkImageViewHandleInfoNVX* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkImageViewHandleInfoNVX(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageViewHandleInfoNVX* toTransform)
-{
+void transform_fromhost_VkImageViewHandleInfoNVX(VkDecoderGlobalState* resourceTracker,
+                                                 VkImageViewHandleInfoNVX* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkImageViewAddressPropertiesNVX(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageViewAddressPropertiesNVX* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkImageViewAddressPropertiesNVX* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkImageViewAddressPropertiesNVX(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageViewAddressPropertiesNVX* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkImageViewAddressPropertiesNVX* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -10623,351 +8508,304 @@
 #endif
 #ifdef VK_EXT_video_encode_h264
 void transform_tohost_VkVideoEncodeH264CapabilitiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH264CapabilitiesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH264CapabilitiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
     transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->minPictureSizeInMbs));
     transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxPictureSizeInMbs));
-    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->inputImageDataAlignment));
-    transform_tohost_VkExtensionProperties(resourceTracker, (VkExtensionProperties*)(&toTransform->stdExtensionVersion));
+    transform_tohost_VkExtent2D(resourceTracker,
+                                (VkExtent2D*)(&toTransform->inputImageDataAlignment));
+    transform_tohost_VkExtensionProperties(
+        resourceTracker, (VkExtensionProperties*)(&toTransform->stdExtensionVersion));
 }
 
 void transform_fromhost_VkVideoEncodeH264CapabilitiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH264CapabilitiesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH264CapabilitiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->minPictureSizeInMbs));
-    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxPictureSizeInMbs));
-    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->inputImageDataAlignment));
-    transform_fromhost_VkExtensionProperties(resourceTracker, (VkExtensionProperties*)(&toTransform->stdExtensionVersion));
+    transform_fromhost_VkExtent2D(resourceTracker,
+                                  (VkExtent2D*)(&toTransform->minPictureSizeInMbs));
+    transform_fromhost_VkExtent2D(resourceTracker,
+                                  (VkExtent2D*)(&toTransform->maxPictureSizeInMbs));
+    transform_fromhost_VkExtent2D(resourceTracker,
+                                  (VkExtent2D*)(&toTransform->inputImageDataAlignment));
+    transform_fromhost_VkExtensionProperties(
+        resourceTracker, (VkExtensionProperties*)(&toTransform->stdExtensionVersion));
 }
 
 void transform_tohost_VkVideoEncodeH264SessionCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH264SessionCreateInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH264SessionCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
     transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxPictureSizeInMbs));
-    if (toTransform->pStdExtensionVersion)
-    {
-        transform_tohost_VkExtensionProperties(resourceTracker, (VkExtensionProperties*)(toTransform->pStdExtensionVersion));
+    if (toTransform->pStdExtensionVersion) {
+        transform_tohost_VkExtensionProperties(
+            resourceTracker, (VkExtensionProperties*)(toTransform->pStdExtensionVersion));
     }
 }
 
 void transform_fromhost_VkVideoEncodeH264SessionCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH264SessionCreateInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH264SessionCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxPictureSizeInMbs));
-    if (toTransform->pStdExtensionVersion)
-    {
-        transform_fromhost_VkExtensionProperties(resourceTracker, (VkExtensionProperties*)(toTransform->pStdExtensionVersion));
+    transform_fromhost_VkExtent2D(resourceTracker,
+                                  (VkExtent2D*)(&toTransform->maxPictureSizeInMbs));
+    if (toTransform->pStdExtensionVersion) {
+        transform_fromhost_VkExtensionProperties(
+            resourceTracker, (VkExtensionProperties*)(toTransform->pStdExtensionVersion));
     }
 }
 
 void transform_tohost_VkVideoEncodeH264SessionParametersAddInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH264SessionParametersAddInfoEXT* toTransform)
-{
+    VkVideoEncodeH264SessionParametersAddInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkVideoEncodeH264SessionParametersAddInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH264SessionParametersAddInfoEXT* toTransform)
-{
+    VkVideoEncodeH264SessionParametersAddInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkVideoEncodeH264SessionParametersCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH264SessionParametersCreateInfoEXT* toTransform)
-{
+    VkVideoEncodeH264SessionParametersCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pParametersAddInfo)
-    {
-        transform_tohost_VkVideoEncodeH264SessionParametersAddInfoEXT(resourceTracker, (VkVideoEncodeH264SessionParametersAddInfoEXT*)(toTransform->pParametersAddInfo));
+    if (toTransform->pParametersAddInfo) {
+        transform_tohost_VkVideoEncodeH264SessionParametersAddInfoEXT(
+            resourceTracker,
+            (VkVideoEncodeH264SessionParametersAddInfoEXT*)(toTransform->pParametersAddInfo));
     }
 }
 
 void transform_fromhost_VkVideoEncodeH264SessionParametersCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH264SessionParametersCreateInfoEXT* toTransform)
-{
+    VkVideoEncodeH264SessionParametersCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pParametersAddInfo)
-    {
-        transform_fromhost_VkVideoEncodeH264SessionParametersAddInfoEXT(resourceTracker, (VkVideoEncodeH264SessionParametersAddInfoEXT*)(toTransform->pParametersAddInfo));
+    if (toTransform->pParametersAddInfo) {
+        transform_fromhost_VkVideoEncodeH264SessionParametersAddInfoEXT(
+            resourceTracker,
+            (VkVideoEncodeH264SessionParametersAddInfoEXT*)(toTransform->pParametersAddInfo));
     }
 }
 
 void transform_tohost_VkVideoEncodeH264DpbSlotInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH264DpbSlotInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH264DpbSlotInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkVideoEncodeH264DpbSlotInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH264DpbSlotInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH264DpbSlotInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkVideoEncodeH264NaluSliceEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH264NaluSliceEXT* toTransform)
-{
+void transform_tohost_VkVideoEncodeH264NaluSliceEXT(VkDecoderGlobalState* resourceTracker,
+                                                    VkVideoEncodeH264NaluSliceEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pRefFinalList0Entries)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->refFinalList0EntryCount; ++i)
-            {
-                transform_tohost_VkVideoEncodeH264DpbSlotInfoEXT(resourceTracker, (VkVideoEncodeH264DpbSlotInfoEXT*)(toTransform->pRefFinalList0Entries + i));
+    if (toTransform) {
+        if (toTransform->pRefFinalList0Entries) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->refFinalList0EntryCount; ++i) {
+                transform_tohost_VkVideoEncodeH264DpbSlotInfoEXT(
+                    resourceTracker,
+                    (VkVideoEncodeH264DpbSlotInfoEXT*)(toTransform->pRefFinalList0Entries + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pRefFinalList1Entries)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->refFinalList1EntryCount; ++i)
-            {
-                transform_tohost_VkVideoEncodeH264DpbSlotInfoEXT(resourceTracker, (VkVideoEncodeH264DpbSlotInfoEXT*)(toTransform->pRefFinalList1Entries + i));
+    if (toTransform) {
+        if (toTransform->pRefFinalList1Entries) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->refFinalList1EntryCount; ++i) {
+                transform_tohost_VkVideoEncodeH264DpbSlotInfoEXT(
+                    resourceTracker,
+                    (VkVideoEncodeH264DpbSlotInfoEXT*)(toTransform->pRefFinalList1Entries + i));
             }
         }
     }
 }
 
-void transform_fromhost_VkVideoEncodeH264NaluSliceEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH264NaluSliceEXT* toTransform)
-{
+void transform_fromhost_VkVideoEncodeH264NaluSliceEXT(VkDecoderGlobalState* resourceTracker,
+                                                      VkVideoEncodeH264NaluSliceEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pRefFinalList0Entries)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->refFinalList0EntryCount; ++i)
-            {
-                transform_fromhost_VkVideoEncodeH264DpbSlotInfoEXT(resourceTracker, (VkVideoEncodeH264DpbSlotInfoEXT*)(toTransform->pRefFinalList0Entries + i));
+    if (toTransform) {
+        if (toTransform->pRefFinalList0Entries) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->refFinalList0EntryCount; ++i) {
+                transform_fromhost_VkVideoEncodeH264DpbSlotInfoEXT(
+                    resourceTracker,
+                    (VkVideoEncodeH264DpbSlotInfoEXT*)(toTransform->pRefFinalList0Entries + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pRefFinalList1Entries)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->refFinalList1EntryCount; ++i)
-            {
-                transform_fromhost_VkVideoEncodeH264DpbSlotInfoEXT(resourceTracker, (VkVideoEncodeH264DpbSlotInfoEXT*)(toTransform->pRefFinalList1Entries + i));
+    if (toTransform) {
+        if (toTransform->pRefFinalList1Entries) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->refFinalList1EntryCount; ++i) {
+                transform_fromhost_VkVideoEncodeH264DpbSlotInfoEXT(
+                    resourceTracker,
+                    (VkVideoEncodeH264DpbSlotInfoEXT*)(toTransform->pRefFinalList1Entries + i));
             }
         }
     }
 }
 
 void transform_tohost_VkVideoEncodeH264VclFrameInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH264VclFrameInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH264VclFrameInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pRefDefaultFinalList0Entries)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->refDefaultFinalList0EntryCount; ++i)
-            {
-                transform_tohost_VkVideoEncodeH264DpbSlotInfoEXT(resourceTracker, (VkVideoEncodeH264DpbSlotInfoEXT*)(toTransform->pRefDefaultFinalList0Entries + i));
+    if (toTransform) {
+        if (toTransform->pRefDefaultFinalList0Entries) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->refDefaultFinalList0EntryCount; ++i) {
+                transform_tohost_VkVideoEncodeH264DpbSlotInfoEXT(
+                    resourceTracker,
+                    (VkVideoEncodeH264DpbSlotInfoEXT*)(toTransform->pRefDefaultFinalList0Entries +
+                                                       i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pRefDefaultFinalList1Entries)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->refDefaultFinalList1EntryCount; ++i)
-            {
-                transform_tohost_VkVideoEncodeH264DpbSlotInfoEXT(resourceTracker, (VkVideoEncodeH264DpbSlotInfoEXT*)(toTransform->pRefDefaultFinalList1Entries + i));
+    if (toTransform) {
+        if (toTransform->pRefDefaultFinalList1Entries) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->refDefaultFinalList1EntryCount; ++i) {
+                transform_tohost_VkVideoEncodeH264DpbSlotInfoEXT(
+                    resourceTracker,
+                    (VkVideoEncodeH264DpbSlotInfoEXT*)(toTransform->pRefDefaultFinalList1Entries +
+                                                       i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pNaluSliceEntries)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->naluSliceEntryCount; ++i)
-            {
-                transform_tohost_VkVideoEncodeH264NaluSliceEXT(resourceTracker, (VkVideoEncodeH264NaluSliceEXT*)(toTransform->pNaluSliceEntries + i));
+    if (toTransform) {
+        if (toTransform->pNaluSliceEntries) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->naluSliceEntryCount; ++i) {
+                transform_tohost_VkVideoEncodeH264NaluSliceEXT(
+                    resourceTracker,
+                    (VkVideoEncodeH264NaluSliceEXT*)(toTransform->pNaluSliceEntries + i));
             }
         }
     }
-    if (toTransform->pCurrentPictureInfo)
-    {
-        transform_tohost_VkVideoEncodeH264DpbSlotInfoEXT(resourceTracker, (VkVideoEncodeH264DpbSlotInfoEXT*)(toTransform->pCurrentPictureInfo));
+    if (toTransform->pCurrentPictureInfo) {
+        transform_tohost_VkVideoEncodeH264DpbSlotInfoEXT(
+            resourceTracker, (VkVideoEncodeH264DpbSlotInfoEXT*)(toTransform->pCurrentPictureInfo));
     }
 }
 
 void transform_fromhost_VkVideoEncodeH264VclFrameInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH264VclFrameInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH264VclFrameInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pRefDefaultFinalList0Entries)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->refDefaultFinalList0EntryCount; ++i)
-            {
-                transform_fromhost_VkVideoEncodeH264DpbSlotInfoEXT(resourceTracker, (VkVideoEncodeH264DpbSlotInfoEXT*)(toTransform->pRefDefaultFinalList0Entries + i));
+    if (toTransform) {
+        if (toTransform->pRefDefaultFinalList0Entries) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->refDefaultFinalList0EntryCount; ++i) {
+                transform_fromhost_VkVideoEncodeH264DpbSlotInfoEXT(
+                    resourceTracker,
+                    (VkVideoEncodeH264DpbSlotInfoEXT*)(toTransform->pRefDefaultFinalList0Entries +
+                                                       i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pRefDefaultFinalList1Entries)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->refDefaultFinalList1EntryCount; ++i)
-            {
-                transform_fromhost_VkVideoEncodeH264DpbSlotInfoEXT(resourceTracker, (VkVideoEncodeH264DpbSlotInfoEXT*)(toTransform->pRefDefaultFinalList1Entries + i));
+    if (toTransform) {
+        if (toTransform->pRefDefaultFinalList1Entries) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->refDefaultFinalList1EntryCount; ++i) {
+                transform_fromhost_VkVideoEncodeH264DpbSlotInfoEXT(
+                    resourceTracker,
+                    (VkVideoEncodeH264DpbSlotInfoEXT*)(toTransform->pRefDefaultFinalList1Entries +
+                                                       i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pNaluSliceEntries)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->naluSliceEntryCount; ++i)
-            {
-                transform_fromhost_VkVideoEncodeH264NaluSliceEXT(resourceTracker, (VkVideoEncodeH264NaluSliceEXT*)(toTransform->pNaluSliceEntries + i));
+    if (toTransform) {
+        if (toTransform->pNaluSliceEntries) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->naluSliceEntryCount; ++i) {
+                transform_fromhost_VkVideoEncodeH264NaluSliceEXT(
+                    resourceTracker,
+                    (VkVideoEncodeH264NaluSliceEXT*)(toTransform->pNaluSliceEntries + i));
             }
         }
     }
-    if (toTransform->pCurrentPictureInfo)
-    {
-        transform_fromhost_VkVideoEncodeH264DpbSlotInfoEXT(resourceTracker, (VkVideoEncodeH264DpbSlotInfoEXT*)(toTransform->pCurrentPictureInfo));
+    if (toTransform->pCurrentPictureInfo) {
+        transform_fromhost_VkVideoEncodeH264DpbSlotInfoEXT(
+            resourceTracker, (VkVideoEncodeH264DpbSlotInfoEXT*)(toTransform->pCurrentPictureInfo));
     }
 }
 
 void transform_tohost_VkVideoEncodeH264EmitPictureParametersEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH264EmitPictureParametersEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH264EmitPictureParametersEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkVideoEncodeH264EmitPictureParametersEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH264EmitPictureParametersEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH264EmitPictureParametersEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkVideoEncodeH264ProfileEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH264ProfileEXT* toTransform)
-{
+void transform_tohost_VkVideoEncodeH264ProfileEXT(VkDecoderGlobalState* resourceTracker,
+                                                  VkVideoEncodeH264ProfileEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkVideoEncodeH264ProfileEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH264ProfileEXT* toTransform)
-{
+void transform_fromhost_VkVideoEncodeH264ProfileEXT(VkDecoderGlobalState* resourceTracker,
+                                                    VkVideoEncodeH264ProfileEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -10975,551 +8813,461 @@
 #endif
 #ifdef VK_EXT_video_encode_h265
 void transform_tohost_VkVideoEncodeH265CapabilitiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH265CapabilitiesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH265CapabilitiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->inputImageDataAlignment));
-    transform_tohost_VkExtensionProperties(resourceTracker, (VkExtensionProperties*)(&toTransform->stdExtensionVersion));
+    transform_tohost_VkExtent2D(resourceTracker,
+                                (VkExtent2D*)(&toTransform->inputImageDataAlignment));
+    transform_tohost_VkExtensionProperties(
+        resourceTracker, (VkExtensionProperties*)(&toTransform->stdExtensionVersion));
 }
 
 void transform_fromhost_VkVideoEncodeH265CapabilitiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH265CapabilitiesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH265CapabilitiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->inputImageDataAlignment));
-    transform_fromhost_VkExtensionProperties(resourceTracker, (VkExtensionProperties*)(&toTransform->stdExtensionVersion));
+    transform_fromhost_VkExtent2D(resourceTracker,
+                                  (VkExtent2D*)(&toTransform->inputImageDataAlignment));
+    transform_fromhost_VkExtensionProperties(
+        resourceTracker, (VkExtensionProperties*)(&toTransform->stdExtensionVersion));
 }
 
 void transform_tohost_VkVideoEncodeH265SessionCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH265SessionCreateInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH265SessionCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pStdExtensionVersion)
-    {
-        transform_tohost_VkExtensionProperties(resourceTracker, (VkExtensionProperties*)(toTransform->pStdExtensionVersion));
+    if (toTransform->pStdExtensionVersion) {
+        transform_tohost_VkExtensionProperties(
+            resourceTracker, (VkExtensionProperties*)(toTransform->pStdExtensionVersion));
     }
 }
 
 void transform_fromhost_VkVideoEncodeH265SessionCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH265SessionCreateInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH265SessionCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pStdExtensionVersion)
-    {
-        transform_fromhost_VkExtensionProperties(resourceTracker, (VkExtensionProperties*)(toTransform->pStdExtensionVersion));
+    if (toTransform->pStdExtensionVersion) {
+        transform_fromhost_VkExtensionProperties(
+            resourceTracker, (VkExtensionProperties*)(toTransform->pStdExtensionVersion));
     }
 }
 
 void transform_tohost_VkVideoEncodeH265SessionParametersAddInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH265SessionParametersAddInfoEXT* toTransform)
-{
+    VkVideoEncodeH265SessionParametersAddInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkVideoEncodeH265SessionParametersAddInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH265SessionParametersAddInfoEXT* toTransform)
-{
+    VkVideoEncodeH265SessionParametersAddInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkVideoEncodeH265SessionParametersCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH265SessionParametersCreateInfoEXT* toTransform)
-{
+    VkVideoEncodeH265SessionParametersCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pParametersAddInfo)
-    {
-        transform_tohost_VkVideoEncodeH265SessionParametersAddInfoEXT(resourceTracker, (VkVideoEncodeH265SessionParametersAddInfoEXT*)(toTransform->pParametersAddInfo));
+    if (toTransform->pParametersAddInfo) {
+        transform_tohost_VkVideoEncodeH265SessionParametersAddInfoEXT(
+            resourceTracker,
+            (VkVideoEncodeH265SessionParametersAddInfoEXT*)(toTransform->pParametersAddInfo));
     }
 }
 
 void transform_fromhost_VkVideoEncodeH265SessionParametersCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH265SessionParametersCreateInfoEXT* toTransform)
-{
+    VkVideoEncodeH265SessionParametersCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pParametersAddInfo)
-    {
-        transform_fromhost_VkVideoEncodeH265SessionParametersAddInfoEXT(resourceTracker, (VkVideoEncodeH265SessionParametersAddInfoEXT*)(toTransform->pParametersAddInfo));
+    if (toTransform->pParametersAddInfo) {
+        transform_fromhost_VkVideoEncodeH265SessionParametersAddInfoEXT(
+            resourceTracker,
+            (VkVideoEncodeH265SessionParametersAddInfoEXT*)(toTransform->pParametersAddInfo));
     }
 }
 
 void transform_tohost_VkVideoEncodeH265DpbSlotInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH265DpbSlotInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH265DpbSlotInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkVideoEncodeH265DpbSlotInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH265DpbSlotInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH265DpbSlotInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkVideoEncodeH265ReferenceListsEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH265ReferenceListsEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH265ReferenceListsEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pReferenceList0Entries)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->referenceList0EntryCount; ++i)
-            {
-                transform_tohost_VkVideoEncodeH265DpbSlotInfoEXT(resourceTracker, (VkVideoEncodeH265DpbSlotInfoEXT*)(toTransform->pReferenceList0Entries + i));
+    if (toTransform) {
+        if (toTransform->pReferenceList0Entries) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->referenceList0EntryCount; ++i) {
+                transform_tohost_VkVideoEncodeH265DpbSlotInfoEXT(
+                    resourceTracker,
+                    (VkVideoEncodeH265DpbSlotInfoEXT*)(toTransform->pReferenceList0Entries + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pReferenceList1Entries)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->referenceList1EntryCount; ++i)
-            {
-                transform_tohost_VkVideoEncodeH265DpbSlotInfoEXT(resourceTracker, (VkVideoEncodeH265DpbSlotInfoEXT*)(toTransform->pReferenceList1Entries + i));
+    if (toTransform) {
+        if (toTransform->pReferenceList1Entries) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->referenceList1EntryCount; ++i) {
+                transform_tohost_VkVideoEncodeH265DpbSlotInfoEXT(
+                    resourceTracker,
+                    (VkVideoEncodeH265DpbSlotInfoEXT*)(toTransform->pReferenceList1Entries + i));
             }
         }
     }
 }
 
 void transform_fromhost_VkVideoEncodeH265ReferenceListsEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH265ReferenceListsEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH265ReferenceListsEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pReferenceList0Entries)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->referenceList0EntryCount; ++i)
-            {
-                transform_fromhost_VkVideoEncodeH265DpbSlotInfoEXT(resourceTracker, (VkVideoEncodeH265DpbSlotInfoEXT*)(toTransform->pReferenceList0Entries + i));
+    if (toTransform) {
+        if (toTransform->pReferenceList0Entries) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->referenceList0EntryCount; ++i) {
+                transform_fromhost_VkVideoEncodeH265DpbSlotInfoEXT(
+                    resourceTracker,
+                    (VkVideoEncodeH265DpbSlotInfoEXT*)(toTransform->pReferenceList0Entries + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pReferenceList1Entries)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->referenceList1EntryCount; ++i)
-            {
-                transform_fromhost_VkVideoEncodeH265DpbSlotInfoEXT(resourceTracker, (VkVideoEncodeH265DpbSlotInfoEXT*)(toTransform->pReferenceList1Entries + i));
+    if (toTransform) {
+        if (toTransform->pReferenceList1Entries) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->referenceList1EntryCount; ++i) {
+                transform_fromhost_VkVideoEncodeH265DpbSlotInfoEXT(
+                    resourceTracker,
+                    (VkVideoEncodeH265DpbSlotInfoEXT*)(toTransform->pReferenceList1Entries + i));
             }
         }
     }
 }
 
-void transform_tohost_VkVideoEncodeH265NaluSliceEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH265NaluSliceEXT* toTransform)
-{
+void transform_tohost_VkVideoEncodeH265NaluSliceEXT(VkDecoderGlobalState* resourceTracker,
+                                                    VkVideoEncodeH265NaluSliceEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pReferenceFinalLists)
-    {
-        transform_tohost_VkVideoEncodeH265ReferenceListsEXT(resourceTracker, (VkVideoEncodeH265ReferenceListsEXT*)(toTransform->pReferenceFinalLists));
+    if (toTransform->pReferenceFinalLists) {
+        transform_tohost_VkVideoEncodeH265ReferenceListsEXT(
+            resourceTracker,
+            (VkVideoEncodeH265ReferenceListsEXT*)(toTransform->pReferenceFinalLists));
     }
 }
 
-void transform_fromhost_VkVideoEncodeH265NaluSliceEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH265NaluSliceEXT* toTransform)
-{
+void transform_fromhost_VkVideoEncodeH265NaluSliceEXT(VkDecoderGlobalState* resourceTracker,
+                                                      VkVideoEncodeH265NaluSliceEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pReferenceFinalLists)
-    {
-        transform_fromhost_VkVideoEncodeH265ReferenceListsEXT(resourceTracker, (VkVideoEncodeH265ReferenceListsEXT*)(toTransform->pReferenceFinalLists));
+    if (toTransform->pReferenceFinalLists) {
+        transform_fromhost_VkVideoEncodeH265ReferenceListsEXT(
+            resourceTracker,
+            (VkVideoEncodeH265ReferenceListsEXT*)(toTransform->pReferenceFinalLists));
     }
 }
 
 void transform_tohost_VkVideoEncodeH265VclFrameInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH265VclFrameInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH265VclFrameInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pReferenceFinalLists)
-    {
-        transform_tohost_VkVideoEncodeH265ReferenceListsEXT(resourceTracker, (VkVideoEncodeH265ReferenceListsEXT*)(toTransform->pReferenceFinalLists));
+    if (toTransform->pReferenceFinalLists) {
+        transform_tohost_VkVideoEncodeH265ReferenceListsEXT(
+            resourceTracker,
+            (VkVideoEncodeH265ReferenceListsEXT*)(toTransform->pReferenceFinalLists));
     }
-    if (toTransform)
-    {
-        if (toTransform->pNaluSliceEntries)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->naluSliceEntryCount; ++i)
-            {
-                transform_tohost_VkVideoEncodeH265NaluSliceEXT(resourceTracker, (VkVideoEncodeH265NaluSliceEXT*)(toTransform->pNaluSliceEntries + i));
+    if (toTransform) {
+        if (toTransform->pNaluSliceEntries) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->naluSliceEntryCount; ++i) {
+                transform_tohost_VkVideoEncodeH265NaluSliceEXT(
+                    resourceTracker,
+                    (VkVideoEncodeH265NaluSliceEXT*)(toTransform->pNaluSliceEntries + i));
             }
         }
     }
 }
 
 void transform_fromhost_VkVideoEncodeH265VclFrameInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH265VclFrameInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH265VclFrameInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pReferenceFinalLists)
-    {
-        transform_fromhost_VkVideoEncodeH265ReferenceListsEXT(resourceTracker, (VkVideoEncodeH265ReferenceListsEXT*)(toTransform->pReferenceFinalLists));
+    if (toTransform->pReferenceFinalLists) {
+        transform_fromhost_VkVideoEncodeH265ReferenceListsEXT(
+            resourceTracker,
+            (VkVideoEncodeH265ReferenceListsEXT*)(toTransform->pReferenceFinalLists));
     }
-    if (toTransform)
-    {
-        if (toTransform->pNaluSliceEntries)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->naluSliceEntryCount; ++i)
-            {
-                transform_fromhost_VkVideoEncodeH265NaluSliceEXT(resourceTracker, (VkVideoEncodeH265NaluSliceEXT*)(toTransform->pNaluSliceEntries + i));
+    if (toTransform) {
+        if (toTransform->pNaluSliceEntries) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->naluSliceEntryCount; ++i) {
+                transform_fromhost_VkVideoEncodeH265NaluSliceEXT(
+                    resourceTracker,
+                    (VkVideoEncodeH265NaluSliceEXT*)(toTransform->pNaluSliceEntries + i));
             }
         }
     }
 }
 
 void transform_tohost_VkVideoEncodeH265EmitPictureParametersEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH265EmitPictureParametersEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH265EmitPictureParametersEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkVideoEncodeH265EmitPictureParametersEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH265EmitPictureParametersEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH265EmitPictureParametersEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkVideoEncodeH265ProfileEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH265ProfileEXT* toTransform)
-{
+void transform_tohost_VkVideoEncodeH265ProfileEXT(VkDecoderGlobalState* resourceTracker,
+                                                  VkVideoEncodeH265ProfileEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkVideoEncodeH265ProfileEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH265ProfileEXT* toTransform)
-{
+void transform_fromhost_VkVideoEncodeH265ProfileEXT(VkDecoderGlobalState* resourceTracker,
+                                                    VkVideoEncodeH265ProfileEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_video_decode_h264
-void transform_tohost_VkVideoDecodeH264ProfileEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH264ProfileEXT* toTransform)
-{
+void transform_tohost_VkVideoDecodeH264ProfileEXT(VkDecoderGlobalState* resourceTracker,
+                                                  VkVideoDecodeH264ProfileEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkVideoDecodeH264ProfileEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH264ProfileEXT* toTransform)
-{
+void transform_fromhost_VkVideoDecodeH264ProfileEXT(VkDecoderGlobalState* resourceTracker,
+                                                    VkVideoDecodeH264ProfileEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkVideoDecodeH264CapabilitiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH264CapabilitiesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoDecodeH264CapabilitiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkOffset2D(resourceTracker, (VkOffset2D*)(&toTransform->fieldOffsetGranularity));
-    transform_tohost_VkExtensionProperties(resourceTracker, (VkExtensionProperties*)(&toTransform->stdExtensionVersion));
+    transform_tohost_VkOffset2D(resourceTracker,
+                                (VkOffset2D*)(&toTransform->fieldOffsetGranularity));
+    transform_tohost_VkExtensionProperties(
+        resourceTracker, (VkExtensionProperties*)(&toTransform->stdExtensionVersion));
 }
 
 void transform_fromhost_VkVideoDecodeH264CapabilitiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH264CapabilitiesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoDecodeH264CapabilitiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkOffset2D(resourceTracker, (VkOffset2D*)(&toTransform->fieldOffsetGranularity));
-    transform_fromhost_VkExtensionProperties(resourceTracker, (VkExtensionProperties*)(&toTransform->stdExtensionVersion));
+    transform_fromhost_VkOffset2D(resourceTracker,
+                                  (VkOffset2D*)(&toTransform->fieldOffsetGranularity));
+    transform_fromhost_VkExtensionProperties(
+        resourceTracker, (VkExtensionProperties*)(&toTransform->stdExtensionVersion));
 }
 
 void transform_tohost_VkVideoDecodeH264SessionCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH264SessionCreateInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoDecodeH264SessionCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pStdExtensionVersion)
-    {
-        transform_tohost_VkExtensionProperties(resourceTracker, (VkExtensionProperties*)(toTransform->pStdExtensionVersion));
+    if (toTransform->pStdExtensionVersion) {
+        transform_tohost_VkExtensionProperties(
+            resourceTracker, (VkExtensionProperties*)(toTransform->pStdExtensionVersion));
     }
 }
 
 void transform_fromhost_VkVideoDecodeH264SessionCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH264SessionCreateInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoDecodeH264SessionCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pStdExtensionVersion)
-    {
-        transform_fromhost_VkExtensionProperties(resourceTracker, (VkExtensionProperties*)(toTransform->pStdExtensionVersion));
+    if (toTransform->pStdExtensionVersion) {
+        transform_fromhost_VkExtensionProperties(
+            resourceTracker, (VkExtensionProperties*)(toTransform->pStdExtensionVersion));
     }
 }
 
 void transform_tohost_VkVideoDecodeH264SessionParametersAddInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH264SessionParametersAddInfoEXT* toTransform)
-{
+    VkVideoDecodeH264SessionParametersAddInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkVideoDecodeH264SessionParametersAddInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH264SessionParametersAddInfoEXT* toTransform)
-{
+    VkVideoDecodeH264SessionParametersAddInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkVideoDecodeH264SessionParametersCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH264SessionParametersCreateInfoEXT* toTransform)
-{
+    VkVideoDecodeH264SessionParametersCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pParametersAddInfo)
-    {
-        transform_tohost_VkVideoDecodeH264SessionParametersAddInfoEXT(resourceTracker, (VkVideoDecodeH264SessionParametersAddInfoEXT*)(toTransform->pParametersAddInfo));
+    if (toTransform->pParametersAddInfo) {
+        transform_tohost_VkVideoDecodeH264SessionParametersAddInfoEXT(
+            resourceTracker,
+            (VkVideoDecodeH264SessionParametersAddInfoEXT*)(toTransform->pParametersAddInfo));
     }
 }
 
 void transform_fromhost_VkVideoDecodeH264SessionParametersCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH264SessionParametersCreateInfoEXT* toTransform)
-{
+    VkVideoDecodeH264SessionParametersCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pParametersAddInfo)
-    {
-        transform_fromhost_VkVideoDecodeH264SessionParametersAddInfoEXT(resourceTracker, (VkVideoDecodeH264SessionParametersAddInfoEXT*)(toTransform->pParametersAddInfo));
+    if (toTransform->pParametersAddInfo) {
+        transform_fromhost_VkVideoDecodeH264SessionParametersAddInfoEXT(
+            resourceTracker,
+            (VkVideoDecodeH264SessionParametersAddInfoEXT*)(toTransform->pParametersAddInfo));
     }
 }
 
 void transform_tohost_VkVideoDecodeH264PictureInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH264PictureInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoDecodeH264PictureInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkVideoDecodeH264PictureInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH264PictureInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoDecodeH264PictureInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkVideoDecodeH264MvcEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH264MvcEXT* toTransform)
-{
+void transform_tohost_VkVideoDecodeH264MvcEXT(VkDecoderGlobalState* resourceTracker,
+                                              VkVideoDecodeH264MvcEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkVideoDecodeH264MvcEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH264MvcEXT* toTransform)
-{
+void transform_fromhost_VkVideoDecodeH264MvcEXT(VkDecoderGlobalState* resourceTracker,
+                                                VkVideoDecodeH264MvcEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkVideoDecodeH264DpbSlotInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH264DpbSlotInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoDecodeH264DpbSlotInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkVideoDecodeH264DpbSlotInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH264DpbSlotInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoDecodeH264DpbSlotInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -11527,63 +9275,51 @@
 #endif
 #ifdef VK_AMD_texture_gather_bias_lod
 void transform_tohost_VkTextureLODGatherFormatPropertiesAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkTextureLODGatherFormatPropertiesAMD* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkTextureLODGatherFormatPropertiesAMD* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkTextureLODGatherFormatPropertiesAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkTextureLODGatherFormatPropertiesAMD* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkTextureLODGatherFormatPropertiesAMD* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_AMD_shader_info
-void transform_tohost_VkShaderResourceUsageAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkShaderResourceUsageAMD* toTransform)
-{
+void transform_tohost_VkShaderResourceUsageAMD(VkDecoderGlobalState* resourceTracker,
+                                               VkShaderResourceUsageAMD* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkShaderResourceUsageAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkShaderResourceUsageAMD* toTransform)
-{
+void transform_fromhost_VkShaderResourceUsageAMD(VkDecoderGlobalState* resourceTracker,
+                                                 VkShaderResourceUsageAMD* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkShaderStatisticsInfoAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkShaderStatisticsInfoAMD* toTransform)
-{
+void transform_tohost_VkShaderStatisticsInfoAMD(VkDecoderGlobalState* resourceTracker,
+                                                VkShaderStatisticsInfoAMD* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_tohost_VkShaderResourceUsageAMD(resourceTracker, (VkShaderResourceUsageAMD*)(&toTransform->resourceUsage));
+    transform_tohost_VkShaderResourceUsageAMD(
+        resourceTracker, (VkShaderResourceUsageAMD*)(&toTransform->resourceUsage));
 }
 
-void transform_fromhost_VkShaderStatisticsInfoAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkShaderStatisticsInfoAMD* toTransform)
-{
+void transform_fromhost_VkShaderStatisticsInfoAMD(VkDecoderGlobalState* resourceTracker,
+                                                  VkShaderStatisticsInfoAMD* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_fromhost_VkShaderResourceUsageAMD(resourceTracker, (VkShaderResourceUsageAMD*)(&toTransform->resourceUsage));
+    transform_fromhost_VkShaderResourceUsageAMD(
+        resourceTracker, (VkShaderResourceUsageAMD*)(&toTransform->resourceUsage));
 }
 
 #endif
@@ -11591,25 +9327,19 @@
 #endif
 #ifdef VK_GGP_stream_descriptor_surface
 void transform_tohost_VkStreamDescriptorSurfaceCreateInfoGGP(
-    VkDecoderGlobalState* resourceTracker,
-    VkStreamDescriptorSurfaceCreateInfoGGP* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkStreamDescriptorSurfaceCreateInfoGGP* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkStreamDescriptorSurfaceCreateInfoGGP(
-    VkDecoderGlobalState* resourceTracker,
-    VkStreamDescriptorSurfaceCreateInfoGGP* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkStreamDescriptorSurfaceCreateInfoGGP* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -11618,24 +9348,20 @@
 #ifdef VK_NV_corner_sampled_image
 void transform_tohost_VkPhysicalDeviceCornerSampledImageFeaturesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceCornerSampledImageFeaturesNV* toTransform)
-{
+    VkPhysicalDeviceCornerSampledImageFeaturesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceCornerSampledImageFeaturesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceCornerSampledImageFeaturesNV* toTransform)
-{
+    VkPhysicalDeviceCornerSampledImageFeaturesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -11645,69 +9371,55 @@
 #endif
 #ifdef VK_NV_external_memory_capabilities
 void transform_tohost_VkExternalImageFormatPropertiesNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalImageFormatPropertiesNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkExternalImageFormatPropertiesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_tohost_VkImageFormatProperties(resourceTracker, (VkImageFormatProperties*)(&toTransform->imageFormatProperties));
+    transform_tohost_VkImageFormatProperties(
+        resourceTracker, (VkImageFormatProperties*)(&toTransform->imageFormatProperties));
 }
 
 void transform_fromhost_VkExternalImageFormatPropertiesNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalImageFormatPropertiesNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkExternalImageFormatPropertiesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_fromhost_VkImageFormatProperties(resourceTracker, (VkImageFormatProperties*)(&toTransform->imageFormatProperties));
+    transform_fromhost_VkImageFormatProperties(
+        resourceTracker, (VkImageFormatProperties*)(&toTransform->imageFormatProperties));
 }
 
 #endif
 #ifdef VK_NV_external_memory
 void transform_tohost_VkExternalMemoryImageCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalMemoryImageCreateInfoNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkExternalMemoryImageCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkExternalMemoryImageCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalMemoryImageCreateInfoNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkExternalMemoryImageCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkExportMemoryAllocateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkExportMemoryAllocateInfoNV* toTransform)
-{
+void transform_tohost_VkExportMemoryAllocateInfoNV(VkDecoderGlobalState* resourceTracker,
+                                                   VkExportMemoryAllocateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkExportMemoryAllocateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkExportMemoryAllocateInfoNV* toTransform)
-{
+void transform_fromhost_VkExportMemoryAllocateInfoNV(VkDecoderGlobalState* resourceTracker,
+                                                     VkExportMemoryAllocateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -11715,49 +9427,37 @@
 #endif
 #ifdef VK_NV_external_memory_win32
 void transform_tohost_VkImportMemoryWin32HandleInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportMemoryWin32HandleInfoNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkImportMemoryWin32HandleInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkImportMemoryWin32HandleInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportMemoryWin32HandleInfoNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkImportMemoryWin32HandleInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkExportMemoryWin32HandleInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkExportMemoryWin32HandleInfoNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkExportMemoryWin32HandleInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkExportMemoryWin32HandleInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkExportMemoryWin32HandleInfoNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkExportMemoryWin32HandleInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -11765,79 +9465,67 @@
 #endif
 #ifdef VK_NV_win32_keyed_mutex
 void transform_tohost_VkWin32KeyedMutexAcquireReleaseInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkWin32KeyedMutexAcquireReleaseInfoNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkWin32KeyedMutexAcquireReleaseInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)toTransform->pReleaseSyncs, toTransform->releaseCount, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
-    if (toTransform->pNext)
-    {
+    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)toTransform->pReleaseSyncs,
+                                                  toTransform->releaseCount, (VkDeviceSize*)nullptr,
+                                                  0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr,
+                                                  0, (uint32_t*)nullptr, 0);
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkWin32KeyedMutexAcquireReleaseInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkWin32KeyedMutexAcquireReleaseInfoNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkWin32KeyedMutexAcquireReleaseInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    resourceTracker->deviceMemoryTransform_fromhost((VkDeviceMemory*)toTransform->pReleaseSyncs, toTransform->releaseCount, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
-    if (toTransform->pNext)
-    {
+    resourceTracker->deviceMemoryTransform_fromhost(
+        (VkDeviceMemory*)toTransform->pReleaseSyncs, toTransform->releaseCount,
+        (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0,
+        (uint32_t*)nullptr, 0);
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_validation_flags
-void transform_tohost_VkValidationFlagsEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkValidationFlagsEXT* toTransform)
-{
+void transform_tohost_VkValidationFlagsEXT(VkDecoderGlobalState* resourceTracker,
+                                           VkValidationFlagsEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkValidationFlagsEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkValidationFlagsEXT* toTransform)
-{
+void transform_fromhost_VkValidationFlagsEXT(VkDecoderGlobalState* resourceTracker,
+                                             VkValidationFlagsEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_NN_vi_surface
-void transform_tohost_VkViSurfaceCreateInfoNN(
-    VkDecoderGlobalState* resourceTracker,
-    VkViSurfaceCreateInfoNN* toTransform)
-{
+void transform_tohost_VkViSurfaceCreateInfoNN(VkDecoderGlobalState* resourceTracker,
+                                              VkViSurfaceCreateInfoNN* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkViSurfaceCreateInfoNN(
-    VkDecoderGlobalState* resourceTracker,
-    VkViSurfaceCreateInfoNN* toTransform)
-{
+void transform_fromhost_VkViSurfaceCreateInfoNN(VkDecoderGlobalState* resourceTracker,
+                                                VkViSurfaceCreateInfoNN* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -11850,74 +9538,58 @@
 #ifdef VK_EXT_texture_compression_astc_hdr
 void transform_tohost_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_astc_decode_mode
-void transform_tohost_VkImageViewASTCDecodeModeEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageViewASTCDecodeModeEXT* toTransform)
-{
+void transform_tohost_VkImageViewASTCDecodeModeEXT(VkDecoderGlobalState* resourceTracker,
+                                                   VkImageViewASTCDecodeModeEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkImageViewASTCDecodeModeEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageViewASTCDecodeModeEXT* toTransform)
-{
+void transform_fromhost_VkImageViewASTCDecodeModeEXT(VkDecoderGlobalState* resourceTracker,
+                                                     VkImageViewASTCDecodeModeEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceASTCDecodeFeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceASTCDecodeFeaturesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceASTCDecodeFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceASTCDecodeFeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceASTCDecodeFeaturesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceASTCDecodeFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -11925,112 +9597,90 @@
 #endif
 #ifdef VK_EXT_conditional_rendering
 void transform_tohost_VkConditionalRenderingBeginInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkConditionalRenderingBeginInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkConditionalRenderingBeginInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkConditionalRenderingBeginInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkConditionalRenderingBeginInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkConditionalRenderingBeginInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceConditionalRenderingFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceConditionalRenderingFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceConditionalRenderingFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceConditionalRenderingFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkCommandBufferInheritanceConditionalRenderingInfoEXT* toTransform)
-{
+    VkCommandBufferInheritanceConditionalRenderingInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkCommandBufferInheritanceConditionalRenderingInfoEXT* toTransform)
-{
+    VkCommandBufferInheritanceConditionalRenderingInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_NV_clip_space_w_scaling
-void transform_tohost_VkViewportWScalingNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkViewportWScalingNV* toTransform)
-{
+void transform_tohost_VkViewportWScalingNV(VkDecoderGlobalState* resourceTracker,
+                                           VkViewportWScalingNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkViewportWScalingNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkViewportWScalingNV* toTransform)
-{
+void transform_fromhost_VkViewportWScalingNV(VkDecoderGlobalState* resourceTracker,
+                                             VkViewportWScalingNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_tohost_VkPipelineViewportWScalingStateCreateInfoNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineViewportWScalingStateCreateInfoNV* toTransform)
-{
+    VkPipelineViewportWScalingStateCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pViewportWScalings)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->viewportCount; ++i)
-            {
-                transform_tohost_VkViewportWScalingNV(resourceTracker, (VkViewportWScalingNV*)(toTransform->pViewportWScalings + i));
+    if (toTransform) {
+        if (toTransform->pViewportWScalings) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->viewportCount; ++i) {
+                transform_tohost_VkViewportWScalingNV(
+                    resourceTracker, (VkViewportWScalingNV*)(toTransform->pViewportWScalings + i));
             }
         }
     }
@@ -12038,21 +9688,17 @@
 
 void transform_fromhost_VkPipelineViewportWScalingStateCreateInfoNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineViewportWScalingStateCreateInfoNV* toTransform)
-{
+    VkPipelineViewportWScalingStateCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pViewportWScalings)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->viewportCount; ++i)
-            {
-                transform_fromhost_VkViewportWScalingNV(resourceTracker, (VkViewportWScalingNV*)(toTransform->pViewportWScalings + i));
+    if (toTransform) {
+        if (toTransform->pViewportWScalings) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->viewportCount; ++i) {
+                transform_fromhost_VkViewportWScalingNV(
+                    resourceTracker, (VkViewportWScalingNV*)(toTransform->pViewportWScalings + i));
             }
         }
     }
@@ -12064,14 +9710,11 @@
 #ifdef VK_EXT_acquire_xlib_display
 #endif
 #ifdef VK_EXT_display_surface_counter
-void transform_tohost_VkSurfaceCapabilities2EXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkSurfaceCapabilities2EXT* toTransform)
-{
+void transform_tohost_VkSurfaceCapabilities2EXT(VkDecoderGlobalState* resourceTracker,
+                                                VkSurfaceCapabilities2EXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
     transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->currentExtent));
@@ -12079,14 +9722,11 @@
     transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxImageExtent));
 }
 
-void transform_fromhost_VkSurfaceCapabilities2EXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkSurfaceCapabilities2EXT* toTransform)
-{
+void transform_fromhost_VkSurfaceCapabilities2EXT(VkDecoderGlobalState* resourceTracker,
+                                                  VkSurfaceCapabilities2EXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
     transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->currentExtent));
@@ -12096,191 +9736,145 @@
 
 #endif
 #ifdef VK_EXT_display_control
-void transform_tohost_VkDisplayPowerInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayPowerInfoEXT* toTransform)
-{
+void transform_tohost_VkDisplayPowerInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                            VkDisplayPowerInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkDisplayPowerInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayPowerInfoEXT* toTransform)
-{
+void transform_fromhost_VkDisplayPowerInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                              VkDisplayPowerInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkDeviceEventInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceEventInfoEXT* toTransform)
-{
+void transform_tohost_VkDeviceEventInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                           VkDeviceEventInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkDeviceEventInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceEventInfoEXT* toTransform)
-{
+void transform_fromhost_VkDeviceEventInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                             VkDeviceEventInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkDisplayEventInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayEventInfoEXT* toTransform)
-{
+void transform_tohost_VkDisplayEventInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                            VkDisplayEventInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkDisplayEventInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayEventInfoEXT* toTransform)
-{
+void transform_fromhost_VkDisplayEventInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                              VkDisplayEventInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkSwapchainCounterCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkSwapchainCounterCreateInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkSwapchainCounterCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkSwapchainCounterCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkSwapchainCounterCreateInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkSwapchainCounterCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_GOOGLE_display_timing
-void transform_tohost_VkRefreshCycleDurationGOOGLE(
-    VkDecoderGlobalState* resourceTracker,
-    VkRefreshCycleDurationGOOGLE* toTransform)
-{
+void transform_tohost_VkRefreshCycleDurationGOOGLE(VkDecoderGlobalState* resourceTracker,
+                                                   VkRefreshCycleDurationGOOGLE* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkRefreshCycleDurationGOOGLE(
-    VkDecoderGlobalState* resourceTracker,
-    VkRefreshCycleDurationGOOGLE* toTransform)
-{
+void transform_fromhost_VkRefreshCycleDurationGOOGLE(VkDecoderGlobalState* resourceTracker,
+                                                     VkRefreshCycleDurationGOOGLE* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkPastPresentationTimingGOOGLE(
-    VkDecoderGlobalState* resourceTracker,
-    VkPastPresentationTimingGOOGLE* toTransform)
-{
+void transform_tohost_VkPastPresentationTimingGOOGLE(VkDecoderGlobalState* resourceTracker,
+                                                     VkPastPresentationTimingGOOGLE* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_fromhost_VkPastPresentationTimingGOOGLE(
-    VkDecoderGlobalState* resourceTracker,
-    VkPastPresentationTimingGOOGLE* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPastPresentationTimingGOOGLE* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkPresentTimeGOOGLE(
-    VkDecoderGlobalState* resourceTracker,
-    VkPresentTimeGOOGLE* toTransform)
-{
+void transform_tohost_VkPresentTimeGOOGLE(VkDecoderGlobalState* resourceTracker,
+                                          VkPresentTimeGOOGLE* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkPresentTimeGOOGLE(
-    VkDecoderGlobalState* resourceTracker,
-    VkPresentTimeGOOGLE* toTransform)
-{
+void transform_fromhost_VkPresentTimeGOOGLE(VkDecoderGlobalState* resourceTracker,
+                                            VkPresentTimeGOOGLE* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkPresentTimesInfoGOOGLE(
-    VkDecoderGlobalState* resourceTracker,
-    VkPresentTimesInfoGOOGLE* toTransform)
-{
+void transform_tohost_VkPresentTimesInfoGOOGLE(VkDecoderGlobalState* resourceTracker,
+                                               VkPresentTimesInfoGOOGLE* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pTimes)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->swapchainCount; ++i)
-            {
-                transform_tohost_VkPresentTimeGOOGLE(resourceTracker, (VkPresentTimeGOOGLE*)(toTransform->pTimes + i));
+    if (toTransform) {
+        if (toTransform->pTimes) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->swapchainCount; ++i) {
+                transform_tohost_VkPresentTimeGOOGLE(
+                    resourceTracker, (VkPresentTimeGOOGLE*)(toTransform->pTimes + i));
             }
         }
     }
 }
 
-void transform_fromhost_VkPresentTimesInfoGOOGLE(
-    VkDecoderGlobalState* resourceTracker,
-    VkPresentTimesInfoGOOGLE* toTransform)
-{
+void transform_fromhost_VkPresentTimesInfoGOOGLE(VkDecoderGlobalState* resourceTracker,
+                                                 VkPresentTimesInfoGOOGLE* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pTimes)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->swapchainCount; ++i)
-            {
-                transform_fromhost_VkPresentTimeGOOGLE(resourceTracker, (VkPresentTimeGOOGLE*)(toTransform->pTimes + i));
+    if (toTransform) {
+        if (toTransform->pTimes) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->swapchainCount; ++i) {
+                transform_fromhost_VkPresentTimeGOOGLE(
+                    resourceTracker, (VkPresentTimeGOOGLE*)(toTransform->pTimes + i));
             }
         }
     }
@@ -12296,63 +9890,51 @@
 #ifdef VK_NVX_multiview_per_view_attributes
 void transform_tohost_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* toTransform)
-{
+    VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* toTransform)
-{
+    VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_NV_viewport_swizzle
-void transform_tohost_VkViewportSwizzleNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkViewportSwizzleNV* toTransform)
-{
+void transform_tohost_VkViewportSwizzleNV(VkDecoderGlobalState* resourceTracker,
+                                          VkViewportSwizzleNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkViewportSwizzleNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkViewportSwizzleNV* toTransform)
-{
+void transform_fromhost_VkViewportSwizzleNV(VkDecoderGlobalState* resourceTracker,
+                                            VkViewportSwizzleNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_tohost_VkPipelineViewportSwizzleStateCreateInfoNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineViewportSwizzleStateCreateInfoNV* toTransform)
-{
+    VkPipelineViewportSwizzleStateCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pViewportSwizzles)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->viewportCount; ++i)
-            {
-                transform_tohost_VkViewportSwizzleNV(resourceTracker, (VkViewportSwizzleNV*)(toTransform->pViewportSwizzles + i));
+    if (toTransform) {
+        if (toTransform->pViewportSwizzles) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->viewportCount; ++i) {
+                transform_tohost_VkViewportSwizzleNV(
+                    resourceTracker, (VkViewportSwizzleNV*)(toTransform->pViewportSwizzles + i));
             }
         }
     }
@@ -12360,21 +9942,17 @@
 
 void transform_fromhost_VkPipelineViewportSwizzleStateCreateInfoNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineViewportSwizzleStateCreateInfoNV* toTransform)
-{
+    VkPipelineViewportSwizzleStateCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pViewportSwizzles)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->viewportCount; ++i)
-            {
-                transform_fromhost_VkViewportSwizzleNV(resourceTracker, (VkViewportSwizzleNV*)(toTransform->pViewportSwizzles + i));
+    if (toTransform) {
+        if (toTransform->pViewportSwizzles) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->viewportCount; ++i) {
+                transform_fromhost_VkViewportSwizzleNV(
+                    resourceTracker, (VkViewportSwizzleNV*)(toTransform->pViewportSwizzles + i));
             }
         }
     }
@@ -12384,45 +9962,37 @@
 #ifdef VK_EXT_discard_rectangles
 void transform_tohost_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceDiscardRectanglePropertiesEXT* toTransform)
-{
+    VkPhysicalDeviceDiscardRectanglePropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceDiscardRectanglePropertiesEXT* toTransform)
-{
+    VkPhysicalDeviceDiscardRectanglePropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPipelineDiscardRectangleStateCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineDiscardRectangleStateCreateInfoEXT* toTransform)
-{
+    VkPipelineDiscardRectangleStateCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pDiscardRectangles)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->discardRectangleCount; ++i)
-            {
-                transform_tohost_VkRect2D(resourceTracker, (VkRect2D*)(toTransform->pDiscardRectangles + i));
+    if (toTransform) {
+        if (toTransform->pDiscardRectangles) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->discardRectangleCount; ++i) {
+                transform_tohost_VkRect2D(resourceTracker,
+                                          (VkRect2D*)(toTransform->pDiscardRectangles + i));
             }
         }
     }
@@ -12430,21 +10000,17 @@
 
 void transform_fromhost_VkPipelineDiscardRectangleStateCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineDiscardRectangleStateCreateInfoEXT* toTransform)
-{
+    VkPipelineDiscardRectangleStateCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pDiscardRectangles)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->discardRectangleCount; ++i)
-            {
-                transform_fromhost_VkRect2D(resourceTracker, (VkRect2D*)(toTransform->pDiscardRectangles + i));
+    if (toTransform) {
+        if (toTransform->pDiscardRectangles) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->discardRectangleCount; ++i) {
+                transform_fromhost_VkRect2D(resourceTracker,
+                                            (VkRect2D*)(toTransform->pDiscardRectangles + i));
             }
         }
     }
@@ -12454,48 +10020,40 @@
 #ifdef VK_EXT_conservative_rasterization
 void transform_tohost_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceConservativeRasterizationPropertiesEXT* toTransform)
-{
+    VkPhysicalDeviceConservativeRasterizationPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceConservativeRasterizationPropertiesEXT* toTransform)
-{
+    VkPhysicalDeviceConservativeRasterizationPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPipelineRasterizationConservativeStateCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineRasterizationConservativeStateCreateInfoEXT* toTransform)
-{
+    VkPipelineRasterizationConservativeStateCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPipelineRasterizationConservativeStateCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineRasterizationConservativeStateCreateInfoEXT* toTransform)
-{
+    VkPipelineRasterizationConservativeStateCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -12504,48 +10062,40 @@
 #ifdef VK_EXT_depth_clip_enable
 void transform_tohost_VkPhysicalDeviceDepthClipEnableFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceDepthClipEnableFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceDepthClipEnableFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceDepthClipEnableFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceDepthClipEnableFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceDepthClipEnableFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPipelineRasterizationDepthClipStateCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineRasterizationDepthClipStateCreateInfoEXT* toTransform)
-{
+    VkPipelineRasterizationDepthClipStateCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPipelineRasterizationDepthClipStateCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineRasterizationDepthClipStateCreateInfoEXT* toTransform)
-{
+    VkPipelineRasterizationDepthClipStateCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -12554,102 +10104,86 @@
 #ifdef VK_EXT_swapchain_colorspace
 #endif
 #ifdef VK_EXT_hdr_metadata
-void transform_tohost_VkXYColorEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkXYColorEXT* toTransform)
-{
+void transform_tohost_VkXYColorEXT(VkDecoderGlobalState* resourceTracker,
+                                   VkXYColorEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkXYColorEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkXYColorEXT* toTransform)
-{
+void transform_fromhost_VkXYColorEXT(VkDecoderGlobalState* resourceTracker,
+                                     VkXYColorEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkHdrMetadataEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkHdrMetadataEXT* toTransform)
-{
+void transform_tohost_VkHdrMetadataEXT(VkDecoderGlobalState* resourceTracker,
+                                       VkHdrMetadataEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkXYColorEXT(resourceTracker, (VkXYColorEXT*)(&toTransform->displayPrimaryRed));
-    transform_tohost_VkXYColorEXT(resourceTracker, (VkXYColorEXT*)(&toTransform->displayPrimaryGreen));
-    transform_tohost_VkXYColorEXT(resourceTracker, (VkXYColorEXT*)(&toTransform->displayPrimaryBlue));
+    transform_tohost_VkXYColorEXT(resourceTracker,
+                                  (VkXYColorEXT*)(&toTransform->displayPrimaryRed));
+    transform_tohost_VkXYColorEXT(resourceTracker,
+                                  (VkXYColorEXT*)(&toTransform->displayPrimaryGreen));
+    transform_tohost_VkXYColorEXT(resourceTracker,
+                                  (VkXYColorEXT*)(&toTransform->displayPrimaryBlue));
     transform_tohost_VkXYColorEXT(resourceTracker, (VkXYColorEXT*)(&toTransform->whitePoint));
 }
 
-void transform_fromhost_VkHdrMetadataEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkHdrMetadataEXT* toTransform)
-{
+void transform_fromhost_VkHdrMetadataEXT(VkDecoderGlobalState* resourceTracker,
+                                         VkHdrMetadataEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkXYColorEXT(resourceTracker, (VkXYColorEXT*)(&toTransform->displayPrimaryRed));
-    transform_fromhost_VkXYColorEXT(resourceTracker, (VkXYColorEXT*)(&toTransform->displayPrimaryGreen));
-    transform_fromhost_VkXYColorEXT(resourceTracker, (VkXYColorEXT*)(&toTransform->displayPrimaryBlue));
+    transform_fromhost_VkXYColorEXT(resourceTracker,
+                                    (VkXYColorEXT*)(&toTransform->displayPrimaryRed));
+    transform_fromhost_VkXYColorEXT(resourceTracker,
+                                    (VkXYColorEXT*)(&toTransform->displayPrimaryGreen));
+    transform_fromhost_VkXYColorEXT(resourceTracker,
+                                    (VkXYColorEXT*)(&toTransform->displayPrimaryBlue));
     transform_fromhost_VkXYColorEXT(resourceTracker, (VkXYColorEXT*)(&toTransform->whitePoint));
 }
 
 #endif
 #ifdef VK_MVK_ios_surface
-void transform_tohost_VkIOSSurfaceCreateInfoMVK(
-    VkDecoderGlobalState* resourceTracker,
-    VkIOSSurfaceCreateInfoMVK* toTransform)
-{
+void transform_tohost_VkIOSSurfaceCreateInfoMVK(VkDecoderGlobalState* resourceTracker,
+                                                VkIOSSurfaceCreateInfoMVK* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkIOSSurfaceCreateInfoMVK(
-    VkDecoderGlobalState* resourceTracker,
-    VkIOSSurfaceCreateInfoMVK* toTransform)
-{
+void transform_fromhost_VkIOSSurfaceCreateInfoMVK(VkDecoderGlobalState* resourceTracker,
+                                                  VkIOSSurfaceCreateInfoMVK* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_MVK_macos_surface
-void transform_tohost_VkMacOSSurfaceCreateInfoMVK(
-    VkDecoderGlobalState* resourceTracker,
-    VkMacOSSurfaceCreateInfoMVK* toTransform)
-{
+void transform_tohost_VkMacOSSurfaceCreateInfoMVK(VkDecoderGlobalState* resourceTracker,
+                                                  VkMacOSSurfaceCreateInfoMVK* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkMacOSSurfaceCreateInfoMVK(
-    VkDecoderGlobalState* resourceTracker,
-    VkMacOSSurfaceCreateInfoMVK* toTransform)
-{
+void transform_fromhost_VkMacOSSurfaceCreateInfoMVK(VkDecoderGlobalState* resourceTracker,
+                                                    VkMacOSSurfaceCreateInfoMVK* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -12662,182 +10196,140 @@
 #ifdef VK_EXT_queue_family_foreign
 #endif
 #ifdef VK_EXT_debug_utils
-void transform_tohost_VkDebugUtilsLabelEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDebugUtilsLabelEXT* toTransform)
-{
+void transform_tohost_VkDebugUtilsLabelEXT(VkDecoderGlobalState* resourceTracker,
+                                           VkDebugUtilsLabelEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkDebugUtilsLabelEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDebugUtilsLabelEXT* toTransform)
-{
+void transform_fromhost_VkDebugUtilsLabelEXT(VkDecoderGlobalState* resourceTracker,
+                                             VkDebugUtilsLabelEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkDebugUtilsObjectNameInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDebugUtilsObjectNameInfoEXT* toTransform)
-{
+void transform_tohost_VkDebugUtilsObjectNameInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                    VkDebugUtilsObjectNameInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkDebugUtilsObjectNameInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDebugUtilsObjectNameInfoEXT* toTransform)
-{
+void transform_fromhost_VkDebugUtilsObjectNameInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                      VkDebugUtilsObjectNameInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkDebugUtilsMessengerCallbackDataEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDebugUtilsMessengerCallbackDataEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDebugUtilsMessengerCallbackDataEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pQueueLabels)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->queueLabelCount; ++i)
-            {
-                transform_tohost_VkDebugUtilsLabelEXT(resourceTracker, (VkDebugUtilsLabelEXT*)(toTransform->pQueueLabels + i));
+    if (toTransform) {
+        if (toTransform->pQueueLabels) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->queueLabelCount; ++i) {
+                transform_tohost_VkDebugUtilsLabelEXT(
+                    resourceTracker, (VkDebugUtilsLabelEXT*)(toTransform->pQueueLabels + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pCmdBufLabels)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->cmdBufLabelCount; ++i)
-            {
-                transform_tohost_VkDebugUtilsLabelEXT(resourceTracker, (VkDebugUtilsLabelEXT*)(toTransform->pCmdBufLabels + i));
+    if (toTransform) {
+        if (toTransform->pCmdBufLabels) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->cmdBufLabelCount; ++i) {
+                transform_tohost_VkDebugUtilsLabelEXT(
+                    resourceTracker, (VkDebugUtilsLabelEXT*)(toTransform->pCmdBufLabels + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pObjects)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->objectCount; ++i)
-            {
-                transform_tohost_VkDebugUtilsObjectNameInfoEXT(resourceTracker, (VkDebugUtilsObjectNameInfoEXT*)(toTransform->pObjects + i));
+    if (toTransform) {
+        if (toTransform->pObjects) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->objectCount; ++i) {
+                transform_tohost_VkDebugUtilsObjectNameInfoEXT(
+                    resourceTracker, (VkDebugUtilsObjectNameInfoEXT*)(toTransform->pObjects + i));
             }
         }
     }
 }
 
 void transform_fromhost_VkDebugUtilsMessengerCallbackDataEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDebugUtilsMessengerCallbackDataEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDebugUtilsMessengerCallbackDataEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pQueueLabels)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->queueLabelCount; ++i)
-            {
-                transform_fromhost_VkDebugUtilsLabelEXT(resourceTracker, (VkDebugUtilsLabelEXT*)(toTransform->pQueueLabels + i));
+    if (toTransform) {
+        if (toTransform->pQueueLabels) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->queueLabelCount; ++i) {
+                transform_fromhost_VkDebugUtilsLabelEXT(
+                    resourceTracker, (VkDebugUtilsLabelEXT*)(toTransform->pQueueLabels + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pCmdBufLabels)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->cmdBufLabelCount; ++i)
-            {
-                transform_fromhost_VkDebugUtilsLabelEXT(resourceTracker, (VkDebugUtilsLabelEXT*)(toTransform->pCmdBufLabels + i));
+    if (toTransform) {
+        if (toTransform->pCmdBufLabels) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->cmdBufLabelCount; ++i) {
+                transform_fromhost_VkDebugUtilsLabelEXT(
+                    resourceTracker, (VkDebugUtilsLabelEXT*)(toTransform->pCmdBufLabels + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pObjects)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->objectCount; ++i)
-            {
-                transform_fromhost_VkDebugUtilsObjectNameInfoEXT(resourceTracker, (VkDebugUtilsObjectNameInfoEXT*)(toTransform->pObjects + i));
+    if (toTransform) {
+        if (toTransform->pObjects) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->objectCount; ++i) {
+                transform_fromhost_VkDebugUtilsObjectNameInfoEXT(
+                    resourceTracker, (VkDebugUtilsObjectNameInfoEXT*)(toTransform->pObjects + i));
             }
         }
     }
 }
 
 void transform_tohost_VkDebugUtilsMessengerCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDebugUtilsMessengerCreateInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDebugUtilsMessengerCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkDebugUtilsMessengerCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDebugUtilsMessengerCreateInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDebugUtilsMessengerCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkDebugUtilsObjectTagInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDebugUtilsObjectTagInfoEXT* toTransform)
-{
+void transform_tohost_VkDebugUtilsObjectTagInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                   VkDebugUtilsObjectTagInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkDebugUtilsObjectTagInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDebugUtilsObjectTagInfoEXT* toTransform)
-{
+void transform_fromhost_VkDebugUtilsObjectTagInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                     VkDebugUtilsObjectTagInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -12845,179 +10337,155 @@
 #endif
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
 void transform_tohost_VkAndroidHardwareBufferUsageANDROID(
-    VkDecoderGlobalState* resourceTracker,
-    VkAndroidHardwareBufferUsageANDROID* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkAndroidHardwareBufferUsageANDROID* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkAndroidHardwareBufferUsageANDROID(
-    VkDecoderGlobalState* resourceTracker,
-    VkAndroidHardwareBufferUsageANDROID* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkAndroidHardwareBufferUsageANDROID* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkAndroidHardwareBufferPropertiesANDROID(
-    VkDecoderGlobalState* resourceTracker,
-    VkAndroidHardwareBufferPropertiesANDROID* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkAndroidHardwareBufferPropertiesANDROID* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)&toTransform->memoryTypeBits, 1);
-    if (toTransform->pNext)
-    {
+    resourceTracker->deviceMemoryTransform_tohost(
+        (VkDeviceMemory*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0,
+        (uint32_t*)nullptr, 0, (uint32_t*)&toTransform->memoryTypeBits, 1);
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkAndroidHardwareBufferPropertiesANDROID(
-    VkDecoderGlobalState* resourceTracker,
-    VkAndroidHardwareBufferPropertiesANDROID* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkAndroidHardwareBufferPropertiesANDROID* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    resourceTracker->deviceMemoryTransform_fromhost((VkDeviceMemory*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)&toTransform->memoryTypeBits, 1);
-    if (toTransform->pNext)
-    {
+    resourceTracker->deviceMemoryTransform_fromhost(
+        (VkDeviceMemory*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0,
+        (uint32_t*)nullptr, 0, (uint32_t*)&toTransform->memoryTypeBits, 1);
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkAndroidHardwareBufferFormatPropertiesANDROID(
     VkDecoderGlobalState* resourceTracker,
-    VkAndroidHardwareBufferFormatPropertiesANDROID* toTransform)
-{
+    VkAndroidHardwareBufferFormatPropertiesANDROID* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkComponentMapping(resourceTracker, (VkComponentMapping*)(&toTransform->samplerYcbcrConversionComponents));
+    transform_tohost_VkComponentMapping(
+        resourceTracker, (VkComponentMapping*)(&toTransform->samplerYcbcrConversionComponents));
 }
 
 void transform_fromhost_VkAndroidHardwareBufferFormatPropertiesANDROID(
     VkDecoderGlobalState* resourceTracker,
-    VkAndroidHardwareBufferFormatPropertiesANDROID* toTransform)
-{
+    VkAndroidHardwareBufferFormatPropertiesANDROID* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkComponentMapping(resourceTracker, (VkComponentMapping*)(&toTransform->samplerYcbcrConversionComponents));
+    transform_fromhost_VkComponentMapping(
+        resourceTracker, (VkComponentMapping*)(&toTransform->samplerYcbcrConversionComponents));
 }
 
 void transform_tohost_VkImportAndroidHardwareBufferInfoANDROID(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportAndroidHardwareBufferInfoANDROID* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkImportAndroidHardwareBufferInfoANDROID* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkImportAndroidHardwareBufferInfoANDROID(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportAndroidHardwareBufferInfoANDROID* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkImportAndroidHardwareBufferInfoANDROID* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkMemoryGetAndroidHardwareBufferInfoANDROID(
     VkDecoderGlobalState* resourceTracker,
-    VkMemoryGetAndroidHardwareBufferInfoANDROID* toTransform)
-{
+    VkMemoryGetAndroidHardwareBufferInfoANDROID* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
-    if (toTransform->pNext)
-    {
+    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)&toTransform->memory, 1,
+                                                  (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr,
+                                                  0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkMemoryGetAndroidHardwareBufferInfoANDROID(
     VkDecoderGlobalState* resourceTracker,
-    VkMemoryGetAndroidHardwareBufferInfoANDROID* toTransform)
-{
+    VkMemoryGetAndroidHardwareBufferInfoANDROID* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    resourceTracker->deviceMemoryTransform_fromhost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
-    if (toTransform->pNext)
-    {
+    resourceTracker->deviceMemoryTransform_fromhost(
+        (VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr,
+        0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkExternalFormatANDROID(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalFormatANDROID* toTransform)
-{
+void transform_tohost_VkExternalFormatANDROID(VkDecoderGlobalState* resourceTracker,
+                                              VkExternalFormatANDROID* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkExternalFormatANDROID(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalFormatANDROID* toTransform)
-{
+void transform_fromhost_VkExternalFormatANDROID(VkDecoderGlobalState* resourceTracker,
+                                                VkExternalFormatANDROID* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkAndroidHardwareBufferFormatProperties2ANDROID(
     VkDecoderGlobalState* resourceTracker,
-    VkAndroidHardwareBufferFormatProperties2ANDROID* toTransform)
-{
+    VkAndroidHardwareBufferFormatProperties2ANDROID* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkComponentMapping(resourceTracker, (VkComponentMapping*)(&toTransform->samplerYcbcrConversionComponents));
+    transform_tohost_VkComponentMapping(
+        resourceTracker, (VkComponentMapping*)(&toTransform->samplerYcbcrConversionComponents));
 }
 
 void transform_fromhost_VkAndroidHardwareBufferFormatProperties2ANDROID(
     VkDecoderGlobalState* resourceTracker,
-    VkAndroidHardwareBufferFormatProperties2ANDROID* toTransform)
-{
+    VkAndroidHardwareBufferFormatProperties2ANDROID* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkComponentMapping(resourceTracker, (VkComponentMapping*)(&toTransform->samplerYcbcrConversionComponents));
+    transform_fromhost_VkComponentMapping(
+        resourceTracker, (VkComponentMapping*)(&toTransform->samplerYcbcrConversionComponents));
 }
 
 #endif
@@ -13032,96 +10500,78 @@
 #ifdef VK_EXT_inline_uniform_block
 void transform_tohost_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceInlineUniformBlockFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceInlineUniformBlockFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceInlineUniformBlockFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceInlineUniformBlockFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceInlineUniformBlockPropertiesEXT* toTransform)
-{
+    VkPhysicalDeviceInlineUniformBlockPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceInlineUniformBlockPropertiesEXT* toTransform)
-{
+    VkPhysicalDeviceInlineUniformBlockPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkWriteDescriptorSetInlineUniformBlockEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkWriteDescriptorSetInlineUniformBlockEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkWriteDescriptorSetInlineUniformBlockEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkWriteDescriptorSetInlineUniformBlockEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkWriteDescriptorSetInlineUniformBlockEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkWriteDescriptorSetInlineUniformBlockEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkDescriptorPoolInlineUniformBlockCreateInfoEXT* toTransform)
-{
+    VkDescriptorPoolInlineUniformBlockCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkDescriptorPoolInlineUniformBlockCreateInfoEXT* toTransform)
-{
+    VkDescriptorPoolInlineUniformBlockCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -13130,163 +10580,143 @@
 #ifdef VK_EXT_shader_stencil_export
 #endif
 #ifdef VK_EXT_sample_locations
-void transform_tohost_VkSampleLocationEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkSampleLocationEXT* toTransform)
-{
+void transform_tohost_VkSampleLocationEXT(VkDecoderGlobalState* resourceTracker,
+                                          VkSampleLocationEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkSampleLocationEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkSampleLocationEXT* toTransform)
-{
+void transform_fromhost_VkSampleLocationEXT(VkDecoderGlobalState* resourceTracker,
+                                            VkSampleLocationEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkSampleLocationsInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkSampleLocationsInfoEXT* toTransform)
-{
+void transform_tohost_VkSampleLocationsInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                               VkSampleLocationsInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->sampleLocationGridSize));
-    if (toTransform)
-    {
-        if (toTransform->pSampleLocations)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->sampleLocationsCount; ++i)
-            {
-                transform_tohost_VkSampleLocationEXT(resourceTracker, (VkSampleLocationEXT*)(toTransform->pSampleLocations + i));
+    transform_tohost_VkExtent2D(resourceTracker,
+                                (VkExtent2D*)(&toTransform->sampleLocationGridSize));
+    if (toTransform) {
+        if (toTransform->pSampleLocations) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->sampleLocationsCount; ++i) {
+                transform_tohost_VkSampleLocationEXT(
+                    resourceTracker, (VkSampleLocationEXT*)(toTransform->pSampleLocations + i));
             }
         }
     }
 }
 
-void transform_fromhost_VkSampleLocationsInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkSampleLocationsInfoEXT* toTransform)
-{
+void transform_fromhost_VkSampleLocationsInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                 VkSampleLocationsInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->sampleLocationGridSize));
-    if (toTransform)
-    {
-        if (toTransform->pSampleLocations)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->sampleLocationsCount; ++i)
-            {
-                transform_fromhost_VkSampleLocationEXT(resourceTracker, (VkSampleLocationEXT*)(toTransform->pSampleLocations + i));
+    transform_fromhost_VkExtent2D(resourceTracker,
+                                  (VkExtent2D*)(&toTransform->sampleLocationGridSize));
+    if (toTransform) {
+        if (toTransform->pSampleLocations) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->sampleLocationsCount; ++i) {
+                transform_fromhost_VkSampleLocationEXT(
+                    resourceTracker, (VkSampleLocationEXT*)(toTransform->pSampleLocations + i));
             }
         }
     }
 }
 
-void transform_tohost_VkAttachmentSampleLocationsEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkAttachmentSampleLocationsEXT* toTransform)
-{
+void transform_tohost_VkAttachmentSampleLocationsEXT(VkDecoderGlobalState* resourceTracker,
+                                                     VkAttachmentSampleLocationsEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_tohost_VkSampleLocationsInfoEXT(resourceTracker, (VkSampleLocationsInfoEXT*)(&toTransform->sampleLocationsInfo));
+    transform_tohost_VkSampleLocationsInfoEXT(
+        resourceTracker, (VkSampleLocationsInfoEXT*)(&toTransform->sampleLocationsInfo));
 }
 
 void transform_fromhost_VkAttachmentSampleLocationsEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkAttachmentSampleLocationsEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkAttachmentSampleLocationsEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_fromhost_VkSampleLocationsInfoEXT(resourceTracker, (VkSampleLocationsInfoEXT*)(&toTransform->sampleLocationsInfo));
+    transform_fromhost_VkSampleLocationsInfoEXT(
+        resourceTracker, (VkSampleLocationsInfoEXT*)(&toTransform->sampleLocationsInfo));
 }
 
-void transform_tohost_VkSubpassSampleLocationsEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubpassSampleLocationsEXT* toTransform)
-{
+void transform_tohost_VkSubpassSampleLocationsEXT(VkDecoderGlobalState* resourceTracker,
+                                                  VkSubpassSampleLocationsEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_tohost_VkSampleLocationsInfoEXT(resourceTracker, (VkSampleLocationsInfoEXT*)(&toTransform->sampleLocationsInfo));
+    transform_tohost_VkSampleLocationsInfoEXT(
+        resourceTracker, (VkSampleLocationsInfoEXT*)(&toTransform->sampleLocationsInfo));
 }
 
-void transform_fromhost_VkSubpassSampleLocationsEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubpassSampleLocationsEXT* toTransform)
-{
+void transform_fromhost_VkSubpassSampleLocationsEXT(VkDecoderGlobalState* resourceTracker,
+                                                    VkSubpassSampleLocationsEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_fromhost_VkSampleLocationsInfoEXT(resourceTracker, (VkSampleLocationsInfoEXT*)(&toTransform->sampleLocationsInfo));
+    transform_fromhost_VkSampleLocationsInfoEXT(
+        resourceTracker, (VkSampleLocationsInfoEXT*)(&toTransform->sampleLocationsInfo));
 }
 
 void transform_tohost_VkRenderPassSampleLocationsBeginInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkRenderPassSampleLocationsBeginInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkRenderPassSampleLocationsBeginInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pAttachmentInitialSampleLocations)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->attachmentInitialSampleLocationsCount; ++i)
-            {
-                transform_tohost_VkAttachmentSampleLocationsEXT(resourceTracker, (VkAttachmentSampleLocationsEXT*)(toTransform->pAttachmentInitialSampleLocations + i));
+    if (toTransform) {
+        if (toTransform->pAttachmentInitialSampleLocations) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->attachmentInitialSampleLocationsCount;
+                 ++i) {
+                transform_tohost_VkAttachmentSampleLocationsEXT(
+                    resourceTracker,
+                    (VkAttachmentSampleLocationsEXT*)(toTransform
+                                                          ->pAttachmentInitialSampleLocations +
+                                                      i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pPostSubpassSampleLocations)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->postSubpassSampleLocationsCount; ++i)
-            {
-                transform_tohost_VkSubpassSampleLocationsEXT(resourceTracker, (VkSubpassSampleLocationsEXT*)(toTransform->pPostSubpassSampleLocations + i));
+    if (toTransform) {
+        if (toTransform->pPostSubpassSampleLocations) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->postSubpassSampleLocationsCount; ++i) {
+                transform_tohost_VkSubpassSampleLocationsEXT(
+                    resourceTracker,
+                    (VkSubpassSampleLocationsEXT*)(toTransform->pPostSubpassSampleLocations + i));
             }
         }
     }
 }
 
 void transform_fromhost_VkRenderPassSampleLocationsBeginInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkRenderPassSampleLocationsBeginInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkRenderPassSampleLocationsBeginInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pAttachmentInitialSampleLocations)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->attachmentInitialSampleLocationsCount; ++i)
-            {
-                transform_fromhost_VkAttachmentSampleLocationsEXT(resourceTracker, (VkAttachmentSampleLocationsEXT*)(toTransform->pAttachmentInitialSampleLocations + i));
+    if (toTransform) {
+        if (toTransform->pAttachmentInitialSampleLocations) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->attachmentInitialSampleLocationsCount;
+                 ++i) {
+                transform_fromhost_VkAttachmentSampleLocationsEXT(
+                    resourceTracker,
+                    (VkAttachmentSampleLocationsEXT*)(toTransform
+                                                          ->pAttachmentInitialSampleLocations +
+                                                      i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pPostSubpassSampleLocations)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->postSubpassSampleLocationsCount; ++i)
-            {
-                transform_fromhost_VkSubpassSampleLocationsEXT(resourceTracker, (VkSubpassSampleLocationsEXT*)(toTransform->pPostSubpassSampleLocations + i));
+    if (toTransform) {
+        if (toTransform->pPostSubpassSampleLocations) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->postSubpassSampleLocationsCount; ++i) {
+                transform_fromhost_VkSubpassSampleLocationsEXT(
+                    resourceTracker,
+                    (VkSubpassSampleLocationsEXT*)(toTransform->pPostSubpassSampleLocations + i));
             }
         }
     }
@@ -13294,152 +10724,132 @@
 
 void transform_tohost_VkPipelineSampleLocationsStateCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineSampleLocationsStateCreateInfoEXT* toTransform)
-{
+    VkPipelineSampleLocationsStateCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkSampleLocationsInfoEXT(resourceTracker, (VkSampleLocationsInfoEXT*)(&toTransform->sampleLocationsInfo));
+    transform_tohost_VkSampleLocationsInfoEXT(
+        resourceTracker, (VkSampleLocationsInfoEXT*)(&toTransform->sampleLocationsInfo));
 }
 
 void transform_fromhost_VkPipelineSampleLocationsStateCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineSampleLocationsStateCreateInfoEXT* toTransform)
-{
+    VkPipelineSampleLocationsStateCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkSampleLocationsInfoEXT(resourceTracker, (VkSampleLocationsInfoEXT*)(&toTransform->sampleLocationsInfo));
+    transform_fromhost_VkSampleLocationsInfoEXT(
+        resourceTracker, (VkSampleLocationsInfoEXT*)(&toTransform->sampleLocationsInfo));
 }
 
 void transform_tohost_VkPhysicalDeviceSampleLocationsPropertiesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceSampleLocationsPropertiesEXT* toTransform)
-{
+    VkPhysicalDeviceSampleLocationsPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxSampleLocationGridSize));
+    transform_tohost_VkExtent2D(resourceTracker,
+                                (VkExtent2D*)(&toTransform->maxSampleLocationGridSize));
 }
 
 void transform_fromhost_VkPhysicalDeviceSampleLocationsPropertiesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceSampleLocationsPropertiesEXT* toTransform)
-{
+    VkPhysicalDeviceSampleLocationsPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxSampleLocationGridSize));
+    transform_fromhost_VkExtent2D(resourceTracker,
+                                  (VkExtent2D*)(&toTransform->maxSampleLocationGridSize));
 }
 
-void transform_tohost_VkMultisamplePropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkMultisamplePropertiesEXT* toTransform)
-{
+void transform_tohost_VkMultisamplePropertiesEXT(VkDecoderGlobalState* resourceTracker,
+                                                 VkMultisamplePropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxSampleLocationGridSize));
+    transform_tohost_VkExtent2D(resourceTracker,
+                                (VkExtent2D*)(&toTransform->maxSampleLocationGridSize));
 }
 
-void transform_fromhost_VkMultisamplePropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkMultisamplePropertiesEXT* toTransform)
-{
+void transform_fromhost_VkMultisamplePropertiesEXT(VkDecoderGlobalState* resourceTracker,
+                                                   VkMultisamplePropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxSampleLocationGridSize));
+    transform_fromhost_VkExtent2D(resourceTracker,
+                                  (VkExtent2D*)(&toTransform->maxSampleLocationGridSize));
 }
 
 #endif
 #ifdef VK_EXT_blend_operation_advanced
 void transform_tohost_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* toTransform)
-{
+    VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* toTransform)
-{
+    VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineColorBlendAdvancedStateCreateInfoEXT* toTransform)
-{
+    VkPipelineColorBlendAdvancedStateCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineColorBlendAdvancedStateCreateInfoEXT* toTransform)
-{
+    VkPipelineColorBlendAdvancedStateCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -13448,24 +10858,20 @@
 #ifdef VK_NV_fragment_coverage_to_color
 void transform_tohost_VkPipelineCoverageToColorStateCreateInfoNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineCoverageToColorStateCreateInfoNV* toTransform)
-{
+    VkPipelineCoverageToColorStateCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPipelineCoverageToColorStateCreateInfoNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineCoverageToColorStateCreateInfoNV* toTransform)
-{
+    VkPipelineCoverageToColorStateCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -13474,24 +10880,20 @@
 #ifdef VK_NV_framebuffer_mixed_samples
 void transform_tohost_VkPipelineCoverageModulationStateCreateInfoNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineCoverageModulationStateCreateInfoNV* toTransform)
-{
+    VkPipelineCoverageModulationStateCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPipelineCoverageModulationStateCreateInfoNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineCoverageModulationStateCreateInfoNV* toTransform)
-{
+    VkPipelineCoverageModulationStateCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -13502,48 +10904,40 @@
 #ifdef VK_NV_shader_sm_builtins
 void transform_tohost_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* toTransform)
-{
+    VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* toTransform)
-{
+    VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* toTransform)
-{
+    VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* toTransform)
-{
+    VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -13553,60 +10947,50 @@
 #endif
 #ifdef VK_EXT_image_drm_format_modifier
 void transform_tohost_VkDrmFormatModifierPropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDrmFormatModifierPropertiesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDrmFormatModifierPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_fromhost_VkDrmFormatModifierPropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDrmFormatModifierPropertiesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDrmFormatModifierPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_tohost_VkDrmFormatModifierPropertiesListEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDrmFormatModifierPropertiesListEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDrmFormatModifierPropertiesListEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pDrmFormatModifierProperties)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->drmFormatModifierCount; ++i)
-            {
-                transform_tohost_VkDrmFormatModifierPropertiesEXT(resourceTracker, (VkDrmFormatModifierPropertiesEXT*)(toTransform->pDrmFormatModifierProperties + i));
+    if (toTransform) {
+        if (toTransform->pDrmFormatModifierProperties) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->drmFormatModifierCount; ++i) {
+                transform_tohost_VkDrmFormatModifierPropertiesEXT(
+                    resourceTracker,
+                    (VkDrmFormatModifierPropertiesEXT*)(toTransform->pDrmFormatModifierProperties +
+                                                        i));
             }
         }
     }
 }
 
 void transform_fromhost_VkDrmFormatModifierPropertiesListEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDrmFormatModifierPropertiesListEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDrmFormatModifierPropertiesListEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pDrmFormatModifierProperties)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->drmFormatModifierCount; ++i)
-            {
-                transform_fromhost_VkDrmFormatModifierPropertiesEXT(resourceTracker, (VkDrmFormatModifierPropertiesEXT*)(toTransform->pDrmFormatModifierProperties + i));
+    if (toTransform) {
+        if (toTransform->pDrmFormatModifierProperties) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->drmFormatModifierCount; ++i) {
+                transform_fromhost_VkDrmFormatModifierPropertiesEXT(
+                    resourceTracker,
+                    (VkDrmFormatModifierPropertiesEXT*)(toTransform->pDrmFormatModifierProperties +
+                                                        i));
             }
         }
     }
@@ -13614,69 +10998,55 @@
 
 void transform_tohost_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceImageDrmFormatModifierInfoEXT* toTransform)
-{
+    VkPhysicalDeviceImageDrmFormatModifierInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceImageDrmFormatModifierInfoEXT* toTransform)
-{
+    VkPhysicalDeviceImageDrmFormatModifierInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkImageDrmFormatModifierListCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageDrmFormatModifierListCreateInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkImageDrmFormatModifierListCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkImageDrmFormatModifierListCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageDrmFormatModifierListCreateInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkImageDrmFormatModifierListCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkImageDrmFormatModifierExplicitCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkImageDrmFormatModifierExplicitCreateInfoEXT* toTransform)
-{
+    VkImageDrmFormatModifierExplicitCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pPlaneLayouts)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->drmFormatModifierPlaneCount; ++i)
-            {
-                transform_tohost_VkSubresourceLayout(resourceTracker, (VkSubresourceLayout*)(toTransform->pPlaneLayouts + i));
+    if (toTransform) {
+        if (toTransform->pPlaneLayouts) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->drmFormatModifierPlaneCount; ++i) {
+                transform_tohost_VkSubresourceLayout(
+                    resourceTracker, (VkSubresourceLayout*)(toTransform->pPlaneLayouts + i));
             }
         }
     }
@@ -13684,105 +11054,85 @@
 
 void transform_fromhost_VkImageDrmFormatModifierExplicitCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkImageDrmFormatModifierExplicitCreateInfoEXT* toTransform)
-{
+    VkImageDrmFormatModifierExplicitCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pPlaneLayouts)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->drmFormatModifierPlaneCount; ++i)
-            {
-                transform_fromhost_VkSubresourceLayout(resourceTracker, (VkSubresourceLayout*)(toTransform->pPlaneLayouts + i));
+    if (toTransform) {
+        if (toTransform->pPlaneLayouts) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->drmFormatModifierPlaneCount; ++i) {
+                transform_fromhost_VkSubresourceLayout(
+                    resourceTracker, (VkSubresourceLayout*)(toTransform->pPlaneLayouts + i));
             }
         }
     }
 }
 
 void transform_tohost_VkImageDrmFormatModifierPropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageDrmFormatModifierPropertiesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkImageDrmFormatModifierPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkImageDrmFormatModifierPropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageDrmFormatModifierPropertiesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkImageDrmFormatModifierPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkDrmFormatModifierProperties2EXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDrmFormatModifierProperties2EXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDrmFormatModifierProperties2EXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_fromhost_VkDrmFormatModifierProperties2EXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDrmFormatModifierProperties2EXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDrmFormatModifierProperties2EXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_tohost_VkDrmFormatModifierPropertiesList2EXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDrmFormatModifierPropertiesList2EXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDrmFormatModifierPropertiesList2EXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pDrmFormatModifierProperties)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->drmFormatModifierCount; ++i)
-            {
-                transform_tohost_VkDrmFormatModifierProperties2EXT(resourceTracker, (VkDrmFormatModifierProperties2EXT*)(toTransform->pDrmFormatModifierProperties + i));
+    if (toTransform) {
+        if (toTransform->pDrmFormatModifierProperties) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->drmFormatModifierCount; ++i) {
+                transform_tohost_VkDrmFormatModifierProperties2EXT(
+                    resourceTracker,
+                    (VkDrmFormatModifierProperties2EXT*)(toTransform->pDrmFormatModifierProperties +
+                                                         i));
             }
         }
     }
 }
 
 void transform_fromhost_VkDrmFormatModifierPropertiesList2EXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDrmFormatModifierPropertiesList2EXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDrmFormatModifierPropertiesList2EXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pDrmFormatModifierProperties)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->drmFormatModifierCount; ++i)
-            {
-                transform_fromhost_VkDrmFormatModifierProperties2EXT(resourceTracker, (VkDrmFormatModifierProperties2EXT*)(toTransform->pDrmFormatModifierProperties + i));
+    if (toTransform) {
+        if (toTransform->pDrmFormatModifierProperties) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->drmFormatModifierCount; ++i) {
+                transform_fromhost_VkDrmFormatModifierProperties2EXT(
+                    resourceTracker,
+                    (VkDrmFormatModifierProperties2EXT*)(toTransform->pDrmFormatModifierProperties +
+                                                         i));
             }
         }
     }
@@ -13790,50 +11140,40 @@
 
 #endif
 #ifdef VK_EXT_validation_cache
-void transform_tohost_VkValidationCacheCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkValidationCacheCreateInfoEXT* toTransform)
-{
+void transform_tohost_VkValidationCacheCreateInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                     VkValidationCacheCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkValidationCacheCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkValidationCacheCreateInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkValidationCacheCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkShaderModuleValidationCacheCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkShaderModuleValidationCacheCreateInfoEXT* toTransform)
-{
+    VkShaderModuleValidationCacheCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkShaderModuleValidationCacheCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkShaderModuleValidationCacheCreateInfoEXT* toTransform)
-{
+    VkShaderModuleValidationCacheCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -13844,39 +11184,32 @@
 #ifdef VK_EXT_shader_viewport_index_layer
 #endif
 #ifdef VK_NV_shading_rate_image
-void transform_tohost_VkShadingRatePaletteNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkShadingRatePaletteNV* toTransform)
-{
+void transform_tohost_VkShadingRatePaletteNV(VkDecoderGlobalState* resourceTracker,
+                                             VkShadingRatePaletteNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkShadingRatePaletteNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkShadingRatePaletteNV* toTransform)
-{
+void transform_fromhost_VkShadingRatePaletteNV(VkDecoderGlobalState* resourceTracker,
+                                               VkShadingRatePaletteNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_tohost_VkPipelineViewportShadingRateImageStateCreateInfoNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineViewportShadingRateImageStateCreateInfoNV* toTransform)
-{
+    VkPipelineViewportShadingRateImageStateCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pShadingRatePalettes)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->viewportCount; ++i)
-            {
-                transform_tohost_VkShadingRatePaletteNV(resourceTracker, (VkShadingRatePaletteNV*)(toTransform->pShadingRatePalettes + i));
+    if (toTransform) {
+        if (toTransform->pShadingRatePalettes) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->viewportCount; ++i) {
+                transform_tohost_VkShadingRatePaletteNV(
+                    resourceTracker,
+                    (VkShadingRatePaletteNV*)(toTransform->pShadingRatePalettes + i));
             }
         }
     }
@@ -13884,21 +11217,18 @@
 
 void transform_fromhost_VkPipelineViewportShadingRateImageStateCreateInfoNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineViewportShadingRateImageStateCreateInfoNV* toTransform)
-{
+    VkPipelineViewportShadingRateImageStateCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pShadingRatePalettes)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->viewportCount; ++i)
-            {
-                transform_fromhost_VkShadingRatePaletteNV(resourceTracker, (VkShadingRatePaletteNV*)(toTransform->pShadingRatePalettes + i));
+    if (toTransform) {
+        if (toTransform->pShadingRatePalettes) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->viewportCount; ++i) {
+                transform_fromhost_VkShadingRatePaletteNV(
+                    resourceTracker,
+                    (VkShadingRatePaletteNV*)(toTransform->pShadingRatePalettes + i));
             }
         }
     }
@@ -13906,36 +11236,30 @@
 
 void transform_tohost_VkPhysicalDeviceShadingRateImageFeaturesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShadingRateImageFeaturesNV* toTransform)
-{
+    VkPhysicalDeviceShadingRateImageFeaturesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceShadingRateImageFeaturesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShadingRateImageFeaturesNV* toTransform)
-{
+    VkPhysicalDeviceShadingRateImageFeaturesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceShadingRateImagePropertiesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShadingRateImagePropertiesNV* toTransform)
-{
+    VkPhysicalDeviceShadingRateImagePropertiesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
     transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->shadingRateTexelSize));
@@ -13943,64 +11267,53 @@
 
 void transform_fromhost_VkPhysicalDeviceShadingRateImagePropertiesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShadingRateImagePropertiesNV* toTransform)
-{
+    VkPhysicalDeviceShadingRateImagePropertiesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->shadingRateTexelSize));
+    transform_fromhost_VkExtent2D(resourceTracker,
+                                  (VkExtent2D*)(&toTransform->shadingRateTexelSize));
 }
 
-void transform_tohost_VkCoarseSampleLocationNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkCoarseSampleLocationNV* toTransform)
-{
+void transform_tohost_VkCoarseSampleLocationNV(VkDecoderGlobalState* resourceTracker,
+                                               VkCoarseSampleLocationNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkCoarseSampleLocationNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkCoarseSampleLocationNV* toTransform)
-{
+void transform_fromhost_VkCoarseSampleLocationNV(VkDecoderGlobalState* resourceTracker,
+                                                 VkCoarseSampleLocationNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkCoarseSampleOrderCustomNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkCoarseSampleOrderCustomNV* toTransform)
-{
+void transform_tohost_VkCoarseSampleOrderCustomNV(VkDecoderGlobalState* resourceTracker,
+                                                  VkCoarseSampleOrderCustomNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform)
-    {
-        if (toTransform->pSampleLocations)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->sampleLocationCount; ++i)
-            {
-                transform_tohost_VkCoarseSampleLocationNV(resourceTracker, (VkCoarseSampleLocationNV*)(toTransform->pSampleLocations + i));
+    if (toTransform) {
+        if (toTransform->pSampleLocations) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->sampleLocationCount; ++i) {
+                transform_tohost_VkCoarseSampleLocationNV(
+                    resourceTracker,
+                    (VkCoarseSampleLocationNV*)(toTransform->pSampleLocations + i));
             }
         }
     }
 }
 
-void transform_fromhost_VkCoarseSampleOrderCustomNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkCoarseSampleOrderCustomNV* toTransform)
-{
+void transform_fromhost_VkCoarseSampleOrderCustomNV(VkDecoderGlobalState* resourceTracker,
+                                                    VkCoarseSampleOrderCustomNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform)
-    {
-        if (toTransform->pSampleLocations)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->sampleLocationCount; ++i)
-            {
-                transform_fromhost_VkCoarseSampleLocationNV(resourceTracker, (VkCoarseSampleLocationNV*)(toTransform->pSampleLocations + i));
+    if (toTransform) {
+        if (toTransform->pSampleLocations) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->sampleLocationCount; ++i) {
+                transform_fromhost_VkCoarseSampleLocationNV(
+                    resourceTracker,
+                    (VkCoarseSampleLocationNV*)(toTransform->pSampleLocations + i));
             }
         }
     }
@@ -14008,21 +11321,18 @@
 
 void transform_tohost_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* toTransform)
-{
+    VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pCustomSampleOrders)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->customSampleOrderCount; ++i)
-            {
-                transform_tohost_VkCoarseSampleOrderCustomNV(resourceTracker, (VkCoarseSampleOrderCustomNV*)(toTransform->pCustomSampleOrders + i));
+    if (toTransform) {
+        if (toTransform->pCustomSampleOrders) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->customSampleOrderCount; ++i) {
+                transform_tohost_VkCoarseSampleOrderCustomNV(
+                    resourceTracker,
+                    (VkCoarseSampleOrderCustomNV*)(toTransform->pCustomSampleOrders + i));
             }
         }
     }
@@ -14030,21 +11340,18 @@
 
 void transform_fromhost_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* toTransform)
-{
+    VkPipelineViewportCoarseSampleOrderStateCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pCustomSampleOrders)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->customSampleOrderCount; ++i)
-            {
-                transform_fromhost_VkCoarseSampleOrderCustomNV(resourceTracker, (VkCoarseSampleOrderCustomNV*)(toTransform->pCustomSampleOrders + i));
+    if (toTransform) {
+        if (toTransform->pCustomSampleOrders) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->customSampleOrderCount; ++i) {
+                transform_fromhost_VkCoarseSampleOrderCustomNV(
+                    resourceTracker,
+                    (VkCoarseSampleOrderCustomNV*)(toTransform->pCustomSampleOrders + i));
             }
         }
     }
@@ -14053,451 +11360,366 @@
 #endif
 #ifdef VK_NV_ray_tracing
 void transform_tohost_VkRayTracingShaderGroupCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkRayTracingShaderGroupCreateInfoNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkRayTracingShaderGroupCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkRayTracingShaderGroupCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkRayTracingShaderGroupCreateInfoNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkRayTracingShaderGroupCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkRayTracingPipelineCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkRayTracingPipelineCreateInfoNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkRayTracingPipelineCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pStages)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->stageCount; ++i)
-            {
-                transform_tohost_VkPipelineShaderStageCreateInfo(resourceTracker, (VkPipelineShaderStageCreateInfo*)(toTransform->pStages + i));
+    if (toTransform) {
+        if (toTransform->pStages) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->stageCount; ++i) {
+                transform_tohost_VkPipelineShaderStageCreateInfo(
+                    resourceTracker, (VkPipelineShaderStageCreateInfo*)(toTransform->pStages + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pGroups)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->groupCount; ++i)
-            {
-                transform_tohost_VkRayTracingShaderGroupCreateInfoNV(resourceTracker, (VkRayTracingShaderGroupCreateInfoNV*)(toTransform->pGroups + i));
+    if (toTransform) {
+        if (toTransform->pGroups) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->groupCount; ++i) {
+                transform_tohost_VkRayTracingShaderGroupCreateInfoNV(
+                    resourceTracker,
+                    (VkRayTracingShaderGroupCreateInfoNV*)(toTransform->pGroups + i));
             }
         }
     }
 }
 
 void transform_fromhost_VkRayTracingPipelineCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkRayTracingPipelineCreateInfoNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkRayTracingPipelineCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pStages)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->stageCount; ++i)
-            {
-                transform_fromhost_VkPipelineShaderStageCreateInfo(resourceTracker, (VkPipelineShaderStageCreateInfo*)(toTransform->pStages + i));
+    if (toTransform) {
+        if (toTransform->pStages) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->stageCount; ++i) {
+                transform_fromhost_VkPipelineShaderStageCreateInfo(
+                    resourceTracker, (VkPipelineShaderStageCreateInfo*)(toTransform->pStages + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pGroups)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->groupCount; ++i)
-            {
-                transform_fromhost_VkRayTracingShaderGroupCreateInfoNV(resourceTracker, (VkRayTracingShaderGroupCreateInfoNV*)(toTransform->pGroups + i));
+    if (toTransform) {
+        if (toTransform->pGroups) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->groupCount; ++i) {
+                transform_fromhost_VkRayTracingShaderGroupCreateInfoNV(
+                    resourceTracker,
+                    (VkRayTracingShaderGroupCreateInfoNV*)(toTransform->pGroups + i));
             }
         }
     }
 }
 
-void transform_tohost_VkGeometryTrianglesNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkGeometryTrianglesNV* toTransform)
-{
+void transform_tohost_VkGeometryTrianglesNV(VkDecoderGlobalState* resourceTracker,
+                                            VkGeometryTrianglesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkGeometryTrianglesNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkGeometryTrianglesNV* toTransform)
-{
+void transform_fromhost_VkGeometryTrianglesNV(VkDecoderGlobalState* resourceTracker,
+                                              VkGeometryTrianglesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkGeometryAABBNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkGeometryAABBNV* toTransform)
-{
+void transform_tohost_VkGeometryAABBNV(VkDecoderGlobalState* resourceTracker,
+                                       VkGeometryAABBNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkGeometryAABBNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkGeometryAABBNV* toTransform)
-{
+void transform_fromhost_VkGeometryAABBNV(VkDecoderGlobalState* resourceTracker,
+                                         VkGeometryAABBNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkGeometryDataNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkGeometryDataNV* toTransform)
-{
+void transform_tohost_VkGeometryDataNV(VkDecoderGlobalState* resourceTracker,
+                                       VkGeometryDataNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_tohost_VkGeometryTrianglesNV(resourceTracker, (VkGeometryTrianglesNV*)(&toTransform->triangles));
+    transform_tohost_VkGeometryTrianglesNV(resourceTracker,
+                                           (VkGeometryTrianglesNV*)(&toTransform->triangles));
     transform_tohost_VkGeometryAABBNV(resourceTracker, (VkGeometryAABBNV*)(&toTransform->aabbs));
 }
 
-void transform_fromhost_VkGeometryDataNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkGeometryDataNV* toTransform)
-{
+void transform_fromhost_VkGeometryDataNV(VkDecoderGlobalState* resourceTracker,
+                                         VkGeometryDataNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_fromhost_VkGeometryTrianglesNV(resourceTracker, (VkGeometryTrianglesNV*)(&toTransform->triangles));
+    transform_fromhost_VkGeometryTrianglesNV(resourceTracker,
+                                             (VkGeometryTrianglesNV*)(&toTransform->triangles));
     transform_fromhost_VkGeometryAABBNV(resourceTracker, (VkGeometryAABBNV*)(&toTransform->aabbs));
 }
 
-void transform_tohost_VkGeometryNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkGeometryNV* toTransform)
-{
+void transform_tohost_VkGeometryNV(VkDecoderGlobalState* resourceTracker,
+                                   VkGeometryNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
     transform_tohost_VkGeometryDataNV(resourceTracker, (VkGeometryDataNV*)(&toTransform->geometry));
 }
 
-void transform_fromhost_VkGeometryNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkGeometryNV* toTransform)
-{
+void transform_fromhost_VkGeometryNV(VkDecoderGlobalState* resourceTracker,
+                                     VkGeometryNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkGeometryDataNV(resourceTracker, (VkGeometryDataNV*)(&toTransform->geometry));
+    transform_fromhost_VkGeometryDataNV(resourceTracker,
+                                        (VkGeometryDataNV*)(&toTransform->geometry));
 }
 
-void transform_tohost_VkAccelerationStructureInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureInfoNV* toTransform)
-{
+void transform_tohost_VkAccelerationStructureInfoNV(VkDecoderGlobalState* resourceTracker,
+                                                    VkAccelerationStructureInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pGeometries)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->geometryCount; ++i)
-            {
-                transform_tohost_VkGeometryNV(resourceTracker, (VkGeometryNV*)(toTransform->pGeometries + i));
+    if (toTransform) {
+        if (toTransform->pGeometries) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->geometryCount; ++i) {
+                transform_tohost_VkGeometryNV(resourceTracker,
+                                              (VkGeometryNV*)(toTransform->pGeometries + i));
             }
         }
     }
 }
 
-void transform_fromhost_VkAccelerationStructureInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureInfoNV* toTransform)
-{
+void transform_fromhost_VkAccelerationStructureInfoNV(VkDecoderGlobalState* resourceTracker,
+                                                      VkAccelerationStructureInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pGeometries)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->geometryCount; ++i)
-            {
-                transform_fromhost_VkGeometryNV(resourceTracker, (VkGeometryNV*)(toTransform->pGeometries + i));
+    if (toTransform) {
+        if (toTransform->pGeometries) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->geometryCount; ++i) {
+                transform_fromhost_VkGeometryNV(resourceTracker,
+                                                (VkGeometryNV*)(toTransform->pGeometries + i));
             }
         }
     }
 }
 
 void transform_tohost_VkAccelerationStructureCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureCreateInfoNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkAccelerationStructureInfoNV(resourceTracker, (VkAccelerationStructureInfoNV*)(&toTransform->info));
+    transform_tohost_VkAccelerationStructureInfoNV(
+        resourceTracker, (VkAccelerationStructureInfoNV*)(&toTransform->info));
 }
 
 void transform_fromhost_VkAccelerationStructureCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureCreateInfoNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkAccelerationStructureInfoNV(resourceTracker, (VkAccelerationStructureInfoNV*)(&toTransform->info));
+    transform_fromhost_VkAccelerationStructureInfoNV(
+        resourceTracker, (VkAccelerationStructureInfoNV*)(&toTransform->info));
 }
 
 void transform_tohost_VkBindAccelerationStructureMemoryInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindAccelerationStructureMemoryInfoNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkBindAccelerationStructureMemoryInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)&toTransform->memoryOffset, 1, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
-    if (toTransform->pNext)
-    {
+    resourceTracker->deviceMemoryTransform_tohost(
+        (VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)&toTransform->memoryOffset, 1,
+        (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkBindAccelerationStructureMemoryInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindAccelerationStructureMemoryInfoNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkBindAccelerationStructureMemoryInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    resourceTracker->deviceMemoryTransform_fromhost((VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)&toTransform->memoryOffset, 1, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
-    if (toTransform->pNext)
-    {
+    resourceTracker->deviceMemoryTransform_fromhost(
+        (VkDeviceMemory*)&toTransform->memory, 1, (VkDeviceSize*)&toTransform->memoryOffset, 1,
+        (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkWriteDescriptorSetAccelerationStructureNV(
     VkDecoderGlobalState* resourceTracker,
-    VkWriteDescriptorSetAccelerationStructureNV* toTransform)
-{
+    VkWriteDescriptorSetAccelerationStructureNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkWriteDescriptorSetAccelerationStructureNV(
     VkDecoderGlobalState* resourceTracker,
-    VkWriteDescriptorSetAccelerationStructureNV* toTransform)
-{
+    VkWriteDescriptorSetAccelerationStructureNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkAccelerationStructureMemoryRequirementsInfoNV(
     VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureMemoryRequirementsInfoNV* toTransform)
-{
+    VkAccelerationStructureMemoryRequirementsInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkAccelerationStructureMemoryRequirementsInfoNV(
     VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureMemoryRequirementsInfoNV* toTransform)
-{
+    VkAccelerationStructureMemoryRequirementsInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceRayTracingPropertiesNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceRayTracingPropertiesNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceRayTracingPropertiesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceRayTracingPropertiesNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceRayTracingPropertiesNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceRayTracingPropertiesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkTransformMatrixKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkTransformMatrixKHR* toTransform)
-{
+void transform_tohost_VkTransformMatrixKHR(VkDecoderGlobalState* resourceTracker,
+                                           VkTransformMatrixKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkTransformMatrixKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkTransformMatrixKHR* toTransform)
-{
+void transform_fromhost_VkTransformMatrixKHR(VkDecoderGlobalState* resourceTracker,
+                                             VkTransformMatrixKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkAabbPositionsKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAabbPositionsKHR* toTransform)
-{
+void transform_tohost_VkAabbPositionsKHR(VkDecoderGlobalState* resourceTracker,
+                                         VkAabbPositionsKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkAabbPositionsKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAabbPositionsKHR* toTransform)
-{
+void transform_fromhost_VkAabbPositionsKHR(VkDecoderGlobalState* resourceTracker,
+                                           VkAabbPositionsKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_tohost_VkAccelerationStructureInstanceKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureInstanceKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureInstanceKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_tohost_VkTransformMatrixKHR(resourceTracker, (VkTransformMatrixKHR*)(&toTransform->transform));
+    transform_tohost_VkTransformMatrixKHR(resourceTracker,
+                                          (VkTransformMatrixKHR*)(&toTransform->transform));
 }
 
 void transform_fromhost_VkAccelerationStructureInstanceKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureInstanceKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureInstanceKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_fromhost_VkTransformMatrixKHR(resourceTracker, (VkTransformMatrixKHR*)(&toTransform->transform));
+    transform_fromhost_VkTransformMatrixKHR(resourceTracker,
+                                            (VkTransformMatrixKHR*)(&toTransform->transform));
 }
 
 #endif
 #ifdef VK_NV_representative_fragment_test
 void transform_tohost_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* toTransform)
-{
+    VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* toTransform)
-{
+    VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineRepresentativeFragmentTestStateCreateInfoNV* toTransform)
-{
+    VkPipelineRepresentativeFragmentTestStateCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineRepresentativeFragmentTestStateCreateInfoNV* toTransform)
-{
+    VkPipelineRepresentativeFragmentTestStateCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -14506,48 +11728,40 @@
 #ifdef VK_EXT_filter_cubic
 void transform_tohost_VkPhysicalDeviceImageViewImageFormatInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceImageViewImageFormatInfoEXT* toTransform)
-{
+    VkPhysicalDeviceImageViewImageFormatInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceImageViewImageFormatInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceImageViewImageFormatInfoEXT* toTransform)
-{
+    VkPhysicalDeviceImageViewImageFormatInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkFilterCubicImageViewImageFormatPropertiesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkFilterCubicImageViewImageFormatPropertiesEXT* toTransform)
-{
+    VkFilterCubicImageViewImageFormatPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkFilterCubicImageViewImageFormatPropertiesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkFilterCubicImageViewImageFormatPropertiesEXT* toTransform)
-{
+    VkFilterCubicImageViewImageFormatPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -14557,25 +11771,19 @@
 #endif
 #ifdef VK_EXT_global_priority
 void transform_tohost_VkDeviceQueueGlobalPriorityCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceQueueGlobalPriorityCreateInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDeviceQueueGlobalPriorityCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkDeviceQueueGlobalPriorityCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceQueueGlobalPriorityCreateInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDeviceQueueGlobalPriorityCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -14583,75 +11791,63 @@
 #endif
 #ifdef VK_EXT_external_memory_host
 void transform_tohost_VkImportMemoryHostPointerInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportMemoryHostPointerInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkImportMemoryHostPointerInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkImportMemoryHostPointerInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportMemoryHostPointerInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkImportMemoryHostPointerInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkMemoryHostPointerPropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryHostPointerPropertiesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkMemoryHostPointerPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    resourceTracker->deviceMemoryTransform_tohost((VkDeviceMemory*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)&toTransform->memoryTypeBits, 1);
-    if (toTransform->pNext)
-    {
+    resourceTracker->deviceMemoryTransform_tohost(
+        (VkDeviceMemory*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0,
+        (uint32_t*)nullptr, 0, (uint32_t*)&toTransform->memoryTypeBits, 1);
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkMemoryHostPointerPropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryHostPointerPropertiesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkMemoryHostPointerPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    resourceTracker->deviceMemoryTransform_fromhost((VkDeviceMemory*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)&toTransform->memoryTypeBits, 1);
-    if (toTransform->pNext)
-    {
+    resourceTracker->deviceMemoryTransform_fromhost(
+        (VkDeviceMemory*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0,
+        (uint32_t*)nullptr, 0, (uint32_t*)&toTransform->memoryTypeBits, 1);
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceExternalMemoryHostPropertiesEXT* toTransform)
-{
+    VkPhysicalDeviceExternalMemoryHostPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceExternalMemoryHostPropertiesEXT* toTransform)
-{
+    VkPhysicalDeviceExternalMemoryHostPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -14661,51 +11857,39 @@
 #endif
 #ifdef VK_AMD_pipeline_compiler_control
 void transform_tohost_VkPipelineCompilerControlCreateInfoAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineCompilerControlCreateInfoAMD* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineCompilerControlCreateInfoAMD* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPipelineCompilerControlCreateInfoAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineCompilerControlCreateInfoAMD* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineCompilerControlCreateInfoAMD* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_calibrated_timestamps
-void transform_tohost_VkCalibratedTimestampInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkCalibratedTimestampInfoEXT* toTransform)
-{
+void transform_tohost_VkCalibratedTimestampInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                   VkCalibratedTimestampInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkCalibratedTimestampInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkCalibratedTimestampInfoEXT* toTransform)
-{
+void transform_fromhost_VkCalibratedTimestampInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                     VkCalibratedTimestampInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -14713,213 +11897,173 @@
 #endif
 #ifdef VK_AMD_shader_core_properties
 void transform_tohost_VkPhysicalDeviceShaderCorePropertiesAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderCorePropertiesAMD* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceShaderCorePropertiesAMD* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceShaderCorePropertiesAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderCorePropertiesAMD* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceShaderCorePropertiesAMD* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_video_decode_h265
-void transform_tohost_VkVideoDecodeH265ProfileEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH265ProfileEXT* toTransform)
-{
+void transform_tohost_VkVideoDecodeH265ProfileEXT(VkDecoderGlobalState* resourceTracker,
+                                                  VkVideoDecodeH265ProfileEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkVideoDecodeH265ProfileEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH265ProfileEXT* toTransform)
-{
+void transform_fromhost_VkVideoDecodeH265ProfileEXT(VkDecoderGlobalState* resourceTracker,
+                                                    VkVideoDecodeH265ProfileEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkVideoDecodeH265CapabilitiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH265CapabilitiesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoDecodeH265CapabilitiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkExtensionProperties(resourceTracker, (VkExtensionProperties*)(&toTransform->stdExtensionVersion));
+    transform_tohost_VkExtensionProperties(
+        resourceTracker, (VkExtensionProperties*)(&toTransform->stdExtensionVersion));
 }
 
 void transform_fromhost_VkVideoDecodeH265CapabilitiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH265CapabilitiesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoDecodeH265CapabilitiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkExtensionProperties(resourceTracker, (VkExtensionProperties*)(&toTransform->stdExtensionVersion));
+    transform_fromhost_VkExtensionProperties(
+        resourceTracker, (VkExtensionProperties*)(&toTransform->stdExtensionVersion));
 }
 
 void transform_tohost_VkVideoDecodeH265SessionCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH265SessionCreateInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoDecodeH265SessionCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pStdExtensionVersion)
-    {
-        transform_tohost_VkExtensionProperties(resourceTracker, (VkExtensionProperties*)(toTransform->pStdExtensionVersion));
+    if (toTransform->pStdExtensionVersion) {
+        transform_tohost_VkExtensionProperties(
+            resourceTracker, (VkExtensionProperties*)(toTransform->pStdExtensionVersion));
     }
 }
 
 void transform_fromhost_VkVideoDecodeH265SessionCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH265SessionCreateInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoDecodeH265SessionCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pStdExtensionVersion)
-    {
-        transform_fromhost_VkExtensionProperties(resourceTracker, (VkExtensionProperties*)(toTransform->pStdExtensionVersion));
+    if (toTransform->pStdExtensionVersion) {
+        transform_fromhost_VkExtensionProperties(
+            resourceTracker, (VkExtensionProperties*)(toTransform->pStdExtensionVersion));
     }
 }
 
 void transform_tohost_VkVideoDecodeH265SessionParametersAddInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH265SessionParametersAddInfoEXT* toTransform)
-{
+    VkVideoDecodeH265SessionParametersAddInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkVideoDecodeH265SessionParametersAddInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH265SessionParametersAddInfoEXT* toTransform)
-{
+    VkVideoDecodeH265SessionParametersAddInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkVideoDecodeH265SessionParametersCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH265SessionParametersCreateInfoEXT* toTransform)
-{
+    VkVideoDecodeH265SessionParametersCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pParametersAddInfo)
-    {
-        transform_tohost_VkVideoDecodeH265SessionParametersAddInfoEXT(resourceTracker, (VkVideoDecodeH265SessionParametersAddInfoEXT*)(toTransform->pParametersAddInfo));
+    if (toTransform->pParametersAddInfo) {
+        transform_tohost_VkVideoDecodeH265SessionParametersAddInfoEXT(
+            resourceTracker,
+            (VkVideoDecodeH265SessionParametersAddInfoEXT*)(toTransform->pParametersAddInfo));
     }
 }
 
 void transform_fromhost_VkVideoDecodeH265SessionParametersCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH265SessionParametersCreateInfoEXT* toTransform)
-{
+    VkVideoDecodeH265SessionParametersCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pParametersAddInfo)
-    {
-        transform_fromhost_VkVideoDecodeH265SessionParametersAddInfoEXT(resourceTracker, (VkVideoDecodeH265SessionParametersAddInfoEXT*)(toTransform->pParametersAddInfo));
+    if (toTransform->pParametersAddInfo) {
+        transform_fromhost_VkVideoDecodeH265SessionParametersAddInfoEXT(
+            resourceTracker,
+            (VkVideoDecodeH265SessionParametersAddInfoEXT*)(toTransform->pParametersAddInfo));
     }
 }
 
 void transform_tohost_VkVideoDecodeH265PictureInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH265PictureInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoDecodeH265PictureInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkVideoDecodeH265PictureInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH265PictureInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoDecodeH265PictureInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkVideoDecodeH265DpbSlotInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH265DpbSlotInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoDecodeH265DpbSlotInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkVideoDecodeH265DpbSlotInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH265DpbSlotInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVideoDecodeH265DpbSlotInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -14927,25 +12071,19 @@
 #endif
 #ifdef VK_AMD_memory_overallocation_behavior
 void transform_tohost_VkDeviceMemoryOverallocationCreateInfoAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceMemoryOverallocationCreateInfoAMD* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDeviceMemoryOverallocationCreateInfoAMD* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkDeviceMemoryOverallocationCreateInfoAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceMemoryOverallocationCreateInfoAMD* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDeviceMemoryOverallocationCreateInfoAMD* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -14954,61 +12092,52 @@
 #ifdef VK_EXT_vertex_attribute_divisor
 void transform_tohost_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* toTransform)
-{
+    VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* toTransform)
-{
+    VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkVertexInputBindingDivisorDescriptionEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVertexInputBindingDivisorDescriptionEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVertexInputBindingDivisorDescriptionEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_fromhost_VkVertexInputBindingDivisorDescriptionEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVertexInputBindingDivisorDescriptionEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVertexInputBindingDivisorDescriptionEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_tohost_VkPipelineVertexInputDivisorStateCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineVertexInputDivisorStateCreateInfoEXT* toTransform)
-{
+    VkPipelineVertexInputDivisorStateCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pVertexBindingDivisors)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->vertexBindingDivisorCount; ++i)
-            {
-                transform_tohost_VkVertexInputBindingDivisorDescriptionEXT(resourceTracker, (VkVertexInputBindingDivisorDescriptionEXT*)(toTransform->pVertexBindingDivisors + i));
+    if (toTransform) {
+        if (toTransform->pVertexBindingDivisors) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->vertexBindingDivisorCount; ++i) {
+                transform_tohost_VkVertexInputBindingDivisorDescriptionEXT(
+                    resourceTracker,
+                    (VkVertexInputBindingDivisorDescriptionEXT*)(toTransform
+                                                                     ->pVertexBindingDivisors +
+                                                                 i));
             }
         }
     }
@@ -15016,21 +12145,20 @@
 
 void transform_fromhost_VkPipelineVertexInputDivisorStateCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineVertexInputDivisorStateCreateInfoEXT* toTransform)
-{
+    VkPipelineVertexInputDivisorStateCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pVertexBindingDivisors)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->vertexBindingDivisorCount; ++i)
-            {
-                transform_fromhost_VkVertexInputBindingDivisorDescriptionEXT(resourceTracker, (VkVertexInputBindingDivisorDescriptionEXT*)(toTransform->pVertexBindingDivisors + i));
+    if (toTransform) {
+        if (toTransform->pVertexBindingDivisors) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->vertexBindingDivisorCount; ++i) {
+                transform_fromhost_VkVertexInputBindingDivisorDescriptionEXT(
+                    resourceTracker,
+                    (VkVertexInputBindingDivisorDescriptionEXT*)(toTransform
+                                                                     ->pVertexBindingDivisors +
+                                                                 i));
             }
         }
     }
@@ -15038,119 +12166,103 @@
 
 void transform_tohost_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_GGP_frame_token
-void transform_tohost_VkPresentFrameTokenGGP(
-    VkDecoderGlobalState* resourceTracker,
-    VkPresentFrameTokenGGP* toTransform)
-{
+void transform_tohost_VkPresentFrameTokenGGP(VkDecoderGlobalState* resourceTracker,
+                                             VkPresentFrameTokenGGP* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkPresentFrameTokenGGP(
-    VkDecoderGlobalState* resourceTracker,
-    VkPresentFrameTokenGGP* toTransform)
-{
+void transform_fromhost_VkPresentFrameTokenGGP(VkDecoderGlobalState* resourceTracker,
+                                               VkPresentFrameTokenGGP* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_pipeline_creation_feedback
-void transform_tohost_VkPipelineCreationFeedbackEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineCreationFeedbackEXT* toTransform)
-{
+void transform_tohost_VkPipelineCreationFeedbackEXT(VkDecoderGlobalState* resourceTracker,
+                                                    VkPipelineCreationFeedbackEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkPipelineCreationFeedbackEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineCreationFeedbackEXT* toTransform)
-{
+void transform_fromhost_VkPipelineCreationFeedbackEXT(VkDecoderGlobalState* resourceTracker,
+                                                      VkPipelineCreationFeedbackEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_tohost_VkPipelineCreationFeedbackCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineCreationFeedbackCreateInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineCreationFeedbackCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pPipelineCreationFeedback)
-    {
-        transform_tohost_VkPipelineCreationFeedbackEXT(resourceTracker, (VkPipelineCreationFeedbackEXT*)(toTransform->pPipelineCreationFeedback));
+    if (toTransform->pPipelineCreationFeedback) {
+        transform_tohost_VkPipelineCreationFeedbackEXT(
+            resourceTracker,
+            (VkPipelineCreationFeedbackEXT*)(toTransform->pPipelineCreationFeedback));
     }
-    if (toTransform)
-    {
-        if (toTransform->pPipelineStageCreationFeedbacks)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->pipelineStageCreationFeedbackCount; ++i)
-            {
-                transform_tohost_VkPipelineCreationFeedbackEXT(resourceTracker, (VkPipelineCreationFeedbackEXT*)(toTransform->pPipelineStageCreationFeedbacks + i));
+    if (toTransform) {
+        if (toTransform->pPipelineStageCreationFeedbacks) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->pipelineStageCreationFeedbackCount;
+                 ++i) {
+                transform_tohost_VkPipelineCreationFeedbackEXT(
+                    resourceTracker,
+                    (VkPipelineCreationFeedbackEXT*)(toTransform->pPipelineStageCreationFeedbacks +
+                                                     i));
             }
         }
     }
 }
 
 void transform_fromhost_VkPipelineCreationFeedbackCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineCreationFeedbackCreateInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineCreationFeedbackCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pPipelineCreationFeedback)
-    {
-        transform_fromhost_VkPipelineCreationFeedbackEXT(resourceTracker, (VkPipelineCreationFeedbackEXT*)(toTransform->pPipelineCreationFeedback));
+    if (toTransform->pPipelineCreationFeedback) {
+        transform_fromhost_VkPipelineCreationFeedbackEXT(
+            resourceTracker,
+            (VkPipelineCreationFeedbackEXT*)(toTransform->pPipelineCreationFeedback));
     }
-    if (toTransform)
-    {
-        if (toTransform->pPipelineStageCreationFeedbacks)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->pipelineStageCreationFeedbackCount; ++i)
-            {
-                transform_fromhost_VkPipelineCreationFeedbackEXT(resourceTracker, (VkPipelineCreationFeedbackEXT*)(toTransform->pPipelineStageCreationFeedbacks + i));
+    if (toTransform) {
+        if (toTransform->pPipelineStageCreationFeedbacks) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->pipelineStageCreationFeedbackCount;
+                 ++i) {
+                transform_fromhost_VkPipelineCreationFeedbackEXT(
+                    resourceTracker,
+                    (VkPipelineCreationFeedbackEXT*)(toTransform->pPipelineStageCreationFeedbacks +
+                                                     i));
             }
         }
     }
@@ -15162,24 +12274,20 @@
 #ifdef VK_NV_compute_shader_derivatives
 void transform_tohost_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* toTransform)
-{
+    VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* toTransform)
-{
+    VkPhysicalDeviceComputeShaderDerivativesFeaturesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -15187,65 +12295,49 @@
 #endif
 #ifdef VK_NV_mesh_shader
 void transform_tohost_VkPhysicalDeviceMeshShaderFeaturesNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMeshShaderFeaturesNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMeshShaderFeaturesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceMeshShaderFeaturesNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMeshShaderFeaturesNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMeshShaderFeaturesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceMeshShaderPropertiesNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMeshShaderPropertiesNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMeshShaderPropertiesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceMeshShaderPropertiesNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMeshShaderPropertiesNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMeshShaderPropertiesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkDrawMeshTasksIndirectCommandNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkDrawMeshTasksIndirectCommandNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDrawMeshTasksIndirectCommandNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_fromhost_VkDrawMeshTasksIndirectCommandNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkDrawMeshTasksIndirectCommandNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDrawMeshTasksIndirectCommandNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
@@ -15254,24 +12346,20 @@
 #ifdef VK_NV_fragment_shader_barycentric
 void transform_tohost_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* toTransform)
-{
+    VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* toTransform)
-{
+    VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -15280,24 +12368,20 @@
 #ifdef VK_NV_shader_image_footprint
 void transform_tohost_VkPhysicalDeviceShaderImageFootprintFeaturesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderImageFootprintFeaturesNV* toTransform)
-{
+    VkPhysicalDeviceShaderImageFootprintFeaturesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceShaderImageFootprintFeaturesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderImageFootprintFeaturesNV* toTransform)
-{
+    VkPhysicalDeviceShaderImageFootprintFeaturesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -15306,21 +12390,17 @@
 #ifdef VK_NV_scissor_exclusive
 void transform_tohost_VkPipelineViewportExclusiveScissorStateCreateInfoNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineViewportExclusiveScissorStateCreateInfoNV* toTransform)
-{
+    VkPipelineViewportExclusiveScissorStateCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pExclusiveScissors)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->exclusiveScissorCount; ++i)
-            {
-                transform_tohost_VkRect2D(resourceTracker, (VkRect2D*)(toTransform->pExclusiveScissors + i));
+    if (toTransform) {
+        if (toTransform->pExclusiveScissors) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->exclusiveScissorCount; ++i) {
+                transform_tohost_VkRect2D(resourceTracker,
+                                          (VkRect2D*)(toTransform->pExclusiveScissors + i));
             }
         }
     }
@@ -15328,21 +12408,17 @@
 
 void transform_fromhost_VkPipelineViewportExclusiveScissorStateCreateInfoNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineViewportExclusiveScissorStateCreateInfoNV* toTransform)
-{
+    VkPipelineViewportExclusiveScissorStateCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pExclusiveScissors)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->exclusiveScissorCount; ++i)
-            {
-                transform_fromhost_VkRect2D(resourceTracker, (VkRect2D*)(toTransform->pExclusiveScissors + i));
+    if (toTransform) {
+        if (toTransform->pExclusiveScissors) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->exclusiveScissorCount; ++i) {
+                transform_fromhost_VkRect2D(resourceTracker,
+                                            (VkRect2D*)(toTransform->pExclusiveScissors + i));
             }
         }
     }
@@ -15350,24 +12426,20 @@
 
 void transform_tohost_VkPhysicalDeviceExclusiveScissorFeaturesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceExclusiveScissorFeaturesNV* toTransform)
-{
+    VkPhysicalDeviceExclusiveScissorFeaturesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceExclusiveScissorFeaturesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceExclusiveScissorFeaturesNV* toTransform)
-{
+    VkPhysicalDeviceExclusiveScissorFeaturesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -15375,49 +12447,37 @@
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
 void transform_tohost_VkQueueFamilyCheckpointPropertiesNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkQueueFamilyCheckpointPropertiesNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkQueueFamilyCheckpointPropertiesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkQueueFamilyCheckpointPropertiesNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkQueueFamilyCheckpointPropertiesNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkQueueFamilyCheckpointPropertiesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkCheckpointDataNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkCheckpointDataNV* toTransform)
-{
+void transform_tohost_VkCheckpointDataNV(VkDecoderGlobalState* resourceTracker,
+                                         VkCheckpointDataNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkCheckpointDataNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkCheckpointDataNV* toTransform)
-{
+void transform_fromhost_VkCheckpointDataNV(VkDecoderGlobalState* resourceTracker,
+                                           VkCheckpointDataNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -15426,204 +12486,162 @@
 #ifdef VK_INTEL_shader_integer_functions2
 void transform_tohost_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* toTransform)
-{
+    VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* toTransform)
-{
+    VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_INTEL_performance_query
-void transform_tohost_VkPerformanceValueDataINTEL(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceValueDataINTEL* toTransform)
-{
+void transform_tohost_VkPerformanceValueDataINTEL(VkDecoderGlobalState* resourceTracker,
+                                                  VkPerformanceValueDataINTEL* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkPerformanceValueDataINTEL(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceValueDataINTEL* toTransform)
-{
+void transform_fromhost_VkPerformanceValueDataINTEL(VkDecoderGlobalState* resourceTracker,
+                                                    VkPerformanceValueDataINTEL* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkPerformanceValueINTEL(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceValueINTEL* toTransform)
-{
+void transform_tohost_VkPerformanceValueINTEL(VkDecoderGlobalState* resourceTracker,
+                                              VkPerformanceValueINTEL* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_tohost_VkPerformanceValueDataINTEL(resourceTracker, (VkPerformanceValueDataINTEL*)(&toTransform->data));
+    transform_tohost_VkPerformanceValueDataINTEL(
+        resourceTracker, (VkPerformanceValueDataINTEL*)(&toTransform->data));
 }
 
-void transform_fromhost_VkPerformanceValueINTEL(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceValueINTEL* toTransform)
-{
+void transform_fromhost_VkPerformanceValueINTEL(VkDecoderGlobalState* resourceTracker,
+                                                VkPerformanceValueINTEL* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_fromhost_VkPerformanceValueDataINTEL(resourceTracker, (VkPerformanceValueDataINTEL*)(&toTransform->data));
+    transform_fromhost_VkPerformanceValueDataINTEL(
+        resourceTracker, (VkPerformanceValueDataINTEL*)(&toTransform->data));
 }
 
 void transform_tohost_VkInitializePerformanceApiInfoINTEL(
-    VkDecoderGlobalState* resourceTracker,
-    VkInitializePerformanceApiInfoINTEL* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkInitializePerformanceApiInfoINTEL* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkInitializePerformanceApiInfoINTEL(
-    VkDecoderGlobalState* resourceTracker,
-    VkInitializePerformanceApiInfoINTEL* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkInitializePerformanceApiInfoINTEL* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkQueryPoolPerformanceQueryCreateInfoINTEL(
     VkDecoderGlobalState* resourceTracker,
-    VkQueryPoolPerformanceQueryCreateInfoINTEL* toTransform)
-{
+    VkQueryPoolPerformanceQueryCreateInfoINTEL* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkQueryPoolPerformanceQueryCreateInfoINTEL(
     VkDecoderGlobalState* resourceTracker,
-    VkQueryPoolPerformanceQueryCreateInfoINTEL* toTransform)
-{
+    VkQueryPoolPerformanceQueryCreateInfoINTEL* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkPerformanceMarkerInfoINTEL(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceMarkerInfoINTEL* toTransform)
-{
+void transform_tohost_VkPerformanceMarkerInfoINTEL(VkDecoderGlobalState* resourceTracker,
+                                                   VkPerformanceMarkerInfoINTEL* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkPerformanceMarkerInfoINTEL(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceMarkerInfoINTEL* toTransform)
-{
+void transform_fromhost_VkPerformanceMarkerInfoINTEL(VkDecoderGlobalState* resourceTracker,
+                                                     VkPerformanceMarkerInfoINTEL* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPerformanceStreamMarkerInfoINTEL(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceStreamMarkerInfoINTEL* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPerformanceStreamMarkerInfoINTEL* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPerformanceStreamMarkerInfoINTEL(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceStreamMarkerInfoINTEL* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPerformanceStreamMarkerInfoINTEL* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkPerformanceOverrideInfoINTEL(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceOverrideInfoINTEL* toTransform)
-{
+void transform_tohost_VkPerformanceOverrideInfoINTEL(VkDecoderGlobalState* resourceTracker,
+                                                     VkPerformanceOverrideInfoINTEL* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPerformanceOverrideInfoINTEL(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceOverrideInfoINTEL* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPerformanceOverrideInfoINTEL* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPerformanceConfigurationAcquireInfoINTEL(
     VkDecoderGlobalState* resourceTracker,
-    VkPerformanceConfigurationAcquireInfoINTEL* toTransform)
-{
+    VkPerformanceConfigurationAcquireInfoINTEL* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPerformanceConfigurationAcquireInfoINTEL(
     VkDecoderGlobalState* resourceTracker,
-    VkPerformanceConfigurationAcquireInfoINTEL* toTransform)
-{
+    VkPerformanceConfigurationAcquireInfoINTEL* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -15631,25 +12649,19 @@
 #endif
 #ifdef VK_EXT_pci_bus_info
 void transform_tohost_VkPhysicalDevicePCIBusInfoPropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePCIBusInfoPropertiesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDevicePCIBusInfoPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDevicePCIBusInfoPropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePCIBusInfoPropertiesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDevicePCIBusInfoPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -15657,49 +12669,37 @@
 #endif
 #ifdef VK_AMD_display_native_hdr
 void transform_tohost_VkDisplayNativeHdrSurfaceCapabilitiesAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayNativeHdrSurfaceCapabilitiesAMD* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDisplayNativeHdrSurfaceCapabilitiesAMD* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkDisplayNativeHdrSurfaceCapabilitiesAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayNativeHdrSurfaceCapabilitiesAMD* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDisplayNativeHdrSurfaceCapabilitiesAMD* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkSwapchainDisplayNativeHdrCreateInfoAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkSwapchainDisplayNativeHdrCreateInfoAMD* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkSwapchainDisplayNativeHdrCreateInfoAMD* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkSwapchainDisplayNativeHdrCreateInfoAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkSwapchainDisplayNativeHdrCreateInfoAMD* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkSwapchainDisplayNativeHdrCreateInfoAMD* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -15707,51 +12707,39 @@
 #endif
 #ifdef VK_FUCHSIA_imagepipe_surface
 void transform_tohost_VkImagePipeSurfaceCreateInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkImagePipeSurfaceCreateInfoFUCHSIA* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkImagePipeSurfaceCreateInfoFUCHSIA* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkImagePipeSurfaceCreateInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkImagePipeSurfaceCreateInfoFUCHSIA* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkImagePipeSurfaceCreateInfoFUCHSIA* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_metal_surface
-void transform_tohost_VkMetalSurfaceCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkMetalSurfaceCreateInfoEXT* toTransform)
-{
+void transform_tohost_VkMetalSurfaceCreateInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                  VkMetalSurfaceCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkMetalSurfaceCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkMetalSurfaceCreateInfoEXT* toTransform)
-{
+void transform_fromhost_VkMetalSurfaceCreateInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                    VkMetalSurfaceCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -15760,80 +12748,74 @@
 #ifdef VK_EXT_fragment_density_map
 void transform_tohost_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceFragmentDensityMapFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceFragmentDensityMapFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceFragmentDensityMapFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceFragmentDensityMapFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceFragmentDensityMapPropertiesEXT* toTransform)
-{
+    VkPhysicalDeviceFragmentDensityMapPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->minFragmentDensityTexelSize));
-    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxFragmentDensityTexelSize));
+    transform_tohost_VkExtent2D(resourceTracker,
+                                (VkExtent2D*)(&toTransform->minFragmentDensityTexelSize));
+    transform_tohost_VkExtent2D(resourceTracker,
+                                (VkExtent2D*)(&toTransform->maxFragmentDensityTexelSize));
 }
 
 void transform_fromhost_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceFragmentDensityMapPropertiesEXT* toTransform)
-{
+    VkPhysicalDeviceFragmentDensityMapPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->minFragmentDensityTexelSize));
-    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->maxFragmentDensityTexelSize));
+    transform_fromhost_VkExtent2D(resourceTracker,
+                                  (VkExtent2D*)(&toTransform->minFragmentDensityTexelSize));
+    transform_fromhost_VkExtent2D(resourceTracker,
+                                  (VkExtent2D*)(&toTransform->maxFragmentDensityTexelSize));
 }
 
 void transform_tohost_VkRenderPassFragmentDensityMapCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkRenderPassFragmentDensityMapCreateInfoEXT* toTransform)
-{
+    VkRenderPassFragmentDensityMapCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkAttachmentReference(resourceTracker, (VkAttachmentReference*)(&toTransform->fragmentDensityMapAttachment));
+    transform_tohost_VkAttachmentReference(
+        resourceTracker, (VkAttachmentReference*)(&toTransform->fragmentDensityMapAttachment));
 }
 
 void transform_fromhost_VkRenderPassFragmentDensityMapCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkRenderPassFragmentDensityMapCreateInfoEXT* toTransform)
-{
+    VkRenderPassFragmentDensityMapCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkAttachmentReference(resourceTracker, (VkAttachmentReference*)(&toTransform->fragmentDensityMapAttachment));
+    transform_fromhost_VkAttachmentReference(
+        resourceTracker, (VkAttachmentReference*)(&toTransform->fragmentDensityMapAttachment));
 }
 
 #endif
@@ -15846,72 +12828,60 @@
 #ifdef VK_EXT_subgroup_size_control
 void transform_tohost_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* toTransform)
-{
+    VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* toTransform)
-{
+    VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* toTransform)
-{
+    VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* toTransform)
-{
+    VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -15919,25 +12889,19 @@
 #endif
 #ifdef VK_AMD_shader_core_properties2
 void transform_tohost_VkPhysicalDeviceShaderCoreProperties2AMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderCoreProperties2AMD* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceShaderCoreProperties2AMD* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceShaderCoreProperties2AMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderCoreProperties2AMD* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceShaderCoreProperties2AMD* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -15945,25 +12909,19 @@
 #endif
 #ifdef VK_AMD_device_coherent_memory
 void transform_tohost_VkPhysicalDeviceCoherentMemoryFeaturesAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceCoherentMemoryFeaturesAMD* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceCoherentMemoryFeaturesAMD* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceCoherentMemoryFeaturesAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceCoherentMemoryFeaturesAMD* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceCoherentMemoryFeaturesAMD* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -15972,24 +12930,20 @@
 #ifdef VK_EXT_shader_image_atomic_int64
 void transform_tohost_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -15997,25 +12951,19 @@
 #endif
 #ifdef VK_EXT_memory_budget
 void transform_tohost_VkPhysicalDeviceMemoryBudgetPropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMemoryBudgetPropertiesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMemoryBudgetPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceMemoryBudgetPropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMemoryBudgetPropertiesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMemoryBudgetPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -16023,49 +12971,37 @@
 #endif
 #ifdef VK_EXT_memory_priority
 void transform_tohost_VkPhysicalDeviceMemoryPriorityFeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMemoryPriorityFeaturesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMemoryPriorityFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceMemoryPriorityFeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMemoryPriorityFeaturesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMemoryPriorityFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkMemoryPriorityAllocateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryPriorityAllocateInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkMemoryPriorityAllocateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkMemoryPriorityAllocateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryPriorityAllocateInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkMemoryPriorityAllocateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -16074,24 +13010,20 @@
 #ifdef VK_NV_dedicated_allocation_image_aliasing
 void transform_tohost_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* toTransform)
-{
+    VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* toTransform)
-{
+    VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -16100,48 +13032,38 @@
 #ifdef VK_EXT_buffer_device_address
 void transform_tohost_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkBufferDeviceAddressCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferDeviceAddressCreateInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkBufferDeviceAddressCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkBufferDeviceAddressCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferDeviceAddressCreateInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkBufferDeviceAddressCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -16149,25 +13071,19 @@
 #endif
 #ifdef VK_EXT_tooling_info
 void transform_tohost_VkPhysicalDeviceToolPropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceToolPropertiesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceToolPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceToolPropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceToolPropertiesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceToolPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -16176,26 +13092,20 @@
 #ifdef VK_EXT_separate_stencil_usage
 #endif
 #ifdef VK_EXT_validation_features
-void transform_tohost_VkValidationFeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkValidationFeaturesEXT* toTransform)
-{
+void transform_tohost_VkValidationFeaturesEXT(VkDecoderGlobalState* resourceTracker,
+                                              VkValidationFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkValidationFeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkValidationFeaturesEXT* toTransform)
-{
+void transform_fromhost_VkValidationFeaturesEXT(VkDecoderGlobalState* resourceTracker,
+                                                VkValidationFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -16203,73 +13113,59 @@
 #endif
 #ifdef VK_NV_cooperative_matrix
 void transform_tohost_VkCooperativeMatrixPropertiesNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkCooperativeMatrixPropertiesNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkCooperativeMatrixPropertiesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkCooperativeMatrixPropertiesNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkCooperativeMatrixPropertiesNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkCooperativeMatrixPropertiesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceCooperativeMatrixFeaturesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceCooperativeMatrixFeaturesNV* toTransform)
-{
+    VkPhysicalDeviceCooperativeMatrixFeaturesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceCooperativeMatrixFeaturesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceCooperativeMatrixFeaturesNV* toTransform)
-{
+    VkPhysicalDeviceCooperativeMatrixFeaturesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceCooperativeMatrixPropertiesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceCooperativeMatrixPropertiesNV* toTransform)
-{
+    VkPhysicalDeviceCooperativeMatrixPropertiesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceCooperativeMatrixPropertiesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceCooperativeMatrixPropertiesNV* toTransform)
-{
+    VkPhysicalDeviceCooperativeMatrixPropertiesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -16278,72 +13174,58 @@
 #ifdef VK_NV_coverage_reduction_mode
 void transform_tohost_VkPhysicalDeviceCoverageReductionModeFeaturesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceCoverageReductionModeFeaturesNV* toTransform)
-{
+    VkPhysicalDeviceCoverageReductionModeFeaturesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceCoverageReductionModeFeaturesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceCoverageReductionModeFeaturesNV* toTransform)
-{
+    VkPhysicalDeviceCoverageReductionModeFeaturesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPipelineCoverageReductionStateCreateInfoNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineCoverageReductionStateCreateInfoNV* toTransform)
-{
+    VkPipelineCoverageReductionStateCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPipelineCoverageReductionStateCreateInfoNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineCoverageReductionStateCreateInfoNV* toTransform)
-{
+    VkPipelineCoverageReductionStateCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkFramebufferMixedSamplesCombinationNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkFramebufferMixedSamplesCombinationNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkFramebufferMixedSamplesCombinationNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkFramebufferMixedSamplesCombinationNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkFramebufferMixedSamplesCombinationNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkFramebufferMixedSamplesCombinationNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -16352,24 +13234,20 @@
 #ifdef VK_EXT_fragment_shader_interlock
 void transform_tohost_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -16378,24 +13256,20 @@
 #ifdef VK_EXT_ycbcr_image_arrays
 void transform_tohost_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -16404,72 +13278,60 @@
 #ifdef VK_EXT_provoking_vertex
 void transform_tohost_VkPhysicalDeviceProvokingVertexFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceProvokingVertexFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceProvokingVertexFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceProvokingVertexFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceProvokingVertexFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceProvokingVertexFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceProvokingVertexPropertiesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceProvokingVertexPropertiesEXT* toTransform)
-{
+    VkPhysicalDeviceProvokingVertexPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceProvokingVertexPropertiesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceProvokingVertexPropertiesEXT* toTransform)
-{
+    VkPhysicalDeviceProvokingVertexPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineRasterizationProvokingVertexStateCreateInfoEXT* toTransform)
-{
+    VkPipelineRasterizationProvokingVertexStateCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineRasterizationProvokingVertexStateCreateInfoEXT* toTransform)
-{
+    VkPipelineRasterizationProvokingVertexStateCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -16477,99 +13339,77 @@
 #endif
 #ifdef VK_EXT_full_screen_exclusive
 void transform_tohost_VkSurfaceFullScreenExclusiveInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkSurfaceFullScreenExclusiveInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkSurfaceFullScreenExclusiveInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkSurfaceFullScreenExclusiveInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkSurfaceFullScreenExclusiveInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkSurfaceFullScreenExclusiveInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkSurfaceCapabilitiesFullScreenExclusiveEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkSurfaceCapabilitiesFullScreenExclusiveEXT* toTransform)
-{
+    VkSurfaceCapabilitiesFullScreenExclusiveEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkSurfaceCapabilitiesFullScreenExclusiveEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkSurfaceCapabilitiesFullScreenExclusiveEXT* toTransform)
-{
+    VkSurfaceCapabilitiesFullScreenExclusiveEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkSurfaceFullScreenExclusiveWin32InfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkSurfaceFullScreenExclusiveWin32InfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkSurfaceFullScreenExclusiveWin32InfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkSurfaceFullScreenExclusiveWin32InfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkSurfaceFullScreenExclusiveWin32InfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkSurfaceFullScreenExclusiveWin32InfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_EXT_headless_surface
-void transform_tohost_VkHeadlessSurfaceCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkHeadlessSurfaceCreateInfoEXT* toTransform)
-{
+void transform_tohost_VkHeadlessSurfaceCreateInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                     VkHeadlessSurfaceCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkHeadlessSurfaceCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkHeadlessSurfaceCreateInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkHeadlessSurfaceCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -16578,72 +13418,60 @@
 #ifdef VK_EXT_line_rasterization
 void transform_tohost_VkPhysicalDeviceLineRasterizationFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceLineRasterizationFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceLineRasterizationFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceLineRasterizationFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceLineRasterizationFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceLineRasterizationFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceLineRasterizationPropertiesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceLineRasterizationPropertiesEXT* toTransform)
-{
+    VkPhysicalDeviceLineRasterizationPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceLineRasterizationPropertiesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceLineRasterizationPropertiesEXT* toTransform)
-{
+    VkPhysicalDeviceLineRasterizationPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPipelineRasterizationLineStateCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineRasterizationLineStateCreateInfoEXT* toTransform)
-{
+    VkPipelineRasterizationLineStateCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPipelineRasterizationLineStateCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineRasterizationLineStateCreateInfoEXT* toTransform)
-{
+    VkPipelineRasterizationLineStateCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -16652,24 +13480,20 @@
 #ifdef VK_EXT_shader_atomic_float
 void transform_tohost_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -16679,25 +13503,19 @@
 #endif
 #ifdef VK_EXT_index_type_uint8
 void transform_tohost_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceIndexTypeUint8FeaturesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceIndexTypeUint8FeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceIndexTypeUint8FeaturesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceIndexTypeUint8FeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -16706,24 +13524,20 @@
 #ifdef VK_EXT_extended_dynamic_state
 void transform_tohost_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -16732,24 +13546,20 @@
 #ifdef VK_EXT_shader_atomic_float2
 void transform_tohost_VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -16758,24 +13568,20 @@
 #ifdef VK_EXT_shader_demote_to_helper_invocation
 void transform_tohost_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -16784,129 +13590,112 @@
 #ifdef VK_NV_device_generated_commands
 void transform_tohost_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* toTransform)
-{
+    VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* toTransform)
-{
+    VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* toTransform)
-{
+    VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* toTransform)
-{
+    VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkGraphicsShaderGroupCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkGraphicsShaderGroupCreateInfoNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkGraphicsShaderGroupCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pStages)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->stageCount; ++i)
-            {
-                transform_tohost_VkPipelineShaderStageCreateInfo(resourceTracker, (VkPipelineShaderStageCreateInfo*)(toTransform->pStages + i));
+    if (toTransform) {
+        if (toTransform->pStages) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->stageCount; ++i) {
+                transform_tohost_VkPipelineShaderStageCreateInfo(
+                    resourceTracker, (VkPipelineShaderStageCreateInfo*)(toTransform->pStages + i));
             }
         }
     }
-    if (toTransform->pVertexInputState)
-    {
-        transform_tohost_VkPipelineVertexInputStateCreateInfo(resourceTracker, (VkPipelineVertexInputStateCreateInfo*)(toTransform->pVertexInputState));
+    if (toTransform->pVertexInputState) {
+        transform_tohost_VkPipelineVertexInputStateCreateInfo(
+            resourceTracker,
+            (VkPipelineVertexInputStateCreateInfo*)(toTransform->pVertexInputState));
     }
-    if (toTransform->pTessellationState)
-    {
-        transform_tohost_VkPipelineTessellationStateCreateInfo(resourceTracker, (VkPipelineTessellationStateCreateInfo*)(toTransform->pTessellationState));
+    if (toTransform->pTessellationState) {
+        transform_tohost_VkPipelineTessellationStateCreateInfo(
+            resourceTracker,
+            (VkPipelineTessellationStateCreateInfo*)(toTransform->pTessellationState));
     }
 }
 
 void transform_fromhost_VkGraphicsShaderGroupCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkGraphicsShaderGroupCreateInfoNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkGraphicsShaderGroupCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pStages)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->stageCount; ++i)
-            {
-                transform_fromhost_VkPipelineShaderStageCreateInfo(resourceTracker, (VkPipelineShaderStageCreateInfo*)(toTransform->pStages + i));
+    if (toTransform) {
+        if (toTransform->pStages) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->stageCount; ++i) {
+                transform_fromhost_VkPipelineShaderStageCreateInfo(
+                    resourceTracker, (VkPipelineShaderStageCreateInfo*)(toTransform->pStages + i));
             }
         }
     }
-    if (toTransform->pVertexInputState)
-    {
-        transform_fromhost_VkPipelineVertexInputStateCreateInfo(resourceTracker, (VkPipelineVertexInputStateCreateInfo*)(toTransform->pVertexInputState));
+    if (toTransform->pVertexInputState) {
+        transform_fromhost_VkPipelineVertexInputStateCreateInfo(
+            resourceTracker,
+            (VkPipelineVertexInputStateCreateInfo*)(toTransform->pVertexInputState));
     }
-    if (toTransform->pTessellationState)
-    {
-        transform_fromhost_VkPipelineTessellationStateCreateInfo(resourceTracker, (VkPipelineTessellationStateCreateInfo*)(toTransform->pTessellationState));
+    if (toTransform->pTessellationState) {
+        transform_fromhost_VkPipelineTessellationStateCreateInfo(
+            resourceTracker,
+            (VkPipelineTessellationStateCreateInfo*)(toTransform->pTessellationState));
     }
 }
 
 void transform_tohost_VkGraphicsPipelineShaderGroupsCreateInfoNV(
     VkDecoderGlobalState* resourceTracker,
-    VkGraphicsPipelineShaderGroupsCreateInfoNV* toTransform)
-{
+    VkGraphicsPipelineShaderGroupsCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pGroups)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->groupCount; ++i)
-            {
-                transform_tohost_VkGraphicsShaderGroupCreateInfoNV(resourceTracker, (VkGraphicsShaderGroupCreateInfoNV*)(toTransform->pGroups + i));
+    if (toTransform) {
+        if (toTransform->pGroups) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->groupCount; ++i) {
+                transform_tohost_VkGraphicsShaderGroupCreateInfoNV(
+                    resourceTracker,
+                    (VkGraphicsShaderGroupCreateInfoNV*)(toTransform->pGroups + i));
             }
         }
     }
@@ -16914,213 +13703,164 @@
 
 void transform_fromhost_VkGraphicsPipelineShaderGroupsCreateInfoNV(
     VkDecoderGlobalState* resourceTracker,
-    VkGraphicsPipelineShaderGroupsCreateInfoNV* toTransform)
-{
+    VkGraphicsPipelineShaderGroupsCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pGroups)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->groupCount; ++i)
-            {
-                transform_fromhost_VkGraphicsShaderGroupCreateInfoNV(resourceTracker, (VkGraphicsShaderGroupCreateInfoNV*)(toTransform->pGroups + i));
+    if (toTransform) {
+        if (toTransform->pGroups) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->groupCount; ++i) {
+                transform_fromhost_VkGraphicsShaderGroupCreateInfoNV(
+                    resourceTracker,
+                    (VkGraphicsShaderGroupCreateInfoNV*)(toTransform->pGroups + i));
             }
         }
     }
 }
 
 void transform_tohost_VkBindShaderGroupIndirectCommandNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindShaderGroupIndirectCommandNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkBindShaderGroupIndirectCommandNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_fromhost_VkBindShaderGroupIndirectCommandNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindShaderGroupIndirectCommandNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkBindShaderGroupIndirectCommandNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_tohost_VkBindIndexBufferIndirectCommandNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindIndexBufferIndirectCommandNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkBindIndexBufferIndirectCommandNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_fromhost_VkBindIndexBufferIndirectCommandNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindIndexBufferIndirectCommandNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkBindIndexBufferIndirectCommandNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_tohost_VkBindVertexBufferIndirectCommandNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindVertexBufferIndirectCommandNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkBindVertexBufferIndirectCommandNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_fromhost_VkBindVertexBufferIndirectCommandNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindVertexBufferIndirectCommandNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkBindVertexBufferIndirectCommandNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_tohost_VkSetStateFlagsIndirectCommandNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkSetStateFlagsIndirectCommandNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkSetStateFlagsIndirectCommandNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_fromhost_VkSetStateFlagsIndirectCommandNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkSetStateFlagsIndirectCommandNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkSetStateFlagsIndirectCommandNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkIndirectCommandsStreamNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkIndirectCommandsStreamNV* toTransform)
-{
+void transform_tohost_VkIndirectCommandsStreamNV(VkDecoderGlobalState* resourceTracker,
+                                                 VkIndirectCommandsStreamNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkIndirectCommandsStreamNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkIndirectCommandsStreamNV* toTransform)
-{
+void transform_fromhost_VkIndirectCommandsStreamNV(VkDecoderGlobalState* resourceTracker,
+                                                   VkIndirectCommandsStreamNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_tohost_VkIndirectCommandsLayoutTokenNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkIndirectCommandsLayoutTokenNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkIndirectCommandsLayoutTokenNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkIndirectCommandsLayoutTokenNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkIndirectCommandsLayoutTokenNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkIndirectCommandsLayoutTokenNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkIndirectCommandsLayoutCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkIndirectCommandsLayoutCreateInfoNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkIndirectCommandsLayoutCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pTokens)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->tokenCount; ++i)
-            {
-                transform_tohost_VkIndirectCommandsLayoutTokenNV(resourceTracker, (VkIndirectCommandsLayoutTokenNV*)(toTransform->pTokens + i));
+    if (toTransform) {
+        if (toTransform->pTokens) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->tokenCount; ++i) {
+                transform_tohost_VkIndirectCommandsLayoutTokenNV(
+                    resourceTracker, (VkIndirectCommandsLayoutTokenNV*)(toTransform->pTokens + i));
             }
         }
     }
 }
 
 void transform_fromhost_VkIndirectCommandsLayoutCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkIndirectCommandsLayoutCreateInfoNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkIndirectCommandsLayoutCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pTokens)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->tokenCount; ++i)
-            {
-                transform_fromhost_VkIndirectCommandsLayoutTokenNV(resourceTracker, (VkIndirectCommandsLayoutTokenNV*)(toTransform->pTokens + i));
+    if (toTransform) {
+        if (toTransform->pTokens) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->tokenCount; ++i) {
+                transform_fromhost_VkIndirectCommandsLayoutTokenNV(
+                    resourceTracker, (VkIndirectCommandsLayoutTokenNV*)(toTransform->pTokens + i));
             }
         }
     }
 }
 
-void transform_tohost_VkGeneratedCommandsInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkGeneratedCommandsInfoNV* toTransform)
-{
+void transform_tohost_VkGeneratedCommandsInfoNV(VkDecoderGlobalState* resourceTracker,
+                                                VkGeneratedCommandsInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pStreams)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->streamCount; ++i)
-            {
-                transform_tohost_VkIndirectCommandsStreamNV(resourceTracker, (VkIndirectCommandsStreamNV*)(toTransform->pStreams + i));
+    if (toTransform) {
+        if (toTransform->pStreams) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->streamCount; ++i) {
+                transform_tohost_VkIndirectCommandsStreamNV(
+                    resourceTracker, (VkIndirectCommandsStreamNV*)(toTransform->pStreams + i));
             }
         }
     }
 }
 
-void transform_fromhost_VkGeneratedCommandsInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkGeneratedCommandsInfoNV* toTransform)
-{
+void transform_fromhost_VkGeneratedCommandsInfoNV(VkDecoderGlobalState* resourceTracker,
+                                                  VkGeneratedCommandsInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pStreams)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->streamCount; ++i)
-            {
-                transform_fromhost_VkIndirectCommandsStreamNV(resourceTracker, (VkIndirectCommandsStreamNV*)(toTransform->pStreams + i));
+    if (toTransform) {
+        if (toTransform->pStreams) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->streamCount; ++i) {
+                transform_fromhost_VkIndirectCommandsStreamNV(
+                    resourceTracker, (VkIndirectCommandsStreamNV*)(toTransform->pStreams + i));
             }
         }
     }
@@ -17128,24 +13868,20 @@
 
 void transform_tohost_VkGeneratedCommandsMemoryRequirementsInfoNV(
     VkDecoderGlobalState* resourceTracker,
-    VkGeneratedCommandsMemoryRequirementsInfoNV* toTransform)
-{
+    VkGeneratedCommandsMemoryRequirementsInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkGeneratedCommandsMemoryRequirementsInfoNV(
     VkDecoderGlobalState* resourceTracker,
-    VkGeneratedCommandsMemoryRequirementsInfoNV* toTransform)
-{
+    VkGeneratedCommandsMemoryRequirementsInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -17154,56 +13890,46 @@
 #ifdef VK_NV_inherited_viewport_scissor
 void transform_tohost_VkPhysicalDeviceInheritedViewportScissorFeaturesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceInheritedViewportScissorFeaturesNV* toTransform)
-{
+    VkPhysicalDeviceInheritedViewportScissorFeaturesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceInheritedViewportScissorFeaturesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceInheritedViewportScissorFeaturesNV* toTransform)
-{
+    VkPhysicalDeviceInheritedViewportScissorFeaturesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkCommandBufferInheritanceViewportScissorInfoNV(
     VkDecoderGlobalState* resourceTracker,
-    VkCommandBufferInheritanceViewportScissorInfoNV* toTransform)
-{
+    VkCommandBufferInheritanceViewportScissorInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pViewportDepths)
-    {
+    if (toTransform->pViewportDepths) {
         transform_tohost_VkViewport(resourceTracker, (VkViewport*)(toTransform->pViewportDepths));
     }
 }
 
 void transform_fromhost_VkCommandBufferInheritanceViewportScissorInfoNV(
     VkDecoderGlobalState* resourceTracker,
-    VkCommandBufferInheritanceViewportScissorInfoNV* toTransform)
-{
+    VkCommandBufferInheritanceViewportScissorInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform->pViewportDepths)
-    {
+    if (toTransform->pViewportDepths) {
         transform_fromhost_VkViewport(resourceTracker, (VkViewport*)(toTransform->pViewportDepths));
     }
 }
@@ -17212,48 +13938,40 @@
 #ifdef VK_EXT_texel_buffer_alignment
 void transform_tohost_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* toTransform)
-{
+    VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* toTransform)
-{
+    VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -17261,37 +13979,29 @@
 #endif
 #ifdef VK_QCOM_render_pass_transform
 void transform_tohost_VkRenderPassTransformBeginInfoQCOM(
-    VkDecoderGlobalState* resourceTracker,
-    VkRenderPassTransformBeginInfoQCOM* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkRenderPassTransformBeginInfoQCOM* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkRenderPassTransformBeginInfoQCOM(
-    VkDecoderGlobalState* resourceTracker,
-    VkRenderPassTransformBeginInfoQCOM* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkRenderPassTransformBeginInfoQCOM* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(
     VkDecoderGlobalState* resourceTracker,
-    VkCommandBufferInheritanceRenderPassTransformInfoQCOM* toTransform)
-{
+    VkCommandBufferInheritanceRenderPassTransformInfoQCOM* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
     transform_tohost_VkRect2D(resourceTracker, (VkRect2D*)(&toTransform->renderArea));
@@ -17299,12 +14009,10 @@
 
 void transform_fromhost_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(
     VkDecoderGlobalState* resourceTracker,
-    VkCommandBufferInheritanceRenderPassTransformInfoQCOM* toTransform)
-{
+    VkCommandBufferInheritanceRenderPassTransformInfoQCOM* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
     transform_fromhost_VkRect2D(resourceTracker, (VkRect2D*)(&toTransform->renderArea));
@@ -17314,72 +14022,56 @@
 #ifdef VK_EXT_device_memory_report
 void transform_tohost_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkDeviceMemoryReportCallbackDataEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceMemoryReportCallbackDataEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDeviceMemoryReportCallbackDataEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkDeviceMemoryReportCallbackDataEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceMemoryReportCallbackDataEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDeviceMemoryReportCallbackDataEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkDeviceDeviceMemoryReportCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceDeviceMemoryReportCreateInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDeviceDeviceMemoryReportCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkDeviceDeviceMemoryReportCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceDeviceMemoryReportCreateInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDeviceDeviceMemoryReportCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -17389,49 +14081,37 @@
 #endif
 #ifdef VK_EXT_robustness2
 void transform_tohost_VkPhysicalDeviceRobustness2FeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceRobustness2FeaturesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceRobustness2FeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceRobustness2FeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceRobustness2FeaturesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceRobustness2FeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceRobustness2PropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceRobustness2PropertiesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceRobustness2PropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceRobustness2PropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceRobustness2PropertiesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceRobustness2PropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -17439,75 +14119,63 @@
 #endif
 #ifdef VK_EXT_custom_border_color
 void transform_tohost_VkSamplerCustomBorderColorCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkSamplerCustomBorderColorCreateInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkSamplerCustomBorderColorCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkClearColorValue(resourceTracker, (VkClearColorValue*)(&toTransform->customBorderColor));
+    transform_tohost_VkClearColorValue(resourceTracker,
+                                       (VkClearColorValue*)(&toTransform->customBorderColor));
 }
 
 void transform_fromhost_VkSamplerCustomBorderColorCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkSamplerCustomBorderColorCreateInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkSamplerCustomBorderColorCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkClearColorValue(resourceTracker, (VkClearColorValue*)(&toTransform->customBorderColor));
+    transform_fromhost_VkClearColorValue(resourceTracker,
+                                         (VkClearColorValue*)(&toTransform->customBorderColor));
 }
 
 void transform_tohost_VkPhysicalDeviceCustomBorderColorPropertiesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceCustomBorderColorPropertiesEXT* toTransform)
-{
+    VkPhysicalDeviceCustomBorderColorPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceCustomBorderColorPropertiesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceCustomBorderColorPropertiesEXT* toTransform)
-{
+    VkPhysicalDeviceCustomBorderColorPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceCustomBorderColorFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceCustomBorderColorFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceCustomBorderColorFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceCustomBorderColorFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceCustomBorderColorFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceCustomBorderColorFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -17517,73 +14185,55 @@
 #endif
 #ifdef VK_EXT_private_data
 void transform_tohost_VkPhysicalDevicePrivateDataFeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePrivateDataFeaturesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDevicePrivateDataFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDevicePrivateDataFeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePrivateDataFeaturesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDevicePrivateDataFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkDevicePrivateDataCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDevicePrivateDataCreateInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDevicePrivateDataCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkDevicePrivateDataCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDevicePrivateDataCreateInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDevicePrivateDataCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkPrivateDataSlotCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPrivateDataSlotCreateInfoEXT* toTransform)
-{
+void transform_tohost_VkPrivateDataSlotCreateInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                     VkPrivateDataSlotCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPrivateDataSlotCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPrivateDataSlotCreateInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPrivateDataSlotCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -17592,24 +14242,20 @@
 #ifdef VK_EXT_pipeline_creation_cache_control
 void transform_tohost_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* toTransform)
-{
+    VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* toTransform)
-{
+    VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -17618,48 +14264,38 @@
 #ifdef VK_NV_device_diagnostics_config
 void transform_tohost_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceDiagnosticsConfigFeaturesNV* toTransform)
-{
+    VkPhysicalDeviceDiagnosticsConfigFeaturesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceDiagnosticsConfigFeaturesNV* toTransform)
-{
+    VkPhysicalDeviceDiagnosticsConfigFeaturesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkDeviceDiagnosticsConfigCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceDiagnosticsConfigCreateInfoNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDeviceDiagnosticsConfigCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkDeviceDiagnosticsConfigCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceDiagnosticsConfigCreateInfoNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDeviceDiagnosticsConfigCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -17670,184 +14306,156 @@
 #ifdef VK_NV_fragment_shading_rate_enums
 void transform_tohost_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* toTransform)
-{
+    VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* toTransform)
-{
+    VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* toTransform)
-{
+    VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* toTransform)
-{
+    VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineFragmentShadingRateEnumStateCreateInfoNV* toTransform)
-{
+    VkPipelineFragmentShadingRateEnumStateCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPipelineFragmentShadingRateEnumStateCreateInfoNV* toTransform)
-{
+    VkPipelineFragmentShadingRateEnumStateCreateInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_NV_ray_tracing_motion_blur
-void transform_tohost_VkDeviceOrHostAddressConstKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceOrHostAddressConstKHR* toTransform)
-{
+void transform_tohost_VkDeviceOrHostAddressConstKHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkDeviceOrHostAddressConstKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkDeviceOrHostAddressConstKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceOrHostAddressConstKHR* toTransform)
-{
+void transform_fromhost_VkDeviceOrHostAddressConstKHR(VkDecoderGlobalState* resourceTracker,
+                                                      VkDeviceOrHostAddressConstKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_tohost_VkAccelerationStructureGeometryMotionTrianglesDataNV(
     VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureGeometryMotionTrianglesDataNV* toTransform)
-{
+    VkAccelerationStructureGeometryMotionTrianglesDataNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkDeviceOrHostAddressConstKHR(resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->vertexData));
+    transform_tohost_VkDeviceOrHostAddressConstKHR(
+        resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->vertexData));
 }
 
 void transform_fromhost_VkAccelerationStructureGeometryMotionTrianglesDataNV(
     VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureGeometryMotionTrianglesDataNV* toTransform)
-{
+    VkAccelerationStructureGeometryMotionTrianglesDataNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkDeviceOrHostAddressConstKHR(resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->vertexData));
+    transform_fromhost_VkDeviceOrHostAddressConstKHR(
+        resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->vertexData));
 }
 
 void transform_tohost_VkAccelerationStructureMotionInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureMotionInfoNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureMotionInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkAccelerationStructureMotionInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureMotionInfoNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureMotionInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkAccelerationStructureMatrixMotionInstanceNV(
     VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureMatrixMotionInstanceNV* toTransform)
-{
+    VkAccelerationStructureMatrixMotionInstanceNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_tohost_VkTransformMatrixKHR(resourceTracker, (VkTransformMatrixKHR*)(&toTransform->transformT0));
-    transform_tohost_VkTransformMatrixKHR(resourceTracker, (VkTransformMatrixKHR*)(&toTransform->transformT1));
+    transform_tohost_VkTransformMatrixKHR(resourceTracker,
+                                          (VkTransformMatrixKHR*)(&toTransform->transformT0));
+    transform_tohost_VkTransformMatrixKHR(resourceTracker,
+                                          (VkTransformMatrixKHR*)(&toTransform->transformT1));
 }
 
 void transform_fromhost_VkAccelerationStructureMatrixMotionInstanceNV(
     VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureMatrixMotionInstanceNV* toTransform)
-{
+    VkAccelerationStructureMatrixMotionInstanceNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_fromhost_VkTransformMatrixKHR(resourceTracker, (VkTransformMatrixKHR*)(&toTransform->transformT0));
-    transform_fromhost_VkTransformMatrixKHR(resourceTracker, (VkTransformMatrixKHR*)(&toTransform->transformT1));
+    transform_fromhost_VkTransformMatrixKHR(resourceTracker,
+                                            (VkTransformMatrixKHR*)(&toTransform->transformT0));
+    transform_fromhost_VkTransformMatrixKHR(resourceTracker,
+                                            (VkTransformMatrixKHR*)(&toTransform->transformT1));
 }
 
-void transform_tohost_VkSRTDataNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkSRTDataNV* toTransform)
-{
+void transform_tohost_VkSRTDataNV(VkDecoderGlobalState* resourceTracker, VkSRTDataNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkSRTDataNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkSRTDataNV* toTransform)
-{
+void transform_fromhost_VkSRTDataNV(VkDecoderGlobalState* resourceTracker,
+                                    VkSRTDataNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_tohost_VkAccelerationStructureSRTMotionInstanceNV(
     VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureSRTMotionInstanceNV* toTransform)
-{
+    VkAccelerationStructureSRTMotionInstanceNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
     transform_tohost_VkSRTDataNV(resourceTracker, (VkSRTDataNV*)(&toTransform->transformT0));
@@ -17856,8 +14464,7 @@
 
 void transform_fromhost_VkAccelerationStructureSRTMotionInstanceNV(
     VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureSRTMotionInstanceNV* toTransform)
-{
+    VkAccelerationStructureSRTMotionInstanceNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
     transform_fromhost_VkSRTDataNV(resourceTracker, (VkSRTDataNV*)(&toTransform->transformT0));
@@ -17866,64 +14473,66 @@
 
 void transform_tohost_VkAccelerationStructureMotionInstanceDataNV(
     VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureMotionInstanceDataNV* toTransform)
-{
+    VkAccelerationStructureMotionInstanceDataNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_tohost_VkAccelerationStructureInstanceKHR(resourceTracker, (VkAccelerationStructureInstanceKHR*)(&toTransform->staticInstance));
-    transform_tohost_VkAccelerationStructureMatrixMotionInstanceNV(resourceTracker, (VkAccelerationStructureMatrixMotionInstanceNV*)(&toTransform->matrixMotionInstance));
-    transform_tohost_VkAccelerationStructureSRTMotionInstanceNV(resourceTracker, (VkAccelerationStructureSRTMotionInstanceNV*)(&toTransform->srtMotionInstance));
+    transform_tohost_VkAccelerationStructureInstanceKHR(
+        resourceTracker, (VkAccelerationStructureInstanceKHR*)(&toTransform->staticInstance));
+    transform_tohost_VkAccelerationStructureMatrixMotionInstanceNV(
+        resourceTracker,
+        (VkAccelerationStructureMatrixMotionInstanceNV*)(&toTransform->matrixMotionInstance));
+    transform_tohost_VkAccelerationStructureSRTMotionInstanceNV(
+        resourceTracker,
+        (VkAccelerationStructureSRTMotionInstanceNV*)(&toTransform->srtMotionInstance));
 }
 
 void transform_fromhost_VkAccelerationStructureMotionInstanceDataNV(
     VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureMotionInstanceDataNV* toTransform)
-{
+    VkAccelerationStructureMotionInstanceDataNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_fromhost_VkAccelerationStructureInstanceKHR(resourceTracker, (VkAccelerationStructureInstanceKHR*)(&toTransform->staticInstance));
-    transform_fromhost_VkAccelerationStructureMatrixMotionInstanceNV(resourceTracker, (VkAccelerationStructureMatrixMotionInstanceNV*)(&toTransform->matrixMotionInstance));
-    transform_fromhost_VkAccelerationStructureSRTMotionInstanceNV(resourceTracker, (VkAccelerationStructureSRTMotionInstanceNV*)(&toTransform->srtMotionInstance));
+    transform_fromhost_VkAccelerationStructureInstanceKHR(
+        resourceTracker, (VkAccelerationStructureInstanceKHR*)(&toTransform->staticInstance));
+    transform_fromhost_VkAccelerationStructureMatrixMotionInstanceNV(
+        resourceTracker,
+        (VkAccelerationStructureMatrixMotionInstanceNV*)(&toTransform->matrixMotionInstance));
+    transform_fromhost_VkAccelerationStructureSRTMotionInstanceNV(
+        resourceTracker,
+        (VkAccelerationStructureSRTMotionInstanceNV*)(&toTransform->srtMotionInstance));
 }
 
 void transform_tohost_VkAccelerationStructureMotionInstanceNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureMotionInstanceNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureMotionInstanceNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_tohost_VkAccelerationStructureMotionInstanceDataNV(resourceTracker, (VkAccelerationStructureMotionInstanceDataNV*)(&toTransform->data));
+    transform_tohost_VkAccelerationStructureMotionInstanceDataNV(
+        resourceTracker, (VkAccelerationStructureMotionInstanceDataNV*)(&toTransform->data));
 }
 
 void transform_fromhost_VkAccelerationStructureMotionInstanceNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureMotionInstanceNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureMotionInstanceNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_fromhost_VkAccelerationStructureMotionInstanceDataNV(resourceTracker, (VkAccelerationStructureMotionInstanceDataNV*)(&toTransform->data));
+    transform_fromhost_VkAccelerationStructureMotionInstanceDataNV(
+        resourceTracker, (VkAccelerationStructureMotionInstanceDataNV*)(&toTransform->data));
 }
 
 void transform_tohost_VkPhysicalDeviceRayTracingMotionBlurFeaturesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceRayTracingMotionBlurFeaturesNV* toTransform)
-{
+    VkPhysicalDeviceRayTracingMotionBlurFeaturesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceRayTracingMotionBlurFeaturesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceRayTracingMotionBlurFeaturesNV* toTransform)
-{
+    VkPhysicalDeviceRayTracingMotionBlurFeaturesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -17932,24 +14541,20 @@
 #ifdef VK_EXT_ycbcr_2plane_444_formats
 void transform_tohost_VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -17958,74 +14563,60 @@
 #ifdef VK_EXT_fragment_density_map2
 void transform_tohost_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* toTransform)
-{
+    VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* toTransform)
-{
+    VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_QCOM_rotated_copy_commands
-void transform_tohost_VkCopyCommandTransformInfoQCOM(
-    VkDecoderGlobalState* resourceTracker,
-    VkCopyCommandTransformInfoQCOM* toTransform)
-{
+void transform_tohost_VkCopyCommandTransformInfoQCOM(VkDecoderGlobalState* resourceTracker,
+                                                     VkCopyCommandTransformInfoQCOM* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkCopyCommandTransformInfoQCOM(
-    VkDecoderGlobalState* resourceTracker,
-    VkCopyCommandTransformInfoQCOM* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkCopyCommandTransformInfoQCOM* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -18034,24 +14625,20 @@
 #ifdef VK_EXT_image_robustness
 void transform_tohost_VkPhysicalDeviceImageRobustnessFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceImageRobustnessFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceImageRobustnessFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceImageRobustnessFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceImageRobustnessFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceImageRobustnessFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -18059,25 +14646,19 @@
 #endif
 #ifdef VK_EXT_4444_formats
 void transform_tohost_VkPhysicalDevice4444FormatsFeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevice4444FormatsFeaturesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDevice4444FormatsFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDevice4444FormatsFeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevice4444FormatsFeaturesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDevice4444FormatsFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -18086,24 +14667,20 @@
 #ifdef VK_EXT_rgba10x6_formats
 void transform_tohost_VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -18112,26 +14689,20 @@
 #ifdef VK_NV_acquire_winrt_display
 #endif
 #ifdef VK_EXT_directfb_surface
-void transform_tohost_VkDirectFBSurfaceCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDirectFBSurfaceCreateInfoEXT* toTransform)
-{
+void transform_tohost_VkDirectFBSurfaceCreateInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                     VkDirectFBSurfaceCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkDirectFBSurfaceCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDirectFBSurfaceCreateInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkDirectFBSurfaceCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -18140,83 +14711,69 @@
 #ifdef VK_VALVE_mutable_descriptor_type
 void transform_tohost_VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE* toTransform)
-{
+    VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE* toTransform)
-{
+    VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkMutableDescriptorTypeListVALVE(
-    VkDecoderGlobalState* resourceTracker,
-    VkMutableDescriptorTypeListVALVE* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkMutableDescriptorTypeListVALVE* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_fromhost_VkMutableDescriptorTypeListVALVE(
-    VkDecoderGlobalState* resourceTracker,
-    VkMutableDescriptorTypeListVALVE* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkMutableDescriptorTypeListVALVE* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_tohost_VkMutableDescriptorTypeCreateInfoVALVE(
-    VkDecoderGlobalState* resourceTracker,
-    VkMutableDescriptorTypeCreateInfoVALVE* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkMutableDescriptorTypeCreateInfoVALVE* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pMutableDescriptorTypeLists)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->mutableDescriptorTypeListCount; ++i)
-            {
-                transform_tohost_VkMutableDescriptorTypeListVALVE(resourceTracker, (VkMutableDescriptorTypeListVALVE*)(toTransform->pMutableDescriptorTypeLists + i));
+    if (toTransform) {
+        if (toTransform->pMutableDescriptorTypeLists) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->mutableDescriptorTypeListCount; ++i) {
+                transform_tohost_VkMutableDescriptorTypeListVALVE(
+                    resourceTracker,
+                    (VkMutableDescriptorTypeListVALVE*)(toTransform->pMutableDescriptorTypeLists +
+                                                        i));
             }
         }
     }
 }
 
 void transform_fromhost_VkMutableDescriptorTypeCreateInfoVALVE(
-    VkDecoderGlobalState* resourceTracker,
-    VkMutableDescriptorTypeCreateInfoVALVE* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkMutableDescriptorTypeCreateInfoVALVE* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pMutableDescriptorTypeLists)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->mutableDescriptorTypeListCount; ++i)
-            {
-                transform_fromhost_VkMutableDescriptorTypeListVALVE(resourceTracker, (VkMutableDescriptorTypeListVALVE*)(toTransform->pMutableDescriptorTypeLists + i));
+    if (toTransform) {
+        if (toTransform->pMutableDescriptorTypeLists) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->mutableDescriptorTypeListCount; ++i) {
+                transform_fromhost_VkMutableDescriptorTypeListVALVE(
+                    resourceTracker,
+                    (VkMutableDescriptorTypeListVALVE*)(toTransform->pMutableDescriptorTypeLists +
+                                                        i));
             }
         }
     }
@@ -18226,72 +14783,56 @@
 #ifdef VK_EXT_vertex_input_dynamic_state
 void transform_tohost_VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkVertexInputBindingDescription2EXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVertexInputBindingDescription2EXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVertexInputBindingDescription2EXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkVertexInputBindingDescription2EXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVertexInputBindingDescription2EXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVertexInputBindingDescription2EXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkVertexInputAttributeDescription2EXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVertexInputAttributeDescription2EXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVertexInputAttributeDescription2EXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkVertexInputAttributeDescription2EXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVertexInputAttributeDescription2EXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkVertexInputAttributeDescription2EXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -18299,25 +14840,19 @@
 #endif
 #ifdef VK_EXT_physical_device_drm
 void transform_tohost_VkPhysicalDeviceDrmPropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceDrmPropertiesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceDrmPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceDrmPropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceDrmPropertiesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceDrmPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -18326,24 +14861,20 @@
 #ifdef VK_EXT_primitive_topology_list_restart
 void transform_tohost_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT* toTransform)
-{
+    VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT* toTransform)
-{
+    VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -18351,73 +14882,55 @@
 #endif
 #ifdef VK_FUCHSIA_external_memory
 void transform_tohost_VkImportMemoryZirconHandleInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportMemoryZirconHandleInfoFUCHSIA* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkImportMemoryZirconHandleInfoFUCHSIA* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkImportMemoryZirconHandleInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportMemoryZirconHandleInfoFUCHSIA* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkImportMemoryZirconHandleInfoFUCHSIA* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkMemoryZirconHandlePropertiesFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryZirconHandlePropertiesFUCHSIA* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkMemoryZirconHandlePropertiesFUCHSIA* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkMemoryZirconHandlePropertiesFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryZirconHandlePropertiesFUCHSIA* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkMemoryZirconHandlePropertiesFUCHSIA* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkMemoryGetZirconHandleInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryGetZirconHandleInfoFUCHSIA* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkMemoryGetZirconHandleInfoFUCHSIA* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkMemoryGetZirconHandleInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryGetZirconHandleInfoFUCHSIA* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkMemoryGetZirconHandleInfoFUCHSIA* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -18425,49 +14938,37 @@
 #endif
 #ifdef VK_FUCHSIA_external_semaphore
 void transform_tohost_VkImportSemaphoreZirconHandleInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportSemaphoreZirconHandleInfoFUCHSIA* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkImportSemaphoreZirconHandleInfoFUCHSIA* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkImportSemaphoreZirconHandleInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportSemaphoreZirconHandleInfoFUCHSIA* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkImportSemaphoreZirconHandleInfoFUCHSIA* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkSemaphoreGetZirconHandleInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkSemaphoreGetZirconHandleInfoFUCHSIA* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkSemaphoreGetZirconHandleInfoFUCHSIA* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkSemaphoreGetZirconHandleInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkSemaphoreGetZirconHandleInfoFUCHSIA* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkSemaphoreGetZirconHandleInfoFUCHSIA* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -18475,357 +14976,297 @@
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
 void transform_tohost_VkBufferCollectionCreateInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferCollectionCreateInfoFUCHSIA* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkBufferCollectionCreateInfoFUCHSIA* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkBufferCollectionCreateInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferCollectionCreateInfoFUCHSIA* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkBufferCollectionCreateInfoFUCHSIA* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkImportMemoryBufferCollectionFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportMemoryBufferCollectionFUCHSIA* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkImportMemoryBufferCollectionFUCHSIA* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkImportMemoryBufferCollectionFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportMemoryBufferCollectionFUCHSIA* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkImportMemoryBufferCollectionFUCHSIA* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkBufferCollectionImageCreateInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferCollectionImageCreateInfoFUCHSIA* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkBufferCollectionImageCreateInfoFUCHSIA* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkBufferCollectionImageCreateInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferCollectionImageCreateInfoFUCHSIA* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkBufferCollectionImageCreateInfoFUCHSIA* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkBufferCollectionConstraintsInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferCollectionConstraintsInfoFUCHSIA* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkBufferCollectionConstraintsInfoFUCHSIA* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkBufferCollectionConstraintsInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferCollectionConstraintsInfoFUCHSIA* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkBufferCollectionConstraintsInfoFUCHSIA* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkBufferConstraintsInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferConstraintsInfoFUCHSIA* toTransform)
-{
+void transform_tohost_VkBufferConstraintsInfoFUCHSIA(VkDecoderGlobalState* resourceTracker,
+                                                     VkBufferConstraintsInfoFUCHSIA* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkBufferCreateInfo(resourceTracker, (VkBufferCreateInfo*)(&toTransform->createInfo));
-    transform_tohost_VkBufferCollectionConstraintsInfoFUCHSIA(resourceTracker, (VkBufferCollectionConstraintsInfoFUCHSIA*)(&toTransform->bufferCollectionConstraints));
+    transform_tohost_VkBufferCreateInfo(resourceTracker,
+                                        (VkBufferCreateInfo*)(&toTransform->createInfo));
+    transform_tohost_VkBufferCollectionConstraintsInfoFUCHSIA(
+        resourceTracker,
+        (VkBufferCollectionConstraintsInfoFUCHSIA*)(&toTransform->bufferCollectionConstraints));
 }
 
 void transform_fromhost_VkBufferConstraintsInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferConstraintsInfoFUCHSIA* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkBufferConstraintsInfoFUCHSIA* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkBufferCreateInfo(resourceTracker, (VkBufferCreateInfo*)(&toTransform->createInfo));
-    transform_fromhost_VkBufferCollectionConstraintsInfoFUCHSIA(resourceTracker, (VkBufferCollectionConstraintsInfoFUCHSIA*)(&toTransform->bufferCollectionConstraints));
+    transform_fromhost_VkBufferCreateInfo(resourceTracker,
+                                          (VkBufferCreateInfo*)(&toTransform->createInfo));
+    transform_fromhost_VkBufferCollectionConstraintsInfoFUCHSIA(
+        resourceTracker,
+        (VkBufferCollectionConstraintsInfoFUCHSIA*)(&toTransform->bufferCollectionConstraints));
 }
 
 void transform_tohost_VkBufferCollectionBufferCreateInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferCollectionBufferCreateInfoFUCHSIA* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkBufferCollectionBufferCreateInfoFUCHSIA* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkBufferCollectionBufferCreateInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferCollectionBufferCreateInfoFUCHSIA* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkBufferCollectionBufferCreateInfoFUCHSIA* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkSysmemColorSpaceFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkSysmemColorSpaceFUCHSIA* toTransform)
-{
+void transform_tohost_VkSysmemColorSpaceFUCHSIA(VkDecoderGlobalState* resourceTracker,
+                                                VkSysmemColorSpaceFUCHSIA* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkSysmemColorSpaceFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkSysmemColorSpaceFUCHSIA* toTransform)
-{
+void transform_fromhost_VkSysmemColorSpaceFUCHSIA(VkDecoderGlobalState* resourceTracker,
+                                                  VkSysmemColorSpaceFUCHSIA* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkBufferCollectionPropertiesFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferCollectionPropertiesFUCHSIA* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkBufferCollectionPropertiesFUCHSIA* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkSysmemColorSpaceFUCHSIA(resourceTracker, (VkSysmemColorSpaceFUCHSIA*)(&toTransform->sysmemColorSpaceIndex));
-    transform_tohost_VkComponentMapping(resourceTracker, (VkComponentMapping*)(&toTransform->samplerYcbcrConversionComponents));
+    transform_tohost_VkSysmemColorSpaceFUCHSIA(
+        resourceTracker, (VkSysmemColorSpaceFUCHSIA*)(&toTransform->sysmemColorSpaceIndex));
+    transform_tohost_VkComponentMapping(
+        resourceTracker, (VkComponentMapping*)(&toTransform->samplerYcbcrConversionComponents));
 }
 
 void transform_fromhost_VkBufferCollectionPropertiesFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferCollectionPropertiesFUCHSIA* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkBufferCollectionPropertiesFUCHSIA* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkSysmemColorSpaceFUCHSIA(resourceTracker, (VkSysmemColorSpaceFUCHSIA*)(&toTransform->sysmemColorSpaceIndex));
-    transform_fromhost_VkComponentMapping(resourceTracker, (VkComponentMapping*)(&toTransform->samplerYcbcrConversionComponents));
+    transform_fromhost_VkSysmemColorSpaceFUCHSIA(
+        resourceTracker, (VkSysmemColorSpaceFUCHSIA*)(&toTransform->sysmemColorSpaceIndex));
+    transform_fromhost_VkComponentMapping(
+        resourceTracker, (VkComponentMapping*)(&toTransform->samplerYcbcrConversionComponents));
 }
 
 void transform_tohost_VkImageFormatConstraintsInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageFormatConstraintsInfoFUCHSIA* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkImageFormatConstraintsInfoFUCHSIA* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
     resourceTracker->transformImpl_VkImageCreateInfo_tohost(&toTransform->imageCreateInfo, 1);
-    transform_tohost_VkImageCreateInfo(resourceTracker, (VkImageCreateInfo*)(&toTransform->imageCreateInfo));
-    if (toTransform->pColorSpaces)
-    {
-        transform_tohost_VkSysmemColorSpaceFUCHSIA(resourceTracker, (VkSysmemColorSpaceFUCHSIA*)(toTransform->pColorSpaces));
+    transform_tohost_VkImageCreateInfo(resourceTracker,
+                                       (VkImageCreateInfo*)(&toTransform->imageCreateInfo));
+    if (toTransform->pColorSpaces) {
+        transform_tohost_VkSysmemColorSpaceFUCHSIA(
+            resourceTracker, (VkSysmemColorSpaceFUCHSIA*)(toTransform->pColorSpaces));
     }
 }
 
 void transform_fromhost_VkImageFormatConstraintsInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageFormatConstraintsInfoFUCHSIA* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkImageFormatConstraintsInfoFUCHSIA* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
     resourceTracker->transformImpl_VkImageCreateInfo_fromhost(&toTransform->imageCreateInfo, 1);
-    transform_fromhost_VkImageCreateInfo(resourceTracker, (VkImageCreateInfo*)(&toTransform->imageCreateInfo));
-    if (toTransform->pColorSpaces)
-    {
-        transform_fromhost_VkSysmemColorSpaceFUCHSIA(resourceTracker, (VkSysmemColorSpaceFUCHSIA*)(toTransform->pColorSpaces));
+    transform_fromhost_VkImageCreateInfo(resourceTracker,
+                                         (VkImageCreateInfo*)(&toTransform->imageCreateInfo));
+    if (toTransform->pColorSpaces) {
+        transform_fromhost_VkSysmemColorSpaceFUCHSIA(
+            resourceTracker, (VkSysmemColorSpaceFUCHSIA*)(toTransform->pColorSpaces));
     }
 }
 
-void transform_tohost_VkImageConstraintsInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageConstraintsInfoFUCHSIA* toTransform)
-{
+void transform_tohost_VkImageConstraintsInfoFUCHSIA(VkDecoderGlobalState* resourceTracker,
+                                                    VkImageConstraintsInfoFUCHSIA* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pFormatConstraints)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->formatConstraintsCount; ++i)
-            {
-                transform_tohost_VkImageFormatConstraintsInfoFUCHSIA(resourceTracker, (VkImageFormatConstraintsInfoFUCHSIA*)(toTransform->pFormatConstraints + i));
+    if (toTransform) {
+        if (toTransform->pFormatConstraints) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->formatConstraintsCount; ++i) {
+                transform_tohost_VkImageFormatConstraintsInfoFUCHSIA(
+                    resourceTracker,
+                    (VkImageFormatConstraintsInfoFUCHSIA*)(toTransform->pFormatConstraints + i));
             }
         }
     }
-    transform_tohost_VkBufferCollectionConstraintsInfoFUCHSIA(resourceTracker, (VkBufferCollectionConstraintsInfoFUCHSIA*)(&toTransform->bufferCollectionConstraints));
+    transform_tohost_VkBufferCollectionConstraintsInfoFUCHSIA(
+        resourceTracker,
+        (VkBufferCollectionConstraintsInfoFUCHSIA*)(&toTransform->bufferCollectionConstraints));
 }
 
-void transform_fromhost_VkImageConstraintsInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageConstraintsInfoFUCHSIA* toTransform)
-{
+void transform_fromhost_VkImageConstraintsInfoFUCHSIA(VkDecoderGlobalState* resourceTracker,
+                                                      VkImageConstraintsInfoFUCHSIA* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pFormatConstraints)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->formatConstraintsCount; ++i)
-            {
-                transform_fromhost_VkImageFormatConstraintsInfoFUCHSIA(resourceTracker, (VkImageFormatConstraintsInfoFUCHSIA*)(toTransform->pFormatConstraints + i));
+    if (toTransform) {
+        if (toTransform->pFormatConstraints) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->formatConstraintsCount; ++i) {
+                transform_fromhost_VkImageFormatConstraintsInfoFUCHSIA(
+                    resourceTracker,
+                    (VkImageFormatConstraintsInfoFUCHSIA*)(toTransform->pFormatConstraints + i));
             }
         }
     }
-    transform_fromhost_VkBufferCollectionConstraintsInfoFUCHSIA(resourceTracker, (VkBufferCollectionConstraintsInfoFUCHSIA*)(&toTransform->bufferCollectionConstraints));
+    transform_fromhost_VkBufferCollectionConstraintsInfoFUCHSIA(
+        resourceTracker,
+        (VkBufferCollectionConstraintsInfoFUCHSIA*)(&toTransform->bufferCollectionConstraints));
 }
 
 #endif
 #ifdef VK_HUAWEI_subpass_shading
 void transform_tohost_VkSubpassShadingPipelineCreateInfoHUAWEI(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubpassShadingPipelineCreateInfoHUAWEI* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkSubpassShadingPipelineCreateInfoHUAWEI* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkSubpassShadingPipelineCreateInfoHUAWEI(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubpassShadingPipelineCreateInfoHUAWEI* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkSubpassShadingPipelineCreateInfoHUAWEI* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceSubpassShadingFeaturesHUAWEI(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceSubpassShadingFeaturesHUAWEI* toTransform)
-{
+    VkPhysicalDeviceSubpassShadingFeaturesHUAWEI* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceSubpassShadingFeaturesHUAWEI(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceSubpassShadingFeaturesHUAWEI* toTransform)
-{
+    VkPhysicalDeviceSubpassShadingFeaturesHUAWEI* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceSubpassShadingPropertiesHUAWEI(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceSubpassShadingPropertiesHUAWEI* toTransform)
-{
+    VkPhysicalDeviceSubpassShadingPropertiesHUAWEI* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceSubpassShadingPropertiesHUAWEI(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceSubpassShadingPropertiesHUAWEI* toTransform)
-{
+    VkPhysicalDeviceSubpassShadingPropertiesHUAWEI* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -18834,74 +15275,60 @@
 #ifdef VK_HUAWEI_invocation_mask
 void transform_tohost_VkPhysicalDeviceInvocationMaskFeaturesHUAWEI(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceInvocationMaskFeaturesHUAWEI* toTransform)
-{
+    VkPhysicalDeviceInvocationMaskFeaturesHUAWEI* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceInvocationMaskFeaturesHUAWEI(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceInvocationMaskFeaturesHUAWEI* toTransform)
-{
+    VkPhysicalDeviceInvocationMaskFeaturesHUAWEI* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_NV_external_memory_rdma
-void transform_tohost_VkMemoryGetRemoteAddressInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryGetRemoteAddressInfoNV* toTransform)
-{
+void transform_tohost_VkMemoryGetRemoteAddressInfoNV(VkDecoderGlobalState* resourceTracker,
+                                                     VkMemoryGetRemoteAddressInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkMemoryGetRemoteAddressInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryGetRemoteAddressInfoNV* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkMemoryGetRemoteAddressInfoNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceExternalMemoryRDMAFeaturesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceExternalMemoryRDMAFeaturesNV* toTransform)
-{
+    VkPhysicalDeviceExternalMemoryRDMAFeaturesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceExternalMemoryRDMAFeaturesNV(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceExternalMemoryRDMAFeaturesNV* toTransform)
-{
+    VkPhysicalDeviceExternalMemoryRDMAFeaturesNV* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -18910,50 +15337,40 @@
 #ifdef VK_EXT_extended_dynamic_state2
 void transform_tohost_VkPhysicalDeviceExtendedDynamicState2FeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceExtendedDynamicState2FeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceExtendedDynamicState2FeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceExtendedDynamicState2FeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceExtendedDynamicState2FeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceExtendedDynamicState2FeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_QNX_screen_surface
-void transform_tohost_VkScreenSurfaceCreateInfoQNX(
-    VkDecoderGlobalState* resourceTracker,
-    VkScreenSurfaceCreateInfoQNX* toTransform)
-{
+void transform_tohost_VkScreenSurfaceCreateInfoQNX(VkDecoderGlobalState* resourceTracker,
+                                                   VkScreenSurfaceCreateInfoQNX* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkScreenSurfaceCreateInfoQNX(
-    VkDecoderGlobalState* resourceTracker,
-    VkScreenSurfaceCreateInfoQNX* toTransform)
-{
+void transform_fromhost_VkScreenSurfaceCreateInfoQNX(VkDecoderGlobalState* resourceTracker,
+                                                     VkScreenSurfaceCreateInfoQNX* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -18962,122 +15379,94 @@
 #ifdef VK_EXT_color_write_enable
 void transform_tohost_VkPhysicalDeviceColorWriteEnableFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceColorWriteEnableFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceColorWriteEnableFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceColorWriteEnableFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceColorWriteEnableFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceColorWriteEnableFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPipelineColorWriteCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineColorWriteCreateInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineColorWriteCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPipelineColorWriteCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineColorWriteCreateInfoEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPipelineColorWriteCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_GOOGLE_gfxstream
-void transform_tohost_VkImportColorBufferGOOGLE(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportColorBufferGOOGLE* toTransform)
-{
+void transform_tohost_VkImportColorBufferGOOGLE(VkDecoderGlobalState* resourceTracker,
+                                                VkImportColorBufferGOOGLE* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkImportColorBufferGOOGLE(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportColorBufferGOOGLE* toTransform)
-{
+void transform_fromhost_VkImportColorBufferGOOGLE(VkDecoderGlobalState* resourceTracker,
+                                                  VkImportColorBufferGOOGLE* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkImportBufferGOOGLE(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportBufferGOOGLE* toTransform)
-{
+void transform_tohost_VkImportBufferGOOGLE(VkDecoderGlobalState* resourceTracker,
+                                           VkImportBufferGOOGLE* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkImportBufferGOOGLE(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportBufferGOOGLE* toTransform)
-{
+void transform_fromhost_VkImportBufferGOOGLE(VkDecoderGlobalState* resourceTracker,
+                                             VkImportBufferGOOGLE* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkImportPhysicalAddressGOOGLE(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportPhysicalAddressGOOGLE* toTransform)
-{
+void transform_tohost_VkImportPhysicalAddressGOOGLE(VkDecoderGlobalState* resourceTracker,
+                                                    VkImportPhysicalAddressGOOGLE* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_fromhost_VkImportPhysicalAddressGOOGLE(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportPhysicalAddressGOOGLE* toTransform)
-{
+void transform_fromhost_VkImportPhysicalAddressGOOGLE(VkDecoderGlobalState* resourceTracker,
+                                                      VkImportPhysicalAddressGOOGLE* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -19086,48 +15475,38 @@
 #ifdef VK_EXT_global_priority_query
 void transform_tohost_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkQueueFamilyGlobalPriorityPropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkQueueFamilyGlobalPriorityPropertiesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkQueueFamilyGlobalPriorityPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkQueueFamilyGlobalPriorityPropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkQueueFamilyGlobalPriorityPropertiesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkQueueFamilyGlobalPriorityPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -19135,81 +15514,61 @@
 #endif
 #ifdef VK_EXT_multi_draw
 void transform_tohost_VkPhysicalDeviceMultiDrawFeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMultiDrawFeaturesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMultiDrawFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceMultiDrawFeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMultiDrawFeaturesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMultiDrawFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceMultiDrawPropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMultiDrawPropertiesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMultiDrawPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceMultiDrawPropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMultiDrawPropertiesEXT* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMultiDrawPropertiesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
-void transform_tohost_VkMultiDrawInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkMultiDrawInfoEXT* toTransform)
-{
+void transform_tohost_VkMultiDrawInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                         VkMultiDrawInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkMultiDrawInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkMultiDrawInfoEXT* toTransform)
-{
+void transform_fromhost_VkMultiDrawInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                           VkMultiDrawInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkMultiDrawIndexedInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkMultiDrawIndexedInfoEXT* toTransform)
-{
+void transform_tohost_VkMultiDrawIndexedInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                VkMultiDrawIndexedInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkMultiDrawIndexedInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkMultiDrawIndexedInfoEXT* toTransform)
-{
+void transform_fromhost_VkMultiDrawIndexedInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                  VkMultiDrawIndexedInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
@@ -19220,530 +15579,464 @@
 #ifdef VK_EXT_border_color_swizzle
 void transform_tohost_VkPhysicalDeviceBorderColorSwizzleFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceBorderColorSwizzleFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceBorderColorSwizzleFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceBorderColorSwizzleFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceBorderColorSwizzleFeaturesEXT* toTransform)
-{
+    VkPhysicalDeviceBorderColorSwizzleFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkSamplerBorderColorComponentMappingCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkSamplerBorderColorComponentMappingCreateInfoEXT* toTransform)
-{
+    VkSamplerBorderColorComponentMappingCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkComponentMapping(resourceTracker, (VkComponentMapping*)(&toTransform->components));
+    transform_tohost_VkComponentMapping(resourceTracker,
+                                        (VkComponentMapping*)(&toTransform->components));
 }
 
 void transform_fromhost_VkSamplerBorderColorComponentMappingCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkSamplerBorderColorComponentMappingCreateInfoEXT* toTransform)
-{
+    VkSamplerBorderColorComponentMappingCreateInfoEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkComponentMapping(resourceTracker, (VkComponentMapping*)(&toTransform->components));
+    transform_fromhost_VkComponentMapping(resourceTracker,
+                                          (VkComponentMapping*)(&toTransform->components));
 }
 
 #endif
 #ifdef VK_EXT_pageable_device_local_memory
 void transform_tohost_VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT* toTransform)
-{
+    VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT* toTransform)
-{
+    VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
 #ifdef VK_KHR_acceleration_structure
-void transform_tohost_VkDeviceOrHostAddressKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceOrHostAddressKHR* toTransform)
-{
+void transform_tohost_VkDeviceOrHostAddressKHR(VkDecoderGlobalState* resourceTracker,
+                                               VkDeviceOrHostAddressKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkDeviceOrHostAddressKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceOrHostAddressKHR* toTransform)
-{
+void transform_fromhost_VkDeviceOrHostAddressKHR(VkDecoderGlobalState* resourceTracker,
+                                                 VkDeviceOrHostAddressKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_tohost_VkAccelerationStructureBuildRangeInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureBuildRangeInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureBuildRangeInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_fromhost_VkAccelerationStructureBuildRangeInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureBuildRangeInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureBuildRangeInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_tohost_VkAccelerationStructureGeometryTrianglesDataKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureGeometryTrianglesDataKHR* toTransform)
-{
+    VkAccelerationStructureGeometryTrianglesDataKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkDeviceOrHostAddressConstKHR(resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->vertexData));
-    transform_tohost_VkDeviceOrHostAddressConstKHR(resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->indexData));
-    transform_tohost_VkDeviceOrHostAddressConstKHR(resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->transformData));
+    transform_tohost_VkDeviceOrHostAddressConstKHR(
+        resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->vertexData));
+    transform_tohost_VkDeviceOrHostAddressConstKHR(
+        resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->indexData));
+    transform_tohost_VkDeviceOrHostAddressConstKHR(
+        resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->transformData));
 }
 
 void transform_fromhost_VkAccelerationStructureGeometryTrianglesDataKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureGeometryTrianglesDataKHR* toTransform)
-{
+    VkAccelerationStructureGeometryTrianglesDataKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkDeviceOrHostAddressConstKHR(resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->vertexData));
-    transform_fromhost_VkDeviceOrHostAddressConstKHR(resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->indexData));
-    transform_fromhost_VkDeviceOrHostAddressConstKHR(resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->transformData));
+    transform_fromhost_VkDeviceOrHostAddressConstKHR(
+        resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->vertexData));
+    transform_fromhost_VkDeviceOrHostAddressConstKHR(
+        resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->indexData));
+    transform_fromhost_VkDeviceOrHostAddressConstKHR(
+        resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->transformData));
 }
 
 void transform_tohost_VkAccelerationStructureGeometryAabbsDataKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureGeometryAabbsDataKHR* toTransform)
-{
+    VkAccelerationStructureGeometryAabbsDataKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkDeviceOrHostAddressConstKHR(resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->data));
+    transform_tohost_VkDeviceOrHostAddressConstKHR(
+        resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->data));
 }
 
 void transform_fromhost_VkAccelerationStructureGeometryAabbsDataKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureGeometryAabbsDataKHR* toTransform)
-{
+    VkAccelerationStructureGeometryAabbsDataKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkDeviceOrHostAddressConstKHR(resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->data));
+    transform_fromhost_VkDeviceOrHostAddressConstKHR(
+        resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->data));
 }
 
 void transform_tohost_VkAccelerationStructureGeometryInstancesDataKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureGeometryInstancesDataKHR* toTransform)
-{
+    VkAccelerationStructureGeometryInstancesDataKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkDeviceOrHostAddressConstKHR(resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->data));
+    transform_tohost_VkDeviceOrHostAddressConstKHR(
+        resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->data));
 }
 
 void transform_fromhost_VkAccelerationStructureGeometryInstancesDataKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureGeometryInstancesDataKHR* toTransform)
-{
+    VkAccelerationStructureGeometryInstancesDataKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkDeviceOrHostAddressConstKHR(resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->data));
+    transform_fromhost_VkDeviceOrHostAddressConstKHR(
+        resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->data));
 }
 
 void transform_tohost_VkAccelerationStructureGeometryDataKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureGeometryDataKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureGeometryDataKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_tohost_VkAccelerationStructureGeometryTrianglesDataKHR(resourceTracker, (VkAccelerationStructureGeometryTrianglesDataKHR*)(&toTransform->triangles));
-    transform_tohost_VkAccelerationStructureGeometryAabbsDataKHR(resourceTracker, (VkAccelerationStructureGeometryAabbsDataKHR*)(&toTransform->aabbs));
-    transform_tohost_VkAccelerationStructureGeometryInstancesDataKHR(resourceTracker, (VkAccelerationStructureGeometryInstancesDataKHR*)(&toTransform->instances));
+    transform_tohost_VkAccelerationStructureGeometryTrianglesDataKHR(
+        resourceTracker,
+        (VkAccelerationStructureGeometryTrianglesDataKHR*)(&toTransform->triangles));
+    transform_tohost_VkAccelerationStructureGeometryAabbsDataKHR(
+        resourceTracker, (VkAccelerationStructureGeometryAabbsDataKHR*)(&toTransform->aabbs));
+    transform_tohost_VkAccelerationStructureGeometryInstancesDataKHR(
+        resourceTracker,
+        (VkAccelerationStructureGeometryInstancesDataKHR*)(&toTransform->instances));
 }
 
 void transform_fromhost_VkAccelerationStructureGeometryDataKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureGeometryDataKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureGeometryDataKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    transform_fromhost_VkAccelerationStructureGeometryTrianglesDataKHR(resourceTracker, (VkAccelerationStructureGeometryTrianglesDataKHR*)(&toTransform->triangles));
-    transform_fromhost_VkAccelerationStructureGeometryAabbsDataKHR(resourceTracker, (VkAccelerationStructureGeometryAabbsDataKHR*)(&toTransform->aabbs));
-    transform_fromhost_VkAccelerationStructureGeometryInstancesDataKHR(resourceTracker, (VkAccelerationStructureGeometryInstancesDataKHR*)(&toTransform->instances));
+    transform_fromhost_VkAccelerationStructureGeometryTrianglesDataKHR(
+        resourceTracker,
+        (VkAccelerationStructureGeometryTrianglesDataKHR*)(&toTransform->triangles));
+    transform_fromhost_VkAccelerationStructureGeometryAabbsDataKHR(
+        resourceTracker, (VkAccelerationStructureGeometryAabbsDataKHR*)(&toTransform->aabbs));
+    transform_fromhost_VkAccelerationStructureGeometryInstancesDataKHR(
+        resourceTracker,
+        (VkAccelerationStructureGeometryInstancesDataKHR*)(&toTransform->instances));
 }
 
 void transform_tohost_VkAccelerationStructureGeometryKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureGeometryKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureGeometryKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkAccelerationStructureGeometryDataKHR(resourceTracker, (VkAccelerationStructureGeometryDataKHR*)(&toTransform->geometry));
+    transform_tohost_VkAccelerationStructureGeometryDataKHR(
+        resourceTracker, (VkAccelerationStructureGeometryDataKHR*)(&toTransform->geometry));
 }
 
 void transform_fromhost_VkAccelerationStructureGeometryKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureGeometryKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureGeometryKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkAccelerationStructureGeometryDataKHR(resourceTracker, (VkAccelerationStructureGeometryDataKHR*)(&toTransform->geometry));
+    transform_fromhost_VkAccelerationStructureGeometryDataKHR(
+        resourceTracker, (VkAccelerationStructureGeometryDataKHR*)(&toTransform->geometry));
 }
 
 void transform_tohost_VkAccelerationStructureBuildGeometryInfoKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureBuildGeometryInfoKHR* toTransform)
-{
+    VkAccelerationStructureBuildGeometryInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pGeometries)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->geometryCount; ++i)
-            {
-                transform_tohost_VkAccelerationStructureGeometryKHR(resourceTracker, (VkAccelerationStructureGeometryKHR*)(toTransform->pGeometries + i));
+    if (toTransform) {
+        if (toTransform->pGeometries) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->geometryCount; ++i) {
+                transform_tohost_VkAccelerationStructureGeometryKHR(
+                    resourceTracker,
+                    (VkAccelerationStructureGeometryKHR*)(toTransform->pGeometries + i));
             }
         }
     }
-    transform_tohost_VkDeviceOrHostAddressKHR(resourceTracker, (VkDeviceOrHostAddressKHR*)(&toTransform->scratchData));
+    transform_tohost_VkDeviceOrHostAddressKHR(
+        resourceTracker, (VkDeviceOrHostAddressKHR*)(&toTransform->scratchData));
 }
 
 void transform_fromhost_VkAccelerationStructureBuildGeometryInfoKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureBuildGeometryInfoKHR* toTransform)
-{
+    VkAccelerationStructureBuildGeometryInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pGeometries)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->geometryCount; ++i)
-            {
-                transform_fromhost_VkAccelerationStructureGeometryKHR(resourceTracker, (VkAccelerationStructureGeometryKHR*)(toTransform->pGeometries + i));
+    if (toTransform) {
+        if (toTransform->pGeometries) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->geometryCount; ++i) {
+                transform_fromhost_VkAccelerationStructureGeometryKHR(
+                    resourceTracker,
+                    (VkAccelerationStructureGeometryKHR*)(toTransform->pGeometries + i));
             }
         }
     }
-    transform_fromhost_VkDeviceOrHostAddressKHR(resourceTracker, (VkDeviceOrHostAddressKHR*)(&toTransform->scratchData));
+    transform_fromhost_VkDeviceOrHostAddressKHR(
+        resourceTracker, (VkDeviceOrHostAddressKHR*)(&toTransform->scratchData));
 }
 
 void transform_tohost_VkAccelerationStructureCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureCreateInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkAccelerationStructureCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureCreateInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkWriteDescriptorSetAccelerationStructureKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkWriteDescriptorSetAccelerationStructureKHR* toTransform)
-{
+    VkWriteDescriptorSetAccelerationStructureKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkWriteDescriptorSetAccelerationStructureKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkWriteDescriptorSetAccelerationStructureKHR* toTransform)
-{
+    VkWriteDescriptorSetAccelerationStructureKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceAccelerationStructureFeaturesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceAccelerationStructureFeaturesKHR* toTransform)
-{
+    VkPhysicalDeviceAccelerationStructureFeaturesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceAccelerationStructureFeaturesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceAccelerationStructureFeaturesKHR* toTransform)
-{
+    VkPhysicalDeviceAccelerationStructureFeaturesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceAccelerationStructurePropertiesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceAccelerationStructurePropertiesKHR* toTransform)
-{
+    VkPhysicalDeviceAccelerationStructurePropertiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceAccelerationStructurePropertiesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceAccelerationStructurePropertiesKHR* toTransform)
-{
+    VkPhysicalDeviceAccelerationStructurePropertiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkAccelerationStructureDeviceAddressInfoKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureDeviceAddressInfoKHR* toTransform)
-{
+    VkAccelerationStructureDeviceAddressInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkAccelerationStructureDeviceAddressInfoKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureDeviceAddressInfoKHR* toTransform)
-{
+    VkAccelerationStructureDeviceAddressInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkAccelerationStructureVersionInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureVersionInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureVersionInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkAccelerationStructureVersionInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureVersionInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureVersionInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkCopyAccelerationStructureToMemoryInfoKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkCopyAccelerationStructureToMemoryInfoKHR* toTransform)
-{
+    VkCopyAccelerationStructureToMemoryInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkDeviceOrHostAddressKHR(resourceTracker, (VkDeviceOrHostAddressKHR*)(&toTransform->dst));
+    transform_tohost_VkDeviceOrHostAddressKHR(resourceTracker,
+                                              (VkDeviceOrHostAddressKHR*)(&toTransform->dst));
 }
 
 void transform_fromhost_VkCopyAccelerationStructureToMemoryInfoKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkCopyAccelerationStructureToMemoryInfoKHR* toTransform)
-{
+    VkCopyAccelerationStructureToMemoryInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkDeviceOrHostAddressKHR(resourceTracker, (VkDeviceOrHostAddressKHR*)(&toTransform->dst));
+    transform_fromhost_VkDeviceOrHostAddressKHR(resourceTracker,
+                                                (VkDeviceOrHostAddressKHR*)(&toTransform->dst));
 }
 
 void transform_tohost_VkCopyMemoryToAccelerationStructureInfoKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkCopyMemoryToAccelerationStructureInfoKHR* toTransform)
-{
+    VkCopyMemoryToAccelerationStructureInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_tohost_VkDeviceOrHostAddressConstKHR(resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->src));
+    transform_tohost_VkDeviceOrHostAddressConstKHR(
+        resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->src));
 }
 
 void transform_fromhost_VkCopyMemoryToAccelerationStructureInfoKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkCopyMemoryToAccelerationStructureInfoKHR* toTransform)
-{
+    VkCopyMemoryToAccelerationStructureInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    transform_fromhost_VkDeviceOrHostAddressConstKHR(resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->src));
+    transform_fromhost_VkDeviceOrHostAddressConstKHR(
+        resourceTracker, (VkDeviceOrHostAddressConstKHR*)(&toTransform->src));
 }
 
 void transform_tohost_VkCopyAccelerationStructureInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkCopyAccelerationStructureInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkCopyAccelerationStructureInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkCopyAccelerationStructureInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkCopyAccelerationStructureInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkCopyAccelerationStructureInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkAccelerationStructureBuildSizesInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureBuildSizesInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureBuildSizesInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkAccelerationStructureBuildSizesInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureBuildSizesInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureBuildSizesInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
@@ -19751,217 +16044,181 @@
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
 void transform_tohost_VkRayTracingShaderGroupCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkRayTracingShaderGroupCreateInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkRayTracingShaderGroupCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkRayTracingShaderGroupCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkRayTracingShaderGroupCreateInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkRayTracingShaderGroupCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkRayTracingPipelineInterfaceCreateInfoKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkRayTracingPipelineInterfaceCreateInfoKHR* toTransform)
-{
+    VkRayTracingPipelineInterfaceCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkRayTracingPipelineInterfaceCreateInfoKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkRayTracingPipelineInterfaceCreateInfoKHR* toTransform)
-{
+    VkRayTracingPipelineInterfaceCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkRayTracingPipelineCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkRayTracingPipelineCreateInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkRayTracingPipelineCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pStages)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->stageCount; ++i)
-            {
-                transform_tohost_VkPipelineShaderStageCreateInfo(resourceTracker, (VkPipelineShaderStageCreateInfo*)(toTransform->pStages + i));
+    if (toTransform) {
+        if (toTransform->pStages) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->stageCount; ++i) {
+                transform_tohost_VkPipelineShaderStageCreateInfo(
+                    resourceTracker, (VkPipelineShaderStageCreateInfo*)(toTransform->pStages + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pGroups)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->groupCount; ++i)
-            {
-                transform_tohost_VkRayTracingShaderGroupCreateInfoKHR(resourceTracker, (VkRayTracingShaderGroupCreateInfoKHR*)(toTransform->pGroups + i));
+    if (toTransform) {
+        if (toTransform->pGroups) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->groupCount; ++i) {
+                transform_tohost_VkRayTracingShaderGroupCreateInfoKHR(
+                    resourceTracker,
+                    (VkRayTracingShaderGroupCreateInfoKHR*)(toTransform->pGroups + i));
             }
         }
     }
-    if (toTransform->pLibraryInfo)
-    {
-        transform_tohost_VkPipelineLibraryCreateInfoKHR(resourceTracker, (VkPipelineLibraryCreateInfoKHR*)(toTransform->pLibraryInfo));
+    if (toTransform->pLibraryInfo) {
+        transform_tohost_VkPipelineLibraryCreateInfoKHR(
+            resourceTracker, (VkPipelineLibraryCreateInfoKHR*)(toTransform->pLibraryInfo));
     }
-    if (toTransform->pLibraryInterface)
-    {
-        transform_tohost_VkRayTracingPipelineInterfaceCreateInfoKHR(resourceTracker, (VkRayTracingPipelineInterfaceCreateInfoKHR*)(toTransform->pLibraryInterface));
+    if (toTransform->pLibraryInterface) {
+        transform_tohost_VkRayTracingPipelineInterfaceCreateInfoKHR(
+            resourceTracker,
+            (VkRayTracingPipelineInterfaceCreateInfoKHR*)(toTransform->pLibraryInterface));
     }
-    if (toTransform->pDynamicState)
-    {
-        transform_tohost_VkPipelineDynamicStateCreateInfo(resourceTracker, (VkPipelineDynamicStateCreateInfo*)(toTransform->pDynamicState));
+    if (toTransform->pDynamicState) {
+        transform_tohost_VkPipelineDynamicStateCreateInfo(
+            resourceTracker, (VkPipelineDynamicStateCreateInfo*)(toTransform->pDynamicState));
     }
 }
 
 void transform_fromhost_VkRayTracingPipelineCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkRayTracingPipelineCreateInfoKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkRayTracingPipelineCreateInfoKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    if (toTransform)
-    {
-        if (toTransform->pStages)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->stageCount; ++i)
-            {
-                transform_fromhost_VkPipelineShaderStageCreateInfo(resourceTracker, (VkPipelineShaderStageCreateInfo*)(toTransform->pStages + i));
+    if (toTransform) {
+        if (toTransform->pStages) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->stageCount; ++i) {
+                transform_fromhost_VkPipelineShaderStageCreateInfo(
+                    resourceTracker, (VkPipelineShaderStageCreateInfo*)(toTransform->pStages + i));
             }
         }
     }
-    if (toTransform)
-    {
-        if (toTransform->pGroups)
-        {
-            for (uint32_t i = 0; i < (uint32_t)toTransform->groupCount; ++i)
-            {
-                transform_fromhost_VkRayTracingShaderGroupCreateInfoKHR(resourceTracker, (VkRayTracingShaderGroupCreateInfoKHR*)(toTransform->pGroups + i));
+    if (toTransform) {
+        if (toTransform->pGroups) {
+            for (uint32_t i = 0; i < (uint32_t)toTransform->groupCount; ++i) {
+                transform_fromhost_VkRayTracingShaderGroupCreateInfoKHR(
+                    resourceTracker,
+                    (VkRayTracingShaderGroupCreateInfoKHR*)(toTransform->pGroups + i));
             }
         }
     }
-    if (toTransform->pLibraryInfo)
-    {
-        transform_fromhost_VkPipelineLibraryCreateInfoKHR(resourceTracker, (VkPipelineLibraryCreateInfoKHR*)(toTransform->pLibraryInfo));
+    if (toTransform->pLibraryInfo) {
+        transform_fromhost_VkPipelineLibraryCreateInfoKHR(
+            resourceTracker, (VkPipelineLibraryCreateInfoKHR*)(toTransform->pLibraryInfo));
     }
-    if (toTransform->pLibraryInterface)
-    {
-        transform_fromhost_VkRayTracingPipelineInterfaceCreateInfoKHR(resourceTracker, (VkRayTracingPipelineInterfaceCreateInfoKHR*)(toTransform->pLibraryInterface));
+    if (toTransform->pLibraryInterface) {
+        transform_fromhost_VkRayTracingPipelineInterfaceCreateInfoKHR(
+            resourceTracker,
+            (VkRayTracingPipelineInterfaceCreateInfoKHR*)(toTransform->pLibraryInterface));
     }
-    if (toTransform->pDynamicState)
-    {
-        transform_fromhost_VkPipelineDynamicStateCreateInfo(resourceTracker, (VkPipelineDynamicStateCreateInfo*)(toTransform->pDynamicState));
+    if (toTransform->pDynamicState) {
+        transform_fromhost_VkPipelineDynamicStateCreateInfo(
+            resourceTracker, (VkPipelineDynamicStateCreateInfo*)(toTransform->pDynamicState));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceRayTracingPipelineFeaturesKHR* toTransform)
-{
+    VkPhysicalDeviceRayTracingPipelineFeaturesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceRayTracingPipelineFeaturesKHR* toTransform)
-{
+    VkPhysicalDeviceRayTracingPipelineFeaturesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceRayTracingPipelinePropertiesKHR* toTransform)
-{
+    VkPhysicalDeviceRayTracingPipelinePropertiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(
     VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceRayTracingPipelinePropertiesKHR* toTransform)
-{
+    VkPhysicalDeviceRayTracingPipelinePropertiesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_tohost_VkStridedDeviceAddressRegionKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkStridedDeviceAddressRegionKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkStridedDeviceAddressRegionKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
 void transform_fromhost_VkStridedDeviceAddressRegionKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkStridedDeviceAddressRegionKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkStridedDeviceAddressRegionKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_tohost_VkTraceRaysIndirectCommandKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkTraceRaysIndirectCommandKHR* toTransform)
-{
+void transform_tohost_VkTraceRaysIndirectCommandKHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkTraceRaysIndirectCommandKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
 
-void transform_fromhost_VkTraceRaysIndirectCommandKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkTraceRaysIndirectCommandKHR* toTransform)
-{
+void transform_fromhost_VkTraceRaysIndirectCommandKHR(VkDecoderGlobalState* resourceTracker,
+                                                      VkTraceRaysIndirectCommandKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
 }
@@ -19969,4237 +16226,5014 @@
 #endif
 #ifdef VK_KHR_ray_query
 void transform_tohost_VkPhysicalDeviceRayQueryFeaturesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceRayQueryFeaturesKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceRayQueryFeaturesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 void transform_fromhost_VkPhysicalDeviceRayQueryFeaturesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceRayQueryFeaturesKHR* toTransform)
-{
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceRayQueryFeaturesKHR* toTransform) {
     (void)resourceTracker;
     (void)toTransform;
-    if (toTransform->pNext)
-    {
+    if (toTransform->pNext) {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
 }
 
 #endif
-void transform_tohost_extension_struct(
-    VkDecoderGlobalState* resourceTracker,
-    void* structExtension_out)
-{
-    if (!structExtension_out)
-    {
+void transform_tohost_extension_struct(VkDecoderGlobalState* resourceTracker,
+                                       void* structExtension_out) {
+    if (!structExtension_out) {
         return;
     }
     uint32_t structType = (uint32_t)goldfish_vk_struct_type(structExtension_out);
-    switch(structType)
-    {
+    switch (structType) {
 #ifdef VK_VERSION_1_1
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES:
-        {
-            transform_tohost_VkPhysicalDeviceSubgroupProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceSubgroupProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES: {
+            transform_tohost_VkPhysicalDeviceSubgroupProperties(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceSubgroupProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES:
-        {
-            transform_tohost_VkPhysicalDevice16BitStorageFeatures(resourceTracker, reinterpret_cast<VkPhysicalDevice16BitStorageFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES: {
+            transform_tohost_VkPhysicalDevice16BitStorageFeatures(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDevice16BitStorageFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS:
-        {
-            transform_tohost_VkMemoryDedicatedRequirements(resourceTracker, reinterpret_cast<VkMemoryDedicatedRequirements*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS: {
+            transform_tohost_VkMemoryDedicatedRequirements(
+                resourceTracker,
+                reinterpret_cast<VkMemoryDedicatedRequirements*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO:
-        {
-            transform_tohost_VkMemoryDedicatedAllocateInfo(resourceTracker, reinterpret_cast<VkMemoryDedicatedAllocateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO: {
+            transform_tohost_VkMemoryDedicatedAllocateInfo(
+                resourceTracker,
+                reinterpret_cast<VkMemoryDedicatedAllocateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO:
-        {
-            transform_tohost_VkMemoryAllocateFlagsInfo(resourceTracker, reinterpret_cast<VkMemoryAllocateFlagsInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO: {
+            transform_tohost_VkMemoryAllocateFlagsInfo(
+                resourceTracker, reinterpret_cast<VkMemoryAllocateFlagsInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO:
-        {
-            transform_tohost_VkDeviceGroupRenderPassBeginInfo(resourceTracker, reinterpret_cast<VkDeviceGroupRenderPassBeginInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO: {
+            transform_tohost_VkDeviceGroupRenderPassBeginInfo(
+                resourceTracker,
+                reinterpret_cast<VkDeviceGroupRenderPassBeginInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO:
-        {
-            transform_tohost_VkDeviceGroupCommandBufferBeginInfo(resourceTracker, reinterpret_cast<VkDeviceGroupCommandBufferBeginInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO: {
+            transform_tohost_VkDeviceGroupCommandBufferBeginInfo(
+                resourceTracker,
+                reinterpret_cast<VkDeviceGroupCommandBufferBeginInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO:
-        {
-            transform_tohost_VkDeviceGroupSubmitInfo(resourceTracker, reinterpret_cast<VkDeviceGroupSubmitInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO: {
+            transform_tohost_VkDeviceGroupSubmitInfo(
+                resourceTracker, reinterpret_cast<VkDeviceGroupSubmitInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO:
-        {
-            transform_tohost_VkDeviceGroupBindSparseInfo(resourceTracker, reinterpret_cast<VkDeviceGroupBindSparseInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO: {
+            transform_tohost_VkDeviceGroupBindSparseInfo(
+                resourceTracker,
+                reinterpret_cast<VkDeviceGroupBindSparseInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO:
-        {
-            transform_tohost_VkBindBufferMemoryDeviceGroupInfo(resourceTracker, reinterpret_cast<VkBindBufferMemoryDeviceGroupInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO: {
+            transform_tohost_VkBindBufferMemoryDeviceGroupInfo(
+                resourceTracker,
+                reinterpret_cast<VkBindBufferMemoryDeviceGroupInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO:
-        {
-            transform_tohost_VkBindImageMemoryDeviceGroupInfo(resourceTracker, reinterpret_cast<VkBindImageMemoryDeviceGroupInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO: {
+            transform_tohost_VkBindImageMemoryDeviceGroupInfo(
+                resourceTracker,
+                reinterpret_cast<VkBindImageMemoryDeviceGroupInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO:
-        {
-            transform_tohost_VkDeviceGroupDeviceCreateInfo(resourceTracker, reinterpret_cast<VkDeviceGroupDeviceCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO: {
+            transform_tohost_VkDeviceGroupDeviceCreateInfo(
+                resourceTracker,
+                reinterpret_cast<VkDeviceGroupDeviceCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2:
-        {
-            transform_tohost_VkPhysicalDeviceFeatures2(resourceTracker, reinterpret_cast<VkPhysicalDeviceFeatures2*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2: {
+            transform_tohost_VkPhysicalDeviceFeatures2(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceFeatures2*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES:
-        {
-            transform_tohost_VkPhysicalDevicePointClippingProperties(resourceTracker, reinterpret_cast<VkPhysicalDevicePointClippingProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES: {
+            transform_tohost_VkPhysicalDevicePointClippingProperties(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDevicePointClippingProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO:
-        {
-            transform_tohost_VkRenderPassInputAttachmentAspectCreateInfo(resourceTracker, reinterpret_cast<VkRenderPassInputAttachmentAspectCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO: {
+            transform_tohost_VkRenderPassInputAttachmentAspectCreateInfo(
+                resourceTracker, reinterpret_cast<VkRenderPassInputAttachmentAspectCreateInfo*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO:
-        {
-            transform_tohost_VkImageViewUsageCreateInfo(resourceTracker, reinterpret_cast<VkImageViewUsageCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO: {
+            transform_tohost_VkImageViewUsageCreateInfo(
+                resourceTracker,
+                reinterpret_cast<VkImageViewUsageCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO:
-        {
-            transform_tohost_VkPipelineTessellationDomainOriginStateCreateInfo(resourceTracker, reinterpret_cast<VkPipelineTessellationDomainOriginStateCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO: {
+            transform_tohost_VkPipelineTessellationDomainOriginStateCreateInfo(
+                resourceTracker,
+                reinterpret_cast<VkPipelineTessellationDomainOriginStateCreateInfo*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO:
-        {
-            transform_tohost_VkRenderPassMultiviewCreateInfo(resourceTracker, reinterpret_cast<VkRenderPassMultiviewCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO: {
+            transform_tohost_VkRenderPassMultiviewCreateInfo(
+                resourceTracker,
+                reinterpret_cast<VkRenderPassMultiviewCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES:
-        {
-            transform_tohost_VkPhysicalDeviceMultiviewFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceMultiviewFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES: {
+            transform_tohost_VkPhysicalDeviceMultiviewFeatures(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceMultiviewFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES:
-        {
-            transform_tohost_VkPhysicalDeviceMultiviewProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceMultiviewProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES: {
+            transform_tohost_VkPhysicalDeviceMultiviewProperties(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceMultiviewProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES:
-        {
-            transform_tohost_VkPhysicalDeviceVariablePointersFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceVariablePointersFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES: {
+            transform_tohost_VkPhysicalDeviceVariablePointersFeatures(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceVariablePointersFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES:
-        {
-            transform_tohost_VkPhysicalDeviceProtectedMemoryFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceProtectedMemoryFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES: {
+            transform_tohost_VkPhysicalDeviceProtectedMemoryFeatures(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceProtectedMemoryFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES:
-        {
-            transform_tohost_VkPhysicalDeviceProtectedMemoryProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceProtectedMemoryProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES: {
+            transform_tohost_VkPhysicalDeviceProtectedMemoryProperties(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceProtectedMemoryProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO:
-        {
-            transform_tohost_VkProtectedSubmitInfo(resourceTracker, reinterpret_cast<VkProtectedSubmitInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO: {
+            transform_tohost_VkProtectedSubmitInfo(
+                resourceTracker, reinterpret_cast<VkProtectedSubmitInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO:
-        {
-            transform_tohost_VkSamplerYcbcrConversionInfo(resourceTracker, reinterpret_cast<VkSamplerYcbcrConversionInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO: {
+            transform_tohost_VkSamplerYcbcrConversionInfo(
+                resourceTracker,
+                reinterpret_cast<VkSamplerYcbcrConversionInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO:
-        {
-            transform_tohost_VkBindImagePlaneMemoryInfo(resourceTracker, reinterpret_cast<VkBindImagePlaneMemoryInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO: {
+            transform_tohost_VkBindImagePlaneMemoryInfo(
+                resourceTracker,
+                reinterpret_cast<VkBindImagePlaneMemoryInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO:
-        {
-            transform_tohost_VkImagePlaneMemoryRequirementsInfo(resourceTracker, reinterpret_cast<VkImagePlaneMemoryRequirementsInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO: {
+            transform_tohost_VkImagePlaneMemoryRequirementsInfo(
+                resourceTracker,
+                reinterpret_cast<VkImagePlaneMemoryRequirementsInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES:
-        {
-            transform_tohost_VkPhysicalDeviceSamplerYcbcrConversionFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES: {
+            transform_tohost_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES:
-        {
-            transform_tohost_VkSamplerYcbcrConversionImageFormatProperties(resourceTracker, reinterpret_cast<VkSamplerYcbcrConversionImageFormatProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES: {
+            transform_tohost_VkSamplerYcbcrConversionImageFormatProperties(
+                resourceTracker, reinterpret_cast<VkSamplerYcbcrConversionImageFormatProperties*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO:
-        {
-            resourceTracker->transformImpl_VkPhysicalDeviceExternalImageFormatInfo_tohost(reinterpret_cast<VkPhysicalDeviceExternalImageFormatInfo*>(structExtension_out), 1);
-            transform_tohost_VkPhysicalDeviceExternalImageFormatInfo(resourceTracker, reinterpret_cast<VkPhysicalDeviceExternalImageFormatInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO: {
+            resourceTracker->transformImpl_VkPhysicalDeviceExternalImageFormatInfo_tohost(
+                reinterpret_cast<VkPhysicalDeviceExternalImageFormatInfo*>(structExtension_out), 1);
+            transform_tohost_VkPhysicalDeviceExternalImageFormatInfo(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceExternalImageFormatInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES:
-        {
-            resourceTracker->transformImpl_VkExternalImageFormatProperties_tohost(reinterpret_cast<VkExternalImageFormatProperties*>(structExtension_out), 1);
-            transform_tohost_VkExternalImageFormatProperties(resourceTracker, reinterpret_cast<VkExternalImageFormatProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES: {
+            resourceTracker->transformImpl_VkExternalImageFormatProperties_tohost(
+                reinterpret_cast<VkExternalImageFormatProperties*>(structExtension_out), 1);
+            transform_tohost_VkExternalImageFormatProperties(
+                resourceTracker,
+                reinterpret_cast<VkExternalImageFormatProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES:
-        {
-            transform_tohost_VkPhysicalDeviceIDProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceIDProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES: {
+            transform_tohost_VkPhysicalDeviceIDProperties(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceIDProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO:
-        {
-            resourceTracker->transformImpl_VkExternalMemoryImageCreateInfo_tohost(reinterpret_cast<VkExternalMemoryImageCreateInfo*>(structExtension_out), 1);
-            transform_tohost_VkExternalMemoryImageCreateInfo(resourceTracker, reinterpret_cast<VkExternalMemoryImageCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO: {
+            resourceTracker->transformImpl_VkExternalMemoryImageCreateInfo_tohost(
+                reinterpret_cast<VkExternalMemoryImageCreateInfo*>(structExtension_out), 1);
+            transform_tohost_VkExternalMemoryImageCreateInfo(
+                resourceTracker,
+                reinterpret_cast<VkExternalMemoryImageCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO:
-        {
-            resourceTracker->transformImpl_VkExternalMemoryBufferCreateInfo_tohost(reinterpret_cast<VkExternalMemoryBufferCreateInfo*>(structExtension_out), 1);
-            transform_tohost_VkExternalMemoryBufferCreateInfo(resourceTracker, reinterpret_cast<VkExternalMemoryBufferCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO: {
+            resourceTracker->transformImpl_VkExternalMemoryBufferCreateInfo_tohost(
+                reinterpret_cast<VkExternalMemoryBufferCreateInfo*>(structExtension_out), 1);
+            transform_tohost_VkExternalMemoryBufferCreateInfo(
+                resourceTracker,
+                reinterpret_cast<VkExternalMemoryBufferCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO:
-        {
-            resourceTracker->transformImpl_VkExportMemoryAllocateInfo_tohost(reinterpret_cast<VkExportMemoryAllocateInfo*>(structExtension_out), 1);
-            transform_tohost_VkExportMemoryAllocateInfo(resourceTracker, reinterpret_cast<VkExportMemoryAllocateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO: {
+            resourceTracker->transformImpl_VkExportMemoryAllocateInfo_tohost(
+                reinterpret_cast<VkExportMemoryAllocateInfo*>(structExtension_out), 1);
+            transform_tohost_VkExportMemoryAllocateInfo(
+                resourceTracker,
+                reinterpret_cast<VkExportMemoryAllocateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO:
-        {
-            transform_tohost_VkExportFenceCreateInfo(resourceTracker, reinterpret_cast<VkExportFenceCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO: {
+            transform_tohost_VkExportFenceCreateInfo(
+                resourceTracker, reinterpret_cast<VkExportFenceCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO:
-        {
-            transform_tohost_VkExportSemaphoreCreateInfo(resourceTracker, reinterpret_cast<VkExportSemaphoreCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO: {
+            transform_tohost_VkExportSemaphoreCreateInfo(
+                resourceTracker,
+                reinterpret_cast<VkExportSemaphoreCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES:
-        {
-            transform_tohost_VkPhysicalDeviceMaintenance3Properties(resourceTracker, reinterpret_cast<VkPhysicalDeviceMaintenance3Properties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES: {
+            transform_tohost_VkPhysicalDeviceMaintenance3Properties(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceMaintenance3Properties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES:
-        {
-            transform_tohost_VkPhysicalDeviceShaderDrawParametersFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderDrawParametersFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES: {
+            transform_tohost_VkPhysicalDeviceShaderDrawParametersFeatures(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderDrawParametersFeatures*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_VERSION_1_2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES:
-        {
-            transform_tohost_VkPhysicalDeviceVulkan11Features(resourceTracker, reinterpret_cast<VkPhysicalDeviceVulkan11Features*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: {
+            transform_tohost_VkPhysicalDeviceVulkan11Features(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceVulkan11Features*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES:
-        {
-            transform_tohost_VkPhysicalDeviceVulkan11Properties(resourceTracker, reinterpret_cast<VkPhysicalDeviceVulkan11Properties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: {
+            transform_tohost_VkPhysicalDeviceVulkan11Properties(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceVulkan11Properties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES:
-        {
-            transform_tohost_VkPhysicalDeviceVulkan12Features(resourceTracker, reinterpret_cast<VkPhysicalDeviceVulkan12Features*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: {
+            transform_tohost_VkPhysicalDeviceVulkan12Features(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceVulkan12Features*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES:
-        {
-            transform_tohost_VkPhysicalDeviceVulkan12Properties(resourceTracker, reinterpret_cast<VkPhysicalDeviceVulkan12Properties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: {
+            transform_tohost_VkPhysicalDeviceVulkan12Properties(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceVulkan12Properties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO:
-        {
-            transform_tohost_VkImageFormatListCreateInfo(resourceTracker, reinterpret_cast<VkImageFormatListCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO: {
+            transform_tohost_VkImageFormatListCreateInfo(
+                resourceTracker,
+                reinterpret_cast<VkImageFormatListCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES:
-        {
-            transform_tohost_VkPhysicalDevice8BitStorageFeatures(resourceTracker, reinterpret_cast<VkPhysicalDevice8BitStorageFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES: {
+            transform_tohost_VkPhysicalDevice8BitStorageFeatures(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDevice8BitStorageFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES:
-        {
-            transform_tohost_VkPhysicalDeviceDriverProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceDriverProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES: {
+            transform_tohost_VkPhysicalDeviceDriverProperties(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceDriverProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES:
-        {
-            transform_tohost_VkPhysicalDeviceShaderAtomicInt64Features(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderAtomicInt64Features*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES: {
+            transform_tohost_VkPhysicalDeviceShaderAtomicInt64Features(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceShaderAtomicInt64Features*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES:
-        {
-            transform_tohost_VkPhysicalDeviceShaderFloat16Int8Features(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderFloat16Int8Features*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES: {
+            transform_tohost_VkPhysicalDeviceShaderFloat16Int8Features(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceShaderFloat16Int8Features*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES:
-        {
-            transform_tohost_VkPhysicalDeviceFloatControlsProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceFloatControlsProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES: {
+            transform_tohost_VkPhysicalDeviceFloatControlsProperties(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceFloatControlsProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO:
-        {
-            transform_tohost_VkDescriptorSetLayoutBindingFlagsCreateInfo(resourceTracker, reinterpret_cast<VkDescriptorSetLayoutBindingFlagsCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO: {
+            transform_tohost_VkDescriptorSetLayoutBindingFlagsCreateInfo(
+                resourceTracker, reinterpret_cast<VkDescriptorSetLayoutBindingFlagsCreateInfo*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES:
-        {
-            transform_tohost_VkPhysicalDeviceDescriptorIndexingFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceDescriptorIndexingFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES: {
+            transform_tohost_VkPhysicalDeviceDescriptorIndexingFeatures(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceDescriptorIndexingFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES:
-        {
-            transform_tohost_VkPhysicalDeviceDescriptorIndexingProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceDescriptorIndexingProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES: {
+            transform_tohost_VkPhysicalDeviceDescriptorIndexingProperties(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceDescriptorIndexingProperties*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO:
-        {
-            transform_tohost_VkDescriptorSetVariableDescriptorCountAllocateInfo(resourceTracker, reinterpret_cast<VkDescriptorSetVariableDescriptorCountAllocateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO: {
+            transform_tohost_VkDescriptorSetVariableDescriptorCountAllocateInfo(
+                resourceTracker,
+                reinterpret_cast<VkDescriptorSetVariableDescriptorCountAllocateInfo*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT:
-        {
-            transform_tohost_VkDescriptorSetVariableDescriptorCountLayoutSupport(resourceTracker, reinterpret_cast<VkDescriptorSetVariableDescriptorCountLayoutSupport*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT: {
+            transform_tohost_VkDescriptorSetVariableDescriptorCountLayoutSupport(
+                resourceTracker,
+                reinterpret_cast<VkDescriptorSetVariableDescriptorCountLayoutSupport*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE:
-        {
-            transform_tohost_VkSubpassDescriptionDepthStencilResolve(resourceTracker, reinterpret_cast<VkSubpassDescriptionDepthStencilResolve*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE: {
+            transform_tohost_VkSubpassDescriptionDepthStencilResolve(
+                resourceTracker,
+                reinterpret_cast<VkSubpassDescriptionDepthStencilResolve*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES:
-        {
-            transform_tohost_VkPhysicalDeviceDepthStencilResolveProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceDepthStencilResolveProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES: {
+            transform_tohost_VkPhysicalDeviceDepthStencilResolveProperties(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceDepthStencilResolveProperties*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES:
-        {
-            transform_tohost_VkPhysicalDeviceScalarBlockLayoutFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceScalarBlockLayoutFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES: {
+            transform_tohost_VkPhysicalDeviceScalarBlockLayoutFeatures(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceScalarBlockLayoutFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO:
-        {
-            transform_tohost_VkImageStencilUsageCreateInfo(resourceTracker, reinterpret_cast<VkImageStencilUsageCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO: {
+            transform_tohost_VkImageStencilUsageCreateInfo(
+                resourceTracker,
+                reinterpret_cast<VkImageStencilUsageCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO:
-        {
-            transform_tohost_VkSamplerReductionModeCreateInfo(resourceTracker, reinterpret_cast<VkSamplerReductionModeCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO: {
+            transform_tohost_VkSamplerReductionModeCreateInfo(
+                resourceTracker,
+                reinterpret_cast<VkSamplerReductionModeCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES:
-        {
-            transform_tohost_VkPhysicalDeviceSamplerFilterMinmaxProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceSamplerFilterMinmaxProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES: {
+            transform_tohost_VkPhysicalDeviceSamplerFilterMinmaxProperties(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceSamplerFilterMinmaxProperties*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES:
-        {
-            transform_tohost_VkPhysicalDeviceVulkanMemoryModelFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceVulkanMemoryModelFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES: {
+            transform_tohost_VkPhysicalDeviceVulkanMemoryModelFeatures(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceVulkanMemoryModelFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES:
-        {
-            transform_tohost_VkPhysicalDeviceImagelessFramebufferFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceImagelessFramebufferFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES: {
+            transform_tohost_VkPhysicalDeviceImagelessFramebufferFeatures(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceImagelessFramebufferFeatures*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO:
-        {
-            transform_tohost_VkFramebufferAttachmentsCreateInfo(resourceTracker, reinterpret_cast<VkFramebufferAttachmentsCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO: {
+            transform_tohost_VkFramebufferAttachmentsCreateInfo(
+                resourceTracker,
+                reinterpret_cast<VkFramebufferAttachmentsCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO:
-        {
-            transform_tohost_VkRenderPassAttachmentBeginInfo(resourceTracker, reinterpret_cast<VkRenderPassAttachmentBeginInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO: {
+            transform_tohost_VkRenderPassAttachmentBeginInfo(
+                resourceTracker,
+                reinterpret_cast<VkRenderPassAttachmentBeginInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES:
-        {
-            transform_tohost_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceUniformBufferStandardLayoutFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES: {
+            transform_tohost_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceUniformBufferStandardLayoutFeatures*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES:
-        {
-            transform_tohost_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES: {
+            transform_tohost_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES:
-        {
-            transform_tohost_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES: {
+            transform_tohost_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT:
-        {
-            transform_tohost_VkAttachmentReferenceStencilLayout(resourceTracker, reinterpret_cast<VkAttachmentReferenceStencilLayout*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT: {
+            transform_tohost_VkAttachmentReferenceStencilLayout(
+                resourceTracker,
+                reinterpret_cast<VkAttachmentReferenceStencilLayout*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT:
-        {
-            transform_tohost_VkAttachmentDescriptionStencilLayout(resourceTracker, reinterpret_cast<VkAttachmentDescriptionStencilLayout*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT: {
+            transform_tohost_VkAttachmentDescriptionStencilLayout(
+                resourceTracker,
+                reinterpret_cast<VkAttachmentDescriptionStencilLayout*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES:
-        {
-            transform_tohost_VkPhysicalDeviceHostQueryResetFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceHostQueryResetFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES: {
+            transform_tohost_VkPhysicalDeviceHostQueryResetFeatures(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceHostQueryResetFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES:
-        {
-            transform_tohost_VkPhysicalDeviceTimelineSemaphoreFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceTimelineSemaphoreFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES: {
+            transform_tohost_VkPhysicalDeviceTimelineSemaphoreFeatures(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceTimelineSemaphoreFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES:
-        {
-            transform_tohost_VkPhysicalDeviceTimelineSemaphoreProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceTimelineSemaphoreProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES: {
+            transform_tohost_VkPhysicalDeviceTimelineSemaphoreProperties(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceTimelineSemaphoreProperties*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO:
-        {
-            transform_tohost_VkSemaphoreTypeCreateInfo(resourceTracker, reinterpret_cast<VkSemaphoreTypeCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO: {
+            transform_tohost_VkSemaphoreTypeCreateInfo(
+                resourceTracker, reinterpret_cast<VkSemaphoreTypeCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO:
-        {
-            transform_tohost_VkTimelineSemaphoreSubmitInfo(resourceTracker, reinterpret_cast<VkTimelineSemaphoreSubmitInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO: {
+            transform_tohost_VkTimelineSemaphoreSubmitInfo(
+                resourceTracker,
+                reinterpret_cast<VkTimelineSemaphoreSubmitInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES:
-        {
-            transform_tohost_VkPhysicalDeviceBufferDeviceAddressFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceBufferDeviceAddressFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES: {
+            transform_tohost_VkPhysicalDeviceBufferDeviceAddressFeatures(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceBufferDeviceAddressFeatures*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO:
-        {
-            transform_tohost_VkBufferOpaqueCaptureAddressCreateInfo(resourceTracker, reinterpret_cast<VkBufferOpaqueCaptureAddressCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO: {
+            transform_tohost_VkBufferOpaqueCaptureAddressCreateInfo(
+                resourceTracker,
+                reinterpret_cast<VkBufferOpaqueCaptureAddressCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO:
-        {
-            transform_tohost_VkMemoryOpaqueCaptureAddressAllocateInfo(resourceTracker, reinterpret_cast<VkMemoryOpaqueCaptureAddressAllocateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO: {
+            transform_tohost_VkMemoryOpaqueCaptureAddressAllocateInfo(
+                resourceTracker,
+                reinterpret_cast<VkMemoryOpaqueCaptureAddressAllocateInfo*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_swapchain
-        case VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR:
-        {
-            transform_tohost_VkImageSwapchainCreateInfoKHR(resourceTracker, reinterpret_cast<VkImageSwapchainCreateInfoKHR*>(structExtension_out));
+        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));
+        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));
+        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));
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR: {
+            transform_tohost_VkDeviceGroupSwapchainCreateInfoKHR(
+                resourceTracker,
+                reinterpret_cast<VkDeviceGroupSwapchainCreateInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_display_swapchain
-        case VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR:
-        {
-            transform_tohost_VkDisplayPresentInfoKHR(resourceTracker, reinterpret_cast<VkDisplayPresentInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR: {
+            transform_tohost_VkDisplayPresentInfoKHR(
+                resourceTracker, reinterpret_cast<VkDisplayPresentInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_video_queue
-        case VK_STRUCTURE_TYPE_VIDEO_QUEUE_FAMILY_PROPERTIES_2_KHR:
-        {
-            transform_tohost_VkVideoQueueFamilyProperties2KHR(resourceTracker, reinterpret_cast<VkVideoQueueFamilyProperties2KHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_QUEUE_FAMILY_PROPERTIES_2_KHR: {
+            transform_tohost_VkVideoQueueFamilyProperties2KHR(
+                resourceTracker,
+                reinterpret_cast<VkVideoQueueFamilyProperties2KHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_PROFILE_KHR:
-        {
-            transform_tohost_VkVideoProfileKHR(resourceTracker, reinterpret_cast<VkVideoProfileKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_PROFILE_KHR: {
+            transform_tohost_VkVideoProfileKHR(
+                resourceTracker, reinterpret_cast<VkVideoProfileKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_PROFILES_KHR:
-        {
-            transform_tohost_VkVideoProfilesKHR(resourceTracker, reinterpret_cast<VkVideoProfilesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_PROFILES_KHR: {
+            transform_tohost_VkVideoProfilesKHR(
+                resourceTracker, reinterpret_cast<VkVideoProfilesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_dynamic_rendering
-        case VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR:
-        {
-            transform_tohost_VkPipelineRenderingCreateInfoKHR(resourceTracker, reinterpret_cast<VkPipelineRenderingCreateInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR: {
+            transform_tohost_VkPipelineRenderingCreateInfoKHR(
+                resourceTracker,
+                reinterpret_cast<VkPipelineRenderingCreateInfoKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES_KHR:
-        {
-            transform_tohost_VkPhysicalDeviceDynamicRenderingFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceDynamicRenderingFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES_KHR: {
+            transform_tohost_VkPhysicalDeviceDynamicRenderingFeaturesKHR(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceDynamicRenderingFeaturesKHR*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR:
-        {
-            transform_tohost_VkCommandBufferInheritanceRenderingInfoKHR(resourceTracker, reinterpret_cast<VkCommandBufferInheritanceRenderingInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR: {
+            transform_tohost_VkCommandBufferInheritanceRenderingInfoKHR(
+                resourceTracker,
+                reinterpret_cast<VkCommandBufferInheritanceRenderingInfoKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR:
-        {
-            transform_tohost_VkRenderingFragmentShadingRateAttachmentInfoKHR(resourceTracker, reinterpret_cast<VkRenderingFragmentShadingRateAttachmentInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR: {
+            transform_tohost_VkRenderingFragmentShadingRateAttachmentInfoKHR(
+                resourceTracker, reinterpret_cast<VkRenderingFragmentShadingRateAttachmentInfoKHR*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_INFO_EXT:
-        {
-            transform_tohost_VkRenderingFragmentDensityMapAttachmentInfoEXT(resourceTracker, reinterpret_cast<VkRenderingFragmentDensityMapAttachmentInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_INFO_EXT: {
+            transform_tohost_VkRenderingFragmentDensityMapAttachmentInfoEXT(
+                resourceTracker, reinterpret_cast<VkRenderingFragmentDensityMapAttachmentInfoEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_ATTACHMENT_SAMPLE_COUNT_INFO_AMD:
-        {
-            transform_tohost_VkAttachmentSampleCountInfoAMD(resourceTracker, reinterpret_cast<VkAttachmentSampleCountInfoAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ATTACHMENT_SAMPLE_COUNT_INFO_AMD: {
+            transform_tohost_VkAttachmentSampleCountInfoAMD(
+                resourceTracker,
+                reinterpret_cast<VkAttachmentSampleCountInfoAMD*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_MULTIVIEW_PER_VIEW_ATTRIBUTES_INFO_NVX:
-        {
-            transform_tohost_VkMultiviewPerViewAttributesInfoNVX(resourceTracker, reinterpret_cast<VkMultiviewPerViewAttributesInfoNVX*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MULTIVIEW_PER_VIEW_ATTRIBUTES_INFO_NVX: {
+            transform_tohost_VkMultiviewPerViewAttributesInfoNVX(
+                resourceTracker,
+                reinterpret_cast<VkMultiviewPerViewAttributesInfoNVX*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_external_memory_win32
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
-        {
-            transform_tohost_VkImportMemoryWin32HandleInfoKHR(resourceTracker, reinterpret_cast<VkImportMemoryWin32HandleInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR: {
+            transform_tohost_VkImportMemoryWin32HandleInfoKHR(
+                resourceTracker,
+                reinterpret_cast<VkImportMemoryWin32HandleInfoKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
-        {
-            transform_tohost_VkExportMemoryWin32HandleInfoKHR(resourceTracker, reinterpret_cast<VkExportMemoryWin32HandleInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR: {
+            transform_tohost_VkExportMemoryWin32HandleInfoKHR(
+                resourceTracker,
+                reinterpret_cast<VkExportMemoryWin32HandleInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_external_memory_fd
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR:
-        {
-            transform_tohost_VkImportMemoryFdInfoKHR(resourceTracker, reinterpret_cast<VkImportMemoryFdInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR: {
+            transform_tohost_VkImportMemoryFdInfoKHR(
+                resourceTracker, reinterpret_cast<VkImportMemoryFdInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_win32_keyed_mutex
-        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR:
-        {
-            transform_tohost_VkWin32KeyedMutexAcquireReleaseInfoKHR(resourceTracker, reinterpret_cast<VkWin32KeyedMutexAcquireReleaseInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR: {
+            transform_tohost_VkWin32KeyedMutexAcquireReleaseInfoKHR(
+                resourceTracker,
+                reinterpret_cast<VkWin32KeyedMutexAcquireReleaseInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_external_semaphore_win32
-        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR:
-        {
-            transform_tohost_VkExportSemaphoreWin32HandleInfoKHR(resourceTracker, reinterpret_cast<VkExportSemaphoreWin32HandleInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR: {
+            transform_tohost_VkExportSemaphoreWin32HandleInfoKHR(
+                resourceTracker,
+                reinterpret_cast<VkExportSemaphoreWin32HandleInfoKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR:
-        {
-            transform_tohost_VkD3D12FenceSubmitInfoKHR(resourceTracker, reinterpret_cast<VkD3D12FenceSubmitInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR: {
+            transform_tohost_VkD3D12FenceSubmitInfoKHR(
+                resourceTracker, reinterpret_cast<VkD3D12FenceSubmitInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_push_descriptor
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR:
-        {
-            transform_tohost_VkPhysicalDevicePushDescriptorPropertiesKHR(resourceTracker, reinterpret_cast<VkPhysicalDevicePushDescriptorPropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR: {
+            transform_tohost_VkPhysicalDevicePushDescriptorPropertiesKHR(
+                resourceTracker, reinterpret_cast<VkPhysicalDevicePushDescriptorPropertiesKHR*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_incremental_present
-        case VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR:
-        {
-            transform_tohost_VkPresentRegionsKHR(resourceTracker, reinterpret_cast<VkPresentRegionsKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR: {
+            transform_tohost_VkPresentRegionsKHR(
+                resourceTracker, reinterpret_cast<VkPresentRegionsKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_shared_presentable_image
-        case VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR:
-        {
-            transform_tohost_VkSharedPresentSurfaceCapabilitiesKHR(resourceTracker, reinterpret_cast<VkSharedPresentSurfaceCapabilitiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR: {
+            transform_tohost_VkSharedPresentSurfaceCapabilitiesKHR(
+                resourceTracker,
+                reinterpret_cast<VkSharedPresentSurfaceCapabilitiesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_external_fence_win32
-        case VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR:
-        {
-            transform_tohost_VkExportFenceWin32HandleInfoKHR(resourceTracker, reinterpret_cast<VkExportFenceWin32HandleInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR: {
+            transform_tohost_VkExportFenceWin32HandleInfoKHR(
+                resourceTracker,
+                reinterpret_cast<VkExportFenceWin32HandleInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_performance_query
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR:
-        {
-            transform_tohost_VkPhysicalDevicePerformanceQueryFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDevicePerformanceQueryFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR: {
+            transform_tohost_VkPhysicalDevicePerformanceQueryFeaturesKHR(
+                resourceTracker, reinterpret_cast<VkPhysicalDevicePerformanceQueryFeaturesKHR*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR:
-        {
-            transform_tohost_VkPhysicalDevicePerformanceQueryPropertiesKHR(resourceTracker, reinterpret_cast<VkPhysicalDevicePerformanceQueryPropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR: {
+            transform_tohost_VkPhysicalDevicePerformanceQueryPropertiesKHR(
+                resourceTracker, reinterpret_cast<VkPhysicalDevicePerformanceQueryPropertiesKHR*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR:
-        {
-            transform_tohost_VkQueryPoolPerformanceCreateInfoKHR(resourceTracker, reinterpret_cast<VkQueryPoolPerformanceCreateInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR: {
+            transform_tohost_VkQueryPoolPerformanceCreateInfoKHR(
+                resourceTracker,
+                reinterpret_cast<VkQueryPoolPerformanceCreateInfoKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR:
-        {
-            transform_tohost_VkPerformanceQuerySubmitInfoKHR(resourceTracker, reinterpret_cast<VkPerformanceQuerySubmitInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR: {
+            transform_tohost_VkPerformanceQuerySubmitInfoKHR(
+                resourceTracker,
+                reinterpret_cast<VkPerformanceQuerySubmitInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_portability_subset
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR:
-        {
-            transform_tohost_VkPhysicalDevicePortabilitySubsetFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDevicePortabilitySubsetFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR: {
+            transform_tohost_VkPhysicalDevicePortabilitySubsetFeaturesKHR(
+                resourceTracker, reinterpret_cast<VkPhysicalDevicePortabilitySubsetFeaturesKHR*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR:
-        {
-            transform_tohost_VkPhysicalDevicePortabilitySubsetPropertiesKHR(resourceTracker, reinterpret_cast<VkPhysicalDevicePortabilitySubsetPropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR: {
+            transform_tohost_VkPhysicalDevicePortabilitySubsetPropertiesKHR(
+                resourceTracker, reinterpret_cast<VkPhysicalDevicePortabilitySubsetPropertiesKHR*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_shader_clock
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR:
-        {
-            transform_tohost_VkPhysicalDeviceShaderClockFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderClockFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR: {
+            transform_tohost_VkPhysicalDeviceShaderClockFeaturesKHR(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceShaderClockFeaturesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_shader_terminate_invocation
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR:
-        {
-            transform_tohost_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR: {
+            transform_tohost_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_fragment_shading_rate
-        case VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR:
-        {
-            transform_tohost_VkFragmentShadingRateAttachmentInfoKHR(resourceTracker, reinterpret_cast<VkFragmentShadingRateAttachmentInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR: {
+            transform_tohost_VkFragmentShadingRateAttachmentInfoKHR(
+                resourceTracker,
+                reinterpret_cast<VkFragmentShadingRateAttachmentInfoKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR:
-        {
-            transform_tohost_VkPipelineFragmentShadingRateStateCreateInfoKHR(resourceTracker, reinterpret_cast<VkPipelineFragmentShadingRateStateCreateInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR: {
+            transform_tohost_VkPipelineFragmentShadingRateStateCreateInfoKHR(
+                resourceTracker, reinterpret_cast<VkPipelineFragmentShadingRateStateCreateInfoKHR*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR:
-        {
-            transform_tohost_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentShadingRateFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR: {
+            transform_tohost_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentShadingRateFeaturesKHR*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR:
-        {
-            transform_tohost_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentShadingRatePropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR: {
+            transform_tohost_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceFragmentShadingRatePropertiesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_surface_protected_capabilities
-        case VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR:
-        {
-            transform_tohost_VkSurfaceProtectedCapabilitiesKHR(resourceTracker, reinterpret_cast<VkSurfaceProtectedCapabilitiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR: {
+            transform_tohost_VkSurfaceProtectedCapabilitiesKHR(
+                resourceTracker,
+                reinterpret_cast<VkSurfaceProtectedCapabilitiesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_present_wait
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR:
-        {
-            transform_tohost_VkPhysicalDevicePresentWaitFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDevicePresentWaitFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR: {
+            transform_tohost_VkPhysicalDevicePresentWaitFeaturesKHR(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDevicePresentWaitFeaturesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_pipeline_executable_properties
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR:
-        {
-            transform_tohost_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR: {
+            transform_tohost_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_shader_integer_dot_product
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR:
-        {
-            transform_tohost_VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR: {
+            transform_tohost_VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES_KHR:
-        {
-            transform_tohost_VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES_KHR: {
+            transform_tohost_VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_present_id
-        case VK_STRUCTURE_TYPE_PRESENT_ID_KHR:
-        {
-            transform_tohost_VkPresentIdKHR(resourceTracker, reinterpret_cast<VkPresentIdKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PRESENT_ID_KHR: {
+            transform_tohost_VkPresentIdKHR(resourceTracker,
+                                            reinterpret_cast<VkPresentIdKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR:
-        {
-            transform_tohost_VkPhysicalDevicePresentIdFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDevicePresentIdFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR: {
+            transform_tohost_VkPhysicalDevicePresentIdFeaturesKHR(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDevicePresentIdFeaturesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_video_encode_queue
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_INFO_KHR:
-        {
-            transform_tohost_VkVideoEncodeRateControlInfoKHR(resourceTracker, reinterpret_cast<VkVideoEncodeRateControlInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_INFO_KHR: {
+            transform_tohost_VkVideoEncodeRateControlInfoKHR(
+                resourceTracker,
+                reinterpret_cast<VkVideoEncodeRateControlInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_synchronization2
-        case VK_STRUCTURE_TYPE_MEMORY_BARRIER_2_KHR:
-        {
-            transform_tohost_VkMemoryBarrier2KHR(resourceTracker, reinterpret_cast<VkMemoryBarrier2KHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MEMORY_BARRIER_2_KHR: {
+            transform_tohost_VkMemoryBarrier2KHR(
+                resourceTracker, reinterpret_cast<VkMemoryBarrier2KHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR:
-        {
-            transform_tohost_VkPhysicalDeviceSynchronization2FeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceSynchronization2FeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR: {
+            transform_tohost_VkPhysicalDeviceSynchronization2FeaturesKHR(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceSynchronization2FeaturesKHR*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_2_NV:
-        {
-            transform_tohost_VkQueueFamilyCheckpointProperties2NV(resourceTracker, reinterpret_cast<VkQueueFamilyCheckpointProperties2NV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_2_NV: {
+            transform_tohost_VkQueueFamilyCheckpointProperties2NV(
+                resourceTracker,
+                reinterpret_cast<VkQueueFamilyCheckpointProperties2NV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_shader_subgroup_uniform_control_flow
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR:
-        {
-            transform_tohost_VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR: {
+            transform_tohost_VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_zero_initialize_workgroup_memory
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR:
-        {
-            transform_tohost_VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR: {
+            transform_tohost_VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_workgroup_memory_explicit_layout
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR:
-        {
-            transform_tohost_VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR: {
+            transform_tohost_VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_format_feature_flags2
-        case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR:
-        {
-            transform_tohost_VkFormatProperties3KHR(resourceTracker, reinterpret_cast<VkFormatProperties3KHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR: {
+            transform_tohost_VkFormatProperties3KHR(
+                resourceTracker, reinterpret_cast<VkFormatProperties3KHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_maintenance4
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES_KHR:
-        {
-            transform_tohost_VkPhysicalDeviceMaintenance4FeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceMaintenance4FeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES_KHR: {
+            transform_tohost_VkPhysicalDeviceMaintenance4FeaturesKHR(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceMaintenance4FeaturesKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES_KHR:
-        {
-            transform_tohost_VkPhysicalDeviceMaintenance4PropertiesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceMaintenance4PropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES_KHR: {
+            transform_tohost_VkPhysicalDeviceMaintenance4PropertiesKHR(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceMaintenance4PropertiesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_ANDROID_native_buffer
-        case VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID:
-        {
-            transform_tohost_VkNativeBufferANDROID(resourceTracker, reinterpret_cast<VkNativeBufferANDROID*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID: {
+            transform_tohost_VkNativeBufferANDROID(
+                resourceTracker, reinterpret_cast<VkNativeBufferANDROID*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_debug_report
-        case VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT:
-        {
-            transform_tohost_VkDebugReportCallbackCreateInfoEXT(resourceTracker, reinterpret_cast<VkDebugReportCallbackCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT: {
+            transform_tohost_VkDebugReportCallbackCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkDebugReportCallbackCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_rasterization_order
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD:
-        {
-            transform_tohost_VkPipelineRasterizationStateRasterizationOrderAMD(resourceTracker, reinterpret_cast<VkPipelineRasterizationStateRasterizationOrderAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD: {
+            transform_tohost_VkPipelineRasterizationStateRasterizationOrderAMD(
+                resourceTracker,
+                reinterpret_cast<VkPipelineRasterizationStateRasterizationOrderAMD*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_dedicated_allocation
-        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV:
-        {
-            transform_tohost_VkDedicatedAllocationImageCreateInfoNV(resourceTracker, reinterpret_cast<VkDedicatedAllocationImageCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV: {
+            transform_tohost_VkDedicatedAllocationImageCreateInfoNV(
+                resourceTracker,
+                reinterpret_cast<VkDedicatedAllocationImageCreateInfoNV*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV:
-        {
-            transform_tohost_VkDedicatedAllocationBufferCreateInfoNV(resourceTracker, reinterpret_cast<VkDedicatedAllocationBufferCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV: {
+            transform_tohost_VkDedicatedAllocationBufferCreateInfoNV(
+                resourceTracker,
+                reinterpret_cast<VkDedicatedAllocationBufferCreateInfoNV*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV:
-        {
-            transform_tohost_VkDedicatedAllocationMemoryAllocateInfoNV(resourceTracker, reinterpret_cast<VkDedicatedAllocationMemoryAllocateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV: {
+            transform_tohost_VkDedicatedAllocationMemoryAllocateInfoNV(
+                resourceTracker,
+                reinterpret_cast<VkDedicatedAllocationMemoryAllocateInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_transform_feedback
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceTransformFeedbackFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceTransformFeedbackFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDeviceTransformFeedbackFeaturesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceTransformFeedbackFeaturesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceTransformFeedbackPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceTransformFeedbackPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT: {
+            transform_tohost_VkPhysicalDeviceTransformFeedbackPropertiesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceTransformFeedbackPropertiesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT:
-        {
-            transform_tohost_VkPipelineRasterizationStateStreamCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineRasterizationStateStreamCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT: {
+            transform_tohost_VkPipelineRasterizationStateStreamCreateInfoEXT(
+                resourceTracker, reinterpret_cast<VkPipelineRasterizationStateStreamCreateInfoEXT*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_video_encode_h264
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_EXT:
-        {
-            transform_tohost_VkVideoEncodeH264CapabilitiesEXT(resourceTracker, reinterpret_cast<VkVideoEncodeH264CapabilitiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_EXT: {
+            transform_tohost_VkVideoEncodeH264CapabilitiesEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoEncodeH264CapabilitiesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_CREATE_INFO_EXT:
-        {
-            transform_tohost_VkVideoEncodeH264SessionCreateInfoEXT(resourceTracker, reinterpret_cast<VkVideoEncodeH264SessionCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_CREATE_INFO_EXT: {
+            transform_tohost_VkVideoEncodeH264SessionCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoEncodeH264SessionCreateInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
-            transform_tohost_VkVideoEncodeH264SessionParametersAddInfoEXT(resourceTracker, reinterpret_cast<VkVideoEncodeH264SessionParametersAddInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT: {
+            transform_tohost_VkVideoEncodeH264SessionParametersAddInfoEXT(
+                resourceTracker, reinterpret_cast<VkVideoEncodeH264SessionParametersAddInfoEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
-            transform_tohost_VkVideoEncodeH264SessionParametersCreateInfoEXT(resourceTracker, reinterpret_cast<VkVideoEncodeH264SessionParametersCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT: {
+            transform_tohost_VkVideoEncodeH264SessionParametersCreateInfoEXT(
+                resourceTracker, reinterpret_cast<VkVideoEncodeH264SessionParametersCreateInfoEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_VCL_FRAME_INFO_EXT:
-        {
-            transform_tohost_VkVideoEncodeH264VclFrameInfoEXT(resourceTracker, reinterpret_cast<VkVideoEncodeH264VclFrameInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_VCL_FRAME_INFO_EXT: {
+            transform_tohost_VkVideoEncodeH264VclFrameInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoEncodeH264VclFrameInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_EMIT_PICTURE_PARAMETERS_EXT:
-        {
-            transform_tohost_VkVideoEncodeH264EmitPictureParametersEXT(resourceTracker, reinterpret_cast<VkVideoEncodeH264EmitPictureParametersEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_EMIT_PICTURE_PARAMETERS_EXT: {
+            transform_tohost_VkVideoEncodeH264EmitPictureParametersEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoEncodeH264EmitPictureParametersEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_EXT:
-        {
-            transform_tohost_VkVideoEncodeH264ProfileEXT(resourceTracker, reinterpret_cast<VkVideoEncodeH264ProfileEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_EXT: {
+            transform_tohost_VkVideoEncodeH264ProfileEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoEncodeH264ProfileEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_video_encode_h265
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_EXT:
-        {
-            transform_tohost_VkVideoEncodeH265CapabilitiesEXT(resourceTracker, reinterpret_cast<VkVideoEncodeH265CapabilitiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_EXT: {
+            transform_tohost_VkVideoEncodeH265CapabilitiesEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoEncodeH265CapabilitiesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_CREATE_INFO_EXT:
-        {
-            transform_tohost_VkVideoEncodeH265SessionCreateInfoEXT(resourceTracker, reinterpret_cast<VkVideoEncodeH265SessionCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_CREATE_INFO_EXT: {
+            transform_tohost_VkVideoEncodeH265SessionCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoEncodeH265SessionCreateInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
-            transform_tohost_VkVideoEncodeH265SessionParametersAddInfoEXT(resourceTracker, reinterpret_cast<VkVideoEncodeH265SessionParametersAddInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT: {
+            transform_tohost_VkVideoEncodeH265SessionParametersAddInfoEXT(
+                resourceTracker, reinterpret_cast<VkVideoEncodeH265SessionParametersAddInfoEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
-            transform_tohost_VkVideoEncodeH265SessionParametersCreateInfoEXT(resourceTracker, reinterpret_cast<VkVideoEncodeH265SessionParametersCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT: {
+            transform_tohost_VkVideoEncodeH265SessionParametersCreateInfoEXT(
+                resourceTracker, reinterpret_cast<VkVideoEncodeH265SessionParametersCreateInfoEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_VCL_FRAME_INFO_EXT:
-        {
-            transform_tohost_VkVideoEncodeH265VclFrameInfoEXT(resourceTracker, reinterpret_cast<VkVideoEncodeH265VclFrameInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_VCL_FRAME_INFO_EXT: {
+            transform_tohost_VkVideoEncodeH265VclFrameInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoEncodeH265VclFrameInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_EMIT_PICTURE_PARAMETERS_EXT:
-        {
-            transform_tohost_VkVideoEncodeH265EmitPictureParametersEXT(resourceTracker, reinterpret_cast<VkVideoEncodeH265EmitPictureParametersEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_EMIT_PICTURE_PARAMETERS_EXT: {
+            transform_tohost_VkVideoEncodeH265EmitPictureParametersEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoEncodeH265EmitPictureParametersEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_EXT:
-        {
-            transform_tohost_VkVideoEncodeH265ProfileEXT(resourceTracker, reinterpret_cast<VkVideoEncodeH265ProfileEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_EXT: {
+            transform_tohost_VkVideoEncodeH265ProfileEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoEncodeH265ProfileEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_video_decode_h264
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_EXT:
-        {
-            transform_tohost_VkVideoDecodeH264ProfileEXT(resourceTracker, reinterpret_cast<VkVideoDecodeH264ProfileEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_EXT: {
+            transform_tohost_VkVideoDecodeH264ProfileEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoDecodeH264ProfileEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT:
-        {
-            transform_tohost_VkVideoDecodeH264CapabilitiesEXT(resourceTracker, reinterpret_cast<VkVideoDecodeH264CapabilitiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT: {
+            transform_tohost_VkVideoDecodeH264CapabilitiesEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoDecodeH264CapabilitiesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_CREATE_INFO_EXT:
-        {
-            transform_tohost_VkVideoDecodeH264SessionCreateInfoEXT(resourceTracker, reinterpret_cast<VkVideoDecodeH264SessionCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_CREATE_INFO_EXT: {
+            transform_tohost_VkVideoDecodeH264SessionCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoDecodeH264SessionCreateInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
-            transform_tohost_VkVideoDecodeH264SessionParametersAddInfoEXT(resourceTracker, reinterpret_cast<VkVideoDecodeH264SessionParametersAddInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT: {
+            transform_tohost_VkVideoDecodeH264SessionParametersAddInfoEXT(
+                resourceTracker, reinterpret_cast<VkVideoDecodeH264SessionParametersAddInfoEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
-            transform_tohost_VkVideoDecodeH264SessionParametersCreateInfoEXT(resourceTracker, reinterpret_cast<VkVideoDecodeH264SessionParametersCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT: {
+            transform_tohost_VkVideoDecodeH264SessionParametersCreateInfoEXT(
+                resourceTracker, reinterpret_cast<VkVideoDecodeH264SessionParametersCreateInfoEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT:
-        {
-            transform_tohost_VkVideoDecodeH264PictureInfoEXT(resourceTracker, reinterpret_cast<VkVideoDecodeH264PictureInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT: {
+            transform_tohost_VkVideoDecodeH264PictureInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoDecodeH264PictureInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_MVC_EXT:
-        {
-            transform_tohost_VkVideoDecodeH264MvcEXT(resourceTracker, reinterpret_cast<VkVideoDecodeH264MvcEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_MVC_EXT: {
+            transform_tohost_VkVideoDecodeH264MvcEXT(
+                resourceTracker, reinterpret_cast<VkVideoDecodeH264MvcEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT:
-        {
-            transform_tohost_VkVideoDecodeH264DpbSlotInfoEXT(resourceTracker, reinterpret_cast<VkVideoDecodeH264DpbSlotInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT: {
+            transform_tohost_VkVideoDecodeH264DpbSlotInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoDecodeH264DpbSlotInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_texture_gather_bias_lod
-        case VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD:
-        {
-            transform_tohost_VkTextureLODGatherFormatPropertiesAMD(resourceTracker, reinterpret_cast<VkTextureLODGatherFormatPropertiesAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD: {
+            transform_tohost_VkTextureLODGatherFormatPropertiesAMD(
+                resourceTracker,
+                reinterpret_cast<VkTextureLODGatherFormatPropertiesAMD*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_corner_sampled_image
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV:
-        {
-            transform_tohost_VkPhysicalDeviceCornerSampledImageFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceCornerSampledImageFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV: {
+            transform_tohost_VkPhysicalDeviceCornerSampledImageFeaturesNV(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceCornerSampledImageFeaturesNV*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_external_memory
-        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV:
-        {
-            transform_tohost_VkExternalMemoryImageCreateInfoNV(resourceTracker, reinterpret_cast<VkExternalMemoryImageCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV: {
+            transform_tohost_VkExternalMemoryImageCreateInfoNV(
+                resourceTracker,
+                reinterpret_cast<VkExternalMemoryImageCreateInfoNV*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV:
-        {
-            transform_tohost_VkExportMemoryAllocateInfoNV(resourceTracker, reinterpret_cast<VkExportMemoryAllocateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV: {
+            transform_tohost_VkExportMemoryAllocateInfoNV(
+                resourceTracker,
+                reinterpret_cast<VkExportMemoryAllocateInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_external_memory_win32
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV:
-        {
-            transform_tohost_VkImportMemoryWin32HandleInfoNV(resourceTracker, reinterpret_cast<VkImportMemoryWin32HandleInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV: {
+            transform_tohost_VkImportMemoryWin32HandleInfoNV(
+                resourceTracker,
+                reinterpret_cast<VkImportMemoryWin32HandleInfoNV*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV:
-        {
-            transform_tohost_VkExportMemoryWin32HandleInfoNV(resourceTracker, reinterpret_cast<VkExportMemoryWin32HandleInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV: {
+            transform_tohost_VkExportMemoryWin32HandleInfoNV(
+                resourceTracker,
+                reinterpret_cast<VkExportMemoryWin32HandleInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_win32_keyed_mutex
-        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV:
-        {
-            transform_tohost_VkWin32KeyedMutexAcquireReleaseInfoNV(resourceTracker, reinterpret_cast<VkWin32KeyedMutexAcquireReleaseInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV: {
+            transform_tohost_VkWin32KeyedMutexAcquireReleaseInfoNV(
+                resourceTracker,
+                reinterpret_cast<VkWin32KeyedMutexAcquireReleaseInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_validation_flags
-        case VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT:
-        {
-            transform_tohost_VkValidationFlagsEXT(resourceTracker, reinterpret_cast<VkValidationFlagsEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT: {
+            transform_tohost_VkValidationFlagsEXT(
+                resourceTracker, reinterpret_cast<VkValidationFlagsEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_texture_compression_astc_hdr
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_astc_decode_mode
-        case VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT:
-        {
-            transform_tohost_VkImageViewASTCDecodeModeEXT(resourceTracker, reinterpret_cast<VkImageViewASTCDecodeModeEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT: {
+            transform_tohost_VkImageViewASTCDecodeModeEXT(
+                resourceTracker,
+                reinterpret_cast<VkImageViewASTCDecodeModeEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceASTCDecodeFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceASTCDecodeFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDeviceASTCDecodeFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceASTCDecodeFeaturesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_conditional_rendering
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceConditionalRenderingFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceConditionalRenderingFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceConditionalRenderingFeaturesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT:
-        {
-            transform_tohost_VkCommandBufferInheritanceConditionalRenderingInfoEXT(resourceTracker, reinterpret_cast<VkCommandBufferInheritanceConditionalRenderingInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT: {
+            transform_tohost_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkCommandBufferInheritanceConditionalRenderingInfoEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_clip_space_w_scaling
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV:
-        {
-            transform_tohost_VkPipelineViewportWScalingStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineViewportWScalingStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV: {
+            transform_tohost_VkPipelineViewportWScalingStateCreateInfoNV(
+                resourceTracker, reinterpret_cast<VkPipelineViewportWScalingStateCreateInfoNV*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_display_control
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT:
-        {
-            transform_tohost_VkSwapchainCounterCreateInfoEXT(resourceTracker, reinterpret_cast<VkSwapchainCounterCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT: {
+            transform_tohost_VkSwapchainCounterCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkSwapchainCounterCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_GOOGLE_display_timing
-        case VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE:
-        {
-            transform_tohost_VkPresentTimesInfoGOOGLE(resourceTracker, reinterpret_cast<VkPresentTimesInfoGOOGLE*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE: {
+            transform_tohost_VkPresentTimesInfoGOOGLE(
+                resourceTracker, reinterpret_cast<VkPresentTimesInfoGOOGLE*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NVX_multiview_per_view_attributes
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX:
-        {
-            transform_tohost_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(resourceTracker, reinterpret_cast<VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX: {
+            transform_tohost_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_viewport_swizzle
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV:
-        {
-            transform_tohost_VkPipelineViewportSwizzleStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineViewportSwizzleStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV: {
+            transform_tohost_VkPipelineViewportSwizzleStateCreateInfoNV(
+                resourceTracker,
+                reinterpret_cast<VkPipelineViewportSwizzleStateCreateInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_discard_rectangles
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceDiscardRectanglePropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceDiscardRectanglePropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT: {
+            transform_tohost_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceDiscardRectanglePropertiesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT:
-        {
-            transform_tohost_VkPipelineDiscardRectangleStateCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineDiscardRectangleStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT: {
+            transform_tohost_VkPipelineDiscardRectangleStateCreateInfoEXT(
+                resourceTracker, reinterpret_cast<VkPipelineDiscardRectangleStateCreateInfoEXT*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_conservative_rasterization
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceConservativeRasterizationPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT: {
+            transform_tohost_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceConservativeRasterizationPropertiesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT:
-        {
-            transform_tohost_VkPipelineRasterizationConservativeStateCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineRasterizationConservativeStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT: {
+            transform_tohost_VkPipelineRasterizationConservativeStateCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkPipelineRasterizationConservativeStateCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_depth_clip_enable
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceDepthClipEnableFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceDepthClipEnableFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDeviceDepthClipEnableFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceDepthClipEnableFeaturesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT:
-        {
-            transform_tohost_VkPipelineRasterizationDepthClipStateCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineRasterizationDepthClipStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT: {
+            transform_tohost_VkPipelineRasterizationDepthClipStateCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkPipelineRasterizationDepthClipStateCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_debug_utils
-        case VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT:
-        {
-            transform_tohost_VkDebugUtilsMessengerCreateInfoEXT(resourceTracker, reinterpret_cast<VkDebugUtilsMessengerCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT: {
+            transform_tohost_VkDebugUtilsMessengerCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkDebugUtilsMessengerCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
-        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID:
-        {
-            transform_tohost_VkAndroidHardwareBufferUsageANDROID(resourceTracker, reinterpret_cast<VkAndroidHardwareBufferUsageANDROID*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID: {
+            transform_tohost_VkAndroidHardwareBufferUsageANDROID(
+                resourceTracker,
+                reinterpret_cast<VkAndroidHardwareBufferUsageANDROID*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID:
-        {
-            transform_tohost_VkAndroidHardwareBufferFormatPropertiesANDROID(resourceTracker, reinterpret_cast<VkAndroidHardwareBufferFormatPropertiesANDROID*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID: {
+            transform_tohost_VkAndroidHardwareBufferFormatPropertiesANDROID(
+                resourceTracker, reinterpret_cast<VkAndroidHardwareBufferFormatPropertiesANDROID*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID:
-        {
-            transform_tohost_VkImportAndroidHardwareBufferInfoANDROID(resourceTracker, reinterpret_cast<VkImportAndroidHardwareBufferInfoANDROID*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID: {
+            transform_tohost_VkImportAndroidHardwareBufferInfoANDROID(
+                resourceTracker,
+                reinterpret_cast<VkImportAndroidHardwareBufferInfoANDROID*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID:
-        {
-            transform_tohost_VkExternalFormatANDROID(resourceTracker, reinterpret_cast<VkExternalFormatANDROID*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID: {
+            transform_tohost_VkExternalFormatANDROID(
+                resourceTracker, reinterpret_cast<VkExternalFormatANDROID*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_2_ANDROID:
-        {
-            transform_tohost_VkAndroidHardwareBufferFormatProperties2ANDROID(resourceTracker, reinterpret_cast<VkAndroidHardwareBufferFormatProperties2ANDROID*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_2_ANDROID: {
+            transform_tohost_VkAndroidHardwareBufferFormatProperties2ANDROID(
+                resourceTracker, reinterpret_cast<VkAndroidHardwareBufferFormatProperties2ANDROID*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_inline_uniform_block
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceInlineUniformBlockFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceInlineUniformBlockFeaturesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceInlineUniformBlockPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT: {
+            transform_tohost_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceInlineUniformBlockPropertiesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT:
-        {
-            transform_tohost_VkWriteDescriptorSetInlineUniformBlockEXT(resourceTracker, reinterpret_cast<VkWriteDescriptorSetInlineUniformBlockEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT: {
+            transform_tohost_VkWriteDescriptorSetInlineUniformBlockEXT(
+                resourceTracker,
+                reinterpret_cast<VkWriteDescriptorSetInlineUniformBlockEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT:
-        {
-            transform_tohost_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(resourceTracker, reinterpret_cast<VkDescriptorPoolInlineUniformBlockCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT: {
+            transform_tohost_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(
+                resourceTracker, reinterpret_cast<VkDescriptorPoolInlineUniformBlockCreateInfoEXT*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_sample_locations
-        case VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT:
-        {
-            transform_tohost_VkSampleLocationsInfoEXT(resourceTracker, reinterpret_cast<VkSampleLocationsInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT: {
+            transform_tohost_VkSampleLocationsInfoEXT(
+                resourceTracker, reinterpret_cast<VkSampleLocationsInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT:
-        {
-            transform_tohost_VkRenderPassSampleLocationsBeginInfoEXT(resourceTracker, reinterpret_cast<VkRenderPassSampleLocationsBeginInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT: {
+            transform_tohost_VkRenderPassSampleLocationsBeginInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkRenderPassSampleLocationsBeginInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT:
-        {
-            transform_tohost_VkPipelineSampleLocationsStateCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineSampleLocationsStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT: {
+            transform_tohost_VkPipelineSampleLocationsStateCreateInfoEXT(
+                resourceTracker, reinterpret_cast<VkPipelineSampleLocationsStateCreateInfoEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceSampleLocationsPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceSampleLocationsPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT: {
+            transform_tohost_VkPhysicalDeviceSampleLocationsPropertiesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceSampleLocationsPropertiesEXT*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_blend_operation_advanced
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT: {
+            transform_tohost_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT:
-        {
-            transform_tohost_VkPipelineColorBlendAdvancedStateCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineColorBlendAdvancedStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT: {
+            transform_tohost_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
+                resourceTracker, reinterpret_cast<VkPipelineColorBlendAdvancedStateCreateInfoEXT*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_fragment_coverage_to_color
-        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV:
-        {
-            transform_tohost_VkPipelineCoverageToColorStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineCoverageToColorStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV: {
+            transform_tohost_VkPipelineCoverageToColorStateCreateInfoNV(
+                resourceTracker,
+                reinterpret_cast<VkPipelineCoverageToColorStateCreateInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_framebuffer_mixed_samples
-        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV:
-        {
-            transform_tohost_VkPipelineCoverageModulationStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineCoverageModulationStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV: {
+            transform_tohost_VkPipelineCoverageModulationStateCreateInfoNV(
+                resourceTracker, reinterpret_cast<VkPipelineCoverageModulationStateCreateInfoNV*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_shader_sm_builtins
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV:
-        {
-            transform_tohost_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderSMBuiltinsPropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV: {
+            transform_tohost_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderSMBuiltinsPropertiesNV*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV:
-        {
-            transform_tohost_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderSMBuiltinsFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV: {
+            transform_tohost_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceShaderSMBuiltinsFeaturesNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_image_drm_format_modifier
-        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT:
-        {
-            transform_tohost_VkDrmFormatModifierPropertiesListEXT(resourceTracker, reinterpret_cast<VkDrmFormatModifierPropertiesListEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT: {
+            transform_tohost_VkDrmFormatModifierPropertiesListEXT(
+                resourceTracker,
+                reinterpret_cast<VkDrmFormatModifierPropertiesListEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceImageDrmFormatModifierInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT: {
+            transform_tohost_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceImageDrmFormatModifierInfoEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT:
-        {
-            transform_tohost_VkImageDrmFormatModifierListCreateInfoEXT(resourceTracker, reinterpret_cast<VkImageDrmFormatModifierListCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT: {
+            transform_tohost_VkImageDrmFormatModifierListCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkImageDrmFormatModifierListCreateInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT:
-        {
-            transform_tohost_VkImageDrmFormatModifierExplicitCreateInfoEXT(resourceTracker, reinterpret_cast<VkImageDrmFormatModifierExplicitCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT: {
+            transform_tohost_VkImageDrmFormatModifierExplicitCreateInfoEXT(
+                resourceTracker, reinterpret_cast<VkImageDrmFormatModifierExplicitCreateInfoEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_2_EXT:
-        {
-            transform_tohost_VkDrmFormatModifierPropertiesList2EXT(resourceTracker, reinterpret_cast<VkDrmFormatModifierPropertiesList2EXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_2_EXT: {
+            transform_tohost_VkDrmFormatModifierPropertiesList2EXT(
+                resourceTracker,
+                reinterpret_cast<VkDrmFormatModifierPropertiesList2EXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_validation_cache
-        case VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT:
-        {
-            transform_tohost_VkShaderModuleValidationCacheCreateInfoEXT(resourceTracker, reinterpret_cast<VkShaderModuleValidationCacheCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT: {
+            transform_tohost_VkShaderModuleValidationCacheCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkShaderModuleValidationCacheCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_shading_rate_image
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV:
-        {
-            transform_tohost_VkPipelineViewportShadingRateImageStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineViewportShadingRateImageStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV: {
+            transform_tohost_VkPipelineViewportShadingRateImageStateCreateInfoNV(
+                resourceTracker,
+                reinterpret_cast<VkPipelineViewportShadingRateImageStateCreateInfoNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV:
-        {
-            transform_tohost_VkPhysicalDeviceShadingRateImageFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceShadingRateImageFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV: {
+            transform_tohost_VkPhysicalDeviceShadingRateImageFeaturesNV(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceShadingRateImageFeaturesNV*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV:
-        {
-            transform_tohost_VkPhysicalDeviceShadingRateImagePropertiesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceShadingRateImagePropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV: {
+            transform_tohost_VkPhysicalDeviceShadingRateImagePropertiesNV(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceShadingRateImagePropertiesNV*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV:
-        {
-            transform_tohost_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineViewportCoarseSampleOrderStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV: {
+            transform_tohost_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(
+                resourceTracker,
+                reinterpret_cast<VkPipelineViewportCoarseSampleOrderStateCreateInfoNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_ray_tracing
-        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV:
-        {
-            transform_tohost_VkWriteDescriptorSetAccelerationStructureNV(resourceTracker, reinterpret_cast<VkWriteDescriptorSetAccelerationStructureNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV: {
+            transform_tohost_VkWriteDescriptorSetAccelerationStructureNV(
+                resourceTracker, reinterpret_cast<VkWriteDescriptorSetAccelerationStructureNV*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV:
-        {
-            transform_tohost_VkPhysicalDeviceRayTracingPropertiesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceRayTracingPropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV: {
+            transform_tohost_VkPhysicalDeviceRayTracingPropertiesNV(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceRayTracingPropertiesNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_representative_fragment_test
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV:
-        {
-            transform_tohost_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV: {
+            transform_tohost_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV:
-        {
-            transform_tohost_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineRepresentativeFragmentTestStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV: {
+            transform_tohost_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(
+                resourceTracker,
+                reinterpret_cast<VkPipelineRepresentativeFragmentTestStateCreateInfoNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_filter_cubic
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceImageViewImageFormatInfoEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceImageViewImageFormatInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT: {
+            transform_tohost_VkPhysicalDeviceImageViewImageFormatInfoEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceImageViewImageFormatInfoEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT:
-        {
-            transform_tohost_VkFilterCubicImageViewImageFormatPropertiesEXT(resourceTracker, reinterpret_cast<VkFilterCubicImageViewImageFormatPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT: {
+            transform_tohost_VkFilterCubicImageViewImageFormatPropertiesEXT(
+                resourceTracker, reinterpret_cast<VkFilterCubicImageViewImageFormatPropertiesEXT*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_global_priority
-        case VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT:
-        {
-            transform_tohost_VkDeviceQueueGlobalPriorityCreateInfoEXT(resourceTracker, reinterpret_cast<VkDeviceQueueGlobalPriorityCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT: {
+            transform_tohost_VkDeviceQueueGlobalPriorityCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkDeviceQueueGlobalPriorityCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_external_memory_host
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT:
-        {
-            transform_tohost_VkImportMemoryHostPointerInfoEXT(resourceTracker, reinterpret_cast<VkImportMemoryHostPointerInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT: {
+            transform_tohost_VkImportMemoryHostPointerInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkImportMemoryHostPointerInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceExternalMemoryHostPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT: {
+            transform_tohost_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceExternalMemoryHostPropertiesEXT*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_pipeline_compiler_control
-        case VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD:
-        {
-            transform_tohost_VkPipelineCompilerControlCreateInfoAMD(resourceTracker, reinterpret_cast<VkPipelineCompilerControlCreateInfoAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD: {
+            transform_tohost_VkPipelineCompilerControlCreateInfoAMD(
+                resourceTracker,
+                reinterpret_cast<VkPipelineCompilerControlCreateInfoAMD*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_shader_core_properties
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD:
-        {
-            transform_tohost_VkPhysicalDeviceShaderCorePropertiesAMD(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderCorePropertiesAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD: {
+            transform_tohost_VkPhysicalDeviceShaderCorePropertiesAMD(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceShaderCorePropertiesAMD*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_video_decode_h265
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_EXT:
-        {
-            transform_tohost_VkVideoDecodeH265ProfileEXT(resourceTracker, reinterpret_cast<VkVideoDecodeH265ProfileEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_EXT: {
+            transform_tohost_VkVideoDecodeH265ProfileEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoDecodeH265ProfileEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT:
-        {
-            transform_tohost_VkVideoDecodeH265CapabilitiesEXT(resourceTracker, reinterpret_cast<VkVideoDecodeH265CapabilitiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT: {
+            transform_tohost_VkVideoDecodeH265CapabilitiesEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoDecodeH265CapabilitiesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_CREATE_INFO_EXT:
-        {
-            transform_tohost_VkVideoDecodeH265SessionCreateInfoEXT(resourceTracker, reinterpret_cast<VkVideoDecodeH265SessionCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_CREATE_INFO_EXT: {
+            transform_tohost_VkVideoDecodeH265SessionCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoDecodeH265SessionCreateInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
-            transform_tohost_VkVideoDecodeH265SessionParametersAddInfoEXT(resourceTracker, reinterpret_cast<VkVideoDecodeH265SessionParametersAddInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT: {
+            transform_tohost_VkVideoDecodeH265SessionParametersAddInfoEXT(
+                resourceTracker, reinterpret_cast<VkVideoDecodeH265SessionParametersAddInfoEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
-            transform_tohost_VkVideoDecodeH265SessionParametersCreateInfoEXT(resourceTracker, reinterpret_cast<VkVideoDecodeH265SessionParametersCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT: {
+            transform_tohost_VkVideoDecodeH265SessionParametersCreateInfoEXT(
+                resourceTracker, reinterpret_cast<VkVideoDecodeH265SessionParametersCreateInfoEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT:
-        {
-            transform_tohost_VkVideoDecodeH265PictureInfoEXT(resourceTracker, reinterpret_cast<VkVideoDecodeH265PictureInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT: {
+            transform_tohost_VkVideoDecodeH265PictureInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoDecodeH265PictureInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT:
-        {
-            transform_tohost_VkVideoDecodeH265DpbSlotInfoEXT(resourceTracker, reinterpret_cast<VkVideoDecodeH265DpbSlotInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT: {
+            transform_tohost_VkVideoDecodeH265DpbSlotInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoDecodeH265DpbSlotInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_memory_overallocation_behavior
-        case VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD:
-        {
-            transform_tohost_VkDeviceMemoryOverallocationCreateInfoAMD(resourceTracker, reinterpret_cast<VkDeviceMemoryOverallocationCreateInfoAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD: {
+            transform_tohost_VkDeviceMemoryOverallocationCreateInfoAMD(
+                resourceTracker,
+                reinterpret_cast<VkDeviceMemoryOverallocationCreateInfoAMD*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_vertex_attribute_divisor
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT: {
+            transform_tohost_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT:
-        {
-            transform_tohost_VkPipelineVertexInputDivisorStateCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineVertexInputDivisorStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT: {
+            transform_tohost_VkPipelineVertexInputDivisorStateCreateInfoEXT(
+                resourceTracker, reinterpret_cast<VkPipelineVertexInputDivisorStateCreateInfoEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_GGP_frame_token
-        case VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP:
-        {
-            transform_tohost_VkPresentFrameTokenGGP(resourceTracker, reinterpret_cast<VkPresentFrameTokenGGP*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP: {
+            transform_tohost_VkPresentFrameTokenGGP(
+                resourceTracker, reinterpret_cast<VkPresentFrameTokenGGP*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_pipeline_creation_feedback
-        case VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT:
-        {
-            transform_tohost_VkPipelineCreationFeedbackCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineCreationFeedbackCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT: {
+            transform_tohost_VkPipelineCreationFeedbackCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkPipelineCreationFeedbackCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_compute_shader_derivatives
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV:
-        {
-            transform_tohost_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceComputeShaderDerivativesFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV: {
+            transform_tohost_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceComputeShaderDerivativesFeaturesNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_mesh_shader
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV:
-        {
-            transform_tohost_VkPhysicalDeviceMeshShaderFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceMeshShaderFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV: {
+            transform_tohost_VkPhysicalDeviceMeshShaderFeaturesNV(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceMeshShaderFeaturesNV*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV:
-        {
-            transform_tohost_VkPhysicalDeviceMeshShaderPropertiesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceMeshShaderPropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV: {
+            transform_tohost_VkPhysicalDeviceMeshShaderPropertiesNV(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceMeshShaderPropertiesNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_fragment_shader_barycentric
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV:
-        {
-            transform_tohost_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV: {
+            transform_tohost_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_shader_image_footprint
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV:
-        {
-            transform_tohost_VkPhysicalDeviceShaderImageFootprintFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderImageFootprintFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV: {
+            transform_tohost_VkPhysicalDeviceShaderImageFootprintFeaturesNV(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderImageFootprintFeaturesNV*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_scissor_exclusive
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV:
-        {
-            transform_tohost_VkPipelineViewportExclusiveScissorStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineViewportExclusiveScissorStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV: {
+            transform_tohost_VkPipelineViewportExclusiveScissorStateCreateInfoNV(
+                resourceTracker,
+                reinterpret_cast<VkPipelineViewportExclusiveScissorStateCreateInfoNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV:
-        {
-            transform_tohost_VkPhysicalDeviceExclusiveScissorFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceExclusiveScissorFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV: {
+            transform_tohost_VkPhysicalDeviceExclusiveScissorFeaturesNV(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceExclusiveScissorFeaturesNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
-        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV:
-        {
-            transform_tohost_VkQueueFamilyCheckpointPropertiesNV(resourceTracker, reinterpret_cast<VkQueueFamilyCheckpointPropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV: {
+            transform_tohost_VkQueueFamilyCheckpointPropertiesNV(
+                resourceTracker,
+                reinterpret_cast<VkQueueFamilyCheckpointPropertiesNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_INTEL_shader_integer_functions2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL:
-        {
-            transform_tohost_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL: {
+            transform_tohost_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_INTEL_performance_query
-        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL:
-        {
-            transform_tohost_VkQueryPoolPerformanceQueryCreateInfoINTEL(resourceTracker, reinterpret_cast<VkQueryPoolPerformanceQueryCreateInfoINTEL*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL: {
+            transform_tohost_VkQueryPoolPerformanceQueryCreateInfoINTEL(
+                resourceTracker,
+                reinterpret_cast<VkQueryPoolPerformanceQueryCreateInfoINTEL*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_pci_bus_info
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT:
-        {
-            transform_tohost_VkPhysicalDevicePCIBusInfoPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDevicePCIBusInfoPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT: {
+            transform_tohost_VkPhysicalDevicePCIBusInfoPropertiesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDevicePCIBusInfoPropertiesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_display_native_hdr
-        case VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD:
-        {
-            transform_tohost_VkDisplayNativeHdrSurfaceCapabilitiesAMD(resourceTracker, reinterpret_cast<VkDisplayNativeHdrSurfaceCapabilitiesAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD: {
+            transform_tohost_VkDisplayNativeHdrSurfaceCapabilitiesAMD(
+                resourceTracker,
+                reinterpret_cast<VkDisplayNativeHdrSurfaceCapabilitiesAMD*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD:
-        {
-            transform_tohost_VkSwapchainDisplayNativeHdrCreateInfoAMD(resourceTracker, reinterpret_cast<VkSwapchainDisplayNativeHdrCreateInfoAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD: {
+            transform_tohost_VkSwapchainDisplayNativeHdrCreateInfoAMD(
+                resourceTracker,
+                reinterpret_cast<VkSwapchainDisplayNativeHdrCreateInfoAMD*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_fragment_density_map
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT: {
+            transform_tohost_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT:
-        {
-            transform_tohost_VkRenderPassFragmentDensityMapCreateInfoEXT(resourceTracker, reinterpret_cast<VkRenderPassFragmentDensityMapCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT: {
+            transform_tohost_VkRenderPassFragmentDensityMapCreateInfoEXT(
+                resourceTracker, reinterpret_cast<VkRenderPassFragmentDensityMapCreateInfoEXT*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_subgroup_size_control
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceSubgroupSizeControlFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceSubgroupSizeControlFeaturesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceSubgroupSizeControlPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT: {
+            transform_tohost_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceSubgroupSizeControlPropertiesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT:
-        {
-            transform_tohost_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT: {
+            transform_tohost_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_shader_core_properties2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD:
-        {
-            transform_tohost_VkPhysicalDeviceShaderCoreProperties2AMD(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderCoreProperties2AMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD: {
+            transform_tohost_VkPhysicalDeviceShaderCoreProperties2AMD(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceShaderCoreProperties2AMD*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_device_coherent_memory
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD:
-        {
-            transform_tohost_VkPhysicalDeviceCoherentMemoryFeaturesAMD(resourceTracker, reinterpret_cast<VkPhysicalDeviceCoherentMemoryFeaturesAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD: {
+            transform_tohost_VkPhysicalDeviceCoherentMemoryFeaturesAMD(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceCoherentMemoryFeaturesAMD*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_shader_image_atomic_int64
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_memory_budget
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceMemoryBudgetPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceMemoryBudgetPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT: {
+            transform_tohost_VkPhysicalDeviceMemoryBudgetPropertiesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceMemoryBudgetPropertiesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_memory_priority
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceMemoryPriorityFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceMemoryPriorityFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDeviceMemoryPriorityFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceMemoryPriorityFeaturesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT:
-        {
-            transform_tohost_VkMemoryPriorityAllocateInfoEXT(resourceTracker, reinterpret_cast<VkMemoryPriorityAllocateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT: {
+            transform_tohost_VkMemoryPriorityAllocateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkMemoryPriorityAllocateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_dedicated_allocation_image_aliasing
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV:
-        {
-            transform_tohost_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV: {
+            transform_tohost_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_buffer_device_address
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceBufferDeviceAddressFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceBufferDeviceAddressFeaturesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT:
-        {
-            transform_tohost_VkBufferDeviceAddressCreateInfoEXT(resourceTracker, reinterpret_cast<VkBufferDeviceAddressCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT: {
+            transform_tohost_VkBufferDeviceAddressCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkBufferDeviceAddressCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_validation_features
-        case VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT:
-        {
-            transform_tohost_VkValidationFeaturesEXT(resourceTracker, reinterpret_cast<VkValidationFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT: {
+            transform_tohost_VkValidationFeaturesEXT(
+                resourceTracker, reinterpret_cast<VkValidationFeaturesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_cooperative_matrix
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV:
-        {
-            transform_tohost_VkPhysicalDeviceCooperativeMatrixFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceCooperativeMatrixFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV: {
+            transform_tohost_VkPhysicalDeviceCooperativeMatrixFeaturesNV(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceCooperativeMatrixFeaturesNV*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV:
-        {
-            transform_tohost_VkPhysicalDeviceCooperativeMatrixPropertiesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceCooperativeMatrixPropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV: {
+            transform_tohost_VkPhysicalDeviceCooperativeMatrixPropertiesNV(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceCooperativeMatrixPropertiesNV*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_coverage_reduction_mode
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV:
-        {
-            transform_tohost_VkPhysicalDeviceCoverageReductionModeFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceCoverageReductionModeFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV: {
+            transform_tohost_VkPhysicalDeviceCoverageReductionModeFeaturesNV(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceCoverageReductionModeFeaturesNV*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV:
-        {
-            transform_tohost_VkPipelineCoverageReductionStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineCoverageReductionStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV: {
+            transform_tohost_VkPipelineCoverageReductionStateCreateInfoNV(
+                resourceTracker, reinterpret_cast<VkPipelineCoverageReductionStateCreateInfoNV*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_fragment_shader_interlock
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_ycbcr_image_arrays
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_provoking_vertex
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceProvokingVertexFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceProvokingVertexFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDeviceProvokingVertexFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceProvokingVertexFeaturesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_PROPERTIES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceProvokingVertexPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceProvokingVertexPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_PROPERTIES_EXT: {
+            transform_tohost_VkPhysicalDeviceProvokingVertexPropertiesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceProvokingVertexPropertiesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT:
-        {
-            transform_tohost_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineRasterizationProvokingVertexStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT: {
+            transform_tohost_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkPipelineRasterizationProvokingVertexStateCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_full_screen_exclusive
-        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT:
-        {
-            transform_tohost_VkSurfaceFullScreenExclusiveInfoEXT(resourceTracker, reinterpret_cast<VkSurfaceFullScreenExclusiveInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT: {
+            transform_tohost_VkSurfaceFullScreenExclusiveInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkSurfaceFullScreenExclusiveInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT:
-        {
-            transform_tohost_VkSurfaceCapabilitiesFullScreenExclusiveEXT(resourceTracker, reinterpret_cast<VkSurfaceCapabilitiesFullScreenExclusiveEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT: {
+            transform_tohost_VkSurfaceCapabilitiesFullScreenExclusiveEXT(
+                resourceTracker, reinterpret_cast<VkSurfaceCapabilitiesFullScreenExclusiveEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT:
-        {
-            transform_tohost_VkSurfaceFullScreenExclusiveWin32InfoEXT(resourceTracker, reinterpret_cast<VkSurfaceFullScreenExclusiveWin32InfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT: {
+            transform_tohost_VkSurfaceFullScreenExclusiveWin32InfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkSurfaceFullScreenExclusiveWin32InfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_line_rasterization
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceLineRasterizationFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceLineRasterizationFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDeviceLineRasterizationFeaturesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceLineRasterizationFeaturesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceLineRasterizationPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceLineRasterizationPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT: {
+            transform_tohost_VkPhysicalDeviceLineRasterizationPropertiesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceLineRasterizationPropertiesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT:
-        {
-            transform_tohost_VkPipelineRasterizationLineStateCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineRasterizationLineStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT: {
+            transform_tohost_VkPipelineRasterizationLineStateCreateInfoEXT(
+                resourceTracker, reinterpret_cast<VkPipelineRasterizationLineStateCreateInfoEXT*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_shader_atomic_float
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_index_type_uint8
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceIndexTypeUint8FeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceIndexTypeUint8FeaturesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_shader_atomic_float2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_device_generated_commands
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV:
-        {
-            transform_tohost_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV: {
+            transform_tohost_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV:
-        {
-            transform_tohost_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV: {
+            transform_tohost_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV:
-        {
-            transform_tohost_VkGraphicsPipelineShaderGroupsCreateInfoNV(resourceTracker, reinterpret_cast<VkGraphicsPipelineShaderGroupsCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV: {
+            transform_tohost_VkGraphicsPipelineShaderGroupsCreateInfoNV(
+                resourceTracker,
+                reinterpret_cast<VkGraphicsPipelineShaderGroupsCreateInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_inherited_viewport_scissor
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV:
-        {
-            transform_tohost_VkPhysicalDeviceInheritedViewportScissorFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceInheritedViewportScissorFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV: {
+            transform_tohost_VkPhysicalDeviceInheritedViewportScissorFeaturesNV(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceInheritedViewportScissorFeaturesNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_VIEWPORT_SCISSOR_INFO_NV:
-        {
-            transform_tohost_VkCommandBufferInheritanceViewportScissorInfoNV(resourceTracker, reinterpret_cast<VkCommandBufferInheritanceViewportScissorInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_VIEWPORT_SCISSOR_INFO_NV: {
+            transform_tohost_VkCommandBufferInheritanceViewportScissorInfoNV(
+                resourceTracker, reinterpret_cast<VkCommandBufferInheritanceViewportScissorInfoNV*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_texel_buffer_alignment
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT: {
+            transform_tohost_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_QCOM_render_pass_transform
-        case VK_STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM:
-        {
-            transform_tohost_VkRenderPassTransformBeginInfoQCOM(resourceTracker, reinterpret_cast<VkRenderPassTransformBeginInfoQCOM*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM: {
+            transform_tohost_VkRenderPassTransformBeginInfoQCOM(
+                resourceTracker,
+                reinterpret_cast<VkRenderPassTransformBeginInfoQCOM*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM:
-        {
-            transform_tohost_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(resourceTracker, reinterpret_cast<VkCommandBufferInheritanceRenderPassTransformInfoQCOM*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM: {
+            transform_tohost_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(
+                resourceTracker,
+                reinterpret_cast<VkCommandBufferInheritanceRenderPassTransformInfoQCOM*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_device_memory_report
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceDeviceMemoryReportFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceDeviceMemoryReportFeaturesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT:
-        {
-            transform_tohost_VkDeviceDeviceMemoryReportCreateInfoEXT(resourceTracker, reinterpret_cast<VkDeviceDeviceMemoryReportCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT: {
+            transform_tohost_VkDeviceDeviceMemoryReportCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkDeviceDeviceMemoryReportCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_robustness2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceRobustness2FeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceRobustness2FeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDeviceRobustness2FeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceRobustness2FeaturesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceRobustness2PropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceRobustness2PropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT: {
+            transform_tohost_VkPhysicalDeviceRobustness2PropertiesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceRobustness2PropertiesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_custom_border_color
-        case VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT:
-        {
-            transform_tohost_VkSamplerCustomBorderColorCreateInfoEXT(resourceTracker, reinterpret_cast<VkSamplerCustomBorderColorCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT: {
+            transform_tohost_VkSamplerCustomBorderColorCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkSamplerCustomBorderColorCreateInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceCustomBorderColorPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceCustomBorderColorPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT: {
+            transform_tohost_VkPhysicalDeviceCustomBorderColorPropertiesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceCustomBorderColorPropertiesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceCustomBorderColorFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceCustomBorderColorFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDeviceCustomBorderColorFeaturesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceCustomBorderColorFeaturesEXT*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_private_data
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDevicePrivateDataFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDevicePrivateDataFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDevicePrivateDataFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDevicePrivateDataFeaturesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT:
-        {
-            transform_tohost_VkDevicePrivateDataCreateInfoEXT(resourceTracker, reinterpret_cast<VkDevicePrivateDataCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT: {
+            transform_tohost_VkDevicePrivateDataCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkDevicePrivateDataCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_pipeline_creation_cache_control
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_device_diagnostics_config
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV:
-        {
-            transform_tohost_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceDiagnosticsConfigFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV: {
+            transform_tohost_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceDiagnosticsConfigFeaturesNV*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV:
-        {
-            transform_tohost_VkDeviceDiagnosticsConfigCreateInfoNV(resourceTracker, reinterpret_cast<VkDeviceDiagnosticsConfigCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV: {
+            transform_tohost_VkDeviceDiagnosticsConfigCreateInfoNV(
+                resourceTracker,
+                reinterpret_cast<VkDeviceDiagnosticsConfigCreateInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_fragment_shading_rate_enums
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV:
-        {
-            transform_tohost_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV: {
+            transform_tohost_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV:
-        {
-            transform_tohost_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV: {
+            transform_tohost_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV:
-        {
-            transform_tohost_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineFragmentShadingRateEnumStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV: {
+            transform_tohost_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(
+                resourceTracker,
+                reinterpret_cast<VkPipelineFragmentShadingRateEnumStateCreateInfoNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_ray_tracing_motion_blur
-        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_MOTION_TRIANGLES_DATA_NV:
-        {
-            transform_tohost_VkAccelerationStructureGeometryMotionTrianglesDataNV(resourceTracker, reinterpret_cast<VkAccelerationStructureGeometryMotionTrianglesDataNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_MOTION_TRIANGLES_DATA_NV: {
+            transform_tohost_VkAccelerationStructureGeometryMotionTrianglesDataNV(
+                resourceTracker,
+                reinterpret_cast<VkAccelerationStructureGeometryMotionTrianglesDataNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MOTION_INFO_NV:
-        {
-            transform_tohost_VkAccelerationStructureMotionInfoNV(resourceTracker, reinterpret_cast<VkAccelerationStructureMotionInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MOTION_INFO_NV: {
+            transform_tohost_VkAccelerationStructureMotionInfoNV(
+                resourceTracker,
+                reinterpret_cast<VkAccelerationStructureMotionInfoNV*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV:
-        {
-            transform_tohost_VkPhysicalDeviceRayTracingMotionBlurFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceRayTracingMotionBlurFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV: {
+            transform_tohost_VkPhysicalDeviceRayTracingMotionBlurFeaturesNV(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceRayTracingMotionBlurFeaturesNV*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_ycbcr_2plane_444_formats
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_fragment_density_map2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2FeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2FeaturesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2PropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT: {
+            transform_tohost_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2PropertiesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_QCOM_rotated_copy_commands
-        case VK_STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM:
-        {
-            transform_tohost_VkCopyCommandTransformInfoQCOM(resourceTracker, reinterpret_cast<VkCopyCommandTransformInfoQCOM*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM: {
+            transform_tohost_VkCopyCommandTransformInfoQCOM(
+                resourceTracker,
+                reinterpret_cast<VkCopyCommandTransformInfoQCOM*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_image_robustness
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceImageRobustnessFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceImageRobustnessFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDeviceImageRobustnessFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceImageRobustnessFeaturesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_4444_formats
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDevice4444FormatsFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDevice4444FormatsFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDevice4444FormatsFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDevice4444FormatsFeaturesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_rgba10x6_formats
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_VALVE_mutable_descriptor_type
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE:
-        {
-            transform_tohost_VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE(resourceTracker, reinterpret_cast<VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE: {
+            transform_tohost_VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE:
-        {
-            transform_tohost_VkMutableDescriptorTypeCreateInfoVALVE(resourceTracker, reinterpret_cast<VkMutableDescriptorTypeCreateInfoVALVE*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE: {
+            transform_tohost_VkMutableDescriptorTypeCreateInfoVALVE(
+                resourceTracker,
+                reinterpret_cast<VkMutableDescriptorTypeCreateInfoVALVE*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_vertex_input_dynamic_state
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_physical_device_drm
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRM_PROPERTIES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceDrmPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceDrmPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRM_PROPERTIES_EXT: {
+            transform_tohost_VkPhysicalDeviceDrmPropertiesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceDrmPropertiesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_primitive_topology_list_restart
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_FUCHSIA_external_memory
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA:
-        {
-            transform_tohost_VkImportMemoryZirconHandleInfoFUCHSIA(resourceTracker, reinterpret_cast<VkImportMemoryZirconHandleInfoFUCHSIA*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA: {
+            transform_tohost_VkImportMemoryZirconHandleInfoFUCHSIA(
+                resourceTracker,
+                reinterpret_cast<VkImportMemoryZirconHandleInfoFUCHSIA*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA:
-        {
-            transform_tohost_VkImportMemoryBufferCollectionFUCHSIA(resourceTracker, reinterpret_cast<VkImportMemoryBufferCollectionFUCHSIA*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA: {
+            transform_tohost_VkImportMemoryBufferCollectionFUCHSIA(
+                resourceTracker,
+                reinterpret_cast<VkImportMemoryBufferCollectionFUCHSIA*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA:
-        {
-            transform_tohost_VkBufferCollectionImageCreateInfoFUCHSIA(resourceTracker, reinterpret_cast<VkBufferCollectionImageCreateInfoFUCHSIA*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA: {
+            transform_tohost_VkBufferCollectionImageCreateInfoFUCHSIA(
+                resourceTracker,
+                reinterpret_cast<VkBufferCollectionImageCreateInfoFUCHSIA*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_BUFFER_CREATE_INFO_FUCHSIA:
-        {
-            transform_tohost_VkBufferCollectionBufferCreateInfoFUCHSIA(resourceTracker, reinterpret_cast<VkBufferCollectionBufferCreateInfoFUCHSIA*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_BUFFER_CREATE_INFO_FUCHSIA: {
+            transform_tohost_VkBufferCollectionBufferCreateInfoFUCHSIA(
+                resourceTracker,
+                reinterpret_cast<VkBufferCollectionBufferCreateInfoFUCHSIA*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_HUAWEI_subpass_shading
-        case VK_STRUCTURE_TYPE_SUBPASS_SHADING_PIPELINE_CREATE_INFO_HUAWEI:
-        {
-            transform_tohost_VkSubpassShadingPipelineCreateInfoHUAWEI(resourceTracker, reinterpret_cast<VkSubpassShadingPipelineCreateInfoHUAWEI*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SUBPASS_SHADING_PIPELINE_CREATE_INFO_HUAWEI: {
+            transform_tohost_VkSubpassShadingPipelineCreateInfoHUAWEI(
+                resourceTracker,
+                reinterpret_cast<VkSubpassShadingPipelineCreateInfoHUAWEI*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI:
-        {
-            transform_tohost_VkPhysicalDeviceSubpassShadingFeaturesHUAWEI(resourceTracker, reinterpret_cast<VkPhysicalDeviceSubpassShadingFeaturesHUAWEI*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI: {
+            transform_tohost_VkPhysicalDeviceSubpassShadingFeaturesHUAWEI(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceSubpassShadingFeaturesHUAWEI*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_PROPERTIES_HUAWEI:
-        {
-            transform_tohost_VkPhysicalDeviceSubpassShadingPropertiesHUAWEI(resourceTracker, reinterpret_cast<VkPhysicalDeviceSubpassShadingPropertiesHUAWEI*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_PROPERTIES_HUAWEI: {
+            transform_tohost_VkPhysicalDeviceSubpassShadingPropertiesHUAWEI(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceSubpassShadingPropertiesHUAWEI*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_HUAWEI_invocation_mask
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI:
-        {
-            transform_tohost_VkPhysicalDeviceInvocationMaskFeaturesHUAWEI(resourceTracker, reinterpret_cast<VkPhysicalDeviceInvocationMaskFeaturesHUAWEI*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI: {
+            transform_tohost_VkPhysicalDeviceInvocationMaskFeaturesHUAWEI(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceInvocationMaskFeaturesHUAWEI*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_external_memory_rdma
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV:
-        {
-            transform_tohost_VkPhysicalDeviceExternalMemoryRDMAFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceExternalMemoryRDMAFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV: {
+            transform_tohost_VkPhysicalDeviceExternalMemoryRDMAFeaturesNV(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceExternalMemoryRDMAFeaturesNV*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceExtendedDynamicState2FeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceExtendedDynamicState2FeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDeviceExtendedDynamicState2FeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceExtendedDynamicState2FeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_color_write_enable
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceColorWriteEnableFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceColorWriteEnableFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDeviceColorWriteEnableFeaturesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceColorWriteEnableFeaturesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_WRITE_CREATE_INFO_EXT:
-        {
-            transform_tohost_VkPipelineColorWriteCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineColorWriteCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_WRITE_CREATE_INFO_EXT: {
+            transform_tohost_VkPipelineColorWriteCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkPipelineColorWriteCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_GOOGLE_gfxstream
-        case VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE:
-        {
-            transform_tohost_VkImportColorBufferGOOGLE(resourceTracker, reinterpret_cast<VkImportColorBufferGOOGLE*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE: {
+            transform_tohost_VkImportColorBufferGOOGLE(
+                resourceTracker, reinterpret_cast<VkImportColorBufferGOOGLE*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE:
-        {
-            transform_tohost_VkImportBufferGOOGLE(resourceTracker, reinterpret_cast<VkImportBufferGOOGLE*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE: {
+            transform_tohost_VkImportBufferGOOGLE(
+                resourceTracker, reinterpret_cast<VkImportBufferGOOGLE*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE:
-        {
-            transform_tohost_VkImportPhysicalAddressGOOGLE(resourceTracker, reinterpret_cast<VkImportPhysicalAddressGOOGLE*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE: {
+            transform_tohost_VkImportPhysicalAddressGOOGLE(
+                resourceTracker,
+                reinterpret_cast<VkImportPhysicalAddressGOOGLE*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_global_priority_query
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_EXT:
-        {
-            transform_tohost_VkQueueFamilyGlobalPriorityPropertiesEXT(resourceTracker, reinterpret_cast<VkQueueFamilyGlobalPriorityPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_EXT: {
+            transform_tohost_VkQueueFamilyGlobalPriorityPropertiesEXT(
+                resourceTracker,
+                reinterpret_cast<VkQueueFamilyGlobalPriorityPropertiesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_multi_draw
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceMultiDrawFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceMultiDrawFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDeviceMultiDrawFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceMultiDrawFeaturesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceMultiDrawPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceMultiDrawPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT: {
+            transform_tohost_VkPhysicalDeviceMultiDrawPropertiesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceMultiDrawPropertiesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_border_color_swizzle
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDeviceBorderColorSwizzleFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceBorderColorSwizzleFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDeviceBorderColorSwizzleFeaturesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceBorderColorSwizzleFeaturesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_BORDER_COLOR_COMPONENT_MAPPING_CREATE_INFO_EXT:
-        {
-            transform_tohost_VkSamplerBorderColorComponentMappingCreateInfoEXT(resourceTracker, reinterpret_cast<VkSamplerBorderColorComponentMappingCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SAMPLER_BORDER_COLOR_COMPONENT_MAPPING_CREATE_INFO_EXT: {
+            transform_tohost_VkSamplerBorderColorComponentMappingCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkSamplerBorderColorComponentMappingCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_pageable_device_local_memory
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT:
-        {
-            transform_tohost_VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT: {
+            transform_tohost_VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_acceleration_structure
-        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR:
-        {
-            transform_tohost_VkWriteDescriptorSetAccelerationStructureKHR(resourceTracker, reinterpret_cast<VkWriteDescriptorSetAccelerationStructureKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR: {
+            transform_tohost_VkWriteDescriptorSetAccelerationStructureKHR(
+                resourceTracker, reinterpret_cast<VkWriteDescriptorSetAccelerationStructureKHR*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR:
-        {
-            transform_tohost_VkPhysicalDeviceAccelerationStructureFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceAccelerationStructureFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR: {
+            transform_tohost_VkPhysicalDeviceAccelerationStructureFeaturesKHR(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceAccelerationStructureFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR:
-        {
-            transform_tohost_VkPhysicalDeviceAccelerationStructurePropertiesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceAccelerationStructurePropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR: {
+            transform_tohost_VkPhysicalDeviceAccelerationStructurePropertiesKHR(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceAccelerationStructurePropertiesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR:
-        {
-            transform_tohost_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceRayTracingPipelineFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR: {
+            transform_tohost_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceRayTracingPipelineFeaturesKHR*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR:
-        {
-            transform_tohost_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceRayTracingPipelinePropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR: {
+            transform_tohost_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceRayTracingPipelinePropertiesKHR*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_ray_query
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR:
-        {
-            transform_tohost_VkPhysicalDeviceRayQueryFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceRayQueryFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR: {
+            transform_tohost_VkPhysicalDeviceRayQueryFeaturesKHR(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceRayQueryFeaturesKHR*>(structExtension_out));
             break;
         }
 #endif
-        default:
-        {
+        default: {
             return;
         }
     }
 }
 
-void transform_fromhost_extension_struct(
-    VkDecoderGlobalState* resourceTracker,
-    void* structExtension_out)
-{
-    if (!structExtension_out)
-    {
+void transform_fromhost_extension_struct(VkDecoderGlobalState* resourceTracker,
+                                         void* structExtension_out) {
+    if (!structExtension_out) {
         return;
     }
     uint32_t structType = (uint32_t)goldfish_vk_struct_type(structExtension_out);
-    switch(structType)
-    {
+    switch (structType) {
 #ifdef VK_VERSION_1_1
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES:
-        {
-            transform_fromhost_VkPhysicalDeviceSubgroupProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceSubgroupProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES: {
+            transform_fromhost_VkPhysicalDeviceSubgroupProperties(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceSubgroupProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES:
-        {
-            transform_fromhost_VkPhysicalDevice16BitStorageFeatures(resourceTracker, reinterpret_cast<VkPhysicalDevice16BitStorageFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES: {
+            transform_fromhost_VkPhysicalDevice16BitStorageFeatures(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDevice16BitStorageFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS:
-        {
-            transform_fromhost_VkMemoryDedicatedRequirements(resourceTracker, reinterpret_cast<VkMemoryDedicatedRequirements*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS: {
+            transform_fromhost_VkMemoryDedicatedRequirements(
+                resourceTracker,
+                reinterpret_cast<VkMemoryDedicatedRequirements*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO:
-        {
-            transform_fromhost_VkMemoryDedicatedAllocateInfo(resourceTracker, reinterpret_cast<VkMemoryDedicatedAllocateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO: {
+            transform_fromhost_VkMemoryDedicatedAllocateInfo(
+                resourceTracker,
+                reinterpret_cast<VkMemoryDedicatedAllocateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO:
-        {
-            transform_fromhost_VkMemoryAllocateFlagsInfo(resourceTracker, reinterpret_cast<VkMemoryAllocateFlagsInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO: {
+            transform_fromhost_VkMemoryAllocateFlagsInfo(
+                resourceTracker, reinterpret_cast<VkMemoryAllocateFlagsInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO:
-        {
-            transform_fromhost_VkDeviceGroupRenderPassBeginInfo(resourceTracker, reinterpret_cast<VkDeviceGroupRenderPassBeginInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO: {
+            transform_fromhost_VkDeviceGroupRenderPassBeginInfo(
+                resourceTracker,
+                reinterpret_cast<VkDeviceGroupRenderPassBeginInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO:
-        {
-            transform_fromhost_VkDeviceGroupCommandBufferBeginInfo(resourceTracker, reinterpret_cast<VkDeviceGroupCommandBufferBeginInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO: {
+            transform_fromhost_VkDeviceGroupCommandBufferBeginInfo(
+                resourceTracker,
+                reinterpret_cast<VkDeviceGroupCommandBufferBeginInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO:
-        {
-            transform_fromhost_VkDeviceGroupSubmitInfo(resourceTracker, reinterpret_cast<VkDeviceGroupSubmitInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO: {
+            transform_fromhost_VkDeviceGroupSubmitInfo(
+                resourceTracker, reinterpret_cast<VkDeviceGroupSubmitInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO:
-        {
-            transform_fromhost_VkDeviceGroupBindSparseInfo(resourceTracker, reinterpret_cast<VkDeviceGroupBindSparseInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO: {
+            transform_fromhost_VkDeviceGroupBindSparseInfo(
+                resourceTracker,
+                reinterpret_cast<VkDeviceGroupBindSparseInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO:
-        {
-            transform_fromhost_VkBindBufferMemoryDeviceGroupInfo(resourceTracker, reinterpret_cast<VkBindBufferMemoryDeviceGroupInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO: {
+            transform_fromhost_VkBindBufferMemoryDeviceGroupInfo(
+                resourceTracker,
+                reinterpret_cast<VkBindBufferMemoryDeviceGroupInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO:
-        {
-            transform_fromhost_VkBindImageMemoryDeviceGroupInfo(resourceTracker, reinterpret_cast<VkBindImageMemoryDeviceGroupInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO: {
+            transform_fromhost_VkBindImageMemoryDeviceGroupInfo(
+                resourceTracker,
+                reinterpret_cast<VkBindImageMemoryDeviceGroupInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO:
-        {
-            transform_fromhost_VkDeviceGroupDeviceCreateInfo(resourceTracker, reinterpret_cast<VkDeviceGroupDeviceCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO: {
+            transform_fromhost_VkDeviceGroupDeviceCreateInfo(
+                resourceTracker,
+                reinterpret_cast<VkDeviceGroupDeviceCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2:
-        {
-            transform_fromhost_VkPhysicalDeviceFeatures2(resourceTracker, reinterpret_cast<VkPhysicalDeviceFeatures2*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2: {
+            transform_fromhost_VkPhysicalDeviceFeatures2(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceFeatures2*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES:
-        {
-            transform_fromhost_VkPhysicalDevicePointClippingProperties(resourceTracker, reinterpret_cast<VkPhysicalDevicePointClippingProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES: {
+            transform_fromhost_VkPhysicalDevicePointClippingProperties(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDevicePointClippingProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO:
-        {
-            transform_fromhost_VkRenderPassInputAttachmentAspectCreateInfo(resourceTracker, reinterpret_cast<VkRenderPassInputAttachmentAspectCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO: {
+            transform_fromhost_VkRenderPassInputAttachmentAspectCreateInfo(
+                resourceTracker, reinterpret_cast<VkRenderPassInputAttachmentAspectCreateInfo*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO:
-        {
-            transform_fromhost_VkImageViewUsageCreateInfo(resourceTracker, reinterpret_cast<VkImageViewUsageCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO: {
+            transform_fromhost_VkImageViewUsageCreateInfo(
+                resourceTracker,
+                reinterpret_cast<VkImageViewUsageCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO:
-        {
-            transform_fromhost_VkPipelineTessellationDomainOriginStateCreateInfo(resourceTracker, reinterpret_cast<VkPipelineTessellationDomainOriginStateCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO: {
+            transform_fromhost_VkPipelineTessellationDomainOriginStateCreateInfo(
+                resourceTracker,
+                reinterpret_cast<VkPipelineTessellationDomainOriginStateCreateInfo*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO:
-        {
-            transform_fromhost_VkRenderPassMultiviewCreateInfo(resourceTracker, reinterpret_cast<VkRenderPassMultiviewCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO: {
+            transform_fromhost_VkRenderPassMultiviewCreateInfo(
+                resourceTracker,
+                reinterpret_cast<VkRenderPassMultiviewCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES:
-        {
-            transform_fromhost_VkPhysicalDeviceMultiviewFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceMultiviewFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES: {
+            transform_fromhost_VkPhysicalDeviceMultiviewFeatures(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceMultiviewFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES:
-        {
-            transform_fromhost_VkPhysicalDeviceMultiviewProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceMultiviewProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES: {
+            transform_fromhost_VkPhysicalDeviceMultiviewProperties(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceMultiviewProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES:
-        {
-            transform_fromhost_VkPhysicalDeviceVariablePointersFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceVariablePointersFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES: {
+            transform_fromhost_VkPhysicalDeviceVariablePointersFeatures(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceVariablePointersFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES:
-        {
-            transform_fromhost_VkPhysicalDeviceProtectedMemoryFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceProtectedMemoryFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES: {
+            transform_fromhost_VkPhysicalDeviceProtectedMemoryFeatures(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceProtectedMemoryFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES:
-        {
-            transform_fromhost_VkPhysicalDeviceProtectedMemoryProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceProtectedMemoryProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES: {
+            transform_fromhost_VkPhysicalDeviceProtectedMemoryProperties(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceProtectedMemoryProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO:
-        {
-            transform_fromhost_VkProtectedSubmitInfo(resourceTracker, reinterpret_cast<VkProtectedSubmitInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO: {
+            transform_fromhost_VkProtectedSubmitInfo(
+                resourceTracker, reinterpret_cast<VkProtectedSubmitInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO:
-        {
-            transform_fromhost_VkSamplerYcbcrConversionInfo(resourceTracker, reinterpret_cast<VkSamplerYcbcrConversionInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO: {
+            transform_fromhost_VkSamplerYcbcrConversionInfo(
+                resourceTracker,
+                reinterpret_cast<VkSamplerYcbcrConversionInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO:
-        {
-            transform_fromhost_VkBindImagePlaneMemoryInfo(resourceTracker, reinterpret_cast<VkBindImagePlaneMemoryInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO: {
+            transform_fromhost_VkBindImagePlaneMemoryInfo(
+                resourceTracker,
+                reinterpret_cast<VkBindImagePlaneMemoryInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO:
-        {
-            transform_fromhost_VkImagePlaneMemoryRequirementsInfo(resourceTracker, reinterpret_cast<VkImagePlaneMemoryRequirementsInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO: {
+            transform_fromhost_VkImagePlaneMemoryRequirementsInfo(
+                resourceTracker,
+                reinterpret_cast<VkImagePlaneMemoryRequirementsInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES:
-        {
-            transform_fromhost_VkPhysicalDeviceSamplerYcbcrConversionFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES: {
+            transform_fromhost_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES:
-        {
-            transform_fromhost_VkSamplerYcbcrConversionImageFormatProperties(resourceTracker, reinterpret_cast<VkSamplerYcbcrConversionImageFormatProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES: {
+            transform_fromhost_VkSamplerYcbcrConversionImageFormatProperties(
+                resourceTracker, reinterpret_cast<VkSamplerYcbcrConversionImageFormatProperties*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO:
-        {
-            resourceTracker->transformImpl_VkPhysicalDeviceExternalImageFormatInfo_fromhost(reinterpret_cast<VkPhysicalDeviceExternalImageFormatInfo*>(structExtension_out), 1);
-            transform_fromhost_VkPhysicalDeviceExternalImageFormatInfo(resourceTracker, reinterpret_cast<VkPhysicalDeviceExternalImageFormatInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO: {
+            resourceTracker->transformImpl_VkPhysicalDeviceExternalImageFormatInfo_fromhost(
+                reinterpret_cast<VkPhysicalDeviceExternalImageFormatInfo*>(structExtension_out), 1);
+            transform_fromhost_VkPhysicalDeviceExternalImageFormatInfo(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceExternalImageFormatInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES:
-        {
-            resourceTracker->transformImpl_VkExternalImageFormatProperties_fromhost(reinterpret_cast<VkExternalImageFormatProperties*>(structExtension_out), 1);
-            transform_fromhost_VkExternalImageFormatProperties(resourceTracker, reinterpret_cast<VkExternalImageFormatProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES: {
+            resourceTracker->transformImpl_VkExternalImageFormatProperties_fromhost(
+                reinterpret_cast<VkExternalImageFormatProperties*>(structExtension_out), 1);
+            transform_fromhost_VkExternalImageFormatProperties(
+                resourceTracker,
+                reinterpret_cast<VkExternalImageFormatProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES:
-        {
-            transform_fromhost_VkPhysicalDeviceIDProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceIDProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES: {
+            transform_fromhost_VkPhysicalDeviceIDProperties(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceIDProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO:
-        {
-            resourceTracker->transformImpl_VkExternalMemoryImageCreateInfo_fromhost(reinterpret_cast<VkExternalMemoryImageCreateInfo*>(structExtension_out), 1);
-            transform_fromhost_VkExternalMemoryImageCreateInfo(resourceTracker, reinterpret_cast<VkExternalMemoryImageCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO: {
+            resourceTracker->transformImpl_VkExternalMemoryImageCreateInfo_fromhost(
+                reinterpret_cast<VkExternalMemoryImageCreateInfo*>(structExtension_out), 1);
+            transform_fromhost_VkExternalMemoryImageCreateInfo(
+                resourceTracker,
+                reinterpret_cast<VkExternalMemoryImageCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO:
-        {
-            resourceTracker->transformImpl_VkExternalMemoryBufferCreateInfo_fromhost(reinterpret_cast<VkExternalMemoryBufferCreateInfo*>(structExtension_out), 1);
-            transform_fromhost_VkExternalMemoryBufferCreateInfo(resourceTracker, reinterpret_cast<VkExternalMemoryBufferCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO: {
+            resourceTracker->transformImpl_VkExternalMemoryBufferCreateInfo_fromhost(
+                reinterpret_cast<VkExternalMemoryBufferCreateInfo*>(structExtension_out), 1);
+            transform_fromhost_VkExternalMemoryBufferCreateInfo(
+                resourceTracker,
+                reinterpret_cast<VkExternalMemoryBufferCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO:
-        {
-            resourceTracker->transformImpl_VkExportMemoryAllocateInfo_fromhost(reinterpret_cast<VkExportMemoryAllocateInfo*>(structExtension_out), 1);
-            transform_fromhost_VkExportMemoryAllocateInfo(resourceTracker, reinterpret_cast<VkExportMemoryAllocateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO: {
+            resourceTracker->transformImpl_VkExportMemoryAllocateInfo_fromhost(
+                reinterpret_cast<VkExportMemoryAllocateInfo*>(structExtension_out), 1);
+            transform_fromhost_VkExportMemoryAllocateInfo(
+                resourceTracker,
+                reinterpret_cast<VkExportMemoryAllocateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO:
-        {
-            transform_fromhost_VkExportFenceCreateInfo(resourceTracker, reinterpret_cast<VkExportFenceCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO: {
+            transform_fromhost_VkExportFenceCreateInfo(
+                resourceTracker, reinterpret_cast<VkExportFenceCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO:
-        {
-            transform_fromhost_VkExportSemaphoreCreateInfo(resourceTracker, reinterpret_cast<VkExportSemaphoreCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO: {
+            transform_fromhost_VkExportSemaphoreCreateInfo(
+                resourceTracker,
+                reinterpret_cast<VkExportSemaphoreCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES:
-        {
-            transform_fromhost_VkPhysicalDeviceMaintenance3Properties(resourceTracker, reinterpret_cast<VkPhysicalDeviceMaintenance3Properties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES: {
+            transform_fromhost_VkPhysicalDeviceMaintenance3Properties(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceMaintenance3Properties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES:
-        {
-            transform_fromhost_VkPhysicalDeviceShaderDrawParametersFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderDrawParametersFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES: {
+            transform_fromhost_VkPhysicalDeviceShaderDrawParametersFeatures(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderDrawParametersFeatures*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_VERSION_1_2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES:
-        {
-            transform_fromhost_VkPhysicalDeviceVulkan11Features(resourceTracker, reinterpret_cast<VkPhysicalDeviceVulkan11Features*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: {
+            transform_fromhost_VkPhysicalDeviceVulkan11Features(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceVulkan11Features*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES:
-        {
-            transform_fromhost_VkPhysicalDeviceVulkan11Properties(resourceTracker, reinterpret_cast<VkPhysicalDeviceVulkan11Properties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: {
+            transform_fromhost_VkPhysicalDeviceVulkan11Properties(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceVulkan11Properties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES:
-        {
-            transform_fromhost_VkPhysicalDeviceVulkan12Features(resourceTracker, reinterpret_cast<VkPhysicalDeviceVulkan12Features*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: {
+            transform_fromhost_VkPhysicalDeviceVulkan12Features(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceVulkan12Features*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES:
-        {
-            transform_fromhost_VkPhysicalDeviceVulkan12Properties(resourceTracker, reinterpret_cast<VkPhysicalDeviceVulkan12Properties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: {
+            transform_fromhost_VkPhysicalDeviceVulkan12Properties(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceVulkan12Properties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO:
-        {
-            transform_fromhost_VkImageFormatListCreateInfo(resourceTracker, reinterpret_cast<VkImageFormatListCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO: {
+            transform_fromhost_VkImageFormatListCreateInfo(
+                resourceTracker,
+                reinterpret_cast<VkImageFormatListCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES:
-        {
-            transform_fromhost_VkPhysicalDevice8BitStorageFeatures(resourceTracker, reinterpret_cast<VkPhysicalDevice8BitStorageFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES: {
+            transform_fromhost_VkPhysicalDevice8BitStorageFeatures(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDevice8BitStorageFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES:
-        {
-            transform_fromhost_VkPhysicalDeviceDriverProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceDriverProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES: {
+            transform_fromhost_VkPhysicalDeviceDriverProperties(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceDriverProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES:
-        {
-            transform_fromhost_VkPhysicalDeviceShaderAtomicInt64Features(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderAtomicInt64Features*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES: {
+            transform_fromhost_VkPhysicalDeviceShaderAtomicInt64Features(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceShaderAtomicInt64Features*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES:
-        {
-            transform_fromhost_VkPhysicalDeviceShaderFloat16Int8Features(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderFloat16Int8Features*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES: {
+            transform_fromhost_VkPhysicalDeviceShaderFloat16Int8Features(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceShaderFloat16Int8Features*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES:
-        {
-            transform_fromhost_VkPhysicalDeviceFloatControlsProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceFloatControlsProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES: {
+            transform_fromhost_VkPhysicalDeviceFloatControlsProperties(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceFloatControlsProperties*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO:
-        {
-            transform_fromhost_VkDescriptorSetLayoutBindingFlagsCreateInfo(resourceTracker, reinterpret_cast<VkDescriptorSetLayoutBindingFlagsCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO: {
+            transform_fromhost_VkDescriptorSetLayoutBindingFlagsCreateInfo(
+                resourceTracker, reinterpret_cast<VkDescriptorSetLayoutBindingFlagsCreateInfo*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES:
-        {
-            transform_fromhost_VkPhysicalDeviceDescriptorIndexingFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceDescriptorIndexingFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES: {
+            transform_fromhost_VkPhysicalDeviceDescriptorIndexingFeatures(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceDescriptorIndexingFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES:
-        {
-            transform_fromhost_VkPhysicalDeviceDescriptorIndexingProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceDescriptorIndexingProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES: {
+            transform_fromhost_VkPhysicalDeviceDescriptorIndexingProperties(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceDescriptorIndexingProperties*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO:
-        {
-            transform_fromhost_VkDescriptorSetVariableDescriptorCountAllocateInfo(resourceTracker, reinterpret_cast<VkDescriptorSetVariableDescriptorCountAllocateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO: {
+            transform_fromhost_VkDescriptorSetVariableDescriptorCountAllocateInfo(
+                resourceTracker,
+                reinterpret_cast<VkDescriptorSetVariableDescriptorCountAllocateInfo*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT:
-        {
-            transform_fromhost_VkDescriptorSetVariableDescriptorCountLayoutSupport(resourceTracker, reinterpret_cast<VkDescriptorSetVariableDescriptorCountLayoutSupport*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT: {
+            transform_fromhost_VkDescriptorSetVariableDescriptorCountLayoutSupport(
+                resourceTracker,
+                reinterpret_cast<VkDescriptorSetVariableDescriptorCountLayoutSupport*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE:
-        {
-            transform_fromhost_VkSubpassDescriptionDepthStencilResolve(resourceTracker, reinterpret_cast<VkSubpassDescriptionDepthStencilResolve*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE: {
+            transform_fromhost_VkSubpassDescriptionDepthStencilResolve(
+                resourceTracker,
+                reinterpret_cast<VkSubpassDescriptionDepthStencilResolve*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES:
-        {
-            transform_fromhost_VkPhysicalDeviceDepthStencilResolveProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceDepthStencilResolveProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES: {
+            transform_fromhost_VkPhysicalDeviceDepthStencilResolveProperties(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceDepthStencilResolveProperties*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES:
-        {
-            transform_fromhost_VkPhysicalDeviceScalarBlockLayoutFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceScalarBlockLayoutFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES: {
+            transform_fromhost_VkPhysicalDeviceScalarBlockLayoutFeatures(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceScalarBlockLayoutFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO:
-        {
-            transform_fromhost_VkImageStencilUsageCreateInfo(resourceTracker, reinterpret_cast<VkImageStencilUsageCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO: {
+            transform_fromhost_VkImageStencilUsageCreateInfo(
+                resourceTracker,
+                reinterpret_cast<VkImageStencilUsageCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO:
-        {
-            transform_fromhost_VkSamplerReductionModeCreateInfo(resourceTracker, reinterpret_cast<VkSamplerReductionModeCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO: {
+            transform_fromhost_VkSamplerReductionModeCreateInfo(
+                resourceTracker,
+                reinterpret_cast<VkSamplerReductionModeCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES:
-        {
-            transform_fromhost_VkPhysicalDeviceSamplerFilterMinmaxProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceSamplerFilterMinmaxProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES: {
+            transform_fromhost_VkPhysicalDeviceSamplerFilterMinmaxProperties(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceSamplerFilterMinmaxProperties*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES:
-        {
-            transform_fromhost_VkPhysicalDeviceVulkanMemoryModelFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceVulkanMemoryModelFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES: {
+            transform_fromhost_VkPhysicalDeviceVulkanMemoryModelFeatures(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceVulkanMemoryModelFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES:
-        {
-            transform_fromhost_VkPhysicalDeviceImagelessFramebufferFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceImagelessFramebufferFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES: {
+            transform_fromhost_VkPhysicalDeviceImagelessFramebufferFeatures(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceImagelessFramebufferFeatures*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO:
-        {
-            transform_fromhost_VkFramebufferAttachmentsCreateInfo(resourceTracker, reinterpret_cast<VkFramebufferAttachmentsCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO: {
+            transform_fromhost_VkFramebufferAttachmentsCreateInfo(
+                resourceTracker,
+                reinterpret_cast<VkFramebufferAttachmentsCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO:
-        {
-            transform_fromhost_VkRenderPassAttachmentBeginInfo(resourceTracker, reinterpret_cast<VkRenderPassAttachmentBeginInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO: {
+            transform_fromhost_VkRenderPassAttachmentBeginInfo(
+                resourceTracker,
+                reinterpret_cast<VkRenderPassAttachmentBeginInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES:
-        {
-            transform_fromhost_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceUniformBufferStandardLayoutFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES: {
+            transform_fromhost_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceUniformBufferStandardLayoutFeatures*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES:
-        {
-            transform_fromhost_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES: {
+            transform_fromhost_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES:
-        {
-            transform_fromhost_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES: {
+            transform_fromhost_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT:
-        {
-            transform_fromhost_VkAttachmentReferenceStencilLayout(resourceTracker, reinterpret_cast<VkAttachmentReferenceStencilLayout*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT: {
+            transform_fromhost_VkAttachmentReferenceStencilLayout(
+                resourceTracker,
+                reinterpret_cast<VkAttachmentReferenceStencilLayout*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT:
-        {
-            transform_fromhost_VkAttachmentDescriptionStencilLayout(resourceTracker, reinterpret_cast<VkAttachmentDescriptionStencilLayout*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT: {
+            transform_fromhost_VkAttachmentDescriptionStencilLayout(
+                resourceTracker,
+                reinterpret_cast<VkAttachmentDescriptionStencilLayout*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES:
-        {
-            transform_fromhost_VkPhysicalDeviceHostQueryResetFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceHostQueryResetFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES: {
+            transform_fromhost_VkPhysicalDeviceHostQueryResetFeatures(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceHostQueryResetFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES:
-        {
-            transform_fromhost_VkPhysicalDeviceTimelineSemaphoreFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceTimelineSemaphoreFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES: {
+            transform_fromhost_VkPhysicalDeviceTimelineSemaphoreFeatures(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceTimelineSemaphoreFeatures*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES:
-        {
-            transform_fromhost_VkPhysicalDeviceTimelineSemaphoreProperties(resourceTracker, reinterpret_cast<VkPhysicalDeviceTimelineSemaphoreProperties*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES: {
+            transform_fromhost_VkPhysicalDeviceTimelineSemaphoreProperties(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceTimelineSemaphoreProperties*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO:
-        {
-            transform_fromhost_VkSemaphoreTypeCreateInfo(resourceTracker, reinterpret_cast<VkSemaphoreTypeCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO: {
+            transform_fromhost_VkSemaphoreTypeCreateInfo(
+                resourceTracker, reinterpret_cast<VkSemaphoreTypeCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO:
-        {
-            transform_fromhost_VkTimelineSemaphoreSubmitInfo(resourceTracker, reinterpret_cast<VkTimelineSemaphoreSubmitInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO: {
+            transform_fromhost_VkTimelineSemaphoreSubmitInfo(
+                resourceTracker,
+                reinterpret_cast<VkTimelineSemaphoreSubmitInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES:
-        {
-            transform_fromhost_VkPhysicalDeviceBufferDeviceAddressFeatures(resourceTracker, reinterpret_cast<VkPhysicalDeviceBufferDeviceAddressFeatures*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES: {
+            transform_fromhost_VkPhysicalDeviceBufferDeviceAddressFeatures(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceBufferDeviceAddressFeatures*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO:
-        {
-            transform_fromhost_VkBufferOpaqueCaptureAddressCreateInfo(resourceTracker, reinterpret_cast<VkBufferOpaqueCaptureAddressCreateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO: {
+            transform_fromhost_VkBufferOpaqueCaptureAddressCreateInfo(
+                resourceTracker,
+                reinterpret_cast<VkBufferOpaqueCaptureAddressCreateInfo*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO:
-        {
-            transform_fromhost_VkMemoryOpaqueCaptureAddressAllocateInfo(resourceTracker, reinterpret_cast<VkMemoryOpaqueCaptureAddressAllocateInfo*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO: {
+            transform_fromhost_VkMemoryOpaqueCaptureAddressAllocateInfo(
+                resourceTracker,
+                reinterpret_cast<VkMemoryOpaqueCaptureAddressAllocateInfo*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_swapchain
-        case VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR:
-        {
-            transform_fromhost_VkImageSwapchainCreateInfoKHR(resourceTracker, reinterpret_cast<VkImageSwapchainCreateInfoKHR*>(structExtension_out));
+        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));
+        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));
+        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));
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR: {
+            transform_fromhost_VkDeviceGroupSwapchainCreateInfoKHR(
+                resourceTracker,
+                reinterpret_cast<VkDeviceGroupSwapchainCreateInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_display_swapchain
-        case VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR:
-        {
-            transform_fromhost_VkDisplayPresentInfoKHR(resourceTracker, reinterpret_cast<VkDisplayPresentInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR: {
+            transform_fromhost_VkDisplayPresentInfoKHR(
+                resourceTracker, reinterpret_cast<VkDisplayPresentInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_video_queue
-        case VK_STRUCTURE_TYPE_VIDEO_QUEUE_FAMILY_PROPERTIES_2_KHR:
-        {
-            transform_fromhost_VkVideoQueueFamilyProperties2KHR(resourceTracker, reinterpret_cast<VkVideoQueueFamilyProperties2KHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_QUEUE_FAMILY_PROPERTIES_2_KHR: {
+            transform_fromhost_VkVideoQueueFamilyProperties2KHR(
+                resourceTracker,
+                reinterpret_cast<VkVideoQueueFamilyProperties2KHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_PROFILE_KHR:
-        {
-            transform_fromhost_VkVideoProfileKHR(resourceTracker, reinterpret_cast<VkVideoProfileKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_PROFILE_KHR: {
+            transform_fromhost_VkVideoProfileKHR(
+                resourceTracker, reinterpret_cast<VkVideoProfileKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_PROFILES_KHR:
-        {
-            transform_fromhost_VkVideoProfilesKHR(resourceTracker, reinterpret_cast<VkVideoProfilesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_PROFILES_KHR: {
+            transform_fromhost_VkVideoProfilesKHR(
+                resourceTracker, reinterpret_cast<VkVideoProfilesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_dynamic_rendering
-        case VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR:
-        {
-            transform_fromhost_VkPipelineRenderingCreateInfoKHR(resourceTracker, reinterpret_cast<VkPipelineRenderingCreateInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR: {
+            transform_fromhost_VkPipelineRenderingCreateInfoKHR(
+                resourceTracker,
+                reinterpret_cast<VkPipelineRenderingCreateInfoKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES_KHR:
-        {
-            transform_fromhost_VkPhysicalDeviceDynamicRenderingFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceDynamicRenderingFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES_KHR: {
+            transform_fromhost_VkPhysicalDeviceDynamicRenderingFeaturesKHR(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceDynamicRenderingFeaturesKHR*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR:
-        {
-            transform_fromhost_VkCommandBufferInheritanceRenderingInfoKHR(resourceTracker, reinterpret_cast<VkCommandBufferInheritanceRenderingInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR: {
+            transform_fromhost_VkCommandBufferInheritanceRenderingInfoKHR(
+                resourceTracker,
+                reinterpret_cast<VkCommandBufferInheritanceRenderingInfoKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR:
-        {
-            transform_fromhost_VkRenderingFragmentShadingRateAttachmentInfoKHR(resourceTracker, reinterpret_cast<VkRenderingFragmentShadingRateAttachmentInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR: {
+            transform_fromhost_VkRenderingFragmentShadingRateAttachmentInfoKHR(
+                resourceTracker, reinterpret_cast<VkRenderingFragmentShadingRateAttachmentInfoKHR*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_INFO_EXT:
-        {
-            transform_fromhost_VkRenderingFragmentDensityMapAttachmentInfoEXT(resourceTracker, reinterpret_cast<VkRenderingFragmentDensityMapAttachmentInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_INFO_EXT: {
+            transform_fromhost_VkRenderingFragmentDensityMapAttachmentInfoEXT(
+                resourceTracker, reinterpret_cast<VkRenderingFragmentDensityMapAttachmentInfoEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_ATTACHMENT_SAMPLE_COUNT_INFO_AMD:
-        {
-            transform_fromhost_VkAttachmentSampleCountInfoAMD(resourceTracker, reinterpret_cast<VkAttachmentSampleCountInfoAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ATTACHMENT_SAMPLE_COUNT_INFO_AMD: {
+            transform_fromhost_VkAttachmentSampleCountInfoAMD(
+                resourceTracker,
+                reinterpret_cast<VkAttachmentSampleCountInfoAMD*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_MULTIVIEW_PER_VIEW_ATTRIBUTES_INFO_NVX:
-        {
-            transform_fromhost_VkMultiviewPerViewAttributesInfoNVX(resourceTracker, reinterpret_cast<VkMultiviewPerViewAttributesInfoNVX*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MULTIVIEW_PER_VIEW_ATTRIBUTES_INFO_NVX: {
+            transform_fromhost_VkMultiviewPerViewAttributesInfoNVX(
+                resourceTracker,
+                reinterpret_cast<VkMultiviewPerViewAttributesInfoNVX*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_external_memory_win32
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
-        {
-            transform_fromhost_VkImportMemoryWin32HandleInfoKHR(resourceTracker, reinterpret_cast<VkImportMemoryWin32HandleInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR: {
+            transform_fromhost_VkImportMemoryWin32HandleInfoKHR(
+                resourceTracker,
+                reinterpret_cast<VkImportMemoryWin32HandleInfoKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
-        {
-            transform_fromhost_VkExportMemoryWin32HandleInfoKHR(resourceTracker, reinterpret_cast<VkExportMemoryWin32HandleInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR: {
+            transform_fromhost_VkExportMemoryWin32HandleInfoKHR(
+                resourceTracker,
+                reinterpret_cast<VkExportMemoryWin32HandleInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_external_memory_fd
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR:
-        {
-            transform_fromhost_VkImportMemoryFdInfoKHR(resourceTracker, reinterpret_cast<VkImportMemoryFdInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR: {
+            transform_fromhost_VkImportMemoryFdInfoKHR(
+                resourceTracker, reinterpret_cast<VkImportMemoryFdInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_win32_keyed_mutex
-        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR:
-        {
-            transform_fromhost_VkWin32KeyedMutexAcquireReleaseInfoKHR(resourceTracker, reinterpret_cast<VkWin32KeyedMutexAcquireReleaseInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR: {
+            transform_fromhost_VkWin32KeyedMutexAcquireReleaseInfoKHR(
+                resourceTracker,
+                reinterpret_cast<VkWin32KeyedMutexAcquireReleaseInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_external_semaphore_win32
-        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR:
-        {
-            transform_fromhost_VkExportSemaphoreWin32HandleInfoKHR(resourceTracker, reinterpret_cast<VkExportSemaphoreWin32HandleInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR: {
+            transform_fromhost_VkExportSemaphoreWin32HandleInfoKHR(
+                resourceTracker,
+                reinterpret_cast<VkExportSemaphoreWin32HandleInfoKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR:
-        {
-            transform_fromhost_VkD3D12FenceSubmitInfoKHR(resourceTracker, reinterpret_cast<VkD3D12FenceSubmitInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR: {
+            transform_fromhost_VkD3D12FenceSubmitInfoKHR(
+                resourceTracker, reinterpret_cast<VkD3D12FenceSubmitInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_push_descriptor
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR:
-        {
-            transform_fromhost_VkPhysicalDevicePushDescriptorPropertiesKHR(resourceTracker, reinterpret_cast<VkPhysicalDevicePushDescriptorPropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR: {
+            transform_fromhost_VkPhysicalDevicePushDescriptorPropertiesKHR(
+                resourceTracker, reinterpret_cast<VkPhysicalDevicePushDescriptorPropertiesKHR*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_incremental_present
-        case VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR:
-        {
-            transform_fromhost_VkPresentRegionsKHR(resourceTracker, reinterpret_cast<VkPresentRegionsKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR: {
+            transform_fromhost_VkPresentRegionsKHR(
+                resourceTracker, reinterpret_cast<VkPresentRegionsKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_shared_presentable_image
-        case VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR:
-        {
-            transform_fromhost_VkSharedPresentSurfaceCapabilitiesKHR(resourceTracker, reinterpret_cast<VkSharedPresentSurfaceCapabilitiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR: {
+            transform_fromhost_VkSharedPresentSurfaceCapabilitiesKHR(
+                resourceTracker,
+                reinterpret_cast<VkSharedPresentSurfaceCapabilitiesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_external_fence_win32
-        case VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR:
-        {
-            transform_fromhost_VkExportFenceWin32HandleInfoKHR(resourceTracker, reinterpret_cast<VkExportFenceWin32HandleInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR: {
+            transform_fromhost_VkExportFenceWin32HandleInfoKHR(
+                resourceTracker,
+                reinterpret_cast<VkExportFenceWin32HandleInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_performance_query
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR:
-        {
-            transform_fromhost_VkPhysicalDevicePerformanceQueryFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDevicePerformanceQueryFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR: {
+            transform_fromhost_VkPhysicalDevicePerformanceQueryFeaturesKHR(
+                resourceTracker, reinterpret_cast<VkPhysicalDevicePerformanceQueryFeaturesKHR*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR:
-        {
-            transform_fromhost_VkPhysicalDevicePerformanceQueryPropertiesKHR(resourceTracker, reinterpret_cast<VkPhysicalDevicePerformanceQueryPropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR: {
+            transform_fromhost_VkPhysicalDevicePerformanceQueryPropertiesKHR(
+                resourceTracker, reinterpret_cast<VkPhysicalDevicePerformanceQueryPropertiesKHR*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR:
-        {
-            transform_fromhost_VkQueryPoolPerformanceCreateInfoKHR(resourceTracker, reinterpret_cast<VkQueryPoolPerformanceCreateInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR: {
+            transform_fromhost_VkQueryPoolPerformanceCreateInfoKHR(
+                resourceTracker,
+                reinterpret_cast<VkQueryPoolPerformanceCreateInfoKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR:
-        {
-            transform_fromhost_VkPerformanceQuerySubmitInfoKHR(resourceTracker, reinterpret_cast<VkPerformanceQuerySubmitInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR: {
+            transform_fromhost_VkPerformanceQuerySubmitInfoKHR(
+                resourceTracker,
+                reinterpret_cast<VkPerformanceQuerySubmitInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_portability_subset
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR:
-        {
-            transform_fromhost_VkPhysicalDevicePortabilitySubsetFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDevicePortabilitySubsetFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR: {
+            transform_fromhost_VkPhysicalDevicePortabilitySubsetFeaturesKHR(
+                resourceTracker, reinterpret_cast<VkPhysicalDevicePortabilitySubsetFeaturesKHR*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR:
-        {
-            transform_fromhost_VkPhysicalDevicePortabilitySubsetPropertiesKHR(resourceTracker, reinterpret_cast<VkPhysicalDevicePortabilitySubsetPropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR: {
+            transform_fromhost_VkPhysicalDevicePortabilitySubsetPropertiesKHR(
+                resourceTracker, reinterpret_cast<VkPhysicalDevicePortabilitySubsetPropertiesKHR*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_shader_clock
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR:
-        {
-            transform_fromhost_VkPhysicalDeviceShaderClockFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderClockFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR: {
+            transform_fromhost_VkPhysicalDeviceShaderClockFeaturesKHR(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceShaderClockFeaturesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_shader_terminate_invocation
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR:
-        {
-            transform_fromhost_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR: {
+            transform_fromhost_VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_fragment_shading_rate
-        case VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR:
-        {
-            transform_fromhost_VkFragmentShadingRateAttachmentInfoKHR(resourceTracker, reinterpret_cast<VkFragmentShadingRateAttachmentInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR: {
+            transform_fromhost_VkFragmentShadingRateAttachmentInfoKHR(
+                resourceTracker,
+                reinterpret_cast<VkFragmentShadingRateAttachmentInfoKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR:
-        {
-            transform_fromhost_VkPipelineFragmentShadingRateStateCreateInfoKHR(resourceTracker, reinterpret_cast<VkPipelineFragmentShadingRateStateCreateInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR: {
+            transform_fromhost_VkPipelineFragmentShadingRateStateCreateInfoKHR(
+                resourceTracker, reinterpret_cast<VkPipelineFragmentShadingRateStateCreateInfoKHR*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR:
-        {
-            transform_fromhost_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentShadingRateFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR: {
+            transform_fromhost_VkPhysicalDeviceFragmentShadingRateFeaturesKHR(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentShadingRateFeaturesKHR*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR:
-        {
-            transform_fromhost_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentShadingRatePropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR: {
+            transform_fromhost_VkPhysicalDeviceFragmentShadingRatePropertiesKHR(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceFragmentShadingRatePropertiesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_surface_protected_capabilities
-        case VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR:
-        {
-            transform_fromhost_VkSurfaceProtectedCapabilitiesKHR(resourceTracker, reinterpret_cast<VkSurfaceProtectedCapabilitiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR: {
+            transform_fromhost_VkSurfaceProtectedCapabilitiesKHR(
+                resourceTracker,
+                reinterpret_cast<VkSurfaceProtectedCapabilitiesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_present_wait
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR:
-        {
-            transform_fromhost_VkPhysicalDevicePresentWaitFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDevicePresentWaitFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR: {
+            transform_fromhost_VkPhysicalDevicePresentWaitFeaturesKHR(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDevicePresentWaitFeaturesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_pipeline_executable_properties
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR:
-        {
-            transform_fromhost_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR: {
+            transform_fromhost_VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_shader_integer_dot_product
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR:
-        {
-            transform_fromhost_VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR: {
+            transform_fromhost_VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES_KHR:
-        {
-            transform_fromhost_VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES_KHR: {
+            transform_fromhost_VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_present_id
-        case VK_STRUCTURE_TYPE_PRESENT_ID_KHR:
-        {
-            transform_fromhost_VkPresentIdKHR(resourceTracker, reinterpret_cast<VkPresentIdKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PRESENT_ID_KHR: {
+            transform_fromhost_VkPresentIdKHR(
+                resourceTracker, reinterpret_cast<VkPresentIdKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR:
-        {
-            transform_fromhost_VkPhysicalDevicePresentIdFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDevicePresentIdFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR: {
+            transform_fromhost_VkPhysicalDevicePresentIdFeaturesKHR(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDevicePresentIdFeaturesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_video_encode_queue
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_INFO_KHR:
-        {
-            transform_fromhost_VkVideoEncodeRateControlInfoKHR(resourceTracker, reinterpret_cast<VkVideoEncodeRateControlInfoKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_INFO_KHR: {
+            transform_fromhost_VkVideoEncodeRateControlInfoKHR(
+                resourceTracker,
+                reinterpret_cast<VkVideoEncodeRateControlInfoKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_synchronization2
-        case VK_STRUCTURE_TYPE_MEMORY_BARRIER_2_KHR:
-        {
-            transform_fromhost_VkMemoryBarrier2KHR(resourceTracker, reinterpret_cast<VkMemoryBarrier2KHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MEMORY_BARRIER_2_KHR: {
+            transform_fromhost_VkMemoryBarrier2KHR(
+                resourceTracker, reinterpret_cast<VkMemoryBarrier2KHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR:
-        {
-            transform_fromhost_VkPhysicalDeviceSynchronization2FeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceSynchronization2FeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR: {
+            transform_fromhost_VkPhysicalDeviceSynchronization2FeaturesKHR(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceSynchronization2FeaturesKHR*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_2_NV:
-        {
-            transform_fromhost_VkQueueFamilyCheckpointProperties2NV(resourceTracker, reinterpret_cast<VkQueueFamilyCheckpointProperties2NV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_2_NV: {
+            transform_fromhost_VkQueueFamilyCheckpointProperties2NV(
+                resourceTracker,
+                reinterpret_cast<VkQueueFamilyCheckpointProperties2NV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_shader_subgroup_uniform_control_flow
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR:
-        {
-            transform_fromhost_VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR: {
+            transform_fromhost_VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_zero_initialize_workgroup_memory
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR:
-        {
-            transform_fromhost_VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR: {
+            transform_fromhost_VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_workgroup_memory_explicit_layout
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR:
-        {
-            transform_fromhost_VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR: {
+            transform_fromhost_VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_format_feature_flags2
-        case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR:
-        {
-            transform_fromhost_VkFormatProperties3KHR(resourceTracker, reinterpret_cast<VkFormatProperties3KHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR: {
+            transform_fromhost_VkFormatProperties3KHR(
+                resourceTracker, reinterpret_cast<VkFormatProperties3KHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_maintenance4
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES_KHR:
-        {
-            transform_fromhost_VkPhysicalDeviceMaintenance4FeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceMaintenance4FeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES_KHR: {
+            transform_fromhost_VkPhysicalDeviceMaintenance4FeaturesKHR(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceMaintenance4FeaturesKHR*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES_KHR:
-        {
-            transform_fromhost_VkPhysicalDeviceMaintenance4PropertiesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceMaintenance4PropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES_KHR: {
+            transform_fromhost_VkPhysicalDeviceMaintenance4PropertiesKHR(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceMaintenance4PropertiesKHR*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_ANDROID_native_buffer
-        case VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID:
-        {
-            transform_fromhost_VkNativeBufferANDROID(resourceTracker, reinterpret_cast<VkNativeBufferANDROID*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID: {
+            transform_fromhost_VkNativeBufferANDROID(
+                resourceTracker, reinterpret_cast<VkNativeBufferANDROID*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_debug_report
-        case VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT:
-        {
-            transform_fromhost_VkDebugReportCallbackCreateInfoEXT(resourceTracker, reinterpret_cast<VkDebugReportCallbackCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT: {
+            transform_fromhost_VkDebugReportCallbackCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkDebugReportCallbackCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_rasterization_order
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD:
-        {
-            transform_fromhost_VkPipelineRasterizationStateRasterizationOrderAMD(resourceTracker, reinterpret_cast<VkPipelineRasterizationStateRasterizationOrderAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD: {
+            transform_fromhost_VkPipelineRasterizationStateRasterizationOrderAMD(
+                resourceTracker,
+                reinterpret_cast<VkPipelineRasterizationStateRasterizationOrderAMD*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_dedicated_allocation
-        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV:
-        {
-            transform_fromhost_VkDedicatedAllocationImageCreateInfoNV(resourceTracker, reinterpret_cast<VkDedicatedAllocationImageCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV: {
+            transform_fromhost_VkDedicatedAllocationImageCreateInfoNV(
+                resourceTracker,
+                reinterpret_cast<VkDedicatedAllocationImageCreateInfoNV*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV:
-        {
-            transform_fromhost_VkDedicatedAllocationBufferCreateInfoNV(resourceTracker, reinterpret_cast<VkDedicatedAllocationBufferCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV: {
+            transform_fromhost_VkDedicatedAllocationBufferCreateInfoNV(
+                resourceTracker,
+                reinterpret_cast<VkDedicatedAllocationBufferCreateInfoNV*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV:
-        {
-            transform_fromhost_VkDedicatedAllocationMemoryAllocateInfoNV(resourceTracker, reinterpret_cast<VkDedicatedAllocationMemoryAllocateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV: {
+            transform_fromhost_VkDedicatedAllocationMemoryAllocateInfoNV(
+                resourceTracker,
+                reinterpret_cast<VkDedicatedAllocationMemoryAllocateInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_transform_feedback
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceTransformFeedbackFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceTransformFeedbackFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDeviceTransformFeedbackFeaturesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceTransformFeedbackFeaturesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceTransformFeedbackPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceTransformFeedbackPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT: {
+            transform_fromhost_VkPhysicalDeviceTransformFeedbackPropertiesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceTransformFeedbackPropertiesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT:
-        {
-            transform_fromhost_VkPipelineRasterizationStateStreamCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineRasterizationStateStreamCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT: {
+            transform_fromhost_VkPipelineRasterizationStateStreamCreateInfoEXT(
+                resourceTracker, reinterpret_cast<VkPipelineRasterizationStateStreamCreateInfoEXT*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_video_encode_h264
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_EXT:
-        {
-            transform_fromhost_VkVideoEncodeH264CapabilitiesEXT(resourceTracker, reinterpret_cast<VkVideoEncodeH264CapabilitiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_EXT: {
+            transform_fromhost_VkVideoEncodeH264CapabilitiesEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoEncodeH264CapabilitiesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_CREATE_INFO_EXT:
-        {
-            transform_fromhost_VkVideoEncodeH264SessionCreateInfoEXT(resourceTracker, reinterpret_cast<VkVideoEncodeH264SessionCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_CREATE_INFO_EXT: {
+            transform_fromhost_VkVideoEncodeH264SessionCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoEncodeH264SessionCreateInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
-            transform_fromhost_VkVideoEncodeH264SessionParametersAddInfoEXT(resourceTracker, reinterpret_cast<VkVideoEncodeH264SessionParametersAddInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT: {
+            transform_fromhost_VkVideoEncodeH264SessionParametersAddInfoEXT(
+                resourceTracker, reinterpret_cast<VkVideoEncodeH264SessionParametersAddInfoEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
-            transform_fromhost_VkVideoEncodeH264SessionParametersCreateInfoEXT(resourceTracker, reinterpret_cast<VkVideoEncodeH264SessionParametersCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT: {
+            transform_fromhost_VkVideoEncodeH264SessionParametersCreateInfoEXT(
+                resourceTracker, reinterpret_cast<VkVideoEncodeH264SessionParametersCreateInfoEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_VCL_FRAME_INFO_EXT:
-        {
-            transform_fromhost_VkVideoEncodeH264VclFrameInfoEXT(resourceTracker, reinterpret_cast<VkVideoEncodeH264VclFrameInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_VCL_FRAME_INFO_EXT: {
+            transform_fromhost_VkVideoEncodeH264VclFrameInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoEncodeH264VclFrameInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_EMIT_PICTURE_PARAMETERS_EXT:
-        {
-            transform_fromhost_VkVideoEncodeH264EmitPictureParametersEXT(resourceTracker, reinterpret_cast<VkVideoEncodeH264EmitPictureParametersEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_EMIT_PICTURE_PARAMETERS_EXT: {
+            transform_fromhost_VkVideoEncodeH264EmitPictureParametersEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoEncodeH264EmitPictureParametersEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_EXT:
-        {
-            transform_fromhost_VkVideoEncodeH264ProfileEXT(resourceTracker, reinterpret_cast<VkVideoEncodeH264ProfileEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_EXT: {
+            transform_fromhost_VkVideoEncodeH264ProfileEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoEncodeH264ProfileEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_video_encode_h265
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_EXT:
-        {
-            transform_fromhost_VkVideoEncodeH265CapabilitiesEXT(resourceTracker, reinterpret_cast<VkVideoEncodeH265CapabilitiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_EXT: {
+            transform_fromhost_VkVideoEncodeH265CapabilitiesEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoEncodeH265CapabilitiesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_CREATE_INFO_EXT:
-        {
-            transform_fromhost_VkVideoEncodeH265SessionCreateInfoEXT(resourceTracker, reinterpret_cast<VkVideoEncodeH265SessionCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_CREATE_INFO_EXT: {
+            transform_fromhost_VkVideoEncodeH265SessionCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoEncodeH265SessionCreateInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
-            transform_fromhost_VkVideoEncodeH265SessionParametersAddInfoEXT(resourceTracker, reinterpret_cast<VkVideoEncodeH265SessionParametersAddInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT: {
+            transform_fromhost_VkVideoEncodeH265SessionParametersAddInfoEXT(
+                resourceTracker, reinterpret_cast<VkVideoEncodeH265SessionParametersAddInfoEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
-            transform_fromhost_VkVideoEncodeH265SessionParametersCreateInfoEXT(resourceTracker, reinterpret_cast<VkVideoEncodeH265SessionParametersCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT: {
+            transform_fromhost_VkVideoEncodeH265SessionParametersCreateInfoEXT(
+                resourceTracker, reinterpret_cast<VkVideoEncodeH265SessionParametersCreateInfoEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_VCL_FRAME_INFO_EXT:
-        {
-            transform_fromhost_VkVideoEncodeH265VclFrameInfoEXT(resourceTracker, reinterpret_cast<VkVideoEncodeH265VclFrameInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_VCL_FRAME_INFO_EXT: {
+            transform_fromhost_VkVideoEncodeH265VclFrameInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoEncodeH265VclFrameInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_EMIT_PICTURE_PARAMETERS_EXT:
-        {
-            transform_fromhost_VkVideoEncodeH265EmitPictureParametersEXT(resourceTracker, reinterpret_cast<VkVideoEncodeH265EmitPictureParametersEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_EMIT_PICTURE_PARAMETERS_EXT: {
+            transform_fromhost_VkVideoEncodeH265EmitPictureParametersEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoEncodeH265EmitPictureParametersEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_EXT:
-        {
-            transform_fromhost_VkVideoEncodeH265ProfileEXT(resourceTracker, reinterpret_cast<VkVideoEncodeH265ProfileEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_EXT: {
+            transform_fromhost_VkVideoEncodeH265ProfileEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoEncodeH265ProfileEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_video_decode_h264
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_EXT:
-        {
-            transform_fromhost_VkVideoDecodeH264ProfileEXT(resourceTracker, reinterpret_cast<VkVideoDecodeH264ProfileEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_EXT: {
+            transform_fromhost_VkVideoDecodeH264ProfileEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoDecodeH264ProfileEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT:
-        {
-            transform_fromhost_VkVideoDecodeH264CapabilitiesEXT(resourceTracker, reinterpret_cast<VkVideoDecodeH264CapabilitiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT: {
+            transform_fromhost_VkVideoDecodeH264CapabilitiesEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoDecodeH264CapabilitiesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_CREATE_INFO_EXT:
-        {
-            transform_fromhost_VkVideoDecodeH264SessionCreateInfoEXT(resourceTracker, reinterpret_cast<VkVideoDecodeH264SessionCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_CREATE_INFO_EXT: {
+            transform_fromhost_VkVideoDecodeH264SessionCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoDecodeH264SessionCreateInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
-            transform_fromhost_VkVideoDecodeH264SessionParametersAddInfoEXT(resourceTracker, reinterpret_cast<VkVideoDecodeH264SessionParametersAddInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT: {
+            transform_fromhost_VkVideoDecodeH264SessionParametersAddInfoEXT(
+                resourceTracker, reinterpret_cast<VkVideoDecodeH264SessionParametersAddInfoEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
-            transform_fromhost_VkVideoDecodeH264SessionParametersCreateInfoEXT(resourceTracker, reinterpret_cast<VkVideoDecodeH264SessionParametersCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT: {
+            transform_fromhost_VkVideoDecodeH264SessionParametersCreateInfoEXT(
+                resourceTracker, reinterpret_cast<VkVideoDecodeH264SessionParametersCreateInfoEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT:
-        {
-            transform_fromhost_VkVideoDecodeH264PictureInfoEXT(resourceTracker, reinterpret_cast<VkVideoDecodeH264PictureInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT: {
+            transform_fromhost_VkVideoDecodeH264PictureInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoDecodeH264PictureInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_MVC_EXT:
-        {
-            transform_fromhost_VkVideoDecodeH264MvcEXT(resourceTracker, reinterpret_cast<VkVideoDecodeH264MvcEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_MVC_EXT: {
+            transform_fromhost_VkVideoDecodeH264MvcEXT(
+                resourceTracker, reinterpret_cast<VkVideoDecodeH264MvcEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT:
-        {
-            transform_fromhost_VkVideoDecodeH264DpbSlotInfoEXT(resourceTracker, reinterpret_cast<VkVideoDecodeH264DpbSlotInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT: {
+            transform_fromhost_VkVideoDecodeH264DpbSlotInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoDecodeH264DpbSlotInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_texture_gather_bias_lod
-        case VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD:
-        {
-            transform_fromhost_VkTextureLODGatherFormatPropertiesAMD(resourceTracker, reinterpret_cast<VkTextureLODGatherFormatPropertiesAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD: {
+            transform_fromhost_VkTextureLODGatherFormatPropertiesAMD(
+                resourceTracker,
+                reinterpret_cast<VkTextureLODGatherFormatPropertiesAMD*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_corner_sampled_image
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV:
-        {
-            transform_fromhost_VkPhysicalDeviceCornerSampledImageFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceCornerSampledImageFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV: {
+            transform_fromhost_VkPhysicalDeviceCornerSampledImageFeaturesNV(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceCornerSampledImageFeaturesNV*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_external_memory
-        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV:
-        {
-            transform_fromhost_VkExternalMemoryImageCreateInfoNV(resourceTracker, reinterpret_cast<VkExternalMemoryImageCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV: {
+            transform_fromhost_VkExternalMemoryImageCreateInfoNV(
+                resourceTracker,
+                reinterpret_cast<VkExternalMemoryImageCreateInfoNV*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV:
-        {
-            transform_fromhost_VkExportMemoryAllocateInfoNV(resourceTracker, reinterpret_cast<VkExportMemoryAllocateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV: {
+            transform_fromhost_VkExportMemoryAllocateInfoNV(
+                resourceTracker,
+                reinterpret_cast<VkExportMemoryAllocateInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_external_memory_win32
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV:
-        {
-            transform_fromhost_VkImportMemoryWin32HandleInfoNV(resourceTracker, reinterpret_cast<VkImportMemoryWin32HandleInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV: {
+            transform_fromhost_VkImportMemoryWin32HandleInfoNV(
+                resourceTracker,
+                reinterpret_cast<VkImportMemoryWin32HandleInfoNV*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV:
-        {
-            transform_fromhost_VkExportMemoryWin32HandleInfoNV(resourceTracker, reinterpret_cast<VkExportMemoryWin32HandleInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV: {
+            transform_fromhost_VkExportMemoryWin32HandleInfoNV(
+                resourceTracker,
+                reinterpret_cast<VkExportMemoryWin32HandleInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_win32_keyed_mutex
-        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV:
-        {
-            transform_fromhost_VkWin32KeyedMutexAcquireReleaseInfoNV(resourceTracker, reinterpret_cast<VkWin32KeyedMutexAcquireReleaseInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV: {
+            transform_fromhost_VkWin32KeyedMutexAcquireReleaseInfoNV(
+                resourceTracker,
+                reinterpret_cast<VkWin32KeyedMutexAcquireReleaseInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_validation_flags
-        case VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT:
-        {
-            transform_fromhost_VkValidationFlagsEXT(resourceTracker, reinterpret_cast<VkValidationFlagsEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT: {
+            transform_fromhost_VkValidationFlagsEXT(
+                resourceTracker, reinterpret_cast<VkValidationFlagsEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_texture_compression_astc_hdr
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_astc_decode_mode
-        case VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT:
-        {
-            transform_fromhost_VkImageViewASTCDecodeModeEXT(resourceTracker, reinterpret_cast<VkImageViewASTCDecodeModeEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT: {
+            transform_fromhost_VkImageViewASTCDecodeModeEXT(
+                resourceTracker,
+                reinterpret_cast<VkImageViewASTCDecodeModeEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceASTCDecodeFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceASTCDecodeFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDeviceASTCDecodeFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceASTCDecodeFeaturesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_conditional_rendering
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceConditionalRenderingFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceConditionalRenderingFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceConditionalRenderingFeaturesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT:
-        {
-            transform_fromhost_VkCommandBufferInheritanceConditionalRenderingInfoEXT(resourceTracker, reinterpret_cast<VkCommandBufferInheritanceConditionalRenderingInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT: {
+            transform_fromhost_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkCommandBufferInheritanceConditionalRenderingInfoEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_clip_space_w_scaling
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV:
-        {
-            transform_fromhost_VkPipelineViewportWScalingStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineViewportWScalingStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV: {
+            transform_fromhost_VkPipelineViewportWScalingStateCreateInfoNV(
+                resourceTracker, reinterpret_cast<VkPipelineViewportWScalingStateCreateInfoNV*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_display_control
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT:
-        {
-            transform_fromhost_VkSwapchainCounterCreateInfoEXT(resourceTracker, reinterpret_cast<VkSwapchainCounterCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT: {
+            transform_fromhost_VkSwapchainCounterCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkSwapchainCounterCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_GOOGLE_display_timing
-        case VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE:
-        {
-            transform_fromhost_VkPresentTimesInfoGOOGLE(resourceTracker, reinterpret_cast<VkPresentTimesInfoGOOGLE*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE: {
+            transform_fromhost_VkPresentTimesInfoGOOGLE(
+                resourceTracker, reinterpret_cast<VkPresentTimesInfoGOOGLE*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NVX_multiview_per_view_attributes
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX:
-        {
-            transform_fromhost_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(resourceTracker, reinterpret_cast<VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX: {
+            transform_fromhost_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_viewport_swizzle
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV:
-        {
-            transform_fromhost_VkPipelineViewportSwizzleStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineViewportSwizzleStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV: {
+            transform_fromhost_VkPipelineViewportSwizzleStateCreateInfoNV(
+                resourceTracker,
+                reinterpret_cast<VkPipelineViewportSwizzleStateCreateInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_discard_rectangles
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceDiscardRectanglePropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceDiscardRectanglePropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT: {
+            transform_fromhost_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceDiscardRectanglePropertiesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT:
-        {
-            transform_fromhost_VkPipelineDiscardRectangleStateCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineDiscardRectangleStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT: {
+            transform_fromhost_VkPipelineDiscardRectangleStateCreateInfoEXT(
+                resourceTracker, reinterpret_cast<VkPipelineDiscardRectangleStateCreateInfoEXT*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_conservative_rasterization
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceConservativeRasterizationPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT: {
+            transform_fromhost_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceConservativeRasterizationPropertiesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT:
-        {
-            transform_fromhost_VkPipelineRasterizationConservativeStateCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineRasterizationConservativeStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT: {
+            transform_fromhost_VkPipelineRasterizationConservativeStateCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkPipelineRasterizationConservativeStateCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_depth_clip_enable
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceDepthClipEnableFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceDepthClipEnableFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDeviceDepthClipEnableFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceDepthClipEnableFeaturesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT:
-        {
-            transform_fromhost_VkPipelineRasterizationDepthClipStateCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineRasterizationDepthClipStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT: {
+            transform_fromhost_VkPipelineRasterizationDepthClipStateCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkPipelineRasterizationDepthClipStateCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_debug_utils
-        case VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT:
-        {
-            transform_fromhost_VkDebugUtilsMessengerCreateInfoEXT(resourceTracker, reinterpret_cast<VkDebugUtilsMessengerCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT: {
+            transform_fromhost_VkDebugUtilsMessengerCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkDebugUtilsMessengerCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
-        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID:
-        {
-            transform_fromhost_VkAndroidHardwareBufferUsageANDROID(resourceTracker, reinterpret_cast<VkAndroidHardwareBufferUsageANDROID*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID: {
+            transform_fromhost_VkAndroidHardwareBufferUsageANDROID(
+                resourceTracker,
+                reinterpret_cast<VkAndroidHardwareBufferUsageANDROID*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID:
-        {
-            transform_fromhost_VkAndroidHardwareBufferFormatPropertiesANDROID(resourceTracker, reinterpret_cast<VkAndroidHardwareBufferFormatPropertiesANDROID*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID: {
+            transform_fromhost_VkAndroidHardwareBufferFormatPropertiesANDROID(
+                resourceTracker, reinterpret_cast<VkAndroidHardwareBufferFormatPropertiesANDROID*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID:
-        {
-            transform_fromhost_VkImportAndroidHardwareBufferInfoANDROID(resourceTracker, reinterpret_cast<VkImportAndroidHardwareBufferInfoANDROID*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID: {
+            transform_fromhost_VkImportAndroidHardwareBufferInfoANDROID(
+                resourceTracker,
+                reinterpret_cast<VkImportAndroidHardwareBufferInfoANDROID*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID:
-        {
-            transform_fromhost_VkExternalFormatANDROID(resourceTracker, reinterpret_cast<VkExternalFormatANDROID*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID: {
+            transform_fromhost_VkExternalFormatANDROID(
+                resourceTracker, reinterpret_cast<VkExternalFormatANDROID*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_2_ANDROID:
-        {
-            transform_fromhost_VkAndroidHardwareBufferFormatProperties2ANDROID(resourceTracker, reinterpret_cast<VkAndroidHardwareBufferFormatProperties2ANDROID*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_2_ANDROID: {
+            transform_fromhost_VkAndroidHardwareBufferFormatProperties2ANDROID(
+                resourceTracker, reinterpret_cast<VkAndroidHardwareBufferFormatProperties2ANDROID*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_inline_uniform_block
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceInlineUniformBlockFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDeviceInlineUniformBlockFeaturesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceInlineUniformBlockFeaturesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceInlineUniformBlockPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT: {
+            transform_fromhost_VkPhysicalDeviceInlineUniformBlockPropertiesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceInlineUniformBlockPropertiesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT:
-        {
-            transform_fromhost_VkWriteDescriptorSetInlineUniformBlockEXT(resourceTracker, reinterpret_cast<VkWriteDescriptorSetInlineUniformBlockEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT: {
+            transform_fromhost_VkWriteDescriptorSetInlineUniformBlockEXT(
+                resourceTracker,
+                reinterpret_cast<VkWriteDescriptorSetInlineUniformBlockEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT:
-        {
-            transform_fromhost_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(resourceTracker, reinterpret_cast<VkDescriptorPoolInlineUniformBlockCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT: {
+            transform_fromhost_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(
+                resourceTracker, reinterpret_cast<VkDescriptorPoolInlineUniformBlockCreateInfoEXT*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_sample_locations
-        case VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT:
-        {
-            transform_fromhost_VkSampleLocationsInfoEXT(resourceTracker, reinterpret_cast<VkSampleLocationsInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT: {
+            transform_fromhost_VkSampleLocationsInfoEXT(
+                resourceTracker, reinterpret_cast<VkSampleLocationsInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT:
-        {
-            transform_fromhost_VkRenderPassSampleLocationsBeginInfoEXT(resourceTracker, reinterpret_cast<VkRenderPassSampleLocationsBeginInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT: {
+            transform_fromhost_VkRenderPassSampleLocationsBeginInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkRenderPassSampleLocationsBeginInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT:
-        {
-            transform_fromhost_VkPipelineSampleLocationsStateCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineSampleLocationsStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT: {
+            transform_fromhost_VkPipelineSampleLocationsStateCreateInfoEXT(
+                resourceTracker, reinterpret_cast<VkPipelineSampleLocationsStateCreateInfoEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceSampleLocationsPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceSampleLocationsPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT: {
+            transform_fromhost_VkPhysicalDeviceSampleLocationsPropertiesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceSampleLocationsPropertiesEXT*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_blend_operation_advanced
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT: {
+            transform_fromhost_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT:
-        {
-            transform_fromhost_VkPipelineColorBlendAdvancedStateCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineColorBlendAdvancedStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT: {
+            transform_fromhost_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
+                resourceTracker, reinterpret_cast<VkPipelineColorBlendAdvancedStateCreateInfoEXT*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_fragment_coverage_to_color
-        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV:
-        {
-            transform_fromhost_VkPipelineCoverageToColorStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineCoverageToColorStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV: {
+            transform_fromhost_VkPipelineCoverageToColorStateCreateInfoNV(
+                resourceTracker,
+                reinterpret_cast<VkPipelineCoverageToColorStateCreateInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_framebuffer_mixed_samples
-        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV:
-        {
-            transform_fromhost_VkPipelineCoverageModulationStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineCoverageModulationStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV: {
+            transform_fromhost_VkPipelineCoverageModulationStateCreateInfoNV(
+                resourceTracker, reinterpret_cast<VkPipelineCoverageModulationStateCreateInfoNV*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_shader_sm_builtins
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV:
-        {
-            transform_fromhost_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderSMBuiltinsPropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV: {
+            transform_fromhost_VkPhysicalDeviceShaderSMBuiltinsPropertiesNV(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderSMBuiltinsPropertiesNV*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV:
-        {
-            transform_fromhost_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderSMBuiltinsFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV: {
+            transform_fromhost_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceShaderSMBuiltinsFeaturesNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_image_drm_format_modifier
-        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT:
-        {
-            transform_fromhost_VkDrmFormatModifierPropertiesListEXT(resourceTracker, reinterpret_cast<VkDrmFormatModifierPropertiesListEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT: {
+            transform_fromhost_VkDrmFormatModifierPropertiesListEXT(
+                resourceTracker,
+                reinterpret_cast<VkDrmFormatModifierPropertiesListEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceImageDrmFormatModifierInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT: {
+            transform_fromhost_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceImageDrmFormatModifierInfoEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT:
-        {
-            transform_fromhost_VkImageDrmFormatModifierListCreateInfoEXT(resourceTracker, reinterpret_cast<VkImageDrmFormatModifierListCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT: {
+            transform_fromhost_VkImageDrmFormatModifierListCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkImageDrmFormatModifierListCreateInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT:
-        {
-            transform_fromhost_VkImageDrmFormatModifierExplicitCreateInfoEXT(resourceTracker, reinterpret_cast<VkImageDrmFormatModifierExplicitCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT: {
+            transform_fromhost_VkImageDrmFormatModifierExplicitCreateInfoEXT(
+                resourceTracker, reinterpret_cast<VkImageDrmFormatModifierExplicitCreateInfoEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_2_EXT:
-        {
-            transform_fromhost_VkDrmFormatModifierPropertiesList2EXT(resourceTracker, reinterpret_cast<VkDrmFormatModifierPropertiesList2EXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_2_EXT: {
+            transform_fromhost_VkDrmFormatModifierPropertiesList2EXT(
+                resourceTracker,
+                reinterpret_cast<VkDrmFormatModifierPropertiesList2EXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_validation_cache
-        case VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT:
-        {
-            transform_fromhost_VkShaderModuleValidationCacheCreateInfoEXT(resourceTracker, reinterpret_cast<VkShaderModuleValidationCacheCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT: {
+            transform_fromhost_VkShaderModuleValidationCacheCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkShaderModuleValidationCacheCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_shading_rate_image
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV:
-        {
-            transform_fromhost_VkPipelineViewportShadingRateImageStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineViewportShadingRateImageStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV: {
+            transform_fromhost_VkPipelineViewportShadingRateImageStateCreateInfoNV(
+                resourceTracker,
+                reinterpret_cast<VkPipelineViewportShadingRateImageStateCreateInfoNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV:
-        {
-            transform_fromhost_VkPhysicalDeviceShadingRateImageFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceShadingRateImageFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV: {
+            transform_fromhost_VkPhysicalDeviceShadingRateImageFeaturesNV(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceShadingRateImageFeaturesNV*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV:
-        {
-            transform_fromhost_VkPhysicalDeviceShadingRateImagePropertiesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceShadingRateImagePropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV: {
+            transform_fromhost_VkPhysicalDeviceShadingRateImagePropertiesNV(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceShadingRateImagePropertiesNV*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV:
-        {
-            transform_fromhost_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineViewportCoarseSampleOrderStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV: {
+            transform_fromhost_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(
+                resourceTracker,
+                reinterpret_cast<VkPipelineViewportCoarseSampleOrderStateCreateInfoNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_ray_tracing
-        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV:
-        {
-            transform_fromhost_VkWriteDescriptorSetAccelerationStructureNV(resourceTracker, reinterpret_cast<VkWriteDescriptorSetAccelerationStructureNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV: {
+            transform_fromhost_VkWriteDescriptorSetAccelerationStructureNV(
+                resourceTracker, reinterpret_cast<VkWriteDescriptorSetAccelerationStructureNV*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV:
-        {
-            transform_fromhost_VkPhysicalDeviceRayTracingPropertiesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceRayTracingPropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV: {
+            transform_fromhost_VkPhysicalDeviceRayTracingPropertiesNV(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceRayTracingPropertiesNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_representative_fragment_test
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV:
-        {
-            transform_fromhost_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV: {
+            transform_fromhost_VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV:
-        {
-            transform_fromhost_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineRepresentativeFragmentTestStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV: {
+            transform_fromhost_VkPipelineRepresentativeFragmentTestStateCreateInfoNV(
+                resourceTracker,
+                reinterpret_cast<VkPipelineRepresentativeFragmentTestStateCreateInfoNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_filter_cubic
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceImageViewImageFormatInfoEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceImageViewImageFormatInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT: {
+            transform_fromhost_VkPhysicalDeviceImageViewImageFormatInfoEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceImageViewImageFormatInfoEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT:
-        {
-            transform_fromhost_VkFilterCubicImageViewImageFormatPropertiesEXT(resourceTracker, reinterpret_cast<VkFilterCubicImageViewImageFormatPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT: {
+            transform_fromhost_VkFilterCubicImageViewImageFormatPropertiesEXT(
+                resourceTracker, reinterpret_cast<VkFilterCubicImageViewImageFormatPropertiesEXT*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_global_priority
-        case VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT:
-        {
-            transform_fromhost_VkDeviceQueueGlobalPriorityCreateInfoEXT(resourceTracker, reinterpret_cast<VkDeviceQueueGlobalPriorityCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT: {
+            transform_fromhost_VkDeviceQueueGlobalPriorityCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkDeviceQueueGlobalPriorityCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_external_memory_host
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT:
-        {
-            transform_fromhost_VkImportMemoryHostPointerInfoEXT(resourceTracker, reinterpret_cast<VkImportMemoryHostPointerInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT: {
+            transform_fromhost_VkImportMemoryHostPointerInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkImportMemoryHostPointerInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceExternalMemoryHostPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT: {
+            transform_fromhost_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceExternalMemoryHostPropertiesEXT*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_pipeline_compiler_control
-        case VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD:
-        {
-            transform_fromhost_VkPipelineCompilerControlCreateInfoAMD(resourceTracker, reinterpret_cast<VkPipelineCompilerControlCreateInfoAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD: {
+            transform_fromhost_VkPipelineCompilerControlCreateInfoAMD(
+                resourceTracker,
+                reinterpret_cast<VkPipelineCompilerControlCreateInfoAMD*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_shader_core_properties
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD:
-        {
-            transform_fromhost_VkPhysicalDeviceShaderCorePropertiesAMD(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderCorePropertiesAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD: {
+            transform_fromhost_VkPhysicalDeviceShaderCorePropertiesAMD(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceShaderCorePropertiesAMD*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_video_decode_h265
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_EXT:
-        {
-            transform_fromhost_VkVideoDecodeH265ProfileEXT(resourceTracker, reinterpret_cast<VkVideoDecodeH265ProfileEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_EXT: {
+            transform_fromhost_VkVideoDecodeH265ProfileEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoDecodeH265ProfileEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT:
-        {
-            transform_fromhost_VkVideoDecodeH265CapabilitiesEXT(resourceTracker, reinterpret_cast<VkVideoDecodeH265CapabilitiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT: {
+            transform_fromhost_VkVideoDecodeH265CapabilitiesEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoDecodeH265CapabilitiesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_CREATE_INFO_EXT:
-        {
-            transform_fromhost_VkVideoDecodeH265SessionCreateInfoEXT(resourceTracker, reinterpret_cast<VkVideoDecodeH265SessionCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_CREATE_INFO_EXT: {
+            transform_fromhost_VkVideoDecodeH265SessionCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoDecodeH265SessionCreateInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT:
-        {
-            transform_fromhost_VkVideoDecodeH265SessionParametersAddInfoEXT(resourceTracker, reinterpret_cast<VkVideoDecodeH265SessionParametersAddInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT: {
+            transform_fromhost_VkVideoDecodeH265SessionParametersAddInfoEXT(
+                resourceTracker, reinterpret_cast<VkVideoDecodeH265SessionParametersAddInfoEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT:
-        {
-            transform_fromhost_VkVideoDecodeH265SessionParametersCreateInfoEXT(resourceTracker, reinterpret_cast<VkVideoDecodeH265SessionParametersCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT: {
+            transform_fromhost_VkVideoDecodeH265SessionParametersCreateInfoEXT(
+                resourceTracker, reinterpret_cast<VkVideoDecodeH265SessionParametersCreateInfoEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT:
-        {
-            transform_fromhost_VkVideoDecodeH265PictureInfoEXT(resourceTracker, reinterpret_cast<VkVideoDecodeH265PictureInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT: {
+            transform_fromhost_VkVideoDecodeH265PictureInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoDecodeH265PictureInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT:
-        {
-            transform_fromhost_VkVideoDecodeH265DpbSlotInfoEXT(resourceTracker, reinterpret_cast<VkVideoDecodeH265DpbSlotInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT: {
+            transform_fromhost_VkVideoDecodeH265DpbSlotInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkVideoDecodeH265DpbSlotInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_memory_overallocation_behavior
-        case VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD:
-        {
-            transform_fromhost_VkDeviceMemoryOverallocationCreateInfoAMD(resourceTracker, reinterpret_cast<VkDeviceMemoryOverallocationCreateInfoAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD: {
+            transform_fromhost_VkDeviceMemoryOverallocationCreateInfoAMD(
+                resourceTracker,
+                reinterpret_cast<VkDeviceMemoryOverallocationCreateInfoAMD*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_vertex_attribute_divisor
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT: {
+            transform_fromhost_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT:
-        {
-            transform_fromhost_VkPipelineVertexInputDivisorStateCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineVertexInputDivisorStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT: {
+            transform_fromhost_VkPipelineVertexInputDivisorStateCreateInfoEXT(
+                resourceTracker, reinterpret_cast<VkPipelineVertexInputDivisorStateCreateInfoEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_GGP_frame_token
-        case VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP:
-        {
-            transform_fromhost_VkPresentFrameTokenGGP(resourceTracker, reinterpret_cast<VkPresentFrameTokenGGP*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP: {
+            transform_fromhost_VkPresentFrameTokenGGP(
+                resourceTracker, reinterpret_cast<VkPresentFrameTokenGGP*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_pipeline_creation_feedback
-        case VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT:
-        {
-            transform_fromhost_VkPipelineCreationFeedbackCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineCreationFeedbackCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT: {
+            transform_fromhost_VkPipelineCreationFeedbackCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkPipelineCreationFeedbackCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_compute_shader_derivatives
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV:
-        {
-            transform_fromhost_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceComputeShaderDerivativesFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV: {
+            transform_fromhost_VkPhysicalDeviceComputeShaderDerivativesFeaturesNV(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceComputeShaderDerivativesFeaturesNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_mesh_shader
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV:
-        {
-            transform_fromhost_VkPhysicalDeviceMeshShaderFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceMeshShaderFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV: {
+            transform_fromhost_VkPhysicalDeviceMeshShaderFeaturesNV(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceMeshShaderFeaturesNV*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV:
-        {
-            transform_fromhost_VkPhysicalDeviceMeshShaderPropertiesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceMeshShaderPropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV: {
+            transform_fromhost_VkPhysicalDeviceMeshShaderPropertiesNV(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceMeshShaderPropertiesNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_fragment_shader_barycentric
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV:
-        {
-            transform_fromhost_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV: {
+            transform_fromhost_VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_shader_image_footprint
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV:
-        {
-            transform_fromhost_VkPhysicalDeviceShaderImageFootprintFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderImageFootprintFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV: {
+            transform_fromhost_VkPhysicalDeviceShaderImageFootprintFeaturesNV(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderImageFootprintFeaturesNV*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_scissor_exclusive
-        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV:
-        {
-            transform_fromhost_VkPipelineViewportExclusiveScissorStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineViewportExclusiveScissorStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV: {
+            transform_fromhost_VkPipelineViewportExclusiveScissorStateCreateInfoNV(
+                resourceTracker,
+                reinterpret_cast<VkPipelineViewportExclusiveScissorStateCreateInfoNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV:
-        {
-            transform_fromhost_VkPhysicalDeviceExclusiveScissorFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceExclusiveScissorFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV: {
+            transform_fromhost_VkPhysicalDeviceExclusiveScissorFeaturesNV(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceExclusiveScissorFeaturesNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
-        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV:
-        {
-            transform_fromhost_VkQueueFamilyCheckpointPropertiesNV(resourceTracker, reinterpret_cast<VkQueueFamilyCheckpointPropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV: {
+            transform_fromhost_VkQueueFamilyCheckpointPropertiesNV(
+                resourceTracker,
+                reinterpret_cast<VkQueueFamilyCheckpointPropertiesNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_INTEL_shader_integer_functions2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL:
-        {
-            transform_fromhost_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL: {
+            transform_fromhost_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_INTEL_performance_query
-        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL:
-        {
-            transform_fromhost_VkQueryPoolPerformanceQueryCreateInfoINTEL(resourceTracker, reinterpret_cast<VkQueryPoolPerformanceQueryCreateInfoINTEL*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL: {
+            transform_fromhost_VkQueryPoolPerformanceQueryCreateInfoINTEL(
+                resourceTracker,
+                reinterpret_cast<VkQueryPoolPerformanceQueryCreateInfoINTEL*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_pci_bus_info
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT:
-        {
-            transform_fromhost_VkPhysicalDevicePCIBusInfoPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDevicePCIBusInfoPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT: {
+            transform_fromhost_VkPhysicalDevicePCIBusInfoPropertiesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDevicePCIBusInfoPropertiesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_display_native_hdr
-        case VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD:
-        {
-            transform_fromhost_VkDisplayNativeHdrSurfaceCapabilitiesAMD(resourceTracker, reinterpret_cast<VkDisplayNativeHdrSurfaceCapabilitiesAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD: {
+            transform_fromhost_VkDisplayNativeHdrSurfaceCapabilitiesAMD(
+                resourceTracker,
+                reinterpret_cast<VkDisplayNativeHdrSurfaceCapabilitiesAMD*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD:
-        {
-            transform_fromhost_VkSwapchainDisplayNativeHdrCreateInfoAMD(resourceTracker, reinterpret_cast<VkSwapchainDisplayNativeHdrCreateInfoAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD: {
+            transform_fromhost_VkSwapchainDisplayNativeHdrCreateInfoAMD(
+                resourceTracker,
+                reinterpret_cast<VkSwapchainDisplayNativeHdrCreateInfoAMD*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_fragment_density_map
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDeviceFragmentDensityMapFeaturesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentDensityMapFeaturesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT: {
+            transform_fromhost_VkPhysicalDeviceFragmentDensityMapPropertiesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentDensityMapPropertiesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT:
-        {
-            transform_fromhost_VkRenderPassFragmentDensityMapCreateInfoEXT(resourceTracker, reinterpret_cast<VkRenderPassFragmentDensityMapCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT: {
+            transform_fromhost_VkRenderPassFragmentDensityMapCreateInfoEXT(
+                resourceTracker, reinterpret_cast<VkRenderPassFragmentDensityMapCreateInfoEXT*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_subgroup_size_control
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceSubgroupSizeControlFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceSubgroupSizeControlFeaturesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceSubgroupSizeControlPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT: {
+            transform_fromhost_VkPhysicalDeviceSubgroupSizeControlPropertiesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceSubgroupSizeControlPropertiesEXT*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT:
-        {
-            transform_fromhost_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT: {
+            transform_fromhost_VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_shader_core_properties2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD:
-        {
-            transform_fromhost_VkPhysicalDeviceShaderCoreProperties2AMD(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderCoreProperties2AMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD: {
+            transform_fromhost_VkPhysicalDeviceShaderCoreProperties2AMD(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceShaderCoreProperties2AMD*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_AMD_device_coherent_memory
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD:
-        {
-            transform_fromhost_VkPhysicalDeviceCoherentMemoryFeaturesAMD(resourceTracker, reinterpret_cast<VkPhysicalDeviceCoherentMemoryFeaturesAMD*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD: {
+            transform_fromhost_VkPhysicalDeviceCoherentMemoryFeaturesAMD(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceCoherentMemoryFeaturesAMD*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_shader_image_atomic_int64
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_memory_budget
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceMemoryBudgetPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceMemoryBudgetPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT: {
+            transform_fromhost_VkPhysicalDeviceMemoryBudgetPropertiesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceMemoryBudgetPropertiesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_memory_priority
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceMemoryPriorityFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceMemoryPriorityFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDeviceMemoryPriorityFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceMemoryPriorityFeaturesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT:
-        {
-            transform_fromhost_VkMemoryPriorityAllocateInfoEXT(resourceTracker, reinterpret_cast<VkMemoryPriorityAllocateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT: {
+            transform_fromhost_VkMemoryPriorityAllocateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkMemoryPriorityAllocateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_dedicated_allocation_image_aliasing
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV:
-        {
-            transform_fromhost_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV: {
+            transform_fromhost_VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_buffer_device_address
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceBufferDeviceAddressFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceBufferDeviceAddressFeaturesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT:
-        {
-            transform_fromhost_VkBufferDeviceAddressCreateInfoEXT(resourceTracker, reinterpret_cast<VkBufferDeviceAddressCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT: {
+            transform_fromhost_VkBufferDeviceAddressCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkBufferDeviceAddressCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_validation_features
-        case VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT:
-        {
-            transform_fromhost_VkValidationFeaturesEXT(resourceTracker, reinterpret_cast<VkValidationFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT: {
+            transform_fromhost_VkValidationFeaturesEXT(
+                resourceTracker, reinterpret_cast<VkValidationFeaturesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_cooperative_matrix
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV:
-        {
-            transform_fromhost_VkPhysicalDeviceCooperativeMatrixFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceCooperativeMatrixFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV: {
+            transform_fromhost_VkPhysicalDeviceCooperativeMatrixFeaturesNV(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceCooperativeMatrixFeaturesNV*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV:
-        {
-            transform_fromhost_VkPhysicalDeviceCooperativeMatrixPropertiesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceCooperativeMatrixPropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV: {
+            transform_fromhost_VkPhysicalDeviceCooperativeMatrixPropertiesNV(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceCooperativeMatrixPropertiesNV*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_coverage_reduction_mode
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV:
-        {
-            transform_fromhost_VkPhysicalDeviceCoverageReductionModeFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceCoverageReductionModeFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV: {
+            transform_fromhost_VkPhysicalDeviceCoverageReductionModeFeaturesNV(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceCoverageReductionModeFeaturesNV*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV:
-        {
-            transform_fromhost_VkPipelineCoverageReductionStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineCoverageReductionStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV: {
+            transform_fromhost_VkPipelineCoverageReductionStateCreateInfoNV(
+                resourceTracker, reinterpret_cast<VkPipelineCoverageReductionStateCreateInfoNV*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_fragment_shader_interlock
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_ycbcr_image_arrays
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDeviceYcbcrImageArraysFeaturesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_provoking_vertex
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceProvokingVertexFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceProvokingVertexFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDeviceProvokingVertexFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceProvokingVertexFeaturesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_PROPERTIES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceProvokingVertexPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceProvokingVertexPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_PROPERTIES_EXT: {
+            transform_fromhost_VkPhysicalDeviceProvokingVertexPropertiesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceProvokingVertexPropertiesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT:
-        {
-            transform_fromhost_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineRasterizationProvokingVertexStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT: {
+            transform_fromhost_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkPipelineRasterizationProvokingVertexStateCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_full_screen_exclusive
-        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT:
-        {
-            transform_fromhost_VkSurfaceFullScreenExclusiveInfoEXT(resourceTracker, reinterpret_cast<VkSurfaceFullScreenExclusiveInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT: {
+            transform_fromhost_VkSurfaceFullScreenExclusiveInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkSurfaceFullScreenExclusiveInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT:
-        {
-            transform_fromhost_VkSurfaceCapabilitiesFullScreenExclusiveEXT(resourceTracker, reinterpret_cast<VkSurfaceCapabilitiesFullScreenExclusiveEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT: {
+            transform_fromhost_VkSurfaceCapabilitiesFullScreenExclusiveEXT(
+                resourceTracker, reinterpret_cast<VkSurfaceCapabilitiesFullScreenExclusiveEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT:
-        {
-            transform_fromhost_VkSurfaceFullScreenExclusiveWin32InfoEXT(resourceTracker, reinterpret_cast<VkSurfaceFullScreenExclusiveWin32InfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT: {
+            transform_fromhost_VkSurfaceFullScreenExclusiveWin32InfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkSurfaceFullScreenExclusiveWin32InfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_line_rasterization
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceLineRasterizationFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceLineRasterizationFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDeviceLineRasterizationFeaturesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceLineRasterizationFeaturesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceLineRasterizationPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceLineRasterizationPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT: {
+            transform_fromhost_VkPhysicalDeviceLineRasterizationPropertiesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceLineRasterizationPropertiesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT:
-        {
-            transform_fromhost_VkPipelineRasterizationLineStateCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineRasterizationLineStateCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT: {
+            transform_fromhost_VkPipelineRasterizationLineStateCreateInfoEXT(
+                resourceTracker, reinterpret_cast<VkPipelineRasterizationLineStateCreateInfoEXT*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_shader_atomic_float
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_index_type_uint8
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceIndexTypeUint8FeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceIndexTypeUint8FeaturesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_shader_atomic_float2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_device_generated_commands
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV:
-        {
-            transform_fromhost_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV: {
+            transform_fromhost_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV:
-        {
-            transform_fromhost_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV: {
+            transform_fromhost_VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV:
-        {
-            transform_fromhost_VkGraphicsPipelineShaderGroupsCreateInfoNV(resourceTracker, reinterpret_cast<VkGraphicsPipelineShaderGroupsCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV: {
+            transform_fromhost_VkGraphicsPipelineShaderGroupsCreateInfoNV(
+                resourceTracker,
+                reinterpret_cast<VkGraphicsPipelineShaderGroupsCreateInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_inherited_viewport_scissor
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV:
-        {
-            transform_fromhost_VkPhysicalDeviceInheritedViewportScissorFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceInheritedViewportScissorFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV: {
+            transform_fromhost_VkPhysicalDeviceInheritedViewportScissorFeaturesNV(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceInheritedViewportScissorFeaturesNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_VIEWPORT_SCISSOR_INFO_NV:
-        {
-            transform_fromhost_VkCommandBufferInheritanceViewportScissorInfoNV(resourceTracker, reinterpret_cast<VkCommandBufferInheritanceViewportScissorInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_VIEWPORT_SCISSOR_INFO_NV: {
+            transform_fromhost_VkCommandBufferInheritanceViewportScissorInfoNV(
+                resourceTracker, reinterpret_cast<VkCommandBufferInheritanceViewportScissorInfoNV*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_texel_buffer_alignment
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT: {
+            transform_fromhost_VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_QCOM_render_pass_transform
-        case VK_STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM:
-        {
-            transform_fromhost_VkRenderPassTransformBeginInfoQCOM(resourceTracker, reinterpret_cast<VkRenderPassTransformBeginInfoQCOM*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM: {
+            transform_fromhost_VkRenderPassTransformBeginInfoQCOM(
+                resourceTracker,
+                reinterpret_cast<VkRenderPassTransformBeginInfoQCOM*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM:
-        {
-            transform_fromhost_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(resourceTracker, reinterpret_cast<VkCommandBufferInheritanceRenderPassTransformInfoQCOM*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM: {
+            transform_fromhost_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(
+                resourceTracker,
+                reinterpret_cast<VkCommandBufferInheritanceRenderPassTransformInfoQCOM*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_device_memory_report
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceDeviceMemoryReportFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDeviceDeviceMemoryReportFeaturesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceDeviceMemoryReportFeaturesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT:
-        {
-            transform_fromhost_VkDeviceDeviceMemoryReportCreateInfoEXT(resourceTracker, reinterpret_cast<VkDeviceDeviceMemoryReportCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT: {
+            transform_fromhost_VkDeviceDeviceMemoryReportCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkDeviceDeviceMemoryReportCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_robustness2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceRobustness2FeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceRobustness2FeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDeviceRobustness2FeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceRobustness2FeaturesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceRobustness2PropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceRobustness2PropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT: {
+            transform_fromhost_VkPhysicalDeviceRobustness2PropertiesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceRobustness2PropertiesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_custom_border_color
-        case VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT:
-        {
-            transform_fromhost_VkSamplerCustomBorderColorCreateInfoEXT(resourceTracker, reinterpret_cast<VkSamplerCustomBorderColorCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT: {
+            transform_fromhost_VkSamplerCustomBorderColorCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkSamplerCustomBorderColorCreateInfoEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceCustomBorderColorPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceCustomBorderColorPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT: {
+            transform_fromhost_VkPhysicalDeviceCustomBorderColorPropertiesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceCustomBorderColorPropertiesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceCustomBorderColorFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceCustomBorderColorFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDeviceCustomBorderColorFeaturesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceCustomBorderColorFeaturesEXT*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_private_data
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDevicePrivateDataFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDevicePrivateDataFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDevicePrivateDataFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDevicePrivateDataFeaturesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT:
-        {
-            transform_fromhost_VkDevicePrivateDataCreateInfoEXT(resourceTracker, reinterpret_cast<VkDevicePrivateDataCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT: {
+            transform_fromhost_VkDevicePrivateDataCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkDevicePrivateDataCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_pipeline_creation_cache_control
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_device_diagnostics_config
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV:
-        {
-            transform_fromhost_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceDiagnosticsConfigFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV: {
+            transform_fromhost_VkPhysicalDeviceDiagnosticsConfigFeaturesNV(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceDiagnosticsConfigFeaturesNV*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV:
-        {
-            transform_fromhost_VkDeviceDiagnosticsConfigCreateInfoNV(resourceTracker, reinterpret_cast<VkDeviceDiagnosticsConfigCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV: {
+            transform_fromhost_VkDeviceDiagnosticsConfigCreateInfoNV(
+                resourceTracker,
+                reinterpret_cast<VkDeviceDiagnosticsConfigCreateInfoNV*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_fragment_shading_rate_enums
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV:
-        {
-            transform_fromhost_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV: {
+            transform_fromhost_VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV:
-        {
-            transform_fromhost_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV: {
+            transform_fromhost_VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV:
-        {
-            transform_fromhost_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(resourceTracker, reinterpret_cast<VkPipelineFragmentShadingRateEnumStateCreateInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV: {
+            transform_fromhost_VkPipelineFragmentShadingRateEnumStateCreateInfoNV(
+                resourceTracker,
+                reinterpret_cast<VkPipelineFragmentShadingRateEnumStateCreateInfoNV*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_ray_tracing_motion_blur
-        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_MOTION_TRIANGLES_DATA_NV:
-        {
-            transform_fromhost_VkAccelerationStructureGeometryMotionTrianglesDataNV(resourceTracker, reinterpret_cast<VkAccelerationStructureGeometryMotionTrianglesDataNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_MOTION_TRIANGLES_DATA_NV: {
+            transform_fromhost_VkAccelerationStructureGeometryMotionTrianglesDataNV(
+                resourceTracker,
+                reinterpret_cast<VkAccelerationStructureGeometryMotionTrianglesDataNV*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MOTION_INFO_NV:
-        {
-            transform_fromhost_VkAccelerationStructureMotionInfoNV(resourceTracker, reinterpret_cast<VkAccelerationStructureMotionInfoNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MOTION_INFO_NV: {
+            transform_fromhost_VkAccelerationStructureMotionInfoNV(
+                resourceTracker,
+                reinterpret_cast<VkAccelerationStructureMotionInfoNV*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV:
-        {
-            transform_fromhost_VkPhysicalDeviceRayTracingMotionBlurFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceRayTracingMotionBlurFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV: {
+            transform_fromhost_VkPhysicalDeviceRayTracingMotionBlurFeaturesNV(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceRayTracingMotionBlurFeaturesNV*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_ycbcr_2plane_444_formats
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_fragment_density_map2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2FeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2FeaturesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2PropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT: {
+            transform_fromhost_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2PropertiesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_QCOM_rotated_copy_commands
-        case VK_STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM:
-        {
-            transform_fromhost_VkCopyCommandTransformInfoQCOM(resourceTracker, reinterpret_cast<VkCopyCommandTransformInfoQCOM*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM: {
+            transform_fromhost_VkCopyCommandTransformInfoQCOM(
+                resourceTracker,
+                reinterpret_cast<VkCopyCommandTransformInfoQCOM*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_image_robustness
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceImageRobustnessFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceImageRobustnessFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDeviceImageRobustnessFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceImageRobustnessFeaturesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_4444_formats
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDevice4444FormatsFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDevice4444FormatsFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDevice4444FormatsFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDevice4444FormatsFeaturesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_rgba10x6_formats
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_VALVE_mutable_descriptor_type
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE:
-        {
-            transform_fromhost_VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE(resourceTracker, reinterpret_cast<VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE: {
+            transform_fromhost_VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE:
-        {
-            transform_fromhost_VkMutableDescriptorTypeCreateInfoVALVE(resourceTracker, reinterpret_cast<VkMutableDescriptorTypeCreateInfoVALVE*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE: {
+            transform_fromhost_VkMutableDescriptorTypeCreateInfoVALVE(
+                resourceTracker,
+                reinterpret_cast<VkMutableDescriptorTypeCreateInfoVALVE*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_vertex_input_dynamic_state
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_physical_device_drm
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRM_PROPERTIES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceDrmPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceDrmPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRM_PROPERTIES_EXT: {
+            transform_fromhost_VkPhysicalDeviceDrmPropertiesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceDrmPropertiesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_primitive_topology_list_restart
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_FUCHSIA_external_memory
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA:
-        {
-            transform_fromhost_VkImportMemoryZirconHandleInfoFUCHSIA(resourceTracker, reinterpret_cast<VkImportMemoryZirconHandleInfoFUCHSIA*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA: {
+            transform_fromhost_VkImportMemoryZirconHandleInfoFUCHSIA(
+                resourceTracker,
+                reinterpret_cast<VkImportMemoryZirconHandleInfoFUCHSIA*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
-        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA:
-        {
-            transform_fromhost_VkImportMemoryBufferCollectionFUCHSIA(resourceTracker, reinterpret_cast<VkImportMemoryBufferCollectionFUCHSIA*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA: {
+            transform_fromhost_VkImportMemoryBufferCollectionFUCHSIA(
+                resourceTracker,
+                reinterpret_cast<VkImportMemoryBufferCollectionFUCHSIA*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA:
-        {
-            transform_fromhost_VkBufferCollectionImageCreateInfoFUCHSIA(resourceTracker, reinterpret_cast<VkBufferCollectionImageCreateInfoFUCHSIA*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA: {
+            transform_fromhost_VkBufferCollectionImageCreateInfoFUCHSIA(
+                resourceTracker,
+                reinterpret_cast<VkBufferCollectionImageCreateInfoFUCHSIA*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_BUFFER_CREATE_INFO_FUCHSIA:
-        {
-            transform_fromhost_VkBufferCollectionBufferCreateInfoFUCHSIA(resourceTracker, reinterpret_cast<VkBufferCollectionBufferCreateInfoFUCHSIA*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_BUFFER_CREATE_INFO_FUCHSIA: {
+            transform_fromhost_VkBufferCollectionBufferCreateInfoFUCHSIA(
+                resourceTracker,
+                reinterpret_cast<VkBufferCollectionBufferCreateInfoFUCHSIA*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_HUAWEI_subpass_shading
-        case VK_STRUCTURE_TYPE_SUBPASS_SHADING_PIPELINE_CREATE_INFO_HUAWEI:
-        {
-            transform_fromhost_VkSubpassShadingPipelineCreateInfoHUAWEI(resourceTracker, reinterpret_cast<VkSubpassShadingPipelineCreateInfoHUAWEI*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SUBPASS_SHADING_PIPELINE_CREATE_INFO_HUAWEI: {
+            transform_fromhost_VkSubpassShadingPipelineCreateInfoHUAWEI(
+                resourceTracker,
+                reinterpret_cast<VkSubpassShadingPipelineCreateInfoHUAWEI*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI:
-        {
-            transform_fromhost_VkPhysicalDeviceSubpassShadingFeaturesHUAWEI(resourceTracker, reinterpret_cast<VkPhysicalDeviceSubpassShadingFeaturesHUAWEI*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI: {
+            transform_fromhost_VkPhysicalDeviceSubpassShadingFeaturesHUAWEI(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceSubpassShadingFeaturesHUAWEI*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_PROPERTIES_HUAWEI:
-        {
-            transform_fromhost_VkPhysicalDeviceSubpassShadingPropertiesHUAWEI(resourceTracker, reinterpret_cast<VkPhysicalDeviceSubpassShadingPropertiesHUAWEI*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_PROPERTIES_HUAWEI: {
+            transform_fromhost_VkPhysicalDeviceSubpassShadingPropertiesHUAWEI(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceSubpassShadingPropertiesHUAWEI*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_HUAWEI_invocation_mask
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI:
-        {
-            transform_fromhost_VkPhysicalDeviceInvocationMaskFeaturesHUAWEI(resourceTracker, reinterpret_cast<VkPhysicalDeviceInvocationMaskFeaturesHUAWEI*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI: {
+            transform_fromhost_VkPhysicalDeviceInvocationMaskFeaturesHUAWEI(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceInvocationMaskFeaturesHUAWEI*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_NV_external_memory_rdma
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV:
-        {
-            transform_fromhost_VkPhysicalDeviceExternalMemoryRDMAFeaturesNV(resourceTracker, reinterpret_cast<VkPhysicalDeviceExternalMemoryRDMAFeaturesNV*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV: {
+            transform_fromhost_VkPhysicalDeviceExternalMemoryRDMAFeaturesNV(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceExternalMemoryRDMAFeaturesNV*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_extended_dynamic_state2
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceExtendedDynamicState2FeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceExtendedDynamicState2FeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDeviceExtendedDynamicState2FeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceExtendedDynamicState2FeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_color_write_enable
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceColorWriteEnableFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceColorWriteEnableFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDeviceColorWriteEnableFeaturesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceColorWriteEnableFeaturesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_WRITE_CREATE_INFO_EXT:
-        {
-            transform_fromhost_VkPipelineColorWriteCreateInfoEXT(resourceTracker, reinterpret_cast<VkPipelineColorWriteCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_WRITE_CREATE_INFO_EXT: {
+            transform_fromhost_VkPipelineColorWriteCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkPipelineColorWriteCreateInfoEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_GOOGLE_gfxstream
-        case VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE:
-        {
-            transform_fromhost_VkImportColorBufferGOOGLE(resourceTracker, reinterpret_cast<VkImportColorBufferGOOGLE*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE: {
+            transform_fromhost_VkImportColorBufferGOOGLE(
+                resourceTracker, reinterpret_cast<VkImportColorBufferGOOGLE*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE:
-        {
-            transform_fromhost_VkImportBufferGOOGLE(resourceTracker, reinterpret_cast<VkImportBufferGOOGLE*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE: {
+            transform_fromhost_VkImportBufferGOOGLE(
+                resourceTracker, reinterpret_cast<VkImportBufferGOOGLE*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE:
-        {
-            transform_fromhost_VkImportPhysicalAddressGOOGLE(resourceTracker, reinterpret_cast<VkImportPhysicalAddressGOOGLE*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE: {
+            transform_fromhost_VkImportPhysicalAddressGOOGLE(
+                resourceTracker,
+                reinterpret_cast<VkImportPhysicalAddressGOOGLE*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_global_priority_query
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_EXT:
-        {
-            transform_fromhost_VkQueueFamilyGlobalPriorityPropertiesEXT(resourceTracker, reinterpret_cast<VkQueueFamilyGlobalPriorityPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_EXT: {
+            transform_fromhost_VkQueueFamilyGlobalPriorityPropertiesEXT(
+                resourceTracker,
+                reinterpret_cast<VkQueueFamilyGlobalPriorityPropertiesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_multi_draw
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceMultiDrawFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceMultiDrawFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDeviceMultiDrawFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceMultiDrawFeaturesEXT*>(structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceMultiDrawPropertiesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceMultiDrawPropertiesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT: {
+            transform_fromhost_VkPhysicalDeviceMultiDrawPropertiesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceMultiDrawPropertiesEXT*>(structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_border_color_swizzle
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDeviceBorderColorSwizzleFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDeviceBorderColorSwizzleFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDeviceBorderColorSwizzleFeaturesEXT(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceBorderColorSwizzleFeaturesEXT*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_SAMPLER_BORDER_COLOR_COMPONENT_MAPPING_CREATE_INFO_EXT:
-        {
-            transform_fromhost_VkSamplerBorderColorComponentMappingCreateInfoEXT(resourceTracker, reinterpret_cast<VkSamplerBorderColorComponentMappingCreateInfoEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_SAMPLER_BORDER_COLOR_COMPONENT_MAPPING_CREATE_INFO_EXT: {
+            transform_fromhost_VkSamplerBorderColorComponentMappingCreateInfoEXT(
+                resourceTracker,
+                reinterpret_cast<VkSamplerBorderColorComponentMappingCreateInfoEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_EXT_pageable_device_local_memory
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT:
-        {
-            transform_fromhost_VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT(resourceTracker, reinterpret_cast<VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT: {
+            transform_fromhost_VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_acceleration_structure
-        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR:
-        {
-            transform_fromhost_VkWriteDescriptorSetAccelerationStructureKHR(resourceTracker, reinterpret_cast<VkWriteDescriptorSetAccelerationStructureKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR: {
+            transform_fromhost_VkWriteDescriptorSetAccelerationStructureKHR(
+                resourceTracker, reinterpret_cast<VkWriteDescriptorSetAccelerationStructureKHR*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR:
-        {
-            transform_fromhost_VkPhysicalDeviceAccelerationStructureFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceAccelerationStructureFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR: {
+            transform_fromhost_VkPhysicalDeviceAccelerationStructureFeaturesKHR(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceAccelerationStructureFeaturesKHR*>(
+                    structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR:
-        {
-            transform_fromhost_VkPhysicalDeviceAccelerationStructurePropertiesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceAccelerationStructurePropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR: {
+            transform_fromhost_VkPhysicalDeviceAccelerationStructurePropertiesKHR(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceAccelerationStructurePropertiesKHR*>(
+                    structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR:
-        {
-            transform_fromhost_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceRayTracingPipelineFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR: {
+            transform_fromhost_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceRayTracingPipelineFeaturesKHR*>(
+                                     structExtension_out));
             break;
         }
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR:
-        {
-            transform_fromhost_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceRayTracingPipelinePropertiesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR: {
+            transform_fromhost_VkPhysicalDeviceRayTracingPipelinePropertiesKHR(
+                resourceTracker, reinterpret_cast<VkPhysicalDeviceRayTracingPipelinePropertiesKHR*>(
+                                     structExtension_out));
             break;
         }
 #endif
 #ifdef VK_KHR_ray_query
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR:
-        {
-            transform_fromhost_VkPhysicalDeviceRayQueryFeaturesKHR(resourceTracker, reinterpret_cast<VkPhysicalDeviceRayQueryFeaturesKHR*>(structExtension_out));
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR: {
+            transform_fromhost_VkPhysicalDeviceRayQueryFeaturesKHR(
+                resourceTracker,
+                reinterpret_cast<VkPhysicalDeviceRayQueryFeaturesKHR*>(structExtension_out));
             break;
         }
 #endif
-        default:
-        {
+        default: {
             return;
         }
     }
 }
 
-
-} // namespace goldfish_vk
+}  // namespace goldfish_vk
diff --git a/stream-servers/vulkan/cereal/common/goldfish_vk_transform.h b/stream-servers/vulkan/cereal/common/goldfish_vk_transform.h
index 8cfed5a..5199fa3 100644
--- a/stream-servers/vulkan/cereal/common/goldfish_vk_transform.h
+++ b/stream-servers/vulkan/cereal/common/goldfish_vk_transform.h
@@ -14,1170 +14,879 @@
 // limitations under the License.
 
 // Autogenerated module goldfish_vk_transform
-// (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
+// (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml
+// cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
 // VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
 // VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+//
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o
+// $CEREAL_OUTPUT_DIR
+//
 #pragma once
 #include <vulkan/vulkan.h>
-#include "vulkan_gfxstream.h"
 
-#include "goldfish_vk_private_defs.h"
 #include "goldfish_vk_extension_structs.h"
+#include "goldfish_vk_private_defs.h"
+#include "vulkan_gfxstream.h"
 
 namespace goldfish_vk {
 class VkDecoderGlobalState;
-#define LIST_TRIVIAL_TRANSFORMED_TYPES(f) \
-f(VkPhysicalDeviceExternalImageFormatInfo) \
-f(VkPhysicalDeviceExternalBufferInfo) \
-f(VkExternalMemoryImageCreateInfo) \
-f(VkExternalMemoryBufferCreateInfo) \
-f(VkExportMemoryAllocateInfo) \
-f(VkExternalImageFormatProperties) \
-f(VkExternalBufferProperties) \
+#define LIST_TRIVIAL_TRANSFORMED_TYPES(f)      \
+    f(VkPhysicalDeviceExternalImageFormatInfo) \
+    f(VkPhysicalDeviceExternalBufferInfo)      \
+    f(VkExternalMemoryImageCreateInfo)         \
+    f(VkExternalMemoryBufferCreateInfo)        \
+    f(VkExportMemoryAllocateInfo)              \
+    f(VkExternalImageFormatProperties)         \
+    f(VkExternalBufferProperties)
 
 #define LIST_NON_TRIVIAL_TRANSFORMED_TYPES(f) \
-f(VkExternalMemoryProperties) \
-f(VkImageCreateInfo) \
+    f(VkExternalMemoryProperties)             \
+    f(VkImageCreateInfo)
 
-#define LIST_TRANSFORMED_TYPES(f) \
-LIST_TRIVIAL_TRANSFORMED_TYPES(f) \
-LIST_NON_TRIVIAL_TRANSFORMED_TYPES(f) \
+#define LIST_TRANSFORMED_TYPES(f)     \
+    LIST_TRIVIAL_TRANSFORMED_TYPES(f) \
+    LIST_NON_TRIVIAL_TRANSFORMED_TYPES(f)
 
 #ifdef VK_VERSION_1_0
-void transform_tohost_VkExtent2D(
-    VkDecoderGlobalState* resourceTracker,
-    VkExtent2D* toTransform);
+void transform_tohost_VkExtent2D(VkDecoderGlobalState* resourceTracker, VkExtent2D* toTransform);
 
-void transform_fromhost_VkExtent2D(
-    VkDecoderGlobalState* resourceTracker,
-    VkExtent2D* toTransform);
+void transform_fromhost_VkExtent2D(VkDecoderGlobalState* resourceTracker, VkExtent2D* toTransform);
 
-void transform_tohost_VkExtent3D(
-    VkDecoderGlobalState* resourceTracker,
-    VkExtent3D* toTransform);
+void transform_tohost_VkExtent3D(VkDecoderGlobalState* resourceTracker, VkExtent3D* toTransform);
 
-void transform_fromhost_VkExtent3D(
-    VkDecoderGlobalState* resourceTracker,
-    VkExtent3D* toTransform);
+void transform_fromhost_VkExtent3D(VkDecoderGlobalState* resourceTracker, VkExtent3D* toTransform);
 
-void transform_tohost_VkOffset2D(
-    VkDecoderGlobalState* resourceTracker,
-    VkOffset2D* toTransform);
+void transform_tohost_VkOffset2D(VkDecoderGlobalState* resourceTracker, VkOffset2D* toTransform);
 
-void transform_fromhost_VkOffset2D(
-    VkDecoderGlobalState* resourceTracker,
-    VkOffset2D* toTransform);
+void transform_fromhost_VkOffset2D(VkDecoderGlobalState* resourceTracker, VkOffset2D* toTransform);
 
-void transform_tohost_VkOffset3D(
-    VkDecoderGlobalState* resourceTracker,
-    VkOffset3D* toTransform);
+void transform_tohost_VkOffset3D(VkDecoderGlobalState* resourceTracker, VkOffset3D* toTransform);
 
-void transform_fromhost_VkOffset3D(
-    VkDecoderGlobalState* resourceTracker,
-    VkOffset3D* toTransform);
+void transform_fromhost_VkOffset3D(VkDecoderGlobalState* resourceTracker, VkOffset3D* toTransform);
 
-void transform_tohost_VkRect2D(
-    VkDecoderGlobalState* resourceTracker,
-    VkRect2D* toTransform);
+void transform_tohost_VkRect2D(VkDecoderGlobalState* resourceTracker, VkRect2D* toTransform);
 
-void transform_fromhost_VkRect2D(
-    VkDecoderGlobalState* resourceTracker,
-    VkRect2D* toTransform);
+void transform_fromhost_VkRect2D(VkDecoderGlobalState* resourceTracker, VkRect2D* toTransform);
 
-void transform_tohost_VkBaseInStructure(
-    VkDecoderGlobalState* resourceTracker,
-    VkBaseInStructure* toTransform);
+void transform_tohost_VkBaseInStructure(VkDecoderGlobalState* resourceTracker,
+                                        VkBaseInStructure* toTransform);
 
-void transform_fromhost_VkBaseInStructure(
-    VkDecoderGlobalState* resourceTracker,
-    VkBaseInStructure* toTransform);
+void transform_fromhost_VkBaseInStructure(VkDecoderGlobalState* resourceTracker,
+                                          VkBaseInStructure* toTransform);
 
-void transform_tohost_VkBaseOutStructure(
-    VkDecoderGlobalState* resourceTracker,
-    VkBaseOutStructure* toTransform);
+void transform_tohost_VkBaseOutStructure(VkDecoderGlobalState* resourceTracker,
+                                         VkBaseOutStructure* toTransform);
 
-void transform_fromhost_VkBaseOutStructure(
-    VkDecoderGlobalState* resourceTracker,
-    VkBaseOutStructure* toTransform);
+void transform_fromhost_VkBaseOutStructure(VkDecoderGlobalState* resourceTracker,
+                                           VkBaseOutStructure* toTransform);
 
-void transform_tohost_VkBufferMemoryBarrier(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferMemoryBarrier* toTransform);
+void transform_tohost_VkBufferMemoryBarrier(VkDecoderGlobalState* resourceTracker,
+                                            VkBufferMemoryBarrier* toTransform);
 
-void transform_fromhost_VkBufferMemoryBarrier(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferMemoryBarrier* toTransform);
+void transform_fromhost_VkBufferMemoryBarrier(VkDecoderGlobalState* resourceTracker,
+                                              VkBufferMemoryBarrier* toTransform);
 
-void transform_tohost_VkDispatchIndirectCommand(
-    VkDecoderGlobalState* resourceTracker,
-    VkDispatchIndirectCommand* toTransform);
+void transform_tohost_VkDispatchIndirectCommand(VkDecoderGlobalState* resourceTracker,
+                                                VkDispatchIndirectCommand* toTransform);
 
-void transform_fromhost_VkDispatchIndirectCommand(
-    VkDecoderGlobalState* resourceTracker,
-    VkDispatchIndirectCommand* toTransform);
+void transform_fromhost_VkDispatchIndirectCommand(VkDecoderGlobalState* resourceTracker,
+                                                  VkDispatchIndirectCommand* toTransform);
 
-void transform_tohost_VkDrawIndexedIndirectCommand(
-    VkDecoderGlobalState* resourceTracker,
-    VkDrawIndexedIndirectCommand* toTransform);
+void transform_tohost_VkDrawIndexedIndirectCommand(VkDecoderGlobalState* resourceTracker,
+                                                   VkDrawIndexedIndirectCommand* toTransform);
 
-void transform_fromhost_VkDrawIndexedIndirectCommand(
-    VkDecoderGlobalState* resourceTracker,
-    VkDrawIndexedIndirectCommand* toTransform);
+void transform_fromhost_VkDrawIndexedIndirectCommand(VkDecoderGlobalState* resourceTracker,
+                                                     VkDrawIndexedIndirectCommand* toTransform);
 
-void transform_tohost_VkDrawIndirectCommand(
-    VkDecoderGlobalState* resourceTracker,
-    VkDrawIndirectCommand* toTransform);
+void transform_tohost_VkDrawIndirectCommand(VkDecoderGlobalState* resourceTracker,
+                                            VkDrawIndirectCommand* toTransform);
 
-void transform_fromhost_VkDrawIndirectCommand(
-    VkDecoderGlobalState* resourceTracker,
-    VkDrawIndirectCommand* toTransform);
+void transform_fromhost_VkDrawIndirectCommand(VkDecoderGlobalState* resourceTracker,
+                                              VkDrawIndirectCommand* toTransform);
 
-void transform_tohost_VkImageSubresourceRange(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageSubresourceRange* toTransform);
+void transform_tohost_VkImageSubresourceRange(VkDecoderGlobalState* resourceTracker,
+                                              VkImageSubresourceRange* toTransform);
 
-void transform_fromhost_VkImageSubresourceRange(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageSubresourceRange* toTransform);
+void transform_fromhost_VkImageSubresourceRange(VkDecoderGlobalState* resourceTracker,
+                                                VkImageSubresourceRange* toTransform);
 
-void transform_tohost_VkImageMemoryBarrier(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageMemoryBarrier* toTransform);
+void transform_tohost_VkImageMemoryBarrier(VkDecoderGlobalState* resourceTracker,
+                                           VkImageMemoryBarrier* toTransform);
 
-void transform_fromhost_VkImageMemoryBarrier(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageMemoryBarrier* toTransform);
+void transform_fromhost_VkImageMemoryBarrier(VkDecoderGlobalState* resourceTracker,
+                                             VkImageMemoryBarrier* toTransform);
 
-void transform_tohost_VkMemoryBarrier(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryBarrier* toTransform);
+void transform_tohost_VkMemoryBarrier(VkDecoderGlobalState* resourceTracker,
+                                      VkMemoryBarrier* toTransform);
 
-void transform_fromhost_VkMemoryBarrier(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryBarrier* toTransform);
+void transform_fromhost_VkMemoryBarrier(VkDecoderGlobalState* resourceTracker,
+                                        VkMemoryBarrier* toTransform);
 
-void transform_tohost_VkPipelineCacheHeaderVersionOne(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineCacheHeaderVersionOne* toTransform);
+void transform_tohost_VkPipelineCacheHeaderVersionOne(VkDecoderGlobalState* resourceTracker,
+                                                      VkPipelineCacheHeaderVersionOne* toTransform);
 
 void transform_fromhost_VkPipelineCacheHeaderVersionOne(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineCacheHeaderVersionOne* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineCacheHeaderVersionOne* toTransform);
 
-void transform_tohost_VkAllocationCallbacks(
-    VkDecoderGlobalState* resourceTracker,
-    VkAllocationCallbacks* toTransform);
+void transform_tohost_VkAllocationCallbacks(VkDecoderGlobalState* resourceTracker,
+                                            VkAllocationCallbacks* toTransform);
 
-void transform_fromhost_VkAllocationCallbacks(
-    VkDecoderGlobalState* resourceTracker,
-    VkAllocationCallbacks* toTransform);
+void transform_fromhost_VkAllocationCallbacks(VkDecoderGlobalState* resourceTracker,
+                                              VkAllocationCallbacks* toTransform);
 
-void transform_tohost_VkApplicationInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkApplicationInfo* toTransform);
+void transform_tohost_VkApplicationInfo(VkDecoderGlobalState* resourceTracker,
+                                        VkApplicationInfo* toTransform);
 
-void transform_fromhost_VkApplicationInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkApplicationInfo* toTransform);
+void transform_fromhost_VkApplicationInfo(VkDecoderGlobalState* resourceTracker,
+                                          VkApplicationInfo* toTransform);
 
-void transform_tohost_VkFormatProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkFormatProperties* toTransform);
+void transform_tohost_VkFormatProperties(VkDecoderGlobalState* resourceTracker,
+                                         VkFormatProperties* toTransform);
 
-void transform_fromhost_VkFormatProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkFormatProperties* toTransform);
+void transform_fromhost_VkFormatProperties(VkDecoderGlobalState* resourceTracker,
+                                           VkFormatProperties* toTransform);
 
-void transform_tohost_VkImageFormatProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageFormatProperties* toTransform);
+void transform_tohost_VkImageFormatProperties(VkDecoderGlobalState* resourceTracker,
+                                              VkImageFormatProperties* toTransform);
 
-void transform_fromhost_VkImageFormatProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageFormatProperties* toTransform);
+void transform_fromhost_VkImageFormatProperties(VkDecoderGlobalState* resourceTracker,
+                                                VkImageFormatProperties* toTransform);
 
-void transform_tohost_VkInstanceCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkInstanceCreateInfo* toTransform);
+void transform_tohost_VkInstanceCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                           VkInstanceCreateInfo* toTransform);
 
-void transform_fromhost_VkInstanceCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkInstanceCreateInfo* toTransform);
+void transform_fromhost_VkInstanceCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                             VkInstanceCreateInfo* toTransform);
 
-void transform_tohost_VkMemoryHeap(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryHeap* toTransform);
+void transform_tohost_VkMemoryHeap(VkDecoderGlobalState* resourceTracker,
+                                   VkMemoryHeap* toTransform);
 
-void transform_fromhost_VkMemoryHeap(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryHeap* toTransform);
+void transform_fromhost_VkMemoryHeap(VkDecoderGlobalState* resourceTracker,
+                                     VkMemoryHeap* toTransform);
 
-void transform_tohost_VkMemoryType(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryType* toTransform);
+void transform_tohost_VkMemoryType(VkDecoderGlobalState* resourceTracker,
+                                   VkMemoryType* toTransform);
 
-void transform_fromhost_VkMemoryType(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryType* toTransform);
+void transform_fromhost_VkMemoryType(VkDecoderGlobalState* resourceTracker,
+                                     VkMemoryType* toTransform);
 
-void transform_tohost_VkPhysicalDeviceFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceFeatures* toTransform);
+void transform_tohost_VkPhysicalDeviceFeatures(VkDecoderGlobalState* resourceTracker,
+                                               VkPhysicalDeviceFeatures* toTransform);
 
-void transform_fromhost_VkPhysicalDeviceFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceFeatures* toTransform);
+void transform_fromhost_VkPhysicalDeviceFeatures(VkDecoderGlobalState* resourceTracker,
+                                                 VkPhysicalDeviceFeatures* toTransform);
 
-void transform_tohost_VkPhysicalDeviceLimits(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceLimits* toTransform);
+void transform_tohost_VkPhysicalDeviceLimits(VkDecoderGlobalState* resourceTracker,
+                                             VkPhysicalDeviceLimits* toTransform);
 
-void transform_fromhost_VkPhysicalDeviceLimits(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceLimits* toTransform);
+void transform_fromhost_VkPhysicalDeviceLimits(VkDecoderGlobalState* resourceTracker,
+                                               VkPhysicalDeviceLimits* toTransform);
 
 void transform_tohost_VkPhysicalDeviceMemoryProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMemoryProperties* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMemoryProperties* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceMemoryProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMemoryProperties* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMemoryProperties* toTransform);
 
 void transform_tohost_VkPhysicalDeviceSparseProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceSparseProperties* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceSparseProperties* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceSparseProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceSparseProperties* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceSparseProperties* toTransform);
 
-void transform_tohost_VkPhysicalDeviceProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceProperties* toTransform);
+void transform_tohost_VkPhysicalDeviceProperties(VkDecoderGlobalState* resourceTracker,
+                                                 VkPhysicalDeviceProperties* toTransform);
 
-void transform_fromhost_VkPhysicalDeviceProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceProperties* toTransform);
+void transform_fromhost_VkPhysicalDeviceProperties(VkDecoderGlobalState* resourceTracker,
+                                                   VkPhysicalDeviceProperties* toTransform);
 
-void transform_tohost_VkQueueFamilyProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkQueueFamilyProperties* toTransform);
+void transform_tohost_VkQueueFamilyProperties(VkDecoderGlobalState* resourceTracker,
+                                              VkQueueFamilyProperties* toTransform);
 
-void transform_fromhost_VkQueueFamilyProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkQueueFamilyProperties* toTransform);
+void transform_fromhost_VkQueueFamilyProperties(VkDecoderGlobalState* resourceTracker,
+                                                VkQueueFamilyProperties* toTransform);
 
-void transform_tohost_VkDeviceQueueCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceQueueCreateInfo* toTransform);
+void transform_tohost_VkDeviceQueueCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                              VkDeviceQueueCreateInfo* toTransform);
 
-void transform_fromhost_VkDeviceQueueCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceQueueCreateInfo* toTransform);
+void transform_fromhost_VkDeviceQueueCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                VkDeviceQueueCreateInfo* toTransform);
 
-void transform_tohost_VkDeviceCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceCreateInfo* toTransform);
+void transform_tohost_VkDeviceCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                         VkDeviceCreateInfo* toTransform);
 
-void transform_fromhost_VkDeviceCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceCreateInfo* toTransform);
+void transform_fromhost_VkDeviceCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                           VkDeviceCreateInfo* toTransform);
 
-void transform_tohost_VkExtensionProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkExtensionProperties* toTransform);
+void transform_tohost_VkExtensionProperties(VkDecoderGlobalState* resourceTracker,
+                                            VkExtensionProperties* toTransform);
 
-void transform_fromhost_VkExtensionProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkExtensionProperties* toTransform);
+void transform_fromhost_VkExtensionProperties(VkDecoderGlobalState* resourceTracker,
+                                              VkExtensionProperties* toTransform);
 
-void transform_tohost_VkLayerProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkLayerProperties* toTransform);
+void transform_tohost_VkLayerProperties(VkDecoderGlobalState* resourceTracker,
+                                        VkLayerProperties* toTransform);
 
-void transform_fromhost_VkLayerProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkLayerProperties* toTransform);
+void transform_fromhost_VkLayerProperties(VkDecoderGlobalState* resourceTracker,
+                                          VkLayerProperties* toTransform);
 
-void transform_tohost_VkSubmitInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubmitInfo* toTransform);
+void transform_tohost_VkSubmitInfo(VkDecoderGlobalState* resourceTracker,
+                                   VkSubmitInfo* toTransform);
 
-void transform_fromhost_VkSubmitInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubmitInfo* toTransform);
+void transform_fromhost_VkSubmitInfo(VkDecoderGlobalState* resourceTracker,
+                                     VkSubmitInfo* toTransform);
 
-void transform_tohost_VkMappedMemoryRange(
-    VkDecoderGlobalState* resourceTracker,
-    VkMappedMemoryRange* toTransform);
+void transform_tohost_VkMappedMemoryRange(VkDecoderGlobalState* resourceTracker,
+                                          VkMappedMemoryRange* toTransform);
 
-void transform_fromhost_VkMappedMemoryRange(
-    VkDecoderGlobalState* resourceTracker,
-    VkMappedMemoryRange* toTransform);
+void transform_fromhost_VkMappedMemoryRange(VkDecoderGlobalState* resourceTracker,
+                                            VkMappedMemoryRange* toTransform);
 
-void transform_tohost_VkMemoryAllocateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryAllocateInfo* toTransform);
+void transform_tohost_VkMemoryAllocateInfo(VkDecoderGlobalState* resourceTracker,
+                                           VkMemoryAllocateInfo* toTransform);
 
-void transform_fromhost_VkMemoryAllocateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryAllocateInfo* toTransform);
+void transform_fromhost_VkMemoryAllocateInfo(VkDecoderGlobalState* resourceTracker,
+                                             VkMemoryAllocateInfo* toTransform);
 
-void transform_tohost_VkMemoryRequirements(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryRequirements* toTransform);
+void transform_tohost_VkMemoryRequirements(VkDecoderGlobalState* resourceTracker,
+                                           VkMemoryRequirements* toTransform);
 
-void transform_fromhost_VkMemoryRequirements(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryRequirements* toTransform);
+void transform_fromhost_VkMemoryRequirements(VkDecoderGlobalState* resourceTracker,
+                                             VkMemoryRequirements* toTransform);
 
-void transform_tohost_VkSparseMemoryBind(
-    VkDecoderGlobalState* resourceTracker,
-    VkSparseMemoryBind* toTransform);
+void transform_tohost_VkSparseMemoryBind(VkDecoderGlobalState* resourceTracker,
+                                         VkSparseMemoryBind* toTransform);
 
-void transform_fromhost_VkSparseMemoryBind(
-    VkDecoderGlobalState* resourceTracker,
-    VkSparseMemoryBind* toTransform);
+void transform_fromhost_VkSparseMemoryBind(VkDecoderGlobalState* resourceTracker,
+                                           VkSparseMemoryBind* toTransform);
 
-void transform_tohost_VkSparseBufferMemoryBindInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSparseBufferMemoryBindInfo* toTransform);
+void transform_tohost_VkSparseBufferMemoryBindInfo(VkDecoderGlobalState* resourceTracker,
+                                                   VkSparseBufferMemoryBindInfo* toTransform);
 
-void transform_fromhost_VkSparseBufferMemoryBindInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSparseBufferMemoryBindInfo* toTransform);
+void transform_fromhost_VkSparseBufferMemoryBindInfo(VkDecoderGlobalState* resourceTracker,
+                                                     VkSparseBufferMemoryBindInfo* toTransform);
 
 void transform_tohost_VkSparseImageOpaqueMemoryBindInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSparseImageOpaqueMemoryBindInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkSparseImageOpaqueMemoryBindInfo* toTransform);
 
 void transform_fromhost_VkSparseImageOpaqueMemoryBindInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSparseImageOpaqueMemoryBindInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkSparseImageOpaqueMemoryBindInfo* toTransform);
 
-void transform_tohost_VkImageSubresource(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageSubresource* toTransform);
+void transform_tohost_VkImageSubresource(VkDecoderGlobalState* resourceTracker,
+                                         VkImageSubresource* toTransform);
 
-void transform_fromhost_VkImageSubresource(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageSubresource* toTransform);
+void transform_fromhost_VkImageSubresource(VkDecoderGlobalState* resourceTracker,
+                                           VkImageSubresource* toTransform);
 
-void transform_tohost_VkSparseImageMemoryBind(
-    VkDecoderGlobalState* resourceTracker,
-    VkSparseImageMemoryBind* toTransform);
+void transform_tohost_VkSparseImageMemoryBind(VkDecoderGlobalState* resourceTracker,
+                                              VkSparseImageMemoryBind* toTransform);
 
-void transform_fromhost_VkSparseImageMemoryBind(
-    VkDecoderGlobalState* resourceTracker,
-    VkSparseImageMemoryBind* toTransform);
+void transform_fromhost_VkSparseImageMemoryBind(VkDecoderGlobalState* resourceTracker,
+                                                VkSparseImageMemoryBind* toTransform);
 
-void transform_tohost_VkSparseImageMemoryBindInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSparseImageMemoryBindInfo* toTransform);
+void transform_tohost_VkSparseImageMemoryBindInfo(VkDecoderGlobalState* resourceTracker,
+                                                  VkSparseImageMemoryBindInfo* toTransform);
 
-void transform_fromhost_VkSparseImageMemoryBindInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSparseImageMemoryBindInfo* toTransform);
+void transform_fromhost_VkSparseImageMemoryBindInfo(VkDecoderGlobalState* resourceTracker,
+                                                    VkSparseImageMemoryBindInfo* toTransform);
 
-void transform_tohost_VkBindSparseInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindSparseInfo* toTransform);
+void transform_tohost_VkBindSparseInfo(VkDecoderGlobalState* resourceTracker,
+                                       VkBindSparseInfo* toTransform);
 
-void transform_fromhost_VkBindSparseInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindSparseInfo* toTransform);
+void transform_fromhost_VkBindSparseInfo(VkDecoderGlobalState* resourceTracker,
+                                         VkBindSparseInfo* toTransform);
 
-void transform_tohost_VkSparseImageFormatProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkSparseImageFormatProperties* toTransform);
+void transform_tohost_VkSparseImageFormatProperties(VkDecoderGlobalState* resourceTracker,
+                                                    VkSparseImageFormatProperties* toTransform);
 
-void transform_fromhost_VkSparseImageFormatProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkSparseImageFormatProperties* toTransform);
+void transform_fromhost_VkSparseImageFormatProperties(VkDecoderGlobalState* resourceTracker,
+                                                      VkSparseImageFormatProperties* toTransform);
 
-void transform_tohost_VkSparseImageMemoryRequirements(
-    VkDecoderGlobalState* resourceTracker,
-    VkSparseImageMemoryRequirements* toTransform);
+void transform_tohost_VkSparseImageMemoryRequirements(VkDecoderGlobalState* resourceTracker,
+                                                      VkSparseImageMemoryRequirements* toTransform);
 
 void transform_fromhost_VkSparseImageMemoryRequirements(
-    VkDecoderGlobalState* resourceTracker,
-    VkSparseImageMemoryRequirements* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkSparseImageMemoryRequirements* toTransform);
 
-void transform_tohost_VkFenceCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkFenceCreateInfo* toTransform);
+void transform_tohost_VkFenceCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                        VkFenceCreateInfo* toTransform);
 
-void transform_fromhost_VkFenceCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkFenceCreateInfo* toTransform);
+void transform_fromhost_VkFenceCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                          VkFenceCreateInfo* toTransform);
 
-void transform_tohost_VkSemaphoreCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSemaphoreCreateInfo* toTransform);
+void transform_tohost_VkSemaphoreCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                            VkSemaphoreCreateInfo* toTransform);
 
-void transform_fromhost_VkSemaphoreCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSemaphoreCreateInfo* toTransform);
+void transform_fromhost_VkSemaphoreCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                              VkSemaphoreCreateInfo* toTransform);
 
-void transform_tohost_VkEventCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkEventCreateInfo* toTransform);
+void transform_tohost_VkEventCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                        VkEventCreateInfo* toTransform);
 
-void transform_fromhost_VkEventCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkEventCreateInfo* toTransform);
+void transform_fromhost_VkEventCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                          VkEventCreateInfo* toTransform);
 
-void transform_tohost_VkQueryPoolCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkQueryPoolCreateInfo* toTransform);
+void transform_tohost_VkQueryPoolCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                            VkQueryPoolCreateInfo* toTransform);
 
-void transform_fromhost_VkQueryPoolCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkQueryPoolCreateInfo* toTransform);
+void transform_fromhost_VkQueryPoolCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                              VkQueryPoolCreateInfo* toTransform);
 
-void transform_tohost_VkBufferCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferCreateInfo* toTransform);
+void transform_tohost_VkBufferCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                         VkBufferCreateInfo* toTransform);
 
-void transform_fromhost_VkBufferCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferCreateInfo* toTransform);
+void transform_fromhost_VkBufferCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                           VkBufferCreateInfo* toTransform);
 
-void transform_tohost_VkBufferViewCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferViewCreateInfo* toTransform);
+void transform_tohost_VkBufferViewCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                             VkBufferViewCreateInfo* toTransform);
 
-void transform_fromhost_VkBufferViewCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferViewCreateInfo* toTransform);
+void transform_fromhost_VkBufferViewCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                               VkBufferViewCreateInfo* toTransform);
 
-void transform_tohost_VkImageCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageCreateInfo* toTransform);
+void transform_tohost_VkImageCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                        VkImageCreateInfo* toTransform);
 
-void transform_fromhost_VkImageCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageCreateInfo* toTransform);
+void transform_fromhost_VkImageCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                          VkImageCreateInfo* toTransform);
 
-void transform_tohost_VkSubresourceLayout(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubresourceLayout* toTransform);
+void transform_tohost_VkSubresourceLayout(VkDecoderGlobalState* resourceTracker,
+                                          VkSubresourceLayout* toTransform);
 
-void transform_fromhost_VkSubresourceLayout(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubresourceLayout* toTransform);
+void transform_fromhost_VkSubresourceLayout(VkDecoderGlobalState* resourceTracker,
+                                            VkSubresourceLayout* toTransform);
 
-void transform_tohost_VkComponentMapping(
-    VkDecoderGlobalState* resourceTracker,
-    VkComponentMapping* toTransform);
+void transform_tohost_VkComponentMapping(VkDecoderGlobalState* resourceTracker,
+                                         VkComponentMapping* toTransform);
 
-void transform_fromhost_VkComponentMapping(
-    VkDecoderGlobalState* resourceTracker,
-    VkComponentMapping* toTransform);
+void transform_fromhost_VkComponentMapping(VkDecoderGlobalState* resourceTracker,
+                                           VkComponentMapping* toTransform);
 
-void transform_tohost_VkImageViewCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageViewCreateInfo* toTransform);
+void transform_tohost_VkImageViewCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                            VkImageViewCreateInfo* toTransform);
 
-void transform_fromhost_VkImageViewCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageViewCreateInfo* toTransform);
+void transform_fromhost_VkImageViewCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                              VkImageViewCreateInfo* toTransform);
 
-void transform_tohost_VkShaderModuleCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkShaderModuleCreateInfo* toTransform);
+void transform_tohost_VkShaderModuleCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                               VkShaderModuleCreateInfo* toTransform);
 
-void transform_fromhost_VkShaderModuleCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkShaderModuleCreateInfo* toTransform);
+void transform_fromhost_VkShaderModuleCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                 VkShaderModuleCreateInfo* toTransform);
 
-void transform_tohost_VkPipelineCacheCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineCacheCreateInfo* toTransform);
+void transform_tohost_VkPipelineCacheCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                VkPipelineCacheCreateInfo* toTransform);
 
-void transform_fromhost_VkPipelineCacheCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineCacheCreateInfo* toTransform);
+void transform_fromhost_VkPipelineCacheCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                  VkPipelineCacheCreateInfo* toTransform);
 
-void transform_tohost_VkSpecializationMapEntry(
-    VkDecoderGlobalState* resourceTracker,
-    VkSpecializationMapEntry* toTransform);
+void transform_tohost_VkSpecializationMapEntry(VkDecoderGlobalState* resourceTracker,
+                                               VkSpecializationMapEntry* toTransform);
 
-void transform_fromhost_VkSpecializationMapEntry(
-    VkDecoderGlobalState* resourceTracker,
-    VkSpecializationMapEntry* toTransform);
+void transform_fromhost_VkSpecializationMapEntry(VkDecoderGlobalState* resourceTracker,
+                                                 VkSpecializationMapEntry* toTransform);
 
-void transform_tohost_VkSpecializationInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSpecializationInfo* toTransform);
+void transform_tohost_VkSpecializationInfo(VkDecoderGlobalState* resourceTracker,
+                                           VkSpecializationInfo* toTransform);
 
-void transform_fromhost_VkSpecializationInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSpecializationInfo* toTransform);
+void transform_fromhost_VkSpecializationInfo(VkDecoderGlobalState* resourceTracker,
+                                             VkSpecializationInfo* toTransform);
 
-void transform_tohost_VkPipelineShaderStageCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineShaderStageCreateInfo* toTransform);
+void transform_tohost_VkPipelineShaderStageCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                      VkPipelineShaderStageCreateInfo* toTransform);
 
 void transform_fromhost_VkPipelineShaderStageCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineShaderStageCreateInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineShaderStageCreateInfo* toTransform);
 
-void transform_tohost_VkComputePipelineCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkComputePipelineCreateInfo* toTransform);
+void transform_tohost_VkComputePipelineCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                  VkComputePipelineCreateInfo* toTransform);
 
-void transform_fromhost_VkComputePipelineCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkComputePipelineCreateInfo* toTransform);
+void transform_fromhost_VkComputePipelineCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                    VkComputePipelineCreateInfo* toTransform);
 
-void transform_tohost_VkVertexInputBindingDescription(
-    VkDecoderGlobalState* resourceTracker,
-    VkVertexInputBindingDescription* toTransform);
+void transform_tohost_VkVertexInputBindingDescription(VkDecoderGlobalState* resourceTracker,
+                                                      VkVertexInputBindingDescription* toTransform);
 
 void transform_fromhost_VkVertexInputBindingDescription(
-    VkDecoderGlobalState* resourceTracker,
-    VkVertexInputBindingDescription* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVertexInputBindingDescription* toTransform);
 
 void transform_tohost_VkVertexInputAttributeDescription(
-    VkDecoderGlobalState* resourceTracker,
-    VkVertexInputAttributeDescription* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVertexInputAttributeDescription* toTransform);
 
 void transform_fromhost_VkVertexInputAttributeDescription(
-    VkDecoderGlobalState* resourceTracker,
-    VkVertexInputAttributeDescription* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVertexInputAttributeDescription* toTransform);
 
 void transform_tohost_VkPipelineVertexInputStateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineVertexInputStateCreateInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineVertexInputStateCreateInfo* toTransform);
 
 void transform_fromhost_VkPipelineVertexInputStateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineVertexInputStateCreateInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineVertexInputStateCreateInfo* toTransform);
 
 void transform_tohost_VkPipelineInputAssemblyStateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineInputAssemblyStateCreateInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineInputAssemblyStateCreateInfo* toTransform);
 
 void transform_fromhost_VkPipelineInputAssemblyStateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineInputAssemblyStateCreateInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineInputAssemblyStateCreateInfo* toTransform);
 
 void transform_tohost_VkPipelineTessellationStateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineTessellationStateCreateInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineTessellationStateCreateInfo* toTransform);
 
 void transform_fromhost_VkPipelineTessellationStateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineTessellationStateCreateInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineTessellationStateCreateInfo* toTransform);
 
-void transform_tohost_VkViewport(
-    VkDecoderGlobalState* resourceTracker,
-    VkViewport* toTransform);
+void transform_tohost_VkViewport(VkDecoderGlobalState* resourceTracker, VkViewport* toTransform);
 
-void transform_fromhost_VkViewport(
-    VkDecoderGlobalState* resourceTracker,
-    VkViewport* toTransform);
+void transform_fromhost_VkViewport(VkDecoderGlobalState* resourceTracker, VkViewport* toTransform);
 
 void transform_tohost_VkPipelineViewportStateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineViewportStateCreateInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineViewportStateCreateInfo* toTransform);
 
 void transform_fromhost_VkPipelineViewportStateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineViewportStateCreateInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineViewportStateCreateInfo* toTransform);
 
 void transform_tohost_VkPipelineRasterizationStateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineRasterizationStateCreateInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineRasterizationStateCreateInfo* toTransform);
 
 void transform_fromhost_VkPipelineRasterizationStateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineRasterizationStateCreateInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineRasterizationStateCreateInfo* toTransform);
 
 void transform_tohost_VkPipelineMultisampleStateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineMultisampleStateCreateInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineMultisampleStateCreateInfo* toTransform);
 
 void transform_fromhost_VkPipelineMultisampleStateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineMultisampleStateCreateInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineMultisampleStateCreateInfo* toTransform);
 
-void transform_tohost_VkStencilOpState(
-    VkDecoderGlobalState* resourceTracker,
-    VkStencilOpState* toTransform);
+void transform_tohost_VkStencilOpState(VkDecoderGlobalState* resourceTracker,
+                                       VkStencilOpState* toTransform);
 
-void transform_fromhost_VkStencilOpState(
-    VkDecoderGlobalState* resourceTracker,
-    VkStencilOpState* toTransform);
+void transform_fromhost_VkStencilOpState(VkDecoderGlobalState* resourceTracker,
+                                         VkStencilOpState* toTransform);
 
 void transform_tohost_VkPipelineDepthStencilStateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineDepthStencilStateCreateInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineDepthStencilStateCreateInfo* toTransform);
 
 void transform_fromhost_VkPipelineDepthStencilStateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineDepthStencilStateCreateInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineDepthStencilStateCreateInfo* toTransform);
 
 void transform_tohost_VkPipelineColorBlendAttachmentState(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineColorBlendAttachmentState* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineColorBlendAttachmentState* toTransform);
 
 void transform_fromhost_VkPipelineColorBlendAttachmentState(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineColorBlendAttachmentState* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineColorBlendAttachmentState* toTransform);
 
 void transform_tohost_VkPipelineColorBlendStateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineColorBlendStateCreateInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineColorBlendStateCreateInfo* toTransform);
 
 void transform_fromhost_VkPipelineColorBlendStateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineColorBlendStateCreateInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineColorBlendStateCreateInfo* toTransform);
 
 void transform_tohost_VkPipelineDynamicStateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineDynamicStateCreateInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineDynamicStateCreateInfo* toTransform);
 
 void transform_fromhost_VkPipelineDynamicStateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineDynamicStateCreateInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineDynamicStateCreateInfo* toTransform);
 
-void transform_tohost_VkGraphicsPipelineCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkGraphicsPipelineCreateInfo* toTransform);
+void transform_tohost_VkGraphicsPipelineCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                   VkGraphicsPipelineCreateInfo* toTransform);
 
-void transform_fromhost_VkGraphicsPipelineCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkGraphicsPipelineCreateInfo* toTransform);
+void transform_fromhost_VkGraphicsPipelineCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                     VkGraphicsPipelineCreateInfo* toTransform);
 
-void transform_tohost_VkPushConstantRange(
-    VkDecoderGlobalState* resourceTracker,
-    VkPushConstantRange* toTransform);
+void transform_tohost_VkPushConstantRange(VkDecoderGlobalState* resourceTracker,
+                                          VkPushConstantRange* toTransform);
 
-void transform_fromhost_VkPushConstantRange(
-    VkDecoderGlobalState* resourceTracker,
-    VkPushConstantRange* toTransform);
+void transform_fromhost_VkPushConstantRange(VkDecoderGlobalState* resourceTracker,
+                                            VkPushConstantRange* toTransform);
 
-void transform_tohost_VkPipelineLayoutCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineLayoutCreateInfo* toTransform);
+void transform_tohost_VkPipelineLayoutCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                 VkPipelineLayoutCreateInfo* toTransform);
 
-void transform_fromhost_VkPipelineLayoutCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineLayoutCreateInfo* toTransform);
+void transform_fromhost_VkPipelineLayoutCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                   VkPipelineLayoutCreateInfo* toTransform);
 
-void transform_tohost_VkSamplerCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSamplerCreateInfo* toTransform);
+void transform_tohost_VkSamplerCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                          VkSamplerCreateInfo* toTransform);
 
-void transform_fromhost_VkSamplerCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSamplerCreateInfo* toTransform);
+void transform_fromhost_VkSamplerCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                            VkSamplerCreateInfo* toTransform);
 
-void transform_tohost_VkCopyDescriptorSet(
-    VkDecoderGlobalState* resourceTracker,
-    VkCopyDescriptorSet* toTransform);
+void transform_tohost_VkCopyDescriptorSet(VkDecoderGlobalState* resourceTracker,
+                                          VkCopyDescriptorSet* toTransform);
 
-void transform_fromhost_VkCopyDescriptorSet(
-    VkDecoderGlobalState* resourceTracker,
-    VkCopyDescriptorSet* toTransform);
+void transform_fromhost_VkCopyDescriptorSet(VkDecoderGlobalState* resourceTracker,
+                                            VkCopyDescriptorSet* toTransform);
 
-void transform_tohost_VkDescriptorBufferInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorBufferInfo* toTransform);
+void transform_tohost_VkDescriptorBufferInfo(VkDecoderGlobalState* resourceTracker,
+                                             VkDescriptorBufferInfo* toTransform);
 
-void transform_fromhost_VkDescriptorBufferInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorBufferInfo* toTransform);
+void transform_fromhost_VkDescriptorBufferInfo(VkDecoderGlobalState* resourceTracker,
+                                               VkDescriptorBufferInfo* toTransform);
 
-void transform_tohost_VkDescriptorImageInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorImageInfo* toTransform);
+void transform_tohost_VkDescriptorImageInfo(VkDecoderGlobalState* resourceTracker,
+                                            VkDescriptorImageInfo* toTransform);
 
-void transform_fromhost_VkDescriptorImageInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorImageInfo* toTransform);
+void transform_fromhost_VkDescriptorImageInfo(VkDecoderGlobalState* resourceTracker,
+                                              VkDescriptorImageInfo* toTransform);
 
-void transform_tohost_VkDescriptorPoolSize(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorPoolSize* toTransform);
+void transform_tohost_VkDescriptorPoolSize(VkDecoderGlobalState* resourceTracker,
+                                           VkDescriptorPoolSize* toTransform);
 
-void transform_fromhost_VkDescriptorPoolSize(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorPoolSize* toTransform);
+void transform_fromhost_VkDescriptorPoolSize(VkDecoderGlobalState* resourceTracker,
+                                             VkDescriptorPoolSize* toTransform);
 
-void transform_tohost_VkDescriptorPoolCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorPoolCreateInfo* toTransform);
+void transform_tohost_VkDescriptorPoolCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                 VkDescriptorPoolCreateInfo* toTransform);
 
-void transform_fromhost_VkDescriptorPoolCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorPoolCreateInfo* toTransform);
+void transform_fromhost_VkDescriptorPoolCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                   VkDescriptorPoolCreateInfo* toTransform);
 
-void transform_tohost_VkDescriptorSetAllocateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorSetAllocateInfo* toTransform);
+void transform_tohost_VkDescriptorSetAllocateInfo(VkDecoderGlobalState* resourceTracker,
+                                                  VkDescriptorSetAllocateInfo* toTransform);
 
-void transform_fromhost_VkDescriptorSetAllocateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorSetAllocateInfo* toTransform);
+void transform_fromhost_VkDescriptorSetAllocateInfo(VkDecoderGlobalState* resourceTracker,
+                                                    VkDescriptorSetAllocateInfo* toTransform);
 
-void transform_tohost_VkDescriptorSetLayoutBinding(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorSetLayoutBinding* toTransform);
+void transform_tohost_VkDescriptorSetLayoutBinding(VkDecoderGlobalState* resourceTracker,
+                                                   VkDescriptorSetLayoutBinding* toTransform);
 
-void transform_fromhost_VkDescriptorSetLayoutBinding(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorSetLayoutBinding* toTransform);
+void transform_fromhost_VkDescriptorSetLayoutBinding(VkDecoderGlobalState* resourceTracker,
+                                                     VkDescriptorSetLayoutBinding* toTransform);
 
-void transform_tohost_VkDescriptorSetLayoutCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorSetLayoutCreateInfo* toTransform);
+void transform_tohost_VkDescriptorSetLayoutCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                      VkDescriptorSetLayoutCreateInfo* toTransform);
 
 void transform_fromhost_VkDescriptorSetLayoutCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorSetLayoutCreateInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDescriptorSetLayoutCreateInfo* toTransform);
 
-void transform_tohost_VkWriteDescriptorSet(
-    VkDecoderGlobalState* resourceTracker,
-    VkWriteDescriptorSet* toTransform);
+void transform_tohost_VkWriteDescriptorSet(VkDecoderGlobalState* resourceTracker,
+                                           VkWriteDescriptorSet* toTransform);
 
-void transform_fromhost_VkWriteDescriptorSet(
-    VkDecoderGlobalState* resourceTracker,
-    VkWriteDescriptorSet* toTransform);
+void transform_fromhost_VkWriteDescriptorSet(VkDecoderGlobalState* resourceTracker,
+                                             VkWriteDescriptorSet* toTransform);
 
-void transform_tohost_VkAttachmentDescription(
-    VkDecoderGlobalState* resourceTracker,
-    VkAttachmentDescription* toTransform);
+void transform_tohost_VkAttachmentDescription(VkDecoderGlobalState* resourceTracker,
+                                              VkAttachmentDescription* toTransform);
 
-void transform_fromhost_VkAttachmentDescription(
-    VkDecoderGlobalState* resourceTracker,
-    VkAttachmentDescription* toTransform);
+void transform_fromhost_VkAttachmentDescription(VkDecoderGlobalState* resourceTracker,
+                                                VkAttachmentDescription* toTransform);
 
-void transform_tohost_VkAttachmentReference(
-    VkDecoderGlobalState* resourceTracker,
-    VkAttachmentReference* toTransform);
+void transform_tohost_VkAttachmentReference(VkDecoderGlobalState* resourceTracker,
+                                            VkAttachmentReference* toTransform);
 
-void transform_fromhost_VkAttachmentReference(
-    VkDecoderGlobalState* resourceTracker,
-    VkAttachmentReference* toTransform);
+void transform_fromhost_VkAttachmentReference(VkDecoderGlobalState* resourceTracker,
+                                              VkAttachmentReference* toTransform);
 
-void transform_tohost_VkFramebufferCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkFramebufferCreateInfo* toTransform);
+void transform_tohost_VkFramebufferCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                              VkFramebufferCreateInfo* toTransform);
 
-void transform_fromhost_VkFramebufferCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkFramebufferCreateInfo* toTransform);
+void transform_fromhost_VkFramebufferCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                VkFramebufferCreateInfo* toTransform);
 
-void transform_tohost_VkSubpassDescription(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubpassDescription* toTransform);
+void transform_tohost_VkSubpassDescription(VkDecoderGlobalState* resourceTracker,
+                                           VkSubpassDescription* toTransform);
 
-void transform_fromhost_VkSubpassDescription(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubpassDescription* toTransform);
+void transform_fromhost_VkSubpassDescription(VkDecoderGlobalState* resourceTracker,
+                                             VkSubpassDescription* toTransform);
 
-void transform_tohost_VkSubpassDependency(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubpassDependency* toTransform);
+void transform_tohost_VkSubpassDependency(VkDecoderGlobalState* resourceTracker,
+                                          VkSubpassDependency* toTransform);
 
-void transform_fromhost_VkSubpassDependency(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubpassDependency* toTransform);
+void transform_fromhost_VkSubpassDependency(VkDecoderGlobalState* resourceTracker,
+                                            VkSubpassDependency* toTransform);
 
-void transform_tohost_VkRenderPassCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkRenderPassCreateInfo* toTransform);
+void transform_tohost_VkRenderPassCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                             VkRenderPassCreateInfo* toTransform);
 
-void transform_fromhost_VkRenderPassCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkRenderPassCreateInfo* toTransform);
+void transform_fromhost_VkRenderPassCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                               VkRenderPassCreateInfo* toTransform);
 
-void transform_tohost_VkCommandPoolCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkCommandPoolCreateInfo* toTransform);
+void transform_tohost_VkCommandPoolCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                              VkCommandPoolCreateInfo* toTransform);
 
-void transform_fromhost_VkCommandPoolCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkCommandPoolCreateInfo* toTransform);
+void transform_fromhost_VkCommandPoolCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                VkCommandPoolCreateInfo* toTransform);
 
-void transform_tohost_VkCommandBufferAllocateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkCommandBufferAllocateInfo* toTransform);
+void transform_tohost_VkCommandBufferAllocateInfo(VkDecoderGlobalState* resourceTracker,
+                                                  VkCommandBufferAllocateInfo* toTransform);
 
-void transform_fromhost_VkCommandBufferAllocateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkCommandBufferAllocateInfo* toTransform);
+void transform_fromhost_VkCommandBufferAllocateInfo(VkDecoderGlobalState* resourceTracker,
+                                                    VkCommandBufferAllocateInfo* toTransform);
 
-void transform_tohost_VkCommandBufferInheritanceInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkCommandBufferInheritanceInfo* toTransform);
+void transform_tohost_VkCommandBufferInheritanceInfo(VkDecoderGlobalState* resourceTracker,
+                                                     VkCommandBufferInheritanceInfo* toTransform);
 
-void transform_fromhost_VkCommandBufferInheritanceInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkCommandBufferInheritanceInfo* toTransform);
+void transform_fromhost_VkCommandBufferInheritanceInfo(VkDecoderGlobalState* resourceTracker,
+                                                       VkCommandBufferInheritanceInfo* toTransform);
 
-void transform_tohost_VkCommandBufferBeginInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkCommandBufferBeginInfo* toTransform);
+void transform_tohost_VkCommandBufferBeginInfo(VkDecoderGlobalState* resourceTracker,
+                                               VkCommandBufferBeginInfo* toTransform);
 
-void transform_fromhost_VkCommandBufferBeginInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkCommandBufferBeginInfo* toTransform);
+void transform_fromhost_VkCommandBufferBeginInfo(VkDecoderGlobalState* resourceTracker,
+                                                 VkCommandBufferBeginInfo* toTransform);
 
-void transform_tohost_VkBufferCopy(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferCopy* toTransform);
+void transform_tohost_VkBufferCopy(VkDecoderGlobalState* resourceTracker,
+                                   VkBufferCopy* toTransform);
 
-void transform_fromhost_VkBufferCopy(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferCopy* toTransform);
+void transform_fromhost_VkBufferCopy(VkDecoderGlobalState* resourceTracker,
+                                     VkBufferCopy* toTransform);
 
-void transform_tohost_VkImageSubresourceLayers(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageSubresourceLayers* toTransform);
+void transform_tohost_VkImageSubresourceLayers(VkDecoderGlobalState* resourceTracker,
+                                               VkImageSubresourceLayers* toTransform);
 
-void transform_fromhost_VkImageSubresourceLayers(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageSubresourceLayers* toTransform);
+void transform_fromhost_VkImageSubresourceLayers(VkDecoderGlobalState* resourceTracker,
+                                                 VkImageSubresourceLayers* toTransform);
 
-void transform_tohost_VkBufferImageCopy(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferImageCopy* toTransform);
+void transform_tohost_VkBufferImageCopy(VkDecoderGlobalState* resourceTracker,
+                                        VkBufferImageCopy* toTransform);
 
-void transform_fromhost_VkBufferImageCopy(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferImageCopy* toTransform);
+void transform_fromhost_VkBufferImageCopy(VkDecoderGlobalState* resourceTracker,
+                                          VkBufferImageCopy* toTransform);
 
-void transform_tohost_VkClearColorValue(
-    VkDecoderGlobalState* resourceTracker,
-    VkClearColorValue* toTransform);
+void transform_tohost_VkClearColorValue(VkDecoderGlobalState* resourceTracker,
+                                        VkClearColorValue* toTransform);
 
-void transform_fromhost_VkClearColorValue(
-    VkDecoderGlobalState* resourceTracker,
-    VkClearColorValue* toTransform);
+void transform_fromhost_VkClearColorValue(VkDecoderGlobalState* resourceTracker,
+                                          VkClearColorValue* toTransform);
 
-void transform_tohost_VkClearDepthStencilValue(
-    VkDecoderGlobalState* resourceTracker,
-    VkClearDepthStencilValue* toTransform);
+void transform_tohost_VkClearDepthStencilValue(VkDecoderGlobalState* resourceTracker,
+                                               VkClearDepthStencilValue* toTransform);
 
-void transform_fromhost_VkClearDepthStencilValue(
-    VkDecoderGlobalState* resourceTracker,
-    VkClearDepthStencilValue* toTransform);
+void transform_fromhost_VkClearDepthStencilValue(VkDecoderGlobalState* resourceTracker,
+                                                 VkClearDepthStencilValue* toTransform);
 
-void transform_tohost_VkClearValue(
-    VkDecoderGlobalState* resourceTracker,
-    VkClearValue* toTransform);
+void transform_tohost_VkClearValue(VkDecoderGlobalState* resourceTracker,
+                                   VkClearValue* toTransform);
 
-void transform_fromhost_VkClearValue(
-    VkDecoderGlobalState* resourceTracker,
-    VkClearValue* toTransform);
+void transform_fromhost_VkClearValue(VkDecoderGlobalState* resourceTracker,
+                                     VkClearValue* toTransform);
 
-void transform_tohost_VkClearAttachment(
-    VkDecoderGlobalState* resourceTracker,
-    VkClearAttachment* toTransform);
+void transform_tohost_VkClearAttachment(VkDecoderGlobalState* resourceTracker,
+                                        VkClearAttachment* toTransform);
 
-void transform_fromhost_VkClearAttachment(
-    VkDecoderGlobalState* resourceTracker,
-    VkClearAttachment* toTransform);
+void transform_fromhost_VkClearAttachment(VkDecoderGlobalState* resourceTracker,
+                                          VkClearAttachment* toTransform);
 
-void transform_tohost_VkClearRect(
-    VkDecoderGlobalState* resourceTracker,
-    VkClearRect* toTransform);
+void transform_tohost_VkClearRect(VkDecoderGlobalState* resourceTracker, VkClearRect* toTransform);
 
-void transform_fromhost_VkClearRect(
-    VkDecoderGlobalState* resourceTracker,
-    VkClearRect* toTransform);
+void transform_fromhost_VkClearRect(VkDecoderGlobalState* resourceTracker,
+                                    VkClearRect* toTransform);
 
-void transform_tohost_VkImageBlit(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageBlit* toTransform);
+void transform_tohost_VkImageBlit(VkDecoderGlobalState* resourceTracker, VkImageBlit* toTransform);
 
-void transform_fromhost_VkImageBlit(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageBlit* toTransform);
+void transform_fromhost_VkImageBlit(VkDecoderGlobalState* resourceTracker,
+                                    VkImageBlit* toTransform);
 
-void transform_tohost_VkImageCopy(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageCopy* toTransform);
+void transform_tohost_VkImageCopy(VkDecoderGlobalState* resourceTracker, VkImageCopy* toTransform);
 
-void transform_fromhost_VkImageCopy(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageCopy* toTransform);
+void transform_fromhost_VkImageCopy(VkDecoderGlobalState* resourceTracker,
+                                    VkImageCopy* toTransform);
 
-void transform_tohost_VkImageResolve(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageResolve* toTransform);
+void transform_tohost_VkImageResolve(VkDecoderGlobalState* resourceTracker,
+                                     VkImageResolve* toTransform);
 
-void transform_fromhost_VkImageResolve(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageResolve* toTransform);
+void transform_fromhost_VkImageResolve(VkDecoderGlobalState* resourceTracker,
+                                       VkImageResolve* toTransform);
 
-void transform_tohost_VkRenderPassBeginInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkRenderPassBeginInfo* toTransform);
+void transform_tohost_VkRenderPassBeginInfo(VkDecoderGlobalState* resourceTracker,
+                                            VkRenderPassBeginInfo* toTransform);
 
-void transform_fromhost_VkRenderPassBeginInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkRenderPassBeginInfo* toTransform);
+void transform_fromhost_VkRenderPassBeginInfo(VkDecoderGlobalState* resourceTracker,
+                                              VkRenderPassBeginInfo* toTransform);
 
 #endif
 #ifdef VK_VERSION_1_1
 void transform_tohost_VkPhysicalDeviceSubgroupProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceSubgroupProperties* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceSubgroupProperties* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceSubgroupProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceSubgroupProperties* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceSubgroupProperties* toTransform);
 
-void transform_tohost_VkBindBufferMemoryInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindBufferMemoryInfo* toTransform);
+void transform_tohost_VkBindBufferMemoryInfo(VkDecoderGlobalState* resourceTracker,
+                                             VkBindBufferMemoryInfo* toTransform);
 
-void transform_fromhost_VkBindBufferMemoryInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindBufferMemoryInfo* toTransform);
+void transform_fromhost_VkBindBufferMemoryInfo(VkDecoderGlobalState* resourceTracker,
+                                               VkBindBufferMemoryInfo* toTransform);
 
-void transform_tohost_VkBindImageMemoryInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindImageMemoryInfo* toTransform);
+void transform_tohost_VkBindImageMemoryInfo(VkDecoderGlobalState* resourceTracker,
+                                            VkBindImageMemoryInfo* toTransform);
 
-void transform_fromhost_VkBindImageMemoryInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindImageMemoryInfo* toTransform);
+void transform_fromhost_VkBindImageMemoryInfo(VkDecoderGlobalState* resourceTracker,
+                                              VkBindImageMemoryInfo* toTransform);
 
 void transform_tohost_VkPhysicalDevice16BitStorageFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevice16BitStorageFeatures* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDevice16BitStorageFeatures* toTransform);
 
 void transform_fromhost_VkPhysicalDevice16BitStorageFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevice16BitStorageFeatures* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDevice16BitStorageFeatures* toTransform);
 
-void transform_tohost_VkMemoryDedicatedRequirements(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryDedicatedRequirements* toTransform);
+void transform_tohost_VkMemoryDedicatedRequirements(VkDecoderGlobalState* resourceTracker,
+                                                    VkMemoryDedicatedRequirements* toTransform);
 
-void transform_fromhost_VkMemoryDedicatedRequirements(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryDedicatedRequirements* toTransform);
+void transform_fromhost_VkMemoryDedicatedRequirements(VkDecoderGlobalState* resourceTracker,
+                                                      VkMemoryDedicatedRequirements* toTransform);
 
-void transform_tohost_VkMemoryDedicatedAllocateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryDedicatedAllocateInfo* toTransform);
+void transform_tohost_VkMemoryDedicatedAllocateInfo(VkDecoderGlobalState* resourceTracker,
+                                                    VkMemoryDedicatedAllocateInfo* toTransform);
 
-void transform_fromhost_VkMemoryDedicatedAllocateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryDedicatedAllocateInfo* toTransform);
+void transform_fromhost_VkMemoryDedicatedAllocateInfo(VkDecoderGlobalState* resourceTracker,
+                                                      VkMemoryDedicatedAllocateInfo* toTransform);
 
-void transform_tohost_VkMemoryAllocateFlagsInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryAllocateFlagsInfo* toTransform);
+void transform_tohost_VkMemoryAllocateFlagsInfo(VkDecoderGlobalState* resourceTracker,
+                                                VkMemoryAllocateFlagsInfo* toTransform);
 
-void transform_fromhost_VkMemoryAllocateFlagsInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryAllocateFlagsInfo* toTransform);
+void transform_fromhost_VkMemoryAllocateFlagsInfo(VkDecoderGlobalState* resourceTracker,
+                                                  VkMemoryAllocateFlagsInfo* toTransform);
 
 void transform_tohost_VkDeviceGroupRenderPassBeginInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceGroupRenderPassBeginInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDeviceGroupRenderPassBeginInfo* toTransform);
 
 void transform_fromhost_VkDeviceGroupRenderPassBeginInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceGroupRenderPassBeginInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDeviceGroupRenderPassBeginInfo* toTransform);
 
 void transform_tohost_VkDeviceGroupCommandBufferBeginInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceGroupCommandBufferBeginInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDeviceGroupCommandBufferBeginInfo* toTransform);
 
 void transform_fromhost_VkDeviceGroupCommandBufferBeginInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceGroupCommandBufferBeginInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDeviceGroupCommandBufferBeginInfo* toTransform);
 
-void transform_tohost_VkDeviceGroupSubmitInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceGroupSubmitInfo* toTransform);
+void transform_tohost_VkDeviceGroupSubmitInfo(VkDecoderGlobalState* resourceTracker,
+                                              VkDeviceGroupSubmitInfo* toTransform);
 
-void transform_fromhost_VkDeviceGroupSubmitInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceGroupSubmitInfo* toTransform);
+void transform_fromhost_VkDeviceGroupSubmitInfo(VkDecoderGlobalState* resourceTracker,
+                                                VkDeviceGroupSubmitInfo* toTransform);
 
-void transform_tohost_VkDeviceGroupBindSparseInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceGroupBindSparseInfo* toTransform);
+void transform_tohost_VkDeviceGroupBindSparseInfo(VkDecoderGlobalState* resourceTracker,
+                                                  VkDeviceGroupBindSparseInfo* toTransform);
 
-void transform_fromhost_VkDeviceGroupBindSparseInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceGroupBindSparseInfo* toTransform);
+void transform_fromhost_VkDeviceGroupBindSparseInfo(VkDecoderGlobalState* resourceTracker,
+                                                    VkDeviceGroupBindSparseInfo* toTransform);
 
 void transform_tohost_VkBindBufferMemoryDeviceGroupInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindBufferMemoryDeviceGroupInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkBindBufferMemoryDeviceGroupInfo* toTransform);
 
 void transform_fromhost_VkBindBufferMemoryDeviceGroupInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindBufferMemoryDeviceGroupInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkBindBufferMemoryDeviceGroupInfo* toTransform);
 
 void transform_tohost_VkBindImageMemoryDeviceGroupInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindImageMemoryDeviceGroupInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkBindImageMemoryDeviceGroupInfo* toTransform);
 
 void transform_fromhost_VkBindImageMemoryDeviceGroupInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindImageMemoryDeviceGroupInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkBindImageMemoryDeviceGroupInfo* toTransform);
 
-void transform_tohost_VkPhysicalDeviceGroupProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceGroupProperties* toTransform);
+void transform_tohost_VkPhysicalDeviceGroupProperties(VkDecoderGlobalState* resourceTracker,
+                                                      VkPhysicalDeviceGroupProperties* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceGroupProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceGroupProperties* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceGroupProperties* toTransform);
 
-void transform_tohost_VkDeviceGroupDeviceCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceGroupDeviceCreateInfo* toTransform);
+void transform_tohost_VkDeviceGroupDeviceCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                    VkDeviceGroupDeviceCreateInfo* toTransform);
 
-void transform_fromhost_VkDeviceGroupDeviceCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceGroupDeviceCreateInfo* toTransform);
+void transform_fromhost_VkDeviceGroupDeviceCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                      VkDeviceGroupDeviceCreateInfo* toTransform);
 
-void transform_tohost_VkBufferMemoryRequirementsInfo2(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferMemoryRequirementsInfo2* toTransform);
+void transform_tohost_VkBufferMemoryRequirementsInfo2(VkDecoderGlobalState* resourceTracker,
+                                                      VkBufferMemoryRequirementsInfo2* toTransform);
 
 void transform_fromhost_VkBufferMemoryRequirementsInfo2(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferMemoryRequirementsInfo2* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkBufferMemoryRequirementsInfo2* toTransform);
 
-void transform_tohost_VkImageMemoryRequirementsInfo2(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageMemoryRequirementsInfo2* toTransform);
+void transform_tohost_VkImageMemoryRequirementsInfo2(VkDecoderGlobalState* resourceTracker,
+                                                     VkImageMemoryRequirementsInfo2* toTransform);
 
-void transform_fromhost_VkImageMemoryRequirementsInfo2(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageMemoryRequirementsInfo2* toTransform);
+void transform_fromhost_VkImageMemoryRequirementsInfo2(VkDecoderGlobalState* resourceTracker,
+                                                       VkImageMemoryRequirementsInfo2* toTransform);
 
 void transform_tohost_VkImageSparseMemoryRequirementsInfo2(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageSparseMemoryRequirementsInfo2* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkImageSparseMemoryRequirementsInfo2* toTransform);
 
 void transform_fromhost_VkImageSparseMemoryRequirementsInfo2(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageSparseMemoryRequirementsInfo2* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkImageSparseMemoryRequirementsInfo2* toTransform);
 
-void transform_tohost_VkMemoryRequirements2(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryRequirements2* toTransform);
+void transform_tohost_VkMemoryRequirements2(VkDecoderGlobalState* resourceTracker,
+                                            VkMemoryRequirements2* toTransform);
 
-void transform_fromhost_VkMemoryRequirements2(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryRequirements2* toTransform);
+void transform_fromhost_VkMemoryRequirements2(VkDecoderGlobalState* resourceTracker,
+                                              VkMemoryRequirements2* toTransform);
 
 void transform_tohost_VkSparseImageMemoryRequirements2(
-    VkDecoderGlobalState* resourceTracker,
-    VkSparseImageMemoryRequirements2* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkSparseImageMemoryRequirements2* toTransform);
 
 void transform_fromhost_VkSparseImageMemoryRequirements2(
-    VkDecoderGlobalState* resourceTracker,
-    VkSparseImageMemoryRequirements2* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkSparseImageMemoryRequirements2* toTransform);
 
-void transform_tohost_VkPhysicalDeviceFeatures2(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceFeatures2* toTransform);
+void transform_tohost_VkPhysicalDeviceFeatures2(VkDecoderGlobalState* resourceTracker,
+                                                VkPhysicalDeviceFeatures2* toTransform);
 
-void transform_fromhost_VkPhysicalDeviceFeatures2(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceFeatures2* toTransform);
+void transform_fromhost_VkPhysicalDeviceFeatures2(VkDecoderGlobalState* resourceTracker,
+                                                  VkPhysicalDeviceFeatures2* toTransform);
 
-void transform_tohost_VkPhysicalDeviceProperties2(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceProperties2* toTransform);
+void transform_tohost_VkPhysicalDeviceProperties2(VkDecoderGlobalState* resourceTracker,
+                                                  VkPhysicalDeviceProperties2* toTransform);
 
-void transform_fromhost_VkPhysicalDeviceProperties2(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceProperties2* toTransform);
+void transform_fromhost_VkPhysicalDeviceProperties2(VkDecoderGlobalState* resourceTracker,
+                                                    VkPhysicalDeviceProperties2* toTransform);
 
-void transform_tohost_VkFormatProperties2(
-    VkDecoderGlobalState* resourceTracker,
-    VkFormatProperties2* toTransform);
+void transform_tohost_VkFormatProperties2(VkDecoderGlobalState* resourceTracker,
+                                          VkFormatProperties2* toTransform);
 
-void transform_fromhost_VkFormatProperties2(
-    VkDecoderGlobalState* resourceTracker,
-    VkFormatProperties2* toTransform);
+void transform_fromhost_VkFormatProperties2(VkDecoderGlobalState* resourceTracker,
+                                            VkFormatProperties2* toTransform);
 
-void transform_tohost_VkImageFormatProperties2(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageFormatProperties2* toTransform);
+void transform_tohost_VkImageFormatProperties2(VkDecoderGlobalState* resourceTracker,
+                                               VkImageFormatProperties2* toTransform);
 
-void transform_fromhost_VkImageFormatProperties2(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageFormatProperties2* toTransform);
+void transform_fromhost_VkImageFormatProperties2(VkDecoderGlobalState* resourceTracker,
+                                                 VkImageFormatProperties2* toTransform);
 
 void transform_tohost_VkPhysicalDeviceImageFormatInfo2(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceImageFormatInfo2* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceImageFormatInfo2* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceImageFormatInfo2(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceImageFormatInfo2* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceImageFormatInfo2* toTransform);
 
-void transform_tohost_VkQueueFamilyProperties2(
-    VkDecoderGlobalState* resourceTracker,
-    VkQueueFamilyProperties2* toTransform);
+void transform_tohost_VkQueueFamilyProperties2(VkDecoderGlobalState* resourceTracker,
+                                               VkQueueFamilyProperties2* toTransform);
 
-void transform_fromhost_VkQueueFamilyProperties2(
-    VkDecoderGlobalState* resourceTracker,
-    VkQueueFamilyProperties2* toTransform);
+void transform_fromhost_VkQueueFamilyProperties2(VkDecoderGlobalState* resourceTracker,
+                                                 VkQueueFamilyProperties2* toTransform);
 
 void transform_tohost_VkPhysicalDeviceMemoryProperties2(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMemoryProperties2* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMemoryProperties2* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceMemoryProperties2(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMemoryProperties2* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMemoryProperties2* toTransform);
 
-void transform_tohost_VkSparseImageFormatProperties2(
-    VkDecoderGlobalState* resourceTracker,
-    VkSparseImageFormatProperties2* toTransform);
+void transform_tohost_VkSparseImageFormatProperties2(VkDecoderGlobalState* resourceTracker,
+                                                     VkSparseImageFormatProperties2* toTransform);
 
-void transform_fromhost_VkSparseImageFormatProperties2(
-    VkDecoderGlobalState* resourceTracker,
-    VkSparseImageFormatProperties2* toTransform);
+void transform_fromhost_VkSparseImageFormatProperties2(VkDecoderGlobalState* resourceTracker,
+                                                       VkSparseImageFormatProperties2* toTransform);
 
 void transform_tohost_VkPhysicalDeviceSparseImageFormatInfo2(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceSparseImageFormatInfo2* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceSparseImageFormatInfo2* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceSparseImageFormatInfo2(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceSparseImageFormatInfo2* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceSparseImageFormatInfo2* toTransform);
 
 void transform_tohost_VkPhysicalDevicePointClippingProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePointClippingProperties* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDevicePointClippingProperties* toTransform);
 
 void transform_fromhost_VkPhysicalDevicePointClippingProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePointClippingProperties* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDevicePointClippingProperties* toTransform);
 
 void transform_tohost_VkInputAttachmentAspectReference(
-    VkDecoderGlobalState* resourceTracker,
-    VkInputAttachmentAspectReference* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkInputAttachmentAspectReference* toTransform);
 
 void transform_fromhost_VkInputAttachmentAspectReference(
-    VkDecoderGlobalState* resourceTracker,
-    VkInputAttachmentAspectReference* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkInputAttachmentAspectReference* toTransform);
 
 void transform_tohost_VkRenderPassInputAttachmentAspectCreateInfo(
     VkDecoderGlobalState* resourceTracker,
@@ -1187,13 +896,11 @@
     VkDecoderGlobalState* resourceTracker,
     VkRenderPassInputAttachmentAspectCreateInfo* toTransform);
 
-void transform_tohost_VkImageViewUsageCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageViewUsageCreateInfo* toTransform);
+void transform_tohost_VkImageViewUsageCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                 VkImageViewUsageCreateInfo* toTransform);
 
-void transform_fromhost_VkImageViewUsageCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageViewUsageCreateInfo* toTransform);
+void transform_fromhost_VkImageViewUsageCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                   VkImageViewUsageCreateInfo* toTransform);
 
 void transform_tohost_VkPipelineTessellationDomainOriginStateCreateInfo(
     VkDecoderGlobalState* resourceTracker,
@@ -1203,105 +910,83 @@
     VkDecoderGlobalState* resourceTracker,
     VkPipelineTessellationDomainOriginStateCreateInfo* toTransform);
 
-void transform_tohost_VkRenderPassMultiviewCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkRenderPassMultiviewCreateInfo* toTransform);
+void transform_tohost_VkRenderPassMultiviewCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                      VkRenderPassMultiviewCreateInfo* toTransform);
 
 void transform_fromhost_VkRenderPassMultiviewCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkRenderPassMultiviewCreateInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkRenderPassMultiviewCreateInfo* toTransform);
 
 void transform_tohost_VkPhysicalDeviceMultiviewFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMultiviewFeatures* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMultiviewFeatures* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceMultiviewFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMultiviewFeatures* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMultiviewFeatures* toTransform);
 
 void transform_tohost_VkPhysicalDeviceMultiviewProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMultiviewProperties* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMultiviewProperties* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceMultiviewProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMultiviewProperties* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMultiviewProperties* toTransform);
 
 void transform_tohost_VkPhysicalDeviceVariablePointersFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceVariablePointersFeatures* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceVariablePointersFeatures* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceVariablePointersFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceVariablePointersFeatures* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceVariablePointersFeatures* toTransform);
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceVariablePointersFeatures, transform_tohost_VkPhysicalDeviceVariablePointerFeatures)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceVariablePointersFeatures,
+                      transform_tohost_VkPhysicalDeviceVariablePointerFeatures)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceVariablePointersFeatures, transform_fromhost_VkPhysicalDeviceVariablePointerFeatures)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceVariablePointersFeatures,
+                      transform_fromhost_VkPhysicalDeviceVariablePointerFeatures)
 
 void transform_tohost_VkPhysicalDeviceProtectedMemoryFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceProtectedMemoryFeatures* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceProtectedMemoryFeatures* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceProtectedMemoryFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceProtectedMemoryFeatures* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceProtectedMemoryFeatures* toTransform);
 
 void transform_tohost_VkPhysicalDeviceProtectedMemoryProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceProtectedMemoryProperties* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceProtectedMemoryProperties* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceProtectedMemoryProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceProtectedMemoryProperties* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceProtectedMemoryProperties* toTransform);
 
-void transform_tohost_VkDeviceQueueInfo2(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceQueueInfo2* toTransform);
+void transform_tohost_VkDeviceQueueInfo2(VkDecoderGlobalState* resourceTracker,
+                                         VkDeviceQueueInfo2* toTransform);
 
-void transform_fromhost_VkDeviceQueueInfo2(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceQueueInfo2* toTransform);
+void transform_fromhost_VkDeviceQueueInfo2(VkDecoderGlobalState* resourceTracker,
+                                           VkDeviceQueueInfo2* toTransform);
 
-void transform_tohost_VkProtectedSubmitInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkProtectedSubmitInfo* toTransform);
+void transform_tohost_VkProtectedSubmitInfo(VkDecoderGlobalState* resourceTracker,
+                                            VkProtectedSubmitInfo* toTransform);
 
-void transform_fromhost_VkProtectedSubmitInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkProtectedSubmitInfo* toTransform);
+void transform_fromhost_VkProtectedSubmitInfo(VkDecoderGlobalState* resourceTracker,
+                                              VkProtectedSubmitInfo* toTransform);
 
 void transform_tohost_VkSamplerYcbcrConversionCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSamplerYcbcrConversionCreateInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkSamplerYcbcrConversionCreateInfo* toTransform);
 
 void transform_fromhost_VkSamplerYcbcrConversionCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSamplerYcbcrConversionCreateInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkSamplerYcbcrConversionCreateInfo* toTransform);
 
-void transform_tohost_VkSamplerYcbcrConversionInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSamplerYcbcrConversionInfo* toTransform);
+void transform_tohost_VkSamplerYcbcrConversionInfo(VkDecoderGlobalState* resourceTracker,
+                                                   VkSamplerYcbcrConversionInfo* toTransform);
 
-void transform_fromhost_VkSamplerYcbcrConversionInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSamplerYcbcrConversionInfo* toTransform);
+void transform_fromhost_VkSamplerYcbcrConversionInfo(VkDecoderGlobalState* resourceTracker,
+                                                     VkSamplerYcbcrConversionInfo* toTransform);
 
-void transform_tohost_VkBindImagePlaneMemoryInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindImagePlaneMemoryInfo* toTransform);
+void transform_tohost_VkBindImagePlaneMemoryInfo(VkDecoderGlobalState* resourceTracker,
+                                                 VkBindImagePlaneMemoryInfo* toTransform);
 
-void transform_fromhost_VkBindImagePlaneMemoryInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindImagePlaneMemoryInfo* toTransform);
+void transform_fromhost_VkBindImagePlaneMemoryInfo(VkDecoderGlobalState* resourceTracker,
+                                                   VkBindImagePlaneMemoryInfo* toTransform);
 
 void transform_tohost_VkImagePlaneMemoryRequirementsInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkImagePlaneMemoryRequirementsInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkImagePlaneMemoryRequirementsInfo* toTransform);
 
 void transform_fromhost_VkImagePlaneMemoryRequirementsInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkImagePlaneMemoryRequirementsInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkImagePlaneMemoryRequirementsInfo* toTransform);
 
 void transform_tohost_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
     VkDecoderGlobalState* resourceTracker,
@@ -1319,157 +1004,119 @@
     VkDecoderGlobalState* resourceTracker,
     VkSamplerYcbcrConversionImageFormatProperties* toTransform);
 
-void transform_tohost_VkDescriptorUpdateTemplateEntry(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorUpdateTemplateEntry* toTransform);
+void transform_tohost_VkDescriptorUpdateTemplateEntry(VkDecoderGlobalState* resourceTracker,
+                                                      VkDescriptorUpdateTemplateEntry* toTransform);
 
 void transform_fromhost_VkDescriptorUpdateTemplateEntry(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorUpdateTemplateEntry* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDescriptorUpdateTemplateEntry* toTransform);
 
 void transform_tohost_VkDescriptorUpdateTemplateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorUpdateTemplateCreateInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDescriptorUpdateTemplateCreateInfo* toTransform);
 
 void transform_fromhost_VkDescriptorUpdateTemplateCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorUpdateTemplateCreateInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDescriptorUpdateTemplateCreateInfo* toTransform);
 
-void transform_tohost_VkExternalMemoryProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalMemoryProperties* toTransform);
+void transform_tohost_VkExternalMemoryProperties(VkDecoderGlobalState* resourceTracker,
+                                                 VkExternalMemoryProperties* toTransform);
 
-void transform_fromhost_VkExternalMemoryProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalMemoryProperties* toTransform);
+void transform_fromhost_VkExternalMemoryProperties(VkDecoderGlobalState* resourceTracker,
+                                                   VkExternalMemoryProperties* toTransform);
 
 void transform_tohost_VkPhysicalDeviceExternalImageFormatInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceExternalImageFormatInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceExternalImageFormatInfo* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceExternalImageFormatInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceExternalImageFormatInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceExternalImageFormatInfo* toTransform);
 
-void transform_tohost_VkExternalImageFormatProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalImageFormatProperties* toTransform);
+void transform_tohost_VkExternalImageFormatProperties(VkDecoderGlobalState* resourceTracker,
+                                                      VkExternalImageFormatProperties* toTransform);
 
 void transform_fromhost_VkExternalImageFormatProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalImageFormatProperties* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkExternalImageFormatProperties* toTransform);
 
 void transform_tohost_VkPhysicalDeviceExternalBufferInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceExternalBufferInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceExternalBufferInfo* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceExternalBufferInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceExternalBufferInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceExternalBufferInfo* toTransform);
 
-void transform_tohost_VkExternalBufferProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalBufferProperties* toTransform);
+void transform_tohost_VkExternalBufferProperties(VkDecoderGlobalState* resourceTracker,
+                                                 VkExternalBufferProperties* toTransform);
 
-void transform_fromhost_VkExternalBufferProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalBufferProperties* toTransform);
+void transform_fromhost_VkExternalBufferProperties(VkDecoderGlobalState* resourceTracker,
+                                                   VkExternalBufferProperties* toTransform);
 
-void transform_tohost_VkPhysicalDeviceIDProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceIDProperties* toTransform);
+void transform_tohost_VkPhysicalDeviceIDProperties(VkDecoderGlobalState* resourceTracker,
+                                                   VkPhysicalDeviceIDProperties* toTransform);
 
-void transform_fromhost_VkPhysicalDeviceIDProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceIDProperties* toTransform);
+void transform_fromhost_VkPhysicalDeviceIDProperties(VkDecoderGlobalState* resourceTracker,
+                                                     VkPhysicalDeviceIDProperties* toTransform);
 
-void transform_tohost_VkExternalMemoryImageCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalMemoryImageCreateInfo* toTransform);
+void transform_tohost_VkExternalMemoryImageCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                      VkExternalMemoryImageCreateInfo* toTransform);
 
 void transform_fromhost_VkExternalMemoryImageCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalMemoryImageCreateInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkExternalMemoryImageCreateInfo* toTransform);
 
 void transform_tohost_VkExternalMemoryBufferCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalMemoryBufferCreateInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkExternalMemoryBufferCreateInfo* toTransform);
 
 void transform_fromhost_VkExternalMemoryBufferCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalMemoryBufferCreateInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkExternalMemoryBufferCreateInfo* toTransform);
 
-void transform_tohost_VkExportMemoryAllocateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkExportMemoryAllocateInfo* toTransform);
+void transform_tohost_VkExportMemoryAllocateInfo(VkDecoderGlobalState* resourceTracker,
+                                                 VkExportMemoryAllocateInfo* toTransform);
 
-void transform_fromhost_VkExportMemoryAllocateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkExportMemoryAllocateInfo* toTransform);
+void transform_fromhost_VkExportMemoryAllocateInfo(VkDecoderGlobalState* resourceTracker,
+                                                   VkExportMemoryAllocateInfo* toTransform);
 
 void transform_tohost_VkPhysicalDeviceExternalFenceInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceExternalFenceInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceExternalFenceInfo* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceExternalFenceInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceExternalFenceInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceExternalFenceInfo* toTransform);
 
-void transform_tohost_VkExternalFenceProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalFenceProperties* toTransform);
+void transform_tohost_VkExternalFenceProperties(VkDecoderGlobalState* resourceTracker,
+                                                VkExternalFenceProperties* toTransform);
 
-void transform_fromhost_VkExternalFenceProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalFenceProperties* toTransform);
+void transform_fromhost_VkExternalFenceProperties(VkDecoderGlobalState* resourceTracker,
+                                                  VkExternalFenceProperties* toTransform);
 
-void transform_tohost_VkExportFenceCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkExportFenceCreateInfo* toTransform);
+void transform_tohost_VkExportFenceCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                              VkExportFenceCreateInfo* toTransform);
 
-void transform_fromhost_VkExportFenceCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkExportFenceCreateInfo* toTransform);
+void transform_fromhost_VkExportFenceCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                VkExportFenceCreateInfo* toTransform);
 
-void transform_tohost_VkExportSemaphoreCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkExportSemaphoreCreateInfo* toTransform);
+void transform_tohost_VkExportSemaphoreCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                  VkExportSemaphoreCreateInfo* toTransform);
 
-void transform_fromhost_VkExportSemaphoreCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkExportSemaphoreCreateInfo* toTransform);
+void transform_fromhost_VkExportSemaphoreCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                    VkExportSemaphoreCreateInfo* toTransform);
 
 void transform_tohost_VkPhysicalDeviceExternalSemaphoreInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceExternalSemaphoreInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceExternalSemaphoreInfo* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceExternalSemaphoreInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceExternalSemaphoreInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceExternalSemaphoreInfo* toTransform);
 
-void transform_tohost_VkExternalSemaphoreProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalSemaphoreProperties* toTransform);
+void transform_tohost_VkExternalSemaphoreProperties(VkDecoderGlobalState* resourceTracker,
+                                                    VkExternalSemaphoreProperties* toTransform);
 
-void transform_fromhost_VkExternalSemaphoreProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalSemaphoreProperties* toTransform);
+void transform_fromhost_VkExternalSemaphoreProperties(VkDecoderGlobalState* resourceTracker,
+                                                      VkExternalSemaphoreProperties* toTransform);
 
 void transform_tohost_VkPhysicalDeviceMaintenance3Properties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMaintenance3Properties* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMaintenance3Properties* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceMaintenance3Properties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMaintenance3Properties* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMaintenance3Properties* toTransform);
 
-void transform_tohost_VkDescriptorSetLayoutSupport(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorSetLayoutSupport* toTransform);
+void transform_tohost_VkDescriptorSetLayoutSupport(VkDecoderGlobalState* resourceTracker,
+                                                   VkDescriptorSetLayoutSupport* toTransform);
 
-void transform_fromhost_VkDescriptorSetLayoutSupport(
-    VkDecoderGlobalState* resourceTracker,
-    VkDescriptorSetLayoutSupport* toTransform);
+void transform_fromhost_VkDescriptorSetLayoutSupport(VkDecoderGlobalState* resourceTracker,
+                                                     VkDescriptorSetLayoutSupport* toTransform);
 
 void transform_tohost_VkPhysicalDeviceShaderDrawParametersFeatures(
     VkDecoderGlobalState* resourceTracker,
@@ -1479,155 +1126,121 @@
     VkDecoderGlobalState* resourceTracker,
     VkPhysicalDeviceShaderDrawParametersFeatures* toTransform);
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceShaderDrawParametersFeatures, transform_tohost_VkPhysicalDeviceShaderDrawParameterFeatures)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceShaderDrawParametersFeatures,
+                      transform_tohost_VkPhysicalDeviceShaderDrawParameterFeatures)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceShaderDrawParametersFeatures, transform_fromhost_VkPhysicalDeviceShaderDrawParameterFeatures)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceShaderDrawParametersFeatures,
+                      transform_fromhost_VkPhysicalDeviceShaderDrawParameterFeatures)
 
 #endif
 #ifdef VK_VERSION_1_2
 void transform_tohost_VkPhysicalDeviceVulkan11Features(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceVulkan11Features* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceVulkan11Features* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceVulkan11Features(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceVulkan11Features* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceVulkan11Features* toTransform);
 
 void transform_tohost_VkPhysicalDeviceVulkan11Properties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceVulkan11Properties* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceVulkan11Properties* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceVulkan11Properties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceVulkan11Properties* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceVulkan11Properties* toTransform);
 
 void transform_tohost_VkPhysicalDeviceVulkan12Features(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceVulkan12Features* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceVulkan12Features* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceVulkan12Features(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceVulkan12Features* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceVulkan12Features* toTransform);
 
-void transform_tohost_VkConformanceVersion(
-    VkDecoderGlobalState* resourceTracker,
-    VkConformanceVersion* toTransform);
+void transform_tohost_VkConformanceVersion(VkDecoderGlobalState* resourceTracker,
+                                           VkConformanceVersion* toTransform);
 
-void transform_fromhost_VkConformanceVersion(
-    VkDecoderGlobalState* resourceTracker,
-    VkConformanceVersion* toTransform);
+void transform_fromhost_VkConformanceVersion(VkDecoderGlobalState* resourceTracker,
+                                             VkConformanceVersion* toTransform);
 
 void transform_tohost_VkPhysicalDeviceVulkan12Properties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceVulkan12Properties* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceVulkan12Properties* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceVulkan12Properties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceVulkan12Properties* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceVulkan12Properties* toTransform);
 
-void transform_tohost_VkImageFormatListCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageFormatListCreateInfo* toTransform);
+void transform_tohost_VkImageFormatListCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                  VkImageFormatListCreateInfo* toTransform);
 
-void transform_fromhost_VkImageFormatListCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageFormatListCreateInfo* toTransform);
+void transform_fromhost_VkImageFormatListCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                    VkImageFormatListCreateInfo* toTransform);
 
-void transform_tohost_VkAttachmentDescription2(
-    VkDecoderGlobalState* resourceTracker,
-    VkAttachmentDescription2* toTransform);
+void transform_tohost_VkAttachmentDescription2(VkDecoderGlobalState* resourceTracker,
+                                               VkAttachmentDescription2* toTransform);
 
-void transform_fromhost_VkAttachmentDescription2(
-    VkDecoderGlobalState* resourceTracker,
-    VkAttachmentDescription2* toTransform);
+void transform_fromhost_VkAttachmentDescription2(VkDecoderGlobalState* resourceTracker,
+                                                 VkAttachmentDescription2* toTransform);
 
-void transform_tohost_VkAttachmentReference2(
-    VkDecoderGlobalState* resourceTracker,
-    VkAttachmentReference2* toTransform);
+void transform_tohost_VkAttachmentReference2(VkDecoderGlobalState* resourceTracker,
+                                             VkAttachmentReference2* toTransform);
 
-void transform_fromhost_VkAttachmentReference2(
-    VkDecoderGlobalState* resourceTracker,
-    VkAttachmentReference2* toTransform);
+void transform_fromhost_VkAttachmentReference2(VkDecoderGlobalState* resourceTracker,
+                                               VkAttachmentReference2* toTransform);
 
-void transform_tohost_VkSubpassDescription2(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubpassDescription2* toTransform);
+void transform_tohost_VkSubpassDescription2(VkDecoderGlobalState* resourceTracker,
+                                            VkSubpassDescription2* toTransform);
 
-void transform_fromhost_VkSubpassDescription2(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubpassDescription2* toTransform);
+void transform_fromhost_VkSubpassDescription2(VkDecoderGlobalState* resourceTracker,
+                                              VkSubpassDescription2* toTransform);
 
-void transform_tohost_VkSubpassDependency2(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubpassDependency2* toTransform);
+void transform_tohost_VkSubpassDependency2(VkDecoderGlobalState* resourceTracker,
+                                           VkSubpassDependency2* toTransform);
 
-void transform_fromhost_VkSubpassDependency2(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubpassDependency2* toTransform);
+void transform_fromhost_VkSubpassDependency2(VkDecoderGlobalState* resourceTracker,
+                                             VkSubpassDependency2* toTransform);
 
-void transform_tohost_VkRenderPassCreateInfo2(
-    VkDecoderGlobalState* resourceTracker,
-    VkRenderPassCreateInfo2* toTransform);
+void transform_tohost_VkRenderPassCreateInfo2(VkDecoderGlobalState* resourceTracker,
+                                              VkRenderPassCreateInfo2* toTransform);
 
-void transform_fromhost_VkRenderPassCreateInfo2(
-    VkDecoderGlobalState* resourceTracker,
-    VkRenderPassCreateInfo2* toTransform);
+void transform_fromhost_VkRenderPassCreateInfo2(VkDecoderGlobalState* resourceTracker,
+                                                VkRenderPassCreateInfo2* toTransform);
 
-void transform_tohost_VkSubpassBeginInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubpassBeginInfo* toTransform);
+void transform_tohost_VkSubpassBeginInfo(VkDecoderGlobalState* resourceTracker,
+                                         VkSubpassBeginInfo* toTransform);
 
-void transform_fromhost_VkSubpassBeginInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubpassBeginInfo* toTransform);
+void transform_fromhost_VkSubpassBeginInfo(VkDecoderGlobalState* resourceTracker,
+                                           VkSubpassBeginInfo* toTransform);
 
-void transform_tohost_VkSubpassEndInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubpassEndInfo* toTransform);
+void transform_tohost_VkSubpassEndInfo(VkDecoderGlobalState* resourceTracker,
+                                       VkSubpassEndInfo* toTransform);
 
-void transform_fromhost_VkSubpassEndInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubpassEndInfo* toTransform);
+void transform_fromhost_VkSubpassEndInfo(VkDecoderGlobalState* resourceTracker,
+                                         VkSubpassEndInfo* toTransform);
 
 void transform_tohost_VkPhysicalDevice8BitStorageFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevice8BitStorageFeatures* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDevice8BitStorageFeatures* toTransform);
 
 void transform_fromhost_VkPhysicalDevice8BitStorageFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevice8BitStorageFeatures* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDevice8BitStorageFeatures* toTransform);
 
 void transform_tohost_VkPhysicalDeviceDriverProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceDriverProperties* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceDriverProperties* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceDriverProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceDriverProperties* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceDriverProperties* toTransform);
 
 void transform_tohost_VkPhysicalDeviceShaderAtomicInt64Features(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderAtomicInt64Features* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceShaderAtomicInt64Features* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceShaderAtomicInt64Features(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderAtomicInt64Features* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceShaderAtomicInt64Features* toTransform);
 
 void transform_tohost_VkPhysicalDeviceShaderFloat16Int8Features(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderFloat16Int8Features* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceShaderFloat16Int8Features* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceShaderFloat16Int8Features(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderFloat16Int8Features* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceShaderFloat16Int8Features* toTransform);
 
 void transform_tohost_VkPhysicalDeviceFloatControlsProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceFloatControlsProperties* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceFloatControlsProperties* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceFloatControlsProperties(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceFloatControlsProperties* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceFloatControlsProperties* toTransform);
 
 void transform_tohost_VkDescriptorSetLayoutBindingFlagsCreateInfo(
     VkDecoderGlobalState* resourceTracker,
@@ -1638,12 +1251,10 @@
     VkDescriptorSetLayoutBindingFlagsCreateInfo* toTransform);
 
 void transform_tohost_VkPhysicalDeviceDescriptorIndexingFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceDescriptorIndexingFeatures* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceDescriptorIndexingFeatures* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceDescriptorIndexingFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceDescriptorIndexingFeatures* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceDescriptorIndexingFeatures* toTransform);
 
 void transform_tohost_VkPhysicalDeviceDescriptorIndexingProperties(
     VkDecoderGlobalState* resourceTracker,
@@ -1670,12 +1281,10 @@
     VkDescriptorSetVariableDescriptorCountLayoutSupport* toTransform);
 
 void transform_tohost_VkSubpassDescriptionDepthStencilResolve(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubpassDescriptionDepthStencilResolve* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkSubpassDescriptionDepthStencilResolve* toTransform);
 
 void transform_fromhost_VkSubpassDescriptionDepthStencilResolve(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubpassDescriptionDepthStencilResolve* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkSubpassDescriptionDepthStencilResolve* toTransform);
 
 void transform_tohost_VkPhysicalDeviceDepthStencilResolveProperties(
     VkDecoderGlobalState* resourceTracker,
@@ -1686,28 +1295,22 @@
     VkPhysicalDeviceDepthStencilResolveProperties* toTransform);
 
 void transform_tohost_VkPhysicalDeviceScalarBlockLayoutFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceScalarBlockLayoutFeatures* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceScalarBlockLayoutFeatures* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceScalarBlockLayoutFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceScalarBlockLayoutFeatures* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceScalarBlockLayoutFeatures* toTransform);
 
-void transform_tohost_VkImageStencilUsageCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageStencilUsageCreateInfo* toTransform);
+void transform_tohost_VkImageStencilUsageCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                    VkImageStencilUsageCreateInfo* toTransform);
 
-void transform_fromhost_VkImageStencilUsageCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageStencilUsageCreateInfo* toTransform);
+void transform_fromhost_VkImageStencilUsageCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                      VkImageStencilUsageCreateInfo* toTransform);
 
 void transform_tohost_VkSamplerReductionModeCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSamplerReductionModeCreateInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkSamplerReductionModeCreateInfo* toTransform);
 
 void transform_fromhost_VkSamplerReductionModeCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSamplerReductionModeCreateInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkSamplerReductionModeCreateInfo* toTransform);
 
 void transform_tohost_VkPhysicalDeviceSamplerFilterMinmaxProperties(
     VkDecoderGlobalState* resourceTracker,
@@ -1718,12 +1321,10 @@
     VkPhysicalDeviceSamplerFilterMinmaxProperties* toTransform);
 
 void transform_tohost_VkPhysicalDeviceVulkanMemoryModelFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceVulkanMemoryModelFeatures* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceVulkanMemoryModelFeatures* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceVulkanMemoryModelFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceVulkanMemoryModelFeatures* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceVulkanMemoryModelFeatures* toTransform);
 
 void transform_tohost_VkPhysicalDeviceImagelessFramebufferFeatures(
     VkDecoderGlobalState* resourceTracker,
@@ -1734,28 +1335,22 @@
     VkPhysicalDeviceImagelessFramebufferFeatures* toTransform);
 
 void transform_tohost_VkFramebufferAttachmentImageInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkFramebufferAttachmentImageInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkFramebufferAttachmentImageInfo* toTransform);
 
 void transform_fromhost_VkFramebufferAttachmentImageInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkFramebufferAttachmentImageInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkFramebufferAttachmentImageInfo* toTransform);
 
 void transform_tohost_VkFramebufferAttachmentsCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkFramebufferAttachmentsCreateInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkFramebufferAttachmentsCreateInfo* toTransform);
 
 void transform_fromhost_VkFramebufferAttachmentsCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkFramebufferAttachmentsCreateInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkFramebufferAttachmentsCreateInfo* toTransform);
 
-void transform_tohost_VkRenderPassAttachmentBeginInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkRenderPassAttachmentBeginInfo* toTransform);
+void transform_tohost_VkRenderPassAttachmentBeginInfo(VkDecoderGlobalState* resourceTracker,
+                                                      VkRenderPassAttachmentBeginInfo* toTransform);
 
 void transform_fromhost_VkRenderPassAttachmentBeginInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkRenderPassAttachmentBeginInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkRenderPassAttachmentBeginInfo* toTransform);
 
 void transform_tohost_VkPhysicalDeviceUniformBufferStandardLayoutFeatures(
     VkDecoderGlobalState* resourceTracker,
@@ -1782,36 +1377,28 @@
     VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* toTransform);
 
 void transform_tohost_VkAttachmentReferenceStencilLayout(
-    VkDecoderGlobalState* resourceTracker,
-    VkAttachmentReferenceStencilLayout* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkAttachmentReferenceStencilLayout* toTransform);
 
 void transform_fromhost_VkAttachmentReferenceStencilLayout(
-    VkDecoderGlobalState* resourceTracker,
-    VkAttachmentReferenceStencilLayout* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkAttachmentReferenceStencilLayout* toTransform);
 
 void transform_tohost_VkAttachmentDescriptionStencilLayout(
-    VkDecoderGlobalState* resourceTracker,
-    VkAttachmentDescriptionStencilLayout* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkAttachmentDescriptionStencilLayout* toTransform);
 
 void transform_fromhost_VkAttachmentDescriptionStencilLayout(
-    VkDecoderGlobalState* resourceTracker,
-    VkAttachmentDescriptionStencilLayout* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkAttachmentDescriptionStencilLayout* toTransform);
 
 void transform_tohost_VkPhysicalDeviceHostQueryResetFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceHostQueryResetFeatures* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceHostQueryResetFeatures* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceHostQueryResetFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceHostQueryResetFeatures* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceHostQueryResetFeatures* toTransform);
 
 void transform_tohost_VkPhysicalDeviceTimelineSemaphoreFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceTimelineSemaphoreFeatures* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceTimelineSemaphoreFeatures* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceTimelineSemaphoreFeatures(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceTimelineSemaphoreFeatures* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceTimelineSemaphoreFeatures* toTransform);
 
 void transform_tohost_VkPhysicalDeviceTimelineSemaphoreProperties(
     VkDecoderGlobalState* resourceTracker,
@@ -1821,37 +1408,29 @@
     VkDecoderGlobalState* resourceTracker,
     VkPhysicalDeviceTimelineSemaphoreProperties* toTransform);
 
-void transform_tohost_VkSemaphoreTypeCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSemaphoreTypeCreateInfo* toTransform);
+void transform_tohost_VkSemaphoreTypeCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                VkSemaphoreTypeCreateInfo* toTransform);
 
-void transform_fromhost_VkSemaphoreTypeCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSemaphoreTypeCreateInfo* toTransform);
+void transform_fromhost_VkSemaphoreTypeCreateInfo(VkDecoderGlobalState* resourceTracker,
+                                                  VkSemaphoreTypeCreateInfo* toTransform);
 
-void transform_tohost_VkTimelineSemaphoreSubmitInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkTimelineSemaphoreSubmitInfo* toTransform);
+void transform_tohost_VkTimelineSemaphoreSubmitInfo(VkDecoderGlobalState* resourceTracker,
+                                                    VkTimelineSemaphoreSubmitInfo* toTransform);
 
-void transform_fromhost_VkTimelineSemaphoreSubmitInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkTimelineSemaphoreSubmitInfo* toTransform);
+void transform_fromhost_VkTimelineSemaphoreSubmitInfo(VkDecoderGlobalState* resourceTracker,
+                                                      VkTimelineSemaphoreSubmitInfo* toTransform);
 
-void transform_tohost_VkSemaphoreWaitInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSemaphoreWaitInfo* toTransform);
+void transform_tohost_VkSemaphoreWaitInfo(VkDecoderGlobalState* resourceTracker,
+                                          VkSemaphoreWaitInfo* toTransform);
 
-void transform_fromhost_VkSemaphoreWaitInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSemaphoreWaitInfo* toTransform);
+void transform_fromhost_VkSemaphoreWaitInfo(VkDecoderGlobalState* resourceTracker,
+                                            VkSemaphoreWaitInfo* toTransform);
 
-void transform_tohost_VkSemaphoreSignalInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSemaphoreSignalInfo* toTransform);
+void transform_tohost_VkSemaphoreSignalInfo(VkDecoderGlobalState* resourceTracker,
+                                            VkSemaphoreSignalInfo* toTransform);
 
-void transform_fromhost_VkSemaphoreSignalInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkSemaphoreSignalInfo* toTransform);
+void transform_fromhost_VkSemaphoreSignalInfo(VkDecoderGlobalState* resourceTracker,
+                                              VkSemaphoreSignalInfo* toTransform);
 
 void transform_tohost_VkPhysicalDeviceBufferDeviceAddressFeatures(
     VkDecoderGlobalState* resourceTracker,
@@ -1861,407 +1440,313 @@
     VkDecoderGlobalState* resourceTracker,
     VkPhysicalDeviceBufferDeviceAddressFeatures* toTransform);
 
-void transform_tohost_VkBufferDeviceAddressInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferDeviceAddressInfo* toTransform);
+void transform_tohost_VkBufferDeviceAddressInfo(VkDecoderGlobalState* resourceTracker,
+                                                VkBufferDeviceAddressInfo* toTransform);
 
-void transform_fromhost_VkBufferDeviceAddressInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferDeviceAddressInfo* toTransform);
+void transform_fromhost_VkBufferDeviceAddressInfo(VkDecoderGlobalState* resourceTracker,
+                                                  VkBufferDeviceAddressInfo* toTransform);
 
 void transform_tohost_VkBufferOpaqueCaptureAddressCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferOpaqueCaptureAddressCreateInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkBufferOpaqueCaptureAddressCreateInfo* toTransform);
 
 void transform_fromhost_VkBufferOpaqueCaptureAddressCreateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferOpaqueCaptureAddressCreateInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkBufferOpaqueCaptureAddressCreateInfo* toTransform);
 
 void transform_tohost_VkMemoryOpaqueCaptureAddressAllocateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryOpaqueCaptureAddressAllocateInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkMemoryOpaqueCaptureAddressAllocateInfo* toTransform);
 
 void transform_fromhost_VkMemoryOpaqueCaptureAddressAllocateInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryOpaqueCaptureAddressAllocateInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkMemoryOpaqueCaptureAddressAllocateInfo* toTransform);
 
 void transform_tohost_VkDeviceMemoryOpaqueCaptureAddressInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceMemoryOpaqueCaptureAddressInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDeviceMemoryOpaqueCaptureAddressInfo* toTransform);
 
 void transform_fromhost_VkDeviceMemoryOpaqueCaptureAddressInfo(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceMemoryOpaqueCaptureAddressInfo* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDeviceMemoryOpaqueCaptureAddressInfo* toTransform);
 
 #endif
 #ifdef VK_KHR_surface
-void transform_tohost_VkSurfaceCapabilitiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSurfaceCapabilitiesKHR* toTransform);
+void transform_tohost_VkSurfaceCapabilitiesKHR(VkDecoderGlobalState* resourceTracker,
+                                               VkSurfaceCapabilitiesKHR* toTransform);
 
-void transform_fromhost_VkSurfaceCapabilitiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSurfaceCapabilitiesKHR* toTransform);
+void transform_fromhost_VkSurfaceCapabilitiesKHR(VkDecoderGlobalState* resourceTracker,
+                                                 VkSurfaceCapabilitiesKHR* toTransform);
 
-void transform_tohost_VkSurfaceFormatKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSurfaceFormatKHR* toTransform);
+void transform_tohost_VkSurfaceFormatKHR(VkDecoderGlobalState* resourceTracker,
+                                         VkSurfaceFormatKHR* toTransform);
 
-void transform_fromhost_VkSurfaceFormatKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSurfaceFormatKHR* toTransform);
+void transform_fromhost_VkSurfaceFormatKHR(VkDecoderGlobalState* resourceTracker,
+                                           VkSurfaceFormatKHR* toTransform);
 
 #endif
 #ifdef VK_KHR_swapchain
-void transform_tohost_VkSwapchainCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSwapchainCreateInfoKHR* toTransform);
+void transform_tohost_VkSwapchainCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                               VkSwapchainCreateInfoKHR* toTransform);
 
-void transform_fromhost_VkSwapchainCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSwapchainCreateInfoKHR* toTransform);
+void transform_fromhost_VkSwapchainCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                 VkSwapchainCreateInfoKHR* toTransform);
 
-void transform_tohost_VkPresentInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPresentInfoKHR* toTransform);
+void transform_tohost_VkPresentInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                       VkPresentInfoKHR* toTransform);
 
-void transform_fromhost_VkPresentInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPresentInfoKHR* toTransform);
+void transform_fromhost_VkPresentInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                         VkPresentInfoKHR* toTransform);
 
-void transform_tohost_VkImageSwapchainCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageSwapchainCreateInfoKHR* toTransform);
+void transform_tohost_VkImageSwapchainCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkImageSwapchainCreateInfoKHR* toTransform);
 
-void transform_fromhost_VkImageSwapchainCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageSwapchainCreateInfoKHR* toTransform);
+void transform_fromhost_VkImageSwapchainCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                      VkImageSwapchainCreateInfoKHR* toTransform);
 
 void transform_tohost_VkBindImageMemorySwapchainInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindImageMemorySwapchainInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkBindImageMemorySwapchainInfoKHR* toTransform);
 
 void transform_fromhost_VkBindImageMemorySwapchainInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindImageMemorySwapchainInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkBindImageMemorySwapchainInfoKHR* toTransform);
 
-void transform_tohost_VkAcquireNextImageInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAcquireNextImageInfoKHR* toTransform);
+void transform_tohost_VkAcquireNextImageInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                VkAcquireNextImageInfoKHR* toTransform);
 
-void transform_fromhost_VkAcquireNextImageInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAcquireNextImageInfoKHR* toTransform);
+void transform_fromhost_VkAcquireNextImageInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                  VkAcquireNextImageInfoKHR* toTransform);
 
 void transform_tohost_VkDeviceGroupPresentCapabilitiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceGroupPresentCapabilitiesKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDeviceGroupPresentCapabilitiesKHR* toTransform);
 
 void transform_fromhost_VkDeviceGroupPresentCapabilitiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceGroupPresentCapabilitiesKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDeviceGroupPresentCapabilitiesKHR* toTransform);
 
-void transform_tohost_VkDeviceGroupPresentInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceGroupPresentInfoKHR* toTransform);
+void transform_tohost_VkDeviceGroupPresentInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                  VkDeviceGroupPresentInfoKHR* toTransform);
 
-void transform_fromhost_VkDeviceGroupPresentInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceGroupPresentInfoKHR* toTransform);
+void transform_fromhost_VkDeviceGroupPresentInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkDeviceGroupPresentInfoKHR* toTransform);
 
 void transform_tohost_VkDeviceGroupSwapchainCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceGroupSwapchainCreateInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDeviceGroupSwapchainCreateInfoKHR* toTransform);
 
 void transform_fromhost_VkDeviceGroupSwapchainCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceGroupSwapchainCreateInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDeviceGroupSwapchainCreateInfoKHR* toTransform);
 
 #endif
 #ifdef VK_KHR_display
-void transform_tohost_VkDisplayModeParametersKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayModeParametersKHR* toTransform);
+void transform_tohost_VkDisplayModeParametersKHR(VkDecoderGlobalState* resourceTracker,
+                                                 VkDisplayModeParametersKHR* toTransform);
 
-void transform_fromhost_VkDisplayModeParametersKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayModeParametersKHR* toTransform);
+void transform_fromhost_VkDisplayModeParametersKHR(VkDecoderGlobalState* resourceTracker,
+                                                   VkDisplayModeParametersKHR* toTransform);
 
-void transform_tohost_VkDisplayModeCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayModeCreateInfoKHR* toTransform);
+void transform_tohost_VkDisplayModeCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                 VkDisplayModeCreateInfoKHR* toTransform);
 
-void transform_fromhost_VkDisplayModeCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayModeCreateInfoKHR* toTransform);
+void transform_fromhost_VkDisplayModeCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                   VkDisplayModeCreateInfoKHR* toTransform);
 
-void transform_tohost_VkDisplayModePropertiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayModePropertiesKHR* toTransform);
+void transform_tohost_VkDisplayModePropertiesKHR(VkDecoderGlobalState* resourceTracker,
+                                                 VkDisplayModePropertiesKHR* toTransform);
 
-void transform_fromhost_VkDisplayModePropertiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayModePropertiesKHR* toTransform);
+void transform_fromhost_VkDisplayModePropertiesKHR(VkDecoderGlobalState* resourceTracker,
+                                                   VkDisplayModePropertiesKHR* toTransform);
 
-void transform_tohost_VkDisplayPlaneCapabilitiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayPlaneCapabilitiesKHR* toTransform);
+void transform_tohost_VkDisplayPlaneCapabilitiesKHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkDisplayPlaneCapabilitiesKHR* toTransform);
 
-void transform_fromhost_VkDisplayPlaneCapabilitiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayPlaneCapabilitiesKHR* toTransform);
+void transform_fromhost_VkDisplayPlaneCapabilitiesKHR(VkDecoderGlobalState* resourceTracker,
+                                                      VkDisplayPlaneCapabilitiesKHR* toTransform);
 
-void transform_tohost_VkDisplayPlanePropertiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayPlanePropertiesKHR* toTransform);
+void transform_tohost_VkDisplayPlanePropertiesKHR(VkDecoderGlobalState* resourceTracker,
+                                                  VkDisplayPlanePropertiesKHR* toTransform);
 
-void transform_fromhost_VkDisplayPlanePropertiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayPlanePropertiesKHR* toTransform);
+void transform_fromhost_VkDisplayPlanePropertiesKHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkDisplayPlanePropertiesKHR* toTransform);
 
-void transform_tohost_VkDisplayPropertiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayPropertiesKHR* toTransform);
+void transform_tohost_VkDisplayPropertiesKHR(VkDecoderGlobalState* resourceTracker,
+                                             VkDisplayPropertiesKHR* toTransform);
 
-void transform_fromhost_VkDisplayPropertiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayPropertiesKHR* toTransform);
+void transform_fromhost_VkDisplayPropertiesKHR(VkDecoderGlobalState* resourceTracker,
+                                               VkDisplayPropertiesKHR* toTransform);
 
-void transform_tohost_VkDisplaySurfaceCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplaySurfaceCreateInfoKHR* toTransform);
+void transform_tohost_VkDisplaySurfaceCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkDisplaySurfaceCreateInfoKHR* toTransform);
 
-void transform_fromhost_VkDisplaySurfaceCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplaySurfaceCreateInfoKHR* toTransform);
+void transform_fromhost_VkDisplaySurfaceCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                      VkDisplaySurfaceCreateInfoKHR* toTransform);
 
 #endif
 #ifdef VK_KHR_display_swapchain
-void transform_tohost_VkDisplayPresentInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayPresentInfoKHR* toTransform);
+void transform_tohost_VkDisplayPresentInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                              VkDisplayPresentInfoKHR* toTransform);
 
-void transform_fromhost_VkDisplayPresentInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayPresentInfoKHR* toTransform);
+void transform_fromhost_VkDisplayPresentInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                VkDisplayPresentInfoKHR* toTransform);
 
 #endif
 #ifdef VK_KHR_xlib_surface
-void transform_tohost_VkXlibSurfaceCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkXlibSurfaceCreateInfoKHR* toTransform);
+void transform_tohost_VkXlibSurfaceCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                 VkXlibSurfaceCreateInfoKHR* toTransform);
 
-void transform_fromhost_VkXlibSurfaceCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkXlibSurfaceCreateInfoKHR* toTransform);
+void transform_fromhost_VkXlibSurfaceCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                   VkXlibSurfaceCreateInfoKHR* toTransform);
 
 #endif
 #ifdef VK_KHR_xcb_surface
-void transform_tohost_VkXcbSurfaceCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkXcbSurfaceCreateInfoKHR* toTransform);
+void transform_tohost_VkXcbSurfaceCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                VkXcbSurfaceCreateInfoKHR* toTransform);
 
-void transform_fromhost_VkXcbSurfaceCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkXcbSurfaceCreateInfoKHR* toTransform);
+void transform_fromhost_VkXcbSurfaceCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                  VkXcbSurfaceCreateInfoKHR* toTransform);
 
 #endif
 #ifdef VK_KHR_wayland_surface
-void transform_tohost_VkWaylandSurfaceCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkWaylandSurfaceCreateInfoKHR* toTransform);
+void transform_tohost_VkWaylandSurfaceCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkWaylandSurfaceCreateInfoKHR* toTransform);
 
-void transform_fromhost_VkWaylandSurfaceCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkWaylandSurfaceCreateInfoKHR* toTransform);
+void transform_fromhost_VkWaylandSurfaceCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                      VkWaylandSurfaceCreateInfoKHR* toTransform);
 
 #endif
 #ifdef VK_KHR_android_surface
-void transform_tohost_VkAndroidSurfaceCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAndroidSurfaceCreateInfoKHR* toTransform);
+void transform_tohost_VkAndroidSurfaceCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkAndroidSurfaceCreateInfoKHR* toTransform);
 
-void transform_fromhost_VkAndroidSurfaceCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAndroidSurfaceCreateInfoKHR* toTransform);
+void transform_fromhost_VkAndroidSurfaceCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                      VkAndroidSurfaceCreateInfoKHR* toTransform);
 
 #endif
 #ifdef VK_KHR_win32_surface
-void transform_tohost_VkWin32SurfaceCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkWin32SurfaceCreateInfoKHR* toTransform);
+void transform_tohost_VkWin32SurfaceCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                  VkWin32SurfaceCreateInfoKHR* toTransform);
 
-void transform_fromhost_VkWin32SurfaceCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkWin32SurfaceCreateInfoKHR* toTransform);
+void transform_fromhost_VkWin32SurfaceCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkWin32SurfaceCreateInfoKHR* toTransform);
 
 #endif
 #ifdef VK_KHR_sampler_mirror_clamp_to_edge
 #endif
 #ifdef VK_KHR_video_queue
 void transform_tohost_VkVideoQueueFamilyProperties2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoQueueFamilyProperties2KHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoQueueFamilyProperties2KHR* toTransform);
 
 void transform_fromhost_VkVideoQueueFamilyProperties2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoQueueFamilyProperties2KHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoQueueFamilyProperties2KHR* toTransform);
 
-void transform_tohost_VkVideoProfileKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoProfileKHR* toTransform);
+void transform_tohost_VkVideoProfileKHR(VkDecoderGlobalState* resourceTracker,
+                                        VkVideoProfileKHR* toTransform);
 
-void transform_fromhost_VkVideoProfileKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoProfileKHR* toTransform);
+void transform_fromhost_VkVideoProfileKHR(VkDecoderGlobalState* resourceTracker,
+                                          VkVideoProfileKHR* toTransform);
 
-void transform_tohost_VkVideoProfilesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoProfilesKHR* toTransform);
+void transform_tohost_VkVideoProfilesKHR(VkDecoderGlobalState* resourceTracker,
+                                         VkVideoProfilesKHR* toTransform);
 
-void transform_fromhost_VkVideoProfilesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoProfilesKHR* toTransform);
+void transform_fromhost_VkVideoProfilesKHR(VkDecoderGlobalState* resourceTracker,
+                                           VkVideoProfilesKHR* toTransform);
 
-void transform_tohost_VkVideoCapabilitiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoCapabilitiesKHR* toTransform);
+void transform_tohost_VkVideoCapabilitiesKHR(VkDecoderGlobalState* resourceTracker,
+                                             VkVideoCapabilitiesKHR* toTransform);
 
-void transform_fromhost_VkVideoCapabilitiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoCapabilitiesKHR* toTransform);
+void transform_fromhost_VkVideoCapabilitiesKHR(VkDecoderGlobalState* resourceTracker,
+                                               VkVideoCapabilitiesKHR* toTransform);
 
 void transform_tohost_VkPhysicalDeviceVideoFormatInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceVideoFormatInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceVideoFormatInfoKHR* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceVideoFormatInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceVideoFormatInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceVideoFormatInfoKHR* toTransform);
 
-void transform_tohost_VkVideoFormatPropertiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoFormatPropertiesKHR* toTransform);
+void transform_tohost_VkVideoFormatPropertiesKHR(VkDecoderGlobalState* resourceTracker,
+                                                 VkVideoFormatPropertiesKHR* toTransform);
 
-void transform_fromhost_VkVideoFormatPropertiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoFormatPropertiesKHR* toTransform);
+void transform_fromhost_VkVideoFormatPropertiesKHR(VkDecoderGlobalState* resourceTracker,
+                                                   VkVideoFormatPropertiesKHR* toTransform);
 
-void transform_tohost_VkVideoPictureResourceKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoPictureResourceKHR* toTransform);
+void transform_tohost_VkVideoPictureResourceKHR(VkDecoderGlobalState* resourceTracker,
+                                                VkVideoPictureResourceKHR* toTransform);
 
-void transform_fromhost_VkVideoPictureResourceKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoPictureResourceKHR* toTransform);
+void transform_fromhost_VkVideoPictureResourceKHR(VkDecoderGlobalState* resourceTracker,
+                                                  VkVideoPictureResourceKHR* toTransform);
 
-void transform_tohost_VkVideoReferenceSlotKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoReferenceSlotKHR* toTransform);
+void transform_tohost_VkVideoReferenceSlotKHR(VkDecoderGlobalState* resourceTracker,
+                                              VkVideoReferenceSlotKHR* toTransform);
 
-void transform_fromhost_VkVideoReferenceSlotKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoReferenceSlotKHR* toTransform);
+void transform_fromhost_VkVideoReferenceSlotKHR(VkDecoderGlobalState* resourceTracker,
+                                                VkVideoReferenceSlotKHR* toTransform);
 
-void transform_tohost_VkVideoGetMemoryPropertiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoGetMemoryPropertiesKHR* toTransform);
+void transform_tohost_VkVideoGetMemoryPropertiesKHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkVideoGetMemoryPropertiesKHR* toTransform);
 
-void transform_fromhost_VkVideoGetMemoryPropertiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoGetMemoryPropertiesKHR* toTransform);
+void transform_fromhost_VkVideoGetMemoryPropertiesKHR(VkDecoderGlobalState* resourceTracker,
+                                                      VkVideoGetMemoryPropertiesKHR* toTransform);
 
-void transform_tohost_VkVideoBindMemoryKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoBindMemoryKHR* toTransform);
+void transform_tohost_VkVideoBindMemoryKHR(VkDecoderGlobalState* resourceTracker,
+                                           VkVideoBindMemoryKHR* toTransform);
 
-void transform_fromhost_VkVideoBindMemoryKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoBindMemoryKHR* toTransform);
+void transform_fromhost_VkVideoBindMemoryKHR(VkDecoderGlobalState* resourceTracker,
+                                             VkVideoBindMemoryKHR* toTransform);
 
-void transform_tohost_VkVideoSessionCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoSessionCreateInfoKHR* toTransform);
+void transform_tohost_VkVideoSessionCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                  VkVideoSessionCreateInfoKHR* toTransform);
 
-void transform_fromhost_VkVideoSessionCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoSessionCreateInfoKHR* toTransform);
+void transform_fromhost_VkVideoSessionCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkVideoSessionCreateInfoKHR* toTransform);
 
 void transform_tohost_VkVideoSessionParametersCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoSessionParametersCreateInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoSessionParametersCreateInfoKHR* toTransform);
 
 void transform_fromhost_VkVideoSessionParametersCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoSessionParametersCreateInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoSessionParametersCreateInfoKHR* toTransform);
 
 void transform_tohost_VkVideoSessionParametersUpdateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoSessionParametersUpdateInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoSessionParametersUpdateInfoKHR* toTransform);
 
 void transform_fromhost_VkVideoSessionParametersUpdateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoSessionParametersUpdateInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoSessionParametersUpdateInfoKHR* toTransform);
 
-void transform_tohost_VkVideoBeginCodingInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoBeginCodingInfoKHR* toTransform);
+void transform_tohost_VkVideoBeginCodingInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                VkVideoBeginCodingInfoKHR* toTransform);
 
-void transform_fromhost_VkVideoBeginCodingInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoBeginCodingInfoKHR* toTransform);
+void transform_fromhost_VkVideoBeginCodingInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                  VkVideoBeginCodingInfoKHR* toTransform);
 
-void transform_tohost_VkVideoEndCodingInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEndCodingInfoKHR* toTransform);
+void transform_tohost_VkVideoEndCodingInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                              VkVideoEndCodingInfoKHR* toTransform);
 
-void transform_fromhost_VkVideoEndCodingInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEndCodingInfoKHR* toTransform);
+void transform_fromhost_VkVideoEndCodingInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                VkVideoEndCodingInfoKHR* toTransform);
 
-void transform_tohost_VkVideoCodingControlInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoCodingControlInfoKHR* toTransform);
+void transform_tohost_VkVideoCodingControlInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                  VkVideoCodingControlInfoKHR* toTransform);
 
-void transform_fromhost_VkVideoCodingControlInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoCodingControlInfoKHR* toTransform);
+void transform_fromhost_VkVideoCodingControlInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkVideoCodingControlInfoKHR* toTransform);
 
 #endif
 #ifdef VK_KHR_video_decode_queue
-void transform_tohost_VkVideoDecodeInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeInfoKHR* toTransform);
+void transform_tohost_VkVideoDecodeInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                           VkVideoDecodeInfoKHR* toTransform);
 
-void transform_fromhost_VkVideoDecodeInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeInfoKHR* toTransform);
+void transform_fromhost_VkVideoDecodeInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                             VkVideoDecodeInfoKHR* toTransform);
 
 #endif
 #ifdef VK_KHR_dynamic_rendering
-void transform_tohost_VkRenderingAttachmentInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkRenderingAttachmentInfoKHR* toTransform);
+void transform_tohost_VkRenderingAttachmentInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                   VkRenderingAttachmentInfoKHR* toTransform);
 
-void transform_fromhost_VkRenderingAttachmentInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkRenderingAttachmentInfoKHR* toTransform);
+void transform_fromhost_VkRenderingAttachmentInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                     VkRenderingAttachmentInfoKHR* toTransform);
 
-void transform_tohost_VkRenderingInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkRenderingInfoKHR* toTransform);
+void transform_tohost_VkRenderingInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                         VkRenderingInfoKHR* toTransform);
 
-void transform_fromhost_VkRenderingInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkRenderingInfoKHR* toTransform);
+void transform_fromhost_VkRenderingInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                           VkRenderingInfoKHR* toTransform);
 
 void transform_tohost_VkPipelineRenderingCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineRenderingCreateInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineRenderingCreateInfoKHR* toTransform);
 
 void transform_fromhost_VkPipelineRenderingCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineRenderingCreateInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineRenderingCreateInfoKHR* toTransform);
 
 void transform_tohost_VkPhysicalDeviceDynamicRenderingFeaturesKHR(
     VkDecoderGlobalState* resourceTracker,
@@ -2272,12 +1757,10 @@
     VkPhysicalDeviceDynamicRenderingFeaturesKHR* toTransform);
 
 void transform_tohost_VkCommandBufferInheritanceRenderingInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkCommandBufferInheritanceRenderingInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkCommandBufferInheritanceRenderingInfoKHR* toTransform);
 
 void transform_fromhost_VkCommandBufferInheritanceRenderingInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkCommandBufferInheritanceRenderingInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkCommandBufferInheritanceRenderingInfoKHR* toTransform);
 
 void transform_tohost_VkRenderingFragmentShadingRateAttachmentInfoKHR(
     VkDecoderGlobalState* resourceTracker,
@@ -2295,107 +1778,142 @@
     VkDecoderGlobalState* resourceTracker,
     VkRenderingFragmentDensityMapAttachmentInfoEXT* toTransform);
 
-void transform_tohost_VkAttachmentSampleCountInfoAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkAttachmentSampleCountInfoAMD* toTransform);
+void transform_tohost_VkAttachmentSampleCountInfoAMD(VkDecoderGlobalState* resourceTracker,
+                                                     VkAttachmentSampleCountInfoAMD* toTransform);
 
-void transform_fromhost_VkAttachmentSampleCountInfoAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkAttachmentSampleCountInfoAMD* toTransform);
+void transform_fromhost_VkAttachmentSampleCountInfoAMD(VkDecoderGlobalState* resourceTracker,
+                                                       VkAttachmentSampleCountInfoAMD* toTransform);
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkAttachmentSampleCountInfoAMD, transform_tohost_VkAttachmentSampleCountInfoNV)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkAttachmentSampleCountInfoAMD,
+                      transform_tohost_VkAttachmentSampleCountInfoNV)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkAttachmentSampleCountInfoAMD, transform_fromhost_VkAttachmentSampleCountInfoNV)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkAttachmentSampleCountInfoAMD,
+                      transform_fromhost_VkAttachmentSampleCountInfoNV)
 
 void transform_tohost_VkMultiviewPerViewAttributesInfoNVX(
-    VkDecoderGlobalState* resourceTracker,
-    VkMultiviewPerViewAttributesInfoNVX* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkMultiviewPerViewAttributesInfoNVX* toTransform);
 
 void transform_fromhost_VkMultiviewPerViewAttributesInfoNVX(
-    VkDecoderGlobalState* resourceTracker,
-    VkMultiviewPerViewAttributesInfoNVX* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkMultiviewPerViewAttributesInfoNVX* toTransform);
 
 #endif
 #ifdef VK_KHR_multiview
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkRenderPassMultiviewCreateInfo, transform_tohost_VkRenderPassMultiviewCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkRenderPassMultiviewCreateInfo,
+                      transform_tohost_VkRenderPassMultiviewCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkRenderPassMultiviewCreateInfo, transform_fromhost_VkRenderPassMultiviewCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkRenderPassMultiviewCreateInfo,
+                      transform_fromhost_VkRenderPassMultiviewCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceMultiviewFeatures, transform_tohost_VkPhysicalDeviceMultiviewFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceMultiviewFeatures,
+                      transform_tohost_VkPhysicalDeviceMultiviewFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceMultiviewFeatures, transform_fromhost_VkPhysicalDeviceMultiviewFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceMultiviewFeatures,
+                      transform_fromhost_VkPhysicalDeviceMultiviewFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceMultiviewProperties, transform_tohost_VkPhysicalDeviceMultiviewPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceMultiviewProperties,
+                      transform_tohost_VkPhysicalDeviceMultiviewPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceMultiviewProperties, transform_fromhost_VkPhysicalDeviceMultiviewPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceMultiviewProperties,
+                      transform_fromhost_VkPhysicalDeviceMultiviewPropertiesKHR)
 
 #endif
 #ifdef VK_KHR_get_physical_device_properties2
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceFeatures2, transform_tohost_VkPhysicalDeviceFeatures2KHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceFeatures2,
+                      transform_tohost_VkPhysicalDeviceFeatures2KHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceFeatures2, transform_fromhost_VkPhysicalDeviceFeatures2KHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceFeatures2,
+                      transform_fromhost_VkPhysicalDeviceFeatures2KHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceProperties2, transform_tohost_VkPhysicalDeviceProperties2KHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceProperties2,
+                      transform_tohost_VkPhysicalDeviceProperties2KHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceProperties2, transform_fromhost_VkPhysicalDeviceProperties2KHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceProperties2,
+                      transform_fromhost_VkPhysicalDeviceProperties2KHR)
 
 DEFINE_ALIAS_FUNCTION(transform_tohost_VkFormatProperties2, transform_tohost_VkFormatProperties2KHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkFormatProperties2, transform_fromhost_VkFormatProperties2KHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkFormatProperties2,
+                      transform_fromhost_VkFormatProperties2KHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkImageFormatProperties2, transform_tohost_VkImageFormatProperties2KHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkImageFormatProperties2,
+                      transform_tohost_VkImageFormatProperties2KHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkImageFormatProperties2, transform_fromhost_VkImageFormatProperties2KHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkImageFormatProperties2,
+                      transform_fromhost_VkImageFormatProperties2KHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceImageFormatInfo2, transform_tohost_VkPhysicalDeviceImageFormatInfo2KHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceImageFormatInfo2,
+                      transform_tohost_VkPhysicalDeviceImageFormatInfo2KHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceImageFormatInfo2, transform_fromhost_VkPhysicalDeviceImageFormatInfo2KHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceImageFormatInfo2,
+                      transform_fromhost_VkPhysicalDeviceImageFormatInfo2KHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkQueueFamilyProperties2, transform_tohost_VkQueueFamilyProperties2KHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkQueueFamilyProperties2,
+                      transform_tohost_VkQueueFamilyProperties2KHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkQueueFamilyProperties2, transform_fromhost_VkQueueFamilyProperties2KHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkQueueFamilyProperties2,
+                      transform_fromhost_VkQueueFamilyProperties2KHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceMemoryProperties2, transform_tohost_VkPhysicalDeviceMemoryProperties2KHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceMemoryProperties2,
+                      transform_tohost_VkPhysicalDeviceMemoryProperties2KHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceMemoryProperties2, transform_fromhost_VkPhysicalDeviceMemoryProperties2KHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceMemoryProperties2,
+                      transform_fromhost_VkPhysicalDeviceMemoryProperties2KHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkSparseImageFormatProperties2, transform_tohost_VkSparseImageFormatProperties2KHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkSparseImageFormatProperties2,
+                      transform_tohost_VkSparseImageFormatProperties2KHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkSparseImageFormatProperties2, transform_fromhost_VkSparseImageFormatProperties2KHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkSparseImageFormatProperties2,
+                      transform_fromhost_VkSparseImageFormatProperties2KHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceSparseImageFormatInfo2, transform_tohost_VkPhysicalDeviceSparseImageFormatInfo2KHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceSparseImageFormatInfo2,
+                      transform_tohost_VkPhysicalDeviceSparseImageFormatInfo2KHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceSparseImageFormatInfo2, transform_fromhost_VkPhysicalDeviceSparseImageFormatInfo2KHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceSparseImageFormatInfo2,
+                      transform_fromhost_VkPhysicalDeviceSparseImageFormatInfo2KHR)
 
 #endif
 #ifdef VK_KHR_device_group
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkMemoryAllocateFlagsInfo, transform_tohost_VkMemoryAllocateFlagsInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkMemoryAllocateFlagsInfo,
+                      transform_tohost_VkMemoryAllocateFlagsInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkMemoryAllocateFlagsInfo, transform_fromhost_VkMemoryAllocateFlagsInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkMemoryAllocateFlagsInfo,
+                      transform_fromhost_VkMemoryAllocateFlagsInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkDeviceGroupRenderPassBeginInfo, transform_tohost_VkDeviceGroupRenderPassBeginInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkDeviceGroupRenderPassBeginInfo,
+                      transform_tohost_VkDeviceGroupRenderPassBeginInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkDeviceGroupRenderPassBeginInfo, transform_fromhost_VkDeviceGroupRenderPassBeginInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkDeviceGroupRenderPassBeginInfo,
+                      transform_fromhost_VkDeviceGroupRenderPassBeginInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkDeviceGroupCommandBufferBeginInfo, transform_tohost_VkDeviceGroupCommandBufferBeginInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkDeviceGroupCommandBufferBeginInfo,
+                      transform_tohost_VkDeviceGroupCommandBufferBeginInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkDeviceGroupCommandBufferBeginInfo, transform_fromhost_VkDeviceGroupCommandBufferBeginInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkDeviceGroupCommandBufferBeginInfo,
+                      transform_fromhost_VkDeviceGroupCommandBufferBeginInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkDeviceGroupSubmitInfo, transform_tohost_VkDeviceGroupSubmitInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkDeviceGroupSubmitInfo,
+                      transform_tohost_VkDeviceGroupSubmitInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkDeviceGroupSubmitInfo, transform_fromhost_VkDeviceGroupSubmitInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkDeviceGroupSubmitInfo,
+                      transform_fromhost_VkDeviceGroupSubmitInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkDeviceGroupBindSparseInfo, transform_tohost_VkDeviceGroupBindSparseInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkDeviceGroupBindSparseInfo,
+                      transform_tohost_VkDeviceGroupBindSparseInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkDeviceGroupBindSparseInfo, transform_fromhost_VkDeviceGroupBindSparseInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkDeviceGroupBindSparseInfo,
+                      transform_fromhost_VkDeviceGroupBindSparseInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkBindBufferMemoryDeviceGroupInfo, transform_tohost_VkBindBufferMemoryDeviceGroupInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkBindBufferMemoryDeviceGroupInfo,
+                      transform_tohost_VkBindBufferMemoryDeviceGroupInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkBindBufferMemoryDeviceGroupInfo, transform_fromhost_VkBindBufferMemoryDeviceGroupInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkBindBufferMemoryDeviceGroupInfo,
+                      transform_fromhost_VkBindBufferMemoryDeviceGroupInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkBindImageMemoryDeviceGroupInfo, transform_tohost_VkBindImageMemoryDeviceGroupInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkBindImageMemoryDeviceGroupInfo,
+                      transform_tohost_VkBindImageMemoryDeviceGroupInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkBindImageMemoryDeviceGroupInfo, transform_fromhost_VkBindImageMemoryDeviceGroupInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkBindImageMemoryDeviceGroupInfo,
+                      transform_fromhost_VkBindImageMemoryDeviceGroupInfoKHR)
 
 #endif
 #ifdef VK_KHR_shader_draw_parameters
@@ -2403,191 +1921,191 @@
 #ifdef VK_KHR_maintenance1
 #endif
 #ifdef VK_KHR_device_group_creation
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceGroupProperties, transform_tohost_VkPhysicalDeviceGroupPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceGroupProperties,
+                      transform_tohost_VkPhysicalDeviceGroupPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceGroupProperties, transform_fromhost_VkPhysicalDeviceGroupPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceGroupProperties,
+                      transform_fromhost_VkPhysicalDeviceGroupPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkDeviceGroupDeviceCreateInfo, transform_tohost_VkDeviceGroupDeviceCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkDeviceGroupDeviceCreateInfo,
+                      transform_tohost_VkDeviceGroupDeviceCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkDeviceGroupDeviceCreateInfo, transform_fromhost_VkDeviceGroupDeviceCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkDeviceGroupDeviceCreateInfo,
+                      transform_fromhost_VkDeviceGroupDeviceCreateInfoKHR)
 
 #endif
 #ifdef VK_KHR_external_memory_capabilities
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkExternalMemoryProperties, transform_tohost_VkExternalMemoryPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkExternalMemoryProperties,
+                      transform_tohost_VkExternalMemoryPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkExternalMemoryProperties, transform_fromhost_VkExternalMemoryPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkExternalMemoryProperties,
+                      transform_fromhost_VkExternalMemoryPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceExternalImageFormatInfo, transform_tohost_VkPhysicalDeviceExternalImageFormatInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceExternalImageFormatInfo,
+                      transform_tohost_VkPhysicalDeviceExternalImageFormatInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceExternalImageFormatInfo, transform_fromhost_VkPhysicalDeviceExternalImageFormatInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceExternalImageFormatInfo,
+                      transform_fromhost_VkPhysicalDeviceExternalImageFormatInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkExternalImageFormatProperties, transform_tohost_VkExternalImageFormatPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkExternalImageFormatProperties,
+                      transform_tohost_VkExternalImageFormatPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkExternalImageFormatProperties, transform_fromhost_VkExternalImageFormatPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkExternalImageFormatProperties,
+                      transform_fromhost_VkExternalImageFormatPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceExternalBufferInfo, transform_tohost_VkPhysicalDeviceExternalBufferInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceExternalBufferInfo,
+                      transform_tohost_VkPhysicalDeviceExternalBufferInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceExternalBufferInfo, transform_fromhost_VkPhysicalDeviceExternalBufferInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceExternalBufferInfo,
+                      transform_fromhost_VkPhysicalDeviceExternalBufferInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkExternalBufferProperties, transform_tohost_VkExternalBufferPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkExternalBufferProperties,
+                      transform_tohost_VkExternalBufferPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkExternalBufferProperties, transform_fromhost_VkExternalBufferPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkExternalBufferProperties,
+                      transform_fromhost_VkExternalBufferPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceIDProperties, transform_tohost_VkPhysicalDeviceIDPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceIDProperties,
+                      transform_tohost_VkPhysicalDeviceIDPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceIDProperties, transform_fromhost_VkPhysicalDeviceIDPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceIDProperties,
+                      transform_fromhost_VkPhysicalDeviceIDPropertiesKHR)
 
 #endif
 #ifdef VK_KHR_external_memory
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkExternalMemoryImageCreateInfo, transform_tohost_VkExternalMemoryImageCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkExternalMemoryImageCreateInfo,
+                      transform_tohost_VkExternalMemoryImageCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkExternalMemoryImageCreateInfo, transform_fromhost_VkExternalMemoryImageCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkExternalMemoryImageCreateInfo,
+                      transform_fromhost_VkExternalMemoryImageCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkExternalMemoryBufferCreateInfo, transform_tohost_VkExternalMemoryBufferCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkExternalMemoryBufferCreateInfo,
+                      transform_tohost_VkExternalMemoryBufferCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkExternalMemoryBufferCreateInfo, transform_fromhost_VkExternalMemoryBufferCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkExternalMemoryBufferCreateInfo,
+                      transform_fromhost_VkExternalMemoryBufferCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkExportMemoryAllocateInfo, transform_tohost_VkExportMemoryAllocateInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkExportMemoryAllocateInfo,
+                      transform_tohost_VkExportMemoryAllocateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkExportMemoryAllocateInfo, transform_fromhost_VkExportMemoryAllocateInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkExportMemoryAllocateInfo,
+                      transform_fromhost_VkExportMemoryAllocateInfoKHR)
 
 #endif
 #ifdef VK_KHR_external_memory_win32
 void transform_tohost_VkImportMemoryWin32HandleInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportMemoryWin32HandleInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkImportMemoryWin32HandleInfoKHR* toTransform);
 
 void transform_fromhost_VkImportMemoryWin32HandleInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportMemoryWin32HandleInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkImportMemoryWin32HandleInfoKHR* toTransform);
 
 void transform_tohost_VkExportMemoryWin32HandleInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkExportMemoryWin32HandleInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkExportMemoryWin32HandleInfoKHR* toTransform);
 
 void transform_fromhost_VkExportMemoryWin32HandleInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkExportMemoryWin32HandleInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkExportMemoryWin32HandleInfoKHR* toTransform);
 
 void transform_tohost_VkMemoryWin32HandlePropertiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryWin32HandlePropertiesKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkMemoryWin32HandlePropertiesKHR* toTransform);
 
 void transform_fromhost_VkMemoryWin32HandlePropertiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryWin32HandlePropertiesKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkMemoryWin32HandlePropertiesKHR* toTransform);
 
-void transform_tohost_VkMemoryGetWin32HandleInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryGetWin32HandleInfoKHR* toTransform);
+void transform_tohost_VkMemoryGetWin32HandleInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkMemoryGetWin32HandleInfoKHR* toTransform);
 
-void transform_fromhost_VkMemoryGetWin32HandleInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryGetWin32HandleInfoKHR* toTransform);
+void transform_fromhost_VkMemoryGetWin32HandleInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                      VkMemoryGetWin32HandleInfoKHR* toTransform);
 
 #endif
 #ifdef VK_KHR_external_memory_fd
-void transform_tohost_VkImportMemoryFdInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportMemoryFdInfoKHR* toTransform);
+void transform_tohost_VkImportMemoryFdInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                              VkImportMemoryFdInfoKHR* toTransform);
 
-void transform_fromhost_VkImportMemoryFdInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportMemoryFdInfoKHR* toTransform);
+void transform_fromhost_VkImportMemoryFdInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                VkImportMemoryFdInfoKHR* toTransform);
 
-void transform_tohost_VkMemoryFdPropertiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryFdPropertiesKHR* toTransform);
+void transform_tohost_VkMemoryFdPropertiesKHR(VkDecoderGlobalState* resourceTracker,
+                                              VkMemoryFdPropertiesKHR* toTransform);
 
-void transform_fromhost_VkMemoryFdPropertiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryFdPropertiesKHR* toTransform);
+void transform_fromhost_VkMemoryFdPropertiesKHR(VkDecoderGlobalState* resourceTracker,
+                                                VkMemoryFdPropertiesKHR* toTransform);
 
-void transform_tohost_VkMemoryGetFdInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryGetFdInfoKHR* toTransform);
+void transform_tohost_VkMemoryGetFdInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                           VkMemoryGetFdInfoKHR* toTransform);
 
-void transform_fromhost_VkMemoryGetFdInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryGetFdInfoKHR* toTransform);
+void transform_fromhost_VkMemoryGetFdInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                             VkMemoryGetFdInfoKHR* toTransform);
 
 #endif
 #ifdef VK_KHR_win32_keyed_mutex
 void transform_tohost_VkWin32KeyedMutexAcquireReleaseInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkWin32KeyedMutexAcquireReleaseInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkWin32KeyedMutexAcquireReleaseInfoKHR* toTransform);
 
 void transform_fromhost_VkWin32KeyedMutexAcquireReleaseInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkWin32KeyedMutexAcquireReleaseInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkWin32KeyedMutexAcquireReleaseInfoKHR* toTransform);
 
 #endif
 #ifdef VK_KHR_external_semaphore_capabilities
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceExternalSemaphoreInfo, transform_tohost_VkPhysicalDeviceExternalSemaphoreInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceExternalSemaphoreInfo,
+                      transform_tohost_VkPhysicalDeviceExternalSemaphoreInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceExternalSemaphoreInfo, transform_fromhost_VkPhysicalDeviceExternalSemaphoreInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceExternalSemaphoreInfo,
+                      transform_fromhost_VkPhysicalDeviceExternalSemaphoreInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkExternalSemaphoreProperties, transform_tohost_VkExternalSemaphorePropertiesKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkExternalSemaphoreProperties,
+                      transform_tohost_VkExternalSemaphorePropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkExternalSemaphoreProperties, transform_fromhost_VkExternalSemaphorePropertiesKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkExternalSemaphoreProperties,
+                      transform_fromhost_VkExternalSemaphorePropertiesKHR)
 
 #endif
 #ifdef VK_KHR_external_semaphore
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkExportSemaphoreCreateInfo, transform_tohost_VkExportSemaphoreCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkExportSemaphoreCreateInfo,
+                      transform_tohost_VkExportSemaphoreCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkExportSemaphoreCreateInfo, transform_fromhost_VkExportSemaphoreCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkExportSemaphoreCreateInfo,
+                      transform_fromhost_VkExportSemaphoreCreateInfoKHR)
 
 #endif
 #ifdef VK_KHR_external_semaphore_win32
 void transform_tohost_VkImportSemaphoreWin32HandleInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportSemaphoreWin32HandleInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkImportSemaphoreWin32HandleInfoKHR* toTransform);
 
 void transform_fromhost_VkImportSemaphoreWin32HandleInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportSemaphoreWin32HandleInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkImportSemaphoreWin32HandleInfoKHR* toTransform);
 
 void transform_tohost_VkExportSemaphoreWin32HandleInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkExportSemaphoreWin32HandleInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkExportSemaphoreWin32HandleInfoKHR* toTransform);
 
 void transform_fromhost_VkExportSemaphoreWin32HandleInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkExportSemaphoreWin32HandleInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkExportSemaphoreWin32HandleInfoKHR* toTransform);
 
-void transform_tohost_VkD3D12FenceSubmitInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkD3D12FenceSubmitInfoKHR* toTransform);
+void transform_tohost_VkD3D12FenceSubmitInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                VkD3D12FenceSubmitInfoKHR* toTransform);
 
-void transform_fromhost_VkD3D12FenceSubmitInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkD3D12FenceSubmitInfoKHR* toTransform);
+void transform_fromhost_VkD3D12FenceSubmitInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                  VkD3D12FenceSubmitInfoKHR* toTransform);
 
 void transform_tohost_VkSemaphoreGetWin32HandleInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSemaphoreGetWin32HandleInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkSemaphoreGetWin32HandleInfoKHR* toTransform);
 
 void transform_fromhost_VkSemaphoreGetWin32HandleInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSemaphoreGetWin32HandleInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkSemaphoreGetWin32HandleInfoKHR* toTransform);
 
 #endif
 #ifdef VK_KHR_external_semaphore_fd
-void transform_tohost_VkImportSemaphoreFdInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportSemaphoreFdInfoKHR* toTransform);
+void transform_tohost_VkImportSemaphoreFdInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                 VkImportSemaphoreFdInfoKHR* toTransform);
 
-void transform_fromhost_VkImportSemaphoreFdInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportSemaphoreFdInfoKHR* toTransform);
+void transform_fromhost_VkImportSemaphoreFdInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                   VkImportSemaphoreFdInfoKHR* toTransform);
 
-void transform_tohost_VkSemaphoreGetFdInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSemaphoreGetFdInfoKHR* toTransform);
+void transform_tohost_VkSemaphoreGetFdInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                              VkSemaphoreGetFdInfoKHR* toTransform);
 
-void transform_fromhost_VkSemaphoreGetFdInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSemaphoreGetFdInfoKHR* toTransform);
+void transform_fromhost_VkSemaphoreGetFdInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                VkSemaphoreGetFdInfoKHR* toTransform);
 
 #endif
 #ifdef VK_KHR_push_descriptor
@@ -2601,99 +2119,122 @@
 
 #endif
 #ifdef VK_KHR_shader_float16_int8
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceShaderFloat16Int8Features, transform_tohost_VkPhysicalDeviceShaderFloat16Int8FeaturesKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceShaderFloat16Int8Features,
+                      transform_tohost_VkPhysicalDeviceShaderFloat16Int8FeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceShaderFloat16Int8Features, transform_fromhost_VkPhysicalDeviceShaderFloat16Int8FeaturesKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceShaderFloat16Int8Features,
+                      transform_fromhost_VkPhysicalDeviceShaderFloat16Int8FeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceShaderFloat16Int8Features, transform_tohost_VkPhysicalDeviceFloat16Int8FeaturesKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceShaderFloat16Int8Features,
+                      transform_tohost_VkPhysicalDeviceFloat16Int8FeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceShaderFloat16Int8Features, transform_fromhost_VkPhysicalDeviceFloat16Int8FeaturesKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceShaderFloat16Int8Features,
+                      transform_fromhost_VkPhysicalDeviceFloat16Int8FeaturesKHR)
 
 #endif
 #ifdef VK_KHR_16bit_storage
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDevice16BitStorageFeatures, transform_tohost_VkPhysicalDevice16BitStorageFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDevice16BitStorageFeatures,
+                      transform_tohost_VkPhysicalDevice16BitStorageFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDevice16BitStorageFeatures, transform_fromhost_VkPhysicalDevice16BitStorageFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDevice16BitStorageFeatures,
+                      transform_fromhost_VkPhysicalDevice16BitStorageFeaturesKHR)
 
 #endif
 #ifdef VK_KHR_incremental_present
-void transform_tohost_VkRectLayerKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkRectLayerKHR* toTransform);
+void transform_tohost_VkRectLayerKHR(VkDecoderGlobalState* resourceTracker,
+                                     VkRectLayerKHR* toTransform);
 
-void transform_fromhost_VkRectLayerKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkRectLayerKHR* toTransform);
+void transform_fromhost_VkRectLayerKHR(VkDecoderGlobalState* resourceTracker,
+                                       VkRectLayerKHR* toTransform);
 
-void transform_tohost_VkPresentRegionKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPresentRegionKHR* toTransform);
+void transform_tohost_VkPresentRegionKHR(VkDecoderGlobalState* resourceTracker,
+                                         VkPresentRegionKHR* toTransform);
 
-void transform_fromhost_VkPresentRegionKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPresentRegionKHR* toTransform);
+void transform_fromhost_VkPresentRegionKHR(VkDecoderGlobalState* resourceTracker,
+                                           VkPresentRegionKHR* toTransform);
 
-void transform_tohost_VkPresentRegionsKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPresentRegionsKHR* toTransform);
+void transform_tohost_VkPresentRegionsKHR(VkDecoderGlobalState* resourceTracker,
+                                          VkPresentRegionsKHR* toTransform);
 
-void transform_fromhost_VkPresentRegionsKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPresentRegionsKHR* toTransform);
+void transform_fromhost_VkPresentRegionsKHR(VkDecoderGlobalState* resourceTracker,
+                                            VkPresentRegionsKHR* toTransform);
 
 #endif
 #ifdef VK_KHR_descriptor_update_template
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkDescriptorUpdateTemplateEntry, transform_tohost_VkDescriptorUpdateTemplateEntryKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkDescriptorUpdateTemplateEntry,
+                      transform_tohost_VkDescriptorUpdateTemplateEntryKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkDescriptorUpdateTemplateEntry, transform_fromhost_VkDescriptorUpdateTemplateEntryKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkDescriptorUpdateTemplateEntry,
+                      transform_fromhost_VkDescriptorUpdateTemplateEntryKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkDescriptorUpdateTemplateCreateInfo, transform_tohost_VkDescriptorUpdateTemplateCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkDescriptorUpdateTemplateCreateInfo,
+                      transform_tohost_VkDescriptorUpdateTemplateCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkDescriptorUpdateTemplateCreateInfo, transform_fromhost_VkDescriptorUpdateTemplateCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkDescriptorUpdateTemplateCreateInfo,
+                      transform_fromhost_VkDescriptorUpdateTemplateCreateInfoKHR)
 
 #endif
 #ifdef VK_KHR_imageless_framebuffer
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceImagelessFramebufferFeatures, transform_tohost_VkPhysicalDeviceImagelessFramebufferFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceImagelessFramebufferFeatures,
+                      transform_tohost_VkPhysicalDeviceImagelessFramebufferFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceImagelessFramebufferFeatures, transform_fromhost_VkPhysicalDeviceImagelessFramebufferFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceImagelessFramebufferFeatures,
+                      transform_fromhost_VkPhysicalDeviceImagelessFramebufferFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkFramebufferAttachmentsCreateInfo, transform_tohost_VkFramebufferAttachmentsCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkFramebufferAttachmentsCreateInfo,
+                      transform_tohost_VkFramebufferAttachmentsCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkFramebufferAttachmentsCreateInfo, transform_fromhost_VkFramebufferAttachmentsCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkFramebufferAttachmentsCreateInfo,
+                      transform_fromhost_VkFramebufferAttachmentsCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkFramebufferAttachmentImageInfo, transform_tohost_VkFramebufferAttachmentImageInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkFramebufferAttachmentImageInfo,
+                      transform_tohost_VkFramebufferAttachmentImageInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkFramebufferAttachmentImageInfo, transform_fromhost_VkFramebufferAttachmentImageInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkFramebufferAttachmentImageInfo,
+                      transform_fromhost_VkFramebufferAttachmentImageInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkRenderPassAttachmentBeginInfo, transform_tohost_VkRenderPassAttachmentBeginInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkRenderPassAttachmentBeginInfo,
+                      transform_tohost_VkRenderPassAttachmentBeginInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkRenderPassAttachmentBeginInfo, transform_fromhost_VkRenderPassAttachmentBeginInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkRenderPassAttachmentBeginInfo,
+                      transform_fromhost_VkRenderPassAttachmentBeginInfoKHR)
 
 #endif
 #ifdef VK_KHR_create_renderpass2
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkRenderPassCreateInfo2, transform_tohost_VkRenderPassCreateInfo2KHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkRenderPassCreateInfo2,
+                      transform_tohost_VkRenderPassCreateInfo2KHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkRenderPassCreateInfo2, transform_fromhost_VkRenderPassCreateInfo2KHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkRenderPassCreateInfo2,
+                      transform_fromhost_VkRenderPassCreateInfo2KHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkAttachmentDescription2, transform_tohost_VkAttachmentDescription2KHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkAttachmentDescription2,
+                      transform_tohost_VkAttachmentDescription2KHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkAttachmentDescription2, transform_fromhost_VkAttachmentDescription2KHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkAttachmentDescription2,
+                      transform_fromhost_VkAttachmentDescription2KHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkAttachmentReference2, transform_tohost_VkAttachmentReference2KHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkAttachmentReference2,
+                      transform_tohost_VkAttachmentReference2KHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkAttachmentReference2, transform_fromhost_VkAttachmentReference2KHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkAttachmentReference2,
+                      transform_fromhost_VkAttachmentReference2KHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkSubpassDescription2, transform_tohost_VkSubpassDescription2KHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkSubpassDescription2,
+                      transform_tohost_VkSubpassDescription2KHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkSubpassDescription2, transform_fromhost_VkSubpassDescription2KHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkSubpassDescription2,
+                      transform_fromhost_VkSubpassDescription2KHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkSubpassDependency2, transform_tohost_VkSubpassDependency2KHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkSubpassDependency2,
+                      transform_tohost_VkSubpassDependency2KHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkSubpassDependency2, transform_fromhost_VkSubpassDependency2KHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkSubpassDependency2,
+                      transform_fromhost_VkSubpassDependency2KHR)
 
 DEFINE_ALIAS_FUNCTION(transform_tohost_VkSubpassBeginInfo, transform_tohost_VkSubpassBeginInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkSubpassBeginInfo, transform_fromhost_VkSubpassBeginInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkSubpassBeginInfo,
+                      transform_fromhost_VkSubpassBeginInfoKHR)
 
 DEFINE_ALIAS_FUNCTION(transform_tohost_VkSubpassEndInfo, transform_tohost_VkSubpassEndInfoKHR)
 
@@ -2702,72 +2243,66 @@
 #endif
 #ifdef VK_KHR_shared_presentable_image
 void transform_tohost_VkSharedPresentSurfaceCapabilitiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSharedPresentSurfaceCapabilitiesKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkSharedPresentSurfaceCapabilitiesKHR* toTransform);
 
 void transform_fromhost_VkSharedPresentSurfaceCapabilitiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSharedPresentSurfaceCapabilitiesKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkSharedPresentSurfaceCapabilitiesKHR* toTransform);
 
 #endif
 #ifdef VK_KHR_external_fence_capabilities
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceExternalFenceInfo, transform_tohost_VkPhysicalDeviceExternalFenceInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceExternalFenceInfo,
+                      transform_tohost_VkPhysicalDeviceExternalFenceInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceExternalFenceInfo, transform_fromhost_VkPhysicalDeviceExternalFenceInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceExternalFenceInfo,
+                      transform_fromhost_VkPhysicalDeviceExternalFenceInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkExternalFenceProperties, transform_tohost_VkExternalFencePropertiesKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkExternalFenceProperties,
+                      transform_tohost_VkExternalFencePropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkExternalFenceProperties, transform_fromhost_VkExternalFencePropertiesKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkExternalFenceProperties,
+                      transform_fromhost_VkExternalFencePropertiesKHR)
 
 #endif
 #ifdef VK_KHR_external_fence
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkExportFenceCreateInfo, transform_tohost_VkExportFenceCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkExportFenceCreateInfo,
+                      transform_tohost_VkExportFenceCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkExportFenceCreateInfo, transform_fromhost_VkExportFenceCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkExportFenceCreateInfo,
+                      transform_fromhost_VkExportFenceCreateInfoKHR)
 
 #endif
 #ifdef VK_KHR_external_fence_win32
-void transform_tohost_VkImportFenceWin32HandleInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportFenceWin32HandleInfoKHR* toTransform);
+void transform_tohost_VkImportFenceWin32HandleInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                      VkImportFenceWin32HandleInfoKHR* toTransform);
 
 void transform_fromhost_VkImportFenceWin32HandleInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportFenceWin32HandleInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkImportFenceWin32HandleInfoKHR* toTransform);
 
-void transform_tohost_VkExportFenceWin32HandleInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkExportFenceWin32HandleInfoKHR* toTransform);
+void transform_tohost_VkExportFenceWin32HandleInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                      VkExportFenceWin32HandleInfoKHR* toTransform);
 
 void transform_fromhost_VkExportFenceWin32HandleInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkExportFenceWin32HandleInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkExportFenceWin32HandleInfoKHR* toTransform);
 
-void transform_tohost_VkFenceGetWin32HandleInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkFenceGetWin32HandleInfoKHR* toTransform);
+void transform_tohost_VkFenceGetWin32HandleInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                   VkFenceGetWin32HandleInfoKHR* toTransform);
 
-void transform_fromhost_VkFenceGetWin32HandleInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkFenceGetWin32HandleInfoKHR* toTransform);
+void transform_fromhost_VkFenceGetWin32HandleInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                     VkFenceGetWin32HandleInfoKHR* toTransform);
 
 #endif
 #ifdef VK_KHR_external_fence_fd
-void transform_tohost_VkImportFenceFdInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportFenceFdInfoKHR* toTransform);
+void transform_tohost_VkImportFenceFdInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                             VkImportFenceFdInfoKHR* toTransform);
 
-void transform_fromhost_VkImportFenceFdInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportFenceFdInfoKHR* toTransform);
+void transform_fromhost_VkImportFenceFdInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                               VkImportFenceFdInfoKHR* toTransform);
 
-void transform_tohost_VkFenceGetFdInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkFenceGetFdInfoKHR* toTransform);
+void transform_tohost_VkFenceGetFdInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                          VkFenceGetFdInfoKHR* toTransform);
 
-void transform_fromhost_VkFenceGetFdInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkFenceGetFdInfoKHR* toTransform);
+void transform_fromhost_VkFenceGetFdInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                            VkFenceGetFdInfoKHR* toTransform);
 
 #endif
 #ifdef VK_KHR_performance_query
@@ -2787,163 +2322,153 @@
     VkDecoderGlobalState* resourceTracker,
     VkPhysicalDevicePerformanceQueryPropertiesKHR* toTransform);
 
-void transform_tohost_VkPerformanceCounterKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceCounterKHR* toTransform);
+void transform_tohost_VkPerformanceCounterKHR(VkDecoderGlobalState* resourceTracker,
+                                              VkPerformanceCounterKHR* toTransform);
 
-void transform_fromhost_VkPerformanceCounterKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceCounterKHR* toTransform);
+void transform_fromhost_VkPerformanceCounterKHR(VkDecoderGlobalState* resourceTracker,
+                                                VkPerformanceCounterKHR* toTransform);
 
 void transform_tohost_VkPerformanceCounterDescriptionKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceCounterDescriptionKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPerformanceCounterDescriptionKHR* toTransform);
 
 void transform_fromhost_VkPerformanceCounterDescriptionKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceCounterDescriptionKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPerformanceCounterDescriptionKHR* toTransform);
 
 void transform_tohost_VkQueryPoolPerformanceCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkQueryPoolPerformanceCreateInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkQueryPoolPerformanceCreateInfoKHR* toTransform);
 
 void transform_fromhost_VkQueryPoolPerformanceCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkQueryPoolPerformanceCreateInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkQueryPoolPerformanceCreateInfoKHR* toTransform);
 
-void transform_tohost_VkPerformanceCounterResultKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceCounterResultKHR* toTransform);
+void transform_tohost_VkPerformanceCounterResultKHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkPerformanceCounterResultKHR* toTransform);
 
-void transform_fromhost_VkPerformanceCounterResultKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceCounterResultKHR* toTransform);
+void transform_fromhost_VkPerformanceCounterResultKHR(VkDecoderGlobalState* resourceTracker,
+                                                      VkPerformanceCounterResultKHR* toTransform);
 
-void transform_tohost_VkAcquireProfilingLockInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAcquireProfilingLockInfoKHR* toTransform);
+void transform_tohost_VkAcquireProfilingLockInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkAcquireProfilingLockInfoKHR* toTransform);
 
-void transform_fromhost_VkAcquireProfilingLockInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAcquireProfilingLockInfoKHR* toTransform);
+void transform_fromhost_VkAcquireProfilingLockInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                      VkAcquireProfilingLockInfoKHR* toTransform);
 
-void transform_tohost_VkPerformanceQuerySubmitInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceQuerySubmitInfoKHR* toTransform);
+void transform_tohost_VkPerformanceQuerySubmitInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                      VkPerformanceQuerySubmitInfoKHR* toTransform);
 
 void transform_fromhost_VkPerformanceQuerySubmitInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceQuerySubmitInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPerformanceQuerySubmitInfoKHR* toTransform);
 
 #endif
 #ifdef VK_KHR_maintenance2
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDevicePointClippingProperties, transform_tohost_VkPhysicalDevicePointClippingPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDevicePointClippingProperties,
+                      transform_tohost_VkPhysicalDevicePointClippingPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDevicePointClippingProperties, transform_fromhost_VkPhysicalDevicePointClippingPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDevicePointClippingProperties,
+                      transform_fromhost_VkPhysicalDevicePointClippingPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkRenderPassInputAttachmentAspectCreateInfo, transform_tohost_VkRenderPassInputAttachmentAspectCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkRenderPassInputAttachmentAspectCreateInfo,
+                      transform_tohost_VkRenderPassInputAttachmentAspectCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkRenderPassInputAttachmentAspectCreateInfo, transform_fromhost_VkRenderPassInputAttachmentAspectCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkRenderPassInputAttachmentAspectCreateInfo,
+                      transform_fromhost_VkRenderPassInputAttachmentAspectCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkInputAttachmentAspectReference, transform_tohost_VkInputAttachmentAspectReferenceKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkInputAttachmentAspectReference,
+                      transform_tohost_VkInputAttachmentAspectReferenceKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkInputAttachmentAspectReference, transform_fromhost_VkInputAttachmentAspectReferenceKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkInputAttachmentAspectReference,
+                      transform_fromhost_VkInputAttachmentAspectReferenceKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkImageViewUsageCreateInfo, transform_tohost_VkImageViewUsageCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkImageViewUsageCreateInfo,
+                      transform_tohost_VkImageViewUsageCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkImageViewUsageCreateInfo, transform_fromhost_VkImageViewUsageCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkImageViewUsageCreateInfo,
+                      transform_fromhost_VkImageViewUsageCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPipelineTessellationDomainOriginStateCreateInfo, transform_tohost_VkPipelineTessellationDomainOriginStateCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPipelineTessellationDomainOriginStateCreateInfo,
+                      transform_tohost_VkPipelineTessellationDomainOriginStateCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPipelineTessellationDomainOriginStateCreateInfo, transform_fromhost_VkPipelineTessellationDomainOriginStateCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPipelineTessellationDomainOriginStateCreateInfo,
+                      transform_fromhost_VkPipelineTessellationDomainOriginStateCreateInfoKHR)
 
 #endif
 #ifdef VK_KHR_get_surface_capabilities2
-void transform_tohost_VkPhysicalDeviceSurfaceInfo2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceSurfaceInfo2KHR* toTransform);
+void transform_tohost_VkPhysicalDeviceSurfaceInfo2KHR(VkDecoderGlobalState* resourceTracker,
+                                                      VkPhysicalDeviceSurfaceInfo2KHR* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceSurfaceInfo2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceSurfaceInfo2KHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceSurfaceInfo2KHR* toTransform);
 
-void transform_tohost_VkSurfaceCapabilities2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSurfaceCapabilities2KHR* toTransform);
+void transform_tohost_VkSurfaceCapabilities2KHR(VkDecoderGlobalState* resourceTracker,
+                                                VkSurfaceCapabilities2KHR* toTransform);
 
-void transform_fromhost_VkSurfaceCapabilities2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSurfaceCapabilities2KHR* toTransform);
+void transform_fromhost_VkSurfaceCapabilities2KHR(VkDecoderGlobalState* resourceTracker,
+                                                  VkSurfaceCapabilities2KHR* toTransform);
 
-void transform_tohost_VkSurfaceFormat2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSurfaceFormat2KHR* toTransform);
+void transform_tohost_VkSurfaceFormat2KHR(VkDecoderGlobalState* resourceTracker,
+                                          VkSurfaceFormat2KHR* toTransform);
 
-void transform_fromhost_VkSurfaceFormat2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSurfaceFormat2KHR* toTransform);
+void transform_fromhost_VkSurfaceFormat2KHR(VkDecoderGlobalState* resourceTracker,
+                                            VkSurfaceFormat2KHR* toTransform);
 
 #endif
 #ifdef VK_KHR_variable_pointers
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceVariablePointersFeatures, transform_tohost_VkPhysicalDeviceVariablePointerFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceVariablePointersFeatures,
+                      transform_tohost_VkPhysicalDeviceVariablePointerFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceVariablePointersFeatures, transform_fromhost_VkPhysicalDeviceVariablePointerFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceVariablePointersFeatures,
+                      transform_fromhost_VkPhysicalDeviceVariablePointerFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceVariablePointersFeatures, transform_tohost_VkPhysicalDeviceVariablePointersFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceVariablePointersFeatures,
+                      transform_tohost_VkPhysicalDeviceVariablePointersFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceVariablePointersFeatures, transform_fromhost_VkPhysicalDeviceVariablePointersFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceVariablePointersFeatures,
+                      transform_fromhost_VkPhysicalDeviceVariablePointersFeaturesKHR)
 
 #endif
 #ifdef VK_KHR_get_display_properties2
-void transform_tohost_VkDisplayProperties2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayProperties2KHR* toTransform);
+void transform_tohost_VkDisplayProperties2KHR(VkDecoderGlobalState* resourceTracker,
+                                              VkDisplayProperties2KHR* toTransform);
 
-void transform_fromhost_VkDisplayProperties2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayProperties2KHR* toTransform);
+void transform_fromhost_VkDisplayProperties2KHR(VkDecoderGlobalState* resourceTracker,
+                                                VkDisplayProperties2KHR* toTransform);
 
-void transform_tohost_VkDisplayPlaneProperties2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayPlaneProperties2KHR* toTransform);
+void transform_tohost_VkDisplayPlaneProperties2KHR(VkDecoderGlobalState* resourceTracker,
+                                                   VkDisplayPlaneProperties2KHR* toTransform);
 
-void transform_fromhost_VkDisplayPlaneProperties2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayPlaneProperties2KHR* toTransform);
+void transform_fromhost_VkDisplayPlaneProperties2KHR(VkDecoderGlobalState* resourceTracker,
+                                                     VkDisplayPlaneProperties2KHR* toTransform);
 
-void transform_tohost_VkDisplayModeProperties2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayModeProperties2KHR* toTransform);
+void transform_tohost_VkDisplayModeProperties2KHR(VkDecoderGlobalState* resourceTracker,
+                                                  VkDisplayModeProperties2KHR* toTransform);
 
-void transform_fromhost_VkDisplayModeProperties2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayModeProperties2KHR* toTransform);
+void transform_fromhost_VkDisplayModeProperties2KHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkDisplayModeProperties2KHR* toTransform);
 
-void transform_tohost_VkDisplayPlaneInfo2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayPlaneInfo2KHR* toTransform);
+void transform_tohost_VkDisplayPlaneInfo2KHR(VkDecoderGlobalState* resourceTracker,
+                                             VkDisplayPlaneInfo2KHR* toTransform);
 
-void transform_fromhost_VkDisplayPlaneInfo2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayPlaneInfo2KHR* toTransform);
+void transform_fromhost_VkDisplayPlaneInfo2KHR(VkDecoderGlobalState* resourceTracker,
+                                               VkDisplayPlaneInfo2KHR* toTransform);
 
-void transform_tohost_VkDisplayPlaneCapabilities2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayPlaneCapabilities2KHR* toTransform);
+void transform_tohost_VkDisplayPlaneCapabilities2KHR(VkDecoderGlobalState* resourceTracker,
+                                                     VkDisplayPlaneCapabilities2KHR* toTransform);
 
-void transform_fromhost_VkDisplayPlaneCapabilities2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayPlaneCapabilities2KHR* toTransform);
+void transform_fromhost_VkDisplayPlaneCapabilities2KHR(VkDecoderGlobalState* resourceTracker,
+                                                       VkDisplayPlaneCapabilities2KHR* toTransform);
 
 #endif
 #ifdef VK_KHR_dedicated_allocation
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkMemoryDedicatedRequirements, transform_tohost_VkMemoryDedicatedRequirementsKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkMemoryDedicatedRequirements,
+                      transform_tohost_VkMemoryDedicatedRequirementsKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkMemoryDedicatedRequirements, transform_fromhost_VkMemoryDedicatedRequirementsKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkMemoryDedicatedRequirements,
+                      transform_fromhost_VkMemoryDedicatedRequirementsKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkMemoryDedicatedAllocateInfo, transform_tohost_VkMemoryDedicatedAllocateInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkMemoryDedicatedAllocateInfo,
+                      transform_tohost_VkMemoryDedicatedAllocateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkMemoryDedicatedAllocateInfo, transform_fromhost_VkMemoryDedicatedAllocateInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkMemoryDedicatedAllocateInfo,
+                      transform_fromhost_VkMemoryDedicatedAllocateInfoKHR)
 
 #endif
 #ifdef VK_KHR_storage_buffer_storage_class
@@ -2951,67 +2476,95 @@
 #ifdef VK_KHR_relaxed_block_layout
 #endif
 #ifdef VK_KHR_get_memory_requirements2
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkBufferMemoryRequirementsInfo2, transform_tohost_VkBufferMemoryRequirementsInfo2KHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkBufferMemoryRequirementsInfo2,
+                      transform_tohost_VkBufferMemoryRequirementsInfo2KHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkBufferMemoryRequirementsInfo2, transform_fromhost_VkBufferMemoryRequirementsInfo2KHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkBufferMemoryRequirementsInfo2,
+                      transform_fromhost_VkBufferMemoryRequirementsInfo2KHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkImageMemoryRequirementsInfo2, transform_tohost_VkImageMemoryRequirementsInfo2KHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkImageMemoryRequirementsInfo2,
+                      transform_tohost_VkImageMemoryRequirementsInfo2KHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkImageMemoryRequirementsInfo2, transform_fromhost_VkImageMemoryRequirementsInfo2KHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkImageMemoryRequirementsInfo2,
+                      transform_fromhost_VkImageMemoryRequirementsInfo2KHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkImageSparseMemoryRequirementsInfo2, transform_tohost_VkImageSparseMemoryRequirementsInfo2KHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkImageSparseMemoryRequirementsInfo2,
+                      transform_tohost_VkImageSparseMemoryRequirementsInfo2KHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkImageSparseMemoryRequirementsInfo2, transform_fromhost_VkImageSparseMemoryRequirementsInfo2KHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkImageSparseMemoryRequirementsInfo2,
+                      transform_fromhost_VkImageSparseMemoryRequirementsInfo2KHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkMemoryRequirements2, transform_tohost_VkMemoryRequirements2KHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkMemoryRequirements2,
+                      transform_tohost_VkMemoryRequirements2KHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkMemoryRequirements2, transform_fromhost_VkMemoryRequirements2KHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkMemoryRequirements2,
+                      transform_fromhost_VkMemoryRequirements2KHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkSparseImageMemoryRequirements2, transform_tohost_VkSparseImageMemoryRequirements2KHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkSparseImageMemoryRequirements2,
+                      transform_tohost_VkSparseImageMemoryRequirements2KHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkSparseImageMemoryRequirements2, transform_fromhost_VkSparseImageMemoryRequirements2KHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkSparseImageMemoryRequirements2,
+                      transform_fromhost_VkSparseImageMemoryRequirements2KHR)
 
 #endif
 #ifdef VK_KHR_image_format_list
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkImageFormatListCreateInfo, transform_tohost_VkImageFormatListCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkImageFormatListCreateInfo,
+                      transform_tohost_VkImageFormatListCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkImageFormatListCreateInfo, transform_fromhost_VkImageFormatListCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkImageFormatListCreateInfo,
+                      transform_fromhost_VkImageFormatListCreateInfoKHR)
 
 #endif
 #ifdef VK_KHR_sampler_ycbcr_conversion
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkSamplerYcbcrConversionCreateInfo, transform_tohost_VkSamplerYcbcrConversionCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkSamplerYcbcrConversionCreateInfo,
+                      transform_tohost_VkSamplerYcbcrConversionCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkSamplerYcbcrConversionCreateInfo, transform_fromhost_VkSamplerYcbcrConversionCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkSamplerYcbcrConversionCreateInfo,
+                      transform_fromhost_VkSamplerYcbcrConversionCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkSamplerYcbcrConversionInfo, transform_tohost_VkSamplerYcbcrConversionInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkSamplerYcbcrConversionInfo,
+                      transform_tohost_VkSamplerYcbcrConversionInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkSamplerYcbcrConversionInfo, transform_fromhost_VkSamplerYcbcrConversionInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkSamplerYcbcrConversionInfo,
+                      transform_fromhost_VkSamplerYcbcrConversionInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkBindImagePlaneMemoryInfo, transform_tohost_VkBindImagePlaneMemoryInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkBindImagePlaneMemoryInfo,
+                      transform_tohost_VkBindImagePlaneMemoryInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkBindImagePlaneMemoryInfo, transform_fromhost_VkBindImagePlaneMemoryInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkBindImagePlaneMemoryInfo,
+                      transform_fromhost_VkBindImagePlaneMemoryInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkImagePlaneMemoryRequirementsInfo, transform_tohost_VkImagePlaneMemoryRequirementsInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkImagePlaneMemoryRequirementsInfo,
+                      transform_tohost_VkImagePlaneMemoryRequirementsInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkImagePlaneMemoryRequirementsInfo, transform_fromhost_VkImagePlaneMemoryRequirementsInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkImagePlaneMemoryRequirementsInfo,
+                      transform_fromhost_VkImagePlaneMemoryRequirementsInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceSamplerYcbcrConversionFeatures, transform_tohost_VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceSamplerYcbcrConversionFeatures,
+                      transform_tohost_VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceSamplerYcbcrConversionFeatures, transform_fromhost_VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceSamplerYcbcrConversionFeatures,
+                      transform_fromhost_VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkSamplerYcbcrConversionImageFormatProperties, transform_tohost_VkSamplerYcbcrConversionImageFormatPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkSamplerYcbcrConversionImageFormatProperties,
+                      transform_tohost_VkSamplerYcbcrConversionImageFormatPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkSamplerYcbcrConversionImageFormatProperties, transform_fromhost_VkSamplerYcbcrConversionImageFormatPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkSamplerYcbcrConversionImageFormatProperties,
+                      transform_fromhost_VkSamplerYcbcrConversionImageFormatPropertiesKHR)
 
 #endif
 #ifdef VK_KHR_bind_memory2
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkBindBufferMemoryInfo, transform_tohost_VkBindBufferMemoryInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkBindBufferMemoryInfo,
+                      transform_tohost_VkBindBufferMemoryInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkBindBufferMemoryInfo, transform_fromhost_VkBindBufferMemoryInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkBindBufferMemoryInfo,
+                      transform_fromhost_VkBindBufferMemoryInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkBindImageMemoryInfo, transform_tohost_VkBindImageMemoryInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkBindImageMemoryInfo,
+                      transform_tohost_VkBindImageMemoryInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkBindImageMemoryInfo, transform_fromhost_VkBindImageMemoryInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkBindImageMemoryInfo,
+                      transform_fromhost_VkBindImageMemoryInfoKHR)
 
 #endif
 #ifdef VK_KHR_portability_subset
@@ -3033,103 +2586,134 @@
 
 #endif
 #ifdef VK_KHR_maintenance3
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceMaintenance3Properties, transform_tohost_VkPhysicalDeviceMaintenance3PropertiesKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceMaintenance3Properties,
+                      transform_tohost_VkPhysicalDeviceMaintenance3PropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceMaintenance3Properties, transform_fromhost_VkPhysicalDeviceMaintenance3PropertiesKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceMaintenance3Properties,
+                      transform_fromhost_VkPhysicalDeviceMaintenance3PropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkDescriptorSetLayoutSupport, transform_tohost_VkDescriptorSetLayoutSupportKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkDescriptorSetLayoutSupport,
+                      transform_tohost_VkDescriptorSetLayoutSupportKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkDescriptorSetLayoutSupport, transform_fromhost_VkDescriptorSetLayoutSupportKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkDescriptorSetLayoutSupport,
+                      transform_fromhost_VkDescriptorSetLayoutSupportKHR)
 
 #endif
 #ifdef VK_KHR_draw_indirect_count
 #endif
 #ifdef VK_KHR_shader_subgroup_extended_types
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures, transform_tohost_VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures,
+                      transform_tohost_VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures, transform_fromhost_VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures,
+                      transform_fromhost_VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR)
 
 #endif
 #ifdef VK_KHR_8bit_storage
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDevice8BitStorageFeatures, transform_tohost_VkPhysicalDevice8BitStorageFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDevice8BitStorageFeatures,
+                      transform_tohost_VkPhysicalDevice8BitStorageFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDevice8BitStorageFeatures, transform_fromhost_VkPhysicalDevice8BitStorageFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDevice8BitStorageFeatures,
+                      transform_fromhost_VkPhysicalDevice8BitStorageFeaturesKHR)
 
 #endif
 #ifdef VK_KHR_shader_atomic_int64
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceShaderAtomicInt64Features, transform_tohost_VkPhysicalDeviceShaderAtomicInt64FeaturesKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceShaderAtomicInt64Features,
+                      transform_tohost_VkPhysicalDeviceShaderAtomicInt64FeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceShaderAtomicInt64Features, transform_fromhost_VkPhysicalDeviceShaderAtomicInt64FeaturesKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceShaderAtomicInt64Features,
+                      transform_fromhost_VkPhysicalDeviceShaderAtomicInt64FeaturesKHR)
 
 #endif
 #ifdef VK_KHR_shader_clock
 void transform_tohost_VkPhysicalDeviceShaderClockFeaturesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderClockFeaturesKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceShaderClockFeaturesKHR* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceShaderClockFeaturesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderClockFeaturesKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceShaderClockFeaturesKHR* toTransform);
 
 #endif
 #ifdef VK_KHR_driver_properties
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkConformanceVersion, transform_tohost_VkConformanceVersionKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkConformanceVersion,
+                      transform_tohost_VkConformanceVersionKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkConformanceVersion, transform_fromhost_VkConformanceVersionKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkConformanceVersion,
+                      transform_fromhost_VkConformanceVersionKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceDriverProperties, transform_tohost_VkPhysicalDeviceDriverPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceDriverProperties,
+                      transform_tohost_VkPhysicalDeviceDriverPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceDriverProperties, transform_fromhost_VkPhysicalDeviceDriverPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceDriverProperties,
+                      transform_fromhost_VkPhysicalDeviceDriverPropertiesKHR)
 
 #endif
 #ifdef VK_KHR_shader_float_controls
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceFloatControlsProperties, transform_tohost_VkPhysicalDeviceFloatControlsPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceFloatControlsProperties,
+                      transform_tohost_VkPhysicalDeviceFloatControlsPropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceFloatControlsProperties, transform_fromhost_VkPhysicalDeviceFloatControlsPropertiesKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceFloatControlsProperties,
+                      transform_fromhost_VkPhysicalDeviceFloatControlsPropertiesKHR)
 
 #endif
 #ifdef VK_KHR_depth_stencil_resolve
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkSubpassDescriptionDepthStencilResolve, transform_tohost_VkSubpassDescriptionDepthStencilResolveKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkSubpassDescriptionDepthStencilResolve,
+                      transform_tohost_VkSubpassDescriptionDepthStencilResolveKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkSubpassDescriptionDepthStencilResolve, transform_fromhost_VkSubpassDescriptionDepthStencilResolveKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkSubpassDescriptionDepthStencilResolve,
+                      transform_fromhost_VkSubpassDescriptionDepthStencilResolveKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceDepthStencilResolveProperties, transform_tohost_VkPhysicalDeviceDepthStencilResolvePropertiesKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceDepthStencilResolveProperties,
+                      transform_tohost_VkPhysicalDeviceDepthStencilResolvePropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceDepthStencilResolveProperties, transform_fromhost_VkPhysicalDeviceDepthStencilResolvePropertiesKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceDepthStencilResolveProperties,
+                      transform_fromhost_VkPhysicalDeviceDepthStencilResolvePropertiesKHR)
 
 #endif
 #ifdef VK_KHR_swapchain_mutable_format
 #endif
 #ifdef VK_KHR_timeline_semaphore
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceTimelineSemaphoreFeatures, transform_tohost_VkPhysicalDeviceTimelineSemaphoreFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceTimelineSemaphoreFeatures,
+                      transform_tohost_VkPhysicalDeviceTimelineSemaphoreFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceTimelineSemaphoreFeatures, transform_fromhost_VkPhysicalDeviceTimelineSemaphoreFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceTimelineSemaphoreFeatures,
+                      transform_fromhost_VkPhysicalDeviceTimelineSemaphoreFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceTimelineSemaphoreProperties, transform_tohost_VkPhysicalDeviceTimelineSemaphorePropertiesKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceTimelineSemaphoreProperties,
+                      transform_tohost_VkPhysicalDeviceTimelineSemaphorePropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceTimelineSemaphoreProperties, transform_fromhost_VkPhysicalDeviceTimelineSemaphorePropertiesKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceTimelineSemaphoreProperties,
+                      transform_fromhost_VkPhysicalDeviceTimelineSemaphorePropertiesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkSemaphoreTypeCreateInfo, transform_tohost_VkSemaphoreTypeCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkSemaphoreTypeCreateInfo,
+                      transform_tohost_VkSemaphoreTypeCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkSemaphoreTypeCreateInfo, transform_fromhost_VkSemaphoreTypeCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkSemaphoreTypeCreateInfo,
+                      transform_fromhost_VkSemaphoreTypeCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkTimelineSemaphoreSubmitInfo, transform_tohost_VkTimelineSemaphoreSubmitInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkTimelineSemaphoreSubmitInfo,
+                      transform_tohost_VkTimelineSemaphoreSubmitInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkTimelineSemaphoreSubmitInfo, transform_fromhost_VkTimelineSemaphoreSubmitInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkTimelineSemaphoreSubmitInfo,
+                      transform_fromhost_VkTimelineSemaphoreSubmitInfoKHR)
 
 DEFINE_ALIAS_FUNCTION(transform_tohost_VkSemaphoreWaitInfo, transform_tohost_VkSemaphoreWaitInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkSemaphoreWaitInfo, transform_fromhost_VkSemaphoreWaitInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkSemaphoreWaitInfo,
+                      transform_fromhost_VkSemaphoreWaitInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkSemaphoreSignalInfo, transform_tohost_VkSemaphoreSignalInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkSemaphoreSignalInfo,
+                      transform_tohost_VkSemaphoreSignalInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkSemaphoreSignalInfo, transform_fromhost_VkSemaphoreSignalInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkSemaphoreSignalInfo,
+                      transform_fromhost_VkSemaphoreSignalInfoKHR)
 
 #endif
 #ifdef VK_KHR_vulkan_memory_model
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceVulkanMemoryModelFeatures, transform_tohost_VkPhysicalDeviceVulkanMemoryModelFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceVulkanMemoryModelFeatures,
+                      transform_tohost_VkPhysicalDeviceVulkanMemoryModelFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceVulkanMemoryModelFeatures, transform_fromhost_VkPhysicalDeviceVulkanMemoryModelFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceVulkanMemoryModelFeatures,
+                      transform_fromhost_VkPhysicalDeviceVulkanMemoryModelFeaturesKHR)
 
 #endif
 #ifdef VK_KHR_shader_terminate_invocation
@@ -3144,12 +2728,10 @@
 #endif
 #ifdef VK_KHR_fragment_shading_rate
 void transform_tohost_VkFragmentShadingRateAttachmentInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkFragmentShadingRateAttachmentInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkFragmentShadingRateAttachmentInfoKHR* toTransform);
 
 void transform_fromhost_VkFragmentShadingRateAttachmentInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkFragmentShadingRateAttachmentInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkFragmentShadingRateAttachmentInfoKHR* toTransform);
 
 void transform_tohost_VkPipelineFragmentShadingRateStateCreateInfoKHR(
     VkDecoderGlobalState* resourceTracker,
@@ -3176,76 +2758,88 @@
     VkPhysicalDeviceFragmentShadingRatePropertiesKHR* toTransform);
 
 void transform_tohost_VkPhysicalDeviceFragmentShadingRateKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceFragmentShadingRateKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceFragmentShadingRateKHR* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceFragmentShadingRateKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceFragmentShadingRateKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceFragmentShadingRateKHR* toTransform);
 
 #endif
 #ifdef VK_KHR_spirv_1_4
 #endif
 #ifdef VK_KHR_surface_protected_capabilities
 void transform_tohost_VkSurfaceProtectedCapabilitiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSurfaceProtectedCapabilitiesKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkSurfaceProtectedCapabilitiesKHR* toTransform);
 
 void transform_fromhost_VkSurfaceProtectedCapabilitiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSurfaceProtectedCapabilitiesKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkSurfaceProtectedCapabilitiesKHR* toTransform);
 
 #endif
 #ifdef VK_KHR_separate_depth_stencil_layouts
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures, transform_tohost_VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures,
+                      transform_tohost_VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures, transform_fromhost_VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures,
+                      transform_fromhost_VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkAttachmentReferenceStencilLayout, transform_tohost_VkAttachmentReferenceStencilLayoutKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkAttachmentReferenceStencilLayout,
+                      transform_tohost_VkAttachmentReferenceStencilLayoutKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkAttachmentReferenceStencilLayout, transform_fromhost_VkAttachmentReferenceStencilLayoutKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkAttachmentReferenceStencilLayout,
+                      transform_fromhost_VkAttachmentReferenceStencilLayoutKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkAttachmentDescriptionStencilLayout, transform_tohost_VkAttachmentDescriptionStencilLayoutKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkAttachmentDescriptionStencilLayout,
+                      transform_tohost_VkAttachmentDescriptionStencilLayoutKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkAttachmentDescriptionStencilLayout, transform_fromhost_VkAttachmentDescriptionStencilLayoutKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkAttachmentDescriptionStencilLayout,
+                      transform_fromhost_VkAttachmentDescriptionStencilLayoutKHR)
 
 #endif
 #ifdef VK_KHR_present_wait
 void transform_tohost_VkPhysicalDevicePresentWaitFeaturesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePresentWaitFeaturesKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDevicePresentWaitFeaturesKHR* toTransform);
 
 void transform_fromhost_VkPhysicalDevicePresentWaitFeaturesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePresentWaitFeaturesKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDevicePresentWaitFeaturesKHR* toTransform);
 
 #endif
 #ifdef VK_KHR_uniform_buffer_standard_layout
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceUniformBufferStandardLayoutFeatures, transform_tohost_VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceUniformBufferStandardLayoutFeatures,
+                      transform_tohost_VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceUniformBufferStandardLayoutFeatures, transform_fromhost_VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceUniformBufferStandardLayoutFeatures,
+                      transform_fromhost_VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR)
 
 #endif
 #ifdef VK_KHR_buffer_device_address
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceBufferDeviceAddressFeatures, transform_tohost_VkPhysicalDeviceBufferDeviceAddressFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceBufferDeviceAddressFeatures,
+                      transform_tohost_VkPhysicalDeviceBufferDeviceAddressFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceBufferDeviceAddressFeatures, transform_fromhost_VkPhysicalDeviceBufferDeviceAddressFeaturesKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceBufferDeviceAddressFeatures,
+                      transform_fromhost_VkPhysicalDeviceBufferDeviceAddressFeaturesKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkBufferDeviceAddressInfo, transform_tohost_VkBufferDeviceAddressInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkBufferDeviceAddressInfo,
+                      transform_tohost_VkBufferDeviceAddressInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkBufferDeviceAddressInfo, transform_fromhost_VkBufferDeviceAddressInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkBufferDeviceAddressInfo,
+                      transform_fromhost_VkBufferDeviceAddressInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkBufferOpaqueCaptureAddressCreateInfo, transform_tohost_VkBufferOpaqueCaptureAddressCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkBufferOpaqueCaptureAddressCreateInfo,
+                      transform_tohost_VkBufferOpaqueCaptureAddressCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkBufferOpaqueCaptureAddressCreateInfo, transform_fromhost_VkBufferOpaqueCaptureAddressCreateInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkBufferOpaqueCaptureAddressCreateInfo,
+                      transform_fromhost_VkBufferOpaqueCaptureAddressCreateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkMemoryOpaqueCaptureAddressAllocateInfo, transform_tohost_VkMemoryOpaqueCaptureAddressAllocateInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkMemoryOpaqueCaptureAddressAllocateInfo,
+                      transform_tohost_VkMemoryOpaqueCaptureAddressAllocateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkMemoryOpaqueCaptureAddressAllocateInfo, transform_fromhost_VkMemoryOpaqueCaptureAddressAllocateInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkMemoryOpaqueCaptureAddressAllocateInfo,
+                      transform_fromhost_VkMemoryOpaqueCaptureAddressAllocateInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkDeviceMemoryOpaqueCaptureAddressInfo, transform_tohost_VkDeviceMemoryOpaqueCaptureAddressInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkDeviceMemoryOpaqueCaptureAddressInfo,
+                      transform_tohost_VkDeviceMemoryOpaqueCaptureAddressInfoKHR)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkDeviceMemoryOpaqueCaptureAddressInfo, transform_fromhost_VkDeviceMemoryOpaqueCaptureAddressInfoKHR)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkDeviceMemoryOpaqueCaptureAddressInfo,
+                      transform_fromhost_VkDeviceMemoryOpaqueCaptureAddressInfoKHR)
 
 #endif
 #ifdef VK_KHR_deferred_host_operations
@@ -3259,45 +2853,35 @@
     VkDecoderGlobalState* resourceTracker,
     VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* toTransform);
 
-void transform_tohost_VkPipelineInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineInfoKHR* toTransform);
+void transform_tohost_VkPipelineInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                        VkPipelineInfoKHR* toTransform);
 
-void transform_fromhost_VkPipelineInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineInfoKHR* toTransform);
+void transform_fromhost_VkPipelineInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                          VkPipelineInfoKHR* toTransform);
 
 void transform_tohost_VkPipelineExecutablePropertiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineExecutablePropertiesKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineExecutablePropertiesKHR* toTransform);
 
 void transform_fromhost_VkPipelineExecutablePropertiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineExecutablePropertiesKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineExecutablePropertiesKHR* toTransform);
 
-void transform_tohost_VkPipelineExecutableInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineExecutableInfoKHR* toTransform);
+void transform_tohost_VkPipelineExecutableInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                  VkPipelineExecutableInfoKHR* toTransform);
 
-void transform_fromhost_VkPipelineExecutableInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineExecutableInfoKHR* toTransform);
+void transform_fromhost_VkPipelineExecutableInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkPipelineExecutableInfoKHR* toTransform);
 
 void transform_tohost_VkPipelineExecutableStatisticValueKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineExecutableStatisticValueKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineExecutableStatisticValueKHR* toTransform);
 
 void transform_fromhost_VkPipelineExecutableStatisticValueKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineExecutableStatisticValueKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineExecutableStatisticValueKHR* toTransform);
 
 void transform_tohost_VkPipelineExecutableStatisticKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineExecutableStatisticKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineExecutableStatisticKHR* toTransform);
 
 void transform_fromhost_VkPipelineExecutableStatisticKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineExecutableStatisticKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineExecutableStatisticKHR* toTransform);
 
 void transform_tohost_VkPipelineExecutableInternalRepresentationKHR(
     VkDecoderGlobalState* resourceTracker,
@@ -3327,109 +2911,85 @@
 
 #endif
 #ifdef VK_KHR_pipeline_library
-void transform_tohost_VkPipelineLibraryCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineLibraryCreateInfoKHR* toTransform);
+void transform_tohost_VkPipelineLibraryCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                     VkPipelineLibraryCreateInfoKHR* toTransform);
 
-void transform_fromhost_VkPipelineLibraryCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineLibraryCreateInfoKHR* toTransform);
+void transform_fromhost_VkPipelineLibraryCreateInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                       VkPipelineLibraryCreateInfoKHR* toTransform);
 
 #endif
 #ifdef VK_KHR_shader_non_semantic_info
 #endif
 #ifdef VK_KHR_present_id
-void transform_tohost_VkPresentIdKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPresentIdKHR* toTransform);
+void transform_tohost_VkPresentIdKHR(VkDecoderGlobalState* resourceTracker,
+                                     VkPresentIdKHR* toTransform);
 
-void transform_fromhost_VkPresentIdKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPresentIdKHR* toTransform);
+void transform_fromhost_VkPresentIdKHR(VkDecoderGlobalState* resourceTracker,
+                                       VkPresentIdKHR* toTransform);
 
 void transform_tohost_VkPhysicalDevicePresentIdFeaturesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePresentIdFeaturesKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDevicePresentIdFeaturesKHR* toTransform);
 
 void transform_fromhost_VkPhysicalDevicePresentIdFeaturesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePresentIdFeaturesKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDevicePresentIdFeaturesKHR* toTransform);
 
 #endif
 #ifdef VK_KHR_video_encode_queue
-void transform_tohost_VkVideoEncodeInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeInfoKHR* toTransform);
+void transform_tohost_VkVideoEncodeInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                           VkVideoEncodeInfoKHR* toTransform);
 
-void transform_fromhost_VkVideoEncodeInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeInfoKHR* toTransform);
+void transform_fromhost_VkVideoEncodeInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                             VkVideoEncodeInfoKHR* toTransform);
 
-void transform_tohost_VkVideoEncodeRateControlInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeRateControlInfoKHR* toTransform);
+void transform_tohost_VkVideoEncodeRateControlInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                      VkVideoEncodeRateControlInfoKHR* toTransform);
 
 void transform_fromhost_VkVideoEncodeRateControlInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeRateControlInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeRateControlInfoKHR* toTransform);
 
 #endif
 #ifdef VK_KHR_synchronization2
-void transform_tohost_VkMemoryBarrier2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryBarrier2KHR* toTransform);
+void transform_tohost_VkMemoryBarrier2KHR(VkDecoderGlobalState* resourceTracker,
+                                          VkMemoryBarrier2KHR* toTransform);
 
-void transform_fromhost_VkMemoryBarrier2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryBarrier2KHR* toTransform);
+void transform_fromhost_VkMemoryBarrier2KHR(VkDecoderGlobalState* resourceTracker,
+                                            VkMemoryBarrier2KHR* toTransform);
 
-void transform_tohost_VkBufferMemoryBarrier2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferMemoryBarrier2KHR* toTransform);
+void transform_tohost_VkBufferMemoryBarrier2KHR(VkDecoderGlobalState* resourceTracker,
+                                                VkBufferMemoryBarrier2KHR* toTransform);
 
-void transform_fromhost_VkBufferMemoryBarrier2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferMemoryBarrier2KHR* toTransform);
+void transform_fromhost_VkBufferMemoryBarrier2KHR(VkDecoderGlobalState* resourceTracker,
+                                                  VkBufferMemoryBarrier2KHR* toTransform);
 
-void transform_tohost_VkImageMemoryBarrier2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageMemoryBarrier2KHR* toTransform);
+void transform_tohost_VkImageMemoryBarrier2KHR(VkDecoderGlobalState* resourceTracker,
+                                               VkImageMemoryBarrier2KHR* toTransform);
 
-void transform_fromhost_VkImageMemoryBarrier2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageMemoryBarrier2KHR* toTransform);
+void transform_fromhost_VkImageMemoryBarrier2KHR(VkDecoderGlobalState* resourceTracker,
+                                                 VkImageMemoryBarrier2KHR* toTransform);
 
-void transform_tohost_VkDependencyInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDependencyInfoKHR* toTransform);
+void transform_tohost_VkDependencyInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                          VkDependencyInfoKHR* toTransform);
 
-void transform_fromhost_VkDependencyInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDependencyInfoKHR* toTransform);
+void transform_fromhost_VkDependencyInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                            VkDependencyInfoKHR* toTransform);
 
-void transform_tohost_VkSemaphoreSubmitInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSemaphoreSubmitInfoKHR* toTransform);
+void transform_tohost_VkSemaphoreSubmitInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                               VkSemaphoreSubmitInfoKHR* toTransform);
 
-void transform_fromhost_VkSemaphoreSubmitInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSemaphoreSubmitInfoKHR* toTransform);
+void transform_fromhost_VkSemaphoreSubmitInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                 VkSemaphoreSubmitInfoKHR* toTransform);
 
-void transform_tohost_VkCommandBufferSubmitInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkCommandBufferSubmitInfoKHR* toTransform);
+void transform_tohost_VkCommandBufferSubmitInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                   VkCommandBufferSubmitInfoKHR* toTransform);
 
-void transform_fromhost_VkCommandBufferSubmitInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkCommandBufferSubmitInfoKHR* toTransform);
+void transform_fromhost_VkCommandBufferSubmitInfoKHR(VkDecoderGlobalState* resourceTracker,
+                                                     VkCommandBufferSubmitInfoKHR* toTransform);
 
-void transform_tohost_VkSubmitInfo2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubmitInfo2KHR* toTransform);
+void transform_tohost_VkSubmitInfo2KHR(VkDecoderGlobalState* resourceTracker,
+                                       VkSubmitInfo2KHR* toTransform);
 
-void transform_fromhost_VkSubmitInfo2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubmitInfo2KHR* toTransform);
+void transform_fromhost_VkSubmitInfo2KHR(VkDecoderGlobalState* resourceTracker,
+                                         VkSubmitInfo2KHR* toTransform);
 
 void transform_tohost_VkPhysicalDeviceSynchronization2FeaturesKHR(
     VkDecoderGlobalState* resourceTracker,
@@ -3440,20 +3000,16 @@
     VkPhysicalDeviceSynchronization2FeaturesKHR* toTransform);
 
 void transform_tohost_VkQueueFamilyCheckpointProperties2NV(
-    VkDecoderGlobalState* resourceTracker,
-    VkQueueFamilyCheckpointProperties2NV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkQueueFamilyCheckpointProperties2NV* toTransform);
 
 void transform_fromhost_VkQueueFamilyCheckpointProperties2NV(
-    VkDecoderGlobalState* resourceTracker,
-    VkQueueFamilyCheckpointProperties2NV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkQueueFamilyCheckpointProperties2NV* toTransform);
 
-void transform_tohost_VkCheckpointData2NV(
-    VkDecoderGlobalState* resourceTracker,
-    VkCheckpointData2NV* toTransform);
+void transform_tohost_VkCheckpointData2NV(VkDecoderGlobalState* resourceTracker,
+                                          VkCheckpointData2NV* toTransform);
 
-void transform_fromhost_VkCheckpointData2NV(
-    VkDecoderGlobalState* resourceTracker,
-    VkCheckpointData2NV* toTransform);
+void transform_fromhost_VkCheckpointData2NV(VkDecoderGlobalState* resourceTracker,
+                                            VkCheckpointData2NV* toTransform);
 
 #endif
 #ifdef VK_KHR_shader_subgroup_uniform_control_flow
@@ -3487,157 +3043,121 @@
 
 #endif
 #ifdef VK_KHR_copy_commands2
-void transform_tohost_VkBufferCopy2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferCopy2KHR* toTransform);
+void transform_tohost_VkBufferCopy2KHR(VkDecoderGlobalState* resourceTracker,
+                                       VkBufferCopy2KHR* toTransform);
 
-void transform_fromhost_VkBufferCopy2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferCopy2KHR* toTransform);
+void transform_fromhost_VkBufferCopy2KHR(VkDecoderGlobalState* resourceTracker,
+                                         VkBufferCopy2KHR* toTransform);
 
-void transform_tohost_VkCopyBufferInfo2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkCopyBufferInfo2KHR* toTransform);
+void transform_tohost_VkCopyBufferInfo2KHR(VkDecoderGlobalState* resourceTracker,
+                                           VkCopyBufferInfo2KHR* toTransform);
 
-void transform_fromhost_VkCopyBufferInfo2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkCopyBufferInfo2KHR* toTransform);
+void transform_fromhost_VkCopyBufferInfo2KHR(VkDecoderGlobalState* resourceTracker,
+                                             VkCopyBufferInfo2KHR* toTransform);
 
-void transform_tohost_VkImageCopy2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageCopy2KHR* toTransform);
+void transform_tohost_VkImageCopy2KHR(VkDecoderGlobalState* resourceTracker,
+                                      VkImageCopy2KHR* toTransform);
 
-void transform_fromhost_VkImageCopy2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageCopy2KHR* toTransform);
+void transform_fromhost_VkImageCopy2KHR(VkDecoderGlobalState* resourceTracker,
+                                        VkImageCopy2KHR* toTransform);
 
-void transform_tohost_VkCopyImageInfo2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkCopyImageInfo2KHR* toTransform);
+void transform_tohost_VkCopyImageInfo2KHR(VkDecoderGlobalState* resourceTracker,
+                                          VkCopyImageInfo2KHR* toTransform);
 
-void transform_fromhost_VkCopyImageInfo2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkCopyImageInfo2KHR* toTransform);
+void transform_fromhost_VkCopyImageInfo2KHR(VkDecoderGlobalState* resourceTracker,
+                                            VkCopyImageInfo2KHR* toTransform);
 
-void transform_tohost_VkBufferImageCopy2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferImageCopy2KHR* toTransform);
+void transform_tohost_VkBufferImageCopy2KHR(VkDecoderGlobalState* resourceTracker,
+                                            VkBufferImageCopy2KHR* toTransform);
 
-void transform_fromhost_VkBufferImageCopy2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferImageCopy2KHR* toTransform);
+void transform_fromhost_VkBufferImageCopy2KHR(VkDecoderGlobalState* resourceTracker,
+                                              VkBufferImageCopy2KHR* toTransform);
 
-void transform_tohost_VkCopyBufferToImageInfo2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkCopyBufferToImageInfo2KHR* toTransform);
+void transform_tohost_VkCopyBufferToImageInfo2KHR(VkDecoderGlobalState* resourceTracker,
+                                                  VkCopyBufferToImageInfo2KHR* toTransform);
 
-void transform_fromhost_VkCopyBufferToImageInfo2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkCopyBufferToImageInfo2KHR* toTransform);
+void transform_fromhost_VkCopyBufferToImageInfo2KHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkCopyBufferToImageInfo2KHR* toTransform);
 
-void transform_tohost_VkCopyImageToBufferInfo2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkCopyImageToBufferInfo2KHR* toTransform);
+void transform_tohost_VkCopyImageToBufferInfo2KHR(VkDecoderGlobalState* resourceTracker,
+                                                  VkCopyImageToBufferInfo2KHR* toTransform);
 
-void transform_fromhost_VkCopyImageToBufferInfo2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkCopyImageToBufferInfo2KHR* toTransform);
+void transform_fromhost_VkCopyImageToBufferInfo2KHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkCopyImageToBufferInfo2KHR* toTransform);
 
-void transform_tohost_VkImageBlit2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageBlit2KHR* toTransform);
+void transform_tohost_VkImageBlit2KHR(VkDecoderGlobalState* resourceTracker,
+                                      VkImageBlit2KHR* toTransform);
 
-void transform_fromhost_VkImageBlit2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageBlit2KHR* toTransform);
+void transform_fromhost_VkImageBlit2KHR(VkDecoderGlobalState* resourceTracker,
+                                        VkImageBlit2KHR* toTransform);
 
-void transform_tohost_VkBlitImageInfo2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkBlitImageInfo2KHR* toTransform);
+void transform_tohost_VkBlitImageInfo2KHR(VkDecoderGlobalState* resourceTracker,
+                                          VkBlitImageInfo2KHR* toTransform);
 
-void transform_fromhost_VkBlitImageInfo2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkBlitImageInfo2KHR* toTransform);
+void transform_fromhost_VkBlitImageInfo2KHR(VkDecoderGlobalState* resourceTracker,
+                                            VkBlitImageInfo2KHR* toTransform);
 
-void transform_tohost_VkImageResolve2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageResolve2KHR* toTransform);
+void transform_tohost_VkImageResolve2KHR(VkDecoderGlobalState* resourceTracker,
+                                         VkImageResolve2KHR* toTransform);
 
-void transform_fromhost_VkImageResolve2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageResolve2KHR* toTransform);
+void transform_fromhost_VkImageResolve2KHR(VkDecoderGlobalState* resourceTracker,
+                                           VkImageResolve2KHR* toTransform);
 
-void transform_tohost_VkResolveImageInfo2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkResolveImageInfo2KHR* toTransform);
+void transform_tohost_VkResolveImageInfo2KHR(VkDecoderGlobalState* resourceTracker,
+                                             VkResolveImageInfo2KHR* toTransform);
 
-void transform_fromhost_VkResolveImageInfo2KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkResolveImageInfo2KHR* toTransform);
+void transform_fromhost_VkResolveImageInfo2KHR(VkDecoderGlobalState* resourceTracker,
+                                               VkResolveImageInfo2KHR* toTransform);
 
 #endif
 #ifdef VK_KHR_format_feature_flags2
-void transform_tohost_VkFormatProperties3KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkFormatProperties3KHR* toTransform);
+void transform_tohost_VkFormatProperties3KHR(VkDecoderGlobalState* resourceTracker,
+                                             VkFormatProperties3KHR* toTransform);
 
-void transform_fromhost_VkFormatProperties3KHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkFormatProperties3KHR* toTransform);
+void transform_fromhost_VkFormatProperties3KHR(VkDecoderGlobalState* resourceTracker,
+                                               VkFormatProperties3KHR* toTransform);
 
 #endif
 #ifdef VK_KHR_maintenance4
 void transform_tohost_VkPhysicalDeviceMaintenance4FeaturesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMaintenance4FeaturesKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMaintenance4FeaturesKHR* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceMaintenance4FeaturesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMaintenance4FeaturesKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMaintenance4FeaturesKHR* toTransform);
 
 void transform_tohost_VkPhysicalDeviceMaintenance4PropertiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMaintenance4PropertiesKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMaintenance4PropertiesKHR* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceMaintenance4PropertiesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMaintenance4PropertiesKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMaintenance4PropertiesKHR* toTransform);
 
 void transform_tohost_VkDeviceBufferMemoryRequirementsKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceBufferMemoryRequirementsKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDeviceBufferMemoryRequirementsKHR* toTransform);
 
 void transform_fromhost_VkDeviceBufferMemoryRequirementsKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceBufferMemoryRequirementsKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDeviceBufferMemoryRequirementsKHR* toTransform);
 
 void transform_tohost_VkDeviceImageMemoryRequirementsKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceImageMemoryRequirementsKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDeviceImageMemoryRequirementsKHR* toTransform);
 
 void transform_fromhost_VkDeviceImageMemoryRequirementsKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceImageMemoryRequirementsKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDeviceImageMemoryRequirementsKHR* toTransform);
 
 #endif
 #ifdef VK_ANDROID_native_buffer
-void transform_tohost_VkNativeBufferANDROID(
-    VkDecoderGlobalState* resourceTracker,
-    VkNativeBufferANDROID* toTransform);
+void transform_tohost_VkNativeBufferANDROID(VkDecoderGlobalState* resourceTracker,
+                                            VkNativeBufferANDROID* toTransform);
 
-void transform_fromhost_VkNativeBufferANDROID(
-    VkDecoderGlobalState* resourceTracker,
-    VkNativeBufferANDROID* toTransform);
+void transform_fromhost_VkNativeBufferANDROID(VkDecoderGlobalState* resourceTracker,
+                                              VkNativeBufferANDROID* toTransform);
 
 #endif
 #ifdef VK_EXT_debug_report
 void transform_tohost_VkDebugReportCallbackCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDebugReportCallbackCreateInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDebugReportCallbackCreateInfoEXT* toTransform);
 
 void transform_fromhost_VkDebugReportCallbackCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDebugReportCallbackCreateInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDebugReportCallbackCreateInfoEXT* toTransform);
 
 #endif
 #ifdef VK_NV_glsl_shader
@@ -3661,57 +3181,45 @@
 #ifdef VK_AMD_shader_explicit_vertex_parameter
 #endif
 #ifdef VK_EXT_debug_marker
-void transform_tohost_VkDebugMarkerObjectNameInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDebugMarkerObjectNameInfoEXT* toTransform);
+void transform_tohost_VkDebugMarkerObjectNameInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                     VkDebugMarkerObjectNameInfoEXT* toTransform);
 
-void transform_fromhost_VkDebugMarkerObjectNameInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDebugMarkerObjectNameInfoEXT* toTransform);
+void transform_fromhost_VkDebugMarkerObjectNameInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                       VkDebugMarkerObjectNameInfoEXT* toTransform);
 
-void transform_tohost_VkDebugMarkerObjectTagInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDebugMarkerObjectTagInfoEXT* toTransform);
+void transform_tohost_VkDebugMarkerObjectTagInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                    VkDebugMarkerObjectTagInfoEXT* toTransform);
 
-void transform_fromhost_VkDebugMarkerObjectTagInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDebugMarkerObjectTagInfoEXT* toTransform);
+void transform_fromhost_VkDebugMarkerObjectTagInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                      VkDebugMarkerObjectTagInfoEXT* toTransform);
 
-void transform_tohost_VkDebugMarkerMarkerInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDebugMarkerMarkerInfoEXT* toTransform);
+void transform_tohost_VkDebugMarkerMarkerInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                 VkDebugMarkerMarkerInfoEXT* toTransform);
 
-void transform_fromhost_VkDebugMarkerMarkerInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDebugMarkerMarkerInfoEXT* toTransform);
+void transform_fromhost_VkDebugMarkerMarkerInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                   VkDebugMarkerMarkerInfoEXT* toTransform);
 
 #endif
 #ifdef VK_AMD_gcn_shader
 #endif
 #ifdef VK_NV_dedicated_allocation
 void transform_tohost_VkDedicatedAllocationImageCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkDedicatedAllocationImageCreateInfoNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDedicatedAllocationImageCreateInfoNV* toTransform);
 
 void transform_fromhost_VkDedicatedAllocationImageCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkDedicatedAllocationImageCreateInfoNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDedicatedAllocationImageCreateInfoNV* toTransform);
 
 void transform_tohost_VkDedicatedAllocationBufferCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkDedicatedAllocationBufferCreateInfoNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDedicatedAllocationBufferCreateInfoNV* toTransform);
 
 void transform_fromhost_VkDedicatedAllocationBufferCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkDedicatedAllocationBufferCreateInfoNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDedicatedAllocationBufferCreateInfoNV* toTransform);
 
 void transform_tohost_VkDedicatedAllocationMemoryAllocateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkDedicatedAllocationMemoryAllocateInfoNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDedicatedAllocationMemoryAllocateInfoNV* toTransform);
 
 void transform_fromhost_VkDedicatedAllocationMemoryAllocateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkDedicatedAllocationMemoryAllocateInfoNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDedicatedAllocationMemoryAllocateInfoNV* toTransform);
 
 #endif
 #ifdef VK_EXT_transform_feedback
@@ -3741,47 +3249,37 @@
 
 #endif
 #ifdef VK_NVX_binary_import
-void transform_tohost_VkCuModuleCreateInfoNVX(
-    VkDecoderGlobalState* resourceTracker,
-    VkCuModuleCreateInfoNVX* toTransform);
+void transform_tohost_VkCuModuleCreateInfoNVX(VkDecoderGlobalState* resourceTracker,
+                                              VkCuModuleCreateInfoNVX* toTransform);
 
-void transform_fromhost_VkCuModuleCreateInfoNVX(
-    VkDecoderGlobalState* resourceTracker,
-    VkCuModuleCreateInfoNVX* toTransform);
+void transform_fromhost_VkCuModuleCreateInfoNVX(VkDecoderGlobalState* resourceTracker,
+                                                VkCuModuleCreateInfoNVX* toTransform);
 
-void transform_tohost_VkCuFunctionCreateInfoNVX(
-    VkDecoderGlobalState* resourceTracker,
-    VkCuFunctionCreateInfoNVX* toTransform);
+void transform_tohost_VkCuFunctionCreateInfoNVX(VkDecoderGlobalState* resourceTracker,
+                                                VkCuFunctionCreateInfoNVX* toTransform);
 
-void transform_fromhost_VkCuFunctionCreateInfoNVX(
-    VkDecoderGlobalState* resourceTracker,
-    VkCuFunctionCreateInfoNVX* toTransform);
+void transform_fromhost_VkCuFunctionCreateInfoNVX(VkDecoderGlobalState* resourceTracker,
+                                                  VkCuFunctionCreateInfoNVX* toTransform);
 
-void transform_tohost_VkCuLaunchInfoNVX(
-    VkDecoderGlobalState* resourceTracker,
-    VkCuLaunchInfoNVX* toTransform);
+void transform_tohost_VkCuLaunchInfoNVX(VkDecoderGlobalState* resourceTracker,
+                                        VkCuLaunchInfoNVX* toTransform);
 
-void transform_fromhost_VkCuLaunchInfoNVX(
-    VkDecoderGlobalState* resourceTracker,
-    VkCuLaunchInfoNVX* toTransform);
+void transform_fromhost_VkCuLaunchInfoNVX(VkDecoderGlobalState* resourceTracker,
+                                          VkCuLaunchInfoNVX* toTransform);
 
 #endif
 #ifdef VK_NVX_image_view_handle
-void transform_tohost_VkImageViewHandleInfoNVX(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageViewHandleInfoNVX* toTransform);
+void transform_tohost_VkImageViewHandleInfoNVX(VkDecoderGlobalState* resourceTracker,
+                                               VkImageViewHandleInfoNVX* toTransform);
 
-void transform_fromhost_VkImageViewHandleInfoNVX(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageViewHandleInfoNVX* toTransform);
+void transform_fromhost_VkImageViewHandleInfoNVX(VkDecoderGlobalState* resourceTracker,
+                                                 VkImageViewHandleInfoNVX* toTransform);
 
-void transform_tohost_VkImageViewAddressPropertiesNVX(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageViewAddressPropertiesNVX* toTransform);
+void transform_tohost_VkImageViewAddressPropertiesNVX(VkDecoderGlobalState* resourceTracker,
+                                                      VkImageViewAddressPropertiesNVX* toTransform);
 
 void transform_fromhost_VkImageViewAddressPropertiesNVX(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageViewAddressPropertiesNVX* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkImageViewAddressPropertiesNVX* toTransform);
 
 #endif
 #ifdef VK_AMD_draw_indirect_count
@@ -3794,20 +3292,16 @@
 #endif
 #ifdef VK_EXT_video_encode_h264
 void transform_tohost_VkVideoEncodeH264CapabilitiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH264CapabilitiesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH264CapabilitiesEXT* toTransform);
 
 void transform_fromhost_VkVideoEncodeH264CapabilitiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH264CapabilitiesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH264CapabilitiesEXT* toTransform);
 
 void transform_tohost_VkVideoEncodeH264SessionCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH264SessionCreateInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH264SessionCreateInfoEXT* toTransform);
 
 void transform_fromhost_VkVideoEncodeH264SessionCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH264SessionCreateInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH264SessionCreateInfoEXT* toTransform);
 
 void transform_tohost_VkVideoEncodeH264SessionParametersAddInfoEXT(
     VkDecoderGlobalState* resourceTracker,
@@ -3825,63 +3319,49 @@
     VkDecoderGlobalState* resourceTracker,
     VkVideoEncodeH264SessionParametersCreateInfoEXT* toTransform);
 
-void transform_tohost_VkVideoEncodeH264DpbSlotInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH264DpbSlotInfoEXT* toTransform);
+void transform_tohost_VkVideoEncodeH264DpbSlotInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                      VkVideoEncodeH264DpbSlotInfoEXT* toTransform);
 
 void transform_fromhost_VkVideoEncodeH264DpbSlotInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH264DpbSlotInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH264DpbSlotInfoEXT* toTransform);
 
-void transform_tohost_VkVideoEncodeH264NaluSliceEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH264NaluSliceEXT* toTransform);
+void transform_tohost_VkVideoEncodeH264NaluSliceEXT(VkDecoderGlobalState* resourceTracker,
+                                                    VkVideoEncodeH264NaluSliceEXT* toTransform);
 
-void transform_fromhost_VkVideoEncodeH264NaluSliceEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH264NaluSliceEXT* toTransform);
+void transform_fromhost_VkVideoEncodeH264NaluSliceEXT(VkDecoderGlobalState* resourceTracker,
+                                                      VkVideoEncodeH264NaluSliceEXT* toTransform);
 
 void transform_tohost_VkVideoEncodeH264VclFrameInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH264VclFrameInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH264VclFrameInfoEXT* toTransform);
 
 void transform_fromhost_VkVideoEncodeH264VclFrameInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH264VclFrameInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH264VclFrameInfoEXT* toTransform);
 
 void transform_tohost_VkVideoEncodeH264EmitPictureParametersEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH264EmitPictureParametersEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH264EmitPictureParametersEXT* toTransform);
 
 void transform_fromhost_VkVideoEncodeH264EmitPictureParametersEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH264EmitPictureParametersEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH264EmitPictureParametersEXT* toTransform);
 
-void transform_tohost_VkVideoEncodeH264ProfileEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH264ProfileEXT* toTransform);
+void transform_tohost_VkVideoEncodeH264ProfileEXT(VkDecoderGlobalState* resourceTracker,
+                                                  VkVideoEncodeH264ProfileEXT* toTransform);
 
-void transform_fromhost_VkVideoEncodeH264ProfileEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH264ProfileEXT* toTransform);
+void transform_fromhost_VkVideoEncodeH264ProfileEXT(VkDecoderGlobalState* resourceTracker,
+                                                    VkVideoEncodeH264ProfileEXT* toTransform);
 
 #endif
 #ifdef VK_EXT_video_encode_h265
 void transform_tohost_VkVideoEncodeH265CapabilitiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH265CapabilitiesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH265CapabilitiesEXT* toTransform);
 
 void transform_fromhost_VkVideoEncodeH265CapabilitiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH265CapabilitiesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH265CapabilitiesEXT* toTransform);
 
 void transform_tohost_VkVideoEncodeH265SessionCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH265SessionCreateInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH265SessionCreateInfoEXT* toTransform);
 
 void transform_fromhost_VkVideoEncodeH265SessionCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH265SessionCreateInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH265SessionCreateInfoEXT* toTransform);
 
 void transform_tohost_VkVideoEncodeH265SessionParametersAddInfoEXT(
     VkDecoderGlobalState* resourceTracker,
@@ -3899,79 +3379,61 @@
     VkDecoderGlobalState* resourceTracker,
     VkVideoEncodeH265SessionParametersCreateInfoEXT* toTransform);
 
-void transform_tohost_VkVideoEncodeH265DpbSlotInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH265DpbSlotInfoEXT* toTransform);
+void transform_tohost_VkVideoEncodeH265DpbSlotInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                      VkVideoEncodeH265DpbSlotInfoEXT* toTransform);
 
 void transform_fromhost_VkVideoEncodeH265DpbSlotInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH265DpbSlotInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH265DpbSlotInfoEXT* toTransform);
 
 void transform_tohost_VkVideoEncodeH265ReferenceListsEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH265ReferenceListsEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH265ReferenceListsEXT* toTransform);
 
 void transform_fromhost_VkVideoEncodeH265ReferenceListsEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH265ReferenceListsEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH265ReferenceListsEXT* toTransform);
 
-void transform_tohost_VkVideoEncodeH265NaluSliceEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH265NaluSliceEXT* toTransform);
+void transform_tohost_VkVideoEncodeH265NaluSliceEXT(VkDecoderGlobalState* resourceTracker,
+                                                    VkVideoEncodeH265NaluSliceEXT* toTransform);
 
-void transform_fromhost_VkVideoEncodeH265NaluSliceEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH265NaluSliceEXT* toTransform);
+void transform_fromhost_VkVideoEncodeH265NaluSliceEXT(VkDecoderGlobalState* resourceTracker,
+                                                      VkVideoEncodeH265NaluSliceEXT* toTransform);
 
 void transform_tohost_VkVideoEncodeH265VclFrameInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH265VclFrameInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH265VclFrameInfoEXT* toTransform);
 
 void transform_fromhost_VkVideoEncodeH265VclFrameInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH265VclFrameInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH265VclFrameInfoEXT* toTransform);
 
 void transform_tohost_VkVideoEncodeH265EmitPictureParametersEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH265EmitPictureParametersEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH265EmitPictureParametersEXT* toTransform);
 
 void transform_fromhost_VkVideoEncodeH265EmitPictureParametersEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH265EmitPictureParametersEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoEncodeH265EmitPictureParametersEXT* toTransform);
 
-void transform_tohost_VkVideoEncodeH265ProfileEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH265ProfileEXT* toTransform);
+void transform_tohost_VkVideoEncodeH265ProfileEXT(VkDecoderGlobalState* resourceTracker,
+                                                  VkVideoEncodeH265ProfileEXT* toTransform);
 
-void transform_fromhost_VkVideoEncodeH265ProfileEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoEncodeH265ProfileEXT* toTransform);
+void transform_fromhost_VkVideoEncodeH265ProfileEXT(VkDecoderGlobalState* resourceTracker,
+                                                    VkVideoEncodeH265ProfileEXT* toTransform);
 
 #endif
 #ifdef VK_EXT_video_decode_h264
-void transform_tohost_VkVideoDecodeH264ProfileEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH264ProfileEXT* toTransform);
+void transform_tohost_VkVideoDecodeH264ProfileEXT(VkDecoderGlobalState* resourceTracker,
+                                                  VkVideoDecodeH264ProfileEXT* toTransform);
 
-void transform_fromhost_VkVideoDecodeH264ProfileEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH264ProfileEXT* toTransform);
+void transform_fromhost_VkVideoDecodeH264ProfileEXT(VkDecoderGlobalState* resourceTracker,
+                                                    VkVideoDecodeH264ProfileEXT* toTransform);
 
 void transform_tohost_VkVideoDecodeH264CapabilitiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH264CapabilitiesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoDecodeH264CapabilitiesEXT* toTransform);
 
 void transform_fromhost_VkVideoDecodeH264CapabilitiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH264CapabilitiesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoDecodeH264CapabilitiesEXT* toTransform);
 
 void transform_tohost_VkVideoDecodeH264SessionCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH264SessionCreateInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoDecodeH264SessionCreateInfoEXT* toTransform);
 
 void transform_fromhost_VkVideoDecodeH264SessionCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH264SessionCreateInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoDecodeH264SessionCreateInfoEXT* toTransform);
 
 void transform_tohost_VkVideoDecodeH264SessionParametersAddInfoEXT(
     VkDecoderGlobalState* resourceTracker,
@@ -3989,69 +3451,55 @@
     VkDecoderGlobalState* resourceTracker,
     VkVideoDecodeH264SessionParametersCreateInfoEXT* toTransform);
 
-void transform_tohost_VkVideoDecodeH264PictureInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH264PictureInfoEXT* toTransform);
+void transform_tohost_VkVideoDecodeH264PictureInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                      VkVideoDecodeH264PictureInfoEXT* toTransform);
 
 void transform_fromhost_VkVideoDecodeH264PictureInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH264PictureInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoDecodeH264PictureInfoEXT* toTransform);
 
-void transform_tohost_VkVideoDecodeH264MvcEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH264MvcEXT* toTransform);
+void transform_tohost_VkVideoDecodeH264MvcEXT(VkDecoderGlobalState* resourceTracker,
+                                              VkVideoDecodeH264MvcEXT* toTransform);
 
-void transform_fromhost_VkVideoDecodeH264MvcEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH264MvcEXT* toTransform);
+void transform_fromhost_VkVideoDecodeH264MvcEXT(VkDecoderGlobalState* resourceTracker,
+                                                VkVideoDecodeH264MvcEXT* toTransform);
 
-void transform_tohost_VkVideoDecodeH264DpbSlotInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH264DpbSlotInfoEXT* toTransform);
+void transform_tohost_VkVideoDecodeH264DpbSlotInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                      VkVideoDecodeH264DpbSlotInfoEXT* toTransform);
 
 void transform_fromhost_VkVideoDecodeH264DpbSlotInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH264DpbSlotInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoDecodeH264DpbSlotInfoEXT* toTransform);
 
 #endif
 #ifdef VK_AMD_texture_gather_bias_lod
 void transform_tohost_VkTextureLODGatherFormatPropertiesAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkTextureLODGatherFormatPropertiesAMD* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkTextureLODGatherFormatPropertiesAMD* toTransform);
 
 void transform_fromhost_VkTextureLODGatherFormatPropertiesAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkTextureLODGatherFormatPropertiesAMD* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkTextureLODGatherFormatPropertiesAMD* toTransform);
 
 #endif
 #ifdef VK_AMD_shader_info
-void transform_tohost_VkShaderResourceUsageAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkShaderResourceUsageAMD* toTransform);
+void transform_tohost_VkShaderResourceUsageAMD(VkDecoderGlobalState* resourceTracker,
+                                               VkShaderResourceUsageAMD* toTransform);
 
-void transform_fromhost_VkShaderResourceUsageAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkShaderResourceUsageAMD* toTransform);
+void transform_fromhost_VkShaderResourceUsageAMD(VkDecoderGlobalState* resourceTracker,
+                                                 VkShaderResourceUsageAMD* toTransform);
 
-void transform_tohost_VkShaderStatisticsInfoAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkShaderStatisticsInfoAMD* toTransform);
+void transform_tohost_VkShaderStatisticsInfoAMD(VkDecoderGlobalState* resourceTracker,
+                                                VkShaderStatisticsInfoAMD* toTransform);
 
-void transform_fromhost_VkShaderStatisticsInfoAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkShaderStatisticsInfoAMD* toTransform);
+void transform_fromhost_VkShaderStatisticsInfoAMD(VkDecoderGlobalState* resourceTracker,
+                                                  VkShaderStatisticsInfoAMD* toTransform);
 
 #endif
 #ifdef VK_AMD_shader_image_load_store_lod
 #endif
 #ifdef VK_GGP_stream_descriptor_surface
 void transform_tohost_VkStreamDescriptorSurfaceCreateInfoGGP(
-    VkDecoderGlobalState* resourceTracker,
-    VkStreamDescriptorSurfaceCreateInfoGGP* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkStreamDescriptorSurfaceCreateInfoGGP* toTransform);
 
 void transform_fromhost_VkStreamDescriptorSurfaceCreateInfoGGP(
-    VkDecoderGlobalState* resourceTracker,
-    VkStreamDescriptorSurfaceCreateInfoGGP* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkStreamDescriptorSurfaceCreateInfoGGP* toTransform);
 
 #endif
 #ifdef VK_NV_corner_sampled_image
@@ -4068,78 +3516,62 @@
 #endif
 #ifdef VK_NV_external_memory_capabilities
 void transform_tohost_VkExternalImageFormatPropertiesNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalImageFormatPropertiesNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkExternalImageFormatPropertiesNV* toTransform);
 
 void transform_fromhost_VkExternalImageFormatPropertiesNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalImageFormatPropertiesNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkExternalImageFormatPropertiesNV* toTransform);
 
 #endif
 #ifdef VK_NV_external_memory
 void transform_tohost_VkExternalMemoryImageCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalMemoryImageCreateInfoNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkExternalMemoryImageCreateInfoNV* toTransform);
 
 void transform_fromhost_VkExternalMemoryImageCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalMemoryImageCreateInfoNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkExternalMemoryImageCreateInfoNV* toTransform);
 
-void transform_tohost_VkExportMemoryAllocateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkExportMemoryAllocateInfoNV* toTransform);
+void transform_tohost_VkExportMemoryAllocateInfoNV(VkDecoderGlobalState* resourceTracker,
+                                                   VkExportMemoryAllocateInfoNV* toTransform);
 
-void transform_fromhost_VkExportMemoryAllocateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkExportMemoryAllocateInfoNV* toTransform);
+void transform_fromhost_VkExportMemoryAllocateInfoNV(VkDecoderGlobalState* resourceTracker,
+                                                     VkExportMemoryAllocateInfoNV* toTransform);
 
 #endif
 #ifdef VK_NV_external_memory_win32
-void transform_tohost_VkImportMemoryWin32HandleInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportMemoryWin32HandleInfoNV* toTransform);
+void transform_tohost_VkImportMemoryWin32HandleInfoNV(VkDecoderGlobalState* resourceTracker,
+                                                      VkImportMemoryWin32HandleInfoNV* toTransform);
 
 void transform_fromhost_VkImportMemoryWin32HandleInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportMemoryWin32HandleInfoNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkImportMemoryWin32HandleInfoNV* toTransform);
 
-void transform_tohost_VkExportMemoryWin32HandleInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkExportMemoryWin32HandleInfoNV* toTransform);
+void transform_tohost_VkExportMemoryWin32HandleInfoNV(VkDecoderGlobalState* resourceTracker,
+                                                      VkExportMemoryWin32HandleInfoNV* toTransform);
 
 void transform_fromhost_VkExportMemoryWin32HandleInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkExportMemoryWin32HandleInfoNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkExportMemoryWin32HandleInfoNV* toTransform);
 
 #endif
 #ifdef VK_NV_win32_keyed_mutex
 void transform_tohost_VkWin32KeyedMutexAcquireReleaseInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkWin32KeyedMutexAcquireReleaseInfoNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkWin32KeyedMutexAcquireReleaseInfoNV* toTransform);
 
 void transform_fromhost_VkWin32KeyedMutexAcquireReleaseInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkWin32KeyedMutexAcquireReleaseInfoNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkWin32KeyedMutexAcquireReleaseInfoNV* toTransform);
 
 #endif
 #ifdef VK_EXT_validation_flags
-void transform_tohost_VkValidationFlagsEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkValidationFlagsEXT* toTransform);
+void transform_tohost_VkValidationFlagsEXT(VkDecoderGlobalState* resourceTracker,
+                                           VkValidationFlagsEXT* toTransform);
 
-void transform_fromhost_VkValidationFlagsEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkValidationFlagsEXT* toTransform);
+void transform_fromhost_VkValidationFlagsEXT(VkDecoderGlobalState* resourceTracker,
+                                             VkValidationFlagsEXT* toTransform);
 
 #endif
 #ifdef VK_NN_vi_surface
-void transform_tohost_VkViSurfaceCreateInfoNN(
-    VkDecoderGlobalState* resourceTracker,
-    VkViSurfaceCreateInfoNN* toTransform);
+void transform_tohost_VkViSurfaceCreateInfoNN(VkDecoderGlobalState* resourceTracker,
+                                              VkViSurfaceCreateInfoNN* toTransform);
 
-void transform_fromhost_VkViSurfaceCreateInfoNN(
-    VkDecoderGlobalState* resourceTracker,
-    VkViSurfaceCreateInfoNN* toTransform);
+void transform_fromhost_VkViSurfaceCreateInfoNN(VkDecoderGlobalState* resourceTracker,
+                                                VkViSurfaceCreateInfoNN* toTransform);
 
 #endif
 #ifdef VK_EXT_shader_subgroup_ballot
@@ -4157,31 +3589,25 @@
 
 #endif
 #ifdef VK_EXT_astc_decode_mode
-void transform_tohost_VkImageViewASTCDecodeModeEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageViewASTCDecodeModeEXT* toTransform);
+void transform_tohost_VkImageViewASTCDecodeModeEXT(VkDecoderGlobalState* resourceTracker,
+                                                   VkImageViewASTCDecodeModeEXT* toTransform);
 
-void transform_fromhost_VkImageViewASTCDecodeModeEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageViewASTCDecodeModeEXT* toTransform);
+void transform_fromhost_VkImageViewASTCDecodeModeEXT(VkDecoderGlobalState* resourceTracker,
+                                                     VkImageViewASTCDecodeModeEXT* toTransform);
 
 void transform_tohost_VkPhysicalDeviceASTCDecodeFeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceASTCDecodeFeaturesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceASTCDecodeFeaturesEXT* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceASTCDecodeFeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceASTCDecodeFeaturesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceASTCDecodeFeaturesEXT* toTransform);
 
 #endif
 #ifdef VK_EXT_conditional_rendering
 void transform_tohost_VkConditionalRenderingBeginInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkConditionalRenderingBeginInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkConditionalRenderingBeginInfoEXT* toTransform);
 
 void transform_fromhost_VkConditionalRenderingBeginInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkConditionalRenderingBeginInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkConditionalRenderingBeginInfoEXT* toTransform);
 
 void transform_tohost_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
     VkDecoderGlobalState* resourceTracker,
@@ -4201,13 +3627,11 @@
 
 #endif
 #ifdef VK_NV_clip_space_w_scaling
-void transform_tohost_VkViewportWScalingNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkViewportWScalingNV* toTransform);
+void transform_tohost_VkViewportWScalingNV(VkDecoderGlobalState* resourceTracker,
+                                           VkViewportWScalingNV* toTransform);
 
-void transform_fromhost_VkViewportWScalingNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkViewportWScalingNV* toTransform);
+void transform_fromhost_VkViewportWScalingNV(VkDecoderGlobalState* resourceTracker,
+                                             VkViewportWScalingNV* toTransform);
 
 void transform_tohost_VkPipelineViewportWScalingStateCreateInfoNV(
     VkDecoderGlobalState* resourceTracker,
@@ -4223,81 +3647,63 @@
 #ifdef VK_EXT_acquire_xlib_display
 #endif
 #ifdef VK_EXT_display_surface_counter
-void transform_tohost_VkSurfaceCapabilities2EXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkSurfaceCapabilities2EXT* toTransform);
+void transform_tohost_VkSurfaceCapabilities2EXT(VkDecoderGlobalState* resourceTracker,
+                                                VkSurfaceCapabilities2EXT* toTransform);
 
-void transform_fromhost_VkSurfaceCapabilities2EXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkSurfaceCapabilities2EXT* toTransform);
+void transform_fromhost_VkSurfaceCapabilities2EXT(VkDecoderGlobalState* resourceTracker,
+                                                  VkSurfaceCapabilities2EXT* toTransform);
 
 #endif
 #ifdef VK_EXT_display_control
-void transform_tohost_VkDisplayPowerInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayPowerInfoEXT* toTransform);
+void transform_tohost_VkDisplayPowerInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                            VkDisplayPowerInfoEXT* toTransform);
 
-void transform_fromhost_VkDisplayPowerInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayPowerInfoEXT* toTransform);
+void transform_fromhost_VkDisplayPowerInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                              VkDisplayPowerInfoEXT* toTransform);
 
-void transform_tohost_VkDeviceEventInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceEventInfoEXT* toTransform);
+void transform_tohost_VkDeviceEventInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                           VkDeviceEventInfoEXT* toTransform);
 
-void transform_fromhost_VkDeviceEventInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceEventInfoEXT* toTransform);
+void transform_fromhost_VkDeviceEventInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                             VkDeviceEventInfoEXT* toTransform);
 
-void transform_tohost_VkDisplayEventInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayEventInfoEXT* toTransform);
+void transform_tohost_VkDisplayEventInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                            VkDisplayEventInfoEXT* toTransform);
 
-void transform_fromhost_VkDisplayEventInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayEventInfoEXT* toTransform);
+void transform_fromhost_VkDisplayEventInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                              VkDisplayEventInfoEXT* toTransform);
 
-void transform_tohost_VkSwapchainCounterCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkSwapchainCounterCreateInfoEXT* toTransform);
+void transform_tohost_VkSwapchainCounterCreateInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                      VkSwapchainCounterCreateInfoEXT* toTransform);
 
 void transform_fromhost_VkSwapchainCounterCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkSwapchainCounterCreateInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkSwapchainCounterCreateInfoEXT* toTransform);
 
 #endif
 #ifdef VK_GOOGLE_display_timing
-void transform_tohost_VkRefreshCycleDurationGOOGLE(
-    VkDecoderGlobalState* resourceTracker,
-    VkRefreshCycleDurationGOOGLE* toTransform);
+void transform_tohost_VkRefreshCycleDurationGOOGLE(VkDecoderGlobalState* resourceTracker,
+                                                   VkRefreshCycleDurationGOOGLE* toTransform);
 
-void transform_fromhost_VkRefreshCycleDurationGOOGLE(
-    VkDecoderGlobalState* resourceTracker,
-    VkRefreshCycleDurationGOOGLE* toTransform);
+void transform_fromhost_VkRefreshCycleDurationGOOGLE(VkDecoderGlobalState* resourceTracker,
+                                                     VkRefreshCycleDurationGOOGLE* toTransform);
 
-void transform_tohost_VkPastPresentationTimingGOOGLE(
-    VkDecoderGlobalState* resourceTracker,
-    VkPastPresentationTimingGOOGLE* toTransform);
+void transform_tohost_VkPastPresentationTimingGOOGLE(VkDecoderGlobalState* resourceTracker,
+                                                     VkPastPresentationTimingGOOGLE* toTransform);
 
-void transform_fromhost_VkPastPresentationTimingGOOGLE(
-    VkDecoderGlobalState* resourceTracker,
-    VkPastPresentationTimingGOOGLE* toTransform);
+void transform_fromhost_VkPastPresentationTimingGOOGLE(VkDecoderGlobalState* resourceTracker,
+                                                       VkPastPresentationTimingGOOGLE* toTransform);
 
-void transform_tohost_VkPresentTimeGOOGLE(
-    VkDecoderGlobalState* resourceTracker,
-    VkPresentTimeGOOGLE* toTransform);
+void transform_tohost_VkPresentTimeGOOGLE(VkDecoderGlobalState* resourceTracker,
+                                          VkPresentTimeGOOGLE* toTransform);
 
-void transform_fromhost_VkPresentTimeGOOGLE(
-    VkDecoderGlobalState* resourceTracker,
-    VkPresentTimeGOOGLE* toTransform);
+void transform_fromhost_VkPresentTimeGOOGLE(VkDecoderGlobalState* resourceTracker,
+                                            VkPresentTimeGOOGLE* toTransform);
 
-void transform_tohost_VkPresentTimesInfoGOOGLE(
-    VkDecoderGlobalState* resourceTracker,
-    VkPresentTimesInfoGOOGLE* toTransform);
+void transform_tohost_VkPresentTimesInfoGOOGLE(VkDecoderGlobalState* resourceTracker,
+                                               VkPresentTimesInfoGOOGLE* toTransform);
 
-void transform_fromhost_VkPresentTimesInfoGOOGLE(
-    VkDecoderGlobalState* resourceTracker,
-    VkPresentTimesInfoGOOGLE* toTransform);
+void transform_fromhost_VkPresentTimesInfoGOOGLE(VkDecoderGlobalState* resourceTracker,
+                                                 VkPresentTimesInfoGOOGLE* toTransform);
 
 #endif
 #ifdef VK_NV_sample_mask_override_coverage
@@ -4317,21 +3723,17 @@
 
 #endif
 #ifdef VK_NV_viewport_swizzle
-void transform_tohost_VkViewportSwizzleNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkViewportSwizzleNV* toTransform);
+void transform_tohost_VkViewportSwizzleNV(VkDecoderGlobalState* resourceTracker,
+                                          VkViewportSwizzleNV* toTransform);
 
-void transform_fromhost_VkViewportSwizzleNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkViewportSwizzleNV* toTransform);
+void transform_fromhost_VkViewportSwizzleNV(VkDecoderGlobalState* resourceTracker,
+                                            VkViewportSwizzleNV* toTransform);
 
 void transform_tohost_VkPipelineViewportSwizzleStateCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineViewportSwizzleStateCreateInfoNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineViewportSwizzleStateCreateInfoNV* toTransform);
 
 void transform_fromhost_VkPipelineViewportSwizzleStateCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineViewportSwizzleStateCreateInfoNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineViewportSwizzleStateCreateInfoNV* toTransform);
 
 #endif
 #ifdef VK_EXT_discard_rectangles
@@ -4372,12 +3774,10 @@
 #endif
 #ifdef VK_EXT_depth_clip_enable
 void transform_tohost_VkPhysicalDeviceDepthClipEnableFeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceDepthClipEnableFeaturesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceDepthClipEnableFeaturesEXT* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceDepthClipEnableFeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceDepthClipEnableFeaturesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceDepthClipEnableFeaturesEXT* toTransform);
 
 void transform_tohost_VkPipelineRasterizationDepthClipStateCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
@@ -4391,41 +3791,33 @@
 #ifdef VK_EXT_swapchain_colorspace
 #endif
 #ifdef VK_EXT_hdr_metadata
-void transform_tohost_VkXYColorEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkXYColorEXT* toTransform);
+void transform_tohost_VkXYColorEXT(VkDecoderGlobalState* resourceTracker,
+                                   VkXYColorEXT* toTransform);
 
-void transform_fromhost_VkXYColorEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkXYColorEXT* toTransform);
+void transform_fromhost_VkXYColorEXT(VkDecoderGlobalState* resourceTracker,
+                                     VkXYColorEXT* toTransform);
 
-void transform_tohost_VkHdrMetadataEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkHdrMetadataEXT* toTransform);
+void transform_tohost_VkHdrMetadataEXT(VkDecoderGlobalState* resourceTracker,
+                                       VkHdrMetadataEXT* toTransform);
 
-void transform_fromhost_VkHdrMetadataEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkHdrMetadataEXT* toTransform);
+void transform_fromhost_VkHdrMetadataEXT(VkDecoderGlobalState* resourceTracker,
+                                         VkHdrMetadataEXT* toTransform);
 
 #endif
 #ifdef VK_MVK_ios_surface
-void transform_tohost_VkIOSSurfaceCreateInfoMVK(
-    VkDecoderGlobalState* resourceTracker,
-    VkIOSSurfaceCreateInfoMVK* toTransform);
+void transform_tohost_VkIOSSurfaceCreateInfoMVK(VkDecoderGlobalState* resourceTracker,
+                                                VkIOSSurfaceCreateInfoMVK* toTransform);
 
-void transform_fromhost_VkIOSSurfaceCreateInfoMVK(
-    VkDecoderGlobalState* resourceTracker,
-    VkIOSSurfaceCreateInfoMVK* toTransform);
+void transform_fromhost_VkIOSSurfaceCreateInfoMVK(VkDecoderGlobalState* resourceTracker,
+                                                  VkIOSSurfaceCreateInfoMVK* toTransform);
 
 #endif
 #ifdef VK_MVK_macos_surface
-void transform_tohost_VkMacOSSurfaceCreateInfoMVK(
-    VkDecoderGlobalState* resourceTracker,
-    VkMacOSSurfaceCreateInfoMVK* toTransform);
+void transform_tohost_VkMacOSSurfaceCreateInfoMVK(VkDecoderGlobalState* resourceTracker,
+                                                  VkMacOSSurfaceCreateInfoMVK* toTransform);
 
-void transform_fromhost_VkMacOSSurfaceCreateInfoMVK(
-    VkDecoderGlobalState* resourceTracker,
-    VkMacOSSurfaceCreateInfoMVK* toTransform);
+void transform_fromhost_VkMacOSSurfaceCreateInfoMVK(VkDecoderGlobalState* resourceTracker,
+                                                    VkMacOSSurfaceCreateInfoMVK* toTransform);
 
 #endif
 #ifdef VK_MVK_moltenvk
@@ -4435,63 +3827,49 @@
 #ifdef VK_EXT_queue_family_foreign
 #endif
 #ifdef VK_EXT_debug_utils
-void transform_tohost_VkDebugUtilsLabelEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDebugUtilsLabelEXT* toTransform);
+void transform_tohost_VkDebugUtilsLabelEXT(VkDecoderGlobalState* resourceTracker,
+                                           VkDebugUtilsLabelEXT* toTransform);
 
-void transform_fromhost_VkDebugUtilsLabelEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDebugUtilsLabelEXT* toTransform);
+void transform_fromhost_VkDebugUtilsLabelEXT(VkDecoderGlobalState* resourceTracker,
+                                             VkDebugUtilsLabelEXT* toTransform);
 
-void transform_tohost_VkDebugUtilsObjectNameInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDebugUtilsObjectNameInfoEXT* toTransform);
+void transform_tohost_VkDebugUtilsObjectNameInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                    VkDebugUtilsObjectNameInfoEXT* toTransform);
 
-void transform_fromhost_VkDebugUtilsObjectNameInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDebugUtilsObjectNameInfoEXT* toTransform);
+void transform_fromhost_VkDebugUtilsObjectNameInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                      VkDebugUtilsObjectNameInfoEXT* toTransform);
 
 void transform_tohost_VkDebugUtilsMessengerCallbackDataEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDebugUtilsMessengerCallbackDataEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDebugUtilsMessengerCallbackDataEXT* toTransform);
 
 void transform_fromhost_VkDebugUtilsMessengerCallbackDataEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDebugUtilsMessengerCallbackDataEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDebugUtilsMessengerCallbackDataEXT* toTransform);
 
 void transform_tohost_VkDebugUtilsMessengerCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDebugUtilsMessengerCreateInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDebugUtilsMessengerCreateInfoEXT* toTransform);
 
 void transform_fromhost_VkDebugUtilsMessengerCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDebugUtilsMessengerCreateInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDebugUtilsMessengerCreateInfoEXT* toTransform);
 
-void transform_tohost_VkDebugUtilsObjectTagInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDebugUtilsObjectTagInfoEXT* toTransform);
+void transform_tohost_VkDebugUtilsObjectTagInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                   VkDebugUtilsObjectTagInfoEXT* toTransform);
 
-void transform_fromhost_VkDebugUtilsObjectTagInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDebugUtilsObjectTagInfoEXT* toTransform);
+void transform_fromhost_VkDebugUtilsObjectTagInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                     VkDebugUtilsObjectTagInfoEXT* toTransform);
 
 #endif
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
 void transform_tohost_VkAndroidHardwareBufferUsageANDROID(
-    VkDecoderGlobalState* resourceTracker,
-    VkAndroidHardwareBufferUsageANDROID* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkAndroidHardwareBufferUsageANDROID* toTransform);
 
 void transform_fromhost_VkAndroidHardwareBufferUsageANDROID(
-    VkDecoderGlobalState* resourceTracker,
-    VkAndroidHardwareBufferUsageANDROID* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkAndroidHardwareBufferUsageANDROID* toTransform);
 
 void transform_tohost_VkAndroidHardwareBufferPropertiesANDROID(
-    VkDecoderGlobalState* resourceTracker,
-    VkAndroidHardwareBufferPropertiesANDROID* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkAndroidHardwareBufferPropertiesANDROID* toTransform);
 
 void transform_fromhost_VkAndroidHardwareBufferPropertiesANDROID(
-    VkDecoderGlobalState* resourceTracker,
-    VkAndroidHardwareBufferPropertiesANDROID* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkAndroidHardwareBufferPropertiesANDROID* toTransform);
 
 void transform_tohost_VkAndroidHardwareBufferFormatPropertiesANDROID(
     VkDecoderGlobalState* resourceTracker,
@@ -4502,12 +3880,10 @@
     VkAndroidHardwareBufferFormatPropertiesANDROID* toTransform);
 
 void transform_tohost_VkImportAndroidHardwareBufferInfoANDROID(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportAndroidHardwareBufferInfoANDROID* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkImportAndroidHardwareBufferInfoANDROID* toTransform);
 
 void transform_fromhost_VkImportAndroidHardwareBufferInfoANDROID(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportAndroidHardwareBufferInfoANDROID* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkImportAndroidHardwareBufferInfoANDROID* toTransform);
 
 void transform_tohost_VkMemoryGetAndroidHardwareBufferInfoANDROID(
     VkDecoderGlobalState* resourceTracker,
@@ -4517,13 +3893,11 @@
     VkDecoderGlobalState* resourceTracker,
     VkMemoryGetAndroidHardwareBufferInfoANDROID* toTransform);
 
-void transform_tohost_VkExternalFormatANDROID(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalFormatANDROID* toTransform);
+void transform_tohost_VkExternalFormatANDROID(VkDecoderGlobalState* resourceTracker,
+                                              VkExternalFormatANDROID* toTransform);
 
-void transform_fromhost_VkExternalFormatANDROID(
-    VkDecoderGlobalState* resourceTracker,
-    VkExternalFormatANDROID* toTransform);
+void transform_fromhost_VkExternalFormatANDROID(VkDecoderGlobalState* resourceTracker,
+                                                VkExternalFormatANDROID* toTransform);
 
 void transform_tohost_VkAndroidHardwareBufferFormatProperties2ANDROID(
     VkDecoderGlobalState* resourceTracker,
@@ -4535,13 +3909,17 @@
 
 #endif
 #ifdef VK_EXT_sampler_filter_minmax
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkSamplerReductionModeCreateInfo, transform_tohost_VkSamplerReductionModeCreateInfoEXT)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkSamplerReductionModeCreateInfo,
+                      transform_tohost_VkSamplerReductionModeCreateInfoEXT)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkSamplerReductionModeCreateInfo, transform_fromhost_VkSamplerReductionModeCreateInfoEXT)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkSamplerReductionModeCreateInfo,
+                      transform_fromhost_VkSamplerReductionModeCreateInfoEXT)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceSamplerFilterMinmaxProperties, transform_tohost_VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceSamplerFilterMinmaxProperties,
+                      transform_tohost_VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceSamplerFilterMinmaxProperties, transform_fromhost_VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceSamplerFilterMinmaxProperties,
+                      transform_fromhost_VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT)
 
 #endif
 #ifdef VK_AMD_gpu_shader_int16
@@ -4568,12 +3946,10 @@
     VkPhysicalDeviceInlineUniformBlockPropertiesEXT* toTransform);
 
 void transform_tohost_VkWriteDescriptorSetInlineUniformBlockEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkWriteDescriptorSetInlineUniformBlockEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkWriteDescriptorSetInlineUniformBlockEXT* toTransform);
 
 void transform_fromhost_VkWriteDescriptorSetInlineUniformBlockEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkWriteDescriptorSetInlineUniformBlockEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkWriteDescriptorSetInlineUniformBlockEXT* toTransform);
 
 void transform_tohost_VkDescriptorPoolInlineUniformBlockCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
@@ -4587,45 +3963,35 @@
 #ifdef VK_EXT_shader_stencil_export
 #endif
 #ifdef VK_EXT_sample_locations
-void transform_tohost_VkSampleLocationEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkSampleLocationEXT* toTransform);
+void transform_tohost_VkSampleLocationEXT(VkDecoderGlobalState* resourceTracker,
+                                          VkSampleLocationEXT* toTransform);
 
-void transform_fromhost_VkSampleLocationEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkSampleLocationEXT* toTransform);
+void transform_fromhost_VkSampleLocationEXT(VkDecoderGlobalState* resourceTracker,
+                                            VkSampleLocationEXT* toTransform);
 
-void transform_tohost_VkSampleLocationsInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkSampleLocationsInfoEXT* toTransform);
+void transform_tohost_VkSampleLocationsInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                               VkSampleLocationsInfoEXT* toTransform);
 
-void transform_fromhost_VkSampleLocationsInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkSampleLocationsInfoEXT* toTransform);
+void transform_fromhost_VkSampleLocationsInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                 VkSampleLocationsInfoEXT* toTransform);
 
-void transform_tohost_VkAttachmentSampleLocationsEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkAttachmentSampleLocationsEXT* toTransform);
+void transform_tohost_VkAttachmentSampleLocationsEXT(VkDecoderGlobalState* resourceTracker,
+                                                     VkAttachmentSampleLocationsEXT* toTransform);
 
-void transform_fromhost_VkAttachmentSampleLocationsEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkAttachmentSampleLocationsEXT* toTransform);
+void transform_fromhost_VkAttachmentSampleLocationsEXT(VkDecoderGlobalState* resourceTracker,
+                                                       VkAttachmentSampleLocationsEXT* toTransform);
 
-void transform_tohost_VkSubpassSampleLocationsEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubpassSampleLocationsEXT* toTransform);
+void transform_tohost_VkSubpassSampleLocationsEXT(VkDecoderGlobalState* resourceTracker,
+                                                  VkSubpassSampleLocationsEXT* toTransform);
 
-void transform_fromhost_VkSubpassSampleLocationsEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubpassSampleLocationsEXT* toTransform);
+void transform_fromhost_VkSubpassSampleLocationsEXT(VkDecoderGlobalState* resourceTracker,
+                                                    VkSubpassSampleLocationsEXT* toTransform);
 
 void transform_tohost_VkRenderPassSampleLocationsBeginInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkRenderPassSampleLocationsBeginInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkRenderPassSampleLocationsBeginInfoEXT* toTransform);
 
 void transform_fromhost_VkRenderPassSampleLocationsBeginInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkRenderPassSampleLocationsBeginInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkRenderPassSampleLocationsBeginInfoEXT* toTransform);
 
 void transform_tohost_VkPipelineSampleLocationsStateCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
@@ -4643,13 +4009,11 @@
     VkDecoderGlobalState* resourceTracker,
     VkPhysicalDeviceSampleLocationsPropertiesEXT* toTransform);
 
-void transform_tohost_VkMultisamplePropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkMultisamplePropertiesEXT* toTransform);
+void transform_tohost_VkMultisamplePropertiesEXT(VkDecoderGlobalState* resourceTracker,
+                                                 VkMultisamplePropertiesEXT* toTransform);
 
-void transform_fromhost_VkMultisamplePropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkMultisamplePropertiesEXT* toTransform);
+void transform_fromhost_VkMultisamplePropertiesEXT(VkDecoderGlobalState* resourceTracker,
+                                                   VkMultisamplePropertiesEXT* toTransform);
 
 #endif
 #ifdef VK_EXT_blend_operation_advanced
@@ -4680,12 +4044,10 @@
 #endif
 #ifdef VK_NV_fragment_coverage_to_color
 void transform_tohost_VkPipelineCoverageToColorStateCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineCoverageToColorStateCreateInfoNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineCoverageToColorStateCreateInfoNV* toTransform);
 
 void transform_fromhost_VkPipelineCoverageToColorStateCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineCoverageToColorStateCreateInfoNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineCoverageToColorStateCreateInfoNV* toTransform);
 
 #endif
 #ifdef VK_NV_framebuffer_mixed_samples
@@ -4710,32 +4072,26 @@
     VkPhysicalDeviceShaderSMBuiltinsPropertiesNV* toTransform);
 
 void transform_tohost_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceShaderSMBuiltinsFeaturesNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceShaderSMBuiltinsFeaturesNV* toTransform);
 
 #endif
 #ifdef VK_EXT_post_depth_coverage
 #endif
 #ifdef VK_EXT_image_drm_format_modifier
 void transform_tohost_VkDrmFormatModifierPropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDrmFormatModifierPropertiesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDrmFormatModifierPropertiesEXT* toTransform);
 
 void transform_fromhost_VkDrmFormatModifierPropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDrmFormatModifierPropertiesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDrmFormatModifierPropertiesEXT* toTransform);
 
 void transform_tohost_VkDrmFormatModifierPropertiesListEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDrmFormatModifierPropertiesListEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDrmFormatModifierPropertiesListEXT* toTransform);
 
 void transform_fromhost_VkDrmFormatModifierPropertiesListEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDrmFormatModifierPropertiesListEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDrmFormatModifierPropertiesListEXT* toTransform);
 
 void transform_tohost_VkPhysicalDeviceImageDrmFormatModifierInfoEXT(
     VkDecoderGlobalState* resourceTracker,
@@ -4746,12 +4102,10 @@
     VkPhysicalDeviceImageDrmFormatModifierInfoEXT* toTransform);
 
 void transform_tohost_VkImageDrmFormatModifierListCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageDrmFormatModifierListCreateInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkImageDrmFormatModifierListCreateInfoEXT* toTransform);
 
 void transform_fromhost_VkImageDrmFormatModifierListCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageDrmFormatModifierListCreateInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkImageDrmFormatModifierListCreateInfoEXT* toTransform);
 
 void transform_tohost_VkImageDrmFormatModifierExplicitCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
@@ -4762,80 +4116,78 @@
     VkImageDrmFormatModifierExplicitCreateInfoEXT* toTransform);
 
 void transform_tohost_VkImageDrmFormatModifierPropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageDrmFormatModifierPropertiesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkImageDrmFormatModifierPropertiesEXT* toTransform);
 
 void transform_fromhost_VkImageDrmFormatModifierPropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageDrmFormatModifierPropertiesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkImageDrmFormatModifierPropertiesEXT* toTransform);
 
 void transform_tohost_VkDrmFormatModifierProperties2EXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDrmFormatModifierProperties2EXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDrmFormatModifierProperties2EXT* toTransform);
 
 void transform_fromhost_VkDrmFormatModifierProperties2EXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDrmFormatModifierProperties2EXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDrmFormatModifierProperties2EXT* toTransform);
 
 void transform_tohost_VkDrmFormatModifierPropertiesList2EXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDrmFormatModifierPropertiesList2EXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDrmFormatModifierPropertiesList2EXT* toTransform);
 
 void transform_fromhost_VkDrmFormatModifierPropertiesList2EXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDrmFormatModifierPropertiesList2EXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDrmFormatModifierPropertiesList2EXT* toTransform);
 
 #endif
 #ifdef VK_EXT_validation_cache
-void transform_tohost_VkValidationCacheCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkValidationCacheCreateInfoEXT* toTransform);
+void transform_tohost_VkValidationCacheCreateInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                     VkValidationCacheCreateInfoEXT* toTransform);
 
-void transform_fromhost_VkValidationCacheCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkValidationCacheCreateInfoEXT* toTransform);
+void transform_fromhost_VkValidationCacheCreateInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                       VkValidationCacheCreateInfoEXT* toTransform);
 
 void transform_tohost_VkShaderModuleValidationCacheCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkShaderModuleValidationCacheCreateInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkShaderModuleValidationCacheCreateInfoEXT* toTransform);
 
 void transform_fromhost_VkShaderModuleValidationCacheCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkShaderModuleValidationCacheCreateInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkShaderModuleValidationCacheCreateInfoEXT* toTransform);
 
 #endif
 #ifdef VK_EXT_descriptor_indexing
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkDescriptorSetLayoutBindingFlagsCreateInfo, transform_tohost_VkDescriptorSetLayoutBindingFlagsCreateInfoEXT)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkDescriptorSetLayoutBindingFlagsCreateInfo,
+                      transform_tohost_VkDescriptorSetLayoutBindingFlagsCreateInfoEXT)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkDescriptorSetLayoutBindingFlagsCreateInfo, transform_fromhost_VkDescriptorSetLayoutBindingFlagsCreateInfoEXT)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkDescriptorSetLayoutBindingFlagsCreateInfo,
+                      transform_fromhost_VkDescriptorSetLayoutBindingFlagsCreateInfoEXT)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceDescriptorIndexingFeatures, transform_tohost_VkPhysicalDeviceDescriptorIndexingFeaturesEXT)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceDescriptorIndexingFeatures,
+                      transform_tohost_VkPhysicalDeviceDescriptorIndexingFeaturesEXT)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceDescriptorIndexingFeatures, transform_fromhost_VkPhysicalDeviceDescriptorIndexingFeaturesEXT)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceDescriptorIndexingFeatures,
+                      transform_fromhost_VkPhysicalDeviceDescriptorIndexingFeaturesEXT)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceDescriptorIndexingProperties, transform_tohost_VkPhysicalDeviceDescriptorIndexingPropertiesEXT)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceDescriptorIndexingProperties,
+                      transform_tohost_VkPhysicalDeviceDescriptorIndexingPropertiesEXT)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceDescriptorIndexingProperties, transform_fromhost_VkPhysicalDeviceDescriptorIndexingPropertiesEXT)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceDescriptorIndexingProperties,
+                      transform_fromhost_VkPhysicalDeviceDescriptorIndexingPropertiesEXT)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkDescriptorSetVariableDescriptorCountAllocateInfo, transform_tohost_VkDescriptorSetVariableDescriptorCountAllocateInfoEXT)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkDescriptorSetVariableDescriptorCountAllocateInfo,
+                      transform_tohost_VkDescriptorSetVariableDescriptorCountAllocateInfoEXT)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkDescriptorSetVariableDescriptorCountAllocateInfo, transform_fromhost_VkDescriptorSetVariableDescriptorCountAllocateInfoEXT)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkDescriptorSetVariableDescriptorCountAllocateInfo,
+                      transform_fromhost_VkDescriptorSetVariableDescriptorCountAllocateInfoEXT)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkDescriptorSetVariableDescriptorCountLayoutSupport, transform_tohost_VkDescriptorSetVariableDescriptorCountLayoutSupportEXT)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkDescriptorSetVariableDescriptorCountLayoutSupport,
+                      transform_tohost_VkDescriptorSetVariableDescriptorCountLayoutSupportEXT)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkDescriptorSetVariableDescriptorCountLayoutSupport, transform_fromhost_VkDescriptorSetVariableDescriptorCountLayoutSupportEXT)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkDescriptorSetVariableDescriptorCountLayoutSupport,
+                      transform_fromhost_VkDescriptorSetVariableDescriptorCountLayoutSupportEXT)
 
 #endif
 #ifdef VK_EXT_shader_viewport_index_layer
 #endif
 #ifdef VK_NV_shading_rate_image
-void transform_tohost_VkShadingRatePaletteNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkShadingRatePaletteNV* toTransform);
+void transform_tohost_VkShadingRatePaletteNV(VkDecoderGlobalState* resourceTracker,
+                                             VkShadingRatePaletteNV* toTransform);
 
-void transform_fromhost_VkShadingRatePaletteNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkShadingRatePaletteNV* toTransform);
+void transform_fromhost_VkShadingRatePaletteNV(VkDecoderGlobalState* resourceTracker,
+                                               VkShadingRatePaletteNV* toTransform);
 
 void transform_tohost_VkPipelineViewportShadingRateImageStateCreateInfoNV(
     VkDecoderGlobalState* resourceTracker,
@@ -4846,12 +4198,10 @@
     VkPipelineViewportShadingRateImageStateCreateInfoNV* toTransform);
 
 void transform_tohost_VkPhysicalDeviceShadingRateImageFeaturesNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShadingRateImageFeaturesNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceShadingRateImageFeaturesNV* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceShadingRateImageFeaturesNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShadingRateImageFeaturesNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceShadingRateImageFeaturesNV* toTransform);
 
 void transform_tohost_VkPhysicalDeviceShadingRateImagePropertiesNV(
     VkDecoderGlobalState* resourceTracker,
@@ -4861,21 +4211,17 @@
     VkDecoderGlobalState* resourceTracker,
     VkPhysicalDeviceShadingRateImagePropertiesNV* toTransform);
 
-void transform_tohost_VkCoarseSampleLocationNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkCoarseSampleLocationNV* toTransform);
+void transform_tohost_VkCoarseSampleLocationNV(VkDecoderGlobalState* resourceTracker,
+                                               VkCoarseSampleLocationNV* toTransform);
 
-void transform_fromhost_VkCoarseSampleLocationNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkCoarseSampleLocationNV* toTransform);
+void transform_fromhost_VkCoarseSampleLocationNV(VkDecoderGlobalState* resourceTracker,
+                                                 VkCoarseSampleLocationNV* toTransform);
 
-void transform_tohost_VkCoarseSampleOrderCustomNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkCoarseSampleOrderCustomNV* toTransform);
+void transform_tohost_VkCoarseSampleOrderCustomNV(VkDecoderGlobalState* resourceTracker,
+                                                  VkCoarseSampleOrderCustomNV* toTransform);
 
-void transform_fromhost_VkCoarseSampleOrderCustomNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkCoarseSampleOrderCustomNV* toTransform);
+void transform_fromhost_VkCoarseSampleOrderCustomNV(VkDecoderGlobalState* resourceTracker,
+                                                    VkCoarseSampleOrderCustomNV* toTransform);
 
 void transform_tohost_VkPipelineViewportCoarseSampleOrderStateCreateInfoNV(
     VkDecoderGlobalState* resourceTracker,
@@ -4888,76 +4234,58 @@
 #endif
 #ifdef VK_NV_ray_tracing
 void transform_tohost_VkRayTracingShaderGroupCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkRayTracingShaderGroupCreateInfoNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkRayTracingShaderGroupCreateInfoNV* toTransform);
 
 void transform_fromhost_VkRayTracingShaderGroupCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkRayTracingShaderGroupCreateInfoNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkRayTracingShaderGroupCreateInfoNV* toTransform);
 
 void transform_tohost_VkRayTracingPipelineCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkRayTracingPipelineCreateInfoNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkRayTracingPipelineCreateInfoNV* toTransform);
 
 void transform_fromhost_VkRayTracingPipelineCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkRayTracingPipelineCreateInfoNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkRayTracingPipelineCreateInfoNV* toTransform);
 
-void transform_tohost_VkGeometryTrianglesNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkGeometryTrianglesNV* toTransform);
+void transform_tohost_VkGeometryTrianglesNV(VkDecoderGlobalState* resourceTracker,
+                                            VkGeometryTrianglesNV* toTransform);
 
-void transform_fromhost_VkGeometryTrianglesNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkGeometryTrianglesNV* toTransform);
+void transform_fromhost_VkGeometryTrianglesNV(VkDecoderGlobalState* resourceTracker,
+                                              VkGeometryTrianglesNV* toTransform);
 
-void transform_tohost_VkGeometryAABBNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkGeometryAABBNV* toTransform);
+void transform_tohost_VkGeometryAABBNV(VkDecoderGlobalState* resourceTracker,
+                                       VkGeometryAABBNV* toTransform);
 
-void transform_fromhost_VkGeometryAABBNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkGeometryAABBNV* toTransform);
+void transform_fromhost_VkGeometryAABBNV(VkDecoderGlobalState* resourceTracker,
+                                         VkGeometryAABBNV* toTransform);
 
-void transform_tohost_VkGeometryDataNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkGeometryDataNV* toTransform);
+void transform_tohost_VkGeometryDataNV(VkDecoderGlobalState* resourceTracker,
+                                       VkGeometryDataNV* toTransform);
 
-void transform_fromhost_VkGeometryDataNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkGeometryDataNV* toTransform);
+void transform_fromhost_VkGeometryDataNV(VkDecoderGlobalState* resourceTracker,
+                                         VkGeometryDataNV* toTransform);
 
-void transform_tohost_VkGeometryNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkGeometryNV* toTransform);
+void transform_tohost_VkGeometryNV(VkDecoderGlobalState* resourceTracker,
+                                   VkGeometryNV* toTransform);
 
-void transform_fromhost_VkGeometryNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkGeometryNV* toTransform);
+void transform_fromhost_VkGeometryNV(VkDecoderGlobalState* resourceTracker,
+                                     VkGeometryNV* toTransform);
 
-void transform_tohost_VkAccelerationStructureInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureInfoNV* toTransform);
+void transform_tohost_VkAccelerationStructureInfoNV(VkDecoderGlobalState* resourceTracker,
+                                                    VkAccelerationStructureInfoNV* toTransform);
 
-void transform_fromhost_VkAccelerationStructureInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureInfoNV* toTransform);
+void transform_fromhost_VkAccelerationStructureInfoNV(VkDecoderGlobalState* resourceTracker,
+                                                      VkAccelerationStructureInfoNV* toTransform);
 
 void transform_tohost_VkAccelerationStructureCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureCreateInfoNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureCreateInfoNV* toTransform);
 
 void transform_fromhost_VkAccelerationStructureCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureCreateInfoNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureCreateInfoNV* toTransform);
 
 void transform_tohost_VkBindAccelerationStructureMemoryInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindAccelerationStructureMemoryInfoNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkBindAccelerationStructureMemoryInfoNV* toTransform);
 
 void transform_fromhost_VkBindAccelerationStructureMemoryInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindAccelerationStructureMemoryInfoNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkBindAccelerationStructureMemoryInfoNV* toTransform);
 
 void transform_tohost_VkWriteDescriptorSetAccelerationStructureNV(
     VkDecoderGlobalState* resourceTracker,
@@ -4976,48 +4304,43 @@
     VkAccelerationStructureMemoryRequirementsInfoNV* toTransform);
 
 void transform_tohost_VkPhysicalDeviceRayTracingPropertiesNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceRayTracingPropertiesNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceRayTracingPropertiesNV* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceRayTracingPropertiesNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceRayTracingPropertiesNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceRayTracingPropertiesNV* toTransform);
 
-void transform_tohost_VkTransformMatrixKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkTransformMatrixKHR* toTransform);
+void transform_tohost_VkTransformMatrixKHR(VkDecoderGlobalState* resourceTracker,
+                                           VkTransformMatrixKHR* toTransform);
 
-void transform_fromhost_VkTransformMatrixKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkTransformMatrixKHR* toTransform);
+void transform_fromhost_VkTransformMatrixKHR(VkDecoderGlobalState* resourceTracker,
+                                             VkTransformMatrixKHR* toTransform);
 
 DEFINE_ALIAS_FUNCTION(transform_tohost_VkTransformMatrixKHR, transform_tohost_VkTransformMatrixNV)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkTransformMatrixKHR, transform_fromhost_VkTransformMatrixNV)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkTransformMatrixKHR,
+                      transform_fromhost_VkTransformMatrixNV)
 
-void transform_tohost_VkAabbPositionsKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAabbPositionsKHR* toTransform);
+void transform_tohost_VkAabbPositionsKHR(VkDecoderGlobalState* resourceTracker,
+                                         VkAabbPositionsKHR* toTransform);
 
-void transform_fromhost_VkAabbPositionsKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAabbPositionsKHR* toTransform);
+void transform_fromhost_VkAabbPositionsKHR(VkDecoderGlobalState* resourceTracker,
+                                           VkAabbPositionsKHR* toTransform);
 
 DEFINE_ALIAS_FUNCTION(transform_tohost_VkAabbPositionsKHR, transform_tohost_VkAabbPositionsNV)
 
 DEFINE_ALIAS_FUNCTION(transform_fromhost_VkAabbPositionsKHR, transform_fromhost_VkAabbPositionsNV)
 
 void transform_tohost_VkAccelerationStructureInstanceKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureInstanceKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureInstanceKHR* toTransform);
 
 void transform_fromhost_VkAccelerationStructureInstanceKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureInstanceKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureInstanceKHR* toTransform);
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkAccelerationStructureInstanceKHR, transform_tohost_VkAccelerationStructureInstanceNV)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkAccelerationStructureInstanceKHR,
+                      transform_tohost_VkAccelerationStructureInstanceNV)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkAccelerationStructureInstanceKHR, transform_fromhost_VkAccelerationStructureInstanceNV)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkAccelerationStructureInstanceKHR,
+                      transform_fromhost_VkAccelerationStructureInstanceNV)
 
 #endif
 #ifdef VK_NV_representative_fragment_test
@@ -5060,30 +4383,24 @@
 #endif
 #ifdef VK_EXT_global_priority
 void transform_tohost_VkDeviceQueueGlobalPriorityCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceQueueGlobalPriorityCreateInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDeviceQueueGlobalPriorityCreateInfoEXT* toTransform);
 
 void transform_fromhost_VkDeviceQueueGlobalPriorityCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceQueueGlobalPriorityCreateInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDeviceQueueGlobalPriorityCreateInfoEXT* toTransform);
 
 #endif
 #ifdef VK_EXT_external_memory_host
 void transform_tohost_VkImportMemoryHostPointerInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportMemoryHostPointerInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkImportMemoryHostPointerInfoEXT* toTransform);
 
 void transform_fromhost_VkImportMemoryHostPointerInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportMemoryHostPointerInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkImportMemoryHostPointerInfoEXT* toTransform);
 
 void transform_tohost_VkMemoryHostPointerPropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryHostPointerPropertiesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkMemoryHostPointerPropertiesEXT* toTransform);
 
 void transform_fromhost_VkMemoryHostPointerPropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryHostPointerPropertiesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkMemoryHostPointerPropertiesEXT* toTransform);
 
 void transform_tohost_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
     VkDecoderGlobalState* resourceTracker,
@@ -5098,58 +4415,46 @@
 #endif
 #ifdef VK_AMD_pipeline_compiler_control
 void transform_tohost_VkPipelineCompilerControlCreateInfoAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineCompilerControlCreateInfoAMD* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineCompilerControlCreateInfoAMD* toTransform);
 
 void transform_fromhost_VkPipelineCompilerControlCreateInfoAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineCompilerControlCreateInfoAMD* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineCompilerControlCreateInfoAMD* toTransform);
 
 #endif
 #ifdef VK_EXT_calibrated_timestamps
-void transform_tohost_VkCalibratedTimestampInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkCalibratedTimestampInfoEXT* toTransform);
+void transform_tohost_VkCalibratedTimestampInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                   VkCalibratedTimestampInfoEXT* toTransform);
 
-void transform_fromhost_VkCalibratedTimestampInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkCalibratedTimestampInfoEXT* toTransform);
+void transform_fromhost_VkCalibratedTimestampInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                     VkCalibratedTimestampInfoEXT* toTransform);
 
 #endif
 #ifdef VK_AMD_shader_core_properties
 void transform_tohost_VkPhysicalDeviceShaderCorePropertiesAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderCorePropertiesAMD* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceShaderCorePropertiesAMD* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceShaderCorePropertiesAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderCorePropertiesAMD* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceShaderCorePropertiesAMD* toTransform);
 
 #endif
 #ifdef VK_EXT_video_decode_h265
-void transform_tohost_VkVideoDecodeH265ProfileEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH265ProfileEXT* toTransform);
+void transform_tohost_VkVideoDecodeH265ProfileEXT(VkDecoderGlobalState* resourceTracker,
+                                                  VkVideoDecodeH265ProfileEXT* toTransform);
 
-void transform_fromhost_VkVideoDecodeH265ProfileEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH265ProfileEXT* toTransform);
+void transform_fromhost_VkVideoDecodeH265ProfileEXT(VkDecoderGlobalState* resourceTracker,
+                                                    VkVideoDecodeH265ProfileEXT* toTransform);
 
 void transform_tohost_VkVideoDecodeH265CapabilitiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH265CapabilitiesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoDecodeH265CapabilitiesEXT* toTransform);
 
 void transform_fromhost_VkVideoDecodeH265CapabilitiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH265CapabilitiesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoDecodeH265CapabilitiesEXT* toTransform);
 
 void transform_tohost_VkVideoDecodeH265SessionCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH265SessionCreateInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoDecodeH265SessionCreateInfoEXT* toTransform);
 
 void transform_fromhost_VkVideoDecodeH265SessionCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH265SessionCreateInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoDecodeH265SessionCreateInfoEXT* toTransform);
 
 void transform_tohost_VkVideoDecodeH265SessionParametersAddInfoEXT(
     VkDecoderGlobalState* resourceTracker,
@@ -5167,31 +4472,25 @@
     VkDecoderGlobalState* resourceTracker,
     VkVideoDecodeH265SessionParametersCreateInfoEXT* toTransform);
 
-void transform_tohost_VkVideoDecodeH265PictureInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH265PictureInfoEXT* toTransform);
+void transform_tohost_VkVideoDecodeH265PictureInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                      VkVideoDecodeH265PictureInfoEXT* toTransform);
 
 void transform_fromhost_VkVideoDecodeH265PictureInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH265PictureInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoDecodeH265PictureInfoEXT* toTransform);
 
-void transform_tohost_VkVideoDecodeH265DpbSlotInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH265DpbSlotInfoEXT* toTransform);
+void transform_tohost_VkVideoDecodeH265DpbSlotInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                      VkVideoDecodeH265DpbSlotInfoEXT* toTransform);
 
 void transform_fromhost_VkVideoDecodeH265DpbSlotInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVideoDecodeH265DpbSlotInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVideoDecodeH265DpbSlotInfoEXT* toTransform);
 
 #endif
 #ifdef VK_AMD_memory_overallocation_behavior
 void transform_tohost_VkDeviceMemoryOverallocationCreateInfoAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceMemoryOverallocationCreateInfoAMD* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDeviceMemoryOverallocationCreateInfoAMD* toTransform);
 
 void transform_fromhost_VkDeviceMemoryOverallocationCreateInfoAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceMemoryOverallocationCreateInfoAMD* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDeviceMemoryOverallocationCreateInfoAMD* toTransform);
 
 #endif
 #ifdef VK_EXT_vertex_attribute_divisor
@@ -5204,12 +4503,10 @@
     VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* toTransform);
 
 void transform_tohost_VkVertexInputBindingDivisorDescriptionEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVertexInputBindingDivisorDescriptionEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVertexInputBindingDivisorDescriptionEXT* toTransform);
 
 void transform_fromhost_VkVertexInputBindingDivisorDescriptionEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVertexInputBindingDivisorDescriptionEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVertexInputBindingDivisorDescriptionEXT* toTransform);
 
 void transform_tohost_VkPipelineVertexInputDivisorStateCreateInfoEXT(
     VkDecoderGlobalState* resourceTracker,
@@ -5229,31 +4526,25 @@
 
 #endif
 #ifdef VK_GGP_frame_token
-void transform_tohost_VkPresentFrameTokenGGP(
-    VkDecoderGlobalState* resourceTracker,
-    VkPresentFrameTokenGGP* toTransform);
+void transform_tohost_VkPresentFrameTokenGGP(VkDecoderGlobalState* resourceTracker,
+                                             VkPresentFrameTokenGGP* toTransform);
 
-void transform_fromhost_VkPresentFrameTokenGGP(
-    VkDecoderGlobalState* resourceTracker,
-    VkPresentFrameTokenGGP* toTransform);
+void transform_fromhost_VkPresentFrameTokenGGP(VkDecoderGlobalState* resourceTracker,
+                                               VkPresentFrameTokenGGP* toTransform);
 
 #endif
 #ifdef VK_EXT_pipeline_creation_feedback
-void transform_tohost_VkPipelineCreationFeedbackEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineCreationFeedbackEXT* toTransform);
+void transform_tohost_VkPipelineCreationFeedbackEXT(VkDecoderGlobalState* resourceTracker,
+                                                    VkPipelineCreationFeedbackEXT* toTransform);
 
-void transform_fromhost_VkPipelineCreationFeedbackEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineCreationFeedbackEXT* toTransform);
+void transform_fromhost_VkPipelineCreationFeedbackEXT(VkDecoderGlobalState* resourceTracker,
+                                                      VkPipelineCreationFeedbackEXT* toTransform);
 
 void transform_tohost_VkPipelineCreationFeedbackCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineCreationFeedbackCreateInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineCreationFeedbackCreateInfoEXT* toTransform);
 
 void transform_fromhost_VkPipelineCreationFeedbackCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineCreationFeedbackCreateInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineCreationFeedbackCreateInfoEXT* toTransform);
 
 #endif
 #ifdef VK_NV_shader_subgroup_partitioned
@@ -5270,28 +4561,22 @@
 #endif
 #ifdef VK_NV_mesh_shader
 void transform_tohost_VkPhysicalDeviceMeshShaderFeaturesNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMeshShaderFeaturesNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMeshShaderFeaturesNV* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceMeshShaderFeaturesNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMeshShaderFeaturesNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMeshShaderFeaturesNV* toTransform);
 
 void transform_tohost_VkPhysicalDeviceMeshShaderPropertiesNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMeshShaderPropertiesNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMeshShaderPropertiesNV* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceMeshShaderPropertiesNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMeshShaderPropertiesNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMeshShaderPropertiesNV* toTransform);
 
 void transform_tohost_VkDrawMeshTasksIndirectCommandNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkDrawMeshTasksIndirectCommandNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDrawMeshTasksIndirectCommandNV* toTransform);
 
 void transform_fromhost_VkDrawMeshTasksIndirectCommandNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkDrawMeshTasksIndirectCommandNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDrawMeshTasksIndirectCommandNV* toTransform);
 
 #endif
 #ifdef VK_NV_fragment_shader_barycentric
@@ -5324,30 +4609,24 @@
     VkPipelineViewportExclusiveScissorStateCreateInfoNV* toTransform);
 
 void transform_tohost_VkPhysicalDeviceExclusiveScissorFeaturesNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceExclusiveScissorFeaturesNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceExclusiveScissorFeaturesNV* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceExclusiveScissorFeaturesNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceExclusiveScissorFeaturesNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceExclusiveScissorFeaturesNV* toTransform);
 
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
 void transform_tohost_VkQueueFamilyCheckpointPropertiesNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkQueueFamilyCheckpointPropertiesNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkQueueFamilyCheckpointPropertiesNV* toTransform);
 
 void transform_fromhost_VkQueueFamilyCheckpointPropertiesNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkQueueFamilyCheckpointPropertiesNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkQueueFamilyCheckpointPropertiesNV* toTransform);
 
-void transform_tohost_VkCheckpointDataNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkCheckpointDataNV* toTransform);
+void transform_tohost_VkCheckpointDataNV(VkDecoderGlobalState* resourceTracker,
+                                         VkCheckpointDataNV* toTransform);
 
-void transform_fromhost_VkCheckpointDataNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkCheckpointDataNV* toTransform);
+void transform_fromhost_VkCheckpointDataNV(VkDecoderGlobalState* resourceTracker,
+                                           VkCheckpointDataNV* toTransform);
 
 #endif
 #ifdef VK_INTEL_shader_integer_functions2
@@ -5361,121 +4640,97 @@
 
 #endif
 #ifdef VK_INTEL_performance_query
-void transform_tohost_VkPerformanceValueDataINTEL(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceValueDataINTEL* toTransform);
+void transform_tohost_VkPerformanceValueDataINTEL(VkDecoderGlobalState* resourceTracker,
+                                                  VkPerformanceValueDataINTEL* toTransform);
 
-void transform_fromhost_VkPerformanceValueDataINTEL(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceValueDataINTEL* toTransform);
+void transform_fromhost_VkPerformanceValueDataINTEL(VkDecoderGlobalState* resourceTracker,
+                                                    VkPerformanceValueDataINTEL* toTransform);
 
-void transform_tohost_VkPerformanceValueINTEL(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceValueINTEL* toTransform);
+void transform_tohost_VkPerformanceValueINTEL(VkDecoderGlobalState* resourceTracker,
+                                              VkPerformanceValueINTEL* toTransform);
 
-void transform_fromhost_VkPerformanceValueINTEL(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceValueINTEL* toTransform);
+void transform_fromhost_VkPerformanceValueINTEL(VkDecoderGlobalState* resourceTracker,
+                                                VkPerformanceValueINTEL* toTransform);
 
 void transform_tohost_VkInitializePerformanceApiInfoINTEL(
-    VkDecoderGlobalState* resourceTracker,
-    VkInitializePerformanceApiInfoINTEL* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkInitializePerformanceApiInfoINTEL* toTransform);
 
 void transform_fromhost_VkInitializePerformanceApiInfoINTEL(
-    VkDecoderGlobalState* resourceTracker,
-    VkInitializePerformanceApiInfoINTEL* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkInitializePerformanceApiInfoINTEL* toTransform);
 
 void transform_tohost_VkQueryPoolPerformanceQueryCreateInfoINTEL(
-    VkDecoderGlobalState* resourceTracker,
-    VkQueryPoolPerformanceQueryCreateInfoINTEL* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkQueryPoolPerformanceQueryCreateInfoINTEL* toTransform);
 
 void transform_fromhost_VkQueryPoolPerformanceQueryCreateInfoINTEL(
-    VkDecoderGlobalState* resourceTracker,
-    VkQueryPoolPerformanceQueryCreateInfoINTEL* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkQueryPoolPerformanceQueryCreateInfoINTEL* toTransform);
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkQueryPoolPerformanceQueryCreateInfoINTEL, transform_tohost_VkQueryPoolCreateInfoINTEL)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkQueryPoolPerformanceQueryCreateInfoINTEL,
+                      transform_tohost_VkQueryPoolCreateInfoINTEL)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkQueryPoolPerformanceQueryCreateInfoINTEL, transform_fromhost_VkQueryPoolCreateInfoINTEL)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkQueryPoolPerformanceQueryCreateInfoINTEL,
+                      transform_fromhost_VkQueryPoolCreateInfoINTEL)
 
-void transform_tohost_VkPerformanceMarkerInfoINTEL(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceMarkerInfoINTEL* toTransform);
+void transform_tohost_VkPerformanceMarkerInfoINTEL(VkDecoderGlobalState* resourceTracker,
+                                                   VkPerformanceMarkerInfoINTEL* toTransform);
 
-void transform_fromhost_VkPerformanceMarkerInfoINTEL(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceMarkerInfoINTEL* toTransform);
+void transform_fromhost_VkPerformanceMarkerInfoINTEL(VkDecoderGlobalState* resourceTracker,
+                                                     VkPerformanceMarkerInfoINTEL* toTransform);
 
 void transform_tohost_VkPerformanceStreamMarkerInfoINTEL(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceStreamMarkerInfoINTEL* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPerformanceStreamMarkerInfoINTEL* toTransform);
 
 void transform_fromhost_VkPerformanceStreamMarkerInfoINTEL(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceStreamMarkerInfoINTEL* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPerformanceStreamMarkerInfoINTEL* toTransform);
 
-void transform_tohost_VkPerformanceOverrideInfoINTEL(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceOverrideInfoINTEL* toTransform);
+void transform_tohost_VkPerformanceOverrideInfoINTEL(VkDecoderGlobalState* resourceTracker,
+                                                     VkPerformanceOverrideInfoINTEL* toTransform);
 
-void transform_fromhost_VkPerformanceOverrideInfoINTEL(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceOverrideInfoINTEL* toTransform);
+void transform_fromhost_VkPerformanceOverrideInfoINTEL(VkDecoderGlobalState* resourceTracker,
+                                                       VkPerformanceOverrideInfoINTEL* toTransform);
 
 void transform_tohost_VkPerformanceConfigurationAcquireInfoINTEL(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceConfigurationAcquireInfoINTEL* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPerformanceConfigurationAcquireInfoINTEL* toTransform);
 
 void transform_fromhost_VkPerformanceConfigurationAcquireInfoINTEL(
-    VkDecoderGlobalState* resourceTracker,
-    VkPerformanceConfigurationAcquireInfoINTEL* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPerformanceConfigurationAcquireInfoINTEL* toTransform);
 
 #endif
 #ifdef VK_EXT_pci_bus_info
 void transform_tohost_VkPhysicalDevicePCIBusInfoPropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePCIBusInfoPropertiesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDevicePCIBusInfoPropertiesEXT* toTransform);
 
 void transform_fromhost_VkPhysicalDevicePCIBusInfoPropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePCIBusInfoPropertiesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDevicePCIBusInfoPropertiesEXT* toTransform);
 
 #endif
 #ifdef VK_AMD_display_native_hdr
 void transform_tohost_VkDisplayNativeHdrSurfaceCapabilitiesAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayNativeHdrSurfaceCapabilitiesAMD* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDisplayNativeHdrSurfaceCapabilitiesAMD* toTransform);
 
 void transform_fromhost_VkDisplayNativeHdrSurfaceCapabilitiesAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkDisplayNativeHdrSurfaceCapabilitiesAMD* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDisplayNativeHdrSurfaceCapabilitiesAMD* toTransform);
 
 void transform_tohost_VkSwapchainDisplayNativeHdrCreateInfoAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkSwapchainDisplayNativeHdrCreateInfoAMD* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkSwapchainDisplayNativeHdrCreateInfoAMD* toTransform);
 
 void transform_fromhost_VkSwapchainDisplayNativeHdrCreateInfoAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkSwapchainDisplayNativeHdrCreateInfoAMD* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkSwapchainDisplayNativeHdrCreateInfoAMD* toTransform);
 
 #endif
 #ifdef VK_FUCHSIA_imagepipe_surface
 void transform_tohost_VkImagePipeSurfaceCreateInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkImagePipeSurfaceCreateInfoFUCHSIA* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkImagePipeSurfaceCreateInfoFUCHSIA* toTransform);
 
 void transform_fromhost_VkImagePipeSurfaceCreateInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkImagePipeSurfaceCreateInfoFUCHSIA* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkImagePipeSurfaceCreateInfoFUCHSIA* toTransform);
 
 #endif
 #ifdef VK_EXT_metal_surface
-void transform_tohost_VkMetalSurfaceCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkMetalSurfaceCreateInfoEXT* toTransform);
+void transform_tohost_VkMetalSurfaceCreateInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                  VkMetalSurfaceCreateInfoEXT* toTransform);
 
-void transform_fromhost_VkMetalSurfaceCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkMetalSurfaceCreateInfoEXT* toTransform);
+void transform_fromhost_VkMetalSurfaceCreateInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                    VkMetalSurfaceCreateInfoEXT* toTransform);
 
 #endif
 #ifdef VK_EXT_fragment_density_map
@@ -5505,9 +4760,11 @@
 
 #endif
 #ifdef VK_EXT_scalar_block_layout
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceScalarBlockLayoutFeatures, transform_tohost_VkPhysicalDeviceScalarBlockLayoutFeaturesEXT)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceScalarBlockLayoutFeatures,
+                      transform_tohost_VkPhysicalDeviceScalarBlockLayoutFeaturesEXT)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceScalarBlockLayoutFeatures, transform_fromhost_VkPhysicalDeviceScalarBlockLayoutFeaturesEXT)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceScalarBlockLayoutFeatures,
+                      transform_fromhost_VkPhysicalDeviceScalarBlockLayoutFeaturesEXT)
 
 #endif
 #ifdef VK_GOOGLE_hlsl_functionality1
@@ -5542,22 +4799,18 @@
 #endif
 #ifdef VK_AMD_shader_core_properties2
 void transform_tohost_VkPhysicalDeviceShaderCoreProperties2AMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderCoreProperties2AMD* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceShaderCoreProperties2AMD* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceShaderCoreProperties2AMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceShaderCoreProperties2AMD* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceShaderCoreProperties2AMD* toTransform);
 
 #endif
 #ifdef VK_AMD_device_coherent_memory
 void transform_tohost_VkPhysicalDeviceCoherentMemoryFeaturesAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceCoherentMemoryFeaturesAMD* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceCoherentMemoryFeaturesAMD* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceCoherentMemoryFeaturesAMD(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceCoherentMemoryFeaturesAMD* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceCoherentMemoryFeaturesAMD* toTransform);
 
 #endif
 #ifdef VK_EXT_shader_image_atomic_int64
@@ -5572,30 +4825,24 @@
 #endif
 #ifdef VK_EXT_memory_budget
 void transform_tohost_VkPhysicalDeviceMemoryBudgetPropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMemoryBudgetPropertiesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMemoryBudgetPropertiesEXT* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceMemoryBudgetPropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMemoryBudgetPropertiesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMemoryBudgetPropertiesEXT* toTransform);
 
 #endif
 #ifdef VK_EXT_memory_priority
 void transform_tohost_VkPhysicalDeviceMemoryPriorityFeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMemoryPriorityFeaturesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMemoryPriorityFeaturesEXT* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceMemoryPriorityFeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMemoryPriorityFeaturesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMemoryPriorityFeaturesEXT* toTransform);
 
-void transform_tohost_VkMemoryPriorityAllocateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryPriorityAllocateInfoEXT* toTransform);
+void transform_tohost_VkMemoryPriorityAllocateInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                      VkMemoryPriorityAllocateInfoEXT* toTransform);
 
 void transform_fromhost_VkMemoryPriorityAllocateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryPriorityAllocateInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkMemoryPriorityAllocateInfoEXT* toTransform);
 
 #endif
 #ifdef VK_NV_dedicated_allocation_image_aliasing
@@ -5617,57 +4864,55 @@
     VkDecoderGlobalState* resourceTracker,
     VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* toTransform);
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT, transform_tohost_VkPhysicalDeviceBufferAddressFeaturesEXT)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT,
+                      transform_tohost_VkPhysicalDeviceBufferAddressFeaturesEXT)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT, transform_fromhost_VkPhysicalDeviceBufferAddressFeaturesEXT)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceBufferDeviceAddressFeaturesEXT,
+                      transform_fromhost_VkPhysicalDeviceBufferAddressFeaturesEXT)
 
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkBufferDeviceAddressInfo, transform_tohost_VkBufferDeviceAddressInfoEXT)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkBufferDeviceAddressInfo,
+                      transform_tohost_VkBufferDeviceAddressInfoEXT)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkBufferDeviceAddressInfo, transform_fromhost_VkBufferDeviceAddressInfoEXT)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkBufferDeviceAddressInfo,
+                      transform_fromhost_VkBufferDeviceAddressInfoEXT)
 
 void transform_tohost_VkBufferDeviceAddressCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferDeviceAddressCreateInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkBufferDeviceAddressCreateInfoEXT* toTransform);
 
 void transform_fromhost_VkBufferDeviceAddressCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferDeviceAddressCreateInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkBufferDeviceAddressCreateInfoEXT* toTransform);
 
 #endif
 #ifdef VK_EXT_tooling_info
 void transform_tohost_VkPhysicalDeviceToolPropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceToolPropertiesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceToolPropertiesEXT* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceToolPropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceToolPropertiesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceToolPropertiesEXT* toTransform);
 
 #endif
 #ifdef VK_EXT_separate_stencil_usage
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkImageStencilUsageCreateInfo, transform_tohost_VkImageStencilUsageCreateInfoEXT)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkImageStencilUsageCreateInfo,
+                      transform_tohost_VkImageStencilUsageCreateInfoEXT)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkImageStencilUsageCreateInfo, transform_fromhost_VkImageStencilUsageCreateInfoEXT)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkImageStencilUsageCreateInfo,
+                      transform_fromhost_VkImageStencilUsageCreateInfoEXT)
 
 #endif
 #ifdef VK_EXT_validation_features
-void transform_tohost_VkValidationFeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkValidationFeaturesEXT* toTransform);
+void transform_tohost_VkValidationFeaturesEXT(VkDecoderGlobalState* resourceTracker,
+                                              VkValidationFeaturesEXT* toTransform);
 
-void transform_fromhost_VkValidationFeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkValidationFeaturesEXT* toTransform);
+void transform_fromhost_VkValidationFeaturesEXT(VkDecoderGlobalState* resourceTracker,
+                                                VkValidationFeaturesEXT* toTransform);
 
 #endif
 #ifdef VK_NV_cooperative_matrix
-void transform_tohost_VkCooperativeMatrixPropertiesNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkCooperativeMatrixPropertiesNV* toTransform);
+void transform_tohost_VkCooperativeMatrixPropertiesNV(VkDecoderGlobalState* resourceTracker,
+                                                      VkCooperativeMatrixPropertiesNV* toTransform);
 
 void transform_fromhost_VkCooperativeMatrixPropertiesNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkCooperativeMatrixPropertiesNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkCooperativeMatrixPropertiesNV* toTransform);
 
 void transform_tohost_VkPhysicalDeviceCooperativeMatrixFeaturesNV(
     VkDecoderGlobalState* resourceTracker,
@@ -5704,12 +4949,10 @@
     VkPipelineCoverageReductionStateCreateInfoNV* toTransform);
 
 void transform_tohost_VkFramebufferMixedSamplesCombinationNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkFramebufferMixedSamplesCombinationNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkFramebufferMixedSamplesCombinationNV* toTransform);
 
 void transform_fromhost_VkFramebufferMixedSamplesCombinationNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkFramebufferMixedSamplesCombinationNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkFramebufferMixedSamplesCombinationNV* toTransform);
 
 #endif
 #ifdef VK_EXT_fragment_shader_interlock
@@ -5734,12 +4977,10 @@
 #endif
 #ifdef VK_EXT_provoking_vertex
 void transform_tohost_VkPhysicalDeviceProvokingVertexFeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceProvokingVertexFeaturesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceProvokingVertexFeaturesEXT* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceProvokingVertexFeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceProvokingVertexFeaturesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceProvokingVertexFeaturesEXT* toTransform);
 
 void transform_tohost_VkPhysicalDeviceProvokingVertexPropertiesEXT(
     VkDecoderGlobalState* resourceTracker,
@@ -5760,12 +5001,10 @@
 #endif
 #ifdef VK_EXT_full_screen_exclusive
 void transform_tohost_VkSurfaceFullScreenExclusiveInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkSurfaceFullScreenExclusiveInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkSurfaceFullScreenExclusiveInfoEXT* toTransform);
 
 void transform_fromhost_VkSurfaceFullScreenExclusiveInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkSurfaceFullScreenExclusiveInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkSurfaceFullScreenExclusiveInfoEXT* toTransform);
 
 void transform_tohost_VkSurfaceCapabilitiesFullScreenExclusiveEXT(
     VkDecoderGlobalState* resourceTracker,
@@ -5776,22 +5015,18 @@
     VkSurfaceCapabilitiesFullScreenExclusiveEXT* toTransform);
 
 void transform_tohost_VkSurfaceFullScreenExclusiveWin32InfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkSurfaceFullScreenExclusiveWin32InfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkSurfaceFullScreenExclusiveWin32InfoEXT* toTransform);
 
 void transform_fromhost_VkSurfaceFullScreenExclusiveWin32InfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkSurfaceFullScreenExclusiveWin32InfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkSurfaceFullScreenExclusiveWin32InfoEXT* toTransform);
 
 #endif
 #ifdef VK_EXT_headless_surface
-void transform_tohost_VkHeadlessSurfaceCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkHeadlessSurfaceCreateInfoEXT* toTransform);
+void transform_tohost_VkHeadlessSurfaceCreateInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                     VkHeadlessSurfaceCreateInfoEXT* toTransform);
 
-void transform_fromhost_VkHeadlessSurfaceCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkHeadlessSurfaceCreateInfoEXT* toTransform);
+void transform_fromhost_VkHeadlessSurfaceCreateInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                       VkHeadlessSurfaceCreateInfoEXT* toTransform);
 
 #endif
 #ifdef VK_EXT_line_rasterization
@@ -5831,19 +5066,19 @@
 
 #endif
 #ifdef VK_EXT_host_query_reset
-DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceHostQueryResetFeatures, transform_tohost_VkPhysicalDeviceHostQueryResetFeaturesEXT)
+DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceHostQueryResetFeatures,
+                      transform_tohost_VkPhysicalDeviceHostQueryResetFeaturesEXT)
 
-DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceHostQueryResetFeatures, transform_fromhost_VkPhysicalDeviceHostQueryResetFeaturesEXT)
+DEFINE_ALIAS_FUNCTION(transform_fromhost_VkPhysicalDeviceHostQueryResetFeatures,
+                      transform_fromhost_VkPhysicalDeviceHostQueryResetFeaturesEXT)
 
 #endif
 #ifdef VK_EXT_index_type_uint8
 void transform_tohost_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceIndexTypeUint8FeaturesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceIndexTypeUint8FeaturesEXT* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceIndexTypeUint8FeaturesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceIndexTypeUint8FeaturesEXT* toTransform);
 
 #endif
 #ifdef VK_EXT_extended_dynamic_state
@@ -5894,84 +5129,64 @@
     VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV* toTransform);
 
 void transform_tohost_VkGraphicsShaderGroupCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkGraphicsShaderGroupCreateInfoNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkGraphicsShaderGroupCreateInfoNV* toTransform);
 
 void transform_fromhost_VkGraphicsShaderGroupCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkGraphicsShaderGroupCreateInfoNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkGraphicsShaderGroupCreateInfoNV* toTransform);
 
 void transform_tohost_VkGraphicsPipelineShaderGroupsCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkGraphicsPipelineShaderGroupsCreateInfoNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkGraphicsPipelineShaderGroupsCreateInfoNV* toTransform);
 
 void transform_fromhost_VkGraphicsPipelineShaderGroupsCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkGraphicsPipelineShaderGroupsCreateInfoNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkGraphicsPipelineShaderGroupsCreateInfoNV* toTransform);
 
 void transform_tohost_VkBindShaderGroupIndirectCommandNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindShaderGroupIndirectCommandNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkBindShaderGroupIndirectCommandNV* toTransform);
 
 void transform_fromhost_VkBindShaderGroupIndirectCommandNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindShaderGroupIndirectCommandNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkBindShaderGroupIndirectCommandNV* toTransform);
 
 void transform_tohost_VkBindIndexBufferIndirectCommandNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindIndexBufferIndirectCommandNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkBindIndexBufferIndirectCommandNV* toTransform);
 
 void transform_fromhost_VkBindIndexBufferIndirectCommandNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindIndexBufferIndirectCommandNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkBindIndexBufferIndirectCommandNV* toTransform);
 
 void transform_tohost_VkBindVertexBufferIndirectCommandNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindVertexBufferIndirectCommandNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkBindVertexBufferIndirectCommandNV* toTransform);
 
 void transform_fromhost_VkBindVertexBufferIndirectCommandNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkBindVertexBufferIndirectCommandNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkBindVertexBufferIndirectCommandNV* toTransform);
 
 void transform_tohost_VkSetStateFlagsIndirectCommandNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkSetStateFlagsIndirectCommandNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkSetStateFlagsIndirectCommandNV* toTransform);
 
 void transform_fromhost_VkSetStateFlagsIndirectCommandNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkSetStateFlagsIndirectCommandNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkSetStateFlagsIndirectCommandNV* toTransform);
 
-void transform_tohost_VkIndirectCommandsStreamNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkIndirectCommandsStreamNV* toTransform);
+void transform_tohost_VkIndirectCommandsStreamNV(VkDecoderGlobalState* resourceTracker,
+                                                 VkIndirectCommandsStreamNV* toTransform);
 
-void transform_fromhost_VkIndirectCommandsStreamNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkIndirectCommandsStreamNV* toTransform);
+void transform_fromhost_VkIndirectCommandsStreamNV(VkDecoderGlobalState* resourceTracker,
+                                                   VkIndirectCommandsStreamNV* toTransform);
 
-void transform_tohost_VkIndirectCommandsLayoutTokenNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkIndirectCommandsLayoutTokenNV* toTransform);
+void transform_tohost_VkIndirectCommandsLayoutTokenNV(VkDecoderGlobalState* resourceTracker,
+                                                      VkIndirectCommandsLayoutTokenNV* toTransform);
 
 void transform_fromhost_VkIndirectCommandsLayoutTokenNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkIndirectCommandsLayoutTokenNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkIndirectCommandsLayoutTokenNV* toTransform);
 
 void transform_tohost_VkIndirectCommandsLayoutCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkIndirectCommandsLayoutCreateInfoNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkIndirectCommandsLayoutCreateInfoNV* toTransform);
 
 void transform_fromhost_VkIndirectCommandsLayoutCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkIndirectCommandsLayoutCreateInfoNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkIndirectCommandsLayoutCreateInfoNV* toTransform);
 
-void transform_tohost_VkGeneratedCommandsInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkGeneratedCommandsInfoNV* toTransform);
+void transform_tohost_VkGeneratedCommandsInfoNV(VkDecoderGlobalState* resourceTracker,
+                                                VkGeneratedCommandsInfoNV* toTransform);
 
-void transform_fromhost_VkGeneratedCommandsInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkGeneratedCommandsInfoNV* toTransform);
+void transform_fromhost_VkGeneratedCommandsInfoNV(VkDecoderGlobalState* resourceTracker,
+                                                  VkGeneratedCommandsInfoNV* toTransform);
 
 void transform_tohost_VkGeneratedCommandsMemoryRequirementsInfoNV(
     VkDecoderGlobalState* resourceTracker,
@@ -6020,12 +5235,10 @@
 #endif
 #ifdef VK_QCOM_render_pass_transform
 void transform_tohost_VkRenderPassTransformBeginInfoQCOM(
-    VkDecoderGlobalState* resourceTracker,
-    VkRenderPassTransformBeginInfoQCOM* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkRenderPassTransformBeginInfoQCOM* toTransform);
 
 void transform_fromhost_VkRenderPassTransformBeginInfoQCOM(
-    VkDecoderGlobalState* resourceTracker,
-    VkRenderPassTransformBeginInfoQCOM* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkRenderPassTransformBeginInfoQCOM* toTransform);
 
 void transform_tohost_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(
     VkDecoderGlobalState* resourceTracker,
@@ -6046,50 +5259,40 @@
     VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* toTransform);
 
 void transform_tohost_VkDeviceMemoryReportCallbackDataEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceMemoryReportCallbackDataEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDeviceMemoryReportCallbackDataEXT* toTransform);
 
 void transform_fromhost_VkDeviceMemoryReportCallbackDataEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceMemoryReportCallbackDataEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDeviceMemoryReportCallbackDataEXT* toTransform);
 
 void transform_tohost_VkDeviceDeviceMemoryReportCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceDeviceMemoryReportCreateInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDeviceDeviceMemoryReportCreateInfoEXT* toTransform);
 
 void transform_fromhost_VkDeviceDeviceMemoryReportCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceDeviceMemoryReportCreateInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDeviceDeviceMemoryReportCreateInfoEXT* toTransform);
 
 #endif
 #ifdef VK_EXT_acquire_drm_display
 #endif
 #ifdef VK_EXT_robustness2
 void transform_tohost_VkPhysicalDeviceRobustness2FeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceRobustness2FeaturesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceRobustness2FeaturesEXT* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceRobustness2FeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceRobustness2FeaturesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceRobustness2FeaturesEXT* toTransform);
 
 void transform_tohost_VkPhysicalDeviceRobustness2PropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceRobustness2PropertiesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceRobustness2PropertiesEXT* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceRobustness2PropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceRobustness2PropertiesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceRobustness2PropertiesEXT* toTransform);
 
 #endif
 #ifdef VK_EXT_custom_border_color
 void transform_tohost_VkSamplerCustomBorderColorCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkSamplerCustomBorderColorCreateInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkSamplerCustomBorderColorCreateInfoEXT* toTransform);
 
 void transform_fromhost_VkSamplerCustomBorderColorCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkSamplerCustomBorderColorCreateInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkSamplerCustomBorderColorCreateInfoEXT* toTransform);
 
 void transform_tohost_VkPhysicalDeviceCustomBorderColorPropertiesEXT(
     VkDecoderGlobalState* resourceTracker,
@@ -6112,28 +5315,22 @@
 #endif
 #ifdef VK_EXT_private_data
 void transform_tohost_VkPhysicalDevicePrivateDataFeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePrivateDataFeaturesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDevicePrivateDataFeaturesEXT* toTransform);
 
 void transform_fromhost_VkPhysicalDevicePrivateDataFeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevicePrivateDataFeaturesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDevicePrivateDataFeaturesEXT* toTransform);
 
 void transform_tohost_VkDevicePrivateDataCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDevicePrivateDataCreateInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDevicePrivateDataCreateInfoEXT* toTransform);
 
 void transform_fromhost_VkDevicePrivateDataCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDevicePrivateDataCreateInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDevicePrivateDataCreateInfoEXT* toTransform);
 
-void transform_tohost_VkPrivateDataSlotCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPrivateDataSlotCreateInfoEXT* toTransform);
+void transform_tohost_VkPrivateDataSlotCreateInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                     VkPrivateDataSlotCreateInfoEXT* toTransform);
 
-void transform_fromhost_VkPrivateDataSlotCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPrivateDataSlotCreateInfoEXT* toTransform);
+void transform_fromhost_VkPrivateDataSlotCreateInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                       VkPrivateDataSlotCreateInfoEXT* toTransform);
 
 #endif
 #ifdef VK_EXT_pipeline_creation_cache_control
@@ -6156,12 +5353,10 @@
     VkPhysicalDeviceDiagnosticsConfigFeaturesNV* toTransform);
 
 void transform_tohost_VkDeviceDiagnosticsConfigCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceDiagnosticsConfigCreateInfoNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDeviceDiagnosticsConfigCreateInfoNV* toTransform);
 
 void transform_fromhost_VkDeviceDiagnosticsConfigCreateInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceDiagnosticsConfigCreateInfoNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkDeviceDiagnosticsConfigCreateInfoNV* toTransform);
 
 #endif
 #ifdef VK_QCOM_render_pass_store_ops
@@ -6193,13 +5388,11 @@
 
 #endif
 #ifdef VK_NV_ray_tracing_motion_blur
-void transform_tohost_VkDeviceOrHostAddressConstKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceOrHostAddressConstKHR* toTransform);
+void transform_tohost_VkDeviceOrHostAddressConstKHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkDeviceOrHostAddressConstKHR* toTransform);
 
-void transform_fromhost_VkDeviceOrHostAddressConstKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceOrHostAddressConstKHR* toTransform);
+void transform_fromhost_VkDeviceOrHostAddressConstKHR(VkDecoderGlobalState* resourceTracker,
+                                                      VkDeviceOrHostAddressConstKHR* toTransform);
 
 void transform_tohost_VkAccelerationStructureGeometryMotionTrianglesDataNV(
     VkDecoderGlobalState* resourceTracker,
@@ -6210,12 +5403,10 @@
     VkAccelerationStructureGeometryMotionTrianglesDataNV* toTransform);
 
 void transform_tohost_VkAccelerationStructureMotionInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureMotionInfoNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureMotionInfoNV* toTransform);
 
 void transform_fromhost_VkAccelerationStructureMotionInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureMotionInfoNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureMotionInfoNV* toTransform);
 
 void transform_tohost_VkAccelerationStructureMatrixMotionInstanceNV(
     VkDecoderGlobalState* resourceTracker,
@@ -6225,21 +5416,16 @@
     VkDecoderGlobalState* resourceTracker,
     VkAccelerationStructureMatrixMotionInstanceNV* toTransform);
 
-void transform_tohost_VkSRTDataNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkSRTDataNV* toTransform);
+void transform_tohost_VkSRTDataNV(VkDecoderGlobalState* resourceTracker, VkSRTDataNV* toTransform);
 
-void transform_fromhost_VkSRTDataNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkSRTDataNV* toTransform);
+void transform_fromhost_VkSRTDataNV(VkDecoderGlobalState* resourceTracker,
+                                    VkSRTDataNV* toTransform);
 
 void transform_tohost_VkAccelerationStructureSRTMotionInstanceNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureSRTMotionInstanceNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureSRTMotionInstanceNV* toTransform);
 
 void transform_fromhost_VkAccelerationStructureSRTMotionInstanceNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureSRTMotionInstanceNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureSRTMotionInstanceNV* toTransform);
 
 void transform_tohost_VkAccelerationStructureMotionInstanceDataNV(
     VkDecoderGlobalState* resourceTracker,
@@ -6250,12 +5436,10 @@
     VkAccelerationStructureMotionInstanceDataNV* toTransform);
 
 void transform_tohost_VkAccelerationStructureMotionInstanceNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureMotionInstanceNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureMotionInstanceNV* toTransform);
 
 void transform_fromhost_VkAccelerationStructureMotionInstanceNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureMotionInstanceNV* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureMotionInstanceNV* toTransform);
 
 void transform_tohost_VkPhysicalDeviceRayTracingMotionBlurFeaturesNV(
     VkDecoderGlobalState* resourceTracker,
@@ -6295,55 +5479,45 @@
 
 #endif
 #ifdef VK_QCOM_rotated_copy_commands
-void transform_tohost_VkCopyCommandTransformInfoQCOM(
-    VkDecoderGlobalState* resourceTracker,
-    VkCopyCommandTransformInfoQCOM* toTransform);
+void transform_tohost_VkCopyCommandTransformInfoQCOM(VkDecoderGlobalState* resourceTracker,
+                                                     VkCopyCommandTransformInfoQCOM* toTransform);
 
-void transform_fromhost_VkCopyCommandTransformInfoQCOM(
-    VkDecoderGlobalState* resourceTracker,
-    VkCopyCommandTransformInfoQCOM* toTransform);
+void transform_fromhost_VkCopyCommandTransformInfoQCOM(VkDecoderGlobalState* resourceTracker,
+                                                       VkCopyCommandTransformInfoQCOM* toTransform);
 
 #endif
 #ifdef VK_EXT_image_robustness
 void transform_tohost_VkPhysicalDeviceImageRobustnessFeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceImageRobustnessFeaturesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceImageRobustnessFeaturesEXT* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceImageRobustnessFeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceImageRobustnessFeaturesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceImageRobustnessFeaturesEXT* toTransform);
 
 #endif
 #ifdef VK_EXT_4444_formats
 void transform_tohost_VkPhysicalDevice4444FormatsFeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevice4444FormatsFeaturesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDevice4444FormatsFeaturesEXT* toTransform);
 
 void transform_fromhost_VkPhysicalDevice4444FormatsFeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDevice4444FormatsFeaturesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDevice4444FormatsFeaturesEXT* toTransform);
 
 #endif
 #ifdef VK_EXT_rgba10x6_formats
 void transform_tohost_VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT* toTransform);
 
 #endif
 #ifdef VK_NV_acquire_winrt_display
 #endif
 #ifdef VK_EXT_directfb_surface
-void transform_tohost_VkDirectFBSurfaceCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDirectFBSurfaceCreateInfoEXT* toTransform);
+void transform_tohost_VkDirectFBSurfaceCreateInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                     VkDirectFBSurfaceCreateInfoEXT* toTransform);
 
-void transform_fromhost_VkDirectFBSurfaceCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkDirectFBSurfaceCreateInfoEXT* toTransform);
+void transform_fromhost_VkDirectFBSurfaceCreateInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                       VkDirectFBSurfaceCreateInfoEXT* toTransform);
 
 #endif
 #ifdef VK_VALVE_mutable_descriptor_type
@@ -6356,20 +5530,16 @@
     VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE* toTransform);
 
 void transform_tohost_VkMutableDescriptorTypeListVALVE(
-    VkDecoderGlobalState* resourceTracker,
-    VkMutableDescriptorTypeListVALVE* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkMutableDescriptorTypeListVALVE* toTransform);
 
 void transform_fromhost_VkMutableDescriptorTypeListVALVE(
-    VkDecoderGlobalState* resourceTracker,
-    VkMutableDescriptorTypeListVALVE* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkMutableDescriptorTypeListVALVE* toTransform);
 
 void transform_tohost_VkMutableDescriptorTypeCreateInfoVALVE(
-    VkDecoderGlobalState* resourceTracker,
-    VkMutableDescriptorTypeCreateInfoVALVE* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkMutableDescriptorTypeCreateInfoVALVE* toTransform);
 
 void transform_fromhost_VkMutableDescriptorTypeCreateInfoVALVE(
-    VkDecoderGlobalState* resourceTracker,
-    VkMutableDescriptorTypeCreateInfoVALVE* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkMutableDescriptorTypeCreateInfoVALVE* toTransform);
 
 #endif
 #ifdef VK_EXT_vertex_input_dynamic_state
@@ -6382,30 +5552,24 @@
     VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT* toTransform);
 
 void transform_tohost_VkVertexInputBindingDescription2EXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVertexInputBindingDescription2EXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVertexInputBindingDescription2EXT* toTransform);
 
 void transform_fromhost_VkVertexInputBindingDescription2EXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVertexInputBindingDescription2EXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVertexInputBindingDescription2EXT* toTransform);
 
 void transform_tohost_VkVertexInputAttributeDescription2EXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVertexInputAttributeDescription2EXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVertexInputAttributeDescription2EXT* toTransform);
 
 void transform_fromhost_VkVertexInputAttributeDescription2EXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkVertexInputAttributeDescription2EXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkVertexInputAttributeDescription2EXT* toTransform);
 
 #endif
 #ifdef VK_EXT_physical_device_drm
 void transform_tohost_VkPhysicalDeviceDrmPropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceDrmPropertiesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceDrmPropertiesEXT* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceDrmPropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceDrmPropertiesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceDrmPropertiesEXT* toTransform);
 
 #endif
 #ifdef VK_EXT_primitive_topology_list_restart
@@ -6420,138 +5584,106 @@
 #endif
 #ifdef VK_FUCHSIA_external_memory
 void transform_tohost_VkImportMemoryZirconHandleInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportMemoryZirconHandleInfoFUCHSIA* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkImportMemoryZirconHandleInfoFUCHSIA* toTransform);
 
 void transform_fromhost_VkImportMemoryZirconHandleInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportMemoryZirconHandleInfoFUCHSIA* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkImportMemoryZirconHandleInfoFUCHSIA* toTransform);
 
 void transform_tohost_VkMemoryZirconHandlePropertiesFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryZirconHandlePropertiesFUCHSIA* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkMemoryZirconHandlePropertiesFUCHSIA* toTransform);
 
 void transform_fromhost_VkMemoryZirconHandlePropertiesFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryZirconHandlePropertiesFUCHSIA* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkMemoryZirconHandlePropertiesFUCHSIA* toTransform);
 
 void transform_tohost_VkMemoryGetZirconHandleInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryGetZirconHandleInfoFUCHSIA* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkMemoryGetZirconHandleInfoFUCHSIA* toTransform);
 
 void transform_fromhost_VkMemoryGetZirconHandleInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryGetZirconHandleInfoFUCHSIA* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkMemoryGetZirconHandleInfoFUCHSIA* toTransform);
 
 #endif
 #ifdef VK_FUCHSIA_external_semaphore
 void transform_tohost_VkImportSemaphoreZirconHandleInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportSemaphoreZirconHandleInfoFUCHSIA* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkImportSemaphoreZirconHandleInfoFUCHSIA* toTransform);
 
 void transform_fromhost_VkImportSemaphoreZirconHandleInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportSemaphoreZirconHandleInfoFUCHSIA* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkImportSemaphoreZirconHandleInfoFUCHSIA* toTransform);
 
 void transform_tohost_VkSemaphoreGetZirconHandleInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkSemaphoreGetZirconHandleInfoFUCHSIA* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkSemaphoreGetZirconHandleInfoFUCHSIA* toTransform);
 
 void transform_fromhost_VkSemaphoreGetZirconHandleInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkSemaphoreGetZirconHandleInfoFUCHSIA* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkSemaphoreGetZirconHandleInfoFUCHSIA* toTransform);
 
 #endif
 #ifdef VK_FUCHSIA_buffer_collection
 void transform_tohost_VkBufferCollectionCreateInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferCollectionCreateInfoFUCHSIA* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkBufferCollectionCreateInfoFUCHSIA* toTransform);
 
 void transform_fromhost_VkBufferCollectionCreateInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferCollectionCreateInfoFUCHSIA* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkBufferCollectionCreateInfoFUCHSIA* toTransform);
 
 void transform_tohost_VkImportMemoryBufferCollectionFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportMemoryBufferCollectionFUCHSIA* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkImportMemoryBufferCollectionFUCHSIA* toTransform);
 
 void transform_fromhost_VkImportMemoryBufferCollectionFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportMemoryBufferCollectionFUCHSIA* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkImportMemoryBufferCollectionFUCHSIA* toTransform);
 
 void transform_tohost_VkBufferCollectionImageCreateInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferCollectionImageCreateInfoFUCHSIA* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkBufferCollectionImageCreateInfoFUCHSIA* toTransform);
 
 void transform_fromhost_VkBufferCollectionImageCreateInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferCollectionImageCreateInfoFUCHSIA* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkBufferCollectionImageCreateInfoFUCHSIA* toTransform);
 
 void transform_tohost_VkBufferCollectionConstraintsInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferCollectionConstraintsInfoFUCHSIA* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkBufferCollectionConstraintsInfoFUCHSIA* toTransform);
 
 void transform_fromhost_VkBufferCollectionConstraintsInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferCollectionConstraintsInfoFUCHSIA* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkBufferCollectionConstraintsInfoFUCHSIA* toTransform);
 
-void transform_tohost_VkBufferConstraintsInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferConstraintsInfoFUCHSIA* toTransform);
+void transform_tohost_VkBufferConstraintsInfoFUCHSIA(VkDecoderGlobalState* resourceTracker,
+                                                     VkBufferConstraintsInfoFUCHSIA* toTransform);
 
-void transform_fromhost_VkBufferConstraintsInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferConstraintsInfoFUCHSIA* toTransform);
+void transform_fromhost_VkBufferConstraintsInfoFUCHSIA(VkDecoderGlobalState* resourceTracker,
+                                                       VkBufferConstraintsInfoFUCHSIA* toTransform);
 
 void transform_tohost_VkBufferCollectionBufferCreateInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferCollectionBufferCreateInfoFUCHSIA* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkBufferCollectionBufferCreateInfoFUCHSIA* toTransform);
 
 void transform_fromhost_VkBufferCollectionBufferCreateInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferCollectionBufferCreateInfoFUCHSIA* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkBufferCollectionBufferCreateInfoFUCHSIA* toTransform);
 
-void transform_tohost_VkSysmemColorSpaceFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkSysmemColorSpaceFUCHSIA* toTransform);
+void transform_tohost_VkSysmemColorSpaceFUCHSIA(VkDecoderGlobalState* resourceTracker,
+                                                VkSysmemColorSpaceFUCHSIA* toTransform);
 
-void transform_fromhost_VkSysmemColorSpaceFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkSysmemColorSpaceFUCHSIA* toTransform);
+void transform_fromhost_VkSysmemColorSpaceFUCHSIA(VkDecoderGlobalState* resourceTracker,
+                                                  VkSysmemColorSpaceFUCHSIA* toTransform);
 
 void transform_tohost_VkBufferCollectionPropertiesFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferCollectionPropertiesFUCHSIA* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkBufferCollectionPropertiesFUCHSIA* toTransform);
 
 void transform_fromhost_VkBufferCollectionPropertiesFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkBufferCollectionPropertiesFUCHSIA* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkBufferCollectionPropertiesFUCHSIA* toTransform);
 
 void transform_tohost_VkImageFormatConstraintsInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageFormatConstraintsInfoFUCHSIA* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkImageFormatConstraintsInfoFUCHSIA* toTransform);
 
 void transform_fromhost_VkImageFormatConstraintsInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageFormatConstraintsInfoFUCHSIA* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkImageFormatConstraintsInfoFUCHSIA* toTransform);
 
-void transform_tohost_VkImageConstraintsInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageConstraintsInfoFUCHSIA* toTransform);
+void transform_tohost_VkImageConstraintsInfoFUCHSIA(VkDecoderGlobalState* resourceTracker,
+                                                    VkImageConstraintsInfoFUCHSIA* toTransform);
 
-void transform_fromhost_VkImageConstraintsInfoFUCHSIA(
-    VkDecoderGlobalState* resourceTracker,
-    VkImageConstraintsInfoFUCHSIA* toTransform);
+void transform_fromhost_VkImageConstraintsInfoFUCHSIA(VkDecoderGlobalState* resourceTracker,
+                                                      VkImageConstraintsInfoFUCHSIA* toTransform);
 
 #endif
 #ifdef VK_HUAWEI_subpass_shading
 void transform_tohost_VkSubpassShadingPipelineCreateInfoHUAWEI(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubpassShadingPipelineCreateInfoHUAWEI* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkSubpassShadingPipelineCreateInfoHUAWEI* toTransform);
 
 void transform_fromhost_VkSubpassShadingPipelineCreateInfoHUAWEI(
-    VkDecoderGlobalState* resourceTracker,
-    VkSubpassShadingPipelineCreateInfoHUAWEI* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkSubpassShadingPipelineCreateInfoHUAWEI* toTransform);
 
 void transform_tohost_VkPhysicalDeviceSubpassShadingFeaturesHUAWEI(
     VkDecoderGlobalState* resourceTracker,
@@ -6581,13 +5713,11 @@
 
 #endif
 #ifdef VK_NV_external_memory_rdma
-void transform_tohost_VkMemoryGetRemoteAddressInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryGetRemoteAddressInfoNV* toTransform);
+void transform_tohost_VkMemoryGetRemoteAddressInfoNV(VkDecoderGlobalState* resourceTracker,
+                                                     VkMemoryGetRemoteAddressInfoNV* toTransform);
 
-void transform_fromhost_VkMemoryGetRemoteAddressInfoNV(
-    VkDecoderGlobalState* resourceTracker,
-    VkMemoryGetRemoteAddressInfoNV* toTransform);
+void transform_fromhost_VkMemoryGetRemoteAddressInfoNV(VkDecoderGlobalState* resourceTracker,
+                                                       VkMemoryGetRemoteAddressInfoNV* toTransform);
 
 void transform_tohost_VkPhysicalDeviceExternalMemoryRDMAFeaturesNV(
     VkDecoderGlobalState* resourceTracker,
@@ -6609,13 +5739,11 @@
 
 #endif
 #ifdef VK_QNX_screen_surface
-void transform_tohost_VkScreenSurfaceCreateInfoQNX(
-    VkDecoderGlobalState* resourceTracker,
-    VkScreenSurfaceCreateInfoQNX* toTransform);
+void transform_tohost_VkScreenSurfaceCreateInfoQNX(VkDecoderGlobalState* resourceTracker,
+                                                   VkScreenSurfaceCreateInfoQNX* toTransform);
 
-void transform_fromhost_VkScreenSurfaceCreateInfoQNX(
-    VkDecoderGlobalState* resourceTracker,
-    VkScreenSurfaceCreateInfoQNX* toTransform);
+void transform_fromhost_VkScreenSurfaceCreateInfoQNX(VkDecoderGlobalState* resourceTracker,
+                                                     VkScreenSurfaceCreateInfoQNX* toTransform);
 
 #endif
 #ifdef VK_EXT_color_write_enable
@@ -6628,38 +5756,30 @@
     VkPhysicalDeviceColorWriteEnableFeaturesEXT* toTransform);
 
 void transform_tohost_VkPipelineColorWriteCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineColorWriteCreateInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineColorWriteCreateInfoEXT* toTransform);
 
 void transform_fromhost_VkPipelineColorWriteCreateInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPipelineColorWriteCreateInfoEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPipelineColorWriteCreateInfoEXT* toTransform);
 
 #endif
 #ifdef VK_GOOGLE_gfxstream
-void transform_tohost_VkImportColorBufferGOOGLE(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportColorBufferGOOGLE* toTransform);
+void transform_tohost_VkImportColorBufferGOOGLE(VkDecoderGlobalState* resourceTracker,
+                                                VkImportColorBufferGOOGLE* toTransform);
 
-void transform_fromhost_VkImportColorBufferGOOGLE(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportColorBufferGOOGLE* toTransform);
+void transform_fromhost_VkImportColorBufferGOOGLE(VkDecoderGlobalState* resourceTracker,
+                                                  VkImportColorBufferGOOGLE* toTransform);
 
-void transform_tohost_VkImportBufferGOOGLE(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportBufferGOOGLE* toTransform);
+void transform_tohost_VkImportBufferGOOGLE(VkDecoderGlobalState* resourceTracker,
+                                           VkImportBufferGOOGLE* toTransform);
 
-void transform_fromhost_VkImportBufferGOOGLE(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportBufferGOOGLE* toTransform);
+void transform_fromhost_VkImportBufferGOOGLE(VkDecoderGlobalState* resourceTracker,
+                                             VkImportBufferGOOGLE* toTransform);
 
-void transform_tohost_VkImportPhysicalAddressGOOGLE(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportPhysicalAddressGOOGLE* toTransform);
+void transform_tohost_VkImportPhysicalAddressGOOGLE(VkDecoderGlobalState* resourceTracker,
+                                                    VkImportPhysicalAddressGOOGLE* toTransform);
 
-void transform_fromhost_VkImportPhysicalAddressGOOGLE(
-    VkDecoderGlobalState* resourceTracker,
-    VkImportPhysicalAddressGOOGLE* toTransform);
+void transform_fromhost_VkImportPhysicalAddressGOOGLE(VkDecoderGlobalState* resourceTracker,
+                                                      VkImportPhysicalAddressGOOGLE* toTransform);
 
 #endif
 #ifdef VK_EXT_global_priority_query
@@ -6672,46 +5792,36 @@
     VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT* toTransform);
 
 void transform_tohost_VkQueueFamilyGlobalPriorityPropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkQueueFamilyGlobalPriorityPropertiesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkQueueFamilyGlobalPriorityPropertiesEXT* toTransform);
 
 void transform_fromhost_VkQueueFamilyGlobalPriorityPropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkQueueFamilyGlobalPriorityPropertiesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkQueueFamilyGlobalPriorityPropertiesEXT* toTransform);
 
 #endif
 #ifdef VK_EXT_multi_draw
 void transform_tohost_VkPhysicalDeviceMultiDrawFeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMultiDrawFeaturesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMultiDrawFeaturesEXT* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceMultiDrawFeaturesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMultiDrawFeaturesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMultiDrawFeaturesEXT* toTransform);
 
 void transform_tohost_VkPhysicalDeviceMultiDrawPropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMultiDrawPropertiesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMultiDrawPropertiesEXT* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceMultiDrawPropertiesEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceMultiDrawPropertiesEXT* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceMultiDrawPropertiesEXT* toTransform);
 
-void transform_tohost_VkMultiDrawInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkMultiDrawInfoEXT* toTransform);
+void transform_tohost_VkMultiDrawInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                         VkMultiDrawInfoEXT* toTransform);
 
-void transform_fromhost_VkMultiDrawInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkMultiDrawInfoEXT* toTransform);
+void transform_fromhost_VkMultiDrawInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                           VkMultiDrawInfoEXT* toTransform);
 
-void transform_tohost_VkMultiDrawIndexedInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkMultiDrawIndexedInfoEXT* toTransform);
+void transform_tohost_VkMultiDrawIndexedInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                VkMultiDrawIndexedInfoEXT* toTransform);
 
-void transform_fromhost_VkMultiDrawIndexedInfoEXT(
-    VkDecoderGlobalState* resourceTracker,
-    VkMultiDrawIndexedInfoEXT* toTransform);
+void transform_fromhost_VkMultiDrawIndexedInfoEXT(VkDecoderGlobalState* resourceTracker,
+                                                  VkMultiDrawIndexedInfoEXT* toTransform);
 
 #endif
 #ifdef VK_EXT_load_store_op_none
@@ -6745,21 +5855,17 @@
 
 #endif
 #ifdef VK_KHR_acceleration_structure
-void transform_tohost_VkDeviceOrHostAddressKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceOrHostAddressKHR* toTransform);
+void transform_tohost_VkDeviceOrHostAddressKHR(VkDecoderGlobalState* resourceTracker,
+                                               VkDeviceOrHostAddressKHR* toTransform);
 
-void transform_fromhost_VkDeviceOrHostAddressKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkDeviceOrHostAddressKHR* toTransform);
+void transform_fromhost_VkDeviceOrHostAddressKHR(VkDecoderGlobalState* resourceTracker,
+                                                 VkDeviceOrHostAddressKHR* toTransform);
 
 void transform_tohost_VkAccelerationStructureBuildRangeInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureBuildRangeInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureBuildRangeInfoKHR* toTransform);
 
 void transform_fromhost_VkAccelerationStructureBuildRangeInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureBuildRangeInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureBuildRangeInfoKHR* toTransform);
 
 void transform_tohost_VkAccelerationStructureGeometryTrianglesDataKHR(
     VkDecoderGlobalState* resourceTracker,
@@ -6786,20 +5892,16 @@
     VkAccelerationStructureGeometryInstancesDataKHR* toTransform);
 
 void transform_tohost_VkAccelerationStructureGeometryDataKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureGeometryDataKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureGeometryDataKHR* toTransform);
 
 void transform_fromhost_VkAccelerationStructureGeometryDataKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureGeometryDataKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureGeometryDataKHR* toTransform);
 
 void transform_tohost_VkAccelerationStructureGeometryKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureGeometryKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureGeometryKHR* toTransform);
 
 void transform_fromhost_VkAccelerationStructureGeometryKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureGeometryKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureGeometryKHR* toTransform);
 
 void transform_tohost_VkAccelerationStructureBuildGeometryInfoKHR(
     VkDecoderGlobalState* resourceTracker,
@@ -6810,12 +5912,10 @@
     VkAccelerationStructureBuildGeometryInfoKHR* toTransform);
 
 void transform_tohost_VkAccelerationStructureCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureCreateInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureCreateInfoKHR* toTransform);
 
 void transform_fromhost_VkAccelerationStructureCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureCreateInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureCreateInfoKHR* toTransform);
 
 void transform_tohost_VkWriteDescriptorSetAccelerationStructureKHR(
     VkDecoderGlobalState* resourceTracker,
@@ -6850,70 +5950,54 @@
     VkAccelerationStructureDeviceAddressInfoKHR* toTransform);
 
 void transform_tohost_VkAccelerationStructureVersionInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureVersionInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureVersionInfoKHR* toTransform);
 
 void transform_fromhost_VkAccelerationStructureVersionInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureVersionInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureVersionInfoKHR* toTransform);
 
 void transform_tohost_VkCopyAccelerationStructureToMemoryInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkCopyAccelerationStructureToMemoryInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkCopyAccelerationStructureToMemoryInfoKHR* toTransform);
 
 void transform_fromhost_VkCopyAccelerationStructureToMemoryInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkCopyAccelerationStructureToMemoryInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkCopyAccelerationStructureToMemoryInfoKHR* toTransform);
 
 void transform_tohost_VkCopyMemoryToAccelerationStructureInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkCopyMemoryToAccelerationStructureInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkCopyMemoryToAccelerationStructureInfoKHR* toTransform);
 
 void transform_fromhost_VkCopyMemoryToAccelerationStructureInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkCopyMemoryToAccelerationStructureInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkCopyMemoryToAccelerationStructureInfoKHR* toTransform);
 
 void transform_tohost_VkCopyAccelerationStructureInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkCopyAccelerationStructureInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkCopyAccelerationStructureInfoKHR* toTransform);
 
 void transform_fromhost_VkCopyAccelerationStructureInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkCopyAccelerationStructureInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkCopyAccelerationStructureInfoKHR* toTransform);
 
 void transform_tohost_VkAccelerationStructureBuildSizesInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureBuildSizesInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureBuildSizesInfoKHR* toTransform);
 
 void transform_fromhost_VkAccelerationStructureBuildSizesInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkAccelerationStructureBuildSizesInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkAccelerationStructureBuildSizesInfoKHR* toTransform);
 
 #endif
 #ifdef VK_KHR_ray_tracing_pipeline
 void transform_tohost_VkRayTracingShaderGroupCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkRayTracingShaderGroupCreateInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkRayTracingShaderGroupCreateInfoKHR* toTransform);
 
 void transform_fromhost_VkRayTracingShaderGroupCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkRayTracingShaderGroupCreateInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkRayTracingShaderGroupCreateInfoKHR* toTransform);
 
 void transform_tohost_VkRayTracingPipelineInterfaceCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkRayTracingPipelineInterfaceCreateInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkRayTracingPipelineInterfaceCreateInfoKHR* toTransform);
 
 void transform_fromhost_VkRayTracingPipelineInterfaceCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkRayTracingPipelineInterfaceCreateInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkRayTracingPipelineInterfaceCreateInfoKHR* toTransform);
 
 void transform_tohost_VkRayTracingPipelineCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkRayTracingPipelineCreateInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkRayTracingPipelineCreateInfoKHR* toTransform);
 
 void transform_fromhost_VkRayTracingPipelineCreateInfoKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkRayTracingPipelineCreateInfoKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkRayTracingPipelineCreateInfoKHR* toTransform);
 
 void transform_tohost_VkPhysicalDeviceRayTracingPipelineFeaturesKHR(
     VkDecoderGlobalState* resourceTracker,
@@ -6931,32 +6015,26 @@
     VkDecoderGlobalState* resourceTracker,
     VkPhysicalDeviceRayTracingPipelinePropertiesKHR* toTransform);
 
-void transform_tohost_VkStridedDeviceAddressRegionKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkStridedDeviceAddressRegionKHR* toTransform);
+void transform_tohost_VkStridedDeviceAddressRegionKHR(VkDecoderGlobalState* resourceTracker,
+                                                      VkStridedDeviceAddressRegionKHR* toTransform);
 
 void transform_fromhost_VkStridedDeviceAddressRegionKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkStridedDeviceAddressRegionKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkStridedDeviceAddressRegionKHR* toTransform);
 
-void transform_tohost_VkTraceRaysIndirectCommandKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkTraceRaysIndirectCommandKHR* toTransform);
+void transform_tohost_VkTraceRaysIndirectCommandKHR(VkDecoderGlobalState* resourceTracker,
+                                                    VkTraceRaysIndirectCommandKHR* toTransform);
 
-void transform_fromhost_VkTraceRaysIndirectCommandKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkTraceRaysIndirectCommandKHR* toTransform);
+void transform_fromhost_VkTraceRaysIndirectCommandKHR(VkDecoderGlobalState* resourceTracker,
+                                                      VkTraceRaysIndirectCommandKHR* toTransform);
 
 #endif
 #ifdef VK_KHR_ray_query
 void transform_tohost_VkPhysicalDeviceRayQueryFeaturesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceRayQueryFeaturesKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceRayQueryFeaturesKHR* toTransform);
 
 void transform_fromhost_VkPhysicalDeviceRayQueryFeaturesKHR(
-    VkDecoderGlobalState* resourceTracker,
-    VkPhysicalDeviceRayQueryFeaturesKHR* toTransform);
+    VkDecoderGlobalState* resourceTracker, VkPhysicalDeviceRayQueryFeaturesKHR* toTransform);
 
 #endif
 
-} // namespace goldfish_vk
+}  // namespace goldfish_vk
diff --git a/stream-servers/vulkan/vulkan_gfxstream.h b/stream-servers/vulkan/vulkan_gfxstream.h
index 7c9b106..58c72a3 100644
--- a/stream-servers/vulkan/vulkan_gfxstream.h
+++ b/stream-servers/vulkan/vulkan_gfxstream.h
@@ -29,191 +29,185 @@
 extern "C" {
 #endif
 
-
-
 #define VK_GOOGLE_gfxstream 1
-#define VK_GOOGLE_GFXSTREAM_SPEC_VERSION  0
-#define VK_GOOGLE_GFXSTREAM_NUMBER        386
+#define VK_GOOGLE_GFXSTREAM_SPEC_VERSION 0
+#define VK_GOOGLE_GFXSTREAM_NUMBER 386
 #define VK_GOOGLE_GFXSTREAM_EXTENSION_NAME "VK_GOOGLE_gfxstream"
 typedef struct VkImportColorBufferGOOGLE {
-    VkStructureType    sType;
-    void*              pNext;
-    uint32_t           colorBuffer;
+    VkStructureType sType;
+    void* pNext;
+    uint32_t colorBuffer;
 } VkImportColorBufferGOOGLE;
 
 typedef struct VkImportBufferGOOGLE {
-    VkStructureType    sType;
-    void*              pNext;
-    uint32_t           buffer;
+    VkStructureType sType;
+    void* pNext;
+    uint32_t buffer;
 } VkImportBufferGOOGLE;
 
 typedef struct VkImportPhysicalAddressGOOGLE {
-    VkStructureType    sType;
-    void*              pNext;
-    uint64_t           physicalAddress;
-    VkDeviceSize       size;
-    VkFormat           format;
-    VkImageTiling      tiling;
-    uint32_t           tilingParameter;
+    VkStructureType sType;
+    void* pNext;
+    uint64_t physicalAddress;
+    VkDeviceSize size;
+    VkFormat format;
+    VkImageTiling tiling;
+    uint32_t tilingParameter;
 } VkImportPhysicalAddressGOOGLE;
 
-typedef VkResult (VKAPI_PTR *PFN_vkRegisterImageColorBufferGOOGLE)(VkDevice device, VkImage image, uint32_t colorBuffer);
-typedef VkResult (VKAPI_PTR *PFN_vkRegisterBufferColorBufferGOOGLE)(VkDevice device, VkBuffer buffer, uint32_t colorBuffer);
-typedef VkResult (VKAPI_PTR *PFN_vkMapMemoryIntoAddressSpaceGOOGLE)(VkDevice device, VkDeviceMemory memory, uint64_t* pAddress);
-typedef void (VKAPI_PTR *PFN_vkUpdateDescriptorSetWithTemplateSizedGOOGLE)(VkDevice device, VkDescriptorSet descriptorSet, VkDescriptorUpdateTemplate descriptorUpdateTemplate, uint32_t imageInfoCount, uint32_t bufferInfoCount, uint32_t bufferViewCount, const uint32_t* pImageInfoEntryIndices, const uint32_t* pBufferInfoEntryIndices, const uint32_t* pBufferViewEntryIndices, const VkDescriptorImageInfo* pImageInfos, const VkDescriptorBufferInfo* pBufferInfos, const VkBufferView* pBufferViews);
-typedef void (VKAPI_PTR *PFN_vkBeginCommandBufferAsyncGOOGLE)(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo* pBeginInfo);
-typedef void (VKAPI_PTR *PFN_vkEndCommandBufferAsyncGOOGLE)(VkCommandBuffer commandBuffer);
-typedef void (VKAPI_PTR *PFN_vkResetCommandBufferAsyncGOOGLE)(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags);
-typedef void (VKAPI_PTR *PFN_vkCommandBufferHostSyncGOOGLE)(VkCommandBuffer commandBuffer, uint32_t needHostSync, uint32_t sequenceNumber);
-typedef VkResult (VKAPI_PTR *PFN_vkCreateImageWithRequirementsGOOGLE)(VkDevice device, const VkImageCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkImage* pImage, VkMemoryRequirements* pMemoryRequirements);
-typedef VkResult (VKAPI_PTR *PFN_vkCreateBufferWithRequirementsGOOGLE)(VkDevice device, const VkBufferCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkBuffer* pBuffer, VkMemoryRequirements* pMemoryRequirements);
-typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryHostAddressInfoGOOGLE)(VkDevice device, VkDeviceMemory memory, uint64_t* pAddress, uint64_t* pSize, uint64_t* pHostmemId);
-typedef VkResult (VKAPI_PTR *PFN_vkFreeMemorySyncGOOGLE)(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks* pAllocator);
-typedef void (VKAPI_PTR *PFN_vkQueueHostSyncGOOGLE)(VkQueue queue, uint32_t needHostSync, uint32_t sequenceNumber);
-typedef void (VKAPI_PTR *PFN_vkQueueSubmitAsyncGOOGLE)(VkQueue queue, uint32_t submitCount, const VkSubmitInfo* pSubmits, VkFence fence);
-typedef void (VKAPI_PTR *PFN_vkQueueWaitIdleAsyncGOOGLE)(VkQueue queue);
-typedef void (VKAPI_PTR *PFN_vkQueueBindSparseAsyncGOOGLE)(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo* pBindInfo, VkFence fence);
-typedef void (VKAPI_PTR *PFN_vkGetLinearImageLayoutGOOGLE)(VkDevice device, VkFormat format, VkDeviceSize* pOffset, VkDeviceSize* pRowPitchAlignment);
-typedef void (VKAPI_PTR *PFN_vkGetLinearImageLayout2GOOGLE)(VkDevice device, const VkImageCreateInfo* pCreateInfo, VkDeviceSize* pOffset, VkDeviceSize* pRowPitchAlignment);
-typedef void (VKAPI_PTR *PFN_vkQueueFlushCommandsGOOGLE)(VkQueue queue, VkCommandBuffer commandBuffer, VkDeviceSize dataSize, const void* pData);
-typedef void (VKAPI_PTR *PFN_vkQueueCommitDescriptorSetUpdatesGOOGLE)(VkQueue queue, uint32_t descriptorPoolCount, const VkDescriptorPool* pDescriptorPools, uint32_t descriptorSetCount, const VkDescriptorSetLayout* pSetLayouts, const uint64_t* pDescriptorSetPoolIds, const uint32_t* pDescriptorSetWhichPool, const uint32_t* pDescriptorSetPendingAllocation, const uint32_t* pDescriptorWriteStartingIndices, uint32_t pendingDescriptorWriteCount, const VkWriteDescriptorSet* pPendingDescriptorWrites);
-typedef void (VKAPI_PTR *PFN_vkCollectDescriptorPoolIdsGOOGLE)(VkDevice device, VkDescriptorPool descriptorPool, uint32_t* pPoolIdCount, uint64_t* pPoolIds);
-typedef void (VKAPI_PTR *PFN_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE)(VkQueue queue, uint32_t waitSemaphoreCount, const VkSemaphore* pWaitSemaphores, VkImage image);
+typedef VkResult(VKAPI_PTR* PFN_vkRegisterImageColorBufferGOOGLE)(VkDevice device, VkImage image,
+                                                                  uint32_t colorBuffer);
+typedef VkResult(VKAPI_PTR* PFN_vkRegisterBufferColorBufferGOOGLE)(VkDevice device, VkBuffer buffer,
+                                                                   uint32_t colorBuffer);
+typedef VkResult(VKAPI_PTR* PFN_vkMapMemoryIntoAddressSpaceGOOGLE)(VkDevice device,
+                                                                   VkDeviceMemory memory,
+                                                                   uint64_t* pAddress);
+typedef void(VKAPI_PTR* PFN_vkUpdateDescriptorSetWithTemplateSizedGOOGLE)(
+    VkDevice device, VkDescriptorSet descriptorSet,
+    VkDescriptorUpdateTemplate descriptorUpdateTemplate, uint32_t imageInfoCount,
+    uint32_t bufferInfoCount, uint32_t bufferViewCount, const uint32_t* pImageInfoEntryIndices,
+    const uint32_t* pBufferInfoEntryIndices, const uint32_t* pBufferViewEntryIndices,
+    const VkDescriptorImageInfo* pImageInfos, const VkDescriptorBufferInfo* pBufferInfos,
+    const VkBufferView* pBufferViews);
+typedef void(VKAPI_PTR* PFN_vkBeginCommandBufferAsyncGOOGLE)(
+    VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo* pBeginInfo);
+typedef void(VKAPI_PTR* PFN_vkEndCommandBufferAsyncGOOGLE)(VkCommandBuffer commandBuffer);
+typedef void(VKAPI_PTR* PFN_vkResetCommandBufferAsyncGOOGLE)(VkCommandBuffer commandBuffer,
+                                                             VkCommandBufferResetFlags flags);
+typedef void(VKAPI_PTR* PFN_vkCommandBufferHostSyncGOOGLE)(VkCommandBuffer commandBuffer,
+                                                           uint32_t needHostSync,
+                                                           uint32_t sequenceNumber);
+typedef VkResult(VKAPI_PTR* PFN_vkCreateImageWithRequirementsGOOGLE)(
+    VkDevice device, const VkImageCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator,
+    VkImage* pImage, VkMemoryRequirements* pMemoryRequirements);
+typedef VkResult(VKAPI_PTR* PFN_vkCreateBufferWithRequirementsGOOGLE)(
+    VkDevice device, const VkBufferCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator,
+    VkBuffer* pBuffer, VkMemoryRequirements* pMemoryRequirements);
+typedef VkResult(VKAPI_PTR* PFN_vkGetMemoryHostAddressInfoGOOGLE)(VkDevice device,
+                                                                  VkDeviceMemory memory,
+                                                                  uint64_t* pAddress,
+                                                                  uint64_t* pSize,
+                                                                  uint64_t* pHostmemId);
+typedef VkResult(VKAPI_PTR* PFN_vkFreeMemorySyncGOOGLE)(VkDevice device, VkDeviceMemory memory,
+                                                        const VkAllocationCallbacks* pAllocator);
+typedef void(VKAPI_PTR* PFN_vkQueueHostSyncGOOGLE)(VkQueue queue, uint32_t needHostSync,
+                                                   uint32_t sequenceNumber);
+typedef void(VKAPI_PTR* PFN_vkQueueSubmitAsyncGOOGLE)(VkQueue queue, uint32_t submitCount,
+                                                      const VkSubmitInfo* pSubmits, VkFence fence);
+typedef void(VKAPI_PTR* PFN_vkQueueWaitIdleAsyncGOOGLE)(VkQueue queue);
+typedef void(VKAPI_PTR* PFN_vkQueueBindSparseAsyncGOOGLE)(VkQueue queue, uint32_t bindInfoCount,
+                                                          const VkBindSparseInfo* pBindInfo,
+                                                          VkFence fence);
+typedef void(VKAPI_PTR* PFN_vkGetLinearImageLayoutGOOGLE)(VkDevice device, VkFormat format,
+                                                          VkDeviceSize* pOffset,
+                                                          VkDeviceSize* pRowPitchAlignment);
+typedef void(VKAPI_PTR* PFN_vkGetLinearImageLayout2GOOGLE)(VkDevice device,
+                                                           const VkImageCreateInfo* pCreateInfo,
+                                                           VkDeviceSize* pOffset,
+                                                           VkDeviceSize* pRowPitchAlignment);
+typedef void(VKAPI_PTR* PFN_vkQueueFlushCommandsGOOGLE)(VkQueue queue,
+                                                        VkCommandBuffer commandBuffer,
+                                                        VkDeviceSize dataSize, const void* pData);
+typedef void(VKAPI_PTR* PFN_vkQueueCommitDescriptorSetUpdatesGOOGLE)(
+    VkQueue queue, uint32_t descriptorPoolCount, const VkDescriptorPool* pDescriptorPools,
+    uint32_t descriptorSetCount, const VkDescriptorSetLayout* pSetLayouts,
+    const uint64_t* pDescriptorSetPoolIds, const uint32_t* pDescriptorSetWhichPool,
+    const uint32_t* pDescriptorSetPendingAllocation,
+    const uint32_t* pDescriptorWriteStartingIndices, uint32_t pendingDescriptorWriteCount,
+    const VkWriteDescriptorSet* pPendingDescriptorWrites);
+typedef void(VKAPI_PTR* PFN_vkCollectDescriptorPoolIdsGOOGLE)(VkDevice device,
+                                                              VkDescriptorPool descriptorPool,
+                                                              uint32_t* pPoolIdCount,
+                                                              uint64_t* pPoolIds);
+typedef void(VKAPI_PTR* PFN_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE)(
+    VkQueue queue, uint32_t waitSemaphoreCount, const VkSemaphore* pWaitSemaphores, VkImage image);
 
 #ifndef VK_NO_PROTOTYPES
-VKAPI_ATTR VkResult VKAPI_CALL vkRegisterImageColorBufferGOOGLE(
-    VkDevice                                    device,
-    VkImage                                     image,
-    uint32_t                                    colorBuffer);
+VKAPI_ATTR VkResult VKAPI_CALL vkRegisterImageColorBufferGOOGLE(VkDevice device, VkImage image,
+                                                                uint32_t colorBuffer);
 
-VKAPI_ATTR VkResult VKAPI_CALL vkRegisterBufferColorBufferGOOGLE(
-    VkDevice                                    device,
-    VkBuffer                                    buffer,
-    uint32_t                                    colorBuffer);
+VKAPI_ATTR VkResult VKAPI_CALL vkRegisterBufferColorBufferGOOGLE(VkDevice device, VkBuffer buffer,
+                                                                 uint32_t colorBuffer);
 
-VKAPI_ATTR VkResult VKAPI_CALL vkMapMemoryIntoAddressSpaceGOOGLE(
-    VkDevice                                    device,
-    VkDeviceMemory                              memory,
-    uint64_t*                                   pAddress);
+VKAPI_ATTR VkResult VKAPI_CALL vkMapMemoryIntoAddressSpaceGOOGLE(VkDevice device,
+                                                                 VkDeviceMemory memory,
+                                                                 uint64_t* pAddress);
 
 VKAPI_ATTR void VKAPI_CALL vkUpdateDescriptorSetWithTemplateSizedGOOGLE(
-    VkDevice                                    device,
-    VkDescriptorSet                             descriptorSet,
-    VkDescriptorUpdateTemplate                  descriptorUpdateTemplate,
-    uint32_t                                    imageInfoCount,
-    uint32_t                                    bufferInfoCount,
-    uint32_t                                    bufferViewCount,
-    const uint32_t*                             pImageInfoEntryIndices,
-    const uint32_t*                             pBufferInfoEntryIndices,
-    const uint32_t*                             pBufferViewEntryIndices,
-    const VkDescriptorImageInfo*                pImageInfos,
-    const VkDescriptorBufferInfo*               pBufferInfos,
-    const VkBufferView*                         pBufferViews);
+    VkDevice device, VkDescriptorSet descriptorSet,
+    VkDescriptorUpdateTemplate descriptorUpdateTemplate, uint32_t imageInfoCount,
+    uint32_t bufferInfoCount, uint32_t bufferViewCount, const uint32_t* pImageInfoEntryIndices,
+    const uint32_t* pBufferInfoEntryIndices, const uint32_t* pBufferViewEntryIndices,
+    const VkDescriptorImageInfo* pImageInfos, const VkDescriptorBufferInfo* pBufferInfos,
+    const VkBufferView* pBufferViews);
 
 VKAPI_ATTR void VKAPI_CALL vkBeginCommandBufferAsyncGOOGLE(
-    VkCommandBuffer                             commandBuffer,
-    const VkCommandBufferBeginInfo*             pBeginInfo);
+    VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo* pBeginInfo);
 
-VKAPI_ATTR void VKAPI_CALL vkEndCommandBufferAsyncGOOGLE(
-    VkCommandBuffer                             commandBuffer);
+VKAPI_ATTR void VKAPI_CALL vkEndCommandBufferAsyncGOOGLE(VkCommandBuffer commandBuffer);
 
-VKAPI_ATTR void VKAPI_CALL vkResetCommandBufferAsyncGOOGLE(
-    VkCommandBuffer                             commandBuffer,
-    VkCommandBufferResetFlags                   flags);
+VKAPI_ATTR void VKAPI_CALL vkResetCommandBufferAsyncGOOGLE(VkCommandBuffer commandBuffer,
+                                                           VkCommandBufferResetFlags flags);
 
-VKAPI_ATTR void VKAPI_CALL vkCommandBufferHostSyncGOOGLE(
-    VkCommandBuffer                             commandBuffer,
-    uint32_t                                    needHostSync,
-    uint32_t                                    sequenceNumber);
+VKAPI_ATTR void VKAPI_CALL vkCommandBufferHostSyncGOOGLE(VkCommandBuffer commandBuffer,
+                                                         uint32_t needHostSync,
+                                                         uint32_t sequenceNumber);
 
 VKAPI_ATTR VkResult VKAPI_CALL vkCreateImageWithRequirementsGOOGLE(
-    VkDevice                                    device,
-    const VkImageCreateInfo*                    pCreateInfo,
-    const VkAllocationCallbacks*                pAllocator,
-    VkImage*                                    pImage,
-    VkMemoryRequirements*                       pMemoryRequirements);
+    VkDevice device, const VkImageCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator,
+    VkImage* pImage, VkMemoryRequirements* pMemoryRequirements);
 
 VKAPI_ATTR VkResult VKAPI_CALL vkCreateBufferWithRequirementsGOOGLE(
-    VkDevice                                    device,
-    const VkBufferCreateInfo*                   pCreateInfo,
-    const VkAllocationCallbacks*                pAllocator,
-    VkBuffer*                                   pBuffer,
-    VkMemoryRequirements*                       pMemoryRequirements);
+    VkDevice device, const VkBufferCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator,
+    VkBuffer* pBuffer, VkMemoryRequirements* pMemoryRequirements);
 
-VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryHostAddressInfoGOOGLE(
-    VkDevice                                    device,
-    VkDeviceMemory                              memory,
-    uint64_t*                                   pAddress,
-    uint64_t*                                   pSize,
-    uint64_t*                                   pHostmemId);
+VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryHostAddressInfoGOOGLE(VkDevice device,
+                                                                VkDeviceMemory memory,
+                                                                uint64_t* pAddress, uint64_t* pSize,
+                                                                uint64_t* pHostmemId);
 
-VKAPI_ATTR VkResult VKAPI_CALL vkFreeMemorySyncGOOGLE(
-    VkDevice                                    device,
-    VkDeviceMemory                              memory,
-    const VkAllocationCallbacks*                pAllocator);
+VKAPI_ATTR VkResult VKAPI_CALL vkFreeMemorySyncGOOGLE(VkDevice device, VkDeviceMemory memory,
+                                                      const VkAllocationCallbacks* pAllocator);
 
-VKAPI_ATTR void VKAPI_CALL vkQueueHostSyncGOOGLE(
-    VkQueue                                     queue,
-    uint32_t                                    needHostSync,
-    uint32_t                                    sequenceNumber);
+VKAPI_ATTR void VKAPI_CALL vkQueueHostSyncGOOGLE(VkQueue queue, uint32_t needHostSync,
+                                                 uint32_t sequenceNumber);
 
-VKAPI_ATTR void VKAPI_CALL vkQueueSubmitAsyncGOOGLE(
-    VkQueue                                     queue,
-    uint32_t                                    submitCount,
-    const VkSubmitInfo*                         pSubmits,
-    VkFence                                     fence);
+VKAPI_ATTR void VKAPI_CALL vkQueueSubmitAsyncGOOGLE(VkQueue queue, uint32_t submitCount,
+                                                    const VkSubmitInfo* pSubmits, VkFence fence);
 
-VKAPI_ATTR void VKAPI_CALL vkQueueWaitIdleAsyncGOOGLE(
-    VkQueue                                     queue);
+VKAPI_ATTR void VKAPI_CALL vkQueueWaitIdleAsyncGOOGLE(VkQueue queue);
 
-VKAPI_ATTR void VKAPI_CALL vkQueueBindSparseAsyncGOOGLE(
-    VkQueue                                     queue,
-    uint32_t                                    bindInfoCount,
-    const VkBindSparseInfo*                     pBindInfo,
-    VkFence                                     fence);
+VKAPI_ATTR void VKAPI_CALL vkQueueBindSparseAsyncGOOGLE(VkQueue queue, uint32_t bindInfoCount,
+                                                        const VkBindSparseInfo* pBindInfo,
+                                                        VkFence fence);
 
-VKAPI_ATTR void VKAPI_CALL vkGetLinearImageLayoutGOOGLE(
-    VkDevice                                    device,
-    VkFormat                                    format,
-    VkDeviceSize*                               pOffset,
-    VkDeviceSize*                               pRowPitchAlignment);
+VKAPI_ATTR void VKAPI_CALL vkGetLinearImageLayoutGOOGLE(VkDevice device, VkFormat format,
+                                                        VkDeviceSize* pOffset,
+                                                        VkDeviceSize* pRowPitchAlignment);
 
-VKAPI_ATTR void VKAPI_CALL vkGetLinearImageLayout2GOOGLE(
-    VkDevice                                    device,
-    const VkImageCreateInfo*                    pCreateInfo,
-    VkDeviceSize*                               pOffset,
-    VkDeviceSize*                               pRowPitchAlignment);
+VKAPI_ATTR void VKAPI_CALL vkGetLinearImageLayout2GOOGLE(VkDevice device,
+                                                         const VkImageCreateInfo* pCreateInfo,
+                                                         VkDeviceSize* pOffset,
+                                                         VkDeviceSize* pRowPitchAlignment);
 
-VKAPI_ATTR void VKAPI_CALL vkQueueFlushCommandsGOOGLE(
-    VkQueue                                     queue,
-    VkCommandBuffer                             commandBuffer,
-    VkDeviceSize                                dataSize,
-    const void*                                 pData);
+VKAPI_ATTR void VKAPI_CALL vkQueueFlushCommandsGOOGLE(VkQueue queue, VkCommandBuffer commandBuffer,
+                                                      VkDeviceSize dataSize, const void* pData);
 
 VKAPI_ATTR void VKAPI_CALL vkQueueCommitDescriptorSetUpdatesGOOGLE(
-    VkQueue                                     queue,
-    uint32_t                                    descriptorPoolCount,
-    const VkDescriptorPool*                     pDescriptorPools,
-    uint32_t                                    descriptorSetCount,
-    const VkDescriptorSetLayout*                pSetLayouts,
-    const uint64_t*                             pDescriptorSetPoolIds,
-    const uint32_t*                             pDescriptorSetWhichPool,
-    const uint32_t*                             pDescriptorSetPendingAllocation,
-    const uint32_t*                             pDescriptorWriteStartingIndices,
-    uint32_t                                    pendingDescriptorWriteCount,
-    const VkWriteDescriptorSet*                 pPendingDescriptorWrites);
+    VkQueue queue, uint32_t descriptorPoolCount, const VkDescriptorPool* pDescriptorPools,
+    uint32_t descriptorSetCount, const VkDescriptorSetLayout* pSetLayouts,
+    const uint64_t* pDescriptorSetPoolIds, const uint32_t* pDescriptorSetWhichPool,
+    const uint32_t* pDescriptorSetPendingAllocation,
+    const uint32_t* pDescriptorWriteStartingIndices, uint32_t pendingDescriptorWriteCount,
+    const VkWriteDescriptorSet* pPendingDescriptorWrites);
 
-VKAPI_ATTR void VKAPI_CALL vkCollectDescriptorPoolIdsGOOGLE(
-    VkDevice                                    device,
-    VkDescriptorPool                            descriptorPool,
-    uint32_t*                                   pPoolIdCount,
-    uint64_t*                                   pPoolIds);
+VKAPI_ATTR void VKAPI_CALL vkCollectDescriptorPoolIdsGOOGLE(VkDevice device,
+                                                            VkDescriptorPool descriptorPool,
+                                                            uint32_t* pPoolIdCount,
+                                                            uint64_t* pPoolIds);
 
 VKAPI_ATTR void VKAPI_CALL vkQueueSignalReleaseImageANDROIDAsyncGOOGLE(
-    VkQueue                                     queue,
-    uint32_t                                    waitSemaphoreCount,
-    const VkSemaphore*                          pWaitSemaphores,
-    VkImage                                     image);
+    VkQueue queue, uint32_t waitSemaphoreCount, const VkSemaphore* pWaitSemaphores, VkImage image);
 #endif
 
 #ifdef __cplusplus
diff --git a/stream-servers/vulkan/vulkan_gfxstream_structure_type.h b/stream-servers/vulkan/vulkan_gfxstream_structure_type.h
index af300f5..b66918b 100644
--- a/stream-servers/vulkan/vulkan_gfxstream_structure_type.h
+++ b/stream-servers/vulkan/vulkan_gfxstream_structure_type.h
@@ -14,21 +14,27 @@
 // limitations under the License.
 
 // Autogenerated module vulkan_gfxstream_structure_type
-// (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
+// (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml
+// cereal -o ../../device/generic/vulkan-cereal/stream-servers/vulkan/cereal
+//
 // Please do not modify directly;
 // re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
 // VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
 // VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+//
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o
+// $CEREAL_OUTPUT_DIR
+//
 #pragma once
 
-#define VK_GOOGLE_GFXSTREAM_ENUM(type,id)     ((type)(1000000000 + (1000 * (VK_GOOGLE_GFXSTREAM_NUMBER - 1)) + (id)))
+#define VK_GOOGLE_GFXSTREAM_ENUM(type, id) \
+    ((type)(1000000000 + (1000 * (VK_GOOGLE_GFXSTREAM_NUMBER - 1)) + (id)))
 
 #define VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE VK_GOOGLE_GFXSTREAM_ENUM(VkStructureType, 0)
-#define VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE VK_GOOGLE_GFXSTREAM_ENUM(VkStructureType, 1)
+#define VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE \
+    VK_GOOGLE_GFXSTREAM_ENUM(VkStructureType, 1)
 #define VK_STRUCTURE_TYPE_IMPORT_BUFFER_HANDLE_GOOGLE VK_GOOGLE_GFXSTREAM_ENUM(VkStructureType, 2)
 #define VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE VK_GOOGLE_GFXSTREAM_ENUM(VkStructureType, 3)
-
-
